From 263eaeeebd70970fce5da8a7f80b3376865ff492 Mon Sep 17 00:00:00 2001 From: daniel Date: Tue, 31 Mar 2020 09:33:39 +0200 Subject: [PATCH] Fix bundle Ehorus --- pandora_console/include/ehorus/bundle.js | 10292 ++++++++--------- pandora_console/include/ehorus/bundle.min.js | 2 +- 2 files changed, 5106 insertions(+), 5188 deletions(-) diff --git a/pandora_console/include/ehorus/bundle.js b/pandora_console/include/ehorus/bundle.js index 49cee67abc..979d96ae21 100644 --- a/pandora_console/include/ehorus/bundle.js +++ b/pandora_console/include/ehorus/bundle.js @@ -13,7 +13,7 @@ Object.defineProperty(exports, "__esModule", { /*jslint white: false */ /*global console */ -exports.default = { +var Base64 = { /* Convert data (an array of integers) to a Base64 string. */ toBase64Table: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='.split(''), base64Pad: '=', @@ -22,7 +22,7 @@ exports.default = { "use strict"; var result = ''; - var toBase64Table = this.toBase64Table; + var toBase64Table = Base64.toBase64Table; var length = data.length; var lengthpad = length % 3; // Convert every three bytes to 4 ascii characters. @@ -62,8 +62,8 @@ exports.default = { "use strict"; offset = typeof offset !== 'undefined' ? offset : 0; - var toBinaryTable = this.toBinaryTable; - var base64Pad = this.base64Pad; + var toBinaryTable = Base64.toBinaryTable; + var base64Pad = Base64.base64Pad; var result, result_length; var leftbits = 0; // number of bits decoded, but yet to be appended var leftdata = 0; // bits decoded, but yet to be appended @@ -112,6 +112,10 @@ exports.default = { return result; } }; /* End of Base64 namespace */ + +exports.default = Base64; +module.exports = exports['default']; + },{}],2:[function(require,module,exports){ "use strict"; @@ -401,30 +405,27 @@ function DES(passwd) { setKeys(passwd); // Setup keys return { 'encrypt': encrypt }; // Public interface }; // function DES + +module.exports = exports["default"]; + },{}],3:[function(require,module,exports){ -'use strict'; +"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Display; -var _browsers = require('./util/browsers.js'); +var _util = require("./util"); -var _properties = require('./util/properties.js'); +var _util2 = _interopRequireDefault(_util); -var _logging = require('./util/logging.js'); - -var Log = _interopRequireWildcard(_logging); - -var _base = require('./base64.js'); +var _base = require("./base64"); var _base2 = _interopRequireDefault(_base); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - /* * noVNC: HTML5 VNC client * Copyright (C) 2012 Joel Martin @@ -448,13 +449,21 @@ function Display(defaults) { this._fb_width = 0; this._fb_height = 0; + // the size limit of the viewport (start disabled) + this._maxWidth = 0; + this._maxHeight = 0; + + // the visible "physical canvas" viewport + this._viewportLoc = { 'x': 0, 'y': 0, 'w': 0, 'h': 0 }; + this._cleanRect = { 'x1': 0, 'y1': 0, 'x2': -1, 'y2': -1 }; + this._prevDrawStyle = ""; this._tile = null; this._tile16x16 = null; this._tile_x = 0; this._tile_y = 0; - (0, _properties.set_defaults)(this, defaults, { + _util2.default.set_defaults(this, defaults, { 'true_color': true, 'colourMap': [], 'scale': 1.0, @@ -463,9 +472,8 @@ function Display(defaults) { "onFlush": function () {} }); - Log.Debug(">> Display.constructor"); + _util2.default.Debug(">> Display.constructor"); - // The visible canvas if (!this._target) { throw new Error("Target must be set"); } @@ -478,31 +486,22 @@ function Display(defaults) { throw new Error("no getContext method"); } - this._targetCtx = this._target.getContext('2d'); - - // the visible canvas viewport (i.e. what actually gets seen) - this._viewportLoc = { 'x': 0, 'y': 0, 'w': this._target.width, 'h': this._target.height }; - - // The hidden canvas, where we do the actual rendering - this._backbuffer = document.createElement('canvas'); - this._drawCtx = this._backbuffer.getContext('2d'); - - this._damageBounds = { left: 0, top: 0, - right: this._backbuffer.width, - bottom: this._backbuffer.height }; - - Log.Debug("User Agent: " + navigator.userAgent); - if (_browsers.Engine.gecko) { - Log.Debug("Browser: gecko " + _browsers.Engine.gecko); + if (!this._drawCtx) { + this._drawCtx = this._target.getContext('2d'); } - if (_browsers.Engine.webkit) { - Log.Debug("Browser: webkit " + _browsers.Engine.webkit); + + _util2.default.Debug("User Agent: " + navigator.userAgent); + if (_util2.default.Engine.gecko) { + _util2.default.Debug("Browser: gecko " + _util2.default.Engine.gecko); } - if (_browsers.Engine.trident) { - Log.Debug("Browser: trident " + _browsers.Engine.trident); + if (_util2.default.Engine.webkit) { + _util2.default.Debug("Browser: webkit " + _util2.default.Engine.webkit); } - if (_browsers.Engine.presto) { - Log.Debug("Browser: presto " + _browsers.Engine.presto); + if (_util2.default.Engine.trident) { + _util2.default.Debug("Browser: trident " + _util2.default.Engine.trident); + } + if (_util2.default.Engine.presto) { + _util2.default.Debug("Browser: presto " + _util2.default.Engine.presto); } this.clear(); @@ -515,787 +514,876 @@ function Display(defaults) { } if (this._prefer_js === null) { - Log.Info("Prefering javascript operations"); + _util2.default.Info("Prefering javascript operations"); this._prefer_js = true; } // Determine browser support for setting the cursor via data URI scheme if (this._cursor_uri || this._cursor_uri === null || this._cursor_uri === undefined) { - this._cursor_uri = (0, _browsers.browserSupportsCursorURIs)(); + this._cursor_uri = _util2.default.browserSupportsCursorURIs(); } - Log.Debug("<< Display.constructor"); + _util2.default.Debug("<< Display.constructor"); }; -var SUPPORTS_IMAGEDATA_CONSTRUCTOR = false; -try { - new ImageData(new Uint8ClampedArray(4), 1, 1); - SUPPORTS_IMAGEDATA_CONSTRUCTOR = true; -} catch (ex) { - // ignore failure -} +(function () { + "use strict"; -Display.prototype = { - // Public methods - viewportChangePos: function (deltaX, deltaY) { - var vp = this._viewportLoc; - deltaX = Math.floor(deltaX); - deltaY = Math.floor(deltaY); + var SUPPORTS_IMAGEDATA_CONSTRUCTOR = false; + try { + new ImageData(new Uint8ClampedArray(4), 1, 1); + SUPPORTS_IMAGEDATA_CONSTRUCTOR = true; + } catch (ex) { + // ignore failure + } - if (!this._viewport) { - deltaX = -vp.w; // clamped later of out of bounds - deltaY = -vp.h; - } + Display.prototype = { + // Public methods + viewportChangePos: function (deltaX, deltaY) { + var vp = this._viewportLoc; + deltaX = Math.floor(deltaX); + deltaY = Math.floor(deltaY); - var vx2 = vp.x + vp.w - 1; - var vy2 = vp.y + vp.h - 1; + if (!this._viewport) { + deltaX = -vp.w; // clamped later of out of bounds + deltaY = -vp.h; + } - // Position change + var vx2 = vp.x + vp.w - 1; + var vy2 = vp.y + vp.h - 1; - if (deltaX < 0 && vp.x + deltaX < 0) { - deltaX = -vp.x; - } - if (vx2 + deltaX >= this._fb_width) { - deltaX -= vx2 + deltaX - this._fb_width + 1; - } + // Position change - if (vp.y + deltaY < 0) { - deltaY = -vp.y; - } - if (vy2 + deltaY >= this._fb_height) { - deltaY -= vy2 + deltaY - this._fb_height + 1; - } + if (deltaX < 0 && vp.x + deltaX < 0) { + deltaX = -vp.x; + } + if (vx2 + deltaX >= this._fb_width) { + deltaX -= vx2 + deltaX - this._fb_width + 1; + } - if (deltaX === 0 && deltaY === 0) { - return; - } - Log.Debug("viewportChange deltaX: " + deltaX + ", deltaY: " + deltaY); + if (vp.y + deltaY < 0) { + deltaY = -vp.y; + } + if (vy2 + deltaY >= this._fb_height) { + deltaY -= vy2 + deltaY - this._fb_height + 1; + } - vp.x += deltaX; - vp.y += deltaY; + if (deltaX === 0 && deltaY === 0) { + return; + } + _util2.default.Debug("viewportChange deltaX: " + deltaX + ", deltaY: " + deltaY); - this._damage(vp.x, vp.y, vp.w, vp.h); + vp.x += deltaX; + vx2 += deltaX; + vp.y += deltaY; + vy2 += deltaY; - this.flip(); - }, + // Update the clean rectangle + var cr = this._cleanRect; + if (vp.x > cr.x1) { + cr.x1 = vp.x; + } + if (vx2 < cr.x2) { + cr.x2 = vx2; + } + if (vp.y > cr.y1) { + cr.y1 = vp.y; + } + if (vy2 < cr.y2) { + cr.y2 = vy2; + } - viewportChangeSize: function (width, height) { + var x1, w; + if (deltaX < 0) { + // Shift viewport left, redraw left section + x1 = 0; + w = -deltaX; + } else { + // Shift viewport right, redraw right section + x1 = vp.w - deltaX; + w = deltaX; + } - if (!this._viewport || typeof width === "undefined" || typeof height === "undefined") { - - Log.Debug("Setting viewport to full display region"); - width = this._fb_width; - height = this._fb_height; - } - - if (width > this._fb_width) { - width = this._fb_width; - } - if (height > this._fb_height) { - height = this._fb_height; - } - - var vp = this._viewportLoc; - if (vp.w !== width || vp.h !== height) { - vp.w = width; - vp.h = height; + var y1, h; + if (deltaY < 0) { + // Shift viewport up, redraw top section + y1 = 0; + h = -deltaY; + } else { + // Shift viewport down, redraw bottom section + y1 = vp.h - deltaY; + h = deltaY; + } + var saveStyle = this._drawCtx.fillStyle; var canvas = this._target; - canvas.width = width; - canvas.height = height; + this._drawCtx.fillStyle = "rgb(255,255,255)"; - // The position might need to be updated if we've grown - this.viewportChangePos(0, 0); - - this._damage(vp.x, vp.y, vp.w, vp.h); - this.flip(); - - // Update the visible size of the target canvas - this._rescale(this._scale); - } - }, - - absX: function (x) { - return x / this._scale + this._viewportLoc.x; - }, - - absY: function (y) { - return y / this._scale + this._viewportLoc.y; - }, - - resize: function (width, height) { - this._prevDrawStyle = ""; - - this._fb_width = width; - this._fb_height = height; - - var canvas = this._backbuffer; - if (canvas.width !== width || canvas.height !== height) { - - // We have to save the canvas data since changing the size will clear it - var saveImg = null; - if (canvas.width > 0 && canvas.height > 0) { - saveImg = this._drawCtx.getImageData(0, 0, canvas.width, canvas.height); - } - - if (canvas.width !== width) { - canvas.width = width; - } - if (canvas.height !== height) { - canvas.height = height; - } - - if (saveImg) { - this._drawCtx.putImageData(saveImg, 0, 0); - } - } - - // Readjust the viewport as it may be incorrectly sized - // and positioned - var vp = this._viewportLoc; - this.viewportChangeSize(vp.w, vp.h); - this.viewportChangePos(0, 0); - }, - - // Track what parts of the visible canvas that need updating - _damage: function (x, y, w, h) { - if (x < this._damageBounds.left) { - this._damageBounds.left = x; - } - if (y < this._damageBounds.top) { - this._damageBounds.top = y; - } - if (x + w > this._damageBounds.right) { - this._damageBounds.right = x + w; - } - if (y + h > this._damageBounds.bottom) { - this._damageBounds.bottom = y + h; - } - }, - - // Update the visible canvas with the contents of the - // rendering canvas - flip: function (from_queue) { - if (this._renderQ.length !== 0 && !from_queue) { - this._renderQ_push({ - 'type': 'flip' - }); - } else { - var x, y, vx, vy, w, h; - - x = this._damageBounds.left; - y = this._damageBounds.top; - w = this._damageBounds.right - x; - h = this._damageBounds.bottom - y; - - vx = x - this._viewportLoc.x; - vy = y - this._viewportLoc.y; - - if (vx < 0) { - w += vx; - x -= vx; - vx = 0; - } - if (vy < 0) { - h += vy; - y -= vy; - vy = 0; - } - - if (vx + w > this._viewportLoc.w) { - w = this._viewportLoc.w - vx; - } - if (vy + h > this._viewportLoc.h) { - h = this._viewportLoc.h - vy; - } - - if (w > 0 && h > 0) { - // FIXME: We may need to disable image smoothing here - // as well (see copyImage()), but we haven't - // noticed any problem yet. - this._targetCtx.drawImage(this._backbuffer, x, y, w, h, vx, vy, w, h); - } - - this._damageBounds.left = this._damageBounds.top = 65535; - this._damageBounds.right = this._damageBounds.bottom = 0; - } - }, - - clear: function () { - if (this._logo) { - this.resize(this._logo.width, this._logo.height); - this.imageRect(0, 0, this._logo.type, this._logo.data); - } else { - this.resize(240, 20); - this._drawCtx.clearRect(0, 0, this._fb_width, this._fb_height); - } - this.flip(); - }, - - pending: function () { - return this._renderQ.length > 0; - }, - - flush: function () { - if (this._renderQ.length === 0) { - this._onFlush(); - } else { - this._flushing = true; - } - }, - - fillRect: function (x, y, width, height, color, from_queue) { - if (this._renderQ.length !== 0 && !from_queue) { - this._renderQ_push({ - 'type': 'fill', - 'x': x, - 'y': y, - 'width': width, - 'height': height, - 'color': color - }); - } else { - this._setFillColor(color); - this._drawCtx.fillRect(x, y, width, height); - this._damage(x, y, width, height); - } - }, - - copyImage: function (old_x, old_y, new_x, new_y, w, h, from_queue) { - if (this._renderQ.length !== 0 && !from_queue) { - this._renderQ_push({ - 'type': 'copy', - 'old_x': old_x, - 'old_y': old_y, - 'x': new_x, - 'y': new_y, - 'width': w, - 'height': h - }); - } else { // Due to this bug among others [1] we need to disable the image-smoothing to - // avoid getting a blur effect when copying data. + // avoid getting a blur effect when panning. // // 1. https://bugzilla.mozilla.org/show_bug.cgi?id=1194719 // // We need to set these every time since all properties are reset // when the the size is changed - this._drawCtx.mozImageSmoothingEnabled = false; - this._drawCtx.webkitImageSmoothingEnabled = false; - this._drawCtx.msImageSmoothingEnabled = false; - this._drawCtx.imageSmoothingEnabled = false; - - this._drawCtx.drawImage(this._backbuffer, old_x, old_y, w, h, new_x, new_y, w, h); - this._damage(new_x, new_y, w, h); - } - }, - - imageRect: function (x, y, mime, arr) { - var img = new Image(); - img.src = "data: " + mime + ";base64," + _base2.default.encode(arr); - this._renderQ_push({ - 'type': 'img', - 'img': img, - 'x': x, - 'y': y - }); - }, - - // start updating a tile - startTile: function (x, y, width, height, color) { - this._tile_x = x; - this._tile_y = y; - if (width === 16 && height === 16) { - this._tile = this._tile16x16; - } else { - this._tile = this._drawCtx.createImageData(width, height); - } - - if (this._prefer_js) { - var bgr; - if (this._true_color) { - bgr = color; - } else { - bgr = this._colourMap[color[0]]; + if (this._drawCtx.mozImageSmoothingEnabled) { + this._drawCtx.mozImageSmoothingEnabled = false; + } else if (this._drawCtx.webkitImageSmoothingEnabled) { + this._drawCtx.webkitImageSmoothingEnabled = false; + } else if (this._drawCtx.msImageSmoothingEnabled) { + this._drawCtx.msImageSmoothingEnabled = false; + } else if (this._drawCtx.imageSmoothingEnabled) { + this._drawCtx.imageSmoothingEnabled = false; } - var red = bgr[2]; - var green = bgr[1]; - var blue = bgr[0]; - var data = this._tile.data; - for (var i = 0; i < width * height * 4; i += 4) { - data[i] = red; - data[i + 1] = green; - data[i + 2] = blue; - data[i + 3] = 255; + // Copy the valid part of the viewport to the shifted location + this._drawCtx.drawImage(canvas, 0, 0, vp.w, vp.h, -deltaX, -deltaY, vp.w, vp.h); + + if (deltaX !== 0) { + this._drawCtx.fillRect(x1, 0, w, vp.h); } - } else { - this.fillRect(x, y, width, height, color, true); - } - }, - - // update sub-rectangle of the current tile - subTile: function (x, y, w, h, color) { - if (this._prefer_js) { - var bgr; - if (this._true_color) { - bgr = color; - } else { - bgr = this._colourMap[color[0]]; + if (deltaY !== 0) { + this._drawCtx.fillRect(0, y1, vp.w, h); } - var red = bgr[2]; - var green = bgr[1]; - var blue = bgr[0]; - var xend = x + w; - var yend = y + h; + this._drawCtx.fillStyle = saveStyle; + }, - var data = this._tile.data; - var width = this._tile.width; - for (var j = y; j < yend; j++) { - for (var i = x; i < xend; i++) { - var p = (i + j * width) * 4; - data[p] = red; - data[p + 1] = green; - data[p + 2] = blue; - data[p + 3] = 255; - } + viewportChangeSize: function (width, height) { + + if (typeof width === "undefined" || typeof height === "undefined") { + + _util2.default.Debug("Setting viewport to full display region"); + width = this._fb_width; + height = this._fb_height; } - } else { - this.fillRect(this._tile_x + x, this._tile_y + y, w, h, color, true); - } - }, - // draw the current tile to the screen - finishTile: function () { - if (this._prefer_js) { - this._drawCtx.putImageData(this._tile, this._tile_x, this._tile_y); - this._damage(this._tile_x, this._tile_y, this._tile.width, this._tile.height); - } - // else: No-op -- already done by setSubTile - }, + var vp = this._viewportLoc; + if (vp.w !== width || vp.h !== height) { - blitImage: function (x, y, width, height, arr, offset, from_queue) { - if (this._renderQ.length !== 0 && !from_queue) { - // NB(directxman12): it's technically more performant here to use preallocated arrays, - // but it's a lot of extra work for not a lot of payoff -- if we're using the render queue, - // this probably isn't getting called *nearly* as much - var new_arr = new Uint8Array(width * height * 4); - new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length)); - this._renderQ_push({ - 'type': 'blit', - 'data': new_arr, - 'x': x, - 'y': y, - 'width': width, - 'height': height - }); - } else if (this._true_color) { - this._bgrxImageData(x, y, width, height, arr, offset); - } else { - this._cmapImageData(x, y, width, height, arr, offset); - } - }, - - blitRgbImage: function (x, y, width, height, arr, offset, from_queue) { - if (this._renderQ.length !== 0 && !from_queue) { - // NB(directxman12): it's technically more performant here to use preallocated arrays, - // but it's a lot of extra work for not a lot of payoff -- if we're using the render queue, - // this probably isn't getting called *nearly* as much - var new_arr = new Uint8Array(width * height * 3); - new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length)); - this._renderQ_push({ - 'type': 'blitRgb', - 'data': new_arr, - 'x': x, - 'y': y, - 'width': width, - 'height': height - }); - } else if (this._true_color) { - this._rgbImageData(x, y, width, height, arr, offset); - } else { - // probably wrong? - this._cmapImageData(x, y, width, height, arr, offset); - } - }, - - blitRgbxImage: function (x, y, width, height, arr, offset, from_queue) { - if (this._renderQ.length !== 0 && !from_queue) { - // NB(directxman12): it's technically more performant here to use preallocated arrays, - // but it's a lot of extra work for not a lot of payoff -- if we're using the render queue, - // this probably isn't getting called *nearly* as much - var new_arr = new Uint8Array(width * height * 4); - new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length)); - this._renderQ_push({ - 'type': 'blitRgbx', - 'data': new_arr, - 'x': x, - 'y': y, - 'width': width, - 'height': height - }); - } else { - this._rgbxImageData(x, y, width, height, arr, offset); - } - }, - - drawImage: function (img, x, y) { - this._drawCtx.drawImage(img, x, y); - this._damage(x, y, img.width, img.height); - }, - - changeCursor: function (pixels, mask, hotx, hoty, w, h) { - if (this._cursor_uri === false) { - Log.Warn("changeCursor called but no cursor data URI support"); - return; - } - - if (this._true_color) { - Display.changeCursor(this._target, pixels, mask, hotx, hoty, w, h); - } else { - Display.changeCursor(this._target, pixels, mask, hotx, hoty, w, h, this._colourMap); - } - }, - - defaultCursor: function () { - this._target.style.cursor = "default"; - }, - - disableLocalCursor: function () { - this._target.style.cursor = "none"; - }, - - clippingDisplay: function () { - var vp = this._viewportLoc; - return this._fb_width > vp.w || this._fb_height > vp.h; - }, - - // Overridden getters/setters - set_scale: function (scale) { - this._rescale(scale); - }, - - set_viewport: function (viewport) { - this._viewport = viewport; - // May need to readjust the viewport dimensions - var vp = this._viewportLoc; - this.viewportChangeSize(vp.w, vp.h); - this.viewportChangePos(0, 0); - }, - - get_width: function () { - return this._fb_width; - }, - get_height: function () { - return this._fb_height; - }, - - autoscale: function (containerWidth, containerHeight, downscaleOnly) { - var vp = this._viewportLoc; - var targetAspectRatio = containerWidth / containerHeight; - var fbAspectRatio = vp.w / vp.h; - - var scaleRatio; - if (fbAspectRatio >= targetAspectRatio) { - scaleRatio = containerWidth / vp.w; - } else { - scaleRatio = containerHeight / vp.h; - } - - if (scaleRatio > 1.0 && downscaleOnly) { - scaleRatio = 1.0; - } - - this._rescale(scaleRatio); - }, - - // Private Methods - _rescale: function (factor) { - this._scale = factor; - var vp = this._viewportLoc; - - // NB(directxman12): If you set the width directly, or set the - // style width to a number, the canvas is cleared. - // However, if you set the style width to a string - // ('NNNpx'), the canvas is scaled without clearing. - var width = Math.round(factor * vp.w) + 'px'; - var height = Math.round(factor * vp.h) + 'px'; - - if (this._target.style.width !== width || this._target.style.height !== height) { - this._target.style.width = width; - this._target.style.height = height; - } - }, - - _setFillColor: function (color) { - var bgr; - if (this._true_color) { - bgr = color; - } else { - bgr = this._colourMap[color]; - } - - var newStyle = 'rgb(' + bgr[2] + ',' + bgr[1] + ',' + bgr[0] + ')'; - if (newStyle !== this._prevDrawStyle) { - this._drawCtx.fillStyle = newStyle; - this._prevDrawStyle = newStyle; - } - }, - - _rgbImageData: function (x, y, width, height, arr, offset) { - var img = this._drawCtx.createImageData(width, height); - var data = img.data; - for (var i = 0, j = offset; i < width * height * 4; i += 4, j += 3) { - data[i] = arr[j]; - data[i + 1] = arr[j + 1]; - data[i + 2] = arr[j + 2]; - data[i + 3] = 255; // Alpha - } - this._drawCtx.putImageData(img, x, y); - this._damage(x, y, img.width, img.height); - }, - - _bgrxImageData: function (x, y, width, height, arr, offset) { - var img = this._drawCtx.createImageData(width, height); - var data = img.data; - for (var i = 0, j = offset; i < width * height * 4; i += 4, j += 4) { - data[i] = arr[j + 2]; - data[i + 1] = arr[j + 1]; - data[i + 2] = arr[j]; - data[i + 3] = 255; // Alpha - } - this._drawCtx.putImageData(img, x, y); - this._damage(x, y, img.width, img.height); - }, - - _rgbxImageData: function (x, y, width, height, arr, offset) { - // NB(directxman12): arr must be an Type Array view - var img; - if (SUPPORTS_IMAGEDATA_CONSTRUCTOR) { - img = new ImageData(new Uint8ClampedArray(arr.buffer, arr.byteOffset, width * height * 4), width, height); - } else { - img = this._drawCtx.createImageData(width, height); - img.data.set(new Uint8ClampedArray(arr.buffer, arr.byteOffset, width * height * 4)); - } - this._drawCtx.putImageData(img, x, y); - this._damage(x, y, img.width, img.height); - }, - - _cmapImageData: function (x, y, width, height, arr, offset) { - var img = this._drawCtx.createImageData(width, height); - var data = img.data; - var cmap = this._colourMap; - for (var i = 0, j = offset; i < width * height * 4; i += 4, j++) { - var bgr = cmap[arr[j]]; - data[i] = bgr[2]; - data[i + 1] = bgr[1]; - data[i + 2] = bgr[0]; - data[i + 3] = 255; // Alpha - } - this._drawCtx.putImageData(img, x, y); - this._damage(x, y, img.width, img.height); - }, - - _renderQ_push: function (action) { - this._renderQ.push(action); - if (this._renderQ.length === 1) { - // If this can be rendered immediately it will be, otherwise - // the scanner will wait for the relevant event - this._scan_renderQ(); - } - }, - - _resume_renderQ: function () { - // "this" is the object that is ready, not the - // display object - this.removeEventListener('load', this._noVNC_display._resume_renderQ); - this._noVNC_display._scan_renderQ(); - }, - - _scan_renderQ: function () { - var ready = true; - while (ready && this._renderQ.length > 0) { - var a = this._renderQ[0]; - switch (a.type) { - case 'flip': - this.flip(true); - break; - case 'copy': - this.copyImage(a.old_x, a.old_y, a.x, a.y, a.width, a.height, true); - break; - case 'fill': - this.fillRect(a.x, a.y, a.width, a.height, a.color, true); - break; - case 'blit': - this.blitImage(a.x, a.y, a.width, a.height, a.data, 0, true); - break; - case 'blitRgb': - this.blitRgbImage(a.x, a.y, a.width, a.height, a.data, 0, true); - break; - case 'blitRgbx': - this.blitRgbxImage(a.x, a.y, a.width, a.height, a.data, 0, true); - break; - case 'img': - if (a.img.complete) { - this.drawImage(a.img, a.x, a.y); - } else { - a.img._noVNC_display = this; - a.img.addEventListener('load', this._resume_renderQ); - // We need to wait for this image to 'load' - // to keep things in-order - ready = false; + if (this._viewport) { + if (this._maxWidth !== 0 && width > this._maxWidth) { + width = this._maxWidth; } - break; + if (this._maxHeight !== 0 && height > this._maxHeight) { + height = this._maxHeight; + } + } + + var cr = this._cleanRect; + + if (width < vp.w && cr.x2 > vp.x + width - 1) { + cr.x2 = vp.x + width - 1; + } + if (height < vp.h && cr.y2 > vp.y + height - 1) { + cr.y2 = vp.y + height - 1; + } + + vp.w = width; + vp.h = height; + + var canvas = this._target; + if (canvas.width !== width || canvas.height !== height) { + + // We have to save the canvas data since changing the size will clear it + var saveImg = null; + if (vp.w > 0 && vp.h > 0 && canvas.width > 0 && canvas.height > 0) { + var img_width = canvas.width < vp.w ? canvas.width : vp.w; + var img_height = canvas.height < vp.h ? canvas.height : vp.h; + saveImg = this._drawCtx.getImageData(0, 0, img_width, img_height); + } + + if (canvas.width !== width) { + canvas.width = width; + canvas.style.width = width + 'px'; + } + if (canvas.height !== height) { + canvas.height = height; + canvas.style.height = height + 'px'; + } + + if (saveImg) { + this._drawCtx.putImageData(saveImg, 0, 0); + } + } } + }, - if (ready) { - this._renderQ.shift(); - } - } + // Return a map of clean and dirty areas of the viewport and reset the + // tracking of clean and dirty areas + // + // Returns: { 'cleanBox': { 'x': x, 'y': y, 'w': w, 'h': h}, + // 'dirtyBoxes': [{ 'x': x, 'y': y, 'w': w, 'h': h }, ...] } + getCleanDirtyReset: function () { + var vp = this._viewportLoc; + var cr = this._cleanRect; - if (this._renderQ.length === 0 && this._flushing) { - this._flushing = false; - this._onFlush(); - } - } -}; + var cleanBox = { 'x': cr.x1, 'y': cr.y1, + 'w': cr.x2 - cr.x1 + 1, 'h': cr.y2 - cr.y1 + 1 }; -(0, _properties.make_properties)(Display, [['target', 'wo', 'dom'], // Canvas element for rendering -['context', 'ro', 'raw'], // Canvas 2D context for rendering (read-only) -['logo', 'rw', 'raw'], // Logo to display when cleared: {"width": w, "height": h, "type": mime-type, "data": data} -['true_color', 'rw', 'bool'], // Use true-color pixel data -['colourMap', 'rw', 'arr'], // Colour map array (when not true-color) -['scale', 'rw', 'float'], // Display area scale factor 0.0 - 1.0 -['viewport', 'rw', 'bool'], // Use viewport clipping -['width', 'ro', 'int'], // Display area width -['height', 'ro', 'int'], // Display area height - -['render_mode', 'ro', 'str'], // Canvas rendering mode (read-only) - -['prefer_js', 'rw', 'str'], // Prefer Javascript over canvas methods -['cursor_uri', 'rw', 'raw'], // Can we render cursor using data URI - -['onFlush', 'rw', 'func']]); - -// Class Methods -Display.changeCursor = function (target, pixels, mask, hotx, hoty, w0, h0, cmap) { - var w = w0; - var h = h0; - if (h < w) { - h = w; // increase h to make it square - } else { - w = h; // increase w to make it square - } - - var cur = []; - - // Push multi-byte little-endian values - cur.push16le = function (num) { - this.push(num & 0xFF, num >> 8 & 0xFF); - }; - cur.push32le = function (num) { - this.push(num & 0xFF, num >> 8 & 0xFF, num >> 16 & 0xFF, num >> 24 & 0xFF); - }; - - var IHDRsz = 40; - var RGBsz = w * h * 4; - var XORsz = Math.ceil(w * h / 8.0); - var ANDsz = Math.ceil(w * h / 8.0); - - cur.push16le(0); // 0: Reserved - cur.push16le(2); // 2: .CUR type - cur.push16le(1); // 4: Number of images, 1 for non-animated ico - - // Cursor #1 header (ICONDIRENTRY) - cur.push(w); // 6: width - cur.push(h); // 7: height - cur.push(0); // 8: colors, 0 -> true-color - cur.push(0); // 9: reserved - cur.push16le(hotx); // 10: hotspot x coordinate - cur.push16le(hoty); // 12: hotspot y coordinate - cur.push32le(IHDRsz + RGBsz + XORsz + ANDsz); - // 14: cursor data byte size - cur.push32le(22); // 18: offset of cursor data in the file - - // Cursor #1 InfoHeader (ICONIMAGE/BITMAPINFO) - cur.push32le(IHDRsz); // 22: InfoHeader size - cur.push32le(w); // 26: Cursor width - cur.push32le(h * 2); // 30: XOR+AND height - cur.push16le(1); // 34: number of planes - cur.push16le(32); // 36: bits per pixel - cur.push32le(0); // 38: Type of compression - - cur.push32le(XORsz + ANDsz); - // 42: Size of Image - cur.push32le(0); // 46: reserved - cur.push32le(0); // 50: reserved - cur.push32le(0); // 54: reserved - cur.push32le(0); // 58: reserved - - // 62: color data (RGBQUAD icColors[]) - var y, x; - for (y = h - 1; y >= 0; y--) { - for (x = 0; x < w; x++) { - if (x >= w0 || y >= h0) { - cur.push(0); // blue - cur.push(0); // green - cur.push(0); // red - cur.push(0); // alpha + var dirtyBoxes = []; + if (cr.x1 >= cr.x2 || cr.y1 >= cr.y2) { + // Whole viewport is dirty + dirtyBoxes.push({ 'x': vp.x, 'y': vp.y, 'w': vp.w, 'h': vp.h }); } else { - var idx = y * Math.ceil(w0 / 8) + Math.floor(x / 8); - var alpha = mask[idx] << x % 8 & 0x80 ? 255 : 0; - if (cmap) { - idx = w0 * y + x; - var rgb = cmap[pixels[idx]]; - cur.push(rgb[2]); // blue - cur.push(rgb[1]); // green - cur.push(rgb[0]); // red - cur.push(alpha); // alpha + // Redraw dirty regions + var vx2 = vp.x + vp.w - 1; + var vy2 = vp.y + vp.h - 1; + + if (vp.x < cr.x1) { + // left side dirty region + dirtyBoxes.push({ 'x': vp.x, 'y': vp.y, + 'w': cr.x1 - vp.x + 1, 'h': vp.h }); + } + if (vx2 > cr.x2) { + // right side dirty region + dirtyBoxes.push({ 'x': cr.x2 + 1, 'y': vp.y, + 'w': vx2 - cr.x2, 'h': vp.h }); + } + if (vp.y < cr.y1) { + // top/middle dirty region + dirtyBoxes.push({ 'x': cr.x1, 'y': vp.y, + 'w': cr.x2 - cr.x1 + 1, 'h': cr.y1 - vp.y }); + } + if (vy2 > cr.y2) { + // bottom/middle dirty region + dirtyBoxes.push({ 'x': cr.x1, 'y': cr.y2 + 1, + 'w': cr.x2 - cr.x1 + 1, 'h': vy2 - cr.y2 }); + } + } + + this._cleanRect = { 'x1': vp.x, 'y1': vp.y, + 'x2': vp.x + vp.w - 1, 'y2': vp.y + vp.h - 1 }; + + return { 'cleanBox': cleanBox, 'dirtyBoxes': dirtyBoxes }; + }, + + absX: function (x) { + return x + this._viewportLoc.x; + }, + + absY: function (y) { + return y + this._viewportLoc.y; + }, + + resize: function (width, height) { + this._prevDrawStyle = ""; + + this._fb_width = width; + this._fb_height = height; + + this._rescale(this._scale); + + this.viewportChangeSize(); + }, + + clear: function () { + if (this._logo) { + this.resize(this._logo.width, this._logo.height); + this.blitStringImage(this._logo.data, 0, 0); + } else { + if (_util2.default.Engine.trident === 6) { + // NB(directxman12): there's a bug in IE10 where we can fail to actually + // clear the canvas here because of the resize. + // Clearing the current viewport first fixes the issue + this._drawCtx.clearRect(0, 0, this._viewportLoc.w, this._viewportLoc.h); + } + this.resize(240, 20); + this._drawCtx.clearRect(0, 0, this._viewportLoc.w, this._viewportLoc.h); + } + + this._renderQ = []; + }, + + pending: function () { + return this._renderQ.length > 0; + }, + + flush: function () { + if (this._renderQ.length === 0) { + this._onFlush(); + } else { + this._flushing = true; + } + }, + + fillRect: function (x, y, width, height, color, from_queue) { + if (this._renderQ.length !== 0 && !from_queue) { + this._renderQ_push({ + 'type': 'fill', + 'x': x, + 'y': y, + 'width': width, + 'height': height, + 'color': color + }); + } else { + this._setFillColor(color); + this._drawCtx.fillRect(x - this._viewportLoc.x, y - this._viewportLoc.y, width, height); + } + }, + + copyImage: function (old_x, old_y, new_x, new_y, w, h, from_queue) { + if (this._renderQ.length !== 0 && !from_queue) { + this._renderQ_push({ + 'type': 'copy', + 'old_x': old_x, + 'old_y': old_y, + 'x': new_x, + 'y': new_y, + 'width': w, + 'height': h + }); + } else { + var x1 = old_x - this._viewportLoc.x; + var y1 = old_y - this._viewportLoc.y; + var x2 = new_x - this._viewportLoc.x; + var y2 = new_y - this._viewportLoc.y; + + this._drawCtx.drawImage(this._target, x1, y1, w, h, x2, y2, w, h); + } + }, + + imageRect: function (x, y, mime, arr) { + var img = new Image(); + img.src = "data: " + mime + ";base64," + _base2.default.encode(arr); + this._renderQ_push({ + 'type': 'img', + 'img': img, + 'x': x, + 'y': y + }); + }, + + // start updating a tile + startTile: function (x, y, width, height, color) { + this._tile_x = x; + this._tile_y = y; + if (width === 16 && height === 16) { + this._tile = this._tile16x16; + } else { + this._tile = this._drawCtx.createImageData(width, height); + } + + if (this._prefer_js) { + var bgr; + if (this._true_color) { + bgr = color; } else { - idx = (w0 * y + x) * 4; - cur.push(pixels[idx]); // blue - cur.push(pixels[idx + 1]); // green - cur.push(pixels[idx + 2]); // red - cur.push(alpha); // alpha + bgr = this._colourMap[color[0]]; + } + var red = bgr[2]; + var green = bgr[1]; + var blue = bgr[0]; + + var data = this._tile.data; + for (var i = 0; i < width * height * 4; i += 4) { + data[i] = red; + data[i + 1] = green; + data[i + 2] = blue; + data[i + 3] = 255; + } + } else { + this.fillRect(x, y, width, height, color, true); + } + }, + + // update sub-rectangle of the current tile + subTile: function (x, y, w, h, color) { + if (this._prefer_js) { + var bgr; + if (this._true_color) { + bgr = color; + } else { + bgr = this._colourMap[color[0]]; + } + var red = bgr[2]; + var green = bgr[1]; + var blue = bgr[0]; + var xend = x + w; + var yend = y + h; + + var data = this._tile.data; + var width = this._tile.width; + for (var j = y; j < yend; j++) { + for (var i = x; i < xend; i++) { + var p = (i + j * width) * 4; + data[p] = red; + data[p + 1] = green; + data[p + 2] = blue; + data[p + 3] = 255; + } + } + } else { + this.fillRect(this._tile_x + x, this._tile_y + y, w, h, color, true); + } + }, + + // draw the current tile to the screen + finishTile: function () { + if (this._prefer_js) { + this._drawCtx.putImageData(this._tile, this._tile_x - this._viewportLoc.x, this._tile_y - this._viewportLoc.y); + } + // else: No-op -- already done by setSubTile + }, + + blitImage: function (x, y, width, height, arr, offset, from_queue) { + if (this._renderQ.length !== 0 && !from_queue) { + // NB(directxman12): it's technically more performant here to use preallocated arrays, + // but it's a lot of extra work for not a lot of payoff -- if we're using the render queue, + // this probably isn't getting called *nearly* as much + var new_arr = new Uint8Array(width * height * 4); + new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length)); + this._renderQ_push({ + 'type': 'blit', + 'data': new_arr, + 'x': x, + 'y': y, + 'width': width, + 'height': height + }); + } else if (this._true_color) { + this._bgrxImageData(x, y, this._viewportLoc.x, this._viewportLoc.y, width, height, arr, offset); + } else { + this._cmapImageData(x, y, this._viewportLoc.x, this._viewportLoc.y, width, height, arr, offset); + } + }, + + blitRgbImage: function (x, y, width, height, arr, offset, from_queue) { + if (this._renderQ.length !== 0 && !from_queue) { + // NB(directxman12): it's technically more performant here to use preallocated arrays, + // but it's a lot of extra work for not a lot of payoff -- if we're using the render queue, + // this probably isn't getting called *nearly* as much + var new_arr = new Uint8Array(width * height * 3); + new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length)); + this._renderQ_push({ + 'type': 'blitRgb', + 'data': new_arr, + 'x': x, + 'y': y, + 'width': width, + 'height': height + }); + } else if (this._true_color) { + this._rgbImageData(x, y, this._viewportLoc.x, this._viewportLoc.y, width, height, arr, offset); + } else { + // probably wrong? + this._cmapImageData(x, y, this._viewportLoc.x, this._viewportLoc.y, width, height, arr, offset); + } + }, + + blitRgbxImage: function (x, y, width, height, arr, offset, from_queue) { + if (this._renderQ.length !== 0 && !from_queue) { + // NB(directxman12): it's technically more performant here to use preallocated arrays, + // but it's a lot of extra work for not a lot of payoff -- if we're using the render queue, + // this probably isn't getting called *nearly* as much + var new_arr = new Uint8Array(width * height * 4); + new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length)); + this._renderQ_push({ + 'type': 'blitRgbx', + 'data': new_arr, + 'x': x, + 'y': y, + 'width': width, + 'height': height + }); + } else { + this._rgbxImageData(x, y, this._viewportLoc.x, this._viewportLoc.y, width, height, arr, offset); + } + }, + + blitStringImage: function (str, x, y) { + var img = new Image(); + img.onload = function () { + this._drawCtx.drawImage(img, x - this._viewportLoc.x, y - this._viewportLoc.y); + }.bind(this); + img.src = str; + return img; // for debugging purposes + }, + + // wrap ctx.drawImage but relative to viewport + drawImage: function (img, x, y) { + this._drawCtx.drawImage(img, x - this._viewportLoc.x, y - this._viewportLoc.y); + }, + + changeCursor: function (pixels, mask, hotx, hoty, w, h) { + if (this._cursor_uri === false) { + _util2.default.Warn("changeCursor called but no cursor data URI support"); + return; + } + + if (this._true_color) { + Display.changeCursor(this._target, pixels, mask, hotx, hoty, w, h); + } else { + Display.changeCursor(this._target, pixels, mask, hotx, hoty, w, h, this._colourMap); + } + }, + + defaultCursor: function () { + this._target.style.cursor = "default"; + }, + + disableLocalCursor: function () { + this._target.style.cursor = "none"; + }, + + clippingDisplay: function () { + var vp = this._viewportLoc; + + var fbClip = this._fb_width > vp.w || this._fb_height > vp.h; + var limitedVp = this._maxWidth !== 0 && this._maxHeight !== 0; + var clipping = false; + + if (limitedVp) { + clipping = vp.w > this._maxWidth || vp.h > this._maxHeight; + } + + return fbClip || limitedVp && clipping; + }, + + // Overridden getters/setters + get_context: function () { + return this._drawCtx; + }, + + set_scale: function (scale) { + this._rescale(scale); + }, + + set_width: function (w) { + this._fb_width = w; + }, + get_width: function () { + return this._fb_width; + }, + + set_height: function (h) { + this._fb_height = h; + }, + get_height: function () { + return this._fb_height; + }, + + autoscale: function (containerWidth, containerHeight, downscaleOnly) { + var targetAspectRatio = containerWidth / containerHeight; + var fbAspectRatio = this._fb_width / this._fb_height; + + var scaleRatio; + if (fbAspectRatio >= targetAspectRatio) { + scaleRatio = containerWidth / this._fb_width; + } else { + scaleRatio = containerHeight / this._fb_height; + } + + var targetW, targetH; + if (scaleRatio > 1.0 && downscaleOnly) { + targetW = this._fb_width; + targetH = this._fb_height; + scaleRatio = 1.0; + } else if (fbAspectRatio >= targetAspectRatio) { + targetW = containerWidth; + targetH = Math.round(containerWidth / fbAspectRatio); + } else { + targetW = Math.round(containerHeight * fbAspectRatio); + targetH = containerHeight; + } + + // NB(directxman12): If you set the width directly, or set the + // style width to a number, the canvas is cleared. + // However, if you set the style width to a string + // ('NNNpx'), the canvas is scaled without clearing. + this._target.style.width = targetW + 'px'; + this._target.style.height = targetH + 'px'; + + this._scale = scaleRatio; + + return scaleRatio; // so that the mouse, etc scale can be set + }, + + // Private Methods + _rescale: function (factor) { + this._scale = factor; + + var w; + var h; + + if (this._viewport && this._maxWidth !== 0 && this._maxHeight !== 0) { + w = Math.min(this._fb_width, this._maxWidth); + h = Math.min(this._fb_height, this._maxHeight); + } else { + w = this._fb_width; + h = this._fb_height; + } + + this._target.style.width = Math.round(factor * w) + 'px'; + this._target.style.height = Math.round(factor * h) + 'px'; + }, + + _setFillColor: function (color) { + var bgr; + if (this._true_color) { + bgr = color; + } else { + bgr = this._colourMap[color]; + } + + var newStyle = 'rgb(' + bgr[2] + ',' + bgr[1] + ',' + bgr[0] + ')'; + if (newStyle !== this._prevDrawStyle) { + this._drawCtx.fillStyle = newStyle; + this._prevDrawStyle = newStyle; + } + }, + + _rgbImageData: function (x, y, vx, vy, width, height, arr, offset) { + var img = this._drawCtx.createImageData(width, height); + var data = img.data; + for (var i = 0, j = offset; i < width * height * 4; i += 4, j += 3) { + data[i] = arr[j]; + data[i + 1] = arr[j + 1]; + data[i + 2] = arr[j + 2]; + data[i + 3] = 255; // Alpha + } + this._drawCtx.putImageData(img, x - vx, y - vy); + }, + + _bgrxImageData: function (x, y, vx, vy, width, height, arr, offset) { + var img = this._drawCtx.createImageData(width, height); + var data = img.data; + for (var i = 0, j = offset; i < width * height * 4; i += 4, j += 4) { + data[i] = arr[j + 2]; + data[i + 1] = arr[j + 1]; + data[i + 2] = arr[j]; + data[i + 3] = 255; // Alpha + } + this._drawCtx.putImageData(img, x - vx, y - vy); + }, + + _rgbxImageData: function (x, y, vx, vy, width, height, arr, offset) { + // NB(directxman12): arr must be an Type Array view + var img; + if (SUPPORTS_IMAGEDATA_CONSTRUCTOR) { + img = new ImageData(new Uint8ClampedArray(arr.buffer, arr.byteOffset, width * height * 4), width, height); + } else { + img = this._drawCtx.createImageData(width, height); + img.data.set(new Uint8ClampedArray(arr.buffer, arr.byteOffset, width * height * 4)); + } + this._drawCtx.putImageData(img, x - vx, y - vy); + }, + + _cmapImageData: function (x, y, vx, vy, width, height, arr, offset) { + var img = this._drawCtx.createImageData(width, height); + var data = img.data; + var cmap = this._colourMap; + for (var i = 0, j = offset; i < width * height * 4; i += 4, j++) { + var bgr = cmap[arr[j]]; + data[i] = bgr[2]; + data[i + 1] = bgr[1]; + data[i + 2] = bgr[0]; + data[i + 3] = 255; // Alpha + } + this._drawCtx.putImageData(img, x - vx, y - vy); + }, + + _renderQ_push: function (action) { + this._renderQ.push(action); + if (this._renderQ.length === 1) { + // If this can be rendered immediately it will be, otherwise + // the scanner will wait for the relevant event + this._scan_renderQ(); + } + }, + + _resume_renderQ: function () { + // "this" is the object that is ready, not the + // display object + this.removeEventListener('load', this._noVNC_display._resume_renderQ); + this._noVNC_display._scan_renderQ(); + }, + + _scan_renderQ: function () { + var ready = true; + while (ready && this._renderQ.length > 0) { + var a = this._renderQ[0]; + switch (a.type) { + case 'copy': + this.copyImage(a.old_x, a.old_y, a.x, a.y, a.width, a.height, true); + break; + case 'fill': + this.fillRect(a.x, a.y, a.width, a.height, a.color, true); + break; + case 'blit': + this.blitImage(a.x, a.y, a.width, a.height, a.data, 0, true); + break; + case 'blitRgb': + this.blitRgbImage(a.x, a.y, a.width, a.height, a.data, 0, true); + break; + case 'blitRgbx': + this.blitRgbxImage(a.x, a.y, a.width, a.height, a.data, 0, true); + break; + case 'img': + if (a.img.complete) { + this.drawImage(a.img, a.x, a.y); + } else { + a.img._noVNC_display = this; + a.img.addEventListener('load', this._resume_renderQ); + // We need to wait for this image to 'load' + // to keep things in-order + ready = false; + } + break; + } + + if (ready) { + this._renderQ.shift(); + } + } + + if (this._renderQ.length === 0 && this._flushing) { + this._flushing = false; + this._onFlush(); + } + } + }; + + _util2.default.make_properties(Display, [['target', 'wo', 'dom'], // Canvas element for rendering + ['context', 'ro', 'raw'], // Canvas 2D context for rendering (read-only) + ['logo', 'rw', 'raw'], // Logo to display when cleared: {"width": w, "height": h, "data": data} + ['true_color', 'rw', 'bool'], // Use true-color pixel data + ['colourMap', 'rw', 'arr'], // Colour map array (when not true-color) + ['scale', 'rw', 'float'], // Display area scale factor 0.0 - 1.0 + ['viewport', 'rw', 'bool'], // Use viewport clipping + ['width', 'rw', 'int'], // Display area width + ['height', 'rw', 'int'], // Display area height + ['maxWidth', 'rw', 'int'], // Viewport max width (0 if disabled) + ['maxHeight', 'rw', 'int'], // Viewport max height (0 if disabled) + + ['render_mode', 'ro', 'str'], // Canvas rendering mode (read-only) + + ['prefer_js', 'rw', 'str'], // Prefer Javascript over canvas methods + ['cursor_uri', 'rw', 'raw'], // Can we render cursor using data URI + + ['onFlush', 'rw', 'func']]); + + // Class Methods + Display.changeCursor = function (target, pixels, mask, hotx, hoty, w0, h0, cmap) { + var w = w0; + var h = h0; + if (h < w) { + h = w; // increase h to make it square + } else { + w = h; // increase w to make it square + } + + var cur = []; + + // Push multi-byte little-endian values + cur.push16le = function (num) { + this.push(num & 0xFF, num >> 8 & 0xFF); + }; + cur.push32le = function (num) { + this.push(num & 0xFF, num >> 8 & 0xFF, num >> 16 & 0xFF, num >> 24 & 0xFF); + }; + + var IHDRsz = 40; + var RGBsz = w * h * 4; + var XORsz = Math.ceil(w * h / 8.0); + var ANDsz = Math.ceil(w * h / 8.0); + + cur.push16le(0); // 0: Reserved + cur.push16le(2); // 2: .CUR type + cur.push16le(1); // 4: Number of images, 1 for non-animated ico + + // Cursor #1 header (ICONDIRENTRY) + cur.push(w); // 6: width + cur.push(h); // 7: height + cur.push(0); // 8: colors, 0 -> true-color + cur.push(0); // 9: reserved + cur.push16le(hotx); // 10: hotspot x coordinate + cur.push16le(hoty); // 12: hotspot y coordinate + cur.push32le(IHDRsz + RGBsz + XORsz + ANDsz); + // 14: cursor data byte size + cur.push32le(22); // 18: offset of cursor data in the file + + // Cursor #1 InfoHeader (ICONIMAGE/BITMAPINFO) + cur.push32le(IHDRsz); // 22: InfoHeader size + cur.push32le(w); // 26: Cursor width + cur.push32le(h * 2); // 30: XOR+AND height + cur.push16le(1); // 34: number of planes + cur.push16le(32); // 36: bits per pixel + cur.push32le(0); // 38: Type of compression + + cur.push32le(XORsz + ANDsz); + // 42: Size of Image + cur.push32le(0); // 46: reserved + cur.push32le(0); // 50: reserved + cur.push32le(0); // 54: reserved + cur.push32le(0); // 58: reserved + + // 62: color data (RGBQUAD icColors[]) + var y, x; + for (y = h - 1; y >= 0; y--) { + for (x = 0; x < w; x++) { + if (x >= w0 || y >= h0) { + cur.push(0); // blue + cur.push(0); // green + cur.push(0); // red + cur.push(0); // alpha + } else { + var idx = y * Math.ceil(w0 / 8) + Math.floor(x / 8); + var alpha = mask[idx] << x % 8 & 0x80 ? 255 : 0; + if (cmap) { + idx = w0 * y + x; + var rgb = cmap[pixels[idx]]; + cur.push(rgb[2]); // blue + cur.push(rgb[1]); // green + cur.push(rgb[0]); // red + cur.push(alpha); // alpha + } else { + idx = (w0 * y + x) * 4; + cur.push(pixels[idx + 2]); // blue + cur.push(pixels[idx + 1]); // green + cur.push(pixels[idx]); // red + cur.push(alpha); // alpha + } } } } - } - // XOR/bitmask data (BYTE icXOR[]) - // (ignored, just needs to be the right size) - for (y = 0; y < h; y++) { - for (x = 0; x < Math.ceil(w / 8); x++) { - cur.push(0); + // XOR/bitmask data (BYTE icXOR[]) + // (ignored, just needs to be the right size) + for (y = 0; y < h; y++) { + for (x = 0; x < Math.ceil(w / 8); x++) { + cur.push(0); + } } - } - // AND/bitmask data (BYTE icAND[]) - // (ignored, just needs to be the right size) - for (y = 0; y < h; y++) { - for (x = 0; x < Math.ceil(w / 8); x++) { - cur.push(0); + // AND/bitmask data (BYTE icAND[]) + // (ignored, just needs to be the right size) + for (y = 0; y < h; y++) { + for (x = 0; x < Math.ceil(w / 8); x++) { + cur.push(0); + } } - } - var url = 'data:image/x-icon;base64,' + _base2.default.encode(cur); - target.style.cursor = 'url(' + url + ')' + hotx + ' ' + hoty + ', default'; + var url = 'data:image/x-icon;base64,' + _base2.default.encode(cur); + target.style.cursor = 'url(' + url + ')' + hotx + ' ' + hoty + ', default'; + }; +})(); +module.exports = exports["default"]; + +},{"./base64":1,"./util":11}],4:[function(require,module,exports){ +'use strict'; + +var zlib = require('pako/lib/zlib/inflate.js'); +var ZStream = require('pako/lib/zlib/zstream.js'); + +function Inflate() { + this.strm = new ZStream(); + this.chunkSize = 1024 * 10 * 10; + this.strm.output = new Uint8Array(this.chunkSize); + this.windowBits = 5; + + zlib.inflateInit(this.strm, this.windowBits); }; -},{"./base64.js":1,"./util/browsers.js":11,"./util/logging.js":14,"./util/properties.js":15}],4:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.default = Inflate; - -var _inflate = require("pako/lib/zlib/inflate.js"); - -var _zstream = require("pako/lib/zlib/zstream.js"); - -var _zstream2 = _interopRequireDefault(_zstream); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } Inflate.prototype = { inflate: function (data, flush, expected) { @@ -1314,445 +1402,443 @@ Inflate.prototype = { this.strm.avail_out = this.chunkSize; - (0, _inflate.inflate)(this.strm, flush); + zlib.inflate(this.strm, flush); return new Uint8Array(this.strm.output.buffer, 0, this.strm.next_out); }, reset: function () { - (0, _inflate.inflateReset)(this.strm); + zlib.inflateReset(this.strm); } }; -function Inflate() { - this.strm = new _zstream2.default(); - this.chunkSize = 1024 * 10 * 10; - this.strm.output = new Uint8Array(this.chunkSize); - this.windowBits = 5; +module.exports = { Inflate: Inflate }; - (0, _inflate.inflateInit)(this.strm, this.windowBits); -}; -},{"pako/lib/zlib/inflate.js":234,"pako/lib/zlib/zstream.js":236}],5:[function(require,module,exports){ -'use strict'; +},{"pako/lib/zlib/inflate.js":229,"pako/lib/zlib/zstream.js":231}],5:[function(require,module,exports){ +"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Mouse = exports.Keyboard = undefined; -var _logging = require('../util/logging.js'); +var _util = require("../util"); -var Log = _interopRequireWildcard(_logging); +var _util2 = _interopRequireDefault(_util); -var _browsers = require('../util/browsers.js'); +var _util3 = require("./util"); -var _events = require('../util/events.js'); +var _util4 = _interopRequireDefault(_util3); -var _properties = require('../util/properties.js'); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -var _util = require('./util.js'); - -var KeyboardUtil = _interopRequireWildcard(_util); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -// -// Keyboard event handler -// - -var Keyboard = function (defaults) { - this._keyDownList = []; // List of depressed keys - // (even if they are happy) - - (0, _properties.set_defaults)(this, defaults, { - 'target': document, - 'focused': true - }); - - // create the keyboard handler - this._handler = new KeyboardUtil.KeyEventDecoder(KeyboardUtil.ModifierSync(), KeyboardUtil.VerifyCharModifier( /* jshint newcap: false */ - KeyboardUtil.TrackKeyState(KeyboardUtil.EscapeModifiers(this._handleRfbEvent.bind(this))))); /* jshint newcap: true */ - - // keep these here so we can refer to them later - this._eventHandlers = { - 'keyup': this._handleKeyUp.bind(this), - 'keydown': this._handleKeyDown.bind(this), - 'keypress': this._handleKeyPress.bind(this), - 'blur': this._allKeysUp.bind(this) - }; -}; /* - * noVNC: HTML5 VNC client - * Copyright (C) 2012 Joel Martin - * Copyright (C) 2013 Samuel Mannehed for Cendio AB - * Licensed under MPL 2.0 or any later version (see LICENSE.txt) - */ +/* + * noVNC: HTML5 VNC client + * Copyright (C) 2012 Joel Martin + * Copyright (C) 2013 Samuel Mannehed for Cendio AB + * Licensed under MPL 2.0 or any later version (see LICENSE.txt) + */ /*jslint browser: true, white: false */ /*global window, Util */ -Keyboard.prototype = { - // private methods +var Keyboard = exports.Keyboard = undefined; - _handleRfbEvent: function (e) { - if (this._onKeyPress) { - Log.Debug("onKeyPress " + (e.type == 'keydown' ? "down" : "up") + ", keysym: " + e.keysym.keysym + "(" + e.keysym.keyname + ")"); - this._onKeyPress(e); - } - }, +(function () { + "use strict"; - setQEMUVNCKeyboardHandler: function () { - this._handler = new KeyboardUtil.QEMUKeyEventDecoder(KeyboardUtil.ModifierSync(), KeyboardUtil.TrackQEMUKeyState(this._handleRfbEvent.bind(this))); - }, + // + // Keyboard event handler + // - _handleKeyDown: function (e) { - if (!this._focused) { - return; - } + exports.Keyboard = Keyboard = function (defaults) { + this._keyDownList = []; // List of depressed keys + // (even if they are happy) - if (this._handler.keydown(e)) { - // Suppress bubbling/default actions - (0, _events.stopEvent)(e); - } else { - // Allow the event to bubble and become a keyPress event which - // will have the character code translated - } - }, + _util2.default.set_defaults(this, defaults, { + 'target': document, + 'focused': true + }); - _handleKeyPress: function (e) { - if (!this._focused) { - return; - } + // create the keyboard handler + this._handler = new _util4.default.KeyEventDecoder(_util4.default.ModifierSync(), _util4.default.VerifyCharModifier( /* jshint newcap: false */ + _util4.default.TrackKeyState(_util4.default.EscapeModifiers(this._handleRfbEvent.bind(this))))); /* jshint newcap: true */ - if (this._handler.keypress(e)) { - // Suppress bubbling/default actions - (0, _events.stopEvent)(e); - } - }, - - _handleKeyUp: function (e) { - if (!this._focused) { - return; - } - - if (this._handler.keyup(e)) { - // Suppress bubbling/default actions - (0, _events.stopEvent)(e); - } - }, - - _allKeysUp: function () { - Log.Debug(">> Keyboard.allKeysUp"); - this._handler.releaseAll(); - Log.Debug("<< Keyboard.allKeysUp"); - }, - - // Public methods - - grab: function () { - //Log.Debug(">> Keyboard.grab"); - var c = this._target; - - c.addEventListener('keydown', this._eventHandlers.keydown); - c.addEventListener('keyup', this._eventHandlers.keyup); - c.addEventListener('keypress', this._eventHandlers.keypress); - - // Release (key up) if window loses focus - window.addEventListener('blur', this._eventHandlers.blur); - - //Log.Debug("<< Keyboard.grab"); - }, - - ungrab: function () { - //Log.Debug(">> Keyboard.ungrab"); - var c = this._target; - - c.removeEventListener('keydown', this._eventHandlers.keydown); - c.removeEventListener('keyup', this._eventHandlers.keyup); - c.removeEventListener('keypress', this._eventHandlers.keypress); - window.removeEventListener('blur', this._eventHandlers.blur); - - // Release (key up) all keys that are in a down state - this._allKeysUp(); - - //Log.Debug(">> Keyboard.ungrab"); - }, - - sync: function (e) { - this._handler.syncModifiers(e); - } -}; - -(0, _properties.make_properties)(Keyboard, [['target', 'wo', 'dom'], // DOM element that captures keyboard input -['focused', 'rw', 'bool'], // Capture and send key events - -['onKeyPress', 'rw', 'func'] // Handler for key press/release -]); - -var Mouse = function (defaults) { - this._mouseCaptured = false; - - this._doubleClickTimer = null; - this._lastTouchPos = null; - - // Configuration attributes - (0, _properties.set_defaults)(this, defaults, { - 'target': document, - 'focused': true, - 'touchButton': 1 - }); - - this._eventHandlers = { - 'mousedown': this._handleMouseDown.bind(this), - 'mouseup': this._handleMouseUp.bind(this), - 'mousemove': this._handleMouseMove.bind(this), - 'mousewheel': this._handleMouseWheel.bind(this), - 'mousedisable': this._handleMouseDisable.bind(this) + // keep these here so we can refer to them later + this._eventHandlers = { + 'keyup': this._handleKeyUp.bind(this), + 'keydown': this._handleKeyDown.bind(this), + 'keypress': this._handleKeyPress.bind(this), + 'blur': this._allKeysUp.bind(this) + }; }; -}; -Mouse.prototype = { - // private methods - _captureMouse: function () { - // capturing the mouse ensures we get the mouseup event - (0, _events.setCapture)(this._target); + Keyboard.prototype = { + // private methods - // some browsers give us mouseup events regardless, - // so if we never captured the mouse, we can disregard the event - this._mouseCaptured = true; - }, + _handleRfbEvent: function (e) { + if (this._onKeyPress) { + _util2.default.Debug("onKeyPress " + (e.type == 'keydown' ? "down" : "up") + ", keysym: " + e.keysym.keysym + "(" + e.keysym.keyname + ")"); + this._onKeyPress(e); + } + }, - _releaseMouse: function () { - (0, _events.releaseCapture)(); + setQEMUVNCKeyboardHandler: function () { + this._handler = new _util4.default.QEMUKeyEventDecoder(_util4.default.ModifierSync(), _util4.default.TrackQEMUKeyState(this._handleRfbEvent.bind(this))); + }, + + _handleKeyDown: function (e) { + if (!this._focused) { + return true; + } + + if (this._handler.keydown(e)) { + // Suppress bubbling/default actions + _util2.default.stopEvent(e); + return false; + } else { + // Allow the event to bubble and become a keyPress event which + // will have the character code translated + return true; + } + }, + + _handleKeyPress: function (e) { + if (!this._focused) { + return true; + } + + if (this._handler.keypress(e)) { + // Suppress bubbling/default actions + _util2.default.stopEvent(e); + return false; + } else { + // Allow the event to bubble and become a keyPress event which + // will have the character code translated + return true; + } + }, + + _handleKeyUp: function (e) { + if (!this._focused) { + return true; + } + + if (this._handler.keyup(e)) { + // Suppress bubbling/default actions + _util2.default.stopEvent(e); + return false; + } else { + // Allow the event to bubble and become a keyPress event which + // will have the character code translated + return true; + } + }, + + _allKeysUp: function () { + _util2.default.Debug(">> Keyboard.allKeysUp"); + this._handler.releaseAll(); + _util2.default.Debug("<< Keyboard.allKeysUp"); + }, + + // Public methods + + grab: function () { + //Util.Debug(">> Keyboard.grab"); + var c = this._target; + + c.addEventListener('keydown', this._eventHandlers.keydown); + c.addEventListener('keyup', this._eventHandlers.keyup); + c.addEventListener('keypress', this._eventHandlers.keypress); + + // Release (key up) if window loses focus + window.addEventListener('blur', this._eventHandlers.blur); + + //Util.Debug("<< Keyboard.grab"); + }, + + ungrab: function () { + //Util.Debug(">> Keyboard.ungrab"); + var c = this._target; + + c.removeEventListener('keydown', this._eventHandlers.keydown); + c.removeEventListener('keyup', this._eventHandlers.keyup); + c.removeEventListener('keypress', this._eventHandlers.keypress); + window.removeEventListener('blur', this._eventHandlers.blur); + + // Release (key up) all keys that are in a down state + this._allKeysUp(); + + //Util.Debug(">> Keyboard.ungrab"); + }, + + sync: function (e) { + this._handler.syncModifiers(e); + } + }; + + _util2.default.make_properties(Keyboard, [['target', 'wo', 'dom'], // DOM element that captures keyboard input + ['focused', 'rw', 'bool'], // Capture and send key events + + ['onKeyPress', 'rw', 'func'] // Handler for key press/release + ]); +})(); + +var Mouse = exports.Mouse = undefined; + +(function () { + exports.Mouse = Mouse = function (defaults) { this._mouseCaptured = false; - }, - _resetDoubleClickTimer: function () { this._doubleClickTimer = null; - }, + this._lastTouchPos = null; - _handleMouseButton: function (e, down) { - if (!this._focused) { - return; - } + // Configuration attributes + _util2.default.set_defaults(this, defaults, { + 'target': document, + 'focused': true, + 'scale': 1.0, + 'touchButton': 1 + }); - if (this._notify) { - this._notify(e); - } + this._eventHandlers = { + 'mousedown': this._handleMouseDown.bind(this), + 'mouseup': this._handleMouseUp.bind(this), + 'mousemove': this._handleMouseMove.bind(this), + 'mousewheel': this._handleMouseWheel.bind(this), + 'mousedisable': this._handleMouseDisable.bind(this) + }; + }; - var pos = this._getMousePosition(e); + Mouse.prototype = { + // private methods + _captureMouse: function () { + // capturing the mouse ensures we get the mouseup event + if (this._target.setCapture) { + this._target.setCapture(); + } - var bmask; - if (e.touches || e.changedTouches) { - // Touch device + // some browsers give us mouseup events regardless, + // so if we never captured the mouse, we can disregard the event + this._mouseCaptured = true; + }, - // When two touches occur within 500 ms of each other and are - // close enough together a double click is triggered. - if (down == 1) { - if (this._doubleClickTimer === null) { - this._lastTouchPos = pos; - } else { - clearTimeout(this._doubleClickTimer); + _releaseMouse: function () { + if (this._target.releaseCapture) { + this._target.releaseCapture(); + } + this._mouseCaptured = false; + }, - // When the distance between the two touches is small enough - // force the position of the latter touch to the position of - // the first. + _resetDoubleClickTimer: function () { + this._doubleClickTimer = null; + }, - var xs = this._lastTouchPos.x - pos.x; - var ys = this._lastTouchPos.y - pos.y; - var d = Math.sqrt(xs * xs + ys * ys); + _handleMouseButton: function (e, down) { + if (!this._focused) { + return true; + } - // The goal is to trigger on a certain physical width, the - // devicePixelRatio brings us a bit closer but is not optimal. - var threshold = 20 * (window.devicePixelRatio || 1); - if (d < threshold) { - pos = this._lastTouchPos; + if (this._notify) { + this._notify(e); + } + + var evt = e ? e : window.event; + var pos = _util2.default.getEventPosition(e, this._target, this._scale); + + var bmask; + if (e.touches || e.changedTouches) { + // Touch device + + // When two touches occur within 500 ms of each other and are + // close enough together a double click is triggered. + if (down == 1) { + if (this._doubleClickTimer === null) { + this._lastTouchPos = pos; + } else { + clearTimeout(this._doubleClickTimer); + + // When the distance between the two touches is small enough + // force the position of the latter touch to the position of + // the first. + + var xs = this._lastTouchPos.x - pos.x; + var ys = this._lastTouchPos.y - pos.y; + var d = Math.sqrt(xs * xs + ys * ys); + + // The goal is to trigger on a certain physical width, the + // devicePixelRatio brings us a bit closer but is not optimal. + var threshold = 20 * (window.devicePixelRatio || 1); + if (d < threshold) { + pos = this._lastTouchPos; + } } + this._doubleClickTimer = setTimeout(this._resetDoubleClickTimer.bind(this), 500); } - this._doubleClickTimer = setTimeout(this._resetDoubleClickTimer.bind(this), 500); - } - bmask = this._touchButton; - // If bmask is set - } else if (e.which) { - /* everything except IE */ - bmask = 1 << e.button; - } else { - /* IE including 9 */ - bmask = (e.button & 0x1) + // Left - (e.button & 0x2) * 2 + // Right - (e.button & 0x4) / 2; // Middle - } - - if (this._onMouseButton) { - Log.Debug("onMouseButton " + (down ? "down" : "up") + ", x: " + pos.x + ", y: " + pos.y + ", bmask: " + bmask); - this._onMouseButton(pos.x, pos.y, down, bmask); - } - (0, _events.stopEvent)(e); - }, - - _handleMouseDown: function (e) { - this._captureMouse(); - this._handleMouseButton(e, 1); - }, - - _handleMouseUp: function (e) { - if (!this._mouseCaptured) { - return; - } - - this._handleMouseButton(e, 0); - this._releaseMouse(); - }, - - _handleMouseWheel: function (e) { - if (!this._focused) { - return; - } - - if (this._notify) { - this._notify(e); - } - - var pos = this._getMousePosition(e); - - if (this._onMouseButton) { - if (e.deltaX < 0) { - this._onMouseButton(pos.x, pos.y, 1, 1 << 5); - this._onMouseButton(pos.x, pos.y, 0, 1 << 5); - } else if (e.deltaX > 0) { - this._onMouseButton(pos.x, pos.y, 1, 1 << 6); - this._onMouseButton(pos.x, pos.y, 0, 1 << 6); + bmask = this._touchButton; + // If bmask is set + } else if (evt.which) { + /* everything except IE */ + bmask = 1 << evt.button; + } else { + /* IE including 9 */ + bmask = (evt.button & 0x1) + // Left + (evt.button & 0x2) * 2 + // Right + (evt.button & 0x4) / 2; // Middle } - if (e.deltaY < 0) { - this._onMouseButton(pos.x, pos.y, 1, 1 << 3); - this._onMouseButton(pos.x, pos.y, 0, 1 << 3); - } else if (e.deltaY > 0) { - this._onMouseButton(pos.x, pos.y, 1, 1 << 4); - this._onMouseButton(pos.x, pos.y, 0, 1 << 4); + if (this._onMouseButton) { + _util2.default.Debug("onMouseButton " + (down ? "down" : "up") + ", x: " + pos.x + ", y: " + pos.y + ", bmask: " + bmask); + this._onMouseButton(pos.x, pos.y, down, bmask); } + _util2.default.stopEvent(e); + return false; + }, + + _handleMouseDown: function (e) { + this._captureMouse(); + this._handleMouseButton(e, 1); + }, + + _handleMouseUp: function (e) { + if (!this._mouseCaptured) { + return; + } + + this._handleMouseButton(e, 0); + this._releaseMouse(); + }, + + _handleMouseWheel: function (e) { + if (!this._focused) { + return true; + } + + if (this._notify) { + this._notify(e); + } + + var evt = e ? e : window.event; + var pos = _util2.default.getEventPosition(e, this._target, this._scale); + + if (this._onMouseButton) { + if (evt.deltaX < 0) { + this._onMouseButton(pos.x, pos.y, 1, 1 << 5); + this._onMouseButton(pos.x, pos.y, 0, 1 << 5); + } else if (evt.deltaX > 0) { + this._onMouseButton(pos.x, pos.y, 1, 1 << 6); + this._onMouseButton(pos.x, pos.y, 0, 1 << 6); + } + + if (evt.deltaY < 0) { + this._onMouseButton(pos.x, pos.y, 1, 1 << 3); + this._onMouseButton(pos.x, pos.y, 0, 1 << 3); + } else if (evt.deltaY > 0) { + this._onMouseButton(pos.x, pos.y, 1, 1 << 4); + this._onMouseButton(pos.x, pos.y, 0, 1 << 4); + } + } + + _util2.default.stopEvent(e); + return false; + }, + + _handleMouseMove: function (e) { + if (!this._focused) { + return true; + } + + if (this._notify) { + this._notify(e); + } + + var evt = e ? e : window.event; + var pos = _util2.default.getEventPosition(e, this._target, this._scale); + if (this._onMouseMove) { + this._onMouseMove(pos.x, pos.y); + } + _util2.default.stopEvent(e); + return false; + }, + + _handleMouseDisable: function (e) { + if (!this._focused) { + return true; + } + + var evt = e ? e : window.event; + var pos = _util2.default.getEventPosition(e, this._target, this._scale); + + /* Stop propagation if inside canvas area */ + if (pos.realx >= 0 && pos.realy >= 0 && pos.realx < this._target.offsetWidth && pos.realy < this._target.offsetHeight) { + //Util.Debug("mouse event disabled"); + _util2.default.stopEvent(e); + return false; + } + + return true; + }, + + // Public methods + grab: function () { + var c = this._target; + + if (_util2.default.isTouchDevice) { + c.addEventListener('touchstart', this._eventHandlers.mousedown); + window.addEventListener('touchend', this._eventHandlers.mouseup); + c.addEventListener('touchend', this._eventHandlers.mouseup); + c.addEventListener('touchmove', this._eventHandlers.mousemove); + } + c.addEventListener('mousedown', this._eventHandlers.mousedown); + window.addEventListener('mouseup', this._eventHandlers.mouseup); + c.addEventListener('mouseup', this._eventHandlers.mouseup); + c.addEventListener('mousemove', this._eventHandlers.mousemove); + c.addEventListener('wheel', this._eventHandlers.mousewheel); + + /* Work around right and middle click browser behaviors */ + document.addEventListener('click', this._eventHandlers.mousedisable); + document.body.addEventListener('contextmenu', this._eventHandlers.mousedisable); + }, + + ungrab: function () { + var c = this._target; + + if (_util2.default.isTouchDevice) { + c.removeEventListener('touchstart', this._eventHandlers.mousedown); + window.removeEventListener('touchend', this._eventHandlers.mouseup); + c.removeEventListener('touchend', this._eventHandlers.mouseup); + c.removeEventListener('touchmove', this._eventHandlers.mousemove); + } + c.removeEventListener('mousedown', this._eventHandlers.mousedown); + window.removeEventListener('mouseup', this._eventHandlers.mouseup); + c.removeEventListener('mouseup', this._eventHandlers.mouseup); + c.removeEventListener('mousemove', this._eventHandlers.mousemove); + c.removeEventListener('wheel', this._eventHandlers.mousewheel); + + /* Work around right and middle click browser behaviors */ + document.removeEventListener('click', this._eventHandlers.mousedisable); + document.body.removeEventListener('contextmenu', this._eventHandlers.mousedisable); } + }; - (0, _events.stopEvent)(e); - }, + _util2.default.make_properties(Mouse, [['target', 'ro', 'dom'], // DOM element that captures mouse input + ['notify', 'ro', 'func'], // Function to call to notify whenever a mouse event is received + ['focused', 'rw', 'bool'], // Capture and send mouse clicks/movement + ['scale', 'rw', 'float'], // Viewport scale factor 0.0 - 1.0 - _handleMouseMove: function (e) { - if (!this._focused) { - return; - } + ['onMouseButton', 'rw', 'func'], // Handler for mouse button click/release + ['onMouseMove', 'rw', 'func'], // Handler for mouse movement + ['touchButton', 'rw', 'int'] // Button mask (1, 2, 4) for touch devices (0 means ignore clicks) + ]); +})(); - if (this._notify) { - this._notify(e); - } - - var pos = this._getMousePosition(e); - if (this._onMouseMove) { - this._onMouseMove(pos.x, pos.y); - } - (0, _events.stopEvent)(e); - }, - - _handleMouseDisable: function (e) { - if (!this._focused) { - return; - } - - /* - * Stop propagation if inside canvas area - * Note: This is only needed for the 'click' event as it fails - * to fire properly for the target element so we have - * to listen on the document element instead. - */ - if (e.target == this._target) { - (0, _events.stopEvent)(e); - } - }, - - // Return coordinates relative to target - _getMousePosition: function (e) { - e = (0, _events.getPointerEvent)(e); - var bounds = this._target.getBoundingClientRect(); - var x, y; - // Clip to target bounds - if (e.clientX < bounds.left) { - x = 0; - } else if (e.clientX >= bounds.right) { - x = bounds.width - 1; - } else { - x = e.clientX - bounds.left; - } - if (e.clientY < bounds.top) { - y = 0; - } else if (e.clientY >= bounds.bottom) { - y = bounds.height - 1; - } else { - y = e.clientY - bounds.top; - } - return { x: x, y: y }; - }, - - // Public methods - grab: function () { - var c = this._target; - - if (_browsers.isTouchDevice) { - c.addEventListener('touchstart', this._eventHandlers.mousedown); - window.addEventListener('touchend', this._eventHandlers.mouseup); - c.addEventListener('touchend', this._eventHandlers.mouseup); - c.addEventListener('touchmove', this._eventHandlers.mousemove); - } - c.addEventListener('mousedown', this._eventHandlers.mousedown); - window.addEventListener('mouseup', this._eventHandlers.mouseup); - c.addEventListener('mouseup', this._eventHandlers.mouseup); - c.addEventListener('mousemove', this._eventHandlers.mousemove); - c.addEventListener('wheel', this._eventHandlers.mousewheel); - - /* Prevent middle-click pasting (see above for why we bind to document) */ - document.addEventListener('click', this._eventHandlers.mousedisable); - - /* preventDefault() on mousedown doesn't stop this event for some - reason so we have to explicitly block it */ - c.addEventListener('contextmenu', this._eventHandlers.mousedisable); - }, - - ungrab: function () { - var c = this._target; - - if (_browsers.isTouchDevice) { - c.removeEventListener('touchstart', this._eventHandlers.mousedown); - window.removeEventListener('touchend', this._eventHandlers.mouseup); - c.removeEventListener('touchend', this._eventHandlers.mouseup); - c.removeEventListener('touchmove', this._eventHandlers.mousemove); - } - c.removeEventListener('mousedown', this._eventHandlers.mousedown); - window.removeEventListener('mouseup', this._eventHandlers.mouseup); - c.removeEventListener('mouseup', this._eventHandlers.mouseup); - c.removeEventListener('mousemove', this._eventHandlers.mousemove); - c.removeEventListener('wheel', this._eventHandlers.mousewheel); - - document.removeEventListener('click', this._eventHandlers.mousedisable); - - c.removeEventListener('contextmenu', this._eventHandlers.mousedisable); - } -}; - -(0, _properties.make_properties)(Mouse, [['target', 'ro', 'dom'], // DOM element that captures mouse input -['notify', 'ro', 'func'], // Function to call to notify whenever a mouse event is received -['focused', 'rw', 'bool'], // Capture and send mouse clicks/movement - -['onMouseButton', 'rw', 'func'], // Handler for mouse button click/release -['onMouseMove', 'rw', 'func'], // Handler for mouse movement -['touchButton', 'rw', 'int'] // Button mask (1, 2, 4) for touch devices (0 means ignore clicks) -]); - -exports.Keyboard = Keyboard; -exports.Mouse = Mouse; -},{"../util/browsers.js":11,"../util/events.js":12,"../util/logging.js":14,"../util/properties.js":15,"./util.js":8}],6:[function(require,module,exports){ +},{"../util":11,"./util":8}],6:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = { +var KeyTable = { XK_VoidSymbol: 0xffffff, /* Void symbol */ XK_BackSpace: 0xff08, /* Back space, back char */ @@ -2130,6 +2216,10 @@ exports.default = { XK_yacute: 0x00fd, /* U+00FD LATIN SMALL LETTER Y WITH ACUTE */ XK_thorn: 0x00fe, /* U+00FE LATIN SMALL LETTER THORN */ XK_ydiaeresis: 0x00ff }; + +exports.default = KeyTable; +module.exports = exports["default"]; + },{}],7:[function(require,module,exports){ "use strict"; @@ -2141,359 +2231,368 @@ Object.defineProperty(exports, "__esModule", { // How this file was generated: // node /Users/jalf/dev/mi/novnc/utils/parse.js /opt/X11/include/X11/keysymdef.h -var keynames = null; -var codepoints = { "32": 32, "33": 33, "34": 34, "35": 35, "36": 36, "37": 37, "38": 38, "39": 39, "40": 40, "41": 41, "42": 42, "43": 43, "44": 44, "45": 45, "46": 46, "47": 47, "48": 48, "49": 49, "50": 50, "51": 51, "52": 52, "53": 53, "54": 54, "55": 55, "56": 56, "57": 57, "58": 58, "59": 59, "60": 60, "61": 61, "62": 62, "63": 63, "64": 64, "65": 65, "66": 66, "67": 67, "68": 68, "69": 69, "70": 70, "71": 71, "72": 72, "73": 73, "74": 74, "75": 75, "76": 76, "77": 77, "78": 78, "79": 79, "80": 80, "81": 81, "82": 82, "83": 83, "84": 84, "85": 85, "86": 86, "87": 87, "88": 88, "89": 89, "90": 90, "91": 91, "92": 92, "93": 93, "94": 94, "95": 95, "96": 96, "97": 97, "98": 98, "99": 99, "100": 100, "101": 101, "102": 102, "103": 103, "104": 104, "105": 105, "106": 106, "107": 107, "108": 108, "109": 109, "110": 110, "111": 111, "112": 112, "113": 113, "114": 114, "115": 115, "116": 116, "117": 117, "118": 118, "119": 119, "120": 120, "121": 121, "122": 122, "123": 123, "124": 124, "125": 125, "126": 126, "160": 160, "161": 161, "162": 162, "163": 163, "164": 164, "165": 165, "166": 166, "167": 167, "168": 168, "169": 169, "170": 170, "171": 171, "172": 172, "173": 173, "174": 174, "175": 175, "176": 176, "177": 177, "178": 178, "179": 179, "180": 180, "181": 181, "182": 182, "183": 183, "184": 184, "185": 185, "186": 186, "187": 187, "188": 188, "189": 189, "190": 190, "191": 191, "192": 192, "193": 193, "194": 194, "195": 195, "196": 196, "197": 197, "198": 198, "199": 199, "200": 200, "201": 201, "202": 202, "203": 203, "204": 204, "205": 205, "206": 206, "207": 207, "208": 208, "209": 209, "210": 210, "211": 211, "212": 212, "213": 213, "214": 214, "215": 215, "216": 216, "217": 217, "218": 218, "219": 219, "220": 220, "221": 221, "222": 222, "223": 223, "224": 224, "225": 225, "226": 226, "227": 227, "228": 228, "229": 229, "230": 230, "231": 231, "232": 232, "233": 233, "234": 234, "235": 235, "236": 236, "237": 237, "238": 238, "239": 239, "240": 240, "241": 241, "242": 242, "243": 243, "244": 244, "245": 245, "246": 246, "247": 247, "248": 248, "249": 249, "250": 250, "251": 251, "252": 252, "253": 253, "254": 254, "255": 255, "256": 960, "257": 992, "258": 451, "259": 483, "260": 417, "261": 433, "262": 454, "263": 486, "264": 710, "265": 742, "266": 709, "267": 741, "268": 456, "269": 488, "270": 463, "271": 495, "272": 464, "273": 496, "274": 938, "275": 954, "278": 972, "279": 1004, "280": 458, "281": 490, "282": 460, "283": 492, "284": 728, "285": 760, "286": 683, "287": 699, "288": 725, "289": 757, "290": 939, "291": 955, "292": 678, "293": 694, "294": 673, "295": 689, "296": 933, "297": 949, "298": 975, "299": 1007, "300": 16777516, "301": 16777517, "302": 967, "303": 999, "304": 681, "305": 697, "308": 684, "309": 700, "310": 979, "311": 1011, "312": 930, "313": 453, "314": 485, "315": 934, "316": 950, "317": 421, "318": 437, "321": 419, "322": 435, "323": 465, "324": 497, "325": 977, "326": 1009, "327": 466, "328": 498, "330": 957, "331": 959, "332": 978, "333": 1010, "336": 469, "337": 501, "338": 5052, "339": 5053, "340": 448, "341": 480, "342": 931, "343": 947, "344": 472, "345": 504, "346": 422, "347": 438, "348": 734, "349": 766, "350": 426, "351": 442, "352": 425, "353": 441, "354": 478, "355": 510, "356": 427, "357": 443, "358": 940, "359": 956, "360": 989, "361": 1021, "362": 990, "363": 1022, "364": 733, "365": 765, "366": 473, "367": 505, "368": 475, "369": 507, "370": 985, "371": 1017, "372": 16777588, "373": 16777589, "374": 16777590, "375": 16777591, "376": 5054, "377": 428, "378": 444, "379": 431, "380": 447, "381": 430, "382": 446, "399": 16777615, "402": 2294, "415": 16777631, "416": 16777632, "417": 16777633, "431": 16777647, "432": 16777648, "437": 16777653, "438": 16777654, "439": 16777655, "466": 16777681, "486": 16777702, "487": 16777703, "601": 16777817, "629": 16777845, "658": 16777874, "711": 439, "728": 418, "729": 511, "731": 434, "733": 445, "901": 1966, "902": 1953, "904": 1954, "905": 1955, "906": 1956, "908": 1959, "910": 1960, "911": 1963, "912": 1974, "913": 1985, "914": 1986, "915": 1987, "916": 1988, "917": 1989, "918": 1990, "919": 1991, "920": 1992, "921": 1993, "922": 1994, "923": 1995, "924": 1996, "925": 1997, "926": 1998, "927": 1999, "928": 2000, "929": 2001, "931": 2002, "932": 2004, "933": 2005, "934": 2006, "935": 2007, "936": 2008, "937": 2009, "938": 1957, "939": 1961, "940": 1969, "941": 1970, "942": 1971, "943": 1972, "944": 1978, "945": 2017, "946": 2018, "947": 2019, "948": 2020, "949": 2021, "950": 2022, "951": 2023, "952": 2024, "953": 2025, "954": 2026, "955": 2027, "956": 2028, "957": 2029, "958": 2030, "959": 2031, "960": 2032, "961": 2033, "962": 2035, "963": 2034, "964": 2036, "965": 2037, "966": 2038, "967": 2039, "968": 2040, "969": 2041, "970": 1973, "971": 1977, "972": 1975, "973": 1976, "974": 1979, "1025": 1715, "1026": 1713, "1027": 1714, "1028": 1716, "1029": 1717, "1030": 1718, "1031": 1719, "1032": 1720, "1033": 1721, "1034": 1722, "1035": 1723, "1036": 1724, "1038": 1726, "1039": 1727, "1040": 1761, "1041": 1762, "1042": 1783, "1043": 1767, "1044": 1764, "1045": 1765, "1046": 1782, "1047": 1786, "1048": 1769, "1049": 1770, "1050": 1771, "1051": 1772, "1052": 1773, "1053": 1774, "1054": 1775, "1055": 1776, "1056": 1778, "1057": 1779, "1058": 1780, "1059": 1781, "1060": 1766, "1061": 1768, "1062": 1763, "1063": 1790, "1064": 1787, "1065": 1789, "1066": 1791, "1067": 1785, "1068": 1784, "1069": 1788, "1070": 1760, "1071": 1777, "1072": 1729, "1073": 1730, "1074": 1751, "1075": 1735, "1076": 1732, "1077": 1733, "1078": 1750, "1079": 1754, "1080": 1737, "1081": 1738, "1082": 1739, "1083": 1740, "1084": 1741, "1085": 1742, "1086": 1743, "1087": 1744, "1088": 1746, "1089": 1747, "1090": 1748, "1091": 1749, "1092": 1734, "1093": 1736, "1094": 1731, "1095": 1758, "1096": 1755, "1097": 1757, "1098": 1759, "1099": 1753, "1100": 1752, "1101": 1756, "1102": 1728, "1103": 1745, "1105": 1699, "1106": 1697, "1107": 1698, "1108": 1700, "1109": 1701, "1110": 1702, "1111": 1703, "1112": 1704, "1113": 1705, "1114": 1706, "1115": 1707, "1116": 1708, "1118": 1710, "1119": 1711, "1168": 1725, "1169": 1709, "1170": 16778386, "1171": 16778387, "1174": 16778390, "1175": 16778391, "1178": 16778394, "1179": 16778395, "1180": 16778396, "1181": 16778397, "1186": 16778402, "1187": 16778403, "1198": 16778414, "1199": 16778415, "1200": 16778416, "1201": 16778417, "1202": 16778418, "1203": 16778419, "1206": 16778422, "1207": 16778423, "1208": 16778424, "1209": 16778425, "1210": 16778426, "1211": 16778427, "1240": 16778456, "1241": 16778457, "1250": 16778466, "1251": 16778467, "1256": 16778472, "1257": 16778473, "1262": 16778478, "1263": 16778479, "1329": 16778545, "1330": 16778546, "1331": 16778547, "1332": 16778548, "1333": 16778549, "1334": 16778550, "1335": 16778551, "1336": 16778552, "1337": 16778553, "1338": 16778554, "1339": 16778555, "1340": 16778556, "1341": 16778557, "1342": 16778558, "1343": 16778559, "1344": 16778560, "1345": 16778561, "1346": 16778562, "1347": 16778563, "1348": 16778564, "1349": 16778565, "1350": 16778566, "1351": 16778567, "1352": 16778568, "1353": 16778569, "1354": 16778570, "1355": 16778571, "1356": 16778572, "1357": 16778573, "1358": 16778574, "1359": 16778575, "1360": 16778576, "1361": 16778577, "1362": 16778578, "1363": 16778579, "1364": 16778580, "1365": 16778581, "1366": 16778582, "1370": 16778586, "1371": 16778587, "1372": 16778588, "1373": 16778589, "1374": 16778590, "1377": 16778593, "1378": 16778594, "1379": 16778595, "1380": 16778596, "1381": 16778597, "1382": 16778598, "1383": 16778599, "1384": 16778600, "1385": 16778601, "1386": 16778602, "1387": 16778603, "1388": 16778604, "1389": 16778605, "1390": 16778606, "1391": 16778607, "1392": 16778608, "1393": 16778609, "1394": 16778610, "1395": 16778611, "1396": 16778612, "1397": 16778613, "1398": 16778614, "1399": 16778615, "1400": 16778616, "1401": 16778617, "1402": 16778618, "1403": 16778619, "1404": 16778620, "1405": 16778621, "1406": 16778622, "1407": 16778623, "1408": 16778624, "1409": 16778625, "1410": 16778626, "1411": 16778627, "1412": 16778628, "1413": 16778629, "1414": 16778630, "1415": 16778631, "1417": 16778633, "1418": 16778634, "1488": 3296, "1489": 3297, "1490": 3298, "1491": 3299, "1492": 3300, "1493": 3301, "1494": 3302, "1495": 3303, "1496": 3304, "1497": 3305, "1498": 3306, "1499": 3307, "1500": 3308, "1501": 3309, "1502": 3310, "1503": 3311, "1504": 3312, "1505": 3313, "1506": 3314, "1507": 3315, "1508": 3316, "1509": 3317, "1510": 3318, "1511": 3319, "1512": 3320, "1513": 3321, "1514": 3322, "1548": 1452, "1563": 1467, "1567": 1471, "1569": 1473, "1570": 1474, "1571": 1475, "1572": 1476, "1573": 1477, "1574": 1478, "1575": 1479, "1576": 1480, "1577": 1481, "1578": 1482, "1579": 1483, "1580": 1484, "1581": 1485, "1582": 1486, "1583": 1487, "1584": 1488, "1585": 1489, "1586": 1490, "1587": 1491, "1588": 1492, "1589": 1493, "1590": 1494, "1591": 1495, "1592": 1496, "1593": 1497, "1594": 1498, "1600": 1504, "1601": 1505, "1602": 1506, "1603": 1507, "1604": 1508, "1605": 1509, "1606": 1510, "1607": 1511, "1608": 1512, "1609": 1513, "1610": 1514, "1611": 1515, "1612": 1516, "1613": 1517, "1614": 1518, "1615": 1519, "1616": 1520, "1617": 1521, "1618": 1522, "1619": 16778835, "1620": 16778836, "1621": 16778837, "1632": 16778848, "1633": 16778849, "1634": 16778850, "1635": 16778851, "1636": 16778852, "1637": 16778853, "1638": 16778854, "1639": 16778855, "1640": 16778856, "1641": 16778857, "1642": 16778858, "1648": 16778864, "1657": 16778873, "1662": 16778878, "1670": 16778886, "1672": 16778888, "1681": 16778897, "1688": 16778904, "1700": 16778916, "1705": 16778921, "1711": 16778927, "1722": 16778938, "1726": 16778942, "1729": 16778945, "1740": 16778956, "1746": 16778962, "1748": 16778964, "1776": 16778992, "1777": 16778993, "1778": 16778994, "1779": 16778995, "1780": 16778996, "1781": 16778997, "1782": 16778998, "1783": 16778999, "1784": 16779000, "1785": 16779001, "3458": 16780674, "3459": 16780675, "3461": 16780677, "3462": 16780678, "3463": 16780679, "3464": 16780680, "3465": 16780681, "3466": 16780682, "3467": 16780683, "3468": 16780684, "3469": 16780685, "3470": 16780686, "3471": 16780687, "3472": 16780688, "3473": 16780689, "3474": 16780690, "3475": 16780691, "3476": 16780692, "3477": 16780693, "3478": 16780694, "3482": 16780698, "3483": 16780699, "3484": 16780700, "3485": 16780701, "3486": 16780702, "3487": 16780703, "3488": 16780704, "3489": 16780705, "3490": 16780706, "3491": 16780707, "3492": 16780708, "3493": 16780709, "3494": 16780710, "3495": 16780711, "3496": 16780712, "3497": 16780713, "3498": 16780714, "3499": 16780715, "3500": 16780716, "3501": 16780717, "3502": 16780718, "3503": 16780719, "3504": 16780720, "3505": 16780721, "3507": 16780723, "3508": 16780724, "3509": 16780725, "3510": 16780726, "3511": 16780727, "3512": 16780728, "3513": 16780729, "3514": 16780730, "3515": 16780731, "3517": 16780733, "3520": 16780736, "3521": 16780737, "3522": 16780738, "3523": 16780739, "3524": 16780740, "3525": 16780741, "3526": 16780742, "3530": 16780746, "3535": 16780751, "3536": 16780752, "3537": 16780753, "3538": 16780754, "3539": 16780755, "3540": 16780756, "3542": 16780758, "3544": 16780760, "3545": 16780761, "3546": 16780762, "3547": 16780763, "3548": 16780764, "3549": 16780765, "3550": 16780766, "3551": 16780767, "3570": 16780786, "3571": 16780787, "3572": 16780788, "3585": 3489, "3586": 3490, "3587": 3491, "3588": 3492, "3589": 3493, "3590": 3494, "3591": 3495, "3592": 3496, "3593": 3497, "3594": 3498, "3595": 3499, "3596": 3500, "3597": 3501, "3598": 3502, "3599": 3503, "3600": 3504, "3601": 3505, "3602": 3506, "3603": 3507, "3604": 3508, "3605": 3509, "3606": 3510, "3607": 3511, "3608": 3512, "3609": 3513, "3610": 3514, "3611": 3515, "3612": 3516, "3613": 3517, "3614": 3518, "3615": 3519, "3616": 3520, "3617": 3521, "3618": 3522, "3619": 3523, "3620": 3524, "3621": 3525, "3622": 3526, "3623": 3527, "3624": 3528, "3625": 3529, "3626": 3530, "3627": 3531, "3628": 3532, "3629": 3533, "3630": 3534, "3631": 3535, "3632": 3536, "3633": 3537, "3634": 3538, "3635": 3539, "3636": 3540, "3637": 3541, "3638": 3542, "3639": 3543, "3640": 3544, "3641": 3545, "3642": 3546, "3647": 3551, "3648": 3552, "3649": 3553, "3650": 3554, "3651": 3555, "3652": 3556, "3653": 3557, "3654": 3558, "3655": 3559, "3656": 3560, "3657": 3561, "3658": 3562, "3659": 3563, "3660": 3564, "3661": 3565, "3664": 3568, "3665": 3569, "3666": 3570, "3667": 3571, "3668": 3572, "3669": 3573, "3670": 3574, "3671": 3575, "3672": 3576, "3673": 3577, "4304": 16781520, "4305": 16781521, "4306": 16781522, "4307": 16781523, "4308": 16781524, "4309": 16781525, "4310": 16781526, "4311": 16781527, "4312": 16781528, "4313": 16781529, "4314": 16781530, "4315": 16781531, "4316": 16781532, "4317": 16781533, "4318": 16781534, "4319": 16781535, "4320": 16781536, "4321": 16781537, "4322": 16781538, "4323": 16781539, "4324": 16781540, "4325": 16781541, "4326": 16781542, "4327": 16781543, "4328": 16781544, "4329": 16781545, "4330": 16781546, "4331": 16781547, "4332": 16781548, "4333": 16781549, "4334": 16781550, "4335": 16781551, "4336": 16781552, "4337": 16781553, "4338": 16781554, "4339": 16781555, "4340": 16781556, "4341": 16781557, "4342": 16781558, "7682": 16784898, "7683": 16784899, "7690": 16784906, "7691": 16784907, "7710": 16784926, "7711": 16784927, "7734": 16784950, "7735": 16784951, "7744": 16784960, "7745": 16784961, "7766": 16784982, "7767": 16784983, "7776": 16784992, "7777": 16784993, "7786": 16785002, "7787": 16785003, "7808": 16785024, "7809": 16785025, "7810": 16785026, "7811": 16785027, "7812": 16785028, "7813": 16785029, "7818": 16785034, "7819": 16785035, "7840": 16785056, "7841": 16785057, "7842": 16785058, "7843": 16785059, "7844": 16785060, "7845": 16785061, "7846": 16785062, "7847": 16785063, "7848": 16785064, "7849": 16785065, "7850": 16785066, "7851": 16785067, "7852": 16785068, "7853": 16785069, "7854": 16785070, "7855": 16785071, "7856": 16785072, "7857": 16785073, "7858": 16785074, "7859": 16785075, "7860": 16785076, "7861": 16785077, "7862": 16785078, "7863": 16785079, "7864": 16785080, "7865": 16785081, "7866": 16785082, "7867": 16785083, "7868": 16785084, "7869": 16785085, "7870": 16785086, "7871": 16785087, "7872": 16785088, "7873": 16785089, "7874": 16785090, "7875": 16785091, "7876": 16785092, "7877": 16785093, "7878": 16785094, "7879": 16785095, "7880": 16785096, "7881": 16785097, "7882": 16785098, "7883": 16785099, "7884": 16785100, "7885": 16785101, "7886": 16785102, "7887": 16785103, "7888": 16785104, "7889": 16785105, "7890": 16785106, "7891": 16785107, "7892": 16785108, "7893": 16785109, "7894": 16785110, "7895": 16785111, "7896": 16785112, "7897": 16785113, "7898": 16785114, "7899": 16785115, "7900": 16785116, "7901": 16785117, "7902": 16785118, "7903": 16785119, "7904": 16785120, "7905": 16785121, "7906": 16785122, "7907": 16785123, "7908": 16785124, "7909": 16785125, "7910": 16785126, "7911": 16785127, "7912": 16785128, "7913": 16785129, "7914": 16785130, "7915": 16785131, "7916": 16785132, "7917": 16785133, "7918": 16785134, "7919": 16785135, "7920": 16785136, "7921": 16785137, "7922": 16785138, "7923": 16785139, "7924": 16785140, "7925": 16785141, "7926": 16785142, "7927": 16785143, "7928": 16785144, "7929": 16785145, "8194": 2722, "8195": 2721, "8196": 2723, "8197": 2724, "8199": 2725, "8200": 2726, "8201": 2727, "8202": 2728, "8210": 2747, "8211": 2730, "8212": 2729, "8213": 1967, "8215": 3295, "8216": 2768, "8217": 2769, "8218": 2813, "8220": 2770, "8221": 2771, "8222": 2814, "8224": 2801, "8225": 2802, "8226": 2790, "8229": 2735, "8230": 2734, "8240": 2773, "8242": 2774, "8243": 2775, "8248": 2812, "8254": 1150, "8304": 16785520, "8308": 16785524, "8309": 16785525, "8310": 16785526, "8311": 16785527, "8312": 16785528, "8313": 16785529, "8320": 16785536, "8321": 16785537, "8322": 16785538, "8323": 16785539, "8324": 16785540, "8325": 16785541, "8326": 16785542, "8327": 16785543, "8328": 16785544, "8329": 16785545, "8352": 16785568, "8353": 16785569, "8354": 16785570, "8355": 16785571, "8356": 16785572, "8357": 16785573, "8358": 16785574, "8359": 16785575, "8360": 16785576, "8361": 3839, "8362": 16785578, "8363": 16785579, "8364": 8364, "8453": 2744, "8470": 1712, "8471": 2811, "8478": 2772, "8482": 2761, "8531": 2736, "8532": 2737, "8533": 2738, "8534": 2739, "8535": 2740, "8536": 2741, "8537": 2742, "8538": 2743, "8539": 2755, "8540": 2756, "8541": 2757, "8542": 2758, "8592": 2299, "8593": 2300, "8594": 2301, "8595": 2302, "8658": 2254, "8660": 2253, "8706": 2287, "8709": 16785925, "8711": 2245, "8712": 16785928, "8713": 16785929, "8715": 16785931, "8728": 3018, "8730": 2262, "8731": 16785947, "8732": 16785948, "8733": 2241, "8734": 2242, "8743": 2270, "8744": 2271, "8745": 2268, "8746": 2269, "8747": 2239, "8748": 16785964, "8749": 16785965, "8756": 2240, "8757": 16785973, "8764": 2248, "8771": 2249, "8773": 16785992, "8775": 16785991, "8800": 2237, "8801": 2255, "8802": 16786018, "8803": 16786019, "8804": 2236, "8805": 2238, "8834": 2266, "8835": 2267, "8866": 3068, "8867": 3036, "8868": 3010, "8869": 3022, "8968": 3027, "8970": 3012, "8981": 2810, "8992": 2212, "8993": 2213, "9109": 3020, "9115": 2219, "9117": 2220, "9118": 2221, "9120": 2222, "9121": 2215, "9123": 2216, "9124": 2217, "9126": 2218, "9128": 2223, "9132": 2224, "9143": 2209, "9146": 2543, "9147": 2544, "9148": 2546, "9149": 2547, "9225": 2530, "9226": 2533, "9227": 2537, "9228": 2531, "9229": 2532, "9251": 2732, "9252": 2536, "9472": 2211, "9474": 2214, "9484": 2210, "9488": 2539, "9492": 2541, "9496": 2538, "9500": 2548, "9508": 2549, "9516": 2551, "9524": 2550, "9532": 2542, "9618": 2529, "9642": 2791, "9643": 2785, "9644": 2779, "9645": 2786, "9646": 2783, "9647": 2767, "9650": 2792, "9651": 2787, "9654": 2781, "9655": 2765, "9660": 2793, "9661": 2788, "9664": 2780, "9665": 2764, "9670": 2528, "9675": 2766, "9679": 2782, "9702": 2784, "9734": 2789, "9742": 2809, "9747": 2762, "9756": 2794, "9758": 2795, "9792": 2808, "9794": 2807, "9827": 2796, "9829": 2798, "9830": 2797, "9837": 2806, "9839": 2805, "10003": 2803, "10007": 2804, "10013": 2777, "10016": 2800, "10216": 2748, "10217": 2750, "10240": 16787456, "10241": 16787457, "10242": 16787458, "10243": 16787459, "10244": 16787460, "10245": 16787461, "10246": 16787462, "10247": 16787463, "10248": 16787464, "10249": 16787465, "10250": 16787466, "10251": 16787467, "10252": 16787468, "10253": 16787469, "10254": 16787470, "10255": 16787471, "10256": 16787472, "10257": 16787473, "10258": 16787474, "10259": 16787475, "10260": 16787476, "10261": 16787477, "10262": 16787478, "10263": 16787479, "10264": 16787480, "10265": 16787481, "10266": 16787482, "10267": 16787483, "10268": 16787484, "10269": 16787485, "10270": 16787486, "10271": 16787487, "10272": 16787488, "10273": 16787489, "10274": 16787490, "10275": 16787491, "10276": 16787492, "10277": 16787493, "10278": 16787494, "10279": 16787495, "10280": 16787496, "10281": 16787497, "10282": 16787498, "10283": 16787499, "10284": 16787500, "10285": 16787501, "10286": 16787502, "10287": 16787503, "10288": 16787504, "10289": 16787505, "10290": 16787506, "10291": 16787507, "10292": 16787508, "10293": 16787509, "10294": 16787510, "10295": 16787511, "10296": 16787512, "10297": 16787513, "10298": 16787514, "10299": 16787515, "10300": 16787516, "10301": 16787517, "10302": 16787518, "10303": 16787519, "10304": 16787520, "10305": 16787521, "10306": 16787522, "10307": 16787523, "10308": 16787524, "10309": 16787525, "10310": 16787526, "10311": 16787527, "10312": 16787528, "10313": 16787529, "10314": 16787530, "10315": 16787531, "10316": 16787532, "10317": 16787533, "10318": 16787534, "10319": 16787535, "10320": 16787536, "10321": 16787537, "10322": 16787538, "10323": 16787539, "10324": 16787540, "10325": 16787541, "10326": 16787542, "10327": 16787543, "10328": 16787544, "10329": 16787545, "10330": 16787546, "10331": 16787547, "10332": 16787548, "10333": 16787549, "10334": 16787550, "10335": 16787551, "10336": 16787552, "10337": 16787553, "10338": 16787554, "10339": 16787555, "10340": 16787556, "10341": 16787557, "10342": 16787558, "10343": 16787559, "10344": 16787560, "10345": 16787561, "10346": 16787562, "10347": 16787563, "10348": 16787564, "10349": 16787565, "10350": 16787566, "10351": 16787567, "10352": 16787568, "10353": 16787569, "10354": 16787570, "10355": 16787571, "10356": 16787572, "10357": 16787573, "10358": 16787574, "10359": 16787575, "10360": 16787576, "10361": 16787577, "10362": 16787578, "10363": 16787579, "10364": 16787580, "10365": 16787581, "10366": 16787582, "10367": 16787583, "10368": 16787584, "10369": 16787585, "10370": 16787586, "10371": 16787587, "10372": 16787588, "10373": 16787589, "10374": 16787590, "10375": 16787591, "10376": 16787592, "10377": 16787593, "10378": 16787594, "10379": 16787595, "10380": 16787596, "10381": 16787597, "10382": 16787598, "10383": 16787599, "10384": 16787600, "10385": 16787601, "10386": 16787602, "10387": 16787603, "10388": 16787604, "10389": 16787605, "10390": 16787606, "10391": 16787607, "10392": 16787608, "10393": 16787609, "10394": 16787610, "10395": 16787611, "10396": 16787612, "10397": 16787613, "10398": 16787614, "10399": 16787615, "10400": 16787616, "10401": 16787617, "10402": 16787618, "10403": 16787619, "10404": 16787620, "10405": 16787621, "10406": 16787622, "10407": 16787623, "10408": 16787624, "10409": 16787625, "10410": 16787626, "10411": 16787627, "10412": 16787628, "10413": 16787629, "10414": 16787630, "10415": 16787631, "10416": 16787632, "10417": 16787633, "10418": 16787634, "10419": 16787635, "10420": 16787636, "10421": 16787637, "10422": 16787638, "10423": 16787639, "10424": 16787640, "10425": 16787641, "10426": 16787642, "10427": 16787643, "10428": 16787644, "10429": 16787645, "10430": 16787646, "10431": 16787647, "10432": 16787648, "10433": 16787649, "10434": 16787650, "10435": 16787651, "10436": 16787652, "10437": 16787653, "10438": 16787654, "10439": 16787655, "10440": 16787656, "10441": 16787657, "10442": 16787658, "10443": 16787659, "10444": 16787660, "10445": 16787661, "10446": 16787662, "10447": 16787663, "10448": 16787664, "10449": 16787665, "10450": 16787666, "10451": 16787667, "10452": 16787668, "10453": 16787669, "10454": 16787670, "10455": 16787671, "10456": 16787672, "10457": 16787673, "10458": 16787674, "10459": 16787675, "10460": 16787676, "10461": 16787677, "10462": 16787678, "10463": 16787679, "10464": 16787680, "10465": 16787681, "10466": 16787682, "10467": 16787683, "10468": 16787684, "10469": 16787685, "10470": 16787686, "10471": 16787687, "10472": 16787688, "10473": 16787689, "10474": 16787690, "10475": 16787691, "10476": 16787692, "10477": 16787693, "10478": 16787694, "10479": 16787695, "10480": 16787696, "10481": 16787697, "10482": 16787698, "10483": 16787699, "10484": 16787700, "10485": 16787701, "10486": 16787702, "10487": 16787703, "10488": 16787704, "10489": 16787705, "10490": 16787706, "10491": 16787707, "10492": 16787708, "10493": 16787709, "10494": 16787710, "10495": 16787711, "12289": 1188, "12290": 1185, "12300": 1186, "12301": 1187, "12443": 1246, "12444": 1247, "12449": 1191, "12450": 1201, "12451": 1192, "12452": 1202, "12453": 1193, "12454": 1203, "12455": 1194, "12456": 1204, "12457": 1195, "12458": 1205, "12459": 1206, "12461": 1207, "12463": 1208, "12465": 1209, "12467": 1210, "12469": 1211, "12471": 1212, "12473": 1213, "12475": 1214, "12477": 1215, "12479": 1216, "12481": 1217, "12483": 1199, "12484": 1218, "12486": 1219, "12488": 1220, "12490": 1221, "12491": 1222, "12492": 1223, "12493": 1224, "12494": 1225, "12495": 1226, "12498": 1227, "12501": 1228, "12504": 1229, "12507": 1230, "12510": 1231, "12511": 1232, "12512": 1233, "12513": 1234, "12514": 1235, "12515": 1196, "12516": 1236, "12517": 1197, "12518": 1237, "12519": 1198, "12520": 1238, "12521": 1239, "12522": 1240, "12523": 1241, "12524": 1242, "12525": 1243, "12527": 1244, "12530": 1190, "12531": 1245, "12539": 1189, "12540": 1200 }; +var keysyms = function () { + "use strict"; + + var keynames = null; + var codepoints = { "32": 32, "33": 33, "34": 34, "35": 35, "36": 36, "37": 37, "38": 38, "39": 39, "40": 40, "41": 41, "42": 42, "43": 43, "44": 44, "45": 45, "46": 46, "47": 47, "48": 48, "49": 49, "50": 50, "51": 51, "52": 52, "53": 53, "54": 54, "55": 55, "56": 56, "57": 57, "58": 58, "59": 59, "60": 60, "61": 61, "62": 62, "63": 63, "64": 64, "65": 65, "66": 66, "67": 67, "68": 68, "69": 69, "70": 70, "71": 71, "72": 72, "73": 73, "74": 74, "75": 75, "76": 76, "77": 77, "78": 78, "79": 79, "80": 80, "81": 81, "82": 82, "83": 83, "84": 84, "85": 85, "86": 86, "87": 87, "88": 88, "89": 89, "90": 90, "91": 91, "92": 92, "93": 93, "94": 94, "95": 95, "96": 96, "97": 97, "98": 98, "99": 99, "100": 100, "101": 101, "102": 102, "103": 103, "104": 104, "105": 105, "106": 106, "107": 107, "108": 108, "109": 109, "110": 110, "111": 111, "112": 112, "113": 113, "114": 114, "115": 115, "116": 116, "117": 117, "118": 118, "119": 119, "120": 120, "121": 121, "122": 122, "123": 123, "124": 124, "125": 125, "126": 126, "160": 160, "161": 161, "162": 162, "163": 163, "164": 164, "165": 165, "166": 166, "167": 167, "168": 168, "169": 169, "170": 170, "171": 171, "172": 172, "173": 173, "174": 174, "175": 175, "176": 176, "177": 177, "178": 178, "179": 179, "180": 180, "181": 181, "182": 182, "183": 183, "184": 184, "185": 185, "186": 186, "187": 187, "188": 188, "189": 189, "190": 190, "191": 191, "192": 192, "193": 193, "194": 194, "195": 195, "196": 196, "197": 197, "198": 198, "199": 199, "200": 200, "201": 201, "202": 202, "203": 203, "204": 204, "205": 205, "206": 206, "207": 207, "208": 208, "209": 209, "210": 210, "211": 211, "212": 212, "213": 213, "214": 214, "215": 215, "216": 216, "217": 217, "218": 218, "219": 219, "220": 220, "221": 221, "222": 222, "223": 223, "224": 224, "225": 225, "226": 226, "227": 227, "228": 228, "229": 229, "230": 230, "231": 231, "232": 232, "233": 233, "234": 234, "235": 235, "236": 236, "237": 237, "238": 238, "239": 239, "240": 240, "241": 241, "242": 242, "243": 243, "244": 244, "245": 245, "246": 246, "247": 247, "248": 248, "249": 249, "250": 250, "251": 251, "252": 252, "253": 253, "254": 254, "255": 255, "256": 960, "257": 992, "258": 451, "259": 483, "260": 417, "261": 433, "262": 454, "263": 486, "264": 710, "265": 742, "266": 709, "267": 741, "268": 456, "269": 488, "270": 463, "271": 495, "272": 464, "273": 496, "274": 938, "275": 954, "278": 972, "279": 1004, "280": 458, "281": 490, "282": 460, "283": 492, "284": 728, "285": 760, "286": 683, "287": 699, "288": 725, "289": 757, "290": 939, "291": 955, "292": 678, "293": 694, "294": 673, "295": 689, "296": 933, "297": 949, "298": 975, "299": 1007, "300": 16777516, "301": 16777517, "302": 967, "303": 999, "304": 681, "305": 697, "308": 684, "309": 700, "310": 979, "311": 1011, "312": 930, "313": 453, "314": 485, "315": 934, "316": 950, "317": 421, "318": 437, "321": 419, "322": 435, "323": 465, "324": 497, "325": 977, "326": 1009, "327": 466, "328": 498, "330": 957, "331": 959, "332": 978, "333": 1010, "336": 469, "337": 501, "338": 5052, "339": 5053, "340": 448, "341": 480, "342": 931, "343": 947, "344": 472, "345": 504, "346": 422, "347": 438, "348": 734, "349": 766, "350": 426, "351": 442, "352": 425, "353": 441, "354": 478, "355": 510, "356": 427, "357": 443, "358": 940, "359": 956, "360": 989, "361": 1021, "362": 990, "363": 1022, "364": 733, "365": 765, "366": 473, "367": 505, "368": 475, "369": 507, "370": 985, "371": 1017, "372": 16777588, "373": 16777589, "374": 16777590, "375": 16777591, "376": 5054, "377": 428, "378": 444, "379": 431, "380": 447, "381": 430, "382": 446, "399": 16777615, "402": 2294, "415": 16777631, "416": 16777632, "417": 16777633, "431": 16777647, "432": 16777648, "437": 16777653, "438": 16777654, "439": 16777655, "466": 16777681, "486": 16777702, "487": 16777703, "601": 16777817, "629": 16777845, "658": 16777874, "711": 439, "728": 418, "729": 511, "731": 434, "733": 445, "901": 1966, "902": 1953, "904": 1954, "905": 1955, "906": 1956, "908": 1959, "910": 1960, "911": 1963, "912": 1974, "913": 1985, "914": 1986, "915": 1987, "916": 1988, "917": 1989, "918": 1990, "919": 1991, "920": 1992, "921": 1993, "922": 1994, "923": 1995, "924": 1996, "925": 1997, "926": 1998, "927": 1999, "928": 2000, "929": 2001, "931": 2002, "932": 2004, "933": 2005, "934": 2006, "935": 2007, "936": 2008, "937": 2009, "938": 1957, "939": 1961, "940": 1969, "941": 1970, "942": 1971, "943": 1972, "944": 1978, "945": 2017, "946": 2018, "947": 2019, "948": 2020, "949": 2021, "950": 2022, "951": 2023, "952": 2024, "953": 2025, "954": 2026, "955": 2027, "956": 2028, "957": 2029, "958": 2030, "959": 2031, "960": 2032, "961": 2033, "962": 2035, "963": 2034, "964": 2036, "965": 2037, "966": 2038, "967": 2039, "968": 2040, "969": 2041, "970": 1973, "971": 1977, "972": 1975, "973": 1976, "974": 1979, "1025": 1715, "1026": 1713, "1027": 1714, "1028": 1716, "1029": 1717, "1030": 1718, "1031": 1719, "1032": 1720, "1033": 1721, "1034": 1722, "1035": 1723, "1036": 1724, "1038": 1726, "1039": 1727, "1040": 1761, "1041": 1762, "1042": 1783, "1043": 1767, "1044": 1764, "1045": 1765, "1046": 1782, "1047": 1786, "1048": 1769, "1049": 1770, "1050": 1771, "1051": 1772, "1052": 1773, "1053": 1774, "1054": 1775, "1055": 1776, "1056": 1778, "1057": 1779, "1058": 1780, "1059": 1781, "1060": 1766, "1061": 1768, "1062": 1763, "1063": 1790, "1064": 1787, "1065": 1789, "1066": 1791, "1067": 1785, "1068": 1784, "1069": 1788, "1070": 1760, "1071": 1777, "1072": 1729, "1073": 1730, "1074": 1751, "1075": 1735, "1076": 1732, "1077": 1733, "1078": 1750, "1079": 1754, "1080": 1737, "1081": 1738, "1082": 1739, "1083": 1740, "1084": 1741, "1085": 1742, "1086": 1743, "1087": 1744, "1088": 1746, "1089": 1747, "1090": 1748, "1091": 1749, "1092": 1734, "1093": 1736, "1094": 1731, "1095": 1758, "1096": 1755, "1097": 1757, "1098": 1759, "1099": 1753, "1100": 1752, "1101": 1756, "1102": 1728, "1103": 1745, "1105": 1699, "1106": 1697, "1107": 1698, "1108": 1700, "1109": 1701, "1110": 1702, "1111": 1703, "1112": 1704, "1113": 1705, "1114": 1706, "1115": 1707, "1116": 1708, "1118": 1710, "1119": 1711, "1168": 1725, "1169": 1709, "1170": 16778386, "1171": 16778387, "1174": 16778390, "1175": 16778391, "1178": 16778394, "1179": 16778395, "1180": 16778396, "1181": 16778397, "1186": 16778402, "1187": 16778403, "1198": 16778414, "1199": 16778415, "1200": 16778416, "1201": 16778417, "1202": 16778418, "1203": 16778419, "1206": 16778422, "1207": 16778423, "1208": 16778424, "1209": 16778425, "1210": 16778426, "1211": 16778427, "1240": 16778456, "1241": 16778457, "1250": 16778466, "1251": 16778467, "1256": 16778472, "1257": 16778473, "1262": 16778478, "1263": 16778479, "1329": 16778545, "1330": 16778546, "1331": 16778547, "1332": 16778548, "1333": 16778549, "1334": 16778550, "1335": 16778551, "1336": 16778552, "1337": 16778553, "1338": 16778554, "1339": 16778555, "1340": 16778556, "1341": 16778557, "1342": 16778558, "1343": 16778559, "1344": 16778560, "1345": 16778561, "1346": 16778562, "1347": 16778563, "1348": 16778564, "1349": 16778565, "1350": 16778566, "1351": 16778567, "1352": 16778568, "1353": 16778569, "1354": 16778570, "1355": 16778571, "1356": 16778572, "1357": 16778573, "1358": 16778574, "1359": 16778575, "1360": 16778576, "1361": 16778577, "1362": 16778578, "1363": 16778579, "1364": 16778580, "1365": 16778581, "1366": 16778582, "1370": 16778586, "1371": 16778587, "1372": 16778588, "1373": 16778589, "1374": 16778590, "1377": 16778593, "1378": 16778594, "1379": 16778595, "1380": 16778596, "1381": 16778597, "1382": 16778598, "1383": 16778599, "1384": 16778600, "1385": 16778601, "1386": 16778602, "1387": 16778603, "1388": 16778604, "1389": 16778605, "1390": 16778606, "1391": 16778607, "1392": 16778608, "1393": 16778609, "1394": 16778610, "1395": 16778611, "1396": 16778612, "1397": 16778613, "1398": 16778614, "1399": 16778615, "1400": 16778616, "1401": 16778617, "1402": 16778618, "1403": 16778619, "1404": 16778620, "1405": 16778621, "1406": 16778622, "1407": 16778623, "1408": 16778624, "1409": 16778625, "1410": 16778626, "1411": 16778627, "1412": 16778628, "1413": 16778629, "1414": 16778630, "1415": 16778631, "1417": 16778633, "1418": 16778634, "1488": 3296, "1489": 3297, "1490": 3298, "1491": 3299, "1492": 3300, "1493": 3301, "1494": 3302, "1495": 3303, "1496": 3304, "1497": 3305, "1498": 3306, "1499": 3307, "1500": 3308, "1501": 3309, "1502": 3310, "1503": 3311, "1504": 3312, "1505": 3313, "1506": 3314, "1507": 3315, "1508": 3316, "1509": 3317, "1510": 3318, "1511": 3319, "1512": 3320, "1513": 3321, "1514": 3322, "1548": 1452, "1563": 1467, "1567": 1471, "1569": 1473, "1570": 1474, "1571": 1475, "1572": 1476, "1573": 1477, "1574": 1478, "1575": 1479, "1576": 1480, "1577": 1481, "1578": 1482, "1579": 1483, "1580": 1484, "1581": 1485, "1582": 1486, "1583": 1487, "1584": 1488, "1585": 1489, "1586": 1490, "1587": 1491, "1588": 1492, "1589": 1493, "1590": 1494, "1591": 1495, "1592": 1496, "1593": 1497, "1594": 1498, "1600": 1504, "1601": 1505, "1602": 1506, "1603": 1507, "1604": 1508, "1605": 1509, "1606": 1510, "1607": 1511, "1608": 1512, "1609": 1513, "1610": 1514, "1611": 1515, "1612": 1516, "1613": 1517, "1614": 1518, "1615": 1519, "1616": 1520, "1617": 1521, "1618": 1522, "1619": 16778835, "1620": 16778836, "1621": 16778837, "1632": 16778848, "1633": 16778849, "1634": 16778850, "1635": 16778851, "1636": 16778852, "1637": 16778853, "1638": 16778854, "1639": 16778855, "1640": 16778856, "1641": 16778857, "1642": 16778858, "1648": 16778864, "1657": 16778873, "1662": 16778878, "1670": 16778886, "1672": 16778888, "1681": 16778897, "1688": 16778904, "1700": 16778916, "1705": 16778921, "1711": 16778927, "1722": 16778938, "1726": 16778942, "1729": 16778945, "1740": 16778956, "1746": 16778962, "1748": 16778964, "1776": 16778992, "1777": 16778993, "1778": 16778994, "1779": 16778995, "1780": 16778996, "1781": 16778997, "1782": 16778998, "1783": 16778999, "1784": 16779000, "1785": 16779001, "3458": 16780674, "3459": 16780675, "3461": 16780677, "3462": 16780678, "3463": 16780679, "3464": 16780680, "3465": 16780681, "3466": 16780682, "3467": 16780683, "3468": 16780684, "3469": 16780685, "3470": 16780686, "3471": 16780687, "3472": 16780688, "3473": 16780689, "3474": 16780690, "3475": 16780691, "3476": 16780692, "3477": 16780693, "3478": 16780694, "3482": 16780698, "3483": 16780699, "3484": 16780700, "3485": 16780701, "3486": 16780702, "3487": 16780703, "3488": 16780704, "3489": 16780705, "3490": 16780706, "3491": 16780707, "3492": 16780708, "3493": 16780709, "3494": 16780710, "3495": 16780711, "3496": 16780712, "3497": 16780713, "3498": 16780714, "3499": 16780715, "3500": 16780716, "3501": 16780717, "3502": 16780718, "3503": 16780719, "3504": 16780720, "3505": 16780721, "3507": 16780723, "3508": 16780724, "3509": 16780725, "3510": 16780726, "3511": 16780727, "3512": 16780728, "3513": 16780729, "3514": 16780730, "3515": 16780731, "3517": 16780733, "3520": 16780736, "3521": 16780737, "3522": 16780738, "3523": 16780739, "3524": 16780740, "3525": 16780741, "3526": 16780742, "3530": 16780746, "3535": 16780751, "3536": 16780752, "3537": 16780753, "3538": 16780754, "3539": 16780755, "3540": 16780756, "3542": 16780758, "3544": 16780760, "3545": 16780761, "3546": 16780762, "3547": 16780763, "3548": 16780764, "3549": 16780765, "3550": 16780766, "3551": 16780767, "3570": 16780786, "3571": 16780787, "3572": 16780788, "3585": 3489, "3586": 3490, "3587": 3491, "3588": 3492, "3589": 3493, "3590": 3494, "3591": 3495, "3592": 3496, "3593": 3497, "3594": 3498, "3595": 3499, "3596": 3500, "3597": 3501, "3598": 3502, "3599": 3503, "3600": 3504, "3601": 3505, "3602": 3506, "3603": 3507, "3604": 3508, "3605": 3509, "3606": 3510, "3607": 3511, "3608": 3512, "3609": 3513, "3610": 3514, "3611": 3515, "3612": 3516, "3613": 3517, "3614": 3518, "3615": 3519, "3616": 3520, "3617": 3521, "3618": 3522, "3619": 3523, "3620": 3524, "3621": 3525, "3622": 3526, "3623": 3527, "3624": 3528, "3625": 3529, "3626": 3530, "3627": 3531, "3628": 3532, "3629": 3533, "3630": 3534, "3631": 3535, "3632": 3536, "3633": 3537, "3634": 3538, "3635": 3539, "3636": 3540, "3637": 3541, "3638": 3542, "3639": 3543, "3640": 3544, "3641": 3545, "3642": 3546, "3647": 3551, "3648": 3552, "3649": 3553, "3650": 3554, "3651": 3555, "3652": 3556, "3653": 3557, "3654": 3558, "3655": 3559, "3656": 3560, "3657": 3561, "3658": 3562, "3659": 3563, "3660": 3564, "3661": 3565, "3664": 3568, "3665": 3569, "3666": 3570, "3667": 3571, "3668": 3572, "3669": 3573, "3670": 3574, "3671": 3575, "3672": 3576, "3673": 3577, "4304": 16781520, "4305": 16781521, "4306": 16781522, "4307": 16781523, "4308": 16781524, "4309": 16781525, "4310": 16781526, "4311": 16781527, "4312": 16781528, "4313": 16781529, "4314": 16781530, "4315": 16781531, "4316": 16781532, "4317": 16781533, "4318": 16781534, "4319": 16781535, "4320": 16781536, "4321": 16781537, "4322": 16781538, "4323": 16781539, "4324": 16781540, "4325": 16781541, "4326": 16781542, "4327": 16781543, "4328": 16781544, "4329": 16781545, "4330": 16781546, "4331": 16781547, "4332": 16781548, "4333": 16781549, "4334": 16781550, "4335": 16781551, "4336": 16781552, "4337": 16781553, "4338": 16781554, "4339": 16781555, "4340": 16781556, "4341": 16781557, "4342": 16781558, "7682": 16784898, "7683": 16784899, "7690": 16784906, "7691": 16784907, "7710": 16784926, "7711": 16784927, "7734": 16784950, "7735": 16784951, "7744": 16784960, "7745": 16784961, "7766": 16784982, "7767": 16784983, "7776": 16784992, "7777": 16784993, "7786": 16785002, "7787": 16785003, "7808": 16785024, "7809": 16785025, "7810": 16785026, "7811": 16785027, "7812": 16785028, "7813": 16785029, "7818": 16785034, "7819": 16785035, "7840": 16785056, "7841": 16785057, "7842": 16785058, "7843": 16785059, "7844": 16785060, "7845": 16785061, "7846": 16785062, "7847": 16785063, "7848": 16785064, "7849": 16785065, "7850": 16785066, "7851": 16785067, "7852": 16785068, "7853": 16785069, "7854": 16785070, "7855": 16785071, "7856": 16785072, "7857": 16785073, "7858": 16785074, "7859": 16785075, "7860": 16785076, "7861": 16785077, "7862": 16785078, "7863": 16785079, "7864": 16785080, "7865": 16785081, "7866": 16785082, "7867": 16785083, "7868": 16785084, "7869": 16785085, "7870": 16785086, "7871": 16785087, "7872": 16785088, "7873": 16785089, "7874": 16785090, "7875": 16785091, "7876": 16785092, "7877": 16785093, "7878": 16785094, "7879": 16785095, "7880": 16785096, "7881": 16785097, "7882": 16785098, "7883": 16785099, "7884": 16785100, "7885": 16785101, "7886": 16785102, "7887": 16785103, "7888": 16785104, "7889": 16785105, "7890": 16785106, "7891": 16785107, "7892": 16785108, "7893": 16785109, "7894": 16785110, "7895": 16785111, "7896": 16785112, "7897": 16785113, "7898": 16785114, "7899": 16785115, "7900": 16785116, "7901": 16785117, "7902": 16785118, "7903": 16785119, "7904": 16785120, "7905": 16785121, "7906": 16785122, "7907": 16785123, "7908": 16785124, "7909": 16785125, "7910": 16785126, "7911": 16785127, "7912": 16785128, "7913": 16785129, "7914": 16785130, "7915": 16785131, "7916": 16785132, "7917": 16785133, "7918": 16785134, "7919": 16785135, "7920": 16785136, "7921": 16785137, "7922": 16785138, "7923": 16785139, "7924": 16785140, "7925": 16785141, "7926": 16785142, "7927": 16785143, "7928": 16785144, "7929": 16785145, "8194": 2722, "8195": 2721, "8196": 2723, "8197": 2724, "8199": 2725, "8200": 2726, "8201": 2727, "8202": 2728, "8210": 2747, "8211": 2730, "8212": 2729, "8213": 1967, "8215": 3295, "8216": 2768, "8217": 2769, "8218": 2813, "8220": 2770, "8221": 2771, "8222": 2814, "8224": 2801, "8225": 2802, "8226": 2790, "8229": 2735, "8230": 2734, "8240": 2773, "8242": 2774, "8243": 2775, "8248": 2812, "8254": 1150, "8304": 16785520, "8308": 16785524, "8309": 16785525, "8310": 16785526, "8311": 16785527, "8312": 16785528, "8313": 16785529, "8320": 16785536, "8321": 16785537, "8322": 16785538, "8323": 16785539, "8324": 16785540, "8325": 16785541, "8326": 16785542, "8327": 16785543, "8328": 16785544, "8329": 16785545, "8352": 16785568, "8353": 16785569, "8354": 16785570, "8355": 16785571, "8356": 16785572, "8357": 16785573, "8358": 16785574, "8359": 16785575, "8360": 16785576, "8361": 3839, "8362": 16785578, "8363": 16785579, "8364": 8364, "8453": 2744, "8470": 1712, "8471": 2811, "8478": 2772, "8482": 2761, "8531": 2736, "8532": 2737, "8533": 2738, "8534": 2739, "8535": 2740, "8536": 2741, "8537": 2742, "8538": 2743, "8539": 2755, "8540": 2756, "8541": 2757, "8542": 2758, "8592": 2299, "8593": 2300, "8594": 2301, "8595": 2302, "8658": 2254, "8660": 2253, "8706": 2287, "8709": 16785925, "8711": 2245, "8712": 16785928, "8713": 16785929, "8715": 16785931, "8728": 3018, "8730": 2262, "8731": 16785947, "8732": 16785948, "8733": 2241, "8734": 2242, "8743": 2270, "8744": 2271, "8745": 2268, "8746": 2269, "8747": 2239, "8748": 16785964, "8749": 16785965, "8756": 2240, "8757": 16785973, "8764": 2248, "8771": 2249, "8773": 16785992, "8775": 16785991, "8800": 2237, "8801": 2255, "8802": 16786018, "8803": 16786019, "8804": 2236, "8805": 2238, "8834": 2266, "8835": 2267, "8866": 3068, "8867": 3036, "8868": 3010, "8869": 3022, "8968": 3027, "8970": 3012, "8981": 2810, "8992": 2212, "8993": 2213, "9109": 3020, "9115": 2219, "9117": 2220, "9118": 2221, "9120": 2222, "9121": 2215, "9123": 2216, "9124": 2217, "9126": 2218, "9128": 2223, "9132": 2224, "9143": 2209, "9146": 2543, "9147": 2544, "9148": 2546, "9149": 2547, "9225": 2530, "9226": 2533, "9227": 2537, "9228": 2531, "9229": 2532, "9251": 2732, "9252": 2536, "9472": 2211, "9474": 2214, "9484": 2210, "9488": 2539, "9492": 2541, "9496": 2538, "9500": 2548, "9508": 2549, "9516": 2551, "9524": 2550, "9532": 2542, "9618": 2529, "9642": 2791, "9643": 2785, "9644": 2779, "9645": 2786, "9646": 2783, "9647": 2767, "9650": 2792, "9651": 2787, "9654": 2781, "9655": 2765, "9660": 2793, "9661": 2788, "9664": 2780, "9665": 2764, "9670": 2528, "9675": 2766, "9679": 2782, "9702": 2784, "9734": 2789, "9742": 2809, "9747": 2762, "9756": 2794, "9758": 2795, "9792": 2808, "9794": 2807, "9827": 2796, "9829": 2798, "9830": 2797, "9837": 2806, "9839": 2805, "10003": 2803, "10007": 2804, "10013": 2777, "10016": 2800, "10216": 2748, "10217": 2750, "10240": 16787456, "10241": 16787457, "10242": 16787458, "10243": 16787459, "10244": 16787460, "10245": 16787461, "10246": 16787462, "10247": 16787463, "10248": 16787464, "10249": 16787465, "10250": 16787466, "10251": 16787467, "10252": 16787468, "10253": 16787469, "10254": 16787470, "10255": 16787471, "10256": 16787472, "10257": 16787473, "10258": 16787474, "10259": 16787475, "10260": 16787476, "10261": 16787477, "10262": 16787478, "10263": 16787479, "10264": 16787480, "10265": 16787481, "10266": 16787482, "10267": 16787483, "10268": 16787484, "10269": 16787485, "10270": 16787486, "10271": 16787487, "10272": 16787488, "10273": 16787489, "10274": 16787490, "10275": 16787491, "10276": 16787492, "10277": 16787493, "10278": 16787494, "10279": 16787495, "10280": 16787496, "10281": 16787497, "10282": 16787498, "10283": 16787499, "10284": 16787500, "10285": 16787501, "10286": 16787502, "10287": 16787503, "10288": 16787504, "10289": 16787505, "10290": 16787506, "10291": 16787507, "10292": 16787508, "10293": 16787509, "10294": 16787510, "10295": 16787511, "10296": 16787512, "10297": 16787513, "10298": 16787514, "10299": 16787515, "10300": 16787516, "10301": 16787517, "10302": 16787518, "10303": 16787519, "10304": 16787520, "10305": 16787521, "10306": 16787522, "10307": 16787523, "10308": 16787524, "10309": 16787525, "10310": 16787526, "10311": 16787527, "10312": 16787528, "10313": 16787529, "10314": 16787530, "10315": 16787531, "10316": 16787532, "10317": 16787533, "10318": 16787534, "10319": 16787535, "10320": 16787536, "10321": 16787537, "10322": 16787538, "10323": 16787539, "10324": 16787540, "10325": 16787541, "10326": 16787542, "10327": 16787543, "10328": 16787544, "10329": 16787545, "10330": 16787546, "10331": 16787547, "10332": 16787548, "10333": 16787549, "10334": 16787550, "10335": 16787551, "10336": 16787552, "10337": 16787553, "10338": 16787554, "10339": 16787555, "10340": 16787556, "10341": 16787557, "10342": 16787558, "10343": 16787559, "10344": 16787560, "10345": 16787561, "10346": 16787562, "10347": 16787563, "10348": 16787564, "10349": 16787565, "10350": 16787566, "10351": 16787567, "10352": 16787568, "10353": 16787569, "10354": 16787570, "10355": 16787571, "10356": 16787572, "10357": 16787573, "10358": 16787574, "10359": 16787575, "10360": 16787576, "10361": 16787577, "10362": 16787578, "10363": 16787579, "10364": 16787580, "10365": 16787581, "10366": 16787582, "10367": 16787583, "10368": 16787584, "10369": 16787585, "10370": 16787586, "10371": 16787587, "10372": 16787588, "10373": 16787589, "10374": 16787590, "10375": 16787591, "10376": 16787592, "10377": 16787593, "10378": 16787594, "10379": 16787595, "10380": 16787596, "10381": 16787597, "10382": 16787598, "10383": 16787599, "10384": 16787600, "10385": 16787601, "10386": 16787602, "10387": 16787603, "10388": 16787604, "10389": 16787605, "10390": 16787606, "10391": 16787607, "10392": 16787608, "10393": 16787609, "10394": 16787610, "10395": 16787611, "10396": 16787612, "10397": 16787613, "10398": 16787614, "10399": 16787615, "10400": 16787616, "10401": 16787617, "10402": 16787618, "10403": 16787619, "10404": 16787620, "10405": 16787621, "10406": 16787622, "10407": 16787623, "10408": 16787624, "10409": 16787625, "10410": 16787626, "10411": 16787627, "10412": 16787628, "10413": 16787629, "10414": 16787630, "10415": 16787631, "10416": 16787632, "10417": 16787633, "10418": 16787634, "10419": 16787635, "10420": 16787636, "10421": 16787637, "10422": 16787638, "10423": 16787639, "10424": 16787640, "10425": 16787641, "10426": 16787642, "10427": 16787643, "10428": 16787644, "10429": 16787645, "10430": 16787646, "10431": 16787647, "10432": 16787648, "10433": 16787649, "10434": 16787650, "10435": 16787651, "10436": 16787652, "10437": 16787653, "10438": 16787654, "10439": 16787655, "10440": 16787656, "10441": 16787657, "10442": 16787658, "10443": 16787659, "10444": 16787660, "10445": 16787661, "10446": 16787662, "10447": 16787663, "10448": 16787664, "10449": 16787665, "10450": 16787666, "10451": 16787667, "10452": 16787668, "10453": 16787669, "10454": 16787670, "10455": 16787671, "10456": 16787672, "10457": 16787673, "10458": 16787674, "10459": 16787675, "10460": 16787676, "10461": 16787677, "10462": 16787678, "10463": 16787679, "10464": 16787680, "10465": 16787681, "10466": 16787682, "10467": 16787683, "10468": 16787684, "10469": 16787685, "10470": 16787686, "10471": 16787687, "10472": 16787688, "10473": 16787689, "10474": 16787690, "10475": 16787691, "10476": 16787692, "10477": 16787693, "10478": 16787694, "10479": 16787695, "10480": 16787696, "10481": 16787697, "10482": 16787698, "10483": 16787699, "10484": 16787700, "10485": 16787701, "10486": 16787702, "10487": 16787703, "10488": 16787704, "10489": 16787705, "10490": 16787706, "10491": 16787707, "10492": 16787708, "10493": 16787709, "10494": 16787710, "10495": 16787711, "12289": 1188, "12290": 1185, "12300": 1186, "12301": 1187, "12443": 1246, "12444": 1247, "12449": 1191, "12450": 1201, "12451": 1192, "12452": 1202, "12453": 1193, "12454": 1203, "12455": 1194, "12456": 1204, "12457": 1195, "12458": 1205, "12459": 1206, "12461": 1207, "12463": 1208, "12465": 1209, "12467": 1210, "12469": 1211, "12471": 1212, "12473": 1213, "12475": 1214, "12477": 1215, "12479": 1216, "12481": 1217, "12483": 1199, "12484": 1218, "12486": 1219, "12488": 1220, "12490": 1221, "12491": 1222, "12492": 1223, "12493": 1224, "12494": 1225, "12495": 1226, "12498": 1227, "12501": 1228, "12504": 1229, "12507": 1230, "12510": 1231, "12511": 1232, "12512": 1233, "12513": 1234, "12514": 1235, "12515": 1196, "12516": 1236, "12517": 1197, "12518": 1237, "12519": 1198, "12520": 1238, "12521": 1239, "12522": 1240, "12523": 1241, "12524": 1242, "12525": 1243, "12527": 1244, "12530": 1190, "12531": 1245, "12539": 1189, "12540": 1200 }; + + function lookup(k) { + return k ? { keysym: k, keyname: keynames ? keynames[k] : k } : undefined; + } + return { + fromUnicode: function (u) { + var keysym = codepoints[u]; + if (keysym === undefined) { + keysym = 0x01000000 | u; + } + return lookup(keysym); + }, + lookup: lookup + }; +}(); + +exports.default = keysyms; +module.exports = exports["default"]; -function lookup(k) { - return k ? { keysym: k, keyname: keynames ? keynames[k] : k } : undefined; -} -exports.default = { - fromUnicode: function (u) { - var keysym = codepoints[u]; - if (keysym === undefined) { - keysym = 0x01000000 | u; - } - return lookup(keysym); - }, - lookup: lookup -}; },{}],8:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.substituteCodepoint = substituteCodepoint; -exports.hasShortcutModifier = hasShortcutModifier; -exports.hasCharModifier = hasCharModifier; -exports.ModifierSync = ModifierSync; -exports.getKey = getKey; -exports.getKeysym = getKeysym; -exports.keysymFromKeyCode = keysymFromKeyCode; -exports.nonCharacterKey = nonCharacterKey; -exports.QEMUKeyEventDecoder = QEMUKeyEventDecoder; -exports.TrackQEMUKeyState = TrackQEMUKeyState; -exports.KeyEventDecoder = KeyEventDecoder; -exports.VerifyCharModifier = VerifyCharModifier; -exports.TrackKeyState = TrackKeyState; -exports.EscapeModifiers = EscapeModifiers; -var _keysym = require("./keysym.js"); +var _keysym = require("./keysym"); var _keysym2 = _interopRequireDefault(_keysym); -var _keysymdef = require("./keysymdef.js"); +var _keysymdef = require("./keysymdef"); var _keysymdef2 = _interopRequireDefault(_keysymdef); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function substituteCodepoint(cp) { - // Any Unicode code points which do not have corresponding keysym entries - // can be swapped out for another code point by adding them to this table - var substitutions = { - // {S,s} with comma below -> {S,s} with cedilla - 0x218: 0x15e, - 0x219: 0x15f, - // {T,t} with comma below -> {T,t} with cedilla - 0x21a: 0x162, - 0x21b: 0x163 - }; +var KeyboardUtil = {}; - var sub = substitutions[cp]; - return sub ? sub : cp; -} +(function () { + "use strict"; -function isMac() { - return navigator && !!/mac/i.exec(navigator.platform); -} -function isWindows() { - return navigator && !!/win/i.exec(navigator.platform); -} -function isLinux() { - return navigator && !!/linux/i.exec(navigator.platform); -} + function substituteCodepoint(cp) { + // Any Unicode code points which do not have corresponding keysym entries + // can be swapped out for another code point by adding them to this table + var substitutions = { + // {S,s} with comma below -> {S,s} with cedilla + 0x218: 0x15e, + 0x219: 0x15f, + // {T,t} with comma below -> {T,t} with cedilla + 0x21a: 0x162, + 0x21b: 0x163 + }; -// Return true if a modifier which is not the specified char modifier (and is not shift) is down -function hasShortcutModifier(charModifier, currentModifiers) { - var mods = {}; - for (var key in currentModifiers) { - if (parseInt(key) !== _keysym2.default.XK_Shift_L) { - mods[key] = currentModifiers[key]; + var sub = substitutions[cp]; + return sub ? sub : cp; + } + + function isMac() { + return navigator && !!/mac/i.exec(navigator.platform); + } + function isWindows() { + return navigator && !!/win/i.exec(navigator.platform); + } + function isLinux() { + return navigator && !!/linux/i.exec(navigator.platform); + } + + // Return true if a modifier which is not the specified char modifier (and is not shift) is down + function hasShortcutModifier(charModifier, currentModifiers) { + var mods = {}; + for (var key in currentModifiers) { + if (parseInt(key) !== _keysym2.default.XK_Shift_L) { + mods[key] = currentModifiers[key]; + } + } + + var sum = 0; + for (var k in currentModifiers) { + if (mods[k]) { + ++sum; + } + } + if (hasCharModifier(charModifier, mods)) { + return sum > charModifier.length; + } else { + return sum > 0; } } - var sum = 0; - for (var k in currentModifiers) { - if (mods[k]) { - ++sum; - } - } - if (hasCharModifier(charModifier, mods)) { - return sum > charModifier.length; - } else { - return sum > 0; - } -} - -// Return true if the specified char modifier is currently down -function hasCharModifier(charModifier, currentModifiers) { - if (charModifier.length === 0) { - return false; - } - - for (var i = 0; i < charModifier.length; ++i) { - if (!currentModifiers[charModifier[i]]) { + // Return true if the specified char modifier is currently down + function hasCharModifier(charModifier, currentModifiers) { + if (charModifier.length === 0) { return false; } - } - return true; -} -// Helper object tracking modifier key state -// and generates fake key events to compensate if it gets out of sync -function ModifierSync(charModifier) { - if (!charModifier) { - if (isMac()) { - // on Mac, Option (AKA Alt) is used as a char modifier - charModifier = [_keysym2.default.XK_Alt_L]; - } else if (isWindows()) { - // on Windows, Ctrl+Alt is used as a char modifier - charModifier = [_keysym2.default.XK_Alt_L, _keysym2.default.XK_Control_L]; - } else if (isLinux()) { - // on Linux, ISO Level 3 Shift (AltGr) is used as a char modifier - charModifier = [_keysym2.default.XK_ISO_Level3_Shift]; + for (var i = 0; i < charModifier.length; ++i) { + if (!currentModifiers[charModifier[i]]) { + return false; + } + } + return true; + } + + // Helper object tracking modifier key state + // and generates fake key events to compensate if it gets out of sync + function ModifierSync(charModifier) { + if (!charModifier) { + if (isMac()) { + // on Mac, Option (AKA Alt) is used as a char modifier + charModifier = [_keysym2.default.XK_Alt_L]; + } else if (isWindows()) { + // on Windows, Ctrl+Alt is used as a char modifier + charModifier = [_keysym2.default.XK_Alt_L, _keysym2.default.XK_Control_L]; + } else if (isLinux()) { + // on Linux, ISO Level 3 Shift (AltGr) is used as a char modifier + charModifier = [_keysym2.default.XK_ISO_Level3_Shift]; + } else { + charModifier = []; + } + } + + var state = {}; + state[_keysym2.default.XK_Control_L] = false; + state[_keysym2.default.XK_Alt_L] = false; + state[_keysym2.default.XK_ISO_Level3_Shift] = false; + state[_keysym2.default.XK_Shift_L] = false; + state[_keysym2.default.XK_Meta_L] = false; + + function sync(evt, keysym) { + var result = []; + function syncKey(keysym) { + return { keysym: _keysymdef2.default.lookup(keysym), type: state[keysym] ? 'keydown' : 'keyup' }; + } + + if (evt.ctrlKey !== undefined && evt.ctrlKey !== state[_keysym2.default.XK_Control_L] && keysym !== _keysym2.default.XK_Control_L) { + state[_keysym2.default.XK_Control_L] = evt.ctrlKey; + result.push(syncKey(_keysym2.default.XK_Control_L)); + } + if (evt.altKey !== undefined && evt.altKey !== state[_keysym2.default.XK_Alt_L] && keysym !== _keysym2.default.XK_Alt_L) { + state[_keysym2.default.XK_Alt_L] = evt.altKey; + result.push(syncKey(_keysym2.default.XK_Alt_L)); + } + if (evt.altGraphKey !== undefined && evt.altGraphKey !== state[_keysym2.default.XK_ISO_Level3_Shift] && keysym !== _keysym2.default.XK_ISO_Level3_Shift) { + state[_keysym2.default.XK_ISO_Level3_Shift] = evt.altGraphKey; + result.push(syncKey(_keysym2.default.XK_ISO_Level3_Shift)); + } + if (evt.shiftKey !== undefined && evt.shiftKey !== state[_keysym2.default.XK_Shift_L] && keysym !== _keysym2.default.XK_Shift_L) { + state[_keysym2.default.XK_Shift_L] = evt.shiftKey; + result.push(syncKey(_keysym2.default.XK_Shift_L)); + } + if (evt.metaKey !== undefined && evt.metaKey !== state[_keysym2.default.XK_Meta_L] && keysym !== _keysym2.default.XK_Meta_L) { + state[_keysym2.default.XK_Meta_L] = evt.metaKey; + result.push(syncKey(_keysym2.default.XK_Meta_L)); + } + return result; + } + function syncKeyEvent(evt, down) { + var obj = getKeysym(evt); + var keysym = obj ? obj.keysym : null; + + // first, apply the event itself, if relevant + if (keysym !== null && state[keysym] !== undefined) { + state[keysym] = down; + } + return sync(evt, keysym); + } + + return { + // sync on the appropriate keyboard event + keydown: function (evt) { + return syncKeyEvent(evt, true); + }, + keyup: function (evt) { + return syncKeyEvent(evt, false); + }, + // Call this with a non-keyboard event (such as mouse events) to use its modifier state to synchronize anyway + syncAny: function (evt) { + return sync(evt); + }, + + // is a shortcut modifier down? + hasShortcutModifier: function () { + return hasShortcutModifier(charModifier, state); + }, + // if a char modifier is down, return the keys it consists of, otherwise return null + activeCharModifier: function () { + return hasCharModifier(charModifier, state) ? charModifier : null; + } + }; + } + + // Get a key ID from a keyboard event + // May be a string or an integer depending on the available properties + function getKey(evt) { + if ('keyCode' in evt && 'key' in evt) { + return evt.key + ':' + evt.keyCode; + } else if ('keyCode' in evt) { + return evt.keyCode; } else { - charModifier = []; + return evt.key; } } - var state = {}; - state[_keysym2.default.XK_Control_L] = false; - state[_keysym2.default.XK_Alt_L] = false; - state[_keysym2.default.XK_ISO_Level3_Shift] = false; - state[_keysym2.default.XK_Shift_L] = false; - state[_keysym2.default.XK_Meta_L] = false; - - function sync(evt, keysym) { - var result = []; - function syncKey(keysym) { - return { keysym: _keysymdef2.default.lookup(keysym), type: state[keysym] ? 'keydown' : 'keyup' }; + // Get the most reliable keysym value we can get from a key event + // if char/charCode is available, prefer those, otherwise fall back to key/keyCode/which + function getKeysym(evt) { + var codepoint; + if (evt.char && evt.char.length === 1) { + codepoint = evt.char.charCodeAt(); + } else if (evt.charCode) { + codepoint = evt.charCode; + } else if (evt.keyCode && evt.type === 'keypress') { + // IE10 stores the char code as keyCode, and has no other useful properties + codepoint = evt.keyCode; } - - if (evt.ctrlKey !== undefined && evt.ctrlKey !== state[_keysym2.default.XK_Control_L] && keysym !== _keysym2.default.XK_Control_L) { - state[_keysym2.default.XK_Control_L] = evt.ctrlKey; - result.push(syncKey(_keysym2.default.XK_Control_L)); + if (codepoint) { + return _keysymdef2.default.fromUnicode(substituteCodepoint(codepoint)); } - if (evt.altKey !== undefined && evt.altKey !== state[_keysym2.default.XK_Alt_L] && keysym !== _keysym2.default.XK_Alt_L) { - state[_keysym2.default.XK_Alt_L] = evt.altKey; - result.push(syncKey(_keysym2.default.XK_Alt_L)); + // we could check evt.key here. + // Legal values are defined in http://www.w3.org/TR/DOM-Level-3-Events/#key-values-list, + // so we "just" need to map them to keysym, but AFAIK this is only available in IE10, which also provides evt.key + // so we don't *need* it yet + if (evt.keyCode) { + return _keysymdef2.default.lookup(keysymFromKeyCode(evt.keyCode, evt.shiftKey)); } - if (evt.altGraphKey !== undefined && evt.altGraphKey !== state[_keysym2.default.XK_ISO_Level3_Shift] && keysym !== _keysym2.default.XK_ISO_Level3_Shift) { - state[_keysym2.default.XK_ISO_Level3_Shift] = evt.altGraphKey; - result.push(syncKey(_keysym2.default.XK_ISO_Level3_Shift)); + if (evt.which) { + return _keysymdef2.default.lookup(keysymFromKeyCode(evt.which, evt.shiftKey)); } - if (evt.shiftKey !== undefined && evt.shiftKey !== state[_keysym2.default.XK_Shift_L] && keysym !== _keysym2.default.XK_Shift_L) { - state[_keysym2.default.XK_Shift_L] = evt.shiftKey; - result.push(syncKey(_keysym2.default.XK_Shift_L)); - } - if (evt.metaKey !== undefined && evt.metaKey !== state[_keysym2.default.XK_Meta_L] && keysym !== _keysym2.default.XK_Meta_L) { - state[_keysym2.default.XK_Meta_L] = evt.metaKey; - result.push(syncKey(_keysym2.default.XK_Meta_L)); - } - return result; - } - function syncKeyEvent(evt, down) { - var obj = getKeysym(evt); - var keysym = obj ? obj.keysym : null; - - // first, apply the event itself, if relevant - if (keysym !== null && state[keysym] !== undefined) { - state[keysym] = down; - } - return sync(evt, keysym); - } - - return { - // sync on the appropriate keyboard event - keydown: function (evt) { - return syncKeyEvent(evt, true); - }, - keyup: function (evt) { - return syncKeyEvent(evt, false); - }, - // Call this with a non-keyboard event (such as mouse events) to use its modifier state to synchronize anyway - syncAny: function (evt) { - return sync(evt); - }, - - // is a shortcut modifier down? - hasShortcutModifier: function () { - return hasShortcutModifier(charModifier, state); - }, - // if a char modifier is down, return the keys it consists of, otherwise return null - activeCharModifier: function () { - return hasCharModifier(charModifier, state) ? charModifier : null; - } - }; -} - -// Get a key ID from a keyboard event -// May be a string or an integer depending on the available properties -function getKey(evt) { - if ('keyCode' in evt && 'key' in evt) { - return evt.key + ':' + evt.keyCode; - } else if ('keyCode' in evt) { - return evt.keyCode; - } else { - return evt.key; - } -} - -// Get the most reliable keysym value we can get from a key event -// if char/charCode is available, prefer those, otherwise fall back to key/keyCode/which -function getKeysym(evt) { - var codepoint; - if (evt.char && evt.char.length === 1) { - codepoint = evt.char.charCodeAt(); - } else if (evt.charCode) { - codepoint = evt.charCode; - } else if (evt.keyCode && evt.type === 'keypress') { - // IE10 stores the char code as keyCode, and has no other useful properties - codepoint = evt.keyCode; - } - if (codepoint) { - return _keysymdef2.default.fromUnicode(substituteCodepoint(codepoint)); - } - // we could check evt.key here. - // Legal values are defined in http://www.w3.org/TR/DOM-Level-3-Events/#key-values-list, - // so we "just" need to map them to keysym, but AFAIK this is only available in IE10, which also provides evt.key - // so we don't *need* it yet - if (evt.keyCode) { - return _keysymdef2.default.lookup(keysymFromKeyCode(evt.keyCode, evt.shiftKey)); - } - if (evt.which) { - return _keysymdef2.default.lookup(keysymFromKeyCode(evt.which, evt.shiftKey)); - } - return null; -} - -// Given a keycode, try to predict which keysym it might be. -// If the keycode is unknown, null is returned. -function keysymFromKeyCode(keycode, shiftPressed) { - if (typeof keycode !== 'number') { return null; } - // won't be accurate for azerty - if (keycode >= 0x30 && keycode <= 0x39) { - return keycode; // digit - } - if (keycode >= 0x41 && keycode <= 0x5a) { - // remap to lowercase unless shift is down - return shiftPressed ? keycode : keycode + 32; // A-Z - } - if (keycode >= 0x60 && keycode <= 0x69) { - return _keysym2.default.XK_KP_0 + (keycode - 0x60); // numpad 0-9 - } - switch (keycode) { - case 0x20: - return _keysym2.default.XK_space; - case 0x6a: - return _keysym2.default.XK_KP_Multiply; - case 0x6b: - return _keysym2.default.XK_KP_Add; - case 0x6c: - return _keysym2.default.XK_KP_Separator; - case 0x6d: - return _keysym2.default.XK_KP_Subtract; - case 0x6e: - return _keysym2.default.XK_KP_Decimal; - case 0x6f: - return _keysym2.default.XK_KP_Divide; - case 0xbb: - return _keysym2.default.XK_plus; - case 0xbc: - return _keysym2.default.XK_comma; - case 0xbd: - return _keysym2.default.XK_minus; - case 0xbe: - return _keysym2.default.XK_period; - } - - return nonCharacterKey({ keyCode: keycode }); -} - -// if the key is a known non-character key (any key which doesn't generate character data) -// return its keysym value. Otherwise return null -function nonCharacterKey(evt) { - // evt.key not implemented yet - if (!evt.keyCode) { - return null; - } - var keycode = evt.keyCode; - - if (keycode >= 0x70 && keycode <= 0x87) { - return _keysym2.default.XK_F1 + keycode - 0x70; // F1-F24 - } - switch (keycode) { - - case 8: - return _keysym2.default.XK_BackSpace; - case 13: - return _keysym2.default.XK_Return; - - case 9: - return _keysym2.default.XK_Tab; - - case 27: - return _keysym2.default.XK_Escape; - case 46: - return _keysym2.default.XK_Delete; - - case 36: - return _keysym2.default.XK_Home; - case 35: - return _keysym2.default.XK_End; - case 33: - return _keysym2.default.XK_Page_Up; - case 34: - return _keysym2.default.XK_Page_Down; - case 45: - return _keysym2.default.XK_Insert; - - case 37: - return _keysym2.default.XK_Left; - case 38: - return _keysym2.default.XK_Up; - case 39: - return _keysym2.default.XK_Right; - case 40: - return _keysym2.default.XK_Down; - - case 16: - return _keysym2.default.XK_Shift_L; - case 17: - return _keysym2.default.XK_Control_L; - case 18: - return _keysym2.default.XK_Alt_L; // also: Option-key on Mac - - case 224: - return _keysym2.default.XK_Meta_L; - case 225: - return _keysym2.default.XK_ISO_Level3_Shift; // AltGr - case 91: - return _keysym2.default.XK_Super_L; // also: Windows-key - case 92: - return _keysym2.default.XK_Super_R; // also: Windows-key - case 93: - return _keysym2.default.XK_Menu; // also: Windows-Menu, Command on Mac - default: + // Given a keycode, try to predict which keysym it might be. + // If the keycode is unknown, null is returned. + function keysymFromKeyCode(keycode, shiftPressed) { + if (typeof keycode !== 'number') { return null; - } -} + } + // won't be accurate for azerty + if (keycode >= 0x30 && keycode <= 0x39) { + return keycode; // digit + } + if (keycode >= 0x41 && keycode <= 0x5a) { + // remap to lowercase unless shift is down + return shiftPressed ? keycode : keycode + 32; // A-Z + } + if (keycode >= 0x60 && keycode <= 0x69) { + return _keysym2.default.XK_KP_0 + (keycode - 0x60); // numpad 0-9 + } -function QEMUKeyEventDecoder(modifierState, next) { + switch (keycode) { + case 0x20: + return _keysym2.default.XK_space; + case 0x6a: + return _keysym2.default.XK_KP_Multiply; + case 0x6b: + return _keysym2.default.XK_KP_Add; + case 0x6c: + return _keysym2.default.XK_KP_Separator; + case 0x6d: + return _keysym2.default.XK_KP_Subtract; + case 0x6e: + return _keysym2.default.XK_KP_Decimal; + case 0x6f: + return _keysym2.default.XK_KP_Divide; + case 0xbb: + return _keysym2.default.XK_plus; + case 0xbc: + return _keysym2.default.XK_comma; + case 0xbd: + return _keysym2.default.XK_minus; + case 0xbe: + return _keysym2.default.XK_period; + } + + return nonCharacterKey({ keyCode: keycode }); + } + + // if the key is a known non-character key (any key which doesn't generate character data) + // return its keysym value. Otherwise return null + function nonCharacterKey(evt) { + // evt.key not implemented yet + if (!evt.keyCode) { + return null; + } + var keycode = evt.keyCode; + + if (keycode >= 0x70 && keycode <= 0x87) { + return _keysym2.default.XK_F1 + keycode - 0x70; // F1-F24 + } + switch (keycode) { + + case 8: + return _keysym2.default.XK_BackSpace; + case 13: + return _keysym2.default.XK_Return; + + case 9: + return _keysym2.default.XK_Tab; + + case 27: + return _keysym2.default.XK_Escape; + case 46: + return _keysym2.default.XK_Delete; + + case 36: + return _keysym2.default.XK_Home; + case 35: + return _keysym2.default.XK_End; + case 33: + return _keysym2.default.XK_Page_Up; + case 34: + return _keysym2.default.XK_Page_Down; + case 45: + return _keysym2.default.XK_Insert; + + case 37: + return _keysym2.default.XK_Left; + case 38: + return _keysym2.default.XK_Up; + case 39: + return _keysym2.default.XK_Right; + case 40: + return _keysym2.default.XK_Down; + + case 16: + return _keysym2.default.XK_Shift_L; + case 17: + return _keysym2.default.XK_Control_L; + case 18: + return _keysym2.default.XK_Alt_L; // also: Option-key on Mac + + case 224: + return _keysym2.default.XK_Meta_L; + case 225: + return _keysym2.default.XK_ISO_Level3_Shift; // AltGr + case 91: + return _keysym2.default.XK_Super_L; // also: Windows-key + case 92: + return _keysym2.default.XK_Super_R; // also: Windows-key + case 93: + return _keysym2.default.XK_Menu; // also: Windows-Menu, Command on Mac + default: + return null; + } + } + + KeyboardUtil.hasShortcutModifier = hasShortcutModifier; + KeyboardUtil.hasCharModifier = hasCharModifier; + KeyboardUtil.ModifierSync = ModifierSync; + KeyboardUtil.getKey = getKey; + KeyboardUtil.getKeysym = getKeysym; + KeyboardUtil.keysymFromKeyCode = keysymFromKeyCode; + KeyboardUtil.nonCharacterKey = nonCharacterKey; + KeyboardUtil.substituteCodepoint = substituteCodepoint; +})(); + +KeyboardUtil.QEMUKeyEventDecoder = function (modifierState, next) { "use strict"; function sendAll(evts) { @@ -2536,7 +2635,7 @@ function QEMUKeyEventDecoder(modifierState, next) { var hasModifier = modifierState.hasShortcutModifier() || !!modifierState.activeCharModifier(); var isShift = evt.keyCode === 0x10 || evt.key === 'Shift'; - var suppress = !isShift && (type !== 'keydown' || modifierState.hasShortcutModifier() || !!nonCharacterKey(evt)); + var suppress = !isShift && (type !== 'keydown' || modifierState.hasShortcutModifier() || !!KeyboardUtil.nonCharacterKey(evt)); next(result); return suppress; @@ -2562,7 +2661,7 @@ function QEMUKeyEventDecoder(modifierState, next) { }; }; -function TrackQEMUKeyState(next) { +KeyboardUtil.TrackQEMUKeyState = function (next) { "use strict"; var state = []; @@ -2631,7 +2730,7 @@ function TrackQEMUKeyState(next) { // - marks each event with an 'escape' property if a modifier was down which should be "escaped" // - generates a "stall" event in cases where it might be necessary to wait and see if a keypress event follows a keydown // This information is collected into an object which is passed to the next() function. (one call per event) -function KeyEventDecoder(modifierState, next) { +KeyboardUtil.KeyEventDecoder = function (modifierState, next) { "use strict"; function sendAll(evts) { @@ -2641,18 +2740,18 @@ function KeyEventDecoder(modifierState, next) { } function process(evt, type) { var result = { type: type }; - var keyId = getKey(evt); + var keyId = KeyboardUtil.getKey(evt); if (keyId) { result.keyId = keyId; } - var keysym = getKeysym(evt); + var keysym = KeyboardUtil.getKeysym(evt); var hasModifier = modifierState.hasShortcutModifier() || !!modifierState.activeCharModifier(); // Is this a case where we have to decide on the keysym right away, rather than waiting for the keypress? // "special" keys like enter, tab or backspace don't send keypress events, // and some browsers don't send keypresses at all if a modifier is down - if (keysym && (type !== 'keydown' || nonCharacterKey(evt) || hasModifier)) { + if (keysym && (type !== 'keydown' || KeyboardUtil.nonCharacterKey(evt) || hasModifier)) { result.keysym = keysym; } @@ -2661,11 +2760,11 @@ function KeyEventDecoder(modifierState, next) { // Should we prevent the browser from handling the event? // Doing so on a keydown (in most browsers) prevents keypress from being generated // so only do that if we have to. - var suppress = !isShift && (type !== 'keydown' || modifierState.hasShortcutModifier() || !!nonCharacterKey(evt)); + var suppress = !isShift && (type !== 'keydown' || modifierState.hasShortcutModifier() || !!KeyboardUtil.nonCharacterKey(evt)); // If a char modifier is down on a keydown, we need to insert a stall, // so VerifyCharModifier knows to wait and see if a keypress is comnig - var stall = type === 'keydown' && modifierState.activeCharModifier() && !nonCharacterKey(evt); + var stall = type === 'keydown' && modifierState.activeCharModifier() && !KeyboardUtil.nonCharacterKey(evt); // if a char modifier is pressed, get the keys it consists of (on Windows, AltGr is equivalent to Ctrl+Alt) var active = modifierState.activeCharModifier(); @@ -2721,7 +2820,7 @@ function KeyEventDecoder(modifierState, next) { // so when used with the '2' key, Ctrl-Alt counts as a char modifier (and should be escaped), but when used with 'D', it does not. // The only way we can distinguish these cases is to wait and see if a keypress event arrives // When we receive a "stall" event, wait a few ms before processing the next keydown. If a keypress has also arrived, merge the two -function VerifyCharModifier(next) { +KeyboardUtil.VerifyCharModifier = function (next) { "use strict"; var queue = []; @@ -2779,7 +2878,7 @@ function VerifyCharModifier(next) { // in some cases, a single key may produce multiple keysyms, so the corresponding keyup event must release all of these chars // key repeat events should be merged into a single entry. // Because we can't always identify which entry a keydown or keyup event corresponds to, we sometimes have to guess -function TrackKeyState(next) { +KeyboardUtil.TrackKeyState = function (next) { "use strict"; var state = []; @@ -2866,7 +2965,7 @@ function TrackKeyState(next) { // Handles "escaping" of modifiers: if a char modifier is used to produce a keysym (such as AltGr-2 to generate an @), // then the modifier must be "undone" before sending the @, and "redone" afterwards. -function EscapeModifiers(next) { +KeyboardUtil.EscapeModifiers = function (next) { "use strict"; return function (evt) { @@ -2888,13 +2987,17 @@ function EscapeModifiers(next) { /* jshint shadow: false */ }; }; -},{"./keysym.js":6,"./keysymdef.js":7}],9:[function(require,module,exports){ + +exports.default = KeyboardUtil; +module.exports = exports["default"]; + +},{"./keysym":6,"./keysymdef":7}],9:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = { +var XtScancode = { "Escape": 0x0001, "Digit1": 0x0002, "Digit2": 0x0003, @@ -3043,75 +3146,57 @@ exports.default = { "LaunchMail": 0xE06C, "MediaSelect": 0xE06D }; + +exports.default = XtScancode; +module.exports = exports["default"]; + },{}],10:[function(require,module,exports){ -'use strict'; +"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = RFB; -var _logging = require('./util/logging.js'); +var _util = require("./util"); -var Log = _interopRequireWildcard(_logging); +var _util2 = _interopRequireDefault(_util); -var _localization = require('./util/localization.js'); - -var _localization2 = _interopRequireDefault(_localization); - -var _strings = require('./util/strings.js'); - -var _properties = require('./util/properties.js'); - -var _display = require('./display.js'); +var _display = require("./display"); var _display2 = _interopRequireDefault(_display); -var _devices = require('./input/devices.js'); +var _devices = require("./input/devices"); -var _websock = require('./websock.js'); +var _websock = require("./websock"); var _websock2 = _interopRequireDefault(_websock); -var _base = require('./base64.js'); +var _base = require("./base64"); var _base2 = _interopRequireDefault(_base); -var _des = require('./des.js'); +var _des = require("./des"); var _des2 = _interopRequireDefault(_des); -var _keysym = require('./input/keysym.js'); +var _keysym = require("./input/keysym"); var _keysym2 = _interopRequireDefault(_keysym); -var _xtscancodes = require('./input/xtscancodes.js'); +var _xtscancodes = require("./input/xtscancodes"); var _xtscancodes2 = _interopRequireDefault(_xtscancodes); -var _inflator = require('./inflator.js'); +var _inflator = require("./inflator.mod"); var _inflator2 = _interopRequireDefault(_inflator); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - /*jslint white: false, browser: true */ /*global window, Util, Display, Keyboard, Mouse, Websock, Websock_native, Base64, DES, KeyTable, Inflator, XtScancode */ -/* - * noVNC: HTML5 VNC client - * Copyright (C) 2012 Joel Martin - * Copyright (C) 2016 Samuel Mannehed for Cendio AB - * Licensed under MPL 2.0 (see LICENSE.txt) - * - * See README.md for usage and integration instructions. - * - * TIGHT decoder portion: - * (c) 2012 Michael Tinglof, Joe Balaz, Les Piech (Mercuri.ca) - */ - function RFB(defaults) { "use strict"; @@ -3143,10 +3228,7 @@ function RFB(defaults) { ['JPEG_quality_med', -26], //['JPEG_quality_hi', -23 ], //['compress_lo', -255 ], - ['compress_hi', -254], - //['compress_max', -247 ], - - ['DesktopSize', -223], ['last_rect', -224], ['Cursor', -239], ['QEMUExtendedKeyEvent', -258], ['ExtendedDesktopSize', -308], ['xvp', -309], ['Fence', -312], ['ContinuousUpdates', -313]]; + ['compress_hi', -247], ['DesktopSize', -223], ['last_rect', -224], ['Cursor', -239], ['QEMUExtendedKeyEvent', -258], ['ExtendedDesktopSize', -308], ['xvp', -309], ['Fence', -312], ['ContinuousUpdates', -313]]; this._encHandlers = {}; this._encNames = {}; @@ -3220,7 +3302,7 @@ function RFB(defaults) { this._qemuExtKeyEventSupported = false; // set the default value on user-facing properties - (0, _properties.set_defaults)(this, defaults, { + _util2.default.set_defaults(this, defaults, { 'target': 'null', // VNC display rendering Canvas object 'focusContainer': document, // DOM element that captures keyboard input 'encrypt': false, // Use TLS/SSL/wss encryption @@ -3249,7 +3331,7 @@ function RFB(defaults) { }); // main setup - Log.Debug(">> RFB.constructor"); + _util2.default.Debug(">> RFB.constructor"); // populate encHandlers with bound versions Object.keys(RFB.encodingHandlers).forEach(function (encName) { @@ -3269,7 +3351,7 @@ function RFB(defaults) { this._display = new _display2.default({ target: this._target, onFlush: this._onFlush.bind(this) }); } catch (exc) { - Log.Error("Display exception: " + exc); + _util2.default.Error("Display exception: " + exc); throw exc; } @@ -3286,13 +3368,13 @@ function RFB(defaults) { this._sock.on('open', function () { if (this._rfb_connection_state === 'connecting' && this._rfb_init_state === '') { this._rfb_init_state = 'ProtocolVersion'; - Log.Debug("Starting VNC handshake"); + _util2.default.Debug("Starting VNC handshake"); } else { this._fail("Unexpected server connection"); } }.bind(this)); this._sock.on('close', function (e) { - Log.Warn("WebSocket on-close event"); + _util2.default.Warn("WebSocket on-close event"); var msg = ""; if (e.code) { msg = " (code: " + e.code; @@ -3323,1927 +3405,1941 @@ function RFB(defaults) { this._sock.off('close'); }.bind(this)); this._sock.on('error', function (e) { - Log.Warn("WebSocket on-error event"); + _util2.default.Warn("WebSocket on-error event"); }); this._init_vars(); this._cleanup(); var rmode = this._display.get_render_mode(); - Log.Info("Using native WebSockets, render mode: " + rmode); + _util2.default.Info("Using native WebSockets, render mode: " + rmode); - Log.Debug("<< RFB.constructor"); -}; + _util2.default.Debug("<< RFB.constructor"); +} /* + * noVNC: HTML5 VNC client + * Copyright (C) 2012 Joel Martin + * Copyright (C) 2016 Samuel Mannehed for Cendio AB + * Licensed under MPL 2.0 (see LICENSE.txt) + * + * See README.md for usage and integration instructions. + * + * TIGHT decoder portion: + * (c) 2012 Michael Tinglof, Joe Balaz, Les Piech (Mercuri.ca) + */ -RFB.prototype = { - // Public methods - connect: function (host, port, password, path) { - this._rfb_host = host; - this._rfb_port = port; - this._rfb_password = password !== undefined ? password : ""; - this._rfb_path = path !== undefined ? path : ""; +; - if (!this._rfb_host || !this._rfb_port) { - return this._fail((0, _localization2.default)("Must set host and port")); - } +(function () { + RFB.prototype = { + // Public methods + connect: function (host, port, password, path) { + this._rfb_host = host; + this._rfb_port = port; + this._rfb_password = password !== undefined ? password : ""; + this._rfb_path = path !== undefined ? path : ""; - this._rfb_init_state = ''; - this._updateConnectionState('connecting'); - return true; - }, + if (!this._rfb_host || !this._rfb_port) { + return this._fail(_util2.default.Localisation.get("Must set host and port")); + } - disconnect: function () { - this._updateConnectionState('disconnecting'); - this._sock.off('error'); - this._sock.off('message'); - this._sock.off('open'); - }, - - sendPassword: function (passwd) { - this._rfb_password = passwd; - setTimeout(this._init_msg.bind(this), 0); - }, - - sendCtrlAltDel: function () { - if (this._rfb_connection_state !== 'connected' || this._view_only) { - return false; - } - Log.Info("Sending Ctrl-Alt-Del"); - - RFB.messages.keyEvent(this._sock, _keysym2.default.XK_Control_L, 1); - RFB.messages.keyEvent(this._sock, _keysym2.default.XK_Alt_L, 1); - RFB.messages.keyEvent(this._sock, _keysym2.default.XK_Delete, 1); - RFB.messages.keyEvent(this._sock, _keysym2.default.XK_Delete, 0); - RFB.messages.keyEvent(this._sock, _keysym2.default.XK_Alt_L, 0); - RFB.messages.keyEvent(this._sock, _keysym2.default.XK_Control_L, 0); - return true; - }, - - xvpOp: function (ver, op) { - if (this._rfb_xvp_ver < ver) { - return false; - } - Log.Info("Sending XVP operation " + op + " (version " + ver + ")"); - this._sock.send_string("\xFA\x00" + String.fromCharCode(ver) + String.fromCharCode(op)); - return true; - }, - - xvpShutdown: function () { - return this.xvpOp(1, 2); - }, - - xvpReboot: function () { - return this.xvpOp(1, 3); - }, - - xvpReset: function () { - return this.xvpOp(1, 4); - }, - - // Send a key press. If 'down' is not specified then send a down key - // followed by an up key. - sendKey: function (keysym, down) { - if (this._rfb_connection_state !== 'connected' || this._view_only) { - return false; - } - if (typeof down !== 'undefined') { - Log.Info("Sending keysym (" + (down ? "down" : "up") + "): " + keysym); - RFB.messages.keyEvent(this._sock, keysym, down ? 1 : 0); - } else { - Log.Info("Sending keysym (down + up): " + keysym); - RFB.messages.keyEvent(this._sock, keysym, 1); - RFB.messages.keyEvent(this._sock, keysym, 0); - } - return true; - }, - - clipboardPasteFrom: function (text) { - if (this._rfb_connection_state !== 'connected' || this._view_only) { - return; - } - RFB.messages.clientCutText(this._sock, text); - }, - - // Requests a change of remote desktop size. This message is an extension - // and may only be sent if we have received an ExtendedDesktopSize message - requestDesktopSize: function (width, height) { - if (this._rfb_connection_state !== 'connected' || this._view_only) { - return false; - } - - if (this._supportsSetDesktopSize) { - RFB.messages.setDesktopSize(this._sock, width, height, this._screen_id, this._screen_flags); - this._sock.flush(); + this._rfb_init_state = ''; + this._updateConnectionState('connecting'); return true; - } else { - return false; - } - }, + }, - // Private methods + disconnect: function () { + this._updateConnectionState('disconnecting'); + this._sock.off('error'); + this._sock.off('message'); + this._sock.off('open'); + }, - _connect: function () { - Log.Debug(">> RFB.connect"); - this._init_vars(); + sendPassword: function (passwd) { + this._rfb_password = passwd; + setTimeout(this._init_msg.bind(this), 0); + }, - var uri; - if (typeof UsingSocketIO !== 'undefined') { - uri = 'http'; - } else { - uri = this._encrypt ? 'wss' : 'ws'; - } + sendCtrlAltDel: function () { + if (this._rfb_connection_state !== 'connected' || this._view_only) { + return false; + } + _util2.default.Info("Sending Ctrl-Alt-Del"); - uri += '://' + this._rfb_host + ':' + this._rfb_port + '/' + this._rfb_path; - Log.Info("connecting to " + uri); + RFB.messages.keyEvent(this._sock, _keysym2.default.XK_Control_L, 1); + RFB.messages.keyEvent(this._sock, _keysym2.default.XK_Alt_L, 1); + RFB.messages.keyEvent(this._sock, _keysym2.default.XK_Delete, 1); + RFB.messages.keyEvent(this._sock, _keysym2.default.XK_Delete, 0); + RFB.messages.keyEvent(this._sock, _keysym2.default.XK_Alt_L, 0); + RFB.messages.keyEvent(this._sock, _keysym2.default.XK_Control_L, 0); + return true; + }, - try { - // WebSocket.onopen transitions to the RFB init states - this._sock.open(uri, this._wsProtocols); - } catch (e) { - if (e.name === 'SyntaxError') { - this._fail("Invalid host or port value given", e); + xvpOp: function (ver, op) { + if (this._rfb_xvp_ver < ver) { + return false; + } + _util2.default.Info("Sending XVP operation " + op + " (version " + ver + ")"); + this._sock.send_string("\xFA\x00" + String.fromCharCode(ver) + String.fromCharCode(op)); + return true; + }, + + xvpShutdown: function () { + return this.xvpOp(1, 2); + }, + + xvpReboot: function () { + return this.xvpOp(1, 3); + }, + + xvpReset: function () { + return this.xvpOp(1, 4); + }, + + // Send a key press. If 'down' is not specified then send a down key + // followed by an up key. + sendKey: function (keysym, down) { + if (this._rfb_connection_state !== 'connected' || this._view_only) { + return false; + } + if (typeof down !== 'undefined') { + _util2.default.Info("Sending keysym (" + (down ? "down" : "up") + "): " + keysym); + RFB.messages.keyEvent(this._sock, keysym, down ? 1 : 0); } else { - this._fail("Error while connecting", e); + _util2.default.Info("Sending keysym (down + up): " + keysym); + RFB.messages.keyEvent(this._sock, keysym, 1); + RFB.messages.keyEvent(this._sock, keysym, 0); } - } + return true; + }, - Log.Debug("<< RFB.connect"); - }, - - _disconnect: function () { - Log.Debug(">> RFB.disconnect"); - this._cleanup(); - this._sock.close(); - this._print_stats(); - Log.Debug("<< RFB.disconnect"); - }, - - _init_vars: function () { - // reset state - this._FBU.rects = 0; - this._FBU.subrects = 0; // RRE and HEXTILE - this._FBU.lines = 0; // RAW - this._FBU.tiles = 0; // HEXTILE - this._FBU.zlibs = []; // TIGHT zlib encoders - this._mouse_buttonMask = 0; - this._mouse_arr = []; - this._rfb_tightvnc = false; - - // Clear the per connection encoding stats - var i; - for (i = 0; i < this._encodings.length; i++) { - this._encStats[this._encodings[i][1]][0] = 0; - } - - for (i = 0; i < 4; i++) { - this._FBU.zlibs[i] = new _inflator2.default(); - } - }, - - _print_stats: function () { - Log.Info("Encoding stats for this connection:"); - var i, s; - for (i = 0; i < this._encodings.length; i++) { - s = this._encStats[this._encodings[i][1]]; - if (s[0] + s[1] > 0) { - Log.Info(" " + this._encodings[i][0] + ": " + s[0] + " rects"); - } - } - - Log.Info("Encoding stats since page load:"); - for (i = 0; i < this._encodings.length; i++) { - s = this._encStats[this._encodings[i][1]]; - Log.Info(" " + this._encodings[i][0] + ": " + s[1] + " rects"); - } - }, - - _cleanup: function () { - if (!this._view_only) { - this._keyboard.ungrab(); - } - if (!this._view_only) { - this._mouse.ungrab(); - } - this._display.defaultCursor(); - if (Log.get_logging() !== 'debug') { - // Show noVNC logo on load and when disconnected, unless in - // debug mode - this._display.clear(); - } - }, - - /* - * Connection states: - * connecting - * connected - * disconnecting - * disconnected - permanent state - */ - _updateConnectionState: function (state) { - var oldstate = this._rfb_connection_state; - - if (state === oldstate) { - Log.Debug("Already in state '" + state + "', ignoring"); - return; - } - - // The 'disconnected' state is permanent for each RFB object - if (oldstate === 'disconnected') { - Log.Error("Tried changing state of a disconnected RFB object"); - return; - } - - // Ensure proper transitions before doing anything - switch (state) { - case 'connected': - if (oldstate !== 'connecting') { - Log.Error("Bad transition to connected state, " + "previous connection state: " + oldstate); - return; - } - break; - - case 'disconnected': - if (oldstate !== 'disconnecting') { - Log.Error("Bad transition to disconnected state, " + "previous connection state: " + oldstate); - return; - } - break; - - case 'connecting': - if (oldstate !== '') { - Log.Error("Bad transition to connecting state, " + "previous connection state: " + oldstate); - return; - } - break; - - case 'disconnecting': - if (oldstate !== 'connected' && oldstate !== 'connecting') { - Log.Error("Bad transition to disconnecting state, " + "previous connection state: " + oldstate); - return; - } - break; - - default: - Log.Error("Unknown connection state: " + state); + clipboardPasteFrom: function (text) { + if (this._rfb_connection_state !== 'connected') { return; - } + } + RFB.messages.clientCutText(this._sock, text); + }, - // State change actions + // Requests a change of remote desktop size. This message is an extension + // and may only be sent if we have received an ExtendedDesktopSize message + requestDesktopSize: function (width, height) { + if (this._rfb_connection_state !== 'connected' || this._view_only) { + return false; + } - this._rfb_connection_state = state; - this._onUpdateState(this, state, oldstate); + if (this._supportsSetDesktopSize) { + RFB.messages.setDesktopSize(this._sock, width, height, this._screen_id, this._screen_flags); + this._sock.flush(); + return true; + } else { + return false; + } + }, - var smsg = "New state '" + state + "', was '" + oldstate + "'."; - Log.Debug(smsg); + // Private methods - if (this._disconnTimer && state !== 'disconnecting') { - Log.Debug("Clearing disconnect timer"); - clearTimeout(this._disconnTimer); - this._disconnTimer = null; + _connect: function () { + _util2.default.Debug(">> RFB.connect"); + this._init_vars(); - // make sure we don't get a double event - this._sock.off('close'); - } + var uri; + if (typeof UsingSocketIO !== 'undefined') { + uri = 'http'; + } else { + uri = this._encrypt ? 'wss' : 'ws'; + } - switch (state) { - case 'disconnected': - // Call onDisconnected callback after onUpdateState since - // we don't know if the UI only displays the latest message - if (this._rfb_disconnect_reason !== "") { - this._onDisconnected(this, this._rfb_disconnect_reason); + uri += '://' + this._rfb_host + ':' + this._rfb_port + '/' + this._rfb_path; + _util2.default.Info("connecting to " + uri); + + try { + // WebSocket.onopen transitions to the RFB init states + this._sock.open(uri, this._wsProtocols); + } catch (e) { + if (e.name === 'SyntaxError') { + this._fail("Invalid host or port value given", e); } else { - // No reason means clean disconnect - this._onDisconnected(this); + this._fail("Error while connecting", e); } - break; - - case 'connecting': - this._connect(); - break; - - case 'disconnecting': - this._disconnect(); - - this._disconnTimer = setTimeout(function () { - this._rfb_disconnect_reason = (0, _localization2.default)("Disconnect timeout"); - this._updateConnectionState('disconnected'); - }.bind(this), this._disconnectTimeout * 1000); - break; - } - }, - - /* Print errors and disconnect - * - * The optional parameter 'details' is used for information that - * should be logged but not sent to the user interface. - */ - _fail: function (msg, details) { - var fullmsg = msg; - if (typeof details !== 'undefined') { - fullmsg = msg + " (" + details + ")"; - } - switch (this._rfb_connection_state) { - case 'disconnecting': - Log.Error("Failed when disconnecting: " + fullmsg); - break; - case 'connected': - Log.Error("Failed while connected: " + fullmsg); - break; - case 'connecting': - Log.Error("Failed when connecting: " + fullmsg); - break; - default: - Log.Error("RFB failure: " + fullmsg); - break; - } - this._rfb_disconnect_reason = msg; //This is sent to the UI - - // Transition to disconnected without waiting for socket to close - this._updateConnectionState('disconnecting'); - this._updateConnectionState('disconnected'); - - return false; - }, - - /* - * Send a notification to the UI. Valid levels are: - * 'normal'|'warn'|'error' - * - * NOTE: Options could be added in the future. - * NOTE: If this function is called multiple times, remember that the - * interface could be only showing the latest notification. - */ - _notification: function (msg, level, options) { - switch (level) { - case 'normal': - case 'warn': - case 'error': - Log.Debug("Notification[" + level + "]:" + msg); - break; - default: - Log.Error("Invalid notification level: " + level); - return; - } - - if (options) { - this._onNotification(this, msg, level, options); - } else { - this._onNotification(this, msg, level); - } - }, - - _handle_message: function () { - if (this._sock.rQlen() === 0) { - Log.Warn("handle_message called on an empty receive queue"); - return; - } - - switch (this._rfb_connection_state) { - case 'disconnected': - Log.Error("Got data while disconnected"); - break; - case 'connected': - while (true) { - if (this._flushing) { - break; - } - if (!this._normal_msg()) { - break; - } - if (this._sock.rQlen() === 0) { - break; - } - } - break; - default: - this._init_msg(); - break; - } - }, - - _handleKeyPress: function (keyevent) { - if (this._view_only) { - return; - } // View only, skip keyboard, events - - var down = keyevent.type == 'keydown'; - if (this._qemuExtKeyEventSupported) { - var scancode = _xtscancodes2.default[keyevent.code]; - if (scancode) { - var keysym = keyevent.keysym; - RFB.messages.QEMUExtendedKeyEvent(this._sock, keysym, down, scancode); - } else { - Log.Error('Unable to find a xt scancode for code = ' + keyevent.code); } - } else { - keysym = keyevent.keysym.keysym; - RFB.messages.keyEvent(this._sock, keysym, down); - } - }, - _handleMouseButton: function (x, y, down, bmask) { - if (down) { - this._mouse_buttonMask |= bmask; - } else { - this._mouse_buttonMask ^= bmask; - } + _util2.default.Debug("<< RFB.connect"); + }, - if (this._viewportDrag) { - if (down && !this._viewportDragging) { - this._viewportDragging = true; - this._viewportDragPos = { 'x': x, 'y': y }; + _disconnect: function () { + _util2.default.Debug(">> RFB.disconnect"); + this._cleanup(); + this._sock.close(); + this._print_stats(); + _util2.default.Debug("<< RFB.disconnect"); + }, + + _init_vars: function () { + // reset state + this._FBU.rects = 0; + this._FBU.subrects = 0; // RRE and HEXTILE + this._FBU.lines = 0; // RAW + this._FBU.tiles = 0; // HEXTILE + this._FBU.zlibs = []; // TIGHT zlib encoders + this._mouse_buttonMask = 0; + this._mouse_arr = []; + this._rfb_tightvnc = false; + + // Clear the per connection encoding stats + var i; + for (i = 0; i < this._encodings.length; i++) { + this._encStats[this._encodings[i][1]][0] = 0; + } + + for (i = 0; i < 4; i++) { + this._FBU.zlibs[i] = new _inflator2.default.Inflate(); + } + }, + + _print_stats: function () { + _util2.default.Info("Encoding stats for this connection:"); + var i, s; + for (i = 0; i < this._encodings.length; i++) { + s = this._encStats[this._encodings[i][1]]; + if (s[0] + s[1] > 0) { + _util2.default.Info(" " + this._encodings[i][0] + ": " + s[0] + " rects"); + } + } + + _util2.default.Info("Encoding stats since page load:"); + for (i = 0; i < this._encodings.length; i++) { + s = this._encStats[this._encodings[i][1]]; + _util2.default.Info(" " + this._encodings[i][0] + ": " + s[1] + " rects"); + } + }, + + _cleanup: function () { + if (this._display && this._display.get_context()) { + if (!this._view_only) { + this._keyboard.ungrab(); + } + if (!this._view_only) { + this._mouse.ungrab(); + } + this._display.defaultCursor(); + if (_util2.default.get_logging() !== 'debug') { + // Show noVNC logo on load and when disconnected, unless in + // debug mode + this._display.clear(); + } + } + }, + + /* + * Connection states: + * connecting + * connected + * disconnecting + * disconnected - permanent state + */ + _updateConnectionState: function (state) { + var oldstate = this._rfb_connection_state; + + if (state === oldstate) { + _util2.default.Debug("Already in state '" + state + "', ignoring"); + return; + } + + // The 'disconnected' state is permanent for each RFB object + if (oldstate === 'disconnected') { + _util2.default.Error("Tried changing state of a disconnected RFB object"); + return; + } + + // Ensure proper transitions before doing anything + switch (state) { + case 'connected': + if (oldstate !== 'connecting') { + _util2.default.Error("Bad transition to connected state, " + "previous connection state: " + oldstate); + return; + } + break; + + case 'disconnected': + if (oldstate !== 'disconnecting') { + _util2.default.Error("Bad transition to disconnected state, " + "previous connection state: " + oldstate); + return; + } + break; + + case 'connecting': + if (oldstate !== '') { + _util2.default.Error("Bad transition to connecting state, " + "previous connection state: " + oldstate); + return; + } + break; + + case 'disconnecting': + if (oldstate !== 'connected' && oldstate !== 'connecting') { + _util2.default.Error("Bad transition to disconnecting state, " + "previous connection state: " + oldstate); + return; + } + break; + + default: + _util2.default.Error("Unknown connection state: " + state); + return; + } + + // State change actions + + this._rfb_connection_state = state; + this._onUpdateState(this, state, oldstate); + + var smsg = "New state '" + state + "', was '" + oldstate + "'."; + _util2.default.Debug(smsg); + + if (this._disconnTimer && state !== 'disconnecting') { + _util2.default.Debug("Clearing disconnect timer"); + clearTimeout(this._disconnTimer); + this._disconnTimer = null; + + // make sure we don't get a double event + this._sock.off('close'); + } + + switch (state) { + case 'disconnected': + // Call onDisconnected callback after onUpdateState since + // we don't know if the UI only displays the latest message + if (this._rfb_disconnect_reason !== "") { + this._onDisconnected(this, this._rfb_disconnect_reason); + } else { + // No reason means clean disconnect + this._onDisconnected(this); + } + break; + + case 'connecting': + this._connect(); + break; + + case 'disconnecting': + this._disconnect(); + + this._disconnTimer = setTimeout(function () { + this._rfb_disconnect_reason = "Disconnect timeout"; + this._updateConnectionState('disconnected'); + }.bind(this), this._disconnectTimeout * 1000); + break; + } + }, + + /* Print errors and disconnect + * + * The optional parameter 'details' is used for information that + * should be logged but not sent to the user interface. + */ + _fail: function (msg, details) { + var fullmsg = msg; + if (typeof details !== 'undefined') { + fullmsg = msg + " (" + details + ")"; + } + switch (this._rfb_connection_state) { + case 'disconnecting': + _util2.default.Error("Failed when disconnecting: " + fullmsg); + break; + case 'connected': + _util2.default.Error("Failed while connected: " + fullmsg); + break; + case 'connecting': + _util2.default.Error("Failed when connecting: " + fullmsg); + break; + default: + _util2.default.Error("RFB failure: " + fullmsg); + break; + } + this._rfb_disconnect_reason = msg; //This is sent to the UI + + // Transition to disconnected without waiting for socket to close + this._updateConnectionState('disconnecting'); + this._updateConnectionState('disconnected'); + + return false; + }, + + /* + * Send a notification to the UI. Valid levels are: + * 'normal'|'warn'|'error' + * + * NOTE: Options could be added in the future. + * NOTE: If this function is called multiple times, remember that the + * interface could be only showing the latest notification. + */ + _notification: function (msg, level, options) { + switch (level) { + case 'normal': + case 'warn': + case 'error': + _util2.default.Debug("Notification[" + level + "]:" + msg); + break; + default: + _util2.default.Error("Invalid notification level: " + level); + return; + } + + if (options) { + this._onNotification(this, msg, level, options); + } else { + this._onNotification(this, msg, level); + } + }, + + _handle_message: function () { + if (this._sock.rQlen() === 0) { + _util2.default.Warn("handle_message called on an empty receive queue"); + return; + } + + switch (this._rfb_connection_state) { + case 'disconnected': + _util2.default.Error("Got data while disconnected"); + break; + case 'connected': + while (true) { + if (this._flushing) { + break; + } + if (!this._normal_msg()) { + break; + } + if (this._sock.rQlen() === 0) { + break; + } + } + break; + default: + this._init_msg(); + break; + } + }, + + _handleKeyPress: function (keyevent) { + if (this._view_only) { + return; + } // View only, skip keyboard, events + + var down = keyevent.type == 'keydown'; + if (this._qemuExtKeyEventSupported) { + var scancode = _xtscancodes2.default[keyevent.code]; + if (scancode) { + var keysym = keyevent.keysym; + RFB.messages.QEMUExtendedKeyEvent(this._sock, keysym, down, scancode); + } else { + _util2.default.Error('Unable to find a xt scancode for code = ' + keyevent.code); + } + } else { + keysym = keyevent.keysym.keysym; + RFB.messages.keyEvent(this._sock, keysym, down); + } + }, + + _handleMouseButton: function (x, y, down, bmask) { + if (down) { + this._mouse_buttonMask |= bmask; + } else { + this._mouse_buttonMask ^= bmask; + } + + if (this._viewportDrag) { + if (down && !this._viewportDragging) { + this._viewportDragging = true; + this._viewportDragPos = { 'x': x, 'y': y }; + + // Skip sending mouse events + return; + } else { + this._viewportDragging = false; + + // If the viewport didn't actually move, then treat as a mouse click event + // Send the button down event here, as the button up event is sent at the end of this function + if (!this._viewportHasMoved && !this._view_only) { + RFB.messages.pointerEvent(this._sock, this._display.absX(x), this._display.absY(y), bmask); + } + this._viewportHasMoved = false; + } + } + + if (this._view_only) { + return; + } // View only, skip mouse events + + if (this._rfb_connection_state !== 'connected') { + return; + } + RFB.messages.pointerEvent(this._sock, this._display.absX(x), this._display.absY(y), this._mouse_buttonMask); + }, + + _handleMouseMove: function (x, y) { + if (this._viewportDragging) { + var deltaX = this._viewportDragPos.x - x; + var deltaY = this._viewportDragPos.y - y; + + // The goal is to trigger on a certain physical width, the + // devicePixelRatio brings us a bit closer but is not optimal. + var dragThreshold = 10 * (window.devicePixelRatio || 1); + + if (this._viewportHasMoved || Math.abs(deltaX) > dragThreshold || Math.abs(deltaY) > dragThreshold) { + this._viewportHasMoved = true; + + this._viewportDragPos = { 'x': x, 'y': y }; + this._display.viewportChangePos(deltaX, deltaY); + } // Skip sending mouse events return; - } else { - this._viewportDragging = false; + } - // If the viewport didn't actually move, then treat as a mouse click event - // Send the button down event here, as the button up event is sent at the end of this function - if (!this._viewportHasMoved && !this._view_only) { - RFB.messages.pointerEvent(this._sock, this._display.absX(x), this._display.absY(y), bmask); + if (this._view_only) { + return; + } // View only, skip mouse events + + if (this._rfb_connection_state !== 'connected') { + return; + } + RFB.messages.pointerEvent(this._sock, this._display.absX(x), this._display.absY(y), this._mouse_buttonMask); + }, + + // Message Handlers + + _negotiate_protocol_version: function () { + if (this._sock.rQlen() < 12) { + return this._fail("Error while negotiating with server", "Incomplete protocol version"); + } + + var sversion = this._sock.rQshiftStr(12).substr(4, 7); + _util2.default.Info("Server ProtocolVersion: " + sversion); + var is_repeater = 0; + switch (sversion) { + case "000.000": + // UltraVNC repeater + is_repeater = 1; + break; + case "003.003": + case "003.006": // UltraVNC + case "003.889": + // Apple Remote Desktop + this._rfb_version = 3.3; + break; + case "003.007": + this._rfb_version = 3.7; + break; + case "003.008": + case "004.000": // Intel AMT KVM + case "004.001": // RealVNC 4.6 + case "005.000": + // RealVNC 5.3 + this._rfb_version = 3.8; + break; + default: + return this._fail("Unsupported server", "Invalid server version: " + sversion); + } + + if (is_repeater) { + var repeaterID = this._repeaterID; + while (repeaterID.length < 250) { + repeaterID += "\0"; } - this._viewportHasMoved = false; - } - } - - if (this._view_only) { - return; - } // View only, skip mouse events - - if (this._rfb_connection_state !== 'connected') { - return; - } - RFB.messages.pointerEvent(this._sock, this._display.absX(x), this._display.absY(y), this._mouse_buttonMask); - }, - - _handleMouseMove: function (x, y) { - if (this._viewportDragging) { - var deltaX = this._viewportDragPos.x - x; - var deltaY = this._viewportDragPos.y - y; - - // The goal is to trigger on a certain physical width, the - // devicePixelRatio brings us a bit closer but is not optimal. - var dragThreshold = 10 * (window.devicePixelRatio || 1); - - if (this._viewportHasMoved || Math.abs(deltaX) > dragThreshold || Math.abs(deltaY) > dragThreshold) { - this._viewportHasMoved = true; - - this._viewportDragPos = { 'x': x, 'y': y }; - this._display.viewportChangePos(deltaX, deltaY); + this._sock.send_string(repeaterID); + return true; } - // Skip sending mouse events - return; - } - - if (this._view_only) { - return; - } // View only, skip mouse events - - if (this._rfb_connection_state !== 'connected') { - return; - } - RFB.messages.pointerEvent(this._sock, this._display.absX(x), this._display.absY(y), this._mouse_buttonMask); - }, - - // Message Handlers - - _negotiate_protocol_version: function () { - if (this._sock.rQlen() < 12) { - return this._fail("Error while negotiating with server", "Incomplete protocol version"); - } - - var sversion = this._sock.rQshiftStr(12).substr(4, 7); - Log.Info("Server ProtocolVersion: " + sversion); - var is_repeater = 0; - switch (sversion) { - case "000.000": - // UltraVNC repeater - is_repeater = 1; - break; - case "003.003": - case "003.006": // UltraVNC - case "003.889": - // Apple Remote Desktop - this._rfb_version = 3.3; - break; - case "003.007": - this._rfb_version = 3.7; - break; - case "003.008": - case "004.000": // Intel AMT KVM - case "004.001": // RealVNC 4.6 - case "005.000": - // RealVNC 5.3 - this._rfb_version = 3.8; - break; - default: - return this._fail("Unsupported server", "Invalid server version: " + sversion); - } - - if (is_repeater) { - var repeaterID = this._repeaterID; - while (repeaterID.length < 250) { - repeaterID += "\0"; - } - this._sock.send_string(repeaterID); - return true; - } - - if (this._rfb_version > this._rfb_max_version) { - this._rfb_version = this._rfb_max_version; - } - - var cversion = "00" + parseInt(this._rfb_version, 10) + ".00" + this._rfb_version * 10 % 10; - this._sock.send_string("RFB " + cversion + "\n"); - Log.Debug('Sent ProtocolVersion: ' + cversion); - - this._rfb_init_state = 'Security'; - }, - - _negotiate_security: function () { - // Polyfill since IE and PhantomJS doesn't have - // TypedArray.includes() - function includes(item, array) { - for (var i = 0; i < array.length; i++) { - if (array[i] === item) { - return true; - } - } - return false; - } - - if (this._rfb_version >= 3.7) { - // Server sends supported list, client decides - var num_types = this._sock.rQshift8(); - if (this._sock.rQwait("security type", num_types, 1)) { - return false; + if (this._rfb_version > this._rfb_max_version) { + this._rfb_version = this._rfb_max_version; } - if (num_types === 0) { - var strlen = this._sock.rQshift32(); - var reason = this._sock.rQshiftStr(strlen); - return this._fail("Error while negotiating with server", "Security failure: " + reason); - } + var cversion = "00" + parseInt(this._rfb_version, 10) + ".00" + this._rfb_version * 10 % 10; + this._sock.send_string("RFB " + cversion + "\n"); + _util2.default.Debug('Sent ProtocolVersion: ' + cversion); - var types = this._sock.rQshiftBytes(num_types); - Log.Debug("Server security types: " + types); + this._rfb_init_state = 'Security'; + }, - // Look for each auth in preferred order - this._rfb_auth_scheme = 0; - if (includes(1, types)) { - this._rfb_auth_scheme = 1; // None - } else if (includes(22, types)) { - this._rfb_auth_scheme = 22; // XVP - } else if (includes(16, types)) { - this._rfb_auth_scheme = 16; // Tight - } else if (includes(2, types)) { - this._rfb_auth_scheme = 2; // VNC Auth - } else { - return this._fail("Unsupported server", "Unsupported security types: " + types); - } - - this._sock.send([this._rfb_auth_scheme]); - } else { - // Server decides - if (this._sock.rQwait("security scheme", 4)) { - return false; - } - this._rfb_auth_scheme = this._sock.rQshift32(); - } - - this._rfb_init_state = 'Authentication'; - Log.Debug('Authenticating using scheme: ' + this._rfb_auth_scheme); - - return this._init_msg(); // jump to authentication - }, - - // authentication - _negotiate_xvp_auth: function () { - var xvp_sep = this._xvp_password_sep; - var xvp_auth = this._rfb_password.split(xvp_sep); - if (xvp_auth.length < 3) { - var msg = 'XVP credentials required (user' + xvp_sep + 'target' + xvp_sep + 'password) -- got only ' + this._rfb_password; - this._onPasswordRequired(this, msg); - return false; - } - - var xvp_auth_str = String.fromCharCode(xvp_auth[0].length) + String.fromCharCode(xvp_auth[1].length) + xvp_auth[0] + xvp_auth[1]; - this._sock.send_string(xvp_auth_str); - this._rfb_password = xvp_auth.slice(2).join(xvp_sep); - this._rfb_auth_scheme = 2; - return this._negotiate_authentication(); - }, - - _negotiate_std_vnc_auth: function () { - if (this._rfb_password.length === 0) { - this._onPasswordRequired(this); - return false; - } - - if (this._sock.rQwait("auth challenge", 16)) { - return false; - } - - // TODO(directxman12): make genDES not require an Array - var challenge = Array.prototype.slice.call(this._sock.rQshiftBytes(16)); - var response = RFB.genDES(this._rfb_password, challenge); - this._sock.send(response); - this._rfb_init_state = "SecurityResult"; - return true; - }, - - _negotiate_tight_tunnels: function (numTunnels) { - var clientSupportedTunnelTypes = { - 0: { vendor: 'TGHT', signature: 'NOTUNNEL' } - }; - var serverSupportedTunnelTypes = {}; - // receive tunnel capabilities - for (var i = 0; i < numTunnels; i++) { - var cap_code = this._sock.rQshift32(); - var cap_vendor = this._sock.rQshiftStr(4); - var cap_signature = this._sock.rQshiftStr(8); - serverSupportedTunnelTypes[cap_code] = { vendor: cap_vendor, signature: cap_signature }; - } - - // choose the notunnel type - if (serverSupportedTunnelTypes[0]) { - if (serverSupportedTunnelTypes[0].vendor != clientSupportedTunnelTypes[0].vendor || serverSupportedTunnelTypes[0].signature != clientSupportedTunnelTypes[0].signature) { - return this._fail("Unsupported server", "Client's tunnel type had the incorrect " + "vendor or signature"); - } - this._sock.send([0, 0, 0, 0]); // use NOTUNNEL - return false; // wait until we receive the sub auth count to continue - } else { - return this._fail("Unsupported server", "Server wanted tunnels, but doesn't support " + "the notunnel type"); - } - }, - - _negotiate_tight_auth: function () { - if (!this._rfb_tightvnc) { - // first pass, do the tunnel negotiation - if (this._sock.rQwait("num tunnels", 4)) { - return false; - } - var numTunnels = this._sock.rQshift32(); - if (numTunnels > 0 && this._sock.rQwait("tunnel capabilities", 16 * numTunnels, 4)) { - return false; - } - - this._rfb_tightvnc = true; - - if (numTunnels > 0) { - this._negotiate_tight_tunnels(numTunnels); - return false; // wait until we receive the sub auth to continue - } - } - - // second pass, do the sub-auth negotiation - if (this._sock.rQwait("sub auth count", 4)) { - return false; - } - var subAuthCount = this._sock.rQshift32(); - if (subAuthCount === 0) { - // empty sub-auth list received means 'no auth' subtype selected - this._rfb_init_state = 'SecurityResult'; - return true; - } - - if (this._sock.rQwait("sub auth capabilities", 16 * subAuthCount, 4)) { - return false; - } - - var clientSupportedTypes = { - 'STDVNOAUTH__': 1, - 'STDVVNCAUTH_': 2 - }; - - var serverSupportedTypes = []; - - for (var i = 0; i < subAuthCount; i++) { - var capNum = this._sock.rQshift32(); - var capabilities = this._sock.rQshiftStr(12); - serverSupportedTypes.push(capabilities); - } - - for (var authType in clientSupportedTypes) { - if (serverSupportedTypes.indexOf(authType) != -1) { - this._sock.send([0, 0, 0, clientSupportedTypes[authType]]); - - switch (authType) { - case 'STDVNOAUTH__': - // no auth - this._rfb_init_state = 'SecurityResult'; - return true; - case 'STDVVNCAUTH_': - // VNC auth - this._rfb_auth_scheme = 2; - return this._init_msg(); - default: - return this._fail("Unsupported server", "Unsupported tiny auth scheme: " + authType); - } - } - } - - return this._fail("Unsupported server", "No supported sub-auth types!"); - }, - - _negotiate_authentication: function () { - switch (this._rfb_auth_scheme) { - case 0: - // connection failed - if (this._sock.rQwait("auth reason", 4)) { + _negotiate_security: function () { + if (this._rfb_version >= 3.7) { + // Server sends supported list, client decides + var num_types = this._sock.rQshift8(); + if (this._sock.rQwait("security type", num_types, 1)) { return false; } - var strlen = this._sock.rQshift32(); - var reason = this._sock.rQshiftStr(strlen); - return this._fail("Authentication failure", reason); - case 1: - // no auth - if (this._rfb_version >= 3.8) { - this._rfb_init_state = 'SecurityResult'; - return true; + if (num_types === 0) { + var strlen = this._sock.rQshift32(); + var reason = this._sock.rQshiftStr(strlen); + return this._fail("Error while negotiating with server", "Security failure: " + reason); } - this._rfb_init_state = 'ClientInitialisation'; - return this._init_msg(); - case 22: - // XVP auth - return this._negotiate_xvp_auth(); + this._rfb_auth_scheme = 0; + var types = this._sock.rQshiftBytes(num_types); + _util2.default.Debug("Server security types: " + types); + for (var i = 0; i < types.length; i++) { + switch (types[i]) { + case 1: // None + case 2: // VNC Authentication + case 16: // Tight + case 22: + // XVP + if (types[i] > this._rfb_auth_scheme) { + this._rfb_auth_scheme = types[i]; + } + break; + default: + break; + } + } - case 2: - // VNC authentication - return this._negotiate_std_vnc_auth(); + if (this._rfb_auth_scheme === 0) { + return this._fail("Unsupported server", "Unsupported security types: " + types); + } - case 16: - // TightVNC Security Type - return this._negotiate_tight_auth(); + this._sock.send([this._rfb_auth_scheme]); + } else { + // Server decides + if (this._sock.rQwait("security scheme", 4)) { + return false; + } + this._rfb_auth_scheme = this._sock.rQshift32(); + } - default: - return this._fail("Unsupported server", "Unsupported auth scheme: " + this._rfb_auth_scheme); - } - }, + this._rfb_init_state = 'Authentication'; + _util2.default.Debug('Authenticating using scheme: ' + this._rfb_auth_scheme); - _handle_security_result: function () { - if (this._sock.rQwait('VNC auth response ', 4)) { - return false; - } - switch (this._sock.rQshift32()) { - case 0: - // OK - this._rfb_init_state = 'ClientInitialisation'; - Log.Debug('Authentication OK'); - return this._init_msg(); - case 1: - // failed - if (this._rfb_version >= 3.8) { - var length = this._sock.rQshift32(); - if (this._sock.rQwait("SecurityResult reason", length, 8)) { + return this._init_msg(); // jump to authentication + }, + + // authentication + _negotiate_xvp_auth: function () { + var xvp_sep = this._xvp_password_sep; + var xvp_auth = this._rfb_password.split(xvp_sep); + if (xvp_auth.length < 3) { + var msg = 'XVP credentials required (user' + xvp_sep + 'target' + xvp_sep + 'password) -- got only ' + this._rfb_password; + this._onPasswordRequired(this, msg); + return false; + } + + var xvp_auth_str = String.fromCharCode(xvp_auth[0].length) + String.fromCharCode(xvp_auth[1].length) + xvp_auth[0] + xvp_auth[1]; + this._sock.send_string(xvp_auth_str); + this._rfb_password = xvp_auth.slice(2).join(xvp_sep); + this._rfb_auth_scheme = 2; + return this._negotiate_authentication(); + }, + + _negotiate_std_vnc_auth: function () { + if (this._rfb_password.length === 0) { + this._onPasswordRequired(this); + return false; + } + + if (this._sock.rQwait("auth challenge", 16)) { + return false; + } + + // TODO(directxman12): make genDES not require an Array + var challenge = Array.prototype.slice.call(this._sock.rQshiftBytes(16)); + var response = RFB.genDES(this._rfb_password, challenge); + this._sock.send(response); + this._rfb_init_state = "SecurityResult"; + return true; + }, + + _negotiate_tight_tunnels: function (numTunnels) { + var clientSupportedTunnelTypes = { + 0: { vendor: 'TGHT', signature: 'NOTUNNEL' } + }; + var serverSupportedTunnelTypes = {}; + // receive tunnel capabilities + for (var i = 0; i < numTunnels; i++) { + var cap_code = this._sock.rQshift32(); + var cap_vendor = this._sock.rQshiftStr(4); + var cap_signature = this._sock.rQshiftStr(8); + serverSupportedTunnelTypes[cap_code] = { vendor: cap_vendor, signature: cap_signature }; + } + + // choose the notunnel type + if (serverSupportedTunnelTypes[0]) { + if (serverSupportedTunnelTypes[0].vendor != clientSupportedTunnelTypes[0].vendor || serverSupportedTunnelTypes[0].signature != clientSupportedTunnelTypes[0].signature) { + return this._fail("Unsupported server", "Client's tunnel type had the incorrect " + "vendor or signature"); + } + this._sock.send([0, 0, 0, 0]); // use NOTUNNEL + return false; // wait until we receive the sub auth count to continue + } else { + return this._fail("Unsupported server", "Server wanted tunnels, but doesn't support " + "the notunnel type"); + } + }, + + _negotiate_tight_auth: function () { + if (!this._rfb_tightvnc) { + // first pass, do the tunnel negotiation + if (this._sock.rQwait("num tunnels", 4)) { + return false; + } + var numTunnels = this._sock.rQshift32(); + if (numTunnels > 0 && this._sock.rQwait("tunnel capabilities", 16 * numTunnels, 4)) { + return false; + } + + this._rfb_tightvnc = true; + + if (numTunnels > 0) { + this._negotiate_tight_tunnels(numTunnels); + return false; // wait until we receive the sub auth to continue + } + } + + // second pass, do the sub-auth negotiation + if (this._sock.rQwait("sub auth count", 4)) { + return false; + } + var subAuthCount = this._sock.rQshift32(); + if (subAuthCount === 0) { + // empty sub-auth list received means 'no auth' subtype selected + this._updateState('SecurityResult'); + return true; + } + + if (this._sock.rQwait("sub auth capabilities", 16 * subAuthCount, 4)) { + return false; + } + + var clientSupportedTypes = { + 'STDVNOAUTH__': 1, + 'STDVVNCAUTH_': 2 + }; + + var serverSupportedTypes = []; + + for (var i = 0; i < subAuthCount; i++) { + var capNum = this._sock.rQshift32(); + var capabilities = this._sock.rQshiftStr(12); + serverSupportedTypes.push(capabilities); + } + + for (var authType in clientSupportedTypes) { + if (serverSupportedTypes.indexOf(authType) !== -1) { + this._sock.send([0, 0, 0, clientSupportedTypes[authType]]); + + switch (authType) { + case 'STDVNOAUTH__': + // no auth + this._rfb_init_state = 'SecurityResult'; + return true; + case 'STDVVNCAUTH_': + // VNC auth + this._rfb_auth_scheme = 2; + return this._init_msg(); + default: + return this._fail("Unsupported server", "Unsupported tiny auth scheme: " + authType); + } + } + } + + return this._fail("Unsupported server", "No supported sub-auth types!"); + }, + + _negotiate_authentication: function () { + switch (this._rfb_auth_scheme) { + case 0: + // connection failed + if (this._sock.rQwait("auth reason", 4)) { return false; } - var reason = this._sock.rQshiftStr(length); + var strlen = this._sock.rQshift32(); + var reason = this._sock.rQshiftStr(strlen); return this._fail("Authentication failure", reason); - } else { - return this._fail("Authentication failure"); + + case 1: + // no auth + if (this._rfb_version >= 3.8) { + this._rfb_init_state = 'SecurityResult'; + return true; + } + this._rfb_init_state = 'ClientInitialisation'; + return this._init_msg(); + + case 22: + // XVP auth + return this._negotiate_xvp_auth(); + + case 2: + // VNC authentication + return this._negotiate_std_vnc_auth(); + + case 16: + // TightVNC Security Type + return this._negotiate_tight_auth(); + + default: + return this._fail("Unsupported server", "Unsupported auth scheme: " + this._rfb_auth_scheme); + } + }, + + _handle_security_result: function () { + if (this._sock.rQwait('VNC auth response ', 4)) { + return false; + } + switch (this._sock.rQshift32()) { + case 0: + // OK + this._rfb_init_state = 'ClientInitialisation'; + _util2.default.Debug('Authentication OK'); + return this._init_msg(); + case 1: + // failed + if (this._rfb_version >= 3.8) { + var length = this._sock.rQshift32(); + if (this._sock.rQwait("SecurityResult reason", length, 8)) { + return false; + } + var reason = this._sock.rQshiftStr(length); + return this._fail("Authentication failure", reason); + } else { + return this._fail("Authentication failure"); + } + return false; + case 2: + return this._fail("Too many authentication attempts"); + default: + return this._fail("Unsupported server", "Unknown SecurityResult"); + } + }, + + _negotiate_server_init: function () { + if (this._sock.rQwait("server initialization", 24)) { + return false; + } + + /* Screen size */ + this._fb_width = this._sock.rQshift16(); + this._fb_height = this._sock.rQshift16(); + this._destBuff = new Uint8Array(this._fb_width * this._fb_height * 4); + + /* PIXEL_FORMAT */ + var bpp = this._sock.rQshift8(); + var depth = this._sock.rQshift8(); + var big_endian = this._sock.rQshift8(); + var true_color = this._sock.rQshift8(); + + var red_max = this._sock.rQshift16(); + var green_max = this._sock.rQshift16(); + var blue_max = this._sock.rQshift16(); + var red_shift = this._sock.rQshift8(); + var green_shift = this._sock.rQshift8(); + var blue_shift = this._sock.rQshift8(); + this._sock.rQskipBytes(3); // padding + + // NB(directxman12): we don't want to call any callbacks or print messages until + // *after* we're past the point where we could backtrack + + /* Connection name/title */ + var name_length = this._sock.rQshift32(); + if (this._sock.rQwait('server init name', name_length, 24)) { + return false; + } + this._fb_name = _util2.default.decodeUTF8(this._sock.rQshiftStr(name_length)); + + if (this._rfb_tightvnc) { + if (this._sock.rQwait('TightVNC extended server init header', 8, 24 + name_length)) { + return false; } - return false; - case 2: - return this._fail("Too many authentication attempts"); - default: - return this._fail("Unsupported server", "Unknown SecurityResult"); - } - }, + // In TightVNC mode, ServerInit message is extended + var numServerMessages = this._sock.rQshift16(); + var numClientMessages = this._sock.rQshift16(); + var numEncodings = this._sock.rQshift16(); + this._sock.rQskipBytes(2); // padding - _negotiate_server_init: function () { - if (this._sock.rQwait("server initialization", 24)) { - return false; - } + var totalMessagesLength = (numServerMessages + numClientMessages + numEncodings) * 16; + if (this._sock.rQwait('TightVNC extended server init header', totalMessagesLength, 32 + name_length)) { + return false; + } - /* Screen size */ - this._fb_width = this._sock.rQshift16(); - this._fb_height = this._sock.rQshift16(); - this._destBuff = new Uint8Array(this._fb_width * this._fb_height * 4); + // we don't actually do anything with the capability information that TIGHT sends, + // so we just skip the all of this. - /* PIXEL_FORMAT */ - var bpp = this._sock.rQshift8(); - var depth = this._sock.rQshift8(); - var big_endian = this._sock.rQshift8(); - var true_color = this._sock.rQshift8(); + // TIGHT server message capabilities + this._sock.rQskipBytes(16 * numServerMessages); - var red_max = this._sock.rQshift16(); - var green_max = this._sock.rQshift16(); - var blue_max = this._sock.rQshift16(); - var red_shift = this._sock.rQshift8(); - var green_shift = this._sock.rQshift8(); - var blue_shift = this._sock.rQshift8(); - this._sock.rQskipBytes(3); // padding + // TIGHT client message capabilities + this._sock.rQskipBytes(16 * numClientMessages); - // NB(directxman12): we don't want to call any callbacks or print messages until - // *after* we're past the point where we could backtrack - - /* Connection name/title */ - var name_length = this._sock.rQshift32(); - if (this._sock.rQwait('server init name', name_length, 24)) { - return false; - } - this._fb_name = (0, _strings.decodeUTF8)(this._sock.rQshiftStr(name_length)); - - if (this._rfb_tightvnc) { - if (this._sock.rQwait('TightVNC extended server init header', 8, 24 + name_length)) { - return false; - } - // In TightVNC mode, ServerInit message is extended - var numServerMessages = this._sock.rQshift16(); - var numClientMessages = this._sock.rQshift16(); - var numEncodings = this._sock.rQshift16(); - this._sock.rQskipBytes(2); // padding - - var totalMessagesLength = (numServerMessages + numClientMessages + numEncodings) * 16; - if (this._sock.rQwait('TightVNC extended server init header', totalMessagesLength, 32 + name_length)) { - return false; + // TIGHT encoding capabilities + this._sock.rQskipBytes(16 * numEncodings); } - // we don't actually do anything with the capability information that TIGHT sends, - // so we just skip the all of this. + // NB(directxman12): these are down here so that we don't run them multiple times + // if we backtrack + _util2.default.Info("Screen: " + this._fb_width + "x" + this._fb_height + ", bpp: " + bpp + ", depth: " + depth + ", big_endian: " + big_endian + ", true_color: " + true_color + ", red_max: " + red_max + ", green_max: " + green_max + ", blue_max: " + blue_max + ", red_shift: " + red_shift + ", green_shift: " + green_shift + ", blue_shift: " + blue_shift); - // TIGHT server message capabilities - this._sock.rQskipBytes(16 * numServerMessages); + if (big_endian !== 0) { + _util2.default.Warn("Server native endian is not little endian"); + } - // TIGHT client message capabilities - this._sock.rQskipBytes(16 * numClientMessages); + if (red_shift !== 16) { + _util2.default.Warn("Server native red-shift is not 16"); + } - // TIGHT encoding capabilities - this._sock.rQskipBytes(16 * numEncodings); - } + if (blue_shift !== 0) { + _util2.default.Warn("Server native blue-shift is not 0"); + } - // NB(directxman12): these are down here so that we don't run them multiple times - // if we backtrack - Log.Info("Screen: " + this._fb_width + "x" + this._fb_height + ", bpp: " + bpp + ", depth: " + depth + ", big_endian: " + big_endian + ", true_color: " + true_color + ", red_max: " + red_max + ", green_max: " + green_max + ", blue_max: " + blue_max + ", red_shift: " + red_shift + ", green_shift: " + green_shift + ", blue_shift: " + blue_shift); + // we're past the point where we could backtrack, so it's safe to call this + this._onDesktopName(this, this._fb_name); - if (big_endian !== 0) { - Log.Warn("Server native endian is not little endian"); - } + if (this._true_color && this._fb_name === "Intel(r) AMT KVM") { + _util2.default.Warn("Intel AMT KVM only supports 8/16 bit depths. Disabling true color"); + this._true_color = false; + } - if (red_shift !== 16) { - Log.Warn("Server native red-shift is not 16"); - } + this._display.set_true_color(this._true_color); + this._display.resize(this._fb_width, this._fb_height); + this._onFBResize(this, this._fb_width, this._fb_height); - if (blue_shift !== 0) { - Log.Warn("Server native blue-shift is not 0"); - } + if (!this._view_only) { + this._keyboard.grab(); + } + if (!this._view_only) { + this._mouse.grab(); + } - // we're past the point where we could backtrack, so it's safe to call this - this._onDesktopName(this, this._fb_name); + if (this._true_color) { + this._fb_Bpp = 4; + this._fb_depth = 3; + } else { + this._fb_Bpp = 1; + this._fb_depth = 1; + } - if (this._true_color && this._fb_name === "Intel(r) AMT KVM") { - Log.Warn("Intel AMT KVM only supports 8/16 bit depths. Disabling true color"); - this._true_color = false; - } + RFB.messages.pixelFormat(this._sock, this._fb_Bpp, this._fb_depth, this._true_color); + RFB.messages.clientEncodings(this._sock, this._encodings, this._local_cursor, this._true_color); + RFB.messages.fbUpdateRequests(this._sock, false, this._display.getCleanDirtyReset(), this._fb_width, this._fb_height); - this._display.set_true_color(this._true_color); - this._display.resize(this._fb_width, this._fb_height); - this._onFBResize(this, this._fb_width, this._fb_height); + this._timing.fbu_rt_start = new Date().getTime(); + this._timing.pixels = 0; - if (!this._view_only) { - this._keyboard.grab(); - } - if (!this._view_only) { - this._mouse.grab(); - } - - if (this._true_color) { - this._fb_Bpp = 4; - this._fb_depth = 3; - } else { - this._fb_Bpp = 1; - this._fb_depth = 1; - } - - RFB.messages.pixelFormat(this._sock, this._fb_Bpp, this._fb_depth, this._true_color); - RFB.messages.clientEncodings(this._sock, this._encodings, this._local_cursor, this._true_color); - RFB.messages.fbUpdateRequest(this._sock, false, 0, 0, this._fb_width, this._fb_height); - - this._timing.fbu_rt_start = new Date().getTime(); - this._timing.pixels = 0; - - this._updateConnectionState('connected'); - return true; - }, - - /* RFB protocol initialization states: - * ProtocolVersion - * Security - * Authentication - * SecurityResult - * ClientInitialization - not triggered by server message - * ServerInitialization - */ - _init_msg: function () { - switch (this._rfb_init_state) { - case 'ProtocolVersion': - return this._negotiate_protocol_version(); - - case 'Security': - return this._negotiate_security(); - - case 'Authentication': - return this._negotiate_authentication(); - - case 'SecurityResult': - return this._handle_security_result(); - - case 'ClientInitialisation': - this._sock.send([this._shared ? 1 : 0]); // ClientInitialisation - this._rfb_init_state = 'ServerInitialisation'; - return true; - - case 'ServerInitialisation': - return this._negotiate_server_init(); - - default: - return this._fail("Internal error", "Unknown init state: " + this._rfb_init_state); - } - }, - - _handle_set_colour_map_msg: function () { - Log.Debug("SetColorMapEntries"); - this._sock.rQskip8(); // Padding - - var first_colour = this._sock.rQshift16(); - var num_colours = this._sock.rQshift16(); - if (this._sock.rQwait('SetColorMapEntries', num_colours * 6, 6)) { - return false; - } - - for (var c = 0; c < num_colours; c++) { - var red = parseInt(this._sock.rQshift16() / 256, 10); - var green = parseInt(this._sock.rQshift16() / 256, 10); - var blue = parseInt(this._sock.rQshift16() / 256, 10); - this._display.set_colourMap([blue, green, red], first_colour + c); - } - Log.Debug("colourMap: " + this._display.get_colourMap()); - Log.Info("Registered " + num_colours + " colourMap entries"); - - return true; - }, - - _handle_server_cut_text: function () { - Log.Debug("ServerCutText"); - - if (this._sock.rQwait("ServerCutText header", 7, 1)) { - return false; - } - this._sock.rQskipBytes(3); // Padding - var length = this._sock.rQshift32(); - if (this._sock.rQwait("ServerCutText", length, 8)) { - return false; - } - - var text = this._sock.rQshiftStr(length); - - if (this._view_only) { + this._updateConnectionState('connected'); return true; - } + }, - this._onClipboard(this, text); - - return true; - }, - - _handle_server_fence_msg: function () { - if (this._sock.rQwait("ServerFence header", 8, 1)) { - return false; - } - this._sock.rQskipBytes(3); // Padding - var flags = this._sock.rQshift32(); - var length = this._sock.rQshift8(); - - if (this._sock.rQwait("ServerFence payload", length, 9)) { - return false; - } - - if (length > 64) { - Log.Warn("Bad payload length (" + length + ") in fence response"); - length = 64; - } - - var payload = this._sock.rQshiftStr(length); - - this._supportsFence = true; - - /* - * Fence flags - * - * (1<<0) - BlockBefore - * (1<<1) - BlockAfter - * (1<<2) - SyncNext - * (1<<31) - Request + /* RFB protocol initialization states: + * ProtocolVersion + * Security + * Authentication + * SecurityResult + * ClientInitialization - not triggered by server message + * ServerInitialization */ + _init_msg: function () { + switch (this._rfb_init_state) { + case 'ProtocolVersion': + return this._negotiate_protocol_version(); - if (!(flags & 1 << 31)) { - return this._fail("Internal error", "Unexpected fence response"); - } + case 'Security': + return this._negotiate_security(); - // Filter out unsupported flags - // FIXME: support syncNext - flags &= 1 << 0 | 1 << 1; + case 'Authentication': + return this._negotiate_authentication(); - // BlockBefore and BlockAfter are automatically handled by - // the fact that we process each incoming message - // synchronuosly. - RFB.messages.clientFence(this._sock, flags, payload); + case 'SecurityResult': + return this._handle_security_result(); - return true; - }, + case 'ClientInitialisation': + this._sock.send([this._shared ? 1 : 0]); // ClientInitialisation + this._rfb_init_state = 'ServerInitialisation'; + return true; - _handle_xvp_msg: function () { - if (this._sock.rQwait("XVP version and message", 3, 1)) { - return false; - } - this._sock.rQskip8(); // Padding - var xvp_ver = this._sock.rQshift8(); - var xvp_msg = this._sock.rQshift8(); + case 'ServerInitialisation': + return this._negotiate_server_init(); - switch (xvp_msg) { - case 0: - // XVP_FAIL - Log.Error("Operation Failed"); - this._notification("XVP Operation Failed", 'error'); - break; - case 1: - // XVP_INIT - this._rfb_xvp_ver = xvp_ver; - Log.Info("XVP extensions enabled (version " + this._rfb_xvp_ver + ")"); - this._onXvpInit(this._rfb_xvp_ver); - break; - default: - this._fail("Unexpected server message", "Illegal server XVP message " + xvp_msg); - break; - } + default: + return this._fail("Internal error", "Unknown init state: " + this._rfb_init_state); + } + }, - return true; - }, + _handle_set_colour_map_msg: function () { + _util2.default.Debug("SetColorMapEntries"); + this._sock.rQskip8(); // Padding - _normal_msg: function () { - var msg_type; + var first_colour = this._sock.rQshift16(); + var num_colours = this._sock.rQshift16(); + if (this._sock.rQwait('SetColorMapEntries', num_colours * 6, 6)) { + return false; + } - if (this._FBU.rects > 0) { - msg_type = 0; - } else { - msg_type = this._sock.rQshift8(); - } + for (var c = 0; c < num_colours; c++) { + var red = parseInt(this._sock.rQshift16() / 256, 10); + var green = parseInt(this._sock.rQshift16() / 256, 10); + var blue = parseInt(this._sock.rQshift16() / 256, 10); + this._display.set_colourMap([blue, green, red], first_colour + c); + } + _util2.default.Debug("colourMap: " + this._display.get_colourMap()); + _util2.default.Info("Registered " + num_colours + " colourMap entries"); - switch (msg_type) { - case 0: - // FramebufferUpdate - var ret = this._framebufferUpdate(); - if (ret && !this._enabledContinuousUpdates) { - RFB.messages.fbUpdateRequest(this._sock, true, 0, 0, this._fb_width, this._fb_height); - } - return ret; + return true; + }, - case 1: - // SetColorMapEntries - return this._handle_set_colour_map_msg(); + _handle_server_cut_text: function () { + _util2.default.Debug("ServerCutText"); + if (this._sock.rQwait("ServerCutText header", 7, 1)) { + return false; + } + this._sock.rQskipBytes(3); // Padding + var length = this._sock.rQshift32(); + if (this._sock.rQwait("ServerCutText", length, 8)) { + return false; + } - case 2: - // Bell - Log.Debug("Bell"); - this._onBell(this); - return true; + var text = this._sock.rQshiftStr(length); + this._onClipboard(this, text); - case 3: - // ServerCutText - return this._handle_server_cut_text(); + return true; + }, - case 150: - // EndOfContinuousUpdates - var first = !this._supportsContinuousUpdates; - this._supportsContinuousUpdates = true; - this._enabledContinuousUpdates = false; - if (first) { - this._enabledContinuousUpdates = true; - this._updateContinuousUpdates(); - Log.Info("Enabling continuous updates."); - } else { - // FIXME: We need to send a framebufferupdaterequest here - // if we add support for turning off continuous updates - } - return true; + _handle_server_fence_msg: function () { + if (this._sock.rQwait("ServerFence header", 8, 1)) { + return false; + } + this._sock.rQskipBytes(3); // Padding + var flags = this._sock.rQshift32(); + var length = this._sock.rQshift8(); - case 248: - // ServerFence - return this._handle_server_fence_msg(); + if (this._sock.rQwait("ServerFence payload", length, 9)) { + return false; + } - case 250: - // XVP - return this._handle_xvp_msg(); + if (length > 64) { + _util2.default.Warn("Bad payload length (" + length + ") in fence response"); + length = 64; + } - default: - this._fail("Unexpected server message", "Type:" + msg_type); - Log.Debug("sock.rQslice(0, 30): " + this._sock.rQslice(0, 30)); - return true; - } - }, + var payload = this._sock.rQshiftStr(length); - _onFlush: function () { - this._flushing = false; - // Resume processing - if (this._sock.rQlen() > 0) { - this._handle_message(); - } - }, + this._supportsFence = true; - _framebufferUpdate: function () { - var ret = true; - var now; + /* + * Fence flags + * + * (1<<0) - BlockBefore + * (1<<1) - BlockAfter + * (1<<2) - SyncNext + * (1<<31) - Request + */ - if (this._FBU.rects === 0) { - if (this._sock.rQwait("FBU header", 3, 1)) { + if (!(flags & 1 << 31)) { + return this._fail("Internal error", "Unexpected fence response"); + } + + // Filter out unsupported flags + // FIXME: support syncNext + flags &= 1 << 0 | 1 << 1; + + // BlockBefore and BlockAfter are automatically handled by + // the fact that we process each incoming message + // synchronuosly. + RFB.messages.clientFence(this._sock, flags, payload); + + return true; + }, + + _handle_xvp_msg: function () { + if (this._sock.rQwait("XVP version and message", 3, 1)) { return false; } this._sock.rQskip8(); // Padding - this._FBU.rects = this._sock.rQshift16(); - this._FBU.bytes = 0; - this._timing.cur_fbu = 0; - if (this._timing.fbu_rt_start > 0) { - now = new Date().getTime(); - Log.Info("First FBU latency: " + (now - this._timing.fbu_rt_start)); + var xvp_ver = this._sock.rQshift8(); + var xvp_msg = this._sock.rQshift8(); + + switch (xvp_msg) { + case 0: + // XVP_FAIL + _util2.default.Error("Operation Failed"); + this._notification("XVP Operation Failed", 'error'); + break; + case 1: + // XVP_INIT + this._rfb_xvp_ver = xvp_ver; + _util2.default.Info("XVP extensions enabled (version " + this._rfb_xvp_ver + ")"); + this._onXvpInit(this._rfb_xvp_ver); + break; + default: + this._fail("Unexpected server message", "Illegal server XVP message " + xvp_msg); + break; } - // Make sure the previous frame is fully rendered first - // to avoid building up an excessive queue - if (this._display.pending()) { - this._flushing = true; - this._display.flush(); - return false; - } - } + return true; + }, - while (this._FBU.rects > 0) { - if (this._rfb_connection_state !== 'connected') { - return false; + _normal_msg: function () { + var msg_type; + + if (this._FBU.rects > 0) { + msg_type = 0; + } else { + msg_type = this._sock.rQshift8(); } - if (this._sock.rQwait("FBU", this._FBU.bytes)) { - return false; + switch (msg_type) { + case 0: + // FramebufferUpdate + var ret = this._framebufferUpdate(); + if (ret) { + RFB.messages.fbUpdateRequests(this._sock, this._enabledContinuousUpdates, this._display.getCleanDirtyReset(), this._fb_width, this._fb_height); + } + return ret; + + case 1: + // SetColorMapEntries + return this._handle_set_colour_map_msg(); + + case 2: + // Bell + _util2.default.Debug("Bell"); + this._onBell(this); + return true; + + case 3: + // ServerCutText + return this._handle_server_cut_text(); + + case 150: + // EndOfContinuousUpdates + var first = !this._supportsContinuousUpdates; + this._supportsContinuousUpdates = true; + this._enabledContinuousUpdates = false; + if (first) { + this._enabledContinuousUpdates = true; + this._updateContinuousUpdates(); + _util2.default.Info("Enabling continuous updates."); + } else { + // FIXME: We need to send a framebufferupdaterequest here + // if we add support for turning off continuous updates + } + return true; + + case 248: + // ServerFence + return this._handle_server_fence_msg(); + + case 250: + // XVP + return this._handle_xvp_msg(); + + default: + this._fail("Unexpected server message", "Type:" + msg_type); + _util2.default.Debug("sock.rQslice(0, 30): " + this._sock.rQslice(0, 30)); + return true; } - if (this._FBU.bytes === 0) { - if (this._sock.rQwait("rect header", 12)) { + }, + + _onFlush: function () { + this._flushing = false; + // Resume processing + if (this._sock.rQlen() > 0) { + this._handle_message(); + } + }, + + _framebufferUpdate: function () { + var ret = true; + var now; + + if (this._FBU.rects === 0) { + if (this._sock.rQwait("FBU header", 3, 1)) { return false; } - /* New FramebufferUpdate */ - - var hdr = this._sock.rQshiftBytes(12); - this._FBU.x = (hdr[0] << 8) + hdr[1]; - this._FBU.y = (hdr[2] << 8) + hdr[3]; - this._FBU.width = (hdr[4] << 8) + hdr[5]; - this._FBU.height = (hdr[6] << 8) + hdr[7]; - this._FBU.encoding = parseInt((hdr[8] << 24) + (hdr[9] << 16) + (hdr[10] << 8) + hdr[11], 10); - - this._onFBUReceive(this, { 'x': this._FBU.x, 'y': this._FBU.y, - 'width': this._FBU.width, 'height': this._FBU.height, - 'encoding': this._FBU.encoding, - 'encodingName': this._encNames[this._FBU.encoding] }); - - if (!this._encNames[this._FBU.encoding]) { - this._fail("Unexpected server message", "Unsupported encoding " + this._FBU.encoding); - return false; - } - } - - this._timing.last_fbu = new Date().getTime(); - - ret = this._encHandlers[this._FBU.encoding](); - - now = new Date().getTime(); - this._timing.cur_fbu += now - this._timing.last_fbu; - - if (ret) { - this._encStats[this._FBU.encoding][0]++; - this._encStats[this._FBU.encoding][1]++; - this._timing.pixels += this._FBU.width * this._FBU.height; - } - - if (this._timing.pixels >= this._fb_width * this._fb_height) { - if (this._FBU.width === this._fb_width && this._FBU.height === this._fb_height || this._timing.fbu_rt_start > 0) { - this._timing.full_fbu_total += this._timing.cur_fbu; - this._timing.full_fbu_cnt++; - Log.Info("Timing of full FBU, curr: " + this._timing.cur_fbu + ", total: " + this._timing.full_fbu_total + ", cnt: " + this._timing.full_fbu_cnt + ", avg: " + this._timing.full_fbu_total / this._timing.full_fbu_cnt); - } - + this._sock.rQskip8(); // Padding + this._FBU.rects = this._sock.rQshift16(); + this._FBU.bytes = 0; + this._timing.cur_fbu = 0; if (this._timing.fbu_rt_start > 0) { - var fbu_rt_diff = now - this._timing.fbu_rt_start; - this._timing.fbu_rt_total += fbu_rt_diff; - this._timing.fbu_rt_cnt++; - Log.Info("full FBU round-trip, cur: " + fbu_rt_diff + ", total: " + this._timing.fbu_rt_total + ", cnt: " + this._timing.fbu_rt_cnt + ", avg: " + this._timing.fbu_rt_total / this._timing.fbu_rt_cnt); - this._timing.fbu_rt_start = 0; + now = new Date().getTime(); + _util2.default.Info("First FBU latency: " + (now - this._timing.fbu_rt_start)); + } + + // Make sure the previous frame is fully rendered first + // to avoid building up an excessive queue + if (this._display.pending()) { + this._flushing = true; + this._display.flush(); + return false; } } - if (!ret) { - return ret; - } // need more data - } - - this._display.flip(); - - this._onFBUComplete(this, { 'x': this._FBU.x, 'y': this._FBU.y, - 'width': this._FBU.width, 'height': this._FBU.height, - 'encoding': this._FBU.encoding, - 'encodingName': this._encNames[this._FBU.encoding] }); - - return true; // We finished this FBU - }, - - _updateContinuousUpdates: function () { - if (!this._enabledContinuousUpdates) { - return; - } - - RFB.messages.enableContinuousUpdates(this._sock, true, 0, 0, this._fb_width, this._fb_height); - } -}; - -(0, _properties.make_properties)(RFB, [['target', 'wo', 'dom'], // VNC display rendering Canvas object -['focusContainer', 'wo', 'dom'], // DOM element that captures keyboard input -['encrypt', 'rw', 'bool'], // Use TLS/SSL/wss encryption -['true_color', 'rw', 'bool'], // Request true color pixel data -['local_cursor', 'rw', 'bool'], // Request locally rendered cursor -['shared', 'rw', 'bool'], // Request shared mode -['view_only', 'rw', 'bool'], // Disable client mouse/keyboard -['xvp_password_sep', 'rw', 'str'], // Separator for XVP password fields -['disconnectTimeout', 'rw', 'int'], // Time (s) to wait for disconnection -['wsProtocols', 'rw', 'arr'], // Protocols to use in the WebSocket connection -['repeaterID', 'rw', 'str'], // [UltraVNC] RepeaterID to connect to -['viewportDrag', 'rw', 'bool'], // Move the viewport on mouse drags - -// Callback functions -['onUpdateState', 'rw', 'func'], // onUpdateState(rfb, state, oldstate): connection state change -['onNotification', 'rw', 'func'], // onNotification(rfb, msg, level, options): notification for the UI -['onDisconnected', 'rw', 'func'], // onDisconnected(rfb, reason): disconnection finished -['onPasswordRequired', 'rw', 'func'], // onPasswordRequired(rfb, msg): VNC password is required -['onClipboard', 'rw', 'func'], // onClipboard(rfb, text): RFB clipboard contents received -['onBell', 'rw', 'func'], // onBell(rfb): RFB Bell message received -['onFBUReceive', 'rw', 'func'], // onFBUReceive(rfb, fbu): RFB FBU received but not yet processed -['onFBUComplete', 'rw', 'func'], // onFBUComplete(rfb, fbu): RFB FBU received and processed -['onFBResize', 'rw', 'func'], // onFBResize(rfb, width, height): frame buffer resized -['onDesktopName', 'rw', 'func'], // onDesktopName(rfb, name): desktop name received -['onXvpInit', 'rw', 'func'] // onXvpInit(version): XVP extensions active for this connection -]); - -RFB.prototype.set_local_cursor = function (cursor) { - if (!cursor || cursor in { '0': 1, 'no': 1, 'false': 1 }) { - this._local_cursor = false; - this._display.disableLocalCursor(); //Only show server-side cursor - } else { - if (this._display.get_cursor_uri()) { - this._local_cursor = true; - } else { - Log.Warn("Browser does not support local cursor"); - this._display.disableLocalCursor(); - } - } - - // Need to send an updated list of encodings if we are connected - if (this._rfb_connection_state === "connected") { - RFB.messages.clientEncodings(this._sock, this._encodings, cursor, this._true_color); - } -}; - -RFB.prototype.set_view_only = function (view_only) { - this._view_only = view_only; - - if (this._rfb_connection_state === "connecting" || this._rfb_connection_state === "connected") { - if (view_only) { - this._keyboard.ungrab(); - this._mouse.ungrab(); - } else { - this._keyboard.grab(); - this._mouse.grab(); - } - } -}; - -RFB.prototype.get_display = function () { - return this._display; -}; -RFB.prototype.get_keyboard = function () { - return this._keyboard; -}; -RFB.prototype.get_mouse = function () { - return this._mouse; -}; - -// Class Methods -RFB.messages = { - keyEvent: function (sock, keysym, down) { - var buff = sock._sQ; - var offset = sock._sQlen; - - buff[offset] = 4; // msg-type - buff[offset + 1] = down; - - buff[offset + 2] = 0; - buff[offset + 3] = 0; - - buff[offset + 4] = keysym >> 24; - buff[offset + 5] = keysym >> 16; - buff[offset + 6] = keysym >> 8; - buff[offset + 7] = keysym; - - sock._sQlen += 8; - sock.flush(); - }, - - QEMUExtendedKeyEvent: function (sock, keysym, down, keycode) { - function getRFBkeycode(xt_scancode) { - var upperByte = keycode >> 8; - var lowerByte = keycode & 0x00ff; - if (upperByte === 0xe0 && lowerByte < 0x7f) { - lowerByte = lowerByte | 0x80; - return lowerByte; - } - return xt_scancode; - } - - var buff = sock._sQ; - var offset = sock._sQlen; - - buff[offset] = 255; // msg-type - buff[offset + 1] = 0; // sub msg-type - - buff[offset + 2] = down >> 8; - buff[offset + 3] = down; - - buff[offset + 4] = keysym >> 24; - buff[offset + 5] = keysym >> 16; - buff[offset + 6] = keysym >> 8; - buff[offset + 7] = keysym; - - var RFBkeycode = getRFBkeycode(keycode); - - buff[offset + 8] = RFBkeycode >> 24; - buff[offset + 9] = RFBkeycode >> 16; - buff[offset + 10] = RFBkeycode >> 8; - buff[offset + 11] = RFBkeycode; - - sock._sQlen += 12; - sock.flush(); - }, - - pointerEvent: function (sock, x, y, mask) { - var buff = sock._sQ; - var offset = sock._sQlen; - - buff[offset] = 5; // msg-type - - buff[offset + 1] = mask; - - buff[offset + 2] = x >> 8; - buff[offset + 3] = x; - - buff[offset + 4] = y >> 8; - buff[offset + 5] = y; - - sock._sQlen += 6; - sock.flush(); - }, - - // TODO(directxman12): make this unicode compatible? - clientCutText: function (sock, text) { - var buff = sock._sQ; - var offset = sock._sQlen; - - buff[offset] = 6; // msg-type - - buff[offset + 1] = 0; // padding - buff[offset + 2] = 0; // padding - buff[offset + 3] = 0; // padding - - var n = text.length; - - buff[offset + 4] = n >> 24; - buff[offset + 5] = n >> 16; - buff[offset + 6] = n >> 8; - buff[offset + 7] = n; - - for (var i = 0; i < n; i++) { - buff[offset + 8 + i] = text.charCodeAt(i); - } - - sock._sQlen += 8 + n; - sock.flush(); - }, - - setDesktopSize: function (sock, width, height, id, flags) { - var buff = sock._sQ; - var offset = sock._sQlen; - - buff[offset] = 251; // msg-type - buff[offset + 1] = 0; // padding - buff[offset + 2] = width >> 8; // width - buff[offset + 3] = width; - buff[offset + 4] = height >> 8; // height - buff[offset + 5] = height; - - buff[offset + 6] = 1; // number-of-screens - buff[offset + 7] = 0; // padding - - // screen array - buff[offset + 8] = id >> 24; // id - buff[offset + 9] = id >> 16; - buff[offset + 10] = id >> 8; - buff[offset + 11] = id; - buff[offset + 12] = 0; // x-position - buff[offset + 13] = 0; - buff[offset + 14] = 0; // y-position - buff[offset + 15] = 0; - buff[offset + 16] = width >> 8; // width - buff[offset + 17] = width; - buff[offset + 18] = height >> 8; // height - buff[offset + 19] = height; - buff[offset + 20] = flags >> 24; // flags - buff[offset + 21] = flags >> 16; - buff[offset + 22] = flags >> 8; - buff[offset + 23] = flags; - - sock._sQlen += 24; - sock.flush(); - }, - - clientFence: function (sock, flags, payload) { - var buff = sock._sQ; - var offset = sock._sQlen; - - buff[offset] = 248; // msg-type - - buff[offset + 1] = 0; // padding - buff[offset + 2] = 0; // padding - buff[offset + 3] = 0; // padding - - buff[offset + 4] = flags >> 24; // flags - buff[offset + 5] = flags >> 16; - buff[offset + 6] = flags >> 8; - buff[offset + 7] = flags; - - var n = payload.length; - - buff[offset + 8] = n; // length - - for (var i = 0; i < n; i++) { - buff[offset + 9 + i] = payload.charCodeAt(i); - } - - sock._sQlen += 9 + n; - sock.flush(); - }, - - enableContinuousUpdates: function (sock, enable, x, y, width, height) { - var buff = sock._sQ; - var offset = sock._sQlen; - - buff[offset] = 150; // msg-type - buff[offset + 1] = enable; // enable-flag - - buff[offset + 2] = x >> 8; // x - buff[offset + 3] = x; - buff[offset + 4] = y >> 8; // y - buff[offset + 5] = y; - buff[offset + 6] = width >> 8; // width - buff[offset + 7] = width; - buff[offset + 8] = height >> 8; // height - buff[offset + 9] = height; - - sock._sQlen += 10; - sock.flush(); - }, - - pixelFormat: function (sock, bpp, depth, true_color) { - var buff = sock._sQ; - var offset = sock._sQlen; - - buff[offset] = 0; // msg-type - - buff[offset + 1] = 0; // padding - buff[offset + 2] = 0; // padding - buff[offset + 3] = 0; // padding - - buff[offset + 4] = bpp * 8; // bits-per-pixel - buff[offset + 5] = depth * 8; // depth - buff[offset + 6] = 0; // little-endian - buff[offset + 7] = true_color ? 1 : 0; // true-color - - buff[offset + 8] = 0; // red-max - buff[offset + 9] = 255; // red-max - - buff[offset + 10] = 0; // green-max - buff[offset + 11] = 255; // green-max - - buff[offset + 12] = 0; // blue-max - buff[offset + 13] = 255; // blue-max - - buff[offset + 14] = 16; // red-shift - buff[offset + 15] = 8; // green-shift - buff[offset + 16] = 0; // blue-shift - - buff[offset + 17] = 0; // padding - buff[offset + 18] = 0; // padding - buff[offset + 19] = 0; // padding - - sock._sQlen += 20; - sock.flush(); - }, - - clientEncodings: function (sock, encodings, local_cursor, true_color) { - var buff = sock._sQ; - var offset = sock._sQlen; - - buff[offset] = 2; // msg-type - buff[offset + 1] = 0; // padding - - // offset + 2 and offset + 3 are encoding count - - var i, - j = offset + 4, - cnt = 0; - for (i = 0; i < encodings.length; i++) { - if (encodings[i][0] === "Cursor" && !local_cursor) { - Log.Debug("Skipping Cursor pseudo-encoding"); - } else if (encodings[i][0] === "TIGHT" && !true_color) { - // TODO: remove this when we have tight+non-true-color - Log.Warn("Skipping tight as it is only supported with true color"); - } else { - var enc = encodings[i][1]; - buff[j] = enc >> 24; - buff[j + 1] = enc >> 16; - buff[j + 2] = enc >> 8; - buff[j + 3] = enc; - - j += 4; - cnt++; - } - } - - buff[offset + 2] = cnt >> 8; - buff[offset + 3] = cnt; - - sock._sQlen += j - offset; - sock.flush(); - }, - - fbUpdateRequest: function (sock, incremental, x, y, w, h) { - var buff = sock._sQ; - var offset = sock._sQlen; - - if (typeof x === "undefined") { - x = 0; - } - if (typeof y === "undefined") { - y = 0; - } - - buff[offset] = 3; // msg-type - buff[offset + 1] = incremental ? 1 : 0; - - buff[offset + 2] = x >> 8 & 0xFF; - buff[offset + 3] = x & 0xFF; - - buff[offset + 4] = y >> 8 & 0xFF; - buff[offset + 5] = y & 0xFF; - - buff[offset + 6] = w >> 8 & 0xFF; - buff[offset + 7] = w & 0xFF; - - buff[offset + 8] = h >> 8 & 0xFF; - buff[offset + 9] = h & 0xFF; - - sock._sQlen += 10; - sock.flush(); - } -}; - -RFB.genDES = function (password, challenge) { - var passwd = []; - for (var i = 0; i < password.length; i++) { - passwd.push(password.charCodeAt(i)); - } - return new _des2.default(passwd).encrypt(challenge); -}; - -RFB.encodingHandlers = { - RAW: function () { - if (this._FBU.lines === 0) { - this._FBU.lines = this._FBU.height; - } - - this._FBU.bytes = this._FBU.width * this._fb_Bpp; // at least a line - if (this._sock.rQwait("RAW", this._FBU.bytes)) { - return false; - } - var cur_y = this._FBU.y + (this._FBU.height - this._FBU.lines); - var curr_height = Math.min(this._FBU.lines, Math.floor(this._sock.rQlen() / (this._FBU.width * this._fb_Bpp))); - this._display.blitImage(this._FBU.x, cur_y, this._FBU.width, curr_height, this._sock.get_rQ(), this._sock.get_rQi()); - this._sock.rQskipBytes(this._FBU.width * curr_height * this._fb_Bpp); - this._FBU.lines -= curr_height; - - if (this._FBU.lines > 0) { - this._FBU.bytes = this._FBU.width * this._fb_Bpp; // At least another line - } else { - this._FBU.rects--; - this._FBU.bytes = 0; - } - - return true; - }, - - COPYRECT: function () { - this._FBU.bytes = 4; - if (this._sock.rQwait("COPYRECT", 4)) { - return false; - } - this._display.copyImage(this._sock.rQshift16(), this._sock.rQshift16(), this._FBU.x, this._FBU.y, this._FBU.width, this._FBU.height); - - this._FBU.rects--; - this._FBU.bytes = 0; - return true; - }, - - RRE: function () { - var color; - if (this._FBU.subrects === 0) { - this._FBU.bytes = 4 + this._fb_Bpp; - if (this._sock.rQwait("RRE", 4 + this._fb_Bpp)) { - return false; - } - this._FBU.subrects = this._sock.rQshift32(); - color = this._sock.rQshiftBytes(this._fb_Bpp); // Background - this._display.fillRect(this._FBU.x, this._FBU.y, this._FBU.width, this._FBU.height, color); - } - - while (this._FBU.subrects > 0 && this._sock.rQlen() >= this._fb_Bpp + 8) { - color = this._sock.rQshiftBytes(this._fb_Bpp); - var x = this._sock.rQshift16(); - var y = this._sock.rQshift16(); - var width = this._sock.rQshift16(); - var height = this._sock.rQshift16(); - this._display.fillRect(this._FBU.x + x, this._FBU.y + y, width, height, color); - this._FBU.subrects--; - } - - if (this._FBU.subrects > 0) { - var chunk = Math.min(this._rre_chunk_sz, this._FBU.subrects); - this._FBU.bytes = (this._fb_Bpp + 8) * chunk; - } else { - this._FBU.rects--; - this._FBU.bytes = 0; - } - - return true; - }, - - HEXTILE: function () { - var rQ = this._sock.get_rQ(); - var rQi = this._sock.get_rQi(); - - if (this._FBU.tiles === 0) { - this._FBU.tiles_x = Math.ceil(this._FBU.width / 16); - this._FBU.tiles_y = Math.ceil(this._FBU.height / 16); - this._FBU.total_tiles = this._FBU.tiles_x * this._FBU.tiles_y; - this._FBU.tiles = this._FBU.total_tiles; - } - - while (this._FBU.tiles > 0) { - this._FBU.bytes = 1; - if (this._sock.rQwait("HEXTILE subencoding", this._FBU.bytes)) { - return false; - } - var subencoding = rQ[rQi]; // Peek - if (subencoding > 30) { - // Raw - this._fail("Unexpected server message", "Illegal hextile subencoding: " + subencoding); - return false; - } - - var subrects = 0; - var curr_tile = this._FBU.total_tiles - this._FBU.tiles; - var tile_x = curr_tile % this._FBU.tiles_x; - var tile_y = Math.floor(curr_tile / this._FBU.tiles_x); - var x = this._FBU.x + tile_x * 16; - var y = this._FBU.y + tile_y * 16; - var w = Math.min(16, this._FBU.x + this._FBU.width - x); - var h = Math.min(16, this._FBU.y + this._FBU.height - y); - - // Figure out how much we are expecting - if (subencoding & 0x01) { - // Raw - this._FBU.bytes += w * h * this._fb_Bpp; - } else { - if (subencoding & 0x02) { - // Background - this._FBU.bytes += this._fb_Bpp; + while (this._FBU.rects > 0) { + if (this._rfb_connection_state !== 'connected') { + return false; } - if (subencoding & 0x04) { - // Foreground - this._FBU.bytes += this._fb_Bpp; + + if (this._sock.rQwait("FBU", this._FBU.bytes)) { + return false; } - if (subencoding & 0x08) { - // AnySubrects - this._FBU.bytes++; // Since we aren't shifting it off - if (this._sock.rQwait("hextile subrects header", this._FBU.bytes)) { + if (this._FBU.bytes === 0) { + if (this._sock.rQwait("rect header", 12)) { return false; } - subrects = rQ[rQi + this._FBU.bytes - 1]; // Peek - if (subencoding & 0x10) { - // SubrectsColoured - this._FBU.bytes += subrects * (this._fb_Bpp + 2); - } else { - this._FBU.bytes += subrects * 2; + /* New FramebufferUpdate */ + + var hdr = this._sock.rQshiftBytes(12); + this._FBU.x = (hdr[0] << 8) + hdr[1]; + this._FBU.y = (hdr[2] << 8) + hdr[3]; + this._FBU.width = (hdr[4] << 8) + hdr[5]; + this._FBU.height = (hdr[6] << 8) + hdr[7]; + this._FBU.encoding = parseInt((hdr[8] << 24) + (hdr[9] << 16) + (hdr[10] << 8) + hdr[11], 10); + + this._onFBUReceive(this, { 'x': this._FBU.x, 'y': this._FBU.y, + 'width': this._FBU.width, 'height': this._FBU.height, + 'encoding': this._FBU.encoding, + 'encodingName': this._encNames[this._FBU.encoding] }); + + if (!this._encNames[this._FBU.encoding]) { + this._fail("Unexpected server message", "Unsupported encoding " + this._FBU.encoding); + return false; } } + + this._timing.last_fbu = new Date().getTime(); + + ret = this._encHandlers[this._FBU.encoding](); + + now = new Date().getTime(); + this._timing.cur_fbu += now - this._timing.last_fbu; + + if (ret) { + this._encStats[this._FBU.encoding][0]++; + this._encStats[this._FBU.encoding][1]++; + this._timing.pixels += this._FBU.width * this._FBU.height; + } + + if (this._timing.pixels >= this._fb_width * this._fb_height) { + if (this._FBU.width === this._fb_width && this._FBU.height === this._fb_height || this._timing.fbu_rt_start > 0) { + this._timing.full_fbu_total += this._timing.cur_fbu; + this._timing.full_fbu_cnt++; + _util2.default.Info("Timing of full FBU, curr: " + this._timing.cur_fbu + ", total: " + this._timing.full_fbu_total + ", cnt: " + this._timing.full_fbu_cnt + ", avg: " + this._timing.full_fbu_total / this._timing.full_fbu_cnt); + } + + if (this._timing.fbu_rt_start > 0) { + var fbu_rt_diff = now - this._timing.fbu_rt_start; + this._timing.fbu_rt_total += fbu_rt_diff; + this._timing.fbu_rt_cnt++; + _util2.default.Info("full FBU round-trip, cur: " + fbu_rt_diff + ", total: " + this._timing.fbu_rt_total + ", cnt: " + this._timing.fbu_rt_cnt + ", avg: " + this._timing.fbu_rt_total / this._timing.fbu_rt_cnt); + this._timing.fbu_rt_start = 0; + } + } + + if (!ret) { + return ret; + } // need more data + } + + this._onFBUComplete(this, { 'x': this._FBU.x, 'y': this._FBU.y, + 'width': this._FBU.width, 'height': this._FBU.height, + 'encoding': this._FBU.encoding, + 'encodingName': this._encNames[this._FBU.encoding] }); + + return true; // We finished this FBU + }, + + _updateContinuousUpdates: function () { + if (!this._enabledContinuousUpdates) { + return; + } + + RFB.messages.enableContinuousUpdates(this._sock, true, 0, 0, this._fb_width, this._fb_height); + } + }; + + _util2.default.make_properties(RFB, [['target', 'wo', 'dom'], // VNC display rendering Canvas object + ['focusContainer', 'wo', 'dom'], // DOM element that captures keyboard input + ['encrypt', 'rw', 'bool'], // Use TLS/SSL/wss encryption + ['true_color', 'rw', 'bool'], // Request true color pixel data + ['local_cursor', 'rw', 'bool'], // Request locally rendered cursor + ['shared', 'rw', 'bool'], // Request shared mode + ['view_only', 'rw', 'bool'], // Disable client mouse/keyboard + ['xvp_password_sep', 'rw', 'str'], // Separator for XVP password fields + ['disconnectTimeout', 'rw', 'int'], // Time (s) to wait for disconnection + ['wsProtocols', 'rw', 'arr'], // Protocols to use in the WebSocket connection + ['repeaterID', 'rw', 'str'], // [UltraVNC] RepeaterID to connect to + ['viewportDrag', 'rw', 'bool'], // Move the viewport on mouse drags + + // Callback functions + ['onUpdateState', 'rw', 'func'], // onUpdateState(rfb, state, oldstate): connection state change + ['onNotification', 'rw', 'func'], // onNotification(rfb, msg, level, options): notification for the UI + ['onDisconnected', 'rw', 'func'], // onDisconnected(rfb, reason): disconnection finished + ['onPasswordRequired', 'rw', 'func'], // onPasswordRequired(rfb, msg): VNC password is required + ['onClipboard', 'rw', 'func'], // onClipboard(rfb, text): RFB clipboard contents received + ['onBell', 'rw', 'func'], // onBell(rfb): RFB Bell message received + ['onFBUReceive', 'rw', 'func'], // onFBUReceive(rfb, fbu): RFB FBU received but not yet processed + ['onFBUComplete', 'rw', 'func'], // onFBUComplete(rfb, fbu): RFB FBU received and processed + ['onFBResize', 'rw', 'func'], // onFBResize(rfb, width, height): frame buffer resized + ['onDesktopName', 'rw', 'func'], // onDesktopName(rfb, name): desktop name received + ['onXvpInit', 'rw', 'func'] // onXvpInit(version): XVP extensions active for this connection + ]); + + RFB.prototype.set_local_cursor = function (cursor) { + if (!cursor || cursor in { '0': 1, 'no': 1, 'false': 1 }) { + this._local_cursor = false; + this._display.disableLocalCursor(); //Only show server-side cursor + } else { + if (this._display.get_cursor_uri()) { + this._local_cursor = true; + } else { + _util2.default.Warn("Browser does not support local cursor"); + this._display.disableLocalCursor(); + } + } + }; + + RFB.prototype.get_display = function () { + return this._display; + }; + RFB.prototype.get_keyboard = function () { + return this._keyboard; + }; + RFB.prototype.get_mouse = function () { + return this._mouse; + }; + + // Class Methods + RFB.messages = { + keyEvent: function (sock, keysym, down) { + var buff = sock._sQ; + var offset = sock._sQlen; + + buff[offset] = 4; // msg-type + buff[offset + 1] = down; + + buff[offset + 2] = 0; + buff[offset + 3] = 0; + + buff[offset + 4] = keysym >> 24; + buff[offset + 5] = keysym >> 16; + buff[offset + 6] = keysym >> 8; + buff[offset + 7] = keysym; + + sock._sQlen += 8; + sock.flush(); + }, + + QEMUExtendedKeyEvent: function (sock, keysym, down, keycode) { + function getRFBkeycode(xt_scancode) { + var upperByte = keycode >> 8; + var lowerByte = keycode & 0x00ff; + if (upperByte === 0xe0 && lowerByte < 0x7f) { + lowerByte = lowerByte | 0x80; + return lowerByte; + } + return xt_scancode; + } + + var buff = sock._sQ; + var offset = sock._sQlen; + + buff[offset] = 255; // msg-type + buff[offset + 1] = 0; // sub msg-type + + buff[offset + 2] = down >> 8; + buff[offset + 3] = down; + + buff[offset + 4] = keysym >> 24; + buff[offset + 5] = keysym >> 16; + buff[offset + 6] = keysym >> 8; + buff[offset + 7] = keysym; + + var RFBkeycode = getRFBkeycode(keycode); + + buff[offset + 8] = RFBkeycode >> 24; + buff[offset + 9] = RFBkeycode >> 16; + buff[offset + 10] = RFBkeycode >> 8; + buff[offset + 11] = RFBkeycode; + + sock._sQlen += 12; + sock.flush(); + }, + + pointerEvent: function (sock, x, y, mask) { + var buff = sock._sQ; + var offset = sock._sQlen; + + buff[offset] = 5; // msg-type + + buff[offset + 1] = mask; + + buff[offset + 2] = x >> 8; + buff[offset + 3] = x; + + buff[offset + 4] = y >> 8; + buff[offset + 5] = y; + + sock._sQlen += 6; + sock.flush(); + }, + + // TODO(directxman12): make this unicode compatible? + clientCutText: function (sock, text) { + var buff = sock._sQ; + var offset = sock._sQlen; + + buff[offset] = 6; // msg-type + + buff[offset + 1] = 0; // padding + buff[offset + 2] = 0; // padding + buff[offset + 3] = 0; // padding + + var n = text.length; + + buff[offset + 4] = n >> 24; + buff[offset + 5] = n >> 16; + buff[offset + 6] = n >> 8; + buff[offset + 7] = n; + + for (var i = 0; i < n; i++) { + buff[offset + 8 + i] = text.charCodeAt(i); + } + + sock._sQlen += 8 + n; + sock.flush(); + }, + + setDesktopSize: function (sock, width, height, id, flags) { + var buff = sock._sQ; + var offset = sock._sQlen; + + buff[offset] = 251; // msg-type + buff[offset + 1] = 0; // padding + buff[offset + 2] = width >> 8; // width + buff[offset + 3] = width; + buff[offset + 4] = height >> 8; // height + buff[offset + 5] = height; + + buff[offset + 6] = 1; // number-of-screens + buff[offset + 7] = 0; // padding + + // screen array + buff[offset + 8] = id >> 24; // id + buff[offset + 9] = id >> 16; + buff[offset + 10] = id >> 8; + buff[offset + 11] = id; + buff[offset + 12] = 0; // x-position + buff[offset + 13] = 0; + buff[offset + 14] = 0; // y-position + buff[offset + 15] = 0; + buff[offset + 16] = width >> 8; // width + buff[offset + 17] = width; + buff[offset + 18] = height >> 8; // height + buff[offset + 19] = height; + buff[offset + 20] = flags >> 24; // flags + buff[offset + 21] = flags >> 16; + buff[offset + 22] = flags >> 8; + buff[offset + 23] = flags; + + sock._sQlen += 24; + sock.flush(); + }, + + clientFence: function (sock, flags, payload) { + var buff = sock._sQ; + var offset = sock._sQlen; + + buff[offset] = 248; // msg-type + + buff[offset + 1] = 0; // padding + buff[offset + 2] = 0; // padding + buff[offset + 3] = 0; // padding + + buff[offset + 4] = flags >> 24; // flags + buff[offset + 5] = flags >> 16; + buff[offset + 6] = flags >> 8; + buff[offset + 7] = flags; + + var n = payload.length; + + buff[offset + 8] = n; // length + + for (var i = 0; i < n; i++) { + buff[offset + 9 + i] = payload.charCodeAt(i); + } + + sock._sQlen += 9 + n; + sock.flush(); + }, + + enableContinuousUpdates: function (sock, enable, x, y, width, height) { + var buff = sock._sQ; + var offset = sock._sQlen; + + buff[offset] = 150; // msg-type + buff[offset + 1] = enable; // enable-flag + + buff[offset + 2] = x >> 8; // x + buff[offset + 3] = x; + buff[offset + 4] = y >> 8; // y + buff[offset + 5] = y; + buff[offset + 6] = width >> 8; // width + buff[offset + 7] = width; + buff[offset + 8] = height >> 8; // height + buff[offset + 9] = height; + + sock._sQlen += 10; + sock.flush(); + }, + + pixelFormat: function (sock, bpp, depth, true_color) { + var buff = sock._sQ; + var offset = sock._sQlen; + + buff[offset] = 0; // msg-type + + buff[offset + 1] = 0; // padding + buff[offset + 2] = 0; // padding + buff[offset + 3] = 0; // padding + + buff[offset + 4] = bpp * 8; // bits-per-pixel + buff[offset + 5] = depth * 8; // depth + buff[offset + 6] = 0; // little-endian + buff[offset + 7] = true_color ? 1 : 0; // true-color + + buff[offset + 8] = 0; // red-max + buff[offset + 9] = 255; // red-max + + buff[offset + 10] = 0; // green-max + buff[offset + 11] = 255; // green-max + + buff[offset + 12] = 0; // blue-max + buff[offset + 13] = 255; // blue-max + + buff[offset + 14] = 16; // red-shift + buff[offset + 15] = 8; // green-shift + buff[offset + 16] = 0; // blue-shift + + buff[offset + 17] = 0; // padding + buff[offset + 18] = 0; // padding + buff[offset + 19] = 0; // padding + + sock._sQlen += 20; + sock.flush(); + }, + + clientEncodings: function (sock, encodings, local_cursor, true_color) { + var buff = sock._sQ; + var offset = sock._sQlen; + + buff[offset] = 2; // msg-type + buff[offset + 1] = 0; // padding + + // offset + 2 and offset + 3 are encoding count + + var i, + j = offset + 4, + cnt = 0; + for (i = 0; i < encodings.length; i++) { + if (encodings[i][0] === "Cursor" && !local_cursor) { + _util2.default.Debug("Skipping Cursor pseudo-encoding"); + } else if (encodings[i][0] === "TIGHT" && !true_color) { + // TODO: remove this when we have tight+non-true-color + _util2.default.Warn("Skipping tight as it is only supported with true color"); + } else { + var enc = encodings[i][1]; + buff[j] = enc >> 24; + buff[j + 1] = enc >> 16; + buff[j + 2] = enc >> 8; + buff[j + 3] = enc; + + j += 4; + cnt++; + } } - if (this._sock.rQwait("hextile", this._FBU.bytes)) { + buff[offset + 2] = cnt >> 8; + buff[offset + 3] = cnt; + + sock._sQlen += j - offset; + sock.flush(); + }, + + fbUpdateRequests: function (sock, onlyNonInc, cleanDirty, fb_width, fb_height) { + var offsetIncrement = 0; + + var cb = cleanDirty.cleanBox; + var w, h; + if (!onlyNonInc && cb.w > 0 && cb.h > 0) { + w = typeof cb.w === "undefined" ? fb_width : cb.w; + h = typeof cb.h === "undefined" ? fb_height : cb.h; + // Request incremental for clean box + RFB.messages.fbUpdateRequest(sock, 1, cb.x, cb.y, w, h); + } + + for (var i = 0; i < cleanDirty.dirtyBoxes.length; i++) { + var db = cleanDirty.dirtyBoxes[i]; + // Force all (non-incremental) for dirty box + w = typeof db.w === "undefined" ? fb_width : db.w; + h = typeof db.h === "undefined" ? fb_height : db.h; + RFB.messages.fbUpdateRequest(sock, 0, db.x, db.y, w, h); + } + }, + + fbUpdateRequest: function (sock, incremental, x, y, w, h) { + var buff = sock._sQ; + var offset = sock._sQlen; + + if (typeof x === "undefined") { + x = 0; + } + if (typeof y === "undefined") { + y = 0; + } + + buff[offset] = 3; // msg-type + buff[offset + 1] = incremental; + + buff[offset + 2] = x >> 8 & 0xFF; + buff[offset + 3] = x & 0xFF; + + buff[offset + 4] = y >> 8 & 0xFF; + buff[offset + 5] = y & 0xFF; + + buff[offset + 6] = w >> 8 & 0xFF; + buff[offset + 7] = w & 0xFF; + + buff[offset + 8] = h >> 8 & 0xFF; + buff[offset + 9] = h & 0xFF; + + sock._sQlen += 10; + sock.flush(); + } + }; + + RFB.genDES = function (password, challenge) { + var passwd = []; + for (var i = 0; i < password.length; i++) { + passwd.push(password.charCodeAt(i)); + } + return new _des2.default(passwd).encrypt(challenge); + }; + + RFB.encodingHandlers = { + RAW: function () { + if (this._FBU.lines === 0) { + this._FBU.lines = this._FBU.height; + } + + this._FBU.bytes = this._FBU.width * this._fb_Bpp; // at least a line + if (this._sock.rQwait("RAW", this._FBU.bytes)) { + return false; + } + var cur_y = this._FBU.y + (this._FBU.height - this._FBU.lines); + var curr_height = Math.min(this._FBU.lines, Math.floor(this._sock.rQlen() / (this._FBU.width * this._fb_Bpp))); + this._display.blitImage(this._FBU.x, cur_y, this._FBU.width, curr_height, this._sock.get_rQ(), this._sock.get_rQi()); + this._sock.rQskipBytes(this._FBU.width * curr_height * this._fb_Bpp); + this._FBU.lines -= curr_height; + + if (this._FBU.lines > 0) { + this._FBU.bytes = this._FBU.width * this._fb_Bpp; // At least another line + } else { + this._FBU.rects--; + this._FBU.bytes = 0; + } + + return true; + }, + + COPYRECT: function () { + this._FBU.bytes = 4; + if (this._sock.rQwait("COPYRECT", 4)) { + return false; + } + this._display.copyImage(this._sock.rQshift16(), this._sock.rQshift16(), this._FBU.x, this._FBU.y, this._FBU.width, this._FBU.height); + + this._FBU.rects--; + this._FBU.bytes = 0; + return true; + }, + + RRE: function () { + var color; + if (this._FBU.subrects === 0) { + this._FBU.bytes = 4 + this._fb_Bpp; + if (this._sock.rQwait("RRE", 4 + this._fb_Bpp)) { + return false; + } + this._FBU.subrects = this._sock.rQshift32(); + color = this._sock.rQshiftBytes(this._fb_Bpp); // Background + this._display.fillRect(this._FBU.x, this._FBU.y, this._FBU.width, this._FBU.height, color); + } + + while (this._FBU.subrects > 0 && this._sock.rQlen() >= this._fb_Bpp + 8) { + color = this._sock.rQshiftBytes(this._fb_Bpp); + var x = this._sock.rQshift16(); + var y = this._sock.rQshift16(); + var width = this._sock.rQshift16(); + var height = this._sock.rQshift16(); + this._display.fillRect(this._FBU.x + x, this._FBU.y + y, width, height, color); + this._FBU.subrects--; + } + + if (this._FBU.subrects > 0) { + var chunk = Math.min(this._rre_chunk_sz, this._FBU.subrects); + this._FBU.bytes = (this._fb_Bpp + 8) * chunk; + } else { + this._FBU.rects--; + this._FBU.bytes = 0; + } + + return true; + }, + + HEXTILE: function () { + var rQ = this._sock.get_rQ(); + var rQi = this._sock.get_rQi(); + + if (this._FBU.tiles === 0) { + this._FBU.tiles_x = Math.ceil(this._FBU.width / 16); + this._FBU.tiles_y = Math.ceil(this._FBU.height / 16); + this._FBU.total_tiles = this._FBU.tiles_x * this._FBU.tiles_y; + this._FBU.tiles = this._FBU.total_tiles; + } + + while (this._FBU.tiles > 0) { + this._FBU.bytes = 1; + if (this._sock.rQwait("HEXTILE subencoding", this._FBU.bytes)) { + return false; + } + var subencoding = rQ[rQi]; // Peek + if (subencoding > 30) { + // Raw + this._fail("Unexpected server message", "Illegal hextile subencoding: " + subencoding); + return false; + } + + var subrects = 0; + var curr_tile = this._FBU.total_tiles - this._FBU.tiles; + var tile_x = curr_tile % this._FBU.tiles_x; + var tile_y = Math.floor(curr_tile / this._FBU.tiles_x); + var x = this._FBU.x + tile_x * 16; + var y = this._FBU.y + tile_y * 16; + var w = Math.min(16, this._FBU.x + this._FBU.width - x); + var h = Math.min(16, this._FBU.y + this._FBU.height - y); + + // Figure out how much we are expecting + if (subencoding & 0x01) { + // Raw + this._FBU.bytes += w * h * this._fb_Bpp; + } else { + if (subencoding & 0x02) { + // Background + this._FBU.bytes += this._fb_Bpp; + } + if (subencoding & 0x04) { + // Foreground + this._FBU.bytes += this._fb_Bpp; + } + if (subencoding & 0x08) { + // AnySubrects + this._FBU.bytes++; // Since we aren't shifting it off + if (this._sock.rQwait("hextile subrects header", this._FBU.bytes)) { + return false; + } + subrects = rQ[rQi + this._FBU.bytes - 1]; // Peek + if (subencoding & 0x10) { + // SubrectsColoured + this._FBU.bytes += subrects * (this._fb_Bpp + 2); + } else { + this._FBU.bytes += subrects * 2; + } + } + } + + if (this._sock.rQwait("hextile", this._FBU.bytes)) { + return false; + } + + // We know the encoding and have a whole tile + this._FBU.subencoding = rQ[rQi]; + rQi++; + if (this._FBU.subencoding === 0) { + if (this._FBU.lastsubencoding & 0x01) { + // Weird: ignore blanks are RAW + _util2.default.Debug(" Ignoring blank after RAW"); + } else { + this._display.fillRect(x, y, w, h, this._FBU.background); + } + } else if (this._FBU.subencoding & 0x01) { + // Raw + this._display.blitImage(x, y, w, h, rQ, rQi); + rQi += this._FBU.bytes - 1; + } else { + if (this._FBU.subencoding & 0x02) { + // Background + if (this._fb_Bpp == 1) { + this._FBU.background = rQ[rQi]; + } else { + // fb_Bpp is 4 + this._FBU.background = [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2], rQ[rQi + 3]]; + } + rQi += this._fb_Bpp; + } + if (this._FBU.subencoding & 0x04) { + // Foreground + if (this._fb_Bpp == 1) { + this._FBU.foreground = rQ[rQi]; + } else { + // this._fb_Bpp is 4 + this._FBU.foreground = [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2], rQ[rQi + 3]]; + } + rQi += this._fb_Bpp; + } + + this._display.startTile(x, y, w, h, this._FBU.background); + if (this._FBU.subencoding & 0x08) { + // AnySubrects + subrects = rQ[rQi]; + rQi++; + + for (var s = 0; s < subrects; s++) { + var color; + if (this._FBU.subencoding & 0x10) { + // SubrectsColoured + if (this._fb_Bpp === 1) { + color = rQ[rQi]; + } else { + // _fb_Bpp is 4 + color = [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2], rQ[rQi + 3]]; + } + rQi += this._fb_Bpp; + } else { + color = this._FBU.foreground; + } + var xy = rQ[rQi]; + rQi++; + var sx = xy >> 4; + var sy = xy & 0x0f; + + var wh = rQ[rQi]; + rQi++; + var sw = (wh >> 4) + 1; + var sh = (wh & 0x0f) + 1; + + this._display.subTile(sx, sy, sw, sh, color); + } + } + this._display.finishTile(); + } + this._sock.set_rQi(rQi); + this._FBU.lastsubencoding = this._FBU.subencoding; + this._FBU.bytes = 0; + this._FBU.tiles--; + } + + if (this._FBU.tiles === 0) { + this._FBU.rects--; + } + + return true; + }, + + getTightCLength: function (arr) { + var header = 1, + data = 0; + data += arr[0] & 0x7f; + if (arr[0] & 0x80) { + header++; + data += (arr[1] & 0x7f) << 7; + if (arr[1] & 0x80) { + header++; + data += arr[2] << 14; + } + } + return [header, data]; + }, + + display_tight: function (isTightPNG) { + if (this._fb_depth === 1) { + this._fail("Internal error", "Tight protocol handler only implements " + "true color mode"); + } + + this._FBU.bytes = 1; // compression-control byte + if (this._sock.rQwait("TIGHT compression-control", this._FBU.bytes)) { return false; } - // We know the encoding and have a whole tile - this._FBU.subencoding = rQ[rQi]; - rQi++; - if (this._FBU.subencoding === 0) { - if (this._FBU.lastsubencoding & 0x01) { - // Weird: ignore blanks are RAW - Log.Debug(" Ignoring blank after RAW"); - } else { - this._display.fillRect(x, y, w, h, this._FBU.background); + var checksum = function (data) { + var sum = 0; + for (var i = 0; i < data.length; i++) { + sum += data[i]; + if (sum > 65536) sum -= 65536; } - } else if (this._FBU.subencoding & 0x01) { - // Raw - this._display.blitImage(x, y, w, h, rQ, rQi); - rQi += this._FBU.bytes - 1; - } else { - if (this._FBU.subencoding & 0x02) { - // Background - if (this._fb_Bpp == 1) { - this._FBU.background = rQ[rQi]; - } else { - // fb_Bpp is 4 - this._FBU.background = [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2], rQ[rQi + 3]]; + return sum; + }; + + var resetStreams = 0; + var streamId = -1; + var decompress = function (data, expected) { + for (var i = 0; i < 4; i++) { + if (resetStreams >> i & 1) { + this._FBU.zlibs[i].reset(); + _util2.default.Info("Reset zlib stream " + i); } - rQi += this._fb_Bpp; - } - if (this._FBU.subencoding & 0x04) { - // Foreground - if (this._fb_Bpp == 1) { - this._FBU.foreground = rQ[rQi]; - } else { - // this._fb_Bpp is 4 - this._FBU.foreground = [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2], rQ[rQi + 3]]; - } - rQi += this._fb_Bpp; } - this._display.startTile(x, y, w, h, this._FBU.background); - if (this._FBU.subencoding & 0x08) { - // AnySubrects - subrects = rQ[rQi]; - rQi++; + //var uncompressed = this._FBU.zlibs[streamId].uncompress(data, 0); + var uncompressed = this._FBU.zlibs[streamId].inflate(data, true, expected); + /*if (uncompressed.status !== 0) { + Util.Error("Invalid data in zlib stream"); + }*/ - for (var s = 0; s < subrects; s++) { - var color; - if (this._FBU.subencoding & 0x10) { - // SubrectsColoured - if (this._fb_Bpp === 1) { - color = rQ[rQi]; - } else { - // _fb_Bpp is 4 - color = [rQ[rQi], rQ[rQi + 1], rQ[rQi + 2], rQ[rQi + 3]]; - } - rQi += this._fb_Bpp; - } else { - color = this._FBU.foreground; + //return uncompressed.data; + return uncompressed; + }.bind(this); + + var indexedToRGBX2Color = function (data, palette, width, height) { + // Convert indexed (palette based) image data to RGB + // TODO: reduce number of calculations inside loop + var dest = this._destBuff; + var w = Math.floor((width + 7) / 8); + var w1 = Math.floor(width / 8); + + /*for (var y = 0; y < height; y++) { + var b, x, dp, sp; + var yoffset = y * width; + var ybitoffset = y * w; + var xoffset, targetbyte; + for (x = 0; x < w1; x++) { + xoffset = yoffset + x * 8; + targetbyte = data[ybitoffset + x]; + for (b = 7; b >= 0; b--) { + dp = (xoffset + 7 - b) * 3; + sp = (targetbyte >> b & 1) * 3; + dest[dp] = palette[sp]; + dest[dp + 1] = palette[sp + 1]; + dest[dp + 2] = palette[sp + 2]; } - var xy = rQ[rQi]; - rQi++; - var sx = xy >> 4; - var sy = xy & 0x0f; - - var wh = rQ[rQi]; - rQi++; - var sw = (wh >> 4) + 1; - var sh = (wh & 0x0f) + 1; - - this._display.subTile(sx, sy, sw, sh, color); } - } - this._display.finishTile(); - } - this._sock.set_rQi(rQi); - this._FBU.lastsubencoding = this._FBU.subencoding; - this._FBU.bytes = 0; - this._FBU.tiles--; - } - - if (this._FBU.tiles === 0) { - this._FBU.rects--; - } - - return true; - }, - - getTightCLength: function (arr) { - var header = 1, - data = 0; - data += arr[0] & 0x7f; - if (arr[0] & 0x80) { - header++; - data += (arr[1] & 0x7f) << 7; - if (arr[1] & 0x80) { - header++; - data += arr[2] << 14; - } - } - return [header, data]; - }, - - display_tight: function (isTightPNG) { - if (this._fb_depth === 1) { - this._fail("Internal error", "Tight protocol handler only implements " + "true color mode"); - } - - this._FBU.bytes = 1; // compression-control byte - if (this._sock.rQwait("TIGHT compression-control", this._FBU.bytes)) { - return false; - } - - var checksum = function (data) { - var sum = 0; - for (var i = 0; i < data.length; i++) { - sum += data[i]; - if (sum > 65536) sum -= 65536; - } - return sum; - }; - - var resetStreams = 0; - var streamId = -1; - var decompress = function (data, expected) { - for (var i = 0; i < 4; i++) { - if (resetStreams >> i & 1) { - this._FBU.zlibs[i].reset(); - Log.Info("Reset zlib stream " + i); - } - } - - //var uncompressed = this._FBU.zlibs[streamId].uncompress(data, 0); - var uncompressed = this._FBU.zlibs[streamId].inflate(data, true, expected); - /*if (uncompressed.status !== 0) { - Log.Error("Invalid data in zlib stream"); - }*/ - - //return uncompressed.data; - return uncompressed; - }.bind(this); - - var indexedToRGBX2Color = function (data, palette, width, height) { - // Convert indexed (palette based) image data to RGB - // TODO: reduce number of calculations inside loop - var dest = this._destBuff; - var w = Math.floor((width + 7) / 8); - var w1 = Math.floor(width / 8); - - /*for (var y = 0; y < height; y++) { - var b, x, dp, sp; - var yoffset = y * width; - var ybitoffset = y * w; - var xoffset, targetbyte; - for (x = 0; x < w1; x++) { - xoffset = yoffset + x * 8; + xoffset = yoffset + x * 8; targetbyte = data[ybitoffset + x]; - for (b = 7; b >= 0; b--) { + for (b = 7; b >= 8 - width % 8; b--) { dp = (xoffset + 7 - b) * 3; sp = (targetbyte >> b & 1) * 3; dest[dp] = palette[sp]; dest[dp + 1] = palette[sp + 1]; dest[dp + 2] = palette[sp + 2]; } - } - xoffset = yoffset + x * 8; - targetbyte = data[ybitoffset + x]; - for (b = 7; b >= 8 - width % 8; b--) { - dp = (xoffset + 7 - b) * 3; - sp = (targetbyte >> b & 1) * 3; - dest[dp] = palette[sp]; - dest[dp + 1] = palette[sp + 1]; - dest[dp + 2] = palette[sp + 2]; - } - }*/ + }*/ - for (var y = 0; y < height; y++) { - var b, x, dp, sp; - for (x = 0; x < w1; x++) { - for (b = 7; b >= 0; b--) { + for (var y = 0; y < height; y++) { + var b, x, dp, sp; + for (x = 0; x < w1; x++) { + for (b = 7; b >= 0; b--) { + dp = (y * width + x * 8 + 7 - b) * 4; + sp = (data[y * w + x] >> b & 1) * 3; + dest[dp] = palette[sp]; + dest[dp + 1] = palette[sp + 1]; + dest[dp + 2] = palette[sp + 2]; + dest[dp + 3] = 255; + } + } + + for (b = 7; b >= 8 - width % 8; b--) { dp = (y * width + x * 8 + 7 - b) * 4; sp = (data[y * w + x] >> b & 1) * 3; dest[dp] = palette[sp]; @@ -5253,401 +5349,380 @@ RFB.encodingHandlers = { } } - for (b = 7; b >= 8 - width % 8; b--) { - dp = (y * width + x * 8 + 7 - b) * 4; - sp = (data[y * w + x] >> b & 1) * 3; - dest[dp] = palette[sp]; - dest[dp + 1] = palette[sp + 1]; - dest[dp + 2] = palette[sp + 2]; - dest[dp + 3] = 255; + return dest; + }.bind(this); + + var indexedToRGBX = function (data, palette, width, height) { + // Convert indexed (palette based) image data to RGB + var dest = this._destBuff; + var total = width * height * 4; + for (var i = 0, j = 0; i < total; i += 4, j++) { + var sp = data[j] * 3; + dest[i] = palette[sp]; + dest[i + 1] = palette[sp + 1]; + dest[i + 2] = palette[sp + 2]; + dest[i + 3] = 255; } - } - return dest; - }.bind(this); + return dest; + }.bind(this); - var indexedToRGBX = function (data, palette, width, height) { - // Convert indexed (palette based) image data to RGB - var dest = this._destBuff; - var total = width * height * 4; - for (var i = 0, j = 0; i < total; i += 4, j++) { - var sp = data[j] * 3; - dest[i] = palette[sp]; - dest[i + 1] = palette[sp + 1]; - dest[i + 2] = palette[sp + 2]; - dest[i + 3] = 255; - } + var rQi = this._sock.get_rQi(); + var rQ = this._sock.rQwhole(); + var cmode, data; + var cl_header, cl_data; - return dest; - }.bind(this); + var handlePalette = function () { + var numColors = rQ[rQi + 2] + 1; + var paletteSize = numColors * this._fb_depth; + this._FBU.bytes += paletteSize; + if (this._sock.rQwait("TIGHT palette " + cmode, this._FBU.bytes)) { + return false; + } - var rQi = this._sock.get_rQi(); - var rQ = this._sock.rQwhole(); - var cmode, data; - var cl_header, cl_data; - - var handlePalette = function () { - var numColors = rQ[rQi + 2] + 1; - var paletteSize = numColors * this._fb_depth; - this._FBU.bytes += paletteSize; - if (this._sock.rQwait("TIGHT palette " + cmode, this._FBU.bytes)) { - return false; - } - - var bpp = numColors <= 2 ? 1 : 8; - var rowSize = Math.floor((this._FBU.width * bpp + 7) / 8); - var raw = false; - if (rowSize * this._FBU.height < 12) { - raw = true; - cl_header = 0; - cl_data = rowSize * this._FBU.height; - //clength = [0, rowSize * this._FBU.height]; - } else { - // begin inline getTightCLength (returning two-item arrays is bad for performance with GC) - var cl_offset = rQi + 3 + paletteSize; - cl_header = 1; - cl_data = 0; - cl_data += rQ[cl_offset] & 0x7f; - if (rQ[cl_offset] & 0x80) { - cl_header++; - cl_data += (rQ[cl_offset + 1] & 0x7f) << 7; - if (rQ[cl_offset + 1] & 0x80) { + var bpp = numColors <= 2 ? 1 : 8; + var rowSize = Math.floor((this._FBU.width * bpp + 7) / 8); + var raw = false; + if (rowSize * this._FBU.height < 12) { + raw = true; + cl_header = 0; + cl_data = rowSize * this._FBU.height; + //clength = [0, rowSize * this._FBU.height]; + } else { + // begin inline getTightCLength (returning two-item arrays is bad for performance with GC) + var cl_offset = rQi + 3 + paletteSize; + cl_header = 1; + cl_data = 0; + cl_data += rQ[cl_offset] & 0x7f; + if (rQ[cl_offset] & 0x80) { cl_header++; - cl_data += rQ[cl_offset + 2] << 14; + cl_data += (rQ[cl_offset + 1] & 0x7f) << 7; + if (rQ[cl_offset + 1] & 0x80) { + cl_header++; + cl_data += rQ[cl_offset + 2] << 14; + } } + // end inline getTightCLength } - // end inline getTightCLength - } - this._FBU.bytes += cl_header + cl_data; - if (this._sock.rQwait("TIGHT " + cmode, this._FBU.bytes)) { - return false; - } - - // Shift ctl, filter id, num colors, palette entries, and clength off - this._sock.rQskipBytes(3); - //var palette = this._sock.rQshiftBytes(paletteSize); - this._sock.rQshiftTo(this._paletteBuff, paletteSize); - this._sock.rQskipBytes(cl_header); - - if (raw) { - data = this._sock.rQshiftBytes(cl_data); - } else { - data = decompress(this._sock.rQshiftBytes(cl_data), rowSize * this._FBU.height); - } - - // Convert indexed (palette based) image data to RGB - var rgbx; - if (numColors == 2) { - rgbx = indexedToRGBX2Color(data, this._paletteBuff, this._FBU.width, this._FBU.height); - this._display.blitRgbxImage(this._FBU.x, this._FBU.y, this._FBU.width, this._FBU.height, rgbx, 0, false); - } else { - rgbx = indexedToRGBX(data, this._paletteBuff, this._FBU.width, this._FBU.height); - this._display.blitRgbxImage(this._FBU.x, this._FBU.y, this._FBU.width, this._FBU.height, rgbx, 0, false); - } - - return true; - }.bind(this); - - var handleCopy = function () { - var raw = false; - var uncompressedSize = this._FBU.width * this._FBU.height * this._fb_depth; - if (uncompressedSize < 12) { - raw = true; - cl_header = 0; - cl_data = uncompressedSize; - } else { - // begin inline getTightCLength (returning two-item arrays is for peformance with GC) - var cl_offset = rQi + 1; - cl_header = 1; - cl_data = 0; - cl_data += rQ[cl_offset] & 0x7f; - if (rQ[cl_offset] & 0x80) { - cl_header++; - cl_data += (rQ[cl_offset + 1] & 0x7f) << 7; - if (rQ[cl_offset + 1] & 0x80) { - cl_header++; - cl_data += rQ[cl_offset + 2] << 14; - } - } - // end inline getTightCLength - } - this._FBU.bytes = 1 + cl_header + cl_data; - if (this._sock.rQwait("TIGHT " + cmode, this._FBU.bytes)) { - return false; - } - - // Shift ctl, clength off - this._sock.rQshiftBytes(1 + cl_header); - - if (raw) { - data = this._sock.rQshiftBytes(cl_data); - } else { - data = decompress(this._sock.rQshiftBytes(cl_data), uncompressedSize); - } - - this._display.blitRgbImage(this._FBU.x, this._FBU.y, this._FBU.width, this._FBU.height, data, 0, false); - - return true; - }.bind(this); - - var ctl = this._sock.rQpeek8(); - - // Keep tight reset bits - resetStreams = ctl & 0xF; - - // Figure out filter - ctl = ctl >> 4; - streamId = ctl & 0x3; - - if (ctl === 0x08) cmode = "fill";else if (ctl === 0x09) cmode = "jpeg";else if (ctl === 0x0A) cmode = "png";else if (ctl & 0x04) cmode = "filter";else if (ctl < 0x04) cmode = "copy";else return this._fail("Unexpected server message", "Illegal tight compression received, " + "ctl: " + ctl); - - if (isTightPNG && (cmode === "filter" || cmode === "copy")) { - return this._fail("Unexpected server message", "filter/copy received in tightPNG mode"); - } - - switch (cmode) { - // fill use fb_depth because TPIXELs drop the padding byte - case "fill": - // TPIXEL - this._FBU.bytes += this._fb_depth; - break; - case "jpeg": - // max clength - this._FBU.bytes += 3; - break; - case "png": - // max clength - this._FBU.bytes += 3; - break; - case "filter": - // filter id + num colors if palette - this._FBU.bytes += 2; - break; - case "copy": - break; - } - - if (this._sock.rQwait("TIGHT " + cmode, this._FBU.bytes)) { - return false; - } - - // Determine FBU.bytes - switch (cmode) { - case "fill": - // skip ctl byte - this._display.fillRect(this._FBU.x, this._FBU.y, this._FBU.width, this._FBU.height, [rQ[rQi + 3], rQ[rQi + 2], rQ[rQi + 1]], false); - this._sock.rQskipBytes(4); - break; - case "png": - case "jpeg": - // begin inline getTightCLength (returning two-item arrays is for peformance with GC) - var cl_offset = rQi + 1; - cl_header = 1; - cl_data = 0; - cl_data += rQ[cl_offset] & 0x7f; - if (rQ[cl_offset] & 0x80) { - cl_header++; - cl_data += (rQ[cl_offset + 1] & 0x7f) << 7; - if (rQ[cl_offset + 1] & 0x80) { - cl_header++; - cl_data += rQ[cl_offset + 2] << 14; - } - } - // end inline getTightCLength - this._FBU.bytes = 1 + cl_header + cl_data; // ctl + clength size + jpeg-data + this._FBU.bytes += cl_header + cl_data; if (this._sock.rQwait("TIGHT " + cmode, this._FBU.bytes)) { return false; } - // We have everything, render it - this._sock.rQskipBytes(1 + cl_header); // shift off clt + compact length - data = this._sock.rQshiftBytes(cl_data); - this._display.imageRect(this._FBU.x, this._FBU.y, "image/" + cmode, data); - break; - case "filter": - var filterId = rQ[rQi + 1]; - if (filterId === 1) { - if (!handlePalette()) { - return false; - } + // Shift ctl, filter id, num colors, palette entries, and clength off + this._sock.rQskipBytes(3); + //var palette = this._sock.rQshiftBytes(paletteSize); + this._sock.rQshiftTo(this._paletteBuff, paletteSize); + this._sock.rQskipBytes(cl_header); + + if (raw) { + data = this._sock.rQshiftBytes(cl_data); } else { - // Filter 0, Copy could be valid here, but servers don't send it as an explicit filter - // Filter 2, Gradient is valid but not use if jpeg is enabled - this._fail("Unexpected server message", "Unsupported tight subencoding received, " + "filter: " + filterId); + data = decompress(this._sock.rQshiftBytes(cl_data), rowSize * this._FBU.height); } - break; - case "copy": - if (!handleCopy()) { + + // Convert indexed (palette based) image data to RGB + var rgbx; + if (numColors == 2) { + rgbx = indexedToRGBX2Color(data, this._paletteBuff, this._FBU.width, this._FBU.height); + this._display.blitRgbxImage(this._FBU.x, this._FBU.y, this._FBU.width, this._FBU.height, rgbx, 0, false); + } else { + rgbx = indexedToRGBX(data, this._paletteBuff, this._FBU.width, this._FBU.height); + this._display.blitRgbxImage(this._FBU.x, this._FBU.y, this._FBU.width, this._FBU.height, rgbx, 0, false); + } + + return true; + }.bind(this); + + var handleCopy = function () { + var raw = false; + var uncompressedSize = this._FBU.width * this._FBU.height * this._fb_depth; + if (uncompressedSize < 12) { + raw = true; + cl_header = 0; + cl_data = uncompressedSize; + } else { + // begin inline getTightCLength (returning two-item arrays is for peformance with GC) + var cl_offset = rQi + 1; + cl_header = 1; + cl_data = 0; + cl_data += rQ[cl_offset] & 0x7f; + if (rQ[cl_offset] & 0x80) { + cl_header++; + cl_data += (rQ[cl_offset + 1] & 0x7f) << 7; + if (rQ[cl_offset + 1] & 0x80) { + cl_header++; + cl_data += rQ[cl_offset + 2] << 14; + } + } + // end inline getTightCLength + } + this._FBU.bytes = 1 + cl_header + cl_data; + if (this._sock.rQwait("TIGHT " + cmode, this._FBU.bytes)) { return false; } - break; - } - this._FBU.bytes = 0; - this._FBU.rects--; + // Shift ctl, clength off + this._sock.rQshiftBytes(1 + cl_header); - return true; - }, + if (raw) { + data = this._sock.rQshiftBytes(cl_data); + } else { + data = decompress(this._sock.rQshiftBytes(cl_data), uncompressedSize); + } - TIGHT: function () { - return this._encHandlers.display_tight(false); - }, - TIGHT_PNG: function () { - return this._encHandlers.display_tight(true); - }, + this._display.blitRgbImage(this._FBU.x, this._FBU.y, this._FBU.width, this._FBU.height, data, 0, false); - last_rect: function () { - this._FBU.rects = 0; - return true; - }, + return true; + }.bind(this); - handle_FB_resize: function () { - this._fb_width = this._FBU.width; - this._fb_height = this._FBU.height; - this._destBuff = new Uint8Array(this._fb_width * this._fb_height * 4); - this._display.resize(this._fb_width, this._fb_height); - this._onFBResize(this, this._fb_width, this._fb_height); - this._timing.fbu_rt_start = new Date().getTime(); - this._updateContinuousUpdates(); + var ctl = this._sock.rQpeek8(); - this._FBU.bytes = 0; - this._FBU.rects -= 1; - return true; - }, + // Keep tight reset bits + resetStreams = ctl & 0xF; - ExtendedDesktopSize: function () { - this._FBU.bytes = 1; - if (this._sock.rQwait("ExtendedDesktopSize", this._FBU.bytes)) { - return false; - } + // Figure out filter + ctl = ctl >> 4; + streamId = ctl & 0x3; - this._supportsSetDesktopSize = true; - var number_of_screens = this._sock.rQpeek8(); + if (ctl === 0x08) cmode = "fill";else if (ctl === 0x09) cmode = "jpeg";else if (ctl === 0x0A) cmode = "png";else if (ctl & 0x04) cmode = "filter";else if (ctl < 0x04) cmode = "copy";else return this._fail("Unexpected server message", "Illegal tight compression received, " + "ctl: " + ctl); - this._FBU.bytes = 4 + number_of_screens * 16; - if (this._sock.rQwait("ExtendedDesktopSize", this._FBU.bytes)) { - return false; - } - - this._sock.rQskipBytes(1); // number-of-screens - this._sock.rQskipBytes(3); // padding - - for (var i = 0; i < number_of_screens; i += 1) { - // Save the id and flags of the first screen - if (i === 0) { - this._screen_id = this._sock.rQshiftBytes(4); // id - this._sock.rQskipBytes(2); // x-position - this._sock.rQskipBytes(2); // y-position - this._sock.rQskipBytes(2); // width - this._sock.rQskipBytes(2); // height - this._screen_flags = this._sock.rQshiftBytes(4); // flags - } else { - this._sock.rQskipBytes(16); + if (isTightPNG && (cmode === "filter" || cmode === "copy")) { + return this._fail("Unexpected server message", "filter/copy received in tightPNG mode"); } - } - /* - * The x-position indicates the reason for the change: - * - * 0 - server resized on its own - * 1 - this client requested the resize - * 2 - another client requested the resize - */ - - // We need to handle errors when we requested the resize. - if (this._FBU.x === 1 && this._FBU.y !== 0) { - var msg = ""; - // The y-position indicates the status code from the server - switch (this._FBU.y) { - case 1: - msg = "Resize is administratively prohibited"; + switch (cmode) { + // fill use fb_depth because TPIXELs drop the padding byte + case "fill": + // TPIXEL + this._FBU.bytes += this._fb_depth; break; - case 2: - msg = "Out of resources"; + case "jpeg": + // max clength + this._FBU.bytes += 3; break; - case 3: - msg = "Invalid screen layout"; + case "png": + // max clength + this._FBU.bytes += 3; break; - default: - msg = "Unknown reason"; + case "filter": + // filter id + num colors if palette + this._FBU.bytes += 2; + break; + case "copy": break; } - this._notification("Server did not accept the resize request: " + msg, 'normal'); + + if (this._sock.rQwait("TIGHT " + cmode, this._FBU.bytes)) { + return false; + } + + // Determine FBU.bytes + switch (cmode) { + case "fill": + // skip ctl byte + this._display.fillRect(this._FBU.x, this._FBU.y, this._FBU.width, this._FBU.height, [rQ[rQi + 3], rQ[rQi + 2], rQ[rQi + 1]], false); + this._sock.rQskipBytes(4); + break; + case "png": + case "jpeg": + // begin inline getTightCLength (returning two-item arrays is for peformance with GC) + var cl_offset = rQi + 1; + cl_header = 1; + cl_data = 0; + cl_data += rQ[cl_offset] & 0x7f; + if (rQ[cl_offset] & 0x80) { + cl_header++; + cl_data += (rQ[cl_offset + 1] & 0x7f) << 7; + if (rQ[cl_offset + 1] & 0x80) { + cl_header++; + cl_data += rQ[cl_offset + 2] << 14; + } + } + // end inline getTightCLength + this._FBU.bytes = 1 + cl_header + cl_data; // ctl + clength size + jpeg-data + if (this._sock.rQwait("TIGHT " + cmode, this._FBU.bytes)) { + return false; + } + + // We have everything, render it + this._sock.rQskipBytes(1 + cl_header); // shift off clt + compact length + data = this._sock.rQshiftBytes(cl_data); + this._display.imageRect(this._FBU.x, this._FBU.y, "image/" + cmode, data); + break; + case "filter": + var filterId = rQ[rQi + 1]; + if (filterId === 1) { + if (!handlePalette()) { + return false; + } + } else { + // Filter 0, Copy could be valid here, but servers don't send it as an explicit filter + // Filter 2, Gradient is valid but not use if jpeg is enabled + this._fail("Unexpected server message", "Unsupported tight subencoding received, " + "filter: " + filterId); + } + break; + case "copy": + if (!handleCopy()) { + return false; + } + break; + } + + this._FBU.bytes = 0; + this._FBU.rects--; + return true; + }, + + TIGHT: function () { + return this._encHandlers.display_tight(false); + }, + TIGHT_PNG: function () { + return this._encHandlers.display_tight(true); + }, + + last_rect: function () { + this._FBU.rects = 0; + return true; + }, + + handle_FB_resize: function () { + this._fb_width = this._FBU.width; + this._fb_height = this._FBU.height; + this._destBuff = new Uint8Array(this._fb_width * this._fb_height * 4); + this._display.resize(this._fb_width, this._fb_height); + this._onFBResize(this, this._fb_width, this._fb_height); + this._timing.fbu_rt_start = new Date().getTime(); + this._updateContinuousUpdates(); + + this._FBU.bytes = 0; + this._FBU.rects -= 1; + return true; + }, + + ExtendedDesktopSize: function () { + this._FBU.bytes = 1; + if (this._sock.rQwait("ExtendedDesktopSize", this._FBU.bytes)) { + return false; + } + + this._supportsSetDesktopSize = true; + var number_of_screens = this._sock.rQpeek8(); + + this._FBU.bytes = 4 + number_of_screens * 16; + if (this._sock.rQwait("ExtendedDesktopSize", this._FBU.bytes)) { + return false; + } + + this._sock.rQskipBytes(1); // number-of-screens + this._sock.rQskipBytes(3); // padding + + for (var i = 0; i < number_of_screens; i += 1) { + // Save the id and flags of the first screen + if (i === 0) { + this._screen_id = this._sock.rQshiftBytes(4); // id + this._sock.rQskipBytes(2); // x-position + this._sock.rQskipBytes(2); // y-position + this._sock.rQskipBytes(2); // width + this._sock.rQskipBytes(2); // height + this._screen_flags = this._sock.rQshiftBytes(4); // flags + } else { + this._sock.rQskipBytes(16); + } + } + + /* + * The x-position indicates the reason for the change: + * + * 0 - server resized on its own + * 1 - this client requested the resize + * 2 - another client requested the resize + */ + + // We need to handle errors when we requested the resize. + if (this._FBU.x === 1 && this._FBU.y !== 0) { + var msg = ""; + // The y-position indicates the status code from the server + switch (this._FBU.y) { + case 1: + msg = "Resize is administratively prohibited"; + break; + case 2: + msg = "Out of resources"; + break; + case 3: + msg = "Invalid screen layout"; + break; + default: + msg = "Unknown reason"; + break; + } + this._notification("Server did not accept the resize request: " + msg, 'normal'); + return true; + } + + this._encHandlers.handle_FB_resize(); + return true; + }, + + DesktopSize: function () { + this._encHandlers.handle_FB_resize(); + return true; + }, + + Cursor: function () { + _util2.default.Debug(">> set_cursor"); + var x = this._FBU.x; // hotspot-x + var y = this._FBU.y; // hotspot-y + var w = this._FBU.width; + var h = this._FBU.height; + + var pixelslength = w * h * this._fb_Bpp; + var masklength = Math.floor((w + 7) / 8) * h; + + this._FBU.bytes = pixelslength + masklength; + if (this._sock.rQwait("cursor encoding", this._FBU.bytes)) { + return false; + } + + this._display.changeCursor(this._sock.rQshiftBytes(pixelslength), this._sock.rQshiftBytes(masklength), x, y, w, h); + + this._FBU.bytes = 0; + this._FBU.rects--; + + _util2.default.Debug("<< set_cursor"); + return true; + }, + + QEMUExtendedKeyEvent: function () { + this._FBU.rects--; + + var keyboardEvent = document.createEvent("keyboardEvent"); + if (keyboardEvent.code !== undefined) { + this._qemuExtKeyEventSupported = true; + this._keyboard.setQEMUVNCKeyboardHandler(); + } + }, + + JPEG_quality_lo: function () { + _util2.default.Error("Server sent jpeg_quality pseudo-encoding"); + }, + + compress_lo: function () { + _util2.default.Error("Server sent compress level pseudo-encoding"); } + }; +})(); +module.exports = exports["default"]; - this._encHandlers.handle_FB_resize(); - return true; - }, - - DesktopSize: function () { - this._encHandlers.handle_FB_resize(); - return true; - }, - - Cursor: function () { - Log.Debug(">> set_cursor"); - var x = this._FBU.x; // hotspot-x - var y = this._FBU.y; // hotspot-y - var w = this._FBU.width; - var h = this._FBU.height; - - var pixelslength = w * h * this._fb_Bpp; - var masklength = Math.floor((w + 7) / 8) * h; - - this._FBU.bytes = pixelslength + masklength; - if (this._sock.rQwait("cursor encoding", this._FBU.bytes)) { - return false; - } - - this._display.changeCursor(this._sock.rQshiftBytes(pixelslength), this._sock.rQshiftBytes(masklength), x, y, w, h); - - this._FBU.bytes = 0; - this._FBU.rects--; - - Log.Debug("<< set_cursor"); - return true; - }, - - QEMUExtendedKeyEvent: function () { - this._FBU.rects--; - - var keyboardEvent = document.createEvent("keyboardEvent"); - if (keyboardEvent.code !== undefined) { - this._qemuExtKeyEventSupported = true; - this._keyboard.setQEMUVNCKeyboardHandler(); - } - }, - - JPEG_quality_lo: function () { - Log.Error("Server sent jpeg_quality pseudo-encoding"); - }, - - compress_lo: function () { - Log.Error("Server sent compress level pseudo-encoding"); - } -}; -},{"./base64.js":1,"./des.js":2,"./display.js":3,"./inflator.js":4,"./input/devices.js":5,"./input/keysym.js":6,"./input/xtscancodes.js":9,"./util/localization.js":13,"./util/logging.js":14,"./util/properties.js":15,"./util/strings.js":16,"./websock.js":17}],11:[function(require,module,exports){ +},{"./base64":1,"./des":2,"./display":3,"./inflator.mod":4,"./input/devices":5,"./input/keysym":6,"./input/xtscancodes":9,"./util":11,"./websock":12}],11:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -exports.isTouchDevice = exports.Engine = undefined; -exports.browserSupportsCursorURIs = browserSupportsCursorURIs; -exports._forceCursorURIs = _forceCursorURIs; - -var _logging = require('./logging.js'); - -var Log = _interopRequireWildcard(_logging); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -// Set browser engine versions. Based on mootools. -var Features = { xpath: !!document.evaluate, query: !!document.querySelector }; - -// 'presto': (function () { return (!window.opera) ? false : true; }()), /* * noVNC: HTML5 VNC client * Copyright (C) 2012 Joel Martin @@ -5656,495 +5731,51 @@ var Features = { xpath: !!document.evaluate, query: !!document.querySelector }; * See README.md for usage and integration instructions. */ -var detectPresto = function () { - return !!window.opera; -}; +/* jshint white: false, nonstandard: true */ +/*global window, console, document, navigator, ActiveXObject, INCLUDE_URI */ -// 'trident': (function () { return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? ((document.querySelectorAll) ? 6 : 5) : 4); -var detectTrident = function () { - if (!window.ActiveXObject) { - return false; - } else { - if (window.XMLHttpRequest) { - return document.querySelectorAll ? 6 : 5; - } else { - return 4; - } - } -}; - -// 'webkit': (function () { try { return (navigator.taintEnabled) ? false : ((Features.xpath) ? ((Features.query) ? 525 : 420) : 419); } catch (e) { return false; } }()), -var detectInitialWebkit = function () { - try { - if (navigator.taintEnabled) { - return false; - } else { - if (Features.xpath) { - return Features.query ? 525 : 420; - } else { - return 419; - } - } - } catch (e) { - return false; - } -}; - -var detectActualWebkit = function (initial_ver) { - var re = /WebKit\/([0-9\.]*) /; - var str_ver = (navigator.userAgent.match(re) || ['', initial_ver])[1]; - return parseFloat(str_ver, 10); -}; - -// 'gecko': (function () { return (!document.getBoxObjectFor && window.mozInnerScreenX == null) ? false : ((document.getElementsByClassName) ? 19ssName) ? 19 : 18 : 18); }()) -var detectGecko = function () { - /* jshint -W041 */ - if (!document.getBoxObjectFor && window.mozInnerScreenX == null) { - return false; - } else { - return document.getElementsByClassName ? 19 : 18; - } - /* jshint +W041 */ -}; - -var isWebkitInitial = detectInitialWebkit(); - -var Engine = exports.Engine = { - // Version detection break in Opera 11.60 (errors on arguments.callee.caller reference) - //'presto': (function() { - // return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925)); }()), - 'presto': detectPresto(), - 'trident': detectTrident(), - 'webkit': isWebkitInitial ? detectActualWebkit(isWebkitInitial) : false, - 'gecko': detectGecko() -}; - -// Touch detection -var isTouchDevice = exports.isTouchDevice = 'ontouchstart' in document.documentElement || -// requried for Chrome debugger -document.ontouchstart !== undefined || -// required for MS Surface -navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0; -window.addEventListener('touchstart', function onFirstTouch() { - exports.isTouchDevice = isTouchDevice = true; - window.removeEventListener('touchstart', onFirstTouch, false); -}, false); - -var _cursor_uris_supported = null; - -function browserSupportsCursorURIs() { - if (_cursor_uris_supported === null) { - try { - var target = document.createElement('canvas'); - target.style.cursor = 'url("data:image/x-icon;base64,AAACAAEACAgAAAIAAgA4AQAAFgAAACgAAAAIAAAAEAAAAAEAIAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAA==") 2 2, default'; - - if (target.style.cursor) { - Log.Info("Data URI scheme cursor supported"); - _cursor_uris_supported = true; - } else { - Log.Warn("Data URI scheme cursor not supported"); - _cursor_uris_supported = false; - } - } catch (exc) { - Log.Error("Data URI scheme cursor test exception: " + exc); - _cursor_uris_supported = false; - } - } - - return _cursor_uris_supported; -}; - -function _forceCursorURIs(enabled) { - if (enabled === undefined || enabled) { - _cursor_uris_supported = true; - } else { - _cursor_uris_supported = false; - } -} -},{"./logging.js":14}],12:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.getPointerEvent = getPointerEvent; -exports.stopEvent = stopEvent; -exports.setCapture = setCapture; -exports.releaseCapture = releaseCapture; - -var _logging = require("./logging.js"); - -var Log = _interopRequireWildcard(_logging); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function getPointerEvent(e) { - return e.changedTouches ? e.changedTouches[0] : e.touches ? e.touches[0] : e; -} /* - * noVNC: HTML5 VNC client - * Copyright (C) 2012 Joel Martin - * Licensed under MPL 2.0 (see LICENSE.txt) - * - * See README.md for usage and integration instructions. - */ +var Util = {}; /* - * Cross-browser event and position routines - */ - -; - -function stopEvent(e) { - e.stopPropagation(); - e.preventDefault(); -}; - -// Emulate Element.setCapture() when not supported -var _captureRecursion = false; -var _captureElem = null; -var _captureProxy = function (e) { - // Recursion protection as we'll see our own event - if (_captureRecursion) return; - - // Clone the event as we cannot dispatch an already dispatched event - var newEv = new e.constructor(e.type, e); - - _captureRecursion = true; - _captureElem.dispatchEvent(newEv); - _captureRecursion = false; - - // Avoid double events - e.stopPropagation(); - - // Respect the wishes of the redirected event handlers - if (newEv.defaultPrevented) { - e.preventDefault(); - } - - // Implicitly release the capture on button release - if (e.type === "mouseup" || e.type === "touchend") { - releaseCapture(); - } -}; - -// Follow cursor style of target element -var _captureElemChanged = function () { - var captureElem = document.getElementById("noVNC_mouse_capture_elem"); - captureElem.style.cursor = window.getComputedStyle(_captureElem).cursor; -}; -var _captureObserver = new MutationObserver(_captureElemChanged); - -var _captureIndex = 0; - -function setCapture(elem) { - if (elem.setCapture) { - - elem.setCapture(); - - // IE releases capture on 'click' events which might not trigger - elem.addEventListener('mouseup', releaseCapture); - elem.addEventListener('touchend', releaseCapture); - } else { - // Release any existing capture in case this method is - // called multiple times without coordination - releaseCapture(); - - // Safari on iOS 9 has a broken constructor for TouchEvent. - // We are fine in this case however, since Safari seems to - // have some sort of implicit setCapture magic anyway. - if (window.TouchEvent !== undefined) { - try { - new TouchEvent("touchstart"); - } catch (TypeError) { - return; - } - } - - var captureElem = document.getElementById("noVNC_mouse_capture_elem"); - - if (captureElem === null) { - captureElem = document.createElement("div"); - captureElem.id = "noVNC_mouse_capture_elem"; - captureElem.style.position = "fixed"; - captureElem.style.top = "0px"; - captureElem.style.left = "0px"; - captureElem.style.width = "100%"; - captureElem.style.height = "100%"; - captureElem.style.zIndex = 10000; - captureElem.style.display = "none"; - document.body.appendChild(captureElem); - - // This is to make sure callers don't get confused by having - // our blocking element as the target - captureElem.addEventListener('contextmenu', _captureProxy); - - captureElem.addEventListener('mousemove', _captureProxy); - captureElem.addEventListener('mouseup', _captureProxy); - - captureElem.addEventListener('touchmove', _captureProxy); - captureElem.addEventListener('touchend', _captureProxy); - } - - _captureElem = elem; - _captureIndex++; - - // Track cursor and get initial cursor - _captureObserver.observe(elem, { attributes: true }); - _captureElemChanged(); - - captureElem.style.display = null; - - // We listen to events on window in order to keep tracking if it - // happens to leave the viewport - window.addEventListener('mousemove', _captureProxy); - window.addEventListener('mouseup', _captureProxy); - - window.addEventListener('touchmove', _captureProxy); - window.addEventListener('touchend', _captureProxy); - } -}; - -function releaseCapture() { - if (document.releaseCapture) { - - document.releaseCapture(); - } else { - if (!_captureElem) { - return; - } - - // There might be events already queued, so we need to wait for - // them to flush. E.g. contextmenu in Microsoft Edge - window.setTimeout(function (expected) { - // Only clear it if it's the expected grab (i.e. no one - // else has initiated a new grab) - if (_captureIndex === expected) { - _captureElem = null; - } - }, 0, _captureIndex); - - _captureObserver.disconnect(); - - var captureElem = document.getElementById("noVNC_mouse_capture_elem"); - captureElem.style.display = "none"; - - window.removeEventListener('mousemove', _captureProxy); - window.removeEventListener('mouseup', _captureProxy); - - window.removeEventListener('touchmove', _captureProxy); - window.removeEventListener('touchend', _captureProxy); - } -}; -},{"./logging.js":14}],13:[function(require,module,exports){ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.Localizer = Localizer; -/* - * noVNC: HTML5 VNC client - * Copyright (C) 2012 Joel Martin - * Licensed under MPL 2.0 (see LICENSE.txt) - * - * See README.md for usage and integration instructions. - */ - -/* - * Localization Utilities - */ - -function Localizer() { - // Currently configured language - this.language = 'en'; - - // Current dictionary of translations - this.dictionary = undefined; -} - -Localizer.prototype = { - // Configure suitable language based on user preferences - setup: function (supportedLanguages) { - var userLanguages; - - this.language = 'en'; // Default: US English - - /* - * Navigator.languages only available in Chrome (32+) and FireFox (32+) - * Fall back to navigator.language for other browsers - */ - if (typeof window.navigator.languages == 'object') { - userLanguages = window.navigator.languages; - } else { - userLanguages = [navigator.language || navigator.userLanguage]; - } - - for (var i = 0; i < userLanguages.length; i++) { - var userLang = userLanguages[i]; - userLang = userLang.toLowerCase(); - userLang = userLang.replace("_", "-"); - userLang = userLang.split("-"); - - // Built-in default? - if (userLang[0] === 'en' && (userLang[1] === undefined || userLang[1] === 'us')) { - return; - } - - // First pass: perfect match - for (var j = 0; j < supportedLanguages.length; j++) { - var supLang = supportedLanguages[j]; - supLang = supLang.toLowerCase(); - supLang = supLang.replace("_", "-"); - supLang = supLang.split("-"); - - if (userLang[0] !== supLang[0]) continue; - if (userLang[1] !== supLang[1]) continue; - - this.language = supportedLanguages[j]; - return; - } - - // Second pass: fallback - for (var j = 0; j < supportedLanguages.length; j++) { - supLang = supportedLanguages[j]; - supLang = supLang.toLowerCase(); - supLang = supLang.replace("_", "-"); - supLang = supLang.split("-"); - - if (userLang[0] !== supLang[0]) continue; - if (supLang[1] !== undefined) continue; - - this.language = supportedLanguages[j]; - return; - } - } - }, - - // Retrieve localised text - get: function (id) { - if (typeof this.dictionary !== 'undefined' && this.dictionary[id]) { - return this.dictionary[id]; - } else { - return id; - } - }, - - // Traverses the DOM and translates relevant fields - // See https://html.spec.whatwg.org/multipage/dom.html#attr-translate - translateDOM: function () { - var self = this; - function process(elem, enabled) { - function isAnyOf(searchElement, items) { - return items.indexOf(searchElement) !== -1; - } - - function translateAttribute(elem, attr) { - var str = elem.getAttribute(attr); - str = self.get(str); - elem.setAttribute(attr, str); - } - - function translateTextNode(node) { - var str = node.data.trim(); - str = self.get(str); - node.data = str; - } - - if (elem.hasAttribute("translate")) { - if (isAnyOf(elem.getAttribute("translate"), ["", "yes"])) { - enabled = true; - } else if (isAnyOf(elem.getAttribute("translate"), ["no"])) { - enabled = false; - } - } - - if (enabled) { - if (elem.hasAttribute("abbr") && elem.tagName === "TH") { - translateAttribute(elem, "abbr"); - } - if (elem.hasAttribute("alt") && isAnyOf(elem.tagName, ["AREA", "IMG", "INPUT"])) { - translateAttribute(elem, "alt"); - } - if (elem.hasAttribute("download") && isAnyOf(elem.tagName, ["A", "AREA"])) { - translateAttribute(elem, "download"); - } - if (elem.hasAttribute("label") && isAnyOf(elem.tagName, ["MENUITEM", "MENU", "OPTGROUP", "OPTION", "TRACK"])) { - translateAttribute(elem, "label"); - } - // FIXME: Should update "lang" - if (elem.hasAttribute("placeholder") && isAnyOf(elem.tagName, ["INPUT", "TEXTAREA"])) { - translateAttribute(elem, "placeholder"); - } - if (elem.hasAttribute("title")) { - translateAttribute(elem, "title"); - } - if (elem.hasAttribute("value") && elem.tagName === "INPUT" && isAnyOf(elem.getAttribute("type"), ["reset", "button"])) { - translateAttribute(elem, "value"); - } - } - - for (var i = 0; i < elem.childNodes.length; i++) { - var node = elem.childNodes[i]; - if (node.nodeType === node.ELEMENT_NODE) { - process(node, enabled); - } else if (node.nodeType === node.TEXT_NODE && enabled) { - translateTextNode(node); - } - } - } - - process(document.body, true); - } -}; - -var l10n = exports.l10n = new Localizer(); -exports.default = l10n.get.bind(l10n); -},{}],14:[function(require,module,exports){ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.init_logging = init_logging; -exports.get_logging = get_logging; -/* - * noVNC: HTML5 VNC client - * Copyright (C) 2012 Joel Martin - * Licensed under MPL 2.0 (see LICENSE.txt) - * - * See README.md for usage and integration instructions. + * ------------------------------------------------------ + * Namespaced in Util + * ------------------------------------------------------ */ /* * Logging/debug routines */ -var _log_level = 'warn'; +Util._log_level = 'warn'; +Util.init_logging = function (level) { + "use strict"; -var Debug = function (msg) {}; -var Info = function (msg) {}; -var Warn = function (msg) {}; -var Error = function (msg) {}; - -function init_logging(level) { if (typeof level === 'undefined') { - level = _log_level; + level = Util._log_level; } else { - _log_level = level; + Util._log_level = level; } - exports.Debug = Debug = exports.Info = Info = exports.Warn = Warn = exports.Error = Error = function (msg) {}; + Util.Debug = Util.Info = Util.Warn = Util.Error = function (msg) {}; if (typeof window.console !== "undefined") { /* jshint -W086 */ switch (level) { case 'debug': - exports.Debug = Debug = console.debug.bind(window.console); + Util.Debug = function (msg) { + console.log(msg); + }; case 'info': - exports.Info = Info = console.info.bind(window.console); + Util.Info = function (msg) { + console.info(msg); + }; case 'warn': - exports.Warn = Warn = console.warn.bind(window.console); + Util.Warn = function (msg) { + console.warn(msg); + }; case 'error': - exports.Error = Error = console.error.bind(window.console); + Util.Error = function (msg) { + console.error(msg); + }; case 'none': break; default: @@ -6153,33 +5784,13 @@ function init_logging(level) { /* jshint +W086 */ } }; -function get_logging() { - return _log_level; +Util.get_logging = function () { + return Util._log_level; }; -exports.Debug = Debug; -exports.Info = Info; -exports.Warn = Warn; -exports.Error = Error; - // Initialize logging level +Util.init_logging(); -init_logging(); -},{}],15:[function(require,module,exports){ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.make_properties = make_properties; -exports.set_defaults = set_defaults; - -var _logging = require('./logging.js'); - -var Log = _interopRequireWildcard(_logging); - -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } - -function make_property(proto, name, mode, type) { +Util.make_property = function (proto, name, mode, type) { "use strict"; var getter; @@ -6272,29 +5883,17 @@ function make_property(proto, name, mode, type) { setter.call(this, val, idx); //delete this['_init_set_' + name]; // remove it after use }; -} /* - * noVNC: HTML5 VNC client - * Copyright (C) 2012 Joel Martin - * Licensed under MPL 2.0 (see LICENSE.txt) - * - * See README.md for usage and integration instructions. - */ +}; -/* - * Getter/Setter Creation Utilities - */ - -; - -function make_properties(constructor, arr) { +Util.make_properties = function (constructor, arr) { "use strict"; for (var i = 0; i < arr.length; i++) { - make_property(constructor.prototype, arr[i][0], arr[i][1], arr[i][2]); + Util.make_property(constructor.prototype, arr[i][0], arr[i][1], arr[i][2]); } }; -function set_defaults(obj, conf, defaults) { +Util.set_defaults = function (obj, conf, defaults) { var defaults_keys = Object.keys(defaults); var conf_keys = Object.keys(conf); var keys_obj = {}; @@ -6310,7 +5909,7 @@ function set_defaults(obj, conf, defaults) { for (i = 0; i < keys.length; i++) { var setter = obj['_raw_set_' + keys[i]]; if (!setter) { - Log.Warn('Invalid property ' + keys[i]); + Util.Warn('Invalid property ' + keys[i]); continue; } @@ -6321,46 +5920,312 @@ function set_defaults(obj, conf, defaults) { } } }; -},{"./logging.js":14}],16:[function(require,module,exports){ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports.decodeUTF8 = decodeUTF8; -/* - * noVNC: HTML5 VNC client - * Copyright (C) 2012 Joel Martin - * Licensed under MPL 2.0 (see LICENSE.txt) - * - * See README.md for usage and integration instructions. - */ /* * Decode from UTF-8 */ -function decodeUTF8(utf8string) { - "use strict"; +Util.decodeUTF8 = function (utf8string) { + "use strict"; - return decodeURIComponent(escape(utf8string)); + return decodeURIComponent(escape(utf8string)); }; -},{}],17:[function(require,module,exports){ -'use strict'; + +/* + * Cross-browser routines + */ + +Util.getPosition = function (obj) { + "use strict"; + // NB(sross): the Mozilla developer reference seems to indicate that + // getBoundingClientRect includes border and padding, so the canvas + // style should NOT include either. + + var objPosition = obj.getBoundingClientRect(); + return { 'x': objPosition.left + window.pageXOffset, 'y': objPosition.top + window.pageYOffset, + 'width': objPosition.width, 'height': objPosition.height }; +}; + +Util.getPointerEvent = function (e) { + var evt; + evt = e ? e : window.event; + evt = evt.changedTouches ? evt.changedTouches[0] : evt.touches ? evt.touches[0] : evt; + return evt; +}; + +// Get mouse event position in DOM element +Util.getEventPosition = function (e, obj, scale) { + "use strict"; + + var evt, docX, docY, pos; + evt = Util.getPointerEvent(e); + if (evt.pageX || evt.pageY) { + docX = evt.pageX; + docY = evt.pageY; + } else if (evt.clientX || evt.clientY) { + docX = evt.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; + docY = evt.clientY + document.body.scrollTop + document.documentElement.scrollTop; + } + pos = Util.getPosition(obj); + if (typeof scale === "undefined") { + scale = 1; + } + var realx = docX - pos.x; + var realy = docY - pos.y; + var x = Math.max(Math.min(realx, pos.width - 1), 0); + var y = Math.max(Math.min(realy, pos.height - 1), 0); + return { 'x': x / scale, 'y': y / scale, 'realx': realx / scale, 'realy': realy / scale }; +}; + +Util.stopEvent = function (e) { + e.stopPropagation(); + e.preventDefault(); +}; + +// Touch detection +Util.isTouchDevice = 'ontouchstart' in document.documentElement || +// requried for Chrome debugger +document.ontouchstart !== undefined || +// required for MS Surface +navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0; +window.addEventListener('touchstart', function onFirstTouch() { + Util.isTouchDevice = true; + window.removeEventListener('touchstart', onFirstTouch, false); +}, false); + +Util._cursor_uris_supported = null; + +Util.browserSupportsCursorURIs = function () { + if (Util._cursor_uris_supported === null) { + try { + var target = document.createElement('canvas'); + target.style.cursor = 'url("data:image/x-icon;base64,AAACAAEACAgAAAIAAgA4AQAAFgAAACgAAAAIAAAAEAAAAAEAIAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAA==") 2 2, default'; + + if (target.style.cursor) { + Util.Info("Data URI scheme cursor supported"); + Util._cursor_uris_supported = true; + } else { + Util.Warn("Data URI scheme cursor not supported"); + Util._cursor_uris_supported = false; + } + } catch (exc) { + Util.Error("Data URI scheme cursor test exception: " + exc); + Util._cursor_uris_supported = false; + } + } + + return Util._cursor_uris_supported; +}; + +// Set browser engine versions. Based on mootools. +Util.Features = { xpath: !!document.evaluate, air: !!window.runtime, query: !!document.querySelector }; + +(function () { + "use strict"; + // 'presto': (function () { return (!window.opera) ? false : true; }()), + + var detectPresto = function () { + return !!window.opera; + }; + + // 'trident': (function () { return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? ((document.querySelectorAll) ? 6 : 5) : 4); + var detectTrident = function () { + if (!window.ActiveXObject) { + return false; + } else { + if (window.XMLHttpRequest) { + return document.querySelectorAll ? 6 : 5; + } else { + return 4; + } + } + }; + + // 'webkit': (function () { try { return (navigator.taintEnabled) ? false : ((Util.Features.xpath) ? ((Util.Features.query) ? 525 : 420) : 419); } catch (e) { return false; } }()), + var detectInitialWebkit = function () { + try { + if (navigator.taintEnabled) { + return false; + } else { + if (Util.Features.xpath) { + return Util.Features.query ? 525 : 420; + } else { + return 419; + } + } + } catch (e) { + return false; + } + }; + + var detectActualWebkit = function (initial_ver) { + var re = /WebKit\/([0-9\.]*) /; + var str_ver = (navigator.userAgent.match(re) || ['', initial_ver])[1]; + return parseFloat(str_ver, 10); + }; + + // 'gecko': (function () { return (!document.getBoxObjectFor && window.mozInnerScreenX == null) ? false : ((document.getElementsByClassName) ? 19ssName) ? 19 : 18 : 18); }()) + var detectGecko = function () { + /* jshint -W041 */ + if (!document.getBoxObjectFor && window.mozInnerScreenX == null) { + return false; + } else { + return document.getElementsByClassName ? 19 : 18; + } + /* jshint +W041 */ + }; + + Util.Engine = { + // Version detection break in Opera 11.60 (errors on arguments.callee.caller reference) + //'presto': (function() { + // return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925)); }()), + 'presto': detectPresto(), + 'trident': detectTrident(), + 'webkit': detectInitialWebkit(), + 'gecko': detectGecko() + }; + + if (Util.Engine.webkit) { + // Extract actual webkit version if available + Util.Engine.webkit = detectActualWebkit(Util.Engine.webkit); + } +})(); + +Util.Flash = function () { + "use strict"; + + var v, version; + try { + v = navigator.plugins['Shockwave Flash'].description; + } catch (err1) { + try { + v = new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version'); + } catch (err2) { + v = '0 r0'; + } + } + version = v.match(/\d+/g); + return { version: parseInt(version[0] || 0 + '.' + version[1], 10) || 0, build: parseInt(version[2], 10) || 0 }; +}(); + +Util.Localisation = { + defaultLanguage: 'en-GB', + + /* + * Not all languages have been translated + * Some countries prefer a certain language + */ + supportedLanguages: { + 'en': 'en-GB', + 'en-GB': 'en-GB', + 'en-US': 'en-GB', + 'nl': 'nl-NL', + 'nl-NL': 'nl-NL', + 'nl-BE': 'nl-NL', + 'de': 'de-DE', + 'de-DE': 'de-DE', + 'sv-SE': 'sv-SE', + 'sv': 'sv-SE', + 'el': 'el-GR', + 'el-GR': 'el-GR' + }, + + // Get language code from browser and verify it + getLanguageCode: function () { + var languageCode = Util.Localisation.getUserPreferredLanguage(); + for (var index = 0; index < languageCode.length; index++) { + var supportedLanguageCode = Util.Localisation.getSupportedLanguageCode(languageCode[index]); + if (supportedLanguageCode) { + return supportedLanguageCode; + } + } + + return Util.Localisation.defaultLanguage; + }, + + /* + * Retrieve user preferred languages + * Navigator.languages only available in Chrome (32+) and FireFox (32+) + * Fall back to navigator.language for other browsers + */ + getUserPreferredLanguage: function () { + if (typeof window.navigator.languages == 'object') { + return window.navigator.languages; + } else { + var userLang = navigator.language || navigator.userLanguage; + return [userLang]; + } + }, + + /* + * Verify if languagecode is supported + * Return the languagecode of the language to use or null if not available + */ + getSupportedLanguageCode: function (languageCode) { + var supportedLanguages = Util.Localisation.supportedLanguages; + + for (var key in supportedLanguages) { + if (supportedLanguages.hasOwnProperty(key)) { + if (key === languageCode) { + // Return the supported language or good alternative + return supportedLanguages[key]; + } + } + } + + // LanguageCode not supported + return null; + }, + + // Retrieve localised text + get: function (id) { + if (typeof Language !== 'undefined' && Language[id]) { + return Language[id]; + } else { + return id; + } + } +}; + +exports.default = Util; +module.exports = exports['default']; + +},{}],12:[function(require,module,exports){ +"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = Websock; -var _logging = require('./util/logging.js'); +var _util = require("./util"); -var Log = _interopRequireWildcard(_logging); +var _util2 = _interopRequireDefault(_util); -function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } +var _base = require("./base64"); + +var _base2 = _interopRequireDefault(_base); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /*jslint browser: true, bitwise: true */ /*global Util*/ +/* + * Websock: high-performance binary WebSockets + * Copyright (C) 2012 Joel Martin + * Licensed under MPL 2.0 (see LICENSE.txt) + * + * Websock is similar to the standard WebSocket object but Websock + * enables communication with raw TCP sockets (i.e. the binary stream) + * via websockify. This is accomplished by base64 encoding the data + * stream between Websock and websockify. + * + * Websock has built-in receive queue buffering; the message event + * does not contain actual data but is simply a notification that + * there is new data available. Several rQ* methods are available to + * read binary data off of the receive queue. + */ + function Websock() { "use strict"; @@ -6378,340 +6243,392 @@ function Websock() { this._sQlen = 0; this._sQ = null; // Send queue + this._mode = 'binary'; // Current WebSocket mode: 'binary', 'base64' + this.maxBufferedAmount = 200; + this._eventHandlers = { 'message': function () {}, 'open': function () {}, 'close': function () {}, 'error': function () {} }; -} /* - * Websock: high-performance binary WebSockets - * Copyright (C) 2012 Joel Martin - * Licensed under MPL 2.0 (see LICENSE.txt) - * - * Websock is similar to the standard WebSocket object but with extra - * buffer handling. - * - * Websock has built-in receive queue buffering; the message event - * does not contain actual data but is simply a notification that - * there is new data available. Several rQ* methods are available to - * read binary data off of the receive queue. - */ +}; -; +(function () { + "use strict"; + // this has performance issues in some versions Chromium, and + // doesn't gain a tremendous amount of performance increase in Firefox + // at the moment. It may be valuable to turn it on in the future. -// this has performance issues in some versions Chromium, and -// doesn't gain a tremendous amount of performance increase in Firefox -// at the moment. It may be valuable to turn it on in the future. -var ENABLE_COPYWITHIN = false; + var ENABLE_COPYWITHIN = false; -var MAX_RQ_GROW_SIZE = 40 * 1024 * 1024; // 40 MiB + var MAX_RQ_GROW_SIZE = 40 * 1024 * 1024; // 40 MiB -var typedArrayToString = function () { - // This is only for PhantomJS, which doesn't like apply-ing - // with Typed Arrays - try { - var arr = new Uint8Array([1, 2, 3]); - String.fromCharCode.apply(null, arr); - return function (a) { - return String.fromCharCode.apply(null, a); - }; - } catch (ex) { - return function (a) { - return String.fromCharCode.apply(null, Array.prototype.slice.call(a)); - }; - } -}(); - -Websock.prototype = { - // Getters and Setters - get_sQ: function () { - return this._sQ; - }, - - get_rQ: function () { - return this._rQ; - }, - - get_rQi: function () { - return this._rQi; - }, - - set_rQi: function (val) { - this._rQi = val; - }, - - // Receive Queue - rQlen: function () { - return this._rQlen - this._rQi; - }, - - rQpeek8: function () { - return this._rQ[this._rQi]; - }, - - rQshift8: function () { - return this._rQ[this._rQi++]; - }, - - rQskip8: function () { - this._rQi++; - }, - - rQskipBytes: function (num) { - this._rQi += num; - }, - - // TODO(directxman12): test performance with these vs a DataView - rQshift16: function () { - return (this._rQ[this._rQi++] << 8) + this._rQ[this._rQi++]; - }, - - rQshift32: function () { - return (this._rQ[this._rQi++] << 24) + (this._rQ[this._rQi++] << 16) + (this._rQ[this._rQi++] << 8) + this._rQ[this._rQi++]; - }, - - rQshiftStr: function (len) { - if (typeof len === 'undefined') { - len = this.rQlen(); - } - var arr = new Uint8Array(this._rQ.buffer, this._rQi, len); - this._rQi += len; - return typedArrayToString(arr); - }, - - rQshiftBytes: function (len) { - if (typeof len === 'undefined') { - len = this.rQlen(); - } - this._rQi += len; - return new Uint8Array(this._rQ.buffer, this._rQi - len, len); - }, - - rQshiftTo: function (target, len) { - if (len === undefined) { - len = this.rQlen(); - } - // TODO: make this just use set with views when using a ArrayBuffer to store the rQ - target.set(new Uint8Array(this._rQ.buffer, this._rQi, len)); - this._rQi += len; - }, - - rQwhole: function () { - return new Uint8Array(this._rQ.buffer, 0, this._rQlen); - }, - - rQslice: function (start, end) { - if (end) { - return new Uint8Array(this._rQ.buffer, this._rQi + start, end - start); - } else { - return new Uint8Array(this._rQ.buffer, this._rQi + start, this._rQlen - this._rQi - start); - } - }, - - // Check to see if we must wait for 'num' bytes (default to FBU.bytes) - // to be available in the receive queue. Return true if we need to - // wait (and possibly print a debug message), otherwise false. - rQwait: function (msg, num, goback) { - var rQlen = this._rQlen - this._rQi; // Skip rQlen() function call - if (rQlen < num) { - if (goback) { - if (this._rQi < goback) { - throw new Error("rQwait cannot backup " + goback + " bytes"); - } - this._rQi -= goback; - } - return true; // true means need more data - } - return false; - }, - - // Send Queue - - flush: function () { - if (this._websocket.bufferedAmount !== 0) { - Log.Debug("bufferedAmount: " + this._websocket.bufferedAmount); - } - - if (this._sQlen > 0 && this._websocket.readyState === WebSocket.OPEN) { - this._websocket.send(this._encode_message()); - this._sQlen = 0; - } - }, - - send: function (arr) { - this._sQ.set(arr, this._sQlen); - this._sQlen += arr.length; - this.flush(); - }, - - send_string: function (str) { - this.send(str.split('').map(function (chr) { - return chr.charCodeAt(0); - })); - }, - - // Event Handlers - off: function (evt) { - this._eventHandlers[evt] = function () {}; - }, - - on: function (evt, handler) { - this._eventHandlers[evt] = handler; - }, - - _allocate_buffers: function () { - this._rQ = new Uint8Array(this._rQbufferSize); - this._sQ = new Uint8Array(this._sQbufferSize); - }, - - init: function () { - this._allocate_buffers(); - this._rQi = 0; - this._websocket = null; - }, - - open: function (uri, protocols) { - var ws_schema = uri.match(/^([a-z]+):\/\//)[1]; - this.init(); - - this._websocket = new WebSocket(uri, protocols); - this._websocket.binaryType = 'arraybuffer'; - - this._websocket.onmessage = this._recv_message.bind(this); - this._websocket.onopen = function () { - Log.Debug('>> WebSock.onopen'); - if (this._websocket.protocol) { - Log.Info("Server choose sub-protocol: " + this._websocket.protocol); - } - - this._eventHandlers.open(); - Log.Debug("<< WebSock.onopen"); - }.bind(this); - this._websocket.onclose = function (e) { - Log.Debug(">> WebSock.onclose"); - this._eventHandlers.close(e); - Log.Debug("<< WebSock.onclose"); - }.bind(this); - this._websocket.onerror = function (e) { - Log.Debug(">> WebSock.onerror: " + e); - this._eventHandlers.error(e); - Log.Debug("<< WebSock.onerror: " + e); - }.bind(this); - }, - - close: function () { - if (this._websocket) { - if (this._websocket.readyState === WebSocket.OPEN || this._websocket.readyState === WebSocket.CONNECTING) { - Log.Info("Closing WebSocket connection"); - this._websocket.close(); - } - - this._websocket.onmessage = function (e) { - return; + var typedArrayToString = function () { + // This is only for PhantomJS, which doesn't like apply-ing + // with Typed Arrays + try { + var arr = new Uint8Array([1, 2, 3]); + String.fromCharCode.apply(null, arr); + return function (a) { + return String.fromCharCode.apply(null, a); + }; + } catch (ex) { + return function (a) { + return String.fromCharCode.apply(null, Array.prototype.slice.call(a)); }; } - }, + }(); - // private methods - _encode_message: function () { - // Put in a binary arraybuffer - // according to the spec, you can send ArrayBufferViews with the send method - return new Uint8Array(this._sQ.buffer, 0, this._sQlen); - }, + Websock.prototype = { + // Getters and Setters + get_sQ: function () { + return this._sQ; + }, - _expand_compact_rQ: function (min_fit) { - var resizeNeeded = min_fit || this._rQlen - this._rQi > this._rQbufferSize / 2; - if (resizeNeeded) { - if (!min_fit) { - // just double the size if we need to do compaction - this._rQbufferSize *= 2; + get_rQ: function () { + return this._rQ; + }, + + get_rQi: function () { + return this._rQi; + }, + + set_rQi: function (val) { + this._rQi = val; + }, + + // Receive Queue + rQlen: function () { + return this._rQlen - this._rQi; + }, + + rQpeek8: function () { + return this._rQ[this._rQi]; + }, + + rQshift8: function () { + return this._rQ[this._rQi++]; + }, + + rQskip8: function () { + this._rQi++; + }, + + rQskipBytes: function (num) { + this._rQi += num; + }, + + // TODO(directxman12): test performance with these vs a DataView + rQshift16: function () { + return (this._rQ[this._rQi++] << 8) + this._rQ[this._rQi++]; + }, + + rQshift32: function () { + return (this._rQ[this._rQi++] << 24) + (this._rQ[this._rQi++] << 16) + (this._rQ[this._rQi++] << 8) + this._rQ[this._rQi++]; + }, + + rQshiftStr: function (len) { + if (typeof len === 'undefined') { + len = this.rQlen(); + } + var arr = new Uint8Array(this._rQ.buffer, this._rQi, len); + this._rQi += len; + return typedArrayToString(arr); + }, + + rQshiftBytes: function (len) { + if (typeof len === 'undefined') { + len = this.rQlen(); + } + this._rQi += len; + return new Uint8Array(this._rQ.buffer, this._rQi - len, len); + }, + + rQshiftTo: function (target, len) { + if (len === undefined) { + len = this.rQlen(); + } + // TODO: make this just use set with views when using a ArrayBuffer to store the rQ + target.set(new Uint8Array(this._rQ.buffer, this._rQi, len)); + this._rQi += len; + }, + + rQwhole: function () { + return new Uint8Array(this._rQ.buffer, 0, this._rQlen); + }, + + rQslice: function (start, end) { + if (end) { + return new Uint8Array(this._rQ.buffer, this._rQi + start, end - start); } else { - // otherwise, make sure we satisy rQlen - rQi + min_fit < rQbufferSize / 8 - this._rQbufferSize = (this._rQlen - this._rQi + min_fit) * 8; + return new Uint8Array(this._rQ.buffer, this._rQi + start, this._rQlen - this._rQi - start); } - } + }, - // we don't want to grow unboundedly - if (this._rQbufferSize > MAX_RQ_GROW_SIZE) { - this._rQbufferSize = MAX_RQ_GROW_SIZE; - if (this._rQbufferSize - this._rQlen - this._rQi < min_fit) { - throw new Exception("Receive Queue buffer exceeded " + MAX_RQ_GROW_SIZE + " bytes, and the new message could not fit"); - } - } - - if (resizeNeeded) { - var old_rQbuffer = this._rQ.buffer; - this._rQmax = this._rQbufferSize / 8; - this._rQ = new Uint8Array(this._rQbufferSize); - this._rQ.set(new Uint8Array(old_rQbuffer, this._rQi)); - } else { - if (ENABLE_COPYWITHIN) { - this._rQ.copyWithin(0, this._rQi); - } else { - this._rQ.set(new Uint8Array(this._rQ.buffer, this._rQi)); - } - } - - this._rQlen = this._rQlen - this._rQi; - this._rQi = 0; - }, - - _decode_message: function (data) { - // push arraybuffer values onto the end - var u8 = new Uint8Array(data); - if (u8.length > this._rQbufferSize - this._rQlen) { - this._expand_compact_rQ(u8.length); - } - this._rQ.set(u8, this._rQlen); - this._rQlen += u8.length; - }, - - _recv_message: function (e) { - try { - this._decode_message(e.data); - if (this.rQlen() > 0) { - this._eventHandlers.message(); - // Compact the receive queue - if (this._rQlen == this._rQi) { - this._rQlen = 0; - this._rQi = 0; - } else if (this._rQlen > this._rQmax) { - this._expand_compact_rQ(); + // Check to see if we must wait for 'num' bytes (default to FBU.bytes) + // to be available in the receive queue. Return true if we need to + // wait (and possibly print a debug message), otherwise false. + rQwait: function (msg, num, goback) { + var rQlen = this._rQlen - this._rQi; // Skip rQlen() function call + if (rQlen < num) { + if (goback) { + if (this._rQi < goback) { + throw new Error("rQwait cannot backup " + goback + " bytes"); + } + this._rQi -= goback; } + return true; // true means need more data + } + return false; + }, + + // Send Queue + + flush: function () { + if (this._websocket.bufferedAmount !== 0) { + _util2.default.Debug("bufferedAmount: " + this._websocket.bufferedAmount); + } + + if (this._websocket.bufferedAmount < this.maxBufferedAmount) { + if (this._sQlen > 0 && this._websocket.readyState === WebSocket.OPEN) { + this._websocket.send(this._encode_message()); + this._sQlen = 0; + } + + return true; } else { - Log.Debug("Ignoring empty message"); + _util2.default.Info("Delaying send, bufferedAmount: " + this._websocket.bufferedAmount); + return false; } - } catch (exc) { - var exception_str = ""; - if (exc.name) { - exception_str += "\n name: " + exc.name + "\n"; - exception_str += " message: " + exc.message + "\n"; + }, + + send: function (arr) { + this._sQ.set(arr, this._sQlen); + this._sQlen += arr.length; + return this.flush(); + }, + + send_string: function (str) { + this.send(str.split('').map(function (chr) { + return chr.charCodeAt(0); + })); + }, + + // Event Handlers + off: function (evt) { + this._eventHandlers[evt] = function () {}; + }, + + on: function (evt, handler) { + this._eventHandlers[evt] = handler; + }, + + _allocate_buffers: function () { + this._rQ = new Uint8Array(this._rQbufferSize); + this._sQ = new Uint8Array(this._sQbufferSize); + }, + + init: function (protocols, ws_schema) { + this._allocate_buffers(); + this._rQi = 0; + this._websocket = null; + + // Check for full typed array support + var bt = false; + if ('Uint8Array' in window && 'set' in Uint8Array.prototype) { + bt = true; } - if (typeof exc.description !== 'undefined') { - exception_str += " description: " + exc.description + "\n"; + // Check for full binary type support in WebSockets + // Inspired by: + // https://github.com/Modernizr/Modernizr/issues/370 + // https://github.com/Modernizr/Modernizr/blob/master/feature-detects/websockets/binary.js + var wsbt = false; + try { + if (bt && ('binaryType' in WebSocket.prototype || !!new WebSocket(ws_schema + '://.').binaryType)) { + _util2.default.Info("Detected binaryType support in WebSockets"); + wsbt = true; + } + } catch (exc) {} + // Just ignore failed test localhost connection + + + // Default protocols if not specified + if (typeof protocols === "undefined") { + protocols = 'binary'; } - if (typeof exc.stack !== 'undefined') { - exception_str += exc.stack; + if (Array.isArray(protocols) && protocols.indexOf('binary') > -1) { + protocols = 'binary'; } - if (exception_str.length > 0) { - Log.Error("recv_message, caught exception: " + exception_str); + if (!wsbt) { + throw new Error("noVNC no longer supports base64 WebSockets. " + "Please use a browser which supports binary WebSockets."); + } + + if (protocols != 'binary') { + throw new Error("noVNC no longer supports base64 WebSockets. Please " + "use the binary subprotocol instead."); + } + + return protocols; + }, + + open: function (uri, protocols) { + var ws_schema = uri.match(/^([a-z]+):\/\//)[1]; + protocols = this.init(protocols, ws_schema); + + this._websocket = new WebSocket(uri, protocols); + + if (protocols.indexOf('binary') >= 0) { + this._websocket.binaryType = 'arraybuffer'; + } + + this._websocket.onmessage = this._recv_message.bind(this); + this._websocket.onopen = function () { + _util2.default.Debug('>> WebSock.onopen'); + if (this._websocket.protocol) { + this._mode = this._websocket.protocol; + _util2.default.Info("Server choose sub-protocol: " + this._websocket.protocol); + } else { + this._mode = 'binary'; + _util2.default.Error('Server select no sub-protocol!: ' + this._websocket.protocol); + } + + if (this._mode != 'binary') { + throw new Error("noVNC no longer supports base64 WebSockets. Please " + "use the binary subprotocol instead."); + } + + this._eventHandlers.open(); + _util2.default.Debug("<< WebSock.onopen"); + }.bind(this); + this._websocket.onclose = function (e) { + _util2.default.Debug(">> WebSock.onclose"); + this._eventHandlers.close(e); + _util2.default.Debug("<< WebSock.onclose"); + }.bind(this); + this._websocket.onerror = function (e) { + _util2.default.Debug(">> WebSock.onerror: " + e); + this._eventHandlers.error(e); + _util2.default.Debug("<< WebSock.onerror: " + e); + }.bind(this); + }, + + close: function () { + if (this._websocket) { + if (this._websocket.readyState === WebSocket.OPEN || this._websocket.readyState === WebSocket.CONNECTING) { + _util2.default.Info("Closing WebSocket connection"); + this._websocket.close(); + } + + this._websocket.onmessage = function (e) { + return; + }; + } + }, + + // private methods + _encode_message: function () { + // Put in a binary arraybuffer + // according to the spec, you can send ArrayBufferViews with the send method + return new Uint8Array(this._sQ.buffer, 0, this._sQlen); + }, + + _expand_compact_rQ: function (min_fit) { + var resizeNeeded = min_fit || this._rQlen - this._rQi > this._rQbufferSize / 2; + if (resizeNeeded) { + if (!min_fit) { + // just double the size if we need to do compaction + this._rQbufferSize *= 2; + } else { + // otherwise, make sure we satisy rQlen - rQi + min_fit < rQbufferSize / 8 + this._rQbufferSize = (this._rQlen - this._rQi + min_fit) * 8; + } + } + + // we don't want to grow unboundedly + if (this._rQbufferSize > MAX_RQ_GROW_SIZE) { + this._rQbufferSize = MAX_RQ_GROW_SIZE; + if (this._rQbufferSize - this._rQlen - this._rQi < min_fit) { + throw new Exception("Receive Queue buffer exceeded " + MAX_RQ_GROW_SIZE + " bytes, and the new message could not fit"); + } + } + + if (resizeNeeded) { + var old_rQbuffer = this._rQ.buffer; + this._rQmax = this._rQbufferSize / 8; + this._rQ = new Uint8Array(this._rQbufferSize); + this._rQ.set(new Uint8Array(old_rQbuffer, this._rQi)); } else { - Log.Error("recv_message, caught exception: " + exc); + if (ENABLE_COPYWITHIN) { + this._rQ.copyWithin(0, this._rQi); + } else { + this._rQ.set(new Uint8Array(this._rQ.buffer, this._rQi)); + } } - if (typeof exc.name !== 'undefined') { - this._eventHandlers.error(exc.name + ": " + exc.message); - } else { - this._eventHandlers.error(exc); + this._rQlen = this._rQlen - this._rQi; + this._rQi = 0; + }, + + _decode_message: function (data) { + // push arraybuffer values onto the end + var u8 = new Uint8Array(data); + if (u8.length > this._rQbufferSize - this._rQlen) { + this._expand_compact_rQ(u8.length); + } + this._rQ.set(u8, this._rQlen); + this._rQlen += u8.length; + }, + + _recv_message: function (e) { + try { + this._decode_message(e.data); + if (this.rQlen() > 0) { + this._eventHandlers.message(); + // Compact the receive queue + if (this._rQlen == this._rQi) { + this._rQlen = 0; + this._rQi = 0; + } else if (this._rQlen > this._rQmax) { + this._expand_compact_rQ(); + } + } else { + _util2.default.Debug("Ignoring empty message"); + } + } catch (exc) { + var exception_str = ""; + if (exc.name) { + exception_str += "\n name: " + exc.name + "\n"; + exception_str += " message: " + exc.message + "\n"; + } + + if (typeof exc.description !== 'undefined') { + exception_str += " description: " + exc.description + "\n"; + } + + if (typeof exc.stack !== 'undefined') { + exception_str += exc.stack; + } + + if (exception_str.length > 0) { + _util2.default.Error("recv_message, caught exception: " + exception_str); + } else { + _util2.default.Error("recv_message, caught exception: " + exc); + } + + if (typeof exc.name !== 'undefined') { + this._eventHandlers.error(exc.name + ": " + exc.message); + } else { + this._eventHandlers.error(exc); + } } } - } -}; -},{"./util/logging.js":14}],18:[function(require,module,exports){ + }; +})(); +module.exports = exports["default"]; + +},{"./base64":1,"./util":11}],13:[function(require,module,exports){ "use strict"; exports.__esModule = true; @@ -6719,23 +6636,23 @@ exports.__esModule = true; exports.default = function () {}; module.exports = exports["default"]; -},{}],19:[function(require,module,exports){ +},{}],14:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/array/from"), __esModule: true }; -},{"core-js/library/fn/array/from":33}],20:[function(require,module,exports){ +},{"core-js/library/fn/array/from":28}],15:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/object/assign"), __esModule: true }; -},{"core-js/library/fn/object/assign":34}],21:[function(require,module,exports){ +},{"core-js/library/fn/object/assign":29}],16:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/object/create"), __esModule: true }; -},{"core-js/library/fn/object/create":35}],22:[function(require,module,exports){ +},{"core-js/library/fn/object/create":30}],17:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/object/entries"), __esModule: true }; -},{"core-js/library/fn/object/entries":36}],23:[function(require,module,exports){ +},{"core-js/library/fn/object/entries":31}],18:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/object/set-prototype-of"), __esModule: true }; -},{"core-js/library/fn/object/set-prototype-of":37}],24:[function(require,module,exports){ +},{"core-js/library/fn/object/set-prototype-of":32}],19:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/object/values"), __esModule: true }; -},{"core-js/library/fn/object/values":38}],25:[function(require,module,exports){ +},{"core-js/library/fn/object/values":33}],20:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/symbol"), __esModule: true }; -},{"core-js/library/fn/symbol":39}],26:[function(require,module,exports){ +},{"core-js/library/fn/symbol":34}],21:[function(require,module,exports){ module.exports = { "default": require("core-js/library/fn/symbol/iterator"), __esModule: true }; -},{"core-js/library/fn/symbol/iterator":40}],27:[function(require,module,exports){ +},{"core-js/library/fn/symbol/iterator":35}],22:[function(require,module,exports){ "use strict"; exports.__esModule = true; @@ -6745,7 +6662,7 @@ exports.default = function (instance, Constructor) { throw new TypeError("Cannot call a class as a function"); } }; -},{}],28:[function(require,module,exports){ +},{}],23:[function(require,module,exports){ "use strict"; exports.__esModule = true; @@ -6769,7 +6686,7 @@ exports.default = _assign2.default || function (target) { return target; }; -},{"../core-js/object/assign":20}],29:[function(require,module,exports){ +},{"../core-js/object/assign":15}],24:[function(require,module,exports){ "use strict"; exports.__esModule = true; @@ -6803,7 +6720,7 @@ exports.default = function (subClass, superClass) { }); if (superClass) _setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass; }; -},{"../core-js/object/create":21,"../core-js/object/set-prototype-of":23,"../helpers/typeof":32}],30:[function(require,module,exports){ +},{"../core-js/object/create":16,"../core-js/object/set-prototype-of":18,"../helpers/typeof":27}],25:[function(require,module,exports){ "use strict"; exports.__esModule = true; @@ -6819,7 +6736,7 @@ exports.default = function (obj, keys) { return target; }; -},{}],31:[function(require,module,exports){ +},{}],26:[function(require,module,exports){ "use strict"; exports.__esModule = true; @@ -6837,7 +6754,7 @@ exports.default = function (self, call) { return call && ((typeof call === "undefined" ? "undefined" : (0, _typeof3.default)(call)) === "object" || typeof call === "function") ? call : self; }; -},{"../helpers/typeof":32}],32:[function(require,module,exports){ +},{"../helpers/typeof":27}],27:[function(require,module,exports){ "use strict"; exports.__esModule = true; @@ -6859,52 +6776,52 @@ exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.d } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj); }; -},{"../core-js/symbol":25,"../core-js/symbol/iterator":26}],33:[function(require,module,exports){ +},{"../core-js/symbol":20,"../core-js/symbol/iterator":21}],28:[function(require,module,exports){ require('../../modules/es6.string.iterator'); require('../../modules/es6.array.from'); module.exports = require('../../modules/_core').Array.from; -},{"../../modules/_core":47,"../../modules/es6.array.from":106,"../../modules/es6.string.iterator":112}],34:[function(require,module,exports){ +},{"../../modules/_core":42,"../../modules/es6.array.from":101,"../../modules/es6.string.iterator":107}],29:[function(require,module,exports){ require('../../modules/es6.object.assign'); module.exports = require('../../modules/_core').Object.assign; -},{"../../modules/_core":47,"../../modules/es6.object.assign":108}],35:[function(require,module,exports){ +},{"../../modules/_core":42,"../../modules/es6.object.assign":103}],30:[function(require,module,exports){ require('../../modules/es6.object.create'); var $Object = require('../../modules/_core').Object; module.exports = function create(P, D){ return $Object.create(P, D); }; -},{"../../modules/_core":47,"../../modules/es6.object.create":109}],36:[function(require,module,exports){ +},{"../../modules/_core":42,"../../modules/es6.object.create":104}],31:[function(require,module,exports){ require('../../modules/es7.object.entries'); module.exports = require('../../modules/_core').Object.entries; -},{"../../modules/_core":47,"../../modules/es7.object.entries":114}],37:[function(require,module,exports){ +},{"../../modules/_core":42,"../../modules/es7.object.entries":109}],32:[function(require,module,exports){ require('../../modules/es6.object.set-prototype-of'); module.exports = require('../../modules/_core').Object.setPrototypeOf; -},{"../../modules/_core":47,"../../modules/es6.object.set-prototype-of":110}],38:[function(require,module,exports){ +},{"../../modules/_core":42,"../../modules/es6.object.set-prototype-of":105}],33:[function(require,module,exports){ require('../../modules/es7.object.values'); module.exports = require('../../modules/_core').Object.values; -},{"../../modules/_core":47,"../../modules/es7.object.values":115}],39:[function(require,module,exports){ +},{"../../modules/_core":42,"../../modules/es7.object.values":110}],34:[function(require,module,exports){ require('../../modules/es6.symbol'); require('../../modules/es6.object.to-string'); require('../../modules/es7.symbol.async-iterator'); require('../../modules/es7.symbol.observable'); module.exports = require('../../modules/_core').Symbol; -},{"../../modules/_core":47,"../../modules/es6.object.to-string":111,"../../modules/es6.symbol":113,"../../modules/es7.symbol.async-iterator":116,"../../modules/es7.symbol.observable":117}],40:[function(require,module,exports){ +},{"../../modules/_core":42,"../../modules/es6.object.to-string":106,"../../modules/es6.symbol":108,"../../modules/es7.symbol.async-iterator":111,"../../modules/es7.symbol.observable":112}],35:[function(require,module,exports){ require('../../modules/es6.string.iterator'); require('../../modules/web.dom.iterable'); module.exports = require('../../modules/_wks-ext').f('iterator'); -},{"../../modules/_wks-ext":103,"../../modules/es6.string.iterator":112,"../../modules/web.dom.iterable":118}],41:[function(require,module,exports){ +},{"../../modules/_wks-ext":98,"../../modules/es6.string.iterator":107,"../../modules/web.dom.iterable":113}],36:[function(require,module,exports){ module.exports = function(it){ if(typeof it != 'function')throw TypeError(it + ' is not a function!'); return it; }; -},{}],42:[function(require,module,exports){ +},{}],37:[function(require,module,exports){ module.exports = function(){ /* empty */ }; -},{}],43:[function(require,module,exports){ +},{}],38:[function(require,module,exports){ var isObject = require('./_is-object'); module.exports = function(it){ if(!isObject(it))throw TypeError(it + ' is not an object!'); return it; }; -},{"./_is-object":65}],44:[function(require,module,exports){ +},{"./_is-object":60}],39:[function(require,module,exports){ // false -> Array#indexOf // true -> Array#includes var toIObject = require('./_to-iobject') @@ -6926,7 +6843,7 @@ module.exports = function(IS_INCLUDES){ } return !IS_INCLUDES && -1; }; }; -},{"./_to-index":95,"./_to-iobject":97,"./_to-length":98}],45:[function(require,module,exports){ +},{"./_to-index":90,"./_to-iobject":92,"./_to-length":93}],40:[function(require,module,exports){ // getting tag from 19.1.3.6 Object.prototype.toString() var cof = require('./_cof') , TAG = require('./_wks')('toStringTag') @@ -6950,16 +6867,16 @@ module.exports = function(it){ // ES3 arguments fallback : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; }; -},{"./_cof":46,"./_wks":104}],46:[function(require,module,exports){ +},{"./_cof":41,"./_wks":99}],41:[function(require,module,exports){ var toString = {}.toString; module.exports = function(it){ return toString.call(it).slice(8, -1); }; -},{}],47:[function(require,module,exports){ +},{}],42:[function(require,module,exports){ var core = module.exports = {version: '2.4.0'}; if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef -},{}],48:[function(require,module,exports){ +},{}],43:[function(require,module,exports){ 'use strict'; var $defineProperty = require('./_object-dp') , createDesc = require('./_property-desc'); @@ -6968,7 +6885,7 @@ module.exports = function(object, index, value){ if(index in object)$defineProperty.f(object, index, createDesc(0, value)); else object[index] = value; }; -},{"./_object-dp":77,"./_property-desc":88}],49:[function(require,module,exports){ +},{"./_object-dp":72,"./_property-desc":83}],44:[function(require,module,exports){ // optional / simple context binding var aFunction = require('./_a-function'); module.exports = function(fn, that, length){ @@ -6989,18 +6906,18 @@ module.exports = function(fn, that, length){ return fn.apply(that, arguments); }; }; -},{"./_a-function":41}],50:[function(require,module,exports){ +},{"./_a-function":36}],45:[function(require,module,exports){ // 7.2.1 RequireObjectCoercible(argument) module.exports = function(it){ if(it == undefined)throw TypeError("Can't call method on " + it); return it; }; -},{}],51:[function(require,module,exports){ +},{}],46:[function(require,module,exports){ // Thank's IE8 for his funny defineProperty module.exports = !require('./_fails')(function(){ return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7; }); -},{"./_fails":56}],52:[function(require,module,exports){ +},{"./_fails":51}],47:[function(require,module,exports){ var isObject = require('./_is-object') , document = require('./_global').document // in old IE typeof document.createElement is 'object' @@ -7008,12 +6925,12 @@ var isObject = require('./_is-object') module.exports = function(it){ return is ? document.createElement(it) : {}; }; -},{"./_global":57,"./_is-object":65}],53:[function(require,module,exports){ +},{"./_global":52,"./_is-object":60}],48:[function(require,module,exports){ // IE 8- don't enum bug keys module.exports = ( 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' ).split(','); -},{}],54:[function(require,module,exports){ +},{}],49:[function(require,module,exports){ // all enumerable object keys, includes symbols var getKeys = require('./_object-keys') , gOPS = require('./_object-gops') @@ -7029,7 +6946,7 @@ module.exports = function(it){ while(symbols.length > i)if(isEnum.call(it, key = symbols[i++]))result.push(key); } return result; }; -},{"./_object-gops":82,"./_object-keys":85,"./_object-pie":86}],55:[function(require,module,exports){ +},{"./_object-gops":77,"./_object-keys":80,"./_object-pie":81}],50:[function(require,module,exports){ var global = require('./_global') , core = require('./_core') , ctx = require('./_ctx') @@ -7091,7 +7008,7 @@ $export.W = 32; // wrap $export.U = 64; // safe $export.R = 128; // real proto method for `library` module.exports = $export; -},{"./_core":47,"./_ctx":49,"./_global":57,"./_hide":59}],56:[function(require,module,exports){ +},{"./_core":42,"./_ctx":44,"./_global":52,"./_hide":54}],51:[function(require,module,exports){ module.exports = function(exec){ try { return !!exec(); @@ -7099,17 +7016,17 @@ module.exports = function(exec){ return true; } }; -},{}],57:[function(require,module,exports){ +},{}],52:[function(require,module,exports){ // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 var global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef -},{}],58:[function(require,module,exports){ +},{}],53:[function(require,module,exports){ var hasOwnProperty = {}.hasOwnProperty; module.exports = function(it, key){ return hasOwnProperty.call(it, key); }; -},{}],59:[function(require,module,exports){ +},{}],54:[function(require,module,exports){ var dP = require('./_object-dp') , createDesc = require('./_property-desc'); module.exports = require('./_descriptors') ? function(object, key, value){ @@ -7118,19 +7035,19 @@ module.exports = require('./_descriptors') ? function(object, key, value){ object[key] = value; return object; }; -},{"./_descriptors":51,"./_object-dp":77,"./_property-desc":88}],60:[function(require,module,exports){ +},{"./_descriptors":46,"./_object-dp":72,"./_property-desc":83}],55:[function(require,module,exports){ module.exports = require('./_global').document && document.documentElement; -},{"./_global":57}],61:[function(require,module,exports){ +},{"./_global":52}],56:[function(require,module,exports){ module.exports = !require('./_descriptors') && !require('./_fails')(function(){ return Object.defineProperty(require('./_dom-create')('div'), 'a', {get: function(){ return 7; }}).a != 7; }); -},{"./_descriptors":51,"./_dom-create":52,"./_fails":56}],62:[function(require,module,exports){ +},{"./_descriptors":46,"./_dom-create":47,"./_fails":51}],57:[function(require,module,exports){ // fallback for non-array-like ES3 and non-enumerable old V8 strings var cof = require('./_cof'); module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){ return cof(it) == 'String' ? it.split('') : Object(it); }; -},{"./_cof":46}],63:[function(require,module,exports){ +},{"./_cof":41}],58:[function(require,module,exports){ // check on default Array iterator var Iterators = require('./_iterators') , ITERATOR = require('./_wks')('iterator') @@ -7139,17 +7056,17 @@ var Iterators = require('./_iterators') module.exports = function(it){ return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); }; -},{"./_iterators":71,"./_wks":104}],64:[function(require,module,exports){ +},{"./_iterators":66,"./_wks":99}],59:[function(require,module,exports){ // 7.2.2 IsArray(argument) var cof = require('./_cof'); module.exports = Array.isArray || function isArray(arg){ return cof(arg) == 'Array'; }; -},{"./_cof":46}],65:[function(require,module,exports){ +},{"./_cof":41}],60:[function(require,module,exports){ module.exports = function(it){ return typeof it === 'object' ? it !== null : typeof it === 'function'; }; -},{}],66:[function(require,module,exports){ +},{}],61:[function(require,module,exports){ // call something on iterator step with safe closing on error var anObject = require('./_an-object'); module.exports = function(iterator, fn, value, entries){ @@ -7162,7 +7079,7 @@ module.exports = function(iterator, fn, value, entries){ throw e; } }; -},{"./_an-object":43}],67:[function(require,module,exports){ +},{"./_an-object":38}],62:[function(require,module,exports){ 'use strict'; var create = require('./_object-create') , descriptor = require('./_property-desc') @@ -7176,7 +7093,7 @@ module.exports = function(Constructor, NAME, next){ Constructor.prototype = create(IteratorPrototype, {next: descriptor(1, next)}); setToStringTag(Constructor, NAME + ' Iterator'); }; -},{"./_hide":59,"./_object-create":76,"./_property-desc":88,"./_set-to-string-tag":91,"./_wks":104}],68:[function(require,module,exports){ +},{"./_hide":54,"./_object-create":71,"./_property-desc":83,"./_set-to-string-tag":86,"./_wks":99}],63:[function(require,module,exports){ 'use strict'; var LIBRARY = require('./_library') , $export = require('./_export') @@ -7247,7 +7164,7 @@ module.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED } return methods; }; -},{"./_export":55,"./_has":58,"./_hide":59,"./_iter-create":67,"./_iterators":71,"./_library":73,"./_object-gpo":83,"./_redefine":89,"./_set-to-string-tag":91,"./_wks":104}],69:[function(require,module,exports){ +},{"./_export":50,"./_has":53,"./_hide":54,"./_iter-create":62,"./_iterators":66,"./_library":68,"./_object-gpo":78,"./_redefine":84,"./_set-to-string-tag":86,"./_wks":99}],64:[function(require,module,exports){ var ITERATOR = require('./_wks')('iterator') , SAFE_CLOSING = false; @@ -7269,13 +7186,13 @@ module.exports = function(exec, skipClosing){ } catch(e){ /* empty */ } return safe; }; -},{"./_wks":104}],70:[function(require,module,exports){ +},{"./_wks":99}],65:[function(require,module,exports){ module.exports = function(done, value){ return {value: value, done: !!done}; }; -},{}],71:[function(require,module,exports){ +},{}],66:[function(require,module,exports){ module.exports = {}; -},{}],72:[function(require,module,exports){ +},{}],67:[function(require,module,exports){ var getKeys = require('./_object-keys') , toIObject = require('./_to-iobject'); module.exports = function(object, el){ @@ -7286,9 +7203,9 @@ module.exports = function(object, el){ , key; while(length > index)if(O[key = keys[index++]] === el)return key; }; -},{"./_object-keys":85,"./_to-iobject":97}],73:[function(require,module,exports){ +},{"./_object-keys":80,"./_to-iobject":92}],68:[function(require,module,exports){ module.exports = true; -},{}],74:[function(require,module,exports){ +},{}],69:[function(require,module,exports){ var META = require('./_uid')('meta') , isObject = require('./_is-object') , has = require('./_has') @@ -7342,7 +7259,7 @@ var meta = module.exports = { getWeak: getWeak, onFreeze: onFreeze }; -},{"./_fails":56,"./_has":58,"./_is-object":65,"./_object-dp":77,"./_uid":101}],75:[function(require,module,exports){ +},{"./_fails":51,"./_has":53,"./_is-object":60,"./_object-dp":72,"./_uid":96}],70:[function(require,module,exports){ 'use strict'; // 19.1.2.1 Object.assign(target, source, ...) var getKeys = require('./_object-keys') @@ -7376,7 +7293,7 @@ module.exports = !$assign || require('./_fails')(function(){ while(length > j)if(isEnum.call(S, key = keys[j++]))T[key] = S[key]; } return T; } : $assign; -},{"./_fails":56,"./_iobject":62,"./_object-gops":82,"./_object-keys":85,"./_object-pie":86,"./_to-object":99}],76:[function(require,module,exports){ +},{"./_fails":51,"./_iobject":57,"./_object-gops":77,"./_object-keys":80,"./_object-pie":81,"./_to-object":94}],71:[function(require,module,exports){ // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) var anObject = require('./_an-object') , dPs = require('./_object-dps') @@ -7419,7 +7336,7 @@ module.exports = Object.create || function create(O, Properties){ return Properties === undefined ? result : dPs(result, Properties); }; -},{"./_an-object":43,"./_dom-create":52,"./_enum-bug-keys":53,"./_html":60,"./_object-dps":78,"./_shared-key":92}],77:[function(require,module,exports){ +},{"./_an-object":38,"./_dom-create":47,"./_enum-bug-keys":48,"./_html":55,"./_object-dps":73,"./_shared-key":87}],72:[function(require,module,exports){ var anObject = require('./_an-object') , IE8_DOM_DEFINE = require('./_ie8-dom-define') , toPrimitive = require('./_to-primitive') @@ -7436,7 +7353,7 @@ exports.f = require('./_descriptors') ? Object.defineProperty : function defineP if('value' in Attributes)O[P] = Attributes.value; return O; }; -},{"./_an-object":43,"./_descriptors":51,"./_ie8-dom-define":61,"./_to-primitive":100}],78:[function(require,module,exports){ +},{"./_an-object":38,"./_descriptors":46,"./_ie8-dom-define":56,"./_to-primitive":95}],73:[function(require,module,exports){ var dP = require('./_object-dp') , anObject = require('./_an-object') , getKeys = require('./_object-keys'); @@ -7450,7 +7367,7 @@ module.exports = require('./_descriptors') ? Object.defineProperties : function while(length > i)dP.f(O, P = keys[i++], Properties[P]); return O; }; -},{"./_an-object":43,"./_descriptors":51,"./_object-dp":77,"./_object-keys":85}],79:[function(require,module,exports){ +},{"./_an-object":38,"./_descriptors":46,"./_object-dp":72,"./_object-keys":80}],74:[function(require,module,exports){ var pIE = require('./_object-pie') , createDesc = require('./_property-desc') , toIObject = require('./_to-iobject') @@ -7467,7 +7384,7 @@ exports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor } catch(e){ /* empty */ } if(has(O, P))return createDesc(!pIE.f.call(O, P), O[P]); }; -},{"./_descriptors":51,"./_has":58,"./_ie8-dom-define":61,"./_object-pie":86,"./_property-desc":88,"./_to-iobject":97,"./_to-primitive":100}],80:[function(require,module,exports){ +},{"./_descriptors":46,"./_has":53,"./_ie8-dom-define":56,"./_object-pie":81,"./_property-desc":83,"./_to-iobject":92,"./_to-primitive":95}],75:[function(require,module,exports){ // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window var toIObject = require('./_to-iobject') , gOPN = require('./_object-gopn').f @@ -7488,7 +7405,7 @@ module.exports.f = function getOwnPropertyNames(it){ return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it)); }; -},{"./_object-gopn":81,"./_to-iobject":97}],81:[function(require,module,exports){ +},{"./_object-gopn":76,"./_to-iobject":92}],76:[function(require,module,exports){ // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) var $keys = require('./_object-keys-internal') , hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype'); @@ -7496,9 +7413,9 @@ var $keys = require('./_object-keys-internal') exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O){ return $keys(O, hiddenKeys); }; -},{"./_enum-bug-keys":53,"./_object-keys-internal":84}],82:[function(require,module,exports){ +},{"./_enum-bug-keys":48,"./_object-keys-internal":79}],77:[function(require,module,exports){ exports.f = Object.getOwnPropertySymbols; -},{}],83:[function(require,module,exports){ +},{}],78:[function(require,module,exports){ // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) var has = require('./_has') , toObject = require('./_to-object') @@ -7512,7 +7429,7 @@ module.exports = Object.getPrototypeOf || function(O){ return O.constructor.prototype; } return O instanceof Object ? ObjectProto : null; }; -},{"./_has":58,"./_shared-key":92,"./_to-object":99}],84:[function(require,module,exports){ +},{"./_has":53,"./_shared-key":87,"./_to-object":94}],79:[function(require,module,exports){ var has = require('./_has') , toIObject = require('./_to-iobject') , arrayIndexOf = require('./_array-includes')(false) @@ -7530,7 +7447,7 @@ module.exports = function(object, names){ } return result; }; -},{"./_array-includes":44,"./_has":58,"./_shared-key":92,"./_to-iobject":97}],85:[function(require,module,exports){ +},{"./_array-includes":39,"./_has":53,"./_shared-key":87,"./_to-iobject":92}],80:[function(require,module,exports){ // 19.1.2.14 / 15.2.3.14 Object.keys(O) var $keys = require('./_object-keys-internal') , enumBugKeys = require('./_enum-bug-keys'); @@ -7538,9 +7455,9 @@ var $keys = require('./_object-keys-internal') module.exports = Object.keys || function keys(O){ return $keys(O, enumBugKeys); }; -},{"./_enum-bug-keys":53,"./_object-keys-internal":84}],86:[function(require,module,exports){ +},{"./_enum-bug-keys":48,"./_object-keys-internal":79}],81:[function(require,module,exports){ exports.f = {}.propertyIsEnumerable; -},{}],87:[function(require,module,exports){ +},{}],82:[function(require,module,exports){ var getKeys = require('./_object-keys') , toIObject = require('./_to-iobject') , isEnum = require('./_object-pie').f; @@ -7557,7 +7474,7 @@ module.exports = function(isEntries){ } return result; }; }; -},{"./_object-keys":85,"./_object-pie":86,"./_to-iobject":97}],88:[function(require,module,exports){ +},{"./_object-keys":80,"./_object-pie":81,"./_to-iobject":92}],83:[function(require,module,exports){ module.exports = function(bitmap, value){ return { enumerable : !(bitmap & 1), @@ -7566,9 +7483,9 @@ module.exports = function(bitmap, value){ value : value }; }; -},{}],89:[function(require,module,exports){ +},{}],84:[function(require,module,exports){ module.exports = require('./_hide'); -},{"./_hide":59}],90:[function(require,module,exports){ +},{"./_hide":54}],85:[function(require,module,exports){ // Works with __proto__ only. Old v8 can't work with null proto objects. /* eslint-disable no-proto */ var isObject = require('./_is-object') @@ -7594,7 +7511,7 @@ module.exports = { }({}, false) : undefined), check: check }; -},{"./_an-object":43,"./_ctx":49,"./_is-object":65,"./_object-gopd":79}],91:[function(require,module,exports){ +},{"./_an-object":38,"./_ctx":44,"./_is-object":60,"./_object-gopd":74}],86:[function(require,module,exports){ var def = require('./_object-dp').f , has = require('./_has') , TAG = require('./_wks')('toStringTag'); @@ -7602,20 +7519,20 @@ var def = require('./_object-dp').f module.exports = function(it, tag, stat){ if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag}); }; -},{"./_has":58,"./_object-dp":77,"./_wks":104}],92:[function(require,module,exports){ +},{"./_has":53,"./_object-dp":72,"./_wks":99}],87:[function(require,module,exports){ var shared = require('./_shared')('keys') , uid = require('./_uid'); module.exports = function(key){ return shared[key] || (shared[key] = uid(key)); }; -},{"./_shared":93,"./_uid":101}],93:[function(require,module,exports){ +},{"./_shared":88,"./_uid":96}],88:[function(require,module,exports){ var global = require('./_global') , SHARED = '__core-js_shared__' , store = global[SHARED] || (global[SHARED] = {}); module.exports = function(key){ return store[key] || (store[key] = {}); }; -},{"./_global":57}],94:[function(require,module,exports){ +},{"./_global":52}],89:[function(require,module,exports){ var toInteger = require('./_to-integer') , defined = require('./_defined'); // true -> String#at @@ -7633,7 +7550,7 @@ module.exports = function(TO_STRING){ : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; }; }; -},{"./_defined":50,"./_to-integer":96}],95:[function(require,module,exports){ +},{"./_defined":45,"./_to-integer":91}],90:[function(require,module,exports){ var toInteger = require('./_to-integer') , max = Math.max , min = Math.min; @@ -7641,34 +7558,34 @@ module.exports = function(index, length){ index = toInteger(index); return index < 0 ? max(index + length, 0) : min(index, length); }; -},{"./_to-integer":96}],96:[function(require,module,exports){ +},{"./_to-integer":91}],91:[function(require,module,exports){ // 7.1.4 ToInteger var ceil = Math.ceil , floor = Math.floor; module.exports = function(it){ return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); }; -},{}],97:[function(require,module,exports){ +},{}],92:[function(require,module,exports){ // to indexed object, toObject with fallback for non-array-like ES3 strings var IObject = require('./_iobject') , defined = require('./_defined'); module.exports = function(it){ return IObject(defined(it)); }; -},{"./_defined":50,"./_iobject":62}],98:[function(require,module,exports){ +},{"./_defined":45,"./_iobject":57}],93:[function(require,module,exports){ // 7.1.15 ToLength var toInteger = require('./_to-integer') , min = Math.min; module.exports = function(it){ return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 }; -},{"./_to-integer":96}],99:[function(require,module,exports){ +},{"./_to-integer":91}],94:[function(require,module,exports){ // 7.1.13 ToObject(argument) var defined = require('./_defined'); module.exports = function(it){ return Object(defined(it)); }; -},{"./_defined":50}],100:[function(require,module,exports){ +},{"./_defined":45}],95:[function(require,module,exports){ // 7.1.1 ToPrimitive(input [, PreferredType]) var isObject = require('./_is-object'); // instead of the ES6 spec version, we didn't implement @@toPrimitive case @@ -7681,13 +7598,13 @@ module.exports = function(it, S){ if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; throw TypeError("Can't convert object to primitive value"); }; -},{"./_is-object":65}],101:[function(require,module,exports){ +},{"./_is-object":60}],96:[function(require,module,exports){ var id = 0 , px = Math.random(); module.exports = function(key){ return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); }; -},{}],102:[function(require,module,exports){ +},{}],97:[function(require,module,exports){ var global = require('./_global') , core = require('./_core') , LIBRARY = require('./_library') @@ -7697,9 +7614,9 @@ module.exports = function(name){ var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {}); if(name.charAt(0) != '_' && !(name in $Symbol))defineProperty($Symbol, name, {value: wksExt.f(name)}); }; -},{"./_core":47,"./_global":57,"./_library":73,"./_object-dp":77,"./_wks-ext":103}],103:[function(require,module,exports){ +},{"./_core":42,"./_global":52,"./_library":68,"./_object-dp":72,"./_wks-ext":98}],98:[function(require,module,exports){ exports.f = require('./_wks'); -},{"./_wks":104}],104:[function(require,module,exports){ +},{"./_wks":99}],99:[function(require,module,exports){ var store = require('./_shared')('wks') , uid = require('./_uid') , Symbol = require('./_global').Symbol @@ -7711,7 +7628,7 @@ var $exports = module.exports = function(name){ }; $exports.store = store; -},{"./_global":57,"./_shared":93,"./_uid":101}],105:[function(require,module,exports){ +},{"./_global":52,"./_shared":88,"./_uid":96}],100:[function(require,module,exports){ var classof = require('./_classof') , ITERATOR = require('./_wks')('iterator') , Iterators = require('./_iterators'); @@ -7720,7 +7637,7 @@ module.exports = require('./_core').getIteratorMethod = function(it){ || it['@@iterator'] || Iterators[classof(it)]; }; -},{"./_classof":45,"./_core":47,"./_iterators":71,"./_wks":104}],106:[function(require,module,exports){ +},{"./_classof":40,"./_core":42,"./_iterators":66,"./_wks":99}],101:[function(require,module,exports){ 'use strict'; var ctx = require('./_ctx') , $export = require('./_export') @@ -7759,7 +7676,7 @@ $export($export.S + $export.F * !require('./_iter-detect')(function(iter){ Array } }); -},{"./_create-property":48,"./_ctx":49,"./_export":55,"./_is-array-iter":63,"./_iter-call":66,"./_iter-detect":69,"./_to-length":98,"./_to-object":99,"./core.get-iterator-method":105}],107:[function(require,module,exports){ +},{"./_create-property":43,"./_ctx":44,"./_export":50,"./_is-array-iter":58,"./_iter-call":61,"./_iter-detect":64,"./_to-length":93,"./_to-object":94,"./core.get-iterator-method":100}],102:[function(require,module,exports){ 'use strict'; var addToUnscopables = require('./_add-to-unscopables') , step = require('./_iter-step') @@ -7794,22 +7711,22 @@ Iterators.Arguments = Iterators.Array; addToUnscopables('keys'); addToUnscopables('values'); addToUnscopables('entries'); -},{"./_add-to-unscopables":42,"./_iter-define":68,"./_iter-step":70,"./_iterators":71,"./_to-iobject":97}],108:[function(require,module,exports){ +},{"./_add-to-unscopables":37,"./_iter-define":63,"./_iter-step":65,"./_iterators":66,"./_to-iobject":92}],103:[function(require,module,exports){ // 19.1.3.1 Object.assign(target, source) var $export = require('./_export'); $export($export.S + $export.F, 'Object', {assign: require('./_object-assign')}); -},{"./_export":55,"./_object-assign":75}],109:[function(require,module,exports){ +},{"./_export":50,"./_object-assign":70}],104:[function(require,module,exports){ var $export = require('./_export') // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) $export($export.S, 'Object', {create: require('./_object-create')}); -},{"./_export":55,"./_object-create":76}],110:[function(require,module,exports){ +},{"./_export":50,"./_object-create":71}],105:[function(require,module,exports){ // 19.1.3.19 Object.setPrototypeOf(O, proto) var $export = require('./_export'); $export($export.S, 'Object', {setPrototypeOf: require('./_set-proto').set}); -},{"./_export":55,"./_set-proto":90}],111:[function(require,module,exports){ +},{"./_export":50,"./_set-proto":85}],106:[function(require,module,exports){ -},{}],112:[function(require,module,exports){ +},{}],107:[function(require,module,exports){ 'use strict'; var $at = require('./_string-at')(true); @@ -7827,7 +7744,7 @@ require('./_iter-define')(String, 'String', function(iterated){ this._i += point.length; return {value: point, done: false}; }); -},{"./_iter-define":68,"./_string-at":94}],113:[function(require,module,exports){ +},{"./_iter-define":63,"./_string-at":89}],108:[function(require,module,exports){ 'use strict'; // ECMAScript 6 symbols shim var global = require('./_global') @@ -8063,7 +7980,7 @@ setToStringTag($Symbol, 'Symbol'); setToStringTag(Math, 'Math', true); // 24.3.3 JSON[@@toStringTag] setToStringTag(global.JSON, 'JSON', true); -},{"./_an-object":43,"./_descriptors":51,"./_enum-keys":54,"./_export":55,"./_fails":56,"./_global":57,"./_has":58,"./_hide":59,"./_is-array":64,"./_keyof":72,"./_library":73,"./_meta":74,"./_object-create":76,"./_object-dp":77,"./_object-gopd":79,"./_object-gopn":81,"./_object-gopn-ext":80,"./_object-gops":82,"./_object-keys":85,"./_object-pie":86,"./_property-desc":88,"./_redefine":89,"./_set-to-string-tag":91,"./_shared":93,"./_to-iobject":97,"./_to-primitive":100,"./_uid":101,"./_wks":104,"./_wks-define":102,"./_wks-ext":103}],114:[function(require,module,exports){ +},{"./_an-object":38,"./_descriptors":46,"./_enum-keys":49,"./_export":50,"./_fails":51,"./_global":52,"./_has":53,"./_hide":54,"./_is-array":59,"./_keyof":67,"./_library":68,"./_meta":69,"./_object-create":71,"./_object-dp":72,"./_object-gopd":74,"./_object-gopn":76,"./_object-gopn-ext":75,"./_object-gops":77,"./_object-keys":80,"./_object-pie":81,"./_property-desc":83,"./_redefine":84,"./_set-to-string-tag":86,"./_shared":88,"./_to-iobject":92,"./_to-primitive":95,"./_uid":96,"./_wks":99,"./_wks-define":97,"./_wks-ext":98}],109:[function(require,module,exports){ // https://github.com/tc39/proposal-object-values-entries var $export = require('./_export') , $entries = require('./_object-to-array')(true); @@ -8073,7 +7990,7 @@ $export($export.S, 'Object', { return $entries(it); } }); -},{"./_export":55,"./_object-to-array":87}],115:[function(require,module,exports){ +},{"./_export":50,"./_object-to-array":82}],110:[function(require,module,exports){ // https://github.com/tc39/proposal-object-values-entries var $export = require('./_export') , $values = require('./_object-to-array')(false); @@ -8083,11 +8000,11 @@ $export($export.S, 'Object', { return $values(it); } }); -},{"./_export":55,"./_object-to-array":87}],116:[function(require,module,exports){ +},{"./_export":50,"./_object-to-array":82}],111:[function(require,module,exports){ require('./_wks-define')('asyncIterator'); -},{"./_wks-define":102}],117:[function(require,module,exports){ +},{"./_wks-define":97}],112:[function(require,module,exports){ require('./_wks-define')('observable'); -},{"./_wks-define":102}],118:[function(require,module,exports){ +},{"./_wks-define":97}],113:[function(require,module,exports){ require('./es6.array.iterator'); var global = require('./_global') , hide = require('./_hide') @@ -8101,9 +8018,9 @@ for(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList' if(proto && !proto[TO_STRING_TAG])hide(proto, TO_STRING_TAG, NAME); Iterators[NAME] = Iterators.Array; } -},{"./_global":57,"./_hide":59,"./_iterators":71,"./_wks":104,"./es6.array.iterator":107}],119:[function(require,module,exports){ -arguments[4][111][0].apply(exports,arguments) -},{"dup":111}],120:[function(require,module,exports){ +},{"./_global":52,"./_hide":54,"./_iterators":66,"./_wks":99,"./es6.array.iterator":102}],114:[function(require,module,exports){ +arguments[4][106][0].apply(exports,arguments) +},{"dup":106}],115:[function(require,module,exports){ module.exports = function (uri) { var mime = uri.split(',')[0].split(':')[1].split(';')[0]; var bytes = atob(uri.split(',')[1]); @@ -8139,7 +8056,7 @@ module.exports.init = function () { } } -},{}],121:[function(require,module,exports){ +},{}],116:[function(require,module,exports){ /*! Copyright (c) 2016 Jed Watson. Licensed under the MIT License (MIT), see @@ -8189,7 +8106,7 @@ module.exports.init = function () { } }()); -},{}],122:[function(require,module,exports){ +},{}],117:[function(require,module,exports){ !function() { var d3 = { version: "3.5.17" @@ -17744,7 +17661,7 @@ module.exports.init = function () { }); if (typeof define === "function" && define.amd) this.d3 = d3, define(d3); else if (typeof module === "object" && module.exports) module.exports = d3; else this.d3 = d3; }(); -},{}],123:[function(require,module,exports){ +},{}],118:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -17766,7 +17683,7 @@ function activeElement() { } catch (e) {/* ie throws if no active element */} } module.exports = exports['default']; -},{"./ownerDocument":133}],124:[function(require,module,exports){ +},{"./ownerDocument":128}],119:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -17784,7 +17701,7 @@ function addClass(element, className) { if (element.classList) element.classList.add(className);else if (!(0, _hasClass2.default)(element)) element.className = element.className + ' ' + className; } module.exports = exports['default']; -},{"./hasClass":125}],125:[function(require,module,exports){ +},{"./hasClass":120}],120:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -17795,7 +17712,7 @@ function hasClass(element, className) { if (element.classList) return !!className && element.classList.contains(className);else return (" " + element.className + " ").indexOf(" " + className + " ") !== -1; } module.exports = exports["default"]; -},{}],126:[function(require,module,exports){ +},{}],121:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -17821,13 +17738,13 @@ exports.addClass = _addClass2.default; exports.removeClass = _removeClass2.default; exports.hasClass = _hasClass2.default; exports.default = { addClass: _addClass2.default, removeClass: _removeClass2.default, hasClass: _hasClass2.default }; -},{"./addClass":124,"./hasClass":125,"./removeClass":127}],127:[function(require,module,exports){ +},{"./addClass":119,"./hasClass":120,"./removeClass":122}],122:[function(require,module,exports){ 'use strict'; module.exports = function removeClass(element, className) { if (element.classList) element.classList.remove(className);else element.className = element.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)', 'g'), '$1').replace(/\s+/g, ' ').replace(/^\s*|\s*$/g, ''); }; -},{}],128:[function(require,module,exports){ +},{}],123:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -17857,7 +17774,7 @@ function filterEvents(selector, handler) { }; } module.exports = exports['default']; -},{"../query/contains":134,"../query/querySelectorAll":139}],129:[function(require,module,exports){ +},{"../query/contains":129,"../query/querySelectorAll":134}],124:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -17888,7 +17805,7 @@ exports.off = _off2.default; exports.filter = _filter2.default; exports.listen = _listen2.default; exports.default = { on: _on2.default, off: _off2.default, filter: _filter2.default, listen: _listen2.default }; -},{"./filter":128,"./listen":130,"./off":131,"./on":132}],130:[function(require,module,exports){ +},{"./filter":123,"./listen":125,"./off":126,"./on":127}],125:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -17922,7 +17839,7 @@ if (_inDOM2.default) { exports.default = listen; module.exports = exports['default']; -},{"../util/inDOM":151,"./off":131,"./on":132}],131:[function(require,module,exports){ +},{"../util/inDOM":146,"./off":126,"./on":127}],126:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -17948,7 +17865,7 @@ if (_inDOM2.default) { exports.default = off; module.exports = exports['default']; -},{"../util/inDOM":151}],132:[function(require,module,exports){ +},{"../util/inDOM":146}],127:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -17980,7 +17897,7 @@ if (_inDOM2.default) { exports.default = on; module.exports = exports['default']; -},{"../util/inDOM":151}],133:[function(require,module,exports){ +},{"../util/inDOM":146}],128:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -17991,7 +17908,7 @@ function ownerDocument(node) { return node && node.ownerDocument || document; } module.exports = exports["default"]; -},{}],134:[function(require,module,exports){ +},{}],129:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -18026,7 +17943,7 @@ function fallback(context, node) { return false; } module.exports = exports['default']; -},{"../util/inDOM":151}],135:[function(require,module,exports){ +},{"../util/inDOM":146}],130:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -18037,7 +17954,7 @@ function getWindow(node) { return node === node.window ? node : node.nodeType === 9 ? node.defaultView || node.parentWindow : false; } module.exports = exports["default"]; -},{}],136:[function(require,module,exports){ +},{}],131:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -18083,7 +18000,7 @@ function offset(node) { return box; } module.exports = exports['default']; -},{"../ownerDocument":133,"./contains":134,"./isWindow":135}],137:[function(require,module,exports){ +},{"../ownerDocument":128,"./contains":129,"./isWindow":130}],132:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -18116,7 +18033,7 @@ function offsetParent(node) { return offsetParent || doc.documentElement; } module.exports = exports['default']; -},{"../ownerDocument":133,"../style":143}],138:[function(require,module,exports){ +},{"../ownerDocument":128,"../style":138}],133:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -18178,7 +18095,7 @@ function position(node, offsetParent) { }); } module.exports = exports['default']; -},{"../style":143,"./offset":136,"./offsetParent":137,"./scrollLeft":140,"./scrollTop":141}],139:[function(require,module,exports){ +},{"../style":138,"./offset":131,"./offsetParent":132,"./scrollLeft":135,"./scrollTop":136}],134:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -18212,7 +18129,7 @@ function qsa(element, selector) { return toArray(element.querySelectorAll(selector)); } module.exports = exports['default']; -},{}],140:[function(require,module,exports){ +},{}],135:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -18234,7 +18151,7 @@ function scrollTop(node, val) { if (win) win.scrollTo(val, 'pageYOffset' in win ? win.pageYOffset : win.document.documentElement.scrollTop);else node.scrollLeft = val; } module.exports = exports['default']; -},{"./isWindow":135}],141:[function(require,module,exports){ +},{"./isWindow":130}],136:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -18256,7 +18173,7 @@ function scrollTop(node, val) { if (win) win.scrollTo('pageXOffset' in win ? win.pageXOffset : win.document.documentElement.scrollLeft, val);else node.scrollTop = val; } module.exports = exports['default']; -},{"./isWindow":135}],142:[function(require,module,exports){ +},{"./isWindow":130}],137:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -18312,7 +18229,7 @@ function _getComputedStyle(node) { }; } module.exports = exports['default']; -},{"../util/camelizeStyle":148}],143:[function(require,module,exports){ +},{"../util/camelizeStyle":143}],138:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -18375,7 +18292,7 @@ function style(node, property, value) { node.style.cssText += ';' + css; } module.exports = exports['default']; -},{"../transition/isTransform":145,"../transition/properties":146,"../util/camelizeStyle":148,"../util/hyphenateStyle":150,"./getComputedStyle":142,"./removeStyle":144}],144:[function(require,module,exports){ +},{"../transition/isTransform":140,"../transition/properties":141,"../util/camelizeStyle":143,"../util/hyphenateStyle":145,"./getComputedStyle":137,"./removeStyle":139}],139:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -18386,7 +18303,7 @@ function removeStyle(node, key) { return 'removeProperty' in node.style ? node.style.removeProperty(key) : node.style.removeAttribute(key); } module.exports = exports['default']; -},{}],145:[function(require,module,exports){ +},{}],140:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -18399,7 +18316,7 @@ function isTransform(property) { return !!(property && supportedTransforms.test(property)); } module.exports = exports["default"]; -},{}],146:[function(require,module,exports){ +},{}],141:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -18510,7 +18427,7 @@ function getTransitionProperties() { return { animationEnd: animationEnd, transitionEnd: transitionEnd, prefix: prefix }; } -},{"../util/inDOM":151}],147:[function(require,module,exports){ +},{"../util/inDOM":146}],142:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -18525,7 +18442,7 @@ function camelize(string) { }); } module.exports = exports["default"]; -},{}],148:[function(require,module,exports){ +},{}],143:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -18548,7 +18465,7 @@ function camelizeStyleName(string) { return (0, _camelize2.default)(string.replace(msPattern, 'ms-')); } module.exports = exports['default']; -},{"./camelize":147}],149:[function(require,module,exports){ +},{"./camelize":142}],144:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -18562,7 +18479,7 @@ function hyphenate(string) { return string.replace(rUpper, '-$1').toLowerCase(); } module.exports = exports['default']; -},{}],150:[function(require,module,exports){ +},{}],145:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -18586,7 +18503,7 @@ function hyphenateStyleName(string) { return (0, _hyphenate2.default)(string).replace(msPattern, '-ms-'); } module.exports = exports['default']; -},{"./hyphenate":149}],151:[function(require,module,exports){ +},{"./hyphenate":144}],146:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -18594,7 +18511,7 @@ Object.defineProperty(exports, "__esModule", { }); exports.default = !!(typeof window !== 'undefined' && window.document && window.document.createElement); module.exports = exports['default']; -},{}],152:[function(require,module,exports){ +},{}],147:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -18630,7 +18547,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de var size = void 0; module.exports = exports['default']; -},{"./inDOM":151}],153:[function(require,module,exports){ +},{"./inDOM":146}],148:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -18934,7 +18851,7 @@ function isUndefined(arg) { return arg === void 0; } -},{}],154:[function(require,module,exports){ +},{}],149:[function(require,module,exports){ /** * Copyright (c) 2014-present, Facebook, Inc. * All rights reserved. @@ -18951,7 +18868,7 @@ var fbemitter = { module.exports = fbemitter; -},{"./lib/BaseEventEmitter":155,"./lib/EmitterSubscription":156}],155:[function(require,module,exports){ +},{"./lib/BaseEventEmitter":150,"./lib/EmitterSubscription":151}],150:[function(require,module,exports){ (function (process){ /** * Copyright (c) 2014-present, Facebook, Inc. @@ -19146,7 +19063,7 @@ var BaseEventEmitter = (function () { module.exports = BaseEventEmitter; }).call(this,require('_process')) -},{"./EmitterSubscription":156,"./EventSubscriptionVendor":158,"_process":239,"fbjs/lib/emptyFunction":166,"fbjs/lib/invariant":174}],156:[function(require,module,exports){ +},{"./EmitterSubscription":151,"./EventSubscriptionVendor":153,"_process":234,"fbjs/lib/emptyFunction":161,"fbjs/lib/invariant":169}],151:[function(require,module,exports){ /** * Copyright (c) 2014-present, Facebook, Inc. * All rights reserved. @@ -19195,7 +19112,7 @@ var EmitterSubscription = (function (_EventSubscription) { })(EventSubscription); module.exports = EmitterSubscription; -},{"./EventSubscription":157}],157:[function(require,module,exports){ +},{"./EventSubscription":152}],152:[function(require,module,exports){ /** * Copyright (c) 2014-present, Facebook, Inc. * All rights reserved. @@ -19245,7 +19162,7 @@ var EventSubscription = (function () { })(); module.exports = EventSubscription; -},{}],158:[function(require,module,exports){ +},{}],153:[function(require,module,exports){ (function (process){ /** * Copyright (c) 2014-present, Facebook, Inc. @@ -19352,7 +19269,7 @@ var EventSubscriptionVendor = (function () { module.exports = EventSubscriptionVendor; }).call(this,require('_process')) -},{"_process":239,"fbjs/lib/invariant":174}],159:[function(require,module,exports){ +},{"_process":234,"fbjs/lib/invariant":169}],154:[function(require,module,exports){ 'use strict'; /** @@ -19436,7 +19353,7 @@ var EventListener = { }; module.exports = EventListener; -},{"./emptyFunction":166}],160:[function(require,module,exports){ +},{"./emptyFunction":161}],155:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -19472,7 +19389,7 @@ var ExecutionEnvironment = { }; module.exports = ExecutionEnvironment; -},{}],161:[function(require,module,exports){ +},{}],156:[function(require,module,exports){ "use strict"; /** @@ -19504,7 +19421,7 @@ function camelize(string) { } module.exports = camelize; -},{}],162:[function(require,module,exports){ +},{}],157:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -19544,7 +19461,7 @@ function camelizeStyleName(string) { } module.exports = camelizeStyleName; -},{"./camelize":161}],163:[function(require,module,exports){ +},{"./camelize":156}],158:[function(require,module,exports){ 'use strict'; /** @@ -19584,7 +19501,7 @@ function containsNode(outerNode, innerNode) { } module.exports = containsNode; -},{"./isTextNode":176}],164:[function(require,module,exports){ +},{"./isTextNode":171}],159:[function(require,module,exports){ 'use strict'; /** @@ -19711,7 +19628,7 @@ function createArrayFromMixed(obj) { } module.exports = createArrayFromMixed; -},{"./invariant":174}],165:[function(require,module,exports){ +},{"./invariant":169}],160:[function(require,module,exports){ 'use strict'; /** @@ -19795,7 +19712,7 @@ function createNodesFromMarkup(markup, handleScript) { } module.exports = createNodesFromMarkup; -},{"./ExecutionEnvironment":160,"./createArrayFromMixed":164,"./getMarkupWrap":170,"./invariant":174}],166:[function(require,module,exports){ +},{"./ExecutionEnvironment":155,"./createArrayFromMixed":159,"./getMarkupWrap":165,"./invariant":169}],161:[function(require,module,exports){ "use strict"; /** @@ -19834,7 +19751,7 @@ emptyFunction.thatReturnsArgument = function (arg) { }; module.exports = emptyFunction; -},{}],167:[function(require,module,exports){ +},{}],162:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -19854,7 +19771,7 @@ if ("development" !== 'production') { } module.exports = emptyObject; -},{}],168:[function(require,module,exports){ +},{}],163:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -19881,7 +19798,7 @@ function focusNode(node) { } module.exports = focusNode; -},{}],169:[function(require,module,exports){ +},{}],164:[function(require,module,exports){ 'use strict'; /** @@ -19920,7 +19837,7 @@ function getActiveElement(doc) /*?DOMElement*/{ } module.exports = getActiveElement; -},{}],170:[function(require,module,exports){ +},{}],165:[function(require,module,exports){ 'use strict'; /** @@ -20015,7 +19932,7 @@ function getMarkupWrap(nodeName) { } module.exports = getMarkupWrap; -},{"./ExecutionEnvironment":160,"./invariant":174}],171:[function(require,module,exports){ +},{"./ExecutionEnvironment":155,"./invariant":169}],166:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -20054,7 +19971,7 @@ function getUnboundedScrollPosition(scrollable) { } module.exports = getUnboundedScrollPosition; -},{}],172:[function(require,module,exports){ +},{}],167:[function(require,module,exports){ 'use strict'; /** @@ -20087,7 +20004,7 @@ function hyphenate(string) { } module.exports = hyphenate; -},{}],173:[function(require,module,exports){ +},{}],168:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -20126,7 +20043,7 @@ function hyphenateStyleName(string) { } module.exports = hyphenateStyleName; -},{"./hyphenate":172}],174:[function(require,module,exports){ +},{"./hyphenate":167}],169:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -20182,7 +20099,7 @@ function invariant(condition, format, a, b, c, d, e, f) { } module.exports = invariant; -},{}],175:[function(require,module,exports){ +},{}],170:[function(require,module,exports){ 'use strict'; /** @@ -20207,7 +20124,7 @@ function isNode(object) { } module.exports = isNode; -},{}],176:[function(require,module,exports){ +},{}],171:[function(require,module,exports){ 'use strict'; /** @@ -20232,7 +20149,7 @@ function isTextNode(object) { } module.exports = isTextNode; -},{"./isNode":175}],177:[function(require,module,exports){ +},{"./isNode":170}],172:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -20262,7 +20179,7 @@ function memoizeStringOnly(callback) { } module.exports = memoizeStringOnly; -},{}],178:[function(require,module,exports){ +},{}],173:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -20285,7 +20202,7 @@ if (ExecutionEnvironment.canUseDOM) { } module.exports = performance || {}; -},{"./ExecutionEnvironment":160}],179:[function(require,module,exports){ +},{"./ExecutionEnvironment":155}],174:[function(require,module,exports){ 'use strict'; /** @@ -20319,7 +20236,7 @@ if (performance.now) { } module.exports = performanceNow; -},{"./performance":178}],180:[function(require,module,exports){ +},{"./performance":173}],175:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -20387,7 +20304,7 @@ function shallowEqual(objA, objB) { } module.exports = shallowEqual; -},{}],181:[function(require,module,exports){ +},{}],176:[function(require,module,exports){ /** * Copyright 2014-2015, Facebook, Inc. * All rights reserved. @@ -20454,7 +20371,7 @@ if ("development" !== 'production') { } module.exports = warning; -},{"./emptyFunction":166}],182:[function(require,module,exports){ +},{"./emptyFunction":161}],177:[function(require,module,exports){ /* FileSaver.js * A saveAs() FileSaver implementation. * 1.1.20150716 @@ -20712,7 +20629,7 @@ if (typeof module !== "undefined" && module.exports) { }); } -},{}],183:[function(require,module,exports){ +},{}],178:[function(require,module,exports){ /** * Copyright (c) 2014-2015, Facebook, Inc. * All rights reserved. @@ -20724,7 +20641,7 @@ if (typeof module !== "undefined" && module.exports) { module.exports.Dispatcher = require('./lib/Dispatcher'); -},{"./lib/Dispatcher":184}],184:[function(require,module,exports){ +},{"./lib/Dispatcher":179}],179:[function(require,module,exports){ (function (process){ /** * Copyright (c) 2014-2015, Facebook, Inc. @@ -20959,7 +20876,7 @@ var Dispatcher = (function () { module.exports = Dispatcher; }).call(this,require('_process')) -},{"_process":239,"fbjs/lib/invariant":192}],185:[function(require,module,exports){ +},{"_process":234,"fbjs/lib/invariant":187}],180:[function(require,module,exports){ (function (process){ /** * Copyright (c) 2014-2015, Facebook, Inc. @@ -21140,7 +21057,7 @@ function enforceInterface(o) { module.exports = { create: create }; }).call(this,require('_process')) -},{"./FluxStoreGroup":190,"_process":239,"fbjs/lib/invariant":192,"fbjs/lib/shallowEqual":193}],186:[function(require,module,exports){ +},{"./FluxStoreGroup":185,"_process":234,"fbjs/lib/invariant":187,"fbjs/lib/shallowEqual":188}],181:[function(require,module,exports){ (function (process){ /** * Copyright (c) 2014-2015, Facebook, Inc. @@ -21288,7 +21205,7 @@ var FluxMapStore = (function (_FluxReduceStore) { module.exports = FluxMapStore; }).call(this,require('_process')) -},{"./FluxReduceStore":188,"_process":239,"fbjs/lib/invariant":192,"immutable":197}],187:[function(require,module,exports){ +},{"./FluxReduceStore":183,"_process":234,"fbjs/lib/invariant":187,"immutable":192}],182:[function(require,module,exports){ (function (process){ /** * Copyright (c) 2014-2015, Facebook, Inc. @@ -21409,7 +21326,7 @@ function enforceInterface(o) { module.exports = FluxMixinLegacy; }).call(this,require('_process')) -},{"./FluxStoreGroup":190,"_process":239,"fbjs/lib/invariant":192}],188:[function(require,module,exports){ +},{"./FluxStoreGroup":185,"_process":234,"fbjs/lib/invariant":187}],183:[function(require,module,exports){ (function (process){ /** * Copyright (c) 2014-2015, Facebook, Inc. @@ -21514,7 +21431,7 @@ var FluxReduceStore = (function (_FluxStore) { module.exports = FluxReduceStore; }).call(this,require('_process')) -},{"./FluxStore":189,"./abstractMethod":191,"_process":239,"fbjs/lib/invariant":192}],189:[function(require,module,exports){ +},{"./FluxStore":184,"./abstractMethod":186,"_process":234,"fbjs/lib/invariant":187}],184:[function(require,module,exports){ (function (process){ /** * Copyright (c) 2014-2015, Facebook, Inc. @@ -21695,7 +21612,7 @@ module.exports = FluxStore; // protected, available to subclasses }).call(this,require('_process')) -},{"_process":239,"fbemitter":154,"fbjs/lib/invariant":192}],190:[function(require,module,exports){ +},{"_process":234,"fbemitter":149,"fbjs/lib/invariant":187}],185:[function(require,module,exports){ (function (process){ /** * Copyright (c) 2014-2015, Facebook, Inc. @@ -21774,7 +21691,7 @@ function _getUniformDispatcher(stores) { module.exports = FluxStoreGroup; }).call(this,require('_process')) -},{"_process":239,"fbjs/lib/invariant":192}],191:[function(require,module,exports){ +},{"_process":234,"fbjs/lib/invariant":187}],186:[function(require,module,exports){ (function (process){ /** * Copyright (c) 2014-2015, Facebook, Inc. @@ -21799,7 +21716,7 @@ function abstractMethod(className, methodName) { module.exports = abstractMethod; }).call(this,require('_process')) -},{"_process":239,"fbjs/lib/invariant":192}],192:[function(require,module,exports){ +},{"_process":234,"fbjs/lib/invariant":187}],187:[function(require,module,exports){ (function (process){ /** * Copyright 2013-2015, Facebook, Inc. @@ -21852,7 +21769,7 @@ var invariant = function (condition, format, a, b, c, d, e, f) { module.exports = invariant; }).call(this,require('_process')) -},{"_process":239}],193:[function(require,module,exports){ +},{"_process":234}],188:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -21903,7 +21820,7 @@ function shallowEqual(objA, objB) { } module.exports = shallowEqual; -},{}],194:[function(require,module,exports){ +},{}],189:[function(require,module,exports){ /** * Copyright (c) 2014-2015, Facebook, Inc. * All rights reserved. @@ -21919,7 +21836,7 @@ module.exports.Mixin = require('./lib/FluxMixinLegacy'); module.exports.ReduceStore = require('./lib/FluxReduceStore'); module.exports.Store = require('./lib/FluxStore'); -},{"./lib/FluxContainer":185,"./lib/FluxMapStore":186,"./lib/FluxMixinLegacy":187,"./lib/FluxReduceStore":188,"./lib/FluxStore":189}],195:[function(require,module,exports){ +},{"./lib/FluxContainer":180,"./lib/FluxMapStore":181,"./lib/FluxMixinLegacy":182,"./lib/FluxReduceStore":183,"./lib/FluxStore":184}],190:[function(require,module,exports){ /** * Copyright 2015, Yahoo! Inc. * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. @@ -21971,7 +21888,7 @@ module.exports = function hoistNonReactStatics(targetComponent, sourceComponent, return targetComponent; }; -},{}],196:[function(require,module,exports){ +},{}],191:[function(require,module,exports){ (function() { @@ -22447,7 +22364,7 @@ module.exports = function hoistNonReactStatics(targetComponent, sourceComponent, }).call(this); -},{}],197:[function(require,module,exports){ +},{}],192:[function(require,module,exports){ /** * Copyright (c) 2014-2015, Facebook, Inc. * All rights reserved. @@ -27427,13 +27344,13 @@ module.exports = function hoistNonReactStatics(targetComponent, sourceComponent, return Immutable; })); -},{}],198:[function(require,module,exports){ +},{}],193:[function(require,module,exports){ 'use strict'; exports = module.exports = require('./lib/memoizer')['default']; exports['default'] = exports; -},{"./lib/memoizer":200}],199:[function(require,module,exports){ +},{"./lib/memoizer":195}],194:[function(require,module,exports){ "use strict"; /* Copyright (c) 2014, Yahoo! Inc. All rights reserved. @@ -27513,7 +27430,7 @@ var objCreate = Object.create || function (proto, props) { exports.bind = bind, exports.defineProperty = defineProperty, exports.objCreate = objCreate; -},{}],200:[function(require,module,exports){ +},{}],195:[function(require,module,exports){ "use strict"; var src$es5$$ = require("./es5"); exports["default"] = createFormatCache; @@ -27589,13 +27506,13 @@ function orderedProps(obj) { } -},{"./es5":199}],201:[function(require,module,exports){ +},{"./es5":194}],196:[function(require,module,exports){ 'use strict'; exports = module.exports = require('./lib/parser')['default']; exports['default'] = exports; -},{"./lib/parser":202}],202:[function(require,module,exports){ +},{"./lib/parser":197}],197:[function(require,module,exports){ "use strict"; exports["default"] = (function() { @@ -28955,7 +28872,7 @@ exports["default"] = (function() { })(); -},{}],203:[function(require,module,exports){ +},{}],198:[function(require,module,exports){ /* jshint node:true */ 'use strict'; @@ -28972,7 +28889,7 @@ require('./lib/locales'); exports = module.exports = IntlMessageFormat; exports['default'] = exports; -},{"./lib/locales":119,"./lib/main":208}],204:[function(require,module,exports){ +},{"./lib/locales":114,"./lib/main":203}],199:[function(require,module,exports){ /* Copyright (c) 2014, Yahoo! Inc. All rights reserved. Copyrights licensed under the New BSD License. @@ -29182,7 +29099,7 @@ SelectFormat.prototype.getOption = function (value) { }; -},{}],205:[function(require,module,exports){ +},{}],200:[function(require,module,exports){ /* Copyright (c) 2014, Yahoo! Inc. All rights reserved. Copyrights licensed under the New BSD License. @@ -29447,13 +29364,13 @@ MessageFormat.prototype._resolveLocale = function (locales) { }; -},{"./compiler":204,"./es5":207,"./utils":209,"intl-messageformat-parser":201}],206:[function(require,module,exports){ +},{"./compiler":199,"./es5":202,"./utils":204,"intl-messageformat-parser":196}],201:[function(require,module,exports){ // GENERATED FILE "use strict"; exports["default"] = {"locale":"en","pluralRuleFunction":function (n,ord){var s=String(n).split("."),v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2);if(ord)return n10==1&&n100!=11?"one":n10==2&&n100!=12?"two":n10==3&&n100!=13?"few":"other";return n==1&&v0?"one":"other"}}; -},{}],207:[function(require,module,exports){ +},{}],202:[function(require,module,exports){ /* Copyright (c) 2014, Yahoo! Inc. All rights reserved. Copyrights licensed under the New BSD License. @@ -29503,7 +29420,7 @@ var objCreate = Object.create || function (proto, props) { exports.defineProperty = defineProperty, exports.objCreate = objCreate; -},{"./utils":209}],208:[function(require,module,exports){ +},{"./utils":204}],203:[function(require,module,exports){ /* jslint esnext: true */ "use strict"; @@ -29515,7 +29432,7 @@ src$core$$["default"].defaultLocale = 'en'; exports["default"] = src$core$$["default"]; -},{"./core":205,"./en":206}],209:[function(require,module,exports){ +},{"./core":200,"./en":201}],204:[function(require,module,exports){ /* Copyright (c) 2014, Yahoo! Inc. All rights reserved. Copyrights licensed under the New BSD License. @@ -29548,7 +29465,7 @@ function extend(obj) { exports.hop = hop; -},{}],210:[function(require,module,exports){ +},{}],205:[function(require,module,exports){ /* jshint node:true */ 'use strict'; @@ -29565,7 +29482,7 @@ require('./lib/locales'); exports = module.exports = IntlRelativeFormat; exports['default'] = exports; -},{"./lib/locales":119,"./lib/main":215}],211:[function(require,module,exports){ +},{"./lib/locales":114,"./lib/main":210}],206:[function(require,module,exports){ /* Copyright (c) 2014, Yahoo! Inc. All rights reserved. Copyrights licensed under the New BSD License. @@ -29863,7 +29780,7 @@ RelativeFormat.prototype._selectUnits = function (diffReport) { }; -},{"./diff":212,"./es5":214,"intl-messageformat":203}],212:[function(require,module,exports){ +},{"./diff":207,"./es5":209,"intl-messageformat":198}],207:[function(require,module,exports){ /* Copyright (c) 2014, Yahoo! Inc. All rights reserved. Copyrights licensed under the New BSD License. @@ -29910,13 +29827,13 @@ exports["default"] = function (from, to) { }; -},{}],213:[function(require,module,exports){ +},{}],208:[function(require,module,exports){ // GENERATED FILE "use strict"; exports["default"] = {"locale":"en","pluralRuleFunction":function (n,ord){var s=String(n).split("."),v0=!s[1],t0=Number(s[0])==n,n10=t0&&s[0].slice(-1),n100=t0&&s[0].slice(-2);if(ord)return n10==1&&n100!=11?"one":n10==2&&n100!=12?"two":n10==3&&n100!=13?"few":"other";return n==1&&v0?"one":"other"},"fields":{"year":{"displayName":"year","relative":{"0":"this year","1":"next year","-1":"last year"},"relativeTime":{"future":{"one":"in {0} year","other":"in {0} years"},"past":{"one":"{0} year ago","other":"{0} years ago"}}},"month":{"displayName":"month","relative":{"0":"this month","1":"next month","-1":"last month"},"relativeTime":{"future":{"one":"in {0} month","other":"in {0} months"},"past":{"one":"{0} month ago","other":"{0} months ago"}}},"day":{"displayName":"day","relative":{"0":"today","1":"tomorrow","-1":"yesterday"},"relativeTime":{"future":{"one":"in {0} day","other":"in {0} days"},"past":{"one":"{0} day ago","other":"{0} days ago"}}},"hour":{"displayName":"hour","relativeTime":{"future":{"one":"in {0} hour","other":"in {0} hours"},"past":{"one":"{0} hour ago","other":"{0} hours ago"}}},"minute":{"displayName":"minute","relativeTime":{"future":{"one":"in {0} minute","other":"in {0} minutes"},"past":{"one":"{0} minute ago","other":"{0} minutes ago"}}},"second":{"displayName":"second","relative":{"0":"now"},"relativeTime":{"future":{"one":"in {0} second","other":"in {0} seconds"},"past":{"one":"{0} second ago","other":"{0} seconds ago"}}}}}; -},{}],214:[function(require,module,exports){ +},{}],209:[function(require,module,exports){ /* Copyright (c) 2014, Yahoo! Inc. All rights reserved. Copyrights licensed under the New BSD License. @@ -29992,9 +29909,9 @@ var dateNow = Date.now || function () { exports.defineProperty = defineProperty, exports.objCreate = objCreate, exports.arrIndexOf = arrIndexOf, exports.isArray = isArray, exports.dateNow = dateNow; -},{}],215:[function(require,module,exports){ -arguments[4][208][0].apply(exports,arguments) -},{"./core":211,"./en":213,"dup":208}],216:[function(require,module,exports){ +},{}],210:[function(require,module,exports){ +arguments[4][203][0].apply(exports,arguments) +},{"./core":206,"./en":208,"dup":203}],211:[function(require,module,exports){ /** * Copyright 2013-2015, Facebook, Inc. * All rights reserved. @@ -30047,7 +29964,7 @@ var invariant = function(condition, format, a, b, c, d, e, f) { module.exports = invariant; -},{}],217:[function(require,module,exports){ +},{}],212:[function(require,module,exports){ // Source: http://jsfiddle.net/vWx8V/ // http://stackoverflow.com/questions/5603195/full-list-of-javascript-keycodes @@ -30195,7 +30112,7 @@ for (var alias in aliases) { codes[alias] = aliases[alias] } -},{}],218:[function(require,module,exports){ +},{}],213:[function(require,module,exports){ var root = require('./_root'); /** Built-in value references. */ @@ -30203,7 +30120,7 @@ var Symbol = root.Symbol; module.exports = Symbol; -},{"./_root":225}],219:[function(require,module,exports){ +},{"./_root":220}],214:[function(require,module,exports){ var Symbol = require('./_Symbol'), getRawTag = require('./_getRawTag'), objectToString = require('./_objectToString'); @@ -30233,7 +30150,7 @@ function baseGetTag(value) { module.exports = baseGetTag; -},{"./_Symbol":218,"./_getRawTag":222,"./_objectToString":223}],220:[function(require,module,exports){ +},{"./_Symbol":213,"./_getRawTag":217,"./_objectToString":218}],215:[function(require,module,exports){ (function (global){ /** Detect free variable `global` from Node.js. */ var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; @@ -30242,7 +30159,7 @@ module.exports = freeGlobal; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],221:[function(require,module,exports){ +},{}],216:[function(require,module,exports){ var overArg = require('./_overArg'); /** Built-in value references. */ @@ -30250,7 +30167,7 @@ var getPrototype = overArg(Object.getPrototypeOf, Object); module.exports = getPrototype; -},{"./_overArg":224}],222:[function(require,module,exports){ +},{"./_overArg":219}],217:[function(require,module,exports){ var Symbol = require('./_Symbol'); /** Used for built-in method references. */ @@ -30298,7 +30215,7 @@ function getRawTag(value) { module.exports = getRawTag; -},{"./_Symbol":218}],223:[function(require,module,exports){ +},{"./_Symbol":213}],218:[function(require,module,exports){ /** Used for built-in method references. */ var objectProto = Object.prototype; @@ -30322,7 +30239,7 @@ function objectToString(value) { module.exports = objectToString; -},{}],224:[function(require,module,exports){ +},{}],219:[function(require,module,exports){ /** * Creates a unary function that invokes `func` with its argument transformed. * @@ -30339,7 +30256,7 @@ function overArg(func, transform) { module.exports = overArg; -},{}],225:[function(require,module,exports){ +},{}],220:[function(require,module,exports){ var freeGlobal = require('./_freeGlobal'); /** Detect free variable `self`. */ @@ -30350,7 +30267,7 @@ var root = freeGlobal || freeSelf || Function('return this')(); module.exports = root; -},{"./_freeGlobal":220}],226:[function(require,module,exports){ +},{"./_freeGlobal":215}],221:[function(require,module,exports){ /** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". @@ -30381,7 +30298,7 @@ function isObjectLike(value) { module.exports = isObjectLike; -},{}],227:[function(require,module,exports){ +},{}],222:[function(require,module,exports){ var baseGetTag = require('./_baseGetTag'), getPrototype = require('./_getPrototype'), isObjectLike = require('./isObjectLike'); @@ -30445,7 +30362,7 @@ function isPlainObject(value) { module.exports = isPlainObject; -},{"./_baseGetTag":219,"./_getPrototype":221,"./isObjectLike":226}],228:[function(require,module,exports){ +},{"./_baseGetTag":214,"./_getPrototype":216,"./isObjectLike":221}],223:[function(require,module,exports){ // THIS FILE IS GENERATED - DO NOT EDIT! /*!mobile-detect v1.3.6 2017-04-05*/ /*global module:false, define:false*/ @@ -31437,7 +31354,7 @@ define(function () { throw new Error('unknown environment'); } })()); -},{}],229:[function(require,module,exports){ +},{}],224:[function(require,module,exports){ /* object-assign (c) Sindre Sorhus @@ -31529,7 +31446,7 @@ module.exports = shouldUseNative() ? Object.assign : function (target, source) { return to; }; -},{}],230:[function(require,module,exports){ +},{}],225:[function(require,module,exports){ 'use strict'; @@ -31633,7 +31550,7 @@ exports.setTyped = function (on) { exports.setTyped(TYPED_OK); -},{}],231:[function(require,module,exports){ +},{}],226:[function(require,module,exports){ 'use strict'; // Note: adler32 takes 12% for level 0 and 2% for level 6. @@ -31686,7 +31603,7 @@ function adler32(adler, buf, len, pos) { module.exports = adler32; -},{}],232:[function(require,module,exports){ +},{}],227:[function(require,module,exports){ 'use strict'; // Note: we can't get significant speed boost here. @@ -31747,7 +31664,7 @@ function crc32(crc, buf, len, pos) { module.exports = crc32; -},{}],233:[function(require,module,exports){ +},{}],228:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -32094,7 +32011,7 @@ module.exports = function inflate_fast(strm, start) { return; }; -},{}],234:[function(require,module,exports){ +},{}],229:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -33652,7 +33569,7 @@ exports.inflateSyncPoint = inflateSyncPoint; exports.inflateUndermine = inflateUndermine; */ -},{"../utils/common":230,"./adler32":231,"./crc32":232,"./inffast":233,"./inftrees":235}],235:[function(require,module,exports){ +},{"../utils/common":225,"./adler32":226,"./crc32":227,"./inffast":228,"./inftrees":230}],230:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -33997,7 +33914,7 @@ module.exports = function inflate_table(type, lens, lens_index, codes, table, ta return 0; }; -},{"../utils/common":230}],236:[function(require,module,exports){ +},{"../utils/common":225}],231:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -34046,7 +33963,7 @@ function ZStream() { module.exports = ZStream; -},{}],237:[function(require,module,exports){ +},{}],232:[function(require,module,exports){ (function (process){ // Copyright Joyent, Inc. and other Node contributors. // @@ -34275,7 +34192,7 @@ var substr = 'ab'.substr(-1) === 'b' }).call(this,require('_process')) -},{"_process":239}],238:[function(require,module,exports){ +},{"_process":234}],233:[function(require,module,exports){ (function (process){ 'use strict'; @@ -34373,7 +34290,7 @@ module.exports.win32 = win32.parse; }).call(this,require('_process')) -},{"_process":239}],239:[function(require,module,exports){ +},{"_process":234}],234:[function(require,module,exports){ // shim for using process in browser var process = module.exports = {}; @@ -34559,7 +34476,7 @@ process.chdir = function (dir) { }; process.umask = function() { return 0; }; -},{}],240:[function(require,module,exports){ +},{}],235:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -34622,7 +34539,7 @@ function checkPropTypes(typeSpecs, values, location, componentName, getStack) { module.exports = checkPropTypes; -},{"./lib/ReactPropTypesSecret":245,"fbjs/lib/invariant":174,"fbjs/lib/warning":181}],241:[function(require,module,exports){ +},{"./lib/ReactPropTypesSecret":240,"fbjs/lib/invariant":169,"fbjs/lib/warning":176}],236:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -34645,7 +34562,7 @@ module.exports = function(isValidElement) { return factory(isValidElement, throwOnDirectAccess); }; -},{"./factoryWithTypeCheckers":243}],242:[function(require,module,exports){ +},{"./factoryWithTypeCheckers":238}],237:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -34706,7 +34623,7 @@ module.exports = function() { return ReactPropTypes; }; -},{"./lib/ReactPropTypesSecret":245,"fbjs/lib/emptyFunction":166,"fbjs/lib/invariant":174}],243:[function(require,module,exports){ +},{"./lib/ReactPropTypesSecret":240,"fbjs/lib/emptyFunction":161,"fbjs/lib/invariant":169}],238:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -35220,7 +35137,7 @@ module.exports = function(isValidElement, throwOnDirectAccess) { return ReactPropTypes; }; -},{"./checkPropTypes":240,"./lib/ReactPropTypesSecret":245,"fbjs/lib/emptyFunction":166,"fbjs/lib/invariant":174,"fbjs/lib/warning":181}],244:[function(require,module,exports){ +},{"./checkPropTypes":235,"./lib/ReactPropTypesSecret":240,"fbjs/lib/emptyFunction":161,"fbjs/lib/invariant":169,"fbjs/lib/warning":176}],239:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -35252,7 +35169,7 @@ if ("development" !== 'production') { module.exports = require('./factoryWithThrowingShims')(); } -},{"./factoryWithThrowingShims":242,"./factoryWithTypeCheckers":243}],245:[function(require,module,exports){ +},{"./factoryWithThrowingShims":237,"./factoryWithTypeCheckers":238}],240:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -35268,7 +35185,7 @@ var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; module.exports = ReactPropTypesSecret; -},{}],246:[function(require,module,exports){ +},{}],241:[function(require,module,exports){ (function (global){ /*! https://mths.be/punycode v1.4.1 by @mathias */ ;(function(root) { @@ -35806,7 +35723,7 @@ module.exports = ReactPropTypesSecret; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],247:[function(require,module,exports){ +},{}],242:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -35892,7 +35809,7 @@ var isArray = Array.isArray || function (xs) { return Object.prototype.toString.call(xs) === '[object Array]'; }; -},{}],248:[function(require,module,exports){ +},{}],243:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -35979,13 +35896,13 @@ var objectKeys = Object.keys || function (obj) { return res; }; -},{}],249:[function(require,module,exports){ +},{}],244:[function(require,module,exports){ 'use strict'; exports.decode = exports.parse = require('./decode'); exports.encode = exports.stringify = require('./encode'); -},{"./decode":247,"./encode":248}],250:[function(require,module,exports){ +},{"./decode":242,"./encode":243}],245:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -36037,7 +35954,7 @@ var Accordion = function (_React$Component) { exports['default'] = Accordion; module.exports = exports['default']; -},{"./PanelGroup":319,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/possibleConstructorReturn":31,"react":537}],251:[function(require,module,exports){ +},{"./PanelGroup":314,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/possibleConstructorReturn":26,"react":532}],246:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -36144,7 +36061,7 @@ Alert.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsStyles)((0, _values2['default'])(_StyleConfig.State), _StyleConfig.State.INFO, (0, _bootstrapUtils.bsClass)('alert', Alert)); module.exports = exports['default']; -},{"./CloseButton":263,"./utils/StyleConfig":339,"./utils/bootstrapUtils":342,"babel-runtime/core-js/object/values":24,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],252:[function(require,module,exports){ +},{"./CloseButton":258,"./utils/StyleConfig":334,"./utils/bootstrapUtils":337,"babel-runtime/core-js/object/values":19,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],247:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -36254,7 +36171,7 @@ Badge.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('badge', Badge); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],253:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],248:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -36328,7 +36245,7 @@ Breadcrumb.Item = _BreadcrumbItem2['default']; exports['default'] = (0, _bootstrapUtils.bsClass)('breadcrumb', Breadcrumb); module.exports = exports['default']; -},{"./BreadcrumbItem":254,"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537}],254:[function(require,module,exports){ +},{"./BreadcrumbItem":249,"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532}],249:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -36430,7 +36347,7 @@ BreadcrumbItem.defaultProps = defaultProps; exports['default'] = BreadcrumbItem; module.exports = exports['default']; -},{"./SafeAnchor":325,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],255:[function(require,module,exports){ +},{"./SafeAnchor":320,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],250:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -36564,7 +36481,7 @@ Button.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('btn', (0, _bootstrapUtils.bsSizes)([_StyleConfig.Size.LARGE, _StyleConfig.Size.SMALL, _StyleConfig.Size.XSMALL], (0, _bootstrapUtils.bsStyles)([].concat((0, _values2['default'])(_StyleConfig.State), [_StyleConfig.Style.DEFAULT, _StyleConfig.Style.PRIMARY, _StyleConfig.Style.LINK]), _StyleConfig.Style.DEFAULT, Button))); module.exports = exports['default']; -},{"./SafeAnchor":325,"./utils/StyleConfig":339,"./utils/bootstrapUtils":342,"babel-runtime/core-js/object/values":24,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"react-prop-types/lib/elementType":494}],256:[function(require,module,exports){ +},{"./SafeAnchor":320,"./utils/StyleConfig":334,"./utils/bootstrapUtils":337,"babel-runtime/core-js/object/values":19,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"react-prop-types/lib/elementType":489}],251:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -36671,7 +36588,7 @@ ButtonGroup.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('btn-group', ButtonGroup); module.exports = exports['default']; -},{"./Button":255,"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"react-prop-types/lib/all":492}],257:[function(require,module,exports){ +},{"./Button":250,"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"react-prop-types/lib/all":487}],252:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -36742,7 +36659,7 @@ var ButtonToolbar = function (_React$Component) { exports['default'] = (0, _bootstrapUtils.bsClass)('btn-toolbar', (0, _bootstrapUtils.bsSizes)(_Button2['default'].SIZES, ButtonToolbar)); module.exports = exports['default']; -},{"./Button":255,"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537}],258:[function(require,module,exports){ +},{"./Button":250,"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532}],253:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -37200,7 +37117,7 @@ Carousel.Item = _CarouselItem2['default']; exports['default'] = (0, _bootstrapUtils.bsClass)('carousel', Carousel); module.exports = exports['default']; -},{"./CarouselCaption":259,"./CarouselItem":260,"./Glyphicon":277,"./SafeAnchor":325,"./utils/ValidComponentChildren":341,"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],259:[function(require,module,exports){ +},{"./CarouselCaption":254,"./CarouselItem":255,"./Glyphicon":272,"./SafeAnchor":320,"./utils/ValidComponentChildren":336,"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],254:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -37282,7 +37199,7 @@ CarouselCaption.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('carousel-caption', CarouselCaption); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537,"react-prop-types/lib/elementType":494}],260:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532,"react-prop-types/lib/elementType":489}],255:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -37450,7 +37367,7 @@ CarouselItem.defaultProps = defaultProps; exports['default'] = CarouselItem; module.exports = exports['default']; -},{"./utils/TransitionEvents":340,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"react-dom":348}],261:[function(require,module,exports){ +},{"./utils/TransitionEvents":335,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"react-dom":343}],256:[function(require,module,exports){ (function (process){ 'use strict'; @@ -37593,7 +37510,7 @@ exports['default'] = (0, _bootstrapUtils.bsClass)('checkbox', Checkbox); module.exports = exports['default']; }).call(this,require('_process')) -},{"./utils/bootstrapUtils":342,"_process":239,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"warning":555}],262:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"_process":234,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"warning":550}],257:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -37727,7 +37644,7 @@ Clearfix.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('clearfix', Clearfix); module.exports = exports['default']; -},{"./utils/StyleConfig":339,"./utils/bootstrapUtils":342,"./utils/capitalize":343,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"react-prop-types/lib/elementType":494}],263:[function(require,module,exports){ +},{"./utils/StyleConfig":334,"./utils/bootstrapUtils":337,"./utils/capitalize":338,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"react-prop-types/lib/elementType":489}],258:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -37801,7 +37718,7 @@ CloseButton.propTypes = propTypes; exports['default'] = CloseButton; module.exports = exports['default']; -},{"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/possibleConstructorReturn":31,"prop-types":244,"react":537}],264:[function(require,module,exports){ +},{"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/possibleConstructorReturn":26,"prop-types":239,"react":532}],259:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -38074,7 +37991,7 @@ Col.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('col', Col); module.exports = exports['default']; -},{"./utils/StyleConfig":339,"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"react-prop-types/lib/elementType":494}],265:[function(require,module,exports){ +},{"./utils/StyleConfig":334,"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"react-prop-types/lib/elementType":489}],260:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -38342,7 +38259,7 @@ Collapse.defaultProps = defaultProps; exports['default'] = Collapse; module.exports = exports['default']; -},{"./utils/capitalize":343,"./utils/createChainedFunction":344,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"dom-helpers/style":143,"prop-types":244,"react":537,"react-overlays/lib/Transition":484}],266:[function(require,module,exports){ +},{"./utils/capitalize":338,"./utils/createChainedFunction":339,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"dom-helpers/style":138,"prop-types":239,"react":532,"react-overlays/lib/Transition":479}],261:[function(require,module,exports){ (function (process){ 'use strict'; @@ -38450,7 +38367,7 @@ exports['default'] = (0, _bootstrapUtils.bsClass)('control-label', ControlLabel) module.exports = exports['default']; }).call(this,require('_process')) -},{"./utils/bootstrapUtils":342,"_process":239,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"warning":555}],267:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"_process":234,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"warning":550}],262:[function(require,module,exports){ (function (process){ 'use strict'; @@ -38874,7 +38791,7 @@ exports['default'] = UncontrolledDropdown; module.exports = exports['default']; }).call(this,require('_process')) -},{"./ButtonGroup":256,"./DropdownMenu":269,"./DropdownToggle":270,"./utils/PropTypes":338,"./utils/ValidComponentChildren":341,"./utils/bootstrapUtils":342,"./utils/createChainedFunction":344,"_process":239,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"dom-helpers/activeElement":123,"dom-helpers/query/contains":134,"keycode":217,"prop-types":244,"react":537,"react-dom":348,"react-prop-types/lib/all":492,"react-prop-types/lib/elementType":494,"react-prop-types/lib/isRequiredForA11y":495,"uncontrollable":550,"warning":555}],268:[function(require,module,exports){ +},{"./ButtonGroup":251,"./DropdownMenu":264,"./DropdownToggle":265,"./utils/PropTypes":333,"./utils/ValidComponentChildren":336,"./utils/bootstrapUtils":337,"./utils/createChainedFunction":339,"_process":234,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"dom-helpers/activeElement":118,"dom-helpers/query/contains":129,"keycode":212,"prop-types":239,"react":532,"react-dom":343,"react-prop-types/lib/all":487,"react-prop-types/lib/elementType":489,"react-prop-types/lib/isRequiredForA11y":490,"uncontrollable":545,"warning":550}],263:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -38981,7 +38898,7 @@ DropdownButton.propTypes = propTypes; exports['default'] = DropdownButton; module.exports = exports['default']; -},{"./Dropdown":267,"./utils/splitComponentProps":347,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"prop-types":244,"react":537}],269:[function(require,module,exports){ +},{"./Dropdown":262,"./utils/splitComponentProps":342,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"prop-types":239,"react":532}],264:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -39189,7 +39106,7 @@ DropdownMenu.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('dropdown-menu', DropdownMenu); module.exports = exports['default']; -},{"./utils/ValidComponentChildren":341,"./utils/bootstrapUtils":342,"./utils/createChainedFunction":344,"babel-runtime/core-js/array/from":19,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"keycode":217,"prop-types":244,"react":537,"react-dom":348,"react-overlays/lib/RootCloseWrapper":483}],270:[function(require,module,exports){ +},{"./utils/ValidComponentChildren":336,"./utils/bootstrapUtils":337,"./utils/createChainedFunction":339,"babel-runtime/core-js/array/from":14,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"keycode":212,"prop-types":239,"react":532,"react-dom":343,"react-overlays/lib/RootCloseWrapper":478}],265:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -39302,7 +39219,7 @@ DropdownToggle.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('dropdown-toggle', DropdownToggle); module.exports = exports['default']; -},{"./Button":255,"./SafeAnchor":325,"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],271:[function(require,module,exports){ +},{"./Button":250,"./SafeAnchor":320,"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],266:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -39428,7 +39345,7 @@ Fade.defaultProps = defaultProps; exports['default'] = Fade; module.exports = exports['default']; -},{"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"react-overlays/lib/Transition":484}],272:[function(require,module,exports){ +},{"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"react-overlays/lib/Transition":479}],267:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -39526,7 +39443,7 @@ Form.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('form', Form); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"react-prop-types/lib/elementType":494}],273:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"react-prop-types/lib/elementType":489}],268:[function(require,module,exports){ (function (process){ 'use strict'; @@ -39677,7 +39594,7 @@ exports['default'] = (0, _bootstrapUtils.bsClass)('form-control', (0, _bootstrap module.exports = exports['default']; }).call(this,require('_process')) -},{"./FormControlFeedback":274,"./FormControlStatic":275,"./utils/StyleConfig":339,"./utils/bootstrapUtils":342,"_process":239,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"react-prop-types/lib/elementType":494,"warning":555}],274:[function(require,module,exports){ +},{"./FormControlFeedback":269,"./FormControlStatic":270,"./utils/StyleConfig":334,"./utils/bootstrapUtils":337,"_process":234,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"react-prop-types/lib/elementType":489,"warning":550}],269:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -39793,7 +39710,7 @@ FormControlFeedback.contextTypes = contextTypes; exports['default'] = (0, _bootstrapUtils.bsClass)('form-control-feedback', FormControlFeedback); module.exports = exports['default']; -},{"./Glyphicon":277,"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],275:[function(require,module,exports){ +},{"./Glyphicon":272,"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],270:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -39875,7 +39792,7 @@ FormControlStatic.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('form-control-static', FormControlStatic); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537,"react-prop-types/lib/elementType":494}],276:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532,"react-prop-types/lib/elementType":489}],271:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -39999,7 +39916,7 @@ FormGroup.childContextTypes = childContextTypes; exports['default'] = (0, _bootstrapUtils.bsClass)('form-group', (0, _bootstrapUtils.bsSizes)([_StyleConfig.Size.LARGE, _StyleConfig.Size.SMALL], FormGroup)); module.exports = exports['default']; -},{"./utils/StyleConfig":339,"./utils/ValidComponentChildren":341,"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],277:[function(require,module,exports){ +},{"./utils/StyleConfig":334,"./utils/ValidComponentChildren":336,"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],272:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -40081,7 +39998,7 @@ Glyphicon.propTypes = propTypes; exports['default'] = (0, _bootstrapUtils.bsClass)('glyphicon', Glyphicon); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],278:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],273:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -40178,7 +40095,7 @@ Grid.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('container', Grid); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"react-prop-types/lib/elementType":494}],279:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"react-prop-types/lib/elementType":489}],274:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -40244,7 +40161,7 @@ var HelpBlock = function (_React$Component) { exports['default'] = (0, _bootstrapUtils.bsClass)('help-block', HelpBlock); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537}],280:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532}],275:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -40352,7 +40269,7 @@ Image.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('img', Image); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],281:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],276:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -40431,7 +40348,7 @@ InputGroup.Button = _InputGroupButton2['default']; exports['default'] = (0, _bootstrapUtils.bsClass)('input-group', (0, _bootstrapUtils.bsSizes)([_StyleConfig.Size.LARGE, _StyleConfig.Size.SMALL], InputGroup)); module.exports = exports['default']; -},{"./InputGroupAddon":282,"./InputGroupButton":283,"./utils/StyleConfig":339,"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537}],282:[function(require,module,exports){ +},{"./InputGroupAddon":277,"./InputGroupButton":278,"./utils/StyleConfig":334,"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532}],277:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -40497,7 +40414,7 @@ var InputGroupAddon = function (_React$Component) { exports['default'] = (0, _bootstrapUtils.bsClass)('input-group-addon', InputGroupAddon); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537}],283:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532}],278:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -40563,7 +40480,7 @@ var InputGroupButton = function (_React$Component) { exports['default'] = (0, _bootstrapUtils.bsClass)('input-group-btn', InputGroupButton); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537}],284:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532}],279:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -40645,7 +40562,7 @@ Jumbotron.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('jumbotron', Jumbotron); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537,"react-prop-types/lib/elementType":494}],285:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532,"react-prop-types/lib/elementType":489}],280:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -40742,7 +40659,7 @@ var Label = function (_React$Component) { exports['default'] = (0, _bootstrapUtils.bsClass)('label', (0, _bootstrapUtils.bsStyles)([].concat((0, _values2['default'])(_StyleConfig.State), [_StyleConfig.Style.DEFAULT, _StyleConfig.Style.PRIMARY]), _StyleConfig.Style.DEFAULT, Label)); module.exports = exports['default']; -},{"./utils/StyleConfig":339,"./utils/bootstrapUtils":342,"babel-runtime/core-js/object/values":24,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537}],286:[function(require,module,exports){ +},{"./utils/StyleConfig":334,"./utils/bootstrapUtils":337,"babel-runtime/core-js/object/values":19,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532}],281:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -40860,7 +40777,7 @@ ListGroup.propTypes = propTypes; exports['default'] = (0, _bootstrapUtils.bsClass)('list-group', ListGroup); module.exports = exports['default']; -},{"./ListGroupItem":287,"./utils/ValidComponentChildren":341,"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537,"react-prop-types/lib/elementType":494}],287:[function(require,module,exports){ +},{"./ListGroupItem":282,"./utils/ValidComponentChildren":336,"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532,"react-prop-types/lib/elementType":489}],282:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -41006,7 +40923,7 @@ ListGroupItem.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('list-group-item', (0, _bootstrapUtils.bsStyles)((0, _values2['default'])(_StyleConfig.State), ListGroupItem)); module.exports = exports['default']; -},{"./utils/StyleConfig":339,"./utils/bootstrapUtils":342,"babel-runtime/core-js/object/values":24,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],288:[function(require,module,exports){ +},{"./utils/StyleConfig":334,"./utils/bootstrapUtils":337,"babel-runtime/core-js/object/values":19,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],283:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -41119,7 +41036,7 @@ Media.ListItem = _MediaListItem2['default']; exports['default'] = (0, _bootstrapUtils.bsClass)('media', Media); module.exports = exports['default']; -},{"./MediaBody":289,"./MediaHeading":290,"./MediaLeft":291,"./MediaList":292,"./MediaListItem":293,"./MediaRight":294,"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537,"react-prop-types/lib/elementType":494}],289:[function(require,module,exports){ +},{"./MediaBody":284,"./MediaHeading":285,"./MediaLeft":286,"./MediaList":287,"./MediaListItem":288,"./MediaRight":289,"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532,"react-prop-types/lib/elementType":489}],284:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -41201,7 +41118,7 @@ MediaBody.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('media-body', MediaBody); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537,"react-prop-types/lib/elementType":494}],290:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532,"react-prop-types/lib/elementType":489}],285:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -41283,7 +41200,7 @@ MediaHeading.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('media-heading', MediaHeading); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537,"react-prop-types/lib/elementType":494}],291:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532,"react-prop-types/lib/elementType":489}],286:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -41372,7 +41289,7 @@ MediaLeft.propTypes = propTypes; exports['default'] = (0, _bootstrapUtils.bsClass)('media-left', MediaLeft); module.exports = exports['default']; -},{"./Media":288,"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],292:[function(require,module,exports){ +},{"./Media":283,"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],287:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -41438,7 +41355,7 @@ var MediaList = function (_React$Component) { exports['default'] = (0, _bootstrapUtils.bsClass)('media-list', MediaList); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537}],293:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532}],288:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -41504,7 +41421,7 @@ var MediaListItem = function (_React$Component) { exports['default'] = (0, _bootstrapUtils.bsClass)('media', MediaListItem); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537}],294:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532}],289:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -41593,7 +41510,7 @@ MediaRight.propTypes = propTypes; exports['default'] = (0, _bootstrapUtils.bsClass)('media-right', MediaRight); module.exports = exports['default']; -},{"./Media":288,"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],295:[function(require,module,exports){ +},{"./Media":283,"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],290:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -41793,7 +41710,7 @@ MenuItem.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('dropdown', MenuItem); module.exports = exports['default']; -},{"./SafeAnchor":325,"./utils/bootstrapUtils":342,"./utils/createChainedFunction":344,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"react-prop-types/lib/all":492}],296:[function(require,module,exports){ +},{"./SafeAnchor":320,"./utils/bootstrapUtils":337,"./utils/createChainedFunction":339,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"react-prop-types/lib/all":487}],291:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -42147,7 +42064,7 @@ Modal.BACKDROP_TRANSITION_DURATION = 150; exports['default'] = (0, _bootstrapUtils.bsClass)('modal', (0, _bootstrapUtils.bsSizes)([_StyleConfig.Size.LARGE, _StyleConfig.Size.SMALL], Modal)); module.exports = exports['default']; -},{"./Fade":271,"./ModalBody":297,"./ModalDialog":298,"./ModalFooter":299,"./ModalHeader":300,"./ModalTitle":301,"./utils/StyleConfig":339,"./utils/bootstrapUtils":342,"./utils/createChainedFunction":344,"./utils/splitComponentProps":347,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"dom-helpers/events":129,"dom-helpers/ownerDocument":133,"dom-helpers/util/inDOM":151,"dom-helpers/util/scrollbarSize":152,"prop-types":244,"react":537,"react-dom":348,"react-overlays/lib/Modal":478,"react-overlays/lib/utils/isOverflowing":489,"react-prop-types/lib/elementType":494}],297:[function(require,module,exports){ +},{"./Fade":266,"./ModalBody":292,"./ModalDialog":293,"./ModalFooter":294,"./ModalHeader":295,"./ModalTitle":296,"./utils/StyleConfig":334,"./utils/bootstrapUtils":337,"./utils/createChainedFunction":339,"./utils/splitComponentProps":342,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"dom-helpers/events":124,"dom-helpers/ownerDocument":128,"dom-helpers/util/inDOM":146,"dom-helpers/util/scrollbarSize":147,"prop-types":239,"react":532,"react-dom":343,"react-overlays/lib/Modal":473,"react-overlays/lib/utils/isOverflowing":484,"react-prop-types/lib/elementType":489}],292:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -42229,7 +42146,7 @@ ModalBody.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('modal-body', ModalBody); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537,"react-prop-types/lib/elementType":494}],298:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532,"react-prop-types/lib/elementType":489}],293:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -42334,7 +42251,7 @@ ModalDialog.propTypes = propTypes; exports['default'] = (0, _bootstrapUtils.bsClass)('modal', (0, _bootstrapUtils.bsSizes)([_StyleConfig.Size.LARGE, _StyleConfig.Size.SMALL], ModalDialog)); module.exports = exports['default']; -},{"./utils/StyleConfig":339,"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],299:[function(require,module,exports){ +},{"./utils/StyleConfig":334,"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],294:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -42416,7 +42333,7 @@ ModalFooter.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('modal-footer', ModalFooter); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537,"react-prop-types/lib/elementType":494}],300:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532,"react-prop-types/lib/elementType":489}],295:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -42547,7 +42464,7 @@ ModalHeader.contextTypes = contextTypes; exports['default'] = (0, _bootstrapUtils.bsClass)('modal-header', ModalHeader); module.exports = exports['default']; -},{"./CloseButton":263,"./utils/bootstrapUtils":342,"./utils/createChainedFunction":344,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],301:[function(require,module,exports){ +},{"./CloseButton":258,"./utils/bootstrapUtils":337,"./utils/createChainedFunction":339,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],296:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -42629,7 +42546,7 @@ ModalTitle.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('modal-title', ModalTitle); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537,"react-prop-types/lib/elementType":494}],302:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532,"react-prop-types/lib/elementType":489}],297:[function(require,module,exports){ (function (process){ 'use strict'; @@ -43035,7 +42952,7 @@ exports['default'] = (0, _bootstrapUtils.bsClass)('nav', (0, _bootstrapUtils.bsS module.exports = exports['default']; }).call(this,require('_process')) -},{"./utils/ValidComponentChildren":341,"./utils/bootstrapUtils":342,"./utils/createChainedFunction":344,"_process":239,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"keycode":217,"prop-types":244,"react":537,"react-dom":348,"react-prop-types/lib/all":492,"warning":555}],303:[function(require,module,exports){ +},{"./utils/ValidComponentChildren":336,"./utils/bootstrapUtils":337,"./utils/createChainedFunction":339,"_process":234,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"keycode":212,"prop-types":239,"react":532,"react-dom":343,"react-prop-types/lib/all":487,"warning":550}],298:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -43181,7 +43098,7 @@ NavDropdown.propTypes = propTypes; exports['default'] = NavDropdown; module.exports = exports['default']; -},{"./Dropdown":267,"./utils/ValidComponentChildren":341,"./utils/splitComponentProps":347,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],304:[function(require,module,exports){ +},{"./Dropdown":262,"./utils/ValidComponentChildren":336,"./utils/splitComponentProps":342,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],299:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -43312,7 +43229,7 @@ NavItem.defaultProps = defaultProps; exports['default'] = NavItem; module.exports = exports['default']; -},{"./SafeAnchor":325,"./utils/createChainedFunction":344,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],305:[function(require,module,exports){ +},{"./SafeAnchor":320,"./utils/createChainedFunction":339,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],300:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -43641,7 +43558,7 @@ UncontrollableNavbar.Link = createSimpleWrapper('a', 'link', 'NavbarLink'); // Set bsStyles here so they can be overridden. exports['default'] = (0, _bootstrapUtils.bsStyles)([_StyleConfig.Style.DEFAULT, _StyleConfig.Style.INVERSE], _StyleConfig.Style.DEFAULT, UncontrollableNavbar); module.exports = exports['default']; -},{"./Grid":278,"./NavbarBrand":306,"./NavbarCollapse":307,"./NavbarHeader":308,"./NavbarToggle":309,"./utils/StyleConfig":339,"./utils/bootstrapUtils":342,"./utils/createChainedFunction":344,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"react-prop-types/lib/elementType":494,"uncontrollable":550}],306:[function(require,module,exports){ +},{"./Grid":273,"./NavbarBrand":301,"./NavbarCollapse":302,"./NavbarHeader":303,"./NavbarToggle":304,"./utils/StyleConfig":334,"./utils/bootstrapUtils":337,"./utils/createChainedFunction":339,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"react-prop-types/lib/elementType":489,"uncontrollable":545}],301:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -43726,7 +43643,7 @@ NavbarBrand.contextTypes = contextTypes; exports['default'] = NavbarBrand; module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],307:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],302:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -43809,7 +43726,7 @@ NavbarCollapse.contextTypes = contextTypes; exports['default'] = NavbarCollapse; module.exports = exports['default']; -},{"./Collapse":265,"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"prop-types":244,"react":537}],308:[function(require,module,exports){ +},{"./Collapse":260,"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"prop-types":239,"react":532}],303:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -43883,7 +43800,7 @@ NavbarHeader.contextTypes = contextTypes; exports['default'] = NavbarHeader; module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],309:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],304:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -43998,7 +43915,7 @@ NavbarToggle.contextTypes = contextTypes; exports['default'] = NavbarToggle; module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"./utils/createChainedFunction":344,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],310:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"./utils/createChainedFunction":339,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],305:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -44157,7 +44074,7 @@ Overlay.defaultProps = defaultProps; exports['default'] = Overlay; module.exports = exports['default']; -},{"./Fade":271,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"react-overlays/lib/Overlay":480,"react-prop-types/lib/elementType":494}],311:[function(require,module,exports){ +},{"./Fade":266,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"react-overlays/lib/Overlay":475,"react-prop-types/lib/elementType":489}],306:[function(require,module,exports){ (function (process){ 'use strict'; @@ -44512,7 +44429,7 @@ exports['default'] = OverlayTrigger; module.exports = exports['default']; }).call(this,require('_process')) -},{"./Overlay":310,"./utils/createChainedFunction":344,"_process":239,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"dom-helpers/query/contains":134,"prop-types":244,"react":537,"react-dom":348,"warning":555}],312:[function(require,module,exports){ +},{"./Overlay":305,"./utils/createChainedFunction":339,"_process":234,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"dom-helpers/query/contains":129,"prop-types":239,"react":532,"react-dom":343,"warning":550}],307:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -44587,7 +44504,7 @@ var PageHeader = function (_React$Component) { exports['default'] = (0, _bootstrapUtils.bsClass)('page-header', PageHeader); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537}],313:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532}],308:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -44604,7 +44521,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'd exports['default'] = _deprecationWarning2['default'].wrapper(_PagerItem2['default'], '``', '``'); module.exports = exports['default']; -},{"./PagerItem":315,"./utils/deprecationWarning":345}],314:[function(require,module,exports){ +},{"./PagerItem":310,"./utils/deprecationWarning":340}],309:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -44704,7 +44621,7 @@ Pager.Item = _PagerItem2['default']; exports['default'] = (0, _bootstrapUtils.bsClass)('pager', Pager); module.exports = exports['default']; -},{"./PagerItem":315,"./utils/ValidComponentChildren":341,"./utils/bootstrapUtils":342,"./utils/createChainedFunction":344,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],315:[function(require,module,exports){ +},{"./PagerItem":310,"./utils/ValidComponentChildren":336,"./utils/bootstrapUtils":337,"./utils/createChainedFunction":339,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],310:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -44833,7 +44750,7 @@ PagerItem.defaultProps = defaultProps; exports['default'] = PagerItem; module.exports = exports['default']; -},{"./SafeAnchor":325,"./utils/createChainedFunction":344,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],316:[function(require,module,exports){ +},{"./SafeAnchor":320,"./utils/createChainedFunction":339,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],311:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -45130,7 +45047,7 @@ Pagination.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('pagination', Pagination); module.exports = exports['default']; -},{"./PaginationButton":317,"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"react-prop-types/lib/elementType":494}],317:[function(require,module,exports){ +},{"./PaginationButton":312,"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"react-prop-types/lib/elementType":489}],312:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -45268,7 +45185,7 @@ PaginationButton.defaultProps = defaultProps; exports['default'] = PaginationButton; module.exports = exports['default']; -},{"./SafeAnchor":325,"./utils/createChainedFunction":344,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"react-prop-types/lib/elementType":494}],318:[function(require,module,exports){ +},{"./SafeAnchor":320,"./utils/createChainedFunction":339,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"react-prop-types/lib/elementType":489}],313:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -45533,7 +45450,7 @@ Panel.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('panel', (0, _bootstrapUtils.bsStyles)([].concat((0, _values2['default'])(_StyleConfig.State), [_StyleConfig.Style.DEFAULT, _StyleConfig.Style.PRIMARY]), _StyleConfig.Style.DEFAULT, Panel)); module.exports = exports['default']; -},{"./Collapse":265,"./utils/StyleConfig":339,"./utils/bootstrapUtils":342,"babel-runtime/core-js/object/values":24,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],319:[function(require,module,exports){ +},{"./Collapse":260,"./utils/StyleConfig":334,"./utils/bootstrapUtils":337,"babel-runtime/core-js/object/values":19,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],314:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -45685,7 +45602,7 @@ PanelGroup.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('panel-group', PanelGroup); module.exports = exports['default']; -},{"./utils/ValidComponentChildren":341,"./utils/bootstrapUtils":342,"./utils/createChainedFunction":344,"babel-runtime/core-js/object/assign":20,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],320:[function(require,module,exports){ +},{"./utils/ValidComponentChildren":336,"./utils/bootstrapUtils":337,"./utils/createChainedFunction":339,"babel-runtime/core-js/object/assign":15,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],315:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -45840,7 +45757,7 @@ Popover.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('popover', Popover); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"react-prop-types/lib/isRequiredForA11y":495}],321:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"react-prop-types/lib/isRequiredForA11y":490}],316:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -46044,7 +45961,7 @@ ProgressBar.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('progress-bar', (0, _bootstrapUtils.bsStyles)((0, _values2['default'])(_StyleConfig.State), ProgressBar)); module.exports = exports['default']; -},{"./utils/StyleConfig":339,"./utils/ValidComponentChildren":341,"./utils/bootstrapUtils":342,"babel-runtime/core-js/object/values":24,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],322:[function(require,module,exports){ +},{"./utils/StyleConfig":334,"./utils/ValidComponentChildren":336,"./utils/bootstrapUtils":337,"babel-runtime/core-js/object/values":19,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],317:[function(require,module,exports){ (function (process){ 'use strict'; @@ -46187,7 +46104,7 @@ exports['default'] = (0, _bootstrapUtils.bsClass)('radio', Radio); module.exports = exports['default']; }).call(this,require('_process')) -},{"./utils/bootstrapUtils":342,"_process":239,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"warning":555}],323:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"_process":234,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"warning":550}],318:[function(require,module,exports){ (function (process){ 'use strict'; @@ -46301,7 +46218,7 @@ exports['default'] = (0, _bootstrapUtils.bsClass)('embed-responsive', Responsive module.exports = exports['default']; }).call(this,require('_process')) -},{"./utils/bootstrapUtils":342,"_process":239,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"warning":555}],324:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"_process":234,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"warning":550}],319:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -46383,7 +46300,7 @@ Row.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('row', Row); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537,"react-prop-types/lib/elementType":494}],325:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532,"react-prop-types/lib/elementType":489}],320:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -46515,7 +46432,7 @@ SafeAnchor.defaultProps = defaultProps; exports['default'] = SafeAnchor; module.exports = exports['default']; -},{"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"prop-types":244,"react":537,"react-prop-types/lib/elementType":494}],326:[function(require,module,exports){ +},{"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"prop-types":239,"react":532,"react-prop-types/lib/elementType":489}],321:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -46647,7 +46564,7 @@ SplitButton.Toggle = _SplitToggle2['default']; exports['default'] = SplitButton; module.exports = exports['default']; -},{"./Button":255,"./Dropdown":267,"./SplitToggle":327,"./utils/splitComponentProps":347,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"prop-types":244,"react":537}],327:[function(require,module,exports){ +},{"./Button":250,"./Dropdown":262,"./SplitToggle":322,"./utils/splitComponentProps":342,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"prop-types":239,"react":532}],322:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -46700,7 +46617,7 @@ SplitToggle.defaultProps = _DropdownToggle2['default'].defaultProps; exports['default'] = SplitToggle; module.exports = exports['default']; -},{"./DropdownToggle":270,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/possibleConstructorReturn":31,"react":537}],328:[function(require,module,exports){ +},{"./DropdownToggle":265,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/possibleConstructorReturn":26,"react":532}],323:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -46785,7 +46702,7 @@ Tab.Pane = _TabPane2['default']; exports['default'] = Tab; module.exports = exports['default']; -},{"./TabContainer":329,"./TabContent":330,"./TabPane":331,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/possibleConstructorReturn":31,"prop-types":244,"react":537}],329:[function(require,module,exports){ +},{"./TabContainer":324,"./TabContent":325,"./TabPane":326,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/possibleConstructorReturn":26,"prop-types":239,"react":532}],324:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -46941,7 +46858,7 @@ TabContainer.childContextTypes = childContextTypes; exports['default'] = (0, _uncontrollable2['default'])(TabContainer, { activeKey: 'onSelect' }); module.exports = exports['default']; -},{"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"prop-types":244,"react":537,"uncontrollable":550}],330:[function(require,module,exports){ +},{"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"prop-types":239,"react":532,"uncontrollable":545}],325:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -47160,7 +47077,7 @@ TabContent.childContextTypes = childContextTypes; exports['default'] = (0, _bootstrapUtils.bsClass)('tab', TabContent); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"react-prop-types/lib/elementType":494}],331:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"react-prop-types/lib/elementType":489}],326:[function(require,module,exports){ (function (process){ 'use strict'; @@ -47484,7 +47401,7 @@ exports['default'] = (0, _bootstrapUtils.bsClass)('tab-pane', TabPane); module.exports = exports['default']; }).call(this,require('_process')) -},{"./Fade":271,"./utils/bootstrapUtils":342,"./utils/createChainedFunction":344,"_process":239,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"react-prop-types/lib/elementType":494,"warning":555}],332:[function(require,module,exports){ +},{"./Fade":266,"./utils/bootstrapUtils":337,"./utils/createChainedFunction":339,"_process":234,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"react-prop-types/lib/elementType":489,"warning":550}],327:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -47590,7 +47507,7 @@ Table.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('table', Table); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],333:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],328:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -47806,7 +47723,7 @@ Tabs.defaultProps = defaultProps; exports['default'] = (0, _uncontrollable2['default'])(Tabs, { activeKey: 'onSelect' }); module.exports = exports['default']; -},{"./Nav":302,"./NavItem":304,"./TabContainer":329,"./TabContent":330,"./utils/ValidComponentChildren":341,"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"prop-types":244,"react":537,"react-prop-types/lib/isRequiredForA11y":495,"uncontrollable":550}],334:[function(require,module,exports){ +},{"./Nav":297,"./NavItem":299,"./TabContainer":324,"./TabContent":325,"./utils/ValidComponentChildren":336,"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"prop-types":239,"react":532,"react-prop-types/lib/isRequiredForA11y":490,"uncontrollable":545}],329:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -47901,7 +47818,7 @@ Thumbnail.propTypes = propTypes; exports['default'] = (0, _bootstrapUtils.bsClass)('thumbnail', Thumbnail); module.exports = exports['default']; -},{"./SafeAnchor":325,"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537}],335:[function(require,module,exports){ +},{"./SafeAnchor":320,"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532}],330:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -48044,7 +47961,7 @@ Tooltip.defaultProps = defaultProps; exports['default'] = (0, _bootstrapUtils.bsClass)('tooltip', Tooltip); module.exports = exports['default']; -},{"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"prop-types":244,"react":537,"react-prop-types/lib/isRequiredForA11y":495}],336:[function(require,module,exports){ +},{"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"prop-types":239,"react":532,"react-prop-types/lib/isRequiredForA11y":490}],331:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -48112,7 +48029,7 @@ var Well = function (_React$Component) { exports['default'] = (0, _bootstrapUtils.bsClass)('well', (0, _bootstrapUtils.bsSizes)([_StyleConfig.Size.LARGE, _StyleConfig.Size.SMALL], Well)); module.exports = exports['default']; -},{"./utils/StyleConfig":339,"./utils/bootstrapUtils":342,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/extends":28,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/objectWithoutProperties":30,"babel-runtime/helpers/possibleConstructorReturn":31,"classnames":121,"react":537}],337:[function(require,module,exports){ +},{"./utils/StyleConfig":334,"./utils/bootstrapUtils":337,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/extends":23,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/objectWithoutProperties":25,"babel-runtime/helpers/possibleConstructorReturn":26,"classnames":116,"react":532}],332:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -48462,7 +48379,7 @@ exports.Thumbnail = _Thumbnail3['default']; exports.Tooltip = _Tooltip3['default']; exports.Well = _Well3['default']; exports.utils = _utils; -},{"./Accordion":250,"./Alert":251,"./Badge":252,"./Breadcrumb":253,"./BreadcrumbItem":254,"./Button":255,"./ButtonGroup":256,"./ButtonToolbar":257,"./Carousel":258,"./CarouselItem":260,"./Checkbox":261,"./Clearfix":262,"./Col":264,"./Collapse":265,"./ControlLabel":266,"./Dropdown":267,"./DropdownButton":268,"./Fade":271,"./Form":272,"./FormControl":273,"./FormGroup":276,"./Glyphicon":277,"./Grid":278,"./HelpBlock":279,"./Image":280,"./InputGroup":281,"./Jumbotron":284,"./Label":285,"./ListGroup":286,"./ListGroupItem":287,"./Media":288,"./MenuItem":295,"./Modal":296,"./ModalBody":297,"./ModalFooter":299,"./ModalHeader":300,"./ModalTitle":301,"./Nav":302,"./NavDropdown":303,"./NavItem":304,"./Navbar":305,"./NavbarBrand":306,"./Overlay":310,"./OverlayTrigger":311,"./PageHeader":312,"./PageItem":313,"./Pager":314,"./Pagination":316,"./PaginationButton":317,"./Panel":318,"./PanelGroup":319,"./Popover":320,"./ProgressBar":321,"./Radio":322,"./ResponsiveEmbed":323,"./Row":324,"./SafeAnchor":325,"./SplitButton":326,"./Tab":328,"./TabContainer":329,"./TabContent":330,"./TabPane":331,"./Table":332,"./Tabs":333,"./Thumbnail":334,"./Tooltip":335,"./Well":336,"./utils":346}],338:[function(require,module,exports){ +},{"./Accordion":245,"./Alert":246,"./Badge":247,"./Breadcrumb":248,"./BreadcrumbItem":249,"./Button":250,"./ButtonGroup":251,"./ButtonToolbar":252,"./Carousel":253,"./CarouselItem":255,"./Checkbox":256,"./Clearfix":257,"./Col":259,"./Collapse":260,"./ControlLabel":261,"./Dropdown":262,"./DropdownButton":263,"./Fade":266,"./Form":267,"./FormControl":268,"./FormGroup":271,"./Glyphicon":272,"./Grid":273,"./HelpBlock":274,"./Image":275,"./InputGroup":276,"./Jumbotron":279,"./Label":280,"./ListGroup":281,"./ListGroupItem":282,"./Media":283,"./MenuItem":290,"./Modal":291,"./ModalBody":292,"./ModalFooter":294,"./ModalHeader":295,"./ModalTitle":296,"./Nav":297,"./NavDropdown":298,"./NavItem":299,"./Navbar":300,"./NavbarBrand":301,"./Overlay":305,"./OverlayTrigger":306,"./PageHeader":307,"./PageItem":308,"./Pager":309,"./Pagination":311,"./PaginationButton":312,"./Panel":313,"./PanelGroup":314,"./Popover":315,"./ProgressBar":316,"./Radio":317,"./ResponsiveEmbed":318,"./Row":319,"./SafeAnchor":320,"./SplitButton":321,"./Tab":323,"./TabContainer":324,"./TabContent":325,"./TabPane":326,"./Table":327,"./Tabs":328,"./Thumbnail":329,"./Tooltip":330,"./Well":331,"./utils":341}],333:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -48534,7 +48451,7 @@ function exclusiveRoles() { return null; }); } -},{"./ValidComponentChildren":341,"react-prop-types/lib/utils/createChainableTypeChecker":496}],339:[function(require,module,exports){ +},{"./ValidComponentChildren":336,"react-prop-types/lib/utils/createChainableTypeChecker":491}],334:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -48570,7 +48487,7 @@ var Style = exports.Style = { LINK: 'link', INVERSE: 'inverse' }; -},{}],340:[function(require,module,exports){ +},{}],335:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -48684,7 +48601,7 @@ var ReactTransitionEvents = { exports['default'] = ReactTransitionEvents; module.exports = exports['default']; -},{}],341:[function(require,module,exports){ +},{}],336:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -48877,7 +48794,7 @@ exports['default'] = { toArray: toArray }; module.exports = exports['default']; -},{"react":537}],342:[function(require,module,exports){ +},{"react":532}],337:[function(require,module,exports){ (function (process){ 'use strict'; @@ -49096,7 +49013,7 @@ function addStyle(Component) { var _curry = exports._curry = curry; }).call(this,require('_process')) -},{"./StyleConfig":339,"_process":239,"babel-runtime/core-js/object/entries":22,"babel-runtime/helpers/extends":28,"invariant":216,"prop-types":244}],343:[function(require,module,exports){ +},{"./StyleConfig":334,"_process":234,"babel-runtime/core-js/object/entries":17,"babel-runtime/helpers/extends":23,"invariant":211,"prop-types":239}],338:[function(require,module,exports){ "use strict"; exports.__esModule = true; @@ -49105,7 +49022,7 @@ function capitalize(string) { return "" + string.charAt(0).toUpperCase() + string.slice(1); } module.exports = exports["default"]; -},{}],344:[function(require,module,exports){ +},{}],339:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -49147,7 +49064,7 @@ function createChainedFunction() { exports['default'] = createChainedFunction; module.exports = exports['default']; -},{}],345:[function(require,module,exports){ +},{}],340:[function(require,module,exports){ (function (process){ 'use strict'; @@ -49237,7 +49154,7 @@ function _resetWarned() { } }).call(this,require('_process')) -},{"_process":239,"babel-runtime/helpers/classCallCheck":27,"babel-runtime/helpers/inherits":29,"babel-runtime/helpers/possibleConstructorReturn":31,"babel-runtime/helpers/typeof":32,"warning":555}],346:[function(require,module,exports){ +},{"_process":234,"babel-runtime/helpers/classCallCheck":22,"babel-runtime/helpers/inherits":24,"babel-runtime/helpers/possibleConstructorReturn":26,"babel-runtime/helpers/typeof":27,"warning":550}],341:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -49262,7 +49179,7 @@ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; exports.bootstrapUtils = _bootstrapUtils; exports.createChainedFunction = _createChainedFunction3['default']; exports.ValidComponentChildren = _ValidComponentChildren3['default']; -},{"./ValidComponentChildren":341,"./bootstrapUtils":342,"./createChainedFunction":344}],347:[function(require,module,exports){ +},{"./ValidComponentChildren":336,"./bootstrapUtils":337,"./createChainedFunction":339}],342:[function(require,module,exports){ "use strict"; exports.__esModule = true; @@ -49295,12 +49212,12 @@ function splitComponentProps(props, Component) { return [parentProps, childProps]; } module.exports = exports["default"]; -},{"babel-runtime/core-js/object/entries":22}],348:[function(require,module,exports){ +},{"babel-runtime/core-js/object/entries":17}],343:[function(require,module,exports){ 'use strict'; module.exports = require('./lib/ReactDOM'); -},{"./lib/ReactDOM":378}],349:[function(require,module,exports){ +},{"./lib/ReactDOM":373}],344:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -49374,7 +49291,7 @@ var ARIADOMPropertyConfig = { }; module.exports = ARIADOMPropertyConfig; -},{}],350:[function(require,module,exports){ +},{}],345:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -49398,7 +49315,7 @@ var AutoFocusUtils = { }; module.exports = AutoFocusUtils; -},{"./ReactDOMComponentTree":381,"fbjs/lib/focusNode":168}],351:[function(require,module,exports){ +},{"./ReactDOMComponentTree":376,"fbjs/lib/focusNode":163}],346:[function(require,module,exports){ /** * Copyright 2013-present Facebook, Inc. * All rights reserved. @@ -49783,7 +49700,7 @@ var BeforeInputEventPlugin = { }; module.exports = BeforeInputEventPlugin; -},{"./EventPropagators":367,"./FallbackCompositionState":368,"./SyntheticCompositionEvent":432,"./SyntheticInputEvent":436,"fbjs/lib/ExecutionEnvironment":160}],352:[function(require,module,exports){ +},{"./EventPropagators":362,"./FallbackCompositionState":363,"./SyntheticCompositionEvent":427,"./SyntheticInputEvent":431,"fbjs/lib/ExecutionEnvironment":155}],347:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -49931,7 +49848,7 @@ var CSSProperty = { }; module.exports = CSSProperty; -},{}],353:[function(require,module,exports){ +},{}],348:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -50140,7 +50057,7 @@ var CSSPropertyOperations = { }; module.exports = CSSPropertyOperations; -},{"./CSSProperty":352,"./ReactInstrumentation":410,"./dangerousStyleValue":449,"fbjs/lib/ExecutionEnvironment":160,"fbjs/lib/camelizeStyleName":162,"fbjs/lib/hyphenateStyleName":173,"fbjs/lib/memoizeStringOnly":177,"fbjs/lib/warning":181}],354:[function(require,module,exports){ +},{"./CSSProperty":347,"./ReactInstrumentation":405,"./dangerousStyleValue":444,"fbjs/lib/ExecutionEnvironment":155,"fbjs/lib/camelizeStyleName":157,"fbjs/lib/hyphenateStyleName":168,"fbjs/lib/memoizeStringOnly":172,"fbjs/lib/warning":176}],349:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -50259,7 +50176,7 @@ var CallbackQueue = function () { }(); module.exports = PooledClass.addPoolingTo(CallbackQueue); -},{"./PooledClass":372,"./reactProdInvariant":467,"fbjs/lib/invariant":174}],355:[function(require,module,exports){ +},{"./PooledClass":367,"./reactProdInvariant":462,"fbjs/lib/invariant":169}],350:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -50605,7 +50522,7 @@ var ChangeEventPlugin = { }; module.exports = ChangeEventPlugin; -},{"./EventPluginHub":364,"./EventPropagators":367,"./ReactDOMComponentTree":381,"./ReactUpdates":425,"./SyntheticEvent":434,"./getEventTarget":457,"./isEventSupported":464,"./isTextInputElement":465,"fbjs/lib/ExecutionEnvironment":160}],356:[function(require,module,exports){ +},{"./EventPluginHub":359,"./EventPropagators":362,"./ReactDOMComponentTree":376,"./ReactUpdates":420,"./SyntheticEvent":429,"./getEventTarget":452,"./isEventSupported":459,"./isTextInputElement":460,"fbjs/lib/ExecutionEnvironment":155}],351:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -50830,7 +50747,7 @@ var DOMChildrenOperations = { }; module.exports = DOMChildrenOperations; -},{"./DOMLazyTree":357,"./Danger":361,"./ReactDOMComponentTree":381,"./ReactInstrumentation":410,"./createMicrosoftUnsafeLocalFunction":448,"./setInnerHTML":469,"./setTextContent":470}],357:[function(require,module,exports){ +},{"./DOMLazyTree":352,"./Danger":356,"./ReactDOMComponentTree":376,"./ReactInstrumentation":405,"./createMicrosoftUnsafeLocalFunction":443,"./setInnerHTML":464,"./setTextContent":465}],352:[function(require,module,exports){ /** * Copyright 2015-present, Facebook, Inc. * All rights reserved. @@ -50948,7 +50865,7 @@ DOMLazyTree.queueHTML = queueHTML; DOMLazyTree.queueText = queueText; module.exports = DOMLazyTree; -},{"./DOMNamespaces":358,"./createMicrosoftUnsafeLocalFunction":448,"./setInnerHTML":469,"./setTextContent":470}],358:[function(require,module,exports){ +},{"./DOMNamespaces":353,"./createMicrosoftUnsafeLocalFunction":443,"./setInnerHTML":464,"./setTextContent":465}],353:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -50968,7 +50885,7 @@ var DOMNamespaces = { }; module.exports = DOMNamespaces; -},{}],359:[function(require,module,exports){ +},{}],354:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -51178,7 +51095,7 @@ var DOMProperty = { }; module.exports = DOMProperty; -},{"./reactProdInvariant":467,"fbjs/lib/invariant":174}],360:[function(require,module,exports){ +},{"./reactProdInvariant":462,"fbjs/lib/invariant":169}],355:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -51415,7 +51332,7 @@ var DOMPropertyOperations = { }; module.exports = DOMPropertyOperations; -},{"./DOMProperty":359,"./ReactDOMComponentTree":381,"./ReactInstrumentation":410,"./quoteAttributeValueForBrowser":466,"fbjs/lib/warning":181}],361:[function(require,module,exports){ +},{"./DOMProperty":354,"./ReactDOMComponentTree":376,"./ReactInstrumentation":405,"./quoteAttributeValueForBrowser":461,"fbjs/lib/warning":176}],356:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -51463,7 +51380,7 @@ var Danger = { }; module.exports = Danger; -},{"./DOMLazyTree":357,"./reactProdInvariant":467,"fbjs/lib/ExecutionEnvironment":160,"fbjs/lib/createNodesFromMarkup":165,"fbjs/lib/emptyFunction":166,"fbjs/lib/invariant":174}],362:[function(require,module,exports){ +},{"./DOMLazyTree":352,"./reactProdInvariant":462,"fbjs/lib/ExecutionEnvironment":155,"fbjs/lib/createNodesFromMarkup":160,"fbjs/lib/emptyFunction":161,"fbjs/lib/invariant":169}],357:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -51489,7 +51406,7 @@ module.exports = Danger; var DefaultEventPluginOrder = ['ResponderEventPlugin', 'SimpleEventPlugin', 'TapEventPlugin', 'EnterLeaveEventPlugin', 'ChangeEventPlugin', 'SelectEventPlugin', 'BeforeInputEventPlugin']; module.exports = DefaultEventPluginOrder; -},{}],363:[function(require,module,exports){ +},{}],358:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -51589,7 +51506,7 @@ var EnterLeaveEventPlugin = { }; module.exports = EnterLeaveEventPlugin; -},{"./EventPropagators":367,"./ReactDOMComponentTree":381,"./SyntheticMouseEvent":438}],364:[function(require,module,exports){ +},{"./EventPropagators":362,"./ReactDOMComponentTree":376,"./SyntheticMouseEvent":433}],359:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -51867,7 +51784,7 @@ var EventPluginHub = { }; module.exports = EventPluginHub; -},{"./EventPluginRegistry":365,"./EventPluginUtils":366,"./ReactErrorUtils":401,"./accumulateInto":445,"./forEachAccumulated":453,"./reactProdInvariant":467,"fbjs/lib/invariant":174}],365:[function(require,module,exports){ +},{"./EventPluginRegistry":360,"./EventPluginUtils":361,"./ReactErrorUtils":396,"./accumulateInto":440,"./forEachAccumulated":448,"./reactProdInvariant":462,"fbjs/lib/invariant":169}],360:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -52122,7 +52039,7 @@ var EventPluginRegistry = { }; module.exports = EventPluginRegistry; -},{"./reactProdInvariant":467,"fbjs/lib/invariant":174}],366:[function(require,module,exports){ +},{"./reactProdInvariant":462,"fbjs/lib/invariant":169}],361:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -52348,7 +52265,7 @@ var EventPluginUtils = { }; module.exports = EventPluginUtils; -},{"./ReactErrorUtils":401,"./reactProdInvariant":467,"fbjs/lib/invariant":174,"fbjs/lib/warning":181}],367:[function(require,module,exports){ +},{"./ReactErrorUtils":396,"./reactProdInvariant":462,"fbjs/lib/invariant":169,"fbjs/lib/warning":176}],362:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -52482,7 +52399,7 @@ var EventPropagators = { }; module.exports = EventPropagators; -},{"./EventPluginHub":364,"./EventPluginUtils":366,"./accumulateInto":445,"./forEachAccumulated":453,"fbjs/lib/warning":181}],368:[function(require,module,exports){ +},{"./EventPluginHub":359,"./EventPluginUtils":361,"./accumulateInto":440,"./forEachAccumulated":448,"fbjs/lib/warning":176}],363:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -52577,7 +52494,7 @@ _assign(FallbackCompositionState.prototype, { PooledClass.addPoolingTo(FallbackCompositionState); module.exports = FallbackCompositionState; -},{"./PooledClass":372,"./getTextContentAccessor":461,"object-assign":229}],369:[function(require,module,exports){ +},{"./PooledClass":367,"./getTextContentAccessor":456,"object-assign":224}],364:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -52813,7 +52730,7 @@ var HTMLDOMPropertyConfig = { }; module.exports = HTMLDOMPropertyConfig; -},{"./DOMProperty":359}],370:[function(require,module,exports){ +},{"./DOMProperty":354}],365:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -52872,7 +52789,7 @@ var KeyEscapeUtils = { }; module.exports = KeyEscapeUtils; -},{}],371:[function(require,module,exports){ +},{}],366:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -53010,7 +52927,7 @@ var LinkedValueUtils = { }; module.exports = LinkedValueUtils; -},{"./ReactPropTypesSecret":418,"./reactProdInvariant":467,"fbjs/lib/invariant":174,"fbjs/lib/warning":181,"prop-types/factory":241,"react/lib/React":514}],372:[function(require,module,exports){ +},{"./ReactPropTypesSecret":413,"./reactProdInvariant":462,"fbjs/lib/invariant":169,"fbjs/lib/warning":176,"prop-types/factory":236,"react/lib/React":509}],367:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -53122,7 +53039,7 @@ var PooledClass = { }; module.exports = PooledClass; -},{"./reactProdInvariant":467,"fbjs/lib/invariant":174}],373:[function(require,module,exports){ +},{"./reactProdInvariant":462,"fbjs/lib/invariant":169}],368:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -53450,7 +53367,7 @@ var ReactBrowserEventEmitter = _assign({}, ReactEventEmitterMixin, { }); module.exports = ReactBrowserEventEmitter; -},{"./EventPluginRegistry":365,"./ReactEventEmitterMixin":402,"./ViewportMetrics":444,"./getVendorPrefixedEventName":462,"./isEventSupported":464,"object-assign":229}],374:[function(require,module,exports){ +},{"./EventPluginRegistry":360,"./ReactEventEmitterMixin":397,"./ViewportMetrics":439,"./getVendorPrefixedEventName":457,"./isEventSupported":459,"object-assign":224}],369:[function(require,module,exports){ (function (process){ /** * Copyright 2014-present, Facebook, Inc. @@ -53607,7 +53524,7 @@ var ReactChildReconciler = { module.exports = ReactChildReconciler; }).call(this,require('_process')) -},{"./KeyEscapeUtils":370,"./ReactReconciler":420,"./instantiateReactComponent":463,"./shouldUpdateReactComponent":471,"./traverseAllChildren":472,"_process":239,"fbjs/lib/warning":181,"react/lib/ReactComponentTreeHook":518}],375:[function(require,module,exports){ +},{"./KeyEscapeUtils":365,"./ReactReconciler":415,"./instantiateReactComponent":458,"./shouldUpdateReactComponent":466,"./traverseAllChildren":467,"_process":234,"fbjs/lib/warning":176,"react/lib/ReactComponentTreeHook":513}],370:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -53637,7 +53554,7 @@ var ReactComponentBrowserEnvironment = { }; module.exports = ReactComponentBrowserEnvironment; -},{"./DOMChildrenOperations":356,"./ReactDOMIDOperations":385}],376:[function(require,module,exports){ +},{"./DOMChildrenOperations":351,"./ReactDOMIDOperations":380}],371:[function(require,module,exports){ /** * Copyright 2014-present, Facebook, Inc. * All rights reserved. @@ -53683,7 +53600,7 @@ var ReactComponentEnvironment = { }; module.exports = ReactComponentEnvironment; -},{"./reactProdInvariant":467,"fbjs/lib/invariant":174}],377:[function(require,module,exports){ +},{"./reactProdInvariant":462,"fbjs/lib/invariant":169}],372:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -54585,7 +54502,7 @@ var ReactCompositeComponent = { }; module.exports = ReactCompositeComponent; -},{"./ReactComponentEnvironment":376,"./ReactErrorUtils":401,"./ReactInstanceMap":409,"./ReactInstrumentation":410,"./ReactNodeTypes":415,"./ReactReconciler":420,"./checkReactTypeSpec":447,"./reactProdInvariant":467,"./shouldUpdateReactComponent":471,"fbjs/lib/emptyObject":167,"fbjs/lib/invariant":174,"fbjs/lib/shallowEqual":180,"fbjs/lib/warning":181,"object-assign":229,"react/lib/React":514,"react/lib/ReactCurrentOwner":519}],378:[function(require,module,exports){ +},{"./ReactComponentEnvironment":371,"./ReactErrorUtils":396,"./ReactInstanceMap":404,"./ReactInstrumentation":405,"./ReactNodeTypes":410,"./ReactReconciler":415,"./checkReactTypeSpec":442,"./reactProdInvariant":462,"./shouldUpdateReactComponent":466,"fbjs/lib/emptyObject":162,"fbjs/lib/invariant":169,"fbjs/lib/shallowEqual":175,"fbjs/lib/warning":176,"object-assign":224,"react/lib/React":509,"react/lib/ReactCurrentOwner":514}],373:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -54696,7 +54613,7 @@ if ("development" !== 'production') { } module.exports = ReactDOM; -},{"./ReactDOMComponentTree":381,"./ReactDOMInvalidARIAHook":387,"./ReactDOMNullInputValuePropHook":388,"./ReactDOMUnknownPropertyHook":395,"./ReactDefaultInjection":398,"./ReactInstrumentation":410,"./ReactMount":413,"./ReactReconciler":420,"./ReactUpdates":425,"./ReactVersion":426,"./findDOMNode":451,"./getHostComponentFromComposite":458,"./renderSubtreeIntoContainer":468,"fbjs/lib/ExecutionEnvironment":160,"fbjs/lib/warning":181}],379:[function(require,module,exports){ +},{"./ReactDOMComponentTree":376,"./ReactDOMInvalidARIAHook":382,"./ReactDOMNullInputValuePropHook":383,"./ReactDOMUnknownPropertyHook":390,"./ReactDefaultInjection":393,"./ReactInstrumentation":405,"./ReactMount":408,"./ReactReconciler":415,"./ReactUpdates":420,"./ReactVersion":421,"./findDOMNode":446,"./getHostComponentFromComposite":453,"./renderSubtreeIntoContainer":463,"fbjs/lib/ExecutionEnvironment":155,"fbjs/lib/warning":176}],374:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -55697,7 +55614,7 @@ ReactDOMComponent.Mixin = { _assign(ReactDOMComponent.prototype, ReactDOMComponent.Mixin, ReactMultiChild.Mixin); module.exports = ReactDOMComponent; -},{"./AutoFocusUtils":350,"./CSSPropertyOperations":353,"./DOMLazyTree":357,"./DOMNamespaces":358,"./DOMProperty":359,"./DOMPropertyOperations":360,"./EventPluginHub":364,"./EventPluginRegistry":365,"./ReactBrowserEventEmitter":373,"./ReactDOMComponentFlags":380,"./ReactDOMComponentTree":381,"./ReactDOMInput":386,"./ReactDOMOption":389,"./ReactDOMSelect":390,"./ReactDOMTextarea":393,"./ReactInstrumentation":410,"./ReactMultiChild":414,"./ReactServerRenderingTransaction":422,"./escapeTextContentForBrowser":450,"./isEventSupported":464,"./reactProdInvariant":467,"./validateDOMNesting":473,"fbjs/lib/emptyFunction":166,"fbjs/lib/invariant":174,"fbjs/lib/shallowEqual":180,"fbjs/lib/warning":181,"object-assign":229}],380:[function(require,module,exports){ +},{"./AutoFocusUtils":345,"./CSSPropertyOperations":348,"./DOMLazyTree":352,"./DOMNamespaces":353,"./DOMProperty":354,"./DOMPropertyOperations":355,"./EventPluginHub":359,"./EventPluginRegistry":360,"./ReactBrowserEventEmitter":368,"./ReactDOMComponentFlags":375,"./ReactDOMComponentTree":376,"./ReactDOMInput":381,"./ReactDOMOption":384,"./ReactDOMSelect":385,"./ReactDOMTextarea":388,"./ReactInstrumentation":405,"./ReactMultiChild":409,"./ReactServerRenderingTransaction":417,"./escapeTextContentForBrowser":445,"./isEventSupported":459,"./reactProdInvariant":462,"./validateDOMNesting":468,"fbjs/lib/emptyFunction":161,"fbjs/lib/invariant":169,"fbjs/lib/shallowEqual":175,"fbjs/lib/warning":176,"object-assign":224}],375:[function(require,module,exports){ /** * Copyright 2015-present, Facebook, Inc. * All rights reserved. @@ -55715,7 +55632,7 @@ var ReactDOMComponentFlags = { }; module.exports = ReactDOMComponentFlags; -},{}],381:[function(require,module,exports){ +},{}],376:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -55910,7 +55827,7 @@ var ReactDOMComponentTree = { }; module.exports = ReactDOMComponentTree; -},{"./DOMProperty":359,"./ReactDOMComponentFlags":380,"./reactProdInvariant":467,"fbjs/lib/invariant":174}],382:[function(require,module,exports){ +},{"./DOMProperty":354,"./ReactDOMComponentFlags":375,"./reactProdInvariant":462,"fbjs/lib/invariant":169}],377:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -55943,7 +55860,7 @@ function ReactDOMContainerInfo(topLevelWrapper, node) { } module.exports = ReactDOMContainerInfo; -},{"./validateDOMNesting":473}],383:[function(require,module,exports){ +},{"./validateDOMNesting":468}],378:[function(require,module,exports){ /** * Copyright 2014-present, Facebook, Inc. * All rights reserved. @@ -56003,7 +55920,7 @@ _assign(ReactDOMEmptyComponent.prototype, { }); module.exports = ReactDOMEmptyComponent; -},{"./DOMLazyTree":357,"./ReactDOMComponentTree":381,"object-assign":229}],384:[function(require,module,exports){ +},{"./DOMLazyTree":352,"./ReactDOMComponentTree":376,"object-assign":224}],379:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -56022,7 +55939,7 @@ var ReactDOMFeatureFlags = { }; module.exports = ReactDOMFeatureFlags; -},{}],385:[function(require,module,exports){ +},{}],380:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -56056,7 +55973,7 @@ var ReactDOMIDOperations = { }; module.exports = ReactDOMIDOperations; -},{"./DOMChildrenOperations":356,"./ReactDOMComponentTree":381}],386:[function(require,module,exports){ +},{"./DOMChildrenOperations":351,"./ReactDOMComponentTree":376}],381:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -56341,7 +56258,7 @@ function _handleChange(event) { } module.exports = ReactDOMInput; -},{"./DOMPropertyOperations":360,"./LinkedValueUtils":371,"./ReactDOMComponentTree":381,"./ReactUpdates":425,"./reactProdInvariant":467,"fbjs/lib/invariant":174,"fbjs/lib/warning":181,"object-assign":229}],387:[function(require,module,exports){ +},{"./DOMPropertyOperations":355,"./LinkedValueUtils":366,"./ReactDOMComponentTree":376,"./ReactUpdates":420,"./reactProdInvariant":462,"fbjs/lib/invariant":169,"fbjs/lib/warning":176,"object-assign":224}],382:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -56434,7 +56351,7 @@ var ReactDOMInvalidARIAHook = { }; module.exports = ReactDOMInvalidARIAHook; -},{"./DOMProperty":359,"fbjs/lib/warning":181,"react/lib/ReactComponentTreeHook":518}],388:[function(require,module,exports){ +},{"./DOMProperty":354,"fbjs/lib/warning":176,"react/lib/ReactComponentTreeHook":513}],383:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -56477,7 +56394,7 @@ var ReactDOMNullInputValuePropHook = { }; module.exports = ReactDOMNullInputValuePropHook; -},{"fbjs/lib/warning":181,"react/lib/ReactComponentTreeHook":518}],389:[function(require,module,exports){ +},{"fbjs/lib/warning":176,"react/lib/ReactComponentTreeHook":513}],384:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -56600,7 +56517,7 @@ var ReactDOMOption = { }; module.exports = ReactDOMOption; -},{"./ReactDOMComponentTree":381,"./ReactDOMSelect":390,"fbjs/lib/warning":181,"object-assign":229,"react/lib/React":514}],390:[function(require,module,exports){ +},{"./ReactDOMComponentTree":376,"./ReactDOMSelect":385,"fbjs/lib/warning":176,"object-assign":224,"react/lib/React":509}],385:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -56800,7 +56717,7 @@ function _handleChange(event) { } module.exports = ReactDOMSelect; -},{"./LinkedValueUtils":371,"./ReactDOMComponentTree":381,"./ReactUpdates":425,"fbjs/lib/warning":181,"object-assign":229}],391:[function(require,module,exports){ +},{"./LinkedValueUtils":366,"./ReactDOMComponentTree":376,"./ReactUpdates":420,"fbjs/lib/warning":176,"object-assign":224}],386:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -57012,7 +56929,7 @@ var ReactDOMSelection = { }; module.exports = ReactDOMSelection; -},{"./getNodeForCharacterOffset":460,"./getTextContentAccessor":461,"fbjs/lib/ExecutionEnvironment":160}],392:[function(require,module,exports){ +},{"./getNodeForCharacterOffset":455,"./getTextContentAccessor":456,"fbjs/lib/ExecutionEnvironment":155}],387:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -57176,7 +57093,7 @@ _assign(ReactDOMTextComponent.prototype, { }); module.exports = ReactDOMTextComponent; -},{"./DOMChildrenOperations":356,"./DOMLazyTree":357,"./ReactDOMComponentTree":381,"./escapeTextContentForBrowser":450,"./reactProdInvariant":467,"./validateDOMNesting":473,"fbjs/lib/invariant":174,"object-assign":229}],393:[function(require,module,exports){ +},{"./DOMChildrenOperations":351,"./DOMLazyTree":352,"./ReactDOMComponentTree":376,"./escapeTextContentForBrowser":445,"./reactProdInvariant":462,"./validateDOMNesting":468,"fbjs/lib/invariant":169,"object-assign":224}],388:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -57336,7 +57253,7 @@ function _handleChange(event) { } module.exports = ReactDOMTextarea; -},{"./LinkedValueUtils":371,"./ReactDOMComponentTree":381,"./ReactUpdates":425,"./reactProdInvariant":467,"fbjs/lib/invariant":174,"fbjs/lib/warning":181,"object-assign":229}],394:[function(require,module,exports){ +},{"./LinkedValueUtils":366,"./ReactDOMComponentTree":376,"./ReactUpdates":420,"./reactProdInvariant":462,"fbjs/lib/invariant":169,"fbjs/lib/warning":176,"object-assign":224}],389:[function(require,module,exports){ /** * Copyright 2015-present, Facebook, Inc. * All rights reserved. @@ -57472,7 +57389,7 @@ module.exports = { traverseTwoPhase: traverseTwoPhase, traverseEnterLeave: traverseEnterLeave }; -},{"./reactProdInvariant":467,"fbjs/lib/invariant":174}],395:[function(require,module,exports){ +},{"./reactProdInvariant":462,"fbjs/lib/invariant":169}],390:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -57584,7 +57501,7 @@ var ReactDOMUnknownPropertyHook = { }; module.exports = ReactDOMUnknownPropertyHook; -},{"./DOMProperty":359,"./EventPluginRegistry":365,"fbjs/lib/warning":181,"react/lib/ReactComponentTreeHook":518}],396:[function(require,module,exports){ +},{"./DOMProperty":354,"./EventPluginRegistry":360,"fbjs/lib/warning":176,"react/lib/ReactComponentTreeHook":513}],391:[function(require,module,exports){ /** * Copyright 2016-present, Facebook, Inc. * All rights reserved. @@ -57943,7 +57860,7 @@ if (/[?&]react_perf\b/.test(url)) { } module.exports = ReactDebugTool; -},{"./ReactHostOperationHistoryHook":406,"./ReactInvalidSetStateWarningHook":411,"fbjs/lib/ExecutionEnvironment":160,"fbjs/lib/performanceNow":179,"fbjs/lib/warning":181,"react/lib/ReactComponentTreeHook":518}],397:[function(require,module,exports){ +},{"./ReactHostOperationHistoryHook":401,"./ReactInvalidSetStateWarningHook":406,"fbjs/lib/ExecutionEnvironment":155,"fbjs/lib/performanceNow":174,"fbjs/lib/warning":176,"react/lib/ReactComponentTreeHook":513}],392:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -58011,7 +57928,7 @@ var ReactDefaultBatchingStrategy = { }; module.exports = ReactDefaultBatchingStrategy; -},{"./ReactUpdates":425,"./Transaction":443,"fbjs/lib/emptyFunction":166,"object-assign":229}],398:[function(require,module,exports){ +},{"./ReactUpdates":420,"./Transaction":438,"fbjs/lib/emptyFunction":161,"object-assign":224}],393:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -58097,7 +58014,7 @@ function inject() { module.exports = { inject: inject }; -},{"./ARIADOMPropertyConfig":349,"./BeforeInputEventPlugin":351,"./ChangeEventPlugin":355,"./DefaultEventPluginOrder":362,"./EnterLeaveEventPlugin":363,"./HTMLDOMPropertyConfig":369,"./ReactComponentBrowserEnvironment":375,"./ReactDOMComponent":379,"./ReactDOMComponentTree":381,"./ReactDOMEmptyComponent":383,"./ReactDOMTextComponent":392,"./ReactDOMTreeTraversal":394,"./ReactDefaultBatchingStrategy":397,"./ReactEventListener":403,"./ReactInjection":407,"./ReactReconcileTransaction":419,"./SVGDOMPropertyConfig":427,"./SelectEventPlugin":428,"./SimpleEventPlugin":429}],399:[function(require,module,exports){ +},{"./ARIADOMPropertyConfig":344,"./BeforeInputEventPlugin":346,"./ChangeEventPlugin":350,"./DefaultEventPluginOrder":357,"./EnterLeaveEventPlugin":358,"./HTMLDOMPropertyConfig":364,"./ReactComponentBrowserEnvironment":370,"./ReactDOMComponent":374,"./ReactDOMComponentTree":376,"./ReactDOMEmptyComponent":378,"./ReactDOMTextComponent":387,"./ReactDOMTreeTraversal":389,"./ReactDefaultBatchingStrategy":392,"./ReactEventListener":398,"./ReactInjection":402,"./ReactReconcileTransaction":414,"./SVGDOMPropertyConfig":422,"./SelectEventPlugin":423,"./SimpleEventPlugin":424}],394:[function(require,module,exports){ /** * Copyright 2014-present, Facebook, Inc. * All rights reserved. @@ -58117,7 +58034,7 @@ module.exports = { var REACT_ELEMENT_TYPE = typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element') || 0xeac7; module.exports = REACT_ELEMENT_TYPE; -},{}],400:[function(require,module,exports){ +},{}],395:[function(require,module,exports){ /** * Copyright 2014-present, Facebook, Inc. * All rights reserved. @@ -58147,7 +58064,7 @@ var ReactEmptyComponent = { ReactEmptyComponent.injection = ReactEmptyComponentInjection; module.exports = ReactEmptyComponent; -},{}],401:[function(require,module,exports){ +},{}],396:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -58223,7 +58140,7 @@ if ("development" !== 'production') { } module.exports = ReactErrorUtils; -},{}],402:[function(require,module,exports){ +},{}],397:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -58256,7 +58173,7 @@ var ReactEventEmitterMixin = { }; module.exports = ReactEventEmitterMixin; -},{"./EventPluginHub":364}],403:[function(require,module,exports){ +},{"./EventPluginHub":359}],398:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -58411,7 +58328,7 @@ var ReactEventListener = { }; module.exports = ReactEventListener; -},{"./PooledClass":372,"./ReactDOMComponentTree":381,"./ReactUpdates":425,"./getEventTarget":457,"fbjs/lib/EventListener":159,"fbjs/lib/ExecutionEnvironment":160,"fbjs/lib/getUnboundedScrollPosition":171,"object-assign":229}],404:[function(require,module,exports){ +},{"./PooledClass":367,"./ReactDOMComponentTree":376,"./ReactUpdates":420,"./getEventTarget":452,"fbjs/lib/EventListener":154,"fbjs/lib/ExecutionEnvironment":155,"fbjs/lib/getUnboundedScrollPosition":166,"object-assign":224}],399:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -58433,7 +58350,7 @@ var ReactFeatureFlags = { }; module.exports = ReactFeatureFlags; -},{}],405:[function(require,module,exports){ +},{}],400:[function(require,module,exports){ /** * Copyright 2014-present, Facebook, Inc. * All rights reserved. @@ -58501,7 +58418,7 @@ var ReactHostComponent = { }; module.exports = ReactHostComponent; -},{"./reactProdInvariant":467,"fbjs/lib/invariant":174}],406:[function(require,module,exports){ +},{"./reactProdInvariant":462,"fbjs/lib/invariant":169}],401:[function(require,module,exports){ /** * Copyright 2016-present, Facebook, Inc. * All rights reserved. @@ -58535,7 +58452,7 @@ var ReactHostOperationHistoryHook = { }; module.exports = ReactHostOperationHistoryHook; -},{}],407:[function(require,module,exports){ +},{}],402:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -58569,7 +58486,7 @@ var ReactInjection = { }; module.exports = ReactInjection; -},{"./DOMProperty":359,"./EventPluginHub":364,"./EventPluginUtils":366,"./ReactBrowserEventEmitter":373,"./ReactComponentEnvironment":376,"./ReactEmptyComponent":400,"./ReactHostComponent":405,"./ReactUpdates":425}],408:[function(require,module,exports){ +},{"./DOMProperty":354,"./EventPluginHub":359,"./EventPluginUtils":361,"./ReactBrowserEventEmitter":368,"./ReactComponentEnvironment":371,"./ReactEmptyComponent":395,"./ReactHostComponent":400,"./ReactUpdates":420}],403:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -58693,7 +58610,7 @@ var ReactInputSelection = { }; module.exports = ReactInputSelection; -},{"./ReactDOMSelection":391,"fbjs/lib/containsNode":163,"fbjs/lib/focusNode":168,"fbjs/lib/getActiveElement":169}],409:[function(require,module,exports){ +},{"./ReactDOMSelection":386,"fbjs/lib/containsNode":158,"fbjs/lib/focusNode":163,"fbjs/lib/getActiveElement":164}],404:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -58741,7 +58658,7 @@ var ReactInstanceMap = { }; module.exports = ReactInstanceMap; -},{}],410:[function(require,module,exports){ +},{}],405:[function(require,module,exports){ /** * Copyright 2016-present, Facebook, Inc. * All rights reserved. @@ -58765,7 +58682,7 @@ if ("development" !== 'production') { } module.exports = { debugTool: debugTool }; -},{"./ReactDebugTool":396}],411:[function(require,module,exports){ +},{"./ReactDebugTool":391}],406:[function(require,module,exports){ /** * Copyright 2016-present, Facebook, Inc. * All rights reserved. @@ -58802,7 +58719,7 @@ var ReactInvalidSetStateWarningHook = { }; module.exports = ReactInvalidSetStateWarningHook; -},{"fbjs/lib/warning":181}],412:[function(require,module,exports){ +},{"fbjs/lib/warning":176}],407:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -58852,7 +58769,7 @@ var ReactMarkupChecksum = { }; module.exports = ReactMarkupChecksum; -},{"./adler32":446}],413:[function(require,module,exports){ +},{"./adler32":441}],408:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -59390,7 +59307,7 @@ var ReactMount = { }; module.exports = ReactMount; -},{"./DOMLazyTree":357,"./DOMProperty":359,"./ReactBrowserEventEmitter":373,"./ReactDOMComponentTree":381,"./ReactDOMContainerInfo":382,"./ReactDOMFeatureFlags":384,"./ReactFeatureFlags":404,"./ReactInstanceMap":409,"./ReactInstrumentation":410,"./ReactMarkupChecksum":412,"./ReactReconciler":420,"./ReactUpdateQueue":424,"./ReactUpdates":425,"./instantiateReactComponent":463,"./reactProdInvariant":467,"./setInnerHTML":469,"./shouldUpdateReactComponent":471,"fbjs/lib/emptyObject":167,"fbjs/lib/invariant":174,"fbjs/lib/warning":181,"react/lib/React":514,"react/lib/ReactCurrentOwner":519}],414:[function(require,module,exports){ +},{"./DOMLazyTree":352,"./DOMProperty":354,"./ReactBrowserEventEmitter":368,"./ReactDOMComponentTree":376,"./ReactDOMContainerInfo":377,"./ReactDOMFeatureFlags":379,"./ReactFeatureFlags":399,"./ReactInstanceMap":404,"./ReactInstrumentation":405,"./ReactMarkupChecksum":407,"./ReactReconciler":415,"./ReactUpdateQueue":419,"./ReactUpdates":420,"./instantiateReactComponent":458,"./reactProdInvariant":462,"./setInnerHTML":464,"./shouldUpdateReactComponent":466,"fbjs/lib/emptyObject":162,"fbjs/lib/invariant":169,"fbjs/lib/warning":176,"react/lib/React":509,"react/lib/ReactCurrentOwner":514}],409:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -59840,7 +59757,7 @@ var ReactMultiChild = { }; module.exports = ReactMultiChild; -},{"./ReactChildReconciler":374,"./ReactComponentEnvironment":376,"./ReactInstanceMap":409,"./ReactInstrumentation":410,"./ReactReconciler":420,"./flattenChildren":452,"./reactProdInvariant":467,"fbjs/lib/emptyFunction":166,"fbjs/lib/invariant":174,"react/lib/ReactCurrentOwner":519}],415:[function(require,module,exports){ +},{"./ReactChildReconciler":369,"./ReactComponentEnvironment":371,"./ReactInstanceMap":404,"./ReactInstrumentation":405,"./ReactReconciler":415,"./flattenChildren":447,"./reactProdInvariant":462,"fbjs/lib/emptyFunction":161,"fbjs/lib/invariant":169,"react/lib/ReactCurrentOwner":514}],410:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -59880,7 +59797,7 @@ var ReactNodeTypes = { }; module.exports = ReactNodeTypes; -},{"./reactProdInvariant":467,"fbjs/lib/invariant":174,"react/lib/React":514}],416:[function(require,module,exports){ +},{"./reactProdInvariant":462,"fbjs/lib/invariant":169,"react/lib/React":509}],411:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -59974,7 +59891,7 @@ var ReactOwner = { }; module.exports = ReactOwner; -},{"./reactProdInvariant":467,"fbjs/lib/invariant":174}],417:[function(require,module,exports){ +},{"./reactProdInvariant":462,"fbjs/lib/invariant":169}],412:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -59999,7 +59916,7 @@ if ("development" !== 'production') { } module.exports = ReactPropTypeLocationNames; -},{}],418:[function(require,module,exports){ +},{}],413:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -60016,7 +59933,7 @@ module.exports = ReactPropTypeLocationNames; var ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; module.exports = ReactPropTypesSecret; -},{}],419:[function(require,module,exports){ +},{}],414:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -60194,7 +60111,7 @@ _assign(ReactReconcileTransaction.prototype, Transaction, Mixin); PooledClass.addPoolingTo(ReactReconcileTransaction); module.exports = ReactReconcileTransaction; -},{"./CallbackQueue":354,"./PooledClass":372,"./ReactBrowserEventEmitter":373,"./ReactInputSelection":408,"./ReactInstrumentation":410,"./ReactUpdateQueue":424,"./Transaction":443,"object-assign":229}],420:[function(require,module,exports){ +},{"./CallbackQueue":349,"./PooledClass":367,"./ReactBrowserEventEmitter":368,"./ReactInputSelection":403,"./ReactInstrumentation":405,"./ReactUpdateQueue":419,"./Transaction":438,"object-assign":224}],415:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -60362,7 +60279,7 @@ var ReactReconciler = { }; module.exports = ReactReconciler; -},{"./ReactInstrumentation":410,"./ReactRef":421,"fbjs/lib/warning":181}],421:[function(require,module,exports){ +},{"./ReactInstrumentation":405,"./ReactRef":416,"fbjs/lib/warning":176}],416:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -60451,7 +60368,7 @@ ReactRef.detachRefs = function (instance, element) { }; module.exports = ReactRef; -},{"./ReactOwner":416}],422:[function(require,module,exports){ +},{"./ReactOwner":411}],417:[function(require,module,exports){ /** * Copyright 2014-present, Facebook, Inc. * All rights reserved. @@ -60541,7 +60458,7 @@ _assign(ReactServerRenderingTransaction.prototype, Transaction, Mixin); PooledClass.addPoolingTo(ReactServerRenderingTransaction); module.exports = ReactServerRenderingTransaction; -},{"./PooledClass":372,"./ReactInstrumentation":410,"./ReactServerUpdateQueue":423,"./Transaction":443,"object-assign":229}],423:[function(require,module,exports){ +},{"./PooledClass":367,"./ReactInstrumentation":405,"./ReactServerUpdateQueue":418,"./Transaction":438,"object-assign":224}],418:[function(require,module,exports){ /** * Copyright 2015-present, Facebook, Inc. * All rights reserved. @@ -60680,7 +60597,7 @@ var ReactServerUpdateQueue = function () { }(); module.exports = ReactServerUpdateQueue; -},{"./ReactUpdateQueue":424,"fbjs/lib/warning":181}],424:[function(require,module,exports){ +},{"./ReactUpdateQueue":419,"fbjs/lib/warning":176}],419:[function(require,module,exports){ /** * Copyright 2015-present, Facebook, Inc. * All rights reserved. @@ -60916,7 +60833,7 @@ var ReactUpdateQueue = { }; module.exports = ReactUpdateQueue; -},{"./ReactInstanceMap":409,"./ReactInstrumentation":410,"./ReactUpdates":425,"./reactProdInvariant":467,"fbjs/lib/invariant":174,"fbjs/lib/warning":181,"react/lib/ReactCurrentOwner":519}],425:[function(require,module,exports){ +},{"./ReactInstanceMap":404,"./ReactInstrumentation":405,"./ReactUpdates":420,"./reactProdInvariant":462,"fbjs/lib/invariant":169,"fbjs/lib/warning":176,"react/lib/ReactCurrentOwner":514}],420:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -61167,7 +61084,7 @@ var ReactUpdates = { }; module.exports = ReactUpdates; -},{"./CallbackQueue":354,"./PooledClass":372,"./ReactFeatureFlags":404,"./ReactReconciler":420,"./Transaction":443,"./reactProdInvariant":467,"fbjs/lib/invariant":174,"object-assign":229}],426:[function(require,module,exports){ +},{"./CallbackQueue":349,"./PooledClass":367,"./ReactFeatureFlags":399,"./ReactReconciler":415,"./Transaction":438,"./reactProdInvariant":462,"fbjs/lib/invariant":169,"object-assign":224}],421:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -61181,7 +61098,7 @@ module.exports = ReactUpdates; 'use strict'; module.exports = '15.5.4'; -},{}],427:[function(require,module,exports){ +},{}],422:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -61483,7 +61400,7 @@ Object.keys(ATTRS).forEach(function (key) { }); module.exports = SVGDOMPropertyConfig; -},{}],428:[function(require,module,exports){ +},{}],423:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -61674,7 +61591,7 @@ var SelectEventPlugin = { }; module.exports = SelectEventPlugin; -},{"./EventPropagators":367,"./ReactDOMComponentTree":381,"./ReactInputSelection":408,"./SyntheticEvent":434,"./isTextInputElement":465,"fbjs/lib/ExecutionEnvironment":160,"fbjs/lib/getActiveElement":169,"fbjs/lib/shallowEqual":180}],429:[function(require,module,exports){ +},{"./EventPropagators":362,"./ReactDOMComponentTree":376,"./ReactInputSelection":403,"./SyntheticEvent":429,"./isTextInputElement":460,"fbjs/lib/ExecutionEnvironment":155,"fbjs/lib/getActiveElement":164,"fbjs/lib/shallowEqual":175}],424:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -61902,7 +61819,7 @@ var SimpleEventPlugin = { }; module.exports = SimpleEventPlugin; -},{"./EventPropagators":367,"./ReactDOMComponentTree":381,"./SyntheticAnimationEvent":430,"./SyntheticClipboardEvent":431,"./SyntheticDragEvent":433,"./SyntheticEvent":434,"./SyntheticFocusEvent":435,"./SyntheticKeyboardEvent":437,"./SyntheticMouseEvent":438,"./SyntheticTouchEvent":439,"./SyntheticTransitionEvent":440,"./SyntheticUIEvent":441,"./SyntheticWheelEvent":442,"./getEventCharCode":454,"./reactProdInvariant":467,"fbjs/lib/EventListener":159,"fbjs/lib/emptyFunction":166,"fbjs/lib/invariant":174}],430:[function(require,module,exports){ +},{"./EventPropagators":362,"./ReactDOMComponentTree":376,"./SyntheticAnimationEvent":425,"./SyntheticClipboardEvent":426,"./SyntheticDragEvent":428,"./SyntheticEvent":429,"./SyntheticFocusEvent":430,"./SyntheticKeyboardEvent":432,"./SyntheticMouseEvent":433,"./SyntheticTouchEvent":434,"./SyntheticTransitionEvent":435,"./SyntheticUIEvent":436,"./SyntheticWheelEvent":437,"./getEventCharCode":449,"./reactProdInvariant":462,"fbjs/lib/EventListener":154,"fbjs/lib/emptyFunction":161,"fbjs/lib/invariant":169}],425:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -61941,7 +61858,7 @@ function SyntheticAnimationEvent(dispatchConfig, dispatchMarker, nativeEvent, na SyntheticEvent.augmentClass(SyntheticAnimationEvent, AnimationEventInterface); module.exports = SyntheticAnimationEvent; -},{"./SyntheticEvent":434}],431:[function(require,module,exports){ +},{"./SyntheticEvent":429}],426:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -61979,7 +61896,7 @@ function SyntheticClipboardEvent(dispatchConfig, dispatchMarker, nativeEvent, na SyntheticEvent.augmentClass(SyntheticClipboardEvent, ClipboardEventInterface); module.exports = SyntheticClipboardEvent; -},{"./SyntheticEvent":434}],432:[function(require,module,exports){ +},{"./SyntheticEvent":429}],427:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -62015,7 +61932,7 @@ function SyntheticCompositionEvent(dispatchConfig, dispatchMarker, nativeEvent, SyntheticEvent.augmentClass(SyntheticCompositionEvent, CompositionEventInterface); module.exports = SyntheticCompositionEvent; -},{"./SyntheticEvent":434}],433:[function(require,module,exports){ +},{"./SyntheticEvent":429}],428:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -62051,7 +61968,7 @@ function SyntheticDragEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeE SyntheticMouseEvent.augmentClass(SyntheticDragEvent, DragEventInterface); module.exports = SyntheticDragEvent; -},{"./SyntheticMouseEvent":438}],434:[function(require,module,exports){ +},{"./SyntheticMouseEvent":433}],429:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -62319,7 +62236,7 @@ function getPooledWarningPropertyDefinition(propName, getVal) { "development" !== 'production' ? warning(warningCondition, 'This synthetic event is reused for performance reasons. If you\'re seeing this, ' + 'you\'re %s `%s` on a released/nullified synthetic event. %s. ' + 'If you must keep the original synthetic event around, use event.persist(). ' + 'See https://fb.me/react-event-pooling for more information.', action, propName, result) : void 0; } } -},{"./PooledClass":372,"fbjs/lib/emptyFunction":166,"fbjs/lib/warning":181,"object-assign":229}],435:[function(require,module,exports){ +},{"./PooledClass":367,"fbjs/lib/emptyFunction":161,"fbjs/lib/warning":176,"object-assign":224}],430:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -62355,7 +62272,7 @@ function SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent, native SyntheticUIEvent.augmentClass(SyntheticFocusEvent, FocusEventInterface); module.exports = SyntheticFocusEvent; -},{"./SyntheticUIEvent":441}],436:[function(require,module,exports){ +},{"./SyntheticUIEvent":436}],431:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -62392,7 +62309,7 @@ function SyntheticInputEvent(dispatchConfig, dispatchMarker, nativeEvent, native SyntheticEvent.augmentClass(SyntheticInputEvent, InputEventInterface); module.exports = SyntheticInputEvent; -},{"./SyntheticEvent":434}],437:[function(require,module,exports){ +},{"./SyntheticEvent":429}],432:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -62476,7 +62393,7 @@ function SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nat SyntheticUIEvent.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface); module.exports = SyntheticKeyboardEvent; -},{"./SyntheticUIEvent":441,"./getEventCharCode":454,"./getEventKey":455,"./getEventModifierState":456}],438:[function(require,module,exports){ +},{"./SyntheticUIEvent":436,"./getEventCharCode":449,"./getEventKey":450,"./getEventModifierState":451}],433:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -62548,7 +62465,7 @@ function SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent, native SyntheticUIEvent.augmentClass(SyntheticMouseEvent, MouseEventInterface); module.exports = SyntheticMouseEvent; -},{"./SyntheticUIEvent":441,"./ViewportMetrics":444,"./getEventModifierState":456}],439:[function(require,module,exports){ +},{"./SyntheticUIEvent":436,"./ViewportMetrics":439,"./getEventModifierState":451}],434:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -62593,7 +62510,7 @@ function SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent, native SyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface); module.exports = SyntheticTouchEvent; -},{"./SyntheticUIEvent":441,"./getEventModifierState":456}],440:[function(require,module,exports){ +},{"./SyntheticUIEvent":436,"./getEventModifierState":451}],435:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -62632,7 +62549,7 @@ function SyntheticTransitionEvent(dispatchConfig, dispatchMarker, nativeEvent, n SyntheticEvent.augmentClass(SyntheticTransitionEvent, TransitionEventInterface); module.exports = SyntheticTransitionEvent; -},{"./SyntheticEvent":434}],441:[function(require,module,exports){ +},{"./SyntheticEvent":429}],436:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -62691,7 +62608,7 @@ function SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEve SyntheticEvent.augmentClass(SyntheticUIEvent, UIEventInterface); module.exports = SyntheticUIEvent; -},{"./SyntheticEvent":434,"./getEventTarget":457}],442:[function(require,module,exports){ +},{"./SyntheticEvent":429,"./getEventTarget":452}],437:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -62745,7 +62662,7 @@ function SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent, native SyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface); module.exports = SyntheticWheelEvent; -},{"./SyntheticMouseEvent":438}],443:[function(require,module,exports){ +},{"./SyntheticMouseEvent":433}],438:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -62970,7 +62887,7 @@ var TransactionImpl = { }; module.exports = TransactionImpl; -},{"./reactProdInvariant":467,"fbjs/lib/invariant":174}],444:[function(require,module,exports){ +},{"./reactProdInvariant":462,"fbjs/lib/invariant":169}],439:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -62997,7 +62914,7 @@ var ViewportMetrics = { }; module.exports = ViewportMetrics; -},{}],445:[function(require,module,exports){ +},{}],440:[function(require,module,exports){ /** * Copyright 2014-present, Facebook, Inc. * All rights reserved. @@ -63055,7 +62972,7 @@ function accumulateInto(current, next) { } module.exports = accumulateInto; -},{"./reactProdInvariant":467,"fbjs/lib/invariant":174}],446:[function(require,module,exports){ +},{"./reactProdInvariant":462,"fbjs/lib/invariant":169}],441:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -63099,7 +63016,7 @@ function adler32(data) { } module.exports = adler32; -},{}],447:[function(require,module,exports){ +},{}],442:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -63189,7 +63106,7 @@ function checkReactTypeSpec(typeSpecs, values, location, componentName, element, module.exports = checkReactTypeSpec; }).call(this,require('_process')) -},{"./ReactPropTypeLocationNames":417,"./ReactPropTypesSecret":418,"./reactProdInvariant":467,"_process":239,"fbjs/lib/invariant":174,"fbjs/lib/warning":181,"react/lib/ReactComponentTreeHook":518}],448:[function(require,module,exports){ +},{"./ReactPropTypeLocationNames":412,"./ReactPropTypesSecret":413,"./reactProdInvariant":462,"_process":234,"fbjs/lib/invariant":169,"fbjs/lib/warning":176,"react/lib/ReactComponentTreeHook":513}],443:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -63221,7 +63138,7 @@ var createMicrosoftUnsafeLocalFunction = function (func) { }; module.exports = createMicrosoftUnsafeLocalFunction; -},{}],449:[function(require,module,exports){ +},{}],444:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -63300,7 +63217,7 @@ function dangerousStyleValue(name, value, component) { } module.exports = dangerousStyleValue; -},{"./CSSProperty":352,"fbjs/lib/warning":181}],450:[function(require,module,exports){ +},{"./CSSProperty":347,"fbjs/lib/warning":176}],445:[function(require,module,exports){ /** * Copyright 2016-present, Facebook, Inc. * All rights reserved. @@ -63423,7 +63340,7 @@ function escapeTextContentForBrowser(text) { } module.exports = escapeTextContentForBrowser; -},{}],451:[function(require,module,exports){ +},{}],446:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -63483,7 +63400,7 @@ function findDOMNode(componentOrElement) { } module.exports = findDOMNode; -},{"./ReactDOMComponentTree":381,"./ReactInstanceMap":409,"./getHostComponentFromComposite":458,"./reactProdInvariant":467,"fbjs/lib/invariant":174,"fbjs/lib/warning":181,"react/lib/ReactCurrentOwner":519}],452:[function(require,module,exports){ +},{"./ReactDOMComponentTree":376,"./ReactInstanceMap":404,"./getHostComponentFromComposite":453,"./reactProdInvariant":462,"fbjs/lib/invariant":169,"fbjs/lib/warning":176,"react/lib/ReactCurrentOwner":514}],447:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -63562,7 +63479,7 @@ function flattenChildren(children, selfDebugID) { module.exports = flattenChildren; }).call(this,require('_process')) -},{"./KeyEscapeUtils":370,"./traverseAllChildren":472,"_process":239,"fbjs/lib/warning":181,"react/lib/ReactComponentTreeHook":518}],453:[function(require,module,exports){ +},{"./KeyEscapeUtils":365,"./traverseAllChildren":467,"_process":234,"fbjs/lib/warning":176,"react/lib/ReactComponentTreeHook":513}],448:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -63593,7 +63510,7 @@ function forEachAccumulated(arr, cb, scope) { } module.exports = forEachAccumulated; -},{}],454:[function(require,module,exports){ +},{}],449:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -63643,7 +63560,7 @@ function getEventCharCode(nativeEvent) { } module.exports = getEventCharCode; -},{}],455:[function(require,module,exports){ +},{}],450:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -63745,7 +63662,7 @@ function getEventKey(nativeEvent) { } module.exports = getEventKey; -},{"./getEventCharCode":454}],456:[function(require,module,exports){ +},{"./getEventCharCode":449}],451:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -63788,7 +63705,7 @@ function getEventModifierState(nativeEvent) { } module.exports = getEventModifierState; -},{}],457:[function(require,module,exports){ +},{}],452:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -63823,7 +63740,7 @@ function getEventTarget(nativeEvent) { } module.exports = getEventTarget; -},{}],458:[function(require,module,exports){ +},{}],453:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -63853,7 +63770,7 @@ function getHostComponentFromComposite(inst) { } module.exports = getHostComponentFromComposite; -},{"./ReactNodeTypes":415}],459:[function(require,module,exports){ +},{"./ReactNodeTypes":410}],454:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -63894,7 +63811,7 @@ function getIteratorFn(maybeIterable) { } module.exports = getIteratorFn; -},{}],460:[function(require,module,exports){ +},{}],455:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -63968,7 +63885,7 @@ function getNodeForCharacterOffset(root, offset) { } module.exports = getNodeForCharacterOffset; -},{}],461:[function(require,module,exports){ +},{}],456:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -64001,7 +63918,7 @@ function getTextContentAccessor() { } module.exports = getTextContentAccessor; -},{"fbjs/lib/ExecutionEnvironment":160}],462:[function(require,module,exports){ +},{"fbjs/lib/ExecutionEnvironment":155}],457:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -64102,7 +64019,7 @@ function getVendorPrefixedEventName(eventName) { } module.exports = getVendorPrefixedEventName; -},{"fbjs/lib/ExecutionEnvironment":160}],463:[function(require,module,exports){ +},{"fbjs/lib/ExecutionEnvironment":155}],458:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -64231,7 +64148,7 @@ _assign(ReactCompositeComponentWrapper.prototype, ReactCompositeComponent, { }); module.exports = instantiateReactComponent; -},{"./ReactCompositeComponent":377,"./ReactEmptyComponent":400,"./ReactHostComponent":405,"./reactProdInvariant":467,"fbjs/lib/invariant":174,"fbjs/lib/warning":181,"object-assign":229,"react/lib/getNextDebugID":533}],464:[function(require,module,exports){ +},{"./ReactCompositeComponent":372,"./ReactEmptyComponent":395,"./ReactHostComponent":400,"./reactProdInvariant":462,"fbjs/lib/invariant":169,"fbjs/lib/warning":176,"object-assign":224,"react/lib/getNextDebugID":528}],459:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -64291,7 +64208,7 @@ function isEventSupported(eventNameSuffix, capture) { } module.exports = isEventSupported; -},{"fbjs/lib/ExecutionEnvironment":160}],465:[function(require,module,exports){ +},{"fbjs/lib/ExecutionEnvironment":155}],460:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -64342,7 +64259,7 @@ function isTextInputElement(elem) { } module.exports = isTextInputElement; -},{}],466:[function(require,module,exports){ +},{}],461:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -64368,7 +64285,7 @@ function quoteAttributeValueForBrowser(value) { } module.exports = quoteAttributeValueForBrowser; -},{"./escapeTextContentForBrowser":450}],467:[function(require,module,exports){ +},{"./escapeTextContentForBrowser":445}],462:[function(require,module,exports){ /** * Copyright (c) 2013-present, Facebook, Inc. * All rights reserved. @@ -64407,7 +64324,7 @@ function reactProdInvariant(code) { } module.exports = reactProdInvariant; -},{}],468:[function(require,module,exports){ +},{}],463:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -64423,7 +64340,7 @@ module.exports = reactProdInvariant; var ReactMount = require('./ReactMount'); module.exports = ReactMount.renderSubtreeIntoContainer; -},{"./ReactMount":413}],469:[function(require,module,exports){ +},{"./ReactMount":408}],464:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -64521,7 +64438,7 @@ if (ExecutionEnvironment.canUseDOM) { } module.exports = setInnerHTML; -},{"./DOMNamespaces":358,"./createMicrosoftUnsafeLocalFunction":448,"fbjs/lib/ExecutionEnvironment":160}],470:[function(require,module,exports){ +},{"./DOMNamespaces":353,"./createMicrosoftUnsafeLocalFunction":443,"fbjs/lib/ExecutionEnvironment":155}],465:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -64573,7 +64490,7 @@ if (ExecutionEnvironment.canUseDOM) { } module.exports = setTextContent; -},{"./escapeTextContentForBrowser":450,"./setInnerHTML":469,"fbjs/lib/ExecutionEnvironment":160}],471:[function(require,module,exports){ +},{"./escapeTextContentForBrowser":445,"./setInnerHTML":464,"fbjs/lib/ExecutionEnvironment":155}],466:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -64615,7 +64532,7 @@ function shouldUpdateReactComponent(prevElement, nextElement) { } module.exports = shouldUpdateReactComponent; -},{}],472:[function(require,module,exports){ +},{}],467:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -64791,7 +64708,7 @@ function traverseAllChildren(children, callback, traverseContext) { } module.exports = traverseAllChildren; -},{"./KeyEscapeUtils":370,"./ReactElementSymbol":399,"./getIteratorFn":459,"./reactProdInvariant":467,"fbjs/lib/invariant":174,"fbjs/lib/warning":181,"react/lib/ReactCurrentOwner":519}],473:[function(require,module,exports){ +},{"./KeyEscapeUtils":365,"./ReactElementSymbol":394,"./getIteratorFn":454,"./reactProdInvariant":462,"fbjs/lib/invariant":169,"fbjs/lib/warning":176,"react/lib/ReactCurrentOwner":514}],468:[function(require,module,exports){ /** * Copyright 2015-present, Facebook, Inc. * All rights reserved. @@ -65168,7 +65085,7 @@ if ("development" !== 'production') { } module.exports = validateDOMNesting; -},{"fbjs/lib/emptyFunction":166,"fbjs/lib/warning":181,"object-assign":229}],474:[function(require,module,exports){ +},{"fbjs/lib/emptyFunction":161,"fbjs/lib/warning":176,"object-assign":224}],469:[function(require,module,exports){ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(require("react"), require("prop-types")); @@ -66046,7 +65963,7 @@ return /******/ (function(modules) { // webpackBootstrap }); ; -},{"prop-types":244,"react":537}],475:[function(require,module,exports){ +},{"prop-types":239,"react":532}],470:[function(require,module,exports){ (function (process){ /* * Copyright 2017, Yahoo Inc. @@ -67711,13 +67628,13 @@ exports.FormattedHTMLMessage = FormattedHTMLMessage; }).call(this,require('_process')) -},{"../locale-data/index.js":119,"_process":239,"intl-format-cache":198,"intl-messageformat":203,"intl-relativeformat":210,"invariant":216,"prop-types":244,"react":537}],476:[function(require,module,exports){ +},{"../locale-data/index.js":114,"_process":234,"intl-format-cache":193,"intl-messageformat":198,"intl-relativeformat":205,"invariant":211,"prop-types":239,"react":532}],471:[function(require,module,exports){ !function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a():"function"==typeof define&&define.amd?define(a):(e.ReactIntlLocaleData=e.ReactIntlLocaleData||{},e.ReactIntlLocaleData.en=a())}(this,function(){"use strict";var e=[{locale:"en",pluralRuleFunction:function(e,a){var n=String(e).split("."),l=!n[1],o=Number(n[0])==e,t=o&&n[0].slice(-1),r=o&&n[0].slice(-2);return a?1==t&&11!=r?"one":2==t&&12!=r?"two":3==t&&13!=r?"few":"other":1==e&&l?"one":"other"},fields:{year:{displayName:"year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{one:"in {0} year",other:"in {0} years"},past:{one:"{0} year ago",other:"{0} years ago"}}},month:{displayName:"month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{one:"in {0} month",other:"in {0} months"},past:{one:"{0} month ago",other:"{0} months ago"}}},day:{displayName:"day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{one:"in {0} day",other:"in {0} days"},past:{one:"{0} day ago",other:"{0} days ago"}}},hour:{displayName:"hour",relativeTime:{future:{one:"in {0} hour",other:"in {0} hours"},past:{one:"{0} hour ago",other:"{0} hours ago"}}},minute:{displayName:"minute",relativeTime:{future:{one:"in {0} minute",other:"in {0} minutes"},past:{one:"{0} minute ago",other:"{0} minutes ago"}}},second:{displayName:"second",relative:{0:"now"},relativeTime:{future:{one:"in {0} second",other:"in {0} seconds"},past:{one:"{0} second ago",other:"{0} seconds ago"}}}}},{locale:"en-001",parentLocale:"en"},{locale:"en-150",parentLocale:"en-001"},{locale:"en-AG",parentLocale:"en-001"},{locale:"en-AI",parentLocale:"en-001"},{locale:"en-AS",parentLocale:"en"},{locale:"en-AT",parentLocale:"en-150"},{locale:"en-AU",parentLocale:"en-001"},{locale:"en-BB",parentLocale:"en-001"},{locale:"en-BE",parentLocale:"en-001"},{locale:"en-BI",parentLocale:"en"},{locale:"en-BM",parentLocale:"en-001"},{locale:"en-BS",parentLocale:"en-001"},{locale:"en-BW",parentLocale:"en-001"},{locale:"en-BZ",parentLocale:"en-001"},{locale:"en-CA",parentLocale:"en-001"},{locale:"en-CC",parentLocale:"en-001"},{locale:"en-CH",parentLocale:"en-150"},{locale:"en-CK",parentLocale:"en-001"},{locale:"en-CM",parentLocale:"en-001"},{locale:"en-CX",parentLocale:"en-001"},{locale:"en-CY",parentLocale:"en-001"},{locale:"en-DE",parentLocale:"en-150"},{locale:"en-DG",parentLocale:"en-001"},{locale:"en-DK",parentLocale:"en-150"},{locale:"en-DM",parentLocale:"en-001"},{locale:"en-Dsrt",pluralRuleFunction:function(e,a){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"en-ER",parentLocale:"en-001"},{locale:"en-FI",parentLocale:"en-150"},{locale:"en-FJ",parentLocale:"en-001"},{locale:"en-FK",parentLocale:"en-001"},{locale:"en-FM",parentLocale:"en-001"},{locale:"en-GB",parentLocale:"en-001"},{locale:"en-GD",parentLocale:"en-001"},{locale:"en-GG",parentLocale:"en-001"},{locale:"en-GH",parentLocale:"en-001"},{locale:"en-GI",parentLocale:"en-001"},{locale:"en-GM",parentLocale:"en-001"},{locale:"en-GU",parentLocale:"en"},{locale:"en-GY",parentLocale:"en-001"},{locale:"en-HK",parentLocale:"en-001"},{locale:"en-IE",parentLocale:"en-001"},{locale:"en-IL",parentLocale:"en-001"},{locale:"en-IM",parentLocale:"en-001"},{locale:"en-IN",parentLocale:"en-001"},{locale:"en-IO",parentLocale:"en-001"},{locale:"en-JE",parentLocale:"en-001"},{locale:"en-JM",parentLocale:"en-001"},{locale:"en-KE",parentLocale:"en-001"},{locale:"en-KI",parentLocale:"en-001"},{locale:"en-KN",parentLocale:"en-001"},{locale:"en-KY",parentLocale:"en-001"},{locale:"en-LC",parentLocale:"en-001"},{locale:"en-LR",parentLocale:"en-001"},{locale:"en-LS",parentLocale:"en-001"},{locale:"en-MG",parentLocale:"en-001"},{locale:"en-MH",parentLocale:"en"},{locale:"en-MO",parentLocale:"en-001"},{locale:"en-MP",parentLocale:"en"},{locale:"en-MS",parentLocale:"en-001"},{locale:"en-MT",parentLocale:"en-001"},{locale:"en-MU",parentLocale:"en-001"},{locale:"en-MW",parentLocale:"en-001"},{locale:"en-MY",parentLocale:"en-001"},{locale:"en-NA",parentLocale:"en-001"},{locale:"en-NF",parentLocale:"en-001"},{locale:"en-NG",parentLocale:"en-001"},{locale:"en-NL",parentLocale:"en-150"},{locale:"en-NR",parentLocale:"en-001"},{locale:"en-NU",parentLocale:"en-001"},{locale:"en-NZ",parentLocale:"en-001"},{locale:"en-PG",parentLocale:"en-001"},{locale:"en-PH",parentLocale:"en-001"},{locale:"en-PK",parentLocale:"en-001"},{locale:"en-PN",parentLocale:"en-001"},{locale:"en-PR",parentLocale:"en"},{locale:"en-PW",parentLocale:"en-001"},{locale:"en-RW",parentLocale:"en-001"},{locale:"en-SB",parentLocale:"en-001"},{locale:"en-SC",parentLocale:"en-001"},{locale:"en-SD",parentLocale:"en-001"},{locale:"en-SE",parentLocale:"en-150"},{locale:"en-SG",parentLocale:"en-001"},{locale:"en-SH",parentLocale:"en-001"},{locale:"en-SI",parentLocale:"en-150"},{locale:"en-SL",parentLocale:"en-001"},{locale:"en-SS",parentLocale:"en-001"},{locale:"en-SX",parentLocale:"en-001"},{locale:"en-SZ",parentLocale:"en-001"},{locale:"en-Shaw",pluralRuleFunction:function(e,a){return"other"},fields:{year:{displayName:"Year",relative:{0:"this year",1:"next year","-1":"last year"},relativeTime:{future:{other:"+{0} y"},past:{other:"-{0} y"}}},month:{displayName:"Month",relative:{0:"this month",1:"next month","-1":"last month"},relativeTime:{future:{other:"+{0} m"},past:{other:"-{0} m"}}},day:{displayName:"Day",relative:{0:"today",1:"tomorrow","-1":"yesterday"},relativeTime:{future:{other:"+{0} d"},past:{other:"-{0} d"}}},hour:{displayName:"Hour",relativeTime:{future:{other:"+{0} h"},past:{other:"-{0} h"}}},minute:{displayName:"Minute",relativeTime:{future:{other:"+{0} min"},past:{other:"-{0} min"}}},second:{displayName:"Second",relative:{0:"now"},relativeTime:{future:{other:"+{0} s"},past:{other:"-{0} s"}}}}},{locale:"en-TC",parentLocale:"en-001"},{locale:"en-TK",parentLocale:"en-001"},{locale:"en-TO",parentLocale:"en-001"},{locale:"en-TT",parentLocale:"en-001"},{locale:"en-TV",parentLocale:"en-001"},{locale:"en-TZ",parentLocale:"en-001"},{locale:"en-UG",parentLocale:"en-001"},{locale:"en-UM",parentLocale:"en"},{locale:"en-US",parentLocale:"en"},{locale:"en-VC",parentLocale:"en-001"},{locale:"en-VG",parentLocale:"en-001"},{locale:"en-VI",parentLocale:"en"},{locale:"en-VU",parentLocale:"en-001"},{locale:"en-WS",parentLocale:"en-001"},{locale:"en-ZA",parentLocale:"en-001"},{locale:"en-ZM",parentLocale:"en-001"},{locale:"en-ZW",parentLocale:"en-001"}];return e}); -},{}],477:[function(require,module,exports){ +},{}],472:[function(require,module,exports){ !function(e,a){"object"==typeof exports&&"undefined"!=typeof module?module.exports=a():"function"==typeof define&&define.amd?define(a):(e.ReactIntlLocaleData=e.ReactIntlLocaleData||{},e.ReactIntlLocaleData.es=a())}(this,function(){"use strict";var e=[{locale:"es",pluralRuleFunction:function(e,a){return a?"other":1==e?"one":"other"},fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"anteayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"minuto",relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-419",parentLocale:"es"},{locale:"es-AR",parentLocale:"es-419"},{locale:"es-BO",parentLocale:"es-419"},{locale:"es-CL",parentLocale:"es-419"},{locale:"es-CO",parentLocale:"es-419"},{locale:"es-CR",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"minuto",relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-CU",parentLocale:"es-419"},{locale:"es-DO",parentLocale:"es-419",fields:{year:{displayName:"Año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"Mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"Día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"anteayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"Minuto",relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"Segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-EA",parentLocale:"es"},{locale:"es-EC",parentLocale:"es-419"},{locale:"es-GQ",parentLocale:"es"},{locale:"es-GT",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"minuto",relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-HN",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"minuto",relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-IC",parentLocale:"es"},{locale:"es-MX",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el año próximo","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el mes próximo","-1":"el mes pasado"},relativeTime:{future:{one:"en {0} mes",other:"en {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"minuto",relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-NI",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"minuto",relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-PA",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"minuto",relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-PE",parentLocale:"es-419"},{locale:"es-PH",parentLocale:"es"},{locale:"es-PR",parentLocale:"es-419"},{locale:"es-PY",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antes de ayer","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"minuto",relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-SV",parentLocale:"es-419",fields:{year:{displayName:"año",relative:{0:"este año",1:"el próximo año","-1":"el año pasado"},relativeTime:{future:{one:"dentro de {0} año",other:"dentro de {0} años"},past:{one:"hace {0} año",other:"hace {0} años"}}},month:{displayName:"mes",relative:{0:"este mes",1:"el próximo mes","-1":"el mes pasado"},relativeTime:{future:{one:"dentro de {0} mes",other:"dentro de {0} meses"},past:{one:"hace {0} mes",other:"hace {0} meses"}}},day:{displayName:"día",relative:{0:"hoy",1:"mañana",2:"pasado mañana","-2":"antier","-1":"ayer"},relativeTime:{future:{one:"dentro de {0} día",other:"dentro de {0} días"},past:{one:"hace {0} día",other:"hace {0} días"}}},hour:{displayName:"hora",relativeTime:{future:{one:"dentro de {0} hora",other:"dentro de {0} horas"},past:{one:"hace {0} hora",other:"hace {0} horas"}}},minute:{displayName:"minuto",relativeTime:{future:{one:"dentro de {0} minuto",other:"dentro de {0} minutos"},past:{one:"hace {0} minuto",other:"hace {0} minutos"}}},second:{displayName:"segundo",relative:{0:"ahora"},relativeTime:{future:{one:"dentro de {0} segundo",other:"dentro de {0} segundos"},past:{one:"hace {0} segundo",other:"hace {0} segundos"}}}}},{locale:"es-US",parentLocale:"es-419"},{locale:"es-UY",parentLocale:"es-419"},{locale:"es-VE",parentLocale:"es-419"}];return e}); -},{}],478:[function(require,module,exports){ +},{}],473:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -68326,7 +68243,7 @@ Modal.Manager = _ModalManager2.default; exports.default = Modal; module.exports = exports['default']; -},{"./ModalManager":479,"./Portal":481,"./utils/addEventListener":485,"./utils/addFocusListener":486,"./utils/getContainer":488,"./utils/ownerDocument":491,"dom-helpers/activeElement":123,"dom-helpers/query/contains":134,"dom-helpers/util/inDOM":151,"prop-types":244,"react":537,"react-prop-types/lib/componentOrElement":493,"react-prop-types/lib/elementType":494,"warning":555}],479:[function(require,module,exports){ +},{"./ModalManager":474,"./Portal":476,"./utils/addEventListener":480,"./utils/addFocusListener":481,"./utils/getContainer":483,"./utils/ownerDocument":486,"dom-helpers/activeElement":118,"dom-helpers/query/contains":129,"dom-helpers/util/inDOM":146,"prop-types":239,"react":532,"react-prop-types/lib/componentOrElement":488,"react-prop-types/lib/elementType":489,"warning":550}],474:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -68505,7 +68422,7 @@ var ModalManager = function ModalManager() { exports.default = ModalManager; module.exports = exports['default']; -},{"./utils/isOverflowing":489,"./utils/manageAriaHidden":490,"dom-helpers/class":126,"dom-helpers/style":143,"dom-helpers/util/scrollbarSize":152}],480:[function(require,module,exports){ +},{"./utils/isOverflowing":484,"./utils/manageAriaHidden":485,"dom-helpers/class":121,"dom-helpers/style":138,"dom-helpers/util/scrollbarSize":147}],475:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -68737,7 +68654,7 @@ Overlay.propTypes = _extends({}, _Portal2.default.propTypes, _Position2.default. exports.default = Overlay; module.exports = exports['default']; -},{"./Portal":481,"./Position":482,"./RootCloseWrapper":483,"prop-types":244,"react":537,"react-prop-types/lib/elementType":494}],481:[function(require,module,exports){ +},{"./Portal":476,"./Position":477,"./RootCloseWrapper":478,"prop-types":239,"react":532,"react-prop-types/lib/elementType":489}],476:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -68889,7 +68806,7 @@ Portal.propTypes = { }; exports.default = Portal; module.exports = exports['default']; -},{"./utils/getContainer":488,"./utils/ownerDocument":491,"prop-types":244,"react":537,"react-dom":348,"react-prop-types/lib/componentOrElement":493}],482:[function(require,module,exports){ +},{"./utils/getContainer":483,"./utils/ownerDocument":486,"prop-types":239,"react":532,"react-dom":343,"react-prop-types/lib/componentOrElement":488}],477:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -69103,7 +69020,7 @@ Position.defaultProps = { exports.default = Position; module.exports = exports['default']; -},{"./utils/calculatePosition":487,"./utils/getContainer":488,"./utils/ownerDocument":491,"classnames":121,"prop-types":244,"react":537,"react-dom":348,"react-prop-types/lib/componentOrElement":493}],483:[function(require,module,exports){ +},{"./utils/calculatePosition":482,"./utils/getContainer":483,"./utils/ownerDocument":486,"classnames":116,"prop-types":239,"react":532,"react-dom":343,"react-prop-types/lib/componentOrElement":488}],478:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -69278,7 +69195,7 @@ RootCloseWrapper.defaultProps = { exports.default = RootCloseWrapper; module.exports = exports['default']; -},{"./utils/addEventListener":485,"./utils/ownerDocument":491,"dom-helpers/query/contains":134,"prop-types":244,"react":537,"react-dom":348}],484:[function(require,module,exports){ +},{"./utils/addEventListener":480,"./utils/ownerDocument":486,"dom-helpers/query/contains":129,"prop-types":239,"react":532,"react-dom":343}],479:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -69628,7 +69545,7 @@ Transition.defaultProps = { }; exports.default = Transition; -},{"classnames":121,"dom-helpers/events/on":132,"dom-helpers/transition/properties":146,"prop-types":244,"react":537,"react-dom":348}],485:[function(require,module,exports){ +},{"classnames":116,"dom-helpers/events/on":127,"dom-helpers/transition/properties":141,"prop-types":239,"react":532,"react-dom":343}],480:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -69656,7 +69573,7 @@ var _off2 = _interopRequireDefault(_off); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } module.exports = exports['default']; -},{"dom-helpers/events/off":131,"dom-helpers/events/on":132}],486:[function(require,module,exports){ +},{"dom-helpers/events/off":126,"dom-helpers/events/on":127}],481:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -69688,7 +69605,7 @@ function addFocusListener(handler) { return { remove: remove }; } module.exports = exports['default']; -},{}],487:[function(require,module,exports){ +},{}],482:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -69818,7 +69735,7 @@ function calculatePosition(placement, overlayNode, target, container, padding) { return { positionLeft: positionLeft, positionTop: positionTop, arrowOffsetLeft: arrowOffsetLeft, arrowOffsetTop: arrowOffsetTop }; } module.exports = exports['default']; -},{"./ownerDocument":491,"dom-helpers/query/offset":136,"dom-helpers/query/position":138,"dom-helpers/query/scrollTop":141}],488:[function(require,module,exports){ +},{"./ownerDocument":486,"dom-helpers/query/offset":131,"dom-helpers/query/position":133,"dom-helpers/query/scrollTop":136}],483:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -69837,7 +69754,7 @@ function getContainer(container, defaultContainer) { return _reactDom2.default.findDOMNode(container) || defaultContainer; } module.exports = exports['default']; -},{"react-dom":348}],489:[function(require,module,exports){ +},{"react-dom":343}],484:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -69879,7 +69796,7 @@ function isOverflowing(container) { return win || isBody(container) ? bodyIsOverflowing(container) : container.scrollHeight > container.clientHeight; } module.exports = exports['default']; -},{"dom-helpers/ownerDocument":133,"dom-helpers/query/isWindow":135}],490:[function(require,module,exports){ +},{"dom-helpers/ownerDocument":128,"dom-helpers/query/isWindow":130}],485:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -69929,7 +69846,7 @@ function showSiblings(container, mountNode) { return ariaHidden(false, node); }); } -},{}],491:[function(require,module,exports){ +},{}],486:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -69951,7 +69868,7 @@ var _ownerDocument2 = _interopRequireDefault(_ownerDocument); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } module.exports = exports['default']; -},{"dom-helpers/ownerDocument":133,"react-dom":348}],492:[function(require,module,exports){ +},{"dom-helpers/ownerDocument":128,"react-dom":343}],487:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -69991,7 +69908,7 @@ function all() { return (0, _createChainableTypeChecker2.default)(allPropTypes); } -},{"./utils/createChainableTypeChecker":496}],493:[function(require,module,exports){ +},{"./utils/createChainableTypeChecker":491}],488:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -70024,7 +69941,7 @@ function validate(props, propName, componentName, location, propFullName) { } exports.default = (0, _createChainableTypeChecker2.default)(validate); -},{"./utils/createChainableTypeChecker":496,"react":537}],494:[function(require,module,exports){ +},{"./utils/createChainableTypeChecker":491,"react":532}],489:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -70057,7 +69974,7 @@ function elementType(props, propName, componentName, location, propFullName) { } exports.default = (0, _createChainableTypeChecker2.default)(elementType); -},{"./utils/createChainableTypeChecker":496,"react":537}],495:[function(require,module,exports){ +},{"./utils/createChainableTypeChecker":491,"react":532}],490:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -70078,7 +69995,7 @@ function isRequiredForA11y(validator) { return validator.apply(undefined, [props, propName, componentName, location, propFullName].concat(args)); }; } -},{}],496:[function(require,module,exports){ +},{}],491:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -70119,7 +70036,7 @@ function createChainableTypeChecker(validate) { return chainedCheckType; } -},{}],497:[function(require,module,exports){ +},{}],492:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -70207,7 +70124,7 @@ function createProvider() { } exports.default = createProvider(); -},{"../utils/PropTypes":507,"../utils/warning":511,"prop-types":244,"react":537}],498:[function(require,module,exports){ +},{"../utils/PropTypes":502,"../utils/warning":506,"prop-types":239,"react":532}],493:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -70497,7 +70414,7 @@ selectorFactory) { return (0, _hoistNonReactStatics2.default)(Connect, WrappedComponent); }; } -},{"../utils/PropTypes":507,"../utils/Subscription":508,"hoist-non-react-statics":195,"invariant":216,"react":537}],499:[function(require,module,exports){ +},{"../utils/PropTypes":502,"../utils/Subscription":503,"hoist-non-react-statics":190,"invariant":211,"react":532}],494:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -70626,7 +70543,7 @@ function createConnect() { } exports.default = createConnect(); -},{"../components/connectAdvanced":498,"../utils/shallowEqual":509,"./mapDispatchToProps":500,"./mapStateToProps":501,"./mergeProps":502,"./selectorFactory":503}],500:[function(require,module,exports){ +},{"../components/connectAdvanced":493,"../utils/shallowEqual":504,"./mapDispatchToProps":495,"./mapStateToProps":496,"./mergeProps":497,"./selectorFactory":498}],495:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -70655,7 +70572,7 @@ function whenMapDispatchToPropsIsObject(mapDispatchToProps) { } exports.default = [whenMapDispatchToPropsIsFunction, whenMapDispatchToPropsIsMissing, whenMapDispatchToPropsIsObject]; -},{"./wrapMapToProps":505,"redux":544}],501:[function(require,module,exports){ +},{"./wrapMapToProps":500,"redux":539}],496:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -70675,7 +70592,7 @@ function whenMapStateToPropsIsMissing(mapStateToProps) { } exports.default = [whenMapStateToPropsIsFunction, whenMapStateToPropsIsMissing]; -},{"./wrapMapToProps":505}],502:[function(require,module,exports){ +},{"./wrapMapToProps":500}],497:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -70734,7 +70651,7 @@ function whenMergePropsIsOmitted(mergeProps) { } exports.default = [whenMergePropsIsFunction, whenMergePropsIsOmitted]; -},{"../utils/verifyPlainObject":510}],503:[function(require,module,exports){ +},{"../utils/verifyPlainObject":505}],498:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -70848,7 +70765,7 @@ function finalPropsSelectorFactory(dispatch, _ref2) { return selectorFactory(mapStateToProps, mapDispatchToProps, mergeProps, dispatch, options); } -},{"./verifySubselectors":504}],504:[function(require,module,exports){ +},{"./verifySubselectors":499}],499:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -70875,7 +70792,7 @@ function verifySubselectors(mapStateToProps, mapDispatchToProps, mergeProps, dis verify(mapDispatchToProps, 'mapDispatchToProps', displayName); verify(mergeProps, 'mergeProps', displayName); } -},{"../utils/warning":511}],505:[function(require,module,exports){ +},{"../utils/warning":506}],500:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -70954,7 +70871,7 @@ function wrapMapToPropsFunc(mapToProps, methodName) { return proxy; }; } -},{"../utils/verifyPlainObject":510}],506:[function(require,module,exports){ +},{"../utils/verifyPlainObject":505}],501:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -70978,7 +70895,7 @@ exports.Provider = _Provider2.default; exports.createProvider = _Provider.createProvider; exports.connectAdvanced = _connectAdvanced2.default; exports.connect = _connect2.default; -},{"./components/Provider":497,"./components/connectAdvanced":498,"./connect/connect":499}],507:[function(require,module,exports){ +},{"./components/Provider":492,"./components/connectAdvanced":493,"./connect/connect":494}],502:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -71002,7 +70919,7 @@ var storeShape = exports.storeShape = _propTypes2.default.shape({ dispatch: _propTypes2.default.func.isRequired, getState: _propTypes2.default.func.isRequired }); -},{"prop-types":244}],508:[function(require,module,exports){ +},{"prop-types":239}],503:[function(require,module,exports){ "use strict"; exports.__esModule = true; @@ -71096,7 +71013,7 @@ var Subscription = function () { }(); exports.default = Subscription; -},{}],509:[function(require,module,exports){ +},{}],504:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -71131,7 +71048,7 @@ function shallowEqual(objA, objB) { return true; } -},{}],510:[function(require,module,exports){ +},{}],505:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -71152,7 +71069,7 @@ function verifyPlainObject(value, displayName, methodName) { (0, _warning2.default)(methodName + '() in ' + displayName + ' must return a plain object. Instead received ' + value + '.'); } } -},{"./warning":511,"lodash/isPlainObject":227}],511:[function(require,module,exports){ +},{"./warning":506,"lodash/isPlainObject":222}],506:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -71178,11 +71095,11 @@ function warning(message) { } catch (e) {} /* eslint-enable no-empty */ } -},{}],512:[function(require,module,exports){ -arguments[4][370][0].apply(exports,arguments) -},{"dup":370}],513:[function(require,module,exports){ -arguments[4][372][0].apply(exports,arguments) -},{"./reactProdInvariant":535,"dup":372,"fbjs/lib/invariant":174}],514:[function(require,module,exports){ +},{}],507:[function(require,module,exports){ +arguments[4][365][0].apply(exports,arguments) +},{"dup":365}],508:[function(require,module,exports){ +arguments[4][367][0].apply(exports,arguments) +},{"./reactProdInvariant":530,"dup":367,"fbjs/lib/invariant":169}],509:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -71286,7 +71203,7 @@ if ("development" !== 'production') { } module.exports = React; -},{"./ReactChildren":515,"./ReactClass":516,"./ReactComponent":517,"./ReactDOMFactories":520,"./ReactElement":521,"./ReactElementValidator":523,"./ReactPropTypes":526,"./ReactPureComponent":528,"./ReactVersion":529,"./canDefineProperty":530,"./onlyChild":534,"fbjs/lib/warning":181,"object-assign":229}],515:[function(require,module,exports){ +},{"./ReactChildren":510,"./ReactClass":511,"./ReactComponent":512,"./ReactDOMFactories":515,"./ReactElement":516,"./ReactElementValidator":518,"./ReactPropTypes":521,"./ReactPureComponent":523,"./ReactVersion":524,"./canDefineProperty":525,"./onlyChild":529,"fbjs/lib/warning":176,"object-assign":224}],510:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -71477,7 +71394,7 @@ var ReactChildren = { }; module.exports = ReactChildren; -},{"./PooledClass":513,"./ReactElement":521,"./traverseAllChildren":536,"fbjs/lib/emptyFunction":166}],516:[function(require,module,exports){ +},{"./PooledClass":508,"./ReactElement":516,"./traverseAllChildren":531,"fbjs/lib/emptyFunction":161}],511:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -72200,7 +72117,7 @@ var ReactClass = { }; module.exports = ReactClass; -},{"./ReactComponent":517,"./ReactElement":521,"./ReactNoopUpdateQueue":524,"./ReactPropTypeLocationNames":525,"./reactProdInvariant":535,"fbjs/lib/emptyObject":167,"fbjs/lib/invariant":174,"fbjs/lib/warning":181,"object-assign":229}],517:[function(require,module,exports){ +},{"./ReactComponent":512,"./ReactElement":516,"./ReactNoopUpdateQueue":519,"./ReactPropTypeLocationNames":520,"./reactProdInvariant":530,"fbjs/lib/emptyObject":162,"fbjs/lib/invariant":169,"fbjs/lib/warning":176,"object-assign":224}],512:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -72318,7 +72235,7 @@ if ("development" !== 'production') { } module.exports = ReactComponent; -},{"./ReactNoopUpdateQueue":524,"./canDefineProperty":530,"./reactProdInvariant":535,"fbjs/lib/emptyObject":167,"fbjs/lib/invariant":174,"fbjs/lib/warning":181}],518:[function(require,module,exports){ +},{"./ReactNoopUpdateQueue":519,"./canDefineProperty":525,"./reactProdInvariant":530,"fbjs/lib/emptyObject":162,"fbjs/lib/invariant":169,"fbjs/lib/warning":176}],513:[function(require,module,exports){ /** * Copyright 2016-present, Facebook, Inc. * All rights reserved. @@ -72652,7 +72569,7 @@ var ReactComponentTreeHook = { }; module.exports = ReactComponentTreeHook; -},{"./ReactCurrentOwner":519,"./reactProdInvariant":535,"fbjs/lib/invariant":174,"fbjs/lib/warning":181}],519:[function(require,module,exports){ +},{"./ReactCurrentOwner":514,"./reactProdInvariant":530,"fbjs/lib/invariant":169,"fbjs/lib/warning":176}],514:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -72683,7 +72600,7 @@ var ReactCurrentOwner = { }; module.exports = ReactCurrentOwner; -},{}],520:[function(require,module,exports){ +},{}],515:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -72853,7 +72770,7 @@ var ReactDOMFactories = { }; module.exports = ReactDOMFactories; -},{"./ReactElement":521,"./ReactElementValidator":523}],521:[function(require,module,exports){ +},{"./ReactElement":516,"./ReactElementValidator":518}],516:[function(require,module,exports){ /** * Copyright 2014-present, Facebook, Inc. * All rights reserved. @@ -73194,9 +73111,9 @@ ReactElement.isValidElement = function (object) { }; module.exports = ReactElement; -},{"./ReactCurrentOwner":519,"./ReactElementSymbol":522,"./canDefineProperty":530,"fbjs/lib/warning":181,"object-assign":229}],522:[function(require,module,exports){ -arguments[4][399][0].apply(exports,arguments) -},{"dup":399}],523:[function(require,module,exports){ +},{"./ReactCurrentOwner":514,"./ReactElementSymbol":517,"./canDefineProperty":525,"fbjs/lib/warning":176,"object-assign":224}],517:[function(require,module,exports){ +arguments[4][394][0].apply(exports,arguments) +},{"dup":394}],518:[function(require,module,exports){ /** * Copyright 2014-present, Facebook, Inc. * All rights reserved. @@ -73449,7 +73366,7 @@ var ReactElementValidator = { }; module.exports = ReactElementValidator; -},{"./ReactComponentTreeHook":518,"./ReactCurrentOwner":519,"./ReactElement":521,"./canDefineProperty":530,"./checkReactTypeSpec":531,"./getIteratorFn":532,"fbjs/lib/warning":181}],524:[function(require,module,exports){ +},{"./ReactComponentTreeHook":513,"./ReactCurrentOwner":514,"./ReactElement":516,"./canDefineProperty":525,"./checkReactTypeSpec":526,"./getIteratorFn":527,"fbjs/lib/warning":176}],519:[function(require,module,exports){ /** * Copyright 2015-present, Facebook, Inc. * All rights reserved. @@ -73545,9 +73462,9 @@ var ReactNoopUpdateQueue = { }; module.exports = ReactNoopUpdateQueue; -},{"fbjs/lib/warning":181}],525:[function(require,module,exports){ -arguments[4][417][0].apply(exports,arguments) -},{"dup":417}],526:[function(require,module,exports){ +},{"fbjs/lib/warning":176}],520:[function(require,module,exports){ +arguments[4][412][0].apply(exports,arguments) +},{"dup":412}],521:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -73566,9 +73483,9 @@ var _require = require('./ReactElement'), var factory = require('prop-types/factory'); module.exports = factory(isValidElement); -},{"./ReactElement":521,"prop-types/factory":241}],527:[function(require,module,exports){ -arguments[4][418][0].apply(exports,arguments) -},{"dup":418}],528:[function(require,module,exports){ +},{"./ReactElement":516,"prop-types/factory":236}],522:[function(require,module,exports){ +arguments[4][413][0].apply(exports,arguments) +},{"dup":413}],523:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -73610,9 +73527,9 @@ _assign(ReactPureComponent.prototype, ReactComponent.prototype); ReactPureComponent.prototype.isPureReactComponent = true; module.exports = ReactPureComponent; -},{"./ReactComponent":517,"./ReactNoopUpdateQueue":524,"fbjs/lib/emptyObject":167,"object-assign":229}],529:[function(require,module,exports){ -arguments[4][426][0].apply(exports,arguments) -},{"dup":426}],530:[function(require,module,exports){ +},{"./ReactComponent":512,"./ReactNoopUpdateQueue":519,"fbjs/lib/emptyObject":162,"object-assign":224}],524:[function(require,module,exports){ +arguments[4][421][0].apply(exports,arguments) +},{"dup":421}],525:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -73638,7 +73555,7 @@ if ("development" !== 'production') { } module.exports = canDefineProperty; -},{}],531:[function(require,module,exports){ +},{}],526:[function(require,module,exports){ (function (process){ /** * Copyright 2013-present, Facebook, Inc. @@ -73728,9 +73645,9 @@ function checkReactTypeSpec(typeSpecs, values, location, componentName, element, module.exports = checkReactTypeSpec; }).call(this,require('_process')) -},{"./ReactComponentTreeHook":518,"./ReactPropTypeLocationNames":525,"./ReactPropTypesSecret":527,"./reactProdInvariant":535,"_process":239,"fbjs/lib/invariant":174,"fbjs/lib/warning":181}],532:[function(require,module,exports){ -arguments[4][459][0].apply(exports,arguments) -},{"dup":459}],533:[function(require,module,exports){ +},{"./ReactComponentTreeHook":513,"./ReactPropTypeLocationNames":520,"./ReactPropTypesSecret":522,"./reactProdInvariant":530,"_process":234,"fbjs/lib/invariant":169,"fbjs/lib/warning":176}],527:[function(require,module,exports){ +arguments[4][454][0].apply(exports,arguments) +},{"dup":454}],528:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -73751,7 +73668,7 @@ function getNextDebugID() { } module.exports = getNextDebugID; -},{}],534:[function(require,module,exports){ +},{}],529:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -73789,9 +73706,9 @@ function onlyChild(children) { } module.exports = onlyChild; -},{"./ReactElement":521,"./reactProdInvariant":535,"fbjs/lib/invariant":174}],535:[function(require,module,exports){ -arguments[4][467][0].apply(exports,arguments) -},{"dup":467}],536:[function(require,module,exports){ +},{"./ReactElement":516,"./reactProdInvariant":530,"fbjs/lib/invariant":169}],530:[function(require,module,exports){ +arguments[4][462][0].apply(exports,arguments) +},{"dup":462}],531:[function(require,module,exports){ /** * Copyright 2013-present, Facebook, Inc. * All rights reserved. @@ -73967,12 +73884,12 @@ function traverseAllChildren(children, callback, traverseContext) { } module.exports = traverseAllChildren; -},{"./KeyEscapeUtils":512,"./ReactCurrentOwner":519,"./ReactElementSymbol":522,"./getIteratorFn":532,"./reactProdInvariant":535,"fbjs/lib/invariant":174,"fbjs/lib/warning":181}],537:[function(require,module,exports){ +},{"./KeyEscapeUtils":507,"./ReactCurrentOwner":514,"./ReactElementSymbol":517,"./getIteratorFn":527,"./reactProdInvariant":530,"fbjs/lib/invariant":169,"fbjs/lib/warning":176}],532:[function(require,module,exports){ 'use strict'; module.exports = require('./lib/React'); -},{"./lib/React":514}],538:[function(require,module,exports){ +},{"./lib/React":509}],533:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -73996,7 +73913,7 @@ var thunk = createThunkMiddleware(); thunk.withExtraArgument = createThunkMiddleware; exports['default'] = thunk; -},{}],539:[function(require,module,exports){ +},{}],534:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -74055,7 +73972,7 @@ function applyMiddleware() { }; }; } -},{"./compose":542}],540:[function(require,module,exports){ +},{"./compose":537}],535:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -74107,7 +74024,7 @@ function bindActionCreators(actionCreators, dispatch) { } return boundActionCreators; } -},{}],541:[function(require,module,exports){ +},{}],536:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -74250,7 +74167,7 @@ function combineReducers(reducers) { return hasChanged ? nextState : state; }; } -},{"./createStore":543,"./utils/warning":545,"lodash/isPlainObject":227}],542:[function(require,module,exports){ +},{"./createStore":538,"./utils/warning":540,"lodash/isPlainObject":222}],537:[function(require,module,exports){ "use strict"; exports.__esModule = true; @@ -74289,7 +74206,7 @@ function compose() { }, last.apply(undefined, arguments)); }; } -},{}],543:[function(require,module,exports){ +},{}],538:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -74551,7 +74468,7 @@ function createStore(reducer, preloadedState, enhancer) { replaceReducer: replaceReducer }, _ref2[_symbolObservable2['default']] = observable, _ref2; } -},{"lodash/isPlainObject":227,"symbol-observable":546}],544:[function(require,module,exports){ +},{"lodash/isPlainObject":222,"symbol-observable":541}],539:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -74598,7 +74515,7 @@ exports.combineReducers = _combineReducers2['default']; exports.bindActionCreators = _bindActionCreators2['default']; exports.applyMiddleware = _applyMiddleware2['default']; exports.compose = _compose2['default']; -},{"./applyMiddleware":539,"./bindActionCreators":540,"./combineReducers":541,"./compose":542,"./createStore":543,"./utils/warning":545}],545:[function(require,module,exports){ +},{"./applyMiddleware":534,"./bindActionCreators":535,"./combineReducers":536,"./compose":537,"./createStore":538,"./utils/warning":540}],540:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -74624,10 +74541,10 @@ function warning(message) { } catch (e) {} /* eslint-enable no-empty */ } -},{}],546:[function(require,module,exports){ +},{}],541:[function(require,module,exports){ module.exports = require('./lib/index'); -},{"./lib/index":547}],547:[function(require,module,exports){ +},{"./lib/index":542}],542:[function(require,module,exports){ (function (global){ 'use strict'; @@ -74660,7 +74577,7 @@ var result = (0, _ponyfill2['default'])(root); exports['default'] = result; }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./ponyfill":548}],548:[function(require,module,exports){ +},{"./ponyfill":543}],543:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -74684,7 +74601,7 @@ function symbolObservablePonyfill(root) { return result; }; -},{}],549:[function(require,module,exports){ +},{}],544:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -74880,7 +74797,7 @@ function createUncontrollable(mixin, set) { } } module.exports = exports['default']; -},{"./utils":551,"invariant":216,"react":537}],550:[function(require,module,exports){ +},{"./utils":546,"invariant":211,"react":532}],545:[function(require,module,exports){ 'use strict'; exports.__esModule = true; @@ -74912,7 +74829,7 @@ function set(component, propName, handler, value, args) { exports.default = (0, _createUncontrollable2.default)(mixin, set); module.exports = exports['default']; -},{"./createUncontrollable":549}],551:[function(require,module,exports){ +},{"./createUncontrollable":544}],546:[function(require,module,exports){ (function (process){ 'use strict'; @@ -75032,7 +74949,7 @@ function isReactComponent(component) { } }).call(this,require('_process')) -},{"_process":239,"invariant":216,"react":537}],552:[function(require,module,exports){ +},{"_process":234,"invariant":211,"react":532}],547:[function(require,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -75766,7 +75683,7 @@ Url.prototype.parseHost = function() { if (host) this.hostname = host; }; -},{"./util":553,"punycode":246,"querystring":249}],553:[function(require,module,exports){ +},{"./util":548,"punycode":241,"querystring":244}],548:[function(require,module,exports){ 'use strict'; module.exports = { @@ -75784,7 +75701,7 @@ module.exports = { } }; -},{}],554:[function(require,module,exports){ +},{}],549:[function(require,module,exports){ (function (global){ /*! https://mths.be/utf8js v2.1.2 by @mathias */ ;(function(root) { @@ -76033,7 +75950,7 @@ module.exports = { }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],555:[function(require,module,exports){ +},{}],550:[function(require,module,exports){ /** * Copyright 2014-2015, Facebook, Inc. * All rights reserved. @@ -76095,7 +76012,7 @@ if ("development" !== 'production') { module.exports = warning; -},{}],556:[function(require,module,exports){ +},{}],551:[function(require,module,exports){ var bundleFn = arguments[3]; var sources = arguments[4]; var cache = arguments[5]; @@ -76178,7 +76095,7 @@ module.exports = function (fn, options) { return worker; }; -},{}],557:[function(require,module,exports){ +},{}],552:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CHARSETS = {}; @@ -76341,7 +76258,7 @@ exports.CHARSETS['='] = { -},{}],558:[function(require,module,exports){ +},{}],553:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var CompositionHelper = (function () { @@ -76468,7 +76385,7 @@ exports.CompositionHelper = CompositionHelper; -},{}],559:[function(require,module,exports){ +},{}],554:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var C0; @@ -76512,7 +76429,7 @@ var C0; -},{}],560:[function(require,module,exports){ +},{}],555:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); ; @@ -76570,7 +76487,7 @@ exports.EventEmitter = EventEmitter; -},{}],561:[function(require,module,exports){ +},{}],556:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var EscapeSequences_1 = require("./EscapeSequences"); @@ -77502,7 +77419,7 @@ var wcwidth = (function (opts) { -},{"./Charsets":557,"./EscapeSequences":559}],562:[function(require,module,exports){ +},{"./Charsets":552,"./EscapeSequences":554}],557:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var INVALID_LINK_CLASS = 'xterm-invalid-link'; @@ -77729,7 +77646,7 @@ exports.Linkifier = Linkifier; -},{}],563:[function(require,module,exports){ +},{}],558:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var EscapeSequences_1 = require("./EscapeSequences"); @@ -78205,7 +78122,7 @@ exports.Parser = Parser; -},{"./Charsets":557,"./EscapeSequences":559}],564:[function(require,module,exports){ +},{"./Charsets":552,"./EscapeSequences":554}],559:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var MAX_REFRESH_FRAME_SKIP = 5; @@ -78419,7 +78336,7 @@ function checkBoldBroken(terminal) { -},{}],565:[function(require,module,exports){ +},{}],560:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Viewport = (function () { @@ -78497,7 +78414,7 @@ exports.Viewport = Viewport; -},{}],566:[function(require,module,exports){ +},{}],561:[function(require,module,exports){ /** * Fit terminal columns and rows to the dimensions of its DOM element. * @@ -78585,7 +78502,7 @@ exports.Viewport = Viewport; return exports; }); -},{"../../xterm":572}],567:[function(require,module,exports){ +},{"../../xterm":567}],562:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function prepareTextForClipboard(text) { @@ -78667,7 +78584,7 @@ exports.rightClickHandler = rightClickHandler; -},{}],568:[function(require,module,exports){ +},{}],563:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var Generic_1 = require("./Generic"); @@ -78683,7 +78600,7 @@ exports.isMSWindows = Generic_1.contains(['Windows', 'Win16', 'Win32', 'WinCE'], -},{"./Generic":571}],569:[function(require,module,exports){ +},{"./Generic":566}],564:[function(require,module,exports){ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = Object.setPrototypeOf || @@ -78752,7 +78669,7 @@ exports.CharMeasure = CharMeasure; -},{"../EventEmitter.js":560}],570:[function(require,module,exports){ +},{"../EventEmitter.js":555}],565:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var CircularList = (function () { @@ -78891,7 +78808,7 @@ exports.CircularList = CircularList; -},{}],571:[function(require,module,exports){ +},{}],566:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function contains(arr, el) { @@ -78902,7 +78819,7 @@ exports.contains = contains; -},{}],572:[function(require,module,exports){ +},{}],567:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var CompositionHelper_1 = require("./CompositionHelper"); @@ -80482,7 +80399,7 @@ module.exports = Terminal; -},{"./CompositionHelper":558,"./EscapeSequences":559,"./EventEmitter":560,"./InputHandler":561,"./Linkifier":562,"./Parser":563,"./Renderer":564,"./Viewport":565,"./handlers/Clipboard":567,"./utils/Browser":568,"./utils/CharMeasure":569,"./utils/CircularList":570}],573:[function(require,module,exports){ +},{"./CompositionHelper":553,"./EscapeSequences":554,"./EventEmitter":555,"./InputHandler":556,"./Linkifier":557,"./Parser":558,"./Renderer":559,"./Viewport":560,"./handlers/Clipboard":562,"./utils/Browser":563,"./utils/CharMeasure":564,"./utils/CircularList":565}],568:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -80709,7 +80626,7 @@ var EHorus = function () { exports.default = EHorus; -},{"./actions/app":575,"./common/lib/remote":602,"./components/app":606,"./store/configure-store":690,"./translations/en.json":691,"./translations/es.json":692,"react":537,"react-dom":348,"react-intl":475,"react-intl/locale-data/en":476,"react-intl/locale-data/es":477,"react-redux":506}],574:[function(require,module,exports){ +},{"./actions/app":570,"./common/lib/remote":597,"./components/app":601,"./store/configure-store":685,"./translations/en.json":686,"./translations/es.json":687,"react":532,"react-dom":343,"react-intl":470,"react-intl/locale-data/en":471,"react-intl/locale-data/es":472,"react-redux":501}],569:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -80945,7 +80862,7 @@ function fetchAgent() { }; } -},{"../common/lib/remote":602,"../constants":643,"../constants/agent":638}],575:[function(require,module,exports){ +},{"../common/lib/remote":597,"../constants":638,"../constants/agent":633}],570:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -81196,7 +81113,7 @@ function tryPasswords() { }; } -},{"../actions/agent":574,"../common/lib/remote":602,"../constants":643,"../constants/app":639}],576:[function(require,module,exports){ +},{"../actions/agent":569,"../common/lib/remote":597,"../constants":638,"../constants/app":634}],571:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -81285,7 +81202,7 @@ function disconnectionDisplaySuccess() { }; } -},{"../common/lib/remote":602,"../constants":643,"../constants/display":641}],577:[function(require,module,exports){ +},{"../common/lib/remote":597,"../constants":638,"../constants/display":636}],572:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -81509,7 +81426,7 @@ var requestChunk = exports.requestChunk = function requestChunk(dirname, basenam }); }; -},{"../common/lib/base64":599,"../common/lib/remote":602,"../constants":643,"../constants/files":642,"../lib/files/path-array":656,"../reducers/files":672}],578:[function(require,module,exports){ +},{"../common/lib/base64":594,"../common/lib/remote":597,"../constants":638,"../constants/files":637,"../lib/files/path-array":651,"../reducers/files":667}],573:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -81581,7 +81498,7 @@ var sendTermData = exports.sendTermData = function sendTermData(data) { }; }; -},{"../common/lib/remote":602,"../constants":643,"../constants/terminal":644}],579:[function(require,module,exports){ +},{"../common/lib/remote":597,"../constants":638,"../constants/terminal":639}],574:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -81631,7 +81548,7 @@ var BaseComponent = function (_Component) { exports.default = BaseComponent; -},{"react":537}],580:[function(require,module,exports){ +},{"react":532}],575:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -81728,7 +81645,7 @@ Cell.defaultProps = { exports.default = Cell; -},{"classnames":121,"react":537}],581:[function(require,module,exports){ +},{"classnames":116,"react":532}],576:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -81811,7 +81728,7 @@ HeadCell.defaultProps = { exports.default = HeadCell; -},{"classnames":121,"react":537}],582:[function(require,module,exports){ +},{"classnames":116,"react":532}],577:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -81913,7 +81830,7 @@ Row.defaultProps = { exports.default = Row; -},{"../lib/Column":587,"./Cell":580,"classnames":121,"react":537}],583:[function(require,module,exports){ +},{"../lib/Column":582,"./Cell":575,"classnames":116,"react":532}],578:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -82005,7 +81922,7 @@ TBody.propTypes = { exports.default = TBody; -},{"../lib/Column":587,"./Row":582,"react":537}],584:[function(require,module,exports){ +},{"../lib/Column":582,"./Row":577,"react":532}],579:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -82143,7 +82060,7 @@ THead.propTypes = { exports.default = THead; -},{"../lib/Column":587,"./HeadCell":581,"react":537,"react-bootstrap":337}],585:[function(require,module,exports){ +},{"../lib/Column":582,"./HeadCell":576,"react":532,"react-bootstrap":332}],580:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -82368,7 +82285,7 @@ Table.defaultProps = { exports.default = Table; -},{"../lib/Column":587,"./TBody":583,"./THead":584,"classnames":121,"react":537}],586:[function(require,module,exports){ +},{"../lib/Column":582,"./TBody":578,"./THead":579,"classnames":116,"react":532}],581:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -82389,7 +82306,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de exports.default = _Table2.default; exports.DataColumn = _Column2.default; -},{"./components/Table":585,"./lib/Column":587}],587:[function(require,module,exports){ +},{"./components/Table":580,"./lib/Column":582}],582:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -82577,7 +82494,7 @@ var Column = function () { exports.default = Column; -},{}],588:[function(require,module,exports){ +},{}],583:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -82734,7 +82651,7 @@ Overlay.defaultProps = { exports.default = Overlay; -},{"react":537}],589:[function(require,module,exports){ +},{"react":532}],584:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -82796,7 +82713,7 @@ var Area = function (_Component) { exports.default = Area; -},{"react":537}],590:[function(require,module,exports){ +},{"react":532}],585:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -82893,7 +82810,7 @@ var AreaChart = function (_Component) { exports.default = AreaChart; -},{"../common":594,"./DataSeries":591,"d3":122,"react":537}],591:[function(require,module,exports){ +},{"../common":589,"./DataSeries":586,"d3":117,"react":532}],586:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -82981,7 +82898,7 @@ var DataSeries = function (_Component) { exports.default = DataSeries; -},{"./Area":589,"d3":122,"react":537}],592:[function(require,module,exports){ +},{"./Area":584,"d3":117,"react":532}],587:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -82996,7 +82913,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de exports.default = _AreaChart2.default; -},{"./AreaChart":590}],593:[function(require,module,exports){ +},{"./AreaChart":585}],588:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -83068,7 +82985,7 @@ var Chart = function (_Component) { exports.default = Chart; -},{"react":537}],594:[function(require,module,exports){ +},{"react":532}],589:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -83084,7 +83001,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de exports.Chart = _Chart2.default; -},{"./Chart":593}],595:[function(require,module,exports){ +},{"./Chart":588}],590:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -83100,7 +83017,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de exports.AreaChart = _areaChart2.default; -},{"./area-chart":592}],596:[function(require,module,exports){ +},{"./area-chart":587}],591:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -83305,7 +83222,7 @@ RefreshButton.defaultProps = { exports.default = (0, _reactIntl.injectIntl)(RefreshButton); -},{"classnames":121,"react":537,"react-bootstrap":337,"react-intl":475}],597:[function(require,module,exports){ +},{"classnames":116,"react":532,"react-bootstrap":332,"react-intl":470}],592:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -83476,7 +83393,7 @@ FakeWebSocket.CLOSED = _remote2.default.CLOSED; exports.default = FakeWebSocket; -},{"../../constants":643,"./remote":602,"events":153}],598:[function(require,module,exports){ +},{"../../constants":638,"./remote":597,"events":148}],593:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -83499,15 +83416,15 @@ var Logger = function () { _createClass(Logger, [{ key: 'doLog', value: function doLog(type) { - if ("development" !== 'production') { - var _console; + var _console; - for (var _len = arguments.length, params = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - params[_key - 1] = arguments[_key]; - } - - (_console = console)[type].apply(_console, [this.section ? '[' + this.section + ']' : ''].concat(params)); + for (var _len = arguments.length, params = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + params[_key - 1] = arguments[_key]; } + + // if (process.env.NODE_ENV !== 'production') { + (_console = console)[type].apply(_console, [this.section ? '[' + this.section + ']' : ''].concat(params)); + // } } }, { key: 'log', @@ -83561,7 +83478,7 @@ var Logger = function () { exports.default = Logger; -},{}],599:[function(require,module,exports){ +},{}],594:[function(require,module,exports){ 'use strict'; /* \ @@ -83726,7 +83643,7 @@ exports.strToUTF8Arr = strToUTF8Arr; exports.strToBase64 = strToBase64; exports.base64ToStr = base64ToStr; -},{}],600:[function(require,module,exports){ +},{}],595:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -84019,7 +83936,7 @@ Remote.CLOSED = 3; exports.default = Remote; -},{"events":153,"url":552}],601:[function(require,module,exports){ +},{"events":148,"url":547}],596:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -84104,7 +84021,7 @@ var RemoteAgent = function (_Remote) { exports.default = RemoteAgent; -},{"./Remote":600,"./response-data":603}],602:[function(require,module,exports){ +},{"./Remote":595,"./response-data":598}],597:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -84128,7 +84045,7 @@ agent.CLOSED = 3; // Exporting this way the class will act as a singleton exports.default = agent; -},{"./RemoteAgent":601}],603:[function(require,module,exports){ +},{"./RemoteAgent":596}],598:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -84191,7 +84108,7 @@ function ResponseData(response) { exports.default = ResponseData; -},{"utf8":554}],604:[function(require,module,exports){ +},{"utf8":549}],599:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -84351,7 +84268,7 @@ var ellipsize = exports.ellipsize = function ellipsize(str) { return str.trim().length > max ? str.substr(0, max).trim() + ellipse : str; }; -},{}],605:[function(require,module,exports){ +},{}],600:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -84486,7 +84403,7 @@ AgentAuthentication.defaultProps = { exports.default = (0, _reactIntl.injectIntl)(AgentAuthentication); -},{"react":537,"react-bootstrap":337,"react-intl":475}],606:[function(require,module,exports){ +},{"react":532,"react-bootstrap":332,"react-intl":470}],601:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -84793,7 +84710,7 @@ var mapDispatchToProps = function mapDispatchToProps(dispatch, props) { }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)((0, _reactIntl.injectIntl)(App)); -},{"../actions/agent":574,"../actions/app":575,"../common/lib/remote":602,"../components/agent-authentication":605,"../components/header":625,"../components/info-panel":626,"../components/section":629,"../reducers/app":670,"../responses":677,"react":537,"react-intl":475,"react-redux":506}],607:[function(require,module,exports){ +},{"../actions/agent":569,"../actions/app":570,"../common/lib/remote":597,"../components/agent-authentication":600,"../components/header":620,"../components/info-panel":621,"../components/section":624,"../reducers/app":665,"../responses":672,"react":532,"react-intl":470,"react-redux":501}],602:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -85197,7 +85114,7 @@ DisplayButtons.defaultProps = { exports.default = DisplayButtons; -},{"./keyboard-button":610,"./keys-button":611,"react":537,"react-bootstrap":337,"react-intl":475}],608:[function(require,module,exports){ +},{"./keyboard-button":605,"./keys-button":606,"react":532,"react-bootstrap":332,"react-intl":470}],603:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -85403,7 +85320,7 @@ ClipboardModal.defaultProps = { exports.default = (0, _reactIntl.injectIntl)(ClipboardModal); -},{"react":537,"react-bootstrap":337,"react-intl":475}],609:[function(require,module,exports){ +},{"react":532,"react-bootstrap":332,"react-intl":470}],604:[function(require,module,exports){ (function (global){ 'use strict'; @@ -85951,7 +85868,8 @@ var Display = exports.Display = function (_React$Component) { width = _getDisplaySize3[0], height = _getDisplaySize3[1]; - this.rfb.get_display().autoscale(width, height, true); + var scaleRatio = this.rfb.get_display().autoscale(width, height, true); + this.rfb.get_mouse().set_scale(scaleRatio); } } }, { @@ -86170,7 +86088,7 @@ exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)( }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"../../actions/app":575,"../../actions/display":576,"../../common/components/overlay":588,"../../common/lib/FakeWebSocket":597,"../../common/lib/Logger":598,"../../constants":643,"../../reducers/app":670,"./buttons":607,"./clipboard-modal":608,"./pass-form":612,"@nraynaud/novnc/lib/input/keysymdef":7,"@nraynaud/novnc/lib/rfb":10,"canvas-to-blob":120,"classnames":121,"filesaver.js/FileSaver":182,"mobile-detect":228,"react":537,"react-bootstrap":337,"react-intl":475,"react-redux":506}],610:[function(require,module,exports){ +},{"../../actions/app":570,"../../actions/display":571,"../../common/components/overlay":583,"../../common/lib/FakeWebSocket":592,"../../common/lib/Logger":593,"../../constants":638,"../../reducers/app":665,"./buttons":602,"./clipboard-modal":603,"./pass-form":607,"@nraynaud/novnc/lib/input/keysymdef":7,"@nraynaud/novnc/lib/rfb":10,"canvas-to-blob":115,"classnames":116,"filesaver.js/FileSaver":177,"mobile-detect":223,"react":532,"react-bootstrap":332,"react-intl":470,"react-redux":501}],605:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -86305,7 +86223,7 @@ KeyboardButton.propTypes = { exports.default = KeyboardButton; -},{"react":537,"react-bootstrap":337,"react-intl":475}],611:[function(require,module,exports){ +},{"react":532,"react-bootstrap":332,"react-intl":470}],606:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -86443,7 +86361,7 @@ DisplayKeysButton.propTypes = { exports.default = (0, _reactIntl.injectIntl)(DisplayKeysButton); -},{"@nraynaud/novnc/lib/input/keysym":6,"react":537,"react-intl":475}],612:[function(require,module,exports){ +},{"@nraynaud/novnc/lib/input/keysym":6,"react":532,"react-intl":470}],607:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -86576,7 +86494,7 @@ DisplayPassForm.defaultProps = { exports.default = (0, _reactIntl.injectIntl)(DisplayPassForm); -},{"react":537,"react-bootstrap":337,"react-intl":475}],613:[function(require,module,exports){ +},{"react":532,"react-bootstrap":332,"react-intl":470}],608:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -86614,7 +86532,7 @@ Ellipsize.propTypes = { exports.default = Ellipsize; -},{"../common/lib/util":604,"react":537}],614:[function(require,module,exports){ +},{"../common/lib/util":599,"react":532}],609:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -86737,7 +86655,7 @@ Breadcrumbs.defaultProps = { exports.default = Breadcrumbs; -},{"classnames":121,"react":537,"react-bootstrap":337}],615:[function(require,module,exports){ +},{"classnames":116,"react":532,"react-bootstrap":332}],610:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -86904,7 +86822,7 @@ FilesButtons.defaultProps = { exports.default = (0, _reactIntl.injectIntl)(FilesButtons); -},{"../../common/components/refresh-button":596,"./downloads-modal":616,"./uploads-modal":623,"react":537,"react-bootstrap":337,"react-intl":475}],616:[function(require,module,exports){ +},{"../../common/components/refresh-button":591,"./downloads-modal":611,"./uploads-modal":618,"react":532,"react-bootstrap":332,"react-intl":470}],611:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -87008,7 +86926,7 @@ var mapDispatchToProps = function mapDispatchToProps(dispatch) { }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(DownloadsModal); -},{"../../actions/files":577,"../../reducers/files":672,"./downloads":617,"react":537,"react-bootstrap":337,"react-intl":475,"react-redux":506}],617:[function(require,module,exports){ +},{"../../actions/files":572,"../../reducers/files":667,"./downloads":612,"react":532,"react-bootstrap":332,"react-intl":470,"react-redux":501}],612:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -87164,7 +87082,7 @@ var DownloadsContainer = function (_React$Component) { exports.default = DownloadsContainer; -},{"../../lib/files/files-download-controller":653,"../ellipsize":613,"../progress-bar":627,"react":537,"react-bootstrap":337,"react-intl":475}],618:[function(require,module,exports){ +},{"../../lib/files/files-download-controller":648,"../ellipsize":608,"../progress-bar":622,"react":532,"react-bootstrap":332,"react-intl":470}],613:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -87206,7 +87124,7 @@ FileDropMessage.propTypes = { exports.default = FileDropMessage; -},{"react":537,"react-intl":475}],619:[function(require,module,exports){ +},{"react":532,"react-intl":470}],614:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -87279,7 +87197,7 @@ FileDropOverlay.propTypes = { exports.default = FileDropOverlay; -},{"react":537}],620:[function(require,module,exports){ +},{"react":532}],615:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -87386,7 +87304,7 @@ FileDropzone.propTypes = { exports.default = FileDropzone; -},{"./file-drop-overlay":619,"react":537,"react-dropzone":474}],621:[function(require,module,exports){ +},{"./file-drop-overlay":614,"react":532,"react-dropzone":469}],616:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -87939,7 +87857,7 @@ var mapDispatchToProps = function mapDispatchToProps(dispatch) { }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)((0, _reactIntl.injectIntl)(FilesMain)); -},{"../../actions/files":577,"../../lib/files/file-item":650,"../../lib/files/files-download-controller":653,"../../lib/files/files-upload-controller":654,"../../lib/files/user-file":659,"../../reducers/files":672,"./breadcrumbs":614,"./buttons":615,"./file-drop-message":618,"./file-dropzone":620,"./table":622,"react":537,"react-bootstrap":337,"react-intl":475,"react-redux":506}],622:[function(require,module,exports){ +},{"../../actions/files":572,"../../lib/files/file-item":645,"../../lib/files/files-download-controller":648,"../../lib/files/files-upload-controller":649,"../../lib/files/user-file":654,"../../reducers/files":667,"./breadcrumbs":609,"./buttons":610,"./file-drop-message":613,"./file-dropzone":615,"./table":617,"react":532,"react-bootstrap":332,"react-intl":470,"react-redux":501}],617:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -88275,7 +88193,7 @@ FilesTable.defaultProps = { exports.default = (0, _reactIntl.injectIntl)(FilesTable); -},{"../../common/components/data-table":586,"humanize":196,"react":537,"react-bootstrap":337,"react-intl":475}],623:[function(require,module,exports){ +},{"../../common/components/data-table":581,"humanize":191,"react":532,"react-bootstrap":332,"react-intl":470}],618:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -88389,7 +88307,7 @@ var mapDispatchToProps = function mapDispatchToProps(dispatch) { }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(UploadsModal); -},{"../../actions/files":577,"../../reducers/files":672,"./uploads":624,"react":537,"react-bootstrap":337,"react-intl":475,"react-redux":506}],624:[function(require,module,exports){ +},{"../../actions/files":572,"../../reducers/files":667,"./uploads":619,"react":532,"react-bootstrap":332,"react-intl":470,"react-redux":501}],619:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -88642,7 +88560,7 @@ UploadsContainer.propTypes = { exports.default = UploadsContainer; -},{"../../lib/files/files-upload-controller":654,"../../lib/files/user-file":659,"../ellipsize":613,"../progress-bar":627,"./file-drop-message":618,"./file-dropzone":620,"react":537,"react-bootstrap":337,"react-intl":475}],625:[function(require,module,exports){ +},{"../../lib/files/files-upload-controller":649,"../../lib/files/user-file":654,"../ellipsize":608,"../progress-bar":622,"./file-drop-message":613,"./file-dropzone":615,"react":532,"react-bootstrap":332,"react-intl":470}],620:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -88856,7 +88774,7 @@ var mapDispatchToProps = function mapDispatchToProps(dispatch, props) { }; exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(Header); -},{"../actions/app":575,"../reducers/app":670,"./ellipsize":613,"react":537,"react-bootstrap":337,"react-intl":475,"react-redux":506}],626:[function(require,module,exports){ +},{"../actions/app":570,"../reducers/app":665,"./ellipsize":608,"react":532,"react-bootstrap":332,"react-intl":470,"react-redux":501}],621:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -89316,7 +89234,7 @@ InfoPanel.defaultProps = { exports.default = (0, _reactIntl.injectIntl)(InfoPanel); -},{"../constants/auth":640,"../constants/websocket":645,"react":537,"react-bootstrap":337,"react-intl":475}],627:[function(require,module,exports){ +},{"../constants/auth":635,"../constants/websocket":640,"react":532,"react-bootstrap":332,"react-intl":470}],622:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -89381,7 +89299,7 @@ Progress.defaultProps = { exports.default = Progress; -},{"react":537,"react-bootstrap":337}],628:[function(require,module,exports){ +},{"react":532,"react-bootstrap":332}],623:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -89532,7 +89450,7 @@ RequestSection.defaultProps = { exports.default = (0, _reactIntl.injectIntl)(RequestSection); -},{"react":537,"react-bootstrap":337,"react-intl":475}],629:[function(require,module,exports){ +},{"react":532,"react-bootstrap":332,"react-intl":470}],624:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -89640,7 +89558,7 @@ var PersistentSections = exports.PersistentSections = function PersistentSection exports.default = Section; -},{"../components/display":609,"../components/files":621,"../components/info-panel":626,"../components/request-section":628,"../components/share":630,"../components/system":635,"../components/terminal":637,"../processes-manager/components":665,"../services-manager/components/services-main":686,"flux/utils":194,"react":537}],630:[function(require,module,exports){ +},{"../components/display":604,"../components/files":616,"../components/info-panel":621,"../components/request-section":623,"../components/share":625,"../components/system":630,"../components/terminal":632,"../processes-manager/components":660,"../services-manager/components/services-main":681,"flux/utils":189,"react":532}],625:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -90010,7 +89928,7 @@ var mapDispatchToProps = function mapDispatchToProps(dispatch, props) { }; exports.default = (0, _reactIntl.injectIntl)((0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(ShareAgent)); -},{"../actions/agent":574,"react":537,"react-bootstrap":337,"react-intl":475,"react-redux":506}],631:[function(require,module,exports){ +},{"../actions/agent":569,"react":532,"react-bootstrap":332,"react-intl":470,"react-redux":501}],626:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -90117,7 +90035,7 @@ SystemAddress.defaultProps = { exports.default = (0, _reactIntl.injectIntl)(SystemAddress); -},{"react":537,"react-intl":475}],632:[function(require,module,exports){ +},{"react":532,"react-intl":470}],627:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -90228,7 +90146,7 @@ exports.default = (0, _reactRedux.connect)(function () { return { now: new Date() }; })(SystemAgent); -},{"react":537,"react-intl":475,"react-redux":506}],633:[function(require,module,exports){ +},{"react":532,"react-intl":470,"react-redux":501}],628:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -90288,7 +90206,7 @@ SystemDescription.defaultProps = { exports.default = SystemDescription; -},{"react":537}],634:[function(require,module,exports){ +},{"react":532}],629:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -90418,7 +90336,7 @@ SystemHardware.defaultProps = { exports.default = (0, _reactIntl.injectIntl)(SystemHardware); -},{"humanize":196,"react":537,"react-intl":475}],635:[function(require,module,exports){ +},{"humanize":191,"react":532,"react-intl":470}],630:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -90636,7 +90554,7 @@ var mapDispatchToProps = function mapDispatchToProps(dispatch, props) { }; exports.default = (0, _reactIntl.injectIntl)((0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(SystemFetcher)); -},{"../../actions/agent":574,"./address":631,"./agent":632,"./description":633,"./hardware":634,"./os":636,"react":537,"react-bootstrap":337,"react-intl":475,"react-redux":506}],636:[function(require,module,exports){ +},{"../../actions/agent":569,"./address":626,"./agent":627,"./description":628,"./hardware":629,"./os":631,"react":532,"react-bootstrap":332,"react-intl":470,"react-redux":501}],631:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -90771,7 +90689,7 @@ SystemOS.defaultProps = { exports.default = (0, _reactIntl.injectIntl)(SystemOS); -},{"react":537,"react-intl":475}],637:[function(require,module,exports){ +},{"react":532,"react-intl":470}],632:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -90991,7 +90909,7 @@ var mapDispatchToProps = function mapDispatchToProps(dispatch, props) { exports.default = (0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps)(Terminal); -},{"../actions/terminal":578,"../reducers/app":670,"react":537,"react-bootstrap":337,"react-intl":475,"react-redux":506,"xterm":572,"xterm/lib/addons/fit":566}],638:[function(require,module,exports){ +},{"../actions/terminal":573,"../reducers/app":665,"react":532,"react-bootstrap":332,"react-intl":470,"react-redux":501,"xterm":567,"xterm/lib/addons/fit":561}],633:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -91021,7 +90939,7 @@ var FETCH_AGENT_SUCCESS = exports.FETCH_AGENT_SUCCESS = 'CLIENT_FETCH_AGENT_SUCC var FETCH_AGENT_FAILURE = exports.FETCH_AGENT_FAILURE = 'CLIENT_FETCH_AGENT_FAILURE'; var CLEAR_AGENT_ERROR = exports.CLEAR_AGENT_ERROR = 'CLIENT_CLEAR_AGENT_ERROR'; -},{}],639:[function(require,module,exports){ +},{}],634:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -91049,7 +90967,7 @@ var SHOW_HEADER = exports.SHOW_HEADER = 'CLIENT_SHOW_HEADER'; var HIDE_HEADER = exports.HIDE_HEADER = 'CLIENT_HIDE_HEADER'; var UPDATE_DISCONNECT_HANDLER = exports.UPDATE_DISCONNECT_HANDLER = 'CLIENT_UPDATE_DISCONNECT_HANDLER'; -},{}],640:[function(require,module,exports){ +},{}],635:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -91060,7 +90978,7 @@ Object.defineProperty(exports, "__esModule", { var AUTH_INVALID = exports.AUTH_INVALID = 1; var AUTH_TIMEOUT = exports.AUTH_TIMEOUT = 2; -},{}],641:[function(require,module,exports){ +},{}],636:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -91076,7 +90994,7 @@ var DISCONN_DISPLAY_REQUEST = exports.DISCONN_DISPLAY_REQUEST = 'CLIENT_DISCONN_ var DISCONN_DISPLAY_SUCCESS = exports.DISCONN_DISPLAY_SUCCESS = 'CLIENT_DISCONN_DISPLAY_SUCCESS'; var DISCONN_DISPLAY_FAILURE = exports.DISCONN_DISPLAY_FAILURE = 'CLIENT_DISCONN_DISPLAY_FAILURE'; -},{}],642:[function(require,module,exports){ +},{}],637:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -91105,7 +91023,7 @@ var ERROR_DELETE = exports.ERROR_DELETE = 40002; var ERROR_DOWNLOAD = exports.ERROR_DOWNLOAD = 40003; var ERROR_UPLOAD = exports.ERROR_UPLOAD = 40004; -},{}],643:[function(require,module,exports){ +},{}],638:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -91129,7 +91047,7 @@ var PROTO = exports.PROTO = { TEMP_SECTION: 72 }; -},{}],644:[function(require,module,exports){ +},{}],639:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -91142,7 +91060,7 @@ var INIT_TERM_FAILURE = exports.INIT_TERM_FAILURE = 'CLIENT_INIT_TERM_FAILURE'; var SAVE_TERM_DATA = exports.SAVE_TERM_DATA = 'CLIENT_SAVE_TERM_DATA'; var CLEAR_TERM_ERROR = exports.CLEAR_TERM_ERROR = 'CLIENT_CLEAR_TERM_ERROR'; -},{}],645:[function(require,module,exports){ +},{}],640:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -91172,7 +91090,7 @@ var CLOSE_AUTH_TIMEOUT = exports.CLOSE_AUTH_TIMEOUT = 4001; var CLOSE_INACTIVITY = exports.CLOSE_INACTIVITY = 4010; var CLOSE_AUTH_EXPIRED = exports.CLOSE_AUTH_EXPIRED = 4011; -},{}],646:[function(require,module,exports){ +},{}],641:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -91184,7 +91102,7 @@ var _flux = require('flux'); var AppDispatcher = new _flux.Dispatcher(); exports.default = AppDispatcher; -},{"flux":183}],647:[function(require,module,exports){ +},{"flux":178}],642:[function(require,module,exports){ 'use strict'; var _Logger = require('./common/lib/Logger'); @@ -91202,7 +91120,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de window.Logger = _Logger2.default; window.EHorus = _EHorus2.default; -},{"./EHorus":573,"./common/lib/Logger":598,"babel-register":18}],648:[function(require,module,exports){ +},{"./EHorus":568,"./common/lib/Logger":593,"babel-register":13}],643:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -91314,7 +91232,7 @@ var DirItem = function (_FSItem) { exports.default = DirItem; -},{"./fs-item":655}],649:[function(require,module,exports){ +},{"./fs-item":650}],644:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -91471,7 +91389,7 @@ var FileDownload = function () { exports.default = FileDownload; -},{"./file-item":650}],650:[function(require,module,exports){ +},{"./file-item":645}],645:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -91568,7 +91486,7 @@ var FileItem = function (_FSItem) { exports.default = FileItem; -},{"./fs-item":655}],651:[function(require,module,exports){ +},{"./fs-item":650}],646:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -91669,7 +91587,7 @@ var FileUpload = function () { exports.default = FileUpload; -},{"./user-file":659}],652:[function(require,module,exports){ +},{"./user-file":654}],647:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -91766,7 +91684,7 @@ var _userFileReader2 = _interopRequireDefault(_userFileReader); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -},{"./user-file":659,"./user-file-reader":658}],653:[function(require,module,exports){ +},{"./user-file":654,"./user-file-reader":653}],648:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -92066,7 +91984,7 @@ FilesDownloadController.isSupported = window && window.File && window.FileReader exports.default = new FilesDownloadController(); -},{"../../common/lib/Logger":598,"./file-download":649,"./file-item":650,"events":153,"filesaver.js/FileSaver":182}],654:[function(require,module,exports){ +},{"../../common/lib/Logger":593,"./file-download":644,"./file-item":645,"events":148,"filesaver.js/FileSaver":177}],649:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -92439,7 +92357,7 @@ FilesUploadController.isSupported = window && window.File && window.FileReader & exports.default = new FilesUploadController(); -},{"../../common/lib/Logger":598,"./file-upload":651,"./file-worker":652,"./user-file":659,"events":153,"webworkify":556}],655:[function(require,module,exports){ +},{"../../common/lib/Logger":593,"./file-upload":646,"./file-worker":647,"./user-file":654,"events":148,"webworkify":551}],650:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -92480,7 +92398,7 @@ var FSItem = function () { key: 'typeOS', set: function set(typeOS) { this.__typeOS = typeOS; - if (typeOS && typeOS.toLowerCase().includes('win') && !typeOS.toLowerCase().includes('darwin')) { + if (typeOS && typeOS.toLowerCase().includes('win')) { this.__posix = false; this.__win = true; } else { @@ -92633,7 +92551,7 @@ var FSItem = function () { exports.default = FSItem; -},{"../../common/lib/util":604,"./path-parser":657,"path-parse":238}],656:[function(require,module,exports){ +},{"../../common/lib/util":599,"./path-parser":652,"path-parse":233}],651:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -92694,7 +92612,7 @@ exports.default = function () { return (normalizedPath.indexOf(pathParser.sep) === 0 ? normalizedPath.substr(1) : normalizedPath).split(pathParser.sep); }; -},{"./path-parser":657}],657:[function(require,module,exports){ +},{"./path-parser":652}],652:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -92727,7 +92645,7 @@ exports.default = function () { if (mode === MODE_POSIX) return _extends({}, _path2.default, { sep: '/' });else if (mode === MODE_WIN) return _extends({}, _path2.default, { sep: '\\' });else throw new Error('Invalid mode'); }; -},{"path":237}],658:[function(require,module,exports){ +},{"path":232}],653:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -92921,7 +92839,7 @@ var UserFileReader = function (_EventEmitter) { exports.default = UserFileReader; -},{"./user-file":659,"events":153}],659:[function(require,module,exports){ +},{"./user-file":654,"events":148}],654:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -93006,7 +92924,7 @@ var UserFile = function (_FileItem) { exports.default = UserFile; -},{"./dir-item":648,"./file-item":650}],660:[function(require,module,exports){ +},{"./dir-item":643,"./file-item":645}],655:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -93155,7 +93073,7 @@ var Process = function () { exports.default = Process; -},{}],661:[function(require,module,exports){ +},{}],656:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -93292,7 +93210,7 @@ var ProcessesActions = { exports.default = ProcessesActions; -},{"../../common/lib/remote":602,"../../constants":643,"../../dispatcher":646,"../constants":667}],662:[function(require,module,exports){ +},{"../../common/lib/remote":597,"../../constants":638,"../../dispatcher":641,"../constants":662}],657:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -93489,7 +93407,7 @@ ProcessesButtons.defaultProps = { exports.default = (0, _reactIntl.injectIntl)(ProcessesButtons); -},{"../../common/components/BaseComponent":579,"../../common/components/refresh-button":596,"../Process":660,"../actions":661,"react":537,"react-bootstrap":337,"react-intl":475}],663:[function(require,module,exports){ +},{"../../common/components/BaseComponent":574,"../../common/components/refresh-button":591,"../Process":655,"../actions":656,"react":532,"react-bootstrap":332,"react-intl":470}],658:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -93587,7 +93505,7 @@ ProcessesFilter.propTypes = { exports.default = (0, _reactIntl.injectIntl)(ProcessesFilter); -},{"../actions":661,"react":537,"react-bootstrap":337,"react-intl":475}],664:[function(require,module,exports){ +},{"../actions":656,"react":532,"react-bootstrap":332,"react-intl":470}],659:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -93787,7 +93705,7 @@ ProcessesGraphs.defaultProps = { exports.default = (0, _reactIntl.injectIntl)(ProcessesGraphs); -},{"../../common/components/BaseComponent":579,"../../common/components/react-charts":595,"humanize":196,"react":537,"react-intl":475}],665:[function(require,module,exports){ +},{"../../common/components/BaseComponent":574,"../../common/components/react-charts":590,"humanize":191,"react":532,"react-intl":470}],660:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -94088,7 +94006,7 @@ ProcessesMain.propTypes = { exports.default = ProcessesMain; -},{"../../common/lib/Logger":598,"../Process":660,"../actions":661,"../store":668,"./buttons":662,"./filter":663,"./graphs":664,"./table":666,"react":537}],666:[function(require,module,exports){ +},{"../../common/lib/Logger":593,"../Process":655,"../actions":656,"../store":663,"./buttons":657,"./filter":658,"./graphs":659,"./table":661,"react":532}],661:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -94321,7 +94239,7 @@ ProcessesTable.defaultProps = { exports.default = (0, _reactIntl.injectIntl)(ProcessesTable); -},{"../../common/components/BaseComponent":579,"../../common/components/data-table":586,"../Process":660,"../actions":661,"humanize":196,"react":537,"react-bootstrap":337,"react-intl":475}],667:[function(require,module,exports){ +},{"../../common/components/BaseComponent":574,"../../common/components/data-table":581,"../Process":655,"../actions":656,"humanize":191,"react":532,"react-bootstrap":332,"react-intl":470}],662:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -94345,7 +94263,7 @@ var ProcessesConstants = { exports.default = ProcessesConstants; -},{}],668:[function(require,module,exports){ +},{}],663:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -94968,7 +94886,7 @@ var ProcessesStore = function (_Store) { exports.default = new ProcessesStore(_dispatcher2.default); -},{"../../common/lib/Logger":598,"../../dispatcher":646,"../Process":660,"../constants":667,"flux/utils":194}],669:[function(require,module,exports){ +},{"../../common/lib/Logger":593,"../../dispatcher":641,"../Process":655,"../constants":662,"flux/utils":189}],664:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -95203,7 +95121,7 @@ exports.default = function () { } }; -},{"../constants/agent":638}],670:[function(require,module,exports){ +},{"../constants/agent":633}],665:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -95279,7 +95197,7 @@ exports.default = function () { } }; -},{"../constants/app":639,"../reducers/sections":674}],671:[function(require,module,exports){ +},{"../constants/app":634,"../reducers/sections":669}],666:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -95364,7 +95282,7 @@ exports.default = function () { } }; -},{"../constants/display":641}],672:[function(require,module,exports){ +},{"../constants/display":636}],667:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -95872,10 +95790,10 @@ exports.default = function () { return _extends({}, state, { items: itemsReducer(state.items, action), - rootIsWin: typeof rootIsWin !== 'undefined' ? rootIsWin : state.rootIsWin, - rootIsPosix: typeof rootIsPosix !== 'undefined' ? rootIsPosix : state.rootIsPosix, - rootIsReadable: typeof rootIsReadable !== 'undefined' ? rootIsReadable : state.rootIsReadable, - rootIsWritable: typeof rootIsWritable !== 'undefined' ? rootIsWritable : state.rootIsWritable + rootIsWin: rootIsWin, + rootIsPosix: rootIsPosix, + rootIsReadable: rootIsReadable, + rootIsWritable: rootIsWritable }); default: return _extends({}, state, { @@ -95886,7 +95804,7 @@ exports.default = function () { } }; -},{"../constants/files":642,"../lib/files/path-array":656}],673:[function(require,module,exports){ +},{"../constants/files":637,"../lib/files/path-array":651}],668:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -95925,7 +95843,7 @@ exports.default = (0, _redux.combineReducers)({ files: _files2.default }); -},{"../reducers/agent":669,"../reducers/app":670,"../reducers/display":671,"../reducers/files":672,"../reducers/terminal":675,"redux":544}],674:[function(require,module,exports){ +},{"../reducers/agent":664,"../reducers/app":665,"../reducers/display":666,"../reducers/files":667,"../reducers/terminal":670,"redux":539}],669:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -96186,7 +96104,7 @@ exports.default = function () { } }; -},{"../constants/app":639}],675:[function(require,module,exports){ +},{"../constants/app":634}],670:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -96268,7 +96186,7 @@ exports.default = function () { } }; -},{"../constants/terminal":644}],676:[function(require,module,exports){ +},{"../constants/terminal":639}],671:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -96408,7 +96326,7 @@ exports.default = function (remote, dispatch, intl) { var canBeDeleted = typeof data.fileDelete !== 'undefined' ? !!Number.parseInt(data.fileDelete, 10) : false; - var isWin = data.os.toLowerCase().includes('win') && !data.os.toLowerCase().includes('darwin'); + var isWin = data.os.toLowerCase().includes('win'); var isPosix = !isWin; var pathParser = (0, _pathParser2.default)(isWin ? _pathParser.MODE_WIN : _pathParser.MODE_POSIX); // Get rid of mixed separators @@ -96571,7 +96489,7 @@ exports.default = function (remote, dispatch, intl) { }); }; -},{"../actions/files":577,"../common/lib/Logger":598,"../common/lib/base64":599,"../constants":643,"../constants/files":642,"../lib/files/dir-item":648,"../lib/files/files-download-controller":653,"../lib/files/files-upload-controller":654,"../lib/files/path-array":656,"../lib/files/path-parser":657,"react-intl":475}],677:[function(require,module,exports){ +},{"../actions/files":572,"../common/lib/Logger":593,"../common/lib/base64":594,"../constants":638,"../constants/files":637,"../lib/files/dir-item":643,"../lib/files/files-download-controller":648,"../lib/files/files-upload-controller":649,"../lib/files/path-array":651,"../lib/files/path-parser":652,"react-intl":470}],672:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -96684,7 +96602,7 @@ exports.default = function (remote, dispatch, intl) { (0, _terminal2.default)(remote, dispatch, intl); }; -},{"../actions/agent":574,"../actions/app":575,"../common/lib/Logger":598,"../constants":643,"../responses/files":676,"../responses/processes":678,"../responses/services":679,"../responses/system":680,"../responses/terminal":681}],678:[function(require,module,exports){ +},{"../actions/agent":569,"../actions/app":570,"../common/lib/Logger":593,"../constants":638,"../responses/files":671,"../responses/processes":673,"../responses/services":674,"../responses/system":675,"../responses/terminal":676}],673:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -96790,7 +96708,7 @@ exports.default = function (remote, dispatch) { }); }; -},{"../common/lib/Logger":598,"../constants":643,"../processes-manager/actions":661}],679:[function(require,module,exports){ +},{"../common/lib/Logger":593,"../constants":638,"../processes-manager/actions":656}],674:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -96868,7 +96786,7 @@ exports.default = function (remote, dispatch) { }); }; -},{"../common/lib/Logger":598,"../constants":643,"../services-manager/actions":683}],680:[function(require,module,exports){ +},{"../common/lib/Logger":593,"../constants":638,"../services-manager/actions":678}],675:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -97111,7 +97029,7 @@ exports.default = function (remote, dispatch) { }); }; -},{"../actions/agent":574,"../actions/app":575,"../common/lib/Logger":598,"../constants":643}],681:[function(require,module,exports){ +},{"../actions/agent":569,"../actions/app":570,"../common/lib/Logger":593,"../constants":638}],676:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -97157,7 +97075,7 @@ exports.default = function (remote, dispatch) { }); }; -},{"../actions/terminal":578,"../common/lib/Logger":598,"../constants":643}],682:[function(require,module,exports){ +},{"../actions/terminal":573,"../common/lib/Logger":593,"../constants":638}],677:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -97405,7 +97323,7 @@ var Service = function () { exports.default = Service; -},{}],683:[function(require,module,exports){ +},{}],678:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -97559,7 +97477,7 @@ var ServicesActions = { exports.default = ServicesActions; -},{"../../common/lib/remote":602,"../../constants":643,"../../dispatcher":646,"../constants":688}],684:[function(require,module,exports){ +},{"../../common/lib/remote":597,"../../constants":638,"../../dispatcher":641,"../constants":683}],679:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -97849,7 +97767,7 @@ var ServicesButtons = function (_BaseComponent) { exports.default = (0, _reactIntl.injectIntl)(ServicesButtons); -},{"../../../common/components/BaseComponent":579,"../../../common/components/refresh-button":596,"../../Service":682,"../../actions":683,"react":537,"react-bootstrap":337,"react-intl":475}],685:[function(require,module,exports){ +},{"../../../common/components/BaseComponent":574,"../../../common/components/refresh-button":591,"../../Service":677,"../../actions":678,"react":532,"react-bootstrap":332,"react-intl":470}],680:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -98006,7 +97924,7 @@ ServicesFilter.propTypes = { exports.default = (0, _reactIntl.injectIntl)(ServicesFilter); -},{"../../Service":682,"../../actions":683,"react":537,"react-bootstrap":337,"react-intl":475}],686:[function(require,module,exports){ +},{"../../Service":677,"../../actions":678,"react":532,"react-bootstrap":332,"react-intl":470}],681:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -98251,7 +98169,7 @@ ServicesMainPure.propTypes = Object.assign({}, ServicesMain.propTypes, { exports.default = ServicesMain; -},{"../../../common/lib/Logger":598,"../../Service":682,"../../actions":683,"../../store":689,"../services-buttons":684,"../services-filter":685,"../services-table":687,"react":537,"react-bootstrap":337,"react-intl":475}],687:[function(require,module,exports){ +},{"../../../common/lib/Logger":593,"../../Service":677,"../../actions":678,"../../store":684,"../services-buttons":679,"../services-filter":680,"../services-table":682,"react":532,"react-bootstrap":332,"react-intl":470}],682:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -98472,7 +98390,7 @@ var ServicesTable = function (_BaseComponent) { exports.default = (0, _reactIntl.injectIntl)(ServicesTable); -},{"../../../common/components/BaseComponent":579,"../../../common/components/data-table":586,"../../Service":682,"../../actions":683,"react":537,"react-bootstrap":337,"react-intl":475}],688:[function(require,module,exports){ +},{"../../../common/components/BaseComponent":574,"../../../common/components/data-table":581,"../../Service":677,"../../actions":678,"react":532,"react-bootstrap":332,"react-intl":470}],683:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -98495,7 +98413,7 @@ var ServicesConstants = { exports.default = ServicesConstants; -},{}],689:[function(require,module,exports){ +},{}],684:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -98966,7 +98884,7 @@ var ServicesStore = function (_Store) { exports.default = new ServicesStore(_dispatcher2.default); -},{"../../common/lib/Logger":598,"../../dispatcher":646,"../Service":682,"../constants":688,"flux/utils":194}],690:[function(require,module,exports){ +},{"../../common/lib/Logger":593,"../../dispatcher":641,"../Service":677,"../constants":683,"flux/utils":189}],685:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -98998,7 +98916,7 @@ function configureStore() { // Reducers -},{"../reducers":673,"redux":544,"redux-thunk":538}],691:[function(require,module,exports){ +},{"../reducers":668,"redux":539,"redux-thunk":533}],686:[function(require,module,exports){ module.exports={ "disconnect": "Disconnect", "terminal": "Terminal", @@ -99149,7 +99067,7 @@ module.exports={ "upload-drop": "Drop the file to start the upload" } -},{}],692:[function(require,module,exports){ +},{}],687:[function(require,module,exports){ module.exports={ "disconnect": "Desconectar", "terminal": "Consola", @@ -99300,5 +99218,5 @@ module.exports={ "upload-drop": "Suelta el archivo para comenzar la subida" } -},{}]},{},[647]) -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvQG5yYXluYXVkL25vdm5jL2xpYi9iYXNlNjQuanMiLCJub2RlX21vZHVsZXMvQG5yYXluYXVkL25vdm5jL2xpYi9kZXMuanMiLCJub2RlX21vZHVsZXMvQG5yYXluYXVkL25vdm5jL2xpYi9kaXNwbGF5LmpzIiwibm9kZV9tb2R1bGVzL0BucmF5bmF1ZC9ub3ZuYy9saWIvaW5mbGF0b3IuanMiLCJub2RlX21vZHVsZXMvQG5yYXluYXVkL25vdm5jL2xpYi9pbnB1dC9kZXZpY2VzLmpzIiwibm9kZV9tb2R1bGVzL0BucmF5bmF1ZC9ub3ZuYy9saWIvaW5wdXQva2V5c3ltLmpzIiwibm9kZV9tb2R1bGVzL0BucmF5bmF1ZC9ub3ZuYy9saWIvaW5wdXQva2V5c3ltZGVmLmpzIiwibm9kZV9tb2R1bGVzL0BucmF5bmF1ZC9ub3ZuYy9saWIvaW5wdXQvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9AbnJheW5hdWQvbm92bmMvbGliL2lucHV0L3h0c2NhbmNvZGVzLmpzIiwibm9kZV9tb2R1bGVzL0BucmF5bmF1ZC9ub3ZuYy9saWIvcmZiLmpzIiwibm9kZV9tb2R1bGVzL0BucmF5bmF1ZC9ub3ZuYy9saWIvdXRpbC9icm93c2Vycy5qcyIsIm5vZGVfbW9kdWxlcy9AbnJheW5hdWQvbm92bmMvbGliL3V0aWwvZXZlbnRzLmpzIiwibm9kZV9tb2R1bGVzL0BucmF5bmF1ZC9ub3ZuYy9saWIvdXRpbC9sb2NhbGl6YXRpb24uanMiLCJub2RlX21vZHVsZXMvQG5yYXluYXVkL25vdm5jL2xpYi91dGlsL2xvZ2dpbmcuanMiLCJub2RlX21vZHVsZXMvQG5yYXluYXVkL25vdm5jL2xpYi91dGlsL3Byb3BlcnRpZXMuanMiLCJub2RlX21vZHVsZXMvQG5yYXluYXVkL25vdm5jL2xpYi91dGlsL3N0cmluZ3MuanMiLCJub2RlX21vZHVsZXMvQG5yYXluYXVkL25vdm5jL2xpYi93ZWJzb2NrLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJlZ2lzdGVyL2xpYi9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9hcnJheS9mcm9tLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZW50cmllcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L3NldC1wcm90b3R5cGUtb2YuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC92YWx1ZXMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL3N5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvc3ltYm9sL2l0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy90eXBlb2YuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL2FycmF5L2Zyb20uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9lbnRyaWVzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3Qvc2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L3ZhbHVlcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9zeW1ib2wvaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2EtZnVuY3Rpb24uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1pbmNsdWRlcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY2xhc3NvZi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29mLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb3JlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jcmVhdGUtcHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2N0eC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2VudW0tYnVnLWtleXMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2VudW0ta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZXhwb3J0LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19mYWlscy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZ2xvYmFsLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oYXMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2hpZGUuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2h0bWwuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItc3RlcC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlcmF0b3JzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19rZXlvZi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbGlicmFyeS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbWV0YS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWFzc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWRwLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHBzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wZC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcG4tZXh0LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wbi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcHMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1ncG8uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1rZXlzLWludGVybmFsLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LXBpZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LXRvLWFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19yZWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXByb3RvLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtdG8tc3RyaW5nLXRhZy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2hhcmVkLWtleS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2hhcmVkLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zdHJpbmctYXQuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWluZGV4LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pbnRlZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1sZW5ndGguanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL191aWQuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3drcy1kZWZpbmUuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3drcy1leHQuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3drcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5LmZyb20uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5zeW1ib2wuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3Lm9iamVjdC5lbnRyaWVzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5vYmplY3QudmFsdWVzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5zeW1ib2wuYXN5bmMtaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanMiLCJub2RlX21vZHVsZXMvY2FudmFzLXRvLWJsb2IvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2xhc3NuYW1lcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9kMy9kMy5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy9hY3RpdmVFbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2NsYXNzL2FkZENsYXNzLmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2NsYXNzL2hhc0NsYXNzLmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2NsYXNzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2NsYXNzL3JlbW92ZUNsYXNzLmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2V2ZW50cy9maWx0ZXIuanMiLCJub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXZlbnRzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2V2ZW50cy9saXN0ZW4uanMiLCJub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXZlbnRzL29mZi5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy9ldmVudHMvb24uanMiLCJub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvb3duZXJEb2N1bWVudC5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy9xdWVyeS9jb250YWlucy5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy9xdWVyeS9pc1dpbmRvdy5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy9xdWVyeS9vZmZzZXQuanMiLCJub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvcXVlcnkvb2Zmc2V0UGFyZW50LmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL3F1ZXJ5L3Bvc2l0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL3F1ZXJ5L3F1ZXJ5U2VsZWN0b3JBbGwuanMiLCJub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvcXVlcnkvc2Nyb2xsTGVmdC5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy9xdWVyeS9zY3JvbGxUb3AuanMiLCJub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvc3R5bGUvZ2V0Q29tcHV0ZWRTdHlsZS5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy9zdHlsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy9zdHlsZS9yZW1vdmVTdHlsZS5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy90cmFuc2l0aW9uL2lzVHJhbnNmb3JtLmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL3RyYW5zaXRpb24vcHJvcGVydGllcy5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy91dGlsL2NhbWVsaXplLmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL3V0aWwvY2FtZWxpemVTdHlsZS5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy91dGlsL2h5cGhlbmF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy91dGlsL2h5cGhlbmF0ZVN0eWxlLmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL3V0aWwvaW5ET00uanMiLCJub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvdXRpbC9zY3JvbGxiYXJTaXplLmpzIiwibm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCJub2RlX21vZHVsZXMvZmJlbWl0dGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2ZiZW1pdHRlci9saWIvQmFzZUV2ZW50RW1pdHRlci5qcyIsIm5vZGVfbW9kdWxlcy9mYmVtaXR0ZXIvbGliL0VtaXR0ZXJTdWJzY3JpcHRpb24uanMiLCJub2RlX21vZHVsZXMvZmJlbWl0dGVyL2xpYi9FdmVudFN1YnNjcmlwdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9mYmVtaXR0ZXIvbGliL0V2ZW50U3Vic2NyaXB0aW9uVmVuZG9yLmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL0V2ZW50TGlzdGVuZXIuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvRXhlY3V0aW9uRW52aXJvbm1lbnQuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvY2FtZWxpemUuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvY2FtZWxpemVTdHlsZU5hbWUuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvY29udGFpbnNOb2RlLmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL2NyZWF0ZUFycmF5RnJvbU1peGVkLmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL2NyZWF0ZU5vZGVzRnJvbU1hcmt1cC5qcyIsIm5vZGVfbW9kdWxlcy9mYmpzL2xpYi9lbXB0eUZ1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL2VtcHR5T2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL2ZvY3VzTm9kZS5qcyIsIm5vZGVfbW9kdWxlcy9mYmpzL2xpYi9nZXRBY3RpdmVFbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL2dldE1hcmt1cFdyYXAuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb24uanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvaHlwaGVuYXRlLmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL2h5cGhlbmF0ZVN0eWxlTmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9mYmpzL2xpYi9pbnZhcmlhbnQuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvaXNOb2RlLmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL2lzVGV4dE5vZGUuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvbWVtb2l6ZVN0cmluZ09ubHkuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvcGVyZm9ybWFuY2UuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvcGVyZm9ybWFuY2VOb3cuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvc2hhbGxvd0VxdWFsLmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL3dhcm5pbmcuanMiLCJub2RlX21vZHVsZXMvZmlsZXNhdmVyLmpzL0ZpbGVTYXZlci5qcyIsIm5vZGVfbW9kdWxlcy9mbHV4L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2ZsdXgvbGliL0Rpc3BhdGNoZXIuanMiLCJub2RlX21vZHVsZXMvZmx1eC9saWIvRmx1eENvbnRhaW5lci5qcyIsIm5vZGVfbW9kdWxlcy9mbHV4L2xpYi9GbHV4TWFwU3RvcmUuanMiLCJub2RlX21vZHVsZXMvZmx1eC9saWIvRmx1eE1peGluTGVnYWN5LmpzIiwibm9kZV9tb2R1bGVzL2ZsdXgvbGliL0ZsdXhSZWR1Y2VTdG9yZS5qcyIsIm5vZGVfbW9kdWxlcy9mbHV4L2xpYi9GbHV4U3RvcmUuanMiLCJub2RlX21vZHVsZXMvZmx1eC9saWIvRmx1eFN0b3JlR3JvdXAuanMiLCJub2RlX21vZHVsZXMvZmx1eC9saWIvYWJzdHJhY3RNZXRob2QuanMiLCJub2RlX21vZHVsZXMvZmx1eC9ub2RlX21vZHVsZXMvZmJqcy9saWIvaW52YXJpYW50LmpzIiwibm9kZV9tb2R1bGVzL2ZsdXgvbm9kZV9tb2R1bGVzL2ZianMvbGliL3NoYWxsb3dFcXVhbC5qcyIsIm5vZGVfbW9kdWxlcy9mbHV4L3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2h1bWFuaXplL2h1bWFuaXplLmpzIiwibm9kZV9tb2R1bGVzL2ltbXV0YWJsZS9kaXN0L2ltbXV0YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLWZvcm1hdC1jYWNoZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLWZvcm1hdC1jYWNoZS9saWIvZXM1LmpzIiwibm9kZV9tb2R1bGVzL2ludGwtZm9ybWF0LWNhY2hlL2xpYi9tZW1vaXplci5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLW1lc3NhZ2Vmb3JtYXQtcGFyc2VyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2ludGwtbWVzc2FnZWZvcm1hdC1wYXJzZXIvbGliL3BhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLW1lc3NhZ2Vmb3JtYXQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaW50bC1tZXNzYWdlZm9ybWF0L2xpYi9jb21waWxlci5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLW1lc3NhZ2Vmb3JtYXQvbGliL2NvcmUuanMiLCJub2RlX21vZHVsZXMvaW50bC1tZXNzYWdlZm9ybWF0L2xpYi9lbi5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLW1lc3NhZ2Vmb3JtYXQvbGliL2VzNS5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLW1lc3NhZ2Vmb3JtYXQvbGliL21haW4uanMiLCJub2RlX21vZHVsZXMvaW50bC1tZXNzYWdlZm9ybWF0L2xpYi91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLXJlbGF0aXZlZm9ybWF0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2ludGwtcmVsYXRpdmVmb3JtYXQvbGliL2NvcmUuanMiLCJub2RlX21vZHVsZXMvaW50bC1yZWxhdGl2ZWZvcm1hdC9saWIvZGlmZi5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLXJlbGF0aXZlZm9ybWF0L2xpYi9lbi5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLXJlbGF0aXZlZm9ybWF0L2xpYi9lczUuanMiLCJub2RlX21vZHVsZXMvaW52YXJpYW50L2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMva2V5Y29kZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1N5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19mcmVlR2xvYmFsLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0UHJvdG90eXBlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0UmF3VGFnLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fb2JqZWN0VG9TdHJpbmcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19vdmVyQXJnLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fcm9vdC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3RMaWtlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1BsYWluT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL21vYmlsZS1kZXRlY3QvbW9iaWxlLWRldGVjdC5qcyIsIm5vZGVfbW9kdWxlcy9vYmplY3QtYXNzaWduL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3V0aWxzL2NvbW1vbi5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2FkbGVyMzIuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jcmMzMi5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZmZhc3QuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mdHJlZXMuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi96c3RyZWFtLmpzIiwibm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYXRoLXBhcnNlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2NoZWNrUHJvcFR5cGVzLmpzIiwibm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvZmFjdG9yeS5qcyIsIm5vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcy5qcyIsIm5vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzIiwibm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJub2RlX21vZHVsZXMvcHVueWNvZGUvcHVueWNvZGUuanMiLCJub2RlX21vZHVsZXMvcXVlcnlzdHJpbmctZXMzL2RlY29kZS5qcyIsIm5vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvZW5jb2RlLmpzIiwibm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0FjY29yZGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0FsZXJ0LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvQmFkZ2UuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9CcmVhZGNydW1iLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvQnJlYWRjcnVtYkl0ZW0uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9CdXR0b24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9CdXR0b25Hcm91cC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0J1dHRvblRvb2xiYXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9DYXJvdXNlbC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0Nhcm91c2VsQ2FwdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0Nhcm91c2VsSXRlbS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0NoZWNrYm94LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvQ2xlYXJmaXguanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9DbG9zZUJ1dHRvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0NvbC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0NvbGxhcHNlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvQ29udHJvbExhYmVsLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvRHJvcGRvd24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9Ecm9wZG93bkJ1dHRvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0Ryb3Bkb3duTWVudS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0Ryb3Bkb3duVG9nZ2xlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvRmFkZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0Zvcm0uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9Gb3JtQ29udHJvbC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0Zvcm1Db250cm9sRmVlZGJhY2suanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9Gb3JtQ29udHJvbFN0YXRpYy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0Zvcm1Hcm91cC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0dseXBoaWNvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0dyaWQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9IZWxwQmxvY2suanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9JbWFnZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0lucHV0R3JvdXAuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9JbnB1dEdyb3VwQWRkb24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9JbnB1dEdyb3VwQnV0dG9uLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvSnVtYm90cm9uLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvTGFiZWwuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9MaXN0R3JvdXAuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9MaXN0R3JvdXBJdGVtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvTWVkaWEuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9NZWRpYUJvZHkuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9NZWRpYUhlYWRpbmcuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9NZWRpYUxlZnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9NZWRpYUxpc3QuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9NZWRpYUxpc3RJdGVtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvTWVkaWFSaWdodC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL01lbnVJdGVtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvTW9kYWwuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9Nb2RhbEJvZHkuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9Nb2RhbERpYWxvZy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL01vZGFsRm9vdGVyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvTW9kYWxIZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9Nb2RhbFRpdGxlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvTmF2LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvTmF2RHJvcGRvd24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9OYXZJdGVtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvTmF2YmFyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvTmF2YmFyQnJhbmQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9OYXZiYXJDb2xsYXBzZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL05hdmJhckhlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL05hdmJhclRvZ2dsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL092ZXJsYXkuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9PdmVybGF5VHJpZ2dlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1BhZ2VIZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9QYWdlSXRlbS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1BhZ2VyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvUGFnZXJJdGVtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvUGFnaW5hdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1BhZ2luYXRpb25CdXR0b24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9QYW5lbC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1BhbmVsR3JvdXAuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9Qb3BvdmVyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvUHJvZ3Jlc3NCYXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9SYWRpby5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1Jlc3BvbnNpdmVFbWJlZC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1Jvdy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1NhZmVBbmNob3IuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9TcGxpdEJ1dHRvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1NwbGl0VG9nZ2xlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvVGFiLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvVGFiQ29udGFpbmVyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvVGFiQ29udGVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1RhYlBhbmUuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9UYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1RhYnMuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9UaHVtYm5haWwuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9Ub29sdGlwLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvV2VsbC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvdXRpbHMvUHJvcFR5cGVzLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvdXRpbHMvU3R5bGVDb25maWcuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi91dGlscy9UcmFuc2l0aW9uRXZlbnRzLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvdXRpbHMvVmFsaWRDb21wb25lbnRDaGlsZHJlbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL3V0aWxzL2Jvb3RzdHJhcFV0aWxzLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvdXRpbHMvY2FwaXRhbGl6ZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL3V0aWxzL2NyZWF0ZUNoYWluZWRGdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL3V0aWxzL2RlcHJlY2F0aW9uV2FybmluZy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL3V0aWxzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvdXRpbHMvc3BsaXRDb21wb25lbnRQcm9wcy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9BUklBRE9NUHJvcGVydHlDb25maWcuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9BdXRvRm9jdXNVdGlscy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0JlZm9yZUlucHV0RXZlbnRQbHVnaW4uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9DU1NQcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0NTU1Byb3BlcnR5T3BlcmF0aW9ucy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0NhbGxiYWNrUXVldWUuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9DaGFuZ2VFdmVudFBsdWdpbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0RPTUNoaWxkcmVuT3BlcmF0aW9ucy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0RPTUxhenlUcmVlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvRE9NTmFtZXNwYWNlcy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0RPTVByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvRE9NUHJvcGVydHlPcGVyYXRpb25zLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvRGFuZ2VyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvRGVmYXVsdEV2ZW50UGx1Z2luT3JkZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9FbnRlckxlYXZlRXZlbnRQbHVnaW4uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9FdmVudFBsdWdpbkh1Yi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0V2ZW50UGx1Z2luUmVnaXN0cnkuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9FdmVudFBsdWdpblV0aWxzLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvRXZlbnRQcm9wYWdhdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0ZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0hUTUxET01Qcm9wZXJ0eUNvbmZpZy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0tleUVzY2FwZVV0aWxzLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvTGlua2VkVmFsdWVVdGlscy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1Bvb2xlZENsYXNzLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RDaGlsZFJlY29uY2lsZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdENvbXBvc2l0ZUNvbXBvbmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01Db21wb25lbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTUNvbXBvbmVudEZsYWdzLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01Db21wb25lbnRUcmVlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01Db250YWluZXJJbmZvLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01FbXB0eUNvbXBvbmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NRmVhdHVyZUZsYWdzLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01JRE9wZXJhdGlvbnMuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTUlucHV0LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01JbnZhbGlkQVJJQUhvb2suanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTU51bGxJbnB1dFZhbHVlUHJvcEhvb2suanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTU9wdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NU2VsZWN0LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01TZWxlY3Rpb24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTVRleHRDb21wb25lbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTVRleHRhcmVhLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01UcmVlVHJhdmVyc2FsLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01Vbmtub3duUHJvcGVydHlIb29rLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3REZWJ1Z1Rvb2wuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3REZWZhdWx0SW5qZWN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RFbGVtZW50U3ltYm9sLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RFbXB0eUNvbXBvbmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RXJyb3JVdGlscy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RXZlbnRFbWl0dGVyTWl4aW4uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdEV2ZW50TGlzdGVuZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdEZlYXR1cmVGbGFncy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0SG9zdENvbXBvbmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RJbmplY3Rpb24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdElucHV0U2VsZWN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RJbnN0YW5jZU1hcC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0SW5zdHJ1bWVudGF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RJbnZhbGlkU2V0U3RhdGVXYXJuaW5nSG9vay5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0TWFya3VwQ2hlY2tzdW0uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdE1vdW50LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RNdWx0aUNoaWxkLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3ROb2RlVHlwZXMuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdE93bmVyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdFJlY29uY2lsZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdFJlZi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdFNlcnZlclVwZGF0ZVF1ZXVlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RVcGRhdGVRdWV1ZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0VXBkYXRlcy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0VmVyc2lvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1NWR0RPTVByb3BlcnR5Q29uZmlnLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvU2VsZWN0RXZlbnRQbHVnaW4uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9TaW1wbGVFdmVudFBsdWdpbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0FuaW1hdGlvbkV2ZW50LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvU3ludGhldGljQ2xpcGJvYXJkRXZlbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvU3ludGhldGljRHJhZ0V2ZW50LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvU3ludGhldGljRXZlbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNGb2N1c0V2ZW50LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvU3ludGhldGljSW5wdXRFdmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0tleWJvYXJkRXZlbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNNb3VzZUV2ZW50LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvU3ludGhldGljVG91Y2hFdmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY1RyYW5zaXRpb25FdmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY1VJRXZlbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNXaGVlbEV2ZW50LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvVHJhbnNhY3Rpb24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9WaWV3cG9ydE1ldHJpY3MuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9hY2N1bXVsYXRlSW50by5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2FkbGVyMzIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9jaGVja1JlYWN0VHlwZVNwZWMuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9jcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvZGFuZ2Vyb3VzU3R5bGVWYWx1ZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2VzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2ZpbmRET01Ob2RlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvZmxhdHRlbkNoaWxkcmVuLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvZm9yRWFjaEFjY3VtdWxhdGVkLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvZ2V0RXZlbnRDaGFyQ29kZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldEV2ZW50S2V5LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvZ2V0RXZlbnRNb2RpZmllclN0YXRlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvZ2V0RXZlbnRUYXJnZXQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9nZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldEl0ZXJhdG9yRm4uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9nZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvZ2V0VGV4dENvbnRlbnRBY2Nlc3Nvci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldFZlbmRvclByZWZpeGVkRXZlbnROYW1lLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2lzRXZlbnRTdXBwb3J0ZWQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9pc1RleHRJbnB1dEVsZW1lbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9xdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL3JlYWN0UHJvZEludmFyaWFudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvc2V0SW5uZXJIVE1MLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvc2V0VGV4dENvbnRlbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9zaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL3RyYXZlcnNlQWxsQ2hpbGRyZW4uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi92YWxpZGF0ZURPTU5lc3RpbmcuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZHJvcHpvbmUvZGlzdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1pbnRsL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1pbnRsL2xvY2FsZS1kYXRhL2VuLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWludGwvbG9jYWxlLWRhdGEvZXMuanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL01vZGFsLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LW92ZXJsYXlzL2xpYi9Nb2RhbE1hbmFnZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL092ZXJsYXkuanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL1BvcnRhbC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1vdmVybGF5cy9saWIvUG9zaXRpb24uanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL1Jvb3RDbG9zZVdyYXBwZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL1RyYW5zaXRpb24uanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL3V0aWxzL2FkZEV2ZW50TGlzdGVuZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL3V0aWxzL2FkZEZvY3VzTGlzdGVuZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL3V0aWxzL2NhbGN1bGF0ZVBvc2l0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LW92ZXJsYXlzL2xpYi91dGlscy9nZXRDb250YWluZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL3V0aWxzL2lzT3ZlcmZsb3dpbmcuanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL3V0aWxzL21hbmFnZUFyaWFIaWRkZW4uanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL3V0aWxzL293bmVyRG9jdW1lbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtcHJvcC10eXBlcy9saWIvYWxsLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LXByb3AtdHlwZXMvbGliL2NvbXBvbmVudE9yRWxlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1wcm9wLXR5cGVzL2xpYi9pc1JlcXVpcmVkRm9yQTExeS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1wcm9wLXR5cGVzL2xpYi91dGlscy9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9saWIvY29tcG9uZW50cy9Qcm92aWRlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9saWIvY29tcG9uZW50cy9jb25uZWN0QWR2YW5jZWQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbGliL2Nvbm5lY3QvY29ubmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9saWIvY29ubmVjdC9tYXBEaXNwYXRjaFRvUHJvcHMuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbGliL2Nvbm5lY3QvbWFwU3RhdGVUb1Byb3BzLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2xpYi9jb25uZWN0L21lcmdlUHJvcHMuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbGliL2Nvbm5lY3Qvc2VsZWN0b3JGYWN0b3J5LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2xpYi9jb25uZWN0L3ZlcmlmeVN1YnNlbGVjdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9saWIvY29ubmVjdC93cmFwTWFwVG9Qcm9wcy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbGliL3V0aWxzL1Byb3BUeXBlcy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9saWIvdXRpbHMvU3Vic2NyaXB0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2xpYi91dGlscy9zaGFsbG93RXF1YWwuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbGliL3V0aWxzL3ZlcmlmeVBsYWluT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2xpYi91dGlscy93YXJuaW5nLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9SZWFjdC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RDaGlsZHJlbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RDbGFzcy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RDb21wb25lbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2suanMiLCJub2RlX21vZHVsZXMvcmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9SZWFjdERPTUZhY3Rvcmllcy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RFbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9SZWFjdEVsZW1lbnRWYWxpZGF0b3IuanMiLCJub2RlX21vZHVsZXMvcmVhY3QvbGliL1JlYWN0Tm9vcFVwZGF0ZVF1ZXVlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9SZWFjdFByb3BUeXBlcy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RQdXJlQ29tcG9uZW50LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9jYW5EZWZpbmVQcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvY2hlY2tSZWFjdFR5cGVTcGVjLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9nZXROZXh0RGVidWdJRC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvb25seUNoaWxkLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0L2xpYi90cmF2ZXJzZUFsbENoaWxkcmVuLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0L3JlYWN0LmpzIiwibm9kZV9tb2R1bGVzL3JlZHV4LXRodW5rL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yZWR1eC9saWIvYXBwbHlNaWRkbGV3YXJlLmpzIiwibm9kZV9tb2R1bGVzL3JlZHV4L2xpYi9iaW5kQWN0aW9uQ3JlYXRvcnMuanMiLCJub2RlX21vZHVsZXMvcmVkdXgvbGliL2NvbWJpbmVSZWR1Y2Vycy5qcyIsIm5vZGVfbW9kdWxlcy9yZWR1eC9saWIvY29tcG9zZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWR1eC9saWIvY3JlYXRlU3RvcmUuanMiLCJub2RlX21vZHVsZXMvcmVkdXgvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlZHV4L2xpYi91dGlscy93YXJuaW5nLmpzIiwibm9kZV9tb2R1bGVzL3N5bWJvbC1vYnNlcnZhYmxlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3N5bWJvbC1vYnNlcnZhYmxlL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zeW1ib2wtb2JzZXJ2YWJsZS9saWIvcG9ueWZpbGwuanMiLCJub2RlX21vZHVsZXMvdW5jb250cm9sbGFibGUvY3JlYXRlVW5jb250cm9sbGFibGUuanMiLCJub2RlX21vZHVsZXMvdW5jb250cm9sbGFibGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdW5jb250cm9sbGFibGUvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvdXJsL3VybC5qcyIsIm5vZGVfbW9kdWxlcy91cmwvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy91dGY4L3V0ZjguanMiLCJub2RlX21vZHVsZXMvd2FybmluZy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3dlYndvcmtpZnkvaW5kZXguanMiLCJub2RlX21vZHVsZXMveHRlcm0vbGliL0NoYXJzZXRzLmpzIiwibm9kZV9tb2R1bGVzL3h0ZXJtL2xpYi9Db21wb3NpdGlvbkhlbHBlci5qcyIsIm5vZGVfbW9kdWxlcy94dGVybS9saWIvRXNjYXBlU2VxdWVuY2VzLmpzIiwibm9kZV9tb2R1bGVzL3h0ZXJtL2xpYi9FdmVudEVtaXR0ZXIuanMiLCJub2RlX21vZHVsZXMveHRlcm0vbGliL0lucHV0SGFuZGxlci5qcyIsIm5vZGVfbW9kdWxlcy94dGVybS9saWIvTGlua2lmaWVyLmpzIiwibm9kZV9tb2R1bGVzL3h0ZXJtL2xpYi9QYXJzZXIuanMiLCJub2RlX21vZHVsZXMveHRlcm0vbGliL1JlbmRlcmVyLmpzIiwibm9kZV9tb2R1bGVzL3h0ZXJtL2xpYi9WaWV3cG9ydC5qcyIsIm5vZGVfbW9kdWxlcy94dGVybS9saWIvYWRkb25zL2ZpdC9maXQuanMiLCJub2RlX21vZHVsZXMveHRlcm0vbGliL2hhbmRsZXJzL0NsaXBib2FyZC5qcyIsIm5vZGVfbW9kdWxlcy94dGVybS9saWIvdXRpbHMvQnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy94dGVybS9saWIvdXRpbHMvQ2hhck1lYXN1cmUuanMiLCJub2RlX21vZHVsZXMveHRlcm0vbGliL3V0aWxzL0NpcmN1bGFyTGlzdC5qcyIsIm5vZGVfbW9kdWxlcy94dGVybS9saWIvdXRpbHMvR2VuZXJpYy5qcyIsIm5vZGVfbW9kdWxlcy94dGVybS9saWIveHRlcm0uanMiLCJzcmMvRUhvcnVzLmpzIiwic3JjL2FjdGlvbnMvYWdlbnQuanMiLCJzcmMvYWN0aW9ucy9hcHAuanMiLCJzcmMvYWN0aW9ucy9kaXNwbGF5LmpzIiwic3JjL2FjdGlvbnMvZmlsZXMuanMiLCJzcmMvYWN0aW9ucy90ZXJtaW5hbC5qcyIsInNyYy9jb21tb24vY29tcG9uZW50cy9CYXNlQ29tcG9uZW50LmpzeCIsInNyYy9jb21tb24vY29tcG9uZW50cy9kYXRhLXRhYmxlL2NvbXBvbmVudHMvQ2VsbC5qc3giLCJzcmMvY29tbW9uL2NvbXBvbmVudHMvZGF0YS10YWJsZS9jb21wb25lbnRzL0hlYWRDZWxsLmpzeCIsInNyYy9jb21tb24vY29tcG9uZW50cy9kYXRhLXRhYmxlL2NvbXBvbmVudHMvUm93LmpzeCIsInNyYy9jb21tb24vY29tcG9uZW50cy9kYXRhLXRhYmxlL2NvbXBvbmVudHMvVEJvZHkuanN4Iiwic3JjL2NvbW1vbi9jb21wb25lbnRzL2RhdGEtdGFibGUvY29tcG9uZW50cy9USGVhZC5qc3giLCJzcmMvY29tbW9uL2NvbXBvbmVudHMvZGF0YS10YWJsZS9jb21wb25lbnRzL1RhYmxlLmpzeCIsInNyYy9jb21tb24vY29tcG9uZW50cy9kYXRhLXRhYmxlL2luZGV4LmpzIiwic3JjL2NvbW1vbi9jb21wb25lbnRzL2RhdGEtdGFibGUvbGliL0NvbHVtbi5qcyIsInNyYy9jb21tb24vY29tcG9uZW50cy9vdmVybGF5LmpzeCIsInNyYy9jb21tb24vY29tcG9uZW50cy9yZWFjdC1jaGFydHMvYXJlYS1jaGFydC9BcmVhLmpzeCIsInNyYy9jb21tb24vY29tcG9uZW50cy9yZWFjdC1jaGFydHMvYXJlYS1jaGFydC9BcmVhQ2hhcnQuanN4Iiwic3JjL2NvbW1vbi9jb21wb25lbnRzL3JlYWN0LWNoYXJ0cy9hcmVhLWNoYXJ0L0RhdGFTZXJpZXMuanN4Iiwic3JjL2NvbW1vbi9jb21wb25lbnRzL3JlYWN0LWNoYXJ0cy9hcmVhLWNoYXJ0L2luZGV4LmpzIiwic3JjL2NvbW1vbi9jb21wb25lbnRzL3JlYWN0LWNoYXJ0cy9jb21tb24vQ2hhcnQuanN4Iiwic3JjL2NvbW1vbi9jb21wb25lbnRzL3JlYWN0LWNoYXJ0cy9jb21tb24vaW5kZXguanMiLCJzcmMvY29tbW9uL2NvbXBvbmVudHMvcmVhY3QtY2hhcnRzL2luZGV4LmpzIiwic3JjL2NvbW1vbi9jb21wb25lbnRzL3JlZnJlc2gtYnV0dG9uLmpzeCIsInNyYy9jb21tb24vbGliL0Zha2VXZWJTb2NrZXQuanMiLCJzcmMvY29tbW9uL2xpYi9Mb2dnZXIuanMiLCJzcmMvY29tbW9uL2xpYi9iYXNlNjQuanMiLCJzcmMvY29tbW9uL2xpYi9yZW1vdGUvUmVtb3RlLmpzIiwic3JjL2NvbW1vbi9saWIvcmVtb3RlL1JlbW90ZUFnZW50LmpzIiwic3JjL2NvbW1vbi9saWIvcmVtb3RlL2luZGV4LmpzIiwic3JjL2NvbW1vbi9saWIvcmVtb3RlL3Jlc3BvbnNlLWRhdGEuanMiLCJzcmMvY29tbW9uL2xpYi91dGlsLmpzIiwic3JjL2NvbXBvbmVudHMvYWdlbnQtYXV0aGVudGljYXRpb24uanN4Iiwic3JjL2NvbXBvbmVudHMvYXBwLmpzeCIsInNyYy9jb21wb25lbnRzL2Rpc3BsYXkvYnV0dG9ucy5qc3giLCJzcmMvY29tcG9uZW50cy9kaXNwbGF5L2NsaXBib2FyZC1tb2RhbC5qc3giLCJzcmMvY29tcG9uZW50cy9kaXNwbGF5L2luZGV4LmpzeCIsInNyYy9jb21wb25lbnRzL2Rpc3BsYXkva2V5Ym9hcmQtYnV0dG9uLmpzeCIsInNyYy9jb21wb25lbnRzL2Rpc3BsYXkva2V5cy1idXR0b24uanN4Iiwic3JjL2NvbXBvbmVudHMvZGlzcGxheS9wYXNzLWZvcm0uanN4Iiwic3JjL2NvbXBvbmVudHMvZWxsaXBzaXplLmpzeCIsInNyYy9jb21wb25lbnRzL2ZpbGVzL2JyZWFkY3J1bWJzLmpzeCIsInNyYy9jb21wb25lbnRzL2ZpbGVzL2J1dHRvbnMuanN4Iiwic3JjL2NvbXBvbmVudHMvZmlsZXMvZG93bmxvYWRzLW1vZGFsLmpzeCIsInNyYy9jb21wb25lbnRzL2ZpbGVzL2Rvd25sb2Fkcy5qc3giLCJzcmMvY29tcG9uZW50cy9maWxlcy9maWxlLWRyb3AtbWVzc2FnZS5qc3giLCJzcmMvY29tcG9uZW50cy9maWxlcy9maWxlLWRyb3Atb3ZlcmxheS5qc3giLCJzcmMvY29tcG9uZW50cy9maWxlcy9maWxlLWRyb3B6b25lLmpzeCIsInNyYy9jb21wb25lbnRzL2ZpbGVzL2luZGV4LmpzeCIsInNyYy9jb21wb25lbnRzL2ZpbGVzL3RhYmxlLmpzeCIsInNyYy9jb21wb25lbnRzL2ZpbGVzL3VwbG9hZHMtbW9kYWwuanN4Iiwic3JjL2NvbXBvbmVudHMvZmlsZXMvdXBsb2Fkcy5qc3giLCJzcmMvY29tcG9uZW50cy9oZWFkZXIuanN4Iiwic3JjL2NvbXBvbmVudHMvaW5mby1wYW5lbC5qc3giLCJzcmMvY29tcG9uZW50cy9wcm9ncmVzcy1iYXIuanN4Iiwic3JjL2NvbXBvbmVudHMvcmVxdWVzdC1zZWN0aW9uLmpzeCIsInNyYy9jb21wb25lbnRzL3NlY3Rpb24uanN4Iiwic3JjL2NvbXBvbmVudHMvc2hhcmUuanN4Iiwic3JjL2NvbXBvbmVudHMvc3lzdGVtL2FkZHJlc3MuanN4Iiwic3JjL2NvbXBvbmVudHMvc3lzdGVtL2FnZW50LmpzeCIsInNyYy9jb21wb25lbnRzL3N5c3RlbS9kZXNjcmlwdGlvbi5qc3giLCJzcmMvY29tcG9uZW50cy9zeXN0ZW0vaGFyZHdhcmUuanN4Iiwic3JjL2NvbXBvbmVudHMvc3lzdGVtL2luZGV4LmpzeCIsInNyYy9jb21wb25lbnRzL3N5c3RlbS9vcy5qc3giLCJzcmMvY29tcG9uZW50cy90ZXJtaW5hbC5qc3giLCJzcmMvY29uc3RhbnRzL2FnZW50LmpzIiwic3JjL2NvbnN0YW50cy9hcHAuanMiLCJzcmMvY29uc3RhbnRzL2F1dGguanMiLCJzcmMvY29uc3RhbnRzL2Rpc3BsYXkuanMiLCJzcmMvY29uc3RhbnRzL2ZpbGVzLmpzIiwic3JjL2NvbnN0YW50cy9pbmRleC5qcyIsInNyYy9jb25zdGFudHMvdGVybWluYWwuanMiLCJzcmMvY29uc3RhbnRzL3dlYnNvY2tldC5qcyIsInNyYy9kaXNwYXRjaGVyL2luZGV4LmpzIiwic3JjL2luZGV4LmpzIiwic3JjL2xpYi9maWxlcy9kaXItaXRlbS5qcyIsInNyYy9saWIvZmlsZXMvZmlsZS1kb3dubG9hZC5qcyIsInNyYy9saWIvZmlsZXMvZmlsZS1pdGVtLmpzIiwic3JjL2xpYi9maWxlcy9maWxlLXVwbG9hZC5qcyIsInNyYy9saWIvZmlsZXMvZmlsZS13b3JrZXIuanMiLCJzcmMvbGliL2ZpbGVzL2ZpbGVzLWRvd25sb2FkLWNvbnRyb2xsZXIuanMiLCJzcmMvbGliL2ZpbGVzL2ZpbGVzLXVwbG9hZC1jb250cm9sbGVyLmpzIiwic3JjL2xpYi9maWxlcy9mcy1pdGVtLmpzIiwic3JjL2xpYi9maWxlcy9wYXRoLWFycmF5LmpzIiwic3JjL2xpYi9maWxlcy9wYXRoLXBhcnNlci5qcyIsInNyYy9saWIvZmlsZXMvdXNlci1maWxlLXJlYWRlci5qcyIsInNyYy9saWIvZmlsZXMvdXNlci1maWxlLmpzIiwic3JjL3Byb2Nlc3Nlcy1tYW5hZ2VyL1Byb2Nlc3MuanMiLCJzcmMvcHJvY2Vzc2VzLW1hbmFnZXIvYWN0aW9ucy9pbmRleC5qcyIsInNyYy9wcm9jZXNzZXMtbWFuYWdlci9jb21wb25lbnRzL2J1dHRvbnMuanN4Iiwic3JjL3Byb2Nlc3Nlcy1tYW5hZ2VyL2NvbXBvbmVudHMvZmlsdGVyLmpzeCIsInNyYy9wcm9jZXNzZXMtbWFuYWdlci9jb21wb25lbnRzL2dyYXBocy5qc3giLCJzcmMvcHJvY2Vzc2VzLW1hbmFnZXIvY29tcG9uZW50cy9pbmRleC5qc3giLCJzcmMvcHJvY2Vzc2VzLW1hbmFnZXIvY29tcG9uZW50cy90YWJsZS5qc3giLCJzcmMvcHJvY2Vzc2VzLW1hbmFnZXIvY29uc3RhbnRzL2luZGV4LmpzIiwic3JjL3Byb2Nlc3Nlcy1tYW5hZ2VyL3N0b3JlL2luZGV4LmpzIiwic3JjL3JlZHVjZXJzL2FnZW50LmpzIiwic3JjL3JlZHVjZXJzL2FwcC5qcyIsInNyYy9yZWR1Y2Vycy9kaXNwbGF5LmpzIiwic3JjL3JlZHVjZXJzL2ZpbGVzLmpzIiwic3JjL3JlZHVjZXJzL2luZGV4LmpzIiwic3JjL3JlZHVjZXJzL3NlY3Rpb25zLmpzIiwic3JjL3JlZHVjZXJzL3Rlcm1pbmFsLmpzIiwic3JjL3Jlc3BvbnNlcy9maWxlcy5qcyIsInNyYy9yZXNwb25zZXMvaW5kZXguanMiLCJzcmMvcmVzcG9uc2VzL3Byb2Nlc3Nlcy5qcyIsInNyYy9yZXNwb25zZXMvc2VydmljZXMuanMiLCJzcmMvcmVzcG9uc2VzL3N5c3RlbS5qcyIsInNyYy9yZXNwb25zZXMvdGVybWluYWwuanMiLCJzcmMvc2VydmljZXMtbWFuYWdlci9TZXJ2aWNlLmpzIiwic3JjL3NlcnZpY2VzLW1hbmFnZXIvYWN0aW9ucy9pbmRleC5qcyIsInNyYy9zZXJ2aWNlcy1tYW5hZ2VyL2NvbXBvbmVudHMvc2VydmljZXMtYnV0dG9ucy9pbmRleC5qc3giLCJzcmMvc2VydmljZXMtbWFuYWdlci9jb21wb25lbnRzL3NlcnZpY2VzLWZpbHRlci9pbmRleC5qc3giLCJzcmMvc2VydmljZXMtbWFuYWdlci9jb21wb25lbnRzL3NlcnZpY2VzLW1haW4vaW5kZXguanN4Iiwic3JjL3NlcnZpY2VzLW1hbmFnZXIvY29tcG9uZW50cy9zZXJ2aWNlcy10YWJsZS9pbmRleC5qc3giLCJzcmMvc2VydmljZXMtbWFuYWdlci9jb25zdGFudHMvaW5kZXguanMiLCJzcmMvc2VydmljZXMtbWFuYWdlci9zdG9yZS9pbmRleC5qcyIsInNyYy9zdG9yZS9jb25maWd1cmUtc3RvcmUuanMiLCJzcmMvdHJhbnNsYXRpb25zL2VuLmpzb24iLCJzcmMvdHJhbnNsYXRpb25zL2VzLmpzb24iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5MkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNVpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOVhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3p0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25JQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3V0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBOztBQ0RBO0FBQ0E7O0FDREE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7O0FDQUE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBOztBQ0ZBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7O0FDRkE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7O0FDQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqMVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3REQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzlMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDdE9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNoTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQy9JQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDcEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNoTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2wzSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5MENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5OUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDelZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNoT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM3RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hnQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDcmhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3RLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL1FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDMVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDdkdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ25hQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNsSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2paQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM3SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDOVZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUMxSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzdHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3pOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDL1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNVZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDL0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN0TkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM09BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaE9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdFVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3A0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDditCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDelBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25DQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9IQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2WEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzUyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzVuREE7QUFDQTs7QUNEQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0tBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ25WQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM5RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUtBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcFFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTs7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ25IQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1dEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDcFBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2w2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDak9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG4vKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLiAqL1xuXG4vLyBGcm9tOiBodHRwOi8vaGcubW96aWxsYS5vcmcvbW96aWxsYS1jZW50cmFsL3Jhdy1maWxlL2VjMTA2MzBiMWE1NC9qcy9zcmMvZGV2dG9vbHMvamludC9zdW5zcGlkZXIvc3RyaW5nLWJhc2U2NC5qc1xuXG4vKmpzbGludCB3aGl0ZTogZmFsc2UgKi9cbi8qZ2xvYmFsIGNvbnNvbGUgKi9cblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICAgIC8qIENvbnZlcnQgZGF0YSAoYW4gYXJyYXkgb2YgaW50ZWdlcnMpIHRvIGEgQmFzZTY0IHN0cmluZy4gKi9cbiAgICB0b0Jhc2U2NFRhYmxlOiAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0nLnNwbGl0KCcnKSxcbiAgICBiYXNlNjRQYWQ6ICc9JyxcblxuICAgIGVuY29kZTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICAgICAgdmFyIHJlc3VsdCA9ICcnO1xuICAgICAgICB2YXIgdG9CYXNlNjRUYWJsZSA9IHRoaXMudG9CYXNlNjRUYWJsZTtcbiAgICAgICAgdmFyIGxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICAgICAgICB2YXIgbGVuZ3RocGFkID0gbGVuZ3RoICUgMztcbiAgICAgICAgLy8gQ29udmVydCBldmVyeSB0aHJlZSBieXRlcyB0byA0IGFzY2lpIGNoYXJhY3RlcnMuXG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGggLSAyOyBpICs9IDMpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0b0Jhc2U2NFRhYmxlW2RhdGFbaV0gPj4gMl07XG4gICAgICAgICAgICByZXN1bHQgKz0gdG9CYXNlNjRUYWJsZVsoKGRhdGFbaV0gJiAweDAzKSA8PCA0KSArIChkYXRhW2kgKyAxXSA+PiA0KV07XG4gICAgICAgICAgICByZXN1bHQgKz0gdG9CYXNlNjRUYWJsZVsoKGRhdGFbaSArIDFdICYgMHgwZikgPDwgMikgKyAoZGF0YVtpICsgMl0gPj4gNildO1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRvQmFzZTY0VGFibGVbZGF0YVtpICsgMl0gJiAweDNmXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgdGhlIHJlbWFpbmluZyAxIG9yIDIgYnl0ZXMsIHBhZCBvdXQgdG8gNCBjaGFyYWN0ZXJzLlxuICAgICAgICB2YXIgaiA9IDA7XG4gICAgICAgIGlmIChsZW5ndGhwYWQgPT09IDIpIHtcbiAgICAgICAgICAgIGogPSBsZW5ndGggLSBsZW5ndGhwYWQ7XG4gICAgICAgICAgICByZXN1bHQgKz0gdG9CYXNlNjRUYWJsZVtkYXRhW2pdID4+IDJdO1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRvQmFzZTY0VGFibGVbKChkYXRhW2pdICYgMHgwMykgPDwgNCkgKyAoZGF0YVtqICsgMV0gPj4gNCldO1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRvQmFzZTY0VGFibGVbKGRhdGFbaiArIDFdICYgMHgwZikgPDwgMl07XG4gICAgICAgICAgICByZXN1bHQgKz0gdG9CYXNlNjRUYWJsZVs2NF07XG4gICAgICAgIH0gZWxzZSBpZiAobGVuZ3RocGFkID09PSAxKSB7XG4gICAgICAgICAgICBqID0gbGVuZ3RoIC0gbGVuZ3RocGFkO1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRvQmFzZTY0VGFibGVbZGF0YVtqXSA+PiAyXTtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0b0Jhc2U2NFRhYmxlWyhkYXRhW2pdICYgMHgwMykgPDwgNF07XG4gICAgICAgICAgICByZXN1bHQgKz0gdG9CYXNlNjRUYWJsZVs2NF07XG4gICAgICAgICAgICByZXN1bHQgKz0gdG9CYXNlNjRUYWJsZVs2NF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICAvKiBDb252ZXJ0IEJhc2U2NCBkYXRhIHRvIGEgc3RyaW5nICovXG4gICAgLyoganNoaW50IC1XMDEzICovXG4gICAgdG9CaW5hcnlUYWJsZTogWy0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA2MiwgLTEsIC0xLCAtMSwgNjMsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCAtMSwgLTEsIC0xLCAwLCAtMSwgLTEsIC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCAtMSwgLTEsIC0xLCAtMSwgLTFdLFxuICAgIC8qIGpzaGludCArVzAxMyAqL1xuXG4gICAgZGVjb2RlOiBmdW5jdGlvbiAoZGF0YSwgb2Zmc2V0KSB7XG4gICAgICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgICAgIG9mZnNldCA9IHR5cGVvZiBvZmZzZXQgIT09ICd1bmRlZmluZWQnID8gb2Zmc2V0IDogMDtcbiAgICAgICAgdmFyIHRvQmluYXJ5VGFibGUgPSB0aGlzLnRvQmluYXJ5VGFibGU7XG4gICAgICAgIHZhciBiYXNlNjRQYWQgPSB0aGlzLmJhc2U2NFBhZDtcbiAgICAgICAgdmFyIHJlc3VsdCwgcmVzdWx0X2xlbmd0aDtcbiAgICAgICAgdmFyIGxlZnRiaXRzID0gMDsgLy8gbnVtYmVyIG9mIGJpdHMgZGVjb2RlZCwgYnV0IHlldCB0byBiZSBhcHBlbmRlZFxuICAgICAgICB2YXIgbGVmdGRhdGEgPSAwOyAvLyBiaXRzIGRlY29kZWQsIGJ1dCB5ZXQgdG8gYmUgYXBwZW5kZWRcbiAgICAgICAgdmFyIGRhdGFfbGVuZ3RoID0gZGF0YS5pbmRleE9mKCc9JykgLSBvZmZzZXQ7XG5cbiAgICAgICAgaWYgKGRhdGFfbGVuZ3RoIDwgMCkge1xuICAgICAgICAgICAgZGF0YV9sZW5ndGggPSBkYXRhLmxlbmd0aCAtIG9mZnNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEV2ZXJ5IGZvdXIgY2hhcmFjdGVycyBpcyAzIHJlc3VsdGluZyBudW1iZXJzICovXG4gICAgICAgIHJlc3VsdF9sZW5ndGggPSAoZGF0YV9sZW5ndGggPj4gMikgKiAzICsgTWF0aC5mbG9vcihkYXRhX2xlbmd0aCAlIDQgLyAxLjUpO1xuICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXkocmVzdWx0X2xlbmd0aCk7XG5cbiAgICAgICAgLy8gQ29udmVydCBvbmUgYnkgb25lLlxuICAgICAgICBmb3IgKHZhciBpZHggPSAwLCBpID0gb2Zmc2V0OyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGMgPSB0b0JpbmFyeVRhYmxlW2RhdGEuY2hhckNvZGVBdChpKSAmIDB4N2ZdO1xuICAgICAgICAgICAgdmFyIHBhZGRpbmcgPSBkYXRhLmNoYXJBdChpKSA9PT0gYmFzZTY0UGFkO1xuICAgICAgICAgICAgLy8gU2tpcCBpbGxlZ2FsIGNoYXJhY3RlcnMgYW5kIHdoaXRlc3BhY2VcbiAgICAgICAgICAgIGlmIChjID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJJbGxlZ2FsIGNoYXJhY3RlciBjb2RlIFwiICsgZGF0YS5jaGFyQ29kZUF0KGkpICsgXCIgYXQgcG9zaXRpb24gXCIgKyBpKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ29sbGVjdCBkYXRhIGludG8gbGVmdGRhdGEsIHVwZGF0ZSBiaXRjb3VudFxuICAgICAgICAgICAgbGVmdGRhdGEgPSBsZWZ0ZGF0YSA8PCA2IHwgYztcbiAgICAgICAgICAgIGxlZnRiaXRzICs9IDY7XG5cbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgOCBvciBtb3JlIGJpdHMsIGFwcGVuZCA4IGJpdHMgdG8gdGhlIHJlc3VsdFxuICAgICAgICAgICAgaWYgKGxlZnRiaXRzID49IDgpIHtcbiAgICAgICAgICAgICAgICBsZWZ0Yml0cyAtPSA4O1xuICAgICAgICAgICAgICAgIC8vIEFwcGVuZCBpZiBub3QgcGFkZGluZy5cbiAgICAgICAgICAgICAgICBpZiAoIXBhZGRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2lkeCsrXSA9IGxlZnRkYXRhID4+IGxlZnRiaXRzICYgMHhmZjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGVmdGRhdGEgJj0gKDEgPDwgbGVmdGJpdHMpIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgYml0cyBsZWZ0LCB0aGUgYmFzZTY0IHN0cmluZyB3YXMgY29ycnVwdGVkXG4gICAgICAgIGlmIChsZWZ0Yml0cykge1xuICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKCdDb3JydXB0ZWQgYmFzZTY0IHN0cmluZycpO1xuICAgICAgICAgICAgZXJyLm5hbWUgPSAnQmFzZTY0LUVycm9yJztcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufTsgLyogRW5kIG9mIEJhc2U2NCBuYW1lc3BhY2UgKi8iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gREVTO1xuLypcbiAqIFBvcnRlZCBmcm9tIEZsYXNobGlnaHQgVk5DIEFjdGlvblNjcmlwdCBpbXBsZW1lbnRhdGlvbjpcbiAqICAgICBodHRwOi8vd3d3LndpemhlbHAuY29tL2ZsYXNobGlnaHQtdm5jL1xuICpcbiAqIEZ1bGwgYXR0cmlidXRpb24gZm9sbG93czpcbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogVGhpcyBERVMgY2xhc3MgaGFzIGJlZW4gZXh0cmFjdGVkIGZyb20gcGFja2FnZSBBY21lLkNyeXB0byBmb3IgdXNlIGluIFZOQy5cbiAqIFRoZSB1bm5lY2Vzc2FyeSBvZGQgcGFyaXR5IGNvZGUgaGFzIGJlZW4gcmVtb3ZlZC5cbiAqXG4gKiBUaGVzZSBjaGFuZ2VzIGFyZTpcbiAqICBDb3B5cmlnaHQgKEMpIDE5OTkgQVQmVCBMYWJvcmF0b3JpZXMgQ2FtYnJpZGdlLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLlxuICpcblxuICogRGVzQ2lwaGVyIC0gdGhlIERFUyBlbmNyeXB0aW9uIG1ldGhvZFxuICpcbiAqIFRoZSBtZWF0IG9mIHRoaXMgY29kZSBpcyBieSBEYXZlIFppbW1lcm1hbiA8ZHppbW1Ad2lkZ2V0LmNvbT4sIGFuZCBpczpcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDE5OTYgV2lkZ2V0IFdvcmtzaG9wLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZVxuICogYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBOT04tQ09NTUVSQ0lBTCBvciBDT01NRVJDSUFMIHB1cnBvc2VzIGFuZFxuICogd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhpcyBjb3B5cmlnaHQgbm90aWNlIGlzIGtlcHRcbiAqIGludGFjdC5cbiAqXG4gKiBXSURHRVQgV09SS1NIT1AgTUFLRVMgTk8gUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMgQUJPVVQgVEhFIFNVSVRBQklMSVRZXG4gKiBPRiBUSEUgU09GVFdBUkUsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURURcbiAqIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBXG4gKiBQQVJUSUNVTEFSIFBVUlBPU0UsIE9SIE5PTi1JTkZSSU5HRU1FTlQuIFdJREdFVCBXT1JLU0hPUCBTSEFMTCBOT1QgQkUgTElBQkxFXG4gKiBGT1IgQU5ZIERBTUFHRVMgU1VGRkVSRUQgQlkgTElDRU5TRUUgQVMgQSBSRVNVTFQgT0YgVVNJTkcsIE1PRElGWUlORyBPUlxuICogRElTVFJJQlVUSU5HIFRISVMgU09GVFdBUkUgT1IgSVRTIERFUklWQVRJVkVTLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgTk9UIERFU0lHTkVEIE9SIElOVEVOREVEIEZPUiBVU0UgT1IgUkVTQUxFIEFTIE9OLUxJTkVcbiAqIENPTlRST0wgRVFVSVBNRU5UIElOIEhBWkFSRE9VUyBFTlZJUk9OTUVOVFMgUkVRVUlSSU5HIEZBSUwtU0FGRVxuICogUEVSRk9STUFOQ0UsIFNVQ0ggQVMgSU4gVEhFIE9QRVJBVElPTiBPRiBOVUNMRUFSIEZBQ0lMSVRJRVMsIEFJUkNSQUZUXG4gKiBOQVZJR0FUSU9OIE9SIENPTU1VTklDQVRJT04gU1lTVEVNUywgQUlSIFRSQUZGSUMgQ09OVFJPTCwgRElSRUNUIExJRkVcbiAqIFNVUFBPUlQgTUFDSElORVMsIE9SIFdFQVBPTlMgU1lTVEVNUywgSU4gV0hJQ0ggVEhFIEZBSUxVUkUgT0YgVEhFXG4gKiBTT0ZUV0FSRSBDT1VMRCBMRUFEIERJUkVDVExZIFRPIERFQVRILCBQRVJTT05BTCBJTkpVUlksIE9SIFNFVkVSRVxuICogUEhZU0lDQUwgT1IgRU5WSVJPTk1FTlRBTCBEQU1BR0UgKFwiSElHSCBSSVNLIEFDVElWSVRJRVNcIikuICBXSURHRVQgV09SS1NIT1BcbiAqIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5UWSBPRiBGSVRORVNTIEZPUlxuICogSElHSCBSSVNLIEFDVElWSVRJRVMuXG4gKlxuICpcbiAqIFRoZSByZXN0IGlzOlxuICpcbiAqIENvcHlyaWdodCAoQykgMTk5NiBieSBKZWYgUG9za2FuemVyIDxqZWZAYWNtZS5jb20+LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uc1xuICogYXJlIG1ldDpcbiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZVxuICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EXG4gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVcbiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFXG4gKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRVxuICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUxcbiAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTXG4gKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTilcbiAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUXG4gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZXG4gKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GXG4gKiBTVUNIIERBTUFHRS5cbiAqXG4gKiBWaXNpdCB0aGUgQUNNRSBMYWJzIEphdmEgcGFnZSBmb3IgdXAtdG8tZGF0ZSB2ZXJzaW9ucyBvZiB0aGlzIGFuZCBvdGhlclxuICogZmluZSBKYXZhIHV0aWxpdGllczogaHR0cDovL3d3dy5hY21lLmNvbS9qYXZhL1xuICovXG5cbi8qIGpzbGludCB3aGl0ZTogZmFsc2UgKi9cblxuZnVuY3Rpb24gREVTKHBhc3N3ZCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgLy8gVGFibGVzLCBwZXJtdXRhdGlvbnMsIFMtYm94ZXMsIGV0Yy5cbiAgICAvLyBqc2hpbnQgLVcwMTNcblxuICAgIHZhciBQQzIgPSBbMTMsIDE2LCAxMCwgMjMsIDAsIDQsIDIsIDI3LCAxNCwgNSwgMjAsIDksIDIyLCAxOCwgMTEsIDMsIDI1LCA3LCAxNSwgNiwgMjYsIDE5LCAxMiwgMSwgNDAsIDUxLCAzMCwgMzYsIDQ2LCA1NCwgMjksIDM5LCA1MCwgNDQsIDMyLCA0NywgNDMsIDQ4LCAzOCwgNTUsIDMzLCA1MiwgNDUsIDQxLCA0OSwgMzUsIDI4LCAzMV0sXG4gICAgICAgIHRvdHJvdCA9IFsxLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxNSwgMTcsIDE5LCAyMSwgMjMsIDI1LCAyNywgMjhdLFxuICAgICAgICB6ID0gMHgwLFxuICAgICAgICBhLFxuICAgICAgICBiLFxuICAgICAgICBjLFxuICAgICAgICBkLFxuICAgICAgICBlLFxuICAgICAgICBmLFxuICAgICAgICBTUDEsXG4gICAgICAgIFNQMixcbiAgICAgICAgU1AzLFxuICAgICAgICBTUDQsXG4gICAgICAgIFNQNSxcbiAgICAgICAgU1A2LFxuICAgICAgICBTUDcsXG4gICAgICAgIFNQOCxcbiAgICAgICAga2V5cyA9IFtdO1xuXG4gICAgLy8ganNoaW50IC1XMDE1XG4gICAgYSA9IDEgPDwgMTY7YiA9IDEgPDwgMjQ7YyA9IGEgfCBiO2QgPSAxIDw8IDI7ZSA9IDEgPDwgMTA7ZiA9IGQgfCBlO1xuICAgIFNQMSA9IFtjIHwgZSwgeiB8IHosIGEgfCB6LCBjIHwgZiwgYyB8IGQsIGEgfCBmLCB6IHwgZCwgYSB8IHosIHogfCBlLCBjIHwgZSwgYyB8IGYsIHogfCBlLCBiIHwgZiwgYyB8IGQsIGIgfCB6LCB6IHwgZCwgeiB8IGYsIGIgfCBlLCBiIHwgZSwgYSB8IGUsIGEgfCBlLCBjIHwgeiwgYyB8IHosIGIgfCBmLCBhIHwgZCwgYiB8IGQsIGIgfCBkLCBhIHwgZCwgeiB8IHosIHogfCBmLCBhIHwgZiwgYiB8IHosIGEgfCB6LCBjIHwgZiwgeiB8IGQsIGMgfCB6LCBjIHwgZSwgYiB8IHosIGIgfCB6LCB6IHwgZSwgYyB8IGQsIGEgfCB6LCBhIHwgZSwgYiB8IGQsIHogfCBlLCB6IHwgZCwgYiB8IGYsIGEgfCBmLCBjIHwgZiwgYSB8IGQsIGMgfCB6LCBiIHwgZiwgYiB8IGQsIHogfCBmLCBhIHwgZiwgYyB8IGUsIHogfCBmLCBiIHwgZSwgYiB8IGUsIHogfCB6LCBhIHwgZCwgYSB8IGUsIHogfCB6LCBjIHwgZF07XG4gICAgYSA9IDEgPDwgMjA7YiA9IDEgPDwgMzE7YyA9IGEgfCBiO2QgPSAxIDw8IDU7ZSA9IDEgPDwgMTU7ZiA9IGQgfCBlO1xuICAgIFNQMiA9IFtjIHwgZiwgYiB8IGUsIHogfCBlLCBhIHwgZiwgYSB8IHosIHogfCBkLCBjIHwgZCwgYiB8IGYsIGIgfCBkLCBjIHwgZiwgYyB8IGUsIGIgfCB6LCBiIHwgZSwgYSB8IHosIHogfCBkLCBjIHwgZCwgYSB8IGUsIGEgfCBkLCBiIHwgZiwgeiB8IHosIGIgfCB6LCB6IHwgZSwgYSB8IGYsIGMgfCB6LCBhIHwgZCwgYiB8IGQsIHogfCB6LCBhIHwgZSwgeiB8IGYsIGMgfCBlLCBjIHwgeiwgeiB8IGYsIHogfCB6LCBhIHwgZiwgYyB8IGQsIGEgfCB6LCBiIHwgZiwgYyB8IHosIGMgfCBlLCB6IHwgZSwgYyB8IHosIGIgfCBlLCB6IHwgZCwgYyB8IGYsIGEgfCBmLCB6IHwgZCwgeiB8IGUsIGIgfCB6LCB6IHwgZiwgYyB8IGUsIGEgfCB6LCBiIHwgZCwgYSB8IGQsIGIgfCBmLCBiIHwgZCwgYSB8IGQsIGEgfCBlLCB6IHwgeiwgYiB8IGUsIHogfCBmLCBiIHwgeiwgYyB8IGQsIGMgfCBmLCBhIHwgZV07XG4gICAgYSA9IDEgPDwgMTc7YiA9IDEgPDwgMjc7YyA9IGEgfCBiO2QgPSAxIDw8IDM7ZSA9IDEgPDwgOTtmID0gZCB8IGU7XG4gICAgU1AzID0gW3ogfCBmLCBjIHwgZSwgeiB8IHosIGMgfCBkLCBiIHwgZSwgeiB8IHosIGEgfCBmLCBiIHwgZSwgYSB8IGQsIGIgfCBkLCBiIHwgZCwgYSB8IHosIGMgfCBmLCBhIHwgZCwgYyB8IHosIHogfCBmLCBiIHwgeiwgeiB8IGQsIGMgfCBlLCB6IHwgZSwgYSB8IGUsIGMgfCB6LCBjIHwgZCwgYSB8IGYsIGIgfCBmLCBhIHwgZSwgYSB8IHosIGIgfCBmLCB6IHwgZCwgYyB8IGYsIHogfCBlLCBiIHwgeiwgYyB8IGUsIGIgfCB6LCBhIHwgZCwgeiB8IGYsIGEgfCB6LCBjIHwgZSwgYiB8IGUsIHogfCB6LCB6IHwgZSwgYSB8IGQsIGMgfCBmLCBiIHwgZSwgYiB8IGQsIHogfCBlLCB6IHwgeiwgYyB8IGQsIGIgfCBmLCBhIHwgeiwgYiB8IHosIGMgfCBmLCB6IHwgZCwgYSB8IGYsIGEgfCBlLCBiIHwgZCwgYyB8IHosIGIgfCBmLCB6IHwgZiwgYyB8IHosIGEgfCBmLCB6IHwgZCwgYyB8IGQsIGEgfCBlXTtcbiAgICBhID0gMSA8PCAxMztiID0gMSA8PCAyMztjID0gYSB8IGI7ZCA9IDEgPDwgMDtlID0gMSA8PCA3O2YgPSBkIHwgZTtcbiAgICBTUDQgPSBbYyB8IGQsIGEgfCBmLCBhIHwgZiwgeiB8IGUsIGMgfCBlLCBiIHwgZiwgYiB8IGQsIGEgfCBkLCB6IHwgeiwgYyB8IHosIGMgfCB6LCBjIHwgZiwgeiB8IGYsIHogfCB6LCBiIHwgZSwgYiB8IGQsIHogfCBkLCBhIHwgeiwgYiB8IHosIGMgfCBkLCB6IHwgZSwgYiB8IHosIGEgfCBkLCBhIHwgZSwgYiB8IGYsIHogfCBkLCBhIHwgZSwgYiB8IGUsIGEgfCB6LCBjIHwgZSwgYyB8IGYsIHogfCBmLCBiIHwgZSwgYiB8IGQsIGMgfCB6LCBjIHwgZiwgeiB8IGYsIHogfCB6LCB6IHwgeiwgYyB8IHosIGEgfCBlLCBiIHwgZSwgYiB8IGYsIHogfCBkLCBjIHwgZCwgYSB8IGYsIGEgfCBmLCB6IHwgZSwgYyB8IGYsIHogfCBmLCB6IHwgZCwgYSB8IHosIGIgfCBkLCBhIHwgZCwgYyB8IGUsIGIgfCBmLCBhIHwgZCwgYSB8IGUsIGIgfCB6LCBjIHwgZCwgeiB8IGUsIGIgfCB6LCBhIHwgeiwgYyB8IGVdO1xuICAgIGEgPSAxIDw8IDI1O2IgPSAxIDw8IDMwO2MgPSBhIHwgYjtkID0gMSA8PCA4O2UgPSAxIDw8IDE5O2YgPSBkIHwgZTtcbiAgICBTUDUgPSBbeiB8IGQsIGEgfCBmLCBhIHwgZSwgYyB8IGQsIHogfCBlLCB6IHwgZCwgYiB8IHosIGEgfCBlLCBiIHwgZiwgeiB8IGUsIGEgfCBkLCBiIHwgZiwgYyB8IGQsIGMgfCBlLCB6IHwgZiwgYiB8IHosIGEgfCB6LCBiIHwgZSwgYiB8IGUsIHogfCB6LCBiIHwgZCwgYyB8IGYsIGMgfCBmLCBhIHwgZCwgYyB8IGUsIGIgfCBkLCB6IHwgeiwgYyB8IHosIGEgfCBmLCBhIHwgeiwgYyB8IHosIHogfCBmLCB6IHwgZSwgYyB8IGQsIHogfCBkLCBhIHwgeiwgYiB8IHosIGEgfCBlLCBjIHwgZCwgYiB8IGYsIGEgfCBkLCBiIHwgeiwgYyB8IGUsIGEgfCBmLCBiIHwgZiwgeiB8IGQsIGEgfCB6LCBjIHwgZSwgYyB8IGYsIHogfCBmLCBjIHwgeiwgYyB8IGYsIGEgfCBlLCB6IHwgeiwgYiB8IGUsIGMgfCB6LCB6IHwgZiwgYSB8IGQsIGIgfCBkLCB6IHwgZSwgeiB8IHosIGIgfCBlLCBhIHwgZiwgYiB8IGRdO1xuICAgIGEgPSAxIDw8IDIyO2IgPSAxIDw8IDI5O2MgPSBhIHwgYjtkID0gMSA8PCA0O2UgPSAxIDw8IDE0O2YgPSBkIHwgZTtcbiAgICBTUDYgPSBbYiB8IGQsIGMgfCB6LCB6IHwgZSwgYyB8IGYsIGMgfCB6LCB6IHwgZCwgYyB8IGYsIGEgfCB6LCBiIHwgZSwgYSB8IGYsIGEgfCB6LCBiIHwgZCwgYSB8IGQsIGIgfCBlLCBiIHwgeiwgeiB8IGYsIHogfCB6LCBhIHwgZCwgYiB8IGYsIHogfCBlLCBhIHwgZSwgYiB8IGYsIHogfCBkLCBjIHwgZCwgYyB8IGQsIHogfCB6LCBhIHwgZiwgYyB8IGUsIHogfCBmLCBhIHwgZSwgYyB8IGUsIGIgfCB6LCBiIHwgZSwgeiB8IGQsIGMgfCBkLCBhIHwgZSwgYyB8IGYsIGEgfCB6LCB6IHwgZiwgYiB8IGQsIGEgfCB6LCBiIHwgZSwgYiB8IHosIHogfCBmLCBiIHwgZCwgYyB8IGYsIGEgfCBlLCBjIHwgeiwgYSB8IGYsIGMgfCBlLCB6IHwgeiwgYyB8IGQsIHogfCBkLCB6IHwgZSwgYyB8IHosIGEgfCBmLCB6IHwgZSwgYSB8IGQsIGIgfCBmLCB6IHwgeiwgYyB8IGUsIGIgfCB6LCBhIHwgZCwgYiB8IGZdO1xuICAgIGEgPSAxIDw8IDIxO2IgPSAxIDw8IDI2O2MgPSBhIHwgYjtkID0gMSA8PCAxO2UgPSAxIDw8IDExO2YgPSBkIHwgZTtcbiAgICBTUDcgPSBbYSB8IHosIGMgfCBkLCBiIHwgZiwgeiB8IHosIHogfCBlLCBiIHwgZiwgYSB8IGYsIGMgfCBlLCBjIHwgZiwgYSB8IHosIHogfCB6LCBiIHwgZCwgeiB8IGQsIGIgfCB6LCBjIHwgZCwgeiB8IGYsIGIgfCBlLCBhIHwgZiwgYSB8IGQsIGIgfCBlLCBiIHwgZCwgYyB8IHosIGMgfCBlLCBhIHwgZCwgYyB8IHosIHogfCBlLCB6IHwgZiwgYyB8IGYsIGEgfCBlLCB6IHwgZCwgYiB8IHosIGEgfCBlLCBiIHwgeiwgYSB8IGUsIGEgfCB6LCBiIHwgZiwgYiB8IGYsIGMgfCBkLCBjIHwgZCwgeiB8IGQsIGEgfCBkLCBiIHwgeiwgYiB8IGUsIGEgfCB6LCBjIHwgZSwgeiB8IGYsIGEgfCBmLCBjIHwgZSwgeiB8IGYsIGIgfCBkLCBjIHwgZiwgYyB8IHosIGEgfCBlLCB6IHwgeiwgeiB8IGQsIGMgfCBmLCB6IHwgeiwgYSB8IGYsIGMgfCB6LCB6IHwgZSwgYiB8IGQsIGIgfCBlLCB6IHwgZSwgYSB8IGRdO1xuICAgIGEgPSAxIDw8IDE4O2IgPSAxIDw8IDI4O2MgPSBhIHwgYjtkID0gMSA8PCA2O2UgPSAxIDw8IDEyO2YgPSBkIHwgZTtcbiAgICBTUDggPSBbYiB8IGYsIHogfCBlLCBhIHwgeiwgYyB8IGYsIGIgfCB6LCBiIHwgZiwgeiB8IGQsIGIgfCB6LCBhIHwgZCwgYyB8IHosIGMgfCBmLCBhIHwgZSwgYyB8IGUsIGEgfCBmLCB6IHwgZSwgeiB8IGQsIGMgfCB6LCBiIHwgZCwgYiB8IGUsIHogfCBmLCBhIHwgZSwgYSB8IGQsIGMgfCBkLCBjIHwgZSwgeiB8IGYsIHogfCB6LCB6IHwgeiwgYyB8IGQsIGIgfCBkLCBiIHwgZSwgYSB8IGYsIGEgfCB6LCBhIHwgZiwgYSB8IHosIGMgfCBlLCB6IHwgZSwgeiB8IGQsIGMgfCBkLCB6IHwgZSwgYSB8IGYsIGIgfCBlLCB6IHwgZCwgYiB8IGQsIGMgfCB6LCBjIHwgZCwgYiB8IHosIGEgfCB6LCBiIHwgZiwgeiB8IHosIGMgfCBmLCBhIHwgZCwgYiB8IGQsIGMgfCB6LCBiIHwgZSwgYiB8IGYsIHogfCB6LCBjIHwgZiwgYSB8IGUsIGEgfCBlLCB6IHwgZiwgeiB8IGYsIGEgfCBkLCBiIHwgeiwgYyB8IGVdO1xuICAgIC8vIGpzaGludCArVzAxMywrVzAxNVxuXG4gICAgLy8gU2V0IHRoZSBrZXkuXG4gICAgZnVuY3Rpb24gc2V0S2V5cyhrZXlCbG9jaykge1xuICAgICAgICB2YXIgaSxcbiAgICAgICAgICAgIGosXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgbSxcbiAgICAgICAgICAgIG4sXG4gICAgICAgICAgICBvLFxuICAgICAgICAgICAgcGMxbSA9IFtdLFxuICAgICAgICAgICAgcGNyID0gW10sXG4gICAgICAgICAgICBrbiA9IFtdLFxuICAgICAgICAgICAgcmF3MCxcbiAgICAgICAgICAgIHJhdzEsXG4gICAgICAgICAgICByYXdpLFxuICAgICAgICAgICAgS25MaTtcblxuICAgICAgICBmb3IgKGogPSAwLCBsID0gNTY7IGogPCA1NjsgKytqLCBsIC09IDgpIHtcbiAgICAgICAgICAgIGwgKz0gbCA8IC01ID8gNjUgOiBsIDwgLTMgPyAzMSA6IGwgPCAtMSA/IDYzIDogbCA9PT0gMjcgPyAzNSA6IDA7IC8vIFBDMVxuICAgICAgICAgICAgbSA9IGwgJiAweDc7XG4gICAgICAgICAgICBwYzFtW2pdID0gKGtleUJsb2NrW2wgPj4+IDNdICYgMSA8PCBtKSAhPT0gMCA/IDEgOiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgICAgICAgIG0gPSBpIDw8IDE7XG4gICAgICAgICAgICBuID0gbSArIDE7XG4gICAgICAgICAgICBrblttXSA9IGtuW25dID0gMDtcbiAgICAgICAgICAgIGZvciAobyA9IDI4OyBvIDwgNTk7IG8gKz0gMjgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGogPSBvIC0gMjg7IGogPCBvOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgbCA9IGogKyB0b3Ryb3RbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsIDwgbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGNyW2pdID0gcGMxbVtsXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBjcltqXSA9IHBjMW1bbCAtIDI4XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyNDsgKytqKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBjcltQQzJbal1dICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGtuW21dIHw9IDEgPDwgMjMgLSBqO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGNyW1BDMltqICsgMjRdXSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBrbltuXSB8PSAxIDw8IDIzIC0gajtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb29rZXlcbiAgICAgICAgZm9yIChpID0gMCwgcmF3aSA9IDAsIEtuTGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgICAgICAgcmF3MCA9IGtuW3Jhd2krK107XG4gICAgICAgICAgICByYXcxID0ga25bcmF3aSsrXTtcbiAgICAgICAgICAgIGtleXNbS25MaV0gPSAocmF3MCAmIDB4MDBmYzAwMDApIDw8IDY7XG4gICAgICAgICAgICBrZXlzW0tuTGldIHw9IChyYXcwICYgMHgwMDAwMGZjMCkgPDwgMTA7XG4gICAgICAgICAgICBrZXlzW0tuTGldIHw9IChyYXcxICYgMHgwMGZjMDAwMCkgPj4+IDEwO1xuICAgICAgICAgICAga2V5c1tLbkxpXSB8PSAocmF3MSAmIDB4MDAwMDBmYzApID4+PiA2O1xuICAgICAgICAgICAgKytLbkxpO1xuICAgICAgICAgICAga2V5c1tLbkxpXSA9IChyYXcwICYgMHgwMDAzZjAwMCkgPDwgMTI7XG4gICAgICAgICAgICBrZXlzW0tuTGldIHw9IChyYXcwICYgMHgwMDAwMDAzZikgPDwgMTY7XG4gICAgICAgICAgICBrZXlzW0tuTGldIHw9IChyYXcxICYgMHgwMDAzZjAwMCkgPj4+IDQ7XG4gICAgICAgICAgICBrZXlzW0tuTGldIHw9IHJhdzEgJiAweDAwMDAwMDNmO1xuICAgICAgICAgICAgKytLbkxpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW5jcnlwdCA4IGJ5dGVzIG9mIHRleHRcbiAgICBmdW5jdGlvbiBlbmM4KHRleHQpIHtcbiAgICAgICAgdmFyIGkgPSAwLFxuICAgICAgICAgICAgYiA9IHRleHQuc2xpY2UoKSxcbiAgICAgICAgICAgIGZ2YWwsXG4gICAgICAgICAgICBrZXlzaSA9IDAsXG4gICAgICAgICAgICBsLFxuICAgICAgICAgICAgcixcbiAgICAgICAgICAgIHg7IC8vIGxlZnQsIHJpZ2h0LCBhY2N1bXVsYXRvclxuXG4gICAgICAgIC8vIFNxdWFzaCA4IGJ5dGVzIHRvIDIgaW50c1xuICAgICAgICBsID0gYltpKytdIDw8IDI0IHwgYltpKytdIDw8IDE2IHwgYltpKytdIDw8IDggfCBiW2krK107XG4gICAgICAgIHIgPSBiW2krK10gPDwgMjQgfCBiW2krK10gPDwgMTYgfCBiW2krK10gPDwgOCB8IGJbaSsrXTtcblxuICAgICAgICB4ID0gKGwgPj4+IDQgXiByKSAmIDB4MGYwZjBmMGY7XG4gICAgICAgIHIgXj0geDtcbiAgICAgICAgbCBePSB4IDw8IDQ7XG4gICAgICAgIHggPSAobCA+Pj4gMTYgXiByKSAmIDB4MDAwMGZmZmY7XG4gICAgICAgIHIgXj0geDtcbiAgICAgICAgbCBePSB4IDw8IDE2O1xuICAgICAgICB4ID0gKHIgPj4+IDIgXiBsKSAmIDB4MzMzMzMzMzM7XG4gICAgICAgIGwgXj0geDtcbiAgICAgICAgciBePSB4IDw8IDI7XG4gICAgICAgIHggPSAociA+Pj4gOCBeIGwpICYgMHgwMGZmMDBmZjtcbiAgICAgICAgbCBePSB4O1xuICAgICAgICByIF49IHggPDwgODtcbiAgICAgICAgciA9IHIgPDwgMSB8IHIgPj4+IDMxICYgMTtcbiAgICAgICAgeCA9IChsIF4gcikgJiAweGFhYWFhYWFhO1xuICAgICAgICBsIF49IHg7XG4gICAgICAgIHIgXj0geDtcbiAgICAgICAgbCA9IGwgPDwgMSB8IGwgPj4+IDMxICYgMTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7XG4gICAgICAgICAgICB4ID0gciA8PCAyOCB8IHIgPj4+IDQ7XG4gICAgICAgICAgICB4IF49IGtleXNba2V5c2krK107XG4gICAgICAgICAgICBmdmFsID0gU1A3W3ggJiAweDNmXTtcbiAgICAgICAgICAgIGZ2YWwgfD0gU1A1W3ggPj4+IDggJiAweDNmXTtcbiAgICAgICAgICAgIGZ2YWwgfD0gU1AzW3ggPj4+IDE2ICYgMHgzZl07XG4gICAgICAgICAgICBmdmFsIHw9IFNQMVt4ID4+PiAyNCAmIDB4M2ZdO1xuICAgICAgICAgICAgeCA9IHIgXiBrZXlzW2tleXNpKytdO1xuICAgICAgICAgICAgZnZhbCB8PSBTUDhbeCAmIDB4M2ZdO1xuICAgICAgICAgICAgZnZhbCB8PSBTUDZbeCA+Pj4gOCAmIDB4M2ZdO1xuICAgICAgICAgICAgZnZhbCB8PSBTUDRbeCA+Pj4gMTYgJiAweDNmXTtcbiAgICAgICAgICAgIGZ2YWwgfD0gU1AyW3ggPj4+IDI0ICYgMHgzZl07XG4gICAgICAgICAgICBsIF49IGZ2YWw7XG4gICAgICAgICAgICB4ID0gbCA8PCAyOCB8IGwgPj4+IDQ7XG4gICAgICAgICAgICB4IF49IGtleXNba2V5c2krK107XG4gICAgICAgICAgICBmdmFsID0gU1A3W3ggJiAweDNmXTtcbiAgICAgICAgICAgIGZ2YWwgfD0gU1A1W3ggPj4+IDggJiAweDNmXTtcbiAgICAgICAgICAgIGZ2YWwgfD0gU1AzW3ggPj4+IDE2ICYgMHgzZl07XG4gICAgICAgICAgICBmdmFsIHw9IFNQMVt4ID4+PiAyNCAmIDB4M2ZdO1xuICAgICAgICAgICAgeCA9IGwgXiBrZXlzW2tleXNpKytdO1xuICAgICAgICAgICAgZnZhbCB8PSBTUDhbeCAmIDB4MDAwMDAwM2ZdO1xuICAgICAgICAgICAgZnZhbCB8PSBTUDZbeCA+Pj4gOCAmIDB4M2ZdO1xuICAgICAgICAgICAgZnZhbCB8PSBTUDRbeCA+Pj4gMTYgJiAweDNmXTtcbiAgICAgICAgICAgIGZ2YWwgfD0gU1AyW3ggPj4+IDI0ICYgMHgzZl07XG4gICAgICAgICAgICByIF49IGZ2YWw7XG4gICAgICAgIH1cblxuICAgICAgICByID0gciA8PCAzMSB8IHIgPj4+IDE7XG4gICAgICAgIHggPSAobCBeIHIpICYgMHhhYWFhYWFhYTtcbiAgICAgICAgbCBePSB4O1xuICAgICAgICByIF49IHg7XG4gICAgICAgIGwgPSBsIDw8IDMxIHwgbCA+Pj4gMTtcbiAgICAgICAgeCA9IChsID4+PiA4IF4gcikgJiAweDAwZmYwMGZmO1xuICAgICAgICByIF49IHg7XG4gICAgICAgIGwgXj0geCA8PCA4O1xuICAgICAgICB4ID0gKGwgPj4+IDIgXiByKSAmIDB4MzMzMzMzMzM7XG4gICAgICAgIHIgXj0geDtcbiAgICAgICAgbCBePSB4IDw8IDI7XG4gICAgICAgIHggPSAociA+Pj4gMTYgXiBsKSAmIDB4MDAwMGZmZmY7XG4gICAgICAgIGwgXj0geDtcbiAgICAgICAgciBePSB4IDw8IDE2O1xuICAgICAgICB4ID0gKHIgPj4+IDQgXiBsKSAmIDB4MGYwZjBmMGY7XG4gICAgICAgIGwgXj0geDtcbiAgICAgICAgciBePSB4IDw8IDQ7XG5cbiAgICAgICAgLy8gU3ByZWFkIGludHMgdG8gYnl0ZXNcbiAgICAgICAgeCA9IFtyLCBsXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykge1xuICAgICAgICAgICAgYltpXSA9ICh4W2kgPj4+IDJdID4+PiA4ICogKDMgLSBpICUgNCkpICUgMjU2O1xuICAgICAgICAgICAgaWYgKGJbaV0gPCAwKSB7XG4gICAgICAgICAgICAgICAgYltpXSArPSAyNTY7XG4gICAgICAgICAgICB9IC8vIHVuc2lnbmVkXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGI7XG4gICAgfVxuXG4gICAgLy8gRW5jcnlwdCAxNiBieXRlcyBvZiB0ZXh0IHVzaW5nIHBhc3N3ZCBhcyBrZXlcbiAgICBmdW5jdGlvbiBlbmNyeXB0KHQpIHtcbiAgICAgICAgcmV0dXJuIGVuYzgodC5zbGljZSgwLCA4KSkuY29uY2F0KGVuYzgodC5zbGljZSg4LCAxNikpKTtcbiAgICB9XG5cbiAgICBzZXRLZXlzKHBhc3N3ZCk7IC8vIFNldHVwIGtleXNcbiAgICByZXR1cm4geyAnZW5jcnlwdCc6IGVuY3J5cHQgfTsgLy8gUHVibGljIGludGVyZmFjZVxufTsgLy8gZnVuY3Rpb24gREVTIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBEaXNwbGF5O1xuXG52YXIgX2Jyb3dzZXJzID0gcmVxdWlyZSgnLi91dGlsL2Jyb3dzZXJzLmpzJyk7XG5cbnZhciBfcHJvcGVydGllcyA9IHJlcXVpcmUoJy4vdXRpbC9wcm9wZXJ0aWVzLmpzJyk7XG5cbnZhciBfbG9nZ2luZyA9IHJlcXVpcmUoJy4vdXRpbC9sb2dnaW5nLmpzJyk7XG5cbnZhciBMb2cgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfbG9nZ2luZyk7XG5cbnZhciBfYmFzZSA9IHJlcXVpcmUoJy4vYmFzZTY0LmpzJyk7XG5cbnZhciBfYmFzZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9iYXNlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBlbHNlIHsgdmFyIG5ld09iaiA9IHt9OyBpZiAob2JqICE9IG51bGwpIHsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyByZXR1cm4gbmV3T2JqOyB9IH1cblxuLypcbiAqIG5vVk5DOiBIVE1MNSBWTkMgY2xpZW50XG4gKiBDb3B5cmlnaHQgKEMpIDIwMTIgSm9lbCBNYXJ0aW5cbiAqIENvcHlyaWdodCAoQykgMjAxNSBTYW11ZWwgTWFubmVoZWQgZm9yIENlbmRpbyBBQlxuICogTGljZW5zZWQgdW5kZXIgTVBMIDIuMCAoc2VlIExJQ0VOU0UudHh0KVxuICpcbiAqIFNlZSBSRUFETUUubWQgZm9yIHVzYWdlIGFuZCBpbnRlZ3JhdGlvbiBpbnN0cnVjdGlvbnMuXG4gKi9cblxuLypqc2xpbnQgYnJvd3NlcjogdHJ1ZSwgd2hpdGU6IGZhbHNlICovXG4vKmdsb2JhbCBVdGlsLCBCYXNlNjQsIGNoYW5nZUN1cnNvciAqL1xuXG5mdW5jdGlvbiBEaXNwbGF5KGRlZmF1bHRzKSB7XG4gICAgdGhpcy5fZHJhd0N0eCA9IG51bGw7XG4gICAgdGhpcy5fY19mb3JjZUNhbnZhcyA9IGZhbHNlO1xuXG4gICAgdGhpcy5fcmVuZGVyUSA9IFtdOyAvLyBxdWV1ZSBkcmF3aW5nIGFjdGlvbnMgZm9yIGluLW9kZXIgcmVuZGVyaW5nXG4gICAgdGhpcy5fZmx1c2hpbmcgPSBmYWxzZTtcblxuICAgIC8vIHRoZSBmdWxsIGZyYW1lIGJ1ZmZlciAobG9naWNhbCBjYW52YXMpIHNpemVcbiAgICB0aGlzLl9mYl93aWR0aCA9IDA7XG4gICAgdGhpcy5fZmJfaGVpZ2h0ID0gMDtcblxuICAgIHRoaXMuX3ByZXZEcmF3U3R5bGUgPSBcIlwiO1xuICAgIHRoaXMuX3RpbGUgPSBudWxsO1xuICAgIHRoaXMuX3RpbGUxNngxNiA9IG51bGw7XG4gICAgdGhpcy5fdGlsZV94ID0gMDtcbiAgICB0aGlzLl90aWxlX3kgPSAwO1xuXG4gICAgKDAsIF9wcm9wZXJ0aWVzLnNldF9kZWZhdWx0cykodGhpcywgZGVmYXVsdHMsIHtcbiAgICAgICAgJ3RydWVfY29sb3InOiB0cnVlLFxuICAgICAgICAnY29sb3VyTWFwJzogW10sXG4gICAgICAgICdzY2FsZSc6IDEuMCxcbiAgICAgICAgJ3ZpZXdwb3J0JzogZmFsc2UsXG4gICAgICAgICdyZW5kZXJfbW9kZSc6ICcnLFxuICAgICAgICBcIm9uRmx1c2hcIjogZnVuY3Rpb24gKCkge31cbiAgICB9KTtcblxuICAgIExvZy5EZWJ1ZyhcIj4+IERpc3BsYXkuY29uc3RydWN0b3JcIik7XG5cbiAgICAvLyBUaGUgdmlzaWJsZSBjYW52YXNcbiAgICBpZiAoIXRoaXMuX3RhcmdldCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUYXJnZXQgbXVzdCBiZSBzZXRcIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLl90YXJnZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0IG11c3QgYmUgYSBET00gZWxlbWVudCcpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fdGFyZ2V0LmdldENvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm8gZ2V0Q29udGV4dCBtZXRob2RcIik7XG4gICAgfVxuXG4gICAgdGhpcy5fdGFyZ2V0Q3R4ID0gdGhpcy5fdGFyZ2V0LmdldENvbnRleHQoJzJkJyk7XG5cbiAgICAvLyB0aGUgdmlzaWJsZSBjYW52YXMgdmlld3BvcnQgKGkuZS4gd2hhdCBhY3R1YWxseSBnZXRzIHNlZW4pXG4gICAgdGhpcy5fdmlld3BvcnRMb2MgPSB7ICd4JzogMCwgJ3knOiAwLCAndyc6IHRoaXMuX3RhcmdldC53aWR0aCwgJ2gnOiB0aGlzLl90YXJnZXQuaGVpZ2h0IH07XG5cbiAgICAvLyBUaGUgaGlkZGVuIGNhbnZhcywgd2hlcmUgd2UgZG8gdGhlIGFjdHVhbCByZW5kZXJpbmdcbiAgICB0aGlzLl9iYWNrYnVmZmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgdGhpcy5fZHJhd0N0eCA9IHRoaXMuX2JhY2tidWZmZXIuZ2V0Q29udGV4dCgnMmQnKTtcblxuICAgIHRoaXMuX2RhbWFnZUJvdW5kcyA9IHsgbGVmdDogMCwgdG9wOiAwLFxuICAgICAgICByaWdodDogdGhpcy5fYmFja2J1ZmZlci53aWR0aCxcbiAgICAgICAgYm90dG9tOiB0aGlzLl9iYWNrYnVmZmVyLmhlaWdodCB9O1xuXG4gICAgTG9nLkRlYnVnKFwiVXNlciBBZ2VudDogXCIgKyBuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICBpZiAoX2Jyb3dzZXJzLkVuZ2luZS5nZWNrbykge1xuICAgICAgICBMb2cuRGVidWcoXCJCcm93c2VyOiBnZWNrbyBcIiArIF9icm93c2Vycy5FbmdpbmUuZ2Vja28pO1xuICAgIH1cbiAgICBpZiAoX2Jyb3dzZXJzLkVuZ2luZS53ZWJraXQpIHtcbiAgICAgICAgTG9nLkRlYnVnKFwiQnJvd3Nlcjogd2Via2l0IFwiICsgX2Jyb3dzZXJzLkVuZ2luZS53ZWJraXQpO1xuICAgIH1cbiAgICBpZiAoX2Jyb3dzZXJzLkVuZ2luZS50cmlkZW50KSB7XG4gICAgICAgIExvZy5EZWJ1ZyhcIkJyb3dzZXI6IHRyaWRlbnQgXCIgKyBfYnJvd3NlcnMuRW5naW5lLnRyaWRlbnQpO1xuICAgIH1cbiAgICBpZiAoX2Jyb3dzZXJzLkVuZ2luZS5wcmVzdG8pIHtcbiAgICAgICAgTG9nLkRlYnVnKFwiQnJvd3NlcjogcHJlc3RvIFwiICsgX2Jyb3dzZXJzLkVuZ2luZS5wcmVzdG8pO1xuICAgIH1cblxuICAgIHRoaXMuY2xlYXIoKTtcblxuICAgIC8vIENoZWNrIGNhbnZhcyBmZWF0dXJlc1xuICAgIGlmICgnY3JlYXRlSW1hZ2VEYXRhJyBpbiB0aGlzLl9kcmF3Q3R4KSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcl9tb2RlID0gJ2NhbnZhcyByZW5kZXJpbmcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbnZhcyBkb2VzIG5vdCBzdXBwb3J0IGNyZWF0ZUltYWdlRGF0YVwiKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fcHJlZmVyX2pzID09PSBudWxsKSB7XG4gICAgICAgIExvZy5JbmZvKFwiUHJlZmVyaW5nIGphdmFzY3JpcHQgb3BlcmF0aW9uc1wiKTtcbiAgICAgICAgdGhpcy5fcHJlZmVyX2pzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgYnJvd3NlciBzdXBwb3J0IGZvciBzZXR0aW5nIHRoZSBjdXJzb3IgdmlhIGRhdGEgVVJJIHNjaGVtZVxuICAgIGlmICh0aGlzLl9jdXJzb3JfdXJpIHx8IHRoaXMuX2N1cnNvcl91cmkgPT09IG51bGwgfHwgdGhpcy5fY3Vyc29yX3VyaSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX2N1cnNvcl91cmkgPSAoMCwgX2Jyb3dzZXJzLmJyb3dzZXJTdXBwb3J0c0N1cnNvclVSSXMpKCk7XG4gICAgfVxuXG4gICAgTG9nLkRlYnVnKFwiPDwgRGlzcGxheS5jb25zdHJ1Y3RvclwiKTtcbn07XG5cbnZhciBTVVBQT1JUU19JTUFHRURBVEFfQ09OU1RSVUNUT1IgPSBmYWxzZTtcbnRyeSB7XG4gICAgbmV3IEltYWdlRGF0YShuZXcgVWludDhDbGFtcGVkQXJyYXkoNCksIDEsIDEpO1xuICAgIFNVUFBPUlRTX0lNQUdFREFUQV9DT05TVFJVQ1RPUiA9IHRydWU7XG59IGNhdGNoIChleCkge1xuICAgIC8vIGlnbm9yZSBmYWlsdXJlXG59XG5cbkRpc3BsYXkucHJvdG90eXBlID0ge1xuICAgIC8vIFB1YmxpYyBtZXRob2RzXG4gICAgdmlld3BvcnRDaGFuZ2VQb3M6IGZ1bmN0aW9uIChkZWx0YVgsIGRlbHRhWSkge1xuICAgICAgICB2YXIgdnAgPSB0aGlzLl92aWV3cG9ydExvYztcbiAgICAgICAgZGVsdGFYID0gTWF0aC5mbG9vcihkZWx0YVgpO1xuICAgICAgICBkZWx0YVkgPSBNYXRoLmZsb29yKGRlbHRhWSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl92aWV3cG9ydCkge1xuICAgICAgICAgICAgZGVsdGFYID0gLXZwLnc7IC8vIGNsYW1wZWQgbGF0ZXIgb2Ygb3V0IG9mIGJvdW5kc1xuICAgICAgICAgICAgZGVsdGFZID0gLXZwLmg7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdngyID0gdnAueCArIHZwLncgLSAxO1xuICAgICAgICB2YXIgdnkyID0gdnAueSArIHZwLmggLSAxO1xuXG4gICAgICAgIC8vIFBvc2l0aW9uIGNoYW5nZVxuXG4gICAgICAgIGlmIChkZWx0YVggPCAwICYmIHZwLnggKyBkZWx0YVggPCAwKSB7XG4gICAgICAgICAgICBkZWx0YVggPSAtdnAueDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodngyICsgZGVsdGFYID49IHRoaXMuX2ZiX3dpZHRoKSB7XG4gICAgICAgICAgICBkZWx0YVggLT0gdngyICsgZGVsdGFYIC0gdGhpcy5fZmJfd2lkdGggKyAxO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZwLnkgKyBkZWx0YVkgPCAwKSB7XG4gICAgICAgICAgICBkZWx0YVkgPSAtdnAueTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodnkyICsgZGVsdGFZID49IHRoaXMuX2ZiX2hlaWdodCkge1xuICAgICAgICAgICAgZGVsdGFZIC09IHZ5MiArIGRlbHRhWSAtIHRoaXMuX2ZiX2hlaWdodCArIDE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGVsdGFYID09PSAwICYmIGRlbHRhWSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIExvZy5EZWJ1ZyhcInZpZXdwb3J0Q2hhbmdlIGRlbHRhWDogXCIgKyBkZWx0YVggKyBcIiwgZGVsdGFZOiBcIiArIGRlbHRhWSk7XG5cbiAgICAgICAgdnAueCArPSBkZWx0YVg7XG4gICAgICAgIHZwLnkgKz0gZGVsdGFZO1xuXG4gICAgICAgIHRoaXMuX2RhbWFnZSh2cC54LCB2cC55LCB2cC53LCB2cC5oKTtcblxuICAgICAgICB0aGlzLmZsaXAoKTtcbiAgICB9LFxuXG4gICAgdmlld3BvcnRDaGFuZ2VTaXplOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuXG4gICAgICAgIGlmICghdGhpcy5fdmlld3BvcnQgfHwgdHlwZW9mIHdpZHRoID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZiBoZWlnaHQgPT09IFwidW5kZWZpbmVkXCIpIHtcblxuICAgICAgICAgICAgTG9nLkRlYnVnKFwiU2V0dGluZyB2aWV3cG9ydCB0byBmdWxsIGRpc3BsYXkgcmVnaW9uXCIpO1xuICAgICAgICAgICAgd2lkdGggPSB0aGlzLl9mYl93aWR0aDtcbiAgICAgICAgICAgIGhlaWdodCA9IHRoaXMuX2ZiX2hlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh3aWR0aCA+IHRoaXMuX2ZiX3dpZHRoKSB7XG4gICAgICAgICAgICB3aWR0aCA9IHRoaXMuX2ZiX3dpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZWlnaHQgPiB0aGlzLl9mYl9oZWlnaHQpIHtcbiAgICAgICAgICAgIGhlaWdodCA9IHRoaXMuX2ZiX2hlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB2cCA9IHRoaXMuX3ZpZXdwb3J0TG9jO1xuICAgICAgICBpZiAodnAudyAhPT0gd2lkdGggfHwgdnAuaCAhPT0gaGVpZ2h0KSB7XG4gICAgICAgICAgICB2cC53ID0gd2lkdGg7XG4gICAgICAgICAgICB2cC5oID0gaGVpZ2h0O1xuXG4gICAgICAgICAgICB2YXIgY2FudmFzID0gdGhpcy5fdGFyZ2V0O1xuICAgICAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG4gICAgICAgICAgICAvLyBUaGUgcG9zaXRpb24gbWlnaHQgbmVlZCB0byBiZSB1cGRhdGVkIGlmIHdlJ3ZlIGdyb3duXG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0Q2hhbmdlUG9zKDAsIDApO1xuXG4gICAgICAgICAgICB0aGlzLl9kYW1hZ2UodnAueCwgdnAueSwgdnAudywgdnAuaCk7XG4gICAgICAgICAgICB0aGlzLmZsaXAoKTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB2aXNpYmxlIHNpemUgb2YgdGhlIHRhcmdldCBjYW52YXNcbiAgICAgICAgICAgIHRoaXMuX3Jlc2NhbGUodGhpcy5fc2NhbGUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGFic1g6IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiB4IC8gdGhpcy5fc2NhbGUgKyB0aGlzLl92aWV3cG9ydExvYy54O1xuICAgIH0sXG5cbiAgICBhYnNZOiBmdW5jdGlvbiAoeSkge1xuICAgICAgICByZXR1cm4geSAvIHRoaXMuX3NjYWxlICsgdGhpcy5fdmlld3BvcnRMb2MueTtcbiAgICB9LFxuXG4gICAgcmVzaXplOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICB0aGlzLl9wcmV2RHJhd1N0eWxlID0gXCJcIjtcblxuICAgICAgICB0aGlzLl9mYl93aWR0aCA9IHdpZHRoO1xuICAgICAgICB0aGlzLl9mYl9oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAgICAgdmFyIGNhbnZhcyA9IHRoaXMuX2JhY2tidWZmZXI7XG4gICAgICAgIGlmIChjYW52YXMud2lkdGggIT09IHdpZHRoIHx8IGNhbnZhcy5oZWlnaHQgIT09IGhlaWdodCkge1xuXG4gICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHNhdmUgdGhlIGNhbnZhcyBkYXRhIHNpbmNlIGNoYW5naW5nIHRoZSBzaXplIHdpbGwgY2xlYXIgaXRcbiAgICAgICAgICAgIHZhciBzYXZlSW1nID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChjYW52YXMud2lkdGggPiAwICYmIGNhbnZhcy5oZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICAgICAgc2F2ZUltZyA9IHRoaXMuX2RyYXdDdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjYW52YXMud2lkdGggIT09IHdpZHRoKSB7XG4gICAgICAgICAgICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2FudmFzLmhlaWdodCAhPT0gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHNhdmVJbWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kcmF3Q3R4LnB1dEltYWdlRGF0YShzYXZlSW1nLCAwLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlYWRqdXN0IHRoZSB2aWV3cG9ydCBhcyBpdCBtYXkgYmUgaW5jb3JyZWN0bHkgc2l6ZWRcbiAgICAgICAgLy8gYW5kIHBvc2l0aW9uZWRcbiAgICAgICAgdmFyIHZwID0gdGhpcy5fdmlld3BvcnRMb2M7XG4gICAgICAgIHRoaXMudmlld3BvcnRDaGFuZ2VTaXplKHZwLncsIHZwLmgpO1xuICAgICAgICB0aGlzLnZpZXdwb3J0Q2hhbmdlUG9zKDAsIDApO1xuICAgIH0sXG5cbiAgICAvLyBUcmFjayB3aGF0IHBhcnRzIG9mIHRoZSB2aXNpYmxlIGNhbnZhcyB0aGF0IG5lZWQgdXBkYXRpbmdcbiAgICBfZGFtYWdlOiBmdW5jdGlvbiAoeCwgeSwgdywgaCkge1xuICAgICAgICBpZiAoeCA8IHRoaXMuX2RhbWFnZUJvdW5kcy5sZWZ0KSB7XG4gICAgICAgICAgICB0aGlzLl9kYW1hZ2VCb3VuZHMubGVmdCA9IHg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHkgPCB0aGlzLl9kYW1hZ2VCb3VuZHMudG9wKSB7XG4gICAgICAgICAgICB0aGlzLl9kYW1hZ2VCb3VuZHMudG9wID0geTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeCArIHcgPiB0aGlzLl9kYW1hZ2VCb3VuZHMucmlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuX2RhbWFnZUJvdW5kcy5yaWdodCA9IHggKyB3O1xuICAgICAgICB9XG4gICAgICAgIGlmICh5ICsgaCA+IHRoaXMuX2RhbWFnZUJvdW5kcy5ib3R0b20pIHtcbiAgICAgICAgICAgIHRoaXMuX2RhbWFnZUJvdW5kcy5ib3R0b20gPSB5ICsgaDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBVcGRhdGUgdGhlIHZpc2libGUgY2FudmFzIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZVxuICAgIC8vIHJlbmRlcmluZyBjYW52YXNcbiAgICBmbGlwOiBmdW5jdGlvbiAoZnJvbV9xdWV1ZSkge1xuICAgICAgICBpZiAodGhpcy5fcmVuZGVyUS5sZW5ndGggIT09IDAgJiYgIWZyb21fcXVldWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlclFfcHVzaCh7XG4gICAgICAgICAgICAgICAgJ3R5cGUnOiAnZmxpcCdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHgsIHksIHZ4LCB2eSwgdywgaDtcblxuICAgICAgICAgICAgeCA9IHRoaXMuX2RhbWFnZUJvdW5kcy5sZWZ0O1xuICAgICAgICAgICAgeSA9IHRoaXMuX2RhbWFnZUJvdW5kcy50b3A7XG4gICAgICAgICAgICB3ID0gdGhpcy5fZGFtYWdlQm91bmRzLnJpZ2h0IC0geDtcbiAgICAgICAgICAgIGggPSB0aGlzLl9kYW1hZ2VCb3VuZHMuYm90dG9tIC0geTtcblxuICAgICAgICAgICAgdnggPSB4IC0gdGhpcy5fdmlld3BvcnRMb2MueDtcbiAgICAgICAgICAgIHZ5ID0geSAtIHRoaXMuX3ZpZXdwb3J0TG9jLnk7XG5cbiAgICAgICAgICAgIGlmICh2eCA8IDApIHtcbiAgICAgICAgICAgICAgICB3ICs9IHZ4O1xuICAgICAgICAgICAgICAgIHggLT0gdng7XG4gICAgICAgICAgICAgICAgdnggPSAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZ5IDwgMCkge1xuICAgICAgICAgICAgICAgIGggKz0gdnk7XG4gICAgICAgICAgICAgICAgeSAtPSB2eTtcbiAgICAgICAgICAgICAgICB2eSA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2eCArIHcgPiB0aGlzLl92aWV3cG9ydExvYy53KSB7XG4gICAgICAgICAgICAgICAgdyA9IHRoaXMuX3ZpZXdwb3J0TG9jLncgLSB2eDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2eSArIGggPiB0aGlzLl92aWV3cG9ydExvYy5oKSB7XG4gICAgICAgICAgICAgICAgaCA9IHRoaXMuX3ZpZXdwb3J0TG9jLmggLSB2eTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHcgPiAwICYmIGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gRklYTUU6IFdlIG1heSBuZWVkIHRvIGRpc2FibGUgaW1hZ2Ugc21vb3RoaW5nIGhlcmVcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgYXMgd2VsbCAoc2VlIGNvcHlJbWFnZSgpKSwgYnV0IHdlIGhhdmVuJ3RcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgbm90aWNlZCBhbnkgcHJvYmxlbSB5ZXQuXG4gICAgICAgICAgICAgICAgdGhpcy5fdGFyZ2V0Q3R4LmRyYXdJbWFnZSh0aGlzLl9iYWNrYnVmZmVyLCB4LCB5LCB3LCBoLCB2eCwgdnksIHcsIGgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9kYW1hZ2VCb3VuZHMubGVmdCA9IHRoaXMuX2RhbWFnZUJvdW5kcy50b3AgPSA2NTUzNTtcbiAgICAgICAgICAgIHRoaXMuX2RhbWFnZUJvdW5kcy5yaWdodCA9IHRoaXMuX2RhbWFnZUJvdW5kcy5ib3R0b20gPSAwO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNsZWFyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9sb2dvKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZSh0aGlzLl9sb2dvLndpZHRoLCB0aGlzLl9sb2dvLmhlaWdodCk7XG4gICAgICAgICAgICB0aGlzLmltYWdlUmVjdCgwLCAwLCB0aGlzLl9sb2dvLnR5cGUsIHRoaXMuX2xvZ28uZGF0YSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc2l6ZSgyNDAsIDIwKTtcbiAgICAgICAgICAgIHRoaXMuX2RyYXdDdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuX2ZiX3dpZHRoLCB0aGlzLl9mYl9oZWlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmxpcCgpO1xuICAgIH0sXG5cbiAgICBwZW5kaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJRLmxlbmd0aCA+IDA7XG4gICAgfSxcblxuICAgIGZsdXNoOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZW5kZXJRLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fb25GbHVzaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZmx1c2hpbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGZpbGxSZWN0OiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgY29sb3IsIGZyb21fcXVldWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JlbmRlclEubGVuZ3RoICE9PSAwICYmICFmcm9tX3F1ZXVlKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJRX3B1c2goe1xuICAgICAgICAgICAgICAgICd0eXBlJzogJ2ZpbGwnLFxuICAgICAgICAgICAgICAgICd4JzogeCxcbiAgICAgICAgICAgICAgICAneSc6IHksXG4gICAgICAgICAgICAgICAgJ3dpZHRoJzogd2lkdGgsXG4gICAgICAgICAgICAgICAgJ2hlaWdodCc6IGhlaWdodCxcbiAgICAgICAgICAgICAgICAnY29sb3InOiBjb2xvclxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRGaWxsQ29sb3IoY29sb3IpO1xuICAgICAgICAgICAgdGhpcy5fZHJhd0N0eC5maWxsUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMuX2RhbWFnZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBjb3B5SW1hZ2U6IGZ1bmN0aW9uIChvbGRfeCwgb2xkX3ksIG5ld194LCBuZXdfeSwgdywgaCwgZnJvbV9xdWV1ZSkge1xuICAgICAgICBpZiAodGhpcy5fcmVuZGVyUS5sZW5ndGggIT09IDAgJiYgIWZyb21fcXVldWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlclFfcHVzaCh7XG4gICAgICAgICAgICAgICAgJ3R5cGUnOiAnY29weScsXG4gICAgICAgICAgICAgICAgJ29sZF94Jzogb2xkX3gsXG4gICAgICAgICAgICAgICAgJ29sZF95Jzogb2xkX3ksXG4gICAgICAgICAgICAgICAgJ3gnOiBuZXdfeCxcbiAgICAgICAgICAgICAgICAneSc6IG5ld195LFxuICAgICAgICAgICAgICAgICd3aWR0aCc6IHcsXG4gICAgICAgICAgICAgICAgJ2hlaWdodCc6IGhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRHVlIHRvIHRoaXMgYnVnIGFtb25nIG90aGVycyBbMV0gd2UgbmVlZCB0byBkaXNhYmxlIHRoZSBpbWFnZS1zbW9vdGhpbmcgdG9cbiAgICAgICAgICAgIC8vIGF2b2lkIGdldHRpbmcgYSBibHVyIGVmZmVjdCB3aGVuIGNvcHlpbmcgZGF0YS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAxLiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTk0NzE5XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBzZXQgdGhlc2UgZXZlcnkgdGltZSBzaW5jZSBhbGwgcHJvcGVydGllcyBhcmUgcmVzZXRcbiAgICAgICAgICAgIC8vIHdoZW4gdGhlIHRoZSBzaXplIGlzIGNoYW5nZWRcbiAgICAgICAgICAgIHRoaXMuX2RyYXdDdHgubW96SW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9kcmF3Q3R4LndlYmtpdEltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fZHJhd0N0eC5tc0ltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fZHJhd0N0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgdGhpcy5fZHJhd0N0eC5kcmF3SW1hZ2UodGhpcy5fYmFja2J1ZmZlciwgb2xkX3gsIG9sZF95LCB3LCBoLCBuZXdfeCwgbmV3X3ksIHcsIGgpO1xuICAgICAgICAgICAgdGhpcy5fZGFtYWdlKG5ld194LCBuZXdfeSwgdywgaCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgaW1hZ2VSZWN0OiBmdW5jdGlvbiAoeCwgeSwgbWltZSwgYXJyKSB7XG4gICAgICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgaW1nLnNyYyA9IFwiZGF0YTogXCIgKyBtaW1lICsgXCI7YmFzZTY0LFwiICsgX2Jhc2UyLmRlZmF1bHQuZW5jb2RlKGFycik7XG4gICAgICAgIHRoaXMuX3JlbmRlclFfcHVzaCh7XG4gICAgICAgICAgICAndHlwZSc6ICdpbWcnLFxuICAgICAgICAgICAgJ2ltZyc6IGltZyxcbiAgICAgICAgICAgICd4JzogeCxcbiAgICAgICAgICAgICd5JzogeVxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gc3RhcnQgdXBkYXRpbmcgYSB0aWxlXG4gICAgc3RhcnRUaWxlOiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgY29sb3IpIHtcbiAgICAgICAgdGhpcy5fdGlsZV94ID0geDtcbiAgICAgICAgdGhpcy5fdGlsZV95ID0geTtcbiAgICAgICAgaWYgKHdpZHRoID09PSAxNiAmJiBoZWlnaHQgPT09IDE2KSB7XG4gICAgICAgICAgICB0aGlzLl90aWxlID0gdGhpcy5fdGlsZTE2eDE2O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fdGlsZSA9IHRoaXMuX2RyYXdDdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3ByZWZlcl9qcykge1xuICAgICAgICAgICAgdmFyIGJncjtcbiAgICAgICAgICAgIGlmICh0aGlzLl90cnVlX2NvbG9yKSB7XG4gICAgICAgICAgICAgICAgYmdyID0gY29sb3I7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJnciA9IHRoaXMuX2NvbG91ck1hcFtjb2xvclswXV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcmVkID0gYmdyWzJdO1xuICAgICAgICAgICAgdmFyIGdyZWVuID0gYmdyWzFdO1xuICAgICAgICAgICAgdmFyIGJsdWUgPSBiZ3JbMF07XG5cbiAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fdGlsZS5kYXRhO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3aWR0aCAqIGhlaWdodCAqIDQ7IGkgKz0gNCkge1xuICAgICAgICAgICAgICAgIGRhdGFbaV0gPSByZWQ7XG4gICAgICAgICAgICAgICAgZGF0YVtpICsgMV0gPSBncmVlbjtcbiAgICAgICAgICAgICAgICBkYXRhW2kgKyAyXSA9IGJsdWU7XG4gICAgICAgICAgICAgICAgZGF0YVtpICsgM10gPSAyNTU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpbGxSZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQsIGNvbG9yLCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyB1cGRhdGUgc3ViLXJlY3RhbmdsZSBvZiB0aGUgY3VycmVudCB0aWxlXG4gICAgc3ViVGlsZTogZnVuY3Rpb24gKHgsIHksIHcsIGgsIGNvbG9yKSB7XG4gICAgICAgIGlmICh0aGlzLl9wcmVmZXJfanMpIHtcbiAgICAgICAgICAgIHZhciBiZ3I7XG4gICAgICAgICAgICBpZiAodGhpcy5fdHJ1ZV9jb2xvcikge1xuICAgICAgICAgICAgICAgIGJnciA9IGNvbG9yO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBiZ3IgPSB0aGlzLl9jb2xvdXJNYXBbY29sb3JbMF1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJlZCA9IGJnclsyXTtcbiAgICAgICAgICAgIHZhciBncmVlbiA9IGJnclsxXTtcbiAgICAgICAgICAgIHZhciBibHVlID0gYmdyWzBdO1xuICAgICAgICAgICAgdmFyIHhlbmQgPSB4ICsgdztcbiAgICAgICAgICAgIHZhciB5ZW5kID0geSArIGg7XG5cbiAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fdGlsZS5kYXRhO1xuICAgICAgICAgICAgdmFyIHdpZHRoID0gdGhpcy5fdGlsZS53aWR0aDtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSB5OyBqIDwgeWVuZDsgaisrKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHg7IGkgPCB4ZW5kOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSAoaSArIGogKiB3aWR0aCkgKiA0O1xuICAgICAgICAgICAgICAgICAgICBkYXRhW3BdID0gcmVkO1xuICAgICAgICAgICAgICAgICAgICBkYXRhW3AgKyAxXSA9IGdyZWVuO1xuICAgICAgICAgICAgICAgICAgICBkYXRhW3AgKyAyXSA9IGJsdWU7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFbcCArIDNdID0gMjU1O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmlsbFJlY3QodGhpcy5fdGlsZV94ICsgeCwgdGhpcy5fdGlsZV95ICsgeSwgdywgaCwgY29sb3IsIHRydWUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIGRyYXcgdGhlIGN1cnJlbnQgdGlsZSB0byB0aGUgc2NyZWVuXG4gICAgZmluaXNoVGlsZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fcHJlZmVyX2pzKSB7XG4gICAgICAgICAgICB0aGlzLl9kcmF3Q3R4LnB1dEltYWdlRGF0YSh0aGlzLl90aWxlLCB0aGlzLl90aWxlX3gsIHRoaXMuX3RpbGVfeSk7XG4gICAgICAgICAgICB0aGlzLl9kYW1hZ2UodGhpcy5fdGlsZV94LCB0aGlzLl90aWxlX3ksIHRoaXMuX3RpbGUud2lkdGgsIHRoaXMuX3RpbGUuaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlbHNlOiBOby1vcCAtLSBhbHJlYWR5IGRvbmUgYnkgc2V0U3ViVGlsZVxuICAgIH0sXG5cbiAgICBibGl0SW1hZ2U6IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBhcnIsIG9mZnNldCwgZnJvbV9xdWV1ZSkge1xuICAgICAgICBpZiAodGhpcy5fcmVuZGVyUS5sZW5ndGggIT09IDAgJiYgIWZyb21fcXVldWUpIHtcbiAgICAgICAgICAgIC8vIE5CKGRpcmVjdHhtYW4xMik6IGl0J3MgdGVjaG5pY2FsbHkgbW9yZSBwZXJmb3JtYW50IGhlcmUgdG8gdXNlIHByZWFsbG9jYXRlZCBhcnJheXMsXG4gICAgICAgICAgICAvLyBidXQgaXQncyBhIGxvdCBvZiBleHRyYSB3b3JrIGZvciBub3QgYSBsb3Qgb2YgcGF5b2ZmIC0tIGlmIHdlJ3JlIHVzaW5nIHRoZSByZW5kZXIgcXVldWUsXG4gICAgICAgICAgICAvLyB0aGlzIHByb2JhYmx5IGlzbid0IGdldHRpbmcgY2FsbGVkICpuZWFybHkqIGFzIG11Y2hcbiAgICAgICAgICAgIHZhciBuZXdfYXJyID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWlnaHQgKiA0KTtcbiAgICAgICAgICAgIG5ld19hcnIuc2V0KG5ldyBVaW50OEFycmF5KGFyci5idWZmZXIsIDAsIG5ld19hcnIubGVuZ3RoKSk7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJRX3B1c2goe1xuICAgICAgICAgICAgICAgICd0eXBlJzogJ2JsaXQnLFxuICAgICAgICAgICAgICAgICdkYXRhJzogbmV3X2FycixcbiAgICAgICAgICAgICAgICAneCc6IHgsXG4gICAgICAgICAgICAgICAgJ3knOiB5LFxuICAgICAgICAgICAgICAgICd3aWR0aCc6IHdpZHRoLFxuICAgICAgICAgICAgICAgICdoZWlnaHQnOiBoZWlnaHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3RydWVfY29sb3IpIHtcbiAgICAgICAgICAgIHRoaXMuX2JncnhJbWFnZURhdGEoeCwgeSwgd2lkdGgsIGhlaWdodCwgYXJyLCBvZmZzZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fY21hcEltYWdlRGF0YSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBhcnIsIG9mZnNldCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYmxpdFJnYkltYWdlOiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgYXJyLCBvZmZzZXQsIGZyb21fcXVldWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JlbmRlclEubGVuZ3RoICE9PSAwICYmICFmcm9tX3F1ZXVlKSB7XG4gICAgICAgICAgICAvLyBOQihkaXJlY3R4bWFuMTIpOiBpdCdzIHRlY2huaWNhbGx5IG1vcmUgcGVyZm9ybWFudCBoZXJlIHRvIHVzZSBwcmVhbGxvY2F0ZWQgYXJyYXlzLFxuICAgICAgICAgICAgLy8gYnV0IGl0J3MgYSBsb3Qgb2YgZXh0cmEgd29yayBmb3Igbm90IGEgbG90IG9mIHBheW9mZiAtLSBpZiB3ZSdyZSB1c2luZyB0aGUgcmVuZGVyIHF1ZXVlLFxuICAgICAgICAgICAgLy8gdGhpcyBwcm9iYWJseSBpc24ndCBnZXR0aW5nIGNhbGxlZCAqbmVhcmx5KiBhcyBtdWNoXG4gICAgICAgICAgICB2YXIgbmV3X2FyciA9IG5ldyBVaW50OEFycmF5KHdpZHRoICogaGVpZ2h0ICogMyk7XG4gICAgICAgICAgICBuZXdfYXJyLnNldChuZXcgVWludDhBcnJheShhcnIuYnVmZmVyLCAwLCBuZXdfYXJyLmxlbmd0aCkpO1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyUV9wdXNoKHtcbiAgICAgICAgICAgICAgICAndHlwZSc6ICdibGl0UmdiJyxcbiAgICAgICAgICAgICAgICAnZGF0YSc6IG5ld19hcnIsXG4gICAgICAgICAgICAgICAgJ3gnOiB4LFxuICAgICAgICAgICAgICAgICd5JzogeSxcbiAgICAgICAgICAgICAgICAnd2lkdGgnOiB3aWR0aCxcbiAgICAgICAgICAgICAgICAnaGVpZ2h0JzogaGVpZ2h0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl90cnVlX2NvbG9yKSB7XG4gICAgICAgICAgICB0aGlzLl9yZ2JJbWFnZURhdGEoeCwgeSwgd2lkdGgsIGhlaWdodCwgYXJyLCBvZmZzZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcHJvYmFibHkgd3Jvbmc/XG4gICAgICAgICAgICB0aGlzLl9jbWFwSW1hZ2VEYXRhKHgsIHksIHdpZHRoLCBoZWlnaHQsIGFyciwgb2Zmc2V0KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBibGl0UmdieEltYWdlOiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgYXJyLCBvZmZzZXQsIGZyb21fcXVldWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JlbmRlclEubGVuZ3RoICE9PSAwICYmICFmcm9tX3F1ZXVlKSB7XG4gICAgICAgICAgICAvLyBOQihkaXJlY3R4bWFuMTIpOiBpdCdzIHRlY2huaWNhbGx5IG1vcmUgcGVyZm9ybWFudCBoZXJlIHRvIHVzZSBwcmVhbGxvY2F0ZWQgYXJyYXlzLFxuICAgICAgICAgICAgLy8gYnV0IGl0J3MgYSBsb3Qgb2YgZXh0cmEgd29yayBmb3Igbm90IGEgbG90IG9mIHBheW9mZiAtLSBpZiB3ZSdyZSB1c2luZyB0aGUgcmVuZGVyIHF1ZXVlLFxuICAgICAgICAgICAgLy8gdGhpcyBwcm9iYWJseSBpc24ndCBnZXR0aW5nIGNhbGxlZCAqbmVhcmx5KiBhcyBtdWNoXG4gICAgICAgICAgICB2YXIgbmV3X2FyciA9IG5ldyBVaW50OEFycmF5KHdpZHRoICogaGVpZ2h0ICogNCk7XG4gICAgICAgICAgICBuZXdfYXJyLnNldChuZXcgVWludDhBcnJheShhcnIuYnVmZmVyLCAwLCBuZXdfYXJyLmxlbmd0aCkpO1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyUV9wdXNoKHtcbiAgICAgICAgICAgICAgICAndHlwZSc6ICdibGl0UmdieCcsXG4gICAgICAgICAgICAgICAgJ2RhdGEnOiBuZXdfYXJyLFxuICAgICAgICAgICAgICAgICd4JzogeCxcbiAgICAgICAgICAgICAgICAneSc6IHksXG4gICAgICAgICAgICAgICAgJ3dpZHRoJzogd2lkdGgsXG4gICAgICAgICAgICAgICAgJ2hlaWdodCc6IGhlaWdodFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9yZ2J4SW1hZ2VEYXRhKHgsIHksIHdpZHRoLCBoZWlnaHQsIGFyciwgb2Zmc2V0KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBkcmF3SW1hZ2U6IGZ1bmN0aW9uIChpbWcsIHgsIHkpIHtcbiAgICAgICAgdGhpcy5fZHJhd0N0eC5kcmF3SW1hZ2UoaW1nLCB4LCB5KTtcbiAgICAgICAgdGhpcy5fZGFtYWdlKHgsIHksIGltZy53aWR0aCwgaW1nLmhlaWdodCk7XG4gICAgfSxcblxuICAgIGNoYW5nZUN1cnNvcjogZnVuY3Rpb24gKHBpeGVscywgbWFzaywgaG90eCwgaG90eSwgdywgaCkge1xuICAgICAgICBpZiAodGhpcy5fY3Vyc29yX3VyaSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIExvZy5XYXJuKFwiY2hhbmdlQ3Vyc29yIGNhbGxlZCBidXQgbm8gY3Vyc29yIGRhdGEgVVJJIHN1cHBvcnRcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fdHJ1ZV9jb2xvcikge1xuICAgICAgICAgICAgRGlzcGxheS5jaGFuZ2VDdXJzb3IodGhpcy5fdGFyZ2V0LCBwaXhlbHMsIG1hc2ssIGhvdHgsIGhvdHksIHcsIGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgRGlzcGxheS5jaGFuZ2VDdXJzb3IodGhpcy5fdGFyZ2V0LCBwaXhlbHMsIG1hc2ssIGhvdHgsIGhvdHksIHcsIGgsIHRoaXMuX2NvbG91ck1hcCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZGVmYXVsdEN1cnNvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl90YXJnZXQuc3R5bGUuY3Vyc29yID0gXCJkZWZhdWx0XCI7XG4gICAgfSxcblxuICAgIGRpc2FibGVMb2NhbEN1cnNvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl90YXJnZXQuc3R5bGUuY3Vyc29yID0gXCJub25lXCI7XG4gICAgfSxcblxuICAgIGNsaXBwaW5nRGlzcGxheTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdnAgPSB0aGlzLl92aWV3cG9ydExvYztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZiX3dpZHRoID4gdnAudyB8fCB0aGlzLl9mYl9oZWlnaHQgPiB2cC5oO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZGVuIGdldHRlcnMvc2V0dGVyc1xuICAgIHNldF9zY2FsZTogZnVuY3Rpb24gKHNjYWxlKSB7XG4gICAgICAgIHRoaXMuX3Jlc2NhbGUoc2NhbGUpO1xuICAgIH0sXG5cbiAgICBzZXRfdmlld3BvcnQ6IGZ1bmN0aW9uICh2aWV3cG9ydCkge1xuICAgICAgICB0aGlzLl92aWV3cG9ydCA9IHZpZXdwb3J0O1xuICAgICAgICAvLyBNYXkgbmVlZCB0byByZWFkanVzdCB0aGUgdmlld3BvcnQgZGltZW5zaW9uc1xuICAgICAgICB2YXIgdnAgPSB0aGlzLl92aWV3cG9ydExvYztcbiAgICAgICAgdGhpcy52aWV3cG9ydENoYW5nZVNpemUodnAudywgdnAuaCk7XG4gICAgICAgIHRoaXMudmlld3BvcnRDaGFuZ2VQb3MoMCwgMCk7XG4gICAgfSxcblxuICAgIGdldF93aWR0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmJfd2lkdGg7XG4gICAgfSxcbiAgICBnZXRfaGVpZ2h0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mYl9oZWlnaHQ7XG4gICAgfSxcblxuICAgIGF1dG9zY2FsZTogZnVuY3Rpb24gKGNvbnRhaW5lcldpZHRoLCBjb250YWluZXJIZWlnaHQsIGRvd25zY2FsZU9ubHkpIHtcbiAgICAgICAgdmFyIHZwID0gdGhpcy5fdmlld3BvcnRMb2M7XG4gICAgICAgIHZhciB0YXJnZXRBc3BlY3RSYXRpbyA9IGNvbnRhaW5lcldpZHRoIC8gY29udGFpbmVySGVpZ2h0O1xuICAgICAgICB2YXIgZmJBc3BlY3RSYXRpbyA9IHZwLncgLyB2cC5oO1xuXG4gICAgICAgIHZhciBzY2FsZVJhdGlvO1xuICAgICAgICBpZiAoZmJBc3BlY3RSYXRpbyA+PSB0YXJnZXRBc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgc2NhbGVSYXRpbyA9IGNvbnRhaW5lcldpZHRoIC8gdnAudztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNjYWxlUmF0aW8gPSBjb250YWluZXJIZWlnaHQgLyB2cC5oO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNjYWxlUmF0aW8gPiAxLjAgJiYgZG93bnNjYWxlT25seSkge1xuICAgICAgICAgICAgc2NhbGVSYXRpbyA9IDEuMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3Jlc2NhbGUoc2NhbGVSYXRpbyk7XG4gICAgfSxcblxuICAgIC8vIFByaXZhdGUgTWV0aG9kc1xuICAgIF9yZXNjYWxlOiBmdW5jdGlvbiAoZmFjdG9yKSB7XG4gICAgICAgIHRoaXMuX3NjYWxlID0gZmFjdG9yO1xuICAgICAgICB2YXIgdnAgPSB0aGlzLl92aWV3cG9ydExvYztcblxuICAgICAgICAvLyBOQihkaXJlY3R4bWFuMTIpOiBJZiB5b3Ugc2V0IHRoZSB3aWR0aCBkaXJlY3RseSwgb3Igc2V0IHRoZVxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBzdHlsZSB3aWR0aCB0byBhIG51bWJlciwgdGhlIGNhbnZhcyBpcyBjbGVhcmVkLlxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBIb3dldmVyLCBpZiB5b3Ugc2V0IHRoZSBzdHlsZSB3aWR0aCB0byBhIHN0cmluZ1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAoJ05OTnB4JyksIHRoZSBjYW52YXMgaXMgc2NhbGVkIHdpdGhvdXQgY2xlYXJpbmcuXG4gICAgICAgIHZhciB3aWR0aCA9IE1hdGgucm91bmQoZmFjdG9yICogdnAudykgKyAncHgnO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gTWF0aC5yb3VuZChmYWN0b3IgKiB2cC5oKSArICdweCc7XG5cbiAgICAgICAgaWYgKHRoaXMuX3RhcmdldC5zdHlsZS53aWR0aCAhPT0gd2lkdGggfHwgdGhpcy5fdGFyZ2V0LnN0eWxlLmhlaWdodCAhPT0gaGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLl90YXJnZXQuc3R5bGUud2lkdGggPSB3aWR0aDtcbiAgICAgICAgICAgIHRoaXMuX3RhcmdldC5zdHlsZS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX3NldEZpbGxDb2xvcjogZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgICAgIHZhciBiZ3I7XG4gICAgICAgIGlmICh0aGlzLl90cnVlX2NvbG9yKSB7XG4gICAgICAgICAgICBiZ3IgPSBjb2xvcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJnciA9IHRoaXMuX2NvbG91ck1hcFtjb2xvcl07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbmV3U3R5bGUgPSAncmdiKCcgKyBiZ3JbMl0gKyAnLCcgKyBiZ3JbMV0gKyAnLCcgKyBiZ3JbMF0gKyAnKSc7XG4gICAgICAgIGlmIChuZXdTdHlsZSAhPT0gdGhpcy5fcHJldkRyYXdTdHlsZSkge1xuICAgICAgICAgICAgdGhpcy5fZHJhd0N0eC5maWxsU3R5bGUgPSBuZXdTdHlsZTtcbiAgICAgICAgICAgIHRoaXMuX3ByZXZEcmF3U3R5bGUgPSBuZXdTdHlsZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfcmdiSW1hZ2VEYXRhOiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgYXJyLCBvZmZzZXQpIHtcbiAgICAgICAgdmFyIGltZyA9IHRoaXMuX2RyYXdDdHguY3JlYXRlSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICB2YXIgZGF0YSA9IGltZy5kYXRhO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IG9mZnNldDsgaSA8IHdpZHRoICogaGVpZ2h0ICogNDsgaSArPSA0LCBqICs9IDMpIHtcbiAgICAgICAgICAgIGRhdGFbaV0gPSBhcnJbal07XG4gICAgICAgICAgICBkYXRhW2kgKyAxXSA9IGFycltqICsgMV07XG4gICAgICAgICAgICBkYXRhW2kgKyAyXSA9IGFycltqICsgMl07XG4gICAgICAgICAgICBkYXRhW2kgKyAzXSA9IDI1NTsgLy8gQWxwaGFcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kcmF3Q3R4LnB1dEltYWdlRGF0YShpbWcsIHgsIHkpO1xuICAgICAgICB0aGlzLl9kYW1hZ2UoeCwgeSwgaW1nLndpZHRoLCBpbWcuaGVpZ2h0KTtcbiAgICB9LFxuXG4gICAgX2JncnhJbWFnZURhdGE6IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBhcnIsIG9mZnNldCkge1xuICAgICAgICB2YXIgaW1nID0gdGhpcy5fZHJhd0N0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHZhciBkYXRhID0gaW1nLmRhdGE7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gb2Zmc2V0OyBpIDwgd2lkdGggKiBoZWlnaHQgKiA0OyBpICs9IDQsIGogKz0gNCkge1xuICAgICAgICAgICAgZGF0YVtpXSA9IGFycltqICsgMl07XG4gICAgICAgICAgICBkYXRhW2kgKyAxXSA9IGFycltqICsgMV07XG4gICAgICAgICAgICBkYXRhW2kgKyAyXSA9IGFycltqXTtcbiAgICAgICAgICAgIGRhdGFbaSArIDNdID0gMjU1OyAvLyBBbHBoYVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RyYXdDdHgucHV0SW1hZ2VEYXRhKGltZywgeCwgeSk7XG4gICAgICAgIHRoaXMuX2RhbWFnZSh4LCB5LCBpbWcud2lkdGgsIGltZy5oZWlnaHQpO1xuICAgIH0sXG5cbiAgICBfcmdieEltYWdlRGF0YTogZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQsIGFyciwgb2Zmc2V0KSB7XG4gICAgICAgIC8vIE5CKGRpcmVjdHhtYW4xMik6IGFyciBtdXN0IGJlIGFuIFR5cGUgQXJyYXkgdmlld1xuICAgICAgICB2YXIgaW1nO1xuICAgICAgICBpZiAoU1VQUE9SVFNfSU1BR0VEQVRBX0NPTlNUUlVDVE9SKSB7XG4gICAgICAgICAgICBpbWcgPSBuZXcgSW1hZ2VEYXRhKG5ldyBVaW50OENsYW1wZWRBcnJheShhcnIuYnVmZmVyLCBhcnIuYnl0ZU9mZnNldCwgd2lkdGggKiBoZWlnaHQgKiA0KSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbWcgPSB0aGlzLl9kcmF3Q3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICAgIGltZy5kYXRhLnNldChuZXcgVWludDhDbGFtcGVkQXJyYXkoYXJyLmJ1ZmZlciwgYXJyLmJ5dGVPZmZzZXQsIHdpZHRoICogaGVpZ2h0ICogNCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2RyYXdDdHgucHV0SW1hZ2VEYXRhKGltZywgeCwgeSk7XG4gICAgICAgIHRoaXMuX2RhbWFnZSh4LCB5LCBpbWcud2lkdGgsIGltZy5oZWlnaHQpO1xuICAgIH0sXG5cbiAgICBfY21hcEltYWdlRGF0YTogZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQsIGFyciwgb2Zmc2V0KSB7XG4gICAgICAgIHZhciBpbWcgPSB0aGlzLl9kcmF3Q3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgdmFyIGRhdGEgPSBpbWcuZGF0YTtcbiAgICAgICAgdmFyIGNtYXAgPSB0aGlzLl9jb2xvdXJNYXA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gb2Zmc2V0OyBpIDwgd2lkdGggKiBoZWlnaHQgKiA0OyBpICs9IDQsIGorKykge1xuICAgICAgICAgICAgdmFyIGJnciA9IGNtYXBbYXJyW2pdXTtcbiAgICAgICAgICAgIGRhdGFbaV0gPSBiZ3JbMl07XG4gICAgICAgICAgICBkYXRhW2kgKyAxXSA9IGJnclsxXTtcbiAgICAgICAgICAgIGRhdGFbaSArIDJdID0gYmdyWzBdO1xuICAgICAgICAgICAgZGF0YVtpICsgM10gPSAyNTU7IC8vIEFscGhhXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZHJhd0N0eC5wdXRJbWFnZURhdGEoaW1nLCB4LCB5KTtcbiAgICAgICAgdGhpcy5fZGFtYWdlKHgsIHksIGltZy53aWR0aCwgaW1nLmhlaWdodCk7XG4gICAgfSxcblxuICAgIF9yZW5kZXJRX3B1c2g6IGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyUS5wdXNoKGFjdGlvbik7XG4gICAgICAgIGlmICh0aGlzLl9yZW5kZXJRLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgLy8gSWYgdGhpcyBjYW4gYmUgcmVuZGVyZWQgaW1tZWRpYXRlbHkgaXQgd2lsbCBiZSwgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyB0aGUgc2Nhbm5lciB3aWxsIHdhaXQgZm9yIHRoZSByZWxldmFudCBldmVudFxuICAgICAgICAgICAgdGhpcy5fc2Nhbl9yZW5kZXJRKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX3Jlc3VtZV9yZW5kZXJROiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFwidGhpc1wiIGlzIHRoZSBvYmplY3QgdGhhdCBpcyByZWFkeSwgbm90IHRoZVxuICAgICAgICAvLyBkaXNwbGF5IG9iamVjdFxuICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0aGlzLl9ub1ZOQ19kaXNwbGF5Ll9yZXN1bWVfcmVuZGVyUSk7XG4gICAgICAgIHRoaXMuX25vVk5DX2Rpc3BsYXkuX3NjYW5fcmVuZGVyUSgpO1xuICAgIH0sXG5cbiAgICBfc2Nhbl9yZW5kZXJROiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciByZWFkeSA9IHRydWU7XG4gICAgICAgIHdoaWxlIChyZWFkeSAmJiB0aGlzLl9yZW5kZXJRLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBhID0gdGhpcy5fcmVuZGVyUVswXTtcbiAgICAgICAgICAgIHN3aXRjaCAoYS50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZmxpcCc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmxpcCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29weSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29weUltYWdlKGEub2xkX3gsIGEub2xkX3ksIGEueCwgYS55LCBhLndpZHRoLCBhLmhlaWdodCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2ZpbGwnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGxSZWN0KGEueCwgYS55LCBhLndpZHRoLCBhLmhlaWdodCwgYS5jb2xvciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2JsaXQnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJsaXRJbWFnZShhLngsIGEueSwgYS53aWR0aCwgYS5oZWlnaHQsIGEuZGF0YSwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2JsaXRSZ2InOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmJsaXRSZ2JJbWFnZShhLngsIGEueSwgYS53aWR0aCwgYS5oZWlnaHQsIGEuZGF0YSwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2JsaXRSZ2J4JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ibGl0UmdieEltYWdlKGEueCwgYS55LCBhLndpZHRoLCBhLmhlaWdodCwgYS5kYXRhLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnaW1nJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEuaW1nLmNvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyYXdJbWFnZShhLmltZywgYS54LCBhLnkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYS5pbWcuX25vVk5DX2Rpc3BsYXkgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgYS5pbWcuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHRoaXMuX3Jlc3VtZV9yZW5kZXJRKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gd2FpdCBmb3IgdGhpcyBpbWFnZSB0byAnbG9hZCdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGtlZXAgdGhpbmdzIGluLW9yZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFkeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVhZHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJRLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fcmVuZGVyUS5sZW5ndGggPT09IDAgJiYgdGhpcy5fZmx1c2hpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZsdXNoaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLl9vbkZsdXNoKCk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4oMCwgX3Byb3BlcnRpZXMubWFrZV9wcm9wZXJ0aWVzKShEaXNwbGF5LCBbWyd0YXJnZXQnLCAnd28nLCAnZG9tJ10sIC8vIENhbnZhcyBlbGVtZW50IGZvciByZW5kZXJpbmdcblsnY29udGV4dCcsICdybycsICdyYXcnXSwgLy8gQ2FudmFzIDJEIGNvbnRleHQgZm9yIHJlbmRlcmluZyAocmVhZC1vbmx5KVxuWydsb2dvJywgJ3J3JywgJ3JhdyddLCAvLyBMb2dvIHRvIGRpc3BsYXkgd2hlbiBjbGVhcmVkOiB7XCJ3aWR0aFwiOiB3LCBcImhlaWdodFwiOiBoLCBcInR5cGVcIjogbWltZS10eXBlLCBcImRhdGFcIjogZGF0YX1cblsndHJ1ZV9jb2xvcicsICdydycsICdib29sJ10sIC8vIFVzZSB0cnVlLWNvbG9yIHBpeGVsIGRhdGFcblsnY29sb3VyTWFwJywgJ3J3JywgJ2FyciddLCAvLyBDb2xvdXIgbWFwIGFycmF5ICh3aGVuIG5vdCB0cnVlLWNvbG9yKVxuWydzY2FsZScsICdydycsICdmbG9hdCddLCAvLyBEaXNwbGF5IGFyZWEgc2NhbGUgZmFjdG9yIDAuMCAtIDEuMFxuWyd2aWV3cG9ydCcsICdydycsICdib29sJ10sIC8vIFVzZSB2aWV3cG9ydCBjbGlwcGluZ1xuWyd3aWR0aCcsICdybycsICdpbnQnXSwgLy8gRGlzcGxheSBhcmVhIHdpZHRoXG5bJ2hlaWdodCcsICdybycsICdpbnQnXSwgLy8gRGlzcGxheSBhcmVhIGhlaWdodFxuXG5bJ3JlbmRlcl9tb2RlJywgJ3JvJywgJ3N0ciddLCAvLyBDYW52YXMgcmVuZGVyaW5nIG1vZGUgKHJlYWQtb25seSlcblxuWydwcmVmZXJfanMnLCAncncnLCAnc3RyJ10sIC8vIFByZWZlciBKYXZhc2NyaXB0IG92ZXIgY2FudmFzIG1ldGhvZHNcblsnY3Vyc29yX3VyaScsICdydycsICdyYXcnXSwgLy8gQ2FuIHdlIHJlbmRlciBjdXJzb3IgdXNpbmcgZGF0YSBVUklcblxuWydvbkZsdXNoJywgJ3J3JywgJ2Z1bmMnXV0pO1xuXG4vLyBDbGFzcyBNZXRob2RzXG5EaXNwbGF5LmNoYW5nZUN1cnNvciA9IGZ1bmN0aW9uICh0YXJnZXQsIHBpeGVscywgbWFzaywgaG90eCwgaG90eSwgdzAsIGgwLCBjbWFwKSB7XG4gICAgdmFyIHcgPSB3MDtcbiAgICB2YXIgaCA9IGgwO1xuICAgIGlmIChoIDwgdykge1xuICAgICAgICBoID0gdzsgLy8gaW5jcmVhc2UgaCB0byBtYWtlIGl0IHNxdWFyZVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHcgPSBoOyAvLyBpbmNyZWFzZSB3IHRvIG1ha2UgaXQgc3F1YXJlXG4gICAgfVxuXG4gICAgdmFyIGN1ciA9IFtdO1xuXG4gICAgLy8gUHVzaCBtdWx0aS1ieXRlIGxpdHRsZS1lbmRpYW4gdmFsdWVzXG4gICAgY3VyLnB1c2gxNmxlID0gZnVuY3Rpb24gKG51bSkge1xuICAgICAgICB0aGlzLnB1c2gobnVtICYgMHhGRiwgbnVtID4+IDggJiAweEZGKTtcbiAgICB9O1xuICAgIGN1ci5wdXNoMzJsZSA9IGZ1bmN0aW9uIChudW0pIHtcbiAgICAgICAgdGhpcy5wdXNoKG51bSAmIDB4RkYsIG51bSA+PiA4ICYgMHhGRiwgbnVtID4+IDE2ICYgMHhGRiwgbnVtID4+IDI0ICYgMHhGRik7XG4gICAgfTtcblxuICAgIHZhciBJSERSc3ogPSA0MDtcbiAgICB2YXIgUkdCc3ogPSB3ICogaCAqIDQ7XG4gICAgdmFyIFhPUnN6ID0gTWF0aC5jZWlsKHcgKiBoIC8gOC4wKTtcbiAgICB2YXIgQU5Ec3ogPSBNYXRoLmNlaWwodyAqIGggLyA4LjApO1xuXG4gICAgY3VyLnB1c2gxNmxlKDApOyAvLyAwOiBSZXNlcnZlZFxuICAgIGN1ci5wdXNoMTZsZSgyKTsgLy8gMjogLkNVUiB0eXBlXG4gICAgY3VyLnB1c2gxNmxlKDEpOyAvLyA0OiBOdW1iZXIgb2YgaW1hZ2VzLCAxIGZvciBub24tYW5pbWF0ZWQgaWNvXG5cbiAgICAvLyBDdXJzb3IgIzEgaGVhZGVyIChJQ09ORElSRU5UUlkpXG4gICAgY3VyLnB1c2godyk7IC8vIDY6IHdpZHRoXG4gICAgY3VyLnB1c2goaCk7IC8vIDc6IGhlaWdodFxuICAgIGN1ci5wdXNoKDApOyAvLyA4OiBjb2xvcnMsIDAgLT4gdHJ1ZS1jb2xvclxuICAgIGN1ci5wdXNoKDApOyAvLyA5OiByZXNlcnZlZFxuICAgIGN1ci5wdXNoMTZsZShob3R4KTsgLy8gMTA6IGhvdHNwb3QgeCBjb29yZGluYXRlXG4gICAgY3VyLnB1c2gxNmxlKGhvdHkpOyAvLyAxMjogaG90c3BvdCB5IGNvb3JkaW5hdGVcbiAgICBjdXIucHVzaDMybGUoSUhEUnN6ICsgUkdCc3ogKyBYT1JzeiArIEFORHN6KTtcbiAgICAvLyAxNDogY3Vyc29yIGRhdGEgYnl0ZSBzaXplXG4gICAgY3VyLnB1c2gzMmxlKDIyKTsgLy8gMTg6IG9mZnNldCBvZiBjdXJzb3IgZGF0YSBpbiB0aGUgZmlsZVxuXG4gICAgLy8gQ3Vyc29yICMxIEluZm9IZWFkZXIgKElDT05JTUFHRS9CSVRNQVBJTkZPKVxuICAgIGN1ci5wdXNoMzJsZShJSERSc3opOyAvLyAyMjogSW5mb0hlYWRlciBzaXplXG4gICAgY3VyLnB1c2gzMmxlKHcpOyAvLyAyNjogQ3Vyc29yIHdpZHRoXG4gICAgY3VyLnB1c2gzMmxlKGggKiAyKTsgLy8gMzA6IFhPUitBTkQgaGVpZ2h0XG4gICAgY3VyLnB1c2gxNmxlKDEpOyAvLyAzNDogbnVtYmVyIG9mIHBsYW5lc1xuICAgIGN1ci5wdXNoMTZsZSgzMik7IC8vIDM2OiBiaXRzIHBlciBwaXhlbFxuICAgIGN1ci5wdXNoMzJsZSgwKTsgLy8gMzg6IFR5cGUgb2YgY29tcHJlc3Npb25cblxuICAgIGN1ci5wdXNoMzJsZShYT1JzeiArIEFORHN6KTtcbiAgICAvLyA0MjogU2l6ZSBvZiBJbWFnZVxuICAgIGN1ci5wdXNoMzJsZSgwKTsgLy8gNDY6IHJlc2VydmVkXG4gICAgY3VyLnB1c2gzMmxlKDApOyAvLyA1MDogcmVzZXJ2ZWRcbiAgICBjdXIucHVzaDMybGUoMCk7IC8vIDU0OiByZXNlcnZlZFxuICAgIGN1ci5wdXNoMzJsZSgwKTsgLy8gNTg6IHJlc2VydmVkXG5cbiAgICAvLyA2MjogY29sb3IgZGF0YSAoUkdCUVVBRCBpY0NvbG9yc1tdKVxuICAgIHZhciB5LCB4O1xuICAgIGZvciAoeSA9IGggLSAxOyB5ID49IDA7IHktLSkge1xuICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7XG4gICAgICAgICAgICBpZiAoeCA+PSB3MCB8fCB5ID49IGgwKSB7XG4gICAgICAgICAgICAgICAgY3VyLnB1c2goMCk7IC8vIGJsdWVcbiAgICAgICAgICAgICAgICBjdXIucHVzaCgwKTsgLy8gZ3JlZW5cbiAgICAgICAgICAgICAgICBjdXIucHVzaCgwKTsgLy8gcmVkXG4gICAgICAgICAgICAgICAgY3VyLnB1c2goMCk7IC8vIGFscGhhXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBpZHggPSB5ICogTWF0aC5jZWlsKHcwIC8gOCkgKyBNYXRoLmZsb29yKHggLyA4KTtcbiAgICAgICAgICAgICAgICB2YXIgYWxwaGEgPSBtYXNrW2lkeF0gPDwgeCAlIDggJiAweDgwID8gMjU1IDogMDtcbiAgICAgICAgICAgICAgICBpZiAoY21hcCkge1xuICAgICAgICAgICAgICAgICAgICBpZHggPSB3MCAqIHkgKyB4O1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmdiID0gY21hcFtwaXhlbHNbaWR4XV07XG4gICAgICAgICAgICAgICAgICAgIGN1ci5wdXNoKHJnYlsyXSk7IC8vIGJsdWVcbiAgICAgICAgICAgICAgICAgICAgY3VyLnB1c2gocmdiWzFdKTsgLy8gZ3JlZW5cbiAgICAgICAgICAgICAgICAgICAgY3VyLnB1c2gocmdiWzBdKTsgLy8gcmVkXG4gICAgICAgICAgICAgICAgICAgIGN1ci5wdXNoKGFscGhhKTsgLy8gYWxwaGFcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZHggPSAodzAgKiB5ICsgeCkgKiA0O1xuICAgICAgICAgICAgICAgICAgICBjdXIucHVzaChwaXhlbHNbaWR4XSk7IC8vIGJsdWVcbiAgICAgICAgICAgICAgICAgICAgY3VyLnB1c2gocGl4ZWxzW2lkeCArIDFdKTsgLy8gZ3JlZW5cbiAgICAgICAgICAgICAgICAgICAgY3VyLnB1c2gocGl4ZWxzW2lkeCArIDJdKTsgLy8gcmVkXG4gICAgICAgICAgICAgICAgICAgIGN1ci5wdXNoKGFscGhhKTsgLy8gYWxwaGFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBYT1IvYml0bWFzayBkYXRhIChCWVRFIGljWE9SW10pXG4gICAgLy8gKGlnbm9yZWQsIGp1c3QgbmVlZHMgdG8gYmUgdGhlIHJpZ2h0IHNpemUpXG4gICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykge1xuICAgICAgICBmb3IgKHggPSAwOyB4IDwgTWF0aC5jZWlsKHcgLyA4KTsgeCsrKSB7XG4gICAgICAgICAgICBjdXIucHVzaCgwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFORC9iaXRtYXNrIGRhdGEgKEJZVEUgaWNBTkRbXSlcbiAgICAvLyAoaWdub3JlZCwganVzdCBuZWVkcyB0byBiZSB0aGUgcmlnaHQgc2l6ZSlcbiAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7XG4gICAgICAgIGZvciAoeCA9IDA7IHggPCBNYXRoLmNlaWwodyAvIDgpOyB4KyspIHtcbiAgICAgICAgICAgIGN1ci5wdXNoKDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHVybCA9ICdkYXRhOmltYWdlL3gtaWNvbjtiYXNlNjQsJyArIF9iYXNlMi5kZWZhdWx0LmVuY29kZShjdXIpO1xuICAgIHRhcmdldC5zdHlsZS5jdXJzb3IgPSAndXJsKCcgKyB1cmwgKyAnKScgKyBob3R4ICsgJyAnICsgaG90eSArICcsIGRlZmF1bHQnO1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gSW5mbGF0ZTtcblxudmFyIF9pbmZsYXRlID0gcmVxdWlyZShcInBha28vbGliL3psaWIvaW5mbGF0ZS5qc1wiKTtcblxudmFyIF96c3RyZWFtID0gcmVxdWlyZShcInBha28vbGliL3psaWIvenN0cmVhbS5qc1wiKTtcblxudmFyIF96c3RyZWFtMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3pzdHJlYW0pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5JbmZsYXRlLnByb3RvdHlwZSA9IHtcbiAgICBpbmZsYXRlOiBmdW5jdGlvbiAoZGF0YSwgZmx1c2gsIGV4cGVjdGVkKSB7XG4gICAgICAgIHRoaXMuc3RybS5pbnB1dCA9IGRhdGE7XG4gICAgICAgIHRoaXMuc3RybS5hdmFpbF9pbiA9IHRoaXMuc3RybS5pbnB1dC5sZW5ndGg7XG4gICAgICAgIHRoaXMuc3RybS5uZXh0X2luID0gMDtcbiAgICAgICAgdGhpcy5zdHJtLm5leHRfb3V0ID0gMDtcblxuICAgICAgICAvLyByZXNpemUgb3VyIG91dHB1dCBidWZmZXIgaWYgaXQncyB0b28gc21hbGxcbiAgICAgICAgLy8gKHdlIGNvdWxkIGp1c3QgdXNlIG11bHRpcGxlIGNodW5rcywgYnV0IHRoYXQgd291bGQgY2F1c2UgYW4gZXh0cmFcbiAgICAgICAgLy8gYWxsb2NhdGlvbiBlYWNoIHRpbWUgdG8gZmxhdHRlbiB0aGUgY2h1bmtzKVxuICAgICAgICBpZiAoZXhwZWN0ZWQgPiB0aGlzLmNodW5rU2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5jaHVua1NpemUgPSBleHBlY3RlZDtcbiAgICAgICAgICAgIHRoaXMuc3RybS5vdXRwdXQgPSBuZXcgVWludDhBcnJheSh0aGlzLmNodW5rU2l6ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0cm0uYXZhaWxfb3V0ID0gdGhpcy5jaHVua1NpemU7XG5cbiAgICAgICAgKDAsIF9pbmZsYXRlLmluZmxhdGUpKHRoaXMuc3RybSwgZmx1c2gpO1xuXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0aGlzLnN0cm0ub3V0cHV0LmJ1ZmZlciwgMCwgdGhpcy5zdHJtLm5leHRfb3V0KTtcbiAgICB9LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgKDAsIF9pbmZsYXRlLmluZmxhdGVSZXNldCkodGhpcy5zdHJtKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBJbmZsYXRlKCkge1xuICAgIHRoaXMuc3RybSA9IG5ldyBfenN0cmVhbTIuZGVmYXVsdCgpO1xuICAgIHRoaXMuY2h1bmtTaXplID0gMTAyNCAqIDEwICogMTA7XG4gICAgdGhpcy5zdHJtLm91dHB1dCA9IG5ldyBVaW50OEFycmF5KHRoaXMuY2h1bmtTaXplKTtcbiAgICB0aGlzLndpbmRvd0JpdHMgPSA1O1xuXG4gICAgKDAsIF9pbmZsYXRlLmluZmxhdGVJbml0KSh0aGlzLnN0cm0sIHRoaXMud2luZG93Qml0cyk7XG59OyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5Nb3VzZSA9IGV4cG9ydHMuS2V5Ym9hcmQgPSB1bmRlZmluZWQ7XG5cbnZhciBfbG9nZ2luZyA9IHJlcXVpcmUoJy4uL3V0aWwvbG9nZ2luZy5qcycpO1xuXG52YXIgTG9nID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2xvZ2dpbmcpO1xuXG52YXIgX2Jyb3dzZXJzID0gcmVxdWlyZSgnLi4vdXRpbC9icm93c2Vycy5qcycpO1xuXG52YXIgX2V2ZW50cyA9IHJlcXVpcmUoJy4uL3V0aWwvZXZlbnRzLmpzJyk7XG5cbnZhciBfcHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL3V0aWwvcHJvcGVydGllcy5qcycpO1xuXG52YXIgX3V0aWwgPSByZXF1aXJlKCcuL3V0aWwuanMnKTtcblxudmFyIEtleWJvYXJkVXRpbCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF91dGlsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBlbHNlIHsgdmFyIG5ld09iaiA9IHt9OyBpZiAob2JqICE9IG51bGwpIHsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyByZXR1cm4gbmV3T2JqOyB9IH1cblxuLy9cbi8vIEtleWJvYXJkIGV2ZW50IGhhbmRsZXJcbi8vXG5cbnZhciBLZXlib2FyZCA9IGZ1bmN0aW9uIChkZWZhdWx0cykge1xuICAgIHRoaXMuX2tleURvd25MaXN0ID0gW107IC8vIExpc3Qgb2YgZGVwcmVzc2VkIGtleXNcbiAgICAvLyAoZXZlbiBpZiB0aGV5IGFyZSBoYXBweSlcblxuICAgICgwLCBfcHJvcGVydGllcy5zZXRfZGVmYXVsdHMpKHRoaXMsIGRlZmF1bHRzLCB7XG4gICAgICAgICd0YXJnZXQnOiBkb2N1bWVudCxcbiAgICAgICAgJ2ZvY3VzZWQnOiB0cnVlXG4gICAgfSk7XG5cbiAgICAvLyBjcmVhdGUgdGhlIGtleWJvYXJkIGhhbmRsZXJcbiAgICB0aGlzLl9oYW5kbGVyID0gbmV3IEtleWJvYXJkVXRpbC5LZXlFdmVudERlY29kZXIoS2V5Ym9hcmRVdGlsLk1vZGlmaWVyU3luYygpLCBLZXlib2FyZFV0aWwuVmVyaWZ5Q2hhck1vZGlmaWVyKCAvKiBqc2hpbnQgbmV3Y2FwOiBmYWxzZSAqL1xuICAgIEtleWJvYXJkVXRpbC5UcmFja0tleVN0YXRlKEtleWJvYXJkVXRpbC5Fc2NhcGVNb2RpZmllcnModGhpcy5faGFuZGxlUmZiRXZlbnQuYmluZCh0aGlzKSkpKSk7IC8qIGpzaGludCBuZXdjYXA6IHRydWUgKi9cblxuICAgIC8vIGtlZXAgdGhlc2UgaGVyZSBzbyB3ZSBjYW4gcmVmZXIgdG8gdGhlbSBsYXRlclxuICAgIHRoaXMuX2V2ZW50SGFuZGxlcnMgPSB7XG4gICAgICAgICdrZXl1cCc6IHRoaXMuX2hhbmRsZUtleVVwLmJpbmQodGhpcyksXG4gICAgICAgICdrZXlkb3duJzogdGhpcy5faGFuZGxlS2V5RG93bi5iaW5kKHRoaXMpLFxuICAgICAgICAna2V5cHJlc3MnOiB0aGlzLl9oYW5kbGVLZXlQcmVzcy5iaW5kKHRoaXMpLFxuICAgICAgICAnYmx1cic6IHRoaXMuX2FsbEtleXNVcC5iaW5kKHRoaXMpXG4gICAgfTtcbn07IC8qXG4gICAgKiBub1ZOQzogSFRNTDUgVk5DIGNsaWVudFxuICAgICogQ29weXJpZ2h0IChDKSAyMDEyIEpvZWwgTWFydGluXG4gICAgKiBDb3B5cmlnaHQgKEMpIDIwMTMgU2FtdWVsIE1hbm5laGVkIGZvciBDZW5kaW8gQUJcbiAgICAqIExpY2Vuc2VkIHVuZGVyIE1QTCAyLjAgb3IgYW55IGxhdGVyIHZlcnNpb24gKHNlZSBMSUNFTlNFLnR4dClcbiAgICAqL1xuXG4vKmpzbGludCBicm93c2VyOiB0cnVlLCB3aGl0ZTogZmFsc2UgKi9cbi8qZ2xvYmFsIHdpbmRvdywgVXRpbCAqL1xuXG5LZXlib2FyZC5wcm90b3R5cGUgPSB7XG4gICAgLy8gcHJpdmF0ZSBtZXRob2RzXG5cbiAgICBfaGFuZGxlUmZiRXZlbnQ6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICh0aGlzLl9vbktleVByZXNzKSB7XG4gICAgICAgICAgICBMb2cuRGVidWcoXCJvbktleVByZXNzIFwiICsgKGUudHlwZSA9PSAna2V5ZG93bicgPyBcImRvd25cIiA6IFwidXBcIikgKyBcIiwga2V5c3ltOiBcIiArIGUua2V5c3ltLmtleXN5bSArIFwiKFwiICsgZS5rZXlzeW0ua2V5bmFtZSArIFwiKVwiKTtcbiAgICAgICAgICAgIHRoaXMuX29uS2V5UHJlc3MoZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgc2V0UUVNVVZOQ0tleWJvYXJkSGFuZGxlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9oYW5kbGVyID0gbmV3IEtleWJvYXJkVXRpbC5RRU1VS2V5RXZlbnREZWNvZGVyKEtleWJvYXJkVXRpbC5Nb2RpZmllclN5bmMoKSwgS2V5Ym9hcmRVdGlsLlRyYWNrUUVNVUtleVN0YXRlKHRoaXMuX2hhbmRsZVJmYkV2ZW50LmJpbmQodGhpcykpKTtcbiAgICB9LFxuXG4gICAgX2hhbmRsZUtleURvd246IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICghdGhpcy5fZm9jdXNlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX2hhbmRsZXIua2V5ZG93bihlKSkge1xuICAgICAgICAgICAgLy8gU3VwcHJlc3MgYnViYmxpbmcvZGVmYXVsdCBhY3Rpb25zXG4gICAgICAgICAgICAoMCwgX2V2ZW50cy5zdG9wRXZlbnQpKGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWxsb3cgdGhlIGV2ZW50IHRvIGJ1YmJsZSBhbmQgYmVjb21lIGEga2V5UHJlc3MgZXZlbnQgd2hpY2hcbiAgICAgICAgICAgIC8vIHdpbGwgaGF2ZSB0aGUgY2hhcmFjdGVyIGNvZGUgdHJhbnNsYXRlZFxuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9oYW5kbGVLZXlQcmVzczogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9mb2N1c2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faGFuZGxlci5rZXlwcmVzcyhlKSkge1xuICAgICAgICAgICAgLy8gU3VwcHJlc3MgYnViYmxpbmcvZGVmYXVsdCBhY3Rpb25zXG4gICAgICAgICAgICAoMCwgX2V2ZW50cy5zdG9wRXZlbnQpKGUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9oYW5kbGVLZXlVcDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9mb2N1c2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5faGFuZGxlci5rZXl1cChlKSkge1xuICAgICAgICAgICAgLy8gU3VwcHJlc3MgYnViYmxpbmcvZGVmYXVsdCBhY3Rpb25zXG4gICAgICAgICAgICAoMCwgX2V2ZW50cy5zdG9wRXZlbnQpKGUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9hbGxLZXlzVXA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgTG9nLkRlYnVnKFwiPj4gS2V5Ym9hcmQuYWxsS2V5c1VwXCIpO1xuICAgICAgICB0aGlzLl9oYW5kbGVyLnJlbGVhc2VBbGwoKTtcbiAgICAgICAgTG9nLkRlYnVnKFwiPDwgS2V5Ym9hcmQuYWxsS2V5c1VwXCIpO1xuICAgIH0sXG5cbiAgICAvLyBQdWJsaWMgbWV0aG9kc1xuXG4gICAgZ3JhYjogZnVuY3Rpb24gKCkge1xuICAgICAgICAvL0xvZy5EZWJ1ZyhcIj4+IEtleWJvYXJkLmdyYWJcIik7XG4gICAgICAgIHZhciBjID0gdGhpcy5fdGFyZ2V0O1xuXG4gICAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2V2ZW50SGFuZGxlcnMua2V5ZG93bik7XG4gICAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLl9ldmVudEhhbmRsZXJzLmtleXVwKTtcbiAgICAgICAgYy5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIHRoaXMuX2V2ZW50SGFuZGxlcnMua2V5cHJlc3MpO1xuXG4gICAgICAgIC8vIFJlbGVhc2UgKGtleSB1cCkgaWYgd2luZG93IGxvc2VzIGZvY3VzXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5fZXZlbnRIYW5kbGVycy5ibHVyKTtcblxuICAgICAgICAvL0xvZy5EZWJ1ZyhcIjw8IEtleWJvYXJkLmdyYWJcIik7XG4gICAgfSxcblxuICAgIHVuZ3JhYjogZnVuY3Rpb24gKCkge1xuICAgICAgICAvL0xvZy5EZWJ1ZyhcIj4+IEtleWJvYXJkLnVuZ3JhYlwiKTtcbiAgICAgICAgdmFyIGMgPSB0aGlzLl90YXJnZXQ7XG5cbiAgICAgICAgYy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fZXZlbnRIYW5kbGVycy5rZXlkb3duKTtcbiAgICAgICAgYy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuX2V2ZW50SGFuZGxlcnMua2V5dXApO1xuICAgICAgICBjLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgdGhpcy5fZXZlbnRIYW5kbGVycy5rZXlwcmVzcyk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5fZXZlbnRIYW5kbGVycy5ibHVyKTtcblxuICAgICAgICAvLyBSZWxlYXNlIChrZXkgdXApIGFsbCBrZXlzIHRoYXQgYXJlIGluIGEgZG93biBzdGF0ZVxuICAgICAgICB0aGlzLl9hbGxLZXlzVXAoKTtcblxuICAgICAgICAvL0xvZy5EZWJ1ZyhcIj4+IEtleWJvYXJkLnVuZ3JhYlwiKTtcbiAgICB9LFxuXG4gICAgc3luYzogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlci5zeW5jTW9kaWZpZXJzKGUpO1xuICAgIH1cbn07XG5cbigwLCBfcHJvcGVydGllcy5tYWtlX3Byb3BlcnRpZXMpKEtleWJvYXJkLCBbWyd0YXJnZXQnLCAnd28nLCAnZG9tJ10sIC8vIERPTSBlbGVtZW50IHRoYXQgY2FwdHVyZXMga2V5Ym9hcmQgaW5wdXRcblsnZm9jdXNlZCcsICdydycsICdib29sJ10sIC8vIENhcHR1cmUgYW5kIHNlbmQga2V5IGV2ZW50c1xuXG5bJ29uS2V5UHJlc3MnLCAncncnLCAnZnVuYyddIC8vIEhhbmRsZXIgZm9yIGtleSBwcmVzcy9yZWxlYXNlXG5dKTtcblxudmFyIE1vdXNlID0gZnVuY3Rpb24gKGRlZmF1bHRzKSB7XG4gICAgdGhpcy5fbW91c2VDYXB0dXJlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5fZG91YmxlQ2xpY2tUaW1lciA9IG51bGw7XG4gICAgdGhpcy5fbGFzdFRvdWNoUG9zID0gbnVsbDtcblxuICAgIC8vIENvbmZpZ3VyYXRpb24gYXR0cmlidXRlc1xuICAgICgwLCBfcHJvcGVydGllcy5zZXRfZGVmYXVsdHMpKHRoaXMsIGRlZmF1bHRzLCB7XG4gICAgICAgICd0YXJnZXQnOiBkb2N1bWVudCxcbiAgICAgICAgJ2ZvY3VzZWQnOiB0cnVlLFxuICAgICAgICAndG91Y2hCdXR0b24nOiAxXG4gICAgfSk7XG5cbiAgICB0aGlzLl9ldmVudEhhbmRsZXJzID0ge1xuICAgICAgICAnbW91c2Vkb3duJzogdGhpcy5faGFuZGxlTW91c2VEb3duLmJpbmQodGhpcyksXG4gICAgICAgICdtb3VzZXVwJzogdGhpcy5faGFuZGxlTW91c2VVcC5iaW5kKHRoaXMpLFxuICAgICAgICAnbW91c2Vtb3ZlJzogdGhpcy5faGFuZGxlTW91c2VNb3ZlLmJpbmQodGhpcyksXG4gICAgICAgICdtb3VzZXdoZWVsJzogdGhpcy5faGFuZGxlTW91c2VXaGVlbC5iaW5kKHRoaXMpLFxuICAgICAgICAnbW91c2VkaXNhYmxlJzogdGhpcy5faGFuZGxlTW91c2VEaXNhYmxlLmJpbmQodGhpcylcbiAgICB9O1xufTtcblxuTW91c2UucHJvdG90eXBlID0ge1xuICAgIC8vIHByaXZhdGUgbWV0aG9kc1xuICAgIF9jYXB0dXJlTW91c2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gY2FwdHVyaW5nIHRoZSBtb3VzZSBlbnN1cmVzIHdlIGdldCB0aGUgbW91c2V1cCBldmVudFxuICAgICAgICAoMCwgX2V2ZW50cy5zZXRDYXB0dXJlKSh0aGlzLl90YXJnZXQpO1xuXG4gICAgICAgIC8vIHNvbWUgYnJvd3NlcnMgZ2l2ZSB1cyBtb3VzZXVwIGV2ZW50cyByZWdhcmRsZXNzLFxuICAgICAgICAvLyBzbyBpZiB3ZSBuZXZlciBjYXB0dXJlZCB0aGUgbW91c2UsIHdlIGNhbiBkaXNyZWdhcmQgdGhlIGV2ZW50XG4gICAgICAgIHRoaXMuX21vdXNlQ2FwdHVyZWQgPSB0cnVlO1xuICAgIH0sXG5cbiAgICBfcmVsZWFzZU1vdXNlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICgwLCBfZXZlbnRzLnJlbGVhc2VDYXB0dXJlKSgpO1xuICAgICAgICB0aGlzLl9tb3VzZUNhcHR1cmVkID0gZmFsc2U7XG4gICAgfSxcblxuICAgIF9yZXNldERvdWJsZUNsaWNrVGltZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fZG91YmxlQ2xpY2tUaW1lciA9IG51bGw7XG4gICAgfSxcblxuICAgIF9oYW5kbGVNb3VzZUJ1dHRvbjogZnVuY3Rpb24gKGUsIGRvd24pIHtcbiAgICAgICAgaWYgKCF0aGlzLl9mb2N1c2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbm90aWZ5KSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZnkoZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcG9zID0gdGhpcy5fZ2V0TW91c2VQb3NpdGlvbihlKTtcblxuICAgICAgICB2YXIgYm1hc2s7XG4gICAgICAgIGlmIChlLnRvdWNoZXMgfHwgZS5jaGFuZ2VkVG91Y2hlcykge1xuICAgICAgICAgICAgLy8gVG91Y2ggZGV2aWNlXG5cbiAgICAgICAgICAgIC8vIFdoZW4gdHdvIHRvdWNoZXMgb2NjdXIgd2l0aGluIDUwMCBtcyBvZiBlYWNoIG90aGVyIGFuZCBhcmVcbiAgICAgICAgICAgIC8vIGNsb3NlIGVub3VnaCB0b2dldGhlciBhIGRvdWJsZSBjbGljayBpcyB0cmlnZ2VyZWQuXG4gICAgICAgICAgICBpZiAoZG93biA9PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RvdWJsZUNsaWNrVGltZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFzdFRvdWNoUG9zID0gcG9zO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9kb3VibGVDbGlja1RpbWVyKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gdG91Y2hlcyBpcyBzbWFsbCBlbm91Z2hcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2UgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXR0ZXIgdG91Y2ggdG8gdGhlIHBvc2l0aW9uIG9mXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmaXJzdC5cblxuICAgICAgICAgICAgICAgICAgICB2YXIgeHMgPSB0aGlzLl9sYXN0VG91Y2hQb3MueCAtIHBvcy54O1xuICAgICAgICAgICAgICAgICAgICB2YXIgeXMgPSB0aGlzLl9sYXN0VG91Y2hQb3MueSAtIHBvcy55O1xuICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IE1hdGguc3FydCh4cyAqIHhzICsgeXMgKiB5cyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGdvYWwgaXMgdG8gdHJpZ2dlciBvbiBhIGNlcnRhaW4gcGh5c2ljYWwgd2lkdGgsIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2VQaXhlbFJhdGlvIGJyaW5ncyB1cyBhIGJpdCBjbG9zZXIgYnV0IGlzIG5vdCBvcHRpbWFsLlxuICAgICAgICAgICAgICAgICAgICB2YXIgdGhyZXNob2xkID0gMjAgKiAod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkIDwgdGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSB0aGlzLl9sYXN0VG91Y2hQb3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fZG91YmxlQ2xpY2tUaW1lciA9IHNldFRpbWVvdXQodGhpcy5fcmVzZXREb3VibGVDbGlja1RpbWVyLmJpbmQodGhpcyksIDUwMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBibWFzayA9IHRoaXMuX3RvdWNoQnV0dG9uO1xuICAgICAgICAgICAgLy8gSWYgYm1hc2sgaXMgc2V0XG4gICAgICAgIH0gZWxzZSBpZiAoZS53aGljaCkge1xuICAgICAgICAgICAgLyogZXZlcnl0aGluZyBleGNlcHQgSUUgKi9cbiAgICAgICAgICAgIGJtYXNrID0gMSA8PCBlLmJ1dHRvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8qIElFIGluY2x1ZGluZyA5ICovXG4gICAgICAgICAgICBibWFzayA9IChlLmJ1dHRvbiAmIDB4MSkgKyAvLyBMZWZ0XG4gICAgICAgICAgICAoZS5idXR0b24gJiAweDIpICogMiArIC8vIFJpZ2h0XG4gICAgICAgICAgICAoZS5idXR0b24gJiAweDQpIC8gMjsgLy8gTWlkZGxlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fb25Nb3VzZUJ1dHRvbikge1xuICAgICAgICAgICAgTG9nLkRlYnVnKFwib25Nb3VzZUJ1dHRvbiBcIiArIChkb3duID8gXCJkb3duXCIgOiBcInVwXCIpICsgXCIsIHg6IFwiICsgcG9zLnggKyBcIiwgeTogXCIgKyBwb3MueSArIFwiLCBibWFzazogXCIgKyBibWFzayk7XG4gICAgICAgICAgICB0aGlzLl9vbk1vdXNlQnV0dG9uKHBvcy54LCBwb3MueSwgZG93biwgYm1hc2spO1xuICAgICAgICB9XG4gICAgICAgICgwLCBfZXZlbnRzLnN0b3BFdmVudCkoZSk7XG4gICAgfSxcblxuICAgIF9oYW5kbGVNb3VzZURvd246IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHRoaXMuX2NhcHR1cmVNb3VzZSgpO1xuICAgICAgICB0aGlzLl9oYW5kbGVNb3VzZUJ1dHRvbihlLCAxKTtcbiAgICB9LFxuXG4gICAgX2hhbmRsZU1vdXNlVXA6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICghdGhpcy5fbW91c2VDYXB0dXJlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5faGFuZGxlTW91c2VCdXR0b24oZSwgMCk7XG4gICAgICAgIHRoaXMuX3JlbGVhc2VNb3VzZSgpO1xuICAgIH0sXG5cbiAgICBfaGFuZGxlTW91c2VXaGVlbDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9mb2N1c2VkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fbm90aWZ5KSB7XG4gICAgICAgICAgICB0aGlzLl9ub3RpZnkoZSk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcG9zID0gdGhpcy5fZ2V0TW91c2VQb3NpdGlvbihlKTtcblxuICAgICAgICBpZiAodGhpcy5fb25Nb3VzZUJ1dHRvbikge1xuICAgICAgICAgICAgaWYgKGUuZGVsdGFYIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uTW91c2VCdXR0b24ocG9zLngsIHBvcy55LCAxLCAxIDw8IDUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uTW91c2VCdXR0b24ocG9zLngsIHBvcy55LCAwLCAxIDw8IDUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRlbHRhWCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbk1vdXNlQnV0dG9uKHBvcy54LCBwb3MueSwgMSwgMSA8PCA2KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbk1vdXNlQnV0dG9uKHBvcy54LCBwb3MueSwgMCwgMSA8PCA2KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGUuZGVsdGFZIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uTW91c2VCdXR0b24ocG9zLngsIHBvcy55LCAxLCAxIDw8IDMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uTW91c2VCdXR0b24ocG9zLngsIHBvcy55LCAwLCAxIDw8IDMpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlLmRlbHRhWSA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbk1vdXNlQnV0dG9uKHBvcy54LCBwb3MueSwgMSwgMSA8PCA0KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbk1vdXNlQnV0dG9uKHBvcy54LCBwb3MueSwgMCwgMSA8PCA0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgICgwLCBfZXZlbnRzLnN0b3BFdmVudCkoZSk7XG4gICAgfSxcblxuICAgIF9oYW5kbGVNb3VzZU1vdmU6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICghdGhpcy5fZm9jdXNlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX25vdGlmeSkge1xuICAgICAgICAgICAgdGhpcy5fbm90aWZ5KGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHBvcyA9IHRoaXMuX2dldE1vdXNlUG9zaXRpb24oZSk7XG4gICAgICAgIGlmICh0aGlzLl9vbk1vdXNlTW92ZSkge1xuICAgICAgICAgICAgdGhpcy5fb25Nb3VzZU1vdmUocG9zLngsIHBvcy55KTtcbiAgICAgICAgfVxuICAgICAgICAoMCwgX2V2ZW50cy5zdG9wRXZlbnQpKGUpO1xuICAgIH0sXG5cbiAgICBfaGFuZGxlTW91c2VEaXNhYmxlOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoIXRoaXMuX2ZvY3VzZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFN0b3AgcHJvcGFnYXRpb24gaWYgaW5zaWRlIGNhbnZhcyBhcmVhXG4gICAgICAgICAqIE5vdGU6IFRoaXMgaXMgb25seSBuZWVkZWQgZm9yIHRoZSAnY2xpY2snIGV2ZW50IGFzIGl0IGZhaWxzXG4gICAgICAgICAqICAgICAgIHRvIGZpcmUgcHJvcGVybHkgZm9yIHRoZSB0YXJnZXQgZWxlbWVudCBzbyB3ZSBoYXZlXG4gICAgICAgICAqICAgICAgIHRvIGxpc3RlbiBvbiB0aGUgZG9jdW1lbnQgZWxlbWVudCBpbnN0ZWFkLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGUudGFyZ2V0ID09IHRoaXMuX3RhcmdldCkge1xuICAgICAgICAgICAgKDAsIF9ldmVudHMuc3RvcEV2ZW50KShlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBSZXR1cm4gY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGFyZ2V0XG4gICAgX2dldE1vdXNlUG9zaXRpb246IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUgPSAoMCwgX2V2ZW50cy5nZXRQb2ludGVyRXZlbnQpKGUpO1xuICAgICAgICB2YXIgYm91bmRzID0gdGhpcy5fdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICB2YXIgeCwgeTtcbiAgICAgICAgLy8gQ2xpcCB0byB0YXJnZXQgYm91bmRzXG4gICAgICAgIGlmIChlLmNsaWVudFggPCBib3VuZHMubGVmdCkge1xuICAgICAgICAgICAgeCA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoZS5jbGllbnRYID49IGJvdW5kcy5yaWdodCkge1xuICAgICAgICAgICAgeCA9IGJvdW5kcy53aWR0aCAtIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB4ID0gZS5jbGllbnRYIC0gYm91bmRzLmxlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGUuY2xpZW50WSA8IGJvdW5kcy50b3ApIHtcbiAgICAgICAgICAgIHkgPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKGUuY2xpZW50WSA+PSBib3VuZHMuYm90dG9tKSB7XG4gICAgICAgICAgICB5ID0gYm91bmRzLmhlaWdodCAtIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB5ID0gZS5jbGllbnRZIC0gYm91bmRzLnRvcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB4OiB4LCB5OiB5IH07XG4gICAgfSxcblxuICAgIC8vIFB1YmxpYyBtZXRob2RzXG4gICAgZ3JhYjogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYyA9IHRoaXMuX3RhcmdldDtcblxuICAgICAgICBpZiAoX2Jyb3dzZXJzLmlzVG91Y2hEZXZpY2UpIHtcbiAgICAgICAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2Vkb3duKTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2V1cCk7XG4gICAgICAgICAgICBjLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZXVwKTtcbiAgICAgICAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZW1vdmUpO1xuICAgICAgICB9XG4gICAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZWRvd24pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2V1cCk7XG4gICAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2V1cCk7XG4gICAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZW1vdmUpO1xuICAgICAgICBjLmFkZEV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZXdoZWVsKTtcblxuICAgICAgICAvKiBQcmV2ZW50IG1pZGRsZS1jbGljayBwYXN0aW5nIChzZWUgYWJvdmUgZm9yIHdoeSB3ZSBiaW5kIHRvIGRvY3VtZW50KSAqL1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2VkaXNhYmxlKTtcblxuICAgICAgICAvKiBwcmV2ZW50RGVmYXVsdCgpIG9uIG1vdXNlZG93biBkb2Vzbid0IHN0b3AgdGhpcyBldmVudCBmb3Igc29tZVxuICAgICAgICAgICByZWFzb24gc28gd2UgaGF2ZSB0byBleHBsaWNpdGx5IGJsb2NrIGl0ICovXG4gICAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCB0aGlzLl9ldmVudEhhbmRsZXJzLm1vdXNlZGlzYWJsZSk7XG4gICAgfSxcblxuICAgIHVuZ3JhYjogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYyA9IHRoaXMuX3RhcmdldDtcblxuICAgICAgICBpZiAoX2Jyb3dzZXJzLmlzVG91Y2hEZXZpY2UpIHtcbiAgICAgICAgICAgIGMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2Vkb3duKTtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2V1cCk7XG4gICAgICAgICAgICBjLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZXVwKTtcbiAgICAgICAgICAgIGMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZW1vdmUpO1xuICAgICAgICB9XG4gICAgICAgIGMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZWRvd24pO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2V1cCk7XG4gICAgICAgIGMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2V1cCk7XG4gICAgICAgIGMucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZW1vdmUpO1xuICAgICAgICBjLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZXdoZWVsKTtcblxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2VkaXNhYmxlKTtcblxuICAgICAgICBjLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZWRpc2FibGUpO1xuICAgIH1cbn07XG5cbigwLCBfcHJvcGVydGllcy5tYWtlX3Byb3BlcnRpZXMpKE1vdXNlLCBbWyd0YXJnZXQnLCAncm8nLCAnZG9tJ10sIC8vIERPTSBlbGVtZW50IHRoYXQgY2FwdHVyZXMgbW91c2UgaW5wdXRcblsnbm90aWZ5JywgJ3JvJywgJ2Z1bmMnXSwgLy8gRnVuY3Rpb24gdG8gY2FsbCB0byBub3RpZnkgd2hlbmV2ZXIgYSBtb3VzZSBldmVudCBpcyByZWNlaXZlZFxuWydmb2N1c2VkJywgJ3J3JywgJ2Jvb2wnXSwgLy8gQ2FwdHVyZSBhbmQgc2VuZCBtb3VzZSBjbGlja3MvbW92ZW1lbnRcblxuWydvbk1vdXNlQnV0dG9uJywgJ3J3JywgJ2Z1bmMnXSwgLy8gSGFuZGxlciBmb3IgbW91c2UgYnV0dG9uIGNsaWNrL3JlbGVhc2Vcblsnb25Nb3VzZU1vdmUnLCAncncnLCAnZnVuYyddLCAvLyBIYW5kbGVyIGZvciBtb3VzZSBtb3ZlbWVudFxuWyd0b3VjaEJ1dHRvbicsICdydycsICdpbnQnXSAvLyBCdXR0b24gbWFzayAoMSwgMiwgNCkgZm9yIHRvdWNoIGRldmljZXMgKDAgbWVhbnMgaWdub3JlIGNsaWNrcylcbl0pO1xuXG5leHBvcnRzLktleWJvYXJkID0gS2V5Ym9hcmQ7XG5leHBvcnRzLk1vdXNlID0gTW91c2U7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIFhLX1ZvaWRTeW1ib2w6IDB4ZmZmZmZmLCAvKiBWb2lkIHN5bWJvbCAqL1xuXG4gIFhLX0JhY2tTcGFjZTogMHhmZjA4LCAvKiBCYWNrIHNwYWNlLCBiYWNrIGNoYXIgKi9cbiAgWEtfVGFiOiAweGZmMDksXG4gIFhLX0xpbmVmZWVkOiAweGZmMGEsIC8qIExpbmVmZWVkLCBMRiAqL1xuICBYS19DbGVhcjogMHhmZjBiLFxuICBYS19SZXR1cm46IDB4ZmYwZCwgLyogUmV0dXJuLCBlbnRlciAqL1xuICBYS19QYXVzZTogMHhmZjEzLCAvKiBQYXVzZSwgaG9sZCAqL1xuICBYS19TY3JvbGxfTG9jazogMHhmZjE0LFxuICBYS19TeXNfUmVxOiAweGZmMTUsXG4gIFhLX0VzY2FwZTogMHhmZjFiLFxuICBYS19EZWxldGU6IDB4ZmZmZiwgLyogRGVsZXRlLCBydWJvdXQgKi9cblxuICAvKiBDdXJzb3IgY29udHJvbCAmIG1vdGlvbiAqL1xuXG4gIFhLX0hvbWU6IDB4ZmY1MCxcbiAgWEtfTGVmdDogMHhmZjUxLCAvKiBNb3ZlIGxlZnQsIGxlZnQgYXJyb3cgKi9cbiAgWEtfVXA6IDB4ZmY1MiwgLyogTW92ZSB1cCwgdXAgYXJyb3cgKi9cbiAgWEtfUmlnaHQ6IDB4ZmY1MywgLyogTW92ZSByaWdodCwgcmlnaHQgYXJyb3cgKi9cbiAgWEtfRG93bjogMHhmZjU0LCAvKiBNb3ZlIGRvd24sIGRvd24gYXJyb3cgKi9cbiAgWEtfUHJpb3I6IDB4ZmY1NSwgLyogUHJpb3IsIHByZXZpb3VzICovXG4gIFhLX1BhZ2VfVXA6IDB4ZmY1NSxcbiAgWEtfTmV4dDogMHhmZjU2LCAvKiBOZXh0ICovXG4gIFhLX1BhZ2VfRG93bjogMHhmZjU2LFxuICBYS19FbmQ6IDB4ZmY1NywgLyogRU9MICovXG4gIFhLX0JlZ2luOiAweGZmNTgsIC8qIEJPTCAqL1xuXG4gIC8qIE1pc2MgZnVuY3Rpb25zICovXG5cbiAgWEtfU2VsZWN0OiAweGZmNjAsIC8qIFNlbGVjdCwgbWFyayAqL1xuICBYS19QcmludDogMHhmZjYxLFxuICBYS19FeGVjdXRlOiAweGZmNjIsIC8qIEV4ZWN1dGUsIHJ1biwgZG8gKi9cbiAgWEtfSW5zZXJ0OiAweGZmNjMsIC8qIEluc2VydCwgaW5zZXJ0IGhlcmUgKi9cbiAgWEtfVW5kbzogMHhmZjY1LFxuICBYS19SZWRvOiAweGZmNjYsIC8qIFJlZG8sIGFnYWluICovXG4gIFhLX01lbnU6IDB4ZmY2NyxcbiAgWEtfRmluZDogMHhmZjY4LCAvKiBGaW5kLCBzZWFyY2ggKi9cbiAgWEtfQ2FuY2VsOiAweGZmNjksIC8qIENhbmNlbCwgc3RvcCwgYWJvcnQsIGV4aXQgKi9cbiAgWEtfSGVscDogMHhmZjZhLCAvKiBIZWxwICovXG4gIFhLX0JyZWFrOiAweGZmNmIsXG4gIFhLX01vZGVfc3dpdGNoOiAweGZmN2UsIC8qIENoYXJhY3RlciBzZXQgc3dpdGNoICovXG4gIFhLX3NjcmlwdF9zd2l0Y2g6IDB4ZmY3ZSwgLyogQWxpYXMgZm9yIG1vZGVfc3dpdGNoICovXG4gIFhLX051bV9Mb2NrOiAweGZmN2YsXG5cbiAgLyogS2V5cGFkIGZ1bmN0aW9ucywga2V5cGFkIG51bWJlcnMgY2xldmVybHkgY2hvc2VuIHRvIG1hcCB0byBBU0NJSSAqL1xuXG4gIFhLX0tQX1NwYWNlOiAweGZmODAsIC8qIFNwYWNlICovXG4gIFhLX0tQX1RhYjogMHhmZjg5LFxuICBYS19LUF9FbnRlcjogMHhmZjhkLCAvKiBFbnRlciAqL1xuICBYS19LUF9GMTogMHhmZjkxLCAvKiBQRjEsIEtQX0EsIC4uLiAqL1xuICBYS19LUF9GMjogMHhmZjkyLFxuICBYS19LUF9GMzogMHhmZjkzLFxuICBYS19LUF9GNDogMHhmZjk0LFxuICBYS19LUF9Ib21lOiAweGZmOTUsXG4gIFhLX0tQX0xlZnQ6IDB4ZmY5NixcbiAgWEtfS1BfVXA6IDB4ZmY5NyxcbiAgWEtfS1BfUmlnaHQ6IDB4ZmY5OCxcbiAgWEtfS1BfRG93bjogMHhmZjk5LFxuICBYS19LUF9QcmlvcjogMHhmZjlhLFxuICBYS19LUF9QYWdlX1VwOiAweGZmOWEsXG4gIFhLX0tQX05leHQ6IDB4ZmY5YixcbiAgWEtfS1BfUGFnZV9Eb3duOiAweGZmOWIsXG4gIFhLX0tQX0VuZDogMHhmZjljLFxuICBYS19LUF9CZWdpbjogMHhmZjlkLFxuICBYS19LUF9JbnNlcnQ6IDB4ZmY5ZSxcbiAgWEtfS1BfRGVsZXRlOiAweGZmOWYsXG4gIFhLX0tQX0VxdWFsOiAweGZmYmQsIC8qIEVxdWFscyAqL1xuICBYS19LUF9NdWx0aXBseTogMHhmZmFhLFxuICBYS19LUF9BZGQ6IDB4ZmZhYixcbiAgWEtfS1BfU2VwYXJhdG9yOiAweGZmYWMsIC8qIFNlcGFyYXRvciwgb2Z0ZW4gY29tbWEgKi9cbiAgWEtfS1BfU3VidHJhY3Q6IDB4ZmZhZCxcbiAgWEtfS1BfRGVjaW1hbDogMHhmZmFlLFxuICBYS19LUF9EaXZpZGU6IDB4ZmZhZixcblxuICBYS19LUF8wOiAweGZmYjAsXG4gIFhLX0tQXzE6IDB4ZmZiMSxcbiAgWEtfS1BfMjogMHhmZmIyLFxuICBYS19LUF8zOiAweGZmYjMsXG4gIFhLX0tQXzQ6IDB4ZmZiNCxcbiAgWEtfS1BfNTogMHhmZmI1LFxuICBYS19LUF82OiAweGZmYjYsXG4gIFhLX0tQXzc6IDB4ZmZiNyxcbiAgWEtfS1BfODogMHhmZmI4LFxuICBYS19LUF85OiAweGZmYjksXG5cbiAgLypcbiAgICogQXV4aWxpYXJ5IGZ1bmN0aW9uczsgbm90ZSB0aGUgZHVwbGljYXRlIGRlZmluaXRpb25zIGZvciBsZWZ0IGFuZCByaWdodFxuICAgKiBmdW5jdGlvbiBrZXlzOyAgU3VuIGtleWJvYXJkcyBhbmQgYSBmZXcgb3RoZXIgbWFudWZhY3R1cmVycyBoYXZlIHN1Y2hcbiAgICogZnVuY3Rpb24ga2V5IGdyb3VwcyBvbiB0aGUgbGVmdCBhbmQvb3IgcmlnaHQgc2lkZXMgb2YgdGhlIGtleWJvYXJkLlxuICAgKiBXZSd2ZSBub3QgZm91bmQgYSBrZXlib2FyZCB3aXRoIG1vcmUgdGhhbiAzNSBmdW5jdGlvbiBrZXlzIHRvdGFsLlxuICAgKi9cblxuICBYS19GMTogMHhmZmJlLFxuICBYS19GMjogMHhmZmJmLFxuICBYS19GMzogMHhmZmMwLFxuICBYS19GNDogMHhmZmMxLFxuICBYS19GNTogMHhmZmMyLFxuICBYS19GNjogMHhmZmMzLFxuICBYS19GNzogMHhmZmM0LFxuICBYS19GODogMHhmZmM1LFxuICBYS19GOTogMHhmZmM2LFxuICBYS19GMTA6IDB4ZmZjNyxcbiAgWEtfRjExOiAweGZmYzgsXG4gIFhLX0wxOiAweGZmYzgsXG4gIFhLX0YxMjogMHhmZmM5LFxuICBYS19MMjogMHhmZmM5LFxuICBYS19GMTM6IDB4ZmZjYSxcbiAgWEtfTDM6IDB4ZmZjYSxcbiAgWEtfRjE0OiAweGZmY2IsXG4gIFhLX0w0OiAweGZmY2IsXG4gIFhLX0YxNTogMHhmZmNjLFxuICBYS19MNTogMHhmZmNjLFxuICBYS19GMTY6IDB4ZmZjZCxcbiAgWEtfTDY6IDB4ZmZjZCxcbiAgWEtfRjE3OiAweGZmY2UsXG4gIFhLX0w3OiAweGZmY2UsXG4gIFhLX0YxODogMHhmZmNmLFxuICBYS19MODogMHhmZmNmLFxuICBYS19GMTk6IDB4ZmZkMCxcbiAgWEtfTDk6IDB4ZmZkMCxcbiAgWEtfRjIwOiAweGZmZDEsXG4gIFhLX0wxMDogMHhmZmQxLFxuICBYS19GMjE6IDB4ZmZkMixcbiAgWEtfUjE6IDB4ZmZkMixcbiAgWEtfRjIyOiAweGZmZDMsXG4gIFhLX1IyOiAweGZmZDMsXG4gIFhLX0YyMzogMHhmZmQ0LFxuICBYS19SMzogMHhmZmQ0LFxuICBYS19GMjQ6IDB4ZmZkNSxcbiAgWEtfUjQ6IDB4ZmZkNSxcbiAgWEtfRjI1OiAweGZmZDYsXG4gIFhLX1I1OiAweGZmZDYsXG4gIFhLX0YyNjogMHhmZmQ3LFxuICBYS19SNjogMHhmZmQ3LFxuICBYS19GMjc6IDB4ZmZkOCxcbiAgWEtfUjc6IDB4ZmZkOCxcbiAgWEtfRjI4OiAweGZmZDksXG4gIFhLX1I4OiAweGZmZDksXG4gIFhLX0YyOTogMHhmZmRhLFxuICBYS19SOTogMHhmZmRhLFxuICBYS19GMzA6IDB4ZmZkYixcbiAgWEtfUjEwOiAweGZmZGIsXG4gIFhLX0YzMTogMHhmZmRjLFxuICBYS19SMTE6IDB4ZmZkYyxcbiAgWEtfRjMyOiAweGZmZGQsXG4gIFhLX1IxMjogMHhmZmRkLFxuICBYS19GMzM6IDB4ZmZkZSxcbiAgWEtfUjEzOiAweGZmZGUsXG4gIFhLX0YzNDogMHhmZmRmLFxuICBYS19SMTQ6IDB4ZmZkZixcbiAgWEtfRjM1OiAweGZmZTAsXG4gIFhLX1IxNTogMHhmZmUwLFxuXG4gIC8qIE1vZGlmaWVycyAqL1xuXG4gIFhLX1NoaWZ0X0w6IDB4ZmZlMSwgLyogTGVmdCBzaGlmdCAqL1xuICBYS19TaGlmdF9SOiAweGZmZTIsIC8qIFJpZ2h0IHNoaWZ0ICovXG4gIFhLX0NvbnRyb2xfTDogMHhmZmUzLCAvKiBMZWZ0IGNvbnRyb2wgKi9cbiAgWEtfQ29udHJvbF9SOiAweGZmZTQsIC8qIFJpZ2h0IGNvbnRyb2wgKi9cbiAgWEtfQ2Fwc19Mb2NrOiAweGZmZTUsIC8qIENhcHMgbG9jayAqL1xuICBYS19TaGlmdF9Mb2NrOiAweGZmZTYsIC8qIFNoaWZ0IGxvY2sgKi9cblxuICBYS19NZXRhX0w6IDB4ZmZlNywgLyogTGVmdCBtZXRhICovXG4gIFhLX01ldGFfUjogMHhmZmU4LCAvKiBSaWdodCBtZXRhICovXG4gIFhLX0FsdF9MOiAweGZmZTksIC8qIExlZnQgYWx0ICovXG4gIFhLX0FsdF9SOiAweGZmZWEsIC8qIFJpZ2h0IGFsdCAqL1xuICBYS19TdXBlcl9MOiAweGZmZWIsIC8qIExlZnQgc3VwZXIgKi9cbiAgWEtfU3VwZXJfUjogMHhmZmVjLCAvKiBSaWdodCBzdXBlciAqL1xuICBYS19IeXBlcl9MOiAweGZmZWQsIC8qIExlZnQgaHlwZXIgKi9cbiAgWEtfSHlwZXJfUjogMHhmZmVlLCAvKiBSaWdodCBoeXBlciAqL1xuXG4gIFhLX0lTT19MZXZlbDNfU2hpZnQ6IDB4ZmUwMywgLyogQWx0R3IgKi9cblxuICAvKlxuICAgKiBMYXRpbiAxXG4gICAqIChJU08vSUVDIDg4NTktMTogVW5pY29kZSBVKzAwMjAuLlUrMDBGRilcbiAgICogQnl0ZSAzOiAwXG4gICAqL1xuXG4gIFhLX3NwYWNlOiAweDAwMjAsIC8qIFUrMDAyMCBTUEFDRSAqL1xuICBYS19leGNsYW06IDB4MDAyMSwgLyogVSswMDIxIEVYQ0xBTUFUSU9OIE1BUksgKi9cbiAgWEtfcXVvdGVkYmw6IDB4MDAyMiwgLyogVSswMDIyIFFVT1RBVElPTiBNQVJLICovXG4gIFhLX251bWJlcnNpZ246IDB4MDAyMywgLyogVSswMDIzIE5VTUJFUiBTSUdOICovXG4gIFhLX2RvbGxhcjogMHgwMDI0LCAvKiBVKzAwMjQgRE9MTEFSIFNJR04gKi9cbiAgWEtfcGVyY2VudDogMHgwMDI1LCAvKiBVKzAwMjUgUEVSQ0VOVCBTSUdOICovXG4gIFhLX2FtcGVyc2FuZDogMHgwMDI2LCAvKiBVKzAwMjYgQU1QRVJTQU5EICovXG4gIFhLX2Fwb3N0cm9waGU6IDB4MDAyNywgLyogVSswMDI3IEFQT1NUUk9QSEUgKi9cbiAgWEtfcXVvdGVyaWdodDogMHgwMDI3LCAvKiBkZXByZWNhdGVkICovXG4gIFhLX3BhcmVubGVmdDogMHgwMDI4LCAvKiBVKzAwMjggTEVGVCBQQVJFTlRIRVNJUyAqL1xuICBYS19wYXJlbnJpZ2h0OiAweDAwMjksIC8qIFUrMDAyOSBSSUdIVCBQQVJFTlRIRVNJUyAqL1xuICBYS19hc3RlcmlzazogMHgwMDJhLCAvKiBVKzAwMkEgQVNURVJJU0sgKi9cbiAgWEtfcGx1czogMHgwMDJiLCAvKiBVKzAwMkIgUExVUyBTSUdOICovXG4gIFhLX2NvbW1hOiAweDAwMmMsIC8qIFUrMDAyQyBDT01NQSAqL1xuICBYS19taW51czogMHgwMDJkLCAvKiBVKzAwMkQgSFlQSEVOLU1JTlVTICovXG4gIFhLX3BlcmlvZDogMHgwMDJlLCAvKiBVKzAwMkUgRlVMTCBTVE9QICovXG4gIFhLX3NsYXNoOiAweDAwMmYsIC8qIFUrMDAyRiBTT0xJRFVTICovXG4gIFhLXzA6IDB4MDAzMCwgLyogVSswMDMwIERJR0lUIFpFUk8gKi9cbiAgWEtfMTogMHgwMDMxLCAvKiBVKzAwMzEgRElHSVQgT05FICovXG4gIFhLXzI6IDB4MDAzMiwgLyogVSswMDMyIERJR0lUIFRXTyAqL1xuICBYS18zOiAweDAwMzMsIC8qIFUrMDAzMyBESUdJVCBUSFJFRSAqL1xuICBYS180OiAweDAwMzQsIC8qIFUrMDAzNCBESUdJVCBGT1VSICovXG4gIFhLXzU6IDB4MDAzNSwgLyogVSswMDM1IERJR0lUIEZJVkUgKi9cbiAgWEtfNjogMHgwMDM2LCAvKiBVKzAwMzYgRElHSVQgU0lYICovXG4gIFhLXzc6IDB4MDAzNywgLyogVSswMDM3IERJR0lUIFNFVkVOICovXG4gIFhLXzg6IDB4MDAzOCwgLyogVSswMDM4IERJR0lUIEVJR0hUICovXG4gIFhLXzk6IDB4MDAzOSwgLyogVSswMDM5IERJR0lUIE5JTkUgKi9cbiAgWEtfY29sb246IDB4MDAzYSwgLyogVSswMDNBIENPTE9OICovXG4gIFhLX3NlbWljb2xvbjogMHgwMDNiLCAvKiBVKzAwM0IgU0VNSUNPTE9OICovXG4gIFhLX2xlc3M6IDB4MDAzYywgLyogVSswMDNDIExFU1MtVEhBTiBTSUdOICovXG4gIFhLX2VxdWFsOiAweDAwM2QsIC8qIFUrMDAzRCBFUVVBTFMgU0lHTiAqL1xuICBYS19ncmVhdGVyOiAweDAwM2UsIC8qIFUrMDAzRSBHUkVBVEVSLVRIQU4gU0lHTiAqL1xuICBYS19xdWVzdGlvbjogMHgwMDNmLCAvKiBVKzAwM0YgUVVFU1RJT04gTUFSSyAqL1xuICBYS19hdDogMHgwMDQwLCAvKiBVKzAwNDAgQ09NTUVSQ0lBTCBBVCAqL1xuICBYS19BOiAweDAwNDEsIC8qIFUrMDA0MSBMQVRJTiBDQVBJVEFMIExFVFRFUiBBICovXG4gIFhLX0I6IDB4MDA0MiwgLyogVSswMDQyIExBVElOIENBUElUQUwgTEVUVEVSIEIgKi9cbiAgWEtfQzogMHgwMDQzLCAvKiBVKzAwNDMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyAqL1xuICBYS19EOiAweDAwNDQsIC8qIFUrMDA0NCBMQVRJTiBDQVBJVEFMIExFVFRFUiBEICovXG4gIFhLX0U6IDB4MDA0NSwgLyogVSswMDQ1IExBVElOIENBUElUQUwgTEVUVEVSIEUgKi9cbiAgWEtfRjogMHgwMDQ2LCAvKiBVKzAwNDYgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRiAqL1xuICBYS19HOiAweDAwNDcsIC8qIFUrMDA0NyBMQVRJTiBDQVBJVEFMIExFVFRFUiBHICovXG4gIFhLX0g6IDB4MDA0OCwgLyogVSswMDQ4IExBVElOIENBUElUQUwgTEVUVEVSIEggKi9cbiAgWEtfSTogMHgwMDQ5LCAvKiBVKzAwNDkgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSAqL1xuICBYS19KOiAweDAwNGEsIC8qIFUrMDA0QSBMQVRJTiBDQVBJVEFMIExFVFRFUiBKICovXG4gIFhLX0s6IDB4MDA0YiwgLyogVSswMDRCIExBVElOIENBUElUQUwgTEVUVEVSIEsgKi9cbiAgWEtfTDogMHgwMDRjLCAvKiBVKzAwNEMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCAqL1xuICBYS19NOiAweDAwNGQsIC8qIFUrMDA0RCBMQVRJTiBDQVBJVEFMIExFVFRFUiBNICovXG4gIFhLX046IDB4MDA0ZSwgLyogVSswMDRFIExBVElOIENBUElUQUwgTEVUVEVSIE4gKi9cbiAgWEtfTzogMHgwMDRmLCAvKiBVKzAwNEYgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyAqL1xuICBYS19QOiAweDAwNTAsIC8qIFUrMDA1MCBMQVRJTiBDQVBJVEFMIExFVFRFUiBQICovXG4gIFhLX1E6IDB4MDA1MSwgLyogVSswMDUxIExBVElOIENBUElUQUwgTEVUVEVSIFEgKi9cbiAgWEtfUjogMHgwMDUyLCAvKiBVKzAwNTIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiAqL1xuICBYS19TOiAweDAwNTMsIC8qIFUrMDA1MyBMQVRJTiBDQVBJVEFMIExFVFRFUiBTICovXG4gIFhLX1Q6IDB4MDA1NCwgLyogVSswMDU0IExBVElOIENBUElUQUwgTEVUVEVSIFQgKi9cbiAgWEtfVTogMHgwMDU1LCAvKiBVKzAwNTUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSAqL1xuICBYS19WOiAweDAwNTYsIC8qIFUrMDA1NiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWICovXG4gIFhLX1c6IDB4MDA1NywgLyogVSswMDU3IExBVElOIENBUElUQUwgTEVUVEVSIFcgKi9cbiAgWEtfWDogMHgwMDU4LCAvKiBVKzAwNTggTEFUSU4gQ0FQSVRBTCBMRVRURVIgWCAqL1xuICBYS19ZOiAweDAwNTksIC8qIFUrMDA1OSBMQVRJTiBDQVBJVEFMIExFVFRFUiBZICovXG4gIFhLX1o6IDB4MDA1YSwgLyogVSswMDVBIExBVElOIENBUElUQUwgTEVUVEVSIFogKi9cbiAgWEtfYnJhY2tldGxlZnQ6IDB4MDA1YiwgLyogVSswMDVCIExFRlQgU1FVQVJFIEJSQUNLRVQgKi9cbiAgWEtfYmFja3NsYXNoOiAweDAwNWMsIC8qIFUrMDA1QyBSRVZFUlNFIFNPTElEVVMgKi9cbiAgWEtfYnJhY2tldHJpZ2h0OiAweDAwNWQsIC8qIFUrMDA1RCBSSUdIVCBTUVVBUkUgQlJBQ0tFVCAqL1xuICBYS19hc2NpaWNpcmN1bTogMHgwMDVlLCAvKiBVKzAwNUUgQ0lSQ1VNRkxFWCBBQ0NFTlQgKi9cbiAgWEtfdW5kZXJzY29yZTogMHgwMDVmLCAvKiBVKzAwNUYgTE9XIExJTkUgKi9cbiAgWEtfZ3JhdmU6IDB4MDA2MCwgLyogVSswMDYwIEdSQVZFIEFDQ0VOVCAqL1xuICBYS19xdW90ZWxlZnQ6IDB4MDA2MCwgLyogZGVwcmVjYXRlZCAqL1xuICBYS19hOiAweDAwNjEsIC8qIFUrMDA2MSBMQVRJTiBTTUFMTCBMRVRURVIgQSAqL1xuICBYS19iOiAweDAwNjIsIC8qIFUrMDA2MiBMQVRJTiBTTUFMTCBMRVRURVIgQiAqL1xuICBYS19jOiAweDAwNjMsIC8qIFUrMDA2MyBMQVRJTiBTTUFMTCBMRVRURVIgQyAqL1xuICBYS19kOiAweDAwNjQsIC8qIFUrMDA2NCBMQVRJTiBTTUFMTCBMRVRURVIgRCAqL1xuICBYS19lOiAweDAwNjUsIC8qIFUrMDA2NSBMQVRJTiBTTUFMTCBMRVRURVIgRSAqL1xuICBYS19mOiAweDAwNjYsIC8qIFUrMDA2NiBMQVRJTiBTTUFMTCBMRVRURVIgRiAqL1xuICBYS19nOiAweDAwNjcsIC8qIFUrMDA2NyBMQVRJTiBTTUFMTCBMRVRURVIgRyAqL1xuICBYS19oOiAweDAwNjgsIC8qIFUrMDA2OCBMQVRJTiBTTUFMTCBMRVRURVIgSCAqL1xuICBYS19pOiAweDAwNjksIC8qIFUrMDA2OSBMQVRJTiBTTUFMTCBMRVRURVIgSSAqL1xuICBYS19qOiAweDAwNmEsIC8qIFUrMDA2QSBMQVRJTiBTTUFMTCBMRVRURVIgSiAqL1xuICBYS19rOiAweDAwNmIsIC8qIFUrMDA2QiBMQVRJTiBTTUFMTCBMRVRURVIgSyAqL1xuICBYS19sOiAweDAwNmMsIC8qIFUrMDA2QyBMQVRJTiBTTUFMTCBMRVRURVIgTCAqL1xuICBYS19tOiAweDAwNmQsIC8qIFUrMDA2RCBMQVRJTiBTTUFMTCBMRVRURVIgTSAqL1xuICBYS19uOiAweDAwNmUsIC8qIFUrMDA2RSBMQVRJTiBTTUFMTCBMRVRURVIgTiAqL1xuICBYS19vOiAweDAwNmYsIC8qIFUrMDA2RiBMQVRJTiBTTUFMTCBMRVRURVIgTyAqL1xuICBYS19wOiAweDAwNzAsIC8qIFUrMDA3MCBMQVRJTiBTTUFMTCBMRVRURVIgUCAqL1xuICBYS19xOiAweDAwNzEsIC8qIFUrMDA3MSBMQVRJTiBTTUFMTCBMRVRURVIgUSAqL1xuICBYS19yOiAweDAwNzIsIC8qIFUrMDA3MiBMQVRJTiBTTUFMTCBMRVRURVIgUiAqL1xuICBYS19zOiAweDAwNzMsIC8qIFUrMDA3MyBMQVRJTiBTTUFMTCBMRVRURVIgUyAqL1xuICBYS190OiAweDAwNzQsIC8qIFUrMDA3NCBMQVRJTiBTTUFMTCBMRVRURVIgVCAqL1xuICBYS191OiAweDAwNzUsIC8qIFUrMDA3NSBMQVRJTiBTTUFMTCBMRVRURVIgVSAqL1xuICBYS192OiAweDAwNzYsIC8qIFUrMDA3NiBMQVRJTiBTTUFMTCBMRVRURVIgViAqL1xuICBYS193OiAweDAwNzcsIC8qIFUrMDA3NyBMQVRJTiBTTUFMTCBMRVRURVIgVyAqL1xuICBYS194OiAweDAwNzgsIC8qIFUrMDA3OCBMQVRJTiBTTUFMTCBMRVRURVIgWCAqL1xuICBYS195OiAweDAwNzksIC8qIFUrMDA3OSBMQVRJTiBTTUFMTCBMRVRURVIgWSAqL1xuICBYS196OiAweDAwN2EsIC8qIFUrMDA3QSBMQVRJTiBTTUFMTCBMRVRURVIgWiAqL1xuICBYS19icmFjZWxlZnQ6IDB4MDA3YiwgLyogVSswMDdCIExFRlQgQ1VSTFkgQlJBQ0tFVCAqL1xuICBYS19iYXI6IDB4MDA3YywgLyogVSswMDdDIFZFUlRJQ0FMIExJTkUgKi9cbiAgWEtfYnJhY2VyaWdodDogMHgwMDdkLCAvKiBVKzAwN0QgUklHSFQgQ1VSTFkgQlJBQ0tFVCAqL1xuICBYS19hc2NpaXRpbGRlOiAweDAwN2UsIC8qIFUrMDA3RSBUSUxERSAqL1xuXG4gIFhLX25vYnJlYWtzcGFjZTogMHgwMGEwLCAvKiBVKzAwQTAgTk8tQlJFQUsgU1BBQ0UgKi9cbiAgWEtfZXhjbGFtZG93bjogMHgwMGExLCAvKiBVKzAwQTEgSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSyAqL1xuICBYS19jZW50OiAweDAwYTIsIC8qIFUrMDBBMiBDRU5UIFNJR04gKi9cbiAgWEtfc3Rlcmxpbmc6IDB4MDBhMywgLyogVSswMEEzIFBPVU5EIFNJR04gKi9cbiAgWEtfY3VycmVuY3k6IDB4MDBhNCwgLyogVSswMEE0IENVUlJFTkNZIFNJR04gKi9cbiAgWEtfeWVuOiAweDAwYTUsIC8qIFUrMDBBNSBZRU4gU0lHTiAqL1xuICBYS19icm9rZW5iYXI6IDB4MDBhNiwgLyogVSswMEE2IEJST0tFTiBCQVIgKi9cbiAgWEtfc2VjdGlvbjogMHgwMGE3LCAvKiBVKzAwQTcgU0VDVElPTiBTSUdOICovXG4gIFhLX2RpYWVyZXNpczogMHgwMGE4LCAvKiBVKzAwQTggRElBRVJFU0lTICovXG4gIFhLX2NvcHlyaWdodDogMHgwMGE5LCAvKiBVKzAwQTkgQ09QWVJJR0hUIFNJR04gKi9cbiAgWEtfb3JkZmVtaW5pbmU6IDB4MDBhYSwgLyogVSswMEFBIEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SICovXG4gIFhLX2d1aWxsZW1vdGxlZnQ6IDB4MDBhYiwgLyogVSswMEFCIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLICovXG4gIFhLX25vdHNpZ246IDB4MDBhYywgLyogVSswMEFDIE5PVCBTSUdOICovXG4gIFhLX2h5cGhlbjogMHgwMGFkLCAvKiBVKzAwQUQgU09GVCBIWVBIRU4gKi9cbiAgWEtfcmVnaXN0ZXJlZDogMHgwMGFlLCAvKiBVKzAwQUUgUkVHSVNURVJFRCBTSUdOICovXG4gIFhLX21hY3JvbjogMHgwMGFmLCAvKiBVKzAwQUYgTUFDUk9OICovXG4gIFhLX2RlZ3JlZTogMHgwMGIwLCAvKiBVKzAwQjAgREVHUkVFIFNJR04gKi9cbiAgWEtfcGx1c21pbnVzOiAweDAwYjEsIC8qIFUrMDBCMSBQTFVTLU1JTlVTIFNJR04gKi9cbiAgWEtfdHdvc3VwZXJpb3I6IDB4MDBiMiwgLyogVSswMEIyIFNVUEVSU0NSSVBUIFRXTyAqL1xuICBYS190aHJlZXN1cGVyaW9yOiAweDAwYjMsIC8qIFUrMDBCMyBTVVBFUlNDUklQVCBUSFJFRSAqL1xuICBYS19hY3V0ZTogMHgwMGI0LCAvKiBVKzAwQjQgQUNVVEUgQUNDRU5UICovXG4gIFhLX211OiAweDAwYjUsIC8qIFUrMDBCNSBNSUNSTyBTSUdOICovXG4gIFhLX3BhcmFncmFwaDogMHgwMGI2LCAvKiBVKzAwQjYgUElMQ1JPVyBTSUdOICovXG4gIFhLX3BlcmlvZGNlbnRlcmVkOiAweDAwYjcsIC8qIFUrMDBCNyBNSURETEUgRE9UICovXG4gIFhLX2NlZGlsbGE6IDB4MDBiOCwgLyogVSswMEI4IENFRElMTEEgKi9cbiAgWEtfb25lc3VwZXJpb3I6IDB4MDBiOSwgLyogVSswMEI5IFNVUEVSU0NSSVBUIE9ORSAqL1xuICBYS19tYXNjdWxpbmU6IDB4MDBiYSwgLyogVSswMEJBIE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUiAqL1xuICBYS19ndWlsbGVtb3RyaWdodDogMHgwMGJiLCAvKiBVKzAwQkIgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLICovXG4gIFhLX29uZXF1YXJ0ZXI6IDB4MDBiYywgLyogVSswMEJDIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUiAqL1xuICBYS19vbmVoYWxmOiAweDAwYmQsIC8qIFUrMDBCRCBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYgKi9cbiAgWEtfdGhyZWVxdWFydGVyczogMHgwMGJlLCAvKiBVKzAwQkUgVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTICovXG4gIFhLX3F1ZXN0aW9uZG93bjogMHgwMGJmLCAvKiBVKzAwQkYgSU5WRVJURUQgUVVFU1RJT04gTUFSSyAqL1xuICBYS19BZ3JhdmU6IDB4MDBjMCwgLyogVSswMEMwIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRSAqL1xuICBYS19BYWN1dGU6IDB4MDBjMSwgLyogVSswMEMxIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURSAqL1xuICBYS19BY2lyY3VtZmxleDogMHgwMGMyLCAvKiBVKzAwQzIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggKi9cbiAgWEtfQXRpbGRlOiAweDAwYzMsIC8qIFUrMDBDMyBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUgKi9cbiAgWEtfQWRpYWVyZXNpczogMHgwMGM0LCAvKiBVKzAwQzQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUyAqL1xuICBYS19BcmluZzogMHgwMGM1LCAvKiBVKzAwQzUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUgKi9cbiAgWEtfQUU6IDB4MDBjNiwgLyogVSswMEM2IExBVElOIENBUElUQUwgTEVUVEVSIEFFICovXG4gIFhLX0NjZWRpbGxhOiAweDAwYzcsIC8qIFUrMDBDNyBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQSAqL1xuICBYS19FZ3JhdmU6IDB4MDBjOCwgLyogVSswMEM4IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRSAqL1xuICBYS19FYWN1dGU6IDB4MDBjOSwgLyogVSswMEM5IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURSAqL1xuICBYS19FY2lyY3VtZmxleDogMHgwMGNhLCAvKiBVKzAwQ0EgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVggKi9cbiAgWEtfRWRpYWVyZXNpczogMHgwMGNiLCAvKiBVKzAwQ0IgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUyAqL1xuICBYS19JZ3JhdmU6IDB4MDBjYywgLyogVSswMENDIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRSAqL1xuICBYS19JYWN1dGU6IDB4MDBjZCwgLyogVSswMENEIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURSAqL1xuICBYS19JY2lyY3VtZmxleDogMHgwMGNlLCAvKiBVKzAwQ0UgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVggKi9cbiAgWEtfSWRpYWVyZXNpczogMHgwMGNmLCAvKiBVKzAwQ0YgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUyAqL1xuICBYS19FVEg6IDB4MDBkMCwgLyogVSswMEQwIExBVElOIENBUElUQUwgTEVUVEVSIEVUSCAqL1xuICBYS19FdGg6IDB4MDBkMCwgLyogZGVwcmVjYXRlZCAqL1xuICBYS19OdGlsZGU6IDB4MDBkMSwgLyogVSswMEQxIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERSAqL1xuICBYS19PZ3JhdmU6IDB4MDBkMiwgLyogVSswMEQyIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRSAqL1xuICBYS19PYWN1dGU6IDB4MDBkMywgLyogVSswMEQzIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURSAqL1xuICBYS19PY2lyY3VtZmxleDogMHgwMGQ0LCAvKiBVKzAwRDQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggKi9cbiAgWEtfT3RpbGRlOiAweDAwZDUsIC8qIFUrMDBENSBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUgKi9cbiAgWEtfT2RpYWVyZXNpczogMHgwMGQ2LCAvKiBVKzAwRDYgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUyAqL1xuICBYS19tdWx0aXBseTogMHgwMGQ3LCAvKiBVKzAwRDcgTVVMVElQTElDQVRJT04gU0lHTiAqL1xuICBYS19Pc2xhc2g6IDB4MDBkOCwgLyogVSswMEQ4IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgKi9cbiAgWEtfT29ibGlxdWU6IDB4MDBkOCwgLyogVSswMEQ4IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgKi9cbiAgWEtfVWdyYXZlOiAweDAwZDksIC8qIFUrMDBEOSBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUgKi9cbiAgWEtfVWFjdXRlOiAweDAwZGEsIC8qIFUrMDBEQSBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUgKi9cbiAgWEtfVWNpcmN1bWZsZXg6IDB4MDBkYiwgLyogVSswMERCIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYICovXG4gIFhLX1VkaWFlcmVzaXM6IDB4MDBkYywgLyogVSswMERDIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgKi9cbiAgWEtfWWFjdXRlOiAweDAwZGQsIC8qIFUrMDBERCBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUgKi9cbiAgWEtfVEhPUk46IDB4MDBkZSwgLyogVSswMERFIExBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOICovXG4gIFhLX1Rob3JuOiAweDAwZGUsIC8qIGRlcHJlY2F0ZWQgKi9cbiAgWEtfc3NoYXJwOiAweDAwZGYsIC8qIFUrMDBERiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUyAqL1xuICBYS19hZ3JhdmU6IDB4MDBlMCwgLyogVSswMEUwIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUgKi9cbiAgWEtfYWFjdXRlOiAweDAwZTEsIC8qIFUrMDBFMSBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFICovXG4gIFhLX2FjaXJjdW1mbGV4OiAweDAwZTIsIC8qIFUrMDBFMiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggKi9cbiAgWEtfYXRpbGRlOiAweDAwZTMsIC8qIFUrMDBFMyBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFICovXG4gIFhLX2FkaWFlcmVzaXM6IDB4MDBlNCwgLyogVSswMEU0IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTICovXG4gIFhLX2FyaW5nOiAweDAwZTUsIC8qIFUrMDBFNSBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUgKi9cbiAgWEtfYWU6IDB4MDBlNiwgLyogVSswMEU2IExBVElOIFNNQUxMIExFVFRFUiBBRSAqL1xuICBYS19jY2VkaWxsYTogMHgwMGU3LCAvKiBVKzAwRTcgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBICovXG4gIFhLX2VncmF2ZTogMHgwMGU4LCAvKiBVKzAwRTggTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRSAqL1xuICBYS19lYWN1dGU6IDB4MDBlOSwgLyogVSswMEU5IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUgKi9cbiAgWEtfZWNpcmN1bWZsZXg6IDB4MDBlYSwgLyogVSswMEVBIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCAqL1xuICBYS19lZGlhZXJlc2lzOiAweDAwZWIsIC8qIFUrMDBFQiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUyAqL1xuICBYS19pZ3JhdmU6IDB4MDBlYywgLyogVSswMEVDIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUgKi9cbiAgWEtfaWFjdXRlOiAweDAwZWQsIC8qIFUrMDBFRCBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFICovXG4gIFhLX2ljaXJjdW1mbGV4OiAweDAwZWUsIC8qIFUrMDBFRSBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVggKi9cbiAgWEtfaWRpYWVyZXNpczogMHgwMGVmLCAvKiBVKzAwRUYgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMgKi9cbiAgWEtfZXRoOiAweDAwZjAsIC8qIFUrMDBGMCBMQVRJTiBTTUFMTCBMRVRURVIgRVRIICovXG4gIFhLX250aWxkZTogMHgwMGYxLCAvKiBVKzAwRjEgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERSAqL1xuICBYS19vZ3JhdmU6IDB4MDBmMiwgLyogVSswMEYyIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUgKi9cbiAgWEtfb2FjdXRlOiAweDAwZjMsIC8qIFUrMDBGMyBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFICovXG4gIFhLX29jaXJjdW1mbGV4OiAweDAwZjQsIC8qIFUrMDBGNCBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVggKi9cbiAgWEtfb3RpbGRlOiAweDAwZjUsIC8qIFUrMDBGNSBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFICovXG4gIFhLX29kaWFlcmVzaXM6IDB4MDBmNiwgLyogVSswMEY2IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTICovXG4gIFhLX2RpdmlzaW9uOiAweDAwZjcsIC8qIFUrMDBGNyBESVZJU0lPTiBTSUdOICovXG4gIFhLX29zbGFzaDogMHgwMGY4LCAvKiBVKzAwRjggTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UgKi9cbiAgWEtfb29ibGlxdWU6IDB4MDBmOCwgLyogVSswMEY4IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFICovXG4gIFhLX3VncmF2ZTogMHgwMGY5LCAvKiBVKzAwRjkgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRSAqL1xuICBYS191YWN1dGU6IDB4MDBmYSwgLyogVSswMEZBIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUgKi9cbiAgWEtfdWNpcmN1bWZsZXg6IDB4MDBmYiwgLyogVSswMEZCIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWCAqL1xuICBYS191ZGlhZXJlc2lzOiAweDAwZmMsIC8qIFUrMDBGQyBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUyAqL1xuICBYS195YWN1dGU6IDB4MDBmZCwgLyogVSswMEZEIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUgKi9cbiAgWEtfdGhvcm46IDB4MDBmZSwgLyogVSswMEZFIExBVElOIFNNQUxMIExFVFRFUiBUSE9STiAqL1xuICBYS195ZGlhZXJlc2lzOiAweDAwZmYgfTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuLy8gVGhpcyBmaWxlIGRlc2NyaWJlcyBtYXBwaW5ncyBmcm9tIFVuaWNvZGUgY29kZXBvaW50cyB0byB0aGUga2V5c3ltIHZhbHVlc1xuLy8gKGFuZCBvcHRpb25hbGx5LCBrZXkgbmFtZXMpIGV4cGVjdGVkIGJ5IHRoZSBSRkIgcHJvdG9jb2xcbi8vIEhvdyB0aGlzIGZpbGUgd2FzIGdlbmVyYXRlZDpcbi8vIG5vZGUgL1VzZXJzL2phbGYvZGV2L21pL25vdm5jL3V0aWxzL3BhcnNlLmpzIC9vcHQvWDExL2luY2x1ZGUvWDExL2tleXN5bWRlZi5oXG5cbnZhciBrZXluYW1lcyA9IG51bGw7XG52YXIgY29kZXBvaW50cyA9IHsgXCIzMlwiOiAzMiwgXCIzM1wiOiAzMywgXCIzNFwiOiAzNCwgXCIzNVwiOiAzNSwgXCIzNlwiOiAzNiwgXCIzN1wiOiAzNywgXCIzOFwiOiAzOCwgXCIzOVwiOiAzOSwgXCI0MFwiOiA0MCwgXCI0MVwiOiA0MSwgXCI0MlwiOiA0MiwgXCI0M1wiOiA0MywgXCI0NFwiOiA0NCwgXCI0NVwiOiA0NSwgXCI0NlwiOiA0NiwgXCI0N1wiOiA0NywgXCI0OFwiOiA0OCwgXCI0OVwiOiA0OSwgXCI1MFwiOiA1MCwgXCI1MVwiOiA1MSwgXCI1MlwiOiA1MiwgXCI1M1wiOiA1MywgXCI1NFwiOiA1NCwgXCI1NVwiOiA1NSwgXCI1NlwiOiA1NiwgXCI1N1wiOiA1NywgXCI1OFwiOiA1OCwgXCI1OVwiOiA1OSwgXCI2MFwiOiA2MCwgXCI2MVwiOiA2MSwgXCI2MlwiOiA2MiwgXCI2M1wiOiA2MywgXCI2NFwiOiA2NCwgXCI2NVwiOiA2NSwgXCI2NlwiOiA2NiwgXCI2N1wiOiA2NywgXCI2OFwiOiA2OCwgXCI2OVwiOiA2OSwgXCI3MFwiOiA3MCwgXCI3MVwiOiA3MSwgXCI3MlwiOiA3MiwgXCI3M1wiOiA3MywgXCI3NFwiOiA3NCwgXCI3NVwiOiA3NSwgXCI3NlwiOiA3NiwgXCI3N1wiOiA3NywgXCI3OFwiOiA3OCwgXCI3OVwiOiA3OSwgXCI4MFwiOiA4MCwgXCI4MVwiOiA4MSwgXCI4MlwiOiA4MiwgXCI4M1wiOiA4MywgXCI4NFwiOiA4NCwgXCI4NVwiOiA4NSwgXCI4NlwiOiA4NiwgXCI4N1wiOiA4NywgXCI4OFwiOiA4OCwgXCI4OVwiOiA4OSwgXCI5MFwiOiA5MCwgXCI5MVwiOiA5MSwgXCI5MlwiOiA5MiwgXCI5M1wiOiA5MywgXCI5NFwiOiA5NCwgXCI5NVwiOiA5NSwgXCI5NlwiOiA5NiwgXCI5N1wiOiA5NywgXCI5OFwiOiA5OCwgXCI5OVwiOiA5OSwgXCIxMDBcIjogMTAwLCBcIjEwMVwiOiAxMDEsIFwiMTAyXCI6IDEwMiwgXCIxMDNcIjogMTAzLCBcIjEwNFwiOiAxMDQsIFwiMTA1XCI6IDEwNSwgXCIxMDZcIjogMTA2LCBcIjEwN1wiOiAxMDcsIFwiMTA4XCI6IDEwOCwgXCIxMDlcIjogMTA5LCBcIjExMFwiOiAxMTAsIFwiMTExXCI6IDExMSwgXCIxMTJcIjogMTEyLCBcIjExM1wiOiAxMTMsIFwiMTE0XCI6IDExNCwgXCIxMTVcIjogMTE1LCBcIjExNlwiOiAxMTYsIFwiMTE3XCI6IDExNywgXCIxMThcIjogMTE4LCBcIjExOVwiOiAxMTksIFwiMTIwXCI6IDEyMCwgXCIxMjFcIjogMTIxLCBcIjEyMlwiOiAxMjIsIFwiMTIzXCI6IDEyMywgXCIxMjRcIjogMTI0LCBcIjEyNVwiOiAxMjUsIFwiMTI2XCI6IDEyNiwgXCIxNjBcIjogMTYwLCBcIjE2MVwiOiAxNjEsIFwiMTYyXCI6IDE2MiwgXCIxNjNcIjogMTYzLCBcIjE2NFwiOiAxNjQsIFwiMTY1XCI6IDE2NSwgXCIxNjZcIjogMTY2LCBcIjE2N1wiOiAxNjcsIFwiMTY4XCI6IDE2OCwgXCIxNjlcIjogMTY5LCBcIjE3MFwiOiAxNzAsIFwiMTcxXCI6IDE3MSwgXCIxNzJcIjogMTcyLCBcIjE3M1wiOiAxNzMsIFwiMTc0XCI6IDE3NCwgXCIxNzVcIjogMTc1LCBcIjE3NlwiOiAxNzYsIFwiMTc3XCI6IDE3NywgXCIxNzhcIjogMTc4LCBcIjE3OVwiOiAxNzksIFwiMTgwXCI6IDE4MCwgXCIxODFcIjogMTgxLCBcIjE4MlwiOiAxODIsIFwiMTgzXCI6IDE4MywgXCIxODRcIjogMTg0LCBcIjE4NVwiOiAxODUsIFwiMTg2XCI6IDE4NiwgXCIxODdcIjogMTg3LCBcIjE4OFwiOiAxODgsIFwiMTg5XCI6IDE4OSwgXCIxOTBcIjogMTkwLCBcIjE5MVwiOiAxOTEsIFwiMTkyXCI6IDE5MiwgXCIxOTNcIjogMTkzLCBcIjE5NFwiOiAxOTQsIFwiMTk1XCI6IDE5NSwgXCIxOTZcIjogMTk2LCBcIjE5N1wiOiAxOTcsIFwiMTk4XCI6IDE5OCwgXCIxOTlcIjogMTk5LCBcIjIwMFwiOiAyMDAsIFwiMjAxXCI6IDIwMSwgXCIyMDJcIjogMjAyLCBcIjIwM1wiOiAyMDMsIFwiMjA0XCI6IDIwNCwgXCIyMDVcIjogMjA1LCBcIjIwNlwiOiAyMDYsIFwiMjA3XCI6IDIwNywgXCIyMDhcIjogMjA4LCBcIjIwOVwiOiAyMDksIFwiMjEwXCI6IDIxMCwgXCIyMTFcIjogMjExLCBcIjIxMlwiOiAyMTIsIFwiMjEzXCI6IDIxMywgXCIyMTRcIjogMjE0LCBcIjIxNVwiOiAyMTUsIFwiMjE2XCI6IDIxNiwgXCIyMTdcIjogMjE3LCBcIjIxOFwiOiAyMTgsIFwiMjE5XCI6IDIxOSwgXCIyMjBcIjogMjIwLCBcIjIyMVwiOiAyMjEsIFwiMjIyXCI6IDIyMiwgXCIyMjNcIjogMjIzLCBcIjIyNFwiOiAyMjQsIFwiMjI1XCI6IDIyNSwgXCIyMjZcIjogMjI2LCBcIjIyN1wiOiAyMjcsIFwiMjI4XCI6IDIyOCwgXCIyMjlcIjogMjI5LCBcIjIzMFwiOiAyMzAsIFwiMjMxXCI6IDIzMSwgXCIyMzJcIjogMjMyLCBcIjIzM1wiOiAyMzMsIFwiMjM0XCI6IDIzNCwgXCIyMzVcIjogMjM1LCBcIjIzNlwiOiAyMzYsIFwiMjM3XCI6IDIzNywgXCIyMzhcIjogMjM4LCBcIjIzOVwiOiAyMzksIFwiMjQwXCI6IDI0MCwgXCIyNDFcIjogMjQxLCBcIjI0MlwiOiAyNDIsIFwiMjQzXCI6IDI0MywgXCIyNDRcIjogMjQ0LCBcIjI0NVwiOiAyNDUsIFwiMjQ2XCI6IDI0NiwgXCIyNDdcIjogMjQ3LCBcIjI0OFwiOiAyNDgsIFwiMjQ5XCI6IDI0OSwgXCIyNTBcIjogMjUwLCBcIjI1MVwiOiAyNTEsIFwiMjUyXCI6IDI1MiwgXCIyNTNcIjogMjUzLCBcIjI1NFwiOiAyNTQsIFwiMjU1XCI6IDI1NSwgXCIyNTZcIjogOTYwLCBcIjI1N1wiOiA5OTIsIFwiMjU4XCI6IDQ1MSwgXCIyNTlcIjogNDgzLCBcIjI2MFwiOiA0MTcsIFwiMjYxXCI6IDQzMywgXCIyNjJcIjogNDU0LCBcIjI2M1wiOiA0ODYsIFwiMjY0XCI6IDcxMCwgXCIyNjVcIjogNzQyLCBcIjI2NlwiOiA3MDksIFwiMjY3XCI6IDc0MSwgXCIyNjhcIjogNDU2LCBcIjI2OVwiOiA0ODgsIFwiMjcwXCI6IDQ2MywgXCIyNzFcIjogNDk1LCBcIjI3MlwiOiA0NjQsIFwiMjczXCI6IDQ5NiwgXCIyNzRcIjogOTM4LCBcIjI3NVwiOiA5NTQsIFwiMjc4XCI6IDk3MiwgXCIyNzlcIjogMTAwNCwgXCIyODBcIjogNDU4LCBcIjI4MVwiOiA0OTAsIFwiMjgyXCI6IDQ2MCwgXCIyODNcIjogNDkyLCBcIjI4NFwiOiA3MjgsIFwiMjg1XCI6IDc2MCwgXCIyODZcIjogNjgzLCBcIjI4N1wiOiA2OTksIFwiMjg4XCI6IDcyNSwgXCIyODlcIjogNzU3LCBcIjI5MFwiOiA5MzksIFwiMjkxXCI6IDk1NSwgXCIyOTJcIjogNjc4LCBcIjI5M1wiOiA2OTQsIFwiMjk0XCI6IDY3MywgXCIyOTVcIjogNjg5LCBcIjI5NlwiOiA5MzMsIFwiMjk3XCI6IDk0OSwgXCIyOThcIjogOTc1LCBcIjI5OVwiOiAxMDA3LCBcIjMwMFwiOiAxNjc3NzUxNiwgXCIzMDFcIjogMTY3Nzc1MTcsIFwiMzAyXCI6IDk2NywgXCIzMDNcIjogOTk5LCBcIjMwNFwiOiA2ODEsIFwiMzA1XCI6IDY5NywgXCIzMDhcIjogNjg0LCBcIjMwOVwiOiA3MDAsIFwiMzEwXCI6IDk3OSwgXCIzMTFcIjogMTAxMSwgXCIzMTJcIjogOTMwLCBcIjMxM1wiOiA0NTMsIFwiMzE0XCI6IDQ4NSwgXCIzMTVcIjogOTM0LCBcIjMxNlwiOiA5NTAsIFwiMzE3XCI6IDQyMSwgXCIzMThcIjogNDM3LCBcIjMyMVwiOiA0MTksIFwiMzIyXCI6IDQzNSwgXCIzMjNcIjogNDY1LCBcIjMyNFwiOiA0OTcsIFwiMzI1XCI6IDk3NywgXCIzMjZcIjogMTAwOSwgXCIzMjdcIjogNDY2LCBcIjMyOFwiOiA0OTgsIFwiMzMwXCI6IDk1NywgXCIzMzFcIjogOTU5LCBcIjMzMlwiOiA5NzgsIFwiMzMzXCI6IDEwMTAsIFwiMzM2XCI6IDQ2OSwgXCIzMzdcIjogNTAxLCBcIjMzOFwiOiA1MDUyLCBcIjMzOVwiOiA1MDUzLCBcIjM0MFwiOiA0NDgsIFwiMzQxXCI6IDQ4MCwgXCIzNDJcIjogOTMxLCBcIjM0M1wiOiA5NDcsIFwiMzQ0XCI6IDQ3MiwgXCIzNDVcIjogNTA0LCBcIjM0NlwiOiA0MjIsIFwiMzQ3XCI6IDQzOCwgXCIzNDhcIjogNzM0LCBcIjM0OVwiOiA3NjYsIFwiMzUwXCI6IDQyNiwgXCIzNTFcIjogNDQyLCBcIjM1MlwiOiA0MjUsIFwiMzUzXCI6IDQ0MSwgXCIzNTRcIjogNDc4LCBcIjM1NVwiOiA1MTAsIFwiMzU2XCI6IDQyNywgXCIzNTdcIjogNDQzLCBcIjM1OFwiOiA5NDAsIFwiMzU5XCI6IDk1NiwgXCIzNjBcIjogOTg5LCBcIjM2MVwiOiAxMDIxLCBcIjM2MlwiOiA5OTAsIFwiMzYzXCI6IDEwMjIsIFwiMzY0XCI6IDczMywgXCIzNjVcIjogNzY1LCBcIjM2NlwiOiA0NzMsIFwiMzY3XCI6IDUwNSwgXCIzNjhcIjogNDc1LCBcIjM2OVwiOiA1MDcsIFwiMzcwXCI6IDk4NSwgXCIzNzFcIjogMTAxNywgXCIzNzJcIjogMTY3Nzc1ODgsIFwiMzczXCI6IDE2Nzc3NTg5LCBcIjM3NFwiOiAxNjc3NzU5MCwgXCIzNzVcIjogMTY3Nzc1OTEsIFwiMzc2XCI6IDUwNTQsIFwiMzc3XCI6IDQyOCwgXCIzNzhcIjogNDQ0LCBcIjM3OVwiOiA0MzEsIFwiMzgwXCI6IDQ0NywgXCIzODFcIjogNDMwLCBcIjM4MlwiOiA0NDYsIFwiMzk5XCI6IDE2Nzc3NjE1LCBcIjQwMlwiOiAyMjk0LCBcIjQxNVwiOiAxNjc3NzYzMSwgXCI0MTZcIjogMTY3Nzc2MzIsIFwiNDE3XCI6IDE2Nzc3NjMzLCBcIjQzMVwiOiAxNjc3NzY0NywgXCI0MzJcIjogMTY3Nzc2NDgsIFwiNDM3XCI6IDE2Nzc3NjUzLCBcIjQzOFwiOiAxNjc3NzY1NCwgXCI0MzlcIjogMTY3Nzc2NTUsIFwiNDY2XCI6IDE2Nzc3NjgxLCBcIjQ4NlwiOiAxNjc3NzcwMiwgXCI0ODdcIjogMTY3Nzc3MDMsIFwiNjAxXCI6IDE2Nzc3ODE3LCBcIjYyOVwiOiAxNjc3Nzg0NSwgXCI2NThcIjogMTY3Nzc4NzQsIFwiNzExXCI6IDQzOSwgXCI3MjhcIjogNDE4LCBcIjcyOVwiOiA1MTEsIFwiNzMxXCI6IDQzNCwgXCI3MzNcIjogNDQ1LCBcIjkwMVwiOiAxOTY2LCBcIjkwMlwiOiAxOTUzLCBcIjkwNFwiOiAxOTU0LCBcIjkwNVwiOiAxOTU1LCBcIjkwNlwiOiAxOTU2LCBcIjkwOFwiOiAxOTU5LCBcIjkxMFwiOiAxOTYwLCBcIjkxMVwiOiAxOTYzLCBcIjkxMlwiOiAxOTc0LCBcIjkxM1wiOiAxOTg1LCBcIjkxNFwiOiAxOTg2LCBcIjkxNVwiOiAxOTg3LCBcIjkxNlwiOiAxOTg4LCBcIjkxN1wiOiAxOTg5LCBcIjkxOFwiOiAxOTkwLCBcIjkxOVwiOiAxOTkxLCBcIjkyMFwiOiAxOTkyLCBcIjkyMVwiOiAxOTkzLCBcIjkyMlwiOiAxOTk0LCBcIjkyM1wiOiAxOTk1LCBcIjkyNFwiOiAxOTk2LCBcIjkyNVwiOiAxOTk3LCBcIjkyNlwiOiAxOTk4LCBcIjkyN1wiOiAxOTk5LCBcIjkyOFwiOiAyMDAwLCBcIjkyOVwiOiAyMDAxLCBcIjkzMVwiOiAyMDAyLCBcIjkzMlwiOiAyMDA0LCBcIjkzM1wiOiAyMDA1LCBcIjkzNFwiOiAyMDA2LCBcIjkzNVwiOiAyMDA3LCBcIjkzNlwiOiAyMDA4LCBcIjkzN1wiOiAyMDA5LCBcIjkzOFwiOiAxOTU3LCBcIjkzOVwiOiAxOTYxLCBcIjk0MFwiOiAxOTY5LCBcIjk0MVwiOiAxOTcwLCBcIjk0MlwiOiAxOTcxLCBcIjk0M1wiOiAxOTcyLCBcIjk0NFwiOiAxOTc4LCBcIjk0NVwiOiAyMDE3LCBcIjk0NlwiOiAyMDE4LCBcIjk0N1wiOiAyMDE5LCBcIjk0OFwiOiAyMDIwLCBcIjk0OVwiOiAyMDIxLCBcIjk1MFwiOiAyMDIyLCBcIjk1MVwiOiAyMDIzLCBcIjk1MlwiOiAyMDI0LCBcIjk1M1wiOiAyMDI1LCBcIjk1NFwiOiAyMDI2LCBcIjk1NVwiOiAyMDI3LCBcIjk1NlwiOiAyMDI4LCBcIjk1N1wiOiAyMDI5LCBcIjk1OFwiOiAyMDMwLCBcIjk1OVwiOiAyMDMxLCBcIjk2MFwiOiAyMDMyLCBcIjk2MVwiOiAyMDMzLCBcIjk2MlwiOiAyMDM1LCBcIjk2M1wiOiAyMDM0LCBcIjk2NFwiOiAyMDM2LCBcIjk2NVwiOiAyMDM3LCBcIjk2NlwiOiAyMDM4LCBcIjk2N1wiOiAyMDM5LCBcIjk2OFwiOiAyMDQwLCBcIjk2OVwiOiAyMDQxLCBcIjk3MFwiOiAxOTczLCBcIjk3MVwiOiAxOTc3LCBcIjk3MlwiOiAxOTc1LCBcIjk3M1wiOiAxOTc2LCBcIjk3NFwiOiAxOTc5LCBcIjEwMjVcIjogMTcxNSwgXCIxMDI2XCI6IDE3MTMsIFwiMTAyN1wiOiAxNzE0LCBcIjEwMjhcIjogMTcxNiwgXCIxMDI5XCI6IDE3MTcsIFwiMTAzMFwiOiAxNzE4LCBcIjEwMzFcIjogMTcxOSwgXCIxMDMyXCI6IDE3MjAsIFwiMTAzM1wiOiAxNzIxLCBcIjEwMzRcIjogMTcyMiwgXCIxMDM1XCI6IDE3MjMsIFwiMTAzNlwiOiAxNzI0LCBcIjEwMzhcIjogMTcyNiwgXCIxMDM5XCI6IDE3MjcsIFwiMTA0MFwiOiAxNzYxLCBcIjEwNDFcIjogMTc2MiwgXCIxMDQyXCI6IDE3ODMsIFwiMTA0M1wiOiAxNzY3LCBcIjEwNDRcIjogMTc2NCwgXCIxMDQ1XCI6IDE3NjUsIFwiMTA0NlwiOiAxNzgyLCBcIjEwNDdcIjogMTc4NiwgXCIxMDQ4XCI6IDE3NjksIFwiMTA0OVwiOiAxNzcwLCBcIjEwNTBcIjogMTc3MSwgXCIxMDUxXCI6IDE3NzIsIFwiMTA1MlwiOiAxNzczLCBcIjEwNTNcIjogMTc3NCwgXCIxMDU0XCI6IDE3NzUsIFwiMTA1NVwiOiAxNzc2LCBcIjEwNTZcIjogMTc3OCwgXCIxMDU3XCI6IDE3NzksIFwiMTA1OFwiOiAxNzgwLCBcIjEwNTlcIjogMTc4MSwgXCIxMDYwXCI6IDE3NjYsIFwiMTA2MVwiOiAxNzY4LCBcIjEwNjJcIjogMTc2MywgXCIxMDYzXCI6IDE3OTAsIFwiMTA2NFwiOiAxNzg3LCBcIjEwNjVcIjogMTc4OSwgXCIxMDY2XCI6IDE3OTEsIFwiMTA2N1wiOiAxNzg1LCBcIjEwNjhcIjogMTc4NCwgXCIxMDY5XCI6IDE3ODgsIFwiMTA3MFwiOiAxNzYwLCBcIjEwNzFcIjogMTc3NywgXCIxMDcyXCI6IDE3MjksIFwiMTA3M1wiOiAxNzMwLCBcIjEwNzRcIjogMTc1MSwgXCIxMDc1XCI6IDE3MzUsIFwiMTA3NlwiOiAxNzMyLCBcIjEwNzdcIjogMTczMywgXCIxMDc4XCI6IDE3NTAsIFwiMTA3OVwiOiAxNzU0LCBcIjEwODBcIjogMTczNywgXCIxMDgxXCI6IDE3MzgsIFwiMTA4MlwiOiAxNzM5LCBcIjEwODNcIjogMTc0MCwgXCIxMDg0XCI6IDE3NDEsIFwiMTA4NVwiOiAxNzQyLCBcIjEwODZcIjogMTc0MywgXCIxMDg3XCI6IDE3NDQsIFwiMTA4OFwiOiAxNzQ2LCBcIjEwODlcIjogMTc0NywgXCIxMDkwXCI6IDE3NDgsIFwiMTA5MVwiOiAxNzQ5LCBcIjEwOTJcIjogMTczNCwgXCIxMDkzXCI6IDE3MzYsIFwiMTA5NFwiOiAxNzMxLCBcIjEwOTVcIjogMTc1OCwgXCIxMDk2XCI6IDE3NTUsIFwiMTA5N1wiOiAxNzU3LCBcIjEwOThcIjogMTc1OSwgXCIxMDk5XCI6IDE3NTMsIFwiMTEwMFwiOiAxNzUyLCBcIjExMDFcIjogMTc1NiwgXCIxMTAyXCI6IDE3MjgsIFwiMTEwM1wiOiAxNzQ1LCBcIjExMDVcIjogMTY5OSwgXCIxMTA2XCI6IDE2OTcsIFwiMTEwN1wiOiAxNjk4LCBcIjExMDhcIjogMTcwMCwgXCIxMTA5XCI6IDE3MDEsIFwiMTExMFwiOiAxNzAyLCBcIjExMTFcIjogMTcwMywgXCIxMTEyXCI6IDE3MDQsIFwiMTExM1wiOiAxNzA1LCBcIjExMTRcIjogMTcwNiwgXCIxMTE1XCI6IDE3MDcsIFwiMTExNlwiOiAxNzA4LCBcIjExMThcIjogMTcxMCwgXCIxMTE5XCI6IDE3MTEsIFwiMTE2OFwiOiAxNzI1LCBcIjExNjlcIjogMTcwOSwgXCIxMTcwXCI6IDE2Nzc4Mzg2LCBcIjExNzFcIjogMTY3NzgzODcsIFwiMTE3NFwiOiAxNjc3ODM5MCwgXCIxMTc1XCI6IDE2Nzc4MzkxLCBcIjExNzhcIjogMTY3NzgzOTQsIFwiMTE3OVwiOiAxNjc3ODM5NSwgXCIxMTgwXCI6IDE2Nzc4Mzk2LCBcIjExODFcIjogMTY3NzgzOTcsIFwiMTE4NlwiOiAxNjc3ODQwMiwgXCIxMTg3XCI6IDE2Nzc4NDAzLCBcIjExOThcIjogMTY3Nzg0MTQsIFwiMTE5OVwiOiAxNjc3ODQxNSwgXCIxMjAwXCI6IDE2Nzc4NDE2LCBcIjEyMDFcIjogMTY3Nzg0MTcsIFwiMTIwMlwiOiAxNjc3ODQxOCwgXCIxMjAzXCI6IDE2Nzc4NDE5LCBcIjEyMDZcIjogMTY3Nzg0MjIsIFwiMTIwN1wiOiAxNjc3ODQyMywgXCIxMjA4XCI6IDE2Nzc4NDI0LCBcIjEyMDlcIjogMTY3Nzg0MjUsIFwiMTIxMFwiOiAxNjc3ODQyNiwgXCIxMjExXCI6IDE2Nzc4NDI3LCBcIjEyNDBcIjogMTY3Nzg0NTYsIFwiMTI0MVwiOiAxNjc3ODQ1NywgXCIxMjUwXCI6IDE2Nzc4NDY2LCBcIjEyNTFcIjogMTY3Nzg0NjcsIFwiMTI1NlwiOiAxNjc3ODQ3MiwgXCIxMjU3XCI6IDE2Nzc4NDczLCBcIjEyNjJcIjogMTY3Nzg0NzgsIFwiMTI2M1wiOiAxNjc3ODQ3OSwgXCIxMzI5XCI6IDE2Nzc4NTQ1LCBcIjEzMzBcIjogMTY3Nzg1NDYsIFwiMTMzMVwiOiAxNjc3ODU0NywgXCIxMzMyXCI6IDE2Nzc4NTQ4LCBcIjEzMzNcIjogMTY3Nzg1NDksIFwiMTMzNFwiOiAxNjc3ODU1MCwgXCIxMzM1XCI6IDE2Nzc4NTUxLCBcIjEzMzZcIjogMTY3Nzg1NTIsIFwiMTMzN1wiOiAxNjc3ODU1MywgXCIxMzM4XCI6IDE2Nzc4NTU0LCBcIjEzMzlcIjogMTY3Nzg1NTUsIFwiMTM0MFwiOiAxNjc3ODU1NiwgXCIxMzQxXCI6IDE2Nzc4NTU3LCBcIjEzNDJcIjogMTY3Nzg1NTgsIFwiMTM0M1wiOiAxNjc3ODU1OSwgXCIxMzQ0XCI6IDE2Nzc4NTYwLCBcIjEzNDVcIjogMTY3Nzg1NjEsIFwiMTM0NlwiOiAxNjc3ODU2MiwgXCIxMzQ3XCI6IDE2Nzc4NTYzLCBcIjEzNDhcIjogMTY3Nzg1NjQsIFwiMTM0OVwiOiAxNjc3ODU2NSwgXCIxMzUwXCI6IDE2Nzc4NTY2LCBcIjEzNTFcIjogMTY3Nzg1NjcsIFwiMTM1MlwiOiAxNjc3ODU2OCwgXCIxMzUzXCI6IDE2Nzc4NTY5LCBcIjEzNTRcIjogMTY3Nzg1NzAsIFwiMTM1NVwiOiAxNjc3ODU3MSwgXCIxMzU2XCI6IDE2Nzc4NTcyLCBcIjEzNTdcIjogMTY3Nzg1NzMsIFwiMTM1OFwiOiAxNjc3ODU3NCwgXCIxMzU5XCI6IDE2Nzc4NTc1LCBcIjEzNjBcIjogMTY3Nzg1NzYsIFwiMTM2MVwiOiAxNjc3ODU3NywgXCIxMzYyXCI6IDE2Nzc4NTc4LCBcIjEzNjNcIjogMTY3Nzg1NzksIFwiMTM2NFwiOiAxNjc3ODU4MCwgXCIxMzY1XCI6IDE2Nzc4NTgxLCBcIjEzNjZcIjogMTY3Nzg1ODIsIFwiMTM3MFwiOiAxNjc3ODU4NiwgXCIxMzcxXCI6IDE2Nzc4NTg3LCBcIjEzNzJcIjogMTY3Nzg1ODgsIFwiMTM3M1wiOiAxNjc3ODU4OSwgXCIxMzc0XCI6IDE2Nzc4NTkwLCBcIjEzNzdcIjogMTY3Nzg1OTMsIFwiMTM3OFwiOiAxNjc3ODU5NCwgXCIxMzc5XCI6IDE2Nzc4NTk1LCBcIjEzODBcIjogMTY3Nzg1OTYsIFwiMTM4MVwiOiAxNjc3ODU5NywgXCIxMzgyXCI6IDE2Nzc4NTk4LCBcIjEzODNcIjogMTY3Nzg1OTksIFwiMTM4NFwiOiAxNjc3ODYwMCwgXCIxMzg1XCI6IDE2Nzc4NjAxLCBcIjEzODZcIjogMTY3Nzg2MDIsIFwiMTM4N1wiOiAxNjc3ODYwMywgXCIxMzg4XCI6IDE2Nzc4NjA0LCBcIjEzODlcIjogMTY3Nzg2MDUsIFwiMTM5MFwiOiAxNjc3ODYwNiwgXCIxMzkxXCI6IDE2Nzc4NjA3LCBcIjEzOTJcIjogMTY3Nzg2MDgsIFwiMTM5M1wiOiAxNjc3ODYwOSwgXCIxMzk0XCI6IDE2Nzc4NjEwLCBcIjEzOTVcIjogMTY3Nzg2MTEsIFwiMTM5NlwiOiAxNjc3ODYxMiwgXCIxMzk3XCI6IDE2Nzc4NjEzLCBcIjEzOThcIjogMTY3Nzg2MTQsIFwiMTM5OVwiOiAxNjc3ODYxNSwgXCIxNDAwXCI6IDE2Nzc4NjE2LCBcIjE0MDFcIjogMTY3Nzg2MTcsIFwiMTQwMlwiOiAxNjc3ODYxOCwgXCIxNDAzXCI6IDE2Nzc4NjE5LCBcIjE0MDRcIjogMTY3Nzg2MjAsIFwiMTQwNVwiOiAxNjc3ODYyMSwgXCIxNDA2XCI6IDE2Nzc4NjIyLCBcIjE0MDdcIjogMTY3Nzg2MjMsIFwiMTQwOFwiOiAxNjc3ODYyNCwgXCIxNDA5XCI6IDE2Nzc4NjI1LCBcIjE0MTBcIjogMTY3Nzg2MjYsIFwiMTQxMVwiOiAxNjc3ODYyNywgXCIxNDEyXCI6IDE2Nzc4NjI4LCBcIjE0MTNcIjogMTY3Nzg2MjksIFwiMTQxNFwiOiAxNjc3ODYzMCwgXCIxNDE1XCI6IDE2Nzc4NjMxLCBcIjE0MTdcIjogMTY3Nzg2MzMsIFwiMTQxOFwiOiAxNjc3ODYzNCwgXCIxNDg4XCI6IDMyOTYsIFwiMTQ4OVwiOiAzMjk3LCBcIjE0OTBcIjogMzI5OCwgXCIxNDkxXCI6IDMyOTksIFwiMTQ5MlwiOiAzMzAwLCBcIjE0OTNcIjogMzMwMSwgXCIxNDk0XCI6IDMzMDIsIFwiMTQ5NVwiOiAzMzAzLCBcIjE0OTZcIjogMzMwNCwgXCIxNDk3XCI6IDMzMDUsIFwiMTQ5OFwiOiAzMzA2LCBcIjE0OTlcIjogMzMwNywgXCIxNTAwXCI6IDMzMDgsIFwiMTUwMVwiOiAzMzA5LCBcIjE1MDJcIjogMzMxMCwgXCIxNTAzXCI6IDMzMTEsIFwiMTUwNFwiOiAzMzEyLCBcIjE1MDVcIjogMzMxMywgXCIxNTA2XCI6IDMzMTQsIFwiMTUwN1wiOiAzMzE1LCBcIjE1MDhcIjogMzMxNiwgXCIxNTA5XCI6IDMzMTcsIFwiMTUxMFwiOiAzMzE4LCBcIjE1MTFcIjogMzMxOSwgXCIxNTEyXCI6IDMzMjAsIFwiMTUxM1wiOiAzMzIxLCBcIjE1MTRcIjogMzMyMiwgXCIxNTQ4XCI6IDE0NTIsIFwiMTU2M1wiOiAxNDY3LCBcIjE1NjdcIjogMTQ3MSwgXCIxNTY5XCI6IDE0NzMsIFwiMTU3MFwiOiAxNDc0LCBcIjE1NzFcIjogMTQ3NSwgXCIxNTcyXCI6IDE0NzYsIFwiMTU3M1wiOiAxNDc3LCBcIjE1NzRcIjogMTQ3OCwgXCIxNTc1XCI6IDE0NzksIFwiMTU3NlwiOiAxNDgwLCBcIjE1NzdcIjogMTQ4MSwgXCIxNTc4XCI6IDE0ODIsIFwiMTU3OVwiOiAxNDgzLCBcIjE1ODBcIjogMTQ4NCwgXCIxNTgxXCI6IDE0ODUsIFwiMTU4MlwiOiAxNDg2LCBcIjE1ODNcIjogMTQ4NywgXCIxNTg0XCI6IDE0ODgsIFwiMTU4NVwiOiAxNDg5LCBcIjE1ODZcIjogMTQ5MCwgXCIxNTg3XCI6IDE0OTEsIFwiMTU4OFwiOiAxNDkyLCBcIjE1ODlcIjogMTQ5MywgXCIxNTkwXCI6IDE0OTQsIFwiMTU5MVwiOiAxNDk1LCBcIjE1OTJcIjogMTQ5NiwgXCIxNTkzXCI6IDE0OTcsIFwiMTU5NFwiOiAxNDk4LCBcIjE2MDBcIjogMTUwNCwgXCIxNjAxXCI6IDE1MDUsIFwiMTYwMlwiOiAxNTA2LCBcIjE2MDNcIjogMTUwNywgXCIxNjA0XCI6IDE1MDgsIFwiMTYwNVwiOiAxNTA5LCBcIjE2MDZcIjogMTUxMCwgXCIxNjA3XCI6IDE1MTEsIFwiMTYwOFwiOiAxNTEyLCBcIjE2MDlcIjogMTUxMywgXCIxNjEwXCI6IDE1MTQsIFwiMTYxMVwiOiAxNTE1LCBcIjE2MTJcIjogMTUxNiwgXCIxNjEzXCI6IDE1MTcsIFwiMTYxNFwiOiAxNTE4LCBcIjE2MTVcIjogMTUxOSwgXCIxNjE2XCI6IDE1MjAsIFwiMTYxN1wiOiAxNTIxLCBcIjE2MThcIjogMTUyMiwgXCIxNjE5XCI6IDE2Nzc4ODM1LCBcIjE2MjBcIjogMTY3Nzg4MzYsIFwiMTYyMVwiOiAxNjc3ODgzNywgXCIxNjMyXCI6IDE2Nzc4ODQ4LCBcIjE2MzNcIjogMTY3Nzg4NDksIFwiMTYzNFwiOiAxNjc3ODg1MCwgXCIxNjM1XCI6IDE2Nzc4ODUxLCBcIjE2MzZcIjogMTY3Nzg4NTIsIFwiMTYzN1wiOiAxNjc3ODg1MywgXCIxNjM4XCI6IDE2Nzc4ODU0LCBcIjE2MzlcIjogMTY3Nzg4NTUsIFwiMTY0MFwiOiAxNjc3ODg1NiwgXCIxNjQxXCI6IDE2Nzc4ODU3LCBcIjE2NDJcIjogMTY3Nzg4NTgsIFwiMTY0OFwiOiAxNjc3ODg2NCwgXCIxNjU3XCI6IDE2Nzc4ODczLCBcIjE2NjJcIjogMTY3Nzg4NzgsIFwiMTY3MFwiOiAxNjc3ODg4NiwgXCIxNjcyXCI6IDE2Nzc4ODg4LCBcIjE2ODFcIjogMTY3Nzg4OTcsIFwiMTY4OFwiOiAxNjc3ODkwNCwgXCIxNzAwXCI6IDE2Nzc4OTE2LCBcIjE3MDVcIjogMTY3Nzg5MjEsIFwiMTcxMVwiOiAxNjc3ODkyNywgXCIxNzIyXCI6IDE2Nzc4OTM4LCBcIjE3MjZcIjogMTY3Nzg5NDIsIFwiMTcyOVwiOiAxNjc3ODk0NSwgXCIxNzQwXCI6IDE2Nzc4OTU2LCBcIjE3NDZcIjogMTY3Nzg5NjIsIFwiMTc0OFwiOiAxNjc3ODk2NCwgXCIxNzc2XCI6IDE2Nzc4OTkyLCBcIjE3NzdcIjogMTY3Nzg5OTMsIFwiMTc3OFwiOiAxNjc3ODk5NCwgXCIxNzc5XCI6IDE2Nzc4OTk1LCBcIjE3ODBcIjogMTY3Nzg5OTYsIFwiMTc4MVwiOiAxNjc3ODk5NywgXCIxNzgyXCI6IDE2Nzc4OTk4LCBcIjE3ODNcIjogMTY3Nzg5OTksIFwiMTc4NFwiOiAxNjc3OTAwMCwgXCIxNzg1XCI6IDE2Nzc5MDAxLCBcIjM0NThcIjogMTY3ODA2NzQsIFwiMzQ1OVwiOiAxNjc4MDY3NSwgXCIzNDYxXCI6IDE2NzgwNjc3LCBcIjM0NjJcIjogMTY3ODA2NzgsIFwiMzQ2M1wiOiAxNjc4MDY3OSwgXCIzNDY0XCI6IDE2NzgwNjgwLCBcIjM0NjVcIjogMTY3ODA2ODEsIFwiMzQ2NlwiOiAxNjc4MDY4MiwgXCIzNDY3XCI6IDE2NzgwNjgzLCBcIjM0NjhcIjogMTY3ODA2ODQsIFwiMzQ2OVwiOiAxNjc4MDY4NSwgXCIzNDcwXCI6IDE2NzgwNjg2LCBcIjM0NzFcIjogMTY3ODA2ODcsIFwiMzQ3MlwiOiAxNjc4MDY4OCwgXCIzNDczXCI6IDE2NzgwNjg5LCBcIjM0NzRcIjogMTY3ODA2OTAsIFwiMzQ3NVwiOiAxNjc4MDY5MSwgXCIzNDc2XCI6IDE2NzgwNjkyLCBcIjM0NzdcIjogMTY3ODA2OTMsIFwiMzQ3OFwiOiAxNjc4MDY5NCwgXCIzNDgyXCI6IDE2NzgwNjk4LCBcIjM0ODNcIjogMTY3ODA2OTksIFwiMzQ4NFwiOiAxNjc4MDcwMCwgXCIzNDg1XCI6IDE2NzgwNzAxLCBcIjM0ODZcIjogMTY3ODA3MDIsIFwiMzQ4N1wiOiAxNjc4MDcwMywgXCIzNDg4XCI6IDE2NzgwNzA0LCBcIjM0ODlcIjogMTY3ODA3MDUsIFwiMzQ5MFwiOiAxNjc4MDcwNiwgXCIzNDkxXCI6IDE2NzgwNzA3LCBcIjM0OTJcIjogMTY3ODA3MDgsIFwiMzQ5M1wiOiAxNjc4MDcwOSwgXCIzNDk0XCI6IDE2NzgwNzEwLCBcIjM0OTVcIjogMTY3ODA3MTEsIFwiMzQ5NlwiOiAxNjc4MDcxMiwgXCIzNDk3XCI6IDE2NzgwNzEzLCBcIjM0OThcIjogMTY3ODA3MTQsIFwiMzQ5OVwiOiAxNjc4MDcxNSwgXCIzNTAwXCI6IDE2NzgwNzE2LCBcIjM1MDFcIjogMTY3ODA3MTcsIFwiMzUwMlwiOiAxNjc4MDcxOCwgXCIzNTAzXCI6IDE2NzgwNzE5LCBcIjM1MDRcIjogMTY3ODA3MjAsIFwiMzUwNVwiOiAxNjc4MDcyMSwgXCIzNTA3XCI6IDE2NzgwNzIzLCBcIjM1MDhcIjogMTY3ODA3MjQsIFwiMzUwOVwiOiAxNjc4MDcyNSwgXCIzNTEwXCI6IDE2NzgwNzI2LCBcIjM1MTFcIjogMTY3ODA3MjcsIFwiMzUxMlwiOiAxNjc4MDcyOCwgXCIzNTEzXCI6IDE2NzgwNzI5LCBcIjM1MTRcIjogMTY3ODA3MzAsIFwiMzUxNVwiOiAxNjc4MDczMSwgXCIzNTE3XCI6IDE2NzgwNzMzLCBcIjM1MjBcIjogMTY3ODA3MzYsIFwiMzUyMVwiOiAxNjc4MDczNywgXCIzNTIyXCI6IDE2NzgwNzM4LCBcIjM1MjNcIjogMTY3ODA3MzksIFwiMzUyNFwiOiAxNjc4MDc0MCwgXCIzNTI1XCI6IDE2NzgwNzQxLCBcIjM1MjZcIjogMTY3ODA3NDIsIFwiMzUzMFwiOiAxNjc4MDc0NiwgXCIzNTM1XCI6IDE2NzgwNzUxLCBcIjM1MzZcIjogMTY3ODA3NTIsIFwiMzUzN1wiOiAxNjc4MDc1MywgXCIzNTM4XCI6IDE2NzgwNzU0LCBcIjM1MzlcIjogMTY3ODA3NTUsIFwiMzU0MFwiOiAxNjc4MDc1NiwgXCIzNTQyXCI6IDE2NzgwNzU4LCBcIjM1NDRcIjogMTY3ODA3NjAsIFwiMzU0NVwiOiAxNjc4MDc2MSwgXCIzNTQ2XCI6IDE2NzgwNzYyLCBcIjM1NDdcIjogMTY3ODA3NjMsIFwiMzU0OFwiOiAxNjc4MDc2NCwgXCIzNTQ5XCI6IDE2NzgwNzY1LCBcIjM1NTBcIjogMTY3ODA3NjYsIFwiMzU1MVwiOiAxNjc4MDc2NywgXCIzNTcwXCI6IDE2NzgwNzg2LCBcIjM1NzFcIjogMTY3ODA3ODcsIFwiMzU3MlwiOiAxNjc4MDc4OCwgXCIzNTg1XCI6IDM0ODksIFwiMzU4NlwiOiAzNDkwLCBcIjM1ODdcIjogMzQ5MSwgXCIzNTg4XCI6IDM0OTIsIFwiMzU4OVwiOiAzNDkzLCBcIjM1OTBcIjogMzQ5NCwgXCIzNTkxXCI6IDM0OTUsIFwiMzU5MlwiOiAzNDk2LCBcIjM1OTNcIjogMzQ5NywgXCIzNTk0XCI6IDM0OTgsIFwiMzU5NVwiOiAzNDk5LCBcIjM1OTZcIjogMzUwMCwgXCIzNTk3XCI6IDM1MDEsIFwiMzU5OFwiOiAzNTAyLCBcIjM1OTlcIjogMzUwMywgXCIzNjAwXCI6IDM1MDQsIFwiMzYwMVwiOiAzNTA1LCBcIjM2MDJcIjogMzUwNiwgXCIzNjAzXCI6IDM1MDcsIFwiMzYwNFwiOiAzNTA4LCBcIjM2MDVcIjogMzUwOSwgXCIzNjA2XCI6IDM1MTAsIFwiMzYwN1wiOiAzNTExLCBcIjM2MDhcIjogMzUxMiwgXCIzNjA5XCI6IDM1MTMsIFwiMzYxMFwiOiAzNTE0LCBcIjM2MTFcIjogMzUxNSwgXCIzNjEyXCI6IDM1MTYsIFwiMzYxM1wiOiAzNTE3LCBcIjM2MTRcIjogMzUxOCwgXCIzNjE1XCI6IDM1MTksIFwiMzYxNlwiOiAzNTIwLCBcIjM2MTdcIjogMzUyMSwgXCIzNjE4XCI6IDM1MjIsIFwiMzYxOVwiOiAzNTIzLCBcIjM2MjBcIjogMzUyNCwgXCIzNjIxXCI6IDM1MjUsIFwiMzYyMlwiOiAzNTI2LCBcIjM2MjNcIjogMzUyNywgXCIzNjI0XCI6IDM1MjgsIFwiMzYyNVwiOiAzNTI5LCBcIjM2MjZcIjogMzUzMCwgXCIzNjI3XCI6IDM1MzEsIFwiMzYyOFwiOiAzNTMyLCBcIjM2MjlcIjogMzUzMywgXCIzNjMwXCI6IDM1MzQsIFwiMzYzMVwiOiAzNTM1LCBcIjM2MzJcIjogMzUzNiwgXCIzNjMzXCI6IDM1MzcsIFwiMzYzNFwiOiAzNTM4LCBcIjM2MzVcIjogMzUzOSwgXCIzNjM2XCI6IDM1NDAsIFwiMzYzN1wiOiAzNTQxLCBcIjM2MzhcIjogMzU0MiwgXCIzNjM5XCI6IDM1NDMsIFwiMzY0MFwiOiAzNTQ0LCBcIjM2NDFcIjogMzU0NSwgXCIzNjQyXCI6IDM1NDYsIFwiMzY0N1wiOiAzNTUxLCBcIjM2NDhcIjogMzU1MiwgXCIzNjQ5XCI6IDM1NTMsIFwiMzY1MFwiOiAzNTU0LCBcIjM2NTFcIjogMzU1NSwgXCIzNjUyXCI6IDM1NTYsIFwiMzY1M1wiOiAzNTU3LCBcIjM2NTRcIjogMzU1OCwgXCIzNjU1XCI6IDM1NTksIFwiMzY1NlwiOiAzNTYwLCBcIjM2NTdcIjogMzU2MSwgXCIzNjU4XCI6IDM1NjIsIFwiMzY1OVwiOiAzNTYzLCBcIjM2NjBcIjogMzU2NCwgXCIzNjYxXCI6IDM1NjUsIFwiMzY2NFwiOiAzNTY4LCBcIjM2NjVcIjogMzU2OSwgXCIzNjY2XCI6IDM1NzAsIFwiMzY2N1wiOiAzNTcxLCBcIjM2NjhcIjogMzU3MiwgXCIzNjY5XCI6IDM1NzMsIFwiMzY3MFwiOiAzNTc0LCBcIjM2NzFcIjogMzU3NSwgXCIzNjcyXCI6IDM1NzYsIFwiMzY3M1wiOiAzNTc3LCBcIjQzMDRcIjogMTY3ODE1MjAsIFwiNDMwNVwiOiAxNjc4MTUyMSwgXCI0MzA2XCI6IDE2NzgxNTIyLCBcIjQzMDdcIjogMTY3ODE1MjMsIFwiNDMwOFwiOiAxNjc4MTUyNCwgXCI0MzA5XCI6IDE2NzgxNTI1LCBcIjQzMTBcIjogMTY3ODE1MjYsIFwiNDMxMVwiOiAxNjc4MTUyNywgXCI0MzEyXCI6IDE2NzgxNTI4LCBcIjQzMTNcIjogMTY3ODE1MjksIFwiNDMxNFwiOiAxNjc4MTUzMCwgXCI0MzE1XCI6IDE2NzgxNTMxLCBcIjQzMTZcIjogMTY3ODE1MzIsIFwiNDMxN1wiOiAxNjc4MTUzMywgXCI0MzE4XCI6IDE2NzgxNTM0LCBcIjQzMTlcIjogMTY3ODE1MzUsIFwiNDMyMFwiOiAxNjc4MTUzNiwgXCI0MzIxXCI6IDE2NzgxNTM3LCBcIjQzMjJcIjogMTY3ODE1MzgsIFwiNDMyM1wiOiAxNjc4MTUzOSwgXCI0MzI0XCI6IDE2NzgxNTQwLCBcIjQzMjVcIjogMTY3ODE1NDEsIFwiNDMyNlwiOiAxNjc4MTU0MiwgXCI0MzI3XCI6IDE2NzgxNTQzLCBcIjQzMjhcIjogMTY3ODE1NDQsIFwiNDMyOVwiOiAxNjc4MTU0NSwgXCI0MzMwXCI6IDE2NzgxNTQ2LCBcIjQzMzFcIjogMTY3ODE1NDcsIFwiNDMzMlwiOiAxNjc4MTU0OCwgXCI0MzMzXCI6IDE2NzgxNTQ5LCBcIjQzMzRcIjogMTY3ODE1NTAsIFwiNDMzNVwiOiAxNjc4MTU1MSwgXCI0MzM2XCI6IDE2NzgxNTUyLCBcIjQzMzdcIjogMTY3ODE1NTMsIFwiNDMzOFwiOiAxNjc4MTU1NCwgXCI0MzM5XCI6IDE2NzgxNTU1LCBcIjQzNDBcIjogMTY3ODE1NTYsIFwiNDM0MVwiOiAxNjc4MTU1NywgXCI0MzQyXCI6IDE2NzgxNTU4LCBcIjc2ODJcIjogMTY3ODQ4OTgsIFwiNzY4M1wiOiAxNjc4NDg5OSwgXCI3NjkwXCI6IDE2Nzg0OTA2LCBcIjc2OTFcIjogMTY3ODQ5MDcsIFwiNzcxMFwiOiAxNjc4NDkyNiwgXCI3NzExXCI6IDE2Nzg0OTI3LCBcIjc3MzRcIjogMTY3ODQ5NTAsIFwiNzczNVwiOiAxNjc4NDk1MSwgXCI3NzQ0XCI6IDE2Nzg0OTYwLCBcIjc3NDVcIjogMTY3ODQ5NjEsIFwiNzc2NlwiOiAxNjc4NDk4MiwgXCI3NzY3XCI6IDE2Nzg0OTgzLCBcIjc3NzZcIjogMTY3ODQ5OTIsIFwiNzc3N1wiOiAxNjc4NDk5MywgXCI3Nzg2XCI6IDE2Nzg1MDAyLCBcIjc3ODdcIjogMTY3ODUwMDMsIFwiNzgwOFwiOiAxNjc4NTAyNCwgXCI3ODA5XCI6IDE2Nzg1MDI1LCBcIjc4MTBcIjogMTY3ODUwMjYsIFwiNzgxMVwiOiAxNjc4NTAyNywgXCI3ODEyXCI6IDE2Nzg1MDI4LCBcIjc4MTNcIjogMTY3ODUwMjksIFwiNzgxOFwiOiAxNjc4NTAzNCwgXCI3ODE5XCI6IDE2Nzg1MDM1LCBcIjc4NDBcIjogMTY3ODUwNTYsIFwiNzg0MVwiOiAxNjc4NTA1NywgXCI3ODQyXCI6IDE2Nzg1MDU4LCBcIjc4NDNcIjogMTY3ODUwNTksIFwiNzg0NFwiOiAxNjc4NTA2MCwgXCI3ODQ1XCI6IDE2Nzg1MDYxLCBcIjc4NDZcIjogMTY3ODUwNjIsIFwiNzg0N1wiOiAxNjc4NTA2MywgXCI3ODQ4XCI6IDE2Nzg1MDY0LCBcIjc4NDlcIjogMTY3ODUwNjUsIFwiNzg1MFwiOiAxNjc4NTA2NiwgXCI3ODUxXCI6IDE2Nzg1MDY3LCBcIjc4NTJcIjogMTY3ODUwNjgsIFwiNzg1M1wiOiAxNjc4NTA2OSwgXCI3ODU0XCI6IDE2Nzg1MDcwLCBcIjc4NTVcIjogMTY3ODUwNzEsIFwiNzg1NlwiOiAxNjc4NTA3MiwgXCI3ODU3XCI6IDE2Nzg1MDczLCBcIjc4NThcIjogMTY3ODUwNzQsIFwiNzg1OVwiOiAxNjc4NTA3NSwgXCI3ODYwXCI6IDE2Nzg1MDc2LCBcIjc4NjFcIjogMTY3ODUwNzcsIFwiNzg2MlwiOiAxNjc4NTA3OCwgXCI3ODYzXCI6IDE2Nzg1MDc5LCBcIjc4NjRcIjogMTY3ODUwODAsIFwiNzg2NVwiOiAxNjc4NTA4MSwgXCI3ODY2XCI6IDE2Nzg1MDgyLCBcIjc4NjdcIjogMTY3ODUwODMsIFwiNzg2OFwiOiAxNjc4NTA4NCwgXCI3ODY5XCI6IDE2Nzg1MDg1LCBcIjc4NzBcIjogMTY3ODUwODYsIFwiNzg3MVwiOiAxNjc4NTA4NywgXCI3ODcyXCI6IDE2Nzg1MDg4LCBcIjc4NzNcIjogMTY3ODUwODksIFwiNzg3NFwiOiAxNjc4NTA5MCwgXCI3ODc1XCI6IDE2Nzg1MDkxLCBcIjc4NzZcIjogMTY3ODUwOTIsIFwiNzg3N1wiOiAxNjc4NTA5MywgXCI3ODc4XCI6IDE2Nzg1MDk0LCBcIjc4NzlcIjogMTY3ODUwOTUsIFwiNzg4MFwiOiAxNjc4NTA5NiwgXCI3ODgxXCI6IDE2Nzg1MDk3LCBcIjc4ODJcIjogMTY3ODUwOTgsIFwiNzg4M1wiOiAxNjc4NTA5OSwgXCI3ODg0XCI6IDE2Nzg1MTAwLCBcIjc4ODVcIjogMTY3ODUxMDEsIFwiNzg4NlwiOiAxNjc4NTEwMiwgXCI3ODg3XCI6IDE2Nzg1MTAzLCBcIjc4ODhcIjogMTY3ODUxMDQsIFwiNzg4OVwiOiAxNjc4NTEwNSwgXCI3ODkwXCI6IDE2Nzg1MTA2LCBcIjc4OTFcIjogMTY3ODUxMDcsIFwiNzg5MlwiOiAxNjc4NTEwOCwgXCI3ODkzXCI6IDE2Nzg1MTA5LCBcIjc4OTRcIjogMTY3ODUxMTAsIFwiNzg5NVwiOiAxNjc4NTExMSwgXCI3ODk2XCI6IDE2Nzg1MTEyLCBcIjc4OTdcIjogMTY3ODUxMTMsIFwiNzg5OFwiOiAxNjc4NTExNCwgXCI3ODk5XCI6IDE2Nzg1MTE1LCBcIjc5MDBcIjogMTY3ODUxMTYsIFwiNzkwMVwiOiAxNjc4NTExNywgXCI3OTAyXCI6IDE2Nzg1MTE4LCBcIjc5MDNcIjogMTY3ODUxMTksIFwiNzkwNFwiOiAxNjc4NTEyMCwgXCI3OTA1XCI6IDE2Nzg1MTIxLCBcIjc5MDZcIjogMTY3ODUxMjIsIFwiNzkwN1wiOiAxNjc4NTEyMywgXCI3OTA4XCI6IDE2Nzg1MTI0LCBcIjc5MDlcIjogMTY3ODUxMjUsIFwiNzkxMFwiOiAxNjc4NTEyNiwgXCI3OTExXCI6IDE2Nzg1MTI3LCBcIjc5MTJcIjogMTY3ODUxMjgsIFwiNzkxM1wiOiAxNjc4NTEyOSwgXCI3OTE0XCI6IDE2Nzg1MTMwLCBcIjc5MTVcIjogMTY3ODUxMzEsIFwiNzkxNlwiOiAxNjc4NTEzMiwgXCI3OTE3XCI6IDE2Nzg1MTMzLCBcIjc5MThcIjogMTY3ODUxMzQsIFwiNzkxOVwiOiAxNjc4NTEzNSwgXCI3OTIwXCI6IDE2Nzg1MTM2LCBcIjc5MjFcIjogMTY3ODUxMzcsIFwiNzkyMlwiOiAxNjc4NTEzOCwgXCI3OTIzXCI6IDE2Nzg1MTM5LCBcIjc5MjRcIjogMTY3ODUxNDAsIFwiNzkyNVwiOiAxNjc4NTE0MSwgXCI3OTI2XCI6IDE2Nzg1MTQyLCBcIjc5MjdcIjogMTY3ODUxNDMsIFwiNzkyOFwiOiAxNjc4NTE0NCwgXCI3OTI5XCI6IDE2Nzg1MTQ1LCBcIjgxOTRcIjogMjcyMiwgXCI4MTk1XCI6IDI3MjEsIFwiODE5NlwiOiAyNzIzLCBcIjgxOTdcIjogMjcyNCwgXCI4MTk5XCI6IDI3MjUsIFwiODIwMFwiOiAyNzI2LCBcIjgyMDFcIjogMjcyNywgXCI4MjAyXCI6IDI3MjgsIFwiODIxMFwiOiAyNzQ3LCBcIjgyMTFcIjogMjczMCwgXCI4MjEyXCI6IDI3MjksIFwiODIxM1wiOiAxOTY3LCBcIjgyMTVcIjogMzI5NSwgXCI4MjE2XCI6IDI3NjgsIFwiODIxN1wiOiAyNzY5LCBcIjgyMThcIjogMjgxMywgXCI4MjIwXCI6IDI3NzAsIFwiODIyMVwiOiAyNzcxLCBcIjgyMjJcIjogMjgxNCwgXCI4MjI0XCI6IDI4MDEsIFwiODIyNVwiOiAyODAyLCBcIjgyMjZcIjogMjc5MCwgXCI4MjI5XCI6IDI3MzUsIFwiODIzMFwiOiAyNzM0LCBcIjgyNDBcIjogMjc3MywgXCI4MjQyXCI6IDI3NzQsIFwiODI0M1wiOiAyNzc1LCBcIjgyNDhcIjogMjgxMiwgXCI4MjU0XCI6IDExNTAsIFwiODMwNFwiOiAxNjc4NTUyMCwgXCI4MzA4XCI6IDE2Nzg1NTI0LCBcIjgzMDlcIjogMTY3ODU1MjUsIFwiODMxMFwiOiAxNjc4NTUyNiwgXCI4MzExXCI6IDE2Nzg1NTI3LCBcIjgzMTJcIjogMTY3ODU1MjgsIFwiODMxM1wiOiAxNjc4NTUyOSwgXCI4MzIwXCI6IDE2Nzg1NTM2LCBcIjgzMjFcIjogMTY3ODU1MzcsIFwiODMyMlwiOiAxNjc4NTUzOCwgXCI4MzIzXCI6IDE2Nzg1NTM5LCBcIjgzMjRcIjogMTY3ODU1NDAsIFwiODMyNVwiOiAxNjc4NTU0MSwgXCI4MzI2XCI6IDE2Nzg1NTQyLCBcIjgzMjdcIjogMTY3ODU1NDMsIFwiODMyOFwiOiAxNjc4NTU0NCwgXCI4MzI5XCI6IDE2Nzg1NTQ1LCBcIjgzNTJcIjogMTY3ODU1NjgsIFwiODM1M1wiOiAxNjc4NTU2OSwgXCI4MzU0XCI6IDE2Nzg1NTcwLCBcIjgzNTVcIjogMTY3ODU1NzEsIFwiODM1NlwiOiAxNjc4NTU3MiwgXCI4MzU3XCI6IDE2Nzg1NTczLCBcIjgzNThcIjogMTY3ODU1NzQsIFwiODM1OVwiOiAxNjc4NTU3NSwgXCI4MzYwXCI6IDE2Nzg1NTc2LCBcIjgzNjFcIjogMzgzOSwgXCI4MzYyXCI6IDE2Nzg1NTc4LCBcIjgzNjNcIjogMTY3ODU1NzksIFwiODM2NFwiOiA4MzY0LCBcIjg0NTNcIjogMjc0NCwgXCI4NDcwXCI6IDE3MTIsIFwiODQ3MVwiOiAyODExLCBcIjg0NzhcIjogMjc3MiwgXCI4NDgyXCI6IDI3NjEsIFwiODUzMVwiOiAyNzM2LCBcIjg1MzJcIjogMjczNywgXCI4NTMzXCI6IDI3MzgsIFwiODUzNFwiOiAyNzM5LCBcIjg1MzVcIjogMjc0MCwgXCI4NTM2XCI6IDI3NDEsIFwiODUzN1wiOiAyNzQyLCBcIjg1MzhcIjogMjc0MywgXCI4NTM5XCI6IDI3NTUsIFwiODU0MFwiOiAyNzU2LCBcIjg1NDFcIjogMjc1NywgXCI4NTQyXCI6IDI3NTgsIFwiODU5MlwiOiAyMjk5LCBcIjg1OTNcIjogMjMwMCwgXCI4NTk0XCI6IDIzMDEsIFwiODU5NVwiOiAyMzAyLCBcIjg2NThcIjogMjI1NCwgXCI4NjYwXCI6IDIyNTMsIFwiODcwNlwiOiAyMjg3LCBcIjg3MDlcIjogMTY3ODU5MjUsIFwiODcxMVwiOiAyMjQ1LCBcIjg3MTJcIjogMTY3ODU5MjgsIFwiODcxM1wiOiAxNjc4NTkyOSwgXCI4NzE1XCI6IDE2Nzg1OTMxLCBcIjg3MjhcIjogMzAxOCwgXCI4NzMwXCI6IDIyNjIsIFwiODczMVwiOiAxNjc4NTk0NywgXCI4NzMyXCI6IDE2Nzg1OTQ4LCBcIjg3MzNcIjogMjI0MSwgXCI4NzM0XCI6IDIyNDIsIFwiODc0M1wiOiAyMjcwLCBcIjg3NDRcIjogMjI3MSwgXCI4NzQ1XCI6IDIyNjgsIFwiODc0NlwiOiAyMjY5LCBcIjg3NDdcIjogMjIzOSwgXCI4NzQ4XCI6IDE2Nzg1OTY0LCBcIjg3NDlcIjogMTY3ODU5NjUsIFwiODc1NlwiOiAyMjQwLCBcIjg3NTdcIjogMTY3ODU5NzMsIFwiODc2NFwiOiAyMjQ4LCBcIjg3NzFcIjogMjI0OSwgXCI4NzczXCI6IDE2Nzg1OTkyLCBcIjg3NzVcIjogMTY3ODU5OTEsIFwiODgwMFwiOiAyMjM3LCBcIjg4MDFcIjogMjI1NSwgXCI4ODAyXCI6IDE2Nzg2MDE4LCBcIjg4MDNcIjogMTY3ODYwMTksIFwiODgwNFwiOiAyMjM2LCBcIjg4MDVcIjogMjIzOCwgXCI4ODM0XCI6IDIyNjYsIFwiODgzNVwiOiAyMjY3LCBcIjg4NjZcIjogMzA2OCwgXCI4ODY3XCI6IDMwMzYsIFwiODg2OFwiOiAzMDEwLCBcIjg4NjlcIjogMzAyMiwgXCI4OTY4XCI6IDMwMjcsIFwiODk3MFwiOiAzMDEyLCBcIjg5ODFcIjogMjgxMCwgXCI4OTkyXCI6IDIyMTIsIFwiODk5M1wiOiAyMjEzLCBcIjkxMDlcIjogMzAyMCwgXCI5MTE1XCI6IDIyMTksIFwiOTExN1wiOiAyMjIwLCBcIjkxMThcIjogMjIyMSwgXCI5MTIwXCI6IDIyMjIsIFwiOTEyMVwiOiAyMjE1LCBcIjkxMjNcIjogMjIxNiwgXCI5MTI0XCI6IDIyMTcsIFwiOTEyNlwiOiAyMjE4LCBcIjkxMjhcIjogMjIyMywgXCI5MTMyXCI6IDIyMjQsIFwiOTE0M1wiOiAyMjA5LCBcIjkxNDZcIjogMjU0MywgXCI5MTQ3XCI6IDI1NDQsIFwiOTE0OFwiOiAyNTQ2LCBcIjkxNDlcIjogMjU0NywgXCI5MjI1XCI6IDI1MzAsIFwiOTIyNlwiOiAyNTMzLCBcIjkyMjdcIjogMjUzNywgXCI5MjI4XCI6IDI1MzEsIFwiOTIyOVwiOiAyNTMyLCBcIjkyNTFcIjogMjczMiwgXCI5MjUyXCI6IDI1MzYsIFwiOTQ3MlwiOiAyMjExLCBcIjk0NzRcIjogMjIxNCwgXCI5NDg0XCI6IDIyMTAsIFwiOTQ4OFwiOiAyNTM5LCBcIjk0OTJcIjogMjU0MSwgXCI5NDk2XCI6IDI1MzgsIFwiOTUwMFwiOiAyNTQ4LCBcIjk1MDhcIjogMjU0OSwgXCI5NTE2XCI6IDI1NTEsIFwiOTUyNFwiOiAyNTUwLCBcIjk1MzJcIjogMjU0MiwgXCI5NjE4XCI6IDI1MjksIFwiOTY0MlwiOiAyNzkxLCBcIjk2NDNcIjogMjc4NSwgXCI5NjQ0XCI6IDI3NzksIFwiOTY0NVwiOiAyNzg2LCBcIjk2NDZcIjogMjc4MywgXCI5NjQ3XCI6IDI3NjcsIFwiOTY1MFwiOiAyNzkyLCBcIjk2NTFcIjogMjc4NywgXCI5NjU0XCI6IDI3ODEsIFwiOTY1NVwiOiAyNzY1LCBcIjk2NjBcIjogMjc5MywgXCI5NjYxXCI6IDI3ODgsIFwiOTY2NFwiOiAyNzgwLCBcIjk2NjVcIjogMjc2NCwgXCI5NjcwXCI6IDI1MjgsIFwiOTY3NVwiOiAyNzY2LCBcIjk2NzlcIjogMjc4MiwgXCI5NzAyXCI6IDI3ODQsIFwiOTczNFwiOiAyNzg5LCBcIjk3NDJcIjogMjgwOSwgXCI5NzQ3XCI6IDI3NjIsIFwiOTc1NlwiOiAyNzk0LCBcIjk3NThcIjogMjc5NSwgXCI5NzkyXCI6IDI4MDgsIFwiOTc5NFwiOiAyODA3LCBcIjk4MjdcIjogMjc5NiwgXCI5ODI5XCI6IDI3OTgsIFwiOTgzMFwiOiAyNzk3LCBcIjk4MzdcIjogMjgwNiwgXCI5ODM5XCI6IDI4MDUsIFwiMTAwMDNcIjogMjgwMywgXCIxMDAwN1wiOiAyODA0LCBcIjEwMDEzXCI6IDI3NzcsIFwiMTAwMTZcIjogMjgwMCwgXCIxMDIxNlwiOiAyNzQ4LCBcIjEwMjE3XCI6IDI3NTAsIFwiMTAyNDBcIjogMTY3ODc0NTYsIFwiMTAyNDFcIjogMTY3ODc0NTcsIFwiMTAyNDJcIjogMTY3ODc0NTgsIFwiMTAyNDNcIjogMTY3ODc0NTksIFwiMTAyNDRcIjogMTY3ODc0NjAsIFwiMTAyNDVcIjogMTY3ODc0NjEsIFwiMTAyNDZcIjogMTY3ODc0NjIsIFwiMTAyNDdcIjogMTY3ODc0NjMsIFwiMTAyNDhcIjogMTY3ODc0NjQsIFwiMTAyNDlcIjogMTY3ODc0NjUsIFwiMTAyNTBcIjogMTY3ODc0NjYsIFwiMTAyNTFcIjogMTY3ODc0NjcsIFwiMTAyNTJcIjogMTY3ODc0NjgsIFwiMTAyNTNcIjogMTY3ODc0NjksIFwiMTAyNTRcIjogMTY3ODc0NzAsIFwiMTAyNTVcIjogMTY3ODc0NzEsIFwiMTAyNTZcIjogMTY3ODc0NzIsIFwiMTAyNTdcIjogMTY3ODc0NzMsIFwiMTAyNThcIjogMTY3ODc0NzQsIFwiMTAyNTlcIjogMTY3ODc0NzUsIFwiMTAyNjBcIjogMTY3ODc0NzYsIFwiMTAyNjFcIjogMTY3ODc0NzcsIFwiMTAyNjJcIjogMTY3ODc0NzgsIFwiMTAyNjNcIjogMTY3ODc0NzksIFwiMTAyNjRcIjogMTY3ODc0ODAsIFwiMTAyNjVcIjogMTY3ODc0ODEsIFwiMTAyNjZcIjogMTY3ODc0ODIsIFwiMTAyNjdcIjogMTY3ODc0ODMsIFwiMTAyNjhcIjogMTY3ODc0ODQsIFwiMTAyNjlcIjogMTY3ODc0ODUsIFwiMTAyNzBcIjogMTY3ODc0ODYsIFwiMTAyNzFcIjogMTY3ODc0ODcsIFwiMTAyNzJcIjogMTY3ODc0ODgsIFwiMTAyNzNcIjogMTY3ODc0ODksIFwiMTAyNzRcIjogMTY3ODc0OTAsIFwiMTAyNzVcIjogMTY3ODc0OTEsIFwiMTAyNzZcIjogMTY3ODc0OTIsIFwiMTAyNzdcIjogMTY3ODc0OTMsIFwiMTAyNzhcIjogMTY3ODc0OTQsIFwiMTAyNzlcIjogMTY3ODc0OTUsIFwiMTAyODBcIjogMTY3ODc0OTYsIFwiMTAyODFcIjogMTY3ODc0OTcsIFwiMTAyODJcIjogMTY3ODc0OTgsIFwiMTAyODNcIjogMTY3ODc0OTksIFwiMTAyODRcIjogMTY3ODc1MDAsIFwiMTAyODVcIjogMTY3ODc1MDEsIFwiMTAyODZcIjogMTY3ODc1MDIsIFwiMTAyODdcIjogMTY3ODc1MDMsIFwiMTAyODhcIjogMTY3ODc1MDQsIFwiMTAyODlcIjogMTY3ODc1MDUsIFwiMTAyOTBcIjogMTY3ODc1MDYsIFwiMTAyOTFcIjogMTY3ODc1MDcsIFwiMTAyOTJcIjogMTY3ODc1MDgsIFwiMTAyOTNcIjogMTY3ODc1MDksIFwiMTAyOTRcIjogMTY3ODc1MTAsIFwiMTAyOTVcIjogMTY3ODc1MTEsIFwiMTAyOTZcIjogMTY3ODc1MTIsIFwiMTAyOTdcIjogMTY3ODc1MTMsIFwiMTAyOThcIjogMTY3ODc1MTQsIFwiMTAyOTlcIjogMTY3ODc1MTUsIFwiMTAzMDBcIjogMTY3ODc1MTYsIFwiMTAzMDFcIjogMTY3ODc1MTcsIFwiMTAzMDJcIjogMTY3ODc1MTgsIFwiMTAzMDNcIjogMTY3ODc1MTksIFwiMTAzMDRcIjogMTY3ODc1MjAsIFwiMTAzMDVcIjogMTY3ODc1MjEsIFwiMTAzMDZcIjogMTY3ODc1MjIsIFwiMTAzMDdcIjogMTY3ODc1MjMsIFwiMTAzMDhcIjogMTY3ODc1MjQsIFwiMTAzMDlcIjogMTY3ODc1MjUsIFwiMTAzMTBcIjogMTY3ODc1MjYsIFwiMTAzMTFcIjogMTY3ODc1MjcsIFwiMTAzMTJcIjogMTY3ODc1MjgsIFwiMTAzMTNcIjogMTY3ODc1MjksIFwiMTAzMTRcIjogMTY3ODc1MzAsIFwiMTAzMTVcIjogMTY3ODc1MzEsIFwiMTAzMTZcIjogMTY3ODc1MzIsIFwiMTAzMTdcIjogMTY3ODc1MzMsIFwiMTAzMThcIjogMTY3ODc1MzQsIFwiMTAzMTlcIjogMTY3ODc1MzUsIFwiMTAzMjBcIjogMTY3ODc1MzYsIFwiMTAzMjFcIjogMTY3ODc1MzcsIFwiMTAzMjJcIjogMTY3ODc1MzgsIFwiMTAzMjNcIjogMTY3ODc1MzksIFwiMTAzMjRcIjogMTY3ODc1NDAsIFwiMTAzMjVcIjogMTY3ODc1NDEsIFwiMTAzMjZcIjogMTY3ODc1NDIsIFwiMTAzMjdcIjogMTY3ODc1NDMsIFwiMTAzMjhcIjogMTY3ODc1NDQsIFwiMTAzMjlcIjogMTY3ODc1NDUsIFwiMTAzMzBcIjogMTY3ODc1NDYsIFwiMTAzMzFcIjogMTY3ODc1NDcsIFwiMTAzMzJcIjogMTY3ODc1NDgsIFwiMTAzMzNcIjogMTY3ODc1NDksIFwiMTAzMzRcIjogMTY3ODc1NTAsIFwiMTAzMzVcIjogMTY3ODc1NTEsIFwiMTAzMzZcIjogMTY3ODc1NTIsIFwiMTAzMzdcIjogMTY3ODc1NTMsIFwiMTAzMzhcIjogMTY3ODc1NTQsIFwiMTAzMzlcIjogMTY3ODc1NTUsIFwiMTAzNDBcIjogMTY3ODc1NTYsIFwiMTAzNDFcIjogMTY3ODc1NTcsIFwiMTAzNDJcIjogMTY3ODc1NTgsIFwiMTAzNDNcIjogMTY3ODc1NTksIFwiMTAzNDRcIjogMTY3ODc1NjAsIFwiMTAzNDVcIjogMTY3ODc1NjEsIFwiMTAzNDZcIjogMTY3ODc1NjIsIFwiMTAzNDdcIjogMTY3ODc1NjMsIFwiMTAzNDhcIjogMTY3ODc1NjQsIFwiMTAzNDlcIjogMTY3ODc1NjUsIFwiMTAzNTBcIjogMTY3ODc1NjYsIFwiMTAzNTFcIjogMTY3ODc1NjcsIFwiMTAzNTJcIjogMTY3ODc1NjgsIFwiMTAzNTNcIjogMTY3ODc1NjksIFwiMTAzNTRcIjogMTY3ODc1NzAsIFwiMTAzNTVcIjogMTY3ODc1NzEsIFwiMTAzNTZcIjogMTY3ODc1NzIsIFwiMTAzNTdcIjogMTY3ODc1NzMsIFwiMTAzNThcIjogMTY3ODc1NzQsIFwiMTAzNTlcIjogMTY3ODc1NzUsIFwiMTAzNjBcIjogMTY3ODc1NzYsIFwiMTAzNjFcIjogMTY3ODc1NzcsIFwiMTAzNjJcIjogMTY3ODc1NzgsIFwiMTAzNjNcIjogMTY3ODc1NzksIFwiMTAzNjRcIjogMTY3ODc1ODAsIFwiMTAzNjVcIjogMTY3ODc1ODEsIFwiMTAzNjZcIjogMTY3ODc1ODIsIFwiMTAzNjdcIjogMTY3ODc1ODMsIFwiMTAzNjhcIjogMTY3ODc1ODQsIFwiMTAzNjlcIjogMTY3ODc1ODUsIFwiMTAzNzBcIjogMTY3ODc1ODYsIFwiMTAzNzFcIjogMTY3ODc1ODcsIFwiMTAzNzJcIjogMTY3ODc1ODgsIFwiMTAzNzNcIjogMTY3ODc1ODksIFwiMTAzNzRcIjogMTY3ODc1OTAsIFwiMTAzNzVcIjogMTY3ODc1OTEsIFwiMTAzNzZcIjogMTY3ODc1OTIsIFwiMTAzNzdcIjogMTY3ODc1OTMsIFwiMTAzNzhcIjogMTY3ODc1OTQsIFwiMTAzNzlcIjogMTY3ODc1OTUsIFwiMTAzODBcIjogMTY3ODc1OTYsIFwiMTAzODFcIjogMTY3ODc1OTcsIFwiMTAzODJcIjogMTY3ODc1OTgsIFwiMTAzODNcIjogMTY3ODc1OTksIFwiMTAzODRcIjogMTY3ODc2MDAsIFwiMTAzODVcIjogMTY3ODc2MDEsIFwiMTAzODZcIjogMTY3ODc2MDIsIFwiMTAzODdcIjogMTY3ODc2MDMsIFwiMTAzODhcIjogMTY3ODc2MDQsIFwiMTAzODlcIjogMTY3ODc2MDUsIFwiMTAzOTBcIjogMTY3ODc2MDYsIFwiMTAzOTFcIjogMTY3ODc2MDcsIFwiMTAzOTJcIjogMTY3ODc2MDgsIFwiMTAzOTNcIjogMTY3ODc2MDksIFwiMTAzOTRcIjogMTY3ODc2MTAsIFwiMTAzOTVcIjogMTY3ODc2MTEsIFwiMTAzOTZcIjogMTY3ODc2MTIsIFwiMTAzOTdcIjogMTY3ODc2MTMsIFwiMTAzOThcIjogMTY3ODc2MTQsIFwiMTAzOTlcIjogMTY3ODc2MTUsIFwiMTA0MDBcIjogMTY3ODc2MTYsIFwiMTA0MDFcIjogMTY3ODc2MTcsIFwiMTA0MDJcIjogMTY3ODc2MTgsIFwiMTA0MDNcIjogMTY3ODc2MTksIFwiMTA0MDRcIjogMTY3ODc2MjAsIFwiMTA0MDVcIjogMTY3ODc2MjEsIFwiMTA0MDZcIjogMTY3ODc2MjIsIFwiMTA0MDdcIjogMTY3ODc2MjMsIFwiMTA0MDhcIjogMTY3ODc2MjQsIFwiMTA0MDlcIjogMTY3ODc2MjUsIFwiMTA0MTBcIjogMTY3ODc2MjYsIFwiMTA0MTFcIjogMTY3ODc2MjcsIFwiMTA0MTJcIjogMTY3ODc2MjgsIFwiMTA0MTNcIjogMTY3ODc2MjksIFwiMTA0MTRcIjogMTY3ODc2MzAsIFwiMTA0MTVcIjogMTY3ODc2MzEsIFwiMTA0MTZcIjogMTY3ODc2MzIsIFwiMTA0MTdcIjogMTY3ODc2MzMsIFwiMTA0MThcIjogMTY3ODc2MzQsIFwiMTA0MTlcIjogMTY3ODc2MzUsIFwiMTA0MjBcIjogMTY3ODc2MzYsIFwiMTA0MjFcIjogMTY3ODc2MzcsIFwiMTA0MjJcIjogMTY3ODc2MzgsIFwiMTA0MjNcIjogMTY3ODc2MzksIFwiMTA0MjRcIjogMTY3ODc2NDAsIFwiMTA0MjVcIjogMTY3ODc2NDEsIFwiMTA0MjZcIjogMTY3ODc2NDIsIFwiMTA0MjdcIjogMTY3ODc2NDMsIFwiMTA0MjhcIjogMTY3ODc2NDQsIFwiMTA0MjlcIjogMTY3ODc2NDUsIFwiMTA0MzBcIjogMTY3ODc2NDYsIFwiMTA0MzFcIjogMTY3ODc2NDcsIFwiMTA0MzJcIjogMTY3ODc2NDgsIFwiMTA0MzNcIjogMTY3ODc2NDksIFwiMTA0MzRcIjogMTY3ODc2NTAsIFwiMTA0MzVcIjogMTY3ODc2NTEsIFwiMTA0MzZcIjogMTY3ODc2NTIsIFwiMTA0MzdcIjogMTY3ODc2NTMsIFwiMTA0MzhcIjogMTY3ODc2NTQsIFwiMTA0MzlcIjogMTY3ODc2NTUsIFwiMTA0NDBcIjogMTY3ODc2NTYsIFwiMTA0NDFcIjogMTY3ODc2NTcsIFwiMTA0NDJcIjogMTY3ODc2NTgsIFwiMTA0NDNcIjogMTY3ODc2NTksIFwiMTA0NDRcIjogMTY3ODc2NjAsIFwiMTA0NDVcIjogMTY3ODc2NjEsIFwiMTA0NDZcIjogMTY3ODc2NjIsIFwiMTA0NDdcIjogMTY3ODc2NjMsIFwiMTA0NDhcIjogMTY3ODc2NjQsIFwiMTA0NDlcIjogMTY3ODc2NjUsIFwiMTA0NTBcIjogMTY3ODc2NjYsIFwiMTA0NTFcIjogMTY3ODc2NjcsIFwiMTA0NTJcIjogMTY3ODc2NjgsIFwiMTA0NTNcIjogMTY3ODc2NjksIFwiMTA0NTRcIjogMTY3ODc2NzAsIFwiMTA0NTVcIjogMTY3ODc2NzEsIFwiMTA0NTZcIjogMTY3ODc2NzIsIFwiMTA0NTdcIjogMTY3ODc2NzMsIFwiMTA0NThcIjogMTY3ODc2NzQsIFwiMTA0NTlcIjogMTY3ODc2NzUsIFwiMTA0NjBcIjogMTY3ODc2NzYsIFwiMTA0NjFcIjogMTY3ODc2NzcsIFwiMTA0NjJcIjogMTY3ODc2NzgsIFwiMTA0NjNcIjogMTY3ODc2NzksIFwiMTA0NjRcIjogMTY3ODc2ODAsIFwiMTA0NjVcIjogMTY3ODc2ODEsIFwiMTA0NjZcIjogMTY3ODc2ODIsIFwiMTA0NjdcIjogMTY3ODc2ODMsIFwiMTA0NjhcIjogMTY3ODc2ODQsIFwiMTA0NjlcIjogMTY3ODc2ODUsIFwiMTA0NzBcIjogMTY3ODc2ODYsIFwiMTA0NzFcIjogMTY3ODc2ODcsIFwiMTA0NzJcIjogMTY3ODc2ODgsIFwiMTA0NzNcIjogMTY3ODc2ODksIFwiMTA0NzRcIjogMTY3ODc2OTAsIFwiMTA0NzVcIjogMTY3ODc2OTEsIFwiMTA0NzZcIjogMTY3ODc2OTIsIFwiMTA0NzdcIjogMTY3ODc2OTMsIFwiMTA0NzhcIjogMTY3ODc2OTQsIFwiMTA0NzlcIjogMTY3ODc2OTUsIFwiMTA0ODBcIjogMTY3ODc2OTYsIFwiMTA0ODFcIjogMTY3ODc2OTcsIFwiMTA0ODJcIjogMTY3ODc2OTgsIFwiMTA0ODNcIjogMTY3ODc2OTksIFwiMTA0ODRcIjogMTY3ODc3MDAsIFwiMTA0ODVcIjogMTY3ODc3MDEsIFwiMTA0ODZcIjogMTY3ODc3MDIsIFwiMTA0ODdcIjogMTY3ODc3MDMsIFwiMTA0ODhcIjogMTY3ODc3MDQsIFwiMTA0ODlcIjogMTY3ODc3MDUsIFwiMTA0OTBcIjogMTY3ODc3MDYsIFwiMTA0OTFcIjogMTY3ODc3MDcsIFwiMTA0OTJcIjogMTY3ODc3MDgsIFwiMTA0OTNcIjogMTY3ODc3MDksIFwiMTA0OTRcIjogMTY3ODc3MTAsIFwiMTA0OTVcIjogMTY3ODc3MTEsIFwiMTIyODlcIjogMTE4OCwgXCIxMjI5MFwiOiAxMTg1LCBcIjEyMzAwXCI6IDExODYsIFwiMTIzMDFcIjogMTE4NywgXCIxMjQ0M1wiOiAxMjQ2LCBcIjEyNDQ0XCI6IDEyNDcsIFwiMTI0NDlcIjogMTE5MSwgXCIxMjQ1MFwiOiAxMjAxLCBcIjEyNDUxXCI6IDExOTIsIFwiMTI0NTJcIjogMTIwMiwgXCIxMjQ1M1wiOiAxMTkzLCBcIjEyNDU0XCI6IDEyMDMsIFwiMTI0NTVcIjogMTE5NCwgXCIxMjQ1NlwiOiAxMjA0LCBcIjEyNDU3XCI6IDExOTUsIFwiMTI0NThcIjogMTIwNSwgXCIxMjQ1OVwiOiAxMjA2LCBcIjEyNDYxXCI6IDEyMDcsIFwiMTI0NjNcIjogMTIwOCwgXCIxMjQ2NVwiOiAxMjA5LCBcIjEyNDY3XCI6IDEyMTAsIFwiMTI0NjlcIjogMTIxMSwgXCIxMjQ3MVwiOiAxMjEyLCBcIjEyNDczXCI6IDEyMTMsIFwiMTI0NzVcIjogMTIxNCwgXCIxMjQ3N1wiOiAxMjE1LCBcIjEyNDc5XCI6IDEyMTYsIFwiMTI0ODFcIjogMTIxNywgXCIxMjQ4M1wiOiAxMTk5LCBcIjEyNDg0XCI6IDEyMTgsIFwiMTI0ODZcIjogMTIxOSwgXCIxMjQ4OFwiOiAxMjIwLCBcIjEyNDkwXCI6IDEyMjEsIFwiMTI0OTFcIjogMTIyMiwgXCIxMjQ5MlwiOiAxMjIzLCBcIjEyNDkzXCI6IDEyMjQsIFwiMTI0OTRcIjogMTIyNSwgXCIxMjQ5NVwiOiAxMjI2LCBcIjEyNDk4XCI6IDEyMjcsIFwiMTI1MDFcIjogMTIyOCwgXCIxMjUwNFwiOiAxMjI5LCBcIjEyNTA3XCI6IDEyMzAsIFwiMTI1MTBcIjogMTIzMSwgXCIxMjUxMVwiOiAxMjMyLCBcIjEyNTEyXCI6IDEyMzMsIFwiMTI1MTNcIjogMTIzNCwgXCIxMjUxNFwiOiAxMjM1LCBcIjEyNTE1XCI6IDExOTYsIFwiMTI1MTZcIjogMTIzNiwgXCIxMjUxN1wiOiAxMTk3LCBcIjEyNTE4XCI6IDEyMzcsIFwiMTI1MTlcIjogMTE5OCwgXCIxMjUyMFwiOiAxMjM4LCBcIjEyNTIxXCI6IDEyMzksIFwiMTI1MjJcIjogMTI0MCwgXCIxMjUyM1wiOiAxMjQxLCBcIjEyNTI0XCI6IDEyNDIsIFwiMTI1MjVcIjogMTI0MywgXCIxMjUyN1wiOiAxMjQ0LCBcIjEyNTMwXCI6IDExOTAsIFwiMTI1MzFcIjogMTI0NSwgXCIxMjUzOVwiOiAxMTg5LCBcIjEyNTQwXCI6IDEyMDAgfTtcblxuZnVuY3Rpb24gbG9va3VwKGspIHtcbiAgICByZXR1cm4gayA/IHsga2V5c3ltOiBrLCBrZXluYW1lOiBrZXluYW1lcyA/IGtleW5hbWVzW2tdIDogayB9IDogdW5kZWZpbmVkO1xufVxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICAgIGZyb21Vbmljb2RlOiBmdW5jdGlvbiAodSkge1xuICAgICAgICB2YXIga2V5c3ltID0gY29kZXBvaW50c1t1XTtcbiAgICAgICAgaWYgKGtleXN5bSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBrZXlzeW0gPSAweDAxMDAwMDAwIHwgdTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG9va3VwKGtleXN5bSk7XG4gICAgfSxcbiAgICBsb29rdXA6IGxvb2t1cFxufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5zdWJzdGl0dXRlQ29kZXBvaW50ID0gc3Vic3RpdHV0ZUNvZGVwb2ludDtcbmV4cG9ydHMuaGFzU2hvcnRjdXRNb2RpZmllciA9IGhhc1Nob3J0Y3V0TW9kaWZpZXI7XG5leHBvcnRzLmhhc0NoYXJNb2RpZmllciA9IGhhc0NoYXJNb2RpZmllcjtcbmV4cG9ydHMuTW9kaWZpZXJTeW5jID0gTW9kaWZpZXJTeW5jO1xuZXhwb3J0cy5nZXRLZXkgPSBnZXRLZXk7XG5leHBvcnRzLmdldEtleXN5bSA9IGdldEtleXN5bTtcbmV4cG9ydHMua2V5c3ltRnJvbUtleUNvZGUgPSBrZXlzeW1Gcm9tS2V5Q29kZTtcbmV4cG9ydHMubm9uQ2hhcmFjdGVyS2V5ID0gbm9uQ2hhcmFjdGVyS2V5O1xuZXhwb3J0cy5RRU1VS2V5RXZlbnREZWNvZGVyID0gUUVNVUtleUV2ZW50RGVjb2RlcjtcbmV4cG9ydHMuVHJhY2tRRU1VS2V5U3RhdGUgPSBUcmFja1FFTVVLZXlTdGF0ZTtcbmV4cG9ydHMuS2V5RXZlbnREZWNvZGVyID0gS2V5RXZlbnREZWNvZGVyO1xuZXhwb3J0cy5WZXJpZnlDaGFyTW9kaWZpZXIgPSBWZXJpZnlDaGFyTW9kaWZpZXI7XG5leHBvcnRzLlRyYWNrS2V5U3RhdGUgPSBUcmFja0tleVN0YXRlO1xuZXhwb3J0cy5Fc2NhcGVNb2RpZmllcnMgPSBFc2NhcGVNb2RpZmllcnM7XG5cbnZhciBfa2V5c3ltID0gcmVxdWlyZShcIi4va2V5c3ltLmpzXCIpO1xuXG52YXIgX2tleXN5bTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9rZXlzeW0pO1xuXG52YXIgX2tleXN5bWRlZiA9IHJlcXVpcmUoXCIuL2tleXN5bWRlZi5qc1wiKTtcblxudmFyIF9rZXlzeW1kZWYyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfa2V5c3ltZGVmKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gc3Vic3RpdHV0ZUNvZGVwb2ludChjcCkge1xuICAgIC8vIEFueSBVbmljb2RlIGNvZGUgcG9pbnRzIHdoaWNoIGRvIG5vdCBoYXZlIGNvcnJlc3BvbmRpbmcga2V5c3ltIGVudHJpZXNcbiAgICAvLyBjYW4gYmUgc3dhcHBlZCBvdXQgZm9yIGFub3RoZXIgY29kZSBwb2ludCBieSBhZGRpbmcgdGhlbSB0byB0aGlzIHRhYmxlXG4gICAgdmFyIHN1YnN0aXR1dGlvbnMgPSB7XG4gICAgICAgIC8vIHtTLHN9IHdpdGggY29tbWEgYmVsb3cgLT4ge1Msc30gd2l0aCBjZWRpbGxhXG4gICAgICAgIDB4MjE4OiAweDE1ZSxcbiAgICAgICAgMHgyMTk6IDB4MTVmLFxuICAgICAgICAvLyB7VCx0fSB3aXRoIGNvbW1hIGJlbG93IC0+IHtULHR9IHdpdGggY2VkaWxsYVxuICAgICAgICAweDIxYTogMHgxNjIsXG4gICAgICAgIDB4MjFiOiAweDE2M1xuICAgIH07XG5cbiAgICB2YXIgc3ViID0gc3Vic3RpdHV0aW9uc1tjcF07XG4gICAgcmV0dXJuIHN1YiA/IHN1YiA6IGNwO1xufVxuXG5mdW5jdGlvbiBpc01hYygpIHtcbiAgICByZXR1cm4gbmF2aWdhdG9yICYmICEhL21hYy9pLmV4ZWMobmF2aWdhdG9yLnBsYXRmb3JtKTtcbn1cbmZ1bmN0aW9uIGlzV2luZG93cygpIHtcbiAgICByZXR1cm4gbmF2aWdhdG9yICYmICEhL3dpbi9pLmV4ZWMobmF2aWdhdG9yLnBsYXRmb3JtKTtcbn1cbmZ1bmN0aW9uIGlzTGludXgoKSB7XG4gICAgcmV0dXJuIG5hdmlnYXRvciAmJiAhIS9saW51eC9pLmV4ZWMobmF2aWdhdG9yLnBsYXRmb3JtKTtcbn1cblxuLy8gUmV0dXJuIHRydWUgaWYgYSBtb2RpZmllciB3aGljaCBpcyBub3QgdGhlIHNwZWNpZmllZCBjaGFyIG1vZGlmaWVyIChhbmQgaXMgbm90IHNoaWZ0KSBpcyBkb3duXG5mdW5jdGlvbiBoYXNTaG9ydGN1dE1vZGlmaWVyKGNoYXJNb2RpZmllciwgY3VycmVudE1vZGlmaWVycykge1xuICAgIHZhciBtb2RzID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIGN1cnJlbnRNb2RpZmllcnMpIHtcbiAgICAgICAgaWYgKHBhcnNlSW50KGtleSkgIT09IF9rZXlzeW0yLmRlZmF1bHQuWEtfU2hpZnRfTCkge1xuICAgICAgICAgICAgbW9kc1trZXldID0gY3VycmVudE1vZGlmaWVyc1trZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHN1bSA9IDA7XG4gICAgZm9yICh2YXIgayBpbiBjdXJyZW50TW9kaWZpZXJzKSB7XG4gICAgICAgIGlmIChtb2RzW2tdKSB7XG4gICAgICAgICAgICArK3N1bTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoaGFzQ2hhck1vZGlmaWVyKGNoYXJNb2RpZmllciwgbW9kcykpIHtcbiAgICAgICAgcmV0dXJuIHN1bSA+IGNoYXJNb2RpZmllci5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHN1bSA+IDA7XG4gICAgfVxufVxuXG4vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNoYXIgbW9kaWZpZXIgaXMgY3VycmVudGx5IGRvd25cbmZ1bmN0aW9uIGhhc0NoYXJNb2RpZmllcihjaGFyTW9kaWZpZXIsIGN1cnJlbnRNb2RpZmllcnMpIHtcbiAgICBpZiAoY2hhck1vZGlmaWVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFyTW9kaWZpZXIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKCFjdXJyZW50TW9kaWZpZXJzW2NoYXJNb2RpZmllcltpXV0pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gSGVscGVyIG9iamVjdCB0cmFja2luZyBtb2RpZmllciBrZXkgc3RhdGVcbi8vIGFuZCBnZW5lcmF0ZXMgZmFrZSBrZXkgZXZlbnRzIHRvIGNvbXBlbnNhdGUgaWYgaXQgZ2V0cyBvdXQgb2Ygc3luY1xuZnVuY3Rpb24gTW9kaWZpZXJTeW5jKGNoYXJNb2RpZmllcikge1xuICAgIGlmICghY2hhck1vZGlmaWVyKSB7XG4gICAgICAgIGlmIChpc01hYygpKSB7XG4gICAgICAgICAgICAvLyBvbiBNYWMsIE9wdGlvbiAoQUtBIEFsdCkgaXMgdXNlZCBhcyBhIGNoYXIgbW9kaWZpZXJcbiAgICAgICAgICAgIGNoYXJNb2RpZmllciA9IFtfa2V5c3ltMi5kZWZhdWx0LlhLX0FsdF9MXTtcbiAgICAgICAgfSBlbHNlIGlmIChpc1dpbmRvd3MoKSkge1xuICAgICAgICAgICAgLy8gb24gV2luZG93cywgQ3RybCtBbHQgaXMgdXNlZCBhcyBhIGNoYXIgbW9kaWZpZXJcbiAgICAgICAgICAgIGNoYXJNb2RpZmllciA9IFtfa2V5c3ltMi5kZWZhdWx0LlhLX0FsdF9MLCBfa2V5c3ltMi5kZWZhdWx0LlhLX0NvbnRyb2xfTF07XG4gICAgICAgIH0gZWxzZSBpZiAoaXNMaW51eCgpKSB7XG4gICAgICAgICAgICAvLyBvbiBMaW51eCwgSVNPIExldmVsIDMgU2hpZnQgKEFsdEdyKSBpcyB1c2VkIGFzIGEgY2hhciBtb2RpZmllclxuICAgICAgICAgICAgY2hhck1vZGlmaWVyID0gW19rZXlzeW0yLmRlZmF1bHQuWEtfSVNPX0xldmVsM19TaGlmdF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaGFyTW9kaWZpZXIgPSBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzdGF0ZSA9IHt9O1xuICAgIHN0YXRlW19rZXlzeW0yLmRlZmF1bHQuWEtfQ29udHJvbF9MXSA9IGZhbHNlO1xuICAgIHN0YXRlW19rZXlzeW0yLmRlZmF1bHQuWEtfQWx0X0xdID0gZmFsc2U7XG4gICAgc3RhdGVbX2tleXN5bTIuZGVmYXVsdC5YS19JU09fTGV2ZWwzX1NoaWZ0XSA9IGZhbHNlO1xuICAgIHN0YXRlW19rZXlzeW0yLmRlZmF1bHQuWEtfU2hpZnRfTF0gPSBmYWxzZTtcbiAgICBzdGF0ZVtfa2V5c3ltMi5kZWZhdWx0LlhLX01ldGFfTF0gPSBmYWxzZTtcblxuICAgIGZ1bmN0aW9uIHN5bmMoZXZ0LCBrZXlzeW0pIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBzeW5jS2V5KGtleXN5bSkge1xuICAgICAgICAgICAgcmV0dXJuIHsga2V5c3ltOiBfa2V5c3ltZGVmMi5kZWZhdWx0Lmxvb2t1cChrZXlzeW0pLCB0eXBlOiBzdGF0ZVtrZXlzeW1dID8gJ2tleWRvd24nIDogJ2tleXVwJyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV2dC5jdHJsS2V5ICE9PSB1bmRlZmluZWQgJiYgZXZ0LmN0cmxLZXkgIT09IHN0YXRlW19rZXlzeW0yLmRlZmF1bHQuWEtfQ29udHJvbF9MXSAmJiBrZXlzeW0gIT09IF9rZXlzeW0yLmRlZmF1bHQuWEtfQ29udHJvbF9MKSB7XG4gICAgICAgICAgICBzdGF0ZVtfa2V5c3ltMi5kZWZhdWx0LlhLX0NvbnRyb2xfTF0gPSBldnQuY3RybEtleTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN5bmNLZXkoX2tleXN5bTIuZGVmYXVsdC5YS19Db250cm9sX0wpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZ0LmFsdEtleSAhPT0gdW5kZWZpbmVkICYmIGV2dC5hbHRLZXkgIT09IHN0YXRlW19rZXlzeW0yLmRlZmF1bHQuWEtfQWx0X0xdICYmIGtleXN5bSAhPT0gX2tleXN5bTIuZGVmYXVsdC5YS19BbHRfTCkge1xuICAgICAgICAgICAgc3RhdGVbX2tleXN5bTIuZGVmYXVsdC5YS19BbHRfTF0gPSBldnQuYWx0S2V5O1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goc3luY0tleShfa2V5c3ltMi5kZWZhdWx0LlhLX0FsdF9MKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2dC5hbHRHcmFwaEtleSAhPT0gdW5kZWZpbmVkICYmIGV2dC5hbHRHcmFwaEtleSAhPT0gc3RhdGVbX2tleXN5bTIuZGVmYXVsdC5YS19JU09fTGV2ZWwzX1NoaWZ0XSAmJiBrZXlzeW0gIT09IF9rZXlzeW0yLmRlZmF1bHQuWEtfSVNPX0xldmVsM19TaGlmdCkge1xuICAgICAgICAgICAgc3RhdGVbX2tleXN5bTIuZGVmYXVsdC5YS19JU09fTGV2ZWwzX1NoaWZ0XSA9IGV2dC5hbHRHcmFwaEtleTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN5bmNLZXkoX2tleXN5bTIuZGVmYXVsdC5YS19JU09fTGV2ZWwzX1NoaWZ0KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2dC5zaGlmdEtleSAhPT0gdW5kZWZpbmVkICYmIGV2dC5zaGlmdEtleSAhPT0gc3RhdGVbX2tleXN5bTIuZGVmYXVsdC5YS19TaGlmdF9MXSAmJiBrZXlzeW0gIT09IF9rZXlzeW0yLmRlZmF1bHQuWEtfU2hpZnRfTCkge1xuICAgICAgICAgICAgc3RhdGVbX2tleXN5bTIuZGVmYXVsdC5YS19TaGlmdF9MXSA9IGV2dC5zaGlmdEtleTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN5bmNLZXkoX2tleXN5bTIuZGVmYXVsdC5YS19TaGlmdF9MKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2dC5tZXRhS2V5ICE9PSB1bmRlZmluZWQgJiYgZXZ0Lm1ldGFLZXkgIT09IHN0YXRlW19rZXlzeW0yLmRlZmF1bHQuWEtfTWV0YV9MXSAmJiBrZXlzeW0gIT09IF9rZXlzeW0yLmRlZmF1bHQuWEtfTWV0YV9MKSB7XG4gICAgICAgICAgICBzdGF0ZVtfa2V5c3ltMi5kZWZhdWx0LlhLX01ldGFfTF0gPSBldnQubWV0YUtleTtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN5bmNLZXkoX2tleXN5bTIuZGVmYXVsdC5YS19NZXRhX0wpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBmdW5jdGlvbiBzeW5jS2V5RXZlbnQoZXZ0LCBkb3duKSB7XG4gICAgICAgIHZhciBvYmogPSBnZXRLZXlzeW0oZXZ0KTtcbiAgICAgICAgdmFyIGtleXN5bSA9IG9iaiA/IG9iai5rZXlzeW0gOiBudWxsO1xuXG4gICAgICAgIC8vIGZpcnN0LCBhcHBseSB0aGUgZXZlbnQgaXRzZWxmLCBpZiByZWxldmFudFxuICAgICAgICBpZiAoa2V5c3ltICE9PSBudWxsICYmIHN0YXRlW2tleXN5bV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RhdGVba2V5c3ltXSA9IGRvd247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN5bmMoZXZ0LCBrZXlzeW0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIC8vIHN5bmMgb24gdGhlIGFwcHJvcHJpYXRlIGtleWJvYXJkIGV2ZW50XG4gICAgICAgIGtleWRvd246IGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgICAgIHJldHVybiBzeW5jS2V5RXZlbnQoZXZ0LCB0cnVlKTtcbiAgICAgICAgfSxcbiAgICAgICAga2V5dXA6IGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgICAgIHJldHVybiBzeW5jS2V5RXZlbnQoZXZ0LCBmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8vIENhbGwgdGhpcyB3aXRoIGEgbm9uLWtleWJvYXJkIGV2ZW50IChzdWNoIGFzIG1vdXNlIGV2ZW50cykgdG8gdXNlIGl0cyBtb2RpZmllciBzdGF0ZSB0byBzeW5jaHJvbml6ZSBhbnl3YXlcbiAgICAgICAgc3luY0FueTogZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgcmV0dXJuIHN5bmMoZXZ0KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBpcyBhIHNob3J0Y3V0IG1vZGlmaWVyIGRvd24/XG4gICAgICAgIGhhc1Nob3J0Y3V0TW9kaWZpZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBoYXNTaG9ydGN1dE1vZGlmaWVyKGNoYXJNb2RpZmllciwgc3RhdGUpO1xuICAgICAgICB9LFxuICAgICAgICAvLyBpZiBhIGNoYXIgbW9kaWZpZXIgaXMgZG93biwgcmV0dXJuIHRoZSBrZXlzIGl0IGNvbnNpc3RzIG9mLCBvdGhlcndpc2UgcmV0dXJuIG51bGxcbiAgICAgICAgYWN0aXZlQ2hhck1vZGlmaWVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFzQ2hhck1vZGlmaWVyKGNoYXJNb2RpZmllciwgc3RhdGUpID8gY2hhck1vZGlmaWVyIDogbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG59XG5cbi8vIEdldCBhIGtleSBJRCBmcm9tIGEga2V5Ym9hcmQgZXZlbnRcbi8vIE1heSBiZSBhIHN0cmluZyBvciBhbiBpbnRlZ2VyIGRlcGVuZGluZyBvbiB0aGUgYXZhaWxhYmxlIHByb3BlcnRpZXNcbmZ1bmN0aW9uIGdldEtleShldnQpIHtcbiAgICBpZiAoJ2tleUNvZGUnIGluIGV2dCAmJiAna2V5JyBpbiBldnQpIHtcbiAgICAgICAgcmV0dXJuIGV2dC5rZXkgKyAnOicgKyBldnQua2V5Q29kZTtcbiAgICB9IGVsc2UgaWYgKCdrZXlDb2RlJyBpbiBldnQpIHtcbiAgICAgICAgcmV0dXJuIGV2dC5rZXlDb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBldnQua2V5O1xuICAgIH1cbn1cblxuLy8gR2V0IHRoZSBtb3N0IHJlbGlhYmxlIGtleXN5bSB2YWx1ZSB3ZSBjYW4gZ2V0IGZyb20gYSBrZXkgZXZlbnRcbi8vIGlmIGNoYXIvY2hhckNvZGUgaXMgYXZhaWxhYmxlLCBwcmVmZXIgdGhvc2UsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8ga2V5L2tleUNvZGUvd2hpY2hcbmZ1bmN0aW9uIGdldEtleXN5bShldnQpIHtcbiAgICB2YXIgY29kZXBvaW50O1xuICAgIGlmIChldnQuY2hhciAmJiBldnQuY2hhci5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29kZXBvaW50ID0gZXZ0LmNoYXIuY2hhckNvZGVBdCgpO1xuICAgIH0gZWxzZSBpZiAoZXZ0LmNoYXJDb2RlKSB7XG4gICAgICAgIGNvZGVwb2ludCA9IGV2dC5jaGFyQ29kZTtcbiAgICB9IGVsc2UgaWYgKGV2dC5rZXlDb2RlICYmIGV2dC50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICAgIC8vIElFMTAgc3RvcmVzIHRoZSBjaGFyIGNvZGUgYXMga2V5Q29kZSwgYW5kIGhhcyBubyBvdGhlciB1c2VmdWwgcHJvcGVydGllc1xuICAgICAgICBjb2RlcG9pbnQgPSBldnQua2V5Q29kZTtcbiAgICB9XG4gICAgaWYgKGNvZGVwb2ludCkge1xuICAgICAgICByZXR1cm4gX2tleXN5bWRlZjIuZGVmYXVsdC5mcm9tVW5pY29kZShzdWJzdGl0dXRlQ29kZXBvaW50KGNvZGVwb2ludCkpO1xuICAgIH1cbiAgICAvLyB3ZSBjb3VsZCBjaGVjayBldnQua2V5IGhlcmUuXG4gICAgLy8gTGVnYWwgdmFsdWVzIGFyZSBkZWZpbmVkIGluIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8ja2V5LXZhbHVlcy1saXN0LFxuICAgIC8vIHNvIHdlIFwianVzdFwiIG5lZWQgdG8gbWFwIHRoZW0gdG8ga2V5c3ltLCBidXQgQUZBSUsgdGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBJRTEwLCB3aGljaCBhbHNvIHByb3ZpZGVzIGV2dC5rZXlcbiAgICAvLyBzbyB3ZSBkb24ndCAqbmVlZCogaXQgeWV0XG4gICAgaWYgKGV2dC5rZXlDb2RlKSB7XG4gICAgICAgIHJldHVybiBfa2V5c3ltZGVmMi5kZWZhdWx0Lmxvb2t1cChrZXlzeW1Gcm9tS2V5Q29kZShldnQua2V5Q29kZSwgZXZ0LnNoaWZ0S2V5KSk7XG4gICAgfVxuICAgIGlmIChldnQud2hpY2gpIHtcbiAgICAgICAgcmV0dXJuIF9rZXlzeW1kZWYyLmRlZmF1bHQubG9va3VwKGtleXN5bUZyb21LZXlDb2RlKGV2dC53aGljaCwgZXZ0LnNoaWZ0S2V5KSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuXG4vLyBHaXZlbiBhIGtleWNvZGUsIHRyeSB0byBwcmVkaWN0IHdoaWNoIGtleXN5bSBpdCBtaWdodCBiZS5cbi8vIElmIHRoZSBrZXljb2RlIGlzIHVua25vd24sIG51bGwgaXMgcmV0dXJuZWQuXG5mdW5jdGlvbiBrZXlzeW1Gcm9tS2V5Q29kZShrZXljb2RlLCBzaGlmdFByZXNzZWQpIHtcbiAgICBpZiAodHlwZW9mIGtleWNvZGUgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyB3b24ndCBiZSBhY2N1cmF0ZSBmb3IgYXplcnR5XG4gICAgaWYgKGtleWNvZGUgPj0gMHgzMCAmJiBrZXljb2RlIDw9IDB4MzkpIHtcbiAgICAgICAgcmV0dXJuIGtleWNvZGU7IC8vIGRpZ2l0XG4gICAgfVxuICAgIGlmIChrZXljb2RlID49IDB4NDEgJiYga2V5Y29kZSA8PSAweDVhKSB7XG4gICAgICAgIC8vIHJlbWFwIHRvIGxvd2VyY2FzZSB1bmxlc3Mgc2hpZnQgaXMgZG93blxuICAgICAgICByZXR1cm4gc2hpZnRQcmVzc2VkID8ga2V5Y29kZSA6IGtleWNvZGUgKyAzMjsgLy8gQS1aXG4gICAgfVxuICAgIGlmIChrZXljb2RlID49IDB4NjAgJiYga2V5Y29kZSA8PSAweDY5KSB7XG4gICAgICAgIHJldHVybiBfa2V5c3ltMi5kZWZhdWx0LlhLX0tQXzAgKyAoa2V5Y29kZSAtIDB4NjApOyAvLyBudW1wYWQgMC05XG4gICAgfVxuXG4gICAgc3dpdGNoIChrZXljb2RlKSB7XG4gICAgICAgIGNhc2UgMHgyMDpcbiAgICAgICAgICAgIHJldHVybiBfa2V5c3ltMi5kZWZhdWx0LlhLX3NwYWNlO1xuICAgICAgICBjYXNlIDB4NmE6XG4gICAgICAgICAgICByZXR1cm4gX2tleXN5bTIuZGVmYXVsdC5YS19LUF9NdWx0aXBseTtcbiAgICAgICAgY2FzZSAweDZiOlxuICAgICAgICAgICAgcmV0dXJuIF9rZXlzeW0yLmRlZmF1bHQuWEtfS1BfQWRkO1xuICAgICAgICBjYXNlIDB4NmM6XG4gICAgICAgICAgICByZXR1cm4gX2tleXN5bTIuZGVmYXVsdC5YS19LUF9TZXBhcmF0b3I7XG4gICAgICAgIGNhc2UgMHg2ZDpcbiAgICAgICAgICAgIHJldHVybiBfa2V5c3ltMi5kZWZhdWx0LlhLX0tQX1N1YnRyYWN0O1xuICAgICAgICBjYXNlIDB4NmU6XG4gICAgICAgICAgICByZXR1cm4gX2tleXN5bTIuZGVmYXVsdC5YS19LUF9EZWNpbWFsO1xuICAgICAgICBjYXNlIDB4NmY6XG4gICAgICAgICAgICByZXR1cm4gX2tleXN5bTIuZGVmYXVsdC5YS19LUF9EaXZpZGU7XG4gICAgICAgIGNhc2UgMHhiYjpcbiAgICAgICAgICAgIHJldHVybiBfa2V5c3ltMi5kZWZhdWx0LlhLX3BsdXM7XG4gICAgICAgIGNhc2UgMHhiYzpcbiAgICAgICAgICAgIHJldHVybiBfa2V5c3ltMi5kZWZhdWx0LlhLX2NvbW1hO1xuICAgICAgICBjYXNlIDB4YmQ6XG4gICAgICAgICAgICByZXR1cm4gX2tleXN5bTIuZGVmYXVsdC5YS19taW51cztcbiAgICAgICAgY2FzZSAweGJlOlxuICAgICAgICAgICAgcmV0dXJuIF9rZXlzeW0yLmRlZmF1bHQuWEtfcGVyaW9kO1xuICAgIH1cblxuICAgIHJldHVybiBub25DaGFyYWN0ZXJLZXkoeyBrZXlDb2RlOiBrZXljb2RlIH0pO1xufVxuXG4vLyBpZiB0aGUga2V5IGlzIGEga25vd24gbm9uLWNoYXJhY3RlciBrZXkgKGFueSBrZXkgd2hpY2ggZG9lc24ndCBnZW5lcmF0ZSBjaGFyYWN0ZXIgZGF0YSlcbi8vIHJldHVybiBpdHMga2V5c3ltIHZhbHVlLiBPdGhlcndpc2UgcmV0dXJuIG51bGxcbmZ1bmN0aW9uIG5vbkNoYXJhY3RlcktleShldnQpIHtcbiAgICAvLyBldnQua2V5IG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgICBpZiAoIWV2dC5rZXlDb2RlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIga2V5Y29kZSA9IGV2dC5rZXlDb2RlO1xuXG4gICAgaWYgKGtleWNvZGUgPj0gMHg3MCAmJiBrZXljb2RlIDw9IDB4ODcpIHtcbiAgICAgICAgcmV0dXJuIF9rZXlzeW0yLmRlZmF1bHQuWEtfRjEgKyBrZXljb2RlIC0gMHg3MDsgLy8gRjEtRjI0XG4gICAgfVxuICAgIHN3aXRjaCAoa2V5Y29kZSkge1xuXG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICAgIHJldHVybiBfa2V5c3ltMi5kZWZhdWx0LlhLX0JhY2tTcGFjZTtcbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgIHJldHVybiBfa2V5c3ltMi5kZWZhdWx0LlhLX1JldHVybjtcblxuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICByZXR1cm4gX2tleXN5bTIuZGVmYXVsdC5YS19UYWI7XG5cbiAgICAgICAgY2FzZSAyNzpcbiAgICAgICAgICAgIHJldHVybiBfa2V5c3ltMi5kZWZhdWx0LlhLX0VzY2FwZTtcbiAgICAgICAgY2FzZSA0NjpcbiAgICAgICAgICAgIHJldHVybiBfa2V5c3ltMi5kZWZhdWx0LlhLX0RlbGV0ZTtcblxuICAgICAgICBjYXNlIDM2OlxuICAgICAgICAgICAgcmV0dXJuIF9rZXlzeW0yLmRlZmF1bHQuWEtfSG9tZTtcbiAgICAgICAgY2FzZSAzNTpcbiAgICAgICAgICAgIHJldHVybiBfa2V5c3ltMi5kZWZhdWx0LlhLX0VuZDtcbiAgICAgICAgY2FzZSAzMzpcbiAgICAgICAgICAgIHJldHVybiBfa2V5c3ltMi5kZWZhdWx0LlhLX1BhZ2VfVXA7XG4gICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgICByZXR1cm4gX2tleXN5bTIuZGVmYXVsdC5YS19QYWdlX0Rvd247XG4gICAgICAgIGNhc2UgNDU6XG4gICAgICAgICAgICByZXR1cm4gX2tleXN5bTIuZGVmYXVsdC5YS19JbnNlcnQ7XG5cbiAgICAgICAgY2FzZSAzNzpcbiAgICAgICAgICAgIHJldHVybiBfa2V5c3ltMi5kZWZhdWx0LlhLX0xlZnQ7XG4gICAgICAgIGNhc2UgMzg6XG4gICAgICAgICAgICByZXR1cm4gX2tleXN5bTIuZGVmYXVsdC5YS19VcDtcbiAgICAgICAgY2FzZSAzOTpcbiAgICAgICAgICAgIHJldHVybiBfa2V5c3ltMi5kZWZhdWx0LlhLX1JpZ2h0O1xuICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgICAgcmV0dXJuIF9rZXlzeW0yLmRlZmF1bHQuWEtfRG93bjtcblxuICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgcmV0dXJuIF9rZXlzeW0yLmRlZmF1bHQuWEtfU2hpZnRfTDtcbiAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgIHJldHVybiBfa2V5c3ltMi5kZWZhdWx0LlhLX0NvbnRyb2xfTDtcbiAgICAgICAgY2FzZSAxODpcbiAgICAgICAgICAgIHJldHVybiBfa2V5c3ltMi5kZWZhdWx0LlhLX0FsdF9MOyAvLyBhbHNvOiBPcHRpb24ta2V5IG9uIE1hY1xuXG4gICAgICAgIGNhc2UgMjI0OlxuICAgICAgICAgICAgcmV0dXJuIF9rZXlzeW0yLmRlZmF1bHQuWEtfTWV0YV9MO1xuICAgICAgICBjYXNlIDIyNTpcbiAgICAgICAgICAgIHJldHVybiBfa2V5c3ltMi5kZWZhdWx0LlhLX0lTT19MZXZlbDNfU2hpZnQ7IC8vIEFsdEdyXG4gICAgICAgIGNhc2UgOTE6XG4gICAgICAgICAgICByZXR1cm4gX2tleXN5bTIuZGVmYXVsdC5YS19TdXBlcl9MOyAvLyBhbHNvOiBXaW5kb3dzLWtleVxuICAgICAgICBjYXNlIDkyOlxuICAgICAgICAgICAgcmV0dXJuIF9rZXlzeW0yLmRlZmF1bHQuWEtfU3VwZXJfUjsgLy8gYWxzbzogV2luZG93cy1rZXlcbiAgICAgICAgY2FzZSA5MzpcbiAgICAgICAgICAgIHJldHVybiBfa2V5c3ltMi5kZWZhdWx0LlhLX01lbnU7IC8vIGFsc286IFdpbmRvd3MtTWVudSwgQ29tbWFuZCBvbiBNYWNcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gUUVNVUtleUV2ZW50RGVjb2Rlcihtb2RpZmllclN0YXRlLCBuZXh0KSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBmdW5jdGlvbiBzZW5kQWxsKGV2dHMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBuZXh0KGV2dHNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG51bVBhZENvZGVzID0gW1wiTnVtcGFkMFwiLCBcIk51bXBhZDFcIiwgXCJOdW1wYWQyXCIsIFwiTnVtcGFkM1wiLCBcIk51bXBhZDRcIiwgXCJOdW1wYWQ1XCIsIFwiTnVtcGFkNlwiLCBcIk51bXBhZDdcIiwgXCJOdW1wYWQ4XCIsIFwiTnVtcGFkOVwiLCBcIk51bXBhZERlY2ltYWxcIl07XG5cbiAgICB2YXIgbnVtTG9ja09uS2V5U3ltcyA9IHtcbiAgICAgICAgXCJOdW1wYWQwXCI6IDB4ZmZiMCwgXCJOdW1wYWQxXCI6IDB4ZmZiMSwgXCJOdW1wYWQyXCI6IDB4ZmZiMixcbiAgICAgICAgXCJOdW1wYWQzXCI6IDB4ZmZiMywgXCJOdW1wYWQ0XCI6IDB4ZmZiNCwgXCJOdW1wYWQ1XCI6IDB4ZmZiNSxcbiAgICAgICAgXCJOdW1wYWQ2XCI6IDB4ZmZiNiwgXCJOdW1wYWQ3XCI6IDB4ZmZiNywgXCJOdW1wYWQ4XCI6IDB4ZmZiOCxcbiAgICAgICAgXCJOdW1wYWQ5XCI6IDB4ZmZiOSwgXCJOdW1wYWREZWNpbWFsXCI6IDB4ZmZhY1xuICAgIH07XG5cbiAgICB2YXIgbnVtTG9ja09uS2V5Q29kZXMgPSBbOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwOCwgMTEwXTtcblxuICAgIGZ1bmN0aW9uIGlzTnVtUGFkTXVsdGlLZXkoZXZ0KSB7XG4gICAgICAgIHJldHVybiBudW1QYWRDb2Rlcy5pbmRleE9mKGV2dC5jb2RlKSAhPT0gLTE7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0TnVtUGFkS2V5U3ltKGV2dCkge1xuICAgICAgICBpZiAobnVtTG9ja09uS2V5Q29kZXMuaW5kZXhPZihldnQua2V5Q29kZSkgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtTG9ja09uS2V5U3ltc1tldnQuY29kZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJvY2VzcyhldnQsIHR5cGUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHsgdHlwZTogdHlwZSB9O1xuICAgICAgICByZXN1bHQuY29kZSA9IGV2dC5jb2RlO1xuICAgICAgICByZXN1bHQua2V5c3ltID0gMDtcblxuICAgICAgICBpZiAoaXNOdW1QYWRNdWx0aUtleShldnQpKSB7XG4gICAgICAgICAgICByZXN1bHQua2V5c3ltID0gZ2V0TnVtUGFkS2V5U3ltKGV2dCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaGFzTW9kaWZpZXIgPSBtb2RpZmllclN0YXRlLmhhc1Nob3J0Y3V0TW9kaWZpZXIoKSB8fCAhIW1vZGlmaWVyU3RhdGUuYWN0aXZlQ2hhck1vZGlmaWVyKCk7XG4gICAgICAgIHZhciBpc1NoaWZ0ID0gZXZ0LmtleUNvZGUgPT09IDB4MTAgfHwgZXZ0LmtleSA9PT0gJ1NoaWZ0JztcblxuICAgICAgICB2YXIgc3VwcHJlc3MgPSAhaXNTaGlmdCAmJiAodHlwZSAhPT0gJ2tleWRvd24nIHx8IG1vZGlmaWVyU3RhdGUuaGFzU2hvcnRjdXRNb2RpZmllcigpIHx8ICEhbm9uQ2hhcmFjdGVyS2V5KGV2dCkpO1xuXG4gICAgICAgIG5leHQocmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHN1cHByZXNzO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBrZXlkb3duOiBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgICAgICBzZW5kQWxsKG1vZGlmaWVyU3RhdGUua2V5ZG93bihldnQpKTtcbiAgICAgICAgICAgIHJldHVybiBwcm9jZXNzKGV2dCwgJ2tleWRvd24nKTtcbiAgICAgICAgfSxcbiAgICAgICAga2V5cHJlc3M6IGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBrZXl1cDogZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgc2VuZEFsbChtb2RpZmllclN0YXRlLmtleXVwKGV2dCkpO1xuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MoZXZ0LCAna2V5dXAnKTtcbiAgICAgICAgfSxcbiAgICAgICAgc3luY01vZGlmaWVyczogZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgc2VuZEFsbChtb2RpZmllclN0YXRlLnN5bmNBbnkoZXZ0KSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGVhc2VBbGw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG5leHQoeyB0eXBlOiAncmVsZWFzZWFsbCcgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufTtcblxuZnVuY3Rpb24gVHJhY2tRRU1VS2V5U3RhdGUobmV4dCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgdmFyIHN0YXRlID0gW107XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICB2YXIgbGFzdCA9IHN0YXRlLmxlbmd0aCAhPT0gMCA/IHN0YXRlW3N0YXRlLmxlbmd0aCAtIDFdIDogbnVsbDtcblxuICAgICAgICBzd2l0Y2ggKGV2dC50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdrZXlkb3duJzpcblxuICAgICAgICAgICAgICAgIGlmICghbGFzdCB8fCBsYXN0LmNvZGUgIT09IGV2dC5jb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3QgPSB7IGNvZGU6IGV2dC5jb2RlIH07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA+IDAgJiYgc3RhdGVbc3RhdGUubGVuZ3RoIC0gMV0uY29kZSA9PSAnQ29udHJvbExlZnQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZ0LmNvZGUgIT09ICdBbHRSaWdodCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KHsgY29kZTogJ0NvbnRyb2xMZWZ0JywgdHlwZTogJ2tleWRvd24nLCBrZXlzeW06IDAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnB1c2gobGFzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChldnQuY29kZSAhPT0gJ0NvbnRyb2xMZWZ0Jykge1xuICAgICAgICAgICAgICAgICAgICBuZXh0KGV2dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdrZXl1cCc6XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBpZHggPSBudWxsO1xuICAgICAgICAgICAgICAgIC8vIGRvIHdlIGhhdmUgYSBtYXRjaGluZyBrZXkgdHJhY2tlZCBhcyBiZWluZyBkb3duP1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpICE9PSBzdGF0ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVbaV0uY29kZSA9PT0gZXZ0LmNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjb3VsZG4ndCBmaW5kIGEgbWF0Y2ggKGl0IGhhcHBlbnMpLCBhc3N1bWUgaXQgd2FzIHRoZSBsYXN0IGtleSBwcmVzc2VkXG4gICAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXZ0LmNvZGUgPT09ICdDb250cm9sTGVmdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZHggPSBzdGF0ZS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHN0YXRlLnNwbGljZShpZHgsIDEpO1xuICAgICAgICAgICAgICAgIG5leHQoZXZ0KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3JlbGVhc2VhbGwnOlxuICAgICAgICAgICAgICAgIC8qIGpzaGludCBzaGFkb3c6IHRydWUgKi9cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQoeyBjb2RlOiBzdGF0ZVtpXS5jb2RlLCBrZXlzeW06IDAsIHR5cGU6ICdrZXl1cCcgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qIGpzaGludCBzaGFkb3c6IGZhbHNlICovXG4gICAgICAgICAgICAgICAgc3RhdGUgPSBbXTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuXG4vLyBUYWtlcyBhIERPTSBrZXlib2FyZCBldmVudCBhbmQ6XG4vLyAtIGRldGVybWluZXMgd2hpY2gga2V5c3ltIGl0IHJlcHJlc2VudHNcbi8vIC0gZGV0ZXJtaW5lcyBhIGtleUlkICBpZGVudGlmeWluZyB0aGUga2V5IHRoYXQgd2FzIHByZXNzZWQgKGNvcnJlc3BvbmRpbmcgdG8gdGhlIGtleS9rZXlDb2RlIHByb3BlcnRpZXMgb24gdGhlIERPTSBldmVudClcbi8vIC0gc3ludGhlc2l6ZXMgZXZlbnRzIHRvIHN5bmNocm9uaXplIG1vZGlmaWVyIGtleSBzdGF0ZSBiZXR3ZWVuIHdoaWNoIG1vZGlmaWVycyBhcmUgYWN0dWFsbHkgZG93biwgYW5kIHdoaWNoIHdlIHRob3VnaHQgd2VyZSBkb3duXG4vLyAtIG1hcmtzIGVhY2ggZXZlbnQgd2l0aCBhbiAnZXNjYXBlJyBwcm9wZXJ0eSBpZiBhIG1vZGlmaWVyIHdhcyBkb3duIHdoaWNoIHNob3VsZCBiZSBcImVzY2FwZWRcIlxuLy8gLSBnZW5lcmF0ZXMgYSBcInN0YWxsXCIgZXZlbnQgaW4gY2FzZXMgd2hlcmUgaXQgbWlnaHQgYmUgbmVjZXNzYXJ5IHRvIHdhaXQgYW5kIHNlZSBpZiBhIGtleXByZXNzIGV2ZW50IGZvbGxvd3MgYSBrZXlkb3duXG4vLyBUaGlzIGluZm9ybWF0aW9uIGlzIGNvbGxlY3RlZCBpbnRvIGFuIG9iamVjdCB3aGljaCBpcyBwYXNzZWQgdG8gdGhlIG5leHQoKSBmdW5jdGlvbi4gKG9uZSBjYWxsIHBlciBldmVudClcbmZ1bmN0aW9uIEtleUV2ZW50RGVjb2Rlcihtb2RpZmllclN0YXRlLCBuZXh0KSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBmdW5jdGlvbiBzZW5kQWxsKGV2dHMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBuZXh0KGV2dHNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByb2Nlc3MoZXZ0LCB0eXBlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB7IHR5cGU6IHR5cGUgfTtcbiAgICAgICAgdmFyIGtleUlkID0gZ2V0S2V5KGV2dCk7XG4gICAgICAgIGlmIChrZXlJZCkge1xuICAgICAgICAgICAgcmVzdWx0LmtleUlkID0ga2V5SWQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIga2V5c3ltID0gZ2V0S2V5c3ltKGV2dCk7XG5cbiAgICAgICAgdmFyIGhhc01vZGlmaWVyID0gbW9kaWZpZXJTdGF0ZS5oYXNTaG9ydGN1dE1vZGlmaWVyKCkgfHwgISFtb2RpZmllclN0YXRlLmFjdGl2ZUNoYXJNb2RpZmllcigpO1xuICAgICAgICAvLyBJcyB0aGlzIGEgY2FzZSB3aGVyZSB3ZSBoYXZlIHRvIGRlY2lkZSBvbiB0aGUga2V5c3ltIHJpZ2h0IGF3YXksIHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIHRoZSBrZXlwcmVzcz9cbiAgICAgICAgLy8gXCJzcGVjaWFsXCIga2V5cyBsaWtlIGVudGVyLCB0YWIgb3IgYmFja3NwYWNlIGRvbid0IHNlbmQga2V5cHJlc3MgZXZlbnRzLFxuICAgICAgICAvLyBhbmQgc29tZSBicm93c2VycyBkb24ndCBzZW5kIGtleXByZXNzZXMgYXQgYWxsIGlmIGEgbW9kaWZpZXIgaXMgZG93blxuICAgICAgICBpZiAoa2V5c3ltICYmICh0eXBlICE9PSAna2V5ZG93bicgfHwgbm9uQ2hhcmFjdGVyS2V5KGV2dCkgfHwgaGFzTW9kaWZpZXIpKSB7XG4gICAgICAgICAgICByZXN1bHQua2V5c3ltID0ga2V5c3ltO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGlzU2hpZnQgPSBldnQua2V5Q29kZSA9PT0gMHgxMCB8fCBldnQua2V5ID09PSAnU2hpZnQnO1xuXG4gICAgICAgIC8vIFNob3VsZCB3ZSBwcmV2ZW50IHRoZSBicm93c2VyIGZyb20gaGFuZGxpbmcgdGhlIGV2ZW50P1xuICAgICAgICAvLyBEb2luZyBzbyBvbiBhIGtleWRvd24gKGluIG1vc3QgYnJvd3NlcnMpIHByZXZlbnRzIGtleXByZXNzIGZyb20gYmVpbmcgZ2VuZXJhdGVkXG4gICAgICAgIC8vIHNvIG9ubHkgZG8gdGhhdCBpZiB3ZSBoYXZlIHRvLlxuICAgICAgICB2YXIgc3VwcHJlc3MgPSAhaXNTaGlmdCAmJiAodHlwZSAhPT0gJ2tleWRvd24nIHx8IG1vZGlmaWVyU3RhdGUuaGFzU2hvcnRjdXRNb2RpZmllcigpIHx8ICEhbm9uQ2hhcmFjdGVyS2V5KGV2dCkpO1xuXG4gICAgICAgIC8vIElmIGEgY2hhciBtb2RpZmllciBpcyBkb3duIG9uIGEga2V5ZG93biwgd2UgbmVlZCB0byBpbnNlcnQgYSBzdGFsbCxcbiAgICAgICAgLy8gc28gVmVyaWZ5Q2hhck1vZGlmaWVyIGtub3dzIHRvIHdhaXQgYW5kIHNlZSBpZiBhIGtleXByZXNzIGlzIGNvbW5pZ1xuICAgICAgICB2YXIgc3RhbGwgPSB0eXBlID09PSAna2V5ZG93bicgJiYgbW9kaWZpZXJTdGF0ZS5hY3RpdmVDaGFyTW9kaWZpZXIoKSAmJiAhbm9uQ2hhcmFjdGVyS2V5KGV2dCk7XG5cbiAgICAgICAgLy8gaWYgYSBjaGFyIG1vZGlmaWVyIGlzIHByZXNzZWQsIGdldCB0aGUga2V5cyBpdCBjb25zaXN0cyBvZiAob24gV2luZG93cywgQWx0R3IgaXMgZXF1aXZhbGVudCB0byBDdHJsK0FsdClcbiAgICAgICAgdmFyIGFjdGl2ZSA9IG1vZGlmaWVyU3RhdGUuYWN0aXZlQ2hhck1vZGlmaWVyKCk7XG5cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGNoYXIgbW9kaWZpZXIgZG93biwgYW5kIHdlJ3JlIGFibGUgdG8gZGV0ZXJtaW5lIGEga2V5c3ltIHJlbGlhYmx5XG4gICAgICAgIC8vIHRoZW4gKGEpIHdlIGtub3cgdG8gdHJlYXQgdGhlIG1vZGlmaWVyIGFzIGEgY2hhciBtb2RpZmllcixcbiAgICAgICAgLy8gYW5kIChiKSB3ZSdsbCBoYXZlIHRvIFwiZXNjYXBlXCIgdGhlIG1vZGlmaWVyIHRvIHVuZG8gdGhlIG1vZGlmaWVyIHdoZW4gc2VuZGluZyB0aGUgY2hhci5cbiAgICAgICAgaWYgKGFjdGl2ZSAmJiBrZXlzeW0pIHtcbiAgICAgICAgICAgIHZhciBpc0NoYXJNb2RpZmllciA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhY3RpdmUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlW2ldID09PSBrZXlzeW0ua2V5c3ltKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzQ2hhck1vZGlmaWVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2tleXByZXNzJyAmJiAhaXNDaGFyTW9kaWZpZXIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZXNjYXBlID0gbW9kaWZpZXJTdGF0ZS5hY3RpdmVDaGFyTW9kaWZpZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdGFsbCkge1xuICAgICAgICAgICAgLy8gaW5zZXJ0IGEgZmFrZSBcInN0YWxsXCIgZXZlbnRcbiAgICAgICAgICAgIG5leHQoeyB0eXBlOiAnc3RhbGwnIH0pO1xuICAgICAgICB9XG4gICAgICAgIG5leHQocmVzdWx0KTtcblxuICAgICAgICByZXR1cm4gc3VwcHJlc3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAga2V5ZG93bjogZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgc2VuZEFsbChtb2RpZmllclN0YXRlLmtleWRvd24oZXZ0KSk7XG4gICAgICAgICAgICByZXR1cm4gcHJvY2VzcyhldnQsICdrZXlkb3duJyk7XG4gICAgICAgIH0sXG4gICAgICAgIGtleXByZXNzOiBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvY2VzcyhldnQsICdrZXlwcmVzcycpO1xuICAgICAgICB9LFxuICAgICAgICBrZXl1cDogZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgc2VuZEFsbChtb2RpZmllclN0YXRlLmtleXVwKGV2dCkpO1xuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MoZXZ0LCAna2V5dXAnKTtcbiAgICAgICAgfSxcbiAgICAgICAgc3luY01vZGlmaWVyczogZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgc2VuZEFsbChtb2RpZmllclN0YXRlLnN5bmNBbnkoZXZ0KSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGVhc2VBbGw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIG5leHQoeyB0eXBlOiAncmVsZWFzZWFsbCcgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufTtcblxuLy8gQ29tYmluZXMga2V5ZG93biBhbmQga2V5cHJlc3MgZXZlbnRzIHdoZXJlIG5lY2Vzc2FyeSB0byBoYW5kbGUgY2hhciBtb2RpZmllcnMuXG4vLyBPbiBzb21lIE9TJ2VzLCBhIGNoYXIgbW9kaWZpZXIgaXMgc29tZXRpbWVzIHVzZWQgYXMgYSBzaG9ydGN1dCBtb2RpZmllci5cbi8vIEZvciBleGFtcGxlLCBvbiBXaW5kb3dzLCBBbHRHciBpcyBzeW5vbnltb3VzIHdpdGggQ3RybC1BbHQuIE9uIGEgRGFuaXNoIGtleWJvYXJkIGxheW91dCwgQWx0R3ItMiB5aWVsZHMgYSBALCBidXQgQ3RybC1BbHQtRCBkb2VzIG5vdGhpbmdcbi8vIHNvIHdoZW4gdXNlZCB3aXRoIHRoZSAnMicga2V5LCBDdHJsLUFsdCBjb3VudHMgYXMgYSBjaGFyIG1vZGlmaWVyIChhbmQgc2hvdWxkIGJlIGVzY2FwZWQpLCBidXQgd2hlbiB1c2VkIHdpdGggJ0QnLCBpdCBkb2VzIG5vdC5cbi8vIFRoZSBvbmx5IHdheSB3ZSBjYW4gZGlzdGluZ3Vpc2ggdGhlc2UgY2FzZXMgaXMgdG8gd2FpdCBhbmQgc2VlIGlmIGEga2V5cHJlc3MgZXZlbnQgYXJyaXZlc1xuLy8gV2hlbiB3ZSByZWNlaXZlIGEgXCJzdGFsbFwiIGV2ZW50LCB3YWl0IGEgZmV3IG1zIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBuZXh0IGtleWRvd24uIElmIGEga2V5cHJlc3MgaGFzIGFsc28gYXJyaXZlZCwgbWVyZ2UgdGhlIHR3b1xuZnVuY3Rpb24gVmVyaWZ5Q2hhck1vZGlmaWVyKG5leHQpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciBxdWV1ZSA9IFtdO1xuICAgIHZhciB0aW1lciA9IG51bGw7XG4gICAgZnVuY3Rpb24gcHJvY2VzcygpIHtcbiAgICAgICAgaWYgKHRpbWVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGVsYXlQcm9jZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgICAgIHByb2Nlc3MoKTtcbiAgICAgICAgfTtcblxuICAgICAgICB3aGlsZSAocXVldWUubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB2YXIgY3VyID0gcXVldWVbMF07XG4gICAgICAgICAgICBxdWV1ZSA9IHF1ZXVlLnNwbGljZSgxKTtcbiAgICAgICAgICAgIHN3aXRjaCAoY3VyLnR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdzdGFsbCc6XG4gICAgICAgICAgICAgICAgICAgIC8vIGluc2VydCBhIGRlbGF5IGJlZm9yZSBwcm9jZXNzaW5nIGF2YWlsYWJsZSBldmVudHMuXG4gICAgICAgICAgICAgICAgICAgIC8qIGpzaGludCBsb29wZnVuYzogdHJ1ZSAqL1xuICAgICAgICAgICAgICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoZGVsYXlQcm9jZXNzLCA1KTtcbiAgICAgICAgICAgICAgICAgICAgLyoganNoaW50IGxvb3BmdW5jOiBmYWxzZSAqL1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgY2FzZSAna2V5ZG93bic6XG4gICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZSBuZXh0IGVsZW1lbnQgYSBrZXlwcmVzcz8gVGhlbiB3ZSBzaG91bGQgbWVyZ2UgdGhlIHR3b1xuICAgICAgICAgICAgICAgICAgICBpZiAocXVldWUubGVuZ3RoICE9PSAwICYmIHF1ZXVlWzBdLnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggc2VuZHMga2V5cHJlc3MgZXZlbiB3aGVuIG5vIGNoYXIgaXMgZ2VuZXJhdGVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28sIGlmIGtleXByZXNzIGtleXN5bSBpcyB0aGUgc2FtZSBhcyB3ZSdkIGhhdmUgZ3Vlc3NlZCBmcm9tIGtleWRvd24sXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbW9kaWZpZXIgZGlkbid0IGhhdmUgYW55IGVmZmVjdCwgYW5kIHNob3VsZCBub3QgYmUgZXNjYXBlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlWzBdLmVzY2FwZSAmJiAoIWN1ci5rZXlzeW0gfHwgY3VyLmtleXN5bS5rZXlzeW0gIT09IHF1ZXVlWzBdLmtleXN5bS5rZXlzeW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyLmVzY2FwZSA9IHF1ZXVlWzBdLmVzY2FwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ci5rZXlzeW0gPSBxdWV1ZVswXS5rZXlzeW07XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSA9IHF1ZXVlLnNwbGljZSgxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gc3dhbGxvdyBzdGFsbCBldmVudHMsIGFuZCBwYXNzIGFsbCBvdGhlcnMgdG8gdGhlIG5leHQgc3RhZ2VcbiAgICAgICAgICAgIGlmIChjdXIudHlwZSAhPT0gJ3N0YWxsJykge1xuICAgICAgICAgICAgICAgIG5leHQoY3VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICBxdWV1ZS5wdXNoKGV2dCk7XG4gICAgICAgIHByb2Nlc3MoKTtcbiAgICB9O1xufTtcblxuLy8gS2VlcHMgdHJhY2sgb2Ygd2hpY2gga2V5cyB3ZSAoYW5kIHRoZSBzZXJ2ZXIpIGJlbGlldmUgYXJlIGRvd25cbi8vIFdoZW4gYSBrZXl1cCBpcyByZWNlaXZlZCwgbWF0Y2ggaXQgYWdhaW5zdCB0aGlzIGxpc3QsIHRvIGRldGVybWluZSB0aGUgY29ycmVzcG9uZGluZyBrZXlzeW0ocylcbi8vIGluIHNvbWUgY2FzZXMsIGEgc2luZ2xlIGtleSBtYXkgcHJvZHVjZSBtdWx0aXBsZSBrZXlzeW1zLCBzbyB0aGUgY29ycmVzcG9uZGluZyBrZXl1cCBldmVudCBtdXN0IHJlbGVhc2UgYWxsIG9mIHRoZXNlIGNoYXJzXG4vLyBrZXkgcmVwZWF0IGV2ZW50cyBzaG91bGQgYmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgZW50cnkuXG4vLyBCZWNhdXNlIHdlIGNhbid0IGFsd2F5cyBpZGVudGlmeSB3aGljaCBlbnRyeSBhIGtleWRvd24gb3Iga2V5dXAgZXZlbnQgY29ycmVzcG9uZHMgdG8sIHdlIHNvbWV0aW1lcyBoYXZlIHRvIGd1ZXNzXG5mdW5jdGlvbiBUcmFja0tleVN0YXRlKG5leHQpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciBzdGF0ZSA9IFtdO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgdmFyIGxhc3QgPSBzdGF0ZS5sZW5ndGggIT09IDAgPyBzdGF0ZVtzdGF0ZS5sZW5ndGggLSAxXSA6IG51bGw7XG5cbiAgICAgICAgc3dpdGNoIChldnQudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAna2V5ZG93bic6XG4gICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGEgbmV3IGVudHJ5IGlmIGxhc3Qgc2VlbiBrZXkgd2FzIGRpZmZlcmVudC5cbiAgICAgICAgICAgICAgICBpZiAoIWxhc3QgfHwgIWV2dC5rZXlJZCB8fCBsYXN0LmtleUlkICE9PSBldnQua2V5SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdCA9IHsga2V5SWQ6IGV2dC5rZXlJZCwga2V5c3ltczoge30gfTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUucHVzaChsYXN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGV2dC5rZXlzeW0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGxhc3QgZXZlbnQgY29udGFpbnMgdGhpcyBrZXlzeW0gKGEgc2luZ2xlIFwibG9naWNhbFwiIGtleWV2ZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbiBjYXVzZSBtdWx0aXBsZSBrZXkgZXZlbnRzIHRvIGJlIHNlbnQgdG8gdGhlIFZOQyBzZXJ2ZXIpXG4gICAgICAgICAgICAgICAgICAgIGxhc3Qua2V5c3ltc1tldnQua2V5c3ltLmtleXN5bV0gPSBldnQua2V5c3ltO1xuICAgICAgICAgICAgICAgICAgICBsYXN0Lmlnbm9yZUtleVByZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dChldnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2tleXByZXNzJzpcbiAgICAgICAgICAgICAgICBpZiAoIWxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFzdCA9IHsga2V5SWQ6IGV2dC5rZXlJZCwga2V5c3ltczoge30gfTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUucHVzaChsYXN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFldnQua2V5c3ltKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdrZXlwcmVzcyB3aXRoIG5vIGtleXN5bTonLCBldnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElmIHdlIGRpZG4ndCBleHBlY3QgYSBrZXlwcmVzcywgYW5kIGFscmVhZHkgc2VudCBhIGtleWRvd24gdG8gdGhlIFZOQyBzZXJ2ZXJcbiAgICAgICAgICAgICAgICAvLyBiYXNlZCBvbiB0aGUga2V5ZG93biwgbWFrZSBzdXJlIHRvIHNraXAgdGhpcyBldmVudC5cbiAgICAgICAgICAgICAgICBpZiAoZXZ0LmtleXN5bSAmJiAhbGFzdC5pZ25vcmVLZXlQcmVzcykge1xuICAgICAgICAgICAgICAgICAgICBsYXN0LmtleXN5bXNbZXZ0LmtleXN5bS5rZXlzeW1dID0gZXZ0LmtleXN5bTtcbiAgICAgICAgICAgICAgICAgICAgZXZ0LnR5cGUgPSAna2V5ZG93bic7XG4gICAgICAgICAgICAgICAgICAgIG5leHQoZXZ0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdrZXl1cCc6XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBpZHggPSBudWxsO1xuICAgICAgICAgICAgICAgIC8vIGRvIHdlIGhhdmUgYSBtYXRjaGluZyBrZXkgdHJhY2tlZCBhcyBiZWluZyBkb3duP1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpICE9PSBzdGF0ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVbaV0ua2V5SWQgPT09IGV2dC5rZXlJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGlmIHdlIGNvdWxkbid0IGZpbmQgYSBtYXRjaCAoaXQgaGFwcGVucyksIGFzc3VtZSBpdCB3YXMgdGhlIGxhc3Qga2V5IHByZXNzZWRcbiAgICAgICAgICAgICAgICBpZiAoaWR4ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlkeCA9IHN0YXRlLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBzdGF0ZS5zcGxpY2UoaWR4LCAxKVswXTtcbiAgICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBrZXlzeW0gdHJhY2tlZCBieSB0aGlzIGtleSBlbnRyeSwgY2xvbmUgdGhlIGN1cnJlbnQgZXZlbnQgYW5kIG92ZXJyaWRlIHRoZSBrZXlzeW1cbiAgICAgICAgICAgICAgICB2YXIgY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIENsb25lKCkge31cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENsb25lLnByb3RvdHlwZSA9IG9iajtyZXR1cm4gbmV3IENsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSgpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBpdGVtLmtleXN5bXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG91dCA9IGNsb25lKGV2dCk7XG4gICAgICAgICAgICAgICAgICAgIG91dC5rZXlzeW0gPSBpdGVtLmtleXN5bXNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dChvdXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3JlbGVhc2VhbGwnOlxuICAgICAgICAgICAgICAgIC8qIGpzaGludCBzaGFkb3c6IHRydWUgKi9cbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzdGF0ZVtpXS5rZXlzeW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5c3ltID0gc3RhdGVbaV0ua2V5c3ltc1trZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCh7IGtleUlkOiAwLCBrZXlzeW06IGtleXN5bSwgdHlwZTogJ2tleXVwJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvKiBqc2hpbnQgc2hhZG93OiBmYWxzZSAqL1xuICAgICAgICAgICAgICAgIHN0YXRlID0gW107XG4gICAgICAgIH1cbiAgICB9O1xufTtcblxuLy8gSGFuZGxlcyBcImVzY2FwaW5nXCIgb2YgbW9kaWZpZXJzOiBpZiBhIGNoYXIgbW9kaWZpZXIgaXMgdXNlZCB0byBwcm9kdWNlIGEga2V5c3ltIChzdWNoIGFzIEFsdEdyLTIgdG8gZ2VuZXJhdGUgYW4gQCksXG4vLyB0aGVuIHRoZSBtb2RpZmllciBtdXN0IGJlIFwidW5kb25lXCIgYmVmb3JlIHNlbmRpbmcgdGhlIEAsIGFuZCBcInJlZG9uZVwiIGFmdGVyd2FyZHMuXG5mdW5jdGlvbiBFc2NhcGVNb2RpZmllcnMobmV4dCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgaWYgKGV2dC50eXBlICE9PSAna2V5ZG93bicgfHwgZXZ0LmVzY2FwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBuZXh0KGV2dCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gdW5kbyBtb2RpZmllcnNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldnQuZXNjYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBuZXh0KHsgdHlwZTogJ2tleXVwJywga2V5SWQ6IDAsIGtleXN5bTogX2tleXN5bWRlZjIuZGVmYXVsdC5sb29rdXAoZXZ0LmVzY2FwZVtpXSkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2VuZCB0aGUgY2hhcmFjdGVyIGV2ZW50XG4gICAgICAgIG5leHQoZXZ0KTtcbiAgICAgICAgLy8gcmVkbyBtb2RpZmllcnNcbiAgICAgICAgLyoganNoaW50IHNoYWRvdzogdHJ1ZSAqL1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2dC5lc2NhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIG5leHQoeyB0eXBlOiAna2V5ZG93bicsIGtleUlkOiAwLCBrZXlzeW06IF9rZXlzeW1kZWYyLmRlZmF1bHQubG9va3VwKGV2dC5lc2NhcGVbaV0pIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8qIGpzaGludCBzaGFkb3c6IGZhbHNlICovXG4gICAgfTtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgICBcIkVzY2FwZVwiOiAweDAwMDEsXG4gICAgXCJEaWdpdDFcIjogMHgwMDAyLFxuICAgIFwiRGlnaXQyXCI6IDB4MDAwMyxcbiAgICBcIkRpZ2l0M1wiOiAweDAwMDQsXG4gICAgXCJEaWdpdDRcIjogMHgwMDA1LFxuICAgIFwiRGlnaXQ1XCI6IDB4MDAwNixcbiAgICBcIkRpZ2l0NlwiOiAweDAwMDcsXG4gICAgXCJEaWdpdDdcIjogMHgwMDA4LFxuICAgIFwiRGlnaXQ4XCI6IDB4MDAwOSxcbiAgICBcIkRpZ2l0OVwiOiAweDAwMEEsXG4gICAgXCJEaWdpdDBcIjogMHgwMDBCLFxuICAgIFwiTWludXNcIjogMHgwMDBDLFxuICAgIFwiRXF1YWxcIjogMHgwMDBELFxuICAgIFwiQmFja3NwYWNlXCI6IDB4MDAwRSxcbiAgICBcIlRhYlwiOiAweDAwMEYsXG4gICAgXCJLZXlRXCI6IDB4MDAxMCxcbiAgICBcIktleVdcIjogMHgwMDExLFxuICAgIFwiS2V5RVwiOiAweDAwMTIsXG4gICAgXCJLZXlSXCI6IDB4MDAxMyxcbiAgICBcIktleVRcIjogMHgwMDE0LFxuICAgIFwiS2V5WVwiOiAweDAwMTUsXG4gICAgXCJLZXlVXCI6IDB4MDAxNixcbiAgICBcIktleUlcIjogMHgwMDE3LFxuICAgIFwiS2V5T1wiOiAweDAwMTgsXG4gICAgXCJLZXlQXCI6IDB4MDAxOSxcbiAgICBcIkJyYWNrZXRMZWZ0XCI6IDB4MDAxQSxcbiAgICBcIkJyYWNrZXRSaWdodFwiOiAweDAwMUIsXG4gICAgXCJFbnRlclwiOiAweDAwMUMsXG4gICAgXCJDb250cm9sTGVmdFwiOiAweDAwMUQsXG4gICAgXCJLZXlBXCI6IDB4MDAxRSxcbiAgICBcIktleVNcIjogMHgwMDFGLFxuICAgIFwiS2V5RFwiOiAweDAwMjAsXG4gICAgXCJLZXlGXCI6IDB4MDAyMSxcbiAgICBcIktleUdcIjogMHgwMDIyLFxuICAgIFwiS2V5SFwiOiAweDAwMjMsXG4gICAgXCJLZXlKXCI6IDB4MDAyNCxcbiAgICBcIktleUtcIjogMHgwMDI1LFxuICAgIFwiS2V5TFwiOiAweDAwMjYsXG4gICAgXCJTZW1pY29sb25cIjogMHgwMDI3LFxuICAgIFwiUXVvdGVcIjogMHgwMDI4LFxuICAgIFwiQmFja3F1b3RlXCI6IDB4MDAyOSxcbiAgICBcIlNoaWZ0TGVmdFwiOiAweDAwMkEsXG4gICAgXCJCYWNrc2xhc2hcIjogMHgwMDJCLFxuICAgIFwiS2V5WlwiOiAweDAwMkMsXG4gICAgXCJLZXlYXCI6IDB4MDAyRCxcbiAgICBcIktleUNcIjogMHgwMDJFLFxuICAgIFwiS2V5VlwiOiAweDAwMkYsXG4gICAgXCJLZXlCXCI6IDB4MDAzMCxcbiAgICBcIktleU5cIjogMHgwMDMxLFxuICAgIFwiS2V5TVwiOiAweDAwMzIsXG4gICAgXCJDb21tYVwiOiAweDAwMzMsXG4gICAgXCJQZXJpb2RcIjogMHgwMDM0LFxuICAgIFwiU2xhc2hcIjogMHgwMDM1LFxuICAgIFwiU2hpZnRSaWdodFwiOiAweDAwMzYsXG4gICAgXCJOdW1wYWRNdWx0aXBseVwiOiAweDAwMzcsXG4gICAgXCJBbHRMZWZ0XCI6IDB4MDAzOCxcbiAgICBcIlNwYWNlXCI6IDB4MDAzOSxcbiAgICBcIkNhcHNMb2NrXCI6IDB4MDAzQSxcbiAgICBcIkYxXCI6IDB4MDAzQixcbiAgICBcIkYyXCI6IDB4MDAzQyxcbiAgICBcIkYzXCI6IDB4MDAzRCxcbiAgICBcIkY0XCI6IDB4MDAzRSxcbiAgICBcIkY1XCI6IDB4MDAzRixcbiAgICBcIkY2XCI6IDB4MDA0MCxcbiAgICBcIkY3XCI6IDB4MDA0MSxcbiAgICBcIkY4XCI6IDB4MDA0MixcbiAgICBcIkY5XCI6IDB4MDA0MyxcbiAgICBcIkYxMFwiOiAweDAwNDQsXG4gICAgXCJQYXVzZVwiOiAweEUwNDUsXG4gICAgXCJTY3JvbGxMb2NrXCI6IDB4MDA0NixcbiAgICBcIk51bXBhZDdcIjogMHgwMDQ3LFxuICAgIFwiTnVtcGFkOFwiOiAweDAwNDgsXG4gICAgXCJOdW1wYWQ5XCI6IDB4MDA0OSxcbiAgICBcIk51bXBhZFN1YnRyYWN0XCI6IDB4MDA0QSxcbiAgICBcIk51bXBhZDRcIjogMHgwMDRCLFxuICAgIFwiTnVtcGFkNVwiOiAweDAwNEMsXG4gICAgXCJOdW1wYWQ2XCI6IDB4MDA0RCxcbiAgICBcIk51bXBhZEFkZFwiOiAweDAwNEUsXG4gICAgXCJOdW1wYWQxXCI6IDB4MDA0RixcbiAgICBcIk51bXBhZDJcIjogMHgwMDUwLFxuICAgIFwiTnVtcGFkM1wiOiAweDAwNTEsXG4gICAgXCJOdW1wYWQwXCI6IDB4MDA1MixcbiAgICBcIk51bXBhZERlY2ltYWxcIjogMHgwMDUzLFxuICAgIFwiSW50bEJhY2tzbGFzaFwiOiAweDAwNTYsXG4gICAgXCJGMTFcIjogMHgwMDU3LFxuICAgIFwiRjEyXCI6IDB4MDA1OCxcbiAgICBcIkludGxZZW5cIjogMHgwMDdELFxuICAgIFwiTWVkaWFUcmFja1ByZXZpb3VzXCI6IDB4RTAxMCxcbiAgICBcIk1lZGlhVHJhY2tOZXh0XCI6IDB4RTAxOSxcbiAgICBcIk51bXBhZEVudGVyXCI6IDB4RTAxQyxcbiAgICBcIkNvbnRyb2xSaWdodFwiOiAweEUwMUQsXG4gICAgXCJWb2x1bWVNdXRlXCI6IDB4RTAyMCxcbiAgICBcIk1lZGlhUGxheVBhdXNlXCI6IDB4RTAyMixcbiAgICBcIk1lZGlhU3RvcFwiOiAweEUwMjQsXG4gICAgXCJWb2x1bWVEb3duXCI6IDB4RTAyRSxcbiAgICBcIlZvbHVtZVVwXCI6IDB4RTAzMCxcbiAgICBcIkJyb3dzZXJIb21lXCI6IDB4RTAzMixcbiAgICBcIk51bXBhZERpdmlkZVwiOiAweEUwMzUsXG4gICAgXCJQcmludFNjcmVlblwiOiAweEUwMzcsXG4gICAgXCJBbHRSaWdodFwiOiAweEUwMzgsXG4gICAgXCJOdW1Mb2NrXCI6IDB4MDA0NSxcbiAgICBcIkhvbWVcIjogMHhFMDQ3LFxuICAgIFwiQXJyb3dVcFwiOiAweEUwNDgsXG4gICAgXCJQYWdlVXBcIjogMHhFMDQ5LFxuICAgIFwiQXJyb3dMZWZ0XCI6IDB4RTA0QixcbiAgICBcIkFycm93UmlnaHRcIjogMHhFMDRELFxuICAgIFwiRW5kXCI6IDB4RTA0RixcbiAgICBcIkFycm93RG93blwiOiAweEUwNTAsXG4gICAgXCJQYWdlRG93blwiOiAweEUwNTEsXG4gICAgXCJJbnNlcnRcIjogMHhFMDUyLFxuICAgIFwiRGVsZXRlXCI6IDB4RTA1MyxcbiAgICBcIk1ldGFMZWZ0XCI6IDB4RTA1QixcbiAgICBcIk1ldGFSaWdodFwiOiAweEUwNUMsXG4gICAgXCJPU0xlZnRcIjogMHhFMDVCLCAvLyBPU0xlZnQgYW5kIE9TUmlnaHQgYXJlIGtlcHQgZm9yIGNvbXBhdGFiaWxpdHkgc2luY2VcbiAgICBcIk9TUmlnaHRcIjogMHhFMDVDLCAvLyBGaXJlZm94IGhhdmVuJ3QgdXBkYXRlZCB0byBNZXRhTGVmdCBhbmQgTWV0YVJpZ2h0IHlldFxuICAgIFwiQ29udGV4dE1lbnVcIjogMHhFMDVELFxuICAgIFwiQnJvd3NlclNlYXJjaFwiOiAweEUwNjUsXG4gICAgXCJCcm93c2VyRmF2b3JpdGVzXCI6IDB4RTA2NixcbiAgICBcIkJyb3dzZXJSZWZyZXNoXCI6IDB4RTA2NyxcbiAgICBcIkJyb3dzZXJTdG9wXCI6IDB4RTA2OCxcbiAgICBcIkJyb3dzZXJGb3J3YXJkXCI6IDB4RTA2OSxcbiAgICBcIkJyb3dzZXJCYWNrXCI6IDB4RTA2QSxcbiAgICBcIk51bXBhZENvbW1hXCI6IDB4MDA3RSxcbiAgICBcIk51bXBhZEVxdWFsXCI6IDB4MDA1OSxcbiAgICBcIkYxM1wiOiAweDAwNjQsXG4gICAgXCJGMTRcIjogMHgwMDY1LFxuICAgIFwiRjE1XCI6IDB4MDA2NixcbiAgICBcIkYxNlwiOiAweDAwNjcsXG4gICAgXCJGMTdcIjogMHgwMDY4LFxuICAgIFwiRjE4XCI6IDB4MDA2OSxcbiAgICBcIkYxOVwiOiAweDAwNkEsXG4gICAgXCJGMjBcIjogMHgwMDZCLFxuICAgIFwiRjIxXCI6IDB4MDA2QyxcbiAgICBcIkYyMlwiOiAweDAwNkQsXG4gICAgXCJGMjNcIjogMHgwMDZFLFxuICAgIFwiRjI0XCI6IDB4MDA3NixcbiAgICBcIkthbmFNb2RlXCI6IDB4MDA3MCxcbiAgICBcIkxhbmcyXCI6IDB4MDA3MSxcbiAgICBcIkxhbmcxXCI6IDB4MDA3MixcbiAgICBcIkludGxSb1wiOiAweDAwNzMsXG4gICAgXCJDb252ZXJ0XCI6IDB4MDA3OSxcbiAgICBcIk5vbkNvbnZlcnRcIjogMHgwMDdCLFxuICAgIFwiTGF1bmNoQXBwMlwiOiAweEUwMjEsXG4gICAgXCJQb3dlclwiOiAweEUwNUUsXG4gICAgXCJMYXVuY2hBcHAxXCI6IDB4RTA2QixcbiAgICBcIkxhdW5jaE1haWxcIjogMHhFMDZDLFxuICAgIFwiTWVkaWFTZWxlY3RcIjogMHhFMDZEXG59OyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gUkZCO1xuXG52YXIgX2xvZ2dpbmcgPSByZXF1aXJlKCcuL3V0aWwvbG9nZ2luZy5qcycpO1xuXG52YXIgTG9nID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2xvZ2dpbmcpO1xuXG52YXIgX2xvY2FsaXphdGlvbiA9IHJlcXVpcmUoJy4vdXRpbC9sb2NhbGl6YXRpb24uanMnKTtcblxudmFyIF9sb2NhbGl6YXRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbG9jYWxpemF0aW9uKTtcblxudmFyIF9zdHJpbmdzID0gcmVxdWlyZSgnLi91dGlsL3N0cmluZ3MuanMnKTtcblxudmFyIF9wcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi91dGlsL3Byb3BlcnRpZXMuanMnKTtcblxudmFyIF9kaXNwbGF5ID0gcmVxdWlyZSgnLi9kaXNwbGF5LmpzJyk7XG5cbnZhciBfZGlzcGxheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kaXNwbGF5KTtcblxudmFyIF9kZXZpY2VzID0gcmVxdWlyZSgnLi9pbnB1dC9kZXZpY2VzLmpzJyk7XG5cbnZhciBfd2Vic29jayA9IHJlcXVpcmUoJy4vd2Vic29jay5qcycpO1xuXG52YXIgX3dlYnNvY2syID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2Vic29jayk7XG5cbnZhciBfYmFzZSA9IHJlcXVpcmUoJy4vYmFzZTY0LmpzJyk7XG5cbnZhciBfYmFzZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9iYXNlKTtcblxudmFyIF9kZXMgPSByZXF1aXJlKCcuL2Rlcy5qcycpO1xuXG52YXIgX2RlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZXMpO1xuXG52YXIgX2tleXN5bSA9IHJlcXVpcmUoJy4vaW5wdXQva2V5c3ltLmpzJyk7XG5cbnZhciBfa2V5c3ltMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2tleXN5bSk7XG5cbnZhciBfeHRzY2FuY29kZXMgPSByZXF1aXJlKCcuL2lucHV0L3h0c2NhbmNvZGVzLmpzJyk7XG5cbnZhciBfeHRzY2FuY29kZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfeHRzY2FuY29kZXMpO1xuXG52YXIgX2luZmxhdG9yID0gcmVxdWlyZSgnLi9pbmZsYXRvci5qcycpO1xuXG52YXIgX2luZmxhdG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luZmxhdG9yKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBlbHNlIHsgdmFyIG5ld09iaiA9IHt9OyBpZiAob2JqICE9IG51bGwpIHsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyByZXR1cm4gbmV3T2JqOyB9IH1cblxuLypqc2xpbnQgd2hpdGU6IGZhbHNlLCBicm93c2VyOiB0cnVlICovXG4vKmdsb2JhbCB3aW5kb3csIFV0aWwsIERpc3BsYXksIEtleWJvYXJkLCBNb3VzZSwgV2Vic29jaywgV2Vic29ja19uYXRpdmUsIEJhc2U2NCwgREVTLCBLZXlUYWJsZSwgSW5mbGF0b3IsIFh0U2NhbmNvZGUgKi9cblxuLypcbiAqIG5vVk5DOiBIVE1MNSBWTkMgY2xpZW50XG4gKiBDb3B5cmlnaHQgKEMpIDIwMTIgSm9lbCBNYXJ0aW5cbiAqIENvcHlyaWdodCAoQykgMjAxNiBTYW11ZWwgTWFubmVoZWQgZm9yIENlbmRpbyBBQlxuICogTGljZW5zZWQgdW5kZXIgTVBMIDIuMCAoc2VlIExJQ0VOU0UudHh0KVxuICpcbiAqIFNlZSBSRUFETUUubWQgZm9yIHVzYWdlIGFuZCBpbnRlZ3JhdGlvbiBpbnN0cnVjdGlvbnMuXG4gKlxuICogVElHSFQgZGVjb2RlciBwb3J0aW9uOlxuICogKGMpIDIwMTIgTWljaGFlbCBUaW5nbG9mLCBKb2UgQmFsYXosIExlcyBQaWVjaCAoTWVyY3VyaS5jYSlcbiAqL1xuXG5mdW5jdGlvbiBSRkIoZGVmYXVsdHMpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGlmICghZGVmYXVsdHMpIHtcbiAgICAgICAgZGVmYXVsdHMgPSB7fTtcbiAgICB9XG5cbiAgICB0aGlzLl9yZmJfaG9zdCA9ICcnO1xuICAgIHRoaXMuX3JmYl9wb3J0ID0gNTkwMDtcbiAgICB0aGlzLl9yZmJfcGFzc3dvcmQgPSAnJztcbiAgICB0aGlzLl9yZmJfcGF0aCA9ICcnO1xuXG4gICAgdGhpcy5fcmZiX2Nvbm5lY3Rpb25fc3RhdGUgPSAnJztcbiAgICB0aGlzLl9yZmJfaW5pdF9zdGF0ZSA9ICcnO1xuICAgIHRoaXMuX3JmYl92ZXJzaW9uID0gMDtcbiAgICB0aGlzLl9yZmJfbWF4X3ZlcnNpb24gPSAzLjg7XG4gICAgdGhpcy5fcmZiX2F1dGhfc2NoZW1lID0gJyc7XG4gICAgdGhpcy5fcmZiX2Rpc2Nvbm5lY3RfcmVhc29uID0gXCJcIjtcblxuICAgIHRoaXMuX3JmYl90aWdodHZuYyA9IGZhbHNlO1xuICAgIHRoaXMuX3JmYl94dnBfdmVyID0gMDtcblxuICAgIC8vIEluIHByZWZlcmVuY2Ugb3JkZXJcbiAgICB0aGlzLl9lbmNvZGluZ3MgPSBbWydDT1BZUkVDVCcsIDB4MDFdLCBbJ1RJR0hUJywgMHgwN10sIFsnVElHSFRfUE5HJywgLTI2MF0sIFsnSEVYVElMRScsIDB4MDVdLCBbJ1JSRScsIDB4MDJdLCBbJ1JBVycsIDB4MDBdLFxuXG4gICAgLy8gUHN1ZWRvLWVuY29kaW5nIHNldHRpbmdzXG5cbiAgICAvL1snSlBFR19xdWFsaXR5X2xvJywgICAgIC0zMiBdLFxuICAgIFsnSlBFR19xdWFsaXR5X21lZCcsIC0yNl0sXG4gICAgLy9bJ0pQRUdfcXVhbGl0eV9oaScsICAgICAtMjMgXSxcbiAgICAvL1snY29tcHJlc3NfbG8nLCAgICAgICAgLTI1NSBdLFxuICAgIFsnY29tcHJlc3NfaGknLCAtMjU0XSxcbiAgICAvL1snY29tcHJlc3NfbWF4JywgICAgICAgLTI0NyBdLFxuXG4gICAgWydEZXNrdG9wU2l6ZScsIC0yMjNdLCBbJ2xhc3RfcmVjdCcsIC0yMjRdLCBbJ0N1cnNvcicsIC0yMzldLCBbJ1FFTVVFeHRlbmRlZEtleUV2ZW50JywgLTI1OF0sIFsnRXh0ZW5kZWREZXNrdG9wU2l6ZScsIC0zMDhdLCBbJ3h2cCcsIC0zMDldLCBbJ0ZlbmNlJywgLTMxMl0sIFsnQ29udGludW91c1VwZGF0ZXMnLCAtMzEzXV07XG5cbiAgICB0aGlzLl9lbmNIYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuX2VuY05hbWVzID0ge307XG4gICAgdGhpcy5fZW5jU3RhdHMgPSB7fTtcblxuICAgIHRoaXMuX3NvY2sgPSBudWxsOyAvLyBXZWJzb2NrIG9iamVjdFxuICAgIHRoaXMuX2Rpc3BsYXkgPSBudWxsOyAvLyBEaXNwbGF5IG9iamVjdFxuICAgIHRoaXMuX2ZsdXNoaW5nID0gZmFsc2U7IC8vIERpc3BsYXkgZmx1c2hpbmcgc3RhdGVcbiAgICB0aGlzLl9rZXlib2FyZCA9IG51bGw7IC8vIEtleWJvYXJkIGlucHV0IGhhbmRsZXIgb2JqZWN0XG4gICAgdGhpcy5fbW91c2UgPSBudWxsOyAvLyBNb3VzZSBpbnB1dCBoYW5kbGVyIG9iamVjdFxuICAgIHRoaXMuX2Rpc2Nvbm5UaW1lciA9IG51bGw7IC8vIGRpc2Nvbm5lY3Rpb24gdGltZXJcblxuICAgIHRoaXMuX3N1cHBvcnRzRmVuY2UgPSBmYWxzZTtcblxuICAgIHRoaXMuX3N1cHBvcnRzQ29udGludW91c1VwZGF0ZXMgPSBmYWxzZTtcbiAgICB0aGlzLl9lbmFibGVkQ29udGludW91c1VwZGF0ZXMgPSBmYWxzZTtcblxuICAgIC8vIEZyYW1lIGJ1ZmZlciB1cGRhdGUgc3RhdGVcbiAgICB0aGlzLl9GQlUgPSB7XG4gICAgICAgIHJlY3RzOiAwLFxuICAgICAgICBzdWJyZWN0czogMCwgLy8gUlJFXG4gICAgICAgIGxpbmVzOiAwLCAvLyBSQVdcbiAgICAgICAgdGlsZXM6IDAsIC8vIEhFWFRJTEVcbiAgICAgICAgYnl0ZXM6IDAsXG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDAsXG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgIGVuY29kaW5nOiAwLFxuICAgICAgICBzdWJlbmNvZGluZzogLTEsXG4gICAgICAgIGJhY2tncm91bmQ6IG51bGwsXG4gICAgICAgIHpsaWI6IFtdIC8vIFRJR0hUIHpsaWIgc3RyZWFtc1xuICAgIH07XG5cbiAgICB0aGlzLl9mYl9CcHAgPSA0O1xuICAgIHRoaXMuX2ZiX2RlcHRoID0gMztcbiAgICB0aGlzLl9mYl93aWR0aCA9IDA7XG4gICAgdGhpcy5fZmJfaGVpZ2h0ID0gMDtcbiAgICB0aGlzLl9mYl9uYW1lID0gXCJcIjtcblxuICAgIHRoaXMuX2Rlc3RCdWZmID0gbnVsbDtcbiAgICB0aGlzLl9wYWxldHRlQnVmZiA9IG5ldyBVaW50OEFycmF5KDEwMjQpOyAvLyAyNTYgKiA0IChtYXggcGFsZXR0ZSBzaXplICogbWF4IGJ5dGVzLXBlci1waXhlbClcblxuICAgIHRoaXMuX3JyZV9jaHVua19zeiA9IDEwMDtcblxuICAgIHRoaXMuX3RpbWluZyA9IHtcbiAgICAgICAgbGFzdF9mYnU6IDAsXG4gICAgICAgIGZidV90b3RhbDogMCxcbiAgICAgICAgZmJ1X3RvdGFsX2NudDogMCxcbiAgICAgICAgZnVsbF9mYnVfdG90YWw6IDAsXG4gICAgICAgIGZ1bGxfZmJ1X2NudDogMCxcblxuICAgICAgICBmYnVfcnRfc3RhcnQ6IDAsXG4gICAgICAgIGZidV9ydF90b3RhbDogMCxcbiAgICAgICAgZmJ1X3J0X2NudDogMCxcbiAgICAgICAgcGl4ZWxzOiAwXG4gICAgfTtcblxuICAgIHRoaXMuX3N1cHBvcnRzU2V0RGVza3RvcFNpemUgPSBmYWxzZTtcbiAgICB0aGlzLl9zY3JlZW5faWQgPSAwO1xuICAgIHRoaXMuX3NjcmVlbl9mbGFncyA9IDA7XG5cbiAgICAvLyBNb3VzZSBzdGF0ZVxuICAgIHRoaXMuX21vdXNlX2J1dHRvbk1hc2sgPSAwO1xuICAgIHRoaXMuX21vdXNlX2FyciA9IFtdO1xuICAgIHRoaXMuX3ZpZXdwb3J0RHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl92aWV3cG9ydERyYWdQb3MgPSB7fTtcbiAgICB0aGlzLl92aWV3cG9ydEhhc01vdmVkID0gZmFsc2U7XG5cbiAgICAvLyBRRU1VIEV4dGVuZGVkIEtleSBFdmVudCBzdXBwb3J0IC0gZGVmYXVsdCB0byBmYWxzZVxuICAgIHRoaXMuX3FlbXVFeHRLZXlFdmVudFN1cHBvcnRlZCA9IGZhbHNlO1xuXG4gICAgLy8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlIG9uIHVzZXItZmFjaW5nIHByb3BlcnRpZXNcbiAgICAoMCwgX3Byb3BlcnRpZXMuc2V0X2RlZmF1bHRzKSh0aGlzLCBkZWZhdWx0cywge1xuICAgICAgICAndGFyZ2V0JzogJ251bGwnLCAvLyBWTkMgZGlzcGxheSByZW5kZXJpbmcgQ2FudmFzIG9iamVjdFxuICAgICAgICAnZm9jdXNDb250YWluZXInOiBkb2N1bWVudCwgLy8gRE9NIGVsZW1lbnQgdGhhdCBjYXB0dXJlcyBrZXlib2FyZCBpbnB1dFxuICAgICAgICAnZW5jcnlwdCc6IGZhbHNlLCAvLyBVc2UgVExTL1NTTC93c3MgZW5jcnlwdGlvblxuICAgICAgICAndHJ1ZV9jb2xvcic6IHRydWUsIC8vIFJlcXVlc3QgdHJ1ZSBjb2xvciBwaXhlbCBkYXRhXG4gICAgICAgICdsb2NhbF9jdXJzb3InOiBmYWxzZSwgLy8gUmVxdWVzdCBsb2NhbGx5IHJlbmRlcmVkIGN1cnNvclxuICAgICAgICAnc2hhcmVkJzogdHJ1ZSwgLy8gUmVxdWVzdCBzaGFyZWQgbW9kZVxuICAgICAgICAndmlld19vbmx5JzogZmFsc2UsIC8vIERpc2FibGUgY2xpZW50IG1vdXNlL2tleWJvYXJkXG4gICAgICAgICd4dnBfcGFzc3dvcmRfc2VwJzogJ0AnLCAvLyBTZXBhcmF0b3IgZm9yIFhWUCBwYXNzd29yZCBmaWVsZHNcbiAgICAgICAgJ2Rpc2Nvbm5lY3RUaW1lb3V0JzogMywgLy8gVGltZSAocykgdG8gd2FpdCBmb3IgZGlzY29ubmVjdGlvblxuICAgICAgICAnd3NQcm90b2NvbHMnOiBbJ2JpbmFyeSddLCAvLyBQcm90b2NvbHMgdG8gdXNlIGluIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICAgICAgICAncmVwZWF0ZXJJRCc6ICcnLCAvLyBbVWx0cmFWTkNdIFJlcGVhdGVySUQgdG8gY29ubmVjdCB0b1xuICAgICAgICAndmlld3BvcnREcmFnJzogZmFsc2UsIC8vIE1vdmUgdGhlIHZpZXdwb3J0IG9uIG1vdXNlIGRyYWdzXG5cbiAgICAgICAgLy8gQ2FsbGJhY2sgZnVuY3Rpb25zXG4gICAgICAgICdvblVwZGF0ZVN0YXRlJzogZnVuY3Rpb24gKCkge30sIC8vIG9uVXBkYXRlU3RhdGUocmZiLCBzdGF0ZSwgb2xkc3RhdGUpOiBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZVxuICAgICAgICAnb25Ob3RpZmljYXRpb24nOiBmdW5jdGlvbiAoKSB7fSwgLy8gb25Ob3RpZmljYXRpb24ocmZiLCBtc2csIGxldmVsLCBvcHRpb25zKTogbm90aWZpY2F0aW9uIGZvciBVSVxuICAgICAgICAnb25EaXNjb25uZWN0ZWQnOiBmdW5jdGlvbiAoKSB7fSwgLy8gb25EaXNjb25uZWN0ZWQocmZiLCByZWFzb24pOiBkaXNjb25uZWN0aW9uIGZpbmlzaGVkXG4gICAgICAgICdvblBhc3N3b3JkUmVxdWlyZWQnOiBmdW5jdGlvbiAoKSB7fSwgLy8gb25QYXNzd29yZFJlcXVpcmVkKHJmYiwgbXNnKTogVk5DIHBhc3N3b3JkIGlzIHJlcXVpcmVkXG4gICAgICAgICdvbkNsaXBib2FyZCc6IGZ1bmN0aW9uICgpIHt9LCAvLyBvbkNsaXBib2FyZChyZmIsIHRleHQpOiBSRkIgY2xpcGJvYXJkIGNvbnRlbnRzIHJlY2VpdmVkXG4gICAgICAgICdvbkJlbGwnOiBmdW5jdGlvbiAoKSB7fSwgLy8gb25CZWxsKHJmYik6IFJGQiBCZWxsIG1lc3NhZ2UgcmVjZWl2ZWRcbiAgICAgICAgJ29uRkJVUmVjZWl2ZSc6IGZ1bmN0aW9uICgpIHt9LCAvLyBvbkZCVVJlY2VpdmUocmZiLCBmYnUpOiBSRkIgRkJVIHJlY2VpdmVkIGJ1dCBub3QgeWV0IHByb2Nlc3NlZFxuICAgICAgICAnb25GQlVDb21wbGV0ZSc6IGZ1bmN0aW9uICgpIHt9LCAvLyBvbkZCVUNvbXBsZXRlKHJmYiwgZmJ1KTogUkZCIEZCVSByZWNlaXZlZCBhbmQgcHJvY2Vzc2VkXG4gICAgICAgICdvbkZCUmVzaXplJzogZnVuY3Rpb24gKCkge30sIC8vIG9uRkJSZXNpemUocmZiLCB3aWR0aCwgaGVpZ2h0KTogZnJhbWUgYnVmZmVyIHJlc2l6ZWRcbiAgICAgICAgJ29uRGVza3RvcE5hbWUnOiBmdW5jdGlvbiAoKSB7fSwgLy8gb25EZXNrdG9wTmFtZShyZmIsIG5hbWUpOiBkZXNrdG9wIG5hbWUgcmVjZWl2ZWRcbiAgICAgICAgJ29uWHZwSW5pdCc6IGZ1bmN0aW9uICgpIHt9IC8vIG9uWHZwSW5pdCh2ZXJzaW9uKTogWFZQIGV4dGVuc2lvbnMgYWN0aXZlIGZvciB0aGlzIGNvbm5lY3Rpb25cbiAgICB9KTtcblxuICAgIC8vIG1haW4gc2V0dXBcbiAgICBMb2cuRGVidWcoXCI+PiBSRkIuY29uc3RydWN0b3JcIik7XG5cbiAgICAvLyBwb3B1bGF0ZSBlbmNIYW5kbGVycyB3aXRoIGJvdW5kIHZlcnNpb25zXG4gICAgT2JqZWN0LmtleXMoUkZCLmVuY29kaW5nSGFuZGxlcnMpLmZvckVhY2goZnVuY3Rpb24gKGVuY05hbWUpIHtcbiAgICAgICAgdGhpcy5fZW5jSGFuZGxlcnNbZW5jTmFtZV0gPSBSRkIuZW5jb2RpbmdIYW5kbGVyc1tlbmNOYW1lXS5iaW5kKHRoaXMpO1xuICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAvLyBDcmVhdGUgbG9va3VwIHRhYmxlcyBiYXNlZCBvbiBlbmNvZGluZyBudW1iZXJcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2VuY29kaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLl9lbmNIYW5kbGVyc1t0aGlzLl9lbmNvZGluZ3NbaV1bMV1dID0gdGhpcy5fZW5jSGFuZGxlcnNbdGhpcy5fZW5jb2RpbmdzW2ldWzBdXTtcbiAgICAgICAgdGhpcy5fZW5jTmFtZXNbdGhpcy5fZW5jb2RpbmdzW2ldWzFdXSA9IHRoaXMuX2VuY29kaW5nc1tpXVswXTtcbiAgICAgICAgdGhpcy5fZW5jU3RhdHNbdGhpcy5fZW5jb2RpbmdzW2ldWzFdXSA9IFswLCAwXTtcbiAgICB9XG5cbiAgICAvLyBOQjogbm90aGluZyB0aGF0IG5lZWRzIGV4cGxpY2l0IHRlYXJkb3duIHNob3VsZCBiZSBkb25lXG4gICAgLy8gYmVmb3JlIHRoaXMgcG9pbnQsIHNpbmNlIHRoaXMgY2FuIHRocm93IGFuIGV4Y2VwdGlvblxuICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX2Rpc3BsYXkgPSBuZXcgX2Rpc3BsYXkyLmRlZmF1bHQoeyB0YXJnZXQ6IHRoaXMuX3RhcmdldCxcbiAgICAgICAgICAgIG9uRmx1c2g6IHRoaXMuX29uRmx1c2guYmluZCh0aGlzKSB9KTtcbiAgICB9IGNhdGNoIChleGMpIHtcbiAgICAgICAgTG9nLkVycm9yKFwiRGlzcGxheSBleGNlcHRpb246IFwiICsgZXhjKTtcbiAgICAgICAgdGhyb3cgZXhjO1xuICAgIH1cblxuICAgIHRoaXMuX2tleWJvYXJkID0gbmV3IF9kZXZpY2VzLktleWJvYXJkKHsgdGFyZ2V0OiB0aGlzLl9mb2N1c0NvbnRhaW5lcixcbiAgICAgICAgb25LZXlQcmVzczogdGhpcy5faGFuZGxlS2V5UHJlc3MuYmluZCh0aGlzKSB9KTtcblxuICAgIHRoaXMuX21vdXNlID0gbmV3IF9kZXZpY2VzLk1vdXNlKHsgdGFyZ2V0OiB0aGlzLl90YXJnZXQsXG4gICAgICAgIG9uTW91c2VCdXR0b246IHRoaXMuX2hhbmRsZU1vdXNlQnV0dG9uLmJpbmQodGhpcyksXG4gICAgICAgIG9uTW91c2VNb3ZlOiB0aGlzLl9oYW5kbGVNb3VzZU1vdmUuYmluZCh0aGlzKSxcbiAgICAgICAgbm90aWZ5OiB0aGlzLl9rZXlib2FyZC5zeW5jLmJpbmQodGhpcy5fa2V5Ym9hcmQpIH0pO1xuXG4gICAgdGhpcy5fc29jayA9IG5ldyBfd2Vic29jazIuZGVmYXVsdCgpO1xuICAgIHRoaXMuX3NvY2sub24oJ21lc3NhZ2UnLCB0aGlzLl9oYW5kbGVfbWVzc2FnZS5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9zb2NrLm9uKCdvcGVuJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fcmZiX2Nvbm5lY3Rpb25fc3RhdGUgPT09ICdjb25uZWN0aW5nJyAmJiB0aGlzLl9yZmJfaW5pdF9zdGF0ZSA9PT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMuX3JmYl9pbml0X3N0YXRlID0gJ1Byb3RvY29sVmVyc2lvbic7XG4gICAgICAgICAgICBMb2cuRGVidWcoXCJTdGFydGluZyBWTkMgaGFuZHNoYWtlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZmFpbChcIlVuZXhwZWN0ZWQgc2VydmVyIGNvbm5lY3Rpb25cIik7XG4gICAgICAgIH1cbiAgICB9LmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3NvY2sub24oJ2Nsb3NlJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgTG9nLldhcm4oXCJXZWJTb2NrZXQgb24tY2xvc2UgZXZlbnRcIik7XG4gICAgICAgIHZhciBtc2cgPSBcIlwiO1xuICAgICAgICBpZiAoZS5jb2RlKSB7XG4gICAgICAgICAgICBtc2cgPSBcIiAoY29kZTogXCIgKyBlLmNvZGU7XG4gICAgICAgICAgICBpZiAoZS5yZWFzb24pIHtcbiAgICAgICAgICAgICAgICBtc2cgKz0gXCIsIHJlYXNvbjogXCIgKyBlLnJlYXNvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1zZyArPSBcIilcIjtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHRoaXMuX3JmYl9jb25uZWN0aW9uX3N0YXRlKSB7XG4gICAgICAgICAgICBjYXNlICdkaXNjb25uZWN0aW5nJzpcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY29ubmVjdGluZyc6XG4gICAgICAgICAgICAgICAgdGhpcy5fZmFpbCgnRmFpbGVkIHRvIGNvbm5lY3QgdG8gc2VydmVyJywgbXNnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Nvbm5lY3RlZCc6XG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIGRpc2Nvbm5lY3RzIHRoYXQgd2VyZSBpbml0aWF0ZWQgc2VydmVyLXNpZGVcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RpbmcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGlzY29ubmVjdGVkJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9mYWlsKFwiVW5leHBlY3RlZCBzZXJ2ZXIgZGlzY29ubmVjdFwiLCBcIkFscmVhZHkgZGlzY29ubmVjdGVkOiBcIiArIG1zZyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRoaXMuX2ZhaWwoXCJVbmV4cGVjdGVkIHNlcnZlciBkaXNjb25uZWN0XCIsIFwiTm90IGluIGFueSBzdGF0ZSB5ZXQ6IFwiICsgbXNnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zb2NrLm9mZignY2xvc2UnKTtcbiAgICB9LmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3NvY2sub24oJ2Vycm9yJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgTG9nLldhcm4oXCJXZWJTb2NrZXQgb24tZXJyb3IgZXZlbnRcIik7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9pbml0X3ZhcnMoKTtcbiAgICB0aGlzLl9jbGVhbnVwKCk7XG5cbiAgICB2YXIgcm1vZGUgPSB0aGlzLl9kaXNwbGF5LmdldF9yZW5kZXJfbW9kZSgpO1xuICAgIExvZy5JbmZvKFwiVXNpbmcgbmF0aXZlIFdlYlNvY2tldHMsIHJlbmRlciBtb2RlOiBcIiArIHJtb2RlKTtcblxuICAgIExvZy5EZWJ1ZyhcIjw8IFJGQi5jb25zdHJ1Y3RvclwiKTtcbn07XG5cblJGQi5wcm90b3R5cGUgPSB7XG4gICAgLy8gUHVibGljIG1ldGhvZHNcbiAgICBjb25uZWN0OiBmdW5jdGlvbiAoaG9zdCwgcG9ydCwgcGFzc3dvcmQsIHBhdGgpIHtcbiAgICAgICAgdGhpcy5fcmZiX2hvc3QgPSBob3N0O1xuICAgICAgICB0aGlzLl9yZmJfcG9ydCA9IHBvcnQ7XG4gICAgICAgIHRoaXMuX3JmYl9wYXNzd29yZCA9IHBhc3N3b3JkICE9PSB1bmRlZmluZWQgPyBwYXNzd29yZCA6IFwiXCI7XG4gICAgICAgIHRoaXMuX3JmYl9wYXRoID0gcGF0aCAhPT0gdW5kZWZpbmVkID8gcGF0aCA6IFwiXCI7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9yZmJfaG9zdCB8fCAhdGhpcy5fcmZiX3BvcnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKCgwLCBfbG9jYWxpemF0aW9uMi5kZWZhdWx0KShcIk11c3Qgc2V0IGhvc3QgYW5kIHBvcnRcIikpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fcmZiX2luaXRfc3RhdGUgPSAnJztcbiAgICAgICAgdGhpcy5fdXBkYXRlQ29ubmVjdGlvblN0YXRlKCdjb25uZWN0aW5nJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBkaXNjb25uZWN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUNvbm5lY3Rpb25TdGF0ZSgnZGlzY29ubmVjdGluZycpO1xuICAgICAgICB0aGlzLl9zb2NrLm9mZignZXJyb3InKTtcbiAgICAgICAgdGhpcy5fc29jay5vZmYoJ21lc3NhZ2UnKTtcbiAgICAgICAgdGhpcy5fc29jay5vZmYoJ29wZW4nKTtcbiAgICB9LFxuXG4gICAgc2VuZFBhc3N3b3JkOiBmdW5jdGlvbiAocGFzc3dkKSB7XG4gICAgICAgIHRoaXMuX3JmYl9wYXNzd29yZCA9IHBhc3N3ZDtcbiAgICAgICAgc2V0VGltZW91dCh0aGlzLl9pbml0X21zZy5iaW5kKHRoaXMpLCAwKTtcbiAgICB9LFxuXG4gICAgc2VuZEN0cmxBbHREZWw6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JmYl9jb25uZWN0aW9uX3N0YXRlICE9PSAnY29ubmVjdGVkJyB8fCB0aGlzLl92aWV3X29ubHkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBMb2cuSW5mbyhcIlNlbmRpbmcgQ3RybC1BbHQtRGVsXCIpO1xuXG4gICAgICAgIFJGQi5tZXNzYWdlcy5rZXlFdmVudCh0aGlzLl9zb2NrLCBfa2V5c3ltMi5kZWZhdWx0LlhLX0NvbnRyb2xfTCwgMSk7XG4gICAgICAgIFJGQi5tZXNzYWdlcy5rZXlFdmVudCh0aGlzLl9zb2NrLCBfa2V5c3ltMi5kZWZhdWx0LlhLX0FsdF9MLCAxKTtcbiAgICAgICAgUkZCLm1lc3NhZ2VzLmtleUV2ZW50KHRoaXMuX3NvY2ssIF9rZXlzeW0yLmRlZmF1bHQuWEtfRGVsZXRlLCAxKTtcbiAgICAgICAgUkZCLm1lc3NhZ2VzLmtleUV2ZW50KHRoaXMuX3NvY2ssIF9rZXlzeW0yLmRlZmF1bHQuWEtfRGVsZXRlLCAwKTtcbiAgICAgICAgUkZCLm1lc3NhZ2VzLmtleUV2ZW50KHRoaXMuX3NvY2ssIF9rZXlzeW0yLmRlZmF1bHQuWEtfQWx0X0wsIDApO1xuICAgICAgICBSRkIubWVzc2FnZXMua2V5RXZlbnQodGhpcy5fc29jaywgX2tleXN5bTIuZGVmYXVsdC5YS19Db250cm9sX0wsIDApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgeHZwT3A6IGZ1bmN0aW9uICh2ZXIsIG9wKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZmJfeHZwX3ZlciA8IHZlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIExvZy5JbmZvKFwiU2VuZGluZyBYVlAgb3BlcmF0aW9uIFwiICsgb3AgKyBcIiAodmVyc2lvbiBcIiArIHZlciArIFwiKVwiKTtcbiAgICAgICAgdGhpcy5fc29jay5zZW5kX3N0cmluZyhcIlxceEZBXFx4MDBcIiArIFN0cmluZy5mcm9tQ2hhckNvZGUodmVyKSArIFN0cmluZy5mcm9tQ2hhckNvZGUob3ApKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIHh2cFNodXRkb3duOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnh2cE9wKDEsIDIpO1xuICAgIH0sXG5cbiAgICB4dnBSZWJvb3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueHZwT3AoMSwgMyk7XG4gICAgfSxcblxuICAgIHh2cFJlc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnh2cE9wKDEsIDQpO1xuICAgIH0sXG5cbiAgICAvLyBTZW5kIGEga2V5IHByZXNzLiBJZiAnZG93bicgaXMgbm90IHNwZWNpZmllZCB0aGVuIHNlbmQgYSBkb3duIGtleVxuICAgIC8vIGZvbGxvd2VkIGJ5IGFuIHVwIGtleS5cbiAgICBzZW5kS2V5OiBmdW5jdGlvbiAoa2V5c3ltLCBkb3duKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZmJfY29ubmVjdGlvbl9zdGF0ZSAhPT0gJ2Nvbm5lY3RlZCcgfHwgdGhpcy5fdmlld19vbmx5KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkb3duICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgTG9nLkluZm8oXCJTZW5kaW5nIGtleXN5bSAoXCIgKyAoZG93biA/IFwiZG93blwiIDogXCJ1cFwiKSArIFwiKTogXCIgKyBrZXlzeW0pO1xuICAgICAgICAgICAgUkZCLm1lc3NhZ2VzLmtleUV2ZW50KHRoaXMuX3NvY2ssIGtleXN5bSwgZG93biA/IDEgOiAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIExvZy5JbmZvKFwiU2VuZGluZyBrZXlzeW0gKGRvd24gKyB1cCk6IFwiICsga2V5c3ltKTtcbiAgICAgICAgICAgIFJGQi5tZXNzYWdlcy5rZXlFdmVudCh0aGlzLl9zb2NrLCBrZXlzeW0sIDEpO1xuICAgICAgICAgICAgUkZCLm1lc3NhZ2VzLmtleUV2ZW50KHRoaXMuX3NvY2ssIGtleXN5bSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIGNsaXBib2FyZFBhc3RlRnJvbTogZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgaWYgKHRoaXMuX3JmYl9jb25uZWN0aW9uX3N0YXRlICE9PSAnY29ubmVjdGVkJyB8fCB0aGlzLl92aWV3X29ubHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBSRkIubWVzc2FnZXMuY2xpZW50Q3V0VGV4dCh0aGlzLl9zb2NrLCB0ZXh0KTtcbiAgICB9LFxuXG4gICAgLy8gUmVxdWVzdHMgYSBjaGFuZ2Ugb2YgcmVtb3RlIGRlc2t0b3Agc2l6ZS4gVGhpcyBtZXNzYWdlIGlzIGFuIGV4dGVuc2lvblxuICAgIC8vIGFuZCBtYXkgb25seSBiZSBzZW50IGlmIHdlIGhhdmUgcmVjZWl2ZWQgYW4gRXh0ZW5kZWREZXNrdG9wU2l6ZSBtZXNzYWdlXG4gICAgcmVxdWVzdERlc2t0b3BTaXplOiBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICBpZiAodGhpcy5fcmZiX2Nvbm5lY3Rpb25fc3RhdGUgIT09ICdjb25uZWN0ZWQnIHx8IHRoaXMuX3ZpZXdfb25seSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3N1cHBvcnRzU2V0RGVza3RvcFNpemUpIHtcbiAgICAgICAgICAgIFJGQi5tZXNzYWdlcy5zZXREZXNrdG9wU2l6ZSh0aGlzLl9zb2NrLCB3aWR0aCwgaGVpZ2h0LCB0aGlzLl9zY3JlZW5faWQsIHRoaXMuX3NjcmVlbl9mbGFncyk7XG4gICAgICAgICAgICB0aGlzLl9zb2NrLmZsdXNoKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBQcml2YXRlIG1ldGhvZHNcblxuICAgIF9jb25uZWN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIExvZy5EZWJ1ZyhcIj4+IFJGQi5jb25uZWN0XCIpO1xuICAgICAgICB0aGlzLl9pbml0X3ZhcnMoKTtcblxuICAgICAgICB2YXIgdXJpO1xuICAgICAgICBpZiAodHlwZW9mIFVzaW5nU29ja2V0SU8gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB1cmkgPSAnaHR0cCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1cmkgPSB0aGlzLl9lbmNyeXB0ID8gJ3dzcycgOiAnd3MnO1xuICAgICAgICB9XG5cbiAgICAgICAgdXJpICs9ICc6Ly8nICsgdGhpcy5fcmZiX2hvc3QgKyAnOicgKyB0aGlzLl9yZmJfcG9ydCArICcvJyArIHRoaXMuX3JmYl9wYXRoO1xuICAgICAgICBMb2cuSW5mbyhcImNvbm5lY3RpbmcgdG8gXCIgKyB1cmkpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXZWJTb2NrZXQub25vcGVuIHRyYW5zaXRpb25zIHRvIHRoZSBSRkIgaW5pdCBzdGF0ZXNcbiAgICAgICAgICAgIHRoaXMuX3NvY2sub3Blbih1cmksIHRoaXMuX3dzUHJvdG9jb2xzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUubmFtZSA9PT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZhaWwoXCJJbnZhbGlkIGhvc3Qgb3IgcG9ydCB2YWx1ZSBnaXZlblwiLCBlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmFpbChcIkVycm9yIHdoaWxlIGNvbm5lY3RpbmdcIiwgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBMb2cuRGVidWcoXCI8PCBSRkIuY29ubmVjdFwiKTtcbiAgICB9LFxuXG4gICAgX2Rpc2Nvbm5lY3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgTG9nLkRlYnVnKFwiPj4gUkZCLmRpc2Nvbm5lY3RcIik7XG4gICAgICAgIHRoaXMuX2NsZWFudXAoKTtcbiAgICAgICAgdGhpcy5fc29jay5jbG9zZSgpO1xuICAgICAgICB0aGlzLl9wcmludF9zdGF0cygpO1xuICAgICAgICBMb2cuRGVidWcoXCI8PCBSRkIuZGlzY29ubmVjdFwiKTtcbiAgICB9LFxuXG4gICAgX2luaXRfdmFyczogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyByZXNldCBzdGF0ZVxuICAgICAgICB0aGlzLl9GQlUucmVjdHMgPSAwO1xuICAgICAgICB0aGlzLl9GQlUuc3VicmVjdHMgPSAwOyAvLyBSUkUgYW5kIEhFWFRJTEVcbiAgICAgICAgdGhpcy5fRkJVLmxpbmVzID0gMDsgLy8gUkFXXG4gICAgICAgIHRoaXMuX0ZCVS50aWxlcyA9IDA7IC8vIEhFWFRJTEVcbiAgICAgICAgdGhpcy5fRkJVLnpsaWJzID0gW107IC8vIFRJR0hUIHpsaWIgZW5jb2RlcnNcbiAgICAgICAgdGhpcy5fbW91c2VfYnV0dG9uTWFzayA9IDA7XG4gICAgICAgIHRoaXMuX21vdXNlX2FyciA9IFtdO1xuICAgICAgICB0aGlzLl9yZmJfdGlnaHR2bmMgPSBmYWxzZTtcblxuICAgICAgICAvLyBDbGVhciB0aGUgcGVyIGNvbm5lY3Rpb24gZW5jb2Rpbmcgc3RhdHNcbiAgICAgICAgdmFyIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9lbmNvZGluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuX2VuY1N0YXRzW3RoaXMuX2VuY29kaW5nc1tpXVsxXV1bMF0gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5fRkJVLnpsaWJzW2ldID0gbmV3IF9pbmZsYXRvcjIuZGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9wcmludF9zdGF0czogZnVuY3Rpb24gKCkge1xuICAgICAgICBMb2cuSW5mbyhcIkVuY29kaW5nIHN0YXRzIGZvciB0aGlzIGNvbm5lY3Rpb246XCIpO1xuICAgICAgICB2YXIgaSwgcztcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRoaXMuX2VuY29kaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcyA9IHRoaXMuX2VuY1N0YXRzW3RoaXMuX2VuY29kaW5nc1tpXVsxXV07XG4gICAgICAgICAgICBpZiAoc1swXSArIHNbMV0gPiAwKSB7XG4gICAgICAgICAgICAgICAgTG9nLkluZm8oXCIgICAgXCIgKyB0aGlzLl9lbmNvZGluZ3NbaV1bMF0gKyBcIjogXCIgKyBzWzBdICsgXCIgcmVjdHNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBMb2cuSW5mbyhcIkVuY29kaW5nIHN0YXRzIHNpbmNlIHBhZ2UgbG9hZDpcIik7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9lbmNvZGluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHMgPSB0aGlzLl9lbmNTdGF0c1t0aGlzLl9lbmNvZGluZ3NbaV1bMV1dO1xuICAgICAgICAgICAgTG9nLkluZm8oXCIgICAgXCIgKyB0aGlzLl9lbmNvZGluZ3NbaV1bMF0gKyBcIjogXCIgKyBzWzFdICsgXCIgcmVjdHNcIik7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX2NsZWFudXA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl92aWV3X29ubHkpIHtcbiAgICAgICAgICAgIHRoaXMuX2tleWJvYXJkLnVuZ3JhYigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fdmlld19vbmx5KSB7XG4gICAgICAgICAgICB0aGlzLl9tb3VzZS51bmdyYWIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kaXNwbGF5LmRlZmF1bHRDdXJzb3IoKTtcbiAgICAgICAgaWYgKExvZy5nZXRfbG9nZ2luZygpICE9PSAnZGVidWcnKSB7XG4gICAgICAgICAgICAvLyBTaG93IG5vVk5DIGxvZ28gb24gbG9hZCBhbmQgd2hlbiBkaXNjb25uZWN0ZWQsIHVubGVzcyBpblxuICAgICAgICAgICAgLy8gZGVidWcgbW9kZVxuICAgICAgICAgICAgdGhpcy5fZGlzcGxheS5jbGVhcigpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qXG4gICAgICogQ29ubmVjdGlvbiBzdGF0ZXM6XG4gICAgICogICBjb25uZWN0aW5nXG4gICAgICogICBjb25uZWN0ZWRcbiAgICAgKiAgIGRpc2Nvbm5lY3RpbmdcbiAgICAgKiAgIGRpc2Nvbm5lY3RlZCAtIHBlcm1hbmVudCBzdGF0ZVxuICAgICAqL1xuICAgIF91cGRhdGVDb25uZWN0aW9uU3RhdGU6IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB2YXIgb2xkc3RhdGUgPSB0aGlzLl9yZmJfY29ubmVjdGlvbl9zdGF0ZTtcblxuICAgICAgICBpZiAoc3RhdGUgPT09IG9sZHN0YXRlKSB7XG4gICAgICAgICAgICBMb2cuRGVidWcoXCJBbHJlYWR5IGluIHN0YXRlICdcIiArIHN0YXRlICsgXCInLCBpZ25vcmluZ1wiKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSAnZGlzY29ubmVjdGVkJyBzdGF0ZSBpcyBwZXJtYW5lbnQgZm9yIGVhY2ggUkZCIG9iamVjdFxuICAgICAgICBpZiAob2xkc3RhdGUgPT09ICdkaXNjb25uZWN0ZWQnKSB7XG4gICAgICAgICAgICBMb2cuRXJyb3IoXCJUcmllZCBjaGFuZ2luZyBzdGF0ZSBvZiBhIGRpc2Nvbm5lY3RlZCBSRkIgb2JqZWN0XCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5zdXJlIHByb3BlciB0cmFuc2l0aW9ucyBiZWZvcmUgZG9pbmcgYW55dGhpbmdcbiAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSAnY29ubmVjdGVkJzpcbiAgICAgICAgICAgICAgICBpZiAob2xkc3RhdGUgIT09ICdjb25uZWN0aW5nJykge1xuICAgICAgICAgICAgICAgICAgICBMb2cuRXJyb3IoXCJCYWQgdHJhbnNpdGlvbiB0byBjb25uZWN0ZWQgc3RhdGUsIFwiICsgXCJwcmV2aW91cyBjb25uZWN0aW9uIHN0YXRlOiBcIiArIG9sZHN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnZGlzY29ubmVjdGVkJzpcbiAgICAgICAgICAgICAgICBpZiAob2xkc3RhdGUgIT09ICdkaXNjb25uZWN0aW5nJykge1xuICAgICAgICAgICAgICAgICAgICBMb2cuRXJyb3IoXCJCYWQgdHJhbnNpdGlvbiB0byBkaXNjb25uZWN0ZWQgc3RhdGUsIFwiICsgXCJwcmV2aW91cyBjb25uZWN0aW9uIHN0YXRlOiBcIiArIG9sZHN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnY29ubmVjdGluZyc6XG4gICAgICAgICAgICAgICAgaWYgKG9sZHN0YXRlICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICBMb2cuRXJyb3IoXCJCYWQgdHJhbnNpdGlvbiB0byBjb25uZWN0aW5nIHN0YXRlLCBcIiArIFwicHJldmlvdXMgY29ubmVjdGlvbiBzdGF0ZTogXCIgKyBvbGRzdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ2Rpc2Nvbm5lY3RpbmcnOlxuICAgICAgICAgICAgICAgIGlmIChvbGRzdGF0ZSAhPT0gJ2Nvbm5lY3RlZCcgJiYgb2xkc3RhdGUgIT09ICdjb25uZWN0aW5nJykge1xuICAgICAgICAgICAgICAgICAgICBMb2cuRXJyb3IoXCJCYWQgdHJhbnNpdGlvbiB0byBkaXNjb25uZWN0aW5nIHN0YXRlLCBcIiArIFwicHJldmlvdXMgY29ubmVjdGlvbiBzdGF0ZTogXCIgKyBvbGRzdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgTG9nLkVycm9yKFwiVW5rbm93biBjb25uZWN0aW9uIHN0YXRlOiBcIiArIHN0YXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGF0ZSBjaGFuZ2UgYWN0aW9uc1xuXG4gICAgICAgIHRoaXMuX3JmYl9jb25uZWN0aW9uX3N0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMuX29uVXBkYXRlU3RhdGUodGhpcywgc3RhdGUsIG9sZHN0YXRlKTtcblxuICAgICAgICB2YXIgc21zZyA9IFwiTmV3IHN0YXRlICdcIiArIHN0YXRlICsgXCInLCB3YXMgJ1wiICsgb2xkc3RhdGUgKyBcIicuXCI7XG4gICAgICAgIExvZy5EZWJ1ZyhzbXNnKTtcblxuICAgICAgICBpZiAodGhpcy5fZGlzY29ublRpbWVyICYmIHN0YXRlICE9PSAnZGlzY29ubmVjdGluZycpIHtcbiAgICAgICAgICAgIExvZy5EZWJ1ZyhcIkNsZWFyaW5nIGRpc2Nvbm5lY3QgdGltZXJcIik7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fZGlzY29ublRpbWVyKTtcbiAgICAgICAgICAgIHRoaXMuX2Rpc2Nvbm5UaW1lciA9IG51bGw7XG5cbiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgYSBkb3VibGUgZXZlbnRcbiAgICAgICAgICAgIHRoaXMuX3NvY2sub2ZmKCdjbG9zZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSAnZGlzY29ubmVjdGVkJzpcbiAgICAgICAgICAgICAgICAvLyBDYWxsIG9uRGlzY29ubmVjdGVkIGNhbGxiYWNrIGFmdGVyIG9uVXBkYXRlU3RhdGUgc2luY2VcbiAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBrbm93IGlmIHRoZSBVSSBvbmx5IGRpc3BsYXlzIHRoZSBsYXRlc3QgbWVzc2FnZVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yZmJfZGlzY29ubmVjdF9yZWFzb24gIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25EaXNjb25uZWN0ZWQodGhpcywgdGhpcy5fcmZiX2Rpc2Nvbm5lY3RfcmVhc29uKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBObyByZWFzb24gbWVhbnMgY2xlYW4gZGlzY29ubmVjdFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkRpc2Nvbm5lY3RlZCh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ2Nvbm5lY3RpbmcnOlxuICAgICAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnZGlzY29ubmVjdGluZyc6XG4gICAgICAgICAgICAgICAgdGhpcy5fZGlzY29ubmVjdCgpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fZGlzY29ublRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JmYl9kaXNjb25uZWN0X3JlYXNvbiA9ICgwLCBfbG9jYWxpemF0aW9uMi5kZWZhdWx0KShcIkRpc2Nvbm5lY3QgdGltZW91dFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29ubmVjdGlvblN0YXRlKCdkaXNjb25uZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICB9LmJpbmQodGhpcyksIHRoaXMuX2Rpc2Nvbm5lY3RUaW1lb3V0ICogMTAwMCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyogUHJpbnQgZXJyb3JzIGFuZCBkaXNjb25uZWN0XG4gICAgICpcbiAgICAgKiBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyICdkZXRhaWxzJyBpcyB1c2VkIGZvciBpbmZvcm1hdGlvbiB0aGF0XG4gICAgICogc2hvdWxkIGJlIGxvZ2dlZCBidXQgbm90IHNlbnQgdG8gdGhlIHVzZXIgaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIF9mYWlsOiBmdW5jdGlvbiAobXNnLCBkZXRhaWxzKSB7XG4gICAgICAgIHZhciBmdWxsbXNnID0gbXNnO1xuICAgICAgICBpZiAodHlwZW9mIGRldGFpbHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBmdWxsbXNnID0gbXNnICsgXCIgKFwiICsgZGV0YWlscyArIFwiKVwiO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodGhpcy5fcmZiX2Nvbm5lY3Rpb25fc3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Rpc2Nvbm5lY3RpbmcnOlxuICAgICAgICAgICAgICAgIExvZy5FcnJvcihcIkZhaWxlZCB3aGVuIGRpc2Nvbm5lY3Rpbmc6IFwiICsgZnVsbG1zZyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjb25uZWN0ZWQnOlxuICAgICAgICAgICAgICAgIExvZy5FcnJvcihcIkZhaWxlZCB3aGlsZSBjb25uZWN0ZWQ6IFwiICsgZnVsbG1zZyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdjb25uZWN0aW5nJzpcbiAgICAgICAgICAgICAgICBMb2cuRXJyb3IoXCJGYWlsZWQgd2hlbiBjb25uZWN0aW5nOiBcIiArIGZ1bGxtc2cpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBMb2cuRXJyb3IoXCJSRkIgZmFpbHVyZTogXCIgKyBmdWxsbXNnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZmJfZGlzY29ubmVjdF9yZWFzb24gPSBtc2c7IC8vVGhpcyBpcyBzZW50IHRvIHRoZSBVSVxuXG4gICAgICAgIC8vIFRyYW5zaXRpb24gdG8gZGlzY29ubmVjdGVkIHdpdGhvdXQgd2FpdGluZyBmb3Igc29ja2V0IHRvIGNsb3NlXG4gICAgICAgIHRoaXMuX3VwZGF0ZUNvbm5lY3Rpb25TdGF0ZSgnZGlzY29ubmVjdGluZycpO1xuICAgICAgICB0aGlzLl91cGRhdGVDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAgKiBTZW5kIGEgbm90aWZpY2F0aW9uIHRvIHRoZSBVSS4gVmFsaWQgbGV2ZWxzIGFyZTpcbiAgICAgKiAgICdub3JtYWwnfCd3YXJuJ3wnZXJyb3InXG4gICAgICpcbiAgICAgKiAgIE5PVEU6IE9wdGlvbnMgY291bGQgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgKiAgIE5PVEU6IElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzLCByZW1lbWJlciB0aGF0IHRoZVxuICAgICAqICAgICAgICAgaW50ZXJmYWNlIGNvdWxkIGJlIG9ubHkgc2hvd2luZyB0aGUgbGF0ZXN0IG5vdGlmaWNhdGlvbi5cbiAgICAgKi9cbiAgICBfbm90aWZpY2F0aW9uOiBmdW5jdGlvbiAobXNnLCBsZXZlbCwgb3B0aW9ucykge1xuICAgICAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICAgICAgICBjYXNlICdub3JtYWwnOlxuICAgICAgICAgICAgY2FzZSAnd2Fybic6XG4gICAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICAgICAgTG9nLkRlYnVnKFwiTm90aWZpY2F0aW9uW1wiICsgbGV2ZWwgKyBcIl06XCIgKyBtc2cpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBMb2cuRXJyb3IoXCJJbnZhbGlkIG5vdGlmaWNhdGlvbiBsZXZlbDogXCIgKyBsZXZlbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMuX29uTm90aWZpY2F0aW9uKHRoaXMsIG1zZywgbGV2ZWwsIG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fb25Ob3RpZmljYXRpb24odGhpcywgbXNnLCBsZXZlbCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX2hhbmRsZV9tZXNzYWdlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9zb2NrLnJRbGVuKCkgPT09IDApIHtcbiAgICAgICAgICAgIExvZy5XYXJuKFwiaGFuZGxlX21lc3NhZ2UgY2FsbGVkIG9uIGFuIGVtcHR5IHJlY2VpdmUgcXVldWVcIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHRoaXMuX3JmYl9jb25uZWN0aW9uX3N0YXRlKSB7XG4gICAgICAgICAgICBjYXNlICdkaXNjb25uZWN0ZWQnOlxuICAgICAgICAgICAgICAgIExvZy5FcnJvcihcIkdvdCBkYXRhIHdoaWxlIGRpc2Nvbm5lY3RlZFwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Nvbm5lY3RlZCc6XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2ZsdXNoaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX25vcm1hbF9tc2coKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclFsZW4oKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRoaXMuX2luaXRfbXNnKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX2hhbmRsZUtleVByZXNzOiBmdW5jdGlvbiAoa2V5ZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX3ZpZXdfb25seSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIFZpZXcgb25seSwgc2tpcCBrZXlib2FyZCwgZXZlbnRzXG5cbiAgICAgICAgdmFyIGRvd24gPSBrZXlldmVudC50eXBlID09ICdrZXlkb3duJztcbiAgICAgICAgaWYgKHRoaXMuX3FlbXVFeHRLZXlFdmVudFN1cHBvcnRlZCkge1xuICAgICAgICAgICAgdmFyIHNjYW5jb2RlID0gX3h0c2NhbmNvZGVzMi5kZWZhdWx0W2tleWV2ZW50LmNvZGVdO1xuICAgICAgICAgICAgaWYgKHNjYW5jb2RlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleXN5bSA9IGtleWV2ZW50LmtleXN5bTtcbiAgICAgICAgICAgICAgICBSRkIubWVzc2FnZXMuUUVNVUV4dGVuZGVkS2V5RXZlbnQodGhpcy5fc29jaywga2V5c3ltLCBkb3duLCBzY2FuY29kZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIExvZy5FcnJvcignVW5hYmxlIHRvIGZpbmQgYSB4dCBzY2FuY29kZSBmb3IgY29kZSA9ICcgKyBrZXlldmVudC5jb2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGtleXN5bSA9IGtleWV2ZW50LmtleXN5bS5rZXlzeW07XG4gICAgICAgICAgICBSRkIubWVzc2FnZXMua2V5RXZlbnQodGhpcy5fc29jaywga2V5c3ltLCBkb3duKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfaGFuZGxlTW91c2VCdXR0b246IGZ1bmN0aW9uICh4LCB5LCBkb3duLCBibWFzaykge1xuICAgICAgICBpZiAoZG93bikge1xuICAgICAgICAgICAgdGhpcy5fbW91c2VfYnV0dG9uTWFzayB8PSBibWFzaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX21vdXNlX2J1dHRvbk1hc2sgXj0gYm1hc2s7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fdmlld3BvcnREcmFnKSB7XG4gICAgICAgICAgICBpZiAoZG93biAmJiAhdGhpcy5fdmlld3BvcnREcmFnZ2luZykge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdwb3J0RHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdwb3J0RHJhZ1BvcyA9IHsgJ3gnOiB4LCAneSc6IHkgfTtcblxuICAgICAgICAgICAgICAgIC8vIFNraXAgc2VuZGluZyBtb3VzZSBldmVudHNcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdwb3J0RHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSB2aWV3cG9ydCBkaWRuJ3QgYWN0dWFsbHkgbW92ZSwgdGhlbiB0cmVhdCBhcyBhIG1vdXNlIGNsaWNrIGV2ZW50XG4gICAgICAgICAgICAgICAgLy8gU2VuZCB0aGUgYnV0dG9uIGRvd24gZXZlbnQgaGVyZSwgYXMgdGhlIGJ1dHRvbiB1cCBldmVudCBpcyBzZW50IGF0IHRoZSBlbmQgb2YgdGhpcyBmdW5jdGlvblxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fdmlld3BvcnRIYXNNb3ZlZCAmJiAhdGhpcy5fdmlld19vbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgIFJGQi5tZXNzYWdlcy5wb2ludGVyRXZlbnQodGhpcy5fc29jaywgdGhpcy5fZGlzcGxheS5hYnNYKHgpLCB0aGlzLl9kaXNwbGF5LmFic1koeSksIGJtYXNrKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fdmlld3BvcnRIYXNNb3ZlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3ZpZXdfb25seSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IC8vIFZpZXcgb25seSwgc2tpcCBtb3VzZSBldmVudHNcblxuICAgICAgICBpZiAodGhpcy5fcmZiX2Nvbm5lY3Rpb25fc3RhdGUgIT09ICdjb25uZWN0ZWQnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgUkZCLm1lc3NhZ2VzLnBvaW50ZXJFdmVudCh0aGlzLl9zb2NrLCB0aGlzLl9kaXNwbGF5LmFic1goeCksIHRoaXMuX2Rpc3BsYXkuYWJzWSh5KSwgdGhpcy5fbW91c2VfYnV0dG9uTWFzayk7XG4gICAgfSxcblxuICAgIF9oYW5kbGVNb3VzZU1vdmU6IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIGlmICh0aGlzLl92aWV3cG9ydERyYWdnaW5nKSB7XG4gICAgICAgICAgICB2YXIgZGVsdGFYID0gdGhpcy5fdmlld3BvcnREcmFnUG9zLnggLSB4O1xuICAgICAgICAgICAgdmFyIGRlbHRhWSA9IHRoaXMuX3ZpZXdwb3J0RHJhZ1Bvcy55IC0geTtcblxuICAgICAgICAgICAgLy8gVGhlIGdvYWwgaXMgdG8gdHJpZ2dlciBvbiBhIGNlcnRhaW4gcGh5c2ljYWwgd2lkdGgsIHRoZVxuICAgICAgICAgICAgLy8gZGV2aWNlUGl4ZWxSYXRpbyBicmluZ3MgdXMgYSBiaXQgY2xvc2VyIGJ1dCBpcyBub3Qgb3B0aW1hbC5cbiAgICAgICAgICAgIHZhciBkcmFnVGhyZXNob2xkID0gMTAgKiAod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl92aWV3cG9ydEhhc01vdmVkIHx8IE1hdGguYWJzKGRlbHRhWCkgPiBkcmFnVGhyZXNob2xkIHx8IE1hdGguYWJzKGRlbHRhWSkgPiBkcmFnVGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdmlld3BvcnRIYXNNb3ZlZCA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICB0aGlzLl92aWV3cG9ydERyYWdQb3MgPSB7ICd4JzogeCwgJ3knOiB5IH07XG4gICAgICAgICAgICAgICAgdGhpcy5fZGlzcGxheS52aWV3cG9ydENoYW5nZVBvcyhkZWx0YVgsIGRlbHRhWSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNraXAgc2VuZGluZyBtb3VzZSBldmVudHNcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl92aWV3X29ubHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBWaWV3IG9ubHksIHNraXAgbW91c2UgZXZlbnRzXG5cbiAgICAgICAgaWYgKHRoaXMuX3JmYl9jb25uZWN0aW9uX3N0YXRlICE9PSAnY29ubmVjdGVkJykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFJGQi5tZXNzYWdlcy5wb2ludGVyRXZlbnQodGhpcy5fc29jaywgdGhpcy5fZGlzcGxheS5hYnNYKHgpLCB0aGlzLl9kaXNwbGF5LmFic1koeSksIHRoaXMuX21vdXNlX2J1dHRvbk1hc2spO1xuICAgIH0sXG5cbiAgICAvLyBNZXNzYWdlIEhhbmRsZXJzXG5cbiAgICBfbmVnb3RpYXRlX3Byb3RvY29sX3ZlcnNpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3NvY2suclFsZW4oKSA8IDEyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZmFpbChcIkVycm9yIHdoaWxlIG5lZ290aWF0aW5nIHdpdGggc2VydmVyXCIsIFwiSW5jb21wbGV0ZSBwcm90b2NvbCB2ZXJzaW9uXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN2ZXJzaW9uID0gdGhpcy5fc29jay5yUXNoaWZ0U3RyKDEyKS5zdWJzdHIoNCwgNyk7XG4gICAgICAgIExvZy5JbmZvKFwiU2VydmVyIFByb3RvY29sVmVyc2lvbjogXCIgKyBzdmVyc2lvbik7XG4gICAgICAgIHZhciBpc19yZXBlYXRlciA9IDA7XG4gICAgICAgIHN3aXRjaCAoc3ZlcnNpb24pIHtcbiAgICAgICAgICAgIGNhc2UgXCIwMDAuMDAwXCI6XG4gICAgICAgICAgICAgICAgLy8gVWx0cmFWTkMgcmVwZWF0ZXJcbiAgICAgICAgICAgICAgICBpc19yZXBlYXRlciA9IDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiMDAzLjAwM1wiOlxuICAgICAgICAgICAgY2FzZSBcIjAwMy4wMDZcIjogLy8gVWx0cmFWTkNcbiAgICAgICAgICAgIGNhc2UgXCIwMDMuODg5XCI6XG4gICAgICAgICAgICAgICAgLy8gQXBwbGUgUmVtb3RlIERlc2t0b3BcbiAgICAgICAgICAgICAgICB0aGlzLl9yZmJfdmVyc2lvbiA9IDMuMztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCIwMDMuMDA3XCI6XG4gICAgICAgICAgICAgICAgdGhpcy5fcmZiX3ZlcnNpb24gPSAzLjc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiMDAzLjAwOFwiOlxuICAgICAgICAgICAgY2FzZSBcIjAwNC4wMDBcIjogLy8gSW50ZWwgQU1UIEtWTVxuICAgICAgICAgICAgY2FzZSBcIjAwNC4wMDFcIjogLy8gUmVhbFZOQyA0LjZcbiAgICAgICAgICAgIGNhc2UgXCIwMDUuMDAwXCI6XG4gICAgICAgICAgICAgICAgLy8gUmVhbFZOQyA1LjNcbiAgICAgICAgICAgICAgICB0aGlzLl9yZmJfdmVyc2lvbiA9IDMuODtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZhaWwoXCJVbnN1cHBvcnRlZCBzZXJ2ZXJcIiwgXCJJbnZhbGlkIHNlcnZlciB2ZXJzaW9uOiBcIiArIHN2ZXJzaW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc19yZXBlYXRlcikge1xuICAgICAgICAgICAgdmFyIHJlcGVhdGVySUQgPSB0aGlzLl9yZXBlYXRlcklEO1xuICAgICAgICAgICAgd2hpbGUgKHJlcGVhdGVySUQubGVuZ3RoIDwgMjUwKSB7XG4gICAgICAgICAgICAgICAgcmVwZWF0ZXJJRCArPSBcIlxcMFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fc29jay5zZW5kX3N0cmluZyhyZXBlYXRlcklEKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX3JmYl92ZXJzaW9uID4gdGhpcy5fcmZiX21heF92ZXJzaW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9yZmJfdmVyc2lvbiA9IHRoaXMuX3JmYl9tYXhfdmVyc2lvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjdmVyc2lvbiA9IFwiMDBcIiArIHBhcnNlSW50KHRoaXMuX3JmYl92ZXJzaW9uLCAxMCkgKyBcIi4wMFwiICsgdGhpcy5fcmZiX3ZlcnNpb24gKiAxMCAlIDEwO1xuICAgICAgICB0aGlzLl9zb2NrLnNlbmRfc3RyaW5nKFwiUkZCIFwiICsgY3ZlcnNpb24gKyBcIlxcblwiKTtcbiAgICAgICAgTG9nLkRlYnVnKCdTZW50IFByb3RvY29sVmVyc2lvbjogJyArIGN2ZXJzaW9uKTtcblxuICAgICAgICB0aGlzLl9yZmJfaW5pdF9zdGF0ZSA9ICdTZWN1cml0eSc7XG4gICAgfSxcblxuICAgIF9uZWdvdGlhdGVfc2VjdXJpdHk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUG9seWZpbGwgc2luY2UgSUUgYW5kIFBoYW50b21KUyBkb2Vzbid0IGhhdmVcbiAgICAgICAgLy8gVHlwZWRBcnJheS5pbmNsdWRlcygpXG4gICAgICAgIGZ1bmN0aW9uIGluY2x1ZGVzKGl0ZW0sIGFycmF5KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldID09PSBpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9yZmJfdmVyc2lvbiA+PSAzLjcpIHtcbiAgICAgICAgICAgIC8vIFNlcnZlciBzZW5kcyBzdXBwb3J0ZWQgbGlzdCwgY2xpZW50IGRlY2lkZXNcbiAgICAgICAgICAgIHZhciBudW1fdHlwZXMgPSB0aGlzLl9zb2NrLnJRc2hpZnQ4KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJzZWN1cml0eSB0eXBlXCIsIG51bV90eXBlcywgMSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChudW1fdHlwZXMgPT09IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RybGVuID0gdGhpcy5fc29jay5yUXNoaWZ0MzIoKTtcbiAgICAgICAgICAgICAgICB2YXIgcmVhc29uID0gdGhpcy5fc29jay5yUXNoaWZ0U3RyKHN0cmxlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZhaWwoXCJFcnJvciB3aGlsZSBuZWdvdGlhdGluZyB3aXRoIHNlcnZlclwiLCBcIlNlY3VyaXR5IGZhaWx1cmU6IFwiICsgcmVhc29uKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHR5cGVzID0gdGhpcy5fc29jay5yUXNoaWZ0Qnl0ZXMobnVtX3R5cGVzKTtcbiAgICAgICAgICAgIExvZy5EZWJ1ZyhcIlNlcnZlciBzZWN1cml0eSB0eXBlczogXCIgKyB0eXBlcyk7XG5cbiAgICAgICAgICAgIC8vIExvb2sgZm9yIGVhY2ggYXV0aCBpbiBwcmVmZXJyZWQgb3JkZXJcbiAgICAgICAgICAgIHRoaXMuX3JmYl9hdXRoX3NjaGVtZSA9IDA7XG4gICAgICAgICAgICBpZiAoaW5jbHVkZXMoMSwgdHlwZXMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmZiX2F1dGhfc2NoZW1lID0gMTsgLy8gTm9uZVxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbmNsdWRlcygyMiwgdHlwZXMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmZiX2F1dGhfc2NoZW1lID0gMjI7IC8vIFhWUFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbmNsdWRlcygxNiwgdHlwZXMpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmZiX2F1dGhfc2NoZW1lID0gMTY7IC8vIFRpZ2h0XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGluY2x1ZGVzKDIsIHR5cGVzKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JmYl9hdXRoX3NjaGVtZSA9IDI7IC8vIFZOQyBBdXRoXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKFwiVW5zdXBwb3J0ZWQgc2VydmVyXCIsIFwiVW5zdXBwb3J0ZWQgc2VjdXJpdHkgdHlwZXM6IFwiICsgdHlwZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9zb2NrLnNlbmQoW3RoaXMuX3JmYl9hdXRoX3NjaGVtZV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gU2VydmVyIGRlY2lkZXNcbiAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdChcInNlY3VyaXR5IHNjaGVtZVwiLCA0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3JmYl9hdXRoX3NjaGVtZSA9IHRoaXMuX3NvY2suclFzaGlmdDMyKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZmJfaW5pdF9zdGF0ZSA9ICdBdXRoZW50aWNhdGlvbic7XG4gICAgICAgIExvZy5EZWJ1ZygnQXV0aGVudGljYXRpbmcgdXNpbmcgc2NoZW1lOiAnICsgdGhpcy5fcmZiX2F1dGhfc2NoZW1lKTtcblxuICAgICAgICByZXR1cm4gdGhpcy5faW5pdF9tc2coKTsgLy8ganVtcCB0byBhdXRoZW50aWNhdGlvblxuICAgIH0sXG5cbiAgICAvLyBhdXRoZW50aWNhdGlvblxuICAgIF9uZWdvdGlhdGVfeHZwX2F1dGg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHh2cF9zZXAgPSB0aGlzLl94dnBfcGFzc3dvcmRfc2VwO1xuICAgICAgICB2YXIgeHZwX2F1dGggPSB0aGlzLl9yZmJfcGFzc3dvcmQuc3BsaXQoeHZwX3NlcCk7XG4gICAgICAgIGlmICh4dnBfYXV0aC5sZW5ndGggPCAzKSB7XG4gICAgICAgICAgICB2YXIgbXNnID0gJ1hWUCBjcmVkZW50aWFscyByZXF1aXJlZCAodXNlcicgKyB4dnBfc2VwICsgJ3RhcmdldCcgKyB4dnBfc2VwICsgJ3Bhc3N3b3JkKSAtLSBnb3Qgb25seSAnICsgdGhpcy5fcmZiX3Bhc3N3b3JkO1xuICAgICAgICAgICAgdGhpcy5fb25QYXNzd29yZFJlcXVpcmVkKHRoaXMsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgeHZwX2F1dGhfc3RyID0gU3RyaW5nLmZyb21DaGFyQ29kZSh4dnBfYXV0aFswXS5sZW5ndGgpICsgU3RyaW5nLmZyb21DaGFyQ29kZSh4dnBfYXV0aFsxXS5sZW5ndGgpICsgeHZwX2F1dGhbMF0gKyB4dnBfYXV0aFsxXTtcbiAgICAgICAgdGhpcy5fc29jay5zZW5kX3N0cmluZyh4dnBfYXV0aF9zdHIpO1xuICAgICAgICB0aGlzLl9yZmJfcGFzc3dvcmQgPSB4dnBfYXV0aC5zbGljZSgyKS5qb2luKHh2cF9zZXApO1xuICAgICAgICB0aGlzLl9yZmJfYXV0aF9zY2hlbWUgPSAyO1xuICAgICAgICByZXR1cm4gdGhpcy5fbmVnb3RpYXRlX2F1dGhlbnRpY2F0aW9uKCk7XG4gICAgfSxcblxuICAgIF9uZWdvdGlhdGVfc3RkX3ZuY19hdXRoOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9yZmJfcGFzc3dvcmQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9vblBhc3N3b3JkUmVxdWlyZWQodGhpcyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJhdXRoIGNoYWxsZW5nZVwiLCAxNikpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE8oZGlyZWN0eG1hbjEyKTogbWFrZSBnZW5ERVMgbm90IHJlcXVpcmUgYW4gQXJyYXlcbiAgICAgICAgdmFyIGNoYWxsZW5nZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX3NvY2suclFzaGlmdEJ5dGVzKDE2KSk7XG4gICAgICAgIHZhciByZXNwb25zZSA9IFJGQi5nZW5ERVModGhpcy5fcmZiX3Bhc3N3b3JkLCBjaGFsbGVuZ2UpO1xuICAgICAgICB0aGlzLl9zb2NrLnNlbmQocmVzcG9uc2UpO1xuICAgICAgICB0aGlzLl9yZmJfaW5pdF9zdGF0ZSA9IFwiU2VjdXJpdHlSZXN1bHRcIjtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIF9uZWdvdGlhdGVfdGlnaHRfdHVubmVsczogZnVuY3Rpb24gKG51bVR1bm5lbHMpIHtcbiAgICAgICAgdmFyIGNsaWVudFN1cHBvcnRlZFR1bm5lbFR5cGVzID0ge1xuICAgICAgICAgICAgMDogeyB2ZW5kb3I6ICdUR0hUJywgc2lnbmF0dXJlOiAnTk9UVU5ORUwnIH1cbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHNlcnZlclN1cHBvcnRlZFR1bm5lbFR5cGVzID0ge307XG4gICAgICAgIC8vIHJlY2VpdmUgdHVubmVsIGNhcGFiaWxpdGllc1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVR1bm5lbHM7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNhcF9jb2RlID0gdGhpcy5fc29jay5yUXNoaWZ0MzIoKTtcbiAgICAgICAgICAgIHZhciBjYXBfdmVuZG9yID0gdGhpcy5fc29jay5yUXNoaWZ0U3RyKDQpO1xuICAgICAgICAgICAgdmFyIGNhcF9zaWduYXR1cmUgPSB0aGlzLl9zb2NrLnJRc2hpZnRTdHIoOCk7XG4gICAgICAgICAgICBzZXJ2ZXJTdXBwb3J0ZWRUdW5uZWxUeXBlc1tjYXBfY29kZV0gPSB7IHZlbmRvcjogY2FwX3ZlbmRvciwgc2lnbmF0dXJlOiBjYXBfc2lnbmF0dXJlIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaG9vc2UgdGhlIG5vdHVubmVsIHR5cGVcbiAgICAgICAgaWYgKHNlcnZlclN1cHBvcnRlZFR1bm5lbFR5cGVzWzBdKSB7XG4gICAgICAgICAgICBpZiAoc2VydmVyU3VwcG9ydGVkVHVubmVsVHlwZXNbMF0udmVuZG9yICE9IGNsaWVudFN1cHBvcnRlZFR1bm5lbFR5cGVzWzBdLnZlbmRvciB8fCBzZXJ2ZXJTdXBwb3J0ZWRUdW5uZWxUeXBlc1swXS5zaWduYXR1cmUgIT0gY2xpZW50U3VwcG9ydGVkVHVubmVsVHlwZXNbMF0uc2lnbmF0dXJlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZhaWwoXCJVbnN1cHBvcnRlZCBzZXJ2ZXJcIiwgXCJDbGllbnQncyB0dW5uZWwgdHlwZSBoYWQgdGhlIGluY29ycmVjdCBcIiArIFwidmVuZG9yIG9yIHNpZ25hdHVyZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3NvY2suc2VuZChbMCwgMCwgMCwgMF0pOyAvLyB1c2UgTk9UVU5ORUxcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gd2FpdCB1bnRpbCB3ZSByZWNlaXZlIHRoZSBzdWIgYXV0aCBjb3VudCB0byBjb250aW51ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZhaWwoXCJVbnN1cHBvcnRlZCBzZXJ2ZXJcIiwgXCJTZXJ2ZXIgd2FudGVkIHR1bm5lbHMsIGJ1dCBkb2Vzbid0IHN1cHBvcnQgXCIgKyBcInRoZSBub3R1bm5lbCB0eXBlXCIpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9uZWdvdGlhdGVfdGlnaHRfYXV0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3JmYl90aWdodHZuYykge1xuICAgICAgICAgICAgLy8gZmlyc3QgcGFzcywgZG8gdGhlIHR1bm5lbCBuZWdvdGlhdGlvblxuICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwibnVtIHR1bm5lbHNcIiwgNCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgbnVtVHVubmVscyA9IHRoaXMuX3NvY2suclFzaGlmdDMyKCk7XG4gICAgICAgICAgICBpZiAobnVtVHVubmVscyA+IDAgJiYgdGhpcy5fc29jay5yUXdhaXQoXCJ0dW5uZWwgY2FwYWJpbGl0aWVzXCIsIDE2ICogbnVtVHVubmVscywgNCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3JmYl90aWdodHZuYyA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmIChudW1UdW5uZWxzID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX25lZ290aWF0ZV90aWdodF90dW5uZWxzKG51bVR1bm5lbHMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gd2FpdCB1bnRpbCB3ZSByZWNlaXZlIHRoZSBzdWIgYXV0aCB0byBjb250aW51ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2Vjb25kIHBhc3MsIGRvIHRoZSBzdWItYXV0aCBuZWdvdGlhdGlvblxuICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJzdWIgYXV0aCBjb3VudFwiLCA0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzdWJBdXRoQ291bnQgPSB0aGlzLl9zb2NrLnJRc2hpZnQzMigpO1xuICAgICAgICBpZiAoc3ViQXV0aENvdW50ID09PSAwKSB7XG4gICAgICAgICAgICAvLyBlbXB0eSBzdWItYXV0aCBsaXN0IHJlY2VpdmVkIG1lYW5zICdubyBhdXRoJyBzdWJ0eXBlIHNlbGVjdGVkXG4gICAgICAgICAgICB0aGlzLl9yZmJfaW5pdF9zdGF0ZSA9ICdTZWN1cml0eVJlc3VsdCc7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdChcInN1YiBhdXRoIGNhcGFiaWxpdGllc1wiLCAxNiAqIHN1YkF1dGhDb3VudCwgNCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBjbGllbnRTdXBwb3J0ZWRUeXBlcyA9IHtcbiAgICAgICAgICAgICdTVERWTk9BVVRIX18nOiAxLFxuICAgICAgICAgICAgJ1NURFZWTkNBVVRIXyc6IDJcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgc2VydmVyU3VwcG9ydGVkVHlwZXMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1YkF1dGhDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2FwTnVtID0gdGhpcy5fc29jay5yUXNoaWZ0MzIoKTtcbiAgICAgICAgICAgIHZhciBjYXBhYmlsaXRpZXMgPSB0aGlzLl9zb2NrLnJRc2hpZnRTdHIoMTIpO1xuICAgICAgICAgICAgc2VydmVyU3VwcG9ydGVkVHlwZXMucHVzaChjYXBhYmlsaXRpZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgYXV0aFR5cGUgaW4gY2xpZW50U3VwcG9ydGVkVHlwZXMpIHtcbiAgICAgICAgICAgIGlmIChzZXJ2ZXJTdXBwb3J0ZWRUeXBlcy5pbmRleE9mKGF1dGhUeXBlKSAhPSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suc2VuZChbMCwgMCwgMCwgY2xpZW50U3VwcG9ydGVkVHlwZXNbYXV0aFR5cGVdXSk7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGF1dGhUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NURFZOT0FVVEhfXyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBhdXRoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZmJfaW5pdF9zdGF0ZSA9ICdTZWN1cml0eVJlc3VsdCc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnU1REVlZOQ0FVVEhfJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZOQyBhdXRoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZmJfYXV0aF9zY2hlbWUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRfbXNnKCk7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmFpbChcIlVuc3VwcG9ydGVkIHNlcnZlclwiLCBcIlVuc3VwcG9ydGVkIHRpbnkgYXV0aCBzY2hlbWU6IFwiICsgYXV0aFR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9mYWlsKFwiVW5zdXBwb3J0ZWQgc2VydmVyXCIsIFwiTm8gc3VwcG9ydGVkIHN1Yi1hdXRoIHR5cGVzIVwiKTtcbiAgICB9LFxuXG4gICAgX25lZ290aWF0ZV9hdXRoZW50aWNhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuX3JmYl9hdXRoX3NjaGVtZSkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZmFpbGVkXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwiYXV0aCByZWFzb25cIiwgNCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgc3RybGVuID0gdGhpcy5fc29jay5yUXNoaWZ0MzIoKTtcbiAgICAgICAgICAgICAgICB2YXIgcmVhc29uID0gdGhpcy5fc29jay5yUXNoaWZ0U3RyKHN0cmxlbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZhaWwoXCJBdXRoZW50aWNhdGlvbiBmYWlsdXJlXCIsIHJlYXNvbik7XG5cbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAvLyBubyBhdXRoXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3JmYl92ZXJzaW9uID49IDMuOCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZmJfaW5pdF9zdGF0ZSA9ICdTZWN1cml0eVJlc3VsdCc7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9yZmJfaW5pdF9zdGF0ZSA9ICdDbGllbnRJbml0aWFsaXNhdGlvbic7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRfbXNnKCk7XG5cbiAgICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICAgICAgLy8gWFZQIGF1dGhcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbmVnb3RpYXRlX3h2cF9hdXRoKCk7XG5cbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAvLyBWTkMgYXV0aGVudGljYXRpb25cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbmVnb3RpYXRlX3N0ZF92bmNfYXV0aCgpO1xuXG4gICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgIC8vIFRpZ2h0Vk5DIFNlY3VyaXR5IFR5cGVcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbmVnb3RpYXRlX3RpZ2h0X2F1dGgoKTtcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmFpbChcIlVuc3VwcG9ydGVkIHNlcnZlclwiLCBcIlVuc3VwcG9ydGVkIGF1dGggc2NoZW1lOiBcIiArIHRoaXMuX3JmYl9hdXRoX3NjaGVtZSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgX2hhbmRsZV9zZWN1cml0eV9yZXN1bHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KCdWTkMgYXV0aCByZXNwb25zZSAnLCA0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodGhpcy5fc29jay5yUXNoaWZ0MzIoKSkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIC8vIE9LXG4gICAgICAgICAgICAgICAgdGhpcy5fcmZiX2luaXRfc3RhdGUgPSAnQ2xpZW50SW5pdGlhbGlzYXRpb24nO1xuICAgICAgICAgICAgICAgIExvZy5EZWJ1ZygnQXV0aGVudGljYXRpb24gT0snKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW5pdF9tc2coKTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAvLyBmYWlsZWRcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcmZiX3ZlcnNpb24gPj0gMy44KSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsZW5ndGggPSB0aGlzLl9zb2NrLnJRc2hpZnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJTZWN1cml0eVJlc3VsdCByZWFzb25cIiwgbGVuZ3RoLCA4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciByZWFzb24gPSB0aGlzLl9zb2NrLnJRc2hpZnRTdHIobGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZhaWwoXCJBdXRoZW50aWNhdGlvbiBmYWlsdXJlXCIsIHJlYXNvbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZhaWwoXCJBdXRoZW50aWNhdGlvbiBmYWlsdXJlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZhaWwoXCJUb28gbWFueSBhdXRoZW50aWNhdGlvbiBhdHRlbXB0c1wiKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZhaWwoXCJVbnN1cHBvcnRlZCBzZXJ2ZXJcIiwgXCJVbmtub3duIFNlY3VyaXR5UmVzdWx0XCIpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9uZWdvdGlhdGVfc2VydmVyX2luaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwic2VydmVyIGluaXRpYWxpemF0aW9uXCIsIDI0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2NyZWVuIHNpemUgKi9cbiAgICAgICAgdGhpcy5fZmJfd2lkdGggPSB0aGlzLl9zb2NrLnJRc2hpZnQxNigpO1xuICAgICAgICB0aGlzLl9mYl9oZWlnaHQgPSB0aGlzLl9zb2NrLnJRc2hpZnQxNigpO1xuICAgICAgICB0aGlzLl9kZXN0QnVmZiA9IG5ldyBVaW50OEFycmF5KHRoaXMuX2ZiX3dpZHRoICogdGhpcy5fZmJfaGVpZ2h0ICogNCk7XG5cbiAgICAgICAgLyogUElYRUxfRk9STUFUICovXG4gICAgICAgIHZhciBicHAgPSB0aGlzLl9zb2NrLnJRc2hpZnQ4KCk7XG4gICAgICAgIHZhciBkZXB0aCA9IHRoaXMuX3NvY2suclFzaGlmdDgoKTtcbiAgICAgICAgdmFyIGJpZ19lbmRpYW4gPSB0aGlzLl9zb2NrLnJRc2hpZnQ4KCk7XG4gICAgICAgIHZhciB0cnVlX2NvbG9yID0gdGhpcy5fc29jay5yUXNoaWZ0OCgpO1xuXG4gICAgICAgIHZhciByZWRfbWF4ID0gdGhpcy5fc29jay5yUXNoaWZ0MTYoKTtcbiAgICAgICAgdmFyIGdyZWVuX21heCA9IHRoaXMuX3NvY2suclFzaGlmdDE2KCk7XG4gICAgICAgIHZhciBibHVlX21heCA9IHRoaXMuX3NvY2suclFzaGlmdDE2KCk7XG4gICAgICAgIHZhciByZWRfc2hpZnQgPSB0aGlzLl9zb2NrLnJRc2hpZnQ4KCk7XG4gICAgICAgIHZhciBncmVlbl9zaGlmdCA9IHRoaXMuX3NvY2suclFzaGlmdDgoKTtcbiAgICAgICAgdmFyIGJsdWVfc2hpZnQgPSB0aGlzLl9zb2NrLnJRc2hpZnQ4KCk7XG4gICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoMyk7IC8vIHBhZGRpbmdcblxuICAgICAgICAvLyBOQihkaXJlY3R4bWFuMTIpOiB3ZSBkb24ndCB3YW50IHRvIGNhbGwgYW55IGNhbGxiYWNrcyBvciBwcmludCBtZXNzYWdlcyB1bnRpbFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAqYWZ0ZXIqIHdlJ3JlIHBhc3QgdGhlIHBvaW50IHdoZXJlIHdlIGNvdWxkIGJhY2t0cmFja1xuXG4gICAgICAgIC8qIENvbm5lY3Rpb24gbmFtZS90aXRsZSAqL1xuICAgICAgICB2YXIgbmFtZV9sZW5ndGggPSB0aGlzLl9zb2NrLnJRc2hpZnQzMigpO1xuICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoJ3NlcnZlciBpbml0IG5hbWUnLCBuYW1lX2xlbmd0aCwgMjQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZmJfbmFtZSA9ICgwLCBfc3RyaW5ncy5kZWNvZGVVVEY4KSh0aGlzLl9zb2NrLnJRc2hpZnRTdHIobmFtZV9sZW5ndGgpKTtcblxuICAgICAgICBpZiAodGhpcy5fcmZiX3RpZ2h0dm5jKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoJ1RpZ2h0Vk5DIGV4dGVuZGVkIHNlcnZlciBpbml0IGhlYWRlcicsIDgsIDI0ICsgbmFtZV9sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSW4gVGlnaHRWTkMgbW9kZSwgU2VydmVySW5pdCBtZXNzYWdlIGlzIGV4dGVuZGVkXG4gICAgICAgICAgICB2YXIgbnVtU2VydmVyTWVzc2FnZXMgPSB0aGlzLl9zb2NrLnJRc2hpZnQxNigpO1xuICAgICAgICAgICAgdmFyIG51bUNsaWVudE1lc3NhZ2VzID0gdGhpcy5fc29jay5yUXNoaWZ0MTYoKTtcbiAgICAgICAgICAgIHZhciBudW1FbmNvZGluZ3MgPSB0aGlzLl9zb2NrLnJRc2hpZnQxNigpO1xuICAgICAgICAgICAgdGhpcy5fc29jay5yUXNraXBCeXRlcygyKTsgLy8gcGFkZGluZ1xuXG4gICAgICAgICAgICB2YXIgdG90YWxNZXNzYWdlc0xlbmd0aCA9IChudW1TZXJ2ZXJNZXNzYWdlcyArIG51bUNsaWVudE1lc3NhZ2VzICsgbnVtRW5jb2RpbmdzKSAqIDE2O1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KCdUaWdodFZOQyBleHRlbmRlZCBzZXJ2ZXIgaW5pdCBoZWFkZXInLCB0b3RhbE1lc3NhZ2VzTGVuZ3RoLCAzMiArIG5hbWVfbGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gd2UgZG9uJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgd2l0aCB0aGUgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiB0aGF0IFRJR0hUIHNlbmRzLFxuICAgICAgICAgICAgLy8gc28gd2UganVzdCBza2lwIHRoZSBhbGwgb2YgdGhpcy5cblxuICAgICAgICAgICAgLy8gVElHSFQgc2VydmVyIG1lc3NhZ2UgY2FwYWJpbGl0aWVzXG4gICAgICAgICAgICB0aGlzLl9zb2NrLnJRc2tpcEJ5dGVzKDE2ICogbnVtU2VydmVyTWVzc2FnZXMpO1xuXG4gICAgICAgICAgICAvLyBUSUdIVCBjbGllbnQgbWVzc2FnZSBjYXBhYmlsaXRpZXNcbiAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoMTYgKiBudW1DbGllbnRNZXNzYWdlcyk7XG5cbiAgICAgICAgICAgIC8vIFRJR0hUIGVuY29kaW5nIGNhcGFiaWxpdGllc1xuICAgICAgICAgICAgdGhpcy5fc29jay5yUXNraXBCeXRlcygxNiAqIG51bUVuY29kaW5ncyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOQihkaXJlY3R4bWFuMTIpOiB0aGVzZSBhcmUgZG93biBoZXJlIHNvIHRoYXQgd2UgZG9uJ3QgcnVuIHRoZW0gbXVsdGlwbGUgdGltZXNcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgaWYgd2UgYmFja3RyYWNrXG4gICAgICAgIExvZy5JbmZvKFwiU2NyZWVuOiBcIiArIHRoaXMuX2ZiX3dpZHRoICsgXCJ4XCIgKyB0aGlzLl9mYl9oZWlnaHQgKyBcIiwgYnBwOiBcIiArIGJwcCArIFwiLCBkZXB0aDogXCIgKyBkZXB0aCArIFwiLCBiaWdfZW5kaWFuOiBcIiArIGJpZ19lbmRpYW4gKyBcIiwgdHJ1ZV9jb2xvcjogXCIgKyB0cnVlX2NvbG9yICsgXCIsIHJlZF9tYXg6IFwiICsgcmVkX21heCArIFwiLCBncmVlbl9tYXg6IFwiICsgZ3JlZW5fbWF4ICsgXCIsIGJsdWVfbWF4OiBcIiArIGJsdWVfbWF4ICsgXCIsIHJlZF9zaGlmdDogXCIgKyByZWRfc2hpZnQgKyBcIiwgZ3JlZW5fc2hpZnQ6IFwiICsgZ3JlZW5fc2hpZnQgKyBcIiwgYmx1ZV9zaGlmdDogXCIgKyBibHVlX3NoaWZ0KTtcblxuICAgICAgICBpZiAoYmlnX2VuZGlhbiAhPT0gMCkge1xuICAgICAgICAgICAgTG9nLldhcm4oXCJTZXJ2ZXIgbmF0aXZlIGVuZGlhbiBpcyBub3QgbGl0dGxlIGVuZGlhblwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZWRfc2hpZnQgIT09IDE2KSB7XG4gICAgICAgICAgICBMb2cuV2FybihcIlNlcnZlciBuYXRpdmUgcmVkLXNoaWZ0IGlzIG5vdCAxNlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChibHVlX3NoaWZ0ICE9PSAwKSB7XG4gICAgICAgICAgICBMb2cuV2FybihcIlNlcnZlciBuYXRpdmUgYmx1ZS1zaGlmdCBpcyBub3QgMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdlJ3JlIHBhc3QgdGhlIHBvaW50IHdoZXJlIHdlIGNvdWxkIGJhY2t0cmFjaywgc28gaXQncyBzYWZlIHRvIGNhbGwgdGhpc1xuICAgICAgICB0aGlzLl9vbkRlc2t0b3BOYW1lKHRoaXMsIHRoaXMuX2ZiX25hbWUpO1xuXG4gICAgICAgIGlmICh0aGlzLl90cnVlX2NvbG9yICYmIHRoaXMuX2ZiX25hbWUgPT09IFwiSW50ZWwocikgQU1UIEtWTVwiKSB7XG4gICAgICAgICAgICBMb2cuV2FybihcIkludGVsIEFNVCBLVk0gb25seSBzdXBwb3J0cyA4LzE2IGJpdCBkZXB0aHMuICBEaXNhYmxpbmcgdHJ1ZSBjb2xvclwiKTtcbiAgICAgICAgICAgIHRoaXMuX3RydWVfY29sb3IgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Rpc3BsYXkuc2V0X3RydWVfY29sb3IodGhpcy5fdHJ1ZV9jb2xvcik7XG4gICAgICAgIHRoaXMuX2Rpc3BsYXkucmVzaXplKHRoaXMuX2ZiX3dpZHRoLCB0aGlzLl9mYl9oZWlnaHQpO1xuICAgICAgICB0aGlzLl9vbkZCUmVzaXplKHRoaXMsIHRoaXMuX2ZiX3dpZHRoLCB0aGlzLl9mYl9oZWlnaHQpO1xuXG4gICAgICAgIGlmICghdGhpcy5fdmlld19vbmx5KSB7XG4gICAgICAgICAgICB0aGlzLl9rZXlib2FyZC5ncmFiKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl92aWV3X29ubHkpIHtcbiAgICAgICAgICAgIHRoaXMuX21vdXNlLmdyYWIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl90cnVlX2NvbG9yKSB7XG4gICAgICAgICAgICB0aGlzLl9mYl9CcHAgPSA0O1xuICAgICAgICAgICAgdGhpcy5fZmJfZGVwdGggPSAzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZmJfQnBwID0gMTtcbiAgICAgICAgICAgIHRoaXMuX2ZiX2RlcHRoID0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIFJGQi5tZXNzYWdlcy5waXhlbEZvcm1hdCh0aGlzLl9zb2NrLCB0aGlzLl9mYl9CcHAsIHRoaXMuX2ZiX2RlcHRoLCB0aGlzLl90cnVlX2NvbG9yKTtcbiAgICAgICAgUkZCLm1lc3NhZ2VzLmNsaWVudEVuY29kaW5ncyh0aGlzLl9zb2NrLCB0aGlzLl9lbmNvZGluZ3MsIHRoaXMuX2xvY2FsX2N1cnNvciwgdGhpcy5fdHJ1ZV9jb2xvcik7XG4gICAgICAgIFJGQi5tZXNzYWdlcy5mYlVwZGF0ZVJlcXVlc3QodGhpcy5fc29jaywgZmFsc2UsIDAsIDAsIHRoaXMuX2ZiX3dpZHRoLCB0aGlzLl9mYl9oZWlnaHQpO1xuXG4gICAgICAgIHRoaXMuX3RpbWluZy5mYnVfcnRfc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgdGhpcy5fdGltaW5nLnBpeGVscyA9IDA7XG5cbiAgICAgICAgdGhpcy5fdXBkYXRlQ29ubmVjdGlvblN0YXRlKCdjb25uZWN0ZWQnKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIC8qIFJGQiBwcm90b2NvbCBpbml0aWFsaXphdGlvbiBzdGF0ZXM6XG4gICAgICogICBQcm90b2NvbFZlcnNpb25cbiAgICAgKiAgIFNlY3VyaXR5XG4gICAgICogICBBdXRoZW50aWNhdGlvblxuICAgICAqICAgU2VjdXJpdHlSZXN1bHRcbiAgICAgKiAgIENsaWVudEluaXRpYWxpemF0aW9uIC0gbm90IHRyaWdnZXJlZCBieSBzZXJ2ZXIgbWVzc2FnZVxuICAgICAqICAgU2VydmVySW5pdGlhbGl6YXRpb25cbiAgICAgKi9cbiAgICBfaW5pdF9tc2c6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLl9yZmJfaW5pdF9zdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSAnUHJvdG9jb2xWZXJzaW9uJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbmVnb3RpYXRlX3Byb3RvY29sX3ZlcnNpb24oKTtcblxuICAgICAgICAgICAgY2FzZSAnU2VjdXJpdHknOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZWdvdGlhdGVfc2VjdXJpdHkoKTtcblxuICAgICAgICAgICAgY2FzZSAnQXV0aGVudGljYXRpb24nOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZWdvdGlhdGVfYXV0aGVudGljYXRpb24oKTtcblxuICAgICAgICAgICAgY2FzZSAnU2VjdXJpdHlSZXN1bHQnOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVfc2VjdXJpdHlfcmVzdWx0KCk7XG5cbiAgICAgICAgICAgIGNhc2UgJ0NsaWVudEluaXRpYWxpc2F0aW9uJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9zb2NrLnNlbmQoW3RoaXMuX3NoYXJlZCA/IDEgOiAwXSk7IC8vIENsaWVudEluaXRpYWxpc2F0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5fcmZiX2luaXRfc3RhdGUgPSAnU2VydmVySW5pdGlhbGlzYXRpb24nO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICBjYXNlICdTZXJ2ZXJJbml0aWFsaXNhdGlvbic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25lZ290aWF0ZV9zZXJ2ZXJfaW5pdCgpO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKFwiSW50ZXJuYWwgZXJyb3JcIiwgXCJVbmtub3duIGluaXQgc3RhdGU6IFwiICsgdGhpcy5fcmZiX2luaXRfc3RhdGUpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9oYW5kbGVfc2V0X2NvbG91cl9tYXBfbXNnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIExvZy5EZWJ1ZyhcIlNldENvbG9yTWFwRW50cmllc1wiKTtcbiAgICAgICAgdGhpcy5fc29jay5yUXNraXA4KCk7IC8vIFBhZGRpbmdcblxuICAgICAgICB2YXIgZmlyc3RfY29sb3VyID0gdGhpcy5fc29jay5yUXNoaWZ0MTYoKTtcbiAgICAgICAgdmFyIG51bV9jb2xvdXJzID0gdGhpcy5fc29jay5yUXNoaWZ0MTYoKTtcbiAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KCdTZXRDb2xvck1hcEVudHJpZXMnLCBudW1fY29sb3VycyAqIDYsIDYpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IG51bV9jb2xvdXJzOyBjKyspIHtcbiAgICAgICAgICAgIHZhciByZWQgPSBwYXJzZUludCh0aGlzLl9zb2NrLnJRc2hpZnQxNigpIC8gMjU2LCAxMCk7XG4gICAgICAgICAgICB2YXIgZ3JlZW4gPSBwYXJzZUludCh0aGlzLl9zb2NrLnJRc2hpZnQxNigpIC8gMjU2LCAxMCk7XG4gICAgICAgICAgICB2YXIgYmx1ZSA9IHBhcnNlSW50KHRoaXMuX3NvY2suclFzaGlmdDE2KCkgLyAyNTYsIDEwKTtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkuc2V0X2NvbG91ck1hcChbYmx1ZSwgZ3JlZW4sIHJlZF0sIGZpcnN0X2NvbG91ciArIGMpO1xuICAgICAgICB9XG4gICAgICAgIExvZy5EZWJ1ZyhcImNvbG91ck1hcDogXCIgKyB0aGlzLl9kaXNwbGF5LmdldF9jb2xvdXJNYXAoKSk7XG4gICAgICAgIExvZy5JbmZvKFwiUmVnaXN0ZXJlZCBcIiArIG51bV9jb2xvdXJzICsgXCIgY29sb3VyTWFwIGVudHJpZXNcIik7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIF9oYW5kbGVfc2VydmVyX2N1dF90ZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIExvZy5EZWJ1ZyhcIlNlcnZlckN1dFRleHRcIik7XG5cbiAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwiU2VydmVyQ3V0VGV4dCBoZWFkZXJcIiwgNywgMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zb2NrLnJRc2tpcEJ5dGVzKDMpOyAvLyBQYWRkaW5nXG4gICAgICAgIHZhciBsZW5ndGggPSB0aGlzLl9zb2NrLnJRc2hpZnQzMigpO1xuICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJTZXJ2ZXJDdXRUZXh0XCIsIGxlbmd0aCwgOCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB0ZXh0ID0gdGhpcy5fc29jay5yUXNoaWZ0U3RyKGxlbmd0aCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3ZpZXdfb25seSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9vbkNsaXBib2FyZCh0aGlzLCB0ZXh0KTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgX2hhbmRsZV9zZXJ2ZXJfZmVuY2VfbXNnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdChcIlNlcnZlckZlbmNlIGhlYWRlclwiLCA4LCAxKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoMyk7IC8vIFBhZGRpbmdcbiAgICAgICAgdmFyIGZsYWdzID0gdGhpcy5fc29jay5yUXNoaWZ0MzIoKTtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuX3NvY2suclFzaGlmdDgoKTtcblxuICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJTZXJ2ZXJGZW5jZSBwYXlsb2FkXCIsIGxlbmd0aCwgOSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsZW5ndGggPiA2NCkge1xuICAgICAgICAgICAgTG9nLldhcm4oXCJCYWQgcGF5bG9hZCBsZW5ndGggKFwiICsgbGVuZ3RoICsgXCIpIGluIGZlbmNlIHJlc3BvbnNlXCIpO1xuICAgICAgICAgICAgbGVuZ3RoID0gNjQ7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcGF5bG9hZCA9IHRoaXMuX3NvY2suclFzaGlmdFN0cihsZW5ndGgpO1xuXG4gICAgICAgIHRoaXMuX3N1cHBvcnRzRmVuY2UgPSB0cnVlO1xuXG4gICAgICAgIC8qXG4gICAgICAgICAqIEZlbmNlIGZsYWdzXG4gICAgICAgICAqXG4gICAgICAgICAqICAoMTw8MCkgIC0gQmxvY2tCZWZvcmVcbiAgICAgICAgICogICgxPDwxKSAgLSBCbG9ja0FmdGVyXG4gICAgICAgICAqICAoMTw8MikgIC0gU3luY05leHRcbiAgICAgICAgICogICgxPDwzMSkgLSBSZXF1ZXN0XG4gICAgICAgICAqL1xuXG4gICAgICAgIGlmICghKGZsYWdzICYgMSA8PCAzMSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKFwiSW50ZXJuYWwgZXJyb3JcIiwgXCJVbmV4cGVjdGVkIGZlbmNlIHJlc3BvbnNlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlsdGVyIG91dCB1bnN1cHBvcnRlZCBmbGFnc1xuICAgICAgICAvLyBGSVhNRTogc3VwcG9ydCBzeW5jTmV4dFxuICAgICAgICBmbGFncyAmPSAxIDw8IDAgfCAxIDw8IDE7XG5cbiAgICAgICAgLy8gQmxvY2tCZWZvcmUgYW5kIEJsb2NrQWZ0ZXIgYXJlIGF1dG9tYXRpY2FsbHkgaGFuZGxlZCBieVxuICAgICAgICAvLyB0aGUgZmFjdCB0aGF0IHdlIHByb2Nlc3MgZWFjaCBpbmNvbWluZyBtZXNzYWdlXG4gICAgICAgIC8vIHN5bmNocm9udW9zbHkuXG4gICAgICAgIFJGQi5tZXNzYWdlcy5jbGllbnRGZW5jZSh0aGlzLl9zb2NrLCBmbGFncywgcGF5bG9hZCk7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIF9oYW5kbGVfeHZwX21zZzogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJYVlAgdmVyc2lvbiBhbmQgbWVzc2FnZVwiLCAzLCAxKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvY2suclFza2lwOCgpOyAvLyBQYWRkaW5nXG4gICAgICAgIHZhciB4dnBfdmVyID0gdGhpcy5fc29jay5yUXNoaWZ0OCgpO1xuICAgICAgICB2YXIgeHZwX21zZyA9IHRoaXMuX3NvY2suclFzaGlmdDgoKTtcblxuICAgICAgICBzd2l0Y2ggKHh2cF9tc2cpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAvLyBYVlBfRkFJTFxuICAgICAgICAgICAgICAgIExvZy5FcnJvcihcIk9wZXJhdGlvbiBGYWlsZWRcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpY2F0aW9uKFwiWFZQIE9wZXJhdGlvbiBGYWlsZWRcIiwgJ2Vycm9yJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgLy8gWFZQX0lOSVRcbiAgICAgICAgICAgICAgICB0aGlzLl9yZmJfeHZwX3ZlciA9IHh2cF92ZXI7XG4gICAgICAgICAgICAgICAgTG9nLkluZm8oXCJYVlAgZXh0ZW5zaW9ucyBlbmFibGVkICh2ZXJzaW9uIFwiICsgdGhpcy5fcmZiX3h2cF92ZXIgKyBcIilcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25YdnBJbml0KHRoaXMuX3JmYl94dnBfdmVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhpcy5fZmFpbChcIlVuZXhwZWN0ZWQgc2VydmVyIG1lc3NhZ2VcIiwgXCJJbGxlZ2FsIHNlcnZlciBYVlAgbWVzc2FnZSBcIiArIHh2cF9tc2cpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIF9ub3JtYWxfbXNnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtc2dfdHlwZTtcblxuICAgICAgICBpZiAodGhpcy5fRkJVLnJlY3RzID4gMCkge1xuICAgICAgICAgICAgbXNnX3R5cGUgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbXNnX3R5cGUgPSB0aGlzLl9zb2NrLnJRc2hpZnQ4KCk7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKG1zZ190eXBlKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgLy8gRnJhbWVidWZmZXJVcGRhdGVcbiAgICAgICAgICAgICAgICB2YXIgcmV0ID0gdGhpcy5fZnJhbWVidWZmZXJVcGRhdGUoKTtcbiAgICAgICAgICAgICAgICBpZiAocmV0ICYmICF0aGlzLl9lbmFibGVkQ29udGludW91c1VwZGF0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgUkZCLm1lc3NhZ2VzLmZiVXBkYXRlUmVxdWVzdCh0aGlzLl9zb2NrLCB0cnVlLCAwLCAwLCB0aGlzLl9mYl93aWR0aCwgdGhpcy5fZmJfaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcblxuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIC8vIFNldENvbG9yTWFwRW50cmllc1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVfc2V0X2NvbG91cl9tYXBfbXNnKCk7XG5cbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAvLyBCZWxsXG4gICAgICAgICAgICAgICAgTG9nLkRlYnVnKFwiQmVsbFwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkJlbGwodGhpcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAvLyBTZXJ2ZXJDdXRUZXh0XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZV9zZXJ2ZXJfY3V0X3RleHQoKTtcblxuICAgICAgICAgICAgY2FzZSAxNTA6XG4gICAgICAgICAgICAgICAgLy8gRW5kT2ZDb250aW51b3VzVXBkYXRlc1xuICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9ICF0aGlzLl9zdXBwb3J0c0NvbnRpbnVvdXNVcGRhdGVzO1xuICAgICAgICAgICAgICAgIHRoaXMuX3N1cHBvcnRzQ29udGludW91c1VwZGF0ZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX2VuYWJsZWRDb250aW51b3VzVXBkYXRlcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmFibGVkQ29udGludW91c1VwZGF0ZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVDb250aW51b3VzVXBkYXRlcygpO1xuICAgICAgICAgICAgICAgICAgICBMb2cuSW5mbyhcIkVuYWJsaW5nIGNvbnRpbnVvdXMgdXBkYXRlcy5cIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IFdlIG5lZWQgdG8gc2VuZCBhIGZyYW1lYnVmZmVydXBkYXRlcmVxdWVzdCBoZXJlXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGFkZCBzdXBwb3J0IGZvciB0dXJuaW5nIG9mZiBjb250aW51b3VzIHVwZGF0ZXNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgIGNhc2UgMjQ4OlxuICAgICAgICAgICAgICAgIC8vIFNlcnZlckZlbmNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZV9zZXJ2ZXJfZmVuY2VfbXNnKCk7XG5cbiAgICAgICAgICAgIGNhc2UgMjUwOlxuICAgICAgICAgICAgICAgIC8vIFhWUFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVfeHZwX21zZygpO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRoaXMuX2ZhaWwoXCJVbmV4cGVjdGVkIHNlcnZlciBtZXNzYWdlXCIsIFwiVHlwZTpcIiArIG1zZ190eXBlKTtcbiAgICAgICAgICAgICAgICBMb2cuRGVidWcoXCJzb2NrLnJRc2xpY2UoMCwgMzApOiBcIiArIHRoaXMuX3NvY2suclFzbGljZSgwLCAzMCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9vbkZsdXNoOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2ZsdXNoaW5nID0gZmFsc2U7XG4gICAgICAgIC8vIFJlc3VtZSBwcm9jZXNzaW5nXG4gICAgICAgIGlmICh0aGlzLl9zb2NrLnJRbGVuKCkgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVfbWVzc2FnZSgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIF9mcmFtZWJ1ZmZlclVwZGF0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcmV0ID0gdHJ1ZTtcbiAgICAgICAgdmFyIG5vdztcblxuICAgICAgICBpZiAodGhpcy5fRkJVLnJlY3RzID09PSAwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJGQlUgaGVhZGVyXCIsIDMsIDEpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fc29jay5yUXNraXA4KCk7IC8vIFBhZGRpbmdcbiAgICAgICAgICAgIHRoaXMuX0ZCVS5yZWN0cyA9IHRoaXMuX3NvY2suclFzaGlmdDE2KCk7XG4gICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSAwO1xuICAgICAgICAgICAgdGhpcy5fdGltaW5nLmN1cl9mYnUgPSAwO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3RpbWluZy5mYnVfcnRfc3RhcnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICAgICAgTG9nLkluZm8oXCJGaXJzdCBGQlUgbGF0ZW5jeTogXCIgKyAobm93IC0gdGhpcy5fdGltaW5nLmZidV9ydF9zdGFydCkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByZXZpb3VzIGZyYW1lIGlzIGZ1bGx5IHJlbmRlcmVkIGZpcnN0XG4gICAgICAgICAgICAvLyB0byBhdm9pZCBidWlsZGluZyB1cCBhbiBleGNlc3NpdmUgcXVldWVcbiAgICAgICAgICAgIGlmICh0aGlzLl9kaXNwbGF5LnBlbmRpbmcoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZsdXNoaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5LmZsdXNoKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKHRoaXMuX0ZCVS5yZWN0cyA+IDApIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZmJfY29ubmVjdGlvbl9zdGF0ZSAhPT0gJ2Nvbm5lY3RlZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdChcIkZCVVwiLCB0aGlzLl9GQlUuYnl0ZXMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX0ZCVS5ieXRlcyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdChcInJlY3QgaGVhZGVyXCIsIDEyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qIE5ldyBGcmFtZWJ1ZmZlclVwZGF0ZSAqL1xuXG4gICAgICAgICAgICAgICAgdmFyIGhkciA9IHRoaXMuX3NvY2suclFzaGlmdEJ5dGVzKDEyKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9GQlUueCA9IChoZHJbMF0gPDwgOCkgKyBoZHJbMV07XG4gICAgICAgICAgICAgICAgdGhpcy5fRkJVLnkgPSAoaGRyWzJdIDw8IDgpICsgaGRyWzNdO1xuICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS53aWR0aCA9IChoZHJbNF0gPDwgOCkgKyBoZHJbNV07XG4gICAgICAgICAgICAgICAgdGhpcy5fRkJVLmhlaWdodCA9IChoZHJbNl0gPDwgOCkgKyBoZHJbN107XG4gICAgICAgICAgICAgICAgdGhpcy5fRkJVLmVuY29kaW5nID0gcGFyc2VJbnQoKGhkcls4XSA8PCAyNCkgKyAoaGRyWzldIDw8IDE2KSArIChoZHJbMTBdIDw8IDgpICsgaGRyWzExXSwgMTApO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fb25GQlVSZWNlaXZlKHRoaXMsIHsgJ3gnOiB0aGlzLl9GQlUueCwgJ3knOiB0aGlzLl9GQlUueSxcbiAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJzogdGhpcy5fRkJVLndpZHRoLCAnaGVpZ2h0JzogdGhpcy5fRkJVLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgJ2VuY29kaW5nJzogdGhpcy5fRkJVLmVuY29kaW5nLFxuICAgICAgICAgICAgICAgICAgICAnZW5jb2RpbmdOYW1lJzogdGhpcy5fZW5jTmFtZXNbdGhpcy5fRkJVLmVuY29kaW5nXSB9KTtcblxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZW5jTmFtZXNbdGhpcy5fRkJVLmVuY29kaW5nXSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mYWlsKFwiVW5leHBlY3RlZCBzZXJ2ZXIgbWVzc2FnZVwiLCBcIlVuc3VwcG9ydGVkIGVuY29kaW5nIFwiICsgdGhpcy5fRkJVLmVuY29kaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fdGltaW5nLmxhc3RfZmJ1ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cbiAgICAgICAgICAgIHJldCA9IHRoaXMuX2VuY0hhbmRsZXJzW3RoaXMuX0ZCVS5lbmNvZGluZ10oKTtcblxuICAgICAgICAgICAgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICB0aGlzLl90aW1pbmcuY3VyX2ZidSArPSBub3cgLSB0aGlzLl90aW1pbmcubGFzdF9mYnU7XG5cbiAgICAgICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbmNTdGF0c1t0aGlzLl9GQlUuZW5jb2RpbmddWzBdKys7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW5jU3RhdHNbdGhpcy5fRkJVLmVuY29kaW5nXVsxXSsrO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RpbWluZy5waXhlbHMgKz0gdGhpcy5fRkJVLndpZHRoICogdGhpcy5fRkJVLmhlaWdodDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX3RpbWluZy5waXhlbHMgPj0gdGhpcy5fZmJfd2lkdGggKiB0aGlzLl9mYl9oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fRkJVLndpZHRoID09PSB0aGlzLl9mYl93aWR0aCAmJiB0aGlzLl9GQlUuaGVpZ2h0ID09PSB0aGlzLl9mYl9oZWlnaHQgfHwgdGhpcy5fdGltaW5nLmZidV9ydF9zdGFydCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGltaW5nLmZ1bGxfZmJ1X3RvdGFsICs9IHRoaXMuX3RpbWluZy5jdXJfZmJ1O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90aW1pbmcuZnVsbF9mYnVfY250Kys7XG4gICAgICAgICAgICAgICAgICAgIExvZy5JbmZvKFwiVGltaW5nIG9mIGZ1bGwgRkJVLCBjdXJyOiBcIiArIHRoaXMuX3RpbWluZy5jdXJfZmJ1ICsgXCIsIHRvdGFsOiBcIiArIHRoaXMuX3RpbWluZy5mdWxsX2ZidV90b3RhbCArIFwiLCBjbnQ6IFwiICsgdGhpcy5fdGltaW5nLmZ1bGxfZmJ1X2NudCArIFwiLCBhdmc6IFwiICsgdGhpcy5fdGltaW5nLmZ1bGxfZmJ1X3RvdGFsIC8gdGhpcy5fdGltaW5nLmZ1bGxfZmJ1X2NudCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RpbWluZy5mYnVfcnRfc3RhcnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmYnVfcnRfZGlmZiA9IG5vdyAtIHRoaXMuX3RpbWluZy5mYnVfcnRfc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpbWluZy5mYnVfcnRfdG90YWwgKz0gZmJ1X3J0X2RpZmY7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpbWluZy5mYnVfcnRfY250Kys7XG4gICAgICAgICAgICAgICAgICAgIExvZy5JbmZvKFwiZnVsbCBGQlUgcm91bmQtdHJpcCwgY3VyOiBcIiArIGZidV9ydF9kaWZmICsgXCIsIHRvdGFsOiBcIiArIHRoaXMuX3RpbWluZy5mYnVfcnRfdG90YWwgKyBcIiwgY250OiBcIiArIHRoaXMuX3RpbWluZy5mYnVfcnRfY250ICsgXCIsIGF2ZzogXCIgKyB0aGlzLl90aW1pbmcuZmJ1X3J0X3RvdGFsIC8gdGhpcy5fdGltaW5nLmZidV9ydF9jbnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90aW1pbmcuZmJ1X3J0X3N0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghcmV0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgIH0gLy8gbmVlZCBtb3JlIGRhdGFcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Rpc3BsYXkuZmxpcCgpO1xuXG4gICAgICAgIHRoaXMuX29uRkJVQ29tcGxldGUodGhpcywgeyAneCc6IHRoaXMuX0ZCVS54LCAneSc6IHRoaXMuX0ZCVS55LFxuICAgICAgICAgICAgJ3dpZHRoJzogdGhpcy5fRkJVLndpZHRoLCAnaGVpZ2h0JzogdGhpcy5fRkJVLmhlaWdodCxcbiAgICAgICAgICAgICdlbmNvZGluZyc6IHRoaXMuX0ZCVS5lbmNvZGluZyxcbiAgICAgICAgICAgICdlbmNvZGluZ05hbWUnOiB0aGlzLl9lbmNOYW1lc1t0aGlzLl9GQlUuZW5jb2RpbmddIH0pO1xuXG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBXZSBmaW5pc2hlZCB0aGlzIEZCVVxuICAgIH0sXG5cbiAgICBfdXBkYXRlQ29udGludW91c1VwZGF0ZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9lbmFibGVkQ29udGludW91c1VwZGF0ZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIFJGQi5tZXNzYWdlcy5lbmFibGVDb250aW51b3VzVXBkYXRlcyh0aGlzLl9zb2NrLCB0cnVlLCAwLCAwLCB0aGlzLl9mYl93aWR0aCwgdGhpcy5fZmJfaGVpZ2h0KTtcbiAgICB9XG59O1xuXG4oMCwgX3Byb3BlcnRpZXMubWFrZV9wcm9wZXJ0aWVzKShSRkIsIFtbJ3RhcmdldCcsICd3bycsICdkb20nXSwgLy8gVk5DIGRpc3BsYXkgcmVuZGVyaW5nIENhbnZhcyBvYmplY3RcblsnZm9jdXNDb250YWluZXInLCAnd28nLCAnZG9tJ10sIC8vIERPTSBlbGVtZW50IHRoYXQgY2FwdHVyZXMga2V5Ym9hcmQgaW5wdXRcblsnZW5jcnlwdCcsICdydycsICdib29sJ10sIC8vIFVzZSBUTFMvU1NML3dzcyBlbmNyeXB0aW9uXG5bJ3RydWVfY29sb3InLCAncncnLCAnYm9vbCddLCAvLyBSZXF1ZXN0IHRydWUgY29sb3IgcGl4ZWwgZGF0YVxuWydsb2NhbF9jdXJzb3InLCAncncnLCAnYm9vbCddLCAvLyBSZXF1ZXN0IGxvY2FsbHkgcmVuZGVyZWQgY3Vyc29yXG5bJ3NoYXJlZCcsICdydycsICdib29sJ10sIC8vIFJlcXVlc3Qgc2hhcmVkIG1vZGVcblsndmlld19vbmx5JywgJ3J3JywgJ2Jvb2wnXSwgLy8gRGlzYWJsZSBjbGllbnQgbW91c2Uva2V5Ym9hcmRcblsneHZwX3Bhc3N3b3JkX3NlcCcsICdydycsICdzdHInXSwgLy8gU2VwYXJhdG9yIGZvciBYVlAgcGFzc3dvcmQgZmllbGRzXG5bJ2Rpc2Nvbm5lY3RUaW1lb3V0JywgJ3J3JywgJ2ludCddLCAvLyBUaW1lIChzKSB0byB3YWl0IGZvciBkaXNjb25uZWN0aW9uXG5bJ3dzUHJvdG9jb2xzJywgJ3J3JywgJ2FyciddLCAvLyBQcm90b2NvbHMgdG8gdXNlIGluIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuWydyZXBlYXRlcklEJywgJ3J3JywgJ3N0ciddLCAvLyBbVWx0cmFWTkNdIFJlcGVhdGVySUQgdG8gY29ubmVjdCB0b1xuWyd2aWV3cG9ydERyYWcnLCAncncnLCAnYm9vbCddLCAvLyBNb3ZlIHRoZSB2aWV3cG9ydCBvbiBtb3VzZSBkcmFnc1xuXG4vLyBDYWxsYmFjayBmdW5jdGlvbnNcblsnb25VcGRhdGVTdGF0ZScsICdydycsICdmdW5jJ10sIC8vIG9uVXBkYXRlU3RhdGUocmZiLCBzdGF0ZSwgb2xkc3RhdGUpOiBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZVxuWydvbk5vdGlmaWNhdGlvbicsICdydycsICdmdW5jJ10sIC8vIG9uTm90aWZpY2F0aW9uKHJmYiwgbXNnLCBsZXZlbCwgb3B0aW9ucyk6IG5vdGlmaWNhdGlvbiBmb3IgdGhlIFVJXG5bJ29uRGlzY29ubmVjdGVkJywgJ3J3JywgJ2Z1bmMnXSwgLy8gb25EaXNjb25uZWN0ZWQocmZiLCByZWFzb24pOiBkaXNjb25uZWN0aW9uIGZpbmlzaGVkXG5bJ29uUGFzc3dvcmRSZXF1aXJlZCcsICdydycsICdmdW5jJ10sIC8vIG9uUGFzc3dvcmRSZXF1aXJlZChyZmIsIG1zZyk6IFZOQyBwYXNzd29yZCBpcyByZXF1aXJlZFxuWydvbkNsaXBib2FyZCcsICdydycsICdmdW5jJ10sIC8vIG9uQ2xpcGJvYXJkKHJmYiwgdGV4dCk6IFJGQiBjbGlwYm9hcmQgY29udGVudHMgcmVjZWl2ZWRcblsnb25CZWxsJywgJ3J3JywgJ2Z1bmMnXSwgLy8gb25CZWxsKHJmYik6IFJGQiBCZWxsIG1lc3NhZ2UgcmVjZWl2ZWRcblsnb25GQlVSZWNlaXZlJywgJ3J3JywgJ2Z1bmMnXSwgLy8gb25GQlVSZWNlaXZlKHJmYiwgZmJ1KTogUkZCIEZCVSByZWNlaXZlZCBidXQgbm90IHlldCBwcm9jZXNzZWRcblsnb25GQlVDb21wbGV0ZScsICdydycsICdmdW5jJ10sIC8vIG9uRkJVQ29tcGxldGUocmZiLCBmYnUpOiBSRkIgRkJVIHJlY2VpdmVkIGFuZCBwcm9jZXNzZWRcblsnb25GQlJlc2l6ZScsICdydycsICdmdW5jJ10sIC8vIG9uRkJSZXNpemUocmZiLCB3aWR0aCwgaGVpZ2h0KTogZnJhbWUgYnVmZmVyIHJlc2l6ZWRcblsnb25EZXNrdG9wTmFtZScsICdydycsICdmdW5jJ10sIC8vIG9uRGVza3RvcE5hbWUocmZiLCBuYW1lKTogZGVza3RvcCBuYW1lIHJlY2VpdmVkXG5bJ29uWHZwSW5pdCcsICdydycsICdmdW5jJ10gLy8gb25YdnBJbml0KHZlcnNpb24pOiBYVlAgZXh0ZW5zaW9ucyBhY3RpdmUgZm9yIHRoaXMgY29ubmVjdGlvblxuXSk7XG5cblJGQi5wcm90b3R5cGUuc2V0X2xvY2FsX2N1cnNvciA9IGZ1bmN0aW9uIChjdXJzb3IpIHtcbiAgICBpZiAoIWN1cnNvciB8fCBjdXJzb3IgaW4geyAnMCc6IDEsICdubyc6IDEsICdmYWxzZSc6IDEgfSkge1xuICAgICAgICB0aGlzLl9sb2NhbF9jdXJzb3IgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fZGlzcGxheS5kaXNhYmxlTG9jYWxDdXJzb3IoKTsgLy9Pbmx5IHNob3cgc2VydmVyLXNpZGUgY3Vyc29yXG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuX2Rpc3BsYXkuZ2V0X2N1cnNvcl91cmkoKSkge1xuICAgICAgICAgICAgdGhpcy5fbG9jYWxfY3Vyc29yID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIExvZy5XYXJuKFwiQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGxvY2FsIGN1cnNvclwiKTtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkuZGlzYWJsZUxvY2FsQ3Vyc29yKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBOZWVkIHRvIHNlbmQgYW4gdXBkYXRlZCBsaXN0IG9mIGVuY29kaW5ncyBpZiB3ZSBhcmUgY29ubmVjdGVkXG4gICAgaWYgKHRoaXMuX3JmYl9jb25uZWN0aW9uX3N0YXRlID09PSBcImNvbm5lY3RlZFwiKSB7XG4gICAgICAgIFJGQi5tZXNzYWdlcy5jbGllbnRFbmNvZGluZ3ModGhpcy5fc29jaywgdGhpcy5fZW5jb2RpbmdzLCBjdXJzb3IsIHRoaXMuX3RydWVfY29sb3IpO1xuICAgIH1cbn07XG5cblJGQi5wcm90b3R5cGUuc2V0X3ZpZXdfb25seSA9IGZ1bmN0aW9uICh2aWV3X29ubHkpIHtcbiAgICB0aGlzLl92aWV3X29ubHkgPSB2aWV3X29ubHk7XG5cbiAgICBpZiAodGhpcy5fcmZiX2Nvbm5lY3Rpb25fc3RhdGUgPT09IFwiY29ubmVjdGluZ1wiIHx8IHRoaXMuX3JmYl9jb25uZWN0aW9uX3N0YXRlID09PSBcImNvbm5lY3RlZFwiKSB7XG4gICAgICAgIGlmICh2aWV3X29ubHkpIHtcbiAgICAgICAgICAgIHRoaXMuX2tleWJvYXJkLnVuZ3JhYigpO1xuICAgICAgICAgICAgdGhpcy5fbW91c2UudW5ncmFiKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9rZXlib2FyZC5ncmFiKCk7XG4gICAgICAgICAgICB0aGlzLl9tb3VzZS5ncmFiKCk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5SRkIucHJvdG90eXBlLmdldF9kaXNwbGF5ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9kaXNwbGF5O1xufTtcblJGQi5wcm90b3R5cGUuZ2V0X2tleWJvYXJkID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9rZXlib2FyZDtcbn07XG5SRkIucHJvdG90eXBlLmdldF9tb3VzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fbW91c2U7XG59O1xuXG4vLyBDbGFzcyBNZXRob2RzXG5SRkIubWVzc2FnZXMgPSB7XG4gICAga2V5RXZlbnQ6IGZ1bmN0aW9uIChzb2NrLCBrZXlzeW0sIGRvd24pIHtcbiAgICAgICAgdmFyIGJ1ZmYgPSBzb2NrLl9zUTtcbiAgICAgICAgdmFyIG9mZnNldCA9IHNvY2suX3NRbGVuO1xuXG4gICAgICAgIGJ1ZmZbb2Zmc2V0XSA9IDQ7IC8vIG1zZy10eXBlXG4gICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMV0gPSBkb3duO1xuXG4gICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMl0gPSAwO1xuICAgICAgICBidWZmW29mZnNldCArIDNdID0gMDtcblxuICAgICAgICBidWZmW29mZnNldCArIDRdID0ga2V5c3ltID4+IDI0O1xuICAgICAgICBidWZmW29mZnNldCArIDVdID0ga2V5c3ltID4+IDE2O1xuICAgICAgICBidWZmW29mZnNldCArIDZdID0ga2V5c3ltID4+IDg7XG4gICAgICAgIGJ1ZmZbb2Zmc2V0ICsgN10gPSBrZXlzeW07XG5cbiAgICAgICAgc29jay5fc1FsZW4gKz0gODtcbiAgICAgICAgc29jay5mbHVzaCgpO1xuICAgIH0sXG5cbiAgICBRRU1VRXh0ZW5kZWRLZXlFdmVudDogZnVuY3Rpb24gKHNvY2ssIGtleXN5bSwgZG93biwga2V5Y29kZSkge1xuICAgICAgICBmdW5jdGlvbiBnZXRSRkJrZXljb2RlKHh0X3NjYW5jb2RlKSB7XG4gICAgICAgICAgICB2YXIgdXBwZXJCeXRlID0ga2V5Y29kZSA+PiA4O1xuICAgICAgICAgICAgdmFyIGxvd2VyQnl0ZSA9IGtleWNvZGUgJiAweDAwZmY7XG4gICAgICAgICAgICBpZiAodXBwZXJCeXRlID09PSAweGUwICYmIGxvd2VyQnl0ZSA8IDB4N2YpIHtcbiAgICAgICAgICAgICAgICBsb3dlckJ5dGUgPSBsb3dlckJ5dGUgfCAweDgwO1xuICAgICAgICAgICAgICAgIHJldHVybiBsb3dlckJ5dGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geHRfc2NhbmNvZGU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYnVmZiA9IHNvY2suX3NRO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gc29jay5fc1FsZW47XG5cbiAgICAgICAgYnVmZltvZmZzZXRdID0gMjU1OyAvLyBtc2ctdHlwZVxuICAgICAgICBidWZmW29mZnNldCArIDFdID0gMDsgLy8gc3ViIG1zZy10eXBlXG5cbiAgICAgICAgYnVmZltvZmZzZXQgKyAyXSA9IGRvd24gPj4gODtcbiAgICAgICAgYnVmZltvZmZzZXQgKyAzXSA9IGRvd247XG5cbiAgICAgICAgYnVmZltvZmZzZXQgKyA0XSA9IGtleXN5bSA+PiAyNDtcbiAgICAgICAgYnVmZltvZmZzZXQgKyA1XSA9IGtleXN5bSA+PiAxNjtcbiAgICAgICAgYnVmZltvZmZzZXQgKyA2XSA9IGtleXN5bSA+PiA4O1xuICAgICAgICBidWZmW29mZnNldCArIDddID0ga2V5c3ltO1xuXG4gICAgICAgIHZhciBSRkJrZXljb2RlID0gZ2V0UkZCa2V5Y29kZShrZXljb2RlKTtcblxuICAgICAgICBidWZmW29mZnNldCArIDhdID0gUkZCa2V5Y29kZSA+PiAyNDtcbiAgICAgICAgYnVmZltvZmZzZXQgKyA5XSA9IFJGQmtleWNvZGUgPj4gMTY7XG4gICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMTBdID0gUkZCa2V5Y29kZSA+PiA4O1xuICAgICAgICBidWZmW29mZnNldCArIDExXSA9IFJGQmtleWNvZGU7XG5cbiAgICAgICAgc29jay5fc1FsZW4gKz0gMTI7XG4gICAgICAgIHNvY2suZmx1c2goKTtcbiAgICB9LFxuXG4gICAgcG9pbnRlckV2ZW50OiBmdW5jdGlvbiAoc29jaywgeCwgeSwgbWFzaykge1xuICAgICAgICB2YXIgYnVmZiA9IHNvY2suX3NRO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gc29jay5fc1FsZW47XG5cbiAgICAgICAgYnVmZltvZmZzZXRdID0gNTsgLy8gbXNnLXR5cGVcblxuICAgICAgICBidWZmW29mZnNldCArIDFdID0gbWFzaztcblxuICAgICAgICBidWZmW29mZnNldCArIDJdID0geCA+PiA4O1xuICAgICAgICBidWZmW29mZnNldCArIDNdID0geDtcblxuICAgICAgICBidWZmW29mZnNldCArIDRdID0geSA+PiA4O1xuICAgICAgICBidWZmW29mZnNldCArIDVdID0geTtcblxuICAgICAgICBzb2NrLl9zUWxlbiArPSA2O1xuICAgICAgICBzb2NrLmZsdXNoKCk7XG4gICAgfSxcblxuICAgIC8vIFRPRE8oZGlyZWN0eG1hbjEyKTogbWFrZSB0aGlzIHVuaWNvZGUgY29tcGF0aWJsZT9cbiAgICBjbGllbnRDdXRUZXh0OiBmdW5jdGlvbiAoc29jaywgdGV4dCkge1xuICAgICAgICB2YXIgYnVmZiA9IHNvY2suX3NRO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gc29jay5fc1FsZW47XG5cbiAgICAgICAgYnVmZltvZmZzZXRdID0gNjsgLy8gbXNnLXR5cGVcblxuICAgICAgICBidWZmW29mZnNldCArIDFdID0gMDsgLy8gcGFkZGluZ1xuICAgICAgICBidWZmW29mZnNldCArIDJdID0gMDsgLy8gcGFkZGluZ1xuICAgICAgICBidWZmW29mZnNldCArIDNdID0gMDsgLy8gcGFkZGluZ1xuXG4gICAgICAgIHZhciBuID0gdGV4dC5sZW5ndGg7XG5cbiAgICAgICAgYnVmZltvZmZzZXQgKyA0XSA9IG4gPj4gMjQ7XG4gICAgICAgIGJ1ZmZbb2Zmc2V0ICsgNV0gPSBuID4+IDE2O1xuICAgICAgICBidWZmW29mZnNldCArIDZdID0gbiA+PiA4O1xuICAgICAgICBidWZmW29mZnNldCArIDddID0gbjtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyA4ICsgaV0gPSB0ZXh0LmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIH1cblxuICAgICAgICBzb2NrLl9zUWxlbiArPSA4ICsgbjtcbiAgICAgICAgc29jay5mbHVzaCgpO1xuICAgIH0sXG5cbiAgICBzZXREZXNrdG9wU2l6ZTogZnVuY3Rpb24gKHNvY2ssIHdpZHRoLCBoZWlnaHQsIGlkLCBmbGFncykge1xuICAgICAgICB2YXIgYnVmZiA9IHNvY2suX3NRO1xuICAgICAgICB2YXIgb2Zmc2V0ID0gc29jay5fc1FsZW47XG5cbiAgICAgICAgYnVmZltvZmZzZXRdID0gMjUxOyAvLyBtc2ctdHlwZVxuICAgICAgICBidWZmW29mZnNldCArIDFdID0gMDsgLy8gcGFkZGluZ1xuICAgICAgICBidWZmW29mZnNldCArIDJdID0gd2lkdGggPj4gODsgLy8gd2lkdGhcbiAgICAgICAgYnVmZltvZmZzZXQgKyAzXSA9IHdpZHRoO1xuICAgICAgICBidWZmW29mZnNldCArIDRdID0gaGVpZ2h0ID4+IDg7IC8vIGhlaWdodFxuICAgICAgICBidWZmW29mZnNldCArIDVdID0gaGVpZ2h0O1xuXG4gICAgICAgIGJ1ZmZbb2Zmc2V0ICsgNl0gPSAxOyAvLyBudW1iZXItb2Ytc2NyZWVuc1xuICAgICAgICBidWZmW29mZnNldCArIDddID0gMDsgLy8gcGFkZGluZ1xuXG4gICAgICAgIC8vIHNjcmVlbiBhcnJheVxuICAgICAgICBidWZmW29mZnNldCArIDhdID0gaWQgPj4gMjQ7IC8vIGlkXG4gICAgICAgIGJ1ZmZbb2Zmc2V0ICsgOV0gPSBpZCA+PiAxNjtcbiAgICAgICAgYnVmZltvZmZzZXQgKyAxMF0gPSBpZCA+PiA4O1xuICAgICAgICBidWZmW29mZnNldCArIDExXSA9IGlkO1xuICAgICAgICBidWZmW29mZnNldCArIDEyXSA9IDA7IC8vIHgtcG9zaXRpb25cbiAgICAgICAgYnVmZltvZmZzZXQgKyAxM10gPSAwO1xuICAgICAgICBidWZmW29mZnNldCArIDE0XSA9IDA7IC8vIHktcG9zaXRpb25cbiAgICAgICAgYnVmZltvZmZzZXQgKyAxNV0gPSAwO1xuICAgICAgICBidWZmW29mZnNldCArIDE2XSA9IHdpZHRoID4+IDg7IC8vIHdpZHRoXG4gICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMTddID0gd2lkdGg7XG4gICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMThdID0gaGVpZ2h0ID4+IDg7IC8vIGhlaWdodFxuICAgICAgICBidWZmW29mZnNldCArIDE5XSA9IGhlaWdodDtcbiAgICAgICAgYnVmZltvZmZzZXQgKyAyMF0gPSBmbGFncyA+PiAyNDsgLy8gZmxhZ3NcbiAgICAgICAgYnVmZltvZmZzZXQgKyAyMV0gPSBmbGFncyA+PiAxNjtcbiAgICAgICAgYnVmZltvZmZzZXQgKyAyMl0gPSBmbGFncyA+PiA4O1xuICAgICAgICBidWZmW29mZnNldCArIDIzXSA9IGZsYWdzO1xuXG4gICAgICAgIHNvY2suX3NRbGVuICs9IDI0O1xuICAgICAgICBzb2NrLmZsdXNoKCk7XG4gICAgfSxcblxuICAgIGNsaWVudEZlbmNlOiBmdW5jdGlvbiAoc29jaywgZmxhZ3MsIHBheWxvYWQpIHtcbiAgICAgICAgdmFyIGJ1ZmYgPSBzb2NrLl9zUTtcbiAgICAgICAgdmFyIG9mZnNldCA9IHNvY2suX3NRbGVuO1xuXG4gICAgICAgIGJ1ZmZbb2Zmc2V0XSA9IDI0ODsgLy8gbXNnLXR5cGVcblxuICAgICAgICBidWZmW29mZnNldCArIDFdID0gMDsgLy8gcGFkZGluZ1xuICAgICAgICBidWZmW29mZnNldCArIDJdID0gMDsgLy8gcGFkZGluZ1xuICAgICAgICBidWZmW29mZnNldCArIDNdID0gMDsgLy8gcGFkZGluZ1xuXG4gICAgICAgIGJ1ZmZbb2Zmc2V0ICsgNF0gPSBmbGFncyA+PiAyNDsgLy8gZmxhZ3NcbiAgICAgICAgYnVmZltvZmZzZXQgKyA1XSA9IGZsYWdzID4+IDE2O1xuICAgICAgICBidWZmW29mZnNldCArIDZdID0gZmxhZ3MgPj4gODtcbiAgICAgICAgYnVmZltvZmZzZXQgKyA3XSA9IGZsYWdzO1xuXG4gICAgICAgIHZhciBuID0gcGF5bG9hZC5sZW5ndGg7XG5cbiAgICAgICAgYnVmZltvZmZzZXQgKyA4XSA9IG47IC8vIGxlbmd0aFxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBidWZmW29mZnNldCArIDkgKyBpXSA9IHBheWxvYWQuY2hhckNvZGVBdChpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNvY2suX3NRbGVuICs9IDkgKyBuO1xuICAgICAgICBzb2NrLmZsdXNoKCk7XG4gICAgfSxcblxuICAgIGVuYWJsZUNvbnRpbnVvdXNVcGRhdGVzOiBmdW5jdGlvbiAoc29jaywgZW5hYmxlLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIHZhciBidWZmID0gc29jay5fc1E7XG4gICAgICAgIHZhciBvZmZzZXQgPSBzb2NrLl9zUWxlbjtcblxuICAgICAgICBidWZmW29mZnNldF0gPSAxNTA7IC8vIG1zZy10eXBlXG4gICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMV0gPSBlbmFibGU7IC8vIGVuYWJsZS1mbGFnXG5cbiAgICAgICAgYnVmZltvZmZzZXQgKyAyXSA9IHggPj4gODsgLy8geFxuICAgICAgICBidWZmW29mZnNldCArIDNdID0geDtcbiAgICAgICAgYnVmZltvZmZzZXQgKyA0XSA9IHkgPj4gODsgLy8geVxuICAgICAgICBidWZmW29mZnNldCArIDVdID0geTtcbiAgICAgICAgYnVmZltvZmZzZXQgKyA2XSA9IHdpZHRoID4+IDg7IC8vIHdpZHRoXG4gICAgICAgIGJ1ZmZbb2Zmc2V0ICsgN10gPSB3aWR0aDtcbiAgICAgICAgYnVmZltvZmZzZXQgKyA4XSA9IGhlaWdodCA+PiA4OyAvLyBoZWlnaHRcbiAgICAgICAgYnVmZltvZmZzZXQgKyA5XSA9IGhlaWdodDtcblxuICAgICAgICBzb2NrLl9zUWxlbiArPSAxMDtcbiAgICAgICAgc29jay5mbHVzaCgpO1xuICAgIH0sXG5cbiAgICBwaXhlbEZvcm1hdDogZnVuY3Rpb24gKHNvY2ssIGJwcCwgZGVwdGgsIHRydWVfY29sb3IpIHtcbiAgICAgICAgdmFyIGJ1ZmYgPSBzb2NrLl9zUTtcbiAgICAgICAgdmFyIG9mZnNldCA9IHNvY2suX3NRbGVuO1xuXG4gICAgICAgIGJ1ZmZbb2Zmc2V0XSA9IDA7IC8vIG1zZy10eXBlXG5cbiAgICAgICAgYnVmZltvZmZzZXQgKyAxXSA9IDA7IC8vIHBhZGRpbmdcbiAgICAgICAgYnVmZltvZmZzZXQgKyAyXSA9IDA7IC8vIHBhZGRpbmdcbiAgICAgICAgYnVmZltvZmZzZXQgKyAzXSA9IDA7IC8vIHBhZGRpbmdcblxuICAgICAgICBidWZmW29mZnNldCArIDRdID0gYnBwICogODsgLy8gYml0cy1wZXItcGl4ZWxcbiAgICAgICAgYnVmZltvZmZzZXQgKyA1XSA9IGRlcHRoICogODsgLy8gZGVwdGhcbiAgICAgICAgYnVmZltvZmZzZXQgKyA2XSA9IDA7IC8vIGxpdHRsZS1lbmRpYW5cbiAgICAgICAgYnVmZltvZmZzZXQgKyA3XSA9IHRydWVfY29sb3IgPyAxIDogMDsgLy8gdHJ1ZS1jb2xvclxuXG4gICAgICAgIGJ1ZmZbb2Zmc2V0ICsgOF0gPSAwOyAvLyByZWQtbWF4XG4gICAgICAgIGJ1ZmZbb2Zmc2V0ICsgOV0gPSAyNTU7IC8vIHJlZC1tYXhcblxuICAgICAgICBidWZmW29mZnNldCArIDEwXSA9IDA7IC8vIGdyZWVuLW1heFxuICAgICAgICBidWZmW29mZnNldCArIDExXSA9IDI1NTsgLy8gZ3JlZW4tbWF4XG5cbiAgICAgICAgYnVmZltvZmZzZXQgKyAxMl0gPSAwOyAvLyBibHVlLW1heFxuICAgICAgICBidWZmW29mZnNldCArIDEzXSA9IDI1NTsgLy8gYmx1ZS1tYXhcblxuICAgICAgICBidWZmW29mZnNldCArIDE0XSA9IDE2OyAvLyByZWQtc2hpZnRcbiAgICAgICAgYnVmZltvZmZzZXQgKyAxNV0gPSA4OyAvLyBncmVlbi1zaGlmdFxuICAgICAgICBidWZmW29mZnNldCArIDE2XSA9IDA7IC8vIGJsdWUtc2hpZnRcblxuICAgICAgICBidWZmW29mZnNldCArIDE3XSA9IDA7IC8vIHBhZGRpbmdcbiAgICAgICAgYnVmZltvZmZzZXQgKyAxOF0gPSAwOyAvLyBwYWRkaW5nXG4gICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMTldID0gMDsgLy8gcGFkZGluZ1xuXG4gICAgICAgIHNvY2suX3NRbGVuICs9IDIwO1xuICAgICAgICBzb2NrLmZsdXNoKCk7XG4gICAgfSxcblxuICAgIGNsaWVudEVuY29kaW5nczogZnVuY3Rpb24gKHNvY2ssIGVuY29kaW5ncywgbG9jYWxfY3Vyc29yLCB0cnVlX2NvbG9yKSB7XG4gICAgICAgIHZhciBidWZmID0gc29jay5fc1E7XG4gICAgICAgIHZhciBvZmZzZXQgPSBzb2NrLl9zUWxlbjtcblxuICAgICAgICBidWZmW29mZnNldF0gPSAyOyAvLyBtc2ctdHlwZVxuICAgICAgICBidWZmW29mZnNldCArIDFdID0gMDsgLy8gcGFkZGluZ1xuXG4gICAgICAgIC8vIG9mZnNldCArIDIgYW5kIG9mZnNldCArIDMgYXJlIGVuY29kaW5nIGNvdW50XG5cbiAgICAgICAgdmFyIGksXG4gICAgICAgICAgICBqID0gb2Zmc2V0ICsgNCxcbiAgICAgICAgICAgIGNudCA9IDA7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBlbmNvZGluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZ3NbaV1bMF0gPT09IFwiQ3Vyc29yXCIgJiYgIWxvY2FsX2N1cnNvcikge1xuICAgICAgICAgICAgICAgIExvZy5EZWJ1ZyhcIlNraXBwaW5nIEN1cnNvciBwc2V1ZG8tZW5jb2RpbmdcIik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVuY29kaW5nc1tpXVswXSA9PT0gXCJUSUdIVFwiICYmICF0cnVlX2NvbG9yKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgd2hlbiB3ZSBoYXZlIHRpZ2h0K25vbi10cnVlLWNvbG9yXG4gICAgICAgICAgICAgICAgTG9nLldhcm4oXCJTa2lwcGluZyB0aWdodCBhcyBpdCBpcyBvbmx5IHN1cHBvcnRlZCB3aXRoIHRydWUgY29sb3JcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZhciBlbmMgPSBlbmNvZGluZ3NbaV1bMV07XG4gICAgICAgICAgICAgICAgYnVmZltqXSA9IGVuYyA+PiAyNDtcbiAgICAgICAgICAgICAgICBidWZmW2ogKyAxXSA9IGVuYyA+PiAxNjtcbiAgICAgICAgICAgICAgICBidWZmW2ogKyAyXSA9IGVuYyA+PiA4O1xuICAgICAgICAgICAgICAgIGJ1ZmZbaiArIDNdID0gZW5jO1xuXG4gICAgICAgICAgICAgICAgaiArPSA0O1xuICAgICAgICAgICAgICAgIGNudCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnVmZltvZmZzZXQgKyAyXSA9IGNudCA+PiA4O1xuICAgICAgICBidWZmW29mZnNldCArIDNdID0gY250O1xuXG4gICAgICAgIHNvY2suX3NRbGVuICs9IGogLSBvZmZzZXQ7XG4gICAgICAgIHNvY2suZmx1c2goKTtcbiAgICB9LFxuXG4gICAgZmJVcGRhdGVSZXF1ZXN0OiBmdW5jdGlvbiAoc29jaywgaW5jcmVtZW50YWwsIHgsIHksIHcsIGgpIHtcbiAgICAgICAgdmFyIGJ1ZmYgPSBzb2NrLl9zUTtcbiAgICAgICAgdmFyIG9mZnNldCA9IHNvY2suX3NRbGVuO1xuXG4gICAgICAgIGlmICh0eXBlb2YgeCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgeCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB5ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICB5ID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1ZmZbb2Zmc2V0XSA9IDM7IC8vIG1zZy10eXBlXG4gICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMV0gPSBpbmNyZW1lbnRhbCA/IDEgOiAwO1xuXG4gICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMl0gPSB4ID4+IDggJiAweEZGO1xuICAgICAgICBidWZmW29mZnNldCArIDNdID0geCAmIDB4RkY7XG5cbiAgICAgICAgYnVmZltvZmZzZXQgKyA0XSA9IHkgPj4gOCAmIDB4RkY7XG4gICAgICAgIGJ1ZmZbb2Zmc2V0ICsgNV0gPSB5ICYgMHhGRjtcblxuICAgICAgICBidWZmW29mZnNldCArIDZdID0gdyA+PiA4ICYgMHhGRjtcbiAgICAgICAgYnVmZltvZmZzZXQgKyA3XSA9IHcgJiAweEZGO1xuXG4gICAgICAgIGJ1ZmZbb2Zmc2V0ICsgOF0gPSBoID4+IDggJiAweEZGO1xuICAgICAgICBidWZmW29mZnNldCArIDldID0gaCAmIDB4RkY7XG5cbiAgICAgICAgc29jay5fc1FsZW4gKz0gMTA7XG4gICAgICAgIHNvY2suZmx1c2goKTtcbiAgICB9XG59O1xuXG5SRkIuZ2VuREVTID0gZnVuY3Rpb24gKHBhc3N3b3JkLCBjaGFsbGVuZ2UpIHtcbiAgICB2YXIgcGFzc3dkID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXNzd29yZC5sZW5ndGg7IGkrKykge1xuICAgICAgICBwYXNzd2QucHVzaChwYXNzd29yZC5jaGFyQ29kZUF0KGkpKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBfZGVzMi5kZWZhdWx0KHBhc3N3ZCkuZW5jcnlwdChjaGFsbGVuZ2UpO1xufTtcblxuUkZCLmVuY29kaW5nSGFuZGxlcnMgPSB7XG4gICAgUkFXOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9GQlUubGluZXMgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX0ZCVS5saW5lcyA9IHRoaXMuX0ZCVS5oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSB0aGlzLl9GQlUud2lkdGggKiB0aGlzLl9mYl9CcHA7IC8vIGF0IGxlYXN0IGEgbGluZVxuICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJSQVdcIiwgdGhpcy5fRkJVLmJ5dGVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBjdXJfeSA9IHRoaXMuX0ZCVS55ICsgKHRoaXMuX0ZCVS5oZWlnaHQgLSB0aGlzLl9GQlUubGluZXMpO1xuICAgICAgICB2YXIgY3Vycl9oZWlnaHQgPSBNYXRoLm1pbih0aGlzLl9GQlUubGluZXMsIE1hdGguZmxvb3IodGhpcy5fc29jay5yUWxlbigpIC8gKHRoaXMuX0ZCVS53aWR0aCAqIHRoaXMuX2ZiX0JwcCkpKTtcbiAgICAgICAgdGhpcy5fZGlzcGxheS5ibGl0SW1hZ2UodGhpcy5fRkJVLngsIGN1cl95LCB0aGlzLl9GQlUud2lkdGgsIGN1cnJfaGVpZ2h0LCB0aGlzLl9zb2NrLmdldF9yUSgpLCB0aGlzLl9zb2NrLmdldF9yUWkoKSk7XG4gICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXModGhpcy5fRkJVLndpZHRoICogY3Vycl9oZWlnaHQgKiB0aGlzLl9mYl9CcHApO1xuICAgICAgICB0aGlzLl9GQlUubGluZXMgLT0gY3Vycl9oZWlnaHQ7XG5cbiAgICAgICAgaWYgKHRoaXMuX0ZCVS5saW5lcyA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyA9IHRoaXMuX0ZCVS53aWR0aCAqIHRoaXMuX2ZiX0JwcDsgLy8gQXQgbGVhc3QgYW5vdGhlciBsaW5lXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9GQlUucmVjdHMtLTtcbiAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgQ09QWVJFQ1Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fRkJVLmJ5dGVzID0gNDtcbiAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwiQ09QWVJFQ1RcIiwgNCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9kaXNwbGF5LmNvcHlJbWFnZSh0aGlzLl9zb2NrLnJRc2hpZnQxNigpLCB0aGlzLl9zb2NrLnJRc2hpZnQxNigpLCB0aGlzLl9GQlUueCwgdGhpcy5fRkJVLnksIHRoaXMuX0ZCVS53aWR0aCwgdGhpcy5fRkJVLmhlaWdodCk7XG5cbiAgICAgICAgdGhpcy5fRkJVLnJlY3RzLS07XG4gICAgICAgIHRoaXMuX0ZCVS5ieXRlcyA9IDA7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBSUkU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGNvbG9yO1xuICAgICAgICBpZiAodGhpcy5fRkJVLnN1YnJlY3RzID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSA0ICsgdGhpcy5fZmJfQnBwO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwiUlJFXCIsIDQgKyB0aGlzLl9mYl9CcHApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fRkJVLnN1YnJlY3RzID0gdGhpcy5fc29jay5yUXNoaWZ0MzIoKTtcbiAgICAgICAgICAgIGNvbG9yID0gdGhpcy5fc29jay5yUXNoaWZ0Qnl0ZXModGhpcy5fZmJfQnBwKTsgLy8gQmFja2dyb3VuZFxuICAgICAgICAgICAgdGhpcy5fZGlzcGxheS5maWxsUmVjdCh0aGlzLl9GQlUueCwgdGhpcy5fRkJVLnksIHRoaXMuX0ZCVS53aWR0aCwgdGhpcy5fRkJVLmhlaWdodCwgY29sb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKHRoaXMuX0ZCVS5zdWJyZWN0cyA+IDAgJiYgdGhpcy5fc29jay5yUWxlbigpID49IHRoaXMuX2ZiX0JwcCArIDgpIHtcbiAgICAgICAgICAgIGNvbG9yID0gdGhpcy5fc29jay5yUXNoaWZ0Qnl0ZXModGhpcy5fZmJfQnBwKTtcbiAgICAgICAgICAgIHZhciB4ID0gdGhpcy5fc29jay5yUXNoaWZ0MTYoKTtcbiAgICAgICAgICAgIHZhciB5ID0gdGhpcy5fc29jay5yUXNoaWZ0MTYoKTtcbiAgICAgICAgICAgIHZhciB3aWR0aCA9IHRoaXMuX3NvY2suclFzaGlmdDE2KCk7XG4gICAgICAgICAgICB2YXIgaGVpZ2h0ID0gdGhpcy5fc29jay5yUXNoaWZ0MTYoKTtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkuZmlsbFJlY3QodGhpcy5fRkJVLnggKyB4LCB0aGlzLl9GQlUueSArIHksIHdpZHRoLCBoZWlnaHQsIGNvbG9yKTtcbiAgICAgICAgICAgIHRoaXMuX0ZCVS5zdWJyZWN0cy0tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX0ZCVS5zdWJyZWN0cyA+IDApIHtcbiAgICAgICAgICAgIHZhciBjaHVuayA9IE1hdGgubWluKHRoaXMuX3JyZV9jaHVua19zeiwgdGhpcy5fRkJVLnN1YnJlY3RzKTtcbiAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyA9ICh0aGlzLl9mYl9CcHAgKyA4KSAqIGNodW5rO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fRkJVLnJlY3RzLS07XG4gICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIEhFWFRJTEU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHJRID0gdGhpcy5fc29jay5nZXRfclEoKTtcbiAgICAgICAgdmFyIHJRaSA9IHRoaXMuX3NvY2suZ2V0X3JRaSgpO1xuXG4gICAgICAgIGlmICh0aGlzLl9GQlUudGlsZXMgPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX0ZCVS50aWxlc194ID0gTWF0aC5jZWlsKHRoaXMuX0ZCVS53aWR0aCAvIDE2KTtcbiAgICAgICAgICAgIHRoaXMuX0ZCVS50aWxlc195ID0gTWF0aC5jZWlsKHRoaXMuX0ZCVS5oZWlnaHQgLyAxNik7XG4gICAgICAgICAgICB0aGlzLl9GQlUudG90YWxfdGlsZXMgPSB0aGlzLl9GQlUudGlsZXNfeCAqIHRoaXMuX0ZCVS50aWxlc195O1xuICAgICAgICAgICAgdGhpcy5fRkJVLnRpbGVzID0gdGhpcy5fRkJVLnRvdGFsX3RpbGVzO1xuICAgICAgICB9XG5cbiAgICAgICAgd2hpbGUgKHRoaXMuX0ZCVS50aWxlcyA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyA9IDE7XG4gICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJIRVhUSUxFIHN1YmVuY29kaW5nXCIsIHRoaXMuX0ZCVS5ieXRlcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgc3ViZW5jb2RpbmcgPSByUVtyUWldOyAvLyBQZWVrXG4gICAgICAgICAgICBpZiAoc3ViZW5jb2RpbmcgPiAzMCkge1xuICAgICAgICAgICAgICAgIC8vIFJhd1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZhaWwoXCJVbmV4cGVjdGVkIHNlcnZlciBtZXNzYWdlXCIsIFwiSWxsZWdhbCBoZXh0aWxlIHN1YmVuY29kaW5nOiBcIiArIHN1YmVuY29kaW5nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzdWJyZWN0cyA9IDA7XG4gICAgICAgICAgICB2YXIgY3Vycl90aWxlID0gdGhpcy5fRkJVLnRvdGFsX3RpbGVzIC0gdGhpcy5fRkJVLnRpbGVzO1xuICAgICAgICAgICAgdmFyIHRpbGVfeCA9IGN1cnJfdGlsZSAlIHRoaXMuX0ZCVS50aWxlc194O1xuICAgICAgICAgICAgdmFyIHRpbGVfeSA9IE1hdGguZmxvb3IoY3Vycl90aWxlIC8gdGhpcy5fRkJVLnRpbGVzX3gpO1xuICAgICAgICAgICAgdmFyIHggPSB0aGlzLl9GQlUueCArIHRpbGVfeCAqIDE2O1xuICAgICAgICAgICAgdmFyIHkgPSB0aGlzLl9GQlUueSArIHRpbGVfeSAqIDE2O1xuICAgICAgICAgICAgdmFyIHcgPSBNYXRoLm1pbigxNiwgdGhpcy5fRkJVLnggKyB0aGlzLl9GQlUud2lkdGggLSB4KTtcbiAgICAgICAgICAgIHZhciBoID0gTWF0aC5taW4oMTYsIHRoaXMuX0ZCVS55ICsgdGhpcy5fRkJVLmhlaWdodCAtIHkpO1xuXG4gICAgICAgICAgICAvLyBGaWd1cmUgb3V0IGhvdyBtdWNoIHdlIGFyZSBleHBlY3RpbmdcbiAgICAgICAgICAgIGlmIChzdWJlbmNvZGluZyAmIDB4MDEpIHtcbiAgICAgICAgICAgICAgICAvLyBSYXdcbiAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgKz0gdyAqIGggKiB0aGlzLl9mYl9CcHA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChzdWJlbmNvZGluZyAmIDB4MDIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgKz0gdGhpcy5fZmJfQnBwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc3ViZW5jb2RpbmcgJiAweDA0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvcmVncm91bmRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzICs9IHRoaXMuX2ZiX0JwcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHN1YmVuY29kaW5nICYgMHgwOCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBbnlTdWJyZWN0c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMrKzsgLy8gU2luY2Ugd2UgYXJlbid0IHNoaWZ0aW5nIGl0IG9mZlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJoZXh0aWxlIHN1YnJlY3RzIGhlYWRlclwiLCB0aGlzLl9GQlUuYnl0ZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3VicmVjdHMgPSByUVtyUWkgKyB0aGlzLl9GQlUuYnl0ZXMgLSAxXTsgLy8gUGVla1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3ViZW5jb2RpbmcgJiAweDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdWJyZWN0c0NvbG91cmVkXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgKz0gc3VicmVjdHMgKiAodGhpcy5fZmJfQnBwICsgMik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgKz0gc3VicmVjdHMgKiAyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJoZXh0aWxlXCIsIHRoaXMuX0ZCVS5ieXRlcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdlIGtub3cgdGhlIGVuY29kaW5nIGFuZCBoYXZlIGEgd2hvbGUgdGlsZVxuICAgICAgICAgICAgdGhpcy5fRkJVLnN1YmVuY29kaW5nID0gclFbclFpXTtcbiAgICAgICAgICAgIHJRaSsrO1xuICAgICAgICAgICAgaWYgKHRoaXMuX0ZCVS5zdWJlbmNvZGluZyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9GQlUubGFzdHN1YmVuY29kaW5nICYgMHgwMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZWlyZDogaWdub3JlIGJsYW5rcyBhcmUgUkFXXG4gICAgICAgICAgICAgICAgICAgIExvZy5EZWJ1ZyhcIiAgICAgSWdub3JpbmcgYmxhbmsgYWZ0ZXIgUkFXXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkuZmlsbFJlY3QoeCwgeSwgdywgaCwgdGhpcy5fRkJVLmJhY2tncm91bmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fRkJVLnN1YmVuY29kaW5nICYgMHgwMSkge1xuICAgICAgICAgICAgICAgIC8vIFJhd1xuICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkuYmxpdEltYWdlKHgsIHksIHcsIGgsIHJRLCByUWkpO1xuICAgICAgICAgICAgICAgIHJRaSArPSB0aGlzLl9GQlUuYnl0ZXMgLSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fRkJVLnN1YmVuY29kaW5nICYgMHgwMikge1xuICAgICAgICAgICAgICAgICAgICAvLyBCYWNrZ3JvdW5kXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9mYl9CcHAgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmJhY2tncm91bmQgPSByUVtyUWldO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmJfQnBwIGlzIDRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5iYWNrZ3JvdW5kID0gW3JRW3JRaV0sIHJRW3JRaSArIDFdLCByUVtyUWkgKyAyXSwgclFbclFpICsgM11dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJRaSArPSB0aGlzLl9mYl9CcHA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9GQlUuc3ViZW5jb2RpbmcgJiAweDA0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZvcmVncm91bmRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2ZiX0JwcCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9GQlUuZm9yZWdyb3VuZCA9IHJRW3JRaV07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl9mYl9CcHAgaXMgNFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmZvcmVncm91bmQgPSBbclFbclFpXSwgclFbclFpICsgMV0sIHJRW3JRaSArIDJdLCByUVtyUWkgKyAzXV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgclFpICs9IHRoaXMuX2ZiX0JwcDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5LnN0YXJ0VGlsZSh4LCB5LCB3LCBoLCB0aGlzLl9GQlUuYmFja2dyb3VuZCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX0ZCVS5zdWJlbmNvZGluZyAmIDB4MDgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQW55U3VicmVjdHNcbiAgICAgICAgICAgICAgICAgICAgc3VicmVjdHMgPSByUVtyUWldO1xuICAgICAgICAgICAgICAgICAgICByUWkrKztcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gMDsgcyA8IHN1YnJlY3RzOyBzKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9GQlUuc3ViZW5jb2RpbmcgJiAweDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3VicmVjdHNDb2xvdXJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9mYl9CcHAgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSByUVtyUWldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIF9mYl9CcHAgaXMgNFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IFtyUVtyUWldLCByUVtyUWkgKyAxXSwgclFbclFpICsgMl0sIHJRW3JRaSArIDNdXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgclFpICs9IHRoaXMuX2ZiX0JwcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSB0aGlzLl9GQlUuZm9yZWdyb3VuZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB4eSA9IHJRW3JRaV07XG4gICAgICAgICAgICAgICAgICAgICAgICByUWkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzeCA9IHh5ID4+IDQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3kgPSB4eSAmIDB4MGY7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aCA9IHJRW3JRaV07XG4gICAgICAgICAgICAgICAgICAgICAgICByUWkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdyA9ICh3aCA+PiA0KSArIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2ggPSAod2ggJiAweDBmKSArIDE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkuc3ViVGlsZShzeCwgc3ksIHN3LCBzaCwgY29sb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkuZmluaXNoVGlsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fc29jay5zZXRfclFpKHJRaSk7XG4gICAgICAgICAgICB0aGlzLl9GQlUubGFzdHN1YmVuY29kaW5nID0gdGhpcy5fRkJVLnN1YmVuY29kaW5nO1xuICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzID0gMDtcbiAgICAgICAgICAgIHRoaXMuX0ZCVS50aWxlcy0tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuX0ZCVS50aWxlcyA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fRkJVLnJlY3RzLS07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgZ2V0VGlnaHRDTGVuZ3RoOiBmdW5jdGlvbiAoYXJyKSB7XG4gICAgICAgIHZhciBoZWFkZXIgPSAxLFxuICAgICAgICAgICAgZGF0YSA9IDA7XG4gICAgICAgIGRhdGEgKz0gYXJyWzBdICYgMHg3ZjtcbiAgICAgICAgaWYgKGFyclswXSAmIDB4ODApIHtcbiAgICAgICAgICAgIGhlYWRlcisrO1xuICAgICAgICAgICAgZGF0YSArPSAoYXJyWzFdICYgMHg3ZikgPDwgNztcbiAgICAgICAgICAgIGlmIChhcnJbMV0gJiAweDgwKSB7XG4gICAgICAgICAgICAgICAgaGVhZGVyKys7XG4gICAgICAgICAgICAgICAgZGF0YSArPSBhcnJbMl0gPDwgMTQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtoZWFkZXIsIGRhdGFdO1xuICAgIH0sXG5cbiAgICBkaXNwbGF5X3RpZ2h0OiBmdW5jdGlvbiAoaXNUaWdodFBORykge1xuICAgICAgICBpZiAodGhpcy5fZmJfZGVwdGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZhaWwoXCJJbnRlcm5hbCBlcnJvclwiLCBcIlRpZ2h0IHByb3RvY29sIGhhbmRsZXIgb25seSBpbXBsZW1lbnRzIFwiICsgXCJ0cnVlIGNvbG9yIG1vZGVcIik7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSAxOyAvLyBjb21wcmVzc2lvbi1jb250cm9sIGJ5dGVcbiAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwiVElHSFQgY29tcHJlc3Npb24tY29udHJvbFwiLCB0aGlzLl9GQlUuYnl0ZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY2hlY2tzdW0gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBzdW0gKz0gZGF0YVtpXTtcbiAgICAgICAgICAgICAgICBpZiAoc3VtID4gNjU1MzYpIHN1bSAtPSA2NTUzNjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdW07XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIHJlc2V0U3RyZWFtcyA9IDA7XG4gICAgICAgIHZhciBzdHJlYW1JZCA9IC0xO1xuICAgICAgICB2YXIgZGVjb21wcmVzcyA9IGZ1bmN0aW9uIChkYXRhLCBleHBlY3RlZCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzZXRTdHJlYW1zID4+IGkgJiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS56bGlic1tpXS5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICBMb2cuSW5mbyhcIlJlc2V0IHpsaWIgc3RyZWFtIFwiICsgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL3ZhciB1bmNvbXByZXNzZWQgPSB0aGlzLl9GQlUuemxpYnNbc3RyZWFtSWRdLnVuY29tcHJlc3MoZGF0YSwgMCk7XG4gICAgICAgICAgICB2YXIgdW5jb21wcmVzc2VkID0gdGhpcy5fRkJVLnpsaWJzW3N0cmVhbUlkXS5pbmZsYXRlKGRhdGEsIHRydWUsIGV4cGVjdGVkKTtcbiAgICAgICAgICAgIC8qaWYgKHVuY29tcHJlc3NlZC5zdGF0dXMgIT09IDApIHtcbiAgICAgICAgICAgICAgICBMb2cuRXJyb3IoXCJJbnZhbGlkIGRhdGEgaW4gemxpYiBzdHJlYW1cIik7XG4gICAgICAgICAgICB9Ki9cblxuICAgICAgICAgICAgLy9yZXR1cm4gdW5jb21wcmVzc2VkLmRhdGE7XG4gICAgICAgICAgICByZXR1cm4gdW5jb21wcmVzc2VkO1xuICAgICAgICB9LmJpbmQodGhpcyk7XG5cbiAgICAgICAgdmFyIGluZGV4ZWRUb1JHQlgyQ29sb3IgPSBmdW5jdGlvbiAoZGF0YSwgcGFsZXR0ZSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgICAgICAgLy8gQ29udmVydCBpbmRleGVkIChwYWxldHRlIGJhc2VkKSBpbWFnZSBkYXRhIHRvIFJHQlxuICAgICAgICAgICAgLy8gVE9ETzogcmVkdWNlIG51bWJlciBvZiBjYWxjdWxhdGlvbnMgaW5zaWRlIGxvb3BcbiAgICAgICAgICAgIHZhciBkZXN0ID0gdGhpcy5fZGVzdEJ1ZmY7XG4gICAgICAgICAgICB2YXIgdyA9IE1hdGguZmxvb3IoKHdpZHRoICsgNykgLyA4KTtcbiAgICAgICAgICAgIHZhciB3MSA9IE1hdGguZmxvb3Iod2lkdGggLyA4KTtcblxuICAgICAgICAgICAgLypmb3IgKHZhciB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGIsIHgsIGRwLCBzcDtcbiAgICAgICAgICAgICAgICB2YXIgeW9mZnNldCA9IHkgKiB3aWR0aDtcbiAgICAgICAgICAgICAgICB2YXIgeWJpdG9mZnNldCA9IHkgKiB3O1xuICAgICAgICAgICAgICAgIHZhciB4b2Zmc2V0LCB0YXJnZXRieXRlO1xuICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3MTsgeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHhvZmZzZXQgPSB5b2Zmc2V0ICsgeCAqIDg7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldGJ5dGUgPSBkYXRhW3liaXRvZmZzZXQgKyB4XTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChiID0gNzsgYiA+PSAwOyBiLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRwID0gKHhvZmZzZXQgKyA3IC0gYikgKiAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3AgPSAodGFyZ2V0Ynl0ZSA+PiBiICYgMSkgKiAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtkcF0gPSBwYWxldHRlW3NwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbZHAgKyAxXSA9IHBhbGV0dGVbc3AgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbZHAgKyAyXSA9IHBhbGV0dGVbc3AgKyAyXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgeG9mZnNldCA9IHlvZmZzZXQgKyB4ICogODtcbiAgICAgICAgICAgICAgICB0YXJnZXRieXRlID0gZGF0YVt5Yml0b2Zmc2V0ICsgeF07XG4gICAgICAgICAgICAgICAgZm9yIChiID0gNzsgYiA+PSA4IC0gd2lkdGggJSA4OyBiLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgZHAgPSAoeG9mZnNldCArIDcgLSBiKSAqIDM7XG4gICAgICAgICAgICAgICAgICAgIHNwID0gKHRhcmdldGJ5dGUgPj4gYiAmIDEpICogMztcbiAgICAgICAgICAgICAgICAgICAgZGVzdFtkcF0gPSBwYWxldHRlW3NwXTtcbiAgICAgICAgICAgICAgICAgICAgZGVzdFtkcCArIDFdID0gcGFsZXR0ZVtzcCArIDFdO1xuICAgICAgICAgICAgICAgICAgICBkZXN0W2RwICsgMl0gPSBwYWxldHRlW3NwICsgMl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSovXG5cbiAgICAgICAgICAgIGZvciAodmFyIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgICAgICB2YXIgYiwgeCwgZHAsIHNwO1xuICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3MTsgeCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoYiA9IDc7IGIgPj0gMDsgYi0tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkcCA9ICh5ICogd2lkdGggKyB4ICogOCArIDcgLSBiKSAqIDQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcCA9IChkYXRhW3kgKiB3ICsgeF0gPj4gYiAmIDEpICogMztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbZHBdID0gcGFsZXR0ZVtzcF07XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2RwICsgMV0gPSBwYWxldHRlW3NwICsgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2RwICsgMl0gPSBwYWxldHRlW3NwICsgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2RwICsgM10gPSAyNTU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGIgPSA3OyBiID49IDggLSB3aWR0aCAlIDg7IGItLSkge1xuICAgICAgICAgICAgICAgICAgICBkcCA9ICh5ICogd2lkdGggKyB4ICogOCArIDcgLSBiKSAqIDQ7XG4gICAgICAgICAgICAgICAgICAgIHNwID0gKGRhdGFbeSAqIHcgKyB4XSA+PiBiICYgMSkgKiAzO1xuICAgICAgICAgICAgICAgICAgICBkZXN0W2RwXSA9IHBhbGV0dGVbc3BdO1xuICAgICAgICAgICAgICAgICAgICBkZXN0W2RwICsgMV0gPSBwYWxldHRlW3NwICsgMV07XG4gICAgICAgICAgICAgICAgICAgIGRlc3RbZHAgKyAyXSA9IHBhbGV0dGVbc3AgKyAyXTtcbiAgICAgICAgICAgICAgICAgICAgZGVzdFtkcCArIDNdID0gMjU1O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRlc3Q7XG4gICAgICAgIH0uYmluZCh0aGlzKTtcblxuICAgICAgICB2YXIgaW5kZXhlZFRvUkdCWCA9IGZ1bmN0aW9uIChkYXRhLCBwYWxldHRlLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgICAgICAvLyBDb252ZXJ0IGluZGV4ZWQgKHBhbGV0dGUgYmFzZWQpIGltYWdlIGRhdGEgdG8gUkdCXG4gICAgICAgICAgICB2YXIgZGVzdCA9IHRoaXMuX2Rlc3RCdWZmO1xuICAgICAgICAgICAgdmFyIHRvdGFsID0gd2lkdGggKiBoZWlnaHQgKiA0O1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSAwOyBpIDwgdG90YWw7IGkgKz0gNCwgaisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNwID0gZGF0YVtqXSAqIDM7XG4gICAgICAgICAgICAgICAgZGVzdFtpXSA9IHBhbGV0dGVbc3BdO1xuICAgICAgICAgICAgICAgIGRlc3RbaSArIDFdID0gcGFsZXR0ZVtzcCArIDFdO1xuICAgICAgICAgICAgICAgIGRlc3RbaSArIDJdID0gcGFsZXR0ZVtzcCArIDJdO1xuICAgICAgICAgICAgICAgIGRlc3RbaSArIDNdID0gMjU1O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGVzdDtcbiAgICAgICAgfS5iaW5kKHRoaXMpO1xuXG4gICAgICAgIHZhciByUWkgPSB0aGlzLl9zb2NrLmdldF9yUWkoKTtcbiAgICAgICAgdmFyIHJRID0gdGhpcy5fc29jay5yUXdob2xlKCk7XG4gICAgICAgIHZhciBjbW9kZSwgZGF0YTtcbiAgICAgICAgdmFyIGNsX2hlYWRlciwgY2xfZGF0YTtcblxuICAgICAgICB2YXIgaGFuZGxlUGFsZXR0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBudW1Db2xvcnMgPSByUVtyUWkgKyAyXSArIDE7XG4gICAgICAgICAgICB2YXIgcGFsZXR0ZVNpemUgPSBudW1Db2xvcnMgKiB0aGlzLl9mYl9kZXB0aDtcbiAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyArPSBwYWxldHRlU2l6ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdChcIlRJR0hUIHBhbGV0dGUgXCIgKyBjbW9kZSwgdGhpcy5fRkJVLmJ5dGVzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGJwcCA9IG51bUNvbG9ycyA8PSAyID8gMSA6IDg7XG4gICAgICAgICAgICB2YXIgcm93U2l6ZSA9IE1hdGguZmxvb3IoKHRoaXMuX0ZCVS53aWR0aCAqIGJwcCArIDcpIC8gOCk7XG4gICAgICAgICAgICB2YXIgcmF3ID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocm93U2l6ZSAqIHRoaXMuX0ZCVS5oZWlnaHQgPCAxMikge1xuICAgICAgICAgICAgICAgIHJhdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgY2xfaGVhZGVyID0gMDtcbiAgICAgICAgICAgICAgICBjbF9kYXRhID0gcm93U2l6ZSAqIHRoaXMuX0ZCVS5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgLy9jbGVuZ3RoID0gWzAsIHJvd1NpemUgKiB0aGlzLl9GQlUuaGVpZ2h0XTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gYmVnaW4gaW5saW5lIGdldFRpZ2h0Q0xlbmd0aCAocmV0dXJuaW5nIHR3by1pdGVtIGFycmF5cyBpcyBiYWQgZm9yIHBlcmZvcm1hbmNlIHdpdGggR0MpXG4gICAgICAgICAgICAgICAgdmFyIGNsX29mZnNldCA9IHJRaSArIDMgKyBwYWxldHRlU2l6ZTtcbiAgICAgICAgICAgICAgICBjbF9oZWFkZXIgPSAxO1xuICAgICAgICAgICAgICAgIGNsX2RhdGEgPSAwO1xuICAgICAgICAgICAgICAgIGNsX2RhdGEgKz0gclFbY2xfb2Zmc2V0XSAmIDB4N2Y7XG4gICAgICAgICAgICAgICAgaWYgKHJRW2NsX29mZnNldF0gJiAweDgwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsX2hlYWRlcisrO1xuICAgICAgICAgICAgICAgICAgICBjbF9kYXRhICs9IChyUVtjbF9vZmZzZXQgKyAxXSAmIDB4N2YpIDw8IDc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyUVtjbF9vZmZzZXQgKyAxXSAmIDB4ODApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsX2hlYWRlcisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xfZGF0YSArPSByUVtjbF9vZmZzZXQgKyAyXSA8PCAxNDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlbmQgaW5saW5lIGdldFRpZ2h0Q0xlbmd0aFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgKz0gY2xfaGVhZGVyICsgY2xfZGF0YTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdChcIlRJR0hUIFwiICsgY21vZGUsIHRoaXMuX0ZCVS5ieXRlcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNoaWZ0IGN0bCwgZmlsdGVyIGlkLCBudW0gY29sb3JzLCBwYWxldHRlIGVudHJpZXMsIGFuZCBjbGVuZ3RoIG9mZlxuICAgICAgICAgICAgdGhpcy5fc29jay5yUXNraXBCeXRlcygzKTtcbiAgICAgICAgICAgIC8vdmFyIHBhbGV0dGUgPSB0aGlzLl9zb2NrLnJRc2hpZnRCeXRlcyhwYWxldHRlU2l6ZSk7XG4gICAgICAgICAgICB0aGlzLl9zb2NrLnJRc2hpZnRUbyh0aGlzLl9wYWxldHRlQnVmZiwgcGFsZXR0ZVNpemUpO1xuICAgICAgICAgICAgdGhpcy5fc29jay5yUXNraXBCeXRlcyhjbF9oZWFkZXIpO1xuXG4gICAgICAgICAgICBpZiAocmF3KSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuX3NvY2suclFzaGlmdEJ5dGVzKGNsX2RhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZGVjb21wcmVzcyh0aGlzLl9zb2NrLnJRc2hpZnRCeXRlcyhjbF9kYXRhKSwgcm93U2l6ZSAqIHRoaXMuX0ZCVS5oZWlnaHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDb252ZXJ0IGluZGV4ZWQgKHBhbGV0dGUgYmFzZWQpIGltYWdlIGRhdGEgdG8gUkdCXG4gICAgICAgICAgICB2YXIgcmdieDtcbiAgICAgICAgICAgIGlmIChudW1Db2xvcnMgPT0gMikge1xuICAgICAgICAgICAgICAgIHJnYnggPSBpbmRleGVkVG9SR0JYMkNvbG9yKGRhdGEsIHRoaXMuX3BhbGV0dGVCdWZmLCB0aGlzLl9GQlUud2lkdGgsIHRoaXMuX0ZCVS5oZWlnaHQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkuYmxpdFJnYnhJbWFnZSh0aGlzLl9GQlUueCwgdGhpcy5fRkJVLnksIHRoaXMuX0ZCVS53aWR0aCwgdGhpcy5fRkJVLmhlaWdodCwgcmdieCwgMCwgZmFsc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZ2J4ID0gaW5kZXhlZFRvUkdCWChkYXRhLCB0aGlzLl9wYWxldHRlQnVmZiwgdGhpcy5fRkJVLndpZHRoLCB0aGlzLl9GQlUuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5LmJsaXRSZ2J4SW1hZ2UodGhpcy5fRkJVLngsIHRoaXMuX0ZCVS55LCB0aGlzLl9GQlUud2lkdGgsIHRoaXMuX0ZCVS5oZWlnaHQsIHJnYngsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0uYmluZCh0aGlzKTtcblxuICAgICAgICB2YXIgaGFuZGxlQ29weSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciByYXcgPSBmYWxzZTtcbiAgICAgICAgICAgIHZhciB1bmNvbXByZXNzZWRTaXplID0gdGhpcy5fRkJVLndpZHRoICogdGhpcy5fRkJVLmhlaWdodCAqIHRoaXMuX2ZiX2RlcHRoO1xuICAgICAgICAgICAgaWYgKHVuY29tcHJlc3NlZFNpemUgPCAxMikge1xuICAgICAgICAgICAgICAgIHJhdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgY2xfaGVhZGVyID0gMDtcbiAgICAgICAgICAgICAgICBjbF9kYXRhID0gdW5jb21wcmVzc2VkU2l6ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gYmVnaW4gaW5saW5lIGdldFRpZ2h0Q0xlbmd0aCAocmV0dXJuaW5nIHR3by1pdGVtIGFycmF5cyBpcyBmb3IgcGVmb3JtYW5jZSB3aXRoIEdDKVxuICAgICAgICAgICAgICAgIHZhciBjbF9vZmZzZXQgPSByUWkgKyAxO1xuICAgICAgICAgICAgICAgIGNsX2hlYWRlciA9IDE7XG4gICAgICAgICAgICAgICAgY2xfZGF0YSA9IDA7XG4gICAgICAgICAgICAgICAgY2xfZGF0YSArPSByUVtjbF9vZmZzZXRdICYgMHg3ZjtcbiAgICAgICAgICAgICAgICBpZiAoclFbY2xfb2Zmc2V0XSAmIDB4ODApIHtcbiAgICAgICAgICAgICAgICAgICAgY2xfaGVhZGVyKys7XG4gICAgICAgICAgICAgICAgICAgIGNsX2RhdGEgKz0gKHJRW2NsX29mZnNldCArIDFdICYgMHg3ZikgPDwgNztcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJRW2NsX29mZnNldCArIDFdICYgMHg4MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xfaGVhZGVyKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbF9kYXRhICs9IHJRW2NsX29mZnNldCArIDJdIDw8IDE0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVuZCBpbmxpbmUgZ2V0VGlnaHRDTGVuZ3RoXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSAxICsgY2xfaGVhZGVyICsgY2xfZGF0YTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdChcIlRJR0hUIFwiICsgY21vZGUsIHRoaXMuX0ZCVS5ieXRlcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNoaWZ0IGN0bCwgY2xlbmd0aCBvZmZcbiAgICAgICAgICAgIHRoaXMuX3NvY2suclFzaGlmdEJ5dGVzKDEgKyBjbF9oZWFkZXIpO1xuXG4gICAgICAgICAgICBpZiAocmF3KSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuX3NvY2suclFzaGlmdEJ5dGVzKGNsX2RhdGEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gZGVjb21wcmVzcyh0aGlzLl9zb2NrLnJRc2hpZnRCeXRlcyhjbF9kYXRhKSwgdW5jb21wcmVzc2VkU2l6ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkuYmxpdFJnYkltYWdlKHRoaXMuX0ZCVS54LCB0aGlzLl9GQlUueSwgdGhpcy5fRkJVLndpZHRoLCB0aGlzLl9GQlUuaGVpZ2h0LCBkYXRhLCAwLCBmYWxzZSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LmJpbmQodGhpcyk7XG5cbiAgICAgICAgdmFyIGN0bCA9IHRoaXMuX3NvY2suclFwZWVrOCgpO1xuXG4gICAgICAgIC8vIEtlZXAgdGlnaHQgcmVzZXQgYml0c1xuICAgICAgICByZXNldFN0cmVhbXMgPSBjdGwgJiAweEY7XG5cbiAgICAgICAgLy8gRmlndXJlIG91dCBmaWx0ZXJcbiAgICAgICAgY3RsID0gY3RsID4+IDQ7XG4gICAgICAgIHN0cmVhbUlkID0gY3RsICYgMHgzO1xuXG4gICAgICAgIGlmIChjdGwgPT09IDB4MDgpIGNtb2RlID0gXCJmaWxsXCI7ZWxzZSBpZiAoY3RsID09PSAweDA5KSBjbW9kZSA9IFwianBlZ1wiO2Vsc2UgaWYgKGN0bCA9PT0gMHgwQSkgY21vZGUgPSBcInBuZ1wiO2Vsc2UgaWYgKGN0bCAmIDB4MDQpIGNtb2RlID0gXCJmaWx0ZXJcIjtlbHNlIGlmIChjdGwgPCAweDA0KSBjbW9kZSA9IFwiY29weVwiO2Vsc2UgcmV0dXJuIHRoaXMuX2ZhaWwoXCJVbmV4cGVjdGVkIHNlcnZlciBtZXNzYWdlXCIsIFwiSWxsZWdhbCB0aWdodCBjb21wcmVzc2lvbiByZWNlaXZlZCwgXCIgKyBcImN0bDogXCIgKyBjdGwpO1xuXG4gICAgICAgIGlmIChpc1RpZ2h0UE5HICYmIChjbW9kZSA9PT0gXCJmaWx0ZXJcIiB8fCBjbW9kZSA9PT0gXCJjb3B5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZmFpbChcIlVuZXhwZWN0ZWQgc2VydmVyIG1lc3NhZ2VcIiwgXCJmaWx0ZXIvY29weSByZWNlaXZlZCBpbiB0aWdodFBORyBtb2RlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChjbW9kZSkge1xuICAgICAgICAgICAgLy8gZmlsbCB1c2UgZmJfZGVwdGggYmVjYXVzZSBUUElYRUxzIGRyb3AgdGhlIHBhZGRpbmcgYnl0ZVxuICAgICAgICAgICAgY2FzZSBcImZpbGxcIjpcbiAgICAgICAgICAgICAgICAvLyBUUElYRUxcbiAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgKz0gdGhpcy5fZmJfZGVwdGg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwianBlZ1wiOlxuICAgICAgICAgICAgICAgIC8vIG1heCBjbGVuZ3RoXG4gICAgICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzICs9IDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwicG5nXCI6XG4gICAgICAgICAgICAgICAgLy8gbWF4IGNsZW5ndGhcbiAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgKz0gMztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJmaWx0ZXJcIjpcbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgaWQgKyBudW0gY29sb3JzIGlmIHBhbGV0dGVcbiAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgKz0gMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJjb3B5XCI6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJUSUdIVCBcIiArIGNtb2RlLCB0aGlzLl9GQlUuYnl0ZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZXRlcm1pbmUgRkJVLmJ5dGVzXG4gICAgICAgIHN3aXRjaCAoY21vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJmaWxsXCI6XG4gICAgICAgICAgICAgICAgLy8gc2tpcCBjdGwgYnl0ZVxuICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkuZmlsbFJlY3QodGhpcy5fRkJVLngsIHRoaXMuX0ZCVS55LCB0aGlzLl9GQlUud2lkdGgsIHRoaXMuX0ZCVS5oZWlnaHQsIFtyUVtyUWkgKyAzXSwgclFbclFpICsgMl0sIHJRW3JRaSArIDFdXSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoNCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwicG5nXCI6XG4gICAgICAgICAgICBjYXNlIFwianBlZ1wiOlxuICAgICAgICAgICAgICAgIC8vIGJlZ2luIGlubGluZSBnZXRUaWdodENMZW5ndGggKHJldHVybmluZyB0d28taXRlbSBhcnJheXMgaXMgZm9yIHBlZm9ybWFuY2Ugd2l0aCBHQylcbiAgICAgICAgICAgICAgICB2YXIgY2xfb2Zmc2V0ID0gclFpICsgMTtcbiAgICAgICAgICAgICAgICBjbF9oZWFkZXIgPSAxO1xuICAgICAgICAgICAgICAgIGNsX2RhdGEgPSAwO1xuICAgICAgICAgICAgICAgIGNsX2RhdGEgKz0gclFbY2xfb2Zmc2V0XSAmIDB4N2Y7XG4gICAgICAgICAgICAgICAgaWYgKHJRW2NsX29mZnNldF0gJiAweDgwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsX2hlYWRlcisrO1xuICAgICAgICAgICAgICAgICAgICBjbF9kYXRhICs9IChyUVtjbF9vZmZzZXQgKyAxXSAmIDB4N2YpIDw8IDc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyUVtjbF9vZmZzZXQgKyAxXSAmIDB4ODApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsX2hlYWRlcisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xfZGF0YSArPSByUVtjbF9vZmZzZXQgKyAyXSA8PCAxNDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBlbmQgaW5saW5lIGdldFRpZ2h0Q0xlbmd0aFxuICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyA9IDEgKyBjbF9oZWFkZXIgKyBjbF9kYXRhOyAvLyBjdGwgKyBjbGVuZ3RoIHNpemUgKyBqcGVnLWRhdGFcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJUSUdIVCBcIiArIGNtb2RlLCB0aGlzLl9GQlUuYnl0ZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGV2ZXJ5dGhpbmcsIHJlbmRlciBpdFxuICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoMSArIGNsX2hlYWRlcik7IC8vIHNoaWZ0IG9mZiBjbHQgKyBjb21wYWN0IGxlbmd0aFxuICAgICAgICAgICAgICAgIGRhdGEgPSB0aGlzLl9zb2NrLnJRc2hpZnRCeXRlcyhjbF9kYXRhKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5LmltYWdlUmVjdCh0aGlzLl9GQlUueCwgdGhpcy5fRkJVLnksIFwiaW1hZ2UvXCIgKyBjbW9kZSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiZmlsdGVyXCI6XG4gICAgICAgICAgICAgICAgdmFyIGZpbHRlcklkID0gclFbclFpICsgMV07XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlcklkID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaGFuZGxlUGFsZXR0ZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgMCwgQ29weSBjb3VsZCBiZSB2YWxpZCBoZXJlLCBidXQgc2VydmVycyBkb24ndCBzZW5kIGl0IGFzIGFuIGV4cGxpY2l0IGZpbHRlclxuICAgICAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgMiwgR3JhZGllbnQgaXMgdmFsaWQgYnV0IG5vdCB1c2UgaWYganBlZyBpcyBlbmFibGVkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZhaWwoXCJVbmV4cGVjdGVkIHNlcnZlciBtZXNzYWdlXCIsIFwiVW5zdXBwb3J0ZWQgdGlnaHQgc3ViZW5jb2RpbmcgcmVjZWl2ZWQsIFwiICsgXCJmaWx0ZXI6IFwiICsgZmlsdGVySWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJjb3B5XCI6XG4gICAgICAgICAgICAgICAgaWYgKCFoYW5kbGVDb3B5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX0ZCVS5ieXRlcyA9IDA7XG4gICAgICAgIHRoaXMuX0ZCVS5yZWN0cy0tO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBUSUdIVDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jSGFuZGxlcnMuZGlzcGxheV90aWdodChmYWxzZSk7XG4gICAgfSxcbiAgICBUSUdIVF9QTkc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VuY0hhbmRsZXJzLmRpc3BsYXlfdGlnaHQodHJ1ZSk7XG4gICAgfSxcblxuICAgIGxhc3RfcmVjdDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9GQlUucmVjdHMgPSAwO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgaGFuZGxlX0ZCX3Jlc2l6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9mYl93aWR0aCA9IHRoaXMuX0ZCVS53aWR0aDtcbiAgICAgICAgdGhpcy5fZmJfaGVpZ2h0ID0gdGhpcy5fRkJVLmhlaWdodDtcbiAgICAgICAgdGhpcy5fZGVzdEJ1ZmYgPSBuZXcgVWludDhBcnJheSh0aGlzLl9mYl93aWR0aCAqIHRoaXMuX2ZiX2hlaWdodCAqIDQpO1xuICAgICAgICB0aGlzLl9kaXNwbGF5LnJlc2l6ZSh0aGlzLl9mYl93aWR0aCwgdGhpcy5fZmJfaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5fb25GQlJlc2l6ZSh0aGlzLCB0aGlzLl9mYl93aWR0aCwgdGhpcy5fZmJfaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5fdGltaW5nLmZidV9ydF9zdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB0aGlzLl91cGRhdGVDb250aW51b3VzVXBkYXRlcygpO1xuXG4gICAgICAgIHRoaXMuX0ZCVS5ieXRlcyA9IDA7XG4gICAgICAgIHRoaXMuX0ZCVS5yZWN0cyAtPSAxO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuXG4gICAgRXh0ZW5kZWREZXNrdG9wU2l6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSAxO1xuICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJFeHRlbmRlZERlc2t0b3BTaXplXCIsIHRoaXMuX0ZCVS5ieXRlcykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3N1cHBvcnRzU2V0RGVza3RvcFNpemUgPSB0cnVlO1xuICAgICAgICB2YXIgbnVtYmVyX29mX3NjcmVlbnMgPSB0aGlzLl9zb2NrLnJRcGVlazgoKTtcblxuICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSA0ICsgbnVtYmVyX29mX3NjcmVlbnMgKiAxNjtcbiAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwiRXh0ZW5kZWREZXNrdG9wU2l6ZVwiLCB0aGlzLl9GQlUuYnl0ZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zb2NrLnJRc2tpcEJ5dGVzKDEpOyAvLyBudW1iZXItb2Ytc2NyZWVuc1xuICAgICAgICB0aGlzLl9zb2NrLnJRc2tpcEJ5dGVzKDMpOyAvLyBwYWRkaW5nXG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1iZXJfb2Zfc2NyZWVuczsgaSArPSAxKSB7XG4gICAgICAgICAgICAvLyBTYXZlIHRoZSBpZCBhbmQgZmxhZ3Mgb2YgdGhlIGZpcnN0IHNjcmVlblxuICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zY3JlZW5faWQgPSB0aGlzLl9zb2NrLnJRc2hpZnRCeXRlcyg0KTsgLy8gaWRcbiAgICAgICAgICAgICAgICB0aGlzLl9zb2NrLnJRc2tpcEJ5dGVzKDIpOyAvLyB4LXBvc2l0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5fc29jay5yUXNraXBCeXRlcygyKTsgLy8geS1wb3NpdGlvblxuICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoMik7IC8vIHdpZHRoXG4gICAgICAgICAgICAgICAgdGhpcy5fc29jay5yUXNraXBCeXRlcygyKTsgLy8gaGVpZ2h0XG4gICAgICAgICAgICAgICAgdGhpcy5fc2NyZWVuX2ZsYWdzID0gdGhpcy5fc29jay5yUXNoaWZ0Qnl0ZXMoNCk7IC8vIGZsYWdzXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoMTYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICogVGhlIHgtcG9zaXRpb24gaW5kaWNhdGVzIHRoZSByZWFzb24gZm9yIHRoZSBjaGFuZ2U6XG4gICAgICAgICAqXG4gICAgICAgICAqICAwIC0gc2VydmVyIHJlc2l6ZWQgb24gaXRzIG93blxuICAgICAgICAgKiAgMSAtIHRoaXMgY2xpZW50IHJlcXVlc3RlZCB0aGUgcmVzaXplXG4gICAgICAgICAqICAyIC0gYW5vdGhlciBjbGllbnQgcmVxdWVzdGVkIHRoZSByZXNpemVcbiAgICAgICAgICovXG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byBoYW5kbGUgZXJyb3JzIHdoZW4gd2UgcmVxdWVzdGVkIHRoZSByZXNpemUuXG4gICAgICAgIGlmICh0aGlzLl9GQlUueCA9PT0gMSAmJiB0aGlzLl9GQlUueSAhPT0gMCkge1xuICAgICAgICAgICAgdmFyIG1zZyA9IFwiXCI7XG4gICAgICAgICAgICAvLyBUaGUgeS1wb3NpdGlvbiBpbmRpY2F0ZXMgdGhlIHN0YXR1cyBjb2RlIGZyb20gdGhlIHNlcnZlclxuICAgICAgICAgICAgc3dpdGNoICh0aGlzLl9GQlUueSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgbXNnID0gXCJSZXNpemUgaXMgYWRtaW5pc3RyYXRpdmVseSBwcm9oaWJpdGVkXCI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgbXNnID0gXCJPdXQgb2YgcmVzb3VyY2VzXCI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgbXNnID0gXCJJbnZhbGlkIHNjcmVlbiBsYXlvdXRcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgbXNnID0gXCJVbmtub3duIHJlYXNvblwiO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX25vdGlmaWNhdGlvbihcIlNlcnZlciBkaWQgbm90IGFjY2VwdCB0aGUgcmVzaXplIHJlcXVlc3Q6IFwiICsgbXNnLCAnbm9ybWFsJyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2VuY0hhbmRsZXJzLmhhbmRsZV9GQl9yZXNpemUoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIERlc2t0b3BTaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX2VuY0hhbmRsZXJzLmhhbmRsZV9GQl9yZXNpemUoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcblxuICAgIEN1cnNvcjogZnVuY3Rpb24gKCkge1xuICAgICAgICBMb2cuRGVidWcoXCI+PiBzZXRfY3Vyc29yXCIpO1xuICAgICAgICB2YXIgeCA9IHRoaXMuX0ZCVS54OyAvLyBob3RzcG90LXhcbiAgICAgICAgdmFyIHkgPSB0aGlzLl9GQlUueTsgLy8gaG90c3BvdC15XG4gICAgICAgIHZhciB3ID0gdGhpcy5fRkJVLndpZHRoO1xuICAgICAgICB2YXIgaCA9IHRoaXMuX0ZCVS5oZWlnaHQ7XG5cbiAgICAgICAgdmFyIHBpeGVsc2xlbmd0aCA9IHcgKiBoICogdGhpcy5fZmJfQnBwO1xuICAgICAgICB2YXIgbWFza2xlbmd0aCA9IE1hdGguZmxvb3IoKHcgKyA3KSAvIDgpICogaDtcblxuICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSBwaXhlbHNsZW5ndGggKyBtYXNrbGVuZ3RoO1xuICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJjdXJzb3IgZW5jb2RpbmdcIiwgdGhpcy5fRkJVLmJ5dGVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZGlzcGxheS5jaGFuZ2VDdXJzb3IodGhpcy5fc29jay5yUXNoaWZ0Qnl0ZXMocGl4ZWxzbGVuZ3RoKSwgdGhpcy5fc29jay5yUXNoaWZ0Qnl0ZXMobWFza2xlbmd0aCksIHgsIHksIHcsIGgpO1xuXG4gICAgICAgIHRoaXMuX0ZCVS5ieXRlcyA9IDA7XG4gICAgICAgIHRoaXMuX0ZCVS5yZWN0cy0tO1xuXG4gICAgICAgIExvZy5EZWJ1ZyhcIjw8IHNldF9jdXJzb3JcIik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG5cbiAgICBRRU1VRXh0ZW5kZWRLZXlFdmVudDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9GQlUucmVjdHMtLTtcblxuICAgICAgICB2YXIga2V5Ym9hcmRFdmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KFwia2V5Ym9hcmRFdmVudFwiKTtcbiAgICAgICAgaWYgKGtleWJvYXJkRXZlbnQuY29kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9xZW11RXh0S2V5RXZlbnRTdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fa2V5Ym9hcmQuc2V0UUVNVVZOQ0tleWJvYXJkSGFuZGxlcigpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIEpQRUdfcXVhbGl0eV9sbzogZnVuY3Rpb24gKCkge1xuICAgICAgICBMb2cuRXJyb3IoXCJTZXJ2ZXIgc2VudCBqcGVnX3F1YWxpdHkgcHNldWRvLWVuY29kaW5nXCIpO1xuICAgIH0sXG5cbiAgICBjb21wcmVzc19sbzogZnVuY3Rpb24gKCkge1xuICAgICAgICBMb2cuRXJyb3IoXCJTZXJ2ZXIgc2VudCBjb21wcmVzcyBsZXZlbCBwc2V1ZG8tZW5jb2RpbmdcIik7XG4gICAgfVxufTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuaXNUb3VjaERldmljZSA9IGV4cG9ydHMuRW5naW5lID0gdW5kZWZpbmVkO1xuZXhwb3J0cy5icm93c2VyU3VwcG9ydHNDdXJzb3JVUklzID0gYnJvd3NlclN1cHBvcnRzQ3Vyc29yVVJJcztcbmV4cG9ydHMuX2ZvcmNlQ3Vyc29yVVJJcyA9IF9mb3JjZUN1cnNvclVSSXM7XG5cbnZhciBfbG9nZ2luZyA9IHJlcXVpcmUoJy4vbG9nZ2luZy5qcycpO1xuXG52YXIgTG9nID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2xvZ2dpbmcpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGVsc2UgeyB2YXIgbmV3T2JqID0ge307IGlmIChvYmogIT0gbnVsbCkgeyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IHJldHVybiBuZXdPYmo7IH0gfVxuXG4vLyBTZXQgYnJvd3NlciBlbmdpbmUgdmVyc2lvbnMuIEJhc2VkIG9uIG1vb3Rvb2xzLlxudmFyIEZlYXR1cmVzID0geyB4cGF0aDogISFkb2N1bWVudC5ldmFsdWF0ZSwgcXVlcnk6ICEhZG9jdW1lbnQucXVlcnlTZWxlY3RvciB9O1xuXG4vLyAncHJlc3RvJzogKGZ1bmN0aW9uICgpIHsgcmV0dXJuICghd2luZG93Lm9wZXJhKSA/IGZhbHNlIDogdHJ1ZTsgfSgpKSxcbi8qXG4gKiBub1ZOQzogSFRNTDUgVk5DIGNsaWVudFxuICogQ29weXJpZ2h0IChDKSAyMDEyIEpvZWwgTWFydGluXG4gKiBMaWNlbnNlZCB1bmRlciBNUEwgMi4wIChzZWUgTElDRU5TRS50eHQpXG4gKlxuICogU2VlIFJFQURNRS5tZCBmb3IgdXNhZ2UgYW5kIGludGVncmF0aW9uIGluc3RydWN0aW9ucy5cbiAqL1xuXG52YXIgZGV0ZWN0UHJlc3RvID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXdpbmRvdy5vcGVyYTtcbn07XG5cbi8vICd0cmlkZW50JzogKGZ1bmN0aW9uICgpIHsgcmV0dXJuICghd2luZG93LkFjdGl2ZVhPYmplY3QpID8gZmFsc2UgOiAoKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCkgPyAoKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwpID8gNiA6IDUpIDogNCk7XG52YXIgZGV0ZWN0VHJpZGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXdpbmRvdy5BY3RpdmVYT2JqZWN0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAod2luZG93LlhNTEh0dHBSZXF1ZXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCA/IDYgOiA1O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDQ7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vLyAnd2Via2l0JzogKGZ1bmN0aW9uICgpIHsgdHJ5IHsgcmV0dXJuIChuYXZpZ2F0b3IudGFpbnRFbmFibGVkKSA/IGZhbHNlIDogKChGZWF0dXJlcy54cGF0aCkgPyAoKEZlYXR1cmVzLnF1ZXJ5KSA/IDUyNSA6IDQyMCkgOiA0MTkpOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9KCkpLFxudmFyIGRldGVjdEluaXRpYWxXZWJraXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKG5hdmlnYXRvci50YWludEVuYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChGZWF0dXJlcy54cGF0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBGZWF0dXJlcy5xdWVyeSA/IDUyNSA6IDQyMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDQxOTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG5cbnZhciBkZXRlY3RBY3R1YWxXZWJraXQgPSBmdW5jdGlvbiAoaW5pdGlhbF92ZXIpIHtcbiAgICB2YXIgcmUgPSAvV2ViS2l0XFwvKFswLTlcXC5dKikgLztcbiAgICB2YXIgc3RyX3ZlciA9IChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKHJlKSB8fCBbJycsIGluaXRpYWxfdmVyXSlbMV07XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoc3RyX3ZlciwgMTApO1xufTtcblxuLy8gJ2dlY2tvJzogKGZ1bmN0aW9uICgpIHsgcmV0dXJuICghZG9jdW1lbnQuZ2V0Qm94T2JqZWN0Rm9yICYmIHdpbmRvdy5tb3pJbm5lclNjcmVlblggPT0gbnVsbCkgPyBmYWxzZSA6ICgoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSkgPyAxOXNzTmFtZSkgPyAxOSA6IDE4IDogMTgpOyB9KCkpXG52YXIgZGV0ZWN0R2Vja28gPSBmdW5jdGlvbiAoKSB7XG4gICAgLyoganNoaW50IC1XMDQxICovXG4gICAgaWYgKCFkb2N1bWVudC5nZXRCb3hPYmplY3RGb3IgJiYgd2luZG93Lm1veklubmVyU2NyZWVuWCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSA/IDE5IDogMTg7XG4gICAgfVxuICAgIC8qIGpzaGludCArVzA0MSAqL1xufTtcblxudmFyIGlzV2Via2l0SW5pdGlhbCA9IGRldGVjdEluaXRpYWxXZWJraXQoKTtcblxudmFyIEVuZ2luZSA9IGV4cG9ydHMuRW5naW5lID0ge1xuICAgIC8vIFZlcnNpb24gZGV0ZWN0aW9uIGJyZWFrIGluIE9wZXJhIDExLjYwIChlcnJvcnMgb24gYXJndW1lbnRzLmNhbGxlZS5jYWxsZXIgcmVmZXJlbmNlKVxuICAgIC8vJ3ByZXN0byc6IChmdW5jdGlvbigpIHtcbiAgICAvLyAgICAgICAgIHJldHVybiAoIXdpbmRvdy5vcGVyYSkgPyBmYWxzZSA6ICgoYXJndW1lbnRzLmNhbGxlZS5jYWxsZXIpID8gOTYwIDogKChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSA/IDk1MCA6IDkyNSkpOyB9KCkpLFxuICAgICdwcmVzdG8nOiBkZXRlY3RQcmVzdG8oKSxcbiAgICAndHJpZGVudCc6IGRldGVjdFRyaWRlbnQoKSxcbiAgICAnd2Via2l0JzogaXNXZWJraXRJbml0aWFsID8gZGV0ZWN0QWN0dWFsV2Via2l0KGlzV2Via2l0SW5pdGlhbCkgOiBmYWxzZSxcbiAgICAnZ2Vja28nOiBkZXRlY3RHZWNrbygpXG59O1xuXG4vLyBUb3VjaCBkZXRlY3Rpb25cbnZhciBpc1RvdWNoRGV2aWNlID0gZXhwb3J0cy5pc1RvdWNoRGV2aWNlID0gJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8XG4vLyByZXF1cmllZCBmb3IgQ2hyb21lIGRlYnVnZ2VyXG5kb2N1bWVudC5vbnRvdWNoc3RhcnQgIT09IHVuZGVmaW5lZCB8fFxuLy8gcmVxdWlyZWQgZm9yIE1TIFN1cmZhY2Vcbm5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDAgfHwgbmF2aWdhdG9yLm1zTWF4VG91Y2hQb2ludHMgPiAwO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBmdW5jdGlvbiBvbkZpcnN0VG91Y2goKSB7XG4gICAgZXhwb3J0cy5pc1RvdWNoRGV2aWNlID0gaXNUb3VjaERldmljZSA9IHRydWU7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvbkZpcnN0VG91Y2gsIGZhbHNlKTtcbn0sIGZhbHNlKTtcblxudmFyIF9jdXJzb3JfdXJpc19zdXBwb3J0ZWQgPSBudWxsO1xuXG5mdW5jdGlvbiBicm93c2VyU3VwcG9ydHNDdXJzb3JVUklzKCkge1xuICAgIGlmIChfY3Vyc29yX3VyaXNfc3VwcG9ydGVkID09PSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICB0YXJnZXQuc3R5bGUuY3Vyc29yID0gJ3VybChcImRhdGE6aW1hZ2UveC1pY29uO2Jhc2U2NCxBQUFDQUFFQUNBZ0FBQUlBQWdBNEFRQUFGZ0FBQUNnQUFBQUlBQUFBRUFBQUFBRUFJQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vQUFBQUFBQUFBQUFBQUFBQUFBQUFBQT09XCIpIDIgMiwgZGVmYXVsdCc7XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuc3R5bGUuY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgTG9nLkluZm8oXCJEYXRhIFVSSSBzY2hlbWUgY3Vyc29yIHN1cHBvcnRlZFwiKTtcbiAgICAgICAgICAgICAgICBfY3Vyc29yX3VyaXNfc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgTG9nLldhcm4oXCJEYXRhIFVSSSBzY2hlbWUgY3Vyc29yIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICAgICAgX2N1cnNvcl91cmlzX3N1cHBvcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChleGMpIHtcbiAgICAgICAgICAgIExvZy5FcnJvcihcIkRhdGEgVVJJIHNjaGVtZSBjdXJzb3IgdGVzdCBleGNlcHRpb246IFwiICsgZXhjKTtcbiAgICAgICAgICAgIF9jdXJzb3JfdXJpc19zdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBfY3Vyc29yX3VyaXNfc3VwcG9ydGVkO1xufTtcblxuZnVuY3Rpb24gX2ZvcmNlQ3Vyc29yVVJJcyhlbmFibGVkKSB7XG4gICAgaWYgKGVuYWJsZWQgPT09IHVuZGVmaW5lZCB8fCBlbmFibGVkKSB7XG4gICAgICAgIF9jdXJzb3JfdXJpc19zdXBwb3J0ZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIF9jdXJzb3JfdXJpc19zdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICB9XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2V0UG9pbnRlckV2ZW50ID0gZ2V0UG9pbnRlckV2ZW50O1xuZXhwb3J0cy5zdG9wRXZlbnQgPSBzdG9wRXZlbnQ7XG5leHBvcnRzLnNldENhcHR1cmUgPSBzZXRDYXB0dXJlO1xuZXhwb3J0cy5yZWxlYXNlQ2FwdHVyZSA9IHJlbGVhc2VDYXB0dXJlO1xuXG52YXIgX2xvZ2dpbmcgPSByZXF1aXJlKFwiLi9sb2dnaW5nLmpzXCIpO1xuXG52YXIgTG9nID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2xvZ2dpbmcpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGVsc2UgeyB2YXIgbmV3T2JqID0ge307IGlmIChvYmogIT0gbnVsbCkgeyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IHJldHVybiBuZXdPYmo7IH0gfVxuXG5mdW5jdGlvbiBnZXRQb2ludGVyRXZlbnQoZSkge1xuICAgIHJldHVybiBlLmNoYW5nZWRUb3VjaGVzID8gZS5jaGFuZ2VkVG91Y2hlc1swXSA6IGUudG91Y2hlcyA/IGUudG91Y2hlc1swXSA6IGU7XG59IC8qXG4gICAqIG5vVk5DOiBIVE1MNSBWTkMgY2xpZW50XG4gICAqIENvcHlyaWdodCAoQykgMjAxMiBKb2VsIE1hcnRpblxuICAgKiBMaWNlbnNlZCB1bmRlciBNUEwgMi4wIChzZWUgTElDRU5TRS50eHQpXG4gICAqXG4gICAqIFNlZSBSRUFETUUubWQgZm9yIHVzYWdlIGFuZCBpbnRlZ3JhdGlvbiBpbnN0cnVjdGlvbnMuXG4gICAqL1xuXG4vKlxuICogQ3Jvc3MtYnJvd3NlciBldmVudCBhbmQgcG9zaXRpb24gcm91dGluZXNcbiAqL1xuXG47XG5cbmZ1bmN0aW9uIHN0b3BFdmVudChlKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG59O1xuXG4vLyBFbXVsYXRlIEVsZW1lbnQuc2V0Q2FwdHVyZSgpIHdoZW4gbm90IHN1cHBvcnRlZFxudmFyIF9jYXB0dXJlUmVjdXJzaW9uID0gZmFsc2U7XG52YXIgX2NhcHR1cmVFbGVtID0gbnVsbDtcbnZhciBfY2FwdHVyZVByb3h5ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAvLyBSZWN1cnNpb24gcHJvdGVjdGlvbiBhcyB3ZSdsbCBzZWUgb3VyIG93biBldmVudFxuICAgIGlmIChfY2FwdHVyZVJlY3Vyc2lvbikgcmV0dXJuO1xuXG4gICAgLy8gQ2xvbmUgdGhlIGV2ZW50IGFzIHdlIGNhbm5vdCBkaXNwYXRjaCBhbiBhbHJlYWR5IGRpc3BhdGNoZWQgZXZlbnRcbiAgICB2YXIgbmV3RXYgPSBuZXcgZS5jb25zdHJ1Y3RvcihlLnR5cGUsIGUpO1xuXG4gICAgX2NhcHR1cmVSZWN1cnNpb24gPSB0cnVlO1xuICAgIF9jYXB0dXJlRWxlbS5kaXNwYXRjaEV2ZW50KG5ld0V2KTtcbiAgICBfY2FwdHVyZVJlY3Vyc2lvbiA9IGZhbHNlO1xuXG4gICAgLy8gQXZvaWQgZG91YmxlIGV2ZW50c1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAvLyBSZXNwZWN0IHRoZSB3aXNoZXMgb2YgdGhlIHJlZGlyZWN0ZWQgZXZlbnQgaGFuZGxlcnNcbiAgICBpZiAobmV3RXYuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgLy8gSW1wbGljaXRseSByZWxlYXNlIHRoZSBjYXB0dXJlIG9uIGJ1dHRvbiByZWxlYXNlXG4gICAgaWYgKGUudHlwZSA9PT0gXCJtb3VzZXVwXCIgfHwgZS50eXBlID09PSBcInRvdWNoZW5kXCIpIHtcbiAgICAgICAgcmVsZWFzZUNhcHR1cmUoKTtcbiAgICB9XG59O1xuXG4vLyBGb2xsb3cgY3Vyc29yIHN0eWxlIG9mIHRhcmdldCBlbGVtZW50XG52YXIgX2NhcHR1cmVFbGVtQ2hhbmdlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2FwdHVyZUVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm5vVk5DX21vdXNlX2NhcHR1cmVfZWxlbVwiKTtcbiAgICBjYXB0dXJlRWxlbS5zdHlsZS5jdXJzb3IgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShfY2FwdHVyZUVsZW0pLmN1cnNvcjtcbn07XG52YXIgX2NhcHR1cmVPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKF9jYXB0dXJlRWxlbUNoYW5nZWQpO1xuXG52YXIgX2NhcHR1cmVJbmRleCA9IDA7XG5cbmZ1bmN0aW9uIHNldENhcHR1cmUoZWxlbSkge1xuICAgIGlmIChlbGVtLnNldENhcHR1cmUpIHtcblxuICAgICAgICBlbGVtLnNldENhcHR1cmUoKTtcblxuICAgICAgICAvLyBJRSByZWxlYXNlcyBjYXB0dXJlIG9uICdjbGljaycgZXZlbnRzIHdoaWNoIG1pZ2h0IG5vdCB0cmlnZ2VyXG4gICAgICAgIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHJlbGVhc2VDYXB0dXJlKTtcbiAgICAgICAgZWxlbS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHJlbGVhc2VDYXB0dXJlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZWxlYXNlIGFueSBleGlzdGluZyBjYXB0dXJlIGluIGNhc2UgdGhpcyBtZXRob2QgaXNcbiAgICAgICAgLy8gY2FsbGVkIG11bHRpcGxlIHRpbWVzIHdpdGhvdXQgY29vcmRpbmF0aW9uXG4gICAgICAgIHJlbGVhc2VDYXB0dXJlKCk7XG5cbiAgICAgICAgLy8gU2FmYXJpIG9uIGlPUyA5IGhhcyBhIGJyb2tlbiBjb25zdHJ1Y3RvciBmb3IgVG91Y2hFdmVudC5cbiAgICAgICAgLy8gV2UgYXJlIGZpbmUgaW4gdGhpcyBjYXNlIGhvd2V2ZXIsIHNpbmNlIFNhZmFyaSBzZWVtcyB0b1xuICAgICAgICAvLyBoYXZlIHNvbWUgc29ydCBvZiBpbXBsaWNpdCBzZXRDYXB0dXJlIG1hZ2ljIGFueXdheS5cbiAgICAgICAgaWYgKHdpbmRvdy5Ub3VjaEV2ZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbmV3IFRvdWNoRXZlbnQoXCJ0b3VjaHN0YXJ0XCIpO1xuICAgICAgICAgICAgfSBjYXRjaCAoVHlwZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNhcHR1cmVFbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJub1ZOQ19tb3VzZV9jYXB0dXJlX2VsZW1cIik7XG5cbiAgICAgICAgaWYgKGNhcHR1cmVFbGVtID09PSBudWxsKSB7XG4gICAgICAgICAgICBjYXB0dXJlRWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgICAgICBjYXB0dXJlRWxlbS5pZCA9IFwibm9WTkNfbW91c2VfY2FwdHVyZV9lbGVtXCI7XG4gICAgICAgICAgICBjYXB0dXJlRWxlbS5zdHlsZS5wb3NpdGlvbiA9IFwiZml4ZWRcIjtcbiAgICAgICAgICAgIGNhcHR1cmVFbGVtLnN0eWxlLnRvcCA9IFwiMHB4XCI7XG4gICAgICAgICAgICBjYXB0dXJlRWxlbS5zdHlsZS5sZWZ0ID0gXCIwcHhcIjtcbiAgICAgICAgICAgIGNhcHR1cmVFbGVtLnN0eWxlLndpZHRoID0gXCIxMDAlXCI7XG4gICAgICAgICAgICBjYXB0dXJlRWxlbS5zdHlsZS5oZWlnaHQgPSBcIjEwMCVcIjtcbiAgICAgICAgICAgIGNhcHR1cmVFbGVtLnN0eWxlLnpJbmRleCA9IDEwMDAwO1xuICAgICAgICAgICAgY2FwdHVyZUVsZW0uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjYXB0dXJlRWxlbSk7XG5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgdG8gbWFrZSBzdXJlIGNhbGxlcnMgZG9uJ3QgZ2V0IGNvbmZ1c2VkIGJ5IGhhdmluZ1xuICAgICAgICAgICAgLy8gb3VyIGJsb2NraW5nIGVsZW1lbnQgYXMgdGhlIHRhcmdldFxuICAgICAgICAgICAgY2FwdHVyZUVsZW0uYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBfY2FwdHVyZVByb3h5KTtcblxuICAgICAgICAgICAgY2FwdHVyZUVsZW0uYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgX2NhcHR1cmVQcm94eSk7XG4gICAgICAgICAgICBjYXB0dXJlRWxlbS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgX2NhcHR1cmVQcm94eSk7XG5cbiAgICAgICAgICAgIGNhcHR1cmVFbGVtLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIF9jYXB0dXJlUHJveHkpO1xuICAgICAgICAgICAgY2FwdHVyZUVsZW0uYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBfY2FwdHVyZVByb3h5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIF9jYXB0dXJlRWxlbSA9IGVsZW07XG4gICAgICAgIF9jYXB0dXJlSW5kZXgrKztcblxuICAgICAgICAvLyBUcmFjayBjdXJzb3IgYW5kIGdldCBpbml0aWFsIGN1cnNvclxuICAgICAgICBfY2FwdHVyZU9ic2VydmVyLm9ic2VydmUoZWxlbSwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pO1xuICAgICAgICBfY2FwdHVyZUVsZW1DaGFuZ2VkKCk7XG5cbiAgICAgICAgY2FwdHVyZUVsZW0uc3R5bGUuZGlzcGxheSA9IG51bGw7XG5cbiAgICAgICAgLy8gV2UgbGlzdGVuIHRvIGV2ZW50cyBvbiB3aW5kb3cgaW4gb3JkZXIgdG8ga2VlcCB0cmFja2luZyBpZiBpdFxuICAgICAgICAvLyBoYXBwZW5zIHRvIGxlYXZlIHRoZSB2aWV3cG9ydFxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgX2NhcHR1cmVQcm94eSk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgX2NhcHR1cmVQcm94eSk7XG5cbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIF9jYXB0dXJlUHJveHkpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBfY2FwdHVyZVByb3h5KTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiByZWxlYXNlQ2FwdHVyZSgpIHtcbiAgICBpZiAoZG9jdW1lbnQucmVsZWFzZUNhcHR1cmUpIHtcblxuICAgICAgICBkb2N1bWVudC5yZWxlYXNlQ2FwdHVyZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghX2NhcHR1cmVFbGVtKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGVyZSBtaWdodCBiZSBldmVudHMgYWxyZWFkeSBxdWV1ZWQsIHNvIHdlIG5lZWQgdG8gd2FpdCBmb3JcbiAgICAgICAgLy8gdGhlbSB0byBmbHVzaC4gRS5nLiBjb250ZXh0bWVudSBpbiBNaWNyb3NvZnQgRWRnZVxuICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoZXhwZWN0ZWQpIHtcbiAgICAgICAgICAgIC8vIE9ubHkgY2xlYXIgaXQgaWYgaXQncyB0aGUgZXhwZWN0ZWQgZ3JhYiAoaS5lLiBubyBvbmVcbiAgICAgICAgICAgIC8vIGVsc2UgaGFzIGluaXRpYXRlZCBhIG5ldyBncmFiKVxuICAgICAgICAgICAgaWYgKF9jYXB0dXJlSW5kZXggPT09IGV4cGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgX2NhcHR1cmVFbGVtID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMCwgX2NhcHR1cmVJbmRleCk7XG5cbiAgICAgICAgX2NhcHR1cmVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG5cbiAgICAgICAgdmFyIGNhcHR1cmVFbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJub1ZOQ19tb3VzZV9jYXB0dXJlX2VsZW1cIik7XG4gICAgICAgIGNhcHR1cmVFbGVtLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcblxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgX2NhcHR1cmVQcm94eSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgX2NhcHR1cmVQcm94eSk7XG5cbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIF9jYXB0dXJlUHJveHkpO1xuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCBfY2FwdHVyZVByb3h5KTtcbiAgICB9XG59OyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5Mb2NhbGl6ZXIgPSBMb2NhbGl6ZXI7XG4vKlxuICogbm9WTkM6IEhUTUw1IFZOQyBjbGllbnRcbiAqIENvcHlyaWdodCAoQykgMjAxMiBKb2VsIE1hcnRpblxuICogTGljZW5zZWQgdW5kZXIgTVBMIDIuMCAoc2VlIExJQ0VOU0UudHh0KVxuICpcbiAqIFNlZSBSRUFETUUubWQgZm9yIHVzYWdlIGFuZCBpbnRlZ3JhdGlvbiBpbnN0cnVjdGlvbnMuXG4gKi9cblxuLypcbiAqIExvY2FsaXphdGlvbiBVdGlsaXRpZXNcbiAqL1xuXG5mdW5jdGlvbiBMb2NhbGl6ZXIoKSB7XG4gICAgLy8gQ3VycmVudGx5IGNvbmZpZ3VyZWQgbGFuZ3VhZ2VcbiAgICB0aGlzLmxhbmd1YWdlID0gJ2VuJztcblxuICAgIC8vIEN1cnJlbnQgZGljdGlvbmFyeSBvZiB0cmFuc2xhdGlvbnNcbiAgICB0aGlzLmRpY3Rpb25hcnkgPSB1bmRlZmluZWQ7XG59XG5cbkxvY2FsaXplci5wcm90b3R5cGUgPSB7XG4gICAgLy8gQ29uZmlndXJlIHN1aXRhYmxlIGxhbmd1YWdlIGJhc2VkIG9uIHVzZXIgcHJlZmVyZW5jZXNcbiAgICBzZXR1cDogZnVuY3Rpb24gKHN1cHBvcnRlZExhbmd1YWdlcykge1xuICAgICAgICB2YXIgdXNlckxhbmd1YWdlcztcblxuICAgICAgICB0aGlzLmxhbmd1YWdlID0gJ2VuJzsgLy8gRGVmYXVsdDogVVMgRW5nbGlzaFxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIE5hdmlnYXRvci5sYW5ndWFnZXMgb25seSBhdmFpbGFibGUgaW4gQ2hyb21lICgzMispIGFuZCBGaXJlRm94ICgzMispXG4gICAgICAgICAqIEZhbGwgYmFjayB0byBuYXZpZ2F0b3IubGFuZ3VhZ2UgZm9yIG90aGVyIGJyb3dzZXJzXG4gICAgICAgICAqL1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2VzID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB1c2VyTGFuZ3VhZ2VzID0gd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1c2VyTGFuZ3VhZ2VzID0gW25hdmlnYXRvci5sYW5ndWFnZSB8fCBuYXZpZ2F0b3IudXNlckxhbmd1YWdlXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdXNlckxhbmd1YWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHVzZXJMYW5nID0gdXNlckxhbmd1YWdlc1tpXTtcbiAgICAgICAgICAgIHVzZXJMYW5nID0gdXNlckxhbmcudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHVzZXJMYW5nID0gdXNlckxhbmcucmVwbGFjZShcIl9cIiwgXCItXCIpO1xuICAgICAgICAgICAgdXNlckxhbmcgPSB1c2VyTGFuZy5zcGxpdChcIi1cIik7XG5cbiAgICAgICAgICAgIC8vIEJ1aWx0LWluIGRlZmF1bHQ/XG4gICAgICAgICAgICBpZiAodXNlckxhbmdbMF0gPT09ICdlbicgJiYgKHVzZXJMYW5nWzFdID09PSB1bmRlZmluZWQgfHwgdXNlckxhbmdbMV0gPT09ICd1cycpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGaXJzdCBwYXNzOiBwZXJmZWN0IG1hdGNoXG4gICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHN1cHBvcnRlZExhbmd1YWdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciBzdXBMYW5nID0gc3VwcG9ydGVkTGFuZ3VhZ2VzW2pdO1xuICAgICAgICAgICAgICAgIHN1cExhbmcgPSBzdXBMYW5nLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgc3VwTGFuZyA9IHN1cExhbmcucmVwbGFjZShcIl9cIiwgXCItXCIpO1xuICAgICAgICAgICAgICAgIHN1cExhbmcgPSBzdXBMYW5nLnNwbGl0KFwiLVwiKTtcblxuICAgICAgICAgICAgICAgIGlmICh1c2VyTGFuZ1swXSAhPT0gc3VwTGFuZ1swXSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKHVzZXJMYW5nWzFdICE9PSBzdXBMYW5nWzFdKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBzdXBwb3J0ZWRMYW5ndWFnZXNbal07XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTZWNvbmQgcGFzczogZmFsbGJhY2tcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3VwcG9ydGVkTGFuZ3VhZ2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgc3VwTGFuZyA9IHN1cHBvcnRlZExhbmd1YWdlc1tqXTtcbiAgICAgICAgICAgICAgICBzdXBMYW5nID0gc3VwTGFuZy50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHN1cExhbmcgPSBzdXBMYW5nLnJlcGxhY2UoXCJfXCIsIFwiLVwiKTtcbiAgICAgICAgICAgICAgICBzdXBMYW5nID0gc3VwTGFuZy5zcGxpdChcIi1cIik7XG5cbiAgICAgICAgICAgICAgICBpZiAodXNlckxhbmdbMF0gIT09IHN1cExhbmdbMF0pIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChzdXBMYW5nWzFdICE9PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZSA9IHN1cHBvcnRlZExhbmd1YWdlc1tqXTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gUmV0cmlldmUgbG9jYWxpc2VkIHRleHRcbiAgICBnZXQ6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZGljdGlvbmFyeSAhPT0gJ3VuZGVmaW5lZCcgJiYgdGhpcy5kaWN0aW9uYXJ5W2lkXSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGljdGlvbmFyeVtpZF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gVHJhdmVyc2VzIHRoZSBET00gYW5kIHRyYW5zbGF0ZXMgcmVsZXZhbnQgZmllbGRzXG4gICAgLy8gU2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2RvbS5odG1sI2F0dHItdHJhbnNsYXRlXG4gICAgdHJhbnNsYXRlRE9NOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgZnVuY3Rpb24gcHJvY2VzcyhlbGVtLCBlbmFibGVkKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBpc0FueU9mKHNlYXJjaEVsZW1lbnQsIGl0ZW1zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLmluZGV4T2Yoc2VhcmNoRWxlbWVudCkgIT09IC0xO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmdW5jdGlvbiB0cmFuc2xhdGVBdHRyaWJ1dGUoZWxlbSwgYXR0cikge1xuICAgICAgICAgICAgICAgIHZhciBzdHIgPSBlbGVtLmdldEF0dHJpYnV0ZShhdHRyKTtcbiAgICAgICAgICAgICAgICBzdHIgPSBzZWxmLmdldChzdHIpO1xuICAgICAgICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKGF0dHIsIHN0cik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZVRleHROb2RlKG5vZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RyID0gbm9kZS5kYXRhLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBzdHIgPSBzZWxmLmdldChzdHIpO1xuICAgICAgICAgICAgICAgIG5vZGUuZGF0YSA9IHN0cjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidHJhbnNsYXRlXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzQW55T2YoZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0cmFuc2xhdGVcIiksIFtcIlwiLCBcInllc1wiXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0FueU9mKGVsZW0uZ2V0QXR0cmlidXRlKFwidHJhbnNsYXRlXCIpLCBbXCJub1wiXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhYmJyXCIpICYmIGVsZW0udGFnTmFtZSA9PT0gXCJUSFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUF0dHJpYnV0ZShlbGVtLCBcImFiYnJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFsdFwiKSAmJiBpc0FueU9mKGVsZW0udGFnTmFtZSwgW1wiQVJFQVwiLCBcIklNR1wiLCBcIklOUFVUXCJdKSkge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVBdHRyaWJ1dGUoZWxlbSwgXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImRvd25sb2FkXCIpICYmIGlzQW55T2YoZWxlbS50YWdOYW1lLCBbXCJBXCIsIFwiQVJFQVwiXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlQXR0cmlidXRlKGVsZW0sIFwiZG93bmxvYWRcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImxhYmVsXCIpICYmIGlzQW55T2YoZWxlbS50YWdOYW1lLCBbXCJNRU5VSVRFTVwiLCBcIk1FTlVcIiwgXCJPUFRHUk9VUFwiLCBcIk9QVElPTlwiLCBcIlRSQUNLXCJdKSkge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVBdHRyaWJ1dGUoZWxlbSwgXCJsYWJlbFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gRklYTUU6IFNob3VsZCB1cGRhdGUgXCJsYW5nXCJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKSAmJiBpc0FueU9mKGVsZW0udGFnTmFtZSwgW1wiSU5QVVRcIiwgXCJURVhUQVJFQVwiXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlQXR0cmlidXRlKGVsZW0sIFwicGxhY2Vob2xkZXJcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUF0dHJpYnV0ZShlbGVtLCBcInRpdGxlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSAmJiBlbGVtLnRhZ05hbWUgPT09IFwiSU5QVVRcIiAmJiBpc0FueU9mKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSwgW1wicmVzZXRcIiwgXCJidXR0b25cIl0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUF0dHJpYnV0ZShlbGVtLCBcInZhbHVlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IGVsZW0uY2hpbGROb2Rlc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gbm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcyhub2RlLCBlbmFibGVkKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT09IG5vZGUuVEVYVF9OT0RFICYmIGVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlVGV4dE5vZGUobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcHJvY2Vzcyhkb2N1bWVudC5ib2R5LCB0cnVlKTtcbiAgICB9XG59O1xuXG52YXIgbDEwbiA9IGV4cG9ydHMubDEwbiA9IG5ldyBMb2NhbGl6ZXIoKTtcbmV4cG9ydHMuZGVmYXVsdCA9IGwxMG4uZ2V0LmJpbmQobDEwbik7IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmluaXRfbG9nZ2luZyA9IGluaXRfbG9nZ2luZztcbmV4cG9ydHMuZ2V0X2xvZ2dpbmcgPSBnZXRfbG9nZ2luZztcbi8qXG4gKiBub1ZOQzogSFRNTDUgVk5DIGNsaWVudFxuICogQ29weXJpZ2h0IChDKSAyMDEyIEpvZWwgTWFydGluXG4gKiBMaWNlbnNlZCB1bmRlciBNUEwgMi4wIChzZWUgTElDRU5TRS50eHQpXG4gKlxuICogU2VlIFJFQURNRS5tZCBmb3IgdXNhZ2UgYW5kIGludGVncmF0aW9uIGluc3RydWN0aW9ucy5cbiAqL1xuXG4vKlxuICogTG9nZ2luZy9kZWJ1ZyByb3V0aW5lc1xuICovXG5cbnZhciBfbG9nX2xldmVsID0gJ3dhcm4nO1xuXG52YXIgRGVidWcgPSBmdW5jdGlvbiAobXNnKSB7fTtcbnZhciBJbmZvID0gZnVuY3Rpb24gKG1zZykge307XG52YXIgV2FybiA9IGZ1bmN0aW9uIChtc2cpIHt9O1xudmFyIEVycm9yID0gZnVuY3Rpb24gKG1zZykge307XG5cbmZ1bmN0aW9uIGluaXRfbG9nZ2luZyhsZXZlbCkge1xuICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGxldmVsID0gX2xvZ19sZXZlbDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBfbG9nX2xldmVsID0gbGV2ZWw7XG4gICAgfVxuXG4gICAgZXhwb3J0cy5EZWJ1ZyA9IERlYnVnID0gZXhwb3J0cy5JbmZvID0gSW5mbyA9IGV4cG9ydHMuV2FybiA9IFdhcm4gPSBleHBvcnRzLkVycm9yID0gRXJyb3IgPSBmdW5jdGlvbiAobXNnKSB7fTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5jb25zb2xlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIC8qIGpzaGludCAtVzA4NiAqL1xuICAgICAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICAgICAgICBjYXNlICdkZWJ1Zyc6XG4gICAgICAgICAgICAgICAgZXhwb3J0cy5EZWJ1ZyA9IERlYnVnID0gY29uc29sZS5kZWJ1Zy5iaW5kKHdpbmRvdy5jb25zb2xlKTtcbiAgICAgICAgICAgIGNhc2UgJ2luZm8nOlxuICAgICAgICAgICAgICAgIGV4cG9ydHMuSW5mbyA9IEluZm8gPSBjb25zb2xlLmluZm8uYmluZCh3aW5kb3cuY29uc29sZSk7XG4gICAgICAgICAgICBjYXNlICd3YXJuJzpcbiAgICAgICAgICAgICAgICBleHBvcnRzLldhcm4gPSBXYXJuID0gY29uc29sZS53YXJuLmJpbmQod2luZG93LmNvbnNvbGUpO1xuICAgICAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgICAgIGV4cG9ydHMuRXJyb3IgPSBFcnJvciA9IGNvbnNvbGUuZXJyb3IuYmluZCh3aW5kb3cuY29uc29sZSk7XG4gICAgICAgICAgICBjYXNlICdub25lJzpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBsb2dnaW5nIHR5cGUgJ1wiICsgbGV2ZWwgKyBcIidcIik7XG4gICAgICAgIH1cbiAgICAgICAgLyoganNoaW50ICtXMDg2ICovXG4gICAgfVxufTtcbmZ1bmN0aW9uIGdldF9sb2dnaW5nKCkge1xuICAgIHJldHVybiBfbG9nX2xldmVsO1xufTtcbmV4cG9ydHMuRGVidWcgPSBEZWJ1ZztcbmV4cG9ydHMuSW5mbyA9IEluZm87XG5leHBvcnRzLldhcm4gPSBXYXJuO1xuZXhwb3J0cy5FcnJvciA9IEVycm9yO1xuXG4vLyBJbml0aWFsaXplIGxvZ2dpbmcgbGV2ZWxcblxuaW5pdF9sb2dnaW5nKCk7IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLm1ha2VfcHJvcGVydGllcyA9IG1ha2VfcHJvcGVydGllcztcbmV4cG9ydHMuc2V0X2RlZmF1bHRzID0gc2V0X2RlZmF1bHRzO1xuXG52YXIgX2xvZ2dpbmcgPSByZXF1aXJlKCcuL2xvZ2dpbmcuanMnKTtcblxudmFyIExvZyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9sb2dnaW5nKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBlbHNlIHsgdmFyIG5ld09iaiA9IHt9OyBpZiAob2JqICE9IG51bGwpIHsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IG5ld09iai5kZWZhdWx0ID0gb2JqOyByZXR1cm4gbmV3T2JqOyB9IH1cblxuZnVuY3Rpb24gbWFrZV9wcm9wZXJ0eShwcm90bywgbmFtZSwgbW9kZSwgdHlwZSkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgdmFyIGdldHRlcjtcbiAgICBpZiAodHlwZSA9PT0gJ2FycicpIHtcbiAgICAgICAgZ2V0dGVyID0gZnVuY3Rpb24gKGlkeCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbJ18nICsgbmFtZV1baWR4XTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbJ18nICsgbmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZ2V0dGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbJ18nICsgbmFtZV07XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIG1ha2Vfc2V0dGVyID0gZnVuY3Rpb24gKHByb2Nlc3NfdmFsKSB7XG4gICAgICAgIGlmIChwcm9jZXNzX3ZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWwsIGlkeCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaWR4ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzWydfJyArIG5hbWVdW2lkeF0gPSBwcm9jZXNzX3ZhbCh2YWwpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbJ18nICsgbmFtZV0gPSBwcm9jZXNzX3ZhbCh2YWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHZhbCwgaWR4KSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpZHggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbJ18nICsgbmFtZV1baWR4XSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzWydfJyArIG5hbWVdID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIHNldHRlcjtcbiAgICBpZiAodHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHNldHRlciA9IG1ha2Vfc2V0dGVyKGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgIGlmICghdmFsIHx8IHZhbCBpbiB7ICcwJzogMSwgJ25vJzogMSwgJ2ZhbHNlJzogMSB9KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnaW50Jykge1xuICAgICAgICBzZXR0ZXIgPSBtYWtlX3NldHRlcihmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodmFsLCAxMCk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Zsb2F0Jykge1xuICAgICAgICBzZXR0ZXIgPSBtYWtlX3NldHRlcihwYXJzZUZsb2F0KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdHInKSB7XG4gICAgICAgIHNldHRlciA9IG1ha2Vfc2V0dGVyKFN0cmluZyk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnZnVuYycpIHtcbiAgICAgICAgc2V0dGVyID0gbWFrZV9zZXR0ZXIoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgaWYgKCF2YWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge307XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FycicgfHwgdHlwZSA9PT0gJ2RvbScgfHwgdHlwZSA9PSAncmF3Jykge1xuICAgICAgICBzZXR0ZXIgPSBtYWtlX3NldHRlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBwcm9wZXJ0eSB0eXBlICcgKyB0eXBlKTsgLy8gc29tZSBzYW5pdHkgY2hlY2tpbmdcbiAgICB9XG5cbiAgICAvLyBzZXQgdGhlIGdldHRlclxuICAgIGlmICh0eXBlb2YgcHJvdG9bJ2dldF8nICsgbmFtZV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHByb3RvWydnZXRfJyArIG5hbWVdID0gZ2V0dGVyO1xuICAgIH1cblxuICAgIC8vIHNldCB0aGUgc2V0dGVyIGlmIG5lZWRlZFxuICAgIGlmICh0eXBlb2YgcHJvdG9bJ3NldF8nICsgbmFtZV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmIChtb2RlID09PSAncncnKSB7XG4gICAgICAgICAgICBwcm90b1snc2V0XycgKyBuYW1lXSA9IHNldHRlcjtcbiAgICAgICAgfSBlbHNlIGlmIChtb2RlID09PSAnd28nKSB7XG4gICAgICAgICAgICBwcm90b1snc2V0XycgKyBuYW1lXSA9IGZ1bmN0aW9uICh2YWwsIGlkeCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpc1snXycgKyBuYW1lXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG5hbWUgKyBcIiBjYW4gb25seSBiZSBzZXQgb25jZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2V0dGVyLmNhbGwodGhpcywgdmFsLCBpZHgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIG1ha2UgYSBzcGVjaWFsIHNldHRlciB0aGF0IHdlIGNhbiB1c2UgaW4gc2V0IGRlZmF1bHRzXG4gICAgcHJvdG9bJ19yYXdfc2V0XycgKyBuYW1lXSA9IGZ1bmN0aW9uICh2YWwsIGlkeCkge1xuICAgICAgICBzZXR0ZXIuY2FsbCh0aGlzLCB2YWwsIGlkeCk7XG4gICAgICAgIC8vZGVsZXRlIHRoaXNbJ19pbml0X3NldF8nICsgbmFtZV07ICAvLyByZW1vdmUgaXQgYWZ0ZXIgdXNlXG4gICAgfTtcbn0gLypcbiAgICogbm9WTkM6IEhUTUw1IFZOQyBjbGllbnRcbiAgICogQ29weXJpZ2h0IChDKSAyMDEyIEpvZWwgTWFydGluXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1QTCAyLjAgKHNlZSBMSUNFTlNFLnR4dClcbiAgICpcbiAgICogU2VlIFJFQURNRS5tZCBmb3IgdXNhZ2UgYW5kIGludGVncmF0aW9uIGluc3RydWN0aW9ucy5cbiAgICovXG5cbi8qXG4gKiBHZXR0ZXIvU2V0dGVyIENyZWF0aW9uIFV0aWxpdGllc1xuICovXG5cbjtcblxuZnVuY3Rpb24gbWFrZV9wcm9wZXJ0aWVzKGNvbnN0cnVjdG9yLCBhcnIpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1ha2VfcHJvcGVydHkoY29uc3RydWN0b3IucHJvdG90eXBlLCBhcnJbaV1bMF0sIGFycltpXVsxXSwgYXJyW2ldWzJdKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBzZXRfZGVmYXVsdHMob2JqLCBjb25mLCBkZWZhdWx0cykge1xuICAgIHZhciBkZWZhdWx0c19rZXlzID0gT2JqZWN0LmtleXMoZGVmYXVsdHMpO1xuICAgIHZhciBjb25mX2tleXMgPSBPYmplY3Qua2V5cyhjb25mKTtcbiAgICB2YXIga2V5c19vYmogPSB7fTtcbiAgICB2YXIgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZGVmYXVsdHNfa2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBrZXlzX29ialtkZWZhdWx0c19rZXlzW2ldXSA9IDE7XG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCBjb25mX2tleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAga2V5c19vYmpbY29uZl9rZXlzW2ldXSA9IDE7XG4gICAgfVxuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoa2V5c19vYmopO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNldHRlciA9IG9ialsnX3Jhd19zZXRfJyArIGtleXNbaV1dO1xuICAgICAgICBpZiAoIXNldHRlcikge1xuICAgICAgICAgICAgTG9nLldhcm4oJ0ludmFsaWQgcHJvcGVydHkgJyArIGtleXNbaV0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoa2V5c1tpXSBpbiBjb25mKSB7XG4gICAgICAgICAgICBzZXR0ZXIuY2FsbChvYmosIGNvbmZba2V5c1tpXV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0dGVyLmNhbGwob2JqLCBkZWZhdWx0c1trZXlzW2ldXSk7XG4gICAgICAgIH1cbiAgICB9XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWNvZGVVVEY4ID0gZGVjb2RlVVRGODtcbi8qXG4gKiBub1ZOQzogSFRNTDUgVk5DIGNsaWVudFxuICogQ29weXJpZ2h0IChDKSAyMDEyIEpvZWwgTWFydGluXG4gKiBMaWNlbnNlZCB1bmRlciBNUEwgMi4wIChzZWUgTElDRU5TRS50eHQpXG4gKlxuICogU2VlIFJFQURNRS5tZCBmb3IgdXNhZ2UgYW5kIGludGVncmF0aW9uIGluc3RydWN0aW9ucy5cbiAqL1xuXG4vKlxuICogRGVjb2RlIGZyb20gVVRGLThcbiAqL1xuZnVuY3Rpb24gZGVjb2RlVVRGOCh1dGY4c3RyaW5nKSB7XG4gIFwidXNlIHN0cmljdFwiO1xuXG4gIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHV0ZjhzdHJpbmcpKTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBXZWJzb2NrO1xuXG52YXIgX2xvZ2dpbmcgPSByZXF1aXJlKCcuL3V0aWwvbG9nZ2luZy5qcycpO1xuXG52YXIgTG9nID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2xvZ2dpbmcpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGVsc2UgeyB2YXIgbmV3T2JqID0ge307IGlmIChvYmogIT0gbnVsbCkgeyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IHJldHVybiBuZXdPYmo7IH0gfVxuXG4vKmpzbGludCBicm93c2VyOiB0cnVlLCBiaXR3aXNlOiB0cnVlICovXG4vKmdsb2JhbCBVdGlsKi9cblxuZnVuY3Rpb24gV2Vic29jaygpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHRoaXMuX3dlYnNvY2tldCA9IG51bGw7IC8vIFdlYlNvY2tldCBvYmplY3RcblxuICAgIHRoaXMuX3JRaSA9IDA7IC8vIFJlY2VpdmUgcXVldWUgaW5kZXhcbiAgICB0aGlzLl9yUWxlbiA9IDA7IC8vIE5leHQgd3JpdGUgcG9zaXRpb24gaW4gdGhlIHJlY2VpdmUgcXVldWVcbiAgICB0aGlzLl9yUWJ1ZmZlclNpemUgPSAxMDI0ICogMTAyNCAqIDQ7IC8vIFJlY2VpdmUgcXVldWUgYnVmZmVyIHNpemUgKDQgTWlCKVxuICAgIHRoaXMuX3JRbWF4ID0gdGhpcy5fclFidWZmZXJTaXplIC8gODtcbiAgICAvLyBjYWxsZWQgaW4gaW5pdDogdGhpcy5fclEgPSBuZXcgVWludDhBcnJheSh0aGlzLl9yUWJ1ZmZlclNpemUpO1xuICAgIHRoaXMuX3JRID0gbnVsbDsgLy8gUmVjZWl2ZSBxdWV1ZVxuXG4gICAgdGhpcy5fc1FidWZmZXJTaXplID0gMTAyNCAqIDEwOyAvLyAxMCBLaUJcbiAgICAvLyBjYWxsZWQgaW4gaW5pdDogdGhpcy5fc1EgPSBuZXcgVWludDhBcnJheSh0aGlzLl9zUWJ1ZmZlclNpemUpO1xuICAgIHRoaXMuX3NRbGVuID0gMDtcbiAgICB0aGlzLl9zUSA9IG51bGw7IC8vIFNlbmQgcXVldWVcblxuICAgIHRoaXMuX2V2ZW50SGFuZGxlcnMgPSB7XG4gICAgICAgICdtZXNzYWdlJzogZnVuY3Rpb24gKCkge30sXG4gICAgICAgICdvcGVuJzogZnVuY3Rpb24gKCkge30sXG4gICAgICAgICdjbG9zZSc6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICAnZXJyb3InOiBmdW5jdGlvbiAoKSB7fVxuICAgIH07XG59IC8qXG4gICAqIFdlYnNvY2s6IGhpZ2gtcGVyZm9ybWFuY2UgYmluYXJ5IFdlYlNvY2tldHNcbiAgICogQ29weXJpZ2h0IChDKSAyMDEyIEpvZWwgTWFydGluXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1QTCAyLjAgKHNlZSBMSUNFTlNFLnR4dClcbiAgICpcbiAgICogV2Vic29jayBpcyBzaW1pbGFyIHRvIHRoZSBzdGFuZGFyZCBXZWJTb2NrZXQgb2JqZWN0IGJ1dCB3aXRoIGV4dHJhXG4gICAqIGJ1ZmZlciBoYW5kbGluZy5cbiAgICpcbiAgICogV2Vic29jayBoYXMgYnVpbHQtaW4gcmVjZWl2ZSBxdWV1ZSBidWZmZXJpbmc7IHRoZSBtZXNzYWdlIGV2ZW50XG4gICAqIGRvZXMgbm90IGNvbnRhaW4gYWN0dWFsIGRhdGEgYnV0IGlzIHNpbXBseSBhIG5vdGlmaWNhdGlvbiB0aGF0XG4gICAqIHRoZXJlIGlzIG5ldyBkYXRhIGF2YWlsYWJsZS4gU2V2ZXJhbCByUSogbWV0aG9kcyBhcmUgYXZhaWxhYmxlIHRvXG4gICAqIHJlYWQgYmluYXJ5IGRhdGEgb2ZmIG9mIHRoZSByZWNlaXZlIHF1ZXVlLlxuICAgKi9cblxuO1xuXG4vLyB0aGlzIGhhcyBwZXJmb3JtYW5jZSBpc3N1ZXMgaW4gc29tZSB2ZXJzaW9ucyBDaHJvbWl1bSwgYW5kXG4vLyBkb2Vzbid0IGdhaW4gYSB0cmVtZW5kb3VzIGFtb3VudCBvZiBwZXJmb3JtYW5jZSBpbmNyZWFzZSBpbiBGaXJlZm94XG4vLyBhdCB0aGUgbW9tZW50LiAgSXQgbWF5IGJlIHZhbHVhYmxlIHRvIHR1cm4gaXQgb24gaW4gdGhlIGZ1dHVyZS5cbnZhciBFTkFCTEVfQ09QWVdJVEhJTiA9IGZhbHNlO1xuXG52YXIgTUFYX1JRX0dST1dfU0laRSA9IDQwICogMTAyNCAqIDEwMjQ7IC8vIDQwIE1pQlxuXG52YXIgdHlwZWRBcnJheVRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIFRoaXMgaXMgb25seSBmb3IgUGhhbnRvbUpTLCB3aGljaCBkb2Vzbid0IGxpa2UgYXBwbHktaW5nXG4gICAgLy8gd2l0aCBUeXBlZCBBcnJheXNcbiAgICB0cnkge1xuICAgICAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoWzEsIDIsIDNdKTtcbiAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnIpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGEpO1xuICAgICAgICB9O1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSkpO1xuICAgICAgICB9O1xuICAgIH1cbn0oKTtcblxuV2Vic29jay5wcm90b3R5cGUgPSB7XG4gICAgLy8gR2V0dGVycyBhbmQgU2V0dGVyc1xuICAgIGdldF9zUTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc1E7XG4gICAgfSxcblxuICAgIGdldF9yUTogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fclE7XG4gICAgfSxcblxuICAgIGdldF9yUWk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JRaTtcbiAgICB9LFxuXG4gICAgc2V0X3JRaTogZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICB0aGlzLl9yUWkgPSB2YWw7XG4gICAgfSxcblxuICAgIC8vIFJlY2VpdmUgUXVldWVcbiAgICByUWxlbjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fclFsZW4gLSB0aGlzLl9yUWk7XG4gICAgfSxcblxuICAgIHJRcGVlazg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JRW3RoaXMuX3JRaV07XG4gICAgfSxcblxuICAgIHJRc2hpZnQ4OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yUVt0aGlzLl9yUWkrK107XG4gICAgfSxcblxuICAgIHJRc2tpcDg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fclFpKys7XG4gICAgfSxcblxuICAgIHJRc2tpcEJ5dGVzOiBmdW5jdGlvbiAobnVtKSB7XG4gICAgICAgIHRoaXMuX3JRaSArPSBudW07XG4gICAgfSxcblxuICAgIC8vIFRPRE8oZGlyZWN0eG1hbjEyKTogdGVzdCBwZXJmb3JtYW5jZSB3aXRoIHRoZXNlIHZzIGEgRGF0YVZpZXdcbiAgICByUXNoaWZ0MTY6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9yUVt0aGlzLl9yUWkrK10gPDwgOCkgKyB0aGlzLl9yUVt0aGlzLl9yUWkrK107XG4gICAgfSxcblxuICAgIHJRc2hpZnQzMjogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuX3JRW3RoaXMuX3JRaSsrXSA8PCAyNCkgKyAodGhpcy5fclFbdGhpcy5fclFpKytdIDw8IDE2KSArICh0aGlzLl9yUVt0aGlzLl9yUWkrK10gPDwgOCkgKyB0aGlzLl9yUVt0aGlzLl9yUWkrK107XG4gICAgfSxcblxuICAgIHJRc2hpZnRTdHI6IGZ1bmN0aW9uIChsZW4pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBsZW4gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBsZW4gPSB0aGlzLnJRbGVuKCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KHRoaXMuX3JRLmJ1ZmZlciwgdGhpcy5fclFpLCBsZW4pO1xuICAgICAgICB0aGlzLl9yUWkgKz0gbGVuO1xuICAgICAgICByZXR1cm4gdHlwZWRBcnJheVRvU3RyaW5nKGFycik7XG4gICAgfSxcblxuICAgIHJRc2hpZnRCeXRlczogZnVuY3Rpb24gKGxlbikge1xuICAgICAgICBpZiAodHlwZW9mIGxlbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGxlbiA9IHRoaXMuclFsZW4oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yUWkgKz0gbGVuO1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodGhpcy5fclEuYnVmZmVyLCB0aGlzLl9yUWkgLSBsZW4sIGxlbik7XG4gICAgfSxcblxuICAgIHJRc2hpZnRUbzogZnVuY3Rpb24gKHRhcmdldCwgbGVuKSB7XG4gICAgICAgIGlmIChsZW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGVuID0gdGhpcy5yUWxlbigpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IG1ha2UgdGhpcyBqdXN0IHVzZSBzZXQgd2l0aCB2aWV3cyB3aGVuIHVzaW5nIGEgQXJyYXlCdWZmZXIgdG8gc3RvcmUgdGhlIHJRXG4gICAgICAgIHRhcmdldC5zZXQobmV3IFVpbnQ4QXJyYXkodGhpcy5fclEuYnVmZmVyLCB0aGlzLl9yUWksIGxlbikpO1xuICAgICAgICB0aGlzLl9yUWkgKz0gbGVuO1xuICAgIH0sXG5cbiAgICByUXdob2xlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0aGlzLl9yUS5idWZmZXIsIDAsIHRoaXMuX3JRbGVuKTtcbiAgICB9LFxuXG4gICAgclFzbGljZTogZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgaWYgKGVuZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHRoaXMuX3JRLmJ1ZmZlciwgdGhpcy5fclFpICsgc3RhcnQsIGVuZCAtIHN0YXJ0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0aGlzLl9yUS5idWZmZXIsIHRoaXMuX3JRaSArIHN0YXJ0LCB0aGlzLl9yUWxlbiAtIHRoaXMuX3JRaSAtIHN0YXJ0KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgbXVzdCB3YWl0IGZvciAnbnVtJyBieXRlcyAoZGVmYXVsdCB0byBGQlUuYnl0ZXMpXG4gICAgLy8gdG8gYmUgYXZhaWxhYmxlIGluIHRoZSByZWNlaXZlIHF1ZXVlLiBSZXR1cm4gdHJ1ZSBpZiB3ZSBuZWVkIHRvXG4gICAgLy8gd2FpdCAoYW5kIHBvc3NpYmx5IHByaW50IGEgZGVidWcgbWVzc2FnZSksIG90aGVyd2lzZSBmYWxzZS5cbiAgICByUXdhaXQ6IGZ1bmN0aW9uIChtc2csIG51bSwgZ29iYWNrKSB7XG4gICAgICAgIHZhciByUWxlbiA9IHRoaXMuX3JRbGVuIC0gdGhpcy5fclFpOyAvLyBTa2lwIHJRbGVuKCkgZnVuY3Rpb24gY2FsbFxuICAgICAgICBpZiAoclFsZW4gPCBudW0pIHtcbiAgICAgICAgICAgIGlmIChnb2JhY2spIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fclFpIDwgZ29iYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJRd2FpdCBjYW5ub3QgYmFja3VwIFwiICsgZ29iYWNrICsgXCIgYnl0ZXNcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3JRaSAtPSBnb2JhY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gdHJ1ZSBtZWFucyBuZWVkIG1vcmUgZGF0YVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuXG4gICAgLy8gU2VuZCBRdWV1ZVxuXG4gICAgZmx1c2g6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlYnNvY2tldC5idWZmZXJlZEFtb3VudCAhPT0gMCkge1xuICAgICAgICAgICAgTG9nLkRlYnVnKFwiYnVmZmVyZWRBbW91bnQ6IFwiICsgdGhpcy5fd2Vic29ja2V0LmJ1ZmZlcmVkQW1vdW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9zUWxlbiA+IDAgJiYgdGhpcy5fd2Vic29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICAgICAgICB0aGlzLl93ZWJzb2NrZXQuc2VuZCh0aGlzLl9lbmNvZGVfbWVzc2FnZSgpKTtcbiAgICAgICAgICAgIHRoaXMuX3NRbGVuID0gMDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBzZW5kOiBmdW5jdGlvbiAoYXJyKSB7XG4gICAgICAgIHRoaXMuX3NRLnNldChhcnIsIHRoaXMuX3NRbGVuKTtcbiAgICAgICAgdGhpcy5fc1FsZW4gKz0gYXJyLmxlbmd0aDtcbiAgICAgICAgdGhpcy5mbHVzaCgpO1xuICAgIH0sXG5cbiAgICBzZW5kX3N0cmluZzogZnVuY3Rpb24gKHN0cikge1xuICAgICAgICB0aGlzLnNlbmQoc3RyLnNwbGl0KCcnKS5tYXAoZnVuY3Rpb24gKGNocikge1xuICAgICAgICAgICAgcmV0dXJuIGNoci5jaGFyQ29kZUF0KDApO1xuICAgICAgICB9KSk7XG4gICAgfSxcblxuICAgIC8vIEV2ZW50IEhhbmRsZXJzXG4gICAgb2ZmOiBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcnNbZXZ0XSA9IGZ1bmN0aW9uICgpIHt9O1xuICAgIH0sXG5cbiAgICBvbjogZnVuY3Rpb24gKGV2dCwgaGFuZGxlcikge1xuICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXJzW2V2dF0gPSBoYW5kbGVyO1xuICAgIH0sXG5cbiAgICBfYWxsb2NhdGVfYnVmZmVyczogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9yUSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX3JRYnVmZmVyU2l6ZSk7XG4gICAgICAgIHRoaXMuX3NRID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fc1FidWZmZXJTaXplKTtcbiAgICB9LFxuXG4gICAgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl9hbGxvY2F0ZV9idWZmZXJzKCk7XG4gICAgICAgIHRoaXMuX3JRaSA9IDA7XG4gICAgICAgIHRoaXMuX3dlYnNvY2tldCA9IG51bGw7XG4gICAgfSxcblxuICAgIG9wZW46IGZ1bmN0aW9uICh1cmksIHByb3RvY29scykge1xuICAgICAgICB2YXIgd3Nfc2NoZW1hID0gdXJpLm1hdGNoKC9eKFthLXpdKyk6XFwvXFwvLylbMV07XG4gICAgICAgIHRoaXMuaW5pdCgpO1xuXG4gICAgICAgIHRoaXMuX3dlYnNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJpLCBwcm90b2NvbHMpO1xuICAgICAgICB0aGlzLl93ZWJzb2NrZXQuYmluYXJ5VHlwZSA9ICdhcnJheWJ1ZmZlcic7XG5cbiAgICAgICAgdGhpcy5fd2Vic29ja2V0Lm9ubWVzc2FnZSA9IHRoaXMuX3JlY3ZfbWVzc2FnZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl93ZWJzb2NrZXQub25vcGVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgTG9nLkRlYnVnKCc+PiBXZWJTb2NrLm9ub3BlbicpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3dlYnNvY2tldC5wcm90b2NvbCkge1xuICAgICAgICAgICAgICAgIExvZy5JbmZvKFwiU2VydmVyIGNob29zZSBzdWItcHJvdG9jb2w6IFwiICsgdGhpcy5fd2Vic29ja2V0LnByb3RvY29sKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVycy5vcGVuKCk7XG4gICAgICAgICAgICBMb2cuRGVidWcoXCI8PCBXZWJTb2NrLm9ub3BlblwiKTtcbiAgICAgICAgfS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLl93ZWJzb2NrZXQub25jbG9zZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBMb2cuRGVidWcoXCI+PiBXZWJTb2NrLm9uY2xvc2VcIik7XG4gICAgICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXJzLmNsb3NlKGUpO1xuICAgICAgICAgICAgTG9nLkRlYnVnKFwiPDwgV2ViU29jay5vbmNsb3NlXCIpO1xuICAgICAgICB9LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuX3dlYnNvY2tldC5vbmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIExvZy5EZWJ1ZyhcIj4+IFdlYlNvY2sub25lcnJvcjogXCIgKyBlKTtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcnMuZXJyb3IoZSk7XG4gICAgICAgICAgICBMb2cuRGVidWcoXCI8PCBXZWJTb2NrLm9uZXJyb3I6IFwiICsgZSk7XG4gICAgICAgIH0uYmluZCh0aGlzKTtcbiAgICB9LFxuXG4gICAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dlYnNvY2tldCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3dlYnNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTiB8fCB0aGlzLl93ZWJzb2NrZXQucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0LkNPTk5FQ1RJTkcpIHtcbiAgICAgICAgICAgICAgICBMb2cuSW5mbyhcIkNsb3NpbmcgV2ViU29ja2V0IGNvbm5lY3Rpb25cIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vic29ja2V0LmNsb3NlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3dlYnNvY2tldC5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gcHJpdmF0ZSBtZXRob2RzXG4gICAgX2VuY29kZV9tZXNzYWdlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFB1dCBpbiBhIGJpbmFyeSBhcnJheWJ1ZmZlclxuICAgICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHlvdSBjYW4gc2VuZCBBcnJheUJ1ZmZlclZpZXdzIHdpdGggdGhlIHNlbmQgbWV0aG9kXG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0aGlzLl9zUS5idWZmZXIsIDAsIHRoaXMuX3NRbGVuKTtcbiAgICB9LFxuXG4gICAgX2V4cGFuZF9jb21wYWN0X3JROiBmdW5jdGlvbiAobWluX2ZpdCkge1xuICAgICAgICB2YXIgcmVzaXplTmVlZGVkID0gbWluX2ZpdCB8fCB0aGlzLl9yUWxlbiAtIHRoaXMuX3JRaSA+IHRoaXMuX3JRYnVmZmVyU2l6ZSAvIDI7XG4gICAgICAgIGlmIChyZXNpemVOZWVkZWQpIHtcbiAgICAgICAgICAgIGlmICghbWluX2ZpdCkge1xuICAgICAgICAgICAgICAgIC8vIGp1c3QgZG91YmxlIHRoZSBzaXplIGlmIHdlIG5lZWQgdG8gZG8gY29tcGFjdGlvblxuICAgICAgICAgICAgICAgIHRoaXMuX3JRYnVmZmVyU2l6ZSAqPSAyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIG1ha2Ugc3VyZSB3ZSBzYXRpc3kgclFsZW4gLSByUWkgKyBtaW5fZml0IDwgclFidWZmZXJTaXplIC8gOFxuICAgICAgICAgICAgICAgIHRoaXMuX3JRYnVmZmVyU2l6ZSA9ICh0aGlzLl9yUWxlbiAtIHRoaXMuX3JRaSArIG1pbl9maXQpICogODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gZ3JvdyB1bmJvdW5kZWRseVxuICAgICAgICBpZiAodGhpcy5fclFidWZmZXJTaXplID4gTUFYX1JRX0dST1dfU0laRSkge1xuICAgICAgICAgICAgdGhpcy5fclFidWZmZXJTaXplID0gTUFYX1JRX0dST1dfU0laRTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yUWJ1ZmZlclNpemUgLSB0aGlzLl9yUWxlbiAtIHRoaXMuX3JRaSA8IG1pbl9maXQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKFwiUmVjZWl2ZSBRdWV1ZSBidWZmZXIgZXhjZWVkZWQgXCIgKyBNQVhfUlFfR1JPV19TSVpFICsgXCIgYnl0ZXMsIGFuZCB0aGUgbmV3IG1lc3NhZ2UgY291bGQgbm90IGZpdFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXNpemVOZWVkZWQpIHtcbiAgICAgICAgICAgIHZhciBvbGRfclFidWZmZXIgPSB0aGlzLl9yUS5idWZmZXI7XG4gICAgICAgICAgICB0aGlzLl9yUW1heCA9IHRoaXMuX3JRYnVmZmVyU2l6ZSAvIDg7XG4gICAgICAgICAgICB0aGlzLl9yUSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX3JRYnVmZmVyU2l6ZSk7XG4gICAgICAgICAgICB0aGlzLl9yUS5zZXQobmV3IFVpbnQ4QXJyYXkob2xkX3JRYnVmZmVyLCB0aGlzLl9yUWkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChFTkFCTEVfQ09QWVdJVEhJTikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JRLmNvcHlXaXRoaW4oMCwgdGhpcy5fclFpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fclEuc2V0KG5ldyBVaW50OEFycmF5KHRoaXMuX3JRLmJ1ZmZlciwgdGhpcy5fclFpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yUWxlbiA9IHRoaXMuX3JRbGVuIC0gdGhpcy5fclFpO1xuICAgICAgICB0aGlzLl9yUWkgPSAwO1xuICAgIH0sXG5cbiAgICBfZGVjb2RlX21lc3NhZ2U6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIC8vIHB1c2ggYXJyYXlidWZmZXIgdmFsdWVzIG9udG8gdGhlIGVuZFxuICAgICAgICB2YXIgdTggPSBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgICAgICAgaWYgKHU4Lmxlbmd0aCA+IHRoaXMuX3JRYnVmZmVyU2l6ZSAtIHRoaXMuX3JRbGVuKSB7XG4gICAgICAgICAgICB0aGlzLl9leHBhbmRfY29tcGFjdF9yUSh1OC5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JRLnNldCh1OCwgdGhpcy5fclFsZW4pO1xuICAgICAgICB0aGlzLl9yUWxlbiArPSB1OC5sZW5ndGg7XG4gICAgfSxcblxuICAgIF9yZWN2X21lc3NhZ2U6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLl9kZWNvZGVfbWVzc2FnZShlLmRhdGEpO1xuICAgICAgICAgICAgaWYgKHRoaXMuclFsZW4oKSA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXJzLm1lc3NhZ2UoKTtcbiAgICAgICAgICAgICAgICAvLyBDb21wYWN0IHRoZSByZWNlaXZlIHF1ZXVlXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3JRbGVuID09IHRoaXMuX3JRaSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yUWxlbiA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JRaSA9IDA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9yUWxlbiA+IHRoaXMuX3JRbWF4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V4cGFuZF9jb21wYWN0X3JRKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBMb2cuRGVidWcoXCJJZ25vcmluZyBlbXB0eSBtZXNzYWdlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChleGMpIHtcbiAgICAgICAgICAgIHZhciBleGNlcHRpb25fc3RyID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChleGMubmFtZSkge1xuICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl9zdHIgKz0gXCJcXG4gICAgbmFtZTogXCIgKyBleGMubmFtZSArIFwiXFxuXCI7XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uX3N0ciArPSBcIiAgICBtZXNzYWdlOiBcIiArIGV4Yy5tZXNzYWdlICsgXCJcXG5cIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBleGMuZGVzY3JpcHRpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZXhjZXB0aW9uX3N0ciArPSBcIiAgICBkZXNjcmlwdGlvbjogXCIgKyBleGMuZGVzY3JpcHRpb24gKyBcIlxcblwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGV4Yy5zdGFjayAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBleGNlcHRpb25fc3RyICs9IGV4Yy5zdGFjaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbl9zdHIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIExvZy5FcnJvcihcInJlY3ZfbWVzc2FnZSwgY2F1Z2h0IGV4Y2VwdGlvbjogXCIgKyBleGNlcHRpb25fc3RyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgTG9nLkVycm9yKFwicmVjdl9tZXNzYWdlLCBjYXVnaHQgZXhjZXB0aW9uOiBcIiArIGV4Yyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZXhjLm5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVycy5lcnJvcihleGMubmFtZSArIFwiOiBcIiArIGV4Yy5tZXNzYWdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVycy5lcnJvcihleGMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKCkge307XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL2FycmF5L2Zyb21cIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2Fzc2lnblwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvY3JlYXRlXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9lbnRyaWVzXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9zZXQtcHJvdG90eXBlLW9mXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC92YWx1ZXNcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbC9pdGVyYXRvclwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3QvYXNzaWduXCIpO1xuXG52YXIgX2Fzc2lnbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hc3NpZ24pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBfYXNzaWduMi5kZWZhdWx0IHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgZm9yICh2YXIga2V5IGluIHNvdXJjZSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9zZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9zZXQtcHJvdG90eXBlLW9mXCIpO1xuXG52YXIgX3NldFByb3RvdHlwZU9mMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NldFByb3RvdHlwZU9mKTtcblxudmFyIF9jcmVhdGUgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9vYmplY3QvY3JlYXRlXCIpO1xuXG52YXIgX2NyZWF0ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGUpO1xuXG52YXIgX3R5cGVvZjIgPSByZXF1aXJlKFwiLi4vaGVscGVycy90eXBlb2ZcIik7XG5cbnZhciBfdHlwZW9mMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3R5cGVvZjIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgKHR5cGVvZiBzdXBlckNsYXNzID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6ICgwLCBfdHlwZW9mMy5kZWZhdWx0KShzdXBlckNsYXNzKSkpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gKDAsIF9jcmVhdGUyLmRlZmF1bHQpKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIGlmIChzdXBlckNsYXNzKSBfc2V0UHJvdG90eXBlT2YyLmRlZmF1bHQgPyAoMCwgX3NldFByb3RvdHlwZU9mMi5kZWZhdWx0KShzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKG9iaiwga2V5cykge1xuICB2YXIgdGFyZ2V0ID0ge307XG5cbiAgZm9yICh2YXIgaSBpbiBvYmopIHtcbiAgICBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlO1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlO1xuICAgIHRhcmdldFtpXSA9IG9ialtpXTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3R5cGVvZjIgPSByZXF1aXJlKFwiLi4vaGVscGVycy90eXBlb2ZcIik7XG5cbnZhciBfdHlwZW9mMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3R5cGVvZjIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoc2VsZiwgY2FsbCkge1xuICBpZiAoIXNlbGYpIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gY2FsbCAmJiAoKHR5cGVvZiBjYWxsID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6ICgwLCBfdHlwZW9mMy5kZWZhdWx0KShjYWxsKSkgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfaXRlcmF0b3IgPSByZXF1aXJlKFwiLi4vY29yZS1qcy9zeW1ib2wvaXRlcmF0b3JcIik7XG5cbnZhciBfaXRlcmF0b3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXRlcmF0b3IpO1xuXG52YXIgX3N5bWJvbCA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL3N5bWJvbFwiKTtcblxudmFyIF9zeW1ib2wyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3ltYm9sKTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBfaXRlcmF0b3IyLmRlZmF1bHQgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBfc3ltYm9sMi5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBfc3ltYm9sMi5kZWZhdWx0ICYmIG9iaiAhPT0gX3N5bWJvbDIuZGVmYXVsdC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBfdHlwZW9mKF9pdGVyYXRvcjIuZGVmYXVsdCkgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2Yob2JqKTtcbn0gOiBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogJiYgdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IF9zeW1ib2wyLmRlZmF1bHQgJiYgb2JqICE9PSBfc3ltYm9sMi5kZWZhdWx0LnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiID8gXCJ1bmRlZmluZWRcIiA6IF90eXBlb2Yob2JqKTtcbn07IiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5hcnJheS5mcm9tJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5BcnJheS5mcm9tOyIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24nKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC5hc3NpZ247IiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmNyZWF0ZScpO1xudmFyICRPYmplY3QgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjcmVhdGUoUCwgRCl7XG4gIHJldHVybiAkT2JqZWN0LmNyZWF0ZShQLCBEKTtcbn07IiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczcub2JqZWN0LmVudHJpZXMnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC5lbnRyaWVzOyIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC5zZXQtcHJvdG90eXBlLW9mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Quc2V0UHJvdG90eXBlT2Y7IiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczcub2JqZWN0LnZhbHVlcycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LnZhbHVlczsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zeW1ib2wnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM3LnN5bWJvbC5hc3luYy1pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczcuc3ltYm9sLm9ic2VydmFibGUnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLlN5bWJvbDsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL193a3MtZXh0JykuZignaXRlcmF0b3InKTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcbiAgcmV0dXJuIGl0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH07IiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoIWlzT2JqZWN0KGl0KSl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07IiwiLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCB0b0xlbmd0aCAgPSByZXF1aXJlKCcuL190by1sZW5ndGgnKVxuICAsIHRvSW5kZXggICA9IHJlcXVpcmUoJy4vX3RvLWluZGV4Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKElTX0lOQ0xVREVTKXtcbiAgcmV0dXJuIGZ1bmN0aW9uKCR0aGlzLCBlbCwgZnJvbUluZGV4KXtcbiAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KCR0aGlzKVxuICAgICAgLCBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aClcbiAgICAgICwgaW5kZXggID0gdG9JbmRleChmcm9tSW5kZXgsIGxlbmd0aClcbiAgICAgICwgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIGlmKElTX0lOQ0xVREVTICYmIGVsICE9IGVsKXdoaWxlKGxlbmd0aCA+IGluZGV4KXtcbiAgICAgIHZhbHVlID0gT1tpbmRleCsrXTtcbiAgICAgIGlmKHZhbHVlICE9IHZhbHVlKXJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I3RvSW5kZXggaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKylpZihJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKXtcbiAgICAgIGlmKE9baW5kZXhdID09PSBlbClyZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59OyIsIi8vIGdldHRpbmcgdGFnIGZyb20gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJylcbiAgLCBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKVxuICAvLyBFUzMgd3JvbmcgaGVyZVxuICAsIEFSRyA9IGNvZihmdW5jdGlvbigpeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID09ICdBcmd1bWVudHMnO1xuXG4vLyBmYWxsYmFjayBmb3IgSUUxMSBTY3JpcHQgQWNjZXNzIERlbmllZCBlcnJvclxudmFyIHRyeUdldCA9IGZ1bmN0aW9uKGl0LCBrZXkpe1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUcpKSA9PSAnc3RyaW5nJyA/IFRcbiAgICAvLyBidWlsdGluVGFnIGNhc2VcbiAgICA6IEFSRyA/IGNvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gY29mKE8pKSA9PSAnT2JqZWN0JyAmJiB0eXBlb2YgTy5jYWxsZWUgPT0gJ2Z1bmN0aW9uJyA/ICdBcmd1bWVudHMnIDogQjtcbn07IiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChpdCkuc2xpY2UoOCwgLTEpO1xufTsiLCJ2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0ge3ZlcnNpb246ICcyLjQuMCd9O1xuaWYodHlwZW9mIF9fZSA9PSAnbnVtYmVyJylfX2UgPSBjb3JlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgY3JlYXRlRGVzYyAgICAgID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgaW5kZXgsIHZhbHVlKXtcbiAgaWYoaW5kZXggaW4gb2JqZWN0KSRkZWZpbmVQcm9wZXJ0eS5mKG9iamVjdCwgaW5kZXgsIGNyZWF0ZURlc2MoMCwgdmFsdWUpKTtcbiAgZWxzZSBvYmplY3RbaW5kZXhdID0gdmFsdWU7XG59OyIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIHRoYXQsIGxlbmd0aCl7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmKHRoYXQgPT09IHVuZGVmaW5lZClyZXR1cm4gZm47XG4gIHN3aXRjaChsZW5ndGgpe1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uKGEpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbihhLCBiKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24oYSwgYiwgYyl7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbigvKiAuLi5hcmdzICovKXtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07IiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZihpdCA9PSB1bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59OyIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcbn0pOyIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudFxuICAvLyBpbiBvbGQgSUUgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCdcbiAgLCBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTsiLCIvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTsiLCIvLyBhbGwgZW51bWVyYWJsZSBvYmplY3Qga2V5cywgaW5jbHVkZXMgc3ltYm9sc1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpXG4gICwgZ09QUyAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJylcbiAgLCBwSUUgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHZhciByZXN1bHQgICAgID0gZ2V0S2V5cyhpdClcbiAgICAsIGdldFN5bWJvbHMgPSBnT1BTLmY7XG4gIGlmKGdldFN5bWJvbHMpe1xuICAgIHZhciBzeW1ib2xzID0gZ2V0U3ltYm9scyhpdClcbiAgICAgICwgaXNFbnVtICA9IHBJRS5mXG4gICAgICAsIGkgICAgICAgPSAwXG4gICAgICAsIGtleTtcbiAgICB3aGlsZShzeW1ib2xzLmxlbmd0aCA+IGkpaWYoaXNFbnVtLmNhbGwoaXQsIGtleSA9IHN5bWJvbHNbaSsrXSkpcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTsiLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjb3JlICAgICAgPSByZXF1aXJlKCcuL19jb3JlJylcbiAgLCBjdHggICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGhpZGUgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uKHR5cGUsIG5hbWUsIHNvdXJjZSl7XG4gIHZhciBJU19GT1JDRUQgPSB0eXBlICYgJGV4cG9ydC5GXG4gICAgLCBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HXG4gICAgLCBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TXG4gICAgLCBJU19QUk9UTyAgPSB0eXBlICYgJGV4cG9ydC5QXG4gICAgLCBJU19CSU5EICAgPSB0eXBlICYgJGV4cG9ydC5CXG4gICAgLCBJU19XUkFQICAgPSB0eXBlICYgJGV4cG9ydC5XXG4gICAgLCBleHBvcnRzICAgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KVxuICAgICwgZXhwUHJvdG8gID0gZXhwb3J0c1tQUk9UT1RZUEVdXG4gICAgLCB0YXJnZXQgICAgPSBJU19HTE9CQUwgPyBnbG9iYWwgOiBJU19TVEFUSUMgPyBnbG9iYWxbbmFtZV0gOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdXG4gICAgLCBrZXksIG93biwgb3V0O1xuICBpZihJU19HTE9CQUwpc291cmNlID0gbmFtZTtcbiAgZm9yKGtleSBpbiBzb3VyY2Upe1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgaWYob3duICYmIGtleSBpbiBleHBvcnRzKWNvbnRpbnVlO1xuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgcGFzc2VkXG4gICAgb3V0ID0gb3duID8gdGFyZ2V0W2tleV0gOiBzb3VyY2Vba2V5XTtcbiAgICAvLyBwcmV2ZW50IGdsb2JhbCBwb2xsdXRpb24gZm9yIG5hbWVzcGFjZXNcbiAgICBleHBvcnRzW2tleV0gPSBJU19HTE9CQUwgJiYgdHlwZW9mIHRhcmdldFtrZXldICE9ICdmdW5jdGlvbicgPyBzb3VyY2Vba2V5XVxuICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG4gICAgOiBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbClcbiAgICAvLyB3cmFwIGdsb2JhbCBjb25zdHJ1Y3RvcnMgZm9yIHByZXZlbnQgY2hhbmdlIHRoZW0gaW4gbGlicmFyeVxuICAgIDogSVNfV1JBUCAmJiB0YXJnZXRba2V5XSA9PSBvdXQgPyAoZnVuY3Rpb24oQyl7XG4gICAgICB2YXIgRiA9IGZ1bmN0aW9uKGEsIGIsIGMpe1xuICAgICAgICBpZih0aGlzIGluc3RhbmNlb2YgQyl7XG4gICAgICAgICAgc3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IEM7XG4gICAgICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgQyhhKTtcbiAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBDKGEsIGIpO1xuICAgICAgICAgIH0gcmV0dXJuIG5ldyBDKGEsIGIsIGMpO1xuICAgICAgICB9IHJldHVybiBDLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgICAgRltQUk9UT1RZUEVdID0gQ1tQUk9UT1RZUEVdO1xuICAgICAgcmV0dXJuIEY7XG4gICAgLy8gbWFrZSBzdGF0aWMgdmVyc2lvbnMgZm9yIHByb3RvdHlwZSBtZXRob2RzXG4gICAgfSkob3V0KSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4cG9ydCBwcm90byBtZXRob2RzIHRvIGNvcmUuJUNPTlNUUlVDVE9SJS5tZXRob2RzLiVOQU1FJVxuICAgIGlmKElTX1BST1RPKXtcbiAgICAgIChleHBvcnRzLnZpcnR1YWwgfHwgKGV4cG9ydHMudmlydHVhbCA9IHt9KSlba2V5XSA9IG91dDtcbiAgICAgIC8vIGV4cG9ydCBwcm90byBtZXRob2RzIHRvIGNvcmUuJUNPTlNUUlVDVE9SJS5wcm90b3R5cGUuJU5BTUUlXG4gICAgICBpZih0eXBlICYgJGV4cG9ydC5SICYmIGV4cFByb3RvICYmICFleHBQcm90b1trZXldKWhpZGUoZXhwUHJvdG8sIGtleSwgb3V0KTtcbiAgICB9XG4gIH1cbn07XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgICAvLyBmb3JjZWRcbiRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgICAvLyBwcm90b1xuJGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcbiRleHBvcnQuVSA9IDY0OyAgLy8gc2FmZVxuJGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgIFxubW9kdWxlLmV4cG9ydHMgPSAkZXhwb3J0OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZXhlYyl7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoKGUpe1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59OyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG52YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGYgOiBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuaWYodHlwZW9mIF9fZyA9PSAnbnVtYmVyJylfX2cgPSBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWYiLCJ2YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIGtleSl7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTsiLCJ2YXIgZFAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGZ1bmN0aW9uKG9iamVjdCwga2V5LCB2YWx1ZSl7XG4gIHJldHVybiBkUC5mKG9iamVjdCwga2V5LCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG59IDogZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7IiwibW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnZGl2JyksICdhJywge2dldDogZnVuY3Rpb24oKXsgcmV0dXJuIDc7IH19KS5hICE9IDc7XG59KTsiLCIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGNvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTsiLCIvLyBjaGVjayBvbiBkZWZhdWx0IEFycmF5IGl0ZXJhdG9yXG52YXIgSXRlcmF0b3JzICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgSVRFUkFUT1IgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpdCAhPT0gdW5kZWZpbmVkICYmIChJdGVyYXRvcnMuQXJyYXkgPT09IGl0IHx8IEFycmF5UHJvdG9bSVRFUkFUT1JdID09PSBpdCk7XG59OyIsIi8vIDcuMi4yIElzQXJyYXkoYXJndW1lbnQpXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gaXNBcnJheShhcmcpe1xuICByZXR1cm4gY29mKGFyZykgPT0gJ0FycmF5Jztcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59OyIsIi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3JcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZW50cmllcyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICAvLyA3LjQuNiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCBjb21wbGV0aW9uKVxuICB9IGNhdGNoKGUpe1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYocmV0ICE9PSB1bmRlZmluZWQpYW5PYmplY3QocmV0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlO1xuICB9XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBjcmVhdGUgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKVxuICAsIGRlc2NyaXB0b3IgICAgID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2hpZGUnKShJdGVyYXRvclByb3RvdHlwZSwgcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyksIGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCl7XG4gIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwge25leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCl9KTtcbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZICAgICAgICA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCByZWRlZmluZSAgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBoaWRlICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIGhhcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBJdGVyYXRvcnMgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgJGl0ZXJDcmVhdGUgICAgPSByZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcbiAgLCBJVEVSQVRPUiAgICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgQlVHR1kgICAgICAgICAgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSkgLy8gU2FmYXJpIGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuICAsIEZGX0lURVJBVE9SICAgID0gJ0BAaXRlcmF0b3InXG4gICwgS0VZUyAgICAgICAgICAgPSAna2V5cydcbiAgLCBWQUxVRVMgICAgICAgICA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCl7XG4gICRpdGVyQ3JlYXRlKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcbiAgdmFyIGdldE1ldGhvZCA9IGZ1bmN0aW9uKGtpbmQpe1xuICAgIGlmKCFCVUdHWSAmJiBraW5kIGluIHByb3RvKXJldHVybiBwcm90b1traW5kXTtcbiAgICBzd2l0Y2goa2luZCl7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgfTtcbiAgdmFyIFRBRyAgICAgICAgPSBOQU1FICsgJyBJdGVyYXRvcidcbiAgICAsIERFRl9WQUxVRVMgPSBERUZBVUxUID09IFZBTFVFU1xuICAgICwgVkFMVUVTX0JVRyA9IGZhbHNlXG4gICAgLCBwcm90byAgICAgID0gQmFzZS5wcm90b3R5cGVcbiAgICAsICRuYXRpdmUgICAgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF1cbiAgICAsICRkZWZhdWx0ICAgPSAkbmF0aXZlIHx8IGdldE1ldGhvZChERUZBVUxUKVxuICAgICwgJGVudHJpZXMgICA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWRcbiAgICAsICRhbnlOYXRpdmUgPSBOQU1FID09ICdBcnJheScgPyBwcm90by5lbnRyaWVzIHx8ICRuYXRpdmUgOiAkbmF0aXZlXG4gICAgLCBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuICAvLyBGaXggbmF0aXZlXG4gIGlmKCRhbnlOYXRpdmUpe1xuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoJGFueU5hdGl2ZS5jYWxsKG5ldyBCYXNlKSk7XG4gICAgaWYoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpe1xuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JQcm90b3R5cGUsIFRBRywgdHJ1ZSk7XG4gICAgICAvLyBmaXggZm9yIHNvbWUgb2xkIGVuZ2luZXNcbiAgICAgIGlmKCFMSUJSQVJZICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSloaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYoREVGX1ZBTFVFUyAmJiAkbmF0aXZlICYmICRuYXRpdmUubmFtZSAhPT0gVkFMVUVTKXtcbiAgICBWQUxVRVNfQlVHID0gdHJ1ZTtcbiAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZigoIUxJQlJBUlkgfHwgRk9SQ0VEKSAmJiAoQlVHR1kgfHwgVkFMVUVTX0JVRyB8fCAhcHJvdG9bSVRFUkFUT1JdKSl7XG4gICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcbiAgfVxuICAvLyBQbHVnIGZvciBsaWJyYXJ5XG4gIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuICBJdGVyYXRvcnNbVEFHXSAgPSByZXR1cm5UaGlzO1xuICBpZihERUZBVUxUKXtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiAgREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiAgICBJU19TRVQgICAgID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiAkZW50cmllc1xuICAgIH07XG4gICAgaWYoRk9SQ0VEKWZvcihrZXkgaW4gbWV0aG9kcyl7XG4gICAgICBpZighKGtleSBpbiBwcm90bykpcmVkZWZpbmUocHJvdG8sIGtleSwgbWV0aG9kc1trZXldKTtcbiAgICB9IGVsc2UgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoQlVHR1kgfHwgVkFMVUVTX0JVRyksIE5BTUUsIG1ldGhvZHMpO1xuICB9XG4gIHJldHVybiBtZXRob2RzO1xufTsiLCJ2YXIgSVRFUkFUT1IgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIHJpdGVyID0gWzddW0lURVJBVE9SXSgpO1xuICByaXRlclsncmV0dXJuJ10gPSBmdW5jdGlvbigpeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbigpeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjLCBza2lwQ2xvc2luZyl7XG4gIGlmKCFza2lwQ2xvc2luZyAmJiAhU0FGRV9DTE9TSU5HKXJldHVybiBmYWxzZTtcbiAgdmFyIHNhZmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyICA9IFs3XVxuICAgICAgLCBpdGVyID0gYXJyW0lURVJBVE9SXSgpO1xuICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uKCl7IHJldHVybiB7ZG9uZTogc2FmZSA9IHRydWV9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbigpeyByZXR1cm4gaXRlcjsgfTtcbiAgICBleGVjKGFycik7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIHNhZmU7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZG9uZSwgdmFsdWUpe1xuICByZXR1cm4ge3ZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lfTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB7fTsiLCJ2YXIgZ2V0S2V5cyAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKVxuICAsIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqZWN0LCBlbCl7XG4gIHZhciBPICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuICAgICwga2V5cyAgID0gZ2V0S2V5cyhPKVxuICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcbiAgICAsIGluZGV4ICA9IDBcbiAgICAsIGtleTtcbiAgd2hpbGUobGVuZ3RoID4gaW5kZXgpaWYoT1trZXkgPSBrZXlzW2luZGV4KytdXSA9PT0gZWwpcmV0dXJuIGtleTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB0cnVlOyIsInZhciBNRVRBICAgICA9IHJlcXVpcmUoJy4vX3VpZCcpKCdtZXRhJylcbiAgLCBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgaGFzICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIHNldERlc2MgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZlxuICAsIGlkICAgICAgID0gMDtcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uKCl7XG4gIHJldHVybiB0cnVlO1xufTtcbnZhciBGUkVFWkUgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xufSk7XG52YXIgc2V0TWV0YSA9IGZ1bmN0aW9uKGl0KXtcbiAgc2V0RGVzYyhpdCwgTUVUQSwge3ZhbHVlOiB7XG4gICAgaTogJ08nICsgKytpZCwgLy8gb2JqZWN0IElEXG4gICAgdzoge30gICAgICAgICAgLy8gd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfX0pO1xufTtcbnZhciBmYXN0S2V5ID0gZnVuY3Rpb24oaXQsIGNyZWF0ZSl7XG4gIC8vIHJldHVybiBwcmltaXRpdmUgd2l0aCBwcmVmaXhcbiAgaWYoIWlzT2JqZWN0KGl0KSlyZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZighaGFzKGl0LCBNRVRBKSl7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZighaXNFeHRlbnNpYmxlKGl0KSlyZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYoIWNyZWF0ZSlyZXR1cm4gJ0UnO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBvYmplY3QgSURcbiAgfSByZXR1cm4gaXRbTUVUQV0uaTtcbn07XG52YXIgZ2V0V2VhayA9IGZ1bmN0aW9uKGl0LCBjcmVhdGUpe1xuICBpZighaGFzKGl0LCBNRVRBKSl7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZighaXNFeHRlbnNpYmxlKGl0KSlyZXR1cm4gdHJ1ZTtcbiAgICAvLyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBtZXRhZGF0YVxuICAgIGlmKCFjcmVhdGUpcmV0dXJuIGZhbHNlO1xuICAgIC8vIGFkZCBtaXNzaW5nIG1ldGFkYXRhXG4gICAgc2V0TWV0YShpdCk7XG4gIC8vIHJldHVybiBoYXNoIHdlYWsgY29sbGVjdGlvbnMgSURzXG4gIH0gcmV0dXJuIGl0W01FVEFdLnc7XG59O1xuLy8gYWRkIG1ldGFkYXRhIG9uIGZyZWV6ZS1mYW1pbHkgbWV0aG9kcyBjYWxsaW5nXG52YXIgb25GcmVlemUgPSBmdW5jdGlvbihpdCl7XG4gIGlmKEZSRUVaRSAmJiBtZXRhLk5FRUQgJiYgaXNFeHRlbnNpYmxlKGl0KSAmJiAhaGFzKGl0LCBNRVRBKSlzZXRNZXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIEtFWTogICAgICBNRVRBLFxuICBORUVEOiAgICAgZmFsc2UsXG4gIGZhc3RLZXk6ICBmYXN0S2V5LFxuICBnZXRXZWFrOiAgZ2V0V2VhayxcbiAgb25GcmVlemU6IG9uRnJlZXplXG59OyIsIid1c2Ugc3RyaWN0Jztcbi8vIDE5LjEuMi4xIE9iamVjdC5hc3NpZ24odGFyZ2V0LCBzb3VyY2UsIC4uLilcbnZhciBnZXRLZXlzICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJylcbiAgLCBnT1BTICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BzJylcbiAgLCBwSUUgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKVxuICAsIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0JylcbiAgLCBJT2JqZWN0ICA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKVxuICAsICRhc3NpZ24gID0gT2JqZWN0LmFzc2lnbjtcblxuLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG5tb2R1bGUuZXhwb3J0cyA9ICEkYXNzaWduIHx8IHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgdmFyIEEgPSB7fVxuICAgICwgQiA9IHt9XG4gICAgLCBTID0gU3ltYm9sKClcbiAgICAsIEsgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnO1xuICBBW1NdID0gNztcbiAgSy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbihrKXsgQltrXSA9IGs7IH0pO1xuICByZXR1cm4gJGFzc2lnbih7fSwgQSlbU10gIT0gNyB8fCBPYmplY3Qua2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gSztcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKXsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICB2YXIgVCAgICAgPSB0b09iamVjdCh0YXJnZXQpXG4gICAgLCBhTGVuICA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAsIGluZGV4ID0gMVxuICAgICwgZ2V0U3ltYm9scyA9IGdPUFMuZlxuICAgICwgaXNFbnVtICAgICA9IHBJRS5mO1xuICB3aGlsZShhTGVuID4gaW5kZXgpe1xuICAgIHZhciBTICAgICAgPSBJT2JqZWN0KGFyZ3VtZW50c1tpbmRleCsrXSlcbiAgICAgICwga2V5cyAgID0gZ2V0U3ltYm9scyA/IGdldEtleXMoUykuY29uY2F0KGdldFN5bWJvbHMoUykpIDogZ2V0S2V5cyhTKVxuICAgICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICAgLCBqICAgICAgPSAwXG4gICAgICAsIGtleTtcbiAgICB3aGlsZShsZW5ndGggPiBqKWlmKGlzRW51bS5jYWxsKFMsIGtleSA9IGtleXNbaisrXSkpVFtrZXldID0gU1trZXldO1xuICB9IHJldHVybiBUO1xufSA6ICRhc3NpZ247IiwiLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG52YXIgYW5PYmplY3QgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGRQcyAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwcycpXG4gICwgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJylcbiAgLCBJRV9QUk9UTyAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKVxuICAsIEVtcHR5ICAgICAgID0gZnVuY3Rpb24oKXsgLyogZW1wdHkgKi8gfVxuICAsIFBST1RPVFlQRSAgID0gJ3Byb3RvdHlwZSc7XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24oKXtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnaWZyYW1lJylcbiAgICAsIGkgICAgICA9IGVudW1CdWdLZXlzLmxlbmd0aFxuICAgICwgbHQgICAgID0gJzwnXG4gICAgLCBndCAgICAgPSAnPidcbiAgICAsIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVxdWlyZSgnLi9faHRtbCcpLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZS5zcmMgPSAnamF2YXNjcmlwdDonOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNjcmlwdC11cmxcbiAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcbiAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlKGktLSlkZWxldGUgY3JlYXRlRGljdFtQUk9UT1RZUEVdW2VudW1CdWdLZXlzW2ldXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiBjcmVhdGUoTywgUHJvcGVydGllcyl7XG4gIHZhciByZXN1bHQ7XG4gIGlmKE8gIT09IG51bGwpe1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBhbk9iamVjdChPKTtcbiAgICByZXN1bHQgPSBuZXcgRW1wdHk7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UT10gPSBPO1xuICB9IGVsc2UgcmVzdWx0ID0gY3JlYXRlRGljdCgpO1xuICByZXR1cm4gUHJvcGVydGllcyA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogZFBzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuIiwidmFyIGFuT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJylcbiAgLCB0b1ByaW1pdGl2ZSAgICA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpXG4gICwgZFAgICAgICAgICAgICAgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKXtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmKElFOF9ET01fREVGSU5FKXRyeSB7XG4gICAgcmV0dXJuIGRQKE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG4gIGlmKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcyl0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIScpO1xuICBpZigndmFsdWUnIGluIEF0dHJpYnV0ZXMpT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTsiLCJ2YXIgZFAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBnZXRLZXlzICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKXtcbiAgYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzICAgPSBnZXRLZXlzKFByb3BlcnRpZXMpXG4gICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICwgaSA9IDBcbiAgICAsIFA7XG4gIHdoaWxlKGxlbmd0aCA+IGkpZFAuZihPLCBQID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW1BdKTtcbiAgcmV0dXJuIE87XG59OyIsInZhciBwSUUgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKVxuICAsIGNyZWF0ZURlc2MgICAgID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpXG4gICwgdG9JT2JqZWN0ICAgICAgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCB0b1ByaW1pdGl2ZSAgICA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpXG4gICwgaGFzICAgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKVxuICAsIGdPUEQgICAgICAgICAgID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGdPUEQgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCl7XG4gIE8gPSB0b0lPYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcbiAgICByZXR1cm4gZ09QRChPLCBQKTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuICBpZihoYXMoTywgUCkpcmV0dXJuIGNyZWF0ZURlc2MoIXBJRS5mLmNhbGwoTywgUCksIE9bUF0pO1xufTsiLCIvLyBmYWxsYmFjayBmb3IgSUUxMSBidWdneSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB3aXRoIGlmcmFtZSBhbmQgd2luZG93XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgZ09QTiAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mXG4gICwgdG9TdHJpbmcgID0ge30udG9TdHJpbmc7XG5cbnZhciB3aW5kb3dOYW1lcyA9IHR5cGVvZiB3aW5kb3cgPT0gJ29iamVjdCcgJiYgd2luZG93ICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzXG4gID8gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KSA6IFtdO1xuXG52YXIgZ2V0V2luZG93TmFtZXMgPSBmdW5jdGlvbihpdCl7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdPUE4oaXQpO1xuICB9IGNhdGNoKGUpe1xuICAgIHJldHVybiB3aW5kb3dOYW1lcy5zbGljZSgpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCl7XG4gIHJldHVybiB3aW5kb3dOYW1lcyAmJiB0b1N0cmluZy5jYWxsKGl0KSA9PSAnW29iamVjdCBXaW5kb3ddJyA/IGdldFdpbmRvd05hbWVzKGl0KSA6IGdPUE4odG9JT2JqZWN0KGl0KSk7XG59O1xuIiwiLy8gMTkuMS4yLjcgLyAxNS4yLjMuNCBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxudmFyICRrZXlzICAgICAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpXG4gICwgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKS5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKXtcbiAgcmV0dXJuICRrZXlzKE8sIGhpZGRlbktleXMpO1xufTsiLCJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzOyIsIi8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgaGFzICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIHRvT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0JylcbiAgLCBJRV9QUk9UTyAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKVxuICAsIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24oTyl7XG4gIE8gPSB0b09iamVjdChPKTtcbiAgaWYoaGFzKE8sIElFX1BST1RPKSlyZXR1cm4gT1tJRV9QUk9UT107XG4gIGlmKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3Ipe1xuICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvIDogbnVsbDtcbn07IiwidmFyIGhhcyAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgdG9JT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgYXJyYXlJbmRleE9mID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKShmYWxzZSlcbiAgLCBJRV9QUk9UTyAgICAgPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqZWN0LCBuYW1lcyl7XG4gIHZhciBPICAgICAgPSB0b0lPYmplY3Qob2JqZWN0KVxuICAgICwgaSAgICAgID0gMFxuICAgICwgcmVzdWx0ID0gW11cbiAgICAsIGtleTtcbiAgZm9yKGtleSBpbiBPKWlmKGtleSAhPSBJRV9QUk9UTyloYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlKG5hbWVzLmxlbmd0aCA+IGkpaWYoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKXtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59OyIsIi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxudmFyICRrZXlzICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKVxuICAsIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTyl7XG4gIHJldHVybiAka2V5cyhPLCBlbnVtQnVnS2V5cyk7XG59OyIsImV4cG9ydHMuZiA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlOyIsInZhciBnZXRLZXlzICAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpXG4gICwgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgaXNFbnVtICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpLmY7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGlzRW50cmllcyl7XG4gIHJldHVybiBmdW5jdGlvbihpdCl7XG4gICAgdmFyIE8gICAgICA9IHRvSU9iamVjdChpdClcbiAgICAgICwga2V5cyAgID0gZ2V0S2V5cyhPKVxuICAgICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICAgLCBpICAgICAgPSAwXG4gICAgICAsIHJlc3VsdCA9IFtdXG4gICAgICAsIGtleTtcbiAgICB3aGlsZShsZW5ndGggPiBpKWlmKGlzRW51bS5jYWxsKE8sIGtleSA9IGtleXNbaSsrXSkpe1xuICAgICAgcmVzdWx0LnB1c2goaXNFbnRyaWVzID8gW2tleSwgT1trZXldXSA6IE9ba2V5XSk7XG4gICAgfSByZXR1cm4gcmVzdWx0O1xuICB9O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGJpdG1hcCwgdmFsdWUpe1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGUgIDogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGUgICAgOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlICAgICAgIDogdmFsdWVcbiAgfTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19oaWRlJyk7IiwiLy8gV29ya3Mgd2l0aCBfX3Byb3RvX18gb25seS4gT2xkIHY4IGNhbid0IHdvcmsgd2l0aCBudWxsIHByb3RvIG9iamVjdHMuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGNoZWNrID0gZnVuY3Rpb24oTywgcHJvdG8pe1xuICBhbk9iamVjdChPKTtcbiAgaWYoIWlzT2JqZWN0KHByb3RvKSAmJiBwcm90byAhPT0gbnVsbCl0aHJvdyBUeXBlRXJyb3IocHJvdG8gKyBcIjogY2FuJ3Qgc2V0IGFzIHByb3RvdHlwZSFcIik7XG59O1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IC8vIGVzbGludC1kaXNhYmxlLWxpbmVcbiAgICBmdW5jdGlvbih0ZXN0LCBidWdneSwgc2V0KXtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldCA9IHJlcXVpcmUoJy4vX2N0eCcpKEZ1bmN0aW9uLmNhbGwsIHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0LCAyKTtcbiAgICAgICAgc2V0KHRlc3QsIFtdKTtcbiAgICAgICAgYnVnZ3kgPSAhKHRlc3QgaW5zdGFuY2VvZiBBcnJheSk7XG4gICAgICB9IGNhdGNoKGUpeyBidWdneSA9IHRydWU7IH1cbiAgICAgIHJldHVybiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZihPLCBwcm90byl7XG4gICAgICAgIGNoZWNrKE8sIHByb3RvKTtcbiAgICAgICAgaWYoYnVnZ3kpTy5fX3Byb3RvX18gPSBwcm90bztcbiAgICAgICAgZWxzZSBzZXQoTywgcHJvdG8pO1xuICAgICAgICByZXR1cm4gTztcbiAgICAgIH07XG4gICAgfSh7fSwgZmFsc2UpIDogdW5kZWZpbmVkKSxcbiAgY2hlY2s6IGNoZWNrXG59OyIsInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mXG4gICwgaGFzID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgdGFnLCBzdGF0KXtcbiAgaWYoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSlkZWYoaXQsIFRBRywge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRhZ30pO1xufTsiLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ2tleXMnKVxuICAsIHVpZCAgICA9IHJlcXVpcmUoJy4vX3VpZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gdWlkKGtleSkpO1xufTsiLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJ1xuICAsIHN0b3JlICA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB7fSk7XG59OyIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBkZWZpbmVkICAgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihUT19TVFJJTkcpe1xuICByZXR1cm4gZnVuY3Rpb24odGhhdCwgcG9zKXtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKVxuICAgICAgLCBpID0gdG9JbnRlZ2VyKHBvcylcbiAgICAgICwgbCA9IHMubGVuZ3RoXG4gICAgICAsIGEsIGI7XG4gICAgaWYoaSA8IDAgfHwgaSA+PSBsKXJldHVybiBUT19TVFJJTkcgPyAnJyA6IHVuZGVmaW5lZDtcbiAgICBhID0gcy5jaGFyQ29kZUF0KGkpO1xuICAgIHJldHVybiBhIDwgMHhkODAwIHx8IGEgPiAweGRiZmYgfHwgaSArIDEgPT09IGwgfHwgKGIgPSBzLmNoYXJDb2RlQXQoaSArIDEpKSA8IDB4ZGMwMCB8fCBiID4gMHhkZmZmXG4gICAgICA/IFRPX1NUUklORyA/IHMuY2hhckF0KGkpIDogYVxuICAgICAgOiBUT19TVFJJTkcgPyBzLnNsaWNlKGksIGkgKyAyKSA6IChhIC0gMHhkODAwIDw8IDEwKSArIChiIC0gMHhkYzAwKSArIDB4MTAwMDA7XG4gIH07XG59OyIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBtYXggICAgICAgPSBNYXRoLm1heFxuICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpbmRleCwgbGVuZ3RoKXtcbiAgaW5kZXggPSB0b0ludGVnZXIoaW5kZXgpO1xuICByZXR1cm4gaW5kZXggPCAwID8gbWF4KGluZGV4ICsgbGVuZ3RoLCAwKSA6IG1pbihpbmRleCwgbGVuZ3RoKTtcbn07IiwiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCAgPSBNYXRoLmNlaWxcbiAgLCBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59OyIsIi8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0JylcbiAgLCBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07IiwiLy8gNy4xLjE1IFRvTGVuZ3RoXG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgbWluICAgICAgID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07IiwiLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG59OyIsIi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIFMpe1xuICBpZighaXNPYmplY3QoaXQpKXJldHVybiBpdDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcbiAgaWYodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICBpZighUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59OyIsInZhciBpZCA9IDBcbiAgLCBweCA9IE1hdGgucmFuZG9tKCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcHgpLnRvU3RyaW5nKDM2KSk7XG59OyIsInZhciBnbG9iYWwgICAgICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgY29yZSAgICAgICAgICAgPSByZXF1aXJlKCcuL19jb3JlJylcbiAgLCBMSUJSQVJZICAgICAgICA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKVxuICAsIHdrc0V4dCAgICAgICAgID0gcmVxdWlyZSgnLi9fd2tzLWV4dCcpXG4gICwgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihuYW1lKXtcbiAgdmFyICRTeW1ib2wgPSBjb3JlLlN5bWJvbCB8fCAoY29yZS5TeW1ib2wgPSBMSUJSQVJZID8ge30gOiBnbG9iYWwuU3ltYm9sIHx8IHt9KTtcbiAgaWYobmFtZS5jaGFyQXQoMCkgIT0gJ18nICYmICEobmFtZSBpbiAkU3ltYm9sKSlkZWZpbmVQcm9wZXJ0eSgkU3ltYm9sLCBuYW1lLCB7dmFsdWU6IHdrc0V4dC5mKG5hbWUpfSk7XG59OyIsImV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX3drcycpOyIsInZhciBzdG9yZSAgICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ3drcycpXG4gICwgdWlkICAgICAgICA9IHJlcXVpcmUoJy4vX3VpZCcpXG4gICwgU3ltYm9sICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLlN5bWJvbFxuICAsIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cbnZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obmFtZSl7XG4gIHJldHVybiBzdG9yZVtuYW1lXSB8fCAoc3RvcmVbbmFtZV0gPVxuICAgIFVTRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdIHx8IChVU0VfU1lNQk9MID8gU3ltYm9sIDogdWlkKSgnU3ltYm9sLicgKyBuYW1lKSk7XG59O1xuXG4kZXhwb3J0cy5zdG9yZSA9IHN0b3JlOyIsInZhciBjbGFzc29mICAgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgLCBJVEVSQVRPUiAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuZ2V0SXRlcmF0b3JNZXRob2QgPSBmdW5jdGlvbihpdCl7XG4gIGlmKGl0ICE9IHVuZGVmaW5lZClyZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBjdHggICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgJGV4cG9ydCAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHRvT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0JylcbiAgLCBjYWxsICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXItY2FsbCcpXG4gICwgaXNBcnJheUl0ZXIgICAgPSByZXF1aXJlKCcuL19pcy1hcnJheS1pdGVyJylcbiAgLCB0b0xlbmd0aCAgICAgICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXG4gICwgY3JlYXRlUHJvcGVydHkgPSByZXF1aXJlKCcuL19jcmVhdGUtcHJvcGVydHknKVxuICAsIGdldEl0ZXJGbiAgICAgID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKShmdW5jdGlvbihpdGVyKXsgQXJyYXkuZnJvbShpdGVyKTsgfSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4yLjEgQXJyYXkuZnJvbShhcnJheUxpa2UsIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICBmcm9tOiBmdW5jdGlvbiBmcm9tKGFycmF5TGlrZS8qLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZCovKXtcbiAgICB2YXIgTyAgICAgICA9IHRvT2JqZWN0KGFycmF5TGlrZSlcbiAgICAgICwgQyAgICAgICA9IHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgPyB0aGlzIDogQXJyYXlcbiAgICAgICwgYUxlbiAgICA9IGFyZ3VtZW50cy5sZW5ndGhcbiAgICAgICwgbWFwZm4gICA9IGFMZW4gPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkXG4gICAgICAsIG1hcHBpbmcgPSBtYXBmbiAhPT0gdW5kZWZpbmVkXG4gICAgICAsIGluZGV4ICAgPSAwXG4gICAgICAsIGl0ZXJGbiAgPSBnZXRJdGVyRm4oTylcbiAgICAgICwgbGVuZ3RoLCByZXN1bHQsIHN0ZXAsIGl0ZXJhdG9yO1xuICAgIGlmKG1hcHBpbmcpbWFwZm4gPSBjdHgobWFwZm4sIGFMZW4gPiAyID8gYXJndW1lbnRzWzJdIDogdW5kZWZpbmVkLCAyKTtcbiAgICAvLyBpZiBvYmplY3QgaXNuJ3QgaXRlcmFibGUgb3IgaXQncyBhcnJheSB3aXRoIGRlZmF1bHQgaXRlcmF0b3IgLSB1c2Ugc2ltcGxlIGNhc2VcbiAgICBpZihpdGVyRm4gIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcihpdGVyRm4pKSl7XG4gICAgICBmb3IoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChPKSwgcmVzdWx0ID0gbmV3IEM7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgaW5kZXgrKyl7XG4gICAgICAgIGNyZWF0ZVByb3BlcnR5KHJlc3VsdCwgaW5kZXgsIG1hcHBpbmcgPyBjYWxsKGl0ZXJhdG9yLCBtYXBmbiwgW3N0ZXAudmFsdWUsIGluZGV4XSwgdHJ1ZSkgOiBzdGVwLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgICAgZm9yKHJlc3VsdCA9IG5ldyBDKGxlbmd0aCk7IGxlbmd0aCA+IGluZGV4OyBpbmRleCsrKXtcbiAgICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IG1hcGZuKE9baW5kZXhdLCBpbmRleCkgOiBPW2luZGV4XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJylcbiAgLCBzdGVwICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJylcbiAgLCBJdGVyYXRvcnMgICAgICAgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCB0b0lPYmplY3QgICAgICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xuXG4vLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKVxuLy8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uKGl0ZXJhdGVkLCBraW5kKXtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbigpe1xuICB2YXIgTyAgICAgPSB0aGlzLl90XG4gICAgLCBraW5kICA9IHRoaXMuX2tcbiAgICAsIGluZGV4ID0gdGhpcy5faSsrO1xuICBpZighTyB8fCBpbmRleCA+PSBPLmxlbmd0aCl7XG4gICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc3RlcCgxKTtcbiAgfVxuICBpZihraW5kID09ICdrZXlzJyAgKXJldHVybiBzdGVwKDAsIGluZGV4KTtcbiAgaWYoa2luZCA9PSAndmFsdWVzJylyZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7IiwiLy8gMTkuMS4zLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GLCAnT2JqZWN0Jywge2Fzc2lnbjogcmVxdWlyZSgnLi9fb2JqZWN0LWFzc2lnbicpfSk7IiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuLy8gMTkuMS4yLjIgLyAxNS4yLjMuNSBPYmplY3QuY3JlYXRlKE8gWywgUHJvcGVydGllc10pXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtjcmVhdGU6IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKX0pOyIsIi8vIDE5LjEuMy4xOSBPYmplY3Quc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7c2V0UHJvdG90eXBlT2Y6IHJlcXVpcmUoJy4vX3NldC1wcm90bycpLnNldH0pOyIsIiIsIid1c2Ugc3RyaWN0JztcbnZhciAkYXQgID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG5cbi8vIDIxLjEuMy4yNyBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24oaXRlcmF0ZWQpe1xuICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4vLyAyMS4xLjUuMi4xICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbigpe1xuICB2YXIgTyAgICAgPSB0aGlzLl90XG4gICAgLCBpbmRleCA9IHRoaXMuX2lcbiAgICAsIHBvaW50O1xuICBpZihpbmRleCA+PSBPLmxlbmd0aClyZXR1cm4ge3ZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWV9O1xuICBwb2ludCA9ICRhdChPLCBpbmRleCk7XG4gIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4ge3ZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2V9O1xufSk7IiwiJ3VzZSBzdHJpY3QnO1xuLy8gRUNNQVNjcmlwdCA2IHN5bWJvbHMgc2hpbVxudmFyIGdsb2JhbCAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBoYXMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgREVTQ1JJUFRPUlMgICAgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpXG4gICwgJGV4cG9ydCAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHJlZGVmaW5lICAgICAgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKVxuICAsIE1FVEEgICAgICAgICAgID0gcmVxdWlyZSgnLi9fbWV0YScpLktFWVxuICAsICRmYWlscyAgICAgICAgID0gcmVxdWlyZSgnLi9fZmFpbHMnKVxuICAsIHNoYXJlZCAgICAgICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkJylcbiAgLCBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJylcbiAgLCB1aWQgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3VpZCcpXG4gICwgd2tzICAgICAgICAgICAgPSByZXF1aXJlKCcuL193a3MnKVxuICAsIHdrc0V4dCAgICAgICAgID0gcmVxdWlyZSgnLi9fd2tzLWV4dCcpXG4gICwgd2tzRGVmaW5lICAgICAgPSByZXF1aXJlKCcuL193a3MtZGVmaW5lJylcbiAgLCBrZXlPZiAgICAgICAgICA9IHJlcXVpcmUoJy4vX2tleW9mJylcbiAgLCBlbnVtS2V5cyAgICAgICA9IHJlcXVpcmUoJy4vX2VudW0ta2V5cycpXG4gICwgaXNBcnJheSAgICAgICAgPSByZXF1aXJlKCcuL19pcy1hcnJheScpXG4gICwgYW5PYmplY3QgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIHRvSU9iamVjdCAgICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgdG9QcmltaXRpdmUgICAgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKVxuICAsIGNyZWF0ZURlc2MgICAgID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpXG4gICwgX2NyZWF0ZSAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJylcbiAgLCBnT1BORXh0ICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuLWV4dCcpXG4gICwgJEdPUEQgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpXG4gICwgJERQICAgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsICRrZXlzICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKVxuICAsIGdPUEQgICAgICAgICAgID0gJEdPUEQuZlxuICAsIGRQICAgICAgICAgICAgID0gJERQLmZcbiAgLCBnT1BOICAgICAgICAgICA9IGdPUE5FeHQuZlxuICAsICRTeW1ib2wgICAgICAgID0gZ2xvYmFsLlN5bWJvbFxuICAsICRKU09OICAgICAgICAgID0gZ2xvYmFsLkpTT05cbiAgLCBfc3RyaW5naWZ5ICAgICA9ICRKU09OICYmICRKU09OLnN0cmluZ2lmeVxuICAsIFBST1RPVFlQRSAgICAgID0gJ3Byb3RvdHlwZSdcbiAgLCBISURERU4gICAgICAgICA9IHdrcygnX2hpZGRlbicpXG4gICwgVE9fUFJJTUlUSVZFICAgPSB3a3MoJ3RvUHJpbWl0aXZlJylcbiAgLCBpc0VudW0gICAgICAgICA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlXG4gICwgU3ltYm9sUmVnaXN0cnkgPSBzaGFyZWQoJ3N5bWJvbC1yZWdpc3RyeScpXG4gICwgQWxsU3ltYm9scyAgICAgPSBzaGFyZWQoJ3N5bWJvbHMnKVxuICAsIE9QU3ltYm9scyAgICAgID0gc2hhcmVkKCdvcC1zeW1ib2xzJylcbiAgLCBPYmplY3RQcm90byAgICA9IE9iamVjdFtQUk9UT1RZUEVdXG4gICwgVVNFX05BVElWRSAgICAgPSB0eXBlb2YgJFN5bWJvbCA9PSAnZnVuY3Rpb24nXG4gICwgUU9iamVjdCAgICAgICAgPSBnbG9iYWwuUU9iamVjdDtcbi8vIERvbid0IHVzZSBzZXR0ZXJzIGluIFF0IFNjcmlwdCwgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzE3M1xudmFyIHNldHRlciA9ICFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRV0gfHwgIVFPYmplY3RbUFJPVE9UWVBFXS5maW5kQ2hpbGQ7XG5cbi8vIGZhbGxiYWNrIGZvciBvbGQgQW5kcm9pZCwgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTY4N1xudmFyIHNldFN5bWJvbERlc2MgPSBERVNDUklQVE9SUyAmJiAkZmFpbHMoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIF9jcmVhdGUoZFAoe30sICdhJywge1xuICAgIGdldDogZnVuY3Rpb24oKXsgcmV0dXJuIGRQKHRoaXMsICdhJywge3ZhbHVlOiA3fSkuYTsgfVxuICB9KSkuYSAhPSA3O1xufSkgPyBmdW5jdGlvbihpdCwga2V5LCBEKXtcbiAgdmFyIHByb3RvRGVzYyA9IGdPUEQoT2JqZWN0UHJvdG8sIGtleSk7XG4gIGlmKHByb3RvRGVzYylkZWxldGUgT2JqZWN0UHJvdG9ba2V5XTtcbiAgZFAoaXQsIGtleSwgRCk7XG4gIGlmKHByb3RvRGVzYyAmJiBpdCAhPT0gT2JqZWN0UHJvdG8pZFAoT2JqZWN0UHJvdG8sIGtleSwgcHJvdG9EZXNjKTtcbn0gOiBkUDtcblxudmFyIHdyYXAgPSBmdW5jdGlvbih0YWcpe1xuICB2YXIgc3ltID0gQWxsU3ltYm9sc1t0YWddID0gX2NyZWF0ZSgkU3ltYm9sW1BST1RPVFlQRV0pO1xuICBzeW0uX2sgPSB0YWc7XG4gIHJldHVybiBzeW07XG59O1xuXG52YXIgaXNTeW1ib2wgPSBVU0VfTkFUSVZFICYmIHR5cGVvZiAkU3ltYm9sLml0ZXJhdG9yID09ICdzeW1ib2wnID8gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGl0IGluc3RhbmNlb2YgJFN5bWJvbDtcbn07XG5cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBEKXtcbiAgaWYoaXQgPT09IE9iamVjdFByb3RvKSRkZWZpbmVQcm9wZXJ0eShPUFN5bWJvbHMsIGtleSwgRCk7XG4gIGFuT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgYW5PYmplY3QoRCk7XG4gIGlmKGhhcyhBbGxTeW1ib2xzLCBrZXkpKXtcbiAgICBpZighRC5lbnVtZXJhYmxlKXtcbiAgICAgIGlmKCFoYXMoaXQsIEhJRERFTikpZFAoaXQsIEhJRERFTiwgY3JlYXRlRGVzYygxLCB7fSkpO1xuICAgICAgaXRbSElEREVOXVtrZXldID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSlpdFtISURERU5dW2tleV0gPSBmYWxzZTtcbiAgICAgIEQgPSBfY3JlYXRlKEQsIHtlbnVtZXJhYmxlOiBjcmVhdGVEZXNjKDAsIGZhbHNlKX0pO1xuICAgIH0gcmV0dXJuIHNldFN5bWJvbERlc2MoaXQsIGtleSwgRCk7XG4gIH0gcmV0dXJuIGRQKGl0LCBrZXksIEQpO1xufTtcbnZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoaXQsIFApe1xuICBhbk9iamVjdChpdCk7XG4gIHZhciBrZXlzID0gZW51bUtleXMoUCA9IHRvSU9iamVjdChQKSlcbiAgICAsIGkgICAgPSAwXG4gICAgLCBsID0ga2V5cy5sZW5ndGhcbiAgICAsIGtleTtcbiAgd2hpbGUobCA+IGkpJGRlZmluZVByb3BlcnR5KGl0LCBrZXkgPSBrZXlzW2krK10sIFBba2V5XSk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpdCwgUCl7XG4gIHJldHVybiBQID09PSB1bmRlZmluZWQgPyBfY3JlYXRlKGl0KSA6ICRkZWZpbmVQcm9wZXJ0aWVzKF9jcmVhdGUoaXQpLCBQKTtcbn07XG52YXIgJHByb3BlcnR5SXNFbnVtZXJhYmxlID0gZnVuY3Rpb24gcHJvcGVydHlJc0VudW1lcmFibGUoa2V5KXtcbiAgdmFyIEUgPSBpc0VudW0uY2FsbCh0aGlzLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKTtcbiAgaWYodGhpcyA9PT0gT2JqZWN0UHJvdG8gJiYgaGFzKEFsbFN5bWJvbHMsIGtleSkgJiYgIWhhcyhPUFN5bWJvbHMsIGtleSkpcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gRSB8fCAhaGFzKHRoaXMsIGtleSkgfHwgIWhhcyhBbGxTeW1ib2xzLCBrZXkpIHx8IGhhcyh0aGlzLCBISURERU4pICYmIHRoaXNbSElEREVOXVtrZXldID8gRSA6IHRydWU7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoaXQsIGtleSl7XG4gIGl0ICA9IHRvSU9iamVjdChpdCk7XG4gIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSk7XG4gIGlmKGl0ID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSlyZXR1cm47XG4gIHZhciBEID0gZ09QRChpdCwga2V5KTtcbiAgaWYoRCAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pKUQuZW51bWVyYWJsZSA9IHRydWU7XG4gIHJldHVybiBEO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpe1xuICB2YXIgbmFtZXMgID0gZ09QTih0b0lPYmplY3QoaXQpKVxuICAgICwgcmVzdWx0ID0gW11cbiAgICAsIGkgICAgICA9IDBcbiAgICAsIGtleTtcbiAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSl7XG4gICAgaWYoIWhhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiBrZXkgIT0gSElEREVOICYmIGtleSAhPSBNRVRBKXJlc3VsdC5wdXNoKGtleSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgJGdldE93blByb3BlcnR5U3ltYm9scyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5U3ltYm9scyhpdCl7XG4gIHZhciBJU19PUCAgPSBpdCA9PT0gT2JqZWN0UHJvdG9cbiAgICAsIG5hbWVzICA9IGdPUE4oSVNfT1AgPyBPUFN5bWJvbHMgOiB0b0lPYmplY3QoaXQpKVxuICAgICwgcmVzdWx0ID0gW11cbiAgICAsIGkgICAgICA9IDBcbiAgICAsIGtleTtcbiAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSl7XG4gICAgaWYoaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIChJU19PUCA/IGhhcyhPYmplY3RQcm90bywga2V5KSA6IHRydWUpKXJlc3VsdC5wdXNoKEFsbFN5bWJvbHNba2V5XSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIDE5LjQuMS4xIFN5bWJvbChbZGVzY3JpcHRpb25dKVxuaWYoIVVTRV9OQVRJVkUpe1xuICAkU3ltYm9sID0gZnVuY3Rpb24gU3ltYm9sKCl7XG4gICAgaWYodGhpcyBpbnN0YW5jZW9mICRTeW1ib2wpdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhJyk7XG4gICAgdmFyIHRhZyA9IHVpZChhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG4gICAgdmFyICRzZXQgPSBmdW5jdGlvbih2YWx1ZSl7XG4gICAgICBpZih0aGlzID09PSBPYmplY3RQcm90bykkc2V0LmNhbGwoT1BTeW1ib2xzLCB2YWx1ZSk7XG4gICAgICBpZihoYXModGhpcywgSElEREVOKSAmJiBoYXModGhpc1tISURERU5dLCB0YWcpKXRoaXNbSElEREVOXVt0YWddID0gZmFsc2U7XG4gICAgICBzZXRTeW1ib2xEZXNjKHRoaXMsIHRhZywgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xuICAgIH07XG4gICAgaWYoREVTQ1JJUFRPUlMgJiYgc2V0dGVyKXNldFN5bWJvbERlc2MoT2JqZWN0UHJvdG8sIHRhZywge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiAkc2V0fSk7XG4gICAgcmV0dXJuIHdyYXAodGFnKTtcbiAgfTtcbiAgcmVkZWZpbmUoJFN5bWJvbFtQUk9UT1RZUEVdLCAndG9TdHJpbmcnLCBmdW5jdGlvbiB0b1N0cmluZygpe1xuICAgIHJldHVybiB0aGlzLl9rO1xuICB9KTtcblxuICAkR09QRC5mID0gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgJERQLmYgICA9ICRkZWZpbmVQcm9wZXJ0eTtcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mID0gZ09QTkV4dC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1waWUnKS5mICA9ICRwcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKS5mID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblxuICBpZihERVNDUklQVE9SUyAmJiAhcmVxdWlyZSgnLi9fbGlicmFyeScpKXtcbiAgICByZWRlZmluZShPYmplY3RQcm90bywgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJHByb3BlcnR5SXNFbnVtZXJhYmxlLCB0cnVlKTtcbiAgfVxuXG4gIHdrc0V4dC5mID0gZnVuY3Rpb24obmFtZSl7XG4gICAgcmV0dXJuIHdyYXAod2tzKG5hbWUpKTtcbiAgfVxufVxuXG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7U3ltYm9sOiAkU3ltYm9sfSk7XG5cbmZvcih2YXIgc3ltYm9scyA9IChcbiAgLy8gMTkuNC4yLjIsIDE5LjQuMi4zLCAxOS40LjIuNCwgMTkuNC4yLjYsIDE5LjQuMi44LCAxOS40LjIuOSwgMTkuNC4yLjEwLCAxOS40LjIuMTEsIDE5LjQuMi4xMiwgMTkuNC4yLjEzLCAxOS40LjIuMTRcbiAgJ2hhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzJ1xuKS5zcGxpdCgnLCcpLCBpID0gMDsgc3ltYm9scy5sZW5ndGggPiBpOyApd2tzKHN5bWJvbHNbaSsrXSk7XG5cbmZvcih2YXIgc3ltYm9scyA9ICRrZXlzKHdrcy5zdG9yZSksIGkgPSAwOyBzeW1ib2xzLmxlbmd0aCA+IGk7ICl3a3NEZWZpbmUoc3ltYm9sc1tpKytdKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ1N5bWJvbCcsIHtcbiAgLy8gMTkuNC4yLjEgU3ltYm9sLmZvcihrZXkpXG4gICdmb3InOiBmdW5jdGlvbihrZXkpe1xuICAgIHJldHVybiBoYXMoU3ltYm9sUmVnaXN0cnksIGtleSArPSAnJylcbiAgICAgID8gU3ltYm9sUmVnaXN0cnlba2V5XVxuICAgICAgOiBTeW1ib2xSZWdpc3RyeVtrZXldID0gJFN5bWJvbChrZXkpO1xuICB9LFxuICAvLyAxOS40LjIuNSBTeW1ib2wua2V5Rm9yKHN5bSlcbiAga2V5Rm9yOiBmdW5jdGlvbiBrZXlGb3Ioa2V5KXtcbiAgICBpZihpc1N5bWJvbChrZXkpKXJldHVybiBrZXlPZihTeW1ib2xSZWdpc3RyeSwga2V5KTtcbiAgICB0aHJvdyBUeXBlRXJyb3Ioa2V5ICsgJyBpcyBub3QgYSBzeW1ib2whJyk7XG4gIH0sXG4gIHVzZVNldHRlcjogZnVuY3Rpb24oKXsgc2V0dGVyID0gdHJ1ZTsgfSxcbiAgdXNlU2ltcGxlOiBmdW5jdGlvbigpeyBzZXR0ZXIgPSBmYWxzZTsgfVxufSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdPYmplY3QnLCB7XG4gIC8vIDE5LjEuMi4yIE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiAgY3JlYXRlOiAkY3JlYXRlLFxuICAvLyAxOS4xLjIuNCBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbiAgZGVmaW5lUHJvcGVydHk6ICRkZWZpbmVQcm9wZXJ0eSxcbiAgLy8gMTkuMS4yLjMgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcbiAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsXG4gIC8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICAvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiAkZ2V0T3duUHJvcGVydHlOYW1lcyxcbiAgLy8gMTkuMS4yLjggT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhPKVxuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcbn0pO1xuXG4vLyAyNC4zLjIgSlNPTi5zdHJpbmdpZnkodmFsdWUgWywgcmVwbGFjZXIgWywgc3BhY2VdXSlcbiRKU09OICYmICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCFVU0VfTkFUSVZFIHx8ICRmYWlscyhmdW5jdGlvbigpe1xuICB2YXIgUyA9ICRTeW1ib2woKTtcbiAgLy8gTVMgRWRnZSBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMge31cbiAgLy8gV2ViS2l0IGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyBudWxsXG4gIC8vIFY4IHRocm93cyBvbiBib3hlZCBzeW1ib2xzXG4gIHJldHVybiBfc3RyaW5naWZ5KFtTXSkgIT0gJ1tudWxsXScgfHwgX3N0cmluZ2lmeSh7YTogU30pICE9ICd7fScgfHwgX3N0cmluZ2lmeShPYmplY3QoUykpICE9ICd7fSc7XG59KSksICdKU09OJywge1xuICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCl7XG4gICAgaWYoaXQgPT09IHVuZGVmaW5lZCB8fCBpc1N5bWJvbChpdCkpcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG4gICAgdmFyIGFyZ3MgPSBbaXRdXG4gICAgICAsIGkgICAgPSAxXG4gICAgICAsIHJlcGxhY2VyLCAkcmVwbGFjZXI7XG4gICAgd2hpbGUoYXJndW1lbnRzLmxlbmd0aCA+IGkpYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICByZXBsYWNlciA9IGFyZ3NbMV07XG4gICAgaWYodHlwZW9mIHJlcGxhY2VyID09ICdmdW5jdGlvbicpJHJlcGxhY2VyID0gcmVwbGFjZXI7XG4gICAgaWYoJHJlcGxhY2VyIHx8ICFpc0FycmF5KHJlcGxhY2VyKSlyZXBsYWNlciA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpe1xuICAgICAgaWYoJHJlcGxhY2VyKXZhbHVlID0gJHJlcGxhY2VyLmNhbGwodGhpcywga2V5LCB2YWx1ZSk7XG4gICAgICBpZighaXNTeW1ib2wodmFsdWUpKXJldHVybiB2YWx1ZTtcbiAgICB9O1xuICAgIGFyZ3NbMV0gPSByZXBsYWNlcjtcbiAgICByZXR1cm4gX3N0cmluZ2lmeS5hcHBseSgkSlNPTiwgYXJncyk7XG4gIH1cbn0pO1xuXG4vLyAxOS40LjMuNCBTeW1ib2wucHJvdG90eXBlW0BAdG9QcmltaXRpdmVdKGhpbnQpXG4kU3ltYm9sW1BST1RPVFlQRV1bVE9fUFJJTUlUSVZFXSB8fCByZXF1aXJlKCcuL19oaWRlJykoJFN5bWJvbFtQUk9UT1RZUEVdLCBUT19QUklNSVRJVkUsICRTeW1ib2xbUFJPVE9UWVBFXS52YWx1ZU9mKTtcbi8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKCRTeW1ib2wsICdTeW1ib2wnKTtcbi8vIDIwLjIuMS45IE1hdGhbQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKE1hdGgsICdNYXRoJywgdHJ1ZSk7XG4vLyAyNC4zLjMgSlNPTltAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoZ2xvYmFsLkpTT04sICdKU09OJywgdHJ1ZSk7IiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JqZWN0LXZhbHVlcy1lbnRyaWVzXG52YXIgJGV4cG9ydCAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsICRlbnRyaWVzID0gcmVxdWlyZSgnLi9fb2JqZWN0LXRvLWFycmF5JykodHJ1ZSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge1xuICBlbnRyaWVzOiBmdW5jdGlvbiBlbnRyaWVzKGl0KXtcbiAgICByZXR1cm4gJGVudHJpZXMoaXQpO1xuICB9XG59KTsiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtdmFsdWVzLWVudHJpZXNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCAkdmFsdWVzID0gcmVxdWlyZSgnLi9fb2JqZWN0LXRvLWFycmF5JykoZmFsc2UpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoaXQpe1xuICAgIHJldHVybiAkdmFsdWVzKGl0KTtcbiAgfVxufSk7IiwicmVxdWlyZSgnLi9fd2tzLWRlZmluZScpKCdhc3luY0l0ZXJhdG9yJyk7IiwicmVxdWlyZSgnLi9fd2tzLWRlZmluZScpKCdvYnNlcnZhYmxlJyk7IiwicmVxdWlyZSgnLi9lczYuYXJyYXkuaXRlcmF0b3InKTtcbnZhciBnbG9iYWwgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBoaWRlICAgICAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgSXRlcmF0b3JzICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgVE9fU1RSSU5HX1RBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5mb3IodmFyIGNvbGxlY3Rpb25zID0gWydOb2RlTGlzdCcsICdET01Ub2tlbkxpc3QnLCAnTWVkaWFMaXN0JywgJ1N0eWxlU2hlZXRMaXN0JywgJ0NTU1J1bGVMaXN0J10sIGkgPSAwOyBpIDwgNTsgaSsrKXtcbiAgdmFyIE5BTUUgICAgICAgPSBjb2xsZWN0aW9uc1tpXVxuICAgICwgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXVxuICAgICwgcHJvdG8gICAgICA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIGlmKHByb3RvICYmICFwcm90b1tUT19TVFJJTkdfVEFHXSloaWRlKHByb3RvLCBUT19TVFJJTkdfVEFHLCBOQU1FKTtcbiAgSXRlcmF0b3JzW05BTUVdID0gSXRlcmF0b3JzLkFycmF5O1xufSIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHVyaSkge1xuICAgIHZhciBtaW1lICAgPSB1cmkuc3BsaXQoJywnKVswXS5zcGxpdCgnOicpWzFdLnNwbGl0KCc7JylbMF07XG4gICAgdmFyIGJ5dGVzICA9IGF0b2IodXJpLnNwbGl0KCcsJylbMV0pO1xuICAgIHZhciBsZW4gICAgPSBieXRlcy5sZW5ndGg7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyB3aW5kb3cuQXJyYXlCdWZmZXIobGVuKTtcbiAgICB2YXIgYXJyICAgID0gbmV3IHdpbmRvdy5VaW50OEFycmF5KGJ1ZmZlcik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGFycltpXSA9IGJ5dGVzLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBCbG9iKFthcnJdLCB7IHR5cGU6IG1pbWUgfSk7XG59XG5cbi8vIElFID49IDEwLCBtb3N0IG1vZGVybiBicm93c2Vyc1xuLy8gVGhlIEJsb2IgdHlwZSBjYW4ndCBiZSBwb2x5ZmlsbGVkLCB3aGljaCBpcyB3aHkgdGhlcmUgYXJlbid0IGFueSBwb2x5ZmlsbHMgZm9yIFR5cGVkQXJyYXlzIGZvciBvbGRlciBJRSdzXG5tb2R1bGUuZXhwb3J0cy5zdXBwb3J0ZWQgPSAoXG4gICAgdHlwZW9mIHdpbmRvdy5IVE1MQ2FudmFzRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2Ygd2luZG93LmF0b2IgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIHdpbmRvdy5CbG9iICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiB3aW5kb3cuQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIHdpbmRvdy5VaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJ1xuKTtcblxubW9kdWxlLmV4cG9ydHMuaW5pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIW1vZHVsZS5leHBvcnRzLnN1cHBvcnRlZCkgcmV0dXJuO1xuICAgIHZhciBDYW52YXNQcm90b3R5cGUgPSB3aW5kb3cuSFRNTENhbnZhc0VsZW1lbnQucHJvdG90eXBlO1xuICAgIFxuICAgIGlmICghQ2FudmFzUHJvdG90eXBlLnRvQmxvYiAmJiBDYW52YXNQcm90b3R5cGUudG9EYXRhVVJMKSB7XG4gICAgICAgIENhbnZhc1Byb3RvdHlwZS50b0Jsb2IgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIHR5cGUsIHF1YWxpdHkpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG1vZHVsZS5leHBvcnRzKHRoaXMudG9EYXRhVVJMKHR5cGUsIHF1YWxpdHkpKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKiFcbiAgQ29weXJpZ2h0IChjKSAyMDE2IEplZCBXYXRzb24uXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKSwgc2VlXG4gIGh0dHA6Ly9qZWR3YXRzb24uZ2l0aHViLmlvL2NsYXNzbmFtZXNcbiovXG4vKiBnbG9iYWwgZGVmaW5lICovXG5cbihmdW5jdGlvbiAoKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHR2YXIgaGFzT3duID0ge30uaGFzT3duUHJvcGVydHk7XG5cblx0ZnVuY3Rpb24gY2xhc3NOYW1lcyAoKSB7XG5cdFx0dmFyIGNsYXNzZXMgPSBbXTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgYXJnID0gYXJndW1lbnRzW2ldO1xuXHRcdFx0aWYgKCFhcmcpIGNvbnRpbnVlO1xuXG5cdFx0XHR2YXIgYXJnVHlwZSA9IHR5cGVvZiBhcmc7XG5cblx0XHRcdGlmIChhcmdUeXBlID09PSAnc3RyaW5nJyB8fCBhcmdUeXBlID09PSAnbnVtYmVyJykge1xuXHRcdFx0XHRjbGFzc2VzLnB1c2goYXJnKTtcblx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG5cdFx0XHRcdGNsYXNzZXMucHVzaChjbGFzc05hbWVzLmFwcGx5KG51bGwsIGFyZykpO1xuXHRcdFx0fSBlbHNlIGlmIChhcmdUeXBlID09PSAnb2JqZWN0Jykge1xuXHRcdFx0XHRmb3IgKHZhciBrZXkgaW4gYXJnKSB7XG5cdFx0XHRcdFx0aWYgKGhhc093bi5jYWxsKGFyZywga2V5KSAmJiBhcmdba2V5XSkge1xuXHRcdFx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGtleSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNsYXNzZXMuam9pbignICcpO1xuXHR9XG5cblx0aWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBjbGFzc05hbWVzO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRlZmluZS5hbWQgPT09ICdvYmplY3QnICYmIGRlZmluZS5hbWQpIHtcblx0XHQvLyByZWdpc3RlciBhcyAnY2xhc3NuYW1lcycsIGNvbnNpc3RlbnQgd2l0aCBucG0gcGFja2FnZSBuYW1lXG5cdFx0ZGVmaW5lKCdjbGFzc25hbWVzJywgW10sIGZ1bmN0aW9uICgpIHtcblx0XHRcdHJldHVybiBjbGFzc05hbWVzO1xuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdHdpbmRvdy5jbGFzc05hbWVzID0gY2xhc3NOYW1lcztcblx0fVxufSgpKTtcbiIsIiFmdW5jdGlvbigpIHtcbiAgdmFyIGQzID0ge1xuICAgIHZlcnNpb246IFwiMy41LjE3XCJcbiAgfTtcbiAgdmFyIGQzX2FycmF5U2xpY2UgPSBbXS5zbGljZSwgZDNfYXJyYXkgPSBmdW5jdGlvbihsaXN0KSB7XG4gICAgcmV0dXJuIGQzX2FycmF5U2xpY2UuY2FsbChsaXN0KTtcbiAgfTtcbiAgdmFyIGQzX2RvY3VtZW50ID0gdGhpcy5kb2N1bWVudDtcbiAgZnVuY3Rpb24gZDNfZG9jdW1lbnRFbGVtZW50KG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZSAmJiAobm9kZS5vd25lckRvY3VtZW50IHx8IG5vZGUuZG9jdW1lbnQgfHwgbm9kZSkuZG9jdW1lbnRFbGVtZW50O1xuICB9XG4gIGZ1bmN0aW9uIGQzX3dpbmRvdyhub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUgJiYgKG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgbm9kZS5kb2N1bWVudCAmJiBub2RlIHx8IG5vZGUuZGVmYXVsdFZpZXcpO1xuICB9XG4gIGlmIChkM19kb2N1bWVudCkge1xuICAgIHRyeSB7XG4gICAgICBkM19hcnJheShkM19kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcylbMF0ubm9kZVR5cGU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZDNfYXJyYXkgPSBmdW5jdGlvbihsaXN0KSB7XG4gICAgICAgIHZhciBpID0gbGlzdC5sZW5ndGgsIGFycmF5ID0gbmV3IEFycmF5KGkpO1xuICAgICAgICB3aGlsZSAoaS0tKSBhcnJheVtpXSA9IGxpc3RbaV07XG4gICAgICAgIHJldHVybiBhcnJheTtcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGlmICghRGF0ZS5ub3cpIERhdGUubm93ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuICtuZXcgRGF0ZSgpO1xuICB9O1xuICBpZiAoZDNfZG9jdW1lbnQpIHtcbiAgICB0cnkge1xuICAgICAgZDNfZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIkRJVlwiKS5zdHlsZS5zZXRQcm9wZXJ0eShcIm9wYWNpdHlcIiwgMCwgXCJcIik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHZhciBkM19lbGVtZW50X3Byb3RvdHlwZSA9IHRoaXMuRWxlbWVudC5wcm90b3R5cGUsIGQzX2VsZW1lbnRfc2V0QXR0cmlidXRlID0gZDNfZWxlbWVudF9wcm90b3R5cGUuc2V0QXR0cmlidXRlLCBkM19lbGVtZW50X3NldEF0dHJpYnV0ZU5TID0gZDNfZWxlbWVudF9wcm90b3R5cGUuc2V0QXR0cmlidXRlTlMsIGQzX3N0eWxlX3Byb3RvdHlwZSA9IHRoaXMuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUsIGQzX3N0eWxlX3NldFByb3BlcnR5ID0gZDNfc3R5bGVfcHJvdG90eXBlLnNldFByb3BlcnR5O1xuICAgICAgZDNfZWxlbWVudF9wcm90b3R5cGUuc2V0QXR0cmlidXRlID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgICAgZDNfZWxlbWVudF9zZXRBdHRyaWJ1dGUuY2FsbCh0aGlzLCBuYW1lLCB2YWx1ZSArIFwiXCIpO1xuICAgICAgfTtcbiAgICAgIGQzX2VsZW1lbnRfcHJvdG90eXBlLnNldEF0dHJpYnV0ZU5TID0gZnVuY3Rpb24oc3BhY2UsIGxvY2FsLCB2YWx1ZSkge1xuICAgICAgICBkM19lbGVtZW50X3NldEF0dHJpYnV0ZU5TLmNhbGwodGhpcywgc3BhY2UsIGxvY2FsLCB2YWx1ZSArIFwiXCIpO1xuICAgICAgfTtcbiAgICAgIGQzX3N0eWxlX3Byb3RvdHlwZS5zZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICAgICAgICBkM19zdHlsZV9zZXRQcm9wZXJ0eS5jYWxsKHRoaXMsIG5hbWUsIHZhbHVlICsgXCJcIiwgcHJpb3JpdHkpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgZDMuYXNjZW5kaW5nID0gZDNfYXNjZW5kaW5nO1xuICBmdW5jdGlvbiBkM19hc2NlbmRpbmcoYSwgYikge1xuICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjtcbiAgfVxuICBkMy5kZXNjZW5kaW5nID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHJldHVybiBiIDwgYSA/IC0xIDogYiA+IGEgPyAxIDogYiA+PSBhID8gMCA6IE5hTjtcbiAgfTtcbiAgZDMubWluID0gZnVuY3Rpb24oYXJyYXksIGYpIHtcbiAgICB2YXIgaSA9IC0xLCBuID0gYXJyYXkubGVuZ3RoLCBhLCBiO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwgJiYgYiA+PSBiKSB7XG4gICAgICAgIGEgPSBiO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBhcnJheVtpXSkgIT0gbnVsbCAmJiBhID4gYikgYSA9IGI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkgIT0gbnVsbCAmJiBiID49IGIpIHtcbiAgICAgICAgYSA9IGI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSAhPSBudWxsICYmIGEgPiBiKSBhID0gYjtcbiAgICB9XG4gICAgcmV0dXJuIGE7XG4gIH07XG4gIGQzLm1heCA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7XG4gICAgdmFyIGkgPSAtMSwgbiA9IGFycmF5Lmxlbmd0aCwgYSwgYjtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsICYmIGIgPj0gYikge1xuICAgICAgICBhID0gYjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwgJiYgYiA+IGEpIGEgPSBiO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpICE9IG51bGwgJiYgYiA+PSBiKSB7XG4gICAgICAgIGEgPSBiO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkgIT0gbnVsbCAmJiBiID4gYSkgYSA9IGI7XG4gICAgfVxuICAgIHJldHVybiBhO1xuICB9O1xuICBkMy5leHRlbnQgPSBmdW5jdGlvbihhcnJheSwgZikge1xuICAgIHZhciBpID0gLTEsIG4gPSBhcnJheS5sZW5ndGgsIGEsIGIsIGM7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBhcnJheVtpXSkgIT0gbnVsbCAmJiBiID49IGIpIHtcbiAgICAgICAgYSA9IGMgPSBiO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBhcnJheVtpXSkgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYSA+IGIpIGEgPSBiO1xuICAgICAgICBpZiAoYyA8IGIpIGMgPSBiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpICE9IG51bGwgJiYgYiA+PSBiKSB7XG4gICAgICAgIGEgPSBjID0gYjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGEgPiBiKSBhID0gYjtcbiAgICAgICAgaWYgKGMgPCBiKSBjID0gYjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFsgYSwgYyBdO1xuICB9O1xuICBmdW5jdGlvbiBkM19udW1iZXIoeCkge1xuICAgIHJldHVybiB4ID09PSBudWxsID8gTmFOIDogK3g7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbnVtZXJpYyh4KSB7XG4gICAgcmV0dXJuICFpc05hTih4KTtcbiAgfVxuICBkMy5zdW0gPSBmdW5jdGlvbihhcnJheSwgZikge1xuICAgIHZhciBzID0gMCwgbiA9IGFycmF5Lmxlbmd0aCwgYSwgaSA9IC0xO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKGQzX251bWVyaWMoYSA9ICthcnJheVtpXSkpIHMgKz0gYTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmIChkM19udW1lcmljKGEgPSArZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpKSBzICs9IGE7XG4gICAgfVxuICAgIHJldHVybiBzO1xuICB9O1xuICBkMy5tZWFuID0gZnVuY3Rpb24oYXJyYXksIGYpIHtcbiAgICB2YXIgcyA9IDAsIG4gPSBhcnJheS5sZW5ndGgsIGEsIGkgPSAtMSwgaiA9IG47XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoZDNfbnVtZXJpYyhhID0gZDNfbnVtYmVyKGFycmF5W2ldKSkpIHMgKz0gYTsgZWxzZSAtLWo7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoZDNfbnVtZXJpYyhhID0gZDNfbnVtYmVyKGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSkpIHMgKz0gYTsgZWxzZSAtLWo7XG4gICAgfVxuICAgIGlmIChqKSByZXR1cm4gcyAvIGo7XG4gIH07XG4gIGQzLnF1YW50aWxlID0gZnVuY3Rpb24odmFsdWVzLCBwKSB7XG4gICAgdmFyIEggPSAodmFsdWVzLmxlbmd0aCAtIDEpICogcCArIDEsIGggPSBNYXRoLmZsb29yKEgpLCB2ID0gK3ZhbHVlc1toIC0gMV0sIGUgPSBIIC0gaDtcbiAgICByZXR1cm4gZSA/IHYgKyBlICogKHZhbHVlc1toXSAtIHYpIDogdjtcbiAgfTtcbiAgZDMubWVkaWFuID0gZnVuY3Rpb24oYXJyYXksIGYpIHtcbiAgICB2YXIgbnVtYmVycyA9IFtdLCBuID0gYXJyYXkubGVuZ3RoLCBhLCBpID0gLTE7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoZDNfbnVtZXJpYyhhID0gZDNfbnVtYmVyKGFycmF5W2ldKSkpIG51bWJlcnMucHVzaChhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmIChkM19udW1lcmljKGEgPSBkM19udW1iZXIoZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpKSkgbnVtYmVycy5wdXNoKGEpO1xuICAgIH1cbiAgICBpZiAobnVtYmVycy5sZW5ndGgpIHJldHVybiBkMy5xdWFudGlsZShudW1iZXJzLnNvcnQoZDNfYXNjZW5kaW5nKSwgLjUpO1xuICB9O1xuICBkMy52YXJpYW5jZSA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7XG4gICAgdmFyIG4gPSBhcnJheS5sZW5ndGgsIG0gPSAwLCBhLCBkLCBzID0gMCwgaSA9IC0xLCBqID0gMDtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgaWYgKGQzX251bWVyaWMoYSA9IGQzX251bWJlcihhcnJheVtpXSkpKSB7XG4gICAgICAgICAgZCA9IGEgLSBtO1xuICAgICAgICAgIG0gKz0gZCAvICsrajtcbiAgICAgICAgICBzICs9IGQgKiAoYSAtIG0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgIGlmIChkM19udW1lcmljKGEgPSBkM19udW1iZXIoZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpKSkge1xuICAgICAgICAgIGQgPSBhIC0gbTtcbiAgICAgICAgICBtICs9IGQgLyArK2o7XG4gICAgICAgICAgcyArPSBkICogKGEgLSBtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaiA+IDEpIHJldHVybiBzIC8gKGogLSAxKTtcbiAgfTtcbiAgZDMuZGV2aWF0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHYgPSBkMy52YXJpYW5jZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiB2ID8gTWF0aC5zcXJ0KHYpIDogdjtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfYmlzZWN0b3IoY29tcGFyZSkge1xuICAgIHJldHVybiB7XG4gICAgICBsZWZ0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBsbyA9IDA7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgNCkgaGkgPSBhLmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKGxvIDwgaGkpIHtcbiAgICAgICAgICB2YXIgbWlkID0gbG8gKyBoaSA+Pj4gMTtcbiAgICAgICAgICBpZiAoY29tcGFyZShhW21pZF0sIHgpIDwgMCkgbG8gPSBtaWQgKyAxOyBlbHNlIGhpID0gbWlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsbztcbiAgICAgIH0sXG4gICAgICByaWdodDogZnVuY3Rpb24oYSwgeCwgbG8sIGhpKSB7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgbG8gPSAwO1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDQpIGhpID0gYS5sZW5ndGg7XG4gICAgICAgIHdoaWxlIChsbyA8IGhpKSB7XG4gICAgICAgICAgdmFyIG1pZCA9IGxvICsgaGkgPj4+IDE7XG4gICAgICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA+IDApIGhpID0gbWlkOyBlbHNlIGxvID0gbWlkICsgMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbG87XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICB2YXIgZDNfYmlzZWN0ID0gZDNfYmlzZWN0b3IoZDNfYXNjZW5kaW5nKTtcbiAgZDMuYmlzZWN0TGVmdCA9IGQzX2Jpc2VjdC5sZWZ0O1xuICBkMy5iaXNlY3QgPSBkMy5iaXNlY3RSaWdodCA9IGQzX2Jpc2VjdC5yaWdodDtcbiAgZDMuYmlzZWN0b3IgPSBmdW5jdGlvbihmKSB7XG4gICAgcmV0dXJuIGQzX2Jpc2VjdG9yKGYubGVuZ3RoID09PSAxID8gZnVuY3Rpb24oZCwgeCkge1xuICAgICAgcmV0dXJuIGQzX2FzY2VuZGluZyhmKGQpLCB4KTtcbiAgICB9IDogZik7XG4gIH07XG4gIGQzLnNodWZmbGUgPSBmdW5jdGlvbihhcnJheSwgaTAsIGkxKSB7XG4gICAgaWYgKChtID0gYXJndW1lbnRzLmxlbmd0aCkgPCAzKSB7XG4gICAgICBpMSA9IGFycmF5Lmxlbmd0aDtcbiAgICAgIGlmIChtIDwgMikgaTAgPSAwO1xuICAgIH1cbiAgICB2YXIgbSA9IGkxIC0gaTAsIHQsIGk7XG4gICAgd2hpbGUgKG0pIHtcbiAgICAgIGkgPSBNYXRoLnJhbmRvbSgpICogbS0tIHwgMDtcbiAgICAgIHQgPSBhcnJheVttICsgaTBdLCBhcnJheVttICsgaTBdID0gYXJyYXlbaSArIGkwXSwgYXJyYXlbaSArIGkwXSA9IHQ7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbiAgfTtcbiAgZDMucGVybXV0ZSA9IGZ1bmN0aW9uKGFycmF5LCBpbmRleGVzKSB7XG4gICAgdmFyIGkgPSBpbmRleGVzLmxlbmd0aCwgcGVybXV0ZXMgPSBuZXcgQXJyYXkoaSk7XG4gICAgd2hpbGUgKGktLSkgcGVybXV0ZXNbaV0gPSBhcnJheVtpbmRleGVzW2ldXTtcbiAgICByZXR1cm4gcGVybXV0ZXM7XG4gIH07XG4gIGQzLnBhaXJzID0gZnVuY3Rpb24oYXJyYXkpIHtcbiAgICB2YXIgaSA9IDAsIG4gPSBhcnJheS5sZW5ndGggLSAxLCBwMCwgcDEgPSBhcnJheVswXSwgcGFpcnMgPSBuZXcgQXJyYXkobiA8IDAgPyAwIDogbik7XG4gICAgd2hpbGUgKGkgPCBuKSBwYWlyc1tpXSA9IFsgcDAgPSBwMSwgcDEgPSBhcnJheVsrK2ldIF07XG4gICAgcmV0dXJuIHBhaXJzO1xuICB9O1xuICBkMy50cmFuc3Bvc2UgPSBmdW5jdGlvbihtYXRyaXgpIHtcbiAgICBpZiAoIShuID0gbWF0cml4Lmxlbmd0aCkpIHJldHVybiBbXTtcbiAgICBmb3IgKHZhciBpID0gLTEsIG0gPSBkMy5taW4obWF0cml4LCBkM190cmFuc3Bvc2VMZW5ndGgpLCB0cmFuc3Bvc2UgPSBuZXcgQXJyYXkobSk7ICsraSA8IG07ICkge1xuICAgICAgZm9yICh2YXIgaiA9IC0xLCBuLCByb3cgPSB0cmFuc3Bvc2VbaV0gPSBuZXcgQXJyYXkobik7ICsraiA8IG47ICkge1xuICAgICAgICByb3dbal0gPSBtYXRyaXhbal1baV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cmFuc3Bvc2U7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3RyYW5zcG9zZUxlbmd0aChkKSB7XG4gICAgcmV0dXJuIGQubGVuZ3RoO1xuICB9XG4gIGQzLnppcCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkMy50cmFuc3Bvc2UoYXJndW1lbnRzKTtcbiAgfTtcbiAgZDMua2V5cyA9IGZ1bmN0aW9uKG1hcCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG1hcCkga2V5cy5wdXNoKGtleSk7XG4gICAgcmV0dXJuIGtleXM7XG4gIH07XG4gIGQzLnZhbHVlcyA9IGZ1bmN0aW9uKG1hcCkge1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gbWFwKSB2YWx1ZXMucHVzaChtYXBba2V5XSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfTtcbiAgZDMuZW50cmllcyA9IGZ1bmN0aW9uKG1hcCkge1xuICAgIHZhciBlbnRyaWVzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG1hcCkgZW50cmllcy5wdXNoKHtcbiAgICAgIGtleToga2V5LFxuICAgICAgdmFsdWU6IG1hcFtrZXldXG4gICAgfSk7XG4gICAgcmV0dXJuIGVudHJpZXM7XG4gIH07XG4gIGQzLm1lcmdlID0gZnVuY3Rpb24oYXJyYXlzKSB7XG4gICAgdmFyIG4gPSBhcnJheXMubGVuZ3RoLCBtLCBpID0gLTEsIGogPSAwLCBtZXJnZWQsIGFycmF5O1xuICAgIHdoaWxlICgrK2kgPCBuKSBqICs9IGFycmF5c1tpXS5sZW5ndGg7XG4gICAgbWVyZ2VkID0gbmV3IEFycmF5KGopO1xuICAgIHdoaWxlICgtLW4gPj0gMCkge1xuICAgICAgYXJyYXkgPSBhcnJheXNbbl07XG4gICAgICBtID0gYXJyYXkubGVuZ3RoO1xuICAgICAgd2hpbGUgKC0tbSA+PSAwKSB7XG4gICAgICAgIG1lcmdlZFstLWpdID0gYXJyYXlbbV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZXJnZWQ7XG4gIH07XG4gIHZhciBhYnMgPSBNYXRoLmFicztcbiAgZDMucmFuZ2UgPSBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykge1xuICAgICAgc3RlcCA9IDE7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgc3RvcCA9IHN0YXJ0O1xuICAgICAgICBzdGFydCA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICgoc3RvcCAtIHN0YXJ0KSAvIHN0ZXAgPT09IEluZmluaXR5KSB0aHJvdyBuZXcgRXJyb3IoXCJpbmZpbml0ZSByYW5nZVwiKTtcbiAgICB2YXIgcmFuZ2UgPSBbXSwgayA9IGQzX3JhbmdlX2ludGVnZXJTY2FsZShhYnMoc3RlcCkpLCBpID0gLTEsIGo7XG4gICAgc3RhcnQgKj0gaywgc3RvcCAqPSBrLCBzdGVwICo9IGs7XG4gICAgaWYgKHN0ZXAgPCAwKSB3aGlsZSAoKGogPSBzdGFydCArIHN0ZXAgKiArK2kpID4gc3RvcCkgcmFuZ2UucHVzaChqIC8gayk7IGVsc2Ugd2hpbGUgKChqID0gc3RhcnQgKyBzdGVwICogKytpKSA8IHN0b3ApIHJhbmdlLnB1c2goaiAvIGspO1xuICAgIHJldHVybiByYW5nZTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfcmFuZ2VfaW50ZWdlclNjYWxlKHgpIHtcbiAgICB2YXIgayA9IDE7XG4gICAgd2hpbGUgKHggKiBrICUgMSkgayAqPSAxMDtcbiAgICByZXR1cm4gaztcbiAgfVxuICBmdW5jdGlvbiBkM19jbGFzcyhjdG9yLCBwcm9wZXJ0aWVzKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHByb3BlcnRpZXMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdG9yLnByb3RvdHlwZSwga2V5LCB7XG4gICAgICAgIHZhbHVlOiBwcm9wZXJ0aWVzW2tleV0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgZDMubWFwID0gZnVuY3Rpb24ob2JqZWN0LCBmKSB7XG4gICAgdmFyIG1hcCA9IG5ldyBkM19NYXAoKTtcbiAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgZDNfTWFwKSB7XG4gICAgICBvYmplY3QuZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgICAgIG1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkge1xuICAgICAgdmFyIGkgPSAtMSwgbiA9IG9iamVjdC5sZW5ndGgsIG87XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgd2hpbGUgKCsraSA8IG4pIG1hcC5zZXQoaSwgb2JqZWN0W2ldKTsgZWxzZSB3aGlsZSAoKytpIDwgbikgbWFwLnNldChmLmNhbGwob2JqZWN0LCBvID0gb2JqZWN0W2ldLCBpKSwgbyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIG1hcC5zZXQoa2V5LCBvYmplY3Rba2V5XSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX01hcCgpIHtcbiAgICB0aGlzLl8gPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG4gIHZhciBkM19tYXBfcHJvdG8gPSBcIl9fcHJvdG9fX1wiLCBkM19tYXBfemVybyA9IFwiXFx4MDBcIjtcbiAgZDNfY2xhc3MoZDNfTWFwLCB7XG4gICAgaGFzOiBkM19tYXBfaGFzLFxuICAgIGdldDogZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fW2QzX21hcF9lc2NhcGUoa2V5KV07XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9bZDNfbWFwX2VzY2FwZShrZXkpXSA9IHZhbHVlO1xuICAgIH0sXG4gICAgcmVtb3ZlOiBkM19tYXBfcmVtb3ZlLFxuICAgIGtleXM6IGQzX21hcF9rZXlzLFxuICAgIHZhbHVlczogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fKSB2YWx1ZXMucHVzaCh0aGlzLl9ba2V5XSk7XG4gICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH0sXG4gICAgZW50cmllczogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZW50cmllcyA9IFtdO1xuICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuXykgZW50cmllcy5wdXNoKHtcbiAgICAgICAga2V5OiBkM19tYXBfdW5lc2NhcGUoa2V5KSxcbiAgICAgICAgdmFsdWU6IHRoaXMuX1trZXldXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBlbnRyaWVzO1xuICAgIH0sXG4gICAgc2l6ZTogZDNfbWFwX3NpemUsXG4gICAgZW1wdHk6IGQzX21hcF9lbXB0eSxcbiAgICBmb3JFYWNoOiBmdW5jdGlvbihmKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fKSBmLmNhbGwodGhpcywgZDNfbWFwX3VuZXNjYXBlKGtleSksIHRoaXMuX1trZXldKTtcbiAgICB9XG4gIH0pO1xuICBmdW5jdGlvbiBkM19tYXBfZXNjYXBlKGtleSkge1xuICAgIHJldHVybiAoa2V5ICs9IFwiXCIpID09PSBkM19tYXBfcHJvdG8gfHwga2V5WzBdID09PSBkM19tYXBfemVybyA/IGQzX21hcF96ZXJvICsga2V5IDoga2V5O1xuICB9XG4gIGZ1bmN0aW9uIGQzX21hcF91bmVzY2FwZShrZXkpIHtcbiAgICByZXR1cm4gKGtleSArPSBcIlwiKVswXSA9PT0gZDNfbWFwX3plcm8gPyBrZXkuc2xpY2UoMSkgOiBrZXk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbWFwX2hhcyhrZXkpIHtcbiAgICByZXR1cm4gZDNfbWFwX2VzY2FwZShrZXkpIGluIHRoaXMuXztcbiAgfVxuICBmdW5jdGlvbiBkM19tYXBfcmVtb3ZlKGtleSkge1xuICAgIHJldHVybiAoa2V5ID0gZDNfbWFwX2VzY2FwZShrZXkpKSBpbiB0aGlzLl8gJiYgZGVsZXRlIHRoaXMuX1trZXldO1xuICB9XG4gIGZ1bmN0aW9uIGQzX21hcF9rZXlzKCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuXykga2V5cy5wdXNoKGQzX21hcF91bmVzY2FwZShrZXkpKTtcbiAgICByZXR1cm4ga2V5cztcbiAgfVxuICBmdW5jdGlvbiBkM19tYXBfc2l6ZSgpIHtcbiAgICB2YXIgc2l6ZSA9IDA7XG4gICAgZm9yICh2YXIga2V5IGluIHRoaXMuXykgKytzaXplO1xuICAgIHJldHVybiBzaXplO1xuICB9XG4gIGZ1bmN0aW9uIGQzX21hcF9lbXB0eSgpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZDMubmVzdCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBuZXN0ID0ge30sIGtleXMgPSBbXSwgc29ydEtleXMgPSBbXSwgc29ydFZhbHVlcywgcm9sbHVwO1xuICAgIGZ1bmN0aW9uIG1hcChtYXBUeXBlLCBhcnJheSwgZGVwdGgpIHtcbiAgICAgIGlmIChkZXB0aCA+PSBrZXlzLmxlbmd0aCkgcmV0dXJuIHJvbGx1cCA/IHJvbGx1cC5jYWxsKG5lc3QsIGFycmF5KSA6IHNvcnRWYWx1ZXMgPyBhcnJheS5zb3J0KHNvcnRWYWx1ZXMpIDogYXJyYXk7XG4gICAgICB2YXIgaSA9IC0xLCBuID0gYXJyYXkubGVuZ3RoLCBrZXkgPSBrZXlzW2RlcHRoKytdLCBrZXlWYWx1ZSwgb2JqZWN0LCBzZXR0ZXIsIHZhbHVlc0J5S2V5ID0gbmV3IGQzX01hcCgpLCB2YWx1ZXM7XG4gICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICBpZiAodmFsdWVzID0gdmFsdWVzQnlLZXkuZ2V0KGtleVZhbHVlID0ga2V5KG9iamVjdCA9IGFycmF5W2ldKSkpIHtcbiAgICAgICAgICB2YWx1ZXMucHVzaChvYmplY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlc0J5S2V5LnNldChrZXlWYWx1ZSwgWyBvYmplY3QgXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtYXBUeXBlKSB7XG4gICAgICAgIG9iamVjdCA9IG1hcFR5cGUoKTtcbiAgICAgICAgc2V0dGVyID0gZnVuY3Rpb24oa2V5VmFsdWUsIHZhbHVlcykge1xuICAgICAgICAgIG9iamVjdC5zZXQoa2V5VmFsdWUsIG1hcChtYXBUeXBlLCB2YWx1ZXMsIGRlcHRoKSk7XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYmplY3QgPSB7fTtcbiAgICAgICAgc2V0dGVyID0gZnVuY3Rpb24oa2V5VmFsdWUsIHZhbHVlcykge1xuICAgICAgICAgIG9iamVjdFtrZXlWYWx1ZV0gPSBtYXAobWFwVHlwZSwgdmFsdWVzLCBkZXB0aCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICB2YWx1ZXNCeUtleS5mb3JFYWNoKHNldHRlcik7XG4gICAgICByZXR1cm4gb2JqZWN0O1xuICAgIH1cbiAgICBmdW5jdGlvbiBlbnRyaWVzKG1hcCwgZGVwdGgpIHtcbiAgICAgIGlmIChkZXB0aCA+PSBrZXlzLmxlbmd0aCkgcmV0dXJuIG1hcDtcbiAgICAgIHZhciBhcnJheSA9IFtdLCBzb3J0S2V5ID0gc29ydEtleXNbZGVwdGgrK107XG4gICAgICBtYXAuZm9yRWFjaChmdW5jdGlvbihrZXksIGtleU1hcCkge1xuICAgICAgICBhcnJheS5wdXNoKHtcbiAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICB2YWx1ZXM6IGVudHJpZXMoa2V5TWFwLCBkZXB0aClcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzb3J0S2V5ID8gYXJyYXkuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgIHJldHVybiBzb3J0S2V5KGEua2V5LCBiLmtleSk7XG4gICAgICB9KSA6IGFycmF5O1xuICAgIH1cbiAgICBuZXN0Lm1hcCA9IGZ1bmN0aW9uKGFycmF5LCBtYXBUeXBlKSB7XG4gICAgICByZXR1cm4gbWFwKG1hcFR5cGUsIGFycmF5LCAwKTtcbiAgICB9O1xuICAgIG5lc3QuZW50cmllcyA9IGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgICByZXR1cm4gZW50cmllcyhtYXAoZDMubWFwLCBhcnJheSwgMCksIDApO1xuICAgIH07XG4gICAgbmVzdC5rZXkgPSBmdW5jdGlvbihkKSB7XG4gICAgICBrZXlzLnB1c2goZCk7XG4gICAgICByZXR1cm4gbmVzdDtcbiAgICB9O1xuICAgIG5lc3Quc29ydEtleXMgPSBmdW5jdGlvbihvcmRlcikge1xuICAgICAgc29ydEtleXNba2V5cy5sZW5ndGggLSAxXSA9IG9yZGVyO1xuICAgICAgcmV0dXJuIG5lc3Q7XG4gICAgfTtcbiAgICBuZXN0LnNvcnRWYWx1ZXMgPSBmdW5jdGlvbihvcmRlcikge1xuICAgICAgc29ydFZhbHVlcyA9IG9yZGVyO1xuICAgICAgcmV0dXJuIG5lc3Q7XG4gICAgfTtcbiAgICBuZXN0LnJvbGx1cCA9IGZ1bmN0aW9uKGYpIHtcbiAgICAgIHJvbGx1cCA9IGY7XG4gICAgICByZXR1cm4gbmVzdDtcbiAgICB9O1xuICAgIHJldHVybiBuZXN0O1xuICB9O1xuICBkMy5zZXQgPSBmdW5jdGlvbihhcnJheSkge1xuICAgIHZhciBzZXQgPSBuZXcgZDNfU2V0KCk7XG4gICAgaWYgKGFycmF5KSBmb3IgKHZhciBpID0gMCwgbiA9IGFycmF5Lmxlbmd0aDsgaSA8IG47ICsraSkgc2V0LmFkZChhcnJheVtpXSk7XG4gICAgcmV0dXJuIHNldDtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfU2V0KCkge1xuICAgIHRoaXMuXyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cbiAgZDNfY2xhc3MoZDNfU2V0LCB7XG4gICAgaGFzOiBkM19tYXBfaGFzLFxuICAgIGFkZDogZnVuY3Rpb24oa2V5KSB7XG4gICAgICB0aGlzLl9bZDNfbWFwX2VzY2FwZShrZXkgKz0gXCJcIildID0gdHJ1ZTtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfSxcbiAgICByZW1vdmU6IGQzX21hcF9yZW1vdmUsXG4gICAgdmFsdWVzOiBkM19tYXBfa2V5cyxcbiAgICBzaXplOiBkM19tYXBfc2l6ZSxcbiAgICBlbXB0eTogZDNfbWFwX2VtcHR5LFxuICAgIGZvckVhY2g6IGZ1bmN0aW9uKGYpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl8pIGYuY2FsbCh0aGlzLCBkM19tYXBfdW5lc2NhcGUoa2V5KSk7XG4gICAgfVxuICB9KTtcbiAgZDMuYmVoYXZpb3IgPSB7fTtcbiAgZnVuY3Rpb24gZDNfaWRlbnRpdHkoZCkge1xuICAgIHJldHVybiBkO1xuICB9XG4gIGQzLnJlYmluZCA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7XG4gICAgdmFyIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgbWV0aG9kO1xuICAgIHdoaWxlICgrK2kgPCBuKSB0YXJnZXRbbWV0aG9kID0gYXJndW1lbnRzW2ldXSA9IGQzX3JlYmluZCh0YXJnZXQsIHNvdXJjZSwgc291cmNlW21ldGhvZF0pO1xuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3JlYmluZCh0YXJnZXQsIHNvdXJjZSwgbWV0aG9kKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHZhbHVlID0gbWV0aG9kLmFwcGx5KHNvdXJjZSwgYXJndW1lbnRzKTtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gc291cmNlID8gdGFyZ2V0IDogdmFsdWU7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkM192ZW5kb3JTeW1ib2wob2JqZWN0LCBuYW1lKSB7XG4gICAgaWYgKG5hbWUgaW4gb2JqZWN0KSByZXR1cm4gbmFtZTtcbiAgICBuYW1lID0gbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7XG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSBkM192ZW5kb3JQcmVmaXhlcy5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIHZhciBwcmVmaXhOYW1lID0gZDNfdmVuZG9yUHJlZml4ZXNbaV0gKyBuYW1lO1xuICAgICAgaWYgKHByZWZpeE5hbWUgaW4gb2JqZWN0KSByZXR1cm4gcHJlZml4TmFtZTtcbiAgICB9XG4gIH1cbiAgdmFyIGQzX3ZlbmRvclByZWZpeGVzID0gWyBcIndlYmtpdFwiLCBcIm1zXCIsIFwibW96XCIsIFwiTW96XCIsIFwib1wiLCBcIk9cIiBdO1xuICBmdW5jdGlvbiBkM19ub29wKCkge31cbiAgZDMuZGlzcGF0Y2ggPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZGlzcGF0Y2ggPSBuZXcgZDNfZGlzcGF0Y2goKSwgaSA9IC0xLCBuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgZGlzcGF0Y2hbYXJndW1lbnRzW2ldXSA9IGQzX2Rpc3BhdGNoX2V2ZW50KGRpc3BhdGNoKTtcbiAgICByZXR1cm4gZGlzcGF0Y2g7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2Rpc3BhdGNoKCkge31cbiAgZDNfZGlzcGF0Y2gucHJvdG90eXBlLm9uID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgICB2YXIgaSA9IHR5cGUuaW5kZXhPZihcIi5cIiksIG5hbWUgPSBcIlwiO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgIG5hbWUgPSB0eXBlLnNsaWNlKGkgKyAxKTtcbiAgICAgIHR5cGUgPSB0eXBlLnNsaWNlKDAsIGkpO1xuICAgIH1cbiAgICBpZiAodHlwZSkgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gdGhpc1t0eXBlXS5vbihuYW1lKSA6IHRoaXNbdHlwZV0ub24obmFtZSwgbGlzdGVuZXIpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICBpZiAobGlzdGVuZXIgPT0gbnVsbCkgZm9yICh0eXBlIGluIHRoaXMpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkodHlwZSkpIHRoaXNbdHlwZV0ub24obmFtZSwgbnVsbCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2Rpc3BhdGNoX2V2ZW50KGRpc3BhdGNoKSB7XG4gICAgdmFyIGxpc3RlbmVycyA9IFtdLCBsaXN0ZW5lckJ5TmFtZSA9IG5ldyBkM19NYXAoKTtcbiAgICBmdW5jdGlvbiBldmVudCgpIHtcbiAgICAgIHZhciB6ID0gbGlzdGVuZXJzLCBpID0gLTEsIG4gPSB6Lmxlbmd0aCwgbDtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAobCA9IHpbaV0ub24pIGwuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIHJldHVybiBkaXNwYXRjaDtcbiAgICB9XG4gICAgZXZlbnQub24gPSBmdW5jdGlvbihuYW1lLCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGwgPSBsaXN0ZW5lckJ5TmFtZS5nZXQobmFtZSksIGk7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiBsICYmIGwub247XG4gICAgICBpZiAobCkge1xuICAgICAgICBsLm9uID0gbnVsbDtcbiAgICAgICAgbGlzdGVuZXJzID0gbGlzdGVuZXJzLnNsaWNlKDAsIGkgPSBsaXN0ZW5lcnMuaW5kZXhPZihsKSkuY29uY2F0KGxpc3RlbmVycy5zbGljZShpICsgMSkpO1xuICAgICAgICBsaXN0ZW5lckJ5TmFtZS5yZW1vdmUobmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAobGlzdGVuZXIpIGxpc3RlbmVycy5wdXNoKGxpc3RlbmVyQnlOYW1lLnNldChuYW1lLCB7XG4gICAgICAgIG9uOiBsaXN0ZW5lclxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuIGRpc3BhdGNoO1xuICAgIH07XG4gICAgcmV0dXJuIGV2ZW50O1xuICB9XG4gIGQzLmV2ZW50ID0gbnVsbDtcbiAgZnVuY3Rpb24gZDNfZXZlbnRQcmV2ZW50RGVmYXVsdCgpIHtcbiAgICBkMy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2V2ZW50U291cmNlKCkge1xuICAgIHZhciBlID0gZDMuZXZlbnQsIHM7XG4gICAgd2hpbGUgKHMgPSBlLnNvdXJjZUV2ZW50KSBlID0gcztcbiAgICByZXR1cm4gZTtcbiAgfVxuICBmdW5jdGlvbiBkM19ldmVudERpc3BhdGNoKHRhcmdldCkge1xuICAgIHZhciBkaXNwYXRjaCA9IG5ldyBkM19kaXNwYXRjaCgpLCBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIGRpc3BhdGNoW2FyZ3VtZW50c1tpXV0gPSBkM19kaXNwYXRjaF9ldmVudChkaXNwYXRjaCk7XG4gICAgZGlzcGF0Y2gub2YgPSBmdW5jdGlvbih0aGl6LCBhcmd1bWVudHopIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihlMSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBlMCA9IGUxLnNvdXJjZUV2ZW50ID0gZDMuZXZlbnQ7XG4gICAgICAgICAgZTEudGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICAgIGQzLmV2ZW50ID0gZTE7XG4gICAgICAgICAgZGlzcGF0Y2hbZTEudHlwZV0uYXBwbHkodGhpeiwgYXJndW1lbnR6KTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBkMy5ldmVudCA9IGUwO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgcmV0dXJuIGRpc3BhdGNoO1xuICB9XG4gIGQzLnJlcXVvdGUgPSBmdW5jdGlvbihzKSB7XG4gICAgcmV0dXJuIHMucmVwbGFjZShkM19yZXF1b3RlX3JlLCBcIlxcXFwkJlwiKTtcbiAgfTtcbiAgdmFyIGQzX3JlcXVvdGVfcmUgPSAvW1xcXFxcXF5cXCRcXCpcXCtcXD9cXHxcXFtcXF1cXChcXClcXC5cXHtcXH1dL2c7XG4gIHZhciBkM19zdWJjbGFzcyA9IHt9Ll9fcHJvdG9fXyA/IGZ1bmN0aW9uKG9iamVjdCwgcHJvdG90eXBlKSB7XG4gICAgb2JqZWN0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTtcbiAgfSA6IGZ1bmN0aW9uKG9iamVjdCwgcHJvdG90eXBlKSB7XG4gICAgZm9yICh2YXIgcHJvcGVydHkgaW4gcHJvdG90eXBlKSBvYmplY3RbcHJvcGVydHldID0gcHJvdG90eXBlW3Byb3BlcnR5XTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uKGdyb3Vwcykge1xuICAgIGQzX3N1YmNsYXNzKGdyb3VwcywgZDNfc2VsZWN0aW9uUHJvdG90eXBlKTtcbiAgICByZXR1cm4gZ3JvdXBzO1xuICB9XG4gIHZhciBkM19zZWxlY3QgPSBmdW5jdGlvbihzLCBuKSB7XG4gICAgcmV0dXJuIG4ucXVlcnlTZWxlY3RvcihzKTtcbiAgfSwgZDNfc2VsZWN0QWxsID0gZnVuY3Rpb24ocywgbikge1xuICAgIHJldHVybiBuLnF1ZXJ5U2VsZWN0b3JBbGwocyk7XG4gIH0sIGQzX3NlbGVjdE1hdGNoZXMgPSBmdW5jdGlvbihuLCBzKSB7XG4gICAgdmFyIGQzX3NlbGVjdE1hdGNoZXIgPSBuLm1hdGNoZXMgfHwgbltkM192ZW5kb3JTeW1ib2wobiwgXCJtYXRjaGVzU2VsZWN0b3JcIildO1xuICAgIGQzX3NlbGVjdE1hdGNoZXMgPSBmdW5jdGlvbihuLCBzKSB7XG4gICAgICByZXR1cm4gZDNfc2VsZWN0TWF0Y2hlci5jYWxsKG4sIHMpO1xuICAgIH07XG4gICAgcmV0dXJuIGQzX3NlbGVjdE1hdGNoZXMobiwgcyk7XG4gIH07XG4gIGlmICh0eXBlb2YgU2l6emxlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBkM19zZWxlY3QgPSBmdW5jdGlvbihzLCBuKSB7XG4gICAgICByZXR1cm4gU2l6emxlKHMsIG4pWzBdIHx8IG51bGw7XG4gICAgfTtcbiAgICBkM19zZWxlY3RBbGwgPSBTaXp6bGU7XG4gICAgZDNfc2VsZWN0TWF0Y2hlcyA9IFNpenpsZS5tYXRjaGVzU2VsZWN0b3I7XG4gIH1cbiAgZDMuc2VsZWN0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzLnNlbGVjdChkM19kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICB9O1xuICB2YXIgZDNfc2VsZWN0aW9uUHJvdG90eXBlID0gZDMuc2VsZWN0aW9uLnByb3RvdHlwZSA9IFtdO1xuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgICB2YXIgc3ViZ3JvdXBzID0gW10sIHN1Ymdyb3VwLCBzdWJub2RlLCBncm91cCwgbm9kZTtcbiAgICBzZWxlY3RvciA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07ICkge1xuICAgICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7XG4gICAgICBzdWJncm91cC5wYXJlbnROb2RlID0gKGdyb3VwID0gdGhpc1tqXSkucGFyZW50Tm9kZTtcbiAgICAgIGZvciAodmFyIGkgPSAtMSwgbiA9IGdyb3VwLmxlbmd0aDsgKytpIDwgbjsgKSB7XG4gICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgICBzdWJncm91cC5wdXNoKHN1Ym5vZGUgPSBzZWxlY3Rvci5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGopKTtcbiAgICAgICAgICBpZiAoc3Vibm9kZSAmJiBcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3ViZ3JvdXAucHVzaChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZDNfc2VsZWN0aW9uKHN1Ymdyb3Vwcyk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9zZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIHJldHVybiB0eXBlb2Ygc2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIiA/IHNlbGVjdG9yIDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZDNfc2VsZWN0KHNlbGVjdG9yLCB0aGlzKTtcbiAgICB9O1xuICB9XG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5zZWxlY3RBbGwgPSBmdW5jdGlvbihzZWxlY3Rvcikge1xuICAgIHZhciBzdWJncm91cHMgPSBbXSwgc3ViZ3JvdXAsIG5vZGU7XG4gICAgc2VsZWN0b3IgPSBkM19zZWxlY3Rpb25fc2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOyApIHtcbiAgICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOyApIHtcbiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gZDNfYXJyYXkoc2VsZWN0b3IuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKSkpO1xuICAgICAgICAgIHN1Ymdyb3VwLnBhcmVudE5vZGUgPSBub2RlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkM19zZWxlY3Rpb24oc3ViZ3JvdXBzKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX3NlbGVjdG9yQWxsKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiID8gc2VsZWN0b3IgOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBkM19zZWxlY3RBbGwoc2VsZWN0b3IsIHRoaXMpO1xuICAgIH07XG4gIH1cbiAgdmFyIGQzX25zWGh0bWwgPSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIjtcbiAgdmFyIGQzX25zUHJlZml4ID0ge1xuICAgIHN2ZzogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHhodG1sOiBkM19uc1hodG1sLFxuICAgIHhsaW5rOiBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIixcbiAgICB4bWw6IFwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlXCIsXG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy9cIlxuICB9O1xuICBkMy5ucyA9IHtcbiAgICBwcmVmaXg6IGQzX25zUHJlZml4LFxuICAgIHF1YWxpZnk6IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIHZhciBpID0gbmFtZS5pbmRleE9mKFwiOlwiKSwgcHJlZml4ID0gbmFtZTtcbiAgICAgIGlmIChpID49IDAgJiYgKHByZWZpeCA9IG5hbWUuc2xpY2UoMCwgaSkpICE9PSBcInhtbG5zXCIpIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKTtcbiAgICAgIHJldHVybiBkM19uc1ByZWZpeC5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpID8ge1xuICAgICAgICBzcGFjZTogZDNfbnNQcmVmaXhbcHJlZml4XSxcbiAgICAgICAgbG9jYWw6IG5hbWVcbiAgICAgIH0gOiBuYW1lO1xuICAgIH1cbiAgfTtcbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLmF0dHIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7XG4gICAgICAgIG5hbWUgPSBkMy5ucy5xdWFsaWZ5KG5hbWUpO1xuICAgICAgICByZXR1cm4gbmFtZS5sb2NhbCA/IG5vZGUuZ2V0QXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCkgOiBub2RlLmdldEF0dHJpYnV0ZShuYW1lKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFsdWUgaW4gbmFtZSkgdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9hdHRyKHZhbHVlLCBuYW1lW3ZhbHVlXSkpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVhY2goZDNfc2VsZWN0aW9uX2F0dHIobmFtZSwgdmFsdWUpKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2F0dHIobmFtZSwgdmFsdWUpIHtcbiAgICBuYW1lID0gZDMubnMucXVhbGlmeShuYW1lKTtcbiAgICBmdW5jdGlvbiBhdHRyTnVsbCgpIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhdHRyTnVsbE5TKCkge1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYXR0ckNvbnN0YW50KCkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhdHRyQ29uc3RhbnROUygpIHtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCwgdmFsdWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhdHRyRnVuY3Rpb24oKSB7XG4gICAgICB2YXIgeCA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBpZiAoeCA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB4KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMoKSB7XG4gICAgICB2YXIgeCA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBpZiAoeCA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpOyBlbHNlIHRoaXMuc2V0QXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCwgeCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gbmFtZS5sb2NhbCA/IGF0dHJOdWxsTlMgOiBhdHRyTnVsbCA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TIDogYXR0ckZ1bmN0aW9uIDogbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2NvbGxhcHNlKHMpIHtcbiAgICByZXR1cm4gcy50cmltKCkucmVwbGFjZSgvXFxzKy9nLCBcIiBcIik7XG4gIH1cbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLmNsYXNzZWQgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCksIG4gPSAobmFtZSA9IGQzX3NlbGVjdGlvbl9jbGFzc2VzKG5hbWUpKS5sZW5ndGgsIGkgPSAtMTtcbiAgICAgICAgaWYgKHZhbHVlID0gbm9kZS5jbGFzc0xpc3QpIHtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCF2YWx1ZS5jb250YWlucyhuYW1lW2ldKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKTtcbiAgICAgICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFkM19zZWxlY3Rpb25fY2xhc3NlZFJlKG5hbWVbaV0pLnRlc3QodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKHZhbHVlIGluIG5hbWUpIHRoaXMuZWFjaChkM19zZWxlY3Rpb25fY2xhc3NlZCh2YWx1ZSwgbmFtZVt2YWx1ZV0pKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9jbGFzc2VkKG5hbWUsIHZhbHVlKSk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9jbGFzc2VkUmUobmFtZSkge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKFwiKD86XnxcXFxccyspXCIgKyBkMy5yZXF1b3RlKG5hbWUpICsgXCIoPzpcXFxccyt8JClcIiwgXCJnXCIpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9jbGFzc2VzKG5hbWUpIHtcbiAgICByZXR1cm4gKG5hbWUgKyBcIlwiKS50cmltKCkuc3BsaXQoL158XFxzKy8pO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9jbGFzc2VkKG5hbWUsIHZhbHVlKSB7XG4gICAgbmFtZSA9IGQzX3NlbGVjdGlvbl9jbGFzc2VzKG5hbWUpLm1hcChkM19zZWxlY3Rpb25fY2xhc3NlZE5hbWUpO1xuICAgIHZhciBuID0gbmFtZS5sZW5ndGg7XG4gICAgZnVuY3Rpb24gY2xhc3NlZENvbnN0YW50KCkge1xuICAgICAgdmFyIGkgPSAtMTtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBuYW1lW2ldKHRoaXMsIHZhbHVlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xhc3NlZEZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGkgPSAtMSwgeCA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB3aGlsZSAoKytpIDwgbikgbmFtZVtpXSh0aGlzLCB4KTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gY2xhc3NlZEZ1bmN0aW9uIDogY2xhc3NlZENvbnN0YW50O1xuICB9XG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9jbGFzc2VkTmFtZShuYW1lKSB7XG4gICAgdmFyIHJlID0gZDNfc2VsZWN0aW9uX2NsYXNzZWRSZShuYW1lKTtcbiAgICByZXR1cm4gZnVuY3Rpb24obm9kZSwgdmFsdWUpIHtcbiAgICAgIGlmIChjID0gbm9kZS5jbGFzc0xpc3QpIHJldHVybiB2YWx1ZSA/IGMuYWRkKG5hbWUpIDogYy5yZW1vdmUobmFtZSk7XG4gICAgICB2YXIgYyA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIjtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICByZS5sYXN0SW5kZXggPSAwO1xuICAgICAgICBpZiAoIXJlLnRlc3QoYykpIG5vZGUuc2V0QXR0cmlidXRlKFwiY2xhc3NcIiwgZDNfY29sbGFwc2UoYyArIFwiIFwiICsgbmFtZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBkM19jb2xsYXBzZShjLnJlcGxhY2UocmUsIFwiIFwiKSkpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLnN0eWxlID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGlmIChuIDwgMykge1xuICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGlmIChuIDwgMikgdmFsdWUgPSBcIlwiO1xuICAgICAgICBmb3IgKHByaW9yaXR5IGluIG5hbWUpIHRoaXMuZWFjaChkM19zZWxlY3Rpb25fc3R5bGUocHJpb3JpdHksIG5hbWVbcHJpb3JpdHldLCB2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmIChuIDwgMikge1xuICAgICAgICB2YXIgbm9kZSA9IHRoaXMubm9kZSgpO1xuICAgICAgICByZXR1cm4gZDNfd2luZG93KG5vZGUpLmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTtcbiAgICAgIH1cbiAgICAgIHByaW9yaXR5ID0gXCJcIjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZWFjaChkM19zZWxlY3Rpb25fc3R5bGUobmFtZSwgdmFsdWUsIHByaW9yaXR5KSk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9zdHlsZShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgICBmdW5jdGlvbiBzdHlsZU51bGwoKSB7XG4gICAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdHlsZUNvbnN0YW50KCkge1xuICAgICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHggPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgaWYgKHggPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsgZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHgsIHByaW9yaXR5KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBzdHlsZU51bGwgOiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHN0eWxlRnVuY3Rpb24gOiBzdHlsZUNvbnN0YW50O1xuICB9XG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5wcm9wZXJ0eSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3RyaW5nXCIpIHJldHVybiB0aGlzLm5vZGUoKVtuYW1lXTtcbiAgICAgIGZvciAodmFsdWUgaW4gbmFtZSkgdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9wcm9wZXJ0eSh2YWx1ZSwgbmFtZVt2YWx1ZV0pKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9wcm9wZXJ0eShuYW1lLCB2YWx1ZSkpO1xuICB9O1xuICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fcHJvcGVydHkobmFtZSwgdmFsdWUpIHtcbiAgICBmdW5jdGlvbiBwcm9wZXJ0eU51bGwoKSB7XG4gICAgICBkZWxldGUgdGhpc1tuYW1lXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJvcGVydHlDb25zdGFudCgpIHtcbiAgICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcHJvcGVydHlGdW5jdGlvbigpIHtcbiAgICAgIHZhciB4ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIGlmICh4ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdOyBlbHNlIHRoaXNbbmFtZV0gPSB4O1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHByb3BlcnR5TnVsbCA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gcHJvcGVydHlGdW5jdGlvbiA6IHByb3BlcnR5Q29uc3RhbnQ7XG4gIH1cbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLnRleHQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdGhpcy5lYWNoKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB0aGlzLnRleHRDb250ZW50ID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XG4gICAgfSA6IHZhbHVlID09IG51bGwgPyBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMudGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIH0gOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcbiAgICB9KSA6IHRoaXMubm9kZSgpLnRleHRDb250ZW50O1xuICB9O1xuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuaHRtbCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLmVhY2godHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIHRoaXMuaW5uZXJIVE1MID0gdiA9PSBudWxsID8gXCJcIiA6IHY7XG4gICAgfSA6IHZhbHVlID09IG51bGwgPyBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuaW5uZXJIVE1MID0gXCJcIjtcbiAgICB9IDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmlubmVySFRNTCA9IHZhbHVlO1xuICAgIH0pIDogdGhpcy5ub2RlKCkuaW5uZXJIVE1MO1xuICB9O1xuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuYXBwZW5kID0gZnVuY3Rpb24obmFtZSkge1xuICAgIG5hbWUgPSBkM19zZWxlY3Rpb25fY3JlYXRvcihuYW1lKTtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChuYW1lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgIH0pO1xuICB9O1xuICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fY3JlYXRvcihuYW1lKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgdmFyIGRvY3VtZW50ID0gdGhpcy5vd25lckRvY3VtZW50LCBuYW1lc3BhY2UgPSB0aGlzLm5hbWVzcGFjZVVSSTtcbiAgICAgIHJldHVybiBuYW1lc3BhY2UgPT09IGQzX25zWGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0gZDNfbnNYaHRtbCA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSkgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlLCBuYW1lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlTlMoKSB7XG4gICAgICByZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lIDogKG5hbWUgPSBkMy5ucy5xdWFsaWZ5KG5hbWUpKS5sb2NhbCA/IGNyZWF0ZU5TIDogY3JlYXRlO1xuICB9XG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbihuYW1lLCBiZWZvcmUpIHtcbiAgICBuYW1lID0gZDNfc2VsZWN0aW9uX2NyZWF0b3IobmFtZSk7XG4gICAgYmVmb3JlID0gZDNfc2VsZWN0aW9uX3NlbGVjdG9yKGJlZm9yZSk7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKG5hbWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgYmVmb3JlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgbnVsbCk7XG4gICAgfSk7XG4gIH07XG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGQzX3NlbGVjdGlvblJlbW92ZSk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvblJlbW92ZSgpIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlO1xuICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgfVxuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuZGF0YSA9IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICB2YXIgaSA9IC0xLCBuID0gdGhpcy5sZW5ndGgsIGdyb3VwLCBub2RlO1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgdmFsdWUgPSBuZXcgQXJyYXkobiA9IChncm91cCA9IHRoaXNbMF0pLmxlbmd0aCk7XG4gICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgICAgdmFsdWVbaV0gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGJpbmQoZ3JvdXAsIGdyb3VwRGF0YSkge1xuICAgICAgdmFyIGksIG4gPSBncm91cC5sZW5ndGgsIG0gPSBncm91cERhdGEubGVuZ3RoLCBuMCA9IE1hdGgubWluKG4sIG0pLCB1cGRhdGVOb2RlcyA9IG5ldyBBcnJheShtKSwgZW50ZXJOb2RlcyA9IG5ldyBBcnJheShtKSwgZXhpdE5vZGVzID0gbmV3IEFycmF5KG4pLCBub2RlLCBub2RlRGF0YTtcbiAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgdmFyIG5vZGVCeUtleVZhbHVlID0gbmV3IGQzX01hcCgpLCBrZXlWYWx1ZXMgPSBuZXcgQXJyYXkobiksIGtleVZhbHVlO1xuICAgICAgICBmb3IgKGkgPSAtMTsgKytpIDwgbjsgKSB7XG4gICAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICAgICAgaWYgKG5vZGVCeUtleVZhbHVlLmhhcyhrZXlWYWx1ZSA9IGtleS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGkpKSkge1xuICAgICAgICAgICAgICBleGl0Tm9kZXNbaV0gPSBub2RlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbm9kZUJ5S2V5VmFsdWUuc2V0KGtleVZhbHVlLCBub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtleVZhbHVlc1tpXSA9IGtleVZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAtMTsgKytpIDwgbTsgKSB7XG4gICAgICAgICAgaWYgKCEobm9kZSA9IG5vZGVCeUtleVZhbHVlLmdldChrZXlWYWx1ZSA9IGtleS5jYWxsKGdyb3VwRGF0YSwgbm9kZURhdGEgPSBncm91cERhdGFbaV0sIGkpKSkpIHtcbiAgICAgICAgICAgIGVudGVyTm9kZXNbaV0gPSBkM19zZWxlY3Rpb25fZGF0YU5vZGUobm9kZURhdGEpO1xuICAgICAgICAgIH0gZWxzZSBpZiAobm9kZSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgdXBkYXRlTm9kZXNbaV0gPSBub2RlO1xuICAgICAgICAgICAgbm9kZS5fX2RhdGFfXyA9IG5vZGVEYXRhO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2RlQnlLZXlWYWx1ZS5zZXQoa2V5VmFsdWUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IC0xOyArK2kgPCBuOyApIHtcbiAgICAgICAgICBpZiAoaSBpbiBrZXlWYWx1ZXMgJiYgbm9kZUJ5S2V5VmFsdWUuZ2V0KGtleVZhbHVlc1tpXSkgIT09IHRydWUpIHtcbiAgICAgICAgICAgIGV4aXROb2Rlc1tpXSA9IGdyb3VwW2ldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChpID0gLTE7ICsraSA8IG4wOyApIHtcbiAgICAgICAgICBub2RlID0gZ3JvdXBbaV07XG4gICAgICAgICAgbm9kZURhdGEgPSBncm91cERhdGFbaV07XG4gICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIG5vZGUuX19kYXRhX18gPSBub2RlRGF0YTtcbiAgICAgICAgICAgIHVwZGF0ZU5vZGVzW2ldID0gbm9kZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZW50ZXJOb2Rlc1tpXSA9IGQzX3NlbGVjdGlvbl9kYXRhTm9kZShub2RlRGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoO2kgPCBtOyArK2kpIHtcbiAgICAgICAgICBlbnRlck5vZGVzW2ldID0gZDNfc2VsZWN0aW9uX2RhdGFOb2RlKGdyb3VwRGF0YVtpXSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7aSA8IG47ICsraSkge1xuICAgICAgICAgIGV4aXROb2Rlc1tpXSA9IGdyb3VwW2ldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbnRlck5vZGVzLnVwZGF0ZSA9IHVwZGF0ZU5vZGVzO1xuICAgICAgZW50ZXJOb2Rlcy5wYXJlbnROb2RlID0gdXBkYXRlTm9kZXMucGFyZW50Tm9kZSA9IGV4aXROb2Rlcy5wYXJlbnROb2RlID0gZ3JvdXAucGFyZW50Tm9kZTtcbiAgICAgIGVudGVyLnB1c2goZW50ZXJOb2Rlcyk7XG4gICAgICB1cGRhdGUucHVzaCh1cGRhdGVOb2Rlcyk7XG4gICAgICBleGl0LnB1c2goZXhpdE5vZGVzKTtcbiAgICB9XG4gICAgdmFyIGVudGVyID0gZDNfc2VsZWN0aW9uX2VudGVyKFtdKSwgdXBkYXRlID0gZDNfc2VsZWN0aW9uKFtdKSwgZXhpdCA9IGQzX3NlbGVjdGlvbihbXSk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICBiaW5kKGdyb3VwID0gdGhpc1tpXSwgdmFsdWUuY2FsbChncm91cCwgZ3JvdXAucGFyZW50Tm9kZS5fX2RhdGFfXywgaSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICBiaW5kKGdyb3VwID0gdGhpc1tpXSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICB1cGRhdGUuZW50ZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBlbnRlcjtcbiAgICB9O1xuICAgIHVwZGF0ZS5leGl0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhpdDtcbiAgICB9O1xuICAgIHJldHVybiB1cGRhdGU7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9kYXRhTm9kZShkYXRhKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIF9fZGF0YV9fOiBkYXRhXG4gICAgfTtcbiAgfVxuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuZGF0dW0gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdGhpcy5wcm9wZXJ0eShcIl9fZGF0YV9fXCIsIHZhbHVlKSA6IHRoaXMucHJvcGVydHkoXCJfX2RhdGFfX1wiKTtcbiAgfTtcbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLmZpbHRlciA9IGZ1bmN0aW9uKGZpbHRlcikge1xuICAgIHZhciBzdWJncm91cHMgPSBbXSwgc3ViZ3JvdXAsIGdyb3VwLCBub2RlO1xuICAgIGlmICh0eXBlb2YgZmlsdGVyICE9PSBcImZ1bmN0aW9uXCIpIGZpbHRlciA9IGQzX3NlbGVjdGlvbl9maWx0ZXIoZmlsdGVyKTtcbiAgICBmb3IgKHZhciBqID0gMCwgbSA9IHRoaXMubGVuZ3RoOyBqIDwgbTsgaisrKSB7XG4gICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTtcbiAgICAgIHN1Ymdyb3VwLnBhcmVudE5vZGUgPSAoZ3JvdXAgPSB0aGlzW2pdKS5wYXJlbnROb2RlO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIGZpbHRlci5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGopKSB7XG4gICAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZDNfc2VsZWN0aW9uKHN1Ymdyb3Vwcyk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9maWx0ZXIoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZDNfc2VsZWN0TWF0Y2hlcyh0aGlzLCBzZWxlY3Rvcik7XG4gICAgfTtcbiAgfVxuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUub3JkZXIgPSBmdW5jdGlvbigpIHtcbiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB7XG4gICAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSBncm91cC5sZW5ndGggLSAxLCBuZXh0ID0gZ3JvdXBbaV0sIG5vZGU7IC0taSA+PSAwOyApIHtcbiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICAgIGlmIChuZXh0ICYmIG5leHQgIT09IG5vZGUubmV4dFNpYmxpbmcpIG5leHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7XG4gICAgICAgICAgbmV4dCA9IG5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5zb3J0ID0gZnVuY3Rpb24oY29tcGFyYXRvcikge1xuICAgIGNvbXBhcmF0b3IgPSBkM19zZWxlY3Rpb25fc29ydENvbXBhcmF0b3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB0aGlzW2pdLnNvcnQoY29tcGFyYXRvcik7XG4gICAgcmV0dXJuIHRoaXMub3JkZXIoKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX3NvcnRDb21wYXJhdG9yKGNvbXBhcmF0b3IpIHtcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIGNvbXBhcmF0b3IgPSBkM19hc2NlbmRpbmc7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgIHJldHVybiBhICYmIGIgPyBjb21wYXJhdG9yKGEuX19kYXRhX18sIGIuX19kYXRhX18pIDogIWEgLSAhYjtcbiAgICB9O1xuICB9XG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5lYWNoID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZDNfc2VsZWN0aW9uX2VhY2godGhpcywgZnVuY3Rpb24obm9kZSwgaSwgaikge1xuICAgICAgY2FsbGJhY2suY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKTtcbiAgICB9KTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2VhY2goZ3JvdXBzLCBjYWxsYmFjaykge1xuICAgIGZvciAodmFyIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07IGorKykge1xuICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIGNhbGxiYWNrKG5vZGUsIGksIGopO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ3JvdXBzO1xuICB9XG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICB2YXIgYXJncyA9IGQzX2FycmF5KGFyZ3VtZW50cyk7XG4gICAgY2FsbGJhY2suYXBwbHkoYXJnc1swXSA9IHRoaXMsIGFyZ3MpO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuZW1wdHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gIXRoaXMubm9kZSgpO1xuICB9O1xuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUubm9kZSA9IGZ1bmN0aW9uKCkge1xuICAgIGZvciAodmFyIGogPSAwLCBtID0gdGhpcy5sZW5ndGg7IGogPCBtOyBqKyspIHtcbiAgICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTtcbiAgICAgICAgaWYgKG5vZGUpIHJldHVybiBub2RlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgbiA9IDA7XG4gICAgZDNfc2VsZWN0aW9uX2VhY2godGhpcywgZnVuY3Rpb24oKSB7XG4gICAgICArK247XG4gICAgfSk7XG4gICAgcmV0dXJuIG47XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9lbnRlcihzZWxlY3Rpb24pIHtcbiAgICBkM19zdWJjbGFzcyhzZWxlY3Rpb24sIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZSk7XG4gICAgcmV0dXJuIHNlbGVjdGlvbjtcbiAgfVxuICB2YXIgZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlID0gW107XG4gIGQzLnNlbGVjdGlvbi5lbnRlciA9IGQzX3NlbGVjdGlvbl9lbnRlcjtcbiAgZDMuc2VsZWN0aW9uLmVudGVyLnByb3RvdHlwZSA9IGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZTtcbiAgZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlLmFwcGVuZCA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5hcHBlbmQ7XG4gIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5lbXB0eSA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5lbXB0eTtcbiAgZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlLm5vZGUgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUubm9kZTtcbiAgZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlLmNhbGwgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUuY2FsbDtcbiAgZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlLnNpemUgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUuc2l6ZTtcbiAgZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgdmFyIHN1Ymdyb3VwcyA9IFtdLCBzdWJncm91cCwgc3Vibm9kZSwgdXBncm91cCwgZ3JvdXAsIG5vZGU7XG4gICAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07ICkge1xuICAgICAgdXBncm91cCA9IChncm91cCA9IHRoaXNbal0pLnVwZGF0ZTtcbiAgICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pO1xuICAgICAgc3ViZ3JvdXAucGFyZW50Tm9kZSA9IGdyb3VwLnBhcmVudE5vZGU7XG4gICAgICBmb3IgKHZhciBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47ICkge1xuICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgICAgc3ViZ3JvdXAucHVzaCh1cGdyb3VwW2ldID0gc3Vibm9kZSA9IHNlbGVjdG9yLmNhbGwoZ3JvdXAucGFyZW50Tm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaikpO1xuICAgICAgICAgIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1Ymdyb3VwLnB1c2gobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGQzX3NlbGVjdGlvbihzdWJncm91cHMpO1xuICB9O1xuICBkM19zZWxlY3Rpb25fZW50ZXJQcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24obmFtZSwgYmVmb3JlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSBiZWZvcmUgPSBkM19zZWxlY3Rpb25fZW50ZXJJbnNlcnRCZWZvcmUodGhpcyk7XG4gICAgcmV0dXJuIGQzX3NlbGVjdGlvblByb3RvdHlwZS5pbnNlcnQuY2FsbCh0aGlzLCBuYW1lLCBiZWZvcmUpO1xuICB9O1xuICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fZW50ZXJJbnNlcnRCZWZvcmUoZW50ZXIpIHtcbiAgICB2YXIgaTAsIGowO1xuICAgIHJldHVybiBmdW5jdGlvbihkLCBpLCBqKSB7XG4gICAgICB2YXIgZ3JvdXAgPSBlbnRlcltqXS51cGRhdGUsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7XG4gICAgICBpZiAoaiAhPSBqMCkgajAgPSBqLCBpMCA9IDA7XG4gICAgICBpZiAoaSA+PSBpMCkgaTAgPSBpICsgMTtcbiAgICAgIHdoaWxlICghKG5vZGUgPSBncm91cFtpMF0pICYmICsraTAgPCBuKSA7XG4gICAgICByZXR1cm4gbm9kZTtcbiAgICB9O1xuICB9XG4gIGQzLnNlbGVjdCA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICB2YXIgZ3JvdXA7XG4gICAgaWYgKHR5cGVvZiBub2RlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBncm91cCA9IFsgZDNfc2VsZWN0KG5vZGUsIGQzX2RvY3VtZW50KSBdO1xuICAgICAgZ3JvdXAucGFyZW50Tm9kZSA9IGQzX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgZ3JvdXAgPSBbIG5vZGUgXTtcbiAgICAgIGdyb3VwLnBhcmVudE5vZGUgPSBkM19kb2N1bWVudEVsZW1lbnQobm9kZSk7XG4gICAgfVxuICAgIHJldHVybiBkM19zZWxlY3Rpb24oWyBncm91cCBdKTtcbiAgfTtcbiAgZDMuc2VsZWN0QWxsID0gZnVuY3Rpb24obm9kZXMpIHtcbiAgICB2YXIgZ3JvdXA7XG4gICAgaWYgKHR5cGVvZiBub2RlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZ3JvdXAgPSBkM19hcnJheShkM19zZWxlY3RBbGwobm9kZXMsIGQzX2RvY3VtZW50KSk7XG4gICAgICBncm91cC5wYXJlbnROb2RlID0gZDNfZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBncm91cCA9IGQzX2FycmF5KG5vZGVzKTtcbiAgICAgIGdyb3VwLnBhcmVudE5vZGUgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZDNfc2VsZWN0aW9uKFsgZ3JvdXAgXSk7XG4gIH07XG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyLCBjYXB0dXJlKSB7XG4gICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGlmIChuIDwgMykge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGlmIChuIDwgMikgbGlzdGVuZXIgPSBmYWxzZTtcbiAgICAgICAgZm9yIChjYXB0dXJlIGluIHR5cGUpIHRoaXMuZWFjaChkM19zZWxlY3Rpb25fb24oY2FwdHVyZSwgdHlwZVtjYXB0dXJlXSwgbGlzdGVuZXIpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBpZiAobiA8IDIpIHJldHVybiAobiA9IHRoaXMubm9kZSgpW1wiX19vblwiICsgdHlwZV0pICYmIG4uXztcbiAgICAgIGNhcHR1cmUgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZWFjaChkM19zZWxlY3Rpb25fb24odHlwZSwgbGlzdGVuZXIsIGNhcHR1cmUpKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX29uKHR5cGUsIGxpc3RlbmVyLCBjYXB0dXJlKSB7XG4gICAgdmFyIG5hbWUgPSBcIl9fb25cIiArIHR5cGUsIGkgPSB0eXBlLmluZGV4T2YoXCIuXCIpLCB3cmFwID0gZDNfc2VsZWN0aW9uX29uTGlzdGVuZXI7XG4gICAgaWYgKGkgPiAwKSB0eXBlID0gdHlwZS5zbGljZSgwLCBpKTtcbiAgICB2YXIgZmlsdGVyID0gZDNfc2VsZWN0aW9uX29uRmlsdGVycy5nZXQodHlwZSk7XG4gICAgaWYgKGZpbHRlcikgdHlwZSA9IGZpbHRlciwgd3JhcCA9IGQzX3NlbGVjdGlvbl9vbkZpbHRlcjtcbiAgICBmdW5jdGlvbiBvblJlbW92ZSgpIHtcbiAgICAgIHZhciBsID0gdGhpc1tuYW1lXTtcbiAgICAgIGlmIChsKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsLCBsLiQpO1xuICAgICAgICBkZWxldGUgdGhpc1tuYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gb25BZGQoKSB7XG4gICAgICB2YXIgbCA9IHdyYXAobGlzdGVuZXIsIGQzX2FycmF5KGFyZ3VtZW50cykpO1xuICAgICAgb25SZW1vdmUuY2FsbCh0aGlzKTtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCB0aGlzW25hbWVdID0gbCwgbC4kID0gY2FwdHVyZSk7XG4gICAgICBsLl8gPSBsaXN0ZW5lcjtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVtb3ZlQWxsKCkge1xuICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cChcIl5fX29uKFteLl0rKVwiICsgZDMucmVxdW90ZSh0eXBlKSArIFwiJFwiKSwgbWF0Y2g7XG4gICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMpIHtcbiAgICAgICAgaWYgKG1hdGNoID0gbmFtZS5tYXRjaChyZSkpIHtcbiAgICAgICAgICB2YXIgbCA9IHRoaXNbbmFtZV07XG4gICAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG1hdGNoWzFdLCBsLCBsLiQpO1xuICAgICAgICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpID8gbGlzdGVuZXIgPyBvbkFkZCA6IG9uUmVtb3ZlIDogbGlzdGVuZXIgPyBkM19ub29wIDogcmVtb3ZlQWxsO1xuICB9XG4gIHZhciBkM19zZWxlY3Rpb25fb25GaWx0ZXJzID0gZDMubWFwKHtcbiAgICBtb3VzZWVudGVyOiBcIm1vdXNlb3ZlclwiLFxuICAgIG1vdXNlbGVhdmU6IFwibW91c2VvdXRcIlxuICB9KTtcbiAgaWYgKGQzX2RvY3VtZW50KSB7XG4gICAgZDNfc2VsZWN0aW9uX29uRmlsdGVycy5mb3JFYWNoKGZ1bmN0aW9uKGspIHtcbiAgICAgIGlmIChcIm9uXCIgKyBrIGluIGQzX2RvY3VtZW50KSBkM19zZWxlY3Rpb25fb25GaWx0ZXJzLnJlbW92ZShrKTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fb25MaXN0ZW5lcihsaXN0ZW5lciwgYXJndW1lbnR6KSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGUpIHtcbiAgICAgIHZhciBvID0gZDMuZXZlbnQ7XG4gICAgICBkMy5ldmVudCA9IGU7XG4gICAgICBhcmd1bWVudHpbMF0gPSB0aGlzLl9fZGF0YV9fO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnR6KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGQzLmV2ZW50ID0gbztcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9vbkZpbHRlcihsaXN0ZW5lciwgYXJndW1lbnR6KSB7XG4gICAgdmFyIGwgPSBkM19zZWxlY3Rpb25fb25MaXN0ZW5lcihsaXN0ZW5lciwgYXJndW1lbnR6KTtcbiAgICByZXR1cm4gZnVuY3Rpb24oZSkge1xuICAgICAgdmFyIHRhcmdldCA9IHRoaXMsIHJlbGF0ZWQgPSBlLnJlbGF0ZWRUYXJnZXQ7XG4gICAgICBpZiAoIXJlbGF0ZWQgfHwgcmVsYXRlZCAhPT0gdGFyZ2V0ICYmICEocmVsYXRlZC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0YXJnZXQpICYgOCkpIHtcbiAgICAgICAgbC5jYWxsKHRhcmdldCwgZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICB2YXIgZDNfZXZlbnRfZHJhZ1NlbGVjdCwgZDNfZXZlbnRfZHJhZ0lkID0gMDtcbiAgZnVuY3Rpb24gZDNfZXZlbnRfZHJhZ1N1cHByZXNzKG5vZGUpIHtcbiAgICB2YXIgbmFtZSA9IFwiLmRyYWdzdXBwcmVzcy1cIiArICsrZDNfZXZlbnRfZHJhZ0lkLCBjbGljayA9IFwiY2xpY2tcIiArIG5hbWUsIHcgPSBkMy5zZWxlY3QoZDNfd2luZG93KG5vZGUpKS5vbihcInRvdWNobW92ZVwiICsgbmFtZSwgZDNfZXZlbnRQcmV2ZW50RGVmYXVsdCkub24oXCJkcmFnc3RhcnRcIiArIG5hbWUsIGQzX2V2ZW50UHJldmVudERlZmF1bHQpLm9uKFwic2VsZWN0c3RhcnRcIiArIG5hbWUsIGQzX2V2ZW50UHJldmVudERlZmF1bHQpO1xuICAgIGlmIChkM19ldmVudF9kcmFnU2VsZWN0ID09IG51bGwpIHtcbiAgICAgIGQzX2V2ZW50X2RyYWdTZWxlY3QgPSBcIm9uc2VsZWN0c3RhcnRcIiBpbiBub2RlID8gZmFsc2UgOiBkM192ZW5kb3JTeW1ib2wobm9kZS5zdHlsZSwgXCJ1c2VyU2VsZWN0XCIpO1xuICAgIH1cbiAgICBpZiAoZDNfZXZlbnRfZHJhZ1NlbGVjdCkge1xuICAgICAgdmFyIHN0eWxlID0gZDNfZG9jdW1lbnRFbGVtZW50KG5vZGUpLnN0eWxlLCBzZWxlY3QgPSBzdHlsZVtkM19ldmVudF9kcmFnU2VsZWN0XTtcbiAgICAgIHN0eWxlW2QzX2V2ZW50X2RyYWdTZWxlY3RdID0gXCJub25lXCI7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbihzdXBwcmVzc0NsaWNrKSB7XG4gICAgICB3Lm9uKG5hbWUsIG51bGwpO1xuICAgICAgaWYgKGQzX2V2ZW50X2RyYWdTZWxlY3QpIHN0eWxlW2QzX2V2ZW50X2RyYWdTZWxlY3RdID0gc2VsZWN0O1xuICAgICAgaWYgKHN1cHByZXNzQ2xpY2spIHtcbiAgICAgICAgdmFyIG9mZiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHcub24oY2xpY2ssIG51bGwpO1xuICAgICAgICB9O1xuICAgICAgICB3Lm9uKGNsaWNrLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICBkM19ldmVudFByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgb2ZmKCk7XG4gICAgICAgIH0sIHRydWUpO1xuICAgICAgICBzZXRUaW1lb3V0KG9mZiwgMCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBkMy5tb3VzZSA9IGZ1bmN0aW9uKGNvbnRhaW5lcikge1xuICAgIHJldHVybiBkM19tb3VzZVBvaW50KGNvbnRhaW5lciwgZDNfZXZlbnRTb3VyY2UoKSk7XG4gIH07XG4gIHZhciBkM19tb3VzZV9idWc0NDA4MyA9IHRoaXMubmF2aWdhdG9yICYmIC9XZWJLaXQvLnRlc3QodGhpcy5uYXZpZ2F0b3IudXNlckFnZW50KSA/IC0xIDogMDtcbiAgZnVuY3Rpb24gZDNfbW91c2VQb2ludChjb250YWluZXIsIGUpIHtcbiAgICBpZiAoZS5jaGFuZ2VkVG91Y2hlcykgZSA9IGUuY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgdmFyIHN2ZyA9IGNvbnRhaW5lci5vd25lclNWR0VsZW1lbnQgfHwgY29udGFpbmVyO1xuICAgIGlmIChzdmcuY3JlYXRlU1ZHUG9pbnQpIHtcbiAgICAgIHZhciBwb2ludCA9IHN2Zy5jcmVhdGVTVkdQb2ludCgpO1xuICAgICAgaWYgKGQzX21vdXNlX2J1ZzQ0MDgzIDwgMCkge1xuICAgICAgICB2YXIgd2luZG93ID0gZDNfd2luZG93KGNvbnRhaW5lcik7XG4gICAgICAgIGlmICh3aW5kb3cuc2Nyb2xsWCB8fCB3aW5kb3cuc2Nyb2xsWSkge1xuICAgICAgICAgIHN2ZyA9IGQzLnNlbGVjdChcImJvZHlcIikuYXBwZW5kKFwic3ZnXCIpLnN0eWxlKHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgICBsZWZ0OiAwLFxuICAgICAgICAgICAgbWFyZ2luOiAwLFxuICAgICAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgICAgIGJvcmRlcjogXCJub25lXCJcbiAgICAgICAgICB9LCBcImltcG9ydGFudFwiKTtcbiAgICAgICAgICB2YXIgY3RtID0gc3ZnWzBdWzBdLmdldFNjcmVlbkNUTSgpO1xuICAgICAgICAgIGQzX21vdXNlX2J1ZzQ0MDgzID0gIShjdG0uZiB8fCBjdG0uZSk7XG4gICAgICAgICAgc3ZnLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZDNfbW91c2VfYnVnNDQwODMpIHBvaW50LnggPSBlLnBhZ2VYLCBwb2ludC55ID0gZS5wYWdlWTsgZWxzZSBwb2ludC54ID0gZS5jbGllbnRYLCBcbiAgICAgIHBvaW50LnkgPSBlLmNsaWVudFk7XG4gICAgICBwb2ludCA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShjb250YWluZXIuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTtcbiAgICAgIHJldHVybiBbIHBvaW50LngsIHBvaW50LnkgXTtcbiAgICB9XG4gICAgdmFyIHJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIFsgZS5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gY29udGFpbmVyLmNsaWVudExlZnQsIGUuY2xpZW50WSAtIHJlY3QudG9wIC0gY29udGFpbmVyLmNsaWVudFRvcCBdO1xuICB9XG4gIGQzLnRvdWNoID0gZnVuY3Rpb24oY29udGFpbmVyLCB0b3VjaGVzLCBpZGVudGlmaWVyKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBpZGVudGlmaWVyID0gdG91Y2hlcywgdG91Y2hlcyA9IGQzX2V2ZW50U291cmNlKCkuY2hhbmdlZFRvdWNoZXM7XG4gICAgaWYgKHRvdWNoZXMpIGZvciAodmFyIGkgPSAwLCBuID0gdG91Y2hlcy5sZW5ndGgsIHRvdWNoOyBpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKHRvdWNoID0gdG91Y2hlc1tpXSkuaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikge1xuICAgICAgICByZXR1cm4gZDNfbW91c2VQb2ludChjb250YWluZXIsIHRvdWNoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGQzLmJlaGF2aW9yLmRyYWcgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZXZlbnQgPSBkM19ldmVudERpc3BhdGNoKGRyYWcsIFwiZHJhZ1wiLCBcImRyYWdzdGFydFwiLCBcImRyYWdlbmRcIiksIG9yaWdpbiA9IG51bGwsIG1vdXNlZG93biA9IGRyYWdzdGFydChkM19ub29wLCBkMy5tb3VzZSwgZDNfd2luZG93LCBcIm1vdXNlbW92ZVwiLCBcIm1vdXNldXBcIiksIHRvdWNoc3RhcnQgPSBkcmFnc3RhcnQoZDNfYmVoYXZpb3JfZHJhZ1RvdWNoSWQsIGQzLnRvdWNoLCBkM19pZGVudGl0eSwgXCJ0b3VjaG1vdmVcIiwgXCJ0b3VjaGVuZFwiKTtcbiAgICBmdW5jdGlvbiBkcmFnKCkge1xuICAgICAgdGhpcy5vbihcIm1vdXNlZG93bi5kcmFnXCIsIG1vdXNlZG93bikub24oXCJ0b3VjaHN0YXJ0LmRyYWdcIiwgdG91Y2hzdGFydCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRyYWdzdGFydChpZCwgcG9zaXRpb24sIHN1YmplY3QsIG1vdmUsIGVuZCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdGhhdCA9IHRoaXMsIHRhcmdldCA9IGQzLmV2ZW50LnRhcmdldC5jb3JyZXNwb25kaW5nRWxlbWVudCB8fCBkMy5ldmVudC50YXJnZXQsIHBhcmVudCA9IHRoYXQucGFyZW50Tm9kZSwgZGlzcGF0Y2ggPSBldmVudC5vZih0aGF0LCBhcmd1bWVudHMpLCBkcmFnZ2VkID0gMCwgZHJhZ0lkID0gaWQoKSwgZHJhZ05hbWUgPSBcIi5kcmFnXCIgKyAoZHJhZ0lkID09IG51bGwgPyBcIlwiIDogXCItXCIgKyBkcmFnSWQpLCBkcmFnT2Zmc2V0LCBkcmFnU3ViamVjdCA9IGQzLnNlbGVjdChzdWJqZWN0KHRhcmdldCkpLm9uKG1vdmUgKyBkcmFnTmFtZSwgbW92ZWQpLm9uKGVuZCArIGRyYWdOYW1lLCBlbmRlZCksIGRyYWdSZXN0b3JlID0gZDNfZXZlbnRfZHJhZ1N1cHByZXNzKHRhcmdldCksIHBvc2l0aW9uMCA9IHBvc2l0aW9uKHBhcmVudCwgZHJhZ0lkKTtcbiAgICAgICAgaWYgKG9yaWdpbikge1xuICAgICAgICAgIGRyYWdPZmZzZXQgPSBvcmlnaW4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgICAgICAgICBkcmFnT2Zmc2V0ID0gWyBkcmFnT2Zmc2V0LnggLSBwb3NpdGlvbjBbMF0sIGRyYWdPZmZzZXQueSAtIHBvc2l0aW9uMFsxXSBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRyYWdPZmZzZXQgPSBbIDAsIDAgXTtcbiAgICAgICAgfVxuICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgdHlwZTogXCJkcmFnc3RhcnRcIlxuICAgICAgICB9KTtcbiAgICAgICAgZnVuY3Rpb24gbW92ZWQoKSB7XG4gICAgICAgICAgdmFyIHBvc2l0aW9uMSA9IHBvc2l0aW9uKHBhcmVudCwgZHJhZ0lkKSwgZHgsIGR5O1xuICAgICAgICAgIGlmICghcG9zaXRpb24xKSByZXR1cm47XG4gICAgICAgICAgZHggPSBwb3NpdGlvbjFbMF0gLSBwb3NpdGlvbjBbMF07XG4gICAgICAgICAgZHkgPSBwb3NpdGlvbjFbMV0gLSBwb3NpdGlvbjBbMV07XG4gICAgICAgICAgZHJhZ2dlZCB8PSBkeCB8IGR5O1xuICAgICAgICAgIHBvc2l0aW9uMCA9IHBvc2l0aW9uMTtcbiAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiBcImRyYWdcIixcbiAgICAgICAgICAgIHg6IHBvc2l0aW9uMVswXSArIGRyYWdPZmZzZXRbMF0sXG4gICAgICAgICAgICB5OiBwb3NpdGlvbjFbMV0gKyBkcmFnT2Zmc2V0WzFdLFxuICAgICAgICAgICAgZHg6IGR4LFxuICAgICAgICAgICAgZHk6IGR5XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gZW5kZWQoKSB7XG4gICAgICAgICAgaWYgKCFwb3NpdGlvbihwYXJlbnQsIGRyYWdJZCkpIHJldHVybjtcbiAgICAgICAgICBkcmFnU3ViamVjdC5vbihtb3ZlICsgZHJhZ05hbWUsIG51bGwpLm9uKGVuZCArIGRyYWdOYW1lLCBudWxsKTtcbiAgICAgICAgICBkcmFnUmVzdG9yZShkcmFnZ2VkKTtcbiAgICAgICAgICBkaXNwYXRjaCh7XG4gICAgICAgICAgICB0eXBlOiBcImRyYWdlbmRcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICBkcmFnLm9yaWdpbiA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG9yaWdpbjtcbiAgICAgIG9yaWdpbiA9IHg7XG4gICAgICByZXR1cm4gZHJhZztcbiAgICB9O1xuICAgIHJldHVybiBkMy5yZWJpbmQoZHJhZywgZXZlbnQsIFwib25cIik7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2JlaGF2aW9yX2RyYWdUb3VjaElkKCkge1xuICAgIHJldHVybiBkMy5ldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5pZGVudGlmaWVyO1xuICB9XG4gIGQzLnRvdWNoZXMgPSBmdW5jdGlvbihjb250YWluZXIsIHRvdWNoZXMpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHRvdWNoZXMgPSBkM19ldmVudFNvdXJjZSgpLnRvdWNoZXM7XG4gICAgcmV0dXJuIHRvdWNoZXMgPyBkM19hcnJheSh0b3VjaGVzKS5tYXAoZnVuY3Rpb24odG91Y2gpIHtcbiAgICAgIHZhciBwb2ludCA9IGQzX21vdXNlUG9pbnQoY29udGFpbmVyLCB0b3VjaCk7XG4gICAgICBwb2ludC5pZGVudGlmaWVyID0gdG91Y2guaWRlbnRpZmllcjtcbiAgICAgIHJldHVybiBwb2ludDtcbiAgICB9KSA6IFtdO1xuICB9O1xuICB2YXIgzrUgPSAxZS02LCDOtTIgPSDOtSAqIM61LCDPgCA9IE1hdGguUEksIM+EID0gMiAqIM+ALCDPhM61ID0gz4QgLSDOtSwgaGFsZs+AID0gz4AgLyAyLCBkM19yYWRpYW5zID0gz4AgLyAxODAsIGQzX2RlZ3JlZXMgPSAxODAgLyDPgDtcbiAgZnVuY3Rpb24gZDNfc2duKHgpIHtcbiAgICByZXR1cm4geCA+IDAgPyAxIDogeCA8IDAgPyAtMSA6IDA7XG4gIH1cbiAgZnVuY3Rpb24gZDNfY3Jvc3MyZChhLCBiLCBjKSB7XG4gICAgcmV0dXJuIChiWzBdIC0gYVswXSkgKiAoY1sxXSAtIGFbMV0pIC0gKGJbMV0gLSBhWzFdKSAqIChjWzBdIC0gYVswXSk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfYWNvcyh4KSB7XG4gICAgcmV0dXJuIHggPiAxID8gMCA6IHggPCAtMSA/IM+AIDogTWF0aC5hY29zKHgpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2FzaW4oeCkge1xuICAgIHJldHVybiB4ID4gMSA/IGhhbGbPgCA6IHggPCAtMSA/IC1oYWxmz4AgOiBNYXRoLmFzaW4oeCk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc2luaCh4KSB7XG4gICAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSAtIDEgLyB4KSAvIDI7XG4gIH1cbiAgZnVuY3Rpb24gZDNfY29zaCh4KSB7XG4gICAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSArIDEgLyB4KSAvIDI7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdGFuaCh4KSB7XG4gICAgcmV0dXJuICgoeCA9IE1hdGguZXhwKDIgKiB4KSkgLSAxKSAvICh4ICsgMSk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfaGF2ZXJzaW4oeCkge1xuICAgIHJldHVybiAoeCA9IE1hdGguc2luKHggLyAyKSkgKiB4O1xuICB9XG4gIHZhciDPgSA9IE1hdGguU1FSVDIsIM+BMiA9IDIsIM+BNCA9IDQ7XG4gIGQzLmludGVycG9sYXRlWm9vbSA9IGZ1bmN0aW9uKHAwLCBwMSkge1xuICAgIHZhciB1eDAgPSBwMFswXSwgdXkwID0gcDBbMV0sIHcwID0gcDBbMl0sIHV4MSA9IHAxWzBdLCB1eTEgPSBwMVsxXSwgdzEgPSBwMVsyXSwgZHggPSB1eDEgLSB1eDAsIGR5ID0gdXkxIC0gdXkwLCBkMiA9IGR4ICogZHggKyBkeSAqIGR5LCBpLCBTO1xuICAgIGlmIChkMiA8IM61Mikge1xuICAgICAgUyA9IE1hdGgubG9nKHcxIC8gdzApIC8gz4E7XG4gICAgICBpID0gZnVuY3Rpb24odCkge1xuICAgICAgICByZXR1cm4gWyB1eDAgKyB0ICogZHgsIHV5MCArIHQgKiBkeSwgdzAgKiBNYXRoLmV4cCjPgSAqIHQgKiBTKSBdO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGQxID0gTWF0aC5zcXJ0KGQyKSwgYjAgPSAodzEgKiB3MSAtIHcwICogdzAgKyDPgTQgKiBkMikgLyAoMiAqIHcwICogz4EyICogZDEpLCBiMSA9ICh3MSAqIHcxIC0gdzAgKiB3MCAtIM+BNCAqIGQyKSAvICgyICogdzEgKiDPgTIgKiBkMSksIHIwID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIwICogYjAgKyAxKSAtIGIwKSwgcjEgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjEgKiBiMSArIDEpIC0gYjEpO1xuICAgICAgUyA9IChyMSAtIHIwKSAvIM+BO1xuICAgICAgaSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgdmFyIHMgPSB0ICogUywgY29zaHIwID0gZDNfY29zaChyMCksIHUgPSB3MCAvICjPgTIgKiBkMSkgKiAoY29zaHIwICogZDNfdGFuaCjPgSAqIHMgKyByMCkgLSBkM19zaW5oKHIwKSk7XG4gICAgICAgIHJldHVybiBbIHV4MCArIHUgKiBkeCwgdXkwICsgdSAqIGR5LCB3MCAqIGNvc2hyMCAvIGQzX2Nvc2goz4EgKiBzICsgcjApIF07XG4gICAgICB9O1xuICAgIH1cbiAgICBpLmR1cmF0aW9uID0gUyAqIDFlMztcbiAgICByZXR1cm4gaTtcbiAgfTtcbiAgZDMuYmVoYXZpb3Iuem9vbSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2aWV3ID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICBrOiAxXG4gICAgfSwgdHJhbnNsYXRlMCwgY2VudGVyMCwgY2VudGVyLCBzaXplID0gWyA5NjAsIDUwMCBdLCBzY2FsZUV4dGVudCA9IGQzX2JlaGF2aW9yX3pvb21JbmZpbml0eSwgZHVyYXRpb24gPSAyNTAsIHpvb21pbmcgPSAwLCBtb3VzZWRvd24gPSBcIm1vdXNlZG93bi56b29tXCIsIG1vdXNlbW92ZSA9IFwibW91c2Vtb3ZlLnpvb21cIiwgbW91c2V1cCA9IFwibW91c2V1cC56b29tXCIsIG1vdXNld2hlZWxUaW1lciwgdG91Y2hzdGFydCA9IFwidG91Y2hzdGFydC56b29tXCIsIHRvdWNodGltZSwgZXZlbnQgPSBkM19ldmVudERpc3BhdGNoKHpvb20sIFwiem9vbXN0YXJ0XCIsIFwiem9vbVwiLCBcInpvb21lbmRcIiksIHgwLCB4MSwgeTAsIHkxO1xuICAgIGlmICghZDNfYmVoYXZpb3Jfem9vbVdoZWVsKSB7XG4gICAgICBkM19iZWhhdmlvcl96b29tV2hlZWwgPSBcIm9ud2hlZWxcIiBpbiBkM19kb2N1bWVudCA/IChkM19iZWhhdmlvcl96b29tRGVsdGEgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIC1kMy5ldmVudC5kZWx0YVkgKiAoZDMuZXZlbnQuZGVsdGFNb2RlID8gMTIwIDogMSk7XG4gICAgICB9LCBcIndoZWVsXCIpIDogXCJvbm1vdXNld2hlZWxcIiBpbiBkM19kb2N1bWVudCA/IChkM19iZWhhdmlvcl96b29tRGVsdGEgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGQzLmV2ZW50LndoZWVsRGVsdGE7XG4gICAgICB9LCBcIm1vdXNld2hlZWxcIikgOiAoZDNfYmVoYXZpb3Jfem9vbURlbHRhID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiAtZDMuZXZlbnQuZGV0YWlsO1xuICAgICAgfSwgXCJNb3pNb3VzZVBpeGVsU2Nyb2xsXCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB6b29tKGcpIHtcbiAgICAgIGcub24obW91c2Vkb3duLCBtb3VzZWRvd25lZCkub24oZDNfYmVoYXZpb3Jfem9vbVdoZWVsICsgXCIuem9vbVwiLCBtb3VzZXdoZWVsZWQpLm9uKFwiZGJsY2xpY2suem9vbVwiLCBkYmxjbGlja2VkKS5vbih0b3VjaHN0YXJ0LCB0b3VjaHN0YXJ0ZWQpO1xuICAgIH1cbiAgICB6b29tLmV2ZW50ID0gZnVuY3Rpb24oZykge1xuICAgICAgZy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZGlzcGF0Y2ggPSBldmVudC5vZih0aGlzLCBhcmd1bWVudHMpLCB2aWV3MSA9IHZpZXc7XG4gICAgICAgIGlmIChkM190cmFuc2l0aW9uSW5oZXJpdElkKSB7XG4gICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5lYWNoKFwic3RhcnQuem9vbVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZpZXcgPSB0aGlzLl9fY2hhcnRfXyB8fCB7XG4gICAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICAgIGs6IDFcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB6b29tc3RhcnRlZChkaXNwYXRjaCk7XG4gICAgICAgICAgfSkudHdlZW4oXCJ6b29tOnpvb21cIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZHggPSBzaXplWzBdLCBkeSA9IHNpemVbMV0sIGN4ID0gY2VudGVyMCA/IGNlbnRlcjBbMF0gOiBkeCAvIDIsIGN5ID0gY2VudGVyMCA/IGNlbnRlcjBbMV0gOiBkeSAvIDIsIGkgPSBkMy5pbnRlcnBvbGF0ZVpvb20oWyAoY3ggLSB2aWV3LngpIC8gdmlldy5rLCAoY3kgLSB2aWV3LnkpIC8gdmlldy5rLCBkeCAvIHZpZXcuayBdLCBbIChjeCAtIHZpZXcxLngpIC8gdmlldzEuaywgKGN5IC0gdmlldzEueSkgLyB2aWV3MS5rLCBkeCAvIHZpZXcxLmsgXSk7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICB2YXIgbCA9IGkodCksIGsgPSBkeCAvIGxbMl07XG4gICAgICAgICAgICAgIHRoaXMuX19jaGFydF9fID0gdmlldyA9IHtcbiAgICAgICAgICAgICAgICB4OiBjeCAtIGxbMF0gKiBrLFxuICAgICAgICAgICAgICAgIHk6IGN5IC0gbFsxXSAqIGssXG4gICAgICAgICAgICAgICAgazoga1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB6b29tZWQoZGlzcGF0Y2gpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KS5lYWNoKFwiaW50ZXJydXB0Lnpvb21cIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB6b29tZW5kZWQoZGlzcGF0Y2gpO1xuICAgICAgICAgIH0pLmVhY2goXCJlbmQuem9vbVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHpvb21lbmRlZChkaXNwYXRjaCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fX2NoYXJ0X18gPSB2aWV3O1xuICAgICAgICAgIHpvb21zdGFydGVkKGRpc3BhdGNoKTtcbiAgICAgICAgICB6b29tZWQoZGlzcGF0Y2gpO1xuICAgICAgICAgIHpvb21lbmRlZChkaXNwYXRjaCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgem9vbS50cmFuc2xhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbIHZpZXcueCwgdmlldy55IF07XG4gICAgICB2aWV3ID0ge1xuICAgICAgICB4OiArX1swXSxcbiAgICAgICAgeTogK19bMV0sXG4gICAgICAgIGs6IHZpZXcua1xuICAgICAgfTtcbiAgICAgIHJlc2NhbGUoKTtcbiAgICAgIHJldHVybiB6b29tO1xuICAgIH07XG4gICAgem9vbS5zY2FsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHZpZXcuaztcbiAgICAgIHZpZXcgPSB7XG4gICAgICAgIHg6IHZpZXcueCxcbiAgICAgICAgeTogdmlldy55LFxuICAgICAgICBrOiBudWxsXG4gICAgICB9O1xuICAgICAgc2NhbGVUbygrXyk7XG4gICAgICByZXNjYWxlKCk7XG4gICAgICByZXR1cm4gem9vbTtcbiAgICB9O1xuICAgIHpvb20uc2NhbGVFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZUV4dGVudDtcbiAgICAgIHNjYWxlRXh0ZW50ID0gXyA9PSBudWxsID8gZDNfYmVoYXZpb3Jfem9vbUluZmluaXR5IDogWyArX1swXSwgK19bMV0gXTtcbiAgICAgIHJldHVybiB6b29tO1xuICAgIH07XG4gICAgem9vbS5jZW50ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjZW50ZXI7XG4gICAgICBjZW50ZXIgPSBfICYmIFsgK19bMF0sICtfWzFdIF07XG4gICAgICByZXR1cm4gem9vbTtcbiAgICB9O1xuICAgIHpvb20uc2l6ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7XG4gICAgICBzaXplID0gXyAmJiBbICtfWzBdLCArX1sxXSBdO1xuICAgICAgcmV0dXJuIHpvb207XG4gICAgfTtcbiAgICB6b29tLmR1cmF0aW9uID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZHVyYXRpb247XG4gICAgICBkdXJhdGlvbiA9ICtfO1xuICAgICAgcmV0dXJuIHpvb207XG4gICAgfTtcbiAgICB6b29tLnggPSBmdW5jdGlvbih6KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4MTtcbiAgICAgIHgxID0gejtcbiAgICAgIHgwID0gei5jb3B5KCk7XG4gICAgICB2aWV3ID0ge1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgICBrOiAxXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHpvb207XG4gICAgfTtcbiAgICB6b29tLnkgPSBmdW5jdGlvbih6KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5MTtcbiAgICAgIHkxID0gejtcbiAgICAgIHkwID0gei5jb3B5KCk7XG4gICAgICB2aWV3ID0ge1xuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgICBrOiAxXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHpvb207XG4gICAgfTtcbiAgICBmdW5jdGlvbiBsb2NhdGlvbihwKSB7XG4gICAgICByZXR1cm4gWyAocFswXSAtIHZpZXcueCkgLyB2aWV3LmssIChwWzFdIC0gdmlldy55KSAvIHZpZXcuayBdO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb2ludChsKSB7XG4gICAgICByZXR1cm4gWyBsWzBdICogdmlldy5rICsgdmlldy54LCBsWzFdICogdmlldy5rICsgdmlldy55IF07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNjYWxlVG8ocykge1xuICAgICAgdmlldy5rID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCBzKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZVRvKHAsIGwpIHtcbiAgICAgIGwgPSBwb2ludChsKTtcbiAgICAgIHZpZXcueCArPSBwWzBdIC0gbFswXTtcbiAgICAgIHZpZXcueSArPSBwWzFdIC0gbFsxXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gem9vbVRvKHRoYXQsIHAsIGwsIGspIHtcbiAgICAgIHRoYXQuX19jaGFydF9fID0ge1xuICAgICAgICB4OiB2aWV3LngsXG4gICAgICAgIHk6IHZpZXcueSxcbiAgICAgICAgazogdmlldy5rXG4gICAgICB9O1xuICAgICAgc2NhbGVUbyhNYXRoLnBvdygyLCBrKSk7XG4gICAgICB0cmFuc2xhdGVUbyhjZW50ZXIwID0gcCwgbCk7XG4gICAgICB0aGF0ID0gZDMuc2VsZWN0KHRoYXQpO1xuICAgICAgaWYgKGR1cmF0aW9uID4gMCkgdGhhdCA9IHRoYXQudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKTtcbiAgICAgIHRoYXQuY2FsbCh6b29tLmV2ZW50KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzY2FsZSgpIHtcbiAgICAgIGlmICh4MSkgeDEuZG9tYWluKHgwLnJhbmdlKCkubWFwKGZ1bmN0aW9uKHgpIHtcbiAgICAgICAgcmV0dXJuICh4IC0gdmlldy54KSAvIHZpZXcuaztcbiAgICAgIH0pLm1hcCh4MC5pbnZlcnQpKTtcbiAgICAgIGlmICh5MSkgeTEuZG9tYWluKHkwLnJhbmdlKCkubWFwKGZ1bmN0aW9uKHkpIHtcbiAgICAgICAgcmV0dXJuICh5IC0gdmlldy55KSAvIHZpZXcuaztcbiAgICAgIH0pLm1hcCh5MC5pbnZlcnQpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gem9vbXN0YXJ0ZWQoZGlzcGF0Y2gpIHtcbiAgICAgIGlmICghem9vbWluZysrKSBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IFwiem9vbXN0YXJ0XCJcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB6b29tZWQoZGlzcGF0Y2gpIHtcbiAgICAgIHJlc2NhbGUoKTtcbiAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogXCJ6b29tXCIsXG4gICAgICAgIHNjYWxlOiB2aWV3LmssXG4gICAgICAgIHRyYW5zbGF0ZTogWyB2aWV3LngsIHZpZXcueSBdXG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gem9vbWVuZGVkKGRpc3BhdGNoKSB7XG4gICAgICBpZiAoIS0tem9vbWluZykgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBcInpvb21lbmRcIlxuICAgICAgfSksIGNlbnRlcjAgPSBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtb3VzZWRvd25lZCgpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcywgZGlzcGF0Y2ggPSBldmVudC5vZih0aGF0LCBhcmd1bWVudHMpLCBkcmFnZ2VkID0gMCwgc3ViamVjdCA9IGQzLnNlbGVjdChkM193aW5kb3codGhhdCkpLm9uKG1vdXNlbW92ZSwgbW92ZWQpLm9uKG1vdXNldXAsIGVuZGVkKSwgbG9jYXRpb24wID0gbG9jYXRpb24oZDMubW91c2UodGhhdCkpLCBkcmFnUmVzdG9yZSA9IGQzX2V2ZW50X2RyYWdTdXBwcmVzcyh0aGF0KTtcbiAgICAgIGQzX3NlbGVjdGlvbl9pbnRlcnJ1cHQuY2FsbCh0aGF0KTtcbiAgICAgIHpvb21zdGFydGVkKGRpc3BhdGNoKTtcbiAgICAgIGZ1bmN0aW9uIG1vdmVkKCkge1xuICAgICAgICBkcmFnZ2VkID0gMTtcbiAgICAgICAgdHJhbnNsYXRlVG8oZDMubW91c2UodGhhdCksIGxvY2F0aW9uMCk7XG4gICAgICAgIHpvb21lZChkaXNwYXRjaCk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBlbmRlZCgpIHtcbiAgICAgICAgc3ViamVjdC5vbihtb3VzZW1vdmUsIG51bGwpLm9uKG1vdXNldXAsIG51bGwpO1xuICAgICAgICBkcmFnUmVzdG9yZShkcmFnZ2VkKTtcbiAgICAgICAgem9vbWVuZGVkKGRpc3BhdGNoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdG91Y2hzdGFydGVkKCkge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzLCBkaXNwYXRjaCA9IGV2ZW50Lm9mKHRoYXQsIGFyZ3VtZW50cyksIGxvY2F0aW9uczAgPSB7fSwgZGlzdGFuY2UwID0gMCwgc2NhbGUwLCB6b29tTmFtZSA9IFwiLnpvb20tXCIgKyBkMy5ldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5pZGVudGlmaWVyLCB0b3VjaG1vdmUgPSBcInRvdWNobW92ZVwiICsgem9vbU5hbWUsIHRvdWNoZW5kID0gXCJ0b3VjaGVuZFwiICsgem9vbU5hbWUsIHRhcmdldHMgPSBbXSwgc3ViamVjdCA9IGQzLnNlbGVjdCh0aGF0KSwgZHJhZ1Jlc3RvcmUgPSBkM19ldmVudF9kcmFnU3VwcHJlc3ModGhhdCk7XG4gICAgICBzdGFydGVkKCk7XG4gICAgICB6b29tc3RhcnRlZChkaXNwYXRjaCk7XG4gICAgICBzdWJqZWN0Lm9uKG1vdXNlZG93biwgbnVsbCkub24odG91Y2hzdGFydCwgc3RhcnRlZCk7XG4gICAgICBmdW5jdGlvbiByZWxvY2F0ZSgpIHtcbiAgICAgICAgdmFyIHRvdWNoZXMgPSBkMy50b3VjaGVzKHRoYXQpO1xuICAgICAgICBzY2FsZTAgPSB2aWV3Lms7XG4gICAgICAgIHRvdWNoZXMuZm9yRWFjaChmdW5jdGlvbih0KSB7XG4gICAgICAgICAgaWYgKHQuaWRlbnRpZmllciBpbiBsb2NhdGlvbnMwKSBsb2NhdGlvbnMwW3QuaWRlbnRpZmllcl0gPSBsb2NhdGlvbih0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0b3VjaGVzO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gc3RhcnRlZCgpIHtcbiAgICAgICAgdmFyIHRhcmdldCA9IGQzLmV2ZW50LnRhcmdldDtcbiAgICAgICAgZDMuc2VsZWN0KHRhcmdldCkub24odG91Y2htb3ZlLCBtb3ZlZCkub24odG91Y2hlbmQsIGVuZGVkKTtcbiAgICAgICAgdGFyZ2V0cy5wdXNoKHRhcmdldCk7XG4gICAgICAgIHZhciBjaGFuZ2VkID0gZDMuZXZlbnQuY2hhbmdlZFRvdWNoZXM7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gY2hhbmdlZC5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgICBsb2NhdGlvbnMwW2NoYW5nZWRbaV0uaWRlbnRpZmllcl0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0b3VjaGVzID0gcmVsb2NhdGUoKSwgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKHRvdWNoZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgaWYgKG5vdyAtIHRvdWNodGltZSA8IDUwMCkge1xuICAgICAgICAgICAgdmFyIHAgPSB0b3VjaGVzWzBdO1xuICAgICAgICAgICAgem9vbVRvKHRoYXQsIHAsIGxvY2F0aW9uczBbcC5pZGVudGlmaWVyXSwgTWF0aC5mbG9vcihNYXRoLmxvZyh2aWV3LmspIC8gTWF0aC5MTjIpICsgMSk7XG4gICAgICAgICAgICBkM19ldmVudFByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRvdWNodGltZSA9IG5vdztcbiAgICAgICAgfSBlbHNlIGlmICh0b3VjaGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB2YXIgcCA9IHRvdWNoZXNbMF0sIHEgPSB0b3VjaGVzWzFdLCBkeCA9IHBbMF0gLSBxWzBdLCBkeSA9IHBbMV0gLSBxWzFdO1xuICAgICAgICAgIGRpc3RhbmNlMCA9IGR4ICogZHggKyBkeSAqIGR5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBtb3ZlZCgpIHtcbiAgICAgICAgdmFyIHRvdWNoZXMgPSBkMy50b3VjaGVzKHRoYXQpLCBwMCwgbDAsIHAxLCBsMTtcbiAgICAgICAgZDNfc2VsZWN0aW9uX2ludGVycnVwdC5jYWxsKHRoYXQpO1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHRvdWNoZXMubGVuZ3RoOyBpIDwgbjsgKytpLCBsMSA9IG51bGwpIHtcbiAgICAgICAgICBwMSA9IHRvdWNoZXNbaV07XG4gICAgICAgICAgaWYgKGwxID0gbG9jYXRpb25zMFtwMS5pZGVudGlmaWVyXSkge1xuICAgICAgICAgICAgaWYgKGwwKSBicmVhaztcbiAgICAgICAgICAgIHAwID0gcDEsIGwwID0gbDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChsMSkge1xuICAgICAgICAgIHZhciBkaXN0YW5jZTEgPSAoZGlzdGFuY2UxID0gcDFbMF0gLSBwMFswXSkgKiBkaXN0YW5jZTEgKyAoZGlzdGFuY2UxID0gcDFbMV0gLSBwMFsxXSkgKiBkaXN0YW5jZTEsIHNjYWxlMSA9IGRpc3RhbmNlMCAmJiBNYXRoLnNxcnQoZGlzdGFuY2UxIC8gZGlzdGFuY2UwKTtcbiAgICAgICAgICBwMCA9IFsgKHAwWzBdICsgcDFbMF0pIC8gMiwgKHAwWzFdICsgcDFbMV0pIC8gMiBdO1xuICAgICAgICAgIGwwID0gWyAobDBbMF0gKyBsMVswXSkgLyAyLCAobDBbMV0gKyBsMVsxXSkgLyAyIF07XG4gICAgICAgICAgc2NhbGVUbyhzY2FsZTEgKiBzY2FsZTApO1xuICAgICAgICB9XG4gICAgICAgIHRvdWNodGltZSA9IG51bGw7XG4gICAgICAgIHRyYW5zbGF0ZVRvKHAwLCBsMCk7XG4gICAgICAgIHpvb21lZChkaXNwYXRjaCk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBlbmRlZCgpIHtcbiAgICAgICAgaWYgKGQzLmV2ZW50LnRvdWNoZXMubGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIGNoYW5nZWQgPSBkMy5ldmVudC5jaGFuZ2VkVG91Y2hlcztcbiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGNoYW5nZWQubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICAgICAgICBkZWxldGUgbG9jYXRpb25zMFtjaGFuZ2VkW2ldLmlkZW50aWZpZXJdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKHZhciBpZGVudGlmaWVyIGluIGxvY2F0aW9uczApIHtcbiAgICAgICAgICAgIHJldHVybiB2b2lkIHJlbG9jYXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGQzLnNlbGVjdEFsbCh0YXJnZXRzKS5vbih6b29tTmFtZSwgbnVsbCk7XG4gICAgICAgIHN1YmplY3Qub24obW91c2Vkb3duLCBtb3VzZWRvd25lZCkub24odG91Y2hzdGFydCwgdG91Y2hzdGFydGVkKTtcbiAgICAgICAgZHJhZ1Jlc3RvcmUoKTtcbiAgICAgICAgem9vbWVuZGVkKGRpc3BhdGNoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbW91c2V3aGVlbGVkKCkge1xuICAgICAgdmFyIGRpc3BhdGNoID0gZXZlbnQub2YodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIGlmIChtb3VzZXdoZWVsVGltZXIpIGNsZWFyVGltZW91dChtb3VzZXdoZWVsVGltZXIpOyBlbHNlIGQzX3NlbGVjdGlvbl9pbnRlcnJ1cHQuY2FsbCh0aGlzKSwgXG4gICAgICB0cmFuc2xhdGUwID0gbG9jYXRpb24oY2VudGVyMCA9IGNlbnRlciB8fCBkMy5tb3VzZSh0aGlzKSksIHpvb21zdGFydGVkKGRpc3BhdGNoKTtcbiAgICAgIG1vdXNld2hlZWxUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIG1vdXNld2hlZWxUaW1lciA9IG51bGw7XG4gICAgICAgIHpvb21lbmRlZChkaXNwYXRjaCk7XG4gICAgICB9LCA1MCk7XG4gICAgICBkM19ldmVudFByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzY2FsZVRvKE1hdGgucG93KDIsIGQzX2JlaGF2aW9yX3pvb21EZWx0YSgpICogLjAwMikgKiB2aWV3LmspO1xuICAgICAgdHJhbnNsYXRlVG8oY2VudGVyMCwgdHJhbnNsYXRlMCk7XG4gICAgICB6b29tZWQoZGlzcGF0Y2gpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkYmxjbGlja2VkKCkge1xuICAgICAgdmFyIHAgPSBkMy5tb3VzZSh0aGlzKSwgayA9IE1hdGgubG9nKHZpZXcuaykgLyBNYXRoLkxOMjtcbiAgICAgIHpvb21Ubyh0aGlzLCBwLCBsb2NhdGlvbihwKSwgZDMuZXZlbnQuc2hpZnRLZXkgPyBNYXRoLmNlaWwoaykgLSAxIDogTWF0aC5mbG9vcihrKSArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZDMucmViaW5kKHpvb20sIGV2ZW50LCBcIm9uXCIpO1xuICB9O1xuICB2YXIgZDNfYmVoYXZpb3Jfem9vbUluZmluaXR5ID0gWyAwLCBJbmZpbml0eSBdLCBkM19iZWhhdmlvcl96b29tRGVsdGEsIGQzX2JlaGF2aW9yX3pvb21XaGVlbDtcbiAgZDMuY29sb3IgPSBkM19jb2xvcjtcbiAgZnVuY3Rpb24gZDNfY29sb3IoKSB7fVxuICBkM19jb2xvci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5yZ2IoKSArIFwiXCI7XG4gIH07XG4gIGQzLmhzbCA9IGQzX2hzbDtcbiAgZnVuY3Rpb24gZDNfaHNsKGgsIHMsIGwpIHtcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGQzX2hzbCA/IHZvaWQgKHRoaXMuaCA9ICtoLCB0aGlzLnMgPSArcywgdGhpcy5sID0gK2wpIDogYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBoIGluc3RhbmNlb2YgZDNfaHNsID8gbmV3IGQzX2hzbChoLmgsIGgucywgaC5sKSA6IGQzX3JnYl9wYXJzZShcIlwiICsgaCwgZDNfcmdiX2hzbCwgZDNfaHNsKSA6IG5ldyBkM19oc2woaCwgcywgbCk7XG4gIH1cbiAgdmFyIGQzX2hzbFByb3RvdHlwZSA9IGQzX2hzbC5wcm90b3R5cGUgPSBuZXcgZDNfY29sb3IoKTtcbiAgZDNfaHNsUHJvdG90eXBlLmJyaWdodGVyID0gZnVuY3Rpb24oaykge1xuICAgIGsgPSBNYXRoLnBvdyguNywgYXJndW1lbnRzLmxlbmd0aCA/IGsgOiAxKTtcbiAgICByZXR1cm4gbmV3IGQzX2hzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sIC8gayk7XG4gIH07XG4gIGQzX2hzbFByb3RvdHlwZS5kYXJrZXIgPSBmdW5jdGlvbihrKSB7XG4gICAgayA9IE1hdGgucG93KC43LCBhcmd1bWVudHMubGVuZ3RoID8gayA6IDEpO1xuICAgIHJldHVybiBuZXcgZDNfaHNsKHRoaXMuaCwgdGhpcy5zLCBrICogdGhpcy5sKTtcbiAgfTtcbiAgZDNfaHNsUHJvdG90eXBlLnJnYiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19oc2xfcmdiKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwpO1xuICB9O1xuICBmdW5jdGlvbiBkM19oc2xfcmdiKGgsIHMsIGwpIHtcbiAgICB2YXIgbTEsIG0yO1xuICAgIGggPSBpc05hTihoKSA/IDAgOiAoaCAlPSAzNjApIDwgMCA/IGggKyAzNjAgOiBoO1xuICAgIHMgPSBpc05hTihzKSA/IDAgOiBzIDwgMCA/IDAgOiBzID4gMSA/IDEgOiBzO1xuICAgIGwgPSBsIDwgMCA/IDAgOiBsID4gMSA/IDEgOiBsO1xuICAgIG0yID0gbCA8PSAuNSA/IGwgKiAoMSArIHMpIDogbCArIHMgLSBsICogcztcbiAgICBtMSA9IDIgKiBsIC0gbTI7XG4gICAgZnVuY3Rpb24gdihoKSB7XG4gICAgICBpZiAoaCA+IDM2MCkgaCAtPSAzNjA7IGVsc2UgaWYgKGggPCAwKSBoICs9IDM2MDtcbiAgICAgIGlmIChoIDwgNjApIHJldHVybiBtMSArIChtMiAtIG0xKSAqIGggLyA2MDtcbiAgICAgIGlmIChoIDwgMTgwKSByZXR1cm4gbTI7XG4gICAgICBpZiAoaCA8IDI0MCkgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogKDI0MCAtIGgpIC8gNjA7XG4gICAgICByZXR1cm4gbTE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZ2KGgpIHtcbiAgICAgIHJldHVybiBNYXRoLnJvdW5kKHYoaCkgKiAyNTUpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IGQzX3JnYih2dihoICsgMTIwKSwgdnYoaCksIHZ2KGggLSAxMjApKTtcbiAgfVxuICBkMy5oY2wgPSBkM19oY2w7XG4gIGZ1bmN0aW9uIGQzX2hjbChoLCBjLCBsKSB7XG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBkM19oY2wgPyB2b2lkICh0aGlzLmggPSAraCwgdGhpcy5jID0gK2MsIHRoaXMubCA9ICtsKSA6IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gaCBpbnN0YW5jZW9mIGQzX2hjbCA/IG5ldyBkM19oY2woaC5oLCBoLmMsIGgubCkgOiBoIGluc3RhbmNlb2YgZDNfbGFiID8gZDNfbGFiX2hjbChoLmwsIGguYSwgaC5iKSA6IGQzX2xhYl9oY2woKGggPSBkM19yZ2JfbGFiKChoID0gZDMucmdiKGgpKS5yLCBoLmcsIGguYikpLmwsIGguYSwgaC5iKSA6IG5ldyBkM19oY2woaCwgYywgbCk7XG4gIH1cbiAgdmFyIGQzX2hjbFByb3RvdHlwZSA9IGQzX2hjbC5wcm90b3R5cGUgPSBuZXcgZDNfY29sb3IoKTtcbiAgZDNfaGNsUHJvdG90eXBlLmJyaWdodGVyID0gZnVuY3Rpb24oaykge1xuICAgIHJldHVybiBuZXcgZDNfaGNsKHRoaXMuaCwgdGhpcy5jLCBNYXRoLm1pbigxMDAsIHRoaXMubCArIGQzX2xhYl9LICogKGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSkpKTtcbiAgfTtcbiAgZDNfaGNsUHJvdG90eXBlLmRhcmtlciA9IGZ1bmN0aW9uKGspIHtcbiAgICByZXR1cm4gbmV3IGQzX2hjbCh0aGlzLmgsIHRoaXMuYywgTWF0aC5tYXgoMCwgdGhpcy5sIC0gZDNfbGFiX0sgKiAoYXJndW1lbnRzLmxlbmd0aCA/IGsgOiAxKSkpO1xuICB9O1xuICBkM19oY2xQcm90b3R5cGUucmdiID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzX2hjbF9sYWIodGhpcy5oLCB0aGlzLmMsIHRoaXMubCkucmdiKCk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2hjbF9sYWIoaCwgYywgbCkge1xuICAgIGlmIChpc05hTihoKSkgaCA9IDA7XG4gICAgaWYgKGlzTmFOKGMpKSBjID0gMDtcbiAgICByZXR1cm4gbmV3IGQzX2xhYihsLCBNYXRoLmNvcyhoICo9IGQzX3JhZGlhbnMpICogYywgTWF0aC5zaW4oaCkgKiBjKTtcbiAgfVxuICBkMy5sYWIgPSBkM19sYWI7XG4gIGZ1bmN0aW9uIGQzX2xhYihsLCBhLCBiKSB7XG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBkM19sYWIgPyB2b2lkICh0aGlzLmwgPSArbCwgdGhpcy5hID0gK2EsIHRoaXMuYiA9ICtiKSA6IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gbCBpbnN0YW5jZW9mIGQzX2xhYiA/IG5ldyBkM19sYWIobC5sLCBsLmEsIGwuYikgOiBsIGluc3RhbmNlb2YgZDNfaGNsID8gZDNfaGNsX2xhYihsLmgsIGwuYywgbC5sKSA6IGQzX3JnYl9sYWIoKGwgPSBkM19yZ2IobCkpLnIsIGwuZywgbC5iKSA6IG5ldyBkM19sYWIobCwgYSwgYik7XG4gIH1cbiAgdmFyIGQzX2xhYl9LID0gMTg7XG4gIHZhciBkM19sYWJfWCA9IC45NTA0NywgZDNfbGFiX1kgPSAxLCBkM19sYWJfWiA9IDEuMDg4ODM7XG4gIHZhciBkM19sYWJQcm90b3R5cGUgPSBkM19sYWIucHJvdG90eXBlID0gbmV3IGQzX2NvbG9yKCk7XG4gIGQzX2xhYlByb3RvdHlwZS5icmlnaHRlciA9IGZ1bmN0aW9uKGspIHtcbiAgICByZXR1cm4gbmV3IGQzX2xhYihNYXRoLm1pbigxMDAsIHRoaXMubCArIGQzX2xhYl9LICogKGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSkpLCB0aGlzLmEsIHRoaXMuYik7XG4gIH07XG4gIGQzX2xhYlByb3RvdHlwZS5kYXJrZXIgPSBmdW5jdGlvbihrKSB7XG4gICAgcmV0dXJuIG5ldyBkM19sYWIoTWF0aC5tYXgoMCwgdGhpcy5sIC0gZDNfbGFiX0sgKiAoYXJndW1lbnRzLmxlbmd0aCA/IGsgOiAxKSksIHRoaXMuYSwgdGhpcy5iKTtcbiAgfTtcbiAgZDNfbGFiUHJvdG90eXBlLnJnYiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19sYWJfcmdiKHRoaXMubCwgdGhpcy5hLCB0aGlzLmIpO1xuICB9O1xuICBmdW5jdGlvbiBkM19sYWJfcmdiKGwsIGEsIGIpIHtcbiAgICB2YXIgeSA9IChsICsgMTYpIC8gMTE2LCB4ID0geSArIGEgLyA1MDAsIHogPSB5IC0gYiAvIDIwMDtcbiAgICB4ID0gZDNfbGFiX3h5eih4KSAqIGQzX2xhYl9YO1xuICAgIHkgPSBkM19sYWJfeHl6KHkpICogZDNfbGFiX1k7XG4gICAgeiA9IGQzX2xhYl94eXooeikgKiBkM19sYWJfWjtcbiAgICByZXR1cm4gbmV3IGQzX3JnYihkM194eXpfcmdiKDMuMjQwNDU0MiAqIHggLSAxLjUzNzEzODUgKiB5IC0gLjQ5ODUzMTQgKiB6KSwgZDNfeHl6X3JnYigtLjk2OTI2NiAqIHggKyAxLjg3NjAxMDggKiB5ICsgLjA0MTU1NiAqIHopLCBkM194eXpfcmdiKC4wNTU2NDM0ICogeCAtIC4yMDQwMjU5ICogeSArIDEuMDU3MjI1MiAqIHopKTtcbiAgfVxuICBmdW5jdGlvbiBkM19sYWJfaGNsKGwsIGEsIGIpIHtcbiAgICByZXR1cm4gbCA+IDAgPyBuZXcgZDNfaGNsKE1hdGguYXRhbjIoYiwgYSkgKiBkM19kZWdyZWVzLCBNYXRoLnNxcnQoYSAqIGEgKyBiICogYiksIGwpIDogbmV3IGQzX2hjbChOYU4sIE5hTiwgbCk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGFiX3h5eih4KSB7XG4gICAgcmV0dXJuIHggPiAuMjA2ODkzMDM0ID8geCAqIHggKiB4IDogKHggLSA0IC8gMjkpIC8gNy43ODcwMzc7XG4gIH1cbiAgZnVuY3Rpb24gZDNfeHl6X2xhYih4KSB7XG4gICAgcmV0dXJuIHggPiAuMDA4ODU2ID8gTWF0aC5wb3coeCwgMSAvIDMpIDogNy43ODcwMzcgKiB4ICsgNCAvIDI5O1xuICB9XG4gIGZ1bmN0aW9uIGQzX3h5el9yZ2Iocikge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKDI1NSAqIChyIDw9IC4wMDMwNCA/IDEyLjkyICogciA6IDEuMDU1ICogTWF0aC5wb3cociwgMSAvIDIuNCkgLSAuMDU1KSk7XG4gIH1cbiAgZDMucmdiID0gZDNfcmdiO1xuICBmdW5jdGlvbiBkM19yZ2IociwgZywgYikge1xuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgZDNfcmdiID8gdm9pZCAodGhpcy5yID0gfn5yLCB0aGlzLmcgPSB+fmcsIHRoaXMuYiA9IH5+YikgOiBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IHIgaW5zdGFuY2VvZiBkM19yZ2IgPyBuZXcgZDNfcmdiKHIuciwgci5nLCByLmIpIDogZDNfcmdiX3BhcnNlKFwiXCIgKyByLCBkM19yZ2IsIGQzX2hzbF9yZ2IpIDogbmV3IGQzX3JnYihyLCBnLCBiKTtcbiAgfVxuICBmdW5jdGlvbiBkM19yZ2JOdW1iZXIodmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IGQzX3JnYih2YWx1ZSA+PiAxNiwgdmFsdWUgPj4gOCAmIDI1NSwgdmFsdWUgJiAyNTUpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3JnYlN0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiBkM19yZ2JOdW1iZXIodmFsdWUpICsgXCJcIjtcbiAgfVxuICB2YXIgZDNfcmdiUHJvdG90eXBlID0gZDNfcmdiLnByb3RvdHlwZSA9IG5ldyBkM19jb2xvcigpO1xuICBkM19yZ2JQcm90b3R5cGUuYnJpZ2h0ZXIgPSBmdW5jdGlvbihrKSB7XG4gICAgayA9IE1hdGgucG93KC43LCBhcmd1bWVudHMubGVuZ3RoID8gayA6IDEpO1xuICAgIHZhciByID0gdGhpcy5yLCBnID0gdGhpcy5nLCBiID0gdGhpcy5iLCBpID0gMzA7XG4gICAgaWYgKCFyICYmICFnICYmICFiKSByZXR1cm4gbmV3IGQzX3JnYihpLCBpLCBpKTtcbiAgICBpZiAociAmJiByIDwgaSkgciA9IGk7XG4gICAgaWYgKGcgJiYgZyA8IGkpIGcgPSBpO1xuICAgIGlmIChiICYmIGIgPCBpKSBiID0gaTtcbiAgICByZXR1cm4gbmV3IGQzX3JnYihNYXRoLm1pbigyNTUsIHIgLyBrKSwgTWF0aC5taW4oMjU1LCBnIC8gayksIE1hdGgubWluKDI1NSwgYiAvIGspKTtcbiAgfTtcbiAgZDNfcmdiUHJvdG90eXBlLmRhcmtlciA9IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gTWF0aC5wb3coLjcsIGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSk7XG4gICAgcmV0dXJuIG5ldyBkM19yZ2IoayAqIHRoaXMuciwgayAqIHRoaXMuZywgayAqIHRoaXMuYik7XG4gIH07XG4gIGQzX3JnYlByb3RvdHlwZS5oc2wgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDNfcmdiX2hzbCh0aGlzLnIsIHRoaXMuZywgdGhpcy5iKTtcbiAgfTtcbiAgZDNfcmdiUHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFwiI1wiICsgZDNfcmdiX2hleCh0aGlzLnIpICsgZDNfcmdiX2hleCh0aGlzLmcpICsgZDNfcmdiX2hleCh0aGlzLmIpO1xuICB9O1xuICBmdW5jdGlvbiBkM19yZ2JfaGV4KHYpIHtcbiAgICByZXR1cm4gdiA8IDE2ID8gXCIwXCIgKyBNYXRoLm1heCgwLCB2KS50b1N0cmluZygxNikgOiBNYXRoLm1pbigyNTUsIHYpLnRvU3RyaW5nKDE2KTtcbiAgfVxuICBmdW5jdGlvbiBkM19yZ2JfcGFyc2UoZm9ybWF0LCByZ2IsIGhzbCkge1xuICAgIHZhciByID0gMCwgZyA9IDAsIGIgPSAwLCBtMSwgbTIsIGNvbG9yO1xuICAgIG0xID0gLyhbYS16XSspXFwoKC4qKVxcKS8uZXhlYyhmb3JtYXQgPSBmb3JtYXQudG9Mb3dlckNhc2UoKSk7XG4gICAgaWYgKG0xKSB7XG4gICAgICBtMiA9IG0xWzJdLnNwbGl0KFwiLFwiKTtcbiAgICAgIHN3aXRjaCAobTFbMV0pIHtcbiAgICAgICBjYXNlIFwiaHNsXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gaHNsKHBhcnNlRmxvYXQobTJbMF0pLCBwYXJzZUZsb2F0KG0yWzFdKSAvIDEwMCwgcGFyc2VGbG9hdChtMlsyXSkgLyAxMDApO1xuICAgICAgICB9XG5cbiAgICAgICBjYXNlIFwicmdiXCI6XG4gICAgICAgIHtcbiAgICAgICAgICByZXR1cm4gcmdiKGQzX3JnYl9wYXJzZU51bWJlcihtMlswXSksIGQzX3JnYl9wYXJzZU51bWJlcihtMlsxXSksIGQzX3JnYl9wYXJzZU51bWJlcihtMlsyXSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb2xvciA9IGQzX3JnYl9uYW1lcy5nZXQoZm9ybWF0KSkge1xuICAgICAgcmV0dXJuIHJnYihjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iKTtcbiAgICB9XG4gICAgaWYgKGZvcm1hdCAhPSBudWxsICYmIGZvcm1hdC5jaGFyQXQoMCkgPT09IFwiI1wiICYmICFpc05hTihjb2xvciA9IHBhcnNlSW50KGZvcm1hdC5zbGljZSgxKSwgMTYpKSkge1xuICAgICAgaWYgKGZvcm1hdC5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgciA9IChjb2xvciAmIDM4NDApID4+IDQ7XG4gICAgICAgIHIgPSByID4+IDQgfCByO1xuICAgICAgICBnID0gY29sb3IgJiAyNDA7XG4gICAgICAgIGcgPSBnID4+IDQgfCBnO1xuICAgICAgICBiID0gY29sb3IgJiAxNTtcbiAgICAgICAgYiA9IGIgPDwgNCB8IGI7XG4gICAgICB9IGVsc2UgaWYgKGZvcm1hdC5sZW5ndGggPT09IDcpIHtcbiAgICAgICAgciA9IChjb2xvciAmIDE2NzExNjgwKSA+PiAxNjtcbiAgICAgICAgZyA9IChjb2xvciAmIDY1MjgwKSA+PiA4O1xuICAgICAgICBiID0gY29sb3IgJiAyNTU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZ2IociwgZywgYik7XG4gIH1cbiAgZnVuY3Rpb24gZDNfcmdiX2hzbChyLCBnLCBiKSB7XG4gICAgdmFyIG1pbiA9IE1hdGgubWluKHIgLz0gMjU1LCBnIC89IDI1NSwgYiAvPSAyNTUpLCBtYXggPSBNYXRoLm1heChyLCBnLCBiKSwgZCA9IG1heCAtIG1pbiwgaCwgcywgbCA9IChtYXggKyBtaW4pIC8gMjtcbiAgICBpZiAoZCkge1xuICAgICAgcyA9IGwgPCAuNSA/IGQgLyAobWF4ICsgbWluKSA6IGQgLyAoMiAtIG1heCAtIG1pbik7XG4gICAgICBpZiAociA9PSBtYXgpIGggPSAoZyAtIGIpIC8gZCArIChnIDwgYiA/IDYgOiAwKTsgZWxzZSBpZiAoZyA9PSBtYXgpIGggPSAoYiAtIHIpIC8gZCArIDI7IGVsc2UgaCA9IChyIC0gZykgLyBkICsgNDtcbiAgICAgIGggKj0gNjA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGggPSBOYU47XG4gICAgICBzID0gbCA+IDAgJiYgbCA8IDEgPyAwIDogaDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBkM19oc2woaCwgcywgbCk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfcmdiX2xhYihyLCBnLCBiKSB7XG4gICAgciA9IGQzX3JnYl94eXoocik7XG4gICAgZyA9IGQzX3JnYl94eXooZyk7XG4gICAgYiA9IGQzX3JnYl94eXooYik7XG4gICAgdmFyIHggPSBkM194eXpfbGFiKCguNDEyNDU2NCAqIHIgKyAuMzU3NTc2MSAqIGcgKyAuMTgwNDM3NSAqIGIpIC8gZDNfbGFiX1gpLCB5ID0gZDNfeHl6X2xhYigoLjIxMjY3MjkgKiByICsgLjcxNTE1MjIgKiBnICsgLjA3MjE3NSAqIGIpIC8gZDNfbGFiX1kpLCB6ID0gZDNfeHl6X2xhYigoLjAxOTMzMzkgKiByICsgLjExOTE5MiAqIGcgKyAuOTUwMzA0MSAqIGIpIC8gZDNfbGFiX1opO1xuICAgIHJldHVybiBkM19sYWIoMTE2ICogeSAtIDE2LCA1MDAgKiAoeCAtIHkpLCAyMDAgKiAoeSAtIHopKTtcbiAgfVxuICBmdW5jdGlvbiBkM19yZ2JfeHl6KHIpIHtcbiAgICByZXR1cm4gKHIgLz0gMjU1KSA8PSAuMDQwNDUgPyByIC8gMTIuOTIgOiBNYXRoLnBvdygociArIC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfcmdiX3BhcnNlTnVtYmVyKGMpIHtcbiAgICB2YXIgZiA9IHBhcnNlRmxvYXQoYyk7XG4gICAgcmV0dXJuIGMuY2hhckF0KGMubGVuZ3RoIC0gMSkgPT09IFwiJVwiID8gTWF0aC5yb3VuZChmICogMi41NSkgOiBmO1xuICB9XG4gIHZhciBkM19yZ2JfbmFtZXMgPSBkMy5tYXAoe1xuICAgIGFsaWNlYmx1ZTogMTU3OTIzODMsXG4gICAgYW50aXF1ZXdoaXRlOiAxNjQ0NDM3NSxcbiAgICBhcXVhOiA2NTUzNSxcbiAgICBhcXVhbWFyaW5lOiA4Mzg4NTY0LFxuICAgIGF6dXJlOiAxNTc5NDE3NSxcbiAgICBiZWlnZTogMTYxMTkyNjAsXG4gICAgYmlzcXVlOiAxNjc3MDI0NCxcbiAgICBibGFjazogMCxcbiAgICBibGFuY2hlZGFsbW9uZDogMTY3NzIwNDUsXG4gICAgYmx1ZTogMjU1LFxuICAgIGJsdWV2aW9sZXQ6IDkwNTUyMDIsXG4gICAgYnJvd246IDEwODI0MjM0LFxuICAgIGJ1cmx5d29vZDogMTQ1OTYyMzEsXG4gICAgY2FkZXRibHVlOiA2MjY2NTI4LFxuICAgIGNoYXJ0cmV1c2U6IDgzODgzNTIsXG4gICAgY2hvY29sYXRlOiAxMzc4OTQ3MCxcbiAgICBjb3JhbDogMTY3NDQyNzIsXG4gICAgY29ybmZsb3dlcmJsdWU6IDY1OTE5ODEsXG4gICAgY29ybnNpbGs6IDE2Nzc1Mzg4LFxuICAgIGNyaW1zb246IDE0NDIzMTAwLFxuICAgIGN5YW46IDY1NTM1LFxuICAgIGRhcmtibHVlOiAxMzksXG4gICAgZGFya2N5YW46IDM1NzIzLFxuICAgIGRhcmtnb2xkZW5yb2Q6IDEyMDkyOTM5LFxuICAgIGRhcmtncmF5OiAxMTExOTAxNyxcbiAgICBkYXJrZ3JlZW46IDI1NjAwLFxuICAgIGRhcmtncmV5OiAxMTExOTAxNyxcbiAgICBkYXJra2hha2k6IDEyNDMzMjU5LFxuICAgIGRhcmttYWdlbnRhOiA5MTA5NjQzLFxuICAgIGRhcmtvbGl2ZWdyZWVuOiA1NTk3OTk5LFxuICAgIGRhcmtvcmFuZ2U6IDE2NzQ3NTIwLFxuICAgIGRhcmtvcmNoaWQ6IDEwMDQwMDEyLFxuICAgIGRhcmtyZWQ6IDkxMDk1MDQsXG4gICAgZGFya3NhbG1vbjogMTUzMDg0MTAsXG4gICAgZGFya3NlYWdyZWVuOiA5NDE5OTE5LFxuICAgIGRhcmtzbGF0ZWJsdWU6IDQ3MzQzNDcsXG4gICAgZGFya3NsYXRlZ3JheTogMzEwMDQ5NSxcbiAgICBkYXJrc2xhdGVncmV5OiAzMTAwNDk1LFxuICAgIGRhcmt0dXJxdW9pc2U6IDUyOTQ1LFxuICAgIGRhcmt2aW9sZXQ6IDk2OTk1MzksXG4gICAgZGVlcHBpbms6IDE2NzE2OTQ3LFxuICAgIGRlZXBza3libHVlOiA0OTE1MSxcbiAgICBkaW1ncmF5OiA2OTA4MjY1LFxuICAgIGRpbWdyZXk6IDY5MDgyNjUsXG4gICAgZG9kZ2VyYmx1ZTogMjAwMzE5OSxcbiAgICBmaXJlYnJpY2s6IDExNjc0MTQ2LFxuICAgIGZsb3JhbHdoaXRlOiAxNjc3NTkyMCxcbiAgICBmb3Jlc3RncmVlbjogMjI2Mzg0MixcbiAgICBmdWNoc2lhOiAxNjcxMTkzNSxcbiAgICBnYWluc2Jvcm86IDE0NDc0NDYwLFxuICAgIGdob3N0d2hpdGU6IDE2MzE2NjcxLFxuICAgIGdvbGQ6IDE2NzY2NzIwLFxuICAgIGdvbGRlbnJvZDogMTQzMjkxMjAsXG4gICAgZ3JheTogODQyMTUwNCxcbiAgICBncmVlbjogMzI3NjgsXG4gICAgZ3JlZW55ZWxsb3c6IDExNDAzMDU1LFxuICAgIGdyZXk6IDg0MjE1MDQsXG4gICAgaG9uZXlkZXc6IDE1Nzk0MTYwLFxuICAgIGhvdHBpbms6IDE2NzM4NzQwLFxuICAgIGluZGlhbnJlZDogMTM0NTg1MjQsXG4gICAgaW5kaWdvOiA0OTE1MzMwLFxuICAgIGl2b3J5OiAxNjc3NzIwMCxcbiAgICBraGFraTogMTU3ODc2NjAsXG4gICAgbGF2ZW5kZXI6IDE1MTMyNDEwLFxuICAgIGxhdmVuZGVyYmx1c2g6IDE2NzczMzY1LFxuICAgIGxhd25ncmVlbjogODE5MDk3NixcbiAgICBsZW1vbmNoaWZmb246IDE2Nzc1ODg1LFxuICAgIGxpZ2h0Ymx1ZTogMTEzOTMyNTQsXG4gICAgbGlnaHRjb3JhbDogMTU3NjE1MzYsXG4gICAgbGlnaHRjeWFuOiAxNDc0NTU5OSxcbiAgICBsaWdodGdvbGRlbnJvZHllbGxvdzogMTY0NDgyMTAsXG4gICAgbGlnaHRncmF5OiAxMzg4MjMyMyxcbiAgICBsaWdodGdyZWVuOiA5NDk4MjU2LFxuICAgIGxpZ2h0Z3JleTogMTM4ODIzMjMsXG4gICAgbGlnaHRwaW5rOiAxNjc1ODQ2NSxcbiAgICBsaWdodHNhbG1vbjogMTY3NTI3NjIsXG4gICAgbGlnaHRzZWFncmVlbjogMjE0Mjg5MCxcbiAgICBsaWdodHNreWJsdWU6IDg5MDAzNDYsXG4gICAgbGlnaHRzbGF0ZWdyYXk6IDc4MzM3NTMsXG4gICAgbGlnaHRzbGF0ZWdyZXk6IDc4MzM3NTMsXG4gICAgbGlnaHRzdGVlbGJsdWU6IDExNTg0NzM0LFxuICAgIGxpZ2h0eWVsbG93OiAxNjc3NzE4NCxcbiAgICBsaW1lOiA2NTI4MCxcbiAgICBsaW1lZ3JlZW46IDMzMjkzMzAsXG4gICAgbGluZW46IDE2NDQ1NjcwLFxuICAgIG1hZ2VudGE6IDE2NzExOTM1LFxuICAgIG1hcm9vbjogODM4ODYwOCxcbiAgICBtZWRpdW1hcXVhbWFyaW5lOiA2NzM3MzIyLFxuICAgIG1lZGl1bWJsdWU6IDIwNSxcbiAgICBtZWRpdW1vcmNoaWQ6IDEyMjExNjY3LFxuICAgIG1lZGl1bXB1cnBsZTogOTY2MjY4MyxcbiAgICBtZWRpdW1zZWFncmVlbjogMzk3ODA5NyxcbiAgICBtZWRpdW1zbGF0ZWJsdWU6IDgwODc3OTAsXG4gICAgbWVkaXVtc3ByaW5nZ3JlZW46IDY0MTU0LFxuICAgIG1lZGl1bXR1cnF1b2lzZTogNDc3MjMwMCxcbiAgICBtZWRpdW12aW9sZXRyZWQ6IDEzMDQ3MTczLFxuICAgIG1pZG5pZ2h0Ymx1ZTogMTY0NDkxMixcbiAgICBtaW50Y3JlYW06IDE2MTIxODUwLFxuICAgIG1pc3R5cm9zZTogMTY3NzAyNzMsXG4gICAgbW9jY2FzaW46IDE2NzcwMjI5LFxuICAgIG5hdmFqb3doaXRlOiAxNjc2ODY4NSxcbiAgICBuYXZ5OiAxMjgsXG4gICAgb2xkbGFjZTogMTY2NDM1NTgsXG4gICAgb2xpdmU6IDg0MjEzNzYsXG4gICAgb2xpdmVkcmFiOiA3MDQ4NzM5LFxuICAgIG9yYW5nZTogMTY3NTM5MjAsXG4gICAgb3JhbmdlcmVkOiAxNjcyOTM0NCxcbiAgICBvcmNoaWQ6IDE0MzE1NzM0LFxuICAgIHBhbGVnb2xkZW5yb2Q6IDE1NjU3MTMwLFxuICAgIHBhbGVncmVlbjogMTAwMjU4ODAsXG4gICAgcGFsZXR1cnF1b2lzZTogMTE1Mjk5NjYsXG4gICAgcGFsZXZpb2xldHJlZDogMTQzODEyMDMsXG4gICAgcGFwYXlhd2hpcDogMTY3NzMwNzcsXG4gICAgcGVhY2hwdWZmOiAxNjc2NzY3MyxcbiAgICBwZXJ1OiAxMzQ2ODk5MSxcbiAgICBwaW5rOiAxNjc2MTAzNSxcbiAgICBwbHVtOiAxNDUyNDYzNyxcbiAgICBwb3dkZXJibHVlOiAxMTU5MTkxMCxcbiAgICBwdXJwbGU6IDgzODg3MzYsXG4gICAgcmViZWNjYXB1cnBsZTogNjY5Nzg4MSxcbiAgICByZWQ6IDE2NzExNjgwLFxuICAgIHJvc3licm93bjogMTIzNTc1MTksXG4gICAgcm95YWxibHVlOiA0Mjg2OTQ1LFxuICAgIHNhZGRsZWJyb3duOiA5MTI3MTg3LFxuICAgIHNhbG1vbjogMTY0MTY4ODIsXG4gICAgc2FuZHlicm93bjogMTYwMzI4NjQsXG4gICAgc2VhZ3JlZW46IDMwNTAzMjcsXG4gICAgc2Vhc2hlbGw6IDE2Nzc0NjM4LFxuICAgIHNpZW5uYTogMTA1MDY3OTcsXG4gICAgc2lsdmVyOiAxMjYzMjI1NixcbiAgICBza3libHVlOiA4OTAwMzMxLFxuICAgIHNsYXRlYmx1ZTogNjk3MDA2MSxcbiAgICBzbGF0ZWdyYXk6IDczNzI5NDQsXG4gICAgc2xhdGVncmV5OiA3MzcyOTQ0LFxuICAgIHNub3c6IDE2Nzc1OTMwLFxuICAgIHNwcmluZ2dyZWVuOiA2NTQwNyxcbiAgICBzdGVlbGJsdWU6IDQ2MjA5ODAsXG4gICAgdGFuOiAxMzgwODc4MCxcbiAgICB0ZWFsOiAzMjg5NixcbiAgICB0aGlzdGxlOiAxNDIwNDg4OCxcbiAgICB0b21hdG86IDE2NzM3MDk1LFxuICAgIHR1cnF1b2lzZTogNDI1MTg1NixcbiAgICB2aW9sZXQ6IDE1NjMxMDg2LFxuICAgIHdoZWF0OiAxNjExMzMzMSxcbiAgICB3aGl0ZTogMTY3NzcyMTUsXG4gICAgd2hpdGVzbW9rZTogMTYxMTkyODUsXG4gICAgeWVsbG93OiAxNjc3Njk2MCxcbiAgICB5ZWxsb3dncmVlbjogMTAxNDUwNzRcbiAgfSk7XG4gIGQzX3JnYl9uYW1lcy5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICBkM19yZ2JfbmFtZXMuc2V0KGtleSwgZDNfcmdiTnVtYmVyKHZhbHVlKSk7XG4gIH0pO1xuICBmdW5jdGlvbiBkM19mdW5jdG9yKHYpIHtcbiAgICByZXR1cm4gdHlwZW9mIHYgPT09IFwiZnVuY3Rpb25cIiA/IHYgOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB2O1xuICAgIH07XG4gIH1cbiAgZDMuZnVuY3RvciA9IGQzX2Z1bmN0b3I7XG4gIGQzLnhociA9IGQzX3hoclR5cGUoZDNfaWRlbnRpdHkpO1xuICBmdW5jdGlvbiBkM194aHJUeXBlKHJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHVybCwgbWltZVR5cGUsIGNhbGxiYWNrKSB7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMiAmJiB0eXBlb2YgbWltZVR5cGUgPT09IFwiZnVuY3Rpb25cIikgY2FsbGJhY2sgPSBtaW1lVHlwZSwgXG4gICAgICBtaW1lVHlwZSA9IG51bGw7XG4gICAgICByZXR1cm4gZDNfeGhyKHVybCwgbWltZVR5cGUsIHJlc3BvbnNlLCBjYWxsYmFjayk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkM194aHIodXJsLCBtaW1lVHlwZSwgcmVzcG9uc2UsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHhociA9IHt9LCBkaXNwYXRjaCA9IGQzLmRpc3BhdGNoKFwiYmVmb3Jlc2VuZFwiLCBcInByb2dyZXNzXCIsIFwibG9hZFwiLCBcImVycm9yXCIpLCBoZWFkZXJzID0ge30sIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKSwgcmVzcG9uc2VUeXBlID0gbnVsbDtcbiAgICBpZiAodGhpcy5YRG9tYWluUmVxdWVzdCAmJiAhKFwid2l0aENyZWRlbnRpYWxzXCIgaW4gcmVxdWVzdCkgJiYgL14oaHR0cChzKT86KT9cXC9cXC8vLnRlc3QodXJsKSkgcmVxdWVzdCA9IG5ldyBYRG9tYWluUmVxdWVzdCgpO1xuICAgIFwib25sb2FkXCIgaW4gcmVxdWVzdCA/IHJlcXVlc3Qub25sb2FkID0gcmVxdWVzdC5vbmVycm9yID0gcmVzcG9uZCA6IHJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXF1ZXN0LnJlYWR5U3RhdGUgPiAzICYmIHJlc3BvbmQoKTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIHJlc3BvbmQoKSB7XG4gICAgICB2YXIgc3RhdHVzID0gcmVxdWVzdC5zdGF0dXMsIHJlc3VsdDtcbiAgICAgIGlmICghc3RhdHVzICYmIGQzX3hockhhc1Jlc3BvbnNlKHJlcXVlc3QpIHx8IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0ID0gcmVzcG9uc2UuY2FsbCh4aHIsIHJlcXVlc3QpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZGlzcGF0Y2guZXJyb3IuY2FsbCh4aHIsIGUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkaXNwYXRjaC5sb2FkLmNhbGwoeGhyLCByZXN1bHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlzcGF0Y2guZXJyb3IuY2FsbCh4aHIsIHJlcXVlc3QpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXF1ZXN0Lm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgdmFyIG8gPSBkMy5ldmVudDtcbiAgICAgIGQzLmV2ZW50ID0gZXZlbnQ7XG4gICAgICB0cnkge1xuICAgICAgICBkaXNwYXRjaC5wcm9ncmVzcy5jYWxsKHhociwgcmVxdWVzdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBkMy5ldmVudCA9IG87XG4gICAgICB9XG4gICAgfTtcbiAgICB4aHIuaGVhZGVyID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICAgIG5hbWUgPSAobmFtZSArIFwiXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiBoZWFkZXJzW25hbWVdO1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIGRlbGV0ZSBoZWFkZXJzW25hbWVdOyBlbHNlIGhlYWRlcnNbbmFtZV0gPSB2YWx1ZSArIFwiXCI7XG4gICAgICByZXR1cm4geGhyO1xuICAgIH07XG4gICAgeGhyLm1pbWVUeXBlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG1pbWVUeXBlO1xuICAgICAgbWltZVR5cGUgPSB2YWx1ZSA9PSBudWxsID8gbnVsbCA6IHZhbHVlICsgXCJcIjtcbiAgICAgIHJldHVybiB4aHI7XG4gICAgfTtcbiAgICB4aHIucmVzcG9uc2VUeXBlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJlc3BvbnNlVHlwZTtcbiAgICAgIHJlc3BvbnNlVHlwZSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHhocjtcbiAgICB9O1xuICAgIHhoci5yZXNwb25zZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXNwb25zZSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHhocjtcbiAgICB9O1xuICAgIFsgXCJnZXRcIiwgXCJwb3N0XCIgXS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgeGhyW21ldGhvZF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHhoci5zZW5kLmFwcGx5KHhociwgWyBtZXRob2QgXS5jb25jYXQoZDNfYXJyYXkoYXJndW1lbnRzKSkpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgICB4aHIuc2VuZCA9IGZ1bmN0aW9uKG1ldGhvZCwgZGF0YSwgY2FsbGJhY2spIHtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBkYXRhID09PSBcImZ1bmN0aW9uXCIpIGNhbGxiYWNrID0gZGF0YSwgZGF0YSA9IG51bGw7XG4gICAgICByZXF1ZXN0Lm9wZW4obWV0aG9kLCB1cmwsIHRydWUpO1xuICAgICAgaWYgKG1pbWVUeXBlICE9IG51bGwgJiYgIShcImFjY2VwdFwiIGluIGhlYWRlcnMpKSBoZWFkZXJzW1wiYWNjZXB0XCJdID0gbWltZVR5cGUgKyBcIiwqLypcIjtcbiAgICAgIGlmIChyZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIpIGZvciAodmFyIG5hbWUgaW4gaGVhZGVycykgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIGhlYWRlcnNbbmFtZV0pO1xuICAgICAgaWYgKG1pbWVUeXBlICE9IG51bGwgJiYgcmVxdWVzdC5vdmVycmlkZU1pbWVUeXBlKSByZXF1ZXN0Lm92ZXJyaWRlTWltZVR5cGUobWltZVR5cGUpO1xuICAgICAgaWYgKHJlc3BvbnNlVHlwZSAhPSBudWxsKSByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZTtcbiAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB4aHIub24oXCJlcnJvclwiLCBjYWxsYmFjaykub24oXCJsb2FkXCIsIGZ1bmN0aW9uKHJlcXVlc3QpIHtcbiAgICAgICAgY2FsbGJhY2sobnVsbCwgcmVxdWVzdCk7XG4gICAgICB9KTtcbiAgICAgIGRpc3BhdGNoLmJlZm9yZXNlbmQuY2FsbCh4aHIsIHJlcXVlc3QpO1xuICAgICAgcmVxdWVzdC5zZW5kKGRhdGEgPT0gbnVsbCA/IG51bGwgOiBkYXRhKTtcbiAgICAgIHJldHVybiB4aHI7XG4gICAgfTtcbiAgICB4aHIuYWJvcnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlcXVlc3QuYWJvcnQoKTtcbiAgICAgIHJldHVybiB4aHI7XG4gICAgfTtcbiAgICBkMy5yZWJpbmQoeGhyLCBkaXNwYXRjaCwgXCJvblwiKTtcbiAgICByZXR1cm4gY2FsbGJhY2sgPT0gbnVsbCA/IHhociA6IHhoci5nZXQoZDNfeGhyX2ZpeENhbGxiYWNrKGNhbGxiYWNrKSk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfeGhyX2ZpeENhbGxiYWNrKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrLmxlbmd0aCA9PT0gMSA/IGZ1bmN0aW9uKGVycm9yLCByZXF1ZXN0KSB7XG4gICAgICBjYWxsYmFjayhlcnJvciA9PSBudWxsID8gcmVxdWVzdCA6IG51bGwpO1xuICAgIH0gOiBjYWxsYmFjaztcbiAgfVxuICBmdW5jdGlvbiBkM194aHJIYXNSZXNwb25zZShyZXF1ZXN0KSB7XG4gICAgdmFyIHR5cGUgPSByZXF1ZXN0LnJlc3BvbnNlVHlwZTtcbiAgICByZXR1cm4gdHlwZSAmJiB0eXBlICE9PSBcInRleHRcIiA/IHJlcXVlc3QucmVzcG9uc2UgOiByZXF1ZXN0LnJlc3BvbnNlVGV4dDtcbiAgfVxuICBkMy5kc3YgPSBmdW5jdGlvbihkZWxpbWl0ZXIsIG1pbWVUeXBlKSB7XG4gICAgdmFyIHJlRm9ybWF0ID0gbmV3IFJlZ0V4cCgnW1wiJyArIGRlbGltaXRlciArIFwiXFxuXVwiKSwgZGVsaW1pdGVyQ29kZSA9IGRlbGltaXRlci5jaGFyQ29kZUF0KDApO1xuICAgIGZ1bmN0aW9uIGRzdih1cmwsIHJvdywgY2FsbGJhY2spIHtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgY2FsbGJhY2sgPSByb3csIHJvdyA9IG51bGw7XG4gICAgICB2YXIgeGhyID0gZDNfeGhyKHVybCwgbWltZVR5cGUsIHJvdyA9PSBudWxsID8gcmVzcG9uc2UgOiB0eXBlZFJlc3BvbnNlKHJvdyksIGNhbGxiYWNrKTtcbiAgICAgIHhoci5yb3cgPSBmdW5jdGlvbihfKSB7XG4gICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8geGhyLnJlc3BvbnNlKChyb3cgPSBfKSA9PSBudWxsID8gcmVzcG9uc2UgOiB0eXBlZFJlc3BvbnNlKF8pKSA6IHJvdztcbiAgICAgIH07XG4gICAgICByZXR1cm4geGhyO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXNwb25zZShyZXF1ZXN0KSB7XG4gICAgICByZXR1cm4gZHN2LnBhcnNlKHJlcXVlc3QucmVzcG9uc2VUZXh0KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdHlwZWRSZXNwb25zZShmKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocmVxdWVzdCkge1xuICAgICAgICByZXR1cm4gZHN2LnBhcnNlKHJlcXVlc3QucmVzcG9uc2VUZXh0LCBmKTtcbiAgICAgIH07XG4gICAgfVxuICAgIGRzdi5wYXJzZSA9IGZ1bmN0aW9uKHRleHQsIGYpIHtcbiAgICAgIHZhciBvO1xuICAgICAgcmV0dXJuIGRzdi5wYXJzZVJvd3ModGV4dCwgZnVuY3Rpb24ocm93LCBpKSB7XG4gICAgICAgIGlmIChvKSByZXR1cm4gbyhyb3csIGkgLSAxKTtcbiAgICAgICAgdmFyIGEgPSBuZXcgRnVuY3Rpb24oXCJkXCIsIFwicmV0dXJuIHtcIiArIHJvdy5tYXAoZnVuY3Rpb24obmFtZSwgaSkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShuYW1lKSArIFwiOiBkW1wiICsgaSArIFwiXVwiO1xuICAgICAgICB9KS5qb2luKFwiLFwiKSArIFwifVwiKTtcbiAgICAgICAgbyA9IGYgPyBmdW5jdGlvbihyb3csIGkpIHtcbiAgICAgICAgICByZXR1cm4gZihhKHJvdyksIGkpO1xuICAgICAgICB9IDogYTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgZHN2LnBhcnNlUm93cyA9IGZ1bmN0aW9uKHRleHQsIGYpIHtcbiAgICAgIHZhciBFT0wgPSB7fSwgRU9GID0ge30sIHJvd3MgPSBbXSwgTiA9IHRleHQubGVuZ3RoLCBJID0gMCwgbiA9IDAsIHQsIGVvbDtcbiAgICAgIGZ1bmN0aW9uIHRva2VuKCkge1xuICAgICAgICBpZiAoSSA+PSBOKSByZXR1cm4gRU9GO1xuICAgICAgICBpZiAoZW9sKSByZXR1cm4gZW9sID0gZmFsc2UsIEVPTDtcbiAgICAgICAgdmFyIGogPSBJO1xuICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGopID09PSAzNCkge1xuICAgICAgICAgIHZhciBpID0gajtcbiAgICAgICAgICB3aGlsZSAoaSsrIDwgTikge1xuICAgICAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChpKSA9PT0gMzQpIHtcbiAgICAgICAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChpICsgMSkgIT09IDM0KSBicmVhaztcbiAgICAgICAgICAgICAgKytpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBJID0gaSArIDI7XG4gICAgICAgICAgdmFyIGMgPSB0ZXh0LmNoYXJDb2RlQXQoaSArIDEpO1xuICAgICAgICAgIGlmIChjID09PSAxMykge1xuICAgICAgICAgICAgZW9sID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaSArIDIpID09PSAxMCkgKytJO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PT0gMTApIHtcbiAgICAgICAgICAgIGVvbCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKGogKyAxLCBpKS5yZXBsYWNlKC9cIlwiL2csICdcIicpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChJIDwgTikge1xuICAgICAgICAgIHZhciBjID0gdGV4dC5jaGFyQ29kZUF0KEkrKyksIGsgPSAxO1xuICAgICAgICAgIGlmIChjID09PSAxMCkgZW9sID0gdHJ1ZTsgZWxzZSBpZiAoYyA9PT0gMTMpIHtcbiAgICAgICAgICAgIGVvbCA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KEkpID09PSAxMCkgKytJLCArK2s7XG4gICAgICAgICAgfSBlbHNlIGlmIChjICE9PSBkZWxpbWl0ZXJDb2RlKSBjb250aW51ZTtcbiAgICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqLCBJIC0gayk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQuc2xpY2Uoaik7XG4gICAgICB9XG4gICAgICB3aGlsZSAoKHQgPSB0b2tlbigpKSAhPT0gRU9GKSB7XG4gICAgICAgIHZhciBhID0gW107XG4gICAgICAgIHdoaWxlICh0ICE9PSBFT0wgJiYgdCAhPT0gRU9GKSB7XG4gICAgICAgICAgYS5wdXNoKHQpO1xuICAgICAgICAgIHQgPSB0b2tlbigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmICYmIChhID0gZihhLCBuKyspKSA9PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgcm93cy5wdXNoKGEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJvd3M7XG4gICAgfTtcbiAgICBkc3YuZm9ybWF0ID0gZnVuY3Rpb24ocm93cykge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkocm93c1swXSkpIHJldHVybiBkc3YuZm9ybWF0Um93cyhyb3dzKTtcbiAgICAgIHZhciBmaWVsZFNldCA9IG5ldyBkM19TZXQoKSwgZmllbGRzID0gW107XG4gICAgICByb3dzLmZvckVhY2goZnVuY3Rpb24ocm93KSB7XG4gICAgICAgIGZvciAodmFyIGZpZWxkIGluIHJvdykge1xuICAgICAgICAgIGlmICghZmllbGRTZXQuaGFzKGZpZWxkKSkge1xuICAgICAgICAgICAgZmllbGRzLnB1c2goZmllbGRTZXQuYWRkKGZpZWxkKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBbIGZpZWxkcy5tYXAoZm9ybWF0VmFsdWUpLmpvaW4oZGVsaW1pdGVyKSBdLmNvbmNhdChyb3dzLm1hcChmdW5jdGlvbihyb3cpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkcy5tYXAoZnVuY3Rpb24oZmllbGQpIHtcbiAgICAgICAgICByZXR1cm4gZm9ybWF0VmFsdWUocm93W2ZpZWxkXSk7XG4gICAgICAgIH0pLmpvaW4oZGVsaW1pdGVyKTtcbiAgICAgIH0pKS5qb2luKFwiXFxuXCIpO1xuICAgIH07XG4gICAgZHN2LmZvcm1hdFJvd3MgPSBmdW5jdGlvbihyb3dzKSB7XG4gICAgICByZXR1cm4gcm93cy5tYXAoZm9ybWF0Um93KS5qb2luKFwiXFxuXCIpO1xuICAgIH07XG4gICAgZnVuY3Rpb24gZm9ybWF0Um93KHJvdykge1xuICAgICAgcmV0dXJuIHJvdy5tYXAoZm9ybWF0VmFsdWUpLmpvaW4oZGVsaW1pdGVyKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZm9ybWF0VmFsdWUodGV4dCkge1xuICAgICAgcmV0dXJuIHJlRm9ybWF0LnRlc3QodGV4dCkgPyAnXCInICsgdGV4dC5yZXBsYWNlKC9cXFwiL2csICdcIlwiJykgKyAnXCInIDogdGV4dDtcbiAgICB9XG4gICAgcmV0dXJuIGRzdjtcbiAgfTtcbiAgZDMuY3N2ID0gZDMuZHN2KFwiLFwiLCBcInRleHQvY3N2XCIpO1xuICBkMy50c3YgPSBkMy5kc3YoXCJcdFwiLCBcInRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXNcIik7XG4gIHZhciBkM190aW1lcl9xdWV1ZUhlYWQsIGQzX3RpbWVyX3F1ZXVlVGFpbCwgZDNfdGltZXJfaW50ZXJ2YWwsIGQzX3RpbWVyX3RpbWVvdXQsIGQzX3RpbWVyX2ZyYW1lID0gdGhpc1tkM192ZW5kb3JTeW1ib2wodGhpcywgXCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIildIHx8IGZ1bmN0aW9uKGNhbGxiYWNrKSB7XG4gICAgc2V0VGltZW91dChjYWxsYmFjaywgMTcpO1xuICB9O1xuICBkMy50aW1lciA9IGZ1bmN0aW9uKCkge1xuICAgIGQzX3RpbWVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3RpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGhlbikge1xuICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBpZiAobiA8IDIpIGRlbGF5ID0gMDtcbiAgICBpZiAobiA8IDMpIHRoZW4gPSBEYXRlLm5vdygpO1xuICAgIHZhciB0aW1lID0gdGhlbiArIGRlbGF5LCB0aW1lciA9IHtcbiAgICAgIGM6IGNhbGxiYWNrLFxuICAgICAgdDogdGltZSxcbiAgICAgIG46IG51bGxcbiAgICB9O1xuICAgIGlmIChkM190aW1lcl9xdWV1ZVRhaWwpIGQzX3RpbWVyX3F1ZXVlVGFpbC5uID0gdGltZXI7IGVsc2UgZDNfdGltZXJfcXVldWVIZWFkID0gdGltZXI7XG4gICAgZDNfdGltZXJfcXVldWVUYWlsID0gdGltZXI7XG4gICAgaWYgKCFkM190aW1lcl9pbnRlcnZhbCkge1xuICAgICAgZDNfdGltZXJfdGltZW91dCA9IGNsZWFyVGltZW91dChkM190aW1lcl90aW1lb3V0KTtcbiAgICAgIGQzX3RpbWVyX2ludGVydmFsID0gMTtcbiAgICAgIGQzX3RpbWVyX2ZyYW1lKGQzX3RpbWVyX3N0ZXApO1xuICAgIH1cbiAgICByZXR1cm4gdGltZXI7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdGltZXJfc3RlcCgpIHtcbiAgICB2YXIgbm93ID0gZDNfdGltZXJfbWFyaygpLCBkZWxheSA9IGQzX3RpbWVyX3N3ZWVwKCkgLSBub3c7XG4gICAgaWYgKGRlbGF5ID4gMjQpIHtcbiAgICAgIGlmIChpc0Zpbml0ZShkZWxheSkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGQzX3RpbWVyX3RpbWVvdXQpO1xuICAgICAgICBkM190aW1lcl90aW1lb3V0ID0gc2V0VGltZW91dChkM190aW1lcl9zdGVwLCBkZWxheSk7XG4gICAgICB9XG4gICAgICBkM190aW1lcl9pbnRlcnZhbCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGQzX3RpbWVyX2ludGVydmFsID0gMTtcbiAgICAgIGQzX3RpbWVyX2ZyYW1lKGQzX3RpbWVyX3N0ZXApO1xuICAgIH1cbiAgfVxuICBkMy50aW1lci5mbHVzaCA9IGZ1bmN0aW9uKCkge1xuICAgIGQzX3RpbWVyX21hcmsoKTtcbiAgICBkM190aW1lcl9zd2VlcCgpO1xuICB9O1xuICBmdW5jdGlvbiBkM190aW1lcl9tYXJrKCkge1xuICAgIHZhciBub3cgPSBEYXRlLm5vdygpLCB0aW1lciA9IGQzX3RpbWVyX3F1ZXVlSGVhZDtcbiAgICB3aGlsZSAodGltZXIpIHtcbiAgICAgIGlmIChub3cgPj0gdGltZXIudCAmJiB0aW1lci5jKG5vdyAtIHRpbWVyLnQpKSB0aW1lci5jID0gbnVsbDtcbiAgICAgIHRpbWVyID0gdGltZXIubjtcbiAgICB9XG4gICAgcmV0dXJuIG5vdztcbiAgfVxuICBmdW5jdGlvbiBkM190aW1lcl9zd2VlcCgpIHtcbiAgICB2YXIgdDAsIHQxID0gZDNfdGltZXJfcXVldWVIZWFkLCB0aW1lID0gSW5maW5pdHk7XG4gICAgd2hpbGUgKHQxKSB7XG4gICAgICBpZiAodDEuYykge1xuICAgICAgICBpZiAodDEudCA8IHRpbWUpIHRpbWUgPSB0MS50O1xuICAgICAgICB0MSA9ICh0MCA9IHQxKS5uO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdDEgPSB0MCA/IHQwLm4gPSB0MS5uIDogZDNfdGltZXJfcXVldWVIZWFkID0gdDEubjtcbiAgICAgIH1cbiAgICB9XG4gICAgZDNfdGltZXJfcXVldWVUYWlsID0gdDA7XG4gICAgcmV0dXJuIHRpbWU7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZm9ybWF0X3ByZWNpc2lvbih4LCBwKSB7XG4gICAgcmV0dXJuIHAgLSAoeCA/IE1hdGguY2VpbChNYXRoLmxvZyh4KSAvIE1hdGguTE4xMCkgOiAxKTtcbiAgfVxuICBkMy5yb3VuZCA9IGZ1bmN0aW9uKHgsIG4pIHtcbiAgICByZXR1cm4gbiA/IE1hdGgucm91bmQoeCAqIChuID0gTWF0aC5wb3coMTAsIG4pKSkgLyBuIDogTWF0aC5yb3VuZCh4KTtcbiAgfTtcbiAgdmFyIGQzX2Zvcm1hdFByZWZpeGVzID0gWyBcInlcIiwgXCJ6XCIsIFwiYVwiLCBcImZcIiwgXCJwXCIsIFwiblwiLCBcIsK1XCIsIFwibVwiLCBcIlwiLCBcImtcIiwgXCJNXCIsIFwiR1wiLCBcIlRcIiwgXCJQXCIsIFwiRVwiLCBcIlpcIiwgXCJZXCIgXS5tYXAoZDNfZm9ybWF0UHJlZml4KTtcbiAgZDMuZm9ybWF0UHJlZml4ID0gZnVuY3Rpb24odmFsdWUsIHByZWNpc2lvbikge1xuICAgIHZhciBpID0gMDtcbiAgICBpZiAodmFsdWUgPSArdmFsdWUpIHtcbiAgICAgIGlmICh2YWx1ZSA8IDApIHZhbHVlICo9IC0xO1xuICAgICAgaWYgKHByZWNpc2lvbikgdmFsdWUgPSBkMy5yb3VuZCh2YWx1ZSwgZDNfZm9ybWF0X3ByZWNpc2lvbih2YWx1ZSwgcHJlY2lzaW9uKSk7XG4gICAgICBpID0gMSArIE1hdGguZmxvb3IoMWUtMTIgKyBNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMTApO1xuICAgICAgaSA9IE1hdGgubWF4KC0yNCwgTWF0aC5taW4oMjQsIE1hdGguZmxvb3IoKGkgLSAxKSAvIDMpICogMykpO1xuICAgIH1cbiAgICByZXR1cm4gZDNfZm9ybWF0UHJlZml4ZXNbOCArIGkgLyAzXTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfZm9ybWF0UHJlZml4KGQsIGkpIHtcbiAgICB2YXIgayA9IE1hdGgucG93KDEwLCBhYnMoOCAtIGkpICogMyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjYWxlOiBpID4gOCA/IGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgcmV0dXJuIGQgLyBrO1xuICAgICAgfSA6IGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgcmV0dXJuIGQgKiBrO1xuICAgICAgfSxcbiAgICAgIHN5bWJvbDogZFxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZDNfbG9jYWxlX251bWJlckZvcm1hdChsb2NhbGUpIHtcbiAgICB2YXIgbG9jYWxlX2RlY2ltYWwgPSBsb2NhbGUuZGVjaW1hbCwgbG9jYWxlX3Rob3VzYW5kcyA9IGxvY2FsZS50aG91c2FuZHMsIGxvY2FsZV9ncm91cGluZyA9IGxvY2FsZS5ncm91cGluZywgbG9jYWxlX2N1cnJlbmN5ID0gbG9jYWxlLmN1cnJlbmN5LCBmb3JtYXRHcm91cCA9IGxvY2FsZV9ncm91cGluZyAmJiBsb2NhbGVfdGhvdXNhbmRzID8gZnVuY3Rpb24odmFsdWUsIHdpZHRoKSB7XG4gICAgICB2YXIgaSA9IHZhbHVlLmxlbmd0aCwgdCA9IFtdLCBqID0gMCwgZyA9IGxvY2FsZV9ncm91cGluZ1swXSwgbGVuZ3RoID0gMDtcbiAgICAgIHdoaWxlIChpID4gMCAmJiBnID4gMCkge1xuICAgICAgICBpZiAobGVuZ3RoICsgZyArIDEgPiB3aWR0aCkgZyA9IE1hdGgubWF4KDEsIHdpZHRoIC0gbGVuZ3RoKTtcbiAgICAgICAgdC5wdXNoKHZhbHVlLnN1YnN0cmluZyhpIC09IGcsIGkgKyBnKSk7XG4gICAgICAgIGlmICgobGVuZ3RoICs9IGcgKyAxKSA+IHdpZHRoKSBicmVhaztcbiAgICAgICAgZyA9IGxvY2FsZV9ncm91cGluZ1tqID0gKGogKyAxKSAlIGxvY2FsZV9ncm91cGluZy5sZW5ndGhdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHQucmV2ZXJzZSgpLmpvaW4obG9jYWxlX3Rob3VzYW5kcyk7XG4gICAgfSA6IGQzX2lkZW50aXR5O1xuICAgIHJldHVybiBmdW5jdGlvbihzcGVjaWZpZXIpIHtcbiAgICAgIHZhciBtYXRjaCA9IGQzX2Zvcm1hdF9yZS5leGVjKHNwZWNpZmllciksIGZpbGwgPSBtYXRjaFsxXSB8fCBcIiBcIiwgYWxpZ24gPSBtYXRjaFsyXSB8fCBcIj5cIiwgc2lnbiA9IG1hdGNoWzNdIHx8IFwiLVwiLCBzeW1ib2wgPSBtYXRjaFs0XSB8fCBcIlwiLCB6ZmlsbCA9IG1hdGNoWzVdLCB3aWR0aCA9ICttYXRjaFs2XSwgY29tbWEgPSBtYXRjaFs3XSwgcHJlY2lzaW9uID0gbWF0Y2hbOF0sIHR5cGUgPSBtYXRjaFs5XSwgc2NhbGUgPSAxLCBwcmVmaXggPSBcIlwiLCBzdWZmaXggPSBcIlwiLCBpbnRlZ2VyID0gZmFsc2UsIGV4cG9uZW50ID0gdHJ1ZTtcbiAgICAgIGlmIChwcmVjaXNpb24pIHByZWNpc2lvbiA9ICtwcmVjaXNpb24uc3Vic3RyaW5nKDEpO1xuICAgICAgaWYgKHpmaWxsIHx8IGZpbGwgPT09IFwiMFwiICYmIGFsaWduID09PSBcIj1cIikge1xuICAgICAgICB6ZmlsbCA9IGZpbGwgPSBcIjBcIjtcbiAgICAgICAgYWxpZ24gPSBcIj1cIjtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgIGNhc2UgXCJuXCI6XG4gICAgICAgIGNvbW1hID0gdHJ1ZTtcbiAgICAgICAgdHlwZSA9IFwiZ1wiO1xuICAgICAgICBicmVhaztcblxuICAgICAgIGNhc2UgXCIlXCI6XG4gICAgICAgIHNjYWxlID0gMTAwO1xuICAgICAgICBzdWZmaXggPSBcIiVcIjtcbiAgICAgICAgdHlwZSA9IFwiZlwiO1xuICAgICAgICBicmVhaztcblxuICAgICAgIGNhc2UgXCJwXCI6XG4gICAgICAgIHNjYWxlID0gMTAwO1xuICAgICAgICBzdWZmaXggPSBcIiVcIjtcbiAgICAgICAgdHlwZSA9IFwiclwiO1xuICAgICAgICBicmVhaztcblxuICAgICAgIGNhc2UgXCJiXCI6XG4gICAgICAgY2FzZSBcIm9cIjpcbiAgICAgICBjYXNlIFwieFwiOlxuICAgICAgIGNhc2UgXCJYXCI6XG4gICAgICAgIGlmIChzeW1ib2wgPT09IFwiI1wiKSBwcmVmaXggPSBcIjBcIiArIHR5cGUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgIGV4cG9uZW50ID0gZmFsc2U7XG5cbiAgICAgICBjYXNlIFwiZFwiOlxuICAgICAgICBpbnRlZ2VyID0gdHJ1ZTtcbiAgICAgICAgcHJlY2lzaW9uID0gMDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgICBjYXNlIFwic1wiOlxuICAgICAgICBzY2FsZSA9IC0xO1xuICAgICAgICB0eXBlID0gXCJyXCI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKHN5bWJvbCA9PT0gXCIkXCIpIHByZWZpeCA9IGxvY2FsZV9jdXJyZW5jeVswXSwgc3VmZml4ID0gbG9jYWxlX2N1cnJlbmN5WzFdO1xuICAgICAgaWYgKHR5cGUgPT0gXCJyXCIgJiYgIXByZWNpc2lvbikgdHlwZSA9IFwiZ1wiO1xuICAgICAgaWYgKHByZWNpc2lvbiAhPSBudWxsKSB7XG4gICAgICAgIGlmICh0eXBlID09IFwiZ1wiKSBwcmVjaXNpb24gPSBNYXRoLm1heCgxLCBNYXRoLm1pbigyMSwgcHJlY2lzaW9uKSk7IGVsc2UgaWYgKHR5cGUgPT0gXCJlXCIgfHwgdHlwZSA9PSBcImZcIikgcHJlY2lzaW9uID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjAsIHByZWNpc2lvbikpO1xuICAgICAgfVxuICAgICAgdHlwZSA9IGQzX2Zvcm1hdF90eXBlcy5nZXQodHlwZSkgfHwgZDNfZm9ybWF0X3R5cGVEZWZhdWx0O1xuICAgICAgdmFyIHpjb21tYSA9IHpmaWxsICYmIGNvbW1hO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIHZhciBmdWxsU3VmZml4ID0gc3VmZml4O1xuICAgICAgICBpZiAoaW50ZWdlciAmJiB2YWx1ZSAlIDEpIHJldHVybiBcIlwiO1xuICAgICAgICB2YXIgbmVnYXRpdmUgPSB2YWx1ZSA8IDAgfHwgdmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCA/ICh2YWx1ZSA9IC12YWx1ZSwgXCItXCIpIDogc2lnbiA9PT0gXCItXCIgPyBcIlwiIDogc2lnbjtcbiAgICAgICAgaWYgKHNjYWxlIDwgMCkge1xuICAgICAgICAgIHZhciB1bml0ID0gZDMuZm9ybWF0UHJlZml4KHZhbHVlLCBwcmVjaXNpb24pO1xuICAgICAgICAgIHZhbHVlID0gdW5pdC5zY2FsZSh2YWx1ZSk7XG4gICAgICAgICAgZnVsbFN1ZmZpeCA9IHVuaXQuc3ltYm9sICsgc3VmZml4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlICo9IHNjYWxlO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdHlwZSh2YWx1ZSwgcHJlY2lzaW9uKTtcbiAgICAgICAgdmFyIGkgPSB2YWx1ZS5sYXN0SW5kZXhPZihcIi5cIiksIGJlZm9yZSwgYWZ0ZXI7XG4gICAgICAgIGlmIChpIDwgMCkge1xuICAgICAgICAgIHZhciBqID0gZXhwb25lbnQgPyB2YWx1ZS5sYXN0SW5kZXhPZihcImVcIikgOiAtMTtcbiAgICAgICAgICBpZiAoaiA8IDApIGJlZm9yZSA9IHZhbHVlLCBhZnRlciA9IFwiXCI7IGVsc2UgYmVmb3JlID0gdmFsdWUuc3Vic3RyaW5nKDAsIGopLCBhZnRlciA9IHZhbHVlLnN1YnN0cmluZyhqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBiZWZvcmUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgaSk7XG4gICAgICAgICAgYWZ0ZXIgPSBsb2NhbGVfZGVjaW1hbCArIHZhbHVlLnN1YnN0cmluZyhpICsgMSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF6ZmlsbCAmJiBjb21tYSkgYmVmb3JlID0gZm9ybWF0R3JvdXAoYmVmb3JlLCBJbmZpbml0eSk7XG4gICAgICAgIHZhciBsZW5ndGggPSBwcmVmaXgubGVuZ3RoICsgYmVmb3JlLmxlbmd0aCArIGFmdGVyLmxlbmd0aCArICh6Y29tbWEgPyAwIDogbmVnYXRpdmUubGVuZ3RoKSwgcGFkZGluZyA9IGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KGxlbmd0aCA9IHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSA6IFwiXCI7XG4gICAgICAgIGlmICh6Y29tbWEpIGJlZm9yZSA9IGZvcm1hdEdyb3VwKHBhZGRpbmcgKyBiZWZvcmUsIHBhZGRpbmcubGVuZ3RoID8gd2lkdGggLSBhZnRlci5sZW5ndGggOiBJbmZpbml0eSk7XG4gICAgICAgIG5lZ2F0aXZlICs9IHByZWZpeDtcbiAgICAgICAgdmFsdWUgPSBiZWZvcmUgKyBhZnRlcjtcbiAgICAgICAgcmV0dXJuIChhbGlnbiA9PT0gXCI8XCIgPyBuZWdhdGl2ZSArIHZhbHVlICsgcGFkZGluZyA6IGFsaWduID09PSBcIj5cIiA/IHBhZGRpbmcgKyBuZWdhdGl2ZSArIHZhbHVlIDogYWxpZ24gPT09IFwiXlwiID8gcGFkZGluZy5zdWJzdHJpbmcoMCwgbGVuZ3RoID4+PSAxKSArIG5lZ2F0aXZlICsgdmFsdWUgKyBwYWRkaW5nLnN1YnN0cmluZyhsZW5ndGgpIDogbmVnYXRpdmUgKyAoemNvbW1hID8gdmFsdWUgOiBwYWRkaW5nICsgdmFsdWUpKSArIGZ1bGxTdWZmaXg7XG4gICAgICB9O1xuICAgIH07XG4gIH1cbiAgdmFyIGQzX2Zvcm1hdF9yZSA9IC8oPzooW157XSk/KFs8Pj1eXSkpPyhbK1xcLSBdKT8oWyQjXSk/KDApPyhcXGQrKT8oLCk/KFxcLi0/XFxkKyk/KFthLXolXSk/L2k7XG4gIHZhciBkM19mb3JtYXRfdHlwZXMgPSBkMy5tYXAoe1xuICAgIGI6IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiB4LnRvU3RyaW5nKDIpO1xuICAgIH0sXG4gICAgYzogZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoeCk7XG4gICAgfSxcbiAgICBvOiBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4geC50b1N0cmluZyg4KTtcbiAgICB9LFxuICAgIHg6IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiB4LnRvU3RyaW5nKDE2KTtcbiAgICB9LFxuICAgIFg6IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiB4LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgIH0sXG4gICAgZzogZnVuY3Rpb24oeCwgcCkge1xuICAgICAgcmV0dXJuIHgudG9QcmVjaXNpb24ocCk7XG4gICAgfSxcbiAgICBlOiBmdW5jdGlvbih4LCBwKSB7XG4gICAgICByZXR1cm4geC50b0V4cG9uZW50aWFsKHApO1xuICAgIH0sXG4gICAgZjogZnVuY3Rpb24oeCwgcCkge1xuICAgICAgcmV0dXJuIHgudG9GaXhlZChwKTtcbiAgICB9LFxuICAgIHI6IGZ1bmN0aW9uKHgsIHApIHtcbiAgICAgIHJldHVybiAoeCA9IGQzLnJvdW5kKHgsIGQzX2Zvcm1hdF9wcmVjaXNpb24oeCwgcCkpKS50b0ZpeGVkKE1hdGgubWF4KDAsIE1hdGgubWluKDIwLCBkM19mb3JtYXRfcHJlY2lzaW9uKHggKiAoMSArIDFlLTE1KSwgcCkpKSk7XG4gICAgfVxuICB9KTtcbiAgZnVuY3Rpb24gZDNfZm9ybWF0X3R5cGVEZWZhdWx0KHgpIHtcbiAgICByZXR1cm4geCArIFwiXCI7XG4gIH1cbiAgdmFyIGQzX3RpbWUgPSBkMy50aW1lID0ge30sIGQzX2RhdGUgPSBEYXRlO1xuICBmdW5jdGlvbiBkM19kYXRlX3V0YygpIHtcbiAgICB0aGlzLl8gPSBuZXcgRGF0ZShhcmd1bWVudHMubGVuZ3RoID4gMSA/IERhdGUuVVRDLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBhcmd1bWVudHNbMF0pO1xuICB9XG4gIGQzX2RhdGVfdXRjLnByb3RvdHlwZSA9IHtcbiAgICBnZXREYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl8uZ2V0VVRDRGF0ZSgpO1xuICAgIH0sXG4gICAgZ2V0RGF5OiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl8uZ2V0VVRDRGF5KCk7XG4gICAgfSxcbiAgICBnZXRGdWxsWWVhcjogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fLmdldFVUQ0Z1bGxZZWFyKCk7XG4gICAgfSxcbiAgICBnZXRIb3VyczogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fLmdldFVUQ0hvdXJzKCk7XG4gICAgfSxcbiAgICBnZXRNaWxsaXNlY29uZHM6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuXy5nZXRVVENNaWxsaXNlY29uZHMoKTtcbiAgICB9LFxuICAgIGdldE1pbnV0ZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuXy5nZXRVVENNaW51dGVzKCk7XG4gICAgfSxcbiAgICBnZXRNb250aDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fLmdldFVUQ01vbnRoKCk7XG4gICAgfSxcbiAgICBnZXRTZWNvbmRzOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl8uZ2V0VVRDU2Vjb25kcygpO1xuICAgIH0sXG4gICAgZ2V0VGltZTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fLmdldFRpbWUoKTtcbiAgICB9LFxuICAgIGdldFRpbWV6b25lT2Zmc2V0OiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAgdmFsdWVPZjogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fLnZhbHVlT2YoKTtcbiAgICB9LFxuICAgIHNldERhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDRGF0ZS5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBzZXREYXk6IGZ1bmN0aW9uKCkge1xuICAgICAgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDRGF5LmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHNldEZ1bGxZZWFyOiBmdW5jdGlvbigpIHtcbiAgICAgIGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ0Z1bGxZZWFyLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHNldEhvdXJzOiBmdW5jdGlvbigpIHtcbiAgICAgIGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ0hvdXJzLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHNldE1pbGxpc2Vjb25kczogZnVuY3Rpb24oKSB7XG4gICAgICBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENNaWxsaXNlY29uZHMuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgc2V0TWludXRlczogZnVuY3Rpb24oKSB7XG4gICAgICBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENNaW51dGVzLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHNldE1vbnRoOiBmdW5jdGlvbigpIHtcbiAgICAgIGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ01vbnRoLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHNldFNlY29uZHM6IGZ1bmN0aW9uKCkge1xuICAgICAgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDU2Vjb25kcy5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBzZXRUaW1lOiBmdW5jdGlvbigpIHtcbiAgICAgIGQzX3RpbWVfcHJvdG90eXBlLnNldFRpbWUuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfTtcbiAgdmFyIGQzX3RpbWVfcHJvdG90eXBlID0gRGF0ZS5wcm90b3R5cGU7XG4gIGZ1bmN0aW9uIGQzX3RpbWVfaW50ZXJ2YWwobG9jYWwsIHN0ZXAsIG51bWJlcikge1xuICAgIGZ1bmN0aW9uIHJvdW5kKGRhdGUpIHtcbiAgICAgIHZhciBkMCA9IGxvY2FsKGRhdGUpLCBkMSA9IG9mZnNldChkMCwgMSk7XG4gICAgICByZXR1cm4gZGF0ZSAtIGQwIDwgZDEgLSBkYXRlID8gZDAgOiBkMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2VpbChkYXRlKSB7XG4gICAgICBzdGVwKGRhdGUgPSBsb2NhbChuZXcgZDNfZGF0ZShkYXRlIC0gMSkpLCAxKTtcbiAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBvZmZzZXQoZGF0ZSwgaykge1xuICAgICAgc3RlcChkYXRlID0gbmV3IGQzX2RhdGUoK2RhdGUpLCBrKTtcbiAgICAgIHJldHVybiBkYXRlO1xuICAgIH1cbiAgICBmdW5jdGlvbiByYW5nZSh0MCwgdDEsIGR0KSB7XG4gICAgICB2YXIgdGltZSA9IGNlaWwodDApLCB0aW1lcyA9IFtdO1xuICAgICAgaWYgKGR0ID4gMSkge1xuICAgICAgICB3aGlsZSAodGltZSA8IHQxKSB7XG4gICAgICAgICAgaWYgKCEobnVtYmVyKHRpbWUpICUgZHQpKSB0aW1lcy5wdXNoKG5ldyBEYXRlKCt0aW1lKSk7XG4gICAgICAgICAgc3RlcCh0aW1lLCAxKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2hpbGUgKHRpbWUgPCB0MSkgdGltZXMucHVzaChuZXcgRGF0ZSgrdGltZSkpLCBzdGVwKHRpbWUsIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRpbWVzO1xuICAgIH1cbiAgICBmdW5jdGlvbiByYW5nZV91dGModDAsIHQxLCBkdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZDNfZGF0ZSA9IGQzX2RhdGVfdXRjO1xuICAgICAgICB2YXIgdXRjID0gbmV3IGQzX2RhdGVfdXRjKCk7XG4gICAgICAgIHV0Yy5fID0gdDA7XG4gICAgICAgIHJldHVybiByYW5nZSh1dGMsIHQxLCBkdCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBkM19kYXRlID0gRGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgbG9jYWwuZmxvb3IgPSBsb2NhbDtcbiAgICBsb2NhbC5yb3VuZCA9IHJvdW5kO1xuICAgIGxvY2FsLmNlaWwgPSBjZWlsO1xuICAgIGxvY2FsLm9mZnNldCA9IG9mZnNldDtcbiAgICBsb2NhbC5yYW5nZSA9IHJhbmdlO1xuICAgIHZhciB1dGMgPSBsb2NhbC51dGMgPSBkM190aW1lX2ludGVydmFsX3V0Yyhsb2NhbCk7XG4gICAgdXRjLmZsb29yID0gdXRjO1xuICAgIHV0Yy5yb3VuZCA9IGQzX3RpbWVfaW50ZXJ2YWxfdXRjKHJvdW5kKTtcbiAgICB1dGMuY2VpbCA9IGQzX3RpbWVfaW50ZXJ2YWxfdXRjKGNlaWwpO1xuICAgIHV0Yy5vZmZzZXQgPSBkM190aW1lX2ludGVydmFsX3V0YyhvZmZzZXQpO1xuICAgIHV0Yy5yYW5nZSA9IHJhbmdlX3V0YztcbiAgICByZXR1cm4gbG9jYWw7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdGltZV9pbnRlcnZhbF91dGMobWV0aG9kKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGRhdGUsIGspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGQzX2RhdGUgPSBkM19kYXRlX3V0YztcbiAgICAgICAgdmFyIHV0YyA9IG5ldyBkM19kYXRlX3V0YygpO1xuICAgICAgICB1dGMuXyA9IGRhdGU7XG4gICAgICAgIHJldHVybiBtZXRob2QodXRjLCBrKS5fO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZDNfZGF0ZSA9IERhdGU7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBkM190aW1lLnllYXIgPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgICBkYXRlID0gZDNfdGltZS5kYXkoZGF0ZSk7XG4gICAgZGF0ZS5zZXRNb250aCgwLCAxKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7XG4gICAgZGF0ZS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkgKyBvZmZzZXQpO1xuICB9LCBmdW5jdGlvbihkYXRlKSB7XG4gICAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgfSk7XG4gIGQzX3RpbWUueWVhcnMgPSBkM190aW1lLnllYXIucmFuZ2U7XG4gIGQzX3RpbWUueWVhcnMudXRjID0gZDNfdGltZS55ZWFyLnV0Yy5yYW5nZTtcbiAgZDNfdGltZS5kYXkgPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgICB2YXIgZGF5ID0gbmV3IGQzX2RhdGUoMmUzLCAwKTtcbiAgICBkYXkuc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKTtcbiAgICByZXR1cm4gZGF5O1xuICB9LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHtcbiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBvZmZzZXQpO1xuICB9LCBmdW5jdGlvbihkYXRlKSB7XG4gICAgcmV0dXJuIGRhdGUuZ2V0RGF0ZSgpIC0gMTtcbiAgfSk7XG4gIGQzX3RpbWUuZGF5cyA9IGQzX3RpbWUuZGF5LnJhbmdlO1xuICBkM190aW1lLmRheXMudXRjID0gZDNfdGltZS5kYXkudXRjLnJhbmdlO1xuICBkM190aW1lLmRheU9mWWVhciA9IGZ1bmN0aW9uKGRhdGUpIHtcbiAgICB2YXIgeWVhciA9IGQzX3RpbWUueWVhcihkYXRlKTtcbiAgICByZXR1cm4gTWF0aC5mbG9vcigoZGF0ZSAtIHllYXIgLSAoZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpIC0geWVhci5nZXRUaW1lem9uZU9mZnNldCgpKSAqIDZlNCkgLyA4NjRlNSk7XG4gIH07XG4gIFsgXCJzdW5kYXlcIiwgXCJtb25kYXlcIiwgXCJ0dWVzZGF5XCIsIFwid2VkbmVzZGF5XCIsIFwidGh1cnNkYXlcIiwgXCJmcmlkYXlcIiwgXCJzYXR1cmRheVwiIF0uZm9yRWFjaChmdW5jdGlvbihkYXksIGkpIHtcbiAgICBpID0gNyAtIGk7XG4gICAgdmFyIGludGVydmFsID0gZDNfdGltZVtkYXldID0gZDNfdGltZV9pbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XG4gICAgICAoZGF0ZSA9IGQzX3RpbWUuZGF5KGRhdGUpKS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpIC0gKGRhdGUuZ2V0RGF5KCkgKyBpKSAlIDcpO1xuICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7XG4gICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBNYXRoLmZsb29yKG9mZnNldCkgKiA3KTtcbiAgICB9LCBmdW5jdGlvbihkYXRlKSB7XG4gICAgICB2YXIgZGF5ID0gZDNfdGltZS55ZWFyKGRhdGUpLmdldERheSgpO1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKGQzX3RpbWUuZGF5T2ZZZWFyKGRhdGUpICsgKGRheSArIGkpICUgNykgLyA3KSAtIChkYXkgIT09IGkpO1xuICAgIH0pO1xuICAgIGQzX3RpbWVbZGF5ICsgXCJzXCJdID0gaW50ZXJ2YWwucmFuZ2U7XG4gICAgZDNfdGltZVtkYXkgKyBcInNcIl0udXRjID0gaW50ZXJ2YWwudXRjLnJhbmdlO1xuICAgIGQzX3RpbWVbZGF5ICsgXCJPZlllYXJcIl0gPSBmdW5jdGlvbihkYXRlKSB7XG4gICAgICB2YXIgZGF5ID0gZDNfdGltZS55ZWFyKGRhdGUpLmdldERheSgpO1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoKGQzX3RpbWUuZGF5T2ZZZWFyKGRhdGUpICsgKGRheSArIGkpICUgNykgLyA3KTtcbiAgICB9O1xuICB9KTtcbiAgZDNfdGltZS53ZWVrID0gZDNfdGltZS5zdW5kYXk7XG4gIGQzX3RpbWUud2Vla3MgPSBkM190aW1lLnN1bmRheS5yYW5nZTtcbiAgZDNfdGltZS53ZWVrcy51dGMgPSBkM190aW1lLnN1bmRheS51dGMucmFuZ2U7XG4gIGQzX3RpbWUud2Vla09mWWVhciA9IGQzX3RpbWUuc3VuZGF5T2ZZZWFyO1xuICBmdW5jdGlvbiBkM19sb2NhbGVfdGltZUZvcm1hdChsb2NhbGUpIHtcbiAgICB2YXIgbG9jYWxlX2RhdGVUaW1lID0gbG9jYWxlLmRhdGVUaW1lLCBsb2NhbGVfZGF0ZSA9IGxvY2FsZS5kYXRlLCBsb2NhbGVfdGltZSA9IGxvY2FsZS50aW1lLCBsb2NhbGVfcGVyaW9kcyA9IGxvY2FsZS5wZXJpb2RzLCBsb2NhbGVfZGF5cyA9IGxvY2FsZS5kYXlzLCBsb2NhbGVfc2hvcnREYXlzID0gbG9jYWxlLnNob3J0RGF5cywgbG9jYWxlX21vbnRocyA9IGxvY2FsZS5tb250aHMsIGxvY2FsZV9zaG9ydE1vbnRocyA9IGxvY2FsZS5zaG9ydE1vbnRocztcbiAgICBmdW5jdGlvbiBkM190aW1lX2Zvcm1hdCh0ZW1wbGF0ZSkge1xuICAgICAgdmFyIG4gPSB0ZW1wbGF0ZS5sZW5ndGg7XG4gICAgICBmdW5jdGlvbiBmb3JtYXQoZGF0ZSkge1xuICAgICAgICB2YXIgc3RyaW5nID0gW10sIGkgPSAtMSwgaiA9IDAsIGMsIHAsIGY7XG4gICAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgICAgaWYgKHRlbXBsYXRlLmNoYXJDb2RlQXQoaSkgPT09IDM3KSB7XG4gICAgICAgICAgICBzdHJpbmcucHVzaCh0ZW1wbGF0ZS5zbGljZShqLCBpKSk7XG4gICAgICAgICAgICBpZiAoKHAgPSBkM190aW1lX2Zvcm1hdFBhZHNbYyA9IHRlbXBsYXRlLmNoYXJBdCgrK2kpXSkgIT0gbnVsbCkgYyA9IHRlbXBsYXRlLmNoYXJBdCgrK2kpO1xuICAgICAgICAgICAgaWYgKGYgPSBkM190aW1lX2Zvcm1hdHNbY10pIGMgPSBmKGRhdGUsIHAgPT0gbnVsbCA/IGMgPT09IFwiZVwiID8gXCIgXCIgOiBcIjBcIiA6IHApO1xuICAgICAgICAgICAgc3RyaW5nLnB1c2goYyk7XG4gICAgICAgICAgICBqID0gaSArIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0cmluZy5wdXNoKHRlbXBsYXRlLnNsaWNlKGosIGkpKTtcbiAgICAgICAgcmV0dXJuIHN0cmluZy5qb2luKFwiXCIpO1xuICAgICAgfVxuICAgICAgZm9ybWF0LnBhcnNlID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICAgIHZhciBkID0ge1xuICAgICAgICAgIHk6IDE5MDAsXG4gICAgICAgICAgbTogMCxcbiAgICAgICAgICBkOiAxLFxuICAgICAgICAgIEg6IDAsXG4gICAgICAgICAgTTogMCxcbiAgICAgICAgICBTOiAwLFxuICAgICAgICAgIEw6IDAsXG4gICAgICAgICAgWjogbnVsbFxuICAgICAgICB9LCBpID0gZDNfdGltZV9wYXJzZShkLCB0ZW1wbGF0ZSwgc3RyaW5nLCAwKTtcbiAgICAgICAgaWYgKGkgIT0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChcInBcIiBpbiBkKSBkLkggPSBkLkggJSAxMiArIGQucCAqIDEyO1xuICAgICAgICB2YXIgbG9jYWxaID0gZC5aICE9IG51bGwgJiYgZDNfZGF0ZSAhPT0gZDNfZGF0ZV91dGMsIGRhdGUgPSBuZXcgKGxvY2FsWiA/IGQzX2RhdGVfdXRjIDogZDNfZGF0ZSkoKTtcbiAgICAgICAgaWYgKFwialwiIGluIGQpIGRhdGUuc2V0RnVsbFllYXIoZC55LCAwLCBkLmopOyBlbHNlIGlmIChcIldcIiBpbiBkIHx8IFwiVVwiIGluIGQpIHtcbiAgICAgICAgICBpZiAoIShcIndcIiBpbiBkKSkgZC53ID0gXCJXXCIgaW4gZCA/IDEgOiAwO1xuICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIoZC55LCAwLCAxKTtcbiAgICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKGQueSwgMCwgXCJXXCIgaW4gZCA/IChkLncgKyA2KSAlIDcgKyBkLlcgKiA3IC0gKGRhdGUuZ2V0RGF5KCkgKyA1KSAlIDcgOiBkLncgKyBkLlUgKiA3IC0gKGRhdGUuZ2V0RGF5KCkgKyA2KSAlIDcpO1xuICAgICAgICB9IGVsc2UgZGF0ZS5zZXRGdWxsWWVhcihkLnksIGQubSwgZC5kKTtcbiAgICAgICAgZGF0ZS5zZXRIb3VycyhkLkggKyAoZC5aIC8gMTAwIHwgMCksIGQuTSArIGQuWiAlIDEwMCwgZC5TLCBkLkwpO1xuICAgICAgICByZXR1cm4gbG9jYWxaID8gZGF0ZS5fIDogZGF0ZTtcbiAgICAgIH07XG4gICAgICBmb3JtYXQudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2UoZGF0ZSwgdGVtcGxhdGUsIHN0cmluZywgaikge1xuICAgICAgdmFyIGMsIHAsIHQsIGkgPSAwLCBuID0gdGVtcGxhdGUubGVuZ3RoLCBtID0gc3RyaW5nLmxlbmd0aDtcbiAgICAgIHdoaWxlIChpIDwgbikge1xuICAgICAgICBpZiAoaiA+PSBtKSByZXR1cm4gLTE7XG4gICAgICAgIGMgPSB0ZW1wbGF0ZS5jaGFyQ29kZUF0KGkrKyk7XG4gICAgICAgIGlmIChjID09PSAzNykge1xuICAgICAgICAgIHQgPSB0ZW1wbGF0ZS5jaGFyQXQoaSsrKTtcbiAgICAgICAgICBwID0gZDNfdGltZV9wYXJzZXJzW3QgaW4gZDNfdGltZV9mb3JtYXRQYWRzID8gdGVtcGxhdGUuY2hhckF0KGkrKykgOiB0XTtcbiAgICAgICAgICBpZiAoIXAgfHwgKGogPSBwKGRhdGUsIHN0cmluZywgaikpIDwgMCkgcmV0dXJuIC0xO1xuICAgICAgICB9IGVsc2UgaWYgKGMgIT0gc3RyaW5nLmNoYXJDb2RlQXQoaisrKSkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGo7XG4gICAgfVxuICAgIGQzX3RpbWVfZm9ybWF0LnV0YyA9IGZ1bmN0aW9uKHRlbXBsYXRlKSB7XG4gICAgICB2YXIgbG9jYWwgPSBkM190aW1lX2Zvcm1hdCh0ZW1wbGF0ZSk7XG4gICAgICBmdW5jdGlvbiBmb3JtYXQoZGF0ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGQzX2RhdGUgPSBkM19kYXRlX3V0YztcbiAgICAgICAgICB2YXIgdXRjID0gbmV3IGQzX2RhdGUoKTtcbiAgICAgICAgICB1dGMuXyA9IGRhdGU7XG4gICAgICAgICAgcmV0dXJuIGxvY2FsKHV0Yyk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgZDNfZGF0ZSA9IERhdGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvcm1hdC5wYXJzZSA9IGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGQzX2RhdGUgPSBkM19kYXRlX3V0YztcbiAgICAgICAgICB2YXIgZGF0ZSA9IGxvY2FsLnBhcnNlKHN0cmluZyk7XG4gICAgICAgICAgcmV0dXJuIGRhdGUgJiYgZGF0ZS5fO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGQzX2RhdGUgPSBEYXRlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgZm9ybWF0LnRvU3RyaW5nID0gbG9jYWwudG9TdHJpbmc7XG4gICAgICByZXR1cm4gZm9ybWF0O1xuICAgIH07XG4gICAgZDNfdGltZV9mb3JtYXQubXVsdGkgPSBkM190aW1lX2Zvcm1hdC51dGMubXVsdGkgPSBkM190aW1lX2Zvcm1hdE11bHRpO1xuICAgIHZhciBkM190aW1lX3BlcmlvZExvb2t1cCA9IGQzLm1hcCgpLCBkM190aW1lX2RheVJlID0gZDNfdGltZV9mb3JtYXRSZShsb2NhbGVfZGF5cyksIGQzX3RpbWVfZGF5TG9va3VwID0gZDNfdGltZV9mb3JtYXRMb29rdXAobG9jYWxlX2RheXMpLCBkM190aW1lX2RheUFiYnJldlJlID0gZDNfdGltZV9mb3JtYXRSZShsb2NhbGVfc2hvcnREYXlzKSwgZDNfdGltZV9kYXlBYmJyZXZMb29rdXAgPSBkM190aW1lX2Zvcm1hdExvb2t1cChsb2NhbGVfc2hvcnREYXlzKSwgZDNfdGltZV9tb250aFJlID0gZDNfdGltZV9mb3JtYXRSZShsb2NhbGVfbW9udGhzKSwgZDNfdGltZV9tb250aExvb2t1cCA9IGQzX3RpbWVfZm9ybWF0TG9va3VwKGxvY2FsZV9tb250aHMpLCBkM190aW1lX21vbnRoQWJicmV2UmUgPSBkM190aW1lX2Zvcm1hdFJlKGxvY2FsZV9zaG9ydE1vbnRocyksIGQzX3RpbWVfbW9udGhBYmJyZXZMb29rdXAgPSBkM190aW1lX2Zvcm1hdExvb2t1cChsb2NhbGVfc2hvcnRNb250aHMpO1xuICAgIGxvY2FsZV9wZXJpb2RzLmZvckVhY2goZnVuY3Rpb24ocCwgaSkge1xuICAgICAgZDNfdGltZV9wZXJpb2RMb29rdXAuc2V0KHAudG9Mb3dlckNhc2UoKSwgaSk7XG4gICAgfSk7XG4gICAgdmFyIGQzX3RpbWVfZm9ybWF0cyA9IHtcbiAgICAgIGE6IGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZV9zaG9ydERheXNbZC5nZXREYXkoKV07XG4gICAgICB9LFxuICAgICAgQTogZnVuY3Rpb24oZCkge1xuICAgICAgICByZXR1cm4gbG9jYWxlX2RheXNbZC5nZXREYXkoKV07XG4gICAgICB9LFxuICAgICAgYjogZnVuY3Rpb24oZCkge1xuICAgICAgICByZXR1cm4gbG9jYWxlX3Nob3J0TW9udGhzW2QuZ2V0TW9udGgoKV07XG4gICAgICB9LFxuICAgICAgQjogZnVuY3Rpb24oZCkge1xuICAgICAgICByZXR1cm4gbG9jYWxlX21vbnRoc1tkLmdldE1vbnRoKCldO1xuICAgICAgfSxcbiAgICAgIGM6IGQzX3RpbWVfZm9ybWF0KGxvY2FsZV9kYXRlVGltZSksXG4gICAgICBkOiBmdW5jdGlvbihkLCBwKSB7XG4gICAgICAgIHJldHVybiBkM190aW1lX2Zvcm1hdFBhZChkLmdldERhdGUoKSwgcCwgMik7XG4gICAgICB9LFxuICAgICAgZTogZnVuY3Rpb24oZCwgcCkge1xuICAgICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZC5nZXREYXRlKCksIHAsIDIpO1xuICAgICAgfSxcbiAgICAgIEg6IGZ1bmN0aW9uKGQsIHApIHtcbiAgICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQuZ2V0SG91cnMoKSwgcCwgMik7XG4gICAgICB9LFxuICAgICAgSTogZnVuY3Rpb24oZCwgcCkge1xuICAgICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZC5nZXRIb3VycygpICUgMTIgfHwgMTIsIHAsIDIpO1xuICAgICAgfSxcbiAgICAgIGo6IGZ1bmN0aW9uKGQsIHApIHtcbiAgICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKDEgKyBkM190aW1lLmRheU9mWWVhcihkKSwgcCwgMyk7XG4gICAgICB9LFxuICAgICAgTDogZnVuY3Rpb24oZCwgcCkge1xuICAgICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZC5nZXRNaWxsaXNlY29uZHMoKSwgcCwgMyk7XG4gICAgICB9LFxuICAgICAgbTogZnVuY3Rpb24oZCwgcCkge1xuICAgICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZC5nZXRNb250aCgpICsgMSwgcCwgMik7XG4gICAgICB9LFxuICAgICAgTTogZnVuY3Rpb24oZCwgcCkge1xuICAgICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZC5nZXRNaW51dGVzKCksIHAsIDIpO1xuICAgICAgfSxcbiAgICAgIHA6IGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZV9wZXJpb2RzWysoZC5nZXRIb3VycygpID49IDEyKV07XG4gICAgICB9LFxuICAgICAgUzogZnVuY3Rpb24oZCwgcCkge1xuICAgICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZC5nZXRTZWNvbmRzKCksIHAsIDIpO1xuICAgICAgfSxcbiAgICAgIFU6IGZ1bmN0aW9uKGQsIHApIHtcbiAgICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQzX3RpbWUuc3VuZGF5T2ZZZWFyKGQpLCBwLCAyKTtcbiAgICAgIH0sXG4gICAgICB3OiBmdW5jdGlvbihkKSB7XG4gICAgICAgIHJldHVybiBkLmdldERheSgpO1xuICAgICAgfSxcbiAgICAgIFc6IGZ1bmN0aW9uKGQsIHApIHtcbiAgICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQzX3RpbWUubW9uZGF5T2ZZZWFyKGQpLCBwLCAyKTtcbiAgICAgIH0sXG4gICAgICB4OiBkM190aW1lX2Zvcm1hdChsb2NhbGVfZGF0ZSksXG4gICAgICBYOiBkM190aW1lX2Zvcm1hdChsb2NhbGVfdGltZSksXG4gICAgICB5OiBmdW5jdGlvbihkLCBwKSB7XG4gICAgICAgIHJldHVybiBkM190aW1lX2Zvcm1hdFBhZChkLmdldEZ1bGxZZWFyKCkgJSAxMDAsIHAsIDIpO1xuICAgICAgfSxcbiAgICAgIFk6IGZ1bmN0aW9uKGQsIHApIHtcbiAgICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQuZ2V0RnVsbFllYXIoKSAlIDFlNCwgcCwgNCk7XG4gICAgICB9LFxuICAgICAgWjogZDNfdGltZV96b25lLFxuICAgICAgXCIlXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gXCIlXCI7XG4gICAgICB9XG4gICAgfTtcbiAgICB2YXIgZDNfdGltZV9wYXJzZXJzID0ge1xuICAgICAgYTogZDNfdGltZV9wYXJzZVdlZWtkYXlBYmJyZXYsXG4gICAgICBBOiBkM190aW1lX3BhcnNlV2Vla2RheSxcbiAgICAgIGI6IGQzX3RpbWVfcGFyc2VNb250aEFiYnJldixcbiAgICAgIEI6IGQzX3RpbWVfcGFyc2VNb250aCxcbiAgICAgIGM6IGQzX3RpbWVfcGFyc2VMb2NhbGVGdWxsLFxuICAgICAgZDogZDNfdGltZV9wYXJzZURheSxcbiAgICAgIGU6IGQzX3RpbWVfcGFyc2VEYXksXG4gICAgICBIOiBkM190aW1lX3BhcnNlSG91cjI0LFxuICAgICAgSTogZDNfdGltZV9wYXJzZUhvdXIyNCxcbiAgICAgIGo6IGQzX3RpbWVfcGFyc2VEYXlPZlllYXIsXG4gICAgICBMOiBkM190aW1lX3BhcnNlTWlsbGlzZWNvbmRzLFxuICAgICAgbTogZDNfdGltZV9wYXJzZU1vbnRoTnVtYmVyLFxuICAgICAgTTogZDNfdGltZV9wYXJzZU1pbnV0ZXMsXG4gICAgICBwOiBkM190aW1lX3BhcnNlQW1QbSxcbiAgICAgIFM6IGQzX3RpbWVfcGFyc2VTZWNvbmRzLFxuICAgICAgVTogZDNfdGltZV9wYXJzZVdlZWtOdW1iZXJTdW5kYXksXG4gICAgICB3OiBkM190aW1lX3BhcnNlV2Vla2RheU51bWJlcixcbiAgICAgIFc6IGQzX3RpbWVfcGFyc2VXZWVrTnVtYmVyTW9uZGF5LFxuICAgICAgeDogZDNfdGltZV9wYXJzZUxvY2FsZURhdGUsXG4gICAgICBYOiBkM190aW1lX3BhcnNlTG9jYWxlVGltZSxcbiAgICAgIHk6IGQzX3RpbWVfcGFyc2VZZWFyLFxuICAgICAgWTogZDNfdGltZV9wYXJzZUZ1bGxZZWFyLFxuICAgICAgWjogZDNfdGltZV9wYXJzZVpvbmUsXG4gICAgICBcIiVcIjogZDNfdGltZV9wYXJzZUxpdGVyYWxQZXJjZW50XG4gICAgfTtcbiAgICBmdW5jdGlvbiBkM190aW1lX3BhcnNlV2Vla2RheUFiYnJldihkYXRlLCBzdHJpbmcsIGkpIHtcbiAgICAgIGQzX3RpbWVfZGF5QWJicmV2UmUubGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciBuID0gZDNfdGltZV9kYXlBYmJyZXZSZS5leGVjKHN0cmluZy5zbGljZShpKSk7XG4gICAgICByZXR1cm4gbiA/IChkYXRlLncgPSBkM190aW1lX2RheUFiYnJldkxvb2t1cC5nZXQoblswXS50b0xvd2VyQ2FzZSgpKSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkM190aW1lX3BhcnNlV2Vla2RheShkYXRlLCBzdHJpbmcsIGkpIHtcbiAgICAgIGQzX3RpbWVfZGF5UmUubGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciBuID0gZDNfdGltZV9kYXlSZS5leGVjKHN0cmluZy5zbGljZShpKSk7XG4gICAgICByZXR1cm4gbiA/IChkYXRlLncgPSBkM190aW1lX2RheUxvb2t1cC5nZXQoblswXS50b0xvd2VyQ2FzZSgpKSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkM190aW1lX3BhcnNlTW9udGhBYmJyZXYoZGF0ZSwgc3RyaW5nLCBpKSB7XG4gICAgICBkM190aW1lX21vbnRoQWJicmV2UmUubGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciBuID0gZDNfdGltZV9tb250aEFiYnJldlJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTtcbiAgICAgIHJldHVybiBuID8gKGRhdGUubSA9IGQzX3RpbWVfbW9udGhBYmJyZXZMb29rdXAuZ2V0KG5bMF0udG9Mb3dlckNhc2UoKSksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZU1vbnRoKGRhdGUsIHN0cmluZywgaSkge1xuICAgICAgZDNfdGltZV9tb250aFJlLmxhc3RJbmRleCA9IDA7XG4gICAgICB2YXIgbiA9IGQzX3RpbWVfbW9udGhSZS5leGVjKHN0cmluZy5zbGljZShpKSk7XG4gICAgICByZXR1cm4gbiA/IChkYXRlLm0gPSBkM190aW1lX21vbnRoTG9va3VwLmdldChuWzBdLnRvTG93ZXJDYXNlKCkpLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VMb2NhbGVGdWxsKGRhdGUsIHN0cmluZywgaSkge1xuICAgICAgcmV0dXJuIGQzX3RpbWVfcGFyc2UoZGF0ZSwgZDNfdGltZV9mb3JtYXRzLmMudG9TdHJpbmcoKSwgc3RyaW5nLCBpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZUxvY2FsZURhdGUoZGF0ZSwgc3RyaW5nLCBpKSB7XG4gICAgICByZXR1cm4gZDNfdGltZV9wYXJzZShkYXRlLCBkM190aW1lX2Zvcm1hdHMueC50b1N0cmluZygpLCBzdHJpbmcsIGkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkM190aW1lX3BhcnNlTG9jYWxlVGltZShkYXRlLCBzdHJpbmcsIGkpIHtcbiAgICAgIHJldHVybiBkM190aW1lX3BhcnNlKGRhdGUsIGQzX3RpbWVfZm9ybWF0cy5YLnRvU3RyaW5nKCksIHN0cmluZywgaSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VBbVBtKGRhdGUsIHN0cmluZywgaSkge1xuICAgICAgdmFyIG4gPSBkM190aW1lX3BlcmlvZExvb2t1cC5nZXQoc3RyaW5nLnNsaWNlKGksIGkgKz0gMikudG9Mb3dlckNhc2UoKSk7XG4gICAgICByZXR1cm4gbiA9PSBudWxsID8gLTEgOiAoZGF0ZS5wID0gbiwgaSk7XG4gICAgfVxuICAgIHJldHVybiBkM190aW1lX2Zvcm1hdDtcbiAgfVxuICB2YXIgZDNfdGltZV9mb3JtYXRQYWRzID0ge1xuICAgIFwiLVwiOiBcIlwiLFxuICAgIF86IFwiIFwiLFxuICAgIFwiMFwiOiBcIjBcIlxuICB9LCBkM190aW1lX251bWJlclJlID0gL15cXHMqXFxkKy8sIGQzX3RpbWVfcGVyY2VudFJlID0gL14lLztcbiAgZnVuY3Rpb24gZDNfdGltZV9mb3JtYXRQYWQodmFsdWUsIGZpbGwsIHdpZHRoKSB7XG4gICAgdmFyIHNpZ24gPSB2YWx1ZSA8IDAgPyBcIi1cIiA6IFwiXCIsIHN0cmluZyA9IChzaWduID8gLXZhbHVlIDogdmFsdWUpICsgXCJcIiwgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDtcbiAgICByZXR1cm4gc2lnbiArIChsZW5ndGggPCB3aWR0aCA/IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oZmlsbCkgKyBzdHJpbmcgOiBzdHJpbmcpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3RpbWVfZm9ybWF0UmUobmFtZXMpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChcIl4oPzpcIiArIG5hbWVzLm1hcChkMy5yZXF1b3RlKS5qb2luKFwifFwiKSArIFwiKVwiLCBcImlcIik7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdGltZV9mb3JtYXRMb29rdXAobmFtZXMpIHtcbiAgICB2YXIgbWFwID0gbmV3IGQzX01hcCgpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIG1hcC5zZXQobmFtZXNbaV0udG9Mb3dlckNhc2UoKSwgaSk7XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuICBmdW5jdGlvbiBkM190aW1lX3BhcnNlV2Vla2RheU51bWJlcihkYXRlLCBzdHJpbmcsIGkpIHtcbiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7XG4gICAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAxKSk7XG4gICAgcmV0dXJuIG4gPyAoZGF0ZS53ID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbiAgfVxuICBmdW5jdGlvbiBkM190aW1lX3BhcnNlV2Vla051bWJlclN1bmRheShkYXRlLCBzdHJpbmcsIGkpIHtcbiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7XG4gICAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTtcbiAgICByZXR1cm4gbiA/IChkYXRlLlUgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VXZWVrTnVtYmVyTW9uZGF5KGRhdGUsIHN0cmluZywgaSkge1xuICAgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDtcbiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpO1xuICAgIHJldHVybiBuID8gKGRhdGUuVyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZUZ1bGxZZWFyKGRhdGUsIHN0cmluZywgaSkge1xuICAgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDtcbiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDQpKTtcbiAgICByZXR1cm4gbiA/IChkYXRlLnkgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VZZWFyKGRhdGUsIHN0cmluZywgaSkge1xuICAgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDtcbiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTtcbiAgICByZXR1cm4gbiA/IChkYXRlLnkgPSBkM190aW1lX2V4cGFuZFllYXIoK25bMF0pLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZVpvbmUoZGF0ZSwgc3RyaW5nLCBpKSB7XG4gICAgcmV0dXJuIC9eWystXVxcZHs0fSQvLnRlc3Qoc3RyaW5nID0gc3RyaW5nLnNsaWNlKGksIGkgKyA1KSkgPyAoZGF0ZS5aID0gLXN0cmluZywgXG4gICAgaSArIDUpIDogLTE7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdGltZV9leHBhbmRZZWFyKGQpIHtcbiAgICByZXR1cm4gZCArIChkID4gNjggPyAxOTAwIDogMmUzKTtcbiAgfVxuICBmdW5jdGlvbiBkM190aW1lX3BhcnNlTW9udGhOdW1iZXIoZGF0ZSwgc3RyaW5nLCBpKSB7XG4gICAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwO1xuICAgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpO1xuICAgIHJldHVybiBuID8gKGRhdGUubSA9IG5bMF0gLSAxLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZURheShkYXRlLCBzdHJpbmcsIGkpIHtcbiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7XG4gICAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7XG4gICAgcmV0dXJuIG4gPyAoZGF0ZS5kID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbiAgfVxuICBmdW5jdGlvbiBkM190aW1lX3BhcnNlRGF5T2ZZZWFyKGRhdGUsIHN0cmluZywgaSkge1xuICAgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDtcbiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDMpKTtcbiAgICByZXR1cm4gbiA/IChkYXRlLmogPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VIb3VyMjQoZGF0ZSwgc3RyaW5nLCBpKSB7XG4gICAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwO1xuICAgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpO1xuICAgIHJldHVybiBuID8gKGRhdGUuSCA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZU1pbnV0ZXMoZGF0ZSwgc3RyaW5nLCBpKSB7XG4gICAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwO1xuICAgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpO1xuICAgIHJldHVybiBuID8gKGRhdGUuTSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZVNlY29uZHMoZGF0ZSwgc3RyaW5nLCBpKSB7XG4gICAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwO1xuICAgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpO1xuICAgIHJldHVybiBuID8gKGRhdGUuUyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZU1pbGxpc2Vjb25kcyhkYXRlLCBzdHJpbmcsIGkpIHtcbiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7XG4gICAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAzKSk7XG4gICAgcmV0dXJuIG4gPyAoZGF0ZS5MID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbiAgfVxuICBmdW5jdGlvbiBkM190aW1lX3pvbmUoZCkge1xuICAgIHZhciB6ID0gZC5nZXRUaW1lem9uZU9mZnNldCgpLCB6cyA9IHogPiAwID8gXCItXCIgOiBcIitcIiwgemggPSBhYnMoeikgLyA2MCB8IDAsIHptID0gYWJzKHopICUgNjA7XG4gICAgcmV0dXJuIHpzICsgZDNfdGltZV9mb3JtYXRQYWQoemgsIFwiMFwiLCAyKSArIGQzX3RpbWVfZm9ybWF0UGFkKHptLCBcIjBcIiwgMik7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZUxpdGVyYWxQZXJjZW50KGRhdGUsIHN0cmluZywgaSkge1xuICAgIGQzX3RpbWVfcGVyY2VudFJlLmxhc3RJbmRleCA9IDA7XG4gICAgdmFyIG4gPSBkM190aW1lX3BlcmNlbnRSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMSkpO1xuICAgIHJldHVybiBuID8gaSArIG5bMF0ubGVuZ3RoIDogLTE7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdGltZV9mb3JtYXRNdWx0aShmb3JtYXRzKSB7XG4gICAgdmFyIG4gPSBmb3JtYXRzLmxlbmd0aCwgaSA9IC0xO1xuICAgIHdoaWxlICgrK2kgPCBuKSBmb3JtYXRzW2ldWzBdID0gdGhpcyhmb3JtYXRzW2ldWzBdKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oZGF0ZSkge1xuICAgICAgdmFyIGkgPSAwLCBmID0gZm9ybWF0c1tpXTtcbiAgICAgIHdoaWxlICghZlsxXShkYXRlKSkgZiA9IGZvcm1hdHNbKytpXTtcbiAgICAgIHJldHVybiBmWzBdKGRhdGUpO1xuICAgIH07XG4gIH1cbiAgZDMubG9jYWxlID0gZnVuY3Rpb24obG9jYWxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG51bWJlckZvcm1hdDogZDNfbG9jYWxlX251bWJlckZvcm1hdChsb2NhbGUpLFxuICAgICAgdGltZUZvcm1hdDogZDNfbG9jYWxlX3RpbWVGb3JtYXQobG9jYWxlKVxuICAgIH07XG4gIH07XG4gIHZhciBkM19sb2NhbGVfZW5VUyA9IGQzLmxvY2FsZSh7XG4gICAgZGVjaW1hbDogXCIuXCIsXG4gICAgdGhvdXNhbmRzOiBcIixcIixcbiAgICBncm91cGluZzogWyAzIF0sXG4gICAgY3VycmVuY3k6IFsgXCIkXCIsIFwiXCIgXSxcbiAgICBkYXRlVGltZTogXCIlYSAlYiAlZSAlWCAlWVwiLFxuICAgIGRhdGU6IFwiJW0vJWQvJVlcIixcbiAgICB0aW1lOiBcIiVIOiVNOiVTXCIsXG4gICAgcGVyaW9kczogWyBcIkFNXCIsIFwiUE1cIiBdLFxuICAgIGRheXM6IFsgXCJTdW5kYXlcIiwgXCJNb25kYXlcIiwgXCJUdWVzZGF5XCIsIFwiV2VkbmVzZGF5XCIsIFwiVGh1cnNkYXlcIiwgXCJGcmlkYXlcIiwgXCJTYXR1cmRheVwiIF0sXG4gICAgc2hvcnREYXlzOiBbIFwiU3VuXCIsIFwiTW9uXCIsIFwiVHVlXCIsIFwiV2VkXCIsIFwiVGh1XCIsIFwiRnJpXCIsIFwiU2F0XCIgXSxcbiAgICBtb250aHM6IFsgXCJKYW51YXJ5XCIsIFwiRmVicnVhcnlcIiwgXCJNYXJjaFwiLCBcIkFwcmlsXCIsIFwiTWF5XCIsIFwiSnVuZVwiLCBcIkp1bHlcIiwgXCJBdWd1c3RcIiwgXCJTZXB0ZW1iZXJcIiwgXCJPY3RvYmVyXCIsIFwiTm92ZW1iZXJcIiwgXCJEZWNlbWJlclwiIF0sXG4gICAgc2hvcnRNb250aHM6IFsgXCJKYW5cIiwgXCJGZWJcIiwgXCJNYXJcIiwgXCJBcHJcIiwgXCJNYXlcIiwgXCJKdW5cIiwgXCJKdWxcIiwgXCJBdWdcIiwgXCJTZXBcIiwgXCJPY3RcIiwgXCJOb3ZcIiwgXCJEZWNcIiBdXG4gIH0pO1xuICBkMy5mb3JtYXQgPSBkM19sb2NhbGVfZW5VUy5udW1iZXJGb3JtYXQ7XG4gIGQzLmdlbyA9IHt9O1xuICBmdW5jdGlvbiBkM19hZGRlcigpIHt9XG4gIGQzX2FkZGVyLnByb3RvdHlwZSA9IHtcbiAgICBzOiAwLFxuICAgIHQ6IDAsXG4gICAgYWRkOiBmdW5jdGlvbih5KSB7XG4gICAgICBkM19hZGRlclN1bSh5LCB0aGlzLnQsIGQzX2FkZGVyVGVtcCk7XG4gICAgICBkM19hZGRlclN1bShkM19hZGRlclRlbXAucywgdGhpcy5zLCB0aGlzKTtcbiAgICAgIGlmICh0aGlzLnMpIHRoaXMudCArPSBkM19hZGRlclRlbXAudDsgZWxzZSB0aGlzLnMgPSBkM19hZGRlclRlbXAudDtcbiAgICB9LFxuICAgIHJlc2V0OiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMucyA9IHRoaXMudCA9IDA7XG4gICAgfSxcbiAgICB2YWx1ZU9mOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnM7XG4gICAgfVxuICB9O1xuICB2YXIgZDNfYWRkZXJUZW1wID0gbmV3IGQzX2FkZGVyKCk7XG4gIGZ1bmN0aW9uIGQzX2FkZGVyU3VtKGEsIGIsIG8pIHtcbiAgICB2YXIgeCA9IG8ucyA9IGEgKyBiLCBidiA9IHggLSBhLCBhdiA9IHggLSBidjtcbiAgICBvLnQgPSBhIC0gYXYgKyAoYiAtIGJ2KTtcbiAgfVxuICBkMy5nZW8uc3RyZWFtID0gZnVuY3Rpb24ob2JqZWN0LCBsaXN0ZW5lcikge1xuICAgIGlmIChvYmplY3QgJiYgZDNfZ2VvX3N0cmVhbU9iamVjdFR5cGUuaGFzT3duUHJvcGVydHkob2JqZWN0LnR5cGUpKSB7XG4gICAgICBkM19nZW9fc3RyZWFtT2JqZWN0VHlwZVtvYmplY3QudHlwZV0ob2JqZWN0LCBsaXN0ZW5lcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGQzX2dlb19zdHJlYW1HZW9tZXRyeShvYmplY3QsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2dlb19zdHJlYW1HZW9tZXRyeShnZW9tZXRyeSwgbGlzdGVuZXIpIHtcbiAgICBpZiAoZ2VvbWV0cnkgJiYgZDNfZ2VvX3N0cmVhbUdlb21ldHJ5VHlwZS5oYXNPd25Qcm9wZXJ0eShnZW9tZXRyeS50eXBlKSkge1xuICAgICAgZDNfZ2VvX3N0cmVhbUdlb21ldHJ5VHlwZVtnZW9tZXRyeS50eXBlXShnZW9tZXRyeSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfVxuICB2YXIgZDNfZ2VvX3N0cmVhbU9iamVjdFR5cGUgPSB7XG4gICAgRmVhdHVyZTogZnVuY3Rpb24oZmVhdHVyZSwgbGlzdGVuZXIpIHtcbiAgICAgIGQzX2dlb19zdHJlYW1HZW9tZXRyeShmZWF0dXJlLmdlb21ldHJ5LCBsaXN0ZW5lcik7XG4gICAgfSxcbiAgICBGZWF0dXJlQ29sbGVjdGlvbjogZnVuY3Rpb24ob2JqZWN0LCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGZlYXR1cmVzID0gb2JqZWN0LmZlYXR1cmVzLCBpID0gLTEsIG4gPSBmZWF0dXJlcy5sZW5ndGg7XG4gICAgICB3aGlsZSAoKytpIDwgbikgZDNfZ2VvX3N0cmVhbUdlb21ldHJ5KGZlYXR1cmVzW2ldLmdlb21ldHJ5LCBsaXN0ZW5lcik7XG4gICAgfVxuICB9O1xuICB2YXIgZDNfZ2VvX3N0cmVhbUdlb21ldHJ5VHlwZSA9IHtcbiAgICBTcGhlcmU6IGZ1bmN0aW9uKG9iamVjdCwgbGlzdGVuZXIpIHtcbiAgICAgIGxpc3RlbmVyLnNwaGVyZSgpO1xuICAgIH0sXG4gICAgUG9pbnQ6IGZ1bmN0aW9uKG9iamVjdCwgbGlzdGVuZXIpIHtcbiAgICAgIG9iamVjdCA9IG9iamVjdC5jb29yZGluYXRlcztcbiAgICAgIGxpc3RlbmVyLnBvaW50KG9iamVjdFswXSwgb2JqZWN0WzFdLCBvYmplY3RbMl0pO1xuICAgIH0sXG4gICAgTXVsdGlQb2ludDogZnVuY3Rpb24ob2JqZWN0LCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGNvb3JkaW5hdGVzID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7XG4gICAgICB3aGlsZSAoKytpIDwgbikgb2JqZWN0ID0gY29vcmRpbmF0ZXNbaV0sIGxpc3RlbmVyLnBvaW50KG9iamVjdFswXSwgb2JqZWN0WzFdLCBvYmplY3RbMl0pO1xuICAgIH0sXG4gICAgTGluZVN0cmluZzogZnVuY3Rpb24ob2JqZWN0LCBsaXN0ZW5lcikge1xuICAgICAgZDNfZ2VvX3N0cmVhbUxpbmUob2JqZWN0LmNvb3JkaW5hdGVzLCBsaXN0ZW5lciwgMCk7XG4gICAgfSxcbiAgICBNdWx0aUxpbmVTdHJpbmc6IGZ1bmN0aW9uKG9iamVjdCwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBjb29yZGluYXRlcyA9IG9iamVjdC5jb29yZGluYXRlcywgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGQzX2dlb19zdHJlYW1MaW5lKGNvb3JkaW5hdGVzW2ldLCBsaXN0ZW5lciwgMCk7XG4gICAgfSxcbiAgICBQb2x5Z29uOiBmdW5jdGlvbihvYmplY3QsIGxpc3RlbmVyKSB7XG4gICAgICBkM19nZW9fc3RyZWFtUG9seWdvbihvYmplY3QuY29vcmRpbmF0ZXMsIGxpc3RlbmVyKTtcbiAgICB9LFxuICAgIE11bHRpUG9seWdvbjogZnVuY3Rpb24ob2JqZWN0LCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGNvb3JkaW5hdGVzID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7XG4gICAgICB3aGlsZSAoKytpIDwgbikgZDNfZ2VvX3N0cmVhbVBvbHlnb24oY29vcmRpbmF0ZXNbaV0sIGxpc3RlbmVyKTtcbiAgICB9LFxuICAgIEdlb21ldHJ5Q29sbGVjdGlvbjogZnVuY3Rpb24ob2JqZWN0LCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGdlb21ldHJpZXMgPSBvYmplY3QuZ2VvbWV0cmllcywgaSA9IC0xLCBuID0gZ2VvbWV0cmllcy5sZW5ndGg7XG4gICAgICB3aGlsZSAoKytpIDwgbikgZDNfZ2VvX3N0cmVhbUdlb21ldHJ5KGdlb21ldHJpZXNbaV0sIGxpc3RlbmVyKTtcbiAgICB9XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2dlb19zdHJlYW1MaW5lKGNvb3JkaW5hdGVzLCBsaXN0ZW5lciwgY2xvc2VkKSB7XG4gICAgdmFyIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aCAtIGNsb3NlZCwgY29vcmRpbmF0ZTtcbiAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTtcbiAgICB3aGlsZSAoKytpIDwgbikgY29vcmRpbmF0ZSA9IGNvb3JkaW5hdGVzW2ldLCBsaXN0ZW5lci5wb2ludChjb29yZGluYXRlWzBdLCBjb29yZGluYXRlWzFdLCBjb29yZGluYXRlWzJdKTtcbiAgICBsaXN0ZW5lci5saW5lRW5kKCk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX3N0cmVhbVBvbHlnb24oY29vcmRpbmF0ZXMsIGxpc3RlbmVyKSB7XG4gICAgdmFyIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDtcbiAgICBsaXN0ZW5lci5wb2x5Z29uU3RhcnQoKTtcbiAgICB3aGlsZSAoKytpIDwgbikgZDNfZ2VvX3N0cmVhbUxpbmUoY29vcmRpbmF0ZXNbaV0sIGxpc3RlbmVyLCAxKTtcbiAgICBsaXN0ZW5lci5wb2x5Z29uRW5kKCk7XG4gIH1cbiAgZDMuZ2VvLmFyZWEgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICBkM19nZW9fYXJlYVN1bSA9IDA7XG4gICAgZDMuZ2VvLnN0cmVhbShvYmplY3QsIGQzX2dlb19hcmVhKTtcbiAgICByZXR1cm4gZDNfZ2VvX2FyZWFTdW07XG4gIH07XG4gIHZhciBkM19nZW9fYXJlYVN1bSwgZDNfZ2VvX2FyZWFSaW5nU3VtID0gbmV3IGQzX2FkZGVyKCk7XG4gIHZhciBkM19nZW9fYXJlYSA9IHtcbiAgICBzcGhlcmU6IGZ1bmN0aW9uKCkge1xuICAgICAgZDNfZ2VvX2FyZWFTdW0gKz0gNCAqIM+AO1xuICAgIH0sXG4gICAgcG9pbnQ6IGQzX25vb3AsXG4gICAgbGluZVN0YXJ0OiBkM19ub29wLFxuICAgIGxpbmVFbmQ6IGQzX25vb3AsXG4gICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIGQzX2dlb19hcmVhUmluZ1N1bS5yZXNldCgpO1xuICAgICAgZDNfZ2VvX2FyZWEubGluZVN0YXJ0ID0gZDNfZ2VvX2FyZWFSaW5nU3RhcnQ7XG4gICAgfSxcbiAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBhcmVhID0gMiAqIGQzX2dlb19hcmVhUmluZ1N1bTtcbiAgICAgIGQzX2dlb19hcmVhU3VtICs9IGFyZWEgPCAwID8gNCAqIM+AICsgYXJlYSA6IGFyZWE7XG4gICAgICBkM19nZW9fYXJlYS5saW5lU3RhcnQgPSBkM19nZW9fYXJlYS5saW5lRW5kID0gZDNfZ2VvX2FyZWEucG9pbnQgPSBkM19ub29wO1xuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gZDNfZ2VvX2FyZWFSaW5nU3RhcnQoKSB7XG4gICAgdmFyIM67MDAsIM+GMDAsIM67MCwgY29zz4YwLCBzaW7PhjA7XG4gICAgZDNfZ2VvX2FyZWEucG9pbnQgPSBmdW5jdGlvbijOuywgz4YpIHtcbiAgICAgIGQzX2dlb19hcmVhLnBvaW50ID0gbmV4dFBvaW50O1xuICAgICAgzrswID0gKM67MDAgPSDOuykgKiBkM19yYWRpYW5zLCBjb3PPhjAgPSBNYXRoLmNvcyjPhiA9ICjPhjAwID0gz4YpICogZDNfcmFkaWFucyAvIDIgKyDPgCAvIDQpLCBcbiAgICAgIHNpbs+GMCA9IE1hdGguc2luKM+GKTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIG5leHRQb2ludCjOuywgz4YpIHtcbiAgICAgIM67ICo9IGQzX3JhZGlhbnM7XG4gICAgICDPhiA9IM+GICogZDNfcmFkaWFucyAvIDIgKyDPgCAvIDQ7XG4gICAgICB2YXIgZM67ID0gzrsgLSDOuzAsIHNkzrsgPSBkzrsgPj0gMCA/IDEgOiAtMSwgYWTOuyA9IHNkzrsgKiBkzrssIGNvc8+GID0gTWF0aC5jb3Moz4YpLCBzaW7PhiA9IE1hdGguc2luKM+GKSwgayA9IHNpbs+GMCAqIHNpbs+GLCB1ID0gY29zz4YwICogY29zz4YgKyBrICogTWF0aC5jb3MoYWTOuyksIHYgPSBrICogc2TOuyAqIE1hdGguc2luKGFkzrspO1xuICAgICAgZDNfZ2VvX2FyZWFSaW5nU3VtLmFkZChNYXRoLmF0YW4yKHYsIHUpKTtcbiAgICAgIM67MCA9IM67LCBjb3PPhjAgPSBjb3PPhiwgc2luz4YwID0gc2luz4Y7XG4gICAgfVxuICAgIGQzX2dlb19hcmVhLmxpbmVFbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIG5leHRQb2ludCjOuzAwLCDPhjAwKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19jYXJ0ZXNpYW4oc3BoZXJpY2FsKSB7XG4gICAgdmFyIM67ID0gc3BoZXJpY2FsWzBdLCDPhiA9IHNwaGVyaWNhbFsxXSwgY29zz4YgPSBNYXRoLmNvcyjPhik7XG4gICAgcmV0dXJuIFsgY29zz4YgKiBNYXRoLmNvcyjOuyksIGNvc8+GICogTWF0aC5zaW4ozrspLCBNYXRoLnNpbijPhikgXTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fY2FydGVzaWFuRG90KGEsIGIpIHtcbiAgICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19jYXJ0ZXNpYW5Dcm9zcyhhLCBiKSB7XG4gICAgcmV0dXJuIFsgYVsxXSAqIGJbMl0gLSBhWzJdICogYlsxXSwgYVsyXSAqIGJbMF0gLSBhWzBdICogYlsyXSwgYVswXSAqIGJbMV0gLSBhWzFdICogYlswXSBdO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19jYXJ0ZXNpYW5BZGQoYSwgYikge1xuICAgIGFbMF0gKz0gYlswXTtcbiAgICBhWzFdICs9IGJbMV07XG4gICAgYVsyXSArPSBiWzJdO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19jYXJ0ZXNpYW5TY2FsZSh2ZWN0b3IsIGspIHtcbiAgICByZXR1cm4gWyB2ZWN0b3JbMF0gKiBrLCB2ZWN0b3JbMV0gKiBrLCB2ZWN0b3JbMl0gKiBrIF07XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2NhcnRlc2lhbk5vcm1hbGl6ZShkKSB7XG4gICAgdmFyIGwgPSBNYXRoLnNxcnQoZFswXSAqIGRbMF0gKyBkWzFdICogZFsxXSArIGRbMl0gKiBkWzJdKTtcbiAgICBkWzBdIC89IGw7XG4gICAgZFsxXSAvPSBsO1xuICAgIGRbMl0gLz0gbDtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fc3BoZXJpY2FsKGNhcnRlc2lhbikge1xuICAgIHJldHVybiBbIE1hdGguYXRhbjIoY2FydGVzaWFuWzFdLCBjYXJ0ZXNpYW5bMF0pLCBkM19hc2luKGNhcnRlc2lhblsyXSkgXTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fc3BoZXJpY2FsRXF1YWwoYSwgYikge1xuICAgIHJldHVybiBhYnMoYVswXSAtIGJbMF0pIDwgzrUgJiYgYWJzKGFbMV0gLSBiWzFdKSA8IM61O1xuICB9XG4gIGQzLmdlby5ib3VuZHMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgzrswLCDPhjAsIM67MSwgz4YxLCDOu18sIM67X18sIM+GX18sIHAwLCBkzrtTdW0sIHJhbmdlcywgcmFuZ2U7XG4gICAgdmFyIGJvdW5kID0ge1xuICAgICAgcG9pbnQ6IHBvaW50LFxuICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsXG4gICAgICBsaW5lRW5kOiBsaW5lRW5kLFxuICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgYm91bmQucG9pbnQgPSByaW5nUG9pbnQ7XG4gICAgICAgIGJvdW5kLmxpbmVTdGFydCA9IHJpbmdTdGFydDtcbiAgICAgICAgYm91bmQubGluZUVuZCA9IHJpbmdFbmQ7XG4gICAgICAgIGTOu1N1bSA9IDA7XG4gICAgICAgIGQzX2dlb19hcmVhLnBvbHlnb25TdGFydCgpO1xuICAgICAgfSxcbiAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBkM19nZW9fYXJlYS5wb2x5Z29uRW5kKCk7XG4gICAgICAgIGJvdW5kLnBvaW50ID0gcG9pbnQ7XG4gICAgICAgIGJvdW5kLmxpbmVTdGFydCA9IGxpbmVTdGFydDtcbiAgICAgICAgYm91bmQubGluZUVuZCA9IGxpbmVFbmQ7XG4gICAgICAgIGlmIChkM19nZW9fYXJlYVJpbmdTdW0gPCAwKSDOuzAgPSAtKM67MSA9IDE4MCksIM+GMCA9IC0oz4YxID0gOTApOyBlbHNlIGlmIChkzrtTdW0gPiDOtSkgz4YxID0gOTA7IGVsc2UgaWYgKGTOu1N1bSA8IC3OtSkgz4YwID0gLTkwO1xuICAgICAgICByYW5nZVswXSA9IM67MCwgcmFuZ2VbMV0gPSDOuzE7XG4gICAgICB9XG4gICAgfTtcbiAgICBmdW5jdGlvbiBwb2ludCjOuywgz4YpIHtcbiAgICAgIHJhbmdlcy5wdXNoKHJhbmdlID0gWyDOuzAgPSDOuywgzrsxID0gzrsgXSk7XG4gICAgICBpZiAoz4YgPCDPhjApIM+GMCA9IM+GO1xuICAgICAgaWYgKM+GID4gz4YxKSDPhjEgPSDPhjtcbiAgICB9XG4gICAgZnVuY3Rpb24gbGluZVBvaW50KM67LCDPhikge1xuICAgICAgdmFyIHAgPSBkM19nZW9fY2FydGVzaWFuKFsgzrsgKiBkM19yYWRpYW5zLCDPhiAqIGQzX3JhZGlhbnMgXSk7XG4gICAgICBpZiAocDApIHtcbiAgICAgICAgdmFyIG5vcm1hbCA9IGQzX2dlb19jYXJ0ZXNpYW5Dcm9zcyhwMCwgcCksIGVxdWF0b3JpYWwgPSBbIG5vcm1hbFsxXSwgLW5vcm1hbFswXSwgMCBdLCBpbmZsZWN0aW9uID0gZDNfZ2VvX2NhcnRlc2lhbkNyb3NzKGVxdWF0b3JpYWwsIG5vcm1hbCk7XG4gICAgICAgIGQzX2dlb19jYXJ0ZXNpYW5Ob3JtYWxpemUoaW5mbGVjdGlvbik7XG4gICAgICAgIGluZmxlY3Rpb24gPSBkM19nZW9fc3BoZXJpY2FsKGluZmxlY3Rpb24pO1xuICAgICAgICB2YXIgZM67ID0gzrsgLSDOu18sIHMgPSBkzrsgPiAwID8gMSA6IC0xLCDOu2kgPSBpbmZsZWN0aW9uWzBdICogZDNfZGVncmVlcyAqIHMsIGFudGltZXJpZGlhbiA9IGFicyhkzrspID4gMTgwO1xuICAgICAgICBpZiAoYW50aW1lcmlkaWFuIF4gKHMgKiDOu18gPCDOu2kgJiYgzrtpIDwgcyAqIM67KSkge1xuICAgICAgICAgIHZhciDPhmkgPSBpbmZsZWN0aW9uWzFdICogZDNfZGVncmVlcztcbiAgICAgICAgICBpZiAoz4ZpID4gz4YxKSDPhjEgPSDPhmk7XG4gICAgICAgIH0gZWxzZSBpZiAozrtpID0gKM67aSArIDM2MCkgJSAzNjAgLSAxODAsIGFudGltZXJpZGlhbiBeIChzICogzrtfIDwgzrtpICYmIM67aSA8IHMgKiDOuykpIHtcbiAgICAgICAgICB2YXIgz4ZpID0gLWluZmxlY3Rpb25bMV0gKiBkM19kZWdyZWVzO1xuICAgICAgICAgIGlmICjPhmkgPCDPhjApIM+GMCA9IM+GaTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoz4YgPCDPhjApIM+GMCA9IM+GO1xuICAgICAgICAgIGlmICjPhiA+IM+GMSkgz4YxID0gz4Y7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFudGltZXJpZGlhbikge1xuICAgICAgICAgIGlmICjOuyA8IM67Xykge1xuICAgICAgICAgICAgaWYgKGFuZ2xlKM67MCwgzrspID4gYW5nbGUozrswLCDOuzEpKSDOuzEgPSDOuztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGFuZ2xlKM67LCDOuzEpID4gYW5nbGUozrswLCDOuzEpKSDOuzAgPSDOuztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKM67MSA+PSDOuzApIHtcbiAgICAgICAgICAgIGlmICjOuyA8IM67MCkgzrswID0gzrs7XG4gICAgICAgICAgICBpZiAozrsgPiDOuzEpIM67MSA9IM67O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAozrsgPiDOu18pIHtcbiAgICAgICAgICAgICAgaWYgKGFuZ2xlKM67MCwgzrspID4gYW5nbGUozrswLCDOuzEpKSDOuzEgPSDOuztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChhbmdsZSjOuywgzrsxKSA+IGFuZ2xlKM67MCwgzrsxKSkgzrswID0gzrs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb2ludCjOuywgz4YpO1xuICAgICAgfVxuICAgICAgcDAgPSBwLCDOu18gPSDOuztcbiAgICB9XG4gICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkge1xuICAgICAgYm91bmQucG9pbnQgPSBsaW5lUG9pbnQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxpbmVFbmQoKSB7XG4gICAgICByYW5nZVswXSA9IM67MCwgcmFuZ2VbMV0gPSDOuzE7XG4gICAgICBib3VuZC5wb2ludCA9IHBvaW50O1xuICAgICAgcDAgPSBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiByaW5nUG9pbnQozrssIM+GKSB7XG4gICAgICBpZiAocDApIHtcbiAgICAgICAgdmFyIGTOuyA9IM67IC0gzrtfO1xuICAgICAgICBkzrtTdW0gKz0gYWJzKGTOuykgPiAxODAgPyBkzrsgKyAoZM67ID4gMCA/IDM2MCA6IC0zNjApIDogZM67O1xuICAgICAgfSBlbHNlIM67X18gPSDOuywgz4ZfXyA9IM+GO1xuICAgICAgZDNfZ2VvX2FyZWEucG9pbnQozrssIM+GKTtcbiAgICAgIGxpbmVQb2ludCjOuywgz4YpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByaW5nU3RhcnQoKSB7XG4gICAgICBkM19nZW9fYXJlYS5saW5lU3RhcnQoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmluZ0VuZCgpIHtcbiAgICAgIHJpbmdQb2ludCjOu19fLCDPhl9fKTtcbiAgICAgIGQzX2dlb19hcmVhLmxpbmVFbmQoKTtcbiAgICAgIGlmIChhYnMoZM67U3VtKSA+IM61KSDOuzAgPSAtKM67MSA9IDE4MCk7XG4gICAgICByYW5nZVswXSA9IM67MCwgcmFuZ2VbMV0gPSDOuzE7XG4gICAgICBwMCA9IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFuZ2xlKM67MCwgzrsxKSB7XG4gICAgICByZXR1cm4gKM67MSAtPSDOuzApIDwgMCA/IM67MSArIDM2MCA6IM67MTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tcGFyZVJhbmdlcyhhLCBiKSB7XG4gICAgICByZXR1cm4gYVswXSAtIGJbMF07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdpdGhpblJhbmdlKHgsIHJhbmdlKSB7XG4gICAgICByZXR1cm4gcmFuZ2VbMF0gPD0gcmFuZ2VbMV0gPyByYW5nZVswXSA8PSB4ICYmIHggPD0gcmFuZ2VbMV0gOiB4IDwgcmFuZ2VbMF0gfHwgcmFuZ2VbMV0gPCB4O1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24oZmVhdHVyZSkge1xuICAgICAgz4YxID0gzrsxID0gLSjOuzAgPSDPhjAgPSBJbmZpbml0eSk7XG4gICAgICByYW5nZXMgPSBbXTtcbiAgICAgIGQzLmdlby5zdHJlYW0oZmVhdHVyZSwgYm91bmQpO1xuICAgICAgdmFyIG4gPSByYW5nZXMubGVuZ3RoO1xuICAgICAgaWYgKG4pIHtcbiAgICAgICAgcmFuZ2VzLnNvcnQoY29tcGFyZVJhbmdlcyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAxLCBhID0gcmFuZ2VzWzBdLCBiLCBtZXJnZWQgPSBbIGEgXTsgaSA8IG47ICsraSkge1xuICAgICAgICAgIGIgPSByYW5nZXNbaV07XG4gICAgICAgICAgaWYgKHdpdGhpblJhbmdlKGJbMF0sIGEpIHx8IHdpdGhpblJhbmdlKGJbMV0sIGEpKSB7XG4gICAgICAgICAgICBpZiAoYW5nbGUoYVswXSwgYlsxXSkgPiBhbmdsZShhWzBdLCBhWzFdKSkgYVsxXSA9IGJbMV07XG4gICAgICAgICAgICBpZiAoYW5nbGUoYlswXSwgYVsxXSkgPiBhbmdsZShhWzBdLCBhWzFdKSkgYVswXSA9IGJbMF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1lcmdlZC5wdXNoKGEgPSBiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGJlc3QgPSAtSW5maW5pdHksIGTOuztcbiAgICAgICAgZm9yICh2YXIgbiA9IG1lcmdlZC5sZW5ndGggLSAxLCBpID0gMCwgYSA9IG1lcmdlZFtuXSwgYjsgaSA8PSBuOyBhID0gYiwgKytpKSB7XG4gICAgICAgICAgYiA9IG1lcmdlZFtpXTtcbiAgICAgICAgICBpZiAoKGTOuyA9IGFuZ2xlKGFbMV0sIGJbMF0pKSA+IGJlc3QpIGJlc3QgPSBkzrssIM67MCA9IGJbMF0sIM67MSA9IGFbMV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJhbmdlcyA9IHJhbmdlID0gbnVsbDtcbiAgICAgIHJldHVybiDOuzAgPT09IEluZmluaXR5IHx8IM+GMCA9PT0gSW5maW5pdHkgPyBbIFsgTmFOLCBOYU4gXSwgWyBOYU4sIE5hTiBdIF0gOiBbIFsgzrswLCDPhjAgXSwgWyDOuzEsIM+GMSBdIF07XG4gICAgfTtcbiAgfSgpO1xuICBkMy5nZW8uY2VudHJvaWQgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICBkM19nZW9fY2VudHJvaWRXMCA9IGQzX2dlb19jZW50cm9pZFcxID0gZDNfZ2VvX2NlbnRyb2lkWDAgPSBkM19nZW9fY2VudHJvaWRZMCA9IGQzX2dlb19jZW50cm9pZFowID0gZDNfZ2VvX2NlbnRyb2lkWDEgPSBkM19nZW9fY2VudHJvaWRZMSA9IGQzX2dlb19jZW50cm9pZFoxID0gZDNfZ2VvX2NlbnRyb2lkWDIgPSBkM19nZW9fY2VudHJvaWRZMiA9IGQzX2dlb19jZW50cm9pZFoyID0gMDtcbiAgICBkMy5nZW8uc3RyZWFtKG9iamVjdCwgZDNfZ2VvX2NlbnRyb2lkKTtcbiAgICB2YXIgeCA9IGQzX2dlb19jZW50cm9pZFgyLCB5ID0gZDNfZ2VvX2NlbnRyb2lkWTIsIHogPSBkM19nZW9fY2VudHJvaWRaMiwgbSA9IHggKiB4ICsgeSAqIHkgKyB6ICogejtcbiAgICBpZiAobSA8IM61Mikge1xuICAgICAgeCA9IGQzX2dlb19jZW50cm9pZFgxLCB5ID0gZDNfZ2VvX2NlbnRyb2lkWTEsIHogPSBkM19nZW9fY2VudHJvaWRaMTtcbiAgICAgIGlmIChkM19nZW9fY2VudHJvaWRXMSA8IM61KSB4ID0gZDNfZ2VvX2NlbnRyb2lkWDAsIHkgPSBkM19nZW9fY2VudHJvaWRZMCwgeiA9IGQzX2dlb19jZW50cm9pZFowO1xuICAgICAgbSA9IHggKiB4ICsgeSAqIHkgKyB6ICogejtcbiAgICAgIGlmIChtIDwgzrUyKSByZXR1cm4gWyBOYU4sIE5hTiBdO1xuICAgIH1cbiAgICByZXR1cm4gWyBNYXRoLmF0YW4yKHksIHgpICogZDNfZGVncmVlcywgZDNfYXNpbih6IC8gTWF0aC5zcXJ0KG0pKSAqIGQzX2RlZ3JlZXMgXTtcbiAgfTtcbiAgdmFyIGQzX2dlb19jZW50cm9pZFcwLCBkM19nZW9fY2VudHJvaWRXMSwgZDNfZ2VvX2NlbnRyb2lkWDAsIGQzX2dlb19jZW50cm9pZFkwLCBkM19nZW9fY2VudHJvaWRaMCwgZDNfZ2VvX2NlbnRyb2lkWDEsIGQzX2dlb19jZW50cm9pZFkxLCBkM19nZW9fY2VudHJvaWRaMSwgZDNfZ2VvX2NlbnRyb2lkWDIsIGQzX2dlb19jZW50cm9pZFkyLCBkM19nZW9fY2VudHJvaWRaMjtcbiAgdmFyIGQzX2dlb19jZW50cm9pZCA9IHtcbiAgICBzcGhlcmU6IGQzX25vb3AsXG4gICAgcG9pbnQ6IGQzX2dlb19jZW50cm9pZFBvaW50LFxuICAgIGxpbmVTdGFydDogZDNfZ2VvX2NlbnRyb2lkTGluZVN0YXJ0LFxuICAgIGxpbmVFbmQ6IGQzX2dlb19jZW50cm9pZExpbmVFbmQsXG4gICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIGQzX2dlb19jZW50cm9pZC5saW5lU3RhcnQgPSBkM19nZW9fY2VudHJvaWRSaW5nU3RhcnQ7XG4gICAgfSxcbiAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHtcbiAgICAgIGQzX2dlb19jZW50cm9pZC5saW5lU3RhcnQgPSBkM19nZW9fY2VudHJvaWRMaW5lU3RhcnQ7XG4gICAgfVxuICB9O1xuICBmdW5jdGlvbiBkM19nZW9fY2VudHJvaWRQb2ludCjOuywgz4YpIHtcbiAgICDOuyAqPSBkM19yYWRpYW5zO1xuICAgIHZhciBjb3PPhiA9IE1hdGguY29zKM+GICo9IGQzX3JhZGlhbnMpO1xuICAgIGQzX2dlb19jZW50cm9pZFBvaW50WFlaKGNvc8+GICogTWF0aC5jb3MozrspLCBjb3PPhiAqIE1hdGguc2luKM67KSwgTWF0aC5zaW4oz4YpKTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fY2VudHJvaWRQb2ludFhZWih4LCB5LCB6KSB7XG4gICAgKytkM19nZW9fY2VudHJvaWRXMDtcbiAgICBkM19nZW9fY2VudHJvaWRYMCArPSAoeCAtIGQzX2dlb19jZW50cm9pZFgwKSAvIGQzX2dlb19jZW50cm9pZFcwO1xuICAgIGQzX2dlb19jZW50cm9pZFkwICs9ICh5IC0gZDNfZ2VvX2NlbnRyb2lkWTApIC8gZDNfZ2VvX2NlbnRyb2lkVzA7XG4gICAgZDNfZ2VvX2NlbnRyb2lkWjAgKz0gKHogLSBkM19nZW9fY2VudHJvaWRaMCkgLyBkM19nZW9fY2VudHJvaWRXMDtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fY2VudHJvaWRMaW5lU3RhcnQoKSB7XG4gICAgdmFyIHgwLCB5MCwgejA7XG4gICAgZDNfZ2VvX2NlbnRyb2lkLnBvaW50ID0gZnVuY3Rpb24ozrssIM+GKSB7XG4gICAgICDOuyAqPSBkM19yYWRpYW5zO1xuICAgICAgdmFyIGNvc8+GID0gTWF0aC5jb3Moz4YgKj0gZDNfcmFkaWFucyk7XG4gICAgICB4MCA9IGNvc8+GICogTWF0aC5jb3MozrspO1xuICAgICAgeTAgPSBjb3PPhiAqIE1hdGguc2luKM67KTtcbiAgICAgIHowID0gTWF0aC5zaW4oz4YpO1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkLnBvaW50ID0gbmV4dFBvaW50O1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkUG9pbnRYWVooeDAsIHkwLCB6MCk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBuZXh0UG9pbnQozrssIM+GKSB7XG4gICAgICDOuyAqPSBkM19yYWRpYW5zO1xuICAgICAgdmFyIGNvc8+GID0gTWF0aC5jb3Moz4YgKj0gZDNfcmFkaWFucyksIHggPSBjb3PPhiAqIE1hdGguY29zKM67KSwgeSA9IGNvc8+GICogTWF0aC5zaW4ozrspLCB6ID0gTWF0aC5zaW4oz4YpLCB3ID0gTWF0aC5hdGFuMihNYXRoLnNxcnQoKHcgPSB5MCAqIHogLSB6MCAqIHkpICogdyArICh3ID0gejAgKiB4IC0geDAgKiB6KSAqIHcgKyAodyA9IHgwICogeSAtIHkwICogeCkgKiB3KSwgeDAgKiB4ICsgeTAgKiB5ICsgejAgKiB6KTtcbiAgICAgIGQzX2dlb19jZW50cm9pZFcxICs9IHc7XG4gICAgICBkM19nZW9fY2VudHJvaWRYMSArPSB3ICogKHgwICsgKHgwID0geCkpO1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkWTEgKz0gdyAqICh5MCArICh5MCA9IHkpKTtcbiAgICAgIGQzX2dlb19jZW50cm9pZFoxICs9IHcgKiAoejAgKyAoejAgPSB6KSk7XG4gICAgICBkM19nZW9fY2VudHJvaWRQb2ludFhZWih4MCwgeTAsIHowKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2NlbnRyb2lkTGluZUVuZCgpIHtcbiAgICBkM19nZW9fY2VudHJvaWQucG9pbnQgPSBkM19nZW9fY2VudHJvaWRQb2ludDtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fY2VudHJvaWRSaW5nU3RhcnQoKSB7XG4gICAgdmFyIM67MDAsIM+GMDAsIHgwLCB5MCwgejA7XG4gICAgZDNfZ2VvX2NlbnRyb2lkLnBvaW50ID0gZnVuY3Rpb24ozrssIM+GKSB7XG4gICAgICDOuzAwID0gzrssIM+GMDAgPSDPhjtcbiAgICAgIGQzX2dlb19jZW50cm9pZC5wb2ludCA9IG5leHRQb2ludDtcbiAgICAgIM67ICo9IGQzX3JhZGlhbnM7XG4gICAgICB2YXIgY29zz4YgPSBNYXRoLmNvcyjPhiAqPSBkM19yYWRpYW5zKTtcbiAgICAgIHgwID0gY29zz4YgKiBNYXRoLmNvcyjOuyk7XG4gICAgICB5MCA9IGNvc8+GICogTWF0aC5zaW4ozrspO1xuICAgICAgejAgPSBNYXRoLnNpbijPhik7XG4gICAgICBkM19nZW9fY2VudHJvaWRQb2ludFhZWih4MCwgeTAsIHowKTtcbiAgICB9O1xuICAgIGQzX2dlb19jZW50cm9pZC5saW5lRW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICBuZXh0UG9pbnQozrswMCwgz4YwMCk7XG4gICAgICBkM19nZW9fY2VudHJvaWQubGluZUVuZCA9IGQzX2dlb19jZW50cm9pZExpbmVFbmQ7XG4gICAgICBkM19nZW9fY2VudHJvaWQucG9pbnQgPSBkM19nZW9fY2VudHJvaWRQb2ludDtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIG5leHRQb2ludCjOuywgz4YpIHtcbiAgICAgIM67ICo9IGQzX3JhZGlhbnM7XG4gICAgICB2YXIgY29zz4YgPSBNYXRoLmNvcyjPhiAqPSBkM19yYWRpYW5zKSwgeCA9IGNvc8+GICogTWF0aC5jb3MozrspLCB5ID0gY29zz4YgKiBNYXRoLnNpbijOuyksIHogPSBNYXRoLnNpbijPhiksIGN4ID0geTAgKiB6IC0gejAgKiB5LCBjeSA9IHowICogeCAtIHgwICogeiwgY3ogPSB4MCAqIHkgLSB5MCAqIHgsIG0gPSBNYXRoLnNxcnQoY3ggKiBjeCArIGN5ICogY3kgKyBjeiAqIGN6KSwgdSA9IHgwICogeCArIHkwICogeSArIHowICogeiwgdiA9IG0gJiYgLWQzX2Fjb3ModSkgLyBtLCB3ID0gTWF0aC5hdGFuMihtLCB1KTtcbiAgICAgIGQzX2dlb19jZW50cm9pZFgyICs9IHYgKiBjeDtcbiAgICAgIGQzX2dlb19jZW50cm9pZFkyICs9IHYgKiBjeTtcbiAgICAgIGQzX2dlb19jZW50cm9pZFoyICs9IHYgKiBjejtcbiAgICAgIGQzX2dlb19jZW50cm9pZFcxICs9IHc7XG4gICAgICBkM19nZW9fY2VudHJvaWRYMSArPSB3ICogKHgwICsgKHgwID0geCkpO1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkWTEgKz0gdyAqICh5MCArICh5MCA9IHkpKTtcbiAgICAgIGQzX2dlb19jZW50cm9pZFoxICs9IHcgKiAoejAgKyAoejAgPSB6KSk7XG4gICAgICBkM19nZW9fY2VudHJvaWRQb2ludFhZWih4MCwgeTAsIHowKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2NvbXBvc2UoYSwgYikge1xuICAgIGZ1bmN0aW9uIGNvbXBvc2UoeCwgeSkge1xuICAgICAgcmV0dXJuIHggPSBhKHgsIHkpLCBiKHhbMF0sIHhbMV0pO1xuICAgIH1cbiAgICBpZiAoYS5pbnZlcnQgJiYgYi5pbnZlcnQpIGNvbXBvc2UuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkge1xuICAgICAgcmV0dXJuIHggPSBiLmludmVydCh4LCB5KSwgeCAmJiBhLmludmVydCh4WzBdLCB4WzFdKTtcbiAgICB9O1xuICAgIHJldHVybiBjb21wb3NlO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3RydWUoKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBQb2x5Z29uKHNlZ21lbnRzLCBjb21wYXJlLCBjbGlwU3RhcnRJbnNpZGUsIGludGVycG9sYXRlLCBsaXN0ZW5lcikge1xuICAgIHZhciBzdWJqZWN0ID0gW10sIGNsaXAgPSBbXTtcbiAgICBzZWdtZW50cy5mb3JFYWNoKGZ1bmN0aW9uKHNlZ21lbnQpIHtcbiAgICAgIGlmICgobiA9IHNlZ21lbnQubGVuZ3RoIC0gMSkgPD0gMCkgcmV0dXJuO1xuICAgICAgdmFyIG4sIHAwID0gc2VnbWVudFswXSwgcDEgPSBzZWdtZW50W25dO1xuICAgICAgaWYgKGQzX2dlb19zcGhlcmljYWxFcXVhbChwMCwgcDEpKSB7XG4gICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkgbGlzdGVuZXIucG9pbnQoKHAwID0gc2VnbWVudFtpXSlbMF0sIHAwWzFdKTtcbiAgICAgICAgbGlzdGVuZXIubGluZUVuZCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgYSA9IG5ldyBkM19nZW9fY2xpcFBvbHlnb25JbnRlcnNlY3Rpb24ocDAsIHNlZ21lbnQsIG51bGwsIHRydWUpLCBiID0gbmV3IGQzX2dlb19jbGlwUG9seWdvbkludGVyc2VjdGlvbihwMCwgbnVsbCwgYSwgZmFsc2UpO1xuICAgICAgYS5vID0gYjtcbiAgICAgIHN1YmplY3QucHVzaChhKTtcbiAgICAgIGNsaXAucHVzaChiKTtcbiAgICAgIGEgPSBuZXcgZDNfZ2VvX2NsaXBQb2x5Z29uSW50ZXJzZWN0aW9uKHAxLCBzZWdtZW50LCBudWxsLCBmYWxzZSk7XG4gICAgICBiID0gbmV3IGQzX2dlb19jbGlwUG9seWdvbkludGVyc2VjdGlvbihwMSwgbnVsbCwgYSwgdHJ1ZSk7XG4gICAgICBhLm8gPSBiO1xuICAgICAgc3ViamVjdC5wdXNoKGEpO1xuICAgICAgY2xpcC5wdXNoKGIpO1xuICAgIH0pO1xuICAgIGNsaXAuc29ydChjb21wYXJlKTtcbiAgICBkM19nZW9fY2xpcFBvbHlnb25MaW5rQ2lyY3VsYXIoc3ViamVjdCk7XG4gICAgZDNfZ2VvX2NsaXBQb2x5Z29uTGlua0NpcmN1bGFyKGNsaXApO1xuICAgIGlmICghc3ViamVjdC5sZW5ndGgpIHJldHVybjtcbiAgICBmb3IgKHZhciBpID0gMCwgZW50cnkgPSBjbGlwU3RhcnRJbnNpZGUsIG4gPSBjbGlwLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgY2xpcFtpXS5lID0gZW50cnkgPSAhZW50cnk7XG4gICAgfVxuICAgIHZhciBzdGFydCA9IHN1YmplY3RbMF0sIHBvaW50cywgcG9pbnQ7XG4gICAgd2hpbGUgKDEpIHtcbiAgICAgIHZhciBjdXJyZW50ID0gc3RhcnQsIGlzU3ViamVjdCA9IHRydWU7XG4gICAgICB3aGlsZSAoY3VycmVudC52KSBpZiAoKGN1cnJlbnQgPSBjdXJyZW50Lm4pID09PSBzdGFydCkgcmV0dXJuO1xuICAgICAgcG9pbnRzID0gY3VycmVudC56O1xuICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7XG4gICAgICBkbyB7XG4gICAgICAgIGN1cnJlbnQudiA9IGN1cnJlbnQuby52ID0gdHJ1ZTtcbiAgICAgICAgaWYgKGN1cnJlbnQuZSkge1xuICAgICAgICAgIGlmIChpc1N1YmplY3QpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gcG9pbnRzLmxlbmd0aDsgaSA8IG47ICsraSkgbGlzdGVuZXIucG9pbnQoKHBvaW50ID0gcG9pbnRzW2ldKVswXSwgcG9pbnRbMV0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZShjdXJyZW50LngsIGN1cnJlbnQubi54LCAxLCBsaXN0ZW5lcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGlzU3ViamVjdCkge1xuICAgICAgICAgICAgcG9pbnRzID0gY3VycmVudC5wLno7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gcG9pbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSBsaXN0ZW5lci5wb2ludCgocG9pbnQgPSBwb2ludHNbaV0pWzBdLCBwb2ludFsxXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGludGVycG9sYXRlKGN1cnJlbnQueCwgY3VycmVudC5wLngsIC0xLCBsaXN0ZW5lcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnA7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubztcbiAgICAgICAgcG9pbnRzID0gY3VycmVudC56O1xuICAgICAgICBpc1N1YmplY3QgPSAhaXNTdWJqZWN0O1xuICAgICAgfSB3aGlsZSAoIWN1cnJlbnQudik7XG4gICAgICBsaXN0ZW5lci5saW5lRW5kKCk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19jbGlwUG9seWdvbkxpbmtDaXJjdWxhcihhcnJheSkge1xuICAgIGlmICghKG4gPSBhcnJheS5sZW5ndGgpKSByZXR1cm47XG4gICAgdmFyIG4sIGkgPSAwLCBhID0gYXJyYXlbMF0sIGI7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGEubiA9IGIgPSBhcnJheVtpXTtcbiAgICAgIGIucCA9IGE7XG4gICAgICBhID0gYjtcbiAgICB9XG4gICAgYS5uID0gYiA9IGFycmF5WzBdO1xuICAgIGIucCA9IGE7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBQb2x5Z29uSW50ZXJzZWN0aW9uKHBvaW50LCBwb2ludHMsIG90aGVyLCBlbnRyeSkge1xuICAgIHRoaXMueCA9IHBvaW50O1xuICAgIHRoaXMueiA9IHBvaW50cztcbiAgICB0aGlzLm8gPSBvdGhlcjtcbiAgICB0aGlzLmUgPSBlbnRyeTtcbiAgICB0aGlzLnYgPSBmYWxzZTtcbiAgICB0aGlzLm4gPSB0aGlzLnAgPSBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19jbGlwKHBvaW50VmlzaWJsZSwgY2xpcExpbmUsIGludGVycG9sYXRlLCBjbGlwU3RhcnQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ocm90YXRlLCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGxpbmUgPSBjbGlwTGluZShsaXN0ZW5lciksIHJvdGF0ZWRDbGlwU3RhcnQgPSByb3RhdGUuaW52ZXJ0KGNsaXBTdGFydFswXSwgY2xpcFN0YXJ0WzFdKTtcbiAgICAgIHZhciBjbGlwID0ge1xuICAgICAgICBwb2ludDogcG9pbnQsXG4gICAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LFxuICAgICAgICBsaW5lRW5kOiBsaW5lRW5kLFxuICAgICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGNsaXAucG9pbnQgPSBwb2ludFJpbmc7XG4gICAgICAgICAgY2xpcC5saW5lU3RhcnQgPSByaW5nU3RhcnQ7XG4gICAgICAgICAgY2xpcC5saW5lRW5kID0gcmluZ0VuZDtcbiAgICAgICAgICBzZWdtZW50cyA9IFtdO1xuICAgICAgICAgIHBvbHlnb24gPSBbXTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgY2xpcC5wb2ludCA9IHBvaW50O1xuICAgICAgICAgIGNsaXAubGluZVN0YXJ0ID0gbGluZVN0YXJ0O1xuICAgICAgICAgIGNsaXAubGluZUVuZCA9IGxpbmVFbmQ7XG4gICAgICAgICAgc2VnbWVudHMgPSBkMy5tZXJnZShzZWdtZW50cyk7XG4gICAgICAgICAgdmFyIGNsaXBTdGFydEluc2lkZSA9IGQzX2dlb19wb2ludEluUG9seWdvbihyb3RhdGVkQ2xpcFN0YXJ0LCBwb2x5Z29uKTtcbiAgICAgICAgICBpZiAoc2VnbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAoIXBvbHlnb25TdGFydGVkKSBsaXN0ZW5lci5wb2x5Z29uU3RhcnQoKSwgcG9seWdvblN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgZDNfZ2VvX2NsaXBQb2x5Z29uKHNlZ21lbnRzLCBkM19nZW9fY2xpcFNvcnQsIGNsaXBTdGFydEluc2lkZSwgaW50ZXJwb2xhdGUsIGxpc3RlbmVyKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNsaXBTdGFydEluc2lkZSkge1xuICAgICAgICAgICAgaWYgKCFwb2x5Z29uU3RhcnRlZCkgbGlzdGVuZXIucG9seWdvblN0YXJ0KCksIHBvbHlnb25TdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpO1xuICAgICAgICAgICAgaW50ZXJwb2xhdGUobnVsbCwgbnVsbCwgMSwgbGlzdGVuZXIpO1xuICAgICAgICAgICAgbGlzdGVuZXIubGluZUVuZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocG9seWdvblN0YXJ0ZWQpIGxpc3RlbmVyLnBvbHlnb25FbmQoKSwgcG9seWdvblN0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgICAgICBzZWdtZW50cyA9IHBvbHlnb24gPSBudWxsO1xuICAgICAgICB9LFxuICAgICAgICBzcGhlcmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGxpc3RlbmVyLnBvbHlnb25TdGFydCgpO1xuICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpO1xuICAgICAgICAgIGludGVycG9sYXRlKG51bGwsIG51bGwsIDEsIGxpc3RlbmVyKTtcbiAgICAgICAgICBsaXN0ZW5lci5saW5lRW5kKCk7XG4gICAgICAgICAgbGlzdGVuZXIucG9seWdvbkVuZCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gcG9pbnQozrssIM+GKSB7XG4gICAgICAgIHZhciBwb2ludCA9IHJvdGF0ZSjOuywgz4YpO1xuICAgICAgICBpZiAocG9pbnRWaXNpYmxlKM67ID0gcG9pbnRbMF0sIM+GID0gcG9pbnRbMV0pKSBsaXN0ZW5lci5wb2ludCjOuywgz4YpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcG9pbnRMaW5lKM67LCDPhikge1xuICAgICAgICB2YXIgcG9pbnQgPSByb3RhdGUozrssIM+GKTtcbiAgICAgICAgbGluZS5wb2ludChwb2ludFswXSwgcG9pbnRbMV0pO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkge1xuICAgICAgICBjbGlwLnBvaW50ID0gcG9pbnRMaW5lO1xuICAgICAgICBsaW5lLmxpbmVTdGFydCgpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gbGluZUVuZCgpIHtcbiAgICAgICAgY2xpcC5wb2ludCA9IHBvaW50O1xuICAgICAgICBsaW5lLmxpbmVFbmQoKTtcbiAgICAgIH1cbiAgICAgIHZhciBzZWdtZW50cztcbiAgICAgIHZhciBidWZmZXIgPSBkM19nZW9fY2xpcEJ1ZmZlckxpc3RlbmVyKCksIHJpbmdMaXN0ZW5lciA9IGNsaXBMaW5lKGJ1ZmZlciksIHBvbHlnb25TdGFydGVkID0gZmFsc2UsIHBvbHlnb24sIHJpbmc7XG4gICAgICBmdW5jdGlvbiBwb2ludFJpbmcozrssIM+GKSB7XG4gICAgICAgIHJpbmcucHVzaChbIM67LCDPhiBdKTtcbiAgICAgICAgdmFyIHBvaW50ID0gcm90YXRlKM67LCDPhik7XG4gICAgICAgIHJpbmdMaXN0ZW5lci5wb2ludChwb2ludFswXSwgcG9pbnRbMV0pO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcmluZ1N0YXJ0KCkge1xuICAgICAgICByaW5nTGlzdGVuZXIubGluZVN0YXJ0KCk7XG4gICAgICAgIHJpbmcgPSBbXTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHJpbmdFbmQoKSB7XG4gICAgICAgIHBvaW50UmluZyhyaW5nWzBdWzBdLCByaW5nWzBdWzFdKTtcbiAgICAgICAgcmluZ0xpc3RlbmVyLmxpbmVFbmQoKTtcbiAgICAgICAgdmFyIGNsZWFuID0gcmluZ0xpc3RlbmVyLmNsZWFuKCksIHJpbmdTZWdtZW50cyA9IGJ1ZmZlci5idWZmZXIoKSwgc2VnbWVudCwgbiA9IHJpbmdTZWdtZW50cy5sZW5ndGg7XG4gICAgICAgIHJpbmcucG9wKCk7XG4gICAgICAgIHBvbHlnb24ucHVzaChyaW5nKTtcbiAgICAgICAgcmluZyA9IG51bGw7XG4gICAgICAgIGlmICghbikgcmV0dXJuO1xuICAgICAgICBpZiAoY2xlYW4gJiAxKSB7XG4gICAgICAgICAgc2VnbWVudCA9IHJpbmdTZWdtZW50c1swXTtcbiAgICAgICAgICB2YXIgbiA9IHNlZ21lbnQubGVuZ3RoIC0gMSwgaSA9IC0xLCBwb2ludDtcbiAgICAgICAgICBpZiAobiA+IDApIHtcbiAgICAgICAgICAgIGlmICghcG9seWdvblN0YXJ0ZWQpIGxpc3RlbmVyLnBvbHlnb25TdGFydCgpLCBwb2x5Z29uU3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTtcbiAgICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSBsaXN0ZW5lci5wb2ludCgocG9pbnQgPSBzZWdtZW50W2ldKVswXSwgcG9pbnRbMV0pO1xuICAgICAgICAgICAgbGlzdGVuZXIubGluZUVuZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG4gPiAxICYmIGNsZWFuICYgMikgcmluZ1NlZ21lbnRzLnB1c2gocmluZ1NlZ21lbnRzLnBvcCgpLmNvbmNhdChyaW5nU2VnbWVudHMuc2hpZnQoKSkpO1xuICAgICAgICBzZWdtZW50cy5wdXNoKHJpbmdTZWdtZW50cy5maWx0ZXIoZDNfZ2VvX2NsaXBTZWdtZW50TGVuZ3RoMSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNsaXA7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fY2xpcFNlZ21lbnRMZW5ndGgxKHNlZ21lbnQpIHtcbiAgICByZXR1cm4gc2VnbWVudC5sZW5ndGggPiAxO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19jbGlwQnVmZmVyTGlzdGVuZXIoKSB7XG4gICAgdmFyIGxpbmVzID0gW10sIGxpbmU7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGxpbmVzLnB1c2gobGluZSA9IFtdKTtcbiAgICAgIH0sXG4gICAgICBwb2ludDogZnVuY3Rpb24ozrssIM+GKSB7XG4gICAgICAgIGxpbmUucHVzaChbIM67LCDPhiBdKTtcbiAgICAgIH0sXG4gICAgICBsaW5lRW5kOiBkM19ub29wLFxuICAgICAgYnVmZmVyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGJ1ZmZlciA9IGxpbmVzO1xuICAgICAgICBsaW5lcyA9IFtdO1xuICAgICAgICBsaW5lID0gbnVsbDtcbiAgICAgICAgcmV0dXJuIGJ1ZmZlcjtcbiAgICAgIH0sXG4gICAgICByZWpvaW46IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAobGluZXMubGVuZ3RoID4gMSkgbGluZXMucHVzaChsaW5lcy5wb3AoKS5jb25jYXQobGluZXMuc2hpZnQoKSkpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBTb3J0KGEsIGIpIHtcbiAgICByZXR1cm4gKChhID0gYS54KVswXSA8IDAgPyBhWzFdIC0gaGFsZs+AIC0gzrUgOiBoYWxmz4AgLSBhWzFdKSAtICgoYiA9IGIueClbMF0gPCAwID8gYlsxXSAtIGhhbGbPgCAtIM61IDogaGFsZs+AIC0gYlsxXSk7XG4gIH1cbiAgdmFyIGQzX2dlb19jbGlwQW50aW1lcmlkaWFuID0gZDNfZ2VvX2NsaXAoZDNfdHJ1ZSwgZDNfZ2VvX2NsaXBBbnRpbWVyaWRpYW5MaW5lLCBkM19nZW9fY2xpcEFudGltZXJpZGlhbkludGVycG9sYXRlLCBbIC3PgCwgLc+AIC8gMiBdKTtcbiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBBbnRpbWVyaWRpYW5MaW5lKGxpc3RlbmVyKSB7XG4gICAgdmFyIM67MCA9IE5hTiwgz4YwID0gTmFOLCBzzrswID0gTmFOLCBjbGVhbjtcbiAgICByZXR1cm4ge1xuICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7XG4gICAgICAgIGNsZWFuID0gMTtcbiAgICAgIH0sXG4gICAgICBwb2ludDogZnVuY3Rpb24ozrsxLCDPhjEpIHtcbiAgICAgICAgdmFyIHPOuzEgPSDOuzEgPiAwID8gz4AgOiAtz4AsIGTOuyA9IGFicyjOuzEgLSDOuzApO1xuICAgICAgICBpZiAoYWJzKGTOuyAtIM+AKSA8IM61KSB7XG4gICAgICAgICAgbGlzdGVuZXIucG9pbnQozrswLCDPhjAgPSAoz4YwICsgz4YxKSAvIDIgPiAwID8gaGFsZs+AIDogLWhhbGbPgCk7XG4gICAgICAgICAgbGlzdGVuZXIucG9pbnQoc867MCwgz4YwKTtcbiAgICAgICAgICBsaXN0ZW5lci5saW5lRW5kKCk7XG4gICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7XG4gICAgICAgICAgbGlzdGVuZXIucG9pbnQoc867MSwgz4YwKTtcbiAgICAgICAgICBsaXN0ZW5lci5wb2ludCjOuzEsIM+GMCk7XG4gICAgICAgICAgY2xlYW4gPSAwO1xuICAgICAgICB9IGVsc2UgaWYgKHPOuzAgIT09IHPOuzEgJiYgZM67ID49IM+AKSB7XG4gICAgICAgICAgaWYgKGFicyjOuzAgLSBzzrswKSA8IM61KSDOuzAgLT0gc867MCAqIM61O1xuICAgICAgICAgIGlmIChhYnMozrsxIC0gc867MSkgPCDOtSkgzrsxIC09IHPOuzEgKiDOtTtcbiAgICAgICAgICDPhjAgPSBkM19nZW9fY2xpcEFudGltZXJpZGlhbkludGVyc2VjdCjOuzAsIM+GMCwgzrsxLCDPhjEpO1xuICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHPOuzAsIM+GMCk7XG4gICAgICAgICAgbGlzdGVuZXIubGluZUVuZCgpO1xuICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpO1xuICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHPOuzEsIM+GMCk7XG4gICAgICAgICAgY2xlYW4gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGxpc3RlbmVyLnBvaW50KM67MCA9IM67MSwgz4YwID0gz4YxKTtcbiAgICAgICAgc867MCA9IHPOuzE7XG4gICAgICB9LFxuICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTtcbiAgICAgICAgzrswID0gz4YwID0gTmFOO1xuICAgICAgfSxcbiAgICAgIGNsZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIDIgLSBjbGVhbjtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19jbGlwQW50aW1lcmlkaWFuSW50ZXJzZWN0KM67MCwgz4YwLCDOuzEsIM+GMSkge1xuICAgIHZhciBjb3PPhjAsIGNvc8+GMSwgc2luzrswX867MSA9IE1hdGguc2luKM67MCAtIM67MSk7XG4gICAgcmV0dXJuIGFicyhzaW7OuzBfzrsxKSA+IM61ID8gTWF0aC5hdGFuKChNYXRoLnNpbijPhjApICogKGNvc8+GMSA9IE1hdGguY29zKM+GMSkpICogTWF0aC5zaW4ozrsxKSAtIE1hdGguc2luKM+GMSkgKiAoY29zz4YwID0gTWF0aC5jb3Moz4YwKSkgKiBNYXRoLnNpbijOuzApKSAvIChjb3PPhjAgKiBjb3PPhjEgKiBzaW7OuzBfzrsxKSkgOiAoz4YwICsgz4YxKSAvIDI7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBBbnRpbWVyaWRpYW5JbnRlcnBvbGF0ZShmcm9tLCB0bywgZGlyZWN0aW9uLCBsaXN0ZW5lcikge1xuICAgIHZhciDPhjtcbiAgICBpZiAoZnJvbSA9PSBudWxsKSB7XG4gICAgICDPhiA9IGRpcmVjdGlvbiAqIGhhbGbPgDtcbiAgICAgIGxpc3RlbmVyLnBvaW50KC3PgCwgz4YpO1xuICAgICAgbGlzdGVuZXIucG9pbnQoMCwgz4YpO1xuICAgICAgbGlzdGVuZXIucG9pbnQoz4AsIM+GKTtcbiAgICAgIGxpc3RlbmVyLnBvaW50KM+ALCAwKTtcbiAgICAgIGxpc3RlbmVyLnBvaW50KM+ALCAtz4YpO1xuICAgICAgbGlzdGVuZXIucG9pbnQoMCwgLc+GKTtcbiAgICAgIGxpc3RlbmVyLnBvaW50KC3PgCwgLc+GKTtcbiAgICAgIGxpc3RlbmVyLnBvaW50KC3PgCwgMCk7XG4gICAgICBsaXN0ZW5lci5wb2ludCgtz4AsIM+GKTtcbiAgICB9IGVsc2UgaWYgKGFicyhmcm9tWzBdIC0gdG9bMF0pID4gzrUpIHtcbiAgICAgIHZhciBzID0gZnJvbVswXSA8IHRvWzBdID8gz4AgOiAtz4A7XG4gICAgICDPhiA9IGRpcmVjdGlvbiAqIHMgLyAyO1xuICAgICAgbGlzdGVuZXIucG9pbnQoLXMsIM+GKTtcbiAgICAgIGxpc3RlbmVyLnBvaW50KDAsIM+GKTtcbiAgICAgIGxpc3RlbmVyLnBvaW50KHMsIM+GKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdGVuZXIucG9pbnQodG9bMF0sIHRvWzFdKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX3BvaW50SW5Qb2x5Z29uKHBvaW50LCBwb2x5Z29uKSB7XG4gICAgdmFyIG1lcmlkaWFuID0gcG9pbnRbMF0sIHBhcmFsbGVsID0gcG9pbnRbMV0sIG1lcmlkaWFuTm9ybWFsID0gWyBNYXRoLnNpbihtZXJpZGlhbiksIC1NYXRoLmNvcyhtZXJpZGlhbiksIDAgXSwgcG9sYXJBbmdsZSA9IDAsIHdpbmRpbmcgPSAwO1xuICAgIGQzX2dlb19hcmVhUmluZ1N1bS5yZXNldCgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gcG9seWdvbi5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgIHZhciByaW5nID0gcG9seWdvbltpXSwgbSA9IHJpbmcubGVuZ3RoO1xuICAgICAgaWYgKCFtKSBjb250aW51ZTtcbiAgICAgIHZhciBwb2ludDAgPSByaW5nWzBdLCDOuzAgPSBwb2ludDBbMF0sIM+GMCA9IHBvaW50MFsxXSAvIDIgKyDPgCAvIDQsIHNpbs+GMCA9IE1hdGguc2luKM+GMCksIGNvc8+GMCA9IE1hdGguY29zKM+GMCksIGogPSAxO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgaWYgKGogPT09IG0pIGogPSAwO1xuICAgICAgICBwb2ludCA9IHJpbmdbal07XG4gICAgICAgIHZhciDOuyA9IHBvaW50WzBdLCDPhiA9IHBvaW50WzFdIC8gMiArIM+AIC8gNCwgc2luz4YgPSBNYXRoLnNpbijPhiksIGNvc8+GID0gTWF0aC5jb3Moz4YpLCBkzrsgPSDOuyAtIM67MCwgc2TOuyA9IGTOuyA+PSAwID8gMSA6IC0xLCBhZM67ID0gc2TOuyAqIGTOuywgYW50aW1lcmlkaWFuID0gYWTOuyA+IM+ALCBrID0gc2luz4YwICogc2luz4Y7XG4gICAgICAgIGQzX2dlb19hcmVhUmluZ1N1bS5hZGQoTWF0aC5hdGFuMihrICogc2TOuyAqIE1hdGguc2luKGFkzrspLCBjb3PPhjAgKiBjb3PPhiArIGsgKiBNYXRoLmNvcyhhZM67KSkpO1xuICAgICAgICBwb2xhckFuZ2xlICs9IGFudGltZXJpZGlhbiA/IGTOuyArIHNkzrsgKiDPhCA6IGTOuztcbiAgICAgICAgaWYgKGFudGltZXJpZGlhbiBeIM67MCA+PSBtZXJpZGlhbiBeIM67ID49IG1lcmlkaWFuKSB7XG4gICAgICAgICAgdmFyIGFyYyA9IGQzX2dlb19jYXJ0ZXNpYW5Dcm9zcyhkM19nZW9fY2FydGVzaWFuKHBvaW50MCksIGQzX2dlb19jYXJ0ZXNpYW4ocG9pbnQpKTtcbiAgICAgICAgICBkM19nZW9fY2FydGVzaWFuTm9ybWFsaXplKGFyYyk7XG4gICAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IGQzX2dlb19jYXJ0ZXNpYW5Dcm9zcyhtZXJpZGlhbk5vcm1hbCwgYXJjKTtcbiAgICAgICAgICBkM19nZW9fY2FydGVzaWFuTm9ybWFsaXplKGludGVyc2VjdGlvbik7XG4gICAgICAgICAgdmFyIM+GYXJjID0gKGFudGltZXJpZGlhbiBeIGTOuyA+PSAwID8gLTEgOiAxKSAqIGQzX2FzaW4oaW50ZXJzZWN0aW9uWzJdKTtcbiAgICAgICAgICBpZiAocGFyYWxsZWwgPiDPhmFyYyB8fCBwYXJhbGxlbCA9PT0gz4ZhcmMgJiYgKGFyY1swXSB8fCBhcmNbMV0pKSB7XG4gICAgICAgICAgICB3aW5kaW5nICs9IGFudGltZXJpZGlhbiBeIGTOuyA+PSAwID8gMSA6IC0xO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWorKykgYnJlYWs7XG4gICAgICAgIM67MCA9IM67LCBzaW7PhjAgPSBzaW7PhiwgY29zz4YwID0gY29zz4YsIHBvaW50MCA9IHBvaW50O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKHBvbGFyQW5nbGUgPCAtzrUgfHwgcG9sYXJBbmdsZSA8IM61ICYmIGQzX2dlb19hcmVhUmluZ1N1bSA8IC3OtSkgXiB3aW5kaW5nICYgMTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fY2xpcENpcmNsZShyYWRpdXMpIHtcbiAgICB2YXIgY3IgPSBNYXRoLmNvcyhyYWRpdXMpLCBzbWFsbFJhZGl1cyA9IGNyID4gMCwgbm90SGVtaXNwaGVyZSA9IGFicyhjcikgPiDOtSwgaW50ZXJwb2xhdGUgPSBkM19nZW9fY2lyY2xlSW50ZXJwb2xhdGUocmFkaXVzLCA2ICogZDNfcmFkaWFucyk7XG4gICAgcmV0dXJuIGQzX2dlb19jbGlwKHZpc2libGUsIGNsaXBMaW5lLCBpbnRlcnBvbGF0ZSwgc21hbGxSYWRpdXMgPyBbIDAsIC1yYWRpdXMgXSA6IFsgLc+ALCByYWRpdXMgLSDPgCBdKTtcbiAgICBmdW5jdGlvbiB2aXNpYmxlKM67LCDPhikge1xuICAgICAgcmV0dXJuIE1hdGguY29zKM67KSAqIE1hdGguY29zKM+GKSA+IGNyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjbGlwTGluZShsaXN0ZW5lcikge1xuICAgICAgdmFyIHBvaW50MCwgYzAsIHYwLCB2MDAsIGNsZWFuO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICB2MDAgPSB2MCA9IGZhbHNlO1xuICAgICAgICAgIGNsZWFuID0gMTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9pbnQ6IGZ1bmN0aW9uKM67LCDPhikge1xuICAgICAgICAgIHZhciBwb2ludDEgPSBbIM67LCDPhiBdLCBwb2ludDIsIHYgPSB2aXNpYmxlKM67LCDPhiksIGMgPSBzbWFsbFJhZGl1cyA/IHYgPyAwIDogY29kZSjOuywgz4YpIDogdiA/IGNvZGUozrsgKyAozrsgPCAwID8gz4AgOiAtz4ApLCDPhikgOiAwO1xuICAgICAgICAgIGlmICghcG9pbnQwICYmICh2MDAgPSB2MCA9IHYpKSBsaXN0ZW5lci5saW5lU3RhcnQoKTtcbiAgICAgICAgICBpZiAodiAhPT0gdjApIHtcbiAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDAsIHBvaW50MSk7XG4gICAgICAgICAgICBpZiAoZDNfZ2VvX3NwaGVyaWNhbEVxdWFsKHBvaW50MCwgcG9pbnQyKSB8fCBkM19nZW9fc3BoZXJpY2FsRXF1YWwocG9pbnQxLCBwb2ludDIpKSB7XG4gICAgICAgICAgICAgIHBvaW50MVswXSArPSDOtTtcbiAgICAgICAgICAgICAgcG9pbnQxWzFdICs9IM61O1xuICAgICAgICAgICAgICB2ID0gdmlzaWJsZShwb2ludDFbMF0sIHBvaW50MVsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2ICE9PSB2MCkge1xuICAgICAgICAgICAgY2xlYW4gPSAwO1xuICAgICAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7XG4gICAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDEsIHBvaW50MCk7XG4gICAgICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHBvaW50MlswXSwgcG9pbnQyWzFdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDAsIHBvaW50MSk7XG4gICAgICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHBvaW50MlswXSwgcG9pbnQyWzFdKTtcbiAgICAgICAgICAgICAgbGlzdGVuZXIubGluZUVuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG9pbnQwID0gcG9pbnQyO1xuICAgICAgICAgIH0gZWxzZSBpZiAobm90SGVtaXNwaGVyZSAmJiBwb2ludDAgJiYgc21hbGxSYWRpdXMgXiB2KSB7XG4gICAgICAgICAgICB2YXIgdDtcbiAgICAgICAgICAgIGlmICghKGMgJiBjMCkgJiYgKHQgPSBpbnRlcnNlY3QocG9pbnQxLCBwb2ludDAsIHRydWUpKSkge1xuICAgICAgICAgICAgICBjbGVhbiA9IDA7XG4gICAgICAgICAgICAgIGlmIChzbWFsbFJhZGl1cykge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpO1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHRbMF1bMF0sIHRbMF1bMV0pO1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHRbMV1bMF0sIHRbMV1bMV0pO1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5wb2ludCh0WzFdWzBdLCB0WzFdWzFdKTtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5saW5lRW5kKCk7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQodFswXVswXSwgdFswXVsxXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHYgJiYgKCFwb2ludDAgfHwgIWQzX2dlb19zcGhlcmljYWxFcXVhbChwb2ludDAsIHBvaW50MSkpKSB7XG4gICAgICAgICAgICBsaXN0ZW5lci5wb2ludChwb2ludDFbMF0sIHBvaW50MVsxXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBvaW50MCA9IHBvaW50MSwgdjAgPSB2LCBjMCA9IGM7XG4gICAgICAgIH0sXG4gICAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGlmICh2MCkgbGlzdGVuZXIubGluZUVuZCgpO1xuICAgICAgICAgIHBvaW50MCA9IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIGNsZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gY2xlYW4gfCAodjAwICYmIHYwKSA8PCAxO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbnRlcnNlY3QoYSwgYiwgdHdvKSB7XG4gICAgICB2YXIgcGEgPSBkM19nZW9fY2FydGVzaWFuKGEpLCBwYiA9IGQzX2dlb19jYXJ0ZXNpYW4oYik7XG4gICAgICB2YXIgbjEgPSBbIDEsIDAsIDAgXSwgbjIgPSBkM19nZW9fY2FydGVzaWFuQ3Jvc3MocGEsIHBiKSwgbjJuMiA9IGQzX2dlb19jYXJ0ZXNpYW5Eb3QobjIsIG4yKSwgbjFuMiA9IG4yWzBdLCBkZXRlcm1pbmFudCA9IG4ybjIgLSBuMW4yICogbjFuMjtcbiAgICAgIGlmICghZGV0ZXJtaW5hbnQpIHJldHVybiAhdHdvICYmIGE7XG4gICAgICB2YXIgYzEgPSBjciAqIG4ybjIgLyBkZXRlcm1pbmFudCwgYzIgPSAtY3IgKiBuMW4yIC8gZGV0ZXJtaW5hbnQsIG4xeG4yID0gZDNfZ2VvX2NhcnRlc2lhbkNyb3NzKG4xLCBuMiksIEEgPSBkM19nZW9fY2FydGVzaWFuU2NhbGUobjEsIGMxKSwgQiA9IGQzX2dlb19jYXJ0ZXNpYW5TY2FsZShuMiwgYzIpO1xuICAgICAgZDNfZ2VvX2NhcnRlc2lhbkFkZChBLCBCKTtcbiAgICAgIHZhciB1ID0gbjF4bjIsIHcgPSBkM19nZW9fY2FydGVzaWFuRG90KEEsIHUpLCB1dSA9IGQzX2dlb19jYXJ0ZXNpYW5Eb3QodSwgdSksIHQyID0gdyAqIHcgLSB1dSAqIChkM19nZW9fY2FydGVzaWFuRG90KEEsIEEpIC0gMSk7XG4gICAgICBpZiAodDIgPCAwKSByZXR1cm47XG4gICAgICB2YXIgdCA9IE1hdGguc3FydCh0MiksIHEgPSBkM19nZW9fY2FydGVzaWFuU2NhbGUodSwgKC13IC0gdCkgLyB1dSk7XG4gICAgICBkM19nZW9fY2FydGVzaWFuQWRkKHEsIEEpO1xuICAgICAgcSA9IGQzX2dlb19zcGhlcmljYWwocSk7XG4gICAgICBpZiAoIXR3bykgcmV0dXJuIHE7XG4gICAgICB2YXIgzrswID0gYVswXSwgzrsxID0gYlswXSwgz4YwID0gYVsxXSwgz4YxID0gYlsxXSwgejtcbiAgICAgIGlmICjOuzEgPCDOuzApIHogPSDOuzAsIM67MCA9IM67MSwgzrsxID0gejtcbiAgICAgIHZhciDOtM67ID0gzrsxIC0gzrswLCBwb2xhciA9IGFicyjOtM67IC0gz4ApIDwgzrUsIG1lcmlkaWFuID0gcG9sYXIgfHwgzrTOuyA8IM61O1xuICAgICAgaWYgKCFwb2xhciAmJiDPhjEgPCDPhjApIHogPSDPhjAsIM+GMCA9IM+GMSwgz4YxID0gejtcbiAgICAgIGlmIChtZXJpZGlhbiA/IHBvbGFyID8gz4YwICsgz4YxID4gMCBeIHFbMV0gPCAoYWJzKHFbMF0gLSDOuzApIDwgzrUgPyDPhjAgOiDPhjEpIDogz4YwIDw9IHFbMV0gJiYgcVsxXSA8PSDPhjEgOiDOtM67ID4gz4AgXiAozrswIDw9IHFbMF0gJiYgcVswXSA8PSDOuzEpKSB7XG4gICAgICAgIHZhciBxMSA9IGQzX2dlb19jYXJ0ZXNpYW5TY2FsZSh1LCAoLXcgKyB0KSAvIHV1KTtcbiAgICAgICAgZDNfZ2VvX2NhcnRlc2lhbkFkZChxMSwgQSk7XG4gICAgICAgIHJldHVybiBbIHEsIGQzX2dlb19zcGhlcmljYWwocTEpIF07XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvZGUozrssIM+GKSB7XG4gICAgICB2YXIgciA9IHNtYWxsUmFkaXVzID8gcmFkaXVzIDogz4AgLSByYWRpdXMsIGNvZGUgPSAwO1xuICAgICAgaWYgKM67IDwgLXIpIGNvZGUgfD0gMTsgZWxzZSBpZiAozrsgPiByKSBjb2RlIHw9IDI7XG4gICAgICBpZiAoz4YgPCAtcikgY29kZSB8PSA0OyBlbHNlIGlmICjPhiA+IHIpIGNvZGUgfD0gODtcbiAgICAgIHJldHVybiBjb2RlO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX2NsaXBMaW5lKHgwLCB5MCwgeDEsIHkxKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgIHZhciBhID0gbGluZS5hLCBiID0gbGluZS5iLCBheCA9IGEueCwgYXkgPSBhLnksIGJ4ID0gYi54LCBieSA9IGIueSwgdDAgPSAwLCB0MSA9IDEsIGR4ID0gYnggLSBheCwgZHkgPSBieSAtIGF5LCByO1xuICAgICAgciA9IHgwIC0gYXg7XG4gICAgICBpZiAoIWR4ICYmIHIgPiAwKSByZXR1cm47XG4gICAgICByIC89IGR4O1xuICAgICAgaWYgKGR4IDwgMCkge1xuICAgICAgICBpZiAociA8IHQwKSByZXR1cm47XG4gICAgICAgIGlmIChyIDwgdDEpIHQxID0gcjtcbiAgICAgIH0gZWxzZSBpZiAoZHggPiAwKSB7XG4gICAgICAgIGlmIChyID4gdDEpIHJldHVybjtcbiAgICAgICAgaWYgKHIgPiB0MCkgdDAgPSByO1xuICAgICAgfVxuICAgICAgciA9IHgxIC0gYXg7XG4gICAgICBpZiAoIWR4ICYmIHIgPCAwKSByZXR1cm47XG4gICAgICByIC89IGR4O1xuICAgICAgaWYgKGR4IDwgMCkge1xuICAgICAgICBpZiAociA+IHQxKSByZXR1cm47XG4gICAgICAgIGlmIChyID4gdDApIHQwID0gcjtcbiAgICAgIH0gZWxzZSBpZiAoZHggPiAwKSB7XG4gICAgICAgIGlmIChyIDwgdDApIHJldHVybjtcbiAgICAgICAgaWYgKHIgPCB0MSkgdDEgPSByO1xuICAgICAgfVxuICAgICAgciA9IHkwIC0gYXk7XG4gICAgICBpZiAoIWR5ICYmIHIgPiAwKSByZXR1cm47XG4gICAgICByIC89IGR5O1xuICAgICAgaWYgKGR5IDwgMCkge1xuICAgICAgICBpZiAociA8IHQwKSByZXR1cm47XG4gICAgICAgIGlmIChyIDwgdDEpIHQxID0gcjtcbiAgICAgIH0gZWxzZSBpZiAoZHkgPiAwKSB7XG4gICAgICAgIGlmIChyID4gdDEpIHJldHVybjtcbiAgICAgICAgaWYgKHIgPiB0MCkgdDAgPSByO1xuICAgICAgfVxuICAgICAgciA9IHkxIC0gYXk7XG4gICAgICBpZiAoIWR5ICYmIHIgPCAwKSByZXR1cm47XG4gICAgICByIC89IGR5O1xuICAgICAgaWYgKGR5IDwgMCkge1xuICAgICAgICBpZiAociA+IHQxKSByZXR1cm47XG4gICAgICAgIGlmIChyID4gdDApIHQwID0gcjtcbiAgICAgIH0gZWxzZSBpZiAoZHkgPiAwKSB7XG4gICAgICAgIGlmIChyIDwgdDApIHJldHVybjtcbiAgICAgICAgaWYgKHIgPCB0MSkgdDEgPSByO1xuICAgICAgfVxuICAgICAgaWYgKHQwID4gMCkgbGluZS5hID0ge1xuICAgICAgICB4OiBheCArIHQwICogZHgsXG4gICAgICAgIHk6IGF5ICsgdDAgKiBkeVxuICAgICAgfTtcbiAgICAgIGlmICh0MSA8IDEpIGxpbmUuYiA9IHtcbiAgICAgICAgeDogYXggKyB0MSAqIGR4LFxuICAgICAgICB5OiBheSArIHQxICogZHlcbiAgICAgIH07XG4gICAgICByZXR1cm4gbGluZTtcbiAgICB9O1xuICB9XG4gIHZhciBkM19nZW9fY2xpcEV4dGVudE1BWCA9IDFlOTtcbiAgZDMuZ2VvLmNsaXBFeHRlbnQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgeDAsIHkwLCB4MSwgeTEsIHN0cmVhbSwgY2xpcCwgY2xpcEV4dGVudCA9IHtcbiAgICAgIHN0cmVhbTogZnVuY3Rpb24ob3V0cHV0KSB7XG4gICAgICAgIGlmIChzdHJlYW0pIHN0cmVhbS52YWxpZCA9IGZhbHNlO1xuICAgICAgICBzdHJlYW0gPSBjbGlwKG91dHB1dCk7XG4gICAgICAgIHN0cmVhbS52YWxpZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBzdHJlYW07XG4gICAgICB9LFxuICAgICAgZXh0ZW50OiBmdW5jdGlvbihfKSB7XG4gICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgWyB4MCwgeTAgXSwgWyB4MSwgeTEgXSBdO1xuICAgICAgICBjbGlwID0gZDNfZ2VvX2NsaXBFeHRlbnQoeDAgPSArX1swXVswXSwgeTAgPSArX1swXVsxXSwgeDEgPSArX1sxXVswXSwgeTEgPSArX1sxXVsxXSk7XG4gICAgICAgIGlmIChzdHJlYW0pIHN0cmVhbS52YWxpZCA9IGZhbHNlLCBzdHJlYW0gPSBudWxsO1xuICAgICAgICByZXR1cm4gY2xpcEV4dGVudDtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBjbGlwRXh0ZW50LmV4dGVudChbIFsgMCwgMCBdLCBbIDk2MCwgNTAwIF0gXSk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2dlb19jbGlwRXh0ZW50KHgwLCB5MCwgeDEsIHkxKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGxpc3RlbmVyKSB7XG4gICAgICB2YXIgbGlzdGVuZXJfID0gbGlzdGVuZXIsIGJ1ZmZlckxpc3RlbmVyID0gZDNfZ2VvX2NsaXBCdWZmZXJMaXN0ZW5lcigpLCBjbGlwTGluZSA9IGQzX2dlb21fY2xpcExpbmUoeDAsIHkwLCB4MSwgeTEpLCBzZWdtZW50cywgcG9seWdvbiwgcmluZztcbiAgICAgIHZhciBjbGlwID0ge1xuICAgICAgICBwb2ludDogcG9pbnQsXG4gICAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LFxuICAgICAgICBsaW5lRW5kOiBsaW5lRW5kLFxuICAgICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGxpc3RlbmVyID0gYnVmZmVyTGlzdGVuZXI7XG4gICAgICAgICAgc2VnbWVudHMgPSBbXTtcbiAgICAgICAgICBwb2x5Z29uID0gW107XG4gICAgICAgICAgY2xlYW4gPSB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBsaXN0ZW5lciA9IGxpc3RlbmVyXztcbiAgICAgICAgICBzZWdtZW50cyA9IGQzLm1lcmdlKHNlZ21lbnRzKTtcbiAgICAgICAgICB2YXIgY2xpcFN0YXJ0SW5zaWRlID0gaW5zaWRlUG9seWdvbihbIHgwLCB5MSBdKSwgaW5zaWRlID0gY2xlYW4gJiYgY2xpcFN0YXJ0SW5zaWRlLCB2aXNpYmxlID0gc2VnbWVudHMubGVuZ3RoO1xuICAgICAgICAgIGlmIChpbnNpZGUgfHwgdmlzaWJsZSkge1xuICAgICAgICAgICAgbGlzdGVuZXIucG9seWdvblN0YXJ0KCk7XG4gICAgICAgICAgICBpZiAoaW5zaWRlKSB7XG4gICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpO1xuICAgICAgICAgICAgICBpbnRlcnBvbGF0ZShudWxsLCBudWxsLCAxLCBsaXN0ZW5lcik7XG4gICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICAgICAgICAgIGQzX2dlb19jbGlwUG9seWdvbihzZWdtZW50cywgY29tcGFyZSwgY2xpcFN0YXJ0SW5zaWRlLCBpbnRlcnBvbGF0ZSwgbGlzdGVuZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGlzdGVuZXIucG9seWdvbkVuZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZWdtZW50cyA9IHBvbHlnb24gPSByaW5nID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGZ1bmN0aW9uIGluc2lkZVBvbHlnb24ocCkge1xuICAgICAgICB2YXIgd24gPSAwLCBuID0gcG9seWdvbi5sZW5ndGgsIHkgPSBwWzFdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICAgIGZvciAodmFyIGogPSAxLCB2ID0gcG9seWdvbltpXSwgbSA9IHYubGVuZ3RoLCBhID0gdlswXSwgYjsgaiA8IG07ICsraikge1xuICAgICAgICAgICAgYiA9IHZbal07XG4gICAgICAgICAgICBpZiAoYVsxXSA8PSB5KSB7XG4gICAgICAgICAgICAgIGlmIChiWzFdID4geSAmJiBkM19jcm9zczJkKGEsIGIsIHApID4gMCkgKyt3bjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChiWzFdIDw9IHkgJiYgZDNfY3Jvc3MyZChhLCBiLCBwKSA8IDApIC0td247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhID0gYjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHduICE9PSAwO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gaW50ZXJwb2xhdGUoZnJvbSwgdG8sIGRpcmVjdGlvbiwgbGlzdGVuZXIpIHtcbiAgICAgICAgdmFyIGEgPSAwLCBhMSA9IDA7XG4gICAgICAgIGlmIChmcm9tID09IG51bGwgfHwgKGEgPSBjb3JuZXIoZnJvbSwgZGlyZWN0aW9uKSkgIT09IChhMSA9IGNvcm5lcih0bywgZGlyZWN0aW9uKSkgfHwgY29tcGFyZVBvaW50cyhmcm9tLCB0bykgPCAwIF4gZGlyZWN0aW9uID4gMCkge1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGxpc3RlbmVyLnBvaW50KGEgPT09IDAgfHwgYSA9PT0gMyA/IHgwIDogeDEsIGEgPiAxID8geTEgOiB5MCk7XG4gICAgICAgICAgfSB3aGlsZSAoKGEgPSAoYSArIGRpcmVjdGlvbiArIDQpICUgNCkgIT09IGExKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsaXN0ZW5lci5wb2ludCh0b1swXSwgdG9bMV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBwb2ludFZpc2libGUoeCwgeSkge1xuICAgICAgICByZXR1cm4geDAgPD0geCAmJiB4IDw9IHgxICYmIHkwIDw9IHkgJiYgeSA8PSB5MTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHBvaW50KHgsIHkpIHtcbiAgICAgICAgaWYgKHBvaW50VmlzaWJsZSh4LCB5KSkgbGlzdGVuZXIucG9pbnQoeCwgeSk7XG4gICAgICB9XG4gICAgICB2YXIgeF9fLCB5X18sIHZfXywgeF8sIHlfLCB2XywgZmlyc3QsIGNsZWFuO1xuICAgICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkge1xuICAgICAgICBjbGlwLnBvaW50ID0gbGluZVBvaW50O1xuICAgICAgICBpZiAocG9seWdvbikgcG9seWdvbi5wdXNoKHJpbmcgPSBbXSk7XG4gICAgICAgIGZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgdl8gPSBmYWxzZTtcbiAgICAgICAgeF8gPSB5XyA9IE5hTjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGxpbmVFbmQoKSB7XG4gICAgICAgIGlmIChzZWdtZW50cykge1xuICAgICAgICAgIGxpbmVQb2ludCh4X18sIHlfXyk7XG4gICAgICAgICAgaWYgKHZfXyAmJiB2XykgYnVmZmVyTGlzdGVuZXIucmVqb2luKCk7XG4gICAgICAgICAgc2VnbWVudHMucHVzaChidWZmZXJMaXN0ZW5lci5idWZmZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2xpcC5wb2ludCA9IHBvaW50O1xuICAgICAgICBpZiAodl8pIGxpc3RlbmVyLmxpbmVFbmQoKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGxpbmVQb2ludCh4LCB5KSB7XG4gICAgICAgIHggPSBNYXRoLm1heCgtZDNfZ2VvX2NsaXBFeHRlbnRNQVgsIE1hdGgubWluKGQzX2dlb19jbGlwRXh0ZW50TUFYLCB4KSk7XG4gICAgICAgIHkgPSBNYXRoLm1heCgtZDNfZ2VvX2NsaXBFeHRlbnRNQVgsIE1hdGgubWluKGQzX2dlb19jbGlwRXh0ZW50TUFYLCB5KSk7XG4gICAgICAgIHZhciB2ID0gcG9pbnRWaXNpYmxlKHgsIHkpO1xuICAgICAgICBpZiAocG9seWdvbikgcmluZy5wdXNoKFsgeCwgeSBdKTtcbiAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgeF9fID0geCwgeV9fID0geSwgdl9fID0gdjtcbiAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgIGlmICh2KSB7XG4gICAgICAgICAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTtcbiAgICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHgsIHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodiAmJiB2XykgbGlzdGVuZXIucG9pbnQoeCwgeSk7IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGwgPSB7XG4gICAgICAgICAgICAgIGE6IHtcbiAgICAgICAgICAgICAgICB4OiB4XyxcbiAgICAgICAgICAgICAgICB5OiB5X1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBiOiB7XG4gICAgICAgICAgICAgICAgeDogeCxcbiAgICAgICAgICAgICAgICB5OiB5XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoY2xpcExpbmUobCkpIHtcbiAgICAgICAgICAgICAgaWYgKCF2Xykge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpO1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLnBvaW50KGwuYS54LCBsLmEueSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQobC5iLngsIGwuYi55KTtcbiAgICAgICAgICAgICAgaWYgKCF2KSBsaXN0ZW5lci5saW5lRW5kKCk7XG4gICAgICAgICAgICAgIGNsZWFuID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHYpIHtcbiAgICAgICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7XG4gICAgICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHgsIHkpO1xuICAgICAgICAgICAgICBjbGVhbiA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB4XyA9IHgsIHlfID0geSwgdl8gPSB2O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNsaXA7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBjb3JuZXIocCwgZGlyZWN0aW9uKSB7XG4gICAgICByZXR1cm4gYWJzKHBbMF0gLSB4MCkgPCDOtSA/IGRpcmVjdGlvbiA+IDAgPyAwIDogMyA6IGFicyhwWzBdIC0geDEpIDwgzrUgPyBkaXJlY3Rpb24gPiAwID8gMiA6IDEgOiBhYnMocFsxXSAtIHkwKSA8IM61ID8gZGlyZWN0aW9uID4gMCA/IDEgOiAwIDogZGlyZWN0aW9uID4gMCA/IDMgOiAyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgICAgIHJldHVybiBjb21wYXJlUG9pbnRzKGEueCwgYi54KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY29tcGFyZVBvaW50cyhhLCBiKSB7XG4gICAgICB2YXIgY2EgPSBjb3JuZXIoYSwgMSksIGNiID0gY29ybmVyKGIsIDEpO1xuICAgICAgcmV0dXJuIGNhICE9PSBjYiA/IGNhIC0gY2IgOiBjYSA9PT0gMCA/IGJbMV0gLSBhWzFdIDogY2EgPT09IDEgPyBhWzBdIC0gYlswXSA6IGNhID09PSAyID8gYVsxXSAtIGJbMV0gOiBiWzBdIC0gYVswXTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2NvbmljKHByb2plY3RBdCkge1xuICAgIHZhciDPhjAgPSAwLCDPhjEgPSDPgCAvIDMsIG0gPSBkM19nZW9fcHJvamVjdGlvbk11dGF0b3IocHJvamVjdEF0KSwgcCA9IG0oz4YwLCDPhjEpO1xuICAgIHAucGFyYWxsZWxzID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gWyDPhjAgLyDPgCAqIDE4MCwgz4YxIC8gz4AgKiAxODAgXTtcbiAgICAgIHJldHVybiBtKM+GMCA9IF9bMF0gKiDPgCAvIDE4MCwgz4YxID0gX1sxXSAqIM+AIC8gMTgwKTtcbiAgICB9O1xuICAgIHJldHVybiBwO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19jb25pY0VxdWFsQXJlYSjPhjAsIM+GMSkge1xuICAgIHZhciBzaW7PhjAgPSBNYXRoLnNpbijPhjApLCBuID0gKHNpbs+GMCArIE1hdGguc2luKM+GMSkpIC8gMiwgQyA9IDEgKyBzaW7PhjAgKiAoMiAqIG4gLSBzaW7PhjApLCDPgTAgPSBNYXRoLnNxcnQoQykgLyBuO1xuICAgIGZ1bmN0aW9uIGZvcndhcmQozrssIM+GKSB7XG4gICAgICB2YXIgz4EgPSBNYXRoLnNxcnQoQyAtIDIgKiBuICogTWF0aC5zaW4oz4YpKSAvIG47XG4gICAgICByZXR1cm4gWyDPgSAqIE1hdGguc2luKM67ICo9IG4pLCDPgTAgLSDPgSAqIE1hdGguY29zKM67KSBdO1xuICAgIH1cbiAgICBmb3J3YXJkLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgIHZhciDPgTBfeSA9IM+BMCAtIHk7XG4gICAgICByZXR1cm4gWyBNYXRoLmF0YW4yKHgsIM+BMF95KSAvIG4sIGQzX2FzaW4oKEMgLSAoeCAqIHggKyDPgTBfeSAqIM+BMF95KSAqIG4gKiBuKSAvICgyICogbikpIF07XG4gICAgfTtcbiAgICByZXR1cm4gZm9yd2FyZDtcbiAgfVxuICAoZDMuZ2VvLmNvbmljRXF1YWxBcmVhID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzX2dlb19jb25pYyhkM19nZW9fY29uaWNFcXVhbEFyZWEpO1xuICB9KS5yYXcgPSBkM19nZW9fY29uaWNFcXVhbEFyZWE7XG4gIGQzLmdlby5hbGJlcnMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDMuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsgOTYsIDAgXSkuY2VudGVyKFsgLS42LCAzOC43IF0pLnBhcmFsbGVscyhbIDI5LjUsIDQ1LjUgXSkuc2NhbGUoMTA3MCk7XG4gIH07XG4gIGQzLmdlby5hbGJlcnNVc2EgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgbG93ZXI0OCA9IGQzLmdlby5hbGJlcnMoKTtcbiAgICB2YXIgYWxhc2thID0gZDMuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsgMTU0LCAwIF0pLmNlbnRlcihbIC0yLCA1OC41IF0pLnBhcmFsbGVscyhbIDU1LCA2NSBdKTtcbiAgICB2YXIgaGF3YWlpID0gZDMuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsgMTU3LCAwIF0pLmNlbnRlcihbIC0zLCAxOS45IF0pLnBhcmFsbGVscyhbIDgsIDE4IF0pO1xuICAgIHZhciBwb2ludCwgcG9pbnRTdHJlYW0gPSB7XG4gICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgICAgICBwb2ludCA9IFsgeCwgeSBdO1xuICAgICAgfVxuICAgIH0sIGxvd2VyNDhQb2ludCwgYWxhc2thUG9pbnQsIGhhd2FpaVBvaW50O1xuICAgIGZ1bmN0aW9uIGFsYmVyc1VzYShjb29yZGluYXRlcykge1xuICAgICAgdmFyIHggPSBjb29yZGluYXRlc1swXSwgeSA9IGNvb3JkaW5hdGVzWzFdO1xuICAgICAgcG9pbnQgPSBudWxsO1xuICAgICAgKGxvd2VyNDhQb2ludCh4LCB5KSwgcG9pbnQpIHx8IChhbGFza2FQb2ludCh4LCB5KSwgcG9pbnQpIHx8IGhhd2FpaVBvaW50KHgsIHkpO1xuICAgICAgcmV0dXJuIHBvaW50O1xuICAgIH1cbiAgICBhbGJlcnNVc2EuaW52ZXJ0ID0gZnVuY3Rpb24oY29vcmRpbmF0ZXMpIHtcbiAgICAgIHZhciBrID0gbG93ZXI0OC5zY2FsZSgpLCB0ID0gbG93ZXI0OC50cmFuc2xhdGUoKSwgeCA9IChjb29yZGluYXRlc1swXSAtIHRbMF0pIC8gaywgeSA9IChjb29yZGluYXRlc1sxXSAtIHRbMV0pIC8gaztcbiAgICAgIHJldHVybiAoeSA+PSAuMTIgJiYgeSA8IC4yMzQgJiYgeCA+PSAtLjQyNSAmJiB4IDwgLS4yMTQgPyBhbGFza2EgOiB5ID49IC4xNjYgJiYgeSA8IC4yMzQgJiYgeCA+PSAtLjIxNCAmJiB4IDwgLS4xMTUgPyBoYXdhaWkgOiBsb3dlcjQ4KS5pbnZlcnQoY29vcmRpbmF0ZXMpO1xuICAgIH07XG4gICAgYWxiZXJzVXNhLnN0cmVhbSA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgICAgdmFyIGxvd2VyNDhTdHJlYW0gPSBsb3dlcjQ4LnN0cmVhbShzdHJlYW0pLCBhbGFza2FTdHJlYW0gPSBhbGFza2Euc3RyZWFtKHN0cmVhbSksIGhhd2FpaVN0cmVhbSA9IGhhd2FpaS5zdHJlYW0oc3RyZWFtKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgICAgICAgbG93ZXI0OFN0cmVhbS5wb2ludCh4LCB5KTtcbiAgICAgICAgICBhbGFza2FTdHJlYW0ucG9pbnQoeCwgeSk7XG4gICAgICAgICAgaGF3YWlpU3RyZWFtLnBvaW50KHgsIHkpO1xuICAgICAgICB9LFxuICAgICAgICBzcGhlcmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGxvd2VyNDhTdHJlYW0uc3BoZXJlKCk7XG4gICAgICAgICAgYWxhc2thU3RyZWFtLnNwaGVyZSgpO1xuICAgICAgICAgIGhhd2FpaVN0cmVhbS5zcGhlcmUoKTtcbiAgICAgICAgfSxcbiAgICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBsb3dlcjQ4U3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICAgIGFsYXNrYVN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgICAgICBoYXdhaWlTdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgIH0sXG4gICAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGxvd2VyNDhTdHJlYW0ubGluZUVuZCgpO1xuICAgICAgICAgIGFsYXNrYVN0cmVhbS5saW5lRW5kKCk7XG4gICAgICAgICAgaGF3YWlpU3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBsb3dlcjQ4U3RyZWFtLnBvbHlnb25TdGFydCgpO1xuICAgICAgICAgIGFsYXNrYVN0cmVhbS5wb2x5Z29uU3RhcnQoKTtcbiAgICAgICAgICBoYXdhaWlTdHJlYW0ucG9seWdvblN0YXJ0KCk7XG4gICAgICAgIH0sXG4gICAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGxvd2VyNDhTdHJlYW0ucG9seWdvbkVuZCgpO1xuICAgICAgICAgIGFsYXNrYVN0cmVhbS5wb2x5Z29uRW5kKCk7XG4gICAgICAgICAgaGF3YWlpU3RyZWFtLnBvbHlnb25FbmQoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGFsYmVyc1VzYS5wcmVjaXNpb24gPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsb3dlcjQ4LnByZWNpc2lvbigpO1xuICAgICAgbG93ZXI0OC5wcmVjaXNpb24oXyk7XG4gICAgICBhbGFza2EucHJlY2lzaW9uKF8pO1xuICAgICAgaGF3YWlpLnByZWNpc2lvbihfKTtcbiAgICAgIHJldHVybiBhbGJlcnNVc2E7XG4gICAgfTtcbiAgICBhbGJlcnNVc2Euc2NhbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsb3dlcjQ4LnNjYWxlKCk7XG4gICAgICBsb3dlcjQ4LnNjYWxlKF8pO1xuICAgICAgYWxhc2thLnNjYWxlKF8gKiAuMzUpO1xuICAgICAgaGF3YWlpLnNjYWxlKF8pO1xuICAgICAgcmV0dXJuIGFsYmVyc1VzYS50cmFuc2xhdGUobG93ZXI0OC50cmFuc2xhdGUoKSk7XG4gICAgfTtcbiAgICBhbGJlcnNVc2EudHJhbnNsYXRlID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbG93ZXI0OC50cmFuc2xhdGUoKTtcbiAgICAgIHZhciBrID0gbG93ZXI0OC5zY2FsZSgpLCB4ID0gK19bMF0sIHkgPSArX1sxXTtcbiAgICAgIGxvd2VyNDhQb2ludCA9IGxvd2VyNDgudHJhbnNsYXRlKF8pLmNsaXBFeHRlbnQoWyBbIHggLSAuNDU1ICogaywgeSAtIC4yMzggKiBrIF0sIFsgeCArIC40NTUgKiBrLCB5ICsgLjIzOCAqIGsgXSBdKS5zdHJlYW0ocG9pbnRTdHJlYW0pLnBvaW50O1xuICAgICAgYWxhc2thUG9pbnQgPSBhbGFza2EudHJhbnNsYXRlKFsgeCAtIC4zMDcgKiBrLCB5ICsgLjIwMSAqIGsgXSkuY2xpcEV4dGVudChbIFsgeCAtIC40MjUgKiBrICsgzrUsIHkgKyAuMTIgKiBrICsgzrUgXSwgWyB4IC0gLjIxNCAqIGsgLSDOtSwgeSArIC4yMzQgKiBrIC0gzrUgXSBdKS5zdHJlYW0ocG9pbnRTdHJlYW0pLnBvaW50O1xuICAgICAgaGF3YWlpUG9pbnQgPSBoYXdhaWkudHJhbnNsYXRlKFsgeCAtIC4yMDUgKiBrLCB5ICsgLjIxMiAqIGsgXSkuY2xpcEV4dGVudChbIFsgeCAtIC4yMTQgKiBrICsgzrUsIHkgKyAuMTY2ICogayArIM61IF0sIFsgeCAtIC4xMTUgKiBrIC0gzrUsIHkgKyAuMjM0ICogayAtIM61IF0gXSkuc3RyZWFtKHBvaW50U3RyZWFtKS5wb2ludDtcbiAgICAgIHJldHVybiBhbGJlcnNVc2E7XG4gICAgfTtcbiAgICByZXR1cm4gYWxiZXJzVXNhLnNjYWxlKDEwNzApO1xuICB9O1xuICB2YXIgZDNfZ2VvX3BhdGhBcmVhU3VtLCBkM19nZW9fcGF0aEFyZWFQb2x5Z29uLCBkM19nZW9fcGF0aEFyZWEgPSB7XG4gICAgcG9pbnQ6IGQzX25vb3AsXG4gICAgbGluZVN0YXJ0OiBkM19ub29wLFxuICAgIGxpbmVFbmQ6IGQzX25vb3AsXG4gICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIGQzX2dlb19wYXRoQXJlYVBvbHlnb24gPSAwO1xuICAgICAgZDNfZ2VvX3BhdGhBcmVhLmxpbmVTdGFydCA9IGQzX2dlb19wYXRoQXJlYVJpbmdTdGFydDtcbiAgICB9LFxuICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgZDNfZ2VvX3BhdGhBcmVhLmxpbmVTdGFydCA9IGQzX2dlb19wYXRoQXJlYS5saW5lRW5kID0gZDNfZ2VvX3BhdGhBcmVhLnBvaW50ID0gZDNfbm9vcDtcbiAgICAgIGQzX2dlb19wYXRoQXJlYVN1bSArPSBhYnMoZDNfZ2VvX3BhdGhBcmVhUG9seWdvbiAvIDIpO1xuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gZDNfZ2VvX3BhdGhBcmVhUmluZ1N0YXJ0KCkge1xuICAgIHZhciB4MDAsIHkwMCwgeDAsIHkwO1xuICAgIGQzX2dlb19wYXRoQXJlYS5wb2ludCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgIGQzX2dlb19wYXRoQXJlYS5wb2ludCA9IG5leHRQb2ludDtcbiAgICAgIHgwMCA9IHgwID0geCwgeTAwID0geTAgPSB5O1xuICAgIH07XG4gICAgZnVuY3Rpb24gbmV4dFBvaW50KHgsIHkpIHtcbiAgICAgIGQzX2dlb19wYXRoQXJlYVBvbHlnb24gKz0geTAgKiB4IC0geDAgKiB5O1xuICAgICAgeDAgPSB4LCB5MCA9IHk7XG4gICAgfVxuICAgIGQzX2dlb19wYXRoQXJlYS5saW5lRW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICBuZXh0UG9pbnQoeDAwLCB5MDApO1xuICAgIH07XG4gIH1cbiAgdmFyIGQzX2dlb19wYXRoQm91bmRzWDAsIGQzX2dlb19wYXRoQm91bmRzWTAsIGQzX2dlb19wYXRoQm91bmRzWDEsIGQzX2dlb19wYXRoQm91bmRzWTE7XG4gIHZhciBkM19nZW9fcGF0aEJvdW5kcyA9IHtcbiAgICBwb2ludDogZDNfZ2VvX3BhdGhCb3VuZHNQb2ludCxcbiAgICBsaW5lU3RhcnQ6IGQzX25vb3AsXG4gICAgbGluZUVuZDogZDNfbm9vcCxcbiAgICBwb2x5Z29uU3RhcnQ6IGQzX25vb3AsXG4gICAgcG9seWdvbkVuZDogZDNfbm9vcFxuICB9O1xuICBmdW5jdGlvbiBkM19nZW9fcGF0aEJvdW5kc1BvaW50KHgsIHkpIHtcbiAgICBpZiAoeCA8IGQzX2dlb19wYXRoQm91bmRzWDApIGQzX2dlb19wYXRoQm91bmRzWDAgPSB4O1xuICAgIGlmICh4ID4gZDNfZ2VvX3BhdGhCb3VuZHNYMSkgZDNfZ2VvX3BhdGhCb3VuZHNYMSA9IHg7XG4gICAgaWYgKHkgPCBkM19nZW9fcGF0aEJvdW5kc1kwKSBkM19nZW9fcGF0aEJvdW5kc1kwID0geTtcbiAgICBpZiAoeSA+IGQzX2dlb19wYXRoQm91bmRzWTEpIGQzX2dlb19wYXRoQm91bmRzWTEgPSB5O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19wYXRoQnVmZmVyKCkge1xuICAgIHZhciBwb2ludENpcmNsZSA9IGQzX2dlb19wYXRoQnVmZmVyQ2lyY2xlKDQuNSksIGJ1ZmZlciA9IFtdO1xuICAgIHZhciBzdHJlYW0gPSB7XG4gICAgICBwb2ludDogcG9pbnQsXG4gICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBzdHJlYW0ucG9pbnQgPSBwb2ludExpbmVTdGFydDtcbiAgICAgIH0sXG4gICAgICBsaW5lRW5kOiBsaW5lRW5kLFxuICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgc3RyZWFtLmxpbmVFbmQgPSBsaW5lRW5kUG9seWdvbjtcbiAgICAgIH0sXG4gICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHtcbiAgICAgICAgc3RyZWFtLmxpbmVFbmQgPSBsaW5lRW5kO1xuICAgICAgICBzdHJlYW0ucG9pbnQgPSBwb2ludDtcbiAgICAgIH0sXG4gICAgICBwb2ludFJhZGl1czogZnVuY3Rpb24oXykge1xuICAgICAgICBwb2ludENpcmNsZSA9IGQzX2dlb19wYXRoQnVmZmVyQ2lyY2xlKF8pO1xuICAgICAgICByZXR1cm4gc3RyZWFtO1xuICAgICAgfSxcbiAgICAgIHJlc3VsdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHJlc3VsdCA9IGJ1ZmZlci5qb2luKFwiXCIpO1xuICAgICAgICAgIGJ1ZmZlciA9IFtdO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIHBvaW50KHgsIHkpIHtcbiAgICAgIGJ1ZmZlci5wdXNoKFwiTVwiLCB4LCBcIixcIiwgeSwgcG9pbnRDaXJjbGUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb2ludExpbmVTdGFydCh4LCB5KSB7XG4gICAgICBidWZmZXIucHVzaChcIk1cIiwgeCwgXCIsXCIsIHkpO1xuICAgICAgc3RyZWFtLnBvaW50ID0gcG9pbnRMaW5lO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb2ludExpbmUoeCwgeSkge1xuICAgICAgYnVmZmVyLnB1c2goXCJMXCIsIHgsIFwiLFwiLCB5KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbGluZUVuZCgpIHtcbiAgICAgIHN0cmVhbS5wb2ludCA9IHBvaW50O1xuICAgIH1cbiAgICBmdW5jdGlvbiBsaW5lRW5kUG9seWdvbigpIHtcbiAgICAgIGJ1ZmZlci5wdXNoKFwiWlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cmVhbTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fcGF0aEJ1ZmZlckNpcmNsZShyYWRpdXMpIHtcbiAgICByZXR1cm4gXCJtMCxcIiArIHJhZGl1cyArIFwiYVwiICsgcmFkaXVzICsgXCIsXCIgKyByYWRpdXMgKyBcIiAwIDEsMSAwLFwiICsgLTIgKiByYWRpdXMgKyBcImFcIiArIHJhZGl1cyArIFwiLFwiICsgcmFkaXVzICsgXCIgMCAxLDEgMCxcIiArIDIgKiByYWRpdXMgKyBcInpcIjtcbiAgfVxuICB2YXIgZDNfZ2VvX3BhdGhDZW50cm9pZCA9IHtcbiAgICBwb2ludDogZDNfZ2VvX3BhdGhDZW50cm9pZFBvaW50LFxuICAgIGxpbmVTdGFydDogZDNfZ2VvX3BhdGhDZW50cm9pZExpbmVTdGFydCxcbiAgICBsaW5lRW5kOiBkM19nZW9fcGF0aENlbnRyb2lkTGluZUVuZCxcbiAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5saW5lU3RhcnQgPSBkM19nZW9fcGF0aENlbnRyb2lkUmluZ1N0YXJ0O1xuICAgIH0sXG4gICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7XG4gICAgICBkM19nZW9fcGF0aENlbnRyb2lkLnBvaW50ID0gZDNfZ2VvX3BhdGhDZW50cm9pZFBvaW50O1xuICAgICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5saW5lU3RhcnQgPSBkM19nZW9fcGF0aENlbnRyb2lkTGluZVN0YXJ0O1xuICAgICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5saW5lRW5kID0gZDNfZ2VvX3BhdGhDZW50cm9pZExpbmVFbmQ7XG4gICAgfVxuICB9O1xuICBmdW5jdGlvbiBkM19nZW9fcGF0aENlbnRyb2lkUG9pbnQoeCwgeSkge1xuICAgIGQzX2dlb19jZW50cm9pZFgwICs9IHg7XG4gICAgZDNfZ2VvX2NlbnRyb2lkWTAgKz0geTtcbiAgICArK2QzX2dlb19jZW50cm9pZFowO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19wYXRoQ2VudHJvaWRMaW5lU3RhcnQoKSB7XG4gICAgdmFyIHgwLCB5MDtcbiAgICBkM19nZW9fcGF0aENlbnRyb2lkLnBvaW50ID0gZnVuY3Rpb24oeCwgeSkge1xuICAgICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5wb2ludCA9IG5leHRQb2ludDtcbiAgICAgIGQzX2dlb19wYXRoQ2VudHJvaWRQb2ludCh4MCA9IHgsIHkwID0geSk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBuZXh0UG9pbnQoeCwgeSkge1xuICAgICAgdmFyIGR4ID0geCAtIHgwLCBkeSA9IHkgLSB5MCwgeiA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgICBkM19nZW9fY2VudHJvaWRYMSArPSB6ICogKHgwICsgeCkgLyAyO1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkWTEgKz0geiAqICh5MCArIHkpIC8gMjtcbiAgICAgIGQzX2dlb19jZW50cm9pZFoxICs9IHo7XG4gICAgICBkM19nZW9fcGF0aENlbnRyb2lkUG9pbnQoeDAgPSB4LCB5MCA9IHkpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fcGF0aENlbnRyb2lkTGluZUVuZCgpIHtcbiAgICBkM19nZW9fcGF0aENlbnRyb2lkLnBvaW50ID0gZDNfZ2VvX3BhdGhDZW50cm9pZFBvaW50O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19wYXRoQ2VudHJvaWRSaW5nU3RhcnQoKSB7XG4gICAgdmFyIHgwMCwgeTAwLCB4MCwgeTA7XG4gICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5wb2ludCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgIGQzX2dlb19wYXRoQ2VudHJvaWQucG9pbnQgPSBuZXh0UG9pbnQ7XG4gICAgICBkM19nZW9fcGF0aENlbnRyb2lkUG9pbnQoeDAwID0geDAgPSB4LCB5MDAgPSB5MCA9IHkpO1xuICAgIH07XG4gICAgZnVuY3Rpb24gbmV4dFBvaW50KHgsIHkpIHtcbiAgICAgIHZhciBkeCA9IHggLSB4MCwgZHkgPSB5IC0geTAsIHogPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkWDEgKz0geiAqICh4MCArIHgpIC8gMjtcbiAgICAgIGQzX2dlb19jZW50cm9pZFkxICs9IHogKiAoeTAgKyB5KSAvIDI7XG4gICAgICBkM19nZW9fY2VudHJvaWRaMSArPSB6O1xuICAgICAgeiA9IHkwICogeCAtIHgwICogeTtcbiAgICAgIGQzX2dlb19jZW50cm9pZFgyICs9IHogKiAoeDAgKyB4KTtcbiAgICAgIGQzX2dlb19jZW50cm9pZFkyICs9IHogKiAoeTAgKyB5KTtcbiAgICAgIGQzX2dlb19jZW50cm9pZFoyICs9IHogKiAzO1xuICAgICAgZDNfZ2VvX3BhdGhDZW50cm9pZFBvaW50KHgwID0geCwgeTAgPSB5KTtcbiAgICB9XG4gICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5saW5lRW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICBuZXh0UG9pbnQoeDAwLCB5MDApO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX3BhdGhDb250ZXh0KGNvbnRleHQpIHtcbiAgICB2YXIgcG9pbnRSYWRpdXMgPSA0LjU7XG4gICAgdmFyIHN0cmVhbSA9IHtcbiAgICAgIHBvaW50OiBwb2ludCxcbiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHN0cmVhbS5wb2ludCA9IHBvaW50TGluZVN0YXJ0O1xuICAgICAgfSxcbiAgICAgIGxpbmVFbmQ6IGxpbmVFbmQsXG4gICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBzdHJlYW0ubGluZUVuZCA9IGxpbmVFbmRQb2x5Z29uO1xuICAgICAgfSxcbiAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBzdHJlYW0ubGluZUVuZCA9IGxpbmVFbmQ7XG4gICAgICAgIHN0cmVhbS5wb2ludCA9IHBvaW50O1xuICAgICAgfSxcbiAgICAgIHBvaW50UmFkaXVzOiBmdW5jdGlvbihfKSB7XG4gICAgICAgIHBvaW50UmFkaXVzID0gXztcbiAgICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICAgIH0sXG4gICAgICByZXN1bHQ6IGQzX25vb3BcbiAgICB9O1xuICAgIGZ1bmN0aW9uIHBvaW50KHgsIHkpIHtcbiAgICAgIGNvbnRleHQubW92ZVRvKHggKyBwb2ludFJhZGl1cywgeSk7XG4gICAgICBjb250ZXh0LmFyYyh4LCB5LCBwb2ludFJhZGl1cywgMCwgz4QpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb2ludExpbmVTdGFydCh4LCB5KSB7XG4gICAgICBjb250ZXh0Lm1vdmVUbyh4LCB5KTtcbiAgICAgIHN0cmVhbS5wb2ludCA9IHBvaW50TGluZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG9pbnRMaW5lKHgsIHkpIHtcbiAgICAgIGNvbnRleHQubGluZVRvKHgsIHkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBsaW5lRW5kKCkge1xuICAgICAgc3RyZWFtLnBvaW50ID0gcG9pbnQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxpbmVFbmRQb2x5Z29uKCkge1xuICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0cmVhbTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fcmVzYW1wbGUocHJvamVjdCkge1xuICAgIHZhciDOtDIgPSAuNSwgY29zTWluRGlzdGFuY2UgPSBNYXRoLmNvcygzMCAqIGQzX3JhZGlhbnMpLCBtYXhEZXB0aCA9IDE2O1xuICAgIGZ1bmN0aW9uIHJlc2FtcGxlKHN0cmVhbSkge1xuICAgICAgcmV0dXJuIChtYXhEZXB0aCA/IHJlc2FtcGxlUmVjdXJzaXZlIDogcmVzYW1wbGVOb25lKShzdHJlYW0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXNhbXBsZU5vbmUoc3RyZWFtKSB7XG4gICAgICByZXR1cm4gZDNfZ2VvX3RyYW5zZm9ybVBvaW50KHN0cmVhbSwgZnVuY3Rpb24oeCwgeSkge1xuICAgICAgICB4ID0gcHJvamVjdCh4LCB5KTtcbiAgICAgICAgc3RyZWFtLnBvaW50KHhbMF0sIHhbMV0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlc2FtcGxlUmVjdXJzaXZlKHN0cmVhbSkge1xuICAgICAgdmFyIM67MDAsIM+GMDAsIHgwMCwgeTAwLCBhMDAsIGIwMCwgYzAwLCDOuzAsIHgwLCB5MCwgYTAsIGIwLCBjMDtcbiAgICAgIHZhciByZXNhbXBsZSA9IHtcbiAgICAgICAgcG9pbnQ6IHBvaW50LFxuICAgICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCxcbiAgICAgICAgbGluZUVuZDogbGluZUVuZCxcbiAgICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzdHJlYW0ucG9seWdvblN0YXJ0KCk7XG4gICAgICAgICAgcmVzYW1wbGUubGluZVN0YXJ0ID0gcmluZ1N0YXJ0O1xuICAgICAgICB9LFxuICAgICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBzdHJlYW0ucG9seWdvbkVuZCgpO1xuICAgICAgICAgIHJlc2FtcGxlLmxpbmVTdGFydCA9IGxpbmVTdGFydDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGZ1bmN0aW9uIHBvaW50KHgsIHkpIHtcbiAgICAgICAgeCA9IHByb2plY3QoeCwgeSk7XG4gICAgICAgIHN0cmVhbS5wb2ludCh4WzBdLCB4WzFdKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGxpbmVTdGFydCgpIHtcbiAgICAgICAgeDAgPSBOYU47XG4gICAgICAgIHJlc2FtcGxlLnBvaW50ID0gbGluZVBvaW50O1xuICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBsaW5lUG9pbnQozrssIM+GKSB7XG4gICAgICAgIHZhciBjID0gZDNfZ2VvX2NhcnRlc2lhbihbIM67LCDPhiBdKSwgcCA9IHByb2plY3QozrssIM+GKTtcbiAgICAgICAgcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCDOuzAsIGEwLCBiMCwgYzAsIHgwID0gcFswXSwgeTAgPSBwWzFdLCDOuzAgPSDOuywgYTAgPSBjWzBdLCBiMCA9IGNbMV0sIGMwID0gY1syXSwgbWF4RGVwdGgsIHN0cmVhbSk7XG4gICAgICAgIHN0cmVhbS5wb2ludCh4MCwgeTApO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gbGluZUVuZCgpIHtcbiAgICAgICAgcmVzYW1wbGUucG9pbnQgPSBwb2ludDtcbiAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHJpbmdTdGFydCgpIHtcbiAgICAgICAgbGluZVN0YXJ0KCk7XG4gICAgICAgIHJlc2FtcGxlLnBvaW50ID0gcmluZ1BvaW50O1xuICAgICAgICByZXNhbXBsZS5saW5lRW5kID0gcmluZ0VuZDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHJpbmdQb2ludCjOuywgz4YpIHtcbiAgICAgICAgbGluZVBvaW50KM67MDAgPSDOuywgz4YwMCA9IM+GKSwgeDAwID0geDAsIHkwMCA9IHkwLCBhMDAgPSBhMCwgYjAwID0gYjAsIGMwMCA9IGMwO1xuICAgICAgICByZXNhbXBsZS5wb2ludCA9IGxpbmVQb2ludDtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHJpbmdFbmQoKSB7XG4gICAgICAgIHJlc2FtcGxlTGluZVRvKHgwLCB5MCwgzrswLCBhMCwgYjAsIGMwLCB4MDAsIHkwMCwgzrswMCwgYTAwLCBiMDAsIGMwMCwgbWF4RGVwdGgsIHN0cmVhbSk7XG4gICAgICAgIHJlc2FtcGxlLmxpbmVFbmQgPSBsaW5lRW5kO1xuICAgICAgICBsaW5lRW5kKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzYW1wbGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlc2FtcGxlTGluZVRvKHgwLCB5MCwgzrswLCBhMCwgYjAsIGMwLCB4MSwgeTEsIM67MSwgYTEsIGIxLCBjMSwgZGVwdGgsIHN0cmVhbSkge1xuICAgICAgdmFyIGR4ID0geDEgLSB4MCwgZHkgPSB5MSAtIHkwLCBkMiA9IGR4ICogZHggKyBkeSAqIGR5O1xuICAgICAgaWYgKGQyID4gNCAqIM60MiAmJiBkZXB0aC0tKSB7XG4gICAgICAgIHZhciBhID0gYTAgKyBhMSwgYiA9IGIwICsgYjEsIGMgPSBjMCArIGMxLCBtID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIgKyBjICogYyksIM+GMiA9IE1hdGguYXNpbihjIC89IG0pLCDOuzIgPSBhYnMoYWJzKGMpIC0gMSkgPCDOtSB8fCBhYnMozrswIC0gzrsxKSA8IM61ID8gKM67MCArIM67MSkgLyAyIDogTWF0aC5hdGFuMihiLCBhKSwgcCA9IHByb2plY3QozrsyLCDPhjIpLCB4MiA9IHBbMF0sIHkyID0gcFsxXSwgZHgyID0geDIgLSB4MCwgZHkyID0geTIgLSB5MCwgZHogPSBkeSAqIGR4MiAtIGR4ICogZHkyO1xuICAgICAgICBpZiAoZHogKiBkeiAvIGQyID4gzrQyIHx8IGFicygoZHggKiBkeDIgKyBkeSAqIGR5MikgLyBkMiAtIC41KSA+IC4zIHx8IGEwICogYTEgKyBiMCAqIGIxICsgYzAgKiBjMSA8IGNvc01pbkRpc3RhbmNlKSB7XG4gICAgICAgICAgcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCDOuzAsIGEwLCBiMCwgYzAsIHgyLCB5MiwgzrsyLCBhIC89IG0sIGIgLz0gbSwgYywgZGVwdGgsIHN0cmVhbSk7XG4gICAgICAgICAgc3RyZWFtLnBvaW50KHgyLCB5Mik7XG4gICAgICAgICAgcmVzYW1wbGVMaW5lVG8oeDIsIHkyLCDOuzIsIGEsIGIsIGMsIHgxLCB5MSwgzrsxLCBhMSwgYjEsIGMxLCBkZXB0aCwgc3RyZWFtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXNhbXBsZS5wcmVjaXNpb24gPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBNYXRoLnNxcnQozrQyKTtcbiAgICAgIG1heERlcHRoID0gKM60MiA9IF8gKiBfKSA+IDAgJiYgMTY7XG4gICAgICByZXR1cm4gcmVzYW1wbGU7XG4gICAgfTtcbiAgICByZXR1cm4gcmVzYW1wbGU7XG4gIH1cbiAgZDMuZ2VvLnBhdGggPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcG9pbnRSYWRpdXMgPSA0LjUsIHByb2plY3Rpb24sIGNvbnRleHQsIHByb2plY3RTdHJlYW0sIGNvbnRleHRTdHJlYW0sIGNhY2hlU3RyZWFtO1xuICAgIGZ1bmN0aW9uIHBhdGgob2JqZWN0KSB7XG4gICAgICBpZiAob2JqZWN0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgcG9pbnRSYWRpdXMgPT09IFwiZnVuY3Rpb25cIikgY29udGV4dFN0cmVhbS5wb2ludFJhZGl1cygrcG9pbnRSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgICAgIGlmICghY2FjaGVTdHJlYW0gfHwgIWNhY2hlU3RyZWFtLnZhbGlkKSBjYWNoZVN0cmVhbSA9IHByb2plY3RTdHJlYW0oY29udGV4dFN0cmVhbSk7XG4gICAgICAgIGQzLmdlby5zdHJlYW0ob2JqZWN0LCBjYWNoZVN0cmVhbSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udGV4dFN0cmVhbS5yZXN1bHQoKTtcbiAgICB9XG4gICAgcGF0aC5hcmVhID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICBkM19nZW9fcGF0aEFyZWFTdW0gPSAwO1xuICAgICAgZDMuZ2VvLnN0cmVhbShvYmplY3QsIHByb2plY3RTdHJlYW0oZDNfZ2VvX3BhdGhBcmVhKSk7XG4gICAgICByZXR1cm4gZDNfZ2VvX3BhdGhBcmVhU3VtO1xuICAgIH07XG4gICAgcGF0aC5jZW50cm9pZCA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkWDAgPSBkM19nZW9fY2VudHJvaWRZMCA9IGQzX2dlb19jZW50cm9pZFowID0gZDNfZ2VvX2NlbnRyb2lkWDEgPSBkM19nZW9fY2VudHJvaWRZMSA9IGQzX2dlb19jZW50cm9pZFoxID0gZDNfZ2VvX2NlbnRyb2lkWDIgPSBkM19nZW9fY2VudHJvaWRZMiA9IGQzX2dlb19jZW50cm9pZFoyID0gMDtcbiAgICAgIGQzLmdlby5zdHJlYW0ob2JqZWN0LCBwcm9qZWN0U3RyZWFtKGQzX2dlb19wYXRoQ2VudHJvaWQpKTtcbiAgICAgIHJldHVybiBkM19nZW9fY2VudHJvaWRaMiA/IFsgZDNfZ2VvX2NlbnRyb2lkWDIgLyBkM19nZW9fY2VudHJvaWRaMiwgZDNfZ2VvX2NlbnRyb2lkWTIgLyBkM19nZW9fY2VudHJvaWRaMiBdIDogZDNfZ2VvX2NlbnRyb2lkWjEgPyBbIGQzX2dlb19jZW50cm9pZFgxIC8gZDNfZ2VvX2NlbnRyb2lkWjEsIGQzX2dlb19jZW50cm9pZFkxIC8gZDNfZ2VvX2NlbnRyb2lkWjEgXSA6IGQzX2dlb19jZW50cm9pZFowID8gWyBkM19nZW9fY2VudHJvaWRYMCAvIGQzX2dlb19jZW50cm9pZFowLCBkM19nZW9fY2VudHJvaWRZMCAvIGQzX2dlb19jZW50cm9pZFowIF0gOiBbIE5hTiwgTmFOIF07XG4gICAgfTtcbiAgICBwYXRoLmJvdW5kcyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgICAgZDNfZ2VvX3BhdGhCb3VuZHNYMSA9IGQzX2dlb19wYXRoQm91bmRzWTEgPSAtKGQzX2dlb19wYXRoQm91bmRzWDAgPSBkM19nZW9fcGF0aEJvdW5kc1kwID0gSW5maW5pdHkpO1xuICAgICAgZDMuZ2VvLnN0cmVhbShvYmplY3QsIHByb2plY3RTdHJlYW0oZDNfZ2VvX3BhdGhCb3VuZHMpKTtcbiAgICAgIHJldHVybiBbIFsgZDNfZ2VvX3BhdGhCb3VuZHNYMCwgZDNfZ2VvX3BhdGhCb3VuZHNZMCBdLCBbIGQzX2dlb19wYXRoQm91bmRzWDEsIGQzX2dlb19wYXRoQm91bmRzWTEgXSBdO1xuICAgIH07XG4gICAgcGF0aC5wcm9qZWN0aW9uID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcHJvamVjdGlvbjtcbiAgICAgIHByb2plY3RTdHJlYW0gPSAocHJvamVjdGlvbiA9IF8pID8gXy5zdHJlYW0gfHwgZDNfZ2VvX3BhdGhQcm9qZWN0U3RyZWFtKF8pIDogZDNfaWRlbnRpdHk7XG4gICAgICByZXR1cm4gcmVzZXQoKTtcbiAgICB9O1xuICAgIHBhdGguY29udGV4dCA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNvbnRleHQ7XG4gICAgICBjb250ZXh0U3RyZWFtID0gKGNvbnRleHQgPSBfKSA9PSBudWxsID8gbmV3IGQzX2dlb19wYXRoQnVmZmVyKCkgOiBuZXcgZDNfZ2VvX3BhdGhDb250ZXh0KF8pO1xuICAgICAgaWYgKHR5cGVvZiBwb2ludFJhZGl1cyAhPT0gXCJmdW5jdGlvblwiKSBjb250ZXh0U3RyZWFtLnBvaW50UmFkaXVzKHBvaW50UmFkaXVzKTtcbiAgICAgIHJldHVybiByZXNldCgpO1xuICAgIH07XG4gICAgcGF0aC5wb2ludFJhZGl1cyA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHBvaW50UmFkaXVzO1xuICAgICAgcG9pbnRSYWRpdXMgPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6IChjb250ZXh0U3RyZWFtLnBvaW50UmFkaXVzKCtfKSwgK18pO1xuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfTtcbiAgICBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgIGNhY2hlU3RyZWFtID0gbnVsbDtcbiAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5wcm9qZWN0aW9uKGQzLmdlby5hbGJlcnNVc2EoKSkuY29udGV4dChudWxsKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfZ2VvX3BhdGhQcm9qZWN0U3RyZWFtKHByb2plY3QpIHtcbiAgICB2YXIgcmVzYW1wbGUgPSBkM19nZW9fcmVzYW1wbGUoZnVuY3Rpb24oeCwgeSkge1xuICAgICAgcmV0dXJuIHByb2plY3QoWyB4ICogZDNfZGVncmVlcywgeSAqIGQzX2RlZ3JlZXMgXSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSkge1xuICAgICAgcmV0dXJuIGQzX2dlb19wcm9qZWN0aW9uUmFkaWFucyhyZXNhbXBsZShzdHJlYW0pKTtcbiAgICB9O1xuICB9XG4gIGQzLmdlby50cmFuc2Zvcm0gPSBmdW5jdGlvbihtZXRob2RzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0cmVhbTogZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgZDNfZ2VvX3RyYW5zZm9ybShzdHJlYW0pO1xuICAgICAgICBmb3IgKHZhciBrIGluIG1ldGhvZHMpIHRyYW5zZm9ybVtrXSA9IG1ldGhvZHNba107XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm07XG4gICAgICB9XG4gICAgfTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfZ2VvX3RyYW5zZm9ybShzdHJlYW0pIHtcbiAgICB0aGlzLnN0cmVhbSA9IHN0cmVhbTtcbiAgfVxuICBkM19nZW9fdHJhbnNmb3JtLnByb3RvdHlwZSA9IHtcbiAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkge1xuICAgICAgdGhpcy5zdHJlYW0ucG9pbnQoeCwgeSk7XG4gICAgfSxcbiAgICBzcGhlcmU6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5zdHJlYW0uc3BoZXJlKCk7XG4gICAgfSxcbiAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5zdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgfSxcbiAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuc3RyZWFtLmxpbmVFbmQoKTtcbiAgICB9LFxuICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLnN0cmVhbS5wb2x5Z29uU3RhcnQoKTtcbiAgICB9LFxuICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpO1xuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gZDNfZ2VvX3RyYW5zZm9ybVBvaW50KHN0cmVhbSwgcG9pbnQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcG9pbnQ6IHBvaW50LFxuICAgICAgc3BoZXJlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgc3RyZWFtLnNwaGVyZSgpO1xuICAgICAgfSxcbiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgIH0sXG4gICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgIH0sXG4gICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBzdHJlYW0ucG9seWdvblN0YXJ0KCk7XG4gICAgICB9LFxuICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHN0cmVhbS5wb2x5Z29uRW5kKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBkMy5nZW8ucHJvamVjdGlvbiA9IGQzX2dlb19wcm9qZWN0aW9uO1xuICBkMy5nZW8ucHJvamVjdGlvbk11dGF0b3IgPSBkM19nZW9fcHJvamVjdGlvbk11dGF0b3I7XG4gIGZ1bmN0aW9uIGQzX2dlb19wcm9qZWN0aW9uKHByb2plY3QpIHtcbiAgICByZXR1cm4gZDNfZ2VvX3Byb2plY3Rpb25NdXRhdG9yKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHByb2plY3Q7XG4gICAgfSkoKTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fcHJvamVjdGlvbk11dGF0b3IocHJvamVjdEF0KSB7XG4gICAgdmFyIHByb2plY3QsIHJvdGF0ZSwgcHJvamVjdFJvdGF0ZSwgcHJvamVjdFJlc2FtcGxlID0gZDNfZ2VvX3Jlc2FtcGxlKGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgIHggPSBwcm9qZWN0KHgsIHkpO1xuICAgICAgcmV0dXJuIFsgeFswXSAqIGsgKyDOtHgsIM60eSAtIHhbMV0gKiBrIF07XG4gICAgfSksIGsgPSAxNTAsIHggPSA0ODAsIHkgPSAyNTAsIM67ID0gMCwgz4YgPSAwLCDOtM67ID0gMCwgzrTPhiA9IDAsIM60zrMgPSAwLCDOtHgsIM60eSwgcHJlY2xpcCA9IGQzX2dlb19jbGlwQW50aW1lcmlkaWFuLCBwb3N0Y2xpcCA9IGQzX2lkZW50aXR5LCBjbGlwQW5nbGUgPSBudWxsLCBjbGlwRXh0ZW50ID0gbnVsbCwgc3RyZWFtO1xuICAgIGZ1bmN0aW9uIHByb2plY3Rpb24ocG9pbnQpIHtcbiAgICAgIHBvaW50ID0gcHJvamVjdFJvdGF0ZShwb2ludFswXSAqIGQzX3JhZGlhbnMsIHBvaW50WzFdICogZDNfcmFkaWFucyk7XG4gICAgICByZXR1cm4gWyBwb2ludFswXSAqIGsgKyDOtHgsIM60eSAtIHBvaW50WzFdICogayBdO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpbnZlcnQocG9pbnQpIHtcbiAgICAgIHBvaW50ID0gcHJvamVjdFJvdGF0ZS5pbnZlcnQoKHBvaW50WzBdIC0gzrR4KSAvIGssICjOtHkgLSBwb2ludFsxXSkgLyBrKTtcbiAgICAgIHJldHVybiBwb2ludCAmJiBbIHBvaW50WzBdICogZDNfZGVncmVlcywgcG9pbnRbMV0gKiBkM19kZWdyZWVzIF07XG4gICAgfVxuICAgIHByb2plY3Rpb24uc3RyZWFtID0gZnVuY3Rpb24ob3V0cHV0KSB7XG4gICAgICBpZiAoc3RyZWFtKSBzdHJlYW0udmFsaWQgPSBmYWxzZTtcbiAgICAgIHN0cmVhbSA9IGQzX2dlb19wcm9qZWN0aW9uUmFkaWFucyhwcmVjbGlwKHJvdGF0ZSwgcHJvamVjdFJlc2FtcGxlKHBvc3RjbGlwKG91dHB1dCkpKSk7XG4gICAgICBzdHJlYW0udmFsaWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICB9O1xuICAgIHByb2plY3Rpb24uY2xpcEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2xpcEFuZ2xlO1xuICAgICAgcHJlY2xpcCA9IF8gPT0gbnVsbCA/IChjbGlwQW5nbGUgPSBfLCBkM19nZW9fY2xpcEFudGltZXJpZGlhbikgOiBkM19nZW9fY2xpcENpcmNsZSgoY2xpcEFuZ2xlID0gK18pICogZDNfcmFkaWFucyk7XG4gICAgICByZXR1cm4gaW52YWxpZGF0ZSgpO1xuICAgIH07XG4gICAgcHJvamVjdGlvbi5jbGlwRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2xpcEV4dGVudDtcbiAgICAgIGNsaXBFeHRlbnQgPSBfO1xuICAgICAgcG9zdGNsaXAgPSBfID8gZDNfZ2VvX2NsaXBFeHRlbnQoX1swXVswXSwgX1swXVsxXSwgX1sxXVswXSwgX1sxXVsxXSkgOiBkM19pZGVudGl0eTtcbiAgICAgIHJldHVybiBpbnZhbGlkYXRlKCk7XG4gICAgfTtcbiAgICBwcm9qZWN0aW9uLnNjYWxlID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gaztcbiAgICAgIGsgPSArXztcbiAgICAgIHJldHVybiByZXNldCgpO1xuICAgIH07XG4gICAgcHJvamVjdGlvbi50cmFuc2xhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbIHgsIHkgXTtcbiAgICAgIHggPSArX1swXTtcbiAgICAgIHkgPSArX1sxXTtcbiAgICAgIHJldHVybiByZXNldCgpO1xuICAgIH07XG4gICAgcHJvamVjdGlvbi5jZW50ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbIM67ICogZDNfZGVncmVlcywgz4YgKiBkM19kZWdyZWVzIF07XG4gICAgICDOuyA9IF9bMF0gJSAzNjAgKiBkM19yYWRpYW5zO1xuICAgICAgz4YgPSBfWzFdICUgMzYwICogZDNfcmFkaWFucztcbiAgICAgIHJldHVybiByZXNldCgpO1xuICAgIH07XG4gICAgcHJvamVjdGlvbi5yb3RhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbIM60zrsgKiBkM19kZWdyZWVzLCDOtM+GICogZDNfZGVncmVlcywgzrTOsyAqIGQzX2RlZ3JlZXMgXTtcbiAgICAgIM60zrsgPSBfWzBdICUgMzYwICogZDNfcmFkaWFucztcbiAgICAgIM60z4YgPSBfWzFdICUgMzYwICogZDNfcmFkaWFucztcbiAgICAgIM60zrMgPSBfLmxlbmd0aCA+IDIgPyBfWzJdICUgMzYwICogZDNfcmFkaWFucyA6IDA7XG4gICAgICByZXR1cm4gcmVzZXQoKTtcbiAgICB9O1xuICAgIGQzLnJlYmluZChwcm9qZWN0aW9uLCBwcm9qZWN0UmVzYW1wbGUsIFwicHJlY2lzaW9uXCIpO1xuICAgIGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgcHJvamVjdFJvdGF0ZSA9IGQzX2dlb19jb21wb3NlKHJvdGF0ZSA9IGQzX2dlb19yb3RhdGlvbijOtM67LCDOtM+GLCDOtM6zKSwgcHJvamVjdCk7XG4gICAgICB2YXIgY2VudGVyID0gcHJvamVjdCjOuywgz4YpO1xuICAgICAgzrR4ID0geCAtIGNlbnRlclswXSAqIGs7XG4gICAgICDOtHkgPSB5ICsgY2VudGVyWzFdICogaztcbiAgICAgIHJldHVybiBpbnZhbGlkYXRlKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGludmFsaWRhdGUoKSB7XG4gICAgICBpZiAoc3RyZWFtKSBzdHJlYW0udmFsaWQgPSBmYWxzZSwgc3RyZWFtID0gbnVsbDtcbiAgICAgIHJldHVybiBwcm9qZWN0aW9uO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICBwcm9qZWN0ID0gcHJvamVjdEF0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBwcm9qZWN0aW9uLmludmVydCA9IHByb2plY3QuaW52ZXJ0ICYmIGludmVydDtcbiAgICAgIHJldHVybiByZXNldCgpO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX3Byb2plY3Rpb25SYWRpYW5zKHN0cmVhbSkge1xuICAgIHJldHVybiBkM19nZW9fdHJhbnNmb3JtUG9pbnQoc3RyZWFtLCBmdW5jdGlvbih4LCB5KSB7XG4gICAgICBzdHJlYW0ucG9pbnQoeCAqIGQzX3JhZGlhbnMsIHkgKiBkM19yYWRpYW5zKTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fZXF1aXJlY3Rhbmd1bGFyKM67LCDPhikge1xuICAgIHJldHVybiBbIM67LCDPhiBdO1xuICB9XG4gIChkMy5nZW8uZXF1aXJlY3Rhbmd1bGFyID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzX2dlb19wcm9qZWN0aW9uKGQzX2dlb19lcXVpcmVjdGFuZ3VsYXIpO1xuICB9KS5yYXcgPSBkM19nZW9fZXF1aXJlY3Rhbmd1bGFyLmludmVydCA9IGQzX2dlb19lcXVpcmVjdGFuZ3VsYXI7XG4gIGQzLmdlby5yb3RhdGlvbiA9IGZ1bmN0aW9uKHJvdGF0ZSkge1xuICAgIHJvdGF0ZSA9IGQzX2dlb19yb3RhdGlvbihyb3RhdGVbMF0gJSAzNjAgKiBkM19yYWRpYW5zLCByb3RhdGVbMV0gKiBkM19yYWRpYW5zLCByb3RhdGUubGVuZ3RoID4gMiA/IHJvdGF0ZVsyXSAqIGQzX3JhZGlhbnMgOiAwKTtcbiAgICBmdW5jdGlvbiBmb3J3YXJkKGNvb3JkaW5hdGVzKSB7XG4gICAgICBjb29yZGluYXRlcyA9IHJvdGF0ZShjb29yZGluYXRlc1swXSAqIGQzX3JhZGlhbnMsIGNvb3JkaW5hdGVzWzFdICogZDNfcmFkaWFucyk7XG4gICAgICByZXR1cm4gY29vcmRpbmF0ZXNbMF0gKj0gZDNfZGVncmVlcywgY29vcmRpbmF0ZXNbMV0gKj0gZDNfZGVncmVlcywgY29vcmRpbmF0ZXM7XG4gICAgfVxuICAgIGZvcndhcmQuaW52ZXJ0ID0gZnVuY3Rpb24oY29vcmRpbmF0ZXMpIHtcbiAgICAgIGNvb3JkaW5hdGVzID0gcm90YXRlLmludmVydChjb29yZGluYXRlc1swXSAqIGQzX3JhZGlhbnMsIGNvb3JkaW5hdGVzWzFdICogZDNfcmFkaWFucyk7XG4gICAgICByZXR1cm4gY29vcmRpbmF0ZXNbMF0gKj0gZDNfZGVncmVlcywgY29vcmRpbmF0ZXNbMV0gKj0gZDNfZGVncmVlcywgY29vcmRpbmF0ZXM7XG4gICAgfTtcbiAgICByZXR1cm4gZm9yd2FyZDtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfZ2VvX2lkZW50aXR5Um90YXRpb24ozrssIM+GKSB7XG4gICAgcmV0dXJuIFsgzrsgPiDPgCA/IM67IC0gz4QgOiDOuyA8IC3PgCA/IM67ICsgz4QgOiDOuywgz4YgXTtcbiAgfVxuICBkM19nZW9faWRlbnRpdHlSb3RhdGlvbi5pbnZlcnQgPSBkM19nZW9fZXF1aXJlY3Rhbmd1bGFyO1xuICBmdW5jdGlvbiBkM19nZW9fcm90YXRpb24ozrTOuywgzrTPhiwgzrTOsykge1xuICAgIHJldHVybiDOtM67ID8gzrTPhiB8fCDOtM6zID8gZDNfZ2VvX2NvbXBvc2UoZDNfZ2VvX3JvdGF0aW9uzrsozrTOuyksIGQzX2dlb19yb3RhdGlvbs+GzrMozrTPhiwgzrTOsykpIDogZDNfZ2VvX3JvdGF0aW9uzrsozrTOuykgOiDOtM+GIHx8IM60zrMgPyBkM19nZW9fcm90YXRpb27Phs6zKM60z4YsIM60zrMpIDogZDNfZ2VvX2lkZW50aXR5Um90YXRpb247XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2ZvcndhcmRSb3RhdGlvbs67KM60zrspIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ozrssIM+GKSB7XG4gICAgICByZXR1cm4gzrsgKz0gzrTOuywgWyDOuyA+IM+AID8gzrsgLSDPhCA6IM67IDwgLc+AID8gzrsgKyDPhCA6IM67LCDPhiBdO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX3JvdGF0aW9uzrsozrTOuykge1xuICAgIHZhciByb3RhdGlvbiA9IGQzX2dlb19mb3J3YXJkUm90YXRpb27OuyjOtM67KTtcbiAgICByb3RhdGlvbi5pbnZlcnQgPSBkM19nZW9fZm9yd2FyZFJvdGF0aW9uzrsoLc60zrspO1xuICAgIHJldHVybiByb3RhdGlvbjtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fcm90YXRpb27Phs6zKM60z4YsIM60zrMpIHtcbiAgICB2YXIgY29zzrTPhiA9IE1hdGguY29zKM60z4YpLCBzaW7OtM+GID0gTWF0aC5zaW4ozrTPhiksIGNvc860zrMgPSBNYXRoLmNvcyjOtM6zKSwgc2luzrTOsyA9IE1hdGguc2luKM60zrMpO1xuICAgIGZ1bmN0aW9uIHJvdGF0aW9uKM67LCDPhikge1xuICAgICAgdmFyIGNvc8+GID0gTWF0aC5jb3Moz4YpLCB4ID0gTWF0aC5jb3MozrspICogY29zz4YsIHkgPSBNYXRoLnNpbijOuykgKiBjb3PPhiwgeiA9IE1hdGguc2luKM+GKSwgayA9IHogKiBjb3POtM+GICsgeCAqIHNpbs60z4Y7XG4gICAgICByZXR1cm4gWyBNYXRoLmF0YW4yKHkgKiBjb3POtM6zIC0gayAqIHNpbs60zrMsIHggKiBjb3POtM+GIC0geiAqIHNpbs60z4YpLCBkM19hc2luKGsgKiBjb3POtM6zICsgeSAqIHNpbs60zrMpIF07XG4gICAgfVxuICAgIHJvdGF0aW9uLmludmVydCA9IGZ1bmN0aW9uKM67LCDPhikge1xuICAgICAgdmFyIGNvc8+GID0gTWF0aC5jb3Moz4YpLCB4ID0gTWF0aC5jb3MozrspICogY29zz4YsIHkgPSBNYXRoLnNpbijOuykgKiBjb3PPhiwgeiA9IE1hdGguc2luKM+GKSwgayA9IHogKiBjb3POtM6zIC0geSAqIHNpbs60zrM7XG4gICAgICByZXR1cm4gWyBNYXRoLmF0YW4yKHkgKiBjb3POtM6zICsgeiAqIHNpbs60zrMsIHggKiBjb3POtM+GICsgayAqIHNpbs60z4YpLCBkM19hc2luKGsgKiBjb3POtM+GIC0geCAqIHNpbs60z4YpIF07XG4gICAgfTtcbiAgICByZXR1cm4gcm90YXRpb247XG4gIH1cbiAgZDMuZ2VvLmNpcmNsZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvcmlnaW4gPSBbIDAsIDAgXSwgYW5nbGUsIHByZWNpc2lvbiA9IDYsIGludGVycG9sYXRlO1xuICAgIGZ1bmN0aW9uIGNpcmNsZSgpIHtcbiAgICAgIHZhciBjZW50ZXIgPSB0eXBlb2Ygb3JpZ2luID09PSBcImZ1bmN0aW9uXCIgPyBvcmlnaW4uYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IG9yaWdpbiwgcm90YXRlID0gZDNfZ2VvX3JvdGF0aW9uKC1jZW50ZXJbMF0gKiBkM19yYWRpYW5zLCAtY2VudGVyWzFdICogZDNfcmFkaWFucywgMCkuaW52ZXJ0LCByaW5nID0gW107XG4gICAgICBpbnRlcnBvbGF0ZShudWxsLCBudWxsLCAxLCB7XG4gICAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgICAgICAgcmluZy5wdXNoKHggPSByb3RhdGUoeCwgeSkpO1xuICAgICAgICAgIHhbMF0gKj0gZDNfZGVncmVlcywgeFsxXSAqPSBkM19kZWdyZWVzO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiUG9seWdvblwiLFxuICAgICAgICBjb29yZGluYXRlczogWyByaW5nIF1cbiAgICAgIH07XG4gICAgfVxuICAgIGNpcmNsZS5vcmlnaW4gPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvcmlnaW47XG4gICAgICBvcmlnaW4gPSB4O1xuICAgICAgcmV0dXJuIGNpcmNsZTtcbiAgICB9O1xuICAgIGNpcmNsZS5hbmdsZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGFuZ2xlO1xuICAgICAgaW50ZXJwb2xhdGUgPSBkM19nZW9fY2lyY2xlSW50ZXJwb2xhdGUoKGFuZ2xlID0gK3gpICogZDNfcmFkaWFucywgcHJlY2lzaW9uICogZDNfcmFkaWFucyk7XG4gICAgICByZXR1cm4gY2lyY2xlO1xuICAgIH07XG4gICAgY2lyY2xlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHByZWNpc2lvbjtcbiAgICAgIGludGVycG9sYXRlID0gZDNfZ2VvX2NpcmNsZUludGVycG9sYXRlKGFuZ2xlICogZDNfcmFkaWFucywgKHByZWNpc2lvbiA9ICtfKSAqIGQzX3JhZGlhbnMpO1xuICAgICAgcmV0dXJuIGNpcmNsZTtcbiAgICB9O1xuICAgIHJldHVybiBjaXJjbGUuYW5nbGUoOTApO1xuICB9O1xuICBmdW5jdGlvbiBkM19nZW9fY2lyY2xlSW50ZXJwb2xhdGUocmFkaXVzLCBwcmVjaXNpb24pIHtcbiAgICB2YXIgY3IgPSBNYXRoLmNvcyhyYWRpdXMpLCBzciA9IE1hdGguc2luKHJhZGl1cyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGZyb20sIHRvLCBkaXJlY3Rpb24sIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgc3RlcCA9IGRpcmVjdGlvbiAqIHByZWNpc2lvbjtcbiAgICAgIGlmIChmcm9tICE9IG51bGwpIHtcbiAgICAgICAgZnJvbSA9IGQzX2dlb19jaXJjbGVBbmdsZShjciwgZnJvbSk7XG4gICAgICAgIHRvID0gZDNfZ2VvX2NpcmNsZUFuZ2xlKGNyLCB0byk7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPiAwID8gZnJvbSA8IHRvIDogZnJvbSA+IHRvKSBmcm9tICs9IGRpcmVjdGlvbiAqIM+EO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZnJvbSA9IHJhZGl1cyArIGRpcmVjdGlvbiAqIM+EO1xuICAgICAgICB0byA9IHJhZGl1cyAtIC41ICogc3RlcDtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIHBvaW50LCB0ID0gZnJvbTsgZGlyZWN0aW9uID4gMCA/IHQgPiB0byA6IHQgPCB0bzsgdCAtPSBzdGVwKSB7XG4gICAgICAgIGxpc3RlbmVyLnBvaW50KChwb2ludCA9IGQzX2dlb19zcGhlcmljYWwoWyBjciwgLXNyICogTWF0aC5jb3ModCksIC1zciAqIE1hdGguc2luKHQpIF0pKVswXSwgcG9pbnRbMV0pO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2NpcmNsZUFuZ2xlKGNyLCBwb2ludCkge1xuICAgIHZhciBhID0gZDNfZ2VvX2NhcnRlc2lhbihwb2ludCk7XG4gICAgYVswXSAtPSBjcjtcbiAgICBkM19nZW9fY2FydGVzaWFuTm9ybWFsaXplKGEpO1xuICAgIHZhciBhbmdsZSA9IGQzX2Fjb3MoLWFbMV0pO1xuICAgIHJldHVybiAoKC1hWzJdIDwgMCA/IC1hbmdsZSA6IGFuZ2xlKSArIDIgKiBNYXRoLlBJIC0gzrUpICUgKDIgKiBNYXRoLlBJKTtcbiAgfVxuICBkMy5nZW8uZGlzdGFuY2UgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIM6UzrsgPSAoYlswXSAtIGFbMF0pICogZDNfcmFkaWFucywgz4YwID0gYVsxXSAqIGQzX3JhZGlhbnMsIM+GMSA9IGJbMV0gKiBkM19yYWRpYW5zLCBzaW7OlM67ID0gTWF0aC5zaW4ozpTOuyksIGNvc86UzrsgPSBNYXRoLmNvcyjOlM67KSwgc2luz4YwID0gTWF0aC5zaW4oz4YwKSwgY29zz4YwID0gTWF0aC5jb3Moz4YwKSwgc2luz4YxID0gTWF0aC5zaW4oz4YxKSwgY29zz4YxID0gTWF0aC5jb3Moz4YxKSwgdDtcbiAgICByZXR1cm4gTWF0aC5hdGFuMihNYXRoLnNxcnQoKHQgPSBjb3PPhjEgKiBzaW7OlM67KSAqIHQgKyAodCA9IGNvc8+GMCAqIHNpbs+GMSAtIHNpbs+GMCAqIGNvc8+GMSAqIGNvc86UzrspICogdCksIHNpbs+GMCAqIHNpbs+GMSArIGNvc8+GMCAqIGNvc8+GMSAqIGNvc86UzrspO1xuICB9O1xuICBkMy5nZW8uZ3JhdGljdWxlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHgxLCB4MCwgWDEsIFgwLCB5MSwgeTAsIFkxLCBZMCwgZHggPSAxMCwgZHkgPSBkeCwgRFggPSA5MCwgRFkgPSAzNjAsIHgsIHksIFgsIFksIHByZWNpc2lvbiA9IDIuNTtcbiAgICBmdW5jdGlvbiBncmF0aWN1bGUoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcIk11bHRpTGluZVN0cmluZ1wiLFxuICAgICAgICBjb29yZGluYXRlczogbGluZXMoKVxuICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbGluZXMoKSB7XG4gICAgICByZXR1cm4gZDMucmFuZ2UoTWF0aC5jZWlsKFgwIC8gRFgpICogRFgsIFgxLCBEWCkubWFwKFgpLmNvbmNhdChkMy5yYW5nZShNYXRoLmNlaWwoWTAgLyBEWSkgKiBEWSwgWTEsIERZKS5tYXAoWSkpLmNvbmNhdChkMy5yYW5nZShNYXRoLmNlaWwoeDAgLyBkeCkgKiBkeCwgeDEsIGR4KS5maWx0ZXIoZnVuY3Rpb24oeCkge1xuICAgICAgICByZXR1cm4gYWJzKHggJSBEWCkgPiDOtTtcbiAgICAgIH0pLm1hcCh4KSkuY29uY2F0KGQzLnJhbmdlKE1hdGguY2VpbCh5MCAvIGR5KSAqIGR5LCB5MSwgZHkpLmZpbHRlcihmdW5jdGlvbih5KSB7XG4gICAgICAgIHJldHVybiBhYnMoeSAlIERZKSA+IM61O1xuICAgICAgfSkubWFwKHkpKTtcbiAgICB9XG4gICAgZ3JhdGljdWxlLmxpbmVzID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gbGluZXMoKS5tYXAoZnVuY3Rpb24oY29vcmRpbmF0ZXMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiBcIkxpbmVTdHJpbmdcIixcbiAgICAgICAgICBjb29yZGluYXRlczogY29vcmRpbmF0ZXNcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgZ3JhdGljdWxlLm91dGxpbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiUG9seWdvblwiLFxuICAgICAgICBjb29yZGluYXRlczogWyBYKFgwKS5jb25jYXQoWShZMSkuc2xpY2UoMSksIFgoWDEpLnJldmVyc2UoKS5zbGljZSgxKSwgWShZMCkucmV2ZXJzZSgpLnNsaWNlKDEpKSBdXG4gICAgICB9O1xuICAgIH07XG4gICAgZ3JhdGljdWxlLmV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGdyYXRpY3VsZS5taW5vckV4dGVudCgpO1xuICAgICAgcmV0dXJuIGdyYXRpY3VsZS5tYWpvckV4dGVudChfKS5taW5vckV4dGVudChfKTtcbiAgICB9O1xuICAgIGdyYXRpY3VsZS5tYWpvckV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgWyBYMCwgWTAgXSwgWyBYMSwgWTEgXSBdO1xuICAgICAgWDAgPSArX1swXVswXSwgWDEgPSArX1sxXVswXTtcbiAgICAgIFkwID0gK19bMF1bMV0sIFkxID0gK19bMV1bMV07XG4gICAgICBpZiAoWDAgPiBYMSkgXyA9IFgwLCBYMCA9IFgxLCBYMSA9IF87XG4gICAgICBpZiAoWTAgPiBZMSkgXyA9IFkwLCBZMCA9IFkxLCBZMSA9IF87XG4gICAgICByZXR1cm4gZ3JhdGljdWxlLnByZWNpc2lvbihwcmVjaXNpb24pO1xuICAgIH07XG4gICAgZ3JhdGljdWxlLm1pbm9yRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gWyBbIHgwLCB5MCBdLCBbIHgxLCB5MSBdIF07XG4gICAgICB4MCA9ICtfWzBdWzBdLCB4MSA9ICtfWzFdWzBdO1xuICAgICAgeTAgPSArX1swXVsxXSwgeTEgPSArX1sxXVsxXTtcbiAgICAgIGlmICh4MCA+IHgxKSBfID0geDAsIHgwID0geDEsIHgxID0gXztcbiAgICAgIGlmICh5MCA+IHkxKSBfID0geTAsIHkwID0geTEsIHkxID0gXztcbiAgICAgIHJldHVybiBncmF0aWN1bGUucHJlY2lzaW9uKHByZWNpc2lvbik7XG4gICAgfTtcbiAgICBncmF0aWN1bGUuc3RlcCA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGdyYXRpY3VsZS5taW5vclN0ZXAoKTtcbiAgICAgIHJldHVybiBncmF0aWN1bGUubWFqb3JTdGVwKF8pLm1pbm9yU3RlcChfKTtcbiAgICB9O1xuICAgIGdyYXRpY3VsZS5tYWpvclN0ZXAgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbIERYLCBEWSBdO1xuICAgICAgRFggPSArX1swXSwgRFkgPSArX1sxXTtcbiAgICAgIHJldHVybiBncmF0aWN1bGU7XG4gICAgfTtcbiAgICBncmF0aWN1bGUubWlub3JTdGVwID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gWyBkeCwgZHkgXTtcbiAgICAgIGR4ID0gK19bMF0sIGR5ID0gK19bMV07XG4gICAgICByZXR1cm4gZ3JhdGljdWxlO1xuICAgIH07XG4gICAgZ3JhdGljdWxlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHByZWNpc2lvbjtcbiAgICAgIHByZWNpc2lvbiA9ICtfO1xuICAgICAgeCA9IGQzX2dlb19ncmF0aWN1bGVYKHkwLCB5MSwgOTApO1xuICAgICAgeSA9IGQzX2dlb19ncmF0aWN1bGVZKHgwLCB4MSwgcHJlY2lzaW9uKTtcbiAgICAgIFggPSBkM19nZW9fZ3JhdGljdWxlWChZMCwgWTEsIDkwKTtcbiAgICAgIFkgPSBkM19nZW9fZ3JhdGljdWxlWShYMCwgWDEsIHByZWNpc2lvbik7XG4gICAgICByZXR1cm4gZ3JhdGljdWxlO1xuICAgIH07XG4gICAgcmV0dXJuIGdyYXRpY3VsZS5tYWpvckV4dGVudChbIFsgLTE4MCwgLTkwICsgzrUgXSwgWyAxODAsIDkwIC0gzrUgXSBdKS5taW5vckV4dGVudChbIFsgLTE4MCwgLTgwIC0gzrUgXSwgWyAxODAsIDgwICsgzrUgXSBdKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfZ2VvX2dyYXRpY3VsZVgoeTAsIHkxLCBkeSkge1xuICAgIHZhciB5ID0gZDMucmFuZ2UoeTAsIHkxIC0gzrUsIGR5KS5jb25jYXQoeTEpO1xuICAgIHJldHVybiBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4geS5tYXAoZnVuY3Rpb24oeSkge1xuICAgICAgICByZXR1cm4gWyB4LCB5IF07XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19ncmF0aWN1bGVZKHgwLCB4MSwgZHgpIHtcbiAgICB2YXIgeCA9IGQzLnJhbmdlKHgwLCB4MSAtIM61LCBkeCkuY29uY2F0KHgxKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oeSkge1xuICAgICAgcmV0dXJuIHgubWFwKGZ1bmN0aW9uKHgpIHtcbiAgICAgICAgcmV0dXJuIFsgeCwgeSBdO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkM19zb3VyY2UoZCkge1xuICAgIHJldHVybiBkLnNvdXJjZTtcbiAgfVxuICBmdW5jdGlvbiBkM190YXJnZXQoZCkge1xuICAgIHJldHVybiBkLnRhcmdldDtcbiAgfVxuICBkMy5nZW8uZ3JlYXRBcmMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc291cmNlID0gZDNfc291cmNlLCBzb3VyY2VfLCB0YXJnZXQgPSBkM190YXJnZXQsIHRhcmdldF87XG4gICAgZnVuY3Rpb24gZ3JlYXRBcmMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcIkxpbmVTdHJpbmdcIixcbiAgICAgICAgY29vcmRpbmF0ZXM6IFsgc291cmNlXyB8fCBzb3VyY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdGFyZ2V0XyB8fCB0YXJnZXQuYXBwbHkodGhpcywgYXJndW1lbnRzKSBdXG4gICAgICB9O1xuICAgIH1cbiAgICBncmVhdEFyYy5kaXN0YW5jZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGQzLmdlby5kaXN0YW5jZShzb3VyY2VfIHx8IHNvdXJjZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0YXJnZXRfIHx8IHRhcmdldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgICB9O1xuICAgIGdyZWF0QXJjLnNvdXJjZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvdXJjZTtcbiAgICAgIHNvdXJjZSA9IF8sIHNvdXJjZV8gPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gbnVsbCA6IF87XG4gICAgICByZXR1cm4gZ3JlYXRBcmM7XG4gICAgfTtcbiAgICBncmVhdEFyYy50YXJnZXQgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0YXJnZXQ7XG4gICAgICB0YXJnZXQgPSBfLCB0YXJnZXRfID0gdHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIiA/IG51bGwgOiBfO1xuICAgICAgcmV0dXJuIGdyZWF0QXJjO1xuICAgIH07XG4gICAgZ3JlYXRBcmMucHJlY2lzaW9uID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IGdyZWF0QXJjIDogMDtcbiAgICB9O1xuICAgIHJldHVybiBncmVhdEFyYztcbiAgfTtcbiAgZDMuZ2VvLmludGVycG9sYXRlID0gZnVuY3Rpb24oc291cmNlLCB0YXJnZXQpIHtcbiAgICByZXR1cm4gZDNfZ2VvX2ludGVycG9sYXRlKHNvdXJjZVswXSAqIGQzX3JhZGlhbnMsIHNvdXJjZVsxXSAqIGQzX3JhZGlhbnMsIHRhcmdldFswXSAqIGQzX3JhZGlhbnMsIHRhcmdldFsxXSAqIGQzX3JhZGlhbnMpO1xuICB9O1xuICBmdW5jdGlvbiBkM19nZW9faW50ZXJwb2xhdGUoeDAsIHkwLCB4MSwgeTEpIHtcbiAgICB2YXIgY3kwID0gTWF0aC5jb3MoeTApLCBzeTAgPSBNYXRoLnNpbih5MCksIGN5MSA9IE1hdGguY29zKHkxKSwgc3kxID0gTWF0aC5zaW4oeTEpLCBreDAgPSBjeTAgKiBNYXRoLmNvcyh4MCksIGt5MCA9IGN5MCAqIE1hdGguc2luKHgwKSwga3gxID0gY3kxICogTWF0aC5jb3MoeDEpLCBreTEgPSBjeTEgKiBNYXRoLnNpbih4MSksIGQgPSAyICogTWF0aC5hc2luKE1hdGguc3FydChkM19oYXZlcnNpbih5MSAtIHkwKSArIGN5MCAqIGN5MSAqIGQzX2hhdmVyc2luKHgxIC0geDApKSksIGsgPSAxIC8gTWF0aC5zaW4oZCk7XG4gICAgdmFyIGludGVycG9sYXRlID0gZCA/IGZ1bmN0aW9uKHQpIHtcbiAgICAgIHZhciBCID0gTWF0aC5zaW4odCAqPSBkKSAqIGssIEEgPSBNYXRoLnNpbihkIC0gdCkgKiBrLCB4ID0gQSAqIGt4MCArIEIgKiBreDEsIHkgPSBBICoga3kwICsgQiAqIGt5MSwgeiA9IEEgKiBzeTAgKyBCICogc3kxO1xuICAgICAgcmV0dXJuIFsgTWF0aC5hdGFuMih5LCB4KSAqIGQzX2RlZ3JlZXMsIE1hdGguYXRhbjIoeiwgTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpKSAqIGQzX2RlZ3JlZXMgXTtcbiAgICB9IDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gWyB4MCAqIGQzX2RlZ3JlZXMsIHkwICogZDNfZGVncmVlcyBdO1xuICAgIH07XG4gICAgaW50ZXJwb2xhdGUuZGlzdGFuY2UgPSBkO1xuICAgIHJldHVybiBpbnRlcnBvbGF0ZTtcbiAgfVxuICBkMy5nZW8ubGVuZ3RoID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgZDNfZ2VvX2xlbmd0aFN1bSA9IDA7XG4gICAgZDMuZ2VvLnN0cmVhbShvYmplY3QsIGQzX2dlb19sZW5ndGgpO1xuICAgIHJldHVybiBkM19nZW9fbGVuZ3RoU3VtO1xuICB9O1xuICB2YXIgZDNfZ2VvX2xlbmd0aFN1bTtcbiAgdmFyIGQzX2dlb19sZW5ndGggPSB7XG4gICAgc3BoZXJlOiBkM19ub29wLFxuICAgIHBvaW50OiBkM19ub29wLFxuICAgIGxpbmVTdGFydDogZDNfZ2VvX2xlbmd0aExpbmVTdGFydCxcbiAgICBsaW5lRW5kOiBkM19ub29wLFxuICAgIHBvbHlnb25TdGFydDogZDNfbm9vcCxcbiAgICBwb2x5Z29uRW5kOiBkM19ub29wXG4gIH07XG4gIGZ1bmN0aW9uIGQzX2dlb19sZW5ndGhMaW5lU3RhcnQoKSB7XG4gICAgdmFyIM67MCwgc2luz4YwLCBjb3PPhjA7XG4gICAgZDNfZ2VvX2xlbmd0aC5wb2ludCA9IGZ1bmN0aW9uKM67LCDPhikge1xuICAgICAgzrswID0gzrsgKiBkM19yYWRpYW5zLCBzaW7PhjAgPSBNYXRoLnNpbijPhiAqPSBkM19yYWRpYW5zKSwgY29zz4YwID0gTWF0aC5jb3Moz4YpO1xuICAgICAgZDNfZ2VvX2xlbmd0aC5wb2ludCA9IG5leHRQb2ludDtcbiAgICB9O1xuICAgIGQzX2dlb19sZW5ndGgubGluZUVuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgZDNfZ2VvX2xlbmd0aC5wb2ludCA9IGQzX2dlb19sZW5ndGgubGluZUVuZCA9IGQzX25vb3A7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBuZXh0UG9pbnQozrssIM+GKSB7XG4gICAgICB2YXIgc2luz4YgPSBNYXRoLnNpbijPhiAqPSBkM19yYWRpYW5zKSwgY29zz4YgPSBNYXRoLmNvcyjPhiksIHQgPSBhYnMoKM67ICo9IGQzX3JhZGlhbnMpIC0gzrswKSwgY29zzpTOuyA9IE1hdGguY29zKHQpO1xuICAgICAgZDNfZ2VvX2xlbmd0aFN1bSArPSBNYXRoLmF0YW4yKE1hdGguc3FydCgodCA9IGNvc8+GICogTWF0aC5zaW4odCkpICogdCArICh0ID0gY29zz4YwICogc2luz4YgLSBzaW7PhjAgKiBjb3PPhiAqIGNvc86UzrspICogdCksIHNpbs+GMCAqIHNpbs+GICsgY29zz4YwICogY29zz4YgKiBjb3POlM67KTtcbiAgICAgIM67MCA9IM67LCBzaW7PhjAgPSBzaW7PhiwgY29zz4YwID0gY29zz4Y7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19hemltdXRoYWwoc2NhbGUsIGFuZ2xlKSB7XG4gICAgZnVuY3Rpb24gYXppbXV0aGFsKM67LCDPhikge1xuICAgICAgdmFyIGNvc867ID0gTWF0aC5jb3MozrspLCBjb3PPhiA9IE1hdGguY29zKM+GKSwgayA9IHNjYWxlKGNvc867ICogY29zz4YpO1xuICAgICAgcmV0dXJuIFsgayAqIGNvc8+GICogTWF0aC5zaW4ozrspLCBrICogTWF0aC5zaW4oz4YpIF07XG4gICAgfVxuICAgIGF6aW11dGhhbC5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgICB2YXIgz4EgPSBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSksIGMgPSBhbmdsZSjPgSksIHNpbmMgPSBNYXRoLnNpbihjKSwgY29zYyA9IE1hdGguY29zKGMpO1xuICAgICAgcmV0dXJuIFsgTWF0aC5hdGFuMih4ICogc2luYywgz4EgKiBjb3NjKSwgTWF0aC5hc2luKM+BICYmIHkgKiBzaW5jIC8gz4EpIF07XG4gICAgfTtcbiAgICByZXR1cm4gYXppbXV0aGFsO1xuICB9XG4gIHZhciBkM19nZW9fYXppbXV0aGFsRXF1YWxBcmVhID0gZDNfZ2VvX2F6aW11dGhhbChmdW5jdGlvbihjb3POu2Nvc8+GKSB7XG4gICAgcmV0dXJuIE1hdGguc3FydCgyIC8gKDEgKyBjb3POu2Nvc8+GKSk7XG4gIH0sIGZ1bmN0aW9uKM+BKSB7XG4gICAgcmV0dXJuIDIgKiBNYXRoLmFzaW4oz4EgLyAyKTtcbiAgfSk7XG4gIChkMy5nZW8uYXppbXV0aGFsRXF1YWxBcmVhID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzX2dlb19wcm9qZWN0aW9uKGQzX2dlb19hemltdXRoYWxFcXVhbEFyZWEpO1xuICB9KS5yYXcgPSBkM19nZW9fYXppbXV0aGFsRXF1YWxBcmVhO1xuICB2YXIgZDNfZ2VvX2F6aW11dGhhbEVxdWlkaXN0YW50ID0gZDNfZ2VvX2F6aW11dGhhbChmdW5jdGlvbihjb3POu2Nvc8+GKSB7XG4gICAgdmFyIGMgPSBNYXRoLmFjb3MoY29zzrtjb3PPhik7XG4gICAgcmV0dXJuIGMgJiYgYyAvIE1hdGguc2luKGMpO1xuICB9LCBkM19pZGVudGl0eSk7XG4gIChkMy5nZW8uYXppbXV0aGFsRXF1aWRpc3RhbnQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDNfZ2VvX3Byb2plY3Rpb24oZDNfZ2VvX2F6aW11dGhhbEVxdWlkaXN0YW50KTtcbiAgfSkucmF3ID0gZDNfZ2VvX2F6aW11dGhhbEVxdWlkaXN0YW50O1xuICBmdW5jdGlvbiBkM19nZW9fY29uaWNDb25mb3JtYWwoz4YwLCDPhjEpIHtcbiAgICB2YXIgY29zz4YwID0gTWF0aC5jb3Moz4YwKSwgdCA9IGZ1bmN0aW9uKM+GKSB7XG4gICAgICByZXR1cm4gTWF0aC50YW4oz4AgLyA0ICsgz4YgLyAyKTtcbiAgICB9LCBuID0gz4YwID09PSDPhjEgPyBNYXRoLnNpbijPhjApIDogTWF0aC5sb2coY29zz4YwIC8gTWF0aC5jb3Moz4YxKSkgLyBNYXRoLmxvZyh0KM+GMSkgLyB0KM+GMCkpLCBGID0gY29zz4YwICogTWF0aC5wb3codCjPhjApLCBuKSAvIG47XG4gICAgaWYgKCFuKSByZXR1cm4gZDNfZ2VvX21lcmNhdG9yO1xuICAgIGZ1bmN0aW9uIGZvcndhcmQozrssIM+GKSB7XG4gICAgICBpZiAoRiA+IDApIHtcbiAgICAgICAgaWYgKM+GIDwgLWhhbGbPgCArIM61KSDPhiA9IC1oYWxmz4AgKyDOtTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICjPhiA+IGhhbGbPgCAtIM61KSDPhiA9IGhhbGbPgCAtIM61O1xuICAgICAgfVxuICAgICAgdmFyIM+BID0gRiAvIE1hdGgucG93KHQoz4YpLCBuKTtcbiAgICAgIHJldHVybiBbIM+BICogTWF0aC5zaW4obiAqIM67KSwgRiAtIM+BICogTWF0aC5jb3MobiAqIM67KSBdO1xuICAgIH1cbiAgICBmb3J3YXJkLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgIHZhciDPgTBfeSA9IEYgLSB5LCDPgSA9IGQzX3NnbihuKSAqIE1hdGguc3FydCh4ICogeCArIM+BMF95ICogz4EwX3kpO1xuICAgICAgcmV0dXJuIFsgTWF0aC5hdGFuMih4LCDPgTBfeSkgLyBuLCAyICogTWF0aC5hdGFuKE1hdGgucG93KEYgLyDPgSwgMSAvIG4pKSAtIGhhbGbPgCBdO1xuICAgIH07XG4gICAgcmV0dXJuIGZvcndhcmQ7XG4gIH1cbiAgKGQzLmdlby5jb25pY0NvbmZvcm1hbCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19nZW9fY29uaWMoZDNfZ2VvX2NvbmljQ29uZm9ybWFsKTtcbiAgfSkucmF3ID0gZDNfZ2VvX2NvbmljQ29uZm9ybWFsO1xuICBmdW5jdGlvbiBkM19nZW9fY29uaWNFcXVpZGlzdGFudCjPhjAsIM+GMSkge1xuICAgIHZhciBjb3PPhjAgPSBNYXRoLmNvcyjPhjApLCBuID0gz4YwID09PSDPhjEgPyBNYXRoLnNpbijPhjApIDogKGNvc8+GMCAtIE1hdGguY29zKM+GMSkpIC8gKM+GMSAtIM+GMCksIEcgPSBjb3PPhjAgLyBuICsgz4YwO1xuICAgIGlmIChhYnMobikgPCDOtSkgcmV0dXJuIGQzX2dlb19lcXVpcmVjdGFuZ3VsYXI7XG4gICAgZnVuY3Rpb24gZm9yd2FyZCjOuywgz4YpIHtcbiAgICAgIHZhciDPgSA9IEcgLSDPhjtcbiAgICAgIHJldHVybiBbIM+BICogTWF0aC5zaW4obiAqIM67KSwgRyAtIM+BICogTWF0aC5jb3MobiAqIM67KSBdO1xuICAgIH1cbiAgICBmb3J3YXJkLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgIHZhciDPgTBfeSA9IEcgLSB5O1xuICAgICAgcmV0dXJuIFsgTWF0aC5hdGFuMih4LCDPgTBfeSkgLyBuLCBHIC0gZDNfc2duKG4pICogTWF0aC5zcXJ0KHggKiB4ICsgz4EwX3kgKiDPgTBfeSkgXTtcbiAgICB9O1xuICAgIHJldHVybiBmb3J3YXJkO1xuICB9XG4gIChkMy5nZW8uY29uaWNFcXVpZGlzdGFudCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19nZW9fY29uaWMoZDNfZ2VvX2NvbmljRXF1aWRpc3RhbnQpO1xuICB9KS5yYXcgPSBkM19nZW9fY29uaWNFcXVpZGlzdGFudDtcbiAgdmFyIGQzX2dlb19nbm9tb25pYyA9IGQzX2dlb19hemltdXRoYWwoZnVuY3Rpb24oY29zzrtjb3PPhikge1xuICAgIHJldHVybiAxIC8gY29zzrtjb3PPhjtcbiAgfSwgTWF0aC5hdGFuKTtcbiAgKGQzLmdlby5nbm9tb25pYyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19nZW9fcHJvamVjdGlvbihkM19nZW9fZ25vbW9uaWMpO1xuICB9KS5yYXcgPSBkM19nZW9fZ25vbW9uaWM7XG4gIGZ1bmN0aW9uIGQzX2dlb19tZXJjYXRvcijOuywgz4YpIHtcbiAgICByZXR1cm4gWyDOuywgTWF0aC5sb2coTWF0aC50YW4oz4AgLyA0ICsgz4YgLyAyKSkgXTtcbiAgfVxuICBkM19nZW9fbWVyY2F0b3IuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkge1xuICAgIHJldHVybiBbIHgsIDIgKiBNYXRoLmF0YW4oTWF0aC5leHAoeSkpIC0gaGFsZs+AIF07XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2dlb19tZXJjYXRvclByb2plY3Rpb24ocHJvamVjdCkge1xuICAgIHZhciBtID0gZDNfZ2VvX3Byb2plY3Rpb24ocHJvamVjdCksIHNjYWxlID0gbS5zY2FsZSwgdHJhbnNsYXRlID0gbS50cmFuc2xhdGUsIGNsaXBFeHRlbnQgPSBtLmNsaXBFeHRlbnQsIGNsaXBBdXRvO1xuICAgIG0uc2NhbGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB2ID0gc2NhbGUuYXBwbHkobSwgYXJndW1lbnRzKTtcbiAgICAgIHJldHVybiB2ID09PSBtID8gY2xpcEF1dG8gPyBtLmNsaXBFeHRlbnQobnVsbCkgOiBtIDogdjtcbiAgICB9O1xuICAgIG0udHJhbnNsYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdiA9IHRyYW5zbGF0ZS5hcHBseShtLCBhcmd1bWVudHMpO1xuICAgICAgcmV0dXJuIHYgPT09IG0gPyBjbGlwQXV0byA/IG0uY2xpcEV4dGVudChudWxsKSA6IG0gOiB2O1xuICAgIH07XG4gICAgbS5jbGlwRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgICAgdmFyIHYgPSBjbGlwRXh0ZW50LmFwcGx5KG0sIGFyZ3VtZW50cyk7XG4gICAgICBpZiAodiA9PT0gbSkge1xuICAgICAgICBpZiAoY2xpcEF1dG8gPSBfID09IG51bGwpIHtcbiAgICAgICAgICB2YXIgayA9IM+AICogc2NhbGUoKSwgdCA9IHRyYW5zbGF0ZSgpO1xuICAgICAgICAgIGNsaXBFeHRlbnQoWyBbIHRbMF0gLSBrLCB0WzFdIC0gayBdLCBbIHRbMF0gKyBrLCB0WzFdICsgayBdIF0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNsaXBBdXRvKSB7XG4gICAgICAgIHYgPSBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHY7XG4gICAgfTtcbiAgICByZXR1cm4gbS5jbGlwRXh0ZW50KG51bGwpO1xuICB9XG4gIChkMy5nZW8ubWVyY2F0b3IgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDNfZ2VvX21lcmNhdG9yUHJvamVjdGlvbihkM19nZW9fbWVyY2F0b3IpO1xuICB9KS5yYXcgPSBkM19nZW9fbWVyY2F0b3I7XG4gIHZhciBkM19nZW9fb3J0aG9ncmFwaGljID0gZDNfZ2VvX2F6aW11dGhhbChmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gMTtcbiAgfSwgTWF0aC5hc2luKTtcbiAgKGQzLmdlby5vcnRob2dyYXBoaWMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDNfZ2VvX3Byb2plY3Rpb24oZDNfZ2VvX29ydGhvZ3JhcGhpYyk7XG4gIH0pLnJhdyA9IGQzX2dlb19vcnRob2dyYXBoaWM7XG4gIHZhciBkM19nZW9fc3RlcmVvZ3JhcGhpYyA9IGQzX2dlb19hemltdXRoYWwoZnVuY3Rpb24oY29zzrtjb3PPhikge1xuICAgIHJldHVybiAxIC8gKDEgKyBjb3POu2Nvc8+GKTtcbiAgfSwgZnVuY3Rpb24oz4EpIHtcbiAgICByZXR1cm4gMiAqIE1hdGguYXRhbijPgSk7XG4gIH0pO1xuICAoZDMuZ2VvLnN0ZXJlb2dyYXBoaWMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDNfZ2VvX3Byb2plY3Rpb24oZDNfZ2VvX3N0ZXJlb2dyYXBoaWMpO1xuICB9KS5yYXcgPSBkM19nZW9fc3RlcmVvZ3JhcGhpYztcbiAgZnVuY3Rpb24gZDNfZ2VvX3RyYW5zdmVyc2VNZXJjYXRvcijOuywgz4YpIHtcbiAgICByZXR1cm4gWyBNYXRoLmxvZyhNYXRoLnRhbijPgCAvIDQgKyDPhiAvIDIpKSwgLc67IF07XG4gIH1cbiAgZDNfZ2VvX3RyYW5zdmVyc2VNZXJjYXRvci5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgcmV0dXJuIFsgLXksIDIgKiBNYXRoLmF0YW4oTWF0aC5leHAoeCkpIC0gaGFsZs+AIF07XG4gIH07XG4gIChkMy5nZW8udHJhbnN2ZXJzZU1lcmNhdG9yID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHByb2plY3Rpb24gPSBkM19nZW9fbWVyY2F0b3JQcm9qZWN0aW9uKGQzX2dlb190cmFuc3ZlcnNlTWVyY2F0b3IpLCBjZW50ZXIgPSBwcm9qZWN0aW9uLmNlbnRlciwgcm90YXRlID0gcHJvamVjdGlvbi5yb3RhdGU7XG4gICAgcHJvamVjdGlvbi5jZW50ZXIgPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gXyA/IGNlbnRlcihbIC1fWzFdLCBfWzBdIF0pIDogKF8gPSBjZW50ZXIoKSwgWyBfWzFdLCAtX1swXSBdKTtcbiAgICB9O1xuICAgIHByb2plY3Rpb24ucm90YXRlID0gZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIF8gPyByb3RhdGUoWyBfWzBdLCBfWzFdLCBfLmxlbmd0aCA+IDIgPyBfWzJdICsgOTAgOiA5MCBdKSA6IChfID0gcm90YXRlKCksIFxuICAgICAgWyBfWzBdLCBfWzFdLCBfWzJdIC0gOTAgXSk7XG4gICAgfTtcbiAgICByZXR1cm4gcm90YXRlKFsgMCwgMCwgOTAgXSk7XG4gIH0pLnJhdyA9IGQzX2dlb190cmFuc3ZlcnNlTWVyY2F0b3I7XG4gIGQzLmdlb20gPSB7fTtcbiAgZnVuY3Rpb24gZDNfZ2VvbV9wb2ludFgoZCkge1xuICAgIHJldHVybiBkWzBdO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb21fcG9pbnRZKGQpIHtcbiAgICByZXR1cm4gZFsxXTtcbiAgfVxuICBkMy5nZW9tLmh1bGwgPSBmdW5jdGlvbih2ZXJ0aWNlcykge1xuICAgIHZhciB4ID0gZDNfZ2VvbV9wb2ludFgsIHkgPSBkM19nZW9tX3BvaW50WTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGh1bGwodmVydGljZXMpO1xuICAgIGZ1bmN0aW9uIGh1bGwoZGF0YSkge1xuICAgICAgaWYgKGRhdGEubGVuZ3RoIDwgMykgcmV0dXJuIFtdO1xuICAgICAgdmFyIGZ4ID0gZDNfZnVuY3Rvcih4KSwgZnkgPSBkM19mdW5jdG9yKHkpLCBpLCBuID0gZGF0YS5sZW5ndGgsIHBvaW50cyA9IFtdLCBmbGlwcGVkUG9pbnRzID0gW107XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIHBvaW50cy5wdXNoKFsgK2Z4LmNhbGwodGhpcywgZGF0YVtpXSwgaSksICtmeS5jYWxsKHRoaXMsIGRhdGFbaV0sIGkpLCBpIF0pO1xuICAgICAgfVxuICAgICAgcG9pbnRzLnNvcnQoZDNfZ2VvbV9odWxsT3JkZXIpO1xuICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgZmxpcHBlZFBvaW50cy5wdXNoKFsgcG9pbnRzW2ldWzBdLCAtcG9pbnRzW2ldWzFdIF0pO1xuICAgICAgdmFyIHVwcGVyID0gZDNfZ2VvbV9odWxsVXBwZXIocG9pbnRzKSwgbG93ZXIgPSBkM19nZW9tX2h1bGxVcHBlcihmbGlwcGVkUG9pbnRzKTtcbiAgICAgIHZhciBza2lwTGVmdCA9IGxvd2VyWzBdID09PSB1cHBlclswXSwgc2tpcFJpZ2h0ID0gbG93ZXJbbG93ZXIubGVuZ3RoIC0gMV0gPT09IHVwcGVyW3VwcGVyLmxlbmd0aCAtIDFdLCBwb2x5Z29uID0gW107XG4gICAgICBmb3IgKGkgPSB1cHBlci5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgcG9seWdvbi5wdXNoKGRhdGFbcG9pbnRzW3VwcGVyW2ldXVsyXV0pO1xuICAgICAgZm9yIChpID0gK3NraXBMZWZ0OyBpIDwgbG93ZXIubGVuZ3RoIC0gc2tpcFJpZ2h0OyArK2kpIHBvbHlnb24ucHVzaChkYXRhW3BvaW50c1tsb3dlcltpXV1bMl1dKTtcbiAgICAgIHJldHVybiBwb2x5Z29uO1xuICAgIH1cbiAgICBodWxsLnggPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gXywgaHVsbCkgOiB4O1xuICAgIH07XG4gICAgaHVsbC55ID0gZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9IF8sIGh1bGwpIDogeTtcbiAgICB9O1xuICAgIHJldHVybiBodWxsO1xuICB9O1xuICBmdW5jdGlvbiBkM19nZW9tX2h1bGxVcHBlcihwb2ludHMpIHtcbiAgICB2YXIgbiA9IHBvaW50cy5sZW5ndGgsIGh1bGwgPSBbIDAsIDEgXSwgaHMgPSAyO1xuICAgIGZvciAodmFyIGkgPSAyOyBpIDwgbjsgaSsrKSB7XG4gICAgICB3aGlsZSAoaHMgPiAxICYmIGQzX2Nyb3NzMmQocG9pbnRzW2h1bGxbaHMgLSAyXV0sIHBvaW50c1todWxsW2hzIC0gMV1dLCBwb2ludHNbaV0pIDw9IDApIC0taHM7XG4gICAgICBodWxsW2hzKytdID0gaTtcbiAgICB9XG4gICAgcmV0dXJuIGh1bGwuc2xpY2UoMCwgaHMpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb21faHVsbE9yZGVyKGEsIGIpIHtcbiAgICByZXR1cm4gYVswXSAtIGJbMF0gfHwgYVsxXSAtIGJbMV07XG4gIH1cbiAgZDMuZ2VvbS5wb2x5Z29uID0gZnVuY3Rpb24oY29vcmRpbmF0ZXMpIHtcbiAgICBkM19zdWJjbGFzcyhjb29yZGluYXRlcywgZDNfZ2VvbV9wb2x5Z29uUHJvdG90eXBlKTtcbiAgICByZXR1cm4gY29vcmRpbmF0ZXM7XG4gIH07XG4gIHZhciBkM19nZW9tX3BvbHlnb25Qcm90b3R5cGUgPSBkMy5nZW9tLnBvbHlnb24ucHJvdG90eXBlID0gW107XG4gIGQzX2dlb21fcG9seWdvblByb3RvdHlwZS5hcmVhID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGkgPSAtMSwgbiA9IHRoaXMubGVuZ3RoLCBhLCBiID0gdGhpc1tuIC0gMV0sIGFyZWEgPSAwO1xuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICBhID0gYjtcbiAgICAgIGIgPSB0aGlzW2ldO1xuICAgICAgYXJlYSArPSBhWzFdICogYlswXSAtIGFbMF0gKiBiWzFdO1xuICAgIH1cbiAgICByZXR1cm4gYXJlYSAqIC41O1xuICB9O1xuICBkM19nZW9tX3BvbHlnb25Qcm90b3R5cGUuY2VudHJvaWQgPSBmdW5jdGlvbihrKSB7XG4gICAgdmFyIGkgPSAtMSwgbiA9IHRoaXMubGVuZ3RoLCB4ID0gMCwgeSA9IDAsIGEsIGIgPSB0aGlzW24gLSAxXSwgYztcbiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIGsgPSAtMSAvICg2ICogdGhpcy5hcmVhKCkpO1xuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICBhID0gYjtcbiAgICAgIGIgPSB0aGlzW2ldO1xuICAgICAgYyA9IGFbMF0gKiBiWzFdIC0gYlswXSAqIGFbMV07XG4gICAgICB4ICs9IChhWzBdICsgYlswXSkgKiBjO1xuICAgICAgeSArPSAoYVsxXSArIGJbMV0pICogYztcbiAgICB9XG4gICAgcmV0dXJuIFsgeCAqIGssIHkgKiBrIF07XG4gIH07XG4gIGQzX2dlb21fcG9seWdvblByb3RvdHlwZS5jbGlwID0gZnVuY3Rpb24oc3ViamVjdCkge1xuICAgIHZhciBpbnB1dCwgY2xvc2VkID0gZDNfZ2VvbV9wb2x5Z29uQ2xvc2VkKHN1YmplY3QpLCBpID0gLTEsIG4gPSB0aGlzLmxlbmd0aCAtIGQzX2dlb21fcG9seWdvbkNsb3NlZCh0aGlzKSwgaiwgbSwgYSA9IHRoaXNbbiAtIDFdLCBiLCBjLCBkO1xuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICBpbnB1dCA9IHN1YmplY3Quc2xpY2UoKTtcbiAgICAgIHN1YmplY3QubGVuZ3RoID0gMDtcbiAgICAgIGIgPSB0aGlzW2ldO1xuICAgICAgYyA9IGlucHV0WyhtID0gaW5wdXQubGVuZ3RoIC0gY2xvc2VkKSAtIDFdO1xuICAgICAgaiA9IC0xO1xuICAgICAgd2hpbGUgKCsraiA8IG0pIHtcbiAgICAgICAgZCA9IGlucHV0W2pdO1xuICAgICAgICBpZiAoZDNfZ2VvbV9wb2x5Z29uSW5zaWRlKGQsIGEsIGIpKSB7XG4gICAgICAgICAgaWYgKCFkM19nZW9tX3BvbHlnb25JbnNpZGUoYywgYSwgYikpIHtcbiAgICAgICAgICAgIHN1YmplY3QucHVzaChkM19nZW9tX3BvbHlnb25JbnRlcnNlY3QoYywgZCwgYSwgYikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdWJqZWN0LnB1c2goZCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZDNfZ2VvbV9wb2x5Z29uSW5zaWRlKGMsIGEsIGIpKSB7XG4gICAgICAgICAgc3ViamVjdC5wdXNoKGQzX2dlb21fcG9seWdvbkludGVyc2VjdChjLCBkLCBhLCBiKSk7XG4gICAgICAgIH1cbiAgICAgICAgYyA9IGQ7XG4gICAgICB9XG4gICAgICBpZiAoY2xvc2VkKSBzdWJqZWN0LnB1c2goc3ViamVjdFswXSk7XG4gICAgICBhID0gYjtcbiAgICB9XG4gICAgcmV0dXJuIHN1YmplY3Q7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2dlb21fcG9seWdvbkluc2lkZShwLCBhLCBiKSB7XG4gICAgcmV0dXJuIChiWzBdIC0gYVswXSkgKiAocFsxXSAtIGFbMV0pIDwgKGJbMV0gLSBhWzFdKSAqIChwWzBdIC0gYVswXSk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV9wb2x5Z29uSW50ZXJzZWN0KGMsIGQsIGEsIGIpIHtcbiAgICB2YXIgeDEgPSBjWzBdLCB4MyA9IGFbMF0sIHgyMSA9IGRbMF0gLSB4MSwgeDQzID0gYlswXSAtIHgzLCB5MSA9IGNbMV0sIHkzID0gYVsxXSwgeTIxID0gZFsxXSAtIHkxLCB5NDMgPSBiWzFdIC0geTMsIHVhID0gKHg0MyAqICh5MSAtIHkzKSAtIHk0MyAqICh4MSAtIHgzKSkgLyAoeTQzICogeDIxIC0geDQzICogeTIxKTtcbiAgICByZXR1cm4gWyB4MSArIHVhICogeDIxLCB5MSArIHVhICogeTIxIF07XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV9wb2x5Z29uQ2xvc2VkKGNvb3JkaW5hdGVzKSB7XG4gICAgdmFyIGEgPSBjb29yZGluYXRlc1swXSwgYiA9IGNvb3JkaW5hdGVzW2Nvb3JkaW5hdGVzLmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiAhKGFbMF0gLSBiWzBdIHx8IGFbMV0gLSBiWzFdKTtcbiAgfVxuICB2YXIgZDNfZ2VvbV92b3Jvbm9pRWRnZXMsIGQzX2dlb21fdm9yb25vaUNlbGxzLCBkM19nZW9tX3Zvcm9ub2lCZWFjaGVzLCBkM19nZW9tX3Zvcm9ub2lCZWFjaFBvb2wgPSBbXSwgZDNfZ2VvbV92b3Jvbm9pRmlyc3RDaXJjbGUsIGQzX2dlb21fdm9yb25vaUNpcmNsZXMsIGQzX2dlb21fdm9yb25vaUNpcmNsZVBvb2wgPSBbXTtcbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pQmVhY2goKSB7XG4gICAgZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tOb2RlKHRoaXMpO1xuICAgIHRoaXMuZWRnZSA9IHRoaXMuc2l0ZSA9IHRoaXMuY2lyY2xlID0gbnVsbDtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lDcmVhdGVCZWFjaChzaXRlKSB7XG4gICAgdmFyIGJlYWNoID0gZDNfZ2VvbV92b3Jvbm9pQmVhY2hQb29sLnBvcCgpIHx8IG5ldyBkM19nZW9tX3Zvcm9ub2lCZWFjaCgpO1xuICAgIGJlYWNoLnNpdGUgPSBzaXRlO1xuICAgIHJldHVybiBiZWFjaDtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lEZXRhY2hCZWFjaChiZWFjaCkge1xuICAgIGQzX2dlb21fdm9yb25vaURldGFjaENpcmNsZShiZWFjaCk7XG4gICAgZDNfZ2VvbV92b3Jvbm9pQmVhY2hlcy5yZW1vdmUoYmVhY2gpO1xuICAgIGQzX2dlb21fdm9yb25vaUJlYWNoUG9vbC5wdXNoKGJlYWNoKTtcbiAgICBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja05vZGUoYmVhY2gpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaVJlbW92ZUJlYWNoKGJlYWNoKSB7XG4gICAgdmFyIGNpcmNsZSA9IGJlYWNoLmNpcmNsZSwgeCA9IGNpcmNsZS54LCB5ID0gY2lyY2xlLmN5LCB2ZXJ0ZXggPSB7XG4gICAgICB4OiB4LFxuICAgICAgeTogeVxuICAgIH0sIHByZXZpb3VzID0gYmVhY2guUCwgbmV4dCA9IGJlYWNoLk4sIGRpc2FwcGVhcmluZyA9IFsgYmVhY2ggXTtcbiAgICBkM19nZW9tX3Zvcm9ub2lEZXRhY2hCZWFjaChiZWFjaCk7XG4gICAgdmFyIGxBcmMgPSBwcmV2aW91cztcbiAgICB3aGlsZSAobEFyYy5jaXJjbGUgJiYgYWJzKHggLSBsQXJjLmNpcmNsZS54KSA8IM61ICYmIGFicyh5IC0gbEFyYy5jaXJjbGUuY3kpIDwgzrUpIHtcbiAgICAgIHByZXZpb3VzID0gbEFyYy5QO1xuICAgICAgZGlzYXBwZWFyaW5nLnVuc2hpZnQobEFyYyk7XG4gICAgICBkM19nZW9tX3Zvcm9ub2lEZXRhY2hCZWFjaChsQXJjKTtcbiAgICAgIGxBcmMgPSBwcmV2aW91cztcbiAgICB9XG4gICAgZGlzYXBwZWFyaW5nLnVuc2hpZnQobEFyYyk7XG4gICAgZDNfZ2VvbV92b3Jvbm9pRGV0YWNoQ2lyY2xlKGxBcmMpO1xuICAgIHZhciByQXJjID0gbmV4dDtcbiAgICB3aGlsZSAockFyYy5jaXJjbGUgJiYgYWJzKHggLSByQXJjLmNpcmNsZS54KSA8IM61ICYmIGFicyh5IC0gckFyYy5jaXJjbGUuY3kpIDwgzrUpIHtcbiAgICAgIG5leHQgPSByQXJjLk47XG4gICAgICBkaXNhcHBlYXJpbmcucHVzaChyQXJjKTtcbiAgICAgIGQzX2dlb21fdm9yb25vaURldGFjaEJlYWNoKHJBcmMpO1xuICAgICAgckFyYyA9IG5leHQ7XG4gICAgfVxuICAgIGRpc2FwcGVhcmluZy5wdXNoKHJBcmMpO1xuICAgIGQzX2dlb21fdm9yb25vaURldGFjaENpcmNsZShyQXJjKTtcbiAgICB2YXIgbkFyY3MgPSBkaXNhcHBlYXJpbmcubGVuZ3RoLCBpQXJjO1xuICAgIGZvciAoaUFyYyA9IDE7IGlBcmMgPCBuQXJjczsgKytpQXJjKSB7XG4gICAgICByQXJjID0gZGlzYXBwZWFyaW5nW2lBcmNdO1xuICAgICAgbEFyYyA9IGRpc2FwcGVhcmluZ1tpQXJjIC0gMV07XG4gICAgICBkM19nZW9tX3Zvcm9ub2lTZXRFZGdlRW5kKHJBcmMuZWRnZSwgbEFyYy5zaXRlLCByQXJjLnNpdGUsIHZlcnRleCk7XG4gICAgfVxuICAgIGxBcmMgPSBkaXNhcHBlYXJpbmdbMF07XG4gICAgckFyYyA9IGRpc2FwcGVhcmluZ1tuQXJjcyAtIDFdO1xuICAgIHJBcmMuZWRnZSA9IGQzX2dlb21fdm9yb25vaUNyZWF0ZUVkZ2UobEFyYy5zaXRlLCByQXJjLnNpdGUsIG51bGwsIHZlcnRleCk7XG4gICAgZDNfZ2VvbV92b3Jvbm9pQXR0YWNoQ2lyY2xlKGxBcmMpO1xuICAgIGQzX2dlb21fdm9yb25vaUF0dGFjaENpcmNsZShyQXJjKTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lBZGRCZWFjaChzaXRlKSB7XG4gICAgdmFyIHggPSBzaXRlLngsIGRpcmVjdHJpeCA9IHNpdGUueSwgbEFyYywgckFyYywgZHhsLCBkeHIsIG5vZGUgPSBkM19nZW9tX3Zvcm9ub2lCZWFjaGVzLl87XG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgIGR4bCA9IGQzX2dlb21fdm9yb25vaUxlZnRCcmVha1BvaW50KG5vZGUsIGRpcmVjdHJpeCkgLSB4O1xuICAgICAgaWYgKGR4bCA+IM61KSBub2RlID0gbm9kZS5MOyBlbHNlIHtcbiAgICAgICAgZHhyID0geCAtIGQzX2dlb21fdm9yb25vaVJpZ2h0QnJlYWtQb2ludChub2RlLCBkaXJlY3RyaXgpO1xuICAgICAgICBpZiAoZHhyID4gzrUpIHtcbiAgICAgICAgICBpZiAoIW5vZGUuUikge1xuICAgICAgICAgICAgbEFyYyA9IG5vZGU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZSA9IG5vZGUuUjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZHhsID4gLc61KSB7XG4gICAgICAgICAgICBsQXJjID0gbm9kZS5QO1xuICAgICAgICAgICAgckFyYyA9IG5vZGU7XG4gICAgICAgICAgfSBlbHNlIGlmIChkeHIgPiAtzrUpIHtcbiAgICAgICAgICAgIGxBcmMgPSBub2RlO1xuICAgICAgICAgICAgckFyYyA9IG5vZGUuTjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbEFyYyA9IHJBcmMgPSBub2RlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB2YXIgbmV3QXJjID0gZDNfZ2VvbV92b3Jvbm9pQ3JlYXRlQmVhY2goc2l0ZSk7XG4gICAgZDNfZ2VvbV92b3Jvbm9pQmVhY2hlcy5pbnNlcnQobEFyYywgbmV3QXJjKTtcbiAgICBpZiAoIWxBcmMgJiYgIXJBcmMpIHJldHVybjtcbiAgICBpZiAobEFyYyA9PT0gckFyYykge1xuICAgICAgZDNfZ2VvbV92b3Jvbm9pRGV0YWNoQ2lyY2xlKGxBcmMpO1xuICAgICAgckFyYyA9IGQzX2dlb21fdm9yb25vaUNyZWF0ZUJlYWNoKGxBcmMuc2l0ZSk7XG4gICAgICBkM19nZW9tX3Zvcm9ub2lCZWFjaGVzLmluc2VydChuZXdBcmMsIHJBcmMpO1xuICAgICAgbmV3QXJjLmVkZ2UgPSByQXJjLmVkZ2UgPSBkM19nZW9tX3Zvcm9ub2lDcmVhdGVFZGdlKGxBcmMuc2l0ZSwgbmV3QXJjLnNpdGUpO1xuICAgICAgZDNfZ2VvbV92b3Jvbm9pQXR0YWNoQ2lyY2xlKGxBcmMpO1xuICAgICAgZDNfZ2VvbV92b3Jvbm9pQXR0YWNoQ2lyY2xlKHJBcmMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXJBcmMpIHtcbiAgICAgIG5ld0FyYy5lZGdlID0gZDNfZ2VvbV92b3Jvbm9pQ3JlYXRlRWRnZShsQXJjLnNpdGUsIG5ld0FyYy5zaXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZDNfZ2VvbV92b3Jvbm9pRGV0YWNoQ2lyY2xlKGxBcmMpO1xuICAgIGQzX2dlb21fdm9yb25vaURldGFjaENpcmNsZShyQXJjKTtcbiAgICB2YXIgbFNpdGUgPSBsQXJjLnNpdGUsIGF4ID0gbFNpdGUueCwgYXkgPSBsU2l0ZS55LCBieCA9IHNpdGUueCAtIGF4LCBieSA9IHNpdGUueSAtIGF5LCByU2l0ZSA9IHJBcmMuc2l0ZSwgY3ggPSByU2l0ZS54IC0gYXgsIGN5ID0gclNpdGUueSAtIGF5LCBkID0gMiAqIChieCAqIGN5IC0gYnkgKiBjeCksIGhiID0gYnggKiBieCArIGJ5ICogYnksIGhjID0gY3ggKiBjeCArIGN5ICogY3ksIHZlcnRleCA9IHtcbiAgICAgIHg6IChjeSAqIGhiIC0gYnkgKiBoYykgLyBkICsgYXgsXG4gICAgICB5OiAoYnggKiBoYyAtIGN4ICogaGIpIC8gZCArIGF5XG4gICAgfTtcbiAgICBkM19nZW9tX3Zvcm9ub2lTZXRFZGdlRW5kKHJBcmMuZWRnZSwgbFNpdGUsIHJTaXRlLCB2ZXJ0ZXgpO1xuICAgIG5ld0FyYy5lZGdlID0gZDNfZ2VvbV92b3Jvbm9pQ3JlYXRlRWRnZShsU2l0ZSwgc2l0ZSwgbnVsbCwgdmVydGV4KTtcbiAgICByQXJjLmVkZ2UgPSBkM19nZW9tX3Zvcm9ub2lDcmVhdGVFZGdlKHNpdGUsIHJTaXRlLCBudWxsLCB2ZXJ0ZXgpO1xuICAgIGQzX2dlb21fdm9yb25vaUF0dGFjaENpcmNsZShsQXJjKTtcbiAgICBkM19nZW9tX3Zvcm9ub2lBdHRhY2hDaXJjbGUockFyYyk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pTGVmdEJyZWFrUG9pbnQoYXJjLCBkaXJlY3RyaXgpIHtcbiAgICB2YXIgc2l0ZSA9IGFyYy5zaXRlLCByZm9jeCA9IHNpdGUueCwgcmZvY3kgPSBzaXRlLnksIHBieTIgPSByZm9jeSAtIGRpcmVjdHJpeDtcbiAgICBpZiAoIXBieTIpIHJldHVybiByZm9jeDtcbiAgICB2YXIgbEFyYyA9IGFyYy5QO1xuICAgIGlmICghbEFyYykgcmV0dXJuIC1JbmZpbml0eTtcbiAgICBzaXRlID0gbEFyYy5zaXRlO1xuICAgIHZhciBsZm9jeCA9IHNpdGUueCwgbGZvY3kgPSBzaXRlLnksIHBsYnkyID0gbGZvY3kgLSBkaXJlY3RyaXg7XG4gICAgaWYgKCFwbGJ5MikgcmV0dXJuIGxmb2N4O1xuICAgIHZhciBobCA9IGxmb2N4IC0gcmZvY3gsIGFieTIgPSAxIC8gcGJ5MiAtIDEgLyBwbGJ5MiwgYiA9IGhsIC8gcGxieTI7XG4gICAgaWYgKGFieTIpIHJldHVybiAoLWIgKyBNYXRoLnNxcnQoYiAqIGIgLSAyICogYWJ5MiAqIChobCAqIGhsIC8gKC0yICogcGxieTIpIC0gbGZvY3kgKyBwbGJ5MiAvIDIgKyByZm9jeSAtIHBieTIgLyAyKSkpIC8gYWJ5MiArIHJmb2N4O1xuICAgIHJldHVybiAocmZvY3ggKyBsZm9jeCkgLyAyO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaVJpZ2h0QnJlYWtQb2ludChhcmMsIGRpcmVjdHJpeCkge1xuICAgIHZhciByQXJjID0gYXJjLk47XG4gICAgaWYgKHJBcmMpIHJldHVybiBkM19nZW9tX3Zvcm9ub2lMZWZ0QnJlYWtQb2ludChyQXJjLCBkaXJlY3RyaXgpO1xuICAgIHZhciBzaXRlID0gYXJjLnNpdGU7XG4gICAgcmV0dXJuIHNpdGUueSA9PT0gZGlyZWN0cml4ID8gc2l0ZS54IDogSW5maW5pdHk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pQ2VsbChzaXRlKSB7XG4gICAgdGhpcy5zaXRlID0gc2l0ZTtcbiAgICB0aGlzLmVkZ2VzID0gW107XG4gIH1cbiAgZDNfZ2VvbV92b3Jvbm9pQ2VsbC5wcm90b3R5cGUucHJlcGFyZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBoYWxmRWRnZXMgPSB0aGlzLmVkZ2VzLCBpSGFsZkVkZ2UgPSBoYWxmRWRnZXMubGVuZ3RoLCBlZGdlO1xuICAgIHdoaWxlIChpSGFsZkVkZ2UtLSkge1xuICAgICAgZWRnZSA9IGhhbGZFZGdlc1tpSGFsZkVkZ2VdLmVkZ2U7XG4gICAgICBpZiAoIWVkZ2UuYiB8fCAhZWRnZS5hKSBoYWxmRWRnZXMuc3BsaWNlKGlIYWxmRWRnZSwgMSk7XG4gICAgfVxuICAgIGhhbGZFZGdlcy5zb3J0KGQzX2dlb21fdm9yb25vaUhhbGZFZGdlT3JkZXIpO1xuICAgIHJldHVybiBoYWxmRWRnZXMubGVuZ3RoO1xuICB9O1xuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lDbG9zZUNlbGxzKGV4dGVudCkge1xuICAgIHZhciB4MCA9IGV4dGVudFswXVswXSwgeDEgPSBleHRlbnRbMV1bMF0sIHkwID0gZXh0ZW50WzBdWzFdLCB5MSA9IGV4dGVudFsxXVsxXSwgeDIsIHkyLCB4MywgeTMsIGNlbGxzID0gZDNfZ2VvbV92b3Jvbm9pQ2VsbHMsIGlDZWxsID0gY2VsbHMubGVuZ3RoLCBjZWxsLCBpSGFsZkVkZ2UsIGhhbGZFZGdlcywgbkhhbGZFZGdlcywgc3RhcnQsIGVuZDtcbiAgICB3aGlsZSAoaUNlbGwtLSkge1xuICAgICAgY2VsbCA9IGNlbGxzW2lDZWxsXTtcbiAgICAgIGlmICghY2VsbCB8fCAhY2VsbC5wcmVwYXJlKCkpIGNvbnRpbnVlO1xuICAgICAgaGFsZkVkZ2VzID0gY2VsbC5lZGdlcztcbiAgICAgIG5IYWxmRWRnZXMgPSBoYWxmRWRnZXMubGVuZ3RoO1xuICAgICAgaUhhbGZFZGdlID0gMDtcbiAgICAgIHdoaWxlIChpSGFsZkVkZ2UgPCBuSGFsZkVkZ2VzKSB7XG4gICAgICAgIGVuZCA9IGhhbGZFZGdlc1tpSGFsZkVkZ2VdLmVuZCgpLCB4MyA9IGVuZC54LCB5MyA9IGVuZC55O1xuICAgICAgICBzdGFydCA9IGhhbGZFZGdlc1srK2lIYWxmRWRnZSAlIG5IYWxmRWRnZXNdLnN0YXJ0KCksIHgyID0gc3RhcnQueCwgeTIgPSBzdGFydC55O1xuICAgICAgICBpZiAoYWJzKHgzIC0geDIpID4gzrUgfHwgYWJzKHkzIC0geTIpID4gzrUpIHtcbiAgICAgICAgICBoYWxmRWRnZXMuc3BsaWNlKGlIYWxmRWRnZSwgMCwgbmV3IGQzX2dlb21fdm9yb25vaUhhbGZFZGdlKGQzX2dlb21fdm9yb25vaUNyZWF0ZUJvcmRlckVkZ2UoY2VsbC5zaXRlLCBlbmQsIGFicyh4MyAtIHgwKSA8IM61ICYmIHkxIC0geTMgPiDOtSA/IHtcbiAgICAgICAgICAgIHg6IHgwLFxuICAgICAgICAgICAgeTogYWJzKHgyIC0geDApIDwgzrUgPyB5MiA6IHkxXG4gICAgICAgICAgfSA6IGFicyh5MyAtIHkxKSA8IM61ICYmIHgxIC0geDMgPiDOtSA/IHtcbiAgICAgICAgICAgIHg6IGFicyh5MiAtIHkxKSA8IM61ID8geDIgOiB4MSxcbiAgICAgICAgICAgIHk6IHkxXG4gICAgICAgICAgfSA6IGFicyh4MyAtIHgxKSA8IM61ICYmIHkzIC0geTAgPiDOtSA/IHtcbiAgICAgICAgICAgIHg6IHgxLFxuICAgICAgICAgICAgeTogYWJzKHgyIC0geDEpIDwgzrUgPyB5MiA6IHkwXG4gICAgICAgICAgfSA6IGFicyh5MyAtIHkwKSA8IM61ICYmIHgzIC0geDAgPiDOtSA/IHtcbiAgICAgICAgICAgIHg6IGFicyh5MiAtIHkwKSA8IM61ID8geDIgOiB4MCxcbiAgICAgICAgICAgIHk6IHkwXG4gICAgICAgICAgfSA6IG51bGwpLCBjZWxsLnNpdGUsIG51bGwpKTtcbiAgICAgICAgICArK25IYWxmRWRnZXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pSGFsZkVkZ2VPcmRlcihhLCBiKSB7XG4gICAgcmV0dXJuIGIuYW5nbGUgLSBhLmFuZ2xlO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaUNpcmNsZSgpIHtcbiAgICBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja05vZGUodGhpcyk7XG4gICAgdGhpcy54ID0gdGhpcy55ID0gdGhpcy5hcmMgPSB0aGlzLnNpdGUgPSB0aGlzLmN5ID0gbnVsbDtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lBdHRhY2hDaXJjbGUoYXJjKSB7XG4gICAgdmFyIGxBcmMgPSBhcmMuUCwgckFyYyA9IGFyYy5OO1xuICAgIGlmICghbEFyYyB8fCAhckFyYykgcmV0dXJuO1xuICAgIHZhciBsU2l0ZSA9IGxBcmMuc2l0ZSwgY1NpdGUgPSBhcmMuc2l0ZSwgclNpdGUgPSByQXJjLnNpdGU7XG4gICAgaWYgKGxTaXRlID09PSByU2l0ZSkgcmV0dXJuO1xuICAgIHZhciBieCA9IGNTaXRlLngsIGJ5ID0gY1NpdGUueSwgYXggPSBsU2l0ZS54IC0gYngsIGF5ID0gbFNpdGUueSAtIGJ5LCBjeCA9IHJTaXRlLnggLSBieCwgY3kgPSByU2l0ZS55IC0gYnk7XG4gICAgdmFyIGQgPSAyICogKGF4ICogY3kgLSBheSAqIGN4KTtcbiAgICBpZiAoZCA+PSAtzrUyKSByZXR1cm47XG4gICAgdmFyIGhhID0gYXggKiBheCArIGF5ICogYXksIGhjID0gY3ggKiBjeCArIGN5ICogY3ksIHggPSAoY3kgKiBoYSAtIGF5ICogaGMpIC8gZCwgeSA9IChheCAqIGhjIC0gY3ggKiBoYSkgLyBkLCBjeSA9IHkgKyBieTtcbiAgICB2YXIgY2lyY2xlID0gZDNfZ2VvbV92b3Jvbm9pQ2lyY2xlUG9vbC5wb3AoKSB8fCBuZXcgZDNfZ2VvbV92b3Jvbm9pQ2lyY2xlKCk7XG4gICAgY2lyY2xlLmFyYyA9IGFyYztcbiAgICBjaXJjbGUuc2l0ZSA9IGNTaXRlO1xuICAgIGNpcmNsZS54ID0geCArIGJ4O1xuICAgIGNpcmNsZS55ID0gY3kgKyBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XG4gICAgY2lyY2xlLmN5ID0gY3k7XG4gICAgYXJjLmNpcmNsZSA9IGNpcmNsZTtcbiAgICB2YXIgYmVmb3JlID0gbnVsbCwgbm9kZSA9IGQzX2dlb21fdm9yb25vaUNpcmNsZXMuXztcbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgaWYgKGNpcmNsZS55IDwgbm9kZS55IHx8IGNpcmNsZS55ID09PSBub2RlLnkgJiYgY2lyY2xlLnggPD0gbm9kZS54KSB7XG4gICAgICAgIGlmIChub2RlLkwpIG5vZGUgPSBub2RlLkw7IGVsc2Uge1xuICAgICAgICAgIGJlZm9yZSA9IG5vZGUuUDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG5vZGUuUikgbm9kZSA9IG5vZGUuUjsgZWxzZSB7XG4gICAgICAgICAgYmVmb3JlID0gbm9kZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBkM19nZW9tX3Zvcm9ub2lDaXJjbGVzLmluc2VydChiZWZvcmUsIGNpcmNsZSk7XG4gICAgaWYgKCFiZWZvcmUpIGQzX2dlb21fdm9yb25vaUZpcnN0Q2lyY2xlID0gY2lyY2xlO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaURldGFjaENpcmNsZShhcmMpIHtcbiAgICB2YXIgY2lyY2xlID0gYXJjLmNpcmNsZTtcbiAgICBpZiAoY2lyY2xlKSB7XG4gICAgICBpZiAoIWNpcmNsZS5QKSBkM19nZW9tX3Zvcm9ub2lGaXJzdENpcmNsZSA9IGNpcmNsZS5OO1xuICAgICAgZDNfZ2VvbV92b3Jvbm9pQ2lyY2xlcy5yZW1vdmUoY2lyY2xlKTtcbiAgICAgIGQzX2dlb21fdm9yb25vaUNpcmNsZVBvb2wucHVzaChjaXJjbGUpO1xuICAgICAgZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tOb2RlKGNpcmNsZSk7XG4gICAgICBhcmMuY2lyY2xlID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pQ2xpcEVkZ2VzKGV4dGVudCkge1xuICAgIHZhciBlZGdlcyA9IGQzX2dlb21fdm9yb25vaUVkZ2VzLCBjbGlwID0gZDNfZ2VvbV9jbGlwTGluZShleHRlbnRbMF1bMF0sIGV4dGVudFswXVsxXSwgZXh0ZW50WzFdWzBdLCBleHRlbnRbMV1bMV0pLCBpID0gZWRnZXMubGVuZ3RoLCBlO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGUgPSBlZGdlc1tpXTtcbiAgICAgIGlmICghZDNfZ2VvbV92b3Jvbm9pQ29ubmVjdEVkZ2UoZSwgZXh0ZW50KSB8fCAhY2xpcChlKSB8fCBhYnMoZS5hLnggLSBlLmIueCkgPCDOtSAmJiBhYnMoZS5hLnkgLSBlLmIueSkgPCDOtSkge1xuICAgICAgICBlLmEgPSBlLmIgPSBudWxsO1xuICAgICAgICBlZGdlcy5zcGxpY2UoaSwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaUNvbm5lY3RFZGdlKGVkZ2UsIGV4dGVudCkge1xuICAgIHZhciB2YiA9IGVkZ2UuYjtcbiAgICBpZiAodmIpIHJldHVybiB0cnVlO1xuICAgIHZhciB2YSA9IGVkZ2UuYSwgeDAgPSBleHRlbnRbMF1bMF0sIHgxID0gZXh0ZW50WzFdWzBdLCB5MCA9IGV4dGVudFswXVsxXSwgeTEgPSBleHRlbnRbMV1bMV0sIGxTaXRlID0gZWRnZS5sLCByU2l0ZSA9IGVkZ2UuciwgbHggPSBsU2l0ZS54LCBseSA9IGxTaXRlLnksIHJ4ID0gclNpdGUueCwgcnkgPSByU2l0ZS55LCBmeCA9IChseCArIHJ4KSAvIDIsIGZ5ID0gKGx5ICsgcnkpIC8gMiwgZm0sIGZiO1xuICAgIGlmIChyeSA9PT0gbHkpIHtcbiAgICAgIGlmIChmeCA8IHgwIHx8IGZ4ID49IHgxKSByZXR1cm47XG4gICAgICBpZiAobHggPiByeCkge1xuICAgICAgICBpZiAoIXZhKSB2YSA9IHtcbiAgICAgICAgICB4OiBmeCxcbiAgICAgICAgICB5OiB5MFxuICAgICAgICB9OyBlbHNlIGlmICh2YS55ID49IHkxKSByZXR1cm47XG4gICAgICAgIHZiID0ge1xuICAgICAgICAgIHg6IGZ4LFxuICAgICAgICAgIHk6IHkxXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXZhKSB2YSA9IHtcbiAgICAgICAgICB4OiBmeCxcbiAgICAgICAgICB5OiB5MVxuICAgICAgICB9OyBlbHNlIGlmICh2YS55IDwgeTApIHJldHVybjtcbiAgICAgICAgdmIgPSB7XG4gICAgICAgICAgeDogZngsXG4gICAgICAgICAgeTogeTBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm0gPSAobHggLSByeCkgLyAocnkgLSBseSk7XG4gICAgICBmYiA9IGZ5IC0gZm0gKiBmeDtcbiAgICAgIGlmIChmbSA8IC0xIHx8IGZtID4gMSkge1xuICAgICAgICBpZiAobHggPiByeCkge1xuICAgICAgICAgIGlmICghdmEpIHZhID0ge1xuICAgICAgICAgICAgeDogKHkwIC0gZmIpIC8gZm0sXG4gICAgICAgICAgICB5OiB5MFxuICAgICAgICAgIH07IGVsc2UgaWYgKHZhLnkgPj0geTEpIHJldHVybjtcbiAgICAgICAgICB2YiA9IHtcbiAgICAgICAgICAgIHg6ICh5MSAtIGZiKSAvIGZtLFxuICAgICAgICAgICAgeTogeTFcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghdmEpIHZhID0ge1xuICAgICAgICAgICAgeDogKHkxIC0gZmIpIC8gZm0sXG4gICAgICAgICAgICB5OiB5MVxuICAgICAgICAgIH07IGVsc2UgaWYgKHZhLnkgPCB5MCkgcmV0dXJuO1xuICAgICAgICAgIHZiID0ge1xuICAgICAgICAgICAgeDogKHkwIC0gZmIpIC8gZm0sXG4gICAgICAgICAgICB5OiB5MFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChseSA8IHJ5KSB7XG4gICAgICAgICAgaWYgKCF2YSkgdmEgPSB7XG4gICAgICAgICAgICB4OiB4MCxcbiAgICAgICAgICAgIHk6IGZtICogeDAgKyBmYlxuICAgICAgICAgIH07IGVsc2UgaWYgKHZhLnggPj0geDEpIHJldHVybjtcbiAgICAgICAgICB2YiA9IHtcbiAgICAgICAgICAgIHg6IHgxLFxuICAgICAgICAgICAgeTogZm0gKiB4MSArIGZiXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIXZhKSB2YSA9IHtcbiAgICAgICAgICAgIHg6IHgxLFxuICAgICAgICAgICAgeTogZm0gKiB4MSArIGZiXG4gICAgICAgICAgfTsgZWxzZSBpZiAodmEueCA8IHgwKSByZXR1cm47XG4gICAgICAgICAgdmIgPSB7XG4gICAgICAgICAgICB4OiB4MCxcbiAgICAgICAgICAgIHk6IGZtICogeDAgKyBmYlxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZWRnZS5hID0gdmE7XG4gICAgZWRnZS5iID0gdmI7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pRWRnZShsU2l0ZSwgclNpdGUpIHtcbiAgICB0aGlzLmwgPSBsU2l0ZTtcbiAgICB0aGlzLnIgPSByU2l0ZTtcbiAgICB0aGlzLmEgPSB0aGlzLmIgPSBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaUNyZWF0ZUVkZ2UobFNpdGUsIHJTaXRlLCB2YSwgdmIpIHtcbiAgICB2YXIgZWRnZSA9IG5ldyBkM19nZW9tX3Zvcm9ub2lFZGdlKGxTaXRlLCByU2l0ZSk7XG4gICAgZDNfZ2VvbV92b3Jvbm9pRWRnZXMucHVzaChlZGdlKTtcbiAgICBpZiAodmEpIGQzX2dlb21fdm9yb25vaVNldEVkZ2VFbmQoZWRnZSwgbFNpdGUsIHJTaXRlLCB2YSk7XG4gICAgaWYgKHZiKSBkM19nZW9tX3Zvcm9ub2lTZXRFZGdlRW5kKGVkZ2UsIHJTaXRlLCBsU2l0ZSwgdmIpO1xuICAgIGQzX2dlb21fdm9yb25vaUNlbGxzW2xTaXRlLmldLmVkZ2VzLnB1c2gobmV3IGQzX2dlb21fdm9yb25vaUhhbGZFZGdlKGVkZ2UsIGxTaXRlLCByU2l0ZSkpO1xuICAgIGQzX2dlb21fdm9yb25vaUNlbGxzW3JTaXRlLmldLmVkZ2VzLnB1c2gobmV3IGQzX2dlb21fdm9yb25vaUhhbGZFZGdlKGVkZ2UsIHJTaXRlLCBsU2l0ZSkpO1xuICAgIHJldHVybiBlZGdlO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaUNyZWF0ZUJvcmRlckVkZ2UobFNpdGUsIHZhLCB2Yikge1xuICAgIHZhciBlZGdlID0gbmV3IGQzX2dlb21fdm9yb25vaUVkZ2UobFNpdGUsIG51bGwpO1xuICAgIGVkZ2UuYSA9IHZhO1xuICAgIGVkZ2UuYiA9IHZiO1xuICAgIGQzX2dlb21fdm9yb25vaUVkZ2VzLnB1c2goZWRnZSk7XG4gICAgcmV0dXJuIGVkZ2U7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pU2V0RWRnZUVuZChlZGdlLCBsU2l0ZSwgclNpdGUsIHZlcnRleCkge1xuICAgIGlmICghZWRnZS5hICYmICFlZGdlLmIpIHtcbiAgICAgIGVkZ2UuYSA9IHZlcnRleDtcbiAgICAgIGVkZ2UubCA9IGxTaXRlO1xuICAgICAgZWRnZS5yID0gclNpdGU7XG4gICAgfSBlbHNlIGlmIChlZGdlLmwgPT09IHJTaXRlKSB7XG4gICAgICBlZGdlLmIgPSB2ZXJ0ZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVkZ2UuYSA9IHZlcnRleDtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pSGFsZkVkZ2UoZWRnZSwgbFNpdGUsIHJTaXRlKSB7XG4gICAgdmFyIHZhID0gZWRnZS5hLCB2YiA9IGVkZ2UuYjtcbiAgICB0aGlzLmVkZ2UgPSBlZGdlO1xuICAgIHRoaXMuc2l0ZSA9IGxTaXRlO1xuICAgIHRoaXMuYW5nbGUgPSByU2l0ZSA/IE1hdGguYXRhbjIoclNpdGUueSAtIGxTaXRlLnksIHJTaXRlLnggLSBsU2l0ZS54KSA6IGVkZ2UubCA9PT0gbFNpdGUgPyBNYXRoLmF0YW4yKHZiLnggLSB2YS54LCB2YS55IC0gdmIueSkgOiBNYXRoLmF0YW4yKHZhLnggLSB2Yi54LCB2Yi55IC0gdmEueSk7XG4gIH1cbiAgZDNfZ2VvbV92b3Jvbm9pSGFsZkVkZ2UucHJvdG90eXBlID0ge1xuICAgIHN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmVkZ2UubCA9PT0gdGhpcy5zaXRlID8gdGhpcy5lZGdlLmEgOiB0aGlzLmVkZ2UuYjtcbiAgICB9LFxuICAgIGVuZDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5lZGdlLmwgPT09IHRoaXMuc2l0ZSA/IHRoaXMuZWRnZS5iIDogdGhpcy5lZGdlLmE7XG4gICAgfVxuICB9O1xuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja1RyZWUoKSB7XG4gICAgdGhpcy5fID0gbnVsbDtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja05vZGUobm9kZSkge1xuICAgIG5vZGUuVSA9IG5vZGUuQyA9IG5vZGUuTCA9IG5vZGUuUiA9IG5vZGUuUCA9IG5vZGUuTiA9IG51bGw7XG4gIH1cbiAgZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tUcmVlLnByb3RvdHlwZSA9IHtcbiAgICBpbnNlcnQ6IGZ1bmN0aW9uKGFmdGVyLCBub2RlKSB7XG4gICAgICB2YXIgcGFyZW50LCBncmFuZHBhLCB1bmNsZTtcbiAgICAgIGlmIChhZnRlcikge1xuICAgICAgICBub2RlLlAgPSBhZnRlcjtcbiAgICAgICAgbm9kZS5OID0gYWZ0ZXIuTjtcbiAgICAgICAgaWYgKGFmdGVyLk4pIGFmdGVyLk4uUCA9IG5vZGU7XG4gICAgICAgIGFmdGVyLk4gPSBub2RlO1xuICAgICAgICBpZiAoYWZ0ZXIuUikge1xuICAgICAgICAgIGFmdGVyID0gYWZ0ZXIuUjtcbiAgICAgICAgICB3aGlsZSAoYWZ0ZXIuTCkgYWZ0ZXIgPSBhZnRlci5MO1xuICAgICAgICAgIGFmdGVyLkwgPSBub2RlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFmdGVyLlIgPSBub2RlO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudCA9IGFmdGVyO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl8pIHtcbiAgICAgICAgYWZ0ZXIgPSBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja0ZpcnN0KHRoaXMuXyk7XG4gICAgICAgIG5vZGUuUCA9IG51bGw7XG4gICAgICAgIG5vZGUuTiA9IGFmdGVyO1xuICAgICAgICBhZnRlci5QID0gYWZ0ZXIuTCA9IG5vZGU7XG4gICAgICAgIHBhcmVudCA9IGFmdGVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5QID0gbm9kZS5OID0gbnVsbDtcbiAgICAgICAgdGhpcy5fID0gbm9kZTtcbiAgICAgICAgcGFyZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIG5vZGUuTCA9IG5vZGUuUiA9IG51bGw7XG4gICAgICBub2RlLlUgPSBwYXJlbnQ7XG4gICAgICBub2RlLkMgPSB0cnVlO1xuICAgICAgYWZ0ZXIgPSBub2RlO1xuICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQuQykge1xuICAgICAgICBncmFuZHBhID0gcGFyZW50LlU7XG4gICAgICAgIGlmIChwYXJlbnQgPT09IGdyYW5kcGEuTCkge1xuICAgICAgICAgIHVuY2xlID0gZ3JhbmRwYS5SO1xuICAgICAgICAgIGlmICh1bmNsZSAmJiB1bmNsZS5DKSB7XG4gICAgICAgICAgICBwYXJlbnQuQyA9IHVuY2xlLkMgPSBmYWxzZTtcbiAgICAgICAgICAgIGdyYW5kcGEuQyA9IHRydWU7XG4gICAgICAgICAgICBhZnRlciA9IGdyYW5kcGE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChhZnRlciA9PT0gcGFyZW50LlIpIHtcbiAgICAgICAgICAgICAgZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tSb3RhdGVMZWZ0KHRoaXMsIHBhcmVudCk7XG4gICAgICAgICAgICAgIGFmdGVyID0gcGFyZW50O1xuICAgICAgICAgICAgICBwYXJlbnQgPSBhZnRlci5VO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFyZW50LkMgPSBmYWxzZTtcbiAgICAgICAgICAgIGdyYW5kcGEuQyA9IHRydWU7XG4gICAgICAgICAgICBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja1JvdGF0ZVJpZ2h0KHRoaXMsIGdyYW5kcGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1bmNsZSA9IGdyYW5kcGEuTDtcbiAgICAgICAgICBpZiAodW5jbGUgJiYgdW5jbGUuQykge1xuICAgICAgICAgICAgcGFyZW50LkMgPSB1bmNsZS5DID0gZmFsc2U7XG4gICAgICAgICAgICBncmFuZHBhLkMgPSB0cnVlO1xuICAgICAgICAgICAgYWZ0ZXIgPSBncmFuZHBhO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoYWZ0ZXIgPT09IHBhcmVudC5MKSB7XG4gICAgICAgICAgICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgcGFyZW50KTtcbiAgICAgICAgICAgICAgYWZ0ZXIgPSBwYXJlbnQ7XG4gICAgICAgICAgICAgIHBhcmVudCA9IGFmdGVyLlU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnQuQyA9IGZhbHNlO1xuICAgICAgICAgICAgZ3JhbmRwYS5DID0gdHJ1ZTtcbiAgICAgICAgICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlTGVmdCh0aGlzLCBncmFuZHBhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcGFyZW50ID0gYWZ0ZXIuVTtcbiAgICAgIH1cbiAgICAgIHRoaXMuXy5DID0gZmFsc2U7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIGlmIChub2RlLk4pIG5vZGUuTi5QID0gbm9kZS5QO1xuICAgICAgaWYgKG5vZGUuUCkgbm9kZS5QLk4gPSBub2RlLk47XG4gICAgICBub2RlLk4gPSBub2RlLlAgPSBudWxsO1xuICAgICAgdmFyIHBhcmVudCA9IG5vZGUuVSwgc2libGluZywgbGVmdCA9IG5vZGUuTCwgcmlnaHQgPSBub2RlLlIsIG5leHQsIHJlZDtcbiAgICAgIGlmICghbGVmdCkgbmV4dCA9IHJpZ2h0OyBlbHNlIGlmICghcmlnaHQpIG5leHQgPSBsZWZ0OyBlbHNlIG5leHQgPSBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja0ZpcnN0KHJpZ2h0KTtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgaWYgKHBhcmVudC5MID09PSBub2RlKSBwYXJlbnQuTCA9IG5leHQ7IGVsc2UgcGFyZW50LlIgPSBuZXh0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fID0gbmV4dDtcbiAgICAgIH1cbiAgICAgIGlmIChsZWZ0ICYmIHJpZ2h0KSB7XG4gICAgICAgIHJlZCA9IG5leHQuQztcbiAgICAgICAgbmV4dC5DID0gbm9kZS5DO1xuICAgICAgICBuZXh0LkwgPSBsZWZ0O1xuICAgICAgICBsZWZ0LlUgPSBuZXh0O1xuICAgICAgICBpZiAobmV4dCAhPT0gcmlnaHQpIHtcbiAgICAgICAgICBwYXJlbnQgPSBuZXh0LlU7XG4gICAgICAgICAgbmV4dC5VID0gbm9kZS5VO1xuICAgICAgICAgIG5vZGUgPSBuZXh0LlI7XG4gICAgICAgICAgcGFyZW50LkwgPSBub2RlO1xuICAgICAgICAgIG5leHQuUiA9IHJpZ2h0O1xuICAgICAgICAgIHJpZ2h0LlUgPSBuZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5leHQuVSA9IHBhcmVudDtcbiAgICAgICAgICBwYXJlbnQgPSBuZXh0O1xuICAgICAgICAgIG5vZGUgPSBuZXh0LlI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlZCA9IG5vZGUuQztcbiAgICAgICAgbm9kZSA9IG5leHQ7XG4gICAgICB9XG4gICAgICBpZiAobm9kZSkgbm9kZS5VID0gcGFyZW50O1xuICAgICAgaWYgKHJlZCkgcmV0dXJuO1xuICAgICAgaWYgKG5vZGUgJiYgbm9kZS5DKSB7XG4gICAgICAgIG5vZGUuQyA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChub2RlID09PSB0aGlzLl8pIGJyZWFrO1xuICAgICAgICBpZiAobm9kZSA9PT0gcGFyZW50LkwpIHtcbiAgICAgICAgICBzaWJsaW5nID0gcGFyZW50LlI7XG4gICAgICAgICAgaWYgKHNpYmxpbmcuQykge1xuICAgICAgICAgICAgc2libGluZy5DID0gZmFsc2U7XG4gICAgICAgICAgICBwYXJlbnQuQyA9IHRydWU7XG4gICAgICAgICAgICBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja1JvdGF0ZUxlZnQodGhpcywgcGFyZW50KTtcbiAgICAgICAgICAgIHNpYmxpbmcgPSBwYXJlbnQuUjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNpYmxpbmcuTCAmJiBzaWJsaW5nLkwuQyB8fCBzaWJsaW5nLlIgJiYgc2libGluZy5SLkMpIHtcbiAgICAgICAgICAgIGlmICghc2libGluZy5SIHx8ICFzaWJsaW5nLlIuQykge1xuICAgICAgICAgICAgICBzaWJsaW5nLkwuQyA9IGZhbHNlO1xuICAgICAgICAgICAgICBzaWJsaW5nLkMgPSB0cnVlO1xuICAgICAgICAgICAgICBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja1JvdGF0ZVJpZ2h0KHRoaXMsIHNpYmxpbmcpO1xuICAgICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50LlI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaWJsaW5nLkMgPSBwYXJlbnQuQztcbiAgICAgICAgICAgIHBhcmVudC5DID0gc2libGluZy5SLkMgPSBmYWxzZTtcbiAgICAgICAgICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlTGVmdCh0aGlzLCBwYXJlbnQpO1xuICAgICAgICAgICAgbm9kZSA9IHRoaXMuXztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaWJsaW5nID0gcGFyZW50Lkw7XG4gICAgICAgICAgaWYgKHNpYmxpbmcuQykge1xuICAgICAgICAgICAgc2libGluZy5DID0gZmFsc2U7XG4gICAgICAgICAgICBwYXJlbnQuQyA9IHRydWU7XG4gICAgICAgICAgICBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja1JvdGF0ZVJpZ2h0KHRoaXMsIHBhcmVudCk7XG4gICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50Lkw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzaWJsaW5nLkwgJiYgc2libGluZy5MLkMgfHwgc2libGluZy5SICYmIHNpYmxpbmcuUi5DKSB7XG4gICAgICAgICAgICBpZiAoIXNpYmxpbmcuTCB8fCAhc2libGluZy5MLkMpIHtcbiAgICAgICAgICAgICAgc2libGluZy5SLkMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgc2libGluZy5DID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tSb3RhdGVMZWZ0KHRoaXMsIHNpYmxpbmcpO1xuICAgICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50Lkw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaWJsaW5nLkMgPSBwYXJlbnQuQztcbiAgICAgICAgICAgIHBhcmVudC5DID0gc2libGluZy5MLkMgPSBmYWxzZTtcbiAgICAgICAgICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgcGFyZW50KTtcbiAgICAgICAgICAgIG5vZGUgPSB0aGlzLl87XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2libGluZy5DID0gdHJ1ZTtcbiAgICAgICAgbm9kZSA9IHBhcmVudDtcbiAgICAgICAgcGFyZW50ID0gcGFyZW50LlU7XG4gICAgICB9IHdoaWxlICghbm9kZS5DKTtcbiAgICAgIGlmIChub2RlKSBub2RlLkMgPSBmYWxzZTtcbiAgICB9XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlTGVmdCh0cmVlLCBub2RlKSB7XG4gICAgdmFyIHAgPSBub2RlLCBxID0gbm9kZS5SLCBwYXJlbnQgPSBwLlU7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgaWYgKHBhcmVudC5MID09PSBwKSBwYXJlbnQuTCA9IHE7IGVsc2UgcGFyZW50LlIgPSBxO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmVlLl8gPSBxO1xuICAgIH1cbiAgICBxLlUgPSBwYXJlbnQ7XG4gICAgcC5VID0gcTtcbiAgICBwLlIgPSBxLkw7XG4gICAgaWYgKHAuUikgcC5SLlUgPSBwO1xuICAgIHEuTCA9IHA7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tSb3RhdGVSaWdodCh0cmVlLCBub2RlKSB7XG4gICAgdmFyIHAgPSBub2RlLCBxID0gbm9kZS5MLCBwYXJlbnQgPSBwLlU7XG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgaWYgKHBhcmVudC5MID09PSBwKSBwYXJlbnQuTCA9IHE7IGVsc2UgcGFyZW50LlIgPSBxO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmVlLl8gPSBxO1xuICAgIH1cbiAgICBxLlUgPSBwYXJlbnQ7XG4gICAgcC5VID0gcTtcbiAgICBwLkwgPSBxLlI7XG4gICAgaWYgKHAuTCkgcC5MLlUgPSBwO1xuICAgIHEuUiA9IHA7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tGaXJzdChub2RlKSB7XG4gICAgd2hpbGUgKG5vZGUuTCkgbm9kZSA9IG5vZGUuTDtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2koc2l0ZXMsIGJib3gpIHtcbiAgICB2YXIgc2l0ZSA9IHNpdGVzLnNvcnQoZDNfZ2VvbV92b3Jvbm9pVmVydGV4T3JkZXIpLnBvcCgpLCB4MCwgeTAsIGNpcmNsZTtcbiAgICBkM19nZW9tX3Zvcm9ub2lFZGdlcyA9IFtdO1xuICAgIGQzX2dlb21fdm9yb25vaUNlbGxzID0gbmV3IEFycmF5KHNpdGVzLmxlbmd0aCk7XG4gICAgZDNfZ2VvbV92b3Jvbm9pQmVhY2hlcyA9IG5ldyBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja1RyZWUoKTtcbiAgICBkM19nZW9tX3Zvcm9ub2lDaXJjbGVzID0gbmV3IGQzX2dlb21fdm9yb25vaVJlZEJsYWNrVHJlZSgpO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjaXJjbGUgPSBkM19nZW9tX3Zvcm9ub2lGaXJzdENpcmNsZTtcbiAgICAgIGlmIChzaXRlICYmICghY2lyY2xlIHx8IHNpdGUueSA8IGNpcmNsZS55IHx8IHNpdGUueSA9PT0gY2lyY2xlLnkgJiYgc2l0ZS54IDwgY2lyY2xlLngpKSB7XG4gICAgICAgIGlmIChzaXRlLnggIT09IHgwIHx8IHNpdGUueSAhPT0geTApIHtcbiAgICAgICAgICBkM19nZW9tX3Zvcm9ub2lDZWxsc1tzaXRlLmldID0gbmV3IGQzX2dlb21fdm9yb25vaUNlbGwoc2l0ZSk7XG4gICAgICAgICAgZDNfZ2VvbV92b3Jvbm9pQWRkQmVhY2goc2l0ZSk7XG4gICAgICAgICAgeDAgPSBzaXRlLngsIHkwID0gc2l0ZS55O1xuICAgICAgICB9XG4gICAgICAgIHNpdGUgPSBzaXRlcy5wb3AoKTtcbiAgICAgIH0gZWxzZSBpZiAoY2lyY2xlKSB7XG4gICAgICAgIGQzX2dlb21fdm9yb25vaVJlbW92ZUJlYWNoKGNpcmNsZS5hcmMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChiYm94KSBkM19nZW9tX3Zvcm9ub2lDbGlwRWRnZXMoYmJveCksIGQzX2dlb21fdm9yb25vaUNsb3NlQ2VsbHMoYmJveCk7XG4gICAgdmFyIGRpYWdyYW0gPSB7XG4gICAgICBjZWxsczogZDNfZ2VvbV92b3Jvbm9pQ2VsbHMsXG4gICAgICBlZGdlczogZDNfZ2VvbV92b3Jvbm9pRWRnZXNcbiAgICB9O1xuICAgIGQzX2dlb21fdm9yb25vaUJlYWNoZXMgPSBkM19nZW9tX3Zvcm9ub2lDaXJjbGVzID0gZDNfZ2VvbV92b3Jvbm9pRWRnZXMgPSBkM19nZW9tX3Zvcm9ub2lDZWxscyA9IG51bGw7XG4gICAgcmV0dXJuIGRpYWdyYW07XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pVmVydGV4T3JkZXIoYSwgYikge1xuICAgIHJldHVybiBiLnkgLSBhLnkgfHwgYi54IC0gYS54O1xuICB9XG4gIGQzLmdlb20udm9yb25vaSA9IGZ1bmN0aW9uKHBvaW50cykge1xuICAgIHZhciB4ID0gZDNfZ2VvbV9wb2ludFgsIHkgPSBkM19nZW9tX3BvaW50WSwgZnggPSB4LCBmeSA9IHksIGNsaXBFeHRlbnQgPSBkM19nZW9tX3Zvcm9ub2lDbGlwRXh0ZW50O1xuICAgIGlmIChwb2ludHMpIHJldHVybiB2b3Jvbm9pKHBvaW50cyk7XG4gICAgZnVuY3Rpb24gdm9yb25vaShkYXRhKSB7XG4gICAgICB2YXIgcG9seWdvbnMgPSBuZXcgQXJyYXkoZGF0YS5sZW5ndGgpLCB4MCA9IGNsaXBFeHRlbnRbMF1bMF0sIHkwID0gY2xpcEV4dGVudFswXVsxXSwgeDEgPSBjbGlwRXh0ZW50WzFdWzBdLCB5MSA9IGNsaXBFeHRlbnRbMV1bMV07XG4gICAgICBkM19nZW9tX3Zvcm9ub2koc2l0ZXMoZGF0YSksIGNsaXBFeHRlbnQpLmNlbGxzLmZvckVhY2goZnVuY3Rpb24oY2VsbCwgaSkge1xuICAgICAgICB2YXIgZWRnZXMgPSBjZWxsLmVkZ2VzLCBzaXRlID0gY2VsbC5zaXRlLCBwb2x5Z29uID0gcG9seWdvbnNbaV0gPSBlZGdlcy5sZW5ndGggPyBlZGdlcy5tYXAoZnVuY3Rpb24oZSkge1xuICAgICAgICAgIHZhciBzID0gZS5zdGFydCgpO1xuICAgICAgICAgIHJldHVybiBbIHMueCwgcy55IF07XG4gICAgICAgIH0pIDogc2l0ZS54ID49IHgwICYmIHNpdGUueCA8PSB4MSAmJiBzaXRlLnkgPj0geTAgJiYgc2l0ZS55IDw9IHkxID8gWyBbIHgwLCB5MSBdLCBbIHgxLCB5MSBdLCBbIHgxLCB5MCBdLCBbIHgwLCB5MCBdIF0gOiBbXTtcbiAgICAgICAgcG9seWdvbi5wb2ludCA9IGRhdGFbaV07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwb2x5Z29ucztcbiAgICB9XG4gICAgZnVuY3Rpb24gc2l0ZXMoZGF0YSkge1xuICAgICAgcmV0dXJuIGRhdGEubWFwKGZ1bmN0aW9uKGQsIGkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB4OiBNYXRoLnJvdW5kKGZ4KGQsIGkpIC8gzrUpICogzrUsXG4gICAgICAgICAgeTogTWF0aC5yb3VuZChmeShkLCBpKSAvIM61KSAqIM61LFxuICAgICAgICAgIGk6IGlcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB2b3Jvbm9pLmxpbmtzID0gZnVuY3Rpb24oZGF0YSkge1xuICAgICAgcmV0dXJuIGQzX2dlb21fdm9yb25vaShzaXRlcyhkYXRhKSkuZWRnZXMuZmlsdGVyKGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICAgICAgcmV0dXJuIGVkZ2UubCAmJiBlZGdlLnI7XG4gICAgICB9KS5tYXAoZnVuY3Rpb24oZWRnZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNvdXJjZTogZGF0YVtlZGdlLmwuaV0sXG4gICAgICAgICAgdGFyZ2V0OiBkYXRhW2VkZ2Uuci5pXVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfTtcbiAgICB2b3Jvbm9pLnRyaWFuZ2xlcyA9IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgIHZhciB0cmlhbmdsZXMgPSBbXTtcbiAgICAgIGQzX2dlb21fdm9yb25vaShzaXRlcyhkYXRhKSkuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihjZWxsLCBpKSB7XG4gICAgICAgIHZhciBzaXRlID0gY2VsbC5zaXRlLCBlZGdlcyA9IGNlbGwuZWRnZXMuc29ydChkM19nZW9tX3Zvcm9ub2lIYWxmRWRnZU9yZGVyKSwgaiA9IC0xLCBtID0gZWRnZXMubGVuZ3RoLCBlMCwgczAsIGUxID0gZWRnZXNbbSAtIDFdLmVkZ2UsIHMxID0gZTEubCA9PT0gc2l0ZSA/IGUxLnIgOiBlMS5sO1xuICAgICAgICB3aGlsZSAoKytqIDwgbSkge1xuICAgICAgICAgIGUwID0gZTE7XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICBlMSA9IGVkZ2VzW2pdLmVkZ2U7XG4gICAgICAgICAgczEgPSBlMS5sID09PSBzaXRlID8gZTEuciA6IGUxLmw7XG4gICAgICAgICAgaWYgKGkgPCBzMC5pICYmIGkgPCBzMS5pICYmIGQzX2dlb21fdm9yb25vaVRyaWFuZ2xlQXJlYShzaXRlLCBzMCwgczEpIDwgMCkge1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goWyBkYXRhW2ldLCBkYXRhW3MwLmldLCBkYXRhW3MxLmldIF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJpYW5nbGVzO1xuICAgIH07XG4gICAgdm9yb25vaS54ID0gZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZnggPSBkM19mdW5jdG9yKHggPSBfKSwgdm9yb25vaSkgOiB4O1xuICAgIH07XG4gICAgdm9yb25vaS55ID0gZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZnkgPSBkM19mdW5jdG9yKHkgPSBfKSwgdm9yb25vaSkgOiB5O1xuICAgIH07XG4gICAgdm9yb25vaS5jbGlwRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2xpcEV4dGVudCA9PT0gZDNfZ2VvbV92b3Jvbm9pQ2xpcEV4dGVudCA/IG51bGwgOiBjbGlwRXh0ZW50O1xuICAgICAgY2xpcEV4dGVudCA9IF8gPT0gbnVsbCA/IGQzX2dlb21fdm9yb25vaUNsaXBFeHRlbnQgOiBfO1xuICAgICAgcmV0dXJuIHZvcm9ub2k7XG4gICAgfTtcbiAgICB2b3Jvbm9pLnNpemUgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjbGlwRXh0ZW50ID09PSBkM19nZW9tX3Zvcm9ub2lDbGlwRXh0ZW50ID8gbnVsbCA6IGNsaXBFeHRlbnQgJiYgY2xpcEV4dGVudFsxXTtcbiAgICAgIHJldHVybiB2b3Jvbm9pLmNsaXBFeHRlbnQoXyAmJiBbIFsgMCwgMCBdLCBfIF0pO1xuICAgIH07XG4gICAgcmV0dXJuIHZvcm9ub2k7XG4gIH07XG4gIHZhciBkM19nZW9tX3Zvcm9ub2lDbGlwRXh0ZW50ID0gWyBbIC0xZTYsIC0xZTYgXSwgWyAxZTYsIDFlNiBdIF07XG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaVRyaWFuZ2xlQXJlYShhLCBiLCBjKSB7XG4gICAgcmV0dXJuIChhLnggLSBjLngpICogKGIueSAtIGEueSkgLSAoYS54IC0gYi54KSAqIChjLnkgLSBhLnkpO1xuICB9XG4gIGQzLmdlb20uZGVsYXVuYXkgPSBmdW5jdGlvbih2ZXJ0aWNlcykge1xuICAgIHJldHVybiBkMy5nZW9tLnZvcm9ub2koKS50cmlhbmdsZXModmVydGljZXMpO1xuICB9O1xuICBkMy5nZW9tLnF1YWR0cmVlID0gZnVuY3Rpb24ocG9pbnRzLCB4MSwgeTEsIHgyLCB5Mikge1xuICAgIHZhciB4ID0gZDNfZ2VvbV9wb2ludFgsIHkgPSBkM19nZW9tX3BvaW50WSwgY29tcGF0O1xuICAgIGlmIChjb21wYXQgPSBhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICB4ID0gZDNfZ2VvbV9xdWFkdHJlZUNvbXBhdFg7XG4gICAgICB5ID0gZDNfZ2VvbV9xdWFkdHJlZUNvbXBhdFk7XG4gICAgICBpZiAoY29tcGF0ID09PSAzKSB7XG4gICAgICAgIHkyID0geTE7XG4gICAgICAgIHgyID0geDE7XG4gICAgICAgIHkxID0geDEgPSAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHF1YWR0cmVlKHBvaW50cyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHF1YWR0cmVlKGRhdGEpIHtcbiAgICAgIHZhciBkLCBmeCA9IGQzX2Z1bmN0b3IoeCksIGZ5ID0gZDNfZnVuY3Rvcih5KSwgeHMsIHlzLCBpLCBuLCB4MV8sIHkxXywgeDJfLCB5Ml87XG4gICAgICBpZiAoeDEgIT0gbnVsbCkge1xuICAgICAgICB4MV8gPSB4MSwgeTFfID0geTEsIHgyXyA9IHgyLCB5Ml8gPSB5MjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHgyXyA9IHkyXyA9IC0oeDFfID0geTFfID0gSW5maW5pdHkpO1xuICAgICAgICB4cyA9IFtdLCB5cyA9IFtdO1xuICAgICAgICBuID0gZGF0YS5sZW5ndGg7XG4gICAgICAgIGlmIChjb21wYXQpIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgICBkID0gZGF0YVtpXTtcbiAgICAgICAgICBpZiAoZC54IDwgeDFfKSB4MV8gPSBkLng7XG4gICAgICAgICAgaWYgKGQueSA8IHkxXykgeTFfID0gZC55O1xuICAgICAgICAgIGlmIChkLnggPiB4Ml8pIHgyXyA9IGQueDtcbiAgICAgICAgICBpZiAoZC55ID4geTJfKSB5Ml8gPSBkLnk7XG4gICAgICAgICAgeHMucHVzaChkLngpO1xuICAgICAgICAgIHlzLnB1c2goZC55KTtcbiAgICAgICAgfSBlbHNlIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgICB2YXIgeF8gPSArZngoZCA9IGRhdGFbaV0sIGkpLCB5XyA9ICtmeShkLCBpKTtcbiAgICAgICAgICBpZiAoeF8gPCB4MV8pIHgxXyA9IHhfO1xuICAgICAgICAgIGlmICh5XyA8IHkxXykgeTFfID0geV87XG4gICAgICAgICAgaWYgKHhfID4geDJfKSB4Ml8gPSB4XztcbiAgICAgICAgICBpZiAoeV8gPiB5Ml8pIHkyXyA9IHlfO1xuICAgICAgICAgIHhzLnB1c2goeF8pO1xuICAgICAgICAgIHlzLnB1c2goeV8pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgZHggPSB4Ml8gLSB4MV8sIGR5ID0geTJfIC0geTFfO1xuICAgICAgaWYgKGR4ID4gZHkpIHkyXyA9IHkxXyArIGR4OyBlbHNlIHgyXyA9IHgxXyArIGR5O1xuICAgICAgZnVuY3Rpb24gaW5zZXJ0KG4sIGQsIHgsIHksIHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgICAgIGlmIChpc05hTih4KSB8fCBpc05hTih5KSkgcmV0dXJuO1xuICAgICAgICBpZiAobi5sZWFmKSB7XG4gICAgICAgICAgdmFyIG54ID0gbi54LCBueSA9IG4ueTtcbiAgICAgICAgICBpZiAobnggIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGFicyhueCAtIHgpICsgYWJzKG55IC0geSkgPCAuMDEpIHtcbiAgICAgICAgICAgICAgaW5zZXJ0Q2hpbGQobiwgZCwgeCwgeSwgeDEsIHkxLCB4MiwgeTIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdmFyIG5Qb2ludCA9IG4ucG9pbnQ7XG4gICAgICAgICAgICAgIG4ueCA9IG4ueSA9IG4ucG9pbnQgPSBudWxsO1xuICAgICAgICAgICAgICBpbnNlcnRDaGlsZChuLCBuUG9pbnQsIG54LCBueSwgeDEsIHkxLCB4MiwgeTIpO1xuICAgICAgICAgICAgICBpbnNlcnRDaGlsZChuLCBkLCB4LCB5LCB4MSwgeTEsIHgyLCB5Mik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG4ueCA9IHgsIG4ueSA9IHksIG4ucG9pbnQgPSBkO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbnNlcnRDaGlsZChuLCBkLCB4LCB5LCB4MSwgeTEsIHgyLCB5Mik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGluc2VydENoaWxkKG4sIGQsIHgsIHksIHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgICAgIHZhciB4bSA9ICh4MSArIHgyKSAqIC41LCB5bSA9ICh5MSArIHkyKSAqIC41LCByaWdodCA9IHggPj0geG0sIGJlbG93ID0geSA+PSB5bSwgaSA9IGJlbG93IDw8IDEgfCByaWdodDtcbiAgICAgICAgbi5sZWFmID0gZmFsc2U7XG4gICAgICAgIG4gPSBuLm5vZGVzW2ldIHx8IChuLm5vZGVzW2ldID0gZDNfZ2VvbV9xdWFkdHJlZU5vZGUoKSk7XG4gICAgICAgIGlmIChyaWdodCkgeDEgPSB4bTsgZWxzZSB4MiA9IHhtO1xuICAgICAgICBpZiAoYmVsb3cpIHkxID0geW07IGVsc2UgeTIgPSB5bTtcbiAgICAgICAgaW5zZXJ0KG4sIGQsIHgsIHksIHgxLCB5MSwgeDIsIHkyKTtcbiAgICAgIH1cbiAgICAgIHZhciByb290ID0gZDNfZ2VvbV9xdWFkdHJlZU5vZGUoKTtcbiAgICAgIHJvb3QuYWRkID0gZnVuY3Rpb24oZCkge1xuICAgICAgICBpbnNlcnQocm9vdCwgZCwgK2Z4KGQsICsraSksICtmeShkLCBpKSwgeDFfLCB5MV8sIHgyXywgeTJfKTtcbiAgICAgIH07XG4gICAgICByb290LnZpc2l0ID0gZnVuY3Rpb24oZikge1xuICAgICAgICBkM19nZW9tX3F1YWR0cmVlVmlzaXQoZiwgcm9vdCwgeDFfLCB5MV8sIHgyXywgeTJfKTtcbiAgICAgIH07XG4gICAgICByb290LmZpbmQgPSBmdW5jdGlvbihwb2ludCkge1xuICAgICAgICByZXR1cm4gZDNfZ2VvbV9xdWFkdHJlZUZpbmQocm9vdCwgcG9pbnRbMF0sIHBvaW50WzFdLCB4MV8sIHkxXywgeDJfLCB5Ml8pO1xuICAgICAgfTtcbiAgICAgIGkgPSAtMTtcbiAgICAgIGlmICh4MSA9PSBudWxsKSB7XG4gICAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgICAgaW5zZXJ0KHJvb3QsIGRhdGFbaV0sIHhzW2ldLCB5c1tpXSwgeDFfLCB5MV8sIHgyXywgeTJfKTtcbiAgICAgICAgfVxuICAgICAgICAtLWk7XG4gICAgICB9IGVsc2UgZGF0YS5mb3JFYWNoKHJvb3QuYWRkKTtcbiAgICAgIHhzID0geXMgPSBkYXRhID0gZCA9IG51bGw7XG4gICAgICByZXR1cm4gcm9vdDtcbiAgICB9XG4gICAgcXVhZHRyZWUueCA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSBfLCBxdWFkdHJlZSkgOiB4O1xuICAgIH07XG4gICAgcXVhZHRyZWUueSA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkgPSBfLCBxdWFkdHJlZSkgOiB5O1xuICAgIH07XG4gICAgcXVhZHRyZWUuZXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDEgPT0gbnVsbCA/IG51bGwgOiBbIFsgeDEsIHkxIF0sIFsgeDIsIHkyIF0gXTtcbiAgICAgIGlmIChfID09IG51bGwpIHgxID0geTEgPSB4MiA9IHkyID0gbnVsbDsgZWxzZSB4MSA9ICtfWzBdWzBdLCB5MSA9ICtfWzBdWzFdLCB4MiA9ICtfWzFdWzBdLCBcbiAgICAgIHkyID0gK19bMV1bMV07XG4gICAgICByZXR1cm4gcXVhZHRyZWU7XG4gICAgfTtcbiAgICBxdWFkdHJlZS5zaXplID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDEgPT0gbnVsbCA/IG51bGwgOiBbIHgyIC0geDEsIHkyIC0geTEgXTtcbiAgICAgIGlmIChfID09IG51bGwpIHgxID0geTEgPSB4MiA9IHkyID0gbnVsbDsgZWxzZSB4MSA9IHkxID0gMCwgeDIgPSArX1swXSwgeTIgPSArX1sxXTtcbiAgICAgIHJldHVybiBxdWFkdHJlZTtcbiAgICB9O1xuICAgIHJldHVybiBxdWFkdHJlZTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfZ2VvbV9xdWFkdHJlZUNvbXBhdFgoZCkge1xuICAgIHJldHVybiBkLng7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV9xdWFkdHJlZUNvbXBhdFkoZCkge1xuICAgIHJldHVybiBkLnk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV9xdWFkdHJlZU5vZGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxlYWY6IHRydWUsXG4gICAgICBub2RlczogW10sXG4gICAgICBwb2ludDogbnVsbCxcbiAgICAgIHg6IG51bGwsXG4gICAgICB5OiBudWxsXG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3F1YWR0cmVlVmlzaXQoZiwgbm9kZSwgeDEsIHkxLCB4MiwgeTIpIHtcbiAgICBpZiAoIWYobm9kZSwgeDEsIHkxLCB4MiwgeTIpKSB7XG4gICAgICB2YXIgc3ggPSAoeDEgKyB4MikgKiAuNSwgc3kgPSAoeTEgKyB5MikgKiAuNSwgY2hpbGRyZW4gPSBub2RlLm5vZGVzO1xuICAgICAgaWYgKGNoaWxkcmVuWzBdKSBkM19nZW9tX3F1YWR0cmVlVmlzaXQoZiwgY2hpbGRyZW5bMF0sIHgxLCB5MSwgc3gsIHN5KTtcbiAgICAgIGlmIChjaGlsZHJlblsxXSkgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIGNoaWxkcmVuWzFdLCBzeCwgeTEsIHgyLCBzeSk7XG4gICAgICBpZiAoY2hpbGRyZW5bMl0pIGQzX2dlb21fcXVhZHRyZWVWaXNpdChmLCBjaGlsZHJlblsyXSwgeDEsIHN5LCBzeCwgeTIpO1xuICAgICAgaWYgKGNoaWxkcmVuWzNdKSBkM19nZW9tX3F1YWR0cmVlVmlzaXQoZiwgY2hpbGRyZW5bM10sIHN4LCBzeSwgeDIsIHkyKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV9xdWFkdHJlZUZpbmQocm9vdCwgeCwgeSwgeDAsIHkwLCB4MywgeTMpIHtcbiAgICB2YXIgbWluRGlzdGFuY2UyID0gSW5maW5pdHksIGNsb3Nlc3RQb2ludDtcbiAgICAoZnVuY3Rpb24gZmluZChub2RlLCB4MSwgeTEsIHgyLCB5Mikge1xuICAgICAgaWYgKHgxID4geDMgfHwgeTEgPiB5MyB8fCB4MiA8IHgwIHx8IHkyIDwgeTApIHJldHVybjtcbiAgICAgIGlmIChwb2ludCA9IG5vZGUucG9pbnQpIHtcbiAgICAgICAgdmFyIHBvaW50LCBkeCA9IHggLSBub2RlLngsIGR5ID0geSAtIG5vZGUueSwgZGlzdGFuY2UyID0gZHggKiBkeCArIGR5ICogZHk7XG4gICAgICAgIGlmIChkaXN0YW5jZTIgPCBtaW5EaXN0YW5jZTIpIHtcbiAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLnNxcnQobWluRGlzdGFuY2UyID0gZGlzdGFuY2UyKTtcbiAgICAgICAgICB4MCA9IHggLSBkaXN0YW5jZSwgeTAgPSB5IC0gZGlzdGFuY2U7XG4gICAgICAgICAgeDMgPSB4ICsgZGlzdGFuY2UsIHkzID0geSArIGRpc3RhbmNlO1xuICAgICAgICAgIGNsb3Nlc3RQb2ludCA9IHBvaW50O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLm5vZGVzLCB4bSA9ICh4MSArIHgyKSAqIC41LCB5bSA9ICh5MSArIHkyKSAqIC41LCByaWdodCA9IHggPj0geG0sIGJlbG93ID0geSA+PSB5bTtcbiAgICAgIGZvciAodmFyIGkgPSBiZWxvdyA8PCAxIHwgcmlnaHQsIGogPSBpICsgNDsgaSA8IGo7ICsraSkge1xuICAgICAgICBpZiAobm9kZSA9IGNoaWxkcmVuW2kgJiAzXSkgc3dpdGNoIChpICYgMykge1xuICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgIGZpbmQobm9kZSwgeDEsIHkxLCB4bSwgeW0pO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgZmluZChub2RlLCB4bSwgeTEsIHgyLCB5bSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBmaW5kKG5vZGUsIHgxLCB5bSwgeG0sIHkyKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGZpbmQobm9kZSwgeG0sIHltLCB4MiwgeTIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkocm9vdCwgeDAsIHkwLCB4MywgeTMpO1xuICAgIHJldHVybiBjbG9zZXN0UG9pbnQ7XG4gIH1cbiAgZDMuaW50ZXJwb2xhdGVSZ2IgPSBkM19pbnRlcnBvbGF0ZVJnYjtcbiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVSZ2IoYSwgYikge1xuICAgIGEgPSBkMy5yZ2IoYSk7XG4gICAgYiA9IGQzLnJnYihiKTtcbiAgICB2YXIgYXIgPSBhLnIsIGFnID0gYS5nLCBhYiA9IGEuYiwgYnIgPSBiLnIgLSBhciwgYmcgPSBiLmcgLSBhZywgYmIgPSBiLmIgLSBhYjtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgcmV0dXJuIFwiI1wiICsgZDNfcmdiX2hleChNYXRoLnJvdW5kKGFyICsgYnIgKiB0KSkgKyBkM19yZ2JfaGV4KE1hdGgucm91bmQoYWcgKyBiZyAqIHQpKSArIGQzX3JnYl9oZXgoTWF0aC5yb3VuZChhYiArIGJiICogdCkpO1xuICAgIH07XG4gIH1cbiAgZDMuaW50ZXJwb2xhdGVPYmplY3QgPSBkM19pbnRlcnBvbGF0ZU9iamVjdDtcbiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVPYmplY3QoYSwgYikge1xuICAgIHZhciBpID0ge30sIGMgPSB7fSwgaztcbiAgICBmb3IgKGsgaW4gYSkge1xuICAgICAgaWYgKGsgaW4gYikge1xuICAgICAgICBpW2tdID0gZDNfaW50ZXJwb2xhdGUoYVtrXSwgYltrXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjW2tdID0gYVtrXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChrIGluIGIpIHtcbiAgICAgIGlmICghKGsgaW4gYSkpIHtcbiAgICAgICAgY1trXSA9IGJba107XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICBmb3IgKGsgaW4gaSkgY1trXSA9IGlba10odCk7XG4gICAgICByZXR1cm4gYztcbiAgICB9O1xuICB9XG4gIGQzLmludGVycG9sYXRlTnVtYmVyID0gZDNfaW50ZXJwb2xhdGVOdW1iZXI7XG4gIGZ1bmN0aW9uIGQzX2ludGVycG9sYXRlTnVtYmVyKGEsIGIpIHtcbiAgICBhID0gK2EsIGIgPSArYjtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgcmV0dXJuIGEgKiAoMSAtIHQpICsgYiAqIHQ7XG4gICAgfTtcbiAgfVxuICBkMy5pbnRlcnBvbGF0ZVN0cmluZyA9IGQzX2ludGVycG9sYXRlU3RyaW5nO1xuICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZVN0cmluZyhhLCBiKSB7XG4gICAgdmFyIGJpID0gZDNfaW50ZXJwb2xhdGVfbnVtYmVyQS5sYXN0SW5kZXggPSBkM19pbnRlcnBvbGF0ZV9udW1iZXJCLmxhc3RJbmRleCA9IDAsIGFtLCBibSwgYnMsIGkgPSAtMSwgcyA9IFtdLCBxID0gW107XG4gICAgYSA9IGEgKyBcIlwiLCBiID0gYiArIFwiXCI7XG4gICAgd2hpbGUgKChhbSA9IGQzX2ludGVycG9sYXRlX251bWJlckEuZXhlYyhhKSkgJiYgKGJtID0gZDNfaW50ZXJwb2xhdGVfbnVtYmVyQi5leGVjKGIpKSkge1xuICAgICAgaWYgKChicyA9IGJtLmluZGV4KSA+IGJpKSB7XG4gICAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpO1xuICAgICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgZWxzZSBzWysraV0gPSBicztcbiAgICAgIH1cbiAgICAgIGlmICgoYW0gPSBhbVswXSkgPT09IChibSA9IGJtWzBdKSkge1xuICAgICAgICBpZiAoc1tpXSkgc1tpXSArPSBibTsgZWxzZSBzWysraV0gPSBibTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNbKytpXSA9IG51bGw7XG4gICAgICAgIHEucHVzaCh7XG4gICAgICAgICAgaTogaSxcbiAgICAgICAgICB4OiBkM19pbnRlcnBvbGF0ZU51bWJlcihhbSwgYm0pXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYmkgPSBkM19pbnRlcnBvbGF0ZV9udW1iZXJCLmxhc3RJbmRleDtcbiAgICB9XG4gICAgaWYgKGJpIDwgYi5sZW5ndGgpIHtcbiAgICAgIGJzID0gYi5zbGljZShiaSk7XG4gICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgZWxzZSBzWysraV0gPSBicztcbiAgICB9XG4gICAgcmV0dXJuIHMubGVuZ3RoIDwgMiA/IHFbMF0gPyAoYiA9IHFbMF0ueCwgZnVuY3Rpb24odCkge1xuICAgICAgcmV0dXJuIGIodCkgKyBcIlwiO1xuICAgIH0pIDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gYjtcbiAgICB9IDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIG87IGkgPCBiOyArK2kpIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgIHJldHVybiBzLmpvaW4oXCJcIik7XG4gICAgfSk7XG4gIH1cbiAgdmFyIGQzX2ludGVycG9sYXRlX251bWJlckEgPSAvWy0rXT8oPzpcXGQrXFwuP1xcZCp8XFwuP1xcZCspKD86W2VFXVstK10/XFxkKyk/L2csIGQzX2ludGVycG9sYXRlX251bWJlckIgPSBuZXcgUmVnRXhwKGQzX2ludGVycG9sYXRlX251bWJlckEuc291cmNlLCBcImdcIik7XG4gIGQzLmludGVycG9sYXRlID0gZDNfaW50ZXJwb2xhdGU7XG4gIGZ1bmN0aW9uIGQzX2ludGVycG9sYXRlKGEsIGIpIHtcbiAgICB2YXIgaSA9IGQzLmludGVycG9sYXRvcnMubGVuZ3RoLCBmO1xuICAgIHdoaWxlICgtLWkgPj0gMCAmJiAhKGYgPSBkMy5pbnRlcnBvbGF0b3JzW2ldKGEsIGIpKSkgO1xuICAgIHJldHVybiBmO1xuICB9XG4gIGQzLmludGVycG9sYXRvcnMgPSBbIGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgdCA9IHR5cGVvZiBiO1xuICAgIHJldHVybiAodCA9PT0gXCJzdHJpbmdcIiA/IGQzX3JnYl9uYW1lcy5oYXMoYi50b0xvd2VyQ2FzZSgpKSB8fCAvXigjfHJnYlxcKHxoc2xcXCgpL2kudGVzdChiKSA/IGQzX2ludGVycG9sYXRlUmdiIDogZDNfaW50ZXJwb2xhdGVTdHJpbmcgOiBiIGluc3RhbmNlb2YgZDNfY29sb3IgPyBkM19pbnRlcnBvbGF0ZVJnYiA6IEFycmF5LmlzQXJyYXkoYikgPyBkM19pbnRlcnBvbGF0ZUFycmF5IDogdCA9PT0gXCJvYmplY3RcIiAmJiBpc05hTihiKSA/IGQzX2ludGVycG9sYXRlT2JqZWN0IDogZDNfaW50ZXJwb2xhdGVOdW1iZXIpKGEsIGIpO1xuICB9IF07XG4gIGQzLmludGVycG9sYXRlQXJyYXkgPSBkM19pbnRlcnBvbGF0ZUFycmF5O1xuICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZUFycmF5KGEsIGIpIHtcbiAgICB2YXIgeCA9IFtdLCBjID0gW10sIG5hID0gYS5sZW5ndGgsIG5iID0gYi5sZW5ndGgsIG4wID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKSwgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjA7ICsraSkgeC5wdXNoKGQzX2ludGVycG9sYXRlKGFbaV0sIGJbaV0pKTtcbiAgICBmb3IgKDtpIDwgbmE7ICsraSkgY1tpXSA9IGFbaV07XG4gICAgZm9yICg7aSA8IG5iOyArK2kpIGNbaV0gPSBiW2ldO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbjA7ICsraSkgY1tpXSA9IHhbaV0odCk7XG4gICAgICByZXR1cm4gYztcbiAgICB9O1xuICB9XG4gIHZhciBkM19lYXNlX2RlZmF1bHQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDNfaWRlbnRpdHk7XG4gIH07XG4gIHZhciBkM19lYXNlID0gZDMubWFwKHtcbiAgICBsaW5lYXI6IGQzX2Vhc2VfZGVmYXVsdCxcbiAgICBwb2x5OiBkM19lYXNlX3BvbHksXG4gICAgcXVhZDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZDNfZWFzZV9xdWFkO1xuICAgIH0sXG4gICAgY3ViaWM6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGQzX2Vhc2VfY3ViaWM7XG4gICAgfSxcbiAgICBzaW46IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGQzX2Vhc2Vfc2luO1xuICAgIH0sXG4gICAgZXhwOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBkM19lYXNlX2V4cDtcbiAgICB9LFxuICAgIGNpcmNsZTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZDNfZWFzZV9jaXJjbGU7XG4gICAgfSxcbiAgICBlbGFzdGljOiBkM19lYXNlX2VsYXN0aWMsXG4gICAgYmFjazogZDNfZWFzZV9iYWNrLFxuICAgIGJvdW5jZTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZDNfZWFzZV9ib3VuY2U7XG4gICAgfVxuICB9KTtcbiAgdmFyIGQzX2Vhc2VfbW9kZSA9IGQzLm1hcCh7XG4gICAgXCJpblwiOiBkM19pZGVudGl0eSxcbiAgICBvdXQ6IGQzX2Vhc2VfcmV2ZXJzZSxcbiAgICBcImluLW91dFwiOiBkM19lYXNlX3JlZmxlY3QsXG4gICAgXCJvdXQtaW5cIjogZnVuY3Rpb24oZikge1xuICAgICAgcmV0dXJuIGQzX2Vhc2VfcmVmbGVjdChkM19lYXNlX3JldmVyc2UoZikpO1xuICAgIH1cbiAgfSk7XG4gIGQzLmVhc2UgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGkgPSBuYW1lLmluZGV4T2YoXCItXCIpLCB0ID0gaSA+PSAwID8gbmFtZS5zbGljZSgwLCBpKSA6IG5hbWUsIG0gPSBpID49IDAgPyBuYW1lLnNsaWNlKGkgKyAxKSA6IFwiaW5cIjtcbiAgICB0ID0gZDNfZWFzZS5nZXQodCkgfHwgZDNfZWFzZV9kZWZhdWx0O1xuICAgIG0gPSBkM19lYXNlX21vZGUuZ2V0KG0pIHx8IGQzX2lkZW50aXR5O1xuICAgIHJldHVybiBkM19lYXNlX2NsYW1wKG0odC5hcHBseShudWxsLCBkM19hcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSkpKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfZWFzZV9jbGFtcChmKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHJldHVybiB0IDw9IDAgPyAwIDogdCA+PSAxID8gMSA6IGYodCk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkM19lYXNlX3JldmVyc2UoZikge1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICByZXR1cm4gMSAtIGYoMSAtIHQpO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZDNfZWFzZV9yZWZsZWN0KGYpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgcmV0dXJuIC41ICogKHQgPCAuNSA/IGYoMiAqIHQpIDogMiAtIGYoMiAtIDIgKiB0KSk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkM19lYXNlX3F1YWQodCkge1xuICAgIHJldHVybiB0ICogdDtcbiAgfVxuICBmdW5jdGlvbiBkM19lYXNlX2N1YmljKHQpIHtcbiAgICByZXR1cm4gdCAqIHQgKiB0O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2Vhc2VfY3ViaWNJbk91dCh0KSB7XG4gICAgaWYgKHQgPD0gMCkgcmV0dXJuIDA7XG4gICAgaWYgKHQgPj0gMSkgcmV0dXJuIDE7XG4gICAgdmFyIHQyID0gdCAqIHQsIHQzID0gdDIgKiB0O1xuICAgIHJldHVybiA0ICogKHQgPCAuNSA/IHQzIDogMyAqICh0IC0gdDIpICsgdDMgLSAuNzUpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2Vhc2VfcG9seShlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHJldHVybiBNYXRoLnBvdyh0LCBlKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2Vhc2Vfc2luKHQpIHtcbiAgICByZXR1cm4gMSAtIE1hdGguY29zKHQgKiBoYWxmz4ApO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2Vhc2VfZXhwKHQpIHtcbiAgICByZXR1cm4gTWF0aC5wb3coMiwgMTAgKiAodCAtIDEpKTtcbiAgfVxuICBmdW5jdGlvbiBkM19lYXNlX2NpcmNsZSh0KSB7XG4gICAgcmV0dXJuIDEgLSBNYXRoLnNxcnQoMSAtIHQgKiB0KTtcbiAgfVxuICBmdW5jdGlvbiBkM19lYXNlX2VsYXN0aWMoYSwgcCkge1xuICAgIHZhciBzO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcCA9IC40NTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkgcyA9IHAgLyDPhCAqIE1hdGguYXNpbigxIC8gYSk7IGVsc2UgYSA9IDEsIHMgPSBwIC8gNDtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgcmV0dXJuIDEgKyBhICogTWF0aC5wb3coMiwgLTEwICogdCkgKiBNYXRoLnNpbigodCAtIHMpICogz4QgLyBwKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2Vhc2VfYmFjayhzKSB7XG4gICAgaWYgKCFzKSBzID0gMS43MDE1ODtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgcmV0dXJuIHQgKiB0ICogKChzICsgMSkgKiB0IC0gcyk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkM19lYXNlX2JvdW5jZSh0KSB7XG4gICAgcmV0dXJuIHQgPCAxIC8gMi43NSA/IDcuNTYyNSAqIHQgKiB0IDogdCA8IDIgLyAyLjc1ID8gNy41NjI1ICogKHQgLT0gMS41IC8gMi43NSkgKiB0ICsgLjc1IDogdCA8IDIuNSAvIDIuNzUgPyA3LjU2MjUgKiAodCAtPSAyLjI1IC8gMi43NSkgKiB0ICsgLjkzNzUgOiA3LjU2MjUgKiAodCAtPSAyLjYyNSAvIDIuNzUpICogdCArIC45ODQzNzU7XG4gIH1cbiAgZDMuaW50ZXJwb2xhdGVIY2wgPSBkM19pbnRlcnBvbGF0ZUhjbDtcbiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVIY2woYSwgYikge1xuICAgIGEgPSBkMy5oY2woYSk7XG4gICAgYiA9IGQzLmhjbChiKTtcbiAgICB2YXIgYWggPSBhLmgsIGFjID0gYS5jLCBhbCA9IGEubCwgYmggPSBiLmggLSBhaCwgYmMgPSBiLmMgLSBhYywgYmwgPSBiLmwgLSBhbDtcbiAgICBpZiAoaXNOYU4oYmMpKSBiYyA9IDAsIGFjID0gaXNOYU4oYWMpID8gYi5jIDogYWM7XG4gICAgaWYgKGlzTmFOKGJoKSkgYmggPSAwLCBhaCA9IGlzTmFOKGFoKSA/IGIuaCA6IGFoOyBlbHNlIGlmIChiaCA+IDE4MCkgYmggLT0gMzYwOyBlbHNlIGlmIChiaCA8IC0xODApIGJoICs9IDM2MDtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgcmV0dXJuIGQzX2hjbF9sYWIoYWggKyBiaCAqIHQsIGFjICsgYmMgKiB0LCBhbCArIGJsICogdCkgKyBcIlwiO1xuICAgIH07XG4gIH1cbiAgZDMuaW50ZXJwb2xhdGVIc2wgPSBkM19pbnRlcnBvbGF0ZUhzbDtcbiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVIc2woYSwgYikge1xuICAgIGEgPSBkMy5oc2woYSk7XG4gICAgYiA9IGQzLmhzbChiKTtcbiAgICB2YXIgYWggPSBhLmgsIGFzID0gYS5zLCBhbCA9IGEubCwgYmggPSBiLmggLSBhaCwgYnMgPSBiLnMgLSBhcywgYmwgPSBiLmwgLSBhbDtcbiAgICBpZiAoaXNOYU4oYnMpKSBicyA9IDAsIGFzID0gaXNOYU4oYXMpID8gYi5zIDogYXM7XG4gICAgaWYgKGlzTmFOKGJoKSkgYmggPSAwLCBhaCA9IGlzTmFOKGFoKSA/IGIuaCA6IGFoOyBlbHNlIGlmIChiaCA+IDE4MCkgYmggLT0gMzYwOyBlbHNlIGlmIChiaCA8IC0xODApIGJoICs9IDM2MDtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgcmV0dXJuIGQzX2hzbF9yZ2IoYWggKyBiaCAqIHQsIGFzICsgYnMgKiB0LCBhbCArIGJsICogdCkgKyBcIlwiO1xuICAgIH07XG4gIH1cbiAgZDMuaW50ZXJwb2xhdGVMYWIgPSBkM19pbnRlcnBvbGF0ZUxhYjtcbiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVMYWIoYSwgYikge1xuICAgIGEgPSBkMy5sYWIoYSk7XG4gICAgYiA9IGQzLmxhYihiKTtcbiAgICB2YXIgYWwgPSBhLmwsIGFhID0gYS5hLCBhYiA9IGEuYiwgYmwgPSBiLmwgLSBhbCwgYmEgPSBiLmEgLSBhYSwgYmIgPSBiLmIgLSBhYjtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgcmV0dXJuIGQzX2xhYl9yZ2IoYWwgKyBibCAqIHQsIGFhICsgYmEgKiB0LCBhYiArIGJiICogdCkgKyBcIlwiO1xuICAgIH07XG4gIH1cbiAgZDMuaW50ZXJwb2xhdGVSb3VuZCA9IGQzX2ludGVycG9sYXRlUm91bmQ7XG4gIGZ1bmN0aW9uIGQzX2ludGVycG9sYXRlUm91bmQoYSwgYikge1xuICAgIGIgLT0gYTtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgcmV0dXJuIE1hdGgucm91bmQoYSArIGIgKiB0KTtcbiAgICB9O1xuICB9XG4gIGQzLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKHN0cmluZykge1xuICAgIHZhciBnID0gZDNfZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGQzLm5zLnByZWZpeC5zdmcsIFwiZ1wiKTtcbiAgICByZXR1cm4gKGQzLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKHN0cmluZykge1xuICAgICAgaWYgKHN0cmluZyAhPSBudWxsKSB7XG4gICAgICAgIGcuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIHN0cmluZyk7XG4gICAgICAgIHZhciB0ID0gZy50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBkM190cmFuc2Zvcm0odCA/IHQubWF0cml4IDogZDNfdHJhbnNmb3JtSWRlbnRpdHkpO1xuICAgIH0pKHN0cmluZyk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3RyYW5zZm9ybShtKSB7XG4gICAgdmFyIHIwID0gWyBtLmEsIG0uYiBdLCByMSA9IFsgbS5jLCBtLmQgXSwga3ggPSBkM190cmFuc2Zvcm1Ob3JtYWxpemUocjApLCBreiA9IGQzX3RyYW5zZm9ybURvdChyMCwgcjEpLCBreSA9IGQzX3RyYW5zZm9ybU5vcm1hbGl6ZShkM190cmFuc2Zvcm1Db21iaW5lKHIxLCByMCwgLWt6KSkgfHwgMDtcbiAgICBpZiAocjBbMF0gKiByMVsxXSA8IHIxWzBdICogcjBbMV0pIHtcbiAgICAgIHIwWzBdICo9IC0xO1xuICAgICAgcjBbMV0gKj0gLTE7XG4gICAgICBreCAqPSAtMTtcbiAgICAgIGt6ICo9IC0xO1xuICAgIH1cbiAgICB0aGlzLnJvdGF0ZSA9IChreCA/IE1hdGguYXRhbjIocjBbMV0sIHIwWzBdKSA6IE1hdGguYXRhbjIoLXIxWzBdLCByMVsxXSkpICogZDNfZGVncmVlcztcbiAgICB0aGlzLnRyYW5zbGF0ZSA9IFsgbS5lLCBtLmYgXTtcbiAgICB0aGlzLnNjYWxlID0gWyBreCwga3kgXTtcbiAgICB0aGlzLnNrZXcgPSBreSA/IE1hdGguYXRhbjIoa3osIGt5KSAqIGQzX2RlZ3JlZXMgOiAwO1xuICB9XG4gIGQzX3RyYW5zZm9ybS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJ0cmFuc2xhdGUoXCIgKyB0aGlzLnRyYW5zbGF0ZSArIFwiKXJvdGF0ZShcIiArIHRoaXMucm90YXRlICsgXCIpc2tld1goXCIgKyB0aGlzLnNrZXcgKyBcIilzY2FsZShcIiArIHRoaXMuc2NhbGUgKyBcIilcIjtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfdHJhbnNmb3JtRG90KGEsIGIpIHtcbiAgICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXTtcbiAgfVxuICBmdW5jdGlvbiBkM190cmFuc2Zvcm1Ob3JtYWxpemUoYSkge1xuICAgIHZhciBrID0gTWF0aC5zcXJ0KGQzX3RyYW5zZm9ybURvdChhLCBhKSk7XG4gICAgaWYgKGspIHtcbiAgICAgIGFbMF0gLz0gaztcbiAgICAgIGFbMV0gLz0gaztcbiAgICB9XG4gICAgcmV0dXJuIGs7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdHJhbnNmb3JtQ29tYmluZShhLCBiLCBrKSB7XG4gICAgYVswXSArPSBrICogYlswXTtcbiAgICBhWzFdICs9IGsgKiBiWzFdO1xuICAgIHJldHVybiBhO1xuICB9XG4gIHZhciBkM190cmFuc2Zvcm1JZGVudGl0eSA9IHtcbiAgICBhOiAxLFxuICAgIGI6IDAsXG4gICAgYzogMCxcbiAgICBkOiAxLFxuICAgIGU6IDAsXG4gICAgZjogMFxuICB9O1xuICBkMy5pbnRlcnBvbGF0ZVRyYW5zZm9ybSA9IGQzX2ludGVycG9sYXRlVHJhbnNmb3JtO1xuICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZVRyYW5zZm9ybVBvcChzKSB7XG4gICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArIFwiLFwiIDogXCJcIjtcbiAgfVxuICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZVRyYW5zbGF0ZSh0YSwgdGIsIHMsIHEpIHtcbiAgICBpZiAodGFbMF0gIT09IHRiWzBdIHx8IHRhWzFdICE9PSB0YlsxXSkge1xuICAgICAgdmFyIGkgPSBzLnB1c2goXCJ0cmFuc2xhdGUoXCIsIG51bGwsIFwiLFwiLCBudWxsLCBcIilcIik7XG4gICAgICBxLnB1c2goe1xuICAgICAgICBpOiBpIC0gNCxcbiAgICAgICAgeDogZDNfaW50ZXJwb2xhdGVOdW1iZXIodGFbMF0sIHRiWzBdKVxuICAgICAgfSwge1xuICAgICAgICBpOiBpIC0gMixcbiAgICAgICAgeDogZDNfaW50ZXJwb2xhdGVOdW1iZXIodGFbMV0sIHRiWzFdKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0YlswXSB8fCB0YlsxXSkge1xuICAgICAgcy5wdXNoKFwidHJhbnNsYXRlKFwiICsgdGIgKyBcIilcIik7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGQzX2ludGVycG9sYXRlUm90YXRlKHJhLCByYiwgcywgcSkge1xuICAgIGlmIChyYSAhPT0gcmIpIHtcbiAgICAgIGlmIChyYSAtIHJiID4gMTgwKSByYiArPSAzNjA7IGVsc2UgaWYgKHJiIC0gcmEgPiAxODApIHJhICs9IDM2MDtcbiAgICAgIHEucHVzaCh7XG4gICAgICAgIGk6IHMucHVzaChkM19pbnRlcnBvbGF0ZVRyYW5zZm9ybVBvcChzKSArIFwicm90YXRlKFwiLCBudWxsLCBcIilcIikgLSAyLFxuICAgICAgICB4OiBkM19pbnRlcnBvbGF0ZU51bWJlcihyYSwgcmIpXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHJiKSB7XG4gICAgICBzLnB1c2goZDNfaW50ZXJwb2xhdGVUcmFuc2Zvcm1Qb3AocykgKyBcInJvdGF0ZShcIiArIHJiICsgXCIpXCIpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZVNrZXcod2EsIHdiLCBzLCBxKSB7XG4gICAgaWYgKHdhICE9PSB3Yikge1xuICAgICAgcS5wdXNoKHtcbiAgICAgICAgaTogcy5wdXNoKGQzX2ludGVycG9sYXRlVHJhbnNmb3JtUG9wKHMpICsgXCJza2V3WChcIiwgbnVsbCwgXCIpXCIpIC0gMixcbiAgICAgICAgeDogZDNfaW50ZXJwb2xhdGVOdW1iZXIod2EsIHdiKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh3Yikge1xuICAgICAgcy5wdXNoKGQzX2ludGVycG9sYXRlVHJhbnNmb3JtUG9wKHMpICsgXCJza2V3WChcIiArIHdiICsgXCIpXCIpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZVNjYWxlKGthLCBrYiwgcywgcSkge1xuICAgIGlmIChrYVswXSAhPT0ga2JbMF0gfHwga2FbMV0gIT09IGtiWzFdKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChkM19pbnRlcnBvbGF0ZVRyYW5zZm9ybVBvcChzKSArIFwic2NhbGUoXCIsIG51bGwsIFwiLFwiLCBudWxsLCBcIilcIik7XG4gICAgICBxLnB1c2goe1xuICAgICAgICBpOiBpIC0gNCxcbiAgICAgICAgeDogZDNfaW50ZXJwb2xhdGVOdW1iZXIoa2FbMF0sIGtiWzBdKVxuICAgICAgfSwge1xuICAgICAgICBpOiBpIC0gMixcbiAgICAgICAgeDogZDNfaW50ZXJwb2xhdGVOdW1iZXIoa2FbMV0sIGtiWzFdKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChrYlswXSAhPT0gMSB8fCBrYlsxXSAhPT0gMSkge1xuICAgICAgcy5wdXNoKGQzX2ludGVycG9sYXRlVHJhbnNmb3JtUG9wKHMpICsgXCJzY2FsZShcIiArIGtiICsgXCIpXCIpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZVRyYW5zZm9ybShhLCBiKSB7XG4gICAgdmFyIHMgPSBbXSwgcSA9IFtdO1xuICAgIGEgPSBkMy50cmFuc2Zvcm0oYSksIGIgPSBkMy50cmFuc2Zvcm0oYik7XG4gICAgZDNfaW50ZXJwb2xhdGVUcmFuc2xhdGUoYS50cmFuc2xhdGUsIGIudHJhbnNsYXRlLCBzLCBxKTtcbiAgICBkM19pbnRlcnBvbGF0ZVJvdGF0ZShhLnJvdGF0ZSwgYi5yb3RhdGUsIHMsIHEpO1xuICAgIGQzX2ludGVycG9sYXRlU2tldyhhLnNrZXcsIGIuc2tldywgcywgcSk7XG4gICAgZDNfaW50ZXJwb2xhdGVTY2FsZShhLnNjYWxlLCBiLnNjYWxlLCBzLCBxKTtcbiAgICBhID0gYiA9IG51bGw7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHZhciBpID0gLTEsIG4gPSBxLmxlbmd0aCwgbztcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7XG4gICAgICByZXR1cm4gcy5qb2luKFwiXCIpO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZDNfdW5pbnRlcnBvbGF0ZU51bWJlcihhLCBiKSB7XG4gICAgYiA9IChiIC09IGEgPSArYSkgfHwgMSAvIGI7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiAoeCAtIGEpIC8gYjtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGQzX3VuaW50ZXJwb2xhdGVDbGFtcChhLCBiKSB7XG4gICAgYiA9IChiIC09IGEgPSArYSkgfHwgMSAvIGI7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCAoeCAtIGEpIC8gYikpO1xuICAgIH07XG4gIH1cbiAgZDMubGF5b3V0ID0ge307XG4gIGQzLmxheW91dC5idW5kbGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24obGlua3MpIHtcbiAgICAgIHZhciBwYXRocyA9IFtdLCBpID0gLTEsIG4gPSBsaW5rcy5sZW5ndGg7XG4gICAgICB3aGlsZSAoKytpIDwgbikgcGF0aHMucHVzaChkM19sYXlvdXRfYnVuZGxlUGF0aChsaW5rc1tpXSkpO1xuICAgICAgcmV0dXJuIHBhdGhzO1xuICAgIH07XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9idW5kbGVQYXRoKGxpbmspIHtcbiAgICB2YXIgc3RhcnQgPSBsaW5rLnNvdXJjZSwgZW5kID0gbGluay50YXJnZXQsIGxjYSA9IGQzX2xheW91dF9idW5kbGVMZWFzdENvbW1vbkFuY2VzdG9yKHN0YXJ0LCBlbmQpLCBwb2ludHMgPSBbIHN0YXJ0IF07XG4gICAgd2hpbGUgKHN0YXJ0ICE9PSBsY2EpIHtcbiAgICAgIHN0YXJ0ID0gc3RhcnQucGFyZW50O1xuICAgICAgcG9pbnRzLnB1c2goc3RhcnQpO1xuICAgIH1cbiAgICB2YXIgayA9IHBvaW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKGVuZCAhPT0gbGNhKSB7XG4gICAgICBwb2ludHMuc3BsaWNlKGssIDAsIGVuZCk7XG4gICAgICBlbmQgPSBlbmQucGFyZW50O1xuICAgIH1cbiAgICByZXR1cm4gcG9pbnRzO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9idW5kbGVBbmNlc3RvcnMobm9kZSkge1xuICAgIHZhciBhbmNlc3RvcnMgPSBbXSwgcGFyZW50ID0gbm9kZS5wYXJlbnQ7XG4gICAgd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7XG4gICAgICBhbmNlc3RvcnMucHVzaChub2RlKTtcbiAgICAgIG5vZGUgPSBwYXJlbnQ7XG4gICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50O1xuICAgIH1cbiAgICBhbmNlc3RvcnMucHVzaChub2RlKTtcbiAgICByZXR1cm4gYW5jZXN0b3JzO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9idW5kbGVMZWFzdENvbW1vbkFuY2VzdG9yKGEsIGIpIHtcbiAgICBpZiAoYSA9PT0gYikgcmV0dXJuIGE7XG4gICAgdmFyIGFOb2RlcyA9IGQzX2xheW91dF9idW5kbGVBbmNlc3RvcnMoYSksIGJOb2RlcyA9IGQzX2xheW91dF9idW5kbGVBbmNlc3RvcnMoYiksIGFOb2RlID0gYU5vZGVzLnBvcCgpLCBiTm9kZSA9IGJOb2Rlcy5wb3AoKSwgc2hhcmVkTm9kZSA9IG51bGw7XG4gICAgd2hpbGUgKGFOb2RlID09PSBiTm9kZSkge1xuICAgICAgc2hhcmVkTm9kZSA9IGFOb2RlO1xuICAgICAgYU5vZGUgPSBhTm9kZXMucG9wKCk7XG4gICAgICBiTm9kZSA9IGJOb2Rlcy5wb3AoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNoYXJlZE5vZGU7XG4gIH1cbiAgZDMubGF5b3V0LmNob3JkID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGNob3JkID0ge30sIGNob3JkcywgZ3JvdXBzLCBtYXRyaXgsIG4sIHBhZGRpbmcgPSAwLCBzb3J0R3JvdXBzLCBzb3J0U3ViZ3JvdXBzLCBzb3J0Q2hvcmRzO1xuICAgIGZ1bmN0aW9uIHJlbGF5b3V0KCkge1xuICAgICAgdmFyIHN1Ymdyb3VwcyA9IHt9LCBncm91cFN1bXMgPSBbXSwgZ3JvdXBJbmRleCA9IGQzLnJhbmdlKG4pLCBzdWJncm91cEluZGV4ID0gW10sIGssIHgsIHgwLCBpLCBqO1xuICAgICAgY2hvcmRzID0gW107XG4gICAgICBncm91cHMgPSBbXTtcbiAgICAgIGsgPSAwLCBpID0gLTE7XG4gICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICB4ID0gMCwgaiA9IC0xO1xuICAgICAgICB3aGlsZSAoKytqIDwgbikge1xuICAgICAgICAgIHggKz0gbWF0cml4W2ldW2pdO1xuICAgICAgICB9XG4gICAgICAgIGdyb3VwU3Vtcy5wdXNoKHgpO1xuICAgICAgICBzdWJncm91cEluZGV4LnB1c2goZDMucmFuZ2UobikpO1xuICAgICAgICBrICs9IHg7XG4gICAgICB9XG4gICAgICBpZiAoc29ydEdyb3Vwcykge1xuICAgICAgICBncm91cEluZGV4LnNvcnQoZnVuY3Rpb24oYSwgYikge1xuICAgICAgICAgIHJldHVybiBzb3J0R3JvdXBzKGdyb3VwU3Vtc1thXSwgZ3JvdXBTdW1zW2JdKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAoc29ydFN1Ymdyb3Vwcykge1xuICAgICAgICBzdWJncm91cEluZGV4LmZvckVhY2goZnVuY3Rpb24oZCwgaSkge1xuICAgICAgICAgIGQuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgICAgICByZXR1cm4gc29ydFN1Ymdyb3VwcyhtYXRyaXhbaV1bYV0sIG1hdHJpeFtpXVtiXSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgayA9ICjPhCAtIHBhZGRpbmcgKiBuKSAvIGs7XG4gICAgICB4ID0gMCwgaSA9IC0xO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgeDAgPSB4LCBqID0gLTE7XG4gICAgICAgIHdoaWxlICgrK2ogPCBuKSB7XG4gICAgICAgICAgdmFyIGRpID0gZ3JvdXBJbmRleFtpXSwgZGogPSBzdWJncm91cEluZGV4W2RpXVtqXSwgdiA9IG1hdHJpeFtkaV1bZGpdLCBhMCA9IHgsIGExID0geCArPSB2ICogaztcbiAgICAgICAgICBzdWJncm91cHNbZGkgKyBcIi1cIiArIGRqXSA9IHtcbiAgICAgICAgICAgIGluZGV4OiBkaSxcbiAgICAgICAgICAgIHN1YmluZGV4OiBkaixcbiAgICAgICAgICAgIHN0YXJ0QW5nbGU6IGEwLFxuICAgICAgICAgICAgZW5kQW5nbGU6IGExLFxuICAgICAgICAgICAgdmFsdWU6IHZcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGdyb3Vwc1tkaV0gPSB7XG4gICAgICAgICAgaW5kZXg6IGRpLFxuICAgICAgICAgIHN0YXJ0QW5nbGU6IHgwLFxuICAgICAgICAgIGVuZEFuZ2xlOiB4LFxuICAgICAgICAgIHZhbHVlOiBncm91cFN1bXNbZGldXG4gICAgICAgIH07XG4gICAgICAgIHggKz0gcGFkZGluZztcbiAgICAgIH1cbiAgICAgIGkgPSAtMTtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgIGogPSBpIC0gMTtcbiAgICAgICAgd2hpbGUgKCsraiA8IG4pIHtcbiAgICAgICAgICB2YXIgc291cmNlID0gc3ViZ3JvdXBzW2kgKyBcIi1cIiArIGpdLCB0YXJnZXQgPSBzdWJncm91cHNbaiArIFwiLVwiICsgaV07XG4gICAgICAgICAgaWYgKHNvdXJjZS52YWx1ZSB8fCB0YXJnZXQudmFsdWUpIHtcbiAgICAgICAgICAgIGNob3Jkcy5wdXNoKHNvdXJjZS52YWx1ZSA8IHRhcmdldC52YWx1ZSA/IHtcbiAgICAgICAgICAgICAgc291cmNlOiB0YXJnZXQsXG4gICAgICAgICAgICAgIHRhcmdldDogc291cmNlXG4gICAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHNvcnRDaG9yZHMpIHJlc29ydCgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXNvcnQoKSB7XG4gICAgICBjaG9yZHMuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgIHJldHVybiBzb3J0Q2hvcmRzKChhLnNvdXJjZS52YWx1ZSArIGEudGFyZ2V0LnZhbHVlKSAvIDIsIChiLnNvdXJjZS52YWx1ZSArIGIudGFyZ2V0LnZhbHVlKSAvIDIpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNob3JkLm1hdHJpeCA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG1hdHJpeDtcbiAgICAgIG4gPSAobWF0cml4ID0geCkgJiYgbWF0cml4Lmxlbmd0aDtcbiAgICAgIGNob3JkcyA9IGdyb3VwcyA9IG51bGw7XG4gICAgICByZXR1cm4gY2hvcmQ7XG4gICAgfTtcbiAgICBjaG9yZC5wYWRkaW5nID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcGFkZGluZztcbiAgICAgIHBhZGRpbmcgPSB4O1xuICAgICAgY2hvcmRzID0gZ3JvdXBzID0gbnVsbDtcbiAgICAgIHJldHVybiBjaG9yZDtcbiAgICB9O1xuICAgIGNob3JkLnNvcnRHcm91cHMgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3J0R3JvdXBzO1xuICAgICAgc29ydEdyb3VwcyA9IHg7XG4gICAgICBjaG9yZHMgPSBncm91cHMgPSBudWxsO1xuICAgICAgcmV0dXJuIGNob3JkO1xuICAgIH07XG4gICAgY2hvcmQuc29ydFN1Ymdyb3VwcyA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvcnRTdWJncm91cHM7XG4gICAgICBzb3J0U3ViZ3JvdXBzID0geDtcbiAgICAgIGNob3JkcyA9IG51bGw7XG4gICAgICByZXR1cm4gY2hvcmQ7XG4gICAgfTtcbiAgICBjaG9yZC5zb3J0Q2hvcmRzID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc29ydENob3JkcztcbiAgICAgIHNvcnRDaG9yZHMgPSB4O1xuICAgICAgaWYgKGNob3JkcykgcmVzb3J0KCk7XG4gICAgICByZXR1cm4gY2hvcmQ7XG4gICAgfTtcbiAgICBjaG9yZC5jaG9yZHMgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghY2hvcmRzKSByZWxheW91dCgpO1xuICAgICAgcmV0dXJuIGNob3JkcztcbiAgICB9O1xuICAgIGNob3JkLmdyb3VwcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFncm91cHMpIHJlbGF5b3V0KCk7XG4gICAgICByZXR1cm4gZ3JvdXBzO1xuICAgIH07XG4gICAgcmV0dXJuIGNob3JkO1xuICB9O1xuICBkMy5sYXlvdXQuZm9yY2UgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZm9yY2UgPSB7fSwgZXZlbnQgPSBkMy5kaXNwYXRjaChcInN0YXJ0XCIsIFwidGlja1wiLCBcImVuZFwiKSwgdGltZXIsIHNpemUgPSBbIDEsIDEgXSwgZHJhZywgYWxwaGEsIGZyaWN0aW9uID0gLjksIGxpbmtEaXN0YW5jZSA9IGQzX2xheW91dF9mb3JjZUxpbmtEaXN0YW5jZSwgbGlua1N0cmVuZ3RoID0gZDNfbGF5b3V0X2ZvcmNlTGlua1N0cmVuZ3RoLCBjaGFyZ2UgPSAtMzAsIGNoYXJnZURpc3RhbmNlMiA9IGQzX2xheW91dF9mb3JjZUNoYXJnZURpc3RhbmNlMiwgZ3Jhdml0eSA9IC4xLCB0aGV0YTIgPSAuNjQsIG5vZGVzID0gW10sIGxpbmtzID0gW10sIGRpc3RhbmNlcywgc3RyZW5ndGhzLCBjaGFyZ2VzO1xuICAgIGZ1bmN0aW9uIHJlcHVsc2Uobm9kZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHF1YWQsIHgxLCBfLCB4Mikge1xuICAgICAgICBpZiAocXVhZC5wb2ludCAhPT0gbm9kZSkge1xuICAgICAgICAgIHZhciBkeCA9IHF1YWQuY3ggLSBub2RlLngsIGR5ID0gcXVhZC5jeSAtIG5vZGUueSwgZHcgPSB4MiAtIHgxLCBkbiA9IGR4ICogZHggKyBkeSAqIGR5O1xuICAgICAgICAgIGlmIChkdyAqIGR3IC8gdGhldGEyIDwgZG4pIHtcbiAgICAgICAgICAgIGlmIChkbiA8IGNoYXJnZURpc3RhbmNlMikge1xuICAgICAgICAgICAgICB2YXIgayA9IHF1YWQuY2hhcmdlIC8gZG47XG4gICAgICAgICAgICAgIG5vZGUucHggLT0gZHggKiBrO1xuICAgICAgICAgICAgICBub2RlLnB5IC09IGR5ICogaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocXVhZC5wb2ludCAmJiBkbiAmJiBkbiA8IGNoYXJnZURpc3RhbmNlMikge1xuICAgICAgICAgICAgdmFyIGsgPSBxdWFkLnBvaW50Q2hhcmdlIC8gZG47XG4gICAgICAgICAgICBub2RlLnB4IC09IGR4ICogaztcbiAgICAgICAgICAgIG5vZGUucHkgLT0gZHkgKiBrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIXF1YWQuY2hhcmdlO1xuICAgICAgfTtcbiAgICB9XG4gICAgZm9yY2UudGljayA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKChhbHBoYSAqPSAuOTkpIDwgLjAwNSkge1xuICAgICAgICB0aW1lciA9IG51bGw7XG4gICAgICAgIGV2ZW50LmVuZCh7XG4gICAgICAgICAgdHlwZTogXCJlbmRcIixcbiAgICAgICAgICBhbHBoYTogYWxwaGEgPSAwXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBuID0gbm9kZXMubGVuZ3RoLCBtID0gbGlua3MubGVuZ3RoLCBxLCBpLCBvLCBzLCB0LCBsLCBrLCB4LCB5O1xuICAgICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkge1xuICAgICAgICBvID0gbGlua3NbaV07XG4gICAgICAgIHMgPSBvLnNvdXJjZTtcbiAgICAgICAgdCA9IG8udGFyZ2V0O1xuICAgICAgICB4ID0gdC54IC0gcy54O1xuICAgICAgICB5ID0gdC55IC0gcy55O1xuICAgICAgICBpZiAobCA9IHggKiB4ICsgeSAqIHkpIHtcbiAgICAgICAgICBsID0gYWxwaGEgKiBzdHJlbmd0aHNbaV0gKiAoKGwgPSBNYXRoLnNxcnQobCkpIC0gZGlzdGFuY2VzW2ldKSAvIGw7XG4gICAgICAgICAgeCAqPSBsO1xuICAgICAgICAgIHkgKj0gbDtcbiAgICAgICAgICB0LnggLT0geCAqIChrID0gcy53ZWlnaHQgKyB0LndlaWdodCA/IHMud2VpZ2h0IC8gKHMud2VpZ2h0ICsgdC53ZWlnaHQpIDogLjUpO1xuICAgICAgICAgIHQueSAtPSB5ICogaztcbiAgICAgICAgICBzLnggKz0geCAqIChrID0gMSAtIGspO1xuICAgICAgICAgIHMueSArPSB5ICogaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGsgPSBhbHBoYSAqIGdyYXZpdHkpIHtcbiAgICAgICAgeCA9IHNpemVbMF0gLyAyO1xuICAgICAgICB5ID0gc2l6ZVsxXSAvIDI7XG4gICAgICAgIGkgPSAtMTtcbiAgICAgICAgaWYgKGspIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgICAgbyA9IG5vZGVzW2ldO1xuICAgICAgICAgIG8ueCArPSAoeCAtIG8ueCkgKiBrO1xuICAgICAgICAgIG8ueSArPSAoeSAtIG8ueSkgKiBrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY2hhcmdlKSB7XG4gICAgICAgIGQzX2xheW91dF9mb3JjZUFjY3VtdWxhdGUocSA9IGQzLmdlb20ucXVhZHRyZWUobm9kZXMpLCBhbHBoYSwgY2hhcmdlcyk7XG4gICAgICAgIGkgPSAtMTtcbiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgICBpZiAoIShvID0gbm9kZXNbaV0pLmZpeGVkKSB7XG4gICAgICAgICAgICBxLnZpc2l0KHJlcHVsc2UobykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaSA9IC0xO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgbyA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAoby5maXhlZCkge1xuICAgICAgICAgIG8ueCA9IG8ucHg7XG4gICAgICAgICAgby55ID0gby5weTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvLnggLT0gKG8ucHggLSAoby5weCA9IG8ueCkpICogZnJpY3Rpb247XG4gICAgICAgICAgby55IC09IChvLnB5IC0gKG8ucHkgPSBvLnkpKSAqIGZyaWN0aW9uO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBldmVudC50aWNrKHtcbiAgICAgICAgdHlwZTogXCJ0aWNrXCIsXG4gICAgICAgIGFscGhhOiBhbHBoYVxuICAgICAgfSk7XG4gICAgfTtcbiAgICBmb3JjZS5ub2RlcyA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG5vZGVzO1xuICAgICAgbm9kZXMgPSB4O1xuICAgICAgcmV0dXJuIGZvcmNlO1xuICAgIH07XG4gICAgZm9yY2UubGlua3MgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsaW5rcztcbiAgICAgIGxpbmtzID0geDtcbiAgICAgIHJldHVybiBmb3JjZTtcbiAgICB9O1xuICAgIGZvcmNlLnNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplO1xuICAgICAgc2l6ZSA9IHg7XG4gICAgICByZXR1cm4gZm9yY2U7XG4gICAgfTtcbiAgICBmb3JjZS5saW5rRGlzdGFuY2UgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsaW5rRGlzdGFuY2U7XG4gICAgICBsaW5rRGlzdGFuY2UgPSB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geCA6ICt4O1xuICAgICAgcmV0dXJuIGZvcmNlO1xuICAgIH07XG4gICAgZm9yY2UuZGlzdGFuY2UgPSBmb3JjZS5saW5rRGlzdGFuY2U7XG4gICAgZm9yY2UubGlua1N0cmVuZ3RoID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbGlua1N0cmVuZ3RoO1xuICAgICAgbGlua1N0cmVuZ3RoID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiAreDtcbiAgICAgIHJldHVybiBmb3JjZTtcbiAgICB9O1xuICAgIGZvcmNlLmZyaWN0aW9uID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZnJpY3Rpb247XG4gICAgICBmcmljdGlvbiA9ICt4O1xuICAgICAgcmV0dXJuIGZvcmNlO1xuICAgIH07XG4gICAgZm9yY2UuY2hhcmdlID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2hhcmdlO1xuICAgICAgY2hhcmdlID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiAreDtcbiAgICAgIHJldHVybiBmb3JjZTtcbiAgICB9O1xuICAgIGZvcmNlLmNoYXJnZURpc3RhbmNlID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gTWF0aC5zcXJ0KGNoYXJnZURpc3RhbmNlMik7XG4gICAgICBjaGFyZ2VEaXN0YW5jZTIgPSB4ICogeDtcbiAgICAgIHJldHVybiBmb3JjZTtcbiAgICB9O1xuICAgIGZvcmNlLmdyYXZpdHkgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBncmF2aXR5O1xuICAgICAgZ3Jhdml0eSA9ICt4O1xuICAgICAgcmV0dXJuIGZvcmNlO1xuICAgIH07XG4gICAgZm9yY2UudGhldGEgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBNYXRoLnNxcnQodGhldGEyKTtcbiAgICAgIHRoZXRhMiA9IHggKiB4O1xuICAgICAgcmV0dXJuIGZvcmNlO1xuICAgIH07XG4gICAgZm9yY2UuYWxwaGEgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBhbHBoYTtcbiAgICAgIHggPSAreDtcbiAgICAgIGlmIChhbHBoYSkge1xuICAgICAgICBpZiAoeCA+IDApIHtcbiAgICAgICAgICBhbHBoYSA9IHg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGltZXIuYyA9IG51bGwsIHRpbWVyLnQgPSBOYU4sIHRpbWVyID0gbnVsbDtcbiAgICAgICAgICBldmVudC5lbmQoe1xuICAgICAgICAgICAgdHlwZTogXCJlbmRcIixcbiAgICAgICAgICAgIGFscGhhOiBhbHBoYSA9IDBcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh4ID4gMCkge1xuICAgICAgICBldmVudC5zdGFydCh7XG4gICAgICAgICAgdHlwZTogXCJzdGFydFwiLFxuICAgICAgICAgIGFscGhhOiBhbHBoYSA9IHhcbiAgICAgICAgfSk7XG4gICAgICAgIHRpbWVyID0gZDNfdGltZXIoZm9yY2UudGljayk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZm9yY2U7XG4gICAgfTtcbiAgICBmb3JjZS5zdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGgsIG0gPSBsaW5rcy5sZW5ndGgsIHcgPSBzaXplWzBdLCBoID0gc2l6ZVsxXSwgbmVpZ2hib3JzLCBvO1xuICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICAobyA9IG5vZGVzW2ldKS5pbmRleCA9IGk7XG4gICAgICAgIG8ud2VpZ2h0ID0gMDtcbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHtcbiAgICAgICAgbyA9IGxpbmtzW2ldO1xuICAgICAgICBpZiAodHlwZW9mIG8uc291cmNlID09IFwibnVtYmVyXCIpIG8uc291cmNlID0gbm9kZXNbby5zb3VyY2VdO1xuICAgICAgICBpZiAodHlwZW9mIG8udGFyZ2V0ID09IFwibnVtYmVyXCIpIG8udGFyZ2V0ID0gbm9kZXNbby50YXJnZXRdO1xuICAgICAgICArK28uc291cmNlLndlaWdodDtcbiAgICAgICAgKytvLnRhcmdldC53ZWlnaHQ7XG4gICAgICB9XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIG8gPSBub2Rlc1tpXTtcbiAgICAgICAgaWYgKGlzTmFOKG8ueCkpIG8ueCA9IHBvc2l0aW9uKFwieFwiLCB3KTtcbiAgICAgICAgaWYgKGlzTmFOKG8ueSkpIG8ueSA9IHBvc2l0aW9uKFwieVwiLCBoKTtcbiAgICAgICAgaWYgKGlzTmFOKG8ucHgpKSBvLnB4ID0gby54O1xuICAgICAgICBpZiAoaXNOYU4oby5weSkpIG8ucHkgPSBvLnk7XG4gICAgICB9XG4gICAgICBkaXN0YW5jZXMgPSBbXTtcbiAgICAgIGlmICh0eXBlb2YgbGlua0Rpc3RhbmNlID09PSBcImZ1bmN0aW9uXCIpIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIGRpc3RhbmNlc1tpXSA9ICtsaW5rRGlzdGFuY2UuY2FsbCh0aGlzLCBsaW5rc1tpXSwgaSk7IGVsc2UgZm9yIChpID0gMDsgaSA8IG07ICsraSkgZGlzdGFuY2VzW2ldID0gbGlua0Rpc3RhbmNlO1xuICAgICAgc3RyZW5ndGhzID0gW107XG4gICAgICBpZiAodHlwZW9mIGxpbmtTdHJlbmd0aCA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSBzdHJlbmd0aHNbaV0gPSArbGlua1N0cmVuZ3RoLmNhbGwodGhpcywgbGlua3NbaV0sIGkpOyBlbHNlIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHN0cmVuZ3Roc1tpXSA9IGxpbmtTdHJlbmd0aDtcbiAgICAgIGNoYXJnZXMgPSBbXTtcbiAgICAgIGlmICh0eXBlb2YgY2hhcmdlID09PSBcImZ1bmN0aW9uXCIpIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIGNoYXJnZXNbaV0gPSArY2hhcmdlLmNhbGwodGhpcywgbm9kZXNbaV0sIGkpOyBlbHNlIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIGNoYXJnZXNbaV0gPSBjaGFyZ2U7XG4gICAgICBmdW5jdGlvbiBwb3NpdGlvbihkaW1lbnNpb24sIHNpemUpIHtcbiAgICAgICAgaWYgKCFuZWlnaGJvcnMpIHtcbiAgICAgICAgICBuZWlnaGJvcnMgPSBuZXcgQXJyYXkobik7XG4gICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47ICsraikge1xuICAgICAgICAgICAgbmVpZ2hib3JzW2pdID0gW107XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICAgICAgICAgIHZhciBvID0gbGlua3Nbal07XG4gICAgICAgICAgICBuZWlnaGJvcnNbby5zb3VyY2UuaW5kZXhdLnB1c2goby50YXJnZXQpO1xuICAgICAgICAgICAgbmVpZ2hib3JzW28udGFyZ2V0LmluZGV4XS5wdXNoKG8uc291cmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGNhbmRpZGF0ZXMgPSBuZWlnaGJvcnNbaV0sIGogPSAtMSwgbCA9IGNhbmRpZGF0ZXMubGVuZ3RoLCB4O1xuICAgICAgICB3aGlsZSAoKytqIDwgbCkgaWYgKCFpc05hTih4ID0gY2FuZGlkYXRlc1tqXVtkaW1lbnNpb25dKSkgcmV0dXJuIHg7XG4gICAgICAgIHJldHVybiBNYXRoLnJhbmRvbSgpICogc2l6ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmb3JjZS5yZXN1bWUoKTtcbiAgICB9O1xuICAgIGZvcmNlLnJlc3VtZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZvcmNlLmFscGhhKC4xKTtcbiAgICB9O1xuICAgIGZvcmNlLnN0b3AgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBmb3JjZS5hbHBoYSgwKTtcbiAgICB9O1xuICAgIGZvcmNlLmRyYWcgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghZHJhZykgZHJhZyA9IGQzLmJlaGF2aW9yLmRyYWcoKS5vcmlnaW4oZDNfaWRlbnRpdHkpLm9uKFwiZHJhZ3N0YXJ0LmZvcmNlXCIsIGQzX2xheW91dF9mb3JjZURyYWdzdGFydCkub24oXCJkcmFnLmZvcmNlXCIsIGRyYWdtb3ZlKS5vbihcImRyYWdlbmQuZm9yY2VcIiwgZDNfbGF5b3V0X2ZvcmNlRHJhZ2VuZCk7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkcmFnO1xuICAgICAgdGhpcy5vbihcIm1vdXNlb3Zlci5mb3JjZVwiLCBkM19sYXlvdXRfZm9yY2VNb3VzZW92ZXIpLm9uKFwibW91c2VvdXQuZm9yY2VcIiwgZDNfbGF5b3V0X2ZvcmNlTW91c2VvdXQpLmNhbGwoZHJhZyk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBkcmFnbW92ZShkKSB7XG4gICAgICBkLnB4ID0gZDMuZXZlbnQueCwgZC5weSA9IGQzLmV2ZW50Lnk7XG4gICAgICBmb3JjZS5yZXN1bWUoKTtcbiAgICB9XG4gICAgcmV0dXJuIGQzLnJlYmluZChmb3JjZSwgZXZlbnQsIFwib25cIik7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9mb3JjZURyYWdzdGFydChkKSB7XG4gICAgZC5maXhlZCB8PSAyO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9mb3JjZURyYWdlbmQoZCkge1xuICAgIGQuZml4ZWQgJj0gfjY7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X2ZvcmNlTW91c2VvdmVyKGQpIHtcbiAgICBkLmZpeGVkIHw9IDQ7XG4gICAgZC5weCA9IGQueCwgZC5weSA9IGQueTtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VNb3VzZW91dChkKSB7XG4gICAgZC5maXhlZCAmPSB+NDtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VBY2N1bXVsYXRlKHF1YWQsIGFscGhhLCBjaGFyZ2VzKSB7XG4gICAgdmFyIGN4ID0gMCwgY3kgPSAwO1xuICAgIHF1YWQuY2hhcmdlID0gMDtcbiAgICBpZiAoIXF1YWQubGVhZikge1xuICAgICAgdmFyIG5vZGVzID0gcXVhZC5ub2RlcywgbiA9IG5vZGVzLmxlbmd0aCwgaSA9IC0xLCBjO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgYyA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAoYyA9PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgZDNfbGF5b3V0X2ZvcmNlQWNjdW11bGF0ZShjLCBhbHBoYSwgY2hhcmdlcyk7XG4gICAgICAgIHF1YWQuY2hhcmdlICs9IGMuY2hhcmdlO1xuICAgICAgICBjeCArPSBjLmNoYXJnZSAqIGMuY3g7XG4gICAgICAgIGN5ICs9IGMuY2hhcmdlICogYy5jeTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHF1YWQucG9pbnQpIHtcbiAgICAgIGlmICghcXVhZC5sZWFmKSB7XG4gICAgICAgIHF1YWQucG9pbnQueCArPSBNYXRoLnJhbmRvbSgpIC0gLjU7XG4gICAgICAgIHF1YWQucG9pbnQueSArPSBNYXRoLnJhbmRvbSgpIC0gLjU7XG4gICAgICB9XG4gICAgICB2YXIgayA9IGFscGhhICogY2hhcmdlc1txdWFkLnBvaW50LmluZGV4XTtcbiAgICAgIHF1YWQuY2hhcmdlICs9IHF1YWQucG9pbnRDaGFyZ2UgPSBrO1xuICAgICAgY3ggKz0gayAqIHF1YWQucG9pbnQueDtcbiAgICAgIGN5ICs9IGsgKiBxdWFkLnBvaW50Lnk7XG4gICAgfVxuICAgIHF1YWQuY3ggPSBjeCAvIHF1YWQuY2hhcmdlO1xuICAgIHF1YWQuY3kgPSBjeSAvIHF1YWQuY2hhcmdlO1xuICB9XG4gIHZhciBkM19sYXlvdXRfZm9yY2VMaW5rRGlzdGFuY2UgPSAyMCwgZDNfbGF5b3V0X2ZvcmNlTGlua1N0cmVuZ3RoID0gMSwgZDNfbGF5b3V0X2ZvcmNlQ2hhcmdlRGlzdGFuY2UyID0gSW5maW5pdHk7XG4gIGQzLmxheW91dC5oaWVyYXJjaHkgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc29ydCA9IGQzX2xheW91dF9oaWVyYXJjaHlTb3J0LCBjaGlsZHJlbiA9IGQzX2xheW91dF9oaWVyYXJjaHlDaGlsZHJlbiwgdmFsdWUgPSBkM19sYXlvdXRfaGllcmFyY2h5VmFsdWU7XG4gICAgZnVuY3Rpb24gaGllcmFyY2h5KHJvb3QpIHtcbiAgICAgIHZhciBzdGFjayA9IFsgcm9vdCBdLCBub2RlcyA9IFtdLCBub2RlO1xuICAgICAgcm9vdC5kZXB0aCA9IDA7XG4gICAgICB3aGlsZSAoKG5vZGUgPSBzdGFjay5wb3AoKSkgIT0gbnVsbCkge1xuICAgICAgICBub2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICBpZiAoKGNoaWxkcyA9IGNoaWxkcmVuLmNhbGwoaGllcmFyY2h5LCBub2RlLCBub2RlLmRlcHRoKSkgJiYgKG4gPSBjaGlsZHMubGVuZ3RoKSkge1xuICAgICAgICAgIHZhciBuLCBjaGlsZHMsIGNoaWxkO1xuICAgICAgICAgIHdoaWxlICgtLW4gPj0gMCkge1xuICAgICAgICAgICAgc3RhY2sucHVzaChjaGlsZCA9IGNoaWxkc1tuXSk7XG4gICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBub2RlO1xuICAgICAgICAgICAgY2hpbGQuZGVwdGggPSBub2RlLmRlcHRoICsgMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhbHVlKSBub2RlLnZhbHVlID0gMDtcbiAgICAgICAgICBub2RlLmNoaWxkcmVuID0gY2hpbGRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh2YWx1ZSkgbm9kZS52YWx1ZSA9ICt2YWx1ZS5jYWxsKGhpZXJhcmNoeSwgbm9kZSwgbm9kZS5kZXB0aCkgfHwgMDtcbiAgICAgICAgICBkZWxldGUgbm9kZS5jaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZDNfbGF5b3V0X2hpZXJhcmNoeVZpc2l0QWZ0ZXIocm9vdCwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICB2YXIgY2hpbGRzLCBwYXJlbnQ7XG4gICAgICAgIGlmIChzb3J0ICYmIChjaGlsZHMgPSBub2RlLmNoaWxkcmVuKSkgY2hpbGRzLnNvcnQoc29ydCk7XG4gICAgICAgIGlmICh2YWx1ZSAmJiAocGFyZW50ID0gbm9kZS5wYXJlbnQpKSBwYXJlbnQudmFsdWUgKz0gbm9kZS52YWx1ZTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5vZGVzO1xuICAgIH1cbiAgICBoaWVyYXJjaHkuc29ydCA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvcnQ7XG4gICAgICBzb3J0ID0geDtcbiAgICAgIHJldHVybiBoaWVyYXJjaHk7XG4gICAgfTtcbiAgICBoaWVyYXJjaHkuY2hpbGRyZW4gPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjaGlsZHJlbjtcbiAgICAgIGNoaWxkcmVuID0geDtcbiAgICAgIHJldHVybiBoaWVyYXJjaHk7XG4gICAgfTtcbiAgICBoaWVyYXJjaHkudmFsdWUgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB2YWx1ZTtcbiAgICAgIHZhbHVlID0geDtcbiAgICAgIHJldHVybiBoaWVyYXJjaHk7XG4gICAgfTtcbiAgICBoaWVyYXJjaHkucmV2YWx1ZSA9IGZ1bmN0aW9uKHJvb3QpIHtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRCZWZvcmUocm9vdCwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIGlmIChub2RlLmNoaWxkcmVuKSBub2RlLnZhbHVlID0gMDtcbiAgICAgICAgfSk7XG4gICAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEFmdGVyKHJvb3QsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICB2YXIgcGFyZW50O1xuICAgICAgICAgIGlmICghbm9kZS5jaGlsZHJlbikgbm9kZS52YWx1ZSA9ICt2YWx1ZS5jYWxsKGhpZXJhcmNoeSwgbm9kZSwgbm9kZS5kZXB0aCkgfHwgMDtcbiAgICAgICAgICBpZiAocGFyZW50ID0gbm9kZS5wYXJlbnQpIHBhcmVudC52YWx1ZSArPSBub2RlLnZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByb290O1xuICAgIH07XG4gICAgcmV0dXJuIGhpZXJhcmNoeTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfbGF5b3V0X2hpZXJhcmNoeVJlYmluZChvYmplY3QsIGhpZXJhcmNoeSkge1xuICAgIGQzLnJlYmluZChvYmplY3QsIGhpZXJhcmNoeSwgXCJzb3J0XCIsIFwiY2hpbGRyZW5cIiwgXCJ2YWx1ZVwiKTtcbiAgICBvYmplY3Qubm9kZXMgPSBvYmplY3Q7XG4gICAgb2JqZWN0LmxpbmtzID0gZDNfbGF5b3V0X2hpZXJhcmNoeUxpbmtzO1xuICAgIHJldHVybiBvYmplY3Q7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X2hpZXJhcmNoeVZpc2l0QmVmb3JlKG5vZGUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIG5vZGVzID0gWyBub2RlIF07XG4gICAgd2hpbGUgKChub2RlID0gbm9kZXMucG9wKCkpICE9IG51bGwpIHtcbiAgICAgIGNhbGxiYWNrKG5vZGUpO1xuICAgICAgaWYgKChjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4pICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSkge1xuICAgICAgICB2YXIgbiwgY2hpbGRyZW47XG4gICAgICAgIHdoaWxlICgtLW4gPj0gMCkgbm9kZXMucHVzaChjaGlsZHJlbltuXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEFmdGVyKG5vZGUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIG5vZGVzID0gWyBub2RlIF0sIG5vZGVzMiA9IFtdO1xuICAgIHdoaWxlICgobm9kZSA9IG5vZGVzLnBvcCgpKSAhPSBudWxsKSB7XG4gICAgICBub2RlczIucHVzaChub2RlKTtcbiAgICAgIGlmICgoY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuKSAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbiwgY2hpbGRyZW47XG4gICAgICAgIHdoaWxlICgrK2kgPCBuKSBub2Rlcy5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgd2hpbGUgKChub2RlID0gbm9kZXMyLnBvcCgpKSAhPSBudWxsKSB7XG4gICAgICBjYWxsYmFjayhub2RlKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X2hpZXJhcmNoeUNoaWxkcmVuKGQpIHtcbiAgICByZXR1cm4gZC5jaGlsZHJlbjtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfaGllcmFyY2h5VmFsdWUoZCkge1xuICAgIHJldHVybiBkLnZhbHVlO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlTb3J0KGEsIGIpIHtcbiAgICByZXR1cm4gYi52YWx1ZSAtIGEudmFsdWU7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X2hpZXJhcmNoeUxpbmtzKG5vZGVzKSB7XG4gICAgcmV0dXJuIGQzLm1lcmdlKG5vZGVzLm1hcChmdW5jdGlvbihwYXJlbnQpIHtcbiAgICAgIHJldHVybiAocGFyZW50LmNoaWxkcmVuIHx8IFtdKS5tYXAoZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzb3VyY2U6IHBhcmVudCxcbiAgICAgICAgICB0YXJnZXQ6IGNoaWxkXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9KSk7XG4gIH1cbiAgZDMubGF5b3V0LnBhcnRpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBoaWVyYXJjaHkgPSBkMy5sYXlvdXQuaGllcmFyY2h5KCksIHNpemUgPSBbIDEsIDEgXTtcbiAgICBmdW5jdGlvbiBwb3NpdGlvbihub2RlLCB4LCBkeCwgZHkpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgICBub2RlLnggPSB4O1xuICAgICAgbm9kZS55ID0gbm9kZS5kZXB0aCAqIGR5O1xuICAgICAgbm9kZS5keCA9IGR4O1xuICAgICAgbm9kZS5keSA9IGR5O1xuICAgICAgaWYgKGNoaWxkcmVuICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuLCBjLCBkO1xuICAgICAgICBkeCA9IG5vZGUudmFsdWUgPyBkeCAvIG5vZGUudmFsdWUgOiAwO1xuICAgICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICAgIHBvc2l0aW9uKGMgPSBjaGlsZHJlbltpXSwgeCwgZCA9IGMudmFsdWUgKiBkeCwgZHkpO1xuICAgICAgICAgIHggKz0gZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBkZXB0aChub2RlKSB7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLCBkID0gMDtcbiAgICAgIGlmIChjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbjtcbiAgICAgICAgd2hpbGUgKCsraSA8IG4pIGQgPSBNYXRoLm1heChkLCBkZXB0aChjaGlsZHJlbltpXSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIDEgKyBkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwYXJ0aXRpb24oZCwgaSkge1xuICAgICAgdmFyIG5vZGVzID0gaGllcmFyY2h5LmNhbGwodGhpcywgZCwgaSk7XG4gICAgICBwb3NpdGlvbihub2Rlc1swXSwgMCwgc2l6ZVswXSwgc2l6ZVsxXSAvIGRlcHRoKG5vZGVzWzBdKSk7XG4gICAgICByZXR1cm4gbm9kZXM7XG4gICAgfVxuICAgIHBhcnRpdGlvbi5zaXplID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2l6ZTtcbiAgICAgIHNpemUgPSB4O1xuICAgICAgcmV0dXJuIHBhcnRpdGlvbjtcbiAgICB9O1xuICAgIHJldHVybiBkM19sYXlvdXRfaGllcmFyY2h5UmViaW5kKHBhcnRpdGlvbiwgaGllcmFyY2h5KTtcbiAgfTtcbiAgZDMubGF5b3V0LnBpZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZSA9IE51bWJlciwgc29ydCA9IGQzX2xheW91dF9waWVTb3J0QnlWYWx1ZSwgc3RhcnRBbmdsZSA9IDAsIGVuZEFuZ2xlID0gz4QsIHBhZEFuZ2xlID0gMDtcbiAgICBmdW5jdGlvbiBwaWUoZGF0YSkge1xuICAgICAgdmFyIG4gPSBkYXRhLmxlbmd0aCwgdmFsdWVzID0gZGF0YS5tYXAoZnVuY3Rpb24oZCwgaSkge1xuICAgICAgICByZXR1cm4gK3ZhbHVlLmNhbGwocGllLCBkLCBpKTtcbiAgICAgIH0pLCBhID0gKyh0eXBlb2Ygc3RhcnRBbmdsZSA9PT0gXCJmdW5jdGlvblwiID8gc3RhcnRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogc3RhcnRBbmdsZSksIGRhID0gKHR5cGVvZiBlbmRBbmdsZSA9PT0gXCJmdW5jdGlvblwiID8gZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGVuZEFuZ2xlKSAtIGEsIHAgPSBNYXRoLm1pbihNYXRoLmFicyhkYSkgLyBuLCArKHR5cGVvZiBwYWRBbmdsZSA9PT0gXCJmdW5jdGlvblwiID8gcGFkQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHBhZEFuZ2xlKSksIHBhID0gcCAqIChkYSA8IDAgPyAtMSA6IDEpLCBzdW0gPSBkMy5zdW0odmFsdWVzKSwgayA9IHN1bSA/IChkYSAtIG4gKiBwYSkgLyBzdW0gOiAwLCBpbmRleCA9IGQzLnJhbmdlKG4pLCBhcmNzID0gW10sIHY7XG4gICAgICBpZiAoc29ydCAhPSBudWxsKSBpbmRleC5zb3J0KHNvcnQgPT09IGQzX2xheW91dF9waWVTb3J0QnlWYWx1ZSA/IGZ1bmN0aW9uKGksIGopIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlc1tqXSAtIHZhbHVlc1tpXTtcbiAgICAgIH0gOiBmdW5jdGlvbihpLCBqKSB7XG4gICAgICAgIHJldHVybiBzb3J0KGRhdGFbaV0sIGRhdGFbal0pO1xuICAgICAgfSk7XG4gICAgICBpbmRleC5mb3JFYWNoKGZ1bmN0aW9uKGkpIHtcbiAgICAgICAgYXJjc1tpXSA9IHtcbiAgICAgICAgICBkYXRhOiBkYXRhW2ldLFxuICAgICAgICAgIHZhbHVlOiB2ID0gdmFsdWVzW2ldLFxuICAgICAgICAgIHN0YXJ0QW5nbGU6IGEsXG4gICAgICAgICAgZW5kQW5nbGU6IGEgKz0gdiAqIGsgKyBwYSxcbiAgICAgICAgICBwYWRBbmdsZTogcFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gYXJjcztcbiAgICB9XG4gICAgcGllLnZhbHVlID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdmFsdWU7XG4gICAgICB2YWx1ZSA9IF87XG4gICAgICByZXR1cm4gcGllO1xuICAgIH07XG4gICAgcGllLnNvcnQgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3J0O1xuICAgICAgc29ydCA9IF87XG4gICAgICByZXR1cm4gcGllO1xuICAgIH07XG4gICAgcGllLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzdGFydEFuZ2xlO1xuICAgICAgc3RhcnRBbmdsZSA9IF87XG4gICAgICByZXR1cm4gcGllO1xuICAgIH07XG4gICAgcGllLmVuZEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZW5kQW5nbGU7XG4gICAgICBlbmRBbmdsZSA9IF87XG4gICAgICByZXR1cm4gcGllO1xuICAgIH07XG4gICAgcGllLnBhZEFuZ2xlID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcGFkQW5nbGU7XG4gICAgICBwYWRBbmdsZSA9IF87XG4gICAgICByZXR1cm4gcGllO1xuICAgIH07XG4gICAgcmV0dXJuIHBpZTtcbiAgfTtcbiAgdmFyIGQzX2xheW91dF9waWVTb3J0QnlWYWx1ZSA9IHt9O1xuICBkMy5sYXlvdXQuc3RhY2sgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdmFsdWVzID0gZDNfaWRlbnRpdHksIG9yZGVyID0gZDNfbGF5b3V0X3N0YWNrT3JkZXJEZWZhdWx0LCBvZmZzZXQgPSBkM19sYXlvdXRfc3RhY2tPZmZzZXRaZXJvLCBvdXQgPSBkM19sYXlvdXRfc3RhY2tPdXQsIHggPSBkM19sYXlvdXRfc3RhY2tYLCB5ID0gZDNfbGF5b3V0X3N0YWNrWTtcbiAgICBmdW5jdGlvbiBzdGFjayhkYXRhLCBpbmRleCkge1xuICAgICAgaWYgKCEobiA9IGRhdGEubGVuZ3RoKSkgcmV0dXJuIGRhdGE7XG4gICAgICB2YXIgc2VyaWVzID0gZGF0YS5tYXAoZnVuY3Rpb24oZCwgaSkge1xuICAgICAgICByZXR1cm4gdmFsdWVzLmNhbGwoc3RhY2ssIGQsIGkpO1xuICAgICAgfSk7XG4gICAgICB2YXIgcG9pbnRzID0gc2VyaWVzLm1hcChmdW5jdGlvbihkKSB7XG4gICAgICAgIHJldHVybiBkLm1hcChmdW5jdGlvbih2LCBpKSB7XG4gICAgICAgICAgcmV0dXJuIFsgeC5jYWxsKHN0YWNrLCB2LCBpKSwgeS5jYWxsKHN0YWNrLCB2LCBpKSBdO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgdmFyIG9yZGVycyA9IG9yZGVyLmNhbGwoc3RhY2ssIHBvaW50cywgaW5kZXgpO1xuICAgICAgc2VyaWVzID0gZDMucGVybXV0ZShzZXJpZXMsIG9yZGVycyk7XG4gICAgICBwb2ludHMgPSBkMy5wZXJtdXRlKHBvaW50cywgb3JkZXJzKTtcbiAgICAgIHZhciBvZmZzZXRzID0gb2Zmc2V0LmNhbGwoc3RhY2ssIHBvaW50cywgaW5kZXgpO1xuICAgICAgdmFyIG0gPSBzZXJpZXNbMF0ubGVuZ3RoLCBuLCBpLCBqLCBvO1xuICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikge1xuICAgICAgICBvdXQuY2FsbChzdGFjaywgc2VyaWVzWzBdW2pdLCBvID0gb2Zmc2V0c1tqXSwgcG9pbnRzWzBdW2pdWzFdKTtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IG47ICsraSkge1xuICAgICAgICAgIG91dC5jYWxsKHN0YWNrLCBzZXJpZXNbaV1bal0sIG8gKz0gcG9pbnRzW2kgLSAxXVtqXVsxXSwgcG9pbnRzW2ldW2pdWzFdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIHN0YWNrLnZhbHVlcyA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHZhbHVlcztcbiAgICAgIHZhbHVlcyA9IHg7XG4gICAgICByZXR1cm4gc3RhY2s7XG4gICAgfTtcbiAgICBzdGFjay5vcmRlciA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG9yZGVyO1xuICAgICAgb3JkZXIgPSB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geCA6IGQzX2xheW91dF9zdGFja09yZGVycy5nZXQoeCkgfHwgZDNfbGF5b3V0X3N0YWNrT3JkZXJEZWZhdWx0O1xuICAgICAgcmV0dXJuIHN0YWNrO1xuICAgIH07XG4gICAgc3RhY2sub2Zmc2V0ID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb2Zmc2V0O1xuICAgICAgb2Zmc2V0ID0gdHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIiA/IHggOiBkM19sYXlvdXRfc3RhY2tPZmZzZXRzLmdldCh4KSB8fCBkM19sYXlvdXRfc3RhY2tPZmZzZXRaZXJvO1xuICAgICAgcmV0dXJuIHN0YWNrO1xuICAgIH07XG4gICAgc3RhY2sueCA9IGZ1bmN0aW9uKHopIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHg7XG4gICAgICB4ID0gejtcbiAgICAgIHJldHVybiBzdGFjaztcbiAgICB9O1xuICAgIHN0YWNrLnkgPSBmdW5jdGlvbih6KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5O1xuICAgICAgeSA9IHo7XG4gICAgICByZXR1cm4gc3RhY2s7XG4gICAgfTtcbiAgICBzdGFjay5vdXQgPSBmdW5jdGlvbih6KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvdXQ7XG4gICAgICBvdXQgPSB6O1xuICAgICAgcmV0dXJuIHN0YWNrO1xuICAgIH07XG4gICAgcmV0dXJuIHN0YWNrO1xuICB9O1xuICBmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tYKGQpIHtcbiAgICByZXR1cm4gZC54O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9zdGFja1koZCkge1xuICAgIHJldHVybiBkLnk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrT3V0KGQsIHkwLCB5KSB7XG4gICAgZC55MCA9IHkwO1xuICAgIGQueSA9IHk7XG4gIH1cbiAgdmFyIGQzX2xheW91dF9zdGFja09yZGVycyA9IGQzLm1hcCh7XG4gICAgXCJpbnNpZGUtb3V0XCI6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgIHZhciBuID0gZGF0YS5sZW5ndGgsIGksIGosIG1heCA9IGRhdGEubWFwKGQzX2xheW91dF9zdGFja01heEluZGV4KSwgc3VtcyA9IGRhdGEubWFwKGQzX2xheW91dF9zdGFja1JlZHVjZVN1bSksIGluZGV4ID0gZDMucmFuZ2Uobikuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgIHJldHVybiBtYXhbYV0gLSBtYXhbYl07XG4gICAgICB9KSwgdG9wID0gMCwgYm90dG9tID0gMCwgdG9wcyA9IFtdLCBib3R0b21zID0gW107XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIGogPSBpbmRleFtpXTtcbiAgICAgICAgaWYgKHRvcCA8IGJvdHRvbSkge1xuICAgICAgICAgIHRvcCArPSBzdW1zW2pdO1xuICAgICAgICAgIHRvcHMucHVzaChqKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBib3R0b20gKz0gc3Vtc1tqXTtcbiAgICAgICAgICBib3R0b21zLnB1c2goaik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBib3R0b21zLnJldmVyc2UoKS5jb25jYXQodG9wcyk7XG4gICAgfSxcbiAgICByZXZlcnNlOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICByZXR1cm4gZDMucmFuZ2UoZGF0YS5sZW5ndGgpLnJldmVyc2UoKTtcbiAgICB9LFxuICAgIFwiZGVmYXVsdFwiOiBkM19sYXlvdXRfc3RhY2tPcmRlckRlZmF1bHRcbiAgfSk7XG4gIHZhciBkM19sYXlvdXRfc3RhY2tPZmZzZXRzID0gZDMubWFwKHtcbiAgICBzaWxob3VldHRlOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLCBtID0gZGF0YVswXS5sZW5ndGgsIHN1bXMgPSBbXSwgbWF4ID0gMCwgaSwgaiwgbywgeTAgPSBbXTtcbiAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICAgICAgZm9yIChpID0gMCwgbyA9IDA7IGkgPCBuOyBpKyspIG8gKz0gZGF0YVtpXVtqXVsxXTtcbiAgICAgICAgaWYgKG8gPiBtYXgpIG1heCA9IG87XG4gICAgICAgIHN1bXMucHVzaChvKTtcbiAgICAgIH1cbiAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICAgICAgeTBbal0gPSAobWF4IC0gc3Vtc1tqXSkgLyAyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHkwO1xuICAgIH0sXG4gICAgd2lnZ2xlOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLCB4ID0gZGF0YVswXSwgbSA9IHgubGVuZ3RoLCBpLCBqLCBrLCBzMSwgczIsIHMzLCBkeCwgbywgbzAsIHkwID0gW107XG4gICAgICB5MFswXSA9IG8gPSBvMCA9IDA7XG4gICAgICBmb3IgKGogPSAxOyBqIDwgbTsgKytqKSB7XG4gICAgICAgIGZvciAoaSA9IDAsIHMxID0gMDsgaSA8IG47ICsraSkgczEgKz0gZGF0YVtpXVtqXVsxXTtcbiAgICAgICAgZm9yIChpID0gMCwgczIgPSAwLCBkeCA9IHhbal1bMF0gLSB4W2ogLSAxXVswXTsgaSA8IG47ICsraSkge1xuICAgICAgICAgIGZvciAoayA9IDAsIHMzID0gKGRhdGFbaV1bal1bMV0gLSBkYXRhW2ldW2ogLSAxXVsxXSkgLyAoMiAqIGR4KTsgayA8IGk7ICsraykge1xuICAgICAgICAgICAgczMgKz0gKGRhdGFba11bal1bMV0gLSBkYXRhW2tdW2ogLSAxXVsxXSkgLyBkeDtcbiAgICAgICAgICB9XG4gICAgICAgICAgczIgKz0gczMgKiBkYXRhW2ldW2pdWzFdO1xuICAgICAgICB9XG4gICAgICAgIHkwW2pdID0gbyAtPSBzMSA/IHMyIC8gczEgKiBkeCA6IDA7XG4gICAgICAgIGlmIChvIDwgbzApIG8wID0gbztcbiAgICAgIH1cbiAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHkwW2pdIC09IG8wO1xuICAgICAgcmV0dXJuIHkwO1xuICAgIH0sXG4gICAgZXhwYW5kOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLCBtID0gZGF0YVswXS5sZW5ndGgsIGsgPSAxIC8gbiwgaSwgaiwgbywgeTAgPSBbXTtcbiAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHtcbiAgICAgICAgZm9yIChpID0gMCwgbyA9IDA7IGkgPCBuOyBpKyspIG8gKz0gZGF0YVtpXVtqXVsxXTtcbiAgICAgICAgaWYgKG8pIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIGRhdGFbaV1bal1bMV0gLz0gbzsgZWxzZSBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSBkYXRhW2ldW2pdWzFdID0gaztcbiAgICAgIH1cbiAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHkwW2pdID0gMDtcbiAgICAgIHJldHVybiB5MDtcbiAgICB9LFxuICAgIHplcm86IGQzX2xheW91dF9zdGFja09mZnNldFplcm9cbiAgfSk7XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9zdGFja09yZGVyRGVmYXVsdChkYXRhKSB7XG4gICAgcmV0dXJuIGQzLnJhbmdlKGRhdGEubGVuZ3RoKTtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tPZmZzZXRaZXJvKGRhdGEpIHtcbiAgICB2YXIgaiA9IC0xLCBtID0gZGF0YVswXS5sZW5ndGgsIHkwID0gW107XG4gICAgd2hpbGUgKCsraiA8IG0pIHkwW2pdID0gMDtcbiAgICByZXR1cm4geTA7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrTWF4SW5kZXgoYXJyYXkpIHtcbiAgICB2YXIgaSA9IDEsIGogPSAwLCB2ID0gYXJyYXlbMF1bMV0sIGssIG4gPSBhcnJheS5sZW5ndGg7XG4gICAgZm9yICg7aSA8IG47ICsraSkge1xuICAgICAgaWYgKChrID0gYXJyYXlbaV1bMV0pID4gdikge1xuICAgICAgICBqID0gaTtcbiAgICAgICAgdiA9IGs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBqO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9zdGFja1JlZHVjZVN1bShkKSB7XG4gICAgcmV0dXJuIGQucmVkdWNlKGQzX2xheW91dF9zdGFja1N1bSwgMCk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrU3VtKHAsIGQpIHtcbiAgICByZXR1cm4gcCArIGRbMV07XG4gIH1cbiAgZDMubGF5b3V0Lmhpc3RvZ3JhbSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBmcmVxdWVuY3kgPSB0cnVlLCB2YWx1ZXIgPSBOdW1iZXIsIHJhbmdlciA9IGQzX2xheW91dF9oaXN0b2dyYW1SYW5nZSwgYmlubmVyID0gZDNfbGF5b3V0X2hpc3RvZ3JhbUJpblN0dXJnZXM7XG4gICAgZnVuY3Rpb24gaGlzdG9ncmFtKGRhdGEsIGkpIHtcbiAgICAgIHZhciBiaW5zID0gW10sIHZhbHVlcyA9IGRhdGEubWFwKHZhbHVlciwgdGhpcyksIHJhbmdlID0gcmFuZ2VyLmNhbGwodGhpcywgdmFsdWVzLCBpKSwgdGhyZXNob2xkcyA9IGJpbm5lci5jYWxsKHRoaXMsIHJhbmdlLCB2YWx1ZXMsIGkpLCBiaW4sIGkgPSAtMSwgbiA9IHZhbHVlcy5sZW5ndGgsIG0gPSB0aHJlc2hvbGRzLmxlbmd0aCAtIDEsIGsgPSBmcmVxdWVuY3kgPyAxIDogMSAvIG4sIHg7XG4gICAgICB3aGlsZSAoKytpIDwgbSkge1xuICAgICAgICBiaW4gPSBiaW5zW2ldID0gW107XG4gICAgICAgIGJpbi5keCA9IHRocmVzaG9sZHNbaSArIDFdIC0gKGJpbi54ID0gdGhyZXNob2xkc1tpXSk7XG4gICAgICAgIGJpbi55ID0gMDtcbiAgICAgIH1cbiAgICAgIGlmIChtID4gMCkge1xuICAgICAgICBpID0gLTE7XG4gICAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgICAgeCA9IHZhbHVlc1tpXTtcbiAgICAgICAgICBpZiAoeCA+PSByYW5nZVswXSAmJiB4IDw9IHJhbmdlWzFdKSB7XG4gICAgICAgICAgICBiaW4gPSBiaW5zW2QzLmJpc2VjdCh0aHJlc2hvbGRzLCB4LCAxLCBtKSAtIDFdO1xuICAgICAgICAgICAgYmluLnkgKz0gaztcbiAgICAgICAgICAgIGJpbi5wdXNoKGRhdGFbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGJpbnM7XG4gICAgfVxuICAgIGhpc3RvZ3JhbS52YWx1ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHZhbHVlcjtcbiAgICAgIHZhbHVlciA9IHg7XG4gICAgICByZXR1cm4gaGlzdG9ncmFtO1xuICAgIH07XG4gICAgaGlzdG9ncmFtLnJhbmdlID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFuZ2VyO1xuICAgICAgcmFuZ2VyID0gZDNfZnVuY3Rvcih4KTtcbiAgICAgIHJldHVybiBoaXN0b2dyYW07XG4gICAgfTtcbiAgICBoaXN0b2dyYW0uYmlucyA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGJpbm5lcjtcbiAgICAgIGJpbm5lciA9IHR5cGVvZiB4ID09PSBcIm51bWJlclwiID8gZnVuY3Rpb24ocmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIGQzX2xheW91dF9oaXN0b2dyYW1CaW5GaXhlZChyYW5nZSwgeCk7XG4gICAgICB9IDogZDNfZnVuY3Rvcih4KTtcbiAgICAgIHJldHVybiBoaXN0b2dyYW07XG4gICAgfTtcbiAgICBoaXN0b2dyYW0uZnJlcXVlbmN5ID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZnJlcXVlbmN5O1xuICAgICAgZnJlcXVlbmN5ID0gISF4O1xuICAgICAgcmV0dXJuIGhpc3RvZ3JhbTtcbiAgICB9O1xuICAgIHJldHVybiBoaXN0b2dyYW07XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9oaXN0b2dyYW1CaW5TdHVyZ2VzKHJhbmdlLCB2YWx1ZXMpIHtcbiAgICByZXR1cm4gZDNfbGF5b3V0X2hpc3RvZ3JhbUJpbkZpeGVkKHJhbmdlLCBNYXRoLmNlaWwoTWF0aC5sb2codmFsdWVzLmxlbmd0aCkgLyBNYXRoLkxOMiArIDEpKTtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfaGlzdG9ncmFtQmluRml4ZWQocmFuZ2UsIG4pIHtcbiAgICB2YXIgeCA9IC0xLCBiID0gK3JhbmdlWzBdLCBtID0gKHJhbmdlWzFdIC0gYikgLyBuLCBmID0gW107XG4gICAgd2hpbGUgKCsreCA8PSBuKSBmW3hdID0gbSAqIHggKyBiO1xuICAgIHJldHVybiBmO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9oaXN0b2dyYW1SYW5nZSh2YWx1ZXMpIHtcbiAgICByZXR1cm4gWyBkMy5taW4odmFsdWVzKSwgZDMubWF4KHZhbHVlcykgXTtcbiAgfVxuICBkMy5sYXlvdXQucGFjayA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBoaWVyYXJjaHkgPSBkMy5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChkM19sYXlvdXRfcGFja1NvcnQpLCBwYWRkaW5nID0gMCwgc2l6ZSA9IFsgMSwgMSBdLCByYWRpdXM7XG4gICAgZnVuY3Rpb24gcGFjayhkLCBpKSB7XG4gICAgICB2YXIgbm9kZXMgPSBoaWVyYXJjaHkuY2FsbCh0aGlzLCBkLCBpKSwgcm9vdCA9IG5vZGVzWzBdLCB3ID0gc2l6ZVswXSwgaCA9IHNpemVbMV0sIHIgPSByYWRpdXMgPT0gbnVsbCA/IE1hdGguc3FydCA6IHR5cGVvZiByYWRpdXMgPT09IFwiZnVuY3Rpb25cIiA/IHJhZGl1cyA6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gcmFkaXVzO1xuICAgICAgfTtcbiAgICAgIHJvb3QueCA9IHJvb3QueSA9IDA7XG4gICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRBZnRlcihyb290LCBmdW5jdGlvbihkKSB7XG4gICAgICAgIGQuciA9ICtyKGQudmFsdWUpO1xuICAgICAgfSk7XG4gICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRBZnRlcihyb290LCBkM19sYXlvdXRfcGFja1NpYmxpbmdzKTtcbiAgICAgIGlmIChwYWRkaW5nKSB7XG4gICAgICAgIHZhciBkciA9IHBhZGRpbmcgKiAocmFkaXVzID8gMSA6IE1hdGgubWF4KDIgKiByb290LnIgLyB3LCAyICogcm9vdC5yIC8gaCkpIC8gMjtcbiAgICAgICAgZDNfbGF5b3V0X2hpZXJhcmNoeVZpc2l0QWZ0ZXIocm9vdCwgZnVuY3Rpb24oZCkge1xuICAgICAgICAgIGQuciArPSBkcjtcbiAgICAgICAgfSk7XG4gICAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEFmdGVyKHJvb3QsIGQzX2xheW91dF9wYWNrU2libGluZ3MpO1xuICAgICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRBZnRlcihyb290LCBmdW5jdGlvbihkKSB7XG4gICAgICAgICAgZC5yIC09IGRyO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGQzX2xheW91dF9wYWNrVHJhbnNmb3JtKHJvb3QsIHcgLyAyLCBoIC8gMiwgcmFkaXVzID8gMSA6IDEgLyBNYXRoLm1heCgyICogcm9vdC5yIC8gdywgMiAqIHJvb3QuciAvIGgpKTtcbiAgICAgIHJldHVybiBub2RlcztcbiAgICB9XG4gICAgcGFjay5zaXplID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2l6ZTtcbiAgICAgIHNpemUgPSBfO1xuICAgICAgcmV0dXJuIHBhY2s7XG4gICAgfTtcbiAgICBwYWNrLnJhZGl1cyA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhZGl1cztcbiAgICAgIHJhZGl1cyA9IF8gPT0gbnVsbCB8fCB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gXyA6ICtfO1xuICAgICAgcmV0dXJuIHBhY2s7XG4gICAgfTtcbiAgICBwYWNrLnBhZGRpbmcgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwYWRkaW5nO1xuICAgICAgcGFkZGluZyA9ICtfO1xuICAgICAgcmV0dXJuIHBhY2s7XG4gICAgfTtcbiAgICByZXR1cm4gZDNfbGF5b3V0X2hpZXJhcmNoeVJlYmluZChwYWNrLCBoaWVyYXJjaHkpO1xuICB9O1xuICBmdW5jdGlvbiBkM19sYXlvdXRfcGFja1NvcnQoYSwgYikge1xuICAgIHJldHVybiBhLnZhbHVlIC0gYi52YWx1ZTtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfcGFja0luc2VydChhLCBiKSB7XG4gICAgdmFyIGMgPSBhLl9wYWNrX25leHQ7XG4gICAgYS5fcGFja19uZXh0ID0gYjtcbiAgICBiLl9wYWNrX3ByZXYgPSBhO1xuICAgIGIuX3BhY2tfbmV4dCA9IGM7XG4gICAgYy5fcGFja19wcmV2ID0gYjtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfcGFja1NwbGljZShhLCBiKSB7XG4gICAgYS5fcGFja19uZXh0ID0gYjtcbiAgICBiLl9wYWNrX3ByZXYgPSBhO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9wYWNrSW50ZXJzZWN0cyhhLCBiKSB7XG4gICAgdmFyIGR4ID0gYi54IC0gYS54LCBkeSA9IGIueSAtIGEueSwgZHIgPSBhLnIgKyBiLnI7XG4gICAgcmV0dXJuIC45OTkgKiBkciAqIGRyID4gZHggKiBkeCArIGR5ICogZHk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tTaWJsaW5ncyhub2RlKSB7XG4gICAgaWYgKCEobm9kZXMgPSBub2RlLmNoaWxkcmVuKSB8fCAhKG4gPSBub2Rlcy5sZW5ndGgpKSByZXR1cm47XG4gICAgdmFyIG5vZGVzLCB4TWluID0gSW5maW5pdHksIHhNYXggPSAtSW5maW5pdHksIHlNaW4gPSBJbmZpbml0eSwgeU1heCA9IC1JbmZpbml0eSwgYSwgYiwgYywgaSwgaiwgaywgbjtcbiAgICBmdW5jdGlvbiBib3VuZChub2RlKSB7XG4gICAgICB4TWluID0gTWF0aC5taW4obm9kZS54IC0gbm9kZS5yLCB4TWluKTtcbiAgICAgIHhNYXggPSBNYXRoLm1heChub2RlLnggKyBub2RlLnIsIHhNYXgpO1xuICAgICAgeU1pbiA9IE1hdGgubWluKG5vZGUueSAtIG5vZGUuciwgeU1pbik7XG4gICAgICB5TWF4ID0gTWF0aC5tYXgobm9kZS55ICsgbm9kZS5yLCB5TWF4KTtcbiAgICB9XG4gICAgbm9kZXMuZm9yRWFjaChkM19sYXlvdXRfcGFja0xpbmspO1xuICAgIGEgPSBub2Rlc1swXTtcbiAgICBhLnggPSAtYS5yO1xuICAgIGEueSA9IDA7XG4gICAgYm91bmQoYSk7XG4gICAgaWYgKG4gPiAxKSB7XG4gICAgICBiID0gbm9kZXNbMV07XG4gICAgICBiLnggPSBiLnI7XG4gICAgICBiLnkgPSAwO1xuICAgICAgYm91bmQoYik7XG4gICAgICBpZiAobiA+IDIpIHtcbiAgICAgICAgYyA9IG5vZGVzWzJdO1xuICAgICAgICBkM19sYXlvdXRfcGFja1BsYWNlKGEsIGIsIGMpO1xuICAgICAgICBib3VuZChjKTtcbiAgICAgICAgZDNfbGF5b3V0X3BhY2tJbnNlcnQoYSwgYyk7XG4gICAgICAgIGEuX3BhY2tfcHJldiA9IGM7XG4gICAgICAgIGQzX2xheW91dF9wYWNrSW5zZXJ0KGMsIGIpO1xuICAgICAgICBiID0gYS5fcGFja19uZXh0O1xuICAgICAgICBmb3IgKGkgPSAzOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgZDNfbGF5b3V0X3BhY2tQbGFjZShhLCBiLCBjID0gbm9kZXNbaV0pO1xuICAgICAgICAgIHZhciBpc2VjdCA9IDAsIHMxID0gMSwgczIgPSAxO1xuICAgICAgICAgIGZvciAoaiA9IGIuX3BhY2tfbmV4dDsgaiAhPT0gYjsgaiA9IGouX3BhY2tfbmV4dCwgczErKykge1xuICAgICAgICAgICAgaWYgKGQzX2xheW91dF9wYWNrSW50ZXJzZWN0cyhqLCBjKSkge1xuICAgICAgICAgICAgICBpc2VjdCA9IDE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNlY3QgPT0gMSkge1xuICAgICAgICAgICAgZm9yIChrID0gYS5fcGFja19wcmV2OyBrICE9PSBqLl9wYWNrX3ByZXY7IGsgPSBrLl9wYWNrX3ByZXYsIHMyKyspIHtcbiAgICAgICAgICAgICAgaWYgKGQzX2xheW91dF9wYWNrSW50ZXJzZWN0cyhrLCBjKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc2VjdCkge1xuICAgICAgICAgICAgaWYgKHMxIDwgczIgfHwgczEgPT0gczIgJiYgYi5yIDwgYS5yKSBkM19sYXlvdXRfcGFja1NwbGljZShhLCBiID0gaik7IGVsc2UgZDNfbGF5b3V0X3BhY2tTcGxpY2UoYSA9IGssIGIpO1xuICAgICAgICAgICAgaS0tO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkM19sYXlvdXRfcGFja0luc2VydChhLCBjKTtcbiAgICAgICAgICAgIGIgPSBjO1xuICAgICAgICAgICAgYm91bmQoYyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBjeCA9ICh4TWluICsgeE1heCkgLyAyLCBjeSA9ICh5TWluICsgeU1heCkgLyAyLCBjciA9IDA7XG4gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgYyA9IG5vZGVzW2ldO1xuICAgICAgYy54IC09IGN4O1xuICAgICAgYy55IC09IGN5O1xuICAgICAgY3IgPSBNYXRoLm1heChjciwgYy5yICsgTWF0aC5zcXJ0KGMueCAqIGMueCArIGMueSAqIGMueSkpO1xuICAgIH1cbiAgICBub2RlLnIgPSBjcjtcbiAgICBub2Rlcy5mb3JFYWNoKGQzX2xheW91dF9wYWNrVW5saW5rKTtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfcGFja0xpbmsobm9kZSkge1xuICAgIG5vZGUuX3BhY2tfbmV4dCA9IG5vZGUuX3BhY2tfcHJldiA9IG5vZGU7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tVbmxpbmsobm9kZSkge1xuICAgIGRlbGV0ZSBub2RlLl9wYWNrX25leHQ7XG4gICAgZGVsZXRlIG5vZGUuX3BhY2tfcHJldjtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfcGFja1RyYW5zZm9ybShub2RlLCB4LCB5LCBrKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICBub2RlLnggPSB4ICs9IGsgKiBub2RlLng7XG4gICAgbm9kZS55ID0geSArPSBrICogbm9kZS55O1xuICAgIG5vZGUuciAqPSBrO1xuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgdmFyIGkgPSAtMSwgbiA9IGNoaWxkcmVuLmxlbmd0aDtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBkM19sYXlvdXRfcGFja1RyYW5zZm9ybShjaGlsZHJlbltpXSwgeCwgeSwgayk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9wYWNrUGxhY2UoYSwgYiwgYykge1xuICAgIHZhciBkYiA9IGEuciArIGMuciwgZHggPSBiLnggLSBhLngsIGR5ID0gYi55IC0gYS55O1xuICAgIGlmIChkYiAmJiAoZHggfHwgZHkpKSB7XG4gICAgICB2YXIgZGEgPSBiLnIgKyBjLnIsIGRjID0gZHggKiBkeCArIGR5ICogZHk7XG4gICAgICBkYSAqPSBkYTtcbiAgICAgIGRiICo9IGRiO1xuICAgICAgdmFyIHggPSAuNSArIChkYiAtIGRhKSAvICgyICogZGMpLCB5ID0gTWF0aC5zcXJ0KE1hdGgubWF4KDAsIDIgKiBkYSAqIChkYiArIGRjKSAtIChkYiAtPSBkYykgKiBkYiAtIGRhICogZGEpKSAvICgyICogZGMpO1xuICAgICAgYy54ID0gYS54ICsgeCAqIGR4ICsgeSAqIGR5O1xuICAgICAgYy55ID0gYS55ICsgeCAqIGR5IC0geSAqIGR4O1xuICAgIH0gZWxzZSB7XG4gICAgICBjLnggPSBhLnggKyBkYjtcbiAgICAgIGMueSA9IGEueTtcbiAgICB9XG4gIH1cbiAgZDMubGF5b3V0LnRyZWUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaGllcmFyY2h5ID0gZDMubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQobnVsbCkudmFsdWUobnVsbCksIHNlcGFyYXRpb24gPSBkM19sYXlvdXRfdHJlZVNlcGFyYXRpb24sIHNpemUgPSBbIDEsIDEgXSwgbm9kZVNpemUgPSBudWxsO1xuICAgIGZ1bmN0aW9uIHRyZWUoZCwgaSkge1xuICAgICAgdmFyIG5vZGVzID0gaGllcmFyY2h5LmNhbGwodGhpcywgZCwgaSksIHJvb3QwID0gbm9kZXNbMF0sIHJvb3QxID0gd3JhcFRyZWUocm9vdDApO1xuICAgICAgZDNfbGF5b3V0X2hpZXJhcmNoeVZpc2l0QWZ0ZXIocm9vdDEsIGZpcnN0V2FsayksIHJvb3QxLnBhcmVudC5tID0gLXJvb3QxLno7XG4gICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRCZWZvcmUocm9vdDEsIHNlY29uZFdhbGspO1xuICAgICAgaWYgKG5vZGVTaXplKSBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRCZWZvcmUocm9vdDAsIHNpemVOb2RlKTsgZWxzZSB7XG4gICAgICAgIHZhciBsZWZ0ID0gcm9vdDAsIHJpZ2h0ID0gcm9vdDAsIGJvdHRvbSA9IHJvb3QwO1xuICAgICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRCZWZvcmUocm9vdDAsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBpZiAobm9kZS54IDwgbGVmdC54KSBsZWZ0ID0gbm9kZTtcbiAgICAgICAgICBpZiAobm9kZS54ID4gcmlnaHQueCkgcmlnaHQgPSBub2RlO1xuICAgICAgICAgIGlmIChub2RlLmRlcHRoID4gYm90dG9tLmRlcHRoKSBib3R0b20gPSBub2RlO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIHR4ID0gc2VwYXJhdGlvbihsZWZ0LCByaWdodCkgLyAyIC0gbGVmdC54LCBreCA9IHNpemVbMF0gLyAocmlnaHQueCArIHNlcGFyYXRpb24ocmlnaHQsIGxlZnQpIC8gMiArIHR4KSwga3kgPSBzaXplWzFdIC8gKGJvdHRvbS5kZXB0aCB8fCAxKTtcbiAgICAgICAgZDNfbGF5b3V0X2hpZXJhcmNoeVZpc2l0QmVmb3JlKHJvb3QwLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgbm9kZS54ID0gKG5vZGUueCArIHR4KSAqIGt4O1xuICAgICAgICAgIG5vZGUueSA9IG5vZGUuZGVwdGggKiBreTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbm9kZXM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHdyYXBUcmVlKHJvb3QwKSB7XG4gICAgICB2YXIgcm9vdDEgPSB7XG4gICAgICAgIEE6IG51bGwsXG4gICAgICAgIGNoaWxkcmVuOiBbIHJvb3QwIF1cbiAgICAgIH0sIHF1ZXVlID0gWyByb290MSBdLCBub2RlMTtcbiAgICAgIHdoaWxlICgobm9kZTEgPSBxdWV1ZS5wb3AoKSkgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKHZhciBjaGlsZHJlbiA9IG5vZGUxLmNoaWxkcmVuLCBjaGlsZCwgaSA9IDAsIG4gPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgICBxdWV1ZS5wdXNoKChjaGlsZHJlbltpXSA9IGNoaWxkID0ge1xuICAgICAgICAgICAgXzogY2hpbGRyZW5baV0sXG4gICAgICAgICAgICBwYXJlbnQ6IG5vZGUxLFxuICAgICAgICAgICAgY2hpbGRyZW46IChjaGlsZCA9IGNoaWxkcmVuW2ldLmNoaWxkcmVuKSAmJiBjaGlsZC5zbGljZSgpIHx8IFtdLFxuICAgICAgICAgICAgQTogbnVsbCxcbiAgICAgICAgICAgIGE6IG51bGwsXG4gICAgICAgICAgICB6OiAwLFxuICAgICAgICAgICAgbTogMCxcbiAgICAgICAgICAgIGM6IDAsXG4gICAgICAgICAgICBzOiAwLFxuICAgICAgICAgICAgdDogbnVsbCxcbiAgICAgICAgICAgIGk6IGlcbiAgICAgICAgICB9KS5hID0gY2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcm9vdDEuY2hpbGRyZW5bMF07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGZpcnN0V2Fsayh2KSB7XG4gICAgICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuLCBzaWJsaW5ncyA9IHYucGFyZW50LmNoaWxkcmVuLCB3ID0gdi5pID8gc2libGluZ3Nbdi5pIC0gMV0gOiBudWxsO1xuICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICBkM19sYXlvdXRfdHJlZVNoaWZ0KHYpO1xuICAgICAgICB2YXIgbWlkcG9pbnQgPSAoY2hpbGRyZW5bMF0ueiArIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnopIC8gMjtcbiAgICAgICAgaWYgKHcpIHtcbiAgICAgICAgICB2LnogPSB3LnogKyBzZXBhcmF0aW9uKHYuXywgdy5fKTtcbiAgICAgICAgICB2Lm0gPSB2LnogLSBtaWRwb2ludDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2LnogPSBtaWRwb2ludDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh3KSB7XG4gICAgICAgIHYueiA9IHcueiArIHNlcGFyYXRpb24odi5fLCB3Ll8pO1xuICAgICAgfVxuICAgICAgdi5wYXJlbnQuQSA9IGFwcG9ydGlvbih2LCB3LCB2LnBhcmVudC5BIHx8IHNpYmxpbmdzWzBdKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2Vjb25kV2Fsayh2KSB7XG4gICAgICB2Ll8ueCA9IHYueiArIHYucGFyZW50Lm07XG4gICAgICB2Lm0gKz0gdi5wYXJlbnQubTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYXBwb3J0aW9uKHYsIHcsIGFuY2VzdG9yKSB7XG4gICAgICBpZiAodykge1xuICAgICAgICB2YXIgdmlwID0gdiwgdm9wID0gdiwgdmltID0gdywgdm9tID0gdmlwLnBhcmVudC5jaGlsZHJlblswXSwgc2lwID0gdmlwLm0sIHNvcCA9IHZvcC5tLCBzaW0gPSB2aW0ubSwgc29tID0gdm9tLm0sIHNoaWZ0O1xuICAgICAgICB3aGlsZSAodmltID0gZDNfbGF5b3V0X3RyZWVSaWdodCh2aW0pLCB2aXAgPSBkM19sYXlvdXRfdHJlZUxlZnQodmlwKSwgdmltICYmIHZpcCkge1xuICAgICAgICAgIHZvbSA9IGQzX2xheW91dF90cmVlTGVmdCh2b20pO1xuICAgICAgICAgIHZvcCA9IGQzX2xheW91dF90cmVlUmlnaHQodm9wKTtcbiAgICAgICAgICB2b3AuYSA9IHY7XG4gICAgICAgICAgc2hpZnQgPSB2aW0ueiArIHNpbSAtIHZpcC56IC0gc2lwICsgc2VwYXJhdGlvbih2aW0uXywgdmlwLl8pO1xuICAgICAgICAgIGlmIChzaGlmdCA+IDApIHtcbiAgICAgICAgICAgIGQzX2xheW91dF90cmVlTW92ZShkM19sYXlvdXRfdHJlZUFuY2VzdG9yKHZpbSwgdiwgYW5jZXN0b3IpLCB2LCBzaGlmdCk7XG4gICAgICAgICAgICBzaXAgKz0gc2hpZnQ7XG4gICAgICAgICAgICBzb3AgKz0gc2hpZnQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNpbSArPSB2aW0ubTtcbiAgICAgICAgICBzaXAgKz0gdmlwLm07XG4gICAgICAgICAgc29tICs9IHZvbS5tO1xuICAgICAgICAgIHNvcCArPSB2b3AubTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmltICYmICFkM19sYXlvdXRfdHJlZVJpZ2h0KHZvcCkpIHtcbiAgICAgICAgICB2b3AudCA9IHZpbTtcbiAgICAgICAgICB2b3AubSArPSBzaW0gLSBzb3A7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZpcCAmJiAhZDNfbGF5b3V0X3RyZWVMZWZ0KHZvbSkpIHtcbiAgICAgICAgICB2b20udCA9IHZpcDtcbiAgICAgICAgICB2b20ubSArPSBzaXAgLSBzb207XG4gICAgICAgICAgYW5jZXN0b3IgPSB2O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYW5jZXN0b3I7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNpemVOb2RlKG5vZGUpIHtcbiAgICAgIG5vZGUueCAqPSBzaXplWzBdO1xuICAgICAgbm9kZS55ID0gbm9kZS5kZXB0aCAqIHNpemVbMV07XG4gICAgfVxuICAgIHRyZWUuc2VwYXJhdGlvbiA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNlcGFyYXRpb247XG4gICAgICBzZXBhcmF0aW9uID0geDtcbiAgICAgIHJldHVybiB0cmVlO1xuICAgIH07XG4gICAgdHJlZS5zaXplID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbm9kZVNpemUgPyBudWxsIDogc2l6ZTtcbiAgICAgIG5vZGVTaXplID0gKHNpemUgPSB4KSA9PSBudWxsID8gc2l6ZU5vZGUgOiBudWxsO1xuICAgICAgcmV0dXJuIHRyZWU7XG4gICAgfTtcbiAgICB0cmVlLm5vZGVTaXplID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbm9kZVNpemUgPyBzaXplIDogbnVsbDtcbiAgICAgIG5vZGVTaXplID0gKHNpemUgPSB4KSA9PSBudWxsID8gbnVsbCA6IHNpemVOb2RlO1xuICAgICAgcmV0dXJuIHRyZWU7XG4gICAgfTtcbiAgICByZXR1cm4gZDNfbGF5b3V0X2hpZXJhcmNoeVJlYmluZCh0cmVlLCBoaWVyYXJjaHkpO1xuICB9O1xuICBmdW5jdGlvbiBkM19sYXlvdXRfdHJlZVNlcGFyYXRpb24oYSwgYikge1xuICAgIHJldHVybiBhLnBhcmVudCA9PSBiLnBhcmVudCA/IDEgOiAyO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF90cmVlTGVmdCh2KSB7XG4gICAgdmFyIGNoaWxkcmVuID0gdi5jaGlsZHJlbjtcbiAgICByZXR1cm4gY2hpbGRyZW4ubGVuZ3RoID8gY2hpbGRyZW5bMF0gOiB2LnQ7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVSaWdodCh2KSB7XG4gICAgdmFyIGNoaWxkcmVuID0gdi5jaGlsZHJlbiwgbjtcbiAgICByZXR1cm4gKG4gPSBjaGlsZHJlbi5sZW5ndGgpID8gY2hpbGRyZW5bbiAtIDFdIDogdi50O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF90cmVlTW92ZSh3bSwgd3AsIHNoaWZ0KSB7XG4gICAgdmFyIGNoYW5nZSA9IHNoaWZ0IC8gKHdwLmkgLSB3bS5pKTtcbiAgICB3cC5jIC09IGNoYW5nZTtcbiAgICB3cC5zICs9IHNoaWZ0O1xuICAgIHdtLmMgKz0gY2hhbmdlO1xuICAgIHdwLnogKz0gc2hpZnQ7XG4gICAgd3AubSArPSBzaGlmdDtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfdHJlZVNoaWZ0KHYpIHtcbiAgICB2YXIgc2hpZnQgPSAwLCBjaGFuZ2UgPSAwLCBjaGlsZHJlbiA9IHYuY2hpbGRyZW4sIGkgPSBjaGlsZHJlbi5sZW5ndGgsIHc7XG4gICAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgICB3ID0gY2hpbGRyZW5baV07XG4gICAgICB3LnogKz0gc2hpZnQ7XG4gICAgICB3Lm0gKz0gc2hpZnQ7XG4gICAgICBzaGlmdCArPSB3LnMgKyAoY2hhbmdlICs9IHcuYyk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF90cmVlQW5jZXN0b3IodmltLCB2LCBhbmNlc3Rvcikge1xuICAgIHJldHVybiB2aW0uYS5wYXJlbnQgPT09IHYucGFyZW50ID8gdmltLmEgOiBhbmNlc3RvcjtcbiAgfVxuICBkMy5sYXlvdXQuY2x1c3RlciA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBoaWVyYXJjaHkgPSBkMy5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSwgc2VwYXJhdGlvbiA9IGQzX2xheW91dF90cmVlU2VwYXJhdGlvbiwgc2l6ZSA9IFsgMSwgMSBdLCBub2RlU2l6ZSA9IGZhbHNlO1xuICAgIGZ1bmN0aW9uIGNsdXN0ZXIoZCwgaSkge1xuICAgICAgdmFyIG5vZGVzID0gaGllcmFyY2h5LmNhbGwodGhpcywgZCwgaSksIHJvb3QgPSBub2Rlc1swXSwgcHJldmlvdXNOb2RlLCB4ID0gMDtcbiAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEFmdGVyKHJvb3QsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgIG5vZGUueCA9IGQzX2xheW91dF9jbHVzdGVyWChjaGlsZHJlbik7XG4gICAgICAgICAgbm9kZS55ID0gZDNfbGF5b3V0X2NsdXN0ZXJZKGNoaWxkcmVuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlLnggPSBwcmV2aW91c05vZGUgPyB4ICs9IHNlcGFyYXRpb24obm9kZSwgcHJldmlvdXNOb2RlKSA6IDA7XG4gICAgICAgICAgbm9kZS55ID0gMDtcbiAgICAgICAgICBwcmV2aW91c05vZGUgPSBub2RlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHZhciBsZWZ0ID0gZDNfbGF5b3V0X2NsdXN0ZXJMZWZ0KHJvb3QpLCByaWdodCA9IGQzX2xheW91dF9jbHVzdGVyUmlnaHQocm9vdCksIHgwID0gbGVmdC54IC0gc2VwYXJhdGlvbihsZWZ0LCByaWdodCkgLyAyLCB4MSA9IHJpZ2h0LnggKyBzZXBhcmF0aW9uKHJpZ2h0LCBsZWZ0KSAvIDI7XG4gICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRBZnRlcihyb290LCBub2RlU2l6ZSA/IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgbm9kZS54ID0gKG5vZGUueCAtIHJvb3QueCkgKiBzaXplWzBdO1xuICAgICAgICBub2RlLnkgPSAocm9vdC55IC0gbm9kZS55KSAqIHNpemVbMV07XG4gICAgICB9IDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBub2RlLnggPSAobm9kZS54IC0geDApIC8gKHgxIC0geDApICogc2l6ZVswXTtcbiAgICAgICAgbm9kZS55ID0gKDEgLSAocm9vdC55ID8gbm9kZS55IC8gcm9vdC55IDogMSkpICogc2l6ZVsxXTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5vZGVzO1xuICAgIH1cbiAgICBjbHVzdGVyLnNlcGFyYXRpb24gPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzZXBhcmF0aW9uO1xuICAgICAgc2VwYXJhdGlvbiA9IHg7XG4gICAgICByZXR1cm4gY2x1c3RlcjtcbiAgICB9O1xuICAgIGNsdXN0ZXIuc2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG5vZGVTaXplID8gbnVsbCA6IHNpemU7XG4gICAgICBub2RlU2l6ZSA9IChzaXplID0geCkgPT0gbnVsbDtcbiAgICAgIHJldHVybiBjbHVzdGVyO1xuICAgIH07XG4gICAgY2x1c3Rlci5ub2RlU2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG5vZGVTaXplID8gc2l6ZSA6IG51bGw7XG4gICAgICBub2RlU2l6ZSA9IChzaXplID0geCkgIT0gbnVsbDtcbiAgICAgIHJldHVybiBjbHVzdGVyO1xuICAgIH07XG4gICAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQoY2x1c3RlciwgaGllcmFyY2h5KTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfbGF5b3V0X2NsdXN0ZXJZKGNoaWxkcmVuKSB7XG4gICAgcmV0dXJuIDEgKyBkMy5tYXgoY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZXR1cm4gY2hpbGQueTtcbiAgICB9KTtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfY2x1c3RlclgoY2hpbGRyZW4pIHtcbiAgICByZXR1cm4gY2hpbGRyZW4ucmVkdWNlKGZ1bmN0aW9uKHgsIGNoaWxkKSB7XG4gICAgICByZXR1cm4geCArIGNoaWxkLng7XG4gICAgfSwgMCkgLyBjaGlsZHJlbi5sZW5ndGg7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X2NsdXN0ZXJMZWZ0KG5vZGUpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgIHJldHVybiBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPyBkM19sYXlvdXRfY2x1c3RlckxlZnQoY2hpbGRyZW5bMF0pIDogbm9kZTtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfY2x1c3RlclJpZ2h0KG5vZGUpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLCBuO1xuICAgIHJldHVybiBjaGlsZHJlbiAmJiAobiA9IGNoaWxkcmVuLmxlbmd0aCkgPyBkM19sYXlvdXRfY2x1c3RlclJpZ2h0KGNoaWxkcmVuW24gLSAxXSkgOiBub2RlO1xuICB9XG4gIGQzLmxheW91dC50cmVlbWFwID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGhpZXJhcmNoeSA9IGQzLmxheW91dC5oaWVyYXJjaHkoKSwgcm91bmQgPSBNYXRoLnJvdW5kLCBzaXplID0gWyAxLCAxIF0sIHBhZGRpbmcgPSBudWxsLCBwYWQgPSBkM19sYXlvdXRfdHJlZW1hcFBhZE51bGwsIHN0aWNreSA9IGZhbHNlLCBzdGlja2llcywgbW9kZSA9IFwic3F1YXJpZnlcIiwgcmF0aW8gPSAuNSAqICgxICsgTWF0aC5zcXJ0KDUpKTtcbiAgICBmdW5jdGlvbiBzY2FsZShjaGlsZHJlbiwgaykge1xuICAgICAgdmFyIGkgPSAtMSwgbiA9IGNoaWxkcmVuLmxlbmd0aCwgY2hpbGQsIGFyZWE7XG4gICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICBhcmVhID0gKGNoaWxkID0gY2hpbGRyZW5baV0pLnZhbHVlICogKGsgPCAwID8gMCA6IGspO1xuICAgICAgICBjaGlsZC5hcmVhID0gaXNOYU4oYXJlYSkgfHwgYXJlYSA8PSAwID8gMCA6IGFyZWE7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNxdWFyaWZ5KG5vZGUpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIHZhciByZWN0ID0gcGFkKG5vZGUpLCByb3cgPSBbXSwgcmVtYWluaW5nID0gY2hpbGRyZW4uc2xpY2UoKSwgY2hpbGQsIGJlc3QgPSBJbmZpbml0eSwgc2NvcmUsIHUgPSBtb2RlID09PSBcInNsaWNlXCIgPyByZWN0LmR4IDogbW9kZSA9PT0gXCJkaWNlXCIgPyByZWN0LmR5IDogbW9kZSA9PT0gXCJzbGljZS1kaWNlXCIgPyBub2RlLmRlcHRoICYgMSA/IHJlY3QuZHkgOiByZWN0LmR4IDogTWF0aC5taW4ocmVjdC5keCwgcmVjdC5keSksIG47XG4gICAgICAgIHNjYWxlKHJlbWFpbmluZywgcmVjdC5keCAqIHJlY3QuZHkgLyBub2RlLnZhbHVlKTtcbiAgICAgICAgcm93LmFyZWEgPSAwO1xuICAgICAgICB3aGlsZSAoKG4gPSByZW1haW5pbmcubGVuZ3RoKSA+IDApIHtcbiAgICAgICAgICByb3cucHVzaChjaGlsZCA9IHJlbWFpbmluZ1tuIC0gMV0pO1xuICAgICAgICAgIHJvdy5hcmVhICs9IGNoaWxkLmFyZWE7XG4gICAgICAgICAgaWYgKG1vZGUgIT09IFwic3F1YXJpZnlcIiB8fCAoc2NvcmUgPSB3b3JzdChyb3csIHUpKSA8PSBiZXN0KSB7XG4gICAgICAgICAgICByZW1haW5pbmcucG9wKCk7XG4gICAgICAgICAgICBiZXN0ID0gc2NvcmU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvdy5hcmVhIC09IHJvdy5wb3AoKS5hcmVhO1xuICAgICAgICAgICAgcG9zaXRpb24ocm93LCB1LCByZWN0LCBmYWxzZSk7XG4gICAgICAgICAgICB1ID0gTWF0aC5taW4ocmVjdC5keCwgcmVjdC5keSk7XG4gICAgICAgICAgICByb3cubGVuZ3RoID0gcm93LmFyZWEgPSAwO1xuICAgICAgICAgICAgYmVzdCA9IEluZmluaXR5O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocm93Lmxlbmd0aCkge1xuICAgICAgICAgIHBvc2l0aW9uKHJvdywgdSwgcmVjdCwgdHJ1ZSk7XG4gICAgICAgICAgcm93Lmxlbmd0aCA9IHJvdy5hcmVhID0gMDtcbiAgICAgICAgfVxuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKHNxdWFyaWZ5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc3RpY2tpZnkobm9kZSkge1xuICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgdmFyIHJlY3QgPSBwYWQobm9kZSksIHJlbWFpbmluZyA9IGNoaWxkcmVuLnNsaWNlKCksIGNoaWxkLCByb3cgPSBbXTtcbiAgICAgICAgc2NhbGUocmVtYWluaW5nLCByZWN0LmR4ICogcmVjdC5keSAvIG5vZGUudmFsdWUpO1xuICAgICAgICByb3cuYXJlYSA9IDA7XG4gICAgICAgIHdoaWxlIChjaGlsZCA9IHJlbWFpbmluZy5wb3AoKSkge1xuICAgICAgICAgIHJvdy5wdXNoKGNoaWxkKTtcbiAgICAgICAgICByb3cuYXJlYSArPSBjaGlsZC5hcmVhO1xuICAgICAgICAgIGlmIChjaGlsZC56ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uKHJvdywgY2hpbGQueiA/IHJlY3QuZHggOiByZWN0LmR5LCByZWN0LCAhcmVtYWluaW5nLmxlbmd0aCk7XG4gICAgICAgICAgICByb3cubGVuZ3RoID0gcm93LmFyZWEgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKHN0aWNraWZ5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gd29yc3Qocm93LCB1KSB7XG4gICAgICB2YXIgcyA9IHJvdy5hcmVhLCByLCBybWF4ID0gMCwgcm1pbiA9IEluZmluaXR5LCBpID0gLTEsIG4gPSByb3cubGVuZ3RoO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgaWYgKCEociA9IHJvd1tpXS5hcmVhKSkgY29udGludWU7XG4gICAgICAgIGlmIChyIDwgcm1pbikgcm1pbiA9IHI7XG4gICAgICAgIGlmIChyID4gcm1heCkgcm1heCA9IHI7XG4gICAgICB9XG4gICAgICBzICo9IHM7XG4gICAgICB1ICo9IHU7XG4gICAgICByZXR1cm4gcyA/IE1hdGgubWF4KHUgKiBybWF4ICogcmF0aW8gLyBzLCBzIC8gKHUgKiBybWluICogcmF0aW8pKSA6IEluZmluaXR5O1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb3NpdGlvbihyb3csIHUsIHJlY3QsIGZsdXNoKSB7XG4gICAgICB2YXIgaSA9IC0xLCBuID0gcm93Lmxlbmd0aCwgeCA9IHJlY3QueCwgeSA9IHJlY3QueSwgdiA9IHUgPyByb3VuZChyb3cuYXJlYSAvIHUpIDogMCwgbztcbiAgICAgIGlmICh1ID09IHJlY3QuZHgpIHtcbiAgICAgICAgaWYgKGZsdXNoIHx8IHYgPiByZWN0LmR5KSB2ID0gcmVjdC5keTtcbiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgICBvID0gcm93W2ldO1xuICAgICAgICAgIG8ueCA9IHg7XG4gICAgICAgICAgby55ID0geTtcbiAgICAgICAgICBvLmR5ID0gdjtcbiAgICAgICAgICB4ICs9IG8uZHggPSBNYXRoLm1pbihyZWN0LnggKyByZWN0LmR4IC0geCwgdiA/IHJvdW5kKG8uYXJlYSAvIHYpIDogMCk7XG4gICAgICAgIH1cbiAgICAgICAgby56ID0gdHJ1ZTtcbiAgICAgICAgby5keCArPSByZWN0LnggKyByZWN0LmR4IC0geDtcbiAgICAgICAgcmVjdC55ICs9IHY7XG4gICAgICAgIHJlY3QuZHkgLT0gdjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmbHVzaCB8fCB2ID4gcmVjdC5keCkgdiA9IHJlY3QuZHg7XG4gICAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgICAgbyA9IHJvd1tpXTtcbiAgICAgICAgICBvLnggPSB4O1xuICAgICAgICAgIG8ueSA9IHk7XG4gICAgICAgICAgby5keCA9IHY7XG4gICAgICAgICAgeSArPSBvLmR5ID0gTWF0aC5taW4ocmVjdC55ICsgcmVjdC5keSAtIHksIHYgPyByb3VuZChvLmFyZWEgLyB2KSA6IDApO1xuICAgICAgICB9XG4gICAgICAgIG8ueiA9IGZhbHNlO1xuICAgICAgICBvLmR5ICs9IHJlY3QueSArIHJlY3QuZHkgLSB5O1xuICAgICAgICByZWN0LnggKz0gdjtcbiAgICAgICAgcmVjdC5keCAtPSB2O1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmVlbWFwKGQpIHtcbiAgICAgIHZhciBub2RlcyA9IHN0aWNraWVzIHx8IGhpZXJhcmNoeShkKSwgcm9vdCA9IG5vZGVzWzBdO1xuICAgICAgcm9vdC54ID0gcm9vdC55ID0gMDtcbiAgICAgIGlmIChyb290LnZhbHVlKSByb290LmR4ID0gc2l6ZVswXSwgcm9vdC5keSA9IHNpemVbMV07IGVsc2Ugcm9vdC5keCA9IHJvb3QuZHkgPSAwO1xuICAgICAgaWYgKHN0aWNraWVzKSBoaWVyYXJjaHkucmV2YWx1ZShyb290KTtcbiAgICAgIHNjYWxlKFsgcm9vdCBdLCByb290LmR4ICogcm9vdC5keSAvIHJvb3QudmFsdWUpO1xuICAgICAgKHN0aWNraWVzID8gc3RpY2tpZnkgOiBzcXVhcmlmeSkocm9vdCk7XG4gICAgICBpZiAoc3RpY2t5KSBzdGlja2llcyA9IG5vZGVzO1xuICAgICAgcmV0dXJuIG5vZGVzO1xuICAgIH1cbiAgICB0cmVlbWFwLnNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplO1xuICAgICAgc2l6ZSA9IHg7XG4gICAgICByZXR1cm4gdHJlZW1hcDtcbiAgICB9O1xuICAgIHRyZWVtYXAucGFkZGluZyA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHBhZGRpbmc7XG4gICAgICBmdW5jdGlvbiBwYWRGdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHZhciBwID0geC5jYWxsKHRyZWVtYXAsIG5vZGUsIG5vZGUuZGVwdGgpO1xuICAgICAgICByZXR1cm4gcCA9PSBudWxsID8gZDNfbGF5b3V0X3RyZWVtYXBQYWROdWxsKG5vZGUpIDogZDNfbGF5b3V0X3RyZWVtYXBQYWQobm9kZSwgdHlwZW9mIHAgPT09IFwibnVtYmVyXCIgPyBbIHAsIHAsIHAsIHAgXSA6IHApO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcGFkQ29uc3RhbnQobm9kZSkge1xuICAgICAgICByZXR1cm4gZDNfbGF5b3V0X3RyZWVtYXBQYWQobm9kZSwgeCk7XG4gICAgICB9XG4gICAgICB2YXIgdHlwZTtcbiAgICAgIHBhZCA9IChwYWRkaW5nID0geCkgPT0gbnVsbCA/IGQzX2xheW91dF90cmVlbWFwUGFkTnVsbCA6ICh0eXBlID0gdHlwZW9mIHgpID09PSBcImZ1bmN0aW9uXCIgPyBwYWRGdW5jdGlvbiA6IHR5cGUgPT09IFwibnVtYmVyXCIgPyAoeCA9IFsgeCwgeCwgeCwgeCBdLCBcbiAgICAgIHBhZENvbnN0YW50KSA6IHBhZENvbnN0YW50O1xuICAgICAgcmV0dXJuIHRyZWVtYXA7XG4gICAgfTtcbiAgICB0cmVlbWFwLnJvdW5kID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcm91bmQgIT0gTnVtYmVyO1xuICAgICAgcm91bmQgPSB4ID8gTWF0aC5yb3VuZCA6IE51bWJlcjtcbiAgICAgIHJldHVybiB0cmVlbWFwO1xuICAgIH07XG4gICAgdHJlZW1hcC5zdGlja3kgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzdGlja3k7XG4gICAgICBzdGlja3kgPSB4O1xuICAgICAgc3RpY2tpZXMgPSBudWxsO1xuICAgICAgcmV0dXJuIHRyZWVtYXA7XG4gICAgfTtcbiAgICB0cmVlbWFwLnJhdGlvID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmF0aW87XG4gICAgICByYXRpbyA9IHg7XG4gICAgICByZXR1cm4gdHJlZW1hcDtcbiAgICB9O1xuICAgIHRyZWVtYXAubW9kZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG1vZGU7XG4gICAgICBtb2RlID0geCArIFwiXCI7XG4gICAgICByZXR1cm4gdHJlZW1hcDtcbiAgICB9O1xuICAgIHJldHVybiBkM19sYXlvdXRfaGllcmFyY2h5UmViaW5kKHRyZWVtYXAsIGhpZXJhcmNoeSk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2xheW91dF90cmVlbWFwUGFkTnVsbChub2RlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IG5vZGUueCxcbiAgICAgIHk6IG5vZGUueSxcbiAgICAgIGR4OiBub2RlLmR4LFxuICAgICAgZHk6IG5vZGUuZHlcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF90cmVlbWFwUGFkKG5vZGUsIHBhZGRpbmcpIHtcbiAgICB2YXIgeCA9IG5vZGUueCArIHBhZGRpbmdbM10sIHkgPSBub2RlLnkgKyBwYWRkaW5nWzBdLCBkeCA9IG5vZGUuZHggLSBwYWRkaW5nWzFdIC0gcGFkZGluZ1szXSwgZHkgPSBub2RlLmR5IC0gcGFkZGluZ1swXSAtIHBhZGRpbmdbMl07XG4gICAgaWYgKGR4IDwgMCkge1xuICAgICAgeCArPSBkeCAvIDI7XG4gICAgICBkeCA9IDA7XG4gICAgfVxuICAgIGlmIChkeSA8IDApIHtcbiAgICAgIHkgKz0gZHkgLyAyO1xuICAgICAgZHkgPSAwO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgeDogeCxcbiAgICAgIHk6IHksXG4gICAgICBkeDogZHgsXG4gICAgICBkeTogZHlcbiAgICB9O1xuICB9XG4gIGQzLnJhbmRvbSA9IHtcbiAgICBub3JtYWw6IGZ1bmN0aW9uKMK1LCDPgykge1xuICAgICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgaWYgKG4gPCAyKSDPgyA9IDE7XG4gICAgICBpZiAobiA8IDEpIMK1ID0gMDtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHgsIHksIHI7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICB4ID0gTWF0aC5yYW5kb20oKSAqIDIgLSAxO1xuICAgICAgICAgIHkgPSBNYXRoLnJhbmRvbSgpICogMiAtIDE7XG4gICAgICAgICAgciA9IHggKiB4ICsgeSAqIHk7XG4gICAgICAgIH0gd2hpbGUgKCFyIHx8IHIgPiAxKTtcbiAgICAgICAgcmV0dXJuIMK1ICsgz4MgKiB4ICogTWF0aC5zcXJ0KC0yICogTWF0aC5sb2cocikgLyByKTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBsb2dOb3JtYWw6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHJhbmRvbSA9IGQzLnJhbmRvbS5ub3JtYWwuYXBwbHkoZDMsIGFyZ3VtZW50cyk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmV4cChyYW5kb20oKSk7XG4gICAgICB9O1xuICAgIH0sXG4gICAgYmF0ZXM6IGZ1bmN0aW9uKG0pIHtcbiAgICAgIHZhciByYW5kb20gPSBkMy5yYW5kb20uaXJ3aW5IYWxsKG0pO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gcmFuZG9tKCkgLyBtO1xuICAgICAgfTtcbiAgICB9LFxuICAgIGlyd2luSGFsbDogZnVuY3Rpb24obSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBmb3IgKHZhciBzID0gMCwgaiA9IDA7IGogPCBtOyBqKyspIHMgKz0gTWF0aC5yYW5kb20oKTtcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbiAgZDMuc2NhbGUgPSB7fTtcbiAgZnVuY3Rpb24gZDNfc2NhbGVFeHRlbnQoZG9tYWluKSB7XG4gICAgdmFyIHN0YXJ0ID0gZG9tYWluWzBdLCBzdG9wID0gZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXTtcbiAgICByZXR1cm4gc3RhcnQgPCBzdG9wID8gWyBzdGFydCwgc3RvcCBdIDogWyBzdG9wLCBzdGFydCBdO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3NjYWxlUmFuZ2Uoc2NhbGUpIHtcbiAgICByZXR1cm4gc2NhbGUucmFuZ2VFeHRlbnQgPyBzY2FsZS5yYW5nZUV4dGVudCgpIDogZDNfc2NhbGVFeHRlbnQoc2NhbGUucmFuZ2UoKSk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc2NhbGVfYmlsaW5lYXIoZG9tYWluLCByYW5nZSwgdW5pbnRlcnBvbGF0ZSwgaW50ZXJwb2xhdGUpIHtcbiAgICB2YXIgdSA9IHVuaW50ZXJwb2xhdGUoZG9tYWluWzBdLCBkb21haW5bMV0pLCBpID0gaW50ZXJwb2xhdGUocmFuZ2VbMF0sIHJhbmdlWzFdKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIGkodSh4KSk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkM19zY2FsZV9uaWNlKGRvbWFpbiwgbmljZSkge1xuICAgIHZhciBpMCA9IDAsIGkxID0gZG9tYWluLmxlbmd0aCAtIDEsIHgwID0gZG9tYWluW2kwXSwgeDEgPSBkb21haW5baTFdLCBkeDtcbiAgICBpZiAoeDEgPCB4MCkge1xuICAgICAgZHggPSBpMCwgaTAgPSBpMSwgaTEgPSBkeDtcbiAgICAgIGR4ID0geDAsIHgwID0geDEsIHgxID0gZHg7XG4gICAgfVxuICAgIGRvbWFpbltpMF0gPSBuaWNlLmZsb29yKHgwKTtcbiAgICBkb21haW5baTFdID0gbmljZS5jZWlsKHgxKTtcbiAgICByZXR1cm4gZG9tYWluO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3NjYWxlX25pY2VTdGVwKHN0ZXApIHtcbiAgICByZXR1cm4gc3RlcCA/IHtcbiAgICAgIGZsb29yOiBmdW5jdGlvbih4KSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHggLyBzdGVwKSAqIHN0ZXA7XG4gICAgICB9LFxuICAgICAgY2VpbDogZnVuY3Rpb24oeCkge1xuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHggLyBzdGVwKSAqIHN0ZXA7XG4gICAgICB9XG4gICAgfSA6IGQzX3NjYWxlX25pY2VJZGVudGl0eTtcbiAgfVxuICB2YXIgZDNfc2NhbGVfbmljZUlkZW50aXR5ID0ge1xuICAgIGZsb29yOiBkM19pZGVudGl0eSxcbiAgICBjZWlsOiBkM19pZGVudGl0eVxuICB9O1xuICBmdW5jdGlvbiBkM19zY2FsZV9wb2x5bGluZWFyKGRvbWFpbiwgcmFuZ2UsIHVuaW50ZXJwb2xhdGUsIGludGVycG9sYXRlKSB7XG4gICAgdmFyIHUgPSBbXSwgaSA9IFtdLCBqID0gMCwgayA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCkgLSAxO1xuICAgIGlmIChkb21haW5ba10gPCBkb21haW5bMF0pIHtcbiAgICAgIGRvbWFpbiA9IGRvbWFpbi5zbGljZSgpLnJldmVyc2UoKTtcbiAgICAgIHJhbmdlID0gcmFuZ2Uuc2xpY2UoKS5yZXZlcnNlKCk7XG4gICAgfVxuICAgIHdoaWxlICgrK2ogPD0gaykge1xuICAgICAgdS5wdXNoKHVuaW50ZXJwb2xhdGUoZG9tYWluW2ogLSAxXSwgZG9tYWluW2pdKSk7XG4gICAgICBpLnB1c2goaW50ZXJwb2xhdGUocmFuZ2VbaiAtIDFdLCByYW5nZVtqXSkpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24oeCkge1xuICAgICAgdmFyIGogPSBkMy5iaXNlY3QoZG9tYWluLCB4LCAxLCBrKSAtIDE7XG4gICAgICByZXR1cm4gaVtqXSh1W2pdKHgpKTtcbiAgICB9O1xuICB9XG4gIGQzLnNjYWxlLmxpbmVhciA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19zY2FsZV9saW5lYXIoWyAwLCAxIF0sIFsgMCwgMSBdLCBkM19pbnRlcnBvbGF0ZSwgZmFsc2UpO1xuICB9O1xuICBmdW5jdGlvbiBkM19zY2FsZV9saW5lYXIoZG9tYWluLCByYW5nZSwgaW50ZXJwb2xhdGUsIGNsYW1wKSB7XG4gICAgdmFyIG91dHB1dCwgaW5wdXQ7XG4gICAgZnVuY3Rpb24gcmVzY2FsZSgpIHtcbiAgICAgIHZhciBsaW5lYXIgPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZS5sZW5ndGgpID4gMiA/IGQzX3NjYWxlX3BvbHlsaW5lYXIgOiBkM19zY2FsZV9iaWxpbmVhciwgdW5pbnRlcnBvbGF0ZSA9IGNsYW1wID8gZDNfdW5pbnRlcnBvbGF0ZUNsYW1wIDogZDNfdW5pbnRlcnBvbGF0ZU51bWJlcjtcbiAgICAgIG91dHB1dCA9IGxpbmVhcihkb21haW4sIHJhbmdlLCB1bmludGVycG9sYXRlLCBpbnRlcnBvbGF0ZSk7XG4gICAgICBpbnB1dCA9IGxpbmVhcihyYW5nZSwgZG9tYWluLCB1bmludGVycG9sYXRlLCBkM19pbnRlcnBvbGF0ZSk7XG4gICAgICByZXR1cm4gc2NhbGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNjYWxlKHgpIHtcbiAgICAgIHJldHVybiBvdXRwdXQoeCk7XG4gICAgfVxuICAgIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHkpIHtcbiAgICAgIHJldHVybiBpbnB1dCh5KTtcbiAgICB9O1xuICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbjtcbiAgICAgIGRvbWFpbiA9IHgubWFwKE51bWJlcik7XG4gICAgICByZXR1cm4gcmVzY2FsZSgpO1xuICAgIH07XG4gICAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYW5nZTtcbiAgICAgIHJhbmdlID0geDtcbiAgICAgIHJldHVybiByZXNjYWxlKCk7XG4gICAgfTtcbiAgICBzY2FsZS5yYW5nZVJvdW5kID0gZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIHNjYWxlLnJhbmdlKHgpLmludGVycG9sYXRlKGQzX2ludGVycG9sYXRlUm91bmQpO1xuICAgIH07XG4gICAgc2NhbGUuY2xhbXAgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjbGFtcDtcbiAgICAgIGNsYW1wID0geDtcbiAgICAgIHJldHVybiByZXNjYWxlKCk7XG4gICAgfTtcbiAgICBzY2FsZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGludGVycG9sYXRlO1xuICAgICAgaW50ZXJwb2xhdGUgPSB4O1xuICAgICAgcmV0dXJuIHJlc2NhbGUoKTtcbiAgICB9O1xuICAgIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24obSkge1xuICAgICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclRpY2tzKGRvbWFpbiwgbSk7XG4gICAgfTtcbiAgICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24obSwgZm9ybWF0KSB7XG4gICAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja0Zvcm1hdChkb21haW4sIG0sIGZvcm1hdCk7XG4gICAgfTtcbiAgICBzY2FsZS5uaWNlID0gZnVuY3Rpb24obSkge1xuICAgICAgZDNfc2NhbGVfbGluZWFyTmljZShkb21haW4sIG0pO1xuICAgICAgcmV0dXJuIHJlc2NhbGUoKTtcbiAgICB9O1xuICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBkM19zY2FsZV9saW5lYXIoZG9tYWluLCByYW5nZSwgaW50ZXJwb2xhdGUsIGNsYW1wKTtcbiAgICB9O1xuICAgIHJldHVybiByZXNjYWxlKCk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyUmViaW5kKHNjYWxlLCBsaW5lYXIpIHtcbiAgICByZXR1cm4gZDMucmViaW5kKHNjYWxlLCBsaW5lYXIsIFwicmFuZ2VcIiwgXCJyYW5nZVJvdW5kXCIsIFwiaW50ZXJwb2xhdGVcIiwgXCJjbGFtcFwiKTtcbiAgfVxuICBmdW5jdGlvbiBkM19zY2FsZV9saW5lYXJOaWNlKGRvbWFpbiwgbSkge1xuICAgIGQzX3NjYWxlX25pY2UoZG9tYWluLCBkM19zY2FsZV9uaWNlU3RlcChkM19zY2FsZV9saW5lYXJUaWNrUmFuZ2UoZG9tYWluLCBtKVsyXSkpO1xuICAgIGQzX3NjYWxlX25pY2UoZG9tYWluLCBkM19zY2FsZV9uaWNlU3RlcChkM19zY2FsZV9saW5lYXJUaWNrUmFuZ2UoZG9tYWluLCBtKVsyXSkpO1xuICAgIHJldHVybiBkb21haW47XG4gIH1cbiAgZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyVGlja1JhbmdlKGRvbWFpbiwgbSkge1xuICAgIGlmIChtID09IG51bGwpIG0gPSAxMDtcbiAgICB2YXIgZXh0ZW50ID0gZDNfc2NhbGVFeHRlbnQoZG9tYWluKSwgc3BhbiA9IGV4dGVudFsxXSAtIGV4dGVudFswXSwgc3RlcCA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nKHNwYW4gLyBtKSAvIE1hdGguTE4xMCkpLCBlcnIgPSBtIC8gc3BhbiAqIHN0ZXA7XG4gICAgaWYgKGVyciA8PSAuMTUpIHN0ZXAgKj0gMTA7IGVsc2UgaWYgKGVyciA8PSAuMzUpIHN0ZXAgKj0gNTsgZWxzZSBpZiAoZXJyIDw9IC43NSkgc3RlcCAqPSAyO1xuICAgIGV4dGVudFswXSA9IE1hdGguY2VpbChleHRlbnRbMF0gLyBzdGVwKSAqIHN0ZXA7XG4gICAgZXh0ZW50WzFdID0gTWF0aC5mbG9vcihleHRlbnRbMV0gLyBzdGVwKSAqIHN0ZXAgKyBzdGVwICogLjU7XG4gICAgZXh0ZW50WzJdID0gc3RlcDtcbiAgICByZXR1cm4gZXh0ZW50O1xuICB9XG4gIGZ1bmN0aW9uIGQzX3NjYWxlX2xpbmVhclRpY2tzKGRvbWFpbiwgbSkge1xuICAgIHJldHVybiBkMy5yYW5nZS5hcHBseShkMywgZDNfc2NhbGVfbGluZWFyVGlja1JhbmdlKGRvbWFpbiwgbSkpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3NjYWxlX2xpbmVhclRpY2tGb3JtYXQoZG9tYWluLCBtLCBmb3JtYXQpIHtcbiAgICB2YXIgcmFuZ2UgPSBkM19zY2FsZV9saW5lYXJUaWNrUmFuZ2UoZG9tYWluLCBtKTtcbiAgICBpZiAoZm9ybWF0KSB7XG4gICAgICB2YXIgbWF0Y2ggPSBkM19mb3JtYXRfcmUuZXhlYyhmb3JtYXQpO1xuICAgICAgbWF0Y2guc2hpZnQoKTtcbiAgICAgIGlmIChtYXRjaFs4XSA9PT0gXCJzXCIpIHtcbiAgICAgICAgdmFyIHByZWZpeCA9IGQzLmZvcm1hdFByZWZpeChNYXRoLm1heChhYnMocmFuZ2VbMF0pLCBhYnMocmFuZ2VbMV0pKSk7XG4gICAgICAgIGlmICghbWF0Y2hbN10pIG1hdGNoWzddID0gXCIuXCIgKyBkM19zY2FsZV9saW5lYXJQcmVjaXNpb24ocHJlZml4LnNjYWxlKHJhbmdlWzJdKSk7XG4gICAgICAgIG1hdGNoWzhdID0gXCJmXCI7XG4gICAgICAgIGZvcm1hdCA9IGQzLmZvcm1hdChtYXRjaC5qb2luKFwiXCIpKTtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgICByZXR1cm4gZm9ybWF0KHByZWZpeC5zY2FsZShkKSkgKyBwcmVmaXguc3ltYm9sO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKCFtYXRjaFs3XSkgbWF0Y2hbN10gPSBcIi5cIiArIGQzX3NjYWxlX2xpbmVhckZvcm1hdFByZWNpc2lvbihtYXRjaFs4XSwgcmFuZ2UpO1xuICAgICAgZm9ybWF0ID0gbWF0Y2guam9pbihcIlwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9ybWF0ID0gXCIsLlwiICsgZDNfc2NhbGVfbGluZWFyUHJlY2lzaW9uKHJhbmdlWzJdKSArIFwiZlwiO1xuICAgIH1cbiAgICByZXR1cm4gZDMuZm9ybWF0KGZvcm1hdCk7XG4gIH1cbiAgdmFyIGQzX3NjYWxlX2xpbmVhckZvcm1hdFNpZ25pZmljYW50ID0ge1xuICAgIHM6IDEsXG4gICAgZzogMSxcbiAgICBwOiAxLFxuICAgIHI6IDEsXG4gICAgZTogMVxuICB9O1xuICBmdW5jdGlvbiBkM19zY2FsZV9saW5lYXJQcmVjaXNpb24odmFsdWUpIHtcbiAgICByZXR1cm4gLU1hdGguZmxvb3IoTWF0aC5sb2codmFsdWUpIC8gTWF0aC5MTjEwICsgLjAxKTtcbiAgfVxuICBmdW5jdGlvbiBkM19zY2FsZV9saW5lYXJGb3JtYXRQcmVjaXNpb24odHlwZSwgcmFuZ2UpIHtcbiAgICB2YXIgcCA9IGQzX3NjYWxlX2xpbmVhclByZWNpc2lvbihyYW5nZVsyXSk7XG4gICAgcmV0dXJuIHR5cGUgaW4gZDNfc2NhbGVfbGluZWFyRm9ybWF0U2lnbmlmaWNhbnQgPyBNYXRoLmFicyhwIC0gZDNfc2NhbGVfbGluZWFyUHJlY2lzaW9uKE1hdGgubWF4KGFicyhyYW5nZVswXSksIGFicyhyYW5nZVsxXSkpKSkgKyArKHR5cGUgIT09IFwiZVwiKSA6IHAgLSAodHlwZSA9PT0gXCIlXCIpICogMjtcbiAgfVxuICBkMy5zY2FsZS5sb2cgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDNfc2NhbGVfbG9nKGQzLnNjYWxlLmxpbmVhcigpLmRvbWFpbihbIDAsIDEgXSksIDEwLCB0cnVlLCBbIDEsIDEwIF0pO1xuICB9O1xuICBmdW5jdGlvbiBkM19zY2FsZV9sb2cobGluZWFyLCBiYXNlLCBwb3NpdGl2ZSwgZG9tYWluKSB7XG4gICAgZnVuY3Rpb24gbG9nKHgpIHtcbiAgICAgIHJldHVybiAocG9zaXRpdmUgPyBNYXRoLmxvZyh4IDwgMCA/IDAgOiB4KSA6IC1NYXRoLmxvZyh4ID4gMCA/IDAgOiAteCkpIC8gTWF0aC5sb2coYmFzZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBvdyh4KSB7XG4gICAgICByZXR1cm4gcG9zaXRpdmUgPyBNYXRoLnBvdyhiYXNlLCB4KSA6IC1NYXRoLnBvdyhiYXNlLCAteCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNjYWxlKHgpIHtcbiAgICAgIHJldHVybiBsaW5lYXIobG9nKHgpKTtcbiAgICB9XG4gICAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIHBvdyhsaW5lYXIuaW52ZXJ0KHgpKTtcbiAgICB9O1xuICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbjtcbiAgICAgIHBvc2l0aXZlID0geFswXSA+PSAwO1xuICAgICAgbGluZWFyLmRvbWFpbigoZG9tYWluID0geC5tYXAoTnVtYmVyKSkubWFwKGxvZykpO1xuICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH07XG4gICAgc2NhbGUuYmFzZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGJhc2U7XG4gICAgICBiYXNlID0gK187XG4gICAgICBsaW5lYXIuZG9tYWluKGRvbWFpbi5tYXAobG9nKSk7XG4gICAgICByZXR1cm4gc2NhbGU7XG4gICAgfTtcbiAgICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbmljZWQgPSBkM19zY2FsZV9uaWNlKGRvbWFpbi5tYXAobG9nKSwgcG9zaXRpdmUgPyBNYXRoIDogZDNfc2NhbGVfbG9nTmljZU5lZ2F0aXZlKTtcbiAgICAgIGxpbmVhci5kb21haW4obmljZWQpO1xuICAgICAgZG9tYWluID0gbmljZWQubWFwKHBvdyk7XG4gICAgICByZXR1cm4gc2NhbGU7XG4gICAgfTtcbiAgICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGV4dGVudCA9IGQzX3NjYWxlRXh0ZW50KGRvbWFpbiksIHRpY2tzID0gW10sIHUgPSBleHRlbnRbMF0sIHYgPSBleHRlbnRbMV0sIGkgPSBNYXRoLmZsb29yKGxvZyh1KSksIGogPSBNYXRoLmNlaWwobG9nKHYpKSwgbiA9IGJhc2UgJSAxID8gMiA6IGJhc2U7XG4gICAgICBpZiAoaXNGaW5pdGUoaiAtIGkpKSB7XG4gICAgICAgIGlmIChwb3NpdGl2ZSkge1xuICAgICAgICAgIGZvciAoO2kgPCBqOyBpKyspIGZvciAodmFyIGsgPSAxOyBrIDwgbjsgaysrKSB0aWNrcy5wdXNoKHBvdyhpKSAqIGspO1xuICAgICAgICAgIHRpY2tzLnB1c2gocG93KGkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aWNrcy5wdXNoKHBvdyhpKSk7XG4gICAgICAgICAgZm9yICg7aSsrIDwgajsgKSBmb3IgKHZhciBrID0gbiAtIDE7IGsgPiAwOyBrLS0pIHRpY2tzLnB1c2gocG93KGkpICogayk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gMDsgdGlja3NbaV0gPCB1OyBpKyspIHt9XG4gICAgICAgIGZvciAoaiA9IHRpY2tzLmxlbmd0aDsgdGlja3NbaiAtIDFdID4gdjsgai0tKSB7fVxuICAgICAgICB0aWNrcyA9IHRpY2tzLnNsaWNlKGksIGopO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRpY2tzO1xuICAgIH07XG4gICAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKG4sIGZvcm1hdCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZDNfc2NhbGVfbG9nRm9ybWF0O1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSBmb3JtYXQgPSBkM19zY2FsZV9sb2dGb3JtYXQ7IGVsc2UgaWYgKHR5cGVvZiBmb3JtYXQgIT09IFwiZnVuY3Rpb25cIikgZm9ybWF0ID0gZDMuZm9ybWF0KGZvcm1hdCk7XG4gICAgICB2YXIgayA9IE1hdGgubWF4KDEsIGJhc2UgKiBuIC8gc2NhbGUudGlja3MoKS5sZW5ndGgpO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgdmFyIGkgPSBkIC8gcG93KE1hdGgucm91bmQobG9nKGQpKSk7XG4gICAgICAgIGlmIChpICogYmFzZSA8IGJhc2UgLSAuNSkgaSAqPSBiYXNlO1xuICAgICAgICByZXR1cm4gaSA8PSBrID8gZm9ybWF0KGQpIDogXCJcIjtcbiAgICAgIH07XG4gICAgfTtcbiAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZDNfc2NhbGVfbG9nKGxpbmVhci5jb3B5KCksIGJhc2UsIHBvc2l0aXZlLCBkb21haW4pO1xuICAgIH07XG4gICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclJlYmluZChzY2FsZSwgbGluZWFyKTtcbiAgfVxuICB2YXIgZDNfc2NhbGVfbG9nRm9ybWF0ID0gZDMuZm9ybWF0KFwiLjBlXCIpLCBkM19zY2FsZV9sb2dOaWNlTmVnYXRpdmUgPSB7XG4gICAgZmxvb3I6IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiAtTWF0aC5jZWlsKC14KTtcbiAgICB9LFxuICAgIGNlaWw6IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiAtTWF0aC5mbG9vcigteCk7XG4gICAgfVxuICB9O1xuICBkMy5zY2FsZS5wb3cgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDNfc2NhbGVfcG93KGQzLnNjYWxlLmxpbmVhcigpLCAxLCBbIDAsIDEgXSk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3NjYWxlX3BvdyhsaW5lYXIsIGV4cG9uZW50LCBkb21haW4pIHtcbiAgICB2YXIgcG93cCA9IGQzX3NjYWxlX3Bvd1BvdyhleHBvbmVudCksIHBvd2IgPSBkM19zY2FsZV9wb3dQb3coMSAvIGV4cG9uZW50KTtcbiAgICBmdW5jdGlvbiBzY2FsZSh4KSB7XG4gICAgICByZXR1cm4gbGluZWFyKHBvd3AoeCkpO1xuICAgIH1cbiAgICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gcG93YihsaW5lYXIuaW52ZXJ0KHgpKTtcbiAgICB9O1xuICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbjtcbiAgICAgIGxpbmVhci5kb21haW4oKGRvbWFpbiA9IHgubWFwKE51bWJlcikpLm1hcChwb3dwKSk7XG4gICAgICByZXR1cm4gc2NhbGU7XG4gICAgfTtcbiAgICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKG0pIHtcbiAgICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJUaWNrcyhkb21haW4sIG0pO1xuICAgIH07XG4gICAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKG0sIGZvcm1hdCkge1xuICAgICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclRpY2tGb3JtYXQoZG9tYWluLCBtLCBmb3JtYXQpO1xuICAgIH07XG4gICAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKG0pIHtcbiAgICAgIHJldHVybiBzY2FsZS5kb21haW4oZDNfc2NhbGVfbGluZWFyTmljZShkb21haW4sIG0pKTtcbiAgICB9O1xuICAgIHNjYWxlLmV4cG9uZW50ID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZXhwb25lbnQ7XG4gICAgICBwb3dwID0gZDNfc2NhbGVfcG93UG93KGV4cG9uZW50ID0geCk7XG4gICAgICBwb3diID0gZDNfc2NhbGVfcG93UG93KDEgLyBleHBvbmVudCk7XG4gICAgICBsaW5lYXIuZG9tYWluKGRvbWFpbi5tYXAocG93cCkpO1xuICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH07XG4gICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGQzX3NjYWxlX3BvdyhsaW5lYXIuY29weSgpLCBleHBvbmVudCwgZG9tYWluKTtcbiAgICB9O1xuICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJSZWJpbmQoc2NhbGUsIGxpbmVhcik7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc2NhbGVfcG93UG93KGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIHggPCAwID8gLU1hdGgucG93KC14LCBlKSA6IE1hdGgucG93KHgsIGUpO1xuICAgIH07XG4gIH1cbiAgZDMuc2NhbGUuc3FydCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkMy5zY2FsZS5wb3coKS5leHBvbmVudCguNSk7XG4gIH07XG4gIGQzLnNjYWxlLm9yZGluYWwgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDNfc2NhbGVfb3JkaW5hbChbXSwge1xuICAgICAgdDogXCJyYW5nZVwiLFxuICAgICAgYTogWyBbXSBdXG4gICAgfSk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3NjYWxlX29yZGluYWwoZG9tYWluLCByYW5nZXIpIHtcbiAgICB2YXIgaW5kZXgsIHJhbmdlLCByYW5nZUJhbmQ7XG4gICAgZnVuY3Rpb24gc2NhbGUoeCkge1xuICAgICAgcmV0dXJuIHJhbmdlWygoaW5kZXguZ2V0KHgpIHx8IChyYW5nZXIudCA9PT0gXCJyYW5nZVwiID8gaW5kZXguc2V0KHgsIGRvbWFpbi5wdXNoKHgpKSA6IE5hTikpIC0gMSkgJSByYW5nZS5sZW5ndGhdO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdGVwcyhzdGFydCwgc3RlcCkge1xuICAgICAgcmV0dXJuIGQzLnJhbmdlKGRvbWFpbi5sZW5ndGgpLm1hcChmdW5jdGlvbihpKSB7XG4gICAgICAgIHJldHVybiBzdGFydCArIHN0ZXAgKiBpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbjtcbiAgICAgIGRvbWFpbiA9IFtdO1xuICAgICAgaW5kZXggPSBuZXcgZDNfTWFwKCk7XG4gICAgICB2YXIgaSA9IC0xLCBuID0geC5sZW5ndGgsIHhpO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICghaW5kZXguaGFzKHhpID0geFtpXSkpIGluZGV4LnNldCh4aSwgZG9tYWluLnB1c2goeGkpKTtcbiAgICAgIHJldHVybiBzY2FsZVtyYW5nZXIudF0uYXBwbHkoc2NhbGUsIHJhbmdlci5hKTtcbiAgICB9O1xuICAgIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFuZ2U7XG4gICAgICByYW5nZSA9IHg7XG4gICAgICByYW5nZUJhbmQgPSAwO1xuICAgICAgcmFuZ2VyID0ge1xuICAgICAgICB0OiBcInJhbmdlXCIsXG4gICAgICAgIGE6IGFyZ3VtZW50c1xuICAgICAgfTtcbiAgICAgIHJldHVybiBzY2FsZTtcbiAgICB9O1xuICAgIHNjYWxlLnJhbmdlUG9pbnRzID0gZnVuY3Rpb24oeCwgcGFkZGluZykge1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSBwYWRkaW5nID0gMDtcbiAgICAgIHZhciBzdGFydCA9IHhbMF0sIHN0b3AgPSB4WzFdLCBzdGVwID0gZG9tYWluLmxlbmd0aCA8IDIgPyAoc3RhcnQgPSAoc3RhcnQgKyBzdG9wKSAvIDIsIFxuICAgICAgMCkgOiAoc3RvcCAtIHN0YXJ0KSAvIChkb21haW4ubGVuZ3RoIC0gMSArIHBhZGRpbmcpO1xuICAgICAgcmFuZ2UgPSBzdGVwcyhzdGFydCArIHN0ZXAgKiBwYWRkaW5nIC8gMiwgc3RlcCk7XG4gICAgICByYW5nZUJhbmQgPSAwO1xuICAgICAgcmFuZ2VyID0ge1xuICAgICAgICB0OiBcInJhbmdlUG9pbnRzXCIsXG4gICAgICAgIGE6IGFyZ3VtZW50c1xuICAgICAgfTtcbiAgICAgIHJldHVybiBzY2FsZTtcbiAgICB9O1xuICAgIHNjYWxlLnJhbmdlUm91bmRQb2ludHMgPSBmdW5jdGlvbih4LCBwYWRkaW5nKSB7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHBhZGRpbmcgPSAwO1xuICAgICAgdmFyIHN0YXJ0ID0geFswXSwgc3RvcCA9IHhbMV0sIHN0ZXAgPSBkb21haW4ubGVuZ3RoIDwgMiA/IChzdGFydCA9IHN0b3AgPSBNYXRoLnJvdW5kKChzdGFydCArIHN0b3ApIC8gMiksIFxuICAgICAgMCkgOiAoc3RvcCAtIHN0YXJ0KSAvIChkb21haW4ubGVuZ3RoIC0gMSArIHBhZGRpbmcpIHwgMDtcbiAgICAgIHJhbmdlID0gc3RlcHMoc3RhcnQgKyBNYXRoLnJvdW5kKHN0ZXAgKiBwYWRkaW5nIC8gMiArIChzdG9wIC0gc3RhcnQgLSAoZG9tYWluLmxlbmd0aCAtIDEgKyBwYWRkaW5nKSAqIHN0ZXApIC8gMiksIHN0ZXApO1xuICAgICAgcmFuZ2VCYW5kID0gMDtcbiAgICAgIHJhbmdlciA9IHtcbiAgICAgICAgdDogXCJyYW5nZVJvdW5kUG9pbnRzXCIsXG4gICAgICAgIGE6IGFyZ3VtZW50c1xuICAgICAgfTtcbiAgICAgIHJldHVybiBzY2FsZTtcbiAgICB9O1xuICAgIHNjYWxlLnJhbmdlQmFuZHMgPSBmdW5jdGlvbih4LCBwYWRkaW5nLCBvdXRlclBhZGRpbmcpIHtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcGFkZGluZyA9IDA7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIG91dGVyUGFkZGluZyA9IHBhZGRpbmc7XG4gICAgICB2YXIgcmV2ZXJzZSA9IHhbMV0gPCB4WzBdLCBzdGFydCA9IHhbcmV2ZXJzZSAtIDBdLCBzdG9wID0geFsxIC0gcmV2ZXJzZV0sIHN0ZXAgPSAoc3RvcCAtIHN0YXJ0KSAvIChkb21haW4ubGVuZ3RoIC0gcGFkZGluZyArIDIgKiBvdXRlclBhZGRpbmcpO1xuICAgICAgcmFuZ2UgPSBzdGVwcyhzdGFydCArIHN0ZXAgKiBvdXRlclBhZGRpbmcsIHN0ZXApO1xuICAgICAgaWYgKHJldmVyc2UpIHJhbmdlLnJldmVyc2UoKTtcbiAgICAgIHJhbmdlQmFuZCA9IHN0ZXAgKiAoMSAtIHBhZGRpbmcpO1xuICAgICAgcmFuZ2VyID0ge1xuICAgICAgICB0OiBcInJhbmdlQmFuZHNcIixcbiAgICAgICAgYTogYXJndW1lbnRzXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH07XG4gICAgc2NhbGUucmFuZ2VSb3VuZEJhbmRzID0gZnVuY3Rpb24oeCwgcGFkZGluZywgb3V0ZXJQYWRkaW5nKSB7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHBhZGRpbmcgPSAwO1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBvdXRlclBhZGRpbmcgPSBwYWRkaW5nO1xuICAgICAgdmFyIHJldmVyc2UgPSB4WzFdIDwgeFswXSwgc3RhcnQgPSB4W3JldmVyc2UgLSAwXSwgc3RvcCA9IHhbMSAtIHJldmVyc2VdLCBzdGVwID0gTWF0aC5mbG9vcigoc3RvcCAtIHN0YXJ0KSAvIChkb21haW4ubGVuZ3RoIC0gcGFkZGluZyArIDIgKiBvdXRlclBhZGRpbmcpKTtcbiAgICAgIHJhbmdlID0gc3RlcHMoc3RhcnQgKyBNYXRoLnJvdW5kKChzdG9wIC0gc3RhcnQgLSAoZG9tYWluLmxlbmd0aCAtIHBhZGRpbmcpICogc3RlcCkgLyAyKSwgc3RlcCk7XG4gICAgICBpZiAocmV2ZXJzZSkgcmFuZ2UucmV2ZXJzZSgpO1xuICAgICAgcmFuZ2VCYW5kID0gTWF0aC5yb3VuZChzdGVwICogKDEgLSBwYWRkaW5nKSk7XG4gICAgICByYW5nZXIgPSB7XG4gICAgICAgIHQ6IFwicmFuZ2VSb3VuZEJhbmRzXCIsXG4gICAgICAgIGE6IGFyZ3VtZW50c1xuICAgICAgfTtcbiAgICAgIHJldHVybiBzY2FsZTtcbiAgICB9O1xuICAgIHNjYWxlLnJhbmdlQmFuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHJhbmdlQmFuZDtcbiAgICB9O1xuICAgIHNjYWxlLnJhbmdlRXh0ZW50ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZDNfc2NhbGVFeHRlbnQocmFuZ2VyLmFbMF0pO1xuICAgIH07XG4gICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGQzX3NjYWxlX29yZGluYWwoZG9tYWluLCByYW5nZXIpO1xuICAgIH07XG4gICAgcmV0dXJuIHNjYWxlLmRvbWFpbihkb21haW4pO1xuICB9XG4gIGQzLnNjYWxlLmNhdGVnb3J5MTAgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDMuc2NhbGUub3JkaW5hbCgpLnJhbmdlKGQzX2NhdGVnb3J5MTApO1xuICB9O1xuICBkMy5zY2FsZS5jYXRlZ29yeTIwID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzLnNjYWxlLm9yZGluYWwoKS5yYW5nZShkM19jYXRlZ29yeTIwKTtcbiAgfTtcbiAgZDMuc2NhbGUuY2F0ZWdvcnkyMGIgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDMuc2NhbGUub3JkaW5hbCgpLnJhbmdlKGQzX2NhdGVnb3J5MjBiKTtcbiAgfTtcbiAgZDMuc2NhbGUuY2F0ZWdvcnkyMGMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDMuc2NhbGUub3JkaW5hbCgpLnJhbmdlKGQzX2NhdGVnb3J5MjBjKTtcbiAgfTtcbiAgdmFyIGQzX2NhdGVnb3J5MTAgPSBbIDIwNjIyNjAsIDE2NzQ0MjA2LCAyOTI0NTg4LCAxNDAzNDcyOCwgOTcyNTg4NSwgOTE5NzEzMSwgMTQ5MDczMzAsIDgzNTU3MTEsIDEyMzY5MTg2LCAxNTU2MTc1IF0ubWFwKGQzX3JnYlN0cmluZyk7XG4gIHZhciBkM19jYXRlZ29yeTIwID0gWyAyMDYyMjYwLCAxMTQ1NDQ0MCwgMTY3NDQyMDYsIDE2NzU5NjcyLCAyOTI0NTg4LCAxMDAxODY5OCwgMTQwMzQ3MjgsIDE2NzUwNzQyLCA5NzI1ODg1LCAxMjk1NTg2MSwgOTE5NzEzMSwgMTI4ODUxNDAsIDE0OTA3MzMwLCAxNjIzNDE5NCwgODM1NTcxMSwgMTMwOTI4MDcsIDEyMzY5MTg2LCAxNDQwODU4OSwgMTU1NjE3NSwgMTA0MTA3MjUgXS5tYXAoZDNfcmdiU3RyaW5nKTtcbiAgdmFyIGQzX2NhdGVnb3J5MjBiID0gWyAzNzUwNzc3LCA1Mzk1NjE5LCA3MDQwNzE5LCAxMDI2NDI4NiwgNjUxOTA5NywgOTIxNjU5NCwgMTE5MTUxMTUsIDEzNTU2NjM2LCA5MjAyOTkzLCAxMjQyNjgwOSwgMTUxODY1MTQsIDE1MTkwOTMyLCA4NjY2MTY5LCAxMTM1NjQ5MCwgMTQwNDk2NDMsIDE1MTc3MzcyLCA4MDc3NjgzLCAxMDgzNDMyNCwgMTM1Mjg1MDksIDE0NTg5NjU0IF0ubWFwKGQzX3JnYlN0cmluZyk7XG4gIHZhciBkM19jYXRlZ29yeTIwYyA9IFsgMzI0NDczMywgNzA1NzExMCwgMTA0MDY2MjUsIDEzMDMyNDMxLCAxNTA5NTA1MywgMTY2MTY3NjQsIDE2NjI1MjU5LCAxNjYzNDAxOCwgMzI1MzA3NiwgNzY1MjQ3MCwgMTA2MDcwMDMsIDEzMTAxNTA0LCA3Njk1MjgxLCAxMDM5NDMxMiwgMTIzNjkzNzIsIDE0MzQyODkxLCA2NTEzNTA3LCA5ODY4OTUwLCAxMjQzNDg3NywgMTQyNzcwODEgXS5tYXAoZDNfcmdiU3RyaW5nKTtcbiAgZDMuc2NhbGUucXVhbnRpbGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDNfc2NhbGVfcXVhbnRpbGUoW10sIFtdKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc2NhbGVfcXVhbnRpbGUoZG9tYWluLCByYW5nZSkge1xuICAgIHZhciB0aHJlc2hvbGRzO1xuICAgIGZ1bmN0aW9uIHJlc2NhbGUoKSB7XG4gICAgICB2YXIgayA9IDAsIHEgPSByYW5nZS5sZW5ndGg7XG4gICAgICB0aHJlc2hvbGRzID0gW107XG4gICAgICB3aGlsZSAoKytrIDwgcSkgdGhyZXNob2xkc1trIC0gMV0gPSBkMy5xdWFudGlsZShkb21haW4sIGsgLyBxKTtcbiAgICAgIHJldHVybiBzY2FsZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2NhbGUoeCkge1xuICAgICAgaWYgKCFpc05hTih4ID0gK3gpKSByZXR1cm4gcmFuZ2VbZDMuYmlzZWN0KHRocmVzaG9sZHMsIHgpXTtcbiAgICB9XG4gICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluO1xuICAgICAgZG9tYWluID0geC5tYXAoZDNfbnVtYmVyKS5maWx0ZXIoZDNfbnVtZXJpYykuc29ydChkM19hc2NlbmRpbmcpO1xuICAgICAgcmV0dXJuIHJlc2NhbGUoKTtcbiAgICB9O1xuICAgIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFuZ2U7XG4gICAgICByYW5nZSA9IHg7XG4gICAgICByZXR1cm4gcmVzY2FsZSgpO1xuICAgIH07XG4gICAgc2NhbGUucXVhbnRpbGVzID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhyZXNob2xkcztcbiAgICB9O1xuICAgIHNjYWxlLmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHtcbiAgICAgIHkgPSByYW5nZS5pbmRleE9mKHkpO1xuICAgICAgcmV0dXJuIHkgPCAwID8gWyBOYU4sIE5hTiBdIDogWyB5ID4gMCA/IHRocmVzaG9sZHNbeSAtIDFdIDogZG9tYWluWzBdLCB5IDwgdGhyZXNob2xkcy5sZW5ndGggPyB0aHJlc2hvbGRzW3ldIDogZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXSBdO1xuICAgIH07XG4gICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGQzX3NjYWxlX3F1YW50aWxlKGRvbWFpbiwgcmFuZ2UpO1xuICAgIH07XG4gICAgcmV0dXJuIHJlc2NhbGUoKTtcbiAgfVxuICBkMy5zY2FsZS5xdWFudGl6ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19zY2FsZV9xdWFudGl6ZSgwLCAxLCBbIDAsIDEgXSk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3NjYWxlX3F1YW50aXplKHgwLCB4MSwgcmFuZ2UpIHtcbiAgICB2YXIga3gsIGk7XG4gICAgZnVuY3Rpb24gc2NhbGUoeCkge1xuICAgICAgcmV0dXJuIHJhbmdlW01hdGgubWF4KDAsIE1hdGgubWluKGksIE1hdGguZmxvb3Ioa3ggKiAoeCAtIHgwKSkpKV07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlc2NhbGUoKSB7XG4gICAgICBreCA9IHJhbmdlLmxlbmd0aCAvICh4MSAtIHgwKTtcbiAgICAgIGkgPSByYW5nZS5sZW5ndGggLSAxO1xuICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH1cbiAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbIHgwLCB4MSBdO1xuICAgICAgeDAgPSAreFswXTtcbiAgICAgIHgxID0gK3hbeC5sZW5ndGggLSAxXTtcbiAgICAgIHJldHVybiByZXNjYWxlKCk7XG4gICAgfTtcbiAgICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhbmdlO1xuICAgICAgcmFuZ2UgPSB4O1xuICAgICAgcmV0dXJuIHJlc2NhbGUoKTtcbiAgICB9O1xuICAgIHNjYWxlLmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHtcbiAgICAgIHkgPSByYW5nZS5pbmRleE9mKHkpO1xuICAgICAgeSA9IHkgPCAwID8gTmFOIDogeSAvIGt4ICsgeDA7XG4gICAgICByZXR1cm4gWyB5LCB5ICsgMSAvIGt4IF07XG4gICAgfTtcbiAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZDNfc2NhbGVfcXVhbnRpemUoeDAsIHgxLCByYW5nZSk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVzY2FsZSgpO1xuICB9XG4gIGQzLnNjYWxlLnRocmVzaG9sZCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19zY2FsZV90aHJlc2hvbGQoWyAuNSBdLCBbIDAsIDEgXSk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3NjYWxlX3RocmVzaG9sZChkb21haW4sIHJhbmdlKSB7XG4gICAgZnVuY3Rpb24gc2NhbGUoeCkge1xuICAgICAgaWYgKHggPD0geCkgcmV0dXJuIHJhbmdlW2QzLmJpc2VjdChkb21haW4sIHgpXTtcbiAgICB9XG4gICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluO1xuICAgICAgZG9tYWluID0gXztcbiAgICAgIHJldHVybiBzY2FsZTtcbiAgICB9O1xuICAgIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFuZ2U7XG4gICAgICByYW5nZSA9IF87XG4gICAgICByZXR1cm4gc2NhbGU7XG4gICAgfTtcbiAgICBzY2FsZS5pbnZlcnRFeHRlbnQgPSBmdW5jdGlvbih5KSB7XG4gICAgICB5ID0gcmFuZ2UuaW5kZXhPZih5KTtcbiAgICAgIHJldHVybiBbIGRvbWFpblt5IC0gMV0sIGRvbWFpblt5XSBdO1xuICAgIH07XG4gICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGQzX3NjYWxlX3RocmVzaG9sZChkb21haW4sIHJhbmdlKTtcbiAgICB9O1xuICAgIHJldHVybiBzY2FsZTtcbiAgfVxuICBkMy5zY2FsZS5pZGVudGl0eSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19zY2FsZV9pZGVudGl0eShbIDAsIDEgXSk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3NjYWxlX2lkZW50aXR5KGRvbWFpbikge1xuICAgIGZ1bmN0aW9uIGlkZW50aXR5KHgpIHtcbiAgICAgIHJldHVybiAreDtcbiAgICB9XG4gICAgaWRlbnRpdHkuaW52ZXJ0ID0gaWRlbnRpdHk7XG4gICAgaWRlbnRpdHkuZG9tYWluID0gaWRlbnRpdHkucmFuZ2UgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW47XG4gICAgICBkb21haW4gPSB4Lm1hcChpZGVudGl0eSk7XG4gICAgICByZXR1cm4gaWRlbnRpdHk7XG4gICAgfTtcbiAgICBpZGVudGl0eS50aWNrcyA9IGZ1bmN0aW9uKG0pIHtcbiAgICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJUaWNrcyhkb21haW4sIG0pO1xuICAgIH07XG4gICAgaWRlbnRpdHkudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKG0sIGZvcm1hdCkge1xuICAgICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclRpY2tGb3JtYXQoZG9tYWluLCBtLCBmb3JtYXQpO1xuICAgIH07XG4gICAgaWRlbnRpdHkuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGQzX3NjYWxlX2lkZW50aXR5KGRvbWFpbik7XG4gICAgfTtcbiAgICByZXR1cm4gaWRlbnRpdHk7XG4gIH1cbiAgZDMuc3ZnID0ge307XG4gIGZ1bmN0aW9uIGQzX3plcm8oKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgZDMuc3ZnLmFyYyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpbm5lclJhZGl1cyA9IGQzX3N2Z19hcmNJbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMgPSBkM19zdmdfYXJjT3V0ZXJSYWRpdXMsIGNvcm5lclJhZGl1cyA9IGQzX3plcm8sIHBhZFJhZGl1cyA9IGQzX3N2Z19hcmNBdXRvLCBzdGFydEFuZ2xlID0gZDNfc3ZnX2FyY1N0YXJ0QW5nbGUsIGVuZEFuZ2xlID0gZDNfc3ZnX2FyY0VuZEFuZ2xlLCBwYWRBbmdsZSA9IGQzX3N2Z19hcmNQYWRBbmdsZTtcbiAgICBmdW5jdGlvbiBhcmMoKSB7XG4gICAgICB2YXIgcjAgPSBNYXRoLm1heCgwLCAraW5uZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSksIHIxID0gTWF0aC5tYXgoMCwgK291dGVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpLCBhMCA9IHN0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSAtIGhhbGbPgCwgYTEgPSBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIC0gaGFsZs+ALCBkYSA9IE1hdGguYWJzKGExIC0gYTApLCBjdyA9IGEwID4gYTEgPyAwIDogMTtcbiAgICAgIGlmIChyMSA8IHIwKSByYyA9IHIxLCByMSA9IHIwLCByMCA9IHJjO1xuICAgICAgaWYgKGRhID49IM+EzrUpIHJldHVybiBjaXJjbGVTZWdtZW50KHIxLCBjdykgKyAocjAgPyBjaXJjbGVTZWdtZW50KHIwLCAxIC0gY3cpIDogXCJcIikgKyBcIlpcIjtcbiAgICAgIHZhciByYywgY3IsIHJwLCBhcCwgcDAgPSAwLCBwMSA9IDAsIHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgcGF0aCA9IFtdO1xuICAgICAgaWYgKGFwID0gKCtwYWRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IDApIC8gMikge1xuICAgICAgICBycCA9IHBhZFJhZGl1cyA9PT0gZDNfc3ZnX2FyY0F1dG8gPyBNYXRoLnNxcnQocjAgKiByMCArIHIxICogcjEpIDogK3BhZFJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICBpZiAoIWN3KSBwMSAqPSAtMTtcbiAgICAgICAgaWYgKHIxKSBwMSA9IGQzX2FzaW4ocnAgLyByMSAqIE1hdGguc2luKGFwKSk7XG4gICAgICAgIGlmIChyMCkgcDAgPSBkM19hc2luKHJwIC8gcjAgKiBNYXRoLnNpbihhcCkpO1xuICAgICAgfVxuICAgICAgaWYgKHIxKSB7XG4gICAgICAgIHgwID0gcjEgKiBNYXRoLmNvcyhhMCArIHAxKTtcbiAgICAgICAgeTAgPSByMSAqIE1hdGguc2luKGEwICsgcDEpO1xuICAgICAgICB4MSA9IHIxICogTWF0aC5jb3MoYTEgLSBwMSk7XG4gICAgICAgIHkxID0gcjEgKiBNYXRoLnNpbihhMSAtIHAxKTtcbiAgICAgICAgdmFyIGwxID0gTWF0aC5hYnMoYTEgLSBhMCAtIDIgKiBwMSkgPD0gz4AgPyAwIDogMTtcbiAgICAgICAgaWYgKHAxICYmIGQzX3N2Z19hcmNTd2VlcCh4MCwgeTAsIHgxLCB5MSkgPT09IGN3IF4gbDEpIHtcbiAgICAgICAgICB2YXIgaDEgPSAoYTAgKyBhMSkgLyAyO1xuICAgICAgICAgIHgwID0gcjEgKiBNYXRoLmNvcyhoMSk7XG4gICAgICAgICAgeTAgPSByMSAqIE1hdGguc2luKGgxKTtcbiAgICAgICAgICB4MSA9IHkxID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeDAgPSB5MCA9IDA7XG4gICAgICB9XG4gICAgICBpZiAocjApIHtcbiAgICAgICAgeDIgPSByMCAqIE1hdGguY29zKGExIC0gcDApO1xuICAgICAgICB5MiA9IHIwICogTWF0aC5zaW4oYTEgLSBwMCk7XG4gICAgICAgIHgzID0gcjAgKiBNYXRoLmNvcyhhMCArIHAwKTtcbiAgICAgICAgeTMgPSByMCAqIE1hdGguc2luKGEwICsgcDApO1xuICAgICAgICB2YXIgbDAgPSBNYXRoLmFicyhhMCAtIGExICsgMiAqIHAwKSA8PSDPgCA/IDAgOiAxO1xuICAgICAgICBpZiAocDAgJiYgZDNfc3ZnX2FyY1N3ZWVwKHgyLCB5MiwgeDMsIHkzKSA9PT0gMSAtIGN3IF4gbDApIHtcbiAgICAgICAgICB2YXIgaDAgPSAoYTAgKyBhMSkgLyAyO1xuICAgICAgICAgIHgyID0gcjAgKiBNYXRoLmNvcyhoMCk7XG4gICAgICAgICAgeTIgPSByMCAqIE1hdGguc2luKGgwKTtcbiAgICAgICAgICB4MyA9IHkzID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeDIgPSB5MiA9IDA7XG4gICAgICB9XG4gICAgICBpZiAoZGEgPiDOtSAmJiAocmMgPSBNYXRoLm1pbihNYXRoLmFicyhyMSAtIHIwKSAvIDIsICtjb3JuZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSkpID4gLjAwMSkge1xuICAgICAgICBjciA9IHIwIDwgcjEgXiBjdyA/IDAgOiAxO1xuICAgICAgICB2YXIgcmMxID0gcmMsIHJjMCA9IHJjO1xuICAgICAgICBpZiAoZGEgPCDPgCkge1xuICAgICAgICAgIHZhciBvYyA9IHgzID09IG51bGwgPyBbIHgyLCB5MiBdIDogeDEgPT0gbnVsbCA/IFsgeDAsIHkwIF0gOiBkM19nZW9tX3BvbHlnb25JbnRlcnNlY3QoWyB4MCwgeTAgXSwgWyB4MywgeTMgXSwgWyB4MSwgeTEgXSwgWyB4MiwgeTIgXSksIGF4ID0geDAgLSBvY1swXSwgYXkgPSB5MCAtIG9jWzFdLCBieCA9IHgxIC0gb2NbMF0sIGJ5ID0geTEgLSBvY1sxXSwga2MgPSAxIC8gTWF0aC5zaW4oTWF0aC5hY29zKChheCAqIGJ4ICsgYXkgKiBieSkgLyAoTWF0aC5zcXJ0KGF4ICogYXggKyBheSAqIGF5KSAqIE1hdGguc3FydChieCAqIGJ4ICsgYnkgKiBieSkpKSAvIDIpLCBsYyA9IE1hdGguc3FydChvY1swXSAqIG9jWzBdICsgb2NbMV0gKiBvY1sxXSk7XG4gICAgICAgICAgcmMwID0gTWF0aC5taW4ocmMsIChyMCAtIGxjKSAvIChrYyAtIDEpKTtcbiAgICAgICAgICByYzEgPSBNYXRoLm1pbihyYywgKHIxIC0gbGMpIC8gKGtjICsgMSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4MSAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIHQzMCA9IGQzX3N2Z19hcmNDb3JuZXJUYW5nZW50cyh4MyA9PSBudWxsID8gWyB4MiwgeTIgXSA6IFsgeDMsIHkzIF0sIFsgeDAsIHkwIF0sIHIxLCByYzEsIGN3KSwgdDEyID0gZDNfc3ZnX2FyY0Nvcm5lclRhbmdlbnRzKFsgeDEsIHkxIF0sIFsgeDIsIHkyIF0sIHIxLCByYzEsIGN3KTtcbiAgICAgICAgICBpZiAocmMgPT09IHJjMSkge1xuICAgICAgICAgICAgcGF0aC5wdXNoKFwiTVwiLCB0MzBbMF0sIFwiQVwiLCByYzEsIFwiLFwiLCByYzEsIFwiIDAgMCxcIiwgY3IsIFwiIFwiLCB0MzBbMV0sIFwiQVwiLCByMSwgXCIsXCIsIHIxLCBcIiAwIFwiLCAxIC0gY3cgXiBkM19zdmdfYXJjU3dlZXAodDMwWzFdWzBdLCB0MzBbMV1bMV0sIHQxMlsxXVswXSwgdDEyWzFdWzFdKSwgXCIsXCIsIGN3LCBcIiBcIiwgdDEyWzFdLCBcIkFcIiwgcmMxLCBcIixcIiwgcmMxLCBcIiAwIDAsXCIsIGNyLCBcIiBcIiwgdDEyWzBdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF0aC5wdXNoKFwiTVwiLCB0MzBbMF0sIFwiQVwiLCByYzEsIFwiLFwiLCByYzEsIFwiIDAgMSxcIiwgY3IsIFwiIFwiLCB0MTJbMF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXRoLnB1c2goXCJNXCIsIHgwLCBcIixcIiwgeTApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh4MyAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIHQwMyA9IGQzX3N2Z19hcmNDb3JuZXJUYW5nZW50cyhbIHgwLCB5MCBdLCBbIHgzLCB5MyBdLCByMCwgLXJjMCwgY3cpLCB0MjEgPSBkM19zdmdfYXJjQ29ybmVyVGFuZ2VudHMoWyB4MiwgeTIgXSwgeDEgPT0gbnVsbCA/IFsgeDAsIHkwIF0gOiBbIHgxLCB5MSBdLCByMCwgLXJjMCwgY3cpO1xuICAgICAgICAgIGlmIChyYyA9PT0gcmMwKSB7XG4gICAgICAgICAgICBwYXRoLnB1c2goXCJMXCIsIHQyMVswXSwgXCJBXCIsIHJjMCwgXCIsXCIsIHJjMCwgXCIgMCAwLFwiLCBjciwgXCIgXCIsIHQyMVsxXSwgXCJBXCIsIHIwLCBcIixcIiwgcjAsIFwiIDAgXCIsIGN3IF4gZDNfc3ZnX2FyY1N3ZWVwKHQyMVsxXVswXSwgdDIxWzFdWzFdLCB0MDNbMV1bMF0sIHQwM1sxXVsxXSksIFwiLFwiLCAxIC0gY3csIFwiIFwiLCB0MDNbMV0sIFwiQVwiLCByYzAsIFwiLFwiLCByYzAsIFwiIDAgMCxcIiwgY3IsIFwiIFwiLCB0MDNbMF0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXRoLnB1c2goXCJMXCIsIHQyMVswXSwgXCJBXCIsIHJjMCwgXCIsXCIsIHJjMCwgXCIgMCAwLFwiLCBjciwgXCIgXCIsIHQwM1swXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhdGgucHVzaChcIkxcIiwgeDIsIFwiLFwiLCB5Mik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGgucHVzaChcIk1cIiwgeDAsIFwiLFwiLCB5MCk7XG4gICAgICAgIGlmICh4MSAhPSBudWxsKSBwYXRoLnB1c2goXCJBXCIsIHIxLCBcIixcIiwgcjEsIFwiIDAgXCIsIGwxLCBcIixcIiwgY3csIFwiIFwiLCB4MSwgXCIsXCIsIHkxKTtcbiAgICAgICAgcGF0aC5wdXNoKFwiTFwiLCB4MiwgXCIsXCIsIHkyKTtcbiAgICAgICAgaWYgKHgzICE9IG51bGwpIHBhdGgucHVzaChcIkFcIiwgcjAsIFwiLFwiLCByMCwgXCIgMCBcIiwgbDAsIFwiLFwiLCAxIC0gY3csIFwiIFwiLCB4MywgXCIsXCIsIHkzKTtcbiAgICAgIH1cbiAgICAgIHBhdGgucHVzaChcIlpcIik7XG4gICAgICByZXR1cm4gcGF0aC5qb2luKFwiXCIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaXJjbGVTZWdtZW50KHIxLCBjdykge1xuICAgICAgcmV0dXJuIFwiTTAsXCIgKyByMSArIFwiQVwiICsgcjEgKyBcIixcIiArIHIxICsgXCIgMCAxLFwiICsgY3cgKyBcIiAwLFwiICsgLXIxICsgXCJBXCIgKyByMSArIFwiLFwiICsgcjEgKyBcIiAwIDEsXCIgKyBjdyArIFwiIDAsXCIgKyByMTtcbiAgICB9XG4gICAgYXJjLmlubmVyUmFkaXVzID0gZnVuY3Rpb24odikge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gaW5uZXJSYWRpdXM7XG4gICAgICBpbm5lclJhZGl1cyA9IGQzX2Z1bmN0b3Iodik7XG4gICAgICByZXR1cm4gYXJjO1xuICAgIH07XG4gICAgYXJjLm91dGVyUmFkaXVzID0gZnVuY3Rpb24odikge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3V0ZXJSYWRpdXM7XG4gICAgICBvdXRlclJhZGl1cyA9IGQzX2Z1bmN0b3Iodik7XG4gICAgICByZXR1cm4gYXJjO1xuICAgIH07XG4gICAgYXJjLmNvcm5lclJhZGl1cyA9IGZ1bmN0aW9uKHYpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNvcm5lclJhZGl1cztcbiAgICAgIGNvcm5lclJhZGl1cyA9IGQzX2Z1bmN0b3Iodik7XG4gICAgICByZXR1cm4gYXJjO1xuICAgIH07XG4gICAgYXJjLnBhZFJhZGl1cyA9IGZ1bmN0aW9uKHYpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHBhZFJhZGl1cztcbiAgICAgIHBhZFJhZGl1cyA9IHYgPT0gZDNfc3ZnX2FyY0F1dG8gPyBkM19zdmdfYXJjQXV0byA6IGQzX2Z1bmN0b3Iodik7XG4gICAgICByZXR1cm4gYXJjO1xuICAgIH07XG4gICAgYXJjLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbih2KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzdGFydEFuZ2xlO1xuICAgICAgc3RhcnRBbmdsZSA9IGQzX2Z1bmN0b3Iodik7XG4gICAgICByZXR1cm4gYXJjO1xuICAgIH07XG4gICAgYXJjLmVuZEFuZ2xlID0gZnVuY3Rpb24odikge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZW5kQW5nbGU7XG4gICAgICBlbmRBbmdsZSA9IGQzX2Z1bmN0b3Iodik7XG4gICAgICByZXR1cm4gYXJjO1xuICAgIH07XG4gICAgYXJjLnBhZEFuZ2xlID0gZnVuY3Rpb24odikge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcGFkQW5nbGU7XG4gICAgICBwYWRBbmdsZSA9IGQzX2Z1bmN0b3Iodik7XG4gICAgICByZXR1cm4gYXJjO1xuICAgIH07XG4gICAgYXJjLmNlbnRyb2lkID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgciA9ICgraW5uZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICtvdXRlclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIsIGEgPSAoK3N0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICtlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIgLSBoYWxmz4A7XG4gICAgICByZXR1cm4gWyBNYXRoLmNvcyhhKSAqIHIsIE1hdGguc2luKGEpICogciBdO1xuICAgIH07XG4gICAgcmV0dXJuIGFyYztcbiAgfTtcbiAgdmFyIGQzX3N2Z19hcmNBdXRvID0gXCJhdXRvXCI7XG4gIGZ1bmN0aW9uIGQzX3N2Z19hcmNJbm5lclJhZGl1cyhkKSB7XG4gICAgcmV0dXJuIGQuaW5uZXJSYWRpdXM7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc3ZnX2FyY091dGVyUmFkaXVzKGQpIHtcbiAgICByZXR1cm4gZC5vdXRlclJhZGl1cztcbiAgfVxuICBmdW5jdGlvbiBkM19zdmdfYXJjU3RhcnRBbmdsZShkKSB7XG4gICAgcmV0dXJuIGQuc3RhcnRBbmdsZTtcbiAgfVxuICBmdW5jdGlvbiBkM19zdmdfYXJjRW5kQW5nbGUoZCkge1xuICAgIHJldHVybiBkLmVuZEFuZ2xlO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19hcmNQYWRBbmdsZShkKSB7XG4gICAgcmV0dXJuIGQgJiYgZC5wYWRBbmdsZTtcbiAgfVxuICBmdW5jdGlvbiBkM19zdmdfYXJjU3dlZXAoeDAsIHkwLCB4MSwgeTEpIHtcbiAgICByZXR1cm4gKHgwIC0geDEpICogeTAgLSAoeTAgLSB5MSkgKiB4MCA+IDAgPyAwIDogMTtcbiAgfVxuICBmdW5jdGlvbiBkM19zdmdfYXJjQ29ybmVyVGFuZ2VudHMocDAsIHAxLCByMSwgcmMsIGN3KSB7XG4gICAgdmFyIHgwMSA9IHAwWzBdIC0gcDFbMF0sIHkwMSA9IHAwWzFdIC0gcDFbMV0sIGxvID0gKGN3ID8gcmMgOiAtcmMpIC8gTWF0aC5zcXJ0KHgwMSAqIHgwMSArIHkwMSAqIHkwMSksIG94ID0gbG8gKiB5MDEsIG95ID0gLWxvICogeDAxLCB4MSA9IHAwWzBdICsgb3gsIHkxID0gcDBbMV0gKyBveSwgeDIgPSBwMVswXSArIG94LCB5MiA9IHAxWzFdICsgb3ksIHgzID0gKHgxICsgeDIpIC8gMiwgeTMgPSAoeTEgKyB5MikgLyAyLCBkeCA9IHgyIC0geDEsIGR5ID0geTIgLSB5MSwgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeSwgciA9IHIxIC0gcmMsIEQgPSB4MSAqIHkyIC0geDIgKiB5MSwgZCA9IChkeSA8IDAgPyAtMSA6IDEpICogTWF0aC5zcXJ0KE1hdGgubWF4KDAsIHIgKiByICogZDIgLSBEICogRCkpLCBjeDAgPSAoRCAqIGR5IC0gZHggKiBkKSAvIGQyLCBjeTAgPSAoLUQgKiBkeCAtIGR5ICogZCkgLyBkMiwgY3gxID0gKEQgKiBkeSArIGR4ICogZCkgLyBkMiwgY3kxID0gKC1EICogZHggKyBkeSAqIGQpIC8gZDIsIGR4MCA9IGN4MCAtIHgzLCBkeTAgPSBjeTAgLSB5MywgZHgxID0gY3gxIC0geDMsIGR5MSA9IGN5MSAtIHkzO1xuICAgIGlmIChkeDAgKiBkeDAgKyBkeTAgKiBkeTAgPiBkeDEgKiBkeDEgKyBkeTEgKiBkeTEpIGN4MCA9IGN4MSwgY3kwID0gY3kxO1xuICAgIHJldHVybiBbIFsgY3gwIC0gb3gsIGN5MCAtIG95IF0sIFsgY3gwICogcjEgLyByLCBjeTAgKiByMSAvIHIgXSBdO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lKHByb2plY3Rpb24pIHtcbiAgICB2YXIgeCA9IGQzX2dlb21fcG9pbnRYLCB5ID0gZDNfZ2VvbV9wb2ludFksIGRlZmluZWQgPSBkM190cnVlLCBpbnRlcnBvbGF0ZSA9IGQzX3N2Z19saW5lTGluZWFyLCBpbnRlcnBvbGF0ZUtleSA9IGludGVycG9sYXRlLmtleSwgdGVuc2lvbiA9IC43O1xuICAgIGZ1bmN0aW9uIGxpbmUoZGF0YSkge1xuICAgICAgdmFyIHNlZ21lbnRzID0gW10sIHBvaW50cyA9IFtdLCBpID0gLTEsIG4gPSBkYXRhLmxlbmd0aCwgZCwgZnggPSBkM19mdW5jdG9yKHgpLCBmeSA9IGQzX2Z1bmN0b3IoeSk7XG4gICAgICBmdW5jdGlvbiBzZWdtZW50KCkge1xuICAgICAgICBzZWdtZW50cy5wdXNoKFwiTVwiLCBpbnRlcnBvbGF0ZShwcm9qZWN0aW9uKHBvaW50cyksIHRlbnNpb24pKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgIGlmIChkZWZpbmVkLmNhbGwodGhpcywgZCA9IGRhdGFbaV0sIGkpKSB7XG4gICAgICAgICAgcG9pbnRzLnB1c2goWyArZnguY2FsbCh0aGlzLCBkLCBpKSwgK2Z5LmNhbGwodGhpcywgZCwgaSkgXSk7XG4gICAgICAgIH0gZWxzZSBpZiAocG9pbnRzLmxlbmd0aCkge1xuICAgICAgICAgIHNlZ21lbnQoKTtcbiAgICAgICAgICBwb2ludHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHBvaW50cy5sZW5ndGgpIHNlZ21lbnQoKTtcbiAgICAgIHJldHVybiBzZWdtZW50cy5sZW5ndGggPyBzZWdtZW50cy5qb2luKFwiXCIpIDogbnVsbDtcbiAgICB9XG4gICAgbGluZS54ID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDtcbiAgICAgIHggPSBfO1xuICAgICAgcmV0dXJuIGxpbmU7XG4gICAgfTtcbiAgICBsaW5lLnkgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5O1xuICAgICAgeSA9IF87XG4gICAgICByZXR1cm4gbGluZTtcbiAgICB9O1xuICAgIGxpbmUuZGVmaW5lZCA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRlZmluZWQ7XG4gICAgICBkZWZpbmVkID0gXztcbiAgICAgIHJldHVybiBsaW5lO1xuICAgIH07XG4gICAgbGluZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGludGVycG9sYXRlS2V5O1xuICAgICAgaWYgKHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIpIGludGVycG9sYXRlS2V5ID0gaW50ZXJwb2xhdGUgPSBfOyBlbHNlIGludGVycG9sYXRlS2V5ID0gKGludGVycG9sYXRlID0gZDNfc3ZnX2xpbmVJbnRlcnBvbGF0b3JzLmdldChfKSB8fCBkM19zdmdfbGluZUxpbmVhcikua2V5O1xuICAgICAgcmV0dXJuIGxpbmU7XG4gICAgfTtcbiAgICBsaW5lLnRlbnNpb24gPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0ZW5zaW9uO1xuICAgICAgdGVuc2lvbiA9IF87XG4gICAgICByZXR1cm4gbGluZTtcbiAgICB9O1xuICAgIHJldHVybiBsaW5lO1xuICB9XG4gIGQzLnN2Zy5saW5lID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzX3N2Z19saW5lKGQzX2lkZW50aXR5KTtcbiAgfTtcbiAgdmFyIGQzX3N2Z19saW5lSW50ZXJwb2xhdG9ycyA9IGQzLm1hcCh7XG4gICAgbGluZWFyOiBkM19zdmdfbGluZUxpbmVhcixcbiAgICBcImxpbmVhci1jbG9zZWRcIjogZDNfc3ZnX2xpbmVMaW5lYXJDbG9zZWQsXG4gICAgc3RlcDogZDNfc3ZnX2xpbmVTdGVwLFxuICAgIFwic3RlcC1iZWZvcmVcIjogZDNfc3ZnX2xpbmVTdGVwQmVmb3JlLFxuICAgIFwic3RlcC1hZnRlclwiOiBkM19zdmdfbGluZVN0ZXBBZnRlcixcbiAgICBiYXNpczogZDNfc3ZnX2xpbmVCYXNpcyxcbiAgICBcImJhc2lzLW9wZW5cIjogZDNfc3ZnX2xpbmVCYXNpc09wZW4sXG4gICAgXCJiYXNpcy1jbG9zZWRcIjogZDNfc3ZnX2xpbmVCYXNpc0Nsb3NlZCxcbiAgICBidW5kbGU6IGQzX3N2Z19saW5lQnVuZGxlLFxuICAgIGNhcmRpbmFsOiBkM19zdmdfbGluZUNhcmRpbmFsLFxuICAgIFwiY2FyZGluYWwtb3BlblwiOiBkM19zdmdfbGluZUNhcmRpbmFsT3BlbixcbiAgICBcImNhcmRpbmFsLWNsb3NlZFwiOiBkM19zdmdfbGluZUNhcmRpbmFsQ2xvc2VkLFxuICAgIG1vbm90b25lOiBkM19zdmdfbGluZU1vbm90b25lXG4gIH0pO1xuICBkM19zdmdfbGluZUludGVycG9sYXRvcnMuZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgdmFsdWUua2V5ID0ga2V5O1xuICAgIHZhbHVlLmNsb3NlZCA9IC8tY2xvc2VkJC8udGVzdChrZXkpO1xuICB9KTtcbiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKSB7XG4gICAgcmV0dXJuIHBvaW50cy5sZW5ndGggPiAxID8gcG9pbnRzLmpvaW4oXCJMXCIpIDogcG9pbnRzICsgXCJaXCI7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVMaW5lYXJDbG9zZWQocG9pbnRzKSB7XG4gICAgcmV0dXJuIHBvaW50cy5qb2luKFwiTFwiKSArIFwiWlwiO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lU3RlcChwb2ludHMpIHtcbiAgICB2YXIgaSA9IDAsIG4gPSBwb2ludHMubGVuZ3RoLCBwID0gcG9pbnRzWzBdLCBwYXRoID0gWyBwWzBdLCBcIixcIiwgcFsxXSBdO1xuICAgIHdoaWxlICgrK2kgPCBuKSBwYXRoLnB1c2goXCJIXCIsIChwWzBdICsgKHAgPSBwb2ludHNbaV0pWzBdKSAvIDIsIFwiVlwiLCBwWzFdKTtcbiAgICBpZiAobiA+IDEpIHBhdGgucHVzaChcIkhcIiwgcFswXSk7XG4gICAgcmV0dXJuIHBhdGguam9pbihcIlwiKTtcbiAgfVxuICBmdW5jdGlvbiBkM19zdmdfbGluZVN0ZXBCZWZvcmUocG9pbnRzKSB7XG4gICAgdmFyIGkgPSAwLCBuID0gcG9pbnRzLmxlbmd0aCwgcCA9IHBvaW50c1swXSwgcGF0aCA9IFsgcFswXSwgXCIsXCIsIHBbMV0gXTtcbiAgICB3aGlsZSAoKytpIDwgbikgcGF0aC5wdXNoKFwiVlwiLCAocCA9IHBvaW50c1tpXSlbMV0sIFwiSFwiLCBwWzBdKTtcbiAgICByZXR1cm4gcGF0aC5qb2luKFwiXCIpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lU3RlcEFmdGVyKHBvaW50cykge1xuICAgIHZhciBpID0gMCwgbiA9IHBvaW50cy5sZW5ndGgsIHAgPSBwb2ludHNbMF0sIHBhdGggPSBbIHBbMF0sIFwiLFwiLCBwWzFdIF07XG4gICAgd2hpbGUgKCsraSA8IG4pIHBhdGgucHVzaChcIkhcIiwgKHAgPSBwb2ludHNbaV0pWzBdLCBcIlZcIiwgcFsxXSk7XG4gICAgcmV0dXJuIHBhdGguam9pbihcIlwiKTtcbiAgfVxuICBmdW5jdGlvbiBkM19zdmdfbGluZUNhcmRpbmFsT3Blbihwb2ludHMsIHRlbnNpb24pIHtcbiAgICByZXR1cm4gcG9pbnRzLmxlbmd0aCA8IDQgPyBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpIDogcG9pbnRzWzFdICsgZDNfc3ZnX2xpbmVIZXJtaXRlKHBvaW50cy5zbGljZSgxLCAtMSksIGQzX3N2Z19saW5lQ2FyZGluYWxUYW5nZW50cyhwb2ludHMsIHRlbnNpb24pKTtcbiAgfVxuICBmdW5jdGlvbiBkM19zdmdfbGluZUNhcmRpbmFsQ2xvc2VkKHBvaW50cywgdGVuc2lvbikge1xuICAgIHJldHVybiBwb2ludHMubGVuZ3RoIDwgMyA/IGQzX3N2Z19saW5lTGluZWFyQ2xvc2VkKHBvaW50cykgOiBwb2ludHNbMF0gKyBkM19zdmdfbGluZUhlcm1pdGUoKHBvaW50cy5wdXNoKHBvaW50c1swXSksIFxuICAgIHBvaW50cyksIGQzX3N2Z19saW5lQ2FyZGluYWxUYW5nZW50cyhbIHBvaW50c1twb2ludHMubGVuZ3RoIC0gMl0gXS5jb25jYXQocG9pbnRzLCBbIHBvaW50c1sxXSBdKSwgdGVuc2lvbikpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lQ2FyZGluYWwocG9pbnRzLCB0ZW5zaW9uKSB7XG4gICAgcmV0dXJuIHBvaW50cy5sZW5ndGggPCAzID8gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKSA6IHBvaW50c1swXSArIGQzX3N2Z19saW5lSGVybWl0ZShwb2ludHMsIGQzX3N2Z19saW5lQ2FyZGluYWxUYW5nZW50cyhwb2ludHMsIHRlbnNpb24pKTtcbiAgfVxuICBmdW5jdGlvbiBkM19zdmdfbGluZUhlcm1pdGUocG9pbnRzLCB0YW5nZW50cykge1xuICAgIGlmICh0YW5nZW50cy5sZW5ndGggPCAxIHx8IHBvaW50cy5sZW5ndGggIT0gdGFuZ2VudHMubGVuZ3RoICYmIHBvaW50cy5sZW5ndGggIT0gdGFuZ2VudHMubGVuZ3RoICsgMikge1xuICAgICAgcmV0dXJuIGQzX3N2Z19saW5lTGluZWFyKHBvaW50cyk7XG4gICAgfVxuICAgIHZhciBxdWFkID0gcG9pbnRzLmxlbmd0aCAhPSB0YW5nZW50cy5sZW5ndGgsIHBhdGggPSBcIlwiLCBwMCA9IHBvaW50c1swXSwgcCA9IHBvaW50c1sxXSwgdDAgPSB0YW5nZW50c1swXSwgdCA9IHQwLCBwaSA9IDE7XG4gICAgaWYgKHF1YWQpIHtcbiAgICAgIHBhdGggKz0gXCJRXCIgKyAocFswXSAtIHQwWzBdICogMiAvIDMpICsgXCIsXCIgKyAocFsxXSAtIHQwWzFdICogMiAvIDMpICsgXCIsXCIgKyBwWzBdICsgXCIsXCIgKyBwWzFdO1xuICAgICAgcDAgPSBwb2ludHNbMV07XG4gICAgICBwaSA9IDI7XG4gICAgfVxuICAgIGlmICh0YW5nZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICB0ID0gdGFuZ2VudHNbMV07XG4gICAgICBwID0gcG9pbnRzW3BpXTtcbiAgICAgIHBpKys7XG4gICAgICBwYXRoICs9IFwiQ1wiICsgKHAwWzBdICsgdDBbMF0pICsgXCIsXCIgKyAocDBbMV0gKyB0MFsxXSkgKyBcIixcIiArIChwWzBdIC0gdFswXSkgKyBcIixcIiArIChwWzFdIC0gdFsxXSkgKyBcIixcIiArIHBbMF0gKyBcIixcIiArIHBbMV07XG4gICAgICBmb3IgKHZhciBpID0gMjsgaSA8IHRhbmdlbnRzLmxlbmd0aDsgaSsrLCBwaSsrKSB7XG4gICAgICAgIHAgPSBwb2ludHNbcGldO1xuICAgICAgICB0ID0gdGFuZ2VudHNbaV07XG4gICAgICAgIHBhdGggKz0gXCJTXCIgKyAocFswXSAtIHRbMF0pICsgXCIsXCIgKyAocFsxXSAtIHRbMV0pICsgXCIsXCIgKyBwWzBdICsgXCIsXCIgKyBwWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocXVhZCkge1xuICAgICAgdmFyIGxwID0gcG9pbnRzW3BpXTtcbiAgICAgIHBhdGggKz0gXCJRXCIgKyAocFswXSArIHRbMF0gKiAyIC8gMykgKyBcIixcIiArIChwWzFdICsgdFsxXSAqIDIgLyAzKSArIFwiLFwiICsgbHBbMF0gKyBcIixcIiArIGxwWzFdO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aDtcbiAgfVxuICBmdW5jdGlvbiBkM19zdmdfbGluZUNhcmRpbmFsVGFuZ2VudHMocG9pbnRzLCB0ZW5zaW9uKSB7XG4gICAgdmFyIHRhbmdlbnRzID0gW10sIGEgPSAoMSAtIHRlbnNpb24pIC8gMiwgcDAsIHAxID0gcG9pbnRzWzBdLCBwMiA9IHBvaW50c1sxXSwgaSA9IDEsIG4gPSBwb2ludHMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICBwMCA9IHAxO1xuICAgICAgcDEgPSBwMjtcbiAgICAgIHAyID0gcG9pbnRzW2ldO1xuICAgICAgdGFuZ2VudHMucHVzaChbIGEgKiAocDJbMF0gLSBwMFswXSksIGEgKiAocDJbMV0gLSBwMFsxXSkgXSk7XG4gICAgfVxuICAgIHJldHVybiB0YW5nZW50cztcbiAgfVxuICBmdW5jdGlvbiBkM19zdmdfbGluZUJhc2lzKHBvaW50cykge1xuICAgIGlmIChwb2ludHMubGVuZ3RoIDwgMykgcmV0dXJuIGQzX3N2Z19saW5lTGluZWFyKHBvaW50cyk7XG4gICAgdmFyIGkgPSAxLCBuID0gcG9pbnRzLmxlbmd0aCwgcGkgPSBwb2ludHNbMF0sIHgwID0gcGlbMF0sIHkwID0gcGlbMV0sIHB4ID0gWyB4MCwgeDAsIHgwLCAocGkgPSBwb2ludHNbMV0pWzBdIF0sIHB5ID0gWyB5MCwgeTAsIHkwLCBwaVsxXSBdLCBwYXRoID0gWyB4MCwgXCIsXCIsIHkwLCBcIkxcIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCBweCksIFwiLFwiLCBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMsIHB5KSBdO1xuICAgIHBvaW50cy5wdXNoKHBvaW50c1tuIC0gMV0pO1xuICAgIHdoaWxlICgrK2kgPD0gbikge1xuICAgICAgcGkgPSBwb2ludHNbaV07XG4gICAgICBweC5zaGlmdCgpO1xuICAgICAgcHgucHVzaChwaVswXSk7XG4gICAgICBweS5zaGlmdCgpO1xuICAgICAgcHkucHVzaChwaVsxXSk7XG4gICAgICBkM19zdmdfbGluZUJhc2lzQmV6aWVyKHBhdGgsIHB4LCBweSk7XG4gICAgfVxuICAgIHBvaW50cy5wb3AoKTtcbiAgICBwYXRoLnB1c2goXCJMXCIsIHBpKTtcbiAgICByZXR1cm4gcGF0aC5qb2luKFwiXCIpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lQmFzaXNPcGVuKHBvaW50cykge1xuICAgIGlmIChwb2ludHMubGVuZ3RoIDwgNCkgcmV0dXJuIGQzX3N2Z19saW5lTGluZWFyKHBvaW50cyk7XG4gICAgdmFyIHBhdGggPSBbXSwgaSA9IC0xLCBuID0gcG9pbnRzLmxlbmd0aCwgcGksIHB4ID0gWyAwIF0sIHB5ID0gWyAwIF07XG4gICAgd2hpbGUgKCsraSA8IDMpIHtcbiAgICAgIHBpID0gcG9pbnRzW2ldO1xuICAgICAgcHgucHVzaChwaVswXSk7XG4gICAgICBweS5wdXNoKHBpWzFdKTtcbiAgICB9XG4gICAgcGF0aC5wdXNoKGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMywgcHgpICsgXCIsXCIgKyBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMsIHB5KSk7XG4gICAgLS1pO1xuICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICBwaSA9IHBvaW50c1tpXTtcbiAgICAgIHB4LnNoaWZ0KCk7XG4gICAgICBweC5wdXNoKHBpWzBdKTtcbiAgICAgIHB5LnNoaWZ0KCk7XG4gICAgICBweS5wdXNoKHBpWzFdKTtcbiAgICAgIGQzX3N2Z19saW5lQmFzaXNCZXppZXIocGF0aCwgcHgsIHB5KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbihcIlwiKTtcbiAgfVxuICBmdW5jdGlvbiBkM19zdmdfbGluZUJhc2lzQ2xvc2VkKHBvaW50cykge1xuICAgIHZhciBwYXRoLCBpID0gLTEsIG4gPSBwb2ludHMubGVuZ3RoLCBtID0gbiArIDQsIHBpLCBweCA9IFtdLCBweSA9IFtdO1xuICAgIHdoaWxlICgrK2kgPCA0KSB7XG4gICAgICBwaSA9IHBvaW50c1tpICUgbl07XG4gICAgICBweC5wdXNoKHBpWzBdKTtcbiAgICAgIHB5LnB1c2gocGlbMV0pO1xuICAgIH1cbiAgICBwYXRoID0gWyBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMsIHB4KSwgXCIsXCIsIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMywgcHkpIF07XG4gICAgLS1pO1xuICAgIHdoaWxlICgrK2kgPCBtKSB7XG4gICAgICBwaSA9IHBvaW50c1tpICUgbl07XG4gICAgICBweC5zaGlmdCgpO1xuICAgICAgcHgucHVzaChwaVswXSk7XG4gICAgICBweS5zaGlmdCgpO1xuICAgICAgcHkucHVzaChwaVsxXSk7XG4gICAgICBkM19zdmdfbGluZUJhc2lzQmV6aWVyKHBhdGgsIHB4LCBweSk7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLmpvaW4oXCJcIik7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVCdW5kbGUocG9pbnRzLCB0ZW5zaW9uKSB7XG4gICAgdmFyIG4gPSBwb2ludHMubGVuZ3RoIC0gMTtcbiAgICBpZiAobikge1xuICAgICAgdmFyIHgwID0gcG9pbnRzWzBdWzBdLCB5MCA9IHBvaW50c1swXVsxXSwgZHggPSBwb2ludHNbbl1bMF0gLSB4MCwgZHkgPSBwb2ludHNbbl1bMV0gLSB5MCwgaSA9IC0xLCBwLCB0O1xuICAgICAgd2hpbGUgKCsraSA8PSBuKSB7XG4gICAgICAgIHAgPSBwb2ludHNbaV07XG4gICAgICAgIHQgPSBpIC8gbjtcbiAgICAgICAgcFswXSA9IHRlbnNpb24gKiBwWzBdICsgKDEgLSB0ZW5zaW9uKSAqICh4MCArIHQgKiBkeCk7XG4gICAgICAgIHBbMV0gPSB0ZW5zaW9uICogcFsxXSArICgxIC0gdGVuc2lvbikgKiAoeTAgKyB0ICogZHkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZDNfc3ZnX2xpbmVCYXNpcyhwb2ludHMpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lRG90NChhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXSArIGFbM10gKiBiWzNdO1xuICB9XG4gIHZhciBkM19zdmdfbGluZUJhc2lzQmV6aWVyMSA9IFsgMCwgMiAvIDMsIDEgLyAzLCAwIF0sIGQzX3N2Z19saW5lQmFzaXNCZXppZXIyID0gWyAwLCAxIC8gMywgMiAvIDMsIDAgXSwgZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMgPSBbIDAsIDEgLyA2LCAyIC8gMywgMSAvIDYgXTtcbiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCB4LCB5KSB7XG4gICAgcGF0aC5wdXNoKFwiQ1wiLCBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjEsIHgpLCBcIixcIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIxLCB5KSwgXCIsXCIsIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMiwgeCksIFwiLFwiLCBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjIsIHkpLCBcIixcIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCB4KSwgXCIsXCIsIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMywgeSkpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lU2xvcGUocDAsIHAxKSB7XG4gICAgcmV0dXJuIChwMVsxXSAtIHAwWzFdKSAvIChwMVswXSAtIHAwWzBdKTtcbiAgfVxuICBmdW5jdGlvbiBkM19zdmdfbGluZUZpbml0ZURpZmZlcmVuY2VzKHBvaW50cykge1xuICAgIHZhciBpID0gMCwgaiA9IHBvaW50cy5sZW5ndGggLSAxLCBtID0gW10sIHAwID0gcG9pbnRzWzBdLCBwMSA9IHBvaW50c1sxXSwgZCA9IG1bMF0gPSBkM19zdmdfbGluZVNsb3BlKHAwLCBwMSk7XG4gICAgd2hpbGUgKCsraSA8IGopIHtcbiAgICAgIG1baV0gPSAoZCArIChkID0gZDNfc3ZnX2xpbmVTbG9wZShwMCA9IHAxLCBwMSA9IHBvaW50c1tpICsgMV0pKSkgLyAyO1xuICAgIH1cbiAgICBtW2ldID0gZDtcbiAgICByZXR1cm4gbTtcbiAgfVxuICBmdW5jdGlvbiBkM19zdmdfbGluZU1vbm90b25lVGFuZ2VudHMocG9pbnRzKSB7XG4gICAgdmFyIHRhbmdlbnRzID0gW10sIGQsIGEsIGIsIHMsIG0gPSBkM19zdmdfbGluZUZpbml0ZURpZmZlcmVuY2VzKHBvaW50cyksIGkgPSAtMSwgaiA9IHBvaW50cy5sZW5ndGggLSAxO1xuICAgIHdoaWxlICgrK2kgPCBqKSB7XG4gICAgICBkID0gZDNfc3ZnX2xpbmVTbG9wZShwb2ludHNbaV0sIHBvaW50c1tpICsgMV0pO1xuICAgICAgaWYgKGFicyhkKSA8IM61KSB7XG4gICAgICAgIG1baV0gPSBtW2kgKyAxXSA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhID0gbVtpXSAvIGQ7XG4gICAgICAgIGIgPSBtW2kgKyAxXSAvIGQ7XG4gICAgICAgIHMgPSBhICogYSArIGIgKiBiO1xuICAgICAgICBpZiAocyA+IDkpIHtcbiAgICAgICAgICBzID0gZCAqIDMgLyBNYXRoLnNxcnQocyk7XG4gICAgICAgICAgbVtpXSA9IHMgKiBhO1xuICAgICAgICAgIG1baSArIDFdID0gcyAqIGI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaSA9IC0xO1xuICAgIHdoaWxlICgrK2kgPD0gaikge1xuICAgICAgcyA9IChwb2ludHNbTWF0aC5taW4oaiwgaSArIDEpXVswXSAtIHBvaW50c1tNYXRoLm1heCgwLCBpIC0gMSldWzBdKSAvICg2ICogKDEgKyBtW2ldICogbVtpXSkpO1xuICAgICAgdGFuZ2VudHMucHVzaChbIHMgfHwgMCwgbVtpXSAqIHMgfHwgMCBdKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhbmdlbnRzO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lTW9ub3RvbmUocG9pbnRzKSB7XG4gICAgcmV0dXJuIHBvaW50cy5sZW5ndGggPCAzID8gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKSA6IHBvaW50c1swXSArIGQzX3N2Z19saW5lSGVybWl0ZShwb2ludHMsIGQzX3N2Z19saW5lTW9ub3RvbmVUYW5nZW50cyhwb2ludHMpKTtcbiAgfVxuICBkMy5zdmcubGluZS5yYWRpYWwgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgbGluZSA9IGQzX3N2Z19saW5lKGQzX3N2Z19saW5lUmFkaWFsKTtcbiAgICBsaW5lLnJhZGl1cyA9IGxpbmUueCwgZGVsZXRlIGxpbmUueDtcbiAgICBsaW5lLmFuZ2xlID0gbGluZS55LCBkZWxldGUgbGluZS55O1xuICAgIHJldHVybiBsaW5lO1xuICB9O1xuICBmdW5jdGlvbiBkM19zdmdfbGluZVJhZGlhbChwb2ludHMpIHtcbiAgICB2YXIgcG9pbnQsIGkgPSAtMSwgbiA9IHBvaW50cy5sZW5ndGgsIHIsIGE7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIHBvaW50ID0gcG9pbnRzW2ldO1xuICAgICAgciA9IHBvaW50WzBdO1xuICAgICAgYSA9IHBvaW50WzFdIC0gaGFsZs+AO1xuICAgICAgcG9pbnRbMF0gPSByICogTWF0aC5jb3MoYSk7XG4gICAgICBwb2ludFsxXSA9IHIgKiBNYXRoLnNpbihhKTtcbiAgICB9XG4gICAgcmV0dXJuIHBvaW50cztcbiAgfVxuICBmdW5jdGlvbiBkM19zdmdfYXJlYShwcm9qZWN0aW9uKSB7XG4gICAgdmFyIHgwID0gZDNfZ2VvbV9wb2ludFgsIHgxID0gZDNfZ2VvbV9wb2ludFgsIHkwID0gMCwgeTEgPSBkM19nZW9tX3BvaW50WSwgZGVmaW5lZCA9IGQzX3RydWUsIGludGVycG9sYXRlID0gZDNfc3ZnX2xpbmVMaW5lYXIsIGludGVycG9sYXRlS2V5ID0gaW50ZXJwb2xhdGUua2V5LCBpbnRlcnBvbGF0ZVJldmVyc2UgPSBpbnRlcnBvbGF0ZSwgTCA9IFwiTFwiLCB0ZW5zaW9uID0gLjc7XG4gICAgZnVuY3Rpb24gYXJlYShkYXRhKSB7XG4gICAgICB2YXIgc2VnbWVudHMgPSBbXSwgcG9pbnRzMCA9IFtdLCBwb2ludHMxID0gW10sIGkgPSAtMSwgbiA9IGRhdGEubGVuZ3RoLCBkLCBmeDAgPSBkM19mdW5jdG9yKHgwKSwgZnkwID0gZDNfZnVuY3Rvcih5MCksIGZ4MSA9IHgwID09PSB4MSA/IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4geDtcbiAgICAgIH0gOiBkM19mdW5jdG9yKHgxKSwgZnkxID0geTAgPT09IHkxID8gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB5O1xuICAgICAgfSA6IGQzX2Z1bmN0b3IoeTEpLCB4LCB5O1xuICAgICAgZnVuY3Rpb24gc2VnbWVudCgpIHtcbiAgICAgICAgc2VnbWVudHMucHVzaChcIk1cIiwgaW50ZXJwb2xhdGUocHJvamVjdGlvbihwb2ludHMxKSwgdGVuc2lvbiksIEwsIGludGVycG9sYXRlUmV2ZXJzZShwcm9qZWN0aW9uKHBvaW50czAucmV2ZXJzZSgpKSwgdGVuc2lvbiksIFwiWlwiKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgIGlmIChkZWZpbmVkLmNhbGwodGhpcywgZCA9IGRhdGFbaV0sIGkpKSB7XG4gICAgICAgICAgcG9pbnRzMC5wdXNoKFsgeCA9ICtmeDAuY2FsbCh0aGlzLCBkLCBpKSwgeSA9ICtmeTAuY2FsbCh0aGlzLCBkLCBpKSBdKTtcbiAgICAgICAgICBwb2ludHMxLnB1c2goWyArZngxLmNhbGwodGhpcywgZCwgaSksICtmeTEuY2FsbCh0aGlzLCBkLCBpKSBdKTtcbiAgICAgICAgfSBlbHNlIGlmIChwb2ludHMwLmxlbmd0aCkge1xuICAgICAgICAgIHNlZ21lbnQoKTtcbiAgICAgICAgICBwb2ludHMwID0gW107XG4gICAgICAgICAgcG9pbnRzMSA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocG9pbnRzMC5sZW5ndGgpIHNlZ21lbnQoKTtcbiAgICAgIHJldHVybiBzZWdtZW50cy5sZW5ndGggPyBzZWdtZW50cy5qb2luKFwiXCIpIDogbnVsbDtcbiAgICB9XG4gICAgYXJlYS54ID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDE7XG4gICAgICB4MCA9IHgxID0gXztcbiAgICAgIHJldHVybiBhcmVhO1xuICAgIH07XG4gICAgYXJlYS54MCA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHgwO1xuICAgICAgeDAgPSBfO1xuICAgICAgcmV0dXJuIGFyZWE7XG4gICAgfTtcbiAgICBhcmVhLngxID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDE7XG4gICAgICB4MSA9IF87XG4gICAgICByZXR1cm4gYXJlYTtcbiAgICB9O1xuICAgIGFyZWEueSA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHkxO1xuICAgICAgeTAgPSB5MSA9IF87XG4gICAgICByZXR1cm4gYXJlYTtcbiAgICB9O1xuICAgIGFyZWEueTAgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB5MDtcbiAgICAgIHkwID0gXztcbiAgICAgIHJldHVybiBhcmVhO1xuICAgIH07XG4gICAgYXJlYS55MSA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHkxO1xuICAgICAgeTEgPSBfO1xuICAgICAgcmV0dXJuIGFyZWE7XG4gICAgfTtcbiAgICBhcmVhLmRlZmluZWQgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkZWZpbmVkO1xuICAgICAgZGVmaW5lZCA9IF87XG4gICAgICByZXR1cm4gYXJlYTtcbiAgICB9O1xuICAgIGFyZWEuaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBpbnRlcnBvbGF0ZUtleTtcbiAgICAgIGlmICh0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiKSBpbnRlcnBvbGF0ZUtleSA9IGludGVycG9sYXRlID0gXzsgZWxzZSBpbnRlcnBvbGF0ZUtleSA9IChpbnRlcnBvbGF0ZSA9IGQzX3N2Z19saW5lSW50ZXJwb2xhdG9ycy5nZXQoXykgfHwgZDNfc3ZnX2xpbmVMaW5lYXIpLmtleTtcbiAgICAgIGludGVycG9sYXRlUmV2ZXJzZSA9IGludGVycG9sYXRlLnJldmVyc2UgfHwgaW50ZXJwb2xhdGU7XG4gICAgICBMID0gaW50ZXJwb2xhdGUuY2xvc2VkID8gXCJNXCIgOiBcIkxcIjtcbiAgICAgIHJldHVybiBhcmVhO1xuICAgIH07XG4gICAgYXJlYS50ZW5zaW9uID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGVuc2lvbjtcbiAgICAgIHRlbnNpb24gPSBfO1xuICAgICAgcmV0dXJuIGFyZWE7XG4gICAgfTtcbiAgICByZXR1cm4gYXJlYTtcbiAgfVxuICBkM19zdmdfbGluZVN0ZXBCZWZvcmUucmV2ZXJzZSA9IGQzX3N2Z19saW5lU3RlcEFmdGVyO1xuICBkM19zdmdfbGluZVN0ZXBBZnRlci5yZXZlcnNlID0gZDNfc3ZnX2xpbmVTdGVwQmVmb3JlO1xuICBkMy5zdmcuYXJlYSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19zdmdfYXJlYShkM19pZGVudGl0eSk7XG4gIH07XG4gIGQzLnN2Zy5hcmVhLnJhZGlhbCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBhcmVhID0gZDNfc3ZnX2FyZWEoZDNfc3ZnX2xpbmVSYWRpYWwpO1xuICAgIGFyZWEucmFkaXVzID0gYXJlYS54LCBkZWxldGUgYXJlYS54O1xuICAgIGFyZWEuaW5uZXJSYWRpdXMgPSBhcmVhLngwLCBkZWxldGUgYXJlYS54MDtcbiAgICBhcmVhLm91dGVyUmFkaXVzID0gYXJlYS54MSwgZGVsZXRlIGFyZWEueDE7XG4gICAgYXJlYS5hbmdsZSA9IGFyZWEueSwgZGVsZXRlIGFyZWEueTtcbiAgICBhcmVhLnN0YXJ0QW5nbGUgPSBhcmVhLnkwLCBkZWxldGUgYXJlYS55MDtcbiAgICBhcmVhLmVuZEFuZ2xlID0gYXJlYS55MSwgZGVsZXRlIGFyZWEueTE7XG4gICAgcmV0dXJuIGFyZWE7XG4gIH07XG4gIGQzLnN2Zy5jaG9yZCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzb3VyY2UgPSBkM19zb3VyY2UsIHRhcmdldCA9IGQzX3RhcmdldCwgcmFkaXVzID0gZDNfc3ZnX2Nob3JkUmFkaXVzLCBzdGFydEFuZ2xlID0gZDNfc3ZnX2FyY1N0YXJ0QW5nbGUsIGVuZEFuZ2xlID0gZDNfc3ZnX2FyY0VuZEFuZ2xlO1xuICAgIGZ1bmN0aW9uIGNob3JkKGQsIGkpIHtcbiAgICAgIHZhciBzID0gc3ViZ3JvdXAodGhpcywgc291cmNlLCBkLCBpKSwgdCA9IHN1Ymdyb3VwKHRoaXMsIHRhcmdldCwgZCwgaSk7XG4gICAgICByZXR1cm4gXCJNXCIgKyBzLnAwICsgYXJjKHMuciwgcy5wMSwgcy5hMSAtIHMuYTApICsgKGVxdWFscyhzLCB0KSA/IGN1cnZlKHMuciwgcy5wMSwgcy5yLCBzLnAwKSA6IGN1cnZlKHMuciwgcy5wMSwgdC5yLCB0LnAwKSArIGFyYyh0LnIsIHQucDEsIHQuYTEgLSB0LmEwKSArIGN1cnZlKHQuciwgdC5wMSwgcy5yLCBzLnAwKSkgKyBcIlpcIjtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3ViZ3JvdXAoc2VsZiwgZiwgZCwgaSkge1xuICAgICAgdmFyIHN1Ymdyb3VwID0gZi5jYWxsKHNlbGYsIGQsIGkpLCByID0gcmFkaXVzLmNhbGwoc2VsZiwgc3ViZ3JvdXAsIGkpLCBhMCA9IHN0YXJ0QW5nbGUuY2FsbChzZWxmLCBzdWJncm91cCwgaSkgLSBoYWxmz4AsIGExID0gZW5kQW5nbGUuY2FsbChzZWxmLCBzdWJncm91cCwgaSkgLSBoYWxmz4A7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByOiByLFxuICAgICAgICBhMDogYTAsXG4gICAgICAgIGExOiBhMSxcbiAgICAgICAgcDA6IFsgciAqIE1hdGguY29zKGEwKSwgciAqIE1hdGguc2luKGEwKSBdLFxuICAgICAgICBwMTogWyByICogTWF0aC5jb3MoYTEpLCByICogTWF0aC5zaW4oYTEpIF1cbiAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVxdWFscyhhLCBiKSB7XG4gICAgICByZXR1cm4gYS5hMCA9PSBiLmEwICYmIGEuYTEgPT0gYi5hMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYXJjKHIsIHAsIGEpIHtcbiAgICAgIHJldHVybiBcIkFcIiArIHIgKyBcIixcIiArIHIgKyBcIiAwIFwiICsgKyhhID4gz4ApICsgXCIsMSBcIiArIHA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGN1cnZlKHIwLCBwMCwgcjEsIHAxKSB7XG4gICAgICByZXR1cm4gXCJRIDAsMCBcIiArIHAxO1xuICAgIH1cbiAgICBjaG9yZC5yYWRpdXMgPSBmdW5jdGlvbih2KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYWRpdXM7XG4gICAgICByYWRpdXMgPSBkM19mdW5jdG9yKHYpO1xuICAgICAgcmV0dXJuIGNob3JkO1xuICAgIH07XG4gICAgY2hvcmQuc291cmNlID0gZnVuY3Rpb24odikge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc291cmNlO1xuICAgICAgc291cmNlID0gZDNfZnVuY3Rvcih2KTtcbiAgICAgIHJldHVybiBjaG9yZDtcbiAgICB9O1xuICAgIGNob3JkLnRhcmdldCA9IGZ1bmN0aW9uKHYpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRhcmdldDtcbiAgICAgIHRhcmdldCA9IGQzX2Z1bmN0b3Iodik7XG4gICAgICByZXR1cm4gY2hvcmQ7XG4gICAgfTtcbiAgICBjaG9yZC5zdGFydEFuZ2xlID0gZnVuY3Rpb24odikge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc3RhcnRBbmdsZTtcbiAgICAgIHN0YXJ0QW5nbGUgPSBkM19mdW5jdG9yKHYpO1xuICAgICAgcmV0dXJuIGNob3JkO1xuICAgIH07XG4gICAgY2hvcmQuZW5kQW5nbGUgPSBmdW5jdGlvbih2KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBlbmRBbmdsZTtcbiAgICAgIGVuZEFuZ2xlID0gZDNfZnVuY3Rvcih2KTtcbiAgICAgIHJldHVybiBjaG9yZDtcbiAgICB9O1xuICAgIHJldHVybiBjaG9yZDtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc3ZnX2Nob3JkUmFkaXVzKGQpIHtcbiAgICByZXR1cm4gZC5yYWRpdXM7XG4gIH1cbiAgZDMuc3ZnLmRpYWdvbmFsID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNvdXJjZSA9IGQzX3NvdXJjZSwgdGFyZ2V0ID0gZDNfdGFyZ2V0LCBwcm9qZWN0aW9uID0gZDNfc3ZnX2RpYWdvbmFsUHJvamVjdGlvbjtcbiAgICBmdW5jdGlvbiBkaWFnb25hbChkLCBpKSB7XG4gICAgICB2YXIgcDAgPSBzb3VyY2UuY2FsbCh0aGlzLCBkLCBpKSwgcDMgPSB0YXJnZXQuY2FsbCh0aGlzLCBkLCBpKSwgbSA9IChwMC55ICsgcDMueSkgLyAyLCBwID0gWyBwMCwge1xuICAgICAgICB4OiBwMC54LFxuICAgICAgICB5OiBtXG4gICAgICB9LCB7XG4gICAgICAgIHg6IHAzLngsXG4gICAgICAgIHk6IG1cbiAgICAgIH0sIHAzIF07XG4gICAgICBwID0gcC5tYXAocHJvamVjdGlvbik7XG4gICAgICByZXR1cm4gXCJNXCIgKyBwWzBdICsgXCJDXCIgKyBwWzFdICsgXCIgXCIgKyBwWzJdICsgXCIgXCIgKyBwWzNdO1xuICAgIH1cbiAgICBkaWFnb25hbC5zb3VyY2UgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3VyY2U7XG4gICAgICBzb3VyY2UgPSBkM19mdW5jdG9yKHgpO1xuICAgICAgcmV0dXJuIGRpYWdvbmFsO1xuICAgIH07XG4gICAgZGlhZ29uYWwudGFyZ2V0ID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGFyZ2V0O1xuICAgICAgdGFyZ2V0ID0gZDNfZnVuY3Rvcih4KTtcbiAgICAgIHJldHVybiBkaWFnb25hbDtcbiAgICB9O1xuICAgIGRpYWdvbmFsLnByb2plY3Rpb24gPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwcm9qZWN0aW9uO1xuICAgICAgcHJvamVjdGlvbiA9IHg7XG4gICAgICByZXR1cm4gZGlhZ29uYWw7XG4gICAgfTtcbiAgICByZXR1cm4gZGlhZ29uYWw7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3N2Z19kaWFnb25hbFByb2plY3Rpb24oZCkge1xuICAgIHJldHVybiBbIGQueCwgZC55IF07XG4gIH1cbiAgZDMuc3ZnLmRpYWdvbmFsLnJhZGlhbCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBkaWFnb25hbCA9IGQzLnN2Zy5kaWFnb25hbCgpLCBwcm9qZWN0aW9uID0gZDNfc3ZnX2RpYWdvbmFsUHJvamVjdGlvbiwgcHJvamVjdGlvbl8gPSBkaWFnb25hbC5wcm9qZWN0aW9uO1xuICAgIGRpYWdvbmFsLnByb2plY3Rpb24gPSBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHByb2plY3Rpb25fKGQzX3N2Z19kaWFnb25hbFJhZGlhbFByb2plY3Rpb24ocHJvamVjdGlvbiA9IHgpKSA6IHByb2plY3Rpb247XG4gICAgfTtcbiAgICByZXR1cm4gZGlhZ29uYWw7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3N2Z19kaWFnb25hbFJhZGlhbFByb2plY3Rpb24ocHJvamVjdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBkID0gcHJvamVjdGlvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCByID0gZFswXSwgYSA9IGRbMV0gLSBoYWxmz4A7XG4gICAgICByZXR1cm4gWyByICogTWF0aC5jb3MoYSksIHIgKiBNYXRoLnNpbihhKSBdO1xuICAgIH07XG4gIH1cbiAgZDMuc3ZnLnN5bWJvbCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0eXBlID0gZDNfc3ZnX3N5bWJvbFR5cGUsIHNpemUgPSBkM19zdmdfc3ltYm9sU2l6ZTtcbiAgICBmdW5jdGlvbiBzeW1ib2woZCwgaSkge1xuICAgICAgcmV0dXJuIChkM19zdmdfc3ltYm9scy5nZXQodHlwZS5jYWxsKHRoaXMsIGQsIGkpKSB8fCBkM19zdmdfc3ltYm9sQ2lyY2xlKShzaXplLmNhbGwodGhpcywgZCwgaSkpO1xuICAgIH1cbiAgICBzeW1ib2wudHlwZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHR5cGU7XG4gICAgICB0eXBlID0gZDNfZnVuY3Rvcih4KTtcbiAgICAgIHJldHVybiBzeW1ib2w7XG4gICAgfTtcbiAgICBzeW1ib2wuc2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7XG4gICAgICBzaXplID0gZDNfZnVuY3Rvcih4KTtcbiAgICAgIHJldHVybiBzeW1ib2w7XG4gICAgfTtcbiAgICByZXR1cm4gc3ltYm9sO1xuICB9O1xuICBmdW5jdGlvbiBkM19zdmdfc3ltYm9sU2l6ZSgpIHtcbiAgICByZXR1cm4gNjQ7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc3ZnX3N5bWJvbFR5cGUoKSB7XG4gICAgcmV0dXJuIFwiY2lyY2xlXCI7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc3ZnX3N5bWJvbENpcmNsZShzaXplKSB7XG4gICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAvIM+AKTtcbiAgICByZXR1cm4gXCJNMCxcIiArIHIgKyBcIkFcIiArIHIgKyBcIixcIiArIHIgKyBcIiAwIDEsMSAwLFwiICsgLXIgKyBcIkFcIiArIHIgKyBcIixcIiArIHIgKyBcIiAwIDEsMSAwLFwiICsgciArIFwiWlwiO1xuICB9XG4gIHZhciBkM19zdmdfc3ltYm9scyA9IGQzLm1hcCh7XG4gICAgY2lyY2xlOiBkM19zdmdfc3ltYm9sQ2lyY2xlLFxuICAgIGNyb3NzOiBmdW5jdGlvbihzaXplKSB7XG4gICAgICB2YXIgciA9IE1hdGguc3FydChzaXplIC8gNSkgLyAyO1xuICAgICAgcmV0dXJuIFwiTVwiICsgLTMgKiByICsgXCIsXCIgKyAtciArIFwiSFwiICsgLXIgKyBcIlZcIiArIC0zICogciArIFwiSFwiICsgciArIFwiVlwiICsgLXIgKyBcIkhcIiArIDMgKiByICsgXCJWXCIgKyByICsgXCJIXCIgKyByICsgXCJWXCIgKyAzICogciArIFwiSFwiICsgLXIgKyBcIlZcIiArIHIgKyBcIkhcIiArIC0zICogciArIFwiWlwiO1xuICAgIH0sXG4gICAgZGlhbW9uZDogZnVuY3Rpb24oc2l6ZSkge1xuICAgICAgdmFyIHJ5ID0gTWF0aC5zcXJ0KHNpemUgLyAoMiAqIGQzX3N2Z19zeW1ib2xUYW4zMCkpLCByeCA9IHJ5ICogZDNfc3ZnX3N5bWJvbFRhbjMwO1xuICAgICAgcmV0dXJuIFwiTTAsXCIgKyAtcnkgKyBcIkxcIiArIHJ4ICsgXCIsMFwiICsgXCIgMCxcIiArIHJ5ICsgXCIgXCIgKyAtcnggKyBcIiwwXCIgKyBcIlpcIjtcbiAgICB9LFxuICAgIHNxdWFyZTogZnVuY3Rpb24oc2l6ZSkge1xuICAgICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSkgLyAyO1xuICAgICAgcmV0dXJuIFwiTVwiICsgLXIgKyBcIixcIiArIC1yICsgXCJMXCIgKyByICsgXCIsXCIgKyAtciArIFwiIFwiICsgciArIFwiLFwiICsgciArIFwiIFwiICsgLXIgKyBcIixcIiArIHIgKyBcIlpcIjtcbiAgICB9LFxuICAgIFwidHJpYW5nbGUtZG93blwiOiBmdW5jdGlvbihzaXplKSB7XG4gICAgICB2YXIgcnggPSBNYXRoLnNxcnQoc2l6ZSAvIGQzX3N2Z19zeW1ib2xTcXJ0MyksIHJ5ID0gcnggKiBkM19zdmdfc3ltYm9sU3FydDMgLyAyO1xuICAgICAgcmV0dXJuIFwiTTAsXCIgKyByeSArIFwiTFwiICsgcnggKyBcIixcIiArIC1yeSArIFwiIFwiICsgLXJ4ICsgXCIsXCIgKyAtcnkgKyBcIlpcIjtcbiAgICB9LFxuICAgIFwidHJpYW5nbGUtdXBcIjogZnVuY3Rpb24oc2l6ZSkge1xuICAgICAgdmFyIHJ4ID0gTWF0aC5zcXJ0KHNpemUgLyBkM19zdmdfc3ltYm9sU3FydDMpLCByeSA9IHJ4ICogZDNfc3ZnX3N5bWJvbFNxcnQzIC8gMjtcbiAgICAgIHJldHVybiBcIk0wLFwiICsgLXJ5ICsgXCJMXCIgKyByeCArIFwiLFwiICsgcnkgKyBcIiBcIiArIC1yeCArIFwiLFwiICsgcnkgKyBcIlpcIjtcbiAgICB9XG4gIH0pO1xuICBkMy5zdmcuc3ltYm9sVHlwZXMgPSBkM19zdmdfc3ltYm9scy5rZXlzKCk7XG4gIHZhciBkM19zdmdfc3ltYm9sU3FydDMgPSBNYXRoLnNxcnQoMyksIGQzX3N2Z19zeW1ib2xUYW4zMCA9IE1hdGgudGFuKDMwICogZDNfcmFkaWFucyk7XG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS50cmFuc2l0aW9uID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHZhciBpZCA9IGQzX3RyYW5zaXRpb25Jbmhlcml0SWQgfHwgKytkM190cmFuc2l0aW9uSWQsIG5zID0gZDNfdHJhbnNpdGlvbk5hbWVzcGFjZShuYW1lKSwgc3ViZ3JvdXBzID0gW10sIHN1Ymdyb3VwLCBub2RlLCB0cmFuc2l0aW9uID0gZDNfdHJhbnNpdGlvbkluaGVyaXQgfHwge1xuICAgICAgdGltZTogRGF0ZS5ub3coKSxcbiAgICAgIGVhc2U6IGQzX2Vhc2VfY3ViaWNJbk91dCxcbiAgICAgIGRlbGF5OiAwLFxuICAgICAgZHVyYXRpb246IDI1MFxuICAgIH07XG4gICAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07ICkge1xuICAgICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7XG4gICAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAtMSwgbiA9IGdyb3VwLmxlbmd0aDsgKytpIDwgbjsgKSB7XG4gICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIGQzX3RyYW5zaXRpb25Ob2RlKG5vZGUsIGksIG5zLCBpZCwgdHJhbnNpdGlvbik7XG4gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkM190cmFuc2l0aW9uKHN1Ymdyb3VwcywgbnMsIGlkKTtcbiAgfTtcbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLmludGVycnVwdCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKG5hbWUgPT0gbnVsbCA/IGQzX3NlbGVjdGlvbl9pbnRlcnJ1cHQgOiBkM19zZWxlY3Rpb25faW50ZXJydXB0TlMoZDNfdHJhbnNpdGlvbk5hbWVzcGFjZShuYW1lKSkpO1xuICB9O1xuICB2YXIgZDNfc2VsZWN0aW9uX2ludGVycnVwdCA9IGQzX3NlbGVjdGlvbl9pbnRlcnJ1cHROUyhkM190cmFuc2l0aW9uTmFtZXNwYWNlKCkpO1xuICBmdW5jdGlvbiBkM19zZWxlY3Rpb25faW50ZXJydXB0TlMobnMpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbG9jaywgYWN0aXZlSWQsIGFjdGl2ZTtcbiAgICAgIGlmICgobG9jayA9IHRoaXNbbnNdKSAmJiAoYWN0aXZlID0gbG9ja1thY3RpdmVJZCA9IGxvY2suYWN0aXZlXSkpIHtcbiAgICAgICAgYWN0aXZlLnRpbWVyLmMgPSBudWxsO1xuICAgICAgICBhY3RpdmUudGltZXIudCA9IE5hTjtcbiAgICAgICAgaWYgKC0tbG9jay5jb3VudCkgZGVsZXRlIGxvY2tbYWN0aXZlSWRdOyBlbHNlIGRlbGV0ZSB0aGlzW25zXTtcbiAgICAgICAgbG9jay5hY3RpdmUgKz0gLjU7XG4gICAgICAgIGFjdGl2ZS5ldmVudCAmJiBhY3RpdmUuZXZlbnQuaW50ZXJydXB0LmNhbGwodGhpcywgdGhpcy5fX2RhdGFfXywgYWN0aXZlLmluZGV4KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGQzX3RyYW5zaXRpb24oZ3JvdXBzLCBucywgaWQpIHtcbiAgICBkM19zdWJjbGFzcyhncm91cHMsIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUpO1xuICAgIGdyb3Vwcy5uYW1lc3BhY2UgPSBucztcbiAgICBncm91cHMuaWQgPSBpZDtcbiAgICByZXR1cm4gZ3JvdXBzO1xuICB9XG4gIHZhciBkM190cmFuc2l0aW9uUHJvdG90eXBlID0gW10sIGQzX3RyYW5zaXRpb25JZCA9IDAsIGQzX3RyYW5zaXRpb25Jbmhlcml0SWQsIGQzX3RyYW5zaXRpb25Jbmhlcml0O1xuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLmNhbGwgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUuY2FsbDtcbiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS5lbXB0eSA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5lbXB0eTtcbiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS5ub2RlID0gZDNfc2VsZWN0aW9uUHJvdG90eXBlLm5vZGU7XG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuc2l6ZSA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5zaXplO1xuICBkMy50cmFuc2l0aW9uID0gZnVuY3Rpb24oc2VsZWN0aW9uLCBuYW1lKSB7XG4gICAgcmV0dXJuIHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24udHJhbnNpdGlvbiA/IGQzX3RyYW5zaXRpb25Jbmhlcml0SWQgPyBzZWxlY3Rpb24udHJhbnNpdGlvbihuYW1lKSA6IHNlbGVjdGlvbiA6IGQzLnNlbGVjdGlvbigpLnRyYW5zaXRpb24oc2VsZWN0aW9uKTtcbiAgfTtcbiAgZDMudHJhbnNpdGlvbi5wcm90b3R5cGUgPSBkM190cmFuc2l0aW9uUHJvdG90eXBlO1xuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgdmFyIGlkID0gdGhpcy5pZCwgbnMgPSB0aGlzLm5hbWVzcGFjZSwgc3ViZ3JvdXBzID0gW10sIHN1Ymdyb3VwLCBzdWJub2RlLCBub2RlO1xuICAgIHNlbGVjdG9yID0gZDNfc2VsZWN0aW9uX3NlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB7XG4gICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTtcbiAgICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOyApIHtcbiAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0b3IuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKSkpIHtcbiAgICAgICAgICBpZiAoXCJfX2RhdGFfX1wiIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fO1xuICAgICAgICAgIGQzX3RyYW5zaXRpb25Ob2RlKHN1Ym5vZGUsIGksIG5zLCBpZCwgbm9kZVtuc11baWRdKTtcbiAgICAgICAgICBzdWJncm91cC5wdXNoKHN1Ym5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1Ymdyb3VwLnB1c2gobnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGQzX3RyYW5zaXRpb24oc3ViZ3JvdXBzLCBucywgaWQpO1xuICB9O1xuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLnNlbGVjdEFsbCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgdmFyIGlkID0gdGhpcy5pZCwgbnMgPSB0aGlzLm5hbWVzcGFjZSwgc3ViZ3JvdXBzID0gW10sIHN1Ymdyb3VwLCBzdWJub2Rlcywgbm9kZSwgc3Vibm9kZSwgdHJhbnNpdGlvbjtcbiAgICBzZWxlY3RvciA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07ICkge1xuICAgICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47ICkge1xuICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgICAgdHJhbnNpdGlvbiA9IG5vZGVbbnNdW2lkXTtcbiAgICAgICAgICBzdWJub2RlcyA9IHNlbGVjdG9yLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaik7XG4gICAgICAgICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7XG4gICAgICAgICAgZm9yICh2YXIgayA9IC0xLCBvID0gc3Vibm9kZXMubGVuZ3RoOyArK2sgPCBvOyApIHtcbiAgICAgICAgICAgIGlmIChzdWJub2RlID0gc3Vibm9kZXNba10pIGQzX3RyYW5zaXRpb25Ob2RlKHN1Ym5vZGUsIGssIG5zLCBpZCwgdHJhbnNpdGlvbik7XG4gICAgICAgICAgICBzdWJncm91cC5wdXNoKHN1Ym5vZGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZDNfdHJhbnNpdGlvbihzdWJncm91cHMsIG5zLCBpZCk7XG4gIH07XG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24oZmlsdGVyKSB7XG4gICAgdmFyIHN1Ymdyb3VwcyA9IFtdLCBzdWJncm91cCwgZ3JvdXAsIG5vZGU7XG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgIT09IFwiZnVuY3Rpb25cIikgZmlsdGVyID0gZDNfc2VsZWN0aW9uX2ZpbHRlcihmaWx0ZXIpO1xuICAgIGZvciAodmFyIGogPSAwLCBtID0gdGhpcy5sZW5ndGg7IGogPCBtOyBqKyspIHtcbiAgICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pO1xuICAgICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgZmlsdGVyLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaikpIHtcbiAgICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkM190cmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5uYW1lc3BhY2UsIHRoaXMuaWQpO1xuICB9O1xuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLnR3ZWVuID0gZnVuY3Rpb24obmFtZSwgdHdlZW4pIHtcbiAgICB2YXIgaWQgPSB0aGlzLmlkLCBucyA9IHRoaXMubmFtZXNwYWNlO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIHRoaXMubm9kZSgpW25zXVtpZF0udHdlZW4uZ2V0KG5hbWUpO1xuICAgIHJldHVybiBkM19zZWxlY3Rpb25fZWFjaCh0aGlzLCB0d2VlbiA9PSBudWxsID8gZnVuY3Rpb24obm9kZSkge1xuICAgICAgbm9kZVtuc11baWRdLnR3ZWVuLnJlbW92ZShuYW1lKTtcbiAgICB9IDogZnVuY3Rpb24obm9kZSkge1xuICAgICAgbm9kZVtuc11baWRdLnR3ZWVuLnNldChuYW1lLCB0d2Vlbik7XG4gICAgfSk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3RyYW5zaXRpb25fdHdlZW4oZ3JvdXBzLCBuYW1lLCB2YWx1ZSwgdHdlZW4pIHtcbiAgICB2YXIgaWQgPSBncm91cHMuaWQsIG5zID0gZ3JvdXBzLm5hbWVzcGFjZTtcbiAgICByZXR1cm4gZDNfc2VsZWN0aW9uX2VhY2goZ3JvdXBzLCB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IGZ1bmN0aW9uKG5vZGUsIGksIGopIHtcbiAgICAgIG5vZGVbbnNdW2lkXS50d2Vlbi5zZXQobmFtZSwgdHdlZW4odmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKSkpO1xuICAgIH0gOiAodmFsdWUgPSB0d2Vlbih2YWx1ZSksIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIG5vZGVbbnNdW2lkXS50d2Vlbi5zZXQobmFtZSwgdmFsdWUpO1xuICAgIH0pKTtcbiAgfVxuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLmF0dHIgPSBmdW5jdGlvbihuYW1lTlMsIHZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICBmb3IgKHZhbHVlIGluIG5hbWVOUykgdGhpcy5hdHRyKHZhbHVlLCBuYW1lTlNbdmFsdWVdKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB2YXIgaW50ZXJwb2xhdGUgPSBuYW1lTlMgPT0gXCJ0cmFuc2Zvcm1cIiA/IGQzX2ludGVycG9sYXRlVHJhbnNmb3JtIDogZDNfaW50ZXJwb2xhdGUsIG5hbWUgPSBkMy5ucy5xdWFsaWZ5KG5hbWVOUyk7XG4gICAgZnVuY3Rpb24gYXR0ck51bGwoKSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYXR0ck51bGxOUygpIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGF0dHJUd2VlbihiKSB7XG4gICAgICByZXR1cm4gYiA9PSBudWxsID8gYXR0ck51bGwgOiAoYiArPSBcIlwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGEgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKSwgaTtcbiAgICAgICAgcmV0dXJuIGEgIT09IGIgJiYgKGkgPSBpbnRlcnBvbGF0ZShhLCBiKSwgZnVuY3Rpb24odCkge1xuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIGkodCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhdHRyVHdlZW5OUyhiKSB7XG4gICAgICByZXR1cm4gYiA9PSBudWxsID8gYXR0ck51bGxOUyA6IChiICs9IFwiXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYSA9IHRoaXMuZ2V0QXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCksIGk7XG4gICAgICAgIHJldHVybiBhICE9PSBiICYmIChpID0gaW50ZXJwb2xhdGUoYSwgYiksIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwsIGkodCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gZDNfdHJhbnNpdGlvbl90d2Vlbih0aGlzLCBcImF0dHIuXCIgKyBuYW1lTlMsIHZhbHVlLCBuYW1lLmxvY2FsID8gYXR0clR3ZWVuTlMgOiBhdHRyVHdlZW4pO1xuICB9O1xuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLmF0dHJUd2VlbiA9IGZ1bmN0aW9uKG5hbWVOUywgdHdlZW4pIHtcbiAgICB2YXIgbmFtZSA9IGQzLm5zLnF1YWxpZnkobmFtZU5TKTtcbiAgICBmdW5jdGlvbiBhdHRyVHdlZW4oZCwgaSkge1xuICAgICAgdmFyIGYgPSB0d2Vlbi5jYWxsKHRoaXMsIGQsIGksIHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpKTtcbiAgICAgIHJldHVybiBmICYmIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgZih0KSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBhdHRyVHdlZW5OUyhkLCBpKSB7XG4gICAgICB2YXIgZiA9IHR3ZWVuLmNhbGwodGhpcywgZCwgaSwgdGhpcy5nZXRBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKSk7XG4gICAgICByZXR1cm4gZiAmJiBmdW5jdGlvbih0KSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCwgZih0KSk7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50d2VlbihcImF0dHIuXCIgKyBuYW1lTlMsIG5hbWUubG9jYWwgPyBhdHRyVHdlZW5OUyA6IGF0dHJUd2Vlbik7XG4gIH07XG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuc3R5bGUgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgaWYgKG4gPCAzKSB7XG4gICAgICBpZiAodHlwZW9mIG5hbWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKG4gPCAyKSB2YWx1ZSA9IFwiXCI7XG4gICAgICAgIGZvciAocHJpb3JpdHkgaW4gbmFtZSkgdGhpcy5zdHlsZShwcmlvcml0eSwgbmFtZVtwcmlvcml0eV0sIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBwcmlvcml0eSA9IFwiXCI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0eWxlTnVsbCgpIHtcbiAgICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0eWxlU3RyaW5nKGIpIHtcbiAgICAgIHJldHVybiBiID09IG51bGwgPyBzdHlsZU51bGwgOiAoYiArPSBcIlwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGEgPSBkM193aW5kb3codGhpcykuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpLCBpO1xuICAgICAgICByZXR1cm4gYSAhPT0gYiAmJiAoaSA9IGQzX2ludGVycG9sYXRlKGEsIGIpLCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpKHQpLCBwcmlvcml0eSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBkM190cmFuc2l0aW9uX3R3ZWVuKHRoaXMsIFwic3R5bGUuXCIgKyBuYW1lLCB2YWx1ZSwgc3R5bGVTdHJpbmcpO1xuICB9O1xuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLnN0eWxlVHdlZW4gPSBmdW5jdGlvbihuYW1lLCB0d2VlbiwgcHJpb3JpdHkpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIHByaW9yaXR5ID0gXCJcIjtcbiAgICBmdW5jdGlvbiBzdHlsZVR3ZWVuKGQsIGkpIHtcbiAgICAgIHZhciBmID0gdHdlZW4uY2FsbCh0aGlzLCBkLCBpLCBkM193aW5kb3codGhpcykuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpKTtcbiAgICAgIHJldHVybiBmICYmIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBmKHQpLCBwcmlvcml0eSk7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50d2VlbihcInN0eWxlLlwiICsgbmFtZSwgc3R5bGVUd2Vlbik7XG4gIH07XG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUudGV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGQzX3RyYW5zaXRpb25fdHdlZW4odGhpcywgXCJ0ZXh0XCIsIHZhbHVlLCBkM190cmFuc2l0aW9uX3RleHQpO1xuICB9O1xuICBmdW5jdGlvbiBkM190cmFuc2l0aW9uX3RleHQoYikge1xuICAgIGlmIChiID09IG51bGwpIGIgPSBcIlwiO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMudGV4dENvbnRlbnQgPSBiO1xuICAgIH07XG4gIH1cbiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgbnMgPSB0aGlzLm5hbWVzcGFjZTtcbiAgICByZXR1cm4gdGhpcy5lYWNoKFwiZW5kLnRyYW5zaXRpb25cIiwgZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcDtcbiAgICAgIGlmICh0aGlzW25zXS5jb3VudCA8IDIgJiYgKHAgPSB0aGlzLnBhcmVudE5vZGUpKSBwLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgIH0pO1xuICB9O1xuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLmVhc2UgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciBpZCA9IHRoaXMuaWQsIG5zID0gdGhpcy5uYW1lc3BhY2U7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gdGhpcy5ub2RlKClbbnNdW2lkXS5lYXNlO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiZnVuY3Rpb25cIikgdmFsdWUgPSBkMy5lYXNlLmFwcGx5KGQzLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiBkM19zZWxlY3Rpb25fZWFjaCh0aGlzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICBub2RlW25zXVtpZF0uZWFzZSA9IHZhbHVlO1xuICAgIH0pO1xuICB9O1xuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLmRlbGF5ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgaWQgPSB0aGlzLmlkLCBucyA9IHRoaXMubmFtZXNwYWNlO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMSkgcmV0dXJuIHRoaXMubm9kZSgpW25zXVtpZF0uZGVsYXk7XG4gICAgcmV0dXJuIGQzX3NlbGVjdGlvbl9lYWNoKHRoaXMsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gZnVuY3Rpb24obm9kZSwgaSwgaikge1xuICAgICAgbm9kZVtuc11baWRdLmRlbGF5ID0gK3ZhbHVlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaik7XG4gICAgfSA6ICh2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgbm9kZVtuc11baWRdLmRlbGF5ID0gdmFsdWU7XG4gICAgfSkpO1xuICB9O1xuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLmR1cmF0aW9uID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB2YXIgaWQgPSB0aGlzLmlkLCBucyA9IHRoaXMubmFtZXNwYWNlO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMSkgcmV0dXJuIHRoaXMubm9kZSgpW25zXVtpZF0uZHVyYXRpb247XG4gICAgcmV0dXJuIGQzX3NlbGVjdGlvbl9lYWNoKHRoaXMsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gZnVuY3Rpb24obm9kZSwgaSwgaikge1xuICAgICAgbm9kZVtuc11baWRdLmR1cmF0aW9uID0gTWF0aC5tYXgoMSwgdmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKSk7XG4gICAgfSA6ICh2YWx1ZSA9IE1hdGgubWF4KDEsIHZhbHVlKSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgbm9kZVtuc11baWRdLmR1cmF0aW9uID0gdmFsdWU7XG4gICAgfSkpO1xuICB9O1xuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLmVhY2ggPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICAgIHZhciBpZCA9IHRoaXMuaWQsIG5zID0gdGhpcy5uYW1lc3BhY2U7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICB2YXIgaW5oZXJpdCA9IGQzX3RyYW5zaXRpb25Jbmhlcml0LCBpbmhlcml0SWQgPSBkM190cmFuc2l0aW9uSW5oZXJpdElkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgZDNfdHJhbnNpdGlvbkluaGVyaXRJZCA9IGlkO1xuICAgICAgICBkM19zZWxlY3Rpb25fZWFjaCh0aGlzLCBmdW5jdGlvbihub2RlLCBpLCBqKSB7XG4gICAgICAgICAgZDNfdHJhbnNpdGlvbkluaGVyaXQgPSBub2RlW25zXVtpZF07XG4gICAgICAgICAgdHlwZS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGopO1xuICAgICAgICB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGQzX3RyYW5zaXRpb25Jbmhlcml0ID0gaW5oZXJpdDtcbiAgICAgICAgZDNfdHJhbnNpdGlvbkluaGVyaXRJZCA9IGluaGVyaXRJZDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZDNfc2VsZWN0aW9uX2VhY2godGhpcywgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICB2YXIgdHJhbnNpdGlvbiA9IG5vZGVbbnNdW2lkXTtcbiAgICAgICAgKHRyYW5zaXRpb24uZXZlbnQgfHwgKHRyYW5zaXRpb24uZXZlbnQgPSBkMy5kaXNwYXRjaChcInN0YXJ0XCIsIFwiZW5kXCIsIFwiaW50ZXJydXB0XCIpKSkub24odHlwZSwgbGlzdGVuZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLnRyYW5zaXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaWQwID0gdGhpcy5pZCwgaWQxID0gKytkM190cmFuc2l0aW9uSWQsIG5zID0gdGhpcy5uYW1lc3BhY2UsIHN1Ymdyb3VwcyA9IFtdLCBzdWJncm91cCwgZ3JvdXAsIG5vZGUsIHRyYW5zaXRpb247XG4gICAgZm9yICh2YXIgaiA9IDAsIG0gPSB0aGlzLmxlbmd0aDsgaiA8IG07IGorKykge1xuICAgICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7XG4gICAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgICB0cmFuc2l0aW9uID0gbm9kZVtuc11baWQwXTtcbiAgICAgICAgICBkM190cmFuc2l0aW9uTm9kZShub2RlLCBpLCBucywgaWQxLCB7XG4gICAgICAgICAgICB0aW1lOiB0cmFuc2l0aW9uLnRpbWUsXG4gICAgICAgICAgICBlYXNlOiB0cmFuc2l0aW9uLmVhc2UsXG4gICAgICAgICAgICBkZWxheTogdHJhbnNpdGlvbi5kZWxheSArIHRyYW5zaXRpb24uZHVyYXRpb24sXG4gICAgICAgICAgICBkdXJhdGlvbjogdHJhbnNpdGlvbi5kdXJhdGlvblxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkM190cmFuc2l0aW9uKHN1Ymdyb3VwcywgbnMsIGlkMSk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3RyYW5zaXRpb25OYW1lc3BhY2UobmFtZSkge1xuICAgIHJldHVybiBuYW1lID09IG51bGwgPyBcIl9fdHJhbnNpdGlvbl9fXCIgOiBcIl9fdHJhbnNpdGlvbl9cIiArIG5hbWUgKyBcIl9fXCI7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdHJhbnNpdGlvbk5vZGUobm9kZSwgaSwgbnMsIGlkLCBpbmhlcml0KSB7XG4gICAgdmFyIGxvY2sgPSBub2RlW25zXSB8fCAobm9kZVtuc10gPSB7XG4gICAgICBhY3RpdmU6IDAsXG4gICAgICBjb3VudDogMFxuICAgIH0pLCB0cmFuc2l0aW9uID0gbG9ja1tpZF0sIHRpbWUsIHRpbWVyLCBkdXJhdGlvbiwgZWFzZSwgdHdlZW5zO1xuICAgIGZ1bmN0aW9uIHNjaGVkdWxlKGVsYXBzZWQpIHtcbiAgICAgIHZhciBkZWxheSA9IHRyYW5zaXRpb24uZGVsYXk7XG4gICAgICB0aW1lci50ID0gZGVsYXkgKyB0aW1lO1xuICAgICAgaWYgKGRlbGF5IDw9IGVsYXBzZWQpIHJldHVybiBzdGFydChlbGFwc2VkIC0gZGVsYXkpO1xuICAgICAgdGltZXIuYyA9IHN0YXJ0O1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdGFydChlbGFwc2VkKSB7XG4gICAgICB2YXIgYWN0aXZlSWQgPSBsb2NrLmFjdGl2ZSwgYWN0aXZlID0gbG9ja1thY3RpdmVJZF07XG4gICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgIGFjdGl2ZS50aW1lci5jID0gbnVsbDtcbiAgICAgICAgYWN0aXZlLnRpbWVyLnQgPSBOYU47XG4gICAgICAgIC0tbG9jay5jb3VudDtcbiAgICAgICAgZGVsZXRlIGxvY2tbYWN0aXZlSWRdO1xuICAgICAgICBhY3RpdmUuZXZlbnQgJiYgYWN0aXZlLmV2ZW50LmludGVycnVwdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGFjdGl2ZS5pbmRleCk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBjYW5jZWxJZCBpbiBsb2NrKSB7XG4gICAgICAgIGlmICgrY2FuY2VsSWQgPCBpZCkge1xuICAgICAgICAgIHZhciBjYW5jZWwgPSBsb2NrW2NhbmNlbElkXTtcbiAgICAgICAgICBjYW5jZWwudGltZXIuYyA9IG51bGw7XG4gICAgICAgICAgY2FuY2VsLnRpbWVyLnQgPSBOYU47XG4gICAgICAgICAgLS1sb2NrLmNvdW50O1xuICAgICAgICAgIGRlbGV0ZSBsb2NrW2NhbmNlbElkXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGltZXIuYyA9IHRpY2s7XG4gICAgICBkM190aW1lcihmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHRpbWVyLmMgJiYgdGljayhlbGFwc2VkIHx8IDEpKSB7XG4gICAgICAgICAgdGltZXIuYyA9IG51bGw7XG4gICAgICAgICAgdGltZXIudCA9IE5hTjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH0sIDAsIHRpbWUpO1xuICAgICAgbG9jay5hY3RpdmUgPSBpZDtcbiAgICAgIHRyYW5zaXRpb24uZXZlbnQgJiYgdHJhbnNpdGlvbi5ldmVudC5zdGFydC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGkpO1xuICAgICAgdHdlZW5zID0gW107XG4gICAgICB0cmFuc2l0aW9uLnR3ZWVuLmZvckVhY2goZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPSB2YWx1ZS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGkpKSB7XG4gICAgICAgICAgdHdlZW5zLnB1c2godmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGVhc2UgPSB0cmFuc2l0aW9uLmVhc2U7XG4gICAgICBkdXJhdGlvbiA9IHRyYW5zaXRpb24uZHVyYXRpb247XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkge1xuICAgICAgdmFyIHQgPSBlbGFwc2VkIC8gZHVyYXRpb24sIGUgPSBlYXNlKHQpLCBuID0gdHdlZW5zLmxlbmd0aDtcbiAgICAgIHdoaWxlIChuID4gMCkge1xuICAgICAgICB0d2VlbnNbLS1uXS5jYWxsKG5vZGUsIGUpO1xuICAgICAgfVxuICAgICAgaWYgKHQgPj0gMSkge1xuICAgICAgICB0cmFuc2l0aW9uLmV2ZW50ICYmIHRyYW5zaXRpb24uZXZlbnQuZW5kLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSk7XG4gICAgICAgIGlmICgtLWxvY2suY291bnQpIGRlbGV0ZSBsb2NrW2lkXTsgZWxzZSBkZWxldGUgbm9kZVtuc107XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRyYW5zaXRpb24pIHtcbiAgICAgIHRpbWUgPSBpbmhlcml0LnRpbWU7XG4gICAgICB0aW1lciA9IGQzX3RpbWVyKHNjaGVkdWxlLCAwLCB0aW1lKTtcbiAgICAgIHRyYW5zaXRpb24gPSBsb2NrW2lkXSA9IHtcbiAgICAgICAgdHdlZW46IG5ldyBkM19NYXAoKSxcbiAgICAgICAgdGltZTogdGltZSxcbiAgICAgICAgdGltZXI6IHRpbWVyLFxuICAgICAgICBkZWxheTogaW5oZXJpdC5kZWxheSxcbiAgICAgICAgZHVyYXRpb246IGluaGVyaXQuZHVyYXRpb24sXG4gICAgICAgIGVhc2U6IGluaGVyaXQuZWFzZSxcbiAgICAgICAgaW5kZXg6IGlcbiAgICAgIH07XG4gICAgICBpbmhlcml0ID0gbnVsbDtcbiAgICAgICsrbG9jay5jb3VudDtcbiAgICB9XG4gIH1cbiAgZDMuc3ZnLmF4aXMgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc2NhbGUgPSBkMy5zY2FsZS5saW5lYXIoKSwgb3JpZW50ID0gZDNfc3ZnX2F4aXNEZWZhdWx0T3JpZW50LCBpbm5lclRpY2tTaXplID0gNiwgb3V0ZXJUaWNrU2l6ZSA9IDYsIHRpY2tQYWRkaW5nID0gMywgdGlja0FyZ3VtZW50c18gPSBbIDEwIF0sIHRpY2tWYWx1ZXMgPSBudWxsLCB0aWNrRm9ybWF0XztcbiAgICBmdW5jdGlvbiBheGlzKGcpIHtcbiAgICAgIGcuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGcgPSBkMy5zZWxlY3QodGhpcyk7XG4gICAgICAgIHZhciBzY2FsZTAgPSB0aGlzLl9fY2hhcnRfXyB8fCBzY2FsZSwgc2NhbGUxID0gdGhpcy5fX2NoYXJ0X18gPSBzY2FsZS5jb3B5KCk7XG4gICAgICAgIHZhciB0aWNrcyA9IHRpY2tWYWx1ZXMgPT0gbnVsbCA/IHNjYWxlMS50aWNrcyA/IHNjYWxlMS50aWNrcy5hcHBseShzY2FsZTEsIHRpY2tBcmd1bWVudHNfKSA6IHNjYWxlMS5kb21haW4oKSA6IHRpY2tWYWx1ZXMsIHRpY2tGb3JtYXQgPSB0aWNrRm9ybWF0XyA9PSBudWxsID8gc2NhbGUxLnRpY2tGb3JtYXQgPyBzY2FsZTEudGlja0Zvcm1hdC5hcHBseShzY2FsZTEsIHRpY2tBcmd1bWVudHNfKSA6IGQzX2lkZW50aXR5IDogdGlja0Zvcm1hdF8sIHRpY2sgPSBnLnNlbGVjdEFsbChcIi50aWNrXCIpLmRhdGEodGlja3MsIHNjYWxlMSksIHRpY2tFbnRlciA9IHRpY2suZW50ZXIoKS5pbnNlcnQoXCJnXCIsIFwiLmRvbWFpblwiKS5hdHRyKFwiY2xhc3NcIiwgXCJ0aWNrXCIpLnN0eWxlKFwib3BhY2l0eVwiLCDOtSksIHRpY2tFeGl0ID0gZDMudHJhbnNpdGlvbih0aWNrLmV4aXQoKSkuc3R5bGUoXCJvcGFjaXR5XCIsIM61KS5yZW1vdmUoKSwgdGlja1VwZGF0ZSA9IGQzLnRyYW5zaXRpb24odGljay5vcmRlcigpKS5zdHlsZShcIm9wYWNpdHlcIiwgMSksIHRpY2tTcGFjaW5nID0gTWF0aC5tYXgoaW5uZXJUaWNrU2l6ZSwgMCkgKyB0aWNrUGFkZGluZywgdGlja1RyYW5zZm9ybTtcbiAgICAgICAgdmFyIHJhbmdlID0gZDNfc2NhbGVSYW5nZShzY2FsZTEpLCBwYXRoID0gZy5zZWxlY3RBbGwoXCIuZG9tYWluXCIpLmRhdGEoWyAwIF0pLCBwYXRoVXBkYXRlID0gKHBhdGguZW50ZXIoKS5hcHBlbmQoXCJwYXRoXCIpLmF0dHIoXCJjbGFzc1wiLCBcImRvbWFpblwiKSwgXG4gICAgICAgIGQzLnRyYW5zaXRpb24ocGF0aCkpO1xuICAgICAgICB0aWNrRW50ZXIuYXBwZW5kKFwibGluZVwiKTtcbiAgICAgICAgdGlja0VudGVyLmFwcGVuZChcInRleHRcIik7XG4gICAgICAgIHZhciBsaW5lRW50ZXIgPSB0aWNrRW50ZXIuc2VsZWN0KFwibGluZVwiKSwgbGluZVVwZGF0ZSA9IHRpY2tVcGRhdGUuc2VsZWN0KFwibGluZVwiKSwgdGV4dCA9IHRpY2suc2VsZWN0KFwidGV4dFwiKS50ZXh0KHRpY2tGb3JtYXQpLCB0ZXh0RW50ZXIgPSB0aWNrRW50ZXIuc2VsZWN0KFwidGV4dFwiKSwgdGV4dFVwZGF0ZSA9IHRpY2tVcGRhdGUuc2VsZWN0KFwidGV4dFwiKSwgc2lnbiA9IG9yaWVudCA9PT0gXCJ0b3BcIiB8fCBvcmllbnQgPT09IFwibGVmdFwiID8gLTEgOiAxLCB4MSwgeDIsIHkxLCB5MjtcbiAgICAgICAgaWYgKG9yaWVudCA9PT0gXCJib3R0b21cIiB8fCBvcmllbnQgPT09IFwidG9wXCIpIHtcbiAgICAgICAgICB0aWNrVHJhbnNmb3JtID0gZDNfc3ZnX2F4aXNYLCB4MSA9IFwieFwiLCB5MSA9IFwieVwiLCB4MiA9IFwieDJcIiwgeTIgPSBcInkyXCI7XG4gICAgICAgICAgdGV4dC5hdHRyKFwiZHlcIiwgc2lnbiA8IDAgPyBcIjBlbVwiIDogXCIuNzFlbVwiKS5zdHlsZShcInRleHQtYW5jaG9yXCIsIFwibWlkZGxlXCIpO1xuICAgICAgICAgIHBhdGhVcGRhdGUuYXR0cihcImRcIiwgXCJNXCIgKyByYW5nZVswXSArIFwiLFwiICsgc2lnbiAqIG91dGVyVGlja1NpemUgKyBcIlYwSFwiICsgcmFuZ2VbMV0gKyBcIlZcIiArIHNpZ24gKiBvdXRlclRpY2tTaXplKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aWNrVHJhbnNmb3JtID0gZDNfc3ZnX2F4aXNZLCB4MSA9IFwieVwiLCB5MSA9IFwieFwiLCB4MiA9IFwieTJcIiwgeTIgPSBcIngyXCI7XG4gICAgICAgICAgdGV4dC5hdHRyKFwiZHlcIiwgXCIuMzJlbVwiKS5zdHlsZShcInRleHQtYW5jaG9yXCIsIHNpZ24gPCAwID8gXCJlbmRcIiA6IFwic3RhcnRcIik7XG4gICAgICAgICAgcGF0aFVwZGF0ZS5hdHRyKFwiZFwiLCBcIk1cIiArIHNpZ24gKiBvdXRlclRpY2tTaXplICsgXCIsXCIgKyByYW5nZVswXSArIFwiSDBWXCIgKyByYW5nZVsxXSArIFwiSFwiICsgc2lnbiAqIG91dGVyVGlja1NpemUpO1xuICAgICAgICB9XG4gICAgICAgIGxpbmVFbnRlci5hdHRyKHkyLCBzaWduICogaW5uZXJUaWNrU2l6ZSk7XG4gICAgICAgIHRleHRFbnRlci5hdHRyKHkxLCBzaWduICogdGlja1NwYWNpbmcpO1xuICAgICAgICBsaW5lVXBkYXRlLmF0dHIoeDIsIDApLmF0dHIoeTIsIHNpZ24gKiBpbm5lclRpY2tTaXplKTtcbiAgICAgICAgdGV4dFVwZGF0ZS5hdHRyKHgxLCAwKS5hdHRyKHkxLCBzaWduICogdGlja1NwYWNpbmcpO1xuICAgICAgICBpZiAoc2NhbGUxLnJhbmdlQmFuZCkge1xuICAgICAgICAgIHZhciB4ID0gc2NhbGUxLCBkeCA9IHgucmFuZ2VCYW5kKCkgLyAyO1xuICAgICAgICAgIHNjYWxlMCA9IHNjYWxlMSA9IGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgICAgIHJldHVybiB4KGQpICsgZHg7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChzY2FsZTAucmFuZ2VCYW5kKSB7XG4gICAgICAgICAgc2NhbGUwID0gc2NhbGUxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRpY2tFeGl0LmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUxLCBzY2FsZTApO1xuICAgICAgICB9XG4gICAgICAgIHRpY2tFbnRlci5jYWxsKHRpY2tUcmFuc2Zvcm0sIHNjYWxlMCwgc2NhbGUxKTtcbiAgICAgICAgdGlja1VwZGF0ZS5jYWxsKHRpY2tUcmFuc2Zvcm0sIHNjYWxlMSwgc2NhbGUxKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBheGlzLnNjYWxlID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2NhbGU7XG4gICAgICBzY2FsZSA9IHg7XG4gICAgICByZXR1cm4gYXhpcztcbiAgICB9O1xuICAgIGF4aXMub3JpZW50ID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3JpZW50O1xuICAgICAgb3JpZW50ID0geCBpbiBkM19zdmdfYXhpc09yaWVudHMgPyB4ICsgXCJcIiA6IGQzX3N2Z19heGlzRGVmYXVsdE9yaWVudDtcbiAgICAgIHJldHVybiBheGlzO1xuICAgIH07XG4gICAgYXhpcy50aWNrcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja0FyZ3VtZW50c187XG4gICAgICB0aWNrQXJndW1lbnRzXyA9IGQzX2FycmF5KGFyZ3VtZW50cyk7XG4gICAgICByZXR1cm4gYXhpcztcbiAgICB9O1xuICAgIGF4aXMudGlja1ZhbHVlcyA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpY2tWYWx1ZXM7XG4gICAgICB0aWNrVmFsdWVzID0geDtcbiAgICAgIHJldHVybiBheGlzO1xuICAgIH07XG4gICAgYXhpcy50aWNrRm9ybWF0ID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja0Zvcm1hdF87XG4gICAgICB0aWNrRm9ybWF0XyA9IHg7XG4gICAgICByZXR1cm4gYXhpcztcbiAgICB9O1xuICAgIGF4aXMudGlja1NpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICBpZiAoIW4pIHJldHVybiBpbm5lclRpY2tTaXplO1xuICAgICAgaW5uZXJUaWNrU2l6ZSA9ICt4O1xuICAgICAgb3V0ZXJUaWNrU2l6ZSA9ICthcmd1bWVudHNbbiAtIDFdO1xuICAgICAgcmV0dXJuIGF4aXM7XG4gICAgfTtcbiAgICBheGlzLmlubmVyVGlja1NpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBpbm5lclRpY2tTaXplO1xuICAgICAgaW5uZXJUaWNrU2l6ZSA9ICt4O1xuICAgICAgcmV0dXJuIGF4aXM7XG4gICAgfTtcbiAgICBheGlzLm91dGVyVGlja1NpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvdXRlclRpY2tTaXplO1xuICAgICAgb3V0ZXJUaWNrU2l6ZSA9ICt4O1xuICAgICAgcmV0dXJuIGF4aXM7XG4gICAgfTtcbiAgICBheGlzLnRpY2tQYWRkaW5nID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja1BhZGRpbmc7XG4gICAgICB0aWNrUGFkZGluZyA9ICt4O1xuICAgICAgcmV0dXJuIGF4aXM7XG4gICAgfTtcbiAgICBheGlzLnRpY2tTdWJkaXZpZGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoICYmIGF4aXM7XG4gICAgfTtcbiAgICByZXR1cm4gYXhpcztcbiAgfTtcbiAgdmFyIGQzX3N2Z19heGlzRGVmYXVsdE9yaWVudCA9IFwiYm90dG9tXCIsIGQzX3N2Z19heGlzT3JpZW50cyA9IHtcbiAgICB0b3A6IDEsXG4gICAgcmlnaHQ6IDEsXG4gICAgYm90dG9tOiAxLFxuICAgIGxlZnQ6IDFcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc3ZnX2F4aXNYKHNlbGVjdGlvbiwgeDAsIHgxKSB7XG4gICAgc2VsZWN0aW9uLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgZnVuY3Rpb24oZCkge1xuICAgICAgdmFyIHYwID0geDAoZCk7XG4gICAgICByZXR1cm4gXCJ0cmFuc2xhdGUoXCIgKyAoaXNGaW5pdGUodjApID8gdjAgOiB4MShkKSkgKyBcIiwwKVwiO1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19heGlzWShzZWxlY3Rpb24sIHkwLCB5MSkge1xuICAgIHNlbGVjdGlvbi5hdHRyKFwidHJhbnNmb3JtXCIsIGZ1bmN0aW9uKGQpIHtcbiAgICAgIHZhciB2MCA9IHkwKGQpO1xuICAgICAgcmV0dXJuIFwidHJhbnNsYXRlKDAsXCIgKyAoaXNGaW5pdGUodjApID8gdjAgOiB5MShkKSkgKyBcIilcIjtcbiAgICB9KTtcbiAgfVxuICBkMy5zdmcuYnJ1c2ggPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZXZlbnQgPSBkM19ldmVudERpc3BhdGNoKGJydXNoLCBcImJydXNoc3RhcnRcIiwgXCJicnVzaFwiLCBcImJydXNoZW5kXCIpLCB4ID0gbnVsbCwgeSA9IG51bGwsIHhFeHRlbnQgPSBbIDAsIDAgXSwgeUV4dGVudCA9IFsgMCwgMCBdLCB4RXh0ZW50RG9tYWluLCB5RXh0ZW50RG9tYWluLCB4Q2xhbXAgPSB0cnVlLCB5Q2xhbXAgPSB0cnVlLCByZXNpemVzID0gZDNfc3ZnX2JydXNoUmVzaXplc1swXTtcbiAgICBmdW5jdGlvbiBicnVzaChnKSB7XG4gICAgICBnLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBnID0gZDMuc2VsZWN0KHRoaXMpLnN0eWxlKFwicG9pbnRlci1ldmVudHNcIiwgXCJhbGxcIikuc3R5bGUoXCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3JcIiwgXCJyZ2JhKDAsMCwwLDApXCIpLm9uKFwibW91c2Vkb3duLmJydXNoXCIsIGJydXNoc3RhcnQpLm9uKFwidG91Y2hzdGFydC5icnVzaFwiLCBicnVzaHN0YXJ0KTtcbiAgICAgICAgdmFyIGJhY2tncm91bmQgPSBnLnNlbGVjdEFsbChcIi5iYWNrZ3JvdW5kXCIpLmRhdGEoWyAwIF0pO1xuICAgICAgICBiYWNrZ3JvdW5kLmVudGVyKCkuYXBwZW5kKFwicmVjdFwiKS5hdHRyKFwiY2xhc3NcIiwgXCJiYWNrZ3JvdW5kXCIpLnN0eWxlKFwidmlzaWJpbGl0eVwiLCBcImhpZGRlblwiKS5zdHlsZShcImN1cnNvclwiLCBcImNyb3NzaGFpclwiKTtcbiAgICAgICAgZy5zZWxlY3RBbGwoXCIuZXh0ZW50XCIpLmRhdGEoWyAwIF0pLmVudGVyKCkuYXBwZW5kKFwicmVjdFwiKS5hdHRyKFwiY2xhc3NcIiwgXCJleHRlbnRcIikuc3R5bGUoXCJjdXJzb3JcIiwgXCJtb3ZlXCIpO1xuICAgICAgICB2YXIgcmVzaXplID0gZy5zZWxlY3RBbGwoXCIucmVzaXplXCIpLmRhdGEocmVzaXplcywgZDNfaWRlbnRpdHkpO1xuICAgICAgICByZXNpemUuZXhpdCgpLnJlbW92ZSgpO1xuICAgICAgICByZXNpemUuZW50ZXIoKS5hcHBlbmQoXCJnXCIpLmF0dHIoXCJjbGFzc1wiLCBmdW5jdGlvbihkKSB7XG4gICAgICAgICAgcmV0dXJuIFwicmVzaXplIFwiICsgZDtcbiAgICAgICAgfSkuc3R5bGUoXCJjdXJzb3JcIiwgZnVuY3Rpb24oZCkge1xuICAgICAgICAgIHJldHVybiBkM19zdmdfYnJ1c2hDdXJzb3JbZF07XG4gICAgICAgIH0pLmFwcGVuZChcInJlY3RcIikuYXR0cihcInhcIiwgZnVuY3Rpb24oZCkge1xuICAgICAgICAgIHJldHVybiAvW2V3XSQvLnRlc3QoZCkgPyAtMyA6IG51bGw7XG4gICAgICAgIH0pLmF0dHIoXCJ5XCIsIGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgICByZXR1cm4gL15bbnNdLy50ZXN0KGQpID8gLTMgOiBudWxsO1xuICAgICAgICB9KS5hdHRyKFwid2lkdGhcIiwgNikuYXR0cihcImhlaWdodFwiLCA2KS5zdHlsZShcInZpc2liaWxpdHlcIiwgXCJoaWRkZW5cIik7XG4gICAgICAgIHJlc2l6ZS5zdHlsZShcImRpc3BsYXlcIiwgYnJ1c2guZW1wdHkoKSA/IFwibm9uZVwiIDogbnVsbCk7XG4gICAgICAgIHZhciBnVXBkYXRlID0gZDMudHJhbnNpdGlvbihnKSwgYmFja2dyb3VuZFVwZGF0ZSA9IGQzLnRyYW5zaXRpb24oYmFja2dyb3VuZCksIHJhbmdlO1xuICAgICAgICBpZiAoeCkge1xuICAgICAgICAgIHJhbmdlID0gZDNfc2NhbGVSYW5nZSh4KTtcbiAgICAgICAgICBiYWNrZ3JvdW5kVXBkYXRlLmF0dHIoXCJ4XCIsIHJhbmdlWzBdKS5hdHRyKFwid2lkdGhcIiwgcmFuZ2VbMV0gLSByYW5nZVswXSk7XG4gICAgICAgICAgcmVkcmF3WChnVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeSkge1xuICAgICAgICAgIHJhbmdlID0gZDNfc2NhbGVSYW5nZSh5KTtcbiAgICAgICAgICBiYWNrZ3JvdW5kVXBkYXRlLmF0dHIoXCJ5XCIsIHJhbmdlWzBdKS5hdHRyKFwiaGVpZ2h0XCIsIHJhbmdlWzFdIC0gcmFuZ2VbMF0pO1xuICAgICAgICAgIHJlZHJhd1koZ1VwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVkcmF3KGdVcGRhdGUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGJydXNoLmV2ZW50ID0gZnVuY3Rpb24oZykge1xuICAgICAgZy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZXZlbnRfID0gZXZlbnQub2YodGhpcywgYXJndW1lbnRzKSwgZXh0ZW50MSA9IHtcbiAgICAgICAgICB4OiB4RXh0ZW50LFxuICAgICAgICAgIHk6IHlFeHRlbnQsXG4gICAgICAgICAgaTogeEV4dGVudERvbWFpbixcbiAgICAgICAgICBqOiB5RXh0ZW50RG9tYWluXG4gICAgICAgIH0sIGV4dGVudDAgPSB0aGlzLl9fY2hhcnRfXyB8fCBleHRlbnQxO1xuICAgICAgICB0aGlzLl9fY2hhcnRfXyA9IGV4dGVudDE7XG4gICAgICAgIGlmIChkM190cmFuc2l0aW9uSW5oZXJpdElkKSB7XG4gICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5lYWNoKFwic3RhcnQuYnJ1c2hcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB4RXh0ZW50RG9tYWluID0gZXh0ZW50MC5pO1xuICAgICAgICAgICAgeUV4dGVudERvbWFpbiA9IGV4dGVudDAuajtcbiAgICAgICAgICAgIHhFeHRlbnQgPSBleHRlbnQwLng7XG4gICAgICAgICAgICB5RXh0ZW50ID0gZXh0ZW50MC55O1xuICAgICAgICAgICAgZXZlbnRfKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJicnVzaHN0YXJ0XCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pLnR3ZWVuKFwiYnJ1c2g6YnJ1c2hcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgeGkgPSBkM19pbnRlcnBvbGF0ZUFycmF5KHhFeHRlbnQsIGV4dGVudDEueCksIHlpID0gZDNfaW50ZXJwb2xhdGVBcnJheSh5RXh0ZW50LCBleHRlbnQxLnkpO1xuICAgICAgICAgICAgeEV4dGVudERvbWFpbiA9IHlFeHRlbnREb21haW4gPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgeEV4dGVudCA9IGV4dGVudDEueCA9IHhpKHQpO1xuICAgICAgICAgICAgICB5RXh0ZW50ID0gZXh0ZW50MS55ID0geWkodCk7XG4gICAgICAgICAgICAgIGV2ZW50Xyh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJicnVzaFwiLFxuICAgICAgICAgICAgICAgIG1vZGU6IFwicmVzaXplXCJcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pLmVhY2goXCJlbmQuYnJ1c2hcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB4RXh0ZW50RG9tYWluID0gZXh0ZW50MS5pO1xuICAgICAgICAgICAgeUV4dGVudERvbWFpbiA9IGV4dGVudDEuajtcbiAgICAgICAgICAgIGV2ZW50Xyh7XG4gICAgICAgICAgICAgIHR5cGU6IFwiYnJ1c2hcIixcbiAgICAgICAgICAgICAgbW9kZTogXCJyZXNpemVcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBldmVudF8oe1xuICAgICAgICAgICAgICB0eXBlOiBcImJydXNoZW5kXCJcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGV2ZW50Xyh7XG4gICAgICAgICAgICB0eXBlOiBcImJydXNoc3RhcnRcIlxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGV2ZW50Xyh7XG4gICAgICAgICAgICB0eXBlOiBcImJydXNoXCIsXG4gICAgICAgICAgICBtb2RlOiBcInJlc2l6ZVwiXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZXZlbnRfKHtcbiAgICAgICAgICAgIHR5cGU6IFwiYnJ1c2hlbmRcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIHJlZHJhdyhnKSB7XG4gICAgICBnLnNlbGVjdEFsbChcIi5yZXNpemVcIikuYXR0cihcInRyYW5zZm9ybVwiLCBmdW5jdGlvbihkKSB7XG4gICAgICAgIHJldHVybiBcInRyYW5zbGF0ZShcIiArIHhFeHRlbnRbKy9lJC8udGVzdChkKV0gKyBcIixcIiArIHlFeHRlbnRbKy9ecy8udGVzdChkKV0gKyBcIilcIjtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWRyYXdYKGcpIHtcbiAgICAgIGcuc2VsZWN0KFwiLmV4dGVudFwiKS5hdHRyKFwieFwiLCB4RXh0ZW50WzBdKTtcbiAgICAgIGcuc2VsZWN0QWxsKFwiLmV4dGVudCwubj5yZWN0LC5zPnJlY3RcIikuYXR0cihcIndpZHRoXCIsIHhFeHRlbnRbMV0gLSB4RXh0ZW50WzBdKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVkcmF3WShnKSB7XG4gICAgICBnLnNlbGVjdChcIi5leHRlbnRcIikuYXR0cihcInlcIiwgeUV4dGVudFswXSk7XG4gICAgICBnLnNlbGVjdEFsbChcIi5leHRlbnQsLmU+cmVjdCwudz5yZWN0XCIpLmF0dHIoXCJoZWlnaHRcIiwgeUV4dGVudFsxXSAtIHlFeHRlbnRbMF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBicnVzaHN0YXJ0KCkge1xuICAgICAgdmFyIHRhcmdldCA9IHRoaXMsIGV2ZW50VGFyZ2V0ID0gZDMuc2VsZWN0KGQzLmV2ZW50LnRhcmdldCksIGV2ZW50XyA9IGV2ZW50Lm9mKHRhcmdldCwgYXJndW1lbnRzKSwgZyA9IGQzLnNlbGVjdCh0YXJnZXQpLCByZXNpemluZyA9IGV2ZW50VGFyZ2V0LmRhdHVtKCksIHJlc2l6aW5nWCA9ICEvXihufHMpJC8udGVzdChyZXNpemluZykgJiYgeCwgcmVzaXppbmdZID0gIS9eKGV8dykkLy50ZXN0KHJlc2l6aW5nKSAmJiB5LCBkcmFnZ2luZyA9IGV2ZW50VGFyZ2V0LmNsYXNzZWQoXCJleHRlbnRcIiksIGRyYWdSZXN0b3JlID0gZDNfZXZlbnRfZHJhZ1N1cHByZXNzKHRhcmdldCksIGNlbnRlciwgb3JpZ2luID0gZDMubW91c2UodGFyZ2V0KSwgb2Zmc2V0O1xuICAgICAgdmFyIHcgPSBkMy5zZWxlY3QoZDNfd2luZG93KHRhcmdldCkpLm9uKFwia2V5ZG93bi5icnVzaFwiLCBrZXlkb3duKS5vbihcImtleXVwLmJydXNoXCIsIGtleXVwKTtcbiAgICAgIGlmIChkMy5ldmVudC5jaGFuZ2VkVG91Y2hlcykge1xuICAgICAgICB3Lm9uKFwidG91Y2htb3ZlLmJydXNoXCIsIGJydXNobW92ZSkub24oXCJ0b3VjaGVuZC5icnVzaFwiLCBicnVzaGVuZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3Lm9uKFwibW91c2Vtb3ZlLmJydXNoXCIsIGJydXNobW92ZSkub24oXCJtb3VzZXVwLmJydXNoXCIsIGJydXNoZW5kKTtcbiAgICAgIH1cbiAgICAgIGcuaW50ZXJydXB0KCkuc2VsZWN0QWxsKFwiKlwiKS5pbnRlcnJ1cHQoKTtcbiAgICAgIGlmIChkcmFnZ2luZykge1xuICAgICAgICBvcmlnaW5bMF0gPSB4RXh0ZW50WzBdIC0gb3JpZ2luWzBdO1xuICAgICAgICBvcmlnaW5bMV0gPSB5RXh0ZW50WzBdIC0gb3JpZ2luWzFdO1xuICAgICAgfSBlbHNlIGlmIChyZXNpemluZykge1xuICAgICAgICB2YXIgZXggPSArL3ckLy50ZXN0KHJlc2l6aW5nKSwgZXkgPSArL15uLy50ZXN0KHJlc2l6aW5nKTtcbiAgICAgICAgb2Zmc2V0ID0gWyB4RXh0ZW50WzEgLSBleF0gLSBvcmlnaW5bMF0sIHlFeHRlbnRbMSAtIGV5XSAtIG9yaWdpblsxXSBdO1xuICAgICAgICBvcmlnaW5bMF0gPSB4RXh0ZW50W2V4XTtcbiAgICAgICAgb3JpZ2luWzFdID0geUV4dGVudFtleV07XG4gICAgICB9IGVsc2UgaWYgKGQzLmV2ZW50LmFsdEtleSkgY2VudGVyID0gb3JpZ2luLnNsaWNlKCk7XG4gICAgICBnLnN0eWxlKFwicG9pbnRlci1ldmVudHNcIiwgXCJub25lXCIpLnNlbGVjdEFsbChcIi5yZXNpemVcIikuc3R5bGUoXCJkaXNwbGF5XCIsIG51bGwpO1xuICAgICAgZDMuc2VsZWN0KFwiYm9keVwiKS5zdHlsZShcImN1cnNvclwiLCBldmVudFRhcmdldC5zdHlsZShcImN1cnNvclwiKSk7XG4gICAgICBldmVudF8oe1xuICAgICAgICB0eXBlOiBcImJydXNoc3RhcnRcIlxuICAgICAgfSk7XG4gICAgICBicnVzaG1vdmUoKTtcbiAgICAgIGZ1bmN0aW9uIGtleWRvd24oKSB7XG4gICAgICAgIGlmIChkMy5ldmVudC5rZXlDb2RlID09IDMyKSB7XG4gICAgICAgICAgaWYgKCFkcmFnZ2luZykge1xuICAgICAgICAgICAgY2VudGVyID0gbnVsbDtcbiAgICAgICAgICAgIG9yaWdpblswXSAtPSB4RXh0ZW50WzFdO1xuICAgICAgICAgICAgb3JpZ2luWzFdIC09IHlFeHRlbnRbMV07XG4gICAgICAgICAgICBkcmFnZ2luZyA9IDI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGQzX2V2ZW50UHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24ga2V5dXAoKSB7XG4gICAgICAgIGlmIChkMy5ldmVudC5rZXlDb2RlID09IDMyICYmIGRyYWdnaW5nID09IDIpIHtcbiAgICAgICAgICBvcmlnaW5bMF0gKz0geEV4dGVudFsxXTtcbiAgICAgICAgICBvcmlnaW5bMV0gKz0geUV4dGVudFsxXTtcbiAgICAgICAgICBkcmFnZ2luZyA9IDA7XG4gICAgICAgICAgZDNfZXZlbnRQcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBicnVzaG1vdmUoKSB7XG4gICAgICAgIHZhciBwb2ludCA9IGQzLm1vdXNlKHRhcmdldCksIG1vdmVkID0gZmFsc2U7XG4gICAgICAgIGlmIChvZmZzZXQpIHtcbiAgICAgICAgICBwb2ludFswXSArPSBvZmZzZXRbMF07XG4gICAgICAgICAgcG9pbnRbMV0gKz0gb2Zmc2V0WzFdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZHJhZ2dpbmcpIHtcbiAgICAgICAgICBpZiAoZDMuZXZlbnQuYWx0S2V5KSB7XG4gICAgICAgICAgICBpZiAoIWNlbnRlcikgY2VudGVyID0gWyAoeEV4dGVudFswXSArIHhFeHRlbnRbMV0pIC8gMiwgKHlFeHRlbnRbMF0gKyB5RXh0ZW50WzFdKSAvIDIgXTtcbiAgICAgICAgICAgIG9yaWdpblswXSA9IHhFeHRlbnRbKyhwb2ludFswXSA8IGNlbnRlclswXSldO1xuICAgICAgICAgICAgb3JpZ2luWzFdID0geUV4dGVudFsrKHBvaW50WzFdIDwgY2VudGVyWzFdKV07XG4gICAgICAgICAgfSBlbHNlIGNlbnRlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc2l6aW5nWCAmJiBtb3ZlMShwb2ludCwgeCwgMCkpIHtcbiAgICAgICAgICByZWRyYXdYKGcpO1xuICAgICAgICAgIG1vdmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzaXppbmdZICYmIG1vdmUxKHBvaW50LCB5LCAxKSkge1xuICAgICAgICAgIHJlZHJhd1koZyk7XG4gICAgICAgICAgbW92ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb3ZlZCkge1xuICAgICAgICAgIHJlZHJhdyhnKTtcbiAgICAgICAgICBldmVudF8oe1xuICAgICAgICAgICAgdHlwZTogXCJicnVzaFwiLFxuICAgICAgICAgICAgbW9kZTogZHJhZ2dpbmcgPyBcIm1vdmVcIiA6IFwicmVzaXplXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gbW92ZTEocG9pbnQsIHNjYWxlLCBpKSB7XG4gICAgICAgIHZhciByYW5nZSA9IGQzX3NjYWxlUmFuZ2Uoc2NhbGUpLCByMCA9IHJhbmdlWzBdLCByMSA9IHJhbmdlWzFdLCBwb3NpdGlvbiA9IG9yaWdpbltpXSwgZXh0ZW50ID0gaSA/IHlFeHRlbnQgOiB4RXh0ZW50LCBzaXplID0gZXh0ZW50WzFdIC0gZXh0ZW50WzBdLCBtaW4sIG1heDtcbiAgICAgICAgaWYgKGRyYWdnaW5nKSB7XG4gICAgICAgICAgcjAgLT0gcG9zaXRpb247XG4gICAgICAgICAgcjEgLT0gc2l6ZSArIHBvc2l0aW9uO1xuICAgICAgICB9XG4gICAgICAgIG1pbiA9IChpID8geUNsYW1wIDogeENsYW1wKSA/IE1hdGgubWF4KHIwLCBNYXRoLm1pbihyMSwgcG9pbnRbaV0pKSA6IHBvaW50W2ldO1xuICAgICAgICBpZiAoZHJhZ2dpbmcpIHtcbiAgICAgICAgICBtYXggPSAobWluICs9IHBvc2l0aW9uKSArIHNpemU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGNlbnRlcikgcG9zaXRpb24gPSBNYXRoLm1heChyMCwgTWF0aC5taW4ocjEsIDIgKiBjZW50ZXJbaV0gLSBtaW4pKTtcbiAgICAgICAgICBpZiAocG9zaXRpb24gPCBtaW4pIHtcbiAgICAgICAgICAgIG1heCA9IG1pbjtcbiAgICAgICAgICAgIG1pbiA9IHBvc2l0aW9uO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtYXggPSBwb3NpdGlvbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4dGVudFswXSAhPSBtaW4gfHwgZXh0ZW50WzFdICE9IG1heCkge1xuICAgICAgICAgIGlmIChpKSB5RXh0ZW50RG9tYWluID0gbnVsbDsgZWxzZSB4RXh0ZW50RG9tYWluID0gbnVsbDtcbiAgICAgICAgICBleHRlbnRbMF0gPSBtaW47XG4gICAgICAgICAgZXh0ZW50WzFdID0gbWF4O1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBicnVzaGVuZCgpIHtcbiAgICAgICAgYnJ1c2htb3ZlKCk7XG4gICAgICAgIGcuc3R5bGUoXCJwb2ludGVyLWV2ZW50c1wiLCBcImFsbFwiKS5zZWxlY3RBbGwoXCIucmVzaXplXCIpLnN0eWxlKFwiZGlzcGxheVwiLCBicnVzaC5lbXB0eSgpID8gXCJub25lXCIgOiBudWxsKTtcbiAgICAgICAgZDMuc2VsZWN0KFwiYm9keVwiKS5zdHlsZShcImN1cnNvclwiLCBudWxsKTtcbiAgICAgICAgdy5vbihcIm1vdXNlbW92ZS5icnVzaFwiLCBudWxsKS5vbihcIm1vdXNldXAuYnJ1c2hcIiwgbnVsbCkub24oXCJ0b3VjaG1vdmUuYnJ1c2hcIiwgbnVsbCkub24oXCJ0b3VjaGVuZC5icnVzaFwiLCBudWxsKS5vbihcImtleWRvd24uYnJ1c2hcIiwgbnVsbCkub24oXCJrZXl1cC5icnVzaFwiLCBudWxsKTtcbiAgICAgICAgZHJhZ1Jlc3RvcmUoKTtcbiAgICAgICAgZXZlbnRfKHtcbiAgICAgICAgICB0eXBlOiBcImJydXNoZW5kXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGJydXNoLnggPSBmdW5jdGlvbih6KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4O1xuICAgICAgeCA9IHo7XG4gICAgICByZXNpemVzID0gZDNfc3ZnX2JydXNoUmVzaXplc1sheCA8PCAxIHwgIXldO1xuICAgICAgcmV0dXJuIGJydXNoO1xuICAgIH07XG4gICAgYnJ1c2gueSA9IGZ1bmN0aW9uKHopIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHk7XG4gICAgICB5ID0gejtcbiAgICAgIHJlc2l6ZXMgPSBkM19zdmdfYnJ1c2hSZXNpemVzWyF4IDw8IDEgfCAheV07XG4gICAgICByZXR1cm4gYnJ1c2g7XG4gICAgfTtcbiAgICBicnVzaC5jbGFtcCA9IGZ1bmN0aW9uKHopIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHggJiYgeSA/IFsgeENsYW1wLCB5Q2xhbXAgXSA6IHggPyB4Q2xhbXAgOiB5ID8geUNsYW1wIDogbnVsbDtcbiAgICAgIGlmICh4ICYmIHkpIHhDbGFtcCA9ICEhelswXSwgeUNsYW1wID0gISF6WzFdOyBlbHNlIGlmICh4KSB4Q2xhbXAgPSAhIXo7IGVsc2UgaWYgKHkpIHlDbGFtcCA9ICEhejtcbiAgICAgIHJldHVybiBicnVzaDtcbiAgICB9O1xuICAgIGJydXNoLmV4dGVudCA9IGZ1bmN0aW9uKHopIHtcbiAgICAgIHZhciB4MCwgeDEsIHkwLCB5MSwgdDtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICBpZiAoeCkge1xuICAgICAgICAgIGlmICh4RXh0ZW50RG9tYWluKSB7XG4gICAgICAgICAgICB4MCA9IHhFeHRlbnREb21haW5bMF0sIHgxID0geEV4dGVudERvbWFpblsxXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeDAgPSB4RXh0ZW50WzBdLCB4MSA9IHhFeHRlbnRbMV07XG4gICAgICAgICAgICBpZiAoeC5pbnZlcnQpIHgwID0geC5pbnZlcnQoeDApLCB4MSA9IHguaW52ZXJ0KHgxKTtcbiAgICAgICAgICAgIGlmICh4MSA8IHgwKSB0ID0geDAsIHgwID0geDEsIHgxID0gdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHkpIHtcbiAgICAgICAgICBpZiAoeUV4dGVudERvbWFpbikge1xuICAgICAgICAgICAgeTAgPSB5RXh0ZW50RG9tYWluWzBdLCB5MSA9IHlFeHRlbnREb21haW5bMV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHkwID0geUV4dGVudFswXSwgeTEgPSB5RXh0ZW50WzFdO1xuICAgICAgICAgICAgaWYgKHkuaW52ZXJ0KSB5MCA9IHkuaW52ZXJ0KHkwKSwgeTEgPSB5LmludmVydCh5MSk7XG4gICAgICAgICAgICBpZiAoeTEgPCB5MCkgdCA9IHkwLCB5MCA9IHkxLCB5MSA9IHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4ICYmIHkgPyBbIFsgeDAsIHkwIF0sIFsgeDEsIHkxIF0gXSA6IHggPyBbIHgwLCB4MSBdIDogeSAmJiBbIHkwLCB5MSBdO1xuICAgICAgfVxuICAgICAgaWYgKHgpIHtcbiAgICAgICAgeDAgPSB6WzBdLCB4MSA9IHpbMV07XG4gICAgICAgIGlmICh5KSB4MCA9IHgwWzBdLCB4MSA9IHgxWzBdO1xuICAgICAgICB4RXh0ZW50RG9tYWluID0gWyB4MCwgeDEgXTtcbiAgICAgICAgaWYgKHguaW52ZXJ0KSB4MCA9IHgoeDApLCB4MSA9IHgoeDEpO1xuICAgICAgICBpZiAoeDEgPCB4MCkgdCA9IHgwLCB4MCA9IHgxLCB4MSA9IHQ7XG4gICAgICAgIGlmICh4MCAhPSB4RXh0ZW50WzBdIHx8IHgxICE9IHhFeHRlbnRbMV0pIHhFeHRlbnQgPSBbIHgwLCB4MSBdO1xuICAgICAgfVxuICAgICAgaWYgKHkpIHtcbiAgICAgICAgeTAgPSB6WzBdLCB5MSA9IHpbMV07XG4gICAgICAgIGlmICh4KSB5MCA9IHkwWzFdLCB5MSA9IHkxWzFdO1xuICAgICAgICB5RXh0ZW50RG9tYWluID0gWyB5MCwgeTEgXTtcbiAgICAgICAgaWYgKHkuaW52ZXJ0KSB5MCA9IHkoeTApLCB5MSA9IHkoeTEpO1xuICAgICAgICBpZiAoeTEgPCB5MCkgdCA9IHkwLCB5MCA9IHkxLCB5MSA9IHQ7XG4gICAgICAgIGlmICh5MCAhPSB5RXh0ZW50WzBdIHx8IHkxICE9IHlFeHRlbnRbMV0pIHlFeHRlbnQgPSBbIHkwLCB5MSBdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJydXNoO1xuICAgIH07XG4gICAgYnJ1c2guY2xlYXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghYnJ1c2guZW1wdHkoKSkge1xuICAgICAgICB4RXh0ZW50ID0gWyAwLCAwIF0sIHlFeHRlbnQgPSBbIDAsIDAgXTtcbiAgICAgICAgeEV4dGVudERvbWFpbiA9IHlFeHRlbnREb21haW4gPSBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJydXNoO1xuICAgIH07XG4gICAgYnJ1c2guZW1wdHkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAhIXggJiYgeEV4dGVudFswXSA9PSB4RXh0ZW50WzFdIHx8ICEheSAmJiB5RXh0ZW50WzBdID09IHlFeHRlbnRbMV07XG4gICAgfTtcbiAgICByZXR1cm4gZDMucmViaW5kKGJydXNoLCBldmVudCwgXCJvblwiKTtcbiAgfTtcbiAgdmFyIGQzX3N2Z19icnVzaEN1cnNvciA9IHtcbiAgICBuOiBcIm5zLXJlc2l6ZVwiLFxuICAgIGU6IFwiZXctcmVzaXplXCIsXG4gICAgczogXCJucy1yZXNpemVcIixcbiAgICB3OiBcImV3LXJlc2l6ZVwiLFxuICAgIG53OiBcIm53c2UtcmVzaXplXCIsXG4gICAgbmU6IFwibmVzdy1yZXNpemVcIixcbiAgICBzZTogXCJud3NlLXJlc2l6ZVwiLFxuICAgIHN3OiBcIm5lc3ctcmVzaXplXCJcbiAgfTtcbiAgdmFyIGQzX3N2Z19icnVzaFJlc2l6ZXMgPSBbIFsgXCJuXCIsIFwiZVwiLCBcInNcIiwgXCJ3XCIsIFwibndcIiwgXCJuZVwiLCBcInNlXCIsIFwic3dcIiBdLCBbIFwiZVwiLCBcIndcIiBdLCBbIFwiblwiLCBcInNcIiBdLCBbXSBdO1xuICB2YXIgZDNfdGltZV9mb3JtYXQgPSBkM190aW1lLmZvcm1hdCA9IGQzX2xvY2FsZV9lblVTLnRpbWVGb3JtYXQ7XG4gIHZhciBkM190aW1lX2Zvcm1hdFV0YyA9IGQzX3RpbWVfZm9ybWF0LnV0YztcbiAgdmFyIGQzX3RpbWVfZm9ybWF0SXNvID0gZDNfdGltZV9mb3JtYXRVdGMoXCIlWS0lbS0lZFQlSDolTTolUy4lTFpcIik7XG4gIGQzX3RpbWVfZm9ybWF0LmlzbyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nICYmICtuZXcgRGF0ZShcIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWlwiKSA/IGQzX3RpbWVfZm9ybWF0SXNvTmF0aXZlIDogZDNfdGltZV9mb3JtYXRJc287XG4gIGZ1bmN0aW9uIGQzX3RpbWVfZm9ybWF0SXNvTmF0aXZlKGRhdGUpIHtcbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpO1xuICB9XG4gIGQzX3RpbWVfZm9ybWF0SXNvTmF0aXZlLnBhcnNlID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzdHJpbmcpO1xuICAgIHJldHVybiBpc05hTihkYXRlKSA/IG51bGwgOiBkYXRlO1xuICB9O1xuICBkM190aW1lX2Zvcm1hdElzb05hdGl2ZS50b1N0cmluZyA9IGQzX3RpbWVfZm9ybWF0SXNvLnRvU3RyaW5nO1xuICBkM190aW1lLnNlY29uZCA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICAgIHJldHVybiBuZXcgZDNfZGF0ZShNYXRoLmZsb29yKGRhdGUgLyAxZTMpICogMWUzKTtcbiAgfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7XG4gICAgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpICsgTWF0aC5mbG9vcihvZmZzZXQpICogMWUzKTtcbiAgfSwgZnVuY3Rpb24oZGF0ZSkge1xuICAgIHJldHVybiBkYXRlLmdldFNlY29uZHMoKTtcbiAgfSk7XG4gIGQzX3RpbWUuc2Vjb25kcyA9IGQzX3RpbWUuc2Vjb25kLnJhbmdlO1xuICBkM190aW1lLnNlY29uZHMudXRjID0gZDNfdGltZS5zZWNvbmQudXRjLnJhbmdlO1xuICBkM190aW1lLm1pbnV0ZSA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICAgIHJldHVybiBuZXcgZDNfZGF0ZShNYXRoLmZsb29yKGRhdGUgLyA2ZTQpICogNmU0KTtcbiAgfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7XG4gICAgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpICsgTWF0aC5mbG9vcihvZmZzZXQpICogNmU0KTtcbiAgfSwgZnVuY3Rpb24oZGF0ZSkge1xuICAgIHJldHVybiBkYXRlLmdldE1pbnV0ZXMoKTtcbiAgfSk7XG4gIGQzX3RpbWUubWludXRlcyA9IGQzX3RpbWUubWludXRlLnJhbmdlO1xuICBkM190aW1lLm1pbnV0ZXMudXRjID0gZDNfdGltZS5taW51dGUudXRjLnJhbmdlO1xuICBkM190aW1lLmhvdXIgPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgICB2YXIgdGltZXpvbmUgPSBkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgLyA2MDtcbiAgICByZXR1cm4gbmV3IGQzX2RhdGUoKE1hdGguZmxvb3IoZGF0ZSAvIDM2ZTUgLSB0aW1lem9uZSkgKyB0aW1lem9uZSkgKiAzNmU1KTtcbiAgfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7XG4gICAgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpICsgTWF0aC5mbG9vcihvZmZzZXQpICogMzZlNSk7XG4gIH0sIGZ1bmN0aW9uKGRhdGUpIHtcbiAgICByZXR1cm4gZGF0ZS5nZXRIb3VycygpO1xuICB9KTtcbiAgZDNfdGltZS5ob3VycyA9IGQzX3RpbWUuaG91ci5yYW5nZTtcbiAgZDNfdGltZS5ob3Vycy51dGMgPSBkM190aW1lLmhvdXIudXRjLnJhbmdlO1xuICBkM190aW1lLm1vbnRoID0gZDNfdGltZV9pbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XG4gICAgZGF0ZSA9IGQzX3RpbWUuZGF5KGRhdGUpO1xuICAgIGRhdGUuc2V0RGF0ZSgxKTtcbiAgICByZXR1cm4gZGF0ZTtcbiAgfSwgZnVuY3Rpb24oZGF0ZSwgb2Zmc2V0KSB7XG4gICAgZGF0ZS5zZXRNb250aChkYXRlLmdldE1vbnRoKCkgKyBvZmZzZXQpO1xuICB9LCBmdW5jdGlvbihkYXRlKSB7XG4gICAgcmV0dXJuIGRhdGUuZ2V0TW9udGgoKTtcbiAgfSk7XG4gIGQzX3RpbWUubW9udGhzID0gZDNfdGltZS5tb250aC5yYW5nZTtcbiAgZDNfdGltZS5tb250aHMudXRjID0gZDNfdGltZS5tb250aC51dGMucmFuZ2U7XG4gIGZ1bmN0aW9uIGQzX3RpbWVfc2NhbGUobGluZWFyLCBtZXRob2RzLCBmb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBzY2FsZSh4KSB7XG4gICAgICByZXR1cm4gbGluZWFyKHgpO1xuICAgIH1cbiAgICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gZDNfdGltZV9zY2FsZURhdGUobGluZWFyLmludmVydCh4KSk7XG4gICAgfTtcbiAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsaW5lYXIuZG9tYWluKCkubWFwKGQzX3RpbWVfc2NhbGVEYXRlKTtcbiAgICAgIGxpbmVhci5kb21haW4oeCk7XG4gICAgICByZXR1cm4gc2NhbGU7XG4gICAgfTtcbiAgICBmdW5jdGlvbiB0aWNrTWV0aG9kKGV4dGVudCwgY291bnQpIHtcbiAgICAgIHZhciBzcGFuID0gZXh0ZW50WzFdIC0gZXh0ZW50WzBdLCB0YXJnZXQgPSBzcGFuIC8gY291bnQsIGkgPSBkMy5iaXNlY3QoZDNfdGltZV9zY2FsZVN0ZXBzLCB0YXJnZXQpO1xuICAgICAgcmV0dXJuIGkgPT0gZDNfdGltZV9zY2FsZVN0ZXBzLmxlbmd0aCA/IFsgbWV0aG9kcy55ZWFyLCBkM19zY2FsZV9saW5lYXJUaWNrUmFuZ2UoZXh0ZW50Lm1hcChmdW5jdGlvbihkKSB7XG4gICAgICAgIHJldHVybiBkIC8gMzE1MzZlNjtcbiAgICAgIH0pLCBjb3VudClbMl0gXSA6ICFpID8gWyBkM190aW1lX3NjYWxlTWlsbGlzZWNvbmRzLCBkM19zY2FsZV9saW5lYXJUaWNrUmFuZ2UoZXh0ZW50LCBjb3VudClbMl0gXSA6IG1ldGhvZHNbdGFyZ2V0IC8gZDNfdGltZV9zY2FsZVN0ZXBzW2kgLSAxXSA8IGQzX3RpbWVfc2NhbGVTdGVwc1tpXSAvIHRhcmdldCA/IGkgLSAxIDogaV07XG4gICAgfVxuICAgIHNjYWxlLm5pY2UgPSBmdW5jdGlvbihpbnRlcnZhbCwgc2tpcCkge1xuICAgICAgdmFyIGRvbWFpbiA9IHNjYWxlLmRvbWFpbigpLCBleHRlbnQgPSBkM19zY2FsZUV4dGVudChkb21haW4pLCBtZXRob2QgPSBpbnRlcnZhbCA9PSBudWxsID8gdGlja01ldGhvZChleHRlbnQsIDEwKSA6IHR5cGVvZiBpbnRlcnZhbCA9PT0gXCJudW1iZXJcIiAmJiB0aWNrTWV0aG9kKGV4dGVudCwgaW50ZXJ2YWwpO1xuICAgICAgaWYgKG1ldGhvZCkgaW50ZXJ2YWwgPSBtZXRob2RbMF0sIHNraXAgPSBtZXRob2RbMV07XG4gICAgICBmdW5jdGlvbiBza2lwcGVkKGRhdGUpIHtcbiAgICAgICAgcmV0dXJuICFpc05hTihkYXRlKSAmJiAhaW50ZXJ2YWwucmFuZ2UoZGF0ZSwgZDNfdGltZV9zY2FsZURhdGUoK2RhdGUgKyAxKSwgc2tpcCkubGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNjYWxlLmRvbWFpbihkM19zY2FsZV9uaWNlKGRvbWFpbiwgc2tpcCA+IDEgPyB7XG4gICAgICAgIGZsb29yOiBmdW5jdGlvbihkYXRlKSB7XG4gICAgICAgICAgd2hpbGUgKHNraXBwZWQoZGF0ZSA9IGludGVydmFsLmZsb29yKGRhdGUpKSkgZGF0ZSA9IGQzX3RpbWVfc2NhbGVEYXRlKGRhdGUgLSAxKTtcbiAgICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2VpbDogZnVuY3Rpb24oZGF0ZSkge1xuICAgICAgICAgIHdoaWxlIChza2lwcGVkKGRhdGUgPSBpbnRlcnZhbC5jZWlsKGRhdGUpKSkgZGF0ZSA9IGQzX3RpbWVfc2NhbGVEYXRlKCtkYXRlICsgMSk7XG4gICAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgICAgIH1cbiAgICAgIH0gOiBpbnRlcnZhbCkpO1xuICAgIH07XG4gICAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihpbnRlcnZhbCwgc2tpcCkge1xuICAgICAgdmFyIGV4dGVudCA9IGQzX3NjYWxlRXh0ZW50KHNjYWxlLmRvbWFpbigpKSwgbWV0aG9kID0gaW50ZXJ2YWwgPT0gbnVsbCA/IHRpY2tNZXRob2QoZXh0ZW50LCAxMCkgOiB0eXBlb2YgaW50ZXJ2YWwgPT09IFwibnVtYmVyXCIgPyB0aWNrTWV0aG9kKGV4dGVudCwgaW50ZXJ2YWwpIDogIWludGVydmFsLnJhbmdlICYmIFsge1xuICAgICAgICByYW5nZTogaW50ZXJ2YWxcbiAgICAgIH0sIHNraXAgXTtcbiAgICAgIGlmIChtZXRob2QpIGludGVydmFsID0gbWV0aG9kWzBdLCBza2lwID0gbWV0aG9kWzFdO1xuICAgICAgcmV0dXJuIGludGVydmFsLnJhbmdlKGV4dGVudFswXSwgZDNfdGltZV9zY2FsZURhdGUoK2V4dGVudFsxXSArIDEpLCBza2lwIDwgMSA/IDEgOiBza2lwKTtcbiAgICB9O1xuICAgIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgfTtcbiAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZDNfdGltZV9zY2FsZShsaW5lYXIuY29weSgpLCBtZXRob2RzLCBmb3JtYXQpO1xuICAgIH07XG4gICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclJlYmluZChzY2FsZSwgbGluZWFyKTtcbiAgfVxuICBmdW5jdGlvbiBkM190aW1lX3NjYWxlRGF0ZSh0KSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHQpO1xuICB9XG4gIHZhciBkM190aW1lX3NjYWxlU3RlcHMgPSBbIDFlMywgNWUzLCAxNWUzLCAzZTQsIDZlNCwgM2U1LCA5ZTUsIDE4ZTUsIDM2ZTUsIDEwOGU1LCAyMTZlNSwgNDMyZTUsIDg2NGU1LCAxNzI4ZTUsIDYwNDhlNSwgMjU5MmU2LCA3Nzc2ZTYsIDMxNTM2ZTYgXTtcbiAgdmFyIGQzX3RpbWVfc2NhbGVMb2NhbE1ldGhvZHMgPSBbIFsgZDNfdGltZS5zZWNvbmQsIDEgXSwgWyBkM190aW1lLnNlY29uZCwgNSBdLCBbIGQzX3RpbWUuc2Vjb25kLCAxNSBdLCBbIGQzX3RpbWUuc2Vjb25kLCAzMCBdLCBbIGQzX3RpbWUubWludXRlLCAxIF0sIFsgZDNfdGltZS5taW51dGUsIDUgXSwgWyBkM190aW1lLm1pbnV0ZSwgMTUgXSwgWyBkM190aW1lLm1pbnV0ZSwgMzAgXSwgWyBkM190aW1lLmhvdXIsIDEgXSwgWyBkM190aW1lLmhvdXIsIDMgXSwgWyBkM190aW1lLmhvdXIsIDYgXSwgWyBkM190aW1lLmhvdXIsIDEyIF0sIFsgZDNfdGltZS5kYXksIDEgXSwgWyBkM190aW1lLmRheSwgMiBdLCBbIGQzX3RpbWUud2VlaywgMSBdLCBbIGQzX3RpbWUubW9udGgsIDEgXSwgWyBkM190aW1lLm1vbnRoLCAzIF0sIFsgZDNfdGltZS55ZWFyLCAxIF0gXTtcbiAgdmFyIGQzX3RpbWVfc2NhbGVMb2NhbEZvcm1hdCA9IGQzX3RpbWVfZm9ybWF0Lm11bHRpKFsgWyBcIi4lTFwiLCBmdW5jdGlvbihkKSB7XG4gICAgcmV0dXJuIGQuZ2V0TWlsbGlzZWNvbmRzKCk7XG4gIH0gXSwgWyBcIjolU1wiLCBmdW5jdGlvbihkKSB7XG4gICAgcmV0dXJuIGQuZ2V0U2Vjb25kcygpO1xuICB9IF0sIFsgXCIlSTolTVwiLCBmdW5jdGlvbihkKSB7XG4gICAgcmV0dXJuIGQuZ2V0TWludXRlcygpO1xuICB9IF0sIFsgXCIlSSAlcFwiLCBmdW5jdGlvbihkKSB7XG4gICAgcmV0dXJuIGQuZ2V0SG91cnMoKTtcbiAgfSBdLCBbIFwiJWEgJWRcIiwgZnVuY3Rpb24oZCkge1xuICAgIHJldHVybiBkLmdldERheSgpICYmIGQuZ2V0RGF0ZSgpICE9IDE7XG4gIH0gXSwgWyBcIiViICVkXCIsIGZ1bmN0aW9uKGQpIHtcbiAgICByZXR1cm4gZC5nZXREYXRlKCkgIT0gMTtcbiAgfSBdLCBbIFwiJUJcIiwgZnVuY3Rpb24oZCkge1xuICAgIHJldHVybiBkLmdldE1vbnRoKCk7XG4gIH0gXSwgWyBcIiVZXCIsIGQzX3RydWUgXSBdKTtcbiAgdmFyIGQzX3RpbWVfc2NhbGVNaWxsaXNlY29uZHMgPSB7XG4gICAgcmFuZ2U6IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBzdGVwKSB7XG4gICAgICByZXR1cm4gZDMucmFuZ2UoTWF0aC5jZWlsKHN0YXJ0IC8gc3RlcCkgKiBzdGVwLCArc3RvcCwgc3RlcCkubWFwKGQzX3RpbWVfc2NhbGVEYXRlKTtcbiAgICB9LFxuICAgIGZsb29yOiBkM19pZGVudGl0eSxcbiAgICBjZWlsOiBkM19pZGVudGl0eVxuICB9O1xuICBkM190aW1lX3NjYWxlTG9jYWxNZXRob2RzLnllYXIgPSBkM190aW1lLnllYXI7XG4gIGQzX3RpbWUuc2NhbGUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDNfdGltZV9zY2FsZShkMy5zY2FsZS5saW5lYXIoKSwgZDNfdGltZV9zY2FsZUxvY2FsTWV0aG9kcywgZDNfdGltZV9zY2FsZUxvY2FsRm9ybWF0KTtcbiAgfTtcbiAgdmFyIGQzX3RpbWVfc2NhbGVVdGNNZXRob2RzID0gZDNfdGltZV9zY2FsZUxvY2FsTWV0aG9kcy5tYXAoZnVuY3Rpb24obSkge1xuICAgIHJldHVybiBbIG1bMF0udXRjLCBtWzFdIF07XG4gIH0pO1xuICB2YXIgZDNfdGltZV9zY2FsZVV0Y0Zvcm1hdCA9IGQzX3RpbWVfZm9ybWF0VXRjLm11bHRpKFsgWyBcIi4lTFwiLCBmdW5jdGlvbihkKSB7XG4gICAgcmV0dXJuIGQuZ2V0VVRDTWlsbGlzZWNvbmRzKCk7XG4gIH0gXSwgWyBcIjolU1wiLCBmdW5jdGlvbihkKSB7XG4gICAgcmV0dXJuIGQuZ2V0VVRDU2Vjb25kcygpO1xuICB9IF0sIFsgXCIlSTolTVwiLCBmdW5jdGlvbihkKSB7XG4gICAgcmV0dXJuIGQuZ2V0VVRDTWludXRlcygpO1xuICB9IF0sIFsgXCIlSSAlcFwiLCBmdW5jdGlvbihkKSB7XG4gICAgcmV0dXJuIGQuZ2V0VVRDSG91cnMoKTtcbiAgfSBdLCBbIFwiJWEgJWRcIiwgZnVuY3Rpb24oZCkge1xuICAgIHJldHVybiBkLmdldFVUQ0RheSgpICYmIGQuZ2V0VVRDRGF0ZSgpICE9IDE7XG4gIH0gXSwgWyBcIiViICVkXCIsIGZ1bmN0aW9uKGQpIHtcbiAgICByZXR1cm4gZC5nZXRVVENEYXRlKCkgIT0gMTtcbiAgfSBdLCBbIFwiJUJcIiwgZnVuY3Rpb24oZCkge1xuICAgIHJldHVybiBkLmdldFVUQ01vbnRoKCk7XG4gIH0gXSwgWyBcIiVZXCIsIGQzX3RydWUgXSBdKTtcbiAgZDNfdGltZV9zY2FsZVV0Y01ldGhvZHMueWVhciA9IGQzX3RpbWUueWVhci51dGM7XG4gIGQzX3RpbWUuc2NhbGUudXRjID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzX3RpbWVfc2NhbGUoZDMuc2NhbGUubGluZWFyKCksIGQzX3RpbWVfc2NhbGVVdGNNZXRob2RzLCBkM190aW1lX3NjYWxlVXRjRm9ybWF0KTtcbiAgfTtcbiAgZDMudGV4dCA9IGQzX3hoclR5cGUoZnVuY3Rpb24ocmVxdWVzdCkge1xuICAgIHJldHVybiByZXF1ZXN0LnJlc3BvbnNlVGV4dDtcbiAgfSk7XG4gIGQzLmpzb24gPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGQzX3hocih1cmwsIFwiYXBwbGljYXRpb24vanNvblwiLCBkM19qc29uLCBjYWxsYmFjayk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2pzb24ocmVxdWVzdCkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKHJlcXVlc3QucmVzcG9uc2VUZXh0KTtcbiAgfVxuICBkMy5odG1sID0gZnVuY3Rpb24odXJsLCBjYWxsYmFjaykge1xuICAgIHJldHVybiBkM194aHIodXJsLCBcInRleHQvaHRtbFwiLCBkM19odG1sLCBjYWxsYmFjayk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2h0bWwocmVxdWVzdCkge1xuICAgIHZhciByYW5nZSA9IGQzX2RvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2VsZWN0Tm9kZShkM19kb2N1bWVudC5ib2R5KTtcbiAgICByZXR1cm4gcmFuZ2UuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHJlcXVlc3QucmVzcG9uc2VUZXh0KTtcbiAgfVxuICBkMy54bWwgPSBkM194aHJUeXBlKGZ1bmN0aW9uKHJlcXVlc3QpIHtcbiAgICByZXR1cm4gcmVxdWVzdC5yZXNwb25zZVhNTDtcbiAgfSk7XG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkgdGhpcy5kMyA9IGQzLCBkZWZpbmUoZDMpOyBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIG1vZHVsZS5leHBvcnRzKSBtb2R1bGUuZXhwb3J0cyA9IGQzOyBlbHNlIHRoaXMuZDMgPSBkMztcbn0oKTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBhY3RpdmVFbGVtZW50O1xuXG52YXIgX293bmVyRG9jdW1lbnQgPSByZXF1aXJlKCcuL293bmVyRG9jdW1lbnQnKTtcblxudmFyIF9vd25lckRvY3VtZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX293bmVyRG9jdW1lbnQpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBhY3RpdmVFbGVtZW50KCkge1xuICB2YXIgZG9jID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAoMCwgX293bmVyRG9jdW1lbnQyLmRlZmF1bHQpKCk7XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gZG9jLmFjdGl2ZUVsZW1lbnQ7XG4gIH0gY2F0Y2ggKGUpIHsvKiBpZSB0aHJvd3MgaWYgbm8gYWN0aXZlIGVsZW1lbnQgKi99XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBhZGRDbGFzcztcblxudmFyIF9oYXNDbGFzcyA9IHJlcXVpcmUoJy4vaGFzQ2xhc3MnKTtcblxudmFyIF9oYXNDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYXNDbGFzcyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIGFkZENsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO2Vsc2UgaWYgKCEoMCwgX2hhc0NsYXNzMi5kZWZhdWx0KShlbGVtZW50KSkgZWxlbWVudC5jbGFzc05hbWUgPSBlbGVtZW50LmNsYXNzTmFtZSArICcgJyArIGNsYXNzTmFtZTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gaGFzQ2xhc3M7XG5mdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpIHtcbiAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0KSByZXR1cm4gISFjbGFzc05hbWUgJiYgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTtlbHNlIHJldHVybiAoXCIgXCIgKyBlbGVtZW50LmNsYXNzTmFtZSArIFwiIFwiKS5pbmRleE9mKFwiIFwiICsgY2xhc3NOYW1lICsgXCIgXCIpICE9PSAtMTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5oYXNDbGFzcyA9IGV4cG9ydHMucmVtb3ZlQ2xhc3MgPSBleHBvcnRzLmFkZENsYXNzID0gdW5kZWZpbmVkO1xuXG52YXIgX2FkZENsYXNzID0gcmVxdWlyZSgnLi9hZGRDbGFzcycpO1xuXG52YXIgX2FkZENsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FkZENsYXNzKTtcblxudmFyIF9yZW1vdmVDbGFzcyA9IHJlcXVpcmUoJy4vcmVtb3ZlQ2xhc3MnKTtcblxudmFyIF9yZW1vdmVDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZW1vdmVDbGFzcyk7XG5cbnZhciBfaGFzQ2xhc3MgPSByZXF1aXJlKCcuL2hhc0NsYXNzJyk7XG5cbnZhciBfaGFzQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaGFzQ2xhc3MpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmFkZENsYXNzID0gX2FkZENsYXNzMi5kZWZhdWx0O1xuZXhwb3J0cy5yZW1vdmVDbGFzcyA9IF9yZW1vdmVDbGFzczIuZGVmYXVsdDtcbmV4cG9ydHMuaGFzQ2xhc3MgPSBfaGFzQ2xhc3MyLmRlZmF1bHQ7XG5leHBvcnRzLmRlZmF1bHQgPSB7IGFkZENsYXNzOiBfYWRkQ2xhc3MyLmRlZmF1bHQsIHJlbW92ZUNsYXNzOiBfcmVtb3ZlQ2xhc3MyLmRlZmF1bHQsIGhhc0NsYXNzOiBfaGFzQ2xhc3MyLmRlZmF1bHQgfTsiLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdCkgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7ZWxzZSBlbGVtZW50LmNsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UobmV3IFJlZ0V4cCgnKF58XFxcXHMpJyArIGNsYXNzTmFtZSArICcoPzpcXFxcc3wkKScsICdnJyksICckMScpLnJlcGxhY2UoL1xccysvZywgJyAnKS5yZXBsYWNlKC9eXFxzKnxcXHMqJC9nLCAnJyk7XG59OyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGZpbHRlckV2ZW50cztcblxudmFyIF9jb250YWlucyA9IHJlcXVpcmUoJy4uL3F1ZXJ5L2NvbnRhaW5zJyk7XG5cbnZhciBfY29udGFpbnMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29udGFpbnMpO1xuXG52YXIgX3F1ZXJ5U2VsZWN0b3JBbGwgPSByZXF1aXJlKCcuLi9xdWVyeS9xdWVyeVNlbGVjdG9yQWxsJyk7XG5cbnZhciBfcXVlcnlTZWxlY3RvckFsbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9xdWVyeVNlbGVjdG9yQWxsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gZmlsdGVyRXZlbnRzKHNlbGVjdG9yLCBoYW5kbGVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmaWx0ZXJIYW5kbGVyKGUpIHtcbiAgICB2YXIgdG9wID0gZS5jdXJyZW50VGFyZ2V0LFxuICAgICAgICB0YXJnZXQgPSBlLnRhcmdldCxcbiAgICAgICAgbWF0Y2hlcyA9ICgwLCBfcXVlcnlTZWxlY3RvckFsbDIuZGVmYXVsdCkodG9wLCBzZWxlY3Rvcik7XG5cbiAgICBpZiAobWF0Y2hlcy5zb21lKGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgcmV0dXJuICgwLCBfY29udGFpbnMyLmRlZmF1bHQpKG1hdGNoLCB0YXJnZXQpO1xuICAgIH0pKSBoYW5kbGVyLmNhbGwodGhpcywgZSk7XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmxpc3RlbiA9IGV4cG9ydHMuZmlsdGVyID0gZXhwb3J0cy5vZmYgPSBleHBvcnRzLm9uID0gdW5kZWZpbmVkO1xuXG52YXIgX29uID0gcmVxdWlyZSgnLi9vbicpO1xuXG52YXIgX29uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29uKTtcblxudmFyIF9vZmYgPSByZXF1aXJlKCcuL29mZicpO1xuXG52YXIgX29mZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vZmYpO1xuXG52YXIgX2ZpbHRlciA9IHJlcXVpcmUoJy4vZmlsdGVyJyk7XG5cbnZhciBfZmlsdGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ZpbHRlcik7XG5cbnZhciBfbGlzdGVuID0gcmVxdWlyZSgnLi9saXN0ZW4nKTtcblxudmFyIF9saXN0ZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbGlzdGVuKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5vbiA9IF9vbjIuZGVmYXVsdDtcbmV4cG9ydHMub2ZmID0gX29mZjIuZGVmYXVsdDtcbmV4cG9ydHMuZmlsdGVyID0gX2ZpbHRlcjIuZGVmYXVsdDtcbmV4cG9ydHMubGlzdGVuID0gX2xpc3RlbjIuZGVmYXVsdDtcbmV4cG9ydHMuZGVmYXVsdCA9IHsgb246IF9vbjIuZGVmYXVsdCwgb2ZmOiBfb2ZmMi5kZWZhdWx0LCBmaWx0ZXI6IF9maWx0ZXIyLmRlZmF1bHQsIGxpc3RlbjogX2xpc3RlbjIuZGVmYXVsdCB9OyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9pbkRPTSA9IHJlcXVpcmUoJy4uL3V0aWwvaW5ET00nKTtcblxudmFyIF9pbkRPTTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbkRPTSk7XG5cbnZhciBfb24gPSByZXF1aXJlKCcuL29uJyk7XG5cbnZhciBfb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb24pO1xuXG52YXIgX29mZiA9IHJlcXVpcmUoJy4vb2ZmJyk7XG5cbnZhciBfb2ZmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29mZik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBsaXN0ZW4gPSBmdW5jdGlvbiBsaXN0ZW4oKSB7fTtcblxuaWYgKF9pbkRPTTIuZGVmYXVsdCkge1xuICBsaXN0ZW4gPSBmdW5jdGlvbiBsaXN0ZW4obm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyLCBjYXB0dXJlKSB7XG4gICAgKDAsIF9vbjIuZGVmYXVsdCkobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyLCBjYXB0dXJlKTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgKDAsIF9vZmYyLmRlZmF1bHQpKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlciwgY2FwdHVyZSk7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gbGlzdGVuO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2luRE9NID0gcmVxdWlyZSgnLi4vdXRpbC9pbkRPTScpO1xuXG52YXIgX2luRE9NMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luRE9NKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIG9mZiA9IGZ1bmN0aW9uIG9mZigpIHt9O1xuaWYgKF9pbkRPTTIuZGVmYXVsdCkge1xuICBvZmYgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHJldHVybiBmdW5jdGlvbiAobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyLCBjYXB0dXJlKSB7XG4gICAgICByZXR1cm4gbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlciwgY2FwdHVyZSB8fCBmYWxzZSk7XG4gICAgfTtlbHNlIGlmIChkb2N1bWVudC5hdHRhY2hFdmVudCkgcmV0dXJuIGZ1bmN0aW9uIChub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHtcbiAgICAgIHJldHVybiBub2RlLmRldGFjaEV2ZW50KCdvbicgKyBldmVudE5hbWUsIGhhbmRsZXIpO1xuICAgIH07XG4gIH0oKTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gb2ZmO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2luRE9NID0gcmVxdWlyZSgnLi4vdXRpbC9pbkRPTScpO1xuXG52YXIgX2luRE9NMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luRE9NKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIG9uID0gZnVuY3Rpb24gb24oKSB7fTtcbmlmIChfaW5ET00yLmRlZmF1bHQpIHtcbiAgb24gPSBmdW5jdGlvbiAoKSB7XG5cbiAgICBpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikgcmV0dXJuIGZ1bmN0aW9uIChub2RlLCBldmVudE5hbWUsIGhhbmRsZXIsIGNhcHR1cmUpIHtcbiAgICAgIHJldHVybiBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyLCBjYXB0dXJlIHx8IGZhbHNlKTtcbiAgICB9O2Vsc2UgaWYgKGRvY3VtZW50LmF0dGFjaEV2ZW50KSByZXR1cm4gZnVuY3Rpb24gKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcikge1xuICAgICAgcmV0dXJuIG5vZGUuYXR0YWNoRXZlbnQoJ29uJyArIGV2ZW50TmFtZSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZSA9IGUgfHwgd2luZG93LmV2ZW50O1xuICAgICAgICBlLnRhcmdldCA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDtcbiAgICAgICAgZS5jdXJyZW50VGFyZ2V0ID0gbm9kZTtcbiAgICAgICAgaGFuZGxlci5jYWxsKG5vZGUsIGUpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfSgpO1xufVxuXG5leHBvcnRzLmRlZmF1bHQgPSBvbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gb3duZXJEb2N1bWVudDtcbmZ1bmN0aW9uIG93bmVyRG9jdW1lbnQobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9pbkRPTSA9IHJlcXVpcmUoJy4uL3V0aWwvaW5ET00nKTtcblxudmFyIF9pbkRPTTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbkRPTSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gSFRNTCBET00gYW5kIFNWRyBET00gbWF5IGhhdmUgZGlmZmVyZW50IHN1cHBvcnQgbGV2ZWxzLFxuICAvLyBzbyB3ZSBuZWVkIHRvIGNoZWNrIG9uIGNvbnRleHQgaW5zdGVhZCBvZiBhIGRvY3VtZW50IHJvb3QgZWxlbWVudC5cbiAgcmV0dXJuIF9pbkRPTTIuZGVmYXVsdCA/IGZ1bmN0aW9uIChjb250ZXh0LCBub2RlKSB7XG4gICAgaWYgKGNvbnRleHQuY29udGFpbnMpIHtcbiAgICAgIHJldHVybiBjb250ZXh0LmNvbnRhaW5zKG5vZGUpO1xuICAgIH0gZWxzZSBpZiAoY29udGV4dC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgICAgcmV0dXJuIGNvbnRleHQgPT09IG5vZGUgfHwgISEoY29udGV4dC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihub2RlKSAmIDE2KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbGxiYWNrKGNvbnRleHQsIG5vZGUpO1xuICAgIH1cbiAgfSA6IGZhbGxiYWNrO1xufSgpO1xuXG5mdW5jdGlvbiBmYWxsYmFjayhjb250ZXh0LCBub2RlKSB7XG4gIGlmIChub2RlKSBkbyB7XG4gICAgaWYgKG5vZGUgPT09IGNvbnRleHQpIHJldHVybiB0cnVlO1xuICB9IHdoaWxlIChub2RlID0gbm9kZS5wYXJlbnROb2RlKTtcblxuICByZXR1cm4gZmFsc2U7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGdldFdpbmRvdztcbmZ1bmN0aW9uIGdldFdpbmRvdyhub2RlKSB7XG4gIHJldHVybiBub2RlID09PSBub2RlLndpbmRvdyA/IG5vZGUgOiBub2RlLm5vZGVUeXBlID09PSA5ID8gbm9kZS5kZWZhdWx0VmlldyB8fCBub2RlLnBhcmVudFdpbmRvdyA6IGZhbHNlO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBvZmZzZXQ7XG5cbnZhciBfY29udGFpbnMgPSByZXF1aXJlKCcuL2NvbnRhaW5zJyk7XG5cbnZhciBfY29udGFpbnMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29udGFpbnMpO1xuXG52YXIgX2lzV2luZG93ID0gcmVxdWlyZSgnLi9pc1dpbmRvdycpO1xuXG52YXIgX2lzV2luZG93MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2lzV2luZG93KTtcblxudmFyIF9vd25lckRvY3VtZW50ID0gcmVxdWlyZSgnLi4vb3duZXJEb2N1bWVudCcpO1xuXG52YXIgX293bmVyRG9jdW1lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb3duZXJEb2N1bWVudCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIG9mZnNldChub2RlKSB7XG4gIHZhciBkb2MgPSAoMCwgX293bmVyRG9jdW1lbnQyLmRlZmF1bHQpKG5vZGUpLFxuICAgICAgd2luID0gKDAsIF9pc1dpbmRvdzIuZGVmYXVsdCkoZG9jKSxcbiAgICAgIGRvY0VsZW0gPSBkb2MgJiYgZG9jLmRvY3VtZW50RWxlbWVudCxcbiAgICAgIGJveCA9IHsgdG9wOiAwLCBsZWZ0OiAwLCBoZWlnaHQ6IDAsIHdpZHRoOiAwIH07XG5cbiAgaWYgKCFkb2MpIHJldHVybjtcblxuICAvLyBNYWtlIHN1cmUgaXQncyBub3QgYSBkaXNjb25uZWN0ZWQgRE9NIG5vZGVcbiAgaWYgKCEoMCwgX2NvbnRhaW5zMi5kZWZhdWx0KShkb2NFbGVtLCBub2RlKSkgcmV0dXJuIGJveDtcblxuICBpZiAobm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgIT09IHVuZGVmaW5lZCkgYm94ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAvLyBJRTggZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGRvZXNuJ3Qgc3VwcG9ydCB3aWR0aCAmIGhlaWdodFxuICBib3ggPSB7XG4gICAgdG9wOiBib3gudG9wICsgKHdpbi5wYWdlWU9mZnNldCB8fCBkb2NFbGVtLnNjcm9sbFRvcCkgLSAoZG9jRWxlbS5jbGllbnRUb3AgfHwgMCksXG4gICAgbGVmdDogYm94LmxlZnQgKyAod2luLnBhZ2VYT2Zmc2V0IHx8IGRvY0VsZW0uc2Nyb2xsTGVmdCkgLSAoZG9jRWxlbS5jbGllbnRMZWZ0IHx8IDApLFxuICAgIHdpZHRoOiAoYm94LndpZHRoID09IG51bGwgPyBub2RlLm9mZnNldFdpZHRoIDogYm94LndpZHRoKSB8fCAwLFxuICAgIGhlaWdodDogKGJveC5oZWlnaHQgPT0gbnVsbCA/IG5vZGUub2Zmc2V0SGVpZ2h0IDogYm94LmhlaWdodCkgfHwgMFxuICB9O1xuXG4gIHJldHVybiBib3g7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBvZmZzZXRQYXJlbnQ7XG5cbnZhciBfb3duZXJEb2N1bWVudCA9IHJlcXVpcmUoJy4uL293bmVyRG9jdW1lbnQnKTtcblxudmFyIF9vd25lckRvY3VtZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX293bmVyRG9jdW1lbnQpO1xuXG52YXIgX3N0eWxlID0gcmVxdWlyZSgnLi4vc3R5bGUnKTtcblxudmFyIF9zdHlsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zdHlsZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIG5vZGVOYW1lKG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUubm9kZU5hbWUgJiYgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xufVxuXG5mdW5jdGlvbiBvZmZzZXRQYXJlbnQobm9kZSkge1xuICB2YXIgZG9jID0gKDAsIF9vd25lckRvY3VtZW50Mi5kZWZhdWx0KShub2RlKSxcbiAgICAgIG9mZnNldFBhcmVudCA9IG5vZGUgJiYgbm9kZS5vZmZzZXRQYXJlbnQ7XG5cbiAgd2hpbGUgKG9mZnNldFBhcmVudCAmJiBub2RlTmFtZShub2RlKSAhPT0gJ2h0bWwnICYmICgwLCBfc3R5bGUyLmRlZmF1bHQpKG9mZnNldFBhcmVudCwgJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnKSB7XG4gICAgb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDtcbiAgfVxuXG4gIHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jLmRvY3VtZW50RWxlbWVudDtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gcG9zaXRpb247XG5cbnZhciBfb2Zmc2V0ID0gcmVxdWlyZSgnLi9vZmZzZXQnKTtcblxudmFyIF9vZmZzZXQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2Zmc2V0KTtcblxudmFyIF9vZmZzZXRQYXJlbnQgPSByZXF1aXJlKCcuL29mZnNldFBhcmVudCcpO1xuXG52YXIgX29mZnNldFBhcmVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vZmZzZXRQYXJlbnQpO1xuXG52YXIgX3Njcm9sbFRvcCA9IHJlcXVpcmUoJy4vc2Nyb2xsVG9wJyk7XG5cbnZhciBfc2Nyb2xsVG9wMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Njcm9sbFRvcCk7XG5cbnZhciBfc2Nyb2xsTGVmdCA9IHJlcXVpcmUoJy4vc2Nyb2xsTGVmdCcpO1xuXG52YXIgX3Njcm9sbExlZnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2Nyb2xsTGVmdCk7XG5cbnZhciBfc3R5bGUgPSByZXF1aXJlKCcuLi9zdHlsZScpO1xuXG52YXIgX3N0eWxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N0eWxlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gbm9kZU5hbWUobm9kZSkge1xuICByZXR1cm4gbm9kZS5ub2RlTmFtZSAmJiBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIHBvc2l0aW9uKG5vZGUsIG9mZnNldFBhcmVudCkge1xuICB2YXIgcGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfSxcbiAgICAgIG9mZnNldDtcblxuICAvLyBGaXhlZCBlbGVtZW50cyBhcmUgb2Zmc2V0IGZyb20gd2luZG93IChwYXJlbnRPZmZzZXQgPSB7dG9wOjAsIGxlZnQ6IDB9LFxuICAvLyBiZWNhdXNlIGl0IGlzIGl0cyBvbmx5IG9mZnNldCBwYXJlbnRcbiAgaWYgKCgwLCBfc3R5bGUyLmRlZmF1bHQpKG5vZGUsICdwb3NpdGlvbicpID09PSAnZml4ZWQnKSB7XG4gICAgb2Zmc2V0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgfSBlbHNlIHtcbiAgICBvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQgfHwgKDAsIF9vZmZzZXRQYXJlbnQyLmRlZmF1bHQpKG5vZGUpO1xuICAgIG9mZnNldCA9ICgwLCBfb2Zmc2V0Mi5kZWZhdWx0KShub2RlKTtcblxuICAgIGlmIChub2RlTmFtZShvZmZzZXRQYXJlbnQpICE9PSAnaHRtbCcpIHBhcmVudE9mZnNldCA9ICgwLCBfb2Zmc2V0Mi5kZWZhdWx0KShvZmZzZXRQYXJlbnQpO1xuXG4gICAgcGFyZW50T2Zmc2V0LnRvcCArPSBwYXJzZUludCgoMCwgX3N0eWxlMi5kZWZhdWx0KShvZmZzZXRQYXJlbnQsICdib3JkZXJUb3BXaWR0aCcpLCAxMCkgLSAoMCwgX3Njcm9sbFRvcDIuZGVmYXVsdCkob2Zmc2V0UGFyZW50KSB8fCAwO1xuICAgIHBhcmVudE9mZnNldC5sZWZ0ICs9IHBhcnNlSW50KCgwLCBfc3R5bGUyLmRlZmF1bHQpKG9mZnNldFBhcmVudCwgJ2JvcmRlckxlZnRXaWR0aCcpLCAxMCkgLSAoMCwgX3Njcm9sbExlZnQyLmRlZmF1bHQpKG9mZnNldFBhcmVudCkgfHwgMDtcbiAgfVxuXG4gIC8vIFN1YnRyYWN0IHBhcmVudCBvZmZzZXRzIGFuZCBub2RlIG1hcmdpbnNcbiAgcmV0dXJuIF9leHRlbmRzKHt9LCBvZmZzZXQsIHtcbiAgICB0b3A6IG9mZnNldC50b3AgLSBwYXJlbnRPZmZzZXQudG9wIC0gKHBhcnNlSW50KCgwLCBfc3R5bGUyLmRlZmF1bHQpKG5vZGUsICdtYXJnaW5Ub3AnKSwgMTApIHx8IDApLFxuICAgIGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSAocGFyc2VJbnQoKDAsIF9zdHlsZTIuZGVmYXVsdCkobm9kZSwgJ21hcmdpbkxlZnQnKSwgMTApIHx8IDApXG4gIH0pO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gcXNhO1xuLy8gWmVwdG8uanNcbi8vIChjKSAyMDEwLTIwMTUgVGhvbWFzIEZ1Y2hzXG4vLyBaZXB0by5qcyBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbnZhciBzaW1wbGVTZWxlY3RvclJFID0gL15bXFx3LV0qJC87XG52YXIgdG9BcnJheSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmNhbGwoRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwsIFtdLnNsaWNlKTtcblxuZnVuY3Rpb24gcXNhKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gIHZhciBtYXliZUlEID0gc2VsZWN0b3JbMF0gPT09ICcjJyxcbiAgICAgIG1heWJlQ2xhc3MgPSBzZWxlY3RvclswXSA9PT0gJy4nLFxuICAgICAgbmFtZU9ubHkgPSBtYXliZUlEIHx8IG1heWJlQ2xhc3MgPyBzZWxlY3Rvci5zbGljZSgxKSA6IHNlbGVjdG9yLFxuICAgICAgaXNTaW1wbGUgPSBzaW1wbGVTZWxlY3RvclJFLnRlc3QobmFtZU9ubHkpLFxuICAgICAgZm91bmQ7XG5cbiAgaWYgKGlzU2ltcGxlKSB7XG4gICAgaWYgKG1heWJlSUQpIHtcbiAgICAgIGVsZW1lbnQgPSBlbGVtZW50LmdldEVsZW1lbnRCeUlkID8gZWxlbWVudCA6IGRvY3VtZW50O1xuICAgICAgcmV0dXJuIChmb3VuZCA9IGVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQobmFtZU9ubHkpKSA/IFtmb3VuZF0gOiBbXTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIG1heWJlQ2xhc3MpIHJldHVybiB0b0FycmF5KGVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShuYW1lT25seSkpO1xuXG4gICAgcmV0dXJuIHRvQXJyYXkoZWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShzZWxlY3RvcikpO1xuICB9XG5cbiAgcmV0dXJuIHRvQXJyYXkoZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBzY3JvbGxUb3A7XG5cbnZhciBfaXNXaW5kb3cgPSByZXF1aXJlKCcuL2lzV2luZG93Jyk7XG5cbnZhciBfaXNXaW5kb3cyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNXaW5kb3cpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBzY3JvbGxUb3Aobm9kZSwgdmFsKSB7XG4gIHZhciB3aW4gPSAoMCwgX2lzV2luZG93Mi5kZWZhdWx0KShub2RlKTtcblxuICBpZiAodmFsID09PSB1bmRlZmluZWQpIHJldHVybiB3aW4gPyAncGFnZVhPZmZzZXQnIGluIHdpbiA/IHdpbi5wYWdlWE9mZnNldCA6IHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCA6IG5vZGUuc2Nyb2xsTGVmdDtcblxuICBpZiAod2luKSB3aW4uc2Nyb2xsVG8odmFsLCAncGFnZVlPZmZzZXQnIGluIHdpbiA/IHdpbi5wYWdlWU9mZnNldCA6IHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wKTtlbHNlIG5vZGUuc2Nyb2xsTGVmdCA9IHZhbDtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHNjcm9sbFRvcDtcblxudmFyIF9pc1dpbmRvdyA9IHJlcXVpcmUoJy4vaXNXaW5kb3cnKTtcblxudmFyIF9pc1dpbmRvdzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pc1dpbmRvdyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIHNjcm9sbFRvcChub2RlLCB2YWwpIHtcbiAgdmFyIHdpbiA9ICgwLCBfaXNXaW5kb3cyLmRlZmF1bHQpKG5vZGUpO1xuXG4gIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHdpbiA/ICdwYWdlWU9mZnNldCcgaW4gd2luID8gd2luLnBhZ2VZT2Zmc2V0IDogd2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgOiBub2RlLnNjcm9sbFRvcDtcblxuICBpZiAod2luKSB3aW4uc2Nyb2xsVG8oJ3BhZ2VYT2Zmc2V0JyBpbiB3aW4gPyB3aW4ucGFnZVhPZmZzZXQgOiB3aW4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsIHZhbCk7ZWxzZSBub2RlLnNjcm9sbFRvcCA9IHZhbDtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IF9nZXRDb21wdXRlZFN0eWxlO1xuXG52YXIgX2NhbWVsaXplU3R5bGUgPSByZXF1aXJlKCcuLi91dGlsL2NhbWVsaXplU3R5bGUnKTtcblxudmFyIF9jYW1lbGl6ZVN0eWxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NhbWVsaXplU3R5bGUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgcnBvc2l0aW9uID0gL14odG9wfHJpZ2h0fGJvdHRvbXxsZWZ0KSQvO1xudmFyIHJudW1ub25weCA9IC9eKFsrLV0/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bKy1dP1xcZCt8KSkoPyFweClbYS16JV0rJC9pO1xuXG5mdW5jdGlvbiBfZ2V0Q29tcHV0ZWRTdHlsZShub2RlKSB7XG4gIGlmICghbm9kZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignTm8gRWxlbWVudCBwYXNzZWQgdG8gYGdldENvbXB1dGVkU3R5bGUoKWAnKTtcbiAgdmFyIGRvYyA9IG5vZGUub3duZXJEb2N1bWVudDtcblxuICByZXR1cm4gJ2RlZmF1bHRWaWV3JyBpbiBkb2MgPyBkb2MuZGVmYXVsdFZpZXcub3BlbmVyID8gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCkgOiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKSA6IHtcbiAgICAvL2llIDggXCJtYWdpY1wiIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L2Jsb2IvMS4xMS1zdGFibGUvc3JjL2Nzcy9jdXJDU1MuanMjTDcyXG4gICAgZ2V0UHJvcGVydHlWYWx1ZTogZnVuY3Rpb24gZ2V0UHJvcGVydHlWYWx1ZShwcm9wKSB7XG4gICAgICB2YXIgc3R5bGUgPSBub2RlLnN0eWxlO1xuXG4gICAgICBwcm9wID0gKDAsIF9jYW1lbGl6ZVN0eWxlMi5kZWZhdWx0KShwcm9wKTtcblxuICAgICAgaWYgKHByb3AgPT0gJ2Zsb2F0JykgcHJvcCA9ICdzdHlsZUZsb2F0JztcblxuICAgICAgdmFyIGN1cnJlbnQgPSBub2RlLmN1cnJlbnRTdHlsZVtwcm9wXSB8fCBudWxsO1xuXG4gICAgICBpZiAoY3VycmVudCA9PSBudWxsICYmIHN0eWxlICYmIHN0eWxlW3Byb3BdKSBjdXJyZW50ID0gc3R5bGVbcHJvcF07XG5cbiAgICAgIGlmIChybnVtbm9ucHgudGVzdChjdXJyZW50KSAmJiAhcnBvc2l0aW9uLnRlc3QocHJvcCkpIHtcbiAgICAgICAgLy8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlc1xuICAgICAgICB2YXIgbGVmdCA9IHN0eWxlLmxlZnQ7XG4gICAgICAgIHZhciBydW5TdHlsZSA9IG5vZGUucnVudGltZVN0eWxlO1xuICAgICAgICB2YXIgcnNMZWZ0ID0gcnVuU3R5bGUgJiYgcnVuU3R5bGUubGVmdDtcblxuICAgICAgICAvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XG4gICAgICAgIGlmIChyc0xlZnQpIHJ1blN0eWxlLmxlZnQgPSBub2RlLmN1cnJlbnRTdHlsZS5sZWZ0O1xuXG4gICAgICAgIHN0eWxlLmxlZnQgPSBwcm9wID09PSAnZm9udFNpemUnID8gJzFlbScgOiBjdXJyZW50O1xuICAgICAgICBjdXJyZW50ID0gc3R5bGUucGl4ZWxMZWZ0ICsgJ3B4JztcblxuICAgICAgICAvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzXG4gICAgICAgIHN0eWxlLmxlZnQgPSBsZWZ0O1xuICAgICAgICBpZiAocnNMZWZ0KSBydW5TdHlsZS5sZWZ0ID0gcnNMZWZ0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBzdHlsZTtcblxudmFyIF9jYW1lbGl6ZVN0eWxlID0gcmVxdWlyZSgnLi4vdXRpbC9jYW1lbGl6ZVN0eWxlJyk7XG5cbnZhciBfY2FtZWxpemVTdHlsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jYW1lbGl6ZVN0eWxlKTtcblxudmFyIF9oeXBoZW5hdGVTdHlsZSA9IHJlcXVpcmUoJy4uL3V0aWwvaHlwaGVuYXRlU3R5bGUnKTtcblxudmFyIF9oeXBoZW5hdGVTdHlsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oeXBoZW5hdGVTdHlsZSk7XG5cbnZhciBfZ2V0Q29tcHV0ZWRTdHlsZTIgPSByZXF1aXJlKCcuL2dldENvbXB1dGVkU3R5bGUnKTtcblxudmFyIF9nZXRDb21wdXRlZFN0eWxlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldENvbXB1dGVkU3R5bGUyKTtcblxudmFyIF9yZW1vdmVTdHlsZSA9IHJlcXVpcmUoJy4vcmVtb3ZlU3R5bGUnKTtcblxudmFyIF9yZW1vdmVTdHlsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZW1vdmVTdHlsZSk7XG5cbnZhciBfcHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL3RyYW5zaXRpb24vcHJvcGVydGllcycpO1xuXG52YXIgX2lzVHJhbnNmb3JtID0gcmVxdWlyZSgnLi4vdHJhbnNpdGlvbi9pc1RyYW5zZm9ybScpO1xuXG52YXIgX2lzVHJhbnNmb3JtMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2lzVHJhbnNmb3JtKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gc3R5bGUobm9kZSwgcHJvcGVydHksIHZhbHVlKSB7XG4gIHZhciBjc3MgPSAnJztcbiAgdmFyIHRyYW5zZm9ybXMgPSAnJztcbiAgdmFyIHByb3BzID0gcHJvcGVydHk7XG5cbiAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG5vZGUuc3R5bGVbKDAsIF9jYW1lbGl6ZVN0eWxlMi5kZWZhdWx0KShwcm9wZXJ0eSldIHx8ICgwLCBfZ2V0Q29tcHV0ZWRTdHlsZTMuZGVmYXVsdCkobm9kZSkuZ2V0UHJvcGVydHlWYWx1ZSgoMCwgX2h5cGhlbmF0ZVN0eWxlMi5kZWZhdWx0KShwcm9wZXJ0eSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAocHJvcHMgPSB7fSlbcHJvcGVydHldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciB2YWx1ZSA9IHByb3BzW2tleV07XG4gICAgaWYgKCF2YWx1ZSAmJiB2YWx1ZSAhPT0gMCkge1xuICAgICAgKDAsIF9yZW1vdmVTdHlsZTIuZGVmYXVsdCkobm9kZSwgKDAsIF9oeXBoZW5hdGVTdHlsZTIuZGVmYXVsdCkoa2V5KSk7XG4gICAgfSBlbHNlIGlmICgoMCwgX2lzVHJhbnNmb3JtMi5kZWZhdWx0KShrZXkpKSB7XG4gICAgICB0cmFuc2Zvcm1zICs9IGtleSArICcoJyArIHZhbHVlICsgJykgJztcbiAgICB9IGVsc2Uge1xuICAgICAgY3NzICs9ICgwLCBfaHlwaGVuYXRlU3R5bGUyLmRlZmF1bHQpKGtleSkgKyAnOiAnICsgdmFsdWUgKyAnOyc7XG4gICAgfVxuICB9KTtcblxuICBpZiAodHJhbnNmb3Jtcykge1xuICAgIGNzcyArPSBfcHJvcGVydGllcy50cmFuc2Zvcm0gKyAnOiAnICsgdHJhbnNmb3JtcyArICc7JztcbiAgfVxuXG4gIG5vZGUuc3R5bGUuY3NzVGV4dCArPSAnOycgKyBjc3M7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSByZW1vdmVTdHlsZTtcbmZ1bmN0aW9uIHJlbW92ZVN0eWxlKG5vZGUsIGtleSkge1xuICByZXR1cm4gJ3JlbW92ZVByb3BlcnR5JyBpbiBub2RlLnN0eWxlID8gbm9kZS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShrZXkpIDogbm9kZS5zdHlsZS5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gaXNUcmFuc2Zvcm07XG52YXIgc3VwcG9ydGVkVHJhbnNmb3JtcyA9IC9eKCh0cmFuc2xhdGV8cm90YXRlfHNjYWxlKShYfFl8WnwzZCk/fG1hdHJpeCgzZCk/fHBlcnNwZWN0aXZlfHNrZXcoWHxZKT8pJC9pO1xuXG5mdW5jdGlvbiBpc1RyYW5zZm9ybShwcm9wZXJ0eSkge1xuICByZXR1cm4gISEocHJvcGVydHkgJiYgc3VwcG9ydGVkVHJhbnNmb3Jtcy50ZXN0KHByb3BlcnR5KSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuYW5pbWF0aW9uRW5kID0gZXhwb3J0cy5hbmltYXRpb25EZWxheSA9IGV4cG9ydHMuYW5pbWF0aW9uVGltaW5nID0gZXhwb3J0cy5hbmltYXRpb25EdXJhdGlvbiA9IGV4cG9ydHMuYW5pbWF0aW9uTmFtZSA9IGV4cG9ydHMudHJhbnNpdGlvbkVuZCA9IGV4cG9ydHMudHJhbnNpdGlvbkR1cmF0aW9uID0gZXhwb3J0cy50cmFuc2l0aW9uRGVsYXkgPSBleHBvcnRzLnRyYW5zaXRpb25UaW1pbmcgPSBleHBvcnRzLnRyYW5zaXRpb25Qcm9wZXJ0eSA9IGV4cG9ydHMudHJhbnNmb3JtID0gdW5kZWZpbmVkO1xuXG52YXIgX2luRE9NID0gcmVxdWlyZSgnLi4vdXRpbC9pbkRPTScpO1xuXG52YXIgX2luRE9NMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luRE9NKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIHRyYW5zZm9ybSA9ICd0cmFuc2Zvcm0nO1xudmFyIHByZWZpeCA9IHZvaWQgMCxcbiAgICB0cmFuc2l0aW9uRW5kID0gdm9pZCAwLFxuICAgIGFuaW1hdGlvbkVuZCA9IHZvaWQgMDtcbnZhciB0cmFuc2l0aW9uUHJvcGVydHkgPSB2b2lkIDAsXG4gICAgdHJhbnNpdGlvbkR1cmF0aW9uID0gdm9pZCAwLFxuICAgIHRyYW5zaXRpb25UaW1pbmcgPSB2b2lkIDAsXG4gICAgdHJhbnNpdGlvbkRlbGF5ID0gdm9pZCAwO1xudmFyIGFuaW1hdGlvbk5hbWUgPSB2b2lkIDAsXG4gICAgYW5pbWF0aW9uRHVyYXRpb24gPSB2b2lkIDAsXG4gICAgYW5pbWF0aW9uVGltaW5nID0gdm9pZCAwLFxuICAgIGFuaW1hdGlvbkRlbGF5ID0gdm9pZCAwO1xuXG5pZiAoX2luRE9NMi5kZWZhdWx0KSB7XG4gIHZhciBfZ2V0VHJhbnNpdGlvblByb3BlcnQgPSBnZXRUcmFuc2l0aW9uUHJvcGVydGllcygpO1xuXG4gIHByZWZpeCA9IF9nZXRUcmFuc2l0aW9uUHJvcGVydC5wcmVmaXg7XG4gIGV4cG9ydHMudHJhbnNpdGlvbkVuZCA9IHRyYW5zaXRpb25FbmQgPSBfZ2V0VHJhbnNpdGlvblByb3BlcnQudHJhbnNpdGlvbkVuZDtcbiAgZXhwb3J0cy5hbmltYXRpb25FbmQgPSBhbmltYXRpb25FbmQgPSBfZ2V0VHJhbnNpdGlvblByb3BlcnQuYW5pbWF0aW9uRW5kO1xuXG5cbiAgZXhwb3J0cy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm0gPSBwcmVmaXggKyAnLScgKyB0cmFuc2Zvcm07XG4gIGV4cG9ydHMudHJhbnNpdGlvblByb3BlcnR5ID0gdHJhbnNpdGlvblByb3BlcnR5ID0gcHJlZml4ICsgJy10cmFuc2l0aW9uLXByb3BlcnR5JztcbiAgZXhwb3J0cy50cmFuc2l0aW9uRHVyYXRpb24gPSB0cmFuc2l0aW9uRHVyYXRpb24gPSBwcmVmaXggKyAnLXRyYW5zaXRpb24tZHVyYXRpb24nO1xuICBleHBvcnRzLnRyYW5zaXRpb25EZWxheSA9IHRyYW5zaXRpb25EZWxheSA9IHByZWZpeCArICctdHJhbnNpdGlvbi1kZWxheSc7XG4gIGV4cG9ydHMudHJhbnNpdGlvblRpbWluZyA9IHRyYW5zaXRpb25UaW1pbmcgPSBwcmVmaXggKyAnLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uJztcblxuICBleHBvcnRzLmFuaW1hdGlvbk5hbWUgPSBhbmltYXRpb25OYW1lID0gcHJlZml4ICsgJy1hbmltYXRpb24tbmFtZSc7XG4gIGV4cG9ydHMuYW5pbWF0aW9uRHVyYXRpb24gPSBhbmltYXRpb25EdXJhdGlvbiA9IHByZWZpeCArICctYW5pbWF0aW9uLWR1cmF0aW9uJztcbiAgZXhwb3J0cy5hbmltYXRpb25UaW1pbmcgPSBhbmltYXRpb25UaW1pbmcgPSBwcmVmaXggKyAnLWFuaW1hdGlvbi1kZWxheSc7XG4gIGV4cG9ydHMuYW5pbWF0aW9uRGVsYXkgPSBhbmltYXRpb25EZWxheSA9IHByZWZpeCArICctYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbic7XG59XG5cbmV4cG9ydHMudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuZXhwb3J0cy50cmFuc2l0aW9uUHJvcGVydHkgPSB0cmFuc2l0aW9uUHJvcGVydHk7XG5leHBvcnRzLnRyYW5zaXRpb25UaW1pbmcgPSB0cmFuc2l0aW9uVGltaW5nO1xuZXhwb3J0cy50cmFuc2l0aW9uRGVsYXkgPSB0cmFuc2l0aW9uRGVsYXk7XG5leHBvcnRzLnRyYW5zaXRpb25EdXJhdGlvbiA9IHRyYW5zaXRpb25EdXJhdGlvbjtcbmV4cG9ydHMudHJhbnNpdGlvbkVuZCA9IHRyYW5zaXRpb25FbmQ7XG5leHBvcnRzLmFuaW1hdGlvbk5hbWUgPSBhbmltYXRpb25OYW1lO1xuZXhwb3J0cy5hbmltYXRpb25EdXJhdGlvbiA9IGFuaW1hdGlvbkR1cmF0aW9uO1xuZXhwb3J0cy5hbmltYXRpb25UaW1pbmcgPSBhbmltYXRpb25UaW1pbmc7XG5leHBvcnRzLmFuaW1hdGlvbkRlbGF5ID0gYW5pbWF0aW9uRGVsYXk7XG5leHBvcnRzLmFuaW1hdGlvbkVuZCA9IGFuaW1hdGlvbkVuZDtcbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0sXG4gIGVuZDogdHJhbnNpdGlvbkVuZCxcbiAgcHJvcGVydHk6IHRyYW5zaXRpb25Qcm9wZXJ0eSxcbiAgdGltaW5nOiB0cmFuc2l0aW9uVGltaW5nLFxuICBkZWxheTogdHJhbnNpdGlvbkRlbGF5LFxuICBkdXJhdGlvbjogdHJhbnNpdGlvbkR1cmF0aW9uXG59O1xuXG5cbmZ1bmN0aW9uIGdldFRyYW5zaXRpb25Qcm9wZXJ0aWVzKCkge1xuICB2YXIgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKS5zdHlsZTtcblxuICB2YXIgdmVuZG9yTWFwID0ge1xuICAgIE86IGZ1bmN0aW9uIE8oZSkge1xuICAgICAgcmV0dXJuICdvJyArIGUudG9Mb3dlckNhc2UoKTtcbiAgICB9LFxuICAgIE1vejogZnVuY3Rpb24gTW96KGUpIHtcbiAgICAgIHJldHVybiBlLnRvTG93ZXJDYXNlKCk7XG4gICAgfSxcbiAgICBXZWJraXQ6IGZ1bmN0aW9uIFdlYmtpdChlKSB7XG4gICAgICByZXR1cm4gJ3dlYmtpdCcgKyBlO1xuICAgIH0sXG4gICAgbXM6IGZ1bmN0aW9uIG1zKGUpIHtcbiAgICAgIHJldHVybiAnTVMnICsgZTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHZlbmRvcnMgPSBPYmplY3Qua2V5cyh2ZW5kb3JNYXApO1xuXG4gIHZhciB0cmFuc2l0aW9uRW5kID0gdm9pZCAwLFxuICAgICAgYW5pbWF0aW9uRW5kID0gdm9pZCAwO1xuICB2YXIgcHJlZml4ID0gJyc7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB2ZW5kb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHZlbmRvciA9IHZlbmRvcnNbaV07XG5cbiAgICBpZiAodmVuZG9yICsgJ1RyYW5zaXRpb25Qcm9wZXJ0eScgaW4gc3R5bGUpIHtcbiAgICAgIHByZWZpeCA9ICctJyArIHZlbmRvci50b0xvd2VyQ2FzZSgpO1xuICAgICAgdHJhbnNpdGlvbkVuZCA9IHZlbmRvck1hcFt2ZW5kb3JdKCdUcmFuc2l0aW9uRW5kJyk7XG4gICAgICBhbmltYXRpb25FbmQgPSB2ZW5kb3JNYXBbdmVuZG9yXSgnQW5pbWF0aW9uRW5kJyk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoIXRyYW5zaXRpb25FbmQgJiYgJ3RyYW5zaXRpb25Qcm9wZXJ0eScgaW4gc3R5bGUpIHRyYW5zaXRpb25FbmQgPSAndHJhbnNpdGlvbmVuZCc7XG5cbiAgaWYgKCFhbmltYXRpb25FbmQgJiYgJ2FuaW1hdGlvbk5hbWUnIGluIHN0eWxlKSBhbmltYXRpb25FbmQgPSAnYW5pbWF0aW9uZW5kJztcblxuICBzdHlsZSA9IG51bGw7XG5cbiAgcmV0dXJuIHsgYW5pbWF0aW9uRW5kOiBhbmltYXRpb25FbmQsIHRyYW5zaXRpb25FbmQ6IHRyYW5zaXRpb25FbmQsIHByZWZpeDogcHJlZml4IH07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBjYW1lbGl6ZTtcbnZhciBySHlwaGVuID0gLy0oLikvZztcblxuZnVuY3Rpb24gY2FtZWxpemUoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZShySHlwaGVuLCBmdW5jdGlvbiAoXywgY2hyKSB7XG4gICAgcmV0dXJuIGNoci50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gY2FtZWxpemVTdHlsZU5hbWU7XG5cbnZhciBfY2FtZWxpemUgPSByZXF1aXJlKCcuL2NhbWVsaXplJyk7XG5cbnZhciBfY2FtZWxpemUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2FtZWxpemUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgbXNQYXR0ZXJuID0gL14tbXMtLzsgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICogQ29weXJpZ2h0IDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9ibG9iLzJhZWI4YTJhNmJlYjAwNjE3YTQyMTdmN2Y4Mjg0OTI0ZmEyYWQ4MTkvc3JjL3ZlbmRvci9jb3JlL2NhbWVsaXplU3R5bGVOYW1lLmpzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICovXG5mdW5jdGlvbiBjYW1lbGl6ZVN0eWxlTmFtZShzdHJpbmcpIHtcbiAgcmV0dXJuICgwLCBfY2FtZWxpemUyLmRlZmF1bHQpKHN0cmluZy5yZXBsYWNlKG1zUGF0dGVybiwgJ21zLScpKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGh5cGhlbmF0ZTtcblxudmFyIHJVcHBlciA9IC8oW0EtWl0pL2c7XG5cbmZ1bmN0aW9uIGh5cGhlbmF0ZShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJVcHBlciwgJy0kMScpLnRvTG93ZXJDYXNlKCk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBoeXBoZW5hdGVTdHlsZU5hbWU7XG5cbnZhciBfaHlwaGVuYXRlID0gcmVxdWlyZSgnLi9oeXBoZW5hdGUnKTtcblxudmFyIF9oeXBoZW5hdGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaHlwaGVuYXRlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIG1zUGF0dGVybiA9IC9ebXMtLzsgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBDb3B5cmlnaHQgMjAxMy0yMDE0LCBGYWNlYm9vaywgSW5jLlxuICAgICAgICAgICAgICAgICAgICAgICAgICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9ibG9iLzJhZWI4YTJhNmJlYjAwNjE3YTQyMTdmN2Y4Mjg0OTI0ZmEyYWQ4MTkvc3JjL3ZlbmRvci9jb3JlL2h5cGhlbmF0ZVN0eWxlTmFtZS5qc1xuICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmZ1bmN0aW9uIGh5cGhlbmF0ZVN0eWxlTmFtZShzdHJpbmcpIHtcbiAgcmV0dXJuICgwLCBfaHlwaGVuYXRlMi5kZWZhdWx0KShzdHJpbmcpLnJlcGxhY2UobXNQYXR0ZXJuLCAnLW1zLScpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKHJlY2FsYykge1xuICBpZiAoIXNpemUgfHwgcmVjYWxjKSB7XG4gICAgaWYgKF9pbkRPTTIuZGVmYXVsdCkge1xuICAgICAgdmFyIHNjcm9sbERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICBzY3JvbGxEaXYuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgc2Nyb2xsRGl2LnN0eWxlLnRvcCA9ICctOTk5OXB4JztcbiAgICAgIHNjcm9sbERpdi5zdHlsZS53aWR0aCA9ICc1MHB4JztcbiAgICAgIHNjcm9sbERpdi5zdHlsZS5oZWlnaHQgPSAnNTBweCc7XG4gICAgICBzY3JvbGxEaXYuc3R5bGUub3ZlcmZsb3cgPSAnc2Nyb2xsJztcblxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JvbGxEaXYpO1xuICAgICAgc2l6ZSA9IHNjcm9sbERpdi5vZmZzZXRXaWR0aCAtIHNjcm9sbERpdi5jbGllbnRXaWR0aDtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc2Nyb2xsRGl2KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2l6ZTtcbn07XG5cbnZhciBfaW5ET00gPSByZXF1aXJlKCcuL2luRE9NJyk7XG5cbnZhciBfaW5ET00yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5ET00pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgc2l6ZSA9IHZvaWQgMDtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgdGhpcy5fZXZlbnRzID0gdGhpcy5fZXZlbnRzIHx8IHt9O1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG5FdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbihuKSB7XG4gIGlmICghaXNOdW1iZXIobikgfHwgbiA8IDAgfHwgaXNOYU4obikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCduIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBlciwgaGFuZGxlciwgbGVuLCBhcmdzLCBpLCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAodHlwZSA9PT0gJ2Vycm9yJykge1xuICAgIGlmICghdGhpcy5fZXZlbnRzLmVycm9yIHx8XG4gICAgICAgIChpc09iamVjdCh0aGlzLl9ldmVudHMuZXJyb3IpICYmICF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSkge1xuICAgICAgZXIgPSBhcmd1bWVudHNbMV07XG4gICAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkIFwiZXJyb3JcIiBldmVudC4gKCcgKyBlciArICcpJyk7XG4gICAgICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVyID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc1VuZGVmaW5lZChoYW5kbGVyKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIC8vIGZhc3QgY2FzZXNcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIHNsb3dlclxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIGhhbmRsZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGhhbmRsZXIpKSB7XG4gICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgbGlzdGVuZXJzID0gaGFuZGxlci5zbGljZSgpO1xuICAgIGxlbiA9IGxpc3RlbmVycy5sZW5ndGg7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIG07XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgaWYgKHRoaXMuX2V2ZW50cy5uZXdMaXN0ZW5lcilcbiAgICB0aGlzLmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbihsaXN0ZW5lci5saXN0ZW5lcikgP1xuICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgZWxzZSBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdLnB1c2gobGlzdGVuZXIpO1xuICBlbHNlXG4gICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gW3RoaXMuX2V2ZW50c1t0eXBlXSwgbGlzdGVuZXJdO1xuXG4gIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pICYmICF0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkKSB7XG4gICAgaWYgKCFpc1VuZGVmaW5lZCh0aGlzLl9tYXhMaXN0ZW5lcnMpKSB7XG4gICAgICBtID0gdGhpcy5fbWF4TGlzdGVuZXJzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gICAgfVxuXG4gICAgaWYgKG0gJiYgbSA+IDAgJiYgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCA+IG0pIHtcbiAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignKG5vZGUpIHdhcm5pbmc6IHBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgJyArXG4gICAgICAgICAgICAgICAgICAgICdsZWFrIGRldGVjdGVkLiAlZCBsaXN0ZW5lcnMgYWRkZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAnVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQuJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCk7XG4gICAgICBpZiAodHlwZW9mIGNvbnNvbGUudHJhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gbm90IHN1cHBvcnRlZCBpbiBJRSAxMFxuICAgICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIHZhciBmaXJlZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGcoKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBnKTtcblxuICAgIGlmICghZmlyZWQpIHtcbiAgICAgIGZpcmVkID0gdHJ1ZTtcbiAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgZy5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICB0aGlzLm9uKHR5cGUsIGcpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gZW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWRcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbGlzdCwgcG9zaXRpb24sIGxlbmd0aCwgaTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXR1cm4gdGhpcztcblxuICBsaXN0ID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuICBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgcG9zaXRpb24gPSAtMTtcblxuICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHxcbiAgICAgIChpc0Z1bmN0aW9uKGxpc3QubGlzdGVuZXIpICYmIGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG5cbiAgfSBlbHNlIGlmIChpc09iamVjdChsaXN0KSkge1xuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tID4gMDspIHtcbiAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fFxuICAgICAgICAgIChsaXN0W2ldLmxpc3RlbmVyICYmIGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICByZXR1cm4gdGhpcztcblxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgbGlzdC5sZW5ndGggPSAwO1xuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdC5zcGxpY2UocG9zaXRpb24sIDEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIGtleSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgaWYgKCF0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIGVsc2UgaWYgKHRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBmb3IgKGtleSBpbiB0aGlzLl9ldmVudHMpIHtcbiAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgaWYgKGlzRnVuY3Rpb24obGlzdGVuZXJzKSkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgfSBlbHNlIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAvLyBMSUZPIG9yZGVyXG4gICAgd2hpbGUgKGxpc3RlbmVycy5sZW5ndGgpXG4gICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tsaXN0ZW5lcnMubGVuZ3RoIC0gMV0pO1xuICB9XG4gIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIHJldDtcbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXQgPSBbXTtcbiAgZWxzZSBpZiAoaXNGdW5jdGlvbih0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIHJldCA9IFt0aGlzLl9ldmVudHNbdHlwZV1dO1xuICBlbHNlXG4gICAgcmV0ID0gdGhpcy5fZXZlbnRzW3R5cGVdLnNsaWNlKCk7XG4gIHJldHVybiByZXQ7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbih0eXBlKSB7XG4gIGlmICh0aGlzLl9ldmVudHMpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICAgIGlmIChpc0Z1bmN0aW9uKGV2bGlzdGVuZXIpKVxuICAgICAgcmV0dXJuIDE7XG4gICAgZWxzZSBpZiAoZXZsaXN0ZW5lcilcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gMDtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xufTtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbnZhciBmYmVtaXR0ZXIgPSB7XG4gIEV2ZW50RW1pdHRlcjogcmVxdWlyZSgnLi9saWIvQmFzZUV2ZW50RW1pdHRlcicpLFxuICBFbWl0dGVyU3Vic2NyaXB0aW9uIDogcmVxdWlyZSgnLi9saWIvRW1pdHRlclN1YnNjcmlwdGlvbicpXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZiZW1pdHRlcjtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgQmFzZUV2ZW50RW1pdHRlclxuICogQHR5cGVjaGVja3NcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG52YXIgRW1pdHRlclN1YnNjcmlwdGlvbiA9IHJlcXVpcmUoJy4vRW1pdHRlclN1YnNjcmlwdGlvbicpO1xudmFyIEV2ZW50U3Vic2NyaXB0aW9uVmVuZG9yID0gcmVxdWlyZSgnLi9FdmVudFN1YnNjcmlwdGlvblZlbmRvcicpO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBAY2xhc3MgQmFzZUV2ZW50RW1pdHRlclxuICogQGRlc2NyaXB0aW9uXG4gKiBBbiBFdmVudEVtaXR0ZXIgaXMgcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIGEgc2V0IG9mIGxpc3RlbmVycyBhbmQgcHVibGlzaGluZ1xuICogZXZlbnRzIHRvIHRoZW0gd2hlbiBpdCBpcyB0b2xkIHRoYXQgc3VjaCBldmVudHMgaGFwcGVuZWQuIEluIGFkZGl0aW9uIHRvIHRoZVxuICogZGF0YSBmb3IgdGhlIGdpdmVuIGV2ZW50IGl0IGFsc28gc2VuZHMgYSBldmVudCBjb250cm9sIG9iamVjdCB3aGljaCBhbGxvd3NcbiAqIHRoZSBsaXN0ZW5lcnMvaGFuZGxlcnMgdG8gcHJldmVudCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUgZ2l2ZW4gZXZlbnQuXG4gKlxuICogVGhlIGVtaXR0ZXIgaXMgZGVzaWduZWQgdG8gYmUgZ2VuZXJpYyBlbm91Z2ggdG8gc3VwcG9ydCBhbGwgdGhlIGRpZmZlcmVudFxuICogY29udGV4dHMgaW4gd2hpY2ggb25lIG1pZ2h0IHdhbnQgdG8gZW1pdCBldmVudHMuIEl0IGlzIGEgc2ltcGxlIG11bHRpY2FzdFxuICogbWVjaGFuaXNtIG9uIHRvcCBvZiB3aGljaCBleHRyYSBmdW5jdGlvbmFsaXR5IGNhbiBiZSBjb21wb3NlZC4gRm9yIGV4YW1wbGUsIGFcbiAqIG1vcmUgYWR2YW5jZWQgZW1pdHRlciBtYXkgdXNlIGFuIEV2ZW50SG9sZGVyIGFuZCBFdmVudEZhY3RvcnkuXG4gKi9cblxudmFyIEJhc2VFdmVudEVtaXR0ZXIgPSAoZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogQGNvbnN0cnVjdG9yXG4gICAqL1xuXG4gIGZ1bmN0aW9uIEJhc2VFdmVudEVtaXR0ZXIoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEJhc2VFdmVudEVtaXR0ZXIpO1xuXG4gICAgdGhpcy5fc3Vic2NyaWJlciA9IG5ldyBFdmVudFN1YnNjcmlwdGlvblZlbmRvcigpO1xuICAgIHRoaXMuX2N1cnJlbnRTdWJzY3JpcHRpb24gPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBsaXN0ZW5lciB0byBiZSBpbnZva2VkIHdoZW4gZXZlbnRzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBhcmVcbiAgICogZW1pdHRlZC4gQW4gb3B0aW9uYWwgY2FsbGluZyBjb250ZXh0IG1heSBiZSBwcm92aWRlZC4gVGhlIGRhdGEgYXJndW1lbnRzXG4gICAqIGVtaXR0ZWQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGxpc3RlbmVyIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBUT0RPOiBBbm5vdGF0ZSB0aGUgbGlzdGVuZXIgYXJnJ3MgdHlwZS4gVGhpcyBpcyB0cmlja3kgYmVjYXVzZSBsaXN0ZW5lcnNcbiAgICogICAgICAgY2FuIGJlIGludm9rZWQgd2l0aCB2YXJhcmdzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRUeXBlIC0gTmFtZSBvZiB0aGUgZXZlbnQgdG8gbGlzdGVuIHRvXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyIC0gRnVuY3Rpb24gdG8gaW52b2tlIHdoZW4gdGhlIHNwZWNpZmllZCBldmVudCBpc1xuICAgKiAgIGVtaXR0ZWRcbiAgICogQHBhcmFtIHsqfSBjb250ZXh0IC0gT3B0aW9uYWwgY29udGV4dCBvYmplY3QgdG8gdXNlIHdoZW4gaW52b2tpbmcgdGhlXG4gICAqICAgbGlzdGVuZXJcbiAgICovXG5cbiAgQmFzZUV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbiBhZGRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIHRoaXMuX3N1YnNjcmliZXIuYWRkU3Vic2NyaXB0aW9uKGV2ZW50VHlwZSwgbmV3IEVtaXR0ZXJTdWJzY3JpcHRpb24odGhpcy5fc3Vic2NyaWJlciwgbGlzdGVuZXIsIGNvbnRleHQpKTtcbiAgfTtcblxuICAvKipcbiAgICogU2ltaWxhciB0byBhZGRMaXN0ZW5lciwgZXhjZXB0IHRoYXQgdGhlIGxpc3RlbmVyIGlzIHJlbW92ZWQgYWZ0ZXIgaXQgaXNcbiAgICogaW52b2tlZCBvbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRUeXBlIC0gTmFtZSBvZiB0aGUgZXZlbnQgdG8gbGlzdGVuIHRvXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyIC0gRnVuY3Rpb24gdG8gaW52b2tlIG9ubHkgb25jZSB3aGVuIHRoZVxuICAgKiAgIHNwZWNpZmllZCBldmVudCBpcyBlbWl0dGVkXG4gICAqIEBwYXJhbSB7Kn0gY29udGV4dCAtIE9wdGlvbmFsIGNvbnRleHQgb2JqZWN0IHRvIHVzZSB3aGVuIGludm9raW5nIHRoZVxuICAgKiAgIGxpc3RlbmVyXG4gICAqL1xuXG4gIEJhc2VFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKGV2ZW50VHlwZSwgbGlzdGVuZXIsIGNvbnRleHQpIHtcbiAgICB2YXIgZW1pdHRlciA9IHRoaXM7XG4gICAgcmV0dXJuIHRoaXMuYWRkTGlzdGVuZXIoZXZlbnRUeXBlLCBmdW5jdGlvbiAoKSB7XG4gICAgICBlbWl0dGVyLnJlbW92ZUN1cnJlbnRMaXN0ZW5lcigpO1xuICAgICAgbGlzdGVuZXIuYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTtcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlcyBhbGwgb2YgdGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLCBpbmNsdWRpbmcgdGhvc2UgcmVnaXN0ZXJlZCBhc1xuICAgKiBsaXN0ZW5lciBtYXBzLlxuICAgKlxuICAgKiBAcGFyYW0gez9zdHJpbmd9IGV2ZW50VHlwZSAtIE9wdGlvbmFsIG5hbWUgb2YgdGhlIGV2ZW50IHdob3NlIHJlZ2lzdGVyZWRcbiAgICogICBsaXN0ZW5lcnMgdG8gcmVtb3ZlXG4gICAqL1xuXG4gIEJhc2VFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyhldmVudFR5cGUpIHtcbiAgICB0aGlzLl9zdWJzY3JpYmVyLnJlbW92ZUFsbFN1YnNjcmlwdGlvbnMoZXZlbnRUeXBlKTtcbiAgfTtcblxuICAvKipcbiAgICogUHJvdmlkZXMgYW4gQVBJIHRoYXQgY2FuIGJlIGNhbGxlZCBkdXJpbmcgYW4gZXZlbnRpbmcgY3ljbGUgdG8gcmVtb3ZlIHRoZVxuICAgKiBsYXN0IGxpc3RlbmVyIHRoYXQgd2FzIGludm9rZWQuIFRoaXMgYWxsb3dzIGEgZGV2ZWxvcGVyIHRvIHByb3ZpZGUgYW4gZXZlbnRcbiAgICogb2JqZWN0IHRoYXQgY2FuIHJlbW92ZSB0aGUgbGlzdGVuZXIgKG9yIGxpc3RlbmVyIG1hcCkgZHVyaW5nIHRoZVxuICAgKiBpbnZvY2F0aW9uLlxuICAgKlxuICAgKiBJZiBpdCBpcyBjYWxsZWQgd2hlbiBub3QgaW5zaWRlIG9mIGFuIGVtaXR0aW5nIGN5Y2xlIGl0IHdpbGwgdGhyb3cuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIGNhbGxlZCBub3QgZHVyaW5nIGFuIGV2ZW50aW5nIGN5Y2xlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqICAgdmFyIHN1YnNjcmlwdGlvbiA9IGVtaXR0ZXIuYWRkTGlzdGVuZXJNYXAoe1xuICAgKiAgICAgc29tZUV2ZW50OiBmdW5jdGlvbihkYXRhLCBldmVudCkge1xuICAgKiAgICAgICBjb25zb2xlLmxvZyhkYXRhKTtcbiAgICogICAgICAgZW1pdHRlci5yZW1vdmVDdXJyZW50TGlzdGVuZXIoKTtcbiAgICogICAgIH1cbiAgICogICB9KTtcbiAgICpcbiAgICogICBlbWl0dGVyLmVtaXQoJ3NvbWVFdmVudCcsICdhYmMnKTsgLy8gbG9ncyAnYWJjJ1xuICAgKiAgIGVtaXR0ZXIuZW1pdCgnc29tZUV2ZW50JywgJ2RlZicpOyAvLyBkb2VzIG5vdCBsb2cgYW55dGhpbmdcbiAgICovXG5cbiAgQmFzZUV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQ3VycmVudExpc3RlbmVyID0gZnVuY3Rpb24gcmVtb3ZlQ3VycmVudExpc3RlbmVyKCkge1xuICAgICEhIXRoaXMuX2N1cnJlbnRTdWJzY3JpcHRpb24gPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnTm90IGluIGFuIGVtaXR0aW5nIGN5Y2xlOyB0aGVyZSBpcyBubyBjdXJyZW50IHN1YnNjcmlwdGlvbicpIDogaW52YXJpYW50KGZhbHNlKSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zdWJzY3JpYmVyLnJlbW92ZVN1YnNjcmlwdGlvbih0aGlzLl9jdXJyZW50U3Vic2NyaXB0aW9uKTtcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyBhbiBhcnJheSBvZiBsaXN0ZW5lcnMgdGhhdCBhcmUgY3VycmVudGx5IHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlblxuICAgKiBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50VHlwZSAtIE5hbWUgb2YgdGhlIGV2ZW50IHRvIHF1ZXJ5XG4gICAqIEByZXR1cm4ge2FycmF5fVxuICAgKi9cblxuICBCYXNlRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiBsaXN0ZW5lcnMoZXZlbnRUeXBlKSAvKiBUT0RPOiBBcnJheTxFdmVudFN1YnNjcmlwdGlvbj4gKi97XG4gICAgdmFyIHN1YnNjcmlwdGlvbnMgPSB0aGlzLl9zdWJzY3JpYmVyLmdldFN1YnNjcmlwdGlvbnNGb3JUeXBlKGV2ZW50VHlwZSk7XG4gICAgcmV0dXJuIHN1YnNjcmlwdGlvbnMgPyBzdWJzY3JpcHRpb25zLmZpbHRlcihlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zVHJ1ZSkubWFwKGZ1bmN0aW9uIChzdWJzY3JpcHRpb24pIHtcbiAgICAgIHJldHVybiBzdWJzY3JpcHRpb24ubGlzdGVuZXI7XG4gICAgfSkgOiBbXTtcbiAgfTtcblxuICAvKipcbiAgICogRW1pdHMgYW4gZXZlbnQgb2YgdGhlIGdpdmVuIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gZGF0YS4gQWxsIGhhbmRsZXJzIG9mIHRoYXRcbiAgICogcGFydGljdWxhciB0eXBlIHdpbGwgYmUgbm90aWZpZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgLSBOYW1lIG9mIHRoZSBldmVudCB0byBlbWl0XG4gICAqIEBwYXJhbSB7Kn0gQXJiaXRyYXJ5IGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gZWFjaCByZWdpc3RlcmVkIGxpc3RlbmVyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqICAgZW1pdHRlci5hZGRMaXN0ZW5lcignc29tZUV2ZW50JywgZnVuY3Rpb24obWVzc2FnZSkge1xuICAgKiAgICAgY29uc29sZS5sb2cobWVzc2FnZSk7XG4gICAqICAgfSk7XG4gICAqXG4gICAqICAgZW1pdHRlci5lbWl0KCdzb21lRXZlbnQnLCAnYWJjJyk7IC8vIGxvZ3MgJ2FiYydcbiAgICovXG5cbiAgQmFzZUV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQoZXZlbnRUeXBlKSB7XG4gICAgdmFyIHN1YnNjcmlwdGlvbnMgPSB0aGlzLl9zdWJzY3JpYmVyLmdldFN1YnNjcmlwdGlvbnNGb3JUeXBlKGV2ZW50VHlwZSk7XG4gICAgaWYgKHN1YnNjcmlwdGlvbnMpIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoc3Vic2NyaXB0aW9ucyk7XG4gICAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwga2V5cy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNbaWldO1xuICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uc1trZXldO1xuICAgICAgICAvLyBUaGUgc3Vic2NyaXB0aW9uIG1heSBoYXZlIGJlZW4gcmVtb3ZlZCBkdXJpbmcgdGhpcyBldmVudCBsb29wLlxuICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgdGhpcy5fY3VycmVudFN1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbjtcbiAgICAgICAgICB0aGlzLl9fZW1pdFRvU3Vic2NyaXB0aW9uLmFwcGx5KHRoaXMsIFtzdWJzY3JpcHRpb25dLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuX2N1cnJlbnRTdWJzY3JpcHRpb24gPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUHJvdmlkZXMgYSBob29rIHRvIG92ZXJyaWRlIGhvdyB0aGUgZW1pdHRlciBlbWl0cyBhbiBldmVudCB0byBhIHNwZWNpZmljXG4gICAqIHN1YnNjcmlwdGlvbi4gVGhpcyBhbGxvd3MgeW91IHRvIHNldCB1cCBsb2dnaW5nIGFuZCBlcnJvciBib3VuZGFyaWVzXG4gICAqIHNwZWNpZmljIHRvIHlvdXIgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7RW1pdHRlclN1YnNjcmlwdGlvbn0gc3Vic2NyaXB0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGVcbiAgICogQHBhcmFtIHsqfSBBcmJpdHJhcnkgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byBlYWNoIHJlZ2lzdGVyZWQgbGlzdGVuZXJcbiAgICovXG5cbiAgQmFzZUV2ZW50RW1pdHRlci5wcm90b3R5cGUuX19lbWl0VG9TdWJzY3JpcHRpb24gPSBmdW5jdGlvbiBfX2VtaXRUb1N1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24sIGV2ZW50VHlwZSkge1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTtcbiAgICBzdWJzY3JpcHRpb24ubGlzdGVuZXIuYXBwbHkoc3Vic2NyaXB0aW9uLmNvbnRleHQsIGFyZ3MpO1xuICB9O1xuXG4gIHJldHVybiBCYXNlRXZlbnRFbWl0dGVyO1xufSkoKTtcblxubW9kdWxlLmV4cG9ydHMgPSBCYXNlRXZlbnRFbWl0dGVyOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqIFxuICogQHByb3ZpZGVzTW9kdWxlIEVtaXR0ZXJTdWJzY3JpcHRpb25cbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gJ2Z1bmN0aW9uJyAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ1N1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJyArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIEV2ZW50U3Vic2NyaXB0aW9uID0gcmVxdWlyZSgnLi9FdmVudFN1YnNjcmlwdGlvbicpO1xuXG4vKipcbiAqIEVtaXR0ZXJTdWJzY3JpcHRpb24gcmVwcmVzZW50cyBhIHN1YnNjcmlwdGlvbiB3aXRoIGxpc3RlbmVyIGFuZCBjb250ZXh0IGRhdGEuXG4gKi9cblxudmFyIEVtaXR0ZXJTdWJzY3JpcHRpb24gPSAoZnVuY3Rpb24gKF9FdmVudFN1YnNjcmlwdGlvbikge1xuICBfaW5oZXJpdHMoRW1pdHRlclN1YnNjcmlwdGlvbiwgX0V2ZW50U3Vic2NyaXB0aW9uKTtcblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudFN1YnNjcmlwdGlvblZlbmRvcn0gc3Vic2NyaWJlciAtIFRoZSBzdWJzY3JpYmVyIHRoYXQgY29udHJvbHNcbiAgICogICB0aGlzIHN1YnNjcmlwdGlvblxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lciAtIEZ1bmN0aW9uIHRvIGludm9rZSB3aGVuIHRoZSBzcGVjaWZpZWQgZXZlbnQgaXNcbiAgICogICBlbWl0dGVkXG4gICAqIEBwYXJhbSB7Kn0gY29udGV4dCAtIE9wdGlvbmFsIGNvbnRleHQgb2JqZWN0IHRvIHVzZSB3aGVuIGludm9raW5nIHRoZVxuICAgKiAgIGxpc3RlbmVyXG4gICAqL1xuXG4gIGZ1bmN0aW9uIEVtaXR0ZXJTdWJzY3JpcHRpb24oc3Vic2NyaWJlciwgbGlzdGVuZXIsIGNvbnRleHQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRW1pdHRlclN1YnNjcmlwdGlvbik7XG5cbiAgICBfRXZlbnRTdWJzY3JpcHRpb24uY2FsbCh0aGlzLCBzdWJzY3JpYmVyKTtcbiAgICB0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgfVxuXG4gIHJldHVybiBFbWl0dGVyU3Vic2NyaXB0aW9uO1xufSkoRXZlbnRTdWJzY3JpcHRpb24pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVtaXR0ZXJTdWJzY3JpcHRpb247IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBFdmVudFN1YnNjcmlwdGlvblxuICogQHR5cGVjaGVja3NcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRXZlbnRTdWJzY3JpcHRpb24gcmVwcmVzZW50cyBhIHN1YnNjcmlwdGlvbiB0byBhIHBhcnRpY3VsYXIgZXZlbnQuIEl0IGNhblxuICogcmVtb3ZlIGl0cyBvd24gc3Vic2NyaXB0aW9uLlxuICovXG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG52YXIgRXZlbnRTdWJzY3JpcHRpb24gPSAoZnVuY3Rpb24gKCkge1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50U3Vic2NyaXB0aW9uVmVuZG9yfSBzdWJzY3JpYmVyIHRoZSBzdWJzY3JpYmVyIHRoYXQgY29udHJvbHNcbiAgICogICB0aGlzIHN1YnNjcmlwdGlvbi5cbiAgICovXG5cbiAgZnVuY3Rpb24gRXZlbnRTdWJzY3JpcHRpb24oc3Vic2NyaWJlcikge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFdmVudFN1YnNjcmlwdGlvbik7XG5cbiAgICB0aGlzLnN1YnNjcmliZXIgPSBzdWJzY3JpYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhpcyBzdWJzY3JpcHRpb24gZnJvbSB0aGUgc3Vic2NyaWJlciB0aGF0IGNvbnRyb2xzIGl0LlxuICAgKi9cblxuICBFdmVudFN1YnNjcmlwdGlvbi5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgIGlmICh0aGlzLnN1YnNjcmliZXIpIHtcbiAgICAgIHRoaXMuc3Vic2NyaWJlci5yZW1vdmVTdWJzY3JpcHRpb24odGhpcyk7XG4gICAgICB0aGlzLnN1YnNjcmliZXIgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gRXZlbnRTdWJzY3JpcHRpb247XG59KSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50U3Vic2NyaXB0aW9uOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqIFxuICogQHByb3ZpZGVzTW9kdWxlIEV2ZW50U3Vic2NyaXB0aW9uVmVuZG9yXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBFdmVudFN1YnNjcmlwdGlvblZlbmRvciBzdG9yZXMgYSBzZXQgb2YgRXZlbnRTdWJzY3JpcHRpb25zIHRoYXQgYXJlXG4gKiBzdWJzY3JpYmVkIHRvIGEgcGFydGljdWxhciBldmVudCB0eXBlLlxuICovXG5cbnZhciBFdmVudFN1YnNjcmlwdGlvblZlbmRvciA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEV2ZW50U3Vic2NyaXB0aW9uVmVuZG9yKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFdmVudFN1YnNjcmlwdGlvblZlbmRvcik7XG5cbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zRm9yVHlwZSA9IHt9O1xuICAgIHRoaXMuX2N1cnJlbnRTdWJzY3JpcHRpb24gPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzdWJzY3JpcHRpb24ga2V5ZWQgYnkgYW4gZXZlbnQgdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50VHlwZVxuICAgKiBAcGFyYW0ge0V2ZW50U3Vic2NyaXB0aW9ufSBzdWJzY3JpcHRpb25cbiAgICovXG5cbiAgRXZlbnRTdWJzY3JpcHRpb25WZW5kb3IucHJvdG90eXBlLmFkZFN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uIGFkZFN1YnNjcmlwdGlvbihldmVudFR5cGUsIHN1YnNjcmlwdGlvbikge1xuICAgICEoc3Vic2NyaXB0aW9uLnN1YnNjcmliZXIgPT09IHRoaXMpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1RoZSBzdWJzY3JpYmVyIG9mIHRoZSBzdWJzY3JpcHRpb24gaXMgaW5jb3JyZWN0bHkgc2V0LicpIDogaW52YXJpYW50KGZhbHNlKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoIXRoaXMuX3N1YnNjcmlwdGlvbnNGb3JUeXBlW2V2ZW50VHlwZV0pIHtcbiAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnNGb3JUeXBlW2V2ZW50VHlwZV0gPSBbXTtcbiAgICB9XG4gICAgdmFyIGtleSA9IHRoaXMuX3N1YnNjcmlwdGlvbnNGb3JUeXBlW2V2ZW50VHlwZV0ubGVuZ3RoO1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnNGb3JUeXBlW2V2ZW50VHlwZV0ucHVzaChzdWJzY3JpcHRpb24pO1xuICAgIHN1YnNjcmlwdGlvbi5ldmVudFR5cGUgPSBldmVudFR5cGU7XG4gICAgc3Vic2NyaXB0aW9uLmtleSA9IGtleTtcbiAgICByZXR1cm4gc3Vic2NyaXB0aW9uO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgYnVsayBzZXQgb2YgdGhlIHN1YnNjcmlwdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gZXZlbnRUeXBlIC0gT3B0aW9uYWwgbmFtZSBvZiB0aGUgZXZlbnQgdHlwZSB3aG9zZVxuICAgKiAgIHJlZ2lzdGVyZWQgc3Vwc2NyaXB0aW9ucyB0byByZW1vdmUsIGlmIG51bGwgcmVtb3ZlIGFsbCBzdWJzY3JpcHRpb25zLlxuICAgKi9cblxuICBFdmVudFN1YnNjcmlwdGlvblZlbmRvci5wcm90b3R5cGUucmVtb3ZlQWxsU3Vic2NyaXB0aW9ucyA9IGZ1bmN0aW9uIHJlbW92ZUFsbFN1YnNjcmlwdGlvbnMoZXZlbnRUeXBlKSB7XG4gICAgaWYgKGV2ZW50VHlwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb25zRm9yVHlwZSA9IHt9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy5fc3Vic2NyaXB0aW9uc0ZvclR5cGVbZXZlbnRUeXBlXTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBzcGVjaWZpYyBzdWJzY3JpcHRpb24uIEluc3RlYWQgb2YgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCBjYWxsXG4gICAqIGBzdWJzY3JpcHRpb24ucmVtb3ZlKClgIGRpcmVjdGx5LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gc3Vic2NyaXB0aW9uXG4gICAqL1xuXG4gIEV2ZW50U3Vic2NyaXB0aW9uVmVuZG9yLnByb3RvdHlwZS5yZW1vdmVTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiByZW1vdmVTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSB7XG4gICAgdmFyIGV2ZW50VHlwZSA9IHN1YnNjcmlwdGlvbi5ldmVudFR5cGU7XG4gICAgdmFyIGtleSA9IHN1YnNjcmlwdGlvbi5rZXk7XG5cbiAgICB2YXIgc3Vic2NyaXB0aW9uc0ZvclR5cGUgPSB0aGlzLl9zdWJzY3JpcHRpb25zRm9yVHlwZVtldmVudFR5cGVdO1xuICAgIGlmIChzdWJzY3JpcHRpb25zRm9yVHlwZSkge1xuICAgICAgZGVsZXRlIHN1YnNjcmlwdGlvbnNGb3JUeXBlW2tleV07XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBzdWJzY3JpcHRpb25zIHRoYXQgYXJlIGN1cnJlbnRseSByZWdpc3RlcmVkIGZvciB0aGVcbiAgICogZ2l2ZW4gZXZlbnQgdHlwZS5cbiAgICpcbiAgICogTm90ZTogVGhpcyBhcnJheSBjYW4gYmUgcG90ZW50aWFsbHkgc3BhcnNlIGFzIHN1YnNjcmlwdGlvbnMgYXJlIGRlbGV0ZWRcbiAgICogZnJvbSBpdCB3aGVuIHRoZXkgYXJlIHJlbW92ZWQuXG4gICAqXG4gICAqIFRPRE86IFRoaXMgcmV0dXJucyBhIG51bGxhYmxlIGFycmF5LiB3YXQ/XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGVcbiAgICogQHJldHVybiB7P2FycmF5fVxuICAgKi9cblxuICBFdmVudFN1YnNjcmlwdGlvblZlbmRvci5wcm90b3R5cGUuZ2V0U3Vic2NyaXB0aW9uc0ZvclR5cGUgPSBmdW5jdGlvbiBnZXRTdWJzY3JpcHRpb25zRm9yVHlwZShldmVudFR5cGUpIHtcbiAgICByZXR1cm4gdGhpcy5fc3Vic2NyaXB0aW9uc0ZvclR5cGVbZXZlbnRUeXBlXTtcbiAgfTtcblxuICByZXR1cm4gRXZlbnRTdWJzY3JpcHRpb25WZW5kb3I7XG59KSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50U3Vic2NyaXB0aW9uVmVuZG9yOyIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9lbXB0eUZ1bmN0aW9uJyk7XG5cbi8qKlxuICogVXBzdHJlYW0gdmVyc2lvbiBvZiBldmVudCBsaXN0ZW5lci4gRG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgc3BlY2lmaWNcbiAqIG5hdHVyZSBvZiBwbGF0Zm9ybS5cbiAqL1xudmFyIEV2ZW50TGlzdGVuZXIgPSB7XG4gIC8qKlxuICAgKiBMaXN0ZW4gdG8gRE9NIGV2ZW50cyBkdXJpbmcgdGhlIGJ1YmJsZSBwaGFzZS5cbiAgICpcbiAgICogQHBhcmFtIHtET01FdmVudFRhcmdldH0gdGFyZ2V0IERPTSBlbGVtZW50IHRvIHJlZ2lzdGVyIGxpc3RlbmVyIG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRUeXBlIEV2ZW50IHR5cGUsIGUuZy4gJ2NsaWNrJyBvciAnbW91c2VvdmVyJy5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IHdpdGggYSBgcmVtb3ZlYCBtZXRob2QuXG4gICAqL1xuICBsaXN0ZW46IGZ1bmN0aW9uIGxpc3Rlbih0YXJnZXQsIGV2ZW50VHlwZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2ssIGZhbHNlKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2ssIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHRhcmdldC5hdHRhY2hFdmVudCkge1xuICAgICAgdGFyZ2V0LmF0dGFjaEV2ZW50KCdvbicgKyBldmVudFR5cGUsIGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge1xuICAgICAgICAgIHRhcmdldC5kZXRhY2hFdmVudCgnb24nICsgZXZlbnRUeXBlLCBjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gdG8gRE9NIGV2ZW50cyBkdXJpbmcgdGhlIGNhcHR1cmUgcGhhc2UuXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRXZlbnRUYXJnZXR9IHRhcmdldCBET00gZWxlbWVudCB0byByZWdpc3RlciBsaXN0ZW5lciBvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50VHlwZSBFdmVudCB0eXBlLCBlLmcuICdjbGljaycgb3IgJ21vdXNlb3ZlcicuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IE9iamVjdCB3aXRoIGEgYHJlbW92ZWAgbWV0aG9kLlxuICAgKi9cbiAgY2FwdHVyZTogZnVuY3Rpb24gY2FwdHVyZSh0YXJnZXQsIGV2ZW50VHlwZSwgY2FsbGJhY2spIHtcbiAgICBpZiAodGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgY2FsbGJhY2ssIHRydWUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBjYWxsYmFjaywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdBdHRlbXB0ZWQgdG8gbGlzdGVuIHRvIGV2ZW50cyBkdXJpbmcgdGhlIGNhcHR1cmUgcGhhc2Ugb24gYSAnICsgJ2Jyb3dzZXIgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjYXB0dXJlIHBoYXNlLiBZb3VyIGFwcGxpY2F0aW9uICcgKyAnd2lsbCBub3QgcmVjZWl2ZSBzb21lIGV2ZW50cy4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlbW92ZTogZW1wdHlGdW5jdGlvblxuICAgICAgfTtcbiAgICB9XG4gIH0sXG5cbiAgcmVnaXN0ZXJEZWZhdWx0OiBmdW5jdGlvbiByZWdpc3RlckRlZmF1bHQoKSB7fVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFdmVudExpc3RlbmVyOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcblxuLyoqXG4gKiBTaW1wbGUsIGxpZ2h0d2VpZ2h0IG1vZHVsZSBhc3Npc3Rpbmcgd2l0aCB0aGUgZGV0ZWN0aW9uIGFuZCBjb250ZXh0IG9mXG4gKiBXb3JrZXIuIEhlbHBzIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcyBhbmQgYWxsb3dzIGNvZGUgdG8gcmVhc29uIGFib3V0XG4gKiB3aGV0aGVyIG9yIG5vdCB0aGV5IGFyZSBpbiBhIFdvcmtlciwgZXZlbiBpZiB0aGV5IG5ldmVyIGluY2x1ZGUgdGhlIG1haW5cbiAqIGBSZWFjdFdvcmtlcmAgZGVwZW5kZW5jeS5cbiAqL1xudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0ge1xuXG4gIGNhblVzZURPTTogY2FuVXNlRE9NLFxuXG4gIGNhblVzZVdvcmtlcnM6IHR5cGVvZiBXb3JrZXIgIT09ICd1bmRlZmluZWQnLFxuXG4gIGNhblVzZUV2ZW50TGlzdGVuZXJzOiBjYW5Vc2VET00gJiYgISEod2luZG93LmFkZEV2ZW50TGlzdGVuZXIgfHwgd2luZG93LmF0dGFjaEV2ZW50KSxcblxuICBjYW5Vc2VWaWV3cG9ydDogY2FuVXNlRE9NICYmICEhd2luZG93LnNjcmVlbixcblxuICBpc0luV29ya2VyOiAhY2FuVXNlRE9NIC8vIEZvciBub3csIHRoaXMgaXMgdHJ1ZSAtIG1pZ2h0IGNoYW5nZSBpbiB0aGUgZnV0dXJlLlxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV4ZWN1dGlvbkVudmlyb25tZW50OyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqL1xuXG52YXIgX2h5cGhlblBhdHRlcm4gPSAvLSguKS9nO1xuXG4vKipcbiAqIENhbWVsY2FzZXMgYSBoeXBoZW5hdGVkIHN0cmluZywgZm9yIGV4YW1wbGU6XG4gKlxuICogICA+IGNhbWVsaXplKCdiYWNrZ3JvdW5kLWNvbG9yJylcbiAqICAgPCBcImJhY2tncm91bmRDb2xvclwiXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBjYW1lbGl6ZShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKF9oeXBoZW5QYXR0ZXJuLCBmdW5jdGlvbiAoXywgY2hhcmFjdGVyKSB7XG4gICAgcmV0dXJuIGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpO1xuICB9KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjYW1lbGl6ZTsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBjYW1lbGl6ZSA9IHJlcXVpcmUoJy4vY2FtZWxpemUnKTtcblxudmFyIG1zUGF0dGVybiA9IC9eLW1zLS87XG5cbi8qKlxuICogQ2FtZWxjYXNlcyBhIGh5cGhlbmF0ZWQgQ1NTIHByb3BlcnR5IG5hbWUsIGZvciBleGFtcGxlOlxuICpcbiAqICAgPiBjYW1lbGl6ZVN0eWxlTmFtZSgnYmFja2dyb3VuZC1jb2xvcicpXG4gKiAgIDwgXCJiYWNrZ3JvdW5kQ29sb3JcIlxuICogICA+IGNhbWVsaXplU3R5bGVOYW1lKCctbW96LXRyYW5zaXRpb24nKVxuICogICA8IFwiTW96VHJhbnNpdGlvblwiXG4gKiAgID4gY2FtZWxpemVTdHlsZU5hbWUoJy1tcy10cmFuc2l0aW9uJylcbiAqICAgPCBcIm1zVHJhbnNpdGlvblwiXG4gKlxuICogQXMgQW5kaSBTbWl0aCBzdWdnZXN0c1xuICogKGh0dHA6Ly93d3cuYW5kaXNtaXRoLmNvbS9ibG9nLzIwMTIvMDIvbW9kZXJuaXpyLXByZWZpeGVkLyksIGFuIGAtbXNgIHByZWZpeFxuICogaXMgY29udmVydGVkIHRvIGxvd2VyY2FzZSBgbXNgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gY2FtZWxpemVTdHlsZU5hbWUoc3RyaW5nKSB7XG4gIHJldHVybiBjYW1lbGl6ZShzdHJpbmcucmVwbGFjZShtc1BhdHRlcm4sICdtcy0nKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FtZWxpemVTdHlsZU5hbWU7IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxudmFyIGlzVGV4dE5vZGUgPSByZXF1aXJlKCcuL2lzVGV4dE5vZGUnKTtcblxuLyplc2xpbnQtZGlzYWJsZSBuby1iaXR3aXNlICovXG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZ2l2ZW4gRE9NIG5vZGUgY29udGFpbnMgb3IgaXMgYW5vdGhlciBET00gbm9kZS5cbiAqL1xuZnVuY3Rpb24gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlKSB7XG4gIGlmICghb3V0ZXJOb2RlIHx8ICFpbm5lck5vZGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAob3V0ZXJOb2RlID09PSBpbm5lck5vZGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc1RleHROb2RlKG91dGVyTm9kZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAoaXNUZXh0Tm9kZShpbm5lck5vZGUpKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5zTm9kZShvdXRlck5vZGUsIGlubmVyTm9kZS5wYXJlbnROb2RlKTtcbiAgfSBlbHNlIGlmICgnY29udGFpbnMnIGluIG91dGVyTm9kZSkge1xuICAgIHJldHVybiBvdXRlck5vZGUuY29udGFpbnMoaW5uZXJOb2RlKTtcbiAgfSBlbHNlIGlmIChvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHtcbiAgICByZXR1cm4gISEob3V0ZXJOb2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGlubmVyTm9kZSkgJiAxNik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY29udGFpbnNOb2RlOyIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJy4vaW52YXJpYW50Jyk7XG5cbi8qKlxuICogQ29udmVydCBhcnJheS1saWtlIG9iamVjdHMgdG8gYXJyYXlzLlxuICpcbiAqIFRoaXMgQVBJIGFzc3VtZXMgdGhlIGNhbGxlciBrbm93cyB0aGUgY29udGVudHMgb2YgdGhlIGRhdGEgdHlwZS4gRm9yIGxlc3NcbiAqIHdlbGwgZGVmaW5lZCBpbnB1dHMgdXNlIGNyZWF0ZUFycmF5RnJvbU1peGVkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fGZ1bmN0aW9ufGZpbGVsaXN0fSBvYmpcbiAqIEByZXR1cm4ge2FycmF5fVxuICovXG5mdW5jdGlvbiB0b0FycmF5KG9iaikge1xuICB2YXIgbGVuZ3RoID0gb2JqLmxlbmd0aDtcblxuICAvLyBTb21lIGJyb3dzZXJzIGJ1aWx0aW4gb2JqZWN0cyBjYW4gcmVwb3J0IHR5cGVvZiAnZnVuY3Rpb24nIChlLmcuIE5vZGVMaXN0XG4gIC8vIGluIG9sZCB2ZXJzaW9ucyBvZiBTYWZhcmkpLlxuICAhKCFBcnJheS5pc0FycmF5KG9iaikgJiYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnIHx8IHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndG9BcnJheTogQXJyYXktbGlrZSBvYmplY3QgZXhwZWN0ZWQnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG5cbiAgISh0eXBlb2YgbGVuZ3RoID09PSAnbnVtYmVyJykgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3RvQXJyYXk6IE9iamVjdCBuZWVkcyBhIGxlbmd0aCBwcm9wZXJ0eScpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcblxuICAhKGxlbmd0aCA9PT0gMCB8fCBsZW5ndGggLSAxIGluIG9iaikgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3RvQXJyYXk6IE9iamVjdCBzaG91bGQgaGF2ZSBrZXlzIGZvciBpbmRpY2VzJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuXG4gICEodHlwZW9mIG9iai5jYWxsZWUgIT09ICdmdW5jdGlvbicpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd0b0FycmF5OiBPYmplY3QgY2FuXFwndCBiZSBgYXJndW1lbnRzYC4gVXNlIHJlc3QgcGFyYW1zICcgKyAnKGZ1bmN0aW9uKC4uLmFyZ3MpIHt9KSBvciBBcnJheS5mcm9tKCkgaW5zdGVhZC4nKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG5cbiAgLy8gT2xkIElFIGRvZXNuJ3QgZ2l2ZSBjb2xsZWN0aW9ucyBhY2Nlc3MgdG8gaGFzT3duUHJvcGVydHkuIEFzc3VtZSBpbnB1dHNcbiAgLy8gd2l0aG91dCBtZXRob2Qgd2lsbCB0aHJvdyBkdXJpbmcgdGhlIHNsaWNlIGNhbGwgYW5kIHNraXAgc3RyYWlnaHQgdG8gdGhlXG4gIC8vIGZhbGxiYWNrLlxuICBpZiAob2JqLmhhc093blByb3BlcnR5KSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvYmopO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElFIDwgOSBkb2VzIG5vdCBzdXBwb3J0IEFycmF5I3NsaWNlIG9uIGNvbGxlY3Rpb25zIG9iamVjdHNcbiAgICB9XG4gIH1cblxuICAvLyBGYWxsIGJhY2sgdG8gY29weWluZyBrZXkgYnkga2V5LiBUaGlzIGFzc3VtZXMgYWxsIGtleXMgaGF2ZSBhIHZhbHVlLFxuICAvLyBzbyB3aWxsIG5vdCBwcmVzZXJ2ZSBzcGFyc2VseSBwb3B1bGF0ZWQgaW5wdXRzLlxuICB2YXIgcmV0ID0gQXJyYXkobGVuZ3RoKTtcbiAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGxlbmd0aDsgaWkrKykge1xuICAgIHJldFtpaV0gPSBvYmpbaWldO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogUGVyZm9ybSBhIGhldXJpc3RpYyB0ZXN0IHRvIGRldGVybWluZSBpZiBhbiBvYmplY3QgaXMgXCJhcnJheS1saWtlXCIuXG4gKlxuICogICBBIG1vbmsgYXNrZWQgSm9zaHUsIGEgWmVuIG1hc3RlciwgXCJIYXMgYSBkb2cgQnVkZGhhIG5hdHVyZT9cIlxuICogICBKb3NodSByZXBsaWVkOiBcIk11LlwiXG4gKlxuICogVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIGl0cyBhcmd1bWVudCBoYXMgXCJhcnJheSBuYXR1cmVcIjogaXQgcmV0dXJuc1xuICogdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYW4gYWN0dWFsIGFycmF5LCBhbiBgYXJndW1lbnRzJyBvYmplY3QsIG9yIGFuXG4gKiBIVE1MQ29sbGVjdGlvbiAoZS5nLiBub2RlLmNoaWxkTm9kZXMgb3Igbm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgpKS5cbiAqXG4gKiBJdCB3aWxsIHJldHVybiBmYWxzZSBmb3Igb3RoZXIgYXJyYXktbGlrZSBvYmplY3RzIGxpa2UgRmlsZWxpc3QuXG4gKlxuICogQHBhcmFtIHsqfSBvYmpcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGhhc0FycmF5TmF0dXJlKG9iaikge1xuICByZXR1cm4gKFxuICAgIC8vIG5vdCBudWxsL2ZhbHNlXG4gICAgISFvYmogJiYgKFxuICAgIC8vIGFycmF5cyBhcmUgb2JqZWN0cywgTm9kZUxpc3RzIGFyZSBmdW5jdGlvbnMgaW4gU2FmYXJpXG4gICAgdHlwZW9mIG9iaiA9PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb2JqID09ICdmdW5jdGlvbicpICYmXG4gICAgLy8gcXVhY2tzIGxpa2UgYW4gYXJyYXlcbiAgICAnbGVuZ3RoJyBpbiBvYmogJiZcbiAgICAvLyBub3Qgd2luZG93XG4gICAgISgnc2V0SW50ZXJ2YWwnIGluIG9iaikgJiZcbiAgICAvLyBubyBET00gbm9kZSBzaG91bGQgYmUgY29uc2lkZXJlZCBhbiBhcnJheS1saWtlXG4gICAgLy8gYSAnc2VsZWN0JyBlbGVtZW50IGhhcyAnbGVuZ3RoJyBhbmQgJ2l0ZW0nIHByb3BlcnRpZXMgb24gSUU4XG4gICAgdHlwZW9mIG9iai5ub2RlVHlwZSAhPSAnbnVtYmVyJyAmJiAoXG4gICAgLy8gYSByZWFsIGFycmF5XG4gICAgQXJyYXkuaXNBcnJheShvYmopIHx8XG4gICAgLy8gYXJndW1lbnRzXG4gICAgJ2NhbGxlZScgaW4gb2JqIHx8XG4gICAgLy8gSFRNTENvbGxlY3Rpb24vTm9kZUxpc3RcbiAgICAnaXRlbScgaW4gb2JqKVxuICApO1xufVxuXG4vKipcbiAqIEVuc3VyZSB0aGF0IHRoZSBhcmd1bWVudCBpcyBhbiBhcnJheSBieSB3cmFwcGluZyBpdCBpbiBhbiBhcnJheSBpZiBpdCBpcyBub3QuXG4gKiBDcmVhdGVzIGEgY29weSBvZiB0aGUgYXJndW1lbnQgaWYgaXQgaXMgYWxyZWFkeSBhbiBhcnJheS5cbiAqXG4gKiBUaGlzIGlzIG1vc3RseSB1c2VmdWwgaWRpb21hdGljYWxseTpcbiAqXG4gKiAgIHZhciBjcmVhdGVBcnJheUZyb21NaXhlZCA9IHJlcXVpcmUoJ2NyZWF0ZUFycmF5RnJvbU1peGVkJyk7XG4gKlxuICogICBmdW5jdGlvbiB0YWtlc09uZU9yTW9yZVRoaW5ncyh0aGluZ3MpIHtcbiAqICAgICB0aGluZ3MgPSBjcmVhdGVBcnJheUZyb21NaXhlZCh0aGluZ3MpO1xuICogICAgIC4uLlxuICogICB9XG4gKlxuICogVGhpcyBhbGxvd3MgeW91IHRvIHRyZWF0IGB0aGluZ3MnIGFzIGFuIGFycmF5LCBidXQgYWNjZXB0IHNjYWxhcnMgaW4gdGhlIEFQSS5cbiAqXG4gKiBJZiB5b3UgbmVlZCB0byBjb252ZXJ0IGFuIGFycmF5LWxpa2Ugb2JqZWN0LCBsaWtlIGBhcmd1bWVudHNgLCBpbnRvIGFuIGFycmF5XG4gKiB1c2UgdG9BcnJheSBpbnN0ZWFkLlxuICpcbiAqIEBwYXJhbSB7Kn0gb2JqXG4gKiBAcmV0dXJuIHthcnJheX1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQXJyYXlGcm9tTWl4ZWQob2JqKSB7XG4gIGlmICghaGFzQXJyYXlOYXR1cmUob2JqKSkge1xuICAgIHJldHVybiBbb2JqXTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICByZXR1cm4gb2JqLnNsaWNlKCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHRvQXJyYXkob2JqKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZUFycmF5RnJvbU1peGVkOyIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxuLyplc2xpbnQtZGlzYWJsZSBmYi13d3cvdW5zYWZlLWh0bWwqL1xuXG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCcuL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbnZhciBjcmVhdGVBcnJheUZyb21NaXhlZCA9IHJlcXVpcmUoJy4vY3JlYXRlQXJyYXlGcm9tTWl4ZWQnKTtcbnZhciBnZXRNYXJrdXBXcmFwID0gcmVxdWlyZSgnLi9nZXRNYXJrdXBXcmFwJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnLi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBEdW1teSBjb250YWluZXIgdXNlZCB0byByZW5kZXIgYWxsIG1hcmt1cC5cbiAqL1xudmFyIGR1bW15Tm9kZSA9IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpIDogbnVsbDtcblxuLyoqXG4gKiBQYXR0ZXJuIHVzZWQgYnkgYGdldE5vZGVOYW1lYC5cbiAqL1xudmFyIG5vZGVOYW1lUGF0dGVybiA9IC9eXFxzKjwoXFx3KykvO1xuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBgbm9kZU5hbWVgIG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIGEgc3RyaW5nIG9mIG1hcmt1cC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWFya3VwIFN0cmluZyBvZiBtYXJrdXAuXG4gKiBAcmV0dXJuIHs/c3RyaW5nfSBOb2RlIG5hbWUgb2YgdGhlIHN1cHBsaWVkIG1hcmt1cC5cbiAqL1xuZnVuY3Rpb24gZ2V0Tm9kZU5hbWUobWFya3VwKSB7XG4gIHZhciBub2RlTmFtZU1hdGNoID0gbWFya3VwLm1hdGNoKG5vZGVOYW1lUGF0dGVybik7XG4gIHJldHVybiBub2RlTmFtZU1hdGNoICYmIG5vZGVOYW1lTWF0Y2hbMV0udG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG5vZGVzIHJlbmRlcmVkIGZyb20gdGhlIHN1cHBsaWVkIG1hcmt1cC4gVGhlXG4gKiBvcHRpb25hbGx5IHN1cHBsaWVkIGBoYW5kbGVTY3JpcHRgIGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBvbmNlIGZvciBlYWNoXG4gKiA8c2NyaXB0PiBlbGVtZW50IHRoYXQgaXMgcmVuZGVyZWQuIElmIG5vIGBoYW5kbGVTY3JpcHRgIGZ1bmN0aW9uIGlzIHN1cHBsaWVkLFxuICogYW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiBhbnkgPHNjcmlwdD4gZWxlbWVudHMgYXJlIHJlbmRlcmVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgQSBzdHJpbmcgb2YgdmFsaWQgSFRNTCBtYXJrdXAuXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gaGFuZGxlU2NyaXB0IEludm9rZWQgb25jZSBmb3IgZWFjaCByZW5kZXJlZCA8c2NyaXB0Pi5cbiAqIEByZXR1cm4ge2FycmF5PERPTUVsZW1lbnR8RE9NVGV4dE5vZGU+fSBBbiBhcnJheSBvZiByZW5kZXJlZCBub2Rlcy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlTm9kZXNGcm9tTWFya3VwKG1hcmt1cCwgaGFuZGxlU2NyaXB0KSB7XG4gIHZhciBub2RlID0gZHVtbXlOb2RlO1xuICAhISFkdW1teU5vZGUgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2NyZWF0ZU5vZGVzRnJvbU1hcmt1cCBkdW1teSBub3QgaW5pdGlhbGl6ZWQnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gIHZhciBub2RlTmFtZSA9IGdldE5vZGVOYW1lKG1hcmt1cCk7XG5cbiAgdmFyIHdyYXAgPSBub2RlTmFtZSAmJiBnZXRNYXJrdXBXcmFwKG5vZGVOYW1lKTtcbiAgaWYgKHdyYXApIHtcbiAgICBub2RlLmlubmVySFRNTCA9IHdyYXBbMV0gKyBtYXJrdXAgKyB3cmFwWzJdO1xuXG4gICAgdmFyIHdyYXBEZXB0aCA9IHdyYXBbMF07XG4gICAgd2hpbGUgKHdyYXBEZXB0aC0tKSB7XG4gICAgICBub2RlID0gbm9kZS5sYXN0Q2hpbGQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5vZGUuaW5uZXJIVE1MID0gbWFya3VwO1xuICB9XG5cbiAgdmFyIHNjcmlwdHMgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTtcbiAgaWYgKHNjcmlwdHMubGVuZ3RoKSB7XG4gICAgIWhhbmRsZVNjcmlwdCA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnY3JlYXRlTm9kZXNGcm9tTWFya3VwKC4uLik6IFVuZXhwZWN0ZWQgPHNjcmlwdD4gZWxlbWVudCByZW5kZXJlZC4nKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG4gICAgY3JlYXRlQXJyYXlGcm9tTWl4ZWQoc2NyaXB0cykuZm9yRWFjaChoYW5kbGVTY3JpcHQpO1xuICB9XG5cbiAgdmFyIG5vZGVzID0gQXJyYXkuZnJvbShub2RlLmNoaWxkTm9kZXMpO1xuICB3aGlsZSAobm9kZS5sYXN0Q2hpbGQpIHtcbiAgICBub2RlLnJlbW92ZUNoaWxkKG5vZGUubGFzdENoaWxkKTtcbiAgfVxuICByZXR1cm4gbm9kZXM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlTm9kZXNGcm9tTWFya3VwOyIsIlwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuZnVuY3Rpb24gbWFrZUVtcHR5RnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGFyZztcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGFjY2VwdHMgYW5kIGRpc2NhcmRzIGlucHV0czsgaXQgaGFzIG5vIHNpZGUgZWZmZWN0cy4gVGhpcyBpc1xuICogcHJpbWFyaWx5IHVzZWZ1bCBpZGlvbWF0aWNhbGx5IGZvciBvdmVycmlkYWJsZSBmdW5jdGlvbiBlbmRwb2ludHMgd2hpY2hcbiAqIGFsd2F5cyBuZWVkIHRvIGJlIGNhbGxhYmxlLCBzaW5jZSBKUyBsYWNrcyBhIG51bGwtY2FsbCBpZGlvbSBhbGEgQ29jb2EuXG4gKi9cbnZhciBlbXB0eUZ1bmN0aW9uID0gZnVuY3Rpb24gZW1wdHlGdW5jdGlvbigpIHt9O1xuXG5lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zID0gbWFrZUVtcHR5RnVuY3Rpb247XG5lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zRmFsc2UgPSBtYWtlRW1wdHlGdW5jdGlvbihmYWxzZSk7XG5lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zVHJ1ZSA9IG1ha2VFbXB0eUZ1bmN0aW9uKHRydWUpO1xuZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGwgPSBtYWtlRW1wdHlGdW5jdGlvbihudWxsKTtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUaGlzID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcztcbn07XG5lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zQXJndW1lbnQgPSBmdW5jdGlvbiAoYXJnKSB7XG4gIHJldHVybiBhcmc7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVtcHR5RnVuY3Rpb247IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBlbXB0eU9iamVjdCA9IHt9O1xuXG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgT2JqZWN0LmZyZWV6ZShlbXB0eU9iamVjdCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZW1wdHlPYmplY3Q7IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlIGlucHV0L3RleHRhcmVhIHRvIGZvY3VzXG4gKi9cblxuZnVuY3Rpb24gZm9jdXNOb2RlKG5vZGUpIHtcbiAgLy8gSUU4IGNhbiB0aHJvdyBcIkNhbid0IG1vdmUgZm9jdXMgdG8gdGhlIGNvbnRyb2wgYmVjYXVzZSBpdCBpcyBpbnZpc2libGUsXG4gIC8vIG5vdCBlbmFibGVkLCBvciBvZiBhIHR5cGUgdGhhdCBkb2VzIG5vdCBhY2NlcHQgdGhlIGZvY3VzLlwiIGZvciBhbGwga2luZHMgb2ZcbiAgLy8gcmVhc29ucyB0aGF0IGFyZSB0b28gZXhwZW5zaXZlIGFuZCBmcmFnaWxlIHRvIHRlc3QuXG4gIHRyeSB7XG4gICAgbm9kZS5mb2N1cygpO1xuICB9IGNhdGNoIChlKSB7fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvY3VzTm9kZTsiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbi8qIGVzbGludC1kaXNhYmxlIGZiLXd3dy90eXBlb2YtdW5kZWZpbmVkICovXG5cbi8qKlxuICogU2FtZSBhcyBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGJ1dCB3cmFwcyBpbiBhIHRyeS1jYXRjaCBibG9jay4gSW4gSUUgaXQgaXNcbiAqIG5vdCBzYWZlIHRvIGNhbGwgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBpZiB0aGVyZSBpcyBub3RoaW5nIGZvY3VzZWQuXG4gKlxuICogVGhlIGFjdGl2ZUVsZW1lbnQgd2lsbCBiZSBudWxsIG9ubHkgaWYgdGhlIGRvY3VtZW50IG9yIGRvY3VtZW50IGJvZHkgaXMgbm90XG4gKiB5ZXQgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gez9ET01Eb2N1bWVudH0gZG9jIERlZmF1bHRzIHRvIGN1cnJlbnQgZG9jdW1lbnQuXG4gKiBAcmV0dXJuIHs/RE9NRWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gZ2V0QWN0aXZlRWxlbWVudChkb2MpIC8qP0RPTUVsZW1lbnQqL3tcbiAgZG9jID0gZG9jIHx8ICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnID8gZG9jdW1lbnQgOiB1bmRlZmluZWQpO1xuICBpZiAodHlwZW9mIGRvYyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBkb2MuYWN0aXZlRWxlbWVudCB8fCBkb2MuYm9keTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBkb2MuYm9keTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEFjdGl2ZUVsZW1lbnQ7IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbi8qZXNsaW50LWRpc2FibGUgZmItd3d3L3Vuc2FmZS1odG1sICovXG5cbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJy4vRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJy4vaW52YXJpYW50Jyk7XG5cbi8qKlxuICogRHVtbXkgY29udGFpbmVyIHVzZWQgdG8gZGV0ZWN0IHdoaWNoIHdyYXBzIGFyZSBuZWNlc3NhcnkuXG4gKi9cbnZhciBkdW1teU5vZGUgPSBFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSA6IG51bGw7XG5cbi8qKlxuICogU29tZSBicm93c2VycyBjYW5ub3QgdXNlIGBpbm5lckhUTUxgIHRvIHJlbmRlciBjZXJ0YWluIGVsZW1lbnRzIHN0YW5kYWxvbmUsXG4gKiBzbyB3ZSB3cmFwIHRoZW0sIHJlbmRlciB0aGUgd3JhcHBlZCBub2RlcywgdGhlbiBleHRyYWN0IHRoZSBkZXNpcmVkIG5vZGUuXG4gKlxuICogSW4gSUU4LCBjZXJ0YWluIGVsZW1lbnRzIGNhbm5vdCByZW5kZXIgYWxvbmUsIHNvIHdyYXAgYWxsIGVsZW1lbnRzICgnKicpLlxuICovXG5cbnZhciBzaG91bGRXcmFwID0ge307XG5cbnZhciBzZWxlY3RXcmFwID0gWzEsICc8c2VsZWN0IG11bHRpcGxlPVwidHJ1ZVwiPicsICc8L3NlbGVjdD4nXTtcbnZhciB0YWJsZVdyYXAgPSBbMSwgJzx0YWJsZT4nLCAnPC90YWJsZT4nXTtcbnZhciB0cldyYXAgPSBbMywgJzx0YWJsZT48dGJvZHk+PHRyPicsICc8L3RyPjwvdGJvZHk+PC90YWJsZT4nXTtcblxudmFyIHN2Z1dyYXAgPSBbMSwgJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPicsICc8L3N2Zz4nXTtcblxudmFyIG1hcmt1cFdyYXAgPSB7XG4gICcqJzogWzEsICc/PGRpdj4nLCAnPC9kaXY+J10sXG5cbiAgJ2FyZWEnOiBbMSwgJzxtYXA+JywgJzwvbWFwPiddLFxuICAnY29sJzogWzIsICc8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPicsICc8L2NvbGdyb3VwPjwvdGFibGU+J10sXG4gICdsZWdlbmQnOiBbMSwgJzxmaWVsZHNldD4nLCAnPC9maWVsZHNldD4nXSxcbiAgJ3BhcmFtJzogWzEsICc8b2JqZWN0PicsICc8L29iamVjdD4nXSxcbiAgJ3RyJzogWzIsICc8dGFibGU+PHRib2R5PicsICc8L3Rib2R5PjwvdGFibGU+J10sXG5cbiAgJ29wdGdyb3VwJzogc2VsZWN0V3JhcCxcbiAgJ29wdGlvbic6IHNlbGVjdFdyYXAsXG5cbiAgJ2NhcHRpb24nOiB0YWJsZVdyYXAsXG4gICdjb2xncm91cCc6IHRhYmxlV3JhcCxcbiAgJ3Rib2R5JzogdGFibGVXcmFwLFxuICAndGZvb3QnOiB0YWJsZVdyYXAsXG4gICd0aGVhZCc6IHRhYmxlV3JhcCxcblxuICAndGQnOiB0cldyYXAsXG4gICd0aCc6IHRyV3JhcFxufTtcblxuLy8gSW5pdGlhbGl6ZSB0aGUgU1ZHIGVsZW1lbnRzIHNpbmNlIHdlIGtub3cgdGhleSdsbCBhbHdheXMgbmVlZCB0byBiZSB3cmFwcGVkXG4vLyBjb25zaXN0ZW50bHkuIElmIHRoZXkgYXJlIGNyZWF0ZWQgaW5zaWRlIGEgPGRpdj4gdGhleSB3aWxsIGJlIGluaXRpYWxpemVkIGluXG4vLyB0aGUgd3JvbmcgbmFtZXNwYWNlIChhbmQgd2lsbCBub3QgZGlzcGxheSkuXG52YXIgc3ZnRWxlbWVudHMgPSBbJ2NpcmNsZScsICdjbGlwUGF0aCcsICdkZWZzJywgJ2VsbGlwc2UnLCAnZycsICdpbWFnZScsICdsaW5lJywgJ2xpbmVhckdyYWRpZW50JywgJ21hc2snLCAncGF0aCcsICdwYXR0ZXJuJywgJ3BvbHlnb24nLCAncG9seWxpbmUnLCAncmFkaWFsR3JhZGllbnQnLCAncmVjdCcsICdzdG9wJywgJ3RleHQnLCAndHNwYW4nXTtcbnN2Z0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG5vZGVOYW1lKSB7XG4gIG1hcmt1cFdyYXBbbm9kZU5hbWVdID0gc3ZnV3JhcDtcbiAgc2hvdWxkV3JhcFtub2RlTmFtZV0gPSB0cnVlO1xufSk7XG5cbi8qKlxuICogR2V0cyB0aGUgbWFya3VwIHdyYXAgY29uZmlndXJhdGlvbiBmb3IgdGhlIHN1cHBsaWVkIGBub2RlTmFtZWAuXG4gKlxuICogTk9URTogVGhpcyBsYXppbHkgZGV0ZWN0cyB3aGljaCB3cmFwcyBhcmUgbmVjZXNzYXJ5IGZvciB0aGUgY3VycmVudCBicm93c2VyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBub2RlTmFtZSBMb3dlcmNhc2UgYG5vZGVOYW1lYC5cbiAqIEByZXR1cm4gez9hcnJheX0gTWFya3VwIHdyYXAgY29uZmlndXJhdGlvbiwgaWYgYXBwbGljYWJsZS5cbiAqL1xuZnVuY3Rpb24gZ2V0TWFya3VwV3JhcChub2RlTmFtZSkge1xuICAhISFkdW1teU5vZGUgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ01hcmt1cCB3cmFwcGluZyBub2RlIG5vdCBpbml0aWFsaXplZCcpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgaWYgKCFtYXJrdXBXcmFwLmhhc093blByb3BlcnR5KG5vZGVOYW1lKSkge1xuICAgIG5vZGVOYW1lID0gJyonO1xuICB9XG4gIGlmICghc2hvdWxkV3JhcC5oYXNPd25Qcm9wZXJ0eShub2RlTmFtZSkpIHtcbiAgICBpZiAobm9kZU5hbWUgPT09ICcqJykge1xuICAgICAgZHVtbXlOb2RlLmlubmVySFRNTCA9ICc8bGluayAvPic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGR1bW15Tm9kZS5pbm5lckhUTUwgPSAnPCcgKyBub2RlTmFtZSArICc+PC8nICsgbm9kZU5hbWUgKyAnPic7XG4gICAgfVxuICAgIHNob3VsZFdyYXBbbm9kZU5hbWVdID0gIWR1bW15Tm9kZS5maXJzdENoaWxkO1xuICB9XG4gIHJldHVybiBzaG91bGRXcmFwW25vZGVOYW1lXSA/IG1hcmt1cFdyYXBbbm9kZU5hbWVdIDogbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRNYXJrdXBXcmFwOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBHZXRzIHRoZSBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIHN1cHBsaWVkIGVsZW1lbnQgb3Igd2luZG93LlxuICpcbiAqIFRoZSByZXR1cm4gdmFsdWVzIGFyZSB1bmJvdW5kZWQsIHVubGlrZSBgZ2V0U2Nyb2xsUG9zaXRpb25gLiBUaGlzIG1lYW5zIHRoZXlcbiAqIG1heSBiZSBuZWdhdGl2ZSBvciBleGNlZWQgdGhlIGVsZW1lbnQgYm91bmRhcmllcyAod2hpY2ggaXMgcG9zc2libGUgdXNpbmdcbiAqIGluZXJ0aWFsIHNjcm9sbGluZykuXG4gKlxuICogQHBhcmFtIHtET01XaW5kb3d8RE9NRWxlbWVudH0gc2Nyb2xsYWJsZVxuICogQHJldHVybiB7b2JqZWN0fSBNYXAgd2l0aCBgeGAgYW5kIGB5YCBrZXlzLlxuICovXG5cbmZ1bmN0aW9uIGdldFVuYm91bmRlZFNjcm9sbFBvc2l0aW9uKHNjcm9sbGFibGUpIHtcbiAgaWYgKHNjcm9sbGFibGUuV2luZG93ICYmIHNjcm9sbGFibGUgaW5zdGFuY2VvZiBzY3JvbGxhYmxlLldpbmRvdykge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBzY3JvbGxhYmxlLnBhZ2VYT2Zmc2V0IHx8IHNjcm9sbGFibGUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsXG4gICAgICB5OiBzY3JvbGxhYmxlLnBhZ2VZT2Zmc2V0IHx8IHNjcm9sbGFibGUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB4OiBzY3JvbGxhYmxlLnNjcm9sbExlZnQsXG4gICAgeTogc2Nyb2xsYWJsZS5zY3JvbGxUb3BcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRVbmJvdW5kZWRTY3JvbGxQb3NpdGlvbjsiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbnZhciBfdXBwZXJjYXNlUGF0dGVybiA9IC8oW0EtWl0pL2c7XG5cbi8qKlxuICogSHlwaGVuYXRlcyBhIGNhbWVsY2FzZWQgc3RyaW5nLCBmb3IgZXhhbXBsZTpcbiAqXG4gKiAgID4gaHlwaGVuYXRlKCdiYWNrZ3JvdW5kQ29sb3InKVxuICogICA8IFwiYmFja2dyb3VuZC1jb2xvclwiXG4gKlxuICogRm9yIENTUyBzdHlsZSBuYW1lcywgdXNlIGBoeXBoZW5hdGVTdHlsZU5hbWVgIGluc3RlYWQgd2hpY2ggd29ya3MgcHJvcGVybHlcbiAqIHdpdGggYWxsIHZlbmRvciBwcmVmaXhlcywgaW5jbHVkaW5nIGBtc2AuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBoeXBoZW5hdGUoc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZShfdXBwZXJjYXNlUGF0dGVybiwgJy0kMScpLnRvTG93ZXJDYXNlKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaHlwaGVuYXRlOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGh5cGhlbmF0ZSA9IHJlcXVpcmUoJy4vaHlwaGVuYXRlJyk7XG5cbnZhciBtc1BhdHRlcm4gPSAvXm1zLS87XG5cbi8qKlxuICogSHlwaGVuYXRlcyBhIGNhbWVsY2FzZWQgQ1NTIHByb3BlcnR5IG5hbWUsIGZvciBleGFtcGxlOlxuICpcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ2JhY2tncm91bmRDb2xvcicpXG4gKiAgIDwgXCJiYWNrZ3JvdW5kLWNvbG9yXCJcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ01velRyYW5zaXRpb24nKVxuICogICA8IFwiLW1vei10cmFuc2l0aW9uXCJcbiAqICAgPiBoeXBoZW5hdGVTdHlsZU5hbWUoJ21zVHJhbnNpdGlvbicpXG4gKiAgIDwgXCItbXMtdHJhbnNpdGlvblwiXG4gKlxuICogQXMgTW9kZXJuaXpyIHN1Z2dlc3RzIChodHRwOi8vbW9kZXJuaXpyLmNvbS9kb2NzLyNwcmVmaXhlZCksIGFuIGBtc2AgcHJlZml4XG4gKiBpcyBjb252ZXJ0ZWQgdG8gYC1tcy1gLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gaHlwaGVuYXRlU3R5bGVOYW1lKHN0cmluZykge1xuICByZXR1cm4gaHlwaGVuYXRlKHN0cmluZykucmVwbGFjZShtc1BhdHRlcm4sICctbXMtJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaHlwaGVuYXRlU3R5bGVOYW1lOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFVzZSBpbnZhcmlhbnQoKSB0byBhc3NlcnQgc3RhdGUgd2hpY2ggeW91ciBwcm9ncmFtIGFzc3VtZXMgdG8gYmUgdHJ1ZS5cbiAqXG4gKiBQcm92aWRlIHNwcmludGYtc3R5bGUgZm9ybWF0IChvbmx5ICVzIGlzIHN1cHBvcnRlZCkgYW5kIGFyZ3VtZW50c1xuICogdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGJyb2tlIGFuZCB3aGF0IHlvdSB3ZXJlXG4gKiBleHBlY3RpbmcuXG4gKlxuICogVGhlIGludmFyaWFudCBtZXNzYWdlIHdpbGwgYmUgc3RyaXBwZWQgaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBpbnZhcmlhbnRcbiAqIHdpbGwgcmVtYWluIHRvIGVuc3VyZSBsb2dpYyBkb2VzIG5vdCBkaWZmZXIgaW4gcHJvZHVjdGlvbi5cbiAqL1xuXG52YXIgdmFsaWRhdGVGb3JtYXQgPSBmdW5jdGlvbiB2YWxpZGF0ZUZvcm1hdChmb3JtYXQpIHt9O1xuXG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFsaWRhdGVGb3JtYXQgPSBmdW5jdGlvbiB2YWxpZGF0ZUZvcm1hdChmb3JtYXQpIHtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YXJpYW50IHJlcXVpcmVzIGFuIGVycm9yIG1lc3NhZ2UgYXJndW1lbnQnKTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGludmFyaWFudChjb25kaXRpb24sIGZvcm1hdCwgYSwgYiwgYywgZCwgZSwgZikge1xuICB2YWxpZGF0ZUZvcm1hdChmb3JtYXQpO1xuXG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdmFyIGVycm9yO1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ01pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50ICcgKyAnZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFyZ3MgPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107XG4gICAgICB9KSk7XG4gICAgICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICAgIH1cblxuICAgIGVycm9yLmZyYW1lc1RvUG9wID0gMTsgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCBpbnZhcmlhbnQncyBvd24gZnJhbWVcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGludmFyaWFudDsiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbi8qKlxuICogQHBhcmFtIHsqfSBvYmplY3QgVGhlIG9iamVjdCB0byBjaGVjay5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgb3Igbm90IHRoZSBvYmplY3QgaXMgYSBET00gbm9kZS5cbiAqL1xuZnVuY3Rpb24gaXNOb2RlKG9iamVjdCkge1xuICB2YXIgZG9jID0gb2JqZWN0ID8gb2JqZWN0Lm93bmVyRG9jdW1lbnQgfHwgb2JqZWN0IDogZG9jdW1lbnQ7XG4gIHZhciBkZWZhdWx0VmlldyA9IGRvYy5kZWZhdWx0VmlldyB8fCB3aW5kb3c7XG4gIHJldHVybiAhIShvYmplY3QgJiYgKHR5cGVvZiBkZWZhdWx0Vmlldy5Ob2RlID09PSAnZnVuY3Rpb24nID8gb2JqZWN0IGluc3RhbmNlb2YgZGVmYXVsdFZpZXcuTm9kZSA6IHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIHR5cGVvZiBvYmplY3Qubm9kZVR5cGUgPT09ICdudW1iZXInICYmIHR5cGVvZiBvYmplY3Qubm9kZU5hbWUgPT09ICdzdHJpbmcnKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNOb2RlOyIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxudmFyIGlzTm9kZSA9IHJlcXVpcmUoJy4vaXNOb2RlJyk7XG5cbi8qKlxuICogQHBhcmFtIHsqfSBvYmplY3QgVGhlIG9iamVjdCB0byBjaGVjay5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgb3Igbm90IHRoZSBvYmplY3QgaXMgYSBET00gdGV4dCBub2RlLlxuICovXG5mdW5jdGlvbiBpc1RleHROb2RlKG9iamVjdCkge1xuICByZXR1cm4gaXNOb2RlKG9iamVjdCkgJiYgb2JqZWN0Lm5vZGVUeXBlID09IDM7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNUZXh0Tm9kZTsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKiBAdHlwZWNoZWNrcyBzdGF0aWMtb25seVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNZW1vaXplcyB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIG9uZSBzdHJpbmcgYXJndW1lbnQuXG4gKi9cblxuZnVuY3Rpb24gbWVtb2l6ZVN0cmluZ09ubHkoY2FsbGJhY2spIHtcbiAgdmFyIGNhY2hlID0ge307XG4gIHJldHVybiBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gICAgaWYgKCFjYWNoZS5oYXNPd25Qcm9wZXJ0eShzdHJpbmcpKSB7XG4gICAgICBjYWNoZVtzdHJpbmddID0gY2FsbGJhY2suY2FsbCh0aGlzLCBzdHJpbmcpO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVbc3RyaW5nXTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBtZW1vaXplU3RyaW5nT25seTsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJy4vRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcblxudmFyIHBlcmZvcm1hbmNlO1xuXG5pZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7XG4gIHBlcmZvcm1hbmNlID0gd2luZG93LnBlcmZvcm1hbmNlIHx8IHdpbmRvdy5tc1BlcmZvcm1hbmNlIHx8IHdpbmRvdy53ZWJraXRQZXJmb3JtYW5jZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwZXJmb3JtYW5jZSB8fCB7fTsiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbnZhciBwZXJmb3JtYW5jZSA9IHJlcXVpcmUoJy4vcGVyZm9ybWFuY2UnKTtcblxudmFyIHBlcmZvcm1hbmNlTm93O1xuXG4vKipcbiAqIERldGVjdCBpZiB3ZSBjYW4gdXNlIGB3aW5kb3cucGVyZm9ybWFuY2Uubm93KClgIGFuZCBncmFjZWZ1bGx5IGZhbGxiYWNrIHRvXG4gKiBgRGF0ZS5ub3coKWAgaWYgaXQgZG9lc24ndCBleGlzdC4gV2UgbmVlZCB0byBzdXBwb3J0IEZpcmVmb3ggPCAxNSBmb3Igbm93XG4gKiBiZWNhdXNlIG9mIEZhY2Vib29rJ3MgdGVzdGluZyBpbmZyYXN0cnVjdHVyZS5cbiAqL1xuaWYgKHBlcmZvcm1hbmNlLm5vdykge1xuICBwZXJmb3JtYW5jZU5vdyA9IGZ1bmN0aW9uIHBlcmZvcm1hbmNlTm93KCkge1xuICAgIHJldHVybiBwZXJmb3JtYW5jZS5ub3coKTtcbiAgfTtcbn0gZWxzZSB7XG4gIHBlcmZvcm1hbmNlTm93ID0gZnVuY3Rpb24gcGVyZm9ybWFuY2VOb3coKSB7XG4gICAgcmV0dXJuIERhdGUubm93KCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGVyZm9ybWFuY2VOb3c7IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKiBcbiAqL1xuXG4vKmVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gKi9cbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgLy8gU2FtZVZhbHVlIGFsZ29yaXRobVxuICBpZiAoeCA9PT0geSkge1xuICAgIC8vIFN0ZXBzIDEtNSwgNy0xMFxuICAgIC8vIFN0ZXBzIDYuYi02LmU6ICswICE9IC0wXG4gICAgLy8gQWRkZWQgdGhlIG5vbnplcm8geSBjaGVjayB0byBtYWtlIEZsb3cgaGFwcHksIGJ1dCBpdCBpcyByZWR1bmRhbnRcbiAgICByZXR1cm4geCAhPT0gMCB8fCB5ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgfSBlbHNlIHtcbiAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gIH1cbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBlcXVhbGl0eSBieSBpdGVyYXRpbmcgdGhyb3VnaCBrZXlzIG9uIGFuIG9iamVjdCBhbmQgcmV0dXJuaW5nIGZhbHNlXG4gKiB3aGVuIGFueSBrZXkgaGFzIHZhbHVlcyB3aGljaCBhcmUgbm90IHN0cmljdGx5IGVxdWFsIGJldHdlZW4gdGhlIGFyZ3VtZW50cy5cbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSB2YWx1ZXMgb2YgYWxsIGtleXMgYXJlIHN0cmljdGx5IGVxdWFsLlxuICovXG5mdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQikge1xuICBpZiAoaXMob2JqQSwgb2JqQikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqQSAhPT0gJ29iamVjdCcgfHwgb2JqQSA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqQiAhPT0gJ29iamVjdCcgfHwgb2JqQiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICB2YXIga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcblxuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXNBLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iakIsIGtleXNBW2ldKSB8fCAhaXMob2JqQVtrZXlzQVtpXV0sIG9iakJba2V5c0FbaV1dKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNoYWxsb3dFcXVhbDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE0LTIwMTUsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJy4vZW1wdHlGdW5jdGlvbicpO1xuXG4vKipcbiAqIFNpbWlsYXIgdG8gaW52YXJpYW50IGJ1dCBvbmx5IGxvZ3MgYSB3YXJuaW5nIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gbG9nIGlzc3VlcyBpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMgaW4gY3JpdGljYWxcbiAqIHBhdGhzLiBSZW1vdmluZyB0aGUgbG9nZ2luZyBjb2RlIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50cyB3aWxsIGtlZXAgdGhlXG4gKiBzYW1lIGxvZ2ljIGFuZCBmb2xsb3cgdGhlIHNhbWUgY29kZSBwYXRocy5cbiAqL1xuXG52YXIgd2FybmluZyA9IGVtcHR5RnVuY3Rpb247XG5cbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBwcmludFdhcm5pbmcgPSBmdW5jdGlvbiBwcmludFdhcm5pbmcoZm9ybWF0KSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICsgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107XG4gICAgICB9KTtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIC0tLSBXZWxjb21lIHRvIGRlYnVnZ2luZyBSZWFjdCAtLS1cbiAgICAgICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCB5b3UgY2FuIHVzZSB0aGlzIHN0YWNrXG4gICAgICAgIC8vIHRvIGZpbmQgdGhlIGNhbGxzaXRlIHRoYXQgY2F1c2VkIHRoaXMgd2FybmluZyB0byBmaXJlLlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICB9IGNhdGNoICh4KSB7fVxuICAgIH07XG5cbiAgICB3YXJuaW5nID0gZnVuY3Rpb24gd2FybmluZyhjb25kaXRpb24sIGZvcm1hdCkge1xuICAgICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYHdhcm5pbmcoY29uZGl0aW9uLCBmb3JtYXQsIC4uLmFyZ3MpYCByZXF1aXJlcyBhIHdhcm5pbmcgJyArICdtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtYXQuaW5kZXhPZignRmFpbGVkIENvbXBvc2l0ZSBwcm9wVHlwZTogJykgPT09IDApIHtcbiAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgQ29tcG9zaXRlQ29tcG9uZW50IHByb3B0eXBlIGNoZWNrLlxuICAgICAgfVxuXG4gICAgICBpZiAoIWNvbmRpdGlvbikge1xuICAgICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiA+IDIgPyBfbGVuMiAtIDIgOiAwKSwgX2tleTIgPSAyOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgICAgYXJnc1tfa2V5MiAtIDJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50V2FybmluZy5hcHBseSh1bmRlZmluZWQsIFtmb3JtYXRdLmNvbmNhdChhcmdzKSk7XG4gICAgICB9XG4gICAgfTtcbiAgfSkoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3YXJuaW5nOyIsIi8qIEZpbGVTYXZlci5qc1xuICogQSBzYXZlQXMoKSBGaWxlU2F2ZXIgaW1wbGVtZW50YXRpb24uXG4gKiAxLjEuMjAxNTA3MTZcbiAqXG4gKiBCeSBFbGkgR3JleSwgaHR0cDovL2VsaWdyZXkuY29tXG4gKiBMaWNlbnNlOiBYMTEvTUlUXG4gKiAgIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZWxpZ3JleS9GaWxlU2F2ZXIuanMvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZFxuICovXG5cbi8qZ2xvYmFsIHNlbGYgKi9cbi8qanNsaW50IGJpdHdpc2U6IHRydWUsIGluZGVudDogNCwgbGF4YnJlYWs6IHRydWUsIGxheGNvbW1hOiB0cnVlLCBzbWFydHRhYnM6IHRydWUsIHBsdXNwbHVzOiB0cnVlICovXG5cbi8qISBAc291cmNlIGh0dHA6Ly9wdXJsLmVsaWdyZXkuY29tL2dpdGh1Yi9GaWxlU2F2ZXIuanMvYmxvYi9tYXN0ZXIvRmlsZVNhdmVyLmpzICovXG5cbnZhciBzYXZlQXMgPSBzYXZlQXMgfHwgKGZ1bmN0aW9uKHZpZXcpIHtcblx0XCJ1c2Ugc3RyaWN0XCI7XG5cdC8vIElFIDwxMCBpcyBleHBsaWNpdGx5IHVuc3VwcG9ydGVkXG5cdGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIC9NU0lFIFsxLTldXFwuLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHZhclxuXHRcdCAgZG9jID0gdmlldy5kb2N1bWVudFxuXHRcdCAgLy8gb25seSBnZXQgVVJMIHdoZW4gbmVjZXNzYXJ5IGluIGNhc2UgQmxvYi5qcyBoYXNuJ3Qgb3ZlcnJpZGRlbiBpdCB5ZXRcblx0XHQsIGdldF9VUkwgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB2aWV3LlVSTCB8fCB2aWV3LndlYmtpdFVSTCB8fCB2aWV3O1xuXHRcdH1cblx0XHQsIHNhdmVfbGluayA9IGRvYy5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sXCIsIFwiYVwiKVxuXHRcdCwgY2FuX3VzZV9zYXZlX2xpbmsgPSBcImRvd25sb2FkXCIgaW4gc2F2ZV9saW5rXG5cdFx0LCBjbGljayA9IGZ1bmN0aW9uKG5vZGUpIHtcblx0XHRcdHZhciBldmVudCA9IG5ldyBNb3VzZUV2ZW50KFwiY2xpY2tcIik7XG5cdFx0XHRub2RlLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXHRcdH1cblx0XHQsIHdlYmtpdF9yZXFfZnMgPSB2aWV3LndlYmtpdFJlcXVlc3RGaWxlU3lzdGVtXG5cdFx0LCByZXFfZnMgPSB2aWV3LnJlcXVlc3RGaWxlU3lzdGVtIHx8IHdlYmtpdF9yZXFfZnMgfHwgdmlldy5tb3pSZXF1ZXN0RmlsZVN5c3RlbVxuXHRcdCwgdGhyb3dfb3V0c2lkZSA9IGZ1bmN0aW9uKGV4KSB7XG5cdFx0XHQodmlldy5zZXRJbW1lZGlhdGUgfHwgdmlldy5zZXRUaW1lb3V0KShmdW5jdGlvbigpIHtcblx0XHRcdFx0dGhyb3cgZXg7XG5cdFx0XHR9LCAwKTtcblx0XHR9XG5cdFx0LCBmb3JjZV9zYXZlYWJsZV90eXBlID0gXCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1cIlxuXHRcdCwgZnNfbWluX3NpemUgPSAwXG5cdFx0Ly8gU2VlIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNzUyOTcjYzcgYW5kXG5cdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2VsaWdyZXkvRmlsZVNhdmVyLmpzL2NvbW1pdC80ODU5MzBhI2NvbW1pdGNvbW1lbnQtODc2ODA0N1xuXHRcdC8vIGZvciB0aGUgcmVhc29uaW5nIGJlaGluZCB0aGUgdGltZW91dCBhbmQgcmV2b2NhdGlvbiBmbG93XG5cdFx0LCBhcmJpdHJhcnlfcmV2b2tlX3RpbWVvdXQgPSA1MDAgLy8gaW4gbXNcblx0XHQsIHJldm9rZSA9IGZ1bmN0aW9uKGZpbGUpIHtcblx0XHRcdHZhciByZXZva2VyID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICh0eXBlb2YgZmlsZSA9PT0gXCJzdHJpbmdcIikgeyAvLyBmaWxlIGlzIGFuIG9iamVjdCBVUkxcblx0XHRcdFx0XHRnZXRfVVJMKCkucmV2b2tlT2JqZWN0VVJMKGZpbGUpO1xuXHRcdFx0XHR9IGVsc2UgeyAvLyBmaWxlIGlzIGEgRmlsZVxuXHRcdFx0XHRcdGZpbGUucmVtb3ZlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRpZiAodmlldy5jaHJvbWUpIHtcblx0XHRcdFx0cmV2b2tlcigpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2V0VGltZW91dChyZXZva2VyLCBhcmJpdHJhcnlfcmV2b2tlX3RpbWVvdXQpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQsIGRpc3BhdGNoID0gZnVuY3Rpb24oZmlsZXNhdmVyLCBldmVudF90eXBlcywgZXZlbnQpIHtcblx0XHRcdGV2ZW50X3R5cGVzID0gW10uY29uY2F0KGV2ZW50X3R5cGVzKTtcblx0XHRcdHZhciBpID0gZXZlbnRfdHlwZXMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGktLSkge1xuXHRcdFx0XHR2YXIgbGlzdGVuZXIgPSBmaWxlc2F2ZXJbXCJvblwiICsgZXZlbnRfdHlwZXNbaV1dO1xuXHRcdFx0XHRpZiAodHlwZW9mIGxpc3RlbmVyID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0bGlzdGVuZXIuY2FsbChmaWxlc2F2ZXIsIGV2ZW50IHx8IGZpbGVzYXZlcik7XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXgpIHtcblx0XHRcdFx0XHRcdHRocm93X291dHNpZGUoZXgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHQsIGF1dG9fYm9tID0gZnVuY3Rpb24oYmxvYikge1xuXHRcdFx0Ly8gcHJlcGVuZCBCT00gZm9yIFVURi04IFhNTCBhbmQgdGV4dC8qIHR5cGVzIChpbmNsdWRpbmcgSFRNTClcblx0XHRcdGlmICgvXlxccyooPzp0ZXh0XFwvXFxTKnxhcHBsaWNhdGlvblxcL3htbHxcXFMqXFwvXFxTKlxcK3htbClcXHMqOy4qY2hhcnNldFxccyo9XFxzKnV0Zi04L2kudGVzdChibG9iLnR5cGUpKSB7XG5cdFx0XHRcdHJldHVybiBuZXcgQmxvYihbXCJcXHVmZWZmXCIsIGJsb2JdLCB7dHlwZTogYmxvYi50eXBlfSk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYmxvYjtcblx0XHR9XG5cdFx0LCBGaWxlU2F2ZXIgPSBmdW5jdGlvbihibG9iLCBuYW1lLCBub19hdXRvX2JvbSkge1xuXHRcdFx0aWYgKCFub19hdXRvX2JvbSkge1xuXHRcdFx0XHRibG9iID0gYXV0b19ib20oYmxvYik7XG5cdFx0XHR9XG5cdFx0XHQvLyBGaXJzdCB0cnkgYS5kb3dubG9hZCwgdGhlbiB3ZWIgZmlsZXN5c3RlbSwgdGhlbiBvYmplY3QgVVJMc1xuXHRcdFx0dmFyXG5cdFx0XHRcdCAgZmlsZXNhdmVyID0gdGhpc1xuXHRcdFx0XHQsIHR5cGUgPSBibG9iLnR5cGVcblx0XHRcdFx0LCBibG9iX2NoYW5nZWQgPSBmYWxzZVxuXHRcdFx0XHQsIG9iamVjdF91cmxcblx0XHRcdFx0LCB0YXJnZXRfdmlld1xuXHRcdFx0XHQsIGRpc3BhdGNoX2FsbCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGRpc3BhdGNoKGZpbGVzYXZlciwgXCJ3cml0ZXN0YXJ0IHByb2dyZXNzIHdyaXRlIHdyaXRlZW5kXCIuc3BsaXQoXCIgXCIpKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBvbiBhbnkgZmlsZXN5cyBlcnJvcnMgcmV2ZXJ0IHRvIHNhdmluZyB3aXRoIG9iamVjdCBVUkxzXG5cdFx0XHRcdCwgZnNfZXJyb3IgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHQvLyBkb24ndCBjcmVhdGUgbW9yZSBvYmplY3QgVVJMcyB0aGFuIG5lZWRlZFxuXHRcdFx0XHRcdGlmIChibG9iX2NoYW5nZWQgfHwgIW9iamVjdF91cmwpIHtcblx0XHRcdFx0XHRcdG9iamVjdF91cmwgPSBnZXRfVVJMKCkuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAodGFyZ2V0X3ZpZXcpIHtcblx0XHRcdFx0XHRcdHRhcmdldF92aWV3LmxvY2F0aW9uLmhyZWYgPSBvYmplY3RfdXJsO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR2YXIgbmV3X3RhYiA9IHZpZXcub3BlbihvYmplY3RfdXJsLCBcIl9ibGFua1wiKTtcblx0XHRcdFx0XHRcdGlmIChuZXdfdGFiID09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc2FmYXJpICE9PSBcInVuZGVmaW5lZFwiKSB7XG5cdFx0XHRcdFx0XHRcdC8vQXBwbGUgZG8gbm90IGFsbG93IHdpbmRvdy5vcGVuLCBzZWUgaHR0cDovL2JpdC5seS8xa1pmZlJJXG5cdFx0XHRcdFx0XHRcdHZpZXcubG9jYXRpb24uaHJlZiA9IG9iamVjdF91cmxcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuRE9ORTtcblx0XHRcdFx0XHRkaXNwYXRjaF9hbGwoKTtcblx0XHRcdFx0XHRyZXZva2Uob2JqZWN0X3VybCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0LCBhYm9ydGFibGUgPSBmdW5jdGlvbihmdW5jKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0aWYgKGZpbGVzYXZlci5yZWFkeVN0YXRlICE9PSBmaWxlc2F2ZXIuRE9ORSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZnVuYy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblx0XHRcdFx0LCBjcmVhdGVfaWZfbm90X2ZvdW5kID0ge2NyZWF0ZTogdHJ1ZSwgZXhjbHVzaXZlOiBmYWxzZX1cblx0XHRcdFx0LCBzbGljZVxuXHRcdFx0O1xuXHRcdFx0ZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuSU5JVDtcblx0XHRcdGlmICghbmFtZSkge1xuXHRcdFx0XHRuYW1lID0gXCJkb3dubG9hZFwiO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGNhbl91c2Vfc2F2ZV9saW5rKSB7XG5cdFx0XHRcdG9iamVjdF91cmwgPSBnZXRfVVJMKCkuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuXHRcdFx0XHRzYXZlX2xpbmsuaHJlZiA9IG9iamVjdF91cmw7XG5cdFx0XHRcdHNhdmVfbGluay5kb3dubG9hZCA9IG5hbWU7XG5cdFx0XHRcdHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0Y2xpY2soc2F2ZV9saW5rKTtcblx0XHRcdFx0XHRkaXNwYXRjaF9hbGwoKTtcblx0XHRcdFx0XHRyZXZva2Uob2JqZWN0X3VybCk7XG5cdFx0XHRcdFx0ZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuRE9ORTtcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdC8vIE9iamVjdCBhbmQgd2ViIGZpbGVzeXN0ZW0gVVJMcyBoYXZlIGEgcHJvYmxlbSBzYXZpbmcgaW4gR29vZ2xlIENocm9tZSB3aGVuXG5cdFx0XHQvLyB2aWV3ZWQgaW4gYSB0YWIsIHNvIEkgZm9yY2Ugc2F2ZSB3aXRoIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVxuXHRcdFx0Ly8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9OTExNThcblx0XHRcdC8vIFVwZGF0ZTogR29vZ2xlIGVycmFudGx5IGNsb3NlZCA5MTE1OCwgSSBzdWJtaXR0ZWQgaXQgYWdhaW46XG5cdFx0XHQvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzg5NjQyXG5cdFx0XHRpZiAodmlldy5jaHJvbWUgJiYgdHlwZSAmJiB0eXBlICE9PSBmb3JjZV9zYXZlYWJsZV90eXBlKSB7XG5cdFx0XHRcdHNsaWNlID0gYmxvYi5zbGljZSB8fCBibG9iLndlYmtpdFNsaWNlO1xuXHRcdFx0XHRibG9iID0gc2xpY2UuY2FsbChibG9iLCAwLCBibG9iLnNpemUsIGZvcmNlX3NhdmVhYmxlX3R5cGUpO1xuXHRcdFx0XHRibG9iX2NoYW5nZWQgPSB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0Ly8gU2luY2UgSSBjYW4ndCBiZSBzdXJlIHRoYXQgdGhlIGd1ZXNzZWQgbWVkaWEgdHlwZSB3aWxsIHRyaWdnZXIgYSBkb3dubG9hZFxuXHRcdFx0Ly8gaW4gV2ViS2l0LCBJIGFwcGVuZCAuZG93bmxvYWQgdG8gdGhlIGZpbGVuYW1lLlxuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTY1NDQwXG5cdFx0XHRpZiAod2Via2l0X3JlcV9mcyAmJiBuYW1lICE9PSBcImRvd25sb2FkXCIpIHtcblx0XHRcdFx0bmFtZSArPSBcIi5kb3dubG9hZFwiO1xuXHRcdFx0fVxuXHRcdFx0aWYgKHR5cGUgPT09IGZvcmNlX3NhdmVhYmxlX3R5cGUgfHwgd2Via2l0X3JlcV9mcykge1xuXHRcdFx0XHR0YXJnZXRfdmlldyA9IHZpZXc7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIXJlcV9mcykge1xuXHRcdFx0XHRmc19lcnJvcigpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRmc19taW5fc2l6ZSArPSBibG9iLnNpemU7XG5cdFx0XHRyZXFfZnModmlldy5URU1QT1JBUlksIGZzX21pbl9zaXplLCBhYm9ydGFibGUoZnVuY3Rpb24oZnMpIHtcblx0XHRcdFx0ZnMucm9vdC5nZXREaXJlY3RvcnkoXCJzYXZlZFwiLCBjcmVhdGVfaWZfbm90X2ZvdW5kLCBhYm9ydGFibGUoZnVuY3Rpb24oZGlyKSB7XG5cdFx0XHRcdFx0dmFyIHNhdmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdGRpci5nZXRGaWxlKG5hbWUsIGNyZWF0ZV9pZl9ub3RfZm91bmQsIGFib3J0YWJsZShmdW5jdGlvbihmaWxlKSB7XG5cdFx0XHRcdFx0XHRcdGZpbGUuY3JlYXRlV3JpdGVyKGFib3J0YWJsZShmdW5jdGlvbih3cml0ZXIpIHtcblx0XHRcdFx0XHRcdFx0XHR3cml0ZXIub253cml0ZWVuZCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR0YXJnZXRfdmlldy5sb2NhdGlvbi5ocmVmID0gZmlsZS50b1VSTCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuRE9ORTtcblx0XHRcdFx0XHRcdFx0XHRcdGRpc3BhdGNoKGZpbGVzYXZlciwgXCJ3cml0ZWVuZFwiLCBldmVudCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXZva2UoZmlsZSk7XG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHR3cml0ZXIub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIGVycm9yID0gd3JpdGVyLmVycm9yO1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGVycm9yLmNvZGUgIT09IGVycm9yLkFCT1JUX0VSUikge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRmc19lcnJvcigpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0XCJ3cml0ZXN0YXJ0IHByb2dyZXNzIHdyaXRlIGFib3J0XCIuc3BsaXQoXCIgXCIpLmZvckVhY2goZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHdyaXRlcltcIm9uXCIgKyBldmVudF0gPSBmaWxlc2F2ZXJbXCJvblwiICsgZXZlbnRdO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdHdyaXRlci53cml0ZShibG9iKTtcblx0XHRcdFx0XHRcdFx0XHRmaWxlc2F2ZXIuYWJvcnQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHdyaXRlci5hYm9ydCgpO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuRE9ORTtcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdGZpbGVzYXZlci5yZWFkeVN0YXRlID0gZmlsZXNhdmVyLldSSVRJTkc7XG5cdFx0XHRcdFx0XHRcdH0pLCBmc19lcnJvcik7XG5cdFx0XHRcdFx0XHR9KSwgZnNfZXJyb3IpO1xuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0ZGlyLmdldEZpbGUobmFtZSwge2NyZWF0ZTogZmFsc2V9LCBhYm9ydGFibGUoZnVuY3Rpb24oZmlsZSkge1xuXHRcdFx0XHRcdFx0Ly8gZGVsZXRlIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHNcblx0XHRcdFx0XHRcdGZpbGUucmVtb3ZlKCk7XG5cdFx0XHRcdFx0XHRzYXZlKCk7XG5cdFx0XHRcdFx0fSksIGFib3J0YWJsZShmdW5jdGlvbihleCkge1xuXHRcdFx0XHRcdFx0aWYgKGV4LmNvZGUgPT09IGV4Lk5PVF9GT1VORF9FUlIpIHtcblx0XHRcdFx0XHRcdFx0c2F2ZSgpO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0ZnNfZXJyb3IoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSk7XG5cdFx0XHRcdH0pLCBmc19lcnJvcik7XG5cdFx0XHR9KSwgZnNfZXJyb3IpO1xuXHRcdH1cblx0XHQsIEZTX3Byb3RvID0gRmlsZVNhdmVyLnByb3RvdHlwZVxuXHRcdCwgc2F2ZUFzID0gZnVuY3Rpb24oYmxvYiwgbmFtZSwgbm9fYXV0b19ib20pIHtcblx0XHRcdHJldHVybiBuZXcgRmlsZVNhdmVyKGJsb2IsIG5hbWUsIG5vX2F1dG9fYm9tKTtcblx0XHR9XG5cdDtcblx0Ly8gSUUgMTArIChuYXRpdmUgc2F2ZUFzKVxuXHRpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYikge1xuXHRcdHJldHVybiBmdW5jdGlvbihibG9iLCBuYW1lLCBub19hdXRvX2JvbSkge1xuXHRcdFx0aWYgKCFub19hdXRvX2JvbSkge1xuXHRcdFx0XHRibG9iID0gYXV0b19ib20oYmxvYik7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbmF2aWdhdG9yLm1zU2F2ZU9yT3BlbkJsb2IoYmxvYiwgbmFtZSB8fCBcImRvd25sb2FkXCIpO1xuXHRcdH07XG5cdH1cblxuXHRGU19wcm90by5hYm9ydCA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBmaWxlc2F2ZXIgPSB0aGlzO1xuXHRcdGZpbGVzYXZlci5yZWFkeVN0YXRlID0gZmlsZXNhdmVyLkRPTkU7XG5cdFx0ZGlzcGF0Y2goZmlsZXNhdmVyLCBcImFib3J0XCIpO1xuXHR9O1xuXHRGU19wcm90by5yZWFkeVN0YXRlID0gRlNfcHJvdG8uSU5JVCA9IDA7XG5cdEZTX3Byb3RvLldSSVRJTkcgPSAxO1xuXHRGU19wcm90by5ET05FID0gMjtcblxuXHRGU19wcm90by5lcnJvciA9XG5cdEZTX3Byb3RvLm9ud3JpdGVzdGFydCA9XG5cdEZTX3Byb3RvLm9ucHJvZ3Jlc3MgPVxuXHRGU19wcm90by5vbndyaXRlID1cblx0RlNfcHJvdG8ub25hYm9ydCA9XG5cdEZTX3Byb3RvLm9uZXJyb3IgPVxuXHRGU19wcm90by5vbndyaXRlZW5kID1cblx0XHRudWxsO1xuXG5cdHJldHVybiBzYXZlQXM7XG59KFxuXHQgICB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiAmJiBzZWxmXG5cdHx8IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93XG5cdHx8IHRoaXMuY29udGVudFxuKSk7XG4vLyBgc2VsZmAgaXMgdW5kZWZpbmVkIGluIEZpcmVmb3ggZm9yIEFuZHJvaWQgY29udGVudCBzY3JpcHQgY29udGV4dFxuLy8gd2hpbGUgYHRoaXNgIGlzIG5zSUNvbnRlbnRGcmFtZU1lc3NhZ2VNYW5hZ2VyXG4vLyB3aXRoIGFuIGF0dHJpYnV0ZSBgY29udGVudGAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgd2luZG93XG5cbmlmICh0eXBlb2YgbW9kdWxlICE9PSBcInVuZGVmaW5lZFwiICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gIG1vZHVsZS5leHBvcnRzLnNhdmVBcyA9IHNhdmVBcztcbn0gZWxzZSBpZiAoKHR5cGVvZiBkZWZpbmUgIT09IFwidW5kZWZpbmVkXCIgJiYgZGVmaW5lICE9PSBudWxsKSAmJiAoZGVmaW5lLmFtZCAhPSBudWxsKSkge1xuICBkZWZpbmUoW10sIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBzYXZlQXM7XG4gIH0pO1xufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbm1vZHVsZS5leHBvcnRzLkRpc3BhdGNoZXIgPSByZXF1aXJlKCcuL2xpYi9EaXNwYXRjaGVyJyk7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIERpc3BhdGNoZXJcbiAqIFxuICogQHByZXZlbnRNdW5nZVxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxudmFyIF9wcmVmaXggPSAnSURfJztcblxuLyoqXG4gKiBEaXNwYXRjaGVyIGlzIHVzZWQgdG8gYnJvYWRjYXN0IHBheWxvYWRzIHRvIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLiBUaGlzIGlzXG4gKiBkaWZmZXJlbnQgZnJvbSBnZW5lcmljIHB1Yi1zdWIgc3lzdGVtcyBpbiB0d28gd2F5czpcbiAqXG4gKiAgIDEpIENhbGxiYWNrcyBhcmUgbm90IHN1YnNjcmliZWQgdG8gcGFydGljdWxhciBldmVudHMuIEV2ZXJ5IHBheWxvYWQgaXNcbiAqICAgICAgZGlzcGF0Y2hlZCB0byBldmVyeSByZWdpc3RlcmVkIGNhbGxiYWNrLlxuICogICAyKSBDYWxsYmFja3MgY2FuIGJlIGRlZmVycmVkIGluIHdob2xlIG9yIHBhcnQgdW50aWwgb3RoZXIgY2FsbGJhY2tzIGhhdmVcbiAqICAgICAgYmVlbiBleGVjdXRlZC5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhpcyBoeXBvdGhldGljYWwgZmxpZ2h0IGRlc3RpbmF0aW9uIGZvcm0sIHdoaWNoXG4gKiBzZWxlY3RzIGEgZGVmYXVsdCBjaXR5IHdoZW4gYSBjb3VudHJ5IGlzIHNlbGVjdGVkOlxuICpcbiAqICAgdmFyIGZsaWdodERpc3BhdGNoZXIgPSBuZXcgRGlzcGF0Y2hlcigpO1xuICpcbiAqICAgLy8gS2VlcHMgdHJhY2sgb2Ygd2hpY2ggY291bnRyeSBpcyBzZWxlY3RlZFxuICogICB2YXIgQ291bnRyeVN0b3JlID0ge2NvdW50cnk6IG51bGx9O1xuICpcbiAqICAgLy8gS2VlcHMgdHJhY2sgb2Ygd2hpY2ggY2l0eSBpcyBzZWxlY3RlZFxuICogICB2YXIgQ2l0eVN0b3JlID0ge2NpdHk6IG51bGx9O1xuICpcbiAqICAgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIGJhc2UgZmxpZ2h0IHByaWNlIG9mIHRoZSBzZWxlY3RlZCBjaXR5XG4gKiAgIHZhciBGbGlnaHRQcmljZVN0b3JlID0ge3ByaWNlOiBudWxsfVxuICpcbiAqIFdoZW4gYSB1c2VyIGNoYW5nZXMgdGhlIHNlbGVjdGVkIGNpdHksIHdlIGRpc3BhdGNoIHRoZSBwYXlsb2FkOlxuICpcbiAqICAgZmxpZ2h0RGlzcGF0Y2hlci5kaXNwYXRjaCh7XG4gKiAgICAgYWN0aW9uVHlwZTogJ2NpdHktdXBkYXRlJyxcbiAqICAgICBzZWxlY3RlZENpdHk6ICdwYXJpcydcbiAqICAgfSk7XG4gKlxuICogVGhpcyBwYXlsb2FkIGlzIGRpZ2VzdGVkIGJ5IGBDaXR5U3RvcmVgOlxuICpcbiAqICAgZmxpZ2h0RGlzcGF0Y2hlci5yZWdpc3RlcihmdW5jdGlvbihwYXlsb2FkKSB7XG4gKiAgICAgaWYgKHBheWxvYWQuYWN0aW9uVHlwZSA9PT0gJ2NpdHktdXBkYXRlJykge1xuICogICAgICAgQ2l0eVN0b3JlLmNpdHkgPSBwYXlsb2FkLnNlbGVjdGVkQ2l0eTtcbiAqICAgICB9XG4gKiAgIH0pO1xuICpcbiAqIFdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhIGNvdW50cnksIHdlIGRpc3BhdGNoIHRoZSBwYXlsb2FkOlxuICpcbiAqICAgZmxpZ2h0RGlzcGF0Y2hlci5kaXNwYXRjaCh7XG4gKiAgICAgYWN0aW9uVHlwZTogJ2NvdW50cnktdXBkYXRlJyxcbiAqICAgICBzZWxlY3RlZENvdW50cnk6ICdhdXN0cmFsaWEnXG4gKiAgIH0pO1xuICpcbiAqIFRoaXMgcGF5bG9hZCBpcyBkaWdlc3RlZCBieSBib3RoIHN0b3JlczpcbiAqXG4gKiAgIENvdW50cnlTdG9yZS5kaXNwYXRjaFRva2VuID0gZmxpZ2h0RGlzcGF0Y2hlci5yZWdpc3RlcihmdW5jdGlvbihwYXlsb2FkKSB7XG4gKiAgICAgaWYgKHBheWxvYWQuYWN0aW9uVHlwZSA9PT0gJ2NvdW50cnktdXBkYXRlJykge1xuICogICAgICAgQ291bnRyeVN0b3JlLmNvdW50cnkgPSBwYXlsb2FkLnNlbGVjdGVkQ291bnRyeTtcbiAqICAgICB9XG4gKiAgIH0pO1xuICpcbiAqIFdoZW4gdGhlIGNhbGxiYWNrIHRvIHVwZGF0ZSBgQ291bnRyeVN0b3JlYCBpcyByZWdpc3RlcmVkLCB3ZSBzYXZlIGEgcmVmZXJlbmNlXG4gKiB0byB0aGUgcmV0dXJuZWQgdG9rZW4uIFVzaW5nIHRoaXMgdG9rZW4gd2l0aCBgd2FpdEZvcigpYCwgd2UgY2FuIGd1YXJhbnRlZVxuICogdGhhdCBgQ291bnRyeVN0b3JlYCBpcyB1cGRhdGVkIGJlZm9yZSB0aGUgY2FsbGJhY2sgdGhhdCB1cGRhdGVzIGBDaXR5U3RvcmVgXG4gKiBuZWVkcyB0byBxdWVyeSBpdHMgZGF0YS5cbiAqXG4gKiAgIENpdHlTdG9yZS5kaXNwYXRjaFRva2VuID0gZmxpZ2h0RGlzcGF0Y2hlci5yZWdpc3RlcihmdW5jdGlvbihwYXlsb2FkKSB7XG4gKiAgICAgaWYgKHBheWxvYWQuYWN0aW9uVHlwZSA9PT0gJ2NvdW50cnktdXBkYXRlJykge1xuICogICAgICAgLy8gYENvdW50cnlTdG9yZS5jb3VudHJ5YCBtYXkgbm90IGJlIHVwZGF0ZWQuXG4gKiAgICAgICBmbGlnaHREaXNwYXRjaGVyLndhaXRGb3IoW0NvdW50cnlTdG9yZS5kaXNwYXRjaFRva2VuXSk7XG4gKiAgICAgICAvLyBgQ291bnRyeVN0b3JlLmNvdW50cnlgIGlzIG5vdyBndWFyYW50ZWVkIHRvIGJlIHVwZGF0ZWQuXG4gKlxuICogICAgICAgLy8gU2VsZWN0IHRoZSBkZWZhdWx0IGNpdHkgZm9yIHRoZSBuZXcgY291bnRyeVxuICogICAgICAgQ2l0eVN0b3JlLmNpdHkgPSBnZXREZWZhdWx0Q2l0eUZvckNvdW50cnkoQ291bnRyeVN0b3JlLmNvdW50cnkpO1xuICogICAgIH1cbiAqICAgfSk7XG4gKlxuICogVGhlIHVzYWdlIG9mIGB3YWl0Rm9yKClgIGNhbiBiZSBjaGFpbmVkLCBmb3IgZXhhbXBsZTpcbiAqXG4gKiAgIEZsaWdodFByaWNlU3RvcmUuZGlzcGF0Y2hUb2tlbiA9XG4gKiAgICAgZmxpZ2h0RGlzcGF0Y2hlci5yZWdpc3RlcihmdW5jdGlvbihwYXlsb2FkKSB7XG4gKiAgICAgICBzd2l0Y2ggKHBheWxvYWQuYWN0aW9uVHlwZSkge1xuICogICAgICAgICBjYXNlICdjb3VudHJ5LXVwZGF0ZSc6XG4gKiAgICAgICAgIGNhc2UgJ2NpdHktdXBkYXRlJzpcbiAqICAgICAgICAgICBmbGlnaHREaXNwYXRjaGVyLndhaXRGb3IoW0NpdHlTdG9yZS5kaXNwYXRjaFRva2VuXSk7XG4gKiAgICAgICAgICAgRmxpZ2h0UHJpY2VTdG9yZS5wcmljZSA9XG4gKiAgICAgICAgICAgICBnZXRGbGlnaHRQcmljZVN0b3JlKENvdW50cnlTdG9yZS5jb3VudHJ5LCBDaXR5U3RvcmUuY2l0eSk7XG4gKiAgICAgICAgICAgYnJlYWs7XG4gKiAgICAgfVxuICogICB9KTtcbiAqXG4gKiBUaGUgYGNvdW50cnktdXBkYXRlYCBwYXlsb2FkIHdpbGwgYmUgZ3VhcmFudGVlZCB0byBpbnZva2UgdGhlIHN0b3JlcydcbiAqIHJlZ2lzdGVyZWQgY2FsbGJhY2tzIGluIG9yZGVyOiBgQ291bnRyeVN0b3JlYCwgYENpdHlTdG9yZWAsIHRoZW5cbiAqIGBGbGlnaHRQcmljZVN0b3JlYC5cbiAqL1xuXG52YXIgRGlzcGF0Y2hlciA9IChmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIERpc3BhdGNoZXIoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERpc3BhdGNoZXIpO1xuXG4gICAgdGhpcy5fY2FsbGJhY2tzID0ge307XG4gICAgdGhpcy5faXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICAgIHRoaXMuX2lzSGFuZGxlZCA9IHt9O1xuICAgIHRoaXMuX2lzUGVuZGluZyA9IHt9O1xuICAgIHRoaXMuX2xhc3RJRCA9IDE7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aXRoIGV2ZXJ5IGRpc3BhdGNoZWQgcGF5bG9hZC4gUmV0dXJuc1xuICAgKiBhIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBgd2FpdEZvcigpYC5cbiAgICovXG5cbiAgRGlzcGF0Y2hlci5wcm90b3R5cGUucmVnaXN0ZXIgPSBmdW5jdGlvbiByZWdpc3RlcihjYWxsYmFjaykge1xuICAgIHZhciBpZCA9IF9wcmVmaXggKyB0aGlzLl9sYXN0SUQrKztcbiAgICB0aGlzLl9jYWxsYmFja3NbaWRdID0gY2FsbGJhY2s7XG4gICAgcmV0dXJuIGlkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgYmFzZWQgb24gaXRzIHRva2VuLlxuICAgKi9cblxuICBEaXNwYXRjaGVyLnByb3RvdHlwZS51bnJlZ2lzdGVyID0gZnVuY3Rpb24gdW5yZWdpc3RlcihpZCkge1xuICAgICF0aGlzLl9jYWxsYmFja3NbaWRdID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0Rpc3BhdGNoZXIudW5yZWdpc3RlciguLi4pOiBgJXNgIGRvZXMgbm90IG1hcCB0byBhIHJlZ2lzdGVyZWQgY2FsbGJhY2suJywgaWQpIDogaW52YXJpYW50KGZhbHNlKSA6IHVuZGVmaW5lZDtcbiAgICBkZWxldGUgdGhpcy5fY2FsbGJhY2tzW2lkXTtcbiAgfTtcblxuICAvKipcbiAgICogV2FpdHMgZm9yIHRoZSBjYWxsYmFja3Mgc3BlY2lmaWVkIHRvIGJlIGludm9rZWQgYmVmb3JlIGNvbnRpbnVpbmcgZXhlY3V0aW9uXG4gICAqIG9mIHRoZSBjdXJyZW50IGNhbGxiYWNrLiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGEgY2FsbGJhY2sgaW5cbiAgICogcmVzcG9uc2UgdG8gYSBkaXNwYXRjaGVkIHBheWxvYWQuXG4gICAqL1xuXG4gIERpc3BhdGNoZXIucHJvdG90eXBlLndhaXRGb3IgPSBmdW5jdGlvbiB3YWl0Rm9yKGlkcykge1xuICAgICF0aGlzLl9pc0Rpc3BhdGNoaW5nID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0Rpc3BhdGNoZXIud2FpdEZvciguLi4pOiBNdXN0IGJlIGludm9rZWQgd2hpbGUgZGlzcGF0Y2hpbmcuJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdW5kZWZpbmVkO1xuICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCBpZHMubGVuZ3RoOyBpaSsrKSB7XG4gICAgICB2YXIgaWQgPSBpZHNbaWldO1xuICAgICAgaWYgKHRoaXMuX2lzUGVuZGluZ1tpZF0pIHtcbiAgICAgICAgIXRoaXMuX2lzSGFuZGxlZFtpZF0gPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRGlzcGF0Y2hlci53YWl0Rm9yKC4uLik6IENpcmN1bGFyIGRlcGVuZGVuY3kgZGV0ZWN0ZWQgd2hpbGUgJyArICd3YWl0aW5nIGZvciBgJXNgLicsIGlkKSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgIXRoaXMuX2NhbGxiYWNrc1tpZF0gPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRGlzcGF0Y2hlci53YWl0Rm9yKC4uLik6IGAlc2AgZG9lcyBub3QgbWFwIHRvIGEgcmVnaXN0ZXJlZCBjYWxsYmFjay4nLCBpZCkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5faW52b2tlQ2FsbGJhY2soaWQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhIHBheWxvYWQgdG8gYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLlxuICAgKi9cblxuICBEaXNwYXRjaGVyLnByb3RvdHlwZS5kaXNwYXRjaCA9IGZ1bmN0aW9uIGRpc3BhdGNoKHBheWxvYWQpIHtcbiAgICAhIXRoaXMuX2lzRGlzcGF0Y2hpbmcgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRGlzcGF0Y2guZGlzcGF0Y2goLi4uKTogQ2Fubm90IGRpc3BhdGNoIGluIHRoZSBtaWRkbGUgb2YgYSBkaXNwYXRjaC4nKSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc3RhcnREaXNwYXRjaGluZyhwYXlsb2FkKTtcbiAgICB0cnkge1xuICAgICAgZm9yICh2YXIgaWQgaW4gdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc1BlbmRpbmdbaWRdKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faW52b2tlQ2FsbGJhY2soaWQpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9zdG9wRGlzcGF0Y2hpbmcoKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIElzIHRoaXMgRGlzcGF0Y2hlciBjdXJyZW50bHkgZGlzcGF0Y2hpbmcuXG4gICAqL1xuXG4gIERpc3BhdGNoZXIucHJvdG90eXBlLmlzRGlzcGF0Y2hpbmcgPSBmdW5jdGlvbiBpc0Rpc3BhdGNoaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9pc0Rpc3BhdGNoaW5nO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDYWxsIHRoZSBjYWxsYmFjayBzdG9yZWQgd2l0aCB0aGUgZ2l2ZW4gaWQuIEFsc28gZG8gc29tZSBpbnRlcm5hbFxuICAgKiBib29ra2VlcGluZy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuXG4gIERpc3BhdGNoZXIucHJvdG90eXBlLl9pbnZva2VDYWxsYmFjayA9IGZ1bmN0aW9uIF9pbnZva2VDYWxsYmFjayhpZCkge1xuICAgIHRoaXMuX2lzUGVuZGluZ1tpZF0gPSB0cnVlO1xuICAgIHRoaXMuX2NhbGxiYWNrc1tpZF0odGhpcy5fcGVuZGluZ1BheWxvYWQpO1xuICAgIHRoaXMuX2lzSGFuZGxlZFtpZF0gPSB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTZXQgdXAgYm9va2tlZXBpbmcgbmVlZGVkIHdoZW4gZGlzcGF0Y2hpbmcuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuICBEaXNwYXRjaGVyLnByb3RvdHlwZS5fc3RhcnREaXNwYXRjaGluZyA9IGZ1bmN0aW9uIF9zdGFydERpc3BhdGNoaW5nKHBheWxvYWQpIHtcbiAgICBmb3IgKHZhciBpZCBpbiB0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgIHRoaXMuX2lzUGVuZGluZ1tpZF0gPSBmYWxzZTtcbiAgICAgIHRoaXMuX2lzSGFuZGxlZFtpZF0gPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5fcGVuZGluZ1BheWxvYWQgPSBwYXlsb2FkO1xuICAgIHRoaXMuX2lzRGlzcGF0Y2hpbmcgPSB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDbGVhciBib29ra2VlcGluZyB1c2VkIGZvciBkaXNwYXRjaGluZy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuXG4gIERpc3BhdGNoZXIucHJvdG90eXBlLl9zdG9wRGlzcGF0Y2hpbmcgPSBmdW5jdGlvbiBfc3RvcERpc3BhdGNoaW5nKCkge1xuICAgIGRlbGV0ZSB0aGlzLl9wZW5kaW5nUGF5bG9hZDtcbiAgICB0aGlzLl9pc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gIH07XG5cbiAgcmV0dXJuIERpc3BhdGNoZXI7XG59KSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IERpc3BhdGNoZXI7IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBGbHV4Q29udGFpbmVyXG4gKiBcbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gJ2Z1bmN0aW9uJyAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ1N1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJyArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIEZsdXhTdG9yZUdyb3VwID0gcmVxdWlyZSgnLi9GbHV4U3RvcmVHcm91cCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgc2hhbGxvd0VxdWFsID0gcmVxdWlyZSgnZmJqcy9saWIvc2hhbGxvd0VxdWFsJyk7XG5cbnZhciBERUZBVUxUX09QVElPTlMgPSB7XG4gIHB1cmU6IHRydWUsXG4gIHdpdGhQcm9wczogZmFsc2Vcbn07XG5cbi8qKlxuICogQSBGbHV4Q29udGFpbmVyIGlzIHVzZWQgdG8gc3Vic2NyaWJlIGEgcmVhY3QgY29tcG9uZW50IHRvIG11bHRpcGxlIHN0b3Jlcy5cbiAqIFRoZSBzdG9yZXMgdGhhdCBhcmUgdXNlZCBtdXN0IGJlIHJldHVybmVkIGZyb20gYSBzdGF0aWMgYGdldFN0b3JlcygpYCBtZXRob2QuXG4gKlxuICogVGhlIGNvbXBvbmVudCByZWNlaXZlcyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdG9yZXMgdmlhIHN0YXRlLiBUaGUgc3RhdGVcbiAqIGlzIGdlbmVyYXRlZCB1c2luZyBhIHN0YXRpYyBgY2FsY3VsYXRlU3RhdGUoKWAgbWV0aG9kIHRoYXQgZWFjaCBjb250YWluZXJcbiAqIG11c3QgaW1wbGVtZW50LiBBIHNpbXBsZSBjb250YWluZXIgbWF5IGxvb2sgbGlrZTpcbiAqL1xuZnVuY3Rpb24gY3JlYXRlKEJhc2UsIG9wdGlvbnMpIHtcbiAgZW5mb3JjZUludGVyZmFjZShCYXNlKTtcblxuICAvLyBDb25zdHJ1Y3QgdGhlIG9wdGlvbnMgdXNpbmcgZGVmYXVsdCwgb3ZlcnJpZGUgd2l0aCB1c2VyIHZhbHVlcyBhcyBuZWNlc3NhcnlcbiAgdmFyIHJlYWxPcHRpb25zID0gX2V4dGVuZHMoe30sIERFRkFVTFRfT1BUSU9OUywgb3B0aW9ucyB8fCB7fSk7XG5cbiAgdmFyIEZsdXhDb250YWluZXJDbGFzcyA9IChmdW5jdGlvbiAoX0Jhc2UpIHtcbiAgICBfaW5oZXJpdHMoRmx1eENvbnRhaW5lckNsYXNzLCBfQmFzZSk7XG5cbiAgICBmdW5jdGlvbiBGbHV4Q29udGFpbmVyQ2xhc3MocHJvcHMpIHtcbiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGbHV4Q29udGFpbmVyQ2xhc3MpO1xuXG4gICAgICBfQmFzZS5jYWxsKHRoaXMsIHByb3BzKTtcbiAgICAgIHRoaXMuc3RhdGUgPSByZWFsT3B0aW9ucy53aXRoUHJvcHMgPyBCYXNlLmNhbGN1bGF0ZVN0YXRlKG51bGwsIHByb3BzKSA6IEJhc2UuY2FsY3VsYXRlU3RhdGUobnVsbCwgdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICAvLyBNYWtlIHN1cmUgd2Ugb3ZlcnJpZGUgc2hvdWxkQ29tcG9uZW50VXBkYXRlIG9ubHkgaWYgdGhlIHB1cmUgb3B0aW9uIGlzXG4gICAgLy8gc3BlY2lmaWVkLiBXZSBjYW4ndCBvdmVycmlkZSB0aGlzIGFib3ZlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBvdmVycmlkZVxuICAgIC8vIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9uIGFjY2lkZW50LiBTdXBlciB3b3JrcyB3ZWlyZCB3aXRoIHJlYWN0IEVTNiBjbGFzc2VzXG4gICAgLy8gcmlnaHQgbm93XG5cbiAgICBGbHV4Q29udGFpbmVyQ2xhc3MucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAoX0Jhc2UucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50KSB7XG4gICAgICAgIF9CYXNlLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudC5jYWxsKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RvcmVzID0gQmFzZS5nZXRTdG9yZXMoKTtcblxuICAgICAgLy8gVGhpcyB0cmFja3Mgd2hlbiBhbnkgc3RvcmUgaGFzIGNoYW5nZWQgYW5kIHdlIG1heSBuZWVkIHRvIHVwZGF0ZS5cbiAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICB2YXIgc2V0Q2hhbmdlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9O1xuXG4gICAgICAvLyBUaGlzIGFkZHMgc3Vic2NyaXB0aW9ucyB0byBzdG9yZXMuIFdoZW4gYSBzdG9yZSBjaGFuZ2VzIGFsbCB3ZSBkbyBpc1xuICAgICAgLy8gc2V0IGNoYW5nZWQgdG8gdHJ1ZS5cbiAgICAgIHRoaXMuX2ZsdXhDb250YWluZXJTdWJzY3JpcHRpb25zID0gc3RvcmVzLm1hcChmdW5jdGlvbiAoc3RvcmUpIHtcbiAgICAgICAgcmV0dXJuIHN0b3JlLmFkZExpc3RlbmVyKHNldENoYW5nZWQpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIGFmdGVyIHRoZSBkaXNwYXRjaCBvZiB0aGUgcmVsZXZhbnQgc3RvcmVzLiBJZlxuICAgICAgLy8gYW55IGhhdmUgcmVwb3J0ZWQgYSBjaGFuZ2Ugd2UgdXBkYXRlIHRoZSBzdGF0ZSwgdGhlbiByZXNldCBjaGFuZ2VkLlxuICAgICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgIF90aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZWFsT3B0aW9ucy53aXRoUHJvcHMgPyBCYXNlLmNhbGN1bGF0ZVN0YXRlKHByZXZTdGF0ZSwgX3RoaXMucHJvcHMpIDogQmFzZS5jYWxjdWxhdGVTdGF0ZShwcmV2U3RhdGUsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgfTtcbiAgICAgIHRoaXMuX2ZsdXhDb250YWluZXJTdG9yZUdyb3VwID0gbmV3IEZsdXhTdG9yZUdyb3VwKHN0b3JlcywgY2FsbGJhY2spO1xuICAgIH07XG5cbiAgICBGbHV4Q29udGFpbmVyQ2xhc3MucHJvdG90eXBlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcywgbmV4dENvbnRleHQpIHtcbiAgICAgIGlmIChfQmFzZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcykge1xuICAgICAgICBfQmFzZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcy5jYWxsKHRoaXMsIG5leHRQcm9wcywgbmV4dENvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBlbHNlIGlmIHRoZSBjb250YWluZXIgaXMgbm90IGNvbmZpZ3VyZWQgdG8gdXNlIHByb3BzXG4gICAgICBpZiAoIXJlYWxPcHRpb25zLndpdGhQcm9wcykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGl0J3MgcHVyZSB3ZSBjYW4gcG90ZW50aWFsbHkgb3B0aW1pemUgb3V0IHRoZSBjYWxjdWxhdGUgc3RhdGVcbiAgICAgIGlmIChyZWFsT3B0aW9ucy5wdXJlICYmIHNoYWxsb3dFcXVhbCh0aGlzLnByb3BzLCBuZXh0UHJvcHMpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRmluYWxseSB1cGRhdGUgdGhlIHN0YXRlIHVzaW5nIHRoZSBuZXcgcHJvcHNcbiAgICAgIHRoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICByZXR1cm4gQmFzZS5jYWxjdWxhdGVTdGF0ZShwcmV2U3RhdGUsIG5leHRQcm9wcyk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgRmx1eENvbnRhaW5lckNsYXNzLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgaWYgKF9CYXNlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCkge1xuICAgICAgICBfQmFzZS5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQuY2FsbCh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZmx1eENvbnRhaW5lclN0b3JlR3JvdXAucmVsZWFzZSgpO1xuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gdGhpcy5fZmx1eENvbnRhaW5lclN1YnNjcmlwdGlvbnMsIF9pc0FycmF5ID0gQXJyYXkuaXNBcnJheShfaXRlcmF0b3IpLCBfaSA9IDAsIF9pdGVyYXRvciA9IF9pc0FycmF5ID8gX2l0ZXJhdG9yIDogX2l0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl0oKTs7KSB7XG4gICAgICAgIHZhciBfcmVmO1xuXG4gICAgICAgIGlmIChfaXNBcnJheSkge1xuICAgICAgICAgIGlmIChfaSA+PSBfaXRlcmF0b3IubGVuZ3RoKSBicmVhaztcbiAgICAgICAgICBfcmVmID0gX2l0ZXJhdG9yW19pKytdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9pID0gX2l0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBpZiAoX2kuZG9uZSkgYnJlYWs7XG4gICAgICAgICAgX3JlZiA9IF9pLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IF9yZWY7XG5cbiAgICAgICAgc3Vic2NyaXB0aW9uLnJlbW92ZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZmx1eENvbnRhaW5lclN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIEZsdXhDb250YWluZXJDbGFzcztcbiAgfSkoQmFzZSk7XG5cbiAgdmFyIGNvbnRhaW5lciA9IHJlYWxPcHRpb25zLnB1cmUgPyBjcmVhdGVQdXJlQ29udGFpbmVyKEZsdXhDb250YWluZXJDbGFzcykgOiBGbHV4Q29udGFpbmVyQ2xhc3M7XG5cbiAgLy8gVXBkYXRlIHRoZSBuYW1lIG9mIHRoZSBjb250YWluZXIgYmVmb3JlIHJldHVybmluZ1xuICB2YXIgY29tcG9uZW50TmFtZSA9IEJhc2UuZGlzcGxheU5hbWUgfHwgQmFzZS5uYW1lO1xuICBjb250YWluZXIuZGlzcGxheU5hbWUgPSAnRmx1eENvbnRhaW5lcignICsgY29tcG9uZW50TmFtZSArICcpJztcblxuICByZXR1cm4gY29udGFpbmVyO1xufVxuXG4vLyBUT0RPOiB0eXBlY2hlY2sgdGhpcyBiZXR0ZXJcbmZ1bmN0aW9uIGNyZWF0ZVB1cmVDb250YWluZXIoRmx1eENvbnRhaW5lckJhc2UpIHtcbiAgdmFyIFB1cmVGbHV4Q29udGFpbmVyQ2xhc3MgPSAoZnVuY3Rpb24gKF9GbHV4Q29udGFpbmVyQmFzZSkge1xuICAgIF9pbmhlcml0cyhQdXJlRmx1eENvbnRhaW5lckNsYXNzLCBfRmx1eENvbnRhaW5lckJhc2UpO1xuXG4gICAgZnVuY3Rpb24gUHVyZUZsdXhDb250YWluZXJDbGFzcygpIHtcbiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQdXJlRmx1eENvbnRhaW5lckNsYXNzKTtcblxuICAgICAgX0ZsdXhDb250YWluZXJCYXNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgUHVyZUZsdXhDb250YWluZXJDbGFzcy5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgICByZXR1cm4gIXNoYWxsb3dFcXVhbCh0aGlzLnByb3BzLCBuZXh0UHJvcHMpIHx8ICFzaGFsbG93RXF1YWwodGhpcy5zdGF0ZSwgbmV4dFN0YXRlKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFB1cmVGbHV4Q29udGFpbmVyQ2xhc3M7XG4gIH0pKEZsdXhDb250YWluZXJCYXNlKTtcblxuICByZXR1cm4gUHVyZUZsdXhDb250YWluZXJDbGFzcztcbn1cblxuZnVuY3Rpb24gZW5mb3JjZUludGVyZmFjZShvKSB7XG4gICFvLmdldFN0b3JlcyA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdDb21wb25lbnRzIHRoYXQgdXNlIEZsdXhDb250YWluZXIgbXVzdCBpbXBsZW1lbnQgYHN0YXRpYyBnZXRTdG9yZXMoKWAnKSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG4gICFvLmNhbGN1bGF0ZVN0YXRlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0NvbXBvbmVudHMgdGhhdCB1c2UgRmx1eENvbnRhaW5lciBtdXN0IGltcGxlbWVudCBgc3RhdGljIGNhbGN1bGF0ZVN0YXRlKClgJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdW5kZWZpbmVkO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHsgY3JlYXRlOiBjcmVhdGUgfTsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIEZsdXhNYXBTdG9yZVxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gJ2Z1bmN0aW9uJyAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ1N1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJyArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIEZsdXhSZWR1Y2VTdG9yZSA9IHJlcXVpcmUoJy4vRmx1eFJlZHVjZVN0b3JlJyk7XG52YXIgSW1tdXRhYmxlID0gcmVxdWlyZSgnaW1tdXRhYmxlJyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBUaGlzIGlzIGEgc2ltcGxlIHN0b3JlLiBJdCBhbGxvd3MgY2FjaGluZyBrZXkgdmFsdWUgcGFpcnMuIEFuIGltcGxlbWVudGF0aW9uXG4gKiBvZiBhIHN0b3JlIHVzaW5nIHRoaXMgbWlnaHQgbG9vayBsaWtlOlxuICpcbiAqICAgY2xhc3MgRm9vU3RvcmUgZXh0ZW5kcyBGbHV4TWFwU3RvcmUge1xuICogICAgIHJlZHVjZShzdGF0ZSwgYWN0aW9uKSB7XG4gKiAgICAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gKiAgICAgICAgIGNhc2UgJ2Zvbyc6XG4gKiAgICAgICAgICAgcmV0dXJuIHN0YXRlLnNldChhY3Rpb24uaWQsIGFjdGlvbi5mb28pO1xuICogICAgICAgICBjYXNlICdiYXInOlxuICogICAgICAgICAgIHJldHVybiBzdGF0ZS5kZWxldGUoYWN0aW9uLmlkKTtcbiAqICAgICAgICAgZGVmYXVsdDpcbiAqICAgICAgICAgICByZXR1cm4gc3RhdGU7XG4gKiAgICAgICB9XG4gKiAgICAgfVxuICogICB9XG4gKlxuICovXG5cbnZhciBGbHV4TWFwU3RvcmUgPSAoZnVuY3Rpb24gKF9GbHV4UmVkdWNlU3RvcmUpIHtcbiAgX2luaGVyaXRzKEZsdXhNYXBTdG9yZSwgX0ZsdXhSZWR1Y2VTdG9yZSk7XG5cbiAgZnVuY3Rpb24gRmx1eE1hcFN0b3JlKCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGbHV4TWFwU3RvcmUpO1xuXG4gICAgX0ZsdXhSZWR1Y2VTdG9yZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgRmx1eE1hcFN0b3JlLnByb3RvdHlwZS5nZXRJbml0aWFsU3RhdGUgPSBmdW5jdGlvbiBnZXRJbml0aWFsU3RhdGUoKSB7XG4gICAgcmV0dXJuIEltbXV0YWJsZS5NYXAoKTtcbiAgfTtcblxuICAvKipcbiAgICogQWNjZXNzIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4ga2V5LiB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGtleSBkb2VzIG5vdFxuICAgKiBleGlzdCBpbiB0aGUgY2FjaGUuXG4gICAqL1xuXG4gIEZsdXhNYXBTdG9yZS5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBhdChrZXkpIHtcbiAgICAhdGhpcy5oYXMoa2V5KSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBzdG9yZSB0byBoYXZlIGtleSAlcycsIGtleSkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmdldChrZXkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgY2FjaGUgaGFzIGEgcGFydGljdWxhciBrZXlcbiAgICovXG5cbiAgRmx1eE1hcFN0b3JlLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhdGUoKS5oYXMoa2V5KTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiBhIHBhcnRpY3VsYXIga2V5LiBSZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGUga2V5IGRvZXMgbm90XG4gICAqIGV4aXN0IGluIHRoZSBjYWNoZS5cbiAgICovXG5cbiAgRmx1eE1hcFN0b3JlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhdGUoKS5nZXQoa2V5KTtcbiAgfTtcblxuICAvKipcbiAgICogR2V0cyBhbiBhcnJheSBvZiBrZXlzIGFuZCBwdXRzIHRoZSB2YWx1ZXMgaW4gYSBtYXAgaWYgdGhleSBleGlzdCwgaXQgYWxsb3dzXG4gICAqIHByb3ZpZGluZyBhIHByZXZpb3VzIHJlc3VsdCB0byB1cGRhdGUgaW5zdGVhZCBvZiBnZW5lcmF0aW5nIGEgbmV3IG1hcC5cbiAgICpcbiAgICogUHJvdmlkaW5nIGEgcHJldmlvdXMgcmVzdWx0IGFsbG93cyB0aGUgcG9zc2liaWxpdHkgb2Yga2VlcGluZyB0aGUgc2FtZVxuICAgKiByZWZlcmVuY2UgaWYgdGhlIGtleXMgZGlkIG5vdCBjaGFuZ2UuXG4gICAqL1xuXG4gIEZsdXhNYXBTdG9yZS5wcm90b3R5cGUuZ2V0QWxsID0gZnVuY3Rpb24gZ2V0QWxsKGtleXMsIHByZXYpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIG5ld0tleXMgPSBJbW11dGFibGUuU2V0KGtleXMpO1xuICAgIHZhciBzdGFydCA9IHByZXYgfHwgSW1tdXRhYmxlLk1hcCgpO1xuICAgIHJldHVybiBzdGFydC53aXRoTXV0YXRpb25zKGZ1bmN0aW9uIChtYXApIHtcbiAgICAgIC8vIHJlbW92ZSBhbnkgb2xkIGtleXMgdGhhdCBhcmUgbm90IGluIG5ldyBrZXlzIG9yIGFyZSBubyBsb25nZXIgaW5cbiAgICAgIC8vIHRoZSBjYWNoZVxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yID0gc3RhcnQsIF9pc0FycmF5ID0gQXJyYXkuaXNBcnJheShfaXRlcmF0b3IpLCBfaSA9IDAsIF9pdGVyYXRvciA9IF9pc0FycmF5ID8gX2l0ZXJhdG9yIDogX2l0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl0oKTs7KSB7XG4gICAgICAgIHZhciBfcmVmO1xuXG4gICAgICAgIGlmIChfaXNBcnJheSkge1xuICAgICAgICAgIGlmIChfaSA+PSBfaXRlcmF0b3IubGVuZ3RoKSBicmVhaztcbiAgICAgICAgICBfcmVmID0gX2l0ZXJhdG9yW19pKytdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9pID0gX2l0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBpZiAoX2kuZG9uZSkgYnJlYWs7XG4gICAgICAgICAgX3JlZiA9IF9pLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGVudHJ5ID0gX3JlZjtcbiAgICAgICAgdmFyIG9sZEtleSA9IGVudHJ5WzBdO1xuXG4gICAgICAgIGlmICghbmV3S2V5cy5oYXMob2xkS2V5KSB8fCAhX3RoaXMuaGFzKG9sZEtleSkpIHtcbiAgICAgICAgICBtYXBbJ2RlbGV0ZSddKG9sZEtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gdGhlbiBhZGQgYWxsIG9mIHRoZSBuZXcga2V5cyB0aGF0IGV4aXN0IGluIHRoZSBjYWNoZVxuICAgICAgZm9yICh2YXIgX2l0ZXJhdG9yMiA9IG5ld0tleXMsIF9pc0FycmF5MiA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yMiksIF9pMiA9IDAsIF9pdGVyYXRvcjIgPSBfaXNBcnJheTIgPyBfaXRlcmF0b3IyIDogX2l0ZXJhdG9yMltTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgICAgICB2YXIgX3JlZjI7XG5cbiAgICAgICAgaWYgKF9pc0FycmF5Mikge1xuICAgICAgICAgIGlmIChfaTIgPj0gX2l0ZXJhdG9yMi5sZW5ndGgpIGJyZWFrO1xuICAgICAgICAgIF9yZWYyID0gX2l0ZXJhdG9yMltfaTIrK107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX2kyID0gX2l0ZXJhdG9yMi5uZXh0KCk7XG4gICAgICAgICAgaWYgKF9pMi5kb25lKSBicmVhaztcbiAgICAgICAgICBfcmVmMiA9IF9pMi52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBrZXkgPSBfcmVmMjtcblxuICAgICAgICBpZiAoX3RoaXMuaGFzKGtleSkpIHtcbiAgICAgICAgICBtYXAuc2V0KGtleSwgX3RoaXMuYXQoa2V5KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gRmx1eE1hcFN0b3JlO1xufSkoRmx1eFJlZHVjZVN0b3JlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGbHV4TWFwU3RvcmU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBGbHV4TWl4aW5MZWdhY3lcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEZsdXhTdG9yZUdyb3VwID0gcmVxdWlyZSgnLi9GbHV4U3RvcmVHcm91cCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogYEZsdXhDb250YWluZXJgIHNob3VsZCBiZSBwcmVmZXJyZWQgb3ZlciB0aGlzIG1peGluLCBidXQgaXQgcmVxdWlyZXMgdXNpbmdcbiAqIHJlYWN0IHdpdGggY2xhc3Nlcy4gU28gdGhpcyBtaXhpbiBpcyBwcm92aWRlZCB3aGVyZSBpdCBpcyBub3QgeWV0IHBvc3NpYmxlXG4gKiB0byBjb252ZXJ0IGEgY29udGFpbmVyIHRvIGJlIGEgY2xhc3MuXG4gKlxuICogVGhpcyBtaXhpbiBzaG91bGQgYmUgdXNlZCBmb3IgUmVhY3QgY29tcG9uZW50cyB0aGF0IGhhdmUgc3RhdGUgYmFzZWQgcHVyZWx5XG4gKiBvbiBzdG9yZXMuIGB0aGlzLnByb3BzYCB3aWxsIG5vdCBiZSBhdmFpbGFibGUgaW5zaWRlIG9mIGBjYWxjdWxhdGVTdGF0ZSgpYC5cbiAqXG4gKiBUaGlzIG1peGluIHdpbGwgb25seSBgc2V0U3RhdGVgIG5vdCByZXBsYWNlIGl0LCBzbyB5b3Ugc2hvdWxkIGFsd2F5cyByZXR1cm5cbiAqIGV2ZXJ5IGtleSBpbiB5b3VyIHN0YXRlIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuIENvbnNpZGVyIHRoaXM6XG4gKlxuICogICB2YXIgRm9vID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICogICAgIG1peGluczogW1xuICogICAgICAgRmx1eE1peGluTGVnYWN5KFtGb29TdG9yZV0pXG4gKiAgICAgXSxcbiAqXG4gKiAgICAgc3RhdGljczoge1xuICogICAgICAgY2FsY3VsYXRlU3RhdGUocHJldlN0YXRlKSB7XG4gKiAgICAgICAgIGlmICghcHJldlN0YXRlKSB7XG4gKiAgICAgICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAgICAgIGZvbzogRm9vU3RvcmUuZ2V0Rm9vKCksXG4gKiAgICAgICAgICAgfTtcbiAqICAgICAgICAgfVxuICpcbiAqICAgICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAgICBiYXI6IEZvb1N0b3JlLmdldEJhcigpLFxuICogICAgICAgICB9O1xuICogICAgICAgfVxuICogICAgIH0sXG4gKiAgIH0pO1xuICpcbiAqIE9uIHRoZSBzZWNvbmQgY2FsY3VsYXRlU3RhdGUgd2hlbiBwcmV2U3RhdGUgaXMgbm90IG51bGwsIHRoZSBzdGF0ZSB3aWxsIGJlXG4gKiB1cGRhdGVkIHRvIGNvbnRhaW4gdGhlIHByZXZpb3VzIGZvbyBBTkQgdGhlIGJhciB0aGF0IHdhcyBqdXN0IHJldHVybmVkLiBPbmx5XG4gKiByZXR1cm5pbmcgYmFyIHdpbGwgbm90IGRlbGV0ZSBmb28uXG4gKlxuICovXG5mdW5jdGlvbiBGbHV4TWl4aW5MZWdhY3koc3RvcmVzKSB7XG4gIHJldHVybiB7XG4gICAgZ2V0SW5pdGlhbFN0YXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICBlbmZvcmNlSW50ZXJmYWNlKHRoaXMpO1xuICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IuY2FsY3VsYXRlU3RhdGUobnVsbCk7XG4gICAgfSxcblxuICAgIGNvbXBvbmVudERpZE1vdW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAvLyBUaGlzIHRyYWNrcyB3aGVuIGFueSBzdG9yZSBoYXMgY2hhbmdlZCBhbmQgd2UgbWF5IG5lZWQgdG8gdXBkYXRlLlxuICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgIHZhciBzZXRDaGFuZ2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFRoaXMgYWRkcyBzdWJzY3JpcHRpb25zIHRvIHN0b3Jlcy4gV2hlbiBhIHN0b3JlIGNoYW5nZXMgYWxsIHdlIGRvIGlzXG4gICAgICAvLyBzZXQgY2hhbmdlZCB0byB0cnVlLlxuICAgICAgdGhpcy5fZmx1eE1peGluU3Vic2NyaXB0aW9ucyA9IHN0b3Jlcy5tYXAoZnVuY3Rpb24gKHN0b3JlKSB7XG4gICAgICAgIHJldHVybiBzdG9yZS5hZGRMaXN0ZW5lcihzZXRDaGFuZ2VkKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBhZnRlciB0aGUgZGlzcGF0Y2ggb2YgdGhlIHJlbGV2YW50IHN0b3Jlcy4gSWZcbiAgICAgIC8vIGFueSBoYXZlIHJlcG9ydGVkIGEgY2hhbmdlIHdlIHVwZGF0ZSB0aGUgc3RhdGUsIHRoZW4gcmVzZXQgY2hhbmdlZC5cbiAgICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGNoYW5nZWQpIHtcbiAgICAgICAgICBfdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMuY29uc3RydWN0b3IuY2FsY3VsYXRlU3RhdGUoX3RoaXMuc3RhdGUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgIH07XG4gICAgICB0aGlzLl9mbHV4TWl4aW5TdG9yZUdyb3VwID0gbmV3IEZsdXhTdG9yZUdyb3VwKHN0b3JlcywgY2FsbGJhY2spO1xuICAgIH0sXG5cbiAgICBjb21wb25lbnRXaWxsVW5tb3VudDogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5fZmx1eE1peGluU3RvcmVHcm91cC5yZWxlYXNlKCk7XG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSB0aGlzLl9mbHV4TWl4aW5TdWJzY3JpcHRpb25zLCBfaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoX2l0ZXJhdG9yKSwgX2kgPSAwLCBfaXRlcmF0b3IgPSBfaXNBcnJheSA/IF9pdGVyYXRvciA6IF9pdGVyYXRvcltTeW1ib2wuaXRlcmF0b3JdKCk7Oykge1xuICAgICAgICB2YXIgX3JlZjtcblxuICAgICAgICBpZiAoX2lzQXJyYXkpIHtcbiAgICAgICAgICBpZiAoX2kgPj0gX2l0ZXJhdG9yLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgICAgX3JlZiA9IF9pdGVyYXRvcltfaSsrXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfaSA9IF9pdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgaWYgKF9pLmRvbmUpIGJyZWFrO1xuICAgICAgICAgIF9yZWYgPSBfaS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSBfcmVmO1xuXG4gICAgICAgIHN1YnNjcmlwdGlvbi5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2ZsdXhNaXhpblN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIGVuZm9yY2VJbnRlcmZhY2Uobykge1xuICAhby5jb25zdHJ1Y3Rvci5jYWxjdWxhdGVTdGF0ZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdDb21wb25lbnRzIHRoYXQgdXNlIEZsdXhNaXhpbkxlZ2FjeSBtdXN0IGltcGxlbWVudCAnICsgJ2BjYWxjdWxhdGVTdGF0ZSgpYCBvbiB0aGUgc3RhdGljcyBvYmplY3QnKSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRmx1eE1peGluTGVnYWN5OyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgRmx1eFJlZHVjZVN0b3JlXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgRmx1eFN0b3JlID0gcmVxdWlyZSgnLi9GbHV4U3RvcmUnKTtcblxudmFyIGFic3RyYWN0TWV0aG9kID0gcmVxdWlyZSgnLi9hYnN0cmFjdE1ldGhvZCcpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG52YXIgRmx1eFJlZHVjZVN0b3JlID0gKGZ1bmN0aW9uIChfRmx1eFN0b3JlKSB7XG4gIF9pbmhlcml0cyhGbHV4UmVkdWNlU3RvcmUsIF9GbHV4U3RvcmUpO1xuXG4gIGZ1bmN0aW9uIEZsdXhSZWR1Y2VTdG9yZShkaXNwYXRjaGVyKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZsdXhSZWR1Y2VTdG9yZSk7XG5cbiAgICBfRmx1eFN0b3JlLmNhbGwodGhpcywgZGlzcGF0Y2hlcik7XG4gICAgdGhpcy5fc3RhdGUgPSB0aGlzLmdldEluaXRpYWxTdGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHRlciB0aGF0IGV4cG9zZXMgdGhlIGVudGlyZSBzdGF0ZSBvZiB0aGlzIHN0b3JlLiBJZiB5b3VyIHN0YXRlIGlzIG5vdFxuICAgKiBpbW11dGFibGUgeW91IHNob3VsZCBvdmVycmlkZSB0aGlzIGFuZCBub3QgZXhwb3NlIF9zdGF0ZSBkaXJlY3RseS5cbiAgICovXG5cbiAgRmx1eFJlZHVjZVN0b3JlLnByb3RvdHlwZS5nZXRTdGF0ZSA9IGZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZTtcbiAgfTtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyB0aGUgaW5pdGlhbCBzdGF0ZSBmb3IgdGhpcyBzdG9yZS4gVGhpcyBpcyBjYWxsZWQgb25jZSBkdXJpbmdcbiAgICogY29uc3RydWN0aW9uIG9mIHRoZSBzdG9yZS5cbiAgICovXG5cbiAgRmx1eFJlZHVjZVN0b3JlLnByb3RvdHlwZS5nZXRJbml0aWFsU3RhdGUgPSBmdW5jdGlvbiBnZXRJbml0aWFsU3RhdGUoKSB7XG4gICAgcmV0dXJuIGFic3RyYWN0TWV0aG9kKCdGbHV4UmVkdWNlU3RvcmUnLCAnZ2V0SW5pdGlhbFN0YXRlJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gcmVkdWNlIGEgc3RyZWFtIG9mIGFjdGlvbnMgY29taW5nIGZyb20gdGhlIGRpc3BhdGNoZXIgaW50byBhXG4gICAqIHNpbmdsZSBzdGF0ZSBvYmplY3RcbiAgICovXG5cbiAgRmx1eFJlZHVjZVN0b3JlLnByb3RvdHlwZS5yZWR1Y2UgPSBmdW5jdGlvbiByZWR1Y2Uoc3RhdGUsIGFjdGlvbikge1xuICAgIHJldHVybiBhYnN0cmFjdE1ldGhvZCgnRmx1eFJlZHVjZVN0b3JlJywgJ3JlZHVjZScpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdHdvIHZlcnNpb25zIG9mIHN0YXRlIGFyZSB0aGUgc2FtZS4gWW91IGRvIG5vdCBuZWVkIHRvIG92ZXJyaWRlXG4gICAqIHRoaXMgaWYgeW91ciBzdGF0ZSBpcyBpbW11dGFibGUuXG4gICAqL1xuXG4gIEZsdXhSZWR1Y2VTdG9yZS5wcm90b3R5cGUuYXJlRXF1YWwgPSBmdW5jdGlvbiBhcmVFcXVhbChvbmUsIHR3bykge1xuICAgIHJldHVybiBvbmUgPT09IHR3bztcbiAgfTtcblxuICAvKipcbiAgICogVXNlIHJlZHVjZSBhbmQgdHJhY2sgX3N0YXRlIGluc3RlYWQgb2YgdXNpbmcgX19vbkRpc3BhdGNoXG4gICAqL1xuXG4gIEZsdXhSZWR1Y2VTdG9yZS5wcm90b3R5cGUuX19pbnZva2VPbkRpc3BhdGNoID0gZnVuY3Rpb24gX19pbnZva2VPbkRpc3BhdGNoKGFjdGlvbikge1xuICAgIHRoaXMuX19jaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAvLyByZWR1Y2UgdGhlIHN0cmVhbSBvZiBpbmNvbWluZyBhY3Rpb25zIHRvIHN0YXRlLCB1cGRhdGUgd2hlbiBuZWNlc3NhcnlcbiAgICB2YXIgc3RhcnRpbmdTdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgIHZhciBlbmRpbmdTdGF0ZSA9IHRoaXMucmVkdWNlKHN0YXJ0aW5nU3RhdGUsIGFjdGlvbik7XG5cbiAgICAvLyBUaGlzIG1lYW5zIHlvdXIgZW5kaW5nIHN0YXRlIHNob3VsZCBuZXZlciBiZSB1bmRlZmluZWRcbiAgICAhKGVuZGluZ1N0YXRlICE9PSB1bmRlZmluZWQpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzIHJldHVybmVkIHVuZGVmaW5lZCBmcm9tIHJlZHVjZSguLi4pLCBkaWQgeW91IGZvcmdldCB0byByZXR1cm4gJyArICdzdGF0ZSBpbiB0aGUgZGVmYXVsdCBjYXNlPyAodXNlIG51bGwgaWYgdGhpcyB3YXMgaW50ZW50aW9uYWwpJywgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIXRoaXMuYXJlRXF1YWwoc3RhcnRpbmdTdGF0ZSwgZW5kaW5nU3RhdGUpKSB7XG4gICAgICB0aGlzLl9zdGF0ZSA9IGVuZGluZ1N0YXRlO1xuXG4gICAgICAvLyBgX19lbWl0Q2hhbmdlKClgIHNldHMgYHRoaXMuX19jaGFuZ2VkYCB0byB0cnVlIGFuZCB0aGVuIHRoZSBhY3R1YWxcbiAgICAgIC8vIGNoYW5nZSB3aWxsIGJlIGZpcmVkIGZyb20gdGhlIGVtaXR0ZXIgYXQgdGhlIGVuZCBvZiB0aGUgZGlzcGF0Y2gsIHRoaXNcbiAgICAgIC8vIGlzIHJlcXVpcmVkIGluIG9yZGVyIHRvIHN1cHBvcnQgbWV0aG9kcyBsaWtlIGBoYXNDaGFuZ2VkKClgXG4gICAgICB0aGlzLl9fZW1pdENoYW5nZSgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9fY2hhbmdlZCkge1xuICAgICAgdGhpcy5fX2VtaXR0ZXIuZW1pdCh0aGlzLl9fY2hhbmdlRXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gRmx1eFJlZHVjZVN0b3JlO1xufSkoRmx1eFN0b3JlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGbHV4UmVkdWNlU3RvcmU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBGbHV4U3RvcmVcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJ2ZiZW1pdHRlcicpO1xuXG52YXIgRXZlbnRFbWl0dGVyID0gX3JlcXVpcmUuRXZlbnRFbWl0dGVyO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogVGhpcyBjbGFzcyBzaG91bGQgYmUgZXh0ZW5kZWQgYnkgdGhlIHN0b3JlcyBpbiB5b3VyIGFwcGxpY2F0aW9uLCBsaWtlIHNvOlxuICpcbiAqIHZhciBGbHV4U3RvcmUgPSByZXF1aXJlKCdGbHV4U3RvcmUnKTtcbiAqIHZhciBNeURpc3BhdGNoZXIgPSByZXF1aXJlKCdNeURpc3BhdGNoZXInKTtcbiAqXG4gKiB2YXIgX2ZvbztcbiAqXG4gKiBjbGFzcyBNeVN0b3JlIGV4dGVuZHMgRmx1eFN0b3JlIHtcbiAqXG4gKiAgIGdldEZvbygpIHtcbiAqICAgICByZXR1cm4gX2ZvbztcbiAqICAgfVxuICpcbiAqICAgX19vbkRpc3BhdGNoID0gZnVuY3Rpb24oYWN0aW9uKSB7XG4gKiAgICAgc3dpdGNoKGFjdGlvbi50eXBlKSB7XG4gKlxuICogICAgICAgY2FzZSAnYW4tYWN0aW9uJzpcbiAqICAgICAgICAgY2hhbmdlU3RhdGUoYWN0aW9uLnNvbWVEYXRhKTtcbiAqICAgICAgICAgdGhpcy5fX2VtaXRDaGFuZ2UoKTtcbiAqICAgICAgICAgYnJlYWs7XG4gKlxuICogICAgICAgY2FzZSAnYW5vdGhlci1hY3Rpb24nOlxuICogICAgICAgICBjaGFuZ2VTdGF0ZUFub3RoZXJXYXkoYWN0aW9uLm90aGVyRGF0YSk7XG4gKiAgICAgICAgIHRoaXMuX19lbWl0Q2hhbmdlKCk7XG4gKiAgICAgICAgIGJyZWFrO1xuICpcbiAqICAgICAgIGRlZmF1bHQ6XG4gKiAgICAgICAgIC8vIG5vIG9wXG4gKiAgICAgfVxuICogICB9XG4gKlxuICogfVxuICpcbiAqIG1vZHVsZS5leHBvcnRzID0gbmV3IE15U3RvcmUoTXlEaXNwYXRjaGVyKTtcbiAqL1xuXG52YXIgRmx1eFN0b3JlID0gKGZ1bmN0aW9uICgpIHtcblxuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAcGFyYW0ge0Rpc3BhdGNoZXJ9IGRpc3BhdGNoZXJcbiAgICovXG5cbiAgZnVuY3Rpb24gRmx1eFN0b3JlKGRpc3BhdGNoZXIpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZsdXhTdG9yZSk7XG5cbiAgICB0aGlzLl9fY2xhc3NOYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuXG4gICAgdGhpcy5fX2NoYW5nZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9fY2hhbmdlRXZlbnQgPSAnY2hhbmdlJztcbiAgICB0aGlzLl9fZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7XG4gICAgdGhpcy5fX2VtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5fZGlzcGF0Y2hUb2tlbiA9IGRpc3BhdGNoZXIucmVnaXN0ZXIoZnVuY3Rpb24gKHBheWxvYWQpIHtcbiAgICAgIF90aGlzLl9faW52b2tlT25EaXNwYXRjaChwYXlsb2FkKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHVibGljXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrXG4gICAqIEByZXR1cm4ge29iamVjdH0gRW1pdHRlclN1YnNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHdpdGhcbiAgICogICBTdWJzY3JpcHRpb25zSGFuZGxlciBvciBkaXJlY3RseSB1c2VkIHRvIHJlbGVhc2UgdGhlIHN1YnNjcmlwdGlvbi5cbiAgICovXG5cbiAgRmx1eFN0b3JlLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMuX19lbWl0dGVyLmFkZExpc3RlbmVyKHRoaXMuX19jaGFuZ2VFdmVudCwgY2FsbGJhY2spO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcHVibGljXG4gICAqIEByZXR1cm4ge0Rpc3BhdGNoZXJ9IFRoZSBkaXNwYXRjaGVyIHRoYXQgdGhpcyBzdG9yZSBpcyByZWdpc3RlcmVkIHdpdGguXG4gICAqL1xuXG4gIEZsdXhTdG9yZS5wcm90b3R5cGUuZ2V0RGlzcGF0Y2hlciA9IGZ1bmN0aW9uIGdldERpc3BhdGNoZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19kaXNwYXRjaGVyO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcHVibGljXG4gICAqIEByZXR1cm4ge3N0cmluZ30gQSBzdHJpbmcgdGhlIGRpc3BhdGNoZXIgdXNlcyB0byBpZGVudGlmeSBlYWNoIHN0b3JlJ3NcbiAgICogICByZWdpc3RlcmVkIGNhbGxiYWNrLiBUaGlzIGlzIHVzZWQgd2l0aCB0aGUgZGlzcGF0Y2hlcidzIHdhaXRGb3IgbWV0aG9kXG4gICAqICAgdG8gZGVjbGFyYXRpdmVseSBkZXBlbmQgb24gb3RoZXIgc3RvcmVzIHVwZGF0aW5nIHRoZW1zZWx2ZXMgZmlyc3QuXG4gICAqL1xuXG4gIEZsdXhTdG9yZS5wcm90b3R5cGUuZ2V0RGlzcGF0Y2hUb2tlbiA9IGZ1bmN0aW9uIGdldERpc3BhdGNoVG9rZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoVG9rZW47XG4gIH07XG5cbiAgLyoqXG4gICAqIEBwdWJsaWNcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgc3RvcmUgaGFzIGNoYW5nZWQgZHVyaW5nIHRoZSBtb3N0IHJlY2VudFxuICAgKiAgIGRpc3BhdGNoLlxuICAgKi9cblxuICBGbHV4U3RvcmUucHJvdG90eXBlLmhhc0NoYW5nZWQgPSBmdW5jdGlvbiBoYXNDaGFuZ2VkKCkge1xuICAgICF0aGlzLl9fZGlzcGF0Y2hlci5pc0Rpc3BhdGNoaW5nKCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMuaGFzQ2hhbmdlZCgpOiBNdXN0IGJlIGludm9rZWQgd2hpbGUgZGlzcGF0Y2hpbmcuJywgdGhpcy5fX2NsYXNzTmFtZSkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLl9fY2hhbmdlZDtcbiAgfTtcblxuICAvKipcbiAgICogQHByb3RlY3RlZFxuICAgKiBFbWl0IGFuIGV2ZW50IG5vdGlmeWluZyBsaXN0ZW5lcnMgdGhhdCB0aGUgc3RhdGUgb2YgdGhlIHN0b3JlIGhhcyBjaGFuZ2VkLlxuICAgKi9cblxuICBGbHV4U3RvcmUucHJvdG90eXBlLl9fZW1pdENoYW5nZSA9IGZ1bmN0aW9uIF9fZW1pdENoYW5nZSgpIHtcbiAgICAhdGhpcy5fX2Rpc3BhdGNoZXIuaXNEaXNwYXRjaGluZygpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzLl9fZW1pdENoYW5nZSgpOiBNdXN0IGJlIGludm9rZWQgd2hpbGUgZGlzcGF0Y2hpbmcuJywgdGhpcy5fX2NsYXNzTmFtZSkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuX19jaGFuZ2VkID0gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgZW5jYXBzdWxhdGVzIGFsbCBsb2dpYyBmb3IgaW52b2tpbmcgX19vbkRpc3BhdGNoLiBJdCBzaG91bGRcbiAgICogYmUgdXNlZCBmb3IgdGhpbmdzIGxpa2UgY2F0Y2hpbmcgY2hhbmdlcyBhbmQgZW1pdHRpbmcgdGhlbSBhZnRlciB0aGVcbiAgICogc3ViY2xhc3MgaGFzIGhhbmRsZWQgYSBwYXlsb2FkLlxuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXlsb2FkIFRoZSBkYXRhIGRpc3BhdGNoZWQgYnkgdGhlIGRpc3BhdGNoZXIsIGRlc2NyaWJpbmdcbiAgICogICBzb21ldGhpbmcgdGhhdCBoYXMgaGFwcGVuZWQgaW4gdGhlIHJlYWwgd29ybGQ6IHRoZSB1c2VyIGNsaWNrZWQsIHRoZVxuICAgKiAgIHNlcnZlciByZXNwb25kZWQsIHRpbWUgcGFzc2VkLCBldGMuXG4gICAqL1xuXG4gIEZsdXhTdG9yZS5wcm90b3R5cGUuX19pbnZva2VPbkRpc3BhdGNoID0gZnVuY3Rpb24gX19pbnZva2VPbkRpc3BhdGNoKHBheWxvYWQpIHtcbiAgICB0aGlzLl9fY2hhbmdlZCA9IGZhbHNlO1xuICAgIHRoaXMuX19vbkRpc3BhdGNoKHBheWxvYWQpO1xuICAgIGlmICh0aGlzLl9fY2hhbmdlZCkge1xuICAgICAgdGhpcy5fX2VtaXR0ZXIuZW1pdCh0aGlzLl9fY2hhbmdlRXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSByZWdpc3RlcmVkIHdpdGggdGhlIGRpc3BhdGNoZXIgZHVyaW5nXG4gICAqIGluc3RhbnRpYXRpb24uIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZC4gVGhpcyBjYWxsYmFjayBpcyB0aGVcbiAgICogb25seSB3YXkgdGhlIHN0b3JlIHJlY2VpdmVzIG5ldyBkYXRhLlxuICAgKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBvdmVycmlkZVxuICAgKiBAcGFyYW0ge29iamVjdH0gcGF5bG9hZCBUaGUgZGF0YSBkaXNwYXRjaGVkIGJ5IHRoZSBkaXNwYXRjaGVyLCBkZXNjcmliaW5nXG4gICAqICAgc29tZXRoaW5nIHRoYXQgaGFzIGhhcHBlbmVkIGluIHRoZSByZWFsIHdvcmxkOiB0aGUgdXNlciBjbGlja2VkLCB0aGVcbiAgICogICBzZXJ2ZXIgcmVzcG9uZGVkLCB0aW1lIHBhc3NlZCwgZXRjLlxuICAgKi9cblxuICBGbHV4U3RvcmUucHJvdG90eXBlLl9fb25EaXNwYXRjaCA9IGZ1bmN0aW9uIF9fb25EaXNwYXRjaChwYXlsb2FkKSB7XG4gICAgIWZhbHNlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzIGhhcyBub3Qgb3ZlcnJpZGRlbiBGbHV4U3RvcmUuX19vbkRpc3BhdGNoKCksIHdoaWNoIGlzIHJlcXVpcmVkJywgdGhpcy5fX2NsYXNzTmFtZSkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdW5kZWZpbmVkO1xuICB9O1xuXG4gIHJldHVybiBGbHV4U3RvcmU7XG59KSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZsdXhTdG9yZTtcblxuLy8gcHJpdmF0ZVxuXG4vLyBwcm90ZWN0ZWQsIGF2YWlsYWJsZSB0byBzdWJjbGFzc2VzIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBGbHV4U3RvcmVHcm91cFxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIEZsdXhTdG9yZUdyb3VwIGFsbG93cyB5b3UgdG8gZXhlY3V0ZSBhIGNhbGxiYWNrIG9uIGV2ZXJ5IGRpc3BhdGNoIGFmdGVyXG4gKiB3YWl0aW5nIGZvciBlYWNoIG9mIHRoZSBnaXZlbiBzdG9yZXMuXG4gKi9cblxudmFyIEZsdXhTdG9yZUdyb3VwID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRmx1eFN0b3JlR3JvdXAoc3RvcmVzLCBjYWxsYmFjaykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRmx1eFN0b3JlR3JvdXApO1xuXG4gICAgdGhpcy5fZGlzcGF0Y2hlciA9IF9nZXRVbmlmb3JtRGlzcGF0Y2hlcihzdG9yZXMpO1xuXG4gICAgLy8gcHJlY29tcHV0ZSBzdG9yZSB0b2tlbnNcbiAgICB2YXIgc3RvcmVUb2tlbnMgPSBzdG9yZXMubWFwKGZ1bmN0aW9uIChzdG9yZSkge1xuICAgICAgcmV0dXJuIHN0b3JlLmdldERpc3BhdGNoVG9rZW4oKTtcbiAgICB9KTtcblxuICAgIC8vIHJlZ2lzdGVyIHdpdGggdGhlIGRpc3BhdGNoZXJcbiAgICB0aGlzLl9kaXNwYXRjaFRva2VuID0gdGhpcy5fZGlzcGF0Y2hlci5yZWdpc3RlcihmdW5jdGlvbiAocGF5bG9hZCkge1xuICAgICAgX3RoaXMuX2Rpc3BhdGNoZXIud2FpdEZvcihzdG9yZVRva2Vucyk7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgRmx1eFN0b3JlR3JvdXAucHJvdG90eXBlLnJlbGVhc2UgPSBmdW5jdGlvbiByZWxlYXNlKCkge1xuICAgIHRoaXMuX2Rpc3BhdGNoZXIudW5yZWdpc3Rlcih0aGlzLl9kaXNwYXRjaFRva2VuKTtcbiAgfTtcblxuICByZXR1cm4gRmx1eFN0b3JlR3JvdXA7XG59KSgpO1xuXG5mdW5jdGlvbiBfZ2V0VW5pZm9ybURpc3BhdGNoZXIoc3RvcmVzKSB7XG4gICEoc3RvcmVzICYmIHN0b3Jlcy5sZW5ndGgpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ011c3QgcHJvdmlkZSBhdCBsZWFzdCBvbmUgc3RvcmUgdG8gRmx1eFN0b3JlR3JvdXAnKSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG4gIHZhciBkaXNwYXRjaGVyID0gc3RvcmVzWzBdLmdldERpc3BhdGNoZXIoKTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBzdG9yZXMsIF9pc0FycmF5ID0gQXJyYXkuaXNBcnJheShfaXRlcmF0b3IpLCBfaSA9IDAsIF9pdGVyYXRvciA9IF9pc0FycmF5ID8gX2l0ZXJhdG9yIDogX2l0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl0oKTs7KSB7XG4gICAgICB2YXIgX3JlZjtcblxuICAgICAgaWYgKF9pc0FycmF5KSB7XG4gICAgICAgIGlmIChfaSA+PSBfaXRlcmF0b3IubGVuZ3RoKSBicmVhaztcbiAgICAgICAgX3JlZiA9IF9pdGVyYXRvcltfaSsrXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9pID0gX2l0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgaWYgKF9pLmRvbmUpIGJyZWFrO1xuICAgICAgICBfcmVmID0gX2kudmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBzdG9yZSA9IF9yZWY7XG5cbiAgICAgICEoc3RvcmUuZ2V0RGlzcGF0Y2hlcigpID09PSBkaXNwYXRjaGVyKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdBbGwgc3RvcmVzIGluIGEgRmx1eFN0b3JlR3JvdXAgbXVzdCB1c2UgdGhlIHNhbWUgZGlzcGF0Y2hlcicpIDogaW52YXJpYW50KGZhbHNlKSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpc3BhdGNoZXI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRmx1eFN0b3JlR3JvdXA7IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBhYnN0cmFjdE1ldGhvZFxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbmZ1bmN0aW9uIGFic3RyYWN0TWV0aG9kKGNsYXNzTmFtZSwgbWV0aG9kTmFtZSkge1xuICAhZmFsc2UgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnU3ViY2xhc3NlcyBvZiAlcyBtdXN0IG92ZXJyaWRlICVzKCkgd2l0aCB0aGVpciBvd24gaW1wbGVtZW50YXRpb24uJywgY2xhc3NOYW1lLCBtZXRob2ROYW1lKSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYWJzdHJhY3RNZXRob2Q7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIGludmFyaWFudFxuICovXG5cblwidXNlIHN0cmljdFwiO1xuXG4vKipcbiAqIFVzZSBpbnZhcmlhbnQoKSB0byBhc3NlcnQgc3RhdGUgd2hpY2ggeW91ciBwcm9ncmFtIGFzc3VtZXMgdG8gYmUgdHJ1ZS5cbiAqXG4gKiBQcm92aWRlIHNwcmludGYtc3R5bGUgZm9ybWF0IChvbmx5ICVzIGlzIHN1cHBvcnRlZCkgYW5kIGFyZ3VtZW50c1xuICogdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGJyb2tlIGFuZCB3aGF0IHlvdSB3ZXJlXG4gKiBleHBlY3RpbmcuXG4gKlxuICogVGhlIGludmFyaWFudCBtZXNzYWdlIHdpbGwgYmUgc3RyaXBwZWQgaW4gcHJvZHVjdGlvbiwgYnV0IHRoZSBpbnZhcmlhbnRcbiAqIHdpbGwgcmVtYWluIHRvIGVuc3VyZSBsb2dpYyBkb2VzIG5vdCBkaWZmZXIgaW4gcHJvZHVjdGlvbi5cbiAqL1xuXG52YXIgaW52YXJpYW50ID0gZnVuY3Rpb24gKGNvbmRpdGlvbiwgZm9ybWF0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFyaWFudCByZXF1aXJlcyBhbiBlcnJvciBtZXNzYWdlIGFyZ3VtZW50Jyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB2YXIgZXJyb3I7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcignTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgJyArICdmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXJncyA9IFthLCBiLCBjLCBkLCBlLCBmXTtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcignSW52YXJpYW50IFZpb2xhdGlvbjogJyArIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgfSkpO1xuICAgIH1cblxuICAgIGVycm9yLmZyYW1lc1RvUG9wID0gMTsgLy8gd2UgZG9uJ3QgY2FyZSBhYm91dCBpbnZhcmlhbnQncyBvd24gZnJhbWVcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBpbnZhcmlhbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIHNoYWxsb3dFcXVhbFxuICogQHR5cGVjaGVja3NcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBQZXJmb3JtcyBlcXVhbGl0eSBieSBpdGVyYXRpbmcgdGhyb3VnaCBrZXlzIG9uIGFuIG9iamVjdCBhbmQgcmV0dXJuaW5nIGZhbHNlXG4gKiB3aGVuIGFueSBrZXkgaGFzIHZhbHVlcyB3aGljaCBhcmUgbm90IHN0cmljdGx5IGVxdWFsIGJldHdlZW4gdGhlIGFyZ3VtZW50cy5cbiAqIFJldHVybnMgdHJ1ZSB3aGVuIHRoZSB2YWx1ZXMgb2YgYWxsIGtleXMgYXJlIHN0cmljdGx5IGVxdWFsLlxuICovXG5mdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQikge1xuICBpZiAob2JqQSA9PT0gb2JqQikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXG4gIHZhciBiSGFzT3duUHJvcGVydHkgPSBoYXNPd25Qcm9wZXJ0eS5iaW5kKG9iakIpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXNBLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFiSGFzT3duUHJvcGVydHkoa2V5c0FbaV0pIHx8IG9iakFba2V5c0FbaV1dICE9PSBvYmpCW2tleXNBW2ldXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNoYWxsb3dFcXVhbDsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMuQ29udGFpbmVyID0gcmVxdWlyZSgnLi9saWIvRmx1eENvbnRhaW5lcicpO1xubW9kdWxlLmV4cG9ydHMuTWFwU3RvcmUgPSByZXF1aXJlKCcuL2xpYi9GbHV4TWFwU3RvcmUnKTtcbm1vZHVsZS5leHBvcnRzLk1peGluID0gcmVxdWlyZSgnLi9saWIvRmx1eE1peGluTGVnYWN5Jyk7XG5tb2R1bGUuZXhwb3J0cy5SZWR1Y2VTdG9yZSA9IHJlcXVpcmUoJy4vbGliL0ZsdXhSZWR1Y2VTdG9yZScpO1xubW9kdWxlLmV4cG9ydHMuU3RvcmUgPSByZXF1aXJlKCcuL2xpYi9GbHV4U3RvcmUnKTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vISBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbid1c2Ugc3RyaWN0JztcblxudmFyIFJFQUNUX1NUQVRJQ1MgPSB7XG4gICAgY2hpbGRDb250ZXh0VHlwZXM6IHRydWUsXG4gICAgY29udGV4dFR5cGVzOiB0cnVlLFxuICAgIGRlZmF1bHRQcm9wczogdHJ1ZSxcbiAgICBkaXNwbGF5TmFtZTogdHJ1ZSxcbiAgICBnZXREZWZhdWx0UHJvcHM6IHRydWUsXG4gICAgbWl4aW5zOiB0cnVlLFxuICAgIHByb3BUeXBlczogdHJ1ZSxcbiAgICB0eXBlOiB0cnVlXG59O1xuXG52YXIgS05PV05fU1RBVElDUyA9IHtcbiAgICBuYW1lOiB0cnVlLFxuICAgIGxlbmd0aDogdHJ1ZSxcbiAgICBwcm90b3R5cGU6IHRydWUsXG4gICAgY2FsbGVyOiB0cnVlLFxuICAgIGFyZ3VtZW50czogdHJ1ZSxcbiAgICBhcml0eTogdHJ1ZVxufTtcblxudmFyIGlzR2V0T3duUHJvcGVydHlTeW1ib2xzQXZhaWxhYmxlID0gdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbic7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaG9pc3ROb25SZWFjdFN0YXRpY3ModGFyZ2V0Q29tcG9uZW50LCBzb3VyY2VDb21wb25lbnQsIGN1c3RvbVN0YXRpY3MpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZUNvbXBvbmVudCAhPT0gJ3N0cmluZycpIHsgLy8gZG9uJ3QgaG9pc3Qgb3ZlciBzdHJpbmcgKGh0bWwpIGNvbXBvbmVudHNcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2VDb21wb25lbnQpO1xuXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChpc0dldE93blByb3BlcnR5U3ltYm9sc0F2YWlsYWJsZSkge1xuICAgICAgICAgICAga2V5cyA9IGtleXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlQ29tcG9uZW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmICghUkVBQ1RfU1RBVElDU1trZXlzW2ldXSAmJiAhS05PV05fU1RBVElDU1trZXlzW2ldXSAmJiAoIWN1c3RvbVN0YXRpY3MgfHwgIWN1c3RvbVN0YXRpY3Nba2V5c1tpXV0pKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Q29tcG9uZW50W2tleXNbaV1dID0gc291cmNlQ29tcG9uZW50W2tleXNbaV1dO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGFyZ2V0Q29tcG9uZW50O1xufTtcbiIsIlxuKGZ1bmN0aW9uKCkge1xuXG4gIC8vIEJhc2VsaW5lIHNldHVwXG4gIC8vIC0tLS0tLS0tLS0tLS0tXG5cbiAgLy8gRXN0YWJsaXNoIHRoZSByb290IG9iamVjdCwgYHdpbmRvd2AgaW4gdGhlIGJyb3dzZXIsIG9yIGBnbG9iYWxgIG9uIHRoZSBzZXJ2ZXIuXG4gIHZhciByb290ID0gdGhpcztcblxuICAvLyBTYXZlIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgYGh1bWFuaXplYCB2YXJpYWJsZS5cbiAgdmFyIHByZXZpb3VzSHVtYW5pemUgPSByb290Lmh1bWFuaXplO1xuXG4gIHZhciBodW1hbml6ZSA9IHt9O1xuXG4gIGlmICh0eXBlb2YgZXhwb3J0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgIGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGh1bWFuaXplO1xuICAgIH1cbiAgICBleHBvcnRzLmh1bWFuaXplID0gaHVtYW5pemU7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgZGVmaW5lKCdodW1hbml6ZScsIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gaHVtYW5pemU7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcm9vdC5odW1hbml6ZSA9IGh1bWFuaXplO1xuICB9XG5cbiAgaHVtYW5pemUubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgIHJvb3QuaHVtYW5pemUgPSBwcmV2aW91c0h1bWFuaXplO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIGh1bWFuaXplLnBhZCA9IGZ1bmN0aW9uKHN0ciwgY291bnQsIHBhZENoYXIsIHR5cGUpIHtcbiAgICBzdHIgKz0gJyc7XG4gICAgaWYgKCFwYWRDaGFyKSB7XG4gICAgICBwYWRDaGFyID0gJyAnO1xuICAgIH0gZWxzZSBpZiAocGFkQ2hhci5sZW5ndGggPiAxKSB7XG4gICAgICBwYWRDaGFyID0gcGFkQ2hhci5jaGFyQXQoMCk7XG4gICAgfVxuICAgIHR5cGUgPSAodHlwZSA9PT0gdW5kZWZpbmVkKSA/ICdsZWZ0JyA6ICdyaWdodCc7XG5cbiAgICBpZiAodHlwZSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgd2hpbGUgKHN0ci5sZW5ndGggPCBjb3VudCkge1xuICAgICAgICBzdHIgPSBzdHIgKyBwYWRDaGFyO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBkZWZhdWx0IHRvIGxlZnRcbiAgICAgIHdoaWxlIChzdHIubGVuZ3RoIDwgY291bnQpIHtcbiAgICAgICAgc3RyID0gcGFkQ2hhciArIHN0cjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RyO1xuICB9O1xuXG4gIC8vIGdldHMgY3VycmVudCB1bml4IHRpbWVcbiAgaHVtYW5pemUudGltZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKSAvIDEwMDA7XG4gIH07XG5cbiAgLyoqXG4gICAqIFBIUC1pbnNwaXJlZCBkYXRlXG4gICAqL1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvKiAgamFuICBmZWIgIG1hciAgYXByICBtYXkgIGp1biAganVsICBhdWcgIHNlcCAgb2N0ICBub3YgIGRlYyAqL1xuICB2YXIgZGF5VGFibGVDb21tb24gPSBbIDAsICAgMCwgIDMxLCAgNTksICA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzQgXTtcbiAgdmFyIGRheVRhYmxlTGVhcCAgID0gWyAwLCAgIDAsICAzMSwgIDYwLCAgOTEsIDEyMSwgMTUyLCAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1IF07XG4gIC8vIHZhciBtdGFibGVfY29tbW9uWzEzXSA9IHsgIDAsICAzMSwgIDI4LCAgMzEsICAzMCwgIDMxLCAgMzAsICAzMSwgIDMxLCAgMzAsICAzMSwgIDMwLCAgMzEgfTtcbiAgLy8gc3RhdGljIGludCBtbF90YWJsZV9sZWFwWzEzXSAgID0geyAgMCwgIDMxLCAgMjksICAzMSwgIDMwLCAgMzEsICAzMCwgIDMxLCAgMzEsICAzMCwgIDMxLCAgMzAsICAzMSB9O1xuXG5cbiAgaHVtYW5pemUuZGF0ZSA9IGZ1bmN0aW9uKGZvcm1hdCwgdGltZXN0YW1wKSB7XG4gICAgdmFyIGpzZGF0ZSA9ICgodGltZXN0YW1wID09PSB1bmRlZmluZWQpID8gbmV3IERhdGUoKSA6IC8vIE5vdCBwcm92aWRlZFxuICAgICAgICAgICAgICAgICAgKHRpbWVzdGFtcCBpbnN0YW5jZW9mIERhdGUpID8gbmV3IERhdGUodGltZXN0YW1wKSA6IC8vIEpTIERhdGUoKVxuICAgICAgICAgICAgICAgICAgbmV3IERhdGUodGltZXN0YW1wICogMTAwMCkgLy8gVU5JWCB0aW1lc3RhbXAgKGF1dG8tY29udmVydCB0byBpbnQpXG4gICAgICAgICAgICAgICAgICk7XG5cbiAgICB2YXIgZm9ybWF0Q2hyID0gL1xcXFw/KFthLXpdKS9naTtcbiAgICB2YXIgZm9ybWF0Q2hyQ2IgPSBmdW5jdGlvbiAodCwgcykge1xuICAgICAgcmV0dXJuIGZbdF0gPyBmW3RdKCkgOiBzO1xuICAgIH07XG5cbiAgICB2YXIgc2hvcnREYXlUeHQgPSBbJ1N1bmRheScsICdNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5J107XG4gICAgdmFyIG1vbnRoVHh0ID0gWydKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJ107XG5cbiAgICB2YXIgZiA9IHtcbiAgICAgIC8qIERheSAqL1xuICAgICAgLy8gRGF5IG9mIG1vbnRoIHcvbGVhZGluZyAwOyAwMS4uMzFcbiAgICAgIGQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGh1bWFuaXplLnBhZChmLmooKSwgMiwgJzAnKTsgfSxcblxuICAgICAgLy8gU2hvcnRoYW5kIGRheSBuYW1lOyBNb24uLlN1blxuICAgICAgRDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZi5sKCkuc2xpY2UoMCwgMyk7IH0sXG5cbiAgICAgIC8vIERheSBvZiBtb250aDsgMS4uMzFcbiAgICAgIGo6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGpzZGF0ZS5nZXREYXRlKCk7IH0sXG5cbiAgICAgIC8vIEZ1bGwgZGF5IG5hbWU7IE1vbmRheS4uU3VuZGF5XG4gICAgICBsOiBmdW5jdGlvbiAoKSB7IHJldHVybiBzaG9ydERheVR4dFtmLncoKV07IH0sXG5cbiAgICAgIC8vIElTTy04NjAxIGRheSBvZiB3ZWVrOyAxW01vbl0uLjdbU3VuXVxuICAgICAgTjogZnVuY3Rpb24gKCkgeyByZXR1cm4gZi53KCkgfHwgNzsgfSxcblxuICAgICAgLy8gT3JkaW5hbCBzdWZmaXggZm9yIGRheSBvZiBtb250aDsgc3QsIG5kLCByZCwgdGhcbiAgICAgIFM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGogPSBmLmooKTtcbiAgICAgICAgcmV0dXJuIGogPiA0ICYmIGogPCAyMSA/ICd0aCcgOiB7MTogJ3N0JywgMjogJ25kJywgMzogJ3JkJ31baiAlIDEwXSB8fCAndGgnO1xuICAgICAgfSxcblxuICAgICAgLy8gRGF5IG9mIHdlZWs7IDBbU3VuXS4uNltTYXRdXG4gICAgICB3OiBmdW5jdGlvbiAoKSB7IHJldHVybiBqc2RhdGUuZ2V0RGF5KCk7IH0sXG5cbiAgICAgIC8vIERheSBvZiB5ZWFyOyAwLi4zNjVcbiAgICAgIHo6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIChmLkwoKSA/IGRheVRhYmxlTGVhcFtmLm4oKV0gOiBkYXlUYWJsZUNvbW1vbltmLm4oKV0pICsgZi5qKCkgLSAxO1xuICAgICAgfSxcblxuICAgICAgLyogV2VlayAqL1xuICAgICAgLy8gSVNPLTg2MDEgd2VlayBudW1iZXJcbiAgICAgIFc6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gZGF5cyBiZXR3ZWVuIG1pZHdlZWsgb2YgdGhpcyB3ZWVrIGFuZCBqYW4gNFxuICAgICAgICAvLyAoZi56KCkgLSBmLk4oKSArIDEgKyAzLjUpIC0gM1xuICAgICAgICB2YXIgbWlkV2Vla0RheXNGcm9tSmFuNCA9IGYueigpIC0gZi5OKCkgKyAxLjU7XG4gICAgICAgIC8vIDEgKyBudW1iZXIgb2Ygd2Vla3MgKyByb3VuZGVkIHdlZWtcbiAgICAgICAgcmV0dXJuIGh1bWFuaXplLnBhZCgxICsgTWF0aC5mbG9vcihNYXRoLmFicyhtaWRXZWVrRGF5c0Zyb21KYW40KSAvIDcpICsgKG1pZFdlZWtEYXlzRnJvbUphbjQgJSA3ID4gMy41ID8gMSA6IDApLCAyLCAnMCcpO1xuICAgICAgfSxcblxuICAgICAgLyogTW9udGggKi9cbiAgICAgIC8vIEZ1bGwgbW9udGggbmFtZTsgSmFudWFyeS4uRGVjZW1iZXJcbiAgICAgIEY6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1vbnRoVHh0W2pzZGF0ZS5nZXRNb250aCgpXTsgfSxcblxuICAgICAgLy8gTW9udGggdy9sZWFkaW5nIDA7IDAxLi4xMlxuICAgICAgbTogZnVuY3Rpb24gKCkgeyByZXR1cm4gaHVtYW5pemUucGFkKGYubigpLCAyLCAnMCcpOyB9LFxuXG4gICAgICAvLyBTaG9ydGhhbmQgbW9udGggbmFtZTsgSmFuLi5EZWNcbiAgICAgIE06IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGYuRigpLnNsaWNlKDAsIDMpOyB9LFxuXG4gICAgICAvLyBNb250aDsgMS4uMTJcbiAgICAgIG46IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGpzZGF0ZS5nZXRNb250aCgpICsgMTsgfSxcblxuICAgICAgLy8gRGF5cyBpbiBtb250aDsgMjguLjMxXG4gICAgICB0OiBmdW5jdGlvbiAoKSB7IHJldHVybiAobmV3IERhdGUoZi5ZKCksIGYubigpLCAwKSkuZ2V0RGF0ZSgpOyB9LFxuXG4gICAgICAvKiBZZWFyICovXG4gICAgICAvLyBJcyBsZWFwIHllYXI/OyAwIG9yIDFcbiAgICAgIEw6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBEYXRlKGYuWSgpLCAxLCAyOSkuZ2V0TW9udGgoKSA9PT0gMSA/IDEgOiAwOyB9LFxuXG4gICAgICAvLyBJU08tODYwMSB5ZWFyXG4gICAgICBvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBuID0gZi5uKCk7XG4gICAgICAgIHZhciBXID0gZi5XKCk7XG4gICAgICAgIHJldHVybiBmLlkoKSArIChuID09PSAxMiAmJiBXIDwgOSA/IC0xIDogbiA9PT0gMSAmJiBXID4gOSk7XG4gICAgICB9LFxuXG4gICAgICAvLyBGdWxsIHllYXI7IGUuZy4gMTk4MC4uMjAxMFxuICAgICAgWTogZnVuY3Rpb24gKCkgeyByZXR1cm4ganNkYXRlLmdldEZ1bGxZZWFyKCk7IH0sXG5cbiAgICAgIC8vIExhc3QgdHdvIGRpZ2l0cyBvZiB5ZWFyOyAwMC4uOTlcbiAgICAgIHk6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChTdHJpbmcoZi5ZKCkpKS5zbGljZSgtMik7IH0sXG5cbiAgICAgIC8qIFRpbWUgKi9cbiAgICAgIC8vIGFtIG9yIHBtXG4gICAgICBhOiBmdW5jdGlvbiAoKSB7IHJldHVybiBqc2RhdGUuZ2V0SG91cnMoKSA+IDExID8gJ3BtJyA6ICdhbSc7IH0sXG5cbiAgICAgIC8vIEFNIG9yIFBNXG4gICAgICBBOiBmdW5jdGlvbiAoKSB7IHJldHVybiBmLmEoKS50b1VwcGVyQ2FzZSgpOyB9LFxuXG4gICAgICAvLyBTd2F0Y2ggSW50ZXJuZXQgdGltZTsgMDAwLi45OTlcbiAgICAgIEI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHVuaXhUaW1lID0ganNkYXRlLmdldFRpbWUoKSAvIDEwMDA7XG4gICAgICAgIHZhciBzZWNvbmRzUGFzc2VkVG9kYXkgPSB1bml4VGltZSAlIDg2NDAwICsgMzYwMDsgLy8gc2luY2UgaXQncyBiYXNlZCBvZmYgb2YgVVRDKzFcbiAgICAgICAgaWYgKHNlY29uZHNQYXNzZWRUb2RheSA8IDApIHsgc2Vjb25kc1Bhc3NlZFRvZGF5ICs9IDg2NDAwOyB9XG4gICAgICAgIHZhciBiZWF0cyA9ICgoc2Vjb25kc1Bhc3NlZFRvZGF5KSAvIDg2LjQpICUgMTAwMDtcbiAgICAgICAgaWYgKHVuaXhUaW1lIDwgMCkge1xuICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwoYmVhdHMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKGJlYXRzKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIDEyLUhvdXJzOyAxLi4xMlxuICAgICAgZzogZnVuY3Rpb24gKCkgeyByZXR1cm4gZi5HKCkgJSAxMiB8fCAxMjsgfSxcblxuICAgICAgLy8gMjQtSG91cnM7IDAuLjIzXG4gICAgICBHOiBmdW5jdGlvbiAoKSB7IHJldHVybiBqc2RhdGUuZ2V0SG91cnMoKTsgfSxcblxuICAgICAgLy8gMTItSG91cnMgdy9sZWFkaW5nIDA7IDAxLi4xMlxuICAgICAgaDogZnVuY3Rpb24gKCkgeyByZXR1cm4gaHVtYW5pemUucGFkKGYuZygpLCAyLCAnMCcpOyB9LFxuXG4gICAgICAvLyAyNC1Ib3VycyB3L2xlYWRpbmcgMDsgMDAuLjIzXG4gICAgICBIOiBmdW5jdGlvbiAoKSB7IHJldHVybiBodW1hbml6ZS5wYWQoZi5HKCksIDIsICcwJyk7IH0sXG5cbiAgICAgIC8vIE1pbnV0ZXMgdy9sZWFkaW5nIDA7IDAwLi41OVxuICAgICAgaTogZnVuY3Rpb24gKCkgeyByZXR1cm4gaHVtYW5pemUucGFkKGpzZGF0ZS5nZXRNaW51dGVzKCksIDIsICcwJyk7IH0sXG5cbiAgICAgIC8vIFNlY29uZHMgdy9sZWFkaW5nIDA7IDAwLi41OVxuICAgICAgczogZnVuY3Rpb24gKCkgeyByZXR1cm4gaHVtYW5pemUucGFkKGpzZGF0ZS5nZXRTZWNvbmRzKCksIDIsICcwJyk7IH0sXG5cbiAgICAgIC8vIE1pY3Jvc2Vjb25kczsgMDAwMDAwLTk5OTAwMFxuICAgICAgdTogZnVuY3Rpb24gKCkgeyByZXR1cm4gaHVtYW5pemUucGFkKGpzZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSAqIDEwMDAsIDYsICcwJyk7IH0sXG5cbiAgICAgIC8vIFdoZXRoZXIgb3Igbm90IHRoZSBkYXRlIGlzIGluIGRheWxpZ2h0IHNhdmluZ3MgdGltZVxuICAgICAgLypcbiAgICAgIEk6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gQ29tcGFyZXMgSmFuIDEgbWludXMgSmFuIDEgVVRDIHRvIEp1bCAxIG1pbnVzIEp1bCAxIFVUQy5cbiAgICAgICAgLy8gSWYgdGhleSBhcmUgbm90IGVxdWFsLCB0aGVuIERTVCBpcyBvYnNlcnZlZC5cbiAgICAgICAgdmFyIFkgPSBmLlkoKTtcbiAgICAgICAgcmV0dXJuIDAgKyAoKG5ldyBEYXRlKFksIDApIC0gRGF0ZS5VVEMoWSwgMCkpICE9PSAobmV3IERhdGUoWSwgNikgLSBEYXRlLlVUQyhZLCA2KSkpO1xuICAgICAgfSxcbiAgICAgICovXG5cbiAgICAgIC8vIERpZmZlcmVuY2UgdG8gR01UIGluIGhvdXIgZm9ybWF0OyBlLmcuICswMjAwXG4gICAgICBPOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB0em8gPSBqc2RhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKTtcbiAgICAgICAgdmFyIHR6b051bSA9IE1hdGguYWJzKHR6byk7XG4gICAgICAgIHJldHVybiAodHpvID4gMCA/ICctJyA6ICcrJykgKyBodW1hbml6ZS5wYWQoTWF0aC5mbG9vcih0em9OdW0gLyA2MCkgKiAxMDAgKyB0em9OdW0gJSA2MCwgNCwgJzAnKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIERpZmZlcmVuY2UgdG8gR01UIHcvY29sb247IGUuZy4gKzAyOjAwXG4gICAgICBQOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBPID0gZi5PKCk7XG4gICAgICAgIHJldHVybiAoTy5zdWJzdHIoMCwgMykgKyAnOicgKyBPLnN1YnN0cigzLCAyKSk7XG4gICAgICB9LFxuXG4gICAgICAvLyBUaW1lem9uZSBvZmZzZXQgaW4gc2Vjb25kcyAoLTQzMjAwLi41MDQwMClcbiAgICAgIFo6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIC1qc2RhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwOyB9LFxuXG4gICAgICAvLyBGdWxsIERhdGUvVGltZSwgSVNPLTg2MDEgZGF0ZVxuICAgICAgYzogZnVuY3Rpb24gKCkgeyByZXR1cm4gJ1ktbS1kXFxcXFRIOmk6c1AnLnJlcGxhY2UoZm9ybWF0Q2hyLCBmb3JtYXRDaHJDYik7IH0sXG5cbiAgICAgIC8vIFJGQyAyODIyXG4gICAgICByOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnRCwgZCBNIFkgSDppOnMgTycucmVwbGFjZShmb3JtYXRDaHIsIGZvcm1hdENockNiKTsgfSxcblxuICAgICAgLy8gU2Vjb25kcyBzaW5jZSBVTklYIGVwb2NoXG4gICAgICBVOiBmdW5jdGlvbiAoKSB7IHJldHVybiBqc2RhdGUuZ2V0VGltZSgpIC8gMTAwMCB8fCAwOyB9XG4gICAgfTsgICAgXG5cbiAgICByZXR1cm4gZm9ybWF0LnJlcGxhY2UoZm9ybWF0Q2hyLCBmb3JtYXRDaHJDYik7XG4gIH07XG5cblxuICAvKipcbiAgICogZm9ybWF0IG51bWJlciBieSBhZGRpbmcgdGhvdXNhbmRzIHNlcGFyYXRlcnMgYW5kIHNpZ25pZmljYW50IGRpZ2l0cyB3aGlsZSByb3VuZGluZ1xuICAgKi9cbiAgaHVtYW5pemUubnVtYmVyRm9ybWF0ID0gZnVuY3Rpb24obnVtYmVyLCBkZWNpbWFscywgZGVjUG9pbnQsIHRob3VzYW5kc1NlcCkge1xuICAgIGRlY2ltYWxzID0gaXNOYU4oZGVjaW1hbHMpID8gMiA6IE1hdGguYWJzKGRlY2ltYWxzKTtcbiAgICBkZWNQb2ludCA9IChkZWNQb2ludCA9PT0gdW5kZWZpbmVkKSA/ICcuJyA6IGRlY1BvaW50O1xuICAgIHRob3VzYW5kc1NlcCA9ICh0aG91c2FuZHNTZXAgPT09IHVuZGVmaW5lZCkgPyAnLCcgOiB0aG91c2FuZHNTZXA7XG5cbiAgICB2YXIgc2lnbiA9IG51bWJlciA8IDAgPyAnLScgOiAnJztcbiAgICBudW1iZXIgPSBNYXRoLmFicygrbnVtYmVyIHx8IDApO1xuXG4gICAgdmFyIGludFBhcnQgPSBwYXJzZUludChudW1iZXIudG9GaXhlZChkZWNpbWFscyksIDEwKSArICcnO1xuICAgIHZhciBqID0gaW50UGFydC5sZW5ndGggPiAzID8gaW50UGFydC5sZW5ndGggJSAzIDogMDtcblxuICAgIHJldHVybiBzaWduICsgKGogPyBpbnRQYXJ0LnN1YnN0cigwLCBqKSArIHRob3VzYW5kc1NlcCA6ICcnKSArIGludFBhcnQuc3Vic3RyKGopLnJlcGxhY2UoLyhcXGR7M30pKD89XFxkKS9nLCAnJDEnICsgdGhvdXNhbmRzU2VwKSArIChkZWNpbWFscyA/IGRlY1BvaW50ICsgTWF0aC5hYnMobnVtYmVyIC0gaW50UGFydCkudG9GaXhlZChkZWNpbWFscykuc2xpY2UoMikgOiAnJyk7XG4gIH07XG5cblxuICAvKipcbiAgICogRm9yIGRhdGVzIHRoYXQgYXJlIHRoZSBjdXJyZW50IGRheSBvciB3aXRoaW4gb25lIGRheSwgcmV0dXJuICd0b2RheScsICd0b21vcnJvdycgb3IgJ3llc3RlcmRheScsIGFzIGFwcHJvcHJpYXRlLlxuICAgKiBPdGhlcndpc2UsIGZvcm1hdCB0aGUgZGF0ZSB1c2luZyB0aGUgcGFzc2VkIGluIGZvcm1hdCBzdHJpbmcuXG4gICAqXG4gICAqIEV4YW1wbGVzICh3aGVuICd0b2RheScgaXMgMTcgRmViIDIwMDcpOlxuICAgKiAxNiBGZWIgMjAwNyBiZWNvbWVzIHllc3RlcmRheS5cbiAgICogMTcgRmViIDIwMDcgYmVjb21lcyB0b2RheS5cbiAgICogMTggRmViIDIwMDcgYmVjb21lcyB0b21vcnJvdy5cbiAgICogQW55IG90aGVyIGRheSBpcyBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIGdpdmVuIGFyZ3VtZW50IG9yIHRoZSBEQVRFX0ZPUk1BVCBzZXR0aW5nIGlmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLlxuICAgKi9cbiAgaHVtYW5pemUubmF0dXJhbERheSA9IGZ1bmN0aW9uKHRpbWVzdGFtcCwgZm9ybWF0KSB7XG4gICAgdGltZXN0YW1wID0gKHRpbWVzdGFtcCA9PT0gdW5kZWZpbmVkKSA/IGh1bWFuaXplLnRpbWUoKSA6IHRpbWVzdGFtcDtcbiAgICBmb3JtYXQgPSAoZm9ybWF0ID09PSB1bmRlZmluZWQpID8gJ1ktbS1kJyA6IGZvcm1hdDtcblxuICAgIHZhciBvbmVEYXkgPSA4NjQwMDtcbiAgICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gICAgdmFyIHRvZGF5ID0gKG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwgZC5nZXRNb250aCgpLCBkLmdldERhdGUoKSkpLmdldFRpbWUoKSAvIDEwMDA7XG5cbiAgICBpZiAodGltZXN0YW1wIDwgdG9kYXkgJiYgdGltZXN0YW1wID49IHRvZGF5IC0gb25lRGF5KSB7XG4gICAgICByZXR1cm4gJ3llc3RlcmRheSc7XG4gICAgfSBlbHNlIGlmICh0aW1lc3RhbXAgPj0gdG9kYXkgJiYgdGltZXN0YW1wIDwgdG9kYXkgKyBvbmVEYXkpIHtcbiAgICAgIHJldHVybiAndG9kYXknO1xuICAgIH0gZWxzZSBpZiAodGltZXN0YW1wID49IHRvZGF5ICsgb25lRGF5ICYmIHRpbWVzdGFtcCA8IHRvZGF5ICsgMiAqIG9uZURheSkge1xuICAgICAgcmV0dXJuICd0b21vcnJvdyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGh1bWFuaXplLmRhdGUoZm9ybWF0LCB0aW1lc3RhbXApO1xuICB9O1xuXG4gIC8qKlxuICAgKiByZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyBob3cgbWFueSBzZWNvbmRzLCBtaW51dGVzIG9yIGhvdXJzIGFnbyBpdCB3YXMgb3Igd2lsbCBiZSBpbiB0aGUgZnV0dXJlXG4gICAqIFdpbGwgYWx3YXlzIHJldHVybiBhIHJlbGF0aXZlIHRpbWUsIG1vc3QgZ3JhbnVsYXIgb2Ygc2Vjb25kcyB0byBsZWFzdCBncmFudWxhciBvZiB5ZWFycy4gU2VlIHVuaXQgdGVzdHMgZm9yIG1vcmUgZGV0YWlsc1xuICAgKi9cbiAgaHVtYW5pemUucmVsYXRpdmVUaW1lID0gZnVuY3Rpb24odGltZXN0YW1wKSB7XG4gICAgdGltZXN0YW1wID0gKHRpbWVzdGFtcCA9PT0gdW5kZWZpbmVkKSA/IGh1bWFuaXplLnRpbWUoKSA6IHRpbWVzdGFtcDtcblxuICAgIHZhciBjdXJyVGltZSA9IGh1bWFuaXplLnRpbWUoKTtcbiAgICB2YXIgdGltZURpZmYgPSBjdXJyVGltZSAtIHRpbWVzdGFtcDtcblxuICAgIC8vIHdpdGhpbiAyIHNlY29uZHNcbiAgICBpZiAodGltZURpZmYgPCAyICYmIHRpbWVEaWZmID4gLTIpIHtcbiAgICAgIHJldHVybiAodGltZURpZmYgPj0gMCA/ICdqdXN0ICcgOiAnJykgKyAnbm93JztcbiAgICB9XG5cbiAgICAvLyB3aXRoaW4gYSBtaW51dGVcbiAgICBpZiAodGltZURpZmYgPCA2MCAmJiB0aW1lRGlmZiA+IC02MCkge1xuICAgICAgcmV0dXJuICh0aW1lRGlmZiA+PSAwID8gTWF0aC5mbG9vcih0aW1lRGlmZikgKyAnIHNlY29uZHMgYWdvJyA6ICdpbiAnICsgTWF0aC5mbG9vcigtdGltZURpZmYpICsgJyBzZWNvbmRzJyk7XG4gICAgfVxuXG4gICAgLy8gd2l0aGluIDIgbWludXRlc1xuICAgIGlmICh0aW1lRGlmZiA8IDEyMCAmJiB0aW1lRGlmZiA+IC0xMjApIHtcbiAgICAgIHJldHVybiAodGltZURpZmYgPj0gMCA/ICdhYm91dCBhIG1pbnV0ZSBhZ28nIDogJ2luIGFib3V0IGEgbWludXRlJyk7XG4gICAgfVxuXG4gICAgLy8gd2l0aGluIGFuIGhvdXJcbiAgICBpZiAodGltZURpZmYgPCAzNjAwICYmIHRpbWVEaWZmID4gLTM2MDApIHtcbiAgICAgIHJldHVybiAodGltZURpZmYgPj0gMCA/IE1hdGguZmxvb3IodGltZURpZmYgLyA2MCkgKyAnIG1pbnV0ZXMgYWdvJyA6ICdpbiAnICsgTWF0aC5mbG9vcigtdGltZURpZmYgLyA2MCkgKyAnIG1pbnV0ZXMnKTtcbiAgICB9XG5cbiAgICAvLyB3aXRoaW4gMiBob3Vyc1xuICAgIGlmICh0aW1lRGlmZiA8IDcyMDAgJiYgdGltZURpZmYgPiAtNzIwMCkge1xuICAgICAgcmV0dXJuICh0aW1lRGlmZiA+PSAwID8gJ2Fib3V0IGFuIGhvdXIgYWdvJyA6ICdpbiBhYm91dCBhbiBob3VyJyk7XG4gICAgfVxuXG4gICAgLy8gd2l0aGluIDI0IGhvdXJzXG4gICAgaWYgKHRpbWVEaWZmIDwgODY0MDAgJiYgdGltZURpZmYgPiAtODY0MDApIHtcbiAgICAgIHJldHVybiAodGltZURpZmYgPj0gMCA/IE1hdGguZmxvb3IodGltZURpZmYgLyAzNjAwKSArICcgaG91cnMgYWdvJyA6ICdpbiAnICsgTWF0aC5mbG9vcigtdGltZURpZmYgLyAzNjAwKSArICcgaG91cnMnKTtcbiAgICB9XG5cbiAgICAvLyB3aXRoaW4gMiBkYXlzXG4gICAgdmFyIGRheXMyID0gMiAqIDg2NDAwO1xuICAgIGlmICh0aW1lRGlmZiA8IGRheXMyICYmIHRpbWVEaWZmID4gLWRheXMyKSB7XG4gICAgICByZXR1cm4gKHRpbWVEaWZmID49IDAgPyAnMSBkYXkgYWdvJyA6ICdpbiAxIGRheScpO1xuICAgIH1cblxuICAgIC8vIHdpdGhpbiAyOSBkYXlzXG4gICAgdmFyIGRheXMyOSA9IDI5ICogODY0MDA7XG4gICAgaWYgKHRpbWVEaWZmIDwgZGF5czI5ICYmIHRpbWVEaWZmID4gLWRheXMyOSkge1xuICAgICAgcmV0dXJuICh0aW1lRGlmZiA+PSAwID8gTWF0aC5mbG9vcih0aW1lRGlmZiAvIDg2NDAwKSArICcgZGF5cyBhZ28nIDogJ2luICcgKyBNYXRoLmZsb29yKC10aW1lRGlmZiAvIDg2NDAwKSArICcgZGF5cycpO1xuICAgIH1cblxuICAgIC8vIHdpdGhpbiA2MCBkYXlzXG4gICAgdmFyIGRheXM2MCA9IDYwICogODY0MDA7XG4gICAgaWYgKHRpbWVEaWZmIDwgZGF5czYwICYmIHRpbWVEaWZmID4gLWRheXM2MCkge1xuICAgICAgcmV0dXJuICh0aW1lRGlmZiA+PSAwID8gJ2Fib3V0IGEgbW9udGggYWdvJyA6ICdpbiBhYm91dCBhIG1vbnRoJyk7XG4gICAgfVxuXG4gICAgdmFyIGN1cnJUaW1lWWVhcnMgPSBwYXJzZUludChodW1hbml6ZS5kYXRlKCdZJywgY3VyclRpbWUpLCAxMCk7XG4gICAgdmFyIHRpbWVzdGFtcFllYXJzID0gcGFyc2VJbnQoaHVtYW5pemUuZGF0ZSgnWScsIHRpbWVzdGFtcCksIDEwKTtcbiAgICB2YXIgY3VyclRpbWVNb250aHMgPSBjdXJyVGltZVllYXJzICogMTIgKyBwYXJzZUludChodW1hbml6ZS5kYXRlKCduJywgY3VyclRpbWUpLCAxMCk7XG4gICAgdmFyIHRpbWVzdGFtcE1vbnRocyA9IHRpbWVzdGFtcFllYXJzICogMTIgKyBwYXJzZUludChodW1hbml6ZS5kYXRlKCduJywgdGltZXN0YW1wKSwgMTApO1xuXG4gICAgLy8gd2l0aGluIGEgeWVhclxuICAgIHZhciBtb250aERpZmYgPSBjdXJyVGltZU1vbnRocyAtIHRpbWVzdGFtcE1vbnRocztcbiAgICBpZiAobW9udGhEaWZmIDwgMTIgJiYgbW9udGhEaWZmID4gLTEyKSB7XG4gICAgICByZXR1cm4gKG1vbnRoRGlmZiA+PSAwID8gbW9udGhEaWZmICsgJyBtb250aHMgYWdvJyA6ICdpbiAnICsgKC1tb250aERpZmYpICsgJyBtb250aHMnKTtcbiAgICB9XG5cbiAgICB2YXIgeWVhckRpZmYgPSBjdXJyVGltZVllYXJzIC0gdGltZXN0YW1wWWVhcnM7XG4gICAgaWYgKHllYXJEaWZmIDwgMiAmJiB5ZWFyRGlmZiA+IC0yKSB7XG4gICAgICByZXR1cm4gKHllYXJEaWZmID49IDAgPyAnYSB5ZWFyIGFnbycgOiAnaW4gYSB5ZWFyJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuICh5ZWFyRGlmZiA+PSAwID8geWVhckRpZmYgKyAnIHllYXJzIGFnbycgOiAnaW4gJyArICgteWVhckRpZmYpICsgJyB5ZWFycycpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBpbnRlZ2VyIHRvIGl0cyBvcmRpbmFsIGFzIGEgc3RyaW5nLlxuICAgKlxuICAgKiAxIGJlY29tZXMgMXN0XG4gICAqIDIgYmVjb21lcyAybmRcbiAgICogMyBiZWNvbWVzIDNyZCBldGNcbiAgICovXG4gIGh1bWFuaXplLm9yZGluYWwgPSBmdW5jdGlvbihudW1iZXIpIHtcbiAgICBudW1iZXIgPSBwYXJzZUludChudW1iZXIsIDEwKTtcbiAgICBudW1iZXIgPSBpc05hTihudW1iZXIpID8gMCA6IG51bWJlcjtcbiAgICB2YXIgc2lnbiA9IG51bWJlciA8IDAgPyAnLScgOiAnJztcbiAgICBudW1iZXIgPSBNYXRoLmFicyhudW1iZXIpO1xuICAgIHZhciB0ZW5zID0gbnVtYmVyICUgMTAwO1xuXG4gICAgcmV0dXJuIHNpZ24gKyBudW1iZXIgKyAodGVucyA+IDQgJiYgdGVucyA8IDIxID8gJ3RoJyA6IHsxOiAnc3QnLCAyOiAnbmQnLCAzOiAncmQnfVtudW1iZXIgJSAxMF0gfHwgJ3RoJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgdGhlIHZhbHVlIGxpa2UgYSAnaHVtYW4tcmVhZGFibGUnIGZpbGUgc2l6ZSAoaS5lLiAnMTMgS0InLCAnNC4xIE1CJywgJzEwMiBieXRlcycsIGV0YykuXG4gICAqXG4gICAqIEZvciBleGFtcGxlOlxuICAgKiBJZiB2YWx1ZSBpcyAxMjM0NTY3ODksIHRoZSBvdXRwdXQgd291bGQgYmUgMTE3LjcgTUIuXG4gICAqL1xuICBodW1hbml6ZS5maWxlc2l6ZSA9IGZ1bmN0aW9uKGZpbGVzaXplLCBraWxvLCBkZWNpbWFscywgZGVjUG9pbnQsIHRob3VzYW5kc1NlcCwgc3VmZml4U2VwKSB7XG4gICAga2lsbyA9IChraWxvID09PSB1bmRlZmluZWQpID8gMTAyNCA6IGtpbG87XG4gICAgaWYgKGZpbGVzaXplIDw9IDApIHsgcmV0dXJuICcwIGJ5dGVzJzsgfVxuICAgIGlmIChmaWxlc2l6ZSA8IGtpbG8gJiYgZGVjaW1hbHMgPT09IHVuZGVmaW5lZCkgeyBkZWNpbWFscyA9IDA7IH1cbiAgICBpZiAoc3VmZml4U2VwID09PSB1bmRlZmluZWQpIHsgc3VmZml4U2VwID0gJyAnOyB9XG4gICAgcmV0dXJuIGh1bWFuaXplLmludHdvcmQoZmlsZXNpemUsIFsnYnl0ZXMnLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInXSwga2lsbywgZGVjaW1hbHMsIGRlY1BvaW50LCB0aG91c2FuZHNTZXAsIHN1ZmZpeFNlcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgdGhlIHZhbHVlIGxpa2UgYSAnaHVtYW4tcmVhZGFibGUnIG51bWJlciAoaS5lLiAnMTMgSycsICc0LjEgTScsICcxMDInLCBldGMpLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZTpcbiAgICogSWYgdmFsdWUgaXMgMTIzNDU2Nzg5LCB0aGUgb3V0cHV0IHdvdWxkIGJlIDExNy43IE0uXG4gICAqL1xuICBodW1hbml6ZS5pbnR3b3JkID0gZnVuY3Rpb24obnVtYmVyLCB1bml0cywga2lsbywgZGVjaW1hbHMsIGRlY1BvaW50LCB0aG91c2FuZHNTZXAsIHN1ZmZpeFNlcCkge1xuICAgIHZhciBodW1hbml6ZWQsIHVuaXQ7XG5cbiAgICB1bml0cyA9IHVuaXRzIHx8IFsnJywgJ0snLCAnTScsICdCJywgJ1QnXSxcbiAgICB1bml0ID0gdW5pdHMubGVuZ3RoIC0gMSxcbiAgICBraWxvID0ga2lsbyB8fCAxMDAwLFxuICAgIGRlY2ltYWxzID0gaXNOYU4oZGVjaW1hbHMpID8gMiA6IE1hdGguYWJzKGRlY2ltYWxzKSxcbiAgICBkZWNQb2ludCA9IGRlY1BvaW50IHx8ICcuJyxcbiAgICB0aG91c2FuZHNTZXAgPSB0aG91c2FuZHNTZXAgfHwgJywnLFxuICAgIHN1ZmZpeFNlcCA9IHN1ZmZpeFNlcCB8fCAnJztcblxuICAgIGZvciAodmFyIGk9MDsgaSA8IHVuaXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobnVtYmVyIDwgTWF0aC5wb3coa2lsbywgaSsxKSkge1xuICAgICAgICB1bml0ID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGh1bWFuaXplZCA9IG51bWJlciAvIE1hdGgucG93KGtpbG8sIHVuaXQpO1xuXG4gICAgdmFyIHN1ZmZpeCA9IHVuaXRzW3VuaXRdID8gc3VmZml4U2VwICsgdW5pdHNbdW5pdF0gOiAnJztcbiAgICByZXR1cm4gaHVtYW5pemUubnVtYmVyRm9ybWF0KGh1bWFuaXplZCwgZGVjaW1hbHMsIGRlY1BvaW50LCB0aG91c2FuZHNTZXApICsgc3VmZml4O1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBsaW5lIGJyZWFrcyBpbiBwbGFpbiB0ZXh0IHdpdGggYXBwcm9wcmlhdGUgSFRNTFxuICAgKiBBIHNpbmdsZSBuZXdsaW5lIGJlY29tZXMgYW4gSFRNTCBsaW5lIGJyZWFrICg8YnIgLz4pIGFuZCBhIG5ldyBsaW5lIGZvbGxvd2VkIGJ5IGEgYmxhbmsgbGluZSBiZWNvbWVzIGEgcGFyYWdyYXBoIGJyZWFrICg8L3A+KS5cbiAgICogXG4gICAqIEZvciBleGFtcGxlOlxuICAgKiBJZiB2YWx1ZSBpcyBKb2VsXFxuaXMgYVxcblxcbnNsdWcsIHRoZSBvdXRwdXQgd2lsbCBiZSA8cD5Kb2VsPGJyIC8+aXMgYTwvcD48cD5zbHVnPC9wPlxuICAgKi9cbiAgaHVtYW5pemUubGluZWJyZWFrcyA9IGZ1bmN0aW9uKHN0cikge1xuICAgIC8vIHJlbW92ZSBiZWdpbm5pbmcgYW5kIGVuZGluZyBuZXdsaW5lc1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9eKFtcXG58XFxyXSopLywgJycpO1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC8oW1xcbnxcXHJdKikkLywgJycpO1xuXG4gICAgLy8gbm9ybWFsaXplIGFsbCB0byBcXG5cbiAgICBzdHIgPSBzdHIucmVwbGFjZSgvKFxcclxcbnxcXG58XFxyKS9nLCBcIlxcblwiKTtcblxuICAgIC8vIGFueSBjb25zZWN1dGl2ZSBuZXcgbGluZXMgbW9yZSB0aGFuIDIgZ2V0cyB0dXJuZWQgaW50byBwIHRhZ3NcbiAgICBzdHIgPSBzdHIucmVwbGFjZSgvKFxcbnsyLH0pL2csICc8L3A+PHA+Jyk7XG5cbiAgICAvLyBhbnkgdGhhdCBhcmUgc2luZ2xldG9ucyBnZXQgdHVybmVkIGludG8gYnJcbiAgICBzdHIgPSBzdHIucmVwbGFjZSgvXFxuL2csICc8YnIgLz4nKTtcbiAgICByZXR1cm4gJzxwPicgKyBzdHIgKyAnPC9wPic7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFsbCBuZXdsaW5lcyBpbiBhIHBpZWNlIG9mIHBsYWluIHRleHQgdG8gSFRNTCBsaW5lIGJyZWFrcyAoPGJyIC8+KS5cbiAgICovXG4gIGh1bWFuaXplLm5sMmJyID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oXFxyXFxufFxcbnxcXHIpL2csICc8YnIgLz4nKTtcbiAgfTtcblxuICAvKipcbiAgICogVHJ1bmNhdGVzIGEgc3RyaW5nIGlmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMuXG4gICAqIFRydW5jYXRlZCBzdHJpbmdzIHdpbGwgZW5kIHdpdGggYSB0cmFuc2xhdGFibGUgZWxsaXBzaXMgc2VxdWVuY2UgKCfigKYnKS5cbiAgICovXG4gIGh1bWFuaXplLnRydW5jYXRlY2hhcnMgPSBmdW5jdGlvbihzdHJpbmcsIGxlbmd0aCkge1xuICAgIGlmIChzdHJpbmcubGVuZ3RoIDw9IGxlbmd0aCkgeyByZXR1cm4gc3RyaW5nOyB9XG4gICAgcmV0dXJuIHN0cmluZy5zdWJzdHIoMCwgbGVuZ3RoKSArICfigKYnO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUcnVuY2F0ZXMgYSBzdHJpbmcgYWZ0ZXIgYSBjZXJ0YWluIG51bWJlciBvZiB3b3Jkcy5cbiAgICogTmV3bGluZXMgd2l0aGluIHRoZSBzdHJpbmcgd2lsbCBiZSByZW1vdmVkLlxuICAgKi9cbiAgaHVtYW5pemUudHJ1bmNhdGV3b3JkcyA9IGZ1bmN0aW9uKHN0cmluZywgbnVtV29yZHMpIHtcbiAgICB2YXIgd29yZHMgPSBzdHJpbmcuc3BsaXQoJyAnKTtcbiAgICBpZiAod29yZHMubGVuZ3RoIDwgbnVtV29yZHMpIHsgcmV0dXJuIHN0cmluZzsgfVxuICAgIHJldHVybiB3b3Jkcy5zbGljZSgwLCBudW1Xb3Jkcykuam9pbignICcpICsgJ+KApic7XG4gIH07XG5cbn0pLmNhbGwodGhpcyk7XG4iLCIvKipcbiAqICBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqICBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqICBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqICBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6XG4gIChnbG9iYWwuSW1tdXRhYmxlID0gZmFjdG9yeSgpKTtcbn0odGhpcywgZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7dmFyIFNMSUNFJDAgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2xhc3MoY3Rvciwgc3VwZXJDbGFzcykge1xuICAgIGlmIChzdXBlckNsYXNzKSB7XG4gICAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpO1xuICAgIH1cbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3I7XG4gIH1cblxuICBmdW5jdGlvbiBJdGVyYWJsZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzSXRlcmFibGUodmFsdWUpID8gdmFsdWUgOiBTZXEodmFsdWUpO1xuICAgIH1cblxuXG4gIGNyZWF0ZUNsYXNzKEtleWVkSXRlcmFibGUsIEl0ZXJhYmxlKTtcbiAgICBmdW5jdGlvbiBLZXllZEl0ZXJhYmxlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNLZXllZCh2YWx1ZSkgPyB2YWx1ZSA6IEtleWVkU2VxKHZhbHVlKTtcbiAgICB9XG5cblxuICBjcmVhdGVDbGFzcyhJbmRleGVkSXRlcmFibGUsIEl0ZXJhYmxlKTtcbiAgICBmdW5jdGlvbiBJbmRleGVkSXRlcmFibGUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0luZGV4ZWQodmFsdWUpID8gdmFsdWUgOiBJbmRleGVkU2VxKHZhbHVlKTtcbiAgICB9XG5cblxuICBjcmVhdGVDbGFzcyhTZXRJdGVyYWJsZSwgSXRlcmFibGUpO1xuICAgIGZ1bmN0aW9uIFNldEl0ZXJhYmxlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNJdGVyYWJsZSh2YWx1ZSkgJiYgIWlzQXNzb2NpYXRpdmUodmFsdWUpID8gdmFsdWUgOiBTZXRTZXEodmFsdWUpO1xuICAgIH1cblxuXG5cbiAgZnVuY3Rpb24gaXNJdGVyYWJsZShtYXliZUl0ZXJhYmxlKSB7XG4gICAgcmV0dXJuICEhKG1heWJlSXRlcmFibGUgJiYgbWF5YmVJdGVyYWJsZVtJU19JVEVSQUJMRV9TRU5USU5FTF0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNLZXllZChtYXliZUtleWVkKSB7XG4gICAgcmV0dXJuICEhKG1heWJlS2V5ZWQgJiYgbWF5YmVLZXllZFtJU19LRVlFRF9TRU5USU5FTF0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNJbmRleGVkKG1heWJlSW5kZXhlZCkge1xuICAgIHJldHVybiAhIShtYXliZUluZGV4ZWQgJiYgbWF5YmVJbmRleGVkW0lTX0lOREVYRURfU0VOVElORUxdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzQXNzb2NpYXRpdmUobWF5YmVBc3NvY2lhdGl2ZSkge1xuICAgIHJldHVybiBpc0tleWVkKG1heWJlQXNzb2NpYXRpdmUpIHx8IGlzSW5kZXhlZChtYXliZUFzc29jaWF0aXZlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzT3JkZXJlZChtYXliZU9yZGVyZWQpIHtcbiAgICByZXR1cm4gISEobWF5YmVPcmRlcmVkICYmIG1heWJlT3JkZXJlZFtJU19PUkRFUkVEX1NFTlRJTkVMXSk7XG4gIH1cblxuICBJdGVyYWJsZS5pc0l0ZXJhYmxlID0gaXNJdGVyYWJsZTtcbiAgSXRlcmFibGUuaXNLZXllZCA9IGlzS2V5ZWQ7XG4gIEl0ZXJhYmxlLmlzSW5kZXhlZCA9IGlzSW5kZXhlZDtcbiAgSXRlcmFibGUuaXNBc3NvY2lhdGl2ZSA9IGlzQXNzb2NpYXRpdmU7XG4gIEl0ZXJhYmxlLmlzT3JkZXJlZCA9IGlzT3JkZXJlZDtcblxuICBJdGVyYWJsZS5LZXllZCA9IEtleWVkSXRlcmFibGU7XG4gIEl0ZXJhYmxlLkluZGV4ZWQgPSBJbmRleGVkSXRlcmFibGU7XG4gIEl0ZXJhYmxlLlNldCA9IFNldEl0ZXJhYmxlO1xuXG5cbiAgdmFyIElTX0lURVJBQkxFX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfSVRFUkFCTEVfX0BAJztcbiAgdmFyIElTX0tFWUVEX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfS0VZRURfX0BAJztcbiAgdmFyIElTX0lOREVYRURfU0VOVElORUwgPSAnQEBfX0lNTVVUQUJMRV9JTkRFWEVEX19AQCc7XG4gIHZhciBJU19PUkRFUkVEX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfT1JERVJFRF9fQEAnO1xuXG4gIC8vIFVzZWQgZm9yIHNldHRpbmcgcHJvdG90eXBlIG1ldGhvZHMgdGhhdCBJRTggY2hva2VzIG9uLlxuICB2YXIgREVMRVRFID0gJ2RlbGV0ZSc7XG5cbiAgLy8gQ29uc3RhbnRzIGRlc2NyaWJpbmcgdGhlIHNpemUgb2YgdHJpZSBub2Rlcy5cbiAgdmFyIFNISUZUID0gNTsgLy8gUmVzdWx0ZWQgaW4gYmVzdCBwZXJmb3JtYW5jZSBhZnRlciBfX19fX18/XG4gIHZhciBTSVpFID0gMSA8PCBTSElGVDtcbiAgdmFyIE1BU0sgPSBTSVpFIC0gMTtcblxuICAvLyBBIGNvbnNpc3RlbnQgc2hhcmVkIHZhbHVlIHJlcHJlc2VudGluZyBcIm5vdCBzZXRcIiB3aGljaCBlcXVhbHMgbm90aGluZyBvdGhlclxuICAvLyB0aGFuIGl0c2VsZiwgYW5kIG5vdGhpbmcgdGhhdCBjb3VsZCBiZSBwcm92aWRlZCBleHRlcm5hbGx5LlxuICB2YXIgTk9UX1NFVCA9IHt9O1xuXG4gIC8vIEJvb2xlYW4gcmVmZXJlbmNlcywgUm91Z2ggZXF1aXZhbGVudCBvZiBgYm9vbCAmYC5cbiAgdmFyIENIQU5HRV9MRU5HVEggPSB7IHZhbHVlOiBmYWxzZSB9O1xuICB2YXIgRElEX0FMVEVSID0geyB2YWx1ZTogZmFsc2UgfTtcblxuICBmdW5jdGlvbiBNYWtlUmVmKHJlZikge1xuICAgIHJlZi52YWx1ZSA9IGZhbHNlO1xuICAgIHJldHVybiByZWY7XG4gIH1cblxuICBmdW5jdGlvbiBTZXRSZWYocmVmKSB7XG4gICAgcmVmICYmIChyZWYudmFsdWUgPSB0cnVlKTtcbiAgfVxuXG4gIC8vIEEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhIHZhbHVlIHJlcHJlc2VudGluZyBhbiBcIm93bmVyXCIgZm9yIHRyYW5zaWVudCB3cml0ZXNcbiAgLy8gdG8gdHJpZXMuIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBvbmx5IGV2ZXIgZXF1YWwgaXRzZWxmLCBhbmQgd2lsbCBub3QgZXF1YWxcbiAgLy8gdGhlIHJldHVybiBvZiBhbnkgc3Vic2VxdWVudCBjYWxsIG9mIHRoaXMgZnVuY3Rpb24uXG4gIGZ1bmN0aW9uIE93bmVySUQoKSB7fVxuXG4gIC8vIGh0dHA6Ly9qc3BlcmYuY29tL2NvcHktYXJyYXktaW5saW5lXG4gIGZ1bmN0aW9uIGFyckNvcHkoYXJyLCBvZmZzZXQpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcbiAgICB2YXIgbGVuID0gTWF0aC5tYXgoMCwgYXJyLmxlbmd0aCAtIG9mZnNldCk7XG4gICAgdmFyIG5ld0FyciA9IG5ldyBBcnJheShsZW4pO1xuICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCBsZW47IGlpKyspIHtcbiAgICAgIG5ld0FycltpaV0gPSBhcnJbaWkgKyBvZmZzZXRdO1xuICAgIH1cbiAgICByZXR1cm4gbmV3QXJyO1xuICB9XG5cbiAgZnVuY3Rpb24gZW5zdXJlU2l6ZShpdGVyKSB7XG4gICAgaWYgKGl0ZXIuc2l6ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpdGVyLnNpemUgPSBpdGVyLl9faXRlcmF0ZShyZXR1cm5UcnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZXIuc2l6ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdyYXBJbmRleChpdGVyLCBpbmRleCkge1xuICAgIC8vIFRoaXMgaW1wbGVtZW50cyBcImlzIGFycmF5IGluZGV4XCIgd2hpY2ggdGhlIEVDTUFTdHJpbmcgc3BlYyBkZWZpbmVzIGFzOlxuICAgIC8vXG4gICAgLy8gICAgIEEgU3RyaW5nIHByb3BlcnR5IG5hbWUgUCBpcyBhbiBhcnJheSBpbmRleCBpZiBhbmQgb25seSBpZlxuICAgIC8vICAgICBUb1N0cmluZyhUb1VpbnQzMihQKSkgaXMgZXF1YWwgdG8gUCBhbmQgVG9VaW50MzIoUCkgaXMgbm90IGVxdWFsXG4gICAgLy8gICAgIHRvIDJeMzLiiJIxLlxuICAgIC8vXG4gICAgLy8gaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLWFycmF5LWV4b3RpYy1vYmplY3RzXG4gICAgaWYgKHR5cGVvZiBpbmRleCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHZhciB1aW50MzJJbmRleCA9IGluZGV4ID4+PiAwOyAvLyBOID4+PiAwIGlzIHNob3J0aGFuZCBmb3IgVG9VaW50MzJcbiAgICAgIGlmICgnJyArIHVpbnQzMkluZGV4ICE9PSBpbmRleCB8fCB1aW50MzJJbmRleCA9PT0gNDI5NDk2NzI5NSkge1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgICAgaW5kZXggPSB1aW50MzJJbmRleDtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4IDwgMCA/IGVuc3VyZVNpemUoaXRlcikgKyBpbmRleCA6IGluZGV4O1xuICB9XG5cbiAgZnVuY3Rpb24gcmV0dXJuVHJ1ZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdob2xlU2xpY2UoYmVnaW4sIGVuZCwgc2l6ZSkge1xuICAgIHJldHVybiAoYmVnaW4gPT09IDAgfHwgKHNpemUgIT09IHVuZGVmaW5lZCAmJiBiZWdpbiA8PSAtc2l6ZSkpICYmXG4gICAgICAoZW5kID09PSB1bmRlZmluZWQgfHwgKHNpemUgIT09IHVuZGVmaW5lZCAmJiBlbmQgPj0gc2l6ZSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzb2x2ZUJlZ2luKGJlZ2luLCBzaXplKSB7XG4gICAgcmV0dXJuIHJlc29sdmVJbmRleChiZWdpbiwgc2l6ZSwgMCk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNvbHZlRW5kKGVuZCwgc2l6ZSkge1xuICAgIHJldHVybiByZXNvbHZlSW5kZXgoZW5kLCBzaXplLCBzaXplKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc29sdmVJbmRleChpbmRleCwgc2l6ZSwgZGVmYXVsdEluZGV4KSB7XG4gICAgcmV0dXJuIGluZGV4ID09PSB1bmRlZmluZWQgP1xuICAgICAgZGVmYXVsdEluZGV4IDpcbiAgICAgIGluZGV4IDwgMCA/XG4gICAgICAgIE1hdGgubWF4KDAsIHNpemUgKyBpbmRleCkgOlxuICAgICAgICBzaXplID09PSB1bmRlZmluZWQgP1xuICAgICAgICAgIGluZGV4IDpcbiAgICAgICAgICBNYXRoLm1pbihzaXplLCBpbmRleCk7XG4gIH1cblxuICAvKiBnbG9iYWwgU3ltYm9sICovXG5cbiAgdmFyIElURVJBVEVfS0VZUyA9IDA7XG4gIHZhciBJVEVSQVRFX1ZBTFVFUyA9IDE7XG4gIHZhciBJVEVSQVRFX0VOVFJJRVMgPSAyO1xuXG4gIHZhciBSRUFMX0lURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xuICB2YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7XG5cbiAgdmFyIElURVJBVE9SX1NZTUJPTCA9IFJFQUxfSVRFUkFUT1JfU1lNQk9MIHx8IEZBVVhfSVRFUkFUT1JfU1lNQk9MO1xuXG5cbiAgZnVuY3Rpb24gSXRlcmF0b3IobmV4dCkge1xuICAgICAgdGhpcy5uZXh0ID0gbmV4dDtcbiAgICB9XG5cbiAgICBJdGVyYXRvci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAnW0l0ZXJhdG9yXSc7XG4gICAgfTtcblxuXG4gIEl0ZXJhdG9yLktFWVMgPSBJVEVSQVRFX0tFWVM7XG4gIEl0ZXJhdG9yLlZBTFVFUyA9IElURVJBVEVfVkFMVUVTO1xuICBJdGVyYXRvci5FTlRSSUVTID0gSVRFUkFURV9FTlRSSUVTO1xuXG4gIEl0ZXJhdG9yLnByb3RvdHlwZS5pbnNwZWN0ID1cbiAgSXRlcmF0b3IucHJvdG90eXBlLnRvU291cmNlID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy50b1N0cmluZygpOyB9XG4gIEl0ZXJhdG9yLnByb3RvdHlwZVtJVEVSQVRPUl9TWU1CT0xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG5cbiAgZnVuY3Rpb24gaXRlcmF0b3JWYWx1ZSh0eXBlLCBrLCB2LCBpdGVyYXRvclJlc3VsdCkge1xuICAgIHZhciB2YWx1ZSA9IHR5cGUgPT09IDAgPyBrIDogdHlwZSA9PT0gMSA/IHYgOiBbaywgdl07XG4gICAgaXRlcmF0b3JSZXN1bHQgPyAoaXRlcmF0b3JSZXN1bHQudmFsdWUgPSB2YWx1ZSkgOiAoaXRlcmF0b3JSZXN1bHQgPSB7XG4gICAgICB2YWx1ZTogdmFsdWUsIGRvbmU6IGZhbHNlXG4gICAgfSk7XG4gICAgcmV0dXJuIGl0ZXJhdG9yUmVzdWx0O1xuICB9XG5cbiAgZnVuY3Rpb24gaXRlcmF0b3JEb25lKCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc0l0ZXJhdG9yKG1heWJlSXRlcmFibGUpIHtcbiAgICByZXR1cm4gISFnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNJdGVyYXRvcihtYXliZUl0ZXJhdG9yKSB7XG4gICAgcmV0dXJuIG1heWJlSXRlcmF0b3IgJiYgdHlwZW9mIG1heWJlSXRlcmF0b3IubmV4dCA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEl0ZXJhdG9yKGl0ZXJhYmxlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGl0ZXJhYmxlKTtcbiAgICByZXR1cm4gaXRlcmF0b3JGbiAmJiBpdGVyYXRvckZuLmNhbGwoaXRlcmFibGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihpdGVyYWJsZSkge1xuICAgIHZhciBpdGVyYXRvckZuID0gaXRlcmFibGUgJiYgKFxuICAgICAgKFJFQUxfSVRFUkFUT1JfU1lNQk9MICYmIGl0ZXJhYmxlW1JFQUxfSVRFUkFUT1JfU1lNQk9MXSkgfHxcbiAgICAgIGl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXVxuICAgICk7XG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaXRlcmF0b3JGbjtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUubGVuZ3RoID09PSAnbnVtYmVyJztcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKFNlcSwgSXRlcmFibGUpO1xuICAgIGZ1bmN0aW9uIFNlcSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgPyBlbXB0eVNlcXVlbmNlKCkgOlxuICAgICAgICBpc0l0ZXJhYmxlKHZhbHVlKSA/IHZhbHVlLnRvU2VxKCkgOiBzZXFGcm9tVmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIFNlcS5vZiA9IGZ1bmN0aW9uKC8qLi4udmFsdWVzKi8pIHtcbiAgICAgIHJldHVybiBTZXEoYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgU2VxLnByb3RvdHlwZS50b1NlcSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIFNlcS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fdG9TdHJpbmcoJ1NlcSB7JywgJ30nKTtcbiAgICB9O1xuXG4gICAgU2VxLnByb3RvdHlwZS5jYWNoZVJlc3VsdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCF0aGlzLl9jYWNoZSAmJiB0aGlzLl9faXRlcmF0ZVVuY2FjaGVkKSB7XG4gICAgICAgIHRoaXMuX2NhY2hlID0gdGhpcy5lbnRyeVNlcSgpLnRvQXJyYXkoKTtcbiAgICAgICAgdGhpcy5zaXplID0gdGhpcy5fY2FjaGUubGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8vIGFic3RyYWN0IF9faXRlcmF0ZVVuY2FjaGVkKGZuLCByZXZlcnNlKVxuXG4gICAgU2VxLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge1xuICAgICAgcmV0dXJuIHNlcUl0ZXJhdGUodGhpcywgZm4sIHJldmVyc2UsIHRydWUpO1xuICAgIH07XG5cbiAgICAvLyBhYnN0cmFjdCBfX2l0ZXJhdG9yVW5jYWNoZWQodHlwZSwgcmV2ZXJzZSlcblxuICAgIFNlcS5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uKHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIHJldHVybiBzZXFJdGVyYXRvcih0aGlzLCB0eXBlLCByZXZlcnNlLCB0cnVlKTtcbiAgICB9O1xuXG5cblxuICBjcmVhdGVDbGFzcyhLZXllZFNlcSwgU2VxKTtcbiAgICBmdW5jdGlvbiBLZXllZFNlcSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgP1xuICAgICAgICBlbXB0eVNlcXVlbmNlKCkudG9LZXllZFNlcSgpIDpcbiAgICAgICAgaXNJdGVyYWJsZSh2YWx1ZSkgP1xuICAgICAgICAgIChpc0tleWVkKHZhbHVlKSA/IHZhbHVlLnRvU2VxKCkgOiB2YWx1ZS5mcm9tRW50cnlTZXEoKSkgOlxuICAgICAgICAgIGtleWVkU2VxRnJvbVZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBLZXllZFNlcS5wcm90b3R5cGUudG9LZXllZFNlcSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuXG5cbiAgY3JlYXRlQ2xhc3MoSW5kZXhlZFNlcSwgU2VxKTtcbiAgICBmdW5jdGlvbiBJbmRleGVkU2VxKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/IGVtcHR5U2VxdWVuY2UoKSA6XG4gICAgICAgICFpc0l0ZXJhYmxlKHZhbHVlKSA/IGluZGV4ZWRTZXFGcm9tVmFsdWUodmFsdWUpIDpcbiAgICAgICAgaXNLZXllZCh2YWx1ZSkgPyB2YWx1ZS5lbnRyeVNlcSgpIDogdmFsdWUudG9JbmRleGVkU2VxKCk7XG4gICAgfVxuXG4gICAgSW5kZXhlZFNlcS5vZiA9IGZ1bmN0aW9uKC8qLi4udmFsdWVzKi8pIHtcbiAgICAgIHJldHVybiBJbmRleGVkU2VxKGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIEluZGV4ZWRTZXEucHJvdG90eXBlLnRvSW5kZXhlZFNlcSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIEluZGV4ZWRTZXEucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCdTZXEgWycsICddJyk7XG4gICAgfTtcblxuICAgIEluZGV4ZWRTZXEucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7XG4gICAgICByZXR1cm4gc2VxSXRlcmF0ZSh0aGlzLCBmbiwgcmV2ZXJzZSwgZmFsc2UpO1xuICAgIH07XG5cbiAgICBJbmRleGVkU2VxLnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgICAgcmV0dXJuIHNlcUl0ZXJhdG9yKHRoaXMsIHR5cGUsIHJldmVyc2UsIGZhbHNlKTtcbiAgICB9O1xuXG5cblxuICBjcmVhdGVDbGFzcyhTZXRTZXEsIFNlcSk7XG4gICAgZnVuY3Rpb24gU2V0U2VxKHZhbHVlKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gZW1wdHlTZXF1ZW5jZSgpIDpcbiAgICAgICAgIWlzSXRlcmFibGUodmFsdWUpID8gaW5kZXhlZFNlcUZyb21WYWx1ZSh2YWx1ZSkgOlxuICAgICAgICBpc0tleWVkKHZhbHVlKSA/IHZhbHVlLmVudHJ5U2VxKCkgOiB2YWx1ZVxuICAgICAgKS50b1NldFNlcSgpO1xuICAgIH1cblxuICAgIFNldFNlcS5vZiA9IGZ1bmN0aW9uKC8qLi4udmFsdWVzKi8pIHtcbiAgICAgIHJldHVybiBTZXRTZXEoYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgU2V0U2VxLnByb3RvdHlwZS50b1NldFNlcSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuXG5cbiAgU2VxLmlzU2VxID0gaXNTZXE7XG4gIFNlcS5LZXllZCA9IEtleWVkU2VxO1xuICBTZXEuU2V0ID0gU2V0U2VxO1xuICBTZXEuSW5kZXhlZCA9IEluZGV4ZWRTZXE7XG5cbiAgdmFyIElTX1NFUV9TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX1NFUV9fQEAnO1xuXG4gIFNlcS5wcm90b3R5cGVbSVNfU0VRX1NFTlRJTkVMXSA9IHRydWU7XG5cblxuXG4gIGNyZWF0ZUNsYXNzKEFycmF5U2VxLCBJbmRleGVkU2VxKTtcbiAgICBmdW5jdGlvbiBBcnJheVNlcShhcnJheSkge1xuICAgICAgdGhpcy5fYXJyYXkgPSBhcnJheTtcbiAgICAgIHRoaXMuc2l6ZSA9IGFycmF5Lmxlbmd0aDtcbiAgICB9XG5cbiAgICBBcnJheVNlcS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oaW5kZXgsIG5vdFNldFZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXMoaW5kZXgpID8gdGhpcy5fYXJyYXlbd3JhcEluZGV4KHRoaXMsIGluZGV4KV0gOiBub3RTZXRWYWx1ZTtcbiAgICB9O1xuXG4gICAgQXJyYXlTZXEucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7XG4gICAgICB2YXIgYXJyYXkgPSB0aGlzLl9hcnJheTtcbiAgICAgIHZhciBtYXhJbmRleCA9IGFycmF5Lmxlbmd0aCAtIDE7XG4gICAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDw9IG1heEluZGV4OyBpaSsrKSB7XG4gICAgICAgIGlmIChmbihhcnJheVtyZXZlcnNlID8gbWF4SW5kZXggLSBpaSA6IGlpXSwgaWksIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBpaSArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpaTtcbiAgICB9O1xuXG4gICAgQXJyYXlTZXEucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgICB2YXIgYXJyYXkgPSB0aGlzLl9hcnJheTtcbiAgICAgIHZhciBtYXhJbmRleCA9IGFycmF5Lmxlbmd0aCAtIDE7XG4gICAgICB2YXIgaWkgPSAwO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbigpIFxuICAgICAgICB7cmV0dXJuIGlpID4gbWF4SW5kZXggP1xuICAgICAgICAgIGl0ZXJhdG9yRG9uZSgpIDpcbiAgICAgICAgICBpdGVyYXRvclZhbHVlKHR5cGUsIGlpLCBhcnJheVtyZXZlcnNlID8gbWF4SW5kZXggLSBpaSsrIDogaWkrK10pfVxuICAgICAgKTtcbiAgICB9O1xuXG5cblxuICBjcmVhdGVDbGFzcyhPYmplY3RTZXEsIEtleWVkU2VxKTtcbiAgICBmdW5jdGlvbiBPYmplY3RTZXEob2JqZWN0KSB7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG4gICAgICB0aGlzLl9vYmplY3QgPSBvYmplY3Q7XG4gICAgICB0aGlzLl9rZXlzID0ga2V5cztcbiAgICAgIHRoaXMuc2l6ZSA9IGtleXMubGVuZ3RoO1xuICAgIH1cblxuICAgIE9iamVjdFNlcS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oa2V5LCBub3RTZXRWYWx1ZSkge1xuICAgICAgaWYgKG5vdFNldFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIXRoaXMuaGFzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIG5vdFNldFZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX29iamVjdFtrZXldO1xuICAgIH07XG5cbiAgICBPYmplY3RTZXEucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMuX29iamVjdC5oYXNPd25Qcm9wZXJ0eShrZXkpO1xuICAgIH07XG5cbiAgICBPYmplY3RTZXEucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7XG4gICAgICB2YXIgb2JqZWN0ID0gdGhpcy5fb2JqZWN0O1xuICAgICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzO1xuICAgICAgdmFyIG1heEluZGV4ID0ga2V5cy5sZW5ndGggLSAxO1xuICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8PSBtYXhJbmRleDsgaWkrKykge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1tyZXZlcnNlID8gbWF4SW5kZXggLSBpaSA6IGlpXTtcbiAgICAgICAgaWYgKGZuKG9iamVjdFtrZXldLCBrZXksIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBpaSArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpaTtcbiAgICB9O1xuXG4gICAgT2JqZWN0U2VxLnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgICAgdmFyIG9iamVjdCA9IHRoaXMuX29iamVjdDtcbiAgICAgIHZhciBrZXlzID0gdGhpcy5fa2V5cztcbiAgICAgIHZhciBtYXhJbmRleCA9IGtleXMubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBpaSA9IDA7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkgIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNbcmV2ZXJzZSA/IG1heEluZGV4IC0gaWkgOiBpaV07XG4gICAgICAgIHJldHVybiBpaSsrID4gbWF4SW5kZXggP1xuICAgICAgICAgIGl0ZXJhdG9yRG9uZSgpIDpcbiAgICAgICAgICBpdGVyYXRvclZhbHVlKHR5cGUsIGtleSwgb2JqZWN0W2tleV0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICBPYmplY3RTZXEucHJvdG90eXBlW0lTX09SREVSRURfU0VOVElORUxdID0gdHJ1ZTtcblxuXG4gIGNyZWF0ZUNsYXNzKEl0ZXJhYmxlU2VxLCBJbmRleGVkU2VxKTtcbiAgICBmdW5jdGlvbiBJdGVyYWJsZVNlcShpdGVyYWJsZSkge1xuICAgICAgdGhpcy5faXRlcmFibGUgPSBpdGVyYWJsZTtcbiAgICAgIHRoaXMuc2l6ZSA9IGl0ZXJhYmxlLmxlbmd0aCB8fCBpdGVyYWJsZS5zaXplO1xuICAgIH1cblxuICAgIEl0ZXJhYmxlU2VxLnByb3RvdHlwZS5fX2l0ZXJhdGVVbmNhY2hlZCA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7XG4gICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShmbiwgcmV2ZXJzZSk7XG4gICAgICB9XG4gICAgICB2YXIgaXRlcmFibGUgPSB0aGlzLl9pdGVyYWJsZTtcbiAgICAgIHZhciBpdGVyYXRvciA9IGdldEl0ZXJhdG9yKGl0ZXJhYmxlKTtcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIGlmIChpc0l0ZXJhdG9yKGl0ZXJhdG9yKSkge1xuICAgICAgICB2YXIgc3RlcDtcbiAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgIGlmIChmbihzdGVwLnZhbHVlLCBpdGVyYXRpb25zKyssIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlcmF0aW9ucztcbiAgICB9O1xuXG4gICAgSXRlcmFibGVTZXEucHJvdG90eXBlLl9faXRlcmF0b3JVbmNhY2hlZCA9IGZ1bmN0aW9uKHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBpdGVyYWJsZSA9IHRoaXMuX2l0ZXJhYmxlO1xuICAgICAgdmFyIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoaXRlcmFibGUpO1xuICAgICAgaWYgKCFpc0l0ZXJhdG9yKGl0ZXJhdG9yKSkge1xuICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGl0ZXJhdG9yRG9uZSk7XG4gICAgICB9XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkgIHtcbiAgICAgICAgdmFyIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIHJldHVybiBzdGVwLmRvbmUgPyBzdGVwIDogaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zKyssIHN0ZXAudmFsdWUpO1xuICAgICAgfSk7XG4gICAgfTtcblxuXG5cbiAgY3JlYXRlQ2xhc3MoSXRlcmF0b3JTZXEsIEluZGV4ZWRTZXEpO1xuICAgIGZ1bmN0aW9uIEl0ZXJhdG9yU2VxKGl0ZXJhdG9yKSB7XG4gICAgICB0aGlzLl9pdGVyYXRvciA9IGl0ZXJhdG9yO1xuICAgICAgdGhpcy5faXRlcmF0b3JDYWNoZSA9IFtdO1xuICAgIH1cblxuICAgIEl0ZXJhdG9yU2VxLnByb3RvdHlwZS5fX2l0ZXJhdGVVbmNhY2hlZCA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7XG4gICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShmbiwgcmV2ZXJzZSk7XG4gICAgICB9XG4gICAgICB2YXIgaXRlcmF0b3IgPSB0aGlzLl9pdGVyYXRvcjtcbiAgICAgIHZhciBjYWNoZSA9IHRoaXMuX2l0ZXJhdG9yQ2FjaGU7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICB3aGlsZSAoaXRlcmF0aW9ucyA8IGNhY2hlLmxlbmd0aCkge1xuICAgICAgICBpZiAoZm4oY2FjaGVbaXRlcmF0aW9uc10sIGl0ZXJhdGlvbnMrKywgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBzdGVwO1xuICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICB2YXIgdmFsID0gc3RlcC52YWx1ZTtcbiAgICAgICAgY2FjaGVbaXRlcmF0aW9uc10gPSB2YWw7XG4gICAgICAgIGlmIChmbih2YWwsIGl0ZXJhdGlvbnMrKywgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVyYXRpb25zO1xuICAgIH07XG5cbiAgICBJdGVyYXRvclNlcS5wcm90b3R5cGUuX19pdGVyYXRvclVuY2FjaGVkID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgICAgaWYgKHJldmVyc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgICAgfVxuICAgICAgdmFyIGl0ZXJhdG9yID0gdGhpcy5faXRlcmF0b3I7XG4gICAgICB2YXIgY2FjaGUgPSB0aGlzLl9pdGVyYXRvckNhY2hlO1xuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbigpICB7XG4gICAgICAgIGlmIChpdGVyYXRpb25zID49IGNhY2hlLmxlbmd0aCkge1xuICAgICAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYWNoZVtpdGVyYXRpb25zXSA9IHN0ZXAudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVmFsdWUodHlwZSwgaXRlcmF0aW9ucywgY2FjaGVbaXRlcmF0aW9ucysrXSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG5cblxuXG4gIC8vICMgcHJhZ21hIEhlbHBlciBmdW5jdGlvbnNcblxuICBmdW5jdGlvbiBpc1NlcShtYXliZVNlcSkge1xuICAgIHJldHVybiAhIShtYXliZVNlcSAmJiBtYXliZVNlcVtJU19TRVFfU0VOVElORUxdKTtcbiAgfVxuXG4gIHZhciBFTVBUWV9TRVE7XG5cbiAgZnVuY3Rpb24gZW1wdHlTZXF1ZW5jZSgpIHtcbiAgICByZXR1cm4gRU1QVFlfU0VRIHx8IChFTVBUWV9TRVEgPSBuZXcgQXJyYXlTZXEoW10pKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGtleWVkU2VxRnJvbVZhbHVlKHZhbHVlKSB7XG4gICAgdmFyIHNlcSA9XG4gICAgICBBcnJheS5pc0FycmF5KHZhbHVlKSA/IG5ldyBBcnJheVNlcSh2YWx1ZSkuZnJvbUVudHJ5U2VxKCkgOlxuICAgICAgaXNJdGVyYXRvcih2YWx1ZSkgPyBuZXcgSXRlcmF0b3JTZXEodmFsdWUpLmZyb21FbnRyeVNlcSgpIDpcbiAgICAgIGhhc0l0ZXJhdG9yKHZhbHVlKSA/IG5ldyBJdGVyYWJsZVNlcSh2YWx1ZSkuZnJvbUVudHJ5U2VxKCkgOlxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IG5ldyBPYmplY3RTZXEodmFsdWUpIDpcbiAgICAgIHVuZGVmaW5lZDtcbiAgICBpZiAoIXNlcSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ0V4cGVjdGVkIEFycmF5IG9yIGl0ZXJhYmxlIG9iamVjdCBvZiBbaywgdl0gZW50cmllcywgJytcbiAgICAgICAgJ29yIGtleWVkIG9iamVjdDogJyArIHZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc2VxO1xuICB9XG5cbiAgZnVuY3Rpb24gaW5kZXhlZFNlcUZyb21WYWx1ZSh2YWx1ZSkge1xuICAgIHZhciBzZXEgPSBtYXliZUluZGV4ZWRTZXFGcm9tVmFsdWUodmFsdWUpO1xuICAgIGlmICghc2VxKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnRXhwZWN0ZWQgQXJyYXkgb3IgaXRlcmFibGUgb2JqZWN0IG9mIHZhbHVlczogJyArIHZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc2VxO1xuICB9XG5cbiAgZnVuY3Rpb24gc2VxRnJvbVZhbHVlKHZhbHVlKSB7XG4gICAgdmFyIHNlcSA9IG1heWJlSW5kZXhlZFNlcUZyb21WYWx1ZSh2YWx1ZSkgfHxcbiAgICAgICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIG5ldyBPYmplY3RTZXEodmFsdWUpKTtcbiAgICBpZiAoIXNlcSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ0V4cGVjdGVkIEFycmF5IG9yIGl0ZXJhYmxlIG9iamVjdCBvZiB2YWx1ZXMsIG9yIGtleWVkIG9iamVjdDogJyArIHZhbHVlXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc2VxO1xuICB9XG5cbiAgZnVuY3Rpb24gbWF5YmVJbmRleGVkU2VxRnJvbVZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGlzQXJyYXlMaWtlKHZhbHVlKSA/IG5ldyBBcnJheVNlcSh2YWx1ZSkgOlxuICAgICAgaXNJdGVyYXRvcih2YWx1ZSkgPyBuZXcgSXRlcmF0b3JTZXEodmFsdWUpIDpcbiAgICAgIGhhc0l0ZXJhdG9yKHZhbHVlKSA/IG5ldyBJdGVyYWJsZVNlcSh2YWx1ZSkgOlxuICAgICAgdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNlcUl0ZXJhdGUoc2VxLCBmbiwgcmV2ZXJzZSwgdXNlS2V5cykge1xuICAgIHZhciBjYWNoZSA9IHNlcS5fY2FjaGU7XG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICB2YXIgbWF4SW5kZXggPSBjYWNoZS5sZW5ndGggLSAxO1xuICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8PSBtYXhJbmRleDsgaWkrKykge1xuICAgICAgICB2YXIgZW50cnkgPSBjYWNoZVtyZXZlcnNlID8gbWF4SW5kZXggLSBpaSA6IGlpXTtcbiAgICAgICAgaWYgKGZuKGVudHJ5WzFdLCB1c2VLZXlzID8gZW50cnlbMF0gOiBpaSwgc2VxKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gaWkgKyAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaWk7XG4gICAgfVxuICAgIHJldHVybiBzZXEuX19pdGVyYXRlVW5jYWNoZWQoZm4sIHJldmVyc2UpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2VxSXRlcmF0b3Ioc2VxLCB0eXBlLCByZXZlcnNlLCB1c2VLZXlzKSB7XG4gICAgdmFyIGNhY2hlID0gc2VxLl9jYWNoZTtcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIHZhciBtYXhJbmRleCA9IGNhY2hlLmxlbmd0aCAtIDE7XG4gICAgICB2YXIgaWkgPSAwO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbigpICB7XG4gICAgICAgIHZhciBlbnRyeSA9IGNhY2hlW3JldmVyc2UgPyBtYXhJbmRleCAtIGlpIDogaWldO1xuICAgICAgICByZXR1cm4gaWkrKyA+IG1heEluZGV4ID9cbiAgICAgICAgICBpdGVyYXRvckRvbmUoKSA6XG4gICAgICAgICAgaXRlcmF0b3JWYWx1ZSh0eXBlLCB1c2VLZXlzID8gZW50cnlbMF0gOiBpaSAtIDEsIGVudHJ5WzFdKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gc2VxLl9faXRlcmF0b3JVbmNhY2hlZCh0eXBlLCByZXZlcnNlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZyb21KUyhqc29uLCBjb252ZXJ0ZXIpIHtcbiAgICByZXR1cm4gY29udmVydGVyID9cbiAgICAgIGZyb21KU1dpdGgoY29udmVydGVyLCBqc29uLCAnJywgeycnOiBqc29ufSkgOlxuICAgICAgZnJvbUpTRGVmYXVsdChqc29uKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZyb21KU1dpdGgoY29udmVydGVyLCBqc29uLCBrZXksIHBhcmVudEpTT04pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uKSkge1xuICAgICAgcmV0dXJuIGNvbnZlcnRlci5jYWxsKHBhcmVudEpTT04sIGtleSwgSW5kZXhlZFNlcShqc29uKS5tYXAoZnVuY3Rpb24odiwgaykgIHtyZXR1cm4gZnJvbUpTV2l0aChjb252ZXJ0ZXIsIHYsIGssIGpzb24pfSkpO1xuICAgIH1cbiAgICBpZiAoaXNQbGFpbk9iaihqc29uKSkge1xuICAgICAgcmV0dXJuIGNvbnZlcnRlci5jYWxsKHBhcmVudEpTT04sIGtleSwgS2V5ZWRTZXEoanNvbikubWFwKGZ1bmN0aW9uKHYsIGspICB7cmV0dXJuIGZyb21KU1dpdGgoY29udmVydGVyLCB2LCBrLCBqc29uKX0pKTtcbiAgICB9XG4gICAgcmV0dXJuIGpzb247XG4gIH1cblxuICBmdW5jdGlvbiBmcm9tSlNEZWZhdWx0KGpzb24pIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uKSkge1xuICAgICAgcmV0dXJuIEluZGV4ZWRTZXEoanNvbikubWFwKGZyb21KU0RlZmF1bHQpLnRvTGlzdCgpO1xuICAgIH1cbiAgICBpZiAoaXNQbGFpbk9iaihqc29uKSkge1xuICAgICAgcmV0dXJuIEtleWVkU2VxKGpzb24pLm1hcChmcm9tSlNEZWZhdWx0KS50b01hcCgpO1xuICAgIH1cbiAgICByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzUGxhaW5PYmoodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgJiYgKHZhbHVlLmNvbnN0cnVjdG9yID09PSBPYmplY3QgfHwgdmFsdWUuY29uc3RydWN0b3IgPT09IHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogQW4gZXh0ZW5zaW9uIG9mIHRoZSBcInNhbWUtdmFsdWVcIiBhbGdvcml0aG0gYXMgW2Rlc2NyaWJlZCBmb3IgdXNlIGJ5IEVTNiBNYXBcbiAgICogYW5kIFNldF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWFwI0tleV9lcXVhbGl0eSlcbiAgICpcbiAgICogTmFOIGlzIGNvbnNpZGVyZWQgdGhlIHNhbWUgYXMgTmFOLCBob3dldmVyIC0wIGFuZCAwIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lXG4gICAqIHZhbHVlLCB3aGljaCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYWxnb3JpdGhtIGRlc2NyaWJlZCBieVxuICAgKiBbYE9iamVjdC5pc2BdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9pcykuXG4gICAqXG4gICAqIFRoaXMgaXMgZXh0ZW5kZWQgZnVydGhlciB0byBhbGxvdyBPYmplY3RzIHRvIGRlc2NyaWJlIHRoZSB2YWx1ZXMgdGhleVxuICAgKiByZXByZXNlbnQsIGJ5IHdheSBvZiBgdmFsdWVPZmAgb3IgYGVxdWFsc2AgKGFuZCBgaGFzaENvZGVgKS5cbiAgICpcbiAgICogTm90ZTogYmVjYXVzZSBvZiB0aGlzIGV4dGVuc2lvbiwgdGhlIGtleSBlcXVhbGl0eSBvZiBJbW11dGFibGUuTWFwIGFuZCB0aGVcbiAgICogdmFsdWUgZXF1YWxpdHkgb2YgSW1tdXRhYmxlLlNldCB3aWxsIGRpZmZlciBmcm9tIEVTNiBNYXAgYW5kIFNldC5cbiAgICpcbiAgICogIyMjIERlZmluaW5nIGN1c3RvbSB2YWx1ZXNcbiAgICpcbiAgICogVGhlIGVhc2llc3Qgd2F5IHRvIGRlc2NyaWJlIHRoZSB2YWx1ZSBhbiBvYmplY3QgcmVwcmVzZW50cyBpcyBieSBpbXBsZW1lbnRpbmdcbiAgICogYHZhbHVlT2ZgLiBGb3IgZXhhbXBsZSwgYERhdGVgIHJlcHJlc2VudHMgYSB2YWx1ZSBieSByZXR1cm5pbmcgYSB1bml4XG4gICAqIHRpbWVzdGFtcCBmb3IgYHZhbHVlT2ZgOlxuICAgKlxuICAgKiAgICAgdmFyIGRhdGUxID0gbmV3IERhdGUoMTIzNDU2Nzg5MDAwMCk7IC8vIEZyaSBGZWIgMTMgMjAwOSAuLi5cbiAgICogICAgIHZhciBkYXRlMiA9IG5ldyBEYXRlKDEyMzQ1Njc4OTAwMDApO1xuICAgKiAgICAgZGF0ZTEudmFsdWVPZigpOyAvLyAxMjM0NTY3ODkwMDAwXG4gICAqICAgICBhc3NlcnQoIGRhdGUxICE9PSBkYXRlMiApO1xuICAgKiAgICAgYXNzZXJ0KCBJbW11dGFibGUuaXMoIGRhdGUxLCBkYXRlMiApICk7XG4gICAqXG4gICAqIE5vdGU6IG92ZXJyaWRpbmcgYHZhbHVlT2ZgIG1heSBoYXZlIG90aGVyIGltcGxpY2F0aW9ucyBpZiB5b3UgdXNlIHRoaXMgb2JqZWN0XG4gICAqIHdoZXJlIEphdmFTY3JpcHQgZXhwZWN0cyBhIHByaW1pdGl2ZSwgc3VjaCBhcyBpbXBsaWNpdCBzdHJpbmcgY29lcmNpb24uXG4gICAqXG4gICAqIEZvciBtb3JlIGNvbXBsZXggdHlwZXMsIGVzcGVjaWFsbHkgY29sbGVjdGlvbnMsIGltcGxlbWVudGluZyBgdmFsdWVPZmAgbWF5XG4gICAqIG5vdCBiZSBwZXJmb3JtYW50LiBBbiBhbHRlcm5hdGl2ZSBpcyB0byBpbXBsZW1lbnQgYGVxdWFsc2AgYW5kIGBoYXNoQ29kZWAuXG4gICAqXG4gICAqIGBlcXVhbHNgIHRha2VzIGFub3RoZXIgb2JqZWN0LCBwcmVzdW1hYmx5IG9mIHNpbWlsYXIgdHlwZSwgYW5kIHJldHVybnMgdHJ1ZVxuICAgKiBpZiB0aGUgaXQgaXMgZXF1YWwuIEVxdWFsaXR5IGlzIHN5bW1ldHJpY2FsLCBzbyB0aGUgc2FtZSByZXN1bHQgc2hvdWxkIGJlXG4gICAqIHJldHVybmVkIGlmIHRoaXMgYW5kIHRoZSBhcmd1bWVudCBhcmUgZmxpcHBlZC5cbiAgICpcbiAgICogICAgIGFzc2VydCggYS5lcXVhbHMoYikgPT09IGIuZXF1YWxzKGEpICk7XG4gICAqXG4gICAqIGBoYXNoQ29kZWAgcmV0dXJucyBhIDMyYml0IGludGVnZXIgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgb2JqZWN0IHdoaWNoIHdpbGxcbiAgICogYmUgdXNlZCB0byBkZXRlcm1pbmUgaG93IHRvIHN0b3JlIHRoZSB2YWx1ZSBvYmplY3QgaW4gYSBNYXAgb3IgU2V0LiBZb3UgbXVzdFxuICAgKiBwcm92aWRlIGJvdGggb3IgbmVpdGhlciBtZXRob2RzLCBvbmUgbXVzdCBub3QgZXhpc3Qgd2l0aG91dCB0aGUgb3RoZXIuXG4gICAqXG4gICAqIEFsc28sIGFuIGltcG9ydGFudCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGVzZSBtZXRob2RzIG11c3QgYmUgdXBoZWxkOiBpZiB0d29cbiAgICogdmFsdWVzIGFyZSBlcXVhbCwgdGhleSAqbXVzdCogcmV0dXJuIHRoZSBzYW1lIGhhc2hDb2RlLiBJZiB0aGUgdmFsdWVzIGFyZSBub3RcbiAgICogZXF1YWwsIHRoZXkgbWlnaHQgaGF2ZSB0aGUgc2FtZSBoYXNoQ29kZTsgdGhpcyBpcyBjYWxsZWQgYSBoYXNoIGNvbGxpc2lvbixcbiAgICogYW5kIHdoaWxlIHVuZGVzaXJhYmxlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBpdCBpcyBhY2NlcHRhYmxlLlxuICAgKlxuICAgKiAgICAgaWYgKGEuZXF1YWxzKGIpKSB7XG4gICAqICAgICAgIGFzc2VydCggYS5oYXNoQ29kZSgpID09PSBiLmhhc2hDb2RlKCkgKTtcbiAgICogICAgIH1cbiAgICpcbiAgICogQWxsIEltbXV0YWJsZSBjb2xsZWN0aW9ucyBpbXBsZW1lbnQgYGVxdWFsc2AgYW5kIGBoYXNoQ29kZWAuXG4gICAqXG4gICAqL1xuICBmdW5jdGlvbiBpcyh2YWx1ZUEsIHZhbHVlQikge1xuICAgIGlmICh2YWx1ZUEgPT09IHZhbHVlQiB8fCAodmFsdWVBICE9PSB2YWx1ZUEgJiYgdmFsdWVCICE9PSB2YWx1ZUIpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCF2YWx1ZUEgfHwgIXZhbHVlQikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlQS52YWx1ZU9mID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHR5cGVvZiB2YWx1ZUIudmFsdWVPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFsdWVBID0gdmFsdWVBLnZhbHVlT2YoKTtcbiAgICAgIHZhbHVlQiA9IHZhbHVlQi52YWx1ZU9mKCk7XG4gICAgICBpZiAodmFsdWVBID09PSB2YWx1ZUIgfHwgKHZhbHVlQSAhPT0gdmFsdWVBICYmIHZhbHVlQiAhPT0gdmFsdWVCKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICghdmFsdWVBIHx8ICF2YWx1ZUIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlQS5lcXVhbHMgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlQi5lcXVhbHMgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdmFsdWVBLmVxdWFscyh2YWx1ZUIpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVlcEVxdWFsKGEsIGIpIHtcbiAgICBpZiAoYSA9PT0gYikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgIWlzSXRlcmFibGUoYikgfHxcbiAgICAgIGEuc2l6ZSAhPT0gdW5kZWZpbmVkICYmIGIuc2l6ZSAhPT0gdW5kZWZpbmVkICYmIGEuc2l6ZSAhPT0gYi5zaXplIHx8XG4gICAgICBhLl9faGFzaCAhPT0gdW5kZWZpbmVkICYmIGIuX19oYXNoICE9PSB1bmRlZmluZWQgJiYgYS5fX2hhc2ggIT09IGIuX19oYXNoIHx8XG4gICAgICBpc0tleWVkKGEpICE9PSBpc0tleWVkKGIpIHx8XG4gICAgICBpc0luZGV4ZWQoYSkgIT09IGlzSW5kZXhlZChiKSB8fFxuICAgICAgaXNPcmRlcmVkKGEpICE9PSBpc09yZGVyZWQoYilcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoYS5zaXplID09PSAwICYmIGIuc2l6ZSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIG5vdEFzc29jaWF0aXZlID0gIWlzQXNzb2NpYXRpdmUoYSk7XG5cbiAgICBpZiAoaXNPcmRlcmVkKGEpKSB7XG4gICAgICB2YXIgZW50cmllcyA9IGEuZW50cmllcygpO1xuICAgICAgcmV0dXJuIGIuZXZlcnkoZnVuY3Rpb24odiwgaykgIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllcy5uZXh0KCkudmFsdWU7XG4gICAgICAgIHJldHVybiBlbnRyeSAmJiBpcyhlbnRyeVsxXSwgdikgJiYgKG5vdEFzc29jaWF0aXZlIHx8IGlzKGVudHJ5WzBdLCBrKSk7XG4gICAgICB9KSAmJiBlbnRyaWVzLm5leHQoKS5kb25lO1xuICAgIH1cblxuICAgIHZhciBmbGlwcGVkID0gZmFsc2U7XG5cbiAgICBpZiAoYS5zaXplID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChiLnNpemUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGEuY2FjaGVSZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBhLmNhY2hlUmVzdWx0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZsaXBwZWQgPSB0cnVlO1xuICAgICAgICB2YXIgXyA9IGE7XG4gICAgICAgIGEgPSBiO1xuICAgICAgICBiID0gXztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgYWxsRXF1YWwgPSB0cnVlO1xuICAgIHZhciBiU2l6ZSA9IGIuX19pdGVyYXRlKGZ1bmN0aW9uKHYsIGspICB7XG4gICAgICBpZiAobm90QXNzb2NpYXRpdmUgPyAhYS5oYXModikgOlxuICAgICAgICAgIGZsaXBwZWQgPyAhaXModiwgYS5nZXQoaywgTk9UX1NFVCkpIDogIWlzKGEuZ2V0KGssIE5PVF9TRVQpLCB2KSkge1xuICAgICAgICBhbGxFcXVhbCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gYWxsRXF1YWwgJiYgYS5zaXplID09PSBiU2l6ZTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKFJlcGVhdCwgSW5kZXhlZFNlcSk7XG5cbiAgICBmdW5jdGlvbiBSZXBlYXQodmFsdWUsIHRpbWVzKSB7XG4gICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVwZWF0KSkge1xuICAgICAgICByZXR1cm4gbmV3IFJlcGVhdCh2YWx1ZSwgdGltZXMpO1xuICAgICAgfVxuICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuc2l6ZSA9IHRpbWVzID09PSB1bmRlZmluZWQgPyBJbmZpbml0eSA6IE1hdGgubWF4KDAsIHRpbWVzKTtcbiAgICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgICAgaWYgKEVNUFRZX1JFUEVBVCkge1xuICAgICAgICAgIHJldHVybiBFTVBUWV9SRVBFQVQ7XG4gICAgICAgIH1cbiAgICAgICAgRU1QVFlfUkVQRUFUID0gdGhpcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBSZXBlYXQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiAnUmVwZWF0IFtdJztcbiAgICAgIH1cbiAgICAgIHJldHVybiAnUmVwZWF0IFsgJyArIHRoaXMuX3ZhbHVlICsgJyAnICsgdGhpcy5zaXplICsgJyB0aW1lcyBdJztcbiAgICB9O1xuXG4gICAgUmVwZWF0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihpbmRleCwgbm90U2V0VmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhcyhpbmRleCkgPyB0aGlzLl92YWx1ZSA6IG5vdFNldFZhbHVlO1xuICAgIH07XG5cbiAgICBSZXBlYXQucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24oc2VhcmNoVmFsdWUpIHtcbiAgICAgIHJldHVybiBpcyh0aGlzLl92YWx1ZSwgc2VhcmNoVmFsdWUpO1xuICAgIH07XG5cbiAgICBSZXBlYXQucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24oYmVnaW4sIGVuZCkge1xuICAgICAgdmFyIHNpemUgPSB0aGlzLnNpemU7XG4gICAgICByZXR1cm4gd2hvbGVTbGljZShiZWdpbiwgZW5kLCBzaXplKSA/IHRoaXMgOlxuICAgICAgICBuZXcgUmVwZWF0KHRoaXMuX3ZhbHVlLCByZXNvbHZlRW5kKGVuZCwgc2l6ZSkgLSByZXNvbHZlQmVnaW4oYmVnaW4sIHNpemUpKTtcbiAgICB9O1xuXG4gICAgUmVwZWF0LnByb3RvdHlwZS5yZXZlcnNlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgUmVwZWF0LnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24oc2VhcmNoVmFsdWUpIHtcbiAgICAgIGlmIChpcyh0aGlzLl92YWx1ZSwgc2VhcmNoVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH07XG5cbiAgICBSZXBlYXQucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24oc2VhcmNoVmFsdWUpIHtcbiAgICAgIGlmIChpcyh0aGlzLl92YWx1ZSwgc2VhcmNoVmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNpemU7XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfTtcblxuICAgIFJlcGVhdC5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHtcbiAgICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCB0aGlzLnNpemU7IGlpKyspIHtcbiAgICAgICAgaWYgKGZuKHRoaXMuX3ZhbHVlLCBpaSwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGlpICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGlpO1xuICAgIH07XG5cbiAgICBSZXBlYXQucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7dmFyIHRoaXMkMCA9IHRoaXM7XG4gICAgICB2YXIgaWkgPSAwO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbigpIFxuICAgICAgICB7cmV0dXJuIGlpIDwgdGhpcyQwLnNpemUgPyBpdGVyYXRvclZhbHVlKHR5cGUsIGlpKyssIHRoaXMkMC5fdmFsdWUpIDogaXRlcmF0b3JEb25lKCl9XG4gICAgICApO1xuICAgIH07XG5cbiAgICBSZXBlYXQucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uKG90aGVyKSB7XG4gICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBSZXBlYXQgP1xuICAgICAgICBpcyh0aGlzLl92YWx1ZSwgb3RoZXIuX3ZhbHVlKSA6XG4gICAgICAgIGRlZXBFcXVhbChvdGhlcik7XG4gICAgfTtcblxuXG4gIHZhciBFTVBUWV9SRVBFQVQ7XG5cbiAgZnVuY3Rpb24gaW52YXJpYW50KGNvbmRpdGlvbiwgZXJyb3IpIHtcbiAgICBpZiAoIWNvbmRpdGlvbikgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKFJhbmdlLCBJbmRleGVkU2VxKTtcblxuICAgIGZ1bmN0aW9uIFJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXApIHtcbiAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSYW5nZSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzdGFydCwgZW5kLCBzdGVwKTtcbiAgICAgIH1cbiAgICAgIGludmFyaWFudChzdGVwICE9PSAwLCAnQ2Fubm90IHN0ZXAgYSBSYW5nZSBieSAwJyk7XG4gICAgICBzdGFydCA9IHN0YXJ0IHx8IDA7XG4gICAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW5kID0gSW5maW5pdHk7XG4gICAgICB9XG4gICAgICBzdGVwID0gc3RlcCA9PT0gdW5kZWZpbmVkID8gMSA6IE1hdGguYWJzKHN0ZXApO1xuICAgICAgaWYgKGVuZCA8IHN0YXJ0KSB7XG4gICAgICAgIHN0ZXAgPSAtc3RlcDtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3N0YXJ0ID0gc3RhcnQ7XG4gICAgICB0aGlzLl9lbmQgPSBlbmQ7XG4gICAgICB0aGlzLl9zdGVwID0gc3RlcDtcbiAgICAgIHRoaXMuc2l6ZSA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoZW5kIC0gc3RhcnQpIC8gc3RlcCAtIDEpICsgMSk7XG4gICAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICAgIGlmIChFTVBUWV9SQU5HRSkge1xuICAgICAgICAgIHJldHVybiBFTVBUWV9SQU5HRTtcbiAgICAgICAgfVxuICAgICAgICBFTVBUWV9SQU5HRSA9IHRoaXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgUmFuZ2UucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiAnUmFuZ2UgW10nO1xuICAgICAgfVxuICAgICAgcmV0dXJuICdSYW5nZSBbICcgK1xuICAgICAgICB0aGlzLl9zdGFydCArICcuLi4nICsgdGhpcy5fZW5kICtcbiAgICAgICAgKHRoaXMuX3N0ZXAgIT09IDEgPyAnIGJ5ICcgKyB0aGlzLl9zdGVwIDogJycpICtcbiAgICAgICcgXSc7XG4gICAgfTtcblxuICAgIFJhbmdlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihpbmRleCwgbm90U2V0VmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhcyhpbmRleCkgP1xuICAgICAgICB0aGlzLl9zdGFydCArIHdyYXBJbmRleCh0aGlzLCBpbmRleCkgKiB0aGlzLl9zdGVwIDpcbiAgICAgICAgbm90U2V0VmFsdWU7XG4gICAgfTtcblxuICAgIFJhbmdlLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uKHNlYXJjaFZhbHVlKSB7XG4gICAgICB2YXIgcG9zc2libGVJbmRleCA9IChzZWFyY2hWYWx1ZSAtIHRoaXMuX3N0YXJ0KSAvIHRoaXMuX3N0ZXA7XG4gICAgICByZXR1cm4gcG9zc2libGVJbmRleCA+PSAwICYmXG4gICAgICAgIHBvc3NpYmxlSW5kZXggPCB0aGlzLnNpemUgJiZcbiAgICAgICAgcG9zc2libGVJbmRleCA9PT0gTWF0aC5mbG9vcihwb3NzaWJsZUluZGV4KTtcbiAgICB9O1xuXG4gICAgUmFuZ2UucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24oYmVnaW4sIGVuZCkge1xuICAgICAgaWYgKHdob2xlU2xpY2UoYmVnaW4sIGVuZCwgdGhpcy5zaXplKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGJlZ2luID0gcmVzb2x2ZUJlZ2luKGJlZ2luLCB0aGlzLnNpemUpO1xuICAgICAgZW5kID0gcmVzb2x2ZUVuZChlbmQsIHRoaXMuc2l6ZSk7XG4gICAgICBpZiAoZW5kIDw9IGJlZ2luKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2UoMCwgMCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IFJhbmdlKHRoaXMuZ2V0KGJlZ2luLCB0aGlzLl9lbmQpLCB0aGlzLmdldChlbmQsIHRoaXMuX2VuZCksIHRoaXMuX3N0ZXApO1xuICAgIH07XG5cbiAgICBSYW5nZS5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uKHNlYXJjaFZhbHVlKSB7XG4gICAgICB2YXIgb2Zmc2V0VmFsdWUgPSBzZWFyY2hWYWx1ZSAtIHRoaXMuX3N0YXJ0O1xuICAgICAgaWYgKG9mZnNldFZhbHVlICUgdGhpcy5fc3RlcCA9PT0gMCkge1xuICAgICAgICB2YXIgaW5kZXggPSBvZmZzZXRWYWx1ZSAvIHRoaXMuX3N0ZXA7XG4gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5zaXplKSB7XG4gICAgICAgICAgcmV0dXJuIGluZGV4XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9O1xuXG4gICAgUmFuZ2UucHJvdG90eXBlLmxhc3RJbmRleE9mID0gZnVuY3Rpb24oc2VhcmNoVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmluZGV4T2Yoc2VhcmNoVmFsdWUpO1xuICAgIH07XG5cbiAgICBSYW5nZS5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHtcbiAgICAgIHZhciBtYXhJbmRleCA9IHRoaXMuc2l6ZSAtIDE7XG4gICAgICB2YXIgc3RlcCA9IHRoaXMuX3N0ZXA7XG4gICAgICB2YXIgdmFsdWUgPSByZXZlcnNlID8gdGhpcy5fc3RhcnQgKyBtYXhJbmRleCAqIHN0ZXAgOiB0aGlzLl9zdGFydDtcbiAgICAgIGZvciAodmFyIGlpID0gMDsgaWkgPD0gbWF4SW5kZXg7IGlpKyspIHtcbiAgICAgICAgaWYgKGZuKHZhbHVlLCBpaSwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGlpICsgMTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZSArPSByZXZlcnNlID8gLXN0ZXAgOiBzdGVwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlpO1xuICAgIH07XG5cbiAgICBSYW5nZS5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uKHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIHZhciBtYXhJbmRleCA9IHRoaXMuc2l6ZSAtIDE7XG4gICAgICB2YXIgc3RlcCA9IHRoaXMuX3N0ZXA7XG4gICAgICB2YXIgdmFsdWUgPSByZXZlcnNlID8gdGhpcy5fc3RhcnQgKyBtYXhJbmRleCAqIHN0ZXAgOiB0aGlzLl9zdGFydDtcbiAgICAgIHZhciBpaSA9IDA7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkgIHtcbiAgICAgICAgdmFyIHYgPSB2YWx1ZTtcbiAgICAgICAgdmFsdWUgKz0gcmV2ZXJzZSA/IC1zdGVwIDogc3RlcDtcbiAgICAgICAgcmV0dXJuIGlpID4gbWF4SW5kZXggPyBpdGVyYXRvckRvbmUoKSA6IGl0ZXJhdG9yVmFsdWUodHlwZSwgaWkrKywgdik7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgUmFuZ2UucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uKG90aGVyKSB7XG4gICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBSYW5nZSA/XG4gICAgICAgIHRoaXMuX3N0YXJ0ID09PSBvdGhlci5fc3RhcnQgJiZcbiAgICAgICAgdGhpcy5fZW5kID09PSBvdGhlci5fZW5kICYmXG4gICAgICAgIHRoaXMuX3N0ZXAgPT09IG90aGVyLl9zdGVwIDpcbiAgICAgICAgZGVlcEVxdWFsKHRoaXMsIG90aGVyKTtcbiAgICB9O1xuXG5cbiAgdmFyIEVNUFRZX1JBTkdFO1xuXG4gIGNyZWF0ZUNsYXNzKENvbGxlY3Rpb24sIEl0ZXJhYmxlKTtcbiAgICBmdW5jdGlvbiBDb2xsZWN0aW9uKCkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdBYnN0cmFjdCcpO1xuICAgIH1cblxuXG4gIGNyZWF0ZUNsYXNzKEtleWVkQ29sbGVjdGlvbiwgQ29sbGVjdGlvbik7ZnVuY3Rpb24gS2V5ZWRDb2xsZWN0aW9uKCkge31cblxuICBjcmVhdGVDbGFzcyhJbmRleGVkQ29sbGVjdGlvbiwgQ29sbGVjdGlvbik7ZnVuY3Rpb24gSW5kZXhlZENvbGxlY3Rpb24oKSB7fVxuXG4gIGNyZWF0ZUNsYXNzKFNldENvbGxlY3Rpb24sIENvbGxlY3Rpb24pO2Z1bmN0aW9uIFNldENvbGxlY3Rpb24oKSB7fVxuXG5cbiAgQ29sbGVjdGlvbi5LZXllZCA9IEtleWVkQ29sbGVjdGlvbjtcbiAgQ29sbGVjdGlvbi5JbmRleGVkID0gSW5kZXhlZENvbGxlY3Rpb247XG4gIENvbGxlY3Rpb24uU2V0ID0gU2V0Q29sbGVjdGlvbjtcblxuICB2YXIgaW11bCA9XG4gICAgdHlwZW9mIE1hdGguaW11bCA9PT0gJ2Z1bmN0aW9uJyAmJiBNYXRoLmltdWwoMHhmZmZmZmZmZiwgMikgPT09IC0yID9cbiAgICBNYXRoLmltdWwgOlxuICAgIGZ1bmN0aW9uIGltdWwoYSwgYikge1xuICAgICAgYSA9IGEgfCAwOyAvLyBpbnRcbiAgICAgIGIgPSBiIHwgMDsgLy8gaW50XG4gICAgICB2YXIgYyA9IGEgJiAweGZmZmY7XG4gICAgICB2YXIgZCA9IGIgJiAweGZmZmY7XG4gICAgICAvLyBTaGlmdCBieSAwIGZpeGVzIHRoZSBzaWduIG9uIHRoZSBoaWdoIHBhcnQuXG4gICAgICByZXR1cm4gKGMgKiBkKSArICgoKChhID4+PiAxNikgKiBkICsgYyAqIChiID4+PiAxNikpIDw8IDE2KSA+Pj4gMCkgfCAwOyAvLyBpbnRcbiAgICB9O1xuXG4gIC8vIHY4IGhhcyBhbiBvcHRpbWl6YXRpb24gZm9yIHN0b3JpbmcgMzEtYml0IHNpZ25lZCBudW1iZXJzLlxuICAvLyBWYWx1ZXMgd2hpY2ggaGF2ZSBlaXRoZXIgMDAgb3IgMTEgYXMgdGhlIGhpZ2ggb3JkZXIgYml0cyBxdWFsaWZ5LlxuICAvLyBUaGlzIGZ1bmN0aW9uIGRyb3BzIHRoZSBoaWdoZXN0IG9yZGVyIGJpdCBpbiBhIHNpZ25lZCBudW1iZXIsIG1haW50YWluaW5nXG4gIC8vIHRoZSBzaWduIGJpdC5cbiAgZnVuY3Rpb24gc21pKGkzMikge1xuICAgIHJldHVybiAoKGkzMiA+Pj4gMSkgJiAweDQwMDAwMDAwKSB8IChpMzIgJiAweEJGRkZGRkZGKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc2gobykge1xuICAgIGlmIChvID09PSBmYWxzZSB8fCBvID09PSBudWxsIHx8IG8gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygby52YWx1ZU9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvID0gby52YWx1ZU9mKCk7XG4gICAgICBpZiAobyA9PT0gZmFsc2UgfHwgbyA9PT0gbnVsbCB8fCBvID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgdmFyIHR5cGUgPSB0eXBlb2YgbztcbiAgICBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmIChvICE9PSBvIHx8IG8gPT09IEluZmluaXR5KSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgdmFyIGggPSBvIHwgMDtcbiAgICAgIGlmIChoICE9PSBvKSB7XG4gICAgICAgIGggXj0gbyAqIDB4RkZGRkZGRkY7XG4gICAgICB9XG4gICAgICB3aGlsZSAobyA+IDB4RkZGRkZGRkYpIHtcbiAgICAgICAgbyAvPSAweEZGRkZGRkZGO1xuICAgICAgICBoIF49IG87XG4gICAgICB9XG4gICAgICByZXR1cm4gc21pKGgpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBvLmxlbmd0aCA+IFNUUklOR19IQVNIX0NBQ0hFX01JTl9TVFJMRU4gPyBjYWNoZWRIYXNoU3RyaW5nKG8pIDogaGFzaFN0cmluZyhvKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvLmhhc2hDb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gby5oYXNoQ29kZSgpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiBoYXNoSlNPYmoobyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygby50b1N0cmluZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGhhc2hTdHJpbmcoby50b1N0cmluZygpKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdWYWx1ZSB0eXBlICcgKyB0eXBlICsgJyBjYW5ub3QgYmUgaGFzaGVkLicpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FjaGVkSGFzaFN0cmluZyhzdHJpbmcpIHtcbiAgICB2YXIgaGFzaCA9IHN0cmluZ0hhc2hDYWNoZVtzdHJpbmddO1xuICAgIGlmIChoYXNoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc2ggPSBoYXNoU3RyaW5nKHN0cmluZyk7XG4gICAgICBpZiAoU1RSSU5HX0hBU0hfQ0FDSEVfU0laRSA9PT0gU1RSSU5HX0hBU0hfQ0FDSEVfTUFYX1NJWkUpIHtcbiAgICAgICAgU1RSSU5HX0hBU0hfQ0FDSEVfU0laRSA9IDA7XG4gICAgICAgIHN0cmluZ0hhc2hDYWNoZSA9IHt9O1xuICAgICAgfVxuICAgICAgU1RSSU5HX0hBU0hfQ0FDSEVfU0laRSsrO1xuICAgICAgc3RyaW5nSGFzaENhY2hlW3N0cmluZ10gPSBoYXNoO1xuICAgIH1cbiAgICByZXR1cm4gaGFzaDtcbiAgfVxuXG4gIC8vIGh0dHA6Ly9qc3BlcmYuY29tL2hhc2hpbmctc3RyaW5nc1xuICBmdW5jdGlvbiBoYXNoU3RyaW5nKHN0cmluZykge1xuICAgIC8vIFRoaXMgaXMgdGhlIGhhc2ggZnJvbSBKVk1cbiAgICAvLyBUaGUgaGFzaCBjb2RlIGZvciBhIHN0cmluZyBpcyBjb21wdXRlZCBhc1xuICAgIC8vIHNbMF0gKiAzMSBeIChuIC0gMSkgKyBzWzFdICogMzEgXiAobiAtIDIpICsgLi4uICsgc1tuIC0gMV0sXG4gICAgLy8gd2hlcmUgc1tpXSBpcyB0aGUgaXRoIGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nIGFuZCBuIGlzIHRoZSBsZW5ndGggb2ZcbiAgICAvLyB0aGUgc3RyaW5nLiBXZSBcIm1vZFwiIHRoZSByZXN1bHQgdG8gbWFrZSBpdCBiZXR3ZWVuIDAgKGluY2x1c2l2ZSkgYW5kIDJeMzFcbiAgICAvLyAoZXhjbHVzaXZlKSBieSBkcm9wcGluZyBoaWdoIGJpdHMuXG4gICAgdmFyIGhhc2ggPSAwO1xuICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCBzdHJpbmcubGVuZ3RoOyBpaSsrKSB7XG4gICAgICBoYXNoID0gMzEgKiBoYXNoICsgc3RyaW5nLmNoYXJDb2RlQXQoaWkpIHwgMDtcbiAgICB9XG4gICAgcmV0dXJuIHNtaShoYXNoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc2hKU09iaihvYmopIHtcbiAgICB2YXIgaGFzaDtcbiAgICBpZiAodXNpbmdXZWFrTWFwKSB7XG4gICAgICBoYXNoID0gd2Vha01hcC5nZXQob2JqKTtcbiAgICAgIGlmIChoYXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGhhc2g7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaGFzaCA9IG9ialtVSURfSEFTSF9LRVldO1xuICAgIGlmIChoYXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBoYXNoO1xuICAgIH1cblxuICAgIGlmICghY2FuRGVmaW5lUHJvcGVydHkpIHtcbiAgICAgIGhhc2ggPSBvYmoucHJvcGVydHlJc0VudW1lcmFibGUgJiYgb2JqLnByb3BlcnR5SXNFbnVtZXJhYmxlW1VJRF9IQVNIX0tFWV07XG4gICAgICBpZiAoaGFzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBoYXNoO1xuICAgICAgfVxuXG4gICAgICBoYXNoID0gZ2V0SUVOb2RlSGFzaChvYmopO1xuICAgICAgaWYgKGhhc2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gaGFzaDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBoYXNoID0gKytvYmpIYXNoVUlEO1xuICAgIGlmIChvYmpIYXNoVUlEICYgMHg0MDAwMDAwMCkge1xuICAgICAgb2JqSGFzaFVJRCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKHVzaW5nV2Vha01hcCkge1xuICAgICAgd2Vha01hcC5zZXQob2JqLCBoYXNoKTtcbiAgICB9IGVsc2UgaWYgKGlzRXh0ZW5zaWJsZSAhPT0gdW5kZWZpbmVkICYmIGlzRXh0ZW5zaWJsZShvYmopID09PSBmYWxzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb24tZXh0ZW5zaWJsZSBvYmplY3RzIGFyZSBub3QgYWxsb3dlZCBhcyBrZXlzLicpO1xuICAgIH0gZWxzZSBpZiAoY2FuRGVmaW5lUHJvcGVydHkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIFVJRF9IQVNIX0tFWSwge1xuICAgICAgICAnZW51bWVyYWJsZSc6IGZhbHNlLFxuICAgICAgICAnY29uZmlndXJhYmxlJzogZmFsc2UsXG4gICAgICAgICd3cml0YWJsZSc6IGZhbHNlLFxuICAgICAgICAndmFsdWUnOiBoYXNoXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKG9iai5wcm9wZXJ0eUlzRW51bWVyYWJsZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICBvYmoucHJvcGVydHlJc0VudW1lcmFibGUgPT09IG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUpIHtcbiAgICAgIC8vIFNpbmNlIHdlIGNhbid0IGRlZmluZSBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IG9uIHRoZSBvYmplY3RcbiAgICAgIC8vIHdlJ2xsIGhpamFjayBvbmUgb2YgdGhlIGxlc3MtdXNlZCBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzIHRvXG4gICAgICAvLyBzYXZlIG91ciBoYXNoIG9uIGl0LiBTaW5jZSB0aGlzIGlzIGEgZnVuY3Rpb24gaXQgd2lsbCBub3Qgc2hvdyB1cCBpblxuICAgICAgLy8gYEpTT04uc3RyaW5naWZ5YCB3aGljaCBpcyB3aGF0IHdlIHdhbnQuXG4gICAgICBvYmoucHJvcGVydHlJc0VudW1lcmFibGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgICAgb2JqLnByb3BlcnR5SXNFbnVtZXJhYmxlW1VJRF9IQVNIX0tFWV0gPSBoYXNoO1xuICAgIH0gZWxzZSBpZiAob2JqLm5vZGVUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQgd2UgY291bGRuJ3QgZ2V0IHRoZSBJRSBgdW5pcXVlSURgIHRvIHVzZSBhcyBhIGhhc2hcbiAgICAgIC8vIGFuZCB3ZSBjb3VsZG4ndCB1c2UgYSBub24tZW51bWVyYWJsZSBwcm9wZXJ0eSB0byBleHBsb2l0IHRoZVxuICAgICAgLy8gZG9udEVudW0gYnVnIHNvIHdlIHNpbXBseSBhZGQgdGhlIGBVSURfSEFTSF9LRVlgIG9uIHRoZSBub2RlXG4gICAgICAvLyBpdHNlbGYuXG4gICAgICBvYmpbVUlEX0hBU0hfS0VZXSA9IGhhc2g7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHNldCBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IG9uIG9iamVjdC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFzaDtcbiAgfVxuXG4gIC8vIEdldCByZWZlcmVuY2VzIHRvIEVTNSBvYmplY3QgbWV0aG9kcy5cbiAgdmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7XG5cbiAgLy8gVHJ1ZSBpZiBPYmplY3QuZGVmaW5lUHJvcGVydHkgd29ya3MgYXMgZXhwZWN0ZWQuIElFOCBmYWlscyB0aGlzIHRlc3QuXG4gIHZhciBjYW5EZWZpbmVQcm9wZXJ0eSA9IChmdW5jdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnQCcsIHt9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0oKSk7XG5cbiAgLy8gSUUgaGFzIGEgYHVuaXF1ZUlEYCBwcm9wZXJ0eSBvbiBET00gbm9kZXMuIFdlIGNhbiBjb25zdHJ1Y3QgdGhlIGhhc2ggZnJvbSBpdFxuICAvLyBhbmQgYXZvaWQgbWVtb3J5IGxlYWtzIGZyb20gdGhlIElFIGNsb25lTm9kZSBidWcuXG4gIGZ1bmN0aW9uIGdldElFTm9kZUhhc2gobm9kZSkge1xuICAgIGlmIChub2RlICYmIG5vZGUubm9kZVR5cGUgPiAwKSB7XG4gICAgICBzd2l0Y2ggKG5vZGUubm9kZVR5cGUpIHtcbiAgICAgICAgY2FzZSAxOiAvLyBFbGVtZW50XG4gICAgICAgICAgcmV0dXJuIG5vZGUudW5pcXVlSUQ7XG4gICAgICAgIGNhc2UgOTogLy8gRG9jdW1lbnRcbiAgICAgICAgICByZXR1cm4gbm9kZS5kb2N1bWVudEVsZW1lbnQgJiYgbm9kZS5kb2N1bWVudEVsZW1lbnQudW5pcXVlSUQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSWYgcG9zc2libGUsIHVzZSBhIFdlYWtNYXAuXG4gIHZhciB1c2luZ1dlYWtNYXAgPSB0eXBlb2YgV2Vha01hcCA9PT0gJ2Z1bmN0aW9uJztcbiAgdmFyIHdlYWtNYXA7XG4gIGlmICh1c2luZ1dlYWtNYXApIHtcbiAgICB3ZWFrTWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgfVxuXG4gIHZhciBvYmpIYXNoVUlEID0gMDtcblxuICB2YXIgVUlEX0hBU0hfS0VZID0gJ19faW1tdXRhYmxlaGFzaF9fJztcbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicpIHtcbiAgICBVSURfSEFTSF9LRVkgPSBTeW1ib2woVUlEX0hBU0hfS0VZKTtcbiAgfVxuXG4gIHZhciBTVFJJTkdfSEFTSF9DQUNIRV9NSU5fU1RSTEVOID0gMTY7XG4gIHZhciBTVFJJTkdfSEFTSF9DQUNIRV9NQVhfU0laRSA9IDI1NTtcbiAgdmFyIFNUUklOR19IQVNIX0NBQ0hFX1NJWkUgPSAwO1xuICB2YXIgc3RyaW5nSGFzaENhY2hlID0ge307XG5cbiAgZnVuY3Rpb24gYXNzZXJ0Tm90SW5maW5pdGUoc2l6ZSkge1xuICAgIGludmFyaWFudChcbiAgICAgIHNpemUgIT09IEluZmluaXR5LFxuICAgICAgJ0Nhbm5vdCBwZXJmb3JtIHRoaXMgYWN0aW9uIHdpdGggYW4gaW5maW5pdGUgc2l6ZS4nXG4gICAgKTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKE1hcCwgS2V5ZWRDb2xsZWN0aW9uKTtcblxuICAgIC8vIEBwcmFnbWEgQ29uc3RydWN0aW9uXG5cbiAgICBmdW5jdGlvbiBNYXAodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gZW1wdHlNYXAoKSA6XG4gICAgICAgIGlzTWFwKHZhbHVlKSAmJiAhaXNPcmRlcmVkKHZhbHVlKSA/IHZhbHVlIDpcbiAgICAgICAgZW1wdHlNYXAoKS53aXRoTXV0YXRpb25zKGZ1bmN0aW9uKG1hcCApIHtcbiAgICAgICAgICB2YXIgaXRlciA9IEtleWVkSXRlcmFibGUodmFsdWUpO1xuICAgICAgICAgIGFzc2VydE5vdEluZmluaXRlKGl0ZXIuc2l6ZSk7XG4gICAgICAgICAgaXRlci5mb3JFYWNoKGZ1bmN0aW9uKHYsIGspICB7cmV0dXJuIG1hcC5zZXQoaywgdil9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgTWFwLm9mID0gZnVuY3Rpb24oKSB7dmFyIGtleVZhbHVlcyA9IFNMSUNFJDAuY2FsbChhcmd1bWVudHMsIDApO1xuICAgICAgcmV0dXJuIGVtcHR5TWFwKCkud2l0aE11dGF0aW9ucyhmdW5jdGlvbihtYXAgKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5VmFsdWVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgaWYgKGkgKyAxID49IGtleVZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyB2YWx1ZSBmb3Iga2V5OiAnICsga2V5VmFsdWVzW2ldKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFwLnNldChrZXlWYWx1ZXNbaV0sIGtleVZhbHVlc1tpICsgMV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgTWFwLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX190b1N0cmluZygnTWFwIHsnLCAnfScpO1xuICAgIH07XG5cbiAgICAvLyBAcHJhZ21hIEFjY2Vzc1xuXG4gICAgTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihrLCBub3RTZXRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Jvb3QgP1xuICAgICAgICB0aGlzLl9yb290LmdldCgwLCB1bmRlZmluZWQsIGssIG5vdFNldFZhbHVlKSA6XG4gICAgICAgIG5vdFNldFZhbHVlO1xuICAgIH07XG5cbiAgICAvLyBAcHJhZ21hIE1vZGlmaWNhdGlvblxuXG4gICAgTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihrLCB2KSB7XG4gICAgICByZXR1cm4gdXBkYXRlTWFwKHRoaXMsIGssIHYpO1xuICAgIH07XG5cbiAgICBNYXAucHJvdG90eXBlLnNldEluID0gZnVuY3Rpb24oa2V5UGF0aCwgdikge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlSW4oa2V5UGF0aCwgTk9UX1NFVCwgZnVuY3Rpb24oKSAge3JldHVybiB2fSk7XG4gICAgfTtcblxuICAgIE1hcC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oaykge1xuICAgICAgcmV0dXJuIHVwZGF0ZU1hcCh0aGlzLCBrLCBOT1RfU0VUKTtcbiAgICB9O1xuXG4gICAgTWFwLnByb3RvdHlwZS5kZWxldGVJbiA9IGZ1bmN0aW9uKGtleVBhdGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUluKGtleVBhdGgsIGZ1bmN0aW9uKCkgIHtyZXR1cm4gTk9UX1NFVH0pO1xuICAgIH07XG5cbiAgICBNYXAucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKGssIG5vdFNldFZhbHVlLCB1cGRhdGVyKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/XG4gICAgICAgIGsodGhpcykgOlxuICAgICAgICB0aGlzLnVwZGF0ZUluKFtrXSwgbm90U2V0VmFsdWUsIHVwZGF0ZXIpO1xuICAgIH07XG5cbiAgICBNYXAucHJvdG90eXBlLnVwZGF0ZUluID0gZnVuY3Rpb24oa2V5UGF0aCwgbm90U2V0VmFsdWUsIHVwZGF0ZXIpIHtcbiAgICAgIGlmICghdXBkYXRlcikge1xuICAgICAgICB1cGRhdGVyID0gbm90U2V0VmFsdWU7XG4gICAgICAgIG5vdFNldFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgdmFyIHVwZGF0ZWRWYWx1ZSA9IHVwZGF0ZUluRGVlcE1hcChcbiAgICAgICAgdGhpcyxcbiAgICAgICAgZm9yY2VJdGVyYXRvcihrZXlQYXRoKSxcbiAgICAgICAgbm90U2V0VmFsdWUsXG4gICAgICAgIHVwZGF0ZXJcbiAgICAgICk7XG4gICAgICByZXR1cm4gdXBkYXRlZFZhbHVlID09PSBOT1RfU0VUID8gdW5kZWZpbmVkIDogdXBkYXRlZFZhbHVlO1xuICAgIH07XG5cbiAgICBNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX19vd25lcklEKSB7XG4gICAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBudWxsO1xuICAgICAgICB0aGlzLl9faGFzaCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fX2FsdGVyZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbXB0eU1hcCgpO1xuICAgIH07XG5cbiAgICAvLyBAcHJhZ21hIENvbXBvc2l0aW9uXG5cbiAgICBNYXAucHJvdG90eXBlLm1lcmdlID0gZnVuY3Rpb24oLyouLi5pdGVycyovKSB7XG4gICAgICByZXR1cm4gbWVyZ2VJbnRvTWFwV2l0aCh0aGlzLCB1bmRlZmluZWQsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIE1hcC5wcm90b3R5cGUubWVyZ2VXaXRoID0gZnVuY3Rpb24obWVyZ2VyKSB7dmFyIGl0ZXJzID0gU0xJQ0UkMC5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICByZXR1cm4gbWVyZ2VJbnRvTWFwV2l0aCh0aGlzLCBtZXJnZXIsIGl0ZXJzKTtcbiAgICB9O1xuXG4gICAgTWFwLnByb3RvdHlwZS5tZXJnZUluID0gZnVuY3Rpb24oa2V5UGF0aCkge3ZhciBpdGVycyA9IFNMSUNFJDAuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlSW4oXG4gICAgICAgIGtleVBhdGgsXG4gICAgICAgIGVtcHR5TWFwKCksXG4gICAgICAgIGZ1bmN0aW9uKG0gKSB7cmV0dXJuIHR5cGVvZiBtLm1lcmdlID09PSAnZnVuY3Rpb24nID9cbiAgICAgICAgICBtLm1lcmdlLmFwcGx5KG0sIGl0ZXJzKSA6XG4gICAgICAgICAgaXRlcnNbaXRlcnMubGVuZ3RoIC0gMV19XG4gICAgICApO1xuICAgIH07XG5cbiAgICBNYXAucHJvdG90eXBlLm1lcmdlRGVlcCA9IGZ1bmN0aW9uKC8qLi4uaXRlcnMqLykge1xuICAgICAgcmV0dXJuIG1lcmdlSW50b01hcFdpdGgodGhpcywgZGVlcE1lcmdlciwgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgTWFwLnByb3RvdHlwZS5tZXJnZURlZXBXaXRoID0gZnVuY3Rpb24obWVyZ2VyKSB7dmFyIGl0ZXJzID0gU0xJQ0UkMC5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICByZXR1cm4gbWVyZ2VJbnRvTWFwV2l0aCh0aGlzLCBkZWVwTWVyZ2VyV2l0aChtZXJnZXIpLCBpdGVycyk7XG4gICAgfTtcblxuICAgIE1hcC5wcm90b3R5cGUubWVyZ2VEZWVwSW4gPSBmdW5jdGlvbihrZXlQYXRoKSB7dmFyIGl0ZXJzID0gU0xJQ0UkMC5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVJbihcbiAgICAgICAga2V5UGF0aCxcbiAgICAgICAgZW1wdHlNYXAoKSxcbiAgICAgICAgZnVuY3Rpb24obSApIHtyZXR1cm4gdHlwZW9mIG0ubWVyZ2VEZWVwID09PSAnZnVuY3Rpb24nID9cbiAgICAgICAgICBtLm1lcmdlRGVlcC5hcHBseShtLCBpdGVycykgOlxuICAgICAgICAgIGl0ZXJzW2l0ZXJzLmxlbmd0aCAtIDFdfVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgTWFwLnByb3RvdHlwZS5zb3J0ID0gZnVuY3Rpb24oY29tcGFyYXRvcikge1xuICAgICAgLy8gTGF0ZSBiaW5kaW5nXG4gICAgICByZXR1cm4gT3JkZXJlZE1hcChzb3J0RmFjdG9yeSh0aGlzLCBjb21wYXJhdG9yKSk7XG4gICAgfTtcblxuICAgIE1hcC5wcm90b3R5cGUuc29ydEJ5ID0gZnVuY3Rpb24obWFwcGVyLCBjb21wYXJhdG9yKSB7XG4gICAgICAvLyBMYXRlIGJpbmRpbmdcbiAgICAgIHJldHVybiBPcmRlcmVkTWFwKHNvcnRGYWN0b3J5KHRoaXMsIGNvbXBhcmF0b3IsIG1hcHBlcikpO1xuICAgIH07XG5cbiAgICAvLyBAcHJhZ21hIE11dGFiaWxpdHlcblxuICAgIE1hcC5wcm90b3R5cGUud2l0aE11dGF0aW9ucyA9IGZ1bmN0aW9uKGZuKSB7XG4gICAgICB2YXIgbXV0YWJsZSA9IHRoaXMuYXNNdXRhYmxlKCk7XG4gICAgICBmbihtdXRhYmxlKTtcbiAgICAgIHJldHVybiBtdXRhYmxlLndhc0FsdGVyZWQoKSA/IG11dGFibGUuX19lbnN1cmVPd25lcih0aGlzLl9fb3duZXJJRCkgOiB0aGlzO1xuICAgIH07XG5cbiAgICBNYXAucHJvdG90eXBlLmFzTXV0YWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX19vd25lcklEID8gdGhpcyA6IHRoaXMuX19lbnN1cmVPd25lcihuZXcgT3duZXJJRCgpKTtcbiAgICB9O1xuXG4gICAgTWFwLnByb3RvdHlwZS5hc0ltbXV0YWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX19lbnN1cmVPd25lcigpO1xuICAgIH07XG5cbiAgICBNYXAucHJvdG90eXBlLndhc0FsdGVyZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fYWx0ZXJlZDtcbiAgICB9O1xuXG4gICAgTWFwLnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgICAgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLCB0eXBlLCByZXZlcnNlKTtcbiAgICB9O1xuXG4gICAgTWFwLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge3ZhciB0aGlzJDAgPSB0aGlzO1xuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgdGhpcy5fcm9vdCAmJiB0aGlzLl9yb290Lml0ZXJhdGUoZnVuY3Rpb24oZW50cnkgKSB7XG4gICAgICAgIGl0ZXJhdGlvbnMrKztcbiAgICAgICAgcmV0dXJuIGZuKGVudHJ5WzFdLCBlbnRyeVswXSwgdGhpcyQwKTtcbiAgICAgIH0sIHJldmVyc2UpO1xuICAgICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gICAgfTtcblxuICAgIE1hcC5wcm90b3R5cGUuX19lbnN1cmVPd25lciA9IGZ1bmN0aW9uKG93bmVySUQpIHtcbiAgICAgIGlmIChvd25lcklEID09PSB0aGlzLl9fb3duZXJJRCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmICghb3duZXJJRCkge1xuICAgICAgICB0aGlzLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgICAgIHRoaXMuX19hbHRlcmVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ha2VNYXAodGhpcy5zaXplLCB0aGlzLl9yb290LCBvd25lcklELCB0aGlzLl9faGFzaCk7XG4gICAgfTtcblxuXG4gIGZ1bmN0aW9uIGlzTWFwKG1heWJlTWFwKSB7XG4gICAgcmV0dXJuICEhKG1heWJlTWFwICYmIG1heWJlTWFwW0lTX01BUF9TRU5USU5FTF0pO1xuICB9XG5cbiAgTWFwLmlzTWFwID0gaXNNYXA7XG5cbiAgdmFyIElTX01BUF9TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX01BUF9fQEAnO1xuXG4gIHZhciBNYXBQcm90b3R5cGUgPSBNYXAucHJvdG90eXBlO1xuICBNYXBQcm90b3R5cGVbSVNfTUFQX1NFTlRJTkVMXSA9IHRydWU7XG4gIE1hcFByb3RvdHlwZVtERUxFVEVdID0gTWFwUHJvdG90eXBlLnJlbW92ZTtcbiAgTWFwUHJvdG90eXBlLnJlbW92ZUluID0gTWFwUHJvdG90eXBlLmRlbGV0ZUluO1xuXG5cbiAgLy8gI3ByYWdtYSBUcmllIE5vZGVzXG5cblxuXG4gICAgZnVuY3Rpb24gQXJyYXlNYXBOb2RlKG93bmVySUQsIGVudHJpZXMpIHtcbiAgICAgIHRoaXMub3duZXJJRCA9IG93bmVySUQ7XG4gICAgICB0aGlzLmVudHJpZXMgPSBlbnRyaWVzO1xuICAgIH1cblxuICAgIEFycmF5TWFwTm9kZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oc2hpZnQsIGtleUhhc2gsIGtleSwgbm90U2V0VmFsdWUpIHtcbiAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuICAgICAgZm9yICh2YXIgaWkgPSAwLCBsZW4gPSBlbnRyaWVzLmxlbmd0aDsgaWkgPCBsZW47IGlpKyspIHtcbiAgICAgICAgaWYgKGlzKGtleSwgZW50cmllc1tpaV1bMF0pKSB7XG4gICAgICAgICAgcmV0dXJuIGVudHJpZXNbaWldWzFdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbm90U2V0VmFsdWU7XG4gICAgfTtcblxuICAgIEFycmF5TWFwTm9kZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24ob3duZXJJRCwgc2hpZnQsIGtleUhhc2gsIGtleSwgdmFsdWUsIGRpZENoYW5nZVNpemUsIGRpZEFsdGVyKSB7XG4gICAgICB2YXIgcmVtb3ZlZCA9IHZhbHVlID09PSBOT1RfU0VUO1xuXG4gICAgICB2YXIgZW50cmllcyA9IHRoaXMuZW50cmllcztcbiAgICAgIHZhciBpZHggPSAwO1xuICAgICAgZm9yICh2YXIgbGVuID0gZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgaWYgKGlzKGtleSwgZW50cmllc1tpZHhdWzBdKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgZXhpc3RzID0gaWR4IDwgbGVuO1xuXG4gICAgICBpZiAoZXhpc3RzID8gZW50cmllc1tpZHhdWzFdID09PSB2YWx1ZSA6IHJlbW92ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIFNldFJlZihkaWRBbHRlcik7XG4gICAgICAocmVtb3ZlZCB8fCAhZXhpc3RzKSAmJiBTZXRSZWYoZGlkQ2hhbmdlU2l6ZSk7XG5cbiAgICAgIGlmIChyZW1vdmVkICYmIGVudHJpZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybjsgLy8gdW5kZWZpbmVkXG4gICAgICB9XG5cbiAgICAgIGlmICghZXhpc3RzICYmICFyZW1vdmVkICYmIGVudHJpZXMubGVuZ3RoID49IE1BWF9BUlJBWV9NQVBfU0laRSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlTm9kZXMob3duZXJJRCwgZW50cmllcywga2V5LCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBpc0VkaXRhYmxlID0gb3duZXJJRCAmJiBvd25lcklEID09PSB0aGlzLm93bmVySUQ7XG4gICAgICB2YXIgbmV3RW50cmllcyA9IGlzRWRpdGFibGUgPyBlbnRyaWVzIDogYXJyQ29weShlbnRyaWVzKTtcblxuICAgICAgaWYgKGV4aXN0cykge1xuICAgICAgICBpZiAocmVtb3ZlZCkge1xuICAgICAgICAgIGlkeCA9PT0gbGVuIC0gMSA/IG5ld0VudHJpZXMucG9wKCkgOiAobmV3RW50cmllc1tpZHhdID0gbmV3RW50cmllcy5wb3AoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3RW50cmllc1tpZHhdID0gW2tleSwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdFbnRyaWVzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzRWRpdGFibGUpIHtcbiAgICAgICAgdGhpcy5lbnRyaWVzID0gbmV3RW50cmllcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgQXJyYXlNYXBOb2RlKG93bmVySUQsIG5ld0VudHJpZXMpO1xuICAgIH07XG5cblxuXG5cbiAgICBmdW5jdGlvbiBCaXRtYXBJbmRleGVkTm9kZShvd25lcklELCBiaXRtYXAsIG5vZGVzKSB7XG4gICAgICB0aGlzLm93bmVySUQgPSBvd25lcklEO1xuICAgICAgdGhpcy5iaXRtYXAgPSBiaXRtYXA7XG4gICAgICB0aGlzLm5vZGVzID0gbm9kZXM7XG4gICAgfVxuXG4gICAgQml0bWFwSW5kZXhlZE5vZGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKHNoaWZ0LCBrZXlIYXNoLCBrZXksIG5vdFNldFZhbHVlKSB7XG4gICAgICBpZiAoa2V5SGFzaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGtleUhhc2ggPSBoYXNoKGtleSk7XG4gICAgICB9XG4gICAgICB2YXIgYml0ID0gKDEgPDwgKChzaGlmdCA9PT0gMCA/IGtleUhhc2ggOiBrZXlIYXNoID4+PiBzaGlmdCkgJiBNQVNLKSk7XG4gICAgICB2YXIgYml0bWFwID0gdGhpcy5iaXRtYXA7XG4gICAgICByZXR1cm4gKGJpdG1hcCAmIGJpdCkgPT09IDAgPyBub3RTZXRWYWx1ZSA6XG4gICAgICAgIHRoaXMubm9kZXNbcG9wQ291bnQoYml0bWFwICYgKGJpdCAtIDEpKV0uZ2V0KHNoaWZ0ICsgU0hJRlQsIGtleUhhc2gsIGtleSwgbm90U2V0VmFsdWUpO1xuICAgIH07XG5cbiAgICBCaXRtYXBJbmRleGVkTm9kZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24ob3duZXJJRCwgc2hpZnQsIGtleUhhc2gsIGtleSwgdmFsdWUsIGRpZENoYW5nZVNpemUsIGRpZEFsdGVyKSB7XG4gICAgICBpZiAoa2V5SGFzaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGtleUhhc2ggPSBoYXNoKGtleSk7XG4gICAgICB9XG4gICAgICB2YXIga2V5SGFzaEZyYWcgPSAoc2hpZnQgPT09IDAgPyBrZXlIYXNoIDoga2V5SGFzaCA+Pj4gc2hpZnQpICYgTUFTSztcbiAgICAgIHZhciBiaXQgPSAxIDw8IGtleUhhc2hGcmFnO1xuICAgICAgdmFyIGJpdG1hcCA9IHRoaXMuYml0bWFwO1xuICAgICAgdmFyIGV4aXN0cyA9IChiaXRtYXAgJiBiaXQpICE9PSAwO1xuXG4gICAgICBpZiAoIWV4aXN0cyAmJiB2YWx1ZSA9PT0gTk9UX1NFVCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIGlkeCA9IHBvcENvdW50KGJpdG1hcCAmIChiaXQgLSAxKSk7XG4gICAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzO1xuICAgICAgdmFyIG5vZGUgPSBleGlzdHMgPyBub2Rlc1tpZHhdIDogdW5kZWZpbmVkO1xuICAgICAgdmFyIG5ld05vZGUgPSB1cGRhdGVOb2RlKG5vZGUsIG93bmVySUQsIHNoaWZ0ICsgU0hJRlQsIGtleUhhc2gsIGtleSwgdmFsdWUsIGRpZENoYW5nZVNpemUsIGRpZEFsdGVyKTtcblxuICAgICAgaWYgKG5ld05vZGUgPT09IG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIGlmICghZXhpc3RzICYmIG5ld05vZGUgJiYgbm9kZXMubGVuZ3RoID49IE1BWF9CSVRNQVBfSU5ERVhFRF9TSVpFKSB7XG4gICAgICAgIHJldHVybiBleHBhbmROb2Rlcyhvd25lcklELCBub2RlcywgYml0bWFwLCBrZXlIYXNoRnJhZywgbmV3Tm9kZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChleGlzdHMgJiYgIW5ld05vZGUgJiYgbm9kZXMubGVuZ3RoID09PSAyICYmIGlzTGVhZk5vZGUobm9kZXNbaWR4IF4gMV0pKSB7XG4gICAgICAgIHJldHVybiBub2Rlc1tpZHggXiAxXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV4aXN0cyAmJiBuZXdOb2RlICYmIG5vZGVzLmxlbmd0aCA9PT0gMSAmJiBpc0xlYWZOb2RlKG5ld05vZGUpKSB7XG4gICAgICAgIHJldHVybiBuZXdOb2RlO1xuICAgICAgfVxuXG4gICAgICB2YXIgaXNFZGl0YWJsZSA9IG93bmVySUQgJiYgb3duZXJJRCA9PT0gdGhpcy5vd25lcklEO1xuICAgICAgdmFyIG5ld0JpdG1hcCA9IGV4aXN0cyA/IG5ld05vZGUgPyBiaXRtYXAgOiBiaXRtYXAgXiBiaXQgOiBiaXRtYXAgfCBiaXQ7XG4gICAgICB2YXIgbmV3Tm9kZXMgPSBleGlzdHMgPyBuZXdOb2RlID9cbiAgICAgICAgc2V0SW4obm9kZXMsIGlkeCwgbmV3Tm9kZSwgaXNFZGl0YWJsZSkgOlxuICAgICAgICBzcGxpY2VPdXQobm9kZXMsIGlkeCwgaXNFZGl0YWJsZSkgOlxuICAgICAgICBzcGxpY2VJbihub2RlcywgaWR4LCBuZXdOb2RlLCBpc0VkaXRhYmxlKTtcblxuICAgICAgaWYgKGlzRWRpdGFibGUpIHtcbiAgICAgICAgdGhpcy5iaXRtYXAgPSBuZXdCaXRtYXA7XG4gICAgICAgIHRoaXMubm9kZXMgPSBuZXdOb2RlcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgQml0bWFwSW5kZXhlZE5vZGUob3duZXJJRCwgbmV3Qml0bWFwLCBuZXdOb2Rlcyk7XG4gICAgfTtcblxuXG5cblxuICAgIGZ1bmN0aW9uIEhhc2hBcnJheU1hcE5vZGUob3duZXJJRCwgY291bnQsIG5vZGVzKSB7XG4gICAgICB0aGlzLm93bmVySUQgPSBvd25lcklEO1xuICAgICAgdGhpcy5jb3VudCA9IGNvdW50O1xuICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzO1xuICAgIH1cblxuICAgIEhhc2hBcnJheU1hcE5vZGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKHNoaWZ0LCBrZXlIYXNoLCBrZXksIG5vdFNldFZhbHVlKSB7XG4gICAgICBpZiAoa2V5SGFzaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGtleUhhc2ggPSBoYXNoKGtleSk7XG4gICAgICB9XG4gICAgICB2YXIgaWR4ID0gKHNoaWZ0ID09PSAwID8ga2V5SGFzaCA6IGtleUhhc2ggPj4+IHNoaWZ0KSAmIE1BU0s7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMubm9kZXNbaWR4XTtcbiAgICAgIHJldHVybiBub2RlID8gbm9kZS5nZXQoc2hpZnQgKyBTSElGVCwga2V5SGFzaCwga2V5LCBub3RTZXRWYWx1ZSkgOiBub3RTZXRWYWx1ZTtcbiAgICB9O1xuXG4gICAgSGFzaEFycmF5TWFwTm9kZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24ob3duZXJJRCwgc2hpZnQsIGtleUhhc2gsIGtleSwgdmFsdWUsIGRpZENoYW5nZVNpemUsIGRpZEFsdGVyKSB7XG4gICAgICBpZiAoa2V5SGFzaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGtleUhhc2ggPSBoYXNoKGtleSk7XG4gICAgICB9XG4gICAgICB2YXIgaWR4ID0gKHNoaWZ0ID09PSAwID8ga2V5SGFzaCA6IGtleUhhc2ggPj4+IHNoaWZ0KSAmIE1BU0s7XG4gICAgICB2YXIgcmVtb3ZlZCA9IHZhbHVlID09PSBOT1RfU0VUO1xuICAgICAgdmFyIG5vZGVzID0gdGhpcy5ub2RlcztcbiAgICAgIHZhciBub2RlID0gbm9kZXNbaWR4XTtcblxuICAgICAgaWYgKHJlbW92ZWQgJiYgIW5vZGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIHZhciBuZXdOb2RlID0gdXBkYXRlTm9kZShub2RlLCBvd25lcklELCBzaGlmdCArIFNISUZULCBrZXlIYXNoLCBrZXksIHZhbHVlLCBkaWRDaGFuZ2VTaXplLCBkaWRBbHRlcik7XG4gICAgICBpZiAobmV3Tm9kZSA9PT0gbm9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld0NvdW50ID0gdGhpcy5jb3VudDtcbiAgICAgIGlmICghbm9kZSkge1xuICAgICAgICBuZXdDb3VudCsrO1xuICAgICAgfSBlbHNlIGlmICghbmV3Tm9kZSkge1xuICAgICAgICBuZXdDb3VudC0tO1xuICAgICAgICBpZiAobmV3Q291bnQgPCBNSU5fSEFTSF9BUlJBWV9NQVBfU0laRSkge1xuICAgICAgICAgIHJldHVybiBwYWNrTm9kZXMob3duZXJJRCwgbm9kZXMsIG5ld0NvdW50LCBpZHgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBpc0VkaXRhYmxlID0gb3duZXJJRCAmJiBvd25lcklEID09PSB0aGlzLm93bmVySUQ7XG4gICAgICB2YXIgbmV3Tm9kZXMgPSBzZXRJbihub2RlcywgaWR4LCBuZXdOb2RlLCBpc0VkaXRhYmxlKTtcblxuICAgICAgaWYgKGlzRWRpdGFibGUpIHtcbiAgICAgICAgdGhpcy5jb3VudCA9IG5ld0NvdW50O1xuICAgICAgICB0aGlzLm5vZGVzID0gbmV3Tm9kZXM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEhhc2hBcnJheU1hcE5vZGUob3duZXJJRCwgbmV3Q291bnQsIG5ld05vZGVzKTtcbiAgICB9O1xuXG5cblxuXG4gICAgZnVuY3Rpb24gSGFzaENvbGxpc2lvbk5vZGUob3duZXJJRCwga2V5SGFzaCwgZW50cmllcykge1xuICAgICAgdGhpcy5vd25lcklEID0gb3duZXJJRDtcbiAgICAgIHRoaXMua2V5SGFzaCA9IGtleUhhc2g7XG4gICAgICB0aGlzLmVudHJpZXMgPSBlbnRyaWVzO1xuICAgIH1cblxuICAgIEhhc2hDb2xsaXNpb25Ob2RlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihzaGlmdCwga2V5SGFzaCwga2V5LCBub3RTZXRWYWx1ZSkge1xuICAgICAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG4gICAgICBmb3IgKHZhciBpaSA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpaSA8IGxlbjsgaWkrKykge1xuICAgICAgICBpZiAoaXMoa2V5LCBlbnRyaWVzW2lpXVswXSkpIHtcbiAgICAgICAgICByZXR1cm4gZW50cmllc1tpaV1bMV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBub3RTZXRWYWx1ZTtcbiAgICB9O1xuXG4gICAgSGFzaENvbGxpc2lvbk5vZGUucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKG93bmVySUQsIHNoaWZ0LCBrZXlIYXNoLCBrZXksIHZhbHVlLCBkaWRDaGFuZ2VTaXplLCBkaWRBbHRlcikge1xuICAgICAgaWYgKGtleUhhc2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBrZXlIYXNoID0gaGFzaChrZXkpO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVtb3ZlZCA9IHZhbHVlID09PSBOT1RfU0VUO1xuXG4gICAgICBpZiAoa2V5SGFzaCAhPT0gdGhpcy5rZXlIYXNoKSB7XG4gICAgICAgIGlmIChyZW1vdmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgU2V0UmVmKGRpZEFsdGVyKTtcbiAgICAgICAgU2V0UmVmKGRpZENoYW5nZVNpemUpO1xuICAgICAgICByZXR1cm4gbWVyZ2VJbnRvTm9kZSh0aGlzLCBvd25lcklELCBzaGlmdCwga2V5SGFzaCwgW2tleSwgdmFsdWVdKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG4gICAgICB2YXIgaWR4ID0gMDtcbiAgICAgIGZvciAodmFyIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpZHggPCBsZW47IGlkeCsrKSB7XG4gICAgICAgIGlmIChpcyhrZXksIGVudHJpZXNbaWR4XVswXSkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGV4aXN0cyA9IGlkeCA8IGxlbjtcblxuICAgICAgaWYgKGV4aXN0cyA/IGVudHJpZXNbaWR4XVsxXSA9PT0gdmFsdWUgOiByZW1vdmVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICBTZXRSZWYoZGlkQWx0ZXIpO1xuICAgICAgKHJlbW92ZWQgfHwgIWV4aXN0cykgJiYgU2V0UmVmKGRpZENoYW5nZVNpemUpO1xuXG4gICAgICBpZiAocmVtb3ZlZCAmJiBsZW4gPT09IDIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZU5vZGUob3duZXJJRCwgdGhpcy5rZXlIYXNoLCBlbnRyaWVzW2lkeCBeIDFdKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGlzRWRpdGFibGUgPSBvd25lcklEICYmIG93bmVySUQgPT09IHRoaXMub3duZXJJRDtcbiAgICAgIHZhciBuZXdFbnRyaWVzID0gaXNFZGl0YWJsZSA/IGVudHJpZXMgOiBhcnJDb3B5KGVudHJpZXMpO1xuXG4gICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgIGlmIChyZW1vdmVkKSB7XG4gICAgICAgICAgaWR4ID09PSBsZW4gLSAxID8gbmV3RW50cmllcy5wb3AoKSA6IChuZXdFbnRyaWVzW2lkeF0gPSBuZXdFbnRyaWVzLnBvcCgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdFbnRyaWVzW2lkeF0gPSBba2V5LCB2YWx1ZV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld0VudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNFZGl0YWJsZSkge1xuICAgICAgICB0aGlzLmVudHJpZXMgPSBuZXdFbnRyaWVzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBIYXNoQ29sbGlzaW9uTm9kZShvd25lcklELCB0aGlzLmtleUhhc2gsIG5ld0VudHJpZXMpO1xuICAgIH07XG5cblxuXG5cbiAgICBmdW5jdGlvbiBWYWx1ZU5vZGUob3duZXJJRCwga2V5SGFzaCwgZW50cnkpIHtcbiAgICAgIHRoaXMub3duZXJJRCA9IG93bmVySUQ7XG4gICAgICB0aGlzLmtleUhhc2ggPSBrZXlIYXNoO1xuICAgICAgdGhpcy5lbnRyeSA9IGVudHJ5O1xuICAgIH1cblxuICAgIFZhbHVlTm9kZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oc2hpZnQsIGtleUhhc2gsIGtleSwgbm90U2V0VmFsdWUpIHtcbiAgICAgIHJldHVybiBpcyhrZXksIHRoaXMuZW50cnlbMF0pID8gdGhpcy5lbnRyeVsxXSA6IG5vdFNldFZhbHVlO1xuICAgIH07XG5cbiAgICBWYWx1ZU5vZGUucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKG93bmVySUQsIHNoaWZ0LCBrZXlIYXNoLCBrZXksIHZhbHVlLCBkaWRDaGFuZ2VTaXplLCBkaWRBbHRlcikge1xuICAgICAgdmFyIHJlbW92ZWQgPSB2YWx1ZSA9PT0gTk9UX1NFVDtcbiAgICAgIHZhciBrZXlNYXRjaCA9IGlzKGtleSwgdGhpcy5lbnRyeVswXSk7XG4gICAgICBpZiAoa2V5TWF0Y2ggPyB2YWx1ZSA9PT0gdGhpcy5lbnRyeVsxXSA6IHJlbW92ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIFNldFJlZihkaWRBbHRlcik7XG5cbiAgICAgIGlmIChyZW1vdmVkKSB7XG4gICAgICAgIFNldFJlZihkaWRDaGFuZ2VTaXplKTtcbiAgICAgICAgcmV0dXJuOyAvLyB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgaWYgKGtleU1hdGNoKSB7XG4gICAgICAgIGlmIChvd25lcklEICYmIG93bmVySUQgPT09IHRoaXMub3duZXJJRCkge1xuICAgICAgICAgIHRoaXMuZW50cnlbMV0gPSB2YWx1ZTtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFZhbHVlTm9kZShvd25lcklELCB0aGlzLmtleUhhc2gsIFtrZXksIHZhbHVlXSk7XG4gICAgICB9XG5cbiAgICAgIFNldFJlZihkaWRDaGFuZ2VTaXplKTtcbiAgICAgIHJldHVybiBtZXJnZUludG9Ob2RlKHRoaXMsIG93bmVySUQsIHNoaWZ0LCBoYXNoKGtleSksIFtrZXksIHZhbHVlXSk7XG4gICAgfTtcblxuXG5cbiAgLy8gI3ByYWdtYSBJdGVyYXRvcnNcblxuICBBcnJheU1hcE5vZGUucHJvdG90eXBlLml0ZXJhdGUgPVxuICBIYXNoQ29sbGlzaW9uTm9kZS5wcm90b3R5cGUuaXRlcmF0ZSA9IGZ1bmN0aW9uIChmbiwgcmV2ZXJzZSkge1xuICAgIHZhciBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuICAgIGZvciAodmFyIGlpID0gMCwgbWF4SW5kZXggPSBlbnRyaWVzLmxlbmd0aCAtIDE7IGlpIDw9IG1heEluZGV4OyBpaSsrKSB7XG4gICAgICBpZiAoZm4oZW50cmllc1tyZXZlcnNlID8gbWF4SW5kZXggLSBpaSA6IGlpXSkgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBCaXRtYXBJbmRleGVkTm9kZS5wcm90b3R5cGUuaXRlcmF0ZSA9XG4gIEhhc2hBcnJheU1hcE5vZGUucHJvdG90eXBlLml0ZXJhdGUgPSBmdW5jdGlvbiAoZm4sIHJldmVyc2UpIHtcbiAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzO1xuICAgIGZvciAodmFyIGlpID0gMCwgbWF4SW5kZXggPSBub2Rlcy5sZW5ndGggLSAxOyBpaSA8PSBtYXhJbmRleDsgaWkrKykge1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tyZXZlcnNlID8gbWF4SW5kZXggLSBpaSA6IGlpXTtcbiAgICAgIGlmIChub2RlICYmIG5vZGUuaXRlcmF0ZShmbiwgcmV2ZXJzZSkgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBWYWx1ZU5vZGUucHJvdG90eXBlLml0ZXJhdGUgPSBmdW5jdGlvbiAoZm4sIHJldmVyc2UpIHtcbiAgICByZXR1cm4gZm4odGhpcy5lbnRyeSk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhNYXBJdGVyYXRvciwgSXRlcmF0b3IpO1xuXG4gICAgZnVuY3Rpb24gTWFwSXRlcmF0b3IobWFwLCB0eXBlLCByZXZlcnNlKSB7XG4gICAgICB0aGlzLl90eXBlID0gdHlwZTtcbiAgICAgIHRoaXMuX3JldmVyc2UgPSByZXZlcnNlO1xuICAgICAgdGhpcy5fc3RhY2sgPSBtYXAuX3Jvb3QgJiYgbWFwSXRlcmF0b3JGcmFtZShtYXAuX3Jvb3QpO1xuICAgIH1cblxuICAgIE1hcEl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdHlwZSA9IHRoaXMuX3R5cGU7XG4gICAgICB2YXIgc3RhY2sgPSB0aGlzLl9zdGFjaztcbiAgICAgIHdoaWxlIChzdGFjaykge1xuICAgICAgICB2YXIgbm9kZSA9IHN0YWNrLm5vZGU7XG4gICAgICAgIHZhciBpbmRleCA9IHN0YWNrLmluZGV4Kys7XG4gICAgICAgIHZhciBtYXhJbmRleDtcbiAgICAgICAgaWYgKG5vZGUuZW50cnkpIHtcbiAgICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBtYXBJdGVyYXRvclZhbHVlKHR5cGUsIG5vZGUuZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlLmVudHJpZXMpIHtcbiAgICAgICAgICBtYXhJbmRleCA9IG5vZGUuZW50cmllcy5sZW5ndGggLSAxO1xuICAgICAgICAgIGlmIChpbmRleCA8PSBtYXhJbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcEl0ZXJhdG9yVmFsdWUodHlwZSwgbm9kZS5lbnRyaWVzW3RoaXMuX3JldmVyc2UgPyBtYXhJbmRleCAtIGluZGV4IDogaW5kZXhdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWF4SW5kZXggPSBub2RlLm5vZGVzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgaWYgKGluZGV4IDw9IG1heEluZGV4KSB7XG4gICAgICAgICAgICB2YXIgc3ViTm9kZSA9IG5vZGUubm9kZXNbdGhpcy5fcmV2ZXJzZSA/IG1heEluZGV4IC0gaW5kZXggOiBpbmRleF07XG4gICAgICAgICAgICBpZiAoc3ViTm9kZSkge1xuICAgICAgICAgICAgICBpZiAoc3ViTm9kZS5lbnRyeSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXBJdGVyYXRvclZhbHVlKHR5cGUsIHN1Yk5vZGUuZW50cnkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHN0YWNrID0gdGhpcy5fc3RhY2sgPSBtYXBJdGVyYXRvckZyYW1lKHN1Yk5vZGUsIHN0YWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzdGFjayA9IHRoaXMuX3N0YWNrID0gdGhpcy5fc3RhY2suX19wcmV2O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZXJhdG9yRG9uZSgpO1xuICAgIH07XG5cblxuICBmdW5jdGlvbiBtYXBJdGVyYXRvclZhbHVlKHR5cGUsIGVudHJ5KSB7XG4gICAgcmV0dXJuIGl0ZXJhdG9yVmFsdWUodHlwZSwgZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1hcEl0ZXJhdG9yRnJhbWUobm9kZSwgcHJldikge1xuICAgIHJldHVybiB7XG4gICAgICBub2RlOiBub2RlLFxuICAgICAgaW5kZXg6IDAsXG4gICAgICBfX3ByZXY6IHByZXZcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gbWFrZU1hcChzaXplLCByb290LCBvd25lcklELCBoYXNoKSB7XG4gICAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUoTWFwUHJvdG90eXBlKTtcbiAgICBtYXAuc2l6ZSA9IHNpemU7XG4gICAgbWFwLl9yb290ID0gcm9vdDtcbiAgICBtYXAuX19vd25lcklEID0gb3duZXJJRDtcbiAgICBtYXAuX19oYXNoID0gaGFzaDtcbiAgICBtYXAuX19hbHRlcmVkID0gZmFsc2U7XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIHZhciBFTVBUWV9NQVA7XG4gIGZ1bmN0aW9uIGVtcHR5TWFwKCkge1xuICAgIHJldHVybiBFTVBUWV9NQVAgfHwgKEVNUFRZX01BUCA9IG1ha2VNYXAoMCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlTWFwKG1hcCwgaywgdikge1xuICAgIHZhciBuZXdSb290O1xuICAgIHZhciBuZXdTaXplO1xuICAgIGlmICghbWFwLl9yb290KSB7XG4gICAgICBpZiAodiA9PT0gTk9UX1NFVCkge1xuICAgICAgICByZXR1cm4gbWFwO1xuICAgICAgfVxuICAgICAgbmV3U2l6ZSA9IDE7XG4gICAgICBuZXdSb290ID0gbmV3IEFycmF5TWFwTm9kZShtYXAuX19vd25lcklELCBbW2ssIHZdXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBkaWRDaGFuZ2VTaXplID0gTWFrZVJlZihDSEFOR0VfTEVOR1RIKTtcbiAgICAgIHZhciBkaWRBbHRlciA9IE1ha2VSZWYoRElEX0FMVEVSKTtcbiAgICAgIG5ld1Jvb3QgPSB1cGRhdGVOb2RlKG1hcC5fcm9vdCwgbWFwLl9fb3duZXJJRCwgMCwgdW5kZWZpbmVkLCBrLCB2LCBkaWRDaGFuZ2VTaXplLCBkaWRBbHRlcik7XG4gICAgICBpZiAoIWRpZEFsdGVyLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgICB9XG4gICAgICBuZXdTaXplID0gbWFwLnNpemUgKyAoZGlkQ2hhbmdlU2l6ZS52YWx1ZSA/IHYgPT09IE5PVF9TRVQgPyAtMSA6IDEgOiAwKTtcbiAgICB9XG4gICAgaWYgKG1hcC5fX293bmVySUQpIHtcbiAgICAgIG1hcC5zaXplID0gbmV3U2l6ZTtcbiAgICAgIG1hcC5fcm9vdCA9IG5ld1Jvb3Q7XG4gICAgICBtYXAuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgICAgbWFwLl9fYWx0ZXJlZCA9IHRydWU7XG4gICAgICByZXR1cm4gbWFwO1xuICAgIH1cbiAgICByZXR1cm4gbmV3Um9vdCA/IG1ha2VNYXAobmV3U2l6ZSwgbmV3Um9vdCkgOiBlbXB0eU1hcCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlTm9kZShub2RlLCBvd25lcklELCBzaGlmdCwga2V5SGFzaCwga2V5LCB2YWx1ZSwgZGlkQ2hhbmdlU2l6ZSwgZGlkQWx0ZXIpIHtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gTk9UX1NFVCkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cbiAgICAgIFNldFJlZihkaWRBbHRlcik7XG4gICAgICBTZXRSZWYoZGlkQ2hhbmdlU2l6ZSk7XG4gICAgICByZXR1cm4gbmV3IFZhbHVlTm9kZShvd25lcklELCBrZXlIYXNoLCBba2V5LCB2YWx1ZV0pO1xuICAgIH1cbiAgICByZXR1cm4gbm9kZS51cGRhdGUob3duZXJJRCwgc2hpZnQsIGtleUhhc2gsIGtleSwgdmFsdWUsIGRpZENoYW5nZVNpemUsIGRpZEFsdGVyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzTGVhZk5vZGUobm9kZSkge1xuICAgIHJldHVybiBub2RlLmNvbnN0cnVjdG9yID09PSBWYWx1ZU5vZGUgfHwgbm9kZS5jb25zdHJ1Y3RvciA9PT0gSGFzaENvbGxpc2lvbk5vZGU7XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZUludG9Ob2RlKG5vZGUsIG93bmVySUQsIHNoaWZ0LCBrZXlIYXNoLCBlbnRyeSkge1xuICAgIGlmIChub2RlLmtleUhhc2ggPT09IGtleUhhc2gpIHtcbiAgICAgIHJldHVybiBuZXcgSGFzaENvbGxpc2lvbk5vZGUob3duZXJJRCwga2V5SGFzaCwgW25vZGUuZW50cnksIGVudHJ5XSk7XG4gICAgfVxuXG4gICAgdmFyIGlkeDEgPSAoc2hpZnQgPT09IDAgPyBub2RlLmtleUhhc2ggOiBub2RlLmtleUhhc2ggPj4+IHNoaWZ0KSAmIE1BU0s7XG4gICAgdmFyIGlkeDIgPSAoc2hpZnQgPT09IDAgPyBrZXlIYXNoIDoga2V5SGFzaCA+Pj4gc2hpZnQpICYgTUFTSztcblxuICAgIHZhciBuZXdOb2RlO1xuICAgIHZhciBub2RlcyA9IGlkeDEgPT09IGlkeDIgP1xuICAgICAgW21lcmdlSW50b05vZGUobm9kZSwgb3duZXJJRCwgc2hpZnQgKyBTSElGVCwga2V5SGFzaCwgZW50cnkpXSA6XG4gICAgICAoKG5ld05vZGUgPSBuZXcgVmFsdWVOb2RlKG93bmVySUQsIGtleUhhc2gsIGVudHJ5KSksIGlkeDEgPCBpZHgyID8gW25vZGUsIG5ld05vZGVdIDogW25ld05vZGUsIG5vZGVdKTtcblxuICAgIHJldHVybiBuZXcgQml0bWFwSW5kZXhlZE5vZGUob3duZXJJRCwgKDEgPDwgaWR4MSkgfCAoMSA8PCBpZHgyKSwgbm9kZXMpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlTm9kZXMob3duZXJJRCwgZW50cmllcywga2V5LCB2YWx1ZSkge1xuICAgIGlmICghb3duZXJJRCkge1xuICAgICAgb3duZXJJRCA9IG5ldyBPd25lcklEKCk7XG4gICAgfVxuICAgIHZhciBub2RlID0gbmV3IFZhbHVlTm9kZShvd25lcklELCBoYXNoKGtleSksIFtrZXksIHZhbHVlXSk7XG4gICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGVudHJpZXMubGVuZ3RoOyBpaSsrKSB7XG4gICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2lpXTtcbiAgICAgIG5vZGUgPSBub2RlLnVwZGF0ZShvd25lcklELCAwLCB1bmRlZmluZWQsIGVudHJ5WzBdLCBlbnRyeVsxXSk7XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgZnVuY3Rpb24gcGFja05vZGVzKG93bmVySUQsIG5vZGVzLCBjb3VudCwgZXhjbHVkaW5nKSB7XG4gICAgdmFyIGJpdG1hcCA9IDA7XG4gICAgdmFyIHBhY2tlZElJID0gMDtcbiAgICB2YXIgcGFja2VkTm9kZXMgPSBuZXcgQXJyYXkoY291bnQpO1xuICAgIGZvciAodmFyIGlpID0gMCwgYml0ID0gMSwgbGVuID0gbm9kZXMubGVuZ3RoOyBpaSA8IGxlbjsgaWkrKywgYml0IDw8PSAxKSB7XG4gICAgICB2YXIgbm9kZSA9IG5vZGVzW2lpXTtcbiAgICAgIGlmIChub2RlICE9PSB1bmRlZmluZWQgJiYgaWkgIT09IGV4Y2x1ZGluZykge1xuICAgICAgICBiaXRtYXAgfD0gYml0O1xuICAgICAgICBwYWNrZWROb2Rlc1twYWNrZWRJSSsrXSA9IG5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgQml0bWFwSW5kZXhlZE5vZGUob3duZXJJRCwgYml0bWFwLCBwYWNrZWROb2Rlcyk7XG4gIH1cblxuICBmdW5jdGlvbiBleHBhbmROb2Rlcyhvd25lcklELCBub2RlcywgYml0bWFwLCBpbmNsdWRpbmcsIG5vZGUpIHtcbiAgICB2YXIgY291bnQgPSAwO1xuICAgIHZhciBleHBhbmRlZE5vZGVzID0gbmV3IEFycmF5KFNJWkUpO1xuICAgIGZvciAodmFyIGlpID0gMDsgYml0bWFwICE9PSAwOyBpaSsrLCBiaXRtYXAgPj4+PSAxKSB7XG4gICAgICBleHBhbmRlZE5vZGVzW2lpXSA9IGJpdG1hcCAmIDEgPyBub2Rlc1tjb3VudCsrXSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZXhwYW5kZWROb2Rlc1tpbmNsdWRpbmddID0gbm9kZTtcbiAgICByZXR1cm4gbmV3IEhhc2hBcnJheU1hcE5vZGUob3duZXJJRCwgY291bnQgKyAxLCBleHBhbmRlZE5vZGVzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlSW50b01hcFdpdGgobWFwLCBtZXJnZXIsIGl0ZXJhYmxlcykge1xuICAgIHZhciBpdGVycyA9IFtdO1xuICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCBpdGVyYWJsZXMubGVuZ3RoOyBpaSsrKSB7XG4gICAgICB2YXIgdmFsdWUgPSBpdGVyYWJsZXNbaWldO1xuICAgICAgdmFyIGl0ZXIgPSBLZXllZEl0ZXJhYmxlKHZhbHVlKTtcbiAgICAgIGlmICghaXNJdGVyYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgaXRlciA9IGl0ZXIubWFwKGZ1bmN0aW9uKHYgKSB7cmV0dXJuIGZyb21KUyh2KX0pO1xuICAgICAgfVxuICAgICAgaXRlcnMucHVzaChpdGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlSW50b0NvbGxlY3Rpb25XaXRoKG1hcCwgbWVyZ2VyLCBpdGVycyk7XG4gIH1cblxuICBmdW5jdGlvbiBkZWVwTWVyZ2VyKGV4aXN0aW5nLCB2YWx1ZSwga2V5KSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nICYmIGV4aXN0aW5nLm1lcmdlRGVlcCAmJiBpc0l0ZXJhYmxlKHZhbHVlKSA/XG4gICAgICBleGlzdGluZy5tZXJnZURlZXAodmFsdWUpIDpcbiAgICAgIGlzKGV4aXN0aW5nLCB2YWx1ZSkgPyBleGlzdGluZyA6IHZhbHVlO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVlcE1lcmdlcldpdGgobWVyZ2VyKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGV4aXN0aW5nLCB2YWx1ZSwga2V5KSAge1xuICAgICAgaWYgKGV4aXN0aW5nICYmIGV4aXN0aW5nLm1lcmdlRGVlcFdpdGggJiYgaXNJdGVyYWJsZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIGV4aXN0aW5nLm1lcmdlRGVlcFdpdGgobWVyZ2VyLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICB2YXIgbmV4dFZhbHVlID0gbWVyZ2VyKGV4aXN0aW5nLCB2YWx1ZSwga2V5KTtcbiAgICAgIHJldHVybiBpcyhleGlzdGluZywgbmV4dFZhbHVlKSA/IGV4aXN0aW5nIDogbmV4dFZhbHVlO1xuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZUludG9Db2xsZWN0aW9uV2l0aChjb2xsZWN0aW9uLCBtZXJnZXIsIGl0ZXJzKSB7XG4gICAgaXRlcnMgPSBpdGVycy5maWx0ZXIoZnVuY3Rpb24oeCApIHtyZXR1cm4geC5zaXplICE9PSAwfSk7XG4gICAgaWYgKGl0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNvbGxlY3Rpb247XG4gICAgfVxuICAgIGlmIChjb2xsZWN0aW9uLnNpemUgPT09IDAgJiYgIWNvbGxlY3Rpb24uX19vd25lcklEICYmIGl0ZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uY29uc3RydWN0b3IoaXRlcnNbMF0pO1xuICAgIH1cbiAgICByZXR1cm4gY29sbGVjdGlvbi53aXRoTXV0YXRpb25zKGZ1bmN0aW9uKGNvbGxlY3Rpb24gKSB7XG4gICAgICB2YXIgbWVyZ2VJbnRvTWFwID0gbWVyZ2VyID9cbiAgICAgICAgZnVuY3Rpb24odmFsdWUsIGtleSkgIHtcbiAgICAgICAgICBjb2xsZWN0aW9uLnVwZGF0ZShrZXksIE5PVF9TRVQsIGZ1bmN0aW9uKGV4aXN0aW5nIClcbiAgICAgICAgICAgIHtyZXR1cm4gZXhpc3RpbmcgPT09IE5PVF9TRVQgPyB2YWx1ZSA6IG1lcmdlcihleGlzdGluZywgdmFsdWUsIGtleSl9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSA6XG4gICAgICAgIGZ1bmN0aW9uKHZhbHVlLCBrZXkpICB7XG4gICAgICAgICAgY29sbGVjdGlvbi5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCBpdGVycy5sZW5ndGg7IGlpKyspIHtcbiAgICAgICAgaXRlcnNbaWldLmZvckVhY2gobWVyZ2VJbnRvTWFwKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUluRGVlcE1hcChleGlzdGluZywga2V5UGF0aEl0ZXIsIG5vdFNldFZhbHVlLCB1cGRhdGVyKSB7XG4gICAgdmFyIGlzTm90U2V0ID0gZXhpc3RpbmcgPT09IE5PVF9TRVQ7XG4gICAgdmFyIHN0ZXAgPSBrZXlQYXRoSXRlci5uZXh0KCk7XG4gICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgdmFyIGV4aXN0aW5nVmFsdWUgPSBpc05vdFNldCA/IG5vdFNldFZhbHVlIDogZXhpc3Rpbmc7XG4gICAgICB2YXIgbmV3VmFsdWUgPSB1cGRhdGVyKGV4aXN0aW5nVmFsdWUpO1xuICAgICAgcmV0dXJuIG5ld1ZhbHVlID09PSBleGlzdGluZ1ZhbHVlID8gZXhpc3RpbmcgOiBuZXdWYWx1ZTtcbiAgICB9XG4gICAgaW52YXJpYW50KFxuICAgICAgaXNOb3RTZXQgfHwgKGV4aXN0aW5nICYmIGV4aXN0aW5nLnNldCksXG4gICAgICAnaW52YWxpZCBrZXlQYXRoJ1xuICAgICk7XG4gICAgdmFyIGtleSA9IHN0ZXAudmFsdWU7XG4gICAgdmFyIG5leHRFeGlzdGluZyA9IGlzTm90U2V0ID8gTk9UX1NFVCA6IGV4aXN0aW5nLmdldChrZXksIE5PVF9TRVQpO1xuICAgIHZhciBuZXh0VXBkYXRlZCA9IHVwZGF0ZUluRGVlcE1hcChcbiAgICAgIG5leHRFeGlzdGluZyxcbiAgICAgIGtleVBhdGhJdGVyLFxuICAgICAgbm90U2V0VmFsdWUsXG4gICAgICB1cGRhdGVyXG4gICAgKTtcbiAgICByZXR1cm4gbmV4dFVwZGF0ZWQgPT09IG5leHRFeGlzdGluZyA/IGV4aXN0aW5nIDpcbiAgICAgIG5leHRVcGRhdGVkID09PSBOT1RfU0VUID8gZXhpc3RpbmcucmVtb3ZlKGtleSkgOlxuICAgICAgKGlzTm90U2V0ID8gZW1wdHlNYXAoKSA6IGV4aXN0aW5nKS5zZXQoa2V5LCBuZXh0VXBkYXRlZCk7XG4gIH1cblxuICBmdW5jdGlvbiBwb3BDb3VudCh4KSB7XG4gICAgeCA9IHggLSAoKHggPj4gMSkgJiAweDU1NTU1NTU1KTtcbiAgICB4ID0gKHggJiAweDMzMzMzMzMzKSArICgoeCA+PiAyKSAmIDB4MzMzMzMzMzMpO1xuICAgIHggPSAoeCArICh4ID4+IDQpKSAmIDB4MGYwZjBmMGY7XG4gICAgeCA9IHggKyAoeCA+PiA4KTtcbiAgICB4ID0geCArICh4ID4+IDE2KTtcbiAgICByZXR1cm4geCAmIDB4N2Y7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRJbihhcnJheSwgaWR4LCB2YWwsIGNhbkVkaXQpIHtcbiAgICB2YXIgbmV3QXJyYXkgPSBjYW5FZGl0ID8gYXJyYXkgOiBhcnJDb3B5KGFycmF5KTtcbiAgICBuZXdBcnJheVtpZHhdID0gdmFsO1xuICAgIHJldHVybiBuZXdBcnJheTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNwbGljZUluKGFycmF5LCBpZHgsIHZhbCwgY2FuRWRpdCkge1xuICAgIHZhciBuZXdMZW4gPSBhcnJheS5sZW5ndGggKyAxO1xuICAgIGlmIChjYW5FZGl0ICYmIGlkeCArIDEgPT09IG5ld0xlbikge1xuICAgICAgYXJyYXlbaWR4XSA9IHZhbDtcbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG4gICAgdmFyIG5ld0FycmF5ID0gbmV3IEFycmF5KG5ld0xlbik7XG4gICAgdmFyIGFmdGVyID0gMDtcbiAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgbmV3TGVuOyBpaSsrKSB7XG4gICAgICBpZiAoaWkgPT09IGlkeCkge1xuICAgICAgICBuZXdBcnJheVtpaV0gPSB2YWw7XG4gICAgICAgIGFmdGVyID0gLTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdBcnJheVtpaV0gPSBhcnJheVtpaSArIGFmdGVyXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ld0FycmF5O1xuICB9XG5cbiAgZnVuY3Rpb24gc3BsaWNlT3V0KGFycmF5LCBpZHgsIGNhbkVkaXQpIHtcbiAgICB2YXIgbmV3TGVuID0gYXJyYXkubGVuZ3RoIC0gMTtcbiAgICBpZiAoY2FuRWRpdCAmJiBpZHggPT09IG5ld0xlbikge1xuICAgICAgYXJyYXkucG9wKCk7XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfVxuICAgIHZhciBuZXdBcnJheSA9IG5ldyBBcnJheShuZXdMZW4pO1xuICAgIHZhciBhZnRlciA9IDA7XG4gICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IG5ld0xlbjsgaWkrKykge1xuICAgICAgaWYgKGlpID09PSBpZHgpIHtcbiAgICAgICAgYWZ0ZXIgPSAxO1xuICAgICAgfVxuICAgICAgbmV3QXJyYXlbaWldID0gYXJyYXlbaWkgKyBhZnRlcl07XG4gICAgfVxuICAgIHJldHVybiBuZXdBcnJheTtcbiAgfVxuXG4gIHZhciBNQVhfQVJSQVlfTUFQX1NJWkUgPSBTSVpFIC8gNDtcbiAgdmFyIE1BWF9CSVRNQVBfSU5ERVhFRF9TSVpFID0gU0laRSAvIDI7XG4gIHZhciBNSU5fSEFTSF9BUlJBWV9NQVBfU0laRSA9IFNJWkUgLyA0O1xuXG4gIGNyZWF0ZUNsYXNzKExpc3QsIEluZGV4ZWRDb2xsZWN0aW9uKTtcblxuICAgIC8vIEBwcmFnbWEgQ29uc3RydWN0aW9uXG5cbiAgICBmdW5jdGlvbiBMaXN0KHZhbHVlKSB7XG4gICAgICB2YXIgZW1wdHkgPSBlbXB0eUxpc3QoKTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBlbXB0eTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0xpc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBpdGVyID0gSW5kZXhlZEl0ZXJhYmxlKHZhbHVlKTtcbiAgICAgIHZhciBzaXplID0gaXRlci5zaXplO1xuICAgICAgaWYgKHNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGVtcHR5O1xuICAgICAgfVxuICAgICAgYXNzZXJ0Tm90SW5maW5pdGUoc2l6ZSk7XG4gICAgICBpZiAoc2l6ZSA+IDAgJiYgc2l6ZSA8IFNJWkUpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VMaXN0KDAsIHNpemUsIFNISUZULCBudWxsLCBuZXcgVk5vZGUoaXRlci50b0FycmF5KCkpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbXB0eS53aXRoTXV0YXRpb25zKGZ1bmN0aW9uKGxpc3QgKSB7XG4gICAgICAgIGxpc3Quc2V0U2l6ZShzaXplKTtcbiAgICAgICAgaXRlci5mb3JFYWNoKGZ1bmN0aW9uKHYsIGkpICB7cmV0dXJuIGxpc3Quc2V0KGksIHYpfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBMaXN0Lm9mID0gZnVuY3Rpb24oLyouLi52YWx1ZXMqLykge1xuICAgICAgcmV0dXJuIHRoaXMoYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgTGlzdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fdG9TdHJpbmcoJ0xpc3QgWycsICddJyk7XG4gICAgfTtcblxuICAgIC8vIEBwcmFnbWEgQWNjZXNzXG5cbiAgICBMaXN0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihpbmRleCwgbm90U2V0VmFsdWUpIHtcbiAgICAgIGluZGV4ID0gd3JhcEluZGV4KHRoaXMsIGluZGV4KTtcbiAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5zaXplKSB7XG4gICAgICAgIGluZGV4ICs9IHRoaXMuX29yaWdpbjtcbiAgICAgICAgdmFyIG5vZGUgPSBsaXN0Tm9kZUZvcih0aGlzLCBpbmRleCk7XG4gICAgICAgIHJldHVybiBub2RlICYmIG5vZGUuYXJyYXlbaW5kZXggJiBNQVNLXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub3RTZXRWYWx1ZTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBNb2RpZmljYXRpb25cblxuICAgIExpc3QucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHVwZGF0ZUxpc3QodGhpcywgaW5kZXgsIHZhbHVlKTtcbiAgICB9O1xuXG4gICAgTGlzdC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgIHJldHVybiAhdGhpcy5oYXMoaW5kZXgpID8gdGhpcyA6XG4gICAgICAgIGluZGV4ID09PSAwID8gdGhpcy5zaGlmdCgpIDpcbiAgICAgICAgaW5kZXggPT09IHRoaXMuc2l6ZSAtIDEgPyB0aGlzLnBvcCgpIDpcbiAgICAgICAgdGhpcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH07XG5cbiAgICBMaXN0LnByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbihpbmRleCwgdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNwbGljZShpbmRleCwgMCwgdmFsdWUpO1xuICAgIH07XG5cbiAgICBMaXN0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9fb3duZXJJRCkge1xuICAgICAgICB0aGlzLnNpemUgPSB0aGlzLl9vcmlnaW4gPSB0aGlzLl9jYXBhY2l0eSA9IDA7XG4gICAgICAgIHRoaXMuX2xldmVsID0gU0hJRlQ7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSB0aGlzLl90YWlsID0gbnVsbDtcbiAgICAgICAgdGhpcy5fX2hhc2ggPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX19hbHRlcmVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW1wdHlMaXN0KCk7XG4gICAgfTtcblxuICAgIExpc3QucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbigvKi4uLnZhbHVlcyovKSB7XG4gICAgICB2YXIgdmFsdWVzID0gYXJndW1lbnRzO1xuICAgICAgdmFyIG9sZFNpemUgPSB0aGlzLnNpemU7XG4gICAgICByZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKGZ1bmN0aW9uKGxpc3QgKSB7XG4gICAgICAgIHNldExpc3RCb3VuZHMobGlzdCwgMCwgb2xkU2l6ZSArIHZhbHVlcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgdmFsdWVzLmxlbmd0aDsgaWkrKykge1xuICAgICAgICAgIGxpc3Quc2V0KG9sZFNpemUgKyBpaSwgdmFsdWVzW2lpXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBMaXN0LnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzZXRMaXN0Qm91bmRzKHRoaXMsIDAsIC0xKTtcbiAgICB9O1xuXG4gICAgTGlzdC5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uKC8qLi4udmFsdWVzKi8pIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBhcmd1bWVudHM7XG4gICAgICByZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKGZ1bmN0aW9uKGxpc3QgKSB7XG4gICAgICAgIHNldExpc3RCb3VuZHMobGlzdCwgLXZhbHVlcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgdmFsdWVzLmxlbmd0aDsgaWkrKykge1xuICAgICAgICAgIGxpc3Quc2V0KGlpLCB2YWx1ZXNbaWldKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIExpc3QucHJvdG90eXBlLnNoaWZ0ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gc2V0TGlzdEJvdW5kcyh0aGlzLCAxKTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBDb21wb3NpdGlvblxuXG4gICAgTGlzdC5wcm90b3R5cGUubWVyZ2UgPSBmdW5jdGlvbigvKi4uLml0ZXJzKi8pIHtcbiAgICAgIHJldHVybiBtZXJnZUludG9MaXN0V2l0aCh0aGlzLCB1bmRlZmluZWQsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIExpc3QucHJvdG90eXBlLm1lcmdlV2l0aCA9IGZ1bmN0aW9uKG1lcmdlcikge3ZhciBpdGVycyA9IFNMSUNFJDAuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgcmV0dXJuIG1lcmdlSW50b0xpc3RXaXRoKHRoaXMsIG1lcmdlciwgaXRlcnMpO1xuICAgIH07XG5cbiAgICBMaXN0LnByb3RvdHlwZS5tZXJnZURlZXAgPSBmdW5jdGlvbigvKi4uLml0ZXJzKi8pIHtcbiAgICAgIHJldHVybiBtZXJnZUludG9MaXN0V2l0aCh0aGlzLCBkZWVwTWVyZ2VyLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBMaXN0LnByb3RvdHlwZS5tZXJnZURlZXBXaXRoID0gZnVuY3Rpb24obWVyZ2VyKSB7dmFyIGl0ZXJzID0gU0xJQ0UkMC5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICByZXR1cm4gbWVyZ2VJbnRvTGlzdFdpdGgodGhpcywgZGVlcE1lcmdlcldpdGgobWVyZ2VyKSwgaXRlcnMpO1xuICAgIH07XG5cbiAgICBMaXN0LnByb3RvdHlwZS5zZXRTaXplID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgICAgcmV0dXJuIHNldExpc3RCb3VuZHModGhpcywgMCwgc2l6ZSk7XG4gICAgfTtcblxuICAgIC8vIEBwcmFnbWEgSXRlcmF0aW9uXG5cbiAgICBMaXN0LnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uKGJlZ2luLCBlbmQpIHtcbiAgICAgIHZhciBzaXplID0gdGhpcy5zaXplO1xuICAgICAgaWYgKHdob2xlU2xpY2UoYmVnaW4sIGVuZCwgc2l6ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2V0TGlzdEJvdW5kcyhcbiAgICAgICAgdGhpcyxcbiAgICAgICAgcmVzb2x2ZUJlZ2luKGJlZ2luLCBzaXplKSxcbiAgICAgICAgcmVzb2x2ZUVuZChlbmQsIHNpemUpXG4gICAgICApO1xuICAgIH07XG5cbiAgICBMaXN0LnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciB2YWx1ZXMgPSBpdGVyYXRlTGlzdCh0aGlzLCByZXZlcnNlKTtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24oKSAge1xuICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZXMoKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBET05FID9cbiAgICAgICAgICBpdGVyYXRvckRvbmUoKSA6XG4gICAgICAgICAgaXRlcmF0b3JWYWx1ZSh0eXBlLCBpbmRleCsrLCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgTGlzdC5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHtcbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICB2YXIgdmFsdWVzID0gaXRlcmF0ZUxpc3QodGhpcywgcmV2ZXJzZSk7XG4gICAgICB2YXIgdmFsdWU7XG4gICAgICB3aGlsZSAoKHZhbHVlID0gdmFsdWVzKCkpICE9PSBET05FKSB7XG4gICAgICAgIGlmIChmbih2YWx1ZSwgaW5kZXgrKywgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9O1xuXG4gICAgTGlzdC5wcm90b3R5cGUuX19lbnN1cmVPd25lciA9IGZ1bmN0aW9uKG93bmVySUQpIHtcbiAgICAgIGlmIChvd25lcklEID09PSB0aGlzLl9fb3duZXJJRCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmICghb3duZXJJRCkge1xuICAgICAgICB0aGlzLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ha2VMaXN0KHRoaXMuX29yaWdpbiwgdGhpcy5fY2FwYWNpdHksIHRoaXMuX2xldmVsLCB0aGlzLl9yb290LCB0aGlzLl90YWlsLCBvd25lcklELCB0aGlzLl9faGFzaCk7XG4gICAgfTtcblxuXG4gIGZ1bmN0aW9uIGlzTGlzdChtYXliZUxpc3QpIHtcbiAgICByZXR1cm4gISEobWF5YmVMaXN0ICYmIG1heWJlTGlzdFtJU19MSVNUX1NFTlRJTkVMXSk7XG4gIH1cblxuICBMaXN0LmlzTGlzdCA9IGlzTGlzdDtcblxuICB2YXIgSVNfTElTVF9TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX0xJU1RfX0BAJztcblxuICB2YXIgTGlzdFByb3RvdHlwZSA9IExpc3QucHJvdG90eXBlO1xuICBMaXN0UHJvdG90eXBlW0lTX0xJU1RfU0VOVElORUxdID0gdHJ1ZTtcbiAgTGlzdFByb3RvdHlwZVtERUxFVEVdID0gTGlzdFByb3RvdHlwZS5yZW1vdmU7XG4gIExpc3RQcm90b3R5cGUuc2V0SW4gPSBNYXBQcm90b3R5cGUuc2V0SW47XG4gIExpc3RQcm90b3R5cGUuZGVsZXRlSW4gPVxuICBMaXN0UHJvdG90eXBlLnJlbW92ZUluID0gTWFwUHJvdG90eXBlLnJlbW92ZUluO1xuICBMaXN0UHJvdG90eXBlLnVwZGF0ZSA9IE1hcFByb3RvdHlwZS51cGRhdGU7XG4gIExpc3RQcm90b3R5cGUudXBkYXRlSW4gPSBNYXBQcm90b3R5cGUudXBkYXRlSW47XG4gIExpc3RQcm90b3R5cGUubWVyZ2VJbiA9IE1hcFByb3RvdHlwZS5tZXJnZUluO1xuICBMaXN0UHJvdG90eXBlLm1lcmdlRGVlcEluID0gTWFwUHJvdG90eXBlLm1lcmdlRGVlcEluO1xuICBMaXN0UHJvdG90eXBlLndpdGhNdXRhdGlvbnMgPSBNYXBQcm90b3R5cGUud2l0aE11dGF0aW9ucztcbiAgTGlzdFByb3RvdHlwZS5hc011dGFibGUgPSBNYXBQcm90b3R5cGUuYXNNdXRhYmxlO1xuICBMaXN0UHJvdG90eXBlLmFzSW1tdXRhYmxlID0gTWFwUHJvdG90eXBlLmFzSW1tdXRhYmxlO1xuICBMaXN0UHJvdG90eXBlLndhc0FsdGVyZWQgPSBNYXBQcm90b3R5cGUud2FzQWx0ZXJlZDtcblxuXG5cbiAgICBmdW5jdGlvbiBWTm9kZShhcnJheSwgb3duZXJJRCkge1xuICAgICAgdGhpcy5hcnJheSA9IGFycmF5O1xuICAgICAgdGhpcy5vd25lcklEID0gb3duZXJJRDtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBzZWVtcyBsaWtlIHRoZXNlIG1ldGhvZHMgYXJlIHZlcnkgc2ltaWxhclxuXG4gICAgVk5vZGUucHJvdG90eXBlLnJlbW92ZUJlZm9yZSA9IGZ1bmN0aW9uKG93bmVySUQsIGxldmVsLCBpbmRleCkge1xuICAgICAgaWYgKGluZGV4ID09PSBsZXZlbCA/IDEgPDwgbGV2ZWwgOiAwIHx8IHRoaXMuYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgdmFyIG9yaWdpbkluZGV4ID0gKGluZGV4ID4+PiBsZXZlbCkgJiBNQVNLO1xuICAgICAgaWYgKG9yaWdpbkluZGV4ID49IHRoaXMuYXJyYXkubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBuZXcgVk5vZGUoW10sIG93bmVySUQpO1xuICAgICAgfVxuICAgICAgdmFyIHJlbW92aW5nRmlyc3QgPSBvcmlnaW5JbmRleCA9PT0gMDtcbiAgICAgIHZhciBuZXdDaGlsZDtcbiAgICAgIGlmIChsZXZlbCA+IDApIHtcbiAgICAgICAgdmFyIG9sZENoaWxkID0gdGhpcy5hcnJheVtvcmlnaW5JbmRleF07XG4gICAgICAgIG5ld0NoaWxkID0gb2xkQ2hpbGQgJiYgb2xkQ2hpbGQucmVtb3ZlQmVmb3JlKG93bmVySUQsIGxldmVsIC0gU0hJRlQsIGluZGV4KTtcbiAgICAgICAgaWYgKG5ld0NoaWxkID09PSBvbGRDaGlsZCAmJiByZW1vdmluZ0ZpcnN0KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChyZW1vdmluZ0ZpcnN0ICYmICFuZXdDaGlsZCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHZhciBlZGl0YWJsZSA9IGVkaXRhYmxlVk5vZGUodGhpcywgb3duZXJJRCk7XG4gICAgICBpZiAoIXJlbW92aW5nRmlyc3QpIHtcbiAgICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IG9yaWdpbkluZGV4OyBpaSsrKSB7XG4gICAgICAgICAgZWRpdGFibGUuYXJyYXlbaWldID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobmV3Q2hpbGQpIHtcbiAgICAgICAgZWRpdGFibGUuYXJyYXlbb3JpZ2luSW5kZXhdID0gbmV3Q2hpbGQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWRpdGFibGU7XG4gICAgfTtcblxuICAgIFZOb2RlLnByb3RvdHlwZS5yZW1vdmVBZnRlciA9IGZ1bmN0aW9uKG93bmVySUQsIGxldmVsLCBpbmRleCkge1xuICAgICAgaWYgKGluZGV4ID09PSAobGV2ZWwgPyAxIDw8IGxldmVsIDogMCkgfHwgdGhpcy5hcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB2YXIgc2l6ZUluZGV4ID0gKChpbmRleCAtIDEpID4+PiBsZXZlbCkgJiBNQVNLO1xuICAgICAgaWYgKHNpemVJbmRleCA+PSB0aGlzLmFycmF5Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld0NoaWxkO1xuICAgICAgaWYgKGxldmVsID4gMCkge1xuICAgICAgICB2YXIgb2xkQ2hpbGQgPSB0aGlzLmFycmF5W3NpemVJbmRleF07XG4gICAgICAgIG5ld0NoaWxkID0gb2xkQ2hpbGQgJiYgb2xkQ2hpbGQucmVtb3ZlQWZ0ZXIob3duZXJJRCwgbGV2ZWwgLSBTSElGVCwgaW5kZXgpO1xuICAgICAgICBpZiAobmV3Q2hpbGQgPT09IG9sZENoaWxkICYmIHNpemVJbmRleCA9PT0gdGhpcy5hcnJheS5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGVkaXRhYmxlID0gZWRpdGFibGVWTm9kZSh0aGlzLCBvd25lcklEKTtcbiAgICAgIGVkaXRhYmxlLmFycmF5LnNwbGljZShzaXplSW5kZXggKyAxKTtcbiAgICAgIGlmIChuZXdDaGlsZCkge1xuICAgICAgICBlZGl0YWJsZS5hcnJheVtzaXplSW5kZXhdID0gbmV3Q2hpbGQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWRpdGFibGU7XG4gICAgfTtcblxuXG5cbiAgdmFyIERPTkUgPSB7fTtcblxuICBmdW5jdGlvbiBpdGVyYXRlTGlzdChsaXN0LCByZXZlcnNlKSB7XG4gICAgdmFyIGxlZnQgPSBsaXN0Ll9vcmlnaW47XG4gICAgdmFyIHJpZ2h0ID0gbGlzdC5fY2FwYWNpdHk7XG4gICAgdmFyIHRhaWxQb3MgPSBnZXRUYWlsT2Zmc2V0KHJpZ2h0KTtcbiAgICB2YXIgdGFpbCA9IGxpc3QuX3RhaWw7XG5cbiAgICByZXR1cm4gaXRlcmF0ZU5vZGVPckxlYWYobGlzdC5fcm9vdCwgbGlzdC5fbGV2ZWwsIDApO1xuXG4gICAgZnVuY3Rpb24gaXRlcmF0ZU5vZGVPckxlYWYobm9kZSwgbGV2ZWwsIG9mZnNldCkge1xuICAgICAgcmV0dXJuIGxldmVsID09PSAwID9cbiAgICAgICAgaXRlcmF0ZUxlYWYobm9kZSwgb2Zmc2V0KSA6XG4gICAgICAgIGl0ZXJhdGVOb2RlKG5vZGUsIGxldmVsLCBvZmZzZXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGl0ZXJhdGVMZWFmKG5vZGUsIG9mZnNldCkge1xuICAgICAgdmFyIGFycmF5ID0gb2Zmc2V0ID09PSB0YWlsUG9zID8gdGFpbCAmJiB0YWlsLmFycmF5IDogbm9kZSAmJiBub2RlLmFycmF5O1xuICAgICAgdmFyIGZyb20gPSBvZmZzZXQgPiBsZWZ0ID8gMCA6IGxlZnQgLSBvZmZzZXQ7XG4gICAgICB2YXIgdG8gPSByaWdodCAtIG9mZnNldDtcbiAgICAgIGlmICh0byA+IFNJWkUpIHtcbiAgICAgICAgdG8gPSBTSVpFO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgIHtcbiAgICAgICAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgICAgICAgcmV0dXJuIERPTkU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlkeCA9IHJldmVyc2UgPyAtLXRvIDogZnJvbSsrO1xuICAgICAgICByZXR1cm4gYXJyYXkgJiYgYXJyYXlbaWR4XTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXRlcmF0ZU5vZGUobm9kZSwgbGV2ZWwsIG9mZnNldCkge1xuICAgICAgdmFyIHZhbHVlcztcbiAgICAgIHZhciBhcnJheSA9IG5vZGUgJiYgbm9kZS5hcnJheTtcbiAgICAgIHZhciBmcm9tID0gb2Zmc2V0ID4gbGVmdCA/IDAgOiAobGVmdCAtIG9mZnNldCkgPj4gbGV2ZWw7XG4gICAgICB2YXIgdG8gPSAoKHJpZ2h0IC0gb2Zmc2V0KSA+PiBsZXZlbCkgKyAxO1xuICAgICAgaWYgKHRvID4gU0laRSkge1xuICAgICAgICB0byA9IFNJWkU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSAge1xuICAgICAgICBkbyB7XG4gICAgICAgICAgaWYgKHZhbHVlcykge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVzKCk7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IERPTkUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFsdWVzID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgICAgICAgICByZXR1cm4gRE9ORTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGlkeCA9IHJldmVyc2UgPyAtLXRvIDogZnJvbSsrO1xuICAgICAgICAgIHZhbHVlcyA9IGl0ZXJhdGVOb2RlT3JMZWFmKFxuICAgICAgICAgICAgYXJyYXkgJiYgYXJyYXlbaWR4XSwgbGV2ZWwgLSBTSElGVCwgb2Zmc2V0ICsgKGlkeCA8PCBsZXZlbClcbiAgICAgICAgICApO1xuICAgICAgICB9IHdoaWxlICh0cnVlKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gbWFrZUxpc3Qob3JpZ2luLCBjYXBhY2l0eSwgbGV2ZWwsIHJvb3QsIHRhaWwsIG93bmVySUQsIGhhc2gpIHtcbiAgICB2YXIgbGlzdCA9IE9iamVjdC5jcmVhdGUoTGlzdFByb3RvdHlwZSk7XG4gICAgbGlzdC5zaXplID0gY2FwYWNpdHkgLSBvcmlnaW47XG4gICAgbGlzdC5fb3JpZ2luID0gb3JpZ2luO1xuICAgIGxpc3QuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgbGlzdC5fbGV2ZWwgPSBsZXZlbDtcbiAgICBsaXN0Ll9yb290ID0gcm9vdDtcbiAgICBsaXN0Ll90YWlsID0gdGFpbDtcbiAgICBsaXN0Ll9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgbGlzdC5fX2hhc2ggPSBoYXNoO1xuICAgIGxpc3QuX19hbHRlcmVkID0gZmFsc2U7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICB2YXIgRU1QVFlfTElTVDtcbiAgZnVuY3Rpb24gZW1wdHlMaXN0KCkge1xuICAgIHJldHVybiBFTVBUWV9MSVNUIHx8IChFTVBUWV9MSVNUID0gbWFrZUxpc3QoMCwgMCwgU0hJRlQpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUxpc3QobGlzdCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgaW5kZXggPSB3cmFwSW5kZXgobGlzdCwgaW5kZXgpO1xuXG4gICAgaWYgKGluZGV4ICE9PSBpbmRleCkge1xuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID49IGxpc3Quc2l6ZSB8fCBpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBsaXN0LndpdGhNdXRhdGlvbnMoZnVuY3Rpb24obGlzdCApIHtcbiAgICAgICAgaW5kZXggPCAwID9cbiAgICAgICAgICBzZXRMaXN0Qm91bmRzKGxpc3QsIGluZGV4KS5zZXQoMCwgdmFsdWUpIDpcbiAgICAgICAgICBzZXRMaXN0Qm91bmRzKGxpc3QsIDAsIGluZGV4ICsgMSkuc2V0KGluZGV4LCB2YWx1ZSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGluZGV4ICs9IGxpc3QuX29yaWdpbjtcblxuICAgIHZhciBuZXdUYWlsID0gbGlzdC5fdGFpbDtcbiAgICB2YXIgbmV3Um9vdCA9IGxpc3QuX3Jvb3Q7XG4gICAgdmFyIGRpZEFsdGVyID0gTWFrZVJlZihESURfQUxURVIpO1xuICAgIGlmIChpbmRleCA+PSBnZXRUYWlsT2Zmc2V0KGxpc3QuX2NhcGFjaXR5KSkge1xuICAgICAgbmV3VGFpbCA9IHVwZGF0ZVZOb2RlKG5ld1RhaWwsIGxpc3QuX19vd25lcklELCAwLCBpbmRleCwgdmFsdWUsIGRpZEFsdGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3Um9vdCA9IHVwZGF0ZVZOb2RlKG5ld1Jvb3QsIGxpc3QuX19vd25lcklELCBsaXN0Ll9sZXZlbCwgaW5kZXgsIHZhbHVlLCBkaWRBbHRlcik7XG4gICAgfVxuXG4gICAgaWYgKCFkaWRBbHRlci52YWx1ZSkge1xuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgaWYgKGxpc3QuX19vd25lcklEKSB7XG4gICAgICBsaXN0Ll9yb290ID0gbmV3Um9vdDtcbiAgICAgIGxpc3QuX3RhaWwgPSBuZXdUYWlsO1xuICAgICAgbGlzdC5fX2hhc2ggPSB1bmRlZmluZWQ7XG4gICAgICBsaXN0Ll9fYWx0ZXJlZCA9IHRydWU7XG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VMaXN0KGxpc3QuX29yaWdpbiwgbGlzdC5fY2FwYWNpdHksIGxpc3QuX2xldmVsLCBuZXdSb290LCBuZXdUYWlsKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVZOb2RlKG5vZGUsIG93bmVySUQsIGxldmVsLCBpbmRleCwgdmFsdWUsIGRpZEFsdGVyKSB7XG4gICAgdmFyIGlkeCA9IChpbmRleCA+Pj4gbGV2ZWwpICYgTUFTSztcbiAgICB2YXIgbm9kZUhhcyA9IG5vZGUgJiYgaWR4IDwgbm9kZS5hcnJheS5sZW5ndGg7XG4gICAgaWYgKCFub2RlSGFzICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIHZhciBuZXdOb2RlO1xuXG4gICAgaWYgKGxldmVsID4gMCkge1xuICAgICAgdmFyIGxvd2VyTm9kZSA9IG5vZGUgJiYgbm9kZS5hcnJheVtpZHhdO1xuICAgICAgdmFyIG5ld0xvd2VyTm9kZSA9IHVwZGF0ZVZOb2RlKGxvd2VyTm9kZSwgb3duZXJJRCwgbGV2ZWwgLSBTSElGVCwgaW5kZXgsIHZhbHVlLCBkaWRBbHRlcik7XG4gICAgICBpZiAobmV3TG93ZXJOb2RlID09PSBsb3dlck5vZGUpIHtcbiAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgICBuZXdOb2RlID0gZWRpdGFibGVWTm9kZShub2RlLCBvd25lcklEKTtcbiAgICAgIG5ld05vZGUuYXJyYXlbaWR4XSA9IG5ld0xvd2VyTm9kZTtcbiAgICAgIHJldHVybiBuZXdOb2RlO1xuICAgIH1cblxuICAgIGlmIChub2RlSGFzICYmIG5vZGUuYXJyYXlbaWR4XSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cblxuICAgIFNldFJlZihkaWRBbHRlcik7XG5cbiAgICBuZXdOb2RlID0gZWRpdGFibGVWTm9kZShub2RlLCBvd25lcklEKTtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiBpZHggPT09IG5ld05vZGUuYXJyYXkubGVuZ3RoIC0gMSkge1xuICAgICAgbmV3Tm9kZS5hcnJheS5wb3AoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3Tm9kZS5hcnJheVtpZHhdID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBuZXdOb2RlO1xuICB9XG5cbiAgZnVuY3Rpb24gZWRpdGFibGVWTm9kZShub2RlLCBvd25lcklEKSB7XG4gICAgaWYgKG93bmVySUQgJiYgbm9kZSAmJiBvd25lcklEID09PSBub2RlLm93bmVySUQpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFZOb2RlKG5vZGUgPyBub2RlLmFycmF5LnNsaWNlKCkgOiBbXSwgb3duZXJJRCk7XG4gIH1cblxuICBmdW5jdGlvbiBsaXN0Tm9kZUZvcihsaXN0LCByYXdJbmRleCkge1xuICAgIGlmIChyYXdJbmRleCA+PSBnZXRUYWlsT2Zmc2V0KGxpc3QuX2NhcGFjaXR5KSkge1xuICAgICAgcmV0dXJuIGxpc3QuX3RhaWw7XG4gICAgfVxuICAgIGlmIChyYXdJbmRleCA8IDEgPDwgKGxpc3QuX2xldmVsICsgU0hJRlQpKSB7XG4gICAgICB2YXIgbm9kZSA9IGxpc3QuX3Jvb3Q7XG4gICAgICB2YXIgbGV2ZWwgPSBsaXN0Ll9sZXZlbDtcbiAgICAgIHdoaWxlIChub2RlICYmIGxldmVsID4gMCkge1xuICAgICAgICBub2RlID0gbm9kZS5hcnJheVsocmF3SW5kZXggPj4+IGxldmVsKSAmIE1BU0tdO1xuICAgICAgICBsZXZlbCAtPSBTSElGVDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldExpc3RCb3VuZHMobGlzdCwgYmVnaW4sIGVuZCkge1xuICAgIC8vIFNhbml0aXplIGJlZ2luICYgZW5kIHVzaW5nIHRoaXMgc2hvcnRoYW5kIGZvciBUb0ludDMyKGFyZ3VtZW50KVxuICAgIC8vIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy10b2ludDMyXG4gICAgaWYgKGJlZ2luICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGJlZ2luID0gYmVnaW4gfCAwO1xuICAgIH1cbiAgICBpZiAoZW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVuZCA9IGVuZCB8IDA7XG4gICAgfVxuICAgIHZhciBvd25lciA9IGxpc3QuX19vd25lcklEIHx8IG5ldyBPd25lcklEKCk7XG4gICAgdmFyIG9sZE9yaWdpbiA9IGxpc3QuX29yaWdpbjtcbiAgICB2YXIgb2xkQ2FwYWNpdHkgPSBsaXN0Ll9jYXBhY2l0eTtcbiAgICB2YXIgbmV3T3JpZ2luID0gb2xkT3JpZ2luICsgYmVnaW47XG4gICAgdmFyIG5ld0NhcGFjaXR5ID0gZW5kID09PSB1bmRlZmluZWQgPyBvbGRDYXBhY2l0eSA6IGVuZCA8IDAgPyBvbGRDYXBhY2l0eSArIGVuZCA6IG9sZE9yaWdpbiArIGVuZDtcbiAgICBpZiAobmV3T3JpZ2luID09PSBvbGRPcmlnaW4gJiYgbmV3Q2FwYWNpdHkgPT09IG9sZENhcGFjaXR5KSB7XG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGdvaW5nIHRvIGVuZCBhZnRlciBpdCBzdGFydHMsIGl0J3MgZW1wdHkuXG4gICAgaWYgKG5ld09yaWdpbiA+PSBuZXdDYXBhY2l0eSkge1xuICAgICAgcmV0dXJuIGxpc3QuY2xlYXIoKTtcbiAgICB9XG5cbiAgICB2YXIgbmV3TGV2ZWwgPSBsaXN0Ll9sZXZlbDtcbiAgICB2YXIgbmV3Um9vdCA9IGxpc3QuX3Jvb3Q7XG5cbiAgICAvLyBOZXcgb3JpZ2luIG1pZ2h0IG5lZWQgY3JlYXRpbmcgYSBoaWdoZXIgcm9vdC5cbiAgICB2YXIgb2Zmc2V0U2hpZnQgPSAwO1xuICAgIHdoaWxlIChuZXdPcmlnaW4gKyBvZmZzZXRTaGlmdCA8IDApIHtcbiAgICAgIG5ld1Jvb3QgPSBuZXcgVk5vZGUobmV3Um9vdCAmJiBuZXdSb290LmFycmF5Lmxlbmd0aCA/IFt1bmRlZmluZWQsIG5ld1Jvb3RdIDogW10sIG93bmVyKTtcbiAgICAgIG5ld0xldmVsICs9IFNISUZUO1xuICAgICAgb2Zmc2V0U2hpZnQgKz0gMSA8PCBuZXdMZXZlbDtcbiAgICB9XG4gICAgaWYgKG9mZnNldFNoaWZ0KSB7XG4gICAgICBuZXdPcmlnaW4gKz0gb2Zmc2V0U2hpZnQ7XG4gICAgICBvbGRPcmlnaW4gKz0gb2Zmc2V0U2hpZnQ7XG4gICAgICBuZXdDYXBhY2l0eSArPSBvZmZzZXRTaGlmdDtcbiAgICAgIG9sZENhcGFjaXR5ICs9IG9mZnNldFNoaWZ0O1xuICAgIH1cblxuICAgIHZhciBvbGRUYWlsT2Zmc2V0ID0gZ2V0VGFpbE9mZnNldChvbGRDYXBhY2l0eSk7XG4gICAgdmFyIG5ld1RhaWxPZmZzZXQgPSBnZXRUYWlsT2Zmc2V0KG5ld0NhcGFjaXR5KTtcblxuICAgIC8vIE5ldyBzaXplIG1pZ2h0IG5lZWQgY3JlYXRpbmcgYSBoaWdoZXIgcm9vdC5cbiAgICB3aGlsZSAobmV3VGFpbE9mZnNldCA+PSAxIDw8IChuZXdMZXZlbCArIFNISUZUKSkge1xuICAgICAgbmV3Um9vdCA9IG5ldyBWTm9kZShuZXdSb290ICYmIG5ld1Jvb3QuYXJyYXkubGVuZ3RoID8gW25ld1Jvb3RdIDogW10sIG93bmVyKTtcbiAgICAgIG5ld0xldmVsICs9IFNISUZUO1xuICAgIH1cblxuICAgIC8vIExvY2F0ZSBvciBjcmVhdGUgdGhlIG5ldyB0YWlsLlxuICAgIHZhciBvbGRUYWlsID0gbGlzdC5fdGFpbDtcbiAgICB2YXIgbmV3VGFpbCA9IG5ld1RhaWxPZmZzZXQgPCBvbGRUYWlsT2Zmc2V0ID9cbiAgICAgIGxpc3ROb2RlRm9yKGxpc3QsIG5ld0NhcGFjaXR5IC0gMSkgOlxuICAgICAgbmV3VGFpbE9mZnNldCA+IG9sZFRhaWxPZmZzZXQgPyBuZXcgVk5vZGUoW10sIG93bmVyKSA6IG9sZFRhaWw7XG5cbiAgICAvLyBNZXJnZSBUYWlsIGludG8gdHJlZS5cbiAgICBpZiAob2xkVGFpbCAmJiBuZXdUYWlsT2Zmc2V0ID4gb2xkVGFpbE9mZnNldCAmJiBuZXdPcmlnaW4gPCBvbGRDYXBhY2l0eSAmJiBvbGRUYWlsLmFycmF5Lmxlbmd0aCkge1xuICAgICAgbmV3Um9vdCA9IGVkaXRhYmxlVk5vZGUobmV3Um9vdCwgb3duZXIpO1xuICAgICAgdmFyIG5vZGUgPSBuZXdSb290O1xuICAgICAgZm9yICh2YXIgbGV2ZWwgPSBuZXdMZXZlbDsgbGV2ZWwgPiBTSElGVDsgbGV2ZWwgLT0gU0hJRlQpIHtcbiAgICAgICAgdmFyIGlkeCA9IChvbGRUYWlsT2Zmc2V0ID4+PiBsZXZlbCkgJiBNQVNLO1xuICAgICAgICBub2RlID0gbm9kZS5hcnJheVtpZHhdID0gZWRpdGFibGVWTm9kZShub2RlLmFycmF5W2lkeF0sIG93bmVyKTtcbiAgICAgIH1cbiAgICAgIG5vZGUuYXJyYXlbKG9sZFRhaWxPZmZzZXQgPj4+IFNISUZUKSAmIE1BU0tdID0gb2xkVGFpbDtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgc2l6ZSBoYXMgYmVlbiByZWR1Y2VkLCB0aGVyZSdzIGEgY2hhbmNlIHRoZSB0YWlsIG5lZWRzIHRvIGJlIHRyaW1tZWQuXG4gICAgaWYgKG5ld0NhcGFjaXR5IDwgb2xkQ2FwYWNpdHkpIHtcbiAgICAgIG5ld1RhaWwgPSBuZXdUYWlsICYmIG5ld1RhaWwucmVtb3ZlQWZ0ZXIob3duZXIsIDAsIG5ld0NhcGFjaXR5KTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgbmV3IG9yaWdpbiBpcyB3aXRoaW4gdGhlIHRhaWwsIHRoZW4gd2UgZG8gbm90IG5lZWQgYSByb290LlxuICAgIGlmIChuZXdPcmlnaW4gPj0gbmV3VGFpbE9mZnNldCkge1xuICAgICAgbmV3T3JpZ2luIC09IG5ld1RhaWxPZmZzZXQ7XG4gICAgICBuZXdDYXBhY2l0eSAtPSBuZXdUYWlsT2Zmc2V0O1xuICAgICAgbmV3TGV2ZWwgPSBTSElGVDtcbiAgICAgIG5ld1Jvb3QgPSBudWxsO1xuICAgICAgbmV3VGFpbCA9IG5ld1RhaWwgJiYgbmV3VGFpbC5yZW1vdmVCZWZvcmUob3duZXIsIDAsIG5ld09yaWdpbik7XG5cbiAgICAvLyBPdGhlcndpc2UsIGlmIHRoZSByb290IGhhcyBiZWVuIHRyaW1tZWQsIGdhcmJhZ2UgY29sbGVjdC5cbiAgICB9IGVsc2UgaWYgKG5ld09yaWdpbiA+IG9sZE9yaWdpbiB8fCBuZXdUYWlsT2Zmc2V0IDwgb2xkVGFpbE9mZnNldCkge1xuICAgICAgb2Zmc2V0U2hpZnQgPSAwO1xuXG4gICAgICAvLyBJZGVudGlmeSB0aGUgbmV3IHRvcCByb290IG5vZGUgb2YgdGhlIHN1YnRyZWUgb2YgdGhlIG9sZCByb290LlxuICAgICAgd2hpbGUgKG5ld1Jvb3QpIHtcbiAgICAgICAgdmFyIGJlZ2luSW5kZXggPSAobmV3T3JpZ2luID4+PiBuZXdMZXZlbCkgJiBNQVNLO1xuICAgICAgICBpZiAoYmVnaW5JbmRleCAhPT0gKG5ld1RhaWxPZmZzZXQgPj4+IG5ld0xldmVsKSAmIE1BU0spIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYmVnaW5JbmRleCkge1xuICAgICAgICAgIG9mZnNldFNoaWZ0ICs9ICgxIDw8IG5ld0xldmVsKSAqIGJlZ2luSW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgbmV3TGV2ZWwgLT0gU0hJRlQ7XG4gICAgICAgIG5ld1Jvb3QgPSBuZXdSb290LmFycmF5W2JlZ2luSW5kZXhdO1xuICAgICAgfVxuXG4gICAgICAvLyBUcmltIHRoZSBuZXcgc2lkZXMgb2YgdGhlIG5ldyByb290LlxuICAgICAgaWYgKG5ld1Jvb3QgJiYgbmV3T3JpZ2luID4gb2xkT3JpZ2luKSB7XG4gICAgICAgIG5ld1Jvb3QgPSBuZXdSb290LnJlbW92ZUJlZm9yZShvd25lciwgbmV3TGV2ZWwsIG5ld09yaWdpbiAtIG9mZnNldFNoaWZ0KTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXdSb290ICYmIG5ld1RhaWxPZmZzZXQgPCBvbGRUYWlsT2Zmc2V0KSB7XG4gICAgICAgIG5ld1Jvb3QgPSBuZXdSb290LnJlbW92ZUFmdGVyKG93bmVyLCBuZXdMZXZlbCwgbmV3VGFpbE9mZnNldCAtIG9mZnNldFNoaWZ0KTtcbiAgICAgIH1cbiAgICAgIGlmIChvZmZzZXRTaGlmdCkge1xuICAgICAgICBuZXdPcmlnaW4gLT0gb2Zmc2V0U2hpZnQ7XG4gICAgICAgIG5ld0NhcGFjaXR5IC09IG9mZnNldFNoaWZ0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaXN0Ll9fb3duZXJJRCkge1xuICAgICAgbGlzdC5zaXplID0gbmV3Q2FwYWNpdHkgLSBuZXdPcmlnaW47XG4gICAgICBsaXN0Ll9vcmlnaW4gPSBuZXdPcmlnaW47XG4gICAgICBsaXN0Ll9jYXBhY2l0eSA9IG5ld0NhcGFjaXR5O1xuICAgICAgbGlzdC5fbGV2ZWwgPSBuZXdMZXZlbDtcbiAgICAgIGxpc3QuX3Jvb3QgPSBuZXdSb290O1xuICAgICAgbGlzdC5fdGFpbCA9IG5ld1RhaWw7XG4gICAgICBsaXN0Ll9faGFzaCA9IHVuZGVmaW5lZDtcbiAgICAgIGxpc3QuX19hbHRlcmVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cbiAgICByZXR1cm4gbWFrZUxpc3QobmV3T3JpZ2luLCBuZXdDYXBhY2l0eSwgbmV3TGV2ZWwsIG5ld1Jvb3QsIG5ld1RhaWwpO1xuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VJbnRvTGlzdFdpdGgobGlzdCwgbWVyZ2VyLCBpdGVyYWJsZXMpIHtcbiAgICB2YXIgaXRlcnMgPSBbXTtcbiAgICB2YXIgbWF4U2l6ZSA9IDA7XG4gICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGl0ZXJhYmxlcy5sZW5ndGg7IGlpKyspIHtcbiAgICAgIHZhciB2YWx1ZSA9IGl0ZXJhYmxlc1tpaV07XG4gICAgICB2YXIgaXRlciA9IEluZGV4ZWRJdGVyYWJsZSh2YWx1ZSk7XG4gICAgICBpZiAoaXRlci5zaXplID4gbWF4U2l6ZSkge1xuICAgICAgICBtYXhTaXplID0gaXRlci5zaXplO1xuICAgICAgfVxuICAgICAgaWYgKCFpc0l0ZXJhYmxlKHZhbHVlKSkge1xuICAgICAgICBpdGVyID0gaXRlci5tYXAoZnVuY3Rpb24odiApIHtyZXR1cm4gZnJvbUpTKHYpfSk7XG4gICAgICB9XG4gICAgICBpdGVycy5wdXNoKGl0ZXIpO1xuICAgIH1cbiAgICBpZiAobWF4U2l6ZSA+IGxpc3Quc2l6ZSkge1xuICAgICAgbGlzdCA9IGxpc3Quc2V0U2l6ZShtYXhTaXplKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlSW50b0NvbGxlY3Rpb25XaXRoKGxpc3QsIG1lcmdlciwgaXRlcnMpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VGFpbE9mZnNldChzaXplKSB7XG4gICAgcmV0dXJuIHNpemUgPCBTSVpFID8gMCA6ICgoKHNpemUgLSAxKSA+Pj4gU0hJRlQpIDw8IFNISUZUKTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKE9yZGVyZWRNYXAsIE1hcCk7XG5cbiAgICAvLyBAcHJhZ21hIENvbnN0cnVjdGlvblxuXG4gICAgZnVuY3Rpb24gT3JkZXJlZE1hcCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgPyBlbXB0eU9yZGVyZWRNYXAoKSA6XG4gICAgICAgIGlzT3JkZXJlZE1hcCh2YWx1ZSkgPyB2YWx1ZSA6XG4gICAgICAgIGVtcHR5T3JkZXJlZE1hcCgpLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24obWFwICkge1xuICAgICAgICAgIHZhciBpdGVyID0gS2V5ZWRJdGVyYWJsZSh2YWx1ZSk7XG4gICAgICAgICAgYXNzZXJ0Tm90SW5maW5pdGUoaXRlci5zaXplKTtcbiAgICAgICAgICBpdGVyLmZvckVhY2goZnVuY3Rpb24odiwgaykgIHtyZXR1cm4gbWFwLnNldChrLCB2KX0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBPcmRlcmVkTWFwLm9mID0gZnVuY3Rpb24oLyouLi52YWx1ZXMqLykge1xuICAgICAgcmV0dXJuIHRoaXMoYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgT3JkZXJlZE1hcC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fdG9TdHJpbmcoJ09yZGVyZWRNYXAgeycsICd9Jyk7XG4gICAgfTtcblxuICAgIC8vIEBwcmFnbWEgQWNjZXNzXG5cbiAgICBPcmRlcmVkTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihrLCBub3RTZXRWYWx1ZSkge1xuICAgICAgdmFyIGluZGV4ID0gdGhpcy5fbWFwLmdldChrKTtcbiAgICAgIHJldHVybiBpbmRleCAhPT0gdW5kZWZpbmVkID8gdGhpcy5fbGlzdC5nZXQoaW5kZXgpWzFdIDogbm90U2V0VmFsdWU7XG4gICAgfTtcblxuICAgIC8vIEBwcmFnbWEgTW9kaWZpY2F0aW9uXG5cbiAgICBPcmRlcmVkTWFwLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9fb3duZXJJRCkge1xuICAgICAgICB0aGlzLnNpemUgPSAwO1xuICAgICAgICB0aGlzLl9tYXAuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5fbGlzdC5jbGVhcigpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbXB0eU9yZGVyZWRNYXAoKTtcbiAgICB9O1xuXG4gICAgT3JkZXJlZE1hcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oaywgdikge1xuICAgICAgcmV0dXJuIHVwZGF0ZU9yZGVyZWRNYXAodGhpcywgaywgdik7XG4gICAgfTtcblxuICAgIE9yZGVyZWRNYXAucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKGspIHtcbiAgICAgIHJldHVybiB1cGRhdGVPcmRlcmVkTWFwKHRoaXMsIGssIE5PVF9TRVQpO1xuICAgIH07XG5cbiAgICBPcmRlcmVkTWFwLnByb3RvdHlwZS53YXNBbHRlcmVkID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwLndhc0FsdGVyZWQoKSB8fCB0aGlzLl9saXN0Lndhc0FsdGVyZWQoKTtcbiAgICB9O1xuXG4gICAgT3JkZXJlZE1hcC5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHt2YXIgdGhpcyQwID0gdGhpcztcbiAgICAgIHJldHVybiB0aGlzLl9saXN0Ll9faXRlcmF0ZShcbiAgICAgICAgZnVuY3Rpb24oZW50cnkgKSB7cmV0dXJuIGVudHJ5ICYmIGZuKGVudHJ5WzFdLCBlbnRyeVswXSwgdGhpcyQwKX0sXG4gICAgICAgIHJldmVyc2VcbiAgICAgICk7XG4gICAgfTtcblxuICAgIE9yZGVyZWRNYXAucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbGlzdC5mcm9tRW50cnlTZXEoKS5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgIH07XG5cbiAgICBPcmRlcmVkTWFwLnByb3RvdHlwZS5fX2Vuc3VyZU93bmVyID0gZnVuY3Rpb24ob3duZXJJRCkge1xuICAgICAgaWYgKG93bmVySUQgPT09IHRoaXMuX19vd25lcklEKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgdmFyIG5ld01hcCA9IHRoaXMuX21hcC5fX2Vuc3VyZU93bmVyKG93bmVySUQpO1xuICAgICAgdmFyIG5ld0xpc3QgPSB0aGlzLl9saXN0Ll9fZW5zdXJlT3duZXIob3duZXJJRCk7XG4gICAgICBpZiAoIW93bmVySUQpIHtcbiAgICAgICAgdGhpcy5fX293bmVySUQgPSBvd25lcklEO1xuICAgICAgICB0aGlzLl9tYXAgPSBuZXdNYXA7XG4gICAgICAgIHRoaXMuX2xpc3QgPSBuZXdMaXN0O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYWtlT3JkZXJlZE1hcChuZXdNYXAsIG5ld0xpc3QsIG93bmVySUQsIHRoaXMuX19oYXNoKTtcbiAgICB9O1xuXG5cbiAgZnVuY3Rpb24gaXNPcmRlcmVkTWFwKG1heWJlT3JkZXJlZE1hcCkge1xuICAgIHJldHVybiBpc01hcChtYXliZU9yZGVyZWRNYXApICYmIGlzT3JkZXJlZChtYXliZU9yZGVyZWRNYXApO1xuICB9XG5cbiAgT3JkZXJlZE1hcC5pc09yZGVyZWRNYXAgPSBpc09yZGVyZWRNYXA7XG5cbiAgT3JkZXJlZE1hcC5wcm90b3R5cGVbSVNfT1JERVJFRF9TRU5USU5FTF0gPSB0cnVlO1xuICBPcmRlcmVkTWFwLnByb3RvdHlwZVtERUxFVEVdID0gT3JkZXJlZE1hcC5wcm90b3R5cGUucmVtb3ZlO1xuXG5cblxuICBmdW5jdGlvbiBtYWtlT3JkZXJlZE1hcChtYXAsIGxpc3QsIG93bmVySUQsIGhhc2gpIHtcbiAgICB2YXIgb21hcCA9IE9iamVjdC5jcmVhdGUoT3JkZXJlZE1hcC5wcm90b3R5cGUpO1xuICAgIG9tYXAuc2l6ZSA9IG1hcCA/IG1hcC5zaXplIDogMDtcbiAgICBvbWFwLl9tYXAgPSBtYXA7XG4gICAgb21hcC5fbGlzdCA9IGxpc3Q7XG4gICAgb21hcC5fX293bmVySUQgPSBvd25lcklEO1xuICAgIG9tYXAuX19oYXNoID0gaGFzaDtcbiAgICByZXR1cm4gb21hcDtcbiAgfVxuXG4gIHZhciBFTVBUWV9PUkRFUkVEX01BUDtcbiAgZnVuY3Rpb24gZW1wdHlPcmRlcmVkTWFwKCkge1xuICAgIHJldHVybiBFTVBUWV9PUkRFUkVEX01BUCB8fCAoRU1QVFlfT1JERVJFRF9NQVAgPSBtYWtlT3JkZXJlZE1hcChlbXB0eU1hcCgpLCBlbXB0eUxpc3QoKSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlT3JkZXJlZE1hcChvbWFwLCBrLCB2KSB7XG4gICAgdmFyIG1hcCA9IG9tYXAuX21hcDtcbiAgICB2YXIgbGlzdCA9IG9tYXAuX2xpc3Q7XG4gICAgdmFyIGkgPSBtYXAuZ2V0KGspO1xuICAgIHZhciBoYXMgPSBpICE9PSB1bmRlZmluZWQ7XG4gICAgdmFyIG5ld01hcDtcbiAgICB2YXIgbmV3TGlzdDtcbiAgICBpZiAodiA9PT0gTk9UX1NFVCkgeyAvLyByZW1vdmVkXG4gICAgICBpZiAoIWhhcykge1xuICAgICAgICByZXR1cm4gb21hcDtcbiAgICAgIH1cbiAgICAgIGlmIChsaXN0LnNpemUgPj0gU0laRSAmJiBsaXN0LnNpemUgPj0gbWFwLnNpemUgKiAyKSB7XG4gICAgICAgIG5ld0xpc3QgPSBsaXN0LmZpbHRlcihmdW5jdGlvbihlbnRyeSwgaWR4KSAge3JldHVybiBlbnRyeSAhPT0gdW5kZWZpbmVkICYmIGkgIT09IGlkeH0pO1xuICAgICAgICBuZXdNYXAgPSBuZXdMaXN0LnRvS2V5ZWRTZXEoKS5tYXAoZnVuY3Rpb24oZW50cnkgKSB7cmV0dXJuIGVudHJ5WzBdfSkuZmxpcCgpLnRvTWFwKCk7XG4gICAgICAgIGlmIChvbWFwLl9fb3duZXJJRCkge1xuICAgICAgICAgIG5ld01hcC5fX293bmVySUQgPSBuZXdMaXN0Ll9fb3duZXJJRCA9IG9tYXAuX19vd25lcklEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdNYXAgPSBtYXAucmVtb3ZlKGspO1xuICAgICAgICBuZXdMaXN0ID0gaSA9PT0gbGlzdC5zaXplIC0gMSA/IGxpc3QucG9wKCkgOiBsaXN0LnNldChpLCB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaGFzKSB7XG4gICAgICAgIGlmICh2ID09PSBsaXN0LmdldChpKVsxXSkge1xuICAgICAgICAgIHJldHVybiBvbWFwO1xuICAgICAgICB9XG4gICAgICAgIG5ld01hcCA9IG1hcDtcbiAgICAgICAgbmV3TGlzdCA9IGxpc3Quc2V0KGksIFtrLCB2XSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXdNYXAgPSBtYXAuc2V0KGssIGxpc3Quc2l6ZSk7XG4gICAgICAgIG5ld0xpc3QgPSBsaXN0LnNldChsaXN0LnNpemUsIFtrLCB2XSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvbWFwLl9fb3duZXJJRCkge1xuICAgICAgb21hcC5zaXplID0gbmV3TWFwLnNpemU7XG4gICAgICBvbWFwLl9tYXAgPSBuZXdNYXA7XG4gICAgICBvbWFwLl9saXN0ID0gbmV3TGlzdDtcbiAgICAgIG9tYXAuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIG9tYXA7XG4gICAgfVxuICAgIHJldHVybiBtYWtlT3JkZXJlZE1hcChuZXdNYXAsIG5ld0xpc3QpO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoVG9LZXllZFNlcXVlbmNlLCBLZXllZFNlcSk7XG4gICAgZnVuY3Rpb24gVG9LZXllZFNlcXVlbmNlKGluZGV4ZWQsIHVzZUtleXMpIHtcbiAgICAgIHRoaXMuX2l0ZXIgPSBpbmRleGVkO1xuICAgICAgdGhpcy5fdXNlS2V5cyA9IHVzZUtleXM7XG4gICAgICB0aGlzLnNpemUgPSBpbmRleGVkLnNpemU7XG4gICAgfVxuXG4gICAgVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihrZXksIG5vdFNldFZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5faXRlci5nZXQoa2V5LCBub3RTZXRWYWx1ZSk7XG4gICAgfTtcblxuICAgIFRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5faXRlci5oYXMoa2V5KTtcbiAgICB9O1xuXG4gICAgVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZS52YWx1ZVNlcSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2l0ZXIudmFsdWVTZXEoKTtcbiAgICB9O1xuXG4gICAgVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZS5yZXZlcnNlID0gZnVuY3Rpb24oKSB7dmFyIHRoaXMkMCA9IHRoaXM7XG4gICAgICB2YXIgcmV2ZXJzZWRTZXF1ZW5jZSA9IHJldmVyc2VGYWN0b3J5KHRoaXMsIHRydWUpO1xuICAgICAgaWYgKCF0aGlzLl91c2VLZXlzKSB7XG4gICAgICAgIHJldmVyc2VkU2VxdWVuY2UudmFsdWVTZXEgPSBmdW5jdGlvbigpICB7cmV0dXJuIHRoaXMkMC5faXRlci50b1NlcSgpLnJldmVyc2UoKX07XG4gICAgICB9XG4gICAgICByZXR1cm4gcmV2ZXJzZWRTZXF1ZW5jZTtcbiAgICB9O1xuXG4gICAgVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZS5tYXAgPSBmdW5jdGlvbihtYXBwZXIsIGNvbnRleHQpIHt2YXIgdGhpcyQwID0gdGhpcztcbiAgICAgIHZhciBtYXBwZWRTZXF1ZW5jZSA9IG1hcEZhY3RvcnkodGhpcywgbWFwcGVyLCBjb250ZXh0KTtcbiAgICAgIGlmICghdGhpcy5fdXNlS2V5cykge1xuICAgICAgICBtYXBwZWRTZXF1ZW5jZS52YWx1ZVNlcSA9IGZ1bmN0aW9uKCkgIHtyZXR1cm4gdGhpcyQwLl9pdGVyLnRvU2VxKCkubWFwKG1hcHBlciwgY29udGV4dCl9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1hcHBlZFNlcXVlbmNlO1xuICAgIH07XG5cbiAgICBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7dmFyIHRoaXMkMCA9IHRoaXM7XG4gICAgICB2YXIgaWk7XG4gICAgICByZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdGUoXG4gICAgICAgIHRoaXMuX3VzZUtleXMgP1xuICAgICAgICAgIGZ1bmN0aW9uKHYsIGspICB7cmV0dXJuIGZuKHYsIGssIHRoaXMkMCl9IDpcbiAgICAgICAgICAoKGlpID0gcmV2ZXJzZSA/IHJlc29sdmVTaXplKHRoaXMpIDogMCksXG4gICAgICAgICAgICBmdW5jdGlvbih2ICkge3JldHVybiBmbih2LCByZXZlcnNlID8gLS1paSA6IGlpKyssIHRoaXMkMCl9KSxcbiAgICAgICAgcmV2ZXJzZVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgICAgaWYgKHRoaXMuX3VzZUtleXMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZXIuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBpdGVyYXRvciA9IHRoaXMuX2l0ZXIuX19pdGVyYXRvcihJVEVSQVRFX1ZBTFVFUywgcmV2ZXJzZSk7XG4gICAgICB2YXIgaWkgPSByZXZlcnNlID8gcmVzb2x2ZVNpemUodGhpcykgOiAwO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbigpICB7XG4gICAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICByZXR1cm4gc3RlcC5kb25lID8gc3RlcCA6XG4gICAgICAgICAgaXRlcmF0b3JWYWx1ZSh0eXBlLCByZXZlcnNlID8gLS1paSA6IGlpKyssIHN0ZXAudmFsdWUsIHN0ZXApO1xuICAgICAgfSk7XG4gICAgfTtcblxuICBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlW0lTX09SREVSRURfU0VOVElORUxdID0gdHJ1ZTtcblxuXG4gIGNyZWF0ZUNsYXNzKFRvSW5kZXhlZFNlcXVlbmNlLCBJbmRleGVkU2VxKTtcbiAgICBmdW5jdGlvbiBUb0luZGV4ZWRTZXF1ZW5jZShpdGVyKSB7XG4gICAgICB0aGlzLl9pdGVyID0gaXRlcjtcbiAgICAgIHRoaXMuc2l6ZSA9IGl0ZXIuc2l6ZTtcbiAgICB9XG5cbiAgICBUb0luZGV4ZWRTZXF1ZW5jZS5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2l0ZXIuaW5jbHVkZXModmFsdWUpO1xuICAgIH07XG5cbiAgICBUb0luZGV4ZWRTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHt2YXIgdGhpcyQwID0gdGhpcztcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHJldHVybiB0aGlzLl9pdGVyLl9faXRlcmF0ZShmdW5jdGlvbih2ICkge3JldHVybiBmbih2LCBpdGVyYXRpb25zKyssIHRoaXMkMCl9LCByZXZlcnNlKTtcbiAgICB9O1xuXG4gICAgVG9JbmRleGVkU2VxdWVuY2UucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgICB2YXIgaXRlcmF0b3IgPSB0aGlzLl9pdGVyLl9faXRlcmF0b3IoSVRFUkFURV9WQUxVRVMsIHJldmVyc2UpO1xuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbigpICB7XG4gICAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICByZXR1cm4gc3RlcC5kb25lID8gc3RlcCA6XG4gICAgICAgICAgaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zKyssIHN0ZXAudmFsdWUsIHN0ZXApXG4gICAgICB9KTtcbiAgICB9O1xuXG5cblxuICBjcmVhdGVDbGFzcyhUb1NldFNlcXVlbmNlLCBTZXRTZXEpO1xuICAgIGZ1bmN0aW9uIFRvU2V0U2VxdWVuY2UoaXRlcikge1xuICAgICAgdGhpcy5faXRlciA9IGl0ZXI7XG4gICAgICB0aGlzLnNpemUgPSBpdGVyLnNpemU7XG4gICAgfVxuXG4gICAgVG9TZXRTZXF1ZW5jZS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5faXRlci5pbmNsdWRlcyhrZXkpO1xuICAgIH07XG5cbiAgICBUb1NldFNlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge3ZhciB0aGlzJDAgPSB0aGlzO1xuICAgICAgcmV0dXJuIHRoaXMuX2l0ZXIuX19pdGVyYXRlKGZ1bmN0aW9uKHYgKSB7cmV0dXJuIGZuKHYsIHYsIHRoaXMkMCl9LCByZXZlcnNlKTtcbiAgICB9O1xuXG4gICAgVG9TZXRTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uKHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIHZhciBpdGVyYXRvciA9IHRoaXMuX2l0ZXIuX19pdGVyYXRvcihJVEVSQVRFX1ZBTFVFUywgcmV2ZXJzZSk7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkgIHtcbiAgICAgICAgdmFyIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIHJldHVybiBzdGVwLmRvbmUgPyBzdGVwIDpcbiAgICAgICAgICBpdGVyYXRvclZhbHVlKHR5cGUsIHN0ZXAudmFsdWUsIHN0ZXAudmFsdWUsIHN0ZXApO1xuICAgICAgfSk7XG4gICAgfTtcblxuXG5cbiAgY3JlYXRlQ2xhc3MoRnJvbUVudHJpZXNTZXF1ZW5jZSwgS2V5ZWRTZXEpO1xuICAgIGZ1bmN0aW9uIEZyb21FbnRyaWVzU2VxdWVuY2UoZW50cmllcykge1xuICAgICAgdGhpcy5faXRlciA9IGVudHJpZXM7XG4gICAgICB0aGlzLnNpemUgPSBlbnRyaWVzLnNpemU7XG4gICAgfVxuXG4gICAgRnJvbUVudHJpZXNTZXF1ZW5jZS5wcm90b3R5cGUuZW50cnlTZXEgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pdGVyLnRvU2VxKCk7XG4gICAgfTtcblxuICAgIEZyb21FbnRyaWVzU2VxdWVuY2UucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7dmFyIHRoaXMkMCA9IHRoaXM7XG4gICAgICByZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdGUoZnVuY3Rpb24oZW50cnkgKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIGVudHJ5IGV4aXN0cyBmaXJzdCBzbyBhcnJheSBhY2Nlc3MgZG9lc24ndCB0aHJvdyBmb3IgaG9sZXNcbiAgICAgICAgLy8gaW4gdGhlIHBhcmVudCBpdGVyYXRpb24uXG4gICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgIHZhbGlkYXRlRW50cnkoZW50cnkpO1xuICAgICAgICAgIHZhciBpbmRleGVkSXRlcmFibGUgPSBpc0l0ZXJhYmxlKGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gZm4oXG4gICAgICAgICAgICBpbmRleGVkSXRlcmFibGUgPyBlbnRyeS5nZXQoMSkgOiBlbnRyeVsxXSxcbiAgICAgICAgICAgIGluZGV4ZWRJdGVyYWJsZSA/IGVudHJ5LmdldCgwKSA6IGVudHJ5WzBdLFxuICAgICAgICAgICAgdGhpcyQwXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSwgcmV2ZXJzZSk7XG4gICAgfTtcblxuICAgIEZyb21FbnRyaWVzU2VxdWVuY2UucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgICB2YXIgaXRlcmF0b3IgPSB0aGlzLl9pdGVyLl9faXRlcmF0b3IoSVRFUkFURV9WQUxVRVMsIHJldmVyc2UpO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbigpICB7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgdmFyIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgZW50cnkgZXhpc3RzIGZpcnN0IHNvIGFycmF5IGFjY2VzcyBkb2Vzbid0IHRocm93IGZvciBob2xlc1xuICAgICAgICAgIC8vIGluIHRoZSBwYXJlbnQgaXRlcmF0aW9uLlxuICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgdmFsaWRhdGVFbnRyeShlbnRyeSk7XG4gICAgICAgICAgICB2YXIgaW5kZXhlZEl0ZXJhYmxlID0gaXNJdGVyYWJsZShlbnRyeSk7XG4gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZShcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgaW5kZXhlZEl0ZXJhYmxlID8gZW50cnkuZ2V0KDApIDogZW50cnlbMF0sXG4gICAgICAgICAgICAgIGluZGV4ZWRJdGVyYWJsZSA/IGVudHJ5LmdldCgxKSA6IGVudHJ5WzFdLFxuICAgICAgICAgICAgICBzdGVwXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuXG4gIFRvSW5kZXhlZFNlcXVlbmNlLnByb3RvdHlwZS5jYWNoZVJlc3VsdCA9XG4gIFRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGUuY2FjaGVSZXN1bHQgPVxuICBUb1NldFNlcXVlbmNlLnByb3RvdHlwZS5jYWNoZVJlc3VsdCA9XG4gIEZyb21FbnRyaWVzU2VxdWVuY2UucHJvdG90eXBlLmNhY2hlUmVzdWx0ID1cbiAgICBjYWNoZVJlc3VsdFRocm91Z2g7XG5cblxuICBmdW5jdGlvbiBmbGlwRmFjdG9yeShpdGVyYWJsZSkge1xuICAgIHZhciBmbGlwU2VxdWVuY2UgPSBtYWtlU2VxdWVuY2UoaXRlcmFibGUpO1xuICAgIGZsaXBTZXF1ZW5jZS5faXRlciA9IGl0ZXJhYmxlO1xuICAgIGZsaXBTZXF1ZW5jZS5zaXplID0gaXRlcmFibGUuc2l6ZTtcbiAgICBmbGlwU2VxdWVuY2UuZmxpcCA9IGZ1bmN0aW9uKCkgIHtyZXR1cm4gaXRlcmFibGV9O1xuICAgIGZsaXBTZXF1ZW5jZS5yZXZlcnNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJldmVyc2VkU2VxdWVuY2UgPSBpdGVyYWJsZS5yZXZlcnNlLmFwcGx5KHRoaXMpOyAvLyBzdXBlci5yZXZlcnNlKClcbiAgICAgIHJldmVyc2VkU2VxdWVuY2UuZmxpcCA9IGZ1bmN0aW9uKCkgIHtyZXR1cm4gaXRlcmFibGUucmV2ZXJzZSgpfTtcbiAgICAgIHJldHVybiByZXZlcnNlZFNlcXVlbmNlO1xuICAgIH07XG4gICAgZmxpcFNlcXVlbmNlLmhhcyA9IGZ1bmN0aW9uKGtleSApIHtyZXR1cm4gaXRlcmFibGUuaW5jbHVkZXMoa2V5KX07XG4gICAgZmxpcFNlcXVlbmNlLmluY2x1ZGVzID0gZnVuY3Rpb24oa2V5ICkge3JldHVybiBpdGVyYWJsZS5oYXMoa2V5KX07XG4gICAgZmxpcFNlcXVlbmNlLmNhY2hlUmVzdWx0ID0gY2FjaGVSZXN1bHRUaHJvdWdoO1xuICAgIGZsaXBTZXF1ZW5jZS5fX2l0ZXJhdGVVbmNhY2hlZCA9IGZ1bmN0aW9uIChmbiwgcmV2ZXJzZSkge3ZhciB0aGlzJDAgPSB0aGlzO1xuICAgICAgcmV0dXJuIGl0ZXJhYmxlLl9faXRlcmF0ZShmdW5jdGlvbih2LCBrKSAge3JldHVybiBmbihrLCB2LCB0aGlzJDApICE9PSBmYWxzZX0sIHJldmVyc2UpO1xuICAgIH1cbiAgICBmbGlwU2VxdWVuY2UuX19pdGVyYXRvclVuY2FjaGVkID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgICAgaWYgKHR5cGUgPT09IElURVJBVEVfRU5UUklFUykge1xuICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYWJsZS5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkgIHtcbiAgICAgICAgICB2YXIgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBpZiAoIXN0ZXAuZG9uZSkge1xuICAgICAgICAgICAgdmFyIGsgPSBzdGVwLnZhbHVlWzBdO1xuICAgICAgICAgICAgc3RlcC52YWx1ZVswXSA9IHN0ZXAudmFsdWVbMV07XG4gICAgICAgICAgICBzdGVwLnZhbHVlWzFdID0gaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZXJhYmxlLl9faXRlcmF0b3IoXG4gICAgICAgIHR5cGUgPT09IElURVJBVEVfVkFMVUVTID8gSVRFUkFURV9LRVlTIDogSVRFUkFURV9WQUxVRVMsXG4gICAgICAgIHJldmVyc2VcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBmbGlwU2VxdWVuY2U7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIG1hcEZhY3RvcnkoaXRlcmFibGUsIG1hcHBlciwgY29udGV4dCkge1xuICAgIHZhciBtYXBwZWRTZXF1ZW5jZSA9IG1ha2VTZXF1ZW5jZShpdGVyYWJsZSk7XG4gICAgbWFwcGVkU2VxdWVuY2Uuc2l6ZSA9IGl0ZXJhYmxlLnNpemU7XG4gICAgbWFwcGVkU2VxdWVuY2UuaGFzID0gZnVuY3Rpb24oa2V5ICkge3JldHVybiBpdGVyYWJsZS5oYXMoa2V5KX07XG4gICAgbWFwcGVkU2VxdWVuY2UuZ2V0ID0gZnVuY3Rpb24oa2V5LCBub3RTZXRWYWx1ZSkgIHtcbiAgICAgIHZhciB2ID0gaXRlcmFibGUuZ2V0KGtleSwgTk9UX1NFVCk7XG4gICAgICByZXR1cm4gdiA9PT0gTk9UX1NFVCA/XG4gICAgICAgIG5vdFNldFZhbHVlIDpcbiAgICAgICAgbWFwcGVyLmNhbGwoY29udGV4dCwgdiwga2V5LCBpdGVyYWJsZSk7XG4gICAgfTtcbiAgICBtYXBwZWRTZXF1ZW5jZS5fX2l0ZXJhdGVVbmNhY2hlZCA9IGZ1bmN0aW9uIChmbiwgcmV2ZXJzZSkge3ZhciB0aGlzJDAgPSB0aGlzO1xuICAgICAgcmV0dXJuIGl0ZXJhYmxlLl9faXRlcmF0ZShcbiAgICAgICAgZnVuY3Rpb24odiwgaywgYykgIHtyZXR1cm4gZm4obWFwcGVyLmNhbGwoY29udGV4dCwgdiwgaywgYyksIGssIHRoaXMkMCkgIT09IGZhbHNlfSxcbiAgICAgICAgcmV2ZXJzZVxuICAgICAgKTtcbiAgICB9XG4gICAgbWFwcGVkU2VxdWVuY2UuX19pdGVyYXRvclVuY2FjaGVkID0gZnVuY3Rpb24gKHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhYmxlLl9faXRlcmF0b3IoSVRFUkFURV9FTlRSSUVTLCByZXZlcnNlKTtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24oKSAge1xuICAgICAgICB2YXIgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgIHZhciBrZXkgPSBlbnRyeVswXTtcbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVmFsdWUoXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgbWFwcGVyLmNhbGwoY29udGV4dCwgZW50cnlbMV0sIGtleSwgaXRlcmFibGUpLFxuICAgICAgICAgIHN0ZXBcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbWFwcGVkU2VxdWVuY2U7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIHJldmVyc2VGYWN0b3J5KGl0ZXJhYmxlLCB1c2VLZXlzKSB7XG4gICAgdmFyIHJldmVyc2VkU2VxdWVuY2UgPSBtYWtlU2VxdWVuY2UoaXRlcmFibGUpO1xuICAgIHJldmVyc2VkU2VxdWVuY2UuX2l0ZXIgPSBpdGVyYWJsZTtcbiAgICByZXZlcnNlZFNlcXVlbmNlLnNpemUgPSBpdGVyYWJsZS5zaXplO1xuICAgIHJldmVyc2VkU2VxdWVuY2UucmV2ZXJzZSA9IGZ1bmN0aW9uKCkgIHtyZXR1cm4gaXRlcmFibGV9O1xuICAgIGlmIChpdGVyYWJsZS5mbGlwKSB7XG4gICAgICByZXZlcnNlZFNlcXVlbmNlLmZsaXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBmbGlwU2VxdWVuY2UgPSBmbGlwRmFjdG9yeShpdGVyYWJsZSk7XG4gICAgICAgIGZsaXBTZXF1ZW5jZS5yZXZlcnNlID0gZnVuY3Rpb24oKSAge3JldHVybiBpdGVyYWJsZS5mbGlwKCl9O1xuICAgICAgICByZXR1cm4gZmxpcFNlcXVlbmNlO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV2ZXJzZWRTZXF1ZW5jZS5nZXQgPSBmdW5jdGlvbihrZXksIG5vdFNldFZhbHVlKSBcbiAgICAgIHtyZXR1cm4gaXRlcmFibGUuZ2V0KHVzZUtleXMgPyBrZXkgOiAtMSAtIGtleSwgbm90U2V0VmFsdWUpfTtcbiAgICByZXZlcnNlZFNlcXVlbmNlLmhhcyA9IGZ1bmN0aW9uKGtleSApXG4gICAgICB7cmV0dXJuIGl0ZXJhYmxlLmhhcyh1c2VLZXlzID8ga2V5IDogLTEgLSBrZXkpfTtcbiAgICByZXZlcnNlZFNlcXVlbmNlLmluY2x1ZGVzID0gZnVuY3Rpb24odmFsdWUgKSB7cmV0dXJuIGl0ZXJhYmxlLmluY2x1ZGVzKHZhbHVlKX07XG4gICAgcmV2ZXJzZWRTZXF1ZW5jZS5jYWNoZVJlc3VsdCA9IGNhY2hlUmVzdWx0VGhyb3VnaDtcbiAgICByZXZlcnNlZFNlcXVlbmNlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uIChmbiwgcmV2ZXJzZSkge3ZhciB0aGlzJDAgPSB0aGlzO1xuICAgICAgcmV0dXJuIGl0ZXJhYmxlLl9faXRlcmF0ZShmdW5jdGlvbih2LCBrKSAge3JldHVybiBmbih2LCBrLCB0aGlzJDApfSwgIXJldmVyc2UpO1xuICAgIH07XG4gICAgcmV2ZXJzZWRTZXF1ZW5jZS5fX2l0ZXJhdG9yID1cbiAgICAgIGZ1bmN0aW9uKHR5cGUsIHJldmVyc2UpICB7cmV0dXJuIGl0ZXJhYmxlLl9faXRlcmF0b3IodHlwZSwgIXJldmVyc2UpfTtcbiAgICByZXR1cm4gcmV2ZXJzZWRTZXF1ZW5jZTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gZmlsdGVyRmFjdG9yeShpdGVyYWJsZSwgcHJlZGljYXRlLCBjb250ZXh0LCB1c2VLZXlzKSB7XG4gICAgdmFyIGZpbHRlclNlcXVlbmNlID0gbWFrZVNlcXVlbmNlKGl0ZXJhYmxlKTtcbiAgICBpZiAodXNlS2V5cykge1xuICAgICAgZmlsdGVyU2VxdWVuY2UuaGFzID0gZnVuY3Rpb24oa2V5ICkge1xuICAgICAgICB2YXIgdiA9IGl0ZXJhYmxlLmdldChrZXksIE5PVF9TRVQpO1xuICAgICAgICByZXR1cm4gdiAhPT0gTk9UX1NFVCAmJiAhIXByZWRpY2F0ZS5jYWxsKGNvbnRleHQsIHYsIGtleSwgaXRlcmFibGUpO1xuICAgICAgfTtcbiAgICAgIGZpbHRlclNlcXVlbmNlLmdldCA9IGZ1bmN0aW9uKGtleSwgbm90U2V0VmFsdWUpICB7XG4gICAgICAgIHZhciB2ID0gaXRlcmFibGUuZ2V0KGtleSwgTk9UX1NFVCk7XG4gICAgICAgIHJldHVybiB2ICE9PSBOT1RfU0VUICYmIHByZWRpY2F0ZS5jYWxsKGNvbnRleHQsIHYsIGtleSwgaXRlcmFibGUpID9cbiAgICAgICAgICB2IDogbm90U2V0VmFsdWU7XG4gICAgICB9O1xuICAgIH1cbiAgICBmaWx0ZXJTZXF1ZW5jZS5fX2l0ZXJhdGVVbmNhY2hlZCA9IGZ1bmN0aW9uIChmbiwgcmV2ZXJzZSkge3ZhciB0aGlzJDAgPSB0aGlzO1xuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgaXRlcmFibGUuX19pdGVyYXRlKGZ1bmN0aW9uKHYsIGssIGMpICB7XG4gICAgICAgIGlmIChwcmVkaWNhdGUuY2FsbChjb250ZXh0LCB2LCBrLCBjKSkge1xuICAgICAgICAgIGl0ZXJhdGlvbnMrKztcbiAgICAgICAgICByZXR1cm4gZm4odiwgdXNlS2V5cyA/IGsgOiBpdGVyYXRpb25zIC0gMSwgdGhpcyQwKTtcbiAgICAgICAgfVxuICAgICAgfSwgcmV2ZXJzZSk7XG4gICAgICByZXR1cm4gaXRlcmF0aW9ucztcbiAgICB9O1xuICAgIGZpbHRlclNlcXVlbmNlLl9faXRlcmF0b3JVbmNhY2hlZCA9IGZ1bmN0aW9uICh0eXBlLCByZXZlcnNlKSB7XG4gICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYWJsZS5fX2l0ZXJhdG9yKElURVJBVEVfRU5UUklFUywgcmV2ZXJzZSk7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkgIHtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICB2YXIgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICB2YXIga2V5ID0gZW50cnlbMF07XG4gICAgICAgICAgdmFyIHZhbHVlID0gZW50cnlbMV07XG4gICAgICAgICAgaWYgKHByZWRpY2F0ZS5jYWxsKGNvbnRleHQsIHZhbHVlLCBrZXksIGl0ZXJhYmxlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVmFsdWUodHlwZSwgdXNlS2V5cyA/IGtleSA6IGl0ZXJhdGlvbnMrKywgdmFsdWUsIHN0ZXApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmaWx0ZXJTZXF1ZW5jZTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gY291bnRCeUZhY3RvcnkoaXRlcmFibGUsIGdyb3VwZXIsIGNvbnRleHQpIHtcbiAgICB2YXIgZ3JvdXBzID0gTWFwKCkuYXNNdXRhYmxlKCk7XG4gICAgaXRlcmFibGUuX19pdGVyYXRlKGZ1bmN0aW9uKHYsIGspICB7XG4gICAgICBncm91cHMudXBkYXRlKFxuICAgICAgICBncm91cGVyLmNhbGwoY29udGV4dCwgdiwgaywgaXRlcmFibGUpLFxuICAgICAgICAwLFxuICAgICAgICBmdW5jdGlvbihhICkge3JldHVybiBhICsgMX1cbiAgICAgICk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGdyb3Vwcy5hc0ltbXV0YWJsZSgpO1xuICB9XG5cblxuICBmdW5jdGlvbiBncm91cEJ5RmFjdG9yeShpdGVyYWJsZSwgZ3JvdXBlciwgY29udGV4dCkge1xuICAgIHZhciBpc0tleWVkSXRlciA9IGlzS2V5ZWQoaXRlcmFibGUpO1xuICAgIHZhciBncm91cHMgPSAoaXNPcmRlcmVkKGl0ZXJhYmxlKSA/IE9yZGVyZWRNYXAoKSA6IE1hcCgpKS5hc011dGFibGUoKTtcbiAgICBpdGVyYWJsZS5fX2l0ZXJhdGUoZnVuY3Rpb24odiwgaykgIHtcbiAgICAgIGdyb3Vwcy51cGRhdGUoXG4gICAgICAgIGdyb3VwZXIuY2FsbChjb250ZXh0LCB2LCBrLCBpdGVyYWJsZSksXG4gICAgICAgIGZ1bmN0aW9uKGEgKSB7cmV0dXJuIChhID0gYSB8fCBbXSwgYS5wdXNoKGlzS2V5ZWRJdGVyID8gW2ssIHZdIDogdiksIGEpfVxuICAgICAgKTtcbiAgICB9KTtcbiAgICB2YXIgY29lcmNlID0gaXRlcmFibGVDbGFzcyhpdGVyYWJsZSk7XG4gICAgcmV0dXJuIGdyb3Vwcy5tYXAoZnVuY3Rpb24oYXJyICkge3JldHVybiByZWlmeShpdGVyYWJsZSwgY29lcmNlKGFycikpfSk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIHNsaWNlRmFjdG9yeShpdGVyYWJsZSwgYmVnaW4sIGVuZCwgdXNlS2V5cykge1xuICAgIHZhciBvcmlnaW5hbFNpemUgPSBpdGVyYWJsZS5zaXplO1xuXG4gICAgLy8gU2FuaXRpemUgYmVnaW4gJiBlbmQgdXNpbmcgdGhpcyBzaG9ydGhhbmQgZm9yIFRvSW50MzIoYXJndW1lbnQpXG4gICAgLy8gaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXRvaW50MzJcbiAgICBpZiAoYmVnaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgYmVnaW4gPSBiZWdpbiB8IDA7XG4gICAgfVxuICAgIGlmIChlbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGVuZCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgZW5kID0gb3JpZ2luYWxTaXplO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW5kID0gZW5kIHwgMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod2hvbGVTbGljZShiZWdpbiwgZW5kLCBvcmlnaW5hbFNpemUpKSB7XG4gICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgfVxuXG4gICAgdmFyIHJlc29sdmVkQmVnaW4gPSByZXNvbHZlQmVnaW4oYmVnaW4sIG9yaWdpbmFsU2l6ZSk7XG4gICAgdmFyIHJlc29sdmVkRW5kID0gcmVzb2x2ZUVuZChlbmQsIG9yaWdpbmFsU2l6ZSk7XG5cbiAgICAvLyBiZWdpbiBvciBlbmQgd2lsbCBiZSBOYU4gaWYgdGhleSB3ZXJlIHByb3ZpZGVkIGFzIG5lZ2F0aXZlIG51bWJlcnMgYW5kXG4gICAgLy8gdGhpcyBpdGVyYWJsZSdzIHNpemUgaXMgdW5rbm93bi4gSW4gdGhhdCBjYXNlLCBjYWNoZSBmaXJzdCBzbyB0aGVyZSBpc1xuICAgIC8vIGEga25vd24gc2l6ZSBhbmQgdGhlc2UgZG8gbm90IHJlc29sdmUgdG8gTmFOLlxuICAgIGlmIChyZXNvbHZlZEJlZ2luICE9PSByZXNvbHZlZEJlZ2luIHx8IHJlc29sdmVkRW5kICE9PSByZXNvbHZlZEVuZCkge1xuICAgICAgcmV0dXJuIHNsaWNlRmFjdG9yeShpdGVyYWJsZS50b1NlcSgpLmNhY2hlUmVzdWx0KCksIGJlZ2luLCBlbmQsIHVzZUtleXMpO1xuICAgIH1cblxuICAgIC8vIE5vdGU6IHJlc29sdmVkRW5kIGlzIHVuZGVmaW5lZCB3aGVuIHRoZSBvcmlnaW5hbCBzZXF1ZW5jZSdzIGxlbmd0aCBpc1xuICAgIC8vIHVua25vd24gYW5kIHRoaXMgc2xpY2UgZGlkIG5vdCBzdXBwbHkgYW4gZW5kIGFuZCBzaG91bGQgY29udGFpbiBhbGxcbiAgICAvLyBlbGVtZW50cyBhZnRlciByZXNvbHZlZEJlZ2luLlxuICAgIC8vIEluIHRoYXQgY2FzZSwgcmVzb2x2ZWRTaXplIHdpbGwgYmUgTmFOIGFuZCBzbGljZVNpemUgd2lsbCByZW1haW4gdW5kZWZpbmVkLlxuICAgIHZhciByZXNvbHZlZFNpemUgPSByZXNvbHZlZEVuZCAtIHJlc29sdmVkQmVnaW47XG4gICAgdmFyIHNsaWNlU2l6ZTtcbiAgICBpZiAocmVzb2x2ZWRTaXplID09PSByZXNvbHZlZFNpemUpIHtcbiAgICAgIHNsaWNlU2l6ZSA9IHJlc29sdmVkU2l6ZSA8IDAgPyAwIDogcmVzb2x2ZWRTaXplO1xuICAgIH1cblxuICAgIHZhciBzbGljZVNlcSA9IG1ha2VTZXF1ZW5jZShpdGVyYWJsZSk7XG5cbiAgICAvLyBJZiBpdGVyYWJsZS5zaXplIGlzIHVuZGVmaW5lZCwgdGhlIHNpemUgb2YgdGhlIHJlYWxpemVkIHNsaWNlU2VxIGlzXG4gICAgLy8gdW5rbm93biBhdCB0aGlzIHBvaW50IHVubGVzcyB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRvIHNsaWNlIGlzIDBcbiAgICBzbGljZVNlcS5zaXplID0gc2xpY2VTaXplID09PSAwID8gc2xpY2VTaXplIDogaXRlcmFibGUuc2l6ZSAmJiBzbGljZVNpemUgfHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKCF1c2VLZXlzICYmIGlzU2VxKGl0ZXJhYmxlKSAmJiBzbGljZVNpemUgPj0gMCkge1xuICAgICAgc2xpY2VTZXEuZ2V0ID0gZnVuY3Rpb24gKGluZGV4LCBub3RTZXRWYWx1ZSkge1xuICAgICAgICBpbmRleCA9IHdyYXBJbmRleCh0aGlzLCBpbmRleCk7XG4gICAgICAgIHJldHVybiBpbmRleCA+PSAwICYmIGluZGV4IDwgc2xpY2VTaXplID9cbiAgICAgICAgICBpdGVyYWJsZS5nZXQoaW5kZXggKyByZXNvbHZlZEJlZ2luLCBub3RTZXRWYWx1ZSkgOlxuICAgICAgICAgIG5vdFNldFZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNsaWNlU2VxLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHt2YXIgdGhpcyQwID0gdGhpcztcbiAgICAgIGlmIChzbGljZVNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShmbiwgcmV2ZXJzZSk7XG4gICAgICB9XG4gICAgICB2YXIgc2tpcHBlZCA9IDA7XG4gICAgICB2YXIgaXNTa2lwcGluZyA9IHRydWU7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICBpdGVyYWJsZS5fX2l0ZXJhdGUoZnVuY3Rpb24odiwgaykgIHtcbiAgICAgICAgaWYgKCEoaXNTa2lwcGluZyAmJiAoaXNTa2lwcGluZyA9IHNraXBwZWQrKyA8IHJlc29sdmVkQmVnaW4pKSkge1xuICAgICAgICAgIGl0ZXJhdGlvbnMrKztcbiAgICAgICAgICByZXR1cm4gZm4odiwgdXNlS2V5cyA/IGsgOiBpdGVyYXRpb25zIC0gMSwgdGhpcyQwKSAhPT0gZmFsc2UgJiZcbiAgICAgICAgICAgICAgICAgaXRlcmF0aW9ucyAhPT0gc2xpY2VTaXplO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBpdGVyYXRpb25zO1xuICAgIH07XG5cbiAgICBzbGljZVNlcS5fX2l0ZXJhdG9yVW5jYWNoZWQgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgICBpZiAoc2xpY2VTaXplICE9PSAwICYmIHJldmVyc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgYm90aGVyIGluc3RhbnRpYXRpbmcgcGFyZW50IGl0ZXJhdG9yIGlmIHRha2luZyAwLlxuICAgICAgdmFyIGl0ZXJhdG9yID0gc2xpY2VTaXplICE9PSAwICYmIGl0ZXJhYmxlLl9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gICAgICB2YXIgc2tpcHBlZCA9IDA7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkgIHtcbiAgICAgICAgd2hpbGUgKHNraXBwZWQrKyA8IHJlc29sdmVkQmVnaW4pIHtcbiAgICAgICAgICBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCsraXRlcmF0aW9ucyA+IHNsaWNlU2l6ZSkge1xuICAgICAgICAgIHJldHVybiBpdGVyYXRvckRvbmUoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgaWYgKHVzZUtleXMgfHwgdHlwZSA9PT0gSVRFUkFURV9WQUxVRVMpIHtcbiAgICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBJVEVSQVRFX0tFWVMpIHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zIC0gMSwgdW5kZWZpbmVkLCBzdGVwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zIC0gMSwgc3RlcC52YWx1ZVsxXSwgc3RlcCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBzbGljZVNlcTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gdGFrZVdoaWxlRmFjdG9yeShpdGVyYWJsZSwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIHRha2VTZXF1ZW5jZSA9IG1ha2VTZXF1ZW5jZShpdGVyYWJsZSk7XG4gICAgdGFrZVNlcXVlbmNlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHt2YXIgdGhpcyQwID0gdGhpcztcbiAgICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRlKGZuLCByZXZlcnNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIGl0ZXJhYmxlLl9faXRlcmF0ZShmdW5jdGlvbih2LCBrLCBjKSBcbiAgICAgICAge3JldHVybiBwcmVkaWNhdGUuY2FsbChjb250ZXh0LCB2LCBrLCBjKSAmJiArK2l0ZXJhdGlvbnMgJiYgZm4odiwgaywgdGhpcyQwKX1cbiAgICAgICk7XG4gICAgICByZXR1cm4gaXRlcmF0aW9ucztcbiAgICB9O1xuICAgIHRha2VTZXF1ZW5jZS5fX2l0ZXJhdG9yVW5jYWNoZWQgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7dmFyIHRoaXMkMCA9IHRoaXM7XG4gICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gICAgICB9XG4gICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYWJsZS5fX2l0ZXJhdG9yKElURVJBVEVfRU5UUklFUywgcmV2ZXJzZSk7XG4gICAgICB2YXIgaXRlcmF0aW5nID0gdHJ1ZTtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24oKSAge1xuICAgICAgICBpZiAoIWl0ZXJhdGluZykge1xuICAgICAgICAgIHJldHVybiBpdGVyYXRvckRvbmUoKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgIHZhciBrID0gZW50cnlbMF07XG4gICAgICAgIHZhciB2ID0gZW50cnlbMV07XG4gICAgICAgIGlmICghcHJlZGljYXRlLmNhbGwoY29udGV4dCwgdiwgaywgdGhpcyQwKSkge1xuICAgICAgICAgIGl0ZXJhdGluZyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBpdGVyYXRvckRvbmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZSA9PT0gSVRFUkFURV9FTlRSSUVTID8gc3RlcCA6XG4gICAgICAgICAgaXRlcmF0b3JWYWx1ZSh0eXBlLCBrLCB2LCBzdGVwKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIHRha2VTZXF1ZW5jZTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gc2tpcFdoaWxlRmFjdG9yeShpdGVyYWJsZSwgcHJlZGljYXRlLCBjb250ZXh0LCB1c2VLZXlzKSB7XG4gICAgdmFyIHNraXBTZXF1ZW5jZSA9IG1ha2VTZXF1ZW5jZShpdGVyYWJsZSk7XG4gICAgc2tpcFNlcXVlbmNlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24gKGZuLCByZXZlcnNlKSB7dmFyIHRoaXMkMCA9IHRoaXM7XG4gICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShmbiwgcmV2ZXJzZSk7XG4gICAgICB9XG4gICAgICB2YXIgaXNTa2lwcGluZyA9IHRydWU7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICBpdGVyYWJsZS5fX2l0ZXJhdGUoZnVuY3Rpb24odiwgaywgYykgIHtcbiAgICAgICAgaWYgKCEoaXNTa2lwcGluZyAmJiAoaXNTa2lwcGluZyA9IHByZWRpY2F0ZS5jYWxsKGNvbnRleHQsIHYsIGssIGMpKSkpIHtcbiAgICAgICAgICBpdGVyYXRpb25zKys7XG4gICAgICAgICAgcmV0dXJuIGZuKHYsIHVzZUtleXMgPyBrIDogaXRlcmF0aW9ucyAtIDEsIHRoaXMkMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gICAgfTtcbiAgICBza2lwU2VxdWVuY2UuX19pdGVyYXRvclVuY2FjaGVkID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge3ZhciB0aGlzJDAgPSB0aGlzO1xuICAgICAgaWYgKHJldmVyc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgICAgfVxuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmFibGUuX19pdGVyYXRvcihJVEVSQVRFX0VOVFJJRVMsIHJldmVyc2UpO1xuICAgICAgdmFyIHNraXBwaW5nID0gdHJ1ZTtcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24oKSAge1xuICAgICAgICB2YXIgc3RlcCwgaywgdjtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICAgICAgaWYgKHVzZUtleXMgfHwgdHlwZSA9PT0gSVRFUkFURV9WQUxVRVMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IElURVJBVEVfS0VZUykge1xuICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zKyssIHVuZGVmaW5lZCwgc3RlcCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zKyssIHN0ZXAudmFsdWVbMV0sIHN0ZXApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgIGsgPSBlbnRyeVswXTtcbiAgICAgICAgICB2ID0gZW50cnlbMV07XG4gICAgICAgICAgc2tpcHBpbmcgJiYgKHNraXBwaW5nID0gcHJlZGljYXRlLmNhbGwoY29udGV4dCwgdiwgaywgdGhpcyQwKSk7XG4gICAgICAgIH0gd2hpbGUgKHNraXBwaW5nKTtcbiAgICAgICAgcmV0dXJuIHR5cGUgPT09IElURVJBVEVfRU5UUklFUyA/IHN0ZXAgOlxuICAgICAgICAgIGl0ZXJhdG9yVmFsdWUodHlwZSwgaywgdiwgc3RlcCk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBza2lwU2VxdWVuY2U7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGNvbmNhdEZhY3RvcnkoaXRlcmFibGUsIHZhbHVlcykge1xuICAgIHZhciBpc0tleWVkSXRlcmFibGUgPSBpc0tleWVkKGl0ZXJhYmxlKTtcbiAgICB2YXIgaXRlcnMgPSBbaXRlcmFibGVdLmNvbmNhdCh2YWx1ZXMpLm1hcChmdW5jdGlvbih2ICkge1xuICAgICAgaWYgKCFpc0l0ZXJhYmxlKHYpKSB7XG4gICAgICAgIHYgPSBpc0tleWVkSXRlcmFibGUgP1xuICAgICAgICAgIGtleWVkU2VxRnJvbVZhbHVlKHYpIDpcbiAgICAgICAgICBpbmRleGVkU2VxRnJvbVZhbHVlKEFycmF5LmlzQXJyYXkodikgPyB2IDogW3ZdKTtcbiAgICAgIH0gZWxzZSBpZiAoaXNLZXllZEl0ZXJhYmxlKSB7XG4gICAgICAgIHYgPSBLZXllZEl0ZXJhYmxlKHYpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHY7XG4gICAgfSkuZmlsdGVyKGZ1bmN0aW9uKHYgKSB7cmV0dXJuIHYuc2l6ZSAhPT0gMH0pO1xuXG4gICAgaWYgKGl0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgIH1cblxuICAgIGlmIChpdGVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBzaW5nbGV0b24gPSBpdGVyc1swXTtcbiAgICAgIGlmIChzaW5nbGV0b24gPT09IGl0ZXJhYmxlIHx8XG4gICAgICAgICAgaXNLZXllZEl0ZXJhYmxlICYmIGlzS2V5ZWQoc2luZ2xldG9uKSB8fFxuICAgICAgICAgIGlzSW5kZXhlZChpdGVyYWJsZSkgJiYgaXNJbmRleGVkKHNpbmdsZXRvbikpIHtcbiAgICAgICAgcmV0dXJuIHNpbmdsZXRvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY29uY2F0U2VxID0gbmV3IEFycmF5U2VxKGl0ZXJzKTtcbiAgICBpZiAoaXNLZXllZEl0ZXJhYmxlKSB7XG4gICAgICBjb25jYXRTZXEgPSBjb25jYXRTZXEudG9LZXllZFNlcSgpO1xuICAgIH0gZWxzZSBpZiAoIWlzSW5kZXhlZChpdGVyYWJsZSkpIHtcbiAgICAgIGNvbmNhdFNlcSA9IGNvbmNhdFNlcS50b1NldFNlcSgpO1xuICAgIH1cbiAgICBjb25jYXRTZXEgPSBjb25jYXRTZXEuZmxhdHRlbih0cnVlKTtcbiAgICBjb25jYXRTZXEuc2l6ZSA9IGl0ZXJzLnJlZHVjZShcbiAgICAgIGZ1bmN0aW9uKHN1bSwgc2VxKSAge1xuICAgICAgICBpZiAoc3VtICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YXIgc2l6ZSA9IHNlcS5zaXplO1xuICAgICAgICAgIGlmIChzaXplICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdW0gKyBzaXplO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIDBcbiAgICApO1xuICAgIHJldHVybiBjb25jYXRTZXE7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGZsYXR0ZW5GYWN0b3J5KGl0ZXJhYmxlLCBkZXB0aCwgdXNlS2V5cykge1xuICAgIHZhciBmbGF0U2VxdWVuY2UgPSBtYWtlU2VxdWVuY2UoaXRlcmFibGUpO1xuICAgIGZsYXRTZXF1ZW5jZS5fX2l0ZXJhdGVVbmNhY2hlZCA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICB2YXIgc3RvcHBlZCA9IGZhbHNlO1xuICAgICAgZnVuY3Rpb24gZmxhdERlZXAoaXRlciwgY3VycmVudERlcHRoKSB7dmFyIHRoaXMkMCA9IHRoaXM7XG4gICAgICAgIGl0ZXIuX19pdGVyYXRlKGZ1bmN0aW9uKHYsIGspICB7XG4gICAgICAgICAgaWYgKCghZGVwdGggfHwgY3VycmVudERlcHRoIDwgZGVwdGgpICYmIGlzSXRlcmFibGUodikpIHtcbiAgICAgICAgICAgIGZsYXREZWVwKHYsIGN1cnJlbnREZXB0aCArIDEpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZm4odiwgdXNlS2V5cyA/IGsgOiBpdGVyYXRpb25zKyssIHRoaXMkMCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuICFzdG9wcGVkO1xuICAgICAgICB9LCByZXZlcnNlKTtcbiAgICAgIH1cbiAgICAgIGZsYXREZWVwKGl0ZXJhYmxlLCAwKTtcbiAgICAgIHJldHVybiBpdGVyYXRpb25zO1xuICAgIH1cbiAgICBmbGF0U2VxdWVuY2UuX19pdGVyYXRvclVuY2FjaGVkID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmFibGUuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICAgIHZhciBzdGFjayA9IFtdO1xuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbigpICB7XG4gICAgICAgIHdoaWxlIChpdGVyYXRvcikge1xuICAgICAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGlmIChzdGVwLmRvbmUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBpdGVyYXRvciA9IHN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciB2ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICBpZiAodHlwZSA9PT0gSVRFUkFURV9FTlRSSUVTKSB7XG4gICAgICAgICAgICB2ID0gdlsxXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCghZGVwdGggfHwgc3RhY2subGVuZ3RoIDwgZGVwdGgpICYmIGlzSXRlcmFibGUodikpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goaXRlcmF0b3IpO1xuICAgICAgICAgICAgaXRlcmF0b3IgPSB2Ll9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB1c2VLZXlzID8gc3RlcCA6IGl0ZXJhdG9yVmFsdWUodHlwZSwgaXRlcmF0aW9ucysrLCB2LCBzdGVwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yRG9uZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmbGF0U2VxdWVuY2U7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGZsYXRNYXBGYWN0b3J5KGl0ZXJhYmxlLCBtYXBwZXIsIGNvbnRleHQpIHtcbiAgICB2YXIgY29lcmNlID0gaXRlcmFibGVDbGFzcyhpdGVyYWJsZSk7XG4gICAgcmV0dXJuIGl0ZXJhYmxlLnRvU2VxKCkubWFwKFxuICAgICAgZnVuY3Rpb24odiwgaykgIHtyZXR1cm4gY29lcmNlKG1hcHBlci5jYWxsKGNvbnRleHQsIHYsIGssIGl0ZXJhYmxlKSl9XG4gICAgKS5mbGF0dGVuKHRydWUpO1xuICB9XG5cblxuICBmdW5jdGlvbiBpbnRlcnBvc2VGYWN0b3J5KGl0ZXJhYmxlLCBzZXBhcmF0b3IpIHtcbiAgICB2YXIgaW50ZXJwb3NlZFNlcXVlbmNlID0gbWFrZVNlcXVlbmNlKGl0ZXJhYmxlKTtcbiAgICBpbnRlcnBvc2VkU2VxdWVuY2Uuc2l6ZSA9IGl0ZXJhYmxlLnNpemUgJiYgaXRlcmFibGUuc2l6ZSAqIDIgLTE7XG4gICAgaW50ZXJwb3NlZFNlcXVlbmNlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHt2YXIgdGhpcyQwID0gdGhpcztcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIGl0ZXJhYmxlLl9faXRlcmF0ZShmdW5jdGlvbih2LCBrKSBcbiAgICAgICAge3JldHVybiAoIWl0ZXJhdGlvbnMgfHwgZm4oc2VwYXJhdG9yLCBpdGVyYXRpb25zKyssIHRoaXMkMCkgIT09IGZhbHNlKSAmJlxuICAgICAgICBmbih2LCBpdGVyYXRpb25zKyssIHRoaXMkMCkgIT09IGZhbHNlfSxcbiAgICAgICAgcmV2ZXJzZVxuICAgICAgKTtcbiAgICAgIHJldHVybiBpdGVyYXRpb25zO1xuICAgIH07XG4gICAgaW50ZXJwb3NlZFNlcXVlbmNlLl9faXRlcmF0b3JVbmNhY2hlZCA9IGZ1bmN0aW9uKHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhYmxlLl9faXRlcmF0b3IoSVRFUkFURV9WQUxVRVMsIHJldmVyc2UpO1xuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgdmFyIHN0ZXA7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkgIHtcbiAgICAgICAgaWYgKCFzdGVwIHx8IGl0ZXJhdGlvbnMgJSAyKSB7XG4gICAgICAgICAgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZXJhdGlvbnMgJSAyID9cbiAgICAgICAgICBpdGVyYXRvclZhbHVlKHR5cGUsIGl0ZXJhdGlvbnMrKywgc2VwYXJhdG9yKSA6XG4gICAgICAgICAgaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zKyssIHN0ZXAudmFsdWUsIHN0ZXApO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gaW50ZXJwb3NlZFNlcXVlbmNlO1xuICB9XG5cblxuICBmdW5jdGlvbiBzb3J0RmFjdG9yeShpdGVyYWJsZSwgY29tcGFyYXRvciwgbWFwcGVyKSB7XG4gICAgaWYgKCFjb21wYXJhdG9yKSB7XG4gICAgICBjb21wYXJhdG9yID0gZGVmYXVsdENvbXBhcmF0b3I7XG4gICAgfVxuICAgIHZhciBpc0tleWVkSXRlcmFibGUgPSBpc0tleWVkKGl0ZXJhYmxlKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBlbnRyaWVzID0gaXRlcmFibGUudG9TZXEoKS5tYXAoXG4gICAgICBmdW5jdGlvbih2LCBrKSAge3JldHVybiBbaywgdiwgaW5kZXgrKywgbWFwcGVyID8gbWFwcGVyKHYsIGssIGl0ZXJhYmxlKSA6IHZdfVxuICAgICkudG9BcnJheSgpO1xuICAgIGVudHJpZXMuc29ydChmdW5jdGlvbihhLCBiKSAge3JldHVybiBjb21wYXJhdG9yKGFbM10sIGJbM10pIHx8IGFbMl0gLSBiWzJdfSkuZm9yRWFjaChcbiAgICAgIGlzS2V5ZWRJdGVyYWJsZSA/XG4gICAgICBmdW5jdGlvbih2LCBpKSAgeyBlbnRyaWVzW2ldLmxlbmd0aCA9IDI7IH0gOlxuICAgICAgZnVuY3Rpb24odiwgaSkgIHsgZW50cmllc1tpXSA9IHZbMV07IH1cbiAgICApO1xuICAgIHJldHVybiBpc0tleWVkSXRlcmFibGUgPyBLZXllZFNlcShlbnRyaWVzKSA6XG4gICAgICBpc0luZGV4ZWQoaXRlcmFibGUpID8gSW5kZXhlZFNlcShlbnRyaWVzKSA6XG4gICAgICBTZXRTZXEoZW50cmllcyk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIG1heEZhY3RvcnkoaXRlcmFibGUsIGNvbXBhcmF0b3IsIG1hcHBlcikge1xuICAgIGlmICghY29tcGFyYXRvcikge1xuICAgICAgY29tcGFyYXRvciA9IGRlZmF1bHRDb21wYXJhdG9yO1xuICAgIH1cbiAgICBpZiAobWFwcGVyKSB7XG4gICAgICB2YXIgZW50cnkgPSBpdGVyYWJsZS50b1NlcSgpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24odiwgaykgIHtyZXR1cm4gW3YsIG1hcHBlcih2LCBrLCBpdGVyYWJsZSldfSlcbiAgICAgICAgLnJlZHVjZShmdW5jdGlvbihhLCBiKSAge3JldHVybiBtYXhDb21wYXJlKGNvbXBhcmF0b3IsIGFbMV0sIGJbMV0pID8gYiA6IGF9KTtcbiAgICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeVswXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGl0ZXJhYmxlLnJlZHVjZShmdW5jdGlvbihhLCBiKSAge3JldHVybiBtYXhDb21wYXJlKGNvbXBhcmF0b3IsIGEsIGIpID8gYiA6IGF9KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtYXhDb21wYXJlKGNvbXBhcmF0b3IsIGEsIGIpIHtcbiAgICB2YXIgY29tcCA9IGNvbXBhcmF0b3IoYiwgYSk7XG4gICAgLy8gYiBpcyBjb25zaWRlcmVkIHRoZSBuZXcgbWF4IGlmIHRoZSBjb21wYXJhdG9yIGRlY2xhcmVzIHRoZW0gZXF1YWwsIGJ1dFxuICAgIC8vIHRoZXkgYXJlIG5vdCBlcXVhbCBhbmQgYiBpcyBpbiBmYWN0IGEgbnVsbGlzaCB2YWx1ZS5cbiAgICByZXR1cm4gKGNvbXAgPT09IDAgJiYgYiAhPT0gYSAmJiAoYiA9PT0gdW5kZWZpbmVkIHx8IGIgPT09IG51bGwgfHwgYiAhPT0gYikpIHx8IGNvbXAgPiAwO1xuICB9XG5cblxuICBmdW5jdGlvbiB6aXBXaXRoRmFjdG9yeShrZXlJdGVyLCB6aXBwZXIsIGl0ZXJzKSB7XG4gICAgdmFyIHppcFNlcXVlbmNlID0gbWFrZVNlcXVlbmNlKGtleUl0ZXIpO1xuICAgIHppcFNlcXVlbmNlLnNpemUgPSBuZXcgQXJyYXlTZXEoaXRlcnMpLm1hcChmdW5jdGlvbihpICkge3JldHVybiBpLnNpemV9KS5taW4oKTtcbiAgICAvLyBOb3RlOiB0aGlzIGEgZ2VuZXJpYyBiYXNlIGltcGxlbWVudGF0aW9uIG9mIF9faXRlcmF0ZSBpbiB0ZXJtcyBvZlxuICAgIC8vIF9faXRlcmF0b3Igd2hpY2ggbWF5IGJlIG1vcmUgZ2VuZXJpY2FsbHkgdXNlZnVsIGluIHRoZSBmdXR1cmUuXG4gICAgemlwU2VxdWVuY2UuX19pdGVyYXRlID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHtcbiAgICAgIC8qIGdlbmVyaWM6XG4gICAgICB2YXIgaXRlcmF0b3IgPSB0aGlzLl9faXRlcmF0b3IoSVRFUkFURV9FTlRSSUVTLCByZXZlcnNlKTtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICBpdGVyYXRpb25zKys7XG4gICAgICAgIGlmIChmbihzdGVwLnZhbHVlWzFdLCBzdGVwLnZhbHVlWzBdLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gICAgICAqL1xuICAgICAgLy8gaW5kZXhlZDpcbiAgICAgIHZhciBpdGVyYXRvciA9IHRoaXMuX19pdGVyYXRvcihJVEVSQVRFX1ZBTFVFUywgcmV2ZXJzZSk7XG4gICAgICB2YXIgc3RlcDtcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgaWYgKGZuKHN0ZXAudmFsdWUsIGl0ZXJhdGlvbnMrKywgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVyYXRpb25zO1xuICAgIH07XG4gICAgemlwU2VxdWVuY2UuX19pdGVyYXRvclVuY2FjaGVkID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgICAgdmFyIGl0ZXJhdG9ycyA9IGl0ZXJzLm1hcChmdW5jdGlvbihpIClcbiAgICAgICAge3JldHVybiAoaSA9IEl0ZXJhYmxlKGkpLCBnZXRJdGVyYXRvcihyZXZlcnNlID8gaS5yZXZlcnNlKCkgOiBpKSl9XG4gICAgICApO1xuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgdmFyIGlzRG9uZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbigpICB7XG4gICAgICAgIHZhciBzdGVwcztcbiAgICAgICAgaWYgKCFpc0RvbmUpIHtcbiAgICAgICAgICBzdGVwcyA9IGl0ZXJhdG9ycy5tYXAoZnVuY3Rpb24oaSApIHtyZXR1cm4gaS5uZXh0KCl9KTtcbiAgICAgICAgICBpc0RvbmUgPSBzdGVwcy5zb21lKGZ1bmN0aW9uKHMgKSB7cmV0dXJuIHMuZG9uZX0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RvbmUpIHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0b3JEb25lKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVmFsdWUoXG4gICAgICAgICAgdHlwZSxcbiAgICAgICAgICBpdGVyYXRpb25zKyssXG4gICAgICAgICAgemlwcGVyLmFwcGx5KG51bGwsIHN0ZXBzLm1hcChmdW5jdGlvbihzICkge3JldHVybiBzLnZhbHVlfSkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiB6aXBTZXF1ZW5jZVxuICB9XG5cblxuICAvLyAjcHJhZ21hIEhlbHBlciBGdW5jdGlvbnNcblxuICBmdW5jdGlvbiByZWlmeShpdGVyLCBzZXEpIHtcbiAgICByZXR1cm4gaXNTZXEoaXRlcikgPyBzZXEgOiBpdGVyLmNvbnN0cnVjdG9yKHNlcSk7XG4gIH1cblxuICBmdW5jdGlvbiB2YWxpZGF0ZUVudHJ5KGVudHJ5KSB7XG4gICAgaWYgKGVudHJ5ICE9PSBPYmplY3QoZW50cnkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBbSywgVl0gdHVwbGU6ICcgKyBlbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVzb2x2ZVNpemUoaXRlcikge1xuICAgIGFzc2VydE5vdEluZmluaXRlKGl0ZXIuc2l6ZSk7XG4gICAgcmV0dXJuIGVuc3VyZVNpemUoaXRlcik7XG4gIH1cblxuICBmdW5jdGlvbiBpdGVyYWJsZUNsYXNzKGl0ZXJhYmxlKSB7XG4gICAgcmV0dXJuIGlzS2V5ZWQoaXRlcmFibGUpID8gS2V5ZWRJdGVyYWJsZSA6XG4gICAgICBpc0luZGV4ZWQoaXRlcmFibGUpID8gSW5kZXhlZEl0ZXJhYmxlIDpcbiAgICAgIFNldEl0ZXJhYmxlO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFrZVNlcXVlbmNlKGl0ZXJhYmxlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5jcmVhdGUoXG4gICAgICAoXG4gICAgICAgIGlzS2V5ZWQoaXRlcmFibGUpID8gS2V5ZWRTZXEgOlxuICAgICAgICBpc0luZGV4ZWQoaXRlcmFibGUpID8gSW5kZXhlZFNlcSA6XG4gICAgICAgIFNldFNlcVxuICAgICAgKS5wcm90b3R5cGVcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FjaGVSZXN1bHRUaHJvdWdoKCkge1xuICAgIGlmICh0aGlzLl9pdGVyLmNhY2hlUmVzdWx0KSB7XG4gICAgICB0aGlzLl9pdGVyLmNhY2hlUmVzdWx0KCk7XG4gICAgICB0aGlzLnNpemUgPSB0aGlzLl9pdGVyLnNpemU7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFNlcS5wcm90b3R5cGUuY2FjaGVSZXN1bHQuY2FsbCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkZWZhdWx0Q29tcGFyYXRvcihhLCBiKSB7XG4gICAgcmV0dXJuIGEgPiBiID8gMSA6IGEgPCBiID8gLTEgOiAwO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9yY2VJdGVyYXRvcihrZXlQYXRoKSB7XG4gICAgdmFyIGl0ZXIgPSBnZXRJdGVyYXRvcihrZXlQYXRoKTtcbiAgICBpZiAoIWl0ZXIpIHtcbiAgICAgIC8vIEFycmF5IG1pZ2h0IG5vdCBiZSBpdGVyYWJsZSBpbiB0aGlzIGVudmlyb25tZW50LCBzbyB3ZSBuZWVkIGEgZmFsbGJhY2tcbiAgICAgIC8vIHRvIG91ciB3cmFwcGVkIHR5cGUuXG4gICAgICBpZiAoIWlzQXJyYXlMaWtlKGtleVBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGl0ZXJhYmxlIG9yIGFycmF5LWxpa2U6ICcgKyBrZXlQYXRoKTtcbiAgICAgIH1cbiAgICAgIGl0ZXIgPSBnZXRJdGVyYXRvcihJdGVyYWJsZShrZXlQYXRoKSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVyO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoUmVjb3JkLCBLZXllZENvbGxlY3Rpb24pO1xuXG4gICAgZnVuY3Rpb24gUmVjb3JkKGRlZmF1bHRWYWx1ZXMsIG5hbWUpIHtcbiAgICAgIHZhciBoYXNJbml0aWFsaXplZDtcblxuICAgICAgdmFyIFJlY29yZFR5cGUgPSBmdW5jdGlvbiBSZWNvcmQodmFsdWVzKSB7XG4gICAgICAgIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBSZWNvcmRUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmVjb3JkVHlwZSkpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFJlY29yZFR5cGUodmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWhhc0luaXRpYWxpemVkKSB7XG4gICAgICAgICAgaGFzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoZGVmYXVsdFZhbHVlcyk7XG4gICAgICAgICAgc2V0UHJvcHMoUmVjb3JkVHlwZVByb3RvdHlwZSwga2V5cyk7XG4gICAgICAgICAgUmVjb3JkVHlwZVByb3RvdHlwZS5zaXplID0ga2V5cy5sZW5ndGg7XG4gICAgICAgICAgUmVjb3JkVHlwZVByb3RvdHlwZS5fbmFtZSA9IG5hbWU7XG4gICAgICAgICAgUmVjb3JkVHlwZVByb3RvdHlwZS5fa2V5cyA9IGtleXM7XG4gICAgICAgICAgUmVjb3JkVHlwZVByb3RvdHlwZS5fZGVmYXVsdFZhbHVlcyA9IGRlZmF1bHRWYWx1ZXM7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbWFwID0gTWFwKHZhbHVlcyk7XG4gICAgICB9O1xuXG4gICAgICB2YXIgUmVjb3JkVHlwZVByb3RvdHlwZSA9IFJlY29yZFR5cGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShSZWNvcmRQcm90b3R5cGUpO1xuICAgICAgUmVjb3JkVHlwZVByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlY29yZFR5cGU7XG5cbiAgICAgIHJldHVybiBSZWNvcmRUeXBlO1xuICAgIH1cblxuICAgIFJlY29yZC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fdG9TdHJpbmcocmVjb3JkTmFtZSh0aGlzKSArICcgeycsICd9Jyk7XG4gICAgfTtcblxuICAgIC8vIEBwcmFnbWEgQWNjZXNzXG5cbiAgICBSZWNvcmQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKGspIHtcbiAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VmFsdWVzLmhhc093blByb3BlcnR5KGspO1xuICAgIH07XG5cbiAgICBSZWNvcmQucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGssIG5vdFNldFZhbHVlKSB7XG4gICAgICBpZiAoIXRoaXMuaGFzKGspKSB7XG4gICAgICAgIHJldHVybiBub3RTZXRWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHZhciBkZWZhdWx0VmFsID0gdGhpcy5fZGVmYXVsdFZhbHVlc1trXTtcbiAgICAgIHJldHVybiB0aGlzLl9tYXAgPyB0aGlzLl9tYXAuZ2V0KGssIGRlZmF1bHRWYWwpIDogZGVmYXVsdFZhbDtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBNb2RpZmljYXRpb25cblxuICAgIFJlY29yZC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLl9fb3duZXJJRCkge1xuICAgICAgICB0aGlzLl9tYXAgJiYgdGhpcy5fbWFwLmNsZWFyKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgdmFyIFJlY29yZFR5cGUgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICAgcmV0dXJuIFJlY29yZFR5cGUuX2VtcHR5IHx8IChSZWNvcmRUeXBlLl9lbXB0eSA9IG1ha2VSZWNvcmQodGhpcywgZW1wdHlNYXAoKSkpO1xuICAgIH07XG5cbiAgICBSZWNvcmQucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKGssIHYpIHtcbiAgICAgIGlmICghdGhpcy5oYXMoaykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc2V0IHVua25vd24ga2V5IFwiJyArIGsgKyAnXCIgb24gJyArIHJlY29yZE5hbWUodGhpcykpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX21hcCAmJiAhdGhpcy5fbWFwLmhhcyhrKSkge1xuICAgICAgICB2YXIgZGVmYXVsdFZhbCA9IHRoaXMuX2RlZmF1bHRWYWx1ZXNba107XG4gICAgICAgIGlmICh2ID09PSBkZWZhdWx0VmFsKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBuZXdNYXAgPSB0aGlzLl9tYXAgJiYgdGhpcy5fbWFwLnNldChrLCB2KTtcbiAgICAgIGlmICh0aGlzLl9fb3duZXJJRCB8fCBuZXdNYXAgPT09IHRoaXMuX21hcCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYWtlUmVjb3JkKHRoaXMsIG5ld01hcCk7XG4gICAgfTtcblxuICAgIFJlY29yZC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oaykge1xuICAgICAgaWYgKCF0aGlzLmhhcyhrKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHZhciBuZXdNYXAgPSB0aGlzLl9tYXAgJiYgdGhpcy5fbWFwLnJlbW92ZShrKTtcbiAgICAgIGlmICh0aGlzLl9fb3duZXJJRCB8fCBuZXdNYXAgPT09IHRoaXMuX21hcCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYWtlUmVjb3JkKHRoaXMsIG5ld01hcCk7XG4gICAgfTtcblxuICAgIFJlY29yZC5wcm90b3R5cGUud2FzQWx0ZXJlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcC53YXNBbHRlcmVkKCk7XG4gICAgfTtcblxuICAgIFJlY29yZC5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uKHR5cGUsIHJldmVyc2UpIHt2YXIgdGhpcyQwID0gdGhpcztcbiAgICAgIHJldHVybiBLZXllZEl0ZXJhYmxlKHRoaXMuX2RlZmF1bHRWYWx1ZXMpLm1hcChmdW5jdGlvbihfLCBrKSAge3JldHVybiB0aGlzJDAuZ2V0KGspfSkuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICB9O1xuXG4gICAgUmVjb3JkLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge3ZhciB0aGlzJDAgPSB0aGlzO1xuICAgICAgcmV0dXJuIEtleWVkSXRlcmFibGUodGhpcy5fZGVmYXVsdFZhbHVlcykubWFwKGZ1bmN0aW9uKF8sIGspICB7cmV0dXJuIHRoaXMkMC5nZXQoayl9KS5fX2l0ZXJhdGUoZm4sIHJldmVyc2UpO1xuICAgIH07XG5cbiAgICBSZWNvcmQucHJvdG90eXBlLl9fZW5zdXJlT3duZXIgPSBmdW5jdGlvbihvd25lcklEKSB7XG4gICAgICBpZiAob3duZXJJRCA9PT0gdGhpcy5fX293bmVySUQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB2YXIgbmV3TWFwID0gdGhpcy5fbWFwICYmIHRoaXMuX21hcC5fX2Vuc3VyZU93bmVyKG93bmVySUQpO1xuICAgICAgaWYgKCFvd25lcklEKSB7XG4gICAgICAgIHRoaXMuX19vd25lcklEID0gb3duZXJJRDtcbiAgICAgICAgdGhpcy5fbWFwID0gbmV3TWFwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYWtlUmVjb3JkKHRoaXMsIG5ld01hcCwgb3duZXJJRCk7XG4gICAgfTtcblxuXG4gIHZhciBSZWNvcmRQcm90b3R5cGUgPSBSZWNvcmQucHJvdG90eXBlO1xuICBSZWNvcmRQcm90b3R5cGVbREVMRVRFXSA9IFJlY29yZFByb3RvdHlwZS5yZW1vdmU7XG4gIFJlY29yZFByb3RvdHlwZS5kZWxldGVJbiA9XG4gIFJlY29yZFByb3RvdHlwZS5yZW1vdmVJbiA9IE1hcFByb3RvdHlwZS5yZW1vdmVJbjtcbiAgUmVjb3JkUHJvdG90eXBlLm1lcmdlID0gTWFwUHJvdG90eXBlLm1lcmdlO1xuICBSZWNvcmRQcm90b3R5cGUubWVyZ2VXaXRoID0gTWFwUHJvdG90eXBlLm1lcmdlV2l0aDtcbiAgUmVjb3JkUHJvdG90eXBlLm1lcmdlSW4gPSBNYXBQcm90b3R5cGUubWVyZ2VJbjtcbiAgUmVjb3JkUHJvdG90eXBlLm1lcmdlRGVlcCA9IE1hcFByb3RvdHlwZS5tZXJnZURlZXA7XG4gIFJlY29yZFByb3RvdHlwZS5tZXJnZURlZXBXaXRoID0gTWFwUHJvdG90eXBlLm1lcmdlRGVlcFdpdGg7XG4gIFJlY29yZFByb3RvdHlwZS5tZXJnZURlZXBJbiA9IE1hcFByb3RvdHlwZS5tZXJnZURlZXBJbjtcbiAgUmVjb3JkUHJvdG90eXBlLnNldEluID0gTWFwUHJvdG90eXBlLnNldEluO1xuICBSZWNvcmRQcm90b3R5cGUudXBkYXRlID0gTWFwUHJvdG90eXBlLnVwZGF0ZTtcbiAgUmVjb3JkUHJvdG90eXBlLnVwZGF0ZUluID0gTWFwUHJvdG90eXBlLnVwZGF0ZUluO1xuICBSZWNvcmRQcm90b3R5cGUud2l0aE11dGF0aW9ucyA9IE1hcFByb3RvdHlwZS53aXRoTXV0YXRpb25zO1xuICBSZWNvcmRQcm90b3R5cGUuYXNNdXRhYmxlID0gTWFwUHJvdG90eXBlLmFzTXV0YWJsZTtcbiAgUmVjb3JkUHJvdG90eXBlLmFzSW1tdXRhYmxlID0gTWFwUHJvdG90eXBlLmFzSW1tdXRhYmxlO1xuXG5cbiAgZnVuY3Rpb24gbWFrZVJlY29yZChsaWtlUmVjb3JkLCBtYXAsIG93bmVySUQpIHtcbiAgICB2YXIgcmVjb3JkID0gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YobGlrZVJlY29yZCkpO1xuICAgIHJlY29yZC5fbWFwID0gbWFwO1xuICAgIHJlY29yZC5fX293bmVySUQgPSBvd25lcklEO1xuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiByZWNvcmROYW1lKHJlY29yZCkge1xuICAgIHJldHVybiByZWNvcmQuX25hbWUgfHwgcmVjb3JkLmNvbnN0cnVjdG9yLm5hbWUgfHwgJ1JlY29yZCc7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRQcm9wcyhwcm90b3R5cGUsIG5hbWVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIG5hbWVzLmZvckVhY2goc2V0UHJvcC5iaW5kKHVuZGVmaW5lZCwgcHJvdG90eXBlKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBmYWlsZWQuIFByb2JhYmx5IElFOC5cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzZXRQcm9wKHByb3RvdHlwZSwgbmFtZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90b3R5cGUsIG5hbWUsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldChuYW1lKTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGludmFyaWFudCh0aGlzLl9fb3duZXJJRCwgJ0Nhbm5vdCBzZXQgb24gYW4gaW1tdXRhYmxlIHJlY29yZC4nKTtcbiAgICAgICAgdGhpcy5zZXQobmFtZSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoU2V0LCBTZXRDb2xsZWN0aW9uKTtcblxuICAgIC8vIEBwcmFnbWEgQ29uc3RydWN0aW9uXG5cbiAgICBmdW5jdGlvbiBTZXQodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gZW1wdHlTZXQoKSA6XG4gICAgICAgIGlzU2V0KHZhbHVlKSAmJiAhaXNPcmRlcmVkKHZhbHVlKSA/IHZhbHVlIDpcbiAgICAgICAgZW1wdHlTZXQoKS53aXRoTXV0YXRpb25zKGZ1bmN0aW9uKHNldCApIHtcbiAgICAgICAgICB2YXIgaXRlciA9IFNldEl0ZXJhYmxlKHZhbHVlKTtcbiAgICAgICAgICBhc3NlcnROb3RJbmZpbml0ZShpdGVyLnNpemUpO1xuICAgICAgICAgIGl0ZXIuZm9yRWFjaChmdW5jdGlvbih2ICkge3JldHVybiBzZXQuYWRkKHYpfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIFNldC5vZiA9IGZ1bmN0aW9uKC8qLi4udmFsdWVzKi8pIHtcbiAgICAgIHJldHVybiB0aGlzKGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIFNldC5mcm9tS2V5cyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcyhLZXllZEl0ZXJhYmxlKHZhbHVlKS5rZXlTZXEoKSk7XG4gICAgfTtcblxuICAgIFNldC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fdG9TdHJpbmcoJ1NldCB7JywgJ30nKTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBBY2Nlc3NcblxuICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKHZhbHVlKTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBNb2RpZmljYXRpb25cblxuICAgIFNldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB1cGRhdGVTZXQodGhpcywgdGhpcy5fbWFwLnNldCh2YWx1ZSwgdHJ1ZSkpO1xuICAgIH07XG5cbiAgICBTZXQucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdXBkYXRlU2V0KHRoaXMsIHRoaXMuX21hcC5yZW1vdmUodmFsdWUpKTtcbiAgICB9O1xuXG4gICAgU2V0LnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHVwZGF0ZVNldCh0aGlzLCB0aGlzLl9tYXAuY2xlYXIoKSk7XG4gICAgfTtcblxuICAgIC8vIEBwcmFnbWEgQ29tcG9zaXRpb25cblxuICAgIFNldC5wcm90b3R5cGUudW5pb24gPSBmdW5jdGlvbigpIHt2YXIgaXRlcnMgPSBTTElDRSQwLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgICAgIGl0ZXJzID0gaXRlcnMuZmlsdGVyKGZ1bmN0aW9uKHggKSB7cmV0dXJuIHguc2l6ZSAhPT0gMH0pO1xuICAgICAgaWYgKGl0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnNpemUgPT09IDAgJiYgIXRoaXMuX19vd25lcklEICYmIGl0ZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcihpdGVyc1swXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKGZ1bmN0aW9uKHNldCApIHtcbiAgICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGl0ZXJzLmxlbmd0aDsgaWkrKykge1xuICAgICAgICAgIFNldEl0ZXJhYmxlKGl0ZXJzW2lpXSkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSApIHtyZXR1cm4gc2V0LmFkZCh2YWx1ZSl9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIFNldC5wcm90b3R5cGUuaW50ZXJzZWN0ID0gZnVuY3Rpb24oKSB7dmFyIGl0ZXJzID0gU0xJQ0UkMC5jYWxsKGFyZ3VtZW50cywgMCk7XG4gICAgICBpZiAoaXRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgaXRlcnMgPSBpdGVycy5tYXAoZnVuY3Rpb24oaXRlciApIHtyZXR1cm4gU2V0SXRlcmFibGUoaXRlcil9KTtcbiAgICAgIHZhciBvcmlnaW5hbFNldCA9IHRoaXM7XG4gICAgICByZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKGZ1bmN0aW9uKHNldCApIHtcbiAgICAgICAgb3JpZ2luYWxTZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSApIHtcbiAgICAgICAgICBpZiAoIWl0ZXJzLmV2ZXJ5KGZ1bmN0aW9uKGl0ZXIgKSB7cmV0dXJuIGl0ZXIuaW5jbHVkZXModmFsdWUpfSkpIHtcbiAgICAgICAgICAgIHNldC5yZW1vdmUodmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgU2V0LnByb3RvdHlwZS5zdWJ0cmFjdCA9IGZ1bmN0aW9uKCkge3ZhciBpdGVycyA9IFNMSUNFJDAuY2FsbChhcmd1bWVudHMsIDApO1xuICAgICAgaWYgKGl0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGl0ZXJzID0gaXRlcnMubWFwKGZ1bmN0aW9uKGl0ZXIgKSB7cmV0dXJuIFNldEl0ZXJhYmxlKGl0ZXIpfSk7XG4gICAgICB2YXIgb3JpZ2luYWxTZXQgPSB0aGlzO1xuICAgICAgcmV0dXJuIHRoaXMud2l0aE11dGF0aW9ucyhmdW5jdGlvbihzZXQgKSB7XG4gICAgICAgIG9yaWdpbmFsU2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUgKSB7XG4gICAgICAgICAgaWYgKGl0ZXJzLnNvbWUoZnVuY3Rpb24oaXRlciApIHtyZXR1cm4gaXRlci5pbmNsdWRlcyh2YWx1ZSl9KSkge1xuICAgICAgICAgICAgc2V0LnJlbW92ZSh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBTZXQucHJvdG90eXBlLm1lcmdlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy51bmlvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBTZXQucHJvdG90eXBlLm1lcmdlV2l0aCA9IGZ1bmN0aW9uKG1lcmdlcikge3ZhciBpdGVycyA9IFNMSUNFJDAuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgcmV0dXJuIHRoaXMudW5pb24uYXBwbHkodGhpcywgaXRlcnMpO1xuICAgIH07XG5cbiAgICBTZXQucHJvdG90eXBlLnNvcnQgPSBmdW5jdGlvbihjb21wYXJhdG9yKSB7XG4gICAgICAvLyBMYXRlIGJpbmRpbmdcbiAgICAgIHJldHVybiBPcmRlcmVkU2V0KHNvcnRGYWN0b3J5KHRoaXMsIGNvbXBhcmF0b3IpKTtcbiAgICB9O1xuXG4gICAgU2V0LnByb3RvdHlwZS5zb3J0QnkgPSBmdW5jdGlvbihtYXBwZXIsIGNvbXBhcmF0b3IpIHtcbiAgICAgIC8vIExhdGUgYmluZGluZ1xuICAgICAgcmV0dXJuIE9yZGVyZWRTZXQoc29ydEZhY3RvcnkodGhpcywgY29tcGFyYXRvciwgbWFwcGVyKSk7XG4gICAgfTtcblxuICAgIFNldC5wcm90b3R5cGUud2FzQWx0ZXJlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcC53YXNBbHRlcmVkKCk7XG4gICAgfTtcblxuICAgIFNldC5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHt2YXIgdGhpcyQwID0gdGhpcztcbiAgICAgIHJldHVybiB0aGlzLl9tYXAuX19pdGVyYXRlKGZ1bmN0aW9uKF8sIGspICB7cmV0dXJuIGZuKGssIGssIHRoaXMkMCl9LCByZXZlcnNlKTtcbiAgICB9O1xuXG4gICAgU2V0LnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcC5tYXAoZnVuY3Rpb24oXywgaykgIHtyZXR1cm4ga30pLl9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gICAgfTtcblxuICAgIFNldC5wcm90b3R5cGUuX19lbnN1cmVPd25lciA9IGZ1bmN0aW9uKG93bmVySUQpIHtcbiAgICAgIGlmIChvd25lcklEID09PSB0aGlzLl9fb3duZXJJRCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHZhciBuZXdNYXAgPSB0aGlzLl9tYXAuX19lbnN1cmVPd25lcihvd25lcklEKTtcbiAgICAgIGlmICghb3duZXJJRCkge1xuICAgICAgICB0aGlzLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ld01hcDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fX21ha2UobmV3TWFwLCBvd25lcklEKTtcbiAgICB9O1xuXG5cbiAgZnVuY3Rpb24gaXNTZXQobWF5YmVTZXQpIHtcbiAgICByZXR1cm4gISEobWF5YmVTZXQgJiYgbWF5YmVTZXRbSVNfU0VUX1NFTlRJTkVMXSk7XG4gIH1cblxuICBTZXQuaXNTZXQgPSBpc1NldDtcblxuICB2YXIgSVNfU0VUX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfU0VUX19AQCc7XG5cbiAgdmFyIFNldFByb3RvdHlwZSA9IFNldC5wcm90b3R5cGU7XG4gIFNldFByb3RvdHlwZVtJU19TRVRfU0VOVElORUxdID0gdHJ1ZTtcbiAgU2V0UHJvdG90eXBlW0RFTEVURV0gPSBTZXRQcm90b3R5cGUucmVtb3ZlO1xuICBTZXRQcm90b3R5cGUubWVyZ2VEZWVwID0gU2V0UHJvdG90eXBlLm1lcmdlO1xuICBTZXRQcm90b3R5cGUubWVyZ2VEZWVwV2l0aCA9IFNldFByb3RvdHlwZS5tZXJnZVdpdGg7XG4gIFNldFByb3RvdHlwZS53aXRoTXV0YXRpb25zID0gTWFwUHJvdG90eXBlLndpdGhNdXRhdGlvbnM7XG4gIFNldFByb3RvdHlwZS5hc011dGFibGUgPSBNYXBQcm90b3R5cGUuYXNNdXRhYmxlO1xuICBTZXRQcm90b3R5cGUuYXNJbW11dGFibGUgPSBNYXBQcm90b3R5cGUuYXNJbW11dGFibGU7XG5cbiAgU2V0UHJvdG90eXBlLl9fZW1wdHkgPSBlbXB0eVNldDtcbiAgU2V0UHJvdG90eXBlLl9fbWFrZSA9IG1ha2VTZXQ7XG5cbiAgZnVuY3Rpb24gdXBkYXRlU2V0KHNldCwgbmV3TWFwKSB7XG4gICAgaWYgKHNldC5fX293bmVySUQpIHtcbiAgICAgIHNldC5zaXplID0gbmV3TWFwLnNpemU7XG4gICAgICBzZXQuX21hcCA9IG5ld01hcDtcbiAgICAgIHJldHVybiBzZXQ7XG4gICAgfVxuICAgIHJldHVybiBuZXdNYXAgPT09IHNldC5fbWFwID8gc2V0IDpcbiAgICAgIG5ld01hcC5zaXplID09PSAwID8gc2V0Ll9fZW1wdHkoKSA6XG4gICAgICBzZXQuX19tYWtlKG5ld01hcCk7XG4gIH1cblxuICBmdW5jdGlvbiBtYWtlU2V0KG1hcCwgb3duZXJJRCkge1xuICAgIHZhciBzZXQgPSBPYmplY3QuY3JlYXRlKFNldFByb3RvdHlwZSk7XG4gICAgc2V0LnNpemUgPSBtYXAgPyBtYXAuc2l6ZSA6IDA7XG4gICAgc2V0Ll9tYXAgPSBtYXA7XG4gICAgc2V0Ll9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgcmV0dXJuIHNldDtcbiAgfVxuXG4gIHZhciBFTVBUWV9TRVQ7XG4gIGZ1bmN0aW9uIGVtcHR5U2V0KCkge1xuICAgIHJldHVybiBFTVBUWV9TRVQgfHwgKEVNUFRZX1NFVCA9IG1ha2VTZXQoZW1wdHlNYXAoKSkpO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoT3JkZXJlZFNldCwgU2V0KTtcblxuICAgIC8vIEBwcmFnbWEgQ29uc3RydWN0aW9uXG5cbiAgICBmdW5jdGlvbiBPcmRlcmVkU2V0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/IGVtcHR5T3JkZXJlZFNldCgpIDpcbiAgICAgICAgaXNPcmRlcmVkU2V0KHZhbHVlKSA/IHZhbHVlIDpcbiAgICAgICAgZW1wdHlPcmRlcmVkU2V0KCkud2l0aE11dGF0aW9ucyhmdW5jdGlvbihzZXQgKSB7XG4gICAgICAgICAgdmFyIGl0ZXIgPSBTZXRJdGVyYWJsZSh2YWx1ZSk7XG4gICAgICAgICAgYXNzZXJ0Tm90SW5maW5pdGUoaXRlci5zaXplKTtcbiAgICAgICAgICBpdGVyLmZvckVhY2goZnVuY3Rpb24odiApIHtyZXR1cm4gc2V0LmFkZCh2KX0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBPcmRlcmVkU2V0Lm9mID0gZnVuY3Rpb24oLyouLi52YWx1ZXMqLykge1xuICAgICAgcmV0dXJuIHRoaXMoYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgT3JkZXJlZFNldC5mcm9tS2V5cyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcyhLZXllZEl0ZXJhYmxlKHZhbHVlKS5rZXlTZXEoKSk7XG4gICAgfTtcblxuICAgIE9yZGVyZWRTZXQucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCdPcmRlcmVkU2V0IHsnLCAnfScpO1xuICAgIH07XG5cblxuICBmdW5jdGlvbiBpc09yZGVyZWRTZXQobWF5YmVPcmRlcmVkU2V0KSB7XG4gICAgcmV0dXJuIGlzU2V0KG1heWJlT3JkZXJlZFNldCkgJiYgaXNPcmRlcmVkKG1heWJlT3JkZXJlZFNldCk7XG4gIH1cblxuICBPcmRlcmVkU2V0LmlzT3JkZXJlZFNldCA9IGlzT3JkZXJlZFNldDtcblxuICB2YXIgT3JkZXJlZFNldFByb3RvdHlwZSA9IE9yZGVyZWRTZXQucHJvdG90eXBlO1xuICBPcmRlcmVkU2V0UHJvdG90eXBlW0lTX09SREVSRURfU0VOVElORUxdID0gdHJ1ZTtcblxuICBPcmRlcmVkU2V0UHJvdG90eXBlLl9fZW1wdHkgPSBlbXB0eU9yZGVyZWRTZXQ7XG4gIE9yZGVyZWRTZXRQcm90b3R5cGUuX19tYWtlID0gbWFrZU9yZGVyZWRTZXQ7XG5cbiAgZnVuY3Rpb24gbWFrZU9yZGVyZWRTZXQobWFwLCBvd25lcklEKSB7XG4gICAgdmFyIHNldCA9IE9iamVjdC5jcmVhdGUoT3JkZXJlZFNldFByb3RvdHlwZSk7XG4gICAgc2V0LnNpemUgPSBtYXAgPyBtYXAuc2l6ZSA6IDA7XG4gICAgc2V0Ll9tYXAgPSBtYXA7XG4gICAgc2V0Ll9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgcmV0dXJuIHNldDtcbiAgfVxuXG4gIHZhciBFTVBUWV9PUkRFUkVEX1NFVDtcbiAgZnVuY3Rpb24gZW1wdHlPcmRlcmVkU2V0KCkge1xuICAgIHJldHVybiBFTVBUWV9PUkRFUkVEX1NFVCB8fCAoRU1QVFlfT1JERVJFRF9TRVQgPSBtYWtlT3JkZXJlZFNldChlbXB0eU9yZGVyZWRNYXAoKSkpO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoU3RhY2ssIEluZGV4ZWRDb2xsZWN0aW9uKTtcblxuICAgIC8vIEBwcmFnbWEgQ29uc3RydWN0aW9uXG5cbiAgICBmdW5jdGlvbiBTdGFjayh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgPyBlbXB0eVN0YWNrKCkgOlxuICAgICAgICBpc1N0YWNrKHZhbHVlKSA/IHZhbHVlIDpcbiAgICAgICAgZW1wdHlTdGFjaygpLnVuc2hpZnRBbGwodmFsdWUpO1xuICAgIH1cblxuICAgIFN0YWNrLm9mID0gZnVuY3Rpb24oLyouLi52YWx1ZXMqLykge1xuICAgICAgcmV0dXJuIHRoaXMoYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgU3RhY2sucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCdTdGFjayBbJywgJ10nKTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBBY2Nlc3NcblxuICAgIFN0YWNrLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihpbmRleCwgbm90U2V0VmFsdWUpIHtcbiAgICAgIHZhciBoZWFkID0gdGhpcy5faGVhZDtcbiAgICAgIGluZGV4ID0gd3JhcEluZGV4KHRoaXMsIGluZGV4KTtcbiAgICAgIHdoaWxlIChoZWFkICYmIGluZGV4LS0pIHtcbiAgICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoZWFkID8gaGVhZC52YWx1ZSA6IG5vdFNldFZhbHVlO1xuICAgIH07XG5cbiAgICBTdGFjay5wcm90b3R5cGUucGVlayA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2hlYWQgJiYgdGhpcy5faGVhZC52YWx1ZTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBNb2RpZmljYXRpb25cblxuICAgIFN0YWNrLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oLyouLi52YWx1ZXMqLykge1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB2YXIgbmV3U2l6ZSA9IHRoaXMuc2l6ZSArIGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICB2YXIgaGVhZCA9IHRoaXMuX2hlYWQ7XG4gICAgICBmb3IgKHZhciBpaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpaSA+PSAwOyBpaS0tKSB7XG4gICAgICAgIGhlYWQgPSB7XG4gICAgICAgICAgdmFsdWU6IGFyZ3VtZW50c1tpaV0sXG4gICAgICAgICAgbmV4dDogaGVhZFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX19vd25lcklEKSB7XG4gICAgICAgIHRoaXMuc2l6ZSA9IG5ld1NpemU7XG4gICAgICAgIHRoaXMuX2hlYWQgPSBoZWFkO1xuICAgICAgICB0aGlzLl9faGFzaCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fX2FsdGVyZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYWtlU3RhY2sobmV3U2l6ZSwgaGVhZCk7XG4gICAgfTtcblxuICAgIFN0YWNrLnByb3RvdHlwZS5wdXNoQWxsID0gZnVuY3Rpb24oaXRlcikge1xuICAgICAgaXRlciA9IEluZGV4ZWRJdGVyYWJsZShpdGVyKTtcbiAgICAgIGlmIChpdGVyLnNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBhc3NlcnROb3RJbmZpbml0ZShpdGVyLnNpemUpO1xuICAgICAgdmFyIG5ld1NpemUgPSB0aGlzLnNpemU7XG4gICAgICB2YXIgaGVhZCA9IHRoaXMuX2hlYWQ7XG4gICAgICBpdGVyLnJldmVyc2UoKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlICkge1xuICAgICAgICBuZXdTaXplKys7XG4gICAgICAgIGhlYWQgPSB7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIG5leHQ6IGhlYWRcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuX19vd25lcklEKSB7XG4gICAgICAgIHRoaXMuc2l6ZSA9IG5ld1NpemU7XG4gICAgICAgIHRoaXMuX2hlYWQgPSBoZWFkO1xuICAgICAgICB0aGlzLl9faGFzaCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fX2FsdGVyZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYWtlU3RhY2sobmV3U2l6ZSwgaGVhZCk7XG4gICAgfTtcblxuICAgIFN0YWNrLnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnNsaWNlKDEpO1xuICAgIH07XG5cbiAgICBTdGFjay5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uKC8qLi4udmFsdWVzKi8pIHtcbiAgICAgIHJldHVybiB0aGlzLnB1c2guYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgU3RhY2sucHJvdG90eXBlLnVuc2hpZnRBbGwgPSBmdW5jdGlvbihpdGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5wdXNoQWxsKGl0ZXIpO1xuICAgIH07XG5cbiAgICBTdGFjay5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnBvcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBTdGFjay5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fX293bmVySUQpIHtcbiAgICAgICAgdGhpcy5zaXplID0gMDtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fX2hhc2ggPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX19hbHRlcmVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW1wdHlTdGFjaygpO1xuICAgIH07XG5cbiAgICBTdGFjay5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbihiZWdpbiwgZW5kKSB7XG4gICAgICBpZiAod2hvbGVTbGljZShiZWdpbiwgZW5kLCB0aGlzLnNpemUpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgdmFyIHJlc29sdmVkQmVnaW4gPSByZXNvbHZlQmVnaW4oYmVnaW4sIHRoaXMuc2l6ZSk7XG4gICAgICB2YXIgcmVzb2x2ZWRFbmQgPSByZXNvbHZlRW5kKGVuZCwgdGhpcy5zaXplKTtcbiAgICAgIGlmIChyZXNvbHZlZEVuZCAhPT0gdGhpcy5zaXplKSB7XG4gICAgICAgIC8vIHN1cGVyLnNsaWNlKGJlZ2luLCBlbmQpO1xuICAgICAgICByZXR1cm4gSW5kZXhlZENvbGxlY3Rpb24ucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcywgYmVnaW4sIGVuZCk7XG4gICAgICB9XG4gICAgICB2YXIgbmV3U2l6ZSA9IHRoaXMuc2l6ZSAtIHJlc29sdmVkQmVnaW47XG4gICAgICB2YXIgaGVhZCA9IHRoaXMuX2hlYWQ7XG4gICAgICB3aGlsZSAocmVzb2x2ZWRCZWdpbi0tKSB7XG4gICAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fX293bmVySUQpIHtcbiAgICAgICAgdGhpcy5zaXplID0gbmV3U2l6ZTtcbiAgICAgICAgdGhpcy5faGVhZCA9IGhlYWQ7XG4gICAgICAgIHRoaXMuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9fYWx0ZXJlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ha2VTdGFjayhuZXdTaXplLCBoZWFkKTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBNdXRhYmlsaXR5XG5cbiAgICBTdGFjay5wcm90b3R5cGUuX19lbnN1cmVPd25lciA9IGZ1bmN0aW9uKG93bmVySUQpIHtcbiAgICAgIGlmIChvd25lcklEID09PSB0aGlzLl9fb3duZXJJRCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmICghb3duZXJJRCkge1xuICAgICAgICB0aGlzLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgICAgIHRoaXMuX19hbHRlcmVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ha2VTdGFjayh0aGlzLnNpemUsIHRoaXMuX2hlYWQsIG93bmVySUQsIHRoaXMuX19oYXNoKTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBJdGVyYXRpb25cblxuICAgIFN0YWNrLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge1xuICAgICAgaWYgKHJldmVyc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpLl9faXRlcmF0ZShmbik7XG4gICAgICB9XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMuX2hlYWQ7XG4gICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICBpZiAoZm4obm9kZS52YWx1ZSwgaXRlcmF0aW9ucysrLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZS5uZXh0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gICAgfTtcblxuICAgIFN0YWNrLnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgICAgaWYgKHJldmVyc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpLl9faXRlcmF0b3IodHlwZSk7XG4gICAgICB9XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICB2YXIgbm9kZSA9IHRoaXMuX2hlYWQ7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkgIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBub2RlLnZhbHVlO1xuICAgICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yVmFsdWUodHlwZSwgaXRlcmF0aW9ucysrLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGl0ZXJhdG9yRG9uZSgpO1xuICAgICAgfSk7XG4gICAgfTtcblxuXG4gIGZ1bmN0aW9uIGlzU3RhY2sobWF5YmVTdGFjaykge1xuICAgIHJldHVybiAhIShtYXliZVN0YWNrICYmIG1heWJlU3RhY2tbSVNfU1RBQ0tfU0VOVElORUxdKTtcbiAgfVxuXG4gIFN0YWNrLmlzU3RhY2sgPSBpc1N0YWNrO1xuXG4gIHZhciBJU19TVEFDS19TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX1NUQUNLX19AQCc7XG5cbiAgdmFyIFN0YWNrUHJvdG90eXBlID0gU3RhY2sucHJvdG90eXBlO1xuICBTdGFja1Byb3RvdHlwZVtJU19TVEFDS19TRU5USU5FTF0gPSB0cnVlO1xuICBTdGFja1Byb3RvdHlwZS53aXRoTXV0YXRpb25zID0gTWFwUHJvdG90eXBlLndpdGhNdXRhdGlvbnM7XG4gIFN0YWNrUHJvdG90eXBlLmFzTXV0YWJsZSA9IE1hcFByb3RvdHlwZS5hc011dGFibGU7XG4gIFN0YWNrUHJvdG90eXBlLmFzSW1tdXRhYmxlID0gTWFwUHJvdG90eXBlLmFzSW1tdXRhYmxlO1xuICBTdGFja1Byb3RvdHlwZS53YXNBbHRlcmVkID0gTWFwUHJvdG90eXBlLndhc0FsdGVyZWQ7XG5cblxuICBmdW5jdGlvbiBtYWtlU3RhY2soc2l6ZSwgaGVhZCwgb3duZXJJRCwgaGFzaCkge1xuICAgIHZhciBtYXAgPSBPYmplY3QuY3JlYXRlKFN0YWNrUHJvdG90eXBlKTtcbiAgICBtYXAuc2l6ZSA9IHNpemU7XG4gICAgbWFwLl9oZWFkID0gaGVhZDtcbiAgICBtYXAuX19vd25lcklEID0gb3duZXJJRDtcbiAgICBtYXAuX19oYXNoID0gaGFzaDtcbiAgICBtYXAuX19hbHRlcmVkID0gZmFsc2U7XG4gICAgcmV0dXJuIG1hcDtcbiAgfVxuXG4gIHZhciBFTVBUWV9TVEFDSztcbiAgZnVuY3Rpb24gZW1wdHlTdGFjaygpIHtcbiAgICByZXR1cm4gRU1QVFlfU1RBQ0sgfHwgKEVNUFRZX1NUQUNLID0gbWFrZVN0YWNrKDApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cmlidXRlcyBhZGRpdGlvbmFsIG1ldGhvZHMgdG8gYSBjb25zdHJ1Y3RvclxuICAgKi9cbiAgZnVuY3Rpb24gbWl4aW4oY3RvciwgbWV0aG9kcykge1xuICAgIHZhciBrZXlDb3BpZXIgPSBmdW5jdGlvbihrZXkgKSB7IGN0b3IucHJvdG90eXBlW2tleV0gPSBtZXRob2RzW2tleV07IH07XG4gICAgT2JqZWN0LmtleXMobWV0aG9kcykuZm9yRWFjaChrZXlDb3BpZXIpO1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgJiZcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobWV0aG9kcykuZm9yRWFjaChrZXlDb3BpZXIpO1xuICAgIHJldHVybiBjdG9yO1xuICB9XG5cbiAgSXRlcmFibGUuSXRlcmF0b3IgPSBJdGVyYXRvcjtcblxuICBtaXhpbihJdGVyYWJsZSwge1xuXG4gICAgLy8gIyMjIENvbnZlcnNpb24gdG8gb3RoZXIgdHlwZXNcblxuICAgIHRvQXJyYXk6IGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0Tm90SW5maW5pdGUodGhpcy5zaXplKTtcbiAgICAgIHZhciBhcnJheSA9IG5ldyBBcnJheSh0aGlzLnNpemUgfHwgMCk7XG4gICAgICB0aGlzLnZhbHVlU2VxKCkuX19pdGVyYXRlKGZ1bmN0aW9uKHYsIGkpICB7IGFycmF5W2ldID0gdjsgfSk7XG4gICAgICByZXR1cm4gYXJyYXk7XG4gICAgfSxcblxuICAgIHRvSW5kZXhlZFNlcTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gbmV3IFRvSW5kZXhlZFNlcXVlbmNlKHRoaXMpO1xuICAgIH0sXG5cbiAgICB0b0pTOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvU2VxKCkubWFwKFxuICAgICAgICBmdW5jdGlvbih2YWx1ZSApIHtyZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRvSlMgPT09ICdmdW5jdGlvbicgPyB2YWx1ZS50b0pTKCkgOiB2YWx1ZX1cbiAgICAgICkuX190b0pTKCk7XG4gICAgfSxcblxuICAgIHRvSlNPTjogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50b1NlcSgpLm1hcChcbiAgICAgICAgZnVuY3Rpb24odmFsdWUgKSB7cmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS50b0pTT04gPT09ICdmdW5jdGlvbicgPyB2YWx1ZS50b0pTT04oKSA6IHZhbHVlfVxuICAgICAgKS5fX3RvSlMoKTtcbiAgICB9LFxuXG4gICAgdG9LZXllZFNlcTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gbmV3IFRvS2V5ZWRTZXF1ZW5jZSh0aGlzLCB0cnVlKTtcbiAgICB9LFxuXG4gICAgdG9NYXA6IGZ1bmN0aW9uKCkge1xuICAgICAgLy8gVXNlIExhdGUgQmluZGluZyBoZXJlIHRvIHNvbHZlIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5LlxuICAgICAgcmV0dXJuIE1hcCh0aGlzLnRvS2V5ZWRTZXEoKSk7XG4gICAgfSxcblxuICAgIHRvT2JqZWN0OiBmdW5jdGlvbigpIHtcbiAgICAgIGFzc2VydE5vdEluZmluaXRlKHRoaXMuc2l6ZSk7XG4gICAgICB2YXIgb2JqZWN0ID0ge307XG4gICAgICB0aGlzLl9faXRlcmF0ZShmdW5jdGlvbih2LCBrKSAgeyBvYmplY3Rba10gPSB2OyB9KTtcbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfSxcblxuICAgIHRvT3JkZXJlZE1hcDogZnVuY3Rpb24oKSB7XG4gICAgICAvLyBVc2UgTGF0ZSBCaW5kaW5nIGhlcmUgdG8gc29sdmUgdGhlIGNpcmN1bGFyIGRlcGVuZGVuY3kuXG4gICAgICByZXR1cm4gT3JkZXJlZE1hcCh0aGlzLnRvS2V5ZWRTZXEoKSk7XG4gICAgfSxcblxuICAgIHRvT3JkZXJlZFNldDogZnVuY3Rpb24oKSB7XG4gICAgICAvLyBVc2UgTGF0ZSBCaW5kaW5nIGhlcmUgdG8gc29sdmUgdGhlIGNpcmN1bGFyIGRlcGVuZGVuY3kuXG4gICAgICByZXR1cm4gT3JkZXJlZFNldChpc0tleWVkKHRoaXMpID8gdGhpcy52YWx1ZVNlcSgpIDogdGhpcyk7XG4gICAgfSxcblxuICAgIHRvU2V0OiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIFVzZSBMYXRlIEJpbmRpbmcgaGVyZSB0byBzb2x2ZSB0aGUgY2lyY3VsYXIgZGVwZW5kZW5jeS5cbiAgICAgIHJldHVybiBTZXQoaXNLZXllZCh0aGlzKSA/IHRoaXMudmFsdWVTZXEoKSA6IHRoaXMpO1xuICAgIH0sXG5cbiAgICB0b1NldFNlcTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gbmV3IFRvU2V0U2VxdWVuY2UodGhpcyk7XG4gICAgfSxcblxuICAgIHRvU2VxOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBpc0luZGV4ZWQodGhpcykgPyB0aGlzLnRvSW5kZXhlZFNlcSgpIDpcbiAgICAgICAgaXNLZXllZCh0aGlzKSA/IHRoaXMudG9LZXllZFNlcSgpIDpcbiAgICAgICAgdGhpcy50b1NldFNlcSgpO1xuICAgIH0sXG5cbiAgICB0b1N0YWNrOiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIFVzZSBMYXRlIEJpbmRpbmcgaGVyZSB0byBzb2x2ZSB0aGUgY2lyY3VsYXIgZGVwZW5kZW5jeS5cbiAgICAgIHJldHVybiBTdGFjayhpc0tleWVkKHRoaXMpID8gdGhpcy52YWx1ZVNlcSgpIDogdGhpcyk7XG4gICAgfSxcblxuICAgIHRvTGlzdDogZnVuY3Rpb24oKSB7XG4gICAgICAvLyBVc2UgTGF0ZSBCaW5kaW5nIGhlcmUgdG8gc29sdmUgdGhlIGNpcmN1bGFyIGRlcGVuZGVuY3kuXG4gICAgICByZXR1cm4gTGlzdChpc0tleWVkKHRoaXMpID8gdGhpcy52YWx1ZVNlcSgpIDogdGhpcyk7XG4gICAgfSxcblxuXG4gICAgLy8gIyMjIENvbW1vbiBKYXZhU2NyaXB0IG1ldGhvZHMgYW5kIHByb3BlcnRpZXNcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAnW0l0ZXJhYmxlXSc7XG4gICAgfSxcblxuICAgIF9fdG9TdHJpbmc6IGZ1bmN0aW9uKGhlYWQsIHRhaWwpIHtcbiAgICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGhlYWQgKyB0YWlsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhlYWQgKyAnICcgKyB0aGlzLnRvU2VxKCkubWFwKHRoaXMuX190b1N0cmluZ01hcHBlcikuam9pbignLCAnKSArICcgJyArIHRhaWw7XG4gICAgfSxcblxuXG4gICAgLy8gIyMjIEVTNiBDb2xsZWN0aW9uIG1ldGhvZHMgKEVTNiBBcnJheSBhbmQgTWFwKVxuXG4gICAgY29uY2F0OiBmdW5jdGlvbigpIHt2YXIgdmFsdWVzID0gU0xJQ0UkMC5jYWxsKGFyZ3VtZW50cywgMCk7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgY29uY2F0RmFjdG9yeSh0aGlzLCB2YWx1ZXMpKTtcbiAgICB9LFxuXG4gICAgaW5jbHVkZXM6IGZ1bmN0aW9uKHNlYXJjaFZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb21lKGZ1bmN0aW9uKHZhbHVlICkge3JldHVybiBpcyh2YWx1ZSwgc2VhcmNoVmFsdWUpfSk7XG4gICAgfSxcblxuICAgIGVudHJpZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX19pdGVyYXRvcihJVEVSQVRFX0VOVFJJRVMpO1xuICAgIH0sXG5cbiAgICBldmVyeTogZnVuY3Rpb24ocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgICBhc3NlcnROb3RJbmZpbml0ZSh0aGlzLnNpemUpO1xuICAgICAgdmFyIHJldHVyblZhbHVlID0gdHJ1ZTtcbiAgICAgIHRoaXMuX19pdGVyYXRlKGZ1bmN0aW9uKHYsIGssIGMpICB7XG4gICAgICAgIGlmICghcHJlZGljYXRlLmNhbGwoY29udGV4dCwgdiwgaywgYykpIHtcbiAgICAgICAgICByZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfSxcblxuICAgIGZpbHRlcjogZnVuY3Rpb24ocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgZmlsdGVyRmFjdG9yeSh0aGlzLCBwcmVkaWNhdGUsIGNvbnRleHQsIHRydWUpKTtcbiAgICB9LFxuXG4gICAgZmluZDogZnVuY3Rpb24ocHJlZGljYXRlLCBjb250ZXh0LCBub3RTZXRWYWx1ZSkge1xuICAgICAgdmFyIGVudHJ5ID0gdGhpcy5maW5kRW50cnkocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICAgIHJldHVybiBlbnRyeSA/IGVudHJ5WzFdIDogbm90U2V0VmFsdWU7XG4gICAgfSxcblxuICAgIGZvckVhY2g6IGZ1bmN0aW9uKHNpZGVFZmZlY3QsIGNvbnRleHQpIHtcbiAgICAgIGFzc2VydE5vdEluZmluaXRlKHRoaXMuc2l6ZSk7XG4gICAgICByZXR1cm4gdGhpcy5fX2l0ZXJhdGUoY29udGV4dCA/IHNpZGVFZmZlY3QuYmluZChjb250ZXh0KSA6IHNpZGVFZmZlY3QpO1xuICAgIH0sXG5cbiAgICBqb2luOiBmdW5jdGlvbihzZXBhcmF0b3IpIHtcbiAgICAgIGFzc2VydE5vdEluZmluaXRlKHRoaXMuc2l6ZSk7XG4gICAgICBzZXBhcmF0b3IgPSBzZXBhcmF0b3IgIT09IHVuZGVmaW5lZCA/ICcnICsgc2VwYXJhdG9yIDogJywnO1xuICAgICAgdmFyIGpvaW5lZCA9ICcnO1xuICAgICAgdmFyIGlzRmlyc3QgPSB0cnVlO1xuICAgICAgdGhpcy5fX2l0ZXJhdGUoZnVuY3Rpb24odiApIHtcbiAgICAgICAgaXNGaXJzdCA/IChpc0ZpcnN0ID0gZmFsc2UpIDogKGpvaW5lZCArPSBzZXBhcmF0b3IpO1xuICAgICAgICBqb2luZWQgKz0gdiAhPT0gbnVsbCAmJiB2ICE9PSB1bmRlZmluZWQgPyB2LnRvU3RyaW5nKCkgOiAnJztcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGpvaW5lZDtcbiAgICB9LFxuXG4gICAga2V5czogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2l0ZXJhdG9yKElURVJBVEVfS0VZUyk7XG4gICAgfSxcblxuICAgIG1hcDogZnVuY3Rpb24obWFwcGVyLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgbWFwRmFjdG9yeSh0aGlzLCBtYXBwZXIsIGNvbnRleHQpKTtcbiAgICB9LFxuXG4gICAgcmVkdWNlOiBmdW5jdGlvbihyZWR1Y2VyLCBpbml0aWFsUmVkdWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICBhc3NlcnROb3RJbmZpbml0ZSh0aGlzLnNpemUpO1xuICAgICAgdmFyIHJlZHVjdGlvbjtcbiAgICAgIHZhciB1c2VGaXJzdDtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgICB1c2VGaXJzdCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWR1Y3Rpb24gPSBpbml0aWFsUmVkdWN0aW9uO1xuICAgICAgfVxuICAgICAgdGhpcy5fX2l0ZXJhdGUoZnVuY3Rpb24odiwgaywgYykgIHtcbiAgICAgICAgaWYgKHVzZUZpcnN0KSB7XG4gICAgICAgICAgdXNlRmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICByZWR1Y3Rpb24gPSB2O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlZHVjdGlvbiA9IHJlZHVjZXIuY2FsbChjb250ZXh0LCByZWR1Y3Rpb24sIHYsIGssIGMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZWR1Y3Rpb247XG4gICAgfSxcblxuICAgIHJlZHVjZVJpZ2h0OiBmdW5jdGlvbihyZWR1Y2VyLCBpbml0aWFsUmVkdWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICB2YXIgcmV2ZXJzZWQgPSB0aGlzLnRvS2V5ZWRTZXEoKS5yZXZlcnNlKCk7XG4gICAgICByZXR1cm4gcmV2ZXJzZWQucmVkdWNlLmFwcGx5KHJldmVyc2VkLCBhcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICByZXZlcnNlOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCByZXZlcnNlRmFjdG9yeSh0aGlzLCB0cnVlKSk7XG4gICAgfSxcblxuICAgIHNsaWNlOiBmdW5jdGlvbihiZWdpbiwgZW5kKSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgc2xpY2VGYWN0b3J5KHRoaXMsIGJlZ2luLCBlbmQsIHRydWUpKTtcbiAgICB9LFxuXG4gICAgc29tZTogZnVuY3Rpb24ocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gIXRoaXMuZXZlcnkobm90KHByZWRpY2F0ZSksIGNvbnRleHQpO1xuICAgIH0sXG5cbiAgICBzb3J0OiBmdW5jdGlvbihjb21wYXJhdG9yKSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgc29ydEZhY3RvcnkodGhpcywgY29tcGFyYXRvcikpO1xuICAgIH0sXG5cbiAgICB2YWx1ZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX19pdGVyYXRvcihJVEVSQVRFX1ZBTFVFUyk7XG4gICAgfSxcblxuXG4gICAgLy8gIyMjIE1vcmUgc2VxdWVudGlhbCBtZXRob2RzXG5cbiAgICBidXRMYXN0OiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnNsaWNlKDAsIC0xKTtcbiAgICB9LFxuXG4gICAgaXNFbXB0eTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaXplICE9PSB1bmRlZmluZWQgPyB0aGlzLnNpemUgPT09IDAgOiAhdGhpcy5zb21lKGZ1bmN0aW9uKCkgIHtyZXR1cm4gdHJ1ZX0pO1xuICAgIH0sXG5cbiAgICBjb3VudDogZnVuY3Rpb24ocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gZW5zdXJlU2l6ZShcbiAgICAgICAgcHJlZGljYXRlID8gdGhpcy50b1NlcSgpLmZpbHRlcihwcmVkaWNhdGUsIGNvbnRleHQpIDogdGhpc1xuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY291bnRCeTogZnVuY3Rpb24oZ3JvdXBlciwgY29udGV4dCkge1xuICAgICAgcmV0dXJuIGNvdW50QnlGYWN0b3J5KHRoaXMsIGdyb3VwZXIsIGNvbnRleHQpO1xuICAgIH0sXG5cbiAgICBlcXVhbHM6IGZ1bmN0aW9uKG90aGVyKSB7XG4gICAgICByZXR1cm4gZGVlcEVxdWFsKHRoaXMsIG90aGVyKTtcbiAgICB9LFxuXG4gICAgZW50cnlTZXE6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGl0ZXJhYmxlID0gdGhpcztcbiAgICAgIGlmIChpdGVyYWJsZS5fY2FjaGUpIHtcbiAgICAgICAgLy8gV2UgY2FjaGUgYXMgYW4gZW50cmllcyBhcnJheSwgc28gd2UgY2FuIGp1c3QgcmV0dXJuIHRoZSBjYWNoZSFcbiAgICAgICAgcmV0dXJuIG5ldyBBcnJheVNlcShpdGVyYWJsZS5fY2FjaGUpO1xuICAgICAgfVxuICAgICAgdmFyIGVudHJpZXNTZXF1ZW5jZSA9IGl0ZXJhYmxlLnRvU2VxKCkubWFwKGVudHJ5TWFwcGVyKS50b0luZGV4ZWRTZXEoKTtcbiAgICAgIGVudHJpZXNTZXF1ZW5jZS5mcm9tRW50cnlTZXEgPSBmdW5jdGlvbigpICB7cmV0dXJuIGl0ZXJhYmxlLnRvU2VxKCl9O1xuICAgICAgcmV0dXJuIGVudHJpZXNTZXF1ZW5jZTtcbiAgICB9LFxuXG4gICAgZmlsdGVyTm90OiBmdW5jdGlvbihwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcihub3QocHJlZGljYXRlKSwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIGZpbmRFbnRyeTogZnVuY3Rpb24ocHJlZGljYXRlLCBjb250ZXh0LCBub3RTZXRWYWx1ZSkge1xuICAgICAgdmFyIGZvdW5kID0gbm90U2V0VmFsdWU7XG4gICAgICB0aGlzLl9faXRlcmF0ZShmdW5jdGlvbih2LCBrLCBjKSAge1xuICAgICAgICBpZiAocHJlZGljYXRlLmNhbGwoY29udGV4dCwgdiwgaywgYykpIHtcbiAgICAgICAgICBmb3VuZCA9IFtrLCB2XTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH0sXG5cbiAgICBmaW5kS2V5OiBmdW5jdGlvbihwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICAgIHZhciBlbnRyeSA9IHRoaXMuZmluZEVudHJ5KHByZWRpY2F0ZSwgY29udGV4dCk7XG4gICAgICByZXR1cm4gZW50cnkgJiYgZW50cnlbMF07XG4gICAgfSxcblxuICAgIGZpbmRMYXN0OiBmdW5jdGlvbihwcmVkaWNhdGUsIGNvbnRleHQsIG5vdFNldFZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy50b0tleWVkU2VxKCkucmV2ZXJzZSgpLmZpbmQocHJlZGljYXRlLCBjb250ZXh0LCBub3RTZXRWYWx1ZSk7XG4gICAgfSxcblxuICAgIGZpbmRMYXN0RW50cnk6IGZ1bmN0aW9uKHByZWRpY2F0ZSwgY29udGV4dCwgbm90U2V0VmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvS2V5ZWRTZXEoKS5yZXZlcnNlKCkuZmluZEVudHJ5KHByZWRpY2F0ZSwgY29udGV4dCwgbm90U2V0VmFsdWUpO1xuICAgIH0sXG5cbiAgICBmaW5kTGFzdEtleTogZnVuY3Rpb24ocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gdGhpcy50b0tleWVkU2VxKCkucmV2ZXJzZSgpLmZpbmRLZXkocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICB9LFxuXG4gICAgZmlyc3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmluZChyZXR1cm5UcnVlKTtcbiAgICB9LFxuXG4gICAgZmxhdE1hcDogZnVuY3Rpb24obWFwcGVyLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgZmxhdE1hcEZhY3RvcnkodGhpcywgbWFwcGVyLCBjb250ZXh0KSk7XG4gICAgfSxcblxuICAgIGZsYXR0ZW46IGZ1bmN0aW9uKGRlcHRoKSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgZmxhdHRlbkZhY3RvcnkodGhpcywgZGVwdGgsIHRydWUpKTtcbiAgICB9LFxuXG4gICAgZnJvbUVudHJ5U2VxOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBuZXcgRnJvbUVudHJpZXNTZXF1ZW5jZSh0aGlzKTtcbiAgICB9LFxuXG4gICAgZ2V0OiBmdW5jdGlvbihzZWFyY2hLZXksIG5vdFNldFZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5maW5kKGZ1bmN0aW9uKF8sIGtleSkgIHtyZXR1cm4gaXMoa2V5LCBzZWFyY2hLZXkpfSwgdW5kZWZpbmVkLCBub3RTZXRWYWx1ZSk7XG4gICAgfSxcblxuICAgIGdldEluOiBmdW5jdGlvbihzZWFyY2hLZXlQYXRoLCBub3RTZXRWYWx1ZSkge1xuICAgICAgdmFyIG5lc3RlZCA9IHRoaXM7XG4gICAgICAvLyBOb3RlOiBpbiBhbiBFUzYgZW52aXJvbm1lbnQsIHdlIHdvdWxkIHByZWZlcjpcbiAgICAgIC8vIGZvciAodmFyIGtleSBvZiBzZWFyY2hLZXlQYXRoKSB7XG4gICAgICB2YXIgaXRlciA9IGZvcmNlSXRlcmF0b3Ioc2VhcmNoS2V5UGF0aCk7XG4gICAgICB2YXIgc3RlcDtcbiAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyLm5leHQoKSkuZG9uZSkge1xuICAgICAgICB2YXIga2V5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgbmVzdGVkID0gbmVzdGVkICYmIG5lc3RlZC5nZXQgPyBuZXN0ZWQuZ2V0KGtleSwgTk9UX1NFVCkgOiBOT1RfU0VUO1xuICAgICAgICBpZiAobmVzdGVkID09PSBOT1RfU0VUKSB7XG4gICAgICAgICAgcmV0dXJuIG5vdFNldFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmVzdGVkO1xuICAgIH0sXG5cbiAgICBncm91cEJ5OiBmdW5jdGlvbihncm91cGVyLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gZ3JvdXBCeUZhY3RvcnkodGhpcywgZ3JvdXBlciwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIGhhczogZnVuY3Rpb24oc2VhcmNoS2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoc2VhcmNoS2V5LCBOT1RfU0VUKSAhPT0gTk9UX1NFVDtcbiAgICB9LFxuXG4gICAgaGFzSW46IGZ1bmN0aW9uKHNlYXJjaEtleVBhdGgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEluKHNlYXJjaEtleVBhdGgsIE5PVF9TRVQpICE9PSBOT1RfU0VUO1xuICAgIH0sXG5cbiAgICBpc1N1YnNldDogZnVuY3Rpb24oaXRlcikge1xuICAgICAgaXRlciA9IHR5cGVvZiBpdGVyLmluY2x1ZGVzID09PSAnZnVuY3Rpb24nID8gaXRlciA6IEl0ZXJhYmxlKGl0ZXIpO1xuICAgICAgcmV0dXJuIHRoaXMuZXZlcnkoZnVuY3Rpb24odmFsdWUgKSB7cmV0dXJuIGl0ZXIuaW5jbHVkZXModmFsdWUpfSk7XG4gICAgfSxcblxuICAgIGlzU3VwZXJzZXQ6IGZ1bmN0aW9uKGl0ZXIpIHtcbiAgICAgIGl0ZXIgPSB0eXBlb2YgaXRlci5pc1N1YnNldCA9PT0gJ2Z1bmN0aW9uJyA/IGl0ZXIgOiBJdGVyYWJsZShpdGVyKTtcbiAgICAgIHJldHVybiBpdGVyLmlzU3Vic2V0KHRoaXMpO1xuICAgIH0sXG5cbiAgICBrZXlPZjogZnVuY3Rpb24oc2VhcmNoVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbmRLZXkoZnVuY3Rpb24odmFsdWUgKSB7cmV0dXJuIGlzKHZhbHVlLCBzZWFyY2hWYWx1ZSl9KTtcbiAgICB9LFxuXG4gICAga2V5U2VxOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvU2VxKCkubWFwKGtleU1hcHBlcikudG9JbmRleGVkU2VxKCk7XG4gICAgfSxcblxuICAgIGxhc3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9TZXEoKS5yZXZlcnNlKCkuZmlyc3QoKTtcbiAgICB9LFxuXG4gICAgbGFzdEtleU9mOiBmdW5jdGlvbihzZWFyY2hWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMudG9LZXllZFNlcSgpLnJldmVyc2UoKS5rZXlPZihzZWFyY2hWYWx1ZSk7XG4gICAgfSxcblxuICAgIG1heDogZnVuY3Rpb24oY29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIG1heEZhY3RvcnkodGhpcywgY29tcGFyYXRvcik7XG4gICAgfSxcblxuICAgIG1heEJ5OiBmdW5jdGlvbihtYXBwZXIsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiBtYXhGYWN0b3J5KHRoaXMsIGNvbXBhcmF0b3IsIG1hcHBlcik7XG4gICAgfSxcblxuICAgIG1pbjogZnVuY3Rpb24oY29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIG1heEZhY3RvcnkodGhpcywgY29tcGFyYXRvciA/IG5lZyhjb21wYXJhdG9yKSA6IGRlZmF1bHROZWdDb21wYXJhdG9yKTtcbiAgICB9LFxuXG4gICAgbWluQnk6IGZ1bmN0aW9uKG1hcHBlciwgY29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIG1heEZhY3RvcnkodGhpcywgY29tcGFyYXRvciA/IG5lZyhjb21wYXJhdG9yKSA6IGRlZmF1bHROZWdDb21wYXJhdG9yLCBtYXBwZXIpO1xuICAgIH0sXG5cbiAgICByZXN0OiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnNsaWNlKDEpO1xuICAgIH0sXG5cbiAgICBza2lwOiBmdW5jdGlvbihhbW91bnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNsaWNlKE1hdGgubWF4KDAsIGFtb3VudCkpO1xuICAgIH0sXG5cbiAgICBza2lwTGFzdDogZnVuY3Rpb24oYW1vdW50KSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgdGhpcy50b1NlcSgpLnJldmVyc2UoKS5za2lwKGFtb3VudCkucmV2ZXJzZSgpKTtcbiAgICB9LFxuXG4gICAgc2tpcFdoaWxlOiBmdW5jdGlvbihwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCBza2lwV2hpbGVGYWN0b3J5KHRoaXMsIHByZWRpY2F0ZSwgY29udGV4dCwgdHJ1ZSkpO1xuICAgIH0sXG5cbiAgICBza2lwVW50aWw6IGZ1bmN0aW9uKHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2tpcFdoaWxlKG5vdChwcmVkaWNhdGUpLCBjb250ZXh0KTtcbiAgICB9LFxuXG4gICAgc29ydEJ5OiBmdW5jdGlvbihtYXBwZXIsIGNvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCBzb3J0RmFjdG9yeSh0aGlzLCBjb21wYXJhdG9yLCBtYXBwZXIpKTtcbiAgICB9LFxuXG4gICAgdGFrZTogZnVuY3Rpb24oYW1vdW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5zbGljZSgwLCBNYXRoLm1heCgwLCBhbW91bnQpKTtcbiAgICB9LFxuXG4gICAgdGFrZUxhc3Q6IGZ1bmN0aW9uKGFtb3VudCkge1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHRoaXMudG9TZXEoKS5yZXZlcnNlKCkudGFrZShhbW91bnQpLnJldmVyc2UoKSk7XG4gICAgfSxcblxuICAgIHRha2VXaGlsZTogZnVuY3Rpb24ocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgdGFrZVdoaWxlRmFjdG9yeSh0aGlzLCBwcmVkaWNhdGUsIGNvbnRleHQpKTtcbiAgICB9LFxuXG4gICAgdGFrZVVudGlsOiBmdW5jdGlvbihwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRha2VXaGlsZShub3QocHJlZGljYXRlKSwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIHZhbHVlU2VxOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvSW5kZXhlZFNlcSgpO1xuICAgIH0sXG5cblxuICAgIC8vICMjIyBIYXNoYWJsZSBPYmplY3RcblxuICAgIGhhc2hDb2RlOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9faGFzaCB8fCAodGhpcy5fX2hhc2ggPSBoYXNoSXRlcmFibGUodGhpcykpO1xuICAgIH1cblxuXG4gICAgLy8gIyMjIEludGVybmFsXG5cbiAgICAvLyBhYnN0cmFjdCBfX2l0ZXJhdGUoZm4sIHJldmVyc2UpXG5cbiAgICAvLyBhYnN0cmFjdCBfX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpXG4gIH0pO1xuXG4gIC8vIHZhciBJU19JVEVSQUJMRV9TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX0lURVJBQkxFX19AQCc7XG4gIC8vIHZhciBJU19LRVlFRF9TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX0tFWUVEX19AQCc7XG4gIC8vIHZhciBJU19JTkRFWEVEX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfSU5ERVhFRF9fQEAnO1xuICAvLyB2YXIgSVNfT1JERVJFRF9TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX09SREVSRURfX0BAJztcblxuICB2YXIgSXRlcmFibGVQcm90b3R5cGUgPSBJdGVyYWJsZS5wcm90b3R5cGU7XG4gIEl0ZXJhYmxlUHJvdG90eXBlW0lTX0lURVJBQkxFX1NFTlRJTkVMXSA9IHRydWU7XG4gIEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SX1NZTUJPTF0gPSBJdGVyYWJsZVByb3RvdHlwZS52YWx1ZXM7XG4gIEl0ZXJhYmxlUHJvdG90eXBlLl9fdG9KUyA9IEl0ZXJhYmxlUHJvdG90eXBlLnRvQXJyYXk7XG4gIEl0ZXJhYmxlUHJvdG90eXBlLl9fdG9TdHJpbmdNYXBwZXIgPSBxdW90ZVN0cmluZztcbiAgSXRlcmFibGVQcm90b3R5cGUuaW5zcGVjdCA9XG4gIEl0ZXJhYmxlUHJvdG90eXBlLnRvU291cmNlID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnRvU3RyaW5nKCk7IH07XG4gIEl0ZXJhYmxlUHJvdG90eXBlLmNoYWluID0gSXRlcmFibGVQcm90b3R5cGUuZmxhdE1hcDtcbiAgSXRlcmFibGVQcm90b3R5cGUuY29udGFpbnMgPSBJdGVyYWJsZVByb3RvdHlwZS5pbmNsdWRlcztcblxuICBtaXhpbihLZXllZEl0ZXJhYmxlLCB7XG5cbiAgICAvLyAjIyMgTW9yZSBzZXF1ZW50aWFsIG1ldGhvZHNcblxuICAgIGZsaXA6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIGZsaXBGYWN0b3J5KHRoaXMpKTtcbiAgICB9LFxuXG4gICAgbWFwRW50cmllczogZnVuY3Rpb24obWFwcGVyLCBjb250ZXh0KSB7dmFyIHRoaXMkMCA9IHRoaXM7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcyxcbiAgICAgICAgdGhpcy50b1NlcSgpLm1hcChcbiAgICAgICAgICBmdW5jdGlvbih2LCBrKSAge3JldHVybiBtYXBwZXIuY2FsbChjb250ZXh0LCBbaywgdl0sIGl0ZXJhdGlvbnMrKywgdGhpcyQwKX1cbiAgICAgICAgKS5mcm9tRW50cnlTZXEoKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgbWFwS2V5czogZnVuY3Rpb24obWFwcGVyLCBjb250ZXh0KSB7dmFyIHRoaXMkMCA9IHRoaXM7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcyxcbiAgICAgICAgdGhpcy50b1NlcSgpLmZsaXAoKS5tYXAoXG4gICAgICAgICAgZnVuY3Rpb24oaywgdikgIHtyZXR1cm4gbWFwcGVyLmNhbGwoY29udGV4dCwgaywgdiwgdGhpcyQwKX1cbiAgICAgICAgKS5mbGlwKClcbiAgICAgICk7XG4gICAgfVxuXG4gIH0pO1xuXG4gIHZhciBLZXllZEl0ZXJhYmxlUHJvdG90eXBlID0gS2V5ZWRJdGVyYWJsZS5wcm90b3R5cGU7XG4gIEtleWVkSXRlcmFibGVQcm90b3R5cGVbSVNfS0VZRURfU0VOVElORUxdID0gdHJ1ZTtcbiAgS2V5ZWRJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl9TWU1CT0xdID0gSXRlcmFibGVQcm90b3R5cGUuZW50cmllcztcbiAgS2V5ZWRJdGVyYWJsZVByb3RvdHlwZS5fX3RvSlMgPSBJdGVyYWJsZVByb3RvdHlwZS50b09iamVjdDtcbiAgS2V5ZWRJdGVyYWJsZVByb3RvdHlwZS5fX3RvU3RyaW5nTWFwcGVyID0gZnVuY3Rpb24odiwgaykgIHtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoaykgKyAnOiAnICsgcXVvdGVTdHJpbmcodil9O1xuXG5cblxuICBtaXhpbihJbmRleGVkSXRlcmFibGUsIHtcblxuICAgIC8vICMjIyBDb252ZXJzaW9uIHRvIG90aGVyIHR5cGVzXG5cbiAgICB0b0tleWVkU2VxOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBuZXcgVG9LZXllZFNlcXVlbmNlKHRoaXMsIGZhbHNlKTtcbiAgICB9LFxuXG5cbiAgICAvLyAjIyMgRVM2IENvbGxlY3Rpb24gbWV0aG9kcyAoRVM2IEFycmF5IGFuZCBNYXApXG5cbiAgICBmaWx0ZXI6IGZ1bmN0aW9uKHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIGZpbHRlckZhY3RvcnkodGhpcywgcHJlZGljYXRlLCBjb250ZXh0LCBmYWxzZSkpO1xuICAgIH0sXG5cbiAgICBmaW5kSW5kZXg6IGZ1bmN0aW9uKHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgICAgdmFyIGVudHJ5ID0gdGhpcy5maW5kRW50cnkocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICAgIHJldHVybiBlbnRyeSA/IGVudHJ5WzBdIDogLTE7XG4gICAgfSxcblxuICAgIGluZGV4T2Y6IGZ1bmN0aW9uKHNlYXJjaFZhbHVlKSB7XG4gICAgICB2YXIga2V5ID0gdGhpcy5rZXlPZihzZWFyY2hWYWx1ZSk7XG4gICAgICByZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgPyAtMSA6IGtleTtcbiAgICB9LFxuXG4gICAgbGFzdEluZGV4T2Y6IGZ1bmN0aW9uKHNlYXJjaFZhbHVlKSB7XG4gICAgICB2YXIga2V5ID0gdGhpcy5sYXN0S2V5T2Yoc2VhcmNoVmFsdWUpO1xuICAgICAgcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8gLTEgOiBrZXk7XG4gICAgfSxcblxuICAgIHJldmVyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHJldmVyc2VGYWN0b3J5KHRoaXMsIGZhbHNlKSk7XG4gICAgfSxcblxuICAgIHNsaWNlOiBmdW5jdGlvbihiZWdpbiwgZW5kKSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgc2xpY2VGYWN0b3J5KHRoaXMsIGJlZ2luLCBlbmQsIGZhbHNlKSk7XG4gICAgfSxcblxuICAgIHNwbGljZTogZnVuY3Rpb24oaW5kZXgsIHJlbW92ZU51bSAvKiwgLi4udmFsdWVzKi8pIHtcbiAgICAgIHZhciBudW1BcmdzID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIHJlbW92ZU51bSA9IE1hdGgubWF4KHJlbW92ZU51bSB8IDAsIDApO1xuICAgICAgaWYgKG51bUFyZ3MgPT09IDAgfHwgKG51bUFyZ3MgPT09IDIgJiYgIXJlbW92ZU51bSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICAvLyBJZiBpbmRleCBpcyBuZWdhdGl2ZSwgaXQgc2hvdWxkIHJlc29sdmUgcmVsYXRpdmUgdG8gdGhlIHNpemUgb2YgdGhlXG4gICAgICAvLyBjb2xsZWN0aW9uLiBIb3dldmVyIHNpemUgbWF5IGJlIGV4cGVuc2l2ZSB0byBjb21wdXRlIGlmIG5vdCBjYWNoZWQsIHNvXG4gICAgICAvLyBvbmx5IGNhbGwgY291bnQoKSBpZiB0aGUgbnVtYmVyIGlzIGluIGZhY3QgbmVnYXRpdmUuXG4gICAgICBpbmRleCA9IHJlc29sdmVCZWdpbihpbmRleCwgaW5kZXggPCAwID8gdGhpcy5jb3VudCgpIDogdGhpcy5zaXplKTtcbiAgICAgIHZhciBzcGxpY2VkID0gdGhpcy5zbGljZSgwLCBpbmRleCk7XG4gICAgICByZXR1cm4gcmVpZnkoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIG51bUFyZ3MgPT09IDEgP1xuICAgICAgICAgIHNwbGljZWQgOlxuICAgICAgICAgIHNwbGljZWQuY29uY2F0KGFyckNvcHkoYXJndW1lbnRzLCAyKSwgdGhpcy5zbGljZShpbmRleCArIHJlbW92ZU51bSkpXG4gICAgICApO1xuICAgIH0sXG5cblxuICAgIC8vICMjIyBNb3JlIGNvbGxlY3Rpb24gbWV0aG9kc1xuXG4gICAgZmluZExhc3RJbmRleDogZnVuY3Rpb24ocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgICB2YXIgZW50cnkgPSB0aGlzLmZpbmRMYXN0RW50cnkocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICAgIHJldHVybiBlbnRyeSA/IGVudHJ5WzBdIDogLTE7XG4gICAgfSxcblxuICAgIGZpcnN0OiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldCgwKTtcbiAgICB9LFxuXG4gICAgZmxhdHRlbjogZnVuY3Rpb24oZGVwdGgpIHtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCBmbGF0dGVuRmFjdG9yeSh0aGlzLCBkZXB0aCwgZmFsc2UpKTtcbiAgICB9LFxuXG4gICAgZ2V0OiBmdW5jdGlvbihpbmRleCwgbm90U2V0VmFsdWUpIHtcbiAgICAgIGluZGV4ID0gd3JhcEluZGV4KHRoaXMsIGluZGV4KTtcbiAgICAgIHJldHVybiAoaW5kZXggPCAwIHx8ICh0aGlzLnNpemUgPT09IEluZmluaXR5IHx8XG4gICAgICAgICAgKHRoaXMuc2l6ZSAhPT0gdW5kZWZpbmVkICYmIGluZGV4ID4gdGhpcy5zaXplKSkpID9cbiAgICAgICAgbm90U2V0VmFsdWUgOlxuICAgICAgICB0aGlzLmZpbmQoZnVuY3Rpb24oXywga2V5KSAge3JldHVybiBrZXkgPT09IGluZGV4fSwgdW5kZWZpbmVkLCBub3RTZXRWYWx1ZSk7XG4gICAgfSxcblxuICAgIGhhczogZnVuY3Rpb24oaW5kZXgpIHtcbiAgICAgIGluZGV4ID0gd3JhcEluZGV4KHRoaXMsIGluZGV4KTtcbiAgICAgIHJldHVybiBpbmRleCA+PSAwICYmICh0aGlzLnNpemUgIT09IHVuZGVmaW5lZCA/XG4gICAgICAgIHRoaXMuc2l6ZSA9PT0gSW5maW5pdHkgfHwgaW5kZXggPCB0aGlzLnNpemUgOlxuICAgICAgICB0aGlzLmluZGV4T2YoaW5kZXgpICE9PSAtMVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgaW50ZXJwb3NlOiBmdW5jdGlvbihzZXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCBpbnRlcnBvc2VGYWN0b3J5KHRoaXMsIHNlcGFyYXRvcikpO1xuICAgIH0sXG5cbiAgICBpbnRlcmxlYXZlOiBmdW5jdGlvbigvKi4uLml0ZXJhYmxlcyovKSB7XG4gICAgICB2YXIgaXRlcmFibGVzID0gW3RoaXNdLmNvbmNhdChhcnJDb3B5KGFyZ3VtZW50cykpO1xuICAgICAgdmFyIHppcHBlZCA9IHppcFdpdGhGYWN0b3J5KHRoaXMudG9TZXEoKSwgSW5kZXhlZFNlcS5vZiwgaXRlcmFibGVzKTtcbiAgICAgIHZhciBpbnRlcmxlYXZlZCA9IHppcHBlZC5mbGF0dGVuKHRydWUpO1xuICAgICAgaWYgKHppcHBlZC5zaXplKSB7XG4gICAgICAgIGludGVybGVhdmVkLnNpemUgPSB6aXBwZWQuc2l6ZSAqIGl0ZXJhYmxlcy5sZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgaW50ZXJsZWF2ZWQpO1xuICAgIH0sXG5cbiAgICBrZXlTZXE6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIFJhbmdlKDAsIHRoaXMuc2l6ZSk7XG4gICAgfSxcblxuICAgIGxhc3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0KC0xKTtcbiAgICB9LFxuXG4gICAgc2tpcFdoaWxlOiBmdW5jdGlvbihwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCBza2lwV2hpbGVGYWN0b3J5KHRoaXMsIHByZWRpY2F0ZSwgY29udGV4dCwgZmFsc2UpKTtcbiAgICB9LFxuXG4gICAgemlwOiBmdW5jdGlvbigvKiwgLi4uaXRlcmFibGVzICovKSB7XG4gICAgICB2YXIgaXRlcmFibGVzID0gW3RoaXNdLmNvbmNhdChhcnJDb3B5KGFyZ3VtZW50cykpO1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHppcFdpdGhGYWN0b3J5KHRoaXMsIGRlZmF1bHRaaXBwZXIsIGl0ZXJhYmxlcykpO1xuICAgIH0sXG5cbiAgICB6aXBXaXRoOiBmdW5jdGlvbih6aXBwZXIvKiwgLi4uaXRlcmFibGVzICovKSB7XG4gICAgICB2YXIgaXRlcmFibGVzID0gYXJyQ29weShhcmd1bWVudHMpO1xuICAgICAgaXRlcmFibGVzWzBdID0gdGhpcztcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCB6aXBXaXRoRmFjdG9yeSh0aGlzLCB6aXBwZXIsIGl0ZXJhYmxlcykpO1xuICAgIH1cblxuICB9KTtcblxuICBJbmRleGVkSXRlcmFibGUucHJvdG90eXBlW0lTX0lOREVYRURfU0VOVElORUxdID0gdHJ1ZTtcbiAgSW5kZXhlZEl0ZXJhYmxlLnByb3RvdHlwZVtJU19PUkRFUkVEX1NFTlRJTkVMXSA9IHRydWU7XG5cblxuXG4gIG1peGluKFNldEl0ZXJhYmxlLCB7XG5cbiAgICAvLyAjIyMgRVM2IENvbGxlY3Rpb24gbWV0aG9kcyAoRVM2IEFycmF5IGFuZCBNYXApXG5cbiAgICBnZXQ6IGZ1bmN0aW9uKHZhbHVlLCBub3RTZXRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzKHZhbHVlKSA/IHZhbHVlIDogbm90U2V0VmFsdWU7XG4gICAgfSxcblxuICAgIGluY2x1ZGVzOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzKHZhbHVlKTtcbiAgICB9LFxuXG5cbiAgICAvLyAjIyMgTW9yZSBzZXF1ZW50aWFsIG1ldGhvZHNcblxuICAgIGtleVNlcTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZVNlcSgpO1xuICAgIH1cblxuICB9KTtcblxuICBTZXRJdGVyYWJsZS5wcm90b3R5cGUuaGFzID0gSXRlcmFibGVQcm90b3R5cGUuaW5jbHVkZXM7XG4gIFNldEl0ZXJhYmxlLnByb3RvdHlwZS5jb250YWlucyA9IFNldEl0ZXJhYmxlLnByb3RvdHlwZS5pbmNsdWRlcztcblxuXG4gIC8vIE1peGluIHN1YmNsYXNzZXNcblxuICBtaXhpbihLZXllZFNlcSwgS2V5ZWRJdGVyYWJsZS5wcm90b3R5cGUpO1xuICBtaXhpbihJbmRleGVkU2VxLCBJbmRleGVkSXRlcmFibGUucHJvdG90eXBlKTtcbiAgbWl4aW4oU2V0U2VxLCBTZXRJdGVyYWJsZS5wcm90b3R5cGUpO1xuXG4gIG1peGluKEtleWVkQ29sbGVjdGlvbiwgS2V5ZWRJdGVyYWJsZS5wcm90b3R5cGUpO1xuICBtaXhpbihJbmRleGVkQ29sbGVjdGlvbiwgSW5kZXhlZEl0ZXJhYmxlLnByb3RvdHlwZSk7XG4gIG1peGluKFNldENvbGxlY3Rpb24sIFNldEl0ZXJhYmxlLnByb3RvdHlwZSk7XG5cblxuICAvLyAjcHJhZ21hIEhlbHBlciBmdW5jdGlvbnNcblxuICBmdW5jdGlvbiBrZXlNYXBwZXIodiwgaykge1xuICAgIHJldHVybiBrO1xuICB9XG5cbiAgZnVuY3Rpb24gZW50cnlNYXBwZXIodiwgaykge1xuICAgIHJldHVybiBbaywgdl07XG4gIH1cblxuICBmdW5jdGlvbiBub3QocHJlZGljYXRlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuICFwcmVkaWNhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBuZWcocHJlZGljYXRlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIC1wcmVkaWNhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBxdW90ZVN0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gSlNPTi5zdHJpbmdpZnkodmFsdWUpIDogU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlZmF1bHRaaXBwZXIoKSB7XG4gICAgcmV0dXJuIGFyckNvcHkoYXJndW1lbnRzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlZmF1bHROZWdDb21wYXJhdG9yKGEsIGIpIHtcbiAgICByZXR1cm4gYSA8IGIgPyAxIDogYSA+IGIgPyAtMSA6IDA7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNoSXRlcmFibGUoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUuc2l6ZSA9PT0gSW5maW5pdHkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICB2YXIgb3JkZXJlZCA9IGlzT3JkZXJlZChpdGVyYWJsZSk7XG4gICAgdmFyIGtleWVkID0gaXNLZXllZChpdGVyYWJsZSk7XG4gICAgdmFyIGggPSBvcmRlcmVkID8gMSA6IDA7XG4gICAgdmFyIHNpemUgPSBpdGVyYWJsZS5fX2l0ZXJhdGUoXG4gICAgICBrZXllZCA/XG4gICAgICAgIG9yZGVyZWQgP1xuICAgICAgICAgIGZ1bmN0aW9uKHYsIGspICB7IGggPSAzMSAqIGggKyBoYXNoTWVyZ2UoaGFzaCh2KSwgaGFzaChrKSkgfCAwOyB9IDpcbiAgICAgICAgICBmdW5jdGlvbih2LCBrKSAgeyBoID0gaCArIGhhc2hNZXJnZShoYXNoKHYpLCBoYXNoKGspKSB8IDA7IH0gOlxuICAgICAgICBvcmRlcmVkID9cbiAgICAgICAgICBmdW5jdGlvbih2ICkgeyBoID0gMzEgKiBoICsgaGFzaCh2KSB8IDA7IH0gOlxuICAgICAgICAgIGZ1bmN0aW9uKHYgKSB7IGggPSBoICsgaGFzaCh2KSB8IDA7IH1cbiAgICApO1xuICAgIHJldHVybiBtdXJtdXJIYXNoT2ZTaXplKHNpemUsIGgpO1xuICB9XG5cbiAgZnVuY3Rpb24gbXVybXVySGFzaE9mU2l6ZShzaXplLCBoKSB7XG4gICAgaCA9IGltdWwoaCwgMHhDQzlFMkQ1MSk7XG4gICAgaCA9IGltdWwoaCA8PCAxNSB8IGggPj4+IC0xNSwgMHgxQjg3MzU5Myk7XG4gICAgaCA9IGltdWwoaCA8PCAxMyB8IGggPj4+IC0xMywgNSk7XG4gICAgaCA9IChoICsgMHhFNjU0NkI2NCB8IDApIF4gc2l6ZTtcbiAgICBoID0gaW11bChoIF4gaCA+Pj4gMTYsIDB4ODVFQkNBNkIpO1xuICAgIGggPSBpbXVsKGggXiBoID4+PiAxMywgMHhDMkIyQUUzNSk7XG4gICAgaCA9IHNtaShoIF4gaCA+Pj4gMTYpO1xuICAgIHJldHVybiBoO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzaE1lcmdlKGEsIGIpIHtcbiAgICByZXR1cm4gYSBeIGIgKyAweDlFMzc3OUI5ICsgKGEgPDwgNikgKyAoYSA+PiAyKSB8IDA7IC8vIGludFxuICB9XG5cbiAgdmFyIEltbXV0YWJsZSA9IHtcblxuICAgIEl0ZXJhYmxlOiBJdGVyYWJsZSxcblxuICAgIFNlcTogU2VxLFxuICAgIENvbGxlY3Rpb246IENvbGxlY3Rpb24sXG4gICAgTWFwOiBNYXAsXG4gICAgT3JkZXJlZE1hcDogT3JkZXJlZE1hcCxcbiAgICBMaXN0OiBMaXN0LFxuICAgIFN0YWNrOiBTdGFjayxcbiAgICBTZXQ6IFNldCxcbiAgICBPcmRlcmVkU2V0OiBPcmRlcmVkU2V0LFxuXG4gICAgUmVjb3JkOiBSZWNvcmQsXG4gICAgUmFuZ2U6IFJhbmdlLFxuICAgIFJlcGVhdDogUmVwZWF0LFxuXG4gICAgaXM6IGlzLFxuICAgIGZyb21KUzogZnJvbUpTXG5cbiAgfTtcblxuICByZXR1cm4gSW1tdXRhYmxlO1xuXG59KSk7IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9tZW1vaXplcicpWydkZWZhdWx0J107XG5leHBvcnRzWydkZWZhdWx0J10gPSBleHBvcnRzO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKlxuQ29weXJpZ2h0IChjKSAyMDE0LCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLlxuU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiovXG5cbi8qIGpzbGludCBlc25leHQ6IHRydWUgKi9cblxuLy8gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgaW1wbGVtZW50YXRpb24gZnJvbSBNb3ppbGxhIERldmVsb3BlciBOZXR3b3JrOlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRnVuY3Rpb24vYmluZCNQb2x5ZmlsbFxuXG52YXIgYmluZCA9IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIHx8IGZ1bmN0aW9uIChvVGhpcykge1xuICAgIGlmICh0eXBlb2YgdGhpcyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gY2xvc2VzdCB0aGluZyBwb3NzaWJsZSB0byB0aGUgRUNNQVNjcmlwdCA1XG4gICAgICAvLyBpbnRlcm5hbCBJc0NhbGxhYmxlIGZ1bmN0aW9uXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGdW5jdGlvbi5wcm90b3R5cGUuYmluZCAtIHdoYXQgaXMgdHJ5aW5nIHRvIGJlIGJvdW5kIGlzIG5vdCBjYWxsYWJsZScpO1xuICAgIH1cblxuICAgIHZhciBhQXJncyAgID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSxcbiAgICAgICAgZlRvQmluZCA9IHRoaXMsXG4gICAgICAgIGZOT1AgICAgPSBmdW5jdGlvbigpIHt9LFxuICAgICAgICBmQm91bmQgID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIGZUb0JpbmQuYXBwbHkodGhpcyBpbnN0YW5jZW9mIGZOT1BcbiAgICAgICAgICAgICAgICAgPyB0aGlzXG4gICAgICAgICAgICAgICAgIDogb1RoaXMsXG4gICAgICAgICAgICAgICAgIGFBcmdzLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpKSk7XG4gICAgICAgIH07XG5cbiAgICBpZiAodGhpcy5wcm90b3R5cGUpIHtcbiAgICAgIC8vIG5hdGl2ZSBmdW5jdGlvbnMgZG9uJ3QgaGF2ZSBhIHByb3RvdHlwZVxuICAgICAgZk5PUC5wcm90b3R5cGUgPSB0aGlzLnByb3RvdHlwZTtcbiAgICB9XG4gICAgZkJvdW5kLnByb3RvdHlwZSA9IG5ldyBmTk9QKCk7XG5cbiAgICByZXR1cm4gZkJvdW5kO1xufTtcblxuLy8gUHVycG9zZWx5IHVzaW5nIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uIGFzIHRoZSBJbnRsLmpzIGBJbnRsYCBwb2x5ZmlsbC5cbi8vIENvcHlyaWdodCAyMDEzIEFuZHkgRWFybnNoYXcsIE1JVCBMaWNlbnNlXG5cbnZhciBob3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgcmVhbERlZmluZVByb3AgPSAoZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7IHJldHVybiAhIU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7fSk7IH1cbiAgICBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH1cbn0pKCk7XG5cbnZhciBlczMgPSAhcmVhbERlZmluZVByb3AgJiYgIU9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXztcblxudmFyIGRlZmluZVByb3BlcnR5ID0gcmVhbERlZmluZVByb3AgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOlxuICAgICAgICBmdW5jdGlvbiAob2JqLCBuYW1lLCBkZXNjKSB7XG5cbiAgICBpZiAoJ2dldCcgaW4gZGVzYyAmJiBvYmouX19kZWZpbmVHZXR0ZXJfXykge1xuICAgICAgICBvYmouX19kZWZpbmVHZXR0ZXJfXyhuYW1lLCBkZXNjLmdldCk7XG4gICAgfSBlbHNlIGlmICghaG9wLmNhbGwob2JqLCBuYW1lKSB8fCAndmFsdWUnIGluIGRlc2MpIHtcbiAgICAgICAgb2JqW25hbWVdID0gZGVzYy52YWx1ZTtcbiAgICB9XG59O1xuXG52YXIgb2JqQ3JlYXRlID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiAocHJvdG8sIHByb3BzKSB7XG4gICAgdmFyIG9iaiwgaztcblxuICAgIGZ1bmN0aW9uIEYoKSB7fVxuICAgIEYucHJvdG90eXBlID0gcHJvdG87XG4gICAgb2JqID0gbmV3IEYoKTtcblxuICAgIGZvciAoayBpbiBwcm9wcykge1xuICAgICAgICBpZiAoaG9wLmNhbGwocHJvcHMsIGspKSB7XG4gICAgICAgICAgICBkZWZpbmVQcm9wZXJ0eShvYmosIGssIHByb3BzW2tdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG5leHBvcnRzLmJpbmQgPSBiaW5kLCBleHBvcnRzLmRlZmluZVByb3BlcnR5ID0gZGVmaW5lUHJvcGVydHksIGV4cG9ydHMub2JqQ3JlYXRlID0gb2JqQ3JlYXRlO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1lczUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgc3JjJGVzNSQkID0gcmVxdWlyZShcIi4vZXM1XCIpO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBjcmVhdGVGb3JtYXRDYWNoZTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gY3JlYXRlRm9ybWF0Q2FjaGUoRm9ybWF0Q29uc3RydWN0b3IpIHtcbiAgICB2YXIgY2FjaGUgPSBzcmMkZXM1JCQub2JqQ3JlYXRlKG51bGwpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgICAgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICB2YXIgY2FjaGVJZCA9IGdldENhY2hlSWQoYXJncyk7XG4gICAgICAgIHZhciBmb3JtYXQgID0gY2FjaGVJZCAmJiBjYWNoZVtjYWNoZUlkXTtcblxuICAgICAgICBpZiAoIWZvcm1hdCkge1xuICAgICAgICAgICAgZm9ybWF0ID0gbmV3IChzcmMkZXM1JCQuYmluZC5hcHBseShGb3JtYXRDb25zdHJ1Y3RvciwgW251bGxdLmNvbmNhdChhcmdzKSkpKCk7XG5cbiAgICAgICAgICAgIGlmIChjYWNoZUlkKSB7XG4gICAgICAgICAgICAgICAgY2FjaGVbY2FjaGVJZF0gPSBmb3JtYXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgIH07XG59XG5cbi8vIC0tIFV0aWxpdGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGdldENhY2hlSWQoaW5wdXRzKSB7XG4gICAgLy8gV2hlbiBKU09OIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIHJ1bnRpbWUsIHdlIHdpbGwgbm90IGNyZWF0ZSBhIGNhY2hlIGlkLlxuICAgIGlmICh0eXBlb2YgSlNPTiA9PT0gJ3VuZGVmaW5lZCcpIHsgcmV0dXJuOyB9XG5cbiAgICB2YXIgY2FjaGVJZCA9IFtdO1xuXG4gICAgdmFyIGksIGxlbiwgaW5wdXQ7XG5cbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBpbnB1dHMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgaW5wdXQgPSBpbnB1dHNbaV07XG5cbiAgICAgICAgaWYgKGlucHV0ICYmIHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGNhY2hlSWQucHVzaChvcmRlcmVkUHJvcHMoaW5wdXQpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlSWQucHVzaChpbnB1dCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoY2FjaGVJZCk7XG59XG5cbmZ1bmN0aW9uIG9yZGVyZWRQcm9wcyhvYmopIHtcbiAgICB2YXIgcHJvcHMgPSBbXSxcbiAgICAgICAga2V5cyAgPSBbXTtcblxuICAgIHZhciBrZXksIGksIGxlbiwgcHJvcDtcblxuICAgIGZvciAoa2V5IGluIG9iaikge1xuICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG9yZGVyZWRLZXlzID0ga2V5cy5zb3J0KCk7XG5cbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBvcmRlcmVkS2V5cy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICBrZXkgID0gb3JkZXJlZEtleXNbaV07XG4gICAgICAgIHByb3AgPSB7fTtcblxuICAgICAgICBwcm9wW2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgcHJvcHNbaV0gID0gcHJvcDtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcHM7XG59XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lbW9pemVyLmpzLm1hcCIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvcGFyc2VyJylbJ2RlZmF1bHQnXTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGV4cG9ydHM7XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSAoZnVuY3Rpb24oKSB7XG4gIC8qXG4gICAqIEdlbmVyYXRlZCBieSBQRUcuanMgMC44LjAuXG4gICAqXG4gICAqIGh0dHA6Ly9wZWdqcy5tYWpkYS5jei9cbiAgICovXG5cbiAgZnVuY3Rpb24gcGVnJHN1YmNsYXNzKGNoaWxkLCBwYXJlbnQpIHtcbiAgICBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH1cbiAgICBjdG9yLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7XG4gICAgY2hpbGQucHJvdG90eXBlID0gbmV3IGN0b3IoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIFN5bnRheEVycm9yKG1lc3NhZ2UsIGV4cGVjdGVkLCBmb3VuZCwgb2Zmc2V0LCBsaW5lLCBjb2x1bW4pIHtcbiAgICB0aGlzLm1lc3NhZ2UgID0gbWVzc2FnZTtcbiAgICB0aGlzLmV4cGVjdGVkID0gZXhwZWN0ZWQ7XG4gICAgdGhpcy5mb3VuZCAgICA9IGZvdW5kO1xuICAgIHRoaXMub2Zmc2V0ICAgPSBvZmZzZXQ7XG4gICAgdGhpcy5saW5lICAgICA9IGxpbmU7XG4gICAgdGhpcy5jb2x1bW4gICA9IGNvbHVtbjtcblxuICAgIHRoaXMubmFtZSAgICAgPSBcIlN5bnRheEVycm9yXCI7XG4gIH1cblxuICBwZWckc3ViY2xhc3MoU3ludGF4RXJyb3IsIEVycm9yKTtcblxuICBmdW5jdGlvbiBwYXJzZShpbnB1dCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB7fSxcblxuICAgICAgICBwZWckRkFJTEVEID0ge30sXG5cbiAgICAgICAgcGVnJHN0YXJ0UnVsZUZ1bmN0aW9ucyA9IHsgc3RhcnQ6IHBlZyRwYXJzZXN0YXJ0IH0sXG4gICAgICAgIHBlZyRzdGFydFJ1bGVGdW5jdGlvbiAgPSBwZWckcGFyc2VzdGFydCxcblxuICAgICAgICBwZWckYzAgPSBbXSxcbiAgICAgICAgcGVnJGMxID0gZnVuY3Rpb24oZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlICAgIDogJ21lc3NhZ2VGb3JtYXRQYXR0ZXJuJyxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIHBlZyRjMiA9IHBlZyRGQUlMRUQsXG4gICAgICAgIHBlZyRjMyA9IGZ1bmN0aW9uKHRleHQpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RyaW5nID0gJycsXG4gICAgICAgICAgICAgICAgICAgIGksIGosIG91dGVyTGVuLCBpbm5lciwgaW5uZXJMZW47XG5cbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBvdXRlckxlbiA9IHRleHQubGVuZ3RoOyBpIDwgb3V0ZXJMZW47IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpbm5lciA9IHRleHRbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMCwgaW5uZXJMZW4gPSBpbm5lci5sZW5ndGg7IGogPCBpbm5lckxlbjsgaiArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gaW5uZXJbal07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgcGVnJGM0ID0gZnVuY3Rpb24obWVzc2FnZVRleHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlIDogJ21lc3NhZ2VUZXh0RWxlbWVudCcsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBtZXNzYWdlVGV4dFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICBwZWckYzUgPSAvXlteIFxcdFxcblxcciwuKz17fSNdLyxcbiAgICAgICAgcGVnJGM2ID0geyB0eXBlOiBcImNsYXNzXCIsIHZhbHVlOiBcIlteIFxcXFx0XFxcXG5cXFxcciwuKz17fSNdXCIsIGRlc2NyaXB0aW9uOiBcIlteIFxcXFx0XFxcXG5cXFxcciwuKz17fSNdXCIgfSxcbiAgICAgICAgcGVnJGM3ID0gXCJ7XCIsXG4gICAgICAgIHBlZyRjOCA9IHsgdHlwZTogXCJsaXRlcmFsXCIsIHZhbHVlOiBcIntcIiwgZGVzY3JpcHRpb246IFwiXFxcIntcXFwiXCIgfSxcbiAgICAgICAgcGVnJGM5ID0gbnVsbCxcbiAgICAgICAgcGVnJGMxMCA9IFwiLFwiLFxuICAgICAgICBwZWckYzExID0geyB0eXBlOiBcImxpdGVyYWxcIiwgdmFsdWU6IFwiLFwiLCBkZXNjcmlwdGlvbjogXCJcXFwiLFxcXCJcIiB9LFxuICAgICAgICBwZWckYzEyID0gXCJ9XCIsXG4gICAgICAgIHBlZyRjMTMgPSB7IHR5cGU6IFwibGl0ZXJhbFwiLCB2YWx1ZTogXCJ9XCIsIGRlc2NyaXB0aW9uOiBcIlxcXCJ9XFxcIlwiIH0sXG4gICAgICAgIHBlZyRjMTQgPSBmdW5jdGlvbihpZCwgZm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSAgOiAnYXJndW1lbnRFbGVtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgaWQgICAgOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBmb3JtYXQgJiYgZm9ybWF0WzJdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIHBlZyRjMTUgPSBcIm51bWJlclwiLFxuICAgICAgICBwZWckYzE2ID0geyB0eXBlOiBcImxpdGVyYWxcIiwgdmFsdWU6IFwibnVtYmVyXCIsIGRlc2NyaXB0aW9uOiBcIlxcXCJudW1iZXJcXFwiXCIgfSxcbiAgICAgICAgcGVnJGMxNyA9IFwiZGF0ZVwiLFxuICAgICAgICBwZWckYzE4ID0geyB0eXBlOiBcImxpdGVyYWxcIiwgdmFsdWU6IFwiZGF0ZVwiLCBkZXNjcmlwdGlvbjogXCJcXFwiZGF0ZVxcXCJcIiB9LFxuICAgICAgICBwZWckYzE5ID0gXCJ0aW1lXCIsXG4gICAgICAgIHBlZyRjMjAgPSB7IHR5cGU6IFwibGl0ZXJhbFwiLCB2YWx1ZTogXCJ0aW1lXCIsIGRlc2NyaXB0aW9uOiBcIlxcXCJ0aW1lXFxcIlwiIH0sXG4gICAgICAgIHBlZyRjMjEgPSBmdW5jdGlvbih0eXBlLCBzdHlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgOiB0eXBlICsgJ0Zvcm1hdCcsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiBzdHlsZSAmJiBzdHlsZVsyXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICBwZWckYzIyID0gXCJwbHVyYWxcIixcbiAgICAgICAgcGVnJGMyMyA9IHsgdHlwZTogXCJsaXRlcmFsXCIsIHZhbHVlOiBcInBsdXJhbFwiLCBkZXNjcmlwdGlvbjogXCJcXFwicGx1cmFsXFxcIlwiIH0sXG4gICAgICAgIHBlZyRjMjQgPSBmdW5jdGlvbihwbHVyYWxTdHlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgICA6IHBsdXJhbFN0eWxlLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIG9yZGluYWw6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgOiBwbHVyYWxTdHlsZS5vZmZzZXQgfHwgMCxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogcGx1cmFsU3R5bGUub3B0aW9uc1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICBwZWckYzI1ID0gXCJzZWxlY3RvcmRpbmFsXCIsXG4gICAgICAgIHBlZyRjMjYgPSB7IHR5cGU6IFwibGl0ZXJhbFwiLCB2YWx1ZTogXCJzZWxlY3RvcmRpbmFsXCIsIGRlc2NyaXB0aW9uOiBcIlxcXCJzZWxlY3RvcmRpbmFsXFxcIlwiIH0sXG4gICAgICAgIHBlZyRjMjcgPSBmdW5jdGlvbihwbHVyYWxTdHlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgICA6IHBsdXJhbFN0eWxlLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIG9yZGluYWw6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA6IHBsdXJhbFN0eWxlLm9mZnNldCB8fCAwLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBwbHVyYWxTdHlsZS5vcHRpb25zXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgcGVnJGMyOCA9IFwic2VsZWN0XCIsXG4gICAgICAgIHBlZyRjMjkgPSB7IHR5cGU6IFwibGl0ZXJhbFwiLCB2YWx1ZTogXCJzZWxlY3RcIiwgZGVzY3JpcHRpb246IFwiXFxcInNlbGVjdFxcXCJcIiB9LFxuICAgICAgICBwZWckYzMwID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgICA6ICdzZWxlY3RGb3JtYXQnLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIHBlZyRjMzEgPSBcIj1cIixcbiAgICAgICAgcGVnJGMzMiA9IHsgdHlwZTogXCJsaXRlcmFsXCIsIHZhbHVlOiBcIj1cIiwgZGVzY3JpcHRpb246IFwiXFxcIj1cXFwiXCIgfSxcbiAgICAgICAgcGVnJGMzMyA9IGZ1bmN0aW9uKHNlbGVjdG9yLCBwYXR0ZXJuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSAgICA6ICdvcHRpb25hbEZvcm1hdFBhdHRlcm4nLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlICAgOiBwYXR0ZXJuXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIHBlZyRjMzQgPSBcIm9mZnNldDpcIixcbiAgICAgICAgcGVnJGMzNSA9IHsgdHlwZTogXCJsaXRlcmFsXCIsIHZhbHVlOiBcIm9mZnNldDpcIiwgZGVzY3JpcHRpb246IFwiXFxcIm9mZnNldDpcXFwiXCIgfSxcbiAgICAgICAgcGVnJGMzNiA9IGZ1bmN0aW9uKG51bWJlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7XG4gICAgICAgICAgICB9LFxuICAgICAgICBwZWckYzM3ID0gZnVuY3Rpb24ob2Zmc2V0LCBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSAgIDogJ3BsdXJhbEZvcm1hdCcsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA6IG9mZnNldCxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICBwZWckYzM4ID0geyB0eXBlOiBcIm90aGVyXCIsIGRlc2NyaXB0aW9uOiBcIndoaXRlc3BhY2VcIiB9LFxuICAgICAgICBwZWckYzM5ID0gL15bIFxcdFxcblxccl0vLFxuICAgICAgICBwZWckYzQwID0geyB0eXBlOiBcImNsYXNzXCIsIHZhbHVlOiBcIlsgXFxcXHRcXFxcblxcXFxyXVwiLCBkZXNjcmlwdGlvbjogXCJbIFxcXFx0XFxcXG5cXFxccl1cIiB9LFxuICAgICAgICBwZWckYzQxID0geyB0eXBlOiBcIm90aGVyXCIsIGRlc2NyaXB0aW9uOiBcIm9wdGlvbmFsV2hpdGVzcGFjZVwiIH0sXG4gICAgICAgIHBlZyRjNDIgPSAvXlswLTldLyxcbiAgICAgICAgcGVnJGM0MyA9IHsgdHlwZTogXCJjbGFzc1wiLCB2YWx1ZTogXCJbMC05XVwiLCBkZXNjcmlwdGlvbjogXCJbMC05XVwiIH0sXG4gICAgICAgIHBlZyRjNDQgPSAvXlswLTlhLWZdL2ksXG4gICAgICAgIHBlZyRjNDUgPSB7IHR5cGU6IFwiY2xhc3NcIiwgdmFsdWU6IFwiWzAtOWEtZl1pXCIsIGRlc2NyaXB0aW9uOiBcIlswLTlhLWZdaVwiIH0sXG4gICAgICAgIHBlZyRjNDYgPSBcIjBcIixcbiAgICAgICAgcGVnJGM0NyA9IHsgdHlwZTogXCJsaXRlcmFsXCIsIHZhbHVlOiBcIjBcIiwgZGVzY3JpcHRpb246IFwiXFxcIjBcXFwiXCIgfSxcbiAgICAgICAgcGVnJGM0OCA9IC9eWzEtOV0vLFxuICAgICAgICBwZWckYzQ5ID0geyB0eXBlOiBcImNsYXNzXCIsIHZhbHVlOiBcIlsxLTldXCIsIGRlc2NyaXB0aW9uOiBcIlsxLTldXCIgfSxcbiAgICAgICAgcGVnJGM1MCA9IGZ1bmN0aW9uKGRpZ2l0cykge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGRpZ2l0cywgMTApO1xuICAgICAgICB9LFxuICAgICAgICBwZWckYzUxID0gL15bXnt9XFxcXFxcMC1cXHgxRn8gXFx0XFxuXFxyXS8sXG4gICAgICAgIHBlZyRjNTIgPSB7IHR5cGU6IFwiY2xhc3NcIiwgdmFsdWU6IFwiW157fVxcXFxcXFxcXFxcXDAtXFxcXHgxRn8gXFxcXHRcXFxcblxcXFxyXVwiLCBkZXNjcmlwdGlvbjogXCJbXnt9XFxcXFxcXFxcXFxcMC1cXFxceDFGfyBcXFxcdFxcXFxuXFxcXHJdXCIgfSxcbiAgICAgICAgcGVnJGM1MyA9IFwiXFxcXFxcXFxcIixcbiAgICAgICAgcGVnJGM1NCA9IHsgdHlwZTogXCJsaXRlcmFsXCIsIHZhbHVlOiBcIlxcXFxcXFxcXCIsIGRlc2NyaXB0aW9uOiBcIlxcXCJcXFxcXFxcXFxcXFxcXFxcXFxcIlwiIH0sXG4gICAgICAgIHBlZyRjNTUgPSBmdW5jdGlvbigpIHsgcmV0dXJuICdcXFxcJzsgfSxcbiAgICAgICAgcGVnJGM1NiA9IFwiXFxcXCNcIixcbiAgICAgICAgcGVnJGM1NyA9IHsgdHlwZTogXCJsaXRlcmFsXCIsIHZhbHVlOiBcIlxcXFwjXCIsIGRlc2NyaXB0aW9uOiBcIlxcXCJcXFxcXFxcXCNcXFwiXCIgfSxcbiAgICAgICAgcGVnJGM1OCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gJ1xcXFwjJzsgfSxcbiAgICAgICAgcGVnJGM1OSA9IFwiXFxcXHtcIixcbiAgICAgICAgcGVnJGM2MCA9IHsgdHlwZTogXCJsaXRlcmFsXCIsIHZhbHVlOiBcIlxcXFx7XCIsIGRlc2NyaXB0aW9uOiBcIlxcXCJcXFxcXFxcXHtcXFwiXCIgfSxcbiAgICAgICAgcGVnJGM2MSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gJ1xcdTAwN0InOyB9LFxuICAgICAgICBwZWckYzYyID0gXCJcXFxcfVwiLFxuICAgICAgICBwZWckYzYzID0geyB0eXBlOiBcImxpdGVyYWxcIiwgdmFsdWU6IFwiXFxcXH1cIiwgZGVzY3JpcHRpb246IFwiXFxcIlxcXFxcXFxcfVxcXCJcIiB9LFxuICAgICAgICBwZWckYzY0ID0gZnVuY3Rpb24oKSB7IHJldHVybiAnXFx1MDA3RCc7IH0sXG4gICAgICAgIHBlZyRjNjUgPSBcIlxcXFx1XCIsXG4gICAgICAgIHBlZyRjNjYgPSB7IHR5cGU6IFwibGl0ZXJhbFwiLCB2YWx1ZTogXCJcXFxcdVwiLCBkZXNjcmlwdGlvbjogXCJcXFwiXFxcXFxcXFx1XFxcIlwiIH0sXG4gICAgICAgIHBlZyRjNjcgPSBmdW5jdGlvbihkaWdpdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChkaWdpdHMsIDE2KSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICBwZWckYzY4ID0gZnVuY3Rpb24oY2hhcnMpIHsgcmV0dXJuIGNoYXJzLmpvaW4oJycpOyB9LFxuXG4gICAgICAgIHBlZyRjdXJyUG9zICAgICAgICAgID0gMCxcbiAgICAgICAgcGVnJHJlcG9ydGVkUG9zICAgICAgPSAwLFxuICAgICAgICBwZWckY2FjaGVkUG9zICAgICAgICA9IDAsXG4gICAgICAgIHBlZyRjYWNoZWRQb3NEZXRhaWxzID0geyBsaW5lOiAxLCBjb2x1bW46IDEsIHNlZW5DUjogZmFsc2UgfSxcbiAgICAgICAgcGVnJG1heEZhaWxQb3MgICAgICAgPSAwLFxuICAgICAgICBwZWckbWF4RmFpbEV4cGVjdGVkICA9IFtdLFxuICAgICAgICBwZWckc2lsZW50RmFpbHMgICAgICA9IDAsXG5cbiAgICAgICAgcGVnJHJlc3VsdDtcblxuICAgIGlmIChcInN0YXJ0UnVsZVwiIGluIG9wdGlvbnMpIHtcbiAgICAgIGlmICghKG9wdGlvbnMuc3RhcnRSdWxlIGluIHBlZyRzdGFydFJ1bGVGdW5jdGlvbnMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHN0YXJ0IHBhcnNpbmcgZnJvbSBydWxlIFxcXCJcIiArIG9wdGlvbnMuc3RhcnRSdWxlICsgXCJcXFwiLlwiKTtcbiAgICAgIH1cblxuICAgICAgcGVnJHN0YXJ0UnVsZUZ1bmN0aW9uID0gcGVnJHN0YXJ0UnVsZUZ1bmN0aW9uc1tvcHRpb25zLnN0YXJ0UnVsZV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdGV4dCgpIHtcbiAgICAgIHJldHVybiBpbnB1dC5zdWJzdHJpbmcocGVnJHJlcG9ydGVkUG9zLCBwZWckY3VyclBvcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb2Zmc2V0KCkge1xuICAgICAgcmV0dXJuIHBlZyRyZXBvcnRlZFBvcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaW5lKCkge1xuICAgICAgcmV0dXJuIHBlZyRjb21wdXRlUG9zRGV0YWlscyhwZWckcmVwb3J0ZWRQb3MpLmxpbmU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29sdW1uKCkge1xuICAgICAgcmV0dXJuIHBlZyRjb21wdXRlUG9zRGV0YWlscyhwZWckcmVwb3J0ZWRQb3MpLmNvbHVtbjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHBlY3RlZChkZXNjcmlwdGlvbikge1xuICAgICAgdGhyb3cgcGVnJGJ1aWxkRXhjZXB0aW9uKFxuICAgICAgICBudWxsLFxuICAgICAgICBbeyB0eXBlOiBcIm90aGVyXCIsIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiB9XSxcbiAgICAgICAgcGVnJHJlcG9ydGVkUG9zXG4gICAgICApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVycm9yKG1lc3NhZ2UpIHtcbiAgICAgIHRocm93IHBlZyRidWlsZEV4Y2VwdGlvbihtZXNzYWdlLCBudWxsLCBwZWckcmVwb3J0ZWRQb3MpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRjb21wdXRlUG9zRGV0YWlscyhwb3MpIHtcbiAgICAgIGZ1bmN0aW9uIGFkdmFuY2UoZGV0YWlscywgc3RhcnRQb3MsIGVuZFBvcykge1xuICAgICAgICB2YXIgcCwgY2g7XG5cbiAgICAgICAgZm9yIChwID0gc3RhcnRQb3M7IHAgPCBlbmRQb3M7IHArKykge1xuICAgICAgICAgIGNoID0gaW5wdXQuY2hhckF0KHApO1xuICAgICAgICAgIGlmIChjaCA9PT0gXCJcXG5cIikge1xuICAgICAgICAgICAgaWYgKCFkZXRhaWxzLnNlZW5DUikgeyBkZXRhaWxzLmxpbmUrKzsgfVxuICAgICAgICAgICAgZGV0YWlscy5jb2x1bW4gPSAxO1xuICAgICAgICAgICAgZGV0YWlscy5zZWVuQ1IgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoID09PSBcIlxcclwiIHx8IGNoID09PSBcIlxcdTIwMjhcIiB8fCBjaCA9PT0gXCJcXHUyMDI5XCIpIHtcbiAgICAgICAgICAgIGRldGFpbHMubGluZSsrO1xuICAgICAgICAgICAgZGV0YWlscy5jb2x1bW4gPSAxO1xuICAgICAgICAgICAgZGV0YWlscy5zZWVuQ1IgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZXRhaWxzLmNvbHVtbisrO1xuICAgICAgICAgICAgZGV0YWlscy5zZWVuQ1IgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHBlZyRjYWNoZWRQb3MgIT09IHBvcykge1xuICAgICAgICBpZiAocGVnJGNhY2hlZFBvcyA+IHBvcykge1xuICAgICAgICAgIHBlZyRjYWNoZWRQb3MgPSAwO1xuICAgICAgICAgIHBlZyRjYWNoZWRQb3NEZXRhaWxzID0geyBsaW5lOiAxLCBjb2x1bW46IDEsIHNlZW5DUjogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBhZHZhbmNlKHBlZyRjYWNoZWRQb3NEZXRhaWxzLCBwZWckY2FjaGVkUG9zLCBwb3MpO1xuICAgICAgICBwZWckY2FjaGVkUG9zID0gcG9zO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGVnJGNhY2hlZFBvc0RldGFpbHM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJGZhaWwoZXhwZWN0ZWQpIHtcbiAgICAgIGlmIChwZWckY3VyclBvcyA8IHBlZyRtYXhGYWlsUG9zKSB7IHJldHVybjsgfVxuXG4gICAgICBpZiAocGVnJGN1cnJQb3MgPiBwZWckbWF4RmFpbFBvcykge1xuICAgICAgICBwZWckbWF4RmFpbFBvcyA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBwZWckbWF4RmFpbEV4cGVjdGVkID0gW107XG4gICAgICB9XG5cbiAgICAgIHBlZyRtYXhGYWlsRXhwZWN0ZWQucHVzaChleHBlY3RlZCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJGJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UsIGV4cGVjdGVkLCBwb3MpIHtcbiAgICAgIGZ1bmN0aW9uIGNsZWFudXBFeHBlY3RlZChleHBlY3RlZCkge1xuICAgICAgICB2YXIgaSA9IDE7XG5cbiAgICAgICAgZXhwZWN0ZWQuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgICAgaWYgKGEuZGVzY3JpcHRpb24gPCBiLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgfSBlbHNlIGlmIChhLmRlc2NyaXB0aW9uID4gYi5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBleHBlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgICBpZiAoZXhwZWN0ZWRbaSAtIDFdID09PSBleHBlY3RlZFtpXSkge1xuICAgICAgICAgICAgZXhwZWN0ZWQuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpKys7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGJ1aWxkTWVzc2FnZShleHBlY3RlZCwgZm91bmQpIHtcbiAgICAgICAgZnVuY3Rpb24gc3RyaW5nRXNjYXBlKHMpIHtcbiAgICAgICAgICBmdW5jdGlvbiBoZXgoY2gpIHsgcmV0dXJuIGNoLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7IH1cblxuICAgICAgICAgIHJldHVybiBzXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxcXC9nLCAgICdcXFxcXFxcXCcpXG4gICAgICAgICAgICAucmVwbGFjZSgvXCIvZywgICAgJ1xcXFxcIicpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFx4MDgvZywgJ1xcXFxiJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXHQvZywgICAnXFxcXHQnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcbi9nLCAgICdcXFxcbicpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxmL2csICAgJ1xcXFxmJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXHIvZywgICAnXFxcXHInKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1tcXHgwMC1cXHgwN1xceDBCXFx4MEVcXHgwRl0vZywgZnVuY3Rpb24oY2gpIHsgcmV0dXJuICdcXFxceDAnICsgaGV4KGNoKTsgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC9bXFx4MTAtXFx4MUZcXHg4MC1cXHhGRl0vZywgICAgZnVuY3Rpb24oY2gpIHsgcmV0dXJuICdcXFxceCcgICsgaGV4KGNoKTsgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC9bXFx1MDE4MC1cXHUwRkZGXS9nLCAgICAgICAgIGZ1bmN0aW9uKGNoKSB7IHJldHVybiAnXFxcXHUwJyArIGhleChjaCk7IH0pXG4gICAgICAgICAgICAucmVwbGFjZSgvW1xcdTEwODAtXFx1RkZGRl0vZywgICAgICAgICBmdW5jdGlvbihjaCkgeyByZXR1cm4gJ1xcXFx1JyAgKyBoZXgoY2gpOyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBleHBlY3RlZERlc2NzID0gbmV3IEFycmF5KGV4cGVjdGVkLmxlbmd0aCksXG4gICAgICAgICAgICBleHBlY3RlZERlc2MsIGZvdW5kRGVzYywgaTtcblxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBleHBlY3RlZERlc2NzW2ldID0gZXhwZWN0ZWRbaV0uZGVzY3JpcHRpb247XG4gICAgICAgIH1cblxuICAgICAgICBleHBlY3RlZERlc2MgPSBleHBlY3RlZC5sZW5ndGggPiAxXG4gICAgICAgICAgPyBleHBlY3RlZERlc2NzLnNsaWNlKDAsIC0xKS5qb2luKFwiLCBcIilcbiAgICAgICAgICAgICAgKyBcIiBvciBcIlxuICAgICAgICAgICAgICArIGV4cGVjdGVkRGVzY3NbZXhwZWN0ZWQubGVuZ3RoIC0gMV1cbiAgICAgICAgICA6IGV4cGVjdGVkRGVzY3NbMF07XG5cbiAgICAgICAgZm91bmREZXNjID0gZm91bmQgPyBcIlxcXCJcIiArIHN0cmluZ0VzY2FwZShmb3VuZCkgKyBcIlxcXCJcIiA6IFwiZW5kIG9mIGlucHV0XCI7XG5cbiAgICAgICAgcmV0dXJuIFwiRXhwZWN0ZWQgXCIgKyBleHBlY3RlZERlc2MgKyBcIiBidXQgXCIgKyBmb3VuZERlc2MgKyBcIiBmb3VuZC5cIjtcbiAgICAgIH1cblxuICAgICAgdmFyIHBvc0RldGFpbHMgPSBwZWckY29tcHV0ZVBvc0RldGFpbHMocG9zKSxcbiAgICAgICAgICBmb3VuZCAgICAgID0gcG9zIDwgaW5wdXQubGVuZ3RoID8gaW5wdXQuY2hhckF0KHBvcykgOiBudWxsO1xuXG4gICAgICBpZiAoZXhwZWN0ZWQgIT09IG51bGwpIHtcbiAgICAgICAgY2xlYW51cEV4cGVjdGVkKGV4cGVjdGVkKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBTeW50YXhFcnJvcihcbiAgICAgICAgbWVzc2FnZSAhPT0gbnVsbCA/IG1lc3NhZ2UgOiBidWlsZE1lc3NhZ2UoZXhwZWN0ZWQsIGZvdW5kKSxcbiAgICAgICAgZXhwZWN0ZWQsXG4gICAgICAgIGZvdW5kLFxuICAgICAgICBwb3MsXG4gICAgICAgIHBvc0RldGFpbHMubGluZSxcbiAgICAgICAgcG9zRGV0YWlscy5jb2x1bW5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlc3RhcnQoKSB7XG4gICAgICB2YXIgczA7XG5cbiAgICAgIHMwID0gcGVnJHBhcnNlbWVzc2FnZUZvcm1hdFBhdHRlcm4oKTtcblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZW1lc3NhZ2VGb3JtYXRQYXR0ZXJuKCkge1xuICAgICAgdmFyIHMwLCBzMSwgczI7XG5cbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMSA9IFtdO1xuICAgICAgczIgPSBwZWckcGFyc2VtZXNzYWdlRm9ybWF0RWxlbWVudCgpO1xuICAgICAgd2hpbGUgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMxLnB1c2goczIpO1xuICAgICAgICBzMiA9IHBlZyRwYXJzZW1lc3NhZ2VGb3JtYXRFbGVtZW50KCk7XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHJlcG9ydGVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMxKHMxKTtcbiAgICAgIH1cbiAgICAgIHMwID0gczE7XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VtZXNzYWdlRm9ybWF0RWxlbWVudCgpIHtcbiAgICAgIHZhciBzMDtcblxuICAgICAgczAgPSBwZWckcGFyc2VtZXNzYWdlVGV4dEVsZW1lbnQoKTtcbiAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMCA9IHBlZyRwYXJzZWFyZ3VtZW50RWxlbWVudCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlbWVzc2FnZVRleHQoKSB7XG4gICAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0LCBzNTtcblxuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIHMxID0gW107XG4gICAgICBzMiA9IHBlZyRjdXJyUG9zO1xuICAgICAgczMgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczQgPSBwZWckcGFyc2VjaGFycygpO1xuICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHMzID0gW3MzLCBzNCwgczVdO1xuICAgICAgICAgICAgczIgPSBzMztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMjtcbiAgICAgICAgICAgIHMyID0gcGVnJGMyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMyO1xuICAgICAgICAgIHMyID0gcGVnJGMyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMyO1xuICAgICAgICBzMiA9IHBlZyRjMjtcbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICB3aGlsZSAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMS5wdXNoKHMyKTtcbiAgICAgICAgICBzMiA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgIHMzID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczQgPSBwZWckcGFyc2VjaGFycygpO1xuICAgICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM1ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzMyA9IFtzMywgczQsIHM1XTtcbiAgICAgICAgICAgICAgICBzMiA9IHMzO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczI7XG4gICAgICAgICAgICAgICAgczIgPSBwZWckYzI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczI7XG4gICAgICAgICAgICAgIHMyID0gcGVnJGMyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMyO1xuICAgICAgICAgICAgczIgPSBwZWckYzI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRjMjtcbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckcmVwb3J0ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzMoczEpO1xuICAgICAgfVxuICAgICAgczAgPSBzMTtcbiAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzMSA9IHBlZyRwYXJzZXdzKCk7XG4gICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMxID0gaW5wdXQuc3Vic3RyaW5nKHMwLCBwZWckY3VyclBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZW1lc3NhZ2VUZXh0RWxlbWVudCgpIHtcbiAgICAgIHZhciBzMCwgczE7XG5cbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMSA9IHBlZyRwYXJzZW1lc3NhZ2VUZXh0KCk7XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHJlcG9ydGVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGM0KHMxKTtcbiAgICAgIH1cbiAgICAgIHMwID0gczE7XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2Vhcmd1bWVudCgpIHtcbiAgICAgIHZhciBzMCwgczEsIHMyO1xuXG4gICAgICBzMCA9IHBlZyRwYXJzZW51bWJlcigpO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHMxID0gW107XG4gICAgICAgIGlmIChwZWckYzUudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICAgIHMyID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNik7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICB3aGlsZSAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHMxLnB1c2goczIpO1xuICAgICAgICAgICAgaWYgKHBlZyRjNS50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgICAgICAgIHMyID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzYpOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJGMyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMxID0gaW5wdXQuc3Vic3RyaW5nKHMwLCBwZWckY3VyclBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZWFyZ3VtZW50RWxlbWVudCgpIHtcbiAgICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczcsIHM4O1xuXG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAxMjMpIHtcbiAgICAgICAgczEgPSBwZWckYzc7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM4KTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMyA9IHBlZyRwYXJzZWFyZ3VtZW50KCk7XG4gICAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNSA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ0KSB7XG4gICAgICAgICAgICAgICAgczYgPSBwZWckYzEwO1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgczYgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMSk7IH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNyA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgIHM4ID0gcGVnJHBhcnNlZWxlbWVudEZvcm1hdCgpO1xuICAgICAgICAgICAgICAgICAgaWYgKHM4ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgIHM2ID0gW3M2LCBzNywgczhdO1xuICAgICAgICAgICAgICAgICAgICBzNSA9IHM2O1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzNTtcbiAgICAgICAgICAgICAgICAgICAgczUgPSBwZWckYzI7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczU7XG4gICAgICAgICAgICAgICAgICBzNSA9IHBlZyRjMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzNTtcbiAgICAgICAgICAgICAgICBzNSA9IHBlZyRjMjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoczUgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNSA9IHBlZyRjOTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMTI1KSB7XG4gICAgICAgICAgICAgICAgICAgIHM3ID0gcGVnJGMxMjtcbiAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHM3ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEzKTsgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgIHBlZyRyZXBvcnRlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMTQoczMsIHM1KTtcbiAgICAgICAgICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlZWxlbWVudEZvcm1hdCgpIHtcbiAgICAgIHZhciBzMDtcblxuICAgICAgczAgPSBwZWckcGFyc2VzaW1wbGVGb3JtYXQoKTtcbiAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMCA9IHBlZyRwYXJzZXBsdXJhbEZvcm1hdCgpO1xuICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMCA9IHBlZyRwYXJzZXNlbGVjdE9yZGluYWxGb3JtYXQoKTtcbiAgICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHMwID0gcGVnJHBhcnNlc2VsZWN0Rm9ybWF0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VzaW1wbGVGb3JtYXQoKSB7XG4gICAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczY7XG5cbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA2KSA9PT0gcGVnJGMxNSkge1xuICAgICAgICBzMSA9IHBlZyRjMTU7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxNik7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA0KSA9PT0gcGVnJGMxNykge1xuICAgICAgICAgIHMxID0gcGVnJGMxNztcbiAgICAgICAgICBwZWckY3VyclBvcyArPSA0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTgpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNCkgPT09IHBlZyRjMTkpIHtcbiAgICAgICAgICAgIHMxID0gcGVnJGMxOTtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMyMCk7IH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczMgPSBwZWckY3VyclBvcztcbiAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ0KSB7XG4gICAgICAgICAgICBzNCA9IHBlZyRjMTA7XG4gICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzNCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTEpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczUgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczYgPSBwZWckcGFyc2VjaGFycygpO1xuICAgICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzNCA9IFtzNCwgczUsIHM2XTtcbiAgICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgICAgczMgPSBwZWckYzI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgIHMzID0gcGVnJGMyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgczMgPSBwZWckYzI7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzMyA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczMgPSBwZWckYzk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHJlcG9ydGVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjMjEoczEsIHMzKTtcbiAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VwbHVyYWxGb3JtYXQoKSB7XG4gICAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0LCBzNTtcblxuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDYpID09PSBwZWckYzIyKSB7XG4gICAgICAgIHMxID0gcGVnJGMyMjtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gNjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzIzKTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ0KSB7XG4gICAgICAgICAgICBzMyA9IHBlZyRjMTA7XG4gICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTEpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczUgPSBwZWckcGFyc2VwbHVyYWxTdHlsZSgpO1xuICAgICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBwZWckcmVwb3J0ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMjQoczUpO1xuICAgICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VzZWxlY3RPcmRpbmFsRm9ybWF0KCkge1xuICAgICAgdmFyIHMwLCBzMSwgczIsIHMzLCBzNCwgczU7XG5cbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAxMykgPT09IHBlZyRjMjUpIHtcbiAgICAgICAgczEgPSBwZWckYzI1O1xuICAgICAgICBwZWckY3VyclBvcyArPSAxMztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzI2KTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ0KSB7XG4gICAgICAgICAgICBzMyA9IHBlZyRjMTA7XG4gICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTEpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczUgPSBwZWckcGFyc2VwbHVyYWxTdHlsZSgpO1xuICAgICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBwZWckcmVwb3J0ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMjcoczUpO1xuICAgICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VzZWxlY3RGb3JtYXQoKSB7XG4gICAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczY7XG5cbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA2KSA9PT0gcGVnJGMyOCkge1xuICAgICAgICBzMSA9IHBlZyRjMjg7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMyOSk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0NCkge1xuICAgICAgICAgICAgczMgPSBwZWckYzEwO1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzExKTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM1ID0gW107XG4gICAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlb3B0aW9uYWxGb3JtYXRQYXR0ZXJuKCk7XG4gICAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHdoaWxlIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgczUucHVzaChzNik7XG4gICAgICAgICAgICAgICAgICBzNiA9IHBlZyRwYXJzZW9wdGlvbmFsRm9ybWF0UGF0dGVybigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzNSA9IHBlZyRjMjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBwZWckcmVwb3J0ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMzAoczUpO1xuICAgICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VzZWxlY3RvcigpIHtcbiAgICAgIHZhciBzMCwgczEsIHMyLCBzMztcblxuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIHMxID0gcGVnJGN1cnJQb3M7XG4gICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDYxKSB7XG4gICAgICAgIHMyID0gcGVnJGMzMTtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzMyKTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gcGVnJHBhcnNlbnVtYmVyKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMyID0gW3MyLCBzM107XG4gICAgICAgICAgczEgPSBzMjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMxO1xuICAgICAgICAgIHMxID0gcGVnJGMyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMxO1xuICAgICAgICBzMSA9IHBlZyRjMjtcbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMSA9IGlucHV0LnN1YnN0cmluZyhzMCwgcGVnJGN1cnJQb3MpO1xuICAgICAgfVxuICAgICAgczAgPSBzMTtcbiAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMCA9IHBlZyRwYXJzZWNoYXJzKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VvcHRpb25hbEZvcm1hdFBhdHRlcm4oKSB7XG4gICAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3LCBzODtcblxuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIHMxID0gcGVnJHBhcnNlXygpO1xuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gcGVnJHBhcnNlc2VsZWN0b3IoKTtcbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczMgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDEyMykge1xuICAgICAgICAgICAgICBzNCA9IHBlZyRjNztcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzgpOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczUgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlbWVzc2FnZUZvcm1hdFBhdHRlcm4oKTtcbiAgICAgICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMTI1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgczggPSBwZWckYzEyO1xuICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgczggPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMyk7IH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoczggIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBwZWckcmVwb3J0ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMzMoczIsIHM2KTtcbiAgICAgICAgICAgICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlb2Zmc2V0KCkge1xuICAgICAgdmFyIHMwLCBzMSwgczIsIHMzO1xuXG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNykgPT09IHBlZyRjMzQpIHtcbiAgICAgICAgczEgPSBwZWckYzM0O1xuICAgICAgICBwZWckY3VyclBvcyArPSA3O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMzUpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMzID0gcGVnJHBhcnNlbnVtYmVyKCk7XG4gICAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBwZWckcmVwb3J0ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgIHMxID0gcGVnJGMzNihzMyk7XG4gICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlcGx1cmFsU3R5bGUoKSB7XG4gICAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0O1xuXG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgczEgPSBwZWckcGFyc2VvZmZzZXQoKTtcbiAgICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMSA9IHBlZyRjOTtcbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczMgPSBbXTtcbiAgICAgICAgICBzNCA9IHBlZyRwYXJzZW9wdGlvbmFsRm9ybWF0UGF0dGVybigpO1xuICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgd2hpbGUgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHMzLnB1c2goczQpO1xuICAgICAgICAgICAgICBzNCA9IHBlZyRwYXJzZW9wdGlvbmFsRm9ybWF0UGF0dGVybigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzMyA9IHBlZyRjMjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBwZWckcmVwb3J0ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgIHMxID0gcGVnJGMzNyhzMSwgczMpO1xuICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZXdzKCkge1xuICAgICAgdmFyIHMwLCBzMTtcblxuICAgICAgcGVnJHNpbGVudEZhaWxzKys7XG4gICAgICBzMCA9IFtdO1xuICAgICAgaWYgKHBlZyRjMzkudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM0MCk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICB3aGlsZSAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMC5wdXNoKHMxKTtcbiAgICAgICAgICBpZiAocGVnJGMzOS50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgICAgICBzMSA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNDApOyB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgIH1cbiAgICAgIHBlZyRzaWxlbnRGYWlscy0tO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzM4KTsgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlXygpIHtcbiAgICAgIHZhciBzMCwgczEsIHMyO1xuXG4gICAgICBwZWckc2lsZW50RmFpbHMrKztcbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMSA9IFtdO1xuICAgICAgczIgPSBwZWckcGFyc2V3cygpO1xuICAgICAgd2hpbGUgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMxLnB1c2goczIpO1xuICAgICAgICBzMiA9IHBlZyRwYXJzZXdzKCk7XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczEgPSBpbnB1dC5zdWJzdHJpbmcoczAsIHBlZyRjdXJyUG9zKTtcbiAgICAgIH1cbiAgICAgIHMwID0gczE7XG4gICAgICBwZWckc2lsZW50RmFpbHMtLTtcbiAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM0MSk7IH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZWRpZ2l0KCkge1xuICAgICAgdmFyIHMwO1xuXG4gICAgICBpZiAocGVnJGM0Mi50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgIHMwID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQzKTsgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlaGV4RGlnaXQoKSB7XG4gICAgICB2YXIgczA7XG5cbiAgICAgIGlmIChwZWckYzQ0LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgczAgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNDUpOyB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VudW1iZXIoKSB7XG4gICAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0LCBzNTtcblxuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDgpIHtcbiAgICAgICAgczEgPSBwZWckYzQ2O1xuICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNDcpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczEgPSBwZWckY3VyclBvcztcbiAgICAgICAgczIgPSBwZWckY3VyclBvcztcbiAgICAgICAgaWYgKHBlZyRjNDgudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICAgIHMzID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNDkpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBbXTtcbiAgICAgICAgICBzNSA9IHBlZyRwYXJzZWRpZ2l0KCk7XG4gICAgICAgICAgd2hpbGUgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNC5wdXNoKHM1KTtcbiAgICAgICAgICAgIHM1ID0gcGVnJHBhcnNlZGlnaXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzMyA9IFtzMywgczRdO1xuICAgICAgICAgICAgczIgPSBzMztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMjtcbiAgICAgICAgICAgIHMyID0gcGVnJGMyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMyO1xuICAgICAgICAgIHMyID0gcGVnJGMyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMyID0gaW5wdXQuc3Vic3RyaW5nKHMxLCBwZWckY3VyclBvcyk7XG4gICAgICAgIH1cbiAgICAgICAgczEgPSBzMjtcbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckcmVwb3J0ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzUwKHMxKTtcbiAgICAgIH1cbiAgICAgIHMwID0gczE7XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VjaGFyKCkge1xuICAgICAgdmFyIHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNztcblxuICAgICAgaWYgKHBlZyRjNTEudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICBzMCA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM1Mik7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGM1Mykge1xuICAgICAgICAgIHMxID0gcGVnJGM1MztcbiAgICAgICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNTQpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHJlcG9ydGVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzU1KCk7XG4gICAgICAgIH1cbiAgICAgICAgczAgPSBzMTtcbiAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGM1Nikge1xuICAgICAgICAgICAgczEgPSBwZWckYzU2O1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzU3KTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHBlZyRyZXBvcnRlZFBvcyA9IHMwO1xuICAgICAgICAgICAgczEgPSBwZWckYzU4KCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgMikgPT09IHBlZyRjNTkpIHtcbiAgICAgICAgICAgICAgczEgPSBwZWckYzU5O1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNjApOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgcGVnJHJlcG9ydGVkUG9zID0gczA7XG4gICAgICAgICAgICAgIHMxID0gcGVnJGM2MSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGM2Mikge1xuICAgICAgICAgICAgICAgIHMxID0gcGVnJGM2MjtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNjMpOyB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgcGVnJHJlcG9ydGVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckYzY0KCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGM2NSkge1xuICAgICAgICAgICAgICAgICAgczEgPSBwZWckYzY1O1xuICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzY2KTsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgIHMyID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgICAgICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgICAgICAgICAgczQgPSBwZWckcGFyc2VoZXhEaWdpdCgpO1xuICAgICAgICAgICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgIHM1ID0gcGVnJHBhcnNlaGV4RGlnaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgczYgPSBwZWckcGFyc2VoZXhEaWdpdCgpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgczcgPSBwZWckcGFyc2VoZXhEaWdpdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHM3ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHM0ID0gW3M0LCBzNSwgczYsIHM3XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgczMgPSBzNDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMzID0gcGVnJGMyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMzO1xuICAgICAgICAgICAgICAgICAgICAgICAgczMgPSBwZWckYzI7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgICAgICAgICAgczMgPSBwZWckYzI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgICAgICAgIHMzID0gcGVnJGMyO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgIHMzID0gaW5wdXQuc3Vic3RyaW5nKHMyLCBwZWckY3VyclBvcyk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBzMiA9IHMzO1xuICAgICAgICAgICAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgIHBlZyRyZXBvcnRlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICBzMSA9IHBlZyRjNjcoczIpO1xuICAgICAgICAgICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZWNoYXJzKCkge1xuICAgICAgdmFyIHMwLCBzMSwgczI7XG5cbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMSA9IFtdO1xuICAgICAgczIgPSBwZWckcGFyc2VjaGFyKCk7XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgd2hpbGUgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczEucHVzaChzMik7XG4gICAgICAgICAgczIgPSBwZWckcGFyc2VjaGFyKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJGMyO1xuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRyZXBvcnRlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjNjgoczEpO1xuICAgICAgfVxuICAgICAgczAgPSBzMTtcblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIHBlZyRyZXN1bHQgPSBwZWckc3RhcnRSdWxlRnVuY3Rpb24oKTtcblxuICAgIGlmIChwZWckcmVzdWx0ICE9PSBwZWckRkFJTEVEICYmIHBlZyRjdXJyUG9zID09PSBpbnB1dC5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBwZWckcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocGVnJHJlc3VsdCAhPT0gcGVnJEZBSUxFRCAmJiBwZWckY3VyclBvcyA8IGlucHV0Lmxlbmd0aCkge1xuICAgICAgICBwZWckZmFpbCh7IHR5cGU6IFwiZW5kXCIsIGRlc2NyaXB0aW9uOiBcImVuZCBvZiBpbnB1dFwiIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBwZWckYnVpbGRFeGNlcHRpb24obnVsbCwgcGVnJG1heEZhaWxFeHBlY3RlZCwgcGVnJG1heEZhaWxQb3MpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgU3ludGF4RXJyb3I6IFN5bnRheEVycm9yLFxuICAgIHBhcnNlOiAgICAgICBwYXJzZVxuICB9O1xufSkoKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cGFyc2VyLmpzLm1hcCIsIi8qIGpzaGludCBub2RlOnRydWUgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgSW50bE1lc3NhZ2VGb3JtYXQgPSByZXF1aXJlKCcuL2xpYi9tYWluJylbJ2RlZmF1bHQnXTtcblxuLy8gQWRkIGFsbCBsb2NhbGUgZGF0YSB0byBgSW50bE1lc3NhZ2VGb3JtYXRgLiBUaGlzIG1vZHVsZSB3aWxsIGJlIGlnbm9yZWQgd2hlblxuLy8gYnVuZGxpbmcgZm9yIHRoZSBicm93c2VyIHdpdGggQnJvd3NlcmlmeS9XZWJwYWNrLlxucmVxdWlyZSgnLi9saWIvbG9jYWxlcycpO1xuXG4vLyBSZS1leHBvcnQgYEludGxNZXNzYWdlRm9ybWF0YCBhcyB0aGUgQ29tbW9uSlMgZGVmYXVsdCBleHBvcnRzIHdpdGggYWxsIHRoZVxuLy8gbG9jYWxlIGRhdGEgcmVnaXN0ZXJlZCwgYW5kIHdpdGggRW5nbGlzaCBzZXQgYXMgdGhlIGRlZmF1bHQgbG9jYWxlLiBEZWZpbmVcbi8vIHRoZSBgZGVmYXVsdGAgcHJvcCBmb3IgdXNlIHdpdGggb3RoZXIgY29tcGlsZWQgRVM2IE1vZHVsZXMuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBJbnRsTWVzc2FnZUZvcm1hdDtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGV4cG9ydHM7XG4iLCIvKlxuQ29weXJpZ2h0IChjKSAyMDE0LCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLlxuU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiovXG5cbi8qIGpzbGludCBlc25leHQ6IHRydWUgKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IENvbXBpbGVyO1xuXG5mdW5jdGlvbiBDb21waWxlcihsb2NhbGVzLCBmb3JtYXRzLCBwbHVyYWxGbikge1xuICAgIHRoaXMubG9jYWxlcyAgPSBsb2NhbGVzO1xuICAgIHRoaXMuZm9ybWF0cyAgPSBmb3JtYXRzO1xuICAgIHRoaXMucGx1cmFsRm4gPSBwbHVyYWxGbjtcbn1cblxuQ29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGUgPSBmdW5jdGlvbiAoYXN0KSB7XG4gICAgdGhpcy5wbHVyYWxTdGFjayAgICAgICAgPSBbXTtcbiAgICB0aGlzLmN1cnJlbnRQbHVyYWwgICAgICA9IG51bGw7XG4gICAgdGhpcy5wbHVyYWxOdW1iZXJGb3JtYXQgPSBudWxsO1xuXG4gICAgcmV0dXJuIHRoaXMuY29tcGlsZU1lc3NhZ2UoYXN0KTtcbn07XG5cbkNvbXBpbGVyLnByb3RvdHlwZS5jb21waWxlTWVzc2FnZSA9IGZ1bmN0aW9uIChhc3QpIHtcbiAgICBpZiAoIShhc3QgJiYgYXN0LnR5cGUgPT09ICdtZXNzYWdlRm9ybWF0UGF0dGVybicpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBBU1QgaXMgbm90IG9mIHR5cGU6IFwibWVzc2FnZUZvcm1hdFBhdHRlcm5cIicpO1xuICAgIH1cblxuICAgIHZhciBlbGVtZW50cyA9IGFzdC5lbGVtZW50cyxcbiAgICAgICAgcGF0dGVybiAgPSBbXTtcblxuICAgIHZhciBpLCBsZW4sIGVsZW1lbnQ7XG5cbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICBlbGVtZW50ID0gZWxlbWVudHNbaV07XG5cbiAgICAgICAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ21lc3NhZ2VUZXh0RWxlbWVudCc6XG4gICAgICAgICAgICAgICAgcGF0dGVybi5wdXNoKHRoaXMuY29tcGlsZU1lc3NhZ2VUZXh0KGVsZW1lbnQpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnYXJndW1lbnRFbGVtZW50JzpcbiAgICAgICAgICAgICAgICBwYXR0ZXJuLnB1c2godGhpcy5jb21waWxlQXJndW1lbnQoZWxlbWVudCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZSBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSB2YWxpZCB0eXBlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGF0dGVybjtcbn07XG5cbkNvbXBpbGVyLnByb3RvdHlwZS5jb21waWxlTWVzc2FnZVRleHQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIC8vIFdoZW4gdGhpcyBgZWxlbWVudGAgaXMgcGFydCBvZiBwbHVyYWwgc3ViLXBhdHRlcm4gYW5kIGl0cyB2YWx1ZSBjb250YWluc1xuICAgIC8vIGFuIHVuZXNjYXBlZCAnIycsIHVzZSBhIGBQbHVyYWxPZmZzZXRTdHJpbmdgIGhlbHBlciB0byBwcm9wZXJseSBvdXRwdXRcbiAgICAvLyB0aGUgbnVtYmVyIHdpdGggdGhlIGNvcnJlY3Qgb2Zmc2V0IGluIHRoZSBzdHJpbmcuXG4gICAgaWYgKHRoaXMuY3VycmVudFBsdXJhbCAmJiAvKF58W15cXFxcXSkjL2cudGVzdChlbGVtZW50LnZhbHVlKSkge1xuICAgICAgICAvLyBDcmVhdGUgYSBjYWNoZSBhIE51bWJlckZvcm1hdCBpbnN0YW5jZSB0aGF0IGNhbiBiZSByZXVzZWQgZm9yIGFueVxuICAgICAgICAvLyBQbHVyYWxPZmZzZXRTdHJpbmcgaW5zdGFuY2UgaW4gdGhpcyBtZXNzYWdlLlxuICAgICAgICBpZiAoIXRoaXMucGx1cmFsTnVtYmVyRm9ybWF0KSB7XG4gICAgICAgICAgICB0aGlzLnBsdXJhbE51bWJlckZvcm1hdCA9IG5ldyBJbnRsLk51bWJlckZvcm1hdCh0aGlzLmxvY2FsZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQbHVyYWxPZmZzZXRTdHJpbmcoXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UGx1cmFsLmlkLFxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFBsdXJhbC5mb3JtYXQub2Zmc2V0LFxuICAgICAgICAgICAgICAgIHRoaXMucGx1cmFsTnVtYmVyRm9ybWF0LFxuICAgICAgICAgICAgICAgIGVsZW1lbnQudmFsdWUpO1xuICAgIH1cblxuICAgIC8vIFVuZXNjYXBlIHRoZSBlc2NhcGVkICcjJ3MgaW4gdGhlIG1lc3NhZ2UgdGV4dC5cbiAgICByZXR1cm4gZWxlbWVudC52YWx1ZS5yZXBsYWNlKC9cXFxcIy9nLCAnIycpO1xufTtcblxuQ29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGVBcmd1bWVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgdmFyIGZvcm1hdCA9IGVsZW1lbnQuZm9ybWF0O1xuXG4gICAgaWYgKCFmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdGb3JtYXQoZWxlbWVudC5pZCk7XG4gICAgfVxuXG4gICAgdmFyIGZvcm1hdHMgID0gdGhpcy5mb3JtYXRzLFxuICAgICAgICBsb2NhbGVzICA9IHRoaXMubG9jYWxlcyxcbiAgICAgICAgcGx1cmFsRm4gPSB0aGlzLnBsdXJhbEZuLFxuICAgICAgICBvcHRpb25zO1xuXG4gICAgc3dpdGNoIChmb3JtYXQudHlwZSkge1xuICAgICAgICBjYXNlICdudW1iZXJGb3JtYXQnOlxuICAgICAgICAgICAgb3B0aW9ucyA9IGZvcm1hdHMubnVtYmVyW2Zvcm1hdC5zdHlsZV07XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkICAgIDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IG5ldyBJbnRsLk51bWJlckZvcm1hdChsb2NhbGVzLCBvcHRpb25zKS5mb3JtYXRcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAnZGF0ZUZvcm1hdCc6XG4gICAgICAgICAgICBvcHRpb25zID0gZm9ybWF0cy5kYXRlW2Zvcm1hdC5zdHlsZV07XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlkICAgIDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZXMsIG9wdGlvbnMpLmZvcm1hdFxuICAgICAgICAgICAgfTtcblxuICAgICAgICBjYXNlICd0aW1lRm9ybWF0JzpcbiAgICAgICAgICAgIG9wdGlvbnMgPSBmb3JtYXRzLnRpbWVbZm9ybWF0LnN0eWxlXTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWQgICAgOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgIGZvcm1hdDogbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlcywgb3B0aW9ucykuZm9ybWF0XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ3BsdXJhbEZvcm1hdCc6XG4gICAgICAgICAgICBvcHRpb25zID0gdGhpcy5jb21waWxlT3B0aW9ucyhlbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUGx1cmFsRm9ybWF0KFxuICAgICAgICAgICAgICAgIGVsZW1lbnQuaWQsIGZvcm1hdC5vcmRpbmFsLCBmb3JtYXQub2Zmc2V0LCBvcHRpb25zLCBwbHVyYWxGblxuICAgICAgICAgICAgKTtcblxuICAgICAgICBjYXNlICdzZWxlY3RGb3JtYXQnOlxuICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXMuY29tcGlsZU9wdGlvbnMoZWxlbWVudCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdEZvcm1hdChlbGVtZW50LmlkLCBvcHRpb25zKTtcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXNzYWdlIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGZvcm1hdCB0eXBlJyk7XG4gICAgfVxufTtcblxuQ29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGVPcHRpb25zID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICB2YXIgZm9ybWF0ICAgICAgPSBlbGVtZW50LmZvcm1hdCxcbiAgICAgICAgb3B0aW9ucyAgICAgPSBmb3JtYXQub3B0aW9ucyxcbiAgICAgICAgb3B0aW9uc0hhc2ggPSB7fTtcblxuICAgIC8vIFNhdmUgdGhlIGN1cnJlbnQgcGx1cmFsIGVsZW1lbnQsIGlmIGFueSwgdGhlbiBzZXQgaXQgdG8gYSBuZXcgdmFsdWUgd2hlblxuICAgIC8vIGNvbXBpbGluZyB0aGUgb3B0aW9ucyBzdWItcGF0dGVybnMuIFRoaXMgY29uZm9ybXMgdGhlIHNwZWMncyBhbGdvcml0aG1cbiAgICAvLyBmb3IgaGFuZGxpbmcgYFwiI1wiYCBzeW50YXggaW4gbWVzc2FnZSB0ZXh0LlxuICAgIHRoaXMucGx1cmFsU3RhY2sucHVzaCh0aGlzLmN1cnJlbnRQbHVyYWwpO1xuICAgIHRoaXMuY3VycmVudFBsdXJhbCA9IGZvcm1hdC50eXBlID09PSAncGx1cmFsRm9ybWF0JyA/IGVsZW1lbnQgOiBudWxsO1xuXG4gICAgdmFyIGksIGxlbiwgb3B0aW9uO1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gb3B0aW9ucy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICBvcHRpb24gPSBvcHRpb25zW2ldO1xuXG4gICAgICAgIC8vIENvbXBpbGUgdGhlIHN1Yi1wYXR0ZXJuIGFuZCBzYXZlIGl0IHVuZGVyIHRoZSBvcHRpb25zJ3Mgc2VsZWN0b3IuXG4gICAgICAgIG9wdGlvbnNIYXNoW29wdGlvbi5zZWxlY3Rvcl0gPSB0aGlzLmNvbXBpbGVNZXNzYWdlKG9wdGlvbi52YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gUG9wIHRoZSBwbHVyYWwgc3RhY2sgdG8gcHV0IGJhY2sgdGhlIG9yaWdpbmFsIGN1cnJlbnQgcGx1cmFsIHZhbHVlLlxuICAgIHRoaXMuY3VycmVudFBsdXJhbCA9IHRoaXMucGx1cmFsU3RhY2sucG9wKCk7XG5cbiAgICByZXR1cm4gb3B0aW9uc0hhc2g7XG59O1xuXG4vLyAtLSBDb21waWxlciBIZWxwZXIgQ2xhc3NlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBTdHJpbmdGb3JtYXQoaWQpIHtcbiAgICB0aGlzLmlkID0gaWQ7XG59XG5cblN0cmluZ0Zvcm1hdC5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IFN0cmluZyh2YWx1ZSk7XG59O1xuXG5mdW5jdGlvbiBQbHVyYWxGb3JtYXQoaWQsIHVzZU9yZGluYWwsIG9mZnNldCwgb3B0aW9ucywgcGx1cmFsRm4pIHtcbiAgICB0aGlzLmlkICAgICAgICAgPSBpZDtcbiAgICB0aGlzLnVzZU9yZGluYWwgPSB1c2VPcmRpbmFsO1xuICAgIHRoaXMub2Zmc2V0ICAgICA9IG9mZnNldDtcbiAgICB0aGlzLm9wdGlvbnMgICAgPSBvcHRpb25zO1xuICAgIHRoaXMucGx1cmFsRm4gICA9IHBsdXJhbEZuO1xufVxuXG5QbHVyYWxGb3JtYXQucHJvdG90eXBlLmdldE9wdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuXG4gICAgdmFyIG9wdGlvbiA9IG9wdGlvbnNbJz0nICsgdmFsdWVdIHx8XG4gICAgICAgICAgICBvcHRpb25zW3RoaXMucGx1cmFsRm4odmFsdWUgLSB0aGlzLm9mZnNldCwgdGhpcy51c2VPcmRpbmFsKV07XG5cbiAgICByZXR1cm4gb3B0aW9uIHx8IG9wdGlvbnMub3RoZXI7XG59O1xuXG5mdW5jdGlvbiBQbHVyYWxPZmZzZXRTdHJpbmcoaWQsIG9mZnNldCwgbnVtYmVyRm9ybWF0LCBzdHJpbmcpIHtcbiAgICB0aGlzLmlkICAgICAgICAgICA9IGlkO1xuICAgIHRoaXMub2Zmc2V0ICAgICAgID0gb2Zmc2V0O1xuICAgIHRoaXMubnVtYmVyRm9ybWF0ID0gbnVtYmVyRm9ybWF0O1xuICAgIHRoaXMuc3RyaW5nICAgICAgID0gc3RyaW5nO1xufVxuXG5QbHVyYWxPZmZzZXRTdHJpbmcucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciBudW1iZXIgPSB0aGlzLm51bWJlckZvcm1hdC5mb3JtYXQodmFsdWUgLSB0aGlzLm9mZnNldCk7XG5cbiAgICByZXR1cm4gdGhpcy5zdHJpbmdcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oXnxbXlxcXFxdKSMvZywgJyQxJyArIG51bWJlcilcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcIy9nLCAnIycpO1xufTtcblxuZnVuY3Rpb24gU2VsZWN0Rm9ybWF0KGlkLCBvcHRpb25zKSB7XG4gICAgdGhpcy5pZCAgICAgID0gaWQ7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbn1cblxuU2VsZWN0Rm9ybWF0LnByb3RvdHlwZS5nZXRPcHRpb24gPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICByZXR1cm4gb3B0aW9uc1t2YWx1ZV0gfHwgb3B0aW9ucy5vdGhlcjtcbn07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbXBpbGVyLmpzLm1hcCIsIi8qXG5Db3B5cmlnaHQgKGMpIDIwMTQsIFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5Db3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG5TZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuKi9cblxuLyoganNsaW50IGVzbmV4dDogdHJ1ZSAqL1xuXG5cInVzZSBzdHJpY3RcIjtcbnZhciBzcmMkdXRpbHMkJCA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpLCBzcmMkZXM1JCQgPSByZXF1aXJlKFwiLi9lczVcIiksIHNyYyRjb21waWxlciQkID0gcmVxdWlyZShcIi4vY29tcGlsZXJcIiksIGludGwkbWVzc2FnZWZvcm1hdCRwYXJzZXIkJCA9IHJlcXVpcmUoXCJpbnRsLW1lc3NhZ2Vmb3JtYXQtcGFyc2VyXCIpO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBNZXNzYWdlRm9ybWF0O1xuXG4vLyAtLSBNZXNzYWdlRm9ybWF0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIE1lc3NhZ2VGb3JtYXQobWVzc2FnZSwgbG9jYWxlcywgZm9ybWF0cykge1xuICAgIC8vIFBhcnNlIHN0cmluZyBtZXNzYWdlcyBpbnRvIGFuIEFTVC5cbiAgICB2YXIgYXN0ID0gdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAgIE1lc3NhZ2VGb3JtYXQuX19wYXJzZShtZXNzYWdlKSA6IG1lc3NhZ2U7XG5cbiAgICBpZiAoIShhc3QgJiYgYXN0LnR5cGUgPT09ICdtZXNzYWdlRm9ybWF0UGF0dGVybicpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0EgbWVzc2FnZSBtdXN0IGJlIHByb3ZpZGVkIGFzIGEgU3RyaW5nIG9yIEFTVC4nKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGVzIGEgbmV3IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgYGZvcm1hdHNgIG1lcmdlZCB3aXRoIHRoZSBkZWZhdWx0XG4gICAgLy8gZm9ybWF0cy5cbiAgICBmb3JtYXRzID0gdGhpcy5fbWVyZ2VGb3JtYXRzKE1lc3NhZ2VGb3JtYXQuZm9ybWF0cywgZm9ybWF0cyk7XG5cbiAgICAvLyBEZWZpbmVkIGZpcnN0IGJlY2F1c2UgaXQncyB1c2VkIHRvIGJ1aWxkIHRoZSBmb3JtYXQgcGF0dGVybi5cbiAgICBzcmMkZXM1JCQuZGVmaW5lUHJvcGVydHkodGhpcywgJ19sb2NhbGUnLCAge3ZhbHVlOiB0aGlzLl9yZXNvbHZlTG9jYWxlKGxvY2FsZXMpfSk7XG5cbiAgICAvLyBDb21waWxlIHRoZSBgYXN0YCB0byBhIHBhdHRlcm4gdGhhdCBpcyBoaWdobHkgb3B0aW1pemVkIGZvciByZXBlYXRlZFxuICAgIC8vIGBmb3JtYXQoKWAgaW52b2NhdGlvbnMuICoqTm90ZToqKiBUaGlzIHBhc3NlcyB0aGUgYGxvY2FsZXNgIHNldCBwcm92aWRlZFxuICAgIC8vIHRvIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIGp1c3QgdGhlIHJlc29sdmVkIGxvY2FsZS5cbiAgICB2YXIgcGx1cmFsRm4gPSB0aGlzLl9maW5kUGx1cmFsUnVsZUZ1bmN0aW9uKHRoaXMuX2xvY2FsZSk7XG4gICAgdmFyIHBhdHRlcm4gID0gdGhpcy5fY29tcGlsZVBhdHRlcm4oYXN0LCBsb2NhbGVzLCBmb3JtYXRzLCBwbHVyYWxGbik7XG5cbiAgICAvLyBcIkJpbmRcIiBgZm9ybWF0KClgIG1ldGhvZCB0byBgdGhpc2Agc28gaXQgY2FuIGJlIHBhc3NlZCBieSByZWZlcmVuY2UgbGlrZVxuICAgIC8vIHRoZSBvdGhlciBgSW50bGAgQVBJcy5cbiAgICB2YXIgbWVzc2FnZUZvcm1hdCA9IHRoaXM7XG4gICAgdGhpcy5mb3JtYXQgPSBmdW5jdGlvbiAodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlRm9ybWF0Ll9mb3JtYXQocGF0dGVybiwgdmFsdWVzKTtcbiAgICB9O1xufVxuXG4vLyBEZWZhdWx0IGZvcm1hdCBvcHRpb25zIHVzZWQgYXMgdGhlIHByb3RvdHlwZSBvZiB0aGUgYGZvcm1hdHNgIHByb3ZpZGVkIHRvIHRoZVxuLy8gY29uc3RydWN0b3IuIFRoZXNlIGFyZSB1c2VkIHdoZW4gY29uc3RydWN0aW5nIHRoZSBpbnRlcm5hbCBJbnRsLk51bWJlckZvcm1hdFxuLy8gYW5kIEludGwuRGF0ZVRpbWVGb3JtYXQgaW5zdGFuY2VzLlxuc3JjJGVzNSQkLmRlZmluZVByb3BlcnR5KE1lc3NhZ2VGb3JtYXQsICdmb3JtYXRzJywge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG5cbiAgICB2YWx1ZToge1xuICAgICAgICBudW1iZXI6IHtcbiAgICAgICAgICAgICdjdXJyZW5jeSc6IHtcbiAgICAgICAgICAgICAgICBzdHlsZTogJ2N1cnJlbmN5J1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgJ3BlcmNlbnQnOiB7XG4gICAgICAgICAgICAgICAgc3R5bGU6ICdwZXJjZW50J1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICdzaG9ydCc6IHtcbiAgICAgICAgICAgICAgICBtb250aDogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIGRheSAgOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgeWVhciA6ICcyLWRpZ2l0J1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgJ21lZGl1bSc6IHtcbiAgICAgICAgICAgICAgICBtb250aDogJ3Nob3J0JyxcbiAgICAgICAgICAgICAgICBkYXkgIDogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIHllYXIgOiAnbnVtZXJpYydcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICdsb25nJzoge1xuICAgICAgICAgICAgICAgIG1vbnRoOiAnbG9uZycsXG4gICAgICAgICAgICAgICAgZGF5ICA6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICB5ZWFyIDogJ251bWVyaWMnXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAnZnVsbCc6IHtcbiAgICAgICAgICAgICAgICB3ZWVrZGF5OiAnbG9uZycsXG4gICAgICAgICAgICAgICAgbW9udGggIDogJ2xvbmcnLFxuICAgICAgICAgICAgICAgIGRheSAgICA6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICB5ZWFyICAgOiAnbnVtZXJpYydcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICB0aW1lOiB7XG4gICAgICAgICAgICAnc2hvcnQnOiB7XG4gICAgICAgICAgICAgICAgaG91ciAgOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgbWludXRlOiAnbnVtZXJpYydcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICdtZWRpdW0nOiAge1xuICAgICAgICAgICAgICAgIGhvdXIgIDogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIG1pbnV0ZTogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIHNlY29uZDogJ251bWVyaWMnXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAnbG9uZyc6IHtcbiAgICAgICAgICAgICAgICBob3VyICAgICAgICA6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBtaW51dGUgICAgICA6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBzZWNvbmQgICAgICA6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICB0aW1lWm9uZU5hbWU6ICdzaG9ydCdcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICdmdWxsJzoge1xuICAgICAgICAgICAgICAgIGhvdXIgICAgICAgIDogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIG1pbnV0ZSAgICAgIDogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIHNlY29uZCAgICAgIDogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIHRpbWVab25lTmFtZTogJ3Nob3J0J1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSk7XG5cbi8vIERlZmluZSBpbnRlcm5hbCBwcml2YXRlIHByb3BlcnRpZXMgZm9yIGRlYWxpbmcgd2l0aCBsb2NhbGUgZGF0YS5cbnNyYyRlczUkJC5kZWZpbmVQcm9wZXJ0eShNZXNzYWdlRm9ybWF0LCAnX19sb2NhbGVEYXRhX18nLCB7dmFsdWU6IHNyYyRlczUkJC5vYmpDcmVhdGUobnVsbCl9KTtcbnNyYyRlczUkJC5kZWZpbmVQcm9wZXJ0eShNZXNzYWdlRm9ybWF0LCAnX19hZGRMb2NhbGVEYXRhJywge3ZhbHVlOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmICghKGRhdGEgJiYgZGF0YS5sb2NhbGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdMb2NhbGUgZGF0YSBwcm92aWRlZCB0byBJbnRsTWVzc2FnZUZvcm1hdCBpcyBtaXNzaW5nIGEgJyArXG4gICAgICAgICAgICAnYGxvY2FsZWAgcHJvcGVydHknXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgTWVzc2FnZUZvcm1hdC5fX2xvY2FsZURhdGFfX1tkYXRhLmxvY2FsZS50b0xvd2VyQ2FzZSgpXSA9IGRhdGE7XG59fSk7XG5cbi8vIERlZmluZXMgYF9fcGFyc2UoKWAgc3RhdGljIG1ldGhvZCBhcyBhbiBleHBvc2VkIHByaXZhdGUuXG5zcmMkZXM1JCQuZGVmaW5lUHJvcGVydHkoTWVzc2FnZUZvcm1hdCwgJ19fcGFyc2UnLCB7dmFsdWU6IGludGwkbWVzc2FnZWZvcm1hdCRwYXJzZXIkJFtcImRlZmF1bHRcIl0ucGFyc2V9KTtcblxuLy8gRGVmaW5lIHB1YmxpYyBgZGVmYXVsdExvY2FsZWAgcHJvcGVydHkgd2hpY2ggZGVmYXVsdHMgdG8gRW5nbGlzaCwgYnV0IGNhbiBiZVxuLy8gc2V0IGJ5IHRoZSBkZXZlbG9wZXIuXG5zcmMkZXM1JCQuZGVmaW5lUHJvcGVydHkoTWVzc2FnZUZvcm1hdCwgJ2RlZmF1bHRMb2NhbGUnLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZSAgOiB0cnVlLFxuICAgIHZhbHVlICAgICA6IHVuZGVmaW5lZFxufSk7XG5cbk1lc3NhZ2VGb3JtYXQucHJvdG90eXBlLnJlc29sdmVkT3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBUT0RPOiBQcm92aWRlIGFueXRoaW5nIGVsc2U/XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbG9jYWxlOiB0aGlzLl9sb2NhbGVcbiAgICB9O1xufTtcblxuTWVzc2FnZUZvcm1hdC5wcm90b3R5cGUuX2NvbXBpbGVQYXR0ZXJuID0gZnVuY3Rpb24gKGFzdCwgbG9jYWxlcywgZm9ybWF0cywgcGx1cmFsRm4pIHtcbiAgICB2YXIgY29tcGlsZXIgPSBuZXcgc3JjJGNvbXBpbGVyJCRbXCJkZWZhdWx0XCJdKGxvY2FsZXMsIGZvcm1hdHMsIHBsdXJhbEZuKTtcbiAgICByZXR1cm4gY29tcGlsZXIuY29tcGlsZShhc3QpO1xufTtcblxuTWVzc2FnZUZvcm1hdC5wcm90b3R5cGUuX2ZpbmRQbHVyYWxSdWxlRnVuY3Rpb24gPSBmdW5jdGlvbiAobG9jYWxlKSB7XG4gICAgdmFyIGxvY2FsZURhdGEgPSBNZXNzYWdlRm9ybWF0Ll9fbG9jYWxlRGF0YV9fO1xuICAgIHZhciBkYXRhICAgICAgID0gbG9jYWxlRGF0YVtsb2NhbGUudG9Mb3dlckNhc2UoKV07XG5cbiAgICAvLyBUaGUgbG9jYWxlIGRhdGEgaXMgZGUtZHVwbGljYXRlZCwgc28gd2UgaGF2ZSB0byB0cmF2ZXJzZSB0aGUgbG9jYWxlJ3NcbiAgICAvLyBoaWVyYXJjaHkgdW50aWwgd2UgZmluZCBhIGBwbHVyYWxSdWxlRnVuY3Rpb25gIHRvIHJldHVybi5cbiAgICB3aGlsZSAoZGF0YSkge1xuICAgICAgICBpZiAoZGF0YS5wbHVyYWxSdWxlRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLnBsdXJhbFJ1bGVGdW5jdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGEgPSBkYXRhLnBhcmVudExvY2FsZSAmJiBsb2NhbGVEYXRhW2RhdGEucGFyZW50TG9jYWxlLnRvTG93ZXJDYXNlKCldO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0xvY2FsZSBkYXRhIGFkZGVkIHRvIEludGxNZXNzYWdlRm9ybWF0IGlzIG1pc3NpbmcgYSAnICtcbiAgICAgICAgJ2BwbHVyYWxSdWxlRnVuY3Rpb25gIGZvciA6JyArIGxvY2FsZVxuICAgICk7XG59O1xuXG5NZXNzYWdlRm9ybWF0LnByb3RvdHlwZS5fZm9ybWF0ID0gZnVuY3Rpb24gKHBhdHRlcm4sIHZhbHVlcykge1xuICAgIHZhciByZXN1bHQgPSAnJyxcbiAgICAgICAgaSwgbGVuLCBwYXJ0LCBpZCwgdmFsdWU7XG5cbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBwYXR0ZXJuLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIHBhcnQgPSBwYXR0ZXJuW2ldO1xuXG4gICAgICAgIC8vIEV4aXN0IGVhcmx5IGZvciBzdHJpbmcgcGFydHMuXG4gICAgICAgIGlmICh0eXBlb2YgcGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBwYXJ0O1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZCA9IHBhcnQuaWQ7XG5cbiAgICAgICAgLy8gRW5mb3JjZSB0aGF0IGFsbCByZXF1aXJlZCB2YWx1ZXMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIuXG4gICAgICAgIGlmICghKHZhbHVlcyAmJiBzcmMkdXRpbHMkJC5ob3AuY2FsbCh2YWx1ZXMsIGlkKSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIGZvcjogJyArIGlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbHVlID0gdmFsdWVzW2lkXTtcblxuICAgICAgICAvLyBSZWN1cnNpdmVseSBmb3JtYXQgcGx1cmFsIGFuZCBzZWxlY3QgcGFydHMnIG9wdGlvbiDigJQgd2hpY2ggY2FuIGJlIGFcbiAgICAgICAgLy8gbmVzdGVkIHBhdHRlcm4gc3RydWN0dXJlLiBUaGUgY2hvb3Npbmcgb2YgdGhlIG9wdGlvbiB0byB1c2UgaXNcbiAgICAgICAgLy8gYWJzdHJhY3RlZC1ieSBhbmQgZGVsZWdhdGVkLXRvIHRoZSBwYXJ0IGhlbHBlciBvYmplY3QuXG4gICAgICAgIGlmIChwYXJ0Lm9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLl9mb3JtYXQocGFydC5nZXRPcHRpb24odmFsdWUpLCB2YWx1ZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ICs9IHBhcnQuZm9ybWF0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5NZXNzYWdlRm9ybWF0LnByb3RvdHlwZS5fbWVyZ2VGb3JtYXRzID0gZnVuY3Rpb24gKGRlZmF1bHRzLCBmb3JtYXRzKSB7XG4gICAgdmFyIG1lcmdlZEZvcm1hdHMgPSB7fSxcbiAgICAgICAgdHlwZSwgbWVyZ2VkVHlwZTtcblxuICAgIGZvciAodHlwZSBpbiBkZWZhdWx0cykge1xuICAgICAgICBpZiAoIXNyYyR1dGlscyQkLmhvcC5jYWxsKGRlZmF1bHRzLCB0eXBlKSkgeyBjb250aW51ZTsgfVxuXG4gICAgICAgIG1lcmdlZEZvcm1hdHNbdHlwZV0gPSBtZXJnZWRUeXBlID0gc3JjJGVzNSQkLm9iakNyZWF0ZShkZWZhdWx0c1t0eXBlXSk7XG5cbiAgICAgICAgaWYgKGZvcm1hdHMgJiYgc3JjJHV0aWxzJCQuaG9wLmNhbGwoZm9ybWF0cywgdHlwZSkpIHtcbiAgICAgICAgICAgIHNyYyR1dGlscyQkLmV4dGVuZChtZXJnZWRUeXBlLCBmb3JtYXRzW3R5cGVdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtZXJnZWRGb3JtYXRzO1xufTtcblxuTWVzc2FnZUZvcm1hdC5wcm90b3R5cGUuX3Jlc29sdmVMb2NhbGUgPSBmdW5jdGlvbiAobG9jYWxlcykge1xuICAgIGlmICh0eXBlb2YgbG9jYWxlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbG9jYWxlcyA9IFtsb2NhbGVzXTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBhcnJheSBzbyB3ZSBjYW4gcHVzaCBvbiB0aGUgZGVmYXVsdCBsb2NhbGUuXG4gICAgbG9jYWxlcyA9IChsb2NhbGVzIHx8IFtdKS5jb25jYXQoTWVzc2FnZUZvcm1hdC5kZWZhdWx0TG9jYWxlKTtcblxuICAgIHZhciBsb2NhbGVEYXRhID0gTWVzc2FnZUZvcm1hdC5fX2xvY2FsZURhdGFfXztcbiAgICB2YXIgaSwgbGVuLCBsb2NhbGVQYXJ0cywgZGF0YTtcblxuICAgIC8vIFVzaW5nIHRoZSBzZXQgb2YgbG9jYWxlcyArIHRoZSBkZWZhdWx0IGxvY2FsZSwgd2UgbG9vayBmb3IgdGhlIGZpcnN0IG9uZVxuICAgIC8vIHdoaWNoIHRoYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZC4gV2hlbiBkYXRhIGRvZXMgbm90IGV4aXN0IGZvciBhIGxvY2FsZSwgd2VcbiAgICAvLyB0cmF2ZXJzZSBpdHMgYW5jZXN0b3JzIHRvIGZpbmQgc29tZXRoaW5nIHRoYXQncyBiZWVuIHJlZ2lzdGVyZWQgd2l0aGluXG4gICAgLy8gaXRzIGhpZXJhcmNoeSBvZiBsb2NhbGVzLiBTaW5jZSB3ZSBsYWNrIHRoZSBwcm9wZXIgYHBhcmVudExvY2FsZWAgZGF0YVxuICAgIC8vIGhlcmUsIHdlIG11c3QgdGFrZSBhIG5haXZlIGFwcHJvYWNoIHRvIHRyYXZlcnNhbC5cbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBsb2NhbGVzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIGxvY2FsZVBhcnRzID0gbG9jYWxlc1tpXS50b0xvd2VyQ2FzZSgpLnNwbGl0KCctJyk7XG5cbiAgICAgICAgd2hpbGUgKGxvY2FsZVBhcnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgZGF0YSA9IGxvY2FsZURhdGFbbG9jYWxlUGFydHMuam9pbignLScpXTtcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBub3JtYWxpemVkIGxvY2FsZSBzdHJpbmc7IGUuZy4sIHdlIHJldHVybiBcImVuLVVTXCIsXG4gICAgICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBcImVuLXVzXCIuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEubG9jYWxlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsb2NhbGVQYXJ0cy5wb3AoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlID0gbG9jYWxlcy5wb3AoKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdObyBsb2NhbGUgZGF0YSBoYXMgYmVlbiBhZGRlZCB0byBJbnRsTWVzc2FnZUZvcm1hdCBmb3I6ICcgK1xuICAgICAgICBsb2NhbGVzLmpvaW4oJywgJykgKyAnLCBvciB0aGUgZGVmYXVsdCBsb2NhbGU6ICcgKyBkZWZhdWx0TG9jYWxlXG4gICAgKTtcbn07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvcmUuanMubWFwIiwiLy8gR0VORVJBVEVEIEZJTEVcblwidXNlIHN0cmljdFwiO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB7XCJsb2NhbGVcIjpcImVuXCIsXCJwbHVyYWxSdWxlRnVuY3Rpb25cIjpmdW5jdGlvbiAobixvcmQpe3ZhciBzPVN0cmluZyhuKS5zcGxpdChcIi5cIiksdjA9IXNbMV0sdDA9TnVtYmVyKHNbMF0pPT1uLG4xMD10MCYmc1swXS5zbGljZSgtMSksbjEwMD10MCYmc1swXS5zbGljZSgtMik7aWYob3JkKXJldHVybiBuMTA9PTEmJm4xMDAhPTExP1wib25lXCI6bjEwPT0yJiZuMTAwIT0xMj9cInR3b1wiOm4xMD09MyYmbjEwMCE9MTM/XCJmZXdcIjpcIm90aGVyXCI7cmV0dXJuIG49PTEmJnYwP1wib25lXCI6XCJvdGhlclwifX07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVuLmpzLm1hcCIsIi8qXG5Db3B5cmlnaHQgKGMpIDIwMTQsIFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5Db3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG5TZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuKi9cblxuLyoganNsaW50IGVzbmV4dDogdHJ1ZSAqL1xuXG5cInVzZSBzdHJpY3RcIjtcbnZhciBzcmMkdXRpbHMkJCA9IHJlcXVpcmUoXCIuL3V0aWxzXCIpO1xuXG4vLyBQdXJwb3NlbHkgdXNpbmcgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gYXMgdGhlIEludGwuanMgYEludGxgIHBvbHlmaWxsLlxuLy8gQ29weXJpZ2h0IDIwMTMgQW5keSBFYXJuc2hhdywgTUlUIExpY2Vuc2VcblxudmFyIHJlYWxEZWZpbmVQcm9wID0gKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkgeyByZXR1cm4gISFPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywge30pOyB9XG4gICAgY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9XG59KSgpO1xuXG52YXIgZXMzID0gIXJlYWxEZWZpbmVQcm9wICYmICFPYmplY3QucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX187XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IHJlYWxEZWZpbmVQcm9wID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDpcbiAgICAgICAgZnVuY3Rpb24gKG9iaiwgbmFtZSwgZGVzYykge1xuXG4gICAgaWYgKCdnZXQnIGluIGRlc2MgJiYgb2JqLl9fZGVmaW5lR2V0dGVyX18pIHtcbiAgICAgICAgb2JqLl9fZGVmaW5lR2V0dGVyX18obmFtZSwgZGVzYy5nZXQpO1xuICAgIH0gZWxzZSBpZiAoIXNyYyR1dGlscyQkLmhvcC5jYWxsKG9iaiwgbmFtZSkgfHwgJ3ZhbHVlJyBpbiBkZXNjKSB7XG4gICAgICAgIG9ialtuYW1lXSA9IGRlc2MudmFsdWU7XG4gICAgfVxufTtcblxudmFyIG9iakNyZWF0ZSA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gKHByb3RvLCBwcm9wcykge1xuICAgIHZhciBvYmosIGs7XG5cbiAgICBmdW5jdGlvbiBGKCkge31cbiAgICBGLnByb3RvdHlwZSA9IHByb3RvO1xuICAgIG9iaiA9IG5ldyBGKCk7XG5cbiAgICBmb3IgKGsgaW4gcHJvcHMpIHtcbiAgICAgICAgaWYgKHNyYyR1dGlscyQkLmhvcC5jYWxsKHByb3BzLCBrKSkge1xuICAgICAgICAgICAgZGVmaW5lUHJvcGVydHkob2JqLCBrLCBwcm9wc1trXSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xufTtcbmV4cG9ydHMuZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eSwgZXhwb3J0cy5vYmpDcmVhdGUgPSBvYmpDcmVhdGU7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVzNS5qcy5tYXAiLCIvKiBqc2xpbnQgZXNuZXh0OiB0cnVlICovXG5cblwidXNlIHN0cmljdFwiO1xudmFyIHNyYyRjb3JlJCQgPSByZXF1aXJlKFwiLi9jb3JlXCIpLCBzcmMkZW4kJCA9IHJlcXVpcmUoXCIuL2VuXCIpO1xuXG5zcmMkY29yZSQkW1wiZGVmYXVsdFwiXS5fX2FkZExvY2FsZURhdGEoc3JjJGVuJCRbXCJkZWZhdWx0XCJdKTtcbnNyYyRjb3JlJCRbXCJkZWZhdWx0XCJdLmRlZmF1bHRMb2NhbGUgPSAnZW4nO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHNyYyRjb3JlJCRbXCJkZWZhdWx0XCJdO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYWluLmpzLm1hcCIsIi8qXG5Db3B5cmlnaHQgKGMpIDIwMTQsIFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5Db3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG5TZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuKi9cblxuLyoganNsaW50IGVzbmV4dDogdHJ1ZSAqL1xuXG5cInVzZSBzdHJpY3RcIjtcbmV4cG9ydHMuZXh0ZW5kID0gZXh0ZW5kO1xudmFyIGhvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIGV4dGVuZChvYmopIHtcbiAgICB2YXIgc291cmNlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSksXG4gICAgICAgIGksIGxlbiwgc291cmNlLCBrZXk7XG5cbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIHNvdXJjZSA9IHNvdXJjZXNbaV07XG4gICAgICAgIGlmICghc291cmNlKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgICAgICAgICBpZiAoaG9wLmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgb2JqW2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59XG5leHBvcnRzLmhvcCA9IGhvcDtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIiwiLyoganNoaW50IG5vZGU6dHJ1ZSAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBJbnRsUmVsYXRpdmVGb3JtYXQgPSByZXF1aXJlKCcuL2xpYi9tYWluJylbJ2RlZmF1bHQnXTtcblxuLy8gQWRkIGFsbCBsb2NhbGUgZGF0YSB0byBgSW50bFJlbGF0aXZlRm9ybWF0YC4gVGhpcyBtb2R1bGUgd2lsbCBiZSBpZ25vcmVkIHdoZW5cbi8vIGJ1bmRsaW5nIGZvciB0aGUgYnJvd3NlciB3aXRoIEJyb3dzZXJpZnkvV2VicGFjay5cbnJlcXVpcmUoJy4vbGliL2xvY2FsZXMnKTtcblxuLy8gUmUtZXhwb3J0IGBJbnRsUmVsYXRpdmVGb3JtYXRgIGFzIHRoZSBDb21tb25KUyBkZWZhdWx0IGV4cG9ydHMgd2l0aCBhbGwgdGhlXG4vLyBsb2NhbGUgZGF0YSByZWdpc3RlcmVkLCBhbmQgd2l0aCBFbmdsaXNoIHNldCBhcyB0aGUgZGVmYXVsdCBsb2NhbGUuIERlZmluZVxuLy8gdGhlIGBkZWZhdWx0YCBwcm9wIGZvciB1c2Ugd2l0aCBvdGhlciBjb21waWxlZCBFUzYgTW9kdWxlcy5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IEludGxSZWxhdGl2ZUZvcm1hdDtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGV4cG9ydHM7XG4iLCIvKlxuQ29weXJpZ2h0IChjKSAyMDE0LCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLlxuU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiovXG5cbi8qIGpzbGludCBlc25leHQ6IHRydWUgKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgaW50bCRtZXNzYWdlZm9ybWF0JCQgPSByZXF1aXJlKFwiaW50bC1tZXNzYWdlZm9ybWF0XCIpLCBzcmMkZGlmZiQkID0gcmVxdWlyZShcIi4vZGlmZlwiKSwgc3JjJGVzNSQkID0gcmVxdWlyZShcIi4vZXM1XCIpO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBSZWxhdGl2ZUZvcm1hdDtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxudmFyIEZJRUxEUyA9IFsnc2Vjb25kJywgJ21pbnV0ZScsICdob3VyJywgJ2RheScsICdtb250aCcsICd5ZWFyJ107XG52YXIgU1RZTEVTID0gWydiZXN0IGZpdCcsICdudW1lcmljJ107XG5cbi8vIC0tIFJlbGF0aXZlRm9ybWF0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIFJlbGF0aXZlRm9ybWF0KGxvY2FsZXMsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIC8vIE1ha2UgYSBjb3B5IG9mIGBsb2NhbGVzYCBpZiBpdCdzIGFuIGFycmF5LCBzbyB0aGF0IGl0IGRvZXNuJ3QgY2hhbmdlXG4gICAgLy8gc2luY2UgaXQncyB1c2VkIGxhemlseS5cbiAgICBpZiAoc3JjJGVzNSQkLmlzQXJyYXkobG9jYWxlcykpIHtcbiAgICAgICAgbG9jYWxlcyA9IGxvY2FsZXMuY29uY2F0KCk7XG4gICAgfVxuXG4gICAgc3JjJGVzNSQkLmRlZmluZVByb3BlcnR5KHRoaXMsICdfbG9jYWxlJywge3ZhbHVlOiB0aGlzLl9yZXNvbHZlTG9jYWxlKGxvY2FsZXMpfSk7XG4gICAgc3JjJGVzNSQkLmRlZmluZVByb3BlcnR5KHRoaXMsICdfb3B0aW9ucycsIHt2YWx1ZToge1xuICAgICAgICBzdHlsZTogdGhpcy5fcmVzb2x2ZVN0eWxlKG9wdGlvbnMuc3R5bGUpLFxuICAgICAgICB1bml0czogdGhpcy5faXNWYWxpZFVuaXRzKG9wdGlvbnMudW5pdHMpICYmIG9wdGlvbnMudW5pdHNcbiAgICB9fSk7XG5cbiAgICBzcmMkZXM1JCQuZGVmaW5lUHJvcGVydHkodGhpcywgJ19sb2NhbGVzJywge3ZhbHVlOiBsb2NhbGVzfSk7XG4gICAgc3JjJGVzNSQkLmRlZmluZVByb3BlcnR5KHRoaXMsICdfZmllbGRzJywge3ZhbHVlOiB0aGlzLl9maW5kRmllbGRzKHRoaXMuX2xvY2FsZSl9KTtcbiAgICBzcmMkZXM1JCQuZGVmaW5lUHJvcGVydHkodGhpcywgJ19tZXNzYWdlcycsIHt2YWx1ZTogc3JjJGVzNSQkLm9iakNyZWF0ZShudWxsKX0pO1xuXG4gICAgLy8gXCJCaW5kXCIgYGZvcm1hdCgpYCBtZXRob2QgdG8gYHRoaXNgIHNvIGl0IGNhbiBiZSBwYXNzZWQgYnkgcmVmZXJlbmNlIGxpa2VcbiAgICAvLyB0aGUgb3RoZXIgYEludGxgIEFQSXMuXG4gICAgdmFyIHJlbGF0aXZlRm9ybWF0ID0gdGhpcztcbiAgICB0aGlzLmZvcm1hdCA9IGZ1bmN0aW9uIGZvcm1hdChkYXRlLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiByZWxhdGl2ZUZvcm1hdC5fZm9ybWF0KGRhdGUsIG9wdGlvbnMpO1xuICAgIH07XG59XG5cbi8vIERlZmluZSBpbnRlcm5hbCBwcml2YXRlIHByb3BlcnRpZXMgZm9yIGRlYWxpbmcgd2l0aCBsb2NhbGUgZGF0YS5cbnNyYyRlczUkJC5kZWZpbmVQcm9wZXJ0eShSZWxhdGl2ZUZvcm1hdCwgJ19fbG9jYWxlRGF0YV9fJywge3ZhbHVlOiBzcmMkZXM1JCQub2JqQ3JlYXRlKG51bGwpfSk7XG5zcmMkZXM1JCQuZGVmaW5lUHJvcGVydHkoUmVsYXRpdmVGb3JtYXQsICdfX2FkZExvY2FsZURhdGEnLCB7dmFsdWU6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgaWYgKCEoZGF0YSAmJiBkYXRhLmxvY2FsZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0xvY2FsZSBkYXRhIHByb3ZpZGVkIHRvIEludGxSZWxhdGl2ZUZvcm1hdCBpcyBtaXNzaW5nIGEgJyArXG4gICAgICAgICAgICAnYGxvY2FsZWAgcHJvcGVydHkgdmFsdWUnXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgUmVsYXRpdmVGb3JtYXQuX19sb2NhbGVEYXRhX19bZGF0YS5sb2NhbGUudG9Mb3dlckNhc2UoKV0gPSBkYXRhO1xuXG4gICAgLy8gQWRkIGRhdGEgdG8gSW50bE1lc3NhZ2VGb3JtYXQuXG4gICAgaW50bCRtZXNzYWdlZm9ybWF0JCRbXCJkZWZhdWx0XCJdLl9fYWRkTG9jYWxlRGF0YShkYXRhKTtcbn19KTtcblxuLy8gRGVmaW5lIHB1YmxpYyBgZGVmYXVsdExvY2FsZWAgcHJvcGVydHkgd2hpY2ggY2FuIGJlIHNldCBieSB0aGUgZGV2ZWxvcGVyLCBvclxuLy8gaXQgd2lsbCBiZSBzZXQgd2hlbiB0aGUgZmlyc3QgUmVsYXRpdmVGb3JtYXQgaW5zdGFuY2UgaXMgY3JlYXRlZCBieVxuLy8gbGV2ZXJhZ2luZyB0aGUgcmVzb2x2ZWQgbG9jYWxlIGZyb20gYEludGxgLlxuc3JjJGVzNSQkLmRlZmluZVByb3BlcnR5KFJlbGF0aXZlRm9ybWF0LCAnZGVmYXVsdExvY2FsZScsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlICA6IHRydWUsXG4gICAgdmFsdWUgICAgIDogdW5kZWZpbmVkXG59KTtcblxuLy8gRGVmaW5lIHB1YmxpYyBgdGhyZXNob2xkc2AgcHJvcGVydHkgd2hpY2ggY2FuIGJlIHNldCBieSB0aGUgZGV2ZWxvcGVyLCBhbmRcbi8vIGRlZmF1bHRzIHRvIHJlbGF0aXZlIHRpbWUgdGhyZXNob2xkcyBmcm9tIG1vbWVudC5qcy5cbnNyYyRlczUkJC5kZWZpbmVQcm9wZXJ0eShSZWxhdGl2ZUZvcm1hdCwgJ3RocmVzaG9sZHMnLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcblxuICAgIHZhbHVlOiB7XG4gICAgICAgIHNlY29uZDogNDUsICAvLyBzZWNvbmRzIHRvIG1pbnV0ZVxuICAgICAgICBtaW51dGU6IDQ1LCAgLy8gbWludXRlcyB0byBob3VyXG4gICAgICAgIGhvdXIgIDogMjIsICAvLyBob3VycyB0byBkYXlcbiAgICAgICAgZGF5ICAgOiAyNiwgIC8vIGRheXMgdG8gbW9udGhcbiAgICAgICAgbW9udGggOiAxMSAgIC8vIG1vbnRocyB0byB5ZWFyXG4gICAgfVxufSk7XG5cblJlbGF0aXZlRm9ybWF0LnByb3RvdHlwZS5yZXNvbHZlZE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbG9jYWxlOiB0aGlzLl9sb2NhbGUsXG4gICAgICAgIHN0eWxlIDogdGhpcy5fb3B0aW9ucy5zdHlsZSxcbiAgICAgICAgdW5pdHMgOiB0aGlzLl9vcHRpb25zLnVuaXRzXG4gICAgfTtcbn07XG5cblJlbGF0aXZlRm9ybWF0LnByb3RvdHlwZS5fY29tcGlsZU1lc3NhZ2UgPSBmdW5jdGlvbiAodW5pdHMpIHtcbiAgICAvLyBgdGhpcy5fbG9jYWxlc2AgaXMgdGhlIG9yaWdpbmFsIHNldCBvZiBsb2NhbGVzIHRoZSB1c2VyIHNwZWNpZmllZCB0byB0aGVcbiAgICAvLyBjb25zdHJ1Y3Rvciwgd2hpbGUgYHRoaXMuX2xvY2FsZWAgaXMgdGhlIHJlc29sdmVkIHJvb3QgbG9jYWxlLlxuICAgIHZhciBsb2NhbGVzICAgICAgICA9IHRoaXMuX2xvY2FsZXM7XG4gICAgdmFyIHJlc29sdmVkTG9jYWxlID0gdGhpcy5fbG9jYWxlO1xuXG4gICAgdmFyIGZpZWxkICAgICAgICA9IHRoaXMuX2ZpZWxkc1t1bml0c107XG4gICAgdmFyIHJlbGF0aXZlVGltZSA9IGZpZWxkLnJlbGF0aXZlVGltZTtcbiAgICB2YXIgZnV0dXJlICAgICAgID0gJyc7XG4gICAgdmFyIHBhc3QgICAgICAgICA9ICcnO1xuICAgIHZhciBpO1xuXG4gICAgZm9yIChpIGluIHJlbGF0aXZlVGltZS5mdXR1cmUpIHtcbiAgICAgICAgaWYgKHJlbGF0aXZlVGltZS5mdXR1cmUuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICAgIGZ1dHVyZSArPSAnICcgKyBpICsgJyB7JyArXG4gICAgICAgICAgICAgICAgcmVsYXRpdmVUaW1lLmZ1dHVyZVtpXS5yZXBsYWNlKCd7MH0nLCAnIycpICsgJ30nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChpIGluIHJlbGF0aXZlVGltZS5wYXN0KSB7XG4gICAgICAgIGlmIChyZWxhdGl2ZVRpbWUucGFzdC5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgcGFzdCArPSAnICcgKyBpICsgJyB7JyArXG4gICAgICAgICAgICAgICAgcmVsYXRpdmVUaW1lLnBhc3RbaV0ucmVwbGFjZSgnezB9JywgJyMnKSArICd9JztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBtZXNzYWdlID0gJ3t3aGVuLCBzZWxlY3QsIGZ1dHVyZSB7ezAsIHBsdXJhbCwgJyArIGZ1dHVyZSArICd9fScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bhc3Qge3swLCBwbHVyYWwsICcgKyBwYXN0ICsgJ319fSc7XG5cbiAgICAvLyBDcmVhdGUgdGhlIHN5bnRoZXRpYyBJbnRsTWVzc2FnZUZvcm1hdCBpbnN0YW5jZSB1c2luZyB0aGUgb3JpZ2luYWxcbiAgICAvLyBsb2NhbGVzIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgdXNlciB3aGVuIGNvbnN0cnVjdGluZyB0aGUgdGhlIHBhcmVudFxuICAgIC8vIEludGxSZWxhdGl2ZUZvcm1hdCBpbnN0YW5jZS5cbiAgICByZXR1cm4gbmV3IGludGwkbWVzc2FnZWZvcm1hdCQkW1wiZGVmYXVsdFwiXShtZXNzYWdlLCBsb2NhbGVzKTtcbn07XG5cblJlbGF0aXZlRm9ybWF0LnByb3RvdHlwZS5fZ2V0TWVzc2FnZSA9IGZ1bmN0aW9uICh1bml0cykge1xuICAgIHZhciBtZXNzYWdlcyA9IHRoaXMuX21lc3NhZ2VzO1xuXG4gICAgLy8gQ3JlYXRlIGEgbmV3IHN5bnRoZXRpYyBtZXNzYWdlIGJhc2VkIG9uIHRoZSBsb2NhbGUgZGF0YSBmcm9tIENMRFIuXG4gICAgaWYgKCFtZXNzYWdlc1t1bml0c10pIHtcbiAgICAgICAgbWVzc2FnZXNbdW5pdHNdID0gdGhpcy5fY29tcGlsZU1lc3NhZ2UodW5pdHMpO1xuICAgIH1cblxuICAgIHJldHVybiBtZXNzYWdlc1t1bml0c107XG59O1xuXG5SZWxhdGl2ZUZvcm1hdC5wcm90b3R5cGUuX2dldFJlbGF0aXZlVW5pdHMgPSBmdW5jdGlvbiAoZGlmZiwgdW5pdHMpIHtcbiAgICB2YXIgZmllbGQgPSB0aGlzLl9maWVsZHNbdW5pdHNdO1xuXG4gICAgaWYgKGZpZWxkLnJlbGF0aXZlKSB7XG4gICAgICAgIHJldHVybiBmaWVsZC5yZWxhdGl2ZVtkaWZmXTtcbiAgICB9XG59O1xuXG5SZWxhdGl2ZUZvcm1hdC5wcm90b3R5cGUuX2ZpbmRGaWVsZHMgPSBmdW5jdGlvbiAobG9jYWxlKSB7XG4gICAgdmFyIGxvY2FsZURhdGEgPSBSZWxhdGl2ZUZvcm1hdC5fX2xvY2FsZURhdGFfXztcbiAgICB2YXIgZGF0YSAgICAgICA9IGxvY2FsZURhdGFbbG9jYWxlLnRvTG93ZXJDYXNlKCldO1xuXG4gICAgLy8gVGhlIGxvY2FsZSBkYXRhIGlzIGRlLWR1cGxpY2F0ZWQsIHNvIHdlIGhhdmUgdG8gdHJhdmVyc2UgdGhlIGxvY2FsZSdzXG4gICAgLy8gaGllcmFyY2h5IHVudGlsIHdlIGZpbmQgYGZpZWxkc2AgdG8gcmV0dXJuLlxuICAgIHdoaWxlIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLmZpZWxkcykge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGEuZmllbGRzO1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YSA9IGRhdGEucGFyZW50TG9jYWxlICYmIGxvY2FsZURhdGFbZGF0YS5wYXJlbnRMb2NhbGUudG9Mb3dlckNhc2UoKV07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnTG9jYWxlIGRhdGEgYWRkZWQgdG8gSW50bFJlbGF0aXZlRm9ybWF0IGlzIG1pc3NpbmcgYGZpZWxkc2AgZm9yIDonICtcbiAgICAgICAgbG9jYWxlXG4gICAgKTtcbn07XG5cblJlbGF0aXZlRm9ybWF0LnByb3RvdHlwZS5fZm9ybWF0ID0gZnVuY3Rpb24gKGRhdGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgbm93ID0gb3B0aW9ucyAmJiBvcHRpb25zLm5vdyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5ub3cgOiBzcmMkZXM1JCQuZGF0ZU5vdygpO1xuXG4gICAgaWYgKGRhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkYXRlID0gbm93O1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSBpZiB0aGUgYGRhdGVgIGFuZCBvcHRpb25hbCBgbm93YCB2YWx1ZXMgYXJlIHZhbGlkLCBhbmQgdGhyb3cgYVxuICAgIC8vIHNpbWlsYXIgZXJyb3IgdG8gd2hhdCBgSW50bC5EYXRlVGltZUZvcm1hdCNmb3JtYXQoKWAgd291bGQgdGhyb3cuXG4gICAgaWYgKCFpc0Zpbml0ZShub3cpKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICAgICAgJ1RoZSBgbm93YCBvcHRpb24gcHJvdmlkZWQgdG8gSW50bFJlbGF0aXZlRm9ybWF0I2Zvcm1hdCgpIGlzIG5vdCAnICtcbiAgICAgICAgICAgICdpbiB2YWxpZCByYW5nZS4nXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0Zpbml0ZShkYXRlKSkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcbiAgICAgICAgICAgICdUaGUgZGF0ZSB2YWx1ZSBwcm92aWRlZCB0byBJbnRsUmVsYXRpdmVGb3JtYXQjZm9ybWF0KCkgaXMgbm90ICcgK1xuICAgICAgICAgICAgJ2luIHZhbGlkIHJhbmdlLidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICB2YXIgZGlmZlJlcG9ydCAgPSBzcmMkZGlmZiQkW1wiZGVmYXVsdFwiXShub3csIGRhdGUpO1xuICAgIHZhciB1bml0cyAgICAgICA9IHRoaXMuX29wdGlvbnMudW5pdHMgfHwgdGhpcy5fc2VsZWN0VW5pdHMoZGlmZlJlcG9ydCk7XG4gICAgdmFyIGRpZmZJblVuaXRzID0gZGlmZlJlcG9ydFt1bml0c107XG5cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5zdHlsZSAhPT0gJ251bWVyaWMnKSB7XG4gICAgICAgIHZhciByZWxhdGl2ZVVuaXRzID0gdGhpcy5fZ2V0UmVsYXRpdmVVbml0cyhkaWZmSW5Vbml0cywgdW5pdHMpO1xuICAgICAgICBpZiAocmVsYXRpdmVVbml0cykge1xuICAgICAgICAgICAgcmV0dXJuIHJlbGF0aXZlVW5pdHM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ2V0TWVzc2FnZSh1bml0cykuZm9ybWF0KHtcbiAgICAgICAgJzAnIDogTWF0aC5hYnMoZGlmZkluVW5pdHMpLFxuICAgICAgICB3aGVuOiBkaWZmSW5Vbml0cyA8IDAgPyAncGFzdCcgOiAnZnV0dXJlJ1xuICAgIH0pO1xufTtcblxuUmVsYXRpdmVGb3JtYXQucHJvdG90eXBlLl9pc1ZhbGlkVW5pdHMgPSBmdW5jdGlvbiAodW5pdHMpIHtcbiAgICBpZiAoIXVuaXRzIHx8IHNyYyRlczUkJC5hcnJJbmRleE9mLmNhbGwoRklFTERTLCB1bml0cykgPj0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHVuaXRzID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgc3VnZ2VzdGlvbiA9IC9zJC8udGVzdCh1bml0cykgJiYgdW5pdHMuc3Vic3RyKDAsIHVuaXRzLmxlbmd0aCAtIDEpO1xuICAgICAgICBpZiAoc3VnZ2VzdGlvbiAmJiBzcmMkZXM1JCQuYXJySW5kZXhPZi5jYWxsKEZJRUxEUywgc3VnZ2VzdGlvbikgPj0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICdcIicgKyB1bml0cyArICdcIiBpcyBub3QgYSB2YWxpZCBJbnRsUmVsYXRpdmVGb3JtYXQgYHVuaXRzYCAnICtcbiAgICAgICAgICAgICAgICAndmFsdWUsIGRpZCB5b3UgbWVhbjogJyArIHN1Z2dlc3Rpb25cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdcIicgKyB1bml0cyArICdcIiBpcyBub3QgYSB2YWxpZCBJbnRsUmVsYXRpdmVGb3JtYXQgYHVuaXRzYCB2YWx1ZSwgaXQgJyArXG4gICAgICAgICdtdXN0IGJlIG9uZSBvZjogXCInICsgRklFTERTLmpvaW4oJ1wiLCBcIicpICsgJ1wiJ1xuICAgICk7XG59O1xuXG5SZWxhdGl2ZUZvcm1hdC5wcm90b3R5cGUuX3Jlc29sdmVMb2NhbGUgPSBmdW5jdGlvbiAobG9jYWxlcykge1xuICAgIGlmICh0eXBlb2YgbG9jYWxlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgbG9jYWxlcyA9IFtsb2NhbGVzXTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSBhcnJheSBzbyB3ZSBjYW4gcHVzaCBvbiB0aGUgZGVmYXVsdCBsb2NhbGUuXG4gICAgbG9jYWxlcyA9IChsb2NhbGVzIHx8IFtdKS5jb25jYXQoUmVsYXRpdmVGb3JtYXQuZGVmYXVsdExvY2FsZSk7XG5cbiAgICB2YXIgbG9jYWxlRGF0YSA9IFJlbGF0aXZlRm9ybWF0Ll9fbG9jYWxlRGF0YV9fO1xuICAgIHZhciBpLCBsZW4sIGxvY2FsZVBhcnRzLCBkYXRhO1xuXG4gICAgLy8gVXNpbmcgdGhlIHNldCBvZiBsb2NhbGVzICsgdGhlIGRlZmF1bHQgbG9jYWxlLCB3ZSBsb29rIGZvciB0aGUgZmlyc3Qgb25lXG4gICAgLy8gd2hpY2ggdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkLiBXaGVuIGRhdGEgZG9lcyBub3QgZXhpc3QgZm9yIGEgbG9jYWxlLCB3ZVxuICAgIC8vIHRyYXZlcnNlIGl0cyBhbmNlc3RvcnMgdG8gZmluZCBzb21ldGhpbmcgdGhhdCdzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoaW5cbiAgICAvLyBpdHMgaGllcmFyY2h5IG9mIGxvY2FsZXMuIFNpbmNlIHdlIGxhY2sgdGhlIHByb3BlciBgcGFyZW50TG9jYWxlYCBkYXRhXG4gICAgLy8gaGVyZSwgd2UgbXVzdCB0YWtlIGEgbmFpdmUgYXBwcm9hY2ggdG8gdHJhdmVyc2FsLlxuICAgIGZvciAoaSA9IDAsIGxlbiA9IGxvY2FsZXMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgbG9jYWxlUGFydHMgPSBsb2NhbGVzW2ldLnRvTG93ZXJDYXNlKCkuc3BsaXQoJy0nKTtcblxuICAgICAgICB3aGlsZSAobG9jYWxlUGFydHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBkYXRhID0gbG9jYWxlRGF0YVtsb2NhbGVQYXJ0cy5qb2luKCctJyldO1xuICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG5vcm1hbGl6ZWQgbG9jYWxlIHN0cmluZzsgZS5nLiwgd2UgcmV0dXJuIFwiZW4tVVNcIixcbiAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIFwiZW4tdXNcIi5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5sb2NhbGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxvY2FsZVBhcnRzLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGUgPSBsb2NhbGVzLnBvcCgpO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ05vIGxvY2FsZSBkYXRhIGhhcyBiZWVuIGFkZGVkIHRvIEludGxSZWxhdGl2ZUZvcm1hdCBmb3I6ICcgK1xuICAgICAgICBsb2NhbGVzLmpvaW4oJywgJykgKyAnLCBvciB0aGUgZGVmYXVsdCBsb2NhbGU6ICcgKyBkZWZhdWx0TG9jYWxlXG4gICAgKTtcbn07XG5cblJlbGF0aXZlRm9ybWF0LnByb3RvdHlwZS5fcmVzb2x2ZVN0eWxlID0gZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgLy8gRGVmYXVsdCB0byBcImJlc3QgZml0XCIgc3R5bGUuXG4gICAgaWYgKCFzdHlsZSkge1xuICAgICAgICByZXR1cm4gU1RZTEVTWzBdO1xuICAgIH1cblxuICAgIGlmIChzcmMkZXM1JCQuYXJySW5kZXhPZi5jYWxsKFNUWUxFUywgc3R5bGUpID49IDApIHtcbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1wiJyArIHN0eWxlICsgJ1wiIGlzIG5vdCBhIHZhbGlkIEludGxSZWxhdGl2ZUZvcm1hdCBgc3R5bGVgIHZhbHVlLCBpdCAnICtcbiAgICAgICAgJ211c3QgYmUgb25lIG9mOiBcIicgKyBTVFlMRVMuam9pbignXCIsIFwiJykgKyAnXCInXG4gICAgKTtcbn07XG5cblJlbGF0aXZlRm9ybWF0LnByb3RvdHlwZS5fc2VsZWN0VW5pdHMgPSBmdW5jdGlvbiAoZGlmZlJlcG9ydCkge1xuICAgIHZhciBpLCBsLCB1bml0cztcblxuICAgIGZvciAoaSA9IDAsIGwgPSBGSUVMRFMubGVuZ3RoOyBpIDwgbDsgaSArPSAxKSB7XG4gICAgICAgIHVuaXRzID0gRklFTERTW2ldO1xuXG4gICAgICAgIGlmIChNYXRoLmFicyhkaWZmUmVwb3J0W3VuaXRzXSkgPCBSZWxhdGl2ZUZvcm1hdC50aHJlc2hvbGRzW3VuaXRzXSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5pdHM7XG59O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb3JlLmpzLm1hcCIsIi8qXG5Db3B5cmlnaHQgKGMpIDIwMTQsIFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5Db3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG5TZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuKi9cblxuLyoganNsaW50IGVzbmV4dDogdHJ1ZSAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblxudmFyIHJvdW5kID0gTWF0aC5yb3VuZDtcblxuZnVuY3Rpb24gZGF5c1RvWWVhcnMoZGF5cykge1xuICAgIC8vIDQwMCB5ZWFycyBoYXZlIDE0NjA5NyBkYXlzICh0YWtpbmcgaW50byBhY2NvdW50IGxlYXAgeWVhciBydWxlcylcbiAgICByZXR1cm4gZGF5cyAqIDQwMCAvIDE0NjA5Nztcbn1cblxuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgICAvLyBDb252ZXJ0IHRvIG1zIHRpbWVzdGFtcHMuXG4gICAgZnJvbSA9ICtmcm9tO1xuICAgIHRvICAgPSArdG87XG5cbiAgICB2YXIgbWlsbGlzZWNvbmQgPSByb3VuZCh0byAtIGZyb20pLFxuICAgICAgICBzZWNvbmQgICAgICA9IHJvdW5kKG1pbGxpc2Vjb25kIC8gMTAwMCksXG4gICAgICAgIG1pbnV0ZSAgICAgID0gcm91bmQoc2Vjb25kIC8gNjApLFxuICAgICAgICBob3VyICAgICAgICA9IHJvdW5kKG1pbnV0ZSAvIDYwKSxcbiAgICAgICAgZGF5ICAgICAgICAgPSByb3VuZChob3VyIC8gMjQpLFxuICAgICAgICB3ZWVrICAgICAgICA9IHJvdW5kKGRheSAvIDcpO1xuXG4gICAgdmFyIHJhd1llYXJzID0gZGF5c1RvWWVhcnMoZGF5KSxcbiAgICAgICAgbW9udGggICAgPSByb3VuZChyYXdZZWFycyAqIDEyKSxcbiAgICAgICAgeWVhciAgICAgPSByb3VuZChyYXdZZWFycyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBtaWxsaXNlY29uZDogbWlsbGlzZWNvbmQsXG4gICAgICAgIHNlY29uZCAgICAgOiBzZWNvbmQsXG4gICAgICAgIG1pbnV0ZSAgICAgOiBtaW51dGUsXG4gICAgICAgIGhvdXIgICAgICAgOiBob3VyLFxuICAgICAgICBkYXkgICAgICAgIDogZGF5LFxuICAgICAgICB3ZWVrICAgICAgIDogd2VlayxcbiAgICAgICAgbW9udGggICAgICA6IG1vbnRoLFxuICAgICAgICB5ZWFyICAgICAgIDogeWVhclxuICAgIH07XG59O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1kaWZmLmpzLm1hcCIsIi8vIEdFTkVSQVRFRCBGSUxFXG5cInVzZSBzdHJpY3RcIjtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0ge1wibG9jYWxlXCI6XCJlblwiLFwicGx1cmFsUnVsZUZ1bmN0aW9uXCI6ZnVuY3Rpb24gKG4sb3JkKXt2YXIgcz1TdHJpbmcobikuc3BsaXQoXCIuXCIpLHYwPSFzWzFdLHQwPU51bWJlcihzWzBdKT09bixuMTA9dDAmJnNbMF0uc2xpY2UoLTEpLG4xMDA9dDAmJnNbMF0uc2xpY2UoLTIpO2lmKG9yZClyZXR1cm4gbjEwPT0xJiZuMTAwIT0xMT9cIm9uZVwiOm4xMD09MiYmbjEwMCE9MTI/XCJ0d29cIjpuMTA9PTMmJm4xMDAhPTEzP1wiZmV3XCI6XCJvdGhlclwiO3JldHVybiBuPT0xJiZ2MD9cIm9uZVwiOlwib3RoZXJcIn0sXCJmaWVsZHNcIjp7XCJ5ZWFyXCI6e1wiZGlzcGxheU5hbWVcIjpcInllYXJcIixcInJlbGF0aXZlXCI6e1wiMFwiOlwidGhpcyB5ZWFyXCIsXCIxXCI6XCJuZXh0IHllYXJcIixcIi0xXCI6XCJsYXN0IHllYXJcIn0sXCJyZWxhdGl2ZVRpbWVcIjp7XCJmdXR1cmVcIjp7XCJvbmVcIjpcImluIHswfSB5ZWFyXCIsXCJvdGhlclwiOlwiaW4gezB9IHllYXJzXCJ9LFwicGFzdFwiOntcIm9uZVwiOlwiezB9IHllYXIgYWdvXCIsXCJvdGhlclwiOlwiezB9IHllYXJzIGFnb1wifX19LFwibW9udGhcIjp7XCJkaXNwbGF5TmFtZVwiOlwibW9udGhcIixcInJlbGF0aXZlXCI6e1wiMFwiOlwidGhpcyBtb250aFwiLFwiMVwiOlwibmV4dCBtb250aFwiLFwiLTFcIjpcImxhc3QgbW9udGhcIn0sXCJyZWxhdGl2ZVRpbWVcIjp7XCJmdXR1cmVcIjp7XCJvbmVcIjpcImluIHswfSBtb250aFwiLFwib3RoZXJcIjpcImluIHswfSBtb250aHNcIn0sXCJwYXN0XCI6e1wib25lXCI6XCJ7MH0gbW9udGggYWdvXCIsXCJvdGhlclwiOlwiezB9IG1vbnRocyBhZ29cIn19fSxcImRheVwiOntcImRpc3BsYXlOYW1lXCI6XCJkYXlcIixcInJlbGF0aXZlXCI6e1wiMFwiOlwidG9kYXlcIixcIjFcIjpcInRvbW9ycm93XCIsXCItMVwiOlwieWVzdGVyZGF5XCJ9LFwicmVsYXRpdmVUaW1lXCI6e1wiZnV0dXJlXCI6e1wib25lXCI6XCJpbiB7MH0gZGF5XCIsXCJvdGhlclwiOlwiaW4gezB9IGRheXNcIn0sXCJwYXN0XCI6e1wib25lXCI6XCJ7MH0gZGF5IGFnb1wiLFwib3RoZXJcIjpcInswfSBkYXlzIGFnb1wifX19LFwiaG91clwiOntcImRpc3BsYXlOYW1lXCI6XCJob3VyXCIsXCJyZWxhdGl2ZVRpbWVcIjp7XCJmdXR1cmVcIjp7XCJvbmVcIjpcImluIHswfSBob3VyXCIsXCJvdGhlclwiOlwiaW4gezB9IGhvdXJzXCJ9LFwicGFzdFwiOntcIm9uZVwiOlwiezB9IGhvdXIgYWdvXCIsXCJvdGhlclwiOlwiezB9IGhvdXJzIGFnb1wifX19LFwibWludXRlXCI6e1wiZGlzcGxheU5hbWVcIjpcIm1pbnV0ZVwiLFwicmVsYXRpdmVUaW1lXCI6e1wiZnV0dXJlXCI6e1wib25lXCI6XCJpbiB7MH0gbWludXRlXCIsXCJvdGhlclwiOlwiaW4gezB9IG1pbnV0ZXNcIn0sXCJwYXN0XCI6e1wib25lXCI6XCJ7MH0gbWludXRlIGFnb1wiLFwib3RoZXJcIjpcInswfSBtaW51dGVzIGFnb1wifX19LFwic2Vjb25kXCI6e1wiZGlzcGxheU5hbWVcIjpcInNlY29uZFwiLFwicmVsYXRpdmVcIjp7XCIwXCI6XCJub3dcIn0sXCJyZWxhdGl2ZVRpbWVcIjp7XCJmdXR1cmVcIjp7XCJvbmVcIjpcImluIHswfSBzZWNvbmRcIixcIm90aGVyXCI6XCJpbiB7MH0gc2Vjb25kc1wifSxcInBhc3RcIjp7XCJvbmVcIjpcInswfSBzZWNvbmQgYWdvXCIsXCJvdGhlclwiOlwiezB9IHNlY29uZHMgYWdvXCJ9fX19fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW4uanMubWFwIiwiLypcbkNvcHlyaWdodCAoYykgMjAxNCwgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkNvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cblNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4qL1xuXG4vKiBqc2xpbnQgZXNuZXh0OiB0cnVlICovXG5cblwidXNlIHN0cmljdFwiO1xuXG4vLyBQdXJwb3NlbHkgdXNpbmcgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gYXMgdGhlIEludGwuanMgYEludGxgIHBvbHlmaWxsLlxuLy8gQ29weXJpZ2h0IDIwMTMgQW5keSBFYXJuc2hhdywgTUlUIExpY2Vuc2VcblxudmFyIGhvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG52YXIgcmVhbERlZmluZVByb3AgPSAoZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7IHJldHVybiAhIU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7fSk7IH1cbiAgICBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH1cbn0pKCk7XG5cbnZhciBlczMgPSAhcmVhbERlZmluZVByb3AgJiYgIU9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXztcblxudmFyIGRlZmluZVByb3BlcnR5ID0gcmVhbERlZmluZVByb3AgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOlxuICAgICAgICBmdW5jdGlvbiAob2JqLCBuYW1lLCBkZXNjKSB7XG5cbiAgICBpZiAoJ2dldCcgaW4gZGVzYyAmJiBvYmouX19kZWZpbmVHZXR0ZXJfXykge1xuICAgICAgICBvYmouX19kZWZpbmVHZXR0ZXJfXyhuYW1lLCBkZXNjLmdldCk7XG4gICAgfSBlbHNlIGlmICghaG9wLmNhbGwob2JqLCBuYW1lKSB8fCAndmFsdWUnIGluIGRlc2MpIHtcbiAgICAgICAgb2JqW25hbWVdID0gZGVzYy52YWx1ZTtcbiAgICB9XG59O1xuXG52YXIgb2JqQ3JlYXRlID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiAocHJvdG8sIHByb3BzKSB7XG4gICAgdmFyIG9iaiwgaztcblxuICAgIGZ1bmN0aW9uIEYoKSB7fVxuICAgIEYucHJvdG90eXBlID0gcHJvdG87XG4gICAgb2JqID0gbmV3IEYoKTtcblxuICAgIGZvciAoayBpbiBwcm9wcykge1xuICAgICAgICBpZiAoaG9wLmNhbGwocHJvcHMsIGspKSB7XG4gICAgICAgICAgICBkZWZpbmVQcm9wZXJ0eShvYmosIGssIHByb3BzW2tdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG52YXIgYXJySW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mIHx8IGZ1bmN0aW9uIChzZWFyY2gsIGZyb21JbmRleCkge1xuICAgIC8qanNoaW50IHZhbGlkdGhpczp0cnVlICovXG4gICAgdmFyIGFyciA9IHRoaXM7XG4gICAgaWYgKCFhcnIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gZnJvbUluZGV4IHx8IDAsIG1heCA9IGFyci5sZW5ndGg7IGkgPCBtYXg7IGkrKykge1xuICAgICAgICBpZiAoYXJyW2ldID09PSBzZWFyY2gpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xufTtcblxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxudmFyIGRhdGVOb3cgPSBEYXRlLm5vdyB8fCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xufTtcbmV4cG9ydHMuZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eSwgZXhwb3J0cy5vYmpDcmVhdGUgPSBvYmpDcmVhdGUsIGV4cG9ydHMuYXJySW5kZXhPZiA9IGFyckluZGV4T2YsIGV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXksIGV4cG9ydHMuZGF0ZU5vdyA9IGRhdGVOb3c7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVzNS5qcy5tYXAiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLTIwMTUsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLlxuICpcbiAqIFByb3ZpZGUgc3ByaW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzXG4gKiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdlcmVcbiAqIGV4cGVjdGluZy5cbiAqXG4gKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudFxuICogd2lsbCByZW1haW4gdG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLlxuICovXG5cbnZhciBpbnZhcmlhbnQgPSBmdW5jdGlvbihjb25kaXRpb24sIGZvcm1hdCwgYSwgYiwgYywgZCwgZSwgZikge1xuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YXJpYW50IHJlcXVpcmVzIGFuIGVycm9yIG1lc3NhZ2UgYXJndW1lbnQnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHZhciBlcnJvcjtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICAnTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgJyArXG4gICAgICAgICdmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLidcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBhcmdzID0gW2EsIGIsIGMsIGQsIGUsIGZdO1xuICAgICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKFxuICAgICAgICBmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24oKSB7IHJldHVybiBhcmdzW2FyZ0luZGV4KytdOyB9KVxuICAgICAgKTtcbiAgICAgIGVycm9yLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgfVxuXG4gICAgZXJyb3IuZnJhbWVzVG9Qb3AgPSAxOyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IGludmFyaWFudCdzIG93biBmcmFtZVxuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGludmFyaWFudDtcbiIsIi8vIFNvdXJjZTogaHR0cDovL2pzZmlkZGxlLm5ldC92V3g4Vi9cbi8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTYwMzE5NS9mdWxsLWxpc3Qtb2YtamF2YXNjcmlwdC1rZXljb2Rlc1xuXG4vKipcbiAqIENvbmVuaWVuY2UgbWV0aG9kIHJldHVybnMgY29ycmVzcG9uZGluZyB2YWx1ZSBmb3IgZ2l2ZW4ga2V5TmFtZSBvciBrZXlDb2RlLlxuICpcbiAqIEBwYXJhbSB7TWl4ZWR9IGtleUNvZGUge051bWJlcn0gb3Iga2V5TmFtZSB7U3RyaW5nfVxuICogQHJldHVybiB7TWl4ZWR9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHNlYXJjaElucHV0KSB7XG4gIC8vIEtleWJvYXJkIEV2ZW50c1xuICBpZiAoc2VhcmNoSW5wdXQgJiYgJ29iamVjdCcgPT09IHR5cGVvZiBzZWFyY2hJbnB1dCkge1xuICAgIHZhciBoYXNLZXlDb2RlID0gc2VhcmNoSW5wdXQud2hpY2ggfHwgc2VhcmNoSW5wdXQua2V5Q29kZSB8fCBzZWFyY2hJbnB1dC5jaGFyQ29kZVxuICAgIGlmIChoYXNLZXlDb2RlKSBzZWFyY2hJbnB1dCA9IGhhc0tleUNvZGVcbiAgfVxuXG4gIC8vIE51bWJlcnNcbiAgaWYgKCdudW1iZXInID09PSB0eXBlb2Ygc2VhcmNoSW5wdXQpIHJldHVybiBuYW1lc1tzZWFyY2hJbnB1dF1cblxuICAvLyBFdmVyeXRoaW5nIGVsc2UgKGNhc3QgdG8gc3RyaW5nKVxuICB2YXIgc2VhcmNoID0gU3RyaW5nKHNlYXJjaElucHV0KVxuXG4gIC8vIGNoZWNrIGNvZGVzXG4gIHZhciBmb3VuZE5hbWVkS2V5ID0gY29kZXNbc2VhcmNoLnRvTG93ZXJDYXNlKCldXG4gIGlmIChmb3VuZE5hbWVkS2V5KSByZXR1cm4gZm91bmROYW1lZEtleVxuXG4gIC8vIGNoZWNrIGFsaWFzZXNcbiAgdmFyIGZvdW5kTmFtZWRLZXkgPSBhbGlhc2VzW3NlYXJjaC50b0xvd2VyQ2FzZSgpXVxuICBpZiAoZm91bmROYW1lZEtleSkgcmV0dXJuIGZvdW5kTmFtZWRLZXlcblxuICAvLyB3ZWlyZCBjaGFyYWN0ZXI/XG4gIGlmIChzZWFyY2gubGVuZ3RoID09PSAxKSByZXR1cm4gc2VhcmNoLmNoYXJDb2RlQXQoMClcblxuICByZXR1cm4gdW5kZWZpbmVkXG59XG5cbi8qKlxuICogR2V0IGJ5IG5hbWVcbiAqXG4gKiAgIGV4cG9ydHMuY29kZVsnZW50ZXInXSAvLyA9PiAxM1xuICovXG5cbnZhciBjb2RlcyA9IGV4cG9ydHMuY29kZSA9IGV4cG9ydHMuY29kZXMgPSB7XG4gICdiYWNrc3BhY2UnOiA4LFxuICAndGFiJzogOSxcbiAgJ2VudGVyJzogMTMsXG4gICdzaGlmdCc6IDE2LFxuICAnY3RybCc6IDE3LFxuICAnYWx0JzogMTgsXG4gICdwYXVzZS9icmVhayc6IDE5LFxuICAnY2FwcyBsb2NrJzogMjAsXG4gICdlc2MnOiAyNyxcbiAgJ3NwYWNlJzogMzIsXG4gICdwYWdlIHVwJzogMzMsXG4gICdwYWdlIGRvd24nOiAzNCxcbiAgJ2VuZCc6IDM1LFxuICAnaG9tZSc6IDM2LFxuICAnbGVmdCc6IDM3LFxuICAndXAnOiAzOCxcbiAgJ3JpZ2h0JzogMzksXG4gICdkb3duJzogNDAsXG4gICdpbnNlcnQnOiA0NSxcbiAgJ2RlbGV0ZSc6IDQ2LFxuICAnY29tbWFuZCc6IDkxLFxuICAnbGVmdCBjb21tYW5kJzogOTEsXG4gICdyaWdodCBjb21tYW5kJzogOTMsXG4gICdudW1wYWQgKic6IDEwNixcbiAgJ251bXBhZCArJzogMTA3LFxuICAnbnVtcGFkIC0nOiAxMDksXG4gICdudW1wYWQgLic6IDExMCxcbiAgJ251bXBhZCAvJzogMTExLFxuICAnbnVtIGxvY2snOiAxNDQsXG4gICdzY3JvbGwgbG9jayc6IDE0NSxcbiAgJ215IGNvbXB1dGVyJzogMTgyLFxuICAnbXkgY2FsY3VsYXRvcic6IDE4MyxcbiAgJzsnOiAxODYsXG4gICc9JzogMTg3LFxuICAnLCc6IDE4OCxcbiAgJy0nOiAxODksXG4gICcuJzogMTkwLFxuICAnLyc6IDE5MSxcbiAgJ2AnOiAxOTIsXG4gICdbJzogMjE5LFxuICAnXFxcXCc6IDIyMCxcbiAgJ10nOiAyMjEsXG4gIFwiJ1wiOiAyMjJcbn1cblxuLy8gSGVscGVyIGFsaWFzZXNcblxudmFyIGFsaWFzZXMgPSBleHBvcnRzLmFsaWFzZXMgPSB7XG4gICd3aW5kb3dzJzogOTEsXG4gICfih6cnOiAxNixcbiAgJ+KMpSc6IDE4LFxuICAn4oyDJzogMTcsXG4gICfijJgnOiA5MSxcbiAgJ2N0bCc6IDE3LFxuICAnY29udHJvbCc6IDE3LFxuICAnb3B0aW9uJzogMTgsXG4gICdwYXVzZSc6IDE5LFxuICAnYnJlYWsnOiAxOSxcbiAgJ2NhcHMnOiAyMCxcbiAgJ3JldHVybic6IDEzLFxuICAnZXNjYXBlJzogMjcsXG4gICdzcGMnOiAzMixcbiAgJ3BndXAnOiAzMyxcbiAgJ3BnZG4nOiAzNCxcbiAgJ2lucyc6IDQ1LFxuICAnZGVsJzogNDYsXG4gICdjbWQnOiA5MVxufVxuXG5cbi8qIVxuICogUHJvZ3JhbWF0aWNhbGx5IGFkZCB0aGUgZm9sbG93aW5nXG4gKi9cblxuLy8gbG93ZXIgY2FzZSBjaGFyc1xuZm9yIChpID0gOTc7IGkgPCAxMjM7IGkrKykgY29kZXNbU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpIC0gMzJcblxuLy8gbnVtYmVyc1xuZm9yICh2YXIgaSA9IDQ4OyBpIDwgNTg7IGkrKykgY29kZXNbaSAtIDQ4XSA9IGlcblxuLy8gZnVuY3Rpb24ga2V5c1xuZm9yIChpID0gMTsgaSA8IDEzOyBpKyspIGNvZGVzWydmJytpXSA9IGkgKyAxMTFcblxuLy8gbnVtcGFkIGtleXNcbmZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSBjb2Rlc1snbnVtcGFkICcraV0gPSBpICsgOTZcblxuLyoqXG4gKiBHZXQgYnkgY29kZVxuICpcbiAqICAgZXhwb3J0cy5uYW1lWzEzXSAvLyA9PiAnRW50ZXInXG4gKi9cblxudmFyIG5hbWVzID0gZXhwb3J0cy5uYW1lcyA9IGV4cG9ydHMudGl0bGUgPSB7fSAvLyB0aXRsZSBmb3IgYmFja3dhcmQgY29tcGF0XG5cbi8vIENyZWF0ZSByZXZlcnNlIG1hcHBpbmdcbmZvciAoaSBpbiBjb2RlcykgbmFtZXNbY29kZXNbaV1dID0gaVxuXG4vLyBBZGQgYWxpYXNlc1xuZm9yICh2YXIgYWxpYXMgaW4gYWxpYXNlcykge1xuICBjb2Rlc1thbGlhc10gPSBhbGlhc2VzW2FsaWFzXVxufVxuIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bWJvbDtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBnZXRSYXdUYWcgPSByZXF1aXJlKCcuL19nZXRSYXdUYWcnKSxcbiAgICBvYmplY3RUb1N0cmluZyA9IHJlcXVpcmUoJy4vX29iamVjdFRvU3RyaW5nJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gIH1cbiAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKVxuICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXRUYWc7XG4iLCIvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7XG4iLCJ2YXIgb3ZlckFyZyA9IHJlcXVpcmUoJy4vX292ZXJBcmcnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0UHJvdG90eXBlO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlR2V0VGFnYCB3aGljaCBpZ25vcmVzIGBTeW1ib2wudG9TdHJpbmdUYWdgIHZhbHVlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmF3VGFnKHZhbHVlKSB7XG4gIHZhciBpc093biA9IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnKSxcbiAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcblxuICB0cnkge1xuICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHVuZGVmaW5lZDtcbiAgICB2YXIgdW5tYXNrZWQgPSB0cnVlO1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHZhciByZXN1bHQgPSBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgaWYgKHVubWFza2VkKSB7XG4gICAgaWYgKGlzT3duKSB7XG4gICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB0YWc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0UmF3VGFnO1xuIiwiLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gb2JqZWN0VG9TdHJpbmc7XG4iLCIvKipcbiAqIENyZWF0ZXMgYSB1bmFyeSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50IHRyYW5zZm9ybWVkLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSBhcmd1bWVudCB0cmFuc2Zvcm0uXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gb3ZlckFyZyhmdW5jLCB0cmFuc2Zvcm0pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvdmVyQXJnO1xuIiwidmFyIGZyZWVHbG9iYWwgPSByZXF1aXJlKCcuL19mcmVlR2xvYmFsJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxubW9kdWxlLmV4cG9ydHMgPSByb290O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZSh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShudWxsKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3RMaWtlO1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgZ2V0UHJvdG90eXBlID0gcmVxdWlyZSgnLi9fZ2V0UHJvdG90eXBlJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgZnVuY1Byb3RvID0gRnVuY3Rpb24ucHJvdG90eXBlLFxuICAgIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqL1xudmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZztcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqIFVzZWQgdG8gaW5mZXIgdGhlIGBPYmplY3RgIGNvbnN0cnVjdG9yLiAqL1xudmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCB0aGF0IGlzLCBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGVcbiAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuOC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBmdW5jdGlvbiBGb28oKSB7XG4gKiAgIHRoaXMuYSA9IDE7XG4gKiB9XG4gKlxuICogXy5pc1BsYWluT2JqZWN0KG5ldyBGb28pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoWzEsIDIsIDNdKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KHsgJ3gnOiAwLCAneSc6IDAgfSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KE9iamVjdC5jcmVhdGUobnVsbCkpO1xuICogLy8gPT4gdHJ1ZVxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPSBvYmplY3RUYWcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgaWYgKHByb3RvID09PSBudWxsKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdmFyIEN0b3IgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCAnY29uc3RydWN0b3InKSAmJiBwcm90by5jb25zdHJ1Y3RvcjtcbiAgcmV0dXJuIHR5cGVvZiBDdG9yID09ICdmdW5jdGlvbicgJiYgQ3RvciBpbnN0YW5jZW9mIEN0b3IgJiZcbiAgICBmdW5jVG9TdHJpbmcuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzUGxhaW5PYmplY3Q7XG4iLCIvLyBUSElTIEZJTEUgSVMgR0VORVJBVEVEIC0gRE8gTk9UIEVESVQhXG4vKiFtb2JpbGUtZGV0ZWN0IHYxLjMuNiAyMDE3LTA0LTA1Ki9cbi8qZ2xvYmFsIG1vZHVsZTpmYWxzZSwgZGVmaW5lOmZhbHNlKi9cbi8qanNoaW50IGxhdGVkZWY6ZmFsc2UqL1xuLyohQGxpY2Vuc2UgQ29weXJpZ2h0IDIwMTMsIEhlaW5yaWNoIEdvZWJsLCBMaWNlbnNlOiBNSVQsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vaGdvZWJsL21vYmlsZS1kZXRlY3QuanMqL1xuKGZ1bmN0aW9uIChkZWZpbmUsIHVuZGVmaW5lZCkge1xuZGVmaW5lKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgaW1wbCA9IHt9O1xuXG4gICAgaW1wbC5tb2JpbGVEZXRlY3RSdWxlcyA9IHtcbiAgICBcInBob25lc1wiOiB7XG4gICAgICAgIFwiaVBob25lXCI6IFwiXFxcXGJpUGhvbmVcXFxcYnxcXFxcYmlQb2RcXFxcYlwiLFxuICAgICAgICBcIkJsYWNrQmVycnlcIjogXCJCbGFja0JlcnJ5fFxcXFxiQkIxMFxcXFxifHJpbVswLTldK1wiLFxuICAgICAgICBcIkhUQ1wiOiBcIkhUQ3xIVEMuKihTZW5zYXRpb258RXZvfFZpc2lvbnxFeHBsb3Jlcnw2ODAwfDgxMDB8ODkwMHxBNzI3MnxTNTEwZXxDMTEwZXxMZWdlbmR8RGVzaXJlfFQ4MjgyKXxBUFg1MTVDS1R8UXRlazkwOTB8QVBBOTI5MktUfEhEX21pbml8U2Vuc2F0aW9uLipaNzEwZXxQRzg2MTAwfFo3MTVlfERlc2lyZS4qKEE4MTgxfEhEKXxBRFI2MjAwfEFEUjY0MDBMfEFEUjY0MjV8MDAxSFR8SW5zcGlyZSA0R3xBbmRyb2lkLipcXFxcYkVWT1xcXFxifFQtTW9iaWxlIEcxfFo1MjBtXCIsXG4gICAgICAgIFwiTmV4dXNcIjogXCJOZXh1cyBPbmV8TmV4dXMgU3xHYWxheHkuKk5leHVzfEFuZHJvaWQuKk5leHVzLipNb2JpbGV8TmV4dXMgNHxOZXh1cyA1fE5leHVzIDZcIixcbiAgICAgICAgXCJEZWxsXCI6IFwiRGVsbC4qU3RyZWFrfERlbGwuKkFlcm98RGVsbC4qVmVudWV8REVMTC4qVmVudWUgUHJvfERlbGwgRmxhc2h8RGVsbCBTbW9rZXxEZWxsIE1pbmkgM2lYfFhDRDI4fFhDRDM1fFxcXFxiMDAxRExcXFxcYnxcXFxcYjEwMURMXFxcXGJ8XFxcXGJHUzAxXFxcXGJcIixcbiAgICAgICAgXCJNb3Rvcm9sYVwiOiBcIk1vdG9yb2xhfERST0lEWHxEUk9JRCBCSU9OSUN8XFxcXGJEcm9pZFxcXFxiLipCdWlsZHxBbmRyb2lkLipYb29tfEhSSTM5fE1PVC18QTEyNjB8QTE2ODB8QTU1NXxBODUzfEE4NTV8QTk1M3xBOTU1fEE5NTZ8TW90b3JvbGEuKkVMRUNUUklGWXxNb3Rvcm9sYS4qaTF8aTg2N3xpOTQwfE1CMjAwfE1CMzAwfE1CNTAxfE1CNTAyfE1CNTA4fE1CNTExfE1CNTIwfE1CNTI1fE1CNTI2fE1CNjExfE1CNjEyfE1CNjMyfE1CODEwfE1CODU1fE1CODYwfE1CODYxfE1CODY1fE1CODcwfE1FNTAxfE1FNTAyfE1FNTExfE1FNTI1fE1FNjAwfE1FNjMyfE1FNzIyfE1FODExfE1FODYwfE1FODYzfE1FODY1fE1UNjIwfE1UNzEwfE1UNzE2fE1UNzIwfE1UODEwfE1UODcwfE1UOTE3fE1vdG9yb2xhLipUSVRBTklVTXxXWDQzNXxXWDQ0NXxYVDMwMHxYVDMwMXxYVDMxMXxYVDMxNnxYVDMxN3xYVDMxOXxYVDMyMHxYVDM5MHxYVDUwMnxYVDUzMHxYVDUzMXxYVDUzMnxYVDUzNXxYVDYwM3xYVDYxMHxYVDYxMXxYVDYxNXxYVDY4MXxYVDcwMXxYVDcwMnxYVDcxMXxYVDcyMHxYVDgwMHxYVDgwNnxYVDg2MHxYVDg2MnxYVDg3NXxYVDg4MnxYVDg4M3xYVDg5NHxYVDkwMXxYVDkwN3xYVDkwOXxYVDkxMHxYVDkxMnxYVDkyOHxYVDkyNnxYVDkxNXxYVDkxOXxYVDkyNXxYVDEwMjF8XFxcXGJNb3RvIEVcXFxcYlwiLFxuICAgICAgICBcIlNhbXN1bmdcIjogXCJcXFxcYlNhbXN1bmdcXFxcYnxTTS1HOTI1MHxHVC0xOTMwMHxTR0gtSTMzN3xCR1QtUzUyMzB8R1QtQjIxMDB8R1QtQjI3MDB8R1QtQjI3MTB8R1QtQjMyMTB8R1QtQjMzMTB8R1QtQjM0MTB8R1QtQjM3MzB8R1QtQjM3NDB8R1QtQjU1MTB8R1QtQjU1MTJ8R1QtQjU3MjJ8R1QtQjY1MjB8R1QtQjczMDB8R1QtQjczMjB8R1QtQjczMzB8R1QtQjczNTB8R1QtQjc1MTB8R1QtQjc3MjJ8R1QtQjc4MDB8R1QtQzMwMTB8R1QtQzMwMTF8R1QtQzMwNjB8R1QtQzMyMDB8R1QtQzMyMTJ8R1QtQzMyMTJJfEdULUMzMjYyfEdULUMzMjIyfEdULUMzMzAwfEdULUMzMzAwS3xHVC1DMzMwM3xHVC1DMzMwM0t8R1QtQzMzMTB8R1QtQzMzMjJ8R1QtQzMzMzB8R1QtQzMzNTB8R1QtQzM1MDB8R1QtQzM1MTB8R1QtQzM1MzB8R1QtQzM2MzB8R1QtQzM3ODB8R1QtQzUwMTB8R1QtQzUyMTJ8R1QtQzY2MjB8R1QtQzY2MjV8R1QtQzY3MTJ8R1QtRTEwNTB8R1QtRTEwNzB8R1QtRTEwNzV8R1QtRTEwODB8R1QtRTEwODF8R1QtRTEwODV8R1QtRTEwODd8R1QtRTExMDB8R1QtRTExMDd8R1QtRTExMTB8R1QtRTExMjB8R1QtRTExMjV8R1QtRTExMzB8R1QtRTExNjB8R1QtRTExNzB8R1QtRTExNzV8R1QtRTExODB8R1QtRTExODJ8R1QtRTEyMDB8R1QtRTEyMTB8R1QtRTEyMjV8R1QtRTEyMzB8R1QtRTEzOTB8R1QtRTIxMDB8R1QtRTIxMjB8R1QtRTIxMjF8R1QtRTIxNTJ8R1QtRTIyMjB8R1QtRTIyMjJ8R1QtRTIyMzB8R1QtRTIyMzJ8R1QtRTIyNTB8R1QtRTIzNzB8R1QtRTI1NTB8R1QtRTI2NTJ8R1QtRTMyMTB8R1QtRTMyMTN8R1QtSTU1MDB8R1QtSTU1MDN8R1QtSTU3MDB8R1QtSTU4MDB8R1QtSTU4MDF8R1QtSTY0MTB8R1QtSTY0MjB8R1QtSTcxMTB8R1QtSTc0MTB8R1QtSTc1MDB8R1QtSTgwMDB8R1QtSTgxNTB8R1QtSTgxNjB8R1QtSTgxOTB8R1QtSTgzMjB8R1QtSTgzMzB8R1QtSTgzNTB8R1QtSTg1MzB8R1QtSTg3MDB8R1QtSTg3MDN8R1QtSTg5MTB8R1QtSTkwMDB8R1QtSTkwMDF8R1QtSTkwMDN8R1QtSTkwMTB8R1QtSTkwMjB8R1QtSTkwMjN8R1QtSTkwNzB8R1QtSTkwODJ8R1QtSTkxMDB8R1QtSTkxMDN8R1QtSTkyMjB8R1QtSTkyNTB8R1QtSTkzMDB8R1QtSTkzMDV8R1QtSTk1MDB8R1QtSTk1MDV8R1QtTTM1MTB8R1QtTTU2NTB8R1QtTTc1MDB8R1QtTTc2MDB8R1QtTTc2MDN8R1QtTTg4MDB8R1QtTTg5MTB8R1QtTjcwMDB8R1QtUzMxMTB8R1QtUzMzMTB8R1QtUzMzNTB8R1QtUzMzNTN8R1QtUzMzNzB8R1QtUzM2NTB8R1QtUzM2NTN8R1QtUzM3NzB8R1QtUzM4NTB8R1QtUzUyMTB8R1QtUzUyMjB8R1QtUzUyMjl8R1QtUzUyMzB8R1QtUzUyMzN8R1QtUzUyNTB8R1QtUzUyNTN8R1QtUzUyNjB8R1QtUzUyNjN8R1QtUzUyNzB8R1QtUzUzMDB8R1QtUzUzMzB8R1QtUzUzNTB8R1QtUzUzNjB8R1QtUzUzNjN8R1QtUzUzNjl8R1QtUzUzODB8R1QtUzUzODBEfEdULVM1NTYwfEdULVM1NTcwfEdULVM1NjAwfEdULVM1NjAzfEdULVM1NjEwfEdULVM1NjIwfEdULVM1NjYwfEdULVM1NjcwfEdULVM1NjkwfEdULVM1NzUwfEdULVM1NzgwfEdULVM1ODMwfEdULVM1ODM5fEdULVM2MTAyfEdULVM2NTAwfEdULVM3MDcwfEdULVM3MjAwfEdULVM3MjIwfEdULVM3MjMwfEdULVM3MjMzfEdULVM3MjUwfEdULVM3NTAwfEdULVM3NTMwfEdULVM3NTUwfEdULVM3NTYyfEdULVM3NzEwfEdULVM4MDAwfEdULVM4MDAzfEdULVM4NTAwfEdULVM4NTMwfEdULVM4NjAwfFNDSC1BMzEwfFNDSC1BNTMwfFNDSC1BNTcwfFNDSC1BNjEwfFNDSC1BNjMwfFNDSC1BNjUwfFNDSC1BNzkwfFNDSC1BNzk1fFNDSC1BODUwfFNDSC1BODcwfFNDSC1BODkwfFNDSC1BOTMwfFNDSC1BOTUwfFNDSC1BOTcwfFNDSC1BOTkwfFNDSC1JMTAwfFNDSC1JMTEwfFNDSC1JNDAwfFNDSC1JNDA1fFNDSC1JNTAwfFNDSC1JNTEwfFNDSC1JNTE1fFNDSC1JNjAwfFNDSC1JNzMwfFNDSC1JNzYwfFNDSC1JNzcwfFNDSC1JODMwfFNDSC1JOTEwfFNDSC1JOTIwfFNDSC1JOTU5fFNDSC1MQzExfFNDSC1OMTUwfFNDSC1OMzAwfFNDSC1SMTAwfFNDSC1SMzAwfFNDSC1SMzUxfFNDSC1SNDAwfFNDSC1SNDEwfFNDSC1UMzAwfFNDSC1VMzEwfFNDSC1VMzIwfFNDSC1VMzUwfFNDSC1VMzYwfFNDSC1VMzY1fFNDSC1VMzcwfFNDSC1VMzgwfFNDSC1VNDEwfFNDSC1VNDMwfFNDSC1VNDUwfFNDSC1VNDYwfFNDSC1VNDcwfFNDSC1VNDkwfFNDSC1VNTQwfFNDSC1VNTUwfFNDSC1VNjIwfFNDSC1VNjQwfFNDSC1VNjUwfFNDSC1VNjYwfFNDSC1VNzAwfFNDSC1VNzQwfFNDSC1VNzUwfFNDSC1VODEwfFNDSC1VODIwfFNDSC1VOTAwfFNDSC1VOTQwfFNDSC1VOTYwfFNDUy0yNlVDfFNHSC1BMTA3fFNHSC1BMTE3fFNHSC1BMTI3fFNHSC1BMTM3fFNHSC1BMTU3fFNHSC1BMTY3fFNHSC1BMTc3fFNHSC1BMTg3fFNHSC1BMTk3fFNHSC1BMjI3fFNHSC1BMjM3fFNHSC1BMjU3fFNHSC1BNDM3fFNHSC1BNTE3fFNHSC1BNTk3fFNHSC1BNjM3fFNHSC1BNjU3fFNHSC1BNjY3fFNHSC1BNjg3fFNHSC1BNjk3fFNHSC1BNzA3fFNHSC1BNzE3fFNHSC1BNzI3fFNHSC1BNzM3fFNHSC1BNzQ3fFNHSC1BNzY3fFNHSC1BNzc3fFNHSC1BNzk3fFNHSC1BODE3fFNHSC1BODI3fFNHSC1BODM3fFNHSC1BODQ3fFNHSC1BODY3fFNHSC1BODc3fFNHSC1BODg3fFNHSC1BODk3fFNHSC1BOTI3fFNHSC1CMTAwfFNHSC1CMTMwfFNHSC1CMjAwfFNHSC1CMjIwfFNHSC1DMTAwfFNHSC1DMTEwfFNHSC1DMTIwfFNHSC1DMTMwfFNHSC1DMTQwfFNHSC1DMTYwfFNHSC1DMTcwfFNHSC1DMTgwfFNHSC1DMjAwfFNHSC1DMjA3fFNHSC1DMjEwfFNHSC1DMjI1fFNHSC1DMjMwfFNHSC1DNDE3fFNHSC1DNDUwfFNHSC1EMzA3fFNHSC1EMzQ3fFNHSC1EMzU3fFNHSC1ENDA3fFNHSC1ENDE1fFNHSC1ENzgwfFNHSC1EODA3fFNHSC1EOTgwfFNHSC1FMTA1fFNHSC1FMjAwfFNHSC1FMzE1fFNHSC1FMzE2fFNHSC1FMzE3fFNHSC1FMzM1fFNHSC1FNTkwfFNHSC1FNjM1fFNHSC1FNzE1fFNHSC1FODkwfFNHSC1GMzAwfFNHSC1GNDgwfFNHSC1JMjAwfFNHSC1JMzAwfFNHSC1JMzIwfFNHSC1JNTUwfFNHSC1JNTc3fFNHSC1JNjAwfFNHSC1JNjA3fFNHSC1JNjE3fFNHSC1JNjI3fFNHSC1JNjM3fFNHSC1JNjc3fFNHSC1JNzAwfFNHSC1JNzE3fFNHSC1JNzI3fFNHSC1pNzQ3TXxTR0gtSTc3N3xTR0gtSTc4MHxTR0gtSTgyN3xTR0gtSTg0N3xTR0gtSTg1N3xTR0gtSTg5NnxTR0gtSTg5N3xTR0gtSTkwMHxTR0gtSTkwN3xTR0gtSTkxN3xTR0gtSTkyN3xTR0gtSTkzN3xTR0gtSTk5N3xTR0gtSjE1MHxTR0gtSjIwMHxTR0gtTDE3MHxTR0gtTDcwMHxTR0gtTTExMHxTR0gtTTE1MHxTR0gtTTIwMHxTR0gtTjEwNXxTR0gtTjUwMHxTR0gtTjYwMHxTR0gtTjYyMHxTR0gtTjYyNXxTR0gtTjcwMHxTR0gtTjcxMHxTR0gtUDEwN3xTR0gtUDIwN3xTR0gtUDMwMHxTR0gtUDMxMHxTR0gtUDUyMHxTR0gtUDczNXxTR0gtUDc3N3xTR0gtUTEwNXxTR0gtUjIxMHxTR0gtUjIyMHxTR0gtUjIyNXxTR0gtUzEwNXxTR0gtUzMwN3xTR0gtVDEwOXxTR0gtVDExOXxTR0gtVDEzOXxTR0gtVDIwOXxTR0gtVDIxOXxTR0gtVDIyOXxTR0gtVDIzOXxTR0gtVDI0OXxTR0gtVDI1OXxTR0gtVDMwOXxTR0gtVDMxOXxTR0gtVDMyOXxTR0gtVDMzOXxTR0gtVDM0OXxTR0gtVDM1OXxTR0gtVDM2OXxTR0gtVDM3OXxTR0gtVDQwOXxTR0gtVDQyOXxTR0gtVDQzOXxTR0gtVDQ1OXxTR0gtVDQ2OXxTR0gtVDQ3OXxTR0gtVDQ5OXxTR0gtVDUwOXxTR0gtVDUxOXxTR0gtVDUzOXxTR0gtVDU1OXxTR0gtVDU4OXxTR0gtVDYwOXxTR0gtVDYxOXxTR0gtVDYyOXxTR0gtVDYzOXxTR0gtVDY1OXxTR0gtVDY2OXxTR0gtVDY3OXxTR0gtVDcwOXxTR0gtVDcxOXxTR0gtVDcyOXxTR0gtVDczOXxTR0gtVDc0NnxTR0gtVDc0OXxTR0gtVDc1OXxTR0gtVDc2OXxTR0gtVDgwOXxTR0gtVDgxOXxTR0gtVDgzOXxTR0gtVDkxOXxTR0gtVDkyOXxTR0gtVDkzOXxTR0gtVDk1OXxTR0gtVDk4OXxTR0gtVTEwMHxTR0gtVTIwMHxTR0gtVTgwMHxTR0gtVjIwNXxTR0gtVjIwNnxTR0gtWDEwMHxTR0gtWDEwNXxTR0gtWDEyMHxTR0gtWDE0MHxTR0gtWDQyNnxTR0gtWDQyN3xTR0gtWDQ3NXxTR0gtWDQ5NXxTR0gtWDQ5N3xTR0gtWDUwN3xTR0gtWDYwMHxTR0gtWDYxMHxTR0gtWDYyMHxTR0gtWDYzMHxTR0gtWDcwMHxTR0gtWDgyMHxTR0gtWDg5MHxTR0gtWjEzMHxTR0gtWjE1MHxTR0gtWjE3MHxTR0gtWlgxMHxTR0gtWlgyMHxTSFctTTExMHxTUEgtQTEyMHxTUEgtQTQwMHxTUEgtQTQyMHxTUEgtQTQ2MHxTUEgtQTUwMHxTUEgtQTU2MHxTUEgtQTYwMHxTUEgtQTYyMHxTUEgtQTY2MHxTUEgtQTcwMHxTUEgtQTc0MHxTUEgtQTc2MHxTUEgtQTc5MHxTUEgtQTgwMHxTUEgtQTgyMHxTUEgtQTg0MHxTUEgtQTg4MHxTUEgtQTkwMHxTUEgtQTk0MHxTUEgtQTk2MHxTUEgtRDYwMHxTUEgtRDcwMHxTUEgtRDcxMHxTUEgtRDcyMHxTUEgtSTMwMHxTUEgtSTMyNXxTUEgtSTMzMHxTUEgtSTM1MHxTUEgtSTUwMHxTUEgtSTYwMHxTUEgtSTcwMHxTUEgtTDcwMHxTUEgtTTEwMHxTUEgtTTIyMHxTUEgtTTI0MHxTUEgtTTMwMHxTUEgtTTMwNXxTUEgtTTMyMHxTUEgtTTMzMHxTUEgtTTM1MHxTUEgtTTM2MHxTUEgtTTM3MHxTUEgtTTM4MHxTUEgtTTUxMHxTUEgtTTU0MHxTUEgtTTU1MHxTUEgtTTU2MHxTUEgtTTU3MHxTUEgtTTU4MHxTUEgtTTYxMHxTUEgtTTYyMHxTUEgtTTYzMHxTUEgtTTgwMHxTUEgtTTgxMHxTUEgtTTg1MHxTUEgtTTkwMHxTUEgtTTkxMHxTUEgtTTkyMHxTUEgtTTkzMHxTUEgtTjEwMHxTUEgtTjIwMHxTUEgtTjI0MHxTUEgtTjMwMHxTUEgtTjQwMHxTUEgtWjQwMHxTV0MtRTEwMHxTQ0gtaTkwOXxHVC1ONzEwMHxHVC1ONzEwNXxTQ0gtSTUzNXxTTS1OOTAwQXxTR0gtSTMxN3xTR0gtVDk5OUx8R1QtUzUzNjBCfEdULUk4MjYyfEdULVM2ODAyfEdULVM2MzEyfEdULVM2MzEwfEdULVM1MzEyfEdULVM1MzEwfEdULUk5MTA1fEdULUk4NTEwfEdULVM2NzkwTnxTTS1HNzEwNXxTTS1OOTAwNXxHVC1TNTMwMXxHVC1JOTI5NXxHVC1JOTE5NXxTTS1DMTAxfEdULVM3MzkyfEdULVM3NTYwfEdULUI3NjEwfEdULUk1NTEwfEdULVM3NTgyfEdULVM3NTMwRXxHVC1JODc1MHxTTS1HOTAwNlZ8U00tRzkwMDhWfFNNLUc5MDA5RHxTTS1HOTAwQXxTTS1HOTAwRHxTTS1HOTAwRnxTTS1HOTAwSHxTTS1HOTAwSXxTTS1HOTAwSnxTTS1HOTAwS3xTTS1HOTAwTHxTTS1HOTAwTXxTTS1HOTAwUHxTTS1HOTAwUjR8U00tRzkwMFN8U00tRzkwMFR8U00tRzkwMFZ8U00tRzkwMFc4fFNIVi1FMTYwS3xTQ0gtUDcwOXxTQ0gtUDcyOXxTTS1UMjU1OHxHVC1JOTIwNXxTTS1HOTM1MHxTTS1KMTIwRnxTTS1HOTIwRnxTTS1HOTIwVnxTTS1HOTMwRnxTTS1OOTEwQ1wiLFxuICAgICAgICBcIkxHXCI6IFwiXFxcXGJMR1xcXFxiO3xMR1stIF0/KEM4MDB8QzkwMHxFNDAwfEU2MTB8RTkwMHxFLTkwMHxGMTYwfEYxODBLfEYxODBMfEYxODBTfDczMHw4NTV8TDE2MHxMUzc0MHxMUzg0MHxMUzk3MHxMVTYyMDB8TVM2OTB8TVM2OTV8TVM3NzB8TVM4NDB8TVM4NzB8TVM5MTB8UDUwMHxQNzAwfFA3MDV8Vk02OTZ8QVM2ODB8QVM2OTV8QVg4NDB8QzcyOXxFOTcwfEdTNTA1fDI3MnxDMzk1fEU3MzlCS3xFOTYwfEw1NUN8TDc1Q3xMUzY5NnxMUzg2MHxQNzY5Qkt8UDM1MHxQNTAwfFA1MDl8UDg3MHxVTjI3MnxVUzczMHxWUzg0MHxWUzk1MHxMTjI3MnxMTjUxMHxMUzY3MHxMUzg1NXxMVzY5MHxNTjI3MHxNTjUxMHxQNTA5fFA3Njl8UDkzMHxVTjIwMHxVTjI3MHxVTjUxMHxVTjYxMHxVUzY3MHxVUzc0MHxVUzc2MHxVWDI2NXxVWDg0MHxWTjI3MXxWTjUzMHxWUzY2MHxWUzcwMHxWUzc0MHxWUzc1MHxWUzkxMHxWUzkyMHxWUzkzMHxWWDkyMDB8VlgxMTAwMHxBWDg0MEF8TFc3NzB8UDUwNnxQOTI1fFA5OTl8RTYxMnxEOTU1fEQ4MDJ8TVMzMjMpXCIsXG4gICAgICAgIFwiU29ueVwiOiBcIlNvbnlTVHxTb255TFR8U29ueUVyaWNzc29ufFNvbnlFcmljc3NvbkxUMTVpdnxMVDE4aXxFMTBpfExUMjhofExUMjZ3fFNvbnlFcmljc3Nvbk1UMjdpfEM1MzAzfEM2OTAyfEM2OTAzfEM2OTA2fEM2OTQzfEQyNTMzXCIsXG4gICAgICAgIFwiQXN1c1wiOiBcIkFzdXMuKkdhbGF4eXxQYWRGb25lLipNb2JpbGVcIixcbiAgICAgICAgXCJOb2tpYUx1bWlhXCI6IFwiTHVtaWEgWzAtOV17Myw0fVwiLFxuICAgICAgICBcIk1pY3JvbWF4XCI6IFwiTWljcm9tYXguKlxcXFxiKEEyMTB8QTkyfEE4OHxBNzJ8QTExMXxBMTEwUXxBMTE1fEExMTZ8QTExMHxBOTBTfEEyNnxBNTF8QTM1fEE1NHxBMjV8QTI3fEE4OXxBNjh8QTY1fEE1N3xBOTApXFxcXGJcIixcbiAgICAgICAgXCJQYWxtXCI6IFwiUGFsbVNvdXJjZXxQYWxtXCIsXG4gICAgICAgIFwiVmVydHVcIjogXCJWZXJ0dXxWZXJ0dS4qTHRkfFZlcnR1LipBc2NlbnR8VmVydHUuKkF5eHRhfFZlcnR1LipDb25zdGVsbGF0aW9uKEZ8UXVlc3QpP3xWZXJ0dS4qTW9uaWthfFZlcnR1LipTaWduYXR1cmVcIixcbiAgICAgICAgXCJQYW50ZWNoXCI6IFwiUEFOVEVDSHxJTS1BODUwU3xJTS1BODQwU3xJTS1BODMwTHxJTS1BODMwS3xJTS1BODMwU3xJTS1BODIwTHxJTS1BODEwS3xJTS1BODEwU3xJTS1BODAwU3xJTS1UMTAwS3xJTS1BNzI1THxJTS1BNzgwTHxJTS1BNzc1Q3xJTS1BNzcwS3xJTS1BNzYwU3xJTS1BNzUwS3xJTS1BNzQwU3xJTS1BNzMwU3xJTS1BNzIwTHxJTS1BNzEwS3xJTS1BNjkwTHxJTS1BNjkwU3xJTS1BNjUwU3xJTS1BNjMwS3xJTS1BNjAwU3xWRUdBIFBUTDIxfFBUMDAzfFA4MDEwfEFEUjkxMEx8UDYwMzB8UDYwMjB8UDkwNzB8UDQxMDB8UDkwNjB8UDUwMDB8Q0RNODk5MnxUWFQ4MDQ1fEFEUjg5OTV8SVMxMVBUfFAyMDMwfFA2MDEwfFA4MDAwfFBUMDAyfElTMDZ8Q0RNODk5OXxQOTA1MHxQVDAwMXxUWFQ4MDQwfFAyMDIwfFA5MDIwfFAyMDAwfFA3MDQwfFA3MDAwfEM3OTBcIixcbiAgICAgICAgXCJGbHlcIjogXCJJUTIzMHxJUTQ0NHxJUTQ1MHxJUTQ0MHxJUTQ0MnxJUTQ0MXxJUTI0NXxJUTI1NnxJUTIzNnxJUTI1NXxJUTIzNXxJUTI0NXxJUTI3NXxJUTI0MHxJUTI4NXxJUTI4MHxJUTI3MHxJUTI2MHxJUTI1MFwiLFxuICAgICAgICBcIldpa29cIjogXCJLSVRFIDRHfEhJR0hXQVl8R0VUQVdBWXxTVEFJUldBWXxEQVJLU0lERXxEQVJLRlVMTHxEQVJLTklHSFR8REFSS01PT058U0xJREV8V0FYIDRHfFJBSU5CT1d8QkxPT018U1VOU0VUfEdPQSg/IW5uYSl8TEVOTll8QkFSUll8SUdHWXxPWlpZfENJTksgRklWRXxDSU5LIFBFQVh8Q0lOSyBQRUFYIDJ8Q0lOSyBTTElNfENJTksgU0xJTSAyfENJTksgK3xDSU5LIEtJTkd8Q0lOSyBQRUFYfENJTksgU0xJTXxTVUJMSU1cIixcbiAgICAgICAgXCJpTW9iaWxlXCI6IFwiaS1tb2JpbGUgKElRfGktU1RZTEV8aWRlYXxaQUF8SGl0eilcIixcbiAgICAgICAgXCJTaW1WYWxsZXlcIjogXCJcXFxcYihTUC04MHxYVC05MzB8U1gtMzQwfFhULTkzMHxTWC0zMTB8U1AtMzYwfFNQNjB8U1BULTgwMHxTUC0xMjB8U1BULTgwMHxTUC0xNDB8U1BYLTV8U1BYLTh8U1AtMTAwfFNQWC04fFNQWC0xMilcXFxcYlwiLFxuICAgICAgICBcIldvbGZnYW5nXCI6IFwiQVQtQjI0RHxBVC1BUzUwSER8QVQtQVM0MFd8QVQtQVM1NUhEfEFULUFTNDVxMnxBVC1CMjZEfEFULUFTNTBRXCIsXG4gICAgICAgIFwiQWxjYXRlbFwiOiBcIkFsY2F0ZWxcIixcbiAgICAgICAgXCJOaW50ZW5kb1wiOiBcIk5pbnRlbmRvIDNEU1wiLFxuICAgICAgICBcIkFtb2lcIjogXCJBbW9pXCIsXG4gICAgICAgIFwiSU5RXCI6IFwiSU5RXCIsXG4gICAgICAgIFwiR2VuZXJpY1Bob25lXCI6IFwiVGFwYXRhbGt8UERBO3xTQUdFTXxcXFxcYm1tcFxcXFxifHBvY2tldHxcXFxcYnBzcFxcXFxifHN5bWJpYW58U21hcnRwaG9uZXxzbWFydGZvbnx0cmVvfHVwLmJyb3dzZXJ8dXAubGlua3x2b2RhZm9uZXxcXFxcYndhcFxcXFxifG5va2lhfFNlcmllczQwfFNlcmllczYwfFM2MHxTb255RXJpY3Nzb258TjkwMHxNQVVJLipXQVAuKkJyb3dzZXJcIlxuICAgIH0sXG4gICAgXCJ0YWJsZXRzXCI6IHtcbiAgICAgICAgXCJpUGFkXCI6IFwiaVBhZHxpUGFkLipNb2JpbGVcIixcbiAgICAgICAgXCJOZXh1c1RhYmxldFwiOiBcIkFuZHJvaWQuKk5leHVzW1xcXFxzXSsoN3w5fDEwKVwiLFxuICAgICAgICBcIlNhbXN1bmdUYWJsZXRcIjogXCJTQU1TVU5HLipUYWJsZXR8R2FsYXh5LipUYWJ8U0MtMDFDfEdULVAxMDAwfEdULVAxMDAzfEdULVAxMDEwfEdULVAzMTA1fEdULVA2MjEwfEdULVA2ODAwfEdULVA2ODEwfEdULVA3MTAwfEdULVA3MzAwfEdULVA3MzEwfEdULVA3NTAwfEdULVA3NTEwfFNDSC1JODAwfFNDSC1JODE1fFNDSC1JOTA1fFNHSC1JOTU3fFNHSC1JOTg3fFNHSC1UODQ5fFNHSC1UODU5fFNHSC1UODY5fFNQSC1QMTAwfEdULVAzMTAwfEdULVAzMTA4fEdULVAzMTEwfEdULVA1MTAwfEdULVA1MTEwfEdULVA2MjAwfEdULVA3MzIwfEdULVA3NTExfEdULU44MDAwfEdULVA4NTEwfFNHSC1JNDk3fFNQSC1QNTAwfFNHSC1UNzc5fFNDSC1JNzA1fFNDSC1JOTE1fEdULU44MDEzfEdULVAzMTEzfEdULVA1MTEzfEdULVA4MTEwfEdULU44MDEwfEdULU44MDA1fEdULU44MDIwfEdULVAxMDEzfEdULVA2MjAxfEdULVA3NTAxfEdULU41MTAwfEdULU41MTA1fEdULU41MTEwfFNIVi1FMTQwS3xTSFYtRTE0MEx8U0hWLUUxNDBTfFNIVi1FMTUwU3xTSFYtRTIzMEt8U0hWLUUyMzBMfFNIVi1FMjMwU3xTSFctTTE4MEt8U0hXLU0xODBMfFNIVy1NMTgwU3xTSFctTTE4MFd8U0hXLU0zMDBXfFNIVy1NMzA1V3xTSFctTTM4MEt8U0hXLU0zODBTfFNIVy1NMzgwV3xTSFctTTQzMFd8U0hXLU00ODBLfFNIVy1NNDgwU3xTSFctTTQ4MFd8U0hXLU00ODVXfFNIVy1NNDg2V3xTSFctTTUwMFd8R1QtSTkyMjh8U0NILVA3Mzl8U0NILUk5MjV8R1QtSTkyMDB8R1QtUDUyMDB8R1QtUDUyMTB8R1QtUDUyMTBYfFNNLVQzMTF8U00tVDMxMHxTTS1UMzEwWHxTTS1UMjEwfFNNLVQyMTBSfFNNLVQyMTF8U00tUDYwMHxTTS1QNjAxfFNNLVA2MDV8U00tUDkwMHxTTS1QOTAxfFNNLVQyMTd8U00tVDIxN0F8U00tVDIxN1N8U00tUDYwMDB8U00tVDMxMDB8U0dILUk0Njd8WEU1MDB8U00tVDExMHxHVC1QNTIyMHxHVC1JOTIwMFh8R1QtTjUxMTBYfEdULU41MTIwfFNNLVA5MDV8U00tVDExMXxTTS1UMjEwNXxTTS1UMzE1fFNNLVQzMjB8U00tVDMyMFh8U00tVDMyMXxTTS1UNTIwfFNNLVQ1MjV8U00tVDUzME5VfFNNLVQyMzBOVXxTTS1UMzMwTlV8U00tVDkwMHxYRTUwMFQxQ3xTTS1QNjA1VnxTTS1QOTA1VnxTTS1UMzM3VnxTTS1UNTM3VnxTTS1UNzA3VnxTTS1UODA3VnxTTS1QNjAwWHxTTS1QOTAwWHxTTS1UMjEwWHxTTS1UMjMwfFNNLVQyMzBYfFNNLVQzMjV8R1QtUDc1MDN8U00tVDUzMXxTTS1UMzMwfFNNLVQ1MzB8U00tVDcwNXxTTS1UNzA1Q3xTTS1UNTM1fFNNLVQzMzF8U00tVDgwMHxTTS1UNzAwfFNNLVQ1Mzd8U00tVDgwN3xTTS1QOTA3QXxTTS1UMzM3QXxTTS1UNTM3QXxTTS1UNzA3QXxTTS1UODA3QXxTTS1UMjM3fFNNLVQ4MDdQfFNNLVA2MDdUfFNNLVQyMTdUfFNNLVQzMzdUfFNNLVQ4MDdUfFNNLVQxMTZOUXxTTS1QNTUwfFNNLVQzNTB8U00tVDU1MHxTTS1UOTAwMHxTTS1QOTAwMHxTTS1UNzA1WXxTTS1UODA1fEdULVAzMTEzfFNNLVQ3MTB8U00tVDgxMHxTTS1UODE1fFNNLVQzNjB8U00tVDUzM3xTTS1UMTEzfFNNLVQzMzV8U00tVDcxNXxTTS1UNTYwfFNNLVQ2NzB8U00tVDY3N3xTTS1UMzc3fFNNLVQ1Njd8U00tVDM1N1R8U00tVDU1NXxTTS1UNTYxfFNNLVQ3MTN8U00tVDcxOXxTTS1UODEzfFNNLVQ4MTl8U00tVDU4MHxTTS1UMzU1WXxTTS1UMjgwfFNNLVQ4MTdBfFNNLVQ4MjB8U00tVzcwMHxTTS1QNTgwfFNNLVQ1ODdcIixcbiAgICAgICAgXCJLaW5kbGVcIjogXCJLaW5kbGV8U2lsay4qQWNjZWxlcmF0ZWR8QW5kcm9pZC4qXFxcXGIoS0ZPVHxLRlRUfEtGSldJfEtGSldBfEtGT1RFfEtGU09XSXxLRlRIV0l8S0ZUSFdBfEtGQVBXSXxLRkFQV0F8V0ZKV0FFfEtGU0FXQXxLRlNBV0l8S0ZBU1dJfEtGQVJXSXxLRkZPV0l8S0ZHSVdJfEtGTUVXSSlcXFxcYnxBbmRyb2lkLipTaWxrXFwvWzAtOS5dKyBsaWtlIENocm9tZVxcL1swLTkuXSsgKD8hTW9iaWxlKVwiLFxuICAgICAgICBcIlN1cmZhY2VUYWJsZXRcIjogXCJXaW5kb3dzIE5UIFswLTkuXSs7IEFSTTsuKihUYWJsZXR8QVJNQkpTKVwiLFxuICAgICAgICBcIkhQVGFibGV0XCI6IFwiSFAgU2xhdGUgKDd8OHwxMCl8SFAgRWxpdGVQYWQgOTAwfGhwLXRhYmxldHxFbGl0ZUJvb2suKlRvdWNofEhQIDh8U2xhdGUgMjF8SFAgU2xhdGVCb29rIDEwXCIsXG4gICAgICAgIFwiQXN1c1RhYmxldFwiOiBcIl4uKlBhZEZvbmUoKD8hTW9iaWxlKS4pKiR8VHJhbnNmb3JtZXJ8VEYxMDF8VEYxMDFHfFRGMzAwVHxURjMwMFRHfFRGMzAwVEx8VEY3MDBUfFRGNzAwS0x8VEY3MDFUfFRGODEwQ3xNRTE3MXxNRTMwMVR8TUUzMDJDfE1FMzcxTUd8TUUzNzBUfE1FMzcyTUd8TUUxNzJWfE1FMTczWHxNRTQwMEN8U2xpZGVyIFNMMTAxfFxcXFxiSzAwRlxcXFxifFxcXFxiSzAwQ1xcXFxifFxcXFxiSzAwRVxcXFxifFxcXFxiSzAwTFxcXFxifFRYMjAxTEF8TUUxNzZDfE1FMTAyQXxcXFxcYk04MFRBXFxcXGJ8TUUzNzJDTHxNRTU2MENHfE1FMzcyQ0d8TUUzMDJLTHwgSzAxMCB8IEswMTEgfCBLMDE3IHwgSzAxRSB8TUU1NzJDfE1FMTAzS3xNRTE3MEN8TUUxNzFDfFxcXFxiTUU3MENcXFxcYnxNRTU4MUN8TUU1ODFDTHxNRTg1MTBDfE1FMTgxQ3xQMDFZfFBPMU1BfFAwMVpcIixcbiAgICAgICAgXCJCbGFja0JlcnJ5VGFibGV0XCI6IFwiUGxheUJvb2t8UklNIFRhYmxldFwiLFxuICAgICAgICBcIkhUQ3RhYmxldFwiOiBcIkhUQ19GbHllcl9QNTEyfEhUQyBGbHllcnxIVEMgSmV0c3RyZWFtfEhUQy1QNzE1YXxIVEMgRVZPIFZpZXcgNEd8UEc0MTIwMHxQRzA5NDEwXCIsXG4gICAgICAgIFwiTW90b3JvbGFUYWJsZXRcIjogXCJ4b29tfHNob2xlc3R8TVo2MTV8TVo2MDV8TVo1MDV8TVo2MDF8TVo2MDJ8TVo2MDN8TVo2MDR8TVo2MDZ8TVo2MDd8TVo2MDh8TVo2MDl8TVo2MTV8TVo2MTZ8TVo2MTdcIixcbiAgICAgICAgXCJOb29rVGFibGV0XCI6IFwiQW5kcm9pZC4qTm9va3xOb29rQ29sb3J8bm9vayBicm93c2VyfEJOUlYyMDB8Qk5SVjIwMEF8Qk5UVjI1MHxCTlRWMjUwQXxCTlRWNDAwfEJOVFY2MDB8TG9naWNQRCBab29tMlwiLFxuICAgICAgICBcIkFjZXJUYWJsZXRcIjogXCJBbmRyb2lkLio7IFxcXFxiKEExMDB8QTEwMXxBMTEwfEEyMDB8QTIxMHxBMjExfEE1MDB8QTUwMXxBNTEwfEE1MTF8QTcwMHxBNzAxfFc1MDB8VzUwMFB8VzUwMXxXNTAxUHxXNTEwfFc1MTF8VzcwMHxHMTAwfEcxMDBXfEIxLUE3MXxCMS03MTB8QjEtNzExfEExLTgxMHxBMS04MTF8QTEtODMwKVxcXFxifFczLTgxMHxcXFxcYkEzLUExMFxcXFxifFxcXFxiQTMtQTExXFxcXGJ8XFxcXGJBMy1BMjBcXFxcYnxcXFxcYkEzLUEzMFwiLFxuICAgICAgICBcIlRvc2hpYmFUYWJsZXRcIjogXCJBbmRyb2lkLiooQVQxMDB8QVQxMDV8QVQyMDB8QVQyMDV8QVQyNzB8QVQyNzV8QVQzMDB8QVQzMDV8QVQxUzV8QVQ1MDB8QVQ1NzB8QVQ3MDB8QVQ4MzApfFRPU0hJQkEuKkZPTElPXCIsXG4gICAgICAgIFwiTEdUYWJsZXRcIjogXCJcXFxcYkwtMDZDfExHLVY5MDl8TEctVjkwMHxMRy1WNzAwfExHLVY1MTB8TEctVjUwMHxMRy1WNDEwfExHLVY0MDB8TEctVks4MTBcXFxcYlwiLFxuICAgICAgICBcIkZ1aml0c3VUYWJsZXRcIjogXCJBbmRyb2lkLipcXFxcYihGLTAxRHxGLTAyRnxGLTA1RXxGLTEwRHxNNTMyfFE1NzIpXFxcXGJcIixcbiAgICAgICAgXCJQcmVzdGlnaW9UYWJsZXRcIjogXCJQTVAzMTcwQnxQTVAzMjcwQnxQTVAzNDcwQnxQTVA3MTcwQnxQTVAzMzcwQnxQTVAzNTcwQ3xQTVA1ODcwQ3xQTVAzNjcwQnxQTVA1NTcwQ3xQTVA1NzcwRHxQTVAzOTcwQnxQTVAzODcwQ3xQTVA1NTgwQ3xQTVA1ODgwRHxQTVA1NzgwRHxQTVA1NTg4Q3xQTVA3MjgwQ3xQTVA3MjgwQzNHfFBNUDcyODB8UE1QNzg4MER8UE1QNTU5N0R8UE1QNTU5N3xQTVA3MTAwRHxQRVIzNDY0fFBFUjMyNzR8UEVSMzU3NHxQRVIzODg0fFBFUjUyNzR8UEVSNTQ3NHxQTVA1MDk3Q1BST3xQTVA1MDk3fFBNUDczODBEfFBNUDUyOTdDfFBNUDUyOTdDX1FVQUR8UE1QODEyRXxQTVA4MTJFM0d8UE1QODEyRnxQTVA4MTBFfFBNUDg4MFREfFBNVDMwMTd8UE1UMzAzN3xQTVQzMDQ3fFBNVDMwNTd8UE1UNzAwOHxQTVQ1ODg3fFBNVDUwMDF8UE1UNTAwMlwiLFxuICAgICAgICBcIkxlbm92b1RhYmxldFwiOiBcIkxlbm92byBUQUJ8SWRlYShUYWJ8UGFkKSggQTF8QTEwfCBLMXwpfFRoaW5rUGFkKFsgXSspP1RhYmxldHxZVDMtWDkwTHxZVDMtWDkwRnxZVDMtWDkwWHxMZW5vdm8uKihTMjEwOXxTMjExMHxTNTAwMHxTNjAwMHxLMzAxMXxBMzAwMHxBMzUwMHxBMTAwMHxBMjEwN3xBMjEwOXxBMTEwN3xBNTUwMHxBNzYwMHxCNjAwMHxCODAwMHxCODA4MCkoLXwpKEZMfEZ8SFZ8SHwpXCIsXG4gICAgICAgIFwiRGVsbFRhYmxldFwiOiBcIlZlbnVlIDExfFZlbnVlIDh8VmVudWUgN3xEZWxsIFN0cmVhayAxMHxEZWxsIFN0cmVhayA3XCIsXG4gICAgICAgIFwiWWFydmlrVGFibGV0XCI6IFwiQW5kcm9pZC4qXFxcXGIoVEFCMjEwfFRBQjIxMXxUQUIyMjR8VEFCMjUwfFRBQjI2MHxUQUIyNjR8VEFCMzEwfFRBQjM2MHxUQUIzNjR8VEFCNDEwfFRBQjQxMXxUQUI0MjB8VEFCNDI0fFRBQjQ1MHxUQUI0NjB8VEFCNDYxfFRBQjQ2NHxUQUI0NjV8VEFCNDY3fFRBQjQ2OHxUQUIwNy0xMDB8VEFCMDctMTAxfFRBQjA3LTE1MHxUQUIwNy0xNTF8VEFCMDctMTUyfFRBQjA3LTIwMHxUQUIwNy0yMDEtM0d8VEFCMDctMjEwfFRBQjA3LTIxMXxUQUIwNy0yMTJ8VEFCMDctMjE0fFRBQjA3LTIyMHxUQUIwNy00MDB8VEFCMDctNDg1fFRBQjA4LTE1MHxUQUIwOC0yMDB8VEFCMDgtMjAxLTNHfFRBQjA4LTIwMS0zMHxUQUIwOS0xMDB8VEFCMDktMjExfFRBQjA5LTQxMHxUQUIxMC0xNTB8VEFCMTAtMjAxfFRBQjEwLTIxMXxUQUIxMC00MDB8VEFCMTAtNDEwfFRBQjEzLTIwMXxUQUIyNzRFVUt8VEFCMjc1RVVLfFRBQjM3NEVVS3xUQUI0NjJFVUt8VEFCNDc0RVVLfFRBQjktMjAwKVxcXFxiXCIsXG4gICAgICAgIFwiTWVkaW9uVGFibGV0XCI6IFwiQW5kcm9pZC4qXFxcXGJPWU9cXFxcYnxMSUZFLiooUDkyMTJ8UDk1MTR8UDk1MTZ8Uzk1MTIpfExJRkVUQUJcIixcbiAgICAgICAgXCJBcm5vdmFUYWJsZXRcIjogXCI5N0c0fEFOMTBHMnxBTjdiRzN8QU43ZkczfEFOOEczfEFOOGNHM3xBTjdHM3xBTjlHM3xBTjdkRzN8QU43ZEczU1R8QU43ZEczQ2hpbGRQYWR8QU4xMGJHM3xBTjEwYkczRFR8QU45RzJcIixcbiAgICAgICAgXCJJbnRlbnNvVGFibGV0XCI6IFwiSU5NODAwMktQfElOTTEwMTBGUHxJTk04MDVORHxJbnRlbnNvIFRhYnxUQUIxMDA0XCIsXG4gICAgICAgIFwiSVJVVGFibGV0XCI6IFwiTTcwMnByb1wiLFxuICAgICAgICBcIk1lZ2Fmb25UYWJsZXRcIjogXCJNZWdhRm9uIFY5fFxcXFxiWlRFIFY5XFxcXGJ8QW5kcm9pZC4qXFxcXGJNVDdBXFxcXGJcIixcbiAgICAgICAgXCJFYm9kYVRhYmxldFwiOiBcIkUtQm9kYSAoU3VwcmVtZXxJbXByZXNzcGVlZHxJenp5Y29tbXxFc3NlbnRpYWwpXCIsXG4gICAgICAgIFwiQWxsVmlld1RhYmxldFwiOiBcIkFsbHZpZXcuKihWaXZhfEFsbGRyb3xDaXR5fFNwZWVkfEFsbCBUVnxGcmVuenl8UXVhc2FyfFNoaW5lfFRYMXxBWDF8QVgyKVwiLFxuICAgICAgICBcIkFyY2hvc1RhYmxldFwiOiBcIlxcXFxiKDEwMUc5fDgwRzl8QTEwMUlUKVxcXFxifFFpbGl2ZSA5N1J8QXJjaG9zNXxcXFxcYkFSQ0hPUyAoNzB8Nzl8ODB8OTB8OTd8MTAxfEZBTUlMWVBBRHwpKGJ8Y3wpKEcxMHwgQ29iYWx0fCBUSVRBTklVTShIRHwpfCBYZW5vbnwgTmVvbnxYU0t8IDJ8IFhTIDJ8IFBMQVRJTlVNfCBDQVJCT058R0FNRVBBRClcXFxcYlwiLFxuICAgICAgICBcIkFpbm9sVGFibGV0XCI6IFwiTk9WTzd8Tk9WTzh8Tk9WTzEwfE5vdm83QXVyb3JhfE5vdm83QmFzaWN8Tk9WTzdQQUxBRElOfG5vdm85LVNwYXJrXCIsXG4gICAgICAgIFwiTm9raWFMdW1pYVRhYmxldFwiOiBcIkx1bWlhIDI1MjBcIixcbiAgICAgICAgXCJTb255VGFibGV0XCI6IFwiU29ueS4qVGFibGV0fFhwZXJpYSBUYWJsZXR8U29ueSBUYWJsZXQgU3xTTy0wM0V8U0dQVDEyfFNHUFQxM3xTR1BUMTE0fFNHUFQxMjF8U0dQVDEyMnxTR1BUMTIzfFNHUFQxMTF8U0dQVDExMnxTR1BUMTEzfFNHUFQxMzF8U0dQVDEzMnxTR1BUMTMzfFNHUFQyMTF8U0dQVDIxMnxTR1BUMjEzfFNHUDMxMXxTR1AzMTJ8U0dQMzIxfEVCUkQxMTAxfEVCUkQxMTAyfEVCUkQxMjAxfFNHUDM1MXxTR1AzNDF8U0dQNTExfFNHUDUxMnxTR1A1MjF8U0dQNTQxfFNHUDU1MXxTR1A2MjF8U0dQNjEyfFNPVDMxXCIsXG4gICAgICAgIFwiUGhpbGlwc1RhYmxldFwiOiBcIlxcXFxiKFBJMjAxMHxQSTMwMDB8UEkzMTAwfFBJMzEwNXxQSTMxMTB8UEkzMjA1fFBJMzIxMHxQSTM5MDB8UEk0MDEwfFBJNzAwMHxQSTcxMDApXFxcXGJcIixcbiAgICAgICAgXCJDdWJlVGFibGV0XCI6IFwiQW5kcm9pZC4qKEs4R1R8VTlHVHxVMTBHVHxVMTZHVHxVMTdHVHxVMThHVHxVMTlHVHxVMjBHVHxVMjNHVHxVMzBHVCl8Q1VCRSBVOEdUXCIsXG4gICAgICAgIFwiQ29ieVRhYmxldFwiOiBcIk1JRDEwNDJ8TUlEMTA0NXxNSUQxMTI1fE1JRDExMjZ8TUlENzAxMnxNSUQ3MDE0fE1JRDcwMTV8TUlENzAzNHxNSUQ3MDM1fE1JRDcwMzZ8TUlENzA0MnxNSUQ3MDQ4fE1JRDcxMjd8TUlEODA0MnxNSUQ4MDQ4fE1JRDgxMjd8TUlEOTA0MnxNSUQ5NzQwfE1JRDk3NDJ8TUlENzAyMnxNSUQ3MDEwXCIsXG4gICAgICAgIFwiTUlEVGFibGV0XCI6IFwiTTk3MDF8TTkwMDB8TTkxMDB8TTgwNnxNMTA1MnxNODA2fFQ3MDN8TUlENzAxfE1JRDcxM3xNSUQ3MTB8TUlENzI3fE1JRDc2MHxNSUQ4MzB8TUlENzI4fE1JRDkzM3xNSUQxMjV8TUlEODEwfE1JRDczMnxNSUQxMjB8TUlEOTMwfE1JRDgwMHxNSUQ3MzF8TUlEOTAwfE1JRDEwMHxNSUQ4MjB8TUlENzM1fE1JRDk4MHxNSUQxMzB8TUlEODMzfE1JRDczN3xNSUQ5NjB8TUlEMTM1fE1JRDg2MHxNSUQ3MzZ8TUlEMTQwfE1JRDkzMHxNSUQ4MzV8TUlENzMzfE1JRDRYMTBcIixcbiAgICAgICAgXCJNU0lUYWJsZXRcIjogXCJNU0kgXFxcXGIoUHJpbW8gNzNLfFByaW1vIDczTHxQcmltbyA4MUx8UHJpbW8gNzd8UHJpbW8gOTN8UHJpbW8gNzV8UHJpbW8gNzZ8UHJpbW8gNzN8UHJpbW8gODF8UHJpbW8gOTF8UHJpbW8gOTB8RW5qb3kgNzF8RW5qb3kgN3xFbmpveSAxMClcXFxcYlwiLFxuICAgICAgICBcIlNNaVRUYWJsZXRcIjogXCJBbmRyb2lkLiooXFxcXGJNSURcXFxcYnxNSUQtNTYwfE1UVi1UMTIwMHxNVFYtUE5ENTMxfE1UVi1QMTEwMXxNVFYtUE5ENTMwKVwiLFxuICAgICAgICBcIlJvY2tDaGlwVGFibGV0XCI6IFwiQW5kcm9pZC4qKFJLMjgxOHxSSzI4MDhBfFJLMjkxOHxSSzMwNjYpfFJLMjczOHxSSzI4MDhBXCIsXG4gICAgICAgIFwiRmx5VGFibGV0XCI6IFwiSVEzMTB8Rmx5IFZpc2lvblwiLFxuICAgICAgICBcImJxVGFibGV0XCI6IFwiQW5kcm9pZC4qKGJxKT8uKihFbGNhbm98Q3VyaWV8RWRpc29ufE1heHdlbGx8S2VwbGVyfFBhc2NhbHxUZXNsYXxIeXBhdGlhfFBsYXRvbnxOZXd0b258TGl2aW5nc3RvbmV8Q2VydmFudGVzfEF2YW50fEFxdWFyaXMgW0V8TV0xMCl8TWF4d2VsbC4qTGl0ZXxNYXh3ZWxsLipQbHVzXCIsXG4gICAgICAgIFwiSHVhd2VpVGFibGV0XCI6IFwiTWVkaWFQYWR8TWVkaWFQYWQgNyBZb3V0aHxJREVPUyBTN3xTNy0yMDFjfFM3LTIwMnV8UzctMTAxfFM3LTEwM3xTNy0xMDR8UzctMTA1fFM3LTEwNnxTNy0yMDF8UzctU2xpbVwiLFxuICAgICAgICBcIk5lY1RhYmxldFwiOiBcIlxcXFxiTi0wNkR8XFxcXGJOLTA4RFwiLFxuICAgICAgICBcIlBhbnRlY2hUYWJsZXRcIjogXCJQYW50ZWNoLipQNDEwMFwiLFxuICAgICAgICBcIkJyb25jaG9UYWJsZXRcIjogXCJCcm9uY2hvLiooTjcwMXxONzA4fE44MDJ8YTcxMClcIixcbiAgICAgICAgXCJWZXJzdXNUYWJsZXRcIjogXCJUT1VDSFBBRC4qWzc4OTEwXXxcXFxcYlRPVUNIVEFCXFxcXGJcIixcbiAgICAgICAgXCJaeW5jVGFibGV0XCI6IFwiejEwMDB8Wjk5IDJHfHo5OXx6OTMwfHo5OTl8ejk5MHx6OTA5fFo5MTl8ejkwMFwiLFxuICAgICAgICBcIlBvc2l0aXZvVGFibGV0XCI6IFwiVEIwN1NUQXxUQjEwU1RBfFRCMDdGVEF8VEIxMEZUQVwiLFxuICAgICAgICBcIk5hYmlUYWJsZXRcIjogXCJBbmRyb2lkLipcXFxcYk5hYmlcIixcbiAgICAgICAgXCJLb2JvVGFibGV0XCI6IFwiS29ibyBUb3VjaHxcXFxcYkswODBcXFxcYnxcXFxcYlZveFxcXFxiIEJ1aWxkfFxcXFxiQXJjXFxcXGIgQnVpbGRcIixcbiAgICAgICAgXCJEYW5ld1RhYmxldFwiOiBcIkRTbGlkZS4qXFxcXGIoNzAwfDcwMVJ8NzAyfDcwM1J8NzA0fDgwMnw5NzB8OTcxfDk3Mnw5NzN8OTc0fDEwMTB8MTAxMilcXFxcYlwiLFxuICAgICAgICBcIlRleGV0VGFibGV0XCI6IFwiTmF2aVBhZHxUQi03NzJBfFRNLTcwNDV8VE0tNzA1NXxUTS05NzUwfFRNLTcwMTZ8VE0tNzAyNHxUTS03MDI2fFRNLTcwNDF8VE0tNzA0M3xUTS03MDQ3fFRNLTgwNDF8VE0tOTc0MXxUTS05NzQ3fFRNLTk3NDh8VE0tOTc1MXxUTS03MDIyfFRNLTcwMjF8VE0tNzAyMHxUTS03MDExfFRNLTcwMTB8VE0tNzAyM3xUTS03MDI1fFRNLTcwMzdXfFRNLTcwMzhXfFRNLTcwMjdXfFRNLTk3MjB8VE0tOTcyNXxUTS05NzM3V3xUTS0xMDIwfFRNLTk3MzhXfFRNLTk3NDB8VE0tOTc0M1d8VEItODA3QXxUQi03NzFBfFRCLTcyN0F8VEItNzI1QXxUQi03MTlBfFRCLTgyM0F8VEItODA1QXxUQi03MjNBfFRCLTcxNUF8VEItNzA3QXxUQi03MDVBfFRCLTcwOUF8VEItNzExQXxUQi04OTBIRHxUQi04ODBIRHxUQi03OTBIRHxUQi03ODBIRHxUQi03NzBIRHxUQi03MjFIRHxUQi03MTBIRHxUQi00MzRIRHxUQi04NjBIRHxUQi04NDBIRHxUQi03NjBIRHxUQi03NTBIRHxUQi03NDBIRHxUQi03MzBIRHxUQi03MjJIRHxUQi03MjBIRHxUQi03MDBIRHxUQi01MDBIRHxUQi00NzBIRHxUQi00MzFIRHxUQi00MzBIRHxUQi01MDZ8VEItNTA0fFRCLTQ0NnxUQi00MzZ8VEItNDE2fFRCLTE0NlNFfFRCLTEyNlNFXCIsXG4gICAgICAgIFwiUGxheXN0YXRpb25UYWJsZXRcIjogXCJQbGF5c3RhdGlvbi4qKFBvcnRhYmxlfFZpdGEpXCIsXG4gICAgICAgIFwiVHJla3N0b3JUYWJsZXRcIjogXCJTVDEwNDE2LTF8VlQxMDQxNi0xfFNUNzA0MDgtMXxTVDcwMnh4LTF8U1Q3MDJ4eC0yfFNUODAyMDh8U1Q5NzIxNnxTVDcwMTA0LTJ8VlQxMDQxNi0yfFNUMTAyMTYtMkF8U3VyZlRhYlwiLFxuICAgICAgICBcIlB5bGVBdWRpb1RhYmxldFwiOiBcIlxcXFxiKFBUQkwxMENFVXxQVEJMMTBDfFBUQkw3MkJDfFBUQkw3MkJDRVV8UFRCTDdDRVV8UFRCTDdDfFBUQkw5MkJDfFBUQkw5MkJDRVV8UFRCTDlDRVV8UFRCTDlDVUt8UFRCTDlDKVxcXFxiXCIsXG4gICAgICAgIFwiQWR2YW5UYWJsZXRcIjogXCJBbmRyb2lkLiogXFxcXGIoRTNBfFQzWHxUNUN8VDVCfFQzRXxUM0N8VDNCfFQxSnxUMUZ8VDJBfFQxSHxUMWl8RTFDfFQxLUV8VDUtQXxUNHxFMS1CfFQyQ2l8VDEtQnxUMS1EfE8xLUF8RTEtQXxUMS1BfFQzQXxUNGkpXFxcXGIgXCIsXG4gICAgICAgIFwiRGFueVRlY2hUYWJsZXRcIjogXCJHZW5pdXMgVGFiIEczfEdlbml1cyBUYWIgUzJ8R2VuaXVzIFRhYiBRM3xHZW5pdXMgVGFiIEc0fEdlbml1cyBUYWIgUTR8R2VuaXVzIFRhYiBHLUlJfEdlbml1cyBUQUIgR0lJfEdlbml1cyBUQUIgR0lJSXxHZW5pdXMgVGFiIFMxXCIsXG4gICAgICAgIFwiR2FsYXBhZFRhYmxldFwiOiBcIkFuZHJvaWQuKlxcXFxiRzFcXFxcYlwiLFxuICAgICAgICBcIk1pY3JvbWF4VGFibGV0XCI6IFwiRnVuYm9va3xNaWNyb21heC4qXFxcXGIoUDI1MHxQNTYwfFAzNjB8UDM2MnxQNjAwfFAzMDB8UDM1MHxQNTAwfFAyNzUpXFxcXGJcIixcbiAgICAgICAgXCJLYXJib25uVGFibGV0XCI6IFwiQW5kcm9pZC4qXFxcXGIoQTM5fEEzN3xBMzR8U1Q4fFNUMTB8U1Q3fFNtYXJ0IFRhYjN8U21hcnQgVGFiMilcXFxcYlwiLFxuICAgICAgICBcIkFsbEZpbmVUYWJsZXRcIjogXCJGaW5lNyBHZW5pdXN8RmluZTcgU2hpbmV8RmluZTcgQWlyfEZpbmU4IFN0eWxlfEZpbmU5IE1vcmV8RmluZTEwIEpveXxGaW5lMTEgV2lkZVwiLFxuICAgICAgICBcIlBST1NDQU5UYWJsZXRcIjogXCJcXFxcYihQRU02M3xQTFQxMDIzR3xQTFQxMDQxfFBMVDEwNDR8UExUMTA0NEd8UExUMTA5MXxQTFQ0MzExfFBMVDQzMTFQTHxQTFQ0MzE1fFBMVDcwMzB8UExUNzAzM3xQTFQ3MDMzRHxQTFQ3MDM1fFBMVDcwMzVEfFBMVDcwNDRLfFBMVDcwNDVLfFBMVDcwNDVLQnxQTFQ3MDcxS0d8UExUNzA3MnxQTFQ3MjIzR3xQTFQ3MjI1R3xQTFQ3Nzc3R3xQTFQ3ODEwS3xQTFQ3ODQ5R3xQTFQ3ODUxR3xQTFQ3ODUyR3xQTFQ4MDE1fFBMVDgwMzF8UExUODAzNHxQTFQ4MDM2fFBMVDgwODBLfFBMVDgwODJ8UExUODA4OHxQTFQ4MjIzR3xQTFQ4MjM0R3xQTFQ4MjM1R3xQTFQ4ODE2S3xQTFQ5MDExfFBMVDkwNDVLfFBMVDkyMzNHfFBMVDk3MzV8UExUOTc2MEd8UExUOTc3MEcpXFxcXGJcIixcbiAgICAgICAgXCJZT05FU1RhYmxldFwiOiBcIkJRMTA3OHxCQzEwMDN8QkMxMDc3fFJLOTcwMnxCQzk3MzB8QkM5MDAxfElUOTAwMXxCQzcwMDh8QkM3MDEwfEJDNzA4fEJDNzI4fEJDNzAxMnxCQzcwMzB8QkM3MDI3fEJDNzAyNlwiLFxuICAgICAgICBcIkNoYW5nSmlhVGFibGV0XCI6IFwiVFBDNzEwMnxUUEM3MTAzfFRQQzcxMDV8VFBDNzEwNnxUUEM3MTA3fFRQQzcyMDF8VFBDNzIwM3xUUEM3MjA1fFRQQzcyMTB8VFBDNzcwOHxUUEM3NzA5fFRQQzc3MTJ8VFBDNzExMHxUUEM4MTAxfFRQQzgxMDN8VFBDODEwNXxUUEM4MTA2fFRQQzgyMDN8VFBDODIwNXxUUEM4NTAzfFRQQzkxMDZ8VFBDOTcwMXxUUEM5NzEwMXxUUEM5NzEwM3xUUEM5NzEwNXxUUEM5NzEwNnxUUEM5NzExMXxUUEM5NzExM3xUUEM5NzIwM3xUUEM5NzYwM3xUUEM5NzgwOXxUUEM5NzIwNXxUUEMxMDEwMXxUUEMxMDEwM3xUUEMxMDEwNnxUUEMxMDExMXxUUEMxMDIwM3xUUEMxMDIwNXxUUEMxMDUwM1wiLFxuICAgICAgICBcIkdVVGFibGV0XCI6IFwiVFgtQTEzMDF8VFgtTTkwMDJ8UTcwMnxrZjAyNlwiLFxuICAgICAgICBcIlBvaW50T2ZWaWV3VGFibGV0XCI6IFwiVEFCLVA1MDZ8VEFCLW5hdmktNy0zRy1NfFRBQi1QNTE3fFRBQi1QLTUyN3xUQUItUDcwMXxUQUItUDcwM3xUQUItUDcyMXxUQUItUDczMU58VEFCLVA3NDF8VEFCLVA4MjV8VEFCLVA5MDV8VEFCLVA5MjV8VEFCLVBSOTQ1fFRBQi1QTDEwMTV8VEFCLVAxMDI1fFRBQi1QSTEwNDV8VEFCLVAxMzI1fFRBQi1QUk9UQUJbMC05XSt8VEFCLVBST1RBQjI1fFRBQi1QUk9UQUIyNnxUQUItUFJPVEFCMjd8VEFCLVBST1RBQjI2WEx8VEFCLVBST1RBQjItSVBTOXxUQUItUFJPVEFCMzAtSVBTOXxUQUItUFJPVEFCMjVYWEx8VEFCLVBST1RBQjI2LUlQUzEwfFRBQi1QUk9UQUIzMC1JUFMxMFwiLFxuICAgICAgICBcIk92ZXJtYXhUYWJsZXRcIjogXCJPVi0oU3RlZWxDb3JlfE5ld0Jhc2V8QmFzZWNvcmV8QmFzZW9uZXxFeGVsbGVufFF1YXR0b3J8RWR1VGFifFNvbHV0aW9ufEFDVElPTnxCYXNpY1RhYnxUZWRkeVRhYnxNYWdpY1RhYnxTdHJlYW18VEItMDh8VEItMDkpXCIsXG4gICAgICAgIFwiSENMVGFibGV0XCI6IFwiSENMLipUYWJsZXR8Q29ubmVjdC0zRy0yLjB8Q29ubmVjdC0yRy0yLjB8TUUgVGFibGV0IFUxfE1FIFRhYmxldCBVMnxNRSBUYWJsZXQgRzF8TUUgVGFibGV0IFgxfE1FIFRhYmxldCBZMnxNRSBUYWJsZXQgU3luY1wiLFxuICAgICAgICBcIkRQU1RhYmxldFwiOiBcIkRQUyBEcmVhbSA5fERQUyBEdWFsIDdcIixcbiAgICAgICAgXCJWaXN0dXJlVGFibGV0XCI6IFwiVjk3IEhEfGk3NSAzR3xWaXN0dXJlIFY0KCBIRCk/fFZpc3R1cmUgVjUoIEhEKT98VmlzdHVyZSBWMTBcIixcbiAgICAgICAgXCJDcmVzdGFUYWJsZXRcIjogXCJDVFAoLSk/ODEwfENUUCgtKT84MTh8Q1RQKC0pPzgyOHxDVFAoLSk/ODM4fENUUCgtKT84ODh8Q1RQKC0pPzk3OHxDVFAoLSk/OTgwfENUUCgtKT85ODd8Q1RQKC0pPzk4OHxDVFAoLSk/OTg5XCIsXG4gICAgICAgIFwiTWVkaWF0ZWtUYWJsZXRcIjogXCJcXFxcYk1UODEyNXxNVDgzODl8TVQ4MTM1fE1UODM3N1xcXFxiXCIsXG4gICAgICAgIFwiQ29uY29yZGVUYWJsZXRcIjogXCJDb25jb3JkZShbIF0rKT9UYWJ8Q29uQ29yZGUgUmVhZE1hblwiLFxuICAgICAgICBcIkdvQ2xldmVyVGFibGV0XCI6IFwiR09DTEVWRVIgVEFCfEE3R09DTEVWRVJ8TTEwNDJ8TTc4NDF8TTc0MnxSMTA0MkJLfFIxMDQxfFRBQiBBOTc1fFRBQiBBNzg0MnxUQUIgQTc0MXxUQUIgQTc0MUx8VEFCIE03MjNHfFRBQiBNNzIxfFRBQiBBMTAyMXxUQUIgSTkyMXxUQUIgUjcyMXxUQUIgSTcyMHxUQUIgVDc2fFRBQiBSNzB8VEFCIFI3Ni4yfFRBQiBSMTA2fFRBQiBSODMuMnxUQUIgTTgxM0d8VEFCIEk3MjF8R0NUQTcyMnxUQUIgSTcwfFRBQiBJNzF8VEFCIFM3M3xUQUIgUjczfFRBQiBSNzR8VEFCIFI5M3xUQUIgUjc1fFRBQiBSNzYuMXxUQUIgQTczfFRBQiBBOTN8VEFCIEE5My4yfFRBQiBUNzJ8VEFCIFI4M3xUQUIgUjk3NHxUQUIgUjk3M3xUQUIgQTEwMXxUQUIgQTEwM3xUQUIgQTEwNHxUQUIgQTEwNC4yfFIxMDVCS3xNNzEzR3xBOTcyQkt8VEFCIEE5NzF8VEFCIFI5NzQuMnxUQUIgUjEwNHxUQUIgUjgzLjN8VEFCIEExMDQyXCIsXG4gICAgICAgIFwiTW9kZWNvbVRhYmxldFwiOiBcIkZyZWVUQUIgOTAwMHxGcmVlVEFCIDcuNHxGcmVlVEFCIDcwMDR8RnJlZVRBQiA3ODAwfEZyZWVUQUIgMjA5NnxGcmVlVEFCIDcuNXxGcmVlVEFCIDEwMTR8RnJlZVRBQiAxMDAxIHxGcmVlVEFCIDgwMDF8RnJlZVRBQiA5NzA2fEZyZWVUQUIgOTcwMnxGcmVlVEFCIDcwMDN8RnJlZVRBQiA3MDAyfEZyZWVUQUIgMTAwMnxGcmVlVEFCIDc4MDF8RnJlZVRBQiAxMzMxfEZyZWVUQUIgMTAwNHxGcmVlVEFCIDgwMDJ8RnJlZVRBQiA4MDE0fEZyZWVUQUIgOTcwNHxGcmVlVEFCIDEwMDNcIixcbiAgICAgICAgXCJWb25pbm9UYWJsZXRcIjogXCJcXFxcYihBcmd1c1sgX10/U3xEaWFtb25kWyBfXT83OUhEfEVtZXJhbGRbIF9dPzc4RXxMdW5hWyBfXT83MEN8T255eFsgX10/U3xPbnl4WyBfXT9afE9yaW5bIF9dP0hEfE9yaW5bIF9dP1N8T3Rpc1sgX10/U3xTcGVlZFN0YXJbIF9dP1N8TWFnbmV0WyBfXT9NOXxQcmltdXNbIF9dPzk0WyBfXT8zR3xQcmltdXNbIF9dPzk0SER8UHJpbXVzWyBfXT9RU3xBbmRyb2lkLipcXFxcYlE4XFxcXGJ8U2lyaXVzWyBfXT9FVk9bIF9dP1FTfFNpcml1c1sgX10/UVN8U3Bpcml0WyBfXT9TKVxcXFxiXCIsXG4gICAgICAgIFwiRUNTVGFibGV0XCI6IFwiVjA3T1QyfFRNMTA1QXxTMTBPVDF8VFIxMENTMVwiLFxuICAgICAgICBcIlN0b3JleFRhYmxldFwiOiBcImVaZWVbXyddPyhUYWJ8R28pWzAtOV0rfFRhYkxDN3xMb29uZXkgVHVuZXMgVGFiXCIsXG4gICAgICAgIFwiVm9kYWZvbmVUYWJsZXRcIjogXCJTbWFydFRhYihbIF0rKT9bMC05XSt8U21hcnRUYWJJSTEwfFNtYXJ0VGFiSUk3fFZGLTE0OTdcIixcbiAgICAgICAgXCJFc3NlbnRpZWxCVGFibGV0XCI6IFwiU21hcnRbICddP1RBQlsgXSs/WzAtOV0rfEZhbWlseVsgJ10/VEFCMlwiLFxuICAgICAgICBcIlJvc3NNb29yVGFibGV0XCI6IFwiUk0tNzkwfFJNLTk5N3xSTUQtODc4R3xSTUQtOTc0UnxSTVQtNzA1QXxSTVQtNzAxfFJNRS02MDF8Uk1ULTUwMXxSTVQtNzExXCIsXG4gICAgICAgIFwiaU1vYmlsZVRhYmxldFwiOiBcImktbW9iaWxlIGktbm90ZVwiLFxuICAgICAgICBcIlRvbGlub1RhYmxldFwiOiBcInRvbGlubyB0YWIgWzAtOS5dK3x0b2xpbm8gc2hpbmVcIixcbiAgICAgICAgXCJBdWRpb1NvbmljVGFibGV0XCI6IFwiXFxcXGJDLTIyUXxUNy1RQ3xULTE3QnxULTE3UFxcXFxiXCIsXG4gICAgICAgIFwiQU1QRVRhYmxldFwiOiBcIkFuZHJvaWQuKiBBNzggXCIsXG4gICAgICAgIFwiU2trVGFibGV0XCI6IFwiQW5kcm9pZC4qIChTS1lQQUR8UEhPRU5JWHxDWUNMT1BTKVwiLFxuICAgICAgICBcIlRlY25vVGFibGV0XCI6IFwiVEVDTk8gUDlcIixcbiAgICAgICAgXCJKWERUYWJsZXRcIjogXCJBbmRyb2lkLiogXFxcXGIoRjMwMDB8QTMzMDB8SlhENTAwMHxKWEQzMDAwfEpYRDIwMDB8SlhEMzAwQnxKWEQzMDB8UzU4MDB8Uzc4MDB8UzYwMmJ8UzUxMTBifFM3MzAwfFM1MzAwfFM2MDJ8UzYwM3xTNTEwMHxTNTExMHxTNjAxfFM3MTAwYXxQMzAwMEZ8UDMwMDBzfFAxMDF8UDIwMHN8UDEwMDBtfFAyMDBtfFA5MTAwfFAxMDAwc3xTNjYwMGJ8UzkwOHxQMTAwMHxQMzAwfFMxOHxTNjYwMHxTOTEwMClcXFxcYlwiLFxuICAgICAgICBcImlKb3lUYWJsZXRcIjogXCJUYWJsZXQgKFNwaXJpdCA3fEVzc2VudGlhfEdhbGF0ZWF8RnVzaW9ufE9uaXggN3xMYW5kYXxUaXRhbnxTY29vYnl8RGVveHxTdGVsbGF8VGhlbWlzfEFyZ29ufFVuaXF1ZSA3fFN5Z251c3xIZXhlbnxGaW5pdHkgN3xDcmVhbXxDcmVhbSBYMnxKYWRlfE5lb24gN3xOZXJvbiA3fEthbmR5fFNjYXBlfFNhcGh5ciA3fFJlYmVsfEJpb3h8UmViZWx8UmViZWwgOEdCfE15c3R8RHJhY28gN3xNeXN0fFRhYjctMDA0fE15c3R8VGFkZW8gSm9uZXN8VGFibGV0IEJvaW5nfEFycm93fERyYWNvIER1YWwgQ2FtfEF1cml4fE1pbnR8QW1pdHl8UmV2b2x1dGlvbnxGaW5pdHkgOXxOZW9uIDl8VDl3fEFtaXR5IDRHQiBEdWFsIENhbXxTdG9uZSA0R0J8U3RvbmUgOEdCfEFuZHJvbWVkYXxTaWxrZW58WDJ8QW5kcm9tZWRhIElJfEhhbGxleXxGbGFtZXxTYXBoeXIgOSw3fFRvdWNoIDh8UGxhbmV0fFRyaXRvbnxVbmlxdWUgMTB8SGV4ZW4gMTB8TWVtcGhpcyA0R0J8TWVtcGhpcyA4R0J8T25peCAxMClcIixcbiAgICAgICAgXCJGWDJUYWJsZXRcIjogXCJGWDIgUEFEN3xGWDIgUEFEMTBcIixcbiAgICAgICAgXCJYb3JvVGFibGV0XCI6IFwiS2lkc1BBRCA3MDF8UEFEWyBdPzcxMnxQQURbIF0/NzE0fFBBRFsgXT83MTZ8UEFEWyBdPzcxN3xQQURbIF0/NzE4fFBBRFsgXT83MjB8UEFEWyBdPzcyMXxQQURbIF0/NzIyfFBBRFsgXT83OTB8UEFEWyBdPzc5MnxQQURbIF0/OTAwfFBBRFsgXT85NzE1RHxQQURbIF0/OTcxNkRSfFBBRFsgXT85NzE4RFJ8UEFEWyBdPzk3MTlRUnxQQURbIF0/OTcyMFFSfFRlbGVQQUQxMDMwfFRlbGVwYWQxMDMyfFRlbGVQQUQ3MzB8VGVsZVBBRDczMXxUZWxlUEFENzMyfFRlbGVQQUQ3MzVRfFRlbGVQQUQ4MzB8VGVsZVBBRDk3MzB8VGVsZVBBRDc5NXxNZWdhUEFEIDEzMzF8TWVnYVBBRCAxODUxfE1lZ2FQQUQgMjE1MVwiLFxuICAgICAgICBcIlZpZXdzb25pY1RhYmxldFwiOiBcIlZpZXdQYWQgMTBwaXxWaWV3UGFkIDEwZXxWaWV3UGFkIDEwc3xWaWV3UGFkIEU3MnxWaWV3UGFkN3xWaWV3UGFkIEUxMDB8Vmlld1BhZCA3ZXxWaWV3U29uaWMgVkI3MzN8VkIxMDBhXCIsXG4gICAgICAgIFwiT2R5c1RhYmxldFwiOiBcIkxPT1h8WEVOTzEwfE9EWVNbIC1dKFNwYWNlfEVWT3xYcHJlc3N8Tk9PTil8XFxcXGJYRUxJT1xcXFxifFhlbGlvMTBQcm98WEVMSU83UEhPTkVUQUJ8WEVMSU8xMEVYVFJFTUV8WEVMSU9QVDJ8TkVPX1FVQUQxMFwiLFxuICAgICAgICBcIkNhcHRpdmFUYWJsZXRcIjogXCJDQVBUSVZBIFBBRFwiLFxuICAgICAgICBcIkljb25iaXRUYWJsZXRcIjogXCJOZXRUQUJ8TlQtMzcwMnxOVC0zNzAyU3xOVC0zNzAyU3xOVC0zNjAzUHxOVC0zNjAzUHxOVC0wNzA0U3xOVC0wNzA0U3xOVC0zODA1Q3xOVC0zODA1Q3xOVC0wODA2Q3xOVC0wODA2Q3xOVC0wOTA5VHxOVC0wOTA5VHxOVC0wOTA3U3xOVC0wOTA3U3xOVC0wOTAyU3xOVC0wOTAyU1wiLFxuICAgICAgICBcIlRlY2xhc3RUYWJsZXRcIjogXCJUOTggNEd8XFxcXGJQODBcXFxcYnxcXFxcYlg5MEhEXFxcXGJ8WDk4IEFpcnxYOTggQWlyIDNHfFxcXFxiWDg5XFxcXGJ8UDgwIDNHfFxcXFxiWDgwaFxcXFxifFA5OCBBaXJ8XFxcXGJYODlIRFxcXFxifFA5OCAzR3xcXFxcYlA5MEhEXFxcXGJ8UDg5IDNHfFg5OCAzR3xcXFxcYlA3MGhcXFxcYnxQNzlIRCAzR3xHMThkIDNHfFxcXFxiUDc5SERcXFxcYnxcXFxcYlA4OXNcXFxcYnxcXFxcYkE4OFxcXFxifFxcXFxiUDEwSERcXFxcYnxcXFxcYlAxOUhEXFxcXGJ8RzE4IDNHfFxcXFxiUDc4SERcXFxcYnxcXFxcYkE3OFxcXFxifFxcXFxiUDc1XFxcXGJ8RzE3cyAzR3xHMTdoIDNHfFxcXFxiUDg1dFxcXFxifFxcXFxiUDkwXFxcXGJ8XFxcXGJQMTFcXFxcYnxcXFxcYlA5OHRcXFxcYnxcXFxcYlA5OEhEXFxcXGJ8XFxcXGJHMThkXFxcXGJ8XFxcXGJQODVzXFxcXGJ8XFxcXGJQMTFIRFxcXFxifFxcXFxiUDg4c1xcXFxifFxcXFxiQTgwSERcXFxcYnxcXFxcYkE4MHNlXFxcXGJ8XFxcXGJBMTBoXFxcXGJ8XFxcXGJQODlcXFxcYnxcXFxcYlA3OHNcXFxcYnxcXFxcYkcxOFxcXFxifFxcXFxiUDg1XFxcXGJ8XFxcXGJBNzBoXFxcXGJ8XFxcXGJBNzBcXFxcYnxcXFxcYkcxN1xcXFxifFxcXFxiUDE4XFxcXGJ8XFxcXGJBODBzXFxcXGJ8XFxcXGJBMTFzXFxcXGJ8XFxcXGJQODhIRFxcXFxifFxcXFxiQTgwaFxcXFxifFxcXFxiUDc2c1xcXFxifFxcXFxiUDc2aFxcXFxifFxcXFxiUDk4XFxcXGJ8XFxcXGJBMTBIRFxcXFxifFxcXFxiUDc4XFxcXGJ8XFxcXGJQODhcXFxcYnxcXFxcYkExMVxcXFxifFxcXFxiQTEwdFxcXFxifFxcXFxiUDc2YVxcXFxifFxcXFxiUDc2dFxcXFxifFxcXFxiUDc2ZVxcXFxifFxcXFxiUDg1SERcXFxcYnxcXFxcYlA4NWFcXFxcYnxcXFxcYlA4NlxcXFxifFxcXFxiUDc1SERcXFxcYnxcXFxcYlA3NnZcXFxcYnxcXFxcYkExMlxcXFxifFxcXFxiUDc1YVxcXFxifFxcXFxiQTE1XFxcXGJ8XFxcXGJQNzZUaVxcXFxifFxcXFxiUDgxSERcXFxcYnxcXFxcYkExMFxcXFxifFxcXFxiVDc2MFZFXFxcXGJ8XFxcXGJUNzIwSERcXFxcYnxcXFxcYlA3NlxcXFxifFxcXFxiUDczXFxcXGJ8XFxcXGJQNzFcXFxcYnxcXFxcYlA3MlxcXFxifFxcXFxiVDcyMFNFXFxcXGJ8XFxcXGJDNTIwVGlcXFxcYnxcXFxcYlQ3NjBcXFxcYnxcXFxcYlQ3MjBWRVxcXFxifFQ3MjAtM0dFfFQ3MjAtV2lGaVwiLFxuICAgICAgICBcIk9uZGFUYWJsZXRcIjogXCJcXFxcYihWOTc1aXxWaTMwfFZYNTMwfFY3MDF8Vmk2MHxWNzAxc3xWaTUwfFY4MDFzfFY3MTl8Vng2MTB3fFZYNjEwV3xWODE5aXxWaTEwfFZYNTgwV3xWaTEwfFY3MTFzfFY4MTN8VjgxMXxWODIwd3xWODIwfFZpMjB8VjcxMXxWSTMwV3xWNzEyfFY4OTF3fFY5NzJ8VjgxOXd8VjgyMHd8Vmk2MHxWODIwd3xWNzExfFY4MTNzfFY4MDF8VjgxOXxWOTc1c3xWODAxfFY4MTl8VjgxOXxWODE4fFY4MTF8VjcxMnxWOTc1bXxWMTAxd3xWOTYxd3xWODEyfFY4MTh8Vjk3MXxWOTcxc3xWOTE5fFY5ODl8VjExNnd8VjEwMnd8Vjk3M3xWaTQwKVxcXFxiW1xcXFxzXStcIixcbiAgICAgICAgXCJKYXl0ZWNoVGFibGV0XCI6IFwiVFBDLVBBNzYyXCIsXG4gICAgICAgIFwiQmxhdXB1bmt0VGFibGV0XCI6IFwiRW5kZWF2b3VyIDgwME5HfEVuZGVhdm91ciAxMDEwXCIsXG4gICAgICAgIFwiRGlnbWFUYWJsZXRcIjogXCJcXFxcYihpRHgxMHxpRHg5fGlEeDh8aUR4N3xpRHhEN3xpRHhEOHxpRHNROHxpRHNRN3xpRHNROHxpRHNEMTB8aURuRDd8M1RTODA0SHxpRHNRMTF8aURqN3xpRHMxMClcXFxcYlwiLFxuICAgICAgICBcIkV2b2xpb1RhYmxldFwiOiBcIkFSSUFfTWluaV93aWZpfEFyaWFbIF9dTWluaXxFdm9saW8gWDEwfEV2b2xpbyBYN3xFdm9saW8gWDh8XFxcXGJFdm90YWJcXFxcYnxcXFxcYk5ldXJhXFxcXGJcIixcbiAgICAgICAgXCJMYXZhVGFibGV0XCI6IFwiUVBBRCBFNzA0fFxcXFxiSXZvcnlTXFxcXGJ8RS1UQUIgSVZPUll8XFxcXGJFLVRBQlxcXFxiXCIsXG4gICAgICAgIFwiQW9jVGFibGV0XCI6IFwiTVcwODExfE1XMDgxMnxNVzA5MjJ8TVRLODM4MnxNVzEwMzF8TVcwODMxfE1XMDgyMXxNVzA5MzF8TVcwNzEyXCIsXG4gICAgICAgIFwiTXBtYW5UYWJsZXRcIjogXCJNUDExIE9DVEF8TVAxMCBPQ1RBfE1QUUMxMTE0fE1QUUMxMDA0fE1QUUM5OTR8TVBRQzk3NHxNUFFDOTczfE1QUUM4MDR8TVBRQzc4NHxNUFFDNzgwfFxcXFxiTVBHN1xcXFxifE1QRENHNzV8TVBEQ0c3MXxNUERDMTAwNnxNUDEwMURDfE1QREM5MDAwfE1QREM5MDV8TVBEQzcwNkhEfE1QREM3MDZ8TVBEQzcwNXxNUERDMTEwfE1QREMxMDB8TVBEQzk5fE1QREM5N3xNUERDODh8TVBEQzh8TVBEQzc3fE1QNzA5fE1JRDcwMXxNSUQ3MTF8TUlEMTcwfE1QREM3MDN8TVBRQzEwMTBcIixcbiAgICAgICAgXCJDZWxrb25UYWJsZXRcIjogXCJDVDY5NXxDVDg4OHxDVFtcXFxcc10/OTEwfENUNyBUYWJ8Q1Q5IFRhYnxDVDMgVGFifENUMiBUYWJ8Q1QxIFRhYnxDODIwfEM3MjB8XFxcXGJDVC0xXFxcXGJcIixcbiAgICAgICAgXCJXb2xkZXJUYWJsZXRcIjogXCJtaVRhYiBcXFxcYihESUFNT05EfFNQQUNFfEJST09LTFlOfE5FT3xGTFl8TUFOSEFUVEFOfEZVTkt8RVZPTFVUSU9OfFNLWXxHT0NBUnxJUk9OfEdFTklVU3xQT1B8TUlOVHxFUFNJTE9OfEJST0FEV0FZfEpVTVB8SE9QfExFR0VORHxORVcgQUdFfExJTkV8QURWQU5DRXxGRUVMfEZPTExPV3xMSUtFfExJTkt8TElWRXxUSElOS3xGUkVFRE9NfENISUNBR098Q0xFVkVMQU5EfEJBTFRJTU9SRS1HSHxJT1dBfEJPU1RPTnxTRUFUVExFfFBIT0VOSVh8REFMTEFTfElOIDEwMXxNYXN0ZXJDaGVmKVxcXFxiXCIsXG4gICAgICAgIFwiTWlUYWJsZXRcIjogXCJcXFxcYk1JIFBBRFxcXFxifFxcXFxiSE0gTk9URSAxV1xcXFxiXCIsXG4gICAgICAgIFwiTmliaXJ1VGFibGV0XCI6IFwiTmliaXJ1IE0xfE5pYmlydSBKdXBpdGVyIE9uZVwiLFxuICAgICAgICBcIk5leG9UYWJsZXRcIjogXCJORVhPIE5PVkF8TkVYTyAxMHxORVhPIEFWSU98TkVYTyBGUkVFfE5FWE8gR098TkVYTyBFVk98TkVYTyAzR3xORVhPIFNNQVJUfE5FWE8gS0lERE98TkVYTyBNT0JJXCIsXG4gICAgICAgIFwiTGVhZGVyVGFibGV0XCI6IFwiVEJMVDEwUXxUQkxUMTBJfFRCTC0xMFdES0J8VEJMLTEwV0RLQk8yMDEzfFRCTC1XMjMwVjJ8VEJMLVc0NTB8VEJMLVc1MDB8U1Y1NzJ8VEJMVDdJfFRCQS1BQzctOEd8VEJMVDc5fFRCTC04VzE2fFRCTC0xMFczMnxUQkwtMTBXS0J8VEJMLVcxMDBcIixcbiAgICAgICAgXCJVYmlzbGF0ZVRhYmxldFwiOiBcIlViaVNsYXRlW1xcXFxzXT83Q1wiLFxuICAgICAgICBcIlBvY2tldEJvb2tUYWJsZXRcIjogXCJQb2NrZXRib29rXCIsXG4gICAgICAgIFwiS29jYXNvVGFibGV0XCI6IFwiXFxcXGIoVEItMTIwNylcXFxcYlwiLFxuICAgICAgICBcIkhpc2Vuc2VUYWJsZXRcIjogXCJcXFxcYihGNTI4MXxFMjM3MSlcXFxcYlwiLFxuICAgICAgICBcIkh1ZGxcIjogXCJIdWRsIEhUN1MzfEh1ZGwgMlwiLFxuICAgICAgICBcIlRlbHN0cmFUYWJsZXRcIjogXCJULUh1YjJcIixcbiAgICAgICAgXCJHZW5lcmljVGFibGV0XCI6IFwiQW5kcm9pZC4qXFxcXGI5N0RcXFxcYnxUYWJsZXQoPyEuKlBDKXxCTlRWMjUwQXxNSUQtV0NETUF8TG9naWNQRCBab29tMnxcXFxcYkE3RUJcXFxcYnxDYXROb3ZhOHxBMV8wN3xDVDcwNHxDVDEwMDJ8XFxcXGJNNzIxXFxcXGJ8cmszMHNka3xcXFxcYkVWT1RBQlxcXFxifE03NThBfEVUOTA0fEFMVU1JVU0xMHxTbWFydGZyZW4gVGFifEVuZGVhdm91ciAxMDEwfFRhYmxldC1QQy00fFRhZ2kgVGFifFxcXFxiTTZwcm9cXFxcYnxDVDEwMjBXfGFyYyAxMEhEfFxcXFxiVFA3NTBcXFxcYlwiXG4gICAgfSxcbiAgICBcIm9zc1wiOiB7XG4gICAgICAgIFwiQW5kcm9pZE9TXCI6IFwiQW5kcm9pZFwiLFxuICAgICAgICBcIkJsYWNrQmVycnlPU1wiOiBcImJsYWNrYmVycnl8XFxcXGJCQjEwXFxcXGJ8cmltIHRhYmxldCBvc1wiLFxuICAgICAgICBcIlBhbG1PU1wiOiBcIlBhbG1PU3xhdmFudGdvfGJsYXplcnxlbGFpbmV8aGlwdG9wfHBhbG18cGx1Y2tlcnx4aWlub1wiLFxuICAgICAgICBcIlN5bWJpYW5PU1wiOiBcIlN5bWJpYW58U3ltYk9TfFNlcmllczYwfFNlcmllczQwfFNZQi1bMC05XSt8XFxcXGJTNjBcXFxcYlwiLFxuICAgICAgICBcIldpbmRvd3NNb2JpbGVPU1wiOiBcIldpbmRvd3MgQ0UuKihQUEN8U21hcnRwaG9uZXxNb2JpbGV8WzAtOV17M314WzAtOV17M30pfFdpbmRvdyBNb2JpbGV8V2luZG93cyBQaG9uZSBbMC05Ll0rfFdDRTtcIixcbiAgICAgICAgXCJXaW5kb3dzUGhvbmVPU1wiOiBcIldpbmRvd3MgUGhvbmUgMTAuMHxXaW5kb3dzIFBob25lIDguMXxXaW5kb3dzIFBob25lIDguMHxXaW5kb3dzIFBob25lIE9TfFhCTFdQN3xadW5lV1A3fFdpbmRvd3MgTlQgNi5bMjNdOyBBUk07XCIsXG4gICAgICAgIFwiaU9TXCI6IFwiXFxcXGJpUGhvbmUuKk1vYmlsZXxcXFxcYmlQb2R8XFxcXGJpUGFkXCIsXG4gICAgICAgIFwiTWVlR29PU1wiOiBcIk1lZUdvXCIsXG4gICAgICAgIFwiTWFlbW9PU1wiOiBcIk1hZW1vXCIsXG4gICAgICAgIFwiSmF2YU9TXCI6IFwiSjJNRVxcL3xcXFxcYk1JRFBcXFxcYnxcXFxcYkNMRENcXFxcYlwiLFxuICAgICAgICBcIndlYk9TXCI6IFwid2ViT1N8aHB3T1NcIixcbiAgICAgICAgXCJiYWRhT1NcIjogXCJcXFxcYkJhZGFcXFxcYlwiLFxuICAgICAgICBcIkJSRVdPU1wiOiBcIkJSRVdcIlxuICAgIH0sXG4gICAgXCJ1YXNcIjoge1xuICAgICAgICBcIkNocm9tZVwiOiBcIlxcXFxiQ3JNb1xcXFxifENyaU9TfEFuZHJvaWQuKkNocm9tZVxcL1suMC05XSogKE1vYmlsZSk/XCIsXG4gICAgICAgIFwiRG9sZmluXCI6IFwiXFxcXGJEb2xmaW5cXFxcYlwiLFxuICAgICAgICBcIk9wZXJhXCI6IFwiT3BlcmEuKk1pbml8T3BlcmEuKk1vYml8QW5kcm9pZC4qT3BlcmF8TW9iaWxlLipPUFJcXC9bMC05Ll0rfENvYXN0XFwvWzAtOS5dK1wiLFxuICAgICAgICBcIlNreWZpcmVcIjogXCJTa3lmaXJlXCIsXG4gICAgICAgIFwiRWRnZVwiOiBcIk1vYmlsZSBTYWZhcmlcXC9bLjAtOV0qIEVkZ2VcIixcbiAgICAgICAgXCJJRVwiOiBcIklFTW9iaWxlfE1TSUVNb2JpbGVcIixcbiAgICAgICAgXCJGaXJlZm94XCI6IFwiZmVubmVjfGZpcmVmb3guKm1hZW1vfChNb2JpbGV8VGFibGV0KS4qRmlyZWZveHxGaXJlZm94LipNb2JpbGV8RnhpT1NcIixcbiAgICAgICAgXCJCb2x0XCI6IFwiYm9sdFwiLFxuICAgICAgICBcIlRlYVNoYXJrXCI6IFwidGVhc2hhcmtcIixcbiAgICAgICAgXCJCbGF6ZXJcIjogXCJCbGF6ZXJcIixcbiAgICAgICAgXCJTYWZhcmlcIjogXCJWZXJzaW9uLipNb2JpbGUuKlNhZmFyaXxTYWZhcmkuKk1vYmlsZXxNb2JpbGVTYWZhcmlcIixcbiAgICAgICAgXCJVQ0Jyb3dzZXJcIjogXCJVQy4qQnJvd3NlcnxVQ1dFQlwiLFxuICAgICAgICBcImJhaWR1Ym94YXBwXCI6IFwiYmFpZHVib3hhcHBcIixcbiAgICAgICAgXCJiYWlkdWJyb3dzZXJcIjogXCJiYWlkdWJyb3dzZXJcIixcbiAgICAgICAgXCJEaWlnb0Jyb3dzZXJcIjogXCJEaWlnb0Jyb3dzZXJcIixcbiAgICAgICAgXCJQdWZmaW5cIjogXCJQdWZmaW5cIixcbiAgICAgICAgXCJNZXJjdXJ5XCI6IFwiXFxcXGJNZXJjdXJ5XFxcXGJcIixcbiAgICAgICAgXCJPYmlnb0Jyb3dzZXJcIjogXCJPYmlnb1wiLFxuICAgICAgICBcIk5ldEZyb250XCI6IFwiTkYtQnJvd3NlclwiLFxuICAgICAgICBcIkdlbmVyaWNCcm93c2VyXCI6IFwiTm9raWFCcm93c2VyfE92aUJyb3dzZXJ8T25lQnJvd3NlcnxUd29ua3lCZWFtQnJvd3NlcnxTRU1DLipCcm93c2VyfEZseUZsb3d8TWluaW1vfE5ldEZyb250fE5vdmFycmEtVmlzaW9ufE1RUUJyb3dzZXJ8TWljcm9NZXNzZW5nZXJcIixcbiAgICAgICAgXCJQYWxlTW9vblwiOiBcIkFuZHJvaWQuKlBhbGVNb29ufE1vYmlsZS4qUGFsZU1vb25cIlxuICAgIH0sXG4gICAgXCJwcm9wc1wiOiB7XG4gICAgICAgIFwiTW9iaWxlXCI6IFwiTW9iaWxlXFwvW1ZFUl1cIixcbiAgICAgICAgXCJCdWlsZFwiOiBcIkJ1aWxkXFwvW1ZFUl1cIixcbiAgICAgICAgXCJWZXJzaW9uXCI6IFwiVmVyc2lvblxcL1tWRVJdXCIsXG4gICAgICAgIFwiVmVuZG9ySURcIjogXCJWZW5kb3JJRFxcL1tWRVJdXCIsXG4gICAgICAgIFwiaVBhZFwiOiBcImlQYWQuKkNQVVthLXogXStbVkVSXVwiLFxuICAgICAgICBcImlQaG9uZVwiOiBcImlQaG9uZS4qQ1BVW2EteiBdK1tWRVJdXCIsXG4gICAgICAgIFwiaVBvZFwiOiBcImlQb2QuKkNQVVthLXogXStbVkVSXVwiLFxuICAgICAgICBcIktpbmRsZVwiOiBcIktpbmRsZVxcL1tWRVJdXCIsXG4gICAgICAgIFwiQ2hyb21lXCI6IFtcbiAgICAgICAgICAgIFwiQ2hyb21lXFwvW1ZFUl1cIixcbiAgICAgICAgICAgIFwiQ3JpT1NcXC9bVkVSXVwiLFxuICAgICAgICAgICAgXCJDck1vXFwvW1ZFUl1cIlxuICAgICAgICBdLFxuICAgICAgICBcIkNvYXN0XCI6IFtcbiAgICAgICAgICAgIFwiQ29hc3RcXC9bVkVSXVwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiRG9sZmluXCI6IFwiRG9sZmluXFwvW1ZFUl1cIixcbiAgICAgICAgXCJGaXJlZm94XCI6IFtcbiAgICAgICAgICAgIFwiRmlyZWZveFxcL1tWRVJdXCIsXG4gICAgICAgICAgICBcIkZ4aU9TXFwvW1ZFUl1cIlxuICAgICAgICBdLFxuICAgICAgICBcIkZlbm5lY1wiOiBcIkZlbm5lY1xcL1tWRVJdXCIsXG4gICAgICAgIFwiRWRnZVwiOiBcIkVkZ2VcXC9bVkVSXVwiLFxuICAgICAgICBcIklFXCI6IFtcbiAgICAgICAgICAgIFwiSUVNb2JpbGVcXC9bVkVSXTtcIixcbiAgICAgICAgICAgIFwiSUVNb2JpbGUgW1ZFUl1cIixcbiAgICAgICAgICAgIFwiTVNJRSBbVkVSXTtcIixcbiAgICAgICAgICAgIFwiVHJpZGVudFxcL1swLTkuXSs7LipydjpbVkVSXVwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiTmV0RnJvbnRcIjogXCJOZXRGcm9udFxcL1tWRVJdXCIsXG4gICAgICAgIFwiTm9raWFCcm93c2VyXCI6IFwiTm9raWFCcm93c2VyXFwvW1ZFUl1cIixcbiAgICAgICAgXCJPcGVyYVwiOiBbXG4gICAgICAgICAgICBcIiBPUFJcXC9bVkVSXVwiLFxuICAgICAgICAgICAgXCJPcGVyYSBNaW5pXFwvW1ZFUl1cIixcbiAgICAgICAgICAgIFwiVmVyc2lvblxcL1tWRVJdXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJPcGVyYSBNaW5pXCI6IFwiT3BlcmEgTWluaVxcL1tWRVJdXCIsXG4gICAgICAgIFwiT3BlcmEgTW9iaVwiOiBcIlZlcnNpb25cXC9bVkVSXVwiLFxuICAgICAgICBcIlVDIEJyb3dzZXJcIjogXCJVQyBCcm93c2VyW1ZFUl1cIixcbiAgICAgICAgXCJNUVFCcm93c2VyXCI6IFwiTVFRQnJvd3NlclxcL1tWRVJdXCIsXG4gICAgICAgIFwiTWljcm9NZXNzZW5nZXJcIjogXCJNaWNyb01lc3NlbmdlclxcL1tWRVJdXCIsXG4gICAgICAgIFwiYmFpZHVib3hhcHBcIjogXCJiYWlkdWJveGFwcFxcL1tWRVJdXCIsXG4gICAgICAgIFwiYmFpZHVicm93c2VyXCI6IFwiYmFpZHVicm93c2VyXFwvW1ZFUl1cIixcbiAgICAgICAgXCJTYW1zdW5nQnJvd3NlclwiOiBcIlNhbXN1bmdCcm93c2VyXFwvW1ZFUl1cIixcbiAgICAgICAgXCJJcm9uXCI6IFwiSXJvblxcL1tWRVJdXCIsXG4gICAgICAgIFwiU2FmYXJpXCI6IFtcbiAgICAgICAgICAgIFwiVmVyc2lvblxcL1tWRVJdXCIsXG4gICAgICAgICAgICBcIlNhZmFyaVxcL1tWRVJdXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJTa3lmaXJlXCI6IFwiU2t5ZmlyZVxcL1tWRVJdXCIsXG4gICAgICAgIFwiVGl6ZW5cIjogXCJUaXplblxcL1tWRVJdXCIsXG4gICAgICAgIFwiV2Via2l0XCI6IFwid2Via2l0WyBcXC9dW1ZFUl1cIixcbiAgICAgICAgXCJQYWxlTW9vblwiOiBcIlBhbGVNb29uXFwvW1ZFUl1cIixcbiAgICAgICAgXCJHZWNrb1wiOiBcIkdlY2tvXFwvW1ZFUl1cIixcbiAgICAgICAgXCJUcmlkZW50XCI6IFwiVHJpZGVudFxcL1tWRVJdXCIsXG4gICAgICAgIFwiUHJlc3RvXCI6IFwiUHJlc3RvXFwvW1ZFUl1cIixcbiAgICAgICAgXCJHb2FubmFcIjogXCJHb2FubmFcXC9bVkVSXVwiLFxuICAgICAgICBcImlPU1wiOiBcIiBcXFxcYmk/T1NcXFxcYiBbVkVSXVsgO117MX1cIixcbiAgICAgICAgXCJBbmRyb2lkXCI6IFwiQW5kcm9pZCBbVkVSXVwiLFxuICAgICAgICBcIkJsYWNrQmVycnlcIjogW1xuICAgICAgICAgICAgXCJCbGFja0JlcnJ5W1xcXFx3XStcXC9bVkVSXVwiLFxuICAgICAgICAgICAgXCJCbGFja0JlcnJ5LipWZXJzaW9uXFwvW1ZFUl1cIixcbiAgICAgICAgICAgIFwiVmVyc2lvblxcL1tWRVJdXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJCUkVXXCI6IFwiQlJFVyBbVkVSXVwiLFxuICAgICAgICBcIkphdmFcIjogXCJKYXZhXFwvW1ZFUl1cIixcbiAgICAgICAgXCJXaW5kb3dzIFBob25lIE9TXCI6IFtcbiAgICAgICAgICAgIFwiV2luZG93cyBQaG9uZSBPUyBbVkVSXVwiLFxuICAgICAgICAgICAgXCJXaW5kb3dzIFBob25lIFtWRVJdXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJXaW5kb3dzIFBob25lXCI6IFwiV2luZG93cyBQaG9uZSBbVkVSXVwiLFxuICAgICAgICBcIldpbmRvd3MgQ0VcIjogXCJXaW5kb3dzIENFXFwvW1ZFUl1cIixcbiAgICAgICAgXCJXaW5kb3dzIE5UXCI6IFwiV2luZG93cyBOVCBbVkVSXVwiLFxuICAgICAgICBcIlN5bWJpYW5cIjogW1xuICAgICAgICAgICAgXCJTeW1iaWFuT1NcXC9bVkVSXVwiLFxuICAgICAgICAgICAgXCJTeW1iaWFuXFwvW1ZFUl1cIlxuICAgICAgICBdLFxuICAgICAgICBcIndlYk9TXCI6IFtcbiAgICAgICAgICAgIFwid2ViT1NcXC9bVkVSXVwiLFxuICAgICAgICAgICAgXCJocHdPU1xcL1tWRVJdO1wiXG4gICAgICAgIF1cbiAgICB9LFxuICAgIFwidXRpbHNcIjoge1xuICAgICAgICBcIkJvdFwiOiBcIkdvb2dsZWJvdHxmYWNlYm9va2V4dGVybmFsaGl0fEFkc0JvdC1Hb29nbGV8R29vZ2xlIEtleXdvcmQgU3VnZ2VzdGlvbnxGYWNlYm90fFlhbmRleEJvdHxZYW5kZXhNb2JpbGVCb3R8YmluZ2JvdHxpYV9hcmNoaXZlcnxBaHJlZnNCb3R8RXpvb21zfEdTTEZib3R8V0JTZWFyY2hCb3R8VHdpdHRlcmJvdHxUd2VldG1lbWVCb3R8VHdpa2xlfFBhcGVyTGlCb3R8V290Ym94fFVud2luZEZldGNob3J8RXhhYm90fE1KMTJib3R8WWFuZGV4SW1hZ2VzfFR1cm5pdGluQm90fFBpbmdkb21cIixcbiAgICAgICAgXCJNb2JpbGVCb3RcIjogXCJHb29nbGVib3QtTW9iaWxlfEFkc0JvdC1Hb29nbGUtTW9iaWxlfFlhaG9vU2Vla2VyXFwvTTFBMS1SMkQyXCIsXG4gICAgICAgIFwiRGVza3RvcE1vZGVcIjogXCJXUERlc2t0b3BcIixcbiAgICAgICAgXCJUVlwiOiBcIlNvbnlEVFZ8SGJiVFZcIixcbiAgICAgICAgXCJXZWJLaXRcIjogXCIod2Via2l0KVsgXFwvXShbXFxcXHcuXSspXCIsXG4gICAgICAgIFwiQ29uc29sZVwiOiBcIlxcXFxiKE5pbnRlbmRvfE5pbnRlbmRvIFdpaVV8TmludGVuZG8gM0RTfFBMQVlTVEFUSU9OfFhib3gpXFxcXGJcIixcbiAgICAgICAgXCJXYXRjaFwiOiBcIlNNLVY3MDBcIlxuICAgIH1cbn07XG5cbiAgICAvLyBmb2xsb3dpbmcgcGF0dGVybnMgY29tZSBmcm9tIGh0dHA6Ly9kZXRlY3Rtb2JpbGVicm93c2Vycy5jb20vXG4gICAgaW1wbC5kZXRlY3RNb2JpbGVCcm93c2VycyA9IHtcbiAgICAgICAgZnVsbFBhdHRlcm46IC8oYW5kcm9pZHxiYlxcZCt8bWVlZ28pLittb2JpbGV8YXZhbnRnb3xiYWRhXFwvfGJsYWNrYmVycnl8YmxhemVyfGNvbXBhbHxlbGFpbmV8ZmVubmVjfGhpcHRvcHxpZW1vYmlsZXxpcChob25lfG9kKXxpcmlzfGtpbmRsZXxsZ2UgfG1hZW1vfG1pZHB8bW1wfG1vYmlsZS4rZmlyZWZveHxuZXRmcm9udHxvcGVyYSBtKG9ifGluKWl8cGFsbSggb3MpP3xwaG9uZXxwKGl4aXxyZSlcXC98cGx1Y2tlcnxwb2NrZXR8cHNwfHNlcmllcyg0fDYpMHxzeW1iaWFufHRyZW98dXBcXC4oYnJvd3NlcnxsaW5rKXx2b2RhZm9uZXx3YXB8d2luZG93cyBjZXx4ZGF8eGlpbm8vaSxcbiAgICAgICAgc2hvcnRQYXR0ZXJuOiAvMTIwN3w2MzEwfDY1OTB8M2dzb3w0dGhwfDUwWzEtNl1pfDc3MHN8ODAyc3xhIHdhfGFiYWN8YWMoZXJ8b298c1xcLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXxcXC1tfHIgfHMgKXxhdmFufGJlKGNrfGxsfG5xKXxiaShsYnxyZCl8YmwoYWN8YXopfGJyKGV8dil3fGJ1bWJ8YndcXC0obnx1KXxjNTVcXC98Y2FwaXxjY3dhfGNkbVxcLXxjZWxsfGNodG18Y2xkY3xjbWRcXC18Y28obXB8bmQpfGNyYXd8ZGEoaXR8bGx8bmcpfGRidGV8ZGNcXC1zfGRldml8ZGljYXxkbW9ifGRvKGN8cClvfGRzKDEyfFxcLWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseShcXC18Xyl8ZzEgdXxnNTYwfGdlbmV8Z2ZcXC01fGdcXC1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkXFwtKG18cHx0KXxoZWlcXC18aGkocHR8dGEpfGhwKCBpfGlwKXxoc1xcLWN8aHQoYyhcXC18IHxffGF8Z3xwfHN8dCl8dHApfGh1KGF3fHRjKXxpXFwtKDIwfGdvfG1hKXxpMjMwfGlhYyggfFxcLXxcXC8pfGlicm98aWRlYXxpZzAxfGlrb218aW0xa3xpbm5vfGlwYXF8aXJpc3xqYSh0fHYpYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KCB8XFwvKXxrbG9ufGtwdCB8a3djXFwtfGt5byhjfGspfGxlKG5vfHhpKXxsZyggZ3xcXC8oa3xsfHUpfDUwfDU0fFxcLVthLXddKXxsaWJ3fGx5bnh8bTFcXC13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bVxcLWNyfG1lKHJjfHJpKXxtaShvOHxvYXx0cyl8bW1lZnxtbygwMXwwMnxiaXxkZXxkb3x0KFxcLXwgfG98dil8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKDB8Mil8bjUwKDB8Mnw1KXxuNygwKDB8MSl8MTApfG5lKChjfG0pXFwtfG9ufHRmfHdmfHdnfHd0KXxub2soNnxpKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihhfGR8dCl8cGR4Z3xwZygxM3xcXC0oWzEtOF18YykpfHBoaWx8cGlyZXxwbChheXx1Yyl8cG5cXC0yfHBvKGNrfHJ0fHNlKXxwcm94fHBzaW98cHRcXC1nfHFhXFwtYXxxYygwN3wxMnwyMXwzMnw2MHxcXC1bMi03XXxpXFwtKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aFxcLXxvb3xwXFwtKXxzZGtcXC98c2UoYyhcXC18MHwxKXw0N3xtY3xuZHxyaSl8c2doXFwtfHNoYXJ8c2llKFxcLXxtKXxza1xcLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aFxcLXx2XFwtfHYgKXxzeSgwMXxtYil8dDIoMTh8NTApfHQ2KDAwfDEwfDE4KXx0YShndHxsayl8dGNsXFwtfHRkZ1xcLXx0ZWwoaXxtKXx0aW1cXC18dFxcLW1vfHRvKHBsfHNoKXx0cyg3MHxtXFwtfG0zfG01KXx0eFxcLTl8dXAoXFwuYnxnMXxzaSl8dXRzdHx2NDAwfHY3NTB8dmVyaXx2aShyZ3x0ZSl8dmsoNDB8NVswLTNdfFxcLXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoXFwtfCApfHdlYmN8d2hpdHx3aShnIHxuY3xudyl8d21sYnx3b251fHg3MDB8eWFzXFwtfHlvdXJ8emV0b3x6dGVcXC0vaSxcbiAgICAgICAgdGFibGV0UGF0dGVybjogL2FuZHJvaWR8aXBhZHxwbGF5Ym9va3xzaWxrL2lcbiAgICB9O1xuXG4gICAgdmFyIGhhc093blByb3AgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFxuICAgICAgICBpc0FycmF5O1xuXG4gICAgaW1wbC5GQUxMQkFDS19QSE9ORSA9ICdVbmtub3duUGhvbmUnO1xuICAgIGltcGwuRkFMTEJBQ0tfVEFCTEVUID0gJ1Vua25vd25UYWJsZXQnO1xuICAgIGltcGwuRkFMTEJBQ0tfTU9CSUxFID0gJ1Vua25vd25Nb2JpbGUnO1xuXG4gICAgaXNBcnJheSA9ICgnaXNBcnJheScgaW4gQXJyYXkpID9cbiAgICAgICAgQXJyYXkuaXNBcnJheSA6IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJzsgfTtcblxuICAgIGZ1bmN0aW9uIGVxdWFsSUMoYSwgYikge1xuICAgICAgICByZXR1cm4gYSAhPSBudWxsICYmIGIgIT0gbnVsbCAmJiBhLnRvTG93ZXJDYXNlKCkgPT09IGIudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb250YWluc0lDKGFycmF5LCB2YWx1ZSkge1xuICAgICAgICB2YXIgdmFsdWVMQywgaSwgbGVuID0gYXJyYXkubGVuZ3RoO1xuICAgICAgICBpZiAoIWxlbiB8fCAhdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB2YWx1ZUxDID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICBpZiAodmFsdWVMQyA9PT0gYXJyYXlbaV0udG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb252ZXJ0UHJvcHNUb1JlZ0V4cChvYmplY3QpIHtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AuY2FsbChvYmplY3QsIGtleSkpIHtcbiAgICAgICAgICAgICAgICBvYmplY3Rba2V5XSA9IG5ldyBSZWdFeHAob2JqZWN0W2tleV0sICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAoZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgdmFyIGtleSwgdmFsdWVzLCB2YWx1ZSwgaSwgbGVuLCB2ZXJQb3MsIG1vYmlsZURldGVjdFJ1bGVzID0gaW1wbC5tb2JpbGVEZXRlY3RSdWxlcztcbiAgICAgICAgZm9yIChrZXkgaW4gbW9iaWxlRGV0ZWN0UnVsZXMucHJvcHMpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wLmNhbGwobW9iaWxlRGV0ZWN0UnVsZXMucHJvcHMsIGtleSkpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBtb2JpbGVEZXRlY3RSdWxlcy5wcm9wc1trZXldO1xuICAgICAgICAgICAgICAgIGlmICghaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IFt2YWx1ZXNdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZW4gPSB2YWx1ZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgdmVyUG9zID0gdmFsdWUuaW5kZXhPZignW1ZFUl0nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZlclBvcyA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCB2ZXJQb3MpICsgJyhbXFxcXHcuX1xcXFwrXSspJyArIHZhbHVlLnN1YnN0cmluZyh2ZXJQb3MgKyA1KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBuZXcgUmVnRXhwKHZhbHVlLCAnaScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtb2JpbGVEZXRlY3RSdWxlcy5wcm9wc1trZXldID0gdmFsdWVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnZlcnRQcm9wc1RvUmVnRXhwKG1vYmlsZURldGVjdFJ1bGVzLm9zcyk7XG4gICAgICAgIGNvbnZlcnRQcm9wc1RvUmVnRXhwKG1vYmlsZURldGVjdFJ1bGVzLnBob25lcyk7XG4gICAgICAgIGNvbnZlcnRQcm9wc1RvUmVnRXhwKG1vYmlsZURldGVjdFJ1bGVzLnRhYmxldHMpO1xuICAgICAgICBjb252ZXJ0UHJvcHNUb1JlZ0V4cChtb2JpbGVEZXRlY3RSdWxlcy51YXMpO1xuICAgICAgICBjb252ZXJ0UHJvcHNUb1JlZ0V4cChtb2JpbGVEZXRlY3RSdWxlcy51dGlscyk7XG5cbiAgICAgICAgLy8gY29weSBzb21lIHBhdHRlcm5zIHRvIG9zczAgd2hpY2ggYXJlIHRlc3RlZCBmaXJzdCAoc2VlIGlzc3VlIzE1KVxuICAgICAgICBtb2JpbGVEZXRlY3RSdWxlcy5vc3MwID0ge1xuICAgICAgICAgICAgV2luZG93c1Bob25lT1M6IG1vYmlsZURldGVjdFJ1bGVzLm9zcy5XaW5kb3dzUGhvbmVPUyxcbiAgICAgICAgICAgIFdpbmRvd3NNb2JpbGVPUzogbW9iaWxlRGV0ZWN0UnVsZXMub3NzLldpbmRvd3NNb2JpbGVPU1xuICAgICAgICB9O1xuICAgIH0oKSk7XG5cbiAgICAvKipcbiAgICAgKiBUZXN0IHVzZXJBZ2VudCBzdHJpbmcgYWdhaW5zdCBhIHNldCBvZiBydWxlcyBhbmQgZmluZCB0aGUgZmlyc3QgbWF0Y2hlZCBrZXkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJ1bGVzIChrZXkgaXMgU3RyaW5nLCB2YWx1ZSBpcyBSZWdFeHApXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVzZXJBZ2VudCB0aGUgbmF2aWdhdG9yLnVzZXJBZ2VudCAob3IgSFRUUC1IZWFkZXIgJ1VzZXItQWdlbnQnKS5cbiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfG51bGx9IHRoZSBtYXRjaGVkIGtleSBpZiBmb3VuZCwgb3RoZXJ3aXNlIDx0dD5udWxsPC90dD5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGltcGwuZmluZE1hdGNoID0gZnVuY3Rpb24ocnVsZXMsIHVzZXJBZ2VudCkge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gcnVsZXMpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wLmNhbGwocnVsZXMsIGtleSkpIHtcbiAgICAgICAgICAgICAgICBpZiAocnVsZXNba2V5XS50ZXN0KHVzZXJBZ2VudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRlc3QgdXNlckFnZW50IHN0cmluZyBhZ2FpbnN0IGEgc2V0IG9mIHJ1bGVzIGFuZCByZXR1cm4gYW4gYXJyYXkgb2YgbWF0Y2hlZCBrZXlzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBydWxlcyAoa2V5IGlzIFN0cmluZywgdmFsdWUgaXMgUmVnRXhwKVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1c2VyQWdlbnQgdGhlIG5hdmlnYXRvci51c2VyQWdlbnQgKG9yIEhUVFAtSGVhZGVyICdVc2VyLUFnZW50JykuXG4gICAgICogQHJldHVybnMge0FycmF5fSBhbiBhcnJheSBvZiBtYXRjaGVkIGtleXMsIG1heSBiZSBlbXB0eSB3aGVuIHRoZXJlIGlzIG5vIG1hdGNoLCBidXQgbm90IDx0dD5udWxsPC90dD5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGltcGwuZmluZE1hdGNoZXMgPSBmdW5jdGlvbihydWxlcywgdXNlckFnZW50KSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHJ1bGVzKSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcC5jYWxsKHJ1bGVzLCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJ1bGVzW2tleV0udGVzdCh1c2VyQWdlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrIHRoZSB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eSBpbiB0aGUgVXNlci1BZ2VudC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eU5hbWVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXNlckFnZW50XG4gICAgICogQHJldHVybiB7U3RyaW5nfSB2ZXJzaW9uIG9yIDx0dD5udWxsPC90dD4gaWYgdmVyc2lvbiBub3QgZm91bmRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGltcGwuZ2V0VmVyc2lvblN0ciA9IGZ1bmN0aW9uIChwcm9wZXJ0eU5hbWUsIHVzZXJBZ2VudCkge1xuICAgICAgICB2YXIgcHJvcHMgPSBpbXBsLm1vYmlsZURldGVjdFJ1bGVzLnByb3BzLCBwYXR0ZXJucywgaSwgbGVuLCBtYXRjaDtcbiAgICAgICAgaWYgKGhhc093blByb3AuY2FsbChwcm9wcywgcHJvcGVydHlOYW1lKSkge1xuICAgICAgICAgICAgcGF0dGVybnMgPSBwcm9wc1twcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgbGVuID0gcGF0dGVybnMubGVuZ3RoO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2ggPSBwYXR0ZXJuc1tpXS5leGVjKHVzZXJBZ2VudCk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrIHRoZSB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eSBpbiB0aGUgVXNlci1BZ2VudC5cbiAgICAgKiBXaWxsIHJldHVybiBhIGZsb2F0IG51bWJlci4gKGVnLiAyXzAgd2lsbCByZXR1cm4gMi4wLCA0LjMuMSB3aWxsIHJldHVybiA0LjMxKVxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5TmFtZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1c2VyQWdlbnRcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHZlcnNpb24gb3IgPHR0Pk5hTjwvdHQ+IGlmIHZlcnNpb24gbm90IGZvdW5kXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBpbXBsLmdldFZlcnNpb24gPSBmdW5jdGlvbiAocHJvcGVydHlOYW1lLCB1c2VyQWdlbnQpIHtcbiAgICAgICAgdmFyIHZlcnNpb24gPSBpbXBsLmdldFZlcnNpb25TdHIocHJvcGVydHlOYW1lLCB1c2VyQWdlbnQpO1xuICAgICAgICByZXR1cm4gdmVyc2lvbiA/IGltcGwucHJlcGFyZVZlcnNpb25Obyh2ZXJzaW9uKSA6IE5hTjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZSB0aGUgdmVyc2lvbiBudW1iZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdmVyc2lvblxuICAgICAqIEByZXR1cm4ge051bWJlcn0gdGhlIHZlcnNpb24gbnVtYmVyIGFzIGEgZmxvYXRpbmcgbnVtYmVyXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBpbXBsLnByZXBhcmVWZXJzaW9uTm8gPSBmdW5jdGlvbiAodmVyc2lvbikge1xuICAgICAgICB2YXIgbnVtYmVycztcblxuICAgICAgICBudW1iZXJzID0gdmVyc2lvbi5zcGxpdCgvW2Etei5fIFxcL1xcLV0vaSk7XG4gICAgICAgIGlmIChudW1iZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgdmVyc2lvbiA9IG51bWJlcnNbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgdmVyc2lvbiA9IG51bWJlcnNbMF0gKyAnLic7XG4gICAgICAgICAgICBudW1iZXJzLnNoaWZ0KCk7XG4gICAgICAgICAgICB2ZXJzaW9uICs9IG51bWJlcnMuam9pbignJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE51bWJlcih2ZXJzaW9uKTtcbiAgICB9O1xuXG4gICAgaW1wbC5pc01vYmlsZUZhbGxiYWNrID0gZnVuY3Rpb24gKHVzZXJBZ2VudCkge1xuICAgICAgICByZXR1cm4gaW1wbC5kZXRlY3RNb2JpbGVCcm93c2Vycy5mdWxsUGF0dGVybi50ZXN0KHVzZXJBZ2VudCkgfHxcbiAgICAgICAgICAgIGltcGwuZGV0ZWN0TW9iaWxlQnJvd3NlcnMuc2hvcnRQYXR0ZXJuLnRlc3QodXNlckFnZW50LnN1YnN0cigwLDQpKTtcbiAgICB9O1xuXG4gICAgaW1wbC5pc1RhYmxldEZhbGxiYWNrID0gZnVuY3Rpb24gKHVzZXJBZ2VudCkge1xuICAgICAgICByZXR1cm4gaW1wbC5kZXRlY3RNb2JpbGVCcm93c2Vycy50YWJsZXRQYXR0ZXJuLnRlc3QodXNlckFnZW50KTtcbiAgICB9O1xuXG4gICAgaW1wbC5wcmVwYXJlRGV0ZWN0aW9uQ2FjaGUgPSBmdW5jdGlvbiAoY2FjaGUsIHVzZXJBZ2VudCwgbWF4UGhvbmVXaWR0aCkge1xuICAgICAgICBpZiAoY2FjaGUubW9iaWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcGhvbmUsIHRhYmxldCwgcGhvbmVTaXplZDtcblxuICAgICAgICAvLyBmaXJzdCBjaGVjayBmb3Igc3Ryb25nZXIgdGFibGV0IHJ1bGVzLCB0aGVuIHBob25lIChzZWUgaXNzdWUjNSlcbiAgICAgICAgdGFibGV0ID0gaW1wbC5maW5kTWF0Y2goaW1wbC5tb2JpbGVEZXRlY3RSdWxlcy50YWJsZXRzLCB1c2VyQWdlbnQpO1xuICAgICAgICBpZiAodGFibGV0KSB7XG4gICAgICAgICAgICBjYWNoZS5tb2JpbGUgPSBjYWNoZS50YWJsZXQgPSB0YWJsZXQ7XG4gICAgICAgICAgICBjYWNoZS5waG9uZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47IC8vIHVuYW1iaWd1b3VzbHkgaWRlbnRpZmllZCBhcyB0YWJsZXRcbiAgICAgICAgfVxuXG4gICAgICAgIHBob25lID0gaW1wbC5maW5kTWF0Y2goaW1wbC5tb2JpbGVEZXRlY3RSdWxlcy5waG9uZXMsIHVzZXJBZ2VudCk7XG4gICAgICAgIGlmIChwaG9uZSkge1xuICAgICAgICAgICAgY2FjaGUubW9iaWxlID0gY2FjaGUucGhvbmUgPSBwaG9uZTtcbiAgICAgICAgICAgIGNhY2hlLnRhYmxldCA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47IC8vIHVuYW1iaWd1b3VzbHkgaWRlbnRpZmllZCBhcyBwaG9uZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gb3VyIHJ1bGVzIGhhdmVuJ3QgZm91bmQgYSBtYXRjaCAtPiB0cnkgbW9yZSBnZW5lcmFsIGZhbGxiYWNrIHJ1bGVzXG4gICAgICAgIGlmIChpbXBsLmlzTW9iaWxlRmFsbGJhY2sodXNlckFnZW50KSkge1xuICAgICAgICAgICAgcGhvbmVTaXplZCA9IE1vYmlsZURldGVjdC5pc1Bob25lU2l6ZWQobWF4UGhvbmVXaWR0aCk7XG4gICAgICAgICAgICBpZiAocGhvbmVTaXplZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY2FjaGUubW9iaWxlID0gaW1wbC5GQUxMQkFDS19NT0JJTEU7XG4gICAgICAgICAgICAgICAgY2FjaGUudGFibGV0ID0gY2FjaGUucGhvbmUgPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwaG9uZVNpemVkKSB7XG4gICAgICAgICAgICAgICAgY2FjaGUubW9iaWxlID0gY2FjaGUucGhvbmUgPSBpbXBsLkZBTExCQUNLX1BIT05FO1xuICAgICAgICAgICAgICAgIGNhY2hlLnRhYmxldCA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNhY2hlLm1vYmlsZSA9IGNhY2hlLnRhYmxldCA9IGltcGwuRkFMTEJBQ0tfVEFCTEVUO1xuICAgICAgICAgICAgICAgIGNhY2hlLnBob25lID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpbXBsLmlzVGFibGV0RmFsbGJhY2sodXNlckFnZW50KSkge1xuICAgICAgICAgICAgY2FjaGUubW9iaWxlID0gY2FjaGUudGFibGV0ID0gaW1wbC5GQUxMQkFDS19UQUJMRVQ7XG4gICAgICAgICAgICBjYWNoZS5waG9uZSA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBub3QgbW9iaWxlIGF0IGFsbCFcbiAgICAgICAgICAgIGNhY2hlLm1vYmlsZSA9IGNhY2hlLnRhYmxldCA9IGNhY2hlLnBob25lID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyB0IGlzIGEgcmVmZXJlbmNlIHRvIGEgTW9iaWxlRGV0ZWN0IGluc3RhbmNlXG4gICAgaW1wbC5tb2JpbGVHcmFkZSA9IGZ1bmN0aW9uICh0KSB7XG4gICAgICAgIC8vIGltcGwgbm90ZTpcbiAgICAgICAgLy8gVG8ga2VlcCBpbiBzeW5jIHcvIE1vYmlsZV9EZXRlY3QucGhwIGVhc2lseSwgdGhlIGZvbGxvd2luZyBjb2RlIGlzIHRpZ2h0bHkgYWxpZ25lZCB0byB0aGUgUEhQIHZlcnNpb24uXG4gICAgICAgIC8vIFdoZW4gY2hhbmdlcyBhcmUgbWFkZSBpbiBNb2JpbGVfRGV0ZWN0LnBocCwgY29weSB0aGlzIG1ldGhvZCBhbmQgcmVwbGFjZTpcbiAgICAgICAgLy8gICAgICR0aGlzLT4gLyB0LlxuICAgICAgICAvLyAgICAgc2VsZjo6TU9CSUxFX0dSQURFXyguKSAvICckMSdcbiAgICAgICAgLy8gICAgICwgc2VsZjo6VkVSU0lPTl9UWVBFX0ZMT0FUIC8gKG5vdGhpbmcpXG4gICAgICAgIC8vICAgICBpc0lPUygpIC8gb3MoJ2lPUycpXG4gICAgICAgIC8vICAgICBbcmVnXSAvIChub3RoaW5nKSAgIDwtLSBqc2RlbGl2ciBjb21wbGFpbmluZyBhYm91dCB1bmVzY2FwZWQgdW5pY29kZSBjaGFyYWN0ZXIgVSswMEFFXG4gICAgICAgIHZhciAkaXNNb2JpbGUgPSB0Lm1vYmlsZSgpICE9PSBudWxsO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIEFwcGxlIGlPUyAzLjItNS4xIC0gVGVzdGVkIG9uIHRoZSBvcmlnaW5hbCBpUGFkICg0LjMgLyA1LjApLCBpUGFkIDIgKDQuMyksIGlQYWQgMyAoNS4xKSwgb3JpZ2luYWwgaVBob25lICgzLjEpLCBpUGhvbmUgMyAoMy4yKSwgM0dTICg0LjMpLCA0ICg0LjMgLyA1LjApLCBhbmQgNFMgKDUuMSlcbiAgICAgICAgICAgIHQub3MoJ2lPUycpICYmIHQudmVyc2lvbignaVBhZCcpPj00LjMgfHxcbiAgICAgICAgICAgIHQub3MoJ2lPUycpICYmIHQudmVyc2lvbignaVBob25lJyk+PTMuMSB8fFxuICAgICAgICAgICAgdC5vcygnaU9TJykgJiYgdC52ZXJzaW9uKCdpUG9kJyk+PTMuMSB8fFxuXG4gICAgICAgICAgICAvLyBBbmRyb2lkIDIuMS0yLjMgLSBUZXN0ZWQgb24gdGhlIEhUQyBJbmNyZWRpYmxlICgyLjIpLCBvcmlnaW5hbCBEcm9pZCAoMi4yKSwgSFRDIEFyaWEgKDIuMSksIEdvb2dsZSBOZXh1cyBTICgyLjMpLiBGdW5jdGlvbmFsIG9uIDEuNSAmIDEuNiBidXQgcGVyZm9ybWFuY2UgbWF5IGJlIHNsdWdnaXNoLCB0ZXN0ZWQgb24gR29vZ2xlIEcxICgxLjUpXG4gICAgICAgICAgICAvLyBBbmRyb2lkIDMuMSAoSG9uZXljb21iKSAgLSBUZXN0ZWQgb24gdGhlIFNhbXN1bmcgR2FsYXh5IFRhYiAxMC4xIGFuZCBNb3Rvcm9sYSBYT09NXG4gICAgICAgICAgICAvLyBBbmRyb2lkIDQuMCAoSUNTKSAgLSBUZXN0ZWQgb24gYSBHYWxheHkgTmV4dXMuIE5vdGU6IHRyYW5zaXRpb24gcGVyZm9ybWFuY2UgY2FuIGJlIHBvb3Igb24gdXBncmFkZWQgZGV2aWNlc1xuICAgICAgICAgICAgLy8gQW5kcm9pZCA0LjEgKEplbGx5IEJlYW4pICAtIFRlc3RlZCBvbiBhIEdhbGF4eSBOZXh1cyBhbmQgR2FsYXh5IDdcbiAgICAgICAgICAgICggdC52ZXJzaW9uKCdBbmRyb2lkJyk+Mi4xICYmIHQuaXMoJ1dlYmtpdCcpICkgfHxcblxuICAgICAgICAgICAgLy8gV2luZG93cyBQaG9uZSA3LTcuNSAtIFRlc3RlZCBvbiB0aGUgSFRDIFN1cnJvdW5kICg3LjApIEhUQyBUcm9waHkgKDcuNSksIExHLUU5MDAgKDcuNSksIE5va2lhIEx1bWlhIDgwMFxuICAgICAgICAgICAgdC52ZXJzaW9uKCdXaW5kb3dzIFBob25lIE9TJyk+PTcuMCB8fFxuXG4gICAgICAgICAgICAvLyBCbGFja2JlcnJ5IDcgLSBUZXN0ZWQgb24gQmxhY2tCZXJyeSBUb3JjaCA5ODEwXG4gICAgICAgICAgICAvLyBCbGFja2JlcnJ5IDYuMCAtIFRlc3RlZCBvbiB0aGUgVG9yY2ggOTgwMCBhbmQgU3R5bGUgOTY3MFxuICAgICAgICAgICAgdC5pcygnQmxhY2tCZXJyeScpICYmIHQudmVyc2lvbignQmxhY2tCZXJyeScpPj02LjAgfHxcbiAgICAgICAgICAgIC8vIEJsYWNrYmVycnkgUGxheWJvb2sgKDEuMC0yLjApIC0gVGVzdGVkIG9uIFBsYXlCb29rXG4gICAgICAgICAgICB0Lm1hdGNoKCdQbGF5Ym9vay4qVGFibGV0JykgfHxcblxuICAgICAgICAgICAgLy8gUGFsbSBXZWJPUyAoMS40LTIuMCkgLSBUZXN0ZWQgb24gdGhlIFBhbG0gUGl4aSAoMS40KSwgUHJlICgxLjQpLCBQcmUgMiAoMi4wKVxuICAgICAgICAgICAgKCB0LnZlcnNpb24oJ3dlYk9TJyk+PTEuNCAmJiB0Lm1hdGNoKCdQYWxtfFByZXxQaXhpJykgKSB8fFxuICAgICAgICAgICAgLy8gUGFsbSBXZWJPUyAzLjAgIC0gVGVzdGVkIG9uIEhQIFRvdWNoUGFkXG4gICAgICAgICAgICB0Lm1hdGNoKCdocC4qVG91Y2hQYWQnKSB8fFxuXG4gICAgICAgICAgICAvLyBGaXJlZm94IE1vYmlsZSAoMTIgQmV0YSkgLSBUZXN0ZWQgb24gQW5kcm9pZCAyLjMgZGV2aWNlXG4gICAgICAgICAgICAoIHQuaXMoJ0ZpcmVmb3gnKSAmJiB0LnZlcnNpb24oJ0ZpcmVmb3gnKT49MTIgKSB8fFxuXG4gICAgICAgICAgICAvLyBDaHJvbWUgZm9yIEFuZHJvaWQgLSBUZXN0ZWQgb24gQW5kcm9pZCA0LjAsIDQuMSBkZXZpY2VcbiAgICAgICAgICAgICggdC5pcygnQ2hyb21lJykgJiYgdC5pcygnQW5kcm9pZE9TJykgJiYgdC52ZXJzaW9uKCdBbmRyb2lkJyk+PTQuMCApIHx8XG5cbiAgICAgICAgICAgIC8vIFNreWZpcmUgNC4xIC0gVGVzdGVkIG9uIEFuZHJvaWQgMi4zIGRldmljZVxuICAgICAgICAgICAgKCB0LmlzKCdTa3lmaXJlJykgJiYgdC52ZXJzaW9uKCdTa3lmaXJlJyk+PTQuMSAmJiB0LmlzKCdBbmRyb2lkT1MnKSAmJiB0LnZlcnNpb24oJ0FuZHJvaWQnKT49Mi4zICkgfHxcblxuICAgICAgICAgICAgLy8gT3BlcmEgTW9iaWxlIDExLjUtMTI6IFRlc3RlZCBvbiBBbmRyb2lkIDIuM1xuICAgICAgICAgICAgKCB0LmlzKCdPcGVyYScpICYmIHQudmVyc2lvbignT3BlcmEgTW9iaScpPjExICYmIHQuaXMoJ0FuZHJvaWRPUycpICkgfHxcblxuICAgICAgICAgICAgLy8gTWVlZ28gMS4yIC0gVGVzdGVkIG9uIE5va2lhIDk1MCBhbmQgTjlcbiAgICAgICAgICAgIHQuaXMoJ01lZUdvT1MnKSB8fFxuXG4gICAgICAgICAgICAvLyBUaXplbiAocHJlLXJlbGVhc2UpIC0gVGVzdGVkIG9uIGVhcmx5IGhhcmR3YXJlXG4gICAgICAgICAgICB0LmlzKCdUaXplbicpIHx8XG5cbiAgICAgICAgICAgIC8vIFNhbXN1bmcgQmFkYSAyLjAgLSBUZXN0ZWQgb24gYSBTYW1zdW5nIFdhdmUgMywgRG9scGhpbiBicm93c2VyXG4gICAgICAgICAgICAvLyBAdG9kbzogbW9yZSB0ZXN0cyBoZXJlIVxuICAgICAgICAgICAgdC5pcygnRG9sZmluJykgJiYgdC52ZXJzaW9uKCdCYWRhJyk+PTIuMCB8fFxuXG4gICAgICAgICAgICAvLyBVQyBCcm93c2VyIC0gVGVzdGVkIG9uIEFuZHJvaWQgMi4zIGRldmljZVxuICAgICAgICAgICAgKCAodC5pcygnVUMgQnJvd3NlcicpIHx8IHQuaXMoJ0RvbGZpbicpKSAmJiB0LnZlcnNpb24oJ0FuZHJvaWQnKT49Mi4zICkgfHxcblxuICAgICAgICAgICAgLy8gS2luZGxlIDMgYW5kIEZpcmUgIC0gVGVzdGVkIG9uIHRoZSBidWlsdC1pbiBXZWJLaXQgYnJvd3NlciBmb3IgZWFjaFxuICAgICAgICAgICAgKCB0Lm1hdGNoKCdLaW5kbGUgRmlyZScpIHx8XG4gICAgICAgICAgICAgICAgdC5pcygnS2luZGxlJykgJiYgdC52ZXJzaW9uKCdLaW5kbGUnKT49My4wICkgfHxcblxuICAgICAgICAgICAgLy8gTm9vayBDb2xvciAxLjQuMSAtIFRlc3RlZCBvbiBvcmlnaW5hbCBOb29rIENvbG9yLCBub3QgTm9vayBUYWJsZXRcbiAgICAgICAgICAgIHQuaXMoJ0FuZHJvaWRPUycpICYmIHQuaXMoJ05vb2tUYWJsZXQnKSB8fFxuXG4gICAgICAgICAgICAvLyBDaHJvbWUgRGVza3RvcCAxMS0yMSAtIFRlc3RlZCBvbiBPUyBYIDEwLjcgYW5kIFdpbmRvd3MgN1xuICAgICAgICAgICAgdC52ZXJzaW9uKCdDaHJvbWUnKT49MTEgJiYgISRpc01vYmlsZSB8fFxuXG4gICAgICAgICAgICAvLyBTYWZhcmkgRGVza3RvcCA0LTUgLSBUZXN0ZWQgb24gT1MgWCAxMC43IGFuZCBXaW5kb3dzIDdcbiAgICAgICAgICAgIHQudmVyc2lvbignU2FmYXJpJyk+PTUuMCAmJiAhJGlzTW9iaWxlIHx8XG5cbiAgICAgICAgICAgIC8vIEZpcmVmb3ggRGVza3RvcCA0LTEzIC0gVGVzdGVkIG9uIE9TIFggMTAuNyBhbmQgV2luZG93cyA3XG4gICAgICAgICAgICB0LnZlcnNpb24oJ0ZpcmVmb3gnKT49NC4wICYmICEkaXNNb2JpbGUgfHxcblxuICAgICAgICAgICAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgNy05IC0gVGVzdGVkIG9uIFdpbmRvd3MgWFAsIFZpc3RhIGFuZCA3XG4gICAgICAgICAgICB0LnZlcnNpb24oJ01TSUUnKT49Ny4wICYmICEkaXNNb2JpbGUgfHxcblxuICAgICAgICAgICAgLy8gT3BlcmEgRGVza3RvcCAxMC0xMiAtIFRlc3RlZCBvbiBPUyBYIDEwLjcgYW5kIFdpbmRvd3MgN1xuICAgICAgICAgICAgLy8gQHJlZmVyZW5jZTogaHR0cDovL215Lm9wZXJhLmNvbS9jb21tdW5pdHkvb3BlbndlYi9pZG9wZXJhL1xuICAgICAgICAgICAgdC52ZXJzaW9uKCdPcGVyYScpPj0xMCAmJiAhJGlzTW9iaWxlXG5cbiAgICAgICAgICAgICl7XG4gICAgICAgICAgICByZXR1cm4gJ0EnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdC5vcygnaU9TJykgJiYgdC52ZXJzaW9uKCdpUGFkJyk8NC4zIHx8XG4gICAgICAgICAgICB0Lm9zKCdpT1MnKSAmJiB0LnZlcnNpb24oJ2lQaG9uZScpPDMuMSB8fFxuICAgICAgICAgICAgdC5vcygnaU9TJykgJiYgdC52ZXJzaW9uKCdpUG9kJyk8My4xIHx8XG5cbiAgICAgICAgICAgIC8vIEJsYWNrYmVycnkgNS4wOiBUZXN0ZWQgb24gdGhlIFN0b3JtIDIgOTU1MCwgQm9sZCA5NzcwXG4gICAgICAgICAgICB0LmlzKCdCbGFja2JlcnJ5JykgJiYgdC52ZXJzaW9uKCdCbGFja0JlcnJ5Jyk+PTUgJiYgdC52ZXJzaW9uKCdCbGFja0JlcnJ5Jyk8NiB8fFxuXG4gICAgICAgICAgICAvL09wZXJhIE1pbmkgKDUuMC02LjUpIC0gVGVzdGVkIG9uIGlPUyAzLjIvNC4zIGFuZCBBbmRyb2lkIDIuM1xuICAgICAgICAgICAgKCB0LnZlcnNpb24oJ09wZXJhIE1pbmknKT49NS4wICYmIHQudmVyc2lvbignT3BlcmEgTWluaScpPD02LjUgJiZcbiAgICAgICAgICAgICAgICAodC52ZXJzaW9uKCdBbmRyb2lkJyk+PTIuMyB8fCB0LmlzKCdpT1MnKSkgKSB8fFxuXG4gICAgICAgICAgICAvLyBOb2tpYSBTeW1iaWFuXjMgLSBUZXN0ZWQgb24gTm9raWEgTjggKFN5bWJpYW5eMyksIEM3IChTeW1iaWFuXjMpLCBhbHNvIHdvcmtzIG9uIE45NyAoU3ltYmlhbl4xKVxuICAgICAgICAgICAgdC5tYXRjaCgnTm9raWFOOHxOb2tpYUM3fE45Ny4qU2VyaWVzNjB8U3ltYmlhbi8zJykgfHxcblxuICAgICAgICAgICAgLy8gQHRvZG86IHJlcG9ydCB0aGlzICh0ZXN0ZWQgb24gTm9raWEgTjcxKVxuICAgICAgICAgICAgdC52ZXJzaW9uKCdPcGVyYSBNb2JpJyk+PTExICYmIHQuaXMoJ1N5bWJpYW5PUycpXG4gICAgICAgICAgICApe1xuICAgICAgICAgICAgcmV0dXJuICdCJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgLy8gQmxhY2tiZXJyeSA0LnggLSBUZXN0ZWQgb24gdGhlIEN1cnZlIDgzMzBcbiAgICAgICAgICAgIHQudmVyc2lvbignQmxhY2tCZXJyeScpPDUuMCB8fFxuICAgICAgICAgICAgLy8gV2luZG93cyBNb2JpbGUgLSBUZXN0ZWQgb24gdGhlIEhUQyBMZW8gKFdpbk1vIDUuMilcbiAgICAgICAgICAgIHQubWF0Y2goJ01TSUVNb2JpbGV8V2luZG93cyBDRS4qTW9iaWxlJykgfHwgdC52ZXJzaW9uKCdXaW5kb3dzIE1vYmlsZScpPD01LjJcblxuICAgICAgICAgICAgKXtcbiAgICAgICAgICAgIHJldHVybiAnQyc7XG4gICAgICAgIH1cblxuICAgICAgICAvL0FsbCBvbGRlciBzbWFydHBob25lIHBsYXRmb3JtcyBhbmQgZmVhdHVyZXBob25lcyAtIEFueSBkZXZpY2UgdGhhdCBkb2Vzbid0IHN1cHBvcnQgbWVkaWEgcXVlcmllc1xuICAgICAgICAvL3dpbGwgcmVjZWl2ZSB0aGUgYmFzaWMsIEMgZ3JhZGUgZXhwZXJpZW5jZS5cbiAgICAgICAgcmV0dXJuICdDJztcbiAgICB9O1xuXG4gICAgaW1wbC5kZXRlY3RPUyA9IGZ1bmN0aW9uICh1YSkge1xuICAgICAgICByZXR1cm4gaW1wbC5maW5kTWF0Y2goaW1wbC5tb2JpbGVEZXRlY3RSdWxlcy5vc3MwLCB1YSkgfHxcbiAgICAgICAgICAgIGltcGwuZmluZE1hdGNoKGltcGwubW9iaWxlRGV0ZWN0UnVsZXMub3NzLCB1YSk7XG4gICAgfTtcblxuICAgIGltcGwuZ2V0RGV2aWNlU21hbGxlclNpZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuc2NyZWVuLndpZHRoIDwgd2luZG93LnNjcmVlbi5oZWlnaHQgP1xuICAgICAgICAgICAgd2luZG93LnNjcmVlbi53aWR0aCA6XG4gICAgICAgICAgICB3aW5kb3cuc2NyZWVuLmhlaWdodDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0b3IgZm9yIE1vYmlsZURldGVjdCBvYmplY3QuXG4gICAgICogPGJyPlxuICAgICAqIFN1Y2ggYW4gb2JqZWN0IHdpbGwga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgZ2l2ZW4gdXNlci1hZ2VudCBzdHJpbmcgYW5kIGNhY2hlIG1vc3Qgb2YgdGhlIGRldGVjdCBxdWVyaWVzLjxicj5cbiAgICAgKiA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogI2Q5ZWRmNzsgYm9yZGVyOiAxcHggc29saWQgI2JjZThmMTsgY29sb3I6ICMzYTg3YWQ7IHBhZGRpbmc6IDE0cHg7IGJvcmRlci1yYWRpdXM6IDJweDsgbWFyZ2luLXRvcDogMjBweFwiPlxuICAgICAqICAgICA8c3Ryb25nPkZpbmQgaW5mb3JtYXRpb24gaG93IHRvIGRvd25sb2FkIGFuZCBpbnN0YWxsOjwvc3Ryb25nPlxuICAgICAqICAgICA8YSBocmVmPVwiaHR0cHM6Ly9naXRodWIuY29tL2hnb2VibC9tb2JpbGUtZGV0ZWN0LmpzL1wiPmdpdGh1Yi5jb20vaGdvZWJsL21vYmlsZS1kZXRlY3QuanMvPC9hPlxuICAgICAqIDwvZGl2PlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgPHByZT5cbiAgICAgKiAgICAgdmFyIG1kID0gbmV3IE1vYmlsZURldGVjdCh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgICogICAgIGlmIChtZC5tb2JpbGUoKSkge1xuICAgICAqICAgICAgICAgbG9jYXRpb24uaHJlZiA9IChtZC5tb2JpbGVHcmFkZSgpID09PSAnQScpID8gJy9tb2JpbGUvJyA6ICcvbHlueC8nO1xuICAgICAqICAgICB9XG4gICAgICogPC9wcmU+XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlckFnZW50IHR5cGljYWxseSB0YWtlbiBmcm9tIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50IG9yIGh0dHBfaGVhZGVyWydVc2VyLUFnZW50J11cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gW21heFBob25lV2lkdGg9NjAwXSA8c3Ryb25nPm9ubHkgZm9yIGJyb3dzZXJzPC9zdHJvbmc+IHNwZWNpZnkgYSB2YWx1ZSBmb3IgdGhlIG1heGltdW1cbiAgICAgKiAgICAgICAgd2lkdGggb2Ygc21hbGxlc3QgZGV2aWNlIHNpZGUgKGluIGxvZ2ljYWwgXCJDU1NcIiBwaXhlbHMpIHVudGlsIGEgZGV2aWNlIGRldGVjdGVkIGFzIG1vYmlsZSB3aWxsIGJlIGhhbmRsZWRcbiAgICAgKiAgICAgICAgYXMgcGhvbmUuXG4gICAgICogICAgICAgIFRoaXMgaXMgb25seSB1c2VkIGluIGNhc2VzIHdoZXJlIHRoZSBkZXZpY2UgY2Fubm90IGJlIGNsYXNzaWZpZWQgYXMgcGhvbmUgb3IgdGFibGV0Ljxicj5cbiAgICAgKiAgICAgICAgU2VlIDxhIGhyZWY9XCJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2d1aWRlL3ByYWN0aWNlcy9zY3JlZW5zX3N1cHBvcnQuaHRtbFwiPkRlY2xhcmluZyBUYWJsZXQgTGF5b3V0c1xuICAgICAqICAgICAgICBmb3IgQW5kcm9pZDwvYT4uPGJyPlxuICAgICAqICAgICAgICBJZiB5b3UgcHJvdmlkZSBhIHZhbHVlIDwgMCwgdGhlbiB0aGlzIFwiZnV6enlcIiBjaGVjayBpcyBkaXNhYmxlZC5cbiAgICAgKiBAY29uc3RydWN0b3JcbiAgICAgKiBAZ2xvYmFsXG4gICAgICovXG4gICAgZnVuY3Rpb24gTW9iaWxlRGV0ZWN0KHVzZXJBZ2VudCwgbWF4UGhvbmVXaWR0aCkge1xuICAgICAgICB0aGlzLnVhID0gdXNlckFnZW50IHx8ICcnO1xuICAgICAgICB0aGlzLl9jYWNoZSA9IHt9O1xuICAgICAgICAvLzYwMGRwIGlzIHR5cGljYWwgN1wiIHRhYmxldCBtaW5pbXVtIHdpZHRoXG4gICAgICAgIHRoaXMubWF4UGhvbmVXaWR0aCA9IG1heFBob25lV2lkdGggfHwgNjAwO1xuICAgIH1cblxuICAgIE1vYmlsZURldGVjdC5wcm90b3R5cGUgPSB7XG4gICAgICAgIGNvbnN0cnVjdG9yOiBNb2JpbGVEZXRlY3QsXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIGRldGVjdGVkIHBob25lIG9yIHRhYmxldCB0eXBlIG9yIDx0dD5udWxsPC90dD4gaWYgaXQgaXMgbm90IGEgbW9iaWxlIGRldmljZS5cbiAgICAgICAgICogPGJyPlxuICAgICAgICAgKiBGb3IgYSBsaXN0IG9mIHBvc3NpYmxlIHJldHVybiB2YWx1ZXMgc2VlIHtAbGluayBNb2JpbGVEZXRlY3QjcGhvbmV9IGFuZCB7QGxpbmsgTW9iaWxlRGV0ZWN0I3RhYmxldH0uPGJyPlxuICAgICAgICAgKiA8YnI+XG4gICAgICAgICAqIElmIHRoZSBkZXZpY2UgaXMgbm90IGRldGVjdGVkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIGZyb20gTW9iaWxlLURldGVjdCwgYSB0ZXN0IGlzIG1hZGUgYWdhaW5zdFxuICAgICAgICAgKiB0aGUgcGF0dGVybnMgb2YgPGEgaHJlZj1cImh0dHA6Ly9kZXRlY3Rtb2JpbGVicm93c2Vycy5jb20vXCI+ZGV0ZWN0bW9iaWxlYnJvd3NlcnMuY29tPC9hPi4gSWYgdGhpcyB0ZXN0XG4gICAgICAgICAqIGlzIHBvc2l0aXZlLCBhIHZhbHVlIG9mIDxjb2RlPlVua25vd25QaG9uZTwvY29kZT4sIDxjb2RlPlVua25vd25UYWJsZXQ8L2NvZGU+IG9yXG4gICAgICAgICAqIDxjb2RlPlVua25vd25Nb2JpbGU8L2NvZGU+IGlzIHJldHVybmVkLjxicj5cbiAgICAgICAgICogV2hlbiB1c2VkIGluIGJyb3dzZXIsIHRoZSBkZWNpc2lvbiB3aGV0aGVyIHBob25lIG9yIHRhYmxldCBpcyBtYWRlIGJhc2VkIG9uIDxjb2RlPnNjcmVlbi53aWR0aC9oZWlnaHQ8L2NvZGU+Ljxicj5cbiAgICAgICAgICogPGJyPlxuICAgICAgICAgKiBXaGVuIHVzZWQgc2VydmVyLXNpZGUgKG5vZGUuanMpLCB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDxjb2RlPlVua25vd25UYWJsZXQ8L2NvZGU+XG4gICAgICAgICAqIGFuZCA8Y29kZT5Vbmtub3duTW9iaWxlPC9jb2RlPiwgc28geW91IHdpbGwgZ2V0IDxjb2RlPlVua25vd25Nb2JpbGU8L2NvZGU+IGhlcmUuPGJyPlxuICAgICAgICAgKiBCZSBhd2FyZSB0aGF0IHNpbmNlIHYxLjAuMCBpbiB0aGlzIHNwZWNpYWwgY2FzZSB5b3Ugd2lsbCBnZXQgPGNvZGU+VW5rbm93bk1vYmlsZTwvY29kZT4gb25seSBmb3I6XG4gICAgICAgICAqIHtAbGluayBNb2JpbGVEZXRlY3QjbW9iaWxlfSwgbm90IGZvciB7QGxpbmsgTW9iaWxlRGV0ZWN0I3Bob25lfSBhbmQge0BsaW5rIE1vYmlsZURldGVjdCN0YWJsZXR9LlxuICAgICAgICAgKiBJbiB2ZXJzaW9ucyBiZWZvcmUgdjEuMC4wIGFsbCAzIG1ldGhvZHMgcmV0dXJuZWQgPGNvZGU+VW5rbm93bk1vYmlsZTwvY29kZT4gd2hpY2ggd2FzIHRlZGlvdXMgdG8gdXNlLlxuICAgICAgICAgKiA8YnI+XG4gICAgICAgICAqIEluIG1vc3QgY2FzZXMgeW91IHdpbGwgdXNlIHRoZSByZXR1cm4gdmFsdWUganVzdCBhcyBhIGJvb2xlYW4uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSBrZXkgZm9yIHRoZSBwaG9uZSBmYW1pbHkgb3IgdGFibGV0IGZhbWlseSwgZS5nLiBcIk5leHVzXCIuXG4gICAgICAgICAqIEBmdW5jdGlvbiBNb2JpbGVEZXRlY3QjbW9iaWxlXG4gICAgICAgICAqL1xuICAgICAgICBtb2JpbGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGltcGwucHJlcGFyZURldGVjdGlvbkNhY2hlKHRoaXMuX2NhY2hlLCB0aGlzLnVhLCB0aGlzLm1heFBob25lV2lkdGgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlLm1vYmlsZTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGUgZGV0ZWN0ZWQgcGhvbmUgdHlwZS9mYW1pbHkgc3RyaW5nIG9yIDx0dD5udWxsPC90dD4uXG4gICAgICAgICAqIDxicj5cbiAgICAgICAgICogVGhlIHJldHVybmVkIHRhYmxldCAoZmFtaWx5IG9yIHByb2R1Y2VyKSBpcyBvbmUgb2YgZm9sbG93aW5nIGtleXM6PGJyPlxuICAgICAgICAgKiA8YnI+PHR0PmlQaG9uZSwgQmxhY2tCZXJyeSwgSFRDLCBOZXh1cywgRGVsbCwgTW90b3JvbGEsIFNhbXN1bmcsIExHLCBTb255LCBBc3VzLFxuICAgICAgICAgKiBOb2tpYUx1bWlhLCBNaWNyb21heCwgUGFsbSwgVmVydHUsIFBhbnRlY2gsIEZseSwgV2lrbywgaU1vYmlsZSwgU2ltVmFsbGV5LFxuICAgICAgICAgKiBXb2xmZ2FuZywgQWxjYXRlbCwgTmludGVuZG8sIEFtb2ksIElOUSwgR2VuZXJpY1Bob25lPC90dD48YnI+XG4gICAgICAgICAqIDxicj5cbiAgICAgICAgICogSWYgdGhlIGRldmljZSBpcyBub3QgZGV0ZWN0ZWQgYnkgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZnJvbSBNb2JpbGUtRGV0ZWN0LCBhIHRlc3QgaXMgbWFkZSBhZ2FpbnN0XG4gICAgICAgICAqIHRoZSBwYXR0ZXJucyBvZiA8YSBocmVmPVwiaHR0cDovL2RldGVjdG1vYmlsZWJyb3dzZXJzLmNvbS9cIj5kZXRlY3Rtb2JpbGVicm93c2Vycy5jb208L2E+LiBJZiB0aGlzIHRlc3RcbiAgICAgICAgICogaXMgcG9zaXRpdmUsIGEgdmFsdWUgb2YgPGNvZGU+VW5rbm93blBob25lPC9jb2RlPiBvciA8Y29kZT5Vbmtub3duTW9iaWxlPC9jb2RlPiBpcyByZXR1cm5lZC48YnI+XG4gICAgICAgICAqIFdoZW4gdXNlZCBpbiBicm93c2VyLCB0aGUgZGVjaXNpb24gd2hldGhlciBwaG9uZSBvciB0YWJsZXQgaXMgbWFkZSBiYXNlZCBvbiA8Y29kZT5zY3JlZW4ud2lkdGgvaGVpZ2h0PC9jb2RlPi48YnI+XG4gICAgICAgICAqIDxicj5cbiAgICAgICAgICogV2hlbiB1c2VkIHNlcnZlci1zaWRlIChub2RlLmpzKSwgdGhlcmUgaXMgbm8gd2F5IHRvIHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiA8Y29kZT5Vbmtub3duVGFibGV0PC9jb2RlPlxuICAgICAgICAgKiBhbmQgPGNvZGU+VW5rbm93bk1vYmlsZTwvY29kZT4sIHNvIHlvdSB3aWxsIGdldCA8Y29kZT5udWxsPC9jb2RlPiBoZXJlLCB3aGlsZSB7QGxpbmsgTW9iaWxlRGV0ZWN0I21vYmlsZX1cbiAgICAgICAgICogd2lsbCByZXR1cm4gPGNvZGU+VW5rbm93bk1vYmlsZTwvY29kZT4uPGJyPlxuICAgICAgICAgKiBCZSBhd2FyZSB0aGF0IHNpbmNlIHYxLjAuMCBpbiB0aGlzIHNwZWNpYWwgY2FzZSB5b3Ugd2lsbCBnZXQgPGNvZGU+VW5rbm93bk1vYmlsZTwvY29kZT4gb25seSBmb3I6XG4gICAgICAgICAqIHtAbGluayBNb2JpbGVEZXRlY3QjbW9iaWxlfSwgbm90IGZvciB7QGxpbmsgTW9iaWxlRGV0ZWN0I3Bob25lfSBhbmQge0BsaW5rIE1vYmlsZURldGVjdCN0YWJsZXR9LlxuICAgICAgICAgKiBJbiB2ZXJzaW9ucyBiZWZvcmUgdjEuMC4wIGFsbCAzIG1ldGhvZHMgcmV0dXJuZWQgPGNvZGU+VW5rbm93bk1vYmlsZTwvY29kZT4gd2hpY2ggd2FzIHRlZGlvdXMgdG8gdXNlLlxuICAgICAgICAgKiA8YnI+XG4gICAgICAgICAqIEluIG1vc3QgY2FzZXMgeW91IHdpbGwgdXNlIHRoZSByZXR1cm4gdmFsdWUganVzdCBhcyBhIGJvb2xlYW4uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSBrZXkgb2YgdGhlIHBob25lIGZhbWlseSBvciBwcm9kdWNlciwgZS5nLiBcImlQaG9uZVwiXG4gICAgICAgICAqIEBmdW5jdGlvbiBNb2JpbGVEZXRlY3QjcGhvbmVcbiAgICAgICAgICovXG4gICAgICAgIHBob25lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpbXBsLnByZXBhcmVEZXRlY3Rpb25DYWNoZSh0aGlzLl9jYWNoZSwgdGhpcy51YSwgdGhpcy5tYXhQaG9uZVdpZHRoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZS5waG9uZTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGUgZGV0ZWN0ZWQgdGFibGV0IHR5cGUvZmFtaWx5IHN0cmluZyBvciA8dHQ+bnVsbDwvdHQ+LlxuICAgICAgICAgKiA8YnI+XG4gICAgICAgICAqIFRoZSByZXR1cm5lZCB0YWJsZXQgKGZhbWlseSBvciBwcm9kdWNlcikgaXMgb25lIG9mIGZvbGxvd2luZyBrZXlzOjxicj5cbiAgICAgICAgICogPGJyPjx0dD5pUGFkLCBOZXh1c1RhYmxldCwgU2Ftc3VuZ1RhYmxldCwgS2luZGxlLCBTdXJmYWNlVGFibGV0LCBIUFRhYmxldCwgQXN1c1RhYmxldCxcbiAgICAgICAgICogQmxhY2tCZXJyeVRhYmxldCwgSFRDdGFibGV0LCBNb3Rvcm9sYVRhYmxldCwgTm9va1RhYmxldCwgQWNlclRhYmxldCxcbiAgICAgICAgICogVG9zaGliYVRhYmxldCwgTEdUYWJsZXQsIEZ1aml0c3VUYWJsZXQsIFByZXN0aWdpb1RhYmxldCwgTGVub3ZvVGFibGV0LFxuICAgICAgICAgKiBEZWxsVGFibGV0LCBZYXJ2aWtUYWJsZXQsIE1lZGlvblRhYmxldCwgQXJub3ZhVGFibGV0LCBJbnRlbnNvVGFibGV0LCBJUlVUYWJsZXQsXG4gICAgICAgICAqIE1lZ2Fmb25UYWJsZXQsIEVib2RhVGFibGV0LCBBbGxWaWV3VGFibGV0LCBBcmNob3NUYWJsZXQsIEFpbm9sVGFibGV0LFxuICAgICAgICAgKiBOb2tpYUx1bWlhVGFibGV0LCBTb255VGFibGV0LCBQaGlsaXBzVGFibGV0LCBDdWJlVGFibGV0LCBDb2J5VGFibGV0LCBNSURUYWJsZXQsXG4gICAgICAgICAqIE1TSVRhYmxldCwgU01pVFRhYmxldCwgUm9ja0NoaXBUYWJsZXQsIEZseVRhYmxldCwgYnFUYWJsZXQsIEh1YXdlaVRhYmxldCxcbiAgICAgICAgICogTmVjVGFibGV0LCBQYW50ZWNoVGFibGV0LCBCcm9uY2hvVGFibGV0LCBWZXJzdXNUYWJsZXQsIFp5bmNUYWJsZXQsXG4gICAgICAgICAqIFBvc2l0aXZvVGFibGV0LCBOYWJpVGFibGV0LCBLb2JvVGFibGV0LCBEYW5ld1RhYmxldCwgVGV4ZXRUYWJsZXQsXG4gICAgICAgICAqIFBsYXlzdGF0aW9uVGFibGV0LCBUcmVrc3RvclRhYmxldCwgUHlsZUF1ZGlvVGFibGV0LCBBZHZhblRhYmxldCxcbiAgICAgICAgICogRGFueVRlY2hUYWJsZXQsIEdhbGFwYWRUYWJsZXQsIE1pY3JvbWF4VGFibGV0LCBLYXJib25uVGFibGV0LCBBbGxGaW5lVGFibGV0LFxuICAgICAgICAgKiBQUk9TQ0FOVGFibGV0LCBZT05FU1RhYmxldCwgQ2hhbmdKaWFUYWJsZXQsIEdVVGFibGV0LCBQb2ludE9mVmlld1RhYmxldCxcbiAgICAgICAgICogT3Zlcm1heFRhYmxldCwgSENMVGFibGV0LCBEUFNUYWJsZXQsIFZpc3R1cmVUYWJsZXQsIENyZXN0YVRhYmxldCxcbiAgICAgICAgICogTWVkaWF0ZWtUYWJsZXQsIENvbmNvcmRlVGFibGV0LCBHb0NsZXZlclRhYmxldCwgTW9kZWNvbVRhYmxldCwgVm9uaW5vVGFibGV0LFxuICAgICAgICAgKiBFQ1NUYWJsZXQsIFN0b3JleFRhYmxldCwgVm9kYWZvbmVUYWJsZXQsIEVzc2VudGllbEJUYWJsZXQsIFJvc3NNb29yVGFibGV0LFxuICAgICAgICAgKiBpTW9iaWxlVGFibGV0LCBUb2xpbm9UYWJsZXQsIEF1ZGlvU29uaWNUYWJsZXQsIEFNUEVUYWJsZXQsIFNra1RhYmxldCxcbiAgICAgICAgICogVGVjbm9UYWJsZXQsIEpYRFRhYmxldCwgaUpveVRhYmxldCwgRlgyVGFibGV0LCBYb3JvVGFibGV0LCBWaWV3c29uaWNUYWJsZXQsXG4gICAgICAgICAqIE9keXNUYWJsZXQsIENhcHRpdmFUYWJsZXQsIEljb25iaXRUYWJsZXQsIFRlY2xhc3RUYWJsZXQsIE9uZGFUYWJsZXQsXG4gICAgICAgICAqIEpheXRlY2hUYWJsZXQsIEJsYXVwdW5rdFRhYmxldCwgRGlnbWFUYWJsZXQsIEV2b2xpb1RhYmxldCwgTGF2YVRhYmxldCxcbiAgICAgICAgICogQW9jVGFibGV0LCBNcG1hblRhYmxldCwgQ2Vsa29uVGFibGV0LCBXb2xkZXJUYWJsZXQsIE1pVGFibGV0LCBOaWJpcnVUYWJsZXQsXG4gICAgICAgICAqIE5leG9UYWJsZXQsIExlYWRlclRhYmxldCwgVWJpc2xhdGVUYWJsZXQsIFBvY2tldEJvb2tUYWJsZXQsIEtvY2Fzb1RhYmxldCxcbiAgICAgICAgICogSGlzZW5zZVRhYmxldCwgSHVkbCwgVGVsc3RyYVRhYmxldCwgR2VuZXJpY1RhYmxldDwvdHQ+PGJyPlxuICAgICAgICAgKiA8YnI+XG4gICAgICAgICAqIElmIHRoZSBkZXZpY2UgaXMgbm90IGRldGVjdGVkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb25zIGZyb20gTW9iaWxlLURldGVjdCwgYSB0ZXN0IGlzIG1hZGUgYWdhaW5zdFxuICAgICAgICAgKiB0aGUgcGF0dGVybnMgb2YgPGEgaHJlZj1cImh0dHA6Ly9kZXRlY3Rtb2JpbGVicm93c2Vycy5jb20vXCI+ZGV0ZWN0bW9iaWxlYnJvd3NlcnMuY29tPC9hPi4gSWYgdGhpcyB0ZXN0XG4gICAgICAgICAqIGlzIHBvc2l0aXZlLCBhIHZhbHVlIG9mIDxjb2RlPlVua25vd25UYWJsZXQ8L2NvZGU+IG9yIDxjb2RlPlVua25vd25Nb2JpbGU8L2NvZGU+IGlzIHJldHVybmVkLjxicj5cbiAgICAgICAgICogV2hlbiB1c2VkIGluIGJyb3dzZXIsIHRoZSBkZWNpc2lvbiB3aGV0aGVyIHBob25lIG9yIHRhYmxldCBpcyBtYWRlIGJhc2VkIG9uIDxjb2RlPnNjcmVlbi53aWR0aC9oZWlnaHQ8L2NvZGU+Ljxicj5cbiAgICAgICAgICogPGJyPlxuICAgICAgICAgKiBXaGVuIHVzZWQgc2VydmVyLXNpZGUgKG5vZGUuanMpLCB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDxjb2RlPlVua25vd25UYWJsZXQ8L2NvZGU+XG4gICAgICAgICAqIGFuZCA8Y29kZT5Vbmtub3duTW9iaWxlPC9jb2RlPiwgc28geW91IHdpbGwgZ2V0IDxjb2RlPm51bGw8L2NvZGU+IGhlcmUsIHdoaWxlIHtAbGluayBNb2JpbGVEZXRlY3QjbW9iaWxlfVxuICAgICAgICAgKiB3aWxsIHJldHVybiA8Y29kZT5Vbmtub3duTW9iaWxlPC9jb2RlPi48YnI+XG4gICAgICAgICAqIEJlIGF3YXJlIHRoYXQgc2luY2UgdjEuMC4wIGluIHRoaXMgc3BlY2lhbCBjYXNlIHlvdSB3aWxsIGdldCA8Y29kZT5Vbmtub3duTW9iaWxlPC9jb2RlPiBvbmx5IGZvcjpcbiAgICAgICAgICoge0BsaW5rIE1vYmlsZURldGVjdCNtb2JpbGV9LCBub3QgZm9yIHtAbGluayBNb2JpbGVEZXRlY3QjcGhvbmV9IGFuZCB7QGxpbmsgTW9iaWxlRGV0ZWN0I3RhYmxldH0uXG4gICAgICAgICAqIEluIHZlcnNpb25zIGJlZm9yZSB2MS4wLjAgYWxsIDMgbWV0aG9kcyByZXR1cm5lZCA8Y29kZT5Vbmtub3duTW9iaWxlPC9jb2RlPiB3aGljaCB3YXMgdGVkaW91cyB0byB1c2UuXG4gICAgICAgICAqIDxicj5cbiAgICAgICAgICogSW4gbW9zdCBjYXNlcyB5b3Ugd2lsbCB1c2UgdGhlIHJldHVybiB2YWx1ZSBqdXN0IGFzIGEgYm9vbGVhbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gdGhlIGtleSBvZiB0aGUgdGFibGV0IGZhbWlseSBvciBwcm9kdWNlciwgZS5nLiBcIlNhbXN1bmdUYWJsZXRcIlxuICAgICAgICAgKiBAZnVuY3Rpb24gTW9iaWxlRGV0ZWN0I3RhYmxldFxuICAgICAgICAgKi9cbiAgICAgICAgdGFibGV0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpbXBsLnByZXBhcmVEZXRlY3Rpb25DYWNoZSh0aGlzLl9jYWNoZSwgdGhpcy51YSwgdGhpcy5tYXhQaG9uZVdpZHRoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZS50YWJsZXQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIChmaXJzdCkgZGV0ZWN0ZWQgdXNlci1hZ2VudCBzdHJpbmcgb3IgPHR0Pm51bGw8L3R0Pi5cbiAgICAgICAgICogPGJyPlxuICAgICAgICAgKiBUaGUgcmV0dXJuZWQgdXNlci1hZ2VudCBpcyBvbmUgb2YgZm9sbG93aW5nIGtleXM6PGJyPlxuICAgICAgICAgKiA8YnI+PHR0PkNocm9tZSwgRG9sZmluLCBPcGVyYSwgU2t5ZmlyZSwgRWRnZSwgSUUsIEZpcmVmb3gsIEJvbHQsIFRlYVNoYXJrLCBCbGF6ZXIsXG4gICAgICAgICAqIFNhZmFyaSwgVUNCcm93c2VyLCBiYWlkdWJveGFwcCwgYmFpZHVicm93c2VyLCBEaWlnb0Jyb3dzZXIsIFB1ZmZpbiwgTWVyY3VyeSxcbiAgICAgICAgICogT2JpZ29Ccm93c2VyLCBOZXRGcm9udCwgR2VuZXJpY0Jyb3dzZXIsIFBhbGVNb29uPC90dD48YnI+XG4gICAgICAgICAqIDxicj5cbiAgICAgICAgICogSW4gbW9zdCBjYXNlcyBjYWxsaW5nIHtAbGluayBNb2JpbGVEZXRlY3QjdXNlckFnZW50fSB3aWxsIGJlIHN1ZmZpY2llbnQuIEJ1dCB0aGVyZSBhcmUgcmFyZVxuICAgICAgICAgKiBjYXNlcyB3aGVyZSBhIG1vYmlsZSBkZXZpY2UgcHJldGVuZHMgdG8gYmUgbW9yZSB0aGFuIG9uZSBwYXJ0aWN1bGFyIGJyb3dzZXIuIFlvdSBjYW4gZ2V0IHRoZVxuICAgICAgICAgKiBsaXN0IG9mIGFsbCBtYXRjaGVzIHdpdGgge0BsaW5rIE1vYmlsZURldGVjdCN1c2VyQWdlbnRzfSBvciBjaGVjayBmb3IgYSBwYXJ0aWN1bGFyIHZhbHVlIGJ5XG4gICAgICAgICAqIHByb3ZpZGluZyBvbmUgb2YgdGhlIGRlZmluZWQga2V5cyBhcyBmaXJzdCBhcmd1bWVudCB0byB7QGxpbmsgTW9iaWxlRGV0ZWN0I2lzfS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gdGhlIGtleSBmb3IgdGhlIGRldGVjdGVkIHVzZXItYWdlbnQgb3IgPHR0Pm51bGw8L3R0PlxuICAgICAgICAgKiBAZnVuY3Rpb24gTW9iaWxlRGV0ZWN0I3VzZXJBZ2VudFxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckFnZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2FjaGUudXNlckFnZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZS51c2VyQWdlbnQgPSBpbXBsLmZpbmRNYXRjaChpbXBsLm1vYmlsZURldGVjdFJ1bGVzLnVhcywgdGhpcy51YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGUudXNlckFnZW50O1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGFsbCBkZXRlY3RlZCB1c2VyLWFnZW50IHN0cmluZ3MuXG4gICAgICAgICAqIDxicj5cbiAgICAgICAgICogVGhlIGFycmF5IGlzIGVtcHR5IG9yIGNvbnRhaW5zIG9uZSBvciBtb3JlIG9mIGZvbGxvd2luZyBrZXlzOjxicj5cbiAgICAgICAgICogPGJyPjx0dD5DaHJvbWUsIERvbGZpbiwgT3BlcmEsIFNreWZpcmUsIEVkZ2UsIElFLCBGaXJlZm94LCBCb2x0LCBUZWFTaGFyaywgQmxhemVyLFxuICAgICAgICAgKiBTYWZhcmksIFVDQnJvd3NlciwgYmFpZHVib3hhcHAsIGJhaWR1YnJvd3NlciwgRGlpZ29Ccm93c2VyLCBQdWZmaW4sIE1lcmN1cnksXG4gICAgICAgICAqIE9iaWdvQnJvd3NlciwgTmV0RnJvbnQsIEdlbmVyaWNCcm93c2VyLCBQYWxlTW9vbjwvdHQ+PGJyPlxuICAgICAgICAgKiA8YnI+XG4gICAgICAgICAqIEluIG1vc3QgY2FzZXMgY2FsbGluZyB7QGxpbmsgTW9iaWxlRGV0ZWN0I3VzZXJBZ2VudH0gd2lsbCBiZSBzdWZmaWNpZW50LiBCdXQgdGhlcmUgYXJlIHJhcmVcbiAgICAgICAgICogY2FzZXMgd2hlcmUgYSBtb2JpbGUgZGV2aWNlIHByZXRlbmRzIHRvIGJlIG1vcmUgdGhhbiBvbmUgcGFydGljdWxhciBicm93c2VyLiBZb3UgY2FuIGdldCB0aGVcbiAgICAgICAgICogbGlzdCBvZiBhbGwgbWF0Y2hlcyB3aXRoIHtAbGluayBNb2JpbGVEZXRlY3QjdXNlckFnZW50c30gb3IgY2hlY2sgZm9yIGEgcGFydGljdWxhciB2YWx1ZSBieVxuICAgICAgICAgKiBwcm92aWRpbmcgb25lIG9mIHRoZSBkZWZpbmVkIGtleXMgYXMgZmlyc3QgYXJndW1lbnQgdG8ge0BsaW5rIE1vYmlsZURldGVjdCNpc30uXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gdGhlIGFycmF5IG9mIGRldGVjdGVkIHVzZXItYWdlbnQga2V5cyBvciA8dHQ+W108L3R0PlxuICAgICAgICAgKiBAZnVuY3Rpb24gTW9iaWxlRGV0ZWN0I3VzZXJBZ2VudHNcbiAgICAgICAgICovXG4gICAgICAgIHVzZXJBZ2VudHM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWNoZS51c2VyQWdlbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZS51c2VyQWdlbnRzID0gaW1wbC5maW5kTWF0Y2hlcyhpbXBsLm1vYmlsZURldGVjdFJ1bGVzLnVhcywgdGhpcy51YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGUudXNlckFnZW50cztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGUgZGV0ZWN0ZWQgb3BlcmF0aW5nIHN5c3RlbSBzdHJpbmcgb3IgPHR0Pm51bGw8L3R0Pi5cbiAgICAgICAgICogPGJyPlxuICAgICAgICAgKiBUaGUgb3BlcmF0aW5nIHN5c3RlbSBpcyBvbmUgb2YgZm9sbG93aW5nIGtleXM6PGJyPlxuICAgICAgICAgKiA8YnI+PHR0PkFuZHJvaWRPUywgQmxhY2tCZXJyeU9TLCBQYWxtT1MsIFN5bWJpYW5PUywgV2luZG93c01vYmlsZU9TLCBXaW5kb3dzUGhvbmVPUyxcbiAgICAgICAgICogaU9TLCBNZWVHb09TLCBNYWVtb09TLCBKYXZhT1MsIHdlYk9TLCBiYWRhT1MsIEJSRVdPUzwvdHQ+PGJyPlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUga2V5IGZvciB0aGUgZGV0ZWN0ZWQgb3BlcmF0aW5nIHN5c3RlbS5cbiAgICAgICAgICogQGZ1bmN0aW9uIE1vYmlsZURldGVjdCNvc1xuICAgICAgICAgKi9cbiAgICAgICAgb3M6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWNoZS5vcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGUub3MgPSBpbXBsLmRldGVjdE9TKHRoaXMudWEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlLm9zO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgdGhlIHZlcnNpb24gKGFzIE51bWJlcikgb2YgdGhlIGdpdmVuIHByb3BlcnR5IGluIHRoZSBVc2VyLUFnZW50LlxuICAgICAgICAgKiA8YnI+XG4gICAgICAgICAqIFdpbGwgcmV0dXJuIGEgZmxvYXQgbnVtYmVyLiAoZWcuIDJfMCB3aWxsIHJldHVybiAyLjAsIDQuMy4xIHdpbGwgcmV0dXJuIDQuMzEpXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgYSBrZXkgZGVmaW5pbmcgYSB0aGluZyB3aGljaCBoYXMgYSB2ZXJzaW9uLjxicj5cbiAgICAgICAgICogICAgICAgIFlvdSBjYW4gdXNlIG9uZSBvZiBmb2xsb3dpbmcga2V5czo8YnI+XG4gICAgICAgICAqIDxicj48dHQ+TW9iaWxlLCBCdWlsZCwgVmVyc2lvbiwgVmVuZG9ySUQsIGlQYWQsIGlQaG9uZSwgaVBvZCwgS2luZGxlLCBDaHJvbWUsIENvYXN0LFxuICAgICAgICAgKiBEb2xmaW4sIEZpcmVmb3gsIEZlbm5lYywgRWRnZSwgSUUsIE5ldEZyb250LCBOb2tpYUJyb3dzZXIsIE9wZXJhLCBPcGVyYSBNaW5pLFxuICAgICAgICAgKiBPcGVyYSBNb2JpLCBVQyBCcm93c2VyLCBNUVFCcm93c2VyLCBNaWNyb01lc3NlbmdlciwgYmFpZHVib3hhcHAsIGJhaWR1YnJvd3NlcixcbiAgICAgICAgICogU2Ftc3VuZ0Jyb3dzZXIsIElyb24sIFNhZmFyaSwgU2t5ZmlyZSwgVGl6ZW4sIFdlYmtpdCwgUGFsZU1vb24sIEdlY2tvLCBUcmlkZW50LFxuICAgICAgICAgKiBQcmVzdG8sIEdvYW5uYSwgaU9TLCBBbmRyb2lkLCBCbGFja0JlcnJ5LCBCUkVXLCBKYXZhLCBXaW5kb3dzIFBob25lIE9TLCBXaW5kb3dzXG4gICAgICAgICAqIFBob25lLCBXaW5kb3dzIENFLCBXaW5kb3dzIE5ULCBTeW1iaWFuLCB3ZWJPUzwvdHQ+PGJyPlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7TnVtYmVyfSB0aGUgdmVyc2lvbiBhcyBmbG9hdCBvciA8dHQ+TmFOPC90dD4gaWYgVXNlci1BZ2VudCBkb2Vzbid0IGNvbnRhaW4gdGhpcyB2ZXJzaW9uLlxuICAgICAgICAgKiAgICAgICAgICBCZSBjYXJlZnVsIHdoZW4gY29tcGFyaW5nIHRoaXMgdmFsdWUgd2l0aCAnPT0nIG9wZXJhdG9yIVxuICAgICAgICAgKiBAZnVuY3Rpb24gTW9iaWxlRGV0ZWN0I3ZlcnNpb25cbiAgICAgICAgICovXG4gICAgICAgIHZlcnNpb246IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbXBsLmdldFZlcnNpb24oa2V5LCB0aGlzLnVhKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IHRoZSB2ZXJzaW9uIChhcyBTdHJpbmcpIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eSBpbiB0aGUgVXNlci1BZ2VudC5cbiAgICAgICAgICogPGJyPlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IGEga2V5IGRlZmluaW5nIGEgdGhpbmcgd2hpY2ggaGFzIGEgdmVyc2lvbi48YnI+XG4gICAgICAgICAqICAgICAgICBZb3UgY2FuIHVzZSBvbmUgb2YgZm9sbG93aW5nIGtleXM6PGJyPlxuICAgICAgICAgKiA8YnI+PHR0Pk1vYmlsZSwgQnVpbGQsIFZlcnNpb24sIFZlbmRvcklELCBpUGFkLCBpUGhvbmUsIGlQb2QsIEtpbmRsZSwgQ2hyb21lLCBDb2FzdCxcbiAgICAgICAgICogRG9sZmluLCBGaXJlZm94LCBGZW5uZWMsIEVkZ2UsIElFLCBOZXRGcm9udCwgTm9raWFCcm93c2VyLCBPcGVyYSwgT3BlcmEgTWluaSxcbiAgICAgICAgICogT3BlcmEgTW9iaSwgVUMgQnJvd3NlciwgTVFRQnJvd3NlciwgTWljcm9NZXNzZW5nZXIsIGJhaWR1Ym94YXBwLCBiYWlkdWJyb3dzZXIsXG4gICAgICAgICAqIFNhbXN1bmdCcm93c2VyLCBJcm9uLCBTYWZhcmksIFNreWZpcmUsIFRpemVuLCBXZWJraXQsIFBhbGVNb29uLCBHZWNrbywgVHJpZGVudCxcbiAgICAgICAgICogUHJlc3RvLCBHb2FubmEsIGlPUywgQW5kcm9pZCwgQmxhY2tCZXJyeSwgQlJFVywgSmF2YSwgV2luZG93cyBQaG9uZSBPUywgV2luZG93c1xuICAgICAgICAgKiBQaG9uZSwgV2luZG93cyBDRSwgV2luZG93cyBOVCwgU3ltYmlhbiwgd2ViT1M8L3R0Pjxicj5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gdGhlIFwicmF3XCIgdmVyc2lvbiBhcyBTdHJpbmcgb3IgPHR0Pm51bGw8L3R0PiBpZiBVc2VyLUFnZW50IGRvZXNuJ3QgY29udGFpbiB0aGlzIHZlcnNpb24uXG4gICAgICAgICAqXG4gICAgICAgICAqIEBmdW5jdGlvbiBNb2JpbGVEZXRlY3QjdmVyc2lvblN0clxuICAgICAgICAgKi9cbiAgICAgICAgdmVyc2lvblN0cjogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGltcGwuZ2V0VmVyc2lvblN0cihrZXksIHRoaXMudWEpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHbG9iYWwgdGVzdCBrZXkgYWdhaW5zdCB1c2VyQWdlbnQsIG9zLCBwaG9uZSwgdGFibGV0IGFuZCBzb21lIG90aGVyIHByb3BlcnRpZXMgb2YgdXNlckFnZW50IHN0cmluZy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUga2V5IChjYXNlLWluc2Vuc2l0aXZlKSBvZiBhIHVzZXJBZ2VudCwgYW4gb3BlcmF0aW5nIHN5c3RlbSwgcGhvbmUgb3JcbiAgICAgICAgICogICAgICAgIHRhYmxldCBmYW1pbHkuPGJyPlxuICAgICAgICAgKiAgICAgICAgRm9yIGEgY29tcGxldGUgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMsIHNlZSB7QGxpbmsgTW9iaWxlRGV0ZWN0I3VzZXJBZ2VudH0sXG4gICAgICAgICAqICAgICAgICB7QGxpbmsgTW9iaWxlRGV0ZWN0I29zfSwge0BsaW5rIE1vYmlsZURldGVjdCNwaG9uZX0sIHtAbGluayBNb2JpbGVEZXRlY3QjdGFibGV0fS48YnI+XG4gICAgICAgICAqICAgICAgICBBZGRpdGlvbmFsbHkgeW91IGhhdmUgZm9sbG93aW5nIGtleXM6PGJyPlxuICAgICAgICAgKiA8YnI+PHR0PkJvdCwgTW9iaWxlQm90LCBEZXNrdG9wTW9kZSwgVFYsIFdlYktpdCwgQ29uc29sZSwgV2F0Y2g8L3R0Pjxicj5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IDx0dD50cnVlPC90dD4gd2hlbiB0aGUgZ2l2ZW4ga2V5IGlzIG9uZSBvZiB0aGUgZGVmaW5lZCBrZXlzIG9mIHVzZXJBZ2VudCwgb3MsIHBob25lLFxuICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgdGFibGV0IG9yIG9uZSBvZiB0aGUgbGlzdGVkIGFkZGl0aW9uYWwga2V5cywgb3RoZXJ3aXNlIDx0dD5mYWxzZTwvdHQ+XG4gICAgICAgICAqIEBmdW5jdGlvbiBNb2JpbGVEZXRlY3QjaXNcbiAgICAgICAgICovXG4gICAgICAgIGlzOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGFpbnNJQyh0aGlzLnVzZXJBZ2VudHMoKSwga2V5KSB8fFxuICAgICAgICAgICAgICAgICAgIGVxdWFsSUMoa2V5LCB0aGlzLm9zKCkpIHx8XG4gICAgICAgICAgICAgICAgICAgZXF1YWxJQyhrZXksIHRoaXMucGhvbmUoKSkgfHxcbiAgICAgICAgICAgICAgICAgICBlcXVhbElDKGtleSwgdGhpcy50YWJsZXQoKSkgfHxcbiAgICAgICAgICAgICAgICAgICBjb250YWluc0lDKGltcGwuZmluZE1hdGNoZXMoaW1wbC5tb2JpbGVEZXRlY3RSdWxlcy51dGlscywgdGhpcy51YSksIGtleSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERvIGEgcXVpY2sgdGVzdCBhZ2FpbnN0IG5hdmlnYXRvcjo6dXNlckFnZW50LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IHBhdHRlcm4gdGhlIHBhdHRlcm4sIGVpdGhlciBhcyBTdHJpbmcgb3IgUmVnRXhwXG4gICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgKGEgc3RyaW5nIHdpbGwgYmUgY29udmVydGVkIHRvIGEgY2FzZS1pbnNlbnNpdGl2ZSBSZWdFeHApLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gPHR0PnRydWU8L3R0PiB3aGVuIHRoZSBwYXR0ZXJuIG1hdGNoZXMsIG90aGVyd2lzZSA8dHQ+ZmFsc2U8L3R0PlxuICAgICAgICAgKiBAZnVuY3Rpb24gTW9iaWxlRGV0ZWN0I21hdGNoXG4gICAgICAgICAqL1xuICAgICAgICBtYXRjaDogZnVuY3Rpb24gKHBhdHRlcm4pIHtcbiAgICAgICAgICAgIGlmICghKHBhdHRlcm4gaW5zdGFuY2VvZiBSZWdFeHApKSB7XG4gICAgICAgICAgICAgICAgcGF0dGVybiA9IG5ldyBSZWdFeHAocGF0dGVybiwgJ2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QodGhpcy51YSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBtb2JpbGUgZGV2aWNlIGNhbiBiZSBjb25zaWRlcmVkIGFzIHBob25lIHJlZ2FyZGluZyA8Y29kZT5zY3JlZW4ud2lkdGg8L2NvZGU+LlxuICAgICAgICAgKiA8YnI+XG4gICAgICAgICAqIE9idmlvdXNseSB0aGlzIG1ldGhvZCBtYWtlcyBzZW5zZSBpbiBicm93c2VyIGVudmlyb25tZW50cyBvbmx5IChub3QgZm9yIE5vZGUuanMpIVxuICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW21heFBob25lV2lkdGhdIHRoZSBtYXhpbXVtIGxvZ2ljYWwgcGl4ZWxzIChha2EuIENTUy1waXhlbHMpIHRvIGJlIGNvbnNpZGVyZWQgYXMgcGhvbmUuPGJyPlxuICAgICAgICAgKiAgICAgICAgVGhlIGFyZ3VtZW50IGlzIG9wdGlvbmFsIGFuZCBpZiBub3QgcHJlc2VudCBvciBmYWxzeSwgdGhlIHZhbHVlIG9mIHRoZSBjb25zdHJ1Y3RvciBpcyB0YWtlbi5cbiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW58dW5kZWZpbmVkfSA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGlmIHNjcmVlbiBzaXplIHdhc24ndCBkZXRlY3RhYmxlLCBlbHNlIDxjb2RlPnRydWU8L2NvZGU+XG4gICAgICAgICAqICAgICAgICAgIHdoZW4gc2NyZWVuLndpZHRoIGlzIGxlc3Mgb3IgZXF1YWwgdG8gbWF4UGhvbmVXaWR0aCwgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi48YnI+XG4gICAgICAgICAqICAgICAgICAgIFdpbGwgYWx3YXlzIHJldHVybiA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IHNlcnZlci1zaWRlLlxuICAgICAgICAgKi9cbiAgICAgICAgaXNQaG9uZVNpemVkOiBmdW5jdGlvbiAobWF4UGhvbmVXaWR0aCkge1xuICAgICAgICAgICAgcmV0dXJuIE1vYmlsZURldGVjdC5pc1Bob25lU2l6ZWQobWF4UGhvbmVXaWR0aCB8fCB0aGlzLm1heFBob25lV2lkdGgpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBtb2JpbGUgZ3JhZGUgKCdBJywgJ0InLCAnQycpLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBvbmUgb2YgdGhlIG1vYmlsZSBncmFkZXMgKCdBJywgJ0InLCAnQycpLlxuICAgICAgICAgKiBAZnVuY3Rpb24gTW9iaWxlRGV0ZWN0I21vYmlsZUdyYWRlXG4gICAgICAgICAqL1xuICAgICAgICBtb2JpbGVHcmFkZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlLmdyYWRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZS5ncmFkZSA9IGltcGwubW9iaWxlR3JhZGUodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGUuZ3JhZGU7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gZW52aXJvbm1lbnQtZGVwZW5kZW50XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5zY3JlZW4pIHtcbiAgICAgICAgTW9iaWxlRGV0ZWN0LmlzUGhvbmVTaXplZCA9IGZ1bmN0aW9uIChtYXhQaG9uZVdpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm4gbWF4UGhvbmVXaWR0aCA8IDAgPyB1bmRlZmluZWQgOiBpbXBsLmdldERldmljZVNtYWxsZXJTaWRlKCkgPD0gbWF4UGhvbmVXaWR0aDtcbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBNb2JpbGVEZXRlY3QuaXNQaG9uZVNpemVkID0gZnVuY3Rpb24gKCkge307XG4gICAgfVxuXG4gICAgLy8gc2hvdWxkIG5vdCBiZSByZXBsYWNlZCBieSBhIGNvbXBsZXRlbHkgbmV3IG9iamVjdCAtIGp1c3Qgb3ZlcndyaXRlIGV4aXN0aW5nIG1ldGhvZHNcbiAgICBNb2JpbGVEZXRlY3QuX2ltcGwgPSBpbXBsO1xuICAgIFxuICAgIE1vYmlsZURldGVjdC52ZXJzaW9uID0gJzEuMy42IDIwMTctMDQtMDUnO1xuXG4gICAgcmV0dXJuIE1vYmlsZURldGVjdDtcbn0pOyAvLyBlbmQgb2YgY2FsbCBvZiBkZWZpbmUoKVxufSkoKGZ1bmN0aW9uICh1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChmYWN0b3J5KSB7IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpOyB9O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmU7XG4gICAgfSBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGZhY3RvcnkpIHsgd2luZG93Lk1vYmlsZURldGVjdCA9IGZhY3RvcnkoKTsgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBwbGVhc2UgZmlsZSBhIGJ1ZyBpZiB5b3UgZ2V0IHRoaXMgZXJyb3IhXG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBlbnZpcm9ubWVudCcpO1xuICAgIH1cbn0pKCkpOyIsIi8qXG5vYmplY3QtYXNzaWduXG4oYykgU2luZHJlIFNvcmh1c1xuQGxpY2Vuc2UgTUlUXG4qL1xuXG4ndXNlIHN0cmljdCc7XG4vKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xudmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHByb3BJc0VudW1lcmFibGUgPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xuXG5mdW5jdGlvbiB0b09iamVjdCh2YWwpIHtcblx0aWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFVzZU5hdGl2ZSgpIHtcblx0dHJ5IHtcblx0XHRpZiAoIU9iamVjdC5hc3NpZ24pIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBEZXRlY3QgYnVnZ3kgcHJvcGVydHkgZW51bWVyYXRpb24gb3JkZXIgaW4gb2xkZXIgVjggdmVyc2lvbnMuXG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD00MTE4XG5cdFx0dmFyIHRlc3QxID0gbmV3IFN0cmluZygnYWJjJyk7ICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ldy13cmFwcGVyc1xuXHRcdHRlc3QxWzVdID0gJ2RlJztcblx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDEpWzBdID09PSAnNScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QyID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG5cdFx0XHR0ZXN0MlsnXycgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG5cdFx0fVxuXHRcdHZhciBvcmRlcjIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MikubWFwKGZ1bmN0aW9uIChuKSB7XG5cdFx0XHRyZXR1cm4gdGVzdDJbbl07XG5cdFx0fSk7XG5cdFx0aWYgKG9yZGVyMi5qb2luKCcnKSAhPT0gJzAxMjM0NTY3ODknKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MyA9IHt9O1xuXHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGxldHRlcikge1xuXHRcdFx0dGVzdDNbbGV0dGVyXSA9IGxldHRlcjtcblx0XHR9KTtcblx0XHRpZiAoT2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSwgdGVzdDMpKS5qb2luKCcnKSAhPT1cblx0XHRcdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHQvLyBXZSBkb24ndCBleHBlY3QgYW55IG9mIHRoZSBhYm92ZSB0byB0aHJvdywgYnV0IGJldHRlciB0byBiZSBzYWZlLlxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNob3VsZFVzZU5hdGl2ZSgpID8gT2JqZWN0LmFzc2lnbiA6IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkge1xuXHR2YXIgZnJvbTtcblx0dmFyIHRvID0gdG9PYmplY3QodGFyZ2V0KTtcblx0dmFyIHN5bWJvbHM7XG5cblx0Zm9yICh2YXIgcyA9IDE7IHMgPCBhcmd1bWVudHMubGVuZ3RoOyBzKyspIHtcblx0XHRmcm9tID0gT2JqZWN0KGFyZ3VtZW50c1tzXSk7XG5cblx0XHRmb3IgKHZhciBrZXkgaW4gZnJvbSkge1xuXHRcdFx0aWYgKGhhc093blByb3BlcnR5LmNhbGwoZnJvbSwga2V5KSkge1xuXHRcdFx0XHR0b1trZXldID0gZnJvbVtrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChnZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRcdHN5bWJvbHMgPSBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZnJvbSk7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHN5bWJvbHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0aWYgKHByb3BJc0VudW1lcmFibGUuY2FsbChmcm9tLCBzeW1ib2xzW2ldKSkge1xuXHRcdFx0XHRcdHRvW3N5bWJvbHNbaV1dID0gZnJvbVtzeW1ib2xzW2ldXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIFRZUEVEX09LID0gICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBVaW50MTZBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBJbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyk7XG5cblxuZXhwb3J0cy5hc3NpZ24gPSBmdW5jdGlvbiAob2JqIC8qZnJvbTEsIGZyb20yLCBmcm9tMywgLi4uKi8pIHtcbiAgdmFyIHNvdXJjZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICB3aGlsZSAoc291cmNlcy5sZW5ndGgpIHtcbiAgICB2YXIgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xuICAgIGlmICghc291cmNlKSB7IGNvbnRpbnVlOyB9XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3Ioc291cmNlICsgJ211c3QgYmUgbm9uLW9iamVjdCcpO1xuICAgIH1cblxuICAgIGZvciAodmFyIHAgaW4gc291cmNlKSB7XG4gICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KHApKSB7XG4gICAgICAgIG9ialtwXSA9IHNvdXJjZVtwXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTtcblxuXG4vLyByZWR1Y2UgYnVmZmVyIHNpemUsIGF2b2lkaW5nIG1lbSBjb3B5XG5leHBvcnRzLnNocmlua0J1ZiA9IGZ1bmN0aW9uIChidWYsIHNpemUpIHtcbiAgaWYgKGJ1Zi5sZW5ndGggPT09IHNpemUpIHsgcmV0dXJuIGJ1ZjsgfVxuICBpZiAoYnVmLnN1YmFycmF5KSB7IHJldHVybiBidWYuc3ViYXJyYXkoMCwgc2l6ZSk7IH1cbiAgYnVmLmxlbmd0aCA9IHNpemU7XG4gIHJldHVybiBidWY7XG59O1xuXG5cbnZhciBmblR5cGVkID0ge1xuICBhcnJheVNldDogZnVuY3Rpb24gKGRlc3QsIHNyYywgc3JjX29mZnMsIGxlbiwgZGVzdF9vZmZzKSB7XG4gICAgaWYgKHNyYy5zdWJhcnJheSAmJiBkZXN0LnN1YmFycmF5KSB7XG4gICAgICBkZXN0LnNldChzcmMuc3ViYXJyYXkoc3JjX29mZnMsIHNyY19vZmZzICsgbGVuKSwgZGVzdF9vZmZzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRmFsbGJhY2sgdG8gb3JkaW5hcnkgYXJyYXlcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkZXN0W2Rlc3Rfb2ZmcyArIGldID0gc3JjW3NyY19vZmZzICsgaV07XG4gICAgfVxuICB9LFxuICAvLyBKb2luIGFycmF5IG9mIGNodW5rcyB0byBzaW5nbGUgYXJyYXkuXG4gIGZsYXR0ZW5DaHVua3M6IGZ1bmN0aW9uIChjaHVua3MpIHtcbiAgICB2YXIgaSwgbCwgbGVuLCBwb3MsIGNodW5rLCByZXN1bHQ7XG5cbiAgICAvLyBjYWxjdWxhdGUgZGF0YSBsZW5ndGhcbiAgICBsZW4gPSAwO1xuICAgIGZvciAoaSA9IDAsIGwgPSBjaHVua3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBsZW4gKz0gY2h1bmtzW2ldLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvLyBqb2luIGNodW5rc1xuICAgIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGxlbik7XG4gICAgcG9zID0gMDtcbiAgICBmb3IgKGkgPSAwLCBsID0gY2h1bmtzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgY2h1bmsgPSBjaHVua3NbaV07XG4gICAgICByZXN1bHQuc2V0KGNodW5rLCBwb3MpO1xuICAgICAgcG9zICs9IGNodW5rLmxlbmd0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59O1xuXG52YXIgZm5VbnR5cGVkID0ge1xuICBhcnJheVNldDogZnVuY3Rpb24gKGRlc3QsIHNyYywgc3JjX29mZnMsIGxlbiwgZGVzdF9vZmZzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdFtkZXN0X29mZnMgKyBpXSA9IHNyY1tzcmNfb2ZmcyArIGldO1xuICAgIH1cbiAgfSxcbiAgLy8gSm9pbiBhcnJheSBvZiBjaHVua3MgdG8gc2luZ2xlIGFycmF5LlxuICBmbGF0dGVuQ2h1bmtzOiBmdW5jdGlvbiAoY2h1bmtzKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgY2h1bmtzKTtcbiAgfVxufTtcblxuXG4vLyBFbmFibGUvRGlzYWJsZSB0eXBlZCBhcnJheXMgdXNlLCBmb3IgdGVzdGluZ1xuLy9cbmV4cG9ydHMuc2V0VHlwZWQgPSBmdW5jdGlvbiAob24pIHtcbiAgaWYgKG9uKSB7XG4gICAgZXhwb3J0cy5CdWY4ICA9IFVpbnQ4QXJyYXk7XG4gICAgZXhwb3J0cy5CdWYxNiA9IFVpbnQxNkFycmF5O1xuICAgIGV4cG9ydHMuQnVmMzIgPSBJbnQzMkFycmF5O1xuICAgIGV4cG9ydHMuYXNzaWduKGV4cG9ydHMsIGZuVHlwZWQpO1xuICB9IGVsc2Uge1xuICAgIGV4cG9ydHMuQnVmOCAgPSBBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjE2ID0gQXJyYXk7XG4gICAgZXhwb3J0cy5CdWYzMiA9IEFycmF5O1xuICAgIGV4cG9ydHMuYXNzaWduKGV4cG9ydHMsIGZuVW50eXBlZCk7XG4gIH1cbn07XG5cbmV4cG9ydHMuc2V0VHlwZWQoVFlQRURfT0spO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBOb3RlOiBhZGxlcjMyIHRha2VzIDEyJSBmb3IgbGV2ZWwgMCBhbmQgMiUgZm9yIGxldmVsIDYuXG4vLyBJdCBkb2Vzbid0IHdvcnRoIHRvIG1ha2UgYWRkaXRpb25hbCBvcHRpbWl6YXRpb25hIGFzIGluIG9yaWdpbmFsLlxuLy8gU21hbGwgc2l6ZSBpcyBwcmVmZXJhYmxlLlxuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbmZ1bmN0aW9uIGFkbGVyMzIoYWRsZXIsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHMxID0gKGFkbGVyICYgMHhmZmZmKSB8MCxcbiAgICAgIHMyID0gKChhZGxlciA+Pj4gMTYpICYgMHhmZmZmKSB8MCxcbiAgICAgIG4gPSAwO1xuXG4gIHdoaWxlIChsZW4gIT09IDApIHtcbiAgICAvLyBTZXQgbGltaXQgfiB0d2ljZSBsZXNzIHRoYW4gNTU1MiwgdG8ga2VlcFxuICAgIC8vIHMyIGluIDMxLWJpdHMsIGJlY2F1c2Ugd2UgZm9yY2Ugc2lnbmVkIGludHMuXG4gICAgLy8gaW4gb3RoZXIgY2FzZSAlPSB3aWxsIGZhaWwuXG4gICAgbiA9IGxlbiA+IDIwMDAgPyAyMDAwIDogbGVuO1xuICAgIGxlbiAtPSBuO1xuXG4gICAgZG8ge1xuICAgICAgczEgPSAoczEgKyBidWZbcG9zKytdKSB8MDtcbiAgICAgIHMyID0gKHMyICsgczEpIHwwO1xuICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICBzMSAlPSA2NTUyMTtcbiAgICBzMiAlPSA2NTUyMTtcbiAgfVxuXG4gIHJldHVybiAoczEgfCAoczIgPDwgMTYpKSB8MDtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGFkbGVyMzI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIE5vdGU6IHdlIGNhbid0IGdldCBzaWduaWZpY2FudCBzcGVlZCBib29zdCBoZXJlLlxuLy8gU28gd3JpdGUgY29kZSB0byBtaW5pbWl6ZSBzaXplIC0gbm8gcHJlZ2VuZXJhdGVkIHRhYmxlc1xuLy8gYW5kIGFycmF5IHRvb2xzIGRlcGVuZGVuY2llcy5cblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG4vLyBVc2Ugb3JkaW5hcnkgYXJyYXksIHNpbmNlIHVudHlwZWQgbWFrZXMgbm8gYm9vc3QgaGVyZVxuZnVuY3Rpb24gbWFrZVRhYmxlKCkge1xuICB2YXIgYywgdGFibGUgPSBbXTtcblxuICBmb3IgKHZhciBuID0gMDsgbiA8IDI1NjsgbisrKSB7XG4gICAgYyA9IG47XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCA4OyBrKyspIHtcbiAgICAgIGMgPSAoKGMgJiAxKSA/ICgweEVEQjg4MzIwIF4gKGMgPj4+IDEpKSA6IChjID4+PiAxKSk7XG4gICAgfVxuICAgIHRhYmxlW25dID0gYztcbiAgfVxuXG4gIHJldHVybiB0YWJsZTtcbn1cblxuLy8gQ3JlYXRlIHRhYmxlIG9uIGxvYWQuIEp1c3QgMjU1IHNpZ25lZCBsb25ncy4gTm90IGEgcHJvYmxlbS5cbnZhciBjcmNUYWJsZSA9IG1ha2VUYWJsZSgpO1xuXG5cbmZ1bmN0aW9uIGNyYzMyKGNyYywgYnVmLCBsZW4sIHBvcykge1xuICB2YXIgdCA9IGNyY1RhYmxlLFxuICAgICAgZW5kID0gcG9zICsgbGVuO1xuXG4gIGNyYyBePSAtMTtcblxuICBmb3IgKHZhciBpID0gcG9zOyBpIDwgZW5kOyBpKyspIHtcbiAgICBjcmMgPSAoY3JjID4+PiA4KSBeIHRbKGNyYyBeIGJ1ZltpXSkgJiAweEZGXTtcbiAgfVxuXG4gIHJldHVybiAoY3JjIF4gKC0xKSk7IC8vID4+PiAwO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gY3JjMzI7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuLy8gU2VlIHN0YXRlIGRlZnMgZnJvbSBpbmZsYXRlLmpzXG52YXIgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xuXG4vKlxuICAgRGVjb2RlIGxpdGVyYWwsIGxlbmd0aCwgYW5kIGRpc3RhbmNlIGNvZGVzIGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdGluZ1xuICAgbGl0ZXJhbCBhbmQgbWF0Y2ggYnl0ZXMgdW50aWwgZWl0aGVyIG5vdCBlbm91Z2ggaW5wdXQgb3Igb3V0cHV0IGlzXG4gICBhdmFpbGFibGUsIGFuIGVuZC1vZi1ibG9jayBpcyBlbmNvdW50ZXJlZCwgb3IgYSBkYXRhIGVycm9yIGlzIGVuY291bnRlcmVkLlxuICAgV2hlbiBsYXJnZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBzdXBwbGllZCB0byBpbmZsYXRlKCksIGZvclxuICAgZXhhbXBsZSwgYSAxNksgaW5wdXQgYnVmZmVyIGFuZCBhIDY0SyBvdXRwdXQgYnVmZmVyLCBtb3JlIHRoYW4gOTUlIG9mIHRoZVxuICAgaW5mbGF0ZSBleGVjdXRpb24gdGltZSBpcyBzcGVudCBpbiB0aGlzIHJvdXRpbmUuXG5cbiAgIEVudHJ5IGFzc3VtcHRpb25zOlxuXG4gICAgICAgIHN0YXRlLm1vZGUgPT09IExFTlxuICAgICAgICBzdHJtLmF2YWlsX2luID49IDZcbiAgICAgICAgc3RybS5hdmFpbF9vdXQgPj0gMjU4XG4gICAgICAgIHN0YXJ0ID49IHN0cm0uYXZhaWxfb3V0XG4gICAgICAgIHN0YXRlLmJpdHMgPCA4XG5cbiAgIE9uIHJldHVybiwgc3RhdGUubW9kZSBpcyBvbmUgb2Y6XG5cbiAgICAgICAgTEVOIC0tIHJhbiBvdXQgb2YgZW5vdWdoIG91dHB1dCBzcGFjZSBvciBlbm91Z2ggYXZhaWxhYmxlIGlucHV0XG4gICAgICAgIFRZUEUgLS0gcmVhY2hlZCBlbmQgb2YgYmxvY2sgY29kZSwgaW5mbGF0ZSgpIHRvIGludGVycHJldCBuZXh0IGJsb2NrXG4gICAgICAgIEJBRCAtLSBlcnJvciBpbiBibG9jayBkYXRhXG5cbiAgIE5vdGVzOlxuXG4gICAgLSBUaGUgbWF4aW11bSBpbnB1dCBiaXRzIHVzZWQgYnkgYSBsZW5ndGgvZGlzdGFuY2UgcGFpciBpcyAxNSBiaXRzIGZvciB0aGVcbiAgICAgIGxlbmd0aCBjb2RlLCA1IGJpdHMgZm9yIHRoZSBsZW5ndGggZXh0cmEsIDE1IGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBjb2RlLFxuICAgICAgYW5kIDEzIGJpdHMgZm9yIHRoZSBkaXN0YW5jZSBleHRyYS4gIFRoaXMgdG90YWxzIDQ4IGJpdHMsIG9yIHNpeCBieXRlcy5cbiAgICAgIFRoZXJlZm9yZSBpZiBzdHJtLmF2YWlsX2luID49IDYsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIGlucHV0IHRvIGF2b2lkXG4gICAgICBjaGVja2luZyBmb3IgYXZhaWxhYmxlIGlucHV0IHdoaWxlIGRlY29kaW5nLlxuXG4gICAgLSBUaGUgbWF4aW11bSBieXRlcyB0aGF0IGEgc2luZ2xlIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGNhbiBvdXRwdXQgaXMgMjU4XG4gICAgICBieXRlcywgd2hpY2ggaXMgdGhlIG1heGltdW0gbGVuZ3RoIHRoYXQgY2FuIGJlIGNvZGVkLiAgaW5mbGF0ZV9mYXN0KClcbiAgICAgIHJlcXVpcmVzIHN0cm0uYXZhaWxfb3V0ID49IDI1OCBmb3IgZWFjaCBsb29wIHRvIGF2b2lkIGNoZWNraW5nIGZvclxuICAgICAgb3V0cHV0IHNwYWNlLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfZmFzdChzdHJtLCBzdGFydCkge1xuICB2YXIgc3RhdGU7XG4gIHZhciBfaW47ICAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmlucHV0ICovXG4gIHZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBoYXZlIGVub3VnaCBpbnB1dCB3aGlsZSBpbiA8IGxhc3QgKi9cbiAgdmFyIF9vdXQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBiZWc7ICAgICAgICAgICAgICAgICAgICAvKiBpbmZsYXRlKCkncyBpbml0aWFsIHN0cm0ub3V0cHV0ICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSBvdXQgPCBlbmQsIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgKi9cbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gIHZhciBkbWF4OyAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGRpc3RhbmNlIGZyb20gemxpYiBoZWFkZXIgKi9cbi8vI2VuZGlmXG4gIHZhciB3c2l6ZTsgICAgICAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdmFyIHdoYXZlOyAgICAgICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdmFyIHduZXh0OyAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICAvLyBVc2UgYHNfd2luZG93YCBpbnN0ZWFkIGB3aW5kb3dgLCBhdm9pZCBjb25mbGljdCB3aXRoIGluc3RydW1lbnRhdGlvbiB0b29sc1xuICB2YXIgc193aW5kb3c7ICAgICAgICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiB3c2l6ZSAhPSAwICovXG4gIHZhciBob2xkOyAgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmhvbGQgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uYml0cyAqL1xuICB2YXIgbGNvZGU7ICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5sZW5jb2RlICovXG4gIHZhciBkY29kZTsgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmRpc3Rjb2RlICovXG4gIHZhciBsbWFzazsgICAgICAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBsZW5ndGggY29kZXMgKi9cbiAgdmFyIGRtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGRpc3RhbmNlIGNvZGVzICovXG4gIHZhciBoZXJlOyAgICAgICAgICAgICAgICAgICAvKiByZXRyaWV2ZWQgdGFibGUgZW50cnkgKi9cbiAgdmFyIG9wOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgYml0cywgb3BlcmF0aW9uLCBleHRyYSBiaXRzLCBvciAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdpbmRvdyBwb3NpdGlvbiwgd2luZG93IGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCwgdW51c2VkIGJ5dGVzICovXG4gIHZhciBkaXN0OyAgICAgICAgICAgICAgICAgICAvKiBtYXRjaCBkaXN0YW5jZSAqL1xuICB2YXIgZnJvbTsgICAgICAgICAgICAgICAgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBmcm9tICovXG4gIHZhciBmcm9tX3NvdXJjZTtcblxuXG4gIHZhciBpbnB1dCwgb3V0cHV0OyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG5cbiAgLyogY29weSBzdGF0ZSB0byBsb2NhbCB2YXJpYWJsZXMgKi9cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICAvL2hlcmUgPSBzdGF0ZS5oZXJlO1xuICBfaW4gPSBzdHJtLm5leHRfaW47XG4gIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgbGFzdCA9IF9pbiArIChzdHJtLmF2YWlsX2luIC0gNSk7XG4gIF9vdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgYmVnID0gX291dCAtIChzdGFydCAtIHN0cm0uYXZhaWxfb3V0KTtcbiAgZW5kID0gX291dCArIChzdHJtLmF2YWlsX291dCAtIDI1Nyk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICBkbWF4ID0gc3RhdGUuZG1heDtcbi8vI2VuZGlmXG4gIHdzaXplID0gc3RhdGUud3NpemU7XG4gIHdoYXZlID0gc3RhdGUud2hhdmU7XG4gIHduZXh0ID0gc3RhdGUud25leHQ7XG4gIHNfd2luZG93ID0gc3RhdGUud2luZG93O1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIGxjb2RlID0gc3RhdGUubGVuY29kZTtcbiAgZGNvZGUgPSBzdGF0ZS5kaXN0Y29kZTtcbiAgbG1hc2sgPSAoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDE7XG4gIGRtYXNrID0gKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMTtcblxuXG4gIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaFxuICAgICBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSAqL1xuXG4gIHRvcDpcbiAgZG8ge1xuICAgIGlmIChiaXRzIDwgMTUpIHtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgYml0cyArPSA4O1xuICAgIH1cblxuICAgIGhlcmUgPSBsY29kZVtob2xkICYgbG1hc2tdO1xuXG4gICAgZG9sZW46XG4gICAgZm9yICg7OykgeyAvLyBHb3RvIGVtdWxhdGlvblxuICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICBob2xkID4+Pj0gb3A7XG4gICAgICBiaXRzIC09IG9wO1xuICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuICAgICAgaWYgKG9wID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsaXRlcmFsICovXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgIG91dHB1dFtfb3V0KytdID0gaGVyZSAmIDB4ZmZmZi8qaGVyZS52YWwqLztcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggYmFzZSAqL1xuICAgICAgICBsZW4gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICBpZiAob3ApIHtcbiAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZW4gKz0gaG9sZCAmICgoMSA8PCBvcCkgLSAxKTtcbiAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgYml0cyAtPSBvcDtcbiAgICAgICAgfVxuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBsZW4pKTtcbiAgICAgICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIGhlcmUgPSBkY29kZVtob2xkICYgZG1hc2tdO1xuXG4gICAgICAgIGRvZGlzdDpcbiAgICAgICAgZm9yICg7OykgeyAvLyBnb3RvIGVtdWxhdGlvblxuICAgICAgICAgIG9wID0gaGVyZSA+Pj4gMjQvKmhlcmUuYml0cyovO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgIG9wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmYvKmhlcmUub3AqLztcblxuICAgICAgICAgIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhc2UgKi9cbiAgICAgICAgICAgIGRpc3QgPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqL1xuICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgICAgICBob2xkICs9IGlucHV0W19pbisrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzdCArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgICAgICAgIGlmIChkaXN0ID4gZG1heCkge1xuICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAgICAgICBob2xkID4+Pj0gb3A7XG4gICAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxcblwiLCBkaXN0KSk7XG4gICAgICAgICAgICBvcCA9IF9vdXQgLSBiZWc7ICAgICAgICAgICAgICAgIC8qIG1heCBkaXN0YW5jZSBpbiBvdXRwdXQgKi9cbiAgICAgICAgICAgIGlmIChkaXN0ID4gb3ApIHsgICAgICAgICAgICAgICAgLyogc2VlIGlmIGNvcHkgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgb3AgPSBkaXN0IC0gb3A7ICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgaWYgKG9wID4gd2hhdmUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkge1xuICAgICAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICAgICAgICB9XG5cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYWlsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4vLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbi8vICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gb3AgLSB3aGF2ZSkge1xuLy8gICAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSAwO1xuLy8gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7XG4vLyAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIHRvcDtcbi8vICAgICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgICAgIGxlbiAtPSBvcCAtIHdoYXZlO1xuLy8gICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IDA7XG4vLyAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wID4gd2hhdmUpO1xuLy8gICAgICAgICAgICAgICAgaWYgKG9wID09PSAwKSB7XG4vLyAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDtcbi8vICAgICAgICAgICAgICAgICAgZG8ge1xuLy8gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4vLyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTtcbi8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wO1xuLy8gICAgICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmcm9tID0gMDsgLy8gd2luZG93IGluZGV4XG4gICAgICAgICAgICAgIGZyb21fc291cmNlID0gc193aW5kb3c7XG4gICAgICAgICAgICAgIGlmICh3bmV4dCA9PT0gMCkgeyAgICAgICAgICAgLyogdmVyeSBjb21tb24gY2FzZSAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgLSBvcDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgaWYgKHduZXh0IDwgb3ApIHsgICAgICAvKiB3cmFwIGFyb3VuZCB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplICsgd25leHQgLSBvcDtcbiAgICAgICAgICAgICAgICBvcCAtPSB3bmV4dDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gZW5kIG9mIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSAwO1xuICAgICAgICAgICAgICAgICAgaWYgKHduZXh0IDwgbGVuKSB7ICAvKiBzb21lIGZyb20gc3RhcnQgb2Ygd2luZG93ICovXG4gICAgICAgICAgICAgICAgICAgIG9wID0gd25leHQ7XG4gICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgICAgICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogY29udGlndW91cyBpbiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICBmcm9tICs9IHduZXh0IC0gb3A7XG4gICAgICAgICAgICAgICAgaWYgKG9wIDwgbGVuKSB7ICAgICAgICAgLyogc29tZSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IHNfd2luZG93W2Zyb20rK107XG4gICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB3aGlsZSAobGVuID4gMikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGxlbiAtPSAzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChsZW4pIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAgICAgICAgIC8qIGNvcHkgZGlyZWN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGxlbmd0aCBpcyB0aHJlZSAqL1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIGxlbiAtPSAzO1xuICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gPiAyKTtcbiAgICAgICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PT0gMCkgeyAgICAgICAgICAvKiAybmQgbGV2ZWwgZGlzdGFuY2UgY29kZSAqL1xuICAgICAgICAgICAgaGVyZSA9IGRjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgICAgICBjb250aW51ZSBkb2Rpc3Q7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhayB0b3A7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7IC8vIG5lZWQgdG8gZW11bGF0ZSBnb3RvIHZpYSBcImNvbnRpbnVlXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgICAgICAvKiAybmQgbGV2ZWwgbGVuZ3RoIGNvZGUgKi9cbiAgICAgICAgaGVyZSA9IGxjb2RlWyhoZXJlICYgMHhmZmZmKS8qaGVyZS52YWwqLyArIChob2xkICYgKCgxIDw8IG9wKSAtIDEpKV07XG4gICAgICAgIGNvbnRpbnVlIGRvbGVuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAzMikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGVuZC1vZi1ibG9jayAqL1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgICBicmVhayB0b3A7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgfVxuXG4gICAgICBicmVhazsgLy8gbmVlZCB0byBlbXVsYXRlIGdvdG8gdmlhIFwiY29udGludWVcIlxuICAgIH1cbiAgfSB3aGlsZSAoX2luIDwgbGFzdCAmJiBfb3V0IDwgZW5kKTtcblxuICAvKiByZXR1cm4gdW51c2VkIGJ5dGVzIChvbiBlbnRyeSwgYml0cyA8IDgsIHNvIGluIHdvbid0IGdvIHRvbyBmYXIgYmFjaykgKi9cbiAgbGVuID0gYml0cyA+PiAzO1xuICBfaW4gLT0gbGVuO1xuICBiaXRzIC09IGxlbiA8PCAzO1xuICBob2xkICY9ICgxIDw8IGJpdHMpIC0gMTtcblxuICAvKiB1cGRhdGUgc3RhdGUgYW5kIHJldHVybiAqL1xuICBzdHJtLm5leHRfaW4gPSBfaW47XG4gIHN0cm0ubmV4dF9vdXQgPSBfb3V0O1xuICBzdHJtLmF2YWlsX2luID0gKF9pbiA8IGxhc3QgPyA1ICsgKGxhc3QgLSBfaW4pIDogNSAtIChfaW4gLSBsYXN0KSk7XG4gIHN0cm0uYXZhaWxfb3V0ID0gKF9vdXQgPCBlbmQgPyAyNTcgKyAoZW5kIC0gX291dCkgOiAyNTcgLSAoX291dCAtIGVuZCkpO1xuICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgc3RhdGUuYml0cyA9IGJpdHM7XG4gIHJldHVybjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxudmFyIHV0aWxzICAgICAgICAgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcbnZhciBhZGxlcjMyICAgICAgID0gcmVxdWlyZSgnLi9hZGxlcjMyJyk7XG52YXIgY3JjMzIgICAgICAgICA9IHJlcXVpcmUoJy4vY3JjMzInKTtcbnZhciBpbmZsYXRlX2Zhc3QgID0gcmVxdWlyZSgnLi9pbmZmYXN0Jyk7XG52YXIgaW5mbGF0ZV90YWJsZSA9IHJlcXVpcmUoJy4vaW5mdHJlZXMnKTtcblxudmFyIENPREVTID0gMDtcbnZhciBMRU5TID0gMTtcbnZhciBESVNUUyA9IDI7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbi8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi9cbi8vdmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG4vL3ZhciBaX1BBUlRJQUxfRkxVU0ggPSAxO1xuLy92YXIgWl9TWU5DX0ZMVVNIICAgID0gMjtcbi8vdmFyIFpfRlVMTF9GTFVTSCAgICA9IDM7XG52YXIgWl9GSU5JU0ggICAgICAgID0gNDtcbnZhciBaX0JMT0NLICAgICAgICAgPSA1O1xudmFyIFpfVFJFRVMgICAgICAgICA9IDY7XG5cblxuLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICogYXJlIGVycm9ycywgcG9zaXRpdmUgdmFsdWVzIGFyZSB1c2VkIGZvciBzcGVjaWFsIGJ1dCBub3JtYWwgZXZlbnRzLlxuICovXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xudmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbnZhciBaX01FTV9FUlJPUiAgICAgPSAtNDtcbnZhciBaX0JVRl9FUlJPUiAgICAgPSAtNTtcbi8vdmFyIFpfVkVSU0lPTl9FUlJPUiA9IC02O1xuXG4vKiBUaGUgZGVmbGF0ZSBjb21wcmVzc2lvbiBtZXRob2QgKi9cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cblxuLyogU1RBVEVTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxudmFyICAgIEhFQUQgPSAxOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtYWdpYyBoZWFkZXIgKi9cbnZhciAgICBGTEFHUyA9IDI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgbWV0aG9kIGFuZCBmbGFncyAoZ3ppcCkgKi9cbnZhciAgICBUSU1FID0gMzsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbW9kaWZpY2F0aW9uIHRpbWUgKGd6aXApICovXG52YXIgICAgT1MgPSA0OyAgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGZsYWdzIGFuZCBvcGVyYXRpbmcgc3lzdGVtIChnemlwKSAqL1xudmFyICAgIEVYTEVOID0gNTsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBsZW5ndGggKGd6aXApICovXG52YXIgICAgRVhUUkEgPSA2OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGJ5dGVzIChnemlwKSAqL1xudmFyICAgIE5BTUUgPSA3OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgZmlsZSBuYW1lIChnemlwKSAqL1xudmFyICAgIENPTU1FTlQgPSA4OyAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgY29tbWVudCAoZ3ppcCkgKi9cbnZhciAgICBIQ1JDID0gOTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgaGVhZGVyIGNyYyAoZ3ppcCkgKi9cbnZhciAgICBESUNUSUQgPSAxMDsgICAgLyogaTogd2FpdGluZyBmb3IgZGljdGlvbmFyeSBjaGVjayB2YWx1ZSAqL1xudmFyICAgIERJQ1QgPSAxMTsgICAgICAvKiB3YWl0aW5nIGZvciBpbmZsYXRlU2V0RGljdGlvbmFyeSgpIGNhbGwgKi9cbnZhciAgICAgICAgVFlQRSA9IDEyOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi9cbnZhciAgICAgICAgVFlQRURPID0gMTM7ICAgIC8qIGk6IHNhbWUsIGJ1dCBza2lwIGNoZWNrIHRvIGV4aXQgaW5mbGF0ZSBvbiBuZXcgYmxvY2sgKi9cbnZhciAgICAgICAgU1RPUkVEID0gMTQ7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIHN0b3JlZCBzaXplIChsZW5ndGggYW5kIGNvbXBsZW1lbnQpICovXG52YXIgICAgICAgIENPUFlfID0gMTU7ICAgICAvKiBpL286IHNhbWUgYXMgQ09QWSBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICBDT1BZID0gMTY7ICAgICAgLyogaS9vOiB3YWl0aW5nIGZvciBpbnB1dCBvciBvdXRwdXQgdG8gY29weSBzdG9yZWQgYmxvY2sgKi9cbnZhciAgICAgICAgVEFCTEUgPSAxNzsgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGR5bmFtaWMgYmxvY2sgdGFibGUgbGVuZ3RocyAqL1xudmFyICAgICAgICBMRU5MRU5TID0gMTg7ICAgLyogaTogd2FpdGluZyBmb3IgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovXG52YXIgICAgICAgIENPREVMRU5TID0gMTk7ICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0IGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgICAgIExFTl8gPSAyMDsgICAgICAvKiBpOiBzYW1lIGFzIExFTiBiZWxvdywgYnV0IG9ubHkgZmlyc3QgdGltZSBpbiAqL1xudmFyICAgICAgICAgICAgTEVOID0gMjE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQvZW9iIGNvZGUgKi9cbnZhciAgICAgICAgICAgIExFTkVYVCA9IDIyOyAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGggZXh0cmEgYml0cyAqL1xudmFyICAgICAgICAgICAgRElTVCA9IDIzOyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGNvZGUgKi9cbnZhciAgICAgICAgICAgIERJU1RFWFQgPSAyNDsgICAvKiBpOiB3YWl0aW5nIGZvciBkaXN0YW5jZSBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBNQVRDSCA9IDI1OyAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIGNvcHkgc3RyaW5nICovXG52YXIgICAgICAgICAgICBMSVQgPSAyNjsgICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIHdyaXRlIGxpdGVyYWwgKi9cbnZhciAgICBDSEVDSyA9IDI3OyAgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGNoZWNrIHZhbHVlICovXG52YXIgICAgTEVOR1RIID0gMjg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBsZW5ndGggKGd6aXApICovXG52YXIgICAgRE9ORSA9IDI5OyAgICAgIC8qIGZpbmlzaGVkIGNoZWNrLCBkb25lIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovXG52YXIgICAgQkFEID0gMzA7ICAgICAgIC8qIGdvdCBhIGRhdGEgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBNRU0gPSAzMTsgICAgICAgLyogZ290IGFuIGluZmxhdGUoKSBtZW1vcnkgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBTWU5DID0gMzI7ICAgICAgLyogbG9va2luZyBmb3Igc3luY2hyb25pemF0aW9uIGJ5dGVzIHRvIHJlc3RhcnQgaW5mbGF0ZSgpICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuXG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gIChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgTUFYX1dCSVRTID0gMTU7XG4vKiAzMksgTFo3NyB3aW5kb3cgKi9cbnZhciBERUZfV0JJVFMgPSBNQVhfV0JJVFM7XG5cblxuZnVuY3Rpb24genN3YXAzMihxKSB7XG4gIHJldHVybiAgKCgocSA+Pj4gMjQpICYgMHhmZikgK1xuICAgICAgICAgICgocSA+Pj4gOCkgJiAweGZmMDApICtcbiAgICAgICAgICAoKHEgJiAweGZmMDApIDw8IDgpICtcbiAgICAgICAgICAoKHEgJiAweGZmKSA8PCAyNCkpO1xufVxuXG5cbmZ1bmN0aW9uIEluZmxhdGVTdGF0ZSgpIHtcbiAgdGhpcy5tb2RlID0gMDsgICAgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlIG1vZGUgKi9cbiAgdGhpcy5sYXN0ID0gZmFsc2U7ICAgICAgICAgIC8qIHRydWUgaWYgcHJvY2Vzc2luZyBsYXN0IGJsb2NrICovXG4gIHRoaXMud3JhcCA9IDA7ICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovXG4gIHRoaXMuaGF2ZWRpY3QgPSBmYWxzZTsgICAgICAvKiB0cnVlIGlmIGRpY3Rpb25hcnkgcHJvdmlkZWQgKi9cbiAgdGhpcy5mbGFncyA9IDA7ICAgICAgICAgICAgIC8qIGd6aXAgaGVhZGVyIG1ldGhvZCBhbmQgZmxhZ3MgKDAgaWYgemxpYikgKi9cbiAgdGhpcy5kbWF4ID0gMDsgICAgICAgICAgICAgIC8qIHpsaWIgaGVhZGVyIG1heCBkaXN0YW5jZSAoSU5GTEFURV9TVFJJQ1QpICovXG4gIHRoaXMuY2hlY2sgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBjaGVjayB2YWx1ZSAqL1xuICB0aGlzLnRvdGFsID0gMDsgICAgICAgICAgICAgLyogcHJvdGVjdGVkIGNvcHkgb2Ygb3V0cHV0IGNvdW50ICovXG4gIC8vIFRPRE86IG1heSBiZSB7fVxuICB0aGlzLmhlYWQgPSBudWxsOyAgICAgICAgICAgLyogd2hlcmUgdG8gc2F2ZSBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiAqL1xuXG4gIC8qIHNsaWRpbmcgd2luZG93ICovXG4gIHRoaXMud2JpdHMgPSAwOyAgICAgICAgICAgICAvKiBsb2cgYmFzZSAyIG9mIHJlcXVlc3RlZCB3aW5kb3cgc2l6ZSAqL1xuICB0aGlzLndzaXplID0gMDsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovXG4gIHRoaXMud2hhdmUgPSAwOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovXG4gIHRoaXMud25leHQgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi9cbiAgdGhpcy53aW5kb3cgPSBudWxsOyAgICAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgbmVlZGVkICovXG5cbiAgLyogYml0IGFjY3VtdWxhdG9yICovXG4gIHRoaXMuaG9sZCA9IDA7ICAgICAgICAgICAgICAvKiBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5iaXRzID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIFwiaW5cIiAqL1xuXG4gIC8qIGZvciBzdHJpbmcgYW5kIHN0b3JlZCBibG9jayBjb3B5aW5nICovXG4gIHRoaXMubGVuZ3RoID0gMDsgICAgICAgICAgICAvKiBsaXRlcmFsIG9yIGxlbmd0aCBvZiBkYXRhIHRvIGNvcHkgKi9cbiAgdGhpcy5vZmZzZXQgPSAwOyAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqL1xuXG4gIC8qIGZvciB0YWJsZSBhbmQgY29kZSBkZWNvZGluZyAqL1xuICB0aGlzLmV4dHJhID0gMDsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi9cblxuICAvKiBmaXhlZCBhbmQgZHluYW1pYyBjb2RlIHRhYmxlcyAqL1xuICB0aGlzLmxlbmNvZGUgPSBudWxsOyAgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKi9cbiAgdGhpcy5kaXN0Y29kZSA9IG51bGw7ICAgICAgICAgLyogc3RhcnRpbmcgdGFibGUgZm9yIGRpc3RhbmNlIGNvZGVzICovXG4gIHRoaXMubGVuYml0cyA9IDA7ICAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBsZW5jb2RlICovXG4gIHRoaXMuZGlzdGJpdHMgPSAwOyAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqL1xuXG4gIC8qIGR5bmFtaWMgdGFibGUgYnVpbGRpbmcgKi9cbiAgdGhpcy5uY29kZSA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5ubGVuID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBsZW5ndGggY29kZSBsZW5ndGhzICovXG4gIHRoaXMubmRpc3QgPSAwOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovXG4gIHRoaXMuaGF2ZSA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGluIGxlbnNbXSAqL1xuICB0aGlzLm5leHQgPSBudWxsOyAgICAgICAgICAgICAgLyogbmV4dCBhdmFpbGFibGUgc3BhY2UgaW4gY29kZXNbXSAqL1xuXG4gIHRoaXMubGVucyA9IG5ldyB1dGlscy5CdWYxNigzMjApOyAvKiB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgY29kZSBsZW5ndGhzICovXG4gIHRoaXMud29yayA9IG5ldyB1dGlscy5CdWYxNigyODgpOyAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi9cblxuICAvKlxuICAgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIHBvaW50ZXJzIGluIGpzLCB3ZSB1c2UgbGVuY29kZSBhbmQgZGlzdGNvZGUgZGlyZWN0bHlcbiAgIGFzIGJ1ZmZlcnMgc28gd2UgZG9uJ3QgbmVlZCBjb2Rlc1xuICAqL1xuICAvL3RoaXMuY29kZXMgPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIKTsgICAgICAgLyogc3BhY2UgZm9yIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuZHluID0gbnVsbDsgICAgICAgICAgICAgIC8qIGR5bmFtaWMgdGFibGUgZm9yIGxlbmd0aC9saXRlcmFsIGNvZGVzIChKUyBzcGVjaWZpYykgKi9cbiAgdGhpcy5kaXN0ZHluID0gbnVsbDsgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLnNhbmUgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBpZiBmYWxzZSwgYWxsb3cgaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyICovXG4gIHRoaXMuYmFjayA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgYmFjayBvZiBsYXN0IHVucHJvY2Vzc2VkIGxlbmd0aC9saXQgKi9cbiAgdGhpcy53YXMgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbCBsZW5ndGggb2YgbWF0Y2ggKi9cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0S2VlcChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RybS50b3RhbF9pbiA9IHN0cm0udG90YWxfb3V0ID0gc3RhdGUudG90YWwgPSAwO1xuICBzdHJtLm1zZyA9ICcnOyAvKlpfTlVMTCovXG4gIGlmIChzdGF0ZS53cmFwKSB7ICAgICAgIC8qIHRvIHN1cHBvcnQgaWxsLWNvbmNlaXZlZCBKYXZhIHRlc3Qgc3VpdGUgKi9cbiAgICBzdHJtLmFkbGVyID0gc3RhdGUud3JhcCAmIDE7XG4gIH1cbiAgc3RhdGUubW9kZSA9IEhFQUQ7XG4gIHN0YXRlLmxhc3QgPSAwO1xuICBzdGF0ZS5oYXZlZGljdCA9IDA7XG4gIHN0YXRlLmRtYXggPSAzMjc2ODtcbiAgc3RhdGUuaGVhZCA9IG51bGwvKlpfTlVMTCovO1xuICBzdGF0ZS5ob2xkID0gMDtcbiAgc3RhdGUuYml0cyA9IDA7XG4gIC8vc3RhdGUubGVuY29kZSA9IHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9MRU5TKTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5kaXN0ZHluID0gbmV3IHV0aWxzLkJ1ZjMyKEVOT1VHSF9ESVNUUyk7XG5cbiAgc3RhdGUuc2FuZSA9IDE7XG4gIHN0YXRlLmJhY2sgPSAtMTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiByZXNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXQoc3RybSkge1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIHN0YXRlLndzaXplID0gMDtcbiAgc3RhdGUud2hhdmUgPSAwO1xuICBzdGF0ZS53bmV4dCA9IDA7XG4gIHJldHVybiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pO1xuXG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgd3JhcDtcbiAgdmFyIHN0YXRlO1xuXG4gIC8qIGdldCB0aGUgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogZXh0cmFjdCB3cmFwIHJlcXVlc3QgZnJvbSB3aW5kb3dCaXRzIHBhcmFtZXRlciAqL1xuICBpZiAod2luZG93Qml0cyA8IDApIHtcbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cbiAgZWxzZSB7XG4gICAgd3JhcCA9ICh3aW5kb3dCaXRzID4+IDQpICsgMTtcbiAgICBpZiAod2luZG93Qml0cyA8IDQ4KSB7XG4gICAgICB3aW5kb3dCaXRzICY9IDE1O1xuICAgIH1cbiAgfVxuXG4gIC8qIHNldCBudW1iZXIgb2Ygd2luZG93IGJpdHMsIGZyZWUgd2luZG93IGlmIGRpZmZlcmVudCAqL1xuICBpZiAod2luZG93Qml0cyAmJiAod2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KSkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuICBpZiAoc3RhdGUud2luZG93ICE9PSBudWxsICYmIHN0YXRlLndiaXRzICE9PSB3aW5kb3dCaXRzKSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmVzZXQgdGhlIHJlc3Qgb2YgaXQgKi9cbiAgc3RhdGUud3JhcCA9IHdyYXA7XG4gIHN0YXRlLndiaXRzID0gd2luZG93Qml0cztcbiAgcmV0dXJuIGluZmxhdGVSZXNldChzdHJtKTtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIHtcbiAgdmFyIHJldDtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgLy9zdHJtLm1zZyA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovXG5cbiAgc3RhdGUgPSBuZXcgSW5mbGF0ZVN0YXRlKCk7XG5cbiAgLy9pZiAoc3RhdGUgPT09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IGFsbG9jYXRlZFxcblwiKSk7XG4gIHN0cm0uc3RhdGUgPSBzdGF0ZTtcbiAgc3RhdGUud2luZG93ID0gbnVsbC8qWl9OVUxMKi87XG4gIHJldCA9IGluZmxhdGVSZXNldDIoc3RybSwgd2luZG93Qml0cyk7XG4gIGlmIChyZXQgIT09IFpfT0spIHtcbiAgICBzdHJtLnN0YXRlID0gbnVsbC8qWl9OVUxMKi87XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUluaXQoc3RybSkge1xuICByZXR1cm4gaW5mbGF0ZUluaXQyKHN0cm0sIERFRl9XQklUUyk7XG59XG5cblxuLypcbiBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvXG4gZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLlxuIElmIEJVSUxERklYRUQgaXMgZGVmaW5lZCwgdGhlbiBpbnN0ZWFkIHRoaXMgcm91dGluZSBidWlsZHMgdGhlIHRhYmxlcyB0aGVcbiBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkLCBhbmQgcmV0dXJucyB0aG9zZSB0YWJsZXMgdGhlIGZpcnN0IHRpbWUgYW5kXG4gdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW5cbiBleGNoYW5nZSBmb3IgYSBsaXR0bGUgZXhlY3V0aW9uIHRpbWUuICBIb3dldmVyLCBCVUlMREZJWEVEIHNob3VsZCBub3QgYmVcbiB1c2VkIGZvciB0aHJlYWRlZCBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSByZXdyaXRpbmcgb2YgdGhlIHRhYmxlcyBhbmQgdmlyZ2luXG4gbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS5cbiAqL1xudmFyIHZpcmdpbiA9IHRydWU7XG5cbnZhciBsZW5maXgsIGRpc3RmaXg7IC8vIFdlIGhhdmUgbm8gcG9pbnRlcnMgaW4gSlMsIHNvIGtlZXAgdGFibGVzIHNlcGFyYXRlXG5cbmZ1bmN0aW9uIGZpeGVkdGFibGVzKHN0YXRlKSB7XG4gIC8qIGJ1aWxkIGZpeGVkIGh1ZmZtYW4gdGFibGVzIGlmIGZpcnN0IGNhbGwgKG1heSBub3QgYmUgdGhyZWFkIHNhZmUpICovXG4gIGlmICh2aXJnaW4pIHtcbiAgICB2YXIgc3ltO1xuXG4gICAgbGVuZml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDUxMik7XG4gICAgZGlzdGZpeCA9IG5ldyB1dGlscy5CdWYzMigzMik7XG5cbiAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqL1xuICAgIHN5bSA9IDA7XG4gICAgd2hpbGUgKHN5bSA8IDE0NCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjU2KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gOTsgfVxuICAgIHdoaWxlIChzeW0gPCAyODApIHsgc3RhdGUubGVuc1tzeW0rK10gPSA3OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4OCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDg7IH1cblxuICAgIGluZmxhdGVfdGFibGUoTEVOUywgIHN0YXRlLmxlbnMsIDAsIDI4OCwgbGVuZml4LCAgIDAsIHN0YXRlLndvcmssIHsgYml0czogOSB9KTtcblxuICAgIC8qIGRpc3RhbmNlIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMzIpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA1OyB9XG5cbiAgICBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCAwLCAzMiwgICBkaXN0Zml4LCAwLCBzdGF0ZS53b3JrLCB7IGJpdHM6IDUgfSk7XG5cbiAgICAvKiBkbyB0aGlzIGp1c3Qgb25jZSAqL1xuICAgIHZpcmdpbiA9IGZhbHNlO1xuICB9XG5cbiAgc3RhdGUubGVuY29kZSA9IGxlbmZpeDtcbiAgc3RhdGUubGVuYml0cyA9IDk7XG4gIHN0YXRlLmRpc3Rjb2RlID0gZGlzdGZpeDtcbiAgc3RhdGUuZGlzdGJpdHMgPSA1O1xufVxuXG5cbi8qXG4gVXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdCB3c2l6ZSAobm9ybWFsbHkgMzJLKSBieXRlcyB3cml0dGVuIGJlZm9yZVxuIHJldHVybmluZy4gIElmIHdpbmRvdyBkb2VzIG5vdCBleGlzdCB5ZXQsIGNyZWF0ZSBpdC4gIFRoaXMgaXMgb25seSBjYWxsZWRcbiB3aGVuIGEgd2luZG93IGlzIGFscmVhZHkgaW4gdXNlLCBvciB3aGVuIG91dHB1dCBoYXMgYmVlbiB3cml0dGVuIGR1cmluZyB0aGlzXG4gaW5mbGF0ZSBjYWxsLCBidXQgdGhlIGVuZCBvZiB0aGUgZGVmbGF0ZSBzdHJlYW0gaGFzIG5vdCBiZWVuIHJlYWNoZWQgeWV0LlxuIEl0IGlzIGFsc28gY2FsbGVkIHRvIGNyZWF0ZSBhIHdpbmRvdyBmb3IgZGljdGlvbmFyeSBkYXRhIHdoZW4gYSBkaWN0aW9uYXJ5XG4gaXMgbG9hZGVkLlxuXG4gUHJvdmlkaW5nIG91dHB1dCBidWZmZXJzIGxhcmdlciB0aGFuIDMySyB0byBpbmZsYXRlKCkgc2hvdWxkIHByb3ZpZGUgYSBzcGVlZFxuIGFkdmFudGFnZSwgc2luY2Ugb25seSB0aGUgbGFzdCAzMksgb2Ygb3V0cHV0IGlzIGNvcGllZCB0byB0aGUgc2xpZGluZyB3aW5kb3dcbiB1cG9uIHJldHVybiBmcm9tIGluZmxhdGUoKSwgYW5kIHNpbmNlIGFsbCBkaXN0YW5jZXMgYWZ0ZXIgdGhlIGZpcnN0IDMySyBvZlxuIG91dHB1dCB3aWxsIGZhbGwgaW4gdGhlIG91dHB1dCBkYXRhLCBtYWtpbmcgbWF0Y2ggY29waWVzIHNpbXBsZXIgYW5kIGZhc3Rlci5cbiBUaGUgYWR2YW50YWdlIG1heSBiZSBkZXBlbmRlbnQgb24gdGhlIHNpemUgb2YgdGhlIHByb2Nlc3NvcidzIGRhdGEgY2FjaGVzLlxuICovXG5mdW5jdGlvbiB1cGRhdGV3aW5kb3coc3RybSwgc3JjLCBlbmQsIGNvcHkpIHtcbiAgdmFyIGRpc3Q7XG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgLyogaWYgaXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHdpbmRvdyAqL1xuICBpZiAoc3RhdGUud2luZG93ID09PSBudWxsKSB7XG4gICAgc3RhdGUud3NpemUgPSAxIDw8IHN0YXRlLndiaXRzO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IDA7XG5cbiAgICBzdGF0ZS53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzdGF0ZS53c2l6ZSk7XG4gIH1cblxuICAvKiBjb3B5IHN0YXRlLT53c2l6ZSBvciBsZXNzIG91dHB1dCBieXRlcyBpbnRvIHRoZSBjaXJjdWxhciB3aW5kb3cgKi9cbiAgaWYgKGNvcHkgPj0gc3RhdGUud3NpemUpIHtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gc3RhdGUud3NpemUsIHN0YXRlLndzaXplLCAwKTtcbiAgICBzdGF0ZS53bmV4dCA9IDA7XG4gICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgfVxuICBlbHNlIHtcbiAgICBkaXN0ID0gc3RhdGUud3NpemUgLSBzdGF0ZS53bmV4dDtcbiAgICBpZiAoZGlzdCA+IGNvcHkpIHtcbiAgICAgIGRpc3QgPSBjb3B5O1xuICAgIH1cbiAgICAvL3ptZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53bmV4dCwgZW5kIC0gY29weSwgZGlzdCk7XG4gICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGRpc3QsIHN0YXRlLnduZXh0KTtcbiAgICBjb3B5IC09IGRpc3Q7XG4gICAgaWYgKGNvcHkpIHtcbiAgICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93LCBlbmQgLSBjb3B5LCBjb3B5KTtcbiAgICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBjb3B5LCBjb3B5LCAwKTtcbiAgICAgIHN0YXRlLnduZXh0ID0gY29weTtcbiAgICAgIHN0YXRlLndoYXZlID0gc3RhdGUud3NpemU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgc3RhdGUud25leHQgKz0gZGlzdDtcbiAgICAgIGlmIChzdGF0ZS53bmV4dCA9PT0gc3RhdGUud3NpemUpIHsgc3RhdGUud25leHQgPSAwOyB9XG4gICAgICBpZiAoc3RhdGUud2hhdmUgPCBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53aGF2ZSArPSBkaXN0OyB9XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlKHN0cm0sIGZsdXNoKSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIGlucHV0LCBvdXRwdXQ7ICAgICAgICAgIC8vIGlucHV0L291dHB1dCBidWZmZXJzXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAgICAgICAvKiBuZXh0IGlucHV0IElOREVYICovXG4gIHZhciBwdXQ7ICAgICAgICAgICAgICAgICAgICAvKiBuZXh0IG91dHB1dCBJTkRFWCAqL1xuICB2YXIgaGF2ZSwgbGVmdDsgICAgICAgICAgICAgLyogYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi9cbiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGJpdCBidWZmZXIgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqL1xuICB2YXIgX2luLCBfb3V0OyAgICAgICAgICAgICAgLyogc2F2ZSBzdGFydGluZyBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgY29weTsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHN0b3JlZCBvciBtYXRjaCBieXRlcyB0byBjb3B5ICovXG4gIHZhciBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi9cbiAgdmFyIGZyb21fc291cmNlO1xuICB2YXIgaGVyZSA9IDA7ICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqL1xuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDsgLy8gcGFrZWQgXCJoZXJlXCIgZGVub3JtYWxpemVkIChKUyBzcGVjaWZpYylcbiAgLy92YXIgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovXG4gIHZhciBsYXN0X2JpdHMsIGxhc3Rfb3AsIGxhc3RfdmFsOyAvLyBwYWtlZCBcImxhc3RcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIHRvIGNvcHkgZm9yIHJlcGVhdHMsIGJpdHMgdG8gZHJvcCAqL1xuICB2YXIgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi9cbiAgdmFyIGhidWYgPSBuZXcgdXRpbHMuQnVmOCg0KTsgICAgLyogYnVmZmVyIGZvciBnemlwIGhlYWRlciBjcmMgY2FsY3VsYXRpb24gKi9cbiAgdmFyIG9wdHM7XG5cbiAgdmFyIG47IC8vIHRlbXBvcmFyeSB2YXIgZm9yIE5FRURfQklUU1xuXG4gIHZhciBvcmRlciA9IC8qIHBlcm11dGF0aW9uIG9mIGNvZGUgbGVuZ3RocyAqL1xuICAgIFsgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNSBdO1xuXG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8ICFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkgeyBzdGF0ZS5tb2RlID0gVFlQRURPOyB9ICAgIC8qIHNraXAgY2hlY2sgKi9cblxuXG4gIC8vLS0tIExPQUQoKSAtLS1cbiAgcHV0ID0gc3RybS5uZXh0X291dDtcbiAgb3V0cHV0ID0gc3RybS5vdXRwdXQ7XG4gIGxlZnQgPSBzdHJtLmF2YWlsX291dDtcbiAgbmV4dCA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBoYXZlID0gc3RybS5hdmFpbF9pbjtcbiAgaG9sZCA9IHN0YXRlLmhvbGQ7XG4gIGJpdHMgPSBzdGF0ZS5iaXRzO1xuICAvLy0tLVxuXG4gIF9pbiA9IGhhdmU7XG4gIF9vdXQgPSBsZWZ0O1xuICByZXQgPSBaX09LO1xuXG4gIGluZl9sZWF2ZTogLy8gZ290byBlbXVsYXRpb25cbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoc3RhdGUubW9kZSkge1xuICAgIGNhc2UgSEVBRDpcbiAgICAgIGlmIChzdGF0ZS53cmFwID09PSAwKSB7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUWVBFRE87XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpO1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKChzdGF0ZS53cmFwICYgMikgJiYgaG9sZCA9PT0gMHg4YjFmKSB7ICAvKiBnemlwIGhlYWRlciAqL1xuICAgICAgICBzdGF0ZS5jaGVjayA9IDAvKmNyYzMyKDBMLCBaX05VTEwsIDApKi87XG4gICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgLy89PT0vL1xuXG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5tb2RlID0gRkxBR1M7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZmxhZ3MgPSAwOyAgICAgICAgICAgLyogZXhwZWN0IHpsaWIgaGVhZGVyICovXG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmICghKHN0YXRlLndyYXAgJiAxKSB8fCAgIC8qIGNoZWNrIGlmIHpsaWIgaGVhZGVyIGFsbG93ZWQgKi9cbiAgICAgICAgKCgoaG9sZCAmIDB4ZmYpLypCSVRTKDgpKi8gPDwgOCkgKyAoaG9sZCA+PiA4KSkgJSAzMSkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgaGVhZGVyIGNoZWNrJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyg0KSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IDQ7XG4gICAgICBiaXRzIC09IDQ7XG4gICAgICAvLy0tLS8vXG4gICAgICBsZW4gPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA4O1xuICAgICAgaWYgKHN0YXRlLndiaXRzID09PSAwKSB7XG4gICAgICAgIHN0YXRlLndiaXRzID0gbGVuO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAobGVuID4gc3RhdGUud2JpdHMpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCB3aW5kb3cgc2l6ZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZG1heCA9IDEgPDwgbGVuO1xuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIHpsaWIgaGVhZGVyIG9rXFxuXCIpKTtcbiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgIHN0YXRlLm1vZGUgPSBob2xkICYgMHgyMDAgPyBESUNUSUQgOiBUWVBFO1xuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBicmVhaztcbiAgICBjYXNlIEZMQUdTOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUuZmxhZ3MgPSBob2xkO1xuICAgICAgaWYgKChzdGF0ZS5mbGFncyAmIDB4ZmYpICE9PSBaX0RFRkxBVEVEKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweGUwMDApIHtcbiAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLnRleHQgPSAoKGhvbGQgPj4gOCkgJiAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgIH1cbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IFRJTUU7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBUSU1FOlxuICAgICAgLy89PT0gTkVFREJJVFMoMzIpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC50aW1lID0gaG9sZDtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkM0KHN0YXRlLmNoZWNrLCBob2xkKVxuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBoYnVmWzJdID0gKGhvbGQgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhidWZbM10gPSAoaG9sZCA+Pj4gMjQpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgNCwgMCk7XG4gICAgICAgIC8vPT09XG4gICAgICB9XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBPUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE9TOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC54ZmxhZ3MgPSAoaG9sZCAmIDB4ZmYpO1xuICAgICAgICBzdGF0ZS5oZWFkLm9zID0gKGhvbGQgPj4gOCk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAvLz09PS8vXG4gICAgICB9XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBFWExFTjtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIEVYTEVOOlxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5sZW5ndGggPSBob2xkO1xuICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmFfbGVuID0gaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgICAgLy89PT0vL1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhID0gbnVsbC8qWl9OVUxMKi87XG4gICAgICB9XG4gICAgICBzdGF0ZS5tb2RlID0gRVhUUkE7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBFWFRSQTpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDQwMCkge1xuICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH1cbiAgICAgICAgaWYgKGNvcHkpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICAgICAgbGVuID0gc3RhdGUuaGVhZC5leHRyYV9sZW4gLSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgICAgICBpZiAoIXN0YXRlLmhlYWQuZXh0cmEpIHtcbiAgICAgICAgICAgICAgLy8gVXNlIHVudHlwZWQgYXJyYXkgZm9yIG1vcmUgY29udmVuaWVuZCBwcm9jZXNzaW5nIGxhdGVyXG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBuZXcgQXJyYXkoc3RhdGUuaGVhZC5leHRyYV9sZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdXRpbHMuYXJyYXlTZXQoXG4gICAgICAgICAgICAgIHN0YXRlLmhlYWQuZXh0cmEsXG4gICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICBuZXh0LFxuICAgICAgICAgICAgICAvLyBleHRyYSBmaWVsZCBpcyBsaW1pdGVkIHRvIDY1NTM2IGJ5dGVzXG4gICAgICAgICAgICAgIC8vIC0gbm8gbmVlZCBmb3IgYWRkaXRpb25hbCBzaXplIGNoZWNrXG4gICAgICAgICAgICAgIGNvcHksXG4gICAgICAgICAgICAgIC8qbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4IC0gbGVuID8gc3RhdGUuaGVhZC5leHRyYV9tYXggOiBjb3B5LCovXG4gICAgICAgICAgICAgIGxlblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vem1lbWNweShzdGF0ZS5oZWFkLmV4dHJhICsgbGVuLCBuZXh0LFxuICAgICAgICAgICAgLy8gICAgICAgIGxlbiArIGNvcHkgPiBzdGF0ZS5oZWFkLmV4dHJhX21heCA/XG4gICAgICAgICAgICAvLyAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9tYXggLSBsZW4gOiBjb3B5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBpbnB1dCwgY29weSwgbmV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gTkFNRTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE5BTUU6XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA4MDApIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGNvcHkgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgLy8gVE9ETzogMiBvciAxIGJ5dGVzP1xuICAgICAgICAgIGxlbiA9IGlucHV0W25leHQgKyBjb3B5KytdO1xuICAgICAgICAgIC8qIHVzZSBjb25zdGFudCBsaW1pdCBiZWNhdXNlIGluIGpzIHdlIHNob3VsZCBub3QgcHJlYWxsb2NhdGUgbWVtb3J5ICovXG4gICAgICAgICAgaWYgKHN0YXRlLmhlYWQgJiYgbGVuICYmXG4gICAgICAgICAgICAgIChzdGF0ZS5sZW5ndGggPCA2NTUzNiAvKnN0YXRlLmhlYWQubmFtZV9tYXgqLykpIHtcbiAgICAgICAgICAgIHN0YXRlLmhlYWQubmFtZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGxlbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChsZW4gJiYgY29weSA8IGhhdmUpO1xuXG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5uYW1lID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHN0YXRlLmxlbmd0aCA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gQ09NTUVOVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPTU1FTlQ6XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDEwMDApIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGNvcHkgPSAwO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5jb21tX21heCovKSkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBoYXZlIC09IGNvcHk7XG4gICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgaWYgKGxlbikgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5jb21tZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBIQ1JDO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgSENSQzpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICAgIHdoaWxlIChiaXRzIDwgMTYpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS5jaGVjayAmIDB4ZmZmZikpIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdoZWFkZXIgY3JjIG1pc21hdGNoJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmhlYWQpIHtcbiAgICAgICAgc3RhdGUuaGVhZC5oY3JjID0gKChzdGF0ZS5mbGFncyA+PiA5KSAmIDEpO1xuICAgICAgICBzdGF0ZS5oZWFkLmRvbmUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBESUNUSUQ6XG4gICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSB6c3dhcDMyKGhvbGQpO1xuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5tb2RlID0gRElDVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIERJQ1Q6XG4gICAgICBpZiAoc3RhdGUuaGF2ZWRpY3QgPT09IDApIHtcbiAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgIC8vLS0tXG4gICAgICAgIHJldHVybiBaX05FRURfRElDVDtcbiAgICAgIH1cbiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IDEvKmFkbGVyMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgIHN0YXRlLm1vZGUgPSBUWVBFO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgVFlQRTpcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9CTE9DSyB8fCBmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIFRZUEVETzpcbiAgICAgIGlmIChzdGF0ZS5sYXN0KSB7XG4gICAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgICBiaXRzIC09IGJpdHMgJiA3O1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBDSEVDSztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLz09PSBORUVEQklUUygzKTsgKi9cbiAgICAgIHdoaWxlIChiaXRzIDwgMykge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubGFzdCA9IChob2xkICYgMHgwMSkvKkJJVFMoMSkqLztcbiAgICAgIC8vLS0tIERST1BCSVRTKDEpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gMTtcbiAgICAgIGJpdHMgLT0gMTtcbiAgICAgIC8vLS0tLy9cblxuICAgICAgc3dpdGNoICgoaG9sZCAmIDB4MDMpLypCSVRTKDIpKi8pIHtcbiAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqL1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBzdG9yZWQgYmxvY2slc1xcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gU1RPUkVEO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpeGVkIGJsb2NrICovXG4gICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTtcbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gTEVOXzsgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovXG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykge1xuICAgICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICBicmVhayBpbmZfbGVhdmU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xcblwiLFxuICAgICAgICAvLyAgICAgICAgc3RhdGUubGFzdCA/IFwiIChsYXN0KVwiIDogXCJcIikpO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVEFCTEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJsb2NrIHR5cGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgfVxuICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgYml0cyAtPSAyO1xuICAgICAgLy8tLS0vL1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBTVE9SRUQ6XG4gICAgICAvLy0tLSBCWVRFQklUUygpIC0tLS8vIC8qIGdvIHRvIGJ5dGUgYm91bmRhcnkgKi9cbiAgICAgIGhvbGQgPj4+PSBiaXRzICYgNztcbiAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAvLy0tLS8vXG4gICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoKGhvbGQgJiAweGZmZmYpICE9PSAoKGhvbGQgPj4+IDE2KSBeIDB4ZmZmZikpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3Rocyc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUubGVuZ3RoID0gaG9sZCAmIDB4ZmZmZjtcbiAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgc3RvcmVkIGxlbmd0aCAldVxcblwiLFxuICAgICAgLy8gICAgICAgIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5tb2RlID0gQ09QWV87XG4gICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBDT1BZXzpcbiAgICAgIHN0YXRlLm1vZGUgPSBDT1BZO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgQ09QWTpcbiAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICBpZiAoY29weSkge1xuICAgICAgICBpZiAoY29weSA+IGhhdmUpIHsgY29weSA9IGhhdmU7IH1cbiAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICAgIGlmIChjb3B5ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAvLy0tLSB6bWVtY3B5KHB1dCwgbmV4dCwgY29weSk7IC0tLVxuICAgICAgICB1dGlscy5hcnJheVNldChvdXRwdXQsIGlucHV0LCBuZXh0LCBjb3B5LCBwdXQpO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICAgIHB1dCArPSBjb3B5O1xuICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcXG5cIikpO1xuICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFRBQkxFOlxuICAgICAgLy89PT0gTkVFREJJVFMoMTQpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAxNCkge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgfVxuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubmxlbiA9IChob2xkICYgMHgxZikvKkJJVFMoNSkqLyArIDI1NztcbiAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNTtcbiAgICAgIGJpdHMgLT0gNTtcbiAgICAgIC8vLS0tLy9cbiAgICAgIHN0YXRlLm5kaXN0ID0gKGhvbGQgJiAweDFmKS8qQklUUyg1KSovICsgMTtcbiAgICAgIC8vLS0tIERST1BCSVRTKDUpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNTtcbiAgICAgIGJpdHMgLT0gNTtcbiAgICAgIC8vLS0tLy9cbiAgICAgIHN0YXRlLm5jb2RlID0gKGhvbGQgJiAweDBmKS8qQklUUyg0KSovICsgNDtcbiAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNDtcbiAgICAgIGJpdHMgLT0gNDtcbiAgICAgIC8vLS0tLy9cbi8vI2lmbmRlZiBQS1pJUF9CVUdfV09SS0FST1VORFxuICAgICAgaWYgKHN0YXRlLm5sZW4gPiAyODYgfHwgc3RhdGUubmRpc3QgPiAzMCkge1xuICAgICAgICBzdHJtLm1zZyA9ICd0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuLy8jZW5kaWZcbiAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcXG5cIikpO1xuICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOTEVOUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTkxFTlM6XG4gICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IHN0YXRlLm5jb2RlKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAvLy0tLSBEUk9QQklUUygzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICB3aGlsZSAoc3RhdGUuaGF2ZSA8IDE5KSB7XG4gICAgICAgIHN0YXRlLmxlbnNbb3JkZXJbc3RhdGUuaGF2ZSsrXV0gPSAwO1xuICAgICAgfVxuICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgIC8vc3RhdGUubmV4dCA9IHN0YXRlLmNvZGVzO1xuICAgICAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUubmV4dDtcbiAgICAgIC8vIFN3aXRjaCB0byB1c2UgZHluYW1pYyB0YWJsZVxuICAgICAgc3RhdGUubGVuY29kZSA9IHN0YXRlLmxlbmR5bjtcbiAgICAgIHN0YXRlLmxlbmJpdHMgPSA3O1xuXG4gICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKENPREVTLCBzdGF0ZS5sZW5zLCAwLCAxOSwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgY29kZSBsZW5ndGhzIHNldCc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBjb2RlIGxlbmd0aHMgb2tcXG5cIikpO1xuICAgICAgc3RhdGUuaGF2ZSA9IDA7XG4gICAgICBzdGF0ZS5tb2RlID0gQ09ERUxFTlM7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBDT0RFTEVOUzpcbiAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgoaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIGlmIChoZXJlX3ZhbCA8IDE2KSB7XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGhlcmVfdmFsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGlmIChoZXJlX3ZhbCA9PT0gMTYpIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDIpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDI7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGlmIChzdGF0ZS5oYXZlID09PSAwKSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYml0IGxlbmd0aCByZXBlYXQnO1xuICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxlbiA9IHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSAtIDFdO1xuICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDB4MDMpOy8vQklUUygyKTtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDIpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICAgIGJpdHMgLT0gMjtcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoaGVyZV92YWwgPT09IDE3KSB7XG4gICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyAzKTtcbiAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyAzO1xuICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgY29weSA9IDMgKyAoaG9sZCAmIDB4MDcpOy8vQklUUygzKTtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gMztcbiAgICAgICAgICAgIGJpdHMgLT0gMztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLz09PSBORUVEQklUUyhoZXJlLmJpdHMgKyA3KTtcbiAgICAgICAgICAgIG4gPSBoZXJlX2JpdHMgKyA3O1xuICAgICAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLz09PS8vXG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgICBsZW4gPSAwO1xuICAgICAgICAgICAgY29weSA9IDExICsgKGhvbGQgJiAweDdmKTsvL0JJVFMoNyk7XG4gICAgICAgICAgICAvLy0tLSBEUk9QQklUUyg3KSAtLS0vL1xuICAgICAgICAgICAgaG9sZCA+Pj49IDc7XG4gICAgICAgICAgICBiaXRzIC09IDc7XG4gICAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGF0ZS5oYXZlICsgY29weSA+IHN0YXRlLm5sZW4gKyBzdGF0ZS5uZGlzdCkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdoaWxlIChjb3B5LS0pIHtcbiAgICAgICAgICAgIHN0YXRlLmxlbnNbc3RhdGUuaGF2ZSsrXSA9IGxlbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogaGFuZGxlIGVycm9yIGJyZWFrcyBpbiB3aGlsZSAqL1xuICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IEJBRCkgeyBicmVhazsgfVxuXG4gICAgICAvKiBjaGVjayBmb3IgZW5kLW9mLWJsb2NrIGNvZGUgKGJldHRlciBoYXZlIG9uZSkgKi9cbiAgICAgIGlmIChzdGF0ZS5sZW5zWzI1Nl0gPT09IDApIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIC8qIGJ1aWxkIGNvZGUgdGFibGVzIC0tIG5vdGU6IGRvIG5vdCBjaGFuZ2UgdGhlIGxlbmJpdHMgb3IgZGlzdGJpdHNcbiAgICAgICAgIHZhbHVlcyBoZXJlICg5IGFuZCA2KSB3aXRob3V0IHJlYWRpbmcgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgICAgICAgIGNvbmNlcm5pbmcgdGhlIEVOT1VHSCBjb25zdGFudHMsIHdoaWNoIGRlcGVuZCBvbiB0aG9zZSB2YWx1ZXMgKi9cbiAgICAgIHN0YXRlLmxlbmJpdHMgPSA5O1xuXG4gICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5sZW5iaXRzIH07XG4gICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLmxlbnMsIDAsIHN0YXRlLm5sZW4sIHN0YXRlLmxlbmNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgc3RhdGUubGVuYml0cyA9IG9wdHMuYml0cztcbiAgICAgIC8vIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5uZXh0O1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBzdGF0ZS5kaXN0Yml0cyA9IDY7XG4gICAgICAvL3N0YXRlLmRpc3Rjb2RlLmNvcHkoc3RhdGUuY29kZXMpO1xuICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW47XG4gICAgICBvcHRzID0geyBiaXRzOiBzdGF0ZS5kaXN0Yml0cyB9O1xuICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUubGVucywgc3RhdGUubmxlbiwgc3RhdGUubmRpc3QsIHN0YXRlLmRpc3Rjb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgIC8vIFdlIGhhdmUgc2VwYXJhdGUgdGFibGVzICYgbm8gcG9pbnRlcnMuIDIgY29tbWVudGVkIGxpbmVzIGJlbG93IG5vdCBuZWVkZWQuXG4gICAgICAvLyBzdGF0ZS5uZXh0X2luZGV4ID0gb3B0cy50YWJsZV9pbmRleDtcbiAgICAgIHN0YXRlLmRpc3RiaXRzID0gb3B0cy5iaXRzO1xuICAgICAgLy8gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0O1xuXG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2VzIHNldCc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgJ2luZmxhdGU6ICAgICAgIGNvZGVzIG9rXFxuJykpO1xuICAgICAgc3RhdGUubW9kZSA9IExFTl87XG4gICAgICBpZiAoZmx1c2ggPT09IFpfVFJFRVMpIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBMRU5fOlxuICAgICAgc3RhdGUubW9kZSA9IExFTjtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTjpcbiAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHtcbiAgICAgICAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICAgICAgICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICAgICAgICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gICAgICAgIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICAgICAgICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgICAgICAgc3RhdGUuYml0cyA9IGJpdHM7XG4gICAgICAgIC8vLS0tXG4gICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBfb3V0KTtcbiAgICAgICAgLy8tLS0gTE9BRCgpIC0tLVxuICAgICAgICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICAgICAgICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgICAgICAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICAgICAgICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICAgICAgICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gICAgICAgIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICAgICAgICBob2xkID0gc3RhdGUuaG9sZDtcbiAgICAgICAgYml0cyA9IHN0YXRlLmJpdHM7XG4gICAgICAgIC8vLS0tXG5cbiAgICAgICAgaWYgKHN0YXRlLm1vZGUgPT09IFRZUEUpIHtcbiAgICAgICAgICBzdGF0ZS5iYWNrID0gLTE7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5iYWNrID0gMDtcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaGVyZSA9IHN0YXRlLmxlbmNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5sZW5iaXRzKSAtIDEpXTsgIC8qQklUUyhzdGF0ZS5sZW5iaXRzKSovXG4gICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICBpZiAoaGVyZV9iaXRzIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmJiAoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtsYXN0X3ZhbCArXG4gICAgICAgICAgICAgICAgICAoKGhvbGQgJiAoKDEgPDwgKGxhc3RfYml0cyArIGxhc3Rfb3ApKSAtIDEpKS8qQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSovID4+IGxhc3RfYml0cyldO1xuICAgICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgICBpZiAoKGxhc3RfYml0cyArIGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAgIC8vLS0tIFBVTExCWVRFKCkgLS0tLy9cbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgfVxuICAgICAgICAvLy0tLSBEUk9QQklUUyhsYXN0LmJpdHMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBsYXN0X2JpdHM7XG4gICAgICAgIGJpdHMgLT0gbGFzdF9iaXRzO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gbGFzdF9iaXRzO1xuICAgICAgfVxuICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgLy8tLS0vL1xuICAgICAgc3RhdGUuYmFjayArPSBoZXJlX2JpdHM7XG4gICAgICBzdGF0ZS5sZW5ndGggPSBoZXJlX3ZhbDtcbiAgICAgIGlmIChoZXJlX29wID09PSAwKSB7XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBoZXJlLnZhbCA+PSAweDIwICYmIGhlcmUudmFsIDwgMHg3ZiA/XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXFxuXCIgOlxuICAgICAgICAvLyAgICAgICAgXCJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XFxuXCIsIGhlcmUudmFsKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMSVQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGhlcmVfb3AgJiAzMikge1xuICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xcblwiKSk7XG4gICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLmV4dHJhID0gaGVyZV9vcCAmIDE1O1xuICAgICAgc3RhdGUubW9kZSA9IExFTkVYVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTkVYVDpcbiAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmxlbmd0aCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICB9XG4gICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxcblwiLCBzdGF0ZS5sZW5ndGgpKTtcbiAgICAgIHN0YXRlLndhcyA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIHN0YXRlLm1vZGUgPSBESVNUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRElTVDpcbiAgICAgIGZvciAoOzspIHtcbiAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUuZGlzdGJpdHMpIC0gMSldOy8qQklUUyhzdGF0ZS5kaXN0Yml0cykqL1xuICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICBoZXJlX3ZhbCA9IGhlcmUgJiAweGZmZmY7XG5cbiAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgaGF2ZS0tO1xuICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAvLy0tLS8vXG4gICAgICB9XG4gICAgICBpZiAoKGhlcmVfb3AgJiAweGYwKSA9PT0gMCkge1xuICAgICAgICBsYXN0X2JpdHMgPSBoZXJlX2JpdHM7XG4gICAgICAgIGxhc3Rfb3AgPSBoZXJlX29wO1xuICAgICAgICBsYXN0X3ZhbCA9IGhlcmVfdmFsO1xuICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgaGVyZSA9IHN0YXRlLmRpc3Rjb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAvLy0tLS8vXG4gICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgIGlmIChoZXJlX29wICYgNjQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSBjb2RlJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5vZmZzZXQgPSBoZXJlX3ZhbDtcbiAgICAgIHN0YXRlLmV4dHJhID0gKGhlcmVfb3ApICYgMTU7XG4gICAgICBzdGF0ZS5tb2RlID0gRElTVEVYVDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIERJU1RFWFQ6XG4gICAgICBpZiAoc3RhdGUuZXh0cmEpIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoc3RhdGUuZXh0cmEpO1xuICAgICAgICBuID0gc3RhdGUuZXh0cmE7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5vZmZzZXQgKz0gaG9sZCAmICgoMSA8PCBzdGF0ZS5leHRyYSkgLSAxKS8qQklUUyhzdGF0ZS5leHRyYSkqLztcbiAgICAgICAgLy8tLS0gRFJPUEJJVFMoc3RhdGUuZXh0cmEpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSBzdGF0ZS5leHRyYTtcbiAgICAgICAgYml0cyAtPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IHN0YXRlLmV4dHJhO1xuICAgICAgfVxuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBzdGF0ZS5kbWF4KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4vLyNlbmRpZlxuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxcblwiLCBzdGF0ZS5vZmZzZXQpKTtcbiAgICAgIHN0YXRlLm1vZGUgPSBNQVRDSDtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIE1BVENIOlxuICAgICAgaWYgKGxlZnQgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICBjb3B5ID0gX291dCAtIGxlZnQ7XG4gICAgICBpZiAoc3RhdGUub2Zmc2V0ID4gY29weSkgeyAgICAgICAgIC8qIGNvcHkgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgY29weSA9IHN0YXRlLm9mZnNldCAtIGNvcHk7XG4gICAgICAgIGlmIChjb3B5ID4gc3RhdGUud2hhdmUpIHtcbiAgICAgICAgICBpZiAoc3RhdGUuc2FuZSkge1xuICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbi8vICghKSBUaGlzIGJsb2NrIGlzIGRpc2FibGVkIGluIHpsaWIgZGVmYWlsdHMsXG4vLyBkb24ndCBlbmFibGUgaXQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5XG4vLyNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlJcbi8vICAgICAgICAgIFRyYWNlKChzdGRlcnIsIFwiaW5mbGF0ZS5jIHRvbyBmYXJcXG5cIikpO1xuLy8gICAgICAgICAgY29weSAtPSBzdGF0ZS53aGF2ZTtcbi8vICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbi8vICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuLy8gICAgICAgICAgbGVmdCAtPSBjb3B5O1xuLy8gICAgICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4vLyAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgIG91dHB1dFtwdXQrK10gPSAwO1xuLy8gICAgICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbi8vICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuLy8gICAgICAgICAgYnJlYWs7XG4vLyNlbmRpZlxuICAgICAgICB9XG4gICAgICAgIGlmIChjb3B5ID4gc3RhdGUud25leHQpIHtcbiAgICAgICAgICBjb3B5IC09IHN0YXRlLnduZXh0O1xuICAgICAgICAgIGZyb20gPSBzdGF0ZS53c2l6ZSAtIGNvcHk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgZnJvbSA9IHN0YXRlLnduZXh0IC0gY29weTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29weSA+IHN0YXRlLmxlbmd0aCkgeyBjb3B5ID0gc3RhdGUubGVuZ3RoOyB9XG4gICAgICAgIGZyb21fc291cmNlID0gc3RhdGUud2luZG93O1xuICAgICAgfVxuICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29weSBmcm9tIG91dHB1dCAqL1xuICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLm9mZnNldDtcbiAgICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGlmIChjb3B5ID4gbGVmdCkgeyBjb3B5ID0gbGVmdDsgfVxuICAgICAgbGVmdCAtPSBjb3B5O1xuICAgICAgc3RhdGUubGVuZ3RoIC09IGNvcHk7XG4gICAgICBkbyB7XG4gICAgICAgIG91dHB1dFtwdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgfSB3aGlsZSAoLS1jb3B5KTtcbiAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHsgc3RhdGUubW9kZSA9IExFTjsgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBMSVQ6XG4gICAgICBpZiAobGVmdCA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIG91dHB1dFtwdXQrK10gPSBzdGF0ZS5sZW5ndGg7XG4gICAgICBsZWZ0LS07XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBDSEVDSzpcbiAgICAgIGlmIChzdGF0ZS53cmFwKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDMyKTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCAzMikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAvLyBVc2UgJ3wnIGluc2RlYWQgb2YgJysnIHRvIG1ha2Ugc3VyZSB0aGF0IHJlc3VsdCBpcyBzaWduZWRcbiAgICAgICAgICBob2xkIHw9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBfb3V0IC09IGxlZnQ7XG4gICAgICAgIHN0cm0udG90YWxfb3V0ICs9IF9vdXQ7XG4gICAgICAgIHN0YXRlLnRvdGFsICs9IF9vdXQ7XG4gICAgICAgIGlmIChfb3V0KSB7XG4gICAgICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID1cbiAgICAgICAgICAgICAgLypVUERBVEUoc3RhdGUuY2hlY2ssIHB1dCAtIF9vdXQsIF9vdXQpOyovXG4gICAgICAgICAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBwdXQgLSBfb3V0KSk7XG5cbiAgICAgICAgfVxuICAgICAgICBfb3V0ID0gbGVmdDtcbiAgICAgICAgLy8gTkI6IGNyYzMyIHN0b3JlZCBhcyBzaWduZWQgMzItYml0IGludCwgenN3YXAzMiByZXR1cm5zIHNpZ25lZCB0b29cbiAgICAgICAgaWYgKChzdGF0ZS5mbGFncyA/IGhvbGQgOiB6c3dhcDMyKGhvbGQpKSAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgICAgICBzdHJtLm1zZyA9ICdpbmNvcnJlY3QgZGF0YSBjaGVjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGNoZWNrIG1hdGNoZXMgdHJhaWxlclxcblwiKSk7XG4gICAgICB9XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOR1RIO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVOR1RIOlxuICAgICAgaWYgKHN0YXRlLndyYXAgJiYgc3RhdGUuZmxhZ3MpIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIGlmIChob2xkICE9PSAoc3RhdGUudG90YWwgJiAweGZmZmZmZmZmKSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBsZW5ndGggY2hlY2snO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBsZW5ndGggbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBET05FO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRE9ORTpcbiAgICAgIHJldCA9IFpfU1RSRUFNX0VORDtcbiAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICBjYXNlIEJBRDpcbiAgICAgIHJldCA9IFpfREFUQV9FUlJPUjtcbiAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICBjYXNlIE1FTTpcbiAgICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgICBjYXNlIFNZTkM6XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgICB9XG4gIH1cblxuICAvLyBpbmZfbGVhdmUgPC0gaGVyZSBpcyByZWFsIHBsYWNlIGZvciBcImdvdG8gaW5mX2xlYXZlXCIsIGVtdWxhdGVkIHZpYSBcImJyZWFrIGluZl9sZWF2ZVwiXG5cbiAgLypcbiAgICAgUmV0dXJuIGZyb20gaW5mbGF0ZSgpLCB1cGRhdGluZyB0aGUgdG90YWwgY291bnRzIGFuZCB0aGUgY2hlY2sgdmFsdWUuXG4gICAgIElmIHRoZXJlIHdhcyBubyBwcm9ncmVzcyBkdXJpbmcgdGhlIGluZmxhdGUoKSBjYWxsLCByZXR1cm4gYSBidWZmZXJcbiAgICAgZXJyb3IuICBDYWxsIHVwZGF0ZXdpbmRvdygpIHRvIGNyZWF0ZSBhbmQvb3IgdXBkYXRlIHRoZSB3aW5kb3cgc3RhdGUuXG4gICAgIE5vdGU6IGEgbWVtb3J5IGVycm9yIGZyb20gaW5mbGF0ZSgpIGlzIG5vbi1yZWNvdmVyYWJsZS5cbiAgICovXG5cbiAgLy8tLS0gUkVTVE9SRSgpIC0tLVxuICBzdHJtLm5leHRfb3V0ID0gcHV0O1xuICBzdHJtLmF2YWlsX291dCA9IGxlZnQ7XG4gIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBoYXZlO1xuICBzdGF0ZS5ob2xkID0gaG9sZDtcbiAgc3RhdGUuYml0cyA9IGJpdHM7XG4gIC8vLS0tXG5cbiAgaWYgKHN0YXRlLndzaXplIHx8IChfb3V0ICE9PSBzdHJtLmF2YWlsX291dCAmJiBzdGF0ZS5tb2RlIDwgQkFEICYmXG4gICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPCBDSEVDSyB8fCBmbHVzaCAhPT0gWl9GSU5JU0gpKSkge1xuICAgIGlmICh1cGRhdGV3aW5kb3coc3RybSwgc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQsIF9vdXQgLSBzdHJtLmF2YWlsX291dCkpIHtcbiAgICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gICAgfVxuICB9XG4gIF9pbiAtPSBzdHJtLmF2YWlsX2luO1xuICBfb3V0IC09IHN0cm0uYXZhaWxfb3V0O1xuICBzdHJtLnRvdGFsX2luICs9IF9pbjtcbiAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgaWYgKHN0YXRlLndyYXAgJiYgX291dCkge1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IC8qVVBEQVRFKHN0YXRlLmNoZWNrLCBzdHJtLm5leHRfb3V0IC0gX291dCwgX291dCk7Ki9cbiAgICAgIChzdGF0ZS5mbGFncyA/IGNyYzMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHN0cm0ubmV4dF9vdXQgLSBfb3V0KSA6IGFkbGVyMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpKTtcbiAgfVxuICBzdHJtLmRhdGFfdHlwZSA9IHN0YXRlLmJpdHMgKyAoc3RhdGUubGFzdCA/IDY0IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA9PT0gVFlQRSA/IDEyOCA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHN0YXRlLm1vZGUgPT09IExFTl8gfHwgc3RhdGUubW9kZSA9PT0gQ09QWV8gPyAyNTYgOiAwKTtcbiAgaWYgKCgoX2luID09PSAwICYmIF9vdXQgPT09IDApIHx8IGZsdXNoID09PSBaX0ZJTklTSCkgJiYgcmV0ID09PSBaX09LKSB7XG4gICAgcmV0ID0gWl9CVUZfRVJST1I7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUVuZChzdHJtKSB7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIC8qfHwgc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKi8pIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICB2YXIgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBpZiAoc3RhdGUud2luZG93KSB7XG4gICAgc3RhdGUud2luZG93ID0gbnVsbDtcbiAgfVxuICBzdHJtLnN0YXRlID0gbnVsbDtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVHZXRIZWFkZXIoc3RybSwgaGVhZCkge1xuICB2YXIgc3RhdGU7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmICgoc3RhdGUud3JhcCAmIDIpID09PSAwKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuXG4gIC8qIHNhdmUgaGVhZGVyIHN0cnVjdHVyZSAqL1xuICBzdGF0ZS5oZWFkID0gaGVhZDtcbiAgaGVhZC5kb25lID0gZmFsc2U7XG4gIHJldHVybiBaX09LO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlU2V0RGljdGlvbmFyeShzdHJtLCBkaWN0aW9uYXJ5KSB7XG4gIHZhciBkaWN0TGVuZ3RoID0gZGljdGlvbmFyeS5sZW5ndGg7XG5cbiAgdmFyIHN0YXRlO1xuICB2YXIgZGljdGlkO1xuICB2YXIgcmV0O1xuXG4gIC8qIGNoZWNrIHN0YXRlICovXG4gIGlmICghc3RybSAvKiA9PSBaX05VTEwgKi8gfHwgIXN0cm0uc3RhdGUgLyogPT0gWl9OVUxMICovKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKHN0YXRlLndyYXAgIT09IDAgJiYgc3RhdGUubW9kZSAhPT0gRElDVCkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBjb3JyZWN0IGRpY3Rpb25hcnkgaWRlbnRpZmllciAqL1xuICBpZiAoc3RhdGUubW9kZSA9PT0gRElDVCkge1xuICAgIGRpY3RpZCA9IDE7IC8qIGFkbGVyMzIoMCwgbnVsbCwgMCkqL1xuICAgIC8qIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsgKi9cbiAgICBkaWN0aWQgPSBhZGxlcjMyKGRpY3RpZCwgZGljdGlvbmFyeSwgZGljdExlbmd0aCwgMCk7XG4gICAgaWYgKGRpY3RpZCAhPT0gc3RhdGUuY2hlY2spIHtcbiAgICAgIHJldHVybiBaX0RBVEFfRVJST1I7XG4gICAgfVxuICB9XG4gIC8qIGNvcHkgZGljdGlvbmFyeSB0byB3aW5kb3cgdXNpbmcgdXBkYXRld2luZG93KCksIHdoaWNoIHdpbGwgYW1lbmQgdGhlXG4gICBleGlzdGluZyBkaWN0aW9uYXJ5IGlmIGFwcHJvcHJpYXRlICovXG4gIHJldCA9IHVwZGF0ZXdpbmRvdyhzdHJtLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCBkaWN0TGVuZ3RoKTtcbiAgaWYgKHJldCkge1xuICAgIHN0YXRlLm1vZGUgPSBNRU07XG4gICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICB9XG4gIHN0YXRlLmhhdmVkaWN0ID0gMTtcbiAgLy8gVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICBkaWN0aW9uYXJ5IHNldFxcblwiKSk7XG4gIHJldHVybiBaX09LO1xufVxuXG5leHBvcnRzLmluZmxhdGVSZXNldCA9IGluZmxhdGVSZXNldDtcbmV4cG9ydHMuaW5mbGF0ZVJlc2V0MiA9IGluZmxhdGVSZXNldDI7XG5leHBvcnRzLmluZmxhdGVSZXNldEtlZXAgPSBpbmZsYXRlUmVzZXRLZWVwO1xuZXhwb3J0cy5pbmZsYXRlSW5pdCA9IGluZmxhdGVJbml0O1xuZXhwb3J0cy5pbmZsYXRlSW5pdDIgPSBpbmZsYXRlSW5pdDI7XG5leHBvcnRzLmluZmxhdGUgPSBpbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlRW5kID0gaW5mbGF0ZUVuZDtcbmV4cG9ydHMuaW5mbGF0ZUdldEhlYWRlciA9IGluZmxhdGVHZXRIZWFkZXI7XG5leHBvcnRzLmluZmxhdGVTZXREaWN0aW9uYXJ5ID0gaW5mbGF0ZVNldERpY3Rpb25hcnk7XG5leHBvcnRzLmluZmxhdGVJbmZvID0gJ3Bha28gaW5mbGF0ZSAoZnJvbSBOb2RlY2EgcHJvamVjdCknO1xuXG4vKiBOb3QgaW1wbGVtZW50ZWRcbmV4cG9ydHMuaW5mbGF0ZUNvcHkgPSBpbmZsYXRlQ29weTtcbmV4cG9ydHMuaW5mbGF0ZUdldERpY3Rpb25hcnkgPSBpbmZsYXRlR2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZU1hcmsgPSBpbmZsYXRlTWFyaztcbmV4cG9ydHMuaW5mbGF0ZVByaW1lID0gaW5mbGF0ZVByaW1lO1xuZXhwb3J0cy5pbmZsYXRlU3luYyA9IGluZmxhdGVTeW5jO1xuZXhwb3J0cy5pbmZsYXRlU3luY1BvaW50ID0gaW5mbGF0ZVN5bmNQb2ludDtcbmV4cG9ydHMuaW5mbGF0ZVVuZGVybWluZSA9IGluZmxhdGVVbmRlcm1pbmU7XG4qL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xuXG52YXIgTUFYQklUUyA9IDE1O1xudmFyIEVOT1VHSF9MRU5TID0gODUyO1xudmFyIEVOT1VHSF9ESVNUUyA9IDU5Mjtcbi8vdmFyIEVOT1VHSCA9IChFTk9VR0hfTEVOUytFTk9VR0hfRElTVFMpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxudmFyIGxiYXNlID0gWyAvKiBMZW5ndGggY29kZXMgMjU3Li4yODUgYmFzZSAqL1xuICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLFxuICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMFxuXTtcblxudmFyIGxleHQgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCxcbiAgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMTYsIDcyLCA3OFxuXTtcblxudmFyIGRiYXNlID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBiYXNlICovXG4gIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MyxcbiAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LFxuICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3LCAwLCAwXG5dO1xuXG52YXIgZGV4dCA9IFsgLyogRGlzdGFuY2UgY29kZXMgMC4uMjkgZXh0cmEgKi9cbiAgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMiwgMjIsXG4gIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAyNiwgMjcsIDI3LFxuICAyOCwgMjgsIDI5LCAyOSwgNjQsIDY0XG5dO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluZmxhdGVfdGFibGUodHlwZSwgbGVucywgbGVuc19pbmRleCwgY29kZXMsIHRhYmxlLCB0YWJsZV9pbmRleCwgd29yaywgb3B0cylcbntcbiAgdmFyIGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAvL2hlcmUgPSBvcHRzLmhlcmU7IC8qIHRhYmxlIGVudHJ5IGZvciBkdXBsaWNhdGlvbiAqL1xuXG4gIHZhciBsZW4gPSAwOyAgICAgICAgICAgICAgIC8qIGEgY29kZSdzIGxlbmd0aCBpbiBiaXRzICovXG4gIHZhciBzeW0gPSAwOyAgICAgICAgICAgICAgIC8qIGluZGV4IG9mIGNvZGUgc3ltYm9scyAqL1xuICB2YXIgbWluID0gMCwgbWF4ID0gMDsgICAgICAgICAgLyogbWluaW11bSBhbmQgbWF4aW11bSBjb2RlIGxlbmd0aHMgKi9cbiAgdmFyIHJvb3QgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHJvb3QgdGFibGUgKi9cbiAgdmFyIGN1cnIgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIGN1cnJlbnQgdGFibGUgKi9cbiAgdmFyIGRyb3AgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBiaXRzIHRvIGRyb3AgZm9yIHN1Yi10YWJsZSAqL1xuICB2YXIgbGVmdCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBwcmVmaXggY29kZXMgYXZhaWxhYmxlICovXG4gIHZhciB1c2VkID0gMDsgICAgICAgICAgICAgIC8qIGNvZGUgZW50cmllcyBpbiB0YWJsZSB1c2VkICovXG4gIHZhciBodWZmID0gMDsgICAgICAgICAgICAgIC8qIEh1ZmZtYW4gY29kZSAqL1xuICB2YXIgaW5jcjsgICAgICAgICAgICAgIC8qIGZvciBpbmNyZW1lbnRpbmcgY29kZSwgaW5kZXggKi9cbiAgdmFyIGZpbGw7ICAgICAgICAgICAgICAvKiBpbmRleCBmb3IgcmVwbGljYXRpbmcgZW50cmllcyAqL1xuICB2YXIgbG93OyAgICAgICAgICAgICAgIC8qIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkgKi9cbiAgdmFyIG1hc2s7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBsb3cgcm9vdCBiaXRzICovXG4gIHZhciBuZXh0OyAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiB0YWJsZSAqL1xuICB2YXIgYmFzZSA9IG51bGw7ICAgICAvKiBiYXNlIHZhbHVlIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgYmFzZV9pbmRleCA9IDA7XG4vLyAgdmFyIHNob2V4dHJhOyAgICAvKiBleHRyYSBiaXRzIHRhYmxlIHRvIHVzZSAqL1xuICB2YXIgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogdXNlIGJhc2UgYW5kIGV4dHJhIGZvciBzeW1ib2wgPiBlbmQgKi9cbiAgdmFyIGNvdW50ID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgLyogbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoICovXG4gIHZhciBvZmZzID0gbmV3IHV0aWxzLkJ1ZjE2KE1BWEJJVFMgKyAxKTsgLy9bTUFYQklUUysxXTsgICAgIC8qIG9mZnNldHMgaW4gdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovXG4gIHZhciBleHRyYSA9IG51bGw7XG4gIHZhciBleHRyYV9pbmRleCA9IDA7XG5cbiAgdmFyIGhlcmVfYml0cywgaGVyZV9vcCwgaGVyZV92YWw7XG5cbiAgLypcbiAgIFByb2Nlc3MgYSBzZXQgb2YgY29kZSBsZW5ndGhzIHRvIGNyZWF0ZSBhIGNhbm9uaWNhbCBIdWZmbWFuIGNvZGUuICBUaGVcbiAgIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIEVhY2ggbGVuZ3RoIGNvcnJlc3BvbmRzIHRvIHRoZVxuICAgc3ltYm9scyAwLi5jb2Rlcy0xLiAgVGhlIEh1ZmZtYW4gY29kZSBpcyBnZW5lcmF0ZWQgYnkgZmlyc3Qgc29ydGluZyB0aGVcbiAgIHN5bWJvbHMgYnkgbGVuZ3RoIGZyb20gc2hvcnQgdG8gbG9uZywgYW5kIHJldGFpbmluZyB0aGUgc3ltYm9sIG9yZGVyXG4gICBmb3IgY29kZXMgd2l0aCBlcXVhbCBsZW5ndGhzLiAgVGhlbiB0aGUgY29kZSBzdGFydHMgd2l0aCBhbGwgemVybyBiaXRzXG4gICBmb3IgdGhlIGZpcnN0IGNvZGUgb2YgdGhlIHNob3J0ZXN0IGxlbmd0aCwgYW5kIHRoZSBjb2RlcyBhcmUgaW50ZWdlclxuICAgaW5jcmVtZW50cyBmb3IgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgemVyb3MgYXJlIGFwcGVuZGVkIGFzIHRoZSBsZW5ndGhcbiAgIGluY3JlYXNlcy4gIEZvciB0aGUgZGVmbGF0ZSBmb3JtYXQsIHRoZXNlIGJpdHMgYXJlIHN0b3JlZCBiYWNrd2FyZHNcbiAgIGZyb20gdGhlaXIgbW9yZSBuYXR1cmFsIGludGVnZXIgaW5jcmVtZW50IG9yZGVyaW5nLCBhbmQgc28gd2hlbiB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcyBhcmUgYnVpbHQgaW4gdGhlIGxhcmdlIGxvb3AgYmVsb3csIHRoZSBpbnRlZ2VyIGNvZGVzXG4gICBhcmUgaW5jcmVtZW50ZWQgYmFja3dhcmRzLlxuXG4gICBUaGlzIHJvdXRpbmUgYXNzdW1lcywgYnV0IGRvZXMgbm90IGNoZWNrLCB0aGF0IGFsbCBvZiB0aGUgZW50cmllcyBpblxuICAgbGVuc1tdIGFyZSBpbiB0aGUgcmFuZ2UgMC4uTUFYQklUUy4gIFRoZSBjYWxsZXIgbXVzdCBhc3N1cmUgdGhpcy5cbiAgIDEuLk1BWEJJVFMgaXMgaW50ZXJwcmV0ZWQgYXMgdGhhdCBjb2RlIGxlbmd0aC4gIHplcm8gbWVhbnMgdGhhdCB0aGF0XG4gICBzeW1ib2wgZG9lcyBub3Qgb2NjdXIgaW4gdGhpcyBjb2RlLlxuXG4gICBUaGUgY29kZXMgYXJlIHNvcnRlZCBieSBjb21wdXRpbmcgYSBjb3VudCBvZiBjb2RlcyBmb3IgZWFjaCBsZW5ndGgsXG4gICBjcmVhdGluZyBmcm9tIHRoYXQgYSB0YWJsZSBvZiBzdGFydGluZyBpbmRpY2VzIGZvciBlYWNoIGxlbmd0aCBpbiB0aGVcbiAgIHNvcnRlZCB0YWJsZSwgYW5kIHRoZW4gZW50ZXJpbmcgdGhlIHN5bWJvbHMgaW4gb3JkZXIgaW4gdGhlIHNvcnRlZFxuICAgdGFibGUuICBUaGUgc29ydGVkIHRhYmxlIGlzIHdvcmtbXSwgd2l0aCB0aGF0IHNwYWNlIGJlaW5nIHByb3ZpZGVkIGJ5XG4gICB0aGUgY2FsbGVyLlxuXG4gICBUaGUgbGVuZ3RoIGNvdW50cyBhcmUgdXNlZCBmb3Igb3RoZXIgcHVycG9zZXMgYXMgd2VsbCwgaS5lLiBmaW5kaW5nXG4gICB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGggY29kZXMsIGRldGVybWluaW5nIGlmIHRoZXJlIGFyZSBhbnlcbiAgIGNvZGVzIGF0IGFsbCwgY2hlY2tpbmcgZm9yIGEgdmFsaWQgc2V0IG9mIGxlbmd0aHMsIGFuZCBsb29raW5nIGFoZWFkXG4gICBhdCBsZW5ndGggY291bnRzIHRvIGRldGVybWluZSBzdWItdGFibGUgc2l6ZXMgd2hlbiBidWlsZGluZyB0aGVcbiAgIGRlY29kaW5nIHRhYmxlcy5cbiAgICovXG5cbiAgLyogYWNjdW11bGF0ZSBsZW5ndGhzIGZvciBjb2RlcyAoYXNzdW1lcyBsZW5zW10gYWxsIGluIDAuLk1BWEJJVFMpICovXG4gIGZvciAobGVuID0gMDsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgY291bnRbbGVuXSA9IDA7XG4gIH1cbiAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspIHtcbiAgICBjb3VudFtsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrO1xuICB9XG5cbiAgLyogYm91bmQgY29kZSBsZW5ndGhzLCBmb3JjZSByb290IHRvIGJlIHdpdGhpbiBjb2RlIGxlbmd0aHMgKi9cbiAgcm9vdCA9IGJpdHM7XG4gIGZvciAobWF4ID0gTUFYQklUUzsgbWF4ID49IDE7IG1heC0tKSB7XG4gICAgaWYgKGNvdW50W21heF0gIT09IDApIHsgYnJlYWs7IH1cbiAgfVxuICBpZiAocm9vdCA+IG1heCkge1xuICAgIHJvb3QgPSBtYXg7XG4gIH1cbiAgaWYgKG1heCA9PT0gMCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHN5bWJvbHMgdG8gY29kZSBhdCBhbGwgKi9cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7ICAvL2hlcmUub3AgPSAodmFyIGNoYXIpNjQ7ICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxOyAgIC8vaGVyZS5iaXRzID0gKHZhciBjaGFyKTE7XG4gICAgLy90YWJsZS52YWxbb3B0cy50YWJsZV9pbmRleCsrXSA9IDA7ICAgLy9oZXJlLnZhbCA9ICh2YXIgc2hvcnQpMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG5cbiAgICAvL3RhYmxlLm9wW29wdHMudGFibGVfaW5kZXhdID0gNjQ7XG4gICAgLy90YWJsZS5iaXRzW29wdHMudGFibGVfaW5kZXhdID0gMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDtcbiAgICB0YWJsZVt0YWJsZV9pbmRleCsrXSA9ICgxIDw8IDI0KSB8ICg2NCA8PCAxNikgfCAwO1xuXG4gICAgb3B0cy5iaXRzID0gMTtcbiAgICByZXR1cm4gMDsgICAgIC8qIG5vIHN5bWJvbHMsIGJ1dCB3YWl0IGZvciBkZWNvZGluZyB0byByZXBvcnQgZXJyb3IgKi9cbiAgfVxuICBmb3IgKG1pbiA9IDE7IG1pbiA8IG1heDsgbWluKyspIHtcbiAgICBpZiAoY291bnRbbWluXSAhPT0gMCkgeyBicmVhazsgfVxuICB9XG4gIGlmIChyb290IDwgbWluKSB7XG4gICAgcm9vdCA9IG1pbjtcbiAgfVxuXG4gIC8qIGNoZWNrIGZvciBhbiBvdmVyLXN1YnNjcmliZWQgb3IgaW5jb21wbGV0ZSBzZXQgb2YgbGVuZ3RocyAqL1xuICBsZWZ0ID0gMTtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBsZWZ0IDw8PSAxO1xuICAgIGxlZnQgLT0gY291bnRbbGVuXTtcbiAgICBpZiAobGVmdCA8IDApIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9ICAgICAgICAvKiBvdmVyLXN1YnNjcmliZWQgKi9cbiAgfVxuICBpZiAobGVmdCA+IDAgJiYgKHR5cGUgPT09IENPREVTIHx8IG1heCAhPT0gMSkpIHtcbiAgICByZXR1cm4gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgc2V0ICovXG4gIH1cblxuICAvKiBnZW5lcmF0ZSBvZmZzZXRzIGludG8gc3ltYm9sIHRhYmxlIGZvciBlYWNoIGxlbmd0aCBmb3Igc29ydGluZyAqL1xuICBvZmZzWzFdID0gMDtcbiAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykge1xuICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xlbl0gKyBjb3VudFtsZW5dO1xuICB9XG5cbiAgLyogc29ydCBzeW1ib2xzIGJ5IGxlbmd0aCwgYnkgc3ltYm9sIG9yZGVyIHdpdGhpbiBlYWNoIGxlbmd0aCAqL1xuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGlmIChsZW5zW2xlbnNfaW5kZXggKyBzeW1dICE9PSAwKSB7XG4gICAgICB3b3JrW29mZnNbbGVuc1tsZW5zX2luZGV4ICsgc3ltXV0rK10gPSBzeW07XG4gICAgfVxuICB9XG5cbiAgLypcbiAgIENyZWF0ZSBhbmQgZmlsbCBpbiBkZWNvZGluZyB0YWJsZXMuICBJbiB0aGlzIGxvb3AsIHRoZSB0YWJsZSBiZWluZ1xuICAgZmlsbGVkIGlzIGF0IG5leHQgYW5kIGhhcyBjdXJyIGluZGV4IGJpdHMuICBUaGUgY29kZSBiZWluZyB1c2VkIGlzIGh1ZmZcbiAgIHdpdGggbGVuZ3RoIGxlbi4gIFRoYXQgY29kZSBpcyBjb252ZXJ0ZWQgdG8gYW4gaW5kZXggYnkgZHJvcHBpbmcgZHJvcFxuICAgYml0cyBvZmYgb2YgdGhlIGJvdHRvbS4gIEZvciBjb2RlcyB3aGVyZSBsZW4gaXMgbGVzcyB0aGFuIGRyb3AgKyBjdXJyLFxuICAgdGhvc2UgdG9wIGRyb3AgKyBjdXJyIC0gbGVuIGJpdHMgYXJlIGluY3JlbWVudGVkIHRocm91Z2ggYWxsIHZhbHVlcyB0b1xuICAgZmlsbCB0aGUgdGFibGUgd2l0aCByZXBsaWNhdGVkIGVudHJpZXMuXG5cbiAgIHJvb3QgaXMgdGhlIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciB0aGUgcm9vdCB0YWJsZS4gIFdoZW4gbGVuIGV4Y2VlZHNcbiAgIHJvb3QsIHN1Yi10YWJsZXMgYXJlIGNyZWF0ZWQgcG9pbnRlZCB0byBieSB0aGUgcm9vdCBlbnRyeSB3aXRoIGFuIGluZGV4XG4gICBvZiB0aGUgbG93IHJvb3QgYml0cyBvZiBodWZmLiAgVGhpcyBpcyBzYXZlZCBpbiBsb3cgdG8gY2hlY2sgZm9yIHdoZW4gYVxuICAgbmV3IHN1Yi10YWJsZSBzaG91bGQgYmUgc3RhcnRlZC4gIGRyb3AgaXMgemVybyB3aGVuIHRoZSByb290IHRhYmxlIGlzXG4gICBiZWluZyBmaWxsZWQsIGFuZCBkcm9wIGlzIHJvb3Qgd2hlbiBzdWItdGFibGVzIGFyZSBiZWluZyBmaWxsZWQuXG5cbiAgIFdoZW4gYSBuZXcgc3ViLXRhYmxlIGlzIG5lZWRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvb2sgYWhlYWQgaW4gdGhlXG4gICBjb2RlIGxlbmd0aHMgdG8gZGV0ZXJtaW5lIHdoYXQgc2l6ZSBzdWItdGFibGUgaXMgbmVlZGVkLiAgVGhlIGxlbmd0aFxuICAgY291bnRzIGFyZSB1c2VkIGZvciB0aGlzLCBhbmQgc28gY291bnRbXSBpcyBkZWNyZW1lbnRlZCBhcyBjb2RlcyBhcmVcbiAgIGVudGVyZWQgaW4gdGhlIHRhYmxlcy5cblxuICAgdXNlZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSB0YWJsZSBlbnRyaWVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSB0aGVcbiAgIHByb3ZpZGVkICp0YWJsZSBzcGFjZS4gIEl0IGlzIGNoZWNrZWQgZm9yIExFTlMgYW5kIERJU1QgdGFibGVzIGFnYWluc3RcbiAgIHRoZSBjb25zdGFudHMgRU5PVUdIX0xFTlMgYW5kIEVOT1VHSF9ESVNUUyB0byBndWFyZCBhZ2FpbnN0IGNoYW5nZXMgaW5cbiAgIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSBjb25zdGFudHMuICBTZWUgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmhcbiAgIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXG4gICBzeW0gaW5jcmVtZW50cyB0aHJvdWdoIGFsbCBzeW1ib2xzLCBhbmQgdGhlIGxvb3AgdGVybWluYXRlcyB3aGVuXG4gICBhbGwgY29kZXMgb2YgbGVuZ3RoIG1heCwgaS5lLiBhbGwgY29kZXMsIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGlzXG4gICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzXG4gICBpbiB0aGUgcmVzdCBvZiB0aGUgZGVjb2RpbmcgdGFibGVzIHdpdGggaW52YWxpZCBjb2RlIG1hcmtlcnMuXG4gICAqL1xuXG4gIC8qIHNldCB1cCBmb3IgY29kZSB0eXBlICovXG4gIC8vIHBvb3IgbWFuIG9wdGltaXphdGlvbiAtIHVzZSBpZi1lbHNlIGluc3RlYWQgb2Ygc3dpdGNoLFxuICAvLyB0byBhdm9pZCBkZW9wdHMgaW4gb2xkIHY4XG4gIGlmICh0eXBlID09PSBDT0RFUykge1xuICAgIGJhc2UgPSBleHRyYSA9IHdvcms7ICAgIC8qIGR1bW15IHZhbHVlLS1ub3QgdXNlZCAqL1xuICAgIGVuZCA9IDE5O1xuXG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gTEVOUykge1xuICAgIGJhc2UgPSBsYmFzZTtcbiAgICBiYXNlX2luZGV4IC09IDI1NztcbiAgICBleHRyYSA9IGxleHQ7XG4gICAgZXh0cmFfaW5kZXggLT0gMjU3O1xuICAgIGVuZCA9IDI1NjtcblxuICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgLyogRElTVFMgKi9cbiAgICBiYXNlID0gZGJhc2U7XG4gICAgZXh0cmEgPSBkZXh0O1xuICAgIGVuZCA9IC0xO1xuICB9XG5cbiAgLyogaW5pdGlhbGl6ZSBvcHRzIGZvciBsb29wICovXG4gIGh1ZmYgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlICovXG4gIHN5bSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIHN5bWJvbCAqL1xuICBsZW4gPSBtaW47ICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSBsZW5ndGggKi9cbiAgbmV4dCA9IHRhYmxlX2luZGV4OyAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSB0byBmaWxsIGluICovXG4gIGN1cnIgPSByb290OyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi9cbiAgZHJvcCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgYml0cyB0byBkcm9wIGZyb20gY29kZSBmb3IgaW5kZXggKi9cbiAgbG93ID0gLTE7ICAgICAgICAgICAgICAgICAgIC8qIHRyaWdnZXIgbmV3IHN1Yi10YWJsZSB3aGVuIGxlbiA+IHJvb3QgKi9cbiAgdXNlZCA9IDEgPDwgcm9vdDsgICAgICAgICAgLyogdXNlIHJvb3QgdGFibGUgZW50cmllcyAqL1xuICBtYXNrID0gdXNlZCAtIDE7ICAgICAgICAgICAgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqL1xuXG4gIC8qIGNoZWNrIGF2YWlsYWJsZSB0YWJsZSBzcGFjZSAqL1xuICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fFxuICAgICh0eXBlID09PSBESVNUUyAmJiB1c2VkID4gRU5PVUdIX0RJU1RTKSkge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgLyogcHJvY2VzcyBhbGwgY29kZXMgYW5kIG1ha2UgdGFibGUgZW50cmllcyAqL1xuICBmb3IgKDs7KSB7XG4gICAgLyogY3JlYXRlIHRhYmxlIGVudHJ5ICovXG4gICAgaGVyZV9iaXRzID0gbGVuIC0gZHJvcDtcbiAgICBpZiAod29ya1tzeW1dIDwgZW5kKSB7XG4gICAgICBoZXJlX29wID0gMDtcbiAgICAgIGhlcmVfdmFsID0gd29ya1tzeW1dO1xuICAgIH1cbiAgICBlbHNlIGlmICh3b3JrW3N5bV0gPiBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSBleHRyYVtleHRyYV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgICBoZXJlX3ZhbCA9IGJhc2VbYmFzZV9pbmRleCArIHdvcmtbc3ltXV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgaGVyZV9vcCA9IDMyICsgNjQ7ICAgICAgICAgLyogZW5kIG9mIGJsb2NrICovXG4gICAgICBoZXJlX3ZhbCA9IDA7XG4gICAgfVxuXG4gICAgLyogcmVwbGljYXRlIGZvciB0aG9zZSBpbmRpY2VzIHdpdGggbG93IGxlbiBiaXRzIGVxdWFsIHRvIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gZHJvcCk7XG4gICAgZmlsbCA9IDEgPDwgY3VycjtcbiAgICBtaW4gPSBmaWxsOyAgICAgICAgICAgICAgICAgLyogc2F2ZSBvZmZzZXQgdG8gbmV4dCB0YWJsZSAqL1xuICAgIGRvIHtcbiAgICAgIGZpbGwgLT0gaW5jcjtcbiAgICAgIHRhYmxlW25leHQgKyAoaHVmZiA+PiBkcm9wKSArIGZpbGxdID0gKGhlcmVfYml0cyA8PCAyNCkgfCAoaGVyZV9vcCA8PCAxNikgfCBoZXJlX3ZhbCB8MDtcbiAgICB9IHdoaWxlIChmaWxsICE9PSAwKTtcblxuICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovXG4gICAgaW5jciA9IDEgPDwgKGxlbiAtIDEpO1xuICAgIHdoaWxlIChodWZmICYgaW5jcikge1xuICAgICAgaW5jciA+Pj0gMTtcbiAgICB9XG4gICAgaWYgKGluY3IgIT09IDApIHtcbiAgICAgIGh1ZmYgJj0gaW5jciAtIDE7XG4gICAgICBodWZmICs9IGluY3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGh1ZmYgPSAwO1xuICAgIH1cblxuICAgIC8qIGdvIHRvIG5leHQgc3ltYm9sLCB1cGRhdGUgY291bnQsIGxlbiAqL1xuICAgIHN5bSsrO1xuICAgIGlmICgtLWNvdW50W2xlbl0gPT09IDApIHtcbiAgICAgIGlmIChsZW4gPT09IG1heCkgeyBicmVhazsgfVxuICAgICAgbGVuID0gbGVuc1tsZW5zX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG5cbiAgICAvKiBjcmVhdGUgbmV3IHN1Yi10YWJsZSBpZiBuZWVkZWQgKi9cbiAgICBpZiAobGVuID4gcm9vdCAmJiAoaHVmZiAmIG1hc2spICE9PSBsb3cpIHtcbiAgICAgIC8qIGlmIGZpcnN0IHRpbWUsIHRyYW5zaXRpb24gdG8gc3ViLXRhYmxlcyAqL1xuICAgICAgaWYgKGRyb3AgPT09IDApIHtcbiAgICAgICAgZHJvcCA9IHJvb3Q7XG4gICAgICB9XG5cbiAgICAgIC8qIGluY3JlbWVudCBwYXN0IGxhc3QgdGFibGUgKi9cbiAgICAgIG5leHQgKz0gbWluOyAgICAgICAgICAgIC8qIGhlcmUgbWluIGlzIDEgPDwgY3VyciAqL1xuXG4gICAgICAvKiBkZXRlcm1pbmUgbGVuZ3RoIG9mIG5leHQgdGFibGUgKi9cbiAgICAgIGN1cnIgPSBsZW4gLSBkcm9wO1xuICAgICAgbGVmdCA9IDEgPDwgY3VycjtcbiAgICAgIHdoaWxlIChjdXJyICsgZHJvcCA8IG1heCkge1xuICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTtcbiAgICAgICAgaWYgKGxlZnQgPD0gMCkgeyBicmVhazsgfVxuICAgICAgICBjdXJyKys7XG4gICAgICAgIGxlZnQgPDw9IDE7XG4gICAgICB9XG5cbiAgICAgIC8qIGNoZWNrIGZvciBlbm91Z2ggc3BhY2UgKi9cbiAgICAgIHVzZWQgKz0gMSA8PCBjdXJyO1xuICAgICAgaWYgKCh0eXBlID09PSBMRU5TICYmIHVzZWQgPiBFTk9VR0hfTEVOUykgfHxcbiAgICAgICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfVxuXG4gICAgICAvKiBwb2ludCBlbnRyeSBpbiByb290IHRhYmxlIHRvIHN1Yi10YWJsZSAqL1xuICAgICAgbG93ID0gaHVmZiAmIG1hc2s7XG4gICAgICAvKnRhYmxlLm9wW2xvd10gPSBjdXJyO1xuICAgICAgdGFibGUuYml0c1tsb3ddID0gcm9vdDtcbiAgICAgIHRhYmxlLnZhbFtsb3ddID0gbmV4dCAtIG9wdHMudGFibGVfaW5kZXg7Ki9cbiAgICAgIHRhYmxlW2xvd10gPSAocm9vdCA8PCAyNCkgfCAoY3VyciA8PCAxNikgfCAobmV4dCAtIHRhYmxlX2luZGV4KSB8MDtcbiAgICB9XG4gIH1cblxuICAvKiBmaWxsIGluIHJlbWFpbmluZyB0YWJsZSBlbnRyeSBpZiBjb2RlIGlzIGluY29tcGxldGUgKGd1YXJhbnRlZWQgdG8gaGF2ZVxuICAgYXQgbW9zdCBvbmUgcmVtYWluaW5nIGVudHJ5LCBzaW5jZSBpZiB0aGUgY29kZSBpcyBpbmNvbXBsZXRlLCB0aGVcbiAgIG1heGltdW0gY29kZSBsZW5ndGggdGhhdCB3YXMgYWxsb3dlZCB0byBnZXQgdGhpcyBmYXIgaXMgb25lIGJpdCkgKi9cbiAgaWYgKGh1ZmYgIT09IDApIHtcbiAgICAvL3RhYmxlLm9wW25leHQgKyBodWZmXSA9IDY0OyAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi9cbiAgICAvL3RhYmxlLmJpdHNbbmV4dCArIGh1ZmZdID0gbGVuIC0gZHJvcDtcbiAgICAvL3RhYmxlLnZhbFtuZXh0ICsgaHVmZl0gPSAwO1xuICAgIHRhYmxlW25leHQgKyBodWZmXSA9ICgobGVuIC0gZHJvcCkgPDwgMjQpIHwgKDY0IDw8IDE2KSB8MDtcbiAgfVxuXG4gIC8qIHNldCByZXR1cm4gcGFyYW1ldGVycyAqL1xuICAvL29wdHMudGFibGVfaW5kZXggKz0gdXNlZDtcbiAgb3B0cy5iaXRzID0gcm9vdDtcbiAgcmV0dXJuIDA7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbmZ1bmN0aW9uIFpTdHJlYW0oKSB7XG4gIC8qIG5leHQgaW5wdXQgYnl0ZSAqL1xuICB0aGlzLmlucHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfaW4gPSAwO1xuICAvKiBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlIGF0IGlucHV0ICovXG4gIHRoaXMuYXZhaWxfaW4gPSAwO1xuICAvKiB0b3RhbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9pbiA9IDA7XG4gIC8qIG5leHQgb3V0cHV0IGJ5dGUgc2hvdWxkIGJlIHB1dCB0aGVyZSAqL1xuICB0aGlzLm91dHB1dCA9IG51bGw7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcbiAgdGhpcy5uZXh0X291dCA9IDA7XG4gIC8qIHJlbWFpbmluZyBmcmVlIHNwYWNlIGF0IG91dHB1dCAqL1xuICB0aGlzLmF2YWlsX291dCA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBvdXRwdXQgc28gZmFyICovXG4gIHRoaXMudG90YWxfb3V0ID0gMDtcbiAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovXG4gIHRoaXMubXNnID0gJycvKlpfTlVMTCovO1xuICAvKiBub3QgdmlzaWJsZSBieSBhcHBsaWNhdGlvbnMgKi9cbiAgdGhpcy5zdGF0ZSA9IG51bGw7XG4gIC8qIGJlc3QgZ3Vlc3MgYWJvdXQgdGhlIGRhdGEgdHlwZTogYmluYXJ5IG9yIHRleHQgKi9cbiAgdGhpcy5kYXRhX3R5cGUgPSAyLypaX1VOS05PV04qLztcbiAgLyogYWRsZXIzMiB2YWx1ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgKi9cbiAgdGhpcy5hZGxlciA9IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gWlN0cmVhbTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyByZXNvbHZlcyAuIGFuZCAuLiBlbGVtZW50cyBpbiBhIHBhdGggYXJyYXkgd2l0aCBkaXJlY3RvcnkgbmFtZXMgdGhlcmVcbi8vIG11c3QgYmUgbm8gc2xhc2hlcywgZW1wdHkgZWxlbWVudHMsIG9yIGRldmljZSBuYW1lcyAoYzpcXCkgaW4gdGhlIGFycmF5XG4vLyAoc28gYWxzbyBubyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzbGFzaGVzIC0gaXQgZG9lcyBub3QgZGlzdGluZ3Vpc2hcbi8vIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZSBwYXRocylcbmZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5KHBhcnRzLCBhbGxvd0Fib3ZlUm9vdCkge1xuICAvLyBpZiB0aGUgcGF0aCB0cmllcyB0byBnbyBhYm92ZSB0aGUgcm9vdCwgYHVwYCBlbmRzIHVwID4gMFxuICB2YXIgdXAgPSAwO1xuICBmb3IgKHZhciBpID0gcGFydHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICB2YXIgbGFzdCA9IHBhcnRzW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCkge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gIGlmIChhbGxvd0Fib3ZlUm9vdCkge1xuICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgcGFydHMudW5zaGlmdCgnLi4nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGFydHM7XG59XG5cbi8vIFNwbGl0IGEgZmlsZW5hbWUgaW50byBbcm9vdCwgZGlyLCBiYXNlbmFtZSwgZXh0XSwgdW5peCB2ZXJzaW9uXG4vLyAncm9vdCcgaXMganVzdCBhIHNsYXNoLCBvciBub3RoaW5nLlxudmFyIHNwbGl0UGF0aFJlID1cbiAgICAvXihcXC8/fCkoW1xcc1xcU10qPykoKD86XFwuezEsMn18W15cXC9dKz98KShcXC5bXi5cXC9dKnwpKSg/OltcXC9dKikkLztcbnZhciBzcGxpdFBhdGggPSBmdW5jdGlvbihmaWxlbmFtZSkge1xuICByZXR1cm4gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSkuc2xpY2UoMSk7XG59O1xuXG4vLyBwYXRoLnJlc29sdmUoW2Zyb20gLi4uXSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLnJlc29sdmUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJlc29sdmVkUGF0aCA9ICcnLFxuICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlO1xuXG4gIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAtMSAmJiAhcmVzb2x2ZWRBYnNvbHV0ZTsgaS0tKSB7XG4gICAgdmFyIHBhdGggPSAoaSA+PSAwKSA/IGFyZ3VtZW50c1tpXSA6IHByb2Nlc3MuY3dkKCk7XG5cbiAgICAvLyBTa2lwIGVtcHR5IGFuZCBpbnZhbGlkIGVudHJpZXNcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5yZXNvbHZlIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH0gZWxzZSBpZiAoIXBhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJlc29sdmVkUGF0aCA9IHBhdGggKyAnLycgKyByZXNvbHZlZFBhdGg7XG4gICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGguY2hhckF0KDApID09PSAnLyc7XG4gIH1cblxuICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCwgYnV0XG4gIC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRocyB0byBiZSBzYWZlIChtaWdodCBoYXBwZW4gd2hlbiBwcm9jZXNzLmN3ZCgpIGZhaWxzKVxuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICByZXNvbHZlZFBhdGggPSBub3JtYWxpemVBcnJheShmaWx0ZXIocmVzb2x2ZWRQYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICByZXR1cm4gKChyZXNvbHZlZEFic29sdXRlID8gJy8nIDogJycpICsgcmVzb2x2ZWRQYXRoKSB8fCAnLic7XG59O1xuXG4vLyBwYXRoLm5vcm1hbGl6ZShwYXRoKVxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5ub3JtYWxpemUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHZhciBpc0Fic29sdXRlID0gZXhwb3J0cy5pc0Fic29sdXRlKHBhdGgpLFxuICAgICAgdHJhaWxpbmdTbGFzaCA9IHN1YnN0cihwYXRoLCAtMSkgPT09ICcvJztcblxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgcGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihwYXRoLnNwbGl0KCcvJyksIGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gISFwO1xuICB9KSwgIWlzQWJzb2x1dGUpLmpvaW4oJy8nKTtcblxuICBpZiAoIXBhdGggJiYgIWlzQWJzb2x1dGUpIHtcbiAgICBwYXRoID0gJy4nO1xuICB9XG4gIGlmIChwYXRoICYmIHRyYWlsaW5nU2xhc2gpIHtcbiAgICBwYXRoICs9ICcvJztcbiAgfVxuXG4gIHJldHVybiAoaXNBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHBhdGg7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmlzQWJzb2x1dGUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xufTtcblxuLy8gcG9zaXggdmVyc2lvblxuZXhwb3J0cy5qb2luID0gZnVuY3Rpb24oKSB7XG4gIHZhciBwYXRocyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG4gIHJldHVybiBleHBvcnRzLm5vcm1hbGl6ZShmaWx0ZXIocGF0aHMsIGZ1bmN0aW9uKHAsIGluZGV4KSB7XG4gICAgaWYgKHR5cGVvZiBwICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGguam9pbiBtdXN0IGJlIHN0cmluZ3MnKTtcbiAgICB9XG4gICAgcmV0dXJuIHA7XG4gIH0pLmpvaW4oJy8nKSk7XG59O1xuXG5cbi8vIHBhdGgucmVsYXRpdmUoZnJvbSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLnJlbGF0aXZlID0gZnVuY3Rpb24oZnJvbSwgdG8pIHtcbiAgZnJvbSA9IGV4cG9ydHMucmVzb2x2ZShmcm9tKS5zdWJzdHIoMSk7XG4gIHRvID0gZXhwb3J0cy5yZXNvbHZlKHRvKS5zdWJzdHIoMSk7XG5cbiAgZnVuY3Rpb24gdHJpbShhcnIpIHtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGZvciAoOyBzdGFydCA8IGFyci5sZW5ndGg7IHN0YXJ0KyspIHtcbiAgICAgIGlmIChhcnJbc3RhcnRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIGVuZCA9IGFyci5sZW5ndGggLSAxO1xuICAgIGZvciAoOyBlbmQgPj0gMDsgZW5kLS0pIHtcbiAgICAgIGlmIChhcnJbZW5kXSAhPT0gJycpIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA+IGVuZCkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBhcnIuc2xpY2Uoc3RhcnQsIGVuZCAtIHN0YXJ0ICsgMSk7XG4gIH1cblxuICB2YXIgZnJvbVBhcnRzID0gdHJpbShmcm9tLnNwbGl0KCcvJykpO1xuICB2YXIgdG9QYXJ0cyA9IHRyaW0odG8uc3BsaXQoJy8nKSk7XG5cbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKGZyb21QYXJ0cy5sZW5ndGgsIHRvUGFydHMubGVuZ3RoKTtcbiAgdmFyIHNhbWVQYXJ0c0xlbmd0aCA9IGxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmIChmcm9tUGFydHNbaV0gIT09IHRvUGFydHNbaV0pIHtcbiAgICAgIHNhbWVQYXJ0c0xlbmd0aCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB2YXIgb3V0cHV0UGFydHMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IHNhbWVQYXJ0c0xlbmd0aDsgaSA8IGZyb21QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIG91dHB1dFBhcnRzLnB1c2goJy4uJyk7XG4gIH1cblxuICBvdXRwdXRQYXJ0cyA9IG91dHB1dFBhcnRzLmNvbmNhdCh0b1BhcnRzLnNsaWNlKHNhbWVQYXJ0c0xlbmd0aCkpO1xuXG4gIHJldHVybiBvdXRwdXRQYXJ0cy5qb2luKCcvJyk7XG59O1xuXG5leHBvcnRzLnNlcCA9ICcvJztcbmV4cG9ydHMuZGVsaW1pdGVyID0gJzonO1xuXG5leHBvcnRzLmRpcm5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHZhciByZXN1bHQgPSBzcGxpdFBhdGgocGF0aCksXG4gICAgICByb290ID0gcmVzdWx0WzBdLFxuICAgICAgZGlyID0gcmVzdWx0WzFdO1xuXG4gIGlmICghcm9vdCAmJiAhZGlyKSB7XG4gICAgLy8gTm8gZGlybmFtZSB3aGF0c29ldmVyXG4gICAgcmV0dXJuICcuJztcbiAgfVxuXG4gIGlmIChkaXIpIHtcbiAgICAvLyBJdCBoYXMgYSBkaXJuYW1lLCBzdHJpcCB0cmFpbGluZyBzbGFzaFxuICAgIGRpciA9IGRpci5zdWJzdHIoMCwgZGlyLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcmV0dXJuIHJvb3QgKyBkaXI7XG59O1xuXG5cbmV4cG9ydHMuYmFzZW5hbWUgPSBmdW5jdGlvbihwYXRoLCBleHQpIHtcbiAgdmFyIGYgPSBzcGxpdFBhdGgocGF0aClbMl07XG4gIC8vIFRPRE86IG1ha2UgdGhpcyBjb21wYXJpc29uIGNhc2UtaW5zZW5zaXRpdmUgb24gd2luZG93cz9cbiAgaWYgKGV4dCAmJiBmLnN1YnN0cigtMSAqIGV4dC5sZW5ndGgpID09PSBleHQpIHtcbiAgICBmID0gZi5zdWJzdHIoMCwgZi5sZW5ndGggLSBleHQubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gZjtcbn07XG5cblxuZXhwb3J0cy5leHRuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xuICByZXR1cm4gc3BsaXRQYXRoKHBhdGgpWzNdO1xufTtcblxuZnVuY3Rpb24gZmlsdGVyICh4cywgZikge1xuICAgIGlmICh4cy5maWx0ZXIpIHJldHVybiB4cy5maWx0ZXIoZik7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGYoeHNbaV0sIGksIHhzKSkgcmVzLnB1c2goeHNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuXG4vLyBTdHJpbmcucHJvdG90eXBlLnN1YnN0ciAtIG5lZ2F0aXZlIGluZGV4IGRvbid0IHdvcmsgaW4gSUU4XG52YXIgc3Vic3RyID0gJ2FiJy5zdWJzdHIoLTEpID09PSAnYidcbiAgICA/IGZ1bmN0aW9uIChzdHIsIHN0YXJ0LCBsZW4pIHsgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbikgfVxuICAgIDogZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikge1xuICAgICAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IHN0ci5sZW5ndGggKyBzdGFydDtcbiAgICAgICAgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbik7XG4gICAgfVxuO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaXNXaW5kb3dzID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcblxuLy8gUmVnZXggdG8gc3BsaXQgYSB3aW5kb3dzIHBhdGggaW50byB0aHJlZSBwYXJ0czogWyosIGRldmljZSwgc2xhc2gsXG4vLyB0YWlsXSB3aW5kb3dzLW9ubHlcbnZhciBzcGxpdERldmljZVJlID1cbiAgICAvXihbYS16QS1aXTp8W1xcXFxcXC9dezJ9W15cXFxcXFwvXStbXFxcXFxcL10rW15cXFxcXFwvXSspPyhbXFxcXFxcL10pPyhbXFxzXFxTXSo/KSQvO1xuXG4vLyBSZWdleCB0byBzcGxpdCB0aGUgdGFpbCBwYXJ0IG9mIHRoZSBhYm92ZSBpbnRvIFsqLCBkaXIsIGJhc2VuYW1lLCBleHRdXG52YXIgc3BsaXRUYWlsUmUgPVxuICAgIC9eKFtcXHNcXFNdKj8pKCg/OlxcLnsxLDJ9fFteXFxcXFxcL10rP3wpKFxcLlteLlxcL1xcXFxdKnwpKSg/OltcXFxcXFwvXSopJC87XG5cbnZhciB3aW4zMiA9IHt9O1xuXG4vLyBGdW5jdGlvbiB0byBzcGxpdCBhIGZpbGVuYW1lIGludG8gW3Jvb3QsIGRpciwgYmFzZW5hbWUsIGV4dF1cbmZ1bmN0aW9uIHdpbjMyU3BsaXRQYXRoKGZpbGVuYW1lKSB7XG4gIC8vIFNlcGFyYXRlIGRldmljZStzbGFzaCBmcm9tIHRhaWxcbiAgdmFyIHJlc3VsdCA9IHNwbGl0RGV2aWNlUmUuZXhlYyhmaWxlbmFtZSksXG4gICAgICBkZXZpY2UgPSAocmVzdWx0WzFdIHx8ICcnKSArIChyZXN1bHRbMl0gfHwgJycpLFxuICAgICAgdGFpbCA9IHJlc3VsdFszXSB8fCAnJztcbiAgLy8gU3BsaXQgdGhlIHRhaWwgaW50byBkaXIsIGJhc2VuYW1lIGFuZCBleHRlbnNpb25cbiAgdmFyIHJlc3VsdDIgPSBzcGxpdFRhaWxSZS5leGVjKHRhaWwpLFxuICAgICAgZGlyID0gcmVzdWx0MlsxXSxcbiAgICAgIGJhc2VuYW1lID0gcmVzdWx0MlsyXSxcbiAgICAgIGV4dCA9IHJlc3VsdDJbM107XG4gIHJldHVybiBbZGV2aWNlLCBkaXIsIGJhc2VuYW1lLCBleHRdO1xufVxuXG53aW4zMi5wYXJzZSA9IGZ1bmN0aW9uKHBhdGhTdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBwYXRoU3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIFwiUGFyYW1ldGVyICdwYXRoU3RyaW5nJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgXCIgKyB0eXBlb2YgcGF0aFN0cmluZ1xuICAgICk7XG4gIH1cbiAgdmFyIGFsbFBhcnRzID0gd2luMzJTcGxpdFBhdGgocGF0aFN0cmluZyk7XG4gIGlmICghYWxsUGFydHMgfHwgYWxsUGFydHMubGVuZ3RoICE9PSA0KSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgcGF0aCAnXCIgKyBwYXRoU3RyaW5nICsgXCInXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcm9vdDogYWxsUGFydHNbMF0sXG4gICAgZGlyOiBhbGxQYXJ0c1swXSArIGFsbFBhcnRzWzFdLnNsaWNlKDAsIC0xKSxcbiAgICBiYXNlOiBhbGxQYXJ0c1syXSxcbiAgICBleHQ6IGFsbFBhcnRzWzNdLFxuICAgIG5hbWU6IGFsbFBhcnRzWzJdLnNsaWNlKDAsIGFsbFBhcnRzWzJdLmxlbmd0aCAtIGFsbFBhcnRzWzNdLmxlbmd0aClcbiAgfTtcbn07XG5cblxuXG4vLyBTcGxpdCBhIGZpbGVuYW1lIGludG8gW3Jvb3QsIGRpciwgYmFzZW5hbWUsIGV4dF0sIHVuaXggdmVyc2lvblxuLy8gJ3Jvb3QnIGlzIGp1c3QgYSBzbGFzaCwgb3Igbm90aGluZy5cbnZhciBzcGxpdFBhdGhSZSA9XG4gICAgL14oXFwvP3wpKFtcXHNcXFNdKj8pKCg/OlxcLnsxLDJ9fFteXFwvXSs/fCkoXFwuW14uXFwvXSp8KSkoPzpbXFwvXSopJC87XG52YXIgcG9zaXggPSB7fTtcblxuXG5mdW5jdGlvbiBwb3NpeFNwbGl0UGF0aChmaWxlbmFtZSkge1xuICByZXR1cm4gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSkuc2xpY2UoMSk7XG59XG5cblxucG9zaXgucGFyc2UgPSBmdW5jdGlvbihwYXRoU3RyaW5nKSB7XG4gIGlmICh0eXBlb2YgcGF0aFN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICBcIlBhcmFtZXRlciAncGF0aFN0cmluZycgbXVzdCBiZSBhIHN0cmluZywgbm90IFwiICsgdHlwZW9mIHBhdGhTdHJpbmdcbiAgICApO1xuICB9XG4gIHZhciBhbGxQYXJ0cyA9IHBvc2l4U3BsaXRQYXRoKHBhdGhTdHJpbmcpO1xuICBpZiAoIWFsbFBhcnRzIHx8IGFsbFBhcnRzLmxlbmd0aCAhPT0gNCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIHBhdGggJ1wiICsgcGF0aFN0cmluZyArIFwiJ1wiKTtcbiAgfVxuICBhbGxQYXJ0c1sxXSA9IGFsbFBhcnRzWzFdIHx8ICcnO1xuICBhbGxQYXJ0c1syXSA9IGFsbFBhcnRzWzJdIHx8ICcnO1xuICBhbGxQYXJ0c1szXSA9IGFsbFBhcnRzWzNdIHx8ICcnO1xuXG4gIHJldHVybiB7XG4gICAgcm9vdDogYWxsUGFydHNbMF0sXG4gICAgZGlyOiBhbGxQYXJ0c1swXSArIGFsbFBhcnRzWzFdLnNsaWNlKDAsIC0xKSxcbiAgICBiYXNlOiBhbGxQYXJ0c1syXSxcbiAgICBleHQ6IGFsbFBhcnRzWzNdLFxuICAgIG5hbWU6IGFsbFBhcnRzWzJdLnNsaWNlKDAsIGFsbFBhcnRzWzJdLmxlbmd0aCAtIGFsbFBhcnRzWzNdLmxlbmd0aClcbiAgfTtcbn07XG5cblxuaWYgKGlzV2luZG93cylcbiAgbW9kdWxlLmV4cG9ydHMgPSB3aW4zMi5wYXJzZTtcbmVsc2UgLyogcG9zaXggKi9cbiAgbW9kdWxlLmV4cG9ydHMgPSBwb3NpeC5wYXJzZTtcblxubW9kdWxlLmV4cG9ydHMucG9zaXggPSBwb3NpeC5wYXJzZTtcbm1vZHVsZS5leHBvcnRzLndpbjMyID0gd2luMzIucGFyc2U7XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuICB2YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcbiAgdmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcbiAgdmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xufVxuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSB2YWx1ZXMgbWF0Y2ggd2l0aCB0aGUgdHlwZSBzcGVjcy5cbiAqIEVycm9yIG1lc3NhZ2VzIGFyZSBtZW1vcml6ZWQgYW5kIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0eXBlU3BlY3MgTWFwIG9mIG5hbWUgdG8gYSBSZWFjdFByb3BUeXBlXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIFJ1bnRpbWUgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSB0eXBlLWNoZWNrZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBlLmcuIFwicHJvcFwiLCBcImNvbnRleHRcIiwgXCJjaGlsZCBjb250ZXh0XCJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wb25lbnROYW1lIE5hbWUgb2YgdGhlIGNvbXBvbmVudCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gez9GdW5jdGlvbn0gZ2V0U3RhY2sgUmV0dXJucyB0aGUgY29tcG9uZW50IHN0YWNrLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tQcm9wVHlwZXModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBnZXRTdGFjaykge1xuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgICBpZiAodHlwZVNwZWNzLmhhc093blByb3BlcnR5KHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgICAgdmFyIGVycm9yO1xuICAgICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICAgaW52YXJpYW50KHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSA9PT0gJ2Z1bmN0aW9uJywgJyVzOiAlcyB0eXBlIGAlc2AgaXMgaW52YWxpZDsgaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gJyArICdSZWFjdC5Qcm9wVHlwZXMuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lKTtcbiAgICAgICAgICBlcnJvciA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgIGVycm9yID0gZXg7XG4gICAgICAgIH1cbiAgICAgICAgd2FybmluZyghZXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciwgJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgbG9jYXRpb24sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yKTtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvci5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvci5tZXNzYWdlXSA9IHRydWU7XG5cbiAgICAgICAgICB2YXIgc3RhY2sgPSBnZXRTdGFjayA/IGdldFN0YWNrKCkgOiAnJztcblxuICAgICAgICAgIHdhcm5pbmcoZmFsc2UsICdGYWlsZWQgJXMgdHlwZTogJXMlcycsIGxvY2F0aW9uLCBlcnJvci5tZXNzYWdlLCBzdGFjayAhPSBudWxsID8gc3RhY2sgOiAnJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjaGVja1Byb3BUeXBlcztcbiIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gUmVhY3QgMTUuNSByZWZlcmVuY2VzIHRoaXMgbW9kdWxlLCBhbmQgYXNzdW1lcyBQcm9wVHlwZXMgYXJlIHN0aWxsIGNhbGxhYmxlIGluIHByb2R1Y3Rpb24uXG4vLyBUaGVyZWZvcmUgd2UgcmUtZXhwb3J0IGRldmVsb3BtZW50LW9ubHkgdmVyc2lvbiB3aXRoIGFsbCB0aGUgUHJvcFR5cGVzIGNoZWNrcyBoZXJlLlxuLy8gSG93ZXZlciBpZiBvbmUgaXMgbWlncmF0aW5nIHRvIHRoZSBgcHJvcC10eXBlc2AgbnBtIGxpYnJhcnksIHRoZXkgd2lsbCBnbyB0aHJvdWdoIHRoZVxuLy8gYGluZGV4LmpzYCBlbnRyeSBwb2ludCwgYW5kIGl0IHdpbGwgYnJhbmNoIGRlcGVuZGluZyBvbiB0aGUgZW52aXJvbm1lbnQuXG52YXIgZmFjdG9yeSA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUeXBlQ2hlY2tlcnMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXNWYWxpZEVsZW1lbnQpIHtcbiAgLy8gSXQgaXMgc3RpbGwgYWxsb3dlZCBpbiAxNS41LlxuICB2YXIgdGhyb3dPbkRpcmVjdEFjY2VzcyA9IGZhbHNlO1xuICByZXR1cm4gZmFjdG9yeShpc1ZhbGlkRWxlbWVudCwgdGhyb3dPbkRpcmVjdEFjY2Vzcyk7XG59O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG4gIGZ1bmN0aW9uIHNoaW0ocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICBpZiAoc2VjcmV0ID09PSBSZWFjdFByb3BUeXBlc1NlY3JldCkge1xuICAgICAgLy8gSXQgaXMgc3RpbGwgc2FmZSB3aGVuIGNhbGxlZCBmcm9tIFJlYWN0LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpbnZhcmlhbnQoXG4gICAgICBmYWxzZSxcbiAgICAgICdDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICdVc2UgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKCkgdG8gY2FsbCB0aGVtLiAnICtcbiAgICAgICdSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzJ1xuICAgICk7XG4gIH07XG4gIHNoaW0uaXNSZXF1aXJlZCA9IHNoaW07XG4gIGZ1bmN0aW9uIGdldFNoaW0oKSB7XG4gICAgcmV0dXJuIHNoaW07XG4gIH07XG4gIC8vIEltcG9ydGFudCFcbiAgLy8gS2VlcCB0aGlzIGxpc3QgaW4gc3luYyB3aXRoIHByb2R1Y3Rpb24gdmVyc2lvbiBpbiBgLi9mYWN0b3J5V2l0aFR5cGVDaGVja2Vycy5qc2AuXG4gIHZhciBSZWFjdFByb3BUeXBlcyA9IHtcbiAgICBhcnJheTogc2hpbSxcbiAgICBib29sOiBzaGltLFxuICAgIGZ1bmM6IHNoaW0sXG4gICAgbnVtYmVyOiBzaGltLFxuICAgIG9iamVjdDogc2hpbSxcbiAgICBzdHJpbmc6IHNoaW0sXG4gICAgc3ltYm9sOiBzaGltLFxuXG4gICAgYW55OiBzaGltLFxuICAgIGFycmF5T2Y6IGdldFNoaW0sXG4gICAgZWxlbWVudDogc2hpbSxcbiAgICBpbnN0YW5jZU9mOiBnZXRTaGltLFxuICAgIG5vZGU6IHNoaW0sXG4gICAgb2JqZWN0T2Y6IGdldFNoaW0sXG4gICAgb25lT2Y6IGdldFNoaW0sXG4gICAgb25lT2ZUeXBlOiBnZXRTaGltLFxuICAgIHNoYXBlOiBnZXRTaGltXG4gIH07XG5cbiAgUmVhY3RQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMgPSBlbXB0eUZ1bmN0aW9uO1xuICBSZWFjdFByb3BUeXBlcy5Qcm9wVHlwZXMgPSBSZWFjdFByb3BUeXBlcztcblxuICByZXR1cm4gUmVhY3RQcm9wVHlwZXM7XG59O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xudmFyIGNoZWNrUHJvcFR5cGVzID0gcmVxdWlyZSgnLi9jaGVja1Byb3BUeXBlcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGlzVmFsaWRFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKSB7XG4gIC8qIGdsb2JhbCBTeW1ib2wgKi9cbiAgdmFyIElURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xuICB2YXIgRkFVWF9JVEVSQVRPUl9TWU1CT0wgPSAnQEBpdGVyYXRvcic7IC8vIEJlZm9yZSBTeW1ib2wgc3BlYy5cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaXRlcmF0b3IgbWV0aG9kIGZ1bmN0aW9uIGNvbnRhaW5lZCBvbiB0aGUgaXRlcmFibGUgb2JqZWN0LlxuICAgKlxuICAgKiBCZSBzdXJlIHRvIGludm9rZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgaXRlcmFibGUgYXMgY29udGV4dDpcbiAgICpcbiAgICogICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihteUl0ZXJhYmxlKTtcbiAgICogICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAqICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChteUl0ZXJhYmxlKTtcbiAgICogICAgICAgLi4uXG4gICAqICAgICB9XG4gICAqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbWF5YmVJdGVyYWJsZVxuICAgKiBAcmV0dXJuIHs/ZnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IG1heWJlSXRlcmFibGUgJiYgKElURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pO1xuICAgIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZXJhdG9yRm47XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3Rpb24gb2YgbWV0aG9kcyB0aGF0IGFsbG93IGRlY2xhcmF0aW9uIGFuZCB2YWxpZGF0aW9uIG9mIHByb3BzIHRoYXQgYXJlXG4gICAqIHN1cHBsaWVkIHRvIFJlYWN0IGNvbXBvbmVudHMuIEV4YW1wbGUgdXNhZ2U6XG4gICAqXG4gICAqICAgdmFyIFByb3BzID0gcmVxdWlyZSgnUmVhY3RQcm9wVHlwZXMnKTtcbiAgICogICB2YXIgTXlBcnRpY2xlID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgIC8vIEFuIG9wdGlvbmFsIHN0cmluZyBwcm9wIG5hbWVkIFwiZGVzY3JpcHRpb25cIi5cbiAgICogICAgICAgZGVzY3JpcHRpb246IFByb3BzLnN0cmluZyxcbiAgICpcbiAgICogICAgICAgLy8gQSByZXF1aXJlZCBlbnVtIHByb3AgbmFtZWQgXCJjYXRlZ29yeVwiLlxuICAgKiAgICAgICBjYXRlZ29yeTogUHJvcHMub25lT2YoWydOZXdzJywnUGhvdG9zJ10pLmlzUmVxdWlyZWQsXG4gICAqXG4gICAqICAgICAgIC8vIEEgcHJvcCBuYW1lZCBcImRpYWxvZ1wiIHRoYXQgcmVxdWlyZXMgYW4gaW5zdGFuY2Ugb2YgRGlhbG9nLlxuICAgKiAgICAgICBkaWFsb2c6IFByb3BzLmluc3RhbmNlT2YoRGlhbG9nKS5pc1JlcXVpcmVkXG4gICAqICAgICB9LFxuICAgKiAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHsgLi4uIH1cbiAgICogICB9KTtcbiAgICpcbiAgICogQSBtb3JlIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGhvdyB0aGVzZSBtZXRob2RzIGFyZSB1c2VkOlxuICAgKlxuICAgKiAgIHR5cGUgOj0gYXJyYXl8Ym9vbHxmdW5jfG9iamVjdHxudW1iZXJ8c3RyaW5nfG9uZU9mKFsuLi5dKXxpbnN0YW5jZU9mKC4uLilcbiAgICogICBkZWNsIDo9IFJlYWN0UHJvcFR5cGVzLnt0eXBlfSguaXNSZXF1aXJlZCk/XG4gICAqXG4gICAqIEVhY2ggYW5kIGV2ZXJ5IGRlY2xhcmF0aW9uIHByb2R1Y2VzIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUuIFRoaXNcbiAgICogYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBjdXN0b20gdmFsaWRhdGlvbiBmdW5jdGlvbnMuIEZvciBleGFtcGxlOlxuICAgKlxuICAgKiAgdmFyIE15TGluayA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAgICogICAgcHJvcFR5cGVzOiB7XG4gICAqICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIG9yIFVSSSBwcm9wIG5hbWVkIFwiaHJlZlwiLlxuICAgKiAgICAgIGhyZWY6IGZ1bmN0aW9uKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICAgKiAgICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICogICAgICAgIGlmIChwcm9wVmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgcHJvcFZhbHVlICE9PSAnc3RyaW5nJyAmJlxuICAgKiAgICAgICAgICAgICEocHJvcFZhbHVlIGluc3RhbmNlb2YgVVJJKSkge1xuICAgKiAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKFxuICAgKiAgICAgICAgICAgICdFeHBlY3RlZCBhIHN0cmluZyBvciBhbiBVUkkgZm9yICcgKyBwcm9wTmFtZSArICcgaW4gJyArXG4gICAqICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgKiAgICAgICAgICApO1xuICAgKiAgICAgICAgfVxuICAgKiAgICAgIH1cbiAgICogICAgfSxcbiAgICogICAgcmVuZGVyOiBmdW5jdGlvbigpIHsuLi59XG4gICAqICB9KTtcbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuXG4gIHZhciBBTk9OWU1PVVMgPSAnPDxhbm9ueW1vdXM+Pic7XG5cbiAgLy8gSW1wb3J0YW50IVxuICAvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggcHJvZHVjdGlvbiB2ZXJzaW9uIGluIGAuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcy5qc2AuXG4gIHZhciBSZWFjdFByb3BUeXBlcyA9IHtcbiAgICBhcnJheTogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2FycmF5JyksXG4gICAgYm9vbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ2Jvb2xlYW4nKSxcbiAgICBmdW5jOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignZnVuY3Rpb24nKSxcbiAgICBudW1iZXI6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdudW1iZXInKSxcbiAgICBvYmplY3Q6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdvYmplY3QnKSxcbiAgICBzdHJpbmc6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzdHJpbmcnKSxcbiAgICBzeW1ib2w6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdzeW1ib2wnKSxcblxuICAgIGFueTogY3JlYXRlQW55VHlwZUNoZWNrZXIoKSxcbiAgICBhcnJheU9mOiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIsXG4gICAgZWxlbWVudDogY3JlYXRlRWxlbWVudFR5cGVDaGVja2VyKCksXG4gICAgaW5zdGFuY2VPZjogY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlcixcbiAgICBub2RlOiBjcmVhdGVOb2RlQ2hlY2tlcigpLFxuICAgIG9iamVjdE9mOiBjcmVhdGVPYmplY3RPZlR5cGVDaGVja2VyLFxuICAgIG9uZU9mOiBjcmVhdGVFbnVtVHlwZUNoZWNrZXIsXG4gICAgb25lT2ZUeXBlOiBjcmVhdGVVbmlvblR5cGVDaGVja2VyLFxuICAgIHNoYXBlOiBjcmVhdGVTaGFwZVR5cGVDaGVja2VyXG4gIH07XG5cbiAgLyoqXG4gICAqIGlubGluZWQgT2JqZWN0LmlzIHBvbHlmaWxsIHRvIGF2b2lkIHJlcXVpcmluZyBjb25zdW1lcnMgc2hpcCB0aGVpciBvd25cbiAgICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzXG4gICAqL1xuICAvKmVzbGludC1kaXNhYmxlIG5vLXNlbGYtY29tcGFyZSovXG4gIGZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG4gICAgaWYgKHggPT09IHkpIHtcbiAgICAgIC8vIFN0ZXBzIDEtNSwgNy0xMFxuICAgICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICAgIHJldHVybiB4ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU3RlcCA2LmE6IE5hTiA9PSBOYU5cbiAgICAgIHJldHVybiB4ICE9PSB4ICYmIHkgIT09IHk7XG4gICAgfVxuICB9XG4gIC8qZXNsaW50LWVuYWJsZSBuby1zZWxmLWNvbXBhcmUqL1xuXG4gIC8qKlxuICAgKiBXZSB1c2UgYW4gRXJyb3ItbGlrZSBvYmplY3QgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYXMgcGVvcGxlIG1heSBjYWxsXG4gICAqIFByb3BUeXBlcyBkaXJlY3RseSBhbmQgaW5zcGVjdCB0aGVpciBvdXRwdXQuIEhvd2V2ZXIsIHdlIGRvbid0IHVzZSByZWFsXG4gICAqIEVycm9ycyBhbnltb3JlLiBXZSBkb24ndCBpbnNwZWN0IHRoZWlyIHN0YWNrIGFueXdheSwgYW5kIGNyZWF0aW5nIHRoZW1cbiAgICogaXMgcHJvaGliaXRpdmVseSBleHBlbnNpdmUgaWYgdGhleSBhcmUgY3JlYXRlZCB0b28gb2Z0ZW4sIHN1Y2ggYXMgd2hhdFxuICAgKiBoYXBwZW5zIGluIG9uZU9mVHlwZSgpIGZvciBhbnkgdHlwZSBiZWZvcmUgdGhlIG9uZSB0aGF0IG1hdGNoZWQuXG4gICAqL1xuICBmdW5jdGlvbiBQcm9wVHlwZUVycm9yKG1lc3NhZ2UpIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHRoaXMuc3RhY2sgPSAnJztcbiAgfVxuICAvLyBNYWtlIGBpbnN0YW5jZW9mIEVycm9yYCBzdGlsbCB3b3JrIGZvciByZXR1cm5lZCBlcnJvcnMuXG4gIFByb3BUeXBlRXJyb3IucHJvdG90eXBlID0gRXJyb3IucHJvdG90eXBlO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKSB7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGUgPSB7fTtcbiAgICAgIHZhciBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCA9IDA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNoZWNrVHlwZShpc1JlcXVpcmVkLCBwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgICAgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWUgfHwgQU5PTllNT1VTO1xuICAgICAgcHJvcEZ1bGxOYW1lID0gcHJvcEZ1bGxOYW1lIHx8IHByb3BOYW1lO1xuXG4gICAgICBpZiAoc2VjcmV0ICE9PSBSZWFjdFByb3BUeXBlc1NlY3JldCkge1xuICAgICAgICBpZiAodGhyb3dPbkRpcmVjdEFjY2Vzcykge1xuICAgICAgICAgIC8vIE5ldyBiZWhhdmlvciBvbmx5IGZvciB1c2VycyBvZiBgcHJvcC10eXBlc2AgcGFja2FnZVxuICAgICAgICAgIGludmFyaWFudChcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgJ0NhbGxpbmcgUHJvcFR5cGVzIHZhbGlkYXRvcnMgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgICAgICAgJ1VzZSBgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKClgIHRvIGNhbGwgdGhlbS4gJyArXG4gICAgICAgICAgICAnUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcydcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIE9sZCBiZWhhdmlvciBmb3IgcGVvcGxlIHVzaW5nIFJlYWN0LlByb3BUeXBlc1xuICAgICAgICAgIHZhciBjYWNoZUtleSA9IGNvbXBvbmVudE5hbWUgKyAnOicgKyBwcm9wTmFtZTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhbWFudWFsUHJvcFR5cGVDYWxsQ2FjaGVbY2FjaGVLZXldICYmXG4gICAgICAgICAgICAvLyBBdm9pZCBzcGFtbWluZyB0aGUgY29uc29sZSBiZWNhdXNlIHRoZXkgYXJlIG9mdGVuIG5vdCBhY3Rpb25hYmxlIGV4Y2VwdCBmb3IgbGliIGF1dGhvcnNcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50IDwgM1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgd2FybmluZyhcbiAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICdZb3UgYXJlIG1hbnVhbGx5IGNhbGxpbmcgYSBSZWFjdC5Qcm9wVHlwZXMgdmFsaWRhdGlvbiAnICtcbiAgICAgICAgICAgICAgJ2Z1bmN0aW9uIGZvciB0aGUgYCVzYCBwcm9wIG9uIGAlc2AuIFRoaXMgaXMgZGVwcmVjYXRlZCAnICtcbiAgICAgICAgICAgICAgJ2FuZCB3aWxsIHRocm93IGluIHRoZSBzdGFuZGFsb25lIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiAnICtcbiAgICAgICAgICAgICAgJ1lvdSBtYXkgYmUgc2VlaW5nIHRoaXMgd2FybmluZyBkdWUgdG8gYSB0aGlyZC1wYXJ0eSBQcm9wVHlwZXMgJyArXG4gICAgICAgICAgICAgICdsaWJyYXJ5LiBTZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC13YXJuaW5nLWRvbnQtY2FsbC1wcm9wdHlwZXMgJyArICdmb3IgZGV0YWlscy4nLFxuICAgICAgICAgICAgICBwcm9wRnVsbE5hbWUsXG4gICAgICAgICAgICAgIGNvbXBvbmVudE5hbWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gPSB0cnVlO1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignVGhlICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgJyArICgnaW4gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGJ1dCBpdHMgdmFsdWUgaXMgYG51bGxgLicpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCBpbiAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgdW5kZWZpbmVkYC4nKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY2hhaW5lZENoZWNrVHlwZSA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIGZhbHNlKTtcbiAgICBjaGFpbmVkQ2hlY2tUeXBlLmlzUmVxdWlyZWQgPSBjaGVja1R5cGUuYmluZChudWxsLCB0cnVlKTtcblxuICAgIHJldHVybiBjaGFpbmVkQ2hlY2tUeXBlO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoZXhwZWN0ZWRUeXBlKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lLCBzZWNyZXQpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSBleHBlY3RlZFR5cGUpIHtcbiAgICAgICAgLy8gYHByb3BWYWx1ZWAgYmVpbmcgaW5zdGFuY2Ugb2YsIHNheSwgZGF0ZS9yZWdleHAsIHBhc3MgdGhlICdvYmplY3QnXG4gICAgICAgIC8vIGNoZWNrLCBidXQgd2UgY2FuIG9mZmVyIGEgbW9yZSBwcmVjaXNlIGVycm9yIG1lc3NhZ2UgaGVyZSByYXRoZXIgdGhhblxuICAgICAgICAvLyAnb2YgdHlwZSBgb2JqZWN0YCcuXG4gICAgICAgIHZhciBwcmVjaXNlVHlwZSA9IGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJlY2lzZVR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2AnICsgZXhwZWN0ZWRUeXBlICsgJ2AuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpIHtcbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIoZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGwpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlQXJyYXlPZlR5cGVDaGVja2VyKHR5cGVDaGVja2VyKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGVDaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignUHJvcGVydHkgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiBjb21wb25lbnQgYCcgKyBjb21wb25lbnROYW1lICsgJ2AgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIGFycmF5T2YuJyk7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gYXJyYXkuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBpLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJ1snICsgaSArICddJywgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgaWYgKCFpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIHByb3BUeXBlICsgJ2Agc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGEgc2luZ2xlIFJlYWN0RWxlbWVudC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlVHlwZUNoZWNrZXIoZXhwZWN0ZWRDbGFzcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCEocHJvcHNbcHJvcE5hbWVdIGluc3RhbmNlb2YgZXhwZWN0ZWRDbGFzcykpIHtcbiAgICAgICAgdmFyIGV4cGVjdGVkQ2xhc3NOYW1lID0gZXhwZWN0ZWRDbGFzcy5uYW1lIHx8IEFOT05ZTU9VUztcbiAgICAgICAgdmFyIGFjdHVhbENsYXNzTmFtZSA9IGdldENsYXNzTmFtZShwcm9wc1twcm9wTmFtZV0pO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBhY3R1YWxDbGFzc05hbWUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgJykgKyAoJ2luc3RhbmNlIG9mIGAnICsgZXhwZWN0ZWRDbGFzc05hbWUgKyAnYC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVudW1UeXBlQ2hlY2tlcihleHBlY3RlZFZhbHVlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShleHBlY3RlZFZhbHVlcykpIHtcbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2YsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNOdWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwZWN0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGlzKHByb3BWYWx1ZSwgZXhwZWN0ZWRWYWx1ZXNbaV0pKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHZhbHVlc1N0cmluZyA9IEpTT04uc3RyaW5naWZ5KGV4cGVjdGVkVmFsdWVzKTtcbiAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdmFsdWUgYCcgKyBwcm9wVmFsdWUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgb25lIG9mICcgKyB2YWx1ZXNTdHJpbmcgKyAnLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgb2JqZWN0T2YuJyk7XG4gICAgICB9XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgIGlmIChwcm9wVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gb2JqZWN0LicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBwcm9wVmFsdWUpIHtcbiAgICAgICAgaWYgKHByb3BWYWx1ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgdmFyIGVycm9yID0gdHlwZUNoZWNrZXIocHJvcFZhbHVlLCBrZXksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnLicgKyBrZXksIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVVbmlvblR5cGVDaGVja2VyKGFycmF5T2ZUeXBlQ2hlY2tlcnMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJyYXlPZlR5cGVDaGVja2VycykpIHtcbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZWQgdG8gb25lT2ZUeXBlLCBleHBlY3RlZCBhbiBpbnN0YW5jZSBvZiBhcnJheS4nKSA6IHZvaWQgMDtcbiAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5T2ZUeXBlQ2hlY2tlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGVja2VyID0gYXJyYXlPZlR5cGVDaGVja2Vyc1tpXTtcbiAgICAgIGlmICh0eXBlb2YgY2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB3YXJuaW5nKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICdJbnZhbGlkIGFyZ3VtZW50IHN1cHBsaWQgdG8gb25lT2ZUeXBlLiBFeHBlY3RlZCBhbiBhcnJheSBvZiBjaGVjayBmdW5jdGlvbnMsIGJ1dCAnICtcbiAgICAgICAgICAncmVjZWl2ZWQgJXMgYXQgaW5kZXggJXMuJyxcbiAgICAgICAgICBnZXRQb3N0Zml4Rm9yVHlwZVdhcm5pbmcoY2hlY2tlciksXG4gICAgICAgICAgaVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5T2ZUeXBlQ2hlY2tlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGNoZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldO1xuICAgICAgICBpZiAoY2hlY2tlcihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KSA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBzdXBwbGllZCB0byAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYC4nKSk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVOb2RlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICghaXNOb2RlKHByb3BzW3Byb3BOYW1lXSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBzdXBwbGllZCB0byAnICsgKCdgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBSZWFjdE5vZGUuJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVTaGFwZVR5cGVDaGVja2VyKHNoYXBlVHlwZXMpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgYCcgKyBwcm9wVHlwZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBgb2JqZWN0YC4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc2hhcGVUeXBlcykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IHNoYXBlVHlwZXNba2V5XTtcbiAgICAgICAgaWYgKCFjaGVja2VyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVycm9yID0gY2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNOb2RlKHByb3BWYWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZW9mIHByb3BWYWx1ZSkge1xuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICByZXR1cm4gIXByb3BWYWx1ZTtcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gcHJvcFZhbHVlLmV2ZXJ5KGlzTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BWYWx1ZSA9PT0gbnVsbCB8fCBpc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4ocHJvcFZhbHVlKTtcbiAgICAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwocHJvcFZhbHVlKTtcbiAgICAgICAgICB2YXIgc3RlcDtcbiAgICAgICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gcHJvcFZhbHVlLmVudHJpZXMpIHtcbiAgICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgaWYgKCFpc05vZGUoc3RlcC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSXRlcmF0b3Igd2lsbCBwcm92aWRlIGVudHJ5IFtrLHZdIHR1cGxlcyByYXRoZXIgdGhhbiB2YWx1ZXMuXG4gICAgICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgICAgIGlmICghaXNOb2RlKGVudHJ5WzFdKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBpc1N5bWJvbChwcm9wVHlwZSwgcHJvcFZhbHVlKSB7XG4gICAgLy8gTmF0aXZlIFN5bWJvbC5cbiAgICBpZiAocHJvcFR5cGUgPT09ICdzeW1ib2wnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddID09PSAnU3ltYm9sJ1xuICAgIGlmIChwcm9wVmFsdWVbJ0BAdG9TdHJpbmdUYWcnXSA9PT0gJ1N5bWJvbCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIGZvciBub24tc3BlYyBjb21wbGlhbnQgU3ltYm9scyB3aGljaCBhcmUgcG9seWZpbGxlZC5cbiAgICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9wVmFsdWUgaW5zdGFuY2VvZiBTeW1ib2wpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIEVxdWl2YWxlbnQgb2YgYHR5cGVvZmAgYnV0IHdpdGggc3BlY2lhbCBoYW5kbGluZyBmb3IgYXJyYXkgYW5kIHJlZ2V4cC5cbiAgZnVuY3Rpb24gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKSB7XG4gICAgdmFyIHByb3BUeXBlID0gdHlwZW9mIHByb3BWYWx1ZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ2FycmF5JztcbiAgICB9XG4gICAgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgLy8gT2xkIHdlYmtpdHMgKGF0IGxlYXN0IHVudGlsIEFuZHJvaWQgNC4wKSByZXR1cm4gJ2Z1bmN0aW9uJyByYXRoZXIgdGhhblxuICAgICAgLy8gJ29iamVjdCcgZm9yIHR5cGVvZiBhIFJlZ0V4cC4gV2UnbGwgbm9ybWFsaXplIHRoaXMgaGVyZSBzbyB0aGF0IC9ibGEvXG4gICAgICAvLyBwYXNzZXMgUHJvcFR5cGVzLm9iamVjdC5cbiAgICAgIHJldHVybiAnb2JqZWN0JztcbiAgICB9XG4gICAgaWYgKGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpKSB7XG4gICAgICByZXR1cm4gJ3N5bWJvbCc7XG4gICAgfVxuICAgIHJldHVybiBwcm9wVHlwZTtcbiAgfVxuXG4gIC8vIFRoaXMgaGFuZGxlcyBtb3JlIHR5cGVzIHRoYW4gYGdldFByb3BUeXBlYC4gT25seSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy5cbiAgLy8gU2VlIGBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcmAuXG4gIGZ1bmN0aW9uIGdldFByZWNpc2VUeXBlKHByb3BWYWx1ZSkge1xuICAgIGlmICh0eXBlb2YgcHJvcFZhbHVlID09PSAndW5kZWZpbmVkJyB8fCBwcm9wVmFsdWUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJyArIHByb3BWYWx1ZTtcbiAgICB9XG4gICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICBpZiAocHJvcFR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICByZXR1cm4gJ2RhdGUnO1xuICAgICAgfSBlbHNlIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgcmV0dXJuICdyZWdleHAnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvcFR5cGU7XG4gIH1cblxuICAvLyBSZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgcG9zdGZpeGVkIHRvIGEgd2FybmluZyBhYm91dCBhbiBpbnZhbGlkIHR5cGUuXG4gIC8vIEZvciBleGFtcGxlLCBcInVuZGVmaW5lZFwiIG9yIFwib2YgdHlwZSBhcnJheVwiXG4gIGZ1bmN0aW9uIGdldFBvc3RmaXhGb3JUeXBlV2FybmluZyh2YWx1ZSkge1xuICAgIHZhciB0eXBlID0gZ2V0UHJlY2lzZVR5cGUodmFsdWUpO1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnYXJyYXknOlxuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgcmV0dXJuICdhbiAnICsgdHlwZTtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICBjYXNlICdyZWdleHAnOlxuICAgICAgICByZXR1cm4gJ2EgJyArIHR5cGU7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm5zIGNsYXNzIG5hbWUgb2YgdGhlIG9iamVjdCwgaWYgYW55LlxuICBmdW5jdGlvbiBnZXRDbGFzc05hbWUocHJvcFZhbHVlKSB7XG4gICAgaWYgKCFwcm9wVmFsdWUuY29uc3RydWN0b3IgfHwgIXByb3BWYWx1ZS5jb25zdHJ1Y3Rvci5uYW1lKSB7XG4gICAgICByZXR1cm4gQU5PTllNT1VTO1xuICAgIH1cbiAgICByZXR1cm4gcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWU7XG4gIH1cblxuICBSZWFjdFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyA9IGNoZWNrUHJvcFR5cGVzO1xuICBSZWFjdFByb3BUeXBlcy5Qcm9wVHlwZXMgPSBSZWFjdFByb3BUeXBlcztcblxuICByZXR1cm4gUmVhY3RQcm9wVHlwZXM7XG59O1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgIFN5bWJvbC5mb3IgJiZcbiAgICBTeW1ib2wuZm9yKCdyZWFjdC5lbGVtZW50JykpIHx8XG4gICAgMHhlYWM3O1xuXG4gIHZhciBpc1ZhbGlkRWxlbWVudCA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0ID09PSAnb2JqZWN0JyAmJlxuICAgICAgb2JqZWN0ICE9PSBudWxsICYmXG4gICAgICBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbiAgfTtcblxuICAvLyBCeSBleHBsaWNpdGx5IHVzaW5nIGBwcm9wLXR5cGVzYCB5b3UgYXJlIG9wdGluZyBpbnRvIG5ldyBkZXZlbG9wbWVudCBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICB2YXIgdGhyb3dPbkRpcmVjdEFjY2VzcyA9IHRydWU7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFR5cGVDaGVja2VycycpKGlzVmFsaWRFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKTtcbn0gZWxzZSB7XG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IHByb2R1Y3Rpb24gYmVoYXZpb3IuXG4gIC8vIGh0dHA6Ly9mYi5tZS9wcm9wLXR5cGVzLWluLXByb2RcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcycpKCk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9ICdTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZXNTZWNyZXQ7XG4iLCIvKiEgaHR0cHM6Ly9tdGhzLmJlL3B1bnljb2RlIHYxLjQuMSBieSBAbWF0aGlhcyAqL1xuOyhmdW5jdGlvbihyb290KSB7XG5cblx0LyoqIERldGVjdCBmcmVlIHZhcmlhYmxlcyAqL1xuXHR2YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICYmXG5cdFx0IWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0cztcblx0dmFyIGZyZWVNb2R1bGUgPSB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZSAmJlxuXHRcdCFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlO1xuXHR2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsO1xuXHRpZiAoXG5cdFx0ZnJlZUdsb2JhbC5nbG9iYWwgPT09IGZyZWVHbG9iYWwgfHxcblx0XHRmcmVlR2xvYmFsLndpbmRvdyA9PT0gZnJlZUdsb2JhbCB8fFxuXHRcdGZyZWVHbG9iYWwuc2VsZiA9PT0gZnJlZUdsb2JhbFxuXHQpIHtcblx0XHRyb290ID0gZnJlZUdsb2JhbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgYHB1bnljb2RlYCBvYmplY3QuXG5cdCAqIEBuYW1lIHB1bnljb2RlXG5cdCAqIEB0eXBlIE9iamVjdFxuXHQgKi9cblx0dmFyIHB1bnljb2RlLFxuXG5cdC8qKiBIaWdoZXN0IHBvc2l0aXZlIHNpZ25lZCAzMi1iaXQgZmxvYXQgdmFsdWUgKi9cblx0bWF4SW50ID0gMjE0NzQ4MzY0NywgLy8gYWthLiAweDdGRkZGRkZGIG9yIDJeMzEtMVxuXG5cdC8qKiBCb290c3RyaW5nIHBhcmFtZXRlcnMgKi9cblx0YmFzZSA9IDM2LFxuXHR0TWluID0gMSxcblx0dE1heCA9IDI2LFxuXHRza2V3ID0gMzgsXG5cdGRhbXAgPSA3MDAsXG5cdGluaXRpYWxCaWFzID0gNzIsXG5cdGluaXRpYWxOID0gMTI4LCAvLyAweDgwXG5cdGRlbGltaXRlciA9ICctJywgLy8gJ1xceDJEJ1xuXG5cdC8qKiBSZWd1bGFyIGV4cHJlc3Npb25zICovXG5cdHJlZ2V4UHVueWNvZGUgPSAvXnhuLS0vLFxuXHRyZWdleE5vbkFTQ0lJID0gL1teXFx4MjAtXFx4N0VdLywgLy8gdW5wcmludGFibGUgQVNDSUkgY2hhcnMgKyBub24tQVNDSUkgY2hhcnNcblx0cmVnZXhTZXBhcmF0b3JzID0gL1tcXHgyRVxcdTMwMDJcXHVGRjBFXFx1RkY2MV0vZywgLy8gUkZDIDM0OTAgc2VwYXJhdG9yc1xuXG5cdC8qKiBFcnJvciBtZXNzYWdlcyAqL1xuXHRlcnJvcnMgPSB7XG5cdFx0J292ZXJmbG93JzogJ092ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzJyxcblx0XHQnbm90LWJhc2ljJzogJ0lsbGVnYWwgaW5wdXQgPj0gMHg4MCAobm90IGEgYmFzaWMgY29kZSBwb2ludCknLFxuXHRcdCdpbnZhbGlkLWlucHV0JzogJ0ludmFsaWQgaW5wdXQnXG5cdH0sXG5cblx0LyoqIENvbnZlbmllbmNlIHNob3J0Y3V0cyAqL1xuXHRiYXNlTWludXNUTWluID0gYmFzZSAtIHRNaW4sXG5cdGZsb29yID0gTWF0aC5mbG9vcixcblx0c3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZSxcblxuXHQvKiogVGVtcG9yYXJ5IHZhcmlhYmxlICovXG5cdGtleTtcblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKipcblx0ICogQSBnZW5lcmljIGVycm9yIHV0aWxpdHkgZnVuY3Rpb24uXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSBlcnJvciB0eXBlLlxuXHQgKiBAcmV0dXJucyB7RXJyb3J9IFRocm93cyBhIGBSYW5nZUVycm9yYCB3aXRoIHRoZSBhcHBsaWNhYmxlIGVycm9yIG1lc3NhZ2UuXG5cdCAqL1xuXHRmdW5jdGlvbiBlcnJvcih0eXBlKSB7XG5cdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoZXJyb3JzW3R5cGVdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBIGdlbmVyaWMgYEFycmF5I21hcGAgdXRpbGl0eSBmdW5jdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5IGFycmF5XG5cdCAqIGl0ZW0uXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gQSBuZXcgYXJyYXkgb2YgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcChhcnJheSwgZm4pIHtcblx0XHR2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoO1xuXHRcdHZhciByZXN1bHQgPSBbXTtcblx0XHR3aGlsZSAobGVuZ3RoLS0pIHtcblx0XHRcdHJlc3VsdFtsZW5ndGhdID0gZm4oYXJyYXlbbGVuZ3RoXSk7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQSBzaW1wbGUgYEFycmF5I21hcGAtbGlrZSB3cmFwcGVyIHRvIHdvcmsgd2l0aCBkb21haW4gbmFtZSBzdHJpbmdzIG9yIGVtYWlsXG5cdCAqIGFkZHJlc3Nlcy5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGRvbWFpbiBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcy5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5XG5cdCAqIGNoYXJhY3Rlci5cblx0ICogQHJldHVybnMge0FycmF5fSBBIG5ldyBzdHJpbmcgb2YgY2hhcmFjdGVycyByZXR1cm5lZCBieSB0aGUgY2FsbGJhY2tcblx0ICogZnVuY3Rpb24uXG5cdCAqL1xuXHRmdW5jdGlvbiBtYXBEb21haW4oc3RyaW5nLCBmbikge1xuXHRcdHZhciBwYXJ0cyA9IHN0cmluZy5zcGxpdCgnQCcpO1xuXHRcdHZhciByZXN1bHQgPSAnJztcblx0XHRpZiAocGFydHMubGVuZ3RoID4gMSkge1xuXHRcdFx0Ly8gSW4gZW1haWwgYWRkcmVzc2VzLCBvbmx5IHRoZSBkb21haW4gbmFtZSBzaG91bGQgYmUgcHVueWNvZGVkLiBMZWF2ZVxuXHRcdFx0Ly8gdGhlIGxvY2FsIHBhcnQgKGkuZS4gZXZlcnl0aGluZyB1cCB0byBgQGApIGludGFjdC5cblx0XHRcdHJlc3VsdCA9IHBhcnRzWzBdICsgJ0AnO1xuXHRcdFx0c3RyaW5nID0gcGFydHNbMV07XG5cdFx0fVxuXHRcdC8vIEF2b2lkIGBzcGxpdChyZWdleClgIGZvciBJRTggY29tcGF0aWJpbGl0eS4gU2VlICMxNy5cblx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShyZWdleFNlcGFyYXRvcnMsICdcXHgyRScpO1xuXHRcdHZhciBsYWJlbHMgPSBzdHJpbmcuc3BsaXQoJy4nKTtcblx0XHR2YXIgZW5jb2RlZCA9IG1hcChsYWJlbHMsIGZuKS5qb2luKCcuJyk7XG5cdFx0cmV0dXJuIHJlc3VsdCArIGVuY29kZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBudW1lcmljIGNvZGUgcG9pbnRzIG9mIGVhY2ggVW5pY29kZVxuXHQgKiBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4gV2hpbGUgSmF2YVNjcmlwdCB1c2VzIFVDUy0yIGludGVybmFsbHksXG5cdCAqIHRoaXMgZnVuY3Rpb24gd2lsbCBjb252ZXJ0IGEgcGFpciBvZiBzdXJyb2dhdGUgaGFsdmVzIChlYWNoIG9mIHdoaWNoXG5cdCAqIFVDUy0yIGV4cG9zZXMgYXMgc2VwYXJhdGUgY2hhcmFjdGVycykgaW50byBhIHNpbmdsZSBjb2RlIHBvaW50LFxuXHQgKiBtYXRjaGluZyBVVEYtMTYuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZW5jb2RlYFxuXHQgKiBAc2VlIDxodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZz5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlLnVjczJcblx0ICogQG5hbWUgZGVjb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBzdHJpbmcgVGhlIFVuaWNvZGUgaW5wdXQgc3RyaW5nIChVQ1MtMikuXG5cdCAqIEByZXR1cm5zIHtBcnJheX0gVGhlIG5ldyBhcnJheSBvZiBjb2RlIHBvaW50cy5cblx0ICovXG5cdGZ1bmN0aW9uIHVjczJkZWNvZGUoc3RyaW5nKSB7XG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBjb3VudGVyID0gMCxcblx0XHQgICAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCxcblx0XHQgICAgdmFsdWUsXG5cdFx0ICAgIGV4dHJhO1xuXHRcdHdoaWxlIChjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHR2YWx1ZSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRpZiAodmFsdWUgPj0gMHhEODAwICYmIHZhbHVlIDw9IDB4REJGRiAmJiBjb3VudGVyIDwgbGVuZ3RoKSB7XG5cdFx0XHRcdC8vIGhpZ2ggc3Vycm9nYXRlLCBhbmQgdGhlcmUgaXMgYSBuZXh0IGNoYXJhY3RlclxuXHRcdFx0XHRleHRyYSA9IHN0cmluZy5jaGFyQ29kZUF0KGNvdW50ZXIrKyk7XG5cdFx0XHRcdGlmICgoZXh0cmEgJiAweEZDMDApID09IDB4REMwMCkgeyAvLyBsb3cgc3Vycm9nYXRlXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2goKCh2YWx1ZSAmIDB4M0ZGKSA8PCAxMCkgKyAoZXh0cmEgJiAweDNGRikgKyAweDEwMDAwKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyB1bm1hdGNoZWQgc3Vycm9nYXRlOyBvbmx5IGFwcGVuZCB0aGlzIGNvZGUgdW5pdCwgaW4gY2FzZSB0aGUgbmV4dFxuXHRcdFx0XHRcdC8vIGNvZGUgdW5pdCBpcyB0aGUgaGlnaCBzdXJyb2dhdGUgb2YgYSBzdXJyb2dhdGUgcGFpclxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdFx0XHRjb3VudGVyLS07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG91dHB1dC5wdXNoKHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgc3RyaW5nIGJhc2VkIG9uIGFuIGFycmF5IG9mIG51bWVyaWMgY29kZSBwb2ludHMuXG5cdCAqIEBzZWUgYHB1bnljb2RlLnVjczIuZGVjb2RlYFxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuXHQgKiBAbmFtZSBlbmNvZGVcblx0ICogQHBhcmFtIHtBcnJheX0gY29kZVBvaW50cyBUaGUgYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIG5ldyBVbmljb2RlIHN0cmluZyAoVUNTLTIpLlxuXHQgKi9cblx0ZnVuY3Rpb24gdWNzMmVuY29kZShhcnJheSkge1xuXHRcdHJldHVybiBtYXAoYXJyYXksIGZ1bmN0aW9uKHZhbHVlKSB7XG5cdFx0XHR2YXIgb3V0cHV0ID0gJyc7XG5cdFx0XHRpZiAodmFsdWUgPiAweEZGRkYpIHtcblx0XHRcdFx0dmFsdWUgLT0gMHgxMDAwMDtcblx0XHRcdFx0b3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG5cdFx0XHRcdHZhbHVlID0gMHhEQzAwIHwgdmFsdWUgJiAweDNGRjtcblx0XHRcdH1cblx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUpO1xuXHRcdFx0cmV0dXJuIG91dHB1dDtcblx0XHR9KS5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIGJhc2ljIGNvZGUgcG9pbnQgaW50byBhIGRpZ2l0L2ludGVnZXIuXG5cdCAqIEBzZWUgYGRpZ2l0VG9CYXNpYygpYFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gY29kZVBvaW50IFRoZSBiYXNpYyBudW1lcmljIGNvZGUgcG9pbnQgdmFsdWUuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludCAoZm9yIHVzZSBpblxuXHQgKiByZXByZXNlbnRpbmcgaW50ZWdlcnMpIGluIHRoZSByYW5nZSBgMGAgdG8gYGJhc2UgLSAxYCwgb3IgYGJhc2VgIGlmXG5cdCAqIHRoZSBjb2RlIHBvaW50IGRvZXMgbm90IHJlcHJlc2VudCBhIHZhbHVlLlxuXHQgKi9cblx0ZnVuY3Rpb24gYmFzaWNUb0RpZ2l0KGNvZGVQb2ludCkge1xuXHRcdGlmIChjb2RlUG9pbnQgLSA0OCA8IDEwKSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gMjI7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA2NSA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gNjU7XG5cdFx0fVxuXHRcdGlmIChjb2RlUG9pbnQgLSA5NyA8IDI2KSB7XG5cdFx0XHRyZXR1cm4gY29kZVBvaW50IC0gOTc7XG5cdFx0fVxuXHRcdHJldHVybiBiYXNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgZGlnaXQvaW50ZWdlciBpbnRvIGEgYmFzaWMgY29kZSBwb2ludC5cblx0ICogQHNlZSBgYmFzaWNUb0RpZ2l0KClgXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBkaWdpdCBUaGUgbnVtZXJpYyB2YWx1ZSBvZiBhIGJhc2ljIGNvZGUgcG9pbnQuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBiYXNpYyBjb2RlIHBvaW50IHdob3NlIHZhbHVlICh3aGVuIHVzZWQgZm9yXG5cdCAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaXMgYGRpZ2l0YCwgd2hpY2ggbmVlZHMgdG8gYmUgaW4gdGhlIHJhbmdlXG5cdCAqIGAwYCB0byBgYmFzZSAtIDFgLiBJZiBgZmxhZ2AgaXMgbm9uLXplcm8sIHRoZSB1cHBlcmNhc2UgZm9ybSBpc1xuXHQgKiB1c2VkOyBlbHNlLCB0aGUgbG93ZXJjYXNlIGZvcm0gaXMgdXNlZC4gVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZFxuXHQgKiBpZiBgZmxhZ2AgaXMgbm9uLXplcm8gYW5kIGBkaWdpdGAgaGFzIG5vIHVwcGVyY2FzZSBmb3JtLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGlnaXRUb0Jhc2ljKGRpZ2l0LCBmbGFnKSB7XG5cdFx0Ly8gIDAuLjI1IG1hcCB0byBBU0NJSSBhLi56IG9yIEEuLlpcblx0XHQvLyAyNi4uMzUgbWFwIHRvIEFTQ0lJIDAuLjlcblx0XHRyZXR1cm4gZGlnaXQgKyAyMiArIDc1ICogKGRpZ2l0IDwgMjYpIC0gKChmbGFnICE9IDApIDw8IDUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJpYXMgYWRhcHRhdGlvbiBmdW5jdGlvbiBhcyBwZXIgc2VjdGlvbiAzLjQgb2YgUkZDIDM0OTIuXG5cdCAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNDkyI3NlY3Rpb24tMy40XG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRmdW5jdGlvbiBhZGFwdChkZWx0YSwgbnVtUG9pbnRzLCBmaXJzdFRpbWUpIHtcblx0XHR2YXIgayA9IDA7XG5cdFx0ZGVsdGEgPSBmaXJzdFRpbWUgPyBmbG9vcihkZWx0YSAvIGRhbXApIDogZGVsdGEgPj4gMTtcblx0XHRkZWx0YSArPSBmbG9vcihkZWx0YSAvIG51bVBvaW50cyk7XG5cdFx0Zm9yICgvKiBubyBpbml0aWFsaXphdGlvbiAqLzsgZGVsdGEgPiBiYXNlTWludXNUTWluICogdE1heCA+PiAxOyBrICs9IGJhc2UpIHtcblx0XHRcdGRlbHRhID0gZmxvb3IoZGVsdGEgLyBiYXNlTWludXNUTWluKTtcblx0XHR9XG5cdFx0cmV0dXJuIGZsb29yKGsgKyAoYmFzZU1pbnVzVE1pbiArIDEpICogZGVsdGEgLyAoZGVsdGEgKyBza2V3KSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzIHRvIGEgc3RyaW5nIG9mIFVuaWNvZGVcblx0ICogc3ltYm9scy5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzLlxuXHQgKi9cblx0ZnVuY3Rpb24gZGVjb2RlKGlucHV0KSB7XG5cdFx0Ly8gRG9uJ3QgdXNlIFVDUy0yXG5cdFx0dmFyIG91dHB1dCA9IFtdLFxuXHRcdCAgICBpbnB1dExlbmd0aCA9IGlucHV0Lmxlbmd0aCxcblx0XHQgICAgb3V0LFxuXHRcdCAgICBpID0gMCxcblx0XHQgICAgbiA9IGluaXRpYWxOLFxuXHRcdCAgICBiaWFzID0gaW5pdGlhbEJpYXMsXG5cdFx0ICAgIGJhc2ljLFxuXHRcdCAgICBqLFxuXHRcdCAgICBpbmRleCxcblx0XHQgICAgb2xkaSxcblx0XHQgICAgdyxcblx0XHQgICAgayxcblx0XHQgICAgZGlnaXQsXG5cdFx0ICAgIHQsXG5cdFx0ICAgIC8qKiBDYWNoZWQgY2FsY3VsYXRpb24gcmVzdWx0cyAqL1xuXHRcdCAgICBiYXNlTWludXNUO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50czogbGV0IGBiYXNpY2AgYmUgdGhlIG51bWJlciBvZiBpbnB1dCBjb2RlXG5cdFx0Ly8gcG9pbnRzIGJlZm9yZSB0aGUgbGFzdCBkZWxpbWl0ZXIsIG9yIGAwYCBpZiB0aGVyZSBpcyBub25lLCB0aGVuIGNvcHlcblx0XHQvLyB0aGUgZmlyc3QgYmFzaWMgY29kZSBwb2ludHMgdG8gdGhlIG91dHB1dC5cblxuXHRcdGJhc2ljID0gaW5wdXQubGFzdEluZGV4T2YoZGVsaW1pdGVyKTtcblx0XHRpZiAoYmFzaWMgPCAwKSB7XG5cdFx0XHRiYXNpYyA9IDA7XG5cdFx0fVxuXG5cdFx0Zm9yIChqID0gMDsgaiA8IGJhc2ljOyArK2opIHtcblx0XHRcdC8vIGlmIGl0J3Mgbm90IGEgYmFzaWMgY29kZSBwb2ludFxuXHRcdFx0aWYgKGlucHV0LmNoYXJDb2RlQXQoaikgPj0gMHg4MCkge1xuXHRcdFx0XHRlcnJvcignbm90LWJhc2ljJyk7XG5cdFx0XHR9XG5cdFx0XHRvdXRwdXQucHVzaChpbnB1dC5jaGFyQ29kZUF0KGopKTtcblx0XHR9XG5cblx0XHQvLyBNYWluIGRlY29kaW5nIGxvb3A6IHN0YXJ0IGp1c3QgYWZ0ZXIgdGhlIGxhc3QgZGVsaW1pdGVyIGlmIGFueSBiYXNpYyBjb2RlXG5cdFx0Ly8gcG9pbnRzIHdlcmUgY29waWVkOyBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG90aGVyd2lzZS5cblxuXHRcdGZvciAoaW5kZXggPSBiYXNpYyA+IDAgPyBiYXNpYyArIDEgOiAwOyBpbmRleCA8IGlucHV0TGVuZ3RoOyAvKiBubyBmaW5hbCBleHByZXNzaW9uICovKSB7XG5cblx0XHRcdC8vIGBpbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGNoYXJhY3RlciB0byBiZSBjb25zdW1lZC5cblx0XHRcdC8vIERlY29kZSBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyIGludG8gYGRlbHRhYCxcblx0XHRcdC8vIHdoaWNoIGdldHMgYWRkZWQgdG8gYGlgLiBUaGUgb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZWFzaWVyXG5cdFx0XHQvLyBpZiB3ZSBpbmNyZWFzZSBgaWAgYXMgd2UgZ28sIHRoZW4gc3VidHJhY3Qgb2ZmIGl0cyBzdGFydGluZ1xuXHRcdFx0Ly8gdmFsdWUgYXQgdGhlIGVuZCB0byBvYnRhaW4gYGRlbHRhYC5cblx0XHRcdGZvciAob2xkaSA9IGksIHcgPSAxLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblxuXHRcdFx0XHRpZiAoaW5kZXggPj0gaW5wdXRMZW5ndGgpIHtcblx0XHRcdFx0XHRlcnJvcignaW52YWxpZC1pbnB1dCcpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGlnaXQgPSBiYXNpY1RvRGlnaXQoaW5wdXQuY2hhckNvZGVBdChpbmRleCsrKSk7XG5cblx0XHRcdFx0aWYgKGRpZ2l0ID49IGJhc2UgfHwgZGlnaXQgPiBmbG9vcigobWF4SW50IC0gaSkgLyB3KSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aSArPSBkaWdpdCAqIHc7XG5cdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXG5cdFx0XHRcdGlmIChkaWdpdCA8IHQpIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJhc2VNaW51c1QgPSBiYXNlIC0gdDtcblx0XHRcdFx0aWYgKHcgPiBmbG9vcihtYXhJbnQgLyBiYXNlTWludXNUKSkge1xuXHRcdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dyAqPSBiYXNlTWludXNUO1xuXG5cdFx0XHR9XG5cblx0XHRcdG91dCA9IG91dHB1dC5sZW5ndGggKyAxO1xuXHRcdFx0YmlhcyA9IGFkYXB0KGkgLSBvbGRpLCBvdXQsIG9sZGkgPT0gMCk7XG5cblx0XHRcdC8vIGBpYCB3YXMgc3VwcG9zZWQgdG8gd3JhcCBhcm91bmQgZnJvbSBgb3V0YCB0byBgMGAsXG5cdFx0XHQvLyBpbmNyZW1lbnRpbmcgYG5gIGVhY2ggdGltZSwgc28gd2UnbGwgZml4IHRoYXQgbm93OlxuXHRcdFx0aWYgKGZsb29yKGkgLyBvdXQpID4gbWF4SW50IC0gbikge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0biArPSBmbG9vcihpIC8gb3V0KTtcblx0XHRcdGkgJT0gb3V0O1xuXG5cdFx0XHQvLyBJbnNlcnQgYG5gIGF0IHBvc2l0aW9uIGBpYCBvZiB0aGUgb3V0cHV0XG5cdFx0XHRvdXRwdXQuc3BsaWNlKGkrKywgMCwgbik7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdWNzMmVuY29kZShvdXRwdXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scyAoZS5nLiBhIGRvbWFpbiBuYW1lIGxhYmVsKSB0byBhXG5cdCAqIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSByZXN1bHRpbmcgUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICovXG5cdGZ1bmN0aW9uIGVuY29kZShpbnB1dCkge1xuXHRcdHZhciBuLFxuXHRcdCAgICBkZWx0YSxcblx0XHQgICAgaGFuZGxlZENQQ291bnQsXG5cdFx0ICAgIGJhc2ljTGVuZ3RoLFxuXHRcdCAgICBiaWFzLFxuXHRcdCAgICBqLFxuXHRcdCAgICBtLFxuXHRcdCAgICBxLFxuXHRcdCAgICBrLFxuXHRcdCAgICB0LFxuXHRcdCAgICBjdXJyZW50VmFsdWUsXG5cdFx0ICAgIG91dHB1dCA9IFtdLFxuXHRcdCAgICAvKiogYGlucHV0TGVuZ3RoYCB3aWxsIGhvbGQgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyBpbiBgaW5wdXRgLiAqL1xuXHRcdCAgICBpbnB1dExlbmd0aCxcblx0XHQgICAgLyoqIENhY2hlZCBjYWxjdWxhdGlvbiByZXN1bHRzICovXG5cdFx0ICAgIGhhbmRsZWRDUENvdW50UGx1c09uZSxcblx0XHQgICAgYmFzZU1pbnVzVCxcblx0XHQgICAgcU1pbnVzVDtcblxuXHRcdC8vIENvbnZlcnQgdGhlIGlucHV0IGluIFVDUy0yIHRvIFVuaWNvZGVcblx0XHRpbnB1dCA9IHVjczJkZWNvZGUoaW5wdXQpO1xuXG5cdFx0Ly8gQ2FjaGUgdGhlIGxlbmd0aFxuXHRcdGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoO1xuXG5cdFx0Ly8gSW5pdGlhbGl6ZSB0aGUgc3RhdGVcblx0XHRuID0gaW5pdGlhbE47XG5cdFx0ZGVsdGEgPSAwO1xuXHRcdGJpYXMgPSBpbml0aWFsQmlhcztcblxuXHRcdC8vIEhhbmRsZSB0aGUgYmFzaWMgY29kZSBwb2ludHNcblx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0Y3VycmVudFZhbHVlID0gaW5wdXRbal07XG5cdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgMHg4MCkge1xuXHRcdFx0XHRvdXRwdXQucHVzaChzdHJpbmdGcm9tQ2hhckNvZGUoY3VycmVudFZhbHVlKSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aGFuZGxlZENQQ291bnQgPSBiYXNpY0xlbmd0aCA9IG91dHB1dC5sZW5ndGg7XG5cblx0XHQvLyBgaGFuZGxlZENQQ291bnRgIGlzIHRoZSBudW1iZXIgb2YgY29kZSBwb2ludHMgdGhhdCBoYXZlIGJlZW4gaGFuZGxlZDtcblx0XHQvLyBgYmFzaWNMZW5ndGhgIGlzIHRoZSBudW1iZXIgb2YgYmFzaWMgY29kZSBwb2ludHMuXG5cblx0XHQvLyBGaW5pc2ggdGhlIGJhc2ljIHN0cmluZyAtIGlmIGl0IGlzIG5vdCBlbXB0eSAtIHdpdGggYSBkZWxpbWl0ZXJcblx0XHRpZiAoYmFzaWNMZW5ndGgpIHtcblx0XHRcdG91dHB1dC5wdXNoKGRlbGltaXRlcik7XG5cdFx0fVxuXG5cdFx0Ly8gTWFpbiBlbmNvZGluZyBsb29wOlxuXHRcdHdoaWxlIChoYW5kbGVkQ1BDb3VudCA8IGlucHV0TGVuZ3RoKSB7XG5cblx0XHRcdC8vIEFsbCBub24tYmFzaWMgY29kZSBwb2ludHMgPCBuIGhhdmUgYmVlbiBoYW5kbGVkIGFscmVhZHkuIEZpbmQgdGhlIG5leHRcblx0XHRcdC8vIGxhcmdlciBvbmU6XG5cdFx0XHRmb3IgKG0gPSBtYXhJbnQsIGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSA+PSBuICYmIGN1cnJlbnRWYWx1ZSA8IG0pIHtcblx0XHRcdFx0XHRtID0gY3VycmVudFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEluY3JlYXNlIGBkZWx0YWAgZW5vdWdoIHRvIGFkdmFuY2UgdGhlIGRlY29kZXIncyA8bixpPiBzdGF0ZSB0byA8bSwwPixcblx0XHRcdC8vIGJ1dCBndWFyZCBhZ2FpbnN0IG92ZXJmbG93XG5cdFx0XHRoYW5kbGVkQ1BDb3VudFBsdXNPbmUgPSBoYW5kbGVkQ1BDb3VudCArIDE7XG5cdFx0XHRpZiAobSAtIG4gPiBmbG9vcigobWF4SW50IC0gZGVsdGEpIC8gaGFuZGxlZENQQ291bnRQbHVzT25lKSkge1xuXHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVsdGEgKz0gKG0gLSBuKSAqIGhhbmRsZWRDUENvdW50UGx1c09uZTtcblx0XHRcdG4gPSBtO1xuXG5cdFx0XHRmb3IgKGogPSAwOyBqIDwgaW5wdXRMZW5ndGg7ICsraikge1xuXHRcdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlIDwgbiAmJiArK2RlbHRhID4gbWF4SW50KSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlID09IG4pIHtcblx0XHRcdFx0XHQvLyBSZXByZXNlbnQgZGVsdGEgYXMgYSBnZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlclxuXHRcdFx0XHRcdGZvciAocSA9IGRlbHRhLCBrID0gYmFzZTsgLyogbm8gY29uZGl0aW9uICovOyBrICs9IGJhc2UpIHtcblx0XHRcdFx0XHRcdHQgPSBrIDw9IGJpYXMgPyB0TWluIDogKGsgPj0gYmlhcyArIHRNYXggPyB0TWF4IDogayAtIGJpYXMpO1xuXHRcdFx0XHRcdFx0aWYgKHEgPCB0KSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cU1pbnVzVCA9IHEgLSB0O1xuXHRcdFx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRcdFx0b3V0cHV0LnB1c2goXG5cdFx0XHRcdFx0XHRcdHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWModCArIHFNaW51c1QgJSBiYXNlTWludXNULCAwKSlcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRxID0gZmxvb3IocU1pbnVzVCAvIGJhc2VNaW51c1QpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShkaWdpdFRvQmFzaWMocSwgMCkpKTtcblx0XHRcdFx0XHRiaWFzID0gYWRhcHQoZGVsdGEsIGhhbmRsZWRDUENvdW50UGx1c09uZSwgaGFuZGxlZENQQ291bnQgPT0gYmFzaWNMZW5ndGgpO1xuXHRcdFx0XHRcdGRlbHRhID0gMDtcblx0XHRcdFx0XHQrK2hhbmRsZWRDUENvdW50O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdCsrZGVsdGE7XG5cdFx0XHQrK247XG5cblx0XHR9XG5cdFx0cmV0dXJuIG91dHB1dC5qb2luKCcnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzXG5cdCAqIHRvIFVuaWNvZGUuIE9ubHkgdGhlIFB1bnljb2RlZCBwYXJ0cyBvZiB0aGUgaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQsIGkuZS5cblx0ICogaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgb24gYSBzdHJpbmcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuXG5cdCAqIGNvbnZlcnRlZCB0byBVbmljb2RlLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZWQgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0b1xuXHQgKiBjb252ZXJ0IHRvIFVuaWNvZGUuXG5cdCAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBVbmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBQdW55Y29kZVxuXHQgKiBzdHJpbmcuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b1VuaWNvZGUoaW5wdXQpIHtcblx0XHRyZXR1cm4gbWFwRG9tYWluKGlucHV0LCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdHJldHVybiByZWdleFB1bnljb2RlLnRlc3Qoc3RyaW5nKVxuXHRcdFx0XHQ/IGRlY29kZShzdHJpbmcuc2xpY2UoNCkudG9Mb3dlckNhc2UoKSlcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBVbmljb2RlIHN0cmluZyByZXByZXNlbnRpbmcgYSBkb21haW4gbmFtZSBvciBhbiBlbWFpbCBhZGRyZXNzIHRvXG5cdCAqIFB1bnljb2RlLiBPbmx5IHRoZSBub24tQVNDSUkgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHdpbGwgYmUgY29udmVydGVkLFxuXHQgKiBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCdzIGFscmVhZHkgaW5cblx0ICogQVNDSUkuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIGRvbWFpbiBuYW1lIG9yIGVtYWlsIGFkZHJlc3MgdG8gY29udmVydCwgYXMgYVxuXHQgKiBVbmljb2RlIHN0cmluZy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIFB1bnljb2RlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBkb21haW4gbmFtZSBvclxuXHQgKiBlbWFpbCBhZGRyZXNzLlxuXHQgKi9cblx0ZnVuY3Rpb24gdG9BU0NJSShpbnB1dCkge1xuXHRcdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHJlZ2V4Tm9uQVNDSUkudGVzdChzdHJpbmcpXG5cdFx0XHRcdD8gJ3huLS0nICsgZW5jb2RlKHN0cmluZylcblx0XHRcdFx0OiBzdHJpbmc7XG5cdFx0fSk7XG5cdH1cblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHQvKiogRGVmaW5lIHRoZSBwdWJsaWMgQVBJICovXG5cdHB1bnljb2RlID0ge1xuXHRcdC8qKlxuXHRcdCAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBQdW55Y29kZS5qcyB2ZXJzaW9uIG51bWJlci5cblx0XHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0XHQgKiBAdHlwZSBTdHJpbmdcblx0XHQgKi9cblx0XHQndmVyc2lvbic6ICcxLjQuMScsXG5cdFx0LyoqXG5cdFx0ICogQW4gb2JqZWN0IG9mIG1ldGhvZHMgdG8gY29udmVydCBmcm9tIEphdmFTY3JpcHQncyBpbnRlcm5hbCBjaGFyYWN0ZXJcblx0XHQgKiByZXByZXNlbnRhdGlvbiAoVUNTLTIpIHRvIFVuaWNvZGUgY29kZSBwb2ludHMsIGFuZCBiYWNrLlxuXHRcdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHRcdCAqIEB0eXBlIE9iamVjdFxuXHRcdCAqL1xuXHRcdCd1Y3MyJzoge1xuXHRcdFx0J2RlY29kZSc6IHVjczJkZWNvZGUsXG5cdFx0XHQnZW5jb2RlJzogdWNzMmVuY29kZVxuXHRcdH0sXG5cdFx0J2RlY29kZSc6IGRlY29kZSxcblx0XHQnZW5jb2RlJzogZW5jb2RlLFxuXHRcdCd0b0FTQ0lJJzogdG9BU0NJSSxcblx0XHQndG9Vbmljb2RlJzogdG9Vbmljb2RlXG5cdH07XG5cblx0LyoqIEV4cG9zZSBgcHVueWNvZGVgICovXG5cdC8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIHNwZWNpZmljIGNvbmRpdGlvbiBwYXR0ZXJuc1xuXHQvLyBsaWtlIHRoZSBmb2xsb3dpbmc6XG5cdGlmIChcblx0XHR0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJlxuXHRcdGRlZmluZS5hbWRcblx0KSB7XG5cdFx0ZGVmaW5lKCdwdW55Y29kZScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHB1bnljb2RlO1xuXHRcdH0pO1xuXHR9IGVsc2UgaWYgKGZyZWVFeHBvcnRzICYmIGZyZWVNb2R1bGUpIHtcblx0XHRpZiAobW9kdWxlLmV4cG9ydHMgPT0gZnJlZUV4cG9ydHMpIHtcblx0XHRcdC8vIGluIE5vZGUuanMsIGlvLmpzLCBvciBSaW5nb0pTIHYwLjguMCtcblx0XHRcdGZyZWVNb2R1bGUuZXhwb3J0cyA9IHB1bnljb2RlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBpbiBOYXJ3aGFsIG9yIFJpbmdvSlMgdjAuNy4wLVxuXHRcdFx0Zm9yIChrZXkgaW4gcHVueWNvZGUpIHtcblx0XHRcdFx0cHVueWNvZGUuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAoZnJlZUV4cG9ydHNba2V5XSA9IHB1bnljb2RlW2tleV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBpbiBSaGlubyBvciBhIHdlYiBicm93c2VyXG5cdFx0cm9vdC5wdW55Y29kZSA9IHB1bnljb2RlO1xuXHR9XG5cbn0odGhpcykpO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gSWYgb2JqLmhhc093blByb3BlcnR5IGhhcyBiZWVuIG92ZXJyaWRkZW4sIHRoZW4gY2FsbGluZ1xuLy8gb2JqLmhhc093blByb3BlcnR5KHByb3ApIHdpbGwgYnJlYWsuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9pc3N1ZXMvMTcwN1xuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihxcywgc2VwLCBlcSwgb3B0aW9ucykge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgdmFyIG9iaiA9IHt9O1xuXG4gIGlmICh0eXBlb2YgcXMgIT09ICdzdHJpbmcnIHx8IHFzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICB2YXIgcmVnZXhwID0gL1xcKy9nO1xuICBxcyA9IHFzLnNwbGl0KHNlcCk7XG5cbiAgdmFyIG1heEtleXMgPSAxMDAwO1xuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5tYXhLZXlzID09PSAnbnVtYmVyJykge1xuICAgIG1heEtleXMgPSBvcHRpb25zLm1heEtleXM7XG4gIH1cblxuICB2YXIgbGVuID0gcXMubGVuZ3RoO1xuICAvLyBtYXhLZXlzIDw9IDAgbWVhbnMgdGhhdCB3ZSBzaG91bGQgbm90IGxpbWl0IGtleXMgY291bnRcbiAgaWYgKG1heEtleXMgPiAwICYmIGxlbiA+IG1heEtleXMpIHtcbiAgICBsZW4gPSBtYXhLZXlzO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIHZhciB4ID0gcXNbaV0ucmVwbGFjZShyZWdleHAsICclMjAnKSxcbiAgICAgICAgaWR4ID0geC5pbmRleE9mKGVxKSxcbiAgICAgICAga3N0ciwgdnN0ciwgaywgdjtcblxuICAgIGlmIChpZHggPj0gMCkge1xuICAgICAga3N0ciA9IHguc3Vic3RyKDAsIGlkeCk7XG4gICAgICB2c3RyID0geC5zdWJzdHIoaWR4ICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGtzdHIgPSB4O1xuICAgICAgdnN0ciA9ICcnO1xuICAgIH1cblxuICAgIGsgPSBkZWNvZGVVUklDb21wb25lbnQoa3N0cik7XG4gICAgdiA9IGRlY29kZVVSSUNvbXBvbmVudCh2c3RyKTtcblxuICAgIGlmICghaGFzT3duUHJvcGVydHkob2JqLCBrKSkge1xuICAgICAgb2JqW2tdID0gdjtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgb2JqW2tdLnB1c2godik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtrXSA9IFtvYmpba10sIHZdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHhzKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeHMpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBzdHJpbmdpZnlQcmltaXRpdmUgPSBmdW5jdGlvbih2KSB7XG4gIHN3aXRjaCAodHlwZW9mIHYpIHtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgcmV0dXJuIHY7XG5cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiB2ID8gJ3RydWUnIDogJ2ZhbHNlJztcblxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4gaXNGaW5pdGUodikgPyB2IDogJyc7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iaiwgc2VwLCBlcSwgbmFtZSkge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgIG9iaiA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBtYXAob2JqZWN0S2V5cyhvYmopLCBmdW5jdGlvbihrKSB7XG4gICAgICB2YXIga3MgPSBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKGspKSArIGVxO1xuICAgICAgaWYgKGlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgICByZXR1cm4gbWFwKG9ialtrXSwgZnVuY3Rpb24odikge1xuICAgICAgICAgIHJldHVybiBrcyArIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUodikpO1xuICAgICAgICB9KS5qb2luKHNlcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ga3MgKyBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG9ialtrXSkpO1xuICAgICAgfVxuICAgIH0pLmpvaW4oc2VwKTtcblxuICB9XG5cbiAgaWYgKCFuYW1lKSByZXR1cm4gJyc7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG5hbWUpKSArIGVxICtcbiAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUob2JqKSk7XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHhzKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeHMpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxuZnVuY3Rpb24gbWFwICh4cywgZikge1xuICBpZiAoeHMubWFwKSByZXR1cm4geHMubWFwKGYpO1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICByZXMucHVzaChmKHhzW2ldLCBpKSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSByZXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmRlY29kZSA9IGV4cG9ydHMucGFyc2UgPSByZXF1aXJlKCcuL2RlY29kZScpO1xuZXhwb3J0cy5lbmNvZGUgPSBleHBvcnRzLnN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vZW5jb2RlJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9QYW5lbEdyb3VwID0gcmVxdWlyZSgnLi9QYW5lbEdyb3VwJyk7XG5cbnZhciBfUGFuZWxHcm91cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9QYW5lbEdyb3VwKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgQWNjb3JkaW9uID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoQWNjb3JkaW9uLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBBY2NvcmRpb24oKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgQWNjb3JkaW9uKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgQWNjb3JkaW9uLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgX1BhbmVsR3JvdXAyWydkZWZhdWx0J10sXG4gICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCB0aGlzLnByb3BzLCB7IGFjY29yZGlvbjogdHJ1ZSB9KSxcbiAgICAgIHRoaXMucHJvcHMuY2hpbGRyZW5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBBY2NvcmRpb247XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBBY2NvcmRpb247XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdmFsdWVzID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC92YWx1ZXMnKTtcblxudmFyIF92YWx1ZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmFsdWVzKTtcblxudmFyIF9leHRlbmRzMyA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxudmFyIF9TdHlsZUNvbmZpZyA9IHJlcXVpcmUoJy4vdXRpbHMvU3R5bGVDb25maWcnKTtcblxudmFyIF9DbG9zZUJ1dHRvbiA9IHJlcXVpcmUoJy4vQ2xvc2VCdXR0b24nKTtcblxudmFyIF9DbG9zZUJ1dHRvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9DbG9zZUJ1dHRvbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgb25EaXNtaXNzOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIGNsb3NlTGFiZWw6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjbG9zZUxhYmVsOiAnQ2xvc2UgYWxlcnQnXG59O1xuXG52YXIgQWxlcnQgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShBbGVydCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQWxlcnQoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgQWxlcnQpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBBbGVydC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgb25EaXNtaXNzID0gX3Byb3BzLm9uRGlzbWlzcyxcbiAgICAgICAgY2xvc2VMYWJlbCA9IF9wcm9wcy5jbG9zZUxhYmVsLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnb25EaXNtaXNzJywgJ2Nsb3NlTGFiZWwnLCAnY2xhc3NOYW1lJywgJ2NoaWxkcmVuJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBkaXNtaXNzYWJsZSA9ICEhb25EaXNtaXNzO1xuICAgIHZhciBjbGFzc2VzID0gKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyksIChfZXh0ZW5kczIgPSB7fSwgX2V4dGVuZHMyWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnZGlzbWlzc2FibGUnKV0gPSBkaXNtaXNzYWJsZSwgX2V4dGVuZHMyKSk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnZGl2JyxcbiAgICAgICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgICByb2xlOiAnYWxlcnQnLFxuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgICAgfSksXG4gICAgICBkaXNtaXNzYWJsZSAmJiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfQ2xvc2VCdXR0b24yWydkZWZhdWx0J10sIHtcbiAgICAgICAgb25DbGljazogb25EaXNtaXNzLFxuICAgICAgICBsYWJlbDogY2xvc2VMYWJlbFxuICAgICAgfSksXG4gICAgICBjaGlsZHJlblxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIEFsZXJ0O1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuQWxlcnQucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuQWxlcnQuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzU3R5bGVzKSgoMCwgX3ZhbHVlczJbJ2RlZmF1bHQnXSkoX1N0eWxlQ29uZmlnLlN0YXRlKSwgX1N0eWxlQ29uZmlnLlN0YXRlLklORk8sICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2FsZXJ0JywgQWxlcnQpKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG4vLyBUT0RPOiBgcHVsbFJpZ2h0YCBkb2Vzbid0IGJlbG9uZyBoZXJlLiBUaGVyZSdzIG5vIHNwZWNpYWwgaGFuZGxpbmcgaGVyZS5cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgcHVsbFJpZ2h0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2xcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIHB1bGxSaWdodDogZmFsc2Vcbn07XG5cbnZhciBCYWRnZSA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKEJhZGdlLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBCYWRnZSgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBCYWRnZSk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIEJhZGdlLnByb3RvdHlwZS5oYXNDb250ZW50ID0gZnVuY3Rpb24gaGFzQ29udGVudChjaGlsZHJlbikge1xuICAgIHZhciByZXN1bHQgPSBmYWxzZTtcblxuICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hpbGQgfHwgY2hpbGQgPT09IDApIHtcbiAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgQmFkZ2UucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgcHVsbFJpZ2h0ID0gX3Byb3BzLnB1bGxSaWdodCxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ3B1bGxSaWdodCcsICdjbGFzc05hbWUnLCAnY2hpbGRyZW4nXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKSwge1xuICAgICAgJ3B1bGwtcmlnaHQnOiBwdWxsUmlnaHQsXG5cbiAgICAgIC8vIEhhY2sgZm9yIGNvbGxhcHNpbmcgb24gSUU4LlxuICAgICAgaGlkZGVuOiAhdGhpcy5oYXNDb250ZW50KGNoaWxkcmVuKVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ3NwYW4nLFxuICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgICB9KSxcbiAgICAgIGNoaWxkcmVuXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gQmFkZ2U7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5CYWRnZS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5CYWRnZS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2JhZGdlJywgQmFkZ2UpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfQnJlYWRjcnVtYkl0ZW0gPSByZXF1aXJlKCcuL0JyZWFkY3J1bWJJdGVtJyk7XG5cbnZhciBfQnJlYWRjcnVtYkl0ZW0yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQnJlYWRjcnVtYkl0ZW0pO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBCcmVhZGNydW1iID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoQnJlYWRjcnVtYiwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQnJlYWRjcnVtYigpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBCcmVhZGNydW1iKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgQnJlYWRjcnVtYi5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnb2wnLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIHJvbGU6ICduYXZpZ2F0aW9uJyxcbiAgICAgICdhcmlhLWxhYmVsJzogJ2JyZWFkY3J1bWJzJyxcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBCcmVhZGNydW1iO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuQnJlYWRjcnVtYi5JdGVtID0gX0JyZWFkY3J1bWJJdGVtMlsnZGVmYXVsdCddO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdicmVhZGNydW1iJywgQnJlYWRjcnVtYik7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfU2FmZUFuY2hvciA9IHJlcXVpcmUoJy4vU2FmZUFuY2hvcicpO1xuXG52YXIgX1NhZmVBbmNob3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU2FmZUFuY2hvcik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIElmIHNldCB0byB0cnVlLCByZW5kZXJzIGBzcGFuYCBpbnN0ZWFkIG9mIGBhYFxuICAgKi9cbiAgYWN0aXZlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIC8qKlxuICAgKiBgaHJlZmAgYXR0cmlidXRlIGZvciB0aGUgaW5uZXIgYGFgIGVsZW1lbnRcbiAgICovXG4gIGhyZWY6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICAvKipcbiAgICogYHRpdGxlYCBhdHRyaWJ1dGUgZm9yIHRoZSBpbm5lciBgYWAgZWxlbWVudFxuICAgKi9cbiAgdGl0bGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubm9kZSxcbiAgLyoqXG4gICAqIGB0YXJnZXRgIGF0dHJpYnV0ZSBmb3IgdGhlIGlubmVyIGBhYCBlbGVtZW50XG4gICAqL1xuICB0YXJnZXQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBhY3RpdmU6IGZhbHNlXG59O1xuXG52YXIgQnJlYWRjcnVtYkl0ZW0gPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShCcmVhZGNydW1iSXRlbSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQnJlYWRjcnVtYkl0ZW0oKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgQnJlYWRjcnVtYkl0ZW0pO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBCcmVhZGNydW1iSXRlbS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3RpdmUgPSBfcHJvcHMuYWN0aXZlLFxuICAgICAgICBocmVmID0gX3Byb3BzLmhyZWYsXG4gICAgICAgIHRpdGxlID0gX3Byb3BzLnRpdGxlLFxuICAgICAgICB0YXJnZXQgPSBfcHJvcHMudGFyZ2V0LFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydhY3RpdmUnLCAnaHJlZicsICd0aXRsZScsICd0YXJnZXQnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgLy8gRG9uJ3QgdHJ5IHRvIHJlbmRlciB0aGVzZSBwcm9wcyBvbiBub24tYWN0aXZlIDxzcGFuPi5cblxuICAgIHZhciBsaW5rUHJvcHMgPSB7IGhyZWY6IGhyZWYsIHRpdGxlOiB0aXRsZSwgdGFyZ2V0OiB0YXJnZXQgfTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICdsaScsXG4gICAgICB7IGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIHsgYWN0aXZlOiBhY3RpdmUgfSkgfSxcbiAgICAgIGFjdGl2ZSA/IF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdzcGFuJywgcHJvcHMpIDogX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX1NhZmVBbmNob3IyWydkZWZhdWx0J10sICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIHByb3BzLCBsaW5rUHJvcHMpKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIEJyZWFkY3J1bWJJdGVtO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuQnJlYWRjcnVtYkl0ZW0ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuQnJlYWRjcnVtYkl0ZW0uZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBCcmVhZGNydW1iSXRlbTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF92YWx1ZXMgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L3ZhbHVlcycpO1xuXG52YXIgX3ZhbHVlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF92YWx1ZXMpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfZXh0ZW5kczMgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHM0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczMpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2VsZW1lbnRUeXBlID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvZWxlbWVudFR5cGUnKTtcblxudmFyIF9lbGVtZW50VHlwZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbGVtZW50VHlwZSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbnZhciBfU3R5bGVDb25maWcgPSByZXF1aXJlKCcuL3V0aWxzL1N0eWxlQ29uZmlnJyk7XG5cbnZhciBfU2FmZUFuY2hvciA9IHJlcXVpcmUoJy4vU2FmZUFuY2hvcicpO1xuXG52YXIgX1NhZmVBbmNob3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU2FmZUFuY2hvcik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgYWN0aXZlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIGRpc2FibGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIGJsb2NrOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIG9uQ2xpY2s6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgY29tcG9uZW50Q2xhc3M6IF9lbGVtZW50VHlwZTJbJ2RlZmF1bHQnXSxcbiAgaHJlZjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gIC8qKlxuICAgKiBEZWZpbmVzIEhUTUwgYnV0dG9uIHR5cGUgYXR0cmlidXRlXG4gICAqIEBkZWZhdWx0VmFsdWUgJ2J1dHRvbidcbiAgICovXG4gIHR5cGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2YoWydidXR0b24nLCAncmVzZXQnLCAnc3VibWl0J10pXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBhY3RpdmU6IGZhbHNlLFxuICBibG9jazogZmFsc2UsXG4gIGRpc2FibGVkOiBmYWxzZVxufTtcblxudmFyIEJ1dHRvbiA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKEJ1dHRvbiwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQnV0dG9uKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIEJ1dHRvbik7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIEJ1dHRvbi5wcm90b3R5cGUucmVuZGVyQW5jaG9yID0gZnVuY3Rpb24gcmVuZGVyQW5jaG9yKGVsZW1lbnRQcm9wcywgY2xhc3NOYW1lKSB7XG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9TYWZlQW5jaG9yMlsnZGVmYXVsdCddLCAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGVsZW1lbnRQcm9wcy5kaXNhYmxlZCAmJiAnZGlzYWJsZWQnKVxuICAgIH0pKTtcbiAgfTtcblxuICBCdXR0b24ucHJvdG90eXBlLnJlbmRlckJ1dHRvbiA9IGZ1bmN0aW9uIHJlbmRlckJ1dHRvbihfcmVmLCBjbGFzc05hbWUpIHtcbiAgICB2YXIgY29tcG9uZW50Q2xhc3MgPSBfcmVmLmNvbXBvbmVudENsYXNzLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcmVmLCBbJ2NvbXBvbmVudENsYXNzJ10pO1xuXG4gICAgdmFyIENvbXBvbmVudCA9IGNvbXBvbmVudENsYXNzIHx8ICdidXR0b24nO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICB0eXBlOiBlbGVtZW50UHJvcHMudHlwZSB8fCAnYnV0dG9uJyxcbiAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lXG4gICAgfSkpO1xuICB9O1xuXG4gIEJ1dHRvbi5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYWN0aXZlID0gX3Byb3BzLmFjdGl2ZSxcbiAgICAgICAgYmxvY2sgPSBfcHJvcHMuYmxvY2ssXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2FjdGl2ZScsICdibG9jaycsICdjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKSwgKF9leHRlbmRzMiA9IHtcbiAgICAgIGFjdGl2ZTogYWN0aXZlXG4gICAgfSwgX2V4dGVuZHMyWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnYmxvY2snKV0gPSBibG9jaywgX2V4dGVuZHMyKSk7XG4gICAgdmFyIGZ1bGxDbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3Nlcyk7XG5cbiAgICBpZiAoZWxlbWVudFByb3BzLmhyZWYpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckFuY2hvcihlbGVtZW50UHJvcHMsIGZ1bGxDbGFzc05hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlbmRlckJ1dHRvbihlbGVtZW50UHJvcHMsIGZ1bGxDbGFzc05hbWUpO1xuICB9O1xuXG4gIHJldHVybiBCdXR0b247XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5CdXR0b24ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuQnV0dG9uLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnYnRuJywgKDAsIF9ib290c3RyYXBVdGlscy5ic1NpemVzKShbX1N0eWxlQ29uZmlnLlNpemUuTEFSR0UsIF9TdHlsZUNvbmZpZy5TaXplLlNNQUxMLCBfU3R5bGVDb25maWcuU2l6ZS5YU01BTExdLCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzU3R5bGVzKShbXS5jb25jYXQoKDAsIF92YWx1ZXMyWydkZWZhdWx0J10pKF9TdHlsZUNvbmZpZy5TdGF0ZSksIFtfU3R5bGVDb25maWcuU3R5bGUuREVGQVVMVCwgX1N0eWxlQ29uZmlnLlN0eWxlLlBSSU1BUlksIF9TdHlsZUNvbmZpZy5TdHlsZS5MSU5LXSksIF9TdHlsZUNvbmZpZy5TdHlsZS5ERUZBVUxULCBCdXR0b24pKSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczMgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHM0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczMpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfYWxsID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvYWxsJyk7XG5cbnZhciBfYWxsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FsbCk7XG5cbnZhciBfQnV0dG9uID0gcmVxdWlyZSgnLi9CdXR0b24nKTtcblxudmFyIF9CdXR0b24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQnV0dG9uKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICB2ZXJ0aWNhbDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBqdXN0aWZpZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogRGlzcGxheSBibG9jayBidXR0b25zOyBvbmx5IHVzZWZ1bCB3aGVuIHVzZWQgd2l0aCB0aGUgXCJ2ZXJ0aWNhbFwiIHByb3AuXG4gICAqIEB0eXBlIHtib29sfVxuICAgKi9cbiAgYmxvY2s6ICgwLCBfYWxsMlsnZGVmYXVsdCddKShfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsIGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIGJsb2NrID0gX3JlZi5ibG9jayxcbiAgICAgICAgdmVydGljYWwgPSBfcmVmLnZlcnRpY2FsO1xuICAgIHJldHVybiBibG9jayAmJiAhdmVydGljYWwgPyBuZXcgRXJyb3IoJ2BibG9ja2AgcmVxdWlyZXMgYHZlcnRpY2FsYCB0byBiZSBzZXQgdG8gaGF2ZSBhbnkgZWZmZWN0JykgOiBudWxsO1xuICB9KVxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgYmxvY2s6IGZhbHNlLFxuICBqdXN0aWZpZWQ6IGZhbHNlLFxuICB2ZXJ0aWNhbDogZmFsc2Vcbn07XG5cbnZhciBCdXR0b25Hcm91cCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKEJ1dHRvbkdyb3VwLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBCdXR0b25Hcm91cCgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBCdXR0b25Hcm91cCk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIEJ1dHRvbkdyb3VwLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9leHRlbmRzMjtcblxuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBibG9jayA9IF9wcm9wcy5ibG9jayxcbiAgICAgICAganVzdGlmaWVkID0gX3Byb3BzLmp1c3RpZmllZCxcbiAgICAgICAgdmVydGljYWwgPSBfcHJvcHMudmVydGljYWwsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2Jsb2NrJywgJ2p1c3RpZmllZCcsICd2ZXJ0aWNhbCcsICdjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKSwgKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMpXSA9ICF2ZXJ0aWNhbCwgX2V4dGVuZHMyWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAndmVydGljYWwnKV0gPSB2ZXJ0aWNhbCwgX2V4dGVuZHMyWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnanVzdGlmaWVkJyldID0ganVzdGlmaWVkLCBfZXh0ZW5kczJbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKF9CdXR0b24yWydkZWZhdWx0J10uZGVmYXVsdFByb3BzLCAnYmxvY2snKV0gPSBibG9jaywgX2V4dGVuZHMyKSk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ2RpdicsICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIEJ1dHRvbkdyb3VwO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuQnV0dG9uR3JvdXAucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuQnV0dG9uR3JvdXAuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdidG4tZ3JvdXAnLCBCdXR0b25Hcm91cCk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9CdXR0b24gPSByZXF1aXJlKCcuL0J1dHRvbicpO1xuXG52YXIgX0J1dHRvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9CdXR0b24pO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBCdXR0b25Ub29sYmFyID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoQnV0dG9uVG9vbGJhciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQnV0dG9uVG9vbGJhcigpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBCdXR0b25Ub29sYmFyKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgQnV0dG9uVG9vbGJhci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnZGl2JywgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICByb2xlOiAndG9vbGJhcicsXG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gQnV0dG9uVG9vbGJhcjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2J0bi10b29sYmFyJywgKDAsIF9ib290c3RyYXBVdGlscy5ic1NpemVzKShfQnV0dG9uMlsnZGVmYXVsdCddLlNJWkVTLCBCdXR0b25Ub29sYmFyKSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfQ2Fyb3VzZWxDYXB0aW9uID0gcmVxdWlyZSgnLi9DYXJvdXNlbENhcHRpb24nKTtcblxudmFyIF9DYXJvdXNlbENhcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2Fyb3VzZWxDYXB0aW9uKTtcblxudmFyIF9DYXJvdXNlbEl0ZW0gPSByZXF1aXJlKCcuL0Nhcm91c2VsSXRlbScpO1xuXG52YXIgX0Nhcm91c2VsSXRlbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9DYXJvdXNlbEl0ZW0pO1xuXG52YXIgX0dseXBoaWNvbiA9IHJlcXVpcmUoJy4vR2x5cGhpY29uJyk7XG5cbnZhciBfR2x5cGhpY29uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0dseXBoaWNvbik7XG5cbnZhciBfU2FmZUFuY2hvciA9IHJlcXVpcmUoJy4vU2FmZUFuY2hvcicpO1xuXG52YXIgX1NhZmVBbmNob3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU2FmZUFuY2hvcik7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbnZhciBfVmFsaWRDb21wb25lbnRDaGlsZHJlbiA9IHJlcXVpcmUoJy4vdXRpbHMvVmFsaWRDb21wb25lbnRDaGlsZHJlbicpO1xuXG52YXIgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVmFsaWRDb21wb25lbnRDaGlsZHJlbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuLy8gVE9ETzogYHNsaWRlYCBzaG91bGQgYmUgYGFuaW1hdGVgLlxuXG4vLyBUT0RPOiBVc2UgdW5jb250cm9sbGFibGUuXG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIHNsaWRlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIGluZGljYXRvcnM6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgaW50ZXJ2YWw6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICBjb250cm9sczogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBwYXVzZU9uSG92ZXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgd3JhcDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgd2hlbiB0aGUgYWN0aXZlIGl0ZW0gY2hhbmdlcy5cbiAgICpcbiAgICogYGBganNcbiAgICogKGV2ZW50S2V5OiBhbnkpID0+IGFueSB8IChldmVudEtleTogYW55LCBldmVudDogT2JqZWN0KSA9PiBhbnlcbiAgICogYGBgXG4gICAqXG4gICAqIElmIHRoaXMgY2FsbGJhY2sgdGFrZXMgdHdvIG9yIG1vcmUgYXJndW1lbnRzLCB0aGUgc2Vjb25kIGFyZ3VtZW50IHdpbGxcbiAgICogYmUgYSBwZXJzaXN0ZWQgZXZlbnQgb2JqZWN0IHdpdGggYGRpcmVjdGlvbmAgc2V0IHRvIHRoZSBkaXJlY3Rpb24gb2YgdGhlXG4gICAqIHRyYW5zaXRpb24uXG4gICAqL1xuICBvblNlbGVjdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICBvblNsaWRlRW5kOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIGFjdGl2ZUluZGV4OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcixcbiAgZGVmYXVsdEFjdGl2ZUluZGV4OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcixcbiAgZGlyZWN0aW9uOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mKFsncHJldicsICduZXh0J10pLFxuICBwcmV2SWNvbjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ub2RlLFxuICAvKipcbiAgICogTGFiZWwgc2hvd24gdG8gc2NyZWVuIHJlYWRlcnMgb25seSwgY2FuIGJlIHVzZWQgdG8gc2hvdyB0aGUgcHJldmlvdXMgZWxlbWVudFxuICAgKiBpbiB0aGUgY2Fyb3VzZWwuXG4gICAqIFNldCB0byBudWxsIHRvIGRlYWN0aXZhdGUuXG4gICAqL1xuICBwcmV2TGFiZWw6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICBuZXh0SWNvbjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ub2RlLFxuICAvKipcbiAgICogTGFiZWwgc2hvd24gdG8gc2NyZWVuIHJlYWRlcnMgb25seSwgY2FuIGJlIHVzZWQgdG8gc2hvdyB0aGUgbmV4dCBlbGVtZW50XG4gICAqIGluIHRoZSBjYXJvdXNlbC5cbiAgICogU2V0IHRvIG51bGwgdG8gZGVhY3RpdmF0ZS5cbiAgICovXG4gIG5leHRMYWJlbDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmdcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIHNsaWRlOiB0cnVlLFxuICBpbnRlcnZhbDogNTAwMCxcbiAgcGF1c2VPbkhvdmVyOiB0cnVlLFxuICB3cmFwOiB0cnVlLFxuICBpbmRpY2F0b3JzOiB0cnVlLFxuICBjb250cm9sczogdHJ1ZSxcbiAgcHJldkljb246IF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9HbHlwaGljb24yWydkZWZhdWx0J10sIHsgZ2x5cGg6ICdjaGV2cm9uLWxlZnQnIH0pLFxuICBwcmV2TGFiZWw6ICdQcmV2aW91cycsXG4gIG5leHRJY29uOiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfR2x5cGhpY29uMlsnZGVmYXVsdCddLCB7IGdseXBoOiAnY2hldnJvbi1yaWdodCcgfSksXG4gIG5leHRMYWJlbDogJ05leHQnXG59O1xuXG52YXIgQ2Fyb3VzZWwgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShDYXJvdXNlbCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQ2Fyb3VzZWwocHJvcHMsIGNvbnRleHQpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBDYXJvdXNlbCk7XG5cbiAgICB2YXIgX3RoaXMgPSAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgX3RoaXMuaGFuZGxlTW91c2VPdmVyID0gX3RoaXMuaGFuZGxlTW91c2VPdmVyLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmhhbmRsZU1vdXNlT3V0ID0gX3RoaXMuaGFuZGxlTW91c2VPdXQuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaGFuZGxlUHJldiA9IF90aGlzLmhhbmRsZVByZXYuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaGFuZGxlTmV4dCA9IF90aGlzLmhhbmRsZU5leHQuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaGFuZGxlSXRlbUFuaW1hdGVPdXRFbmQgPSBfdGhpcy5oYW5kbGVJdGVtQW5pbWF0ZU91dEVuZC5iaW5kKF90aGlzKTtcblxuICAgIHZhciBkZWZhdWx0QWN0aXZlSW5kZXggPSBwcm9wcy5kZWZhdWx0QWN0aXZlSW5kZXg7XG5cblxuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgYWN0aXZlSW5kZXg6IGRlZmF1bHRBY3RpdmVJbmRleCAhPSBudWxsID8gZGVmYXVsdEFjdGl2ZUluZGV4IDogMCxcbiAgICAgIHByZXZpb3VzQWN0aXZlSW5kZXg6IG51bGwsXG4gICAgICBkaXJlY3Rpb246IG51bGxcbiAgICB9O1xuXG4gICAgX3RoaXMuaXNVbm1vdW50ZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBDYXJvdXNlbC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgdmFyIGFjdGl2ZUluZGV4ID0gdGhpcy5nZXRBY3RpdmVJbmRleCgpO1xuXG4gICAgaWYgKG5leHRQcm9wcy5hY3RpdmVJbmRleCAhPSBudWxsICYmIG5leHRQcm9wcy5hY3RpdmVJbmRleCAhPT0gYWN0aXZlSW5kZXgpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgcHJldmlvdXNBY3RpdmVJbmRleDogYWN0aXZlSW5kZXgsXG4gICAgICAgIGRpcmVjdGlvbjogbmV4dFByb3BzLmRpcmVjdGlvbiAhPSBudWxsID8gbmV4dFByb3BzLmRpcmVjdGlvbiA6IHRoaXMuZ2V0RGlyZWN0aW9uKGFjdGl2ZUluZGV4LCBuZXh0UHJvcHMuYWN0aXZlSW5kZXgpXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy53YWl0Rm9yTmV4dCgpO1xuICB9O1xuXG4gIENhcm91c2VsLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgIHRoaXMuaXNVbm1vdW50ZWQgPSB0cnVlO1xuICB9O1xuXG4gIENhcm91c2VsLnByb3RvdHlwZS5oYW5kbGVNb3VzZU92ZXIgPSBmdW5jdGlvbiBoYW5kbGVNb3VzZU92ZXIoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMucGF1c2VPbkhvdmVyKSB7XG4gICAgICB0aGlzLnBhdXNlKCk7XG4gICAgfVxuICB9O1xuXG4gIENhcm91c2VsLnByb3RvdHlwZS5oYW5kbGVNb3VzZU91dCA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlT3V0KCkge1xuICAgIGlmICh0aGlzLmlzUGF1c2VkKSB7XG4gICAgICB0aGlzLnBsYXkoKTtcbiAgICB9XG4gIH07XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLmhhbmRsZVByZXYgPSBmdW5jdGlvbiBoYW5kbGVQcmV2KGUpIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmdldEFjdGl2ZUluZGV4KCkgLSAxO1xuXG4gICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgaWYgKCF0aGlzLnByb3BzLndyYXApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaW5kZXggPSBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjJbJ2RlZmF1bHQnXS5jb3VudCh0aGlzLnByb3BzLmNoaWxkcmVuKSAtIDE7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3QoaW5kZXgsIGUsICdwcmV2Jyk7XG4gIH07XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLmhhbmRsZU5leHQgPSBmdW5jdGlvbiBoYW5kbGVOZXh0KGUpIHtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmdldEFjdGl2ZUluZGV4KCkgKyAxO1xuICAgIHZhciBjb3VudCA9IF9WYWxpZENvbXBvbmVudENoaWxkcmVuMlsnZGVmYXVsdCddLmNvdW50KHRoaXMucHJvcHMuY2hpbGRyZW4pO1xuXG4gICAgaWYgKGluZGV4ID4gY291bnQgLSAxKSB7XG4gICAgICBpZiAoIXRoaXMucHJvcHMud3JhcCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpbmRleCA9IDA7XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3QoaW5kZXgsIGUsICduZXh0Jyk7XG4gIH07XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLmhhbmRsZUl0ZW1BbmltYXRlT3V0RW5kID0gZnVuY3Rpb24gaGFuZGxlSXRlbUFuaW1hdGVPdXRFbmQoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHByZXZpb3VzQWN0aXZlSW5kZXg6IG51bGwsXG4gICAgICBkaXJlY3Rpb246IG51bGxcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpczIud2FpdEZvck5leHQoKTtcblxuICAgICAgaWYgKF90aGlzMi5wcm9wcy5vblNsaWRlRW5kKSB7XG4gICAgICAgIF90aGlzMi5wcm9wcy5vblNsaWRlRW5kKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLmdldEFjdGl2ZUluZGV4ID0gZnVuY3Rpb24gZ2V0QWN0aXZlSW5kZXgoKSB7XG4gICAgdmFyIGFjdGl2ZUluZGV4UHJvcCA9IHRoaXMucHJvcHMuYWN0aXZlSW5kZXg7XG4gICAgcmV0dXJuIGFjdGl2ZUluZGV4UHJvcCAhPSBudWxsID8gYWN0aXZlSW5kZXhQcm9wIDogdGhpcy5zdGF0ZS5hY3RpdmVJbmRleDtcbiAgfTtcblxuICBDYXJvdXNlbC5wcm90b3R5cGUuZ2V0RGlyZWN0aW9uID0gZnVuY3Rpb24gZ2V0RGlyZWN0aW9uKHByZXZJbmRleCwgaW5kZXgpIHtcbiAgICBpZiAocHJldkluZGV4ID09PSBpbmRleCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXZJbmRleCA+IGluZGV4ID8gJ3ByZXYnIDogJ25leHQnO1xuICB9O1xuXG4gIENhcm91c2VsLnByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbiBzZWxlY3QoaW5kZXgsIGUsIGRpcmVjdGlvbikge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuXG4gICAgLy8gVE9ETzogSXMgdGhpcyBuZWNlc3Nhcnk/IFNlZW1zIGxpa2UgdGhlIG9ubHkgcmlzayBpcyBpZiB0aGUgY29tcG9uZW50XG4gICAgLy8gdW5tb3VudHMgd2hpbGUgaGFuZGxlSXRlbUFuaW1hdGVPdXRFbmQgZmlyZXMuXG4gICAgaWYgKHRoaXMuaXNVbm1vdW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNBY3RpdmVJbmRleCA9IHRoaXMucHJvcHMuc2xpZGUgPyB0aGlzLmdldEFjdGl2ZUluZGV4KCkgOiBudWxsO1xuICAgIGRpcmVjdGlvbiA9IGRpcmVjdGlvbiB8fCB0aGlzLmdldERpcmVjdGlvbihwcmV2aW91c0FjdGl2ZUluZGV4LCBpbmRleCk7XG5cbiAgICB2YXIgb25TZWxlY3QgPSB0aGlzLnByb3BzLm9uU2VsZWN0O1xuXG5cbiAgICBpZiAob25TZWxlY3QpIHtcbiAgICAgIGlmIChvblNlbGVjdC5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIFJlYWN0IFN5bnRoZXRpY0V2ZW50cyBhcmUgcG9vbGVkLCBzbyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGlzIGV2ZW50XG4gICAgICAgIC8vIGZyb20gdGhlIHBvb2wgdG8gYWRkIGEgY3VzdG9tIHByb3BlcnR5LiBUbyBhdm9pZCB1bm5lY2Vzc2FyaWx5XG4gICAgICAgIC8vIHJlbW92aW5nIG9iamVjdHMgZnJvbSB0aGUgcG9vbCwgb25seSBkbyB0aGlzIHdoZW4gdGhlIGxpc3RlbmVyXG4gICAgICAgIC8vIGFjdHVhbGx5IHdhbnRzIHRoZSBldmVudC5cbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICBlLnBlcnNpc3QoKTtcbiAgICAgICAgICBlLmRpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlID0geyBkaXJlY3Rpb246IGRpcmVjdGlvbiB9O1xuICAgICAgICB9XG5cbiAgICAgICAgb25TZWxlY3QoaW5kZXgsIGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb25TZWxlY3QoaW5kZXgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLmFjdGl2ZUluZGV4ID09IG51bGwgJiYgaW5kZXggIT09IHByZXZpb3VzQWN0aXZlSW5kZXgpIHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLnByZXZpb3VzQWN0aXZlSW5kZXggIT0gbnVsbCkge1xuICAgICAgICAvLyBJZiBjdXJyZW50bHkgYW5pbWF0aW5nIGRvbid0IGFjdGl2YXRlIHRoZSBuZXcgaW5kZXguXG4gICAgICAgIC8vIFRPRE86IGxvb2sgaW50byBxdWV1ZWluZyB0aGlzIGNhbmNlbGVkIGNhbGwgYW5kXG4gICAgICAgIC8vIGFuaW1hdGluZyBhZnRlciB0aGUgY3VycmVudCBhbmltYXRpb24gaGFzIGVuZGVkLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBhY3RpdmVJbmRleDogaW5kZXgsXG4gICAgICAgIHByZXZpb3VzQWN0aXZlSW5kZXg6IHByZXZpb3VzQWN0aXZlSW5kZXgsXG4gICAgICAgIGRpcmVjdGlvbjogZGlyZWN0aW9uXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLndhaXRGb3JOZXh0ID0gZnVuY3Rpb24gd2FpdEZvck5leHQoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIHNsaWRlID0gX3Byb3BzLnNsaWRlLFxuICAgICAgICBpbnRlcnZhbCA9IF9wcm9wcy5pbnRlcnZhbCxcbiAgICAgICAgYWN0aXZlSW5kZXhQcm9wID0gX3Byb3BzLmFjdGl2ZUluZGV4O1xuXG5cbiAgICBpZiAoIXRoaXMuaXNQYXVzZWQgJiYgc2xpZGUgJiYgaW50ZXJ2YWwgJiYgYWN0aXZlSW5kZXhQcm9wID09IG51bGwpIHtcbiAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQodGhpcy5oYW5kbGVOZXh0LCBpbnRlcnZhbCk7XG4gICAgfVxuICB9O1xuXG4gIC8vIFRoaXMgbWlnaHQgYmUgYSBwdWJsaWMgQVBJLlxuXG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24gcGF1c2UoKSB7XG4gICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gIH07XG5cbiAgLy8gVGhpcyBtaWdodCBiZSBhIHB1YmxpYyBBUEkuXG5cblxuICBDYXJvdXNlbC5wcm90b3R5cGUucGxheSA9IGZ1bmN0aW9uIHBsYXkoKSB7XG4gICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMud2FpdEZvck5leHQoKTtcbiAgfTtcblxuICBDYXJvdXNlbC5wcm90b3R5cGUucmVuZGVySW5kaWNhdG9ycyA9IGZ1bmN0aW9uIHJlbmRlckluZGljYXRvcnMoY2hpbGRyZW4sIGFjdGl2ZUluZGV4LCBic1Byb3BzKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICB2YXIgaW5kaWNhdG9ycyA9IFtdO1xuXG4gICAgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yWydkZWZhdWx0J10uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkLCBpbmRleCkge1xuICAgICAgaW5kaWNhdG9ycy5wdXNoKF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdsaScsIHtcbiAgICAgICAga2V5OiBpbmRleCxcbiAgICAgICAgY2xhc3NOYW1lOiBpbmRleCA9PT0gYWN0aXZlSW5kZXggPyAnYWN0aXZlJyA6IG51bGwsXG4gICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuICAgICAgICAgIHJldHVybiBfdGhpczMuc2VsZWN0KGluZGV4LCBlKTtcbiAgICAgICAgfVxuICAgICAgfSksXG5cbiAgICAgIC8vIEZvcmNlIHdoaXRlc3BhY2UgYmV0d2VlbiBpbmRpY2F0b3IgZWxlbWVudHMuIEJvb3RzdHJhcCByZXF1aXJlc1xuICAgICAgLy8gdGhpcyBmb3IgY29ycmVjdCBzcGFjaW5nIG9mIGVsZW1lbnRzLlxuICAgICAgJyAnKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICdvbCcsXG4gICAgICB7IGNsYXNzTmFtZTogKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdpbmRpY2F0b3JzJykgfSxcbiAgICAgIGluZGljYXRvcnNcbiAgICApO1xuICB9O1xuXG4gIENhcm91c2VsLnByb3RvdHlwZS5yZW5kZXJDb250cm9scyA9IGZ1bmN0aW9uIHJlbmRlckNvbnRyb2xzKHByb3BlcnRpZXMpIHtcbiAgICB2YXIgd3JhcCA9IHByb3BlcnRpZXMud3JhcCxcbiAgICAgICAgY2hpbGRyZW4gPSBwcm9wZXJ0aWVzLmNoaWxkcmVuLFxuICAgICAgICBhY3RpdmVJbmRleCA9IHByb3BlcnRpZXMuYWN0aXZlSW5kZXgsXG4gICAgICAgIHByZXZJY29uID0gcHJvcGVydGllcy5wcmV2SWNvbixcbiAgICAgICAgbmV4dEljb24gPSBwcm9wZXJ0aWVzLm5leHRJY29uLFxuICAgICAgICBic1Byb3BzID0gcHJvcGVydGllcy5ic1Byb3BzLFxuICAgICAgICBwcmV2TGFiZWwgPSBwcm9wZXJ0aWVzLnByZXZMYWJlbCxcbiAgICAgICAgbmV4dExhYmVsID0gcHJvcGVydGllcy5uZXh0TGFiZWw7XG5cbiAgICB2YXIgY29udHJvbENsYXNzTmFtZSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnY29udHJvbCcpO1xuICAgIHZhciBjb3VudCA9IF9WYWxpZENvbXBvbmVudENoaWxkcmVuMlsnZGVmYXVsdCddLmNvdW50KGNoaWxkcmVuKTtcblxuICAgIHJldHVybiBbKHdyYXAgfHwgYWN0aXZlSW5kZXggIT09IDApICYmIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgX1NhZmVBbmNob3IyWydkZWZhdWx0J10sXG4gICAgICB7XG4gICAgICAgIGtleTogJ3ByZXYnLFxuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY29udHJvbENsYXNzTmFtZSwgJ2xlZnQnKSxcbiAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVQcmV2XG4gICAgICB9LFxuICAgICAgcHJldkljb24sXG4gICAgICBwcmV2TGFiZWwgJiYgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdzcGFuJyxcbiAgICAgICAgeyBjbGFzc05hbWU6ICdzci1vbmx5JyB9LFxuICAgICAgICBwcmV2TGFiZWxcbiAgICAgIClcbiAgICApLCAod3JhcCB8fCBhY3RpdmVJbmRleCAhPT0gY291bnQgLSAxKSAmJiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgIF9TYWZlQW5jaG9yMlsnZGVmYXVsdCddLFxuICAgICAge1xuICAgICAgICBrZXk6ICduZXh0JyxcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNvbnRyb2xDbGFzc05hbWUsICdyaWdodCcpLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZU5leHRcbiAgICAgIH0sXG4gICAgICBuZXh0SWNvbixcbiAgICAgIG5leHRMYWJlbCAmJiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ3NwYW4nLFxuICAgICAgICB7IGNsYXNzTmFtZTogJ3NyLW9ubHknIH0sXG4gICAgICAgIG5leHRMYWJlbFxuICAgICAgKVxuICAgICldO1xuICB9O1xuXG4gIENhcm91c2VsLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICB2YXIgX3Byb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIHNsaWRlID0gX3Byb3BzMi5zbGlkZSxcbiAgICAgICAgaW5kaWNhdG9ycyA9IF9wcm9wczIuaW5kaWNhdG9ycyxcbiAgICAgICAgY29udHJvbHMgPSBfcHJvcHMyLmNvbnRyb2xzLFxuICAgICAgICB3cmFwID0gX3Byb3BzMi53cmFwLFxuICAgICAgICBwcmV2SWNvbiA9IF9wcm9wczIucHJldkljb24sXG4gICAgICAgIHByZXZMYWJlbCA9IF9wcm9wczIucHJldkxhYmVsLFxuICAgICAgICBuZXh0SWNvbiA9IF9wcm9wczIubmV4dEljb24sXG4gICAgICAgIG5leHRMYWJlbCA9IF9wcm9wczIubmV4dExhYmVsLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMyLmNsYXNzTmFtZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMyLmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wczIsIFsnc2xpZGUnLCAnaW5kaWNhdG9ycycsICdjb250cm9scycsICd3cmFwJywgJ3ByZXZJY29uJywgJ3ByZXZMYWJlbCcsICduZXh0SWNvbicsICduZXh0TGFiZWwnLCAnY2xhc3NOYW1lJywgJ2NoaWxkcmVuJ10pO1xuICAgIHZhciBfc3RhdGUgPSB0aGlzLnN0YXRlLFxuICAgICAgICBwcmV2aW91c0FjdGl2ZUluZGV4ID0gX3N0YXRlLnByZXZpb3VzQWN0aXZlSW5kZXgsXG4gICAgICAgIGRpcmVjdGlvbiA9IF9zdGF0ZS5kaXJlY3Rpb247XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wc0FuZE9taXQgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wc0FuZE9taXQpKHByb3BzLCBbJ2ludGVydmFsJywgJ3BhdXNlT25Ib3ZlcicsICdvblNlbGVjdCcsICdvblNsaWRlRW5kJywgJ2FjdGl2ZUluZGV4JywgLy8gQWNjZXNzZWQgdmlhIHRoaXMuZ2V0QWN0aXZlSW5kZXgoKS5cbiAgICAnZGVmYXVsdEFjdGl2ZUluZGV4JywgJ2RpcmVjdGlvbiddKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNBbmRPbWl0WzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzQW5kT21pdFsxXTtcblxuICAgIHZhciBhY3RpdmVJbmRleCA9IHRoaXMuZ2V0QWN0aXZlSW5kZXgoKTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyksIHtcbiAgICAgIHNsaWRlOiBzbGlkZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2RpdicsXG4gICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcyksXG4gICAgICAgIG9uTW91c2VPdmVyOiB0aGlzLmhhbmRsZU1vdXNlT3ZlcixcbiAgICAgICAgb25Nb3VzZU91dDogdGhpcy5oYW5kbGVNb3VzZU91dFxuICAgICAgfSksXG4gICAgICBpbmRpY2F0b3JzICYmIHRoaXMucmVuZGVySW5kaWNhdG9ycyhjaGlsZHJlbiwgYWN0aXZlSW5kZXgsIGJzUHJvcHMpLFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7IGNsYXNzTmFtZTogKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdpbm5lcicpIH0sXG4gICAgICAgIF9WYWxpZENvbXBvbmVudENoaWxkcmVuMlsnZGVmYXVsdCddLm1hcChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkLCBpbmRleCkge1xuICAgICAgICAgIHZhciBhY3RpdmUgPSBpbmRleCA9PT0gYWN0aXZlSW5kZXg7XG4gICAgICAgICAgdmFyIHByZXZpb3VzQWN0aXZlID0gc2xpZGUgJiYgaW5kZXggPT09IHByZXZpb3VzQWN0aXZlSW5kZXg7XG5cbiAgICAgICAgICByZXR1cm4gKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGNoaWxkLCB7XG4gICAgICAgICAgICBhY3RpdmU6IGFjdGl2ZSxcbiAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgIGFuaW1hdGVPdXQ6IHByZXZpb3VzQWN0aXZlLFxuICAgICAgICAgICAgYW5pbWF0ZUluOiBhY3RpdmUgJiYgcHJldmlvdXNBY3RpdmVJbmRleCAhPSBudWxsICYmIHNsaWRlLFxuICAgICAgICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgICAgICAgICBvbkFuaW1hdGVPdXRFbmQ6IHByZXZpb3VzQWN0aXZlID8gX3RoaXM0LmhhbmRsZUl0ZW1BbmltYXRlT3V0RW5kIDogbnVsbFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKSxcbiAgICAgIGNvbnRyb2xzICYmIHRoaXMucmVuZGVyQ29udHJvbHMoe1xuICAgICAgICB3cmFwOiB3cmFwLFxuICAgICAgICBjaGlsZHJlbjogY2hpbGRyZW4sXG4gICAgICAgIGFjdGl2ZUluZGV4OiBhY3RpdmVJbmRleCxcbiAgICAgICAgcHJldkljb246IHByZXZJY29uLFxuICAgICAgICBwcmV2TGFiZWw6IHByZXZMYWJlbCxcbiAgICAgICAgbmV4dEljb246IG5leHRJY29uLFxuICAgICAgICBuZXh0TGFiZWw6IG5leHRMYWJlbCxcbiAgICAgICAgYnNQcm9wczogYnNQcm9wc1xuICAgICAgfSlcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBDYXJvdXNlbDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbkNhcm91c2VsLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkNhcm91c2VsLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuQ2Fyb3VzZWwuQ2FwdGlvbiA9IF9DYXJvdXNlbENhcHRpb24yWydkZWZhdWx0J107XG5DYXJvdXNlbC5JdGVtID0gX0Nhcm91c2VsSXRlbTJbJ2RlZmF1bHQnXTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnY2Fyb3VzZWwnLCBDYXJvdXNlbCk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiBfZWxlbWVudFR5cGUyWydkZWZhdWx0J11cbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiAnZGl2J1xufTtcblxudmFyIENhcm91c2VsQ2FwdGlvbiA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKENhcm91c2VsQ2FwdGlvbiwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQ2Fyb3VzZWxDYXB0aW9uKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIENhcm91c2VsQ2FwdGlvbik7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIENhcm91c2VsQ2FwdGlvbi5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBDb21wb25lbnQgPSBfcHJvcHMuY29tcG9uZW50Q2xhc3MsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NvbXBvbmVudENsYXNzJywgJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gQ2Fyb3VzZWxDYXB0aW9uO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuQ2Fyb3VzZWxDYXB0aW9uLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkNhcm91c2VsQ2FwdGlvbi5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2Nhcm91c2VsLWNhcHRpb24nLCBDYXJvdXNlbENhcHRpb24pO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX3JlYWN0RG9tID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5cbnZhciBfcmVhY3REb20yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3REb20pO1xuXG52YXIgX1RyYW5zaXRpb25FdmVudHMgPSByZXF1aXJlKCcuL3V0aWxzL1RyYW5zaXRpb25FdmVudHMnKTtcblxudmFyIF9UcmFuc2l0aW9uRXZlbnRzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RyYW5zaXRpb25FdmVudHMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbi8vIFRPRE86IFRoaXMgc2hvdWxkIHVzZSBhIHRpbWVvdXQgaW5zdGVhZCBvZiBUcmFuc2l0aW9uRXZlbnRzLCBvciBlbHNlIGp1c3Rcbi8vIG5vdCB3YWl0IHVudGlsIHRyYW5zaXRpb24gZW5kIHRvIHRyaWdnZXIgY29udGludWluZyBhbmltYXRpb25zLlxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBkaXJlY3Rpb246IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2YoWydwcmV2JywgJ25leHQnXSksXG4gIG9uQW5pbWF0ZU91dEVuZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICBhY3RpdmU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgYW5pbWF0ZUluOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIGFuaW1hdGVPdXQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgaW5kZXg6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBhY3RpdmU6IGZhbHNlLFxuICBhbmltYXRlSW46IGZhbHNlLFxuICBhbmltYXRlT3V0OiBmYWxzZVxufTtcblxudmFyIENhcm91c2VsSXRlbSA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKENhcm91c2VsSXRlbSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQ2Fyb3VzZWxJdGVtKHByb3BzLCBjb250ZXh0KSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgQ2Fyb3VzZWxJdGVtKTtcblxuICAgIHZhciBfdGhpcyA9ICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICBfdGhpcy5oYW5kbGVBbmltYXRlT3V0RW5kID0gX3RoaXMuaGFuZGxlQW5pbWF0ZU91dEVuZC5iaW5kKF90aGlzKTtcblxuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgZGlyZWN0aW9uOiBudWxsXG4gICAgfTtcblxuICAgIF90aGlzLmlzVW5tb3VudGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgQ2Fyb3VzZWxJdGVtLnByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5hY3RpdmUgIT09IG5leHRQcm9wcy5hY3RpdmUpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBkaXJlY3Rpb246IG51bGwgfSk7XG4gICAgfVxuICB9O1xuXG4gIENhcm91c2VsSXRlbS5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIGFjdGl2ZSA9IHRoaXMucHJvcHMuYWN0aXZlO1xuXG4gICAgdmFyIHByZXZBY3RpdmUgPSBwcmV2UHJvcHMuYWN0aXZlO1xuXG4gICAgaWYgKCFhY3RpdmUgJiYgcHJldkFjdGl2ZSkge1xuICAgICAgX1RyYW5zaXRpb25FdmVudHMyWydkZWZhdWx0J10uYWRkRW5kRXZlbnRMaXN0ZW5lcihfcmVhY3REb20yWydkZWZhdWx0J10uZmluZERPTU5vZGUodGhpcyksIHRoaXMuaGFuZGxlQW5pbWF0ZU91dEVuZCk7XG4gICAgfVxuXG4gICAgaWYgKGFjdGl2ZSAhPT0gcHJldkFjdGl2ZSkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpczIuc3RhcnRBbmltYXRpb24oKTtcbiAgICAgIH0sIDIwKTtcbiAgICB9XG4gIH07XG5cbiAgQ2Fyb3VzZWxJdGVtLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMuaXNVbm1vdW50ZWQgPSB0cnVlO1xuICB9O1xuXG4gIENhcm91c2VsSXRlbS5wcm90b3R5cGUuaGFuZGxlQW5pbWF0ZU91dEVuZCA9IGZ1bmN0aW9uIGhhbmRsZUFuaW1hdGVPdXRFbmQoKSB7XG4gICAgaWYgKHRoaXMuaXNVbm1vdW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy5vbkFuaW1hdGVPdXRFbmQpIHtcbiAgICAgIHRoaXMucHJvcHMub25BbmltYXRlT3V0RW5kKHRoaXMucHJvcHMuaW5kZXgpO1xuICAgIH1cbiAgfTtcblxuICBDYXJvdXNlbEl0ZW0ucHJvdG90eXBlLnN0YXJ0QW5pbWF0aW9uID0gZnVuY3Rpb24gc3RhcnRBbmltYXRpb24oKSB7XG4gICAgaWYgKHRoaXMuaXNVbm1vdW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGRpcmVjdGlvbjogdGhpcy5wcm9wcy5kaXJlY3Rpb24gPT09ICdwcmV2JyA/ICdyaWdodCcgOiAnbGVmdCdcbiAgICB9KTtcbiAgfTtcblxuICBDYXJvdXNlbEl0ZW0ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgZGlyZWN0aW9uID0gX3Byb3BzLmRpcmVjdGlvbixcbiAgICAgICAgYWN0aXZlID0gX3Byb3BzLmFjdGl2ZSxcbiAgICAgICAgYW5pbWF0ZUluID0gX3Byb3BzLmFuaW1hdGVJbixcbiAgICAgICAgYW5pbWF0ZU91dCA9IF9wcm9wcy5hbmltYXRlT3V0LFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydkaXJlY3Rpb24nLCAnYWN0aXZlJywgJ2FuaW1hdGVJbicsICdhbmltYXRlT3V0JywgJ2NsYXNzTmFtZSddKTtcblxuXG4gICAgZGVsZXRlIHByb3BzLm9uQW5pbWF0ZU91dEVuZDtcbiAgICBkZWxldGUgcHJvcHMuaW5kZXg7XG5cbiAgICB2YXIgY2xhc3NlcyA9IHtcbiAgICAgIGl0ZW06IHRydWUsXG4gICAgICBhY3RpdmU6IGFjdGl2ZSAmJiAhYW5pbWF0ZUluIHx8IGFuaW1hdGVPdXRcbiAgICB9O1xuICAgIGlmIChkaXJlY3Rpb24gJiYgYWN0aXZlICYmIGFuaW1hdGVJbikge1xuICAgICAgY2xhc3Nlc1tkaXJlY3Rpb25dID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RhdGUuZGlyZWN0aW9uICYmIChhbmltYXRlSW4gfHwgYW5pbWF0ZU91dCkpIHtcbiAgICAgIGNsYXNzZXNbdGhpcy5zdGF0ZS5kaXJlY3Rpb25dID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ2RpdicsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIHByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gQ2Fyb3VzZWxJdGVtO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuQ2Fyb3VzZWxJdGVtLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkNhcm91c2VsSXRlbS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IENhcm91c2VsSXRlbTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF93YXJuaW5nID0gcmVxdWlyZSgnd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgaW5saW5lOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIGRpc2FibGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIC8qKlxuICAgKiBPbmx5IHZhbGlkIGlmIGBpbmxpbmVgIGlzIG5vdCBzZXQuXG4gICAqL1xuICB2YWxpZGF0aW9uU3RhdGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2YoWydzdWNjZXNzJywgJ3dhcm5pbmcnLCAnZXJyb3InLCBudWxsXSksXG4gIC8qKlxuICAgKiBBdHRhY2hlcyBhIHJlZiB0byB0aGUgYDxpbnB1dD5gIGVsZW1lbnQuIE9ubHkgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGhlcmUuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIDxDaGVja2JveCBpbnB1dFJlZj17cmVmID0+IHsgdGhpcy5pbnB1dCA9IHJlZjsgfX0gLz5cbiAgICogYGBgXG4gICAqL1xuICBpbnB1dFJlZjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBpbmxpbmU6IGZhbHNlLFxuICBkaXNhYmxlZDogZmFsc2Vcbn07XG5cbnZhciBDaGVja2JveCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKENoZWNrYm94LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBDaGVja2JveCgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBDaGVja2JveCk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIENoZWNrYm94LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGlubGluZSA9IF9wcm9wcy5pbmxpbmUsXG4gICAgICAgIGRpc2FibGVkID0gX3Byb3BzLmRpc2FibGVkLFxuICAgICAgICB2YWxpZGF0aW9uU3RhdGUgPSBfcHJvcHMudmFsaWRhdGlvblN0YXRlLFxuICAgICAgICBpbnB1dFJlZiA9IF9wcm9wcy5pbnB1dFJlZixcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGUgPSBfcHJvcHMuc3R5bGUsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydpbmxpbmUnLCAnZGlzYWJsZWQnLCAndmFsaWRhdGlvblN0YXRlJywgJ2lucHV0UmVmJywgJ2NsYXNzTmFtZScsICdzdHlsZScsICdjaGlsZHJlbiddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgaW5wdXQgPSBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnaW5wdXQnLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIHJlZjogaW5wdXRSZWYsXG4gICAgICB0eXBlOiAnY2hlY2tib3gnLFxuICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkXG4gICAgfSkpO1xuXG4gICAgaWYgKGlubGluZSkge1xuICAgICAgdmFyIF9jbGFzc2VzMjtcblxuICAgICAgdmFyIF9jbGFzc2VzID0gKF9jbGFzc2VzMiA9IHt9LCBfY2xhc3NlczJbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdpbmxpbmUnKV0gPSB0cnVlLCBfY2xhc3NlczIuZGlzYWJsZWQgPSBkaXNhYmxlZCwgX2NsYXNzZXMyKTtcblxuICAgICAgLy8gVXNlIGEgd2FybmluZyBoZXJlIGluc3RlYWQgb2YgaW4gcHJvcFR5cGVzIHRvIGdldCBiZXR0ZXItbG9va2luZ1xuICAgICAgLy8gZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24uXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gKDAsIF93YXJuaW5nMlsnZGVmYXVsdCddKSghdmFsaWRhdGlvblN0YXRlLCAnYHZhbGlkYXRpb25TdGF0ZWAgaXMgaWdub3JlZCBvbiBgPENoZWNrYm94IGlubGluZT5gLiBUbyBkaXNwbGF5ICcgKyAndmFsaWRhdGlvbiBzdGF0ZSBvbiBhbiBpbmxpbmUgY2hlY2tib3gsIHNldCBgdmFsaWRhdGlvblN0YXRlYCBvbiBhICcgKyAncGFyZW50IGA8Rm9ybUdyb3VwPmAgb3Igb3RoZXIgZWxlbWVudCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuXG4gICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdsYWJlbCcsXG4gICAgICAgIHsgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgX2NsYXNzZXMpLCBzdHlsZTogc3R5bGUgfSxcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIGNoaWxkcmVuXG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyksIHtcbiAgICAgIGRpc2FibGVkOiBkaXNhYmxlZFxuICAgIH0pO1xuICAgIGlmICh2YWxpZGF0aW9uU3RhdGUpIHtcbiAgICAgIGNsYXNzZXNbJ2hhcy0nICsgdmFsaWRhdGlvblN0YXRlXSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2RpdicsXG4gICAgICB7IGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpLCBzdHlsZTogc3R5bGUgfSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnbGFiZWwnLFxuICAgICAgICBudWxsLFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgY2hpbGRyZW5cbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBDaGVja2JveDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbkNoZWNrYm94LnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkNoZWNrYm94LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnY2hlY2tib3gnLCBDaGVja2JveCk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfZWxlbWVudFR5cGUgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxudmFyIF9jYXBpdGFsaXplID0gcmVxdWlyZSgnLi91dGlscy9jYXBpdGFsaXplJyk7XG5cbnZhciBfY2FwaXRhbGl6ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jYXBpdGFsaXplKTtcblxudmFyIF9TdHlsZUNvbmZpZyA9IHJlcXVpcmUoJy4vdXRpbHMvU3R5bGVDb25maWcnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBjb21wb25lbnRDbGFzczogX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddLFxuXG4gIC8qKlxuICAgKiBBcHBseSBjbGVhcmZpeFxuICAgKlxuICAgKiBvbiBFeHRyYSBzbWFsbCBkZXZpY2VzIFBob25lc1xuICAgKlxuICAgKiBhZGRzIGNsYXNzIGB2aXNpYmxlLXhzLWJsb2NrYFxuICAgKi9cbiAgdmlzaWJsZVhzQmxvY2s6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgLyoqXG4gICAqIEFwcGx5IGNsZWFyZml4XG4gICAqXG4gICAqIG9uIFNtYWxsIGRldmljZXMgVGFibGV0c1xuICAgKlxuICAgKiBhZGRzIGNsYXNzIGB2aXNpYmxlLXNtLWJsb2NrYFxuICAgKi9cbiAgdmlzaWJsZVNtQmxvY2s6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgLyoqXG4gICAqIEFwcGx5IGNsZWFyZml4XG4gICAqXG4gICAqIG9uIE1lZGl1bSBkZXZpY2VzIERlc2t0b3BzXG4gICAqXG4gICAqIGFkZHMgY2xhc3MgYHZpc2libGUtbWQtYmxvY2tgXG4gICAqL1xuICB2aXNpYmxlTWRCbG9jazogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICAvKipcbiAgICogQXBwbHkgY2xlYXJmaXhcbiAgICpcbiAgICogb24gTGFyZ2UgZGV2aWNlcyBEZXNrdG9wc1xuICAgKlxuICAgKiBhZGRzIGNsYXNzIGB2aXNpYmxlLWxnLWJsb2NrYFxuICAgKi9cbiAgdmlzaWJsZUxnQmxvY2s6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbFxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6ICdkaXYnXG59O1xuXG52YXIgQ2xlYXJmaXggPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShDbGVhcmZpeCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQ2xlYXJmaXgoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgQ2xlYXJmaXgpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBDbGVhcmZpeC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBDb21wb25lbnQgPSBfcHJvcHMuY29tcG9uZW50Q2xhc3MsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NvbXBvbmVudENsYXNzJywgJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgX1N0eWxlQ29uZmlnLkRFVklDRV9TSVpFUy5mb3JFYWNoKGZ1bmN0aW9uIChzaXplKSB7XG4gICAgICB2YXIgcHJvcE5hbWUgPSAndmlzaWJsZScgKyAoMCwgX2NhcGl0YWxpemUyWydkZWZhdWx0J10pKHNpemUpICsgJ0Jsb2NrJztcbiAgICAgIGlmIChlbGVtZW50UHJvcHNbcHJvcE5hbWVdKSB7XG4gICAgICAgIGNsYXNzZXNbJ3Zpc2libGUtJyArIHNpemUgKyAnLWJsb2NrJ10gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBkZWxldGUgZWxlbWVudFByb3BzW3Byb3BOYW1lXTtcbiAgICB9KTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChDb21wb25lbnQsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIENsZWFyZml4O1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuQ2xlYXJmaXgucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuQ2xlYXJmaXguZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdjbGVhcmZpeCcsIENsZWFyZml4KTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIFByb3BUeXBlcyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9wcm9wVHlwZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gZWxzZSB7IHZhciBuZXdPYmogPSB7fTsgaWYgKG9iaiAhPSBudWxsKSB7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSBuZXdPYmpbJ2RlZmF1bHQnXSA9IG9iajsgcmV0dXJuIG5ld09iajsgfSB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgbGFiZWw6IFByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgb25DbGljazogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbnZhciBDbG9zZUJ1dHRvbiA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKENsb3NlQnV0dG9uLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBDbG9zZUJ1dHRvbigpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBDbG9zZUJ1dHRvbik7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIENsb3NlQnV0dG9uLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGxhYmVsID0gX3Byb3BzLmxhYmVsLFxuICAgICAgICBvbkNsaWNrID0gX3Byb3BzLm9uQ2xpY2s7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnYnV0dG9uJyxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgIGNsYXNzTmFtZTogJ2Nsb3NlJyxcbiAgICAgICAgb25DbGljazogb25DbGlja1xuICAgICAgfSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnc3BhbicsXG4gICAgICAgIHsgJ2FyaWEtaGlkZGVuJzogJ3RydWUnIH0sXG4gICAgICAgICdcXHhENydcbiAgICAgICksXG4gICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ3NwYW4nLFxuICAgICAgICB7IGNsYXNzTmFtZTogJ3NyLW9ubHknIH0sXG4gICAgICAgIGxhYmVsXG4gICAgICApXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gQ2xvc2VCdXR0b247XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5DbG9zZUJ1dHRvbi5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IENsb3NlQnV0dG9uO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2VsZW1lbnRUeXBlID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvZWxlbWVudFR5cGUnKTtcblxudmFyIF9lbGVtZW50VHlwZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbGVtZW50VHlwZSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbnZhciBfU3R5bGVDb25maWcgPSByZXF1aXJlKCcuL3V0aWxzL1N0eWxlQ29uZmlnJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6IF9lbGVtZW50VHlwZTJbJ2RlZmF1bHQnXSxcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBjb2x1bW5zIHlvdSB3aXNoIHRvIHNwYW5cbiAgICpcbiAgICogZm9yIEV4dHJhIHNtYWxsIGRldmljZXMgUGhvbmVzICg8NzY4cHgpXG4gICAqXG4gICAqIGNsYXNzLXByZWZpeCBgY29sLXhzLWBcbiAgICovXG4gIHhzOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcixcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgY29sdW1ucyB5b3Ugd2lzaCB0byBzcGFuXG4gICAqXG4gICAqIGZvciBTbWFsbCBkZXZpY2VzIFRhYmxldHMgKOKJpTc2OHB4KVxuICAgKlxuICAgKiBjbGFzcy1wcmVmaXggYGNvbC1zbS1gXG4gICAqL1xuICBzbTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgeW91IHdpc2ggdG8gc3BhblxuICAgKlxuICAgKiBmb3IgTWVkaXVtIGRldmljZXMgRGVza3RvcHMgKOKJpTk5MnB4KVxuICAgKlxuICAgKiBjbGFzcy1wcmVmaXggYGNvbC1tZC1gXG4gICAqL1xuICBtZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgeW91IHdpc2ggdG8gc3BhblxuICAgKlxuICAgKiBmb3IgTGFyZ2UgZGV2aWNlcyBEZXNrdG9wcyAo4omlMTIwMHB4KVxuICAgKlxuICAgKiBjbGFzcy1wcmVmaXggYGNvbC1sZy1gXG4gICAqL1xuICBsZzogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsXG4gIC8qKlxuICAgKiBIaWRlIGNvbHVtblxuICAgKlxuICAgKiBvbiBFeHRyYSBzbWFsbCBkZXZpY2VzIFBob25lc1xuICAgKlxuICAgKiBhZGRzIGNsYXNzIGBoaWRkZW4teHNgXG4gICAqL1xuICB4c0hpZGRlbjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICAvKipcbiAgICogSGlkZSBjb2x1bW5cbiAgICpcbiAgICogb24gU21hbGwgZGV2aWNlcyBUYWJsZXRzXG4gICAqXG4gICAqIGFkZHMgY2xhc3MgYGhpZGRlbi1zbWBcbiAgICovXG4gIHNtSGlkZGVuOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIC8qKlxuICAgKiBIaWRlIGNvbHVtblxuICAgKlxuICAgKiBvbiBNZWRpdW0gZGV2aWNlcyBEZXNrdG9wc1xuICAgKlxuICAgKiBhZGRzIGNsYXNzIGBoaWRkZW4tbWRgXG4gICAqL1xuICBtZEhpZGRlbjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICAvKipcbiAgICogSGlkZSBjb2x1bW5cbiAgICpcbiAgICogb24gTGFyZ2UgZGV2aWNlcyBEZXNrdG9wc1xuICAgKlxuICAgKiBhZGRzIGNsYXNzIGBoaWRkZW4tbGdgXG4gICAqL1xuICBsZ0hpZGRlbjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICAvKipcbiAgICogTW92ZSBjb2x1bW5zIHRvIHRoZSByaWdodFxuICAgKlxuICAgKiBmb3IgRXh0cmEgc21hbGwgZGV2aWNlcyBQaG9uZXNcbiAgICpcbiAgICogY2xhc3MtcHJlZml4IGBjb2wteHMtb2Zmc2V0LWBcbiAgICovXG4gIHhzT2Zmc2V0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcixcbiAgLyoqXG4gICAqIE1vdmUgY29sdW1ucyB0byB0aGUgcmlnaHRcbiAgICpcbiAgICogZm9yIFNtYWxsIGRldmljZXMgVGFibGV0c1xuICAgKlxuICAgKiBjbGFzcy1wcmVmaXggYGNvbC1zbS1vZmZzZXQtYFxuICAgKi9cbiAgc21PZmZzZXQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICAvKipcbiAgICogTW92ZSBjb2x1bW5zIHRvIHRoZSByaWdodFxuICAgKlxuICAgKiBmb3IgTWVkaXVtIGRldmljZXMgRGVza3RvcHNcbiAgICpcbiAgICogY2xhc3MtcHJlZml4IGBjb2wtbWQtb2Zmc2V0LWBcbiAgICovXG4gIG1kT2Zmc2V0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcixcbiAgLyoqXG4gICAqIE1vdmUgY29sdW1ucyB0byB0aGUgcmlnaHRcbiAgICpcbiAgICogZm9yIExhcmdlIGRldmljZXMgRGVza3RvcHNcbiAgICpcbiAgICogY2xhc3MtcHJlZml4IGBjb2wtbGctb2Zmc2V0LWBcbiAgICovXG4gIGxnT2Zmc2V0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcixcbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgb3JkZXIgb2YgZ3JpZCBjb2x1bW5zIHRvIHRoZSByaWdodFxuICAgKlxuICAgKiBmb3IgRXh0cmEgc21hbGwgZGV2aWNlcyBQaG9uZXNcbiAgICpcbiAgICogY2xhc3MtcHJlZml4IGBjb2wteHMtcHVzaC1gXG4gICAqL1xuICB4c1B1c2g6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBvcmRlciBvZiBncmlkIGNvbHVtbnMgdG8gdGhlIHJpZ2h0XG4gICAqXG4gICAqIGZvciBTbWFsbCBkZXZpY2VzIFRhYmxldHNcbiAgICpcbiAgICogY2xhc3MtcHJlZml4IGBjb2wtc20tcHVzaC1gXG4gICAqL1xuICBzbVB1c2g6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBvcmRlciBvZiBncmlkIGNvbHVtbnMgdG8gdGhlIHJpZ2h0XG4gICAqXG4gICAqIGZvciBNZWRpdW0gZGV2aWNlcyBEZXNrdG9wc1xuICAgKlxuICAgKiBjbGFzcy1wcmVmaXggYGNvbC1tZC1wdXNoLWBcbiAgICovXG4gIG1kUHVzaDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIG9yZGVyIG9mIGdyaWQgY29sdW1ucyB0byB0aGUgcmlnaHRcbiAgICpcbiAgICogZm9yIExhcmdlIGRldmljZXMgRGVza3RvcHNcbiAgICpcbiAgICogY2xhc3MtcHJlZml4IGBjb2wtbGctcHVzaC1gXG4gICAqL1xuICBsZ1B1c2g6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBvcmRlciBvZiBncmlkIGNvbHVtbnMgdG8gdGhlIGxlZnRcbiAgICpcbiAgICogZm9yIEV4dHJhIHNtYWxsIGRldmljZXMgUGhvbmVzXG4gICAqXG4gICAqIGNsYXNzLXByZWZpeCBgY29sLXhzLXB1bGwtYFxuICAgKi9cbiAgeHNQdWxsOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcixcbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgb3JkZXIgb2YgZ3JpZCBjb2x1bW5zIHRvIHRoZSBsZWZ0XG4gICAqXG4gICAqIGZvciBTbWFsbCBkZXZpY2VzIFRhYmxldHNcbiAgICpcbiAgICogY2xhc3MtcHJlZml4IGBjb2wtc20tcHVsbC1gXG4gICAqL1xuICBzbVB1bGw6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBvcmRlciBvZiBncmlkIGNvbHVtbnMgdG8gdGhlIGxlZnRcbiAgICpcbiAgICogZm9yIE1lZGl1bSBkZXZpY2VzIERlc2t0b3BzXG4gICAqXG4gICAqIGNsYXNzLXByZWZpeCBgY29sLW1kLXB1bGwtYFxuICAgKi9cbiAgbWRQdWxsOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcixcbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgb3JkZXIgb2YgZ3JpZCBjb2x1bW5zIHRvIHRoZSBsZWZ0XG4gICAqXG4gICAqIGZvciBMYXJnZSBkZXZpY2VzIERlc2t0b3BzXG4gICAqXG4gICAqIGNsYXNzLXByZWZpeCBgY29sLWxnLXB1bGwtYFxuICAgKi9cbiAgbGdQdWxsOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlclxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6ICdkaXYnXG59O1xuXG52YXIgQ29sID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoQ29sLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBDb2woKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgQ29sKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgQ29sLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIENvbXBvbmVudCA9IF9wcm9wcy5jb21wb25lbnRDbGFzcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY29tcG9uZW50Q2xhc3MnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gW107XG5cbiAgICBfU3R5bGVDb25maWcuREVWSUNFX1NJWkVTLmZvckVhY2goZnVuY3Rpb24gKHNpemUpIHtcbiAgICAgIGZ1bmN0aW9uIHBvcFByb3AocHJvcFN1ZmZpeCwgbW9kaWZpZXIpIHtcbiAgICAgICAgdmFyIHByb3BOYW1lID0gJycgKyBzaXplICsgcHJvcFN1ZmZpeDtcbiAgICAgICAgdmFyIHByb3BWYWx1ZSA9IGVsZW1lbnRQcm9wc1twcm9wTmFtZV07XG5cbiAgICAgICAgaWYgKHByb3BWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKCgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnJyArIHNpemUgKyBtb2RpZmllciArICctJyArIHByb3BWYWx1ZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIGVsZW1lbnRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG5cbiAgICAgIHBvcFByb3AoJycsICcnKTtcbiAgICAgIHBvcFByb3AoJ09mZnNldCcsICctb2Zmc2V0Jyk7XG4gICAgICBwb3BQcm9wKCdQdXNoJywgJy1wdXNoJyk7XG4gICAgICBwb3BQcm9wKCdQdWxsJywgJy1wdWxsJyk7XG5cbiAgICAgIHZhciBoaWRkZW5Qcm9wTmFtZSA9IHNpemUgKyAnSGlkZGVuJztcbiAgICAgIGlmIChlbGVtZW50UHJvcHNbaGlkZGVuUHJvcE5hbWVdKSB7XG4gICAgICAgIGNsYXNzZXMucHVzaCgnaGlkZGVuLScgKyBzaXplKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBlbGVtZW50UHJvcHNbaGlkZGVuUHJvcE5hbWVdO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gQ29sO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuQ29sLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkNvbC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2NvbCcsIENvbCk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfc3R5bGUgPSByZXF1aXJlKCdkb20taGVscGVycy9zdHlsZScpO1xuXG52YXIgX3N0eWxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N0eWxlKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9UcmFuc2l0aW9uID0gcmVxdWlyZSgncmVhY3Qtb3ZlcmxheXMvbGliL1RyYW5zaXRpb24nKTtcblxudmFyIF9UcmFuc2l0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RyYW5zaXRpb24pO1xuXG52YXIgX2NhcGl0YWxpemUgPSByZXF1aXJlKCcuL3V0aWxzL2NhcGl0YWxpemUnKTtcblxudmFyIF9jYXBpdGFsaXplMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NhcGl0YWxpemUpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbiA9IHJlcXVpcmUoJy4vdXRpbHMvY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluZWRGdW5jdGlvbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIE1BUkdJTlMgPSB7XG4gIGhlaWdodDogWydtYXJnaW5Ub3AnLCAnbWFyZ2luQm90dG9tJ10sXG4gIHdpZHRoOiBbJ21hcmdpbkxlZnQnLCAnbWFyZ2luUmlnaHQnXVxufTtcblxuLy8gcmVhZGluZyBhIGRpbWVuc2lvbiBwcm9wIHdpbGwgY2F1c2UgdGhlIGJyb3dzZXIgdG8gcmVjYWxjdWxhdGUsXG4vLyB3aGljaCB3aWxsIGxldCBvdXIgYW5pbWF0aW9ucyB3b3JrXG5mdW5jdGlvbiB0cmlnZ2VyQnJvd3NlclJlZmxvdyhub2RlKSB7XG4gIG5vZGUub2Zmc2V0SGVpZ2h0OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xufVxuXG5mdW5jdGlvbiBnZXREaW1lbnNpb25WYWx1ZShkaW1lbnNpb24sIGVsZW0pIHtcbiAgdmFyIHZhbHVlID0gZWxlbVsnb2Zmc2V0JyArICgwLCBfY2FwaXRhbGl6ZTJbJ2RlZmF1bHQnXSkoZGltZW5zaW9uKV07XG4gIHZhciBtYXJnaW5zID0gTUFSR0lOU1tkaW1lbnNpb25dO1xuXG4gIHJldHVybiB2YWx1ZSArIHBhcnNlSW50KCgwLCBfc3R5bGUyWydkZWZhdWx0J10pKGVsZW0sIG1hcmdpbnNbMF0pLCAxMCkgKyBwYXJzZUludCgoMCwgX3N0eWxlMlsnZGVmYXVsdCddKShlbGVtLCBtYXJnaW5zWzFdKSwgMTApO1xufVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogU2hvdyB0aGUgY29tcG9uZW50OyB0cmlnZ2VycyB0aGUgZXhwYW5kIG9yIGNvbGxhcHNlIGFuaW1hdGlvblxuICAgKi9cbiAgJ2luJzogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBXYWl0IHVudGlsIHRoZSBmaXJzdCBcImVudGVyXCIgdHJhbnNpdGlvbiB0byBtb3VudCB0aGUgY29tcG9uZW50IChhZGQgaXQgdG8gdGhlIERPTSlcbiAgICovXG4gIG1vdW50T25FbnRlcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBVbm1vdW50IHRoZSBjb21wb25lbnQgKHJlbW92ZSBpdCBmcm9tIHRoZSBET00pIHdoZW4gaXQgaXMgY29sbGFwc2VkXG4gICAqL1xuICB1bm1vdW50T25FeGl0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgZXhwYW5kIGFuaW1hdGlvbiB3aGVuIHRoZSBjb21wb25lbnQgbW91bnRzLCBpZiBpdCBpcyBpbml0aWFsbHlcbiAgICogc2hvd25cbiAgICovXG4gIHRyYW5zaXRpb25BcHBlYXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogRHVyYXRpb24gb2YgdGhlIGNvbGxhcHNlIGFuaW1hdGlvbiBpbiBtaWxsaXNlY29uZHMsIHRvIGVuc3VyZSB0aGF0XG4gICAqIGZpbmlzaGluZyBjYWxsYmFja3MgYXJlIGZpcmVkIGV2ZW4gaWYgdGhlIG9yaWdpbmFsIGJyb3dzZXIgdHJhbnNpdGlvbiBlbmRcbiAgICogZXZlbnRzIGFyZSBjYW5jZWxlZFxuICAgKi9cbiAgdGltZW91dDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGV4cGFuZHNcbiAgICovXG4gIG9uRW50ZXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBjb21wb25lbnQgc3RhcnRzIHRvIGV4cGFuZFxuICAgKi9cbiAgb25FbnRlcmluZzogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgZXhwYW5kZWRcbiAgICovXG4gIG9uRW50ZXJlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgY29sbGFwc2VzXG4gICAqL1xuICBvbkV4aXQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBjb21wb25lbnQgc3RhcnRzIHRvIGNvbGxhcHNlXG4gICAqL1xuICBvbkV4aXRpbmc6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBjb21wb25lbnQgaGFzIGNvbGxhcHNlZFxuICAgKi9cbiAgb25FeGl0ZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogVGhlIGRpbWVuc2lvbiB1c2VkIHdoZW4gY29sbGFwc2luZywgb3IgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlXG4gICAqIGRpbWVuc2lvblxuICAgKlxuICAgKiBfTm90ZTogQm9vdHN0cmFwIG9ubHkgcGFydGlhbGx5IHN1cHBvcnRzICd3aWR0aCchXG4gICAqIFlvdSB3aWxsIG5lZWQgdG8gc3VwcGx5IHlvdXIgb3duIENTUyBhbmltYXRpb24gZm9yIHRoZSBgLndpZHRoYCBDU1MgY2xhc3MuX1xuICAgKi9cbiAgZGltZW5zaW9uOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mVHlwZShbX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZihbJ2hlaWdodCcsICd3aWR0aCddKSwgX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jXSksXG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgaGVpZ2h0IG9yIHdpZHRoIG9mIHRoZSBhbmltYXRpbmcgRE9NIG5vZGVcbiAgICpcbiAgICogQWxsb3dzIGZvciBwcm92aWRpbmcgc29tZSBjdXN0b20gbG9naWMgZm9yIGhvdyBtdWNoIHRoZSBDb2xsYXBzZSBjb21wb25lbnRcbiAgICogc2hvdWxkIGFuaW1hdGUgaW4gaXRzIHNwZWNpZmllZCBkaW1lbnNpb24uIENhbGxlZCB3aXRoIHRoZSBjdXJyZW50XG4gICAqIGRpbWVuc2lvbiBwcm9wIHZhbHVlIGFuZCB0aGUgRE9NIG5vZGUuXG4gICAqL1xuICBnZXREaW1lbnNpb25WYWx1ZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuXG4gIC8qKlxuICAgKiBBUklBIHJvbGUgb2YgY29sbGFwc2libGUgZWxlbWVudFxuICAgKi9cbiAgcm9sZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmdcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gICdpbic6IGZhbHNlLFxuICB0aW1lb3V0OiAzMDAsXG4gIG1vdW50T25FbnRlcjogZmFsc2UsXG4gIHVubW91bnRPbkV4aXQ6IGZhbHNlLFxuICB0cmFuc2l0aW9uQXBwZWFyOiBmYWxzZSxcblxuICBkaW1lbnNpb246ICdoZWlnaHQnLFxuICBnZXREaW1lbnNpb25WYWx1ZTogZ2V0RGltZW5zaW9uVmFsdWVcbn07XG5cbnZhciBDb2xsYXBzZSA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKENvbGxhcHNlLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBDb2xsYXBzZShwcm9wcywgY29udGV4dCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIENvbGxhcHNlKTtcblxuICAgIHZhciBfdGhpcyA9ICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICBfdGhpcy5oYW5kbGVFbnRlciA9IF90aGlzLmhhbmRsZUVudGVyLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmhhbmRsZUVudGVyaW5nID0gX3RoaXMuaGFuZGxlRW50ZXJpbmcuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaGFuZGxlRW50ZXJlZCA9IF90aGlzLmhhbmRsZUVudGVyZWQuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaGFuZGxlRXhpdCA9IF90aGlzLmhhbmRsZUV4aXQuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaGFuZGxlRXhpdGluZyA9IF90aGlzLmhhbmRsZUV4aXRpbmcuYmluZChfdGhpcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgLyogLS0gRXhwYW5kaW5nIC0tICovXG5cblxuICBDb2xsYXBzZS5wcm90b3R5cGUuaGFuZGxlRW50ZXIgPSBmdW5jdGlvbiBoYW5kbGVFbnRlcihlbGVtKSB7XG4gICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuX2RpbWVuc2lvbigpO1xuICAgIGVsZW0uc3R5bGVbZGltZW5zaW9uXSA9ICcwJztcbiAgfTtcblxuICBDb2xsYXBzZS5wcm90b3R5cGUuaGFuZGxlRW50ZXJpbmcgPSBmdW5jdGlvbiBoYW5kbGVFbnRlcmluZyhlbGVtKSB7XG4gICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuX2RpbWVuc2lvbigpO1xuICAgIGVsZW0uc3R5bGVbZGltZW5zaW9uXSA9IHRoaXMuX2dldFNjcm9sbERpbWVuc2lvblZhbHVlKGVsZW0sIGRpbWVuc2lvbik7XG4gIH07XG5cbiAgQ29sbGFwc2UucHJvdG90eXBlLmhhbmRsZUVudGVyZWQgPSBmdW5jdGlvbiBoYW5kbGVFbnRlcmVkKGVsZW0pIHtcbiAgICB2YXIgZGltZW5zaW9uID0gdGhpcy5fZGltZW5zaW9uKCk7XG4gICAgZWxlbS5zdHlsZVtkaW1lbnNpb25dID0gbnVsbDtcbiAgfTtcblxuICAvKiAtLSBDb2xsYXBzaW5nIC0tICovXG5cblxuICBDb2xsYXBzZS5wcm90b3R5cGUuaGFuZGxlRXhpdCA9IGZ1bmN0aW9uIGhhbmRsZUV4aXQoZWxlbSkge1xuICAgIHZhciBkaW1lbnNpb24gPSB0aGlzLl9kaW1lbnNpb24oKTtcbiAgICBlbGVtLnN0eWxlW2RpbWVuc2lvbl0gPSB0aGlzLnByb3BzLmdldERpbWVuc2lvblZhbHVlKGRpbWVuc2lvbiwgZWxlbSkgKyAncHgnO1xuICAgIHRyaWdnZXJCcm93c2VyUmVmbG93KGVsZW0pO1xuICB9O1xuXG4gIENvbGxhcHNlLnByb3RvdHlwZS5oYW5kbGVFeGl0aW5nID0gZnVuY3Rpb24gaGFuZGxlRXhpdGluZyhlbGVtKSB7XG4gICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuX2RpbWVuc2lvbigpO1xuICAgIGVsZW0uc3R5bGVbZGltZW5zaW9uXSA9ICcwJztcbiAgfTtcblxuICBDb2xsYXBzZS5wcm90b3R5cGUuX2RpbWVuc2lvbiA9IGZ1bmN0aW9uIF9kaW1lbnNpb24oKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLnByb3BzLmRpbWVuc2lvbiA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMucHJvcHMuZGltZW5zaW9uKCkgOiB0aGlzLnByb3BzLmRpbWVuc2lvbjtcbiAgfTtcblxuICAvLyBmb3IgdGVzdGluZ1xuXG5cbiAgQ29sbGFwc2UucHJvdG90eXBlLl9nZXRTY3JvbGxEaW1lbnNpb25WYWx1ZSA9IGZ1bmN0aW9uIF9nZXRTY3JvbGxEaW1lbnNpb25WYWx1ZShlbGVtLCBkaW1lbnNpb24pIHtcbiAgICByZXR1cm4gZWxlbVsnc2Nyb2xsJyArICgwLCBfY2FwaXRhbGl6ZTJbJ2RlZmF1bHQnXSkoZGltZW5zaW9uKV0gKyAncHgnO1xuICB9O1xuXG4gIENvbGxhcHNlLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIG9uRW50ZXIgPSBfcHJvcHMub25FbnRlcixcbiAgICAgICAgb25FbnRlcmluZyA9IF9wcm9wcy5vbkVudGVyaW5nLFxuICAgICAgICBvbkVudGVyZWQgPSBfcHJvcHMub25FbnRlcmVkLFxuICAgICAgICBvbkV4aXQgPSBfcHJvcHMub25FeGl0LFxuICAgICAgICBvbkV4aXRpbmcgPSBfcHJvcHMub25FeGl0aW5nLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydvbkVudGVyJywgJ29uRW50ZXJpbmcnLCAnb25FbnRlcmVkJywgJ29uRXhpdCcsICdvbkV4aXRpbmcnLCAnY2xhc3NOYW1lJ10pO1xuXG5cbiAgICBkZWxldGUgcHJvcHMuZGltZW5zaW9uO1xuICAgIGRlbGV0ZSBwcm9wcy5nZXREaW1lbnNpb25WYWx1ZTtcblxuICAgIHZhciBoYW5kbGVFbnRlciA9ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKSh0aGlzLmhhbmRsZUVudGVyLCBvbkVudGVyKTtcbiAgICB2YXIgaGFuZGxlRW50ZXJpbmcgPSAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkodGhpcy5oYW5kbGVFbnRlcmluZywgb25FbnRlcmluZyk7XG4gICAgdmFyIGhhbmRsZUVudGVyZWQgPSAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkodGhpcy5oYW5kbGVFbnRlcmVkLCBvbkVudGVyZWQpO1xuICAgIHZhciBoYW5kbGVFeGl0ID0gKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKHRoaXMuaGFuZGxlRXhpdCwgb25FeGl0KTtcbiAgICB2YXIgaGFuZGxlRXhpdGluZyA9ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKSh0aGlzLmhhbmRsZUV4aXRpbmcsIG9uRXhpdGluZyk7XG5cbiAgICB2YXIgY2xhc3NlcyA9IHtcbiAgICAgIHdpZHRoOiB0aGlzLl9kaW1lbnNpb24oKSA9PT0gJ3dpZHRoJ1xuICAgIH07XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX1RyYW5zaXRpb24yWydkZWZhdWx0J10sICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIHByb3BzLCB7XG4gICAgICAnYXJpYS1leHBhbmRlZCc6IHByb3BzLnJvbGUgPyBwcm9wc1snaW4nXSA6IG51bGwsXG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKSxcbiAgICAgIGV4aXRlZENsYXNzTmFtZTogJ2NvbGxhcHNlJyxcbiAgICAgIGV4aXRpbmdDbGFzc05hbWU6ICdjb2xsYXBzaW5nJyxcbiAgICAgIGVudGVyZWRDbGFzc05hbWU6ICdjb2xsYXBzZSBpbicsXG4gICAgICBlbnRlcmluZ0NsYXNzTmFtZTogJ2NvbGxhcHNpbmcnLFxuICAgICAgb25FbnRlcjogaGFuZGxlRW50ZXIsXG4gICAgICBvbkVudGVyaW5nOiBoYW5kbGVFbnRlcmluZyxcbiAgICAgIG9uRW50ZXJlZDogaGFuZGxlRW50ZXJlZCxcbiAgICAgIG9uRXhpdDogaGFuZGxlRXhpdCxcbiAgICAgIG9uRXhpdGluZzogaGFuZGxlRXhpdGluZ1xuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gQ29sbGFwc2U7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5Db2xsYXBzZS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5Db2xsYXBzZS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IENvbGxhcHNlO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX3dhcm5pbmcgPSByZXF1aXJlKCd3YXJuaW5nJyk7XG5cbnZhciBfd2FybmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93YXJuaW5nKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogVXNlcyBgY29udHJvbElkYCBmcm9tIGA8Rm9ybUdyb3VwPmAgaWYgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkLlxuICAgKi9cbiAgaHRtbEZvcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gIHNyT25seTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBzck9ubHk6IGZhbHNlXG59O1xuXG52YXIgY29udGV4dFR5cGVzID0ge1xuICAkYnNfZm9ybUdyb3VwOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9iamVjdFxufTtcblxudmFyIENvbnRyb2xMYWJlbCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKENvbnRyb2xMYWJlbCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gQ29udHJvbExhYmVsKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIENvbnRyb2xMYWJlbCk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIENvbnRyb2xMYWJlbC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBmb3JtR3JvdXAgPSB0aGlzLmNvbnRleHQuJGJzX2Zvcm1Hcm91cDtcbiAgICB2YXIgY29udHJvbElkID0gZm9ybUdyb3VwICYmIGZvcm1Hcm91cC5jb250cm9sSWQ7XG5cbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgX3Byb3BzJGh0bWxGb3IgPSBfcHJvcHMuaHRtbEZvcixcbiAgICAgICAgaHRtbEZvciA9IF9wcm9wcyRodG1sRm9yID09PSB1bmRlZmluZWQgPyBjb250cm9sSWQgOiBfcHJvcHMkaHRtbEZvcixcbiAgICAgICAgc3JPbmx5ID0gX3Byb3BzLnNyT25seSxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnaHRtbEZvcicsICdzck9ubHknLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyAoMCwgX3dhcm5pbmcyWydkZWZhdWx0J10pKGNvbnRyb2xJZCA9PSBudWxsIHx8IGh0bWxGb3IgPT09IGNvbnRyb2xJZCwgJ2Bjb250cm9sSWRgIGlzIGlnbm9yZWQgb24gYDxDb250cm9sTGFiZWw+YCB3aGVuIGBodG1sRm9yYCBpcyBzcGVjaWZpZWQuJykgOiB2b2lkIDA7XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpLCB7XG4gICAgICAnc3Itb25seSc6IHNyT25seVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdsYWJlbCcsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgaHRtbEZvcjogaHRtbEZvcixcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBDb250cm9sTGFiZWw7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5Db250cm9sTGFiZWwucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuQ29udHJvbExhYmVsLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbkNvbnRyb2xMYWJlbC5jb250ZXh0VHlwZXMgPSBjb250ZXh0VHlwZXM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2NvbnRyb2wtbGFiZWwnLCBDb250cm9sTGFiZWwpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX2FjdGl2ZUVsZW1lbnQgPSByZXF1aXJlKCdkb20taGVscGVycy9hY3RpdmVFbGVtZW50Jyk7XG5cbnZhciBfYWN0aXZlRWxlbWVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hY3RpdmVFbGVtZW50KTtcblxudmFyIF9jb250YWlucyA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL3F1ZXJ5L2NvbnRhaW5zJyk7XG5cbnZhciBfY29udGFpbnMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29udGFpbnMpO1xuXG52YXIgX2tleWNvZGUgPSByZXF1aXJlKCdrZXljb2RlJyk7XG5cbnZhciBfa2V5Y29kZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9rZXljb2RlKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9yZWFjdERvbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuXG52YXIgX3JlYWN0RG9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0RG9tKTtcblxudmFyIF9hbGwgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9hbGwnKTtcblxudmFyIF9hbGwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYWxsKTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX2lzUmVxdWlyZWRGb3JBMTF5ID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvaXNSZXF1aXJlZEZvckExMXknKTtcblxudmFyIF9pc1JlcXVpcmVkRm9yQTExeTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pc1JlcXVpcmVkRm9yQTExeSk7XG5cbnZhciBfdW5jb250cm9sbGFibGUgPSByZXF1aXJlKCd1bmNvbnRyb2xsYWJsZScpO1xuXG52YXIgX3VuY29udHJvbGxhYmxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3VuY29udHJvbGxhYmxlKTtcblxudmFyIF93YXJuaW5nID0gcmVxdWlyZSgnd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbnZhciBfQnV0dG9uR3JvdXAgPSByZXF1aXJlKCcuL0J1dHRvbkdyb3VwJyk7XG5cbnZhciBfQnV0dG9uR3JvdXAyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQnV0dG9uR3JvdXApO1xuXG52YXIgX0Ryb3Bkb3duTWVudSA9IHJlcXVpcmUoJy4vRHJvcGRvd25NZW51Jyk7XG5cbnZhciBfRHJvcGRvd25NZW51MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Ryb3Bkb3duTWVudSk7XG5cbnZhciBfRHJvcGRvd25Ub2dnbGUgPSByZXF1aXJlKCcuL0Ryb3Bkb3duVG9nZ2xlJyk7XG5cbnZhciBfRHJvcGRvd25Ub2dnbGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRHJvcGRvd25Ub2dnbGUpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbiA9IHJlcXVpcmUoJy4vdXRpbHMvY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluZWRGdW5jdGlvbik7XG5cbnZhciBfUHJvcFR5cGVzID0gcmVxdWlyZSgnLi91dGlscy9Qcm9wVHlwZXMnKTtcblxudmFyIF9WYWxpZENvbXBvbmVudENoaWxkcmVuID0gcmVxdWlyZSgnLi91dGlscy9WYWxpZENvbXBvbmVudENoaWxkcmVuJyk7XG5cbnZhciBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9WYWxpZENvbXBvbmVudENoaWxkcmVuKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgVE9HR0xFX1JPTEUgPSBfRHJvcGRvd25Ub2dnbGUyWydkZWZhdWx0J10uZGVmYXVsdFByb3BzLmJzUm9sZTtcbnZhciBNRU5VX1JPTEUgPSBfRHJvcGRvd25NZW51MlsnZGVmYXVsdCddLmRlZmF1bHRQcm9wcy5ic1JvbGU7XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBUaGUgbWVudSB3aWxsIG9wZW4gYWJvdmUgdGhlIGRyb3Bkb3duIGJ1dHRvbiwgaW5zdGVhZCBvZiBiZWxvdyBpdC5cbiAgICovXG4gIGRyb3B1cDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBBbiBodG1sIGlkIGF0dHJpYnV0ZSwgbmVjZXNzYXJ5IGZvciBhc3Npc3RpdmUgdGVjaG5vbG9naWVzLCBzdWNoIGFzIHNjcmVlbiByZWFkZXJzLlxuICAgKiBAdHlwZSB7c3RyaW5nfG51bWJlcn1cbiAgICogQHJlcXVpcmVkXG4gICAqL1xuICBpZDogKDAsIF9pc1JlcXVpcmVkRm9yQTExeTJbJ2RlZmF1bHQnXSkoX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZlR5cGUoW19wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLCBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcl0pKSxcblxuICBjb21wb25lbnRDbGFzczogX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddLFxuXG4gIC8qKlxuICAgKiBUaGUgY2hpbGRyZW4gb2YgYSBEcm9wZG93biBtYXkgYmUgYSBgPERyb3Bkb3duLlRvZ2dsZT5gIG9yIGEgYDxEcm9wZG93bi5NZW51PmAuXG4gICAqIEB0eXBlIHtub2RlfVxuICAgKi9cbiAgY2hpbGRyZW46ICgwLCBfYWxsMlsnZGVmYXVsdCddKSgoMCwgX1Byb3BUeXBlcy5yZXF1aXJlZFJvbGVzKShUT0dHTEVfUk9MRSwgTUVOVV9ST0xFKSwgKDAsIF9Qcm9wVHlwZXMuZXhjbHVzaXZlUm9sZXMpKE1FTlVfUk9MRSkpLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCBjb21wb25lbnQgaXMgZGlzYWJsZWQuXG4gICAqL1xuICBkaXNhYmxlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBBbGlnbiB0aGUgbWVudSB0byB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgRHJvcGRvd24gdG9nZ2xlXG4gICAqL1xuICBwdWxsUmlnaHQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIERyb3Bkb3duIGlzIHZpc2libGUuXG4gICAqXG4gICAqIEBjb250cm9sbGFibGUgb25Ub2dnbGVcbiAgICovXG4gIG9wZW46IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBmaXJlZCB3aGVuIHRoZSBEcm9wZG93biB3aXNoZXMgdG8gY2hhbmdlIHZpc2liaWxpdHkuIENhbGxlZCB3aXRoIHRoZSByZXF1ZXN0ZWRcbiAgICogYG9wZW5gIHZhbHVlLCB0aGUgRE9NIGV2ZW50LCBhbmQgdGhlIHNvdXJjZSB0aGF0IGZpcmVkIGl0OiBgJ2NsaWNrJ2AsYCdrZXlkb3duJ2AsYCdyb290Q2xvc2UnYCwgb3IgYCdzZWxlY3QnYC5cbiAgICpcbiAgICogYGBganNcbiAgICogZnVuY3Rpb24oQm9vbGVhbiBpc09wZW4sIE9iamVjdCBldmVudCwgeyBTdHJpbmcgc291cmNlIH0pIHt9XG4gICAqIGBgYFxuICAgKiBAY29udHJvbGxhYmxlIG9wZW5cbiAgICovXG4gIG9uVG9nZ2xlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZmlyZWQgd2hlbiBhIG1lbnUgaXRlbSBpcyBzZWxlY3RlZC5cbiAgICpcbiAgICogYGBganNcbiAgICogKGV2ZW50S2V5OiBhbnksIGV2ZW50OiBPYmplY3QpID0+IGFueVxuICAgKiBgYGBcbiAgICovXG4gIG9uU2VsZWN0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLyoqXG4gICAqIElmIGAnbWVudWl0ZW0nYCwgY2F1c2VzIHRoZSBkcm9wZG93biB0byBiZWhhdmUgbGlrZSBhIG1lbnUgaXRlbSByYXRoZXIgdGhhblxuICAgKiBhIG1lbnUgYnV0dG9uLlxuICAgKi9cbiAgcm9sZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFdoaWNoIGV2ZW50IHdoZW4gZmlyZWQgb3V0c2lkZSB0aGUgY29tcG9uZW50IHdpbGwgY2F1c2UgaXQgdG8gYmUgY2xvc2VkXG4gICAqL1xuICByb290Q2xvc2VFdmVudDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZihbJ2NsaWNrJywgJ21vdXNlZG93biddKSxcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG9uTW91c2VFbnRlcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG9uTW91c2VMZWF2ZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjb21wb25lbnRDbGFzczogX0J1dHRvbkdyb3VwMlsnZGVmYXVsdCddXG59O1xuXG52YXIgRHJvcGRvd24gPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShEcm9wZG93biwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gRHJvcGRvd24ocHJvcHMsIGNvbnRleHQpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBEcm9wZG93bik7XG5cbiAgICB2YXIgX3RoaXMgPSAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgX3RoaXMuaGFuZGxlQ2xpY2sgPSBfdGhpcy5oYW5kbGVDbGljay5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5oYW5kbGVLZXlEb3duID0gX3RoaXMuaGFuZGxlS2V5RG93bi5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5oYW5kbGVDbG9zZSA9IF90aGlzLmhhbmRsZUNsb3NlLmJpbmQoX3RoaXMpO1xuXG4gICAgX3RoaXMuX2ZvY3VzSW5Ecm9wZG93biA9IGZhbHNlO1xuICAgIF90aGlzLmxhc3RPcGVuRXZlbnRUeXBlID0gbnVsbDtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBEcm9wZG93bi5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLmZvY3VzTmV4dE9uT3BlbigpO1xuICB9O1xuXG4gIERyb3Bkb3duLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVwZGF0ZShuZXh0UHJvcHMpIHtcbiAgICBpZiAoIW5leHRQcm9wcy5vcGVuICYmIHRoaXMucHJvcHMub3Blbikge1xuICAgICAgdGhpcy5fZm9jdXNJbkRyb3Bkb3duID0gKDAsIF9jb250YWluczJbJ2RlZmF1bHQnXSkoX3JlYWN0RG9tMlsnZGVmYXVsdCddLmZpbmRET01Ob2RlKHRoaXMubWVudSksICgwLCBfYWN0aXZlRWxlbWVudDJbJ2RlZmF1bHQnXSkoZG9jdW1lbnQpKTtcbiAgICB9XG4gIH07XG5cbiAgRHJvcGRvd24ucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICB2YXIgb3BlbiA9IHRoaXMucHJvcHMub3BlbjtcblxuICAgIHZhciBwcmV2T3BlbiA9IHByZXZQcm9wcy5vcGVuO1xuXG4gICAgaWYgKG9wZW4gJiYgIXByZXZPcGVuKSB7XG4gICAgICB0aGlzLmZvY3VzTmV4dE9uT3BlbigpO1xuICAgIH1cblxuICAgIGlmICghb3BlbiAmJiBwcmV2T3Blbikge1xuICAgICAgLy8gaWYgZm9jdXMgaGFzbid0IGFscmVhZHkgbW92ZWQgZnJvbSB0aGUgbWVudSBsZXRzIHJldHVybiBpdFxuICAgICAgLy8gdG8gdGhlIHRvZ2dsZVxuICAgICAgaWYgKHRoaXMuX2ZvY3VzSW5Ecm9wZG93bikge1xuICAgICAgICB0aGlzLl9mb2N1c0luRHJvcGRvd24gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBEcm9wZG93bi5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkge1xuICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50b2dnbGVPcGVuKGV2ZW50LCB7IHNvdXJjZTogJ2NsaWNrJyB9KTtcbiAgfTtcblxuICBEcm9wZG93bi5wcm90b3R5cGUuaGFuZGxlS2V5RG93biA9IGZ1bmN0aW9uIGhhbmRsZUtleURvd24oZXZlbnQpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgY2FzZSBfa2V5Y29kZTJbJ2RlZmF1bHQnXS5jb2Rlcy5kb3duOlxuICAgICAgICBpZiAoIXRoaXMucHJvcHMub3Blbikge1xuICAgICAgICAgIHRoaXMudG9nZ2xlT3BlbihldmVudCwgeyBzb3VyY2U6ICdrZXlkb3duJyB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1lbnUuZm9jdXNOZXh0KSB7XG4gICAgICAgICAgdGhpcy5tZW51LmZvY3VzTmV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBfa2V5Y29kZTJbJ2RlZmF1bHQnXS5jb2Rlcy5lc2M6XG4gICAgICBjYXNlIF9rZXljb2RlMlsnZGVmYXVsdCddLmNvZGVzLnRhYjpcbiAgICAgICAgdGhpcy5oYW5kbGVDbG9zZShldmVudCwgeyBzb3VyY2U6ICdrZXlkb3duJyB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfTtcblxuICBEcm9wZG93bi5wcm90b3R5cGUudG9nZ2xlT3BlbiA9IGZ1bmN0aW9uIHRvZ2dsZU9wZW4oZXZlbnQsIGV2ZW50RGV0YWlscykge1xuICAgIHZhciBvcGVuID0gIXRoaXMucHJvcHMub3BlbjtcblxuICAgIGlmIChvcGVuKSB7XG4gICAgICB0aGlzLmxhc3RPcGVuRXZlbnRUeXBlID0gZXZlbnREZXRhaWxzLnNvdXJjZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy5vblRvZ2dsZSkge1xuICAgICAgdGhpcy5wcm9wcy5vblRvZ2dsZShvcGVuLCBldmVudCwgZXZlbnREZXRhaWxzKTtcbiAgICB9XG4gIH07XG5cbiAgRHJvcGRvd24ucHJvdG90eXBlLmhhbmRsZUNsb3NlID0gZnVuY3Rpb24gaGFuZGxlQ2xvc2UoZXZlbnQsIGV2ZW50RGV0YWlscykge1xuICAgIGlmICghdGhpcy5wcm9wcy5vcGVuKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50b2dnbGVPcGVuKGV2ZW50LCBldmVudERldGFpbHMpO1xuICB9O1xuXG4gIERyb3Bkb3duLnByb3RvdHlwZS5mb2N1c05leHRPbk9wZW4gPSBmdW5jdGlvbiBmb2N1c05leHRPbk9wZW4oKSB7XG4gICAgdmFyIG1lbnUgPSB0aGlzLm1lbnU7XG5cbiAgICBpZiAoIW1lbnUuZm9jdXNOZXh0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGFzdE9wZW5FdmVudFR5cGUgPT09ICdrZXlkb3duJyB8fCB0aGlzLnByb3BzLnJvbGUgPT09ICdtZW51aXRlbScpIHtcbiAgICAgIG1lbnUuZm9jdXNOZXh0KCk7XG4gICAgfVxuICB9O1xuXG4gIERyb3Bkb3duLnByb3RvdHlwZS5mb2N1cyA9IGZ1bmN0aW9uIGZvY3VzKCkge1xuICAgIHZhciB0b2dnbGUgPSBfcmVhY3REb20yWydkZWZhdWx0J10uZmluZERPTU5vZGUodGhpcy50b2dnbGUpO1xuXG4gICAgaWYgKHRvZ2dsZSAmJiB0b2dnbGUuZm9jdXMpIHtcbiAgICAgIHRvZ2dsZS5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICBEcm9wZG93bi5wcm90b3R5cGUucmVuZGVyVG9nZ2xlID0gZnVuY3Rpb24gcmVuZGVyVG9nZ2xlKGNoaWxkLCBwcm9wcykge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIHJlZiA9IGZ1bmN0aW9uIHJlZihjKSB7XG4gICAgICBfdGhpczIudG9nZ2xlID0gYztcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiBjaGlsZC5yZWYgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gKDAsIF93YXJuaW5nMlsnZGVmYXVsdCddKShmYWxzZSwgJ1N0cmluZyByZWZzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIGA8RHJvcGRvd24uVG9nZ2xlPmAgY29tcG9uZW50cy4gJyArICdUbyBhcHBseSBhIHJlZiB0byB0aGUgY29tcG9uZW50IHVzZSB0aGUgY2FsbGJhY2sgc2lnbmF0dXJlOlxcblxcbiAnICsgJ2h0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvbW9yZS1hYm91dC1yZWZzLmh0bWwjdGhlLXJlZi1jYWxsYmFjay1hdHRyaWJ1dGUnKSA6IHZvaWQgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVmID0gKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKGNoaWxkLnJlZiwgcmVmKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGNoaWxkLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBwcm9wcywge1xuICAgICAgcmVmOiByZWYsXG4gICAgICBic0NsYXNzOiAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkocHJvcHMsICd0b2dnbGUnKSxcbiAgICAgIG9uQ2xpY2s6ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKShjaGlsZC5wcm9wcy5vbkNsaWNrLCB0aGlzLmhhbmRsZUNsaWNrKSxcbiAgICAgIG9uS2V5RG93bjogKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKGNoaWxkLnByb3BzLm9uS2V5RG93biwgdGhpcy5oYW5kbGVLZXlEb3duKVxuICAgIH0pKTtcbiAgfTtcblxuICBEcm9wZG93bi5wcm90b3R5cGUucmVuZGVyTWVudSA9IGZ1bmN0aW9uIHJlbmRlck1lbnUoY2hpbGQsIF9yZWYpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIHZhciBpZCA9IF9yZWYuaWQsXG4gICAgICAgIG9uU2VsZWN0ID0gX3JlZi5vblNlbGVjdCxcbiAgICAgICAgcm9vdENsb3NlRXZlbnQgPSBfcmVmLnJvb3RDbG9zZUV2ZW50LFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9yZWYsIFsnaWQnLCAnb25TZWxlY3QnLCAncm9vdENsb3NlRXZlbnQnXSk7XG5cbiAgICB2YXIgcmVmID0gZnVuY3Rpb24gcmVmKGMpIHtcbiAgICAgIF90aGlzMy5tZW51ID0gYztcbiAgICB9O1xuXG4gICAgaWYgKHR5cGVvZiBjaGlsZC5yZWYgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gKDAsIF93YXJuaW5nMlsnZGVmYXVsdCddKShmYWxzZSwgJ1N0cmluZyByZWZzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIGA8RHJvcGRvd24uTWVudT5gIGNvbXBvbmVudHMuICcgKyAnVG8gYXBwbHkgYSByZWYgdG8gdGhlIGNvbXBvbmVudCB1c2UgdGhlIGNhbGxiYWNrIHNpZ25hdHVyZTpcXG5cXG4gJyArICdodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL21vcmUtYWJvdXQtcmVmcy5odG1sI3RoZS1yZWYtY2FsbGJhY2stYXR0cmlidXRlJykgOiB2b2lkIDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlZiA9ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKShjaGlsZC5yZWYsIHJlZik7XG4gICAgfVxuXG4gICAgcmV0dXJuICgwLCBfcmVhY3QuY2xvbmVFbGVtZW50KShjaGlsZCwgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgcHJvcHMsIHtcbiAgICAgIHJlZjogcmVmLFxuICAgICAgbGFiZWxsZWRCeTogaWQsXG4gICAgICBic0NsYXNzOiAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkocHJvcHMsICdtZW51JyksXG4gICAgICBvbkNsb3NlOiAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkoY2hpbGQucHJvcHMub25DbG9zZSwgdGhpcy5oYW5kbGVDbG9zZSksXG4gICAgICBvblNlbGVjdDogKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKGNoaWxkLnByb3BzLm9uU2VsZWN0LCBvblNlbGVjdCwgZnVuY3Rpb24gKGtleSwgZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMy5oYW5kbGVDbG9zZShldmVudCwgeyBzb3VyY2U6ICdzZWxlY3QnIH0pO1xuICAgICAgfSksXG4gICAgICByb290Q2xvc2VFdmVudDogcm9vdENsb3NlRXZlbnRcbiAgICB9KSk7XG4gIH07XG5cbiAgRHJvcGRvd24ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX2NsYXNzZXMsXG4gICAgICAgIF90aGlzNCA9IHRoaXM7XG5cbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgQ29tcG9uZW50ID0gX3Byb3BzLmNvbXBvbmVudENsYXNzLFxuICAgICAgICBpZCA9IF9wcm9wcy5pZCxcbiAgICAgICAgZHJvcHVwID0gX3Byb3BzLmRyb3B1cCxcbiAgICAgICAgZGlzYWJsZWQgPSBfcHJvcHMuZGlzYWJsZWQsXG4gICAgICAgIHB1bGxSaWdodCA9IF9wcm9wcy5wdWxsUmlnaHQsXG4gICAgICAgIG9wZW4gPSBfcHJvcHMub3BlbixcbiAgICAgICAgb25TZWxlY3QgPSBfcHJvcHMub25TZWxlY3QsXG4gICAgICAgIHJvbGUgPSBfcHJvcHMucm9sZSxcbiAgICAgICAgYnNDbGFzcyA9IF9wcm9wcy5ic0NsYXNzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICByb290Q2xvc2VFdmVudCA9IF9wcm9wcy5yb290Q2xvc2VFdmVudCxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NvbXBvbmVudENsYXNzJywgJ2lkJywgJ2Ryb3B1cCcsICdkaXNhYmxlZCcsICdwdWxsUmlnaHQnLCAnb3BlbicsICdvblNlbGVjdCcsICdyb2xlJywgJ2JzQ2xhc3MnLCAnY2xhc3NOYW1lJywgJ3Jvb3RDbG9zZUV2ZW50JywgJ2NoaWxkcmVuJ10pO1xuXG5cbiAgICBkZWxldGUgcHJvcHMub25Ub2dnbGU7XG5cbiAgICB2YXIgY2xhc3NlcyA9IChfY2xhc3NlcyA9IHt9LCBfY2xhc3Nlc1tic0NsYXNzXSA9IHRydWUsIF9jbGFzc2VzLm9wZW4gPSBvcGVuLCBfY2xhc3Nlcy5kaXNhYmxlZCA9IGRpc2FibGVkLCBfY2xhc3Nlcyk7XG5cbiAgICBpZiAoZHJvcHVwKSB7XG4gICAgICBjbGFzc2VzW2JzQ2xhc3NdID0gZmFsc2U7XG4gICAgICBjbGFzc2VzLmRyb3B1cCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gVGhpcyBpbnRlbnRpb25hbGx5IGZvcndhcmRzIGJzU2l6ZSBhbmQgYnNTdHlsZSAoaWYgc2V0KSB0byB0aGVcbiAgICAvLyB1bmRlcmx5aW5nIGNvbXBvbmVudCwgdG8gYWxsb3cgaXQgdG8gcmVuZGVyIHNpemUgYW5kIHN0eWxlIHZhcmlhbnRzLlxuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgQ29tcG9uZW50LFxuICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgcHJvcHMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICAgIH0pLFxuICAgICAgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yWydkZWZhdWx0J10ubWFwKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgc3dpdGNoIChjaGlsZC5wcm9wcy5ic1JvbGUpIHtcbiAgICAgICAgICBjYXNlIFRPR0dMRV9ST0xFOlxuICAgICAgICAgICAgcmV0dXJuIF90aGlzNC5yZW5kZXJUb2dnbGUoY2hpbGQsIHtcbiAgICAgICAgICAgICAgaWQ6IGlkLCBkaXNhYmxlZDogZGlzYWJsZWQsIG9wZW46IG9wZW4sIHJvbGU6IHJvbGUsIGJzQ2xhc3M6IGJzQ2xhc3NcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGNhc2UgTUVOVV9ST0xFOlxuICAgICAgICAgICAgcmV0dXJuIF90aGlzNC5yZW5kZXJNZW51KGNoaWxkLCB7XG4gICAgICAgICAgICAgIGlkOiBpZCwgb3Blbjogb3BlbiwgcHVsbFJpZ2h0OiBwdWxsUmlnaHQsIGJzQ2xhc3M6IGJzQ2xhc3MsIG9uU2VsZWN0OiBvblNlbGVjdCwgcm9vdENsb3NlRXZlbnQ6IHJvb3RDbG9zZUV2ZW50XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIGNoaWxkO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIERyb3Bkb3duO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuRHJvcGRvd24ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuRHJvcGRvd24uZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG4oMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdkcm9wZG93bicsIERyb3Bkb3duKTtcblxudmFyIFVuY29udHJvbGxlZERyb3Bkb3duID0gKDAsIF91bmNvbnRyb2xsYWJsZTJbJ2RlZmF1bHQnXSkoRHJvcGRvd24sIHsgb3BlbjogJ29uVG9nZ2xlJyB9KTtcblxuVW5jb250cm9sbGVkRHJvcGRvd24uVG9nZ2xlID0gX0Ryb3Bkb3duVG9nZ2xlMlsnZGVmYXVsdCddO1xuVW5jb250cm9sbGVkRHJvcGRvd24uTWVudSA9IF9Ecm9wZG93bk1lbnUyWydkZWZhdWx0J107XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IFVuY29udHJvbGxlZERyb3Bkb3duO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfRHJvcGRvd24gPSByZXF1aXJlKCcuL0Ryb3Bkb3duJyk7XG5cbnZhciBfRHJvcGRvd24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRHJvcGRvd24pO1xuXG52YXIgX3NwbGl0Q29tcG9uZW50UHJvcHMyID0gcmVxdWlyZSgnLi91dGlscy9zcGxpdENvbXBvbmVudFByb3BzJyk7XG5cbnZhciBfc3BsaXRDb21wb25lbnRQcm9wczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zcGxpdENvbXBvbmVudFByb3BzMik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9ICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIF9Ecm9wZG93bjJbJ2RlZmF1bHQnXS5wcm9wVHlwZXMsIHtcblxuICAvLyBUb2dnbGUgcHJvcHMuXG4gIGJzU3R5bGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICBic1NpemU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICB0aXRsZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ub2RlLmlzUmVxdWlyZWQsXG4gIG5vQ2FyZXQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvLyBPdmVycmlkZSBnZW5lcmF0ZWQgZG9jcyBmcm9tIDxEcm9wZG93bj4uXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2hpbGRyZW46IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubm9kZVxufSk7XG5cbnZhciBEcm9wZG93bkJ1dHRvbiA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKERyb3Bkb3duQnV0dG9uLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBEcm9wZG93bkJ1dHRvbigpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBEcm9wZG93bkJ1dHRvbik7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIERyb3Bkb3duQnV0dG9uLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGJzU2l6ZSA9IF9wcm9wcy5ic1NpemUsXG4gICAgICAgIGJzU3R5bGUgPSBfcHJvcHMuYnNTdHlsZSxcbiAgICAgICAgdGl0bGUgPSBfcHJvcHMudGl0bGUsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydic1NpemUnLCAnYnNTdHlsZScsICd0aXRsZScsICdjaGlsZHJlbiddKTtcblxuICAgIHZhciBfc3BsaXRDb21wb25lbnRQcm9wcyA9ICgwLCBfc3BsaXRDb21wb25lbnRQcm9wczNbJ2RlZmF1bHQnXSkocHJvcHMsIF9Ecm9wZG93bjJbJ2RlZmF1bHQnXS5Db250cm9sbGVkQ29tcG9uZW50KSxcbiAgICAgICAgZHJvcGRvd25Qcm9wcyA9IF9zcGxpdENvbXBvbmVudFByb3BzWzBdLFxuICAgICAgICB0b2dnbGVQcm9wcyA9IF9zcGxpdENvbXBvbmVudFByb3BzWzFdO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgX0Ryb3Bkb3duMlsnZGVmYXVsdCddLFxuICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZHJvcGRvd25Qcm9wcywge1xuICAgICAgICBic1NpemU6IGJzU2l6ZSxcbiAgICAgICAgYnNTdHlsZTogYnNTdHlsZVxuICAgICAgfSksXG4gICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgX0Ryb3Bkb3duMlsnZGVmYXVsdCddLlRvZ2dsZSxcbiAgICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgdG9nZ2xlUHJvcHMsIHtcbiAgICAgICAgICBic1NpemU6IGJzU2l6ZSxcbiAgICAgICAgICBic1N0eWxlOiBic1N0eWxlXG4gICAgICAgIH0pLFxuICAgICAgICB0aXRsZVxuICAgICAgKSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICBfRHJvcGRvd24yWydkZWZhdWx0J10uTWVudSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgY2hpbGRyZW5cbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBEcm9wZG93bkJ1dHRvbjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbkRyb3Bkb3duQnV0dG9uLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gRHJvcGRvd25CdXR0b247XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczMgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHM0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczMpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfZnJvbSA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9hcnJheS9mcm9tJyk7XG5cbnZhciBfZnJvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9mcm9tKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9rZXljb2RlID0gcmVxdWlyZSgna2V5Y29kZScpO1xuXG52YXIgX2tleWNvZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfa2V5Y29kZSk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfcmVhY3REb20gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcblxudmFyIF9yZWFjdERvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdERvbSk7XG5cbnZhciBfUm9vdENsb3NlV3JhcHBlciA9IHJlcXVpcmUoJ3JlYWN0LW92ZXJsYXlzL2xpYi9Sb290Q2xvc2VXcmFwcGVyJyk7XG5cbnZhciBfUm9vdENsb3NlV3JhcHBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Sb290Q2xvc2VXcmFwcGVyKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24gPSByZXF1aXJlKCcuL3V0aWxzL2NyZWF0ZUNoYWluZWRGdW5jdGlvbicpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24pO1xuXG52YXIgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4gPSByZXF1aXJlKCcuL3V0aWxzL1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4nKTtcblxudmFyIF9WYWxpZENvbXBvbmVudENoaWxkcmVuMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIG9wZW46IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgcHVsbFJpZ2h0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIG9uQ2xvc2U6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgbGFiZWxsZWRCeTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZlR5cGUoW19wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLCBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcl0pLFxuICBvblNlbGVjdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICByb290Q2xvc2VFdmVudDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZihbJ2NsaWNrJywgJ21vdXNlZG93biddKVxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgYnNSb2xlOiAnbWVudScsXG4gIHB1bGxSaWdodDogZmFsc2Vcbn07XG5cbnZhciBEcm9wZG93bk1lbnUgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShEcm9wZG93bk1lbnUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIERyb3Bkb3duTWVudShwcm9wcykge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIERyb3Bkb3duTWVudSk7XG5cbiAgICB2YXIgX3RoaXMgPSAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcykpO1xuXG4gICAgX3RoaXMuaGFuZGxlUm9vdENsb3NlID0gX3RoaXMuaGFuZGxlUm9vdENsb3NlLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmhhbmRsZUtleURvd24gPSBfdGhpcy5oYW5kbGVLZXlEb3duLmJpbmQoX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIERyb3Bkb3duTWVudS5wcm90b3R5cGUuaGFuZGxlUm9vdENsb3NlID0gZnVuY3Rpb24gaGFuZGxlUm9vdENsb3NlKGV2ZW50KSB7XG4gICAgdGhpcy5wcm9wcy5vbkNsb3NlKGV2ZW50LCB7IHNvdXJjZTogJ3Jvb3RDbG9zZScgfSk7XG4gIH07XG5cbiAgRHJvcGRvd25NZW51LnByb3RvdHlwZS5oYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gaGFuZGxlS2V5RG93bihldmVudCkge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5Q29kZSkge1xuICAgICAgY2FzZSBfa2V5Y29kZTJbJ2RlZmF1bHQnXS5jb2Rlcy5kb3duOlxuICAgICAgICB0aGlzLmZvY3VzTmV4dCgpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgX2tleWNvZGUyWydkZWZhdWx0J10uY29kZXMudXA6XG4gICAgICAgIHRoaXMuZm9jdXNQcmV2aW91cygpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgX2tleWNvZGUyWydkZWZhdWx0J10uY29kZXMuZXNjOlxuICAgICAgY2FzZSBfa2V5Y29kZTJbJ2RlZmF1bHQnXS5jb2Rlcy50YWI6XG4gICAgICAgIHRoaXMucHJvcHMub25DbG9zZShldmVudCwgeyBzb3VyY2U6ICdrZXlkb3duJyB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfTtcblxuICBEcm9wZG93bk1lbnUucHJvdG90eXBlLmdldEl0ZW1zQW5kQWN0aXZlSW5kZXggPSBmdW5jdGlvbiBnZXRJdGVtc0FuZEFjdGl2ZUluZGV4KCkge1xuICAgIHZhciBpdGVtcyA9IHRoaXMuZ2V0Rm9jdXNhYmxlTWVudUl0ZW1zKCk7XG4gICAgdmFyIGFjdGl2ZUluZGV4ID0gaXRlbXMuaW5kZXhPZihkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcblxuICAgIHJldHVybiB7IGl0ZW1zOiBpdGVtcywgYWN0aXZlSW5kZXg6IGFjdGl2ZUluZGV4IH07XG4gIH07XG5cbiAgRHJvcGRvd25NZW51LnByb3RvdHlwZS5nZXRGb2N1c2FibGVNZW51SXRlbXMgPSBmdW5jdGlvbiBnZXRGb2N1c2FibGVNZW51SXRlbXMoKSB7XG4gICAgdmFyIG5vZGUgPSBfcmVhY3REb20yWydkZWZhdWx0J10uZmluZERPTU5vZGUodGhpcyk7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuICgwLCBfZnJvbTJbJ2RlZmF1bHQnXSkobm9kZS5xdWVyeVNlbGVjdG9yQWxsKCdbdGFiSW5kZXg9XCItMVwiXScpKTtcbiAgfTtcblxuICBEcm9wZG93bk1lbnUucHJvdG90eXBlLmZvY3VzTmV4dCA9IGZ1bmN0aW9uIGZvY3VzTmV4dCgpIHtcbiAgICB2YXIgX2dldEl0ZW1zQW5kQWN0aXZlSW5kID0gdGhpcy5nZXRJdGVtc0FuZEFjdGl2ZUluZGV4KCksXG4gICAgICAgIGl0ZW1zID0gX2dldEl0ZW1zQW5kQWN0aXZlSW5kLml0ZW1zLFxuICAgICAgICBhY3RpdmVJbmRleCA9IF9nZXRJdGVtc0FuZEFjdGl2ZUluZC5hY3RpdmVJbmRleDtcblxuICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbmV4dEluZGV4ID0gYWN0aXZlSW5kZXggPT09IGl0ZW1zLmxlbmd0aCAtIDEgPyAwIDogYWN0aXZlSW5kZXggKyAxO1xuICAgIGl0ZW1zW25leHRJbmRleF0uZm9jdXMoKTtcbiAgfTtcblxuICBEcm9wZG93bk1lbnUucHJvdG90eXBlLmZvY3VzUHJldmlvdXMgPSBmdW5jdGlvbiBmb2N1c1ByZXZpb3VzKCkge1xuICAgIHZhciBfZ2V0SXRlbXNBbmRBY3RpdmVJbmQyID0gdGhpcy5nZXRJdGVtc0FuZEFjdGl2ZUluZGV4KCksXG4gICAgICAgIGl0ZW1zID0gX2dldEl0ZW1zQW5kQWN0aXZlSW5kMi5pdGVtcyxcbiAgICAgICAgYWN0aXZlSW5kZXggPSBfZ2V0SXRlbXNBbmRBY3RpdmVJbmQyLmFjdGl2ZUluZGV4O1xuXG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcmV2SW5kZXggPSBhY3RpdmVJbmRleCA9PT0gMCA/IGl0ZW1zLmxlbmd0aCAtIDEgOiBhY3RpdmVJbmRleCAtIDE7XG4gICAgaXRlbXNbcHJldkluZGV4XS5mb2N1cygpO1xuICB9O1xuXG4gIERyb3Bkb3duTWVudS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfZXh0ZW5kczIsXG4gICAgICAgIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgb3BlbiA9IF9wcm9wcy5vcGVuLFxuICAgICAgICBwdWxsUmlnaHQgPSBfcHJvcHMucHVsbFJpZ2h0LFxuICAgICAgICBsYWJlbGxlZEJ5ID0gX3Byb3BzLmxhYmVsbGVkQnksXG4gICAgICAgIG9uU2VsZWN0ID0gX3Byb3BzLm9uU2VsZWN0LFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICByb290Q2xvc2VFdmVudCA9IF9wcm9wcy5yb290Q2xvc2VFdmVudCxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ29wZW4nLCAncHVsbFJpZ2h0JywgJ2xhYmVsbGVkQnknLCAnb25TZWxlY3QnLCAnY2xhc3NOYW1lJywgJ3Jvb3RDbG9zZUV2ZW50JywgJ2NoaWxkcmVuJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHNBbmRPbWl0ID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHNBbmRPbWl0KShwcm9wcywgWydvbkNsb3NlJ10pLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc0FuZE9taXRbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNBbmRPbWl0WzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKSwgKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdyaWdodCcpXSA9IHB1bGxSaWdodCwgX2V4dGVuZHMyKSk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBfUm9vdENsb3NlV3JhcHBlcjJbJ2RlZmF1bHQnXSxcbiAgICAgIHtcbiAgICAgICAgZGlzYWJsZWQ6ICFvcGVuLFxuICAgICAgICBvblJvb3RDbG9zZTogdGhpcy5oYW5kbGVSb290Q2xvc2UsXG4gICAgICAgIGV2ZW50OiByb290Q2xvc2VFdmVudFxuICAgICAgfSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAndWwnLFxuICAgICAgICAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgICAgICByb2xlOiAnbWVudScsXG4gICAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcyksXG4gICAgICAgICAgJ2FyaWEtbGFiZWxsZWRieSc6IGxhYmVsbGVkQnlcbiAgICAgICAgfSksXG4gICAgICAgIF9WYWxpZENvbXBvbmVudENoaWxkcmVuMlsnZGVmYXVsdCddLm1hcChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jbG9uZUVsZW1lbnQoY2hpbGQsIHtcbiAgICAgICAgICAgIG9uS2V5RG93bjogKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKGNoaWxkLnByb3BzLm9uS2V5RG93biwgX3RoaXMyLmhhbmRsZUtleURvd24pLFxuICAgICAgICAgICAgb25TZWxlY3Q6ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKShjaGlsZC5wcm9wcy5vblNlbGVjdCwgb25TZWxlY3QpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gRHJvcGRvd25NZW51O1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuRHJvcGRvd25NZW51LnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkRyb3Bkb3duTWVudS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2Ryb3Bkb3duLW1lbnUnLCBEcm9wZG93bk1lbnUpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX0J1dHRvbiA9IHJlcXVpcmUoJy4vQnV0dG9uJyk7XG5cbnZhciBfQnV0dG9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0J1dHRvbik7XG5cbnZhciBfU2FmZUFuY2hvciA9IHJlcXVpcmUoJy4vU2FmZUFuY2hvcicpO1xuXG52YXIgX1NhZmVBbmNob3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU2FmZUFuY2hvcik7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgbm9DYXJldDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBvcGVuOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIHRpdGxlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcbiAgdXNlQW5jaG9yOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2xcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIG9wZW46IGZhbHNlLFxuICB1c2VBbmNob3I6IGZhbHNlLFxuICBic1JvbGU6ICd0b2dnbGUnXG59O1xuXG52YXIgRHJvcGRvd25Ub2dnbGUgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShEcm9wZG93blRvZ2dsZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gRHJvcGRvd25Ub2dnbGUoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgRHJvcGRvd25Ub2dnbGUpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBEcm9wZG93blRvZ2dsZS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBub0NhcmV0ID0gX3Byb3BzLm5vQ2FyZXQsXG4gICAgICAgIG9wZW4gPSBfcHJvcHMub3BlbixcbiAgICAgICAgdXNlQW5jaG9yID0gX3Byb3BzLnVzZUFuY2hvcixcbiAgICAgICAgYnNDbGFzcyA9IF9wcm9wcy5ic0NsYXNzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnbm9DYXJldCcsICdvcGVuJywgJ3VzZUFuY2hvcicsICdic0NsYXNzJywgJ2NsYXNzTmFtZScsICdjaGlsZHJlbiddKTtcblxuXG4gICAgZGVsZXRlIHByb3BzLmJzUm9sZTtcblxuICAgIHZhciBDb21wb25lbnQgPSB1c2VBbmNob3IgPyBfU2FmZUFuY2hvcjJbJ2RlZmF1bHQnXSA6IF9CdXR0b24yWydkZWZhdWx0J107XG4gICAgdmFyIHVzZUNhcmV0ID0gIW5vQ2FyZXQ7XG5cbiAgICAvLyBUaGlzIGludGVudGlvbmFsbHkgZm9yd2FyZHMgYnNTaXplIGFuZCBic1N0eWxlIChpZiBzZXQpIHRvIHRoZVxuICAgIC8vIHVuZGVybHlpbmcgY29tcG9uZW50LCB0byBhbGxvdyBpdCB0byByZW5kZXIgc2l6ZSBhbmQgc3R5bGUgdmFyaWFudHMuXG5cbiAgICAvLyBGSVhNRTogU2hvdWxkIHRoaXMgcmVhbGx5IGZhbGwgYmFjayB0byBgdGl0bGVgIGFzIGNoaWxkcmVuP1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgQ29tcG9uZW50LFxuICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgcHJvcHMsIHtcbiAgICAgICAgcm9sZTogJ2J1dHRvbicsXG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGJzQ2xhc3MpLFxuICAgICAgICAnYXJpYS1oYXNwb3B1cCc6IHRydWUsXG4gICAgICAgICdhcmlhLWV4cGFuZGVkJzogb3BlblxuICAgICAgfSksXG4gICAgICBjaGlsZHJlbiB8fCBwcm9wcy50aXRsZSxcbiAgICAgIHVzZUNhcmV0ICYmICcgJyxcbiAgICAgIHVzZUNhcmV0ICYmIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdzcGFuJywgeyBjbGFzc05hbWU6ICdjYXJldCcgfSlcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBEcm9wZG93blRvZ2dsZTtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbkRyb3Bkb3duVG9nZ2xlLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkRyb3Bkb3duVG9nZ2xlLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnZHJvcGRvd24tdG9nZ2xlJywgRHJvcGRvd25Ub2dnbGUpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9UcmFuc2l0aW9uID0gcmVxdWlyZSgncmVhY3Qtb3ZlcmxheXMvbGliL1RyYW5zaXRpb24nKTtcblxudmFyIF9UcmFuc2l0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RyYW5zaXRpb24pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBTaG93IHRoZSBjb21wb25lbnQ7IHRyaWdnZXJzIHRoZSBmYWRlIGluIG9yIGZhZGUgb3V0IGFuaW1hdGlvblxuICAgKi9cbiAgJ2luJzogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBXYWl0IHVudGlsIHRoZSBmaXJzdCBcImVudGVyXCIgdHJhbnNpdGlvbiB0byBtb3VudCB0aGUgY29tcG9uZW50IChhZGQgaXQgdG8gdGhlIERPTSlcbiAgICovXG4gIG1vdW50T25FbnRlcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBVbm1vdW50IHRoZSBjb21wb25lbnQgKHJlbW92ZSBpdCBmcm9tIHRoZSBET00pIHdoZW4gaXQgaXMgZmFkZWQgb3V0XG4gICAqL1xuICB1bm1vdW50T25FeGl0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIFJ1biB0aGUgZmFkZSBpbiBhbmltYXRpb24gd2hlbiB0aGUgY29tcG9uZW50IG1vdW50cywgaWYgaXQgaXMgaW5pdGlhbGx5XG4gICAqIHNob3duXG4gICAqL1xuICB0cmFuc2l0aW9uQXBwZWFyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIER1cmF0aW9uIG9mIHRoZSBmYWRlIGFuaW1hdGlvbiBpbiBtaWxsaXNlY29uZHMsIHRvIGVuc3VyZSB0aGF0IGZpbmlzaGluZ1xuICAgKiBjYWxsYmFja3MgYXJlIGZpcmVkIGV2ZW4gaWYgdGhlIG9yaWdpbmFsIGJyb3dzZXIgdHJhbnNpdGlvbiBlbmQgZXZlbnRzIGFyZVxuICAgKiBjYW5jZWxlZFxuICAgKi9cbiAgdGltZW91dDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGZhZGVzIGluXG4gICAqL1xuICBvbkVudGVyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgY29tcG9uZW50IHN0YXJ0cyB0byBmYWRlIGluXG4gICAqL1xuICBvbkVudGVyaW5nOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgaGFzIGNvbXBvbmVudCBmYWRlZCBpblxuICAgKi9cbiAgb25FbnRlcmVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBmYWRlcyBvdXRcbiAgICovXG4gIG9uRXhpdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIGNvbXBvbmVudCBzdGFydHMgdG8gZmFkZSBvdXRcbiAgICovXG4gIG9uRXhpdGluZzogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgZmFkZWQgb3V0XG4gICAqL1xuICBvbkV4aXRlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICAnaW4nOiBmYWxzZSxcbiAgdGltZW91dDogMzAwLFxuICBtb3VudE9uRW50ZXI6IGZhbHNlLFxuICB1bm1vdW50T25FeGl0OiBmYWxzZSxcbiAgdHJhbnNpdGlvbkFwcGVhcjogZmFsc2Vcbn07XG5cbnZhciBGYWRlID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoRmFkZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gRmFkZSgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBGYWRlKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgRmFkZS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfVHJhbnNpdGlvbjJbJ2RlZmF1bHQnXSwgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgdGhpcy5wcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKHRoaXMucHJvcHMuY2xhc3NOYW1lLCAnZmFkZScpLFxuICAgICAgZW50ZXJlZENsYXNzTmFtZTogJ2luJyxcbiAgICAgIGVudGVyaW5nQ2xhc3NOYW1lOiAnaW4nXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBGYWRlO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuRmFkZS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5GYWRlLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gRmFkZTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGhvcml6b250YWw6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgaW5saW5lOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIGNvbXBvbmVudENsYXNzOiBfZWxlbWVudFR5cGUyWydkZWZhdWx0J11cbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGhvcml6b250YWw6IGZhbHNlLFxuICBpbmxpbmU6IGZhbHNlLFxuICBjb21wb25lbnRDbGFzczogJ2Zvcm0nXG59O1xuXG52YXIgRm9ybSA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKEZvcm0sIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEZvcm0oKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgRm9ybSk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIEZvcm0ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgaG9yaXpvbnRhbCA9IF9wcm9wcy5ob3Jpem9udGFsLFxuICAgICAgICBpbmxpbmUgPSBfcHJvcHMuaW5saW5lLFxuICAgICAgICBDb21wb25lbnQgPSBfcHJvcHMuY29tcG9uZW50Q2xhc3MsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2hvcml6b250YWwnLCAnaW5saW5lJywgJ2NvbXBvbmVudENsYXNzJywgJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9IFtdO1xuICAgIGlmIChob3Jpem9udGFsKSB7XG4gICAgICBjbGFzc2VzLnB1c2goKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdob3Jpem9udGFsJykpO1xuICAgIH1cbiAgICBpZiAoaW5saW5lKSB7XG4gICAgICBjbGFzc2VzLnB1c2goKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdpbmxpbmUnKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gRm9ybTtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbkZvcm0ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuRm9ybS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2Zvcm0nLCBGb3JtKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX3dhcm5pbmcgPSByZXF1aXJlKCd3YXJuaW5nJyk7XG5cbnZhciBfd2FybmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93YXJuaW5nKTtcblxudmFyIF9Gb3JtQ29udHJvbEZlZWRiYWNrID0gcmVxdWlyZSgnLi9Gb3JtQ29udHJvbEZlZWRiYWNrJyk7XG5cbnZhciBfRm9ybUNvbnRyb2xGZWVkYmFjazIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Gb3JtQ29udHJvbEZlZWRiYWNrKTtcblxudmFyIF9Gb3JtQ29udHJvbFN0YXRpYyA9IHJlcXVpcmUoJy4vRm9ybUNvbnRyb2xTdGF0aWMnKTtcblxudmFyIF9Gb3JtQ29udHJvbFN0YXRpYzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Gb3JtQ29udHJvbFN0YXRpYyk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbnZhciBfU3R5bGVDb25maWcgPSByZXF1aXJlKCcuL3V0aWxzL1N0eWxlQ29uZmlnJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6IF9lbGVtZW50VHlwZTJbJ2RlZmF1bHQnXSxcbiAgLyoqXG4gICAqIE9ubHkgcmVsZXZhbnQgaWYgYGNvbXBvbmVudENsYXNzYCBpcyBgJ2lucHV0J2AuXG4gICAqL1xuICB0eXBlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcbiAgLyoqXG4gICAqIFVzZXMgYGNvbnRyb2xJZGAgZnJvbSBgPEZvcm1Hcm91cD5gIGlmIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZC5cbiAgICovXG4gIGlkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcbiAgLyoqXG4gICAqIEF0dGFjaGVzIGEgcmVmIHRvIHRoZSBgPGlucHV0PmAgZWxlbWVudC4gT25seSBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgaGVyZS5cbiAgICpcbiAgICogYGBganNcbiAgICogPEZvcm1Db250cm9sIGlucHV0UmVmPXtyZWYgPT4geyB0aGlzLmlucHV0ID0gcmVmOyB9fSAvPlxuICAgKiBgYGBcbiAgICovXG4gIGlucHV0UmVmOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmNcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiAnaW5wdXQnXG59O1xuXG52YXIgY29udGV4dFR5cGVzID0ge1xuICAkYnNfZm9ybUdyb3VwOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9iamVjdFxufTtcblxudmFyIEZvcm1Db250cm9sID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoRm9ybUNvbnRyb2wsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEZvcm1Db250cm9sKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIEZvcm1Db250cm9sKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgRm9ybUNvbnRyb2wucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgZm9ybUdyb3VwID0gdGhpcy5jb250ZXh0LiRic19mb3JtR3JvdXA7XG4gICAgdmFyIGNvbnRyb2xJZCA9IGZvcm1Hcm91cCAmJiBmb3JtR3JvdXAuY29udHJvbElkO1xuXG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIENvbXBvbmVudCA9IF9wcm9wcy5jb21wb25lbnRDbGFzcyxcbiAgICAgICAgdHlwZSA9IF9wcm9wcy50eXBlLFxuICAgICAgICBfcHJvcHMkaWQgPSBfcHJvcHMuaWQsXG4gICAgICAgIGlkID0gX3Byb3BzJGlkID09PSB1bmRlZmluZWQgPyBjb250cm9sSWQgOiBfcHJvcHMkaWQsXG4gICAgICAgIGlucHV0UmVmID0gX3Byb3BzLmlucHV0UmVmLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBic1NpemUgPSBfcHJvcHMuYnNTaXplLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjb21wb25lbnRDbGFzcycsICd0eXBlJywgJ2lkJywgJ2lucHV0UmVmJywgJ2NsYXNzTmFtZScsICdic1NpemUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/ICgwLCBfd2FybmluZzJbJ2RlZmF1bHQnXSkoY29udHJvbElkID09IG51bGwgfHwgaWQgPT09IGNvbnRyb2xJZCwgJ2Bjb250cm9sSWRgIGlzIGlnbm9yZWQgb24gYDxGb3JtQ29udHJvbD5gIHdoZW4gYGlkYCBpcyBzcGVjaWZpZWQuJykgOiB2b2lkIDA7XG5cbiAgICAvLyBpbnB1dFt0eXBlPVwiZmlsZVwiXSBzaG91bGQgbm90IGhhdmUgLmZvcm0tY29udHJvbC5cbiAgICB2YXIgY2xhc3NlcyA9IHZvaWQgMDtcbiAgICBpZiAodHlwZSAhPT0gJ2ZpbGUnKSB7XG4gICAgICBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG4gICAgfVxuXG4gICAgLy8gSWYgdXNlciBwcm92aWRlcyBhIHNpemUsIG1ha2Ugc3VyZSB0byBhcHBlbmQgaXQgdG8gY2xhc3NlcyBhcyBpbnB1dC1cbiAgICAvLyBlLmcuIGlmIGJzU2l6ZSBpcyBzbWFsbCwgaXQgd2lsbCBhcHBlbmQgaW5wdXQtc21cbiAgICBpZiAoYnNTaXplKSB7XG4gICAgICB2YXIgc2l6ZSA9IF9TdHlsZUNvbmZpZy5TSVpFX01BUFtic1NpemVdIHx8IGJzU2l6ZTtcbiAgICAgIGNsYXNzZXNbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKHsgYnNDbGFzczogJ2lucHV0JyB9LCBzaXplKV0gPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChDb21wb25lbnQsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIGlkOiBpZCxcbiAgICAgIHJlZjogaW5wdXRSZWYsXG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gRm9ybUNvbnRyb2w7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5Gb3JtQ29udHJvbC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5Gb3JtQ29udHJvbC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5Gb3JtQ29udHJvbC5jb250ZXh0VHlwZXMgPSBjb250ZXh0VHlwZXM7XG5cbkZvcm1Db250cm9sLkZlZWRiYWNrID0gX0Zvcm1Db250cm9sRmVlZGJhY2syWydkZWZhdWx0J107XG5Gb3JtQ29udHJvbC5TdGF0aWMgPSBfRm9ybUNvbnRyb2xTdGF0aWMyWydkZWZhdWx0J107XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2Zvcm0tY29udHJvbCcsICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNTaXplcykoW19TdHlsZUNvbmZpZy5TaXplLlNNQUxMLCBfU3R5bGVDb25maWcuU2l6ZS5MQVJHRV0sIEZvcm1Db250cm9sKSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfR2x5cGhpY29uID0gcmVxdWlyZSgnLi9HbHlwaGljb24nKTtcblxudmFyIF9HbHlwaGljb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfR2x5cGhpY29uKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBic1JvbGU6ICdmZWVkYmFjaydcbn07XG5cbnZhciBjb250ZXh0VHlwZXMgPSB7XG4gICRic19mb3JtR3JvdXA6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub2JqZWN0XG59O1xuXG52YXIgRm9ybUNvbnRyb2xGZWVkYmFjayA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKEZvcm1Db250cm9sRmVlZGJhY2ssIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEZvcm1Db250cm9sRmVlZGJhY2soKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgRm9ybUNvbnRyb2xGZWVkYmFjayk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIEZvcm1Db250cm9sRmVlZGJhY2sucHJvdG90eXBlLmdldEdseXBoID0gZnVuY3Rpb24gZ2V0R2x5cGgodmFsaWRhdGlvblN0YXRlKSB7XG4gICAgc3dpdGNoICh2YWxpZGF0aW9uU3RhdGUpIHtcbiAgICAgIGNhc2UgJ3N1Y2Nlc3MnOlxuICAgICAgICByZXR1cm4gJ29rJztcbiAgICAgIGNhc2UgJ3dhcm5pbmcnOlxuICAgICAgICByZXR1cm4gJ3dhcm5pbmctc2lnbic7XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgIHJldHVybiAncmVtb3ZlJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICBGb3JtQ29udHJvbEZlZWRiYWNrLnByb3RvdHlwZS5yZW5kZXJEZWZhdWx0RmVlZGJhY2sgPSBmdW5jdGlvbiByZW5kZXJEZWZhdWx0RmVlZGJhY2soZm9ybUdyb3VwLCBjbGFzc05hbWUsIGNsYXNzZXMsIGVsZW1lbnRQcm9wcykge1xuICAgIHZhciBnbHlwaCA9IHRoaXMuZ2V0R2x5cGgoZm9ybUdyb3VwICYmIGZvcm1Hcm91cC52YWxpZGF0aW9uU3RhdGUpO1xuICAgIGlmICghZ2x5cGgpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfR2x5cGhpY29uMlsnZGVmYXVsdCddLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGdseXBoOiBnbHlwaCxcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIEZvcm1Db250cm9sRmVlZGJhY2sucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NsYXNzTmFtZScsICdjaGlsZHJlbiddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgaWYgKCFjaGlsZHJlbikge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRGVmYXVsdEZlZWRiYWNrKHRoaXMuY29udGV4dC4kYnNfZm9ybUdyb3VwLCBjbGFzc05hbWUsIGNsYXNzZXMsIGVsZW1lbnRQcm9wcyk7XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkID0gX3JlYWN0MlsnZGVmYXVsdCddLkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pO1xuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY2xvbmVFbGVtZW50KGNoaWxkLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjaGlsZC5wcm9wcy5jbGFzc05hbWUsIGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIEZvcm1Db250cm9sRmVlZGJhY2s7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5Gb3JtQ29udHJvbEZlZWRiYWNrLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbkZvcm1Db250cm9sRmVlZGJhY2suY29udGV4dFR5cGVzID0gY29udGV4dFR5cGVzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdmb3JtLWNvbnRyb2wtZmVlZGJhY2snLCBGb3JtQ29udHJvbEZlZWRiYWNrKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX2VsZW1lbnRUeXBlID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvZWxlbWVudFR5cGUnKTtcblxudmFyIF9lbGVtZW50VHlwZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbGVtZW50VHlwZSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6IF9lbGVtZW50VHlwZTJbJ2RlZmF1bHQnXVxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6ICdwJ1xufTtcblxudmFyIEZvcm1Db250cm9sU3RhdGljID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoRm9ybUNvbnRyb2xTdGF0aWMsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEZvcm1Db250cm9sU3RhdGljKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIEZvcm1Db250cm9sU3RhdGljKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgRm9ybUNvbnRyb2xTdGF0aWMucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgQ29tcG9uZW50ID0gX3Byb3BzLmNvbXBvbmVudENsYXNzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjb21wb25lbnRDbGFzcycsICdjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChDb21wb25lbnQsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIEZvcm1Db250cm9sU3RhdGljO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuRm9ybUNvbnRyb2xTdGF0aWMucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuRm9ybUNvbnRyb2xTdGF0aWMuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdmb3JtLWNvbnRyb2wtc3RhdGljJywgRm9ybUNvbnRyb2xTdGF0aWMpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG52YXIgX1N0eWxlQ29uZmlnID0gcmVxdWlyZSgnLi91dGlscy9TdHlsZUNvbmZpZycpO1xuXG52YXIgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4gPSByZXF1aXJlKCcuL3V0aWxzL1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4nKTtcblxudmFyIF9WYWxpZENvbXBvbmVudENoaWxkcmVuMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBTZXRzIGBpZGAgb24gYDxGb3JtQ29udHJvbD5gIGFuZCBgaHRtbEZvcmAgb24gYDxGb3JtR3JvdXAuTGFiZWw+YC5cbiAgICovXG4gIGNvbnRyb2xJZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gIHZhbGlkYXRpb25TdGF0ZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZihbJ3N1Y2Nlc3MnLCAnd2FybmluZycsICdlcnJvcicsIG51bGxdKVxufTtcblxudmFyIGNoaWxkQ29udGV4dFR5cGVzID0ge1xuICAkYnNfZm9ybUdyb3VwOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9iamVjdC5pc1JlcXVpcmVkXG59O1xuXG52YXIgRm9ybUdyb3VwID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoRm9ybUdyb3VwLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBGb3JtR3JvdXAoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgRm9ybUdyb3VwKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgRm9ybUdyb3VwLnByb3RvdHlwZS5nZXRDaGlsZENvbnRleHQgPSBmdW5jdGlvbiBnZXRDaGlsZENvbnRleHQoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNvbnRyb2xJZCA9IF9wcm9wcy5jb250cm9sSWQsXG4gICAgICAgIHZhbGlkYXRpb25TdGF0ZSA9IF9wcm9wcy52YWxpZGF0aW9uU3RhdGU7XG5cblxuICAgIHJldHVybiB7XG4gICAgICAkYnNfZm9ybUdyb3VwOiB7XG4gICAgICAgIGNvbnRyb2xJZDogY29udHJvbElkLFxuICAgICAgICB2YWxpZGF0aW9uU3RhdGU6IHZhbGlkYXRpb25TdGF0ZVxuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgRm9ybUdyb3VwLnByb3RvdHlwZS5oYXNGZWVkYmFjayA9IGZ1bmN0aW9uIGhhc0ZlZWRiYWNrKGNoaWxkcmVuKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICByZXR1cm4gX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yWydkZWZhdWx0J10uc29tZShjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICByZXR1cm4gY2hpbGQucHJvcHMuYnNSb2xlID09PSAnZmVlZGJhY2snIHx8IGNoaWxkLnByb3BzLmNoaWxkcmVuICYmIF90aGlzMi5oYXNGZWVkYmFjayhjaGlsZC5wcm9wcy5jaGlsZHJlbik7XG4gICAgfSk7XG4gIH07XG5cbiAgRm9ybUdyb3VwLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICB2YWxpZGF0aW9uU3RhdGUgPSBfcHJvcHMyLnZhbGlkYXRpb25TdGF0ZSxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzMi5jbGFzc05hbWUsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzMi5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMyLCBbJ3ZhbGlkYXRpb25TdGF0ZScsICdjbGFzc05hbWUnLCAnY2hpbGRyZW4nXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wc0FuZE9taXQgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wc0FuZE9taXQpKHByb3BzLCBbJ2NvbnRyb2xJZCddKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNBbmRPbWl0WzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzQW5kT21pdFsxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyksIHtcbiAgICAgICdoYXMtZmVlZGJhY2snOiB0aGlzLmhhc0ZlZWRiYWNrKGNoaWxkcmVuKVxuICAgIH0pO1xuICAgIGlmICh2YWxpZGF0aW9uU3RhdGUpIHtcbiAgICAgIGNsYXNzZXNbJ2hhcy0nICsgdmFsaWRhdGlvblN0YXRlXSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2RpdicsXG4gICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICAgIH0pLFxuICAgICAgY2hpbGRyZW5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBGb3JtR3JvdXA7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5Gb3JtR3JvdXAucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuRm9ybUdyb3VwLmNoaWxkQ29udGV4dFR5cGVzID0gY2hpbGRDb250ZXh0VHlwZXM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2Zvcm0tZ3JvdXAnLCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzU2l6ZXMpKFtfU3R5bGVDb25maWcuU2l6ZS5MQVJHRSwgX1N0eWxlQ29uZmlnLlNpemUuU01BTExdLCBGb3JtR3JvdXApKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMyA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQW4gaWNvbiBuYW1lIHdpdGhvdXQgXCJnbHlwaGljb24tXCIgcHJlZml4LiBTZWUgZS5nLiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbS9jb21wb25lbnRzLyNnbHlwaGljb25zXG4gICAqL1xuICBnbHlwaDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcuaXNSZXF1aXJlZFxufTtcblxudmFyIEdseXBoaWNvbiA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKEdseXBoaWNvbiwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gR2x5cGhpY29uKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIEdseXBoaWNvbik7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIEdseXBoaWNvbi5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgZ2x5cGggPSBfcHJvcHMuZ2x5cGgsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2dseXBoJywgJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoe30sICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpLCAoX2V4dGVuZHMyID0ge30sIF9leHRlbmRzMlsoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgZ2x5cGgpXSA9IHRydWUsIF9leHRlbmRzMikpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdzcGFuJywgKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gR2x5cGhpY29uO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuR2x5cGhpY29uLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnZ2x5cGhpY29uJywgR2x5cGhpY29uKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBUdXJuIGFueSBmaXhlZC13aWR0aCBncmlkIGxheW91dCBpbnRvIGEgZnVsbC13aWR0aCBsYXlvdXQgYnkgdGhpcyBwcm9wZXJ0eS5cbiAgICpcbiAgICogQWRkcyBgY29udGFpbmVyLWZsdWlkYCBjbGFzcy5cbiAgICovXG4gIGZsdWlkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIC8qKlxuICAgKiBZb3UgY2FuIHVzZSBhIGN1c3RvbSBlbGVtZW50IGZvciB0aGlzIGNvbXBvbmVudFxuICAgKi9cbiAgY29tcG9uZW50Q2xhc3M6IF9lbGVtZW50VHlwZTJbJ2RlZmF1bHQnXVxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6ICdkaXYnLFxuICBmbHVpZDogZmFsc2Vcbn07XG5cbnZhciBHcmlkID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoR3JpZCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gR3JpZCgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBHcmlkKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgR3JpZC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBmbHVpZCA9IF9wcm9wcy5mbHVpZCxcbiAgICAgICAgQ29tcG9uZW50ID0gX3Byb3BzLmNvbXBvbmVudENsYXNzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydmbHVpZCcsICdjb21wb25lbnRDbGFzcycsICdjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgZmx1aWQgJiYgJ2ZsdWlkJyk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBHcmlkO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuR3JpZC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5HcmlkLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnY29udGFpbmVyJywgR3JpZCk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgSGVscEJsb2NrID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoSGVscEJsb2NrLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBIZWxwQmxvY2soKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgSGVscEJsb2NrKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgSGVscEJsb2NrLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdzcGFuJywgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gSGVscEJsb2NrO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnaGVscC1ibG9jaycsIEhlbHBCbG9jayk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIFNldHMgaW1hZ2UgYXMgcmVzcG9uc2l2ZSBpbWFnZVxuICAgKi9cbiAgcmVzcG9uc2l2ZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBTZXRzIGltYWdlIHNoYXBlIGFzIHJvdW5kZWRcbiAgICovXG4gIHJvdW5kZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogU2V0cyBpbWFnZSBzaGFwZSBhcyBjaXJjbGVcbiAgICovXG4gIGNpcmNsZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBTZXRzIGltYWdlIHNoYXBlIGFzIHRodW1ibmFpbFxuICAgKi9cbiAgdGh1bWJuYWlsOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2xcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIHJlc3BvbnNpdmU6IGZhbHNlLFxuICByb3VuZGVkOiBmYWxzZSxcbiAgY2lyY2xlOiBmYWxzZSxcbiAgdGh1bWJuYWlsOiBmYWxzZVxufTtcblxudmFyIEltYWdlID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoSW1hZ2UsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEltYWdlKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIEltYWdlKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgSW1hZ2UucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX2NsYXNzZXM7XG5cbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgcmVzcG9uc2l2ZSA9IF9wcm9wcy5yZXNwb25zaXZlLFxuICAgICAgICByb3VuZGVkID0gX3Byb3BzLnJvdW5kZWQsXG4gICAgICAgIGNpcmNsZSA9IF9wcm9wcy5jaXJjbGUsXG4gICAgICAgIHRodW1ibmFpbCA9IF9wcm9wcy50aHVtYm5haWwsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ3Jlc3BvbnNpdmUnLCAncm91bmRlZCcsICdjaXJjbGUnLCAndGh1bWJuYWlsJywgJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9IChfY2xhc3NlcyA9IHt9LCBfY2xhc3Nlc1soMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ3Jlc3BvbnNpdmUnKV0gPSByZXNwb25zaXZlLCBfY2xhc3Nlc1soMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ3JvdW5kZWQnKV0gPSByb3VuZGVkLCBfY2xhc3Nlc1soMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ2NpcmNsZScpXSA9IGNpcmNsZSwgX2NsYXNzZXNbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICd0aHVtYm5haWwnKV0gPSB0aHVtYm5haWwsIF9jbGFzc2VzKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnaW1nJywgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gSW1hZ2U7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5JbWFnZS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5JbWFnZS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2ltZycsIEltYWdlKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX0lucHV0R3JvdXBBZGRvbiA9IHJlcXVpcmUoJy4vSW5wdXRHcm91cEFkZG9uJyk7XG5cbnZhciBfSW5wdXRHcm91cEFkZG9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0lucHV0R3JvdXBBZGRvbik7XG5cbnZhciBfSW5wdXRHcm91cEJ1dHRvbiA9IHJlcXVpcmUoJy4vSW5wdXRHcm91cEJ1dHRvbicpO1xuXG52YXIgX0lucHV0R3JvdXBCdXR0b24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfSW5wdXRHcm91cEJ1dHRvbik7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbnZhciBfU3R5bGVDb25maWcgPSByZXF1aXJlKCcuL3V0aWxzL1N0eWxlQ29uZmlnJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIElucHV0R3JvdXAgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShJbnB1dEdyb3VwLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBJbnB1dEdyb3VwKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIElucHV0R3JvdXApO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBJbnB1dEdyb3VwLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdzcGFuJywgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gSW5wdXRHcm91cDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbklucHV0R3JvdXAuQWRkb24gPSBfSW5wdXRHcm91cEFkZG9uMlsnZGVmYXVsdCddO1xuSW5wdXRHcm91cC5CdXR0b24gPSBfSW5wdXRHcm91cEJ1dHRvbjJbJ2RlZmF1bHQnXTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnaW5wdXQtZ3JvdXAnLCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzU2l6ZXMpKFtfU3R5bGVDb25maWcuU2l6ZS5MQVJHRSwgX1N0eWxlQ29uZmlnLlNpemUuU01BTExdLCBJbnB1dEdyb3VwKSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgSW5wdXRHcm91cEFkZG9uID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoSW5wdXRHcm91cEFkZG9uLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBJbnB1dEdyb3VwQWRkb24oKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgSW5wdXRHcm91cEFkZG9uKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgSW5wdXRHcm91cEFkZG9uLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdzcGFuJywgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gSW5wdXRHcm91cEFkZG9uO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnaW5wdXQtZ3JvdXAtYWRkb24nLCBJbnB1dEdyb3VwQWRkb24pO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIElucHV0R3JvdXBCdXR0b24gPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShJbnB1dEdyb3VwQnV0dG9uLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBJbnB1dEdyb3VwQnV0dG9uKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIElucHV0R3JvdXBCdXR0b24pO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBJbnB1dEdyb3VwQnV0dG9uLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdzcGFuJywgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gSW5wdXRHcm91cEJ1dHRvbjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2lucHV0LWdyb3VwLWJ0bicsIElucHV0R3JvdXBCdXR0b24pO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfZWxlbWVudFR5cGUgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBjb21wb25lbnRDbGFzczogX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjb21wb25lbnRDbGFzczogJ2Rpdidcbn07XG5cbnZhciBKdW1ib3Ryb24gPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShKdW1ib3Ryb24sIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEp1bWJvdHJvbigpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBKdW1ib3Ryb24pO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBKdW1ib3Ryb24ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgQ29tcG9uZW50ID0gX3Byb3BzLmNvbXBvbmVudENsYXNzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjb21wb25lbnRDbGFzcycsICdjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChDb21wb25lbnQsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIEp1bWJvdHJvbjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbkp1bWJvdHJvbi5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5KdW1ib3Ryb24uZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdqdW1ib3Ryb24nLCBKdW1ib3Ryb24pO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3ZhbHVlcyA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvdmFsdWVzJyk7XG5cbnZhciBfdmFsdWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3ZhbHVlcyk7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxudmFyIF9TdHlsZUNvbmZpZyA9IHJlcXVpcmUoJy4vdXRpbHMvU3R5bGVDb25maWcnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgTGFiZWwgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShMYWJlbCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTGFiZWwoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgTGFiZWwpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBMYWJlbC5wcm90b3R5cGUuaGFzQ29udGVudCA9IGZ1bmN0aW9uIGhhc0NvbnRlbnQoY2hpbGRyZW4pIHtcbiAgICB2YXIgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICBfcmVhY3QyWydkZWZhdWx0J10uQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNoaWxkIHx8IGNoaWxkID09PSAwKSB7XG4gICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIExhYmVsLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjbGFzc05hbWUnLCAnY2hpbGRyZW4nXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKSwge1xuXG4gICAgICAvLyBIYWNrIGZvciBjb2xsYXBzaW5nIG9uIElFOC5cbiAgICAgIGhpZGRlbjogIXRoaXMuaGFzQ29udGVudChjaGlsZHJlbilcbiAgICB9KTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICdzcGFuJyxcbiAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgICAgfSksXG4gICAgICBjaGlsZHJlblxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIExhYmVsO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnbGFiZWwnLCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzU3R5bGVzKShbXS5jb25jYXQoKDAsIF92YWx1ZXMyWydkZWZhdWx0J10pKF9TdHlsZUNvbmZpZy5TdGF0ZSksIFtfU3R5bGVDb25maWcuU3R5bGUuREVGQVVMVCwgX1N0eWxlQ29uZmlnLlN0eWxlLlBSSU1BUlldKSwgX1N0eWxlQ29uZmlnLlN0eWxlLkRFRkFVTFQsIExhYmVsKSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX0xpc3RHcm91cEl0ZW0gPSByZXF1aXJlKCcuL0xpc3RHcm91cEl0ZW0nKTtcblxudmFyIF9MaXN0R3JvdXBJdGVtMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0xpc3RHcm91cEl0ZW0pO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG52YXIgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4gPSByZXF1aXJlKCcuL3V0aWxzL1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4nKTtcblxudmFyIF9WYWxpZENvbXBvbmVudENoaWxkcmVuMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBZb3UgY2FuIHVzZSBhIGN1c3RvbSBlbGVtZW50IHR5cGUgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgYCdsaSdgIGlmIGV2ZXJ5IGNoaWxkIGlzIGFcbiAgICogbm9uLWFjdGlvbmFibGUgYDxMaXN0R3JvdXBJdGVtPmAsIGFuZCBgJ2RpdidgIG90aGVyd2lzZS5cbiAgICovXG4gIGNvbXBvbmVudENsYXNzOiBfZWxlbWVudFR5cGUyWydkZWZhdWx0J11cbn07XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRDb21wb25lbnQoY2hpbGRyZW4pIHtcbiAgaWYgKCFjaGlsZHJlbikge1xuICAgIC8vIEZJWE1FOiBUaGlzIGlzIHRoZSBvbGQgYmVoYXZpb3IuIElzIHRoaXMgcmlnaHQ/XG4gICAgcmV0dXJuICdkaXYnO1xuICB9XG5cbiAgaWYgKF9WYWxpZENvbXBvbmVudENoaWxkcmVuMlsnZGVmYXVsdCddLnNvbWUoY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIHJldHVybiBjaGlsZC50eXBlICE9PSBfTGlzdEdyb3VwSXRlbTJbJ2RlZmF1bHQnXSB8fCBjaGlsZC5wcm9wcy5ocmVmIHx8IGNoaWxkLnByb3BzLm9uQ2xpY2s7XG4gIH0pKSB7XG4gICAgcmV0dXJuICdkaXYnO1xuICB9XG5cbiAgcmV0dXJuICd1bCc7XG59XG5cbnZhciBMaXN0R3JvdXAgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShMaXN0R3JvdXAsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIExpc3RHcm91cCgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBMaXN0R3JvdXApO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBMaXN0R3JvdXAucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIF9wcm9wcyRjb21wb25lbnRDbGFzcyA9IF9wcm9wcy5jb21wb25lbnRDbGFzcyxcbiAgICAgICAgQ29tcG9uZW50ID0gX3Byb3BzJGNvbXBvbmVudENsYXNzID09PSB1bmRlZmluZWQgPyBnZXREZWZhdWx0Q29tcG9uZW50KGNoaWxkcmVuKSA6IF9wcm9wcyRjb21wb25lbnRDbGFzcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY2hpbGRyZW4nLCAnY29tcG9uZW50Q2xhc3MnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG5cbiAgICB2YXIgdXNlTGlzdEl0ZW0gPSBDb21wb25lbnQgPT09ICd1bCcgJiYgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yWydkZWZhdWx0J10uZXZlcnkoY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgcmV0dXJuIGNoaWxkLnR5cGUgPT09IF9MaXN0R3JvdXBJdGVtMlsnZGVmYXVsdCddO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgQ29tcG9uZW50LFxuICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgICB9KSxcbiAgICAgIHVzZUxpc3RJdGVtID8gX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yWydkZWZhdWx0J10ubWFwKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuICgwLCBfcmVhY3QuY2xvbmVFbGVtZW50KShjaGlsZCwgeyBsaXN0SXRlbTogdHJ1ZSB9KTtcbiAgICAgIH0pIDogY2hpbGRyZW5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBMaXN0R3JvdXA7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5MaXN0R3JvdXAucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdsaXN0LWdyb3VwJywgTGlzdEdyb3VwKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF92YWx1ZXMgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L3ZhbHVlcycpO1xuXG52YXIgX3ZhbHVlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF92YWx1ZXMpO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG52YXIgX1N0eWxlQ29uZmlnID0gcmVxdWlyZSgnLi91dGlscy9TdHlsZUNvbmZpZycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGFjdGl2ZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5hbnksXG4gIGRpc2FibGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmFueSxcbiAgaGVhZGVyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm5vZGUsXG4gIGxpc3RJdGVtOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIG9uQ2xpY2s6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgaHJlZjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gIHR5cGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBsaXN0SXRlbTogZmFsc2Vcbn07XG5cbnZhciBMaXN0R3JvdXBJdGVtID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoTGlzdEdyb3VwSXRlbSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTGlzdEdyb3VwSXRlbSgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBMaXN0R3JvdXBJdGVtKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgTGlzdEdyb3VwSXRlbS5wcm90b3R5cGUucmVuZGVySGVhZGVyID0gZnVuY3Rpb24gcmVuZGVySGVhZGVyKGhlYWRlciwgaGVhZGluZ0NsYXNzTmFtZSkge1xuICAgIGlmIChfcmVhY3QyWydkZWZhdWx0J10uaXNWYWxpZEVsZW1lbnQoaGVhZGVyKSkge1xuICAgICAgcmV0dXJuICgwLCBfcmVhY3QuY2xvbmVFbGVtZW50KShoZWFkZXIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGhlYWRlci5wcm9wcy5jbGFzc05hbWUsIGhlYWRpbmdDbGFzc05hbWUpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnaDQnLFxuICAgICAgeyBjbGFzc05hbWU6IGhlYWRpbmdDbGFzc05hbWUgfSxcbiAgICAgIGhlYWRlclxuICAgICk7XG4gIH07XG5cbiAgTGlzdEdyb3VwSXRlbS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3RpdmUgPSBfcHJvcHMuYWN0aXZlLFxuICAgICAgICBkaXNhYmxlZCA9IF9wcm9wcy5kaXNhYmxlZCxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgaGVhZGVyID0gX3Byb3BzLmhlYWRlcixcbiAgICAgICAgbGlzdEl0ZW0gPSBfcHJvcHMubGlzdEl0ZW0sXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydhY3RpdmUnLCAnZGlzYWJsZWQnLCAnY2xhc3NOYW1lJywgJ2hlYWRlcicsICdsaXN0SXRlbScsICdjaGlsZHJlbiddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpLCB7XG4gICAgICBhY3RpdmU6IGFjdGl2ZSxcbiAgICAgIGRpc2FibGVkOiBkaXNhYmxlZFxuICAgIH0pO1xuXG4gICAgdmFyIENvbXBvbmVudCA9IHZvaWQgMDtcblxuICAgIGlmIChlbGVtZW50UHJvcHMuaHJlZikge1xuICAgICAgQ29tcG9uZW50ID0gJ2EnO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudFByb3BzLm9uQ2xpY2spIHtcbiAgICAgIENvbXBvbmVudCA9ICdidXR0b24nO1xuICAgICAgZWxlbWVudFByb3BzLnR5cGUgPSBlbGVtZW50UHJvcHMudHlwZSB8fCAnYnV0dG9uJztcbiAgICB9IGVsc2UgaWYgKGxpc3RJdGVtKSB7XG4gICAgICBDb21wb25lbnQgPSAnbGknO1xuICAgIH0gZWxzZSB7XG4gICAgICBDb21wb25lbnQgPSAnc3Bhbic7XG4gICAgfVxuXG4gICAgZWxlbWVudFByb3BzLmNsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKTtcblxuICAgIC8vIFRPRE86IERlcHJlY2F0ZSBgaGVhZGVyYCBwcm9wLlxuICAgIGlmIChoZWFkZXIpIHtcbiAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgQ29tcG9uZW50LFxuICAgICAgICBlbGVtZW50UHJvcHMsXG4gICAgICAgIHRoaXMucmVuZGVySGVhZGVyKGhlYWRlciwgKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdoZWFkaW5nJykpLFxuICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAncCcsXG4gICAgICAgICAgeyBjbGFzc05hbWU6ICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAndGV4dCcpIH0sXG4gICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBDb21wb25lbnQsXG4gICAgICBlbGVtZW50UHJvcHMsXG4gICAgICBjaGlsZHJlblxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIExpc3RHcm91cEl0ZW07XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5MaXN0R3JvdXBJdGVtLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkxpc3RHcm91cEl0ZW0uZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdsaXN0LWdyb3VwLWl0ZW0nLCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzU3R5bGVzKSgoMCwgX3ZhbHVlczJbJ2RlZmF1bHQnXSkoX1N0eWxlQ29uZmlnLlN0YXRlKSwgTGlzdEdyb3VwSXRlbSkpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfZWxlbWVudFR5cGUgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlKTtcblxudmFyIF9NZWRpYUJvZHkgPSByZXF1aXJlKCcuL01lZGlhQm9keScpO1xuXG52YXIgX01lZGlhQm9keTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9NZWRpYUJvZHkpO1xuXG52YXIgX01lZGlhSGVhZGluZyA9IHJlcXVpcmUoJy4vTWVkaWFIZWFkaW5nJyk7XG5cbnZhciBfTWVkaWFIZWFkaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01lZGlhSGVhZGluZyk7XG5cbnZhciBfTWVkaWFMZWZ0ID0gcmVxdWlyZSgnLi9NZWRpYUxlZnQnKTtcblxudmFyIF9NZWRpYUxlZnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTWVkaWFMZWZ0KTtcblxudmFyIF9NZWRpYUxpc3QgPSByZXF1aXJlKCcuL01lZGlhTGlzdCcpO1xuXG52YXIgX01lZGlhTGlzdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9NZWRpYUxpc3QpO1xuXG52YXIgX01lZGlhTGlzdEl0ZW0gPSByZXF1aXJlKCcuL01lZGlhTGlzdEl0ZW0nKTtcblxudmFyIF9NZWRpYUxpc3RJdGVtMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01lZGlhTGlzdEl0ZW0pO1xuXG52YXIgX01lZGlhUmlnaHQgPSByZXF1aXJlKCcuL01lZGlhUmlnaHQnKTtcblxudmFyIF9NZWRpYVJpZ2h0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01lZGlhUmlnaHQpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiBfZWxlbWVudFR5cGUyWydkZWZhdWx0J11cbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiAnZGl2J1xufTtcblxudmFyIE1lZGlhID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoTWVkaWEsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE1lZGlhKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIE1lZGlhKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgTWVkaWEucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgQ29tcG9uZW50ID0gX3Byb3BzLmNvbXBvbmVudENsYXNzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjb21wb25lbnRDbGFzcycsICdjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChDb21wb25lbnQsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIE1lZGlhO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuTWVkaWEucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuTWVkaWEuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5NZWRpYS5IZWFkaW5nID0gX01lZGlhSGVhZGluZzJbJ2RlZmF1bHQnXTtcbk1lZGlhLkJvZHkgPSBfTWVkaWFCb2R5MlsnZGVmYXVsdCddO1xuTWVkaWEuTGVmdCA9IF9NZWRpYUxlZnQyWydkZWZhdWx0J107XG5NZWRpYS5SaWdodCA9IF9NZWRpYVJpZ2h0MlsnZGVmYXVsdCddO1xuTWVkaWEuTGlzdCA9IF9NZWRpYUxpc3QyWydkZWZhdWx0J107XG5NZWRpYS5MaXN0SXRlbSA9IF9NZWRpYUxpc3RJdGVtMlsnZGVmYXVsdCddO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdtZWRpYScsIE1lZGlhKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX2VsZW1lbnRUeXBlID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvZWxlbWVudFR5cGUnKTtcblxudmFyIF9lbGVtZW50VHlwZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbGVtZW50VHlwZSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6IF9lbGVtZW50VHlwZTJbJ2RlZmF1bHQnXVxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6ICdkaXYnXG59O1xuXG52YXIgTWVkaWFCb2R5ID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoTWVkaWFCb2R5LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBNZWRpYUJvZHkoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgTWVkaWFCb2R5KTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgTWVkaWFCb2R5LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIENvbXBvbmVudCA9IF9wcm9wcy5jb21wb25lbnRDbGFzcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY29tcG9uZW50Q2xhc3MnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBNZWRpYUJvZHk7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5NZWRpYUJvZHkucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuTWVkaWFCb2R5LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnbWVkaWEtYm9keScsIE1lZGlhQm9keSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiBfZWxlbWVudFR5cGUyWydkZWZhdWx0J11cbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiAnaDQnXG59O1xuXG52YXIgTWVkaWFIZWFkaW5nID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoTWVkaWFIZWFkaW5nLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBNZWRpYUhlYWRpbmcoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgTWVkaWFIZWFkaW5nKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgTWVkaWFIZWFkaW5nLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIENvbXBvbmVudCA9IF9wcm9wcy5jb21wb25lbnRDbGFzcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY29tcG9uZW50Q2xhc3MnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBNZWRpYUhlYWRpbmc7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5NZWRpYUhlYWRpbmcucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuTWVkaWFIZWFkaW5nLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnbWVkaWEtaGVhZGluZycsIE1lZGlhSGVhZGluZyk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfTWVkaWEgPSByZXF1aXJlKCcuL01lZGlhJyk7XG5cbnZhciBfTWVkaWEyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTWVkaWEpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBBbGlnbiB0aGUgbWVkaWEgdG8gdGhlIHRvcCwgbWlkZGxlLCBvciBib3R0b20gb2YgdGhlIG1lZGlhIG9iamVjdC5cbiAgICovXG4gIGFsaWduOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mKFsndG9wJywgJ21pZGRsZScsICdib3R0b20nXSlcbn07XG5cbnZhciBNZWRpYUxlZnQgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShNZWRpYUxlZnQsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE1lZGlhTGVmdCgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBNZWRpYUxlZnQpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBNZWRpYUxlZnQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYWxpZ24gPSBfcHJvcHMuYWxpZ24sXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2FsaWduJywgJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgaWYgKGFsaWduKSB7XG4gICAgICAvLyBUaGUgY2xhc3MgaXMgZS5nLiBgbWVkaWEtdG9wYCwgbm90IGBtZWRpYS1sZWZ0LXRvcGAuXG4gICAgICBjbGFzc2VzWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShfTWVkaWEyWydkZWZhdWx0J10uZGVmYXVsdFByb3BzLCBhbGlnbildID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ2RpdicsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIE1lZGlhTGVmdDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbk1lZGlhTGVmdC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ21lZGlhLWxlZnQnLCBNZWRpYUxlZnQpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIE1lZGlhTGlzdCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKE1lZGlhTGlzdCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTWVkaWFMaXN0KCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIE1lZGlhTGlzdCk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIE1lZGlhTGlzdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgndWwnLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBNZWRpYUxpc3Q7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdtZWRpYS1saXN0JywgTWVkaWFMaXN0KTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBNZWRpYUxpc3RJdGVtID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoTWVkaWFMaXN0SXRlbSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTWVkaWFMaXN0SXRlbSgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBNZWRpYUxpc3RJdGVtKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgTWVkaWFMaXN0SXRlbS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnbGknLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBNZWRpYUxpc3RJdGVtO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnbWVkaWEnLCBNZWRpYUxpc3RJdGVtKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9NZWRpYSA9IHJlcXVpcmUoJy4vTWVkaWEnKTtcblxudmFyIF9NZWRpYTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9NZWRpYSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIEFsaWduIHRoZSBtZWRpYSB0byB0aGUgdG9wLCBtaWRkbGUsIG9yIGJvdHRvbSBvZiB0aGUgbWVkaWEgb2JqZWN0LlxuICAgKi9cbiAgYWxpZ246IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2YoWyd0b3AnLCAnbWlkZGxlJywgJ2JvdHRvbSddKVxufTtcblxudmFyIE1lZGlhUmlnaHQgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShNZWRpYVJpZ2h0LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBNZWRpYVJpZ2h0KCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIE1lZGlhUmlnaHQpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBNZWRpYVJpZ2h0LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGFsaWduID0gX3Byb3BzLmFsaWduLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydhbGlnbicsICdjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcblxuICAgIGlmIChhbGlnbikge1xuICAgICAgLy8gVGhlIGNsYXNzIGlzIGUuZy4gYG1lZGlhLXRvcGAsIG5vdCBgbWVkaWEtcmlnaHQtdG9wYC5cbiAgICAgIGNsYXNzZXNbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKF9NZWRpYTJbJ2RlZmF1bHQnXS5kZWZhdWx0UHJvcHMsIGFsaWduKV0gPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnZGl2JywgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gTWVkaWFSaWdodDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbk1lZGlhUmlnaHQucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdtZWRpYS1yaWdodCcsIE1lZGlhUmlnaHQpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2FsbCA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2FsbCcpO1xuXG52YXIgX2FsbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hbGwpO1xuXG52YXIgX1NhZmVBbmNob3IgPSByZXF1aXJlKCcuL1NhZmVBbmNob3InKTtcblxudmFyIF9TYWZlQW5jaG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1NhZmVBbmNob3IpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbiA9IHJlcXVpcmUoJy4vdXRpbHMvY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluZWRGdW5jdGlvbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIEhpZ2hsaWdodCB0aGUgbWVudSBpdGVtIGFzIGFjdGl2ZS5cbiAgICovXG4gIGFjdGl2ZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBEaXNhYmxlIHRoZSBtZW51IGl0ZW0sIG1ha2luZyBpdCB1bnNlbGVjdGFibGUuXG4gICAqL1xuICBkaXNhYmxlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBTdHlsZXMgdGhlIG1lbnUgaXRlbSBhcyBhIGhvcml6b250YWwgcnVsZSwgcHJvdmlkaW5nIHZpc3VhbCBzZXBhcmF0aW9uIGJldHdlZW5cbiAgICogZ3JvdXBzIG9mIG1lbnUgaXRlbXMuXG4gICAqL1xuICBkaXZpZGVyOiAoMCwgX2FsbDJbJ2RlZmF1bHQnXSkoX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBkaXZpZGVyID0gX3JlZi5kaXZpZGVyLFxuICAgICAgICBjaGlsZHJlbiA9IF9yZWYuY2hpbGRyZW47XG4gICAgcmV0dXJuIGRpdmlkZXIgJiYgY2hpbGRyZW4gPyBuZXcgRXJyb3IoJ0NoaWxkcmVuIHdpbGwgbm90IGJlIHJlbmRlcmVkIGZvciBkaXZpZGVycycpIDogbnVsbDtcbiAgfSksXG5cbiAgLyoqXG4gICAqIFZhbHVlIHBhc3NlZCB0byB0aGUgYG9uU2VsZWN0YCBoYW5kbGVyLCB1c2VmdWwgZm9yIGlkZW50aWZ5aW5nIHRoZSBzZWxlY3RlZCBtZW51IGl0ZW0uXG4gICAqL1xuICBldmVudEtleTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5hbnksXG5cbiAgLyoqXG4gICAqIFN0eWxlcyB0aGUgbWVudSBpdGVtIGFzIGEgaGVhZGVyIGxhYmVsLCB1c2VmdWwgZm9yIGRlc2NyaWJpbmcgYSBncm91cCBvZiBtZW51IGl0ZW1zLlxuICAgKi9cbiAgaGVhZGVyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIEhUTUwgYGhyZWZgIGF0dHJpYnV0ZSBjb3JyZXNwb25kaW5nIHRvIGBhLmhyZWZgLlxuICAgKi9cbiAgaHJlZjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIHdoZW4gdGhlIG1lbnUgaXRlbSBpcyBjbGlja2VkLlxuICAgKi9cbiAgb25DbGljazogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCB3aGVuIHRoZSBtZW51IGl0ZW0gaXMgc2VsZWN0ZWQuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIChldmVudEtleTogYW55LCBldmVudDogT2JqZWN0KSA9PiBhbnlcbiAgICogYGBgXG4gICAqL1xuICBvblNlbGVjdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBkaXZpZGVyOiBmYWxzZSxcbiAgZGlzYWJsZWQ6IGZhbHNlLFxuICBoZWFkZXI6IGZhbHNlXG59O1xuXG52YXIgTWVudUl0ZW0gPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShNZW51SXRlbSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTWVudUl0ZW0ocHJvcHMsIGNvbnRleHQpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBNZW51SXRlbSk7XG5cbiAgICB2YXIgX3RoaXMgPSAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgX3RoaXMuaGFuZGxlQ2xpY2sgPSBfdGhpcy5oYW5kbGVDbGljay5iaW5kKF90aGlzKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBNZW51SXRlbS5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBocmVmID0gX3Byb3BzLmhyZWYsXG4gICAgICAgIGRpc2FibGVkID0gX3Byb3BzLmRpc2FibGVkLFxuICAgICAgICBvblNlbGVjdCA9IF9wcm9wcy5vblNlbGVjdCxcbiAgICAgICAgZXZlbnRLZXkgPSBfcHJvcHMuZXZlbnRLZXk7XG5cblxuICAgIGlmICghaHJlZiB8fCBkaXNhYmxlZCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob25TZWxlY3QpIHtcbiAgICAgIG9uU2VsZWN0KGV2ZW50S2V5LCBldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIE1lbnVJdGVtLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3RpdmUgPSBfcHJvcHMyLmFjdGl2ZSxcbiAgICAgICAgZGlzYWJsZWQgPSBfcHJvcHMyLmRpc2FibGVkLFxuICAgICAgICBkaXZpZGVyID0gX3Byb3BzMi5kaXZpZGVyLFxuICAgICAgICBoZWFkZXIgPSBfcHJvcHMyLmhlYWRlcixcbiAgICAgICAgb25DbGljayA9IF9wcm9wczIub25DbGljayxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzMi5jbGFzc05hbWUsXG4gICAgICAgIHN0eWxlID0gX3Byb3BzMi5zdHlsZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMyLCBbJ2FjdGl2ZScsICdkaXNhYmxlZCcsICdkaXZpZGVyJywgJ2hlYWRlcicsICdvbkNsaWNrJywgJ2NsYXNzTmFtZScsICdzdHlsZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzQW5kT21pdCA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzQW5kT21pdCkocHJvcHMsIFsnZXZlbnRLZXknLCAnb25TZWxlY3QnXSksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzQW5kT21pdFswXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc0FuZE9taXRbMV07XG5cbiAgICBpZiAoZGl2aWRlcikge1xuICAgICAgLy8gRm9yY2libHkgYmxhbmsgb3V0IHRoZSBjaGlsZHJlbjsgc2VwYXJhdG9ycyBzaG91bGRuJ3QgcmVuZGVyIGFueS5cbiAgICAgIGVsZW1lbnRQcm9wcy5jaGlsZHJlbiA9IHVuZGVmaW5lZDtcblxuICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdsaScsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgICByb2xlOiAnc2VwYXJhdG9yJyxcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgJ2RpdmlkZXInKSxcbiAgICAgICAgc3R5bGU6IHN0eWxlXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdsaScsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgICByb2xlOiAnaGVhZGluZycsXG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnaGVhZGVyJykpLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnbGknLFxuICAgICAge1xuICAgICAgICByb2xlOiAncHJlc2VudGF0aW9uJyxcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgeyBhY3RpdmU6IGFjdGl2ZSwgZGlzYWJsZWQ6IGRpc2FibGVkIH0pLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sXG4gICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfU2FmZUFuY2hvcjJbJ2RlZmF1bHQnXSwgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICAgIHJvbGU6ICdtZW51aXRlbScsXG4gICAgICAgIHRhYkluZGV4OiAnLTEnLFxuICAgICAgICBvbkNsaWNrOiAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkob25DbGljaywgdGhpcy5oYW5kbGVDbGljaylcbiAgICAgIH0pKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIE1lbnVJdGVtO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuTWVudUl0ZW0ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuTWVudUl0ZW0uZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdkcm9wZG93bicsIE1lbnVJdGVtKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9ldmVudHMgPSByZXF1aXJlKCdkb20taGVscGVycy9ldmVudHMnKTtcblxudmFyIF9ldmVudHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXZlbnRzKTtcblxudmFyIF9vd25lckRvY3VtZW50ID0gcmVxdWlyZSgnZG9tLWhlbHBlcnMvb3duZXJEb2N1bWVudCcpO1xuXG52YXIgX293bmVyRG9jdW1lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb3duZXJEb2N1bWVudCk7XG5cbnZhciBfaW5ET00gPSByZXF1aXJlKCdkb20taGVscGVycy91dGlsL2luRE9NJyk7XG5cbnZhciBfaW5ET00yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5ET00pO1xuXG52YXIgX3Njcm9sbGJhclNpemUgPSByZXF1aXJlKCdkb20taGVscGVycy91dGlsL3Njcm9sbGJhclNpemUnKTtcblxudmFyIF9zY3JvbGxiYXJTaXplMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Njcm9sbGJhclNpemUpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX3JlYWN0RG9tID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5cbnZhciBfcmVhY3REb20yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3REb20pO1xuXG52YXIgX01vZGFsID0gcmVxdWlyZSgncmVhY3Qtb3ZlcmxheXMvbGliL01vZGFsJyk7XG5cbnZhciBfTW9kYWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTW9kYWwpO1xuXG52YXIgX2lzT3ZlcmZsb3dpbmcgPSByZXF1aXJlKCdyZWFjdC1vdmVybGF5cy9saWIvdXRpbHMvaXNPdmVyZmxvd2luZycpO1xuXG52YXIgX2lzT3ZlcmZsb3dpbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNPdmVyZmxvd2luZyk7XG5cbnZhciBfZWxlbWVudFR5cGUgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlKTtcblxudmFyIF9GYWRlID0gcmVxdWlyZSgnLi9GYWRlJyk7XG5cbnZhciBfRmFkZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9GYWRlKTtcblxudmFyIF9Nb2RhbEJvZHkgPSByZXF1aXJlKCcuL01vZGFsQm9keScpO1xuXG52YXIgX01vZGFsQm9keTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Nb2RhbEJvZHkpO1xuXG52YXIgX01vZGFsRGlhbG9nID0gcmVxdWlyZSgnLi9Nb2RhbERpYWxvZycpO1xuXG52YXIgX01vZGFsRGlhbG9nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01vZGFsRGlhbG9nKTtcblxudmFyIF9Nb2RhbEZvb3RlciA9IHJlcXVpcmUoJy4vTW9kYWxGb290ZXInKTtcblxudmFyIF9Nb2RhbEZvb3RlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Nb2RhbEZvb3Rlcik7XG5cbnZhciBfTW9kYWxIZWFkZXIgPSByZXF1aXJlKCcuL01vZGFsSGVhZGVyJyk7XG5cbnZhciBfTW9kYWxIZWFkZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTW9kYWxIZWFkZXIpO1xuXG52YXIgX01vZGFsVGl0bGUgPSByZXF1aXJlKCcuL01vZGFsVGl0bGUnKTtcblxudmFyIF9Nb2RhbFRpdGxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01vZGFsVGl0bGUpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbiA9IHJlcXVpcmUoJy4vdXRpbHMvY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluZWRGdW5jdGlvbik7XG5cbnZhciBfc3BsaXRDb21wb25lbnRQcm9wczIgPSByZXF1aXJlKCcuL3V0aWxzL3NwbGl0Q29tcG9uZW50UHJvcHMnKTtcblxudmFyIF9zcGxpdENvbXBvbmVudFByb3BzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NwbGl0Q29tcG9uZW50UHJvcHMyKTtcblxudmFyIF9TdHlsZUNvbmZpZyA9IHJlcXVpcmUoJy4vdXRpbHMvU3R5bGVDb25maWcnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgX01vZGFsMlsnZGVmYXVsdCddLnByb3BUeXBlcywgX01vZGFsRGlhbG9nMlsnZGVmYXVsdCddLnByb3BUeXBlcywge1xuXG4gIC8qKlxuICAgKiBJbmNsdWRlIGEgYmFja2Ryb3AgY29tcG9uZW50LiBTcGVjaWZ5ICdzdGF0aWMnIGZvciBhIGJhY2tkcm9wIHRoYXQgZG9lc24ndFxuICAgKiB0cmlnZ2VyIGFuIFwib25IaWRlXCIgd2hlbiBjbGlja2VkLlxuICAgKi9cbiAgYmFja2Ryb3A6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2YoWydzdGF0aWMnLCB0cnVlLCBmYWxzZV0pLFxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgbW9kYWwgd2hlbiBlc2NhcGUga2V5IGlzIHByZXNzZWRcbiAgICovXG4gIGtleWJvYXJkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIE9wZW4gYW5kIGNsb3NlIHRoZSBNb2RhbCB3aXRoIGEgc2xpZGUgYW5kIGZhZGUgYW5pbWF0aW9uLlxuICAgKi9cbiAgYW5pbWF0aW9uOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIEEgQ29tcG9uZW50IHR5cGUgdGhhdCBwcm92aWRlcyB0aGUgbW9kYWwgY29udGVudCBNYXJrdXAuIFRoaXMgaXMgYSB1c2VmdWxcbiAgICogcHJvcCB3aGVuIHlvdSB3YW50IHRvIHVzZSB5b3VyIG93biBzdHlsZXMgYW5kIG1hcmt1cCB0byBjcmVhdGUgYSBjdXN0b21cbiAgICogbW9kYWwgY29tcG9uZW50LlxuICAgKi9cbiAgZGlhbG9nQ29tcG9uZW50Q2xhc3M6IF9lbGVtZW50VHlwZTJbJ2RlZmF1bHQnXSxcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgVGhlIG1vZGFsIHdpbGwgYXV0b21hdGljYWxseSBzaGlmdCBmb2N1cyB0byBpdHNlbGYgd2hlbiBpdFxuICAgKiBvcGVucywgYW5kIHJlcGxhY2UgaXQgdG8gdGhlIGxhc3QgZm9jdXNlZCBlbGVtZW50IHdoZW4gaXQgY2xvc2VzLlxuICAgKiBHZW5lcmFsbHkgdGhpcyBzaG91bGQgbmV2ZXIgYmUgc2V0IHRvIGZhbHNlIGFzIGl0IG1ha2VzIHRoZSBNb2RhbCBsZXNzXG4gICAqIGFjY2Vzc2libGUgdG8gYXNzaXN0aXZlIHRlY2hub2xvZ2llcywgbGlrZSBzY3JlZW4tcmVhZGVycy5cbiAgICovXG4gIGF1dG9Gb2N1czogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCBUaGUgbW9kYWwgd2lsbCBwcmV2ZW50IGZvY3VzIGZyb20gbGVhdmluZyB0aGUgTW9kYWwgd2hpbGVcbiAgICogb3Blbi4gQ29uc2lkZXIgbGVhdmluZyB0aGUgZGVmYXVsdCB2YWx1ZSBoZXJlLCBhcyBpdCBpcyBuZWNlc3NhcnkgdG8gbWFrZVxuICAgKiB0aGUgTW9kYWwgd29yayB3ZWxsIHdpdGggYXNzaXN0aXZlIHRlY2hub2xvZ2llcywgc3VjaCBhcyBzY3JlZW4gcmVhZGVycy5cbiAgICovXG4gIGVuZm9yY2VGb2N1czogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCBUaGUgbW9kYWwgd2lsbCByZXN0b3JlIGZvY3VzIHRvIHByZXZpb3VzbHkgZm9jdXNlZCBlbGVtZW50IG9uY2VcbiAgICogbW9kYWwgaXMgaGlkZGVuXG4gICAqL1xuICByZXN0b3JlRm9jdXM6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgVGhlIG1vZGFsIHdpbGwgc2hvdyBpdHNlbGYuXG4gICAqL1xuICBzaG93OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZmlyZWQgd2hlbiB0aGUgaGVhZGVyIGNsb3NlQnV0dG9uIG9yIG5vbi1zdGF0aWMgYmFja2Ryb3AgaXNcbiAgICogY2xpY2tlZC4gUmVxdWlyZWQgaWYgZWl0aGVyIGFyZSBzcGVjaWZpZWQuXG4gICAqL1xuICBvbkhpZGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYmVmb3JlIHRoZSBNb2RhbCB0cmFuc2l0aW9ucyBpblxuICAgKi9cbiAgb25FbnRlcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhcyB0aGUgTW9kYWwgYmVnaW5zIHRvIHRyYW5zaXRpb24gaW5cbiAgICovXG4gIG9uRW50ZXJpbmc6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIE1vZGFsIGZpbmlzaGVzIHRyYW5zaXRpb25pbmcgaW5cbiAgICovXG4gIG9uRW50ZXJlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCByaWdodCBiZWZvcmUgdGhlIE1vZGFsIHRyYW5zaXRpb25zIG91dFxuICAgKi9cbiAgb25FeGl0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFzIHRoZSBNb2RhbCBiZWdpbnMgdG8gdHJhbnNpdGlvbiBvdXRcbiAgICovXG4gIG9uRXhpdGluZzogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgTW9kYWwgZmluaXNoZXMgdHJhbnNpdGlvbmluZyBvdXRcbiAgICovXG4gIG9uRXhpdGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb250YWluZXI6IF9Nb2RhbDJbJ2RlZmF1bHQnXS5wcm9wVHlwZXMuY29udGFpbmVyXG59KTtcblxudmFyIGRlZmF1bHRQcm9wcyA9ICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIF9Nb2RhbDJbJ2RlZmF1bHQnXS5kZWZhdWx0UHJvcHMsIHtcbiAgYW5pbWF0aW9uOiB0cnVlLFxuICBkaWFsb2dDb21wb25lbnRDbGFzczogX01vZGFsRGlhbG9nMlsnZGVmYXVsdCddXG59KTtcblxudmFyIGNoaWxkQ29udGV4dFR5cGVzID0ge1xuICAkYnNfbW9kYWw6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc2hhcGUoe1xuICAgIG9uSGlkZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jXG4gIH0pXG59O1xuXG52YXIgTW9kYWwgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShNb2RhbCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTW9kYWwocHJvcHMsIGNvbnRleHQpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBNb2RhbCk7XG5cbiAgICB2YXIgX3RoaXMgPSAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgX3RoaXMuaGFuZGxlRW50ZXJpbmcgPSBfdGhpcy5oYW5kbGVFbnRlcmluZy5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5oYW5kbGVFeGl0ZWQgPSBfdGhpcy5oYW5kbGVFeGl0ZWQuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaGFuZGxlV2luZG93UmVzaXplID0gX3RoaXMuaGFuZGxlV2luZG93UmVzaXplLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmhhbmRsZURpYWxvZ0NsaWNrID0gX3RoaXMuaGFuZGxlRGlhbG9nQ2xpY2suYmluZChfdGhpcyk7XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHN0eWxlOiB7fVxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgTW9kYWwucHJvdG90eXBlLmdldENoaWxkQ29udGV4dCA9IGZ1bmN0aW9uIGdldENoaWxkQ29udGV4dCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJGJzX21vZGFsOiB7XG4gICAgICAgIG9uSGlkZTogdGhpcy5wcm9wcy5vbkhpZGVcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIE1vZGFsLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIC8vIENsZWFuIHVwIHRoZSBsaXN0ZW5lciBpZiB3ZSBuZWVkIHRvLlxuICAgIHRoaXMuaGFuZGxlRXhpdGVkKCk7XG4gIH07XG5cbiAgTW9kYWwucHJvdG90eXBlLmhhbmRsZUVudGVyaW5nID0gZnVuY3Rpb24gaGFuZGxlRW50ZXJpbmcoKSB7XG4gICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIHdvcmsgZXZlbiB3aGVuIGFuaW1hdGlvbiBpcyBkaXNhYmxlZC5cbiAgICBfZXZlbnRzMlsnZGVmYXVsdCddLm9uKHdpbmRvdywgJ3Jlc2l6ZScsIHRoaXMuaGFuZGxlV2luZG93UmVzaXplKTtcbiAgICB0aGlzLnVwZGF0ZVN0eWxlKCk7XG4gIH07XG5cbiAgTW9kYWwucHJvdG90eXBlLmhhbmRsZUV4aXRlZCA9IGZ1bmN0aW9uIGhhbmRsZUV4aXRlZCgpIHtcbiAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgd29yayBldmVuIHdoZW4gYW5pbWF0aW9uIGlzIGRpc2FibGVkLlxuICAgIF9ldmVudHMyWydkZWZhdWx0J10ub2ZmKHdpbmRvdywgJ3Jlc2l6ZScsIHRoaXMuaGFuZGxlV2luZG93UmVzaXplKTtcbiAgfTtcblxuICBNb2RhbC5wcm90b3R5cGUuaGFuZGxlV2luZG93UmVzaXplID0gZnVuY3Rpb24gaGFuZGxlV2luZG93UmVzaXplKCkge1xuICAgIHRoaXMudXBkYXRlU3R5bGUoKTtcbiAgfTtcblxuICBNb2RhbC5wcm90b3R5cGUuaGFuZGxlRGlhbG9nQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVEaWFsb2dDbGljayhlKSB7XG4gICAgaWYgKGUudGFyZ2V0ICE9PSBlLmN1cnJlbnRUYXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByb3BzLm9uSGlkZSgpO1xuICB9O1xuXG4gIE1vZGFsLnByb3RvdHlwZS51cGRhdGVTdHlsZSA9IGZ1bmN0aW9uIHVwZGF0ZVN0eWxlKCkge1xuICAgIGlmICghX2luRE9NMlsnZGVmYXVsdCddKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGRpYWxvZ05vZGUgPSB0aGlzLl9tb2RhbC5nZXREaWFsb2dFbGVtZW50KCk7XG4gICAgdmFyIGRpYWxvZ0hlaWdodCA9IGRpYWxvZ05vZGUuc2Nyb2xsSGVpZ2h0O1xuXG4gICAgdmFyIGRvY3VtZW50ID0gKDAsIF9vd25lckRvY3VtZW50MlsnZGVmYXVsdCddKShkaWFsb2dOb2RlKTtcbiAgICB2YXIgYm9keUlzT3ZlcmZsb3dpbmcgPSAoMCwgX2lzT3ZlcmZsb3dpbmcyWydkZWZhdWx0J10pKF9yZWFjdERvbTJbJ2RlZmF1bHQnXS5maW5kRE9NTm9kZSh0aGlzLnByb3BzLmNvbnRhaW5lciB8fCBkb2N1bWVudC5ib2R5KSk7XG4gICAgdmFyIG1vZGFsSXNPdmVyZmxvd2luZyA9IGRpYWxvZ0hlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIHBhZGRpbmdSaWdodDogYm9keUlzT3ZlcmZsb3dpbmcgJiYgIW1vZGFsSXNPdmVyZmxvd2luZyA/ICgwLCBfc2Nyb2xsYmFyU2l6ZTJbJ2RlZmF1bHQnXSkoKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgcGFkZGluZ0xlZnQ6ICFib2R5SXNPdmVyZmxvd2luZyAmJiBtb2RhbElzT3ZlcmZsb3dpbmcgPyAoMCwgX3Njcm9sbGJhclNpemUyWydkZWZhdWx0J10pKCkgOiB1bmRlZmluZWRcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBNb2RhbC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGJhY2tkcm9wID0gX3Byb3BzLmJhY2tkcm9wLFxuICAgICAgICBhbmltYXRpb24gPSBfcHJvcHMuYW5pbWF0aW9uLFxuICAgICAgICBzaG93ID0gX3Byb3BzLnNob3csXG4gICAgICAgIERpYWxvZyA9IF9wcm9wcy5kaWFsb2dDb21wb25lbnRDbGFzcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGUgPSBfcHJvcHMuc3R5bGUsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBvbkVudGVyaW5nID0gX3Byb3BzLm9uRW50ZXJpbmcsXG4gICAgICAgIG9uRXhpdGVkID0gX3Byb3BzLm9uRXhpdGVkLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydiYWNrZHJvcCcsICdhbmltYXRpb24nLCAnc2hvdycsICdkaWFsb2dDb21wb25lbnRDbGFzcycsICdjbGFzc05hbWUnLCAnc3R5bGUnLCAnY2hpbGRyZW4nLCAnb25FbnRlcmluZycsICdvbkV4aXRlZCddKTtcblxuICAgIHZhciBfc3BsaXRDb21wb25lbnRQcm9wcyA9ICgwLCBfc3BsaXRDb21wb25lbnRQcm9wczNbJ2RlZmF1bHQnXSkocHJvcHMsIF9Nb2RhbDJbJ2RlZmF1bHQnXSksXG4gICAgICAgIGJhc2VNb2RhbFByb3BzID0gX3NwbGl0Q29tcG9uZW50UHJvcHNbMF0sXG4gICAgICAgIGRpYWxvZ1Byb3BzID0gX3NwbGl0Q29tcG9uZW50UHJvcHNbMV07XG5cbiAgICB2YXIgaW5DbGFzc05hbWUgPSBzaG93ICYmICFhbmltYXRpb24gJiYgJ2luJztcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgIF9Nb2RhbDJbJ2RlZmF1bHQnXSxcbiAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGJhc2VNb2RhbFByb3BzLCB7XG4gICAgICAgIHJlZjogZnVuY3Rpb24gcmVmKGMpIHtcbiAgICAgICAgICBfdGhpczIuX21vZGFsID0gYztcbiAgICAgICAgfSxcbiAgICAgICAgc2hvdzogc2hvdyxcbiAgICAgICAgb25FbnRlcmluZzogKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKG9uRW50ZXJpbmcsIHRoaXMuaGFuZGxlRW50ZXJpbmcpLFxuICAgICAgICBvbkV4aXRlZDogKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKG9uRXhpdGVkLCB0aGlzLmhhbmRsZUV4aXRlZCksXG4gICAgICAgIGJhY2tkcm9wOiBiYWNrZHJvcCxcbiAgICAgICAgYmFja2Ryb3BDbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKHByb3BzLCAnYmFja2Ryb3AnKSwgaW5DbGFzc05hbWUpLFxuICAgICAgICBjb250YWluZXJDbGFzc05hbWU6ICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShwcm9wcywgJ29wZW4nKSxcbiAgICAgICAgdHJhbnNpdGlvbjogYW5pbWF0aW9uID8gX0ZhZGUyWydkZWZhdWx0J10gOiB1bmRlZmluZWQsXG4gICAgICAgIGRpYWxvZ1RyYW5zaXRpb25UaW1lb3V0OiBNb2RhbC5UUkFOU0lUSU9OX0RVUkFUSU9OLFxuICAgICAgICBiYWNrZHJvcFRyYW5zaXRpb25UaW1lb3V0OiBNb2RhbC5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OXG4gICAgICB9KSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICBEaWFsb2csXG4gICAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGRpYWxvZ1Byb3BzLCB7XG4gICAgICAgICAgc3R5bGU6ICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIHRoaXMuc3RhdGUuc3R5bGUsIHN0eWxlKSxcbiAgICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBpbkNsYXNzTmFtZSksXG4gICAgICAgICAgb25DbGljazogYmFja2Ryb3AgPT09IHRydWUgPyB0aGlzLmhhbmRsZURpYWxvZ0NsaWNrIDogbnVsbFxuICAgICAgICB9KSxcbiAgICAgICAgY2hpbGRyZW5cbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBNb2RhbDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbk1vZGFsLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbk1vZGFsLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbk1vZGFsLmNoaWxkQ29udGV4dFR5cGVzID0gY2hpbGRDb250ZXh0VHlwZXM7XG5cbk1vZGFsLkJvZHkgPSBfTW9kYWxCb2R5MlsnZGVmYXVsdCddO1xuTW9kYWwuSGVhZGVyID0gX01vZGFsSGVhZGVyMlsnZGVmYXVsdCddO1xuTW9kYWwuVGl0bGUgPSBfTW9kYWxUaXRsZTJbJ2RlZmF1bHQnXTtcbk1vZGFsLkZvb3RlciA9IF9Nb2RhbEZvb3RlcjJbJ2RlZmF1bHQnXTtcblxuTW9kYWwuRGlhbG9nID0gX01vZGFsRGlhbG9nMlsnZGVmYXVsdCddO1xuXG5Nb2RhbC5UUkFOU0lUSU9OX0RVUkFUSU9OID0gMzAwO1xuTW9kYWwuQkFDS0RST1BfVFJBTlNJVElPTl9EVVJBVElPTiA9IDE1MDtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnbW9kYWwnLCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzU2l6ZXMpKFtfU3R5bGVDb25maWcuU2l6ZS5MQVJHRSwgX1N0eWxlQ29uZmlnLlNpemUuU01BTExdLCBNb2RhbCkpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfZWxlbWVudFR5cGUgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBjb21wb25lbnRDbGFzczogX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjb21wb25lbnRDbGFzczogJ2Rpdidcbn07XG5cbnZhciBNb2RhbEJvZHkgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShNb2RhbEJvZHksIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE1vZGFsQm9keSgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBNb2RhbEJvZHkpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBNb2RhbEJvZHkucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgQ29tcG9uZW50ID0gX3Byb3BzLmNvbXBvbmVudENsYXNzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjb21wb25lbnRDbGFzcycsICdjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChDb21wb25lbnQsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIE1vZGFsQm9keTtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbk1vZGFsQm9keS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5Nb2RhbEJvZHkuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdtb2RhbC1ib2R5JywgTW9kYWxCb2R5KTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMyA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxudmFyIF9TdHlsZUNvbmZpZyA9IHJlcXVpcmUoJy4vdXRpbHMvU3R5bGVDb25maWcnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQSBjc3MgY2xhc3MgdG8gYXBwbHkgdG8gdGhlIE1vZGFsIGRpYWxvZyBET00gbm9kZS5cbiAgICovXG4gIGRpYWxvZ0NsYXNzTmFtZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmdcbn07XG5cbnZhciBNb2RhbERpYWxvZyA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKE1vZGFsRGlhbG9nLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBNb2RhbERpYWxvZygpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBNb2RhbERpYWxvZyk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIE1vZGFsRGlhbG9nLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9leHRlbmRzMjtcblxuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBkaWFsb2dDbGFzc05hbWUgPSBfcHJvcHMuZGlhbG9nQ2xhc3NOYW1lLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBzdHlsZSA9IF9wcm9wcy5zdHlsZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2RpYWxvZ0NsYXNzTmFtZScsICdjbGFzc05hbWUnLCAnc3R5bGUnLCAnY2hpbGRyZW4nXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGJzQ2xhc3NOYW1lID0gKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMpO1xuXG4gICAgdmFyIG1vZGFsU3R5bGUgPSAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHsgZGlzcGxheTogJ2Jsb2NrJyB9LCBzdHlsZSk7XG5cbiAgICB2YXIgZGlhbG9nQ2xhc3NlcyA9ICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoe30sICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpLCAoX2V4dGVuZHMyID0ge30sIF9leHRlbmRzMltic0NsYXNzTmFtZV0gPSBmYWxzZSwgX2V4dGVuZHMyWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnZGlhbG9nJyldID0gdHJ1ZSwgX2V4dGVuZHMyKSk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnZGl2JyxcbiAgICAgICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgICB0YWJJbmRleDogJy0xJyxcbiAgICAgICAgcm9sZTogJ2RpYWxvZycsXG4gICAgICAgIHN0eWxlOiBtb2RhbFN0eWxlLFxuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBic0NsYXNzTmFtZSlcbiAgICAgIH0pLFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7IGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShkaWFsb2dDbGFzc05hbWUsIGRpYWxvZ0NsYXNzZXMpIH0sXG4gICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICdkaXYnLFxuICAgICAgICAgIHsgY2xhc3NOYW1lOiAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ2NvbnRlbnQnKSwgcm9sZTogJ2RvY3VtZW50JyB9LFxuICAgICAgICAgIGNoaWxkcmVuXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBNb2RhbERpYWxvZztcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbk1vZGFsRGlhbG9nLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnbW9kYWwnLCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzU2l6ZXMpKFtfU3R5bGVDb25maWcuU2l6ZS5MQVJHRSwgX1N0eWxlQ29uZmlnLlNpemUuU01BTExdLCBNb2RhbERpYWxvZykpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfZWxlbWVudFR5cGUgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBjb21wb25lbnRDbGFzczogX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjb21wb25lbnRDbGFzczogJ2Rpdidcbn07XG5cbnZhciBNb2RhbEZvb3RlciA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKE1vZGFsRm9vdGVyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBNb2RhbEZvb3RlcigpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBNb2RhbEZvb3Rlcik7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIE1vZGFsRm9vdGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIENvbXBvbmVudCA9IF9wcm9wcy5jb21wb25lbnRDbGFzcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY29tcG9uZW50Q2xhc3MnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBNb2RhbEZvb3Rlcjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbk1vZGFsRm9vdGVyLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbk1vZGFsRm9vdGVyLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnbW9kYWwtZm9vdGVyJywgTW9kYWxGb290ZXIpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbiA9IHJlcXVpcmUoJy4vdXRpbHMvY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluZWRGdW5jdGlvbik7XG5cbnZhciBfQ2xvc2VCdXR0b24gPSByZXF1aXJlKCcuL0Nsb3NlQnV0dG9uJyk7XG5cbnZhciBfQ2xvc2VCdXR0b24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2xvc2VCdXR0b24pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbi8vIFRPRE86IGBhcmlhLWxhYmVsYCBzaG91bGQgYmUgYGNsb3NlTGFiZWxgLlxuXG52YXIgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogUHJvdmlkZXMgYW4gYWNjZXNzaWJsZSBsYWJlbCBmb3IgdGhlIGNsb3NlXG4gICAqIGJ1dHRvbi4gSXQgaXMgdXNlZCBmb3IgQXNzaXN0aXZlIFRlY2hub2xvZ3kgd2hlbiB0aGUgbGFiZWwgdGV4dCBpcyBub3RcbiAgICogcmVhZGFibGUuXG4gICAqL1xuICBjbG9zZUxhYmVsOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBDb21wb25lbnQgc2hvdWxkIGNvbnRhaW4gYSBjbG9zZSBidXR0b25cbiAgICovXG4gIGNsb3NlQnV0dG9uOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIEEgQ2FsbGJhY2sgZmlyZWQgd2hlbiB0aGUgY2xvc2UgYnV0dG9uIGlzIGNsaWNrZWQuIElmIHVzZWQgZGlyZWN0bHkgaW5zaWRlXG4gICAqIGEgTW9kYWwgY29tcG9uZW50LCB0aGUgb25IaWRlIHdpbGwgYXV0b21hdGljYWxseSBiZSBwcm9wYWdhdGVkIHVwIHRvIHRoZVxuICAgKiBwYXJlbnQgTW9kYWwgYG9uSGlkZWAuXG4gICAqL1xuICBvbkhpZGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuY1xufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgY2xvc2VMYWJlbDogJ0Nsb3NlJyxcbiAgY2xvc2VCdXR0b246IGZhbHNlXG59O1xuXG52YXIgY29udGV4dFR5cGVzID0ge1xuICAkYnNfbW9kYWw6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc2hhcGUoe1xuICAgIG9uSGlkZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jXG4gIH0pXG59O1xuXG52YXIgTW9kYWxIZWFkZXIgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShNb2RhbEhlYWRlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTW9kYWxIZWFkZXIoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgTW9kYWxIZWFkZXIpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBNb2RhbEhlYWRlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjbG9zZUxhYmVsID0gX3Byb3BzLmNsb3NlTGFiZWwsXG4gICAgICAgIGNsb3NlQnV0dG9uID0gX3Byb3BzLmNsb3NlQnV0dG9uLFxuICAgICAgICBvbkhpZGUgPSBfcHJvcHMub25IaWRlLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY2xvc2VMYWJlbCcsICdjbG9zZUJ1dHRvbicsICdvbkhpZGUnLCAnY2xhc3NOYW1lJywgJ2NoaWxkcmVuJ10pO1xuXG5cbiAgICB2YXIgbW9kYWwgPSB0aGlzLmNvbnRleHQuJGJzX21vZGFsO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnZGl2JyxcbiAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgICAgfSksXG4gICAgICBjbG9zZUJ1dHRvbiAmJiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfQ2xvc2VCdXR0b24yWydkZWZhdWx0J10sIHtcbiAgICAgICAgbGFiZWw6IGNsb3NlTGFiZWwsXG4gICAgICAgIG9uQ2xpY2s6ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKShtb2RhbCAmJiBtb2RhbC5vbkhpZGUsIG9uSGlkZSlcbiAgICAgIH0pLFxuICAgICAgY2hpbGRyZW5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBNb2RhbEhlYWRlcjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbk1vZGFsSGVhZGVyLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbk1vZGFsSGVhZGVyLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbk1vZGFsSGVhZGVyLmNvbnRleHRUeXBlcyA9IGNvbnRleHRUeXBlcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnbW9kYWwtaGVhZGVyJywgTW9kYWxIZWFkZXIpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfZWxlbWVudFR5cGUgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBjb21wb25lbnRDbGFzczogX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjb21wb25lbnRDbGFzczogJ2g0J1xufTtcblxudmFyIE1vZGFsVGl0bGUgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShNb2RhbFRpdGxlLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBNb2RhbFRpdGxlKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIE1vZGFsVGl0bGUpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBNb2RhbFRpdGxlLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIENvbXBvbmVudCA9IF9wcm9wcy5jb21wb25lbnRDbGFzcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY29tcG9uZW50Q2xhc3MnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBNb2RhbFRpdGxlO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuTW9kYWxUaXRsZS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5Nb2RhbFRpdGxlLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnbW9kYWwtdGl0bGUnLCBNb2RhbFRpdGxlKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMyA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9rZXljb2RlID0gcmVxdWlyZSgna2V5Y29kZScpO1xuXG52YXIgX2tleWNvZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfa2V5Y29kZSk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfcmVhY3REb20gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcblxudmFyIF9yZWFjdERvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdERvbSk7XG5cbnZhciBfYWxsID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvYWxsJyk7XG5cbnZhciBfYWxsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FsbCk7XG5cbnZhciBfd2FybmluZyA9IHJlcXVpcmUoJ3dhcm5pbmcnKTtcblxudmFyIF93YXJuaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3dhcm5pbmcpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbiA9IHJlcXVpcmUoJy4vdXRpbHMvY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluZWRGdW5jdGlvbik7XG5cbnZhciBfVmFsaWRDb21wb25lbnRDaGlsZHJlbiA9IHJlcXVpcmUoJy4vdXRpbHMvVmFsaWRDb21wb25lbnRDaGlsZHJlbicpO1xuXG52YXIgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVmFsaWRDb21wb25lbnRDaGlsZHJlbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuLy8gVE9ETzogU2hvdWxkIHdlIGV4cG9zZSBgPE5hdkl0ZW0+YCBhcyBgPE5hdi5JdGVtPmA/XG5cbi8vIFRPRE86IFRoaXMgYGJzU3R5bGVgIGlzIHZlcnkgdW5saWtlIHRoZSBvdGhlcnMuIFNob3VsZCB3ZSByZW5hbWUgaXQ/XG5cbi8vIFRPRE86IGBwdWxsUmlnaHRgIGFuZCBgcHVsbExlZnRgIGRvbid0IHJlbmRlciByaWdodCBvdXRzaWRlIG9mIGBuYXZiYXJgLlxuLy8gQ29uc2lkZXIgcmVuYW1pbmcgb3IgcmVwbGFjaW5nIHRoZW0uXG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBNYXJrcyB0aGUgTmF2SXRlbSB3aXRoIGEgbWF0Y2hpbmcgYGV2ZW50S2V5YCBhcyBhY3RpdmUuIEhhcyBhXG4gICAqIGhpZ2hlciBwcmVjZWRlbmNlIG92ZXIgYGFjdGl2ZUhyZWZgLlxuICAgKi9cbiAgYWN0aXZlS2V5OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmFueSxcblxuICAvKipcbiAgICogTWFya3MgdGhlIGNoaWxkIE5hdkl0ZW0gd2l0aCBhIG1hdGNoaW5nIGBocmVmYCBwcm9wIGFzIGFjdGl2ZS5cbiAgICovXG4gIGFjdGl2ZUhyZWY6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBOYXZJdGVtcyBhcmUgYmUgcG9zaXRpb25lZCB2ZXJ0aWNhbGx5LlxuICAgKi9cbiAgc3RhY2tlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIGp1c3RpZmllZDogKDAsIF9hbGwyWydkZWZhdWx0J10pKF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIganVzdGlmaWVkID0gX3JlZi5qdXN0aWZpZWQsXG4gICAgICAgIG5hdmJhciA9IF9yZWYubmF2YmFyO1xuICAgIHJldHVybiBqdXN0aWZpZWQgJiYgbmF2YmFyID8gRXJyb3IoJ2p1c3RpZmllZCBuYXZiYXIgYE5hdmBzIGFyZSBub3Qgc3VwcG9ydGVkJykgOiBudWxsO1xuICB9KSxcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBmaXJlZCB3aGVuIGEgTmF2SXRlbSBpcyBzZWxlY3RlZC5cbiAgICpcbiAgICogYGBganNcbiAgICogZnVuY3Rpb24gKFxuICAgKiBcdEFueSBldmVudEtleSxcbiAgICogXHRTeW50aGV0aWNFdmVudCBldmVudD9cbiAgICogKVxuICAgKiBgYGBcbiAgICovXG4gIG9uU2VsZWN0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEFSSUEgcm9sZSBmb3IgdGhlIE5hdiwgaW4gdGhlIGNvbnRleHQgb2YgYSBUYWJDb250YWluZXIsIHRoZSBkZWZhdWx0IHdpbGxcbiAgICogYmUgc2V0IHRvIFwidGFibGlzdFwiLCBidXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIE5hdiB3aGVuIHNldCBleHBsaWNpdGx5LlxuICAgKlxuICAgKiBXaGVuIHRoZSByb2xlIGlzIHNldCB0byBcInRhYmxpc3RcIiBOYXZJdGVtIGZvY3VzIGlzIG1hbmFnZWQgYWNjb3JkaW5nIHRvXG4gICAqIHRoZSBBUklBIGF1dGhvcmluZyBwcmFjdGljZXMgZm9yIHRhYnM6XG4gICAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELXdhaS1hcmlhLXByYWN0aWNlcy0yMDEzMDMwNy8jdGFicGFuZWxcbiAgICovXG4gIHJvbGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBBcHBseSBzdHlsaW5nIGFuIGFsaWdubWVudCBmb3IgdXNlIGluIGEgTmF2YmFyLiBUaGlzIHByb3Agd2lsbCBiZSBzZXRcbiAgICogYXV0b21hdGljYWxseSB3aGVuIHRoZSBOYXYgaXMgdXNlZCBpbnNpZGUgYSBOYXZiYXIuXG4gICAqL1xuICBuYXZiYXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogRmxvYXQgdGhlIE5hdiB0byB0aGUgcmlnaHQuIFdoZW4gYG5hdmJhcmAgaXMgYHRydWVgIHRoZSBhcHByb3ByaWF0ZVxuICAgKiBjb250ZXh0dWFsIGNsYXNzZXMgYXJlIGFkZGVkIGFzIHdlbGwuXG4gICAqL1xuICBwdWxsUmlnaHQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogRmxvYXQgdGhlIE5hdiB0byB0aGUgbGVmdC4gV2hlbiBgbmF2YmFyYCBpcyBgdHJ1ZWAgdGhlIGFwcHJvcHJpYXRlXG4gICAqIGNvbnRleHR1YWwgY2xhc3NlcyBhcmUgYWRkZWQgYXMgd2VsbC5cbiAgICovXG4gIHB1bGxMZWZ0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2xcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGp1c3RpZmllZDogZmFsc2UsXG4gIHB1bGxSaWdodDogZmFsc2UsXG4gIHB1bGxMZWZ0OiBmYWxzZSxcbiAgc3RhY2tlZDogZmFsc2Vcbn07XG5cbnZhciBjb250ZXh0VHlwZXMgPSB7XG4gICRic19uYXZiYXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc2hhcGUoe1xuICAgIGJzQ2xhc3M6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICAgIG9uU2VsZWN0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmNcbiAgfSksXG5cbiAgJGJzX3RhYkNvbnRhaW5lcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zaGFwZSh7XG4gICAgYWN0aXZlS2V5OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmFueSxcbiAgICBvblNlbGVjdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLmlzUmVxdWlyZWQsXG4gICAgZ2V0VGFiSWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYy5pc1JlcXVpcmVkLFxuICAgIGdldFBhbmVJZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLmlzUmVxdWlyZWRcbiAgfSlcbn07XG5cbnZhciBOYXYgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShOYXYsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE5hdigpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBOYXYpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBOYXYucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIGlmICghdGhpcy5fbmVlZHNSZWZvY3VzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbmVlZHNSZWZvY3VzID0gZmFsc2U7XG5cbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xuXG4gICAgdmFyIF9nZXRBY3RpdmVQcm9wcyA9IHRoaXMuZ2V0QWN0aXZlUHJvcHMoKSxcbiAgICAgICAgYWN0aXZlS2V5ID0gX2dldEFjdGl2ZVByb3BzLmFjdGl2ZUtleSxcbiAgICAgICAgYWN0aXZlSHJlZiA9IF9nZXRBY3RpdmVQcm9wcy5hY3RpdmVIcmVmO1xuXG4gICAgdmFyIGFjdGl2ZUNoaWxkID0gX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yWydkZWZhdWx0J10uZmluZChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICByZXR1cm4gX3RoaXMyLmlzQWN0aXZlKGNoaWxkLCBhY3RpdmVLZXksIGFjdGl2ZUhyZWYpO1xuICAgIH0pO1xuXG4gICAgdmFyIGNoaWxkcmVuQXJyYXkgPSBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjJbJ2RlZmF1bHQnXS50b0FycmF5KGNoaWxkcmVuKTtcbiAgICB2YXIgYWN0aXZlQ2hpbGRJbmRleCA9IGNoaWxkcmVuQXJyYXkuaW5kZXhPZihhY3RpdmVDaGlsZCk7XG5cbiAgICB2YXIgY2hpbGROb2RlcyA9IF9yZWFjdERvbTJbJ2RlZmF1bHQnXS5maW5kRE9NTm9kZSh0aGlzKS5jaGlsZHJlbjtcbiAgICB2YXIgYWN0aXZlTm9kZSA9IGNoaWxkTm9kZXMgJiYgY2hpbGROb2Rlc1thY3RpdmVDaGlsZEluZGV4XTtcblxuICAgIGlmICghYWN0aXZlTm9kZSB8fCAhYWN0aXZlTm9kZS5maXJzdENoaWxkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYWN0aXZlTm9kZS5maXJzdENoaWxkLmZvY3VzKCk7XG4gIH07XG5cbiAgTmF2LnByb3RvdHlwZS5oYW5kbGVUYWJLZXlEb3duID0gZnVuY3Rpb24gaGFuZGxlVGFiS2V5RG93bihvblNlbGVjdCwgZXZlbnQpIHtcbiAgICB2YXIgbmV4dEFjdGl2ZUNoaWxkID0gdm9pZCAwO1xuXG4gICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICBjYXNlIF9rZXljb2RlMlsnZGVmYXVsdCddLmNvZGVzLmxlZnQ6XG4gICAgICBjYXNlIF9rZXljb2RlMlsnZGVmYXVsdCddLmNvZGVzLnVwOlxuICAgICAgICBuZXh0QWN0aXZlQ2hpbGQgPSB0aGlzLmdldE5leHRBY3RpdmVDaGlsZCgtMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBfa2V5Y29kZTJbJ2RlZmF1bHQnXS5jb2Rlcy5yaWdodDpcbiAgICAgIGNhc2UgX2tleWNvZGUyWydkZWZhdWx0J10uY29kZXMuZG93bjpcbiAgICAgICAgbmV4dEFjdGl2ZUNoaWxkID0gdGhpcy5nZXROZXh0QWN0aXZlQ2hpbGQoMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gSXQgd2FzIGEgZGlmZmVyZW50IGtleTsgZG9uJ3QgaGFuZGxlIHRoaXMga2V5cHJlc3MuXG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKG9uU2VsZWN0ICYmIG5leHRBY3RpdmVDaGlsZCAmJiBuZXh0QWN0aXZlQ2hpbGQucHJvcHMuZXZlbnRLZXkgIT0gbnVsbCkge1xuICAgICAgb25TZWxlY3QobmV4dEFjdGl2ZUNoaWxkLnByb3BzLmV2ZW50S2V5KTtcbiAgICB9XG5cbiAgICB0aGlzLl9uZWVkc1JlZm9jdXMgPSB0cnVlO1xuICB9O1xuXG4gIE5hdi5wcm90b3R5cGUuZ2V0TmV4dEFjdGl2ZUNoaWxkID0gZnVuY3Rpb24gZ2V0TmV4dEFjdGl2ZUNoaWxkKG9mZnNldCkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdmFyIGNoaWxkcmVuID0gdGhpcy5wcm9wcy5jaGlsZHJlbjtcblxuICAgIHZhciB2YWxpZENoaWxkcmVuID0gY2hpbGRyZW4uZmlsdGVyKGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgcmV0dXJuIGNoaWxkLnByb3BzLmV2ZW50S2V5ICE9IG51bGwgJiYgIWNoaWxkLnByb3BzLmRpc2FibGVkO1xuICAgIH0pO1xuXG4gICAgdmFyIF9nZXRBY3RpdmVQcm9wczIgPSB0aGlzLmdldEFjdGl2ZVByb3BzKCksXG4gICAgICAgIGFjdGl2ZUtleSA9IF9nZXRBY3RpdmVQcm9wczIuYWN0aXZlS2V5LFxuICAgICAgICBhY3RpdmVIcmVmID0gX2dldEFjdGl2ZVByb3BzMi5hY3RpdmVIcmVmO1xuXG4gICAgdmFyIGFjdGl2ZUNoaWxkID0gX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yWydkZWZhdWx0J10uZmluZChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICByZXR1cm4gX3RoaXMzLmlzQWN0aXZlKGNoaWxkLCBhY3RpdmVLZXksIGFjdGl2ZUhyZWYpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhpcyBhc3N1bWVzIHRoZSBhY3RpdmUgY2hpbGQgaXMgbm90IGRpc2FibGVkLlxuICAgIHZhciBhY3RpdmVDaGlsZEluZGV4ID0gdmFsaWRDaGlsZHJlbi5pbmRleE9mKGFjdGl2ZUNoaWxkKTtcbiAgICBpZiAoYWN0aXZlQ2hpbGRJbmRleCA9PT0gLTEpIHtcbiAgICAgIC8vIFNvbWV0aGluZyBoYXMgZ29uZSB3cm9uZy4gU2VsZWN0IHRoZSBmaXJzdCB2YWxpZCBjaGlsZCB3ZSBjYW4gZmluZC5cbiAgICAgIHJldHVybiB2YWxpZENoaWxkcmVuWzBdO1xuICAgIH1cblxuICAgIHZhciBuZXh0SW5kZXggPSBhY3RpdmVDaGlsZEluZGV4ICsgb2Zmc2V0O1xuICAgIHZhciBudW1WYWxpZENoaWxkcmVuID0gdmFsaWRDaGlsZHJlbi5sZW5ndGg7XG5cbiAgICBpZiAobmV4dEluZGV4ID49IG51bVZhbGlkQ2hpbGRyZW4pIHtcbiAgICAgIG5leHRJbmRleCA9IDA7XG4gICAgfSBlbHNlIGlmIChuZXh0SW5kZXggPCAwKSB7XG4gICAgICBuZXh0SW5kZXggPSBudW1WYWxpZENoaWxkcmVuIC0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsaWRDaGlsZHJlbltuZXh0SW5kZXhdO1xuICB9O1xuXG4gIE5hdi5wcm90b3R5cGUuZ2V0QWN0aXZlUHJvcHMgPSBmdW5jdGlvbiBnZXRBY3RpdmVQcm9wcygpIHtcbiAgICB2YXIgdGFiQ29udGFpbmVyID0gdGhpcy5jb250ZXh0LiRic190YWJDb250YWluZXI7XG5cbiAgICBpZiAodGFiQ29udGFpbmVyKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gKDAsIF93YXJuaW5nMlsnZGVmYXVsdCddKSh0aGlzLnByb3BzLmFjdGl2ZUtleSA9PSBudWxsICYmICF0aGlzLnByb3BzLmFjdGl2ZUhyZWYsICdTcGVjaWZ5aW5nIGEgYDxOYXY+YCBgYWN0aXZlS2V5YCBvciBgYWN0aXZlSHJlZmAgaW4gdGhlIGNvbnRleHQgb2YgJyArICdhIGA8VGFiQ29udGFpbmVyPmAgaXMgbm90IHN1cHBvcnRlZC4gSW5zdGVhZCB1c2UgYDxUYWJDb250YWluZXIgJyArICgnYWN0aXZlS2V5PXsnICsgdGhpcy5wcm9wcy5hY3RpdmVLZXkgKyAnfSAvPmAuJykpIDogdm9pZCAwO1xuXG4gICAgICByZXR1cm4gdGFiQ29udGFpbmVyO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnByb3BzO1xuICB9O1xuXG4gIE5hdi5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiBpc0FjdGl2ZShfcmVmMiwgYWN0aXZlS2V5LCBhY3RpdmVIcmVmKSB7XG4gICAgdmFyIHByb3BzID0gX3JlZjIucHJvcHM7XG5cbiAgICBpZiAocHJvcHMuYWN0aXZlIHx8IGFjdGl2ZUtleSAhPSBudWxsICYmIHByb3BzLmV2ZW50S2V5ID09PSBhY3RpdmVLZXkgfHwgYWN0aXZlSHJlZiAmJiBwcm9wcy5ocmVmID09PSBhY3RpdmVIcmVmKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcHMuYWN0aXZlO1xuICB9O1xuXG4gIE5hdi5wcm90b3R5cGUuZ2V0VGFiUHJvcHMgPSBmdW5jdGlvbiBnZXRUYWJQcm9wcyhjaGlsZCwgdGFiQ29udGFpbmVyLCBuYXZSb2xlLCBhY3RpdmUsIG9uU2VsZWN0KSB7XG4gICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICBpZiAoIXRhYkNvbnRhaW5lciAmJiBuYXZSb2xlICE9PSAndGFibGlzdCcpIHtcbiAgICAgIC8vIE5vIHRhYiBwcm9wcyBoZXJlLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIF9jaGlsZCRwcm9wcyA9IGNoaWxkLnByb3BzLFxuICAgICAgICBpZCA9IF9jaGlsZCRwcm9wcy5pZCxcbiAgICAgICAgY29udHJvbHMgPSBfY2hpbGQkcHJvcHNbJ2FyaWEtY29udHJvbHMnXSxcbiAgICAgICAgZXZlbnRLZXkgPSBfY2hpbGQkcHJvcHMuZXZlbnRLZXksXG4gICAgICAgIHJvbGUgPSBfY2hpbGQkcHJvcHMucm9sZSxcbiAgICAgICAgb25LZXlEb3duID0gX2NoaWxkJHByb3BzLm9uS2V5RG93bixcbiAgICAgICAgdGFiSW5kZXggPSBfY2hpbGQkcHJvcHMudGFiSW5kZXg7XG5cblxuICAgIGlmICh0YWJDb250YWluZXIpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyAoMCwgX3dhcm5pbmcyWydkZWZhdWx0J10pKCFpZCAmJiAhY29udHJvbHMsICdJbiB0aGUgY29udGV4dCBvZiBhIGA8VGFiQ29udGFpbmVyPmAsIGA8TmF2SXRlbT5gcyBhcmUgZ2l2ZW4gJyArICdnZW5lcmF0ZWQgYGlkYCBhbmQgYGFyaWEtY29udHJvbHNgIGF0dHJpYnV0ZXMgZm9yIHRoZSBzYWtlIG9mICcgKyAncHJvcGVyIGNvbXBvbmVudCBhY2Nlc3NpYmlsaXR5LiBBbnkgcHJvdmlkZWQgb25lcyB3aWxsIGJlIGlnbm9yZWQuICcgKyAnVG8gY29udHJvbCB0aGVzZSBhdHRyaWJ1dGVzIGRpcmVjdGx5LCBwcm92aWRlIGEgYGdlbmVyYXRlQ2hpbGRJZGAgJyArICdwcm9wIHRvIHRoZSBwYXJlbnQgYDxUYWJDb250YWluZXI+YC4nKSA6IHZvaWQgMDtcblxuICAgICAgaWQgPSB0YWJDb250YWluZXIuZ2V0VGFiSWQoZXZlbnRLZXkpO1xuICAgICAgY29udHJvbHMgPSB0YWJDb250YWluZXIuZ2V0UGFuZUlkKGV2ZW50S2V5KTtcbiAgICB9XG5cbiAgICBpZiAobmF2Um9sZSA9PT0gJ3RhYmxpc3QnKSB7XG4gICAgICByb2xlID0gcm9sZSB8fCAndGFiJztcbiAgICAgIG9uS2V5RG93biA9ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKShmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzNC5oYW5kbGVUYWJLZXlEb3duKG9uU2VsZWN0LCBldmVudCk7XG4gICAgICB9LCBvbktleURvd24pO1xuICAgICAgdGFiSW5kZXggPSBhY3RpdmUgPyB0YWJJbmRleCA6IC0xO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogaWQsXG4gICAgICByb2xlOiByb2xlLFxuICAgICAgb25LZXlEb3duOiBvbktleURvd24sXG4gICAgICAnYXJpYS1jb250cm9scyc6IGNvbnRyb2xzLFxuICAgICAgdGFiSW5kZXg6IHRhYkluZGV4XG4gICAgfTtcbiAgfTtcblxuICBOYXYucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX2V4dGVuZHMyLFxuICAgICAgICBfdGhpczUgPSB0aGlzO1xuXG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIHN0YWNrZWQgPSBfcHJvcHMuc3RhY2tlZCxcbiAgICAgICAganVzdGlmaWVkID0gX3Byb3BzLmp1c3RpZmllZCxcbiAgICAgICAgb25TZWxlY3QgPSBfcHJvcHMub25TZWxlY3QsXG4gICAgICAgIHByb3BzUm9sZSA9IF9wcm9wcy5yb2xlLFxuICAgICAgICBwcm9wc05hdmJhciA9IF9wcm9wcy5uYXZiYXIsXG4gICAgICAgIHB1bGxSaWdodCA9IF9wcm9wcy5wdWxsUmlnaHQsXG4gICAgICAgIHB1bGxMZWZ0ID0gX3Byb3BzLnB1bGxMZWZ0LFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnc3RhY2tlZCcsICdqdXN0aWZpZWQnLCAnb25TZWxlY3QnLCAncm9sZScsICduYXZiYXInLCAncHVsbFJpZ2h0JywgJ3B1bGxMZWZ0JywgJ2NsYXNzTmFtZScsICdjaGlsZHJlbiddKTtcblxuXG4gICAgdmFyIHRhYkNvbnRhaW5lciA9IHRoaXMuY29udGV4dC4kYnNfdGFiQ29udGFpbmVyO1xuICAgIHZhciByb2xlID0gcHJvcHNSb2xlIHx8ICh0YWJDb250YWluZXIgPyAndGFibGlzdCcgOiBudWxsKTtcblxuICAgIHZhciBfZ2V0QWN0aXZlUHJvcHMzID0gdGhpcy5nZXRBY3RpdmVQcm9wcygpLFxuICAgICAgICBhY3RpdmVLZXkgPSBfZ2V0QWN0aXZlUHJvcHMzLmFjdGl2ZUtleSxcbiAgICAgICAgYWN0aXZlSHJlZiA9IF9nZXRBY3RpdmVQcm9wczMuYWN0aXZlSHJlZjtcblxuICAgIGRlbGV0ZSBwcm9wcy5hY3RpdmVLZXk7IC8vIEFjY2Vzc2VkIHZpYSB0aGlzLmdldEFjdGl2ZVByb3BzKCkuXG4gICAgZGVsZXRlIHByb3BzLmFjdGl2ZUhyZWY7IC8vIEFjY2Vzc2VkIHZpYSB0aGlzLmdldEFjdGl2ZVByb3BzKCkuXG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKSwgKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdzdGFja2VkJyldID0gc3RhY2tlZCwgX2V4dGVuZHMyWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnanVzdGlmaWVkJyldID0ganVzdGlmaWVkLCBfZXh0ZW5kczIpKTtcblxuICAgIHZhciBuYXZiYXIgPSBwcm9wc05hdmJhciAhPSBudWxsID8gcHJvcHNOYXZiYXIgOiB0aGlzLmNvbnRleHQuJGJzX25hdmJhcjtcbiAgICB2YXIgcHVsbExlZnRDbGFzc05hbWUgPSB2b2lkIDA7XG4gICAgdmFyIHB1bGxSaWdodENsYXNzTmFtZSA9IHZvaWQgMDtcblxuICAgIGlmIChuYXZiYXIpIHtcbiAgICAgIHZhciBuYXZiYXJQcm9wcyA9IHRoaXMuY29udGV4dC4kYnNfbmF2YmFyIHx8IHsgYnNDbGFzczogJ25hdmJhcicgfTtcblxuICAgICAgY2xhc3Nlc1soMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkobmF2YmFyUHJvcHMsICduYXYnKV0gPSB0cnVlO1xuXG4gICAgICBwdWxsUmlnaHRDbGFzc05hbWUgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkobmF2YmFyUHJvcHMsICdyaWdodCcpO1xuICAgICAgcHVsbExlZnRDbGFzc05hbWUgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkobmF2YmFyUHJvcHMsICdsZWZ0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHB1bGxSaWdodENsYXNzTmFtZSA9ICdwdWxsLXJpZ2h0JztcbiAgICAgIHB1bGxMZWZ0Q2xhc3NOYW1lID0gJ3B1bGwtbGVmdCc7XG4gICAgfVxuXG4gICAgY2xhc3Nlc1twdWxsUmlnaHRDbGFzc05hbWVdID0gcHVsbFJpZ2h0O1xuICAgIGNsYXNzZXNbcHVsbExlZnRDbGFzc05hbWVdID0gcHVsbExlZnQ7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAndWwnLFxuICAgICAgKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICAgIHJvbGU6IHJvbGUsXG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgICB9KSxcbiAgICAgIF9WYWxpZENvbXBvbmVudENoaWxkcmVuMlsnZGVmYXVsdCddLm1hcChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHZhciBhY3RpdmUgPSBfdGhpczUuaXNBY3RpdmUoY2hpbGQsIGFjdGl2ZUtleSwgYWN0aXZlSHJlZik7XG4gICAgICAgIHZhciBjaGlsZE9uU2VsZWN0ID0gKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKGNoaWxkLnByb3BzLm9uU2VsZWN0LCBvblNlbGVjdCwgbmF2YmFyICYmIG5hdmJhci5vblNlbGVjdCwgdGFiQ29udGFpbmVyICYmIHRhYkNvbnRhaW5lci5vblNlbGVjdCk7XG5cbiAgICAgICAgcmV0dXJuICgwLCBfcmVhY3QuY2xvbmVFbGVtZW50KShjaGlsZCwgKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgX3RoaXM1LmdldFRhYlByb3BzKGNoaWxkLCB0YWJDb250YWluZXIsIHJvbGUsIGFjdGl2ZSwgY2hpbGRPblNlbGVjdCksIHtcbiAgICAgICAgICBhY3RpdmU6IGFjdGl2ZSxcbiAgICAgICAgICBhY3RpdmVLZXk6IGFjdGl2ZUtleSxcbiAgICAgICAgICBhY3RpdmVIcmVmOiBhY3RpdmVIcmVmLFxuICAgICAgICAgIG9uU2VsZWN0OiBjaGlsZE9uU2VsZWN0XG4gICAgICAgIH0pKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gTmF2O1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuTmF2LnByb3BUeXBlcyA9IHByb3BUeXBlcztcbk5hdi5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5OYXYuY29udGV4dFR5cGVzID0gY29udGV4dFR5cGVzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCduYXYnLCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzU3R5bGVzKShbJ3RhYnMnLCAncGlsbHMnXSwgTmF2KSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfRHJvcGRvd24gPSByZXF1aXJlKCcuL0Ryb3Bkb3duJyk7XG5cbnZhciBfRHJvcGRvd24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRHJvcGRvd24pO1xuXG52YXIgX3NwbGl0Q29tcG9uZW50UHJvcHMyID0gcmVxdWlyZSgnLi91dGlscy9zcGxpdENvbXBvbmVudFByb3BzJyk7XG5cbnZhciBfc3BsaXRDb21wb25lbnRQcm9wczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zcGxpdENvbXBvbmVudFByb3BzMik7XG5cbnZhciBfVmFsaWRDb21wb25lbnRDaGlsZHJlbiA9IHJlcXVpcmUoJy4vdXRpbHMvVmFsaWRDb21wb25lbnRDaGlsZHJlbicpO1xuXG52YXIgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVmFsaWRDb21wb25lbnRDaGlsZHJlbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9ICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIF9Ecm9wZG93bjJbJ2RlZmF1bHQnXS5wcm9wVHlwZXMsIHtcblxuICAvLyBUb2dnbGUgcHJvcHMuXG4gIHRpdGxlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm5vZGUuaXNSZXF1aXJlZCxcbiAgbm9DYXJldDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBhY3RpdmU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvLyBPdmVycmlkZSBnZW5lcmF0ZWQgZG9jcyBmcm9tIDxEcm9wZG93bj4uXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2hpbGRyZW46IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubm9kZVxufSk7XG5cbnZhciBOYXZEcm9wZG93biA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKE5hdkRyb3Bkb3duLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBOYXZEcm9wZG93bigpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBOYXZEcm9wZG93bik7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIE5hdkRyb3Bkb3duLnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uIGlzQWN0aXZlKF9yZWYsIGFjdGl2ZUtleSwgYWN0aXZlSHJlZikge1xuICAgIHZhciBwcm9wcyA9IF9yZWYucHJvcHM7XG5cbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIGlmIChwcm9wcy5hY3RpdmUgfHwgYWN0aXZlS2V5ICE9IG51bGwgJiYgcHJvcHMuZXZlbnRLZXkgPT09IGFjdGl2ZUtleSB8fCBhY3RpdmVIcmVmICYmIHByb3BzLmhyZWYgPT09IGFjdGl2ZUhyZWYpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChfVmFsaWRDb21wb25lbnRDaGlsZHJlbjJbJ2RlZmF1bHQnXS5zb21lKHByb3BzLmNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIHJldHVybiBfdGhpczIuaXNBY3RpdmUoY2hpbGQsIGFjdGl2ZUtleSwgYWN0aXZlSHJlZik7XG4gICAgfSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9wcy5hY3RpdmU7XG4gIH07XG5cbiAgTmF2RHJvcGRvd24ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICB0aXRsZSA9IF9wcm9wcy50aXRsZSxcbiAgICAgICAgYWN0aXZlS2V5ID0gX3Byb3BzLmFjdGl2ZUtleSxcbiAgICAgICAgYWN0aXZlSHJlZiA9IF9wcm9wcy5hY3RpdmVIcmVmLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBzdHlsZSA9IF9wcm9wcy5zdHlsZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ3RpdGxlJywgJ2FjdGl2ZUtleScsICdhY3RpdmVIcmVmJywgJ2NsYXNzTmFtZScsICdzdHlsZScsICdjaGlsZHJlbiddKTtcblxuXG4gICAgdmFyIGFjdGl2ZSA9IHRoaXMuaXNBY3RpdmUodGhpcywgYWN0aXZlS2V5LCBhY3RpdmVIcmVmKTtcbiAgICBkZWxldGUgcHJvcHMuYWN0aXZlOyAvLyBBY2Nlc3NlZCB2aWEgdGhpcy5pc0FjdGl2ZSgpLlxuICAgIGRlbGV0ZSBwcm9wcy5ldmVudEtleTsgLy8gQWNjZXNzZWQgdmlhIHRoaXMuaXNBY3RpdmUoKS5cblxuICAgIHZhciBfc3BsaXRDb21wb25lbnRQcm9wcyA9ICgwLCBfc3BsaXRDb21wb25lbnRQcm9wczNbJ2RlZmF1bHQnXSkocHJvcHMsIF9Ecm9wZG93bjJbJ2RlZmF1bHQnXS5Db250cm9sbGVkQ29tcG9uZW50KSxcbiAgICAgICAgZHJvcGRvd25Qcm9wcyA9IF9zcGxpdENvbXBvbmVudFByb3BzWzBdLFxuICAgICAgICB0b2dnbGVQcm9wcyA9IF9zcGxpdENvbXBvbmVudFByb3BzWzFdO1xuXG4gICAgLy8gVW5saWtlIGZvciB0aGUgb3RoZXIgZHJvcGRvd25zLCBzdHlsaW5nIG5lZWRzIHRvIGdvIHRvIHRoZSBgPERyb3Bkb3duPmBcbiAgICAvLyByYXRoZXIgdGhhbiB0aGUgYDxEcm9wZG93bi5Ub2dnbGU+YC5cblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgIF9Ecm9wZG93bjJbJ2RlZmF1bHQnXSxcbiAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGRyb3Bkb3duUHJvcHMsIHtcbiAgICAgICAgY29tcG9uZW50Q2xhc3M6ICdsaScsXG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIHsgYWN0aXZlOiBhY3RpdmUgfSksXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSksXG4gICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgX0Ryb3Bkb3duMlsnZGVmYXVsdCddLlRvZ2dsZSxcbiAgICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgdG9nZ2xlUHJvcHMsIHsgdXNlQW5jaG9yOiB0cnVlIH0pLFxuICAgICAgICB0aXRsZVxuICAgICAgKSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICBfRHJvcGRvd24yWydkZWZhdWx0J10uTWVudSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yWydkZWZhdWx0J10ubWFwKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNsb25lRWxlbWVudChjaGlsZCwge1xuICAgICAgICAgICAgYWN0aXZlOiBfdGhpczMuaXNBY3RpdmUoY2hpbGQsIGFjdGl2ZUtleSwgYWN0aXZlSHJlZilcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBOYXZEcm9wZG93bjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbk5hdkRyb3Bkb3duLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gTmF2RHJvcGRvd247XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfU2FmZUFuY2hvciA9IHJlcXVpcmUoJy4vU2FmZUFuY2hvcicpO1xuXG52YXIgX1NhZmVBbmNob3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU2FmZUFuY2hvcik7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmVkRnVuY3Rpb24nKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBhY3RpdmU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgZGlzYWJsZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgcm9sZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gIGhyZWY6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICBvbkNsaWNrOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIG9uU2VsZWN0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIGV2ZW50S2V5OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmFueVxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgYWN0aXZlOiBmYWxzZSxcbiAgZGlzYWJsZWQ6IGZhbHNlXG59O1xuXG52YXIgTmF2SXRlbSA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKE5hdkl0ZW0sIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE5hdkl0ZW0ocHJvcHMsIGNvbnRleHQpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBOYXZJdGVtKTtcblxuICAgIHZhciBfdGhpcyA9ICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICBfdGhpcy5oYW5kbGVDbGljayA9IF90aGlzLmhhbmRsZUNsaWNrLmJpbmQoX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIE5hdkl0ZW0ucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZSkge1xuICAgIGlmICh0aGlzLnByb3BzLm9uU2VsZWN0KSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGlmICghdGhpcy5wcm9wcy5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLnByb3BzLm9uU2VsZWN0KHRoaXMucHJvcHMuZXZlbnRLZXksIGUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBOYXZJdGVtLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGFjdGl2ZSA9IF9wcm9wcy5hY3RpdmUsXG4gICAgICAgIGRpc2FibGVkID0gX3Byb3BzLmRpc2FibGVkLFxuICAgICAgICBvbkNsaWNrID0gX3Byb3BzLm9uQ2xpY2ssXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHN0eWxlID0gX3Byb3BzLnN0eWxlLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydhY3RpdmUnLCAnZGlzYWJsZWQnLCAnb25DbGljaycsICdjbGFzc05hbWUnLCAnc3R5bGUnXSk7XG5cblxuICAgIGRlbGV0ZSBwcm9wcy5vblNlbGVjdDtcbiAgICBkZWxldGUgcHJvcHMuZXZlbnRLZXk7XG5cbiAgICAvLyBUaGVzZSBhcmUgaW5qZWN0ZWQgZG93biBieSBgPE5hdj5gIGZvciBidWlsZGluZyBgPFN1Yk5hdj5gcy5cbiAgICBkZWxldGUgcHJvcHMuYWN0aXZlS2V5O1xuICAgIGRlbGV0ZSBwcm9wcy5hY3RpdmVIcmVmO1xuXG4gICAgaWYgKCFwcm9wcy5yb2xlKSB7XG4gICAgICBpZiAocHJvcHMuaHJlZiA9PT0gJyMnKSB7XG4gICAgICAgIHByb3BzLnJvbGUgPSAnYnV0dG9uJztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByb3BzLnJvbGUgPT09ICd0YWInKSB7XG4gICAgICBwcm9wc1snYXJpYS1zZWxlY3RlZCddID0gYWN0aXZlO1xuICAgIH1cblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICdsaScsXG4gICAgICB7XG4gICAgICAgIHJvbGU6ICdwcmVzZW50YXRpb24nLFxuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCB7IGFjdGl2ZTogYWN0aXZlLCBkaXNhYmxlZDogZGlzYWJsZWQgfSksXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9TYWZlQW5jaG9yMlsnZGVmYXVsdCddLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBwcm9wcywge1xuICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgIG9uQ2xpY2s6ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKShvbkNsaWNrLCB0aGlzLmhhbmRsZUNsaWNrKVxuICAgICAgfSkpXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gTmF2SXRlbTtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbk5hdkl0ZW0ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuTmF2SXRlbS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IE5hdkl0ZW07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczMgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHM0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczMpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfZWxlbWVudFR5cGUgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlKTtcblxudmFyIF91bmNvbnRyb2xsYWJsZSA9IHJlcXVpcmUoJ3VuY29udHJvbGxhYmxlJyk7XG5cbnZhciBfdW5jb250cm9sbGFibGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdW5jb250cm9sbGFibGUpO1xuXG52YXIgX0dyaWQgPSByZXF1aXJlKCcuL0dyaWQnKTtcblxudmFyIF9HcmlkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0dyaWQpO1xuXG52YXIgX05hdmJhckJyYW5kID0gcmVxdWlyZSgnLi9OYXZiYXJCcmFuZCcpO1xuXG52YXIgX05hdmJhckJyYW5kMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05hdmJhckJyYW5kKTtcblxudmFyIF9OYXZiYXJDb2xsYXBzZSA9IHJlcXVpcmUoJy4vTmF2YmFyQ29sbGFwc2UnKTtcblxudmFyIF9OYXZiYXJDb2xsYXBzZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9OYXZiYXJDb2xsYXBzZSk7XG5cbnZhciBfTmF2YmFySGVhZGVyID0gcmVxdWlyZSgnLi9OYXZiYXJIZWFkZXInKTtcblxudmFyIF9OYXZiYXJIZWFkZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTmF2YmFySGVhZGVyKTtcblxudmFyIF9OYXZiYXJUb2dnbGUgPSByZXF1aXJlKCcuL05hdmJhclRvZ2dsZScpO1xuXG52YXIgX05hdmJhclRvZ2dsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9OYXZiYXJUb2dnbGUpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG52YXIgX1N0eWxlQ29uZmlnID0gcmVxdWlyZSgnLi91dGlscy9TdHlsZUNvbmZpZycpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbiA9IHJlcXVpcmUoJy4vdXRpbHMvY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluZWRGdW5jdGlvbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIGZpeGVkIG5hdmJhciBhbG9uZyB0aGUgdG9wIG9mIHRoZSBzY3JlZW4sIHRoYXQgc2Nyb2xscyB3aXRoIHRoZVxuICAgKiBwYWdlXG4gICAqL1xuICBmaXhlZFRvcDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICAvKipcbiAgICogQ3JlYXRlIGEgZml4ZWQgbmF2YmFyIGFsb25nIHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbiwgdGhhdCBzY3JvbGxzIHdpdGhcbiAgICogdGhlIHBhZ2VcbiAgICovXG4gIGZpeGVkQm90dG9tOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBmdWxsLXdpZHRoIG5hdmJhciB0aGF0IHNjcm9sbHMgYXdheSB3aXRoIHRoZSBwYWdlXG4gICAqL1xuICBzdGF0aWNUb3A6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgLyoqXG4gICAqIEFuIGFsdGVybmF0aXZlIGRhcmsgdmlzdWFsIHN0eWxlIGZvciB0aGUgTmF2YmFyXG4gICAqL1xuICBpbnZlcnNlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIC8qKlxuICAgKiBBbGxvdyB0aGUgTmF2YmFyIHRvIGZsdWlkbHkgYWRqdXN0IHRvIHRoZSBwYWdlIG9yIGNvbnRhaW5lciB3aWR0aCwgaW5zdGVhZFxuICAgKiBvZiBhdCB0aGUgcHJlZGVmaW5lZCBzY3JlZW4gYnJlYWtwb2ludHNcbiAgICovXG4gIGZsdWlkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIFNldCBhIGN1c3RvbSBlbGVtZW50IGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGNvbXBvbmVudENsYXNzOiBfZWxlbWVudFR5cGUyWydkZWZhdWx0J10sXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZpcmVkIHdoZW4gdGhlIGA8TmF2YmFyPmAgYm9keSBjb2xsYXBzZXMgb3IgZXhwYW5kcy4gRmlyZWQgd2hlblxuICAgKiBhIGA8TmF2YmFyLlRvZ2dsZT5gIGlzIGNsaWNrZWQgYW5kIGNhbGxlZCB3aXRoIHRoZSBuZXcgYG5hdkV4cGFuZGVkYFxuICAgKiBib29sZWFuIHZhbHVlLlxuICAgKlxuICAgKiBAY29udHJvbGxhYmxlIG5hdkV4cGFuZGVkXG4gICAqL1xuICBvblRvZ2dsZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICAvKipcbiAgICogQSBjYWxsYmFjayBmaXJlZCB3aGVuIGEgZGVzY2VuZGFudCBvZiBhIGNoaWxkIGA8TmF2PmAgaXMgc2VsZWN0ZWQuIFNob3VsZFxuICAgKiBiZSB1c2VkIHRvIGV4ZWN1dGUgY29tcGxleCBjbG9zaW5nIG9yIG90aGVyIG1pc2NlbGxhbmVvdXMgYWN0aW9ucyBkZXNpcmVkXG4gICAqIGFmdGVyIHNlbGVjdGluZyBhIGRlc2NlbmRhbnQgb2YgYDxOYXY+YC4gRG9lcyBub3RoaW5nIGlmIG5vIGA8TmF2PmAgb3IgYDxOYXY+YFxuICAgKiBkZXNjZW5kYW50cyBleGlzdC4gVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aXRoIGFuIGV2ZW50S2V5LCB3aGljaCBpcyBhXG4gICAqIHByb3AgZnJvbSB0aGUgc2VsZWN0ZWQgYDxOYXY+YCBkZXNjZW5kYW50LCBhbmQgYW4gZXZlbnQuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGZ1bmN0aW9uIChcbiAgICogXHRBbnkgZXZlbnRLZXksXG4gICAqIFx0U3ludGhldGljRXZlbnQgZXZlbnQ/XG4gICAqIClcbiAgICogYGBgXG4gICAqXG4gICAqIEZvciBiYXNpYyBjbG9zaW5nIGJlaGF2aW9yIGFmdGVyIGFsbCBgPE5hdj5gIGRlc2NlbmRhbnQgb25TZWxlY3QgZXZlbnRzIGluXG4gICAqIG1vYmlsZSB2aWV3cG9ydHMsIHRyeSB1c2luZyBjb2xsYXBzZU9uU2VsZWN0LlxuICAgKlxuICAgKiBOb3RlOiBJZiB5b3UgYXJlIG1hbnVhbGx5IGNsb3NpbmcgdGhlIG5hdmJhciB1c2luZyB0aGlzIGBPblNlbGVjdGAgcHJvcCxcbiAgICogZW5zdXJlIHRoYXQgeW91IGFyZSBzZXR0aW5nIGBleHBhbmRlZGAgdG8gZmFsc2UgYW5kIG5vdCAqdG9nZ2xpbmcqIGJldHdlZW5cbiAgICogdHJ1ZSBhbmQgZmFsc2UuXG4gICAqL1xuICBvblNlbGVjdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICAvKipcbiAgICogU2V0cyBgZXhwYW5kZWRgIHRvIGBmYWxzZWAgYWZ0ZXIgdGhlIG9uU2VsZWN0IGV2ZW50IG9mIGEgZGVzY2VuZGFudCBvZiBhXG4gICAqIGNoaWxkIGA8TmF2PmAuIERvZXMgbm90aGluZyBpZiBubyBgPE5hdj5gIG9yIGA8TmF2PmAgZGVzY2VuZGFudHMgZXhpc3QuXG4gICAqXG4gICAqIFRoZSBvblNlbGVjdCBjYWxsYmFjayBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIGZvciBtb3JlIGNvbXBsZXggb3BlcmF0aW9uc1xuICAgKiB0aGF0IG5lZWQgdG8gYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIGBzZWxlY3RgIGV2ZW50IG9mIGA8TmF2PmAgZGVzY2VuZGFudHMuXG4gICAqL1xuICBjb2xsYXBzZU9uU2VsZWN0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIC8qKlxuICAgKiBFeHBsaWNpdGx5IHNldCB0aGUgdmlzaWJsaXR5IG9mIHRoZSBuYXZiYXIgYm9keVxuICAgKlxuICAgKiBAY29udHJvbGxhYmxlIG9uVG9nZ2xlXG4gICAqL1xuICBleHBhbmRlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIHJvbGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nXG59OyAvLyBUT0RPOiBSZW1vdmUgdGhpcyBwcmFnbWEgb25jZSB3ZSB1cGdyYWRlIGVzbGludC1jb25maWctYWlyYm5iLlxuLyogZXNsaW50LWRpc2FibGUgcmVhY3Qvbm8tbXVsdGktY29tcCAqL1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjb21wb25lbnRDbGFzczogJ25hdicsXG4gIGZpeGVkVG9wOiBmYWxzZSxcbiAgZml4ZWRCb3R0b206IGZhbHNlLFxuICBzdGF0aWNUb3A6IGZhbHNlLFxuICBpbnZlcnNlOiBmYWxzZSxcbiAgZmx1aWQ6IGZhbHNlLFxuICBjb2xsYXBzZU9uU2VsZWN0OiBmYWxzZVxufTtcblxudmFyIGNoaWxkQ29udGV4dFR5cGVzID0ge1xuICAkYnNfbmF2YmFyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnNoYXBlKHtcbiAgICBic0NsYXNzOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcbiAgICBleHBhbmRlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICAgIG9uVG9nZ2xlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBvblNlbGVjdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jXG4gIH0pXG59O1xuXG52YXIgTmF2YmFyID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoTmF2YmFyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBOYXZiYXIocHJvcHMsIGNvbnRleHQpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBOYXZiYXIpO1xuXG4gICAgdmFyIF90aGlzID0gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgIF90aGlzLmhhbmRsZVRvZ2dsZSA9IF90aGlzLmhhbmRsZVRvZ2dsZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5oYW5kbGVDb2xsYXBzZSA9IF90aGlzLmhhbmRsZUNvbGxhcHNlLmJpbmQoX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIE5hdmJhci5wcm90b3R5cGUuZ2V0Q2hpbGRDb250ZXh0ID0gZnVuY3Rpb24gZ2V0Q2hpbGRDb250ZXh0KCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBic0NsYXNzID0gX3Byb3BzLmJzQ2xhc3MsXG4gICAgICAgIGV4cGFuZGVkID0gX3Byb3BzLmV4cGFuZGVkLFxuICAgICAgICBvblNlbGVjdCA9IF9wcm9wcy5vblNlbGVjdCxcbiAgICAgICAgY29sbGFwc2VPblNlbGVjdCA9IF9wcm9wcy5jb2xsYXBzZU9uU2VsZWN0O1xuXG5cbiAgICByZXR1cm4ge1xuICAgICAgJGJzX25hdmJhcjoge1xuICAgICAgICBic0NsYXNzOiBic0NsYXNzLFxuICAgICAgICBleHBhbmRlZDogZXhwYW5kZWQsXG4gICAgICAgIG9uVG9nZ2xlOiB0aGlzLmhhbmRsZVRvZ2dsZSxcbiAgICAgICAgb25TZWxlY3Q6ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKShvblNlbGVjdCwgY29sbGFwc2VPblNlbGVjdCA/IHRoaXMuaGFuZGxlQ29sbGFwc2UgOiBudWxsKVxuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgTmF2YmFyLnByb3RvdHlwZS5oYW5kbGVDb2xsYXBzZSA9IGZ1bmN0aW9uIGhhbmRsZUNvbGxhcHNlKCkge1xuICAgIHZhciBfcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgb25Ub2dnbGUgPSBfcHJvcHMyLm9uVG9nZ2xlLFxuICAgICAgICBleHBhbmRlZCA9IF9wcm9wczIuZXhwYW5kZWQ7XG5cblxuICAgIGlmIChleHBhbmRlZCkge1xuICAgICAgb25Ub2dnbGUoZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICBOYXZiYXIucHJvdG90eXBlLmhhbmRsZVRvZ2dsZSA9IGZ1bmN0aW9uIGhhbmRsZVRvZ2dsZSgpIHtcbiAgICB2YXIgX3Byb3BzMyA9IHRoaXMucHJvcHMsXG4gICAgICAgIG9uVG9nZ2xlID0gX3Byb3BzMy5vblRvZ2dsZSxcbiAgICAgICAgZXhwYW5kZWQgPSBfcHJvcHMzLmV4cGFuZGVkO1xuXG5cbiAgICBvblRvZ2dsZSghZXhwYW5kZWQpO1xuICB9O1xuXG4gIE5hdmJhci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICB2YXIgX3Byb3BzNCA9IHRoaXMucHJvcHMsXG4gICAgICAgIENvbXBvbmVudCA9IF9wcm9wczQuY29tcG9uZW50Q2xhc3MsXG4gICAgICAgIGZpeGVkVG9wID0gX3Byb3BzNC5maXhlZFRvcCxcbiAgICAgICAgZml4ZWRCb3R0b20gPSBfcHJvcHM0LmZpeGVkQm90dG9tLFxuICAgICAgICBzdGF0aWNUb3AgPSBfcHJvcHM0LnN0YXRpY1RvcCxcbiAgICAgICAgaW52ZXJzZSA9IF9wcm9wczQuaW52ZXJzZSxcbiAgICAgICAgZmx1aWQgPSBfcHJvcHM0LmZsdWlkLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHM0LmNsYXNzTmFtZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHM0LmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wczQsIFsnY29tcG9uZW50Q2xhc3MnLCAnZml4ZWRUb3AnLCAnZml4ZWRCb3R0b20nLCAnc3RhdGljVG9wJywgJ2ludmVyc2UnLCAnZmx1aWQnLCAnY2xhc3NOYW1lJywgJ2NoaWxkcmVuJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHNBbmRPbWl0ID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHNBbmRPbWl0KShwcm9wcywgWydleHBhbmRlZCcsICdvblRvZ2dsZScsICdvblNlbGVjdCcsICdjb2xsYXBzZU9uU2VsZWN0J10pLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc0FuZE9taXRbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNBbmRPbWl0WzFdO1xuXG4gICAgLy8gd2lsbCByZXN1bHQgaW4gc29tZSBmYWxzZSBwb3NpdGl2ZXMgYnV0IHRoYXQgc2VlbXMgYmV0dGVyXG4gICAgLy8gdGhhbiBmYWxzZSBuZWdhdGl2ZXMuIHN0cmljdCBgdW5kZWZpbmVkYCBjaGVjayBhbGxvd3MgZXhwbGljaXRcbiAgICAvLyBcIm51bGxpbmdcIiBvZiB0aGUgcm9sZSBpZiB0aGUgdXNlciByZWFsbHkgZG9lc24ndCB3YW50IG9uZVxuXG5cbiAgICBpZiAoZWxlbWVudFByb3BzLnJvbGUgPT09IHVuZGVmaW5lZCAmJiBDb21wb25lbnQgIT09ICduYXYnKSB7XG4gICAgICBlbGVtZW50UHJvcHMucm9sZSA9ICduYXZpZ2F0aW9uJztcbiAgICB9XG5cbiAgICBpZiAoaW52ZXJzZSkge1xuICAgICAgYnNQcm9wcy5ic1N0eWxlID0gX1N0eWxlQ29uZmlnLlN0eWxlLklOVkVSU0U7XG4gICAgfVxuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKSwgKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdmaXhlZC10b3AnKV0gPSBmaXhlZFRvcCwgX2V4dGVuZHMyWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnZml4ZWQtYm90dG9tJyldID0gZml4ZWRCb3R0b20sIF9leHRlbmRzMlsoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ3N0YXRpYy10b3AnKV0gPSBzdGF0aWNUb3AsIF9leHRlbmRzMikpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgQ29tcG9uZW50LFxuICAgICAgKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgICB9KSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICBfR3JpZDJbJ2RlZmF1bHQnXSxcbiAgICAgICAgeyBmbHVpZDogZmx1aWQgfSxcbiAgICAgICAgY2hpbGRyZW5cbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBOYXZiYXI7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5OYXZiYXIucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuTmF2YmFyLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbk5hdmJhci5jaGlsZENvbnRleHRUeXBlcyA9IGNoaWxkQ29udGV4dFR5cGVzO1xuXG4oMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCduYXZiYXInLCBOYXZiYXIpO1xuXG52YXIgVW5jb250cm9sbGFibGVOYXZiYXIgPSAoMCwgX3VuY29udHJvbGxhYmxlMlsnZGVmYXVsdCddKShOYXZiYXIsIHsgZXhwYW5kZWQ6ICdvblRvZ2dsZScgfSk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVNpbXBsZVdyYXBwZXIodGFnLCBzdWZmaXgsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciBXcmFwcGVyID0gZnVuY3Rpb24gV3JhcHBlcihfcmVmLCBfcmVmMikge1xuICAgIHZhciBfcmVmMiQkYnNfbmF2YmFyID0gX3JlZjIuJGJzX25hdmJhcixcbiAgICAgICAgbmF2YmFyUHJvcHMgPSBfcmVmMiQkYnNfbmF2YmFyID09PSB1bmRlZmluZWQgPyB7IGJzQ2xhc3M6ICduYXZiYXInIH0gOiBfcmVmMiQkYnNfbmF2YmFyO1xuICAgIHZhciBDb21wb25lbnQgPSBfcmVmLmNvbXBvbmVudENsYXNzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcmVmLmNsYXNzTmFtZSxcbiAgICAgICAgcHVsbFJpZ2h0ID0gX3JlZi5wdWxsUmlnaHQsXG4gICAgICAgIHB1bGxMZWZ0ID0gX3JlZi5wdWxsTGVmdCxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcmVmLCBbJ2NvbXBvbmVudENsYXNzJywgJ2NsYXNzTmFtZScsICdwdWxsUmlnaHQnLCAncHVsbExlZnQnXSk7XG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgcHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShuYXZiYXJQcm9wcywgc3VmZml4KSwgcHVsbFJpZ2h0ICYmICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShuYXZiYXJQcm9wcywgJ3JpZ2h0JyksIHB1bGxMZWZ0ICYmICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShuYXZiYXJQcm9wcywgJ2xlZnQnKSlcbiAgICB9KSk7XG4gIH07XG5cbiAgV3JhcHBlci5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuXG4gIFdyYXBwZXIucHJvcFR5cGVzID0ge1xuICAgIGNvbXBvbmVudENsYXNzOiBfZWxlbWVudFR5cGUyWydkZWZhdWx0J10sXG4gICAgcHVsbFJpZ2h0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gICAgcHVsbExlZnQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbFxuICB9O1xuXG4gIFdyYXBwZXIuZGVmYXVsdFByb3BzID0ge1xuICAgIGNvbXBvbmVudENsYXNzOiB0YWcsXG4gICAgcHVsbFJpZ2h0OiBmYWxzZSxcbiAgICBwdWxsTGVmdDogZmFsc2VcbiAgfTtcblxuICBXcmFwcGVyLmNvbnRleHRUeXBlcyA9IHtcbiAgICAkYnNfbmF2YmFyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnNoYXBlKHtcbiAgICAgIGJzQ2xhc3M6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nXG4gICAgfSlcbiAgfTtcblxuICByZXR1cm4gV3JhcHBlcjtcbn1cblxuVW5jb250cm9sbGFibGVOYXZiYXIuQnJhbmQgPSBfTmF2YmFyQnJhbmQyWydkZWZhdWx0J107XG5VbmNvbnRyb2xsYWJsZU5hdmJhci5IZWFkZXIgPSBfTmF2YmFySGVhZGVyMlsnZGVmYXVsdCddO1xuVW5jb250cm9sbGFibGVOYXZiYXIuVG9nZ2xlID0gX05hdmJhclRvZ2dsZTJbJ2RlZmF1bHQnXTtcblVuY29udHJvbGxhYmxlTmF2YmFyLkNvbGxhcHNlID0gX05hdmJhckNvbGxhcHNlMlsnZGVmYXVsdCddO1xuXG5VbmNvbnRyb2xsYWJsZU5hdmJhci5Gb3JtID0gY3JlYXRlU2ltcGxlV3JhcHBlcignZGl2JywgJ2Zvcm0nLCAnTmF2YmFyRm9ybScpO1xuVW5jb250cm9sbGFibGVOYXZiYXIuVGV4dCA9IGNyZWF0ZVNpbXBsZVdyYXBwZXIoJ3AnLCAndGV4dCcsICdOYXZiYXJUZXh0Jyk7XG5VbmNvbnRyb2xsYWJsZU5hdmJhci5MaW5rID0gY3JlYXRlU2ltcGxlV3JhcHBlcignYScsICdsaW5rJywgJ05hdmJhckxpbmsnKTtcblxuLy8gU2V0IGJzU3R5bGVzIGhlcmUgc28gdGhleSBjYW4gYmUgb3ZlcnJpZGRlbi5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNTdHlsZXMpKFtfU3R5bGVDb25maWcuU3R5bGUuREVGQVVMVCwgX1N0eWxlQ29uZmlnLlN0eWxlLklOVkVSU0VdLCBfU3R5bGVDb25maWcuU3R5bGUuREVGQVVMVCwgVW5jb250cm9sbGFibGVOYXZiYXIpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBjb250ZXh0VHlwZXMgPSB7XG4gICRic19uYXZiYXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc2hhcGUoe1xuICAgIGJzQ2xhc3M6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nXG4gIH0pXG59O1xuXG52YXIgTmF2YmFyQnJhbmQgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShOYXZiYXJCcmFuZCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTmF2YmFyQnJhbmQoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgTmF2YmFyQnJhbmQpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBOYXZiYXJCcmFuZC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY2xhc3NOYW1lJywgJ2NoaWxkcmVuJ10pO1xuXG4gICAgdmFyIG5hdmJhclByb3BzID0gdGhpcy5jb250ZXh0LiRic19uYXZiYXIgfHwgeyBic0NsYXNzOiAnbmF2YmFyJyB9O1xuXG4gICAgdmFyIGJzQ2xhc3NOYW1lID0gKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKG5hdmJhclByb3BzLCAnYnJhbmQnKTtcblxuICAgIGlmIChfcmVhY3QyWydkZWZhdWx0J10uaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pKSB7XG4gICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNsb25lRWxlbWVudChjaGlsZHJlbiwge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2hpbGRyZW4ucHJvcHMuY2xhc3NOYW1lLCBjbGFzc05hbWUsIGJzQ2xhc3NOYW1lKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ3NwYW4nLFxuICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgcHJvcHMsIHsgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgYnNDbGFzc05hbWUpIH0pLFxuICAgICAgY2hpbGRyZW5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBOYXZiYXJCcmFuZDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbk5hdmJhckJyYW5kLmNvbnRleHRUeXBlcyA9IGNvbnRleHRUeXBlcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gTmF2YmFyQnJhbmQ7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9Db2xsYXBzZSA9IHJlcXVpcmUoJy4vQ29sbGFwc2UnKTtcblxudmFyIF9Db2xsYXBzZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Db2xsYXBzZSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIGNvbnRleHRUeXBlcyA9IHtcbiAgJGJzX25hdmJhcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zaGFwZSh7XG4gICAgYnNDbGFzczogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gICAgZXhwYW5kZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbFxuICB9KVxufTtcblxudmFyIE5hdmJhckNvbGxhcHNlID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoTmF2YmFyQ29sbGFwc2UsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE5hdmJhckNvbGxhcHNlKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIE5hdmJhckNvbGxhcHNlKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgTmF2YmFyQ29sbGFwc2UucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NoaWxkcmVuJ10pO1xuXG4gICAgdmFyIG5hdmJhclByb3BzID0gdGhpcy5jb250ZXh0LiRic19uYXZiYXIgfHwgeyBic0NsYXNzOiAnbmF2YmFyJyB9O1xuXG4gICAgdmFyIGJzQ2xhc3NOYW1lID0gKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKG5hdmJhclByb3BzLCAnY29sbGFwc2UnKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgIF9Db2xsYXBzZTJbJ2RlZmF1bHQnXSxcbiAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoeyAnaW4nOiBuYXZiYXJQcm9wcy5leHBhbmRlZCB9LCBwcm9wcyksXG4gICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHsgY2xhc3NOYW1lOiBic0NsYXNzTmFtZSB9LFxuICAgICAgICBjaGlsZHJlblxuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIE5hdmJhckNvbGxhcHNlO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuTmF2YmFyQ29sbGFwc2UuY29udGV4dFR5cGVzID0gY29udGV4dFR5cGVzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBOYXZiYXJDb2xsYXBzZTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgY29udGV4dFR5cGVzID0ge1xuICAkYnNfbmF2YmFyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnNoYXBlKHtcbiAgICBic0NsYXNzOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZ1xuICB9KVxufTtcblxudmFyIE5hdmJhckhlYWRlciA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKE5hdmJhckhlYWRlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTmF2YmFySGVhZGVyKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIE5hdmJhckhlYWRlcik7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIE5hdmJhckhlYWRlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgbmF2YmFyUHJvcHMgPSB0aGlzLmNvbnRleHQuJGJzX25hdmJhciB8fCB7IGJzQ2xhc3M6ICduYXZiYXInIH07XG5cbiAgICB2YXIgYnNDbGFzc05hbWUgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkobmF2YmFyUHJvcHMsICdoZWFkZXInKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnZGl2JywgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgcHJvcHMsIHsgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgYnNDbGFzc05hbWUpIH0pKTtcbiAgfTtcblxuICByZXR1cm4gTmF2YmFySGVhZGVyO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuTmF2YmFySGVhZGVyLmNvbnRleHRUeXBlcyA9IGNvbnRleHRUeXBlcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gTmF2YmFySGVhZGVyO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbiA9IHJlcXVpcmUoJy4vdXRpbHMvY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluZWRGdW5jdGlvbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgb25DbGljazogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICAvKipcbiAgICogVGhlIHRvZ2dsZSBjb250ZW50LCBpZiBsZWZ0IGVtcHR5IGl0IHdpbGwgcmVuZGVyIHRoZSBkZWZhdWx0IHRvZ2dsZSAoc2VlbiBhYm92ZSkuXG4gICAqL1xuICBjaGlsZHJlbjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ub2RlXG59O1xuXG52YXIgY29udGV4dFR5cGVzID0ge1xuICAkYnNfbmF2YmFyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnNoYXBlKHtcbiAgICBic0NsYXNzOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcbiAgICBleHBhbmRlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICAgIG9uVG9nZ2xlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMuaXNSZXF1aXJlZFxuICB9KVxufTtcblxudmFyIE5hdmJhclRvZ2dsZSA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKE5hdmJhclRvZ2dsZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTmF2YmFyVG9nZ2xlKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIE5hdmJhclRvZ2dsZSk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIE5hdmJhclRvZ2dsZS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBvbkNsaWNrID0gX3Byb3BzLm9uQ2xpY2ssXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydvbkNsaWNrJywgJ2NsYXNzTmFtZScsICdjaGlsZHJlbiddKTtcblxuICAgIHZhciBuYXZiYXJQcm9wcyA9IHRoaXMuY29udGV4dC4kYnNfbmF2YmFyIHx8IHsgYnNDbGFzczogJ25hdmJhcicgfTtcblxuICAgIHZhciBidXR0b25Qcm9wcyA9ICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe1xuICAgICAgdHlwZTogJ2J1dHRvbidcbiAgICB9LCBwcm9wcywge1xuICAgICAgb25DbGljazogKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKG9uQ2xpY2ssIG5hdmJhclByb3BzLm9uVG9nZ2xlKSxcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShuYXZiYXJQcm9wcywgJ3RvZ2dsZScpLCAhbmF2YmFyUHJvcHMuZXhwYW5kZWQgJiYgJ2NvbGxhcHNlZCcpXG4gICAgfSk7XG5cbiAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2J1dHRvbicsXG4gICAgICAgIGJ1dHRvblByb3BzLFxuICAgICAgICBjaGlsZHJlblxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnYnV0dG9uJyxcbiAgICAgIGJ1dHRvblByb3BzLFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdzcGFuJyxcbiAgICAgICAgeyBjbGFzc05hbWU6ICdzci1vbmx5JyB9LFxuICAgICAgICAnVG9nZ2xlIG5hdmlnYXRpb24nXG4gICAgICApLFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ2ljb24tYmFyJyB9KSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdzcGFuJywgeyBjbGFzc05hbWU6ICdpY29uLWJhcicgfSksXG4gICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnc3BhbicsIHsgY2xhc3NOYW1lOiAnaWNvbi1iYXInIH0pXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gTmF2YmFyVG9nZ2xlO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuTmF2YmFyVG9nZ2xlLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbk5hdmJhclRvZ2dsZS5jb250ZXh0VHlwZXMgPSBjb250ZXh0VHlwZXM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IE5hdmJhclRvZ2dsZTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9PdmVybGF5ID0gcmVxdWlyZSgncmVhY3Qtb3ZlcmxheXMvbGliL092ZXJsYXknKTtcblxudmFyIF9PdmVybGF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX092ZXJsYXkpO1xuXG52YXIgX2VsZW1lbnRUeXBlID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvZWxlbWVudFR5cGUnKTtcblxudmFyIF9lbGVtZW50VHlwZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbGVtZW50VHlwZSk7XG5cbnZhciBfRmFkZSA9IHJlcXVpcmUoJy4vRmFkZScpO1xuXG52YXIgX0ZhZGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRmFkZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9ICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIF9PdmVybGF5MlsnZGVmYXVsdCddLnByb3BUeXBlcywge1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHZpc2liaWxpdHkgb2YgdGhlIE92ZXJsYXlcbiAgICovXG4gIHNob3c6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgLyoqXG4gICAqIFNwZWNpZnkgd2hldGhlciB0aGUgb3ZlcmxheSBzaG91bGQgdHJpZ2dlciBvbkhpZGUgd2hlbiB0aGUgdXNlciBjbGlja3Mgb3V0c2lkZSB0aGUgb3ZlcmxheVxuICAgKi9cbiAgcm9vdENsb3NlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGludm9rZWQgYnkgdGhlIG92ZXJsYXkgd2hlbiBpdCB3aXNoZXMgdG8gYmUgaGlkZGVuLiBSZXF1aXJlZCBpZlxuICAgKiBgcm9vdENsb3NlYCBpcyBzcGVjaWZpZWQuXG4gICAqL1xuICBvbkhpZGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogVXNlIGFuaW1hdGlvblxuICAgKi9cbiAgYW5pbWF0aW9uOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mVHlwZShbX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLCBfZWxlbWVudFR5cGUyWydkZWZhdWx0J11dKSxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYmVmb3JlIHRoZSBPdmVybGF5IHRyYW5zaXRpb25zIGluXG4gICAqL1xuICBvbkVudGVyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFzIHRoZSBPdmVybGF5IGJlZ2lucyB0byB0cmFuc2l0aW9uIGluXG4gICAqL1xuICBvbkVudGVyaW5nOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBPdmVybGF5IGZpbmlzaGVzIHRyYW5zaXRpb25pbmcgaW5cbiAgICovXG4gIG9uRW50ZXJlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCByaWdodCBiZWZvcmUgdGhlIE92ZXJsYXkgdHJhbnNpdGlvbnMgb3V0XG4gICAqL1xuICBvbkV4aXQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYXMgdGhlIE92ZXJsYXkgYmVnaW5zIHRvIHRyYW5zaXRpb24gb3V0XG4gICAqL1xuICBvbkV4aXRpbmc6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIE92ZXJsYXkgZmluaXNoZXMgdHJhbnNpdGlvbmluZyBvdXRcbiAgICovXG4gIG9uRXhpdGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgT3ZlcmxheS5cbiAgICovXG4gIHBsYWNlbWVudDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZihbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddKVxufSk7XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGFuaW1hdGlvbjogX0ZhZGUyWydkZWZhdWx0J10sXG4gIHJvb3RDbG9zZTogZmFsc2UsXG4gIHNob3c6IGZhbHNlLFxuICBwbGFjZW1lbnQ6ICdyaWdodCdcbn07XG5cbnZhciBPdmVybGF5ID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoT3ZlcmxheSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gT3ZlcmxheSgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBPdmVybGF5KTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgT3ZlcmxheS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhbmltYXRpb24gPSBfcHJvcHMuYW5pbWF0aW9uLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnYW5pbWF0aW9uJywgJ2NoaWxkcmVuJ10pO1xuXG5cbiAgICB2YXIgdHJhbnNpdGlvbiA9IGFuaW1hdGlvbiA9PT0gdHJ1ZSA/IF9GYWRlMlsnZGVmYXVsdCddIDogYW5pbWF0aW9uIHx8IG51bGw7XG5cbiAgICB2YXIgY2hpbGQgPSB2b2lkIDA7XG5cbiAgICBpZiAoIXRyYW5zaXRpb24pIHtcbiAgICAgIGNoaWxkID0gKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGNoaWxkcmVuLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjaGlsZHJlbi5wcm9wcy5jbGFzc05hbWUsICdpbicpXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGQgPSBjaGlsZHJlbjtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBfT3ZlcmxheTJbJ2RlZmF1bHQnXSxcbiAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIHByb3BzLCB7XG4gICAgICAgIHRyYW5zaXRpb246IHRyYW5zaXRpb25cbiAgICAgIH0pLFxuICAgICAgY2hpbGRcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBPdmVybGF5O1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuT3ZlcmxheS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5PdmVybGF5LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gT3ZlcmxheTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX2NvbnRhaW5zID0gcmVxdWlyZSgnZG9tLWhlbHBlcnMvcXVlcnkvY29udGFpbnMnKTtcblxudmFyIF9jb250YWluczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb250YWlucyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfcmVhY3REb20gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcblxudmFyIF9yZWFjdERvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdERvbSk7XG5cbnZhciBfd2FybmluZyA9IHJlcXVpcmUoJ3dhcm5pbmcnKTtcblxudmFyIF93YXJuaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3dhcm5pbmcpO1xuXG52YXIgX092ZXJsYXkgPSByZXF1aXJlKCcuL092ZXJsYXknKTtcblxudmFyIF9PdmVybGF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX092ZXJsYXkpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbiA9IHJlcXVpcmUoJy4vdXRpbHMvY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluZWRGdW5jdGlvbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuLyoqXG4gKiBDaGVjayBpZiB2YWx1ZSBvbmUgaXMgaW5zaWRlIG9yIGVxdWFsIHRvIHRoZSBvZiB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBvbmVcbiAqIEBwYXJhbSB7c3RyaW5nfGFycmF5fSBvZlxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzT25lT2Yob25lLCBvZikge1xuICBpZiAoQXJyYXkuaXNBcnJheShvZikpIHtcbiAgICByZXR1cm4gb2YuaW5kZXhPZihvbmUpID49IDA7XG4gIH1cbiAgcmV0dXJuIG9uZSA9PT0gb2Y7XG59XG5cbnZhciB0cmlnZ2VyVHlwZSA9IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2YoWydjbGljaycsICdob3ZlcicsICdmb2N1cyddKTtcblxudmFyIHByb3BUeXBlcyA9ICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIF9PdmVybGF5MlsnZGVmYXVsdCddLnByb3BUeXBlcywge1xuXG4gIC8qKlxuICAqIFNwZWNpZnkgd2hpY2ggYWN0aW9uIG9yIGFjdGlvbnMgdHJpZ2dlciBPdmVybGF5IHZpc2liaWxpdHlcbiAgKi9cbiAgdHJpZ2dlcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZlR5cGUoW3RyaWdnZXJUeXBlLCBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmFycmF5T2YodHJpZ2dlclR5cGUpXSksXG5cbiAgLyoqXG4gICAqIEEgbWlsbGlzZWNvbmQgZGVsYXkgYW1vdW50IHRvIHNob3cgYW5kIGhpZGUgdGhlIE92ZXJsYXkgb25jZSB0cmlnZ2VyZWRcbiAgICovXG4gIGRlbGF5OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcixcbiAgLyoqXG4gICAqIEEgbWlsbGlzZWNvbmQgZGVsYXkgYW1vdW50IGJlZm9yZSBzaG93aW5nIHRoZSBPdmVybGF5IG9uY2UgdHJpZ2dlcmVkLlxuICAgKi9cbiAgZGVsYXlTaG93OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcixcbiAgLyoqXG4gICAqIEEgbWlsbGlzZWNvbmQgZGVsYXkgYW1vdW50IGJlZm9yZSBoaWRpbmcgdGhlIE92ZXJsYXkgb25jZSB0cmlnZ2VyZWQuXG4gICAqL1xuICBkZWxheUhpZGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuXG4gIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBgZGVmYXVsdFNob3dgLlxuICAvKipcbiAgICogVGhlIGluaXRpYWwgdmlzaWJpbGl0eSBzdGF0ZSBvZiB0aGUgT3ZlcmxheS4gRm9yIG1vcmUgbnVhbmNlZCB2aXNpYmlsaXR5XG4gICAqIGNvbnRyb2wsIGNvbnNpZGVyIHVzaW5nIHRoZSBPdmVybGF5IGNvbXBvbmVudCBkaXJlY3RseS5cbiAgICovXG4gIGRlZmF1bHRPdmVybGF5U2hvd246IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogQW4gZWxlbWVudCBvciB0ZXh0IHRvIG92ZXJsYXkgbmV4dCB0byB0aGUgdGFyZ2V0LlxuICAgKi9cbiAgb3ZlcmxheTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ub2RlLmlzUmVxdWlyZWQsXG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBvbkJsdXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBvbkNsaWNrOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25Gb2N1czogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG9uTW91c2VPdXQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBvbk1vdXNlT3ZlcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuXG4gIC8vIE92ZXJyaWRkZW4gcHJvcHMgZnJvbSBgPE92ZXJsYXk+YC5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0YXJnZXQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2YoW251bGxdKSxcbiAgLyoqXG4gICogQHByaXZhdGVcbiAgKi9cbiAgb25IaWRlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mKFtudWxsXSksXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2hvdzogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZihbbnVsbF0pXG59KTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgZGVmYXVsdE92ZXJsYXlTaG93bjogZmFsc2UsXG4gIHRyaWdnZXI6IFsnaG92ZXInLCAnZm9jdXMnXVxufTtcblxudmFyIE92ZXJsYXlUcmlnZ2VyID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoT3ZlcmxheVRyaWdnZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE92ZXJsYXlUcmlnZ2VyKHByb3BzLCBjb250ZXh0KSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgT3ZlcmxheVRyaWdnZXIpO1xuXG4gICAgdmFyIF90aGlzID0gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgIF90aGlzLmhhbmRsZVRvZ2dsZSA9IF90aGlzLmhhbmRsZVRvZ2dsZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5oYW5kbGVEZWxheWVkU2hvdyA9IF90aGlzLmhhbmRsZURlbGF5ZWRTaG93LmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmhhbmRsZURlbGF5ZWRIaWRlID0gX3RoaXMuaGFuZGxlRGVsYXllZEhpZGUuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaGFuZGxlSGlkZSA9IF90aGlzLmhhbmRsZUhpZGUuYmluZChfdGhpcyk7XG5cbiAgICBfdGhpcy5oYW5kbGVNb3VzZU92ZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIF90aGlzLmhhbmRsZU1vdXNlT3Zlck91dChfdGhpcy5oYW5kbGVEZWxheWVkU2hvdywgZSk7XG4gICAgfTtcbiAgICBfdGhpcy5oYW5kbGVNb3VzZU91dCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gX3RoaXMuaGFuZGxlTW91c2VPdmVyT3V0KF90aGlzLmhhbmRsZURlbGF5ZWRIaWRlLCBlKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuX21vdW50Tm9kZSA9IG51bGw7XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHNob3c6IHByb3BzLmRlZmF1bHRPdmVybGF5U2hvd25cbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIE92ZXJsYXlUcmlnZ2VyLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMuX21vdW50Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMucmVuZGVyT3ZlcmxheSgpO1xuICB9O1xuXG4gIE92ZXJsYXlUcmlnZ2VyLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgdGhpcy5yZW5kZXJPdmVybGF5KCk7XG4gIH07XG5cbiAgT3ZlcmxheVRyaWdnZXIucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgX3JlYWN0RG9tMlsnZGVmYXVsdCddLnVubW91bnRDb21wb25lbnRBdE5vZGUodGhpcy5fbW91bnROb2RlKTtcbiAgICB0aGlzLl9tb3VudE5vZGUgPSBudWxsO1xuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2hvdmVyU2hvd0RlbGF5KTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5faG92ZXJIaWRlRGVsYXkpO1xuICB9O1xuXG4gIE92ZXJsYXlUcmlnZ2VyLnByb3RvdHlwZS5oYW5kbGVUb2dnbGUgPSBmdW5jdGlvbiBoYW5kbGVUb2dnbGUoKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUuc2hvdykge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgIH1cbiAgfTtcblxuICBPdmVybGF5VHJpZ2dlci5wcm90b3R5cGUuaGFuZGxlRGVsYXllZFNob3cgPSBmdW5jdGlvbiBoYW5kbGVEZWxheWVkU2hvdygpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIGlmICh0aGlzLl9ob3ZlckhpZGVEZWxheSAhPSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5faG92ZXJIaWRlRGVsYXkpO1xuICAgICAgdGhpcy5faG92ZXJIaWRlRGVsYXkgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlLnNob3cgfHwgdGhpcy5faG92ZXJTaG93RGVsYXkgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBkZWxheSA9IHRoaXMucHJvcHMuZGVsYXlTaG93ICE9IG51bGwgPyB0aGlzLnByb3BzLmRlbGF5U2hvdyA6IHRoaXMucHJvcHMuZGVsYXk7XG5cbiAgICBpZiAoIWRlbGF5KSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9ob3ZlclNob3dEZWxheSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMyLl9ob3ZlclNob3dEZWxheSA9IG51bGw7XG4gICAgICBfdGhpczIuc2hvdygpO1xuICAgIH0sIGRlbGF5KTtcbiAgfTtcblxuICBPdmVybGF5VHJpZ2dlci5wcm90b3R5cGUuaGFuZGxlRGVsYXllZEhpZGUgPSBmdW5jdGlvbiBoYW5kbGVEZWxheWVkSGlkZSgpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIGlmICh0aGlzLl9ob3ZlclNob3dEZWxheSAhPSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5faG92ZXJTaG93RGVsYXkpO1xuICAgICAgdGhpcy5faG92ZXJTaG93RGVsYXkgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5zdGF0ZS5zaG93IHx8IHRoaXMuX2hvdmVySGlkZURlbGF5ICE9IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZGVsYXkgPSB0aGlzLnByb3BzLmRlbGF5SGlkZSAhPSBudWxsID8gdGhpcy5wcm9wcy5kZWxheUhpZGUgOiB0aGlzLnByb3BzLmRlbGF5O1xuXG4gICAgaWYgKCFkZWxheSkge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5faG92ZXJIaWRlRGVsYXkgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzMy5faG92ZXJIaWRlRGVsYXkgPSBudWxsO1xuICAgICAgX3RoaXMzLmhpZGUoKTtcbiAgICB9LCBkZWxheSk7XG4gIH07XG5cbiAgLy8gU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIG1vdXNlRW50ZXIgYW5kIG1vdXNlTGVhdmUuXG4gIC8vIFJlYWN0J3MgYnVpbHQgdmVyc2lvbiBpcyBicm9rZW46IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNDI1MVxuICAvLyBmb3IgY2FzZXMgd2hlbiB0aGUgdHJpZ2dlciBpcyBkaXNhYmxlZCBhbmQgbW91c2VPdXQvT3ZlciBjYW4gY2F1c2UgZmxpY2tlclxuICAvLyBtb3ZpbmcgZnJvbSBvbmUgY2hpbGQgZWxlbWVudCB0byBhbm90aGVyLlxuXG5cbiAgT3ZlcmxheVRyaWdnZXIucHJvdG90eXBlLmhhbmRsZU1vdXNlT3Zlck91dCA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlT3Zlck91dChoYW5kbGVyLCBlKSB7XG4gICAgdmFyIHRhcmdldCA9IGUuY3VycmVudFRhcmdldDtcbiAgICB2YXIgcmVsYXRlZCA9IGUucmVsYXRlZFRhcmdldCB8fCBlLm5hdGl2ZUV2ZW50LnRvRWxlbWVudDtcblxuICAgIGlmICghcmVsYXRlZCB8fCByZWxhdGVkICE9PSB0YXJnZXQgJiYgISgwLCBfY29udGFpbnMyWydkZWZhdWx0J10pKHRhcmdldCwgcmVsYXRlZCkpIHtcbiAgICAgIGhhbmRsZXIoZSk7XG4gICAgfVxuICB9O1xuXG4gIE92ZXJsYXlUcmlnZ2VyLnByb3RvdHlwZS5oYW5kbGVIaWRlID0gZnVuY3Rpb24gaGFuZGxlSGlkZSgpIHtcbiAgICB0aGlzLmhpZGUoKTtcbiAgfTtcblxuICBPdmVybGF5VHJpZ2dlci5wcm90b3R5cGUuc2hvdyA9IGZ1bmN0aW9uIHNob3coKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHNob3c6IHRydWUgfSk7XG4gIH07XG5cbiAgT3ZlcmxheVRyaWdnZXIucHJvdG90eXBlLmhpZGUgPSBmdW5jdGlvbiBoaWRlKCkge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBzaG93OiBmYWxzZSB9KTtcbiAgfTtcblxuICBPdmVybGF5VHJpZ2dlci5wcm90b3R5cGUubWFrZU92ZXJsYXkgPSBmdW5jdGlvbiBtYWtlT3ZlcmxheShvdmVybGF5LCBwcm9wcykge1xuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgIF9PdmVybGF5MlsnZGVmYXVsdCddLFxuICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgcHJvcHMsIHtcbiAgICAgICAgc2hvdzogdGhpcy5zdGF0ZS5zaG93LFxuICAgICAgICBvbkhpZGU6IHRoaXMuaGFuZGxlSGlkZSxcbiAgICAgICAgdGFyZ2V0OiB0aGlzXG4gICAgICB9KSxcbiAgICAgIG92ZXJsYXlcbiAgICApO1xuICB9O1xuXG4gIE92ZXJsYXlUcmlnZ2VyLnByb3RvdHlwZS5yZW5kZXJPdmVybGF5ID0gZnVuY3Rpb24gcmVuZGVyT3ZlcmxheSgpIHtcbiAgICBfcmVhY3REb20yWydkZWZhdWx0J10udW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIodGhpcywgdGhpcy5fb3ZlcmxheSwgdGhpcy5fbW91bnROb2RlKTtcbiAgfTtcblxuICBPdmVybGF5VHJpZ2dlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICB0cmlnZ2VyID0gX3Byb3BzLnRyaWdnZXIsXG4gICAgICAgIG92ZXJsYXkgPSBfcHJvcHMub3ZlcmxheSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIG9uQmx1ciA9IF9wcm9wcy5vbkJsdXIsXG4gICAgICAgIG9uQ2xpY2sgPSBfcHJvcHMub25DbGljayxcbiAgICAgICAgb25Gb2N1cyA9IF9wcm9wcy5vbkZvY3VzLFxuICAgICAgICBvbk1vdXNlT3V0ID0gX3Byb3BzLm9uTW91c2VPdXQsXG4gICAgICAgIG9uTW91c2VPdmVyID0gX3Byb3BzLm9uTW91c2VPdmVyLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWyd0cmlnZ2VyJywgJ292ZXJsYXknLCAnY2hpbGRyZW4nLCAnb25CbHVyJywgJ29uQ2xpY2snLCAnb25Gb2N1cycsICdvbk1vdXNlT3V0JywgJ29uTW91c2VPdmVyJ10pO1xuXG5cbiAgICBkZWxldGUgcHJvcHMuZGVsYXk7XG4gICAgZGVsZXRlIHByb3BzLmRlbGF5U2hvdztcbiAgICBkZWxldGUgcHJvcHMuZGVsYXlIaWRlO1xuICAgIGRlbGV0ZSBwcm9wcy5kZWZhdWx0T3ZlcmxheVNob3duO1xuXG4gICAgdmFyIGNoaWxkID0gX3JlYWN0MlsnZGVmYXVsdCddLkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pO1xuICAgIHZhciBjaGlsZFByb3BzID0gY2hpbGQucHJvcHM7XG4gICAgdmFyIHRyaWdnZXJQcm9wcyA9IHt9O1xuXG4gICAgaWYgKHRoaXMuc3RhdGUuc2hvdykge1xuICAgICAgdHJpZ2dlclByb3BzWydhcmlhLWRlc2NyaWJlZGJ5J10gPSBvdmVybGF5LnByb3BzLmlkO1xuICAgIH1cblxuICAgIC8vIEZJWE1FOiBUaGUgbG9naWMgaGVyZSBmb3IgcGFzc2luZyB0aHJvdWdoIGhhbmRsZXJzIG9uIHRoaXMgY29tcG9uZW50IGlzXG4gICAgLy8gaW5jb25zaXN0ZW50LiBXZSBzaG91bGRuJ3QgYmUgcGFzc2luZyBhbnkgb2YgdGhlc2UgcHJvcHMgdGhyb3VnaC5cblxuICAgIHRyaWdnZXJQcm9wcy5vbkNsaWNrID0gKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKGNoaWxkUHJvcHMub25DbGljaywgb25DbGljayk7XG5cbiAgICBpZiAoaXNPbmVPZignY2xpY2snLCB0cmlnZ2VyKSkge1xuICAgICAgdHJpZ2dlclByb3BzLm9uQ2xpY2sgPSAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkodHJpZ2dlclByb3BzLm9uQ2xpY2ssIHRoaXMuaGFuZGxlVG9nZ2xlKTtcbiAgICB9XG5cbiAgICBpZiAoaXNPbmVPZignaG92ZXInLCB0cmlnZ2VyKSkge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/ICgwLCBfd2FybmluZzJbJ2RlZmF1bHQnXSkoISh0cmlnZ2VyID09PSAnaG92ZXInKSwgJ1tyZWFjdC1ib290c3RyYXBdIFNwZWNpZnlpbmcgb25seSB0aGUgYFwiaG92ZXJcImAgdHJpZ2dlciBsaW1pdHMgdGhlICcgKyAndmlzaWJpbGl0eSBvZiB0aGUgb3ZlcmxheSB0byBqdXN0IG1vdXNlIHVzZXJzLiBDb25zaWRlciBhbHNvICcgKyAnaW5jbHVkaW5nIHRoZSBgXCJmb2N1c1wiYCB0cmlnZ2VyIHNvIHRoYXQgdG91Y2ggYW5kIGtleWJvYXJkIG9ubHkgJyArICd1c2VycyBjYW4gc2VlIHRoZSBvdmVybGF5IGFzIHdlbGwuJykgOiB2b2lkIDA7XG5cbiAgICAgIHRyaWdnZXJQcm9wcy5vbk1vdXNlT3ZlciA9ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKShjaGlsZFByb3BzLm9uTW91c2VPdmVyLCBvbk1vdXNlT3ZlciwgdGhpcy5oYW5kbGVNb3VzZU92ZXIpO1xuICAgICAgdHJpZ2dlclByb3BzLm9uTW91c2VPdXQgPSAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkoY2hpbGRQcm9wcy5vbk1vdXNlT3V0LCBvbk1vdXNlT3V0LCB0aGlzLmhhbmRsZU1vdXNlT3V0KTtcbiAgICB9XG5cbiAgICBpZiAoaXNPbmVPZignZm9jdXMnLCB0cmlnZ2VyKSkge1xuICAgICAgdHJpZ2dlclByb3BzLm9uRm9jdXMgPSAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkoY2hpbGRQcm9wcy5vbkZvY3VzLCBvbkZvY3VzLCB0aGlzLmhhbmRsZURlbGF5ZWRTaG93KTtcbiAgICAgIHRyaWdnZXJQcm9wcy5vbkJsdXIgPSAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkoY2hpbGRQcm9wcy5vbkJsdXIsIG9uQmx1ciwgdGhpcy5oYW5kbGVEZWxheWVkSGlkZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fb3ZlcmxheSA9IHRoaXMubWFrZU92ZXJsYXkob3ZlcmxheSwgcHJvcHMpO1xuXG4gICAgcmV0dXJuICgwLCBfcmVhY3QuY2xvbmVFbGVtZW50KShjaGlsZCwgdHJpZ2dlclByb3BzKTtcbiAgfTtcblxuICByZXR1cm4gT3ZlcmxheVRyaWdnZXI7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5PdmVybGF5VHJpZ2dlci5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5PdmVybGF5VHJpZ2dlci5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IE92ZXJsYXlUcmlnZ2VyO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIFBhZ2VIZWFkZXIgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShQYWdlSGVhZGVyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBQYWdlSGVhZGVyKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIFBhZ2VIZWFkZXIpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBQYWdlSGVhZGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjbGFzc05hbWUnLCAnY2hpbGRyZW4nXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICdkaXYnLFxuICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgICB9KSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnaDEnLFxuICAgICAgICBudWxsLFxuICAgICAgICBjaGlsZHJlblxuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFBhZ2VIZWFkZXI7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdwYWdlLWhlYWRlcicsIFBhZ2VIZWFkZXIpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX1BhZ2VySXRlbSA9IHJlcXVpcmUoJy4vUGFnZXJJdGVtJyk7XG5cbnZhciBfUGFnZXJJdGVtMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1BhZ2VySXRlbSk7XG5cbnZhciBfZGVwcmVjYXRpb25XYXJuaW5nID0gcmVxdWlyZSgnLi91dGlscy9kZXByZWNhdGlvbldhcm5pbmcnKTtcblxudmFyIF9kZXByZWNhdGlvbldhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVwcmVjYXRpb25XYXJuaW5nKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5leHBvcnRzWydkZWZhdWx0J10gPSBfZGVwcmVjYXRpb25XYXJuaW5nMlsnZGVmYXVsdCddLndyYXBwZXIoX1BhZ2VySXRlbTJbJ2RlZmF1bHQnXSwgJ2A8UGFnZUl0ZW0+YCcsICdgPFBhZ2VyLkl0ZW0+YCcpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX1BhZ2VySXRlbSA9IHJlcXVpcmUoJy4vUGFnZXJJdGVtJyk7XG5cbnZhciBfUGFnZXJJdGVtMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1BhZ2VySXRlbSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmVkRnVuY3Rpb24nKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKTtcblxudmFyIF9WYWxpZENvbXBvbmVudENoaWxkcmVuID0gcmVxdWlyZSgnLi91dGlscy9WYWxpZENvbXBvbmVudENoaWxkcmVuJyk7XG5cbnZhciBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9WYWxpZENvbXBvbmVudENoaWxkcmVuKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBvblNlbGVjdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jXG59O1xuXG52YXIgUGFnZXIgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShQYWdlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUGFnZXIoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgUGFnZXIpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBQYWdlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBvblNlbGVjdCA9IF9wcm9wcy5vblNlbGVjdCxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ29uU2VsZWN0JywgJ2NsYXNzTmFtZScsICdjaGlsZHJlbiddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ3VsJyxcbiAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgICAgfSksXG4gICAgICBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjJbJ2RlZmF1bHQnXS5tYXAoY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGNoaWxkLCB7XG4gICAgICAgICAgb25TZWxlY3Q6ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKShjaGlsZC5wcm9wcy5vblNlbGVjdCwgb25TZWxlY3QpXG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBQYWdlcjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cblBhZ2VyLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblxuUGFnZXIuSXRlbSA9IF9QYWdlckl0ZW0yWydkZWZhdWx0J107XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ3BhZ2VyJywgUGFnZXIpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX1NhZmVBbmNob3IgPSByZXF1aXJlKCcuL1NhZmVBbmNob3InKTtcblxudmFyIF9TYWZlQW5jaG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1NhZmVBbmNob3IpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbiA9IHJlcXVpcmUoJy4vdXRpbHMvY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluZWRGdW5jdGlvbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgZGlzYWJsZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgcHJldmlvdXM6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgbmV4dDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBvbkNsaWNrOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIG9uU2VsZWN0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIGV2ZW50S2V5OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmFueVxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgZGlzYWJsZWQ6IGZhbHNlLFxuICBwcmV2aW91czogZmFsc2UsXG4gIG5leHQ6IGZhbHNlXG59O1xuXG52YXIgUGFnZXJJdGVtID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoUGFnZXJJdGVtLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBQYWdlckl0ZW0ocHJvcHMsIGNvbnRleHQpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBQYWdlckl0ZW0pO1xuXG4gICAgdmFyIF90aGlzID0gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgIF90aGlzLmhhbmRsZVNlbGVjdCA9IF90aGlzLmhhbmRsZVNlbGVjdC5iaW5kKF90aGlzKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBQYWdlckl0ZW0ucHJvdG90eXBlLmhhbmRsZVNlbGVjdCA9IGZ1bmN0aW9uIGhhbmRsZVNlbGVjdChlKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGRpc2FibGVkID0gX3Byb3BzLmRpc2FibGVkLFxuICAgICAgICBvblNlbGVjdCA9IF9wcm9wcy5vblNlbGVjdCxcbiAgICAgICAgZXZlbnRLZXkgPSBfcHJvcHMuZXZlbnRLZXk7XG5cblxuICAgIGlmIChvblNlbGVjdCB8fCBkaXNhYmxlZCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvblNlbGVjdCkge1xuICAgICAgb25TZWxlY3QoZXZlbnRLZXksIGUpO1xuICAgIH1cbiAgfTtcblxuICBQYWdlckl0ZW0ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIGRpc2FibGVkID0gX3Byb3BzMi5kaXNhYmxlZCxcbiAgICAgICAgcHJldmlvdXMgPSBfcHJvcHMyLnByZXZpb3VzLFxuICAgICAgICBuZXh0ID0gX3Byb3BzMi5uZXh0LFxuICAgICAgICBvbkNsaWNrID0gX3Byb3BzMi5vbkNsaWNrLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMyLmNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGUgPSBfcHJvcHMyLnN0eWxlLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wczIsIFsnZGlzYWJsZWQnLCAncHJldmlvdXMnLCAnbmV4dCcsICdvbkNsaWNrJywgJ2NsYXNzTmFtZScsICdzdHlsZSddKTtcblxuXG4gICAgZGVsZXRlIHByb3BzLm9uU2VsZWN0O1xuICAgIGRlbGV0ZSBwcm9wcy5ldmVudEtleTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICdsaScsXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIHsgZGlzYWJsZWQ6IGRpc2FibGVkLCBwcmV2aW91czogcHJldmlvdXMsIG5leHQ6IG5leHQgfSksXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9TYWZlQW5jaG9yMlsnZGVmYXVsdCddLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBwcm9wcywge1xuICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgIG9uQ2xpY2s6ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKShvbkNsaWNrLCB0aGlzLmhhbmRsZVNlbGVjdClcbiAgICAgIH0pKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFBhZ2VySXRlbTtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cblBhZ2VySXRlbS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5QYWdlckl0ZW0uZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBQYWdlckl0ZW07XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfZWxlbWVudFR5cGUgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlKTtcblxudmFyIF9QYWdpbmF0aW9uQnV0dG9uID0gcmVxdWlyZSgnLi9QYWdpbmF0aW9uQnV0dG9uJyk7XG5cbnZhciBfUGFnaW5hdGlvbkJ1dHRvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9QYWdpbmF0aW9uQnV0dG9uKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBhY3RpdmVQYWdlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcixcbiAgaXRlbXM6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICBtYXhCdXR0b25zOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcixcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHdpbGwgZGlzcGxheSB0aGUgZmlyc3QgYW5kIHRoZSBsYXN0IGJ1dHRvbiBwYWdlIHdoZW5cbiAgICogZGlzcGxheWluZyBlbGxpcHNpcy5cbiAgICovXG4gIGJvdW5kYXJ5TGlua3M6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHdpbGwgZGlzcGxheSB0aGUgZGVmYXVsdCBub2RlIHZhbHVlICgnJmhlbGxpcDsnKS5cbiAgICogT3RoZXJ3aXNlLCB3aWxsIGRpc3BsYXkgcHJvdmlkZWQgbm9kZSAod2hlbiBzcGVjaWZpZWQpLlxuICAgKi9cbiAgZWxsaXBzaXM6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2ZUeXBlKFtfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsIF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubm9kZV0pLFxuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgd2lsbCBkaXNwbGF5IHRoZSBkZWZhdWx0IG5vZGUgdmFsdWUgKCcmbGFxdW87JykuXG4gICAqIE90aGVyd2lzZSwgd2lsbCBkaXNwbGF5IHByb3ZpZGVkIG5vZGUgKHdoZW4gc3BlY2lmaWVkKS5cbiAgICovXG4gIGZpcnN0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mVHlwZShbX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLCBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm5vZGVdKSxcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHdpbGwgZGlzcGxheSB0aGUgZGVmYXVsdCBub2RlIHZhbHVlICgnJnJhcXVvOycpLlxuICAgKiBPdGhlcndpc2UsIHdpbGwgZGlzcGxheSBwcm92aWRlZCBub2RlICh3aGVuIHNwZWNpZmllZCkuXG4gICAqL1xuICBsYXN0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mVHlwZShbX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLCBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm5vZGVdKSxcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHdpbGwgZGlzcGxheSB0aGUgZGVmYXVsdCBub2RlIHZhbHVlICgnJmxzYXF1bzsnKS5cbiAgICogT3RoZXJ3aXNlLCB3aWxsIGRpc3BsYXkgcHJvdmlkZWQgbm9kZSAod2hlbiBzcGVjaWZpZWQpLlxuICAgKi9cbiAgcHJldjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZlR5cGUoW19wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCwgX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ub2RlXSksXG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCB3aWxsIGRpc3BsYXkgdGhlIGRlZmF1bHQgbm9kZSB2YWx1ZSAoJyZyc2FxdW87JykuXG4gICAqIE90aGVyd2lzZSwgd2lsbCBkaXNwbGF5IHByb3ZpZGVkIG5vZGUgKHdoZW4gc3BlY2lmaWVkKS5cbiAgICovXG4gIG5leHQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2ZUeXBlKFtfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsIF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubm9kZV0pLFxuXG4gIG9uU2VsZWN0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gdXNlIGEgY3VzdG9tIGVsZW1lbnQgZm9yIHRoZSBidXR0b25zXG4gICAqL1xuICBidXR0b25Db21wb25lbnRDbGFzczogX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBhY3RpdmVQYWdlOiAxLFxuICBpdGVtczogMSxcbiAgbWF4QnV0dG9uczogMCxcbiAgZmlyc3Q6IGZhbHNlLFxuICBsYXN0OiBmYWxzZSxcbiAgcHJldjogZmFsc2UsXG4gIG5leHQ6IGZhbHNlLFxuICBlbGxpcHNpczogdHJ1ZSxcbiAgYm91bmRhcnlMaW5rczogZmFsc2Vcbn07XG5cbnZhciBQYWdpbmF0aW9uID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoUGFnaW5hdGlvbiwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUGFnaW5hdGlvbigpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBQYWdpbmF0aW9uKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgUGFnaW5hdGlvbi5wcm90b3R5cGUucmVuZGVyUGFnZUJ1dHRvbnMgPSBmdW5jdGlvbiByZW5kZXJQYWdlQnV0dG9ucyhhY3RpdmVQYWdlLCBpdGVtcywgbWF4QnV0dG9ucywgYm91bmRhcnlMaW5rcywgZWxsaXBzaXMsIGJ1dHRvblByb3BzKSB7XG4gICAgdmFyIHBhZ2VCdXR0b25zID0gW107XG5cbiAgICB2YXIgc3RhcnRQYWdlID0gdm9pZCAwO1xuICAgIHZhciBlbmRQYWdlID0gdm9pZCAwO1xuXG4gICAgaWYgKG1heEJ1dHRvbnMgJiYgbWF4QnV0dG9ucyA8IGl0ZW1zKSB7XG4gICAgICBzdGFydFBhZ2UgPSBNYXRoLm1heChNYXRoLm1pbihhY3RpdmVQYWdlIC0gTWF0aC5mbG9vcihtYXhCdXR0b25zIC8gMiwgMTApLCBpdGVtcyAtIG1heEJ1dHRvbnMgKyAxKSwgMSk7XG4gICAgICBlbmRQYWdlID0gc3RhcnRQYWdlICsgbWF4QnV0dG9ucyAtIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0UGFnZSA9IDE7XG4gICAgICBlbmRQYWdlID0gaXRlbXM7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgcGFnZSA9IHN0YXJ0UGFnZTsgcGFnZSA8PSBlbmRQYWdlOyArK3BhZ2UpIHtcbiAgICAgIHBhZ2VCdXR0b25zLnB1c2goX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIF9QYWdpbmF0aW9uQnV0dG9uMlsnZGVmYXVsdCddLFxuICAgICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBidXR0b25Qcm9wcywge1xuICAgICAgICAgIGtleTogcGFnZSxcbiAgICAgICAgICBldmVudEtleTogcGFnZSxcbiAgICAgICAgICBhY3RpdmU6IHBhZ2UgPT09IGFjdGl2ZVBhZ2VcbiAgICAgICAgfSksXG4gICAgICAgIHBhZ2VcbiAgICAgICkpO1xuICAgIH1cblxuICAgIGlmIChlbGxpcHNpcyAmJiBib3VuZGFyeUxpbmtzICYmIHN0YXJ0UGFnZSA+IDEpIHtcbiAgICAgIGlmIChzdGFydFBhZ2UgPiAyKSB7XG4gICAgICAgIHBhZ2VCdXR0b25zLnVuc2hpZnQoX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgX1BhZ2luYXRpb25CdXR0b24yWydkZWZhdWx0J10sXG4gICAgICAgICAge1xuICAgICAgICAgICAga2V5OiAnZWxsaXBzaXNGaXJzdCcsXG4gICAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBvbmVudENsYXNzOiBidXR0b25Qcm9wcy5jb21wb25lbnRDbGFzc1xuICAgICAgICAgIH0sXG4gICAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAnc3BhbicsXG4gICAgICAgICAgICB7ICdhcmlhLWxhYmVsJzogJ01vcmUnIH0sXG4gICAgICAgICAgICBlbGxpcHNpcyA9PT0gdHJ1ZSA/ICdcXHUyMDI2JyA6IGVsbGlwc2lzXG4gICAgICAgICAgKVxuICAgICAgICApKTtcbiAgICAgIH1cblxuICAgICAgcGFnZUJ1dHRvbnMudW5zaGlmdChfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgX1BhZ2luYXRpb25CdXR0b24yWydkZWZhdWx0J10sXG4gICAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGJ1dHRvblByb3BzLCB7XG4gICAgICAgICAga2V5OiAxLFxuICAgICAgICAgIGV2ZW50S2V5OiAxLFxuICAgICAgICAgIGFjdGl2ZTogZmFsc2VcbiAgICAgICAgfSksXG4gICAgICAgICcxJ1xuICAgICAgKSk7XG4gICAgfVxuXG4gICAgaWYgKGVsbGlwc2lzICYmIGVuZFBhZ2UgPCBpdGVtcykge1xuICAgICAgaWYgKCFib3VuZGFyeUxpbmtzIHx8IGVuZFBhZ2UgPCBpdGVtcyAtIDEpIHtcbiAgICAgICAgcGFnZUJ1dHRvbnMucHVzaChfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBfUGFnaW5hdGlvbkJ1dHRvbjJbJ2RlZmF1bHQnXSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6ICdlbGxpcHNpcycsXG4gICAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgIGNvbXBvbmVudENsYXNzOiBidXR0b25Qcm9wcy5jb21wb25lbnRDbGFzc1xuICAgICAgICAgIH0sXG4gICAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAnc3BhbicsXG4gICAgICAgICAgICB7ICdhcmlhLWxhYmVsJzogJ01vcmUnIH0sXG4gICAgICAgICAgICBlbGxpcHNpcyA9PT0gdHJ1ZSA/ICdcXHUyMDI2JyA6IGVsbGlwc2lzXG4gICAgICAgICAgKVxuICAgICAgICApKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJvdW5kYXJ5TGlua3MpIHtcbiAgICAgICAgcGFnZUJ1dHRvbnMucHVzaChfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBfUGFnaW5hdGlvbkJ1dHRvbjJbJ2RlZmF1bHQnXSxcbiAgICAgICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBidXR0b25Qcm9wcywge1xuICAgICAgICAgICAga2V5OiBpdGVtcyxcbiAgICAgICAgICAgIGV2ZW50S2V5OiBpdGVtcyxcbiAgICAgICAgICAgIGFjdGl2ZTogZmFsc2VcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBpdGVtc1xuICAgICAgICApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFnZUJ1dHRvbnM7XG4gIH07XG5cbiAgUGFnaW5hdGlvbi5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3RpdmVQYWdlID0gX3Byb3BzLmFjdGl2ZVBhZ2UsXG4gICAgICAgIGl0ZW1zID0gX3Byb3BzLml0ZW1zLFxuICAgICAgICBtYXhCdXR0b25zID0gX3Byb3BzLm1heEJ1dHRvbnMsXG4gICAgICAgIGJvdW5kYXJ5TGlua3MgPSBfcHJvcHMuYm91bmRhcnlMaW5rcyxcbiAgICAgICAgZWxsaXBzaXMgPSBfcHJvcHMuZWxsaXBzaXMsXG4gICAgICAgIGZpcnN0ID0gX3Byb3BzLmZpcnN0LFxuICAgICAgICBsYXN0ID0gX3Byb3BzLmxhc3QsXG4gICAgICAgIHByZXYgPSBfcHJvcHMucHJldixcbiAgICAgICAgbmV4dCA9IF9wcm9wcy5uZXh0LFxuICAgICAgICBvblNlbGVjdCA9IF9wcm9wcy5vblNlbGVjdCxcbiAgICAgICAgYnV0dG9uQ29tcG9uZW50Q2xhc3MgPSBfcHJvcHMuYnV0dG9uQ29tcG9uZW50Q2xhc3MsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2FjdGl2ZVBhZ2UnLCAnaXRlbXMnLCAnbWF4QnV0dG9ucycsICdib3VuZGFyeUxpbmtzJywgJ2VsbGlwc2lzJywgJ2ZpcnN0JywgJ2xhc3QnLCAncHJldicsICduZXh0JywgJ29uU2VsZWN0JywgJ2J1dHRvbkNvbXBvbmVudENsYXNzJywgJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgdmFyIGJ1dHRvblByb3BzID0ge1xuICAgICAgb25TZWxlY3Q6IG9uU2VsZWN0LFxuICAgICAgY29tcG9uZW50Q2xhc3M6IGJ1dHRvbkNvbXBvbmVudENsYXNzXG4gICAgfTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICd1bCcsXG4gICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICAgIH0pLFxuICAgICAgZmlyc3QgJiYgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIF9QYWdpbmF0aW9uQnV0dG9uMlsnZGVmYXVsdCddLFxuICAgICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBidXR0b25Qcm9wcywge1xuICAgICAgICAgIGV2ZW50S2V5OiAxLFxuICAgICAgICAgIGRpc2FibGVkOiBhY3RpdmVQYWdlID09PSAxXG4gICAgICAgIH0pLFxuICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAnc3BhbicsXG4gICAgICAgICAgeyAnYXJpYS1sYWJlbCc6ICdGaXJzdCcgfSxcbiAgICAgICAgICBmaXJzdCA9PT0gdHJ1ZSA/ICdcXHhBQicgOiBmaXJzdFxuICAgICAgICApXG4gICAgICApLFxuICAgICAgcHJldiAmJiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgX1BhZ2luYXRpb25CdXR0b24yWydkZWZhdWx0J10sXG4gICAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGJ1dHRvblByb3BzLCB7XG4gICAgICAgICAgZXZlbnRLZXk6IGFjdGl2ZVBhZ2UgLSAxLFxuICAgICAgICAgIGRpc2FibGVkOiBhY3RpdmVQYWdlID09PSAxXG4gICAgICAgIH0pLFxuICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAnc3BhbicsXG4gICAgICAgICAgeyAnYXJpYS1sYWJlbCc6ICdQcmV2aW91cycgfSxcbiAgICAgICAgICBwcmV2ID09PSB0cnVlID8gJ1xcdTIwMzknIDogcHJldlxuICAgICAgICApXG4gICAgICApLFxuICAgICAgdGhpcy5yZW5kZXJQYWdlQnV0dG9ucyhhY3RpdmVQYWdlLCBpdGVtcywgbWF4QnV0dG9ucywgYm91bmRhcnlMaW5rcywgZWxsaXBzaXMsIGJ1dHRvblByb3BzKSxcbiAgICAgIG5leHQgJiYgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIF9QYWdpbmF0aW9uQnV0dG9uMlsnZGVmYXVsdCddLFxuICAgICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBidXR0b25Qcm9wcywge1xuICAgICAgICAgIGV2ZW50S2V5OiBhY3RpdmVQYWdlICsgMSxcbiAgICAgICAgICBkaXNhYmxlZDogYWN0aXZlUGFnZSA+PSBpdGVtc1xuICAgICAgICB9KSxcbiAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgJ3NwYW4nLFxuICAgICAgICAgIHsgJ2FyaWEtbGFiZWwnOiAnTmV4dCcgfSxcbiAgICAgICAgICBuZXh0ID09PSB0cnVlID8gJ1xcdTIwM0EnIDogbmV4dFxuICAgICAgICApXG4gICAgICApLFxuICAgICAgbGFzdCAmJiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgX1BhZ2luYXRpb25CdXR0b24yWydkZWZhdWx0J10sXG4gICAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGJ1dHRvblByb3BzLCB7XG4gICAgICAgICAgZXZlbnRLZXk6IGl0ZW1zLFxuICAgICAgICAgIGRpc2FibGVkOiBhY3RpdmVQYWdlID49IGl0ZW1zXG4gICAgICAgIH0pLFxuICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAnc3BhbicsXG4gICAgICAgICAgeyAnYXJpYS1sYWJlbCc6ICdMYXN0JyB9LFxuICAgICAgICAgIGxhc3QgPT09IHRydWUgPyAnXFx4QkInIDogbGFzdFxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gUGFnaW5hdGlvbjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cblBhZ2luYXRpb24ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuUGFnaW5hdGlvbi5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ3BhZ2luYXRpb24nLCBQYWdpbmF0aW9uKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX1NhZmVBbmNob3IgPSByZXF1aXJlKCcuL1NhZmVBbmNob3InKTtcblxudmFyIF9TYWZlQW5jaG9yMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1NhZmVBbmNob3IpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbiA9IHJlcXVpcmUoJy4vdXRpbHMvY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluZWRGdW5jdGlvbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuLy8gVE9ETzogVGhpcyBzaG91bGQgYmUgYDxQYWdpbmF0aW9uLkl0ZW0+YC5cblxuLy8gVE9ETzogVGhpcyBzaG91bGQgdXNlIGBjb21wb25lbnRDbGFzc2AgbGlrZSBvdGhlciBjb21wb25lbnRzLlxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBjb21wb25lbnRDbGFzczogX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddLFxuICBjbGFzc05hbWU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICBldmVudEtleTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5hbnksXG4gIG9uU2VsZWN0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIGRpc2FibGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIGFjdGl2ZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBvbkNsaWNrOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmNcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiBfU2FmZUFuY2hvcjJbJ2RlZmF1bHQnXSxcbiAgYWN0aXZlOiBmYWxzZSxcbiAgZGlzYWJsZWQ6IGZhbHNlXG59O1xuXG52YXIgUGFnaW5hdGlvbkJ1dHRvbiA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKFBhZ2luYXRpb25CdXR0b24sIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFBhZ2luYXRpb25CdXR0b24ocHJvcHMsIGNvbnRleHQpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBQYWdpbmF0aW9uQnV0dG9uKTtcblxuICAgIHZhciBfdGhpcyA9ICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICBfdGhpcy5oYW5kbGVDbGljayA9IF90aGlzLmhhbmRsZUNsaWNrLmJpbmQoX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFBhZ2luYXRpb25CdXR0b24ucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgZGlzYWJsZWQgPSBfcHJvcHMuZGlzYWJsZWQsXG4gICAgICAgIG9uU2VsZWN0ID0gX3Byb3BzLm9uU2VsZWN0LFxuICAgICAgICBldmVudEtleSA9IF9wcm9wcy5ldmVudEtleTtcblxuXG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG9uU2VsZWN0KSB7XG4gICAgICBvblNlbGVjdChldmVudEtleSwgZXZlbnQpO1xuICAgIH1cbiAgfTtcblxuICBQYWdpbmF0aW9uQnV0dG9uLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICBDb21wb25lbnQgPSBfcHJvcHMyLmNvbXBvbmVudENsYXNzLFxuICAgICAgICBhY3RpdmUgPSBfcHJvcHMyLmFjdGl2ZSxcbiAgICAgICAgZGlzYWJsZWQgPSBfcHJvcHMyLmRpc2FibGVkLFxuICAgICAgICBvbkNsaWNrID0gX3Byb3BzMi5vbkNsaWNrLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMyLmNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGUgPSBfcHJvcHMyLnN0eWxlLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wczIsIFsnY29tcG9uZW50Q2xhc3MnLCAnYWN0aXZlJywgJ2Rpc2FibGVkJywgJ29uQ2xpY2snLCAnY2xhc3NOYW1lJywgJ3N0eWxlJ10pO1xuXG5cbiAgICBpZiAoQ29tcG9uZW50ID09PSBfU2FmZUFuY2hvcjJbJ2RlZmF1bHQnXSkge1xuICAgICAgLy8gQXNzdW1lIHRoYXQgY3VzdG9tIGNvbXBvbmVudHMgd2FudCBgZXZlbnRLZXlgLlxuICAgICAgZGVsZXRlIHByb3BzLmV2ZW50S2V5O1xuICAgIH1cblxuICAgIGRlbGV0ZSBwcm9wcy5vblNlbGVjdDtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICdsaScsXG4gICAgICB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIHsgYWN0aXZlOiBhY3RpdmUsIGRpc2FibGVkOiBkaXNhYmxlZCB9KSxcbiAgICAgICAgc3R5bGU6IHN0eWxlXG4gICAgICB9LFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBwcm9wcywge1xuICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgIG9uQ2xpY2s6ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKShvbkNsaWNrLCB0aGlzLmhhbmRsZUNsaWNrKVxuICAgICAgfSkpXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gUGFnaW5hdGlvbkJ1dHRvbjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cblBhZ2luYXRpb25CdXR0b24ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuUGFnaW5hdGlvbkJ1dHRvbi5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IFBhZ2luYXRpb25CdXR0b247XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdmFsdWVzID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC92YWx1ZXMnKTtcblxudmFyIF92YWx1ZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmFsdWVzKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9Db2xsYXBzZSA9IHJlcXVpcmUoJy4vQ29sbGFwc2UnKTtcblxudmFyIF9Db2xsYXBzZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Db2xsYXBzZSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbnZhciBfU3R5bGVDb25maWcgPSByZXF1aXJlKCcuL3V0aWxzL1N0eWxlQ29uZmlnJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuLy8gVE9ETzogVXNlIHVuY29udHJvbGxhYmxlLlxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBjb2xsYXBzaWJsZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBvblNlbGVjdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICBoZWFkZXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubm9kZSxcbiAgaWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2ZUeXBlKFtfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZywgX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXJdKSxcbiAgZm9vdGVyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm5vZGUsXG4gIGRlZmF1bHRFeHBhbmRlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBleHBhbmRlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBldmVudEtleTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5hbnksXG4gIGhlYWRlclJvbGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICBwYW5lbFJvbGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuXG4gIC8vIEZyb20gQ29sbGFwc2UuXG4gIG9uRW50ZXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgb25FbnRlcmluZzogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICBvbkVudGVyZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgb25FeGl0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIG9uRXhpdGluZzogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICBvbkV4aXRlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBkZWZhdWx0RXhwYW5kZWQ6IGZhbHNlXG59O1xuXG52YXIgUGFuZWwgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShQYW5lbCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUGFuZWwocHJvcHMsIGNvbnRleHQpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBQYW5lbCk7XG5cbiAgICB2YXIgX3RoaXMgPSAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgX3RoaXMuaGFuZGxlQ2xpY2tUaXRsZSA9IF90aGlzLmhhbmRsZUNsaWNrVGl0bGUuYmluZChfdGhpcyk7XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGV4cGFuZGVkOiBfdGhpcy5wcm9wcy5kZWZhdWx0RXhwYW5kZWRcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFBhbmVsLnByb3RvdHlwZS5oYW5kbGVDbGlja1RpdGxlID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2tUaXRsZShlKSB7XG4gICAgLy8gRklYTUU6IFdoYXQgdGhlIGhlY2s/IFRoaXMgQVBJIGlzIGhvcnJpYmxlLiBUaGlzIG5lZWRzIHRvIGdvIGF3YXkhXG4gICAgZS5wZXJzaXN0KCk7XG4gICAgZS5zZWxlY3RlZCA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5vblNlbGVjdCkge1xuICAgICAgdGhpcy5wcm9wcy5vblNlbGVjdCh0aGlzLnByb3BzLmV2ZW50S2V5LCBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmIChlLnNlbGVjdGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgZXhwYW5kZWQ6ICF0aGlzLnN0YXRlLmV4cGFuZGVkIH0pO1xuICAgIH1cbiAgfTtcblxuICBQYW5lbC5wcm90b3R5cGUucmVuZGVySGVhZGVyID0gZnVuY3Rpb24gcmVuZGVySGVhZGVyKGNvbGxhcHNpYmxlLCBoZWFkZXIsIGlkLCByb2xlLCBleHBhbmRlZCwgYnNQcm9wcykge1xuICAgIHZhciB0aXRsZUNsYXNzTmFtZSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAndGl0bGUnKTtcblxuICAgIGlmICghY29sbGFwc2libGUpIHtcbiAgICAgIGlmICghX3JlYWN0MlsnZGVmYXVsdCddLmlzVmFsaWRFbGVtZW50KGhlYWRlcikpIHtcbiAgICAgICAgcmV0dXJuIGhlYWRlcjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICgwLCBfcmVhY3QuY2xvbmVFbGVtZW50KShoZWFkZXIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGhlYWRlci5wcm9wcy5jbGFzc05hbWUsIHRpdGxlQ2xhc3NOYW1lKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKCFfcmVhY3QyWydkZWZhdWx0J10uaXNWYWxpZEVsZW1lbnQoaGVhZGVyKSkge1xuICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnaDQnLFxuICAgICAgICB7IHJvbGU6ICdwcmVzZW50YXRpb24nLCBjbGFzc05hbWU6IHRpdGxlQ2xhc3NOYW1lIH0sXG4gICAgICAgIHRoaXMucmVuZGVyQW5jaG9yKGhlYWRlciwgaWQsIHJvbGUsIGV4cGFuZGVkKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGhlYWRlciwge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGhlYWRlci5wcm9wcy5jbGFzc05hbWUsIHRpdGxlQ2xhc3NOYW1lKSxcbiAgICAgIGNoaWxkcmVuOiB0aGlzLnJlbmRlckFuY2hvcihoZWFkZXIucHJvcHMuY2hpbGRyZW4sIGlkLCByb2xlLCBleHBhbmRlZClcbiAgICB9KTtcbiAgfTtcblxuICBQYW5lbC5wcm90b3R5cGUucmVuZGVyQW5jaG9yID0gZnVuY3Rpb24gcmVuZGVyQW5jaG9yKGhlYWRlciwgaWQsIHJvbGUsIGV4cGFuZGVkKSB7XG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2EnLFxuICAgICAge1xuICAgICAgICByb2xlOiByb2xlLFxuICAgICAgICBocmVmOiBpZCAmJiAnIycgKyBpZCxcbiAgICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDbGlja1RpdGxlLFxuICAgICAgICAnYXJpYS1jb250cm9scyc6IGlkLFxuICAgICAgICAnYXJpYS1leHBhbmRlZCc6IGV4cGFuZGVkLFxuICAgICAgICAnYXJpYS1zZWxlY3RlZCc6IGV4cGFuZGVkLFxuICAgICAgICBjbGFzc05hbWU6IGV4cGFuZGVkID8gbnVsbCA6ICdjb2xsYXBzZWQnXG4gICAgICB9LFxuICAgICAgaGVhZGVyXG4gICAgKTtcbiAgfTtcblxuICBQYW5lbC5wcm90b3R5cGUucmVuZGVyQ29sbGFwc2libGVCb2R5ID0gZnVuY3Rpb24gcmVuZGVyQ29sbGFwc2libGVCb2R5KGlkLCBleHBhbmRlZCwgcm9sZSwgY2hpbGRyZW4sIGJzUHJvcHMsIGFuaW1hdGlvbkhvb2tzKSB7XG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgX0NvbGxhcHNlMlsnZGVmYXVsdCddLFxuICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7ICdpbic6IGV4cGFuZGVkIH0sIGFuaW1hdGlvbkhvb2tzKSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBpZCxcbiAgICAgICAgICByb2xlOiByb2xlLFxuICAgICAgICAgIGNsYXNzTmFtZTogKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdjb2xsYXBzZScpLFxuICAgICAgICAgICdhcmlhLWhpZGRlbic6ICFleHBhbmRlZFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLnJlbmRlckJvZHkoY2hpbGRyZW4sIGJzUHJvcHMpXG4gICAgICApXG4gICAgKTtcbiAgfTtcblxuICBQYW5lbC5wcm90b3R5cGUucmVuZGVyQm9keSA9IGZ1bmN0aW9uIHJlbmRlckJvZHkocmF3Q2hpbGRyZW4sIGJzUHJvcHMpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBbXTtcbiAgICB2YXIgYm9keUNoaWxkcmVuID0gW107XG5cbiAgICB2YXIgYm9keUNsYXNzTmFtZSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnYm9keScpO1xuXG4gICAgZnVuY3Rpb24gbWF5YmVBZGRCb2R5KCkge1xuICAgICAgaWYgKCFib2R5Q2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRGVyaXZlIHRoZSBrZXkgZnJvbSB0aGUgaW5kZXggaGVyZSwgc2luY2Ugd2UgbmVlZCB0byBtYWtlIG9uZSB1cC5cbiAgICAgIGNoaWxkcmVuLnB1c2goX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7IGtleTogY2hpbGRyZW4ubGVuZ3RoLCBjbGFzc05hbWU6IGJvZHlDbGFzc05hbWUgfSxcbiAgICAgICAgYm9keUNoaWxkcmVuXG4gICAgICApKTtcblxuICAgICAgYm9keUNoaWxkcmVuID0gW107XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCB0byBhcnJheSBzbyB3ZSBjYW4gcmUtdXNlIGtleXMuXG4gICAgX3JlYWN0MlsnZGVmYXVsdCddLkNoaWxkcmVuLnRvQXJyYXkocmF3Q2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICBpZiAoX3JlYWN0MlsnZGVmYXVsdCddLmlzVmFsaWRFbGVtZW50KGNoaWxkKSAmJiBjaGlsZC5wcm9wcy5maWxsKSB7XG4gICAgICAgIG1heWJlQWRkQm9keSgpO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgY2hpbGQncyB1bmtub3duIGBmaWxsYCBwcm9wLlxuICAgICAgICBjaGlsZHJlbi5wdXNoKCgwLCBfcmVhY3QuY2xvbmVFbGVtZW50KShjaGlsZCwgeyBmaWxsOiB1bmRlZmluZWQgfSkpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYm9keUNoaWxkcmVuLnB1c2goY2hpbGQpO1xuICAgIH0pO1xuXG4gICAgbWF5YmVBZGRCb2R5KCk7XG5cbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH07XG5cbiAgUGFuZWwucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY29sbGFwc2libGUgPSBfcHJvcHMuY29sbGFwc2libGUsXG4gICAgICAgIGhlYWRlciA9IF9wcm9wcy5oZWFkZXIsXG4gICAgICAgIGlkID0gX3Byb3BzLmlkLFxuICAgICAgICBmb290ZXIgPSBfcHJvcHMuZm9vdGVyLFxuICAgICAgICBwcm9wc0V4cGFuZGVkID0gX3Byb3BzLmV4cGFuZGVkLFxuICAgICAgICBoZWFkZXJSb2xlID0gX3Byb3BzLmhlYWRlclJvbGUsXG4gICAgICAgIHBhbmVsUm9sZSA9IF9wcm9wcy5wYW5lbFJvbGUsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBvbkVudGVyID0gX3Byb3BzLm9uRW50ZXIsXG4gICAgICAgIG9uRW50ZXJpbmcgPSBfcHJvcHMub25FbnRlcmluZyxcbiAgICAgICAgb25FbnRlcmVkID0gX3Byb3BzLm9uRW50ZXJlZCxcbiAgICAgICAgb25FeGl0ID0gX3Byb3BzLm9uRXhpdCxcbiAgICAgICAgb25FeGl0aW5nID0gX3Byb3BzLm9uRXhpdGluZyxcbiAgICAgICAgb25FeGl0ZWQgPSBfcHJvcHMub25FeGl0ZWQsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NvbGxhcHNpYmxlJywgJ2hlYWRlcicsICdpZCcsICdmb290ZXInLCAnZXhwYW5kZWQnLCAnaGVhZGVyUm9sZScsICdwYW5lbFJvbGUnLCAnY2xhc3NOYW1lJywgJ2NoaWxkcmVuJywgJ29uRW50ZXInLCAnb25FbnRlcmluZycsICdvbkVudGVyZWQnLCAnb25FeGl0JywgJ29uRXhpdGluZycsICdvbkV4aXRlZCddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzQW5kT21pdCA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzQW5kT21pdCkocHJvcHMsIFsnZGVmYXVsdEV4cGFuZGVkJywgJ2V2ZW50S2V5JywgJ29uU2VsZWN0J10pLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc0FuZE9taXRbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNBbmRPbWl0WzFdO1xuXG4gICAgdmFyIGV4cGFuZGVkID0gcHJvcHNFeHBhbmRlZCAhPSBudWxsID8gcHJvcHNFeHBhbmRlZCA6IHRoaXMuc3RhdGUuZXhwYW5kZWQ7XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2RpdicsXG4gICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcyksXG4gICAgICAgIGlkOiBjb2xsYXBzaWJsZSA/IG51bGwgOiBpZFxuICAgICAgfSksXG4gICAgICBoZWFkZXIgJiYgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7IGNsYXNzTmFtZTogKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdoZWFkaW5nJykgfSxcbiAgICAgICAgdGhpcy5yZW5kZXJIZWFkZXIoY29sbGFwc2libGUsIGhlYWRlciwgaWQsIGhlYWRlclJvbGUsIGV4cGFuZGVkLCBic1Byb3BzKVxuICAgICAgKSxcbiAgICAgIGNvbGxhcHNpYmxlID8gdGhpcy5yZW5kZXJDb2xsYXBzaWJsZUJvZHkoaWQsIGV4cGFuZGVkLCBwYW5lbFJvbGUsIGNoaWxkcmVuLCBic1Byb3BzLCB7IG9uRW50ZXI6IG9uRW50ZXIsIG9uRW50ZXJpbmc6IG9uRW50ZXJpbmcsIG9uRW50ZXJlZDogb25FbnRlcmVkLCBvbkV4aXQ6IG9uRXhpdCwgb25FeGl0aW5nOiBvbkV4aXRpbmcsIG9uRXhpdGVkOiBvbkV4aXRlZCB9KSA6IHRoaXMucmVuZGVyQm9keShjaGlsZHJlbiwgYnNQcm9wcyksXG4gICAgICBmb290ZXIgJiYgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7IGNsYXNzTmFtZTogKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdmb290ZXInKSB9LFxuICAgICAgICBmb290ZXJcbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBQYW5lbDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cblBhbmVsLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblBhbmVsLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgncGFuZWwnLCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzU3R5bGVzKShbXS5jb25jYXQoKDAsIF92YWx1ZXMyWydkZWZhdWx0J10pKF9TdHlsZUNvbmZpZy5TdGF0ZSksIFtfU3R5bGVDb25maWcuU3R5bGUuREVGQVVMVCwgX1N0eWxlQ29uZmlnLlN0eWxlLlBSSU1BUlldKSwgX1N0eWxlQ29uZmlnLlN0eWxlLkRFRkFVTFQsIFBhbmVsKSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvYXNzaWduJyk7XG5cbnZhciBfYXNzaWduMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Fzc2lnbik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24gPSByZXF1aXJlKCcuL3V0aWxzL2NyZWF0ZUNoYWluZWRGdW5jdGlvbicpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24pO1xuXG52YXIgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4gPSByZXF1aXJlKCcuL3V0aWxzL1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4nKTtcblxudmFyIF9WYWxpZENvbXBvbmVudENoaWxkcmVuMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGFjY29yZGlvbjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBhY3RpdmVLZXk6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYW55LFxuICBkZWZhdWx0QWN0aXZlS2V5OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmFueSxcbiAgb25TZWxlY3Q6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgcm9sZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmdcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGFjY29yZGlvbjogZmFsc2Vcbn07XG5cbi8vIFRPRE86IFVzZSB1bmNvbnRyb2xsYWJsZS5cblxudmFyIFBhbmVsR3JvdXAgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShQYW5lbEdyb3VwLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBQYW5lbEdyb3VwKHByb3BzLCBjb250ZXh0KSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgUGFuZWxHcm91cCk7XG5cbiAgICB2YXIgX3RoaXMgPSAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgX3RoaXMuaGFuZGxlU2VsZWN0ID0gX3RoaXMuaGFuZGxlU2VsZWN0LmJpbmQoX3RoaXMpO1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBhY3RpdmVLZXk6IHByb3BzLmRlZmF1bHRBY3RpdmVLZXlcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFBhbmVsR3JvdXAucHJvdG90eXBlLmhhbmRsZVNlbGVjdCA9IGZ1bmN0aW9uIGhhbmRsZVNlbGVjdChrZXksIGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5vblNlbGVjdCkge1xuICAgICAgdGhpcy5wcm9wcy5vblNlbGVjdChrZXksIGUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlLmFjdGl2ZUtleSA9PT0ga2V5KSB7XG4gICAgICBrZXkgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoeyBhY3RpdmVLZXk6IGtleSB9KTtcbiAgfTtcblxuICBQYW5lbEdyb3VwLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYWNjb3JkaW9uID0gX3Byb3BzLmFjY29yZGlvbixcbiAgICAgICAgcHJvcHNBY3RpdmVLZXkgPSBfcHJvcHMuYWN0aXZlS2V5LFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnYWNjb3JkaW9uJywgJ2FjdGl2ZUtleScsICdjbGFzc05hbWUnLCAnY2hpbGRyZW4nXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wc0FuZE9taXQgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wc0FuZE9taXQpKHByb3BzLCBbJ2RlZmF1bHRBY3RpdmVLZXknLCAnb25TZWxlY3QnXSksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzQW5kT21pdFswXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc0FuZE9taXRbMV07XG5cbiAgICB2YXIgYWN0aXZlS2V5ID0gdm9pZCAwO1xuICAgIGlmIChhY2NvcmRpb24pIHtcbiAgICAgIGFjdGl2ZUtleSA9IHByb3BzQWN0aXZlS2V5ICE9IG51bGwgPyBwcm9wc0FjdGl2ZUtleSA6IHRoaXMuc3RhdGUuYWN0aXZlS2V5O1xuICAgICAgZWxlbWVudFByb3BzLnJvbGUgPSBlbGVtZW50UHJvcHMucm9sZSB8fCAndGFibGlzdCc7XG4gICAgfVxuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICdkaXYnLFxuICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgICB9KSxcbiAgICAgIF9WYWxpZENvbXBvbmVudENoaWxkcmVuMlsnZGVmYXVsdCddLm1hcChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHZhciBjaGlsZFByb3BzID0ge1xuICAgICAgICAgIGJzU3R5bGU6IGNoaWxkLnByb3BzLmJzU3R5bGUgfHwgYnNQcm9wcy5ic1N0eWxlXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGFjY29yZGlvbikge1xuICAgICAgICAgICgwLCBfYXNzaWduMlsnZGVmYXVsdCddKShjaGlsZFByb3BzLCB7XG4gICAgICAgICAgICBoZWFkZXJSb2xlOiAndGFiJyxcbiAgICAgICAgICAgIHBhbmVsUm9sZTogJ3RhYnBhbmVsJyxcbiAgICAgICAgICAgIGNvbGxhcHNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgZXhwYW5kZWQ6IGNoaWxkLnByb3BzLmV2ZW50S2V5ID09PSBhY3RpdmVLZXksXG4gICAgICAgICAgICBvblNlbGVjdDogKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKF90aGlzMi5oYW5kbGVTZWxlY3QsIGNoaWxkLnByb3BzLm9uU2VsZWN0KVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICgwLCBfcmVhY3QuY2xvbmVFbGVtZW50KShjaGlsZCwgY2hpbGRQcm9wcyk7XG4gICAgICB9KVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFBhbmVsR3JvdXA7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5QYW5lbEdyb3VwLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblBhbmVsR3JvdXAuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdwYW5lbC1ncm91cCcsIFBhbmVsR3JvdXApO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMzID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzNCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMzKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2lzUmVxdWlyZWRGb3JBMTF5ID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvaXNSZXF1aXJlZEZvckExMXknKTtcblxudmFyIF9pc1JlcXVpcmVkRm9yQTExeTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pc1JlcXVpcmVkRm9yQTExeSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIEFuIGh0bWwgaWQgYXR0cmlidXRlLCBuZWNlc3NhcnkgZm9yIGFjY2Vzc2liaWxpdHlcbiAgICogQHR5cGUge3N0cmluZ31cbiAgICogQHJlcXVpcmVkXG4gICAqL1xuICBpZDogKDAsIF9pc1JlcXVpcmVkRm9yQTExeTJbJ2RlZmF1bHQnXSkoX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZlR5cGUoW19wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLCBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcl0pKSxcblxuICAvKipcbiAgICogU2V0cyB0aGUgZGlyZWN0aW9uIHRoZSBQb3BvdmVyIGlzIHBvc2l0aW9uZWQgdG93YXJkcy5cbiAgICovXG4gIHBsYWNlbWVudDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZihbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddKSxcblxuICAvKipcbiAgICogVGhlIFwidG9wXCIgcG9zaXRpb24gdmFsdWUgZm9yIHRoZSBQb3BvdmVyLlxuICAgKi9cbiAgcG9zaXRpb25Ub3A6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2ZUeXBlKFtfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlciwgX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmddKSxcbiAgLyoqXG4gICAqIFRoZSBcImxlZnRcIiBwb3NpdGlvbiB2YWx1ZSBmb3IgdGhlIFBvcG92ZXIuXG4gICAqL1xuICBwb3NpdGlvbkxlZnQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2ZUeXBlKFtfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlciwgX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmddKSxcblxuICAvKipcbiAgICogVGhlIFwidG9wXCIgcG9zaXRpb24gdmFsdWUgZm9yIHRoZSBQb3BvdmVyIGFycm93LlxuICAgKi9cbiAgYXJyb3dPZmZzZXRUb3A6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2ZUeXBlKFtfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlciwgX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmddKSxcbiAgLyoqXG4gICAqIFRoZSBcImxlZnRcIiBwb3NpdGlvbiB2YWx1ZSBmb3IgdGhlIFBvcG92ZXIgYXJyb3cuXG4gICAqL1xuICBhcnJvd09mZnNldExlZnQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2ZUeXBlKFtfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlciwgX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmddKSxcblxuICAvKipcbiAgICogVGl0bGUgY29udGVudFxuICAgKi9cbiAgdGl0bGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubm9kZVxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgcGxhY2VtZW50OiAncmlnaHQnXG59O1xuXG52YXIgUG9wb3ZlciA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKFBvcG92ZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFBvcG92ZXIoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgUG9wb3Zlcik7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIFBvcG92ZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX2V4dGVuZHMyO1xuXG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIHBsYWNlbWVudCA9IF9wcm9wcy5wbGFjZW1lbnQsXG4gICAgICAgIHBvc2l0aW9uVG9wID0gX3Byb3BzLnBvc2l0aW9uVG9wLFxuICAgICAgICBwb3NpdGlvbkxlZnQgPSBfcHJvcHMucG9zaXRpb25MZWZ0LFxuICAgICAgICBhcnJvd09mZnNldFRvcCA9IF9wcm9wcy5hcnJvd09mZnNldFRvcCxcbiAgICAgICAgYXJyb3dPZmZzZXRMZWZ0ID0gX3Byb3BzLmFycm93T2Zmc2V0TGVmdCxcbiAgICAgICAgdGl0bGUgPSBfcHJvcHMudGl0bGUsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHN0eWxlID0gX3Byb3BzLnN0eWxlLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsncGxhY2VtZW50JywgJ3Bvc2l0aW9uVG9wJywgJ3Bvc2l0aW9uTGVmdCcsICdhcnJvd09mZnNldFRvcCcsICdhcnJvd09mZnNldExlZnQnLCAndGl0bGUnLCAnY2xhc3NOYW1lJywgJ3N0eWxlJywgJ2NoaWxkcmVuJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyksIChfZXh0ZW5kczIgPSB7fSwgX2V4dGVuZHMyW3BsYWNlbWVudF0gPSB0cnVlLCBfZXh0ZW5kczIpKTtcblxuICAgIHZhciBvdXRlclN0eWxlID0gKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7XG4gICAgICBkaXNwbGF5OiAnYmxvY2snLFxuICAgICAgdG9wOiBwb3NpdGlvblRvcCxcbiAgICAgIGxlZnQ6IHBvc2l0aW9uTGVmdFxuICAgIH0sIHN0eWxlKTtcblxuICAgIHZhciBhcnJvd1N0eWxlID0ge1xuICAgICAgdG9wOiBhcnJvd09mZnNldFRvcCxcbiAgICAgIGxlZnQ6IGFycm93T2Zmc2V0TGVmdFxuICAgIH07XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnZGl2JyxcbiAgICAgICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgICByb2xlOiAndG9vbHRpcCcsXG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpLFxuICAgICAgICBzdHlsZTogb3V0ZXJTdHlsZVxuICAgICAgfSksXG4gICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnZGl2JywgeyBjbGFzc05hbWU6ICdhcnJvdycsIHN0eWxlOiBhcnJvd1N0eWxlIH0pLFxuICAgICAgdGl0bGUgJiYgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdoMycsXG4gICAgICAgIHsgY2xhc3NOYW1lOiAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ3RpdGxlJykgfSxcbiAgICAgICAgdGl0bGVcbiAgICAgICksXG4gICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHsgY2xhc3NOYW1lOiAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ2NvbnRlbnQnKSB9LFxuICAgICAgICBjaGlsZHJlblxuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFBvcG92ZXI7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5Qb3BvdmVyLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblBvcG92ZXIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdwb3BvdmVyJywgUG9wb3Zlcik7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdmFsdWVzID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC92YWx1ZXMnKTtcblxudmFyIF92YWx1ZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmFsdWVzKTtcblxudmFyIF9leHRlbmRzMyA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxudmFyIF9TdHlsZUNvbmZpZyA9IHJlcXVpcmUoJy4vdXRpbHMvU3R5bGVDb25maWcnKTtcblxudmFyIF9WYWxpZENvbXBvbmVudENoaWxkcmVuID0gcmVxdWlyZSgnLi91dGlscy9WYWxpZENvbXBvbmVudENoaWxkcmVuJyk7XG5cbnZhciBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9WYWxpZENvbXBvbmVudENoaWxkcmVuKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgUk9VTkRfUFJFQ0lTSU9OID0gMTAwMDtcblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGNoaWxkcmVuLCBpZiBhbnksIGFyZSBpbnN0YW5jZXMgb2YgYDxQcm9ncmVzc0Jhcj5gLlxuICovXG5mdW5jdGlvbiBvbmx5UHJvZ3Jlc3NCYXIocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gIHZhciBjaGlsZHJlbiA9IHByb3BzW3Byb3BOYW1lXTtcbiAgaWYgKCFjaGlsZHJlbikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGVycm9yID0gbnVsbDtcblxuICBfcmVhY3QyWydkZWZhdWx0J10uQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkLnR5cGUgPT09IFByb2dyZXNzQmFyKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGNoaWxkSWRlbnRpZmllciA9IF9yZWFjdDJbJ2RlZmF1bHQnXS5pc1ZhbGlkRWxlbWVudChjaGlsZCkgPyBjaGlsZC50eXBlLmRpc3BsYXlOYW1lIHx8IGNoaWxkLnR5cGUubmFtZSB8fCBjaGlsZC50eXBlIDogY2hpbGQ7XG4gICAgZXJyb3IgPSBuZXcgRXJyb3IoJ0NoaWxkcmVuIG9mICcgKyBjb21wb25lbnROYW1lICsgJyBjYW4gY29udGFpbiBvbmx5IFByb2dyZXNzQmFyICcgKyAoJ2NvbXBvbmVudHMuIEZvdW5kICcgKyBjaGlsZElkZW50aWZpZXIgKyAnLicpKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGVycm9yO1xufVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBtaW46IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICBub3c6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICBtYXg6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICBsYWJlbDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ub2RlLFxuICBzck9ubHk6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgc3RyaXBlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBhY3RpdmU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgY2hpbGRyZW46IG9ubHlQcm9ncmVzc0JhcixcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzQ2hpbGQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbFxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgbWluOiAwLFxuICBtYXg6IDEwMCxcbiAgYWN0aXZlOiBmYWxzZSxcbiAgaXNDaGlsZDogZmFsc2UsXG4gIHNyT25seTogZmFsc2UsXG4gIHN0cmlwZWQ6IGZhbHNlXG59O1xuXG5mdW5jdGlvbiBnZXRQZXJjZW50YWdlKG5vdywgbWluLCBtYXgpIHtcbiAgdmFyIHBlcmNlbnRhZ2UgPSAobm93IC0gbWluKSAvIChtYXggLSBtaW4pICogMTAwO1xuICByZXR1cm4gTWF0aC5yb3VuZChwZXJjZW50YWdlICogUk9VTkRfUFJFQ0lTSU9OKSAvIFJPVU5EX1BSRUNJU0lPTjtcbn1cblxudmFyIFByb2dyZXNzQmFyID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoUHJvZ3Jlc3NCYXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFByb2dyZXNzQmFyKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIFByb2dyZXNzQmFyKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgUHJvZ3Jlc3NCYXIucHJvdG90eXBlLnJlbmRlclByb2dyZXNzQmFyID0gZnVuY3Rpb24gcmVuZGVyUHJvZ3Jlc3NCYXIoX3JlZikge1xuICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICB2YXIgbWluID0gX3JlZi5taW4sXG4gICAgICAgIG5vdyA9IF9yZWYubm93LFxuICAgICAgICBtYXggPSBfcmVmLm1heCxcbiAgICAgICAgbGFiZWwgPSBfcmVmLmxhYmVsLFxuICAgICAgICBzck9ubHkgPSBfcmVmLnNyT25seSxcbiAgICAgICAgc3RyaXBlZCA9IF9yZWYuc3RyaXBlZCxcbiAgICAgICAgYWN0aXZlID0gX3JlZi5hY3RpdmUsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgICAgICBzdHlsZSA9IF9yZWYuc3R5bGUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3JlZiwgWydtaW4nLCAnbm93JywgJ21heCcsICdsYWJlbCcsICdzck9ubHknLCAnc3RyaXBlZCcsICdhY3RpdmUnLCAnY2xhc3NOYW1lJywgJ3N0eWxlJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyksIChfZXh0ZW5kczIgPSB7XG4gICAgICBhY3RpdmU6IGFjdGl2ZVxuICAgIH0sIF9leHRlbmRzMlsoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ3N0cmlwZWQnKV0gPSBhY3RpdmUgfHwgc3RyaXBlZCwgX2V4dGVuZHMyKSk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnZGl2JyxcbiAgICAgICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgICByb2xlOiAncHJvZ3Jlc3NiYXInLFxuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKSxcbiAgICAgICAgc3R5bGU6ICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoeyB3aWR0aDogZ2V0UGVyY2VudGFnZShub3csIG1pbiwgbWF4KSArICclJyB9LCBzdHlsZSksXG4gICAgICAgICdhcmlhLXZhbHVlbm93Jzogbm93LFxuICAgICAgICAnYXJpYS12YWx1ZW1pbic6IG1pbixcbiAgICAgICAgJ2FyaWEtdmFsdWVtYXgnOiBtYXhcbiAgICAgIH0pLFxuICAgICAgc3JPbmx5ID8gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdzcGFuJyxcbiAgICAgICAgeyBjbGFzc05hbWU6ICdzci1vbmx5JyB9LFxuICAgICAgICBsYWJlbFxuICAgICAgKSA6IGxhYmVsXG4gICAgKTtcbiAgfTtcblxuICBQcm9ncmVzc0Jhci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBpc0NoaWxkID0gX3Byb3BzLmlzQ2hpbGQsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2lzQ2hpbGQnXSk7XG5cblxuICAgIGlmIChpc0NoaWxkKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJQcm9ncmVzc0Jhcihwcm9wcyk7XG4gICAgfVxuXG4gICAgdmFyIG1pbiA9IHByb3BzLm1pbixcbiAgICAgICAgbm93ID0gcHJvcHMubm93LFxuICAgICAgICBtYXggPSBwcm9wcy5tYXgsXG4gICAgICAgIGxhYmVsID0gcHJvcHMubGFiZWwsXG4gICAgICAgIHNyT25seSA9IHByb3BzLnNyT25seSxcbiAgICAgICAgc3RyaXBlZCA9IHByb3BzLnN0cmlwZWQsXG4gICAgICAgIGFjdGl2ZSA9IHByb3BzLmFjdGl2ZSxcbiAgICAgICAgYnNDbGFzcyA9IHByb3BzLmJzQ2xhc3MsXG4gICAgICAgIGJzU3R5bGUgPSBwcm9wcy5ic1N0eWxlLFxuICAgICAgICBjbGFzc05hbWUgPSBwcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGNoaWxkcmVuID0gcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHdyYXBwZXJQcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKHByb3BzLCBbJ21pbicsICdub3cnLCAnbWF4JywgJ2xhYmVsJywgJ3NyT25seScsICdzdHJpcGVkJywgJ2FjdGl2ZScsICdic0NsYXNzJywgJ2JzU3R5bGUnLCAnY2xhc3NOYW1lJywgJ2NoaWxkcmVuJ10pO1xuXG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnZGl2JyxcbiAgICAgICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoe30sIHdyYXBwZXJQcm9wcywge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCAncHJvZ3Jlc3MnKVxuICAgICAgfSksXG4gICAgICBjaGlsZHJlbiA/IF9WYWxpZENvbXBvbmVudENoaWxkcmVuMlsnZGVmYXVsdCddLm1hcChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiAoMCwgX3JlYWN0LmNsb25lRWxlbWVudCkoY2hpbGQsIHsgaXNDaGlsZDogdHJ1ZSB9KTtcbiAgICAgIH0pIDogdGhpcy5yZW5kZXJQcm9ncmVzc0Jhcih7XG4gICAgICAgIG1pbjogbWluLCBub3c6IG5vdywgbWF4OiBtYXgsIGxhYmVsOiBsYWJlbCwgc3JPbmx5OiBzck9ubHksIHN0cmlwZWQ6IHN0cmlwZWQsIGFjdGl2ZTogYWN0aXZlLCBic0NsYXNzOiBic0NsYXNzLCBic1N0eWxlOiBic1N0eWxlXG4gICAgICB9KVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFByb2dyZXNzQmFyO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuUHJvZ3Jlc3NCYXIucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuUHJvZ3Jlc3NCYXIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdwcm9ncmVzcy1iYXInLCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzU3R5bGVzKSgoMCwgX3ZhbHVlczJbJ2RlZmF1bHQnXSkoX1N0eWxlQ29uZmlnLlN0YXRlKSwgUHJvZ3Jlc3NCYXIpKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF93YXJuaW5nID0gcmVxdWlyZSgnd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgaW5saW5lOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIGRpc2FibGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIC8qKlxuICAgKiBPbmx5IHZhbGlkIGlmIGBpbmxpbmVgIGlzIG5vdCBzZXQuXG4gICAqL1xuICB2YWxpZGF0aW9uU3RhdGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2YoWydzdWNjZXNzJywgJ3dhcm5pbmcnLCAnZXJyb3InLCBudWxsXSksXG4gIC8qKlxuICAgKiBBdHRhY2hlcyBhIHJlZiB0byB0aGUgYDxpbnB1dD5gIGVsZW1lbnQuIE9ubHkgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGhlcmUuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIDxSYWRpbyBpbnB1dFJlZj17cmVmID0+IHsgdGhpcy5pbnB1dCA9IHJlZjsgfX0gLz5cbiAgICogYGBgXG4gICAqL1xuICBpbnB1dFJlZjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBpbmxpbmU6IGZhbHNlLFxuICBkaXNhYmxlZDogZmFsc2Vcbn07XG5cbnZhciBSYWRpbyA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKFJhZGlvLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBSYWRpbygpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBSYWRpbyk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIFJhZGlvLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGlubGluZSA9IF9wcm9wcy5pbmxpbmUsXG4gICAgICAgIGRpc2FibGVkID0gX3Byb3BzLmRpc2FibGVkLFxuICAgICAgICB2YWxpZGF0aW9uU3RhdGUgPSBfcHJvcHMudmFsaWRhdGlvblN0YXRlLFxuICAgICAgICBpbnB1dFJlZiA9IF9wcm9wcy5pbnB1dFJlZixcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGUgPSBfcHJvcHMuc3R5bGUsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydpbmxpbmUnLCAnZGlzYWJsZWQnLCAndmFsaWRhdGlvblN0YXRlJywgJ2lucHV0UmVmJywgJ2NsYXNzTmFtZScsICdzdHlsZScsICdjaGlsZHJlbiddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgaW5wdXQgPSBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnaW5wdXQnLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIHJlZjogaW5wdXRSZWYsXG4gICAgICB0eXBlOiAncmFkaW8nLFxuICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkXG4gICAgfSkpO1xuXG4gICAgaWYgKGlubGluZSkge1xuICAgICAgdmFyIF9jbGFzc2VzMjtcblxuICAgICAgdmFyIF9jbGFzc2VzID0gKF9jbGFzc2VzMiA9IHt9LCBfY2xhc3NlczJbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdpbmxpbmUnKV0gPSB0cnVlLCBfY2xhc3NlczIuZGlzYWJsZWQgPSBkaXNhYmxlZCwgX2NsYXNzZXMyKTtcblxuICAgICAgLy8gVXNlIGEgd2FybmluZyBoZXJlIGluc3RlYWQgb2YgaW4gcHJvcFR5cGVzIHRvIGdldCBiZXR0ZXItbG9va2luZ1xuICAgICAgLy8gZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24uXG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gKDAsIF93YXJuaW5nMlsnZGVmYXVsdCddKSghdmFsaWRhdGlvblN0YXRlLCAnYHZhbGlkYXRpb25TdGF0ZWAgaXMgaWdub3JlZCBvbiBgPFJhZGlvIGlubGluZT5gLiBUbyBkaXNwbGF5ICcgKyAndmFsaWRhdGlvbiBzdGF0ZSBvbiBhbiBpbmxpbmUgcmFkaW8sIHNldCBgdmFsaWRhdGlvblN0YXRlYCBvbiBhICcgKyAncGFyZW50IGA8Rm9ybUdyb3VwPmAgb3Igb3RoZXIgZWxlbWVudCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuXG4gICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdsYWJlbCcsXG4gICAgICAgIHsgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgX2NsYXNzZXMpLCBzdHlsZTogc3R5bGUgfSxcbiAgICAgICAgaW5wdXQsXG4gICAgICAgIGNoaWxkcmVuXG4gICAgICApO1xuICAgIH1cblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyksIHtcbiAgICAgIGRpc2FibGVkOiBkaXNhYmxlZFxuICAgIH0pO1xuICAgIGlmICh2YWxpZGF0aW9uU3RhdGUpIHtcbiAgICAgIGNsYXNzZXNbJ2hhcy0nICsgdmFsaWRhdGlvblN0YXRlXSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2RpdicsXG4gICAgICB7IGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpLCBzdHlsZTogc3R5bGUgfSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnbGFiZWwnLFxuICAgICAgICBudWxsLFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgY2hpbGRyZW5cbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBSYWRpbztcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cblJhZGlvLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblJhZGlvLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgncmFkaW8nLCBSYWRpbyk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczMgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHM0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczMpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfd2FybmluZyA9IHJlcXVpcmUoJ3dhcm5pbmcnKTtcblxudmFyIF93YXJuaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3dhcm5pbmcpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbi8vIFRPRE86IFRoaXMgc2hvdWxkIHByb2JhYmx5IHRha2UgYSBzaW5nbGUgYGFzcGVjdFJhdGlvYCBwcm9wLlxuXG52YXIgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogVGhpcyBjb21wb25lbnQgcmVxdWlyZXMgYSBzaW5nbGUgY2hpbGQgZWxlbWVudFxuICAgKi9cbiAgY2hpbGRyZW46IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZWxlbWVudC5pc1JlcXVpcmVkLFxuICAvKipcbiAgICogMTZieTkgYXNwZWN0IHJhdGlvXG4gICAqL1xuICBhMTZieTk6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgLyoqXG4gICAqIDRieTMgYXNwZWN0IHJhdGlvXG4gICAqL1xuICBhNGJ5MzogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBhMTZieTk6IGZhbHNlLFxuICBhNGJ5MzogZmFsc2Vcbn07XG5cbnZhciBSZXNwb25zaXZlRW1iZWQgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShSZXNwb25zaXZlRW1iZWQsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFJlc3BvbnNpdmVFbWJlZCgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBSZXNwb25zaXZlRW1iZWQpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBSZXNwb25zaXZlRW1iZWQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX2V4dGVuZHMyO1xuXG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGExNmJ5OSA9IF9wcm9wcy5hMTZieTksXG4gICAgICAgIGE0YnkzID0gX3Byb3BzLmE0YnkzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnYTE2Ynk5JywgJ2E0YnkzJywgJ2NsYXNzTmFtZScsICdjaGlsZHJlbiddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gKDAsIF93YXJuaW5nMlsnZGVmYXVsdCddKShhMTZieTkgfHwgYTRieTMsICdFaXRoZXIgYGExNmJ5OWAgb3IgYGE0YnkzYCBtdXN0IGJlIHNldC4nKSA6IHZvaWQgMDtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gKDAsIF93YXJuaW5nMlsnZGVmYXVsdCddKSghKGExNmJ5OSAmJiBhNGJ5MyksICdPbmx5IG9uZSBvZiBgYTE2Ynk5YCBvciBgYTRieTNgIGNhbiBiZSBzZXQuJykgOiB2b2lkIDA7XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoe30sICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpLCAoX2V4dGVuZHMyID0ge30sIF9leHRlbmRzMlsoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJzE2Ynk5JyldID0gYTE2Ynk5LCBfZXh0ZW5kczJbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICc0YnkzJyldID0gYTRieTMsIF9leHRlbmRzMikpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2RpdicsXG4gICAgICB7IGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc2VzKSB9LFxuICAgICAgKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGNoaWxkcmVuLCAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdpdGVtJykpXG4gICAgICB9KSlcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBSZXNwb25zaXZlRW1iZWQ7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5SZXNwb25zaXZlRW1iZWQucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuUmVzcG9uc2l2ZUVtYmVkLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnZW1iZWQtcmVzcG9uc2l2ZScsIFJlc3BvbnNpdmVFbWJlZCk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiBfZWxlbWVudFR5cGUyWydkZWZhdWx0J11cbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiAnZGl2J1xufTtcblxudmFyIFJvdyA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKFJvdywgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUm93KCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIFJvdyk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIFJvdy5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBDb21wb25lbnQgPSBfcHJvcHMuY29tcG9uZW50Q2xhc3MsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NvbXBvbmVudENsYXNzJywgJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gUm93O1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuUm93LnByb3BUeXBlcyA9IHByb3BUeXBlcztcblJvdy5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ3JvdycsIFJvdyk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGhyZWY6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICBvbkNsaWNrOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIGRpc2FibGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIHJvbGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICB0YWJJbmRleDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZlR5cGUoW19wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLCBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZ10pLFxuICAvKipcbiAgICogdGhpcyBpcyBzb3J0IG9mIHNpbGx5IGJ1dCBuZWVkZWQgZm9yIEJ1dHRvblxuICAgKi9cbiAgY29tcG9uZW50Q2xhc3M6IF9lbGVtZW50VHlwZTJbJ2RlZmF1bHQnXVxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6ICdhJ1xufTtcblxuZnVuY3Rpb24gaXNUcml2aWFsSHJlZihocmVmKSB7XG4gIHJldHVybiAhaHJlZiB8fCBocmVmLnRyaW0oKSA9PT0gJyMnO1xufVxuXG4vKipcbiAqIFRoZXJlIGFyZSBzaXR1YXRpb25zIGR1ZSB0byBicm93c2VyIHF1aXJrcyBvciBCb290c3RyYXAgQ1NTIHdoZXJlXG4gKiBhbiBhbmNob3IgdGFnIGlzIG5lZWRlZCwgd2hlbiBzZW1hbnRpY2FsbHkgYSBidXR0b24gdGFnIGlzIHRoZVxuICogYmV0dGVyIGNob2ljZS4gU2FmZUFuY2hvciBlbnN1cmVzIHRoYXQgd2hlbiBhbiBhbmNob3IgaXMgdXNlZCBsaWtlIGFcbiAqIGJ1dHRvbiBpdHMgYWNjZXNzaWJsZS4gSXQgYWxzbyBlbXVsYXRlcyBpbnB1dCBgZGlzYWJsZWRgIGJlaGF2aW9yIGZvclxuICogbGlua3MsIHdoaWNoIGlzIHVzdWFsbHkgZGVzaXJhYmxlIGZvciBCdXR0b25zLCBOYXZJdGVtcywgTWVudUl0ZW1zLCBldGMuXG4gKi9cblxudmFyIFNhZmVBbmNob3IgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShTYWZlQW5jaG9yLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBTYWZlQW5jaG9yKHByb3BzLCBjb250ZXh0KSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgU2FmZUFuY2hvcik7XG5cbiAgICB2YXIgX3RoaXMgPSAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgX3RoaXMuaGFuZGxlQ2xpY2sgPSBfdGhpcy5oYW5kbGVDbGljay5iaW5kKF90aGlzKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBTYWZlQW5jaG9yLnByb3RvdHlwZS5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50KSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGRpc2FibGVkID0gX3Byb3BzLmRpc2FibGVkLFxuICAgICAgICBocmVmID0gX3Byb3BzLmhyZWYsXG4gICAgICAgIG9uQ2xpY2sgPSBfcHJvcHMub25DbGljaztcblxuXG4gICAgaWYgKGRpc2FibGVkIHx8IGlzVHJpdmlhbEhyZWYoaHJlZikpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob25DbGljaykge1xuICAgICAgb25DbGljayhldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIFNhZmVBbmNob3IucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIENvbXBvbmVudCA9IF9wcm9wczIuY29tcG9uZW50Q2xhc3MsXG4gICAgICAgIGRpc2FibGVkID0gX3Byb3BzMi5kaXNhYmxlZCxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMyLCBbJ2NvbXBvbmVudENsYXNzJywgJ2Rpc2FibGVkJ10pO1xuXG5cbiAgICBpZiAoaXNUcml2aWFsSHJlZihwcm9wcy5ocmVmKSkge1xuICAgICAgcHJvcHMucm9sZSA9IHByb3BzLnJvbGUgfHwgJ2J1dHRvbic7XG4gICAgICAvLyB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBhIGhyZWYgYXR0cmlidXRlIG9uIHRoZSBub2RlXG4gICAgICAvLyBvdGhlcndpc2UsIHRoZSBjdXJzb3IgaW5jb3JyZWN0bHkgc3R5bGVkIChleGNlcHQgd2l0aCByb2xlPSdidXR0b24nKVxuICAgICAgcHJvcHMuaHJlZiA9IHByb3BzLmhyZWYgfHwgJyMnO1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgcHJvcHMudGFiSW5kZXggPSAtMTtcbiAgICAgIHByb3BzLnN0eWxlID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7IHBvaW50ZXJFdmVudHM6ICdub25lJyB9LCBwcm9wcy5zdHlsZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgcHJvcHMsIHtcbiAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2xpY2tcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIFNhZmVBbmNob3I7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5TYWZlQW5jaG9yLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblNhZmVBbmNob3IuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBTYWZlQW5jaG9yO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfQnV0dG9uID0gcmVxdWlyZSgnLi9CdXR0b24nKTtcblxudmFyIF9CdXR0b24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQnV0dG9uKTtcblxudmFyIF9Ecm9wZG93biA9IHJlcXVpcmUoJy4vRHJvcGRvd24nKTtcblxudmFyIF9Ecm9wZG93bjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ecm9wZG93bik7XG5cbnZhciBfU3BsaXRUb2dnbGUgPSByZXF1aXJlKCcuL1NwbGl0VG9nZ2xlJyk7XG5cbnZhciBfU3BsaXRUb2dnbGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU3BsaXRUb2dnbGUpO1xuXG52YXIgX3NwbGl0Q29tcG9uZW50UHJvcHMyID0gcmVxdWlyZSgnLi91dGlscy9zcGxpdENvbXBvbmVudFByb3BzJyk7XG5cbnZhciBfc3BsaXRDb21wb25lbnRQcm9wczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zcGxpdENvbXBvbmVudFByb3BzMik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9ICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIF9Ecm9wZG93bjJbJ2RlZmF1bHQnXS5wcm9wVHlwZXMsIHtcblxuICAvLyBUb2dnbGUgcHJvcHMuXG4gIGJzU3R5bGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICBic1NpemU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICBocmVmOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcbiAgb25DbGljazogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICAvKipcbiAgICogVGhlIGNvbnRlbnQgb2YgdGhlIHNwbGl0IGJ1dHRvbi5cbiAgICovXG4gIHRpdGxlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm5vZGUuaXNSZXF1aXJlZCxcbiAgLyoqXG4gICAqIEFjY2Vzc2libGUgbGFiZWwgZm9yIHRoZSB0b2dnbGU7IHRoZSB2YWx1ZSBvZiBgdGl0bGVgIGlmIG5vdCBzcGVjaWZpZWQuXG4gICAqL1xuICB0b2dnbGVMYWJlbDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG5cbiAgLy8gT3ZlcnJpZGUgZ2VuZXJhdGVkIGRvY3MgZnJvbSA8RHJvcGRvd24+LlxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNoaWxkcmVuOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm5vZGVcbn0pO1xuXG52YXIgU3BsaXRCdXR0b24gPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShTcGxpdEJ1dHRvbiwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gU3BsaXRCdXR0b24oKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgU3BsaXRCdXR0b24pO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBTcGxpdEJ1dHRvbi5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBic1NpemUgPSBfcHJvcHMuYnNTaXplLFxuICAgICAgICBic1N0eWxlID0gX3Byb3BzLmJzU3R5bGUsXG4gICAgICAgIHRpdGxlID0gX3Byb3BzLnRpdGxlLFxuICAgICAgICB0b2dnbGVMYWJlbCA9IF9wcm9wcy50b2dnbGVMYWJlbCxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2JzU2l6ZScsICdic1N0eWxlJywgJ3RpdGxlJywgJ3RvZ2dsZUxhYmVsJywgJ2NoaWxkcmVuJ10pO1xuXG4gICAgdmFyIF9zcGxpdENvbXBvbmVudFByb3BzID0gKDAsIF9zcGxpdENvbXBvbmVudFByb3BzM1snZGVmYXVsdCddKShwcm9wcywgX0Ryb3Bkb3duMlsnZGVmYXVsdCddLkNvbnRyb2xsZWRDb21wb25lbnQpLFxuICAgICAgICBkcm9wZG93blByb3BzID0gX3NwbGl0Q29tcG9uZW50UHJvcHNbMF0sXG4gICAgICAgIGJ1dHRvblByb3BzID0gX3NwbGl0Q29tcG9uZW50UHJvcHNbMV07XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBfRHJvcGRvd24yWydkZWZhdWx0J10sXG4gICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBkcm9wZG93blByb3BzLCB7XG4gICAgICAgIGJzU2l6ZTogYnNTaXplLFxuICAgICAgICBic1N0eWxlOiBic1N0eWxlXG4gICAgICB9KSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICBfQnV0dG9uMlsnZGVmYXVsdCddLFxuICAgICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBidXR0b25Qcm9wcywge1xuICAgICAgICAgIGRpc2FibGVkOiBwcm9wcy5kaXNhYmxlZCxcbiAgICAgICAgICBic1NpemU6IGJzU2l6ZSxcbiAgICAgICAgICBic1N0eWxlOiBic1N0eWxlXG4gICAgICAgIH0pLFxuICAgICAgICB0aXRsZVxuICAgICAgKSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9TcGxpdFRvZ2dsZTJbJ2RlZmF1bHQnXSwge1xuICAgICAgICAnYXJpYS1sYWJlbCc6IHRvZ2dsZUxhYmVsIHx8IHRpdGxlLFxuICAgICAgICBic1NpemU6IGJzU2l6ZSxcbiAgICAgICAgYnNTdHlsZTogYnNTdHlsZVxuICAgICAgfSksXG4gICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgX0Ryb3Bkb3duMlsnZGVmYXVsdCddLk1lbnUsXG4gICAgICAgIG51bGwsXG4gICAgICAgIGNoaWxkcmVuXG4gICAgICApXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gU3BsaXRCdXR0b247XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5TcGxpdEJ1dHRvbi5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5cblNwbGl0QnV0dG9uLlRvZ2dsZSA9IF9TcGxpdFRvZ2dsZTJbJ2RlZmF1bHQnXTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gU3BsaXRCdXR0b247XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9Ecm9wZG93blRvZ2dsZSA9IHJlcXVpcmUoJy4vRHJvcGRvd25Ub2dnbGUnKTtcblxudmFyIF9Ecm9wZG93blRvZ2dsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ecm9wZG93blRvZ2dsZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIFNwbGl0VG9nZ2xlID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoU3BsaXRUb2dnbGUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFNwbGl0VG9nZ2xlKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIFNwbGl0VG9nZ2xlKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgU3BsaXRUb2dnbGUucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX0Ryb3Bkb3duVG9nZ2xlMlsnZGVmYXVsdCddLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCB0aGlzLnByb3BzLCB7XG4gICAgICB1c2VBbmNob3I6IGZhbHNlLFxuICAgICAgbm9DYXJldDogZmFsc2VcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIFNwbGl0VG9nZ2xlO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuU3BsaXRUb2dnbGUuZGVmYXVsdFByb3BzID0gX0Ryb3Bkb3duVG9nZ2xlMlsnZGVmYXVsdCddLmRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gU3BsaXRUb2dnbGU7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfVGFiQ29udGFpbmVyID0gcmVxdWlyZSgnLi9UYWJDb250YWluZXInKTtcblxudmFyIF9UYWJDb250YWluZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVGFiQ29udGFpbmVyKTtcblxudmFyIF9UYWJDb250ZW50ID0gcmVxdWlyZSgnLi9UYWJDb250ZW50Jyk7XG5cbnZhciBfVGFiQ29udGVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UYWJDb250ZW50KTtcblxudmFyIF9UYWJQYW5lID0gcmVxdWlyZSgnLi9UYWJQYW5lJyk7XG5cbnZhciBfVGFiUGFuZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UYWJQYW5lKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgX1RhYlBhbmUyWydkZWZhdWx0J10ucHJvcFR5cGVzLCB7XG5cbiAgZGlzYWJsZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICB0aXRsZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ub2RlLFxuXG4gIC8qKlxuICAgKiB0YWJDbGFzc05hbWUgaXMgdXNlZCBhcyBjbGFzc05hbWUgZm9yIHRoZSBhc3NvY2lhdGVkIE5hdkl0ZW1cbiAgICovXG4gIHRhYkNsYXNzTmFtZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmdcbn0pO1xuXG52YXIgVGFiID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoVGFiLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBUYWIoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgVGFiKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgVGFiLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIHByb3BzID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgdGhpcy5wcm9wcyk7XG5cbiAgICAvLyBUaGVzZSBwcm9wcyBhcmUgZm9yIHRoZSBwYXJlbnQgYDxUYWJzPmAgcmF0aGVyIHRoYW4gdGhlIGA8VGFiUGFuZT5gLlxuICAgIGRlbGV0ZSBwcm9wcy50aXRsZTtcbiAgICBkZWxldGUgcHJvcHMuZGlzYWJsZWQ7XG4gICAgZGVsZXRlIHByb3BzLnRhYkNsYXNzTmFtZTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfVGFiUGFuZTJbJ2RlZmF1bHQnXSwgcHJvcHMpO1xuICB9O1xuXG4gIHJldHVybiBUYWI7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5UYWIucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuXG5UYWIuQ29udGFpbmVyID0gX1RhYkNvbnRhaW5lcjJbJ2RlZmF1bHQnXTtcblRhYi5Db250ZW50ID0gX1RhYkNvbnRlbnQyWydkZWZhdWx0J107XG5UYWIuUGFuZSA9IF9UYWJQYW5lMlsnZGVmYXVsdCddO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBUYWI7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX3VuY29udHJvbGxhYmxlID0gcmVxdWlyZSgndW5jb250cm9sbGFibGUnKTtcblxudmFyIF91bmNvbnRyb2xsYWJsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91bmNvbnRyb2xsYWJsZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIFRBQiA9ICd0YWInO1xudmFyIFBBTkUgPSAncGFuZSc7XG5cbnZhciBpZFByb3BUeXBlID0gX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZlR5cGUoW19wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLCBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcl0pO1xuXG52YXIgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogSFRNTCBpZCBhdHRyaWJ1dGUsIHJlcXVpcmVkIGlmIG5vIGBnZW5lcmF0ZUNoaWxkSWRgIHByb3BcbiAgICogaXMgc3BlY2lmaWVkLlxuICAgKi9cbiAgaWQ6IGZ1bmN0aW9uIGlkKHByb3BzKSB7XG4gICAgdmFyIGVycm9yID0gbnVsbDtcblxuICAgIGlmICghcHJvcHMuZ2VuZXJhdGVDaGlsZElkKSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIGVycm9yID0gaWRQcm9wVHlwZS5hcHBseSh1bmRlZmluZWQsIFtwcm9wc10uY29uY2F0KGFyZ3MpKTtcblxuICAgICAgaWYgKCFlcnJvciAmJiAhcHJvcHMuaWQpIHtcbiAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoJ0luIG9yZGVyIHRvIHByb3Blcmx5IGluaXRpYWxpemUgVGFicyBpbiBhIHdheSB0aGF0IGlzIGFjY2Vzc2libGUgJyArICd0byBhc3Npc3RpdmUgdGVjaG5vbG9naWVzIChzdWNoIGFzIHNjcmVlbiByZWFkZXJzKSBhbiBgaWRgIG9yIGEgJyArICdgZ2VuZXJhdGVDaGlsZElkYCBwcm9wIHRvIFRhYkNvbnRhaW5lciBpcyByZXF1aXJlZCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnJvcjtcbiAgfSxcblxuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gYGV2ZW50S2V5YCBhbmQgYHR5cGVgIGFuZCByZXR1cm5zIGEgdW5pcXVlIGlkIGZvclxuICAgKiBjaGlsZCB0YWIgYDxOYXZJdGVtPmBzIGFuZCBgPFRhYlBhbmU+YHMuIFRoZSBmdW5jdGlvbiBfbXVzdF8gYmUgYSBwdXJlXG4gICAqIGZ1bmN0aW9uLCBtZWFuaW5nIGl0IHNob3VsZCBhbHdheXMgcmV0dXJuIHRoZSBfc2FtZV8gaWQgZm9yIHRoZSBzYW1lIHNldFxuICAgKiBvZiBpbnB1dHMuIFRoZSBkZWZhdWx0IHZhbHVlIHJlcXVpcmVzIHRoYXQgYW4gYGlkYCB0byBiZSBzZXQgZm9yIHRoZVxuICAgKiBgPFRhYkNvbnRhaW5lcj5gLlxuICAgKlxuICAgKiBUaGUgYHR5cGVgIGFyZ3VtZW50IHdpbGwgZWl0aGVyIGJlIGBcInRhYlwiYCBvciBgXCJwYW5lXCJgLlxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIChldmVudEtleSwgdHlwZSkgPT4gYCR7dGhpcy5wcm9wcy5pZH0tJHt0eXBlfS0ke2tleX1gXG4gICAqL1xuICBnZW5lcmF0ZUNoaWxkSWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBmaXJlZCB3aGVuIGEgdGFiIGlzIHNlbGVjdGVkLlxuICAgKlxuICAgKiBAY29udHJvbGxhYmxlIGFjdGl2ZUtleVxuICAgKi9cbiAgb25TZWxlY3Q6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogVGhlIGBldmVudEtleWAgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGFiLlxuICAgKlxuICAgKiBAY29udHJvbGxhYmxlIG9uU2VsZWN0XG4gICAqL1xuICBhY3RpdmVLZXk6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYW55XG59O1xuXG52YXIgY2hpbGRDb250ZXh0VHlwZXMgPSB7XG4gICRic190YWJDb250YWluZXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc2hhcGUoe1xuICAgIGFjdGl2ZUtleTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5hbnksXG4gICAgb25TZWxlY3Q6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYy5pc1JlcXVpcmVkLFxuICAgIGdldFRhYklkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBnZXRQYW5lSWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYy5pc1JlcXVpcmVkXG4gIH0pXG59O1xuXG52YXIgVGFiQ29udGFpbmVyID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoVGFiQ29udGFpbmVyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBUYWJDb250YWluZXIoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgVGFiQ29udGFpbmVyKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgVGFiQ29udGFpbmVyLnByb3RvdHlwZS5nZXRDaGlsZENvbnRleHQgPSBmdW5jdGlvbiBnZXRDaGlsZENvbnRleHQoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGFjdGl2ZUtleSA9IF9wcm9wcy5hY3RpdmVLZXksXG4gICAgICAgIG9uU2VsZWN0ID0gX3Byb3BzLm9uU2VsZWN0LFxuICAgICAgICBnZW5lcmF0ZUNoaWxkSWQgPSBfcHJvcHMuZ2VuZXJhdGVDaGlsZElkLFxuICAgICAgICBpZCA9IF9wcm9wcy5pZDtcblxuXG4gICAgdmFyIGdldElkID0gZ2VuZXJhdGVDaGlsZElkIHx8IGZ1bmN0aW9uIChrZXksIHR5cGUpIHtcbiAgICAgIHJldHVybiBpZCA/IGlkICsgJy0nICsgdHlwZSArICctJyArIGtleSA6IG51bGw7XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAkYnNfdGFiQ29udGFpbmVyOiB7XG4gICAgICAgIGFjdGl2ZUtleTogYWN0aXZlS2V5LFxuICAgICAgICBvblNlbGVjdDogb25TZWxlY3QsXG4gICAgICAgIGdldFRhYklkOiBmdW5jdGlvbiBnZXRUYWJJZChrZXkpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0SWQoa2V5LCBUQUIpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRQYW5lSWQ6IGZ1bmN0aW9uIGdldFBhbmVJZChrZXkpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0SWQoa2V5LCBQQU5FKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgVGFiQ29udGFpbmVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wczIuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzMiwgWydjaGlsZHJlbiddKTtcblxuXG4gICAgZGVsZXRlIHByb3BzLmdlbmVyYXRlQ2hpbGRJZDtcbiAgICBkZWxldGUgcHJvcHMub25TZWxlY3Q7XG4gICAgZGVsZXRlIHByb3BzLmFjdGl2ZUtleTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY2xvbmVFbGVtZW50KF9yZWFjdDJbJ2RlZmF1bHQnXS5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKSwgcHJvcHMpO1xuICB9O1xuXG4gIHJldHVybiBUYWJDb250YWluZXI7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5UYWJDb250YWluZXIucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuVGFiQ29udGFpbmVyLmNoaWxkQ29udGV4dFR5cGVzID0gY2hpbGRDb250ZXh0VHlwZXM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfdW5jb250cm9sbGFibGUyWydkZWZhdWx0J10pKFRhYkNvbnRhaW5lciwgeyBhY3RpdmVLZXk6ICdvblNlbGVjdCcgfSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfZWxlbWVudFR5cGUgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBjb21wb25lbnRDbGFzczogX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddLFxuXG4gIC8qKlxuICAgKiBTZXRzIGEgZGVmYXVsdCBhbmltYXRpb24gc3RyYXRlZ3kgZm9yIGFsbCBjaGlsZHJlbiBgPFRhYlBhbmU+YHMuIFVzZVxuICAgKiBgZmFsc2VgIHRvIGRpc2FibGUsIGB0cnVlYCB0byBlbmFibGUgdGhlIGRlZmF1bHQgYDxGYWRlPmAgYW5pbWF0aW9uIG9yIGFueVxuICAgKiBgPFRyYW5zaXRpb24+YCBjb21wb25lbnQuXG4gICAqL1xuICBhbmltYXRpb246IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2ZUeXBlKFtfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsIF9lbGVtZW50VHlwZTJbJ2RlZmF1bHQnXV0pLFxuXG4gIC8qKlxuICAgKiBXYWl0IHVudGlsIHRoZSBmaXJzdCBcImVudGVyXCIgdHJhbnNpdGlvbiB0byBtb3VudCB0YWJzIChhZGQgdGhlbSB0byB0aGUgRE9NKVxuICAgKi9cbiAgbW91bnRPbkVudGVyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIFVubW91bnQgdGFicyAocmVtb3ZlIGl0IGZyb20gdGhlIERPTSkgd2hlbiB0aGV5IGFyZSBubyBsb25nZXIgdmlzaWJsZVxuICAgKi9cbiAgdW5tb3VudE9uRXhpdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjb21wb25lbnRDbGFzczogJ2RpdicsXG4gIGFuaW1hdGlvbjogdHJ1ZSxcbiAgbW91bnRPbkVudGVyOiBmYWxzZSxcbiAgdW5tb3VudE9uRXhpdDogZmFsc2Vcbn07XG5cbnZhciBjb250ZXh0VHlwZXMgPSB7XG4gICRic190YWJDb250YWluZXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc2hhcGUoe1xuICAgIGFjdGl2ZUtleTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5hbnlcbiAgfSlcbn07XG5cbnZhciBjaGlsZENvbnRleHRUeXBlcyA9IHtcbiAgJGJzX3RhYkNvbnRlbnQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc2hhcGUoe1xuICAgIGJzQ2xhc3M6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICAgIGFuaW1hdGlvbjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZlR5cGUoW19wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCwgX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddXSksXG4gICAgYWN0aXZlS2V5OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmFueSxcbiAgICBtb3VudE9uRW50ZXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgICB1bm1vdW50T25FeGl0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gICAgb25QYW5lRW50ZXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYy5pc1JlcXVpcmVkLFxuICAgIG9uUGFuZUV4aXRlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLmlzUmVxdWlyZWQsXG4gICAgZXhpdGluZzogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLmlzUmVxdWlyZWRcbiAgfSlcbn07XG5cbnZhciBUYWJDb250ZW50ID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoVGFiQ29udGVudCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gVGFiQ29udGVudChwcm9wcywgY29udGV4dCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIFRhYkNvbnRlbnQpO1xuXG4gICAgdmFyIF90aGlzID0gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgIF90aGlzLmhhbmRsZVBhbmVFbnRlciA9IF90aGlzLmhhbmRsZVBhbmVFbnRlci5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5oYW5kbGVQYW5lRXhpdGVkID0gX3RoaXMuaGFuZGxlUGFuZUV4aXRlZC5iaW5kKF90aGlzKTtcblxuICAgIC8vIEFjdGl2ZSBlbnRyaWVzIGluIHN0YXRlIHdpbGwgYmUgYG51bGxgIHVubGVzcyBgYW5pbWF0aW9uYCBpcyBzZXQuIE5lZWRcbiAgICAvLyB0byB0cmFjayBhY3RpdmUgY2hpbGQgaW4gY2FzZSBrZXlzIHN3YXAgYW5kIHRoZSBhY3RpdmUgY2hpbGQgY2hhbmdlc1xuICAgIC8vIGJ1dCB0aGUgYWN0aXZlIGtleSBkb2VzIG5vdC5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGFjdGl2ZUtleTogbnVsbCxcbiAgICAgIGFjdGl2ZUNoaWxkOiBudWxsXG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBUYWJDb250ZW50LnByb3RvdHlwZS5nZXRDaGlsZENvbnRleHQgPSBmdW5jdGlvbiBnZXRDaGlsZENvbnRleHQoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGJzQ2xhc3MgPSBfcHJvcHMuYnNDbGFzcyxcbiAgICAgICAgYW5pbWF0aW9uID0gX3Byb3BzLmFuaW1hdGlvbixcbiAgICAgICAgbW91bnRPbkVudGVyID0gX3Byb3BzLm1vdW50T25FbnRlcixcbiAgICAgICAgdW5tb3VudE9uRXhpdCA9IF9wcm9wcy51bm1vdW50T25FeGl0O1xuXG5cbiAgICB2YXIgc3RhdGVBY3RpdmVLZXkgPSB0aGlzLnN0YXRlLmFjdGl2ZUtleTtcbiAgICB2YXIgY29udGFpbmVyQWN0aXZlS2V5ID0gdGhpcy5nZXRDb250YWluZXJBY3RpdmVLZXkoKTtcblxuICAgIHZhciBhY3RpdmVLZXkgPSBzdGF0ZUFjdGl2ZUtleSAhPSBudWxsID8gc3RhdGVBY3RpdmVLZXkgOiBjb250YWluZXJBY3RpdmVLZXk7XG4gICAgdmFyIGV4aXRpbmcgPSBzdGF0ZUFjdGl2ZUtleSAhPSBudWxsICYmIHN0YXRlQWN0aXZlS2V5ICE9PSBjb250YWluZXJBY3RpdmVLZXk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgJGJzX3RhYkNvbnRlbnQ6IHtcbiAgICAgICAgYnNDbGFzczogYnNDbGFzcyxcbiAgICAgICAgYW5pbWF0aW9uOiBhbmltYXRpb24sXG4gICAgICAgIGFjdGl2ZUtleTogYWN0aXZlS2V5LFxuICAgICAgICBtb3VudE9uRW50ZXI6IG1vdW50T25FbnRlcixcbiAgICAgICAgdW5tb3VudE9uRXhpdDogdW5tb3VudE9uRXhpdCxcbiAgICAgICAgb25QYW5lRW50ZXI6IHRoaXMuaGFuZGxlUGFuZUVudGVyLFxuICAgICAgICBvblBhbmVFeGl0ZWQ6IHRoaXMuaGFuZGxlUGFuZUV4aXRlZCxcbiAgICAgICAgZXhpdGluZzogZXhpdGluZ1xuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgVGFiQ29udGVudC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgaWYgKCFuZXh0UHJvcHMuYW5pbWF0aW9uICYmIHRoaXMuc3RhdGUuYWN0aXZlQ2hpbGQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBhY3RpdmVLZXk6IG51bGwsIGFjdGl2ZUNoaWxkOiBudWxsIH0pO1xuICAgIH1cbiAgfTtcblxuICBUYWJDb250ZW50LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMuaXNVbm1vdW50ZWQgPSB0cnVlO1xuICB9O1xuXG4gIFRhYkNvbnRlbnQucHJvdG90eXBlLmhhbmRsZVBhbmVFbnRlciA9IGZ1bmN0aW9uIGhhbmRsZVBhbmVFbnRlcihjaGlsZCwgY2hpbGRLZXkpIHtcbiAgICBpZiAoIXRoaXMucHJvcHMuYW5pbWF0aW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHRoaXMgY2hpbGQgc2hvdWxkIGJlIHRyYW5zaXRpb25pbmcgb3V0LlxuICAgIGlmIChjaGlsZEtleSAhPT0gdGhpcy5nZXRDb250YWluZXJBY3RpdmVLZXkoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgYWN0aXZlS2V5OiBjaGlsZEtleSxcbiAgICAgIGFjdGl2ZUNoaWxkOiBjaGlsZFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgVGFiQ29udGVudC5wcm90b3R5cGUuaGFuZGxlUGFuZUV4aXRlZCA9IGZ1bmN0aW9uIGhhbmRsZVBhbmVFeGl0ZWQoY2hpbGQpIHtcbiAgICAvLyBUaGlzIG1pZ2h0IGhhcHBlbiBhcyBldmVyeXRoaW5nIGlzIHVubW91bnRpbmcuXG4gICAgaWYgKHRoaXMuaXNVbm1vdW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgYWN0aXZlQ2hpbGQgPSBfcmVmLmFjdGl2ZUNoaWxkO1xuXG4gICAgICBpZiAoYWN0aXZlQ2hpbGQgIT09IGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY3RpdmVLZXk6IG51bGwsXG4gICAgICAgIGFjdGl2ZUNoaWxkOiBudWxsXG4gICAgICB9O1xuICAgIH0pO1xuICB9O1xuXG4gIFRhYkNvbnRlbnQucHJvdG90eXBlLmdldENvbnRhaW5lckFjdGl2ZUtleSA9IGZ1bmN0aW9uIGdldENvbnRhaW5lckFjdGl2ZUtleSgpIHtcbiAgICB2YXIgdGFiQ29udGFpbmVyID0gdGhpcy5jb250ZXh0LiRic190YWJDb250YWluZXI7XG4gICAgcmV0dXJuIHRhYkNvbnRhaW5lciAmJiB0YWJDb250YWluZXIuYWN0aXZlS2V5O1xuICB9O1xuXG4gIFRhYkNvbnRlbnQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIENvbXBvbmVudCA9IF9wcm9wczIuY29tcG9uZW50Q2xhc3MsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wczIuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wczIsIFsnY29tcG9uZW50Q2xhc3MnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHNBbmRPbWl0ID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHNBbmRPbWl0KShwcm9wcywgWydhbmltYXRpb24nLCAnbW91bnRPbkVudGVyJywgJ3VubW91bnRPbkV4aXQnXSksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzQW5kT21pdFswXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc0FuZE9taXRbMV07XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnY29udGVudCcpKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gVGFiQ29udGVudDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cblRhYkNvbnRlbnQucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuVGFiQ29udGVudC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5UYWJDb250ZW50LmNvbnRleHRUeXBlcyA9IGNvbnRleHRUeXBlcztcblRhYkNvbnRlbnQuY2hpbGRDb250ZXh0VHlwZXMgPSBjaGlsZENvbnRleHRUeXBlcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgndGFiJywgVGFiQ29udGVudCk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfZWxlbWVudFR5cGUgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlKTtcblxudmFyIF93YXJuaW5nID0gcmVxdWlyZSgnd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmVkRnVuY3Rpb24nKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKTtcblxudmFyIF9GYWRlID0gcmVxdWlyZSgnLi9GYWRlJyk7XG5cbnZhciBfRmFkZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9GYWRlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogVW5pcXVlbHkgaWRlbnRpZnkgdGhlIGA8VGFiUGFuZT5gIGFtb25nIGl0cyBzaWJsaW5ncy5cbiAgICovXG4gIGV2ZW50S2V5OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmFueSxcblxuICAvKipcbiAgICogVXNlIGFuaW1hdGlvbiB3aGVuIHNob3dpbmcgb3IgaGlkaW5nIGA8VGFiUGFuZT5gcy4gVXNlIGBmYWxzZWAgdG8gZGlzYWJsZSxcbiAgICogYHRydWVgIHRvIGVuYWJsZSB0aGUgZGVmYXVsdCBgPEZhZGU+YCBhbmltYXRpb24gb3IgYW55IGA8VHJhbnNpdGlvbj5gXG4gICAqIGNvbXBvbmVudC5cbiAgICovXG4gIGFuaW1hdGlvbjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZlR5cGUoW19wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCwgX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddXSksXG5cbiAgLyoqIEBwcml2YXRlICoqL1xuICBpZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG5cbiAgLyoqIEBwcml2YXRlICoqL1xuICAnYXJpYS1sYWJlbGxlZGJ5JzogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIElmIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZCBhbmQgcmVuZGVyZWQgaW4gdGhlIGNvbnRleHQgb2YgYVxuICAgKiBgPFRhYkNvbnRlbnQ+YCwgdGhlIGBic0NsYXNzYCBvZiB0aGUgYDxUYWJDb250ZW50PmAgc3VmZml4ZWQgYnkgYC1wYW5lYC5cbiAgICogSWYgb3RoZXJ3aXNlIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZCwgYHRhYi1wYW5lYC5cbiAgICovXG4gIGJzQ2xhc3M6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBUcmFuc2l0aW9uIG9uRW50ZXIgY2FsbGJhY2sgd2hlbiBhbmltYXRpb24gaXMgbm90IGBmYWxzZWBcbiAgICovXG4gIG9uRW50ZXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogVHJhbnNpdGlvbiBvbkVudGVyaW5nIGNhbGxiYWNrIHdoZW4gYW5pbWF0aW9uIGlzIG5vdCBgZmFsc2VgXG4gICAqL1xuICBvbkVudGVyaW5nOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLyoqXG4gICAqIFRyYW5zaXRpb24gb25FbnRlcmVkIGNhbGxiYWNrIHdoZW4gYW5pbWF0aW9uIGlzIG5vdCBgZmFsc2VgXG4gICAqL1xuICBvbkVudGVyZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogVHJhbnNpdGlvbiBvbkV4aXQgY2FsbGJhY2sgd2hlbiBhbmltYXRpb24gaXMgbm90IGBmYWxzZWBcbiAgICovXG4gIG9uRXhpdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuXG4gIC8qKlxuICAgKiBUcmFuc2l0aW9uIG9uRXhpdGluZyBjYWxsYmFjayB3aGVuIGFuaW1hdGlvbiBpcyBub3QgYGZhbHNlYFxuICAgKi9cbiAgb25FeGl0aW5nOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLyoqXG4gICAqIFRyYW5zaXRpb24gb25FeGl0ZWQgY2FsbGJhY2sgd2hlbiBhbmltYXRpb24gaXMgbm90IGBmYWxzZWBcbiAgICovXG4gIG9uRXhpdGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLyoqXG4gICAqIFdhaXQgdW50aWwgdGhlIGZpcnN0IFwiZW50ZXJcIiB0cmFuc2l0aW9uIHRvIG1vdW50IHRoZSB0YWIgKGFkZCBpdCB0byB0aGUgRE9NKVxuICAgKi9cbiAgbW91bnRPbkVudGVyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIFVubW91bnQgdGhlIHRhYiAocmVtb3ZlIGl0IGZyb20gdGhlIERPTSkgd2hlbiBpdCBpcyBubyBsb25nZXIgdmlzaWJsZVxuICAgKi9cbiAgdW5tb3VudE9uRXhpdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sXG59O1xuXG52YXIgY29udGV4dFR5cGVzID0ge1xuICAkYnNfdGFiQ29udGFpbmVyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnNoYXBlKHtcbiAgICBnZXRUYWJJZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICAgIGdldFBhbmVJZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jXG4gIH0pLFxuICAkYnNfdGFiQ29udGVudDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zaGFwZSh7XG4gICAgYnNDbGFzczogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gICAgYW5pbWF0aW9uOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mVHlwZShbX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLCBfZWxlbWVudFR5cGUyWydkZWZhdWx0J11dKSxcbiAgICBhY3RpdmVLZXk6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYW55LFxuICAgIG1vdW50T25FbnRlcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICAgIHVubW91bnRPbkV4aXQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgICBvblBhbmVFbnRlcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLmlzUmVxdWlyZWQsXG4gICAgb25QYW5lRXhpdGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBleGl0aW5nOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wuaXNSZXF1aXJlZFxuICB9KVxufTtcblxuLyoqXG4gKiBXZSBvdmVycmlkZSB0aGUgYDxUYWJDb250YWluZXI+YCBjb250ZXh0IHNvIGA8TmF2PmBzIGluIGA8VGFiUGFuZT5gcyBkb24ndFxuICogY29uZmxpY3Qgd2l0aCB0aGUgdG9wIGxldmVsIG9uZS5cbiAqL1xudmFyIGNoaWxkQ29udGV4dFR5cGVzID0ge1xuICAkYnNfdGFiQ29udGFpbmVyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mKFtudWxsXSlcbn07XG5cbnZhciBUYWJQYW5lID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoVGFiUGFuZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gVGFiUGFuZShwcm9wcywgY29udGV4dCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIFRhYlBhbmUpO1xuXG4gICAgdmFyIF90aGlzID0gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgIF90aGlzLmhhbmRsZUVudGVyID0gX3RoaXMuaGFuZGxlRW50ZXIuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaGFuZGxlRXhpdGVkID0gX3RoaXMuaGFuZGxlRXhpdGVkLmJpbmQoX3RoaXMpO1xuXG4gICAgX3RoaXNbJ2luJ10gPSBmYWxzZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBUYWJQYW5lLnByb3RvdHlwZS5nZXRDaGlsZENvbnRleHQgPSBmdW5jdGlvbiBnZXRDaGlsZENvbnRleHQoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICRic190YWJDb250YWluZXI6IG51bGxcbiAgICB9O1xuICB9O1xuXG4gIFRhYlBhbmUucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgaWYgKHRoaXMuc2hvdWxkQmVJbigpKSB7XG4gICAgICAvLyBJbiBsaWV1IG9mIHRoZSBhY3Rpb24gZXZlbnQgZmlyaW5nLlxuICAgICAgdGhpcy5oYW5kbGVFbnRlcigpO1xuICAgIH1cbiAgfTtcblxuICBUYWJQYW5lLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgaWYgKHRoaXNbJ2luJ10pIHtcbiAgICAgIGlmICghdGhpcy5zaG91bGRCZUluKCkpIHtcbiAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGJlIGFjdGl2ZSBhbnkgbW9yZS4gTm90aWZ5IHRoZSBwYXJlbnQuXG4gICAgICAgIHRoaXMuaGFuZGxlRXhpdGVkKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnNob3VsZEJlSW4oKSkge1xuICAgICAgLy8gV2UgYXJlIHRoZSBhY3RpdmUgY2hpbGQuIE5vdGlmeSB0aGUgcGFyZW50LlxuICAgICAgdGhpcy5oYW5kbGVFbnRlcigpO1xuICAgIH1cbiAgfTtcblxuICBUYWJQYW5lLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIGlmICh0aGlzWydpbiddKSB7XG4gICAgICAvLyBJbiBsaWV1IG9mIHRoZSBhY3Rpb24gZXZlbnQgZmlyaW5nLlxuICAgICAgdGhpcy5oYW5kbGVFeGl0ZWQoKTtcbiAgICB9XG4gIH07XG5cbiAgVGFiUGFuZS5wcm90b3R5cGUuaGFuZGxlRW50ZXIgPSBmdW5jdGlvbiBoYW5kbGVFbnRlcigpIHtcbiAgICB2YXIgdGFiQ29udGVudCA9IHRoaXMuY29udGV4dC4kYnNfdGFiQ29udGVudDtcbiAgICBpZiAoIXRhYkNvbnRlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzWydpbiddID0gdGFiQ29udGVudC5vblBhbmVFbnRlcih0aGlzLCB0aGlzLnByb3BzLmV2ZW50S2V5KTtcbiAgfTtcblxuICBUYWJQYW5lLnByb3RvdHlwZS5oYW5kbGVFeGl0ZWQgPSBmdW5jdGlvbiBoYW5kbGVFeGl0ZWQoKSB7XG4gICAgdmFyIHRhYkNvbnRlbnQgPSB0aGlzLmNvbnRleHQuJGJzX3RhYkNvbnRlbnQ7XG4gICAgaWYgKCF0YWJDb250ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGFiQ29udGVudC5vblBhbmVFeGl0ZWQodGhpcyk7XG4gICAgdGhpc1snaW4nXSA9IGZhbHNlO1xuICB9O1xuXG4gIFRhYlBhbmUucHJvdG90eXBlLmdldEFuaW1hdGlvbiA9IGZ1bmN0aW9uIGdldEFuaW1hdGlvbigpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5hbmltYXRpb24gIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuYW5pbWF0aW9uO1xuICAgIH1cblxuICAgIHZhciB0YWJDb250ZW50ID0gdGhpcy5jb250ZXh0LiRic190YWJDb250ZW50O1xuICAgIHJldHVybiB0YWJDb250ZW50ICYmIHRhYkNvbnRlbnQuYW5pbWF0aW9uO1xuICB9O1xuXG4gIFRhYlBhbmUucHJvdG90eXBlLmlzQWN0aXZlID0gZnVuY3Rpb24gaXNBY3RpdmUoKSB7XG4gICAgdmFyIHRhYkNvbnRlbnQgPSB0aGlzLmNvbnRleHQuJGJzX3RhYkNvbnRlbnQ7XG4gICAgdmFyIGFjdGl2ZUtleSA9IHRhYkNvbnRlbnQgJiYgdGFiQ29udGVudC5hY3RpdmVLZXk7XG5cbiAgICByZXR1cm4gdGhpcy5wcm9wcy5ldmVudEtleSA9PT0gYWN0aXZlS2V5O1xuICB9O1xuXG4gIFRhYlBhbmUucHJvdG90eXBlLnNob3VsZEJlSW4gPSBmdW5jdGlvbiBzaG91bGRCZUluKCkge1xuICAgIHJldHVybiB0aGlzLmdldEFuaW1hdGlvbigpICYmIHRoaXMuaXNBY3RpdmUoKTtcbiAgfTtcblxuICBUYWJQYW5lLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGV2ZW50S2V5ID0gX3Byb3BzLmV2ZW50S2V5LFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBvbkVudGVyID0gX3Byb3BzLm9uRW50ZXIsXG4gICAgICAgIG9uRW50ZXJpbmcgPSBfcHJvcHMub25FbnRlcmluZyxcbiAgICAgICAgb25FbnRlcmVkID0gX3Byb3BzLm9uRW50ZXJlZCxcbiAgICAgICAgb25FeGl0ID0gX3Byb3BzLm9uRXhpdCxcbiAgICAgICAgb25FeGl0aW5nID0gX3Byb3BzLm9uRXhpdGluZyxcbiAgICAgICAgb25FeGl0ZWQgPSBfcHJvcHMub25FeGl0ZWQsXG4gICAgICAgIHByb3BzTW91bnRPbkVudGVyID0gX3Byb3BzLm1vdW50T25FbnRlcixcbiAgICAgICAgcHJvcHNVbm1vdW50T25FeGl0ID0gX3Byb3BzLnVubW91bnRPbkV4aXQsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2V2ZW50S2V5JywgJ2NsYXNzTmFtZScsICdvbkVudGVyJywgJ29uRW50ZXJpbmcnLCAnb25FbnRlcmVkJywgJ29uRXhpdCcsICdvbkV4aXRpbmcnLCAnb25FeGl0ZWQnLCAnbW91bnRPbkVudGVyJywgJ3VubW91bnRPbkV4aXQnXSk7XG4gICAgdmFyIF9jb250ZXh0ID0gdGhpcy5jb250ZXh0LFxuICAgICAgICB0YWJDb250ZW50ID0gX2NvbnRleHQuJGJzX3RhYkNvbnRlbnQsXG4gICAgICAgIHRhYkNvbnRhaW5lciA9IF9jb250ZXh0LiRic190YWJDb250YWluZXI7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wc0FuZE9taXQgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wc0FuZE9taXQpKHByb3BzLCBbJ2FuaW1hdGlvbiddKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNBbmRPbWl0WzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzQW5kT21pdFsxXTtcblxuICAgIHZhciBhY3RpdmUgPSB0aGlzLmlzQWN0aXZlKCk7XG4gICAgdmFyIGFuaW1hdGlvbiA9IHRoaXMuZ2V0QW5pbWF0aW9uKCk7XG5cbiAgICB2YXIgbW91bnRPbkVudGVyID0gcHJvcHNNb3VudE9uRW50ZXIgIT0gbnVsbCA/IHByb3BzTW91bnRPbkVudGVyIDogdGFiQ29udGVudCAmJiB0YWJDb250ZW50Lm1vdW50T25FbnRlcjtcbiAgICB2YXIgdW5tb3VudE9uRXhpdCA9IHByb3BzVW5tb3VudE9uRXhpdCAhPSBudWxsID8gcHJvcHNVbm1vdW50T25FeGl0IDogdGFiQ29udGVudCAmJiB0YWJDb250ZW50LnVubW91bnRPbkV4aXQ7XG5cbiAgICBpZiAoIWFjdGl2ZSAmJiAhYW5pbWF0aW9uICYmIHVubW91bnRPbkV4aXQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBUcmFuc2l0aW9uID0gYW5pbWF0aW9uID09PSB0cnVlID8gX0ZhZGUyWydkZWZhdWx0J10gOiBhbmltYXRpb24gfHwgbnVsbDtcblxuICAgIGlmICh0YWJDb250ZW50KSB7XG4gICAgICBic1Byb3BzLmJzQ2xhc3MgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkodGFiQ29udGVudCwgJ3BhbmUnKTtcbiAgICB9XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpLCB7XG4gICAgICBhY3RpdmU6IGFjdGl2ZVxuICAgIH0pO1xuXG4gICAgaWYgKHRhYkNvbnRhaW5lcikge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/ICgwLCBfd2FybmluZzJbJ2RlZmF1bHQnXSkoIWVsZW1lbnRQcm9wcy5pZCAmJiAhZWxlbWVudFByb3BzWydhcmlhLWxhYmVsbGVkYnknXSwgJ0luIHRoZSBjb250ZXh0IG9mIGEgYDxUYWJDb250YWluZXI+YCwgYDxUYWJQYW5lcz5gIGFyZSBnaXZlbiAnICsgJ2dlbmVyYXRlZCBgaWRgIGFuZCBgYXJpYS1sYWJlbGxlZGJ5YCBhdHRyaWJ1dGVzIGZvciB0aGUgc2FrZSBvZiAnICsgJ3Byb3BlciBjb21wb25lbnQgYWNjZXNzaWJpbGl0eS4gQW55IHByb3ZpZGVkIG9uZXMgd2lsbCBiZSBpZ25vcmVkLiAnICsgJ1RvIGNvbnRyb2wgdGhlc2UgYXR0cmlidXRlcyBkaXJlY3RseSBwcm92aWRlIGEgYGdlbmVyYXRlQ2hpbGRJZGAgJyArICdwcm9wIHRvIHRoZSBwYXJlbnQgYDxUYWJDb250YWluZXI+YC4nKSA6IHZvaWQgMDtcblxuICAgICAgZWxlbWVudFByb3BzLmlkID0gdGFiQ29udGFpbmVyLmdldFBhbmVJZChldmVudEtleSk7XG4gICAgICBlbGVtZW50UHJvcHNbJ2FyaWEtbGFiZWxsZWRieSddID0gdGFiQ29udGFpbmVyLmdldFRhYklkKGV2ZW50S2V5KTtcbiAgICB9XG5cbiAgICB2YXIgcGFuZSA9IF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdkaXYnLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIHJvbGU6ICd0YWJwYW5lbCcsXG4gICAgICAnYXJpYS1oaWRkZW4nOiAhYWN0aXZlLFxuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG5cbiAgICBpZiAoVHJhbnNpdGlvbikge1xuICAgICAgdmFyIGV4aXRpbmcgPSB0YWJDb250ZW50ICYmIHRhYkNvbnRlbnQuZXhpdGluZztcblxuICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICBUcmFuc2l0aW9uLFxuICAgICAgICB7XG4gICAgICAgICAgJ2luJzogYWN0aXZlICYmICFleGl0aW5nLFxuICAgICAgICAgIG9uRW50ZXI6ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKSh0aGlzLmhhbmRsZUVudGVyLCBvbkVudGVyKSxcbiAgICAgICAgICBvbkVudGVyaW5nOiBvbkVudGVyaW5nLFxuICAgICAgICAgIG9uRW50ZXJlZDogb25FbnRlcmVkLFxuICAgICAgICAgIG9uRXhpdDogb25FeGl0LFxuICAgICAgICAgIG9uRXhpdGluZzogb25FeGl0aW5nLFxuICAgICAgICAgIG9uRXhpdGVkOiAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkodGhpcy5oYW5kbGVFeGl0ZWQsIG9uRXhpdGVkKSxcbiAgICAgICAgICBtb3VudE9uRW50ZXI6IG1vdW50T25FbnRlcixcbiAgICAgICAgICB1bm1vdW50T25FeGl0OiB1bm1vdW50T25FeGl0XG4gICAgICAgIH0sXG4gICAgICAgIHBhbmVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhbmU7XG4gIH07XG5cbiAgcmV0dXJuIFRhYlBhbmU7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5UYWJQYW5lLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblRhYlBhbmUuY29udGV4dFR5cGVzID0gY29udGV4dFR5cGVzO1xuVGFiUGFuZS5jaGlsZENvbnRleHRUeXBlcyA9IGNoaWxkQ29udGV4dFR5cGVzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCd0YWItcGFuZScsIFRhYlBhbmUpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMzID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzNCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMzKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIHN0cmlwZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgYm9yZGVyZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgY29uZGVuc2VkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIGhvdmVyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIHJlc3BvbnNpdmU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbFxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgYm9yZGVyZWQ6IGZhbHNlLFxuICBjb25kZW5zZWQ6IGZhbHNlLFxuICBob3ZlcjogZmFsc2UsXG4gIHJlc3BvbnNpdmU6IGZhbHNlLFxuICBzdHJpcGVkOiBmYWxzZVxufTtcblxudmFyIFRhYmxlID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoVGFibGUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFRhYmxlKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIFRhYmxlKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgVGFibGUucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX2V4dGVuZHMyO1xuXG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIHN0cmlwZWQgPSBfcHJvcHMuc3RyaXBlZCxcbiAgICAgICAgYm9yZGVyZWQgPSBfcHJvcHMuYm9yZGVyZWQsXG4gICAgICAgIGNvbmRlbnNlZCA9IF9wcm9wcy5jb25kZW5zZWQsXG4gICAgICAgIGhvdmVyID0gX3Byb3BzLmhvdmVyLFxuICAgICAgICByZXNwb25zaXZlID0gX3Byb3BzLnJlc3BvbnNpdmUsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ3N0cmlwZWQnLCAnYm9yZGVyZWQnLCAnY29uZGVuc2VkJywgJ2hvdmVyJywgJ3Jlc3BvbnNpdmUnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyksIChfZXh0ZW5kczIgPSB7fSwgX2V4dGVuZHMyWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnc3RyaXBlZCcpXSA9IHN0cmlwZWQsIF9leHRlbmRzMlsoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ2JvcmRlcmVkJyldID0gYm9yZGVyZWQsIF9leHRlbmRzMlsoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ2NvbmRlbnNlZCcpXSA9IGNvbmRlbnNlZCwgX2V4dGVuZHMyWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnaG92ZXInKV0gPSBob3ZlciwgX2V4dGVuZHMyKSk7XG5cbiAgICB2YXIgdGFibGUgPSBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgndGFibGUnLCAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuXG4gICAgaWYgKHJlc3BvbnNpdmUpIHtcbiAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHsgY2xhc3NOYW1lOiAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ3Jlc3BvbnNpdmUnKSB9LFxuICAgICAgICB0YWJsZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFibGU7XG4gIH07XG5cbiAgcmV0dXJuIFRhYmxlO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuVGFibGUucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuVGFibGUuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCd0YWJsZScsIFRhYmxlKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2lzUmVxdWlyZWRGb3JBMTF5ID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvaXNSZXF1aXJlZEZvckExMXknKTtcblxudmFyIF9pc1JlcXVpcmVkRm9yQTExeTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pc1JlcXVpcmVkRm9yQTExeSk7XG5cbnZhciBfdW5jb250cm9sbGFibGUgPSByZXF1aXJlKCd1bmNvbnRyb2xsYWJsZScpO1xuXG52YXIgX3VuY29udHJvbGxhYmxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3VuY29udHJvbGxhYmxlKTtcblxudmFyIF9OYXYgPSByZXF1aXJlKCcuL05hdicpO1xuXG52YXIgX05hdjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9OYXYpO1xuXG52YXIgX05hdkl0ZW0gPSByZXF1aXJlKCcuL05hdkl0ZW0nKTtcblxudmFyIF9OYXZJdGVtMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05hdkl0ZW0pO1xuXG52YXIgX1RhYkNvbnRhaW5lciA9IHJlcXVpcmUoJy4vVGFiQ29udGFpbmVyJyk7XG5cbnZhciBfVGFiQ29udGFpbmVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RhYkNvbnRhaW5lcik7XG5cbnZhciBfVGFiQ29udGVudCA9IHJlcXVpcmUoJy4vVGFiQ29udGVudCcpO1xuXG52YXIgX1RhYkNvbnRlbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVGFiQ29udGVudCk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbnZhciBfVmFsaWRDb21wb25lbnRDaGlsZHJlbiA9IHJlcXVpcmUoJy4vdXRpbHMvVmFsaWRDb21wb25lbnRDaGlsZHJlbicpO1xuXG52YXIgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVmFsaWRDb21wb25lbnRDaGlsZHJlbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIFRhYkNvbnRhaW5lciA9IF9UYWJDb250YWluZXIyWydkZWZhdWx0J10uQ29udHJvbGxlZENvbXBvbmVudDtcblxudmFyIHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIE1hcmsgdGhlIFRhYiB3aXRoIGEgbWF0Y2hpbmcgYGV2ZW50S2V5YCBhcyBhY3RpdmUuXG4gICAqXG4gICAqIEBjb250cm9sbGFibGUgb25TZWxlY3RcbiAgICovXG4gIGFjdGl2ZUtleTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5hbnksXG5cbiAgLyoqXG4gICAqIE5hdmlnYXRpb24gc3R5bGVcbiAgICovXG4gIGJzU3R5bGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2YoWyd0YWJzJywgJ3BpbGxzJ10pLFxuXG4gIGFuaW1hdGlvbjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIGlkOiAoMCwgX2lzUmVxdWlyZWRGb3JBMTF5MlsnZGVmYXVsdCddKShfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mVHlwZShbX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsIF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyXSkpLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCB3aGVuIGEgVGFiIGlzIHNlbGVjdGVkLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBmdW5jdGlvbiAoXG4gICAqIFx0QW55IGV2ZW50S2V5LFxuICAgKiBcdFN5bnRoZXRpY0V2ZW50IGV2ZW50P1xuICAgKiApXG4gICAqIGBgYFxuICAgKlxuICAgKiBAY29udHJvbGxhYmxlIGFjdGl2ZUtleVxuICAgKi9cbiAgb25TZWxlY3Q6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogV2FpdCB1bnRpbCB0aGUgZmlyc3QgXCJlbnRlclwiIHRyYW5zaXRpb24gdG8gbW91bnQgdGFicyAoYWRkIHRoZW0gdG8gdGhlIERPTSlcbiAgICovXG4gIG1vdW50T25FbnRlcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBVbm1vdW50IHRhYnMgKHJlbW92ZSBpdCBmcm9tIHRoZSBET00pIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHZpc2libGVcbiAgICovXG4gIHVubW91bnRPbkV4aXQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbFxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgYnNTdHlsZTogJ3RhYnMnLFxuICBhbmltYXRpb246IHRydWUsXG4gIG1vdW50T25FbnRlcjogZmFsc2UsXG4gIHVubW91bnRPbkV4aXQ6IGZhbHNlXG59O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0QWN0aXZlS2V5KGNoaWxkcmVuKSB7XG4gIHZhciBkZWZhdWx0QWN0aXZlS2V5ID0gdm9pZCAwO1xuICBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjJbJ2RlZmF1bHQnXS5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICBpZiAoZGVmYXVsdEFjdGl2ZUtleSA9PSBudWxsKSB7XG4gICAgICBkZWZhdWx0QWN0aXZlS2V5ID0gY2hpbGQucHJvcHMuZXZlbnRLZXk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZGVmYXVsdEFjdGl2ZUtleTtcbn1cblxudmFyIFRhYnMgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShUYWJzLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBUYWJzKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIFRhYnMpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBUYWJzLnByb3RvdHlwZS5yZW5kZXJUYWIgPSBmdW5jdGlvbiByZW5kZXJUYWIoY2hpbGQpIHtcbiAgICB2YXIgX2NoaWxkJHByb3BzID0gY2hpbGQucHJvcHMsXG4gICAgICAgIHRpdGxlID0gX2NoaWxkJHByb3BzLnRpdGxlLFxuICAgICAgICBldmVudEtleSA9IF9jaGlsZCRwcm9wcy5ldmVudEtleSxcbiAgICAgICAgZGlzYWJsZWQgPSBfY2hpbGQkcHJvcHMuZGlzYWJsZWQsXG4gICAgICAgIHRhYkNsYXNzTmFtZSA9IF9jaGlsZCRwcm9wcy50YWJDbGFzc05hbWU7XG5cbiAgICBpZiAodGl0bGUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgX05hdkl0ZW0yWydkZWZhdWx0J10sXG4gICAgICB7XG4gICAgICAgIGV2ZW50S2V5OiBldmVudEtleSxcbiAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkLFxuICAgICAgICBjbGFzc05hbWU6IHRhYkNsYXNzTmFtZVxuICAgICAgfSxcbiAgICAgIHRpdGxlXG4gICAgKTtcbiAgfTtcblxuICBUYWJzLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGlkID0gX3Byb3BzLmlkLFxuICAgICAgICBvblNlbGVjdCA9IF9wcm9wcy5vblNlbGVjdCxcbiAgICAgICAgYW5pbWF0aW9uID0gX3Byb3BzLmFuaW1hdGlvbixcbiAgICAgICAgbW91bnRPbkVudGVyID0gX3Byb3BzLm1vdW50T25FbnRlcixcbiAgICAgICAgdW5tb3VudE9uRXhpdCA9IF9wcm9wcy51bm1vdW50T25FeGl0LFxuICAgICAgICBic0NsYXNzID0gX3Byb3BzLmJzQ2xhc3MsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHN0eWxlID0gX3Byb3BzLnN0eWxlLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgX3Byb3BzJGFjdGl2ZUtleSA9IF9wcm9wcy5hY3RpdmVLZXksXG4gICAgICAgIGFjdGl2ZUtleSA9IF9wcm9wcyRhY3RpdmVLZXkgPT09IHVuZGVmaW5lZCA/IGdldERlZmF1bHRBY3RpdmVLZXkoY2hpbGRyZW4pIDogX3Byb3BzJGFjdGl2ZUtleSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnaWQnLCAnb25TZWxlY3QnLCAnYW5pbWF0aW9uJywgJ21vdW50T25FbnRlcicsICd1bm1vdW50T25FeGl0JywgJ2JzQ2xhc3MnLCAnY2xhc3NOYW1lJywgJ3N0eWxlJywgJ2NoaWxkcmVuJywgJ2FjdGl2ZUtleSddKTtcblxuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgVGFiQ29udGFpbmVyLFxuICAgICAge1xuICAgICAgICBpZDogaWQsXG4gICAgICAgIGFjdGl2ZUtleTogYWN0aXZlS2V5LFxuICAgICAgICBvblNlbGVjdDogb25TZWxlY3QsXG4gICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sXG4gICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIG51bGwsXG4gICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgIF9OYXYyWydkZWZhdWx0J10sXG4gICAgICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgcHJvcHMsIHtcbiAgICAgICAgICAgIHJvbGU6ICd0YWJsaXN0J1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIF9WYWxpZENvbXBvbmVudENoaWxkcmVuMlsnZGVmYXVsdCddLm1hcChjaGlsZHJlbiwgdGhpcy5yZW5kZXJUYWIpXG4gICAgICAgICksXG4gICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgIF9UYWJDb250ZW50MlsnZGVmYXVsdCddLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGJzQ2xhc3M6IGJzQ2xhc3MsXG4gICAgICAgICAgICBhbmltYXRpb246IGFuaW1hdGlvbixcbiAgICAgICAgICAgIG1vdW50T25FbnRlcjogbW91bnRPbkVudGVyLFxuICAgICAgICAgICAgdW5tb3VudE9uRXhpdDogdW5tb3VudE9uRXhpdFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFRhYnM7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5UYWJzLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblRhYnMuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG4oMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCd0YWInLCBUYWJzKTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF91bmNvbnRyb2xsYWJsZTJbJ2RlZmF1bHQnXSkoVGFicywgeyBhY3RpdmVLZXk6ICdvblNlbGVjdCcgfSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfU2FmZUFuY2hvciA9IHJlcXVpcmUoJy4vU2FmZUFuY2hvcicpO1xuXG52YXIgX1NhZmVBbmNob3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU2FmZUFuY2hvcik7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgc3JjOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcbiAgYWx0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcbiAgaHJlZjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmdcbn07XG5cbnZhciBUaHVtYm5haWwgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShUaHVtYm5haWwsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFRodW1ibmFpbCgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBUaHVtYm5haWwpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBUaHVtYm5haWwucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgc3JjID0gX3Byb3BzLnNyYyxcbiAgICAgICAgYWx0ID0gX3Byb3BzLmFsdCxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ3NyYycsICdhbHQnLCAnY2xhc3NOYW1lJywgJ2NoaWxkcmVuJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBDb21wb25lbnQgPSBlbGVtZW50UHJvcHMuaHJlZiA/IF9TYWZlQW5jaG9yMlsnZGVmYXVsdCddIDogJ2Rpdic7XG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgIENvbXBvbmVudCxcbiAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgICAgfSksXG4gICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnaW1nJywgeyBzcmM6IHNyYywgYWx0OiBhbHQgfSksXG4gICAgICBjaGlsZHJlbiAmJiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHsgY2xhc3NOYW1lOiAnY2FwdGlvbicgfSxcbiAgICAgICAgY2hpbGRyZW5cbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBUaHVtYm5haWw7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5UaHVtYm5haWwucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCd0aHVtYm5haWwnLCBUaHVtYm5haWwpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMzID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzNCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMzKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2lzUmVxdWlyZWRGb3JBMTF5ID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvaXNSZXF1aXJlZEZvckExMXknKTtcblxudmFyIF9pc1JlcXVpcmVkRm9yQTExeTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pc1JlcXVpcmVkRm9yQTExeSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIEFuIGh0bWwgaWQgYXR0cmlidXRlLCBuZWNlc3NhcnkgZm9yIGFjY2Vzc2liaWxpdHlcbiAgICogQHR5cGUge3N0cmluZ3xudW1iZXJ9XG4gICAqIEByZXF1aXJlZFxuICAgKi9cbiAgaWQ6ICgwLCBfaXNSZXF1aXJlZEZvckExMXkyWydkZWZhdWx0J10pKF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2ZUeXBlKFtfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZywgX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXJdKSksXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGRpcmVjdGlvbiB0aGUgVG9vbHRpcCBpcyBwb3NpdGlvbmVkIHRvd2FyZHMuXG4gICAqL1xuICBwbGFjZW1lbnQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2YoWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXSksXG5cbiAgLyoqXG4gICAqIFRoZSBcInRvcFwiIHBvc2l0aW9uIHZhbHVlIGZvciB0aGUgVG9vbHRpcC5cbiAgICovXG4gIHBvc2l0aW9uVG9wOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mVHlwZShbX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsIF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nXSksXG4gIC8qKlxuICAgKiBUaGUgXCJsZWZ0XCIgcG9zaXRpb24gdmFsdWUgZm9yIHRoZSBUb29sdGlwLlxuICAgKi9cbiAgcG9zaXRpb25MZWZ0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mVHlwZShbX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsIF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nXSksXG5cbiAgLyoqXG4gICAqIFRoZSBcInRvcFwiIHBvc2l0aW9uIHZhbHVlIGZvciB0aGUgVG9vbHRpcCBhcnJvdy5cbiAgICovXG4gIGFycm93T2Zmc2V0VG9wOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mVHlwZShbX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsIF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nXSksXG4gIC8qKlxuICAgKiBUaGUgXCJsZWZ0XCIgcG9zaXRpb24gdmFsdWUgZm9yIHRoZSBUb29sdGlwIGFycm93LlxuICAgKi9cbiAgYXJyb3dPZmZzZXRMZWZ0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mVHlwZShbX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsIF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nXSlcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIHBsYWNlbWVudDogJ3JpZ2h0J1xufTtcblxudmFyIFRvb2x0aXAgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShUb29sdGlwLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBUb29sdGlwKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIFRvb2x0aXApO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBUb29sdGlwLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9leHRlbmRzMjtcblxuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBwbGFjZW1lbnQgPSBfcHJvcHMucGxhY2VtZW50LFxuICAgICAgICBwb3NpdGlvblRvcCA9IF9wcm9wcy5wb3NpdGlvblRvcCxcbiAgICAgICAgcG9zaXRpb25MZWZ0ID0gX3Byb3BzLnBvc2l0aW9uTGVmdCxcbiAgICAgICAgYXJyb3dPZmZzZXRUb3AgPSBfcHJvcHMuYXJyb3dPZmZzZXRUb3AsXG4gICAgICAgIGFycm93T2Zmc2V0TGVmdCA9IF9wcm9wcy5hcnJvd09mZnNldExlZnQsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHN0eWxlID0gX3Byb3BzLnN0eWxlLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsncGxhY2VtZW50JywgJ3Bvc2l0aW9uVG9wJywgJ3Bvc2l0aW9uTGVmdCcsICdhcnJvd09mZnNldFRvcCcsICdhcnJvd09mZnNldExlZnQnLCAnY2xhc3NOYW1lJywgJ3N0eWxlJywgJ2NoaWxkcmVuJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyksIChfZXh0ZW5kczIgPSB7fSwgX2V4dGVuZHMyW3BsYWNlbWVudF0gPSB0cnVlLCBfZXh0ZW5kczIpKTtcblxuICAgIHZhciBvdXRlclN0eWxlID0gKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7XG4gICAgICB0b3A6IHBvc2l0aW9uVG9wLFxuICAgICAgbGVmdDogcG9zaXRpb25MZWZ0XG4gICAgfSwgc3R5bGUpO1xuXG4gICAgdmFyIGFycm93U3R5bGUgPSB7XG4gICAgICB0b3A6IGFycm93T2Zmc2V0VG9wLFxuICAgICAgbGVmdDogYXJyb3dPZmZzZXRMZWZ0XG4gICAgfTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICdkaXYnLFxuICAgICAgKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICAgIHJvbGU6ICd0b29sdGlwJyxcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcyksXG4gICAgICAgIHN0eWxlOiBvdXRlclN0eWxlXG4gICAgICB9KSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdhcnJvdycpLCBzdHlsZTogYXJyb3dTdHlsZSB9KSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgeyBjbGFzc05hbWU6ICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnaW5uZXInKSB9LFxuICAgICAgICBjaGlsZHJlblxuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFRvb2x0aXA7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5Ub29sdGlwLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblRvb2x0aXAuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCd0b29sdGlwJywgVG9vbHRpcCk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxudmFyIF9TdHlsZUNvbmZpZyA9IHJlcXVpcmUoJy4vdXRpbHMvU3R5bGVDb25maWcnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgV2VsbCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKFdlbGwsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFdlbGwoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgV2VsbCk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIFdlbGwucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ2RpdicsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIFdlbGw7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCd3ZWxsJywgKDAsIF9ib290c3RyYXBVdGlscy5ic1NpemVzKShbX1N0eWxlQ29uZmlnLlNpemUuTEFSR0UsIF9TdHlsZUNvbmZpZy5TaXplLlNNQUxMXSwgV2VsbCkpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy51dGlscyA9IGV4cG9ydHMuV2VsbCA9IGV4cG9ydHMuVG9vbHRpcCA9IGV4cG9ydHMuVGh1bWJuYWlsID0gZXhwb3J0cy5UYWJzID0gZXhwb3J0cy5UYWJQYW5lID0gZXhwb3J0cy5UYWJsZSA9IGV4cG9ydHMuVGFiQ29udGVudCA9IGV4cG9ydHMuVGFiQ29udGFpbmVyID0gZXhwb3J0cy5UYWIgPSBleHBvcnRzLlNwbGl0QnV0dG9uID0gZXhwb3J0cy5TYWZlQW5jaG9yID0gZXhwb3J0cy5Sb3cgPSBleHBvcnRzLlJlc3BvbnNpdmVFbWJlZCA9IGV4cG9ydHMuUmFkaW8gPSBleHBvcnRzLlByb2dyZXNzQmFyID0gZXhwb3J0cy5Qb3BvdmVyID0gZXhwb3J0cy5QYW5lbEdyb3VwID0gZXhwb3J0cy5QYW5lbCA9IGV4cG9ydHMuUGFnaW5hdGlvbkJ1dHRvbiA9IGV4cG9ydHMuUGFnaW5hdGlvbiA9IGV4cG9ydHMuUGFnZXIgPSBleHBvcnRzLlBhZ2VJdGVtID0gZXhwb3J0cy5QYWdlSGVhZGVyID0gZXhwb3J0cy5PdmVybGF5VHJpZ2dlciA9IGV4cG9ydHMuT3ZlcmxheSA9IGV4cG9ydHMuTmF2SXRlbSA9IGV4cG9ydHMuTmF2RHJvcGRvd24gPSBleHBvcnRzLk5hdmJhckJyYW5kID0gZXhwb3J0cy5OYXZiYXIgPSBleHBvcnRzLk5hdiA9IGV4cG9ydHMuTW9kYWxUaXRsZSA9IGV4cG9ydHMuTW9kYWxIZWFkZXIgPSBleHBvcnRzLk1vZGFsRm9vdGVyID0gZXhwb3J0cy5Nb2RhbEJvZHkgPSBleHBvcnRzLk1vZGFsID0gZXhwb3J0cy5NZW51SXRlbSA9IGV4cG9ydHMuTWVkaWEgPSBleHBvcnRzLkxpc3RHcm91cEl0ZW0gPSBleHBvcnRzLkxpc3RHcm91cCA9IGV4cG9ydHMuTGFiZWwgPSBleHBvcnRzLkp1bWJvdHJvbiA9IGV4cG9ydHMuSW5wdXRHcm91cCA9IGV4cG9ydHMuSW1hZ2UgPSBleHBvcnRzLkhlbHBCbG9jayA9IGV4cG9ydHMuR3JpZCA9IGV4cG9ydHMuR2x5cGhpY29uID0gZXhwb3J0cy5Gb3JtR3JvdXAgPSBleHBvcnRzLkZvcm1Db250cm9sID0gZXhwb3J0cy5Gb3JtID0gZXhwb3J0cy5GYWRlID0gZXhwb3J0cy5Ecm9wZG93bkJ1dHRvbiA9IGV4cG9ydHMuRHJvcGRvd24gPSBleHBvcnRzLkNvbGxhcHNlID0gZXhwb3J0cy5Db2wgPSBleHBvcnRzLkNvbnRyb2xMYWJlbCA9IGV4cG9ydHMuQ2xlYXJmaXggPSBleHBvcnRzLkNoZWNrYm94ID0gZXhwb3J0cy5DYXJvdXNlbEl0ZW0gPSBleHBvcnRzLkNhcm91c2VsID0gZXhwb3J0cy5CdXR0b25Ub29sYmFyID0gZXhwb3J0cy5CdXR0b25Hcm91cCA9IGV4cG9ydHMuQnV0dG9uID0gZXhwb3J0cy5CcmVhZGNydW1iSXRlbSA9IGV4cG9ydHMuQnJlYWRjcnVtYiA9IGV4cG9ydHMuQmFkZ2UgPSBleHBvcnRzLkFsZXJ0ID0gZXhwb3J0cy5BY2NvcmRpb24gPSB1bmRlZmluZWQ7XG5cbnZhciBfQWNjb3JkaW9uMiA9IHJlcXVpcmUoJy4vQWNjb3JkaW9uJyk7XG5cbnZhciBfQWNjb3JkaW9uMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0FjY29yZGlvbjIpO1xuXG52YXIgX0FsZXJ0MiA9IHJlcXVpcmUoJy4vQWxlcnQnKTtcblxudmFyIF9BbGVydDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9BbGVydDIpO1xuXG52YXIgX0JhZGdlMiA9IHJlcXVpcmUoJy4vQmFkZ2UnKTtcblxudmFyIF9CYWRnZTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9CYWRnZTIpO1xuXG52YXIgX0JyZWFkY3J1bWIyID0gcmVxdWlyZSgnLi9CcmVhZGNydW1iJyk7XG5cbnZhciBfQnJlYWRjcnVtYjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9CcmVhZGNydW1iMik7XG5cbnZhciBfQnJlYWRjcnVtYkl0ZW0yID0gcmVxdWlyZSgnLi9CcmVhZGNydW1iSXRlbScpO1xuXG52YXIgX0JyZWFkY3J1bWJJdGVtMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0JyZWFkY3J1bWJJdGVtMik7XG5cbnZhciBfQnV0dG9uMiA9IHJlcXVpcmUoJy4vQnV0dG9uJyk7XG5cbnZhciBfQnV0dG9uMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0J1dHRvbjIpO1xuXG52YXIgX0J1dHRvbkdyb3VwMiA9IHJlcXVpcmUoJy4vQnV0dG9uR3JvdXAnKTtcblxudmFyIF9CdXR0b25Hcm91cDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9CdXR0b25Hcm91cDIpO1xuXG52YXIgX0J1dHRvblRvb2xiYXIyID0gcmVxdWlyZSgnLi9CdXR0b25Ub29sYmFyJyk7XG5cbnZhciBfQnV0dG9uVG9vbGJhcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9CdXR0b25Ub29sYmFyMik7XG5cbnZhciBfQ2Fyb3VzZWwyID0gcmVxdWlyZSgnLi9DYXJvdXNlbCcpO1xuXG52YXIgX0Nhcm91c2VsMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Nhcm91c2VsMik7XG5cbnZhciBfQ2Fyb3VzZWxJdGVtMiA9IHJlcXVpcmUoJy4vQ2Fyb3VzZWxJdGVtJyk7XG5cbnZhciBfQ2Fyb3VzZWxJdGVtMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Nhcm91c2VsSXRlbTIpO1xuXG52YXIgX0NoZWNrYm94MiA9IHJlcXVpcmUoJy4vQ2hlY2tib3gnKTtcblxudmFyIF9DaGVja2JveDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9DaGVja2JveDIpO1xuXG52YXIgX0NsZWFyZml4MiA9IHJlcXVpcmUoJy4vQ2xlYXJmaXgnKTtcblxudmFyIF9DbGVhcmZpeDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9DbGVhcmZpeDIpO1xuXG52YXIgX0NvbnRyb2xMYWJlbDIgPSByZXF1aXJlKCcuL0NvbnRyb2xMYWJlbCcpO1xuXG52YXIgX0NvbnRyb2xMYWJlbDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Db250cm9sTGFiZWwyKTtcblxudmFyIF9Db2wyID0gcmVxdWlyZSgnLi9Db2wnKTtcblxudmFyIF9Db2wzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ29sMik7XG5cbnZhciBfQ29sbGFwc2UyID0gcmVxdWlyZSgnLi9Db2xsYXBzZScpO1xuXG52YXIgX0NvbGxhcHNlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NvbGxhcHNlMik7XG5cbnZhciBfRHJvcGRvd24yID0gcmVxdWlyZSgnLi9Ecm9wZG93bicpO1xuXG52YXIgX0Ryb3Bkb3duMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Ryb3Bkb3duMik7XG5cbnZhciBfRHJvcGRvd25CdXR0b24yID0gcmVxdWlyZSgnLi9Ecm9wZG93bkJ1dHRvbicpO1xuXG52YXIgX0Ryb3Bkb3duQnV0dG9uMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Ryb3Bkb3duQnV0dG9uMik7XG5cbnZhciBfRmFkZTIgPSByZXF1aXJlKCcuL0ZhZGUnKTtcblxudmFyIF9GYWRlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0ZhZGUyKTtcblxudmFyIF9Gb3JtMiA9IHJlcXVpcmUoJy4vRm9ybScpO1xuXG52YXIgX0Zvcm0zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRm9ybTIpO1xuXG52YXIgX0Zvcm1Db250cm9sMiA9IHJlcXVpcmUoJy4vRm9ybUNvbnRyb2wnKTtcblxudmFyIF9Gb3JtQ29udHJvbDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Gb3JtQ29udHJvbDIpO1xuXG52YXIgX0Zvcm1Hcm91cDIgPSByZXF1aXJlKCcuL0Zvcm1Hcm91cCcpO1xuXG52YXIgX0Zvcm1Hcm91cDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Gb3JtR3JvdXAyKTtcblxudmFyIF9HbHlwaGljb24yID0gcmVxdWlyZSgnLi9HbHlwaGljb24nKTtcblxudmFyIF9HbHlwaGljb24zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfR2x5cGhpY29uMik7XG5cbnZhciBfR3JpZDIgPSByZXF1aXJlKCcuL0dyaWQnKTtcblxudmFyIF9HcmlkMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0dyaWQyKTtcblxudmFyIF9IZWxwQmxvY2syID0gcmVxdWlyZSgnLi9IZWxwQmxvY2snKTtcblxudmFyIF9IZWxwQmxvY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfSGVscEJsb2NrMik7XG5cbnZhciBfSW1hZ2UyID0gcmVxdWlyZSgnLi9JbWFnZScpO1xuXG52YXIgX0ltYWdlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0ltYWdlMik7XG5cbnZhciBfSW5wdXRHcm91cDIgPSByZXF1aXJlKCcuL0lucHV0R3JvdXAnKTtcblxudmFyIF9JbnB1dEdyb3VwMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0lucHV0R3JvdXAyKTtcblxudmFyIF9KdW1ib3Ryb24yID0gcmVxdWlyZSgnLi9KdW1ib3Ryb24nKTtcblxudmFyIF9KdW1ib3Ryb24zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfSnVtYm90cm9uMik7XG5cbnZhciBfTGFiZWwyID0gcmVxdWlyZSgnLi9MYWJlbCcpO1xuXG52YXIgX0xhYmVsMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0xhYmVsMik7XG5cbnZhciBfTGlzdEdyb3VwMiA9IHJlcXVpcmUoJy4vTGlzdEdyb3VwJyk7XG5cbnZhciBfTGlzdEdyb3VwMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0xpc3RHcm91cDIpO1xuXG52YXIgX0xpc3RHcm91cEl0ZW0yID0gcmVxdWlyZSgnLi9MaXN0R3JvdXBJdGVtJyk7XG5cbnZhciBfTGlzdEdyb3VwSXRlbTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9MaXN0R3JvdXBJdGVtMik7XG5cbnZhciBfTWVkaWEyID0gcmVxdWlyZSgnLi9NZWRpYScpO1xuXG52YXIgX01lZGlhMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01lZGlhMik7XG5cbnZhciBfTWVudUl0ZW0yID0gcmVxdWlyZSgnLi9NZW51SXRlbScpO1xuXG52YXIgX01lbnVJdGVtMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01lbnVJdGVtMik7XG5cbnZhciBfTW9kYWwyID0gcmVxdWlyZSgnLi9Nb2RhbCcpO1xuXG52YXIgX01vZGFsMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01vZGFsMik7XG5cbnZhciBfTW9kYWxCb2R5MiA9IHJlcXVpcmUoJy4vTW9kYWxCb2R5Jyk7XG5cbnZhciBfTW9kYWxCb2R5MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01vZGFsQm9keTIpO1xuXG52YXIgX01vZGFsRm9vdGVyMiA9IHJlcXVpcmUoJy4vTW9kYWxGb290ZXInKTtcblxudmFyIF9Nb2RhbEZvb3RlcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Nb2RhbEZvb3RlcjIpO1xuXG52YXIgX01vZGFsSGVhZGVyMiA9IHJlcXVpcmUoJy4vTW9kYWxIZWFkZXInKTtcblxudmFyIF9Nb2RhbEhlYWRlcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Nb2RhbEhlYWRlcjIpO1xuXG52YXIgX01vZGFsVGl0bGUyID0gcmVxdWlyZSgnLi9Nb2RhbFRpdGxlJyk7XG5cbnZhciBfTW9kYWxUaXRsZTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Nb2RhbFRpdGxlMik7XG5cbnZhciBfTmF2MiA9IHJlcXVpcmUoJy4vTmF2Jyk7XG5cbnZhciBfTmF2MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05hdjIpO1xuXG52YXIgX05hdmJhcjIgPSByZXF1aXJlKCcuL05hdmJhcicpO1xuXG52YXIgX05hdmJhcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9OYXZiYXIyKTtcblxudmFyIF9OYXZiYXJCcmFuZDIgPSByZXF1aXJlKCcuL05hdmJhckJyYW5kJyk7XG5cbnZhciBfTmF2YmFyQnJhbmQzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTmF2YmFyQnJhbmQyKTtcblxudmFyIF9OYXZEcm9wZG93bjIgPSByZXF1aXJlKCcuL05hdkRyb3Bkb3duJyk7XG5cbnZhciBfTmF2RHJvcGRvd24zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTmF2RHJvcGRvd24yKTtcblxudmFyIF9OYXZJdGVtMiA9IHJlcXVpcmUoJy4vTmF2SXRlbScpO1xuXG52YXIgX05hdkl0ZW0zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTmF2SXRlbTIpO1xuXG52YXIgX092ZXJsYXkyID0gcmVxdWlyZSgnLi9PdmVybGF5Jyk7XG5cbnZhciBfT3ZlcmxheTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9PdmVybGF5Mik7XG5cbnZhciBfT3ZlcmxheVRyaWdnZXIyID0gcmVxdWlyZSgnLi9PdmVybGF5VHJpZ2dlcicpO1xuXG52YXIgX092ZXJsYXlUcmlnZ2VyMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX092ZXJsYXlUcmlnZ2VyMik7XG5cbnZhciBfUGFnZUhlYWRlcjIgPSByZXF1aXJlKCcuL1BhZ2VIZWFkZXInKTtcblxudmFyIF9QYWdlSGVhZGVyMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1BhZ2VIZWFkZXIyKTtcblxudmFyIF9QYWdlSXRlbTIgPSByZXF1aXJlKCcuL1BhZ2VJdGVtJyk7XG5cbnZhciBfUGFnZUl0ZW0zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUGFnZUl0ZW0yKTtcblxudmFyIF9QYWdlcjIgPSByZXF1aXJlKCcuL1BhZ2VyJyk7XG5cbnZhciBfUGFnZXIzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUGFnZXIyKTtcblxudmFyIF9QYWdpbmF0aW9uMiA9IHJlcXVpcmUoJy4vUGFnaW5hdGlvbicpO1xuXG52YXIgX1BhZ2luYXRpb24zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUGFnaW5hdGlvbjIpO1xuXG52YXIgX1BhZ2luYXRpb25CdXR0b24yID0gcmVxdWlyZSgnLi9QYWdpbmF0aW9uQnV0dG9uJyk7XG5cbnZhciBfUGFnaW5hdGlvbkJ1dHRvbjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9QYWdpbmF0aW9uQnV0dG9uMik7XG5cbnZhciBfUGFuZWwyID0gcmVxdWlyZSgnLi9QYW5lbCcpO1xuXG52YXIgX1BhbmVsMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1BhbmVsMik7XG5cbnZhciBfUGFuZWxHcm91cDIgPSByZXF1aXJlKCcuL1BhbmVsR3JvdXAnKTtcblxudmFyIF9QYW5lbEdyb3VwMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1BhbmVsR3JvdXAyKTtcblxudmFyIF9Qb3BvdmVyMiA9IHJlcXVpcmUoJy4vUG9wb3ZlcicpO1xuXG52YXIgX1BvcG92ZXIzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUG9wb3ZlcjIpO1xuXG52YXIgX1Byb2dyZXNzQmFyMiA9IHJlcXVpcmUoJy4vUHJvZ3Jlc3NCYXInKTtcblxudmFyIF9Qcm9ncmVzc0JhcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Qcm9ncmVzc0JhcjIpO1xuXG52YXIgX1JhZGlvMiA9IHJlcXVpcmUoJy4vUmFkaW8nKTtcblxudmFyIF9SYWRpbzMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9SYWRpbzIpO1xuXG52YXIgX1Jlc3BvbnNpdmVFbWJlZDIgPSByZXF1aXJlKCcuL1Jlc3BvbnNpdmVFbWJlZCcpO1xuXG52YXIgX1Jlc3BvbnNpdmVFbWJlZDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9SZXNwb25zaXZlRW1iZWQyKTtcblxudmFyIF9Sb3cyID0gcmVxdWlyZSgnLi9Sb3cnKTtcblxudmFyIF9Sb3czID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUm93Mik7XG5cbnZhciBfU2FmZUFuY2hvcjIgPSByZXF1aXJlKCcuL1NhZmVBbmNob3InKTtcblxudmFyIF9TYWZlQW5jaG9yMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1NhZmVBbmNob3IyKTtcblxudmFyIF9TcGxpdEJ1dHRvbjIgPSByZXF1aXJlKCcuL1NwbGl0QnV0dG9uJyk7XG5cbnZhciBfU3BsaXRCdXR0b24zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU3BsaXRCdXR0b24yKTtcblxudmFyIF9UYWIyID0gcmVxdWlyZSgnLi9UYWInKTtcblxudmFyIF9UYWIzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVGFiMik7XG5cbnZhciBfVGFiQ29udGFpbmVyMiA9IHJlcXVpcmUoJy4vVGFiQ29udGFpbmVyJyk7XG5cbnZhciBfVGFiQ29udGFpbmVyMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RhYkNvbnRhaW5lcjIpO1xuXG52YXIgX1RhYkNvbnRlbnQyID0gcmVxdWlyZSgnLi9UYWJDb250ZW50Jyk7XG5cbnZhciBfVGFiQ29udGVudDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UYWJDb250ZW50Mik7XG5cbnZhciBfVGFibGUyID0gcmVxdWlyZSgnLi9UYWJsZScpO1xuXG52YXIgX1RhYmxlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RhYmxlMik7XG5cbnZhciBfVGFiUGFuZTIgPSByZXF1aXJlKCcuL1RhYlBhbmUnKTtcblxudmFyIF9UYWJQYW5lMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RhYlBhbmUyKTtcblxudmFyIF9UYWJzMiA9IHJlcXVpcmUoJy4vVGFicycpO1xuXG52YXIgX1RhYnMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVGFiczIpO1xuXG52YXIgX1RodW1ibmFpbDIgPSByZXF1aXJlKCcuL1RodW1ibmFpbCcpO1xuXG52YXIgX1RodW1ibmFpbDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UaHVtYm5haWwyKTtcblxudmFyIF9Ub29sdGlwMiA9IHJlcXVpcmUoJy4vVG9vbHRpcCcpO1xuXG52YXIgX1Rvb2x0aXAzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVG9vbHRpcDIpO1xuXG52YXIgX1dlbGwyID0gcmVxdWlyZSgnLi9XZWxsJyk7XG5cbnZhciBfV2VsbDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9XZWxsMik7XG5cbnZhciBfdXRpbHMyID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgX3V0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX3V0aWxzMik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gZWxzZSB7IHZhciBuZXdPYmogPSB7fTsgaWYgKG9iaiAhPSBudWxsKSB7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSBuZXdPYmpbJ2RlZmF1bHQnXSA9IG9iajsgcmV0dXJuIG5ld09iajsgfSB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuZXhwb3J0cy5BY2NvcmRpb24gPSBfQWNjb3JkaW9uM1snZGVmYXVsdCddO1xuZXhwb3J0cy5BbGVydCA9IF9BbGVydDNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuQmFkZ2UgPSBfQmFkZ2UzWydkZWZhdWx0J107XG5leHBvcnRzLkJyZWFkY3J1bWIgPSBfQnJlYWRjcnVtYjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuQnJlYWRjcnVtYkl0ZW0gPSBfQnJlYWRjcnVtYkl0ZW0zWydkZWZhdWx0J107XG5leHBvcnRzLkJ1dHRvbiA9IF9CdXR0b24zWydkZWZhdWx0J107XG5leHBvcnRzLkJ1dHRvbkdyb3VwID0gX0J1dHRvbkdyb3VwM1snZGVmYXVsdCddO1xuZXhwb3J0cy5CdXR0b25Ub29sYmFyID0gX0J1dHRvblRvb2xiYXIzWydkZWZhdWx0J107XG5leHBvcnRzLkNhcm91c2VsID0gX0Nhcm91c2VsM1snZGVmYXVsdCddO1xuZXhwb3J0cy5DYXJvdXNlbEl0ZW0gPSBfQ2Fyb3VzZWxJdGVtM1snZGVmYXVsdCddO1xuZXhwb3J0cy5DaGVja2JveCA9IF9DaGVja2JveDNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuQ2xlYXJmaXggPSBfQ2xlYXJmaXgzWydkZWZhdWx0J107XG5leHBvcnRzLkNvbnRyb2xMYWJlbCA9IF9Db250cm9sTGFiZWwzWydkZWZhdWx0J107XG5leHBvcnRzLkNvbCA9IF9Db2wzWydkZWZhdWx0J107XG5leHBvcnRzLkNvbGxhcHNlID0gX0NvbGxhcHNlM1snZGVmYXVsdCddO1xuZXhwb3J0cy5Ecm9wZG93biA9IF9Ecm9wZG93bjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuRHJvcGRvd25CdXR0b24gPSBfRHJvcGRvd25CdXR0b24zWydkZWZhdWx0J107XG5leHBvcnRzLkZhZGUgPSBfRmFkZTNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuRm9ybSA9IF9Gb3JtM1snZGVmYXVsdCddO1xuZXhwb3J0cy5Gb3JtQ29udHJvbCA9IF9Gb3JtQ29udHJvbDNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuRm9ybUdyb3VwID0gX0Zvcm1Hcm91cDNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuR2x5cGhpY29uID0gX0dseXBoaWNvbjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuR3JpZCA9IF9HcmlkM1snZGVmYXVsdCddO1xuZXhwb3J0cy5IZWxwQmxvY2sgPSBfSGVscEJsb2NrM1snZGVmYXVsdCddO1xuZXhwb3J0cy5JbWFnZSA9IF9JbWFnZTNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuSW5wdXRHcm91cCA9IF9JbnB1dEdyb3VwM1snZGVmYXVsdCddO1xuZXhwb3J0cy5KdW1ib3Ryb24gPSBfSnVtYm90cm9uM1snZGVmYXVsdCddO1xuZXhwb3J0cy5MYWJlbCA9IF9MYWJlbDNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuTGlzdEdyb3VwID0gX0xpc3RHcm91cDNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuTGlzdEdyb3VwSXRlbSA9IF9MaXN0R3JvdXBJdGVtM1snZGVmYXVsdCddO1xuZXhwb3J0cy5NZWRpYSA9IF9NZWRpYTNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuTWVudUl0ZW0gPSBfTWVudUl0ZW0zWydkZWZhdWx0J107XG5leHBvcnRzLk1vZGFsID0gX01vZGFsM1snZGVmYXVsdCddO1xuZXhwb3J0cy5Nb2RhbEJvZHkgPSBfTW9kYWxCb2R5M1snZGVmYXVsdCddO1xuZXhwb3J0cy5Nb2RhbEZvb3RlciA9IF9Nb2RhbEZvb3RlcjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuTW9kYWxIZWFkZXIgPSBfTW9kYWxIZWFkZXIzWydkZWZhdWx0J107XG5leHBvcnRzLk1vZGFsVGl0bGUgPSBfTW9kYWxUaXRsZTNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuTmF2ID0gX05hdjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuTmF2YmFyID0gX05hdmJhcjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuTmF2YmFyQnJhbmQgPSBfTmF2YmFyQnJhbmQzWydkZWZhdWx0J107XG5leHBvcnRzLk5hdkRyb3Bkb3duID0gX05hdkRyb3Bkb3duM1snZGVmYXVsdCddO1xuZXhwb3J0cy5OYXZJdGVtID0gX05hdkl0ZW0zWydkZWZhdWx0J107XG5leHBvcnRzLk92ZXJsYXkgPSBfT3ZlcmxheTNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuT3ZlcmxheVRyaWdnZXIgPSBfT3ZlcmxheVRyaWdnZXIzWydkZWZhdWx0J107XG5leHBvcnRzLlBhZ2VIZWFkZXIgPSBfUGFnZUhlYWRlcjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuUGFnZUl0ZW0gPSBfUGFnZUl0ZW0zWydkZWZhdWx0J107XG5leHBvcnRzLlBhZ2VyID0gX1BhZ2VyM1snZGVmYXVsdCddO1xuZXhwb3J0cy5QYWdpbmF0aW9uID0gX1BhZ2luYXRpb24zWydkZWZhdWx0J107XG5leHBvcnRzLlBhZ2luYXRpb25CdXR0b24gPSBfUGFnaW5hdGlvbkJ1dHRvbjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuUGFuZWwgPSBfUGFuZWwzWydkZWZhdWx0J107XG5leHBvcnRzLlBhbmVsR3JvdXAgPSBfUGFuZWxHcm91cDNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuUG9wb3ZlciA9IF9Qb3BvdmVyM1snZGVmYXVsdCddO1xuZXhwb3J0cy5Qcm9ncmVzc0JhciA9IF9Qcm9ncmVzc0JhcjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuUmFkaW8gPSBfUmFkaW8zWydkZWZhdWx0J107XG5leHBvcnRzLlJlc3BvbnNpdmVFbWJlZCA9IF9SZXNwb25zaXZlRW1iZWQzWydkZWZhdWx0J107XG5leHBvcnRzLlJvdyA9IF9Sb3czWydkZWZhdWx0J107XG5leHBvcnRzLlNhZmVBbmNob3IgPSBfU2FmZUFuY2hvcjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuU3BsaXRCdXR0b24gPSBfU3BsaXRCdXR0b24zWydkZWZhdWx0J107XG5leHBvcnRzLlRhYiA9IF9UYWIzWydkZWZhdWx0J107XG5leHBvcnRzLlRhYkNvbnRhaW5lciA9IF9UYWJDb250YWluZXIzWydkZWZhdWx0J107XG5leHBvcnRzLlRhYkNvbnRlbnQgPSBfVGFiQ29udGVudDNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuVGFibGUgPSBfVGFibGUzWydkZWZhdWx0J107XG5leHBvcnRzLlRhYlBhbmUgPSBfVGFiUGFuZTNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuVGFicyA9IF9UYWJzM1snZGVmYXVsdCddO1xuZXhwb3J0cy5UaHVtYm5haWwgPSBfVGh1bWJuYWlsM1snZGVmYXVsdCddO1xuZXhwb3J0cy5Ub29sdGlwID0gX1Rvb2x0aXAzWydkZWZhdWx0J107XG5leHBvcnRzLldlbGwgPSBfV2VsbDNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMudXRpbHMgPSBfdXRpbHM7IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5yZXF1aXJlZFJvbGVzID0gcmVxdWlyZWRSb2xlcztcbmV4cG9ydHMuZXhjbHVzaXZlUm9sZXMgPSBleGNsdXNpdmVSb2xlcztcblxudmFyIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlciA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL3V0aWxzL2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIpO1xuXG52YXIgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4gPSByZXF1aXJlKCcuL1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4nKTtcblxudmFyIF9WYWxpZENvbXBvbmVudENoaWxkcmVuMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIHJlcXVpcmVkUm9sZXMoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCByb2xlcyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHJvbGVzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuICgwLCBfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIyWydkZWZhdWx0J10pKGZ1bmN0aW9uIChwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudCkge1xuICAgIHZhciBtaXNzaW5nID0gdm9pZCAwO1xuXG4gICAgcm9sZXMuZXZlcnkoZnVuY3Rpb24gKHJvbGUpIHtcbiAgICAgIGlmICghX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yWydkZWZhdWx0J10uc29tZShwcm9wcy5jaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBjaGlsZC5wcm9wcy5ic1JvbGUgPT09IHJvbGU7XG4gICAgICB9KSkge1xuICAgICAgICBtaXNzaW5nID0gcm9sZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIGlmIChtaXNzaW5nKSB7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKCcoY2hpbGRyZW4pICcgKyBjb21wb25lbnQgKyAnIC0gTWlzc2luZyBhIHJlcXVpcmVkIGNoaWxkIHdpdGggYnNSb2xlOiAnICsgKG1pc3NpbmcgKyAnLiAnICsgY29tcG9uZW50ICsgJyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGNoaWxkIG9mIGVhY2ggb2YgJykgKyAoJ3RoZSBmb2xsb3dpbmcgYnNSb2xlczogJyArIHJvbGVzLmpvaW4oJywgJykpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGV4Y2x1c2l2ZVJvbGVzKCkge1xuICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIHJvbGVzID0gQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICByb2xlc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICB9XG5cbiAgcmV0dXJuICgwLCBfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIyWydkZWZhdWx0J10pKGZ1bmN0aW9uIChwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudCkge1xuICAgIHZhciBkdXBsaWNhdGUgPSB2b2lkIDA7XG5cbiAgICByb2xlcy5ldmVyeShmdW5jdGlvbiAocm9sZSkge1xuICAgICAgdmFyIGNoaWxkcmVuV2l0aFJvbGUgPSBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjJbJ2RlZmF1bHQnXS5maWx0ZXIocHJvcHMuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gY2hpbGQucHJvcHMuYnNSb2xlID09PSByb2xlO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChjaGlsZHJlbldpdGhSb2xlLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZHVwbGljYXRlID0gcm9sZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIGlmIChkdXBsaWNhdGUpIHtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoJyhjaGlsZHJlbikgJyArIGNvbXBvbmVudCArICcgLSBEdXBsaWNhdGUgY2hpbGRyZW4gZGV0ZWN0ZWQgb2YgYnNSb2xlOiAnICsgKGR1cGxpY2F0ZSArICcuIE9ubHkgb25lIGNoaWxkIGVhY2ggYWxsb3dlZCB3aXRoIHRoZSBmb2xsb3dpbmcgJykgKyAoJ2JzUm9sZXM6ICcgKyByb2xlcy5qb2luKCcsICcpKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xufSIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbnZhciBTaXplID0gZXhwb3J0cy5TaXplID0ge1xuICBMQVJHRTogJ2xhcmdlJyxcbiAgU01BTEw6ICdzbWFsbCcsXG4gIFhTTUFMTDogJ3hzbWFsbCdcbn07XG5cbnZhciBTSVpFX01BUCA9IGV4cG9ydHMuU0laRV9NQVAgPSB7XG4gIGxhcmdlOiAnbGcnLFxuICBtZWRpdW06ICdtZCcsXG4gIHNtYWxsOiAnc20nLFxuICB4c21hbGw6ICd4cycsXG4gIGxnOiAnbGcnLFxuICBtZDogJ21kJyxcbiAgc206ICdzbScsXG4gIHhzOiAneHMnXG59O1xuXG52YXIgREVWSUNFX1NJWkVTID0gZXhwb3J0cy5ERVZJQ0VfU0laRVMgPSBbJ2xnJywgJ21kJywgJ3NtJywgJ3hzJ107XG5cbnZhciBTdGF0ZSA9IGV4cG9ydHMuU3RhdGUgPSB7XG4gIFNVQ0NFU1M6ICdzdWNjZXNzJyxcbiAgV0FSTklORzogJ3dhcm5pbmcnLFxuICBEQU5HRVI6ICdkYW5nZXInLFxuICBJTkZPOiAnaW5mbydcbn07XG5cbnZhciBTdHlsZSA9IGV4cG9ydHMuU3R5bGUgPSB7XG4gIERFRkFVTFQ6ICdkZWZhdWx0JyxcbiAgUFJJTUFSWTogJ3ByaW1hcnknLFxuICBMSU5LOiAnbGluaycsXG4gIElOVkVSU0U6ICdpbnZlcnNlJ1xufTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG4vKipcbiAqIENvcHlyaWdodCAyMDEzLTIwMTQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgZmlsZSBjb250YWlucyBhIG1vZGlmaWVkIHZlcnNpb24gb2Y6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi92MC4xMi4wL3NyYy9hZGRvbnMvdHJhbnNpdGlvbnMvUmVhY3RUcmFuc2l0aW9uRXZlbnRzLmpzXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaGVyZTpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9ibG9iL3YwLjEyLjAvTElDRU5TRVxuICogQW4gYWRkaXRpb25hbCBncmFudCBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBoZXJlOlxuICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2Jsb2IvdjAuMTIuMC9QQVRFTlRTXG4gKi9cblxudmFyIGNhblVzZURPTSA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCAmJiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5cbi8qKlxuICogRVZFTlRfTkFNRV9NQVAgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggZXZlbnQgZmlyZWQgd2hlbiBhXG4gKiB0cmFuc2l0aW9uL2FuaW1hdGlvbiBlbmRzLCBiYXNlZCBvbiB0aGUgc3R5bGUgcHJvcGVydHkgdXNlZCB0b1xuICogZGVmaW5lIHRoYXQgZXZlbnQuXG4gKi9cbnZhciBFVkVOVF9OQU1FX01BUCA9IHtcbiAgdHJhbnNpdGlvbmVuZDoge1xuICAgICd0cmFuc2l0aW9uJzogJ3RyYW5zaXRpb25lbmQnLFxuICAgICdXZWJraXRUcmFuc2l0aW9uJzogJ3dlYmtpdFRyYW5zaXRpb25FbmQnLFxuICAgICdNb3pUcmFuc2l0aW9uJzogJ21velRyYW5zaXRpb25FbmQnLFxuICAgICdPVHJhbnNpdGlvbic6ICdvVHJhbnNpdGlvbkVuZCcsXG4gICAgJ21zVHJhbnNpdGlvbic6ICdNU1RyYW5zaXRpb25FbmQnXG4gIH0sXG5cbiAgYW5pbWF0aW9uZW5kOiB7XG4gICAgJ2FuaW1hdGlvbic6ICdhbmltYXRpb25lbmQnLFxuICAgICdXZWJraXRBbmltYXRpb24nOiAnd2Via2l0QW5pbWF0aW9uRW5kJyxcbiAgICAnTW96QW5pbWF0aW9uJzogJ21vekFuaW1hdGlvbkVuZCcsXG4gICAgJ09BbmltYXRpb24nOiAnb0FuaW1hdGlvbkVuZCcsXG4gICAgJ21zQW5pbWF0aW9uJzogJ01TQW5pbWF0aW9uRW5kJ1xuICB9XG59O1xuXG52YXIgZW5kRXZlbnRzID0gW107XG5cbmZ1bmN0aW9uIGRldGVjdEV2ZW50cygpIHtcbiAgdmFyIHRlc3RFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICB2YXIgc3R5bGUgPSB0ZXN0RWwuc3R5bGU7XG5cbiAgLy8gT24gc29tZSBwbGF0Zm9ybXMsIGluIHBhcnRpY3VsYXIgc29tZSByZWxlYXNlcyBvZiBBbmRyb2lkIDQueCxcbiAgLy8gdGhlIHVuLXByZWZpeGVkIFwiYW5pbWF0aW9uXCIgYW5kIFwidHJhbnNpdGlvblwiIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgb24gdGhlXG4gIC8vIHN0eWxlIG9iamVjdCBidXQgdGhlIGV2ZW50cyB0aGF0IGZpcmUgd2lsbCBzdGlsbCBiZSBwcmVmaXhlZCwgc28gd2UgbmVlZFxuICAvLyB0byBjaGVjayBpZiB0aGUgdW4tcHJlZml4ZWQgZXZlbnRzIGFyZSB1c2VhYmxlLCBhbmQgaWYgbm90IHJlbW92ZSB0aGVtXG4gIC8vIGZyb20gdGhlIG1hcFxuICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgRVZFTlRfTkFNRV9NQVAuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgfVxuXG4gIGlmICghKCdUcmFuc2l0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgRVZFTlRfTkFNRV9NQVAudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uO1xuICB9XG5cbiAgZm9yICh2YXIgYmFzZUV2ZW50TmFtZSBpbiBFVkVOVF9OQU1FX01BUCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZ3VhcmQtZm9yLWluXG4gICAgdmFyIGJhc2VFdmVudHMgPSBFVkVOVF9OQU1FX01BUFtiYXNlRXZlbnROYW1lXTtcbiAgICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gYmFzZUV2ZW50cykge1xuICAgICAgaWYgKHN0eWxlTmFtZSBpbiBzdHlsZSkge1xuICAgICAgICBlbmRFdmVudHMucHVzaChiYXNlRXZlbnRzW3N0eWxlTmFtZV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuaWYgKGNhblVzZURPTSkge1xuICBkZXRlY3RFdmVudHMoKTtcbn1cblxuLy8gV2UgdXNlIHRoZSByYXcge2FkZHxyZW1vdmV9RXZlbnRMaXN0ZW5lcigpIGNhbGwgYmVjYXVzZSBFdmVudExpc3RlbmVyXG4vLyBkb2VzIG5vdCBrbm93IGhvdyB0byByZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGFuZCB3ZSByZWFsbHkgc2hvdWxkXG4vLyBjbGVhbiB1cC4gQWxzbywgdGhlc2UgZXZlbnRzIGFyZSBub3QgdHJpZ2dlcmVkIGluIG9sZGVyIGJyb3dzZXJzXG4vLyBzbyB3ZSBzaG91bGQgYmUgQS1PSyBoZXJlLlxuXG5mdW5jdGlvbiBhZGRFdmVudExpc3RlbmVyKG5vZGUsIGV2ZW50TmFtZSwgZXZlbnRMaXN0ZW5lcikge1xuICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBldmVudExpc3RlbmVyLCBmYWxzZSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBldmVudExpc3RlbmVyKSB7XG4gIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50TGlzdGVuZXIsIGZhbHNlKTtcbn1cblxudmFyIFJlYWN0VHJhbnNpdGlvbkV2ZW50cyA9IHtcbiAgYWRkRW5kRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gYWRkRW5kRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudExpc3RlbmVyKSB7XG4gICAgaWYgKGVuZEV2ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIElmIENTUyB0cmFuc2l0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCwgdHJpZ2dlciBhbiBcImVuZCBhbmltYXRpb25cIlxuICAgICAgLy8gZXZlbnQgaW1tZWRpYXRlbHkuXG4gICAgICB3aW5kb3cuc2V0VGltZW91dChldmVudExpc3RlbmVyLCAwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW5kRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGVuZEV2ZW50KSB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKG5vZGUsIGVuZEV2ZW50LCBldmVudExpc3RlbmVyKTtcbiAgICB9KTtcbiAgfSxcbiAgcmVtb3ZlRW5kRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlRW5kRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudExpc3RlbmVyKSB7XG4gICAgaWYgKGVuZEV2ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW5kRXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGVuZEV2ZW50KSB7XG4gICAgICByZW1vdmVFdmVudExpc3RlbmVyKG5vZGUsIGVuZEV2ZW50LCBldmVudExpc3RlbmVyKTtcbiAgICB9KTtcbiAgfVxufTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gUmVhY3RUcmFuc2l0aW9uRXZlbnRzO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuLyoqXG4gKiBJdGVyYXRlcyB0aHJvdWdoIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCxcbiAqIGJ1dCBvbmx5IG1hcHMgb3ZlciBjaGlsZHJlbiB0aGF0IGFyZSBcInZhbGlkIGNvbXBvbmVudHNcIi5cbiAqXG4gKiBUaGUgbWFwRnVuY3Rpb24gcHJvdmlkZWQgaW5kZXggd2lsbCBiZSBub3JtYWxpc2VkIHRvIHRoZSBjb21wb25lbnRzIG1hcHBlZCxcbiAqIHNvIGFuIGludmFsaWQgY29tcG9uZW50IHdvdWxkIG5vdCBpbmNyZWFzZSB0aGUgaW5kZXguXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZ1bmMuXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBmb3IgZnVuYy5cbiAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yZGVyZWQgbWFwIG9mIHJlc3VsdHMuXG4gKi9cbmZ1bmN0aW9uIG1hcChjaGlsZHJlbiwgZnVuYywgY29udGV4dCkge1xuICB2YXIgaW5kZXggPSAwO1xuXG4gIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uQ2hpbGRyZW4ubWFwKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICBpZiAoIV9yZWFjdDJbJ2RlZmF1bHQnXS5pc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgIHJldHVybiBjaGlsZDtcbiAgICB9XG5cbiAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBpbmRleCsrKTtcbiAgfSk7XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBjaGlsZHJlbiB0aGF0IGFyZSBcInZhbGlkIGNvbXBvbmVudHNcIi5cbiAqXG4gKiBUaGUgcHJvdmlkZWQgZm9yRWFjaEZ1bmMoY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZCB3aXRoIHRoZSBpbmRleCByZWZsZWN0aW5nIHRoZSBwb3NpdGlvbiByZWxhdGl2ZSB0byBcInZhbGlkIGNvbXBvbmVudHNcIi5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZnVuYy5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBDb250ZXh0IGZvciBjb250ZXh0LlxuICovXG4vLyBUT0RPOiBUaGlzIG1vZHVsZSBzaG91bGQgYmUgRWxlbWVudENoaWxkcmVuLCBhbmQgc2hvdWxkIHVzZSBuYW1lZCBleHBvcnRzLlxuXG5mdW5jdGlvbiBmb3JFYWNoKGNoaWxkcmVuLCBmdW5jLCBjb250ZXh0KSB7XG4gIHZhciBpbmRleCA9IDA7XG5cbiAgX3JlYWN0MlsnZGVmYXVsdCddLkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIGlmICghX3JlYWN0MlsnZGVmYXVsdCddLmlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZ1bmMuY2FsbChjb250ZXh0LCBjaGlsZCwgaW5kZXgrKyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENvdW50IHRoZSBudW1iZXIgb2YgXCJ2YWxpZCBjb21wb25lbnRzXCIgaW4gdGhlIENoaWxkcmVuIGNvbnRhaW5lci5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGNvdW50KGNoaWxkcmVuKSB7XG4gIHZhciByZXN1bHQgPSAwO1xuXG4gIF9yZWFjdDJbJ2RlZmF1bHQnXS5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICBpZiAoIV9yZWFjdDJbJ2RlZmF1bHQnXS5pc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICArK3Jlc3VsdDtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBGaW5kcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAsXG4gKiBidXQgb25seSBpdGVyYXRlcyBvdmVyIGNoaWxkcmVuIHRoYXQgYXJlIFwidmFsaWQgY29tcG9uZW50c1wiLlxuICpcbiAqIFRoZSBwcm92aWRlZCBmb3JFYWNoRnVuYyhjaGlsZCwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkIHdpdGggdGhlIGluZGV4IHJlZmxlY3RpbmcgdGhlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIFwidmFsaWQgY29tcG9uZW50c1wiLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmdW5jLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgZm9yIGZ1bmMuXG4gKiBAcmV0dXJucyB7YXJyYXl9IG9mIGNoaWxkcmVuIHRoYXQgbWVldCB0aGUgZnVuYyByZXR1cm4gc3RhdGVtZW50XG4gKi9cbmZ1bmN0aW9uIGZpbHRlcihjaGlsZHJlbiwgZnVuYywgY29udGV4dCkge1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgX3JlYWN0MlsnZGVmYXVsdCddLkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIGlmICghX3JlYWN0MlsnZGVmYXVsdCddLmlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGluZGV4KyspKSB7XG4gICAgICByZXN1bHQucHVzaChjaGlsZCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmaW5kKGNoaWxkcmVuLCBmdW5jLCBjb250ZXh0KSB7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciByZXN1bHQgPSB1bmRlZmluZWQ7XG5cbiAgX3JlYWN0MlsnZGVmYXVsdCddLkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFfcmVhY3QyWydkZWZhdWx0J10uaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZ1bmMuY2FsbChjb250ZXh0LCBjaGlsZCwgaW5kZXgrKykpIHtcbiAgICAgIHJlc3VsdCA9IGNoaWxkO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZXZlcnkoY2hpbGRyZW4sIGZ1bmMsIGNvbnRleHQpIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIHJlc3VsdCA9IHRydWU7XG5cbiAgX3JlYWN0MlsnZGVmYXVsdCddLkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghX3JlYWN0MlsnZGVmYXVsdCddLmlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBpbmRleCsrKSkge1xuICAgICAgcmVzdWx0ID0gZmFsc2U7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBzb21lKGNoaWxkcmVuLCBmdW5jLCBjb250ZXh0KSB7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciByZXN1bHQgPSBmYWxzZTtcblxuICBfcmVhY3QyWydkZWZhdWx0J10uQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIV9yZWFjdDJbJ2RlZmF1bHQnXS5pc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBpbmRleCsrKSkge1xuICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHRvQXJyYXkoY2hpbGRyZW4pIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gIF9yZWFjdDJbJ2RlZmF1bHQnXS5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICBpZiAoIV9yZWFjdDJbJ2RlZmF1bHQnXS5pc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXN1bHQucHVzaChjaGlsZCk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHtcbiAgbWFwOiBtYXAsXG4gIGZvckVhY2g6IGZvckVhY2gsXG4gIGNvdW50OiBjb3VudCxcbiAgZmluZDogZmluZCxcbiAgZmlsdGVyOiBmaWx0ZXIsXG4gIGV2ZXJ5OiBldmVyeSxcbiAgc29tZTogc29tZSxcbiAgdG9BcnJheTogdG9BcnJheVxufTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuX2N1cnJ5ID0gZXhwb3J0cy5ic1NpemVzID0gZXhwb3J0cy5ic1N0eWxlcyA9IGV4cG9ydHMuYnNDbGFzcyA9IHVuZGVmaW5lZDtcblxudmFyIF9lbnRyaWVzID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9lbnRyaWVzJyk7XG5cbnZhciBfZW50cmllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbnRyaWVzKTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbmV4cG9ydHMucHJlZml4ID0gcHJlZml4O1xuZXhwb3J0cy5nZXRDbGFzc1NldCA9IGdldENsYXNzU2V0O1xuZXhwb3J0cy5zcGxpdEJzUHJvcHMgPSBzcGxpdEJzUHJvcHM7XG5leHBvcnRzLnNwbGl0QnNQcm9wc0FuZE9taXQgPSBzcGxpdEJzUHJvcHNBbmRPbWl0O1xuZXhwb3J0cy5hZGRTdHlsZSA9IGFkZFN0eWxlO1xuXG52YXIgX2ludmFyaWFudCA9IHJlcXVpcmUoJ2ludmFyaWFudCcpO1xuXG52YXIgX2ludmFyaWFudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnZhcmlhbnQpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9TdHlsZUNvbmZpZyA9IHJlcXVpcmUoJy4vU3R5bGVDb25maWcnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBjdXJyeShmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHZhciBsYXN0ID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuICAgIGlmICh0eXBlb2YgbGFzdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkodW5kZWZpbmVkLCBhcmdzLmNvbmNhdChbQ29tcG9uZW50XSkpO1xuICAgIH07XG4gIH07XG59IC8vIFRPRE86IFRoZSBwdWJsaWNseSBleHBvc2VkIHBhcnRzIG9mIHRoaXMgc2hvdWxkIGJlIGluIGxpYi9Cb290c3RyYXBVdGlscy5cblxuZnVuY3Rpb24gcHJlZml4KHByb3BzLCB2YXJpYW50KSB7XG4gICEocHJvcHMuYnNDbGFzcyAhPSBudWxsKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyAoMCwgX2ludmFyaWFudDJbJ2RlZmF1bHQnXSkoZmFsc2UsICdBIGBic0NsYXNzYCBwcm9wIGlzIHJlcXVpcmVkIGZvciB0aGlzIGNvbXBvbmVudCcpIDogKDAsIF9pbnZhcmlhbnQyWydkZWZhdWx0J10pKGZhbHNlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIHByb3BzLmJzQ2xhc3MgKyAodmFyaWFudCA/ICctJyArIHZhcmlhbnQgOiAnJyk7XG59XG5cbnZhciBic0NsYXNzID0gZXhwb3J0cy5ic0NsYXNzID0gY3VycnkoZnVuY3Rpb24gKGRlZmF1bHRDbGFzcywgQ29tcG9uZW50KSB7XG4gIHZhciBwcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzIHx8IChDb21wb25lbnQucHJvcFR5cGVzID0ge30pO1xuICB2YXIgZGVmYXVsdFByb3BzID0gQ29tcG9uZW50LmRlZmF1bHRQcm9wcyB8fCAoQ29tcG9uZW50LmRlZmF1bHRQcm9wcyA9IHt9KTtcblxuICBwcm9wVHlwZXMuYnNDbGFzcyA9IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nO1xuICBkZWZhdWx0UHJvcHMuYnNDbGFzcyA9IGRlZmF1bHRDbGFzcztcblxuICByZXR1cm4gQ29tcG9uZW50O1xufSk7XG5cbnZhciBic1N0eWxlcyA9IGV4cG9ydHMuYnNTdHlsZXMgPSBjdXJyeShmdW5jdGlvbiAoc3R5bGVzLCBkZWZhdWx0U3R5bGUsIENvbXBvbmVudCkge1xuICBpZiAodHlwZW9mIGRlZmF1bHRTdHlsZSAhPT0gJ3N0cmluZycpIHtcbiAgICBDb21wb25lbnQgPSBkZWZhdWx0U3R5bGU7XG4gICAgZGVmYXVsdFN0eWxlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgdmFyIGV4aXN0aW5nID0gQ29tcG9uZW50LlNUWUxFUyB8fCBbXTtcbiAgdmFyIHByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXMgfHwge307XG5cbiAgc3R5bGVzLmZvckVhY2goZnVuY3Rpb24gKHN0eWxlKSB7XG4gICAgaWYgKGV4aXN0aW5nLmluZGV4T2Yoc3R5bGUpID09PSAtMSkge1xuICAgICAgZXhpc3RpbmcucHVzaChzdHlsZSk7XG4gICAgfVxuICB9KTtcblxuICB2YXIgcHJvcFR5cGUgPSBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mKGV4aXN0aW5nKTtcblxuICAvLyBleHBvc2UgdGhlIHZhbHVlcyBvbiB0aGUgcHJvcFR5cGUgZnVuY3Rpb24gZm9yIGRvY3VtZW50YXRpb25cbiAgQ29tcG9uZW50LlNUWUxFUyA9IHByb3BUeXBlLl92YWx1ZXMgPSBleGlzdGluZztcblxuICBDb21wb25lbnQucHJvcFR5cGVzID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgcHJvcFR5cGVzLCB7XG4gICAgYnNTdHlsZTogcHJvcFR5cGVcbiAgfSk7XG5cbiAgaWYgKGRlZmF1bHRTdHlsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdmFyIGRlZmF1bHRQcm9wcyA9IENvbXBvbmVudC5kZWZhdWx0UHJvcHMgfHwgKENvbXBvbmVudC5kZWZhdWx0UHJvcHMgPSB7fSk7XG4gICAgZGVmYXVsdFByb3BzLmJzU3R5bGUgPSBkZWZhdWx0U3R5bGU7XG4gIH1cblxuICByZXR1cm4gQ29tcG9uZW50O1xufSk7XG5cbnZhciBic1NpemVzID0gZXhwb3J0cy5ic1NpemVzID0gY3VycnkoZnVuY3Rpb24gKHNpemVzLCBkZWZhdWx0U2l6ZSwgQ29tcG9uZW50KSB7XG4gIGlmICh0eXBlb2YgZGVmYXVsdFNpemUgIT09ICdzdHJpbmcnKSB7XG4gICAgQ29tcG9uZW50ID0gZGVmYXVsdFNpemU7XG4gICAgZGVmYXVsdFNpemUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICB2YXIgZXhpc3RpbmcgPSBDb21wb25lbnQuU0laRVMgfHwgW107XG4gIHZhciBwcm9wVHlwZXMgPSBDb21wb25lbnQucHJvcFR5cGVzIHx8IHt9O1xuXG4gIHNpemVzLmZvckVhY2goZnVuY3Rpb24gKHNpemUpIHtcbiAgICBpZiAoZXhpc3RpbmcuaW5kZXhPZihzaXplKSA9PT0gLTEpIHtcbiAgICAgIGV4aXN0aW5nLnB1c2goc2l6ZSk7XG4gICAgfVxuICB9KTtcblxuICB2YXIgdmFsdWVzID0gW107XG4gIGV4aXN0aW5nLmZvckVhY2goZnVuY3Rpb24gKHNpemUpIHtcbiAgICB2YXIgbWFwcGVkU2l6ZSA9IF9TdHlsZUNvbmZpZy5TSVpFX01BUFtzaXplXTtcbiAgICBpZiAobWFwcGVkU2l6ZSAmJiBtYXBwZWRTaXplICE9PSBzaXplKSB7XG4gICAgICB2YWx1ZXMucHVzaChtYXBwZWRTaXplKTtcbiAgICB9XG5cbiAgICB2YWx1ZXMucHVzaChzaXplKTtcbiAgfSk7XG5cbiAgdmFyIHByb3BUeXBlID0gX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZih2YWx1ZXMpO1xuICBwcm9wVHlwZS5fdmFsdWVzID0gdmFsdWVzO1xuXG4gIC8vIGV4cG9zZSB0aGUgdmFsdWVzIG9uIHRoZSBwcm9wVHlwZSBmdW5jdGlvbiBmb3IgZG9jdW1lbnRhdGlvblxuICBDb21wb25lbnQuU0laRVMgPSBleGlzdGluZztcblxuICBDb21wb25lbnQucHJvcFR5cGVzID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgcHJvcFR5cGVzLCB7XG4gICAgYnNTaXplOiBwcm9wVHlwZVxuICB9KTtcblxuICBpZiAoZGVmYXVsdFNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICghQ29tcG9uZW50LmRlZmF1bHRQcm9wcykge1xuICAgICAgQ29tcG9uZW50LmRlZmF1bHRQcm9wcyA9IHt9O1xuICAgIH1cbiAgICBDb21wb25lbnQuZGVmYXVsdFByb3BzLmJzU2l6ZSA9IGRlZmF1bHRTaXplO1xuICB9XG5cbiAgcmV0dXJuIENvbXBvbmVudDtcbn0pO1xuXG5mdW5jdGlvbiBnZXRDbGFzc1NldChwcm9wcykge1xuICB2YXIgX2NsYXNzZXM7XG5cbiAgdmFyIGNsYXNzZXMgPSAoX2NsYXNzZXMgPSB7fSwgX2NsYXNzZXNbcHJlZml4KHByb3BzKV0gPSB0cnVlLCBfY2xhc3Nlcyk7XG5cbiAgaWYgKHByb3BzLmJzU2l6ZSkge1xuICAgIHZhciBic1NpemUgPSBfU3R5bGVDb25maWcuU0laRV9NQVBbcHJvcHMuYnNTaXplXSB8fCBwcm9wcy5ic1NpemU7XG4gICAgY2xhc3Nlc1twcmVmaXgocHJvcHMsIGJzU2l6ZSldID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChwcm9wcy5ic1N0eWxlKSB7XG4gICAgY2xhc3Nlc1twcmVmaXgocHJvcHMsIHByb3BzLmJzU3R5bGUpXSA9IHRydWU7XG4gIH1cblxuICByZXR1cm4gY2xhc3Nlcztcbn1cblxuZnVuY3Rpb24gZ2V0QnNQcm9wcyhwcm9wcykge1xuICByZXR1cm4ge1xuICAgIGJzQ2xhc3M6IHByb3BzLmJzQ2xhc3MsXG4gICAgYnNTaXplOiBwcm9wcy5ic1NpemUsXG4gICAgYnNTdHlsZTogcHJvcHMuYnNTdHlsZSxcbiAgICBic1JvbGU6IHByb3BzLmJzUm9sZVxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0JzUHJvcChwcm9wTmFtZSkge1xuICByZXR1cm4gcHJvcE5hbWUgPT09ICdic0NsYXNzJyB8fCBwcm9wTmFtZSA9PT0gJ2JzU2l6ZScgfHwgcHJvcE5hbWUgPT09ICdic1N0eWxlJyB8fCBwcm9wTmFtZSA9PT0gJ2JzUm9sZSc7XG59XG5cbmZ1bmN0aW9uIHNwbGl0QnNQcm9wcyhwcm9wcykge1xuICB2YXIgZWxlbWVudFByb3BzID0ge307XG4gICgwLCBfZW50cmllczJbJ2RlZmF1bHQnXSkocHJvcHMpLmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgcHJvcE5hbWUgPSBfcmVmWzBdLFxuICAgICAgICBwcm9wVmFsdWUgPSBfcmVmWzFdO1xuXG4gICAgaWYgKCFpc0JzUHJvcChwcm9wTmFtZSkpIHtcbiAgICAgIGVsZW1lbnRQcm9wc1twcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gW2dldEJzUHJvcHMocHJvcHMpLCBlbGVtZW50UHJvcHNdO1xufVxuXG5mdW5jdGlvbiBzcGxpdEJzUHJvcHNBbmRPbWl0KHByb3BzLCBvbWl0dGVkUHJvcE5hbWVzKSB7XG4gIHZhciBpc09taXR0ZWRQcm9wID0ge307XG4gIG9taXR0ZWRQcm9wTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAocHJvcE5hbWUpIHtcbiAgICBpc09taXR0ZWRQcm9wW3Byb3BOYW1lXSA9IHRydWU7XG4gIH0pO1xuXG4gIHZhciBlbGVtZW50UHJvcHMgPSB7fTtcbiAgKDAsIF9lbnRyaWVzMlsnZGVmYXVsdCddKShwcm9wcykuZm9yRWFjaChmdW5jdGlvbiAoX3JlZjIpIHtcbiAgICB2YXIgcHJvcE5hbWUgPSBfcmVmMlswXSxcbiAgICAgICAgcHJvcFZhbHVlID0gX3JlZjJbMV07XG5cbiAgICBpZiAoIWlzQnNQcm9wKHByb3BOYW1lKSAmJiAhaXNPbWl0dGVkUHJvcFtwcm9wTmFtZV0pIHtcbiAgICAgIGVsZW1lbnRQcm9wc1twcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gW2dldEJzUHJvcHMocHJvcHMpLCBlbGVtZW50UHJvcHNdO1xufVxuXG4vKipcbiAqIEFkZCBhIHN0eWxlIHZhcmlhbnQgdG8gYSBDb21wb25lbnQuIE11dGF0ZXMgdGhlIHByb3BUeXBlcyBvZiB0aGUgY29tcG9uZW50XG4gKiBpbiBvcmRlciB0byB2YWxpZGF0ZSB0aGUgbmV3IHZhcmlhbnQuXG4gKi9cbmZ1bmN0aW9uIGFkZFN0eWxlKENvbXBvbmVudCkge1xuICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIHN0eWxlVmFyaWFudCA9IEFycmF5KF9sZW4yID4gMSA/IF9sZW4yIC0gMSA6IDApLCBfa2V5MiA9IDE7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICBzdHlsZVZhcmlhbnRbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gIH1cblxuICBic1N0eWxlcyhzdHlsZVZhcmlhbnQsIENvbXBvbmVudCk7XG59XG5cbnZhciBfY3VycnkgPSBleHBvcnRzLl9jdXJyeSA9IGN1cnJ5OyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBjYXBpdGFsaXplO1xuZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpIHtcbiAgcmV0dXJuIFwiXCIgKyBzdHJpbmcuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHJpbmcuc2xpY2UoMSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbi8qKlxuICogU2FmZSBjaGFpbmVkIGZ1bmN0aW9uXG4gKlxuICogV2lsbCBvbmx5IGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBpZiBuZWVkZWQsXG4gKiBvdGhlcndpc2Ugd2lsbCBwYXNzIGJhY2sgZXhpc3RpbmcgZnVuY3Rpb25zIG9yIG51bGwuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gZnVuY3Rpb25zIHRvIGNoYWluXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb258bnVsbH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgZnVuY3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBmdW5jc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jcy5maWx0ZXIoZnVuY3Rpb24gKGYpIHtcbiAgICByZXR1cm4gZiAhPSBudWxsO1xuICB9KS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgZikge1xuICAgIGlmICh0eXBlb2YgZiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEFyZ3VtZW50IFR5cGUsIG11c3Qgb25seSBwcm92aWRlIGZ1bmN0aW9ucywgdW5kZWZpbmVkLCBvciBudWxsLicpO1xuICAgIH1cblxuICAgIGlmIChhY2MgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiBjaGFpbmVkRnVuY3Rpb24oKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIGFjYy5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIGYuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcbiAgfSwgbnVsbCk7XG59XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGNyZWF0ZUNoYWluZWRGdW5jdGlvbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX3R5cGVvZjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvdHlwZW9mJyk7XG5cbnZhciBfdHlwZW9mMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3R5cGVvZjIpO1xuXG5leHBvcnRzLl9yZXNldFdhcm5lZCA9IF9yZXNldFdhcm5lZDtcblxudmFyIF93YXJuaW5nID0gcmVxdWlyZSgnd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHdhcm5lZCA9IHt9O1xuXG5mdW5jdGlvbiBkZXByZWNhdGlvbldhcm5pbmcob2xkbmFtZSwgbmV3bmFtZSwgbGluaykge1xuICB2YXIgbWVzc2FnZSA9IHZvaWQgMDtcblxuICBpZiAoKHR5cGVvZiBvbGRuYW1lID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogKDAsIF90eXBlb2YzWydkZWZhdWx0J10pKG9sZG5hbWUpKSA9PT0gJ29iamVjdCcpIHtcbiAgICBtZXNzYWdlID0gb2xkbmFtZS5tZXNzYWdlO1xuICB9IGVsc2Uge1xuICAgIG1lc3NhZ2UgPSBvbGRuYW1lICsgJyBpcyBkZXByZWNhdGVkLiBVc2UgJyArIG5ld25hbWUgKyAnIGluc3RlYWQuJztcblxuICAgIGlmIChsaW5rKSB7XG4gICAgICBtZXNzYWdlICs9ICdcXG5Zb3UgY2FuIHJlYWQgbW9yZSBhYm91dCBpdCBhdCAnICsgbGluaztcbiAgICB9XG4gIH1cblxuICBpZiAod2FybmVkW21lc3NhZ2VdKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/ICgwLCBfd2FybmluZzJbJ2RlZmF1bHQnXSkoZmFsc2UsIG1lc3NhZ2UpIDogdm9pZCAwO1xuICB3YXJuZWRbbWVzc2FnZV0gPSB0cnVlO1xufVxuXG5kZXByZWNhdGlvbldhcm5pbmcud3JhcHBlciA9IGZ1bmN0aW9uIChDb21wb25lbnQpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShEZXByZWNhdGVkQ29tcG9uZW50LCBfQ29tcG9uZW50KTtcblxuICAgIGZ1bmN0aW9uIERlcHJlY2F0ZWRDb21wb25lbnQoKSB7XG4gICAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBEZXByZWNhdGVkQ29tcG9uZW50KTtcbiAgICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9Db21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgfVxuXG4gICAgRGVwcmVjYXRlZENvbXBvbmVudC5wcm90b3R5cGUuY29tcG9uZW50V2lsbE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgICAgZGVwcmVjYXRpb25XYXJuaW5nLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG5cbiAgICAgIGlmIChfQ29tcG9uZW50LnByb3RvdHlwZS5jb21wb25lbnRXaWxsTW91bnQpIHtcbiAgICAgICAgdmFyIF9Db21wb25lbnQkcHJvdG90eXBlJDtcblxuICAgICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIG1ldGhvZEFyZ3MgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICAgIG1ldGhvZEFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgICAgfVxuXG4gICAgICAgIChfQ29tcG9uZW50JHByb3RvdHlwZSQgPSBfQ29tcG9uZW50LnByb3RvdHlwZS5jb21wb25lbnRXaWxsTW91bnQpLmNhbGwuYXBwbHkoX0NvbXBvbmVudCRwcm90b3R5cGUkLCBbdGhpc10uY29uY2F0KG1ldGhvZEFyZ3MpKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIERlcHJlY2F0ZWRDb21wb25lbnQ7XG4gIH0oQ29tcG9uZW50KTtcbn07XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGRlcHJlY2F0aW9uV2FybmluZztcbmZ1bmN0aW9uIF9yZXNldFdhcm5lZCgpIHtcbiAgd2FybmVkID0ge307XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5WYWxpZENvbXBvbmVudENoaWxkcmVuID0gZXhwb3J0cy5jcmVhdGVDaGFpbmVkRnVuY3Rpb24gPSBleHBvcnRzLmJvb3RzdHJhcFV0aWxzID0gdW5kZWZpbmVkO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzMiA9IHJlcXVpcmUoJy4vYm9vdHN0cmFwVXRpbHMnKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF9ib290c3RyYXBVdGlsczIpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjIgPSByZXF1aXJlKCcuL2NyZWF0ZUNoYWluZWRGdW5jdGlvbicpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yKTtcblxudmFyIF9WYWxpZENvbXBvbmVudENoaWxkcmVuMiA9IHJlcXVpcmUoJy4vVmFsaWRDb21wb25lbnRDaGlsZHJlbicpO1xuXG52YXIgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVmFsaWRDb21wb25lbnRDaGlsZHJlbjIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gZWxzZSB7IHZhciBuZXdPYmogPSB7fTsgaWYgKG9iaiAhPSBudWxsKSB7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSBuZXdPYmpbJ2RlZmF1bHQnXSA9IG9iajsgcmV0dXJuIG5ld09iajsgfSB9XG5cbmV4cG9ydHMuYm9vdHN0cmFwVXRpbHMgPSBfYm9vdHN0cmFwVXRpbHM7XG5leHBvcnRzLmNyZWF0ZUNoYWluZWRGdW5jdGlvbiA9IF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24zWydkZWZhdWx0J107XG5leHBvcnRzLlZhbGlkQ29tcG9uZW50Q2hpbGRyZW4gPSBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjNbJ2RlZmF1bHQnXTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9lbnRyaWVzID0gcmVxdWlyZShcImJhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZW50cmllc1wiKTtcblxudmFyIF9lbnRyaWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VudHJpZXMpO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHNwbGl0Q29tcG9uZW50UHJvcHM7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IFwiZGVmYXVsdFwiOiBvYmogfTsgfVxuXG5mdW5jdGlvbiBzcGxpdENvbXBvbmVudFByb3BzKHByb3BzLCBDb21wb25lbnQpIHtcbiAgdmFyIGNvbXBvbmVudFByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXM7XG5cbiAgdmFyIHBhcmVudFByb3BzID0ge307XG4gIHZhciBjaGlsZFByb3BzID0ge307XG5cbiAgKDAsIF9lbnRyaWVzMltcImRlZmF1bHRcIl0pKHByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIHByb3BOYW1lID0gX3JlZlswXSxcbiAgICAgICAgcHJvcFZhbHVlID0gX3JlZlsxXTtcblxuICAgIGlmIChjb21wb25lbnRQcm9wVHlwZXNbcHJvcE5hbWVdKSB7XG4gICAgICBwYXJlbnRQcm9wc1twcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoaWxkUHJvcHNbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIFtwYXJlbnRQcm9wcywgY2hpbGRQcm9wc107XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdOyIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9SZWFjdERPTScpO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEFSSUFET01Qcm9wZXJ0eUNvbmZpZyA9IHtcbiAgUHJvcGVydGllczoge1xuICAgIC8vIEdsb2JhbCBTdGF0ZXMgYW5kIFByb3BlcnRpZXNcbiAgICAnYXJpYS1jdXJyZW50JzogMCwgLy8gc3RhdGVcbiAgICAnYXJpYS1kZXRhaWxzJzogMCxcbiAgICAnYXJpYS1kaXNhYmxlZCc6IDAsIC8vIHN0YXRlXG4gICAgJ2FyaWEtaGlkZGVuJzogMCwgLy8gc3RhdGVcbiAgICAnYXJpYS1pbnZhbGlkJzogMCwgLy8gc3RhdGVcbiAgICAnYXJpYS1rZXlzaG9ydGN1dHMnOiAwLFxuICAgICdhcmlhLWxhYmVsJzogMCxcbiAgICAnYXJpYS1yb2xlZGVzY3JpcHRpb24nOiAwLFxuICAgIC8vIFdpZGdldCBBdHRyaWJ1dGVzXG4gICAgJ2FyaWEtYXV0b2NvbXBsZXRlJzogMCxcbiAgICAnYXJpYS1jaGVja2VkJzogMCxcbiAgICAnYXJpYS1leHBhbmRlZCc6IDAsXG4gICAgJ2FyaWEtaGFzcG9wdXAnOiAwLFxuICAgICdhcmlhLWxldmVsJzogMCxcbiAgICAnYXJpYS1tb2RhbCc6IDAsXG4gICAgJ2FyaWEtbXVsdGlsaW5lJzogMCxcbiAgICAnYXJpYS1tdWx0aXNlbGVjdGFibGUnOiAwLFxuICAgICdhcmlhLW9yaWVudGF0aW9uJzogMCxcbiAgICAnYXJpYS1wbGFjZWhvbGRlcic6IDAsXG4gICAgJ2FyaWEtcHJlc3NlZCc6IDAsXG4gICAgJ2FyaWEtcmVhZG9ubHknOiAwLFxuICAgICdhcmlhLXJlcXVpcmVkJzogMCxcbiAgICAnYXJpYS1zZWxlY3RlZCc6IDAsXG4gICAgJ2FyaWEtc29ydCc6IDAsXG4gICAgJ2FyaWEtdmFsdWVtYXgnOiAwLFxuICAgICdhcmlhLXZhbHVlbWluJzogMCxcbiAgICAnYXJpYS12YWx1ZW5vdyc6IDAsXG4gICAgJ2FyaWEtdmFsdWV0ZXh0JzogMCxcbiAgICAvLyBMaXZlIFJlZ2lvbiBBdHRyaWJ1dGVzXG4gICAgJ2FyaWEtYXRvbWljJzogMCxcbiAgICAnYXJpYS1idXN5JzogMCxcbiAgICAnYXJpYS1saXZlJzogMCxcbiAgICAnYXJpYS1yZWxldmFudCc6IDAsXG4gICAgLy8gRHJhZy1hbmQtRHJvcCBBdHRyaWJ1dGVzXG4gICAgJ2FyaWEtZHJvcGVmZmVjdCc6IDAsXG4gICAgJ2FyaWEtZ3JhYmJlZCc6IDAsXG4gICAgLy8gUmVsYXRpb25zaGlwIEF0dHJpYnV0ZXNcbiAgICAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JzogMCxcbiAgICAnYXJpYS1jb2xjb3VudCc6IDAsXG4gICAgJ2FyaWEtY29saW5kZXgnOiAwLFxuICAgICdhcmlhLWNvbHNwYW4nOiAwLFxuICAgICdhcmlhLWNvbnRyb2xzJzogMCxcbiAgICAnYXJpYS1kZXNjcmliZWRieSc6IDAsXG4gICAgJ2FyaWEtZXJyb3JtZXNzYWdlJzogMCxcbiAgICAnYXJpYS1mbG93dG8nOiAwLFxuICAgICdhcmlhLWxhYmVsbGVkYnknOiAwLFxuICAgICdhcmlhLW93bnMnOiAwLFxuICAgICdhcmlhLXBvc2luc2V0JzogMCxcbiAgICAnYXJpYS1yb3djb3VudCc6IDAsXG4gICAgJ2FyaWEtcm93aW5kZXgnOiAwLFxuICAgICdhcmlhLXJvd3NwYW4nOiAwLFxuICAgICdhcmlhLXNldHNpemUnOiAwXG4gIH0sXG4gIERPTUF0dHJpYnV0ZU5hbWVzOiB7fSxcbiAgRE9NUHJvcGVydHlOYW1lczoge31cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQVJJQURPTVByb3BlcnR5Q29uZmlnOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xuXG52YXIgZm9jdXNOb2RlID0gcmVxdWlyZSgnZmJqcy9saWIvZm9jdXNOb2RlJyk7XG5cbnZhciBBdXRvRm9jdXNVdGlscyA9IHtcbiAgZm9jdXNET01Db21wb25lbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICBmb2N1c05vZGUoUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcykpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEF1dG9Gb2N1c1V0aWxzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV2ZW50UHJvcGFnYXRvcnMgPSByZXF1aXJlKCcuL0V2ZW50UHJvcGFnYXRvcnMnKTtcbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG52YXIgRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlID0gcmVxdWlyZSgnLi9GYWxsYmFja0NvbXBvc2l0aW9uU3RhdGUnKTtcbnZhciBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50Jyk7XG52YXIgU3ludGhldGljSW5wdXRFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljSW5wdXRFdmVudCcpO1xuXG52YXIgRU5EX0tFWUNPREVTID0gWzksIDEzLCAyNywgMzJdOyAvLyBUYWIsIFJldHVybiwgRXNjLCBTcGFjZVxudmFyIFNUQVJUX0tFWUNPREUgPSAyMjk7XG5cbnZhciBjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmICdDb21wb3NpdGlvbkV2ZW50JyBpbiB3aW5kb3c7XG5cbnZhciBkb2N1bWVudE1vZGUgPSBudWxsO1xuaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSAmJiAnZG9jdW1lbnRNb2RlJyBpbiBkb2N1bWVudCkge1xuICBkb2N1bWVudE1vZGUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGU7XG59XG5cbi8vIFdlYmtpdCBvZmZlcnMgYSB2ZXJ5IHVzZWZ1bCBgdGV4dElucHV0YCBldmVudCB0aGF0IGNhbiBiZSB1c2VkIHRvXG4vLyBkaXJlY3RseSByZXByZXNlbnQgYGJlZm9yZUlucHV0YC4gVGhlIElFIGB0ZXh0aW5wdXRgIGV2ZW50IGlzIG5vdCBhc1xuLy8gdXNlZnVsLCBzbyB3ZSBkb24ndCB1c2UgaXQuXG52YXIgY2FuVXNlVGV4dElucHV0RXZlbnQgPSBFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgJ1RleHRFdmVudCcgaW4gd2luZG93ICYmICFkb2N1bWVudE1vZGUgJiYgIWlzUHJlc3RvKCk7XG5cbi8vIEluIElFOSssIHdlIGhhdmUgYWNjZXNzIHRvIGNvbXBvc2l0aW9uIGV2ZW50cywgYnV0IHRoZSBkYXRhIHN1cHBsaWVkXG4vLyBieSB0aGUgbmF0aXZlIGNvbXBvc2l0aW9uZW5kIGV2ZW50IG1heSBiZSBpbmNvcnJlY3QuIEphcGFuZXNlIGlkZW9ncmFwaGljXG4vLyBzcGFjZXMsIGZvciBpbnN0YW5jZSAoXFx1MzAwMCkgYXJlIG5vdCByZWNvcmRlZCBjb3JyZWN0bHkuXG52YXIgdXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEgPSBFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgKCFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50IHx8IGRvY3VtZW50TW9kZSAmJiBkb2N1bWVudE1vZGUgPiA4ICYmIGRvY3VtZW50TW9kZSA8PSAxMSk7XG5cbi8qKlxuICogT3BlcmEgPD0gMTIgaW5jbHVkZXMgVGV4dEV2ZW50IGluIHdpbmRvdywgYnV0IGRvZXMgbm90IGZpcmVcbiAqIHRleHQgaW5wdXQgZXZlbnRzLiBSZWx5IG9uIGtleXByZXNzIGluc3RlYWQuXG4gKi9cbmZ1bmN0aW9uIGlzUHJlc3RvKCkge1xuICB2YXIgb3BlcmEgPSB3aW5kb3cub3BlcmE7XG4gIHJldHVybiB0eXBlb2Ygb3BlcmEgPT09ICdvYmplY3QnICYmIHR5cGVvZiBvcGVyYS52ZXJzaW9uID09PSAnZnVuY3Rpb24nICYmIHBhcnNlSW50KG9wZXJhLnZlcnNpb24oKSwgMTApIDw9IDEyO1xufVxuXG52YXIgU1BBQ0VCQVJfQ09ERSA9IDMyO1xudmFyIFNQQUNFQkFSX0NIQVIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFNQQUNFQkFSX0NPREUpO1xuXG4vLyBFdmVudHMgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgbmFtZXMuXG52YXIgZXZlbnRUeXBlcyA9IHtcbiAgYmVmb3JlSW5wdXQ6IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogJ29uQmVmb3JlSW5wdXQnLFxuICAgICAgY2FwdHVyZWQ6ICdvbkJlZm9yZUlucHV0Q2FwdHVyZSdcbiAgICB9LFxuICAgIGRlcGVuZGVuY2llczogWyd0b3BDb21wb3NpdGlvbkVuZCcsICd0b3BLZXlQcmVzcycsICd0b3BUZXh0SW5wdXQnLCAndG9wUGFzdGUnXVxuICB9LFxuICBjb21wb3NpdGlvbkVuZDoge1xuICAgIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOiB7XG4gICAgICBidWJibGVkOiAnb25Db21wb3NpdGlvbkVuZCcsXG4gICAgICBjYXB0dXJlZDogJ29uQ29tcG9zaXRpb25FbmRDYXB0dXJlJ1xuICAgIH0sXG4gICAgZGVwZW5kZW5jaWVzOiBbJ3RvcEJsdXInLCAndG9wQ29tcG9zaXRpb25FbmQnLCAndG9wS2V5RG93bicsICd0b3BLZXlQcmVzcycsICd0b3BLZXlVcCcsICd0b3BNb3VzZURvd24nXVxuICB9LFxuICBjb21wb3NpdGlvblN0YXJ0OiB7XG4gICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAgICAgIGJ1YmJsZWQ6ICdvbkNvbXBvc2l0aW9uU3RhcnQnLFxuICAgICAgY2FwdHVyZWQ6ICdvbkNvbXBvc2l0aW9uU3RhcnRDYXB0dXJlJ1xuICAgIH0sXG4gICAgZGVwZW5kZW5jaWVzOiBbJ3RvcEJsdXInLCAndG9wQ29tcG9zaXRpb25TdGFydCcsICd0b3BLZXlEb3duJywgJ3RvcEtleVByZXNzJywgJ3RvcEtleVVwJywgJ3RvcE1vdXNlRG93biddXG4gIH0sXG4gIGNvbXBvc2l0aW9uVXBkYXRlOiB7XG4gICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAgICAgIGJ1YmJsZWQ6ICdvbkNvbXBvc2l0aW9uVXBkYXRlJyxcbiAgICAgIGNhcHR1cmVkOiAnb25Db21wb3NpdGlvblVwZGF0ZUNhcHR1cmUnXG4gICAgfSxcbiAgICBkZXBlbmRlbmNpZXM6IFsndG9wQmx1cicsICd0b3BDb21wb3NpdGlvblVwZGF0ZScsICd0b3BLZXlEb3duJywgJ3RvcEtleVByZXNzJywgJ3RvcEtleVVwJywgJ3RvcE1vdXNlRG93biddXG4gIH1cbn07XG5cbi8vIFRyYWNrIHdoZXRoZXIgd2UndmUgZXZlciBoYW5kbGVkIGEga2V5cHJlc3Mgb24gdGhlIHNwYWNlIGtleS5cbnZhciBoYXNTcGFjZUtleXByZXNzID0gZmFsc2U7XG5cbi8qKlxuICogUmV0dXJuIHdoZXRoZXIgYSBuYXRpdmUga2V5cHJlc3MgZXZlbnQgaXMgYXNzdW1lZCB0byBiZSBhIGNvbW1hbmQuXG4gKiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgRmlyZWZveCBmaXJlcyBga2V5cHJlc3NgIGV2ZW50cyBmb3Iga2V5IGNvbW1hbmRzXG4gKiAoY3V0LCBjb3B5LCBzZWxlY3QtYWxsLCBldGMuKSBldmVuIHRob3VnaCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQuXG4gKi9cbmZ1bmN0aW9uIGlzS2V5cHJlc3NDb21tYW5kKG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiAobmF0aXZlRXZlbnQuY3RybEtleSB8fCBuYXRpdmVFdmVudC5hbHRLZXkgfHwgbmF0aXZlRXZlbnQubWV0YUtleSkgJiZcbiAgLy8gY3RybEtleSAmJiBhbHRLZXkgaXMgZXF1aXZhbGVudCB0byBBbHRHciwgYW5kIGlzIG5vdCBhIGNvbW1hbmQuXG4gICEobmF0aXZlRXZlbnQuY3RybEtleSAmJiBuYXRpdmVFdmVudC5hbHRLZXkpO1xufVxuXG4vKipcbiAqIFRyYW5zbGF0ZSBuYXRpdmUgdG9wIGxldmVsIGV2ZW50cyBpbnRvIGV2ZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BMZXZlbFR5cGVcbiAqIEByZXR1cm4ge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gZ2V0Q29tcG9zaXRpb25FdmVudFR5cGUodG9wTGV2ZWxUeXBlKSB7XG4gIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7XG4gICAgY2FzZSAndG9wQ29tcG9zaXRpb25TdGFydCc6XG4gICAgICByZXR1cm4gZXZlbnRUeXBlcy5jb21wb3NpdGlvblN0YXJ0O1xuICAgIGNhc2UgJ3RvcENvbXBvc2l0aW9uRW5kJzpcbiAgICAgIHJldHVybiBldmVudFR5cGVzLmNvbXBvc2l0aW9uRW5kO1xuICAgIGNhc2UgJ3RvcENvbXBvc2l0aW9uVXBkYXRlJzpcbiAgICAgIHJldHVybiBldmVudFR5cGVzLmNvbXBvc2l0aW9uVXBkYXRlO1xuICB9XG59XG5cbi8qKlxuICogRG9lcyBvdXIgZmFsbGJhY2sgYmVzdC1ndWVzcyBtb2RlbCB0aGluayB0aGlzIGV2ZW50IHNpZ25pZmllcyB0aGF0XG4gKiBjb21wb3NpdGlvbiBoYXMgYmVndW4/XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvcExldmVsVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydCh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSB7XG4gIHJldHVybiB0b3BMZXZlbFR5cGUgPT09ICd0b3BLZXlEb3duJyAmJiBuYXRpdmVFdmVudC5rZXlDb2RlID09PSBTVEFSVF9LRVlDT0RFO1xufVxuXG4vKipcbiAqIERvZXMgb3VyIGZhbGxiYWNrIG1vZGUgdGhpbmsgdGhhdCB0aGlzIGV2ZW50IGlzIHRoZSBlbmQgb2YgY29tcG9zaXRpb24/XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvcExldmVsVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKHRvcExldmVsVHlwZSkge1xuICAgIGNhc2UgJ3RvcEtleVVwJzpcbiAgICAgIC8vIENvbW1hbmQga2V5cyBpbnNlcnQgb3IgY2xlYXIgSU1FIGlucHV0LlxuICAgICAgcmV0dXJuIEVORF9LRVlDT0RFUy5pbmRleE9mKG5hdGl2ZUV2ZW50LmtleUNvZGUpICE9PSAtMTtcbiAgICBjYXNlICd0b3BLZXlEb3duJzpcbiAgICAgIC8vIEV4cGVjdCBJTUUga2V5Q29kZSBvbiBlYWNoIGtleWRvd24uIElmIHdlIGdldCBhbnkgb3RoZXJcbiAgICAgIC8vIGNvZGUgd2UgbXVzdCBoYXZlIGV4aXRlZCBlYXJsaWVyLlxuICAgICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmtleUNvZGUgIT09IFNUQVJUX0tFWUNPREU7XG4gICAgY2FzZSAndG9wS2V5UHJlc3MnOlxuICAgIGNhc2UgJ3RvcE1vdXNlRG93bic6XG4gICAgY2FzZSAndG9wQmx1cic6XG4gICAgICAvLyBFdmVudHMgYXJlIG5vdCBwb3NzaWJsZSB3aXRob3V0IGNhbmNlbGxpbmcgSU1FLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEdvb2dsZSBJbnB1dCBUb29scyBwcm92aWRlcyBjb21wb3NpdGlvbiBkYXRhIHZpYSBhIEN1c3RvbUV2ZW50LFxuICogd2l0aCB0aGUgYGRhdGFgIHByb3BlcnR5IHBvcHVsYXRlZCBpbiB0aGUgYGRldGFpbGAgb2JqZWN0LiBJZiB0aGlzXG4gKiBpcyBhdmFpbGFibGUgb24gdGhlIGV2ZW50IG9iamVjdCwgdXNlIGl0LiBJZiBub3QsIHRoaXMgaXMgYSBwbGFpblxuICogY29tcG9zaXRpb24gZXZlbnQgYW5kIHdlIGhhdmUgbm90aGluZyBzcGVjaWFsIHRvIGV4dHJhY3QuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50XG4gKiBAcmV0dXJuIHs/c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBkZXRhaWwgPSBuYXRpdmVFdmVudC5kZXRhaWw7XG4gIGlmICh0eXBlb2YgZGV0YWlsID09PSAnb2JqZWN0JyAmJiAnZGF0YScgaW4gZGV0YWlsKSB7XG4gICAgcmV0dXJuIGRldGFpbC5kYXRhO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBUcmFjayB0aGUgY3VycmVudCBJTUUgY29tcG9zaXRpb24gZmFsbGJhY2sgb2JqZWN0LCBpZiBhbnkuXG52YXIgY3VycmVudENvbXBvc2l0aW9uID0gbnVsbDtcblxuLyoqXG4gKiBAcmV0dXJuIHs/b2JqZWN0fSBBIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RDb21wb3NpdGlvbkV2ZW50KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBldmVudFR5cGU7XG4gIHZhciBmYWxsYmFja0RhdGE7XG5cbiAgaWYgKGNhblVzZUNvbXBvc2l0aW9uRXZlbnQpIHtcbiAgICBldmVudFR5cGUgPSBnZXRDb21wb3NpdGlvbkV2ZW50VHlwZSh0b3BMZXZlbFR5cGUpO1xuICB9IGVsc2UgaWYgKCFjdXJyZW50Q29tcG9zaXRpb24pIHtcbiAgICBpZiAoaXNGYWxsYmFja0NvbXBvc2l0aW9uU3RhcnQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkpIHtcbiAgICAgIGV2ZW50VHlwZSA9IGV2ZW50VHlwZXMuY29tcG9zaXRpb25TdGFydDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNGYWxsYmFja0NvbXBvc2l0aW9uRW5kKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpKSB7XG4gICAgZXZlbnRUeXBlID0gZXZlbnRUeXBlcy5jb21wb3NpdGlvbkVuZDtcbiAgfVxuXG4gIGlmICghZXZlbnRUeXBlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAodXNlRmFsbGJhY2tDb21wb3NpdGlvbkRhdGEpIHtcbiAgICAvLyBUaGUgY3VycmVudCBjb21wb3NpdGlvbiBpcyBzdG9yZWQgc3RhdGljYWxseSBhbmQgbXVzdCBub3QgYmVcbiAgICAvLyBvdmVyd3JpdHRlbiB3aGlsZSBjb21wb3NpdGlvbiBjb250aW51ZXMuXG4gICAgaWYgKCFjdXJyZW50Q29tcG9zaXRpb24gJiYgZXZlbnRUeXBlID09PSBldmVudFR5cGVzLmNvbXBvc2l0aW9uU3RhcnQpIHtcbiAgICAgIGN1cnJlbnRDb21wb3NpdGlvbiA9IEZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZS5nZXRQb29sZWQobmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBldmVudFR5cGVzLmNvbXBvc2l0aW9uRW5kKSB7XG4gICAgICBpZiAoY3VycmVudENvbXBvc2l0aW9uKSB7XG4gICAgICAgIGZhbGxiYWNrRGF0YSA9IGN1cnJlbnRDb21wb3NpdGlvbi5nZXREYXRhKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGV2ZW50ID0gU3ludGhldGljQ29tcG9zaXRpb25FdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGlmIChmYWxsYmFja0RhdGEpIHtcbiAgICAvLyBJbmplY3QgZGF0YSBnZW5lcmF0ZWQgZnJvbSBmYWxsYmFjayBwYXRoIGludG8gdGhlIHN5bnRoZXRpYyBldmVudC5cbiAgICAvLyBUaGlzIG1hdGNoZXMgdGhlIHByb3BlcnR5IG9mIG5hdGl2ZSBDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlLlxuICAgIGV2ZW50LmRhdGEgPSBmYWxsYmFja0RhdGE7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGN1c3RvbURhdGEgPSBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgICBpZiAoY3VzdG9tRGF0YSAhPT0gbnVsbCkge1xuICAgICAgZXZlbnQuZGF0YSA9IGN1c3RvbURhdGE7XG4gICAgfVxuICB9XG5cbiAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50KTtcbiAgcmV0dXJuIGV2ZW50O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BMZXZlbFR5cGUgUmVjb3JkIGZyb20gYEV2ZW50Q29uc3RhbnRzYC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGlzIGBiZWZvcmVJbnB1dGAgZXZlbnQuXG4gKi9cbmZ1bmN0aW9uIGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnModG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkge1xuICBzd2l0Y2ggKHRvcExldmVsVHlwZSkge1xuICAgIGNhc2UgJ3RvcENvbXBvc2l0aW9uRW5kJzpcbiAgICAgIHJldHVybiBnZXREYXRhRnJvbUN1c3RvbUV2ZW50KG5hdGl2ZUV2ZW50KTtcbiAgICBjYXNlICd0b3BLZXlQcmVzcyc6XG4gICAgICAvKipcbiAgICAgICAqIElmIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudHMgYXJlIGF2YWlsYWJsZSwgb3VyIGdvYWwgaXMgdG8gbWFrZVxuICAgICAgICogdXNlIG9mIHRoZW0uIEhvd2V2ZXIsIHRoZXJlIGlzIGEgc3BlY2lhbCBjYXNlOiB0aGUgc3BhY2ViYXIga2V5LlxuICAgICAgICogSW4gV2Via2l0LCBwcmV2ZW50aW5nIGRlZmF1bHQgb24gYSBzcGFjZWJhciBgdGV4dElucHV0YCBldmVudFxuICAgICAgICogY2FuY2VscyBjaGFyYWN0ZXIgaW5zZXJ0aW9uLCBidXQgaXQgKmFsc28qIGNhdXNlcyB0aGUgYnJvd3NlclxuICAgICAgICogdG8gZmFsbCBiYWNrIHRvIGl0cyBkZWZhdWx0IHNwYWNlYmFyIGJlaGF2aW9yIG9mIHNjcm9sbGluZyB0aGVcbiAgICAgICAqIHBhZ2UuXG4gICAgICAgKlxuICAgICAgICogVHJhY2tpbmcgYXQ6XG4gICAgICAgKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MzU1MTAzXG4gICAgICAgKlxuICAgICAgICogVG8gYXZvaWQgdGhpcyBpc3N1ZSwgdXNlIHRoZSBrZXlwcmVzcyBldmVudCBhcyBpZiBubyBgdGV4dElucHV0YFxuICAgICAgICogZXZlbnQgaXMgYXZhaWxhYmxlLlxuICAgICAgICovXG4gICAgICB2YXIgd2hpY2ggPSBuYXRpdmVFdmVudC53aGljaDtcbiAgICAgIGlmICh3aGljaCAhPT0gU1BBQ0VCQVJfQ09ERSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaGFzU3BhY2VLZXlwcmVzcyA9IHRydWU7XG4gICAgICByZXR1cm4gU1BBQ0VCQVJfQ0hBUjtcblxuICAgIGNhc2UgJ3RvcFRleHRJbnB1dCc6XG4gICAgICAvLyBSZWNvcmQgdGhlIGNoYXJhY3RlcnMgdG8gYmUgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgIHZhciBjaGFycyA9IG5hdGl2ZUV2ZW50LmRhdGE7XG5cbiAgICAgIC8vIElmIGl0J3MgYSBzcGFjZWJhciBjaGFyYWN0ZXIsIGFzc3VtZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBoYW5kbGVkXG4gICAgICAvLyBpdCBhdCB0aGUga2V5cHJlc3MgbGV2ZWwgYW5kIGJhaWwgaW1tZWRpYXRlbHkuIEFuZHJvaWQgQ2hyb21lXG4gICAgICAvLyBkb2Vzbid0IGdpdmUgdXMga2V5Y29kZXMsIHNvIHdlIG5lZWQgdG8gYmxhY2tsaXN0IGl0LlxuICAgICAgaWYgKGNoYXJzID09PSBTUEFDRUJBUl9DSEFSICYmIGhhc1NwYWNlS2V5cHJlc3MpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjaGFycztcblxuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBGb3Igb3RoZXIgbmF0aXZlIGV2ZW50IHR5cGVzLCBkbyBub3RoaW5nLlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3IgYnJvd3NlcnMgdGhhdCBkbyBub3QgcHJvdmlkZSB0aGUgYHRleHRJbnB1dGAgZXZlbnQsIGV4dHJhY3QgdGhlXG4gKiBhcHByb3ByaWF0ZSBzdHJpbmcgdG8gdXNlIGZvciBTeW50aGV0aWNJbnB1dEV2ZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BMZXZlbFR5cGUgUmVjb3JkIGZyb20gYEV2ZW50Q29uc3RhbnRzYC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBmYWxsYmFjayBzdHJpbmcgZm9yIHRoaXMgYGJlZm9yZUlucHV0YCBldmVudC5cbiAqL1xuZnVuY3Rpb24gZ2V0RmFsbGJhY2tCZWZvcmVJbnB1dENoYXJzKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpIHtcbiAgLy8gSWYgd2UgYXJlIGN1cnJlbnRseSBjb21wb3NpbmcgKElNRSkgYW5kIHVzaW5nIGEgZmFsbGJhY2sgdG8gZG8gc28sXG4gIC8vIHRyeSB0byBleHRyYWN0IHRoZSBjb21wb3NlZCBjaGFyYWN0ZXJzIGZyb20gdGhlIGZhbGxiYWNrIG9iamVjdC5cbiAgLy8gSWYgY29tcG9zaXRpb24gZXZlbnQgaXMgYXZhaWxhYmxlLCB3ZSBleHRyYWN0IGEgc3RyaW5nIG9ubHkgYXRcbiAgLy8gY29tcG9zaXRpb25ldmVudCwgb3RoZXJ3aXNlIGV4dHJhY3QgaXQgYXQgZmFsbGJhY2sgZXZlbnRzLlxuICBpZiAoY3VycmVudENvbXBvc2l0aW9uKSB7XG4gICAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcENvbXBvc2l0aW9uRW5kJyB8fCAhY2FuVXNlQ29tcG9zaXRpb25FdmVudCAmJiBpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkpIHtcbiAgICAgIHZhciBjaGFycyA9IGN1cnJlbnRDb21wb3NpdGlvbi5nZXREYXRhKCk7XG4gICAgICBGYWxsYmFja0NvbXBvc2l0aW9uU3RhdGUucmVsZWFzZShjdXJyZW50Q29tcG9zaXRpb24pO1xuICAgICAgY3VycmVudENvbXBvc2l0aW9uID0gbnVsbDtcbiAgICAgIHJldHVybiBjaGFycztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzd2l0Y2ggKHRvcExldmVsVHlwZSkge1xuICAgIGNhc2UgJ3RvcFBhc3RlJzpcbiAgICAgIC8vIElmIGEgcGFzdGUgZXZlbnQgb2NjdXJzIGFmdGVyIGEga2V5cHJlc3MsIHRocm93IG91dCB0aGUgaW5wdXRcbiAgICAgIC8vIGNoYXJzLiBQYXN0ZSBldmVudHMgc2hvdWxkIG5vdCBsZWFkIHRvIEJlZm9yZUlucHV0IGV2ZW50cy5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNhc2UgJ3RvcEtleVByZXNzJzpcbiAgICAgIC8qKlxuICAgICAgICogQXMgb2YgdjI3LCBGaXJlZm94IG1heSBmaXJlIGtleXByZXNzIGV2ZW50cyBldmVuIHdoZW4gbm8gY2hhcmFjdGVyXG4gICAgICAgKiB3aWxsIGJlIGluc2VydGVkLiBBIGZldyBwb3NzaWJpbGl0aWVzOlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyBgMGAuIEFycm93IGtleXMsIEVzYyBrZXksIGV0Yy5cbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgdGhlIHByZXNzZWQga2V5IGNvZGUsIGJ1dCBubyBjaGFyIGlzIGF2YWlsYWJsZS5cbiAgICAgICAqICAgRXg6ICdBbHRHciArIGRgIGluIFBvbGlzaC4gVGhlcmUgaXMgbm8gbW9kaWZpZWQgY2hhcmFjdGVyIGZvclxuICAgICAgICogICB0aGlzIGtleSBjb21iaW5hdGlvbiBhbmQgbm8gY2hhcmFjdGVyIGlzIGluc2VydGVkIGludG8gdGhlXG4gICAgICAgKiAgIGRvY3VtZW50LCBidXQgRkYgZmlyZXMgdGhlIGtleXByZXNzIGZvciBjaGFyIGNvZGUgYDEwMGAgYW55d2F5LlxuICAgICAgICogICBObyBgaW5wdXRgIGV2ZW50IHdpbGwgb2NjdXIuXG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIHRoZSBwcmVzc2VkIGtleSBjb2RlLCBidXQgYSBjb21tYW5kIGNvbWJpbmF0aW9uIGlzXG4gICAgICAgKiAgIGJlaW5nIHVzZWQuIEV4OiBgQ21kK0NgLiBObyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQsIGFuZCBub1xuICAgICAgICogICBgaW5wdXRgIGV2ZW50IHdpbGwgb2NjdXIuXG4gICAgICAgKi9cbiAgICAgIGlmIChuYXRpdmVFdmVudC53aGljaCAmJiAhaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKG5hdGl2ZUV2ZW50LndoaWNoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNhc2UgJ3RvcENvbXBvc2l0aW9uRW5kJzpcbiAgICAgIHJldHVybiB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSA/IG51bGwgOiBuYXRpdmVFdmVudC5kYXRhO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3QgYSBTeW50aGV0aWNJbnB1dEV2ZW50IGZvciBgYmVmb3JlSW5wdXRgLCBiYXNlZCBvbiBlaXRoZXIgbmF0aXZlXG4gKiBgdGV4dElucHV0YCBvciBmYWxsYmFjayBiZWhhdmlvci5cbiAqXG4gKiBAcmV0dXJuIHs/b2JqZWN0fSBBIFN5bnRoZXRpY0lucHV0RXZlbnQuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHZhciBjaGFycztcblxuICBpZiAoY2FuVXNlVGV4dElucHV0RXZlbnQpIHtcbiAgICBjaGFycyA9IGdldE5hdGl2ZUJlZm9yZUlucHV0Q2hhcnModG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCk7XG4gIH0gZWxzZSB7XG4gICAgY2hhcnMgPSBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnModG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCk7XG4gIH1cblxuICAvLyBJZiBubyBjaGFyYWN0ZXJzIGFyZSBiZWluZyBpbnNlcnRlZCwgbm8gQmVmb3JlSW5wdXQgZXZlbnQgc2hvdWxkXG4gIC8vIGJlIGZpcmVkLlxuICBpZiAoIWNoYXJzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgZXZlbnQgPSBTeW50aGV0aWNJbnB1dEV2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLmJlZm9yZUlucHV0LCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIGV2ZW50LmRhdGEgPSBjaGFycztcbiAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50KTtcbiAgcmV0dXJuIGV2ZW50O1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBgb25CZWZvcmVJbnB1dGAgZXZlbnQgdG8gbWF0Y2hcbiAqIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1LyNldmVudHMtaW5wdXRldmVudHMuXG4gKlxuICogVGhpcyBldmVudCBwbHVnaW4gaXMgYmFzZWQgb24gdGhlIG5hdGl2ZSBgdGV4dElucHV0YCBldmVudFxuICogYXZhaWxhYmxlIGluIENocm9tZSwgU2FmYXJpLCBPcGVyYSwgYW5kIElFLiBUaGlzIGV2ZW50IGZpcmVzIGFmdGVyXG4gKiBgb25LZXlQcmVzc2AgYW5kIGBvbkNvbXBvc2l0aW9uRW5kYCwgYnV0IGJlZm9yZSBgb25JbnB1dGAuXG4gKlxuICogYGJlZm9yZUlucHV0YCBpcyBzcGVjJ2QgYnV0IG5vdCBpbXBsZW1lbnRlZCBpbiBhbnkgYnJvd3NlcnMsIGFuZFxuICogdGhlIGBpbnB1dGAgZXZlbnQgZG9lcyBub3QgcHJvdmlkZSBhbnkgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaGFzXG4gKiBhY3R1YWxseSBiZWVuIGFkZGVkLCBjb250cmFyeSB0byB0aGUgc3BlYy4gVGh1cywgYHRleHRJbnB1dGAgaXMgdGhlIGJlc3RcbiAqIGF2YWlsYWJsZSBldmVudCB0byBpZGVudGlmeSB0aGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgYWN0dWFsbHkgYmVlbiBpbnNlcnRlZFxuICogaW50byB0aGUgdGFyZ2V0IG5vZGUuXG4gKlxuICogVGhpcyBwbHVnaW4gaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgZW1pdHRpbmcgYGNvbXBvc2l0aW9uYCBldmVudHMsIHRodXNcbiAqIGFsbG93aW5nIHVzIHRvIHNoYXJlIGNvbXBvc2l0aW9uIGZhbGxiYWNrIGNvZGUgZm9yIGJvdGggYGJlZm9yZUlucHV0YCBhbmRcbiAqIGBjb21wb3NpdGlvbmAgZXZlbnQgdHlwZXMuXG4gKi9cbnZhciBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luID0ge1xuXG4gIGV2ZW50VHlwZXM6IGV2ZW50VHlwZXMsXG5cbiAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgcmV0dXJuIFtleHRyYWN0Q29tcG9zaXRpb25FdmVudCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCksIGV4dHJhY3RCZWZvcmVJbnB1dEV2ZW50KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KV07XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQmVmb3JlSW5wdXRFdmVudFBsdWdpbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENTUyBwcm9wZXJ0aWVzIHdoaWNoIGFjY2VwdCBudW1iZXJzIGJ1dCBhcmUgbm90IGluIHVuaXRzIG9mIFwicHhcIi5cbiAqL1xuXG52YXIgaXNVbml0bGVzc051bWJlciA9IHtcbiAgYW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6IHRydWUsXG4gIGJvcmRlckltYWdlT3V0c2V0OiB0cnVlLFxuICBib3JkZXJJbWFnZVNsaWNlOiB0cnVlLFxuICBib3JkZXJJbWFnZVdpZHRoOiB0cnVlLFxuICBib3hGbGV4OiB0cnVlLFxuICBib3hGbGV4R3JvdXA6IHRydWUsXG4gIGJveE9yZGluYWxHcm91cDogdHJ1ZSxcbiAgY29sdW1uQ291bnQ6IHRydWUsXG4gIGZsZXg6IHRydWUsXG4gIGZsZXhHcm93OiB0cnVlLFxuICBmbGV4UG9zaXRpdmU6IHRydWUsXG4gIGZsZXhTaHJpbms6IHRydWUsXG4gIGZsZXhOZWdhdGl2ZTogdHJ1ZSxcbiAgZmxleE9yZGVyOiB0cnVlLFxuICBncmlkUm93OiB0cnVlLFxuICBncmlkQ29sdW1uOiB0cnVlLFxuICBmb250V2VpZ2h0OiB0cnVlLFxuICBsaW5lQ2xhbXA6IHRydWUsXG4gIGxpbmVIZWlnaHQ6IHRydWUsXG4gIG9wYWNpdHk6IHRydWUsXG4gIG9yZGVyOiB0cnVlLFxuICBvcnBoYW5zOiB0cnVlLFxuICB0YWJTaXplOiB0cnVlLFxuICB3aWRvd3M6IHRydWUsXG4gIHpJbmRleDogdHJ1ZSxcbiAgem9vbTogdHJ1ZSxcblxuICAvLyBTVkctcmVsYXRlZCBwcm9wZXJ0aWVzXG4gIGZpbGxPcGFjaXR5OiB0cnVlLFxuICBmbG9vZE9wYWNpdHk6IHRydWUsXG4gIHN0b3BPcGFjaXR5OiB0cnVlLFxuICBzdHJva2VEYXNoYXJyYXk6IHRydWUsXG4gIHN0cm9rZURhc2hvZmZzZXQ6IHRydWUsXG4gIHN0cm9rZU1pdGVybGltaXQ6IHRydWUsXG4gIHN0cm9rZU9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZVdpZHRoOiB0cnVlXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXggdmVuZG9yLXNwZWNpZmljIHByZWZpeCwgZWc6IFdlYmtpdFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBzdHlsZSBuYW1lLCBlZzogdHJhbnNpdGlvbkR1cmF0aW9uXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHN0eWxlIG5hbWUgcHJlZml4ZWQgd2l0aCBgcHJlZml4YCwgcHJvcGVybHkgY2FtZWxDYXNlZCwgZWc6XG4gKiBXZWJraXRUcmFuc2l0aW9uRHVyYXRpb25cbiAqL1xuZnVuY3Rpb24gcHJlZml4S2V5KHByZWZpeCwga2V5KSB7XG4gIHJldHVybiBwcmVmaXggKyBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyaW5nKDEpO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgc3R5bGUgbmFtZXMgdGhhdCBtYXkgY29tZSBwYXNzZWQgaW4gcHJlZml4ZWQgYnkgYWRkaW5nIHBlcm11dGF0aW9uc1xuICogb2YgdmVuZG9yIHByZWZpeGVzLlxuICovXG52YXIgcHJlZml4ZXMgPSBbJ1dlYmtpdCcsICdtcycsICdNb3onLCAnTyddO1xuXG4vLyBVc2luZyBPYmplY3Qua2V5cyBoZXJlLCBvciBlbHNlIHRoZSB2YW5pbGxhIGZvci1pbiBsb29wIG1ha2VzIElFOCBnbyBpbnRvIGFuXG4vLyBpbmZpbml0ZSBsb29wLCBiZWNhdXNlIGl0IGl0ZXJhdGVzIG92ZXIgdGhlIG5ld2x5IGFkZGVkIHByb3BzIHRvby5cbk9iamVjdC5rZXlzKGlzVW5pdGxlc3NOdW1iZXIpLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgcHJlZml4ZXMuZm9yRWFjaChmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgaXNVbml0bGVzc051bWJlcltwcmVmaXhLZXkocHJlZml4LCBwcm9wKV0gPSBpc1VuaXRsZXNzTnVtYmVyW3Byb3BdO1xuICB9KTtcbn0pO1xuXG4vKipcbiAqIE1vc3Qgc3R5bGUgcHJvcGVydGllcyBjYW4gYmUgdW5zZXQgYnkgZG9pbmcgLnN0eWxlW3Byb3BdID0gJycgYnV0IElFOFxuICogZG9lc24ndCBsaWtlIGRvaW5nIHRoYXQgd2l0aCBzaG9ydGhhbmQgcHJvcGVydGllcyBzbyBmb3IgdGhlIHByb3BlcnRpZXMgdGhhdFxuICogSUU4IGJyZWFrcyBvbiwgd2hpY2ggYXJlIGxpc3RlZCBoZXJlLCB3ZSBpbnN0ZWFkIHVuc2V0IGVhY2ggb2YgdGhlXG4gKiBpbmRpdmlkdWFsIHByb3BlcnRpZXMuIFNlZSBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMjM4NS5cbiAqIFRoZSA0LXZhbHVlICdjbG9jaycgcHJvcGVydGllcyBsaWtlIG1hcmdpbiwgcGFkZGluZywgYm9yZGVyLXdpZHRoIHNlZW0gdG9cbiAqIGJlaGF2ZSB3aXRob3V0IGFueSBwcm9ibGVtcy4gQ3VyaW91c2x5LCBsaXN0LXN0eWxlIHdvcmtzIHRvbyB3aXRob3V0IGFueVxuICogc3BlY2lhbCBwcm9kZGluZy5cbiAqL1xudmFyIHNob3J0aGFuZFByb3BlcnR5RXhwYW5zaW9ucyA9IHtcbiAgYmFja2dyb3VuZDoge1xuICAgIGJhY2tncm91bmRBdHRhY2htZW50OiB0cnVlLFxuICAgIGJhY2tncm91bmRDb2xvcjogdHJ1ZSxcbiAgICBiYWNrZ3JvdW5kSW1hZ2U6IHRydWUsXG4gICAgYmFja2dyb3VuZFBvc2l0aW9uWDogdHJ1ZSxcbiAgICBiYWNrZ3JvdW5kUG9zaXRpb25ZOiB0cnVlLFxuICAgIGJhY2tncm91bmRSZXBlYXQ6IHRydWVcbiAgfSxcbiAgYmFja2dyb3VuZFBvc2l0aW9uOiB7XG4gICAgYmFja2dyb3VuZFBvc2l0aW9uWDogdHJ1ZSxcbiAgICBiYWNrZ3JvdW5kUG9zaXRpb25ZOiB0cnVlXG4gIH0sXG4gIGJvcmRlcjoge1xuICAgIGJvcmRlcldpZHRoOiB0cnVlLFxuICAgIGJvcmRlclN0eWxlOiB0cnVlLFxuICAgIGJvcmRlckNvbG9yOiB0cnVlXG4gIH0sXG4gIGJvcmRlckJvdHRvbToge1xuICAgIGJvcmRlckJvdHRvbVdpZHRoOiB0cnVlLFxuICAgIGJvcmRlckJvdHRvbVN0eWxlOiB0cnVlLFxuICAgIGJvcmRlckJvdHRvbUNvbG9yOiB0cnVlXG4gIH0sXG4gIGJvcmRlckxlZnQ6IHtcbiAgICBib3JkZXJMZWZ0V2lkdGg6IHRydWUsXG4gICAgYm9yZGVyTGVmdFN0eWxlOiB0cnVlLFxuICAgIGJvcmRlckxlZnRDb2xvcjogdHJ1ZVxuICB9LFxuICBib3JkZXJSaWdodDoge1xuICAgIGJvcmRlclJpZ2h0V2lkdGg6IHRydWUsXG4gICAgYm9yZGVyUmlnaHRTdHlsZTogdHJ1ZSxcbiAgICBib3JkZXJSaWdodENvbG9yOiB0cnVlXG4gIH0sXG4gIGJvcmRlclRvcDoge1xuICAgIGJvcmRlclRvcFdpZHRoOiB0cnVlLFxuICAgIGJvcmRlclRvcFN0eWxlOiB0cnVlLFxuICAgIGJvcmRlclRvcENvbG9yOiB0cnVlXG4gIH0sXG4gIGZvbnQ6IHtcbiAgICBmb250U3R5bGU6IHRydWUsXG4gICAgZm9udFZhcmlhbnQ6IHRydWUsXG4gICAgZm9udFdlaWdodDogdHJ1ZSxcbiAgICBmb250U2l6ZTogdHJ1ZSxcbiAgICBsaW5lSGVpZ2h0OiB0cnVlLFxuICAgIGZvbnRGYW1pbHk6IHRydWVcbiAgfSxcbiAgb3V0bGluZToge1xuICAgIG91dGxpbmVXaWR0aDogdHJ1ZSxcbiAgICBvdXRsaW5lU3R5bGU6IHRydWUsXG4gICAgb3V0bGluZUNvbG9yOiB0cnVlXG4gIH1cbn07XG5cbnZhciBDU1NQcm9wZXJ0eSA9IHtcbiAgaXNVbml0bGVzc051bWJlcjogaXNVbml0bGVzc051bWJlcixcbiAgc2hvcnRoYW5kUHJvcGVydHlFeHBhbnNpb25zOiBzaG9ydGhhbmRQcm9wZXJ0eUV4cGFuc2lvbnNcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ1NTUHJvcGVydHk7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIENTU1Byb3BlcnR5ID0gcmVxdWlyZSgnLi9DU1NQcm9wZXJ0eScpO1xudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnZmJqcy9saWIvRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcblxudmFyIGNhbWVsaXplU3R5bGVOYW1lID0gcmVxdWlyZSgnZmJqcy9saWIvY2FtZWxpemVTdHlsZU5hbWUnKTtcbnZhciBkYW5nZXJvdXNTdHlsZVZhbHVlID0gcmVxdWlyZSgnLi9kYW5nZXJvdXNTdHlsZVZhbHVlJyk7XG52YXIgaHlwaGVuYXRlU3R5bGVOYW1lID0gcmVxdWlyZSgnZmJqcy9saWIvaHlwaGVuYXRlU3R5bGVOYW1lJyk7XG52YXIgbWVtb2l6ZVN0cmluZ09ubHkgPSByZXF1aXJlKCdmYmpzL2xpYi9tZW1vaXplU3RyaW5nT25seScpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBwcm9jZXNzU3R5bGVOYW1lID0gbWVtb2l6ZVN0cmluZ09ubHkoZnVuY3Rpb24gKHN0eWxlTmFtZSkge1xuICByZXR1cm4gaHlwaGVuYXRlU3R5bGVOYW1lKHN0eWxlTmFtZSk7XG59KTtcblxudmFyIGhhc1Nob3J0aGFuZFByb3BlcnR5QnVnID0gZmFsc2U7XG52YXIgc3R5bGVGbG9hdEFjY2Vzc29yID0gJ2Nzc0Zsb2F0JztcbmlmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00pIHtcbiAgdmFyIHRlbXBTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLnN0eWxlO1xuICB0cnkge1xuICAgIC8vIElFOCB0aHJvd3MgXCJJbnZhbGlkIGFyZ3VtZW50LlwiIGlmIHJlc2V0dGluZyBzaG9ydGhhbmQgc3R5bGUgcHJvcGVydGllcy5cbiAgICB0ZW1wU3R5bGUuZm9udCA9ICcnO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaGFzU2hvcnRoYW5kUHJvcGVydHlCdWcgPSB0cnVlO1xuICB9XG4gIC8vIElFOCBvbmx5IHN1cHBvcnRzIGFjY2Vzc2luZyBjc3NGbG9hdCAoc3RhbmRhcmQpIGFzIHN0eWxlRmxvYXRcbiAgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5jc3NGbG9hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3R5bGVGbG9hdEFjY2Vzc29yID0gJ3N0eWxlRmxvYXQnO1xuICB9XG59XG5cbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAvLyAnbXNUcmFuc2Zvcm0nIGlzIGNvcnJlY3QsIGJ1dCB0aGUgb3RoZXIgcHJlZml4ZXMgc2hvdWxkIGJlIGNhcGl0YWxpemVkXG4gIHZhciBiYWRWZW5kb3JlZFN0eWxlTmFtZVBhdHRlcm4gPSAvXig/OndlYmtpdHxtb3p8bylbQS1aXS87XG5cbiAgLy8gc3R5bGUgdmFsdWVzIHNob3VsZG4ndCBjb250YWluIGEgc2VtaWNvbG9uXG4gIHZhciBiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4gPSAvO1xccyokLztcblxuICB2YXIgd2FybmVkU3R5bGVOYW1lcyA9IHt9O1xuICB2YXIgd2FybmVkU3R5bGVWYWx1ZXMgPSB7fTtcbiAgdmFyIHdhcm5lZEZvck5hTlZhbHVlID0gZmFsc2U7XG5cbiAgdmFyIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUsIG93bmVyKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlTmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0cnVlO1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1Vuc3VwcG9ydGVkIHN0eWxlIHByb3BlcnR5ICVzLiBEaWQgeW91IG1lYW4gJXM/JXMnLCBuYW1lLCBjYW1lbGl6ZVN0eWxlTmFtZShuYW1lKSwgY2hlY2tSZW5kZXJNZXNzYWdlKG93bmVyKSkgOiB2b2lkIDA7XG4gIH07XG5cbiAgdmFyIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZSA9IGZ1bmN0aW9uIChuYW1lLCBvd25lcikge1xuICAgIGlmICh3YXJuZWRTdHlsZU5hbWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZU5hbWVzW25hbWVdID0gdHJ1ZTtcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdVbnN1cHBvcnRlZCB2ZW5kb3ItcHJlZml4ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8lcycsIG5hbWUsIG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpLCBjaGVja1JlbmRlck1lc3NhZ2Uob3duZXIpKSA6IHZvaWQgMDtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBvd25lcikge1xuICAgIGlmICh3YXJuZWRTdHlsZVZhbHVlcy5oYXNPd25Qcm9wZXJ0eSh2YWx1ZSkgJiYgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVWYWx1ZXNbdmFsdWVdID0gdHJ1ZTtcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdTdHlsZSBwcm9wZXJ0eSB2YWx1ZXMgc2hvdWxkblxcJ3QgY29udGFpbiBhIHNlbWljb2xvbi4lcyAnICsgJ1RyeSBcIiVzOiAlc1wiIGluc3RlYWQuJywgY2hlY2tSZW5kZXJNZXNzYWdlKG93bmVyKSwgbmFtZSwgdmFsdWUucmVwbGFjZShiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4sICcnKSkgOiB2b2lkIDA7XG4gIH07XG5cbiAgdmFyIHdhcm5TdHlsZVZhbHVlSXNOYU4gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIG93bmVyKSB7XG4gICAgaWYgKHdhcm5lZEZvck5hTlZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkRm9yTmFOVmFsdWUgPSB0cnVlO1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2BOYU5gIGlzIGFuIGludmFsaWQgdmFsdWUgZm9yIHRoZSBgJXNgIGNzcyBzdHlsZSBwcm9wZXJ0eS4lcycsIG5hbWUsIGNoZWNrUmVuZGVyTWVzc2FnZShvd25lcikpIDogdm9pZCAwO1xuICB9O1xuXG4gIHZhciBjaGVja1JlbmRlck1lc3NhZ2UgPSBmdW5jdGlvbiAob3duZXIpIHtcbiAgICBpZiAob3duZXIpIHtcbiAgICAgIHZhciBuYW1lID0gb3duZXIuZ2V0TmFtZSgpO1xuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEBwYXJhbSB7UmVhY3RET01Db21wb25lbnR9IGNvbXBvbmVudFxuICAgKi9cbiAgdmFyIHdhcm5WYWxpZFN0eWxlID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlLCBjb21wb25lbnQpIHtcbiAgICB2YXIgb3duZXI7XG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgb3duZXIgPSBjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjtcbiAgICB9XG4gICAgaWYgKG5hbWUuaW5kZXhPZignLScpID4gLTEpIHtcbiAgICAgIHdhcm5IeXBoZW5hdGVkU3R5bGVOYW1lKG5hbWUsIG93bmVyKTtcbiAgICB9IGVsc2UgaWYgKGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICB3YXJuQmFkVmVuZG9yZWRTdHlsZU5hbWUobmFtZSwgb3duZXIpO1xuICAgIH0gZWxzZSBpZiAoYmFkU3R5bGVWYWx1ZVdpdGhTZW1pY29sb25QYXR0ZXJuLnRlc3QodmFsdWUpKSB7XG4gICAgICB3YXJuU3R5bGVWYWx1ZVdpdGhTZW1pY29sb24obmFtZSwgdmFsdWUsIG93bmVyKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWx1ZSkpIHtcbiAgICAgIHdhcm5TdHlsZVZhbHVlSXNOYU4obmFtZSwgdmFsdWUsIG93bmVyKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogT3BlcmF0aW9ucyBmb3IgZGVhbGluZyB3aXRoIENTUyBwcm9wZXJ0aWVzLlxuICovXG52YXIgQ1NTUHJvcGVydHlPcGVyYXRpb25zID0ge1xuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgbWFwcGluZyBvZiBzdHlsZSBwcm9wZXJ0aWVzIGZvciB1c2UgYXMgaW5saW5lIHN0eWxlczpcbiAgICpcbiAgICogICA+IGNyZWF0ZU1hcmt1cEZvclN0eWxlcyh7d2lkdGg6ICcyMDBweCcsIGhlaWdodDogMH0pXG4gICAqICAgXCJ3aWR0aDoyMDBweDtoZWlnaHQ6MDtcIlxuICAgKlxuICAgKiBVbmRlZmluZWQgdmFsdWVzIGFyZSBpZ25vcmVkIHNvIHRoYXQgZGVjbGFyYXRpdmUgcHJvZ3JhbW1pbmcgaXMgZWFzaWVyLlxuICAgKiBUaGUgcmVzdWx0IHNob3VsZCBiZSBIVE1MLWVzY2FwZWQgYmVmb3JlIGluc2VydGlvbiBpbnRvIHRoZSBET00uXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZXNcbiAgICogQHBhcmFtIHtSZWFjdERPTUNvbXBvbmVudH0gY29tcG9uZW50XG4gICAqIEByZXR1cm4gez9zdHJpbmd9XG4gICAqL1xuICBjcmVhdGVNYXJrdXBGb3JTdHlsZXM6IGZ1bmN0aW9uIChzdHlsZXMsIGNvbXBvbmVudCkge1xuICAgIHZhciBzZXJpYWxpemVkID0gJyc7XG4gICAgZm9yICh2YXIgc3R5bGVOYW1lIGluIHN0eWxlcykge1xuICAgICAgaWYgKCFzdHlsZXMuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBzdHlsZVZhbHVlID0gc3R5bGVzW3N0eWxlTmFtZV07XG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FyblZhbGlkU3R5bGUoc3R5bGVOYW1lLCBzdHlsZVZhbHVlLCBjb21wb25lbnQpO1xuICAgICAgfVxuICAgICAgaWYgKHN0eWxlVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICBzZXJpYWxpemVkICs9IHByb2Nlc3NTdHlsZU5hbWUoc3R5bGVOYW1lKSArICc6JztcbiAgICAgICAgc2VyaWFsaXplZCArPSBkYW5nZXJvdXNTdHlsZVZhbHVlKHN0eWxlTmFtZSwgc3R5bGVWYWx1ZSwgY29tcG9uZW50KSArICc7JztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNlcmlhbGl6ZWQgfHwgbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgZm9yIG11bHRpcGxlIHN0eWxlcyBvbiBhIG5vZGUuICBJZiBhIHZhbHVlIGlzIHNwZWNpZmllZCBhc1xuICAgKiAnJyAoZW1wdHkgc3RyaW5nKSwgdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgd2lsbCBiZSB1bnNldC5cbiAgICpcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzdHlsZXNcbiAgICogQHBhcmFtIHtSZWFjdERPTUNvbXBvbmVudH0gY29tcG9uZW50XG4gICAqL1xuICBzZXRWYWx1ZUZvclN0eWxlczogZnVuY3Rpb24gKG5vZGUsIHN0eWxlcywgY29tcG9uZW50KSB7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgaW5zdGFuY2VJRDogY29tcG9uZW50Ll9kZWJ1Z0lELFxuICAgICAgICB0eXBlOiAndXBkYXRlIHN0eWxlcycsXG4gICAgICAgIHBheWxvYWQ6IHN0eWxlc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdmFyIHN0eWxlID0gbm9kZS5zdHlsZTtcbiAgICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7XG4gICAgICBpZiAoIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHdhcm5WYWxpZFN0eWxlKHN0eWxlTmFtZSwgc3R5bGVzW3N0eWxlTmFtZV0sIGNvbXBvbmVudCk7XG4gICAgICB9XG4gICAgICB2YXIgc3R5bGVWYWx1ZSA9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZXNbc3R5bGVOYW1lXSwgY29tcG9uZW50KTtcbiAgICAgIGlmIChzdHlsZU5hbWUgPT09ICdmbG9hdCcgfHwgc3R5bGVOYW1lID09PSAnY3NzRmxvYXQnKSB7XG4gICAgICAgIHN0eWxlTmFtZSA9IHN0eWxlRmxvYXRBY2Nlc3NvcjtcbiAgICAgIH1cbiAgICAgIGlmIChzdHlsZVZhbHVlKSB7XG4gICAgICAgIHN0eWxlW3N0eWxlTmFtZV0gPSBzdHlsZVZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGV4cGFuc2lvbiA9IGhhc1Nob3J0aGFuZFByb3BlcnR5QnVnICYmIENTU1Byb3BlcnR5LnNob3J0aGFuZFByb3BlcnR5RXhwYW5zaW9uc1tzdHlsZU5hbWVdO1xuICAgICAgICBpZiAoZXhwYW5zaW9uKSB7XG4gICAgICAgICAgLy8gU2hvcnRoYW5kIHByb3BlcnR5IHRoYXQgSUU4IHdvbid0IGxpa2UgdW5zZXR0aW5nLCBzbyB1bnNldCBlYWNoXG4gICAgICAgICAgLy8gY29tcG9uZW50IHRvIHBsYWNhdGUgaXRcbiAgICAgICAgICBmb3IgKHZhciBpbmRpdmlkdWFsU3R5bGVOYW1lIGluIGV4cGFuc2lvbikge1xuICAgICAgICAgICAgc3R5bGVbaW5kaXZpZHVhbFN0eWxlTmFtZV0gPSAnJztcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3R5bGVbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQ1NTUHJvcGVydHlPcGVyYXRpb25zOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIFBvb2xlZENsYXNzID0gcmVxdWlyZSgnLi9Qb29sZWRDbGFzcycpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCBwc2V1ZG8tZXZlbnQgbW9kdWxlIHRvIGhlbHAga2VlcCB0cmFjayBvZiBjb21wb25lbnRzIHdhaXRpbmcgdG9cbiAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlaXIgRE9NIHJlcHJlc2VudGF0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciB1c2UuXG4gKlxuICogVGhpcyBpbXBsZW1lbnRzIGBQb29sZWRDbGFzc2AsIHNvIHlvdSBzaG91bGQgbmV2ZXIgbmVlZCB0byBpbnN0YW50aWF0ZSB0aGlzLlxuICogSW5zdGVhZCwgdXNlIGBDYWxsYmFja1F1ZXVlLmdldFBvb2xlZCgpYC5cbiAqXG4gKiBAY2xhc3MgUmVhY3RNb3VudFJlYWR5XG4gKiBAaW1wbGVtZW50cyBQb29sZWRDbGFzc1xuICogQGludGVybmFsXG4gKi9cblxudmFyIENhbGxiYWNrUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENhbGxiYWNrUXVldWUoYXJnKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENhbGxiYWNrUXVldWUpO1xuXG4gICAgdGhpcy5fY2FsbGJhY2tzID0gbnVsbDtcbiAgICB0aGlzLl9jb250ZXh0cyA9IG51bGw7XG4gICAgdGhpcy5fYXJnID0gYXJnO1xuICB9XG5cbiAgLyoqXG4gICAqIEVucXVldWVzIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGBub3RpZnlBbGxgIGlzIGludm9rZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIEludm9rZWQgd2hlbiBgbm90aWZ5QWxsYCBpcyBpbnZva2VkLlxuICAgKiBAcGFyYW0gez9vYmplY3R9IGNvbnRleHQgQ29udGV4dCB0byBjYWxsIGBjYWxsYmFja2Agd2l0aC5cbiAgICogQGludGVybmFsXG4gICAqL1xuXG5cbiAgQ2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUuZW5xdWV1ZSA9IGZ1bmN0aW9uIGVucXVldWUoY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICB0aGlzLl9jYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3MgfHwgW107XG4gICAgdGhpcy5fY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIHRoaXMuX2NvbnRleHRzID0gdGhpcy5fY29udGV4dHMgfHwgW107XG4gICAgdGhpcy5fY29udGV4dHMucHVzaChjb250ZXh0KTtcbiAgfTtcblxuICAvKipcbiAgICogSW52b2tlcyBhbGwgZW5xdWV1ZWQgY2FsbGJhY2tzIGFuZCBjbGVhcnMgdGhlIHF1ZXVlLiBUaGlzIGlzIGludm9rZWQgYWZ0ZXJcbiAgICogdGhlIERPTSByZXByZXNlbnRhdGlvbiBvZiBhIGNvbXBvbmVudCBoYXMgYmVlbiBjcmVhdGVkIG9yIHVwZGF0ZWQuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuXG4gIENhbGxiYWNrUXVldWUucHJvdG90eXBlLm5vdGlmeUFsbCA9IGZ1bmN0aW9uIG5vdGlmeUFsbCgpIHtcbiAgICB2YXIgY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzO1xuICAgIHZhciBjb250ZXh0cyA9IHRoaXMuX2NvbnRleHRzO1xuICAgIHZhciBhcmcgPSB0aGlzLl9hcmc7XG4gICAgaWYgKGNhbGxiYWNrcyAmJiBjb250ZXh0cykge1xuICAgICAgIShjYWxsYmFja3MubGVuZ3RoID09PSBjb250ZXh0cy5sZW5ndGgpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdNaXNtYXRjaGVkIGxpc3Qgb2YgY29udGV4dHMgaW4gY2FsbGJhY2sgcXVldWUnKSA6IF9wcm9kSW52YXJpYW50KCcyNCcpIDogdm9pZCAwO1xuICAgICAgdGhpcy5fY2FsbGJhY2tzID0gbnVsbDtcbiAgICAgIHRoaXMuX2NvbnRleHRzID0gbnVsbDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNhbGxiYWNrc1tpXS5jYWxsKGNvbnRleHRzW2ldLCBhcmcpO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2tzLmxlbmd0aCA9IDA7XG4gICAgICBjb250ZXh0cy5sZW5ndGggPSAwO1xuICAgIH1cbiAgfTtcblxuICBDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5jaGVja3BvaW50ID0gZnVuY3Rpb24gY2hlY2twb2ludCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbGJhY2tzID8gdGhpcy5fY2FsbGJhY2tzLmxlbmd0aCA6IDA7XG4gIH07XG5cbiAgQ2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUucm9sbGJhY2sgPSBmdW5jdGlvbiByb2xsYmFjayhsZW4pIHtcbiAgICBpZiAodGhpcy5fY2FsbGJhY2tzICYmIHRoaXMuX2NvbnRleHRzKSB7XG4gICAgICB0aGlzLl9jYWxsYmFja3MubGVuZ3RoID0gbGVuO1xuICAgICAgdGhpcy5fY29udGV4dHMubGVuZ3RoID0gbGVuO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBpbnRlcm5hbCBxdWV1ZS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuXG5cbiAgQ2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiByZXNldCgpIHtcbiAgICB0aGlzLl9jYWxsYmFja3MgPSBudWxsO1xuICAgIHRoaXMuX2NvbnRleHRzID0gbnVsbDtcbiAgfTtcblxuICAvKipcbiAgICogYFBvb2xlZENsYXNzYCBsb29rcyBmb3IgdGhpcy5cbiAgICovXG5cblxuICBDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5kZXN0cnVjdG9yID0gZnVuY3Rpb24gZGVzdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnJlc2V0KCk7XG4gIH07XG5cbiAgcmV0dXJuIENhbGxiYWNrUXVldWU7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKENhbGxiYWNrUXVldWUpOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFdmVudFBsdWdpbkh1YiA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5IdWInKTtcbnZhciBFdmVudFByb3BhZ2F0b3JzID0gcmVxdWlyZSgnLi9FdmVudFByb3BhZ2F0b3JzJyk7XG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZXMnKTtcbnZhciBTeW50aGV0aWNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRXZlbnQnKTtcblxudmFyIGdldEV2ZW50VGFyZ2V0ID0gcmVxdWlyZSgnLi9nZXRFdmVudFRhcmdldCcpO1xudmFyIGlzRXZlbnRTdXBwb3J0ZWQgPSByZXF1aXJlKCcuL2lzRXZlbnRTdXBwb3J0ZWQnKTtcbnZhciBpc1RleHRJbnB1dEVsZW1lbnQgPSByZXF1aXJlKCcuL2lzVGV4dElucHV0RWxlbWVudCcpO1xuXG52YXIgZXZlbnRUeXBlcyA9IHtcbiAgY2hhbmdlOiB7XG4gICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAgICAgIGJ1YmJsZWQ6ICdvbkNoYW5nZScsXG4gICAgICBjYXB0dXJlZDogJ29uQ2hhbmdlQ2FwdHVyZSdcbiAgICB9LFxuICAgIGRlcGVuZGVuY2llczogWyd0b3BCbHVyJywgJ3RvcENoYW5nZScsICd0b3BDbGljaycsICd0b3BGb2N1cycsICd0b3BJbnB1dCcsICd0b3BLZXlEb3duJywgJ3RvcEtleVVwJywgJ3RvcFNlbGVjdGlvbkNoYW5nZSddXG4gIH1cbn07XG5cbi8qKlxuICogRm9yIElFIHNoaW1zXG4gKi9cbnZhciBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG52YXIgYWN0aXZlRWxlbWVudFZhbHVlID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50VmFsdWVQcm9wID0gbnVsbDtcblxuLyoqXG4gKiBTRUNUSU9OOiBoYW5kbGUgYGNoYW5nZWAgZXZlbnRcbiAqL1xuZnVuY3Rpb24gc2hvdWxkVXNlQ2hhbmdlRXZlbnQoZWxlbSkge1xuICB2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG5vZGVOYW1lID09PSAnc2VsZWN0JyB8fCBub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiBlbGVtLnR5cGUgPT09ICdmaWxlJztcbn1cblxudmFyIGRvZXNDaGFuZ2VFdmVudEJ1YmJsZSA9IGZhbHNlO1xuaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkge1xuICAvLyBTZWUgYGhhbmRsZUNoYW5nZWAgY29tbWVudCBiZWxvd1xuICBkb2VzQ2hhbmdlRXZlbnRCdWJibGUgPSBpc0V2ZW50U3VwcG9ydGVkKCdjaGFuZ2UnKSAmJiAoIWRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPiA4KTtcbn1cblxuZnVuY3Rpb24gbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCkge1xuICB2YXIgZXZlbnQgPSBTeW50aGV0aWNFdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlcy5jaGFuZ2UsIGFjdGl2ZUVsZW1lbnRJbnN0LCBuYXRpdmVFdmVudCwgZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpKTtcbiAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50KTtcblxuICAvLyBJZiBjaGFuZ2UgYW5kIHByb3BlcnR5Y2hhbmdlIGJ1YmJsZWQsIHdlJ2QganVzdCBiaW5kIHRvIGl0IGxpa2UgYWxsIHRoZVxuICAvLyBvdGhlciBldmVudHMgYW5kIGhhdmUgaXQgZ28gdGhyb3VnaCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuIFNpbmNlIGl0XG4gIC8vIGRvZXNuJ3QsIHdlIG1hbnVhbGx5IGxpc3RlbiBmb3IgdGhlIGV2ZW50cyBhbmQgc28gd2UgaGF2ZSB0byBlbnF1ZXVlIGFuZFxuICAvLyBwcm9jZXNzIHRoZSBhYnN0cmFjdCBldmVudCBtYW51YWxseS5cbiAgLy9cbiAgLy8gQmF0Y2hpbmcgaXMgbmVjZXNzYXJ5IGhlcmUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgYWxsIGV2ZW50IGhhbmRsZXJzIHJ1blxuICAvLyBiZWZvcmUgdGhlIG5leHQgcmVyZW5kZXIgKGluY2x1ZGluZyBldmVudCBoYW5kbGVycyBhdHRhY2hlZCB0byBhbmNlc3RvclxuICAvLyBlbGVtZW50cyBpbnN0ZWFkIG9mIGRpcmVjdGx5IG9uIHRoZSBpbnB1dCkuIFdpdGhvdXQgdGhpcywgY29udHJvbGxlZFxuICAvLyBjb21wb25lbnRzIGRvbid0IHdvcmsgcHJvcGVybHkgaW4gY29uanVuY3Rpb24gd2l0aCBldmVudCBidWJibGluZyBiZWNhdXNlXG4gIC8vIHRoZSBjb21wb25lbnQgaXMgcmVyZW5kZXJlZCBhbmQgdGhlIHZhbHVlIHJldmVydGVkIGJlZm9yZSBhbGwgdGhlIGV2ZW50XG4gIC8vIGhhbmRsZXJzIGNhbiBydW4uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcwOC5cbiAgUmVhY3RVcGRhdGVzLmJhdGNoZWRVcGRhdGVzKHJ1bkV2ZW50SW5CYXRjaCwgZXZlbnQpO1xufVxuXG5mdW5jdGlvbiBydW5FdmVudEluQmF0Y2goZXZlbnQpIHtcbiAgRXZlbnRQbHVnaW5IdWIuZW5xdWV1ZUV2ZW50cyhldmVudCk7XG4gIEV2ZW50UGx1Z2luSHViLnByb2Nlc3NFdmVudFF1ZXVlKGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gc3RhcnRXYXRjaGluZ0ZvckNoYW5nZUV2ZW50SUU4KHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBhY3RpdmVFbGVtZW50ID0gdGFyZ2V0O1xuICBhY3RpdmVFbGVtZW50SW5zdCA9IHRhcmdldEluc3Q7XG4gIGFjdGl2ZUVsZW1lbnQuYXR0YWNoRXZlbnQoJ29uY2hhbmdlJywgbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudCk7XG59XG5cbmZ1bmN0aW9uIHN0b3BXYXRjaGluZ0ZvckNoYW5nZUV2ZW50SUU4KCkge1xuICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYWN0aXZlRWxlbWVudC5kZXRhY2hFdmVudCgnb25jaGFuZ2UnLCBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KTtcbiAgYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNoYW5nZUV2ZW50KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wQ2hhbmdlJykge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG5mdW5jdGlvbiBoYW5kbGVFdmVudHNGb3JDaGFuZ2VFdmVudElFOCh0b3BMZXZlbFR5cGUsIHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wRm9jdXMnKSB7XG4gICAgLy8gc3RvcFdhdGNoaW5nKCkgc2hvdWxkIGJlIGEgbm9vcCBoZXJlIGJ1dCB3ZSBjYWxsIGl0IGp1c3QgaW4gY2FzZSB3ZVxuICAgIC8vIG1pc3NlZCBhIGJsdXIgZXZlbnQgc29tZWhvdy5cbiAgICBzdG9wV2F0Y2hpbmdGb3JDaGFuZ2VFdmVudElFOCgpO1xuICAgIHN0YXJ0V2F0Y2hpbmdGb3JDaGFuZ2VFdmVudElFOCh0YXJnZXQsIHRhcmdldEluc3QpO1xuICB9IGVsc2UgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcEJsdXInKSB7XG4gICAgc3RvcFdhdGNoaW5nRm9yQ2hhbmdlRXZlbnRJRTgoKTtcbiAgfVxufVxuXG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgaW5wdXRgIGV2ZW50XG4gKi9cbnZhciBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBmYWxzZTtcbmlmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00pIHtcbiAgLy8gSUU5IGNsYWltcyB0byBzdXBwb3J0IHRoZSBpbnB1dCBldmVudCBidXQgZmFpbHMgdG8gdHJpZ2dlciBpdCB3aGVuXG4gIC8vIGRlbGV0aW5nIHRleHQsIHNvIHdlIGlnbm9yZSBpdHMgaW5wdXQgZXZlbnRzLlxuICAvLyBJRTEwKyBmaXJlIGlucHV0IGV2ZW50cyB0byBvZnRlbiwgc3VjaCB3aGVuIGEgcGxhY2Vob2xkZXJcbiAgLy8gY2hhbmdlcyBvciB3aGVuIGFuIGlucHV0IHdpdGggYSBwbGFjZWhvbGRlciBpcyBmb2N1c2VkLlxuICBpc0lucHV0RXZlbnRTdXBwb3J0ZWQgPSBpc0V2ZW50U3VwcG9ydGVkKCdpbnB1dCcpICYmICghZG9jdW1lbnQuZG9jdW1lbnRNb2RlIHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA+IDExKTtcbn1cblxuLyoqXG4gKiAoRm9yIElFIDw9MTEpIFJlcGxhY2VtZW50IGdldHRlci9zZXR0ZXIgZm9yIHRoZSBgdmFsdWVgIHByb3BlcnR5IHRoYXQgZ2V0c1xuICogc2V0IG9uIHRoZSBhY3RpdmUgZWxlbWVudC5cbiAqL1xudmFyIG5ld1ZhbHVlUHJvcCA9IHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnRWYWx1ZVByb3AuZ2V0LmNhbGwodGhpcyk7XG4gIH0sXG4gIHNldDogZnVuY3Rpb24gKHZhbCkge1xuICAgIC8vIENhc3QgdG8gYSBzdHJpbmcgc28gd2UgY2FuIGRvIGVxdWFsaXR5IGNoZWNrcy5cbiAgICBhY3RpdmVFbGVtZW50VmFsdWUgPSAnJyArIHZhbDtcbiAgICBhY3RpdmVFbGVtZW50VmFsdWVQcm9wLnNldC5jYWxsKHRoaXMsIHZhbCk7XG4gIH1cbn07XG5cbi8qKlxuICogKEZvciBJRSA8PTExKSBTdGFydHMgdHJhY2tpbmcgcHJvcGVydHljaGFuZ2UgZXZlbnRzIG9uIHRoZSBwYXNzZWQtaW4gZWxlbWVudFxuICogYW5kIG92ZXJyaWRlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBzbyB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaCB1c2VyIGV2ZW50cyBmcm9tXG4gKiB2YWx1ZSBjaGFuZ2VzIGluIEpTLlxuICovXG5mdW5jdGlvbiBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGFjdGl2ZUVsZW1lbnQgPSB0YXJnZXQ7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgYWN0aXZlRWxlbWVudFZhbHVlID0gdGFyZ2V0LnZhbHVlO1xuICBhY3RpdmVFbGVtZW50VmFsdWVQcm9wID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQuY29uc3RydWN0b3IucHJvdG90eXBlLCAndmFsdWUnKTtcblxuICAvLyBOb3QgZ3VhcmRlZCBpbiBhIGNhbkRlZmluZVByb3BlcnR5IGNoZWNrOiBJRTggc3VwcG9ydHMgZGVmaW5lUHJvcGVydHkgb25seVxuICAvLyBvbiBET00gZWxlbWVudHNcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFjdGl2ZUVsZW1lbnQsICd2YWx1ZScsIG5ld1ZhbHVlUHJvcCk7XG4gIGlmIChhY3RpdmVFbGVtZW50LmF0dGFjaEV2ZW50KSB7XG4gICAgYWN0aXZlRWxlbWVudC5hdHRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbiAgfSBlbHNlIHtcbiAgICBhY3RpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Byb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UsIGZhbHNlKTtcbiAgfVxufVxuXG4vKipcbiAqIChGb3IgSUUgPD0xMSkgUmVtb3ZlcyB0aGUgZXZlbnQgbGlzdGVuZXJzIGZyb20gdGhlIGN1cnJlbnRseS10cmFja2VkIGVsZW1lbnQsXG4gKiBpZiBhbnkgZXhpc3RzLlxuICovXG5mdW5jdGlvbiBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpIHtcbiAgaWYgKCFhY3RpdmVFbGVtZW50KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gZGVsZXRlIHJlc3RvcmVzIHRoZSBvcmlnaW5hbCBwcm9wZXJ0eSBkZWZpbml0aW9uXG4gIGRlbGV0ZSBhY3RpdmVFbGVtZW50LnZhbHVlO1xuXG4gIGlmIChhY3RpdmVFbGVtZW50LmRldGFjaEV2ZW50KSB7XG4gICAgYWN0aXZlRWxlbWVudC5kZXRhY2hFdmVudCgnb25wcm9wZXJ0eWNoYW5nZScsIGhhbmRsZVByb3BlcnR5Q2hhbmdlKTtcbiAgfSBlbHNlIHtcbiAgICBhY3RpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Byb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UsIGZhbHNlKTtcbiAgfVxuXG4gIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG4gIGFjdGl2ZUVsZW1lbnRWYWx1ZSA9IG51bGw7XG4gIGFjdGl2ZUVsZW1lbnRWYWx1ZVByb3AgPSBudWxsO1xufVxuXG4vKipcbiAqIChGb3IgSUUgPD0xMSkgSGFuZGxlcyBhIHByb3BlcnR5Y2hhbmdlIGV2ZW50LCBzZW5kaW5nIGEgYGNoYW5nZWAgZXZlbnQgaWZcbiAqIHRoZSB2YWx1ZSBvZiB0aGUgYWN0aXZlIGVsZW1lbnQgaGFzIGNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZVByb3BlcnR5Q2hhbmdlKG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChuYXRpdmVFdmVudC5wcm9wZXJ0eU5hbWUgIT09ICd2YWx1ZScpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHZhbHVlID0gbmF0aXZlRXZlbnQuc3JjRWxlbWVudC52YWx1ZTtcbiAgaWYgKHZhbHVlID09PSBhY3RpdmVFbGVtZW50VmFsdWUpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgYWN0aXZlRWxlbWVudFZhbHVlID0gdmFsdWU7XG5cbiAgbWFudWFsRGlzcGF0Y2hDaGFuZ2VFdmVudChuYXRpdmVFdmVudCk7XG59XG5cbi8qKlxuICogSWYgYSBgY2hhbmdlYCBldmVudCBzaG91bGQgYmUgZmlyZWQsIHJldHVybnMgdGhlIHRhcmdldCdzIElELlxuICovXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QpIHtcbiAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcElucHV0Jykge1xuICAgIC8vIEluIG1vZGVybiBicm93c2VycyAoaS5lLiwgbm90IElFOCBvciBJRTkpLCB0aGUgaW5wdXQgZXZlbnQgaXMgZXhhY3RseVxuICAgIC8vIHdoYXQgd2Ugd2FudCBzbyBmYWxsIHRocm91Z2ggaGVyZSBhbmQgdHJpZ2dlciBhbiBhYnN0cmFjdCBldmVudFxuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRJRSh0b3BMZXZlbFR5cGUsIHRhcmdldCwgdGFyZ2V0SW5zdCkge1xuICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wRm9jdXMnKSB7XG4gICAgLy8gSW4gSUU4LCB3ZSBjYW4gY2FwdHVyZSBhbG1vc3QgYWxsIC52YWx1ZSBjaGFuZ2VzIGJ5IGFkZGluZyBhXG4gICAgLy8gcHJvcGVydHljaGFuZ2UgaGFuZGxlciBhbmQgbG9va2luZyBmb3IgZXZlbnRzIHdpdGggcHJvcGVydHlOYW1lXG4gICAgLy8gZXF1YWwgdG8gJ3ZhbHVlJ1xuICAgIC8vIEluIElFOS0xMSwgcHJvcGVydHljaGFuZ2UgZmlyZXMgZm9yIG1vc3QgaW5wdXQgZXZlbnRzIGJ1dCBpcyBidWdneSBhbmRcbiAgICAvLyBkb2Vzbid0IGZpcmUgd2hlbiB0ZXh0IGlzIGRlbGV0ZWQsIGJ1dCBjb252ZW5pZW50bHksIHNlbGVjdGlvbmNoYW5nZVxuICAgIC8vIGFwcGVhcnMgdG8gZmlyZSBpbiBhbGwgb2YgdGhlIHJlbWFpbmluZyBjYXNlcyBzbyB3ZSBjYXRjaCB0aG9zZSBhbmRcbiAgICAvLyBmb3J3YXJkIHRoZSBldmVudCBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWRcbiAgICAvLyBJbiBlaXRoZXIgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byBjYWxsIHRoZSBldmVudCBoYW5kbGVyIGlmIHRoZSB2YWx1ZVxuICAgIC8vIGlzIGNoYW5nZWQgZnJvbSBKUyBzbyB3ZSByZWRlZmluZSBhIHNldHRlciBmb3IgYC52YWx1ZWAgdGhhdCB1cGRhdGVzXG4gICAgLy8gb3VyIGFjdGl2ZUVsZW1lbnRWYWx1ZSB2YXJpYWJsZSwgYWxsb3dpbmcgdXMgdG8gaWdub3JlIHRob3NlIGNoYW5nZXNcbiAgICAvL1xuICAgIC8vIHN0b3BXYXRjaGluZygpIHNob3VsZCBiZSBhIG5vb3AgaGVyZSBidXQgd2UgY2FsbCBpdCBqdXN0IGluIGNhc2Ugd2VcbiAgICAvLyBtaXNzZWQgYSBibHVyIGV2ZW50IHNvbWVob3cuXG4gICAgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTtcbiAgICBzdGFydFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UodGFyZ2V0LCB0YXJnZXRJbnN0KTtcbiAgfSBlbHNlIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BCbHVyJykge1xuICAgIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCk7XG4gIH1cbn1cblxuLy8gRm9yIElFOCBhbmQgSUU5LlxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnRJRSh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QpIHtcbiAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcFNlbGVjdGlvbkNoYW5nZScgfHwgdG9wTGV2ZWxUeXBlID09PSAndG9wS2V5VXAnIHx8IHRvcExldmVsVHlwZSA9PT0gJ3RvcEtleURvd24nKSB7XG4gICAgLy8gT24gdGhlIHNlbGVjdGlvbmNoYW5nZSBldmVudCwgdGhlIHRhcmdldCBpcyBqdXN0IGRvY3VtZW50IHdoaWNoIGlzbid0XG4gICAgLy8gaGVscGZ1bCBmb3IgdXMgc28ganVzdCBjaGVjayBhY3RpdmVFbGVtZW50IGluc3RlYWQuXG4gICAgLy9cbiAgICAvLyA5OSUgb2YgdGhlIHRpbWUsIGtleWRvd24gYW5kIGtleXVwIGFyZW4ndCBuZWNlc3NhcnkuIElFOCBmYWlscyB0byBmaXJlXG4gICAgLy8gcHJvcGVydHljaGFuZ2Ugb24gdGhlIGZpcnN0IGlucHV0IGV2ZW50IGFmdGVyIHNldHRpbmcgYHZhbHVlYCBmcm9tIGFcbiAgICAvLyBzY3JpcHQgYW5kIGZpcmVzIG9ubHkga2V5ZG93biwga2V5cHJlc3MsIGtleXVwLiBDYXRjaGluZyBrZXl1cCB1c3VhbGx5XG4gICAgLy8gZ2V0cyBpdCBhbmQgY2F0Y2hpbmcga2V5ZG93biBsZXRzIHVzIGZpcmUgYW4gZXZlbnQgZm9yIHRoZSBmaXJzdFxuICAgIC8vIGtleXN0cm9rZSBpZiB1c2VyIGRvZXMgYSBrZXkgcmVwZWF0IChpdCdsbCBiZSBhIGxpdHRsZSBkZWxheWVkOiByaWdodFxuICAgIC8vIGJlZm9yZSB0aGUgc2Vjb25kIGtleXN0cm9rZSkuIE90aGVyIGlucHV0IG1ldGhvZHMgKGUuZy4sIHBhc3RlKSBzZWVtIHRvXG4gICAgLy8gZmlyZSBzZWxlY3Rpb25jaGFuZ2Ugbm9ybWFsbHkuXG4gICAgaWYgKGFjdGl2ZUVsZW1lbnQgJiYgYWN0aXZlRWxlbWVudC52YWx1ZSAhPT0gYWN0aXZlRWxlbWVudFZhbHVlKSB7XG4gICAgICBhY3RpdmVFbGVtZW50VmFsdWUgPSBhY3RpdmVFbGVtZW50LnZhbHVlO1xuICAgICAgcmV0dXJuIGFjdGl2ZUVsZW1lbnRJbnN0O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgY2xpY2tgIGV2ZW50XG4gKi9cbmZ1bmN0aW9uIHNob3VsZFVzZUNsaWNrRXZlbnQoZWxlbSkge1xuICAvLyBVc2UgdGhlIGBjbGlja2AgZXZlbnQgdG8gZGV0ZWN0IGNoYW5nZXMgdG8gY2hlY2tib3ggYW5kIHJhZGlvIGlucHV0cy5cbiAgLy8gVGhpcyBhcHByb2FjaCB3b3JrcyBhY3Jvc3MgYWxsIGJyb3dzZXJzLCB3aGVyZWFzIGBjaGFuZ2VgIGRvZXMgbm90IGZpcmVcbiAgLy8gdW50aWwgYGJsdXJgIGluIElFOC5cbiAgcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmIChlbGVtLnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbS50eXBlID09PSAncmFkaW8nKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0KSB7XG4gIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BDbGljaycpIHtcbiAgICByZXR1cm4gdGFyZ2V0SW5zdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVDb250cm9sbGVkSW5wdXRCbHVyKGluc3QsIG5vZGUpIHtcbiAgLy8gVE9ETzogSW4gSUUsIGluc3QgaXMgb2NjYXNpb25hbGx5IG51bGwuIFdoeT9cbiAgaWYgKGluc3QgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEZpYmVyIGFuZCBSZWFjdERPTSBrZWVwIHdyYXBwZXIgc3RhdGUgaW4gc2VwYXJhdGUgcGxhY2VzXG4gIHZhciBzdGF0ZSA9IGluc3QuX3dyYXBwZXJTdGF0ZSB8fCBub2RlLl93cmFwcGVyU3RhdGU7XG5cbiAgaWYgKCFzdGF0ZSB8fCAhc3RhdGUuY29udHJvbGxlZCB8fCBub2RlLnR5cGUgIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gSWYgY29udHJvbGxlZCwgYXNzaWduIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb24gYmx1clxuICB2YXIgdmFsdWUgPSAnJyArIG5vZGUudmFsdWU7XG4gIGlmIChub2RlLmdldEF0dHJpYnV0ZSgndmFsdWUnKSAhPT0gdmFsdWUpIHtcbiAgICBub2RlLnNldEF0dHJpYnV0ZSgndmFsdWUnLCB2YWx1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIHBsdWdpbiBjcmVhdGVzIGFuIGBvbkNoYW5nZWAgZXZlbnQgdGhhdCBub3JtYWxpemVzIGNoYW5nZSBldmVudHNcbiAqIGFjcm9zcyBmb3JtIGVsZW1lbnRzLiBUaGlzIGV2ZW50IGZpcmVzIGF0IGEgdGltZSB3aGVuIGl0J3MgcG9zc2libGUgdG9cbiAqIGNoYW5nZSB0aGUgZWxlbWVudCdzIHZhbHVlIHdpdGhvdXQgc2VlaW5nIGEgZmxpY2tlci5cbiAqXG4gKiBTdXBwb3J0ZWQgZWxlbWVudHMgYXJlOlxuICogLSBpbnB1dCAoc2VlIGBpc1RleHRJbnB1dEVsZW1lbnRgKVxuICogLSB0ZXh0YXJlYVxuICogLSBzZWxlY3RcbiAqL1xudmFyIENoYW5nZUV2ZW50UGx1Z2luID0ge1xuXG4gIGV2ZW50VHlwZXM6IGV2ZW50VHlwZXMsXG5cbiAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdmFyIHRhcmdldE5vZGUgPSB0YXJnZXRJbnN0ID8gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UodGFyZ2V0SW5zdCkgOiB3aW5kb3c7XG5cbiAgICB2YXIgZ2V0VGFyZ2V0SW5zdEZ1bmMsIGhhbmRsZUV2ZW50RnVuYztcbiAgICBpZiAoc2hvdWxkVXNlQ2hhbmdlRXZlbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICAgIGlmIChkb2VzQ2hhbmdlRXZlbnRCdWJibGUpIHtcbiAgICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBoYW5kbGVFdmVudEZ1bmMgPSBoYW5kbGVFdmVudHNGb3JDaGFuZ2VFdmVudElFODtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzVGV4dElucHV0RWxlbWVudCh0YXJnZXROb2RlKSkge1xuICAgICAgaWYgKGlzSW5wdXRFdmVudFN1cHBvcnRlZCkge1xuICAgICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2V0VGFyZ2V0SW5zdEZ1bmMgPSBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudElFO1xuICAgICAgICBoYW5kbGVFdmVudEZ1bmMgPSBoYW5kbGVFdmVudHNGb3JJbnB1dEV2ZW50SUU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChzaG91bGRVc2VDbGlja0V2ZW50KHRhcmdldE5vZGUpKSB7XG4gICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDbGlja0V2ZW50O1xuICAgIH1cblxuICAgIGlmIChnZXRUYXJnZXRJbnN0RnVuYykge1xuICAgICAgdmFyIGluc3QgPSBnZXRUYXJnZXRJbnN0RnVuYyh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QpO1xuICAgICAgaWYgKGluc3QpIHtcbiAgICAgICAgdmFyIGV2ZW50ID0gU3ludGhldGljRXZlbnQuZ2V0UG9vbGVkKGV2ZW50VHlwZXMuY2hhbmdlLCBpbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgICBldmVudC50eXBlID0gJ2NoYW5nZSc7XG4gICAgICAgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhldmVudCk7XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFuZGxlRXZlbnRGdW5jKSB7XG4gICAgICBoYW5kbGVFdmVudEZ1bmModG9wTGV2ZWxUeXBlLCB0YXJnZXROb2RlLCB0YXJnZXRJbnN0KTtcbiAgICB9XG5cbiAgICAvLyBXaGVuIGJsdXJyaW5nLCBzZXQgdGhlIHZhbHVlIGF0dHJpYnV0ZSBmb3IgbnVtYmVyIGlucHV0c1xuICAgIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BCbHVyJykge1xuICAgICAgaGFuZGxlQ29udHJvbGxlZElucHV0Qmx1cih0YXJnZXRJbnN0LCB0YXJnZXROb2RlKTtcbiAgICB9XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDaGFuZ2VFdmVudFBsdWdpbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NTGF6eVRyZWUgPSByZXF1aXJlKCcuL0RPTUxhenlUcmVlJyk7XG52YXIgRGFuZ2VyID0gcmVxdWlyZSgnLi9EYW5nZXInKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xuXG52YXIgY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbiA9IHJlcXVpcmUoJy4vY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbicpO1xudmFyIHNldElubmVySFRNTCA9IHJlcXVpcmUoJy4vc2V0SW5uZXJIVE1MJyk7XG52YXIgc2V0VGV4dENvbnRlbnQgPSByZXF1aXJlKCcuL3NldFRleHRDb250ZW50Jyk7XG5cbmZ1bmN0aW9uIGdldE5vZGVBZnRlcihwYXJlbnROb2RlLCBub2RlKSB7XG4gIC8vIFNwZWNpYWwgY2FzZSBmb3IgdGV4dCBjb21wb25lbnRzLCB3aGljaCByZXR1cm4gW29wZW4sIGNsb3NlXSBjb21tZW50c1xuICAvLyBmcm9tIGdldEhvc3ROb2RlLlxuICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgIG5vZGUgPSBub2RlWzFdO1xuICB9XG4gIHJldHVybiBub2RlID8gbm9kZS5uZXh0U2libGluZyA6IHBhcmVudE5vZGUuZmlyc3RDaGlsZDtcbn1cblxuLyoqXG4gKiBJbnNlcnRzIGBjaGlsZE5vZGVgIGFzIGEgY2hpbGQgb2YgYHBhcmVudE5vZGVgIGF0IHRoZSBgaW5kZXhgLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gcGFyZW50Tm9kZSBQYXJlbnQgbm9kZSBpbiB3aGljaCB0byBpbnNlcnQuXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNoaWxkTm9kZSBDaGlsZCBub2RlIHRvIGluc2VydC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCBhdCB3aGljaCB0byBpbnNlcnQgdGhlIGNoaWxkLlxuICogQGludGVybmFsXG4gKi9cbnZhciBpbnNlcnRDaGlsZEF0ID0gY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbiAocGFyZW50Tm9kZSwgY2hpbGROb2RlLCByZWZlcmVuY2VOb2RlKSB7XG4gIC8vIFdlIHJlbHkgZXhjbHVzaXZlbHkgb24gYGluc2VydEJlZm9yZShub2RlLCBudWxsKWAgaW5zdGVhZCBvZiBhbHNvIHVzaW5nXG4gIC8vIGBhcHBlbmRDaGlsZChub2RlKWAuIChVc2luZyBgdW5kZWZpbmVkYCBpcyBub3QgYWxsb3dlZCBieSBhbGwgYnJvd3NlcnMgc29cbiAgLy8gd2UgYXJlIGNhcmVmdWwgdG8gdXNlIGBudWxsYC4pXG4gIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNoaWxkTm9kZSwgcmVmZXJlbmNlTm9kZSk7XG59KTtcblxuZnVuY3Rpb24gaW5zZXJ0TGF6eVRyZWVDaGlsZEF0KHBhcmVudE5vZGUsIGNoaWxkVHJlZSwgcmVmZXJlbmNlTm9kZSkge1xuICBET01MYXp5VHJlZS5pbnNlcnRUcmVlQmVmb3JlKHBhcmVudE5vZGUsIGNoaWxkVHJlZSwgcmVmZXJlbmNlTm9kZSk7XG59XG5cbmZ1bmN0aW9uIG1vdmVDaGlsZChwYXJlbnROb2RlLCBjaGlsZE5vZGUsIHJlZmVyZW5jZU5vZGUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGROb2RlKSkge1xuICAgIG1vdmVEZWxpbWl0ZWRUZXh0KHBhcmVudE5vZGUsIGNoaWxkTm9kZVswXSwgY2hpbGROb2RlWzFdLCByZWZlcmVuY2VOb2RlKTtcbiAgfSBlbHNlIHtcbiAgICBpbnNlcnRDaGlsZEF0KHBhcmVudE5vZGUsIGNoaWxkTm9kZSwgcmVmZXJlbmNlTm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGQocGFyZW50Tm9kZSwgY2hpbGROb2RlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkTm9kZSkpIHtcbiAgICB2YXIgY2xvc2luZ0NvbW1lbnQgPSBjaGlsZE5vZGVbMV07XG4gICAgY2hpbGROb2RlID0gY2hpbGROb2RlWzBdO1xuICAgIHJlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSwgY2hpbGROb2RlLCBjbG9zaW5nQ29tbWVudCk7XG4gICAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9zaW5nQ29tbWVudCk7XG4gIH1cbiAgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjaGlsZE5vZGUpO1xufVxuXG5mdW5jdGlvbiBtb3ZlRGVsaW1pdGVkVGV4dChwYXJlbnROb2RlLCBvcGVuaW5nQ29tbWVudCwgY2xvc2luZ0NvbW1lbnQsIHJlZmVyZW5jZU5vZGUpIHtcbiAgdmFyIG5vZGUgPSBvcGVuaW5nQ29tbWVudDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICB2YXIgbmV4dE5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgIGluc2VydENoaWxkQXQocGFyZW50Tm9kZSwgbm9kZSwgcmVmZXJlbmNlTm9kZSk7XG4gICAgaWYgKG5vZGUgPT09IGNsb3NpbmdDb21tZW50KSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgbm9kZSA9IG5leHROb2RlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSwgc3RhcnROb2RlLCBjbG9zaW5nQ29tbWVudCkge1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBub2RlID0gc3RhcnROb2RlLm5leHRTaWJsaW5nO1xuICAgIGlmIChub2RlID09PSBjbG9zaW5nQ29tbWVudCkge1xuICAgICAgLy8gVGhlIGNsb3NpbmcgY29tbWVudCBpcyByZW1vdmVkIGJ5IFJlYWN0TXVsdGlDaGlsZC5cbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiByZXBsYWNlRGVsaW1pdGVkVGV4dChvcGVuaW5nQ29tbWVudCwgY2xvc2luZ0NvbW1lbnQsIHN0cmluZ1RleHQpIHtcbiAgdmFyIHBhcmVudE5vZGUgPSBvcGVuaW5nQ29tbWVudC5wYXJlbnROb2RlO1xuICB2YXIgbm9kZUFmdGVyQ29tbWVudCA9IG9wZW5pbmdDb21tZW50Lm5leHRTaWJsaW5nO1xuICBpZiAobm9kZUFmdGVyQ29tbWVudCA9PT0gY2xvc2luZ0NvbW1lbnQpIHtcbiAgICAvLyBUaGVyZSBhcmUgbm8gdGV4dCBub2RlcyBiZXR3ZWVuIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIGNvbW1lbnRzOyBpbnNlcnRcbiAgICAvLyBhIG5ldyBvbmUgaWYgc3RyaW5nVGV4dCBpc24ndCBlbXB0eS5cbiAgICBpZiAoc3RyaW5nVGV4dCkge1xuICAgICAgaW5zZXJ0Q2hpbGRBdChwYXJlbnROb2RlLCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzdHJpbmdUZXh0KSwgbm9kZUFmdGVyQ29tbWVudCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChzdHJpbmdUZXh0KSB7XG4gICAgICAvLyBTZXQgdGhlIHRleHQgY29udGVudCBvZiB0aGUgZmlyc3Qgbm9kZSBhZnRlciB0aGUgb3BlbmluZyBjb21tZW50LCBhbmRcbiAgICAgIC8vIHJlbW92ZSBhbGwgZm9sbG93aW5nIG5vZGVzIHVwIHVudGlsIHRoZSBjbG9zaW5nIGNvbW1lbnQuXG4gICAgICBzZXRUZXh0Q29udGVudChub2RlQWZ0ZXJDb21tZW50LCBzdHJpbmdUZXh0KTtcbiAgICAgIHJlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSwgbm9kZUFmdGVyQ29tbWVudCwgY2xvc2luZ0NvbW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZW1vdmVEZWxpbWl0ZWRUZXh0KHBhcmVudE5vZGUsIG9wZW5pbmdDb21tZW50LCBjbG9zaW5nQ29tbWVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICBpbnN0YW5jZUlEOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShvcGVuaW5nQ29tbWVudCkuX2RlYnVnSUQsXG4gICAgICB0eXBlOiAncmVwbGFjZSB0ZXh0JyxcbiAgICAgIHBheWxvYWQ6IHN0cmluZ1RleHRcbiAgICB9KTtcbiAgfVxufVxuXG52YXIgZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAgPSBEYW5nZXIuZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXA7XG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAgPSBmdW5jdGlvbiAob2xkQ2hpbGQsIG1hcmt1cCwgcHJldkluc3RhbmNlKSB7XG4gICAgRGFuZ2VyLmRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwKG9sZENoaWxkLCBtYXJrdXApO1xuICAgIGlmIChwcmV2SW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHtcbiAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe1xuICAgICAgICBpbnN0YW5jZUlEOiBwcmV2SW5zdGFuY2UuX2RlYnVnSUQsXG4gICAgICAgIHR5cGU6ICdyZXBsYWNlIHdpdGgnLFxuICAgICAgICBwYXlsb2FkOiBtYXJrdXAudG9TdHJpbmcoKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBuZXh0SW5zdGFuY2UgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShtYXJrdXAubm9kZSk7XG4gICAgICBpZiAobmV4dEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe1xuICAgICAgICAgIGluc3RhbmNlSUQ6IG5leHRJbnN0YW5jZS5fZGVidWdJRCxcbiAgICAgICAgICB0eXBlOiAnbW91bnQnLFxuICAgICAgICAgIHBheWxvYWQ6IG1hcmt1cC50b1N0cmluZygpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBPcGVyYXRpb25zIGZvciB1cGRhdGluZyB3aXRoIERPTSBjaGlsZHJlbi5cbiAqL1xudmFyIERPTUNoaWxkcmVuT3BlcmF0aW9ucyA9IHtcblxuICBkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cDogZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAsXG5cbiAgcmVwbGFjZURlbGltaXRlZFRleHQ6IHJlcGxhY2VEZWxpbWl0ZWRUZXh0LFxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGEgY29tcG9uZW50J3MgY2hpbGRyZW4gYnkgcHJvY2Vzc2luZyBhIHNlcmllcyBvZiB1cGRhdGVzLiBUaGVcbiAgICogdXBkYXRlIGNvbmZpZ3VyYXRpb25zIGFyZSBlYWNoIGV4cGVjdGVkIHRvIGhhdmUgYSBgcGFyZW50Tm9kZWAgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXk8b2JqZWN0Pn0gdXBkYXRlcyBMaXN0IG9mIHVwZGF0ZSBjb25maWd1cmF0aW9ucy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm9jZXNzVXBkYXRlczogZnVuY3Rpb24gKHBhcmVudE5vZGUsIHVwZGF0ZXMpIHtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBwYXJlbnROb2RlRGVidWdJRCA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKHBhcmVudE5vZGUpLl9kZWJ1Z0lEO1xuICAgIH1cblxuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgdXBkYXRlcy5sZW5ndGg7IGsrKykge1xuICAgICAgdmFyIHVwZGF0ZSA9IHVwZGF0ZXNba107XG4gICAgICBzd2l0Y2ggKHVwZGF0ZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ0lOU0VSVF9NQVJLVVAnOlxuICAgICAgICAgIGluc2VydExhenlUcmVlQ2hpbGRBdChwYXJlbnROb2RlLCB1cGRhdGUuY29udGVudCwgZ2V0Tm9kZUFmdGVyKHBhcmVudE5vZGUsIHVwZGF0ZS5hZnRlck5vZGUpKTtcbiAgICAgICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe1xuICAgICAgICAgICAgICBpbnN0YW5jZUlEOiBwYXJlbnROb2RlRGVidWdJRCxcbiAgICAgICAgICAgICAgdHlwZTogJ2luc2VydCBjaGlsZCcsXG4gICAgICAgICAgICAgIHBheWxvYWQ6IHsgdG9JbmRleDogdXBkYXRlLnRvSW5kZXgsIGNvbnRlbnQ6IHVwZGF0ZS5jb250ZW50LnRvU3RyaW5nKCkgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdNT1ZFX0VYSVNUSU5HJzpcbiAgICAgICAgICBtb3ZlQ2hpbGQocGFyZW50Tm9kZSwgdXBkYXRlLmZyb21Ob2RlLCBnZXROb2RlQWZ0ZXIocGFyZW50Tm9kZSwgdXBkYXRlLmFmdGVyTm9kZSkpO1xuICAgICAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgICAgICAgIGluc3RhbmNlSUQ6IHBhcmVudE5vZGVEZWJ1Z0lELFxuICAgICAgICAgICAgICB0eXBlOiAnbW92ZSBjaGlsZCcsXG4gICAgICAgICAgICAgIHBheWxvYWQ6IHsgZnJvbUluZGV4OiB1cGRhdGUuZnJvbUluZGV4LCB0b0luZGV4OiB1cGRhdGUudG9JbmRleCB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1NFVF9NQVJLVVAnOlxuICAgICAgICAgIHNldElubmVySFRNTChwYXJlbnROb2RlLCB1cGRhdGUuY29udGVudCk7XG4gICAgICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VJRDogcGFyZW50Tm9kZURlYnVnSUQsXG4gICAgICAgICAgICAgIHR5cGU6ICdyZXBsYWNlIGNoaWxkcmVuJyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLmNvbnRlbnQudG9TdHJpbmcoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdURVhUX0NPTlRFTlQnOlxuICAgICAgICAgIHNldFRleHRDb250ZW50KHBhcmVudE5vZGUsIHVwZGF0ZS5jb250ZW50KTtcbiAgICAgICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe1xuICAgICAgICAgICAgICBpbnN0YW5jZUlEOiBwYXJlbnROb2RlRGVidWdJRCxcbiAgICAgICAgICAgICAgdHlwZTogJ3JlcGxhY2UgdGV4dCcsXG4gICAgICAgICAgICAgIHBheWxvYWQ6IHVwZGF0ZS5jb250ZW50LnRvU3RyaW5nKClcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnUkVNT1ZFX05PREUnOlxuICAgICAgICAgIHJlbW92ZUNoaWxkKHBhcmVudE5vZGUsIHVwZGF0ZS5mcm9tTm9kZSk7XG4gICAgICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VJRDogcGFyZW50Tm9kZURlYnVnSUQsXG4gICAgICAgICAgICAgIHR5cGU6ICdyZW1vdmUgY2hpbGQnLFxuICAgICAgICAgICAgICBwYXlsb2FkOiB7IGZyb21JbmRleDogdXBkYXRlLmZyb21JbmRleCB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRE9NQ2hpbGRyZW5PcGVyYXRpb25zOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01OYW1lc3BhY2VzID0gcmVxdWlyZSgnLi9ET01OYW1lc3BhY2VzJyk7XG52YXIgc2V0SW5uZXJIVE1MID0gcmVxdWlyZSgnLi9zZXRJbm5lckhUTUwnKTtcblxudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSByZXF1aXJlKCcuL2NyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24nKTtcbnZhciBzZXRUZXh0Q29udGVudCA9IHJlcXVpcmUoJy4vc2V0VGV4dENvbnRlbnQnKTtcblxudmFyIEVMRU1FTlRfTk9ERV9UWVBFID0gMTtcbnZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFX1RZUEUgPSAxMTtcblxuLyoqXG4gKiBJbiBJRSAoOC0xMSkgYW5kIEVkZ2UsIGFwcGVuZGluZyBub2RlcyB3aXRoIG5vIGNoaWxkcmVuIGlzIGRyYW1hdGljYWxseVxuICogZmFzdGVyIHRoYW4gYXBwZW5kaW5nIGEgZnVsbCBzdWJ0cmVlLCBzbyB3ZSBlc3NlbnRpYWxseSBxdWV1ZSB1cCB0aGVcbiAqIC5hcHBlbmRDaGlsZCBjYWxscyBoZXJlIGFuZCBhcHBseSB0aGVtIHNvIGVhY2ggbm9kZSBpcyBhZGRlZCB0byBpdHMgcGFyZW50XG4gKiBiZWZvcmUgYW55IGNoaWxkcmVuIGFyZSBhZGRlZC5cbiAqXG4gKiBJbiBvdGhlciBicm93c2VycywgZG9pbmcgc28gaXMgc2xvd2VyIG9yIG5ldXRyYWwgY29tcGFyZWQgdG8gdGhlIG90aGVyIG9yZGVyXG4gKiAoaW4gRmlyZWZveCwgdHdpY2UgYXMgc2xvdykgc28gd2Ugb25seSBkbyB0aGlzIGludmVyc2lvbiBpbiBJRS5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3NwaWN5ai9pbm5lcmh0bWwtdnMtY3JlYXRlZWxlbWVudC12cy1jbG9uZW5vZGUuXG4gKi9cbnZhciBlbmFibGVMYXp5ID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbmF2aWdhdG9yLnVzZXJBZ2VudCA9PT0gJ3N0cmluZycgJiYgL1xcYkVkZ2VcXC9cXGQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG5cbmZ1bmN0aW9uIGluc2VydFRyZWVDaGlsZHJlbih0cmVlKSB7XG4gIGlmICghZW5hYmxlTGF6eSkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbm9kZSA9IHRyZWUubm9kZTtcbiAgdmFyIGNoaWxkcmVuID0gdHJlZS5jaGlsZHJlbjtcbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGluc2VydFRyZWVCZWZvcmUobm9kZSwgY2hpbGRyZW5baV0sIG51bGwpO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0cmVlLmh0bWwgIT0gbnVsbCkge1xuICAgIHNldElubmVySFRNTChub2RlLCB0cmVlLmh0bWwpO1xuICB9IGVsc2UgaWYgKHRyZWUudGV4dCAhPSBudWxsKSB7XG4gICAgc2V0VGV4dENvbnRlbnQobm9kZSwgdHJlZS50ZXh0KTtcbiAgfVxufVxuXG52YXIgaW5zZXJ0VHJlZUJlZm9yZSA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKHBhcmVudE5vZGUsIHRyZWUsIHJlZmVyZW5jZU5vZGUpIHtcbiAgLy8gRG9jdW1lbnRGcmFnbWVudHMgYXJlbid0IGFjdHVhbGx5IHBhcnQgb2YgdGhlIERPTSBhZnRlciBpbnNlcnRpb24gc29cbiAgLy8gYXBwZW5kaW5nIGNoaWxkcmVuIHdvbid0IHVwZGF0ZSB0aGUgRE9NLiBXZSBuZWVkIHRvIGVuc3VyZSB0aGUgZnJhZ21lbnRcbiAgLy8gaXMgcHJvcGVybHkgcG9wdWxhdGVkIGZpcnN0LCBicmVha2luZyBvdXQgb2Ygb3VyIGxhenkgYXBwcm9hY2ggZm9yIGp1c3RcbiAgLy8gdGhpcyBsZXZlbC4gQWxzbywgc29tZSA8b2JqZWN0PiBwbHVnaW5zIChsaWtlIEZsYXNoIFBsYXllcikgd2lsbCByZWFkXG4gIC8vIDxwYXJhbT4gbm9kZXMgaW1tZWRpYXRlbHkgdXBvbiBpbnNlcnRpb24gaW50byB0aGUgRE9NLCBzbyA8b2JqZWN0PlxuICAvLyBtdXN0IGFsc28gYmUgcG9wdWxhdGVkIHByaW9yIHRvIGluc2VydGlvbiBpbnRvIHRoZSBET00uXG4gIGlmICh0cmVlLm5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREVfVFlQRSB8fCB0cmVlLm5vZGUubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERV9UWVBFICYmIHRyZWUubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnb2JqZWN0JyAmJiAodHJlZS5ub2RlLm5hbWVzcGFjZVVSSSA9PSBudWxsIHx8IHRyZWUubm9kZS5uYW1lc3BhY2VVUkkgPT09IERPTU5hbWVzcGFjZXMuaHRtbCkpIHtcbiAgICBpbnNlcnRUcmVlQ2hpbGRyZW4odHJlZSk7XG4gICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodHJlZS5ub2RlLCByZWZlcmVuY2VOb2RlKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZSh0cmVlLm5vZGUsIHJlZmVyZW5jZU5vZGUpO1xuICAgIGluc2VydFRyZWVDaGlsZHJlbih0cmVlKTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIHJlcGxhY2VDaGlsZFdpdGhUcmVlKG9sZE5vZGUsIG5ld1RyZWUpIHtcbiAgb2xkTm9kZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdUcmVlLm5vZGUsIG9sZE5vZGUpO1xuICBpbnNlcnRUcmVlQ2hpbGRyZW4obmV3VHJlZSk7XG59XG5cbmZ1bmN0aW9uIHF1ZXVlQ2hpbGQocGFyZW50VHJlZSwgY2hpbGRUcmVlKSB7XG4gIGlmIChlbmFibGVMYXp5KSB7XG4gICAgcGFyZW50VHJlZS5jaGlsZHJlbi5wdXNoKGNoaWxkVHJlZSk7XG4gIH0gZWxzZSB7XG4gICAgcGFyZW50VHJlZS5ub2RlLmFwcGVuZENoaWxkKGNoaWxkVHJlZS5ub2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBxdWV1ZUhUTUwodHJlZSwgaHRtbCkge1xuICBpZiAoZW5hYmxlTGF6eSkge1xuICAgIHRyZWUuaHRtbCA9IGh0bWw7XG4gIH0gZWxzZSB7XG4gICAgc2V0SW5uZXJIVE1MKHRyZWUubm9kZSwgaHRtbCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcXVldWVUZXh0KHRyZWUsIHRleHQpIHtcbiAgaWYgKGVuYWJsZUxhenkpIHtcbiAgICB0cmVlLnRleHQgPSB0ZXh0O1xuICB9IGVsc2Uge1xuICAgIHNldFRleHRDb250ZW50KHRyZWUubm9kZSwgdGV4dCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gIHJldHVybiB0aGlzLm5vZGUubm9kZU5hbWU7XG59XG5cbmZ1bmN0aW9uIERPTUxhenlUcmVlKG5vZGUpIHtcbiAgcmV0dXJuIHtcbiAgICBub2RlOiBub2RlLFxuICAgIGNoaWxkcmVuOiBbXSxcbiAgICBodG1sOiBudWxsLFxuICAgIHRleHQ6IG51bGwsXG4gICAgdG9TdHJpbmc6IHRvU3RyaW5nXG4gIH07XG59XG5cbkRPTUxhenlUcmVlLmluc2VydFRyZWVCZWZvcmUgPSBpbnNlcnRUcmVlQmVmb3JlO1xuRE9NTGF6eVRyZWUucmVwbGFjZUNoaWxkV2l0aFRyZWUgPSByZXBsYWNlQ2hpbGRXaXRoVHJlZTtcbkRPTUxhenlUcmVlLnF1ZXVlQ2hpbGQgPSBxdWV1ZUNoaWxkO1xuRE9NTGF6eVRyZWUucXVldWVIVE1MID0gcXVldWVIVE1MO1xuRE9NTGF6eVRyZWUucXVldWVUZXh0ID0gcXVldWVUZXh0O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERPTUxhenlUcmVlOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01OYW1lc3BhY2VzID0ge1xuICBodG1sOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsXG4gIG1hdGhtbDogJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnLFxuICBzdmc6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zydcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRE9NTmFtZXNwYWNlczsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbmZ1bmN0aW9uIGNoZWNrTWFzayh2YWx1ZSwgYml0bWFzaykge1xuICByZXR1cm4gKHZhbHVlICYgYml0bWFzaykgPT09IGJpdG1hc2s7XG59XG5cbnZhciBET01Qcm9wZXJ0eUluamVjdGlvbiA9IHtcbiAgLyoqXG4gICAqIE1hcHBpbmcgZnJvbSBub3JtYWxpemVkLCBjYW1lbGNhc2VkIHByb3BlcnR5IG5hbWVzIHRvIGEgY29uZmlndXJhdGlvbiB0aGF0XG4gICAqIHNwZWNpZmllcyBob3cgdGhlIGFzc29jaWF0ZWQgRE9NIHByb3BlcnR5IHNob3VsZCBiZSBhY2Nlc3NlZCBvciByZW5kZXJlZC5cbiAgICovXG4gIE1VU1RfVVNFX1BST1BFUlRZOiAweDEsXG4gIEhBU19CT09MRUFOX1ZBTFVFOiAweDQsXG4gIEhBU19OVU1FUklDX1ZBTFVFOiAweDgsXG4gIEhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFOiAweDEwIHwgMHg4LFxuICBIQVNfT1ZFUkxPQURFRF9CT09MRUFOX1ZBTFVFOiAweDIwLFxuXG4gIC8qKlxuICAgKiBJbmplY3Qgc29tZSBzcGVjaWFsaXplZCBrbm93bGVkZ2UgYWJvdXQgdGhlIERPTS4gVGhpcyB0YWtlcyBhIGNvbmZpZyBvYmplY3RcbiAgICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gICAqXG4gICAqIGlzQ3VzdG9tQXR0cmlidXRlOiBmdW5jdGlvbiB0aGF0IGdpdmVuIGFuIGF0dHJpYnV0ZSBuYW1lIHdpbGwgcmV0dXJuIHRydWVcbiAgICogaWYgaXQgY2FuIGJlIGluc2VydGVkIGludG8gdGhlIERPTSB2ZXJiYXRpbS4gVXNlZnVsIGZvciBkYXRhLSogb3IgYXJpYS0qXG4gICAqIGF0dHJpYnV0ZXMgd2hlcmUgaXQncyBpbXBvc3NpYmxlIHRvIGVudW1lcmF0ZSBhbGwgb2YgdGhlIHBvc3NpYmxlXG4gICAqIGF0dHJpYnV0ZSBuYW1lcyxcbiAgICpcbiAgICogUHJvcGVydGllczogb2JqZWN0IG1hcHBpbmcgRE9NIHByb3BlcnR5IG5hbWUgdG8gb25lIG9mIHRoZVxuICAgKiBET01Qcm9wZXJ0eUluamVjdGlvbiBjb25zdGFudHMgb3IgbnVsbC4gSWYgeW91ciBhdHRyaWJ1dGUgaXNuJ3QgaW4gaGVyZSxcbiAgICogaXQgd29uJ3QgZ2V0IHdyaXR0ZW4gdG8gdGhlIERPTS5cbiAgICpcbiAgICogRE9NQXR0cmlidXRlTmFtZXM6IG9iamVjdCBtYXBwaW5nIFJlYWN0IGF0dHJpYnV0ZSBuYW1lIHRvIHRoZSBET01cbiAgICogYXR0cmlidXRlIG5hbWUuIEF0dHJpYnV0ZSBuYW1lcyBub3Qgc3BlY2lmaWVkIHVzZSB0aGUgKipsb3dlcmNhc2UqKlxuICAgKiBub3JtYWxpemVkIG5hbWUuXG4gICAqXG4gICAqIERPTUF0dHJpYnV0ZU5hbWVzcGFjZXM6IG9iamVjdCBtYXBwaW5nIFJlYWN0IGF0dHJpYnV0ZSBuYW1lIHRvIHRoZSBET01cbiAgICogYXR0cmlidXRlIG5hbWVzcGFjZSBVUkwuIChBdHRyaWJ1dGUgbmFtZXMgbm90IHNwZWNpZmllZCB1c2Ugbm8gbmFtZXNwYWNlLilcbiAgICpcbiAgICogRE9NUHJvcGVydHlOYW1lczogc2ltaWxhciB0byBET01BdHRyaWJ1dGVOYW1lcyBidXQgZm9yIERPTSBwcm9wZXJ0aWVzLlxuICAgKiBQcm9wZXJ0eSBuYW1lcyBub3Qgc3BlY2lmaWVkIHVzZSB0aGUgbm9ybWFsaXplZCBuYW1lLlxuICAgKlxuICAgKiBET01NdXRhdGlvbk1ldGhvZHM6IFByb3BlcnRpZXMgdGhhdCByZXF1aXJlIHNwZWNpYWwgbXV0YXRpb24gbWV0aG9kcy4gSWZcbiAgICogYHZhbHVlYCBpcyB1bmRlZmluZWQsIHRoZSBtdXRhdGlvbiBtZXRob2Qgc2hvdWxkIHVuc2V0IHRoZSBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGRvbVByb3BlcnR5Q29uZmlnIHRoZSBjb25maWcgYXMgZGVzY3JpYmVkIGFib3ZlLlxuICAgKi9cbiAgaW5qZWN0RE9NUHJvcGVydHlDb25maWc6IGZ1bmN0aW9uIChkb21Qcm9wZXJ0eUNvbmZpZykge1xuICAgIHZhciBJbmplY3Rpb24gPSBET01Qcm9wZXJ0eUluamVjdGlvbjtcbiAgICB2YXIgUHJvcGVydGllcyA9IGRvbVByb3BlcnR5Q29uZmlnLlByb3BlcnRpZXMgfHwge307XG4gICAgdmFyIERPTUF0dHJpYnV0ZU5hbWVzcGFjZXMgPSBkb21Qcm9wZXJ0eUNvbmZpZy5ET01BdHRyaWJ1dGVOYW1lc3BhY2VzIHx8IHt9O1xuICAgIHZhciBET01BdHRyaWJ1dGVOYW1lcyA9IGRvbVByb3BlcnR5Q29uZmlnLkRPTUF0dHJpYnV0ZU5hbWVzIHx8IHt9O1xuICAgIHZhciBET01Qcm9wZXJ0eU5hbWVzID0gZG9tUHJvcGVydHlDb25maWcuRE9NUHJvcGVydHlOYW1lcyB8fCB7fTtcbiAgICB2YXIgRE9NTXV0YXRpb25NZXRob2RzID0gZG9tUHJvcGVydHlDb25maWcuRE9NTXV0YXRpb25NZXRob2RzIHx8IHt9O1xuXG4gICAgaWYgKGRvbVByb3BlcnR5Q29uZmlnLmlzQ3VzdG9tQXR0cmlidXRlKSB7XG4gICAgICBET01Qcm9wZXJ0eS5faXNDdXN0b21BdHRyaWJ1dGVGdW5jdGlvbnMucHVzaChkb21Qcm9wZXJ0eUNvbmZpZy5pc0N1c3RvbUF0dHJpYnV0ZSk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gUHJvcGVydGllcykge1xuICAgICAgISFET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHByb3BOYW1lKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnaW5qZWN0RE9NUHJvcGVydHlDb25maWcoLi4uKTogWW91XFwncmUgdHJ5aW5nIHRvIGluamVjdCBET00gcHJvcGVydHkgXFwnJXNcXCcgd2hpY2ggaGFzIGFscmVhZHkgYmVlbiBpbmplY3RlZC4gWW91IG1heSBiZSBhY2NpZGVudGFsbHkgaW5qZWN0aW5nIHRoZSBzYW1lIERPTSBwcm9wZXJ0eSBjb25maWcgdHdpY2UsIG9yIHlvdSBtYXkgYmUgaW5qZWN0aW5nIHR3byBjb25maWdzIHRoYXQgaGF2ZSBjb25mbGljdGluZyBwcm9wZXJ0eSBuYW1lcy4nLCBwcm9wTmFtZSkgOiBfcHJvZEludmFyaWFudCgnNDgnLCBwcm9wTmFtZSkgOiB2b2lkIDA7XG5cbiAgICAgIHZhciBsb3dlckNhc2VkID0gcHJvcE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIHZhciBwcm9wQ29uZmlnID0gUHJvcGVydGllc1twcm9wTmFtZV07XG5cbiAgICAgIHZhciBwcm9wZXJ0eUluZm8gPSB7XG4gICAgICAgIGF0dHJpYnV0ZU5hbWU6IGxvd2VyQ2FzZWQsXG4gICAgICAgIGF0dHJpYnV0ZU5hbWVzcGFjZTogbnVsbCxcbiAgICAgICAgcHJvcGVydHlOYW1lOiBwcm9wTmFtZSxcbiAgICAgICAgbXV0YXRpb25NZXRob2Q6IG51bGwsXG5cbiAgICAgICAgbXVzdFVzZVByb3BlcnR5OiBjaGVja01hc2socHJvcENvbmZpZywgSW5qZWN0aW9uLk1VU1RfVVNFX1BST1BFUlRZKSxcbiAgICAgICAgaGFzQm9vbGVhblZhbHVlOiBjaGVja01hc2socHJvcENvbmZpZywgSW5qZWN0aW9uLkhBU19CT09MRUFOX1ZBTFVFKSxcbiAgICAgICAgaGFzTnVtZXJpY1ZhbHVlOiBjaGVja01hc2socHJvcENvbmZpZywgSW5qZWN0aW9uLkhBU19OVU1FUklDX1ZBTFVFKSxcbiAgICAgICAgaGFzUG9zaXRpdmVOdW1lcmljVmFsdWU6IGNoZWNrTWFzayhwcm9wQ29uZmlnLCBJbmplY3Rpb24uSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUpLFxuICAgICAgICBoYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlOiBjaGVja01hc2socHJvcENvbmZpZywgSW5qZWN0aW9uLkhBU19PVkVSTE9BREVEX0JPT0xFQU5fVkFMVUUpXG4gICAgICB9O1xuICAgICAgIShwcm9wZXJ0eUluZm8uaGFzQm9vbGVhblZhbHVlICsgcHJvcGVydHlJbmZvLmhhc051bWVyaWNWYWx1ZSArIHByb3BlcnR5SW5mby5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlIDw9IDEpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdET01Qcm9wZXJ0eTogVmFsdWUgY2FuIGJlIG9uZSBvZiBib29sZWFuLCBvdmVybG9hZGVkIGJvb2xlYW4sIG9yIG51bWVyaWMgdmFsdWUsIGJ1dCBub3QgYSBjb21iaW5hdGlvbjogJXMnLCBwcm9wTmFtZSkgOiBfcHJvZEludmFyaWFudCgnNTAnLCBwcm9wTmFtZSkgOiB2b2lkIDA7XG5cbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBET01Qcm9wZXJ0eS5nZXRQb3NzaWJsZVN0YW5kYXJkTmFtZVtsb3dlckNhc2VkXSA9IHByb3BOYW1lO1xuICAgICAgfVxuXG4gICAgICBpZiAoRE9NQXR0cmlidXRlTmFtZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHZhciBhdHRyaWJ1dGVOYW1lID0gRE9NQXR0cmlidXRlTmFtZXNbcHJvcE5hbWVdO1xuICAgICAgICBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7XG4gICAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIERPTVByb3BlcnR5LmdldFBvc3NpYmxlU3RhbmRhcmROYW1lW2F0dHJpYnV0ZU5hbWVdID0gcHJvcE5hbWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKERPTUF0dHJpYnV0ZU5hbWVzcGFjZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2UgPSBET01BdHRyaWJ1dGVOYW1lc3BhY2VzW3Byb3BOYW1lXTtcbiAgICAgIH1cblxuICAgICAgaWYgKERPTVByb3BlcnR5TmFtZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWUgPSBET01Qcm9wZXJ0eU5hbWVzW3Byb3BOYW1lXTtcbiAgICAgIH1cblxuICAgICAgaWYgKERPTU11dGF0aW9uTWV0aG9kcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcGVydHlJbmZvLm11dGF0aW9uTWV0aG9kID0gRE9NTXV0YXRpb25NZXRob2RzW3Byb3BOYW1lXTtcbiAgICAgIH1cblxuICAgICAgRE9NUHJvcGVydHkucHJvcGVydGllc1twcm9wTmFtZV0gPSBwcm9wZXJ0eUluZm87XG4gICAgfVxuICB9XG59O1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG52YXIgQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiA9ICc6QS1aX2EtelxcXFx1MDBDMC1cXFxcdTAwRDZcXFxcdTAwRDgtXFxcXHUwMEY2XFxcXHUwMEY4LVxcXFx1MDJGRlxcXFx1MDM3MC1cXFxcdTAzN0RcXFxcdTAzN0YtXFxcXHUxRkZGXFxcXHUyMDBDLVxcXFx1MjAwRFxcXFx1MjA3MC1cXFxcdTIxOEZcXFxcdTJDMDAtXFxcXHUyRkVGXFxcXHUzMDAxLVxcXFx1RDdGRlxcXFx1RjkwMC1cXFxcdUZEQ0ZcXFxcdUZERjAtXFxcXHVGRkZEJztcbi8qIGVzbGludC1lbmFibGUgbWF4LWxlbiAqL1xuXG4vKipcbiAqIERPTVByb3BlcnR5IGV4cG9ydHMgbG9va3VwIG9iamVjdHMgdGhhdCBjYW4gYmUgdXNlZCBsaWtlIGZ1bmN0aW9uczpcbiAqXG4gKiAgID4gRE9NUHJvcGVydHkuaXNWYWxpZFsnaWQnXVxuICogICB0cnVlXG4gKiAgID4gRE9NUHJvcGVydHkuaXNWYWxpZFsnZm9vYmFyJ11cbiAqICAgdW5kZWZpbmVkXG4gKlxuICogQWx0aG91Z2ggdGhpcyBtYXkgYmUgY29uZnVzaW5nLCBpdCBwZXJmb3JtcyBiZXR0ZXIgaW4gZ2VuZXJhbC5cbiAqXG4gKiBAc2VlIGh0dHA6Ly9qc3BlcmYuY29tL2tleS1leGlzdHNcbiAqIEBzZWUgaHR0cDovL2pzcGVyZi5jb20va2V5LW1pc3NpbmdcbiAqL1xudmFyIERPTVByb3BlcnR5ID0ge1xuXG4gIElEX0FUVFJJQlVURV9OQU1FOiAnZGF0YS1yZWFjdGlkJyxcbiAgUk9PVF9BVFRSSUJVVEVfTkFNRTogJ2RhdGEtcmVhY3Ryb290JyxcblxuICBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSOiBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSLFxuICBBVFRSSUJVVEVfTkFNRV9DSEFSOiBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSICsgJ1xcXFwtLjAtOVxcXFx1MDBCN1xcXFx1MDMwMC1cXFxcdTAzNkZcXFxcdTIwM0YtXFxcXHUyMDQwJyxcblxuICAvKipcbiAgICogTWFwIGZyb20gcHJvcGVydHkgXCJzdGFuZGFyZCBuYW1lXCIgdG8gYW4gb2JqZWN0IHdpdGggaW5mbyBhYm91dCBob3cgdG8gc2V0XG4gICAqIHRoZSBwcm9wZXJ0eSBpbiB0aGUgRE9NLiBFYWNoIG9iamVjdCBjb250YWluczpcbiAgICpcbiAgICogYXR0cmlidXRlTmFtZTpcbiAgICogICBVc2VkIHdoZW4gcmVuZGVyaW5nIG1hcmt1cCBvciB3aXRoIGAqQXR0cmlidXRlKClgLlxuICAgKiBhdHRyaWJ1dGVOYW1lc3BhY2VcbiAgICogcHJvcGVydHlOYW1lOlxuICAgKiAgIFVzZWQgb24gRE9NIG5vZGUgaW5zdGFuY2VzLiAoVGhpcyBpbmNsdWRlcyBwcm9wZXJ0aWVzIHRoYXQgbXV0YXRlIGR1ZSB0b1xuICAgKiAgIGV4dGVybmFsIGZhY3RvcnMuKVxuICAgKiBtdXRhdGlvbk1ldGhvZDpcbiAgICogICBJZiBub24tbnVsbCwgdXNlZCBpbnN0ZWFkIG9mIHRoZSBwcm9wZXJ0eSBvciBgc2V0QXR0cmlidXRlKClgIGFmdGVyXG4gICAqICAgaW5pdGlhbCByZW5kZXIuXG4gICAqIG11c3RVc2VQcm9wZXJ0eTpcbiAgICogICBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBtdXN0IGJlIGFjY2Vzc2VkIGFuZCBtdXRhdGVkIGFzIGFuIG9iamVjdCBwcm9wZXJ0eS5cbiAgICogaGFzQm9vbGVhblZhbHVlOlxuICAgKiAgIFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSByZW1vdmVkIHdoZW4gc2V0IHRvIGEgZmFsc2V5IHZhbHVlLlxuICAgKiBoYXNOdW1lcmljVmFsdWU6XG4gICAqICAgV2hldGhlciB0aGUgcHJvcGVydHkgbXVzdCBiZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgbnVtZXJpYyBhbmQgc2hvdWxkIGJlXG4gICAqICAgcmVtb3ZlZCB3aGVuIHNldCB0byBhIGZhbHNleSB2YWx1ZS5cbiAgICogaGFzUG9zaXRpdmVOdW1lcmljVmFsdWU6XG4gICAqICAgV2hldGhlciB0aGUgcHJvcGVydHkgbXVzdCBiZSBwb3NpdGl2ZSBudW1lcmljIG9yIHBhcnNlIGFzIGEgcG9zaXRpdmVcbiAgICogICBudW1lcmljIGFuZCBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHNldCB0byBhIGZhbHNleSB2YWx1ZS5cbiAgICogaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZTpcbiAgICogICBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBjYW4gYmUgdXNlZCBhcyBhIGZsYWcgYXMgd2VsbCBhcyB3aXRoIGEgdmFsdWUuXG4gICAqICAgUmVtb3ZlZCB3aGVuIHN0cmljdGx5IGVxdWFsIHRvIGZhbHNlOyBwcmVzZW50IHdpdGhvdXQgYSB2YWx1ZSB3aGVuXG4gICAqICAgc3RyaWN0bHkgZXF1YWwgdG8gdHJ1ZTsgcHJlc2VudCB3aXRoIGEgdmFsdWUgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHJvcGVydGllczoge30sXG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgZnJvbSBsb3dlcmNhc2UgcHJvcGVydHkgbmFtZXMgdG8gdGhlIHByb3Blcmx5IGNhc2VkIHZlcnNpb24sIHVzZWRcbiAgICogdG8gd2FybiBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIHByb3BlcnRpZXMuIEF2YWlsYWJsZSBvbmx5IGluIF9fREVWX18uXG4gICAqXG4gICAqIGF1dG9mb2N1cyBpcyBwcmVkZWZpbmVkLCBiZWNhdXNlIGFkZGluZyBpdCB0byB0aGUgcHJvcGVydHkgd2hpdGVsaXN0XG4gICAqIGNhdXNlcyB1bmludGVuZGVkIHNpZGUgZWZmZWN0cy5cbiAgICpcbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIGdldFBvc3NpYmxlU3RhbmRhcmROYW1lOiBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHsgYXV0b2ZvY3VzOiAnYXV0b0ZvY3VzJyB9IDogbnVsbCxcblxuICAvKipcbiAgICogQWxsIG9mIHRoZSBpc0N1c3RvbUF0dHJpYnV0ZSgpIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYmVlbiBpbmplY3RlZC5cbiAgICovXG4gIF9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9uczogW10sXG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGEgcHJvcGVydHkgbmFtZSBpcyBhIGN1c3RvbSBhdHRyaWJ1dGUuXG4gICAqIEBtZXRob2RcbiAgICovXG4gIGlzQ3VzdG9tQXR0cmlidXRlOiBmdW5jdGlvbiAoYXR0cmlidXRlTmFtZSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgRE9NUHJvcGVydHkuX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaXNDdXN0b21BdHRyaWJ1dGVGbiA9IERPTVByb3BlcnR5Ll9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9uc1tpXTtcbiAgICAgIGlmIChpc0N1c3RvbUF0dHJpYnV0ZUZuKGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG5cbiAgaW5qZWN0aW9uOiBET01Qcm9wZXJ0eUluamVjdGlvblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBET01Qcm9wZXJ0eTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NUHJvcGVydHkgPSByZXF1aXJlKCcuL0RPTVByb3BlcnR5Jyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcblxudmFyIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyID0gcmVxdWlyZSgnLi9xdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3NlcicpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBWQUxJRF9BVFRSSUJVVEVfTkFNRV9SRUdFWCA9IG5ldyBSZWdFeHAoJ15bJyArIERPTVByb3BlcnR5LkFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgKyAnXVsnICsgRE9NUHJvcGVydHkuQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcbnZhciBpbGxlZ2FsQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG52YXIgdmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlID0ge307XG5cbmZ1bmN0aW9uIGlzQXR0cmlidXRlTmFtZVNhZmUoYXR0cmlidXRlTmFtZSkge1xuICBpZiAodmFsaWRhdGVkQXR0cmlidXRlTmFtZUNhY2hlLmhhc093blByb3BlcnR5KGF0dHJpYnV0ZU5hbWUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUuaGFzT3duUHJvcGVydHkoYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYLnRlc3QoYXR0cmlidXRlTmFtZSkpIHtcbiAgICB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGVbYXR0cmlidXRlTmFtZV0gPSB0cnVlO1xuICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdJbnZhbGlkIGF0dHJpYnV0ZSBuYW1lOiBgJXNgJywgYXR0cmlidXRlTmFtZSkgOiB2b2lkIDA7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkSWdub3JlVmFsdWUocHJvcGVydHlJbmZvLCB2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCBwcm9wZXJ0eUluZm8uaGFzQm9vbGVhblZhbHVlICYmICF2YWx1ZSB8fCBwcm9wZXJ0eUluZm8uaGFzTnVtZXJpY1ZhbHVlICYmIGlzTmFOKHZhbHVlKSB8fCBwcm9wZXJ0eUluZm8uaGFzUG9zaXRpdmVOdW1lcmljVmFsdWUgJiYgdmFsdWUgPCAxIHx8IHByb3BlcnR5SW5mby5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlICYmIHZhbHVlID09PSBmYWxzZTtcbn1cblxuLyoqXG4gKiBPcGVyYXRpb25zIGZvciBkZWFsaW5nIHdpdGggRE9NIHByb3BlcnRpZXMuXG4gKi9cbnZhciBET01Qcm9wZXJ0eU9wZXJhdGlvbnMgPSB7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbWFya3VwIGZvciB0aGUgSUQgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBVbmVzY2FwZWQgSUQuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gTWFya3VwIHN0cmluZy5cbiAgICovXG4gIGNyZWF0ZU1hcmt1cEZvcklEOiBmdW5jdGlvbiAoaWQpIHtcbiAgICByZXR1cm4gRE9NUHJvcGVydHkuSURfQVRUUklCVVRFX05BTUUgKyAnPScgKyBxdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3NlcihpZCk7XG4gIH0sXG5cbiAgc2V0QXR0cmlidXRlRm9ySUQ6IGZ1bmN0aW9uIChub2RlLCBpZCkge1xuICAgIG5vZGUuc2V0QXR0cmlidXRlKERPTVByb3BlcnR5LklEX0FUVFJJQlVURV9OQU1FLCBpZCk7XG4gIH0sXG5cbiAgY3JlYXRlTWFya3VwRm9yUm9vdDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBET01Qcm9wZXJ0eS5ST09UX0FUVFJJQlVURV9OQU1FICsgJz1cIlwiJztcbiAgfSxcblxuICBzZXRBdHRyaWJ1dGVGb3JSb290OiBmdW5jdGlvbiAobm9kZSkge1xuICAgIG5vZGUuc2V0QXR0cmlidXRlKERPTVByb3BlcnR5LlJPT1RfQVRUUklCVVRFX05BTUUsICcnKTtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlcyBtYXJrdXAgZm9yIGEgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHJldHVybiB7P3N0cmluZ30gTWFya3VwIHN0cmluZywgb3IgbnVsbCBpZiB0aGUgcHJvcGVydHkgd2FzIGludmFsaWQuXG4gICAqL1xuICBjcmVhdGVNYXJrdXBGb3JQcm9wZXJ0eTogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIHByb3BlcnR5SW5mbyA9IERPTVByb3BlcnR5LnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzW25hbWVdIDogbnVsbDtcbiAgICBpZiAocHJvcGVydHlJbmZvKSB7XG4gICAgICBpZiAoc2hvdWxkSWdub3JlVmFsdWUocHJvcGVydHlJbmZvLCB2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZTtcbiAgICAgIGlmIChwcm9wZXJ0eUluZm8uaGFzQm9vbGVhblZhbHVlIHx8IHByb3BlcnR5SW5mby5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlICYmIHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lICsgJz1cIlwiJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lICsgJz0nICsgcXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXIodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoRE9NUHJvcGVydHkuaXNDdXN0b21BdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBuYW1lICsgJz0nICsgcXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXIodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlcyBtYXJrdXAgZm9yIGEgY3VzdG9tIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqIEByZXR1cm4ge3N0cmluZ30gTWFya3VwIHN0cmluZywgb3IgZW1wdHkgc3RyaW5nIGlmIHRoZSBwcm9wZXJ0eSB3YXMgaW52YWxpZC5cbiAgICovXG4gIGNyZWF0ZU1hcmt1cEZvckN1c3RvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKCFpc0F0dHJpYnV0ZU5hbWVTYWZlKG5hbWUpIHx8IHZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIG5hbWUgKyAnPScgKyBxdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3Nlcih2YWx1ZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICovXG4gIHNldFZhbHVlRm9yUHJvcGVydHk6IGZ1bmN0aW9uIChub2RlLCBuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBwcm9wZXJ0eUluZm8gPSBET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG5hbWUpID8gRE9NUHJvcGVydHkucHJvcGVydGllc1tuYW1lXSA6IG51bGw7XG4gICAgaWYgKHByb3BlcnR5SW5mbykge1xuICAgICAgdmFyIG11dGF0aW9uTWV0aG9kID0gcHJvcGVydHlJbmZvLm11dGF0aW9uTWV0aG9kO1xuICAgICAgaWYgKG11dGF0aW9uTWV0aG9kKSB7XG4gICAgICAgIG11dGF0aW9uTWV0aG9kKG5vZGUsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoc2hvdWxkSWdub3JlVmFsdWUocHJvcGVydHlJbmZvLCB2YWx1ZSkpIHtcbiAgICAgICAgdGhpcy5kZWxldGVWYWx1ZUZvclByb3BlcnR5KG5vZGUsIG5hbWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpIHtcbiAgICAgICAgLy8gQ29udHJhcnkgdG8gYHNldEF0dHJpYnV0ZWAsIG9iamVjdCBwcm9wZXJ0aWVzIGFyZSBwcm9wZXJseVxuICAgICAgICAvLyBgdG9TdHJpbmdgZWQgYnkgSUU4LzkuXG4gICAgICAgIG5vZGVbcHJvcGVydHlJbmZvLnByb3BlcnR5TmFtZV0gPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBhdHRyaWJ1dGVOYW1lID0gcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWU7XG4gICAgICAgIHZhciBuYW1lc3BhY2UgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZXNwYWNlO1xuICAgICAgICAvLyBgc2V0QXR0cmlidXRlYCB3aXRoIG9iamVjdHMgYmVjb21lcyBvbmx5IGBbb2JqZWN0XWAgaW4gSUU4LzksXG4gICAgICAgIC8vICgnJyArIHZhbHVlKSBtYWtlcyBpdCBvdXRwdXQgdGhlIGNvcnJlY3QgdG9TdHJpbmcoKS12YWx1ZS5cbiAgICAgICAgaWYgKG5hbWVzcGFjZSkge1xuICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlTlMobmFtZXNwYWNlLCBhdHRyaWJ1dGVOYW1lLCAnJyArIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUluZm8uaGFzQm9vbGVhblZhbHVlIHx8IHByb3BlcnR5SW5mby5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlICYmIHZhbHVlID09PSB0cnVlKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUsICcnICsgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChET01Qcm9wZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgRE9NUHJvcGVydHlPcGVyYXRpb25zLnNldFZhbHVlRm9yQXR0cmlidXRlKG5vZGUsIG5hbWUsIHZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBwYXlsb2FkID0ge307XG4gICAgICBwYXlsb2FkW25hbWVdID0gdmFsdWU7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgaW5zdGFuY2VJRDogUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUobm9kZSkuX2RlYnVnSUQsXG4gICAgICAgIHR5cGU6ICd1cGRhdGUgYXR0cmlidXRlJyxcbiAgICAgICAgcGF5bG9hZDogcGF5bG9hZFxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIHNldFZhbHVlRm9yQXR0cmlidXRlOiBmdW5jdGlvbiAobm9kZSwgbmFtZSwgdmFsdWUpIHtcbiAgICBpZiAoIWlzQXR0cmlidXRlTmFtZVNhZmUobmFtZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZShuYW1lLCAnJyArIHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBwYXlsb2FkID0ge307XG4gICAgICBwYXlsb2FkW25hbWVdID0gdmFsdWU7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgaW5zdGFuY2VJRDogUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUobm9kZSkuX2RlYnVnSUQsXG4gICAgICAgIHR5cGU6ICd1cGRhdGUgYXR0cmlidXRlJyxcbiAgICAgICAgcGF5bG9hZDogcGF5bG9hZFxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGFuIGF0dHJpYnV0ZXMgZnJvbSBhIG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZGVsZXRlVmFsdWVGb3JBdHRyaWJ1dGU6IGZ1bmN0aW9uIChub2RlLCBuYW1lKSB7XG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgaW5zdGFuY2VJRDogUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUobm9kZSkuX2RlYnVnSUQsXG4gICAgICAgIHR5cGU6ICdyZW1vdmUgYXR0cmlidXRlJyxcbiAgICAgICAgcGF5bG9hZDogbmFtZVxuICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGVzIHRoZSB2YWx1ZSBmb3IgYSBwcm9wZXJ0eSBvbiBhIG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKi9cbiAgZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eTogZnVuY3Rpb24gKG5vZGUsIG5hbWUpIHtcbiAgICB2YXIgcHJvcGVydHlJbmZvID0gRE9NUHJvcGVydHkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IERPTVByb3BlcnR5LnByb3BlcnRpZXNbbmFtZV0gOiBudWxsO1xuICAgIGlmIChwcm9wZXJ0eUluZm8pIHtcbiAgICAgIHZhciBtdXRhdGlvbk1ldGhvZCA9IHByb3BlcnR5SW5mby5tdXRhdGlvbk1ldGhvZDtcbiAgICAgIGlmIChtdXRhdGlvbk1ldGhvZCkge1xuICAgICAgICBtdXRhdGlvbk1ldGhvZChub2RlLCB1bmRlZmluZWQpO1xuICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eUluZm8ubXVzdFVzZVByb3BlcnR5KSB7XG4gICAgICAgIHZhciBwcm9wTmFtZSA9IHByb3BlcnR5SW5mby5wcm9wZXJ0eU5hbWU7XG4gICAgICAgIGlmIChwcm9wZXJ0eUluZm8uaGFzQm9vbGVhblZhbHVlKSB7XG4gICAgICAgICAgbm9kZVtwcm9wTmFtZV0gPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlW3Byb3BOYW1lXSA9ICcnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChET01Qcm9wZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgaW5zdGFuY2VJRDogUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUobm9kZSkuX2RlYnVnSUQsXG4gICAgICAgIHR5cGU6ICdyZW1vdmUgYXR0cmlidXRlJyxcbiAgICAgICAgcGF5bG9hZDogbmFtZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRE9NUHJvcGVydHlPcGVyYXRpb25zOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBET01MYXp5VHJlZSA9IHJlcXVpcmUoJy4vRE9NTGF6eVRyZWUnKTtcbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbnZhciBjcmVhdGVOb2Rlc0Zyb21NYXJrdXAgPSByZXF1aXJlKCdmYmpzL2xpYi9jcmVhdGVOb2Rlc0Zyb21NYXJrdXAnKTtcbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlGdW5jdGlvbicpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG52YXIgRGFuZ2VyID0ge1xuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhIG5vZGUgd2l0aCBhIHN0cmluZyBvZiBtYXJrdXAgYXQgaXRzIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIGl0c1xuICAgKiBwYXJlbnQuIFRoZSBtYXJrdXAgbXVzdCByZW5kZXIgaW50byBhIHNpbmdsZSByb290IG5vZGUuXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gb2xkQ2hpbGQgQ2hpbGQgbm9kZSB0byByZXBsYWNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWFya3VwIE1hcmt1cCB0byByZW5kZXIgaW4gcGxhY2Ugb2YgdGhlIGNoaWxkIG5vZGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXA6IGZ1bmN0aW9uIChvbGRDaGlsZCwgbWFya3VwKSB7XG4gICAgIUV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAoLi4uKTogQ2Fubm90IHJlbmRlciBtYXJrdXAgaW4gYSB3b3JrZXIgdGhyZWFkLiBNYWtlIHN1cmUgYHdpbmRvd2AgYW5kIGBkb2N1bWVudGAgYXJlIGF2YWlsYWJsZSBnbG9iYWxseSBiZWZvcmUgcmVxdWlyaW5nIFJlYWN0IHdoZW4gdW5pdCB0ZXN0aW5nIG9yIHVzZSBSZWFjdERPTVNlcnZlci5yZW5kZXJUb1N0cmluZygpIGZvciBzZXJ2ZXIgcmVuZGVyaW5nLicpIDogX3Byb2RJbnZhcmlhbnQoJzU2JykgOiB2b2lkIDA7XG4gICAgIW1hcmt1cCA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAoLi4uKTogTWlzc2luZyBtYXJrdXAuJykgOiBfcHJvZEludmFyaWFudCgnNTcnKSA6IHZvaWQgMDtcbiAgICAhKG9sZENoaWxkLm5vZGVOYW1lICE9PSAnSFRNTCcpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCguLi4pOiBDYW5ub3QgcmVwbGFjZSBtYXJrdXAgb2YgdGhlIDxodG1sPiBub2RlLiBUaGlzIGlzIGJlY2F1c2UgYnJvd3NlciBxdWlya3MgbWFrZSB0aGlzIHVucmVsaWFibGUgYW5kL29yIHNsb3cuIElmIHlvdSB3YW50IHRvIHJlbmRlciB0byB0aGUgcm9vdCB5b3UgbXVzdCB1c2Ugc2VydmVyIHJlbmRlcmluZy4gU2VlIFJlYWN0RE9NU2VydmVyLnJlbmRlclRvU3RyaW5nKCkuJykgOiBfcHJvZEludmFyaWFudCgnNTgnKSA6IHZvaWQgMDtcblxuICAgIGlmICh0eXBlb2YgbWFya3VwID09PSAnc3RyaW5nJykge1xuICAgICAgdmFyIG5ld0NoaWxkID0gY3JlYXRlTm9kZXNGcm9tTWFya3VwKG1hcmt1cCwgZW1wdHlGdW5jdGlvbilbMF07XG4gICAgICBvbGRDaGlsZC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuZXdDaGlsZCwgb2xkQ2hpbGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBET01MYXp5VHJlZS5yZXBsYWNlQ2hpbGRXaXRoVHJlZShvbGRDaGlsZCwgbWFya3VwKTtcbiAgICB9XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBEYW5nZXI7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgdGhhdCBpcyBpbmplY3RhYmxlIGludG8gYEV2ZW50UGx1Z2luSHViYCwgdGhhdCBzcGVjaWZpZXMgYVxuICogZGV0ZXJtaW5pc3RpYyBvcmRlcmluZyBvZiBgRXZlbnRQbHVnaW5gcy4gQSBjb252ZW5pZW50IHdheSB0byByZWFzb24gYWJvdXRcbiAqIHBsdWdpbnMsIHdpdGhvdXQgaGF2aW5nIHRvIHBhY2thZ2UgZXZlcnkgb25lIG9mIHRoZW0uIFRoaXMgaXMgYmV0dGVyIHRoYW5cbiAqIGhhdmluZyBwbHVnaW5zIGJlIG9yZGVyZWQgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB0aGV5IGFyZSBpbmplY3RlZCBiZWNhdXNlXG4gKiB0aGF0IG9yZGVyaW5nIHdvdWxkIGJlIGluZmx1ZW5jZWQgYnkgdGhlIHBhY2thZ2luZyBvcmRlci5cbiAqIGBSZXNwb25kZXJFdmVudFBsdWdpbmAgbXVzdCBvY2N1ciBiZWZvcmUgYFNpbXBsZUV2ZW50UGx1Z2luYCBzbyB0aGF0XG4gKiBwcmV2ZW50aW5nIGRlZmF1bHQgb24gZXZlbnRzIGlzIGNvbnZlbmllbnQgaW4gYFNpbXBsZUV2ZW50UGx1Z2luYCBoYW5kbGVycy5cbiAqL1xuXG52YXIgRGVmYXVsdEV2ZW50UGx1Z2luT3JkZXIgPSBbJ1Jlc3BvbmRlckV2ZW50UGx1Z2luJywgJ1NpbXBsZUV2ZW50UGx1Z2luJywgJ1RhcEV2ZW50UGx1Z2luJywgJ0VudGVyTGVhdmVFdmVudFBsdWdpbicsICdDaGFuZ2VFdmVudFBsdWdpbicsICdTZWxlY3RFdmVudFBsdWdpbicsICdCZWZvcmVJbnB1dEV2ZW50UGx1Z2luJ107XG5cbm1vZHVsZS5leHBvcnRzID0gRGVmYXVsdEV2ZW50UGx1Z2luT3JkZXI7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV2ZW50UHJvcGFnYXRvcnMgPSByZXF1aXJlKCcuL0V2ZW50UHJvcGFnYXRvcnMnKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xudmFyIFN5bnRoZXRpY01vdXNlRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY01vdXNlRXZlbnQnKTtcblxudmFyIGV2ZW50VHlwZXMgPSB7XG4gIG1vdXNlRW50ZXI6IHtcbiAgICByZWdpc3RyYXRpb25OYW1lOiAnb25Nb3VzZUVudGVyJyxcbiAgICBkZXBlbmRlbmNpZXM6IFsndG9wTW91c2VPdXQnLCAndG9wTW91c2VPdmVyJ11cbiAgfSxcbiAgbW91c2VMZWF2ZToge1xuICAgIHJlZ2lzdHJhdGlvbk5hbWU6ICdvbk1vdXNlTGVhdmUnLFxuICAgIGRlcGVuZGVuY2llczogWyd0b3BNb3VzZU91dCcsICd0b3BNb3VzZU92ZXInXVxuICB9XG59O1xuXG52YXIgRW50ZXJMZWF2ZUV2ZW50UGx1Z2luID0ge1xuXG4gIGV2ZW50VHlwZXM6IGV2ZW50VHlwZXMsXG5cbiAgLyoqXG4gICAqIEZvciBhbG1vc3QgZXZlcnkgaW50ZXJhY3Rpb24gd2UgY2FyZSBhYm91dCwgdGhlcmUgd2lsbCBiZSBib3RoIGEgdG9wLWxldmVsXG4gICAqIGBtb3VzZW92ZXJgIGFuZCBgbW91c2VvdXRgIGV2ZW50IHRoYXQgb2NjdXJzLiBPbmx5IHVzZSBgbW91c2VvdXRgIHNvIHRoYXRcbiAgICogd2UgZG8gbm90IGV4dHJhY3QgZHVwbGljYXRlIGV2ZW50cy4gSG93ZXZlciwgbW92aW5nIHRoZSBtb3VzZSBpbnRvIHRoZVxuICAgKiBicm93c2VyIGZyb20gb3V0c2lkZSB3aWxsIG5vdCBmaXJlIGEgYG1vdXNlb3V0YCBldmVudC4gSW4gdGhpcyBjYXNlLCB3ZSB1c2VcbiAgICogdGhlIGBtb3VzZW92ZXJgIHRvcC1sZXZlbCBldmVudC5cbiAgICovXG4gIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BNb3VzZU92ZXInICYmIChuYXRpdmVFdmVudC5yZWxhdGVkVGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LmZyb21FbGVtZW50KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0b3BMZXZlbFR5cGUgIT09ICd0b3BNb3VzZU91dCcgJiYgdG9wTGV2ZWxUeXBlICE9PSAndG9wTW91c2VPdmVyJykge1xuICAgICAgLy8gTXVzdCBub3QgYmUgYSBtb3VzZSBpbiBvciBtb3VzZSBvdXQgLSBpZ25vcmluZy5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciB3aW47XG4gICAgaWYgKG5hdGl2ZUV2ZW50VGFyZ2V0LndpbmRvdyA9PT0gbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICAgIC8vIGBuYXRpdmVFdmVudFRhcmdldGAgaXMgcHJvYmFibHkgYSB3aW5kb3cgb2JqZWN0LlxuICAgICAgd2luID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IGBvd25lckRvY3VtZW50YCBpcyBzb21ldGltZXMgdW5kZWZpbmVkIGluIElFOC5cbiAgICAgIHZhciBkb2MgPSBuYXRpdmVFdmVudFRhcmdldC5vd25lckRvY3VtZW50O1xuICAgICAgaWYgKGRvYykge1xuICAgICAgICB3aW4gPSBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbiA9IHdpbmRvdztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZnJvbTtcbiAgICB2YXIgdG87XG4gICAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcE1vdXNlT3V0Jykge1xuICAgICAgZnJvbSA9IHRhcmdldEluc3Q7XG4gICAgICB2YXIgcmVsYXRlZCA9IG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQudG9FbGVtZW50O1xuICAgICAgdG8gPSByZWxhdGVkID8gUmVhY3RET01Db21wb25lbnRUcmVlLmdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHJlbGF0ZWQpIDogbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTW92aW5nIHRvIGEgbm9kZSBmcm9tIG91dHNpZGUgdGhlIHdpbmRvdy5cbiAgICAgIGZyb20gPSBudWxsO1xuICAgICAgdG8gPSB0YXJnZXRJbnN0O1xuICAgIH1cblxuICAgIGlmIChmcm9tID09PSB0bykge1xuICAgICAgLy8gTm90aGluZyBwZXJ0YWlucyB0byBvdXIgbWFuYWdlZCBjb21wb25lbnRzLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGZyb21Ob2RlID0gZnJvbSA9PSBudWxsID8gd2luIDogUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoZnJvbSk7XG4gICAgdmFyIHRvTm9kZSA9IHRvID09IG51bGwgPyB3aW4gOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0byk7XG5cbiAgICB2YXIgbGVhdmUgPSBTeW50aGV0aWNNb3VzZUV2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLm1vdXNlTGVhdmUsIGZyb20sIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgbGVhdmUudHlwZSA9ICdtb3VzZWxlYXZlJztcbiAgICBsZWF2ZS50YXJnZXQgPSBmcm9tTm9kZTtcbiAgICBsZWF2ZS5yZWxhdGVkVGFyZ2V0ID0gdG9Ob2RlO1xuXG4gICAgdmFyIGVudGVyID0gU3ludGhldGljTW91c2VFdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlcy5tb3VzZUVudGVyLCB0bywgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBlbnRlci50eXBlID0gJ21vdXNlZW50ZXInO1xuICAgIGVudGVyLnRhcmdldCA9IHRvTm9kZTtcbiAgICBlbnRlci5yZWxhdGVkVGFyZ2V0ID0gZnJvbU5vZGU7XG5cbiAgICBFdmVudFByb3BhZ2F0b3JzLmFjY3VtdWxhdGVFbnRlckxlYXZlRGlzcGF0Y2hlcyhsZWF2ZSwgZW50ZXIsIGZyb20sIHRvKTtcblxuICAgIHJldHVybiBbbGVhdmUsIGVudGVyXTtcbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEVudGVyTGVhdmVFdmVudFBsdWdpbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgRXZlbnRQbHVnaW5SZWdpc3RyeSA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5SZWdpc3RyeScpO1xudmFyIEV2ZW50UGx1Z2luVXRpbHMgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luVXRpbHMnKTtcbnZhciBSZWFjdEVycm9yVXRpbHMgPSByZXF1aXJlKCcuL1JlYWN0RXJyb3JVdGlscycpO1xuXG52YXIgYWNjdW11bGF0ZUludG8gPSByZXF1aXJlKCcuL2FjY3VtdWxhdGVJbnRvJyk7XG52YXIgZm9yRWFjaEFjY3VtdWxhdGVkID0gcmVxdWlyZSgnLi9mb3JFYWNoQWNjdW11bGF0ZWQnKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBJbnRlcm5hbCBzdG9yZSBmb3IgZXZlbnQgbGlzdGVuZXJzXG4gKi9cbnZhciBsaXN0ZW5lckJhbmsgPSB7fTtcblxuLyoqXG4gKiBJbnRlcm5hbCBxdWV1ZSBvZiBldmVudHMgdGhhdCBoYXZlIGFjY3VtdWxhdGVkIHRoZWlyIGRpc3BhdGNoZXMgYW5kIGFyZVxuICogd2FpdGluZyB0byBoYXZlIHRoZWlyIGRpc3BhdGNoZXMgZXhlY3V0ZWQuXG4gKi9cbnZhciBldmVudFF1ZXVlID0gbnVsbDtcblxuLyoqXG4gKiBEaXNwYXRjaGVzIGFuIGV2ZW50IGFuZCByZWxlYXNlcyBpdCBiYWNrIGludG8gdGhlIHBvb2wsIHVubGVzcyBwZXJzaXN0ZW50LlxuICpcbiAqIEBwYXJhbSB7P29iamVjdH0gZXZlbnQgU3ludGhldGljIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNpbXVsYXRlZCBJZiB0aGUgZXZlbnQgaXMgc2ltdWxhdGVkIChjaGFuZ2VzIGV4biBiZWhhdmlvcilcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBleGVjdXRlRGlzcGF0Y2hlc0FuZFJlbGVhc2UgPSBmdW5jdGlvbiAoZXZlbnQsIHNpbXVsYXRlZCkge1xuICBpZiAoZXZlbnQpIHtcbiAgICBFdmVudFBsdWdpblV0aWxzLmV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcihldmVudCwgc2ltdWxhdGVkKTtcblxuICAgIGlmICghZXZlbnQuaXNQZXJzaXN0ZW50KCkpIHtcbiAgICAgIGV2ZW50LmNvbnN0cnVjdG9yLnJlbGVhc2UoZXZlbnQpO1xuICAgIH1cbiAgfVxufTtcbnZhciBleGVjdXRlRGlzcGF0Y2hlc0FuZFJlbGVhc2VTaW11bGF0ZWQgPSBmdW5jdGlvbiAoZSkge1xuICByZXR1cm4gZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlKGUsIHRydWUpO1xufTtcbnZhciBleGVjdXRlRGlzcGF0Y2hlc0FuZFJlbGVhc2VUb3BMZXZlbCA9IGZ1bmN0aW9uIChlKSB7XG4gIHJldHVybiBleGVjdXRlRGlzcGF0Y2hlc0FuZFJlbGVhc2UoZSwgZmFsc2UpO1xufTtcblxudmFyIGdldERpY3Rpb25hcnlLZXkgPSBmdW5jdGlvbiAoaW5zdCkge1xuICAvLyBQcmV2ZW50cyBWOCBwZXJmb3JtYW5jZSBpc3N1ZTpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzIzMlxuICByZXR1cm4gJy4nICsgaW5zdC5fcm9vdE5vZGVJRDtcbn07XG5cbmZ1bmN0aW9uIGlzSW50ZXJhY3RpdmUodGFnKSB7XG4gIHJldHVybiB0YWcgPT09ICdidXR0b24nIHx8IHRhZyA9PT0gJ2lucHV0JyB8fCB0YWcgPT09ICdzZWxlY3QnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJztcbn1cblxuZnVuY3Rpb24gc2hvdWxkUHJldmVudE1vdXNlRXZlbnQobmFtZSwgdHlwZSwgcHJvcHMpIHtcbiAgc3dpdGNoIChuYW1lKSB7XG4gICAgY2FzZSAnb25DbGljayc6XG4gICAgY2FzZSAnb25DbGlja0NhcHR1cmUnOlxuICAgIGNhc2UgJ29uRG91YmxlQ2xpY2snOlxuICAgIGNhc2UgJ29uRG91YmxlQ2xpY2tDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlRG93bic6XG4gICAgY2FzZSAnb25Nb3VzZURvd25DYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlTW92ZSc6XG4gICAgY2FzZSAnb25Nb3VzZU1vdmVDYXB0dXJlJzpcbiAgICBjYXNlICdvbk1vdXNlVXAnOlxuICAgIGNhc2UgJ29uTW91c2VVcENhcHR1cmUnOlxuICAgICAgcmV0dXJuICEhKHByb3BzLmRpc2FibGVkICYmIGlzSW50ZXJhY3RpdmUodHlwZSkpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGlzIGEgdW5pZmllZCBpbnRlcmZhY2UgZm9yIGV2ZW50IHBsdWdpbnMgdG8gYmUgaW5zdGFsbGVkIGFuZCBjb25maWd1cmVkLlxuICpcbiAqIEV2ZW50IHBsdWdpbnMgY2FuIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICBgZXh0cmFjdEV2ZW50c2Age2Z1bmN0aW9uKHN0cmluZywgRE9NRXZlbnRUYXJnZXQsIHN0cmluZywgb2JqZWN0KTogKn1cbiAqICAgICBSZXF1aXJlZC4gV2hlbiBhIHRvcC1sZXZlbCBldmVudCBpcyBmaXJlZCwgdGhpcyBtZXRob2QgaXMgZXhwZWN0ZWQgdG9cbiAqICAgICBleHRyYWN0IHN5bnRoZXRpYyBldmVudHMgdGhhdCB3aWxsIGluIHR1cm4gYmUgcXVldWVkIGFuZCBkaXNwYXRjaGVkLlxuICpcbiAqICAgYGV2ZW50VHlwZXNgIHtvYmplY3R9XG4gKiAgICAgT3B0aW9uYWwsIHBsdWdpbnMgdGhhdCBmaXJlIGV2ZW50cyBtdXN0IHB1Ymxpc2ggYSBtYXBwaW5nIG9mIHJlZ2lzdHJhdGlvblxuICogICAgIG5hbWVzIHRoYXQgYXJlIHVzZWQgdG8gcmVnaXN0ZXIgbGlzdGVuZXJzLiBWYWx1ZXMgb2YgdGhpcyBtYXBwaW5nIG11c3RcbiAqICAgICBiZSBvYmplY3RzIHRoYXQgY29udGFpbiBgcmVnaXN0cmF0aW9uTmFtZWAgb3IgYHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzYC5cbiAqXG4gKiAgIGBleGVjdXRlRGlzcGF0Y2hgIHtmdW5jdGlvbihvYmplY3QsIGZ1bmN0aW9uLCBzdHJpbmcpfVxuICogICAgIE9wdGlvbmFsLCBhbGxvd3MgcGx1Z2lucyB0byBvdmVycmlkZSBob3cgYW4gZXZlbnQgZ2V0cyBkaXNwYXRjaGVkLiBCeVxuICogICAgIGRlZmF1bHQsIHRoZSBsaXN0ZW5lciBpcyBzaW1wbHkgaW52b2tlZC5cbiAqXG4gKiBFYWNoIHBsdWdpbiB0aGF0IGlzIGluamVjdGVkIGludG8gYEV2ZW50c1BsdWdpbkh1YmAgaXMgaW1tZWRpYXRlbHkgb3BlcmFibGUuXG4gKlxuICogQHB1YmxpY1xuICovXG52YXIgRXZlbnRQbHVnaW5IdWIgPSB7XG5cbiAgLyoqXG4gICAqIE1ldGhvZHMgZm9yIGluamVjdGluZyBkZXBlbmRlbmNpZXMuXG4gICAqL1xuICBpbmplY3Rpb246IHtcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7YXJyYXl9IEluamVjdGVkRXZlbnRQbHVnaW5PcmRlclxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cbiAgICBpbmplY3RFdmVudFBsdWdpbk9yZGVyOiBFdmVudFBsdWdpblJlZ2lzdHJ5LmluamVjdEV2ZW50UGx1Z2luT3JkZXIsXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gaW5qZWN0ZWROYW1lc1RvUGx1Z2lucyBNYXAgZnJvbSBuYW1lcyB0byBwbHVnaW4gbW9kdWxlcy5cbiAgICAgKi9cbiAgICBpbmplY3RFdmVudFBsdWdpbnNCeU5hbWU6IEV2ZW50UGx1Z2luUmVnaXN0cnkuaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lXG5cbiAgfSxcblxuICAvKipcbiAgICogU3RvcmVzIGBsaXN0ZW5lcmAgYXQgYGxpc3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXVtrZXldYC4gSXMgaWRlbXBvdGVudC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGluc3QgVGhlIGluc3RhbmNlLCB3aGljaCBpcyB0aGUgc291cmNlIG9mIGV2ZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lciBUaGUgY2FsbGJhY2sgdG8gc3RvcmUuXG4gICAqL1xuICBwdXRMaXN0ZW5lcjogZnVuY3Rpb24gKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyKSB7XG4gICAgISh0eXBlb2YgbGlzdGVuZXIgPT09ICdmdW5jdGlvbicpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCAlcyBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLCBpbnN0ZWFkIGdvdCB0eXBlICVzJywgcmVnaXN0cmF0aW9uTmFtZSwgdHlwZW9mIGxpc3RlbmVyKSA6IF9wcm9kSW52YXJpYW50KCc5NCcsIHJlZ2lzdHJhdGlvbk5hbWUsIHR5cGVvZiBsaXN0ZW5lcikgOiB2b2lkIDA7XG5cbiAgICB2YXIga2V5ID0gZ2V0RGljdGlvbmFyeUtleShpbnN0KTtcbiAgICB2YXIgYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWUgPSBsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV0gfHwgKGxpc3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXSA9IHt9KTtcbiAgICBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZVtrZXldID0gbGlzdGVuZXI7XG5cbiAgICB2YXIgUGx1Z2luTW9kdWxlID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tyZWdpc3RyYXRpb25OYW1lXTtcbiAgICBpZiAoUGx1Z2luTW9kdWxlICYmIFBsdWdpbk1vZHVsZS5kaWRQdXRMaXN0ZW5lcikge1xuICAgICAgUGx1Z2luTW9kdWxlLmRpZFB1dExpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbnN0IFRoZSBpbnN0YW5jZSwgd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiBldmVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb25OYW1lIE5hbWUgb2YgbGlzdGVuZXIgKGUuZy4gYG9uQ2xpY2tgKS5cbiAgICogQHJldHVybiB7P2Z1bmN0aW9ufSBUaGUgc3RvcmVkIGNhbGxiYWNrLlxuICAgKi9cbiAgZ2V0TGlzdGVuZXI6IGZ1bmN0aW9uIChpbnN0LCByZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgLy8gVE9ETzogc2hvdWxkUHJldmVudE1vdXNlRXZlbnQgaXMgRE9NLXNwZWNpZmljIGFuZCBkZWZpbml0ZWx5IHNob3VsZCBub3RcbiAgICAvLyBsaXZlIGhlcmU7IG5lZWRzIHRvIGJlIG1vdmVkIHRvIGEgYmV0dGVyIHBsYWNlIHNvb25cbiAgICB2YXIgYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWUgPSBsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV07XG4gICAgaWYgKHNob3VsZFByZXZlbnRNb3VzZUV2ZW50KHJlZ2lzdHJhdGlvbk5hbWUsIGluc3QuX2N1cnJlbnRFbGVtZW50LnR5cGUsIGluc3QuX2N1cnJlbnRFbGVtZW50LnByb3BzKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBrZXkgPSBnZXREaWN0aW9uYXJ5S2V5KGluc3QpO1xuICAgIHJldHVybiBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZSAmJiBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZVtrZXldO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGEgbGlzdGVuZXIgZnJvbSB0aGUgcmVnaXN0cmF0aW9uIGJhbmsuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbnN0IFRoZSBpbnN0YW5jZSwgd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiBldmVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb25OYW1lIE5hbWUgb2YgbGlzdGVuZXIgKGUuZy4gYG9uQ2xpY2tgKS5cbiAgICovXG4gIGRlbGV0ZUxpc3RlbmVyOiBmdW5jdGlvbiAoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICAgIHZhciBQbHVnaW5Nb2R1bGUgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3JlZ2lzdHJhdGlvbk5hbWVdO1xuICAgIGlmIChQbHVnaW5Nb2R1bGUgJiYgUGx1Z2luTW9kdWxlLndpbGxEZWxldGVMaXN0ZW5lcikge1xuICAgICAgUGx1Z2luTW9kdWxlLndpbGxEZWxldGVMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWUgPSBsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV07XG4gICAgLy8gVE9ETzogVGhpcyBzaG91bGQgbmV2ZXIgYmUgbnVsbCAtLSB3aGVuIGlzIGl0P1xuICAgIGlmIChiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZSkge1xuICAgICAgdmFyIGtleSA9IGdldERpY3Rpb25hcnlLZXkoaW5zdCk7XG4gICAgICBkZWxldGUgYmFua0ZvclJlZ2lzdHJhdGlvbk5hbWVba2V5XTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYWxsIGxpc3RlbmVycyBmb3IgdGhlIERPTSBlbGVtZW50IHdpdGggdGhlIHN1cHBsaWVkIElELlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRzLlxuICAgKi9cbiAgZGVsZXRlQWxsTGlzdGVuZXJzOiBmdW5jdGlvbiAoaW5zdCkge1xuICAgIHZhciBrZXkgPSBnZXREaWN0aW9uYXJ5S2V5KGluc3QpO1xuICAgIGZvciAodmFyIHJlZ2lzdHJhdGlvbk5hbWUgaW4gbGlzdGVuZXJCYW5rKSB7XG4gICAgICBpZiAoIWxpc3RlbmVyQmFuay5oYXNPd25Qcm9wZXJ0eShyZWdpc3RyYXRpb25OYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFsaXN0ZW5lckJhbmtbcmVnaXN0cmF0aW9uTmFtZV1ba2V5XSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIFBsdWdpbk1vZHVsZSA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV07XG4gICAgICBpZiAoUGx1Z2luTW9kdWxlICYmIFBsdWdpbk1vZHVsZS53aWxsRGVsZXRlTGlzdGVuZXIpIHtcbiAgICAgICAgUGx1Z2luTW9kdWxlLndpbGxEZWxldGVMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lKTtcbiAgICAgIH1cblxuICAgICAgZGVsZXRlIGxpc3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXVtrZXldO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQWxsb3dzIHJlZ2lzdGVyZWQgcGx1Z2lucyBhbiBvcHBvcnR1bml0eSB0byBleHRyYWN0IGV2ZW50cyBmcm9tIHRvcC1sZXZlbFxuICAgKiBuYXRpdmUgYnJvd3NlciBldmVudHMuXG4gICAqXG4gICAqIEByZXR1cm4geyp9IEFuIGFjY3VtdWxhdGlvbiBvZiBzeW50aGV0aWMgZXZlbnRzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIHZhciBldmVudHM7XG4gICAgdmFyIHBsdWdpbnMgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnBsdWdpbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBOb3QgZXZlcnkgcGx1Z2luIGluIHRoZSBvcmRlcmluZyBtYXkgYmUgbG9hZGVkIGF0IHJ1bnRpbWUuXG4gICAgICB2YXIgcG9zc2libGVQbHVnaW4gPSBwbHVnaW5zW2ldO1xuICAgICAgaWYgKHBvc3NpYmxlUGx1Z2luKSB7XG4gICAgICAgIHZhciBleHRyYWN0ZWRFdmVudHMgPSBwb3NzaWJsZVBsdWdpbi5leHRyYWN0RXZlbnRzKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICAgICAgaWYgKGV4dHJhY3RlZEV2ZW50cykge1xuICAgICAgICAgIGV2ZW50cyA9IGFjY3VtdWxhdGVJbnRvKGV2ZW50cywgZXh0cmFjdGVkRXZlbnRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXZlbnRzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBFbnF1ZXVlcyBhIHN5bnRoZXRpYyBldmVudCB0aGF0IHNob3VsZCBiZSBkaXNwYXRjaGVkIHdoZW5cbiAgICogYHByb2Nlc3NFdmVudFF1ZXVlYCBpcyBpbnZva2VkLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IGV2ZW50cyBBbiBhY2N1bXVsYXRpb24gb2Ygc3ludGhldGljIGV2ZW50cy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlRXZlbnRzOiBmdW5jdGlvbiAoZXZlbnRzKSB7XG4gICAgaWYgKGV2ZW50cykge1xuICAgICAgZXZlbnRRdWV1ZSA9IGFjY3VtdWxhdGVJbnRvKGV2ZW50UXVldWUsIGV2ZW50cyk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFsbCBzeW50aGV0aWMgZXZlbnRzIG9uIHRoZSBldmVudCBxdWV1ZS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm9jZXNzRXZlbnRRdWV1ZTogZnVuY3Rpb24gKHNpbXVsYXRlZCkge1xuICAgIC8vIFNldCBgZXZlbnRRdWV1ZWAgdG8gbnVsbCBiZWZvcmUgcHJvY2Vzc2luZyBpdCBzbyB0aGF0IHdlIGNhbiB0ZWxsIGlmIG1vcmVcbiAgICAvLyBldmVudHMgZ2V0IGVucXVldWVkIHdoaWxlIHByb2Nlc3NpbmcuXG4gICAgdmFyIHByb2Nlc3NpbmdFdmVudFF1ZXVlID0gZXZlbnRRdWV1ZTtcbiAgICBldmVudFF1ZXVlID0gbnVsbDtcbiAgICBpZiAoc2ltdWxhdGVkKSB7XG4gICAgICBmb3JFYWNoQWNjdW11bGF0ZWQocHJvY2Vzc2luZ0V2ZW50UXVldWUsIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFzZVNpbXVsYXRlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvckVhY2hBY2N1bXVsYXRlZChwcm9jZXNzaW5nRXZlbnRRdWV1ZSwgZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlVG9wTGV2ZWwpO1xuICAgIH1cbiAgICAhIWV2ZW50UXVldWUgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3Byb2Nlc3NFdmVudFF1ZXVlKCk6IEFkZGl0aW9uYWwgZXZlbnRzIHdlcmUgZW5xdWV1ZWQgd2hpbGUgcHJvY2Vzc2luZyBhbiBldmVudCBxdWV1ZS4gU3VwcG9ydCBmb3IgdGhpcyBoYXMgbm90IHlldCBiZWVuIGltcGxlbWVudGVkLicpIDogX3Byb2RJbnZhcmlhbnQoJzk1JykgOiB2b2lkIDA7XG4gICAgLy8gVGhpcyB3b3VsZCBiZSBhIGdvb2QgdGltZSB0byByZXRocm93IGlmIGFueSBvZiB0aGUgZXZlbnQgaGFuZGxlcnMgdGhyZXcuXG4gICAgUmVhY3RFcnJvclV0aWxzLnJldGhyb3dDYXVnaHRFcnJvcigpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUaGVzZSBhcmUgbmVlZGVkIGZvciB0ZXN0cyBvbmx5LiBEbyBub3QgdXNlIVxuICAgKi9cbiAgX19wdXJnZTogZnVuY3Rpb24gKCkge1xuICAgIGxpc3RlbmVyQmFuayA9IHt9O1xuICB9LFxuXG4gIF9fZ2V0TGlzdGVuZXJCYW5rOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGxpc3RlbmVyQmFuaztcbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50UGx1Z2luSHViOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIEluamVjdGFibGUgb3JkZXJpbmcgb2YgZXZlbnQgcGx1Z2lucy5cbiAqL1xudmFyIGV2ZW50UGx1Z2luT3JkZXIgPSBudWxsO1xuXG4vKipcbiAqIEluamVjdGFibGUgbWFwcGluZyBmcm9tIG5hbWVzIHRvIGV2ZW50IHBsdWdpbiBtb2R1bGVzLlxuICovXG52YXIgbmFtZXNUb1BsdWdpbnMgPSB7fTtcblxuLyoqXG4gKiBSZWNvbXB1dGVzIHRoZSBwbHVnaW4gbGlzdCB1c2luZyB0aGUgaW5qZWN0ZWQgcGx1Z2lucyBhbmQgcGx1Z2luIG9yZGVyaW5nLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHJlY29tcHV0ZVBsdWdpbk9yZGVyaW5nKCkge1xuICBpZiAoIWV2ZW50UGx1Z2luT3JkZXIpIHtcbiAgICAvLyBXYWl0IHVudGlsIGFuIGBldmVudFBsdWdpbk9yZGVyYCBpcyBpbmplY3RlZC5cbiAgICByZXR1cm47XG4gIH1cbiAgZm9yICh2YXIgcGx1Z2luTmFtZSBpbiBuYW1lc1RvUGx1Z2lucykge1xuICAgIHZhciBwbHVnaW5Nb2R1bGUgPSBuYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXTtcbiAgICB2YXIgcGx1Z2luSW5kZXggPSBldmVudFBsdWdpbk9yZGVyLmluZGV4T2YocGx1Z2luTmFtZSk7XG4gICAgIShwbHVnaW5JbmRleCA+IC0xKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXZlbnRQbHVnaW5SZWdpc3RyeTogQ2Fubm90IGluamVjdCBldmVudCBwbHVnaW5zIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBwbHVnaW4gb3JkZXJpbmcsIGAlc2AuJywgcGx1Z2luTmFtZSkgOiBfcHJvZEludmFyaWFudCgnOTYnLCBwbHVnaW5OYW1lKSA6IHZvaWQgMDtcbiAgICBpZiAoRXZlbnRQbHVnaW5SZWdpc3RyeS5wbHVnaW5zW3BsdWdpbkluZGV4XSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgICFwbHVnaW5Nb2R1bGUuZXh0cmFjdEV2ZW50cyA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXZlbnRQbHVnaW5SZWdpc3RyeTogRXZlbnQgcGx1Z2lucyBtdXN0IGltcGxlbWVudCBhbiBgZXh0cmFjdEV2ZW50c2AgbWV0aG9kLCBidXQgYCVzYCBkb2VzIG5vdC4nLCBwbHVnaW5OYW1lKSA6IF9wcm9kSW52YXJpYW50KCc5NycsIHBsdWdpbk5hbWUpIDogdm9pZCAwO1xuICAgIEV2ZW50UGx1Z2luUmVnaXN0cnkucGx1Z2luc1twbHVnaW5JbmRleF0gPSBwbHVnaW5Nb2R1bGU7XG4gICAgdmFyIHB1Ymxpc2hlZEV2ZW50cyA9IHBsdWdpbk1vZHVsZS5ldmVudFR5cGVzO1xuICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBwdWJsaXNoZWRFdmVudHMpIHtcbiAgICAgICFwdWJsaXNoRXZlbnRGb3JQbHVnaW4ocHVibGlzaGVkRXZlbnRzW2V2ZW50TmFtZV0sIHBsdWdpbk1vZHVsZSwgZXZlbnROYW1lKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXZlbnRQbHVnaW5SZWdpc3RyeTogRmFpbGVkIHRvIHB1Ymxpc2ggZXZlbnQgYCVzYCBmb3IgcGx1Z2luIGAlc2AuJywgZXZlbnROYW1lLCBwbHVnaW5OYW1lKSA6IF9wcm9kSW52YXJpYW50KCc5OCcsIGV2ZW50TmFtZSwgcGx1Z2luTmFtZSkgOiB2b2lkIDA7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUHVibGlzaGVzIGFuIGV2ZW50IHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BhdGNoZWQgYnkgdGhlIHN1cHBsaWVkIHBsdWdpbi5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgRGlzcGF0Y2ggY29uZmlndXJhdGlvbiBmb3IgdGhlIGV2ZW50LlxuICogQHBhcmFtIHtvYmplY3R9IFBsdWdpbk1vZHVsZSBQbHVnaW4gcHVibGlzaGluZyB0aGUgZXZlbnQuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBldmVudCB3YXMgc3VjY2Vzc2Z1bGx5IHB1Ymxpc2hlZC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHB1Ymxpc2hFdmVudEZvclBsdWdpbihkaXNwYXRjaENvbmZpZywgcGx1Z2luTW9kdWxlLCBldmVudE5hbWUpIHtcbiAgISFFdmVudFBsdWdpblJlZ2lzdHJ5LmV2ZW50TmFtZURpc3BhdGNoQ29uZmlncy5oYXNPd25Qcm9wZXJ0eShldmVudE5hbWUpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpbkh1YjogTW9yZSB0aGFuIG9uZSBwbHVnaW4gYXR0ZW1wdGVkIHRvIHB1Ymxpc2ggdGhlIHNhbWUgZXZlbnQgbmFtZSwgYCVzYC4nLCBldmVudE5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzk5JywgZXZlbnROYW1lKSA6IHZvaWQgMDtcbiAgRXZlbnRQbHVnaW5SZWdpc3RyeS5ldmVudE5hbWVEaXNwYXRjaENvbmZpZ3NbZXZlbnROYW1lXSA9IGRpc3BhdGNoQ29uZmlnO1xuXG4gIHZhciBwaGFzZWRSZWdpc3RyYXRpb25OYW1lcyA9IGRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzO1xuICBpZiAocGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpIHtcbiAgICBmb3IgKHZhciBwaGFzZU5hbWUgaW4gcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpIHtcbiAgICAgIGlmIChwaGFzZWRSZWdpc3RyYXRpb25OYW1lcy5oYXNPd25Qcm9wZXJ0eShwaGFzZU5hbWUpKSB7XG4gICAgICAgIHZhciBwaGFzZWRSZWdpc3RyYXRpb25OYW1lID0gcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXNbcGhhc2VOYW1lXTtcbiAgICAgICAgcHVibGlzaFJlZ2lzdHJhdGlvbk5hbWUocGhhc2VkUmVnaXN0cmF0aW9uTmFtZSwgcGx1Z2luTW9kdWxlLCBldmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChkaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgcHVibGlzaFJlZ2lzdHJhdGlvbk5hbWUoZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSwgcGx1Z2luTW9kdWxlLCBldmVudE5hbWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgYSByZWdpc3RyYXRpb24gbmFtZSB0aGF0IGlzIHVzZWQgdG8gaWRlbnRpZnkgZGlzcGF0Y2hlZCBldmVudHMgYW5kXG4gKiBjYW4gYmUgdXNlZCB3aXRoIGBFdmVudFBsdWdpbkh1Yi5wdXRMaXN0ZW5lcmAgdG8gcmVnaXN0ZXIgbGlzdGVuZXJzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb25OYW1lIFJlZ2lzdHJhdGlvbiBuYW1lIHRvIGFkZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBQbHVnaW5Nb2R1bGUgUGx1Z2luIHB1Ymxpc2hpbmcgdGhlIGV2ZW50LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcHVibGlzaFJlZ2lzdHJhdGlvbk5hbWUocmVnaXN0cmF0aW9uTmFtZSwgcGx1Z2luTW9kdWxlLCBldmVudE5hbWUpIHtcbiAgISFFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3JlZ2lzdHJhdGlvbk5hbWVdID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpbkh1YjogTW9yZSB0aGFuIG9uZSBwbHVnaW4gYXR0ZW1wdGVkIHRvIHB1Ymxpc2ggdGhlIHNhbWUgcmVnaXN0cmF0aW9uIG5hbWUsIGAlc2AuJywgcmVnaXN0cmF0aW9uTmFtZSkgOiBfcHJvZEludmFyaWFudCgnMTAwJywgcmVnaXN0cmF0aW9uTmFtZSkgOiB2b2lkIDA7XG4gIEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV0gPSBwbHVnaW5Nb2R1bGU7XG4gIEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tyZWdpc3RyYXRpb25OYW1lXSA9IHBsdWdpbk1vZHVsZS5ldmVudFR5cGVzW2V2ZW50TmFtZV0uZGVwZW5kZW5jaWVzO1xuXG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IHJlZ2lzdHJhdGlvbk5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBFdmVudFBsdWdpblJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXNbbG93ZXJDYXNlZE5hbWVdID0gcmVnaXN0cmF0aW9uTmFtZTtcblxuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lID09PSAnb25Eb3VibGVDbGljaycpIHtcbiAgICAgIEV2ZW50UGx1Z2luUmVnaXN0cnkucG9zc2libGVSZWdpc3RyYXRpb25OYW1lcy5vbmRibGNsaWNrID0gcmVnaXN0cmF0aW9uTmFtZTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgcGx1Z2lucyBzbyB0aGF0IHRoZXkgY2FuIGV4dHJhY3QgYW5kIGRpc3BhdGNoIGV2ZW50cy5cbiAqXG4gKiBAc2VlIHtFdmVudFBsdWdpbkh1Yn1cbiAqL1xudmFyIEV2ZW50UGx1Z2luUmVnaXN0cnkgPSB7XG5cbiAgLyoqXG4gICAqIE9yZGVyZWQgbGlzdCBvZiBpbmplY3RlZCBwbHVnaW5zLlxuICAgKi9cbiAgcGx1Z2luczogW10sXG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgZnJvbSBldmVudCBuYW1lIHRvIGRpc3BhdGNoIGNvbmZpZ1xuICAgKi9cbiAgZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzOiB7fSxcblxuICAvKipcbiAgICogTWFwcGluZyBmcm9tIHJlZ2lzdHJhdGlvbiBuYW1lIHRvIHBsdWdpbiBtb2R1bGVcbiAgICovXG4gIHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzOiB7fSxcblxuICAvKipcbiAgICogTWFwcGluZyBmcm9tIHJlZ2lzdHJhdGlvbiBuYW1lIHRvIGV2ZW50IG5hbWVcbiAgICovXG4gIHJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXM6IHt9LFxuXG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gbG93ZXJjYXNlIHJlZ2lzdHJhdGlvbiBuYW1lcyB0byB0aGUgcHJvcGVybHkgY2FzZWQgdmVyc2lvbixcbiAgICogdXNlZCB0byB3YXJuIGluIHRoZSBjYXNlIG9mIG1pc3NpbmcgZXZlbnQgaGFuZGxlcnMuIEF2YWlsYWJsZVxuICAgKiBvbmx5IGluIF9fREVWX18uXG4gICAqIEB0eXBlIHtPYmplY3R9XG4gICAqL1xuICBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzOiBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHt9IDogbnVsbCxcbiAgLy8gVHJ1c3QgdGhlIGRldmVsb3BlciB0byBvbmx5IHVzZSBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzIGluIF9fREVWX19cblxuICAvKipcbiAgICogSW5qZWN0cyBhbiBvcmRlcmluZyBvZiBwbHVnaW5zIChieSBwbHVnaW4gbmFtZSkuIFRoaXMgYWxsb3dzIHRoZSBvcmRlcmluZ1xuICAgKiB0byBiZSBkZWNvdXBsZWQgZnJvbSBpbmplY3Rpb24gb2YgdGhlIGFjdHVhbCBwbHVnaW5zIHNvIHRoYXQgb3JkZXJpbmcgaXNcbiAgICogYWx3YXlzIGRldGVybWluaXN0aWMgcmVnYXJkbGVzcyBvZiBwYWNrYWdpbmcsIG9uLXRoZS1mbHkgaW5qZWN0aW9uLCBldGMuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXl9IEluamVjdGVkRXZlbnRQbHVnaW5PcmRlclxuICAgKiBAaW50ZXJuYWxcbiAgICogQHNlZSB7RXZlbnRQbHVnaW5IdWIuaW5qZWN0aW9uLmluamVjdEV2ZW50UGx1Z2luT3JkZXJ9XG4gICAqL1xuICBpbmplY3RFdmVudFBsdWdpbk9yZGVyOiBmdW5jdGlvbiAoaW5qZWN0ZWRFdmVudFBsdWdpbk9yZGVyKSB7XG4gICAgISFldmVudFBsdWdpbk9yZGVyID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpblJlZ2lzdHJ5OiBDYW5ub3QgaW5qZWN0IGV2ZW50IHBsdWdpbiBvcmRlcmluZyBtb3JlIHRoYW4gb25jZS4gWW91IGFyZSBsaWtlbHkgdHJ5aW5nIHRvIGxvYWQgbW9yZSB0aGFuIG9uZSBjb3B5IG9mIFJlYWN0LicpIDogX3Byb2RJbnZhcmlhbnQoJzEwMScpIDogdm9pZCAwO1xuICAgIC8vIENsb25lIHRoZSBvcmRlcmluZyBzbyBpdCBjYW5ub3QgYmUgZHluYW1pY2FsbHkgbXV0YXRlZC5cbiAgICBldmVudFBsdWdpbk9yZGVyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaW5qZWN0ZWRFdmVudFBsdWdpbk9yZGVyKTtcbiAgICByZWNvbXB1dGVQbHVnaW5PcmRlcmluZygpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBJbmplY3RzIHBsdWdpbnMgdG8gYmUgdXNlZCBieSBgRXZlbnRQbHVnaW5IdWJgLiBUaGUgcGx1Z2luIG5hbWVzIG11c3QgYmVcbiAgICogaW4gdGhlIG9yZGVyaW5nIGluamVjdGVkIGJ5IGBpbmplY3RFdmVudFBsdWdpbk9yZGVyYC5cbiAgICpcbiAgICogUGx1Z2lucyBjYW4gYmUgaW5qZWN0ZWQgYXMgcGFydCBvZiBwYWdlIGluaXRpYWxpemF0aW9uIG9yIG9uLXRoZS1mbHkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbmplY3RlZE5hbWVzVG9QbHVnaW5zIE1hcCBmcm9tIG5hbWVzIHRvIHBsdWdpbiBtb2R1bGVzLlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHNlZSB7RXZlbnRQbHVnaW5IdWIuaW5qZWN0aW9uLmluamVjdEV2ZW50UGx1Z2luc0J5TmFtZX1cbiAgICovXG4gIGluamVjdEV2ZW50UGx1Z2luc0J5TmFtZTogZnVuY3Rpb24gKGluamVjdGVkTmFtZXNUb1BsdWdpbnMpIHtcbiAgICB2YXIgaXNPcmRlcmluZ0RpcnR5ID0gZmFsc2U7XG4gICAgZm9yICh2YXIgcGx1Z2luTmFtZSBpbiBpbmplY3RlZE5hbWVzVG9QbHVnaW5zKSB7XG4gICAgICBpZiAoIWluamVjdGVkTmFtZXNUb1BsdWdpbnMuaGFzT3duUHJvcGVydHkocGx1Z2luTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgcGx1Z2luTW9kdWxlID0gaW5qZWN0ZWROYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXTtcbiAgICAgIGlmICghbmFtZXNUb1BsdWdpbnMuaGFzT3duUHJvcGVydHkocGx1Z2luTmFtZSkgfHwgbmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV0gIT09IHBsdWdpbk1vZHVsZSkge1xuICAgICAgICAhIW5hbWVzVG9QbHVnaW5zW3BsdWdpbk5hbWVdID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpblJlZ2lzdHJ5OiBDYW5ub3QgaW5qZWN0IHR3byBkaWZmZXJlbnQgZXZlbnQgcGx1Z2lucyB1c2luZyB0aGUgc2FtZSBuYW1lLCBgJXNgLicsIHBsdWdpbk5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzEwMicsIHBsdWdpbk5hbWUpIDogdm9pZCAwO1xuICAgICAgICBuYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXSA9IHBsdWdpbk1vZHVsZTtcbiAgICAgICAgaXNPcmRlcmluZ0RpcnR5ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzT3JkZXJpbmdEaXJ0eSkge1xuICAgICAgcmVjb21wdXRlUGx1Z2luT3JkZXJpbmcoKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIExvb2tzIHVwIHRoZSBwbHVnaW4gZm9yIHRoZSBzdXBwbGllZCBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEEgc3ludGhldGljIGV2ZW50LlxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBUaGUgcGx1Z2luIHRoYXQgY3JlYXRlZCB0aGUgc3VwcGxpZWQgZXZlbnQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0UGx1Z2luTW9kdWxlRm9yRXZlbnQ6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciBkaXNwYXRjaENvbmZpZyA9IGV2ZW50LmRpc3BhdGNoQ29uZmlnO1xuICAgIGlmIChkaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgICByZXR1cm4gRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tkaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lXSB8fCBudWxsO1xuICAgIH1cbiAgICBpZiAoZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gcHVsbGluZyBwaGFzZWRSZWdpc3RyYXRpb25OYW1lcyBvdXQgb2YgZGlzcGF0Y2hDb25maWcgaGVscHMgRmxvdyBzZWVcbiAgICAgIC8vIHRoYXQgaXQgaXMgbm90IHVuZGVmaW5lZC5cbiAgICAgIHZhciBwaGFzZWRSZWdpc3RyYXRpb25OYW1lcyA9IGRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzO1xuXG4gICAgICBmb3IgKHZhciBwaGFzZSBpbiBwaGFzZWRSZWdpc3RyYXRpb25OYW1lcykge1xuICAgICAgICBpZiAoIXBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzLmhhc093blByb3BlcnR5KHBoYXNlKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwbHVnaW5Nb2R1bGUgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzW3BoYXNlXV07XG4gICAgICAgIGlmIChwbHVnaW5Nb2R1bGUpIHtcbiAgICAgICAgICByZXR1cm4gcGx1Z2luTW9kdWxlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBFeHBvc2VkIGZvciB1bml0IHRlc3RpbmcuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcmVzZXRFdmVudFBsdWdpbnM6IGZ1bmN0aW9uICgpIHtcbiAgICBldmVudFBsdWdpbk9yZGVyID0gbnVsbDtcbiAgICBmb3IgKHZhciBwbHVnaW5OYW1lIGluIG5hbWVzVG9QbHVnaW5zKSB7XG4gICAgICBpZiAobmFtZXNUb1BsdWdpbnMuaGFzT3duUHJvcGVydHkocGx1Z2luTmFtZSkpIHtcbiAgICAgICAgZGVsZXRlIG5hbWVzVG9QbHVnaW5zW3BsdWdpbk5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICBFdmVudFBsdWdpblJlZ2lzdHJ5LnBsdWdpbnMubGVuZ3RoID0gMDtcblxuICAgIHZhciBldmVudE5hbWVEaXNwYXRjaENvbmZpZ3MgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LmV2ZW50TmFtZURpc3BhdGNoQ29uZmlncztcbiAgICBmb3IgKHZhciBldmVudE5hbWUgaW4gZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzKSB7XG4gICAgICBpZiAoZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcbiAgICAgICAgZGVsZXRlIGV2ZW50TmFtZURpc3BhdGNoQ29uZmlnc1tldmVudE5hbWVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByZWdpc3RyYXRpb25OYW1lTW9kdWxlcyA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXM7XG4gICAgZm9yICh2YXIgcmVnaXN0cmF0aW9uTmFtZSBpbiByZWdpc3RyYXRpb25OYW1lTW9kdWxlcykge1xuICAgICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KHJlZ2lzdHJhdGlvbk5hbWUpKSB7XG4gICAgICAgIGRlbGV0ZSByZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tyZWdpc3RyYXRpb25OYW1lXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5wb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzO1xuICAgICAgZm9yICh2YXIgbG93ZXJDYXNlZE5hbWUgaW4gcG9zc2libGVSZWdpc3RyYXRpb25OYW1lcykge1xuICAgICAgICBpZiAocG9zc2libGVSZWdpc3RyYXRpb25OYW1lcy5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkpIHtcbiAgICAgICAgICBkZWxldGUgcG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFdmVudFBsdWdpblJlZ2lzdHJ5OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdEVycm9yVXRpbHMgPSByZXF1aXJlKCcuL1JlYWN0RXJyb3JVdGlscycpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxuLyoqXG4gKiBJbmplY3RlZCBkZXBlbmRlbmNpZXM6XG4gKi9cblxuLyoqXG4gKiAtIGBDb21wb25lbnRUcmVlYDogW3JlcXVpcmVkXSBNb2R1bGUgdGhhdCBjYW4gY29udmVydCBiZXR3ZWVuIFJlYWN0IGluc3RhbmNlc1xuICogICBhbmQgYWN0dWFsIG5vZGUgcmVmZXJlbmNlcy5cbiAqL1xudmFyIENvbXBvbmVudFRyZWU7XG52YXIgVHJlZVRyYXZlcnNhbDtcbnZhciBpbmplY3Rpb24gPSB7XG4gIGluamVjdENvbXBvbmVudFRyZWU6IGZ1bmN0aW9uIChJbmplY3RlZCkge1xuICAgIENvbXBvbmVudFRyZWUgPSBJbmplY3RlZDtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhJbmplY3RlZCAmJiBJbmplY3RlZC5nZXROb2RlRnJvbUluc3RhbmNlICYmIEluamVjdGVkLmdldEluc3RhbmNlRnJvbU5vZGUsICdFdmVudFBsdWdpblV0aWxzLmluamVjdGlvbi5pbmplY3RDb21wb25lbnRUcmVlKC4uLik6IEluamVjdGVkICcgKyAnbW9kdWxlIGlzIG1pc3NpbmcgZ2V0Tm9kZUZyb21JbnN0YW5jZSBvciBnZXRJbnN0YW5jZUZyb21Ob2RlLicpIDogdm9pZCAwO1xuICAgIH1cbiAgfSxcbiAgaW5qZWN0VHJlZVRyYXZlcnNhbDogZnVuY3Rpb24gKEluamVjdGVkKSB7XG4gICAgVHJlZVRyYXZlcnNhbCA9IEluamVjdGVkO1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKEluamVjdGVkICYmIEluamVjdGVkLmlzQW5jZXN0b3IgJiYgSW5qZWN0ZWQuZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IsICdFdmVudFBsdWdpblV0aWxzLmluamVjdGlvbi5pbmplY3RUcmVlVHJhdmVyc2FsKC4uLik6IEluamVjdGVkICcgKyAnbW9kdWxlIGlzIG1pc3NpbmcgaXNBbmNlc3RvciBvciBnZXRMb3dlc3RDb21tb25BbmNlc3Rvci4nKSA6IHZvaWQgMDtcbiAgICB9XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGlzRW5kaXNoKHRvcExldmVsVHlwZSkge1xuICByZXR1cm4gdG9wTGV2ZWxUeXBlID09PSAndG9wTW91c2VVcCcgfHwgdG9wTGV2ZWxUeXBlID09PSAndG9wVG91Y2hFbmQnIHx8IHRvcExldmVsVHlwZSA9PT0gJ3RvcFRvdWNoQ2FuY2VsJztcbn1cblxuZnVuY3Rpb24gaXNNb3ZlaXNoKHRvcExldmVsVHlwZSkge1xuICByZXR1cm4gdG9wTGV2ZWxUeXBlID09PSAndG9wTW91c2VNb3ZlJyB8fCB0b3BMZXZlbFR5cGUgPT09ICd0b3BUb3VjaE1vdmUnO1xufVxuZnVuY3Rpb24gaXNTdGFydGlzaCh0b3BMZXZlbFR5cGUpIHtcbiAgcmV0dXJuIHRvcExldmVsVHlwZSA9PT0gJ3RvcE1vdXNlRG93bicgfHwgdG9wTGV2ZWxUeXBlID09PSAndG9wVG91Y2hTdGFydCc7XG59XG5cbnZhciB2YWxpZGF0ZUV2ZW50RGlzcGF0Y2hlcztcbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YWxpZGF0ZUV2ZW50RGlzcGF0Y2hlcyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciBkaXNwYXRjaExpc3RlbmVycyA9IGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycztcbiAgICB2YXIgZGlzcGF0Y2hJbnN0YW5jZXMgPSBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXM7XG5cbiAgICB2YXIgbGlzdGVuZXJzSXNBcnIgPSBBcnJheS5pc0FycmF5KGRpc3BhdGNoTGlzdGVuZXJzKTtcbiAgICB2YXIgbGlzdGVuZXJzTGVuID0gbGlzdGVuZXJzSXNBcnIgPyBkaXNwYXRjaExpc3RlbmVycy5sZW5ndGggOiBkaXNwYXRjaExpc3RlbmVycyA/IDEgOiAwO1xuXG4gICAgdmFyIGluc3RhbmNlc0lzQXJyID0gQXJyYXkuaXNBcnJheShkaXNwYXRjaEluc3RhbmNlcyk7XG4gICAgdmFyIGluc3RhbmNlc0xlbiA9IGluc3RhbmNlc0lzQXJyID8gZGlzcGF0Y2hJbnN0YW5jZXMubGVuZ3RoIDogZGlzcGF0Y2hJbnN0YW5jZXMgPyAxIDogMDtcblxuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhpbnN0YW5jZXNJc0FyciA9PT0gbGlzdGVuZXJzSXNBcnIgJiYgaW5zdGFuY2VzTGVuID09PSBsaXN0ZW5lcnNMZW4sICdFdmVudFBsdWdpblV0aWxzOiBJbnZhbGlkIGBldmVudGAuJykgOiB2b2lkIDA7XG4gIH07XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggdGhlIGV2ZW50IHRvIHRoZSBsaXN0ZW5lci5cbiAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IFN5bnRoZXRpY0V2ZW50IHRvIGhhbmRsZVxuICogQHBhcmFtIHtib29sZWFufSBzaW11bGF0ZWQgSWYgdGhlIGV2ZW50IGlzIHNpbXVsYXRlZCAoY2hhbmdlcyBleG4gYmVoYXZpb3IpXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBsaXN0ZW5lciBBcHBsaWNhdGlvbi1sZXZlbCBjYWxsYmFja1xuICogQHBhcmFtIHsqfSBpbnN0IEludGVybmFsIGNvbXBvbmVudCBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2goZXZlbnQsIHNpbXVsYXRlZCwgbGlzdGVuZXIsIGluc3QpIHtcbiAgdmFyIHR5cGUgPSBldmVudC50eXBlIHx8ICd1bmtub3duLWV2ZW50JztcbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IEV2ZW50UGx1Z2luVXRpbHMuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtcbiAgaWYgKHNpbXVsYXRlZCkge1xuICAgIFJlYWN0RXJyb3JVdGlscy5pbnZva2VHdWFyZGVkQ2FsbGJhY2tXaXRoQ2F0Y2godHlwZSwgbGlzdGVuZXIsIGV2ZW50KTtcbiAgfSBlbHNlIHtcbiAgICBSZWFjdEVycm9yVXRpbHMuaW52b2tlR3VhcmRlZENhbGxiYWNrKHR5cGUsIGxpc3RlbmVyLCBldmVudCk7XG4gIH1cbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IG51bGw7XG59XG5cbi8qKlxuICogU3RhbmRhcmQvc2ltcGxlIGl0ZXJhdGlvbiB0aHJvdWdoIGFuIGV2ZW50J3MgY29sbGVjdGVkIGRpc3BhdGNoZXMuXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcihldmVudCwgc2ltdWxhdGVkKSB7XG4gIHZhciBkaXNwYXRjaExpc3RlbmVycyA9IGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycztcbiAgdmFyIGRpc3BhdGNoSW5zdGFuY2VzID0gZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzO1xuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YWxpZGF0ZUV2ZW50RGlzcGF0Y2hlcyhldmVudCk7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoZGlzcGF0Y2hMaXN0ZW5lcnMpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNwYXRjaExpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLyBMaXN0ZW5lcnMgYW5kIEluc3RhbmNlcyBhcmUgdHdvIHBhcmFsbGVsIGFycmF5cyB0aGF0IGFyZSBhbHdheXMgaW4gc3luYy5cbiAgICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgc2ltdWxhdGVkLCBkaXNwYXRjaExpc3RlbmVyc1tpXSwgZGlzcGF0Y2hJbnN0YW5jZXNbaV0pO1xuICAgIH1cbiAgfSBlbHNlIGlmIChkaXNwYXRjaExpc3RlbmVycykge1xuICAgIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgc2ltdWxhdGVkLCBkaXNwYXRjaExpc3RlbmVycywgZGlzcGF0Y2hJbnN0YW5jZXMpO1xuICB9XG4gIGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycyA9IG51bGw7XG4gIGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcyA9IG51bGw7XG59XG5cbi8qKlxuICogU3RhbmRhcmQvc2ltcGxlIGl0ZXJhdGlvbiB0aHJvdWdoIGFuIGV2ZW50J3MgY29sbGVjdGVkIGRpc3BhdGNoZXMsIGJ1dCBzdG9wc1xuICogYXQgdGhlIGZpcnN0IGRpc3BhdGNoIGV4ZWN1dGlvbiByZXR1cm5pbmcgdHJ1ZSwgYW5kIHJldHVybnMgdGhhdCBpZC5cbiAqXG4gKiBAcmV0dXJuIHs/c3RyaW5nfSBpZCBvZiB0aGUgZmlyc3QgZGlzcGF0Y2ggZXhlY3V0aW9uIHdobydzIGxpc3RlbmVyIHJldHVybnNcbiAqIHRydWUsIG9yIG51bGwgaWYgbm8gbGlzdGVuZXIgcmV0dXJuZWQgdHJ1ZS5cbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZUltcGwoZXZlbnQpIHtcbiAgdmFyIGRpc3BhdGNoTGlzdGVuZXJzID0gZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzO1xuICB2YXIgZGlzcGF0Y2hJbnN0YW5jZXMgPSBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXM7XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZhbGlkYXRlRXZlbnREaXNwYXRjaGVzKGV2ZW50KTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShkaXNwYXRjaExpc3RlbmVycykpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIExpc3RlbmVycyBhbmQgSW5zdGFuY2VzIGFyZSB0d28gcGFyYWxsZWwgYXJyYXlzIHRoYXQgYXJlIGFsd2F5cyBpbiBzeW5jLlxuICAgICAgaWYgKGRpc3BhdGNoTGlzdGVuZXJzW2ldKGV2ZW50LCBkaXNwYXRjaEluc3RhbmNlc1tpXSkpIHtcbiAgICAgICAgcmV0dXJuIGRpc3BhdGNoSW5zdGFuY2VzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChkaXNwYXRjaExpc3RlbmVycykge1xuICAgIGlmIChkaXNwYXRjaExpc3RlbmVycyhldmVudCwgZGlzcGF0Y2hJbnN0YW5jZXMpKSB7XG4gICAgICByZXR1cm4gZGlzcGF0Y2hJbnN0YW5jZXM7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEBzZWUgZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZUltcGxcbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZShldmVudCkge1xuICB2YXIgcmV0ID0gZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZUltcGwoZXZlbnQpO1xuICBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMgPSBudWxsO1xuICBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMgPSBudWxsO1xuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIEV4ZWN1dGlvbiBvZiBhIFwiZGlyZWN0XCIgZGlzcGF0Y2ggLSB0aGVyZSBtdXN0IGJlIGF0IG1vc3Qgb25lIGRpc3BhdGNoXG4gKiBhY2N1bXVsYXRlZCBvbiB0aGUgZXZlbnQgb3IgaXQgaXMgY29uc2lkZXJlZCBhbiBlcnJvci4gSXQgZG9lc24ndCByZWFsbHkgbWFrZVxuICogc2Vuc2UgZm9yIGFuIGV2ZW50IHdpdGggbXVsdGlwbGUgZGlzcGF0Y2hlcyAoYnViYmxlZCkgdG8ga2VlcCB0cmFjayBvZiB0aGVcbiAqIHJldHVybiB2YWx1ZXMgYXQgZWFjaCBkaXNwYXRjaCBleGVjdXRpb24sIGJ1dCBpdCBkb2VzIHRlbmQgdG8gbWFrZSBzZW5zZSB3aGVuXG4gKiBkZWFsaW5nIHdpdGggXCJkaXJlY3RcIiBkaXNwYXRjaGVzLlxuICpcbiAqIEByZXR1cm4geyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgZXhlY3V0aW5nIHRoZSBzaW5nbGUgZGlzcGF0Y2guXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEaXJlY3REaXNwYXRjaChldmVudCkge1xuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YWxpZGF0ZUV2ZW50RGlzcGF0Y2hlcyhldmVudCk7XG4gIH1cbiAgdmFyIGRpc3BhdGNoTGlzdGVuZXIgPSBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM7XG4gIHZhciBkaXNwYXRjaEluc3RhbmNlID0gZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzO1xuICAhIUFycmF5LmlzQXJyYXkoZGlzcGF0Y2hMaXN0ZW5lcikgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2V4ZWN1dGVEaXJlY3REaXNwYXRjaCguLi4pOiBJbnZhbGlkIGBldmVudGAuJykgOiBfcHJvZEludmFyaWFudCgnMTAzJykgOiB2b2lkIDA7XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBkaXNwYXRjaExpc3RlbmVyID8gRXZlbnRQbHVnaW5VdGlscy5nZXROb2RlRnJvbUluc3RhbmNlKGRpc3BhdGNoSW5zdGFuY2UpIDogbnVsbDtcbiAgdmFyIHJlcyA9IGRpc3BhdGNoTGlzdGVuZXIgPyBkaXNwYXRjaExpc3RlbmVyKGV2ZW50KSA6IG51bGw7XG4gIGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBudWxsO1xuICBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnMgPSBudWxsO1xuICBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMgPSBudWxsO1xuICByZXR1cm4gcmVzO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmZiBudW1iZXIgb2YgZGlzcGF0Y2hlcyBhY2N1bXVsYXRlZCBpcyBncmVhdGVyIHRoYW4gMC5cbiAqL1xuZnVuY3Rpb24gaGFzRGlzcGF0Y2hlcyhldmVudCkge1xuICByZXR1cm4gISFldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM7XG59XG5cbi8qKlxuICogR2VuZXJhbCB1dGlsaXRpZXMgdGhhdCBhcmUgdXNlZnVsIGluIGNyZWF0aW5nIGN1c3RvbSBFdmVudCBQbHVnaW5zLlxuICovXG52YXIgRXZlbnRQbHVnaW5VdGlscyA9IHtcbiAgaXNFbmRpc2g6IGlzRW5kaXNoLFxuICBpc01vdmVpc2g6IGlzTW92ZWlzaCxcbiAgaXNTdGFydGlzaDogaXNTdGFydGlzaCxcblxuICBleGVjdXRlRGlyZWN0RGlzcGF0Y2g6IGV4ZWN1dGVEaXJlY3REaXNwYXRjaCxcbiAgZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyOiBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXIsXG4gIGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWU6IGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWUsXG4gIGhhc0Rpc3BhdGNoZXM6IGhhc0Rpc3BhdGNoZXMsXG5cbiAgZ2V0SW5zdGFuY2VGcm9tTm9kZTogZnVuY3Rpb24gKG5vZGUpIHtcbiAgICByZXR1cm4gQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpO1xuICB9LFxuICBnZXROb2RlRnJvbUluc3RhbmNlOiBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBDb21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2Uobm9kZSk7XG4gIH0sXG4gIGlzQW5jZXN0b3I6IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIFRyZWVUcmF2ZXJzYWwuaXNBbmNlc3RvcihhLCBiKTtcbiAgfSxcbiAgZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3I6IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIFRyZWVUcmF2ZXJzYWwuZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoYSwgYik7XG4gIH0sXG4gIGdldFBhcmVudEluc3RhbmNlOiBmdW5jdGlvbiAoaW5zdCkge1xuICAgIHJldHVybiBUcmVlVHJhdmVyc2FsLmdldFBhcmVudEluc3RhbmNlKGluc3QpO1xuICB9LFxuICB0cmF2ZXJzZVR3b1BoYXNlOiBmdW5jdGlvbiAodGFyZ2V0LCBmbiwgYXJnKSB7XG4gICAgcmV0dXJuIFRyZWVUcmF2ZXJzYWwudHJhdmVyc2VUd29QaGFzZSh0YXJnZXQsIGZuLCBhcmcpO1xuICB9LFxuICB0cmF2ZXJzZUVudGVyTGVhdmU6IGZ1bmN0aW9uIChmcm9tLCB0bywgZm4sIGFyZ0Zyb20sIGFyZ1RvKSB7XG4gICAgcmV0dXJuIFRyZWVUcmF2ZXJzYWwudHJhdmVyc2VFbnRlckxlYXZlKGZyb20sIHRvLCBmbiwgYXJnRnJvbSwgYXJnVG8pO1xuICB9LFxuXG4gIGluamVjdGlvbjogaW5qZWN0aW9uXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50UGx1Z2luVXRpbHM7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV2ZW50UGx1Z2luSHViID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpbkh1YicpO1xudmFyIEV2ZW50UGx1Z2luVXRpbHMgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luVXRpbHMnKTtcblxudmFyIGFjY3VtdWxhdGVJbnRvID0gcmVxdWlyZSgnLi9hY2N1bXVsYXRlSW50bycpO1xudmFyIGZvckVhY2hBY2N1bXVsYXRlZCA9IHJlcXVpcmUoJy4vZm9yRWFjaEFjY3VtdWxhdGVkJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIGdldExpc3RlbmVyID0gRXZlbnRQbHVnaW5IdWIuZ2V0TGlzdGVuZXI7XG5cbi8qKlxuICogU29tZSBldmVudCB0eXBlcyBoYXZlIGEgbm90aW9uIG9mIGRpZmZlcmVudCByZWdpc3RyYXRpb24gbmFtZXMgZm9yIGRpZmZlcmVudFxuICogXCJwaGFzZXNcIiBvZiBwcm9wYWdhdGlvbi4gVGhpcyBmaW5kcyBsaXN0ZW5lcnMgYnkgYSBnaXZlbiBwaGFzZS5cbiAqL1xuZnVuY3Rpb24gbGlzdGVuZXJBdFBoYXNlKGluc3QsIGV2ZW50LCBwcm9wYWdhdGlvblBoYXNlKSB7XG4gIHZhciByZWdpc3RyYXRpb25OYW1lID0gZXZlbnQuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXNbcHJvcGFnYXRpb25QaGFzZV07XG4gIHJldHVybiBnZXRMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lKTtcbn1cblxuLyoqXG4gKiBUYWdzIGEgYFN5bnRoZXRpY0V2ZW50YCB3aXRoIGRpc3BhdGNoZWQgbGlzdGVuZXJzLiBDcmVhdGluZyB0aGlzIGZ1bmN0aW9uXG4gKiBoZXJlLCBhbGxvd3MgdXMgdG8gbm90IGhhdmUgdG8gYmluZCBvciBjcmVhdGUgZnVuY3Rpb25zIGZvciBlYWNoIGV2ZW50LlxuICogTXV0YXRpbmcgdGhlIGV2ZW50J3MgbWVtYmVycyBhbGxvd3MgdXMgdG8gbm90IGhhdmUgdG8gY3JlYXRlIGEgd3JhcHBpbmdcbiAqIFwiZGlzcGF0Y2hcIiBvYmplY3QgdGhhdCBwYWlycyB0aGUgZXZlbnQgd2l0aCB0aGUgbGlzdGVuZXIuXG4gKi9cbmZ1bmN0aW9uIGFjY3VtdWxhdGVEaXJlY3Rpb25hbERpc3BhdGNoZXMoaW5zdCwgcGhhc2UsIGV2ZW50KSB7XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhpbnN0LCAnRGlzcGF0Y2hpbmcgaW5zdCBtdXN0IG5vdCBiZSBudWxsJykgOiB2b2lkIDA7XG4gIH1cbiAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJBdFBoYXNlKGluc3QsIGV2ZW50LCBwaGFzZSk7XG4gIGlmIChsaXN0ZW5lcikge1xuICAgIGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycyA9IGFjY3VtdWxhdGVJbnRvKGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycywgbGlzdGVuZXIpO1xuICAgIGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcyA9IGFjY3VtdWxhdGVJbnRvKGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcywgaW5zdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDb2xsZWN0IGRpc3BhdGNoZXMgKG11c3QgYmUgZW50aXJlbHkgY29sbGVjdGVkIGJlZm9yZSBkaXNwYXRjaGluZyAtIHNlZSB1bml0XG4gKiB0ZXN0cykuIExhemlseSBhbGxvY2F0ZSB0aGUgYXJyYXkgdG8gY29uc2VydmUgbWVtb3J5LiAgV2UgbXVzdCBsb29wIHRocm91Z2hcbiAqIGVhY2ggZXZlbnQgYW5kIHBlcmZvcm0gdGhlIHRyYXZlcnNhbCBmb3IgZWFjaCBvbmUuIFdlIGNhbm5vdCBwZXJmb3JtIGFcbiAqIHNpbmdsZSB0cmF2ZXJzYWwgZm9yIHRoZSBlbnRpcmUgY29sbGVjdGlvbiBvZiBldmVudHMgYmVjYXVzZSBlYWNoIGV2ZW50IG1heVxuICogaGF2ZSBhIGRpZmZlcmVudCB0YXJnZXQuXG4gKi9cbmZ1bmN0aW9uIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTaW5nbGUoZXZlbnQpIHtcbiAgaWYgKGV2ZW50ICYmIGV2ZW50LmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKSB7XG4gICAgRXZlbnRQbHVnaW5VdGlscy50cmF2ZXJzZVR3b1BoYXNlKGV2ZW50Ll90YXJnZXRJbnN0LCBhY2N1bXVsYXRlRGlyZWN0aW9uYWxEaXNwYXRjaGVzLCBldmVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTYW1lIGFzIGBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2luZ2xlYCwgYnV0IHNraXBzIG92ZXIgdGhlIHRhcmdldElELlxuICovXG5mdW5jdGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2luZ2xlU2tpcFRhcmdldChldmVudCkge1xuICBpZiAoZXZlbnQgJiYgZXZlbnQuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpIHtcbiAgICB2YXIgdGFyZ2V0SW5zdCA9IGV2ZW50Ll90YXJnZXRJbnN0O1xuICAgIHZhciBwYXJlbnRJbnN0ID0gdGFyZ2V0SW5zdCA/IEV2ZW50UGx1Z2luVXRpbHMuZ2V0UGFyZW50SW5zdGFuY2UodGFyZ2V0SW5zdCkgOiBudWxsO1xuICAgIEV2ZW50UGx1Z2luVXRpbHMudHJhdmVyc2VUd29QaGFzZShwYXJlbnRJbnN0LCBhY2N1bXVsYXRlRGlyZWN0aW9uYWxEaXNwYXRjaGVzLCBldmVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBY2N1bXVsYXRlcyB3aXRob3V0IHJlZ2FyZCB0byBkaXJlY3Rpb24sIGRvZXMgbm90IGxvb2sgZm9yIHBoYXNlZFxuICogcmVnaXN0cmF0aW9uIG5hbWVzLiBTYW1lIGFzIGBhY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlc1NpbmdsZWAgYnV0IHdpdGhvdXRcbiAqIHJlcXVpcmluZyB0aGF0IHRoZSBgZGlzcGF0Y2hNYXJrZXJgIGJlIHRoZSBzYW1lIGFzIHRoZSBkaXNwYXRjaGVkIElELlxuICovXG5mdW5jdGlvbiBhY2N1bXVsYXRlRGlzcGF0Y2hlcyhpbnN0LCBpZ25vcmVkRGlyZWN0aW9uLCBldmVudCkge1xuICBpZiAoZXZlbnQgJiYgZXZlbnQuZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSkge1xuICAgIHZhciByZWdpc3RyYXRpb25OYW1lID0gZXZlbnQuZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZTtcbiAgICB2YXIgbGlzdGVuZXIgPSBnZXRMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lKTtcbiAgICBpZiAobGlzdGVuZXIpIHtcbiAgICAgIGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycyA9IGFjY3VtdWxhdGVJbnRvKGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycywgbGlzdGVuZXIpO1xuICAgICAgZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzID0gYWNjdW11bGF0ZUludG8oZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzLCBpbnN0KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBY2N1bXVsYXRlcyBkaXNwYXRjaGVzIG9uIGFuIGBTeW50aGV0aWNFdmVudGAsIGJ1dCBvbmx5IGZvciB0aGVcbiAqIGBkaXNwYXRjaE1hcmtlcmAuXG4gKiBAcGFyYW0ge1N5bnRoZXRpY0V2ZW50fSBldmVudFxuICovXG5mdW5jdGlvbiBhY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlc1NpbmdsZShldmVudCkge1xuICBpZiAoZXZlbnQgJiYgZXZlbnQuZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSkge1xuICAgIGFjY3VtdWxhdGVEaXNwYXRjaGVzKGV2ZW50Ll90YXJnZXRJbnN0LCBudWxsLCBldmVudCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhldmVudHMpIHtcbiAgZm9yRWFjaEFjY3VtdWxhdGVkKGV2ZW50cywgYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NpbmdsZSk7XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTa2lwVGFyZ2V0KGV2ZW50cykge1xuICBmb3JFYWNoQWNjdW11bGF0ZWQoZXZlbnRzLCBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2luZ2xlU2tpcFRhcmdldCk7XG59XG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVFbnRlckxlYXZlRGlzcGF0Y2hlcyhsZWF2ZSwgZW50ZXIsIGZyb20sIHRvKSB7XG4gIEV2ZW50UGx1Z2luVXRpbHMudHJhdmVyc2VFbnRlckxlYXZlKGZyb20sIHRvLCBhY2N1bXVsYXRlRGlzcGF0Y2hlcywgbGVhdmUsIGVudGVyKTtcbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXMoZXZlbnRzKSB7XG4gIGZvckVhY2hBY2N1bXVsYXRlZChldmVudHMsIGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzU2luZ2xlKTtcbn1cblxuLyoqXG4gKiBBIHNtYWxsIHNldCBvZiBwcm9wYWdhdGlvbiBwYXR0ZXJucywgZWFjaCBvZiB3aGljaCB3aWxsIGFjY2VwdCBhIHNtYWxsIGFtb3VudFxuICogb2YgaW5mb3JtYXRpb24sIGFuZCBnZW5lcmF0ZSBhIHNldCBvZiBcImRpc3BhdGNoIHJlYWR5IGV2ZW50IG9iamVjdHNcIiAtIHdoaWNoXG4gKiBhcmUgc2V0cyBvZiBldmVudHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhbm5vdGF0ZWQgd2l0aCBhIHNldCBvZiBkaXNwYXRjaGVkXG4gKiBsaXN0ZW5lciBmdW5jdGlvbnMvaWRzLiBUaGUgQVBJIGlzIGRlc2lnbmVkIHRoaXMgd2F5IHRvIGRpc2NvdXJhZ2UgdGhlc2VcbiAqIHByb3BhZ2F0aW9uIHN0cmF0ZWdpZXMgZnJvbSBhY3R1YWxseSBleGVjdXRpbmcgdGhlIGRpc3BhdGNoZXMsIHNpbmNlIHdlXG4gKiBhbHdheXMgd2FudCB0byBjb2xsZWN0IHRoZSBlbnRpcmUgc2V0IG9mIGRpc3BhdGNoZXMgYmVmb3JlIGV4ZWN1dGluZyBldmVudCBhXG4gKiBzaW5nbGUgb25lLlxuICpcbiAqIEBjb25zdHJ1Y3RvciBFdmVudFByb3BhZ2F0b3JzXG4gKi9cbnZhciBFdmVudFByb3BhZ2F0b3JzID0ge1xuICBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzOiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzLFxuICBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2tpcFRhcmdldDogYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NraXBUYXJnZXQsXG4gIGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzOiBhY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlcyxcbiAgYWNjdW11bGF0ZUVudGVyTGVhdmVEaXNwYXRjaGVzOiBhY2N1bXVsYXRlRW50ZXJMZWF2ZURpc3BhdGNoZXNcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRQcm9wYWdhdG9yczsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFBvb2xlZENsYXNzID0gcmVxdWlyZSgnLi9Qb29sZWRDbGFzcycpO1xuXG52YXIgZ2V0VGV4dENvbnRlbnRBY2Nlc3NvciA9IHJlcXVpcmUoJy4vZ2V0VGV4dENvbnRlbnRBY2Nlc3NvcicpO1xuXG4vKipcbiAqIFRoaXMgaGVscGVyIGNsYXNzIHN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCB0ZXh0IGNvbnRlbnQgb2YgYSB0YXJnZXQgbm9kZSxcbiAqIGFsbG93aW5nIGNvbXBhcmlzb24gb2YgY29udGVudCBiZWZvcmUgYW5kIGFmdGVyIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogSWRlbnRpZnkgdGhlIG5vZGUgd2hlcmUgc2VsZWN0aW9uIGN1cnJlbnRseSBiZWdpbnMsIHRoZW4gb2JzZXJ2ZVxuICogYm90aCBpdHMgdGV4dCBjb250ZW50IGFuZCBpdHMgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgRE9NLiBTaW5jZSB0aGVcbiAqIGJyb3dzZXIgbWF5IG5hdGl2ZWx5IHJlcGxhY2UgdGhlIHRhcmdldCBub2RlIGR1cmluZyBjb21wb3NpdGlvbiwgd2UgY2FuXG4gKiB1c2UgaXRzIHBvc2l0aW9uIHRvIGZpbmQgaXRzIHJlcGxhY2VtZW50LlxuICpcbiAqIEBwYXJhbSB7RE9NRXZlbnRUYXJnZXR9IHJvb3RcbiAqL1xuZnVuY3Rpb24gRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlKHJvb3QpIHtcbiAgdGhpcy5fcm9vdCA9IHJvb3Q7XG4gIHRoaXMuX3N0YXJ0VGV4dCA9IHRoaXMuZ2V0VGV4dCgpO1xuICB0aGlzLl9mYWxsYmFja1RleHQgPSBudWxsO1xufVxuXG5fYXNzaWduKEZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZS5wcm90b3R5cGUsIHtcbiAgZGVzdHJ1Y3RvcjogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuX3Jvb3QgPSBudWxsO1xuICAgIHRoaXMuX3N0YXJ0VGV4dCA9IG51bGw7XG4gICAgdGhpcy5fZmFsbGJhY2tUZXh0ID0gbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgdGV4dCBvZiBpbnB1dC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0VGV4dDogZnVuY3Rpb24gKCkge1xuICAgIGlmICgndmFsdWUnIGluIHRoaXMuX3Jvb3QpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yb290LnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fcm9vdFtnZXRUZXh0Q29udGVudEFjY2Vzc29yKCldO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmUgdGhlIGRpZmZlcmluZyBzdWJzdHJpbmcgYmV0d2VlbiB0aGUgaW5pdGlhbGx5IHN0b3JlZFxuICAgKiB0ZXh0IGNvbnRlbnQgYW5kIHRoZSBjdXJyZW50IGNvbnRlbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGdldERhdGE6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5fZmFsbGJhY2tUZXh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5fZmFsbGJhY2tUZXh0O1xuICAgIH1cblxuICAgIHZhciBzdGFydDtcbiAgICB2YXIgc3RhcnRWYWx1ZSA9IHRoaXMuX3N0YXJ0VGV4dDtcbiAgICB2YXIgc3RhcnRMZW5ndGggPSBzdGFydFZhbHVlLmxlbmd0aDtcbiAgICB2YXIgZW5kO1xuICAgIHZhciBlbmRWYWx1ZSA9IHRoaXMuZ2V0VGV4dCgpO1xuICAgIHZhciBlbmRMZW5ndGggPSBlbmRWYWx1ZS5sZW5ndGg7XG5cbiAgICBmb3IgKHN0YXJ0ID0gMDsgc3RhcnQgPCBzdGFydExlbmd0aDsgc3RhcnQrKykge1xuICAgICAgaWYgKHN0YXJ0VmFsdWVbc3RhcnRdICE9PSBlbmRWYWx1ZVtzdGFydF0pIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG1pbkVuZCA9IHN0YXJ0TGVuZ3RoIC0gc3RhcnQ7XG4gICAgZm9yIChlbmQgPSAxOyBlbmQgPD0gbWluRW5kOyBlbmQrKykge1xuICAgICAgaWYgKHN0YXJ0VmFsdWVbc3RhcnRMZW5ndGggLSBlbmRdICE9PSBlbmRWYWx1ZVtlbmRMZW5ndGggLSBlbmRdKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzbGljZVRhaWwgPSBlbmQgPiAxID8gMSAtIGVuZCA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9mYWxsYmFja1RleHQgPSBlbmRWYWx1ZS5zbGljZShzdGFydCwgc2xpY2VUYWlsKTtcbiAgICByZXR1cm4gdGhpcy5fZmFsbGJhY2tUZXh0O1xuICB9XG59KTtcblxuUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKEZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01Qcm9wZXJ0eSA9IHJlcXVpcmUoJy4vRE9NUHJvcGVydHknKTtcblxudmFyIE1VU1RfVVNFX1BST1BFUlRZID0gRE9NUHJvcGVydHkuaW5qZWN0aW9uLk1VU1RfVVNFX1BST1BFUlRZO1xudmFyIEhBU19CT09MRUFOX1ZBTFVFID0gRE9NUHJvcGVydHkuaW5qZWN0aW9uLkhBU19CT09MRUFOX1ZBTFVFO1xudmFyIEhBU19OVU1FUklDX1ZBTFVFID0gRE9NUHJvcGVydHkuaW5qZWN0aW9uLkhBU19OVU1FUklDX1ZBTFVFO1xudmFyIEhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFID0gRE9NUHJvcGVydHkuaW5qZWN0aW9uLkhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFO1xudmFyIEhBU19PVkVSTE9BREVEX0JPT0xFQU5fVkFMVUUgPSBET01Qcm9wZXJ0eS5pbmplY3Rpb24uSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRTtcblxudmFyIEhUTUxET01Qcm9wZXJ0eUNvbmZpZyA9IHtcbiAgaXNDdXN0b21BdHRyaWJ1dGU6IFJlZ0V4cC5wcm90b3R5cGUudGVzdC5iaW5kKG5ldyBSZWdFeHAoJ14oZGF0YXxhcmlhKS1bJyArIERPTVByb3BlcnR5LkFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJykpLFxuICBQcm9wZXJ0aWVzOiB7XG4gICAgLyoqXG4gICAgICogU3RhbmRhcmQgUHJvcGVydGllc1xuICAgICAqL1xuICAgIGFjY2VwdDogMCxcbiAgICBhY2NlcHRDaGFyc2V0OiAwLFxuICAgIGFjY2Vzc0tleTogMCxcbiAgICBhY3Rpb246IDAsXG4gICAgYWxsb3dGdWxsU2NyZWVuOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBhbGxvd1RyYW5zcGFyZW5jeTogMCxcbiAgICBhbHQ6IDAsXG4gICAgLy8gc3BlY2lmaWVzIHRhcmdldCBjb250ZXh0IGZvciBsaW5rcyB3aXRoIGBwcmVsb2FkYCB0eXBlXG4gICAgYXM6IDAsXG4gICAgYXN5bmM6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGF1dG9Db21wbGV0ZTogMCxcbiAgICAvLyBhdXRvRm9jdXMgaXMgcG9seWZpbGxlZC9ub3JtYWxpemVkIGJ5IEF1dG9Gb2N1c1V0aWxzXG4gICAgLy8gYXV0b0ZvY3VzOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBhdXRvUGxheTogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgY2FwdHVyZTogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgY2VsbFBhZGRpbmc6IDAsXG4gICAgY2VsbFNwYWNpbmc6IDAsXG4gICAgY2hhclNldDogMCxcbiAgICBjaGFsbGVuZ2U6IDAsXG4gICAgY2hlY2tlZDogTVVTVF9VU0VfUFJPUEVSVFkgfCBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBjaXRlOiAwLFxuICAgIGNsYXNzSUQ6IDAsXG4gICAgY2xhc3NOYW1lOiAwLFxuICAgIGNvbHM6IEhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFLFxuICAgIGNvbFNwYW46IDAsXG4gICAgY29udGVudDogMCxcbiAgICBjb250ZW50RWRpdGFibGU6IDAsXG4gICAgY29udGV4dE1lbnU6IDAsXG4gICAgY29udHJvbHM6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGNvb3JkczogMCxcbiAgICBjcm9zc09yaWdpbjogMCxcbiAgICBkYXRhOiAwLCAvLyBGb3IgYDxvYmplY3QgLz5gIGFjdHMgYXMgYHNyY2AuXG4gICAgZGF0ZVRpbWU6IDAsXG4gICAgJ2RlZmF1bHQnOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBkZWZlcjogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgZGlyOiAwLFxuICAgIGRpc2FibGVkOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBkb3dubG9hZDogSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRSxcbiAgICBkcmFnZ2FibGU6IDAsXG4gICAgZW5jVHlwZTogMCxcbiAgICBmb3JtOiAwLFxuICAgIGZvcm1BY3Rpb246IDAsXG4gICAgZm9ybUVuY1R5cGU6IDAsXG4gICAgZm9ybU1ldGhvZDogMCxcbiAgICBmb3JtTm9WYWxpZGF0ZTogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgZm9ybVRhcmdldDogMCxcbiAgICBmcmFtZUJvcmRlcjogMCxcbiAgICBoZWFkZXJzOiAwLFxuICAgIGhlaWdodDogMCxcbiAgICBoaWRkZW46IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGhpZ2g6IDAsXG4gICAgaHJlZjogMCxcbiAgICBocmVmTGFuZzogMCxcbiAgICBodG1sRm9yOiAwLFxuICAgIGh0dHBFcXVpdjogMCxcbiAgICBpY29uOiAwLFxuICAgIGlkOiAwLFxuICAgIGlucHV0TW9kZTogMCxcbiAgICBpbnRlZ3JpdHk6IDAsXG4gICAgaXM6IDAsXG4gICAga2V5UGFyYW1zOiAwLFxuICAgIGtleVR5cGU6IDAsXG4gICAga2luZDogMCxcbiAgICBsYWJlbDogMCxcbiAgICBsYW5nOiAwLFxuICAgIGxpc3Q6IDAsXG4gICAgbG9vcDogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgbG93OiAwLFxuICAgIG1hbmlmZXN0OiAwLFxuICAgIG1hcmdpbkhlaWdodDogMCxcbiAgICBtYXJnaW5XaWR0aDogMCxcbiAgICBtYXg6IDAsXG4gICAgbWF4TGVuZ3RoOiAwLFxuICAgIG1lZGlhOiAwLFxuICAgIG1lZGlhR3JvdXA6IDAsXG4gICAgbWV0aG9kOiAwLFxuICAgIG1pbjogMCxcbiAgICBtaW5MZW5ndGg6IDAsXG4gICAgLy8gQ2F1dGlvbjsgYG9wdGlvbi5zZWxlY3RlZGAgaXMgbm90IHVwZGF0ZWQgaWYgYHNlbGVjdC5tdWx0aXBsZWAgaXNcbiAgICAvLyBkaXNhYmxlZCB3aXRoIGByZW1vdmVBdHRyaWJ1dGVgLlxuICAgIG11bHRpcGxlOiBNVVNUX1VTRV9QUk9QRVJUWSB8IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIG11dGVkOiBNVVNUX1VTRV9QUk9QRVJUWSB8IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIG5hbWU6IDAsXG4gICAgbm9uY2U6IDAsXG4gICAgbm9WYWxpZGF0ZTogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgb3BlbjogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgb3B0aW11bTogMCxcbiAgICBwYXR0ZXJuOiAwLFxuICAgIHBsYWNlaG9sZGVyOiAwLFxuICAgIHBsYXlzSW5saW5lOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBwb3N0ZXI6IDAsXG4gICAgcHJlbG9hZDogMCxcbiAgICBwcm9maWxlOiAwLFxuICAgIHJhZGlvR3JvdXA6IDAsXG4gICAgcmVhZE9ubHk6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIHJlZmVycmVyUG9saWN5OiAwLFxuICAgIHJlbDogMCxcbiAgICByZXF1aXJlZDogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgcmV2ZXJzZWQ6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIHJvbGU6IDAsXG4gICAgcm93czogSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUsXG4gICAgcm93U3BhbjogSEFTX05VTUVSSUNfVkFMVUUsXG4gICAgc2FuZGJveDogMCxcbiAgICBzY29wZTogMCxcbiAgICBzY29wZWQ6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIHNjcm9sbGluZzogMCxcbiAgICBzZWFtbGVzczogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgc2VsZWN0ZWQ6IE1VU1RfVVNFX1BST1BFUlRZIHwgSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgc2hhcGU6IDAsXG4gICAgc2l6ZTogSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUsXG4gICAgc2l6ZXM6IDAsXG4gICAgc3BhbjogSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUsXG4gICAgc3BlbGxDaGVjazogMCxcbiAgICBzcmM6IDAsXG4gICAgc3JjRG9jOiAwLFxuICAgIHNyY0xhbmc6IDAsXG4gICAgc3JjU2V0OiAwLFxuICAgIHN0YXJ0OiBIQVNfTlVNRVJJQ19WQUxVRSxcbiAgICBzdGVwOiAwLFxuICAgIHN0eWxlOiAwLFxuICAgIHN1bW1hcnk6IDAsXG4gICAgdGFiSW5kZXg6IDAsXG4gICAgdGFyZ2V0OiAwLFxuICAgIHRpdGxlOiAwLFxuICAgIC8vIFNldHRpbmcgLnR5cGUgdGhyb3dzIG9uIG5vbi08aW5wdXQ+IHRhZ3NcbiAgICB0eXBlOiAwLFxuICAgIHVzZU1hcDogMCxcbiAgICB2YWx1ZTogMCxcbiAgICB3aWR0aDogMCxcbiAgICB3bW9kZTogMCxcbiAgICB3cmFwOiAwLFxuXG4gICAgLyoqXG4gICAgICogUkRGYSBQcm9wZXJ0aWVzXG4gICAgICovXG4gICAgYWJvdXQ6IDAsXG4gICAgZGF0YXR5cGU6IDAsXG4gICAgaW5saXN0OiAwLFxuICAgIHByZWZpeDogMCxcbiAgICAvLyBwcm9wZXJ0eSBpcyBhbHNvIHN1cHBvcnRlZCBmb3IgT3BlbkdyYXBoIGluIG1ldGEgdGFncy5cbiAgICBwcm9wZXJ0eTogMCxcbiAgICByZXNvdXJjZTogMCxcbiAgICAndHlwZW9mJzogMCxcbiAgICB2b2NhYjogMCxcblxuICAgIC8qKlxuICAgICAqIE5vbi1zdGFuZGFyZCBQcm9wZXJ0aWVzXG4gICAgICovXG4gICAgLy8gYXV0b0NhcGl0YWxpemUgYW5kIGF1dG9Db3JyZWN0IGFyZSBzdXBwb3J0ZWQgaW4gTW9iaWxlIFNhZmFyaSBmb3JcbiAgICAvLyBrZXlib2FyZCBoaW50cy5cbiAgICBhdXRvQ2FwaXRhbGl6ZTogMCxcbiAgICBhdXRvQ29ycmVjdDogMCxcbiAgICAvLyBhdXRvU2F2ZSBhbGxvd3MgV2ViS2l0L0JsaW5rIHRvIHBlcnNpc3QgdmFsdWVzIG9mIGlucHV0IGZpZWxkcyBvbiBwYWdlIHJlbG9hZHNcbiAgICBhdXRvU2F2ZTogMCxcbiAgICAvLyBjb2xvciBpcyBmb3IgU2FmYXJpIG1hc2staWNvbiBsaW5rXG4gICAgY29sb3I6IDAsXG4gICAgLy8gaXRlbVByb3AsIGl0ZW1TY29wZSwgaXRlbVR5cGUgYXJlIGZvclxuICAgIC8vIE1pY3JvZGF0YSBzdXBwb3J0LiBTZWUgaHR0cDovL3NjaGVtYS5vcmcvZG9jcy9ncy5odG1sXG4gICAgaXRlbVByb3A6IDAsXG4gICAgaXRlbVNjb3BlOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBpdGVtVHlwZTogMCxcbiAgICAvLyBpdGVtSUQgYW5kIGl0ZW1SZWYgYXJlIGZvciBNaWNyb2RhdGEgc3VwcG9ydCBhcyB3ZWxsIGJ1dFxuICAgIC8vIG9ubHkgc3BlY2lmaWVkIGluIHRoZSBXSEFUV0cgc3BlYyBkb2N1bWVudC4gU2VlXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvbWljcm9kYXRhLmh0bWwjbWljcm9kYXRhLWRvbS1hcGlcbiAgICBpdGVtSUQ6IDAsXG4gICAgaXRlbVJlZjogMCxcbiAgICAvLyByZXN1bHRzIHNob3cgbG9va2luZyBnbGFzcyBpY29uIGFuZCByZWNlbnQgc2VhcmNoZXMgb24gaW5wdXRcbiAgICAvLyBzZWFyY2ggZmllbGRzIGluIFdlYktpdC9CbGlua1xuICAgIHJlc3VsdHM6IDAsXG4gICAgLy8gSUUtb25seSBhdHRyaWJ1dGUgdGhhdCBzcGVjaWZpZXMgc2VjdXJpdHkgcmVzdHJpY3Rpb25zIG9uIGFuIGlmcmFtZVxuICAgIC8vIGFzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBzYW5kYm94IGF0dHJpYnV0ZSBvbiBJRTwxMFxuICAgIHNlY3VyaXR5OiAwLFxuICAgIC8vIElFLW9ubHkgYXR0cmlidXRlIHRoYXQgY29udHJvbHMgZm9jdXMgYmVoYXZpb3JcbiAgICB1bnNlbGVjdGFibGU6IDBcbiAgfSxcbiAgRE9NQXR0cmlidXRlTmFtZXM6IHtcbiAgICBhY2NlcHRDaGFyc2V0OiAnYWNjZXB0LWNoYXJzZXQnLFxuICAgIGNsYXNzTmFtZTogJ2NsYXNzJyxcbiAgICBodG1sRm9yOiAnZm9yJyxcbiAgICBodHRwRXF1aXY6ICdodHRwLWVxdWl2J1xuICB9LFxuICBET01Qcm9wZXJ0eU5hbWVzOiB7fSxcbiAgRE9NTXV0YXRpb25NZXRob2RzOiB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uIChub2RlLCB2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG5vZGUucmVtb3ZlQXR0cmlidXRlKCd2YWx1ZScpO1xuICAgICAgfVxuXG4gICAgICAvLyBOdW1iZXIgaW5wdXRzIGdldCBzcGVjaWFsIHRyZWF0bWVudCBkdWUgdG8gc29tZSBlZGdlIGNhc2VzIGluXG4gICAgICAvLyBDaHJvbWUuIExldCBldmVyeXRoaW5nIGVsc2UgYXNzaWduIHRoZSB2YWx1ZSBhdHRyaWJ1dGUgYXMgbm9ybWFsLlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MjUzI2lzc3VlY29tbWVudC0yMzYwNzQzMjZcbiAgICAgIGlmIChub2RlLnR5cGUgIT09ICdudW1iZXInIHx8IG5vZGUuaGFzQXR0cmlidXRlKCd2YWx1ZScpID09PSBmYWxzZSkge1xuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgndmFsdWUnLCAnJyArIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS52YWxpZGl0eSAmJiAhbm9kZS52YWxpZGl0eS5iYWRJbnB1dCAmJiBub2RlLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gbm9kZSkge1xuICAgICAgICAvLyBEb24ndCBhc3NpZ24gYW4gYXR0cmlidXRlIGlmIHZhbGlkYXRpb24gcmVwb3J0cyBiYWRcbiAgICAgICAgLy8gaW5wdXQuIENocm9tZSB3aWxsIGNsZWFyIHRoZSB2YWx1ZS4gQWRkaXRpb25hbGx5LCBkb24ndFxuICAgICAgICAvLyBvcGVyYXRlIG9uIGlucHV0cyB0aGF0IGhhdmUgZm9jdXMsIG90aGVyd2lzZSBDaHJvbWUgbWlnaHRcbiAgICAgICAgLy8gc3RyaXAgb2ZmIHRyYWlsaW5nIGRlY2ltYWwgcGxhY2VzIGFuZCBjYXVzZSB0aGUgdXNlcidzXG4gICAgICAgIC8vIGN1cnNvciBwb3NpdGlvbiB0byBqdW1wIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0LlxuICAgICAgICAvL1xuICAgICAgICAvLyBJbiBSZWFjdERPTUlucHV0LCB3ZSBoYXZlIGFuIG9uQmx1ciBldmVudCB0aGF0IHdpbGwgdHJpZ2dlclxuICAgICAgICAvLyB0aGlzIGZ1bmN0aW9uIGFnYWluIHdoZW4gZm9jdXMgaXMgbG9zdC5cbiAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ3ZhbHVlJywgJycgKyB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEhUTUxET01Qcm9wZXJ0eUNvbmZpZzsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogRXNjYXBlIGFuZCB3cmFwIGtleSBzbyBpdCBpcyBzYWZlIHRvIHVzZSBhcyBhIHJlYWN0aWRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRvIGJlIGVzY2FwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBlc2NhcGVkIGtleS5cbiAqL1xuXG5mdW5jdGlvbiBlc2NhcGUoa2V5KSB7XG4gIHZhciBlc2NhcGVSZWdleCA9IC9bPTpdL2c7XG4gIHZhciBlc2NhcGVyTG9va3VwID0ge1xuICAgICc9JzogJz0wJyxcbiAgICAnOic6ICc9MidcbiAgfTtcbiAgdmFyIGVzY2FwZWRTdHJpbmcgPSAoJycgKyBrZXkpLnJlcGxhY2UoZXNjYXBlUmVnZXgsIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgIHJldHVybiBlc2NhcGVyTG9va3VwW21hdGNoXTtcbiAgfSk7XG5cbiAgcmV0dXJuICckJyArIGVzY2FwZWRTdHJpbmc7XG59XG5cbi8qKlxuICogVW5lc2NhcGUgYW5kIHVud3JhcCBrZXkgZm9yIGh1bWFuLXJlYWRhYmxlIGRpc3BsYXlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHRvIHVuZXNjYXBlLlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgdW5lc2NhcGVkIGtleS5cbiAqL1xuZnVuY3Rpb24gdW5lc2NhcGUoa2V5KSB7XG4gIHZhciB1bmVzY2FwZVJlZ2V4ID0gLyg9MHw9MikvZztcbiAgdmFyIHVuZXNjYXBlckxvb2t1cCA9IHtcbiAgICAnPTAnOiAnPScsXG4gICAgJz0yJzogJzonXG4gIH07XG4gIHZhciBrZXlTdWJzdHJpbmcgPSBrZXlbMF0gPT09ICcuJyAmJiBrZXlbMV0gPT09ICckJyA/IGtleS5zdWJzdHJpbmcoMikgOiBrZXkuc3Vic3RyaW5nKDEpO1xuXG4gIHJldHVybiAoJycgKyBrZXlTdWJzdHJpbmcpLnJlcGxhY2UodW5lc2NhcGVSZWdleCwgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgcmV0dXJuIHVuZXNjYXBlckxvb2t1cFttYXRjaF07XG4gIH0pO1xufVxuXG52YXIgS2V5RXNjYXBlVXRpbHMgPSB7XG4gIGVzY2FwZTogZXNjYXBlLFxuICB1bmVzY2FwZTogdW5lc2NhcGVcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gS2V5RXNjYXBlVXRpbHM7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xudmFyIHByb3BUeXBlc0ZhY3RvcnkgPSByZXF1aXJlKCdwcm9wLXR5cGVzL2ZhY3RvcnknKTtcblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Jyk7XG52YXIgUHJvcFR5cGVzID0gcHJvcFR5cGVzRmFjdG9yeShSZWFjdC5pc1ZhbGlkRWxlbWVudCk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgaGFzUmVhZE9ubHlWYWx1ZSA9IHtcbiAgJ2J1dHRvbic6IHRydWUsXG4gICdjaGVja2JveCc6IHRydWUsXG4gICdpbWFnZSc6IHRydWUsXG4gICdoaWRkZW4nOiB0cnVlLFxuICAncmFkaW8nOiB0cnVlLFxuICAncmVzZXQnOiB0cnVlLFxuICAnc3VibWl0JzogdHJ1ZVxufTtcblxuZnVuY3Rpb24gX2Fzc2VydFNpbmdsZUxpbmsoaW5wdXRQcm9wcykge1xuICAhKGlucHV0UHJvcHMuY2hlY2tlZExpbmsgPT0gbnVsbCB8fCBpbnB1dFByb3BzLnZhbHVlTGluayA9PSBudWxsKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IHByb3ZpZGUgYSBjaGVja2VkTGluayBhbmQgYSB2YWx1ZUxpbmsuIElmIHlvdSB3YW50IHRvIHVzZSBjaGVja2VkTGluaywgeW91IHByb2JhYmx5IGRvblxcJ3Qgd2FudCB0byB1c2UgdmFsdWVMaW5rIGFuZCB2aWNlIHZlcnNhLicpIDogX3Byb2RJbnZhcmlhbnQoJzg3JykgOiB2b2lkIDA7XG59XG5mdW5jdGlvbiBfYXNzZXJ0VmFsdWVMaW5rKGlucHV0UHJvcHMpIHtcbiAgX2Fzc2VydFNpbmdsZUxpbmsoaW5wdXRQcm9wcyk7XG4gICEoaW5wdXRQcm9wcy52YWx1ZSA9PSBudWxsICYmIGlucHV0UHJvcHMub25DaGFuZ2UgPT0gbnVsbCkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0Nhbm5vdCBwcm92aWRlIGEgdmFsdWVMaW5rIGFuZCBhIHZhbHVlIG9yIG9uQ2hhbmdlIGV2ZW50LiBJZiB5b3Ugd2FudCB0byB1c2UgdmFsdWUgb3Igb25DaGFuZ2UsIHlvdSBwcm9iYWJseSBkb25cXCd0IHdhbnQgdG8gdXNlIHZhbHVlTGluay4nKSA6IF9wcm9kSW52YXJpYW50KCc4OCcpIDogdm9pZCAwO1xufVxuXG5mdW5jdGlvbiBfYXNzZXJ0Q2hlY2tlZExpbmsoaW5wdXRQcm9wcykge1xuICBfYXNzZXJ0U2luZ2xlTGluayhpbnB1dFByb3BzKTtcbiAgIShpbnB1dFByb3BzLmNoZWNrZWQgPT0gbnVsbCAmJiBpbnB1dFByb3BzLm9uQ2hhbmdlID09IG51bGwpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgcHJvdmlkZSBhIGNoZWNrZWRMaW5rIGFuZCBhIGNoZWNrZWQgcHJvcGVydHkgb3Igb25DaGFuZ2UgZXZlbnQuIElmIHlvdSB3YW50IHRvIHVzZSBjaGVja2VkIG9yIG9uQ2hhbmdlLCB5b3UgcHJvYmFibHkgZG9uXFwndCB3YW50IHRvIHVzZSBjaGVja2VkTGluaycpIDogX3Byb2RJbnZhcmlhbnQoJzg5JykgOiB2b2lkIDA7XG59XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIHZhbHVlOiBmdW5jdGlvbiAocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gICAgaWYgKCFwcm9wc1twcm9wTmFtZV0gfHwgaGFzUmVhZE9ubHlWYWx1ZVtwcm9wcy50eXBlXSB8fCBwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRXJyb3IoJ1lvdSBwcm92aWRlZCBhIGB2YWx1ZWAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiAnICsgJ2BvbkNoYW5nZWAgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gSWYgJyArICd0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0VmFsdWVgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuJyk7XG4gIH0sXG4gIGNoZWNrZWQ6IGZ1bmN0aW9uIChwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAgICBpZiAoIXByb3BzW3Byb3BOYW1lXSB8fCBwcm9wcy5vbkNoYW5nZSB8fCBwcm9wcy5yZWFkT25seSB8fCBwcm9wcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRXJyb3IoJ1lvdSBwcm92aWRlZCBhIGBjaGVja2VkYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuICcgKyAnYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiAnICsgJ3RoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRDaGVja2VkYC4gT3RoZXJ3aXNlLCAnICsgJ3NldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLicpO1xuICB9LFxuICBvbkNoYW5nZTogUHJvcFR5cGVzLmZ1bmNcbn07XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShvd25lcikge1xuICBpZiAob3duZXIpIHtcbiAgICB2YXIgbmFtZSA9IG93bmVyLmdldE5hbWUoKTtcbiAgICBpZiAobmFtZSkge1xuICAgICAgcmV0dXJuICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIFByb3ZpZGUgYSBsaW5rZWQgYHZhbHVlYCBhdHRyaWJ1dGUgZm9yIGNvbnRyb2xsZWQgZm9ybXMuIFlvdSBzaG91bGQgbm90IHVzZVxuICogdGhpcyBvdXRzaWRlIG9mIHRoZSBSZWFjdERPTSBjb250cm9sbGVkIGZvcm0gY29tcG9uZW50cy5cbiAqL1xudmFyIExpbmtlZFZhbHVlVXRpbHMgPSB7XG4gIGNoZWNrUHJvcFR5cGVzOiBmdW5jdGlvbiAodGFnTmFtZSwgcHJvcHMsIG93bmVyKSB7XG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gcHJvcFR5cGVzKSB7XG4gICAgICBpZiAocHJvcFR5cGVzLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3IgPSBwcm9wVHlwZXNbcHJvcE5hbWVdKHByb3BzLCBwcm9wTmFtZSwgdGFnTmFtZSwgJ3Byb3AnLCBudWxsLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTtcblxuICAgICAgICB2YXIgYWRkZW5kdW0gPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpO1xuICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdGYWlsZWQgZm9ybSBwcm9wVHlwZTogJXMlcycsIGVycm9yLm1lc3NhZ2UsIGFkZGVuZHVtKSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dFByb3BzIFByb3BzIGZvciBmb3JtIGNvbXBvbmVudFxuICAgKiBAcmV0dXJuIHsqfSBjdXJyZW50IHZhbHVlIG9mIHRoZSBpbnB1dCBlaXRoZXIgZnJvbSB2YWx1ZSBwcm9wIG9yIGxpbmsuXG4gICAqL1xuICBnZXRWYWx1ZTogZnVuY3Rpb24gKGlucHV0UHJvcHMpIHtcbiAgICBpZiAoaW5wdXRQcm9wcy52YWx1ZUxpbmspIHtcbiAgICAgIF9hc3NlcnRWYWx1ZUxpbmsoaW5wdXRQcm9wcyk7XG4gICAgICByZXR1cm4gaW5wdXRQcm9wcy52YWx1ZUxpbmsudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dFByb3BzLnZhbHVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW5wdXRQcm9wcyBQcm9wcyBmb3IgZm9ybSBjb21wb25lbnRcbiAgICogQHJldHVybiB7Kn0gY3VycmVudCBjaGVja2VkIHN0YXR1cyBvZiB0aGUgaW5wdXQgZWl0aGVyIGZyb20gY2hlY2tlZCBwcm9wXG4gICAqICAgICAgICAgICAgIG9yIGxpbmsuXG4gICAqL1xuICBnZXRDaGVja2VkOiBmdW5jdGlvbiAoaW5wdXRQcm9wcykge1xuICAgIGlmIChpbnB1dFByb3BzLmNoZWNrZWRMaW5rKSB7XG4gICAgICBfYXNzZXJ0Q2hlY2tlZExpbmsoaW5wdXRQcm9wcyk7XG4gICAgICByZXR1cm4gaW5wdXRQcm9wcy5jaGVja2VkTGluay52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0UHJvcHMuY2hlY2tlZDtcbiAgfSxcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGlucHV0UHJvcHMgUHJvcHMgZm9yIGZvcm0gY29tcG9uZW50XG4gICAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50IGNoYW5nZSBldmVudCB0byBoYW5kbGVcbiAgICovXG4gIGV4ZWN1dGVPbkNoYW5nZTogZnVuY3Rpb24gKGlucHV0UHJvcHMsIGV2ZW50KSB7XG4gICAgaWYgKGlucHV0UHJvcHMudmFsdWVMaW5rKSB7XG4gICAgICBfYXNzZXJ0VmFsdWVMaW5rKGlucHV0UHJvcHMpO1xuICAgICAgcmV0dXJuIGlucHV0UHJvcHMudmFsdWVMaW5rLnJlcXVlc3RDaGFuZ2UoZXZlbnQudGFyZ2V0LnZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGlucHV0UHJvcHMuY2hlY2tlZExpbmspIHtcbiAgICAgIF9hc3NlcnRDaGVja2VkTGluayhpbnB1dFByb3BzKTtcbiAgICAgIHJldHVybiBpbnB1dFByb3BzLmNoZWNrZWRMaW5rLnJlcXVlc3RDaGFuZ2UoZXZlbnQudGFyZ2V0LmNoZWNrZWQpO1xuICAgIH0gZWxzZSBpZiAoaW5wdXRQcm9wcy5vbkNoYW5nZSkge1xuICAgICAgcmV0dXJuIGlucHV0UHJvcHMub25DaGFuZ2UuY2FsbCh1bmRlZmluZWQsIGV2ZW50KTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTGlua2VkVmFsdWVVdGlsczsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBTdGF0aWMgcG9vbGVycy4gU2V2ZXJhbCBjdXN0b20gdmVyc2lvbnMgZm9yIGVhY2ggcG90ZW50aWFsIG51bWJlciBvZlxuICogYXJndW1lbnRzLiBBIGNvbXBsZXRlbHkgZ2VuZXJpYyBwb29sZXIgaXMgZWFzeSB0byBpbXBsZW1lbnQsIGJ1dCB3b3VsZFxuICogcmVxdWlyZSBhY2Nlc3NpbmcgdGhlIGBhcmd1bWVudHNgIG9iamVjdC4gSW4gZWFjaCBvZiB0aGVzZSwgYHRoaXNgIHJlZmVycyB0b1xuICogdGhlIENsYXNzIGl0c2VsZiwgbm90IGFuIGluc3RhbmNlLiBJZiBhbnkgb3RoZXJzIGFyZSBuZWVkZWQsIHNpbXBseSBhZGQgdGhlbVxuICogaGVyZSwgb3IgaW4gdGhlaXIgb3duIGZpbGVzLlxuICovXG52YXIgb25lQXJndW1lbnRQb29sZXIgPSBmdW5jdGlvbiAoY29weUZpZWxkc0Zyb20pIHtcbiAgdmFyIEtsYXNzID0gdGhpcztcbiAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7XG4gICAgS2xhc3MuY2FsbChpbnN0YW5jZSwgY29weUZpZWxkc0Zyb20pO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IEtsYXNzKGNvcHlGaWVsZHNGcm9tKTtcbiAgfVxufTtcblxudmFyIHR3b0FyZ3VtZW50UG9vbGVyID0gZnVuY3Rpb24gKGExLCBhMikge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCkge1xuICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNlUG9vbC5wb3AoKTtcbiAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBhMSwgYTIpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IEtsYXNzKGExLCBhMik7XG4gIH1cbn07XG5cbnZhciB0aHJlZUFyZ3VtZW50UG9vbGVyID0gZnVuY3Rpb24gKGExLCBhMiwgYTMpIHtcbiAgdmFyIEtsYXNzID0gdGhpcztcbiAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7XG4gICAgS2xhc3MuY2FsbChpbnN0YW5jZSwgYTEsIGEyLCBhMyk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgS2xhc3MoYTEsIGEyLCBhMyk7XG4gIH1cbn07XG5cbnZhciBmb3VyQXJndW1lbnRQb29sZXIgPSBmdW5jdGlvbiAoYTEsIGEyLCBhMywgYTQpIHtcbiAgdmFyIEtsYXNzID0gdGhpcztcbiAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGgpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBLbGFzcy5pbnN0YW5jZVBvb2wucG9wKCk7XG4gICAgS2xhc3MuY2FsbChpbnN0YW5jZSwgYTEsIGEyLCBhMywgYTQpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IEtsYXNzKGExLCBhMiwgYTMsIGE0KTtcbiAgfVxufTtcblxudmFyIHN0YW5kYXJkUmVsZWFzZXIgPSBmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgdmFyIEtsYXNzID0gdGhpcztcbiAgIShpbnN0YW5jZSBpbnN0YW5jZW9mIEtsYXNzKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVHJ5aW5nIHRvIHJlbGVhc2UgYW4gaW5zdGFuY2UgaW50byBhIHBvb2wgb2YgYSBkaWZmZXJlbnQgdHlwZS4nKSA6IF9wcm9kSW52YXJpYW50KCcyNScpIDogdm9pZCAwO1xuICBpbnN0YW5jZS5kZXN0cnVjdG9yKCk7XG4gIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoIDwgS2xhc3MucG9vbFNpemUpIHtcbiAgICBLbGFzcy5pbnN0YW5jZVBvb2wucHVzaChpbnN0YW5jZSk7XG4gIH1cbn07XG5cbnZhciBERUZBVUxUX1BPT0xfU0laRSA9IDEwO1xudmFyIERFRkFVTFRfUE9PTEVSID0gb25lQXJndW1lbnRQb29sZXI7XG5cbi8qKlxuICogQXVnbWVudHMgYENvcHlDb25zdHJ1Y3RvcmAgdG8gYmUgYSBwb29sYWJsZSBjbGFzcywgYXVnbWVudGluZyBvbmx5IHRoZSBjbGFzc1xuICogaXRzZWxmIChzdGF0aWNhbGx5KSBub3QgYWRkaW5nIGFueSBwcm90b3R5cGljYWwgZmllbGRzLiBBbnkgQ29weUNvbnN0cnVjdG9yXG4gKiB5b3UgZ2l2ZSB0aGlzIG1heSBoYXZlIGEgYHBvb2xTaXplYCBwcm9wZXJ0eSwgYW5kIHdpbGwgbG9vayBmb3IgYVxuICogcHJvdG90eXBpY2FsIGBkZXN0cnVjdG9yYCBvbiBpbnN0YW5jZXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gQ29weUNvbnN0cnVjdG9yIENvbnN0cnVjdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVzZXQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwb29sZXIgQ3VzdG9taXphYmxlIHBvb2xlci5cbiAqL1xudmFyIGFkZFBvb2xpbmdUbyA9IGZ1bmN0aW9uIChDb3B5Q29uc3RydWN0b3IsIHBvb2xlcikge1xuICAvLyBDYXN0aW5nIGFzIGFueSBzbyB0aGF0IGZsb3cgaWdub3JlcyB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIGFuZCB0cnVzdHNcbiAgLy8gaXQgdG8gbWF0Y2ggdGhlIHR5cGUgd2UgZGVjbGFyZWRcbiAgdmFyIE5ld0tsYXNzID0gQ29weUNvbnN0cnVjdG9yO1xuICBOZXdLbGFzcy5pbnN0YW5jZVBvb2wgPSBbXTtcbiAgTmV3S2xhc3MuZ2V0UG9vbGVkID0gcG9vbGVyIHx8IERFRkFVTFRfUE9PTEVSO1xuICBpZiAoIU5ld0tsYXNzLnBvb2xTaXplKSB7XG4gICAgTmV3S2xhc3MucG9vbFNpemUgPSBERUZBVUxUX1BPT0xfU0laRTtcbiAgfVxuICBOZXdLbGFzcy5yZWxlYXNlID0gc3RhbmRhcmRSZWxlYXNlcjtcbiAgcmV0dXJuIE5ld0tsYXNzO1xufTtcblxudmFyIFBvb2xlZENsYXNzID0ge1xuICBhZGRQb29saW5nVG86IGFkZFBvb2xpbmdUbyxcbiAgb25lQXJndW1lbnRQb29sZXI6IG9uZUFyZ3VtZW50UG9vbGVyLFxuICB0d29Bcmd1bWVudFBvb2xlcjogdHdvQXJndW1lbnRQb29sZXIsXG4gIHRocmVlQXJndW1lbnRQb29sZXI6IHRocmVlQXJndW1lbnRQb29sZXIsXG4gIGZvdXJBcmd1bWVudFBvb2xlcjogZm91ckFyZ3VtZW50UG9vbGVyXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBvb2xlZENsYXNzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgRXZlbnRQbHVnaW5SZWdpc3RyeSA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5SZWdpc3RyeScpO1xudmFyIFJlYWN0RXZlbnRFbWl0dGVyTWl4aW4gPSByZXF1aXJlKCcuL1JlYWN0RXZlbnRFbWl0dGVyTWl4aW4nKTtcbnZhciBWaWV3cG9ydE1ldHJpY3MgPSByZXF1aXJlKCcuL1ZpZXdwb3J0TWV0cmljcycpO1xuXG52YXIgZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUgPSByZXF1aXJlKCcuL2dldFZlbmRvclByZWZpeGVkRXZlbnROYW1lJyk7XG52YXIgaXNFdmVudFN1cHBvcnRlZCA9IHJlcXVpcmUoJy4vaXNFdmVudFN1cHBvcnRlZCcpO1xuXG4vKipcbiAqIFN1bW1hcnkgb2YgYFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlcmAgZXZlbnQgaGFuZGxpbmc6XG4gKlxuICogIC0gVG9wLWxldmVsIGRlbGVnYXRpb24gaXMgdXNlZCB0byB0cmFwIG1vc3QgbmF0aXZlIGJyb3dzZXIgZXZlbnRzLiBUaGlzXG4gKiAgICBtYXkgb25seSBvY2N1ciBpbiB0aGUgbWFpbiB0aHJlYWQgYW5kIGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZlxuICogICAgUmVhY3RFdmVudExpc3RlbmVyLCB3aGljaCBpcyBpbmplY3RlZCBhbmQgY2FuIHRoZXJlZm9yZSBzdXBwb3J0IHBsdWdnYWJsZVxuICogICAgZXZlbnQgc291cmNlcy4gVGhpcyBpcyB0aGUgb25seSB3b3JrIHRoYXQgb2NjdXJzIGluIHRoZSBtYWluIHRocmVhZC5cbiAqXG4gKiAgLSBXZSBub3JtYWxpemUgYW5kIGRlLWR1cGxpY2F0ZSBldmVudHMgdG8gYWNjb3VudCBmb3IgYnJvd3NlciBxdWlya3MuIFRoaXNcbiAqICAgIG1heSBiZSBkb25lIGluIHRoZSB3b3JrZXIgdGhyZWFkLlxuICpcbiAqICAtIEZvcndhcmQgdGhlc2UgbmF0aXZlIGV2ZW50cyAod2l0aCB0aGUgYXNzb2NpYXRlZCB0b3AtbGV2ZWwgdHlwZSB1c2VkIHRvXG4gKiAgICB0cmFwIGl0KSB0byBgRXZlbnRQbHVnaW5IdWJgLCB3aGljaCBpbiB0dXJuIHdpbGwgYXNrIHBsdWdpbnMgaWYgdGhleSB3YW50XG4gKiAgICB0byBleHRyYWN0IGFueSBzeW50aGV0aWMgZXZlbnRzLlxuICpcbiAqICAtIFRoZSBgRXZlbnRQbHVnaW5IdWJgIHdpbGwgdGhlbiBwcm9jZXNzIGVhY2ggZXZlbnQgYnkgYW5ub3RhdGluZyB0aGVtIHdpdGhcbiAqICAgIFwiZGlzcGF0Y2hlc1wiLCBhIHNlcXVlbmNlIG9mIGxpc3RlbmVycyBhbmQgSURzIHRoYXQgY2FyZSBhYm91dCB0aGF0IGV2ZW50LlxuICpcbiAqICAtIFRoZSBgRXZlbnRQbHVnaW5IdWJgIHRoZW4gZGlzcGF0Y2hlcyB0aGUgZXZlbnRzLlxuICpcbiAqIE92ZXJ2aWV3IG9mIFJlYWN0IGFuZCB0aGUgZXZlbnQgc3lzdGVtOlxuICpcbiAqICstLS0tLS0tLS0tLS0rICAgIC5cbiAqIHwgICAgRE9NICAgICB8ICAgIC5cbiAqICstLS0tLS0tLS0tLS0rICAgIC5cbiAqICAgICAgIHwgICAgICAgICAgIC5cbiAqICAgICAgIHYgICAgICAgICAgIC5cbiAqICstLS0tLS0tLS0tLS0rICAgIC5cbiAqIHwgUmVhY3RFdmVudCB8ICAgIC5cbiAqIHwgIExpc3RlbmVyICB8ICAgIC5cbiAqICstLS0tLS0tLS0tLS0rICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuICogICAgICAgfCAgICAgICAgICAgLiAgICAgICAgICAgICAgICstLS0tLS0tLSt8U2ltcGxlRXZlbnR8XG4gKiAgICAgICB8ICAgICAgICAgICAuICAgICAgICAgICAgICAgfCAgICAgICAgIHxQbHVnaW4gICAgIHxcbiAqICstLS0tLXwtLS0tLS0rICAgIC4gICAgICAgICAgICAgICB2ICAgICAgICAgKy0tLS0tLS0tLS0tK1xuICogfCAgICAgfCAgICAgIHwgICAgLiAgICArLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tK1xuICogfCAgICAgKy0tLS0tLS0tLS0tLi0tLT58RXZlbnRQbHVnaW5IdWJ8ICAgICAgICAgICAgICAgICAgICB8ICAgIEV2ZW50ICAgfFxuICogfCAgICAgICAgICAgIHwgICAgLiAgICB8ICAgICAgICAgICAgICB8ICAgICArLS0tLS0tLS0tLS0rICB8IFByb3BhZ2F0b3JzfFxuICogfCBSZWFjdEV2ZW50IHwgICAgLiAgICB8ICAgICAgICAgICAgICB8ICAgICB8VGFwRXZlbnQgICB8ICB8LS0tLS0tLS0tLS0tfFxuICogfCAgRW1pdHRlciAgIHwgICAgLiAgICB8ICAgICAgICAgICAgICB8PC0tLSt8UGx1Z2luICAgICB8ICB8b3RoZXIgcGx1Z2lufFxuICogfCAgICAgICAgICAgIHwgICAgLiAgICB8ICAgICAgICAgICAgICB8ICAgICArLS0tLS0tLS0tLS0rICB8ICB1dGlsaXRpZXMgfFxuICogfCAgICAgKy0tLS0tLS0tLS0tLi0tLT58ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tK1xuICogfCAgICAgfCAgICAgIHwgICAgLiAgICArLS0tLS0tLS0tLS0tLS0rXG4gKiArLS0tLS18LS0tLS0tKyAgICAuICAgICAgICAgICAgICAgIF4gICAgICAgICstLS0tLS0tLS0tLStcbiAqICAgICAgIHwgICAgICAgICAgIC4gICAgICAgICAgICAgICAgfCAgICAgICAgfEVudGVyL0xlYXZlfFxuICogICAgICAgKyAgICAgICAgICAgLiAgICAgICAgICAgICAgICArLS0tLS0tLSt8UGx1Z2luICAgICB8XG4gKiArLS0tLS0tLS0tLS0tLSsgICAuICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLStcbiAqIHwgYXBwbGljYXRpb24gfCAgIC5cbiAqIHwtLS0tLS0tLS0tLS0tfCAgIC5cbiAqIHwgICAgICAgICAgICAgfCAgIC5cbiAqIHwgICAgICAgICAgICAgfCAgIC5cbiAqICstLS0tLS0tLS0tLS0tKyAgIC5cbiAqICAgICAgICAgICAgICAgICAgIC5cbiAqICAgIFJlYWN0IENvcmUgICAgIC4gIEdlbmVyYWwgUHVycG9zZSBFdmVudCBQbHVnaW4gU3lzdGVtXG4gKi9cblxudmFyIGhhc0V2ZW50UGFnZVhZO1xudmFyIGFscmVhZHlMaXN0ZW5pbmdUbyA9IHt9O1xudmFyIGlzTW9uaXRvcmluZ1Njcm9sbFZhbHVlID0gZmFsc2U7XG52YXIgcmVhY3RUb3BMaXN0ZW5lcnNDb3VudGVyID0gMDtcblxuLy8gRm9yIGV2ZW50cyBsaWtlICdzdWJtaXQnIHdoaWNoIGRvbid0IGNvbnNpc3RlbnRseSBidWJibGUgKHdoaWNoIHdlIHRyYXAgYXQgYVxuLy8gbG93ZXIgbm9kZSB0aGFuIGBkb2N1bWVudGApLCBiaW5kaW5nIGF0IGBkb2N1bWVudGAgd291bGQgY2F1c2UgZHVwbGljYXRlXG4vLyBldmVudHMgc28gd2UgZG9uJ3QgaW5jbHVkZSB0aGVtIGhlcmVcbnZhciB0b3BFdmVudE1hcHBpbmcgPSB7XG4gIHRvcEFib3J0OiAnYWJvcnQnLFxuICB0b3BBbmltYXRpb25FbmQ6IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25lbmQnKSB8fCAnYW5pbWF0aW9uZW5kJyxcbiAgdG9wQW5pbWF0aW9uSXRlcmF0aW9uOiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uaXRlcmF0aW9uJykgfHwgJ2FuaW1hdGlvbml0ZXJhdGlvbicsXG4gIHRvcEFuaW1hdGlvblN0YXJ0OiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgnYW5pbWF0aW9uc3RhcnQnKSB8fCAnYW5pbWF0aW9uc3RhcnQnLFxuICB0b3BCbHVyOiAnYmx1cicsXG4gIHRvcENhblBsYXk6ICdjYW5wbGF5JyxcbiAgdG9wQ2FuUGxheVRocm91Z2g6ICdjYW5wbGF5dGhyb3VnaCcsXG4gIHRvcENoYW5nZTogJ2NoYW5nZScsXG4gIHRvcENsaWNrOiAnY2xpY2snLFxuICB0b3BDb21wb3NpdGlvbkVuZDogJ2NvbXBvc2l0aW9uZW5kJyxcbiAgdG9wQ29tcG9zaXRpb25TdGFydDogJ2NvbXBvc2l0aW9uc3RhcnQnLFxuICB0b3BDb21wb3NpdGlvblVwZGF0ZTogJ2NvbXBvc2l0aW9udXBkYXRlJyxcbiAgdG9wQ29udGV4dE1lbnU6ICdjb250ZXh0bWVudScsXG4gIHRvcENvcHk6ICdjb3B5JyxcbiAgdG9wQ3V0OiAnY3V0JyxcbiAgdG9wRG91YmxlQ2xpY2s6ICdkYmxjbGljaycsXG4gIHRvcERyYWc6ICdkcmFnJyxcbiAgdG9wRHJhZ0VuZDogJ2RyYWdlbmQnLFxuICB0b3BEcmFnRW50ZXI6ICdkcmFnZW50ZXInLFxuICB0b3BEcmFnRXhpdDogJ2RyYWdleGl0JyxcbiAgdG9wRHJhZ0xlYXZlOiAnZHJhZ2xlYXZlJyxcbiAgdG9wRHJhZ092ZXI6ICdkcmFnb3ZlcicsXG4gIHRvcERyYWdTdGFydDogJ2RyYWdzdGFydCcsXG4gIHRvcERyb3A6ICdkcm9wJyxcbiAgdG9wRHVyYXRpb25DaGFuZ2U6ICdkdXJhdGlvbmNoYW5nZScsXG4gIHRvcEVtcHRpZWQ6ICdlbXB0aWVkJyxcbiAgdG9wRW5jcnlwdGVkOiAnZW5jcnlwdGVkJyxcbiAgdG9wRW5kZWQ6ICdlbmRlZCcsXG4gIHRvcEVycm9yOiAnZXJyb3InLFxuICB0b3BGb2N1czogJ2ZvY3VzJyxcbiAgdG9wSW5wdXQ6ICdpbnB1dCcsXG4gIHRvcEtleURvd246ICdrZXlkb3duJyxcbiAgdG9wS2V5UHJlc3M6ICdrZXlwcmVzcycsXG4gIHRvcEtleVVwOiAna2V5dXAnLFxuICB0b3BMb2FkZWREYXRhOiAnbG9hZGVkZGF0YScsXG4gIHRvcExvYWRlZE1ldGFkYXRhOiAnbG9hZGVkbWV0YWRhdGEnLFxuICB0b3BMb2FkU3RhcnQ6ICdsb2Fkc3RhcnQnLFxuICB0b3BNb3VzZURvd246ICdtb3VzZWRvd24nLFxuICB0b3BNb3VzZU1vdmU6ICdtb3VzZW1vdmUnLFxuICB0b3BNb3VzZU91dDogJ21vdXNlb3V0JyxcbiAgdG9wTW91c2VPdmVyOiAnbW91c2VvdmVyJyxcbiAgdG9wTW91c2VVcDogJ21vdXNldXAnLFxuICB0b3BQYXN0ZTogJ3Bhc3RlJyxcbiAgdG9wUGF1c2U6ICdwYXVzZScsXG4gIHRvcFBsYXk6ICdwbGF5JyxcbiAgdG9wUGxheWluZzogJ3BsYXlpbmcnLFxuICB0b3BQcm9ncmVzczogJ3Byb2dyZXNzJyxcbiAgdG9wUmF0ZUNoYW5nZTogJ3JhdGVjaGFuZ2UnLFxuICB0b3BTY3JvbGw6ICdzY3JvbGwnLFxuICB0b3BTZWVrZWQ6ICdzZWVrZWQnLFxuICB0b3BTZWVraW5nOiAnc2Vla2luZycsXG4gIHRvcFNlbGVjdGlvbkNoYW5nZTogJ3NlbGVjdGlvbmNoYW5nZScsXG4gIHRvcFN0YWxsZWQ6ICdzdGFsbGVkJyxcbiAgdG9wU3VzcGVuZDogJ3N1c3BlbmQnLFxuICB0b3BUZXh0SW5wdXQ6ICd0ZXh0SW5wdXQnLFxuICB0b3BUaW1lVXBkYXRlOiAndGltZXVwZGF0ZScsXG4gIHRvcFRvdWNoQ2FuY2VsOiAndG91Y2hjYW5jZWwnLFxuICB0b3BUb3VjaEVuZDogJ3RvdWNoZW5kJyxcbiAgdG9wVG91Y2hNb3ZlOiAndG91Y2htb3ZlJyxcbiAgdG9wVG91Y2hTdGFydDogJ3RvdWNoc3RhcnQnLFxuICB0b3BUcmFuc2l0aW9uRW5kOiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSgndHJhbnNpdGlvbmVuZCcpIHx8ICd0cmFuc2l0aW9uZW5kJyxcbiAgdG9wVm9sdW1lQ2hhbmdlOiAndm9sdW1lY2hhbmdlJyxcbiAgdG9wV2FpdGluZzogJ3dhaXRpbmcnLFxuICB0b3BXaGVlbDogJ3doZWVsJ1xufTtcblxuLyoqXG4gKiBUbyBlbnN1cmUgbm8gY29uZmxpY3RzIHdpdGggb3RoZXIgcG90ZW50aWFsIFJlYWN0IGluc3RhbmNlcyBvbiB0aGUgcGFnZVxuICovXG52YXIgdG9wTGlzdGVuZXJzSURLZXkgPSAnX3JlYWN0TGlzdGVuZXJzSUQnICsgU3RyaW5nKE1hdGgucmFuZG9tKCkpLnNsaWNlKDIpO1xuXG5mdW5jdGlvbiBnZXRMaXN0ZW5pbmdGb3JEb2N1bWVudChtb3VudEF0KSB7XG4gIC8vIEluIElFOCwgYG1vdW50QXRgIGlzIGEgaG9zdCBvYmplY3QgYW5kIGRvZXNuJ3QgaGF2ZSBgaGFzT3duUHJvcGVydHlgXG4gIC8vIGRpcmVjdGx5LlxuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb3VudEF0LCB0b3BMaXN0ZW5lcnNJREtleSkpIHtcbiAgICBtb3VudEF0W3RvcExpc3RlbmVyc0lES2V5XSA9IHJlYWN0VG9wTGlzdGVuZXJzQ291bnRlcisrO1xuICAgIGFscmVhZHlMaXN0ZW5pbmdUb1ttb3VudEF0W3RvcExpc3RlbmVyc0lES2V5XV0gPSB7fTtcbiAgfVxuICByZXR1cm4gYWxyZWFkeUxpc3RlbmluZ1RvW21vdW50QXRbdG9wTGlzdGVuZXJzSURLZXldXTtcbn1cblxuLyoqXG4gKiBgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyYCBpcyB1c2VkIHRvIGF0dGFjaCB0b3AtbGV2ZWwgZXZlbnQgbGlzdGVuZXJzLiBGb3JcbiAqIGV4YW1wbGU6XG4gKlxuICogICBFdmVudFBsdWdpbkh1Yi5wdXRMaXN0ZW5lcignbXlJRCcsICdvbkNsaWNrJywgbXlGdW5jdGlvbik7XG4gKlxuICogVGhpcyB3b3VsZCBhbGxvY2F0ZSBhIFwicmVnaXN0cmF0aW9uXCIgb2YgYCgnb25DbGljaycsIG15RnVuY3Rpb24pYCBvbiAnbXlJRCcuXG4gKlxuICogQGludGVybmFsXG4gKi9cbnZhciBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIgPSBfYXNzaWduKHt9LCBSZWFjdEV2ZW50RW1pdHRlck1peGluLCB7XG5cbiAgLyoqXG4gICAqIEluamVjdGFibGUgZXZlbnQgYmFja2VuZFxuICAgKi9cbiAgUmVhY3RFdmVudExpc3RlbmVyOiBudWxsLFxuXG4gIGluamVjdGlvbjoge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBSZWFjdEV2ZW50TGlzdGVuZXJcbiAgICAgKi9cbiAgICBpbmplY3RSZWFjdEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uIChSZWFjdEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIFJlYWN0RXZlbnRMaXN0ZW5lci5zZXRIYW5kbGVUb3BMZXZlbChSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuaGFuZGxlVG9wTGV2ZWwpO1xuICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lciA9IFJlYWN0RXZlbnRMaXN0ZW5lcjtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgd2hldGhlciBvciBub3QgYW55IGNyZWF0ZWQgY2FsbGJhY2tzIHNob3VsZCBiZSBlbmFibGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWQgVHJ1ZSBpZiBjYWxsYmFja3Mgc2hvdWxkIGJlIGVuYWJsZWQuXG4gICAqL1xuICBzZXRFbmFibGVkOiBmdW5jdGlvbiAoZW5hYmxlZCkge1xuICAgIGlmIChSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyKSB7XG4gICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnNldEVuYWJsZWQoZW5hYmxlZCk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGNhbGxiYWNrcyBhcmUgZW5hYmxlZC5cbiAgICovXG4gIGlzRW5hYmxlZDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIShSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyICYmIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIuaXNFbmFibGVkKCkpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBXZSBsaXN0ZW4gZm9yIGJ1YmJsZWQgdG91Y2ggZXZlbnRzIG9uIHRoZSBkb2N1bWVudCBvYmplY3QuXG4gICAqXG4gICAqIEZpcmVmb3ggdjguMDEgKGFuZCBwb3NzaWJseSBvdGhlcnMpIGV4aGliaXRlZCBzdHJhbmdlIGJlaGF2aW9yIHdoZW5cbiAgICogbW91bnRpbmcgYG9ubW91c2Vtb3ZlYCBldmVudHMgYXQgc29tZSBub2RlIHRoYXQgd2FzIG5vdCB0aGUgZG9jdW1lbnRcbiAgICogZWxlbWVudC4gVGhlIHN5bXB0b21zIHdlcmUgdGhhdCBpZiB5b3VyIG1vdXNlIGlzIG5vdCBtb3Zpbmcgb3ZlciBzb21ldGhpbmdcbiAgICogY29udGFpbmVkIHdpdGhpbiB0aGF0IG1vdW50IHBvaW50IChmb3IgZXhhbXBsZSBvbiB0aGUgYmFja2dyb3VuZCkgdGhlXG4gICAqIHRvcC1sZXZlbCBsaXN0ZW5lcnMgZm9yIGBvbm1vdXNlbW92ZWAgd29uJ3QgYmUgY2FsbGVkLiBIb3dldmVyLCBpZiB5b3VcbiAgICogcmVnaXN0ZXIgdGhlIGBtb3VzZW1vdmVgIG9uIHRoZSBkb2N1bWVudCBvYmplY3QsIHRoZW4gaXQgd2lsbCBvZiBjb3Vyc2VcbiAgICogY2F0Y2ggYWxsIGBtb3VzZW1vdmVgcy4gVGhpcyBhbG9uZyB3aXRoIGlPUyBxdWlya3MsIGp1c3RpZmllcyByZXN0cmljdGluZ1xuICAgKiB0b3AtbGV2ZWwgbGlzdGVuZXJzIHRvIHRoZSBkb2N1bWVudCBvYmplY3Qgb25seSwgYXQgbGVhc3QgZm9yIHRoZXNlXG4gICAqIG1vdmVtZW50IHR5cGVzIG9mIGV2ZW50cyBhbmQgcG9zc2libHkgYWxsIGV2ZW50cy5cbiAgICpcbiAgICogQHNlZSBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAxMC8wOS9jbGlja19ldmVudF9kZWwuaHRtbFxuICAgKlxuICAgKiBBbHNvLCBga2V5dXBgL2BrZXlwcmVzc2AvYGtleWRvd25gIGRvIG5vdCBidWJibGUgdG8gdGhlIHdpbmRvdyBvbiBJRSwgYnV0XG4gICAqIHRoZXkgYnViYmxlIHRvIGRvY3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBOYW1lIG9mIGxpc3RlbmVyIChlLmcuIGBvbkNsaWNrYCkuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZW50RG9jdW1lbnRIYW5kbGUgRG9jdW1lbnQgd2hpY2ggb3ducyB0aGUgY29udGFpbmVyXG4gICAqL1xuICBsaXN0ZW5UbzogZnVuY3Rpb24gKHJlZ2lzdHJhdGlvbk5hbWUsIGNvbnRlbnREb2N1bWVudEhhbmRsZSkge1xuICAgIHZhciBtb3VudEF0ID0gY29udGVudERvY3VtZW50SGFuZGxlO1xuICAgIHZhciBpc0xpc3RlbmluZyA9IGdldExpc3RlbmluZ0ZvckRvY3VtZW50KG1vdW50QXQpO1xuICAgIHZhciBkZXBlbmRlbmNpZXMgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXNbcmVnaXN0cmF0aW9uTmFtZV07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlcGVuZGVuY2llcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlcGVuZGVuY3kgPSBkZXBlbmRlbmNpZXNbaV07XG4gICAgICBpZiAoIShpc0xpc3RlbmluZy5oYXNPd25Qcm9wZXJ0eShkZXBlbmRlbmN5KSAmJiBpc0xpc3RlbmluZ1tkZXBlbmRlbmN5XSkpIHtcbiAgICAgICAgaWYgKGRlcGVuZGVuY3kgPT09ICd0b3BXaGVlbCcpIHtcbiAgICAgICAgICBpZiAoaXNFdmVudFN1cHBvcnRlZCgnd2hlZWwnKSkge1xuICAgICAgICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCd0b3BXaGVlbCcsICd3aGVlbCcsIG1vdW50QXQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNFdmVudFN1cHBvcnRlZCgnbW91c2V3aGVlbCcpKSB7XG4gICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcFdoZWVsJywgJ21vdXNld2hlZWwnLCBtb3VudEF0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRmlyZWZveCBuZWVkcyB0byBjYXB0dXJlIGEgZGlmZmVyZW50IG1vdXNlIHNjcm9sbCBldmVudC5cbiAgICAgICAgICAgIC8vIEBzZWUgaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9kb20vZXZlbnRzL3Rlc3RzL3Njcm9sbC5odG1sXG4gICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcFdoZWVsJywgJ0RPTU1vdXNlU2Nyb2xsJywgbW91bnRBdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRlcGVuZGVuY3kgPT09ICd0b3BTY3JvbGwnKSB7XG5cbiAgICAgICAgICBpZiAoaXNFdmVudFN1cHBvcnRlZCgnc2Nyb2xsJywgdHJ1ZSkpIHtcbiAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcENhcHR1cmVkRXZlbnQoJ3RvcFNjcm9sbCcsICdzY3JvbGwnLCBtb3VudEF0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCd0b3BTY3JvbGwnLCAnc2Nyb2xsJywgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci5XSU5ET1dfSEFORExFKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGVwZW5kZW5jeSA9PT0gJ3RvcEZvY3VzJyB8fCBkZXBlbmRlbmN5ID09PSAndG9wQmx1cicpIHtcblxuICAgICAgICAgIGlmIChpc0V2ZW50U3VwcG9ydGVkKCdmb2N1cycsIHRydWUpKSB7XG4gICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KCd0b3BGb2N1cycsICdmb2N1cycsIG1vdW50QXQpO1xuICAgICAgICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQ2FwdHVyZWRFdmVudCgndG9wQmx1cicsICdibHVyJywgbW91bnRBdCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc0V2ZW50U3VwcG9ydGVkKCdmb2N1c2luJykpIHtcbiAgICAgICAgICAgIC8vIElFIGhhcyBgZm9jdXNpbmAgYW5kIGBmb2N1c291dGAgZXZlbnRzIHdoaWNoIGJ1YmJsZS5cbiAgICAgICAgICAgIC8vIEBzZWUgaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMDgvMDQvZGVsZWdhdGluZ190aGUuaHRtbFxuICAgICAgICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCd0b3BGb2N1cycsICdmb2N1c2luJywgbW91bnRBdCk7XG4gICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcEJsdXInLCAnZm9jdXNvdXQnLCBtb3VudEF0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyB0byBtYWtlIHN1cmUgYmx1ciBhbmQgZm9jdXMgZXZlbnQgbGlzdGVuZXJzIGFyZSBvbmx5IGF0dGFjaGVkIG9uY2VcbiAgICAgICAgICBpc0xpc3RlbmluZy50b3BCbHVyID0gdHJ1ZTtcbiAgICAgICAgICBpc0xpc3RlbmluZy50b3BGb2N1cyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodG9wRXZlbnRNYXBwaW5nLmhhc093blByb3BlcnR5KGRlcGVuZGVuY3kpKSB7XG4gICAgICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KGRlcGVuZGVuY3ksIHRvcEV2ZW50TWFwcGluZ1tkZXBlbmRlbmN5XSwgbW91bnRBdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpc0xpc3RlbmluZ1tkZXBlbmRlbmN5XSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHRyYXBCdWJibGVkRXZlbnQ6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIGhhbmRsZXJCYXNlTmFtZSwgaGFuZGxlKSB7XG4gICAgcmV0dXJuIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCh0b3BMZXZlbFR5cGUsIGhhbmRsZXJCYXNlTmFtZSwgaGFuZGxlKTtcbiAgfSxcblxuICB0cmFwQ2FwdHVyZWRFdmVudDogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgaGFuZGxlckJhc2VOYW1lLCBoYW5kbGUpIHtcbiAgICByZXR1cm4gUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQ2FwdHVyZWRFdmVudCh0b3BMZXZlbFR5cGUsIGhhbmRsZXJCYXNlTmFtZSwgaGFuZGxlKTtcbiAgfSxcblxuICAvKipcbiAgICogUHJvdGVjdCBhZ2FpbnN0IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCkgcmV0dXJuaW5nIG51bGxcbiAgICogU29tZSBwb3B1cCBibG9ja2VyIGV4dGVuc2lvbnMgYXBwZWFyIHRvIGRvIHRoaXM6XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNjg4N1xuICAgKi9cbiAgc3VwcG9ydHNFdmVudFBhZ2VYWTogZnVuY3Rpb24gKCkge1xuICAgIGlmICghZG9jdW1lbnQuY3JlYXRlRXZlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGV2ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnQnKTtcbiAgICByZXR1cm4gZXYgIT0gbnVsbCAmJiAncGFnZVgnIGluIGV2O1xuICB9LFxuXG4gIC8qKlxuICAgKiBMaXN0ZW5zIHRvIHdpbmRvdyBzY3JvbGwgYW5kIHJlc2l6ZSBldmVudHMuIFdlIGNhY2hlIHNjcm9sbCB2YWx1ZXMgc28gdGhhdFxuICAgKiBhcHBsaWNhdGlvbiBjb2RlIGNhbiBhY2Nlc3MgdGhlbSB3aXRob3V0IHRyaWdnZXJpbmcgcmVmbG93cy5cbiAgICpcbiAgICogVmlld3BvcnRNZXRyaWNzIGlzIG9ubHkgdXNlZCBieSBTeW50aGV0aWNNb3VzZS9Ub3VjaEV2ZW50IGFuZCBvbmx5IHdoZW5cbiAgICogcGFnZVgvcGFnZVkgaXNuJ3Qgc3VwcG9ydGVkIChsZWdhY3kgYnJvd3NlcnMpLlxuICAgKlxuICAgKiBOT1RFOiBTY3JvbGwgZXZlbnRzIGRvIG5vdCBidWJibGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9kb20vZXZlbnRzL3Njcm9sbC5odG1sXG4gICAqL1xuICBlbnN1cmVTY3JvbGxWYWx1ZU1vbml0b3Jpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaGFzRXZlbnRQYWdlWFkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzRXZlbnRQYWdlWFkgPSBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuc3VwcG9ydHNFdmVudFBhZ2VYWSgpO1xuICAgIH1cbiAgICBpZiAoIWhhc0V2ZW50UGFnZVhZICYmICFpc01vbml0b3JpbmdTY3JvbGxWYWx1ZSkge1xuICAgICAgdmFyIHJlZnJlc2ggPSBWaWV3cG9ydE1ldHJpY3MucmVmcmVzaFNjcm9sbFZhbHVlcztcbiAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIubW9uaXRvclNjcm9sbFZhbHVlKHJlZnJlc2gpO1xuICAgICAgaXNNb25pdG9yaW5nU2Nyb2xsVmFsdWUgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXI7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UmVjb25jaWxlciA9IHJlcXVpcmUoJy4vUmVhY3RSZWNvbmNpbGVyJyk7XG5cbnZhciBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50Jyk7XG52YXIgS2V5RXNjYXBlVXRpbHMgPSByZXF1aXJlKCcuL0tleUVzY2FwZVV0aWxzJyk7XG52YXIgc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQgPSByZXF1aXJlKCcuL3Nob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50Jyk7XG52YXIgdHJhdmVyc2VBbGxDaGlsZHJlbiA9IHJlcXVpcmUoJy4vdHJhdmVyc2VBbGxDaGlsZHJlbicpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rO1xuXG5pZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52ICYmIFwiZGV2ZWxvcG1lbnRcIiA9PT0gJ3Rlc3QnKSB7XG4gIC8vIFRlbXBvcmFyeSBoYWNrLlxuICAvLyBJbmxpbmUgcmVxdWlyZXMgZG9uJ3Qgd29yayB3ZWxsIHdpdGggSmVzdDpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MjQwXG4gIC8vIFJlbW92ZSB0aGUgaW5saW5lIHJlcXVpcmVzIHdoZW4gd2UgZG9uJ3QgbmVlZCB0aGVtIGFueW1vcmU6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzcxNzhcbiAgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG59XG5cbmZ1bmN0aW9uIGluc3RhbnRpYXRlQ2hpbGQoY2hpbGRJbnN0YW5jZXMsIGNoaWxkLCBuYW1lLCBzZWxmRGVidWdJRCkge1xuICAvLyBXZSBmb3VuZCBhIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgdmFyIGtleVVuaXF1ZSA9IGNoaWxkSW5zdGFuY2VzW25hbWVdID09PSB1bmRlZmluZWQ7XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmICghUmVhY3RDb21wb25lbnRUcmVlSG9vaykge1xuICAgICAgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG4gICAgfVxuICAgIGlmICgha2V5VW5pcXVlKSB7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdmbGF0dGVuQ2hpbGRyZW4oLi4uKTogRW5jb3VudGVyZWQgdHdvIGNoaWxkcmVuIHdpdGggdGhlIHNhbWUga2V5LCAnICsgJ2Alc2AuIENoaWxkIGtleXMgbXVzdCBiZSB1bmlxdWU7IHdoZW4gdHdvIGNoaWxkcmVuIHNoYXJlIGEga2V5LCBvbmx5ICcgKyAndGhlIGZpcnN0IGNoaWxkIHdpbGwgYmUgdXNlZC4lcycsIEtleUVzY2FwZVV0aWxzLnVuZXNjYXBlKG5hbWUpLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKHNlbGZEZWJ1Z0lEKSkgOiB2b2lkIDA7XG4gICAgfVxuICB9XG4gIGlmIChjaGlsZCAhPSBudWxsICYmIGtleVVuaXF1ZSkge1xuICAgIGNoaWxkSW5zdGFuY2VzW25hbWVdID0gaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChjaGlsZCwgdHJ1ZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFjdENoaWxkUmVjb25jaWxlciBwcm92aWRlcyBoZWxwZXJzIGZvciBpbml0aWFsaXppbmcgb3IgdXBkYXRpbmcgYSBzZXQgb2ZcbiAqIGNoaWxkcmVuLiBJdHMgb3V0cHV0IGlzIHN1aXRhYmxlIGZvciBwYXNzaW5nIGl0IG9udG8gUmVhY3RNdWx0aUNoaWxkIHdoaWNoXG4gKiBkb2VzIGRpZmZlZCByZW9yZGVyaW5nIGFuZCBpbnNlcnRpb24uXG4gKi9cbnZhciBSZWFjdENoaWxkUmVjb25jaWxlciA9IHtcbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIFwibW91bnQgaW1hZ2VcIiBmb3IgZWFjaCBvZiB0aGUgc3VwcGxpZWQgY2hpbGRyZW4uIEluIHRoZSBjYXNlXG4gICAqIG9mIGBSZWFjdERPTUNvbXBvbmVudGAsIGEgbW91bnQgaW1hZ2UgaXMgYSBzdHJpbmcgb2YgbWFya3VwLlxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG5lc3RlZENoaWxkTm9kZXMgTmVzdGVkIGNoaWxkIG1hcHMuXG4gICAqIEByZXR1cm4gez9vYmplY3R9IEEgc2V0IG9mIGNoaWxkIGluc3RhbmNlcy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBpbnN0YW50aWF0ZUNoaWxkcmVuOiBmdW5jdGlvbiAobmVzdGVkQ2hpbGROb2RlcywgdHJhbnNhY3Rpb24sIGNvbnRleHQsIHNlbGZEZWJ1Z0lEIC8vIDAgaW4gcHJvZHVjdGlvbiBhbmQgZm9yIHJvb3RzXG4gICkge1xuICAgIGlmIChuZXN0ZWRDaGlsZE5vZGVzID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgY2hpbGRJbnN0YW5jZXMgPSB7fTtcblxuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdHJhdmVyc2VBbGxDaGlsZHJlbihuZXN0ZWRDaGlsZE5vZGVzLCBmdW5jdGlvbiAoY2hpbGRJbnN0cywgY2hpbGQsIG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGluc3RhbnRpYXRlQ2hpbGQoY2hpbGRJbnN0cywgY2hpbGQsIG5hbWUsIHNlbGZEZWJ1Z0lEKTtcbiAgICAgIH0sIGNoaWxkSW5zdGFuY2VzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJhdmVyc2VBbGxDaGlsZHJlbihuZXN0ZWRDaGlsZE5vZGVzLCBpbnN0YW50aWF0ZUNoaWxkLCBjaGlsZEluc3RhbmNlcyk7XG4gICAgfVxuICAgIHJldHVybiBjaGlsZEluc3RhbmNlcztcbiAgfSxcblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcmVuZGVyZWQgY2hpbGRyZW4gYW5kIHJldHVybnMgYSBuZXcgc2V0IG9mIGNoaWxkcmVuLlxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IHByZXZDaGlsZHJlbiBQcmV2aW91c2x5IGluaXRpYWxpemVkIHNldCBvZiBjaGlsZHJlbi5cbiAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0Q2hpbGRyZW4gRmxhdCBjaGlsZCBlbGVtZW50IG1hcHMuXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICogQHJldHVybiB7P29iamVjdH0gQSBuZXcgc2V0IG9mIGNoaWxkIGluc3RhbmNlcy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICB1cGRhdGVDaGlsZHJlbjogZnVuY3Rpb24gKHByZXZDaGlsZHJlbiwgbmV4dENoaWxkcmVuLCBtb3VudEltYWdlcywgcmVtb3ZlZE5vZGVzLCB0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQsIHNlbGZEZWJ1Z0lEIC8vIDAgaW4gcHJvZHVjdGlvbiBhbmQgZm9yIHJvb3RzXG4gICkge1xuICAgIC8vIFdlIGN1cnJlbnRseSBkb24ndCBoYXZlIGEgd2F5IHRvIHRyYWNrIG1vdmVzIGhlcmUgYnV0IGlmIHdlIHVzZSBpdGVyYXRvcnNcbiAgICAvLyBpbnN0ZWFkIG9mIGZvci4uaW4gd2UgY2FuIHppcCB0aGUgaXRlcmF0b3JzIGFuZCBjaGVjayBpZiBhbiBpdGVtIGhhc1xuICAgIC8vIG1vdmVkLlxuICAgIC8vIFRPRE86IElmIG5vdGhpbmcgaGFzIGNoYW5nZWQsIHJldHVybiB0aGUgcHJldkNoaWxkcmVuIG9iamVjdCBzbyB0aGF0IHdlXG4gICAgLy8gY2FuIHF1aWNrbHkgYmFpbG91dCBpZiBub3RoaW5nIGhhcyBjaGFuZ2VkLlxuICAgIGlmICghbmV4dENoaWxkcmVuICYmICFwcmV2Q2hpbGRyZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG5hbWU7XG4gICAgdmFyIHByZXZDaGlsZDtcbiAgICBmb3IgKG5hbWUgaW4gbmV4dENoaWxkcmVuKSB7XG4gICAgICBpZiAoIW5leHRDaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHByZXZDaGlsZCA9IHByZXZDaGlsZHJlbiAmJiBwcmV2Q2hpbGRyZW5bbmFtZV07XG4gICAgICB2YXIgcHJldkVsZW1lbnQgPSBwcmV2Q2hpbGQgJiYgcHJldkNoaWxkLl9jdXJyZW50RWxlbWVudDtcbiAgICAgIHZhciBuZXh0RWxlbWVudCA9IG5leHRDaGlsZHJlbltuYW1lXTtcbiAgICAgIGlmIChwcmV2Q2hpbGQgIT0gbnVsbCAmJiBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudChwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQpKSB7XG4gICAgICAgIFJlYWN0UmVjb25jaWxlci5yZWNlaXZlQ29tcG9uZW50KHByZXZDaGlsZCwgbmV4dEVsZW1lbnQsIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICAgICAgbmV4dENoaWxkcmVuW25hbWVdID0gcHJldkNoaWxkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHByZXZDaGlsZCkge1xuICAgICAgICAgIHJlbW92ZWROb2Rlc1tuYW1lXSA9IFJlYWN0UmVjb25jaWxlci5nZXRIb3N0Tm9kZShwcmV2Q2hpbGQpO1xuICAgICAgICAgIFJlYWN0UmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KHByZXZDaGlsZCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoZSBjaGlsZCBtdXN0IGJlIGluc3RhbnRpYXRlZCBiZWZvcmUgaXQncyBtb3VudGVkLlxuICAgICAgICB2YXIgbmV4dENoaWxkSW5zdGFuY2UgPSBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KG5leHRFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgbmV4dENoaWxkcmVuW25hbWVdID0gbmV4dENoaWxkSW5zdGFuY2U7XG4gICAgICAgIC8vIENyZWF0aW5nIG1vdW50IGltYWdlIG5vdyBlbnN1cmVzIHJlZnMgYXJlIHJlc29sdmVkIGluIHJpZ2h0IG9yZGVyXG4gICAgICAgIC8vIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzEwMSBmb3IgZXhwbGFuYXRpb24pLlxuICAgICAgICB2YXIgbmV4dENoaWxkTW91bnRJbWFnZSA9IFJlYWN0UmVjb25jaWxlci5tb3VudENvbXBvbmVudChuZXh0Q2hpbGRJbnN0YW5jZSwgdHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBzZWxmRGVidWdJRCk7XG4gICAgICAgIG1vdW50SW1hZ2VzLnB1c2gobmV4dENoaWxkTW91bnRJbWFnZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFVubW91bnQgY2hpbGRyZW4gdGhhdCBhcmUgbm8gbG9uZ2VyIHByZXNlbnQuXG4gICAgZm9yIChuYW1lIGluIHByZXZDaGlsZHJlbikge1xuICAgICAgaWYgKHByZXZDaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiAhKG5leHRDaGlsZHJlbiAmJiBuZXh0Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpKSB7XG4gICAgICAgIHByZXZDaGlsZCA9IHByZXZDaGlsZHJlbltuYW1lXTtcbiAgICAgICAgcmVtb3ZlZE5vZGVzW25hbWVdID0gUmVhY3RSZWNvbmNpbGVyLmdldEhvc3ROb2RlKHByZXZDaGlsZCk7XG4gICAgICAgIFJlYWN0UmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KHByZXZDaGlsZCwgZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogVW5tb3VudHMgYWxsIHJlbmRlcmVkIGNoaWxkcmVuLiBUaGlzIHNob3VsZCBiZSB1c2VkIHRvIGNsZWFuIHVwIGNoaWxkcmVuXG4gICAqIHdoZW4gdGhpcyBjb21wb25lbnQgaXMgdW5tb3VudGVkLlxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IHJlbmRlcmVkQ2hpbGRyZW4gUHJldmlvdXNseSBpbml0aWFsaXplZCBzZXQgb2YgY2hpbGRyZW4uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdW5tb3VudENoaWxkcmVuOiBmdW5jdGlvbiAocmVuZGVyZWRDaGlsZHJlbiwgc2FmZWx5KSB7XG4gICAgZm9yICh2YXIgbmFtZSBpbiByZW5kZXJlZENoaWxkcmVuKSB7XG4gICAgICBpZiAocmVuZGVyZWRDaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICB2YXIgcmVuZGVyZWRDaGlsZCA9IHJlbmRlcmVkQ2hpbGRyZW5bbmFtZV07XG4gICAgICAgIFJlYWN0UmVjb25jaWxlci51bm1vdW50Q29tcG9uZW50KHJlbmRlcmVkQ2hpbGQsIHNhZmVseSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RDaGlsZFJlY29uY2lsZXI7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIERPTUNoaWxkcmVuT3BlcmF0aW9ucyA9IHJlcXVpcmUoJy4vRE9NQ2hpbGRyZW5PcGVyYXRpb25zJyk7XG52YXIgUmVhY3RET01JRE9wZXJhdGlvbnMgPSByZXF1aXJlKCcuL1JlYWN0RE9NSURPcGVyYXRpb25zJyk7XG5cbi8qKlxuICogQWJzdHJhY3RzIGF3YXkgYWxsIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHJlY29uY2lsZXIgdGhhdCByZXF1aXJlcyBrbm93bGVkZ2Ugb2ZcbiAqIHRoZSBicm93c2VyIGNvbnRleHQuIFRPRE86IFRoZXNlIGNhbGxlcnMgc2hvdWxkIGJlIHJlZmFjdG9yZWQgdG8gYXZvaWQgdGhlXG4gKiBuZWVkIGZvciB0aGlzIGluamVjdGlvbi5cbiAqL1xudmFyIFJlYWN0Q29tcG9uZW50QnJvd3NlckVudmlyb25tZW50ID0ge1xuXG4gIHByb2Nlc3NDaGlsZHJlblVwZGF0ZXM6IFJlYWN0RE9NSURPcGVyYXRpb25zLmRhbmdlcm91c2x5UHJvY2Vzc0NoaWxkcmVuVXBkYXRlcyxcblxuICByZXBsYWNlTm9kZVdpdGhNYXJrdXA6IERPTUNoaWxkcmVuT3BlcmF0aW9ucy5kYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cFxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q29tcG9uZW50QnJvd3NlckVudmlyb25tZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG52YXIgaW5qZWN0ZWQgPSBmYWxzZTtcblxudmFyIFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQgPSB7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgaW5qZWN0YWJsZSBob29rIGZvciBzd2FwcGluZyBvdXQgbW91bnQgaW1hZ2VzIGluIHRoZSBtaWRkbGUgb2ZcbiAgICogdGhlIHRyZWUuXG4gICAqL1xuICByZXBsYWNlTm9kZVdpdGhNYXJrdXA6IG51bGwsXG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsbHkgaW5qZWN0YWJsZSBob29rIGZvciBwcm9jZXNzaW5nIGEgcXVldWUgb2YgY2hpbGQgdXBkYXRlcy4gV2lsbFxuICAgKiBsYXRlciBtb3ZlIGludG8gTXVsdGlDaGlsZENvbXBvbmVudHMuXG4gICAqL1xuICBwcm9jZXNzQ2hpbGRyZW5VcGRhdGVzOiBudWxsLFxuXG4gIGluamVjdGlvbjoge1xuICAgIGluamVjdEVudmlyb25tZW50OiBmdW5jdGlvbiAoZW52aXJvbm1lbnQpIHtcbiAgICAgICEhaW5qZWN0ZWQgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50OiBpbmplY3RFbnZpcm9ubWVudCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlLicpIDogX3Byb2RJbnZhcmlhbnQoJzEwNCcpIDogdm9pZCAwO1xuICAgICAgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5yZXBsYWNlTm9kZVdpdGhNYXJrdXAgPSBlbnZpcm9ubWVudC5yZXBsYWNlTm9kZVdpdGhNYXJrdXA7XG4gICAgICBSZWFjdENvbXBvbmVudEVudmlyb25tZW50LnByb2Nlc3NDaGlsZHJlblVwZGF0ZXMgPSBlbnZpcm9ubWVudC5wcm9jZXNzQ2hpbGRyZW5VcGRhdGVzO1xuICAgICAgaW5qZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKSxcbiAgICBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3QnKTtcbnZhciBSZWFjdENvbXBvbmVudEVudmlyb25tZW50ID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudEVudmlyb25tZW50Jyk7XG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDdXJyZW50T3duZXInKTtcbnZhciBSZWFjdEVycm9yVXRpbHMgPSByZXF1aXJlKCcuL1JlYWN0RXJyb3JVdGlscycpO1xudmFyIFJlYWN0SW5zdGFuY2VNYXAgPSByZXF1aXJlKCcuL1JlYWN0SW5zdGFuY2VNYXAnKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcbnZhciBSZWFjdE5vZGVUeXBlcyA9IHJlcXVpcmUoJy4vUmVhY3ROb2RlVHlwZXMnKTtcbnZhciBSZWFjdFJlY29uY2lsZXIgPSByZXF1aXJlKCcuL1JlYWN0UmVjb25jaWxlcicpO1xuXG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIGNoZWNrUmVhY3RUeXBlU3BlYyA9IHJlcXVpcmUoJy4vY2hlY2tSZWFjdFR5cGVTcGVjJyk7XG59XG5cbnZhciBlbXB0eU9iamVjdCA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5T2JqZWN0Jyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgc2hhbGxvd0VxdWFsID0gcmVxdWlyZSgnZmJqcy9saWIvc2hhbGxvd0VxdWFsJyk7XG52YXIgc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQgPSByZXF1aXJlKCcuL3Nob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIENvbXBvc2l0ZVR5cGVzID0ge1xuICBJbXB1cmVDbGFzczogMCxcbiAgUHVyZUNsYXNzOiAxLFxuICBTdGF0ZWxlc3NGdW5jdGlvbmFsOiAyXG59O1xuXG5mdW5jdGlvbiBTdGF0ZWxlc3NDb21wb25lbnQoQ29tcG9uZW50KSB7fVxuU3RhdGVsZXNzQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBDb21wb25lbnQgPSBSZWFjdEluc3RhbmNlTWFwLmdldCh0aGlzKS5fY3VycmVudEVsZW1lbnQudHlwZTtcbiAgdmFyIGVsZW1lbnQgPSBDb21wb25lbnQodGhpcy5wcm9wcywgdGhpcy5jb250ZXh0LCB0aGlzLnVwZGF0ZXIpO1xuICB3YXJuSWZJbnZhbGlkRWxlbWVudChDb21wb25lbnQsIGVsZW1lbnQpO1xuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbmZ1bmN0aW9uIHdhcm5JZkludmFsaWRFbGVtZW50KENvbXBvbmVudCwgZWxlbWVudCkge1xuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSBmYWxzZSB8fCBSZWFjdC5pc1ZhbGlkRWxlbWVudChlbGVtZW50KSwgJyVzKC4uLik6IEEgdmFsaWQgUmVhY3QgZWxlbWVudCAob3IgbnVsbCkgbXVzdCBiZSByZXR1cm5lZC4gWW91IG1heSBoYXZlICcgKyAncmV0dXJuZWQgdW5kZWZpbmVkLCBhbiBhcnJheSBvciBzb21lIG90aGVyIGludmFsaWQgb2JqZWN0LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFDb21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMsICclcyguLi4pOiBjaGlsZENvbnRleHRUeXBlcyBjYW5ub3QgYmUgZGVmaW5lZCBvbiBhIGZ1bmN0aW9uYWwgY29tcG9uZW50LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JykgOiB2b2lkIDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCkge1xuICByZXR1cm4gISEoQ29tcG9uZW50LnByb3RvdHlwZSAmJiBDb21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpO1xufVxuXG5mdW5jdGlvbiBpc1B1cmVDb21wb25lbnQoQ29tcG9uZW50KSB7XG4gIHJldHVybiAhIShDb21wb25lbnQucHJvdG90eXBlICYmIENvbXBvbmVudC5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQpO1xufVxuXG4vLyBTZXBhcmF0ZWQgaW50byBhIGZ1bmN0aW9uIHRvIGNvbnRhaW4gZGVvcHRpbWl6YXRpb25zIGNhdXNlZCBieSB0cnkvZmluYWxseS5cbmZ1bmN0aW9uIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZuLCBkZWJ1Z0lELCB0aW1lclR5cGUpIHtcbiAgaWYgKGRlYnVnSUQgPT09IDApIHtcbiAgICAvLyBUb3AtbGV2ZWwgd3JhcHBlcnMgKHNlZSBSZWFjdE1vdW50KSBhbmQgZW1wdHkgY29tcG9uZW50cyAoc2VlXG4gICAgLy8gUmVhY3RET01FbXB0eUNvbXBvbmVudCkgYXJlIGludmlzaWJsZSB0byBob29rcyBhbmQgZGV2dG9vbHMuXG4gICAgLy8gQm90aCBhcmUgaW1wbGVtZW50YXRpb24gZGV0YWlscyB0aGF0IHNob3VsZCBnbyBhd2F5IGluIHRoZSBmdXR1cmUuXG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cblxuICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWdpbkxpZmVDeWNsZVRpbWVyKGRlYnVnSUQsIHRpbWVyVHlwZSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uRW5kTGlmZUN5Y2xlVGltZXIoZGVidWdJRCwgdGltZXJUeXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLSBUaGUgTGlmZS1DeWNsZSBvZiBhIENvbXBvc2l0ZSBDb21wb25lbnQgLS0tLS0tLS0tLS0tLS0tLS0tXG4gKlxuICogLSBjb25zdHJ1Y3RvcjogSW5pdGlhbGl6YXRpb24gb2Ygc3RhdGUuIFRoZSBpbnN0YW5jZSBpcyBub3cgcmV0YWluZWQuXG4gKiAgIC0gY29tcG9uZW50V2lsbE1vdW50XG4gKiAgIC0gcmVuZGVyXG4gKiAgIC0gW2NoaWxkcmVuJ3MgY29uc3RydWN0b3JzXVxuICogICAgIC0gW2NoaWxkcmVuJ3MgY29tcG9uZW50V2lsbE1vdW50IGFuZCByZW5kZXJdXG4gKiAgICAgLSBbY2hpbGRyZW4ncyBjb21wb25lbnREaWRNb3VudF1cbiAqICAgICAtIGNvbXBvbmVudERpZE1vdW50XG4gKlxuICogICAgICAgVXBkYXRlIFBoYXNlczpcbiAqICAgICAgIC0gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAob25seSBjYWxsZWQgaWYgcGFyZW50IHVwZGF0ZWQpXG4gKiAgICAgICAtIHNob3VsZENvbXBvbmVudFVwZGF0ZVxuICogICAgICAgICAtIGNvbXBvbmVudFdpbGxVcGRhdGVcbiAqICAgICAgICAgICAtIHJlbmRlclxuICogICAgICAgICAgIC0gW2NoaWxkcmVuJ3MgY29uc3RydWN0b3JzIG9yIHJlY2VpdmUgcHJvcHMgcGhhc2VzXVxuICogICAgICAgICAtIGNvbXBvbmVudERpZFVwZGF0ZVxuICpcbiAqICAgICAtIGNvbXBvbmVudFdpbGxVbm1vdW50XG4gKiAgICAgLSBbY2hpbGRyZW4ncyBjb21wb25lbnRXaWxsVW5tb3VudF1cbiAqICAgLSBbY2hpbGRyZW4gZGVzdHJveWVkXVxuICogLSAoZGVzdHJveWVkKTogVGhlIGluc3RhbmNlIGlzIG5vdyBibGFuaywgcmVsZWFzZWQgYnkgUmVhY3QgYW5kIHJlYWR5IGZvciBHQy5cbiAqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbi8qKlxuICogQW4gaW5jcmVtZW50aW5nIElEIGFzc2lnbmVkIHRvIGVhY2ggY29tcG9uZW50IHdoZW4gaXQgaXMgbW91bnRlZC4gVGhpcyBpc1xuICogdXNlZCB0byBlbmZvcmNlIHRoZSBvcmRlciBpbiB3aGljaCBgUmVhY3RVcGRhdGVzYCB1cGRhdGVzIGRpcnR5IGNvbXBvbmVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqL1xudmFyIG5leHRNb3VudElEID0gMTtcblxuLyoqXG4gKiBAbGVuZHMge1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50LnByb3RvdHlwZX1cbiAqL1xudmFyIFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50ID0ge1xuXG4gIC8qKlxuICAgKiBCYXNlIGNvbnN0cnVjdG9yIGZvciBhbGwgY29tcG9zaXRlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQGZpbmFsXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgY29uc3RydWN0OiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLl9yb290Tm9kZUlEID0gMDtcbiAgICB0aGlzLl9jb21wb3NpdGVUeXBlID0gbnVsbDtcbiAgICB0aGlzLl9pbnN0YW5jZSA9IG51bGw7XG4gICAgdGhpcy5faG9zdFBhcmVudCA9IG51bGw7XG4gICAgdGhpcy5faG9zdENvbnRhaW5lckluZm8gPSBudWxsO1xuXG4gICAgLy8gU2VlIFJlYWN0VXBkYXRlUXVldWVcbiAgICB0aGlzLl91cGRhdGVCYXRjaE51bWJlciA9IG51bGw7XG4gICAgdGhpcy5fcGVuZGluZ0VsZW1lbnQgPSBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlID0gbnVsbDtcbiAgICB0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlID0gZmFsc2U7XG4gICAgdGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlID0gZmFsc2U7XG5cbiAgICB0aGlzLl9yZW5kZXJlZE5vZGVUeXBlID0gbnVsbDtcbiAgICB0aGlzLl9yZW5kZXJlZENvbXBvbmVudCA9IG51bGw7XG4gICAgdGhpcy5fY29udGV4dCA9IG51bGw7XG4gICAgdGhpcy5fbW91bnRPcmRlciA9IDA7XG4gICAgdGhpcy5fdG9wTGV2ZWxXcmFwcGVyID0gbnVsbDtcblxuICAgIC8vIFNlZSBSZWFjdFVwZGF0ZXMgYW5kIFJlYWN0VXBkYXRlUXVldWUuXG4gICAgdGhpcy5fcGVuZGluZ0NhbGxiYWNrcyA9IG51bGw7XG5cbiAgICAvLyBDb21wb25lbnRXaWxsVW5tb3VudCBzaGFsbCBvbmx5IGJlIGNhbGxlZCBvbmNlXG4gICAgdGhpcy5fY2FsbGVkQ29tcG9uZW50V2lsbFVubW91bnQgPSBmYWxzZTtcblxuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdGhpcy5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSBmYWxzZTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBjb21wb25lbnQsIHJlbmRlcnMgbWFya3VwLCBhbmQgcmVnaXN0ZXJzIGV2ZW50IGxpc3RlbmVycy5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7P29iamVjdH0gaG9zdFBhcmVudFxuICAgKiBAcGFyYW0gez9vYmplY3R9IGhvc3RDb250YWluZXJJbmZvXG4gICAqIEBwYXJhbSB7P29iamVjdH0gY29udGV4dFxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfSBSZW5kZXJlZCBtYXJrdXAgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NLlxuICAgKiBAZmluYWxcbiAgICogQGludGVybmFsXG4gICAqL1xuICBtb3VudENvbXBvbmVudDogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgY29udGV4dCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDtcbiAgICB0aGlzLl9tb3VudE9yZGVyID0gbmV4dE1vdW50SUQrKztcbiAgICB0aGlzLl9ob3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICB0aGlzLl9ob3N0Q29udGFpbmVySW5mbyA9IGhvc3RDb250YWluZXJJbmZvO1xuXG4gICAgdmFyIHB1YmxpY1Byb3BzID0gdGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7XG4gICAgdmFyIHB1YmxpY0NvbnRleHQgPSB0aGlzLl9wcm9jZXNzQ29udGV4dChjb250ZXh0KTtcblxuICAgIHZhciBDb21wb25lbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO1xuXG4gICAgdmFyIHVwZGF0ZVF1ZXVlID0gdHJhbnNhY3Rpb24uZ2V0VXBkYXRlUXVldWUoKTtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIHB1YmxpYyBjbGFzc1xuICAgIHZhciBkb0NvbnN0cnVjdCA9IHNob3VsZENvbnN0cnVjdChDb21wb25lbnQpO1xuICAgIHZhciBpbnN0ID0gdGhpcy5fY29uc3RydWN0Q29tcG9uZW50KGRvQ29uc3RydWN0LCBwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpO1xuICAgIHZhciByZW5kZXJlZEVsZW1lbnQ7XG5cbiAgICAvLyBTdXBwb3J0IGZ1bmN0aW9uYWwgY29tcG9uZW50c1xuICAgIGlmICghZG9Db25zdHJ1Y3QgJiYgKGluc3QgPT0gbnVsbCB8fCBpbnN0LnJlbmRlciA9PSBudWxsKSkge1xuICAgICAgcmVuZGVyZWRFbGVtZW50ID0gaW5zdDtcbiAgICAgIHdhcm5JZkludmFsaWRFbGVtZW50KENvbXBvbmVudCwgcmVuZGVyZWRFbGVtZW50KTtcbiAgICAgICEoaW5zdCA9PT0gbnVsbCB8fCBpbnN0ID09PSBmYWxzZSB8fCBSZWFjdC5pc1ZhbGlkRWxlbWVudChpbnN0KSkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzKC4uLik6IEEgdmFsaWQgUmVhY3QgZWxlbWVudCAob3IgbnVsbCkgbXVzdCBiZSByZXR1cm5lZC4gWW91IG1heSBoYXZlIHJldHVybmVkIHVuZGVmaW5lZCwgYW4gYXJyYXkgb3Igc29tZSBvdGhlciBpbnZhbGlkIG9iamVjdC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpIDogX3Byb2RJbnZhcmlhbnQoJzEwNScsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBpbnN0ID0gbmV3IFN0YXRlbGVzc0NvbXBvbmVudChDb21wb25lbnQpO1xuICAgICAgdGhpcy5fY29tcG9zaXRlVHlwZSA9IENvbXBvc2l0ZVR5cGVzLlN0YXRlbGVzc0Z1bmN0aW9uYWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc1B1cmVDb21wb25lbnQoQ29tcG9uZW50KSkge1xuICAgICAgICB0aGlzLl9jb21wb3NpdGVUeXBlID0gQ29tcG9zaXRlVHlwZXMuUHVyZUNsYXNzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fY29tcG9zaXRlVHlwZSA9IENvbXBvc2l0ZVR5cGVzLkltcHVyZUNsYXNzO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGxhdGVyIGluIF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQsIGJ1dCBhZGQgYW4gZWFybHlcbiAgICAgIC8vIHdhcm5pbmcgbm93IHRvIGhlbHAgZGVidWdnaW5nXG4gICAgICBpZiAoaW5zdC5yZW5kZXIgPT0gbnVsbCkge1xuICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyguLi4pOiBObyBgcmVuZGVyYCBtZXRob2QgZm91bmQgb24gdGhlIHJldHVybmVkIGNvbXBvbmVudCAnICsgJ2luc3RhbmNlOiB5b3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIGRlZmluZSBgcmVuZGVyYC4nLCBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgfVxuXG4gICAgICB2YXIgcHJvcHNNdXRhdGVkID0gaW5zdC5wcm9wcyAhPT0gcHVibGljUHJvcHM7XG4gICAgICB2YXIgY29tcG9uZW50TmFtZSA9IENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JztcblxuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGluc3QucHJvcHMgPT09IHVuZGVmaW5lZCB8fCAhcHJvcHNNdXRhdGVkLCAnJXMoLi4uKTogV2hlbiBjYWxsaW5nIHN1cGVyKCkgaW4gYCVzYCwgbWFrZSBzdXJlIHRvIHBhc3MgJyArICd1cCB0aGUgc2FtZSBwcm9wcyB0aGF0IHlvdXIgY29tcG9uZW50XFwncyBjb25zdHJ1Y3RvciB3YXMgcGFzc2VkLicsIGNvbXBvbmVudE5hbWUsIGNvbXBvbmVudE5hbWUpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIC8vIFRoZXNlIHNob3VsZCBiZSBzZXQgdXAgaW4gdGhlIGNvbnN0cnVjdG9yLCBidXQgYXMgYSBjb252ZW5pZW5jZSBmb3JcbiAgICAvLyBzaW1wbGVyIGNsYXNzIGFic3RyYWN0aW9ucywgd2Ugc2V0IHRoZW0gdXAgYWZ0ZXIgdGhlIGZhY3QuXG4gICAgaW5zdC5wcm9wcyA9IHB1YmxpY1Byb3BzO1xuICAgIGluc3QuY29udGV4dCA9IHB1YmxpY0NvbnRleHQ7XG4gICAgaW5zdC5yZWZzID0gZW1wdHlPYmplY3Q7XG4gICAgaW5zdC51cGRhdGVyID0gdXBkYXRlUXVldWU7XG5cbiAgICB0aGlzLl9pbnN0YW5jZSA9IGluc3Q7XG5cbiAgICAvLyBTdG9yZSBhIHJlZmVyZW5jZSBmcm9tIHRoZSBpbnN0YW5jZSBiYWNrIHRvIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvblxuICAgIFJlYWN0SW5zdGFuY2VNYXAuc2V0KGluc3QsIHRoaXMpO1xuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAvLyBTaW5jZSBwbGFpbiBKUyBjbGFzc2VzIGFyZSBkZWZpbmVkIHdpdGhvdXQgYW55IHNwZWNpYWwgaW5pdGlhbGl6YXRpb25cbiAgICAgIC8vIGxvZ2ljLCB3ZSBjYW4gbm90IGNhdGNoIGNvbW1vbiBlcnJvcnMgZWFybHkuIFRoZXJlZm9yZSwgd2UgaGF2ZSB0b1xuICAgICAgLy8gY2F0Y2ggdGhlbSBoZXJlLCBhdCBpbml0aWFsaXphdGlvbiB0aW1lLCBpbnN0ZWFkLlxuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFpbnN0LmdldEluaXRpYWxTdGF0ZSB8fCBpbnN0LmdldEluaXRpYWxTdGF0ZS5pc1JlYWN0Q2xhc3NBcHByb3ZlZCB8fCBpbnN0LnN0YXRlLCAnZ2V0SW5pdGlhbFN0YXRlIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ0RpZCB5b3UgbWVhbiB0byBkZWZpbmUgYSBzdGF0ZSBwcm9wZXJ0eSBpbnN0ZWFkPycsIHRoaXMuZ2V0TmFtZSgpIHx8ICdhIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFpbnN0LmdldERlZmF1bHRQcm9wcyB8fCBpbnN0LmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCwgJ2dldERlZmF1bHRQcm9wcyB3YXMgZGVmaW5lZCBvbiAlcywgYSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzLiAnICsgJ1RoaXMgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGNsYXNzZXMgY3JlYXRlZCB1c2luZyBSZWFjdC5jcmVhdGVDbGFzcy4gJyArICdVc2UgYSBzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGRlZmF1bHRQcm9wcyBpbnN0ZWFkLicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdhIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFpbnN0LnByb3BUeXBlcywgJ3Byb3BUeXBlcyB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgc3RhdGljICcgKyAncHJvcGVydHkgdG8gZGVmaW5lIHByb3BUeXBlcyBpbnN0ZWFkLicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdhIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFpbnN0LmNvbnRleHRUeXBlcywgJ2NvbnRleHRUeXBlcyB3YXMgZGVmaW5lZCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBvbiAlcy4gVXNlIGEgJyArICdzdGF0aWMgcHJvcGVydHkgdG8gZGVmaW5lIGNvbnRleHRUeXBlcyBpbnN0ZWFkLicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdhIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHR5cGVvZiBpbnN0LmNvbXBvbmVudFNob3VsZFVwZGF0ZSAhPT0gJ2Z1bmN0aW9uJywgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRTaG91bGRVcGRhdGUoKS4gRGlkIHlvdSBtZWFuIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpPyAnICsgJ1RoZSBuYW1lIGlzIHBocmFzZWQgYXMgYSBxdWVzdGlvbiBiZWNhdXNlIHRoZSBmdW5jdGlvbiBpcyAnICsgJ2V4cGVjdGVkIHRvIHJldHVybiBhIHZhbHVlLicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHR5cGVvZiBpbnN0LmNvbXBvbmVudERpZFVubW91bnQgIT09ICdmdW5jdGlvbicsICclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50RGlkVW5tb3VudCgpLiBCdXQgdGhlcmUgaXMgbm8gc3VjaCBsaWZlY3ljbGUgbWV0aG9kLiAnICsgJ0RpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsVW5tb3VudCgpPycsIHRoaXMuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHR5cGVvZiBpbnN0LmNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMgIT09ICdmdW5jdGlvbicsICclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIHRoaXMuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIHZhciBpbml0aWFsU3RhdGUgPSBpbnN0LnN0YXRlO1xuICAgIGlmIChpbml0aWFsU3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5zdC5zdGF0ZSA9IGluaXRpYWxTdGF0ZSA9IG51bGw7XG4gICAgfVxuICAgICEodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaW5pdGlhbFN0YXRlKSkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzLnN0YXRlOiBtdXN0IGJlIHNldCB0byBhbiBvYmplY3Qgb3IgbnVsbCcsIHRoaXMuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogX3Byb2RJbnZhcmlhbnQoJzEwNicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogdm9pZCAwO1xuXG4gICAgdGhpcy5fcGVuZGluZ1N0YXRlUXVldWUgPSBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGUgPSBmYWxzZTtcbiAgICB0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGUgPSBmYWxzZTtcblxuICAgIHZhciBtYXJrdXA7XG4gICAgaWYgKGluc3QudW5zdGFibGVfaGFuZGxlRXJyb3IpIHtcbiAgICAgIG1hcmt1cCA9IHRoaXMucGVyZm9ybUluaXRpYWxNb3VudFdpdGhFcnJvckhhbmRsaW5nKHJlbmRlcmVkRWxlbWVudCwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWFya3VwID0gdGhpcy5wZXJmb3JtSW5pdGlhbE1vdW50KHJlbmRlcmVkRWxlbWVudCwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdC5jb21wb25lbnREaWRNb3VudCkge1xuICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnN0LmNvbXBvbmVudERpZE1vdW50KCk7XG4gICAgICAgICAgfSwgX3RoaXMuX2RlYnVnSUQsICdjb21wb25lbnREaWRNb3VudCcpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoaW5zdC5jb21wb25lbnREaWRNb3VudCwgaW5zdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcmt1cDtcbiAgfSxcblxuICBfY29uc3RydWN0Q29tcG9uZW50OiBmdW5jdGlvbiAoZG9Db25zdHJ1Y3QsIHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSkge1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9IHRoaXM7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uc3RydWN0Q29tcG9uZW50V2l0aG91dE93bmVyKGRvQ29uc3RydWN0LCBwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9IG51bGw7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb25zdHJ1Y3RDb21wb25lbnRXaXRob3V0T3duZXIoZG9Db25zdHJ1Y3QsIHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7XG4gICAgfVxuICB9LFxuXG4gIF9jb25zdHJ1Y3RDb21wb25lbnRXaXRob3V0T3duZXI6IGZ1bmN0aW9uIChkb0NvbnN0cnVjdCwgcHVibGljUHJvcHMsIHB1YmxpY0NvbnRleHQsIHVwZGF0ZVF1ZXVlKSB7XG4gICAgdmFyIENvbXBvbmVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG5cbiAgICBpZiAoZG9Db25zdHJ1Y3QpIHtcbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICByZXR1cm4gbWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50KHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7XG4gICAgICAgIH0sIHRoaXMuX2RlYnVnSUQsICdjdG9yJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudChwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoaXMgY2FuIHN0aWxsIGJlIGFuIGluc3RhbmNlIGluIGNhc2Ugb2YgZmFjdG9yeSBjb21wb25lbnRzXG4gICAgLy8gYnV0IHdlJ2xsIGNvdW50IHRoaXMgYXMgdGltZSBzcGVudCByZW5kZXJpbmcgYXMgdGhlIG1vcmUgY29tbW9uIGNhc2UuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICByZXR1cm4gbWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gQ29tcG9uZW50KHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7XG4gICAgICB9LCB0aGlzLl9kZWJ1Z0lELCAncmVuZGVyJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBDb21wb25lbnQocHVibGljUHJvcHMsIHB1YmxpY0NvbnRleHQsIHVwZGF0ZVF1ZXVlKTtcbiAgICB9XG4gIH0sXG5cbiAgcGVyZm9ybUluaXRpYWxNb3VudFdpdGhFcnJvckhhbmRsaW5nOiBmdW5jdGlvbiAocmVuZGVyZWRFbGVtZW50LCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICB2YXIgbWFya3VwO1xuICAgIHZhciBjaGVja3BvaW50ID0gdHJhbnNhY3Rpb24uY2hlY2twb2ludCgpO1xuICAgIHRyeSB7XG4gICAgICBtYXJrdXAgPSB0aGlzLnBlcmZvcm1Jbml0aWFsTW91bnQocmVuZGVyZWRFbGVtZW50LCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIFJvbGwgYmFjayB0byBjaGVja3BvaW50LCBoYW5kbGUgZXJyb3IgKHdoaWNoIG1heSBhZGQgaXRlbXMgdG8gdGhlIHRyYW5zYWN0aW9uKSwgYW5kIHRha2UgYSBuZXcgY2hlY2twb2ludFxuICAgICAgdHJhbnNhY3Rpb24ucm9sbGJhY2soY2hlY2twb2ludCk7XG4gICAgICB0aGlzLl9pbnN0YW5jZS51bnN0YWJsZV9oYW5kbGVFcnJvcihlKTtcbiAgICAgIGlmICh0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSkge1xuICAgICAgICB0aGlzLl9pbnN0YW5jZS5zdGF0ZSA9IHRoaXMuX3Byb2Nlc3NQZW5kaW5nU3RhdGUodGhpcy5faW5zdGFuY2UucHJvcHMsIHRoaXMuX2luc3RhbmNlLmNvbnRleHQpO1xuICAgICAgfVxuICAgICAgY2hlY2twb2ludCA9IHRyYW5zYWN0aW9uLmNoZWNrcG9pbnQoKTtcblxuICAgICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQudW5tb3VudENvbXBvbmVudCh0cnVlKTtcbiAgICAgIHRyYW5zYWN0aW9uLnJvbGxiYWNrKGNoZWNrcG9pbnQpO1xuXG4gICAgICAvLyBUcnkgYWdhaW4gLSB3ZSd2ZSBpbmZvcm1lZCB0aGUgY29tcG9uZW50IGFib3V0IHRoZSBlcnJvciwgc28gdGhleSBjYW4gcmVuZGVyIGFuIGVycm9yIG1lc3NhZ2UgdGhpcyB0aW1lLlxuICAgICAgLy8gSWYgdGhpcyB0aHJvd3MgYWdhaW4sIHRoZSBlcnJvciB3aWxsIGJ1YmJsZSB1cCAoYW5kIGNhbiBiZSBjYXVnaHQgYnkgYSBoaWdoZXIgZXJyb3IgYm91bmRhcnkpLlxuICAgICAgbWFya3VwID0gdGhpcy5wZXJmb3JtSW5pdGlhbE1vdW50KHJlbmRlcmVkRWxlbWVudCwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcmt1cDtcbiAgfSxcblxuICBwZXJmb3JtSW5pdGlhbE1vdW50OiBmdW5jdGlvbiAocmVuZGVyZWRFbGVtZW50LCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICB2YXIgaW5zdCA9IHRoaXMuX2luc3RhbmNlO1xuXG4gICAgdmFyIGRlYnVnSUQgPSAwO1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgZGVidWdJRCA9IHRoaXMuX2RlYnVnSUQ7XG4gICAgfVxuXG4gICAgaWYgKGluc3QuY29tcG9uZW50V2lsbE1vdW50KSB7XG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgbWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBpbnN0LmNvbXBvbmVudFdpbGxNb3VudCgpO1xuICAgICAgICB9LCBkZWJ1Z0lELCAnY29tcG9uZW50V2lsbE1vdW50Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnN0LmNvbXBvbmVudFdpbGxNb3VudCgpO1xuICAgICAgfVxuICAgICAgLy8gV2hlbiBtb3VudGluZywgY2FsbHMgdG8gYHNldFN0YXRlYCBieSBgY29tcG9uZW50V2lsbE1vdW50YCB3aWxsIHNldFxuICAgICAgLy8gYHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlYCB3aXRob3V0IHRyaWdnZXJpbmcgYSByZS1yZW5kZXIuXG4gICAgICBpZiAodGhpcy5fcGVuZGluZ1N0YXRlUXVldWUpIHtcbiAgICAgICAgaW5zdC5zdGF0ZSA9IHRoaXMuX3Byb2Nlc3NQZW5kaW5nU3RhdGUoaW5zdC5wcm9wcywgaW5zdC5jb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiBub3QgYSBzdGF0ZWxlc3MgY29tcG9uZW50LCB3ZSBub3cgcmVuZGVyXG4gICAgaWYgKHJlbmRlcmVkRWxlbWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZW5kZXJlZEVsZW1lbnQgPSB0aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQoKTtcbiAgICB9XG5cbiAgICB2YXIgbm9kZVR5cGUgPSBSZWFjdE5vZGVUeXBlcy5nZXRUeXBlKHJlbmRlcmVkRWxlbWVudCk7XG4gICAgdGhpcy5fcmVuZGVyZWROb2RlVHlwZSA9IG5vZGVUeXBlO1xuICAgIHZhciBjaGlsZCA9IHRoaXMuX2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQocmVuZGVyZWRFbGVtZW50LCBub2RlVHlwZSAhPT0gUmVhY3ROb2RlVHlwZXMuRU1QVFkgLyogc2hvdWxkSGF2ZURlYnVnSUQgKi9cbiAgICApO1xuICAgIHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50ID0gY2hpbGQ7XG5cbiAgICB2YXIgbWFya3VwID0gUmVhY3RSZWNvbmNpbGVyLm1vdW50Q29tcG9uZW50KGNoaWxkLCB0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQoY29udGV4dCksIGRlYnVnSUQpO1xuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoZGVidWdJRCAhPT0gMCkge1xuICAgICAgICB2YXIgY2hpbGREZWJ1Z0lEcyA9IGNoaWxkLl9kZWJ1Z0lEICE9PSAwID8gW2NoaWxkLl9kZWJ1Z0lEXSA6IFtdO1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25TZXRDaGlsZHJlbihkZWJ1Z0lELCBjaGlsZERlYnVnSURzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWFya3VwO1xuICB9LFxuXG4gIGdldEhvc3ROb2RlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFJlYWN0UmVjb25jaWxlci5nZXRIb3N0Tm9kZSh0aGlzLl9yZW5kZXJlZENvbXBvbmVudCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkIGJ5IGBtb3VudENvbXBvbmVudGAuXG4gICAqXG4gICAqIEBmaW5hbFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChzYWZlbHkpIHtcbiAgICBpZiAoIXRoaXMuX3JlbmRlcmVkQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGluc3QgPSB0aGlzLl9pbnN0YW5jZTtcblxuICAgIGlmIChpbnN0LmNvbXBvbmVudFdpbGxVbm1vdW50ICYmICFpbnN0Ll9jYWxsZWRDb21wb25lbnRXaWxsVW5tb3VudCkge1xuICAgICAgaW5zdC5fY2FsbGVkQ29tcG9uZW50V2lsbFVubW91bnQgPSB0cnVlO1xuXG4gICAgICBpZiAoc2FmZWx5KSB7XG4gICAgICAgIHZhciBuYW1lID0gdGhpcy5nZXROYW1lKCkgKyAnLmNvbXBvbmVudFdpbGxVbm1vdW50KCknO1xuICAgICAgICBSZWFjdEVycm9yVXRpbHMuaW52b2tlR3VhcmRlZENhbGxiYWNrKG5hbWUsIGluc3QuY29tcG9uZW50V2lsbFVubW91bnQuYmluZChpbnN0KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zdC5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICAgICAgICAgIH0sIHRoaXMuX2RlYnVnSUQsICdjb21wb25lbnRXaWxsVW5tb3VudCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluc3QuY29tcG9uZW50V2lsbFVubW91bnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9yZW5kZXJlZENvbXBvbmVudCkge1xuICAgICAgUmVhY3RSZWNvbmNpbGVyLnVubW91bnRDb21wb25lbnQodGhpcy5fcmVuZGVyZWRDb21wb25lbnQsIHNhZmVseSk7XG4gICAgICB0aGlzLl9yZW5kZXJlZE5vZGVUeXBlID0gbnVsbDtcbiAgICAgIHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBwZW5kaW5nIGZpZWxkc1xuICAgIC8vIEV2ZW4gaWYgdGhpcyBjb21wb25lbnQgaXMgc2NoZWR1bGVkIGZvciBhbm90aGVyIHVwZGF0ZSBpbiBSZWFjdFVwZGF0ZXMsXG4gICAgLy8gaXQgd291bGQgc3RpbGwgYmUgaWdub3JlZCBiZWNhdXNlIHRoZXNlIGZpZWxkcyBhcmUgcmVzZXQuXG4gICAgdGhpcy5fcGVuZGluZ1N0YXRlUXVldWUgPSBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGUgPSBmYWxzZTtcbiAgICB0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGUgPSBmYWxzZTtcbiAgICB0aGlzLl9wZW5kaW5nQ2FsbGJhY2tzID0gbnVsbDtcbiAgICB0aGlzLl9wZW5kaW5nRWxlbWVudCA9IG51bGw7XG5cbiAgICAvLyBUaGVzZSBmaWVsZHMgZG8gbm90IHJlYWxseSBuZWVkIHRvIGJlIHJlc2V0IHNpbmNlIHRoaXMgb2JqZWN0IGlzIG5vXG4gICAgLy8gbG9uZ2VyIGFjY2Vzc2libGUuXG4gICAgdGhpcy5fY29udGV4dCA9IG51bGw7XG4gICAgdGhpcy5fcm9vdE5vZGVJRCA9IDA7XG4gICAgdGhpcy5fdG9wTGV2ZWxXcmFwcGVyID0gbnVsbDtcblxuICAgIC8vIERlbGV0ZSB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGluc3RhbmNlIHRvIHRoaXMgaW50ZXJuYWwgcmVwcmVzZW50YXRpb25cbiAgICAvLyB3aGljaCBhbGxvdyB0aGUgaW50ZXJuYWxzIHRvIGJlIHByb3Blcmx5IGNsZWFuZWQgdXAgZXZlbiBpZiB0aGUgdXNlclxuICAgIC8vIGxlYWtzIGEgcmVmZXJlbmNlIHRvIHRoZSBwdWJsaWMgaW5zdGFuY2UuXG4gICAgUmVhY3RJbnN0YW5jZU1hcC5yZW1vdmUoaW5zdCk7XG5cbiAgICAvLyBTb21lIGV4aXN0aW5nIGNvbXBvbmVudHMgcmVseSBvbiBpbnN0LnByb3BzIGV2ZW4gYWZ0ZXIgdGhleSd2ZSBiZWVuXG4gICAgLy8gZGVzdHJveWVkIChpbiBldmVudCBoYW5kbGVycykuXG4gICAgLy8gVE9ETzogaW5zdC5wcm9wcyA9IG51bGw7XG4gICAgLy8gVE9ETzogaW5zdC5zdGF0ZSA9IG51bGw7XG4gICAgLy8gVE9ETzogaW5zdC5jb250ZXh0ID0gbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogRmlsdGVycyB0aGUgY29udGV4dCBvYmplY3QgdG8gb25seSBjb250YWluIGtleXMgc3BlY2lmaWVkIGluXG4gICAqIGBjb250ZXh0VHlwZXNgXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0XG4gICAqIEByZXR1cm4gez9vYmplY3R9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfbWFza0NvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgdmFyIENvbXBvbmVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG4gICAgdmFyIGNvbnRleHRUeXBlcyA9IENvbXBvbmVudC5jb250ZXh0VHlwZXM7XG4gICAgaWYgKCFjb250ZXh0VHlwZXMpIHtcbiAgICAgIHJldHVybiBlbXB0eU9iamVjdDtcbiAgICB9XG4gICAgdmFyIG1hc2tlZENvbnRleHQgPSB7fTtcbiAgICBmb3IgKHZhciBjb250ZXh0TmFtZSBpbiBjb250ZXh0VHlwZXMpIHtcbiAgICAgIG1hc2tlZENvbnRleHRbY29udGV4dE5hbWVdID0gY29udGV4dFtjb250ZXh0TmFtZV07XG4gICAgfVxuICAgIHJldHVybiBtYXNrZWRDb250ZXh0O1xuICB9LFxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIHRoZSBjb250ZXh0IG9iamVjdCB0byBvbmx5IGNvbnRhaW4ga2V5cyBzcGVjaWZpZWQgaW5cbiAgICogYGNvbnRleHRUeXBlc2AsIGFuZCBhc3NlcnRzIHRoYXQgdGhleSBhcmUgdmFsaWQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0XG4gICAqIEByZXR1cm4gez9vYmplY3R9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcHJvY2Vzc0NvbnRleHQ6IGZ1bmN0aW9uIChjb250ZXh0KSB7XG4gICAgdmFyIG1hc2tlZENvbnRleHQgPSB0aGlzLl9tYXNrQ29udGV4dChjb250ZXh0KTtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBDb21wb25lbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO1xuICAgICAgaWYgKENvbXBvbmVudC5jb250ZXh0VHlwZXMpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tDb250ZXh0VHlwZXMoQ29tcG9uZW50LmNvbnRleHRUeXBlcywgbWFza2VkQ29udGV4dCwgJ2NvbnRleHQnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hc2tlZENvbnRleHQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjdXJyZW50Q29udGV4dFxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcHJvY2Vzc0NoaWxkQ29udGV4dDogZnVuY3Rpb24gKGN1cnJlbnRDb250ZXh0KSB7XG4gICAgdmFyIENvbXBvbmVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG4gICAgdmFyIGluc3QgPSB0aGlzLl9pbnN0YW5jZTtcbiAgICB2YXIgY2hpbGRDb250ZXh0O1xuXG4gICAgaWYgKGluc3QuZ2V0Q2hpbGRDb250ZXh0KSB7XG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVnaW5Qcm9jZXNzaW5nQ2hpbGRDb250ZXh0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2hpbGRDb250ZXh0ID0gaW5zdC5nZXRDaGlsZENvbnRleHQoKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25FbmRQcm9jZXNzaW5nQ2hpbGRDb250ZXh0KCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoaWxkQ29udGV4dCA9IGluc3QuZ2V0Q2hpbGRDb250ZXh0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkQ29udGV4dCkge1xuICAgICAgISh0eXBlb2YgQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzID09PSAnb2JqZWN0JykgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzLmdldENoaWxkQ29udGV4dCgpOiBjaGlsZENvbnRleHRUeXBlcyBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8gdXNlIGdldENoaWxkQ29udGV4dCgpLicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogX3Byb2RJbnZhcmlhbnQoJzEwNycsIHRoaXMuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHRoaXMuX2NoZWNrQ29udGV4dFR5cGVzKENvbXBvbmVudC5jaGlsZENvbnRleHRUeXBlcywgY2hpbGRDb250ZXh0LCAnY2hpbGQgY29udGV4dCcpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgbmFtZSBpbiBjaGlsZENvbnRleHQpIHtcbiAgICAgICAgIShuYW1lIGluIENvbXBvbmVudC5jaGlsZENvbnRleHRUeXBlcykgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzLmdldENoaWxkQ29udGV4dCgpOiBrZXkgXCIlc1wiIGlzIG5vdCBkZWZpbmVkIGluIGNoaWxkQ29udGV4dFR5cGVzLicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcsIG5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzEwOCcsIHRoaXMuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcsIG5hbWUpIDogdm9pZCAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIF9hc3NpZ24oe30sIGN1cnJlbnRDb250ZXh0LCBjaGlsZENvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gY3VycmVudENvbnRleHQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEFzc2VydCB0aGF0IHRoZSBjb250ZXh0IHR5cGVzIGFyZSB2YWxpZFxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gdHlwZVNwZWNzIE1hcCBvZiBjb250ZXh0IGZpZWxkIHRvIGEgUmVhY3RQcm9wVHlwZVxuICAgKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIFJ1bnRpbWUgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSB0eXBlLWNoZWNrZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIGUuZy4gXCJwcm9wXCIsIFwiY29udGV4dFwiLCBcImNoaWxkIGNvbnRleHRcIlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NoZWNrQ29udGV4dFR5cGVzOiBmdW5jdGlvbiAodHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uKSB7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBjaGVja1JlYWN0VHlwZVNwZWModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCB0aGlzLmdldE5hbWUoKSwgbnVsbCwgdGhpcy5fZGVidWdJRCk7XG4gICAgfVxuICB9LFxuXG4gIHJlY2VpdmVDb21wb25lbnQ6IGZ1bmN0aW9uIChuZXh0RWxlbWVudCwgdHJhbnNhY3Rpb24sIG5leHRDb250ZXh0KSB7XG4gICAgdmFyIHByZXZFbGVtZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQ7XG4gICAgdmFyIHByZXZDb250ZXh0ID0gdGhpcy5fY29udGV4dDtcblxuICAgIHRoaXMuX3BlbmRpbmdFbGVtZW50ID0gbnVsbDtcblxuICAgIHRoaXMudXBkYXRlQ29tcG9uZW50KHRyYW5zYWN0aW9uLCBwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQsIHByZXZDb250ZXh0LCBuZXh0Q29udGV4dCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIElmIGFueSBvZiBgX3BlbmRpbmdFbGVtZW50YCwgYF9wZW5kaW5nU3RhdGVRdWV1ZWAsIG9yIGBfcGVuZGluZ0ZvcmNlVXBkYXRlYFxuICAgKiBpcyBzZXQsIHVwZGF0ZSB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5OiBmdW5jdGlvbiAodHJhbnNhY3Rpb24pIHtcbiAgICBpZiAodGhpcy5fcGVuZGluZ0VsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgUmVhY3RSZWNvbmNpbGVyLnJlY2VpdmVDb21wb25lbnQodGhpcywgdGhpcy5fcGVuZGluZ0VsZW1lbnQsIHRyYW5zYWN0aW9uLCB0aGlzLl9jb250ZXh0KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlICE9PSBudWxsIHx8IHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSkge1xuICAgICAgdGhpcy51cGRhdGVDb21wb25lbnQodHJhbnNhY3Rpb24sIHRoaXMuX2N1cnJlbnRFbGVtZW50LCB0aGlzLl9jdXJyZW50RWxlbWVudCwgdGhpcy5fY29udGV4dCwgdGhpcy5fY29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3VwZGF0ZUJhdGNoTnVtYmVyID0gbnVsbDtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYW4gdXBkYXRlIHRvIGEgbW91bnRlZCBjb21wb25lbnQuIFRoZSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIGFuZFxuICAgKiBzaG91bGRDb21wb25lbnRVcGRhdGUgbWV0aG9kcyBhcmUgY2FsbGVkLCB0aGVuIChhc3N1bWluZyB0aGUgdXBkYXRlIGlzbid0XG4gICAqIHNraXBwZWQpIHRoZSByZW1haW5pbmcgdXBkYXRlIGxpZmVjeWNsZSBtZXRob2RzIGFyZSBjYWxsZWQgYW5kIHRoZSBET01cbiAgICogcmVwcmVzZW50YXRpb24gaXMgdXBkYXRlZC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhpcyBpbXBsZW1lbnRzIFJlYWN0J3MgcmVuZGVyaW5nIGFuZCByZWNvbmNpbGlhdGlvbiBhbGdvcml0aG0uXG4gICAqIFNvcGhpc3RpY2F0ZWQgY2xpZW50cyBtYXkgd2lzaCB0byBvdmVycmlkZSB0aGlzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBwcmV2UGFyZW50RWxlbWVudFxuICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dFBhcmVudEVsZW1lbnRcbiAgICogQGludGVybmFsXG4gICAqIEBvdmVycmlkYWJsZVxuICAgKi9cbiAgdXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIHByZXZQYXJlbnRFbGVtZW50LCBuZXh0UGFyZW50RWxlbWVudCwgcHJldlVubWFza2VkQ29udGV4dCwgbmV4dFVubWFza2VkQ29udGV4dCkge1xuICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7XG4gICAgIShpbnN0ICE9IG51bGwpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdBdHRlbXB0ZWQgdG8gdXBkYXRlIGNvbXBvbmVudCBgJXNgIHRoYXQgaGFzIGFscmVhZHkgYmVlbiB1bm1vdW50ZWQgKG9yIGZhaWxlZCB0byBtb3VudCkuJywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMTM2JywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7XG5cbiAgICB2YXIgd2lsbFJlY2VpdmUgPSBmYWxzZTtcbiAgICB2YXIgbmV4dENvbnRleHQ7XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGNvbnRleHQgaGFzIGNoYW5nZWQgb3Igbm90XG4gICAgaWYgKHRoaXMuX2NvbnRleHQgPT09IG5leHRVbm1hc2tlZENvbnRleHQpIHtcbiAgICAgIG5leHRDb250ZXh0ID0gaW5zdC5jb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0Q29udGV4dCA9IHRoaXMuX3Byb2Nlc3NDb250ZXh0KG5leHRVbm1hc2tlZENvbnRleHQpO1xuICAgICAgd2lsbFJlY2VpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBwcmV2UHJvcHMgPSBwcmV2UGFyZW50RWxlbWVudC5wcm9wcztcbiAgICB2YXIgbmV4dFByb3BzID0gbmV4dFBhcmVudEVsZW1lbnQucHJvcHM7XG5cbiAgICAvLyBOb3QgYSBzaW1wbGUgc3RhdGUgdXBkYXRlIGJ1dCBhIHByb3BzIHVwZGF0ZVxuICAgIGlmIChwcmV2UGFyZW50RWxlbWVudCAhPT0gbmV4dFBhcmVudEVsZW1lbnQpIHtcbiAgICAgIHdpbGxSZWNlaXZlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBBbiB1cGRhdGUgaGVyZSB3aWxsIHNjaGVkdWxlIGFuIHVwZGF0ZSBidXQgaW1tZWRpYXRlbHkgc2V0XG4gICAgLy8gX3BlbmRpbmdTdGF0ZVF1ZXVlIHdoaWNoIHdpbGwgZW5zdXJlIHRoYXQgYW55IHN0YXRlIHVwZGF0ZXMgZ2V0c1xuICAgIC8vIGltbWVkaWF0ZWx5IHJlY29uY2lsZWQgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciB0aGUgbmV4dCBiYXRjaC5cbiAgICBpZiAod2lsbFJlY2VpdmUgJiYgaW5zdC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKSB7XG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgbWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBpbnN0LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgICAgIH0sIHRoaXMuX2RlYnVnSUQsICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnN0LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG5leHRTdGF0ZSA9IHRoaXMuX3Byb2Nlc3NQZW5kaW5nU3RhdGUobmV4dFByb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgdmFyIHNob3VsZFVwZGF0ZSA9IHRydWU7XG5cbiAgICBpZiAoIXRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSkge1xuICAgICAgaWYgKGluc3Quc2hvdWxkQ29tcG9uZW50VXBkYXRlKSB7XG4gICAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHNob3VsZFVwZGF0ZSA9IG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnN0LnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgICAgIH0sIHRoaXMuX2RlYnVnSUQsICdzaG91bGRDb21wb25lbnRVcGRhdGUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG91bGRVcGRhdGUgPSBpbnN0LnNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5fY29tcG9zaXRlVHlwZSA9PT0gQ29tcG9zaXRlVHlwZXMuUHVyZUNsYXNzKSB7XG4gICAgICAgICAgc2hvdWxkVXBkYXRlID0gIXNoYWxsb3dFcXVhbChwcmV2UHJvcHMsIG5leHRQcm9wcykgfHwgIXNoYWxsb3dFcXVhbChpbnN0LnN0YXRlLCBuZXh0U3RhdGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoc2hvdWxkVXBkYXRlICE9PSB1bmRlZmluZWQsICclcy5zaG91bGRDb21wb25lbnRVcGRhdGUoKTogUmV0dXJuZWQgdW5kZWZpbmVkIGluc3RlYWQgb2YgYSAnICsgJ2Jvb2xlYW4gdmFsdWUuIE1ha2Ugc3VyZSB0byByZXR1cm4gdHJ1ZSBvciBmYWxzZS4nLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVCYXRjaE51bWJlciA9IG51bGw7XG4gICAgaWYgKHNob3VsZFVwZGF0ZSkge1xuICAgICAgdGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlID0gZmFsc2U7XG4gICAgICAvLyBXaWxsIHNldCBgdGhpcy5wcm9wc2AsIGB0aGlzLnN0YXRlYCBhbmQgYHRoaXMuY29udGV4dGAuXG4gICAgICB0aGlzLl9wZXJmb3JtQ29tcG9uZW50VXBkYXRlKG5leHRQYXJlbnRFbGVtZW50LCBuZXh0UHJvcHMsIG5leHRTdGF0ZSwgbmV4dENvbnRleHQsIHRyYW5zYWN0aW9uLCBuZXh0VW5tYXNrZWRDb250ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSWYgaXQncyBkZXRlcm1pbmVkIHRoYXQgYSBjb21wb25lbnQgc2hvdWxkIG5vdCB1cGRhdGUsIHdlIHN0aWxsIHdhbnRcbiAgICAgIC8vIHRvIHNldCBwcm9wcyBhbmQgc3RhdGUgYnV0IHdlIHNob3J0Y3V0IHRoZSByZXN0IG9mIHRoZSB1cGRhdGUuXG4gICAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG5leHRQYXJlbnRFbGVtZW50O1xuICAgICAgdGhpcy5fY29udGV4dCA9IG5leHRVbm1hc2tlZENvbnRleHQ7XG4gICAgICBpbnN0LnByb3BzID0gbmV4dFByb3BzO1xuICAgICAgaW5zdC5zdGF0ZSA9IG5leHRTdGF0ZTtcbiAgICAgIGluc3QuY29udGV4dCA9IG5leHRDb250ZXh0O1xuICAgIH1cbiAgfSxcblxuICBfcHJvY2Vzc1BlbmRpbmdTdGF0ZTogZnVuY3Rpb24gKHByb3BzLCBjb250ZXh0KSB7XG4gICAgdmFyIGluc3QgPSB0aGlzLl9pbnN0YW5jZTtcbiAgICB2YXIgcXVldWUgPSB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZTtcbiAgICB2YXIgcmVwbGFjZSA9IHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGU7XG4gICAgdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlID0gbnVsbDtcblxuICAgIGlmICghcXVldWUpIHtcbiAgICAgIHJldHVybiBpbnN0LnN0YXRlO1xuICAgIH1cblxuICAgIGlmIChyZXBsYWNlICYmIHF1ZXVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHF1ZXVlWzBdO1xuICAgIH1cblxuICAgIHZhciBuZXh0U3RhdGUgPSBfYXNzaWduKHt9LCByZXBsYWNlID8gcXVldWVbMF0gOiBpbnN0LnN0YXRlKTtcbiAgICBmb3IgKHZhciBpID0gcmVwbGFjZSA/IDEgOiAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwYXJ0aWFsID0gcXVldWVbaV07XG4gICAgICBfYXNzaWduKG5leHRTdGF0ZSwgdHlwZW9mIHBhcnRpYWwgPT09ICdmdW5jdGlvbicgPyBwYXJ0aWFsLmNhbGwoaW5zdCwgbmV4dFN0YXRlLCBwcm9wcywgY29udGV4dCkgOiBwYXJ0aWFsKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dFN0YXRlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBNZXJnZXMgbmV3IHByb3BzIGFuZCBzdGF0ZSwgbm90aWZpZXMgZGVsZWdhdGUgbWV0aG9kcyBvZiB1cGRhdGUgYW5kXG4gICAqIHBlcmZvcm1zIHVwZGF0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IG5leHRFbGVtZW50IE5leHQgZWxlbWVudFxuICAgKiBAcGFyYW0ge29iamVjdH0gbmV4dFByb3BzIE5leHQgcHVibGljIG9iamVjdCB0byBzZXQgYXMgcHJvcGVydGllcy5cbiAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0U3RhdGUgTmV4dCBvYmplY3QgdG8gc2V0IGFzIHN0YXRlLlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHRDb250ZXh0IE5leHQgcHVibGljIG9iamVjdCB0byBzZXQgYXMgY29udGV4dC5cbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gez9vYmplY3R9IHVubWFza2VkQ29udGV4dFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3BlcmZvcm1Db21wb25lbnRVcGRhdGU6IGZ1bmN0aW9uIChuZXh0RWxlbWVudCwgbmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0LCB0cmFuc2FjdGlvbiwgdW5tYXNrZWRDb250ZXh0KSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgaW5zdCA9IHRoaXMuX2luc3RhbmNlO1xuXG4gICAgdmFyIGhhc0NvbXBvbmVudERpZFVwZGF0ZSA9IEJvb2xlYW4oaW5zdC5jb21wb25lbnREaWRVcGRhdGUpO1xuICAgIHZhciBwcmV2UHJvcHM7XG4gICAgdmFyIHByZXZTdGF0ZTtcbiAgICB2YXIgcHJldkNvbnRleHQ7XG4gICAgaWYgKGhhc0NvbXBvbmVudERpZFVwZGF0ZSkge1xuICAgICAgcHJldlByb3BzID0gaW5zdC5wcm9wcztcbiAgICAgIHByZXZTdGF0ZSA9IGluc3Quc3RhdGU7XG4gICAgICBwcmV2Q29udGV4dCA9IGluc3QuY29udGV4dDtcbiAgICB9XG5cbiAgICBpZiAoaW5zdC5jb21wb25lbnRXaWxsVXBkYXRlKSB7XG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgbWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBpbnN0LmNvbXBvbmVudFdpbGxVcGRhdGUobmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0KTtcbiAgICAgICAgfSwgdGhpcy5fZGVidWdJRCwgJ2NvbXBvbmVudFdpbGxVcGRhdGUnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3QuY29tcG9uZW50V2lsbFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dEVsZW1lbnQ7XG4gICAgdGhpcy5fY29udGV4dCA9IHVubWFza2VkQ29udGV4dDtcbiAgICBpbnN0LnByb3BzID0gbmV4dFByb3BzO1xuICAgIGluc3Quc3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgaW5zdC5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG5cbiAgICB0aGlzLl91cGRhdGVSZW5kZXJlZENvbXBvbmVudCh0cmFuc2FjdGlvbiwgdW5tYXNrZWRDb250ZXh0KTtcblxuICAgIGlmIChoYXNDb21wb25lbnREaWRVcGRhdGUpIHtcbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlUGVyZihpbnN0LmNvbXBvbmVudERpZFVwZGF0ZS5iaW5kKGluc3QsIHByZXZQcm9wcywgcHJldlN0YXRlLCBwcmV2Q29udGV4dCksIF90aGlzMi5fZGVidWdJRCwgJ2NvbXBvbmVudERpZFVwZGF0ZScpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoaW5zdC5jb21wb25lbnREaWRVcGRhdGUuYmluZChpbnN0LCBwcmV2UHJvcHMsIHByZXZTdGF0ZSwgcHJldkNvbnRleHQpLCBpbnN0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIENhbGwgdGhlIGNvbXBvbmVudCdzIGByZW5kZXJgIG1ldGhvZCBhbmQgdXBkYXRlIHRoZSBET00gYWNjb3JkaW5nbHkuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQGludGVybmFsXG4gICAqL1xuICBfdXBkYXRlUmVuZGVyZWRDb21wb25lbnQ6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgY29udGV4dCkge1xuICAgIHZhciBwcmV2Q29tcG9uZW50SW5zdGFuY2UgPSB0aGlzLl9yZW5kZXJlZENvbXBvbmVudDtcbiAgICB2YXIgcHJldlJlbmRlcmVkRWxlbWVudCA9IHByZXZDb21wb25lbnRJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQ7XG4gICAgdmFyIG5leHRSZW5kZXJlZEVsZW1lbnQgPSB0aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQoKTtcblxuICAgIHZhciBkZWJ1Z0lEID0gMDtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGRlYnVnSUQgPSB0aGlzLl9kZWJ1Z0lEO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudChwcmV2UmVuZGVyZWRFbGVtZW50LCBuZXh0UmVuZGVyZWRFbGVtZW50KSkge1xuICAgICAgUmVhY3RSZWNvbmNpbGVyLnJlY2VpdmVDb21wb25lbnQocHJldkNvbXBvbmVudEluc3RhbmNlLCBuZXh0UmVuZGVyZWRFbGVtZW50LCB0cmFuc2FjdGlvbiwgdGhpcy5fcHJvY2Vzc0NoaWxkQ29udGV4dChjb250ZXh0KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBvbGRIb3N0Tm9kZSA9IFJlYWN0UmVjb25jaWxlci5nZXRIb3N0Tm9kZShwcmV2Q29tcG9uZW50SW5zdGFuY2UpO1xuICAgICAgUmVhY3RSZWNvbmNpbGVyLnVubW91bnRDb21wb25lbnQocHJldkNvbXBvbmVudEluc3RhbmNlLCBmYWxzZSk7XG5cbiAgICAgIHZhciBub2RlVHlwZSA9IFJlYWN0Tm9kZVR5cGVzLmdldFR5cGUobmV4dFJlbmRlcmVkRWxlbWVudCk7XG4gICAgICB0aGlzLl9yZW5kZXJlZE5vZGVUeXBlID0gbm9kZVR5cGU7XG4gICAgICB2YXIgY2hpbGQgPSB0aGlzLl9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KG5leHRSZW5kZXJlZEVsZW1lbnQsIG5vZGVUeXBlICE9PSBSZWFjdE5vZGVUeXBlcy5FTVBUWSAvKiBzaG91bGRIYXZlRGVidWdJRCAqL1xuICAgICAgKTtcbiAgICAgIHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50ID0gY2hpbGQ7XG5cbiAgICAgIHZhciBuZXh0TWFya3VwID0gUmVhY3RSZWNvbmNpbGVyLm1vdW50Q29tcG9uZW50KGNoaWxkLCB0cmFuc2FjdGlvbiwgdGhpcy5faG9zdFBhcmVudCwgdGhpcy5faG9zdENvbnRhaW5lckluZm8sIHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQoY29udGV4dCksIGRlYnVnSUQpO1xuXG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKGRlYnVnSUQgIT09IDApIHtcbiAgICAgICAgICB2YXIgY2hpbGREZWJ1Z0lEcyA9IGNoaWxkLl9kZWJ1Z0lEICE9PSAwID8gW2NoaWxkLl9kZWJ1Z0lEXSA6IFtdO1xuICAgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblNldENoaWxkcmVuKGRlYnVnSUQsIGNoaWxkRGVidWdJRHMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3JlcGxhY2VOb2RlV2l0aE1hcmt1cChvbGRIb3N0Tm9kZSwgbmV4dE1hcmt1cCwgcHJldkNvbXBvbmVudEluc3RhbmNlKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIE92ZXJyaWRkZW4gaW4gc2hhbGxvdyByZW5kZXJpbmcuXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIF9yZXBsYWNlTm9kZVdpdGhNYXJrdXA6IGZ1bmN0aW9uIChvbGRIb3N0Tm9kZSwgbmV4dE1hcmt1cCwgcHJldkluc3RhbmNlKSB7XG4gICAgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5yZXBsYWNlTm9kZVdpdGhNYXJrdXAob2xkSG9zdE5vZGUsIG5leHRNYXJrdXAsIHByZXZJbnN0YW5jZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnRXaXRob3V0T3duZXJPckNvbnRleHQ6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaW5zdCA9IHRoaXMuX2luc3RhbmNlO1xuICAgIHZhciByZW5kZXJlZEVsZW1lbnQ7XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHJlbmRlcmVkRWxlbWVudCA9IG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGluc3QucmVuZGVyKCk7XG4gICAgICB9LCB0aGlzLl9kZWJ1Z0lELCAncmVuZGVyJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlbmRlcmVkRWxlbWVudCA9IGluc3QucmVuZGVyKCk7XG4gICAgfVxuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAvLyBXZSBhbGxvdyBhdXRvLW1vY2tzIHRvIHByb2NlZWQgYXMgaWYgdGhleSdyZSByZXR1cm5pbmcgbnVsbC5cbiAgICAgIGlmIChyZW5kZXJlZEVsZW1lbnQgPT09IHVuZGVmaW5lZCAmJiBpbnN0LnJlbmRlci5faXNNb2NrRnVuY3Rpb24pIHtcbiAgICAgICAgLy8gVGhpcyBpcyBwcm9iYWJseSBiYWQgcHJhY3RpY2UuIENvbnNpZGVyIHdhcm5pbmcgaGVyZSBhbmRcbiAgICAgICAgLy8gZGVwcmVjYXRpbmcgdGhpcyBjb252ZW5pZW5jZS5cbiAgICAgICAgcmVuZGVyZWRFbGVtZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVuZGVyZWRFbGVtZW50O1xuICB9LFxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudDogZnVuY3Rpb24gKCkge1xuICAgIHZhciByZW5kZXJlZEVsZW1lbnQ7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nIHx8IHRoaXMuX2NvbXBvc2l0ZVR5cGUgIT09IENvbXBvc2l0ZVR5cGVzLlN0YXRlbGVzc0Z1bmN0aW9uYWwpIHtcbiAgICAgIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPSB0aGlzO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVuZGVyZWRFbGVtZW50ID0gdGhpcy5fcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50V2l0aG91dE93bmVyT3JDb250ZXh0KCk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVuZGVyZWRFbGVtZW50ID0gdGhpcy5fcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50V2l0aG91dE93bmVyT3JDb250ZXh0KCk7XG4gICAgfVxuICAgICEoXG4gICAgLy8gVE9ETzogQW4gYGlzVmFsaWROb2RlYCBmdW5jdGlvbiB3b3VsZCBwcm9iYWJseSBiZSBtb3JlIGFwcHJvcHJpYXRlXG4gICAgcmVuZGVyZWRFbGVtZW50ID09PSBudWxsIHx8IHJlbmRlcmVkRWxlbWVudCA9PT0gZmFsc2UgfHwgUmVhY3QuaXNWYWxpZEVsZW1lbnQocmVuZGVyZWRFbGVtZW50KSkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzLnJlbmRlcigpOiBBIHZhbGlkIFJlYWN0IGVsZW1lbnQgKG9yIG51bGwpIG11c3QgYmUgcmV0dXJuZWQuIFlvdSBtYXkgaGF2ZSByZXR1cm5lZCB1bmRlZmluZWQsIGFuIGFycmF5IG9yIHNvbWUgb3RoZXIgaW52YWxpZCBvYmplY3QuJywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMTA5JywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7XG5cbiAgICByZXR1cm4gcmVuZGVyZWRFbGVtZW50O1xuICB9LFxuXG4gIC8qKlxuICAgKiBMYXppbHkgYWxsb2NhdGVzIHRoZSByZWZzIG9iamVjdCBhbmQgc3RvcmVzIGBjb21wb25lbnRgIGFzIGByZWZgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmIFJlZmVyZW5jZSBuYW1lLlxuICAgKiBAcGFyYW0ge2NvbXBvbmVudH0gY29tcG9uZW50IENvbXBvbmVudCB0byBzdG9yZSBhcyBgcmVmYC5cbiAgICogQGZpbmFsXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBhdHRhY2hSZWY6IGZ1bmN0aW9uIChyZWYsIGNvbXBvbmVudCkge1xuICAgIHZhciBpbnN0ID0gdGhpcy5nZXRQdWJsaWNJbnN0YW5jZSgpO1xuICAgICEoaW5zdCAhPSBudWxsKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnU3RhdGVsZXNzIGZ1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IGhhdmUgcmVmcy4nKSA6IF9wcm9kSW52YXJpYW50KCcxMTAnKSA6IHZvaWQgMDtcbiAgICB2YXIgcHVibGljQ29tcG9uZW50SW5zdGFuY2UgPSBjb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKTtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gY29tcG9uZW50ICYmIGNvbXBvbmVudC5nZXROYW1lID8gY29tcG9uZW50LmdldE5hbWUoKSA6ICdhIGNvbXBvbmVudCc7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcocHVibGljQ29tcG9uZW50SW5zdGFuY2UgIT0gbnVsbCB8fCBjb21wb25lbnQuX2NvbXBvc2l0ZVR5cGUgIT09IENvbXBvc2l0ZVR5cGVzLlN0YXRlbGVzc0Z1bmN0aW9uYWwsICdTdGF0ZWxlc3MgZnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgYmUgZ2l2ZW4gcmVmcyAnICsgJyhTZWUgcmVmIFwiJXNcIiBpbiAlcyBjcmVhdGVkIGJ5ICVzKS4gJyArICdBdHRlbXB0cyB0byBhY2Nlc3MgdGhpcyByZWYgd2lsbCBmYWlsLicsIHJlZiwgY29tcG9uZW50TmFtZSwgdGhpcy5nZXROYW1lKCkpIDogdm9pZCAwO1xuICAgIH1cbiAgICB2YXIgcmVmcyA9IGluc3QucmVmcyA9PT0gZW1wdHlPYmplY3QgPyBpbnN0LnJlZnMgPSB7fSA6IGluc3QucmVmcztcbiAgICByZWZzW3JlZl0gPSBwdWJsaWNDb21wb25lbnRJbnN0YW5jZTtcbiAgfSxcblxuICAvKipcbiAgICogRGV0YWNoZXMgYSByZWZlcmVuY2UgbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZiBOYW1lIHRvIGRlcmVmZXJlbmNlLlxuICAgKiBAZmluYWxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRldGFjaFJlZjogZnVuY3Rpb24gKHJlZikge1xuICAgIHZhciByZWZzID0gdGhpcy5nZXRQdWJsaWNJbnN0YW5jZSgpLnJlZnM7XG4gICAgZGVsZXRlIHJlZnNbcmVmXTtcbiAgfSxcblxuICAvKipcbiAgICogR2V0IGEgdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgY29tcG9uZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgaXRcbiAgICogaW4gZXJyb3IgbWVzc2FnZXMuXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG5hbWUgb3IgbnVsbC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXROYW1lOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHR5cGUgPSB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IHRoaXMuX2luc3RhbmNlICYmIHRoaXMuX2luc3RhbmNlLmNvbnN0cnVjdG9yO1xuICAgIHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IGNvbnN0cnVjdG9yICYmIGNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBjb25zdHJ1Y3RvciAmJiBjb25zdHJ1Y3Rvci5uYW1lIHx8IG51bGw7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcHVibGljbHkgYWNjZXNzaWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbXBvbmVudCAtIGkuZS4gd2hhdFxuICAgKiBpcyBleHBvc2VkIGJ5IHJlZnMgYW5kIHJldHVybmVkIGJ5IHJlbmRlci4gQ2FuIGJlIG51bGwgZm9yIHN0YXRlbGVzc1xuICAgKiBjb21wb25lbnRzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtSZWFjdENvbXBvbmVudH0gdGhlIHB1YmxpYyBjb21wb25lbnQgaW5zdGFuY2UuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0UHVibGljSW5zdGFuY2U6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaW5zdCA9IHRoaXMuX2luc3RhbmNlO1xuICAgIGlmICh0aGlzLl9jb21wb3NpdGVUeXBlID09PSBDb21wb3NpdGVUeXBlcy5TdGF0ZWxlc3NGdW5jdGlvbmFsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGluc3Q7XG4gIH0sXG5cbiAgLy8gU3R1YlxuICBfaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudDogbnVsbFxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4vKiBnbG9iYWxzIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3REZWZhdWx0SW5qZWN0aW9uID0gcmVxdWlyZSgnLi9SZWFjdERlZmF1bHRJbmplY3Rpb24nKTtcbnZhciBSZWFjdE1vdW50ID0gcmVxdWlyZSgnLi9SZWFjdE1vdW50Jyk7XG52YXIgUmVhY3RSZWNvbmNpbGVyID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZXInKTtcbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xudmFyIFJlYWN0VmVyc2lvbiA9IHJlcXVpcmUoJy4vUmVhY3RWZXJzaW9uJyk7XG5cbnZhciBmaW5kRE9NTm9kZSA9IHJlcXVpcmUoJy4vZmluZERPTU5vZGUnKTtcbnZhciBnZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZSA9IHJlcXVpcmUoJy4vZ2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGUnKTtcbnZhciByZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lciA9IHJlcXVpcmUoJy4vcmVuZGVyU3VidHJlZUludG9Db250YWluZXInKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG5SZWFjdERlZmF1bHRJbmplY3Rpb24uaW5qZWN0KCk7XG5cbnZhciBSZWFjdERPTSA9IHtcbiAgZmluZERPTU5vZGU6IGZpbmRET01Ob2RlLFxuICByZW5kZXI6IFJlYWN0TW91bnQucmVuZGVyLFxuICB1bm1vdW50Q29tcG9uZW50QXROb2RlOiBSZWFjdE1vdW50LnVubW91bnRDb21wb25lbnRBdE5vZGUsXG4gIHZlcnNpb246IFJlYWN0VmVyc2lvbixcblxuICAvKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbiAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXM6IFJlYWN0VXBkYXRlcy5iYXRjaGVkVXBkYXRlcyxcbiAgdW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXI6IHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyXG59O1xuXG4vLyBJbmplY3QgdGhlIHJ1bnRpbWUgaW50byBhIGRldnRvb2xzIGdsb2JhbCBob29rIHJlZ2FyZGxlc3Mgb2YgYnJvd3Nlci5cbi8vIEFsbG93cyBmb3IgZGVidWdnaW5nIHdoZW4gdGhlIGhvb2sgaXMgaW5qZWN0ZWQgb24gdGhlIHBhZ2UuXG5pZiAodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5pbmplY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmluamVjdCh7XG4gICAgQ29tcG9uZW50VHJlZToge1xuICAgICAgZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGU6IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSxcbiAgICAgIGdldE5vZGVGcm9tSW5zdGFuY2U6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgICAgIC8vIGluc3QgaXMgYW4gaW50ZXJuYWwgaW5zdGFuY2UgKGJ1dCBjb3VsZCBiZSBhIGNvbXBvc2l0ZSlcbiAgICAgICAgaWYgKGluc3QuX3JlbmRlcmVkQ29tcG9uZW50KSB7XG4gICAgICAgICAgaW5zdCA9IGdldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlKGluc3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbnN0KSB7XG4gICAgICAgICAgcmV0dXJuIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBNb3VudDogUmVhY3RNb3VudCxcbiAgICBSZWNvbmNpbGVyOiBSZWFjdFJlY29uY2lsZXJcbiAgfSk7XG59XG5cbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xuICBpZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmIHdpbmRvdy50b3AgPT09IHdpbmRvdy5zZWxmKSB7XG5cbiAgICAvLyBGaXJzdCBjaGVjayBpZiBkZXZ0b29scyBpcyBub3QgaW5zdGFsbGVkXG4gICAgaWYgKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBJZiB3ZSdyZSBpbiBDaHJvbWUgb3IgRmlyZWZveCwgcHJvdmlkZSBhIGRvd25sb2FkIGxpbmsgaWYgbm90IGluc3RhbGxlZC5cbiAgICAgIGlmIChuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0Nocm9tZScpID4gLTEgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdFZGdlJykgPT09IC0xIHx8IG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveCcpID4gLTEpIHtcbiAgICAgICAgLy8gRmlyZWZveCBkb2VzIG5vdCBoYXZlIHRoZSBpc3N1ZSB3aXRoIGRldnRvb2xzIGxvYWRlZCBvdmVyIGZpbGU6Ly9cbiAgICAgICAgdmFyIHNob3dGaWxlVXJsTWVzc2FnZSA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbC5pbmRleE9mKCdodHRwJykgPT09IC0xICYmIG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveCcpID09PSAtMTtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnRG93bmxvYWQgdGhlIFJlYWN0IERldlRvb2xzICcgKyAoc2hvd0ZpbGVVcmxNZXNzYWdlID8gJ2FuZCB1c2UgYW4gSFRUUCBzZXJ2ZXIgKGluc3RlYWQgb2YgYSBmaWxlOiBVUkwpICcgOiAnJykgKyAnZm9yIGEgYmV0dGVyIGRldmVsb3BtZW50IGV4cGVyaWVuY2U6ICcgKyAnaHR0cHM6Ly9mYi5tZS9yZWFjdC1kZXZ0b29scycpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB0ZXN0RnVuYyA9IGZ1bmN0aW9uIHRlc3RGbigpIHt9O1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZygodGVzdEZ1bmMubmFtZSB8fCB0ZXN0RnVuYy50b1N0cmluZygpKS5pbmRleE9mKCd0ZXN0Rm4nKSAhPT0gLTEsICdJdCBsb29rcyBsaWtlIHlvdVxcJ3JlIHVzaW5nIGEgbWluaWZpZWQgY29weSBvZiB0aGUgZGV2ZWxvcG1lbnQgYnVpbGQgJyArICdvZiBSZWFjdC4gV2hlbiBkZXBsb3lpbmcgUmVhY3QgYXBwcyB0byBwcm9kdWN0aW9uLCBtYWtlIHN1cmUgdG8gdXNlICcgKyAndGhlIHByb2R1Y3Rpb24gYnVpbGQgd2hpY2ggc2tpcHMgZGV2ZWxvcG1lbnQgd2FybmluZ3MgYW5kIGlzIGZhc3Rlci4gJyArICdTZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC1taW5pZmljYXRpb24gZm9yIG1vcmUgZGV0YWlscy4nKSA6IHZvaWQgMDtcblxuICAgIC8vIElmIHdlJ3JlIGluIElFOCwgY2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBpbiBjb21wYXRpYmlsaXR5IG1vZGUgYW5kIHByb3ZpZGVcbiAgICAvLyBpbmZvcm1hdGlvbiBvbiBwcmV2ZW50aW5nIGNvbXBhdGliaWxpdHkgbW9kZVxuICAgIHZhciBpZUNvbXBhdGliaWxpdHlNb2RlID0gZG9jdW1lbnQuZG9jdW1lbnRNb2RlICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA8IDg7XG5cbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWllQ29tcGF0aWJpbGl0eU1vZGUsICdJbnRlcm5ldCBFeHBsb3JlciBpcyBydW5uaW5nIGluIGNvbXBhdGliaWxpdHkgbW9kZTsgcGxlYXNlIGFkZCB0aGUgJyArICdmb2xsb3dpbmcgdGFnIHRvIHlvdXIgSFRNTCB0byBwcmV2ZW50IHRoaXMgZnJvbSBoYXBwZW5pbmc6ICcgKyAnPG1ldGEgaHR0cC1lcXVpdj1cIlgtVUEtQ29tcGF0aWJsZVwiIGNvbnRlbnQ9XCJJRT1lZGdlXCIgLz4nKSA6IHZvaWQgMDtcblxuICAgIHZhciBleHBlY3RlZEZlYXR1cmVzID0gW1xuICAgIC8vIHNoaW1zXG4gICAgQXJyYXkuaXNBcnJheSwgQXJyYXkucHJvdG90eXBlLmV2ZXJ5LCBBcnJheS5wcm90b3R5cGUuZm9yRWFjaCwgQXJyYXkucHJvdG90eXBlLmluZGV4T2YsIEFycmF5LnByb3RvdHlwZS5tYXAsIERhdGUubm93LCBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCwgT2JqZWN0LmtleXMsIFN0cmluZy5wcm90b3R5cGUudHJpbV07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cGVjdGVkRmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghZXhwZWN0ZWRGZWF0dXJlc1tpXSkge1xuICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdPbmUgb3IgbW9yZSBFUzUgc2hpbXMgZXhwZWN0ZWQgYnkgUmVhY3QgYXJlIG5vdCBhdmFpbGFibGU6ICcgKyAnaHR0cHM6Ly9mYi5tZS9yZWFjdC13YXJuaW5nLXBvbHlmaWxscycpIDogdm9pZCAwO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcbiAgdmFyIFJlYWN0RE9NVW5rbm93blByb3BlcnR5SG9vayA9IHJlcXVpcmUoJy4vUmVhY3RET01Vbmtub3duUHJvcGVydHlIb29rJyk7XG4gIHZhciBSZWFjdERPTU51bGxJbnB1dFZhbHVlUHJvcEhvb2sgPSByZXF1aXJlKCcuL1JlYWN0RE9NTnVsbElucHV0VmFsdWVQcm9wSG9vaycpO1xuICB2YXIgUmVhY3RET01JbnZhbGlkQVJJQUhvb2sgPSByZXF1aXJlKCcuL1JlYWN0RE9NSW52YWxpZEFSSUFIb29rJyk7XG5cbiAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLmFkZEhvb2soUmVhY3RET01Vbmtub3duUHJvcGVydHlIb29rKTtcbiAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLmFkZEhvb2soUmVhY3RET01OdWxsSW5wdXRWYWx1ZVByb3BIb29rKTtcbiAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLmFkZEhvb2soUmVhY3RET01JbnZhbGlkQVJJQUhvb2spO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4vKiBnbG9iYWwgaGFzT3duUHJvcGVydHk6dHJ1ZSAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50JyksXG4gICAgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIEF1dG9Gb2N1c1V0aWxzID0gcmVxdWlyZSgnLi9BdXRvRm9jdXNVdGlscycpO1xudmFyIENTU1Byb3BlcnR5T3BlcmF0aW9ucyA9IHJlcXVpcmUoJy4vQ1NTUHJvcGVydHlPcGVyYXRpb25zJyk7XG52YXIgRE9NTGF6eVRyZWUgPSByZXF1aXJlKCcuL0RPTUxhenlUcmVlJyk7XG52YXIgRE9NTmFtZXNwYWNlcyA9IHJlcXVpcmUoJy4vRE9NTmFtZXNwYWNlcycpO1xudmFyIERPTVByb3BlcnR5ID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eScpO1xudmFyIERPTVByb3BlcnR5T3BlcmF0aW9ucyA9IHJlcXVpcmUoJy4vRE9NUHJvcGVydHlPcGVyYXRpb25zJyk7XG52YXIgRXZlbnRQbHVnaW5IdWIgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luSHViJyk7XG52YXIgRXZlbnRQbHVnaW5SZWdpc3RyeSA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5SZWdpc3RyeScpO1xudmFyIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJy4vUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRGbGFncyA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRGbGFncycpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RET01JbnB1dCA9IHJlcXVpcmUoJy4vUmVhY3RET01JbnB1dCcpO1xudmFyIFJlYWN0RE9NT3B0aW9uID0gcmVxdWlyZSgnLi9SZWFjdERPTU9wdGlvbicpO1xudmFyIFJlYWN0RE9NU2VsZWN0ID0gcmVxdWlyZSgnLi9SZWFjdERPTVNlbGVjdCcpO1xudmFyIFJlYWN0RE9NVGV4dGFyZWEgPSByZXF1aXJlKCcuL1JlYWN0RE9NVGV4dGFyZWEnKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcbnZhciBSZWFjdE11bHRpQ2hpbGQgPSByZXF1aXJlKCcuL1JlYWN0TXVsdGlDaGlsZCcpO1xudmFyIFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24gPSByZXF1aXJlKCcuL1JlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24nKTtcblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG52YXIgZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyID0gcmVxdWlyZSgnLi9lc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXInKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciBpc0V2ZW50U3VwcG9ydGVkID0gcmVxdWlyZSgnLi9pc0V2ZW50U3VwcG9ydGVkJyk7XG52YXIgc2hhbGxvd0VxdWFsID0gcmVxdWlyZSgnZmJqcy9saWIvc2hhbGxvd0VxdWFsJyk7XG52YXIgdmFsaWRhdGVET01OZXN0aW5nID0gcmVxdWlyZSgnLi92YWxpZGF0ZURPTU5lc3RpbmcnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgRmxhZ3MgPSBSZWFjdERPTUNvbXBvbmVudEZsYWdzO1xudmFyIGRlbGV0ZUxpc3RlbmVyID0gRXZlbnRQbHVnaW5IdWIuZGVsZXRlTGlzdGVuZXI7XG52YXIgZ2V0Tm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlO1xudmFyIGxpc3RlblRvID0gUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLmxpc3RlblRvO1xudmFyIHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlcztcblxuLy8gRm9yIHF1aWNrbHkgbWF0Y2hpbmcgY2hpbGRyZW4gdHlwZSwgdG8gdGVzdCBpZiBjYW4gYmUgdHJlYXRlZCBhcyBjb250ZW50LlxudmFyIENPTlRFTlRfVFlQRVMgPSB7ICdzdHJpbmcnOiB0cnVlLCAnbnVtYmVyJzogdHJ1ZSB9O1xuXG52YXIgU1RZTEUgPSAnc3R5bGUnO1xudmFyIEhUTUwgPSAnX19odG1sJztcbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAgY2hpbGRyZW46IG51bGwsXG4gIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiBudWxsLFxuICBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmc6IG51bGxcbn07XG5cbi8vIE5vZGUgdHlwZSBmb3IgZG9jdW1lbnQgZnJhZ21lbnRzIChOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpLlxudmFyIERPQ19GUkFHTUVOVF9UWVBFID0gMTE7XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShpbnRlcm5hbEluc3RhbmNlKSB7XG4gIGlmIChpbnRlcm5hbEluc3RhbmNlKSB7XG4gICAgdmFyIG93bmVyID0gaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQuX293bmVyIHx8IG51bGw7XG4gICAgaWYgKG93bmVyKSB7XG4gICAgICB2YXIgbmFtZSA9IG93bmVyLmdldE5hbWUoKTtcbiAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgIHJldHVybiAnIFRoaXMgRE9NIG5vZGUgd2FzIHJlbmRlcmVkIGJ5IGAnICsgbmFtZSArICdgLic7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZnJpZW5kbHlTdHJpbmdpZnkob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIHJldHVybiAnWycgKyBvYmoubWFwKGZyaWVuZGx5U3RyaW5naWZ5KS5qb2luKCcsICcpICsgJ10nO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgcGFpcnMgPSBbXTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICB2YXIga2V5RXNjYXBlZCA9IC9eW2EteiRfXVtcXHckX10qJC9pLnRlc3Qoa2V5KSA/IGtleSA6IEpTT04uc3RyaW5naWZ5KGtleSk7XG4gICAgICAgICAgcGFpcnMucHVzaChrZXlFc2NhcGVkICsgJzogJyArIGZyaWVuZGx5U3RyaW5naWZ5KG9ialtrZXldKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiAneycgKyBwYWlycy5qb2luKCcsICcpICsgJ30nO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmopO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gJ1tmdW5jdGlvbiBvYmplY3RdJztcbiAgfVxuICAvLyBEaWZmZXJzIGZyb20gSlNPTi5zdHJpbmdpZnkgaW4gdGhhdCB1bmRlZmluZWQgYmVjYXVzZSB1bmRlZmluZWQgYW5kIHRoYXRcbiAgLy8gaW5mIGFuZCBuYW4gZG9uJ3QgYmVjb21lIG51bGxcbiAgcmV0dXJuIFN0cmluZyhvYmopO1xufVxuXG52YXIgc3R5bGVNdXRhdGlvbldhcm5pbmcgPSB7fTtcblxuZnVuY3Rpb24gY2hlY2tBbmRXYXJuRm9yTXV0YXRlZFN0eWxlKHN0eWxlMSwgc3R5bGUyLCBjb21wb25lbnQpIHtcbiAgaWYgKHN0eWxlMSA9PSBudWxsIHx8IHN0eWxlMiA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChzaGFsbG93RXF1YWwoc3R5bGUxLCBzdHlsZTIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnQuX3RhZztcbiAgdmFyIG93bmVyID0gY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXI7XG4gIHZhciBvd25lck5hbWU7XG4gIGlmIChvd25lcikge1xuICAgIG93bmVyTmFtZSA9IG93bmVyLmdldE5hbWUoKTtcbiAgfVxuXG4gIHZhciBoYXNoID0gb3duZXJOYW1lICsgJ3wnICsgY29tcG9uZW50TmFtZTtcblxuICBpZiAoc3R5bGVNdXRhdGlvbldhcm5pbmcuaGFzT3duUHJvcGVydHkoaGFzaCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBzdHlsZU11dGF0aW9uV2FybmluZ1toYXNoXSA9IHRydWU7XG5cbiAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYCVzYCB3YXMgcGFzc2VkIGEgc3R5bGUgb2JqZWN0IHRoYXQgaGFzIHByZXZpb3VzbHkgYmVlbiBtdXRhdGVkLiAnICsgJ011dGF0aW5nIGBzdHlsZWAgaXMgZGVwcmVjYXRlZC4gQ29uc2lkZXIgY2xvbmluZyBpdCBiZWZvcmVoYW5kLiBDaGVjayAnICsgJ3RoZSBgcmVuZGVyYCAlcy4gUHJldmlvdXMgc3R5bGU6ICVzLiBNdXRhdGVkIHN0eWxlOiAlcy4nLCBjb21wb25lbnROYW1lLCBvd25lciA/ICdvZiBgJyArIG93bmVyTmFtZSArICdgJyA6ICd1c2luZyA8JyArIGNvbXBvbmVudE5hbWUgKyAnPicsIGZyaWVuZGx5U3RyaW5naWZ5KHN0eWxlMSksIGZyaWVuZGx5U3RyaW5naWZ5KHN0eWxlMikpIDogdm9pZCAwO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb21wb25lbnRcbiAqIEBwYXJhbSB7P29iamVjdH0gcHJvcHNcbiAqL1xuZnVuY3Rpb24gYXNzZXJ0VmFsaWRQcm9wcyhjb21wb25lbnQsIHByb3BzKSB7XG4gIGlmICghcHJvcHMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gTm90ZSB0aGUgdXNlIG9mIGA9PWAgd2hpY2ggY2hlY2tzIGZvciBudWxsIG9yIHVuZGVmaW5lZC5cbiAgaWYgKHZvaWRFbGVtZW50VGFnc1tjb21wb25lbnQuX3RhZ10pIHtcbiAgICAhKHByb3BzLmNoaWxkcmVuID09IG51bGwgJiYgcHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwgPT0gbnVsbCkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzIGlzIGEgdm9pZCBlbGVtZW50IHRhZyBhbmQgbXVzdCBuZWl0aGVyIGhhdmUgYGNoaWxkcmVuYCBub3IgdXNlIGBkYW5nZXJvdXNseVNldElubmVySFRNTGAuJXMnLCBjb21wb25lbnQuX3RhZywgY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXIgPyAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICcgKyBjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50Ll9vd25lci5nZXROYW1lKCkgKyAnLicgOiAnJykgOiBfcHJvZEludmFyaWFudCgnMTM3JywgY29tcG9uZW50Ll90YWcsIGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQuX293bmVyID8gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiAnICsgY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXIuZ2V0TmFtZSgpICsgJy4nIDogJycpIDogdm9pZCAwO1xuICB9XG4gIGlmIChwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAhPSBudWxsKSB7XG4gICAgIShwcm9wcy5jaGlsZHJlbiA9PSBudWxsKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnQ2FuIG9ubHkgc2V0IG9uZSBvZiBgY2hpbGRyZW5gIG9yIGBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAuJykgOiBfcHJvZEludmFyaWFudCgnNjAnKSA6IHZvaWQgMDtcbiAgICAhKHR5cGVvZiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PT0gJ29iamVjdCcgJiYgSFRNTCBpbiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2Bwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTGAgbXVzdCBiZSBpbiB0aGUgZm9ybSBge19faHRtbDogLi4ufWAuIFBsZWFzZSB2aXNpdCBodHRwczovL2ZiLm1lL3JlYWN0LWludmFyaWFudC1kYW5nZXJvdXNseS1zZXQtaW5uZXItaHRtbCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKSA6IF9wcm9kSW52YXJpYW50KCc2MScpIDogdm9pZCAwO1xuICB9XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhwcm9wcy5pbm5lckhUTUwgPT0gbnVsbCwgJ0RpcmVjdGx5IHNldHRpbmcgcHJvcGVydHkgYGlubmVySFRNTGAgaXMgbm90IHBlcm1pdHRlZC4gJyArICdGb3IgbW9yZSBpbmZvcm1hdGlvbiwgbG9va3VwIGRvY3VtZW50YXRpb24gb24gYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKSA6IHZvaWQgMDtcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcocHJvcHMuc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIHx8ICFwcm9wcy5jb250ZW50RWRpdGFibGUgfHwgcHJvcHMuY2hpbGRyZW4gPT0gbnVsbCwgJ0EgY29tcG9uZW50IGlzIGBjb250ZW50RWRpdGFibGVgIGFuZCBjb250YWlucyBgY2hpbGRyZW5gIG1hbmFnZWQgYnkgJyArICdSZWFjdC4gSXQgaXMgbm93IHlvdXIgcmVzcG9uc2liaWxpdHkgdG8gZ3VhcmFudGVlIHRoYXQgbm9uZSBvZiAnICsgJ3Rob3NlIG5vZGVzIGFyZSB1bmV4cGVjdGVkbHkgbW9kaWZpZWQgb3IgZHVwbGljYXRlZC4gVGhpcyBpcyAnICsgJ3Byb2JhYmx5IG5vdCBpbnRlbnRpb25hbC4nKSA6IHZvaWQgMDtcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcocHJvcHMub25Gb2N1c0luID09IG51bGwgJiYgcHJvcHMub25Gb2N1c091dCA9PSBudWxsLCAnUmVhY3QgdXNlcyBvbkZvY3VzIGFuZCBvbkJsdXIgaW5zdGVhZCBvZiBvbkZvY3VzSW4gYW5kIG9uRm9jdXNPdXQuICcgKyAnQWxsIFJlYWN0IGV2ZW50cyBhcmUgbm9ybWFsaXplZCB0byBidWJibGUsIHNvIG9uRm9jdXNJbiBhbmQgb25Gb2N1c091dCAnICsgJ2FyZSBub3QgbmVlZGVkL3N1cHBvcnRlZCBieSBSZWFjdC4nKSA6IHZvaWQgMDtcbiAgfVxuICAhKHByb3BzLnN0eWxlID09IG51bGwgfHwgdHlwZW9mIHByb3BzLnN0eWxlID09PSAnb2JqZWN0JykgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1RoZSBgc3R5bGVgIHByb3AgZXhwZWN0cyBhIG1hcHBpbmcgZnJvbSBzdHlsZSBwcm9wZXJ0aWVzIHRvIHZhbHVlcywgbm90IGEgc3RyaW5nLiBGb3IgZXhhbXBsZSwgc3R5bGU9e3ttYXJnaW5SaWdodDogc3BhY2luZyArIFxcJ2VtXFwnfX0gd2hlbiB1c2luZyBKU1guJXMnLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oY29tcG9uZW50KSkgOiBfcHJvZEludmFyaWFudCgnNjInLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oY29tcG9uZW50KSkgOiB2b2lkIDA7XG59XG5cbmZ1bmN0aW9uIGVucXVldWVQdXRMaXN0ZW5lcihpbnN0LCByZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lciwgdHJhbnNhY3Rpb24pIHtcbiAgaWYgKHRyYW5zYWN0aW9uIGluc3RhbmNlb2YgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyBJRTggaGFzIG5vIEFQSSBmb3IgZXZlbnQgY2FwdHVyaW5nIGFuZCB0aGUgYG9uU2Nyb2xsYCBldmVudCBkb2Vzbid0XG4gICAgLy8gYnViYmxlLlxuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhyZWdpc3RyYXRpb25OYW1lICE9PSAnb25TY3JvbGwnIHx8IGlzRXZlbnRTdXBwb3J0ZWQoJ3Njcm9sbCcsIHRydWUpLCAnVGhpcyBicm93c2VyIGRvZXNuXFwndCBzdXBwb3J0IHRoZSBgb25TY3JvbGxgIGV2ZW50JykgOiB2b2lkIDA7XG4gIH1cbiAgdmFyIGNvbnRhaW5lckluZm8gPSBpbnN0Ll9ob3N0Q29udGFpbmVySW5mbztcbiAgdmFyIGlzRG9jdW1lbnRGcmFnbWVudCA9IGNvbnRhaW5lckluZm8uX25vZGUgJiYgY29udGFpbmVySW5mby5fbm9kZS5ub2RlVHlwZSA9PT0gRE9DX0ZSQUdNRU5UX1RZUEU7XG4gIHZhciBkb2MgPSBpc0RvY3VtZW50RnJhZ21lbnQgPyBjb250YWluZXJJbmZvLl9ub2RlIDogY29udGFpbmVySW5mby5fb3duZXJEb2N1bWVudDtcbiAgbGlzdGVuVG8ocmVnaXN0cmF0aW9uTmFtZSwgZG9jKTtcbiAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShwdXRMaXN0ZW5lciwge1xuICAgIGluc3Q6IGluc3QsXG4gICAgcmVnaXN0cmF0aW9uTmFtZTogcmVnaXN0cmF0aW9uTmFtZSxcbiAgICBsaXN0ZW5lcjogbGlzdGVuZXJcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHB1dExpc3RlbmVyKCkge1xuICB2YXIgbGlzdGVuZXJUb1B1dCA9IHRoaXM7XG4gIEV2ZW50UGx1Z2luSHViLnB1dExpc3RlbmVyKGxpc3RlbmVyVG9QdXQuaW5zdCwgbGlzdGVuZXJUb1B1dC5yZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lclRvUHV0Lmxpc3RlbmVyKTtcbn1cblxuZnVuY3Rpb24gaW5wdXRQb3N0TW91bnQoKSB7XG4gIHZhciBpbnN0ID0gdGhpcztcbiAgUmVhY3RET01JbnB1dC5wb3N0TW91bnRXcmFwcGVyKGluc3QpO1xufVxuXG5mdW5jdGlvbiB0ZXh0YXJlYVBvc3RNb3VudCgpIHtcbiAgdmFyIGluc3QgPSB0aGlzO1xuICBSZWFjdERPTVRleHRhcmVhLnBvc3RNb3VudFdyYXBwZXIoaW5zdCk7XG59XG5cbmZ1bmN0aW9uIG9wdGlvblBvc3RNb3VudCgpIHtcbiAgdmFyIGluc3QgPSB0aGlzO1xuICBSZWFjdERPTU9wdGlvbi5wb3N0TW91bnRXcmFwcGVyKGluc3QpO1xufVxuXG52YXIgc2V0QW5kVmFsaWRhdGVDb250ZW50Q2hpbGREZXYgPSBlbXB0eUZ1bmN0aW9uO1xuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2ID0gZnVuY3Rpb24gKGNvbnRlbnQpIHtcbiAgICB2YXIgaGFzRXhpc3RpbmdDb250ZW50ID0gdGhpcy5fY29udGVudERlYnVnSUQgIT0gbnVsbDtcbiAgICB2YXIgZGVidWdJRCA9IHRoaXMuX2RlYnVnSUQ7XG4gICAgLy8gVGhpcyBJRCByZXByZXNlbnRzIHRoZSBpbmxpbmVkIGNoaWxkIHRoYXQgaGFzIG5vIGJhY2tpbmcgaW5zdGFuY2U6XG4gICAgdmFyIGNvbnRlbnREZWJ1Z0lEID0gLWRlYnVnSUQ7XG5cbiAgICBpZiAoY29udGVudCA9PSBudWxsKSB7XG4gICAgICBpZiAoaGFzRXhpc3RpbmdDb250ZW50KSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVubW91bnRDb21wb25lbnQodGhpcy5fY29udGVudERlYnVnSUQpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY29udGVudERlYnVnSUQgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCBTdHJpbmcoY29udGVudCksIHRoaXMsIHRoaXMuX2FuY2VzdG9ySW5mbyk7XG4gICAgdGhpcy5fY29udGVudERlYnVnSUQgPSBjb250ZW50RGVidWdJRDtcbiAgICBpZiAoaGFzRXhpc3RpbmdDb250ZW50KSB7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWZvcmVVcGRhdGVDb21wb25lbnQoY29udGVudERlYnVnSUQsIGNvbnRlbnQpO1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uVXBkYXRlQ29tcG9uZW50KGNvbnRlbnREZWJ1Z0lEKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVmb3JlTW91bnRDb21wb25lbnQoY29udGVudERlYnVnSUQsIGNvbnRlbnQsIGRlYnVnSUQpO1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uTW91bnRDb21wb25lbnQoY29udGVudERlYnVnSUQpO1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4oZGVidWdJRCwgW2NvbnRlbnREZWJ1Z0lEXSk7XG4gICAgfVxuICB9O1xufVxuXG4vLyBUaGVyZSBhcmUgc28gbWFueSBtZWRpYSBldmVudHMsIGl0IG1ha2VzIHNlbnNlIHRvIGp1c3Rcbi8vIG1haW50YWluIGEgbGlzdCByYXRoZXIgdGhhbiBjcmVhdGUgYSBgdHJhcEJ1YmJsZWRFdmVudGAgZm9yIGVhY2hcbnZhciBtZWRpYUV2ZW50cyA9IHtcbiAgdG9wQWJvcnQ6ICdhYm9ydCcsXG4gIHRvcENhblBsYXk6ICdjYW5wbGF5JyxcbiAgdG9wQ2FuUGxheVRocm91Z2g6ICdjYW5wbGF5dGhyb3VnaCcsXG4gIHRvcER1cmF0aW9uQ2hhbmdlOiAnZHVyYXRpb25jaGFuZ2UnLFxuICB0b3BFbXB0aWVkOiAnZW1wdGllZCcsXG4gIHRvcEVuY3J5cHRlZDogJ2VuY3J5cHRlZCcsXG4gIHRvcEVuZGVkOiAnZW5kZWQnLFxuICB0b3BFcnJvcjogJ2Vycm9yJyxcbiAgdG9wTG9hZGVkRGF0YTogJ2xvYWRlZGRhdGEnLFxuICB0b3BMb2FkZWRNZXRhZGF0YTogJ2xvYWRlZG1ldGFkYXRhJyxcbiAgdG9wTG9hZFN0YXJ0OiAnbG9hZHN0YXJ0JyxcbiAgdG9wUGF1c2U6ICdwYXVzZScsXG4gIHRvcFBsYXk6ICdwbGF5JyxcbiAgdG9wUGxheWluZzogJ3BsYXlpbmcnLFxuICB0b3BQcm9ncmVzczogJ3Byb2dyZXNzJyxcbiAgdG9wUmF0ZUNoYW5nZTogJ3JhdGVjaGFuZ2UnLFxuICB0b3BTZWVrZWQ6ICdzZWVrZWQnLFxuICB0b3BTZWVraW5nOiAnc2Vla2luZycsXG4gIHRvcFN0YWxsZWQ6ICdzdGFsbGVkJyxcbiAgdG9wU3VzcGVuZDogJ3N1c3BlbmQnLFxuICB0b3BUaW1lVXBkYXRlOiAndGltZXVwZGF0ZScsXG4gIHRvcFZvbHVtZUNoYW5nZTogJ3ZvbHVtZWNoYW5nZScsXG4gIHRvcFdhaXRpbmc6ICd3YWl0aW5nJ1xufTtcblxuZnVuY3Rpb24gdHJhcEJ1YmJsZWRFdmVudHNMb2NhbCgpIHtcbiAgdmFyIGluc3QgPSB0aGlzO1xuICAvLyBJZiBhIGNvbXBvbmVudCByZW5kZXJzIHRvIG51bGwgb3IgaWYgYW5vdGhlciBjb21wb25lbnQgZmF0YWxzIGFuZCBjYXVzZXNcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSB0cmVlIHRvIGJlIGNvcnJ1cHRlZCwgYG5vZGVgIGhlcmUgY2FuIGJlIG51bGwuXG4gICFpbnN0Ll9yb290Tm9kZUlEID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdNdXN0IGJlIG1vdW50ZWQgdG8gdHJhcCBldmVudHMnKSA6IF9wcm9kSW52YXJpYW50KCc2MycpIDogdm9pZCAwO1xuICB2YXIgbm9kZSA9IGdldE5vZGUoaW5zdCk7XG4gICFub2RlID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd0cmFwQnViYmxlZEV2ZW50KC4uLik6IFJlcXVpcmVzIG5vZGUgdG8gYmUgcmVuZGVyZWQuJykgOiBfcHJvZEludmFyaWFudCgnNjQnKSA6IHZvaWQgMDtcblxuICBzd2l0Y2ggKGluc3QuX3RhZykge1xuICAgIGNhc2UgJ2lmcmFtZSc6XG4gICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMgPSBbUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcExvYWQnLCAnbG9hZCcsIG5vZGUpXTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICBjYXNlICdhdWRpbyc6XG5cbiAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMgPSBbXTtcbiAgICAgIC8vIENyZWF0ZSBsaXN0ZW5lciBmb3IgZWFjaCBtZWRpYSBldmVudFxuICAgICAgZm9yICh2YXIgZXZlbnQgaW4gbWVkaWFFdmVudHMpIHtcbiAgICAgICAgaWYgKG1lZGlhRXZlbnRzLmhhc093blByb3BlcnR5KGV2ZW50KSkge1xuICAgICAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMucHVzaChSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudChldmVudCwgbWVkaWFFdmVudHNbZXZlbnRdLCBub2RlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NvdXJjZSc6XG4gICAgICBpbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzID0gW1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KCd0b3BFcnJvcicsICdlcnJvcicsIG5vZGUpXTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ltZyc6XG4gICAgICBpbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzID0gW1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KCd0b3BFcnJvcicsICdlcnJvcicsIG5vZGUpLCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wTG9hZCcsICdsb2FkJywgbm9kZSldO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZm9ybSc6XG4gICAgICBpbnN0Ll93cmFwcGVyU3RhdGUubGlzdGVuZXJzID0gW1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KCd0b3BSZXNldCcsICdyZXNldCcsIG5vZGUpLCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wU3VibWl0JywgJ3N1Ym1pdCcsIG5vZGUpXTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2lucHV0JzpcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMgPSBbUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcEludmFsaWQnLCAnaW52YWxpZCcsIG5vZGUpXTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBvc3RVcGRhdGVTZWxlY3RXcmFwcGVyKCkge1xuICBSZWFjdERPTVNlbGVjdC5wb3N0VXBkYXRlV3JhcHBlcih0aGlzKTtcbn1cblxuLy8gRm9yIEhUTUwsIGNlcnRhaW4gdGFncyBzaG91bGQgb21pdCB0aGVpciBjbG9zZSB0YWcuIFdlIGtlZXAgYSB3aGl0ZWxpc3QgZm9yXG4vLyB0aG9zZSBzcGVjaWFsLWNhc2UgdGFncy5cblxudmFyIG9taXR0ZWRDbG9zZVRhZ3MgPSB7XG4gICdhcmVhJzogdHJ1ZSxcbiAgJ2Jhc2UnOiB0cnVlLFxuICAnYnInOiB0cnVlLFxuICAnY29sJzogdHJ1ZSxcbiAgJ2VtYmVkJzogdHJ1ZSxcbiAgJ2hyJzogdHJ1ZSxcbiAgJ2ltZyc6IHRydWUsXG4gICdpbnB1dCc6IHRydWUsXG4gICdrZXlnZW4nOiB0cnVlLFxuICAnbGluayc6IHRydWUsXG4gICdtZXRhJzogdHJ1ZSxcbiAgJ3BhcmFtJzogdHJ1ZSxcbiAgJ3NvdXJjZSc6IHRydWUsXG4gICd0cmFjayc6IHRydWUsXG4gICd3YnInOiB0cnVlXG59O1xuXG52YXIgbmV3bGluZUVhdGluZ1RhZ3MgPSB7XG4gICdsaXN0aW5nJzogdHJ1ZSxcbiAgJ3ByZSc6IHRydWUsXG4gICd0ZXh0YXJlYSc6IHRydWVcbn07XG5cbi8vIEZvciBIVE1MLCBjZXJ0YWluIHRhZ3MgY2Fubm90IGhhdmUgY2hpbGRyZW4uIFRoaXMgaGFzIHRoZSBzYW1lIHB1cnBvc2UgYXNcbi8vIGBvbWl0dGVkQ2xvc2VUYWdzYCBleGNlcHQgdGhhdCBgbWVudWl0ZW1gIHNob3VsZCBzdGlsbCBoYXZlIGl0cyBjbG9zaW5nIHRhZy5cblxudmFyIHZvaWRFbGVtZW50VGFncyA9IF9hc3NpZ24oe1xuICAnbWVudWl0ZW0nOiB0cnVlXG59LCBvbWl0dGVkQ2xvc2VUYWdzKTtcblxuLy8gV2UgYWNjZXB0IGFueSB0YWcgdG8gYmUgcmVuZGVyZWQgYnV0IHNpbmNlIHRoaXMgZ2V0cyBpbmplY3RlZCBpbnRvIGFyYml0cmFyeVxuLy8gSFRNTCwgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCBpdCdzIGEgc2FmZSB0YWcuXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sLyNOVC1OYW1lXG5cbnZhciBWQUxJRF9UQUdfUkVHRVggPSAvXlthLXpBLVpdW2EtekEtWjpfXFwuXFwtXFxkXSokLzsgLy8gU2ltcGxpZmllZCBzdWJzZXRcbnZhciB2YWxpZGF0ZWRUYWdDYWNoZSA9IHt9O1xudmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRGFuZ2Vyb3VzVGFnKHRhZykge1xuICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwodmFsaWRhdGVkVGFnQ2FjaGUsIHRhZykpIHtcbiAgICAhVkFMSURfVEFHX1JFR0VYLnRlc3QodGFnKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnSW52YWxpZCB0YWc6ICVzJywgdGFnKSA6IF9wcm9kSW52YXJpYW50KCc2NScsIHRhZykgOiB2b2lkIDA7XG4gICAgdmFsaWRhdGVkVGFnQ2FjaGVbdGFnXSA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDdXN0b21Db21wb25lbnQodGFnTmFtZSwgcHJvcHMpIHtcbiAgcmV0dXJuIHRhZ05hbWUuaW5kZXhPZignLScpID49IDAgfHwgcHJvcHMuaXMgIT0gbnVsbDtcbn1cblxudmFyIGdsb2JhbElkQ291bnRlciA9IDE7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBSZWFjdCBjbGFzcyB0aGF0IGlzIGlkZW1wb3RlbnQgYW5kIGNhcGFibGUgb2YgY29udGFpbmluZyBvdGhlclxuICogUmVhY3QgY29tcG9uZW50cy4gSXQgYWNjZXB0cyBldmVudCBsaXN0ZW5lcnMgYW5kIERPTSBwcm9wZXJ0aWVzIHRoYXQgYXJlXG4gKiB2YWxpZCBhY2NvcmRpbmcgdG8gYERPTVByb3BlcnR5YC5cbiAqXG4gKiAgLSBFdmVudCBsaXN0ZW5lcnM6IGBvbkNsaWNrYCwgYG9uTW91c2VEb3duYCwgZXRjLlxuICogIC0gRE9NIHByb3BlcnRpZXM6IGBjbGFzc05hbWVgLCBgbmFtZWAsIGB0aXRsZWAsIGV0Yy5cbiAqXG4gKiBUaGUgYHN0eWxlYCBwcm9wZXJ0eSBmdW5jdGlvbnMgZGlmZmVyZW50bHkgZnJvbSB0aGUgRE9NIEFQSS4gSXQgYWNjZXB0cyBhblxuICogb2JqZWN0IG1hcHBpbmcgb2Ygc3R5bGUgcHJvcGVydGllcyB0byB2YWx1ZXMuXG4gKlxuICogQGNvbnN0cnVjdG9yIFJlYWN0RE9NQ29tcG9uZW50XG4gKiBAZXh0ZW5kcyBSZWFjdE11bHRpQ2hpbGRcbiAqL1xuZnVuY3Rpb24gUmVhY3RET01Db21wb25lbnQoZWxlbWVudCkge1xuICB2YXIgdGFnID0gZWxlbWVudC50eXBlO1xuICB2YWxpZGF0ZURhbmdlcm91c1RhZyh0YWcpO1xuICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IGVsZW1lbnQ7XG4gIHRoaXMuX3RhZyA9IHRhZy50b0xvd2VyQ2FzZSgpO1xuICB0aGlzLl9uYW1lc3BhY2VVUkkgPSBudWxsO1xuICB0aGlzLl9yZW5kZXJlZENoaWxkcmVuID0gbnVsbDtcbiAgdGhpcy5fcHJldmlvdXNTdHlsZSA9IG51bGw7XG4gIHRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5ID0gbnVsbDtcbiAgdGhpcy5faG9zdE5vZGUgPSBudWxsO1xuICB0aGlzLl9ob3N0UGFyZW50ID0gbnVsbDtcbiAgdGhpcy5fcm9vdE5vZGVJRCA9IDA7XG4gIHRoaXMuX2RvbUlEID0gMDtcbiAgdGhpcy5faG9zdENvbnRhaW5lckluZm8gPSBudWxsO1xuICB0aGlzLl93cmFwcGVyU3RhdGUgPSBudWxsO1xuICB0aGlzLl90b3BMZXZlbFdyYXBwZXIgPSBudWxsO1xuICB0aGlzLl9mbGFncyA9IDA7XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHRoaXMuX2FuY2VzdG9ySW5mbyA9IG51bGw7XG4gICAgc2V0QW5kVmFsaWRhdGVDb250ZW50Q2hpbGREZXYuY2FsbCh0aGlzLCBudWxsKTtcbiAgfVxufVxuXG5SZWFjdERPTUNvbXBvbmVudC5kaXNwbGF5TmFtZSA9ICdSZWFjdERPTUNvbXBvbmVudCc7XG5cblJlYWN0RE9NQ29tcG9uZW50Lk1peGluID0ge1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgcm9vdCB0YWcgbWFya3VwIHRoZW4gcmVjdXJzZXMuIFRoaXMgbWV0aG9kIGhhcyBzaWRlIGVmZmVjdHMgYW5kXG4gICAqIGlzIG5vdCBpZGVtcG90ZW50LlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7P1JlYWN0RE9NQ29tcG9uZW50fSB0aGUgcGFyZW50IGNvbXBvbmVudCBpbnN0YW5jZVxuICAgKiBAcGFyYW0gez9vYmplY3R9IGluZm8gYWJvdXQgdGhlIGhvc3QgY29udGFpbmVyXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0XG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbXB1dGVkIG1hcmt1cC5cbiAgICovXG4gIG1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0KSB7XG4gICAgdGhpcy5fcm9vdE5vZGVJRCA9IGdsb2JhbElkQ291bnRlcisrO1xuICAgIHRoaXMuX2RvbUlEID0gaG9zdENvbnRhaW5lckluZm8uX2lkQ291bnRlcisrO1xuICAgIHRoaXMuX2hvc3RQYXJlbnQgPSBob3N0UGFyZW50O1xuICAgIHRoaXMuX2hvc3RDb250YWluZXJJbmZvID0gaG9zdENvbnRhaW5lckluZm87XG5cbiAgICB2YXIgcHJvcHMgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztcblxuICAgIHN3aXRjaCAodGhpcy5fdGFnKSB7XG4gICAgICBjYXNlICdhdWRpbyc6XG4gICAgICBjYXNlICdmb3JtJzpcbiAgICAgIGNhc2UgJ2lmcmFtZSc6XG4gICAgICBjYXNlICdpbWcnOlxuICAgICAgY2FzZSAnbGluayc6XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgY2FzZSAnc291cmNlJzpcbiAgICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICAgICAgdGhpcy5fd3JhcHBlclN0YXRlID0ge1xuICAgICAgICAgIGxpc3RlbmVyczogbnVsbFxuICAgICAgICB9O1xuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHRyYXBCdWJibGVkRXZlbnRzTG9jYWwsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgICAgUmVhY3RET01JbnB1dC5tb3VudFdyYXBwZXIodGhpcywgcHJvcHMsIGhvc3RQYXJlbnQpO1xuICAgICAgICBwcm9wcyA9IFJlYWN0RE9NSW5wdXQuZ2V0SG9zdFByb3BzKHRoaXMsIHByb3BzKTtcbiAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZSh0cmFwQnViYmxlZEV2ZW50c0xvY2FsLCB0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdvcHRpb24nOlxuICAgICAgICBSZWFjdERPTU9wdGlvbi5tb3VudFdyYXBwZXIodGhpcywgcHJvcHMsIGhvc3RQYXJlbnQpO1xuICAgICAgICBwcm9wcyA9IFJlYWN0RE9NT3B0aW9uLmdldEhvc3RQcm9wcyh0aGlzLCBwcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgUmVhY3RET01TZWxlY3QubW91bnRXcmFwcGVyKHRoaXMsIHByb3BzLCBob3N0UGFyZW50KTtcbiAgICAgICAgcHJvcHMgPSBSZWFjdERPTVNlbGVjdC5nZXRIb3N0UHJvcHModGhpcywgcHJvcHMpO1xuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHRyYXBCdWJibGVkRXZlbnRzTG9jYWwsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgICAgUmVhY3RET01UZXh0YXJlYS5tb3VudFdyYXBwZXIodGhpcywgcHJvcHMsIGhvc3RQYXJlbnQpO1xuICAgICAgICBwcm9wcyA9IFJlYWN0RE9NVGV4dGFyZWEuZ2V0SG9zdFByb3BzKHRoaXMsIHByb3BzKTtcbiAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZSh0cmFwQnViYmxlZEV2ZW50c0xvY2FsLCB0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgYXNzZXJ0VmFsaWRQcm9wcyh0aGlzLCBwcm9wcyk7XG5cbiAgICAvLyBXZSBjcmVhdGUgdGFncyBpbiB0aGUgbmFtZXNwYWNlIG9mIHRoZWlyIHBhcmVudCBjb250YWluZXIsIGV4Y2VwdCBIVE1MXG4gICAgLy8gdGFncyBnZXQgbm8gbmFtZXNwYWNlLlxuICAgIHZhciBuYW1lc3BhY2VVUkk7XG4gICAgdmFyIHBhcmVudFRhZztcbiAgICBpZiAoaG9zdFBhcmVudCAhPSBudWxsKSB7XG4gICAgICBuYW1lc3BhY2VVUkkgPSBob3N0UGFyZW50Ll9uYW1lc3BhY2VVUkk7XG4gICAgICBwYXJlbnRUYWcgPSBob3N0UGFyZW50Ll90YWc7XG4gICAgfSBlbHNlIGlmIChob3N0Q29udGFpbmVySW5mby5fdGFnKSB7XG4gICAgICBuYW1lc3BhY2VVUkkgPSBob3N0Q29udGFpbmVySW5mby5fbmFtZXNwYWNlVVJJO1xuICAgICAgcGFyZW50VGFnID0gaG9zdENvbnRhaW5lckluZm8uX3RhZztcbiAgICB9XG4gICAgaWYgKG5hbWVzcGFjZVVSSSA9PSBudWxsIHx8IG5hbWVzcGFjZVVSSSA9PT0gRE9NTmFtZXNwYWNlcy5zdmcgJiYgcGFyZW50VGFnID09PSAnZm9yZWlnbm9iamVjdCcpIHtcbiAgICAgIG5hbWVzcGFjZVVSSSA9IERPTU5hbWVzcGFjZXMuaHRtbDtcbiAgICB9XG4gICAgaWYgKG5hbWVzcGFjZVVSSSA9PT0gRE9NTmFtZXNwYWNlcy5odG1sKSB7XG4gICAgICBpZiAodGhpcy5fdGFnID09PSAnc3ZnJykge1xuICAgICAgICBuYW1lc3BhY2VVUkkgPSBET01OYW1lc3BhY2VzLnN2ZztcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fdGFnID09PSAnbWF0aCcpIHtcbiAgICAgICAgbmFtZXNwYWNlVVJJID0gRE9NTmFtZXNwYWNlcy5tYXRobWw7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX25hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTtcblxuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHBhcmVudEluZm87XG4gICAgICBpZiAoaG9zdFBhcmVudCAhPSBudWxsKSB7XG4gICAgICAgIHBhcmVudEluZm8gPSBob3N0UGFyZW50Ll9hbmNlc3RvckluZm87XG4gICAgICB9IGVsc2UgaWYgKGhvc3RDb250YWluZXJJbmZvLl90YWcpIHtcbiAgICAgICAgcGFyZW50SW5mbyA9IGhvc3RDb250YWluZXJJbmZvLl9hbmNlc3RvckluZm87XG4gICAgICB9XG4gICAgICBpZiAocGFyZW50SW5mbykge1xuICAgICAgICAvLyBwYXJlbnRJbmZvIHNob3VsZCBhbHdheXMgYmUgcHJlc2VudCBleGNlcHQgZm9yIHRoZSB0b3AtbGV2ZWxcbiAgICAgICAgLy8gY29tcG9uZW50IHdoZW4gc2VydmVyIHJlbmRlcmluZ1xuICAgICAgICB2YWxpZGF0ZURPTU5lc3RpbmcodGhpcy5fdGFnLCBudWxsLCB0aGlzLCBwYXJlbnRJbmZvKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2FuY2VzdG9ySW5mbyA9IHZhbGlkYXRlRE9NTmVzdGluZy51cGRhdGVkQW5jZXN0b3JJbmZvKHBhcmVudEluZm8sIHRoaXMuX3RhZywgdGhpcyk7XG4gICAgfVxuXG4gICAgdmFyIG1vdW50SW1hZ2U7XG4gICAgaWYgKHRyYW5zYWN0aW9uLnVzZUNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lckRvY3VtZW50ID0gaG9zdENvbnRhaW5lckluZm8uX293bmVyRG9jdW1lbnQ7XG4gICAgICB2YXIgZWw7XG4gICAgICBpZiAobmFtZXNwYWNlVVJJID09PSBET01OYW1lc3BhY2VzLmh0bWwpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RhZyA9PT0gJ3NjcmlwdCcpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgdGhlIHNjcmlwdCB2aWEgLmlubmVySFRNTCBzbyBpdHMgXCJwYXJzZXItaW5zZXJ0ZWRcIiBmbGFnIGlzXG4gICAgICAgICAgLy8gc2V0IHRvIHRydWUgYW5kIGl0IGRvZXMgbm90IGV4ZWN1dGVcbiAgICAgICAgICB2YXIgZGl2ID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICB2YXIgdHlwZSA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG4gICAgICAgICAgZGl2LmlubmVySFRNTCA9ICc8JyArIHR5cGUgKyAnPjwvJyArIHR5cGUgKyAnPic7XG4gICAgICAgICAgZWwgPSBkaXYucmVtb3ZlQ2hpbGQoZGl2LmZpcnN0Q2hpbGQpO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3BzLmlzKSB7XG4gICAgICAgICAgZWwgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSwgcHJvcHMuaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNlcGFyYXRlIGVsc2UgYnJhbmNoIGluc3RlYWQgb2YgdXNpbmcgYHByb3BzLmlzIHx8IHVuZGVmaW5lZGAgYWJvdmUgYmVjdWFzZSBvZiBhIEZpcmVmb3ggYnVnLlxuICAgICAgICAgIC8vIFNlZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzY4OTZcbiAgICAgICAgICAvLyBhbmQgZGlzY3Vzc2lvbiBpbiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMjc2MjQwXG4gICAgICAgICAgZWwgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsID0gb3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlKTtcbiAgICAgIH1cbiAgICAgIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5wcmVjYWNoZU5vZGUodGhpcywgZWwpO1xuICAgICAgdGhpcy5fZmxhZ3MgfD0gRmxhZ3MuaGFzQ2FjaGVkQ2hpbGROb2RlcztcbiAgICAgIGlmICghdGhpcy5faG9zdFBhcmVudCkge1xuICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuc2V0QXR0cmlidXRlRm9yUm9vdChlbCk7XG4gICAgICB9XG4gICAgICB0aGlzLl91cGRhdGVET01Qcm9wZXJ0aWVzKG51bGwsIHByb3BzLCB0cmFuc2FjdGlvbik7XG4gICAgICB2YXIgbGF6eVRyZWUgPSBET01MYXp5VHJlZShlbCk7XG4gICAgICB0aGlzLl9jcmVhdGVJbml0aWFsQ2hpbGRyZW4odHJhbnNhY3Rpb24sIHByb3BzLCBjb250ZXh0LCBsYXp5VHJlZSk7XG4gICAgICBtb3VudEltYWdlID0gbGF6eVRyZWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB0YWdPcGVuID0gdGhpcy5fY3JlYXRlT3BlblRhZ01hcmt1cEFuZFB1dExpc3RlbmVycyh0cmFuc2FjdGlvbiwgcHJvcHMpO1xuICAgICAgdmFyIHRhZ0NvbnRlbnQgPSB0aGlzLl9jcmVhdGVDb250ZW50TWFya3VwKHRyYW5zYWN0aW9uLCBwcm9wcywgY29udGV4dCk7XG4gICAgICBpZiAoIXRhZ0NvbnRlbnQgJiYgb21pdHRlZENsb3NlVGFnc1t0aGlzLl90YWddKSB7XG4gICAgICAgIG1vdW50SW1hZ2UgPSB0YWdPcGVuICsgJy8+JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1vdW50SW1hZ2UgPSB0YWdPcGVuICsgJz4nICsgdGFnQ29udGVudCArICc8LycgKyB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlICsgJz4nO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy5fdGFnKSB7XG4gICAgICBjYXNlICdpbnB1dCc6XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoaW5wdXRQb3N0TW91bnQsIHRoaXMpO1xuICAgICAgICBpZiAocHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShBdXRvRm9jdXNVdGlscy5mb2N1c0RPTUNvbXBvbmVudCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodGV4dGFyZWFQb3N0TW91bnQsIHRoaXMpO1xuICAgICAgICBpZiAocHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShBdXRvRm9jdXNVdGlscy5mb2N1c0RPTUNvbXBvbmVudCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICBpZiAocHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShBdXRvRm9jdXNVdGlscy5mb2N1c0RPTUNvbXBvbmVudCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICBpZiAocHJvcHMuYXV0b0ZvY3VzKSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShBdXRvRm9jdXNVdGlscy5mb2N1c0RPTUNvbXBvbmVudCwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdvcHRpb24nOlxuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKG9wdGlvblBvc3RNb3VudCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiBtb3VudEltYWdlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG1hcmt1cCBmb3IgdGhlIG9wZW4gdGFnIGFuZCBhbGwgYXR0cmlidXRlcy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaGFzIHNpZGUgZWZmZWN0cyBiZWNhdXNlIGV2ZW50cyBnZXQgcmVnaXN0ZXJlZC5cbiAgICpcbiAgICogSXRlcmF0aW5nIG92ZXIgb2JqZWN0IHByb3BlcnRpZXMgaXMgZmFzdGVyIHRoYW4gaXRlcmF0aW5nIG92ZXIgYXJyYXlzLlxuICAgKiBAc2VlIGh0dHA6Ly9qc3BlcmYuY29tL29iai12cy1hcnItaXRlcmF0aW9uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAgICogQHJldHVybiB7c3RyaW5nfSBNYXJrdXAgb2Ygb3BlbmluZyB0YWcuXG4gICAqL1xuICBfY3JlYXRlT3BlblRhZ01hcmt1cEFuZFB1dExpc3RlbmVyczogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBwcm9wcykge1xuICAgIHZhciByZXQgPSAnPCcgKyB0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO1xuXG4gICAgZm9yICh2YXIgcHJvcEtleSBpbiBwcm9wcykge1xuICAgICAgaWYgKCFwcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wS2V5XTtcbiAgICAgIGlmIChwcm9wVmFsdWUgPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWdpc3RyYXRpb25OYW1lTW9kdWxlcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgICBpZiAocHJvcFZhbHVlKSB7XG4gICAgICAgICAgZW5xdWV1ZVB1dExpc3RlbmVyKHRoaXMsIHByb3BLZXksIHByb3BWYWx1ZSwgdHJhbnNhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgICAgICBpZiAocHJvcFZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgLy8gU2VlIGBfdXBkYXRlRE9NUHJvcGVydGllc2AuIHN0eWxlIGJsb2NrXG4gICAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzU3R5bGUgPSBwcm9wVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcm9wVmFsdWUgPSB0aGlzLl9wcmV2aW91c1N0eWxlQ29weSA9IF9hc3NpZ24oe30sIHByb3BzLnN0eWxlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcHJvcFZhbHVlID0gQ1NTUHJvcGVydHlPcGVyYXRpb25zLmNyZWF0ZU1hcmt1cEZvclN0eWxlcyhwcm9wVmFsdWUsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtYXJrdXAgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5fdGFnICE9IG51bGwgJiYgaXNDdXN0b21Db21wb25lbnQodGhpcy5fdGFnLCBwcm9wcykpIHtcbiAgICAgICAgICBpZiAoIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAgICAgICBtYXJrdXAgPSBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuY3JlYXRlTWFya3VwRm9yQ3VzdG9tQXR0cmlidXRlKHByb3BLZXksIHByb3BWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hcmt1cCA9IERPTVByb3BlcnR5T3BlcmF0aW9ucy5jcmVhdGVNYXJrdXBGb3JQcm9wZXJ0eShwcm9wS2V5LCBwcm9wVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXJrdXApIHtcbiAgICAgICAgICByZXQgKz0gJyAnICsgbWFya3VwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9yIHN0YXRpYyBwYWdlcywgbm8gbmVlZCB0byBwdXQgUmVhY3QgSUQgYW5kIGNoZWNrc3VtLiBTYXZlcyBsb3RzIG9mXG4gICAgLy8gYnl0ZXMuXG4gICAgaWYgKHRyYW5zYWN0aW9uLnJlbmRlclRvU3RhdGljTWFya3VwKSB7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIGlmICghdGhpcy5faG9zdFBhcmVudCkge1xuICAgICAgcmV0ICs9ICcgJyArIERPTVByb3BlcnR5T3BlcmF0aW9ucy5jcmVhdGVNYXJrdXBGb3JSb290KCk7XG4gICAgfVxuICAgIHJldCArPSAnICcgKyBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuY3JlYXRlTWFya3VwRm9ySUQodGhpcy5fZG9tSUQpO1xuICAgIHJldHVybiByZXQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbWFya3VwIGZvciB0aGUgY29udGVudCBiZXR3ZWVuIHRoZSB0YWdzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb258UmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtvYmplY3R9IHByb3BzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0XG4gICAqIEByZXR1cm4ge3N0cmluZ30gQ29udGVudCBtYXJrdXAuXG4gICAqL1xuICBfY3JlYXRlQ29udGVudE1hcmt1cDogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBwcm9wcywgY29udGV4dCkge1xuICAgIHZhciByZXQgPSAnJztcblxuICAgIC8vIEludGVudGlvbmFsIHVzZSBvZiAhPSB0byBhdm9pZCBjYXRjaGluZyB6ZXJvL2ZhbHNlLlxuICAgIHZhciBpbm5lckhUTUwgPSBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTDtcbiAgICBpZiAoaW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICAgIGlmIChpbm5lckhUTUwuX19odG1sICE9IG51bGwpIHtcbiAgICAgICAgcmV0ID0gaW5uZXJIVE1MLl9faHRtbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNvbnRlbnRUb1VzZSA9IENPTlRFTlRfVFlQRVNbdHlwZW9mIHByb3BzLmNoaWxkcmVuXSA/IHByb3BzLmNoaWxkcmVuIDogbnVsbDtcbiAgICAgIHZhciBjaGlsZHJlblRvVXNlID0gY29udGVudFRvVXNlICE9IG51bGwgPyBudWxsIDogcHJvcHMuY2hpbGRyZW47XG4gICAgICBpZiAoY29udGVudFRvVXNlICE9IG51bGwpIHtcbiAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgdGhhdCB0ZXh0IGlzIGFsbG93ZWQgYXMgYSBjaGlsZCBvZiB0aGlzIG5vZGVcbiAgICAgICAgcmV0ID0gZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyKGNvbnRlbnRUb1VzZSk7XG4gICAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2LmNhbGwodGhpcywgY29udGVudFRvVXNlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjaGlsZHJlblRvVXNlICE9IG51bGwpIHtcbiAgICAgICAgdmFyIG1vdW50SW1hZ2VzID0gdGhpcy5tb3VudENoaWxkcmVuKGNoaWxkcmVuVG9Vc2UsIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICAgICAgcmV0ID0gbW91bnRJbWFnZXMuam9pbignJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChuZXdsaW5lRWF0aW5nVGFnc1t0aGlzLl90YWddICYmIHJldC5jaGFyQXQoMCkgPT09ICdcXG4nKSB7XG4gICAgICAvLyB0ZXh0L2h0bWwgaWdub3JlcyB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZXNlIHRhZ3MgaWYgaXQncyBhIG5ld2xpbmVcbiAgICAgIC8vIFByZWZlciB0byBicmVhayBhcHBsaWNhdGlvbi94bWwgb3ZlciB0ZXh0L2h0bWwgKGZvciBub3cpIGJ5IGFkZGluZ1xuICAgICAgLy8gYSBuZXdsaW5lIHNwZWNpZmljYWxseSB0byBnZXQgZWF0ZW4gYnkgdGhlIHBhcnNlci4gKEFsdGVybmF0ZWx5IGZvclxuICAgICAgLy8gdGV4dGFyZWFzLCByZXBsYWNpbmcgXCJeXFxuXCIgd2l0aCBcIlxcclxcblwiIGRvZXNuJ3QgZ2V0IGVhdGVuLCBhbmQgdGhlIGZpcnN0XG4gICAgICAvLyBcXHIgaXMgbm9ybWFsaXplZCBvdXQgYnkgSFRNTFRleHRBcmVhRWxlbWVudCN2YWx1ZS4pXG4gICAgICAvLyBTZWU6IDxodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sLXBvbHlnbG90LyNuZXdsaW5lcy1pbi10ZXh0YXJlYS1hbmQtcHJlPlxuICAgICAgLy8gU2VlOiA8aHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvc3ludGF4Lmh0bWwjZWxlbWVudC1yZXN0cmljdGlvbnM+XG4gICAgICAvLyBTZWU6IDxodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zeW50YXguaHRtbCNuZXdsaW5lcz5cbiAgICAgIC8vIFNlZTogUGFyc2luZyBvZiBcInRleHRhcmVhXCIgXCJsaXN0aW5nXCIgYW5kIFwicHJlXCIgZWxlbWVudHNcbiAgICAgIC8vICBmcm9tIDxodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5ib2R5PlxuICAgICAgcmV0dXJuICdcXG4nICsgcmV0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgfSxcblxuICBfY3JlYXRlSW5pdGlhbENoaWxkcmVuOiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIHByb3BzLCBjb250ZXh0LCBsYXp5VHJlZSkge1xuICAgIC8vIEludGVudGlvbmFsIHVzZSBvZiAhPSB0byBhdm9pZCBjYXRjaGluZyB6ZXJvL2ZhbHNlLlxuICAgIHZhciBpbm5lckhUTUwgPSBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTDtcbiAgICBpZiAoaW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICAgIGlmIChpbm5lckhUTUwuX19odG1sICE9IG51bGwpIHtcbiAgICAgICAgRE9NTGF6eVRyZWUucXVldWVIVE1MKGxhenlUcmVlLCBpbm5lckhUTUwuX19odG1sKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNvbnRlbnRUb1VzZSA9IENPTlRFTlRfVFlQRVNbdHlwZW9mIHByb3BzLmNoaWxkcmVuXSA/IHByb3BzLmNoaWxkcmVuIDogbnVsbDtcbiAgICAgIHZhciBjaGlsZHJlblRvVXNlID0gY29udGVudFRvVXNlICE9IG51bGwgPyBudWxsIDogcHJvcHMuY2hpbGRyZW47XG4gICAgICAvLyBUT0RPOiBWYWxpZGF0ZSB0aGF0IHRleHQgaXMgYWxsb3dlZCBhcyBhIGNoaWxkIG9mIHRoaXMgbm9kZVxuICAgICAgaWYgKGNvbnRlbnRUb1VzZSAhPSBudWxsKSB7XG4gICAgICAgIC8vIEF2b2lkIHNldHRpbmcgdGV4dENvbnRlbnQgd2hlbiB0aGUgdGV4dCBpcyBlbXB0eS4gSW4gSUUxMSBzZXR0aW5nXG4gICAgICAgIC8vIHRleHRDb250ZW50IG9uIGEgdGV4dCBhcmVhIHdpbGwgY2F1c2UgdGhlIHBsYWNlaG9sZGVyIHRvIG5vdFxuICAgICAgICAvLyBzaG93IHdpdGhpbiB0aGUgdGV4dGFyZWEgdW50aWwgaXQgaGFzIGJlZW4gZm9jdXNlZCBhbmQgYmx1cnJlZCBhZ2Fpbi5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy82NzMxI2lzc3VlY29tbWVudC0yNTQ4NzQ1NTNcbiAgICAgICAgaWYgKGNvbnRlbnRUb1VzZSAhPT0gJycpIHtcbiAgICAgICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2LmNhbGwodGhpcywgY29udGVudFRvVXNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgRE9NTGF6eVRyZWUucXVldWVUZXh0KGxhenlUcmVlLCBjb250ZW50VG9Vc2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuVG9Vc2UgIT0gbnVsbCkge1xuICAgICAgICB2YXIgbW91bnRJbWFnZXMgPSB0aGlzLm1vdW50Q2hpbGRyZW4oY2hpbGRyZW5Ub1VzZSwgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vdW50SW1hZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgRE9NTGF6eVRyZWUucXVldWVDaGlsZChsYXp5VHJlZSwgbW91bnRJbWFnZXNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZWNlaXZlcyBhIG5leHQgZWxlbWVudCBhbmQgdXBkYXRlcyB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IG5leHRFbGVtZW50XG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dFxuICAgKi9cbiAgcmVjZWl2ZUNvbXBvbmVudDogZnVuY3Rpb24gKG5leHRFbGVtZW50LCB0cmFuc2FjdGlvbiwgY29udGV4dCkge1xuICAgIHZhciBwcmV2RWxlbWVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50O1xuICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dEVsZW1lbnQ7XG4gICAgdGhpcy51cGRhdGVDb21wb25lbnQodHJhbnNhY3Rpb24sIHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCwgY29udGV4dCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgYSBET00gY29tcG9uZW50IGFmdGVyIGl0IGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGFuZFxuICAgKiBhdHRhY2hlZCB0byB0aGUgRE9NLiBSZWNvbmNpbGVzIHRoZSByb290IERPTSBub2RlLCB0aGVuIHJlY3Vyc2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBwcmV2RWxlbWVudFxuICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dEVsZW1lbnRcbiAgICogQGludGVybmFsXG4gICAqIEBvdmVycmlkYWJsZVxuICAgKi9cbiAgdXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCwgY29udGV4dCkge1xuICAgIHZhciBsYXN0UHJvcHMgPSBwcmV2RWxlbWVudC5wcm9wcztcbiAgICB2YXIgbmV4dFByb3BzID0gdGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7XG5cbiAgICBzd2l0Y2ggKHRoaXMuX3RhZykge1xuICAgICAgY2FzZSAnaW5wdXQnOlxuICAgICAgICBsYXN0UHJvcHMgPSBSZWFjdERPTUlucHV0LmdldEhvc3RQcm9wcyh0aGlzLCBsYXN0UHJvcHMpO1xuICAgICAgICBuZXh0UHJvcHMgPSBSZWFjdERPTUlucHV0LmdldEhvc3RQcm9wcyh0aGlzLCBuZXh0UHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAgIGxhc3RQcm9wcyA9IFJlYWN0RE9NT3B0aW9uLmdldEhvc3RQcm9wcyh0aGlzLCBsYXN0UHJvcHMpO1xuICAgICAgICBuZXh0UHJvcHMgPSBSZWFjdERPTU9wdGlvbi5nZXRIb3N0UHJvcHModGhpcywgbmV4dFByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICBsYXN0UHJvcHMgPSBSZWFjdERPTVNlbGVjdC5nZXRIb3N0UHJvcHModGhpcywgbGFzdFByb3BzKTtcbiAgICAgICAgbmV4dFByb3BzID0gUmVhY3RET01TZWxlY3QuZ2V0SG9zdFByb3BzKHRoaXMsIG5leHRQcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgICBsYXN0UHJvcHMgPSBSZWFjdERPTVRleHRhcmVhLmdldEhvc3RQcm9wcyh0aGlzLCBsYXN0UHJvcHMpO1xuICAgICAgICBuZXh0UHJvcHMgPSBSZWFjdERPTVRleHRhcmVhLmdldEhvc3RQcm9wcyh0aGlzLCBuZXh0UHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBhc3NlcnRWYWxpZFByb3BzKHRoaXMsIG5leHRQcm9wcyk7XG4gICAgdGhpcy5fdXBkYXRlRE9NUHJvcGVydGllcyhsYXN0UHJvcHMsIG5leHRQcm9wcywgdHJhbnNhY3Rpb24pO1xuICAgIHRoaXMuX3VwZGF0ZURPTUNoaWxkcmVuKGxhc3RQcm9wcywgbmV4dFByb3BzLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG5cbiAgICBzd2l0Y2ggKHRoaXMuX3RhZykge1xuICAgICAgY2FzZSAnaW5wdXQnOlxuICAgICAgICAvLyBVcGRhdGUgdGhlIHdyYXBwZXIgYXJvdW5kIGlucHV0cyAqYWZ0ZXIqIHVwZGF0aW5nIHByb3BzLiBUaGlzIGhhcyB0b1xuICAgICAgICAvLyBoYXBwZW4gYWZ0ZXIgYF91cGRhdGVET01Qcm9wZXJ0aWVzYC4gT3RoZXJ3aXNlIEhUTUw1IGlucHV0IHZhbGlkYXRpb25zXG4gICAgICAgIC8vIHJhaXNlIHdhcm5pbmdzIGFuZCBwcmV2ZW50IHRoZSBuZXcgdmFsdWUgZnJvbSBiZWluZyBhc3NpZ25lZC5cbiAgICAgICAgUmVhY3RET01JbnB1dC51cGRhdGVXcmFwcGVyKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgICAgUmVhY3RET01UZXh0YXJlYS51cGRhdGVXcmFwcGVyKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIC8vIDxzZWxlY3Q+IHZhbHVlIHVwZGF0ZSBuZWVkcyB0byBvY2N1ciBhZnRlciA8b3B0aW9uPiBjaGlsZHJlblxuICAgICAgICAvLyByZWNvbmNpbGlhdGlvblxuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHBvc3RVcGRhdGVTZWxlY3RXcmFwcGVyLCB0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZWNvbmNpbGVzIHRoZSBwcm9wZXJ0aWVzIGJ5IGRldGVjdGluZyBkaWZmZXJlbmNlcyBpbiBwcm9wZXJ0eSB2YWx1ZXMgYW5kXG4gICAqIHVwZGF0aW5nIHRoZSBET00gYXMgbmVjZXNzYXJ5LiBUaGlzIGZ1bmN0aW9uIGlzIHByb2JhYmx5IHRoZSBzaW5nbGUgbW9zdFxuICAgKiBjcml0aWNhbCBwYXRoIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uXG4gICAqXG4gICAqIFRPRE86IEJlbmNobWFyayB3aGV0aGVyIGNoZWNraW5nIGZvciBjaGFuZ2VkIHZhbHVlcyBpbiBtZW1vcnkgYWN0dWFsbHlcbiAgICogICAgICAgaW1wcm92ZXMgcGVyZm9ybWFuY2UgKGVzcGVjaWFsbHkgc3RhdGljYWxseSBwb3NpdGlvbmVkIGVsZW1lbnRzKS5cbiAgICogVE9ETzogQmVuY2htYXJrIHRoZSBlZmZlY3RzIG9mIHB1dHRpbmcgdGhpcyBhdCB0aGUgdG9wIHNpbmNlIDk5JSBvZiBwcm9wc1xuICAgKiAgICAgICBkbyBub3QgY2hhbmdlIGZvciBhIGdpdmVuIHJlY29uY2lsaWF0aW9uLlxuICAgKiBUT0RPOiBCZW5jaG1hcmsgYXJlYXMgdGhhdCBjYW4gYmUgaW1wcm92ZWQgd2l0aCBjYWNoaW5nLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge29iamVjdH0gbGFzdFByb3BzXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBuZXh0UHJvcHNcbiAgICogQHBhcmFtIHs/RE9NRWxlbWVudH0gbm9kZVxuICAgKi9cbiAgX3VwZGF0ZURPTVByb3BlcnRpZXM6IGZ1bmN0aW9uIChsYXN0UHJvcHMsIG5leHRQcm9wcywgdHJhbnNhY3Rpb24pIHtcbiAgICB2YXIgcHJvcEtleTtcbiAgICB2YXIgc3R5bGVOYW1lO1xuICAgIHZhciBzdHlsZVVwZGF0ZXM7XG4gICAgZm9yIChwcm9wS2V5IGluIGxhc3RQcm9wcykge1xuICAgICAgaWYgKG5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCAhbGFzdFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8IGxhc3RQcm9wc1twcm9wS2V5XSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICAgIHZhciBsYXN0U3R5bGUgPSB0aGlzLl9wcmV2aW91c1N0eWxlQ29weTtcbiAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbGFzdFN0eWxlKSB7XG4gICAgICAgICAgaWYgKGxhc3RTdHlsZS5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSBzdHlsZVVwZGF0ZXMgfHwge307XG4gICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wcmV2aW91c1N0eWxlQ29weSA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAgIGlmIChsYXN0UHJvcHNbcHJvcEtleV0pIHtcbiAgICAgICAgICAvLyBPbmx5IGNhbGwgZGVsZXRlTGlzdGVuZXIgaWYgdGhlcmUgd2FzIGEgbGlzdGVuZXIgcHJldmlvdXNseSBvclxuICAgICAgICAgIC8vIGVsc2Ugd2lsbERlbGV0ZUxpc3RlbmVyIGdldHMgY2FsbGVkIHdoZW4gdGhlcmUgd2Fzbid0IGFjdHVhbGx5IGFcbiAgICAgICAgICAvLyBsaXN0ZW5lciAoZS5nLiwgb25DbGljaz17bnVsbH0pXG4gICAgICAgICAgZGVsZXRlTGlzdGVuZXIodGhpcywgcHJvcEtleSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDdXN0b21Db21wb25lbnQodGhpcy5fdGFnLCBsYXN0UHJvcHMpKSB7XG4gICAgICAgIGlmICghUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuZGVsZXRlVmFsdWVGb3JBdHRyaWJ1dGUoZ2V0Tm9kZSh0aGlzKSwgcHJvcEtleSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoRE9NUHJvcGVydHkucHJvcGVydGllc1twcm9wS2V5XSB8fCBET01Qcm9wZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShwcm9wS2V5KSkge1xuICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eShnZXROb2RlKHRoaXMpLCBwcm9wS2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChwcm9wS2V5IGluIG5leHRQcm9wcykge1xuICAgICAgdmFyIG5leHRQcm9wID0gbmV4dFByb3BzW3Byb3BLZXldO1xuICAgICAgdmFyIGxhc3RQcm9wID0gcHJvcEtleSA9PT0gU1RZTEUgPyB0aGlzLl9wcmV2aW91c1N0eWxlQ29weSA6IGxhc3RQcm9wcyAhPSBudWxsID8gbGFzdFByb3BzW3Byb3BLZXldIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKCFuZXh0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbmV4dFByb3AgPT09IGxhc3RQcm9wIHx8IG5leHRQcm9wID09IG51bGwgJiYgbGFzdFByb3AgPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgICBpZiAobmV4dFByb3ApIHtcbiAgICAgICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIGNoZWNrQW5kV2FybkZvck11dGF0ZWRTdHlsZSh0aGlzLl9wcmV2aW91c1N0eWxlQ29weSwgdGhpcy5fcHJldmlvdXNTdHlsZSwgdGhpcyk7XG4gICAgICAgICAgICB0aGlzLl9wcmV2aW91c1N0eWxlID0gbmV4dFByb3A7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5leHRQcm9wID0gdGhpcy5fcHJldmlvdXNTdHlsZUNvcHkgPSBfYXNzaWduKHt9LCBuZXh0UHJvcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fcHJldmlvdXNTdHlsZUNvcHkgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXN0UHJvcCkge1xuICAgICAgICAgIC8vIFVuc2V0IHN0eWxlcyBvbiBgbGFzdFByb3BgIGJ1dCBub3Qgb24gYG5leHRQcm9wYC5cbiAgICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0UHJvcCkge1xuICAgICAgICAgICAgaWYgKGxhc3RQcm9wLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkgJiYgKCFuZXh0UHJvcCB8fCAhbmV4dFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSkpIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0gc3R5bGVVcGRhdGVzIHx8IHt9O1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgc3R5bGVzIHRoYXQgY2hhbmdlZCBzaW5jZSBgbGFzdFByb3BgLlxuICAgICAgICAgIGZvciAoc3R5bGVOYW1lIGluIG5leHRQcm9wKSB7XG4gICAgICAgICAgICBpZiAobmV4dFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiBsYXN0UHJvcFtzdHlsZU5hbWVdICE9PSBuZXh0UHJvcFtzdHlsZU5hbWVdKSB7XG4gICAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHN0eWxlVXBkYXRlcyB8fCB7fTtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzW3N0eWxlTmFtZV0gPSBuZXh0UHJvcFtzdHlsZU5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBSZWxpZXMgb24gYHVwZGF0ZVN0eWxlc0J5SURgIG5vdCBtdXRhdGluZyBgc3R5bGVVcGRhdGVzYC5cbiAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSBuZXh0UHJvcDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lTW9kdWxlcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgICBpZiAobmV4dFByb3ApIHtcbiAgICAgICAgICBlbnF1ZXVlUHV0TGlzdGVuZXIodGhpcywgcHJvcEtleSwgbmV4dFByb3AsIHRyYW5zYWN0aW9uKTtcbiAgICAgICAgfSBlbHNlIGlmIChsYXN0UHJvcCkge1xuICAgICAgICAgIGRlbGV0ZUxpc3RlbmVyKHRoaXMsIHByb3BLZXkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQ3VzdG9tQ29tcG9uZW50KHRoaXMuX3RhZywgbmV4dFByb3BzKSkge1xuICAgICAgICBpZiAoIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAgICAgRE9NUHJvcGVydHlPcGVyYXRpb25zLnNldFZhbHVlRm9yQXR0cmlidXRlKGdldE5vZGUodGhpcyksIHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzW3Byb3BLZXldIHx8IERPTVByb3BlcnR5LmlzQ3VzdG9tQXR0cmlidXRlKHByb3BLZXkpKSB7XG4gICAgICAgIHZhciBub2RlID0gZ2V0Tm9kZSh0aGlzKTtcbiAgICAgICAgLy8gSWYgd2UncmUgdXBkYXRpbmcgdG8gbnVsbCBvciB1bmRlZmluZWQsIHdlIHNob3VsZCByZW1vdmUgdGhlIHByb3BlcnR5XG4gICAgICAgIC8vIGZyb20gdGhlIERPTSBub2RlIGluc3RlYWQgb2YgaW5hZHZlcnRlbnRseSBzZXR0aW5nIHRvIGEgc3RyaW5nLiBUaGlzXG4gICAgICAgIC8vIGJyaW5ncyB1cyBpbiBsaW5lIHdpdGggdGhlIHNhbWUgYmVoYXZpb3Igd2UgaGF2ZSBvbiBpbml0aWFsIHJlbmRlci5cbiAgICAgICAgaWYgKG5leHRQcm9wICE9IG51bGwpIHtcbiAgICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuc2V0VmFsdWVGb3JQcm9wZXJ0eShub2RlLCBwcm9wS2V5LCBuZXh0UHJvcCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgRE9NUHJvcGVydHlPcGVyYXRpb25zLmRlbGV0ZVZhbHVlRm9yUHJvcGVydHkobm9kZSwgcHJvcEtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0eWxlVXBkYXRlcykge1xuICAgICAgQ1NTUHJvcGVydHlPcGVyYXRpb25zLnNldFZhbHVlRm9yU3R5bGVzKGdldE5vZGUodGhpcyksIHN0eWxlVXBkYXRlcywgdGhpcyk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZWNvbmNpbGVzIHRoZSBjaGlsZHJlbiB3aXRoIHRoZSB2YXJpb3VzIHByb3BlcnRpZXMgdGhhdCBhZmZlY3QgdGhlXG4gICAqIGNoaWxkcmVuIGNvbnRlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBsYXN0UHJvcHNcbiAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9wc1xuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0XG4gICAqL1xuICBfdXBkYXRlRE9NQ2hpbGRyZW46IGZ1bmN0aW9uIChsYXN0UHJvcHMsIG5leHRQcm9wcywgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICB2YXIgbGFzdENvbnRlbnQgPSBDT05URU5UX1RZUEVTW3R5cGVvZiBsYXN0UHJvcHMuY2hpbGRyZW5dID8gbGFzdFByb3BzLmNoaWxkcmVuIDogbnVsbDtcbiAgICB2YXIgbmV4dENvbnRlbnQgPSBDT05URU5UX1RZUEVTW3R5cGVvZiBuZXh0UHJvcHMuY2hpbGRyZW5dID8gbmV4dFByb3BzLmNoaWxkcmVuIDogbnVsbDtcblxuICAgIHZhciBsYXN0SHRtbCA9IGxhc3RQcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAmJiBsYXN0UHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sO1xuICAgIHZhciBuZXh0SHRtbCA9IG5leHRQcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCAmJiBuZXh0UHJvcHMuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sO1xuXG4gICAgLy8gTm90ZSB0aGUgdXNlIG9mIGAhPWAgd2hpY2ggY2hlY2tzIGZvciBudWxsIG9yIHVuZGVmaW5lZC5cbiAgICB2YXIgbGFzdENoaWxkcmVuID0gbGFzdENvbnRlbnQgIT0gbnVsbCA/IG51bGwgOiBsYXN0UHJvcHMuY2hpbGRyZW47XG4gICAgdmFyIG5leHRDaGlsZHJlbiA9IG5leHRDb250ZW50ICE9IG51bGwgPyBudWxsIDogbmV4dFByb3BzLmNoaWxkcmVuO1xuXG4gICAgLy8gSWYgd2UncmUgc3dpdGNoaW5nIGZyb20gY2hpbGRyZW4gdG8gY29udGVudC9odG1sIG9yIHZpY2UgdmVyc2EsIHJlbW92ZVxuICAgIC8vIHRoZSBvbGQgY29udGVudFxuICAgIHZhciBsYXN0SGFzQ29udGVudE9ySHRtbCA9IGxhc3RDb250ZW50ICE9IG51bGwgfHwgbGFzdEh0bWwgIT0gbnVsbDtcbiAgICB2YXIgbmV4dEhhc0NvbnRlbnRPckh0bWwgPSBuZXh0Q29udGVudCAhPSBudWxsIHx8IG5leHRIdG1sICE9IG51bGw7XG4gICAgaWYgKGxhc3RDaGlsZHJlbiAhPSBudWxsICYmIG5leHRDaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKG51bGwsIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICB9IGVsc2UgaWYgKGxhc3RIYXNDb250ZW50T3JIdG1sICYmICFuZXh0SGFzQ29udGVudE9ySHRtbCkge1xuICAgICAgdGhpcy51cGRhdGVUZXh0Q29udGVudCgnJyk7XG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4odGhpcy5fZGVidWdJRCwgW10pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuZXh0Q29udGVudCAhPSBudWxsKSB7XG4gICAgICBpZiAobGFzdENvbnRlbnQgIT09IG5leHRDb250ZW50KSB7XG4gICAgICAgIHRoaXMudXBkYXRlVGV4dENvbnRlbnQoJycgKyBuZXh0Q29udGVudCk7XG4gICAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2LmNhbGwodGhpcywgbmV4dENvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuZXh0SHRtbCAhPSBudWxsKSB7XG4gICAgICBpZiAobGFzdEh0bWwgIT09IG5leHRIdG1sKSB7XG4gICAgICAgIHRoaXMudXBkYXRlTWFya3VwKCcnICsgbmV4dEh0bWwpO1xuICAgICAgfVxuICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblNldENoaWxkcmVuKHRoaXMuX2RlYnVnSUQsIFtdKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5leHRDaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgc2V0QW5kVmFsaWRhdGVDb250ZW50Q2hpbGREZXYuY2FsbCh0aGlzLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVDaGlsZHJlbihuZXh0Q2hpbGRyZW4sIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICB9XG4gIH0sXG5cbiAgZ2V0SG9zdE5vZGU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ2V0Tm9kZSh0aGlzKTtcbiAgfSxcblxuICAvKipcbiAgICogRGVzdHJveXMgYWxsIGV2ZW50IHJlZ2lzdHJhdGlvbnMgZm9yIHRoaXMgaW5zdGFuY2UuIERvZXMgbm90IHJlbW92ZSBmcm9tXG4gICAqIHRoZSBET00uIFRoYXQgbXVzdCBiZSBkb25lIGJ5IHRoZSBwYXJlbnQuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdW5tb3VudENvbXBvbmVudDogZnVuY3Rpb24gKHNhZmVseSkge1xuICAgIHN3aXRjaCAodGhpcy5fdGFnKSB7XG4gICAgICBjYXNlICdhdWRpbyc6XG4gICAgICBjYXNlICdmb3JtJzpcbiAgICAgIGNhc2UgJ2lmcmFtZSc6XG4gICAgICBjYXNlICdpbWcnOlxuICAgICAgY2FzZSAnbGluayc6XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgY2FzZSAnc291cmNlJzpcbiAgICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM7XG4gICAgICAgIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGlzdGVuZXJzW2ldLnJlbW92ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgY2FzZSAnaGVhZCc6XG4gICAgICBjYXNlICdib2R5JzpcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbXBvbmVudHMgbGlrZSA8aHRtbD4gPGhlYWQ+IGFuZCA8Ym9keT4gY2FuJ3QgYmUgcmVtb3ZlZCBvciBhZGRlZFxuICAgICAgICAgKiBlYXNpbHkgaW4gYSBjcm9zcy1icm93c2VyIHdheSwgaG93ZXZlciBpdCdzIHZhbHVhYmxlIHRvIGJlIGFibGUgdG9cbiAgICAgICAgICogdGFrZSBhZHZhbnRhZ2Ugb2YgUmVhY3QncyByZWNvbmNpbGlhdGlvbiBmb3Igc3R5bGluZyBhbmQgPHRpdGxlPlxuICAgICAgICAgKiBtYW5hZ2VtZW50LiBTbyB3ZSBqdXN0IGRvY3VtZW50IGl0IGFuZCB0aHJvdyBpbiBkYW5nZXJvdXMgY2FzZXMuXG4gICAgICAgICAqL1xuICAgICAgICAhZmFsc2UgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJzwlcz4gdHJpZWQgdG8gdW5tb3VudC4gQmVjYXVzZSBvZiBjcm9zcy1icm93c2VyIHF1aXJrcyBpdCBpcyBpbXBvc3NpYmxlIHRvIHVubW91bnQgc29tZSB0b3AtbGV2ZWwgY29tcG9uZW50cyAoZWcgPGh0bWw+LCA8aGVhZD4sIGFuZCA8Ym9keT4pIHJlbGlhYmx5IGFuZCBlZmZpY2llbnRseS4gVG8gZml4IHRoaXMsIGhhdmUgYSBzaW5nbGUgdG9wLWxldmVsIGNvbXBvbmVudCB0aGF0IG5ldmVyIHVubW91bnRzIHJlbmRlciB0aGVzZSBlbGVtZW50cy4nLCB0aGlzLl90YWcpIDogX3Byb2RJbnZhcmlhbnQoJzY2JywgdGhpcy5fdGFnKSA6IHZvaWQgMDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdGhpcy51bm1vdW50Q2hpbGRyZW4oc2FmZWx5KTtcbiAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUudW5jYWNoZU5vZGUodGhpcyk7XG4gICAgRXZlbnRQbHVnaW5IdWIuZGVsZXRlQWxsTGlzdGVuZXJzKHRoaXMpO1xuICAgIHRoaXMuX3Jvb3ROb2RlSUQgPSAwO1xuICAgIHRoaXMuX2RvbUlEID0gMDtcbiAgICB0aGlzLl93cmFwcGVyU3RhdGUgPSBudWxsO1xuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldi5jYWxsKHRoaXMsIG51bGwpO1xuICAgIH1cbiAgfSxcblxuICBnZXRQdWJsaWNJbnN0YW5jZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXROb2RlKHRoaXMpO1xuICB9XG5cbn07XG5cbl9hc3NpZ24oUmVhY3RET01Db21wb25lbnQucHJvdG90eXBlLCBSZWFjdERPTUNvbXBvbmVudC5NaXhpbiwgUmVhY3RNdWx0aUNoaWxkLk1peGluKTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUNvbXBvbmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RET01Db21wb25lbnRGbGFncyA9IHtcbiAgaGFzQ2FjaGVkQ2hpbGROb2RlczogMSA8PCAwXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NQ29tcG9uZW50RmxhZ3M7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIERPTVByb3BlcnR5ID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eScpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50RmxhZ3MgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50RmxhZ3MnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG52YXIgQVRUUl9OQU1FID0gRE9NUHJvcGVydHkuSURfQVRUUklCVVRFX05BTUU7XG52YXIgRmxhZ3MgPSBSZWFjdERPTUNvbXBvbmVudEZsYWdzO1xuXG52YXIgaW50ZXJuYWxJbnN0YW5jZUtleSA9ICdfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSQnICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMik7XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBnaXZlbiBub2RlIHNob3VsZCBiZSBjYWNoZWQuXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFByZWNhY2hlTm9kZShub2RlLCBub2RlSUQpIHtcbiAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKSA9PT0gU3RyaW5nKG5vZGVJRCkgfHwgbm9kZS5ub2RlVHlwZSA9PT0gOCAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gJyByZWFjdC10ZXh0OiAnICsgbm9kZUlEICsgJyAnIHx8IG5vZGUubm9kZVR5cGUgPT09IDggJiYgbm9kZS5ub2RlVmFsdWUgPT09ICcgcmVhY3QtZW1wdHk6ICcgKyBub2RlSUQgKyAnICc7XG59XG5cbi8qKlxuICogRHJpbGwgZG93biAodGhyb3VnaCBjb21wb3NpdGVzIGFuZCBlbXB0eSBjb21wb25lbnRzKSB1bnRpbCB3ZSBnZXQgYSBob3N0IG9yXG4gKiBob3N0IHRleHQgY29tcG9uZW50LlxuICpcbiAqIFRoaXMgaXMgcHJldHR5IHBvbHltb3JwaGljIGJ1dCB1bmF2b2lkYWJsZSB3aXRoIHRoZSBjdXJyZW50IHN0cnVjdHVyZSB3ZSBoYXZlXG4gKiBmb3IgYF9yZW5kZXJlZENoaWxkcmVuYC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmVuZGVyZWRIb3N0T3JUZXh0RnJvbUNvbXBvbmVudChjb21wb25lbnQpIHtcbiAgdmFyIHJlbmRlcmVkO1xuICB3aGlsZSAocmVuZGVyZWQgPSBjb21wb25lbnQuX3JlbmRlcmVkQ29tcG9uZW50KSB7XG4gICAgY29tcG9uZW50ID0gcmVuZGVyZWQ7XG4gIH1cbiAgcmV0dXJuIGNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBQb3B1bGF0ZSBgX2hvc3ROb2RlYCBvbiB0aGUgcmVuZGVyZWQgaG9zdC90ZXh0IGNvbXBvbmVudCB3aXRoIHRoZSBnaXZlblxuICogRE9NIG5vZGUuIFRoZSBwYXNzZWQgYGluc3RgIGNhbiBiZSBhIGNvbXBvc2l0ZS5cbiAqL1xuZnVuY3Rpb24gcHJlY2FjaGVOb2RlKGluc3QsIG5vZGUpIHtcbiAgdmFyIGhvc3RJbnN0ID0gZ2V0UmVuZGVyZWRIb3N0T3JUZXh0RnJvbUNvbXBvbmVudChpbnN0KTtcbiAgaG9zdEluc3QuX2hvc3ROb2RlID0gbm9kZTtcbiAgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSA9IGhvc3RJbnN0O1xufVxuXG5mdW5jdGlvbiB1bmNhY2hlTm9kZShpbnN0KSB7XG4gIHZhciBub2RlID0gaW5zdC5faG9zdE5vZGU7XG4gIGlmIChub2RlKSB7XG4gICAgZGVsZXRlIG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV07XG4gICAgaW5zdC5faG9zdE5vZGUgPSBudWxsO1xuICB9XG59XG5cbi8qKlxuICogUG9wdWxhdGUgYF9ob3N0Tm9kZWAgb24gZWFjaCBjaGlsZCBvZiBgaW5zdGAsIGFzc3VtaW5nIHRoYXQgdGhlIGNoaWxkcmVuXG4gKiBtYXRjaCB1cCB3aXRoIHRoZSBET00gKGVsZW1lbnQpIGNoaWxkcmVuIG9mIGBub2RlYC5cbiAqXG4gKiBXZSBjYWNoZSBlbnRpcmUgbGV2ZWxzIGF0IG9uY2UgdG8gYXZvaWQgYW4gbl4yIHByb2JsZW0gd2hlcmUgd2UgYWNjZXNzIHRoZVxuICogY2hpbGRyZW4gb2YgYSBub2RlIHNlcXVlbnRpYWxseSBhbmQgaGF2ZSB0byB3YWxrIGZyb20gdGhlIHN0YXJ0IHRvIG91ciB0YXJnZXRcbiAqIG5vZGUgZXZlcnkgdGltZS5cbiAqXG4gKiBTaW5jZSB3ZSB1cGRhdGUgYF9yZW5kZXJlZENoaWxkcmVuYCBhbmQgdGhlIGFjdHVhbCBET00gYXQgKHNsaWdodGx5KVxuICogZGlmZmVyZW50IHRpbWVzLCB3ZSBjb3VsZCByYWNlIGhlcmUgYW5kIHNlZSBhIG5ld2VyIGBfcmVuZGVyZWRDaGlsZHJlbmAgdGhhblxuICogdGhlIERPTSBub2RlcyB3ZSBzZWUuIFRvIGF2b2lkIHRoaXMsIFJlYWN0TXVsdGlDaGlsZCBjYWxsc1xuICogYHByZXBhcmVUb01hbmFnZUNoaWxkcmVuYCBiZWZvcmUgd2UgY2hhbmdlIGBfcmVuZGVyZWRDaGlsZHJlbmAsIGF0IHdoaWNoXG4gKiB0aW1lIHRoZSBjb250YWluZXIncyBjaGlsZCBub2RlcyBhcmUgYWx3YXlzIGNhY2hlZCAodW50aWwgaXQgdW5tb3VudHMpLlxuICovXG5mdW5jdGlvbiBwcmVjYWNoZUNoaWxkTm9kZXMoaW5zdCwgbm9kZSkge1xuICBpZiAoaW5zdC5fZmxhZ3MgJiBGbGFncy5oYXNDYWNoZWRDaGlsZE5vZGVzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBjaGlsZHJlbiA9IGluc3QuX3JlbmRlcmVkQ2hpbGRyZW47XG4gIHZhciBjaGlsZE5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gIG91dGVyOiBmb3IgKHZhciBuYW1lIGluIGNoaWxkcmVuKSB7XG4gICAgaWYgKCFjaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHZhciBjaGlsZEluc3QgPSBjaGlsZHJlbltuYW1lXTtcbiAgICB2YXIgY2hpbGRJRCA9IGdldFJlbmRlcmVkSG9zdE9yVGV4dEZyb21Db21wb25lbnQoY2hpbGRJbnN0KS5fZG9tSUQ7XG4gICAgaWYgKGNoaWxkSUQgPT09IDApIHtcbiAgICAgIC8vIFdlJ3JlIGN1cnJlbnRseSB1bm1vdW50aW5nIHRoaXMgY2hpbGQgaW4gUmVhY3RNdWx0aUNoaWxkOyBza2lwIGl0LlxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIFdlIGFzc3VtZSB0aGUgY2hpbGQgbm9kZXMgYXJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBjaGlsZCBpbnN0YW5jZXMuXG4gICAgZm9yICg7IGNoaWxkTm9kZSAhPT0gbnVsbDsgY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICBpZiAoc2hvdWxkUHJlY2FjaGVOb2RlKGNoaWxkTm9kZSwgY2hpbGRJRCkpIHtcbiAgICAgICAgcHJlY2FjaGVOb2RlKGNoaWxkSW5zdCwgY2hpbGROb2RlKTtcbiAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgRE9NIGNoaWxkcmVuIHdpdGhvdXQgZmluZGluZyBhbiBJRCBtYXRjaC5cbiAgICAhZmFsc2UgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1VuYWJsZSB0byBmaW5kIGVsZW1lbnQgd2l0aCBJRCAlcy4nLCBjaGlsZElEKSA6IF9wcm9kSW52YXJpYW50KCczMicsIGNoaWxkSUQpIDogdm9pZCAwO1xuICB9XG4gIGluc3QuX2ZsYWdzIHw9IEZsYWdzLmhhc0NhY2hlZENoaWxkTm9kZXM7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBjbG9zZXN0IFJlYWN0RE9NQ29tcG9uZW50IG9yXG4gKiBSZWFjdERPTVRleHRDb21wb25lbnQgaW5zdGFuY2UgYW5jZXN0b3IuXG4gKi9cbmZ1bmN0aW9uIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHtcbiAgaWYgKG5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV0pIHtcbiAgICByZXR1cm4gbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcbiAgfVxuXG4gIC8vIFdhbGsgdXAgdGhlIHRyZWUgdW50aWwgd2UgZmluZCBhbiBhbmNlc3RvciB3aG9zZSBpbnN0YW5jZSB3ZSBoYXZlIGNhY2hlZC5cbiAgdmFyIHBhcmVudHMgPSBbXTtcbiAgd2hpbGUgKCFub2RlW2ludGVybmFsSW5zdGFuY2VLZXldKSB7XG4gICAgcGFyZW50cy5wdXNoKG5vZGUpO1xuICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRvcCBvZiB0aGUgdHJlZS4gVGhpcyBub2RlIG11c3Qgbm90IGJlIHBhcnQgb2YgYSBSZWFjdCB0cmVlIChvciBpc1xuICAgICAgLy8gdW5tb3VudGVkLCBwb3RlbnRpYWxseSkuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICB2YXIgY2xvc2VzdDtcbiAgdmFyIGluc3Q7XG4gIGZvciAoOyBub2RlICYmIChpbnN0ID0gbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSk7IG5vZGUgPSBwYXJlbnRzLnBvcCgpKSB7XG4gICAgY2xvc2VzdCA9IGluc3Q7XG4gICAgaWYgKHBhcmVudHMubGVuZ3RoKSB7XG4gICAgICBwcmVjYWNoZUNoaWxkTm9kZXMoaW5zdCwgbm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNsb3Nlc3Q7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBET00gbm9kZSwgcmV0dXJuIHRoZSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnRcbiAqIGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBub2RlIHdhcyBub3QgcmVuZGVyZWQgYnkgdGhpcyBSZWFjdC5cbiAqL1xuZnVuY3Rpb24gZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKSB7XG4gIHZhciBpbnN0ID0gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobm9kZSk7XG4gIGlmIChpbnN0ICE9IG51bGwgJiYgaW5zdC5faG9zdE5vZGUgPT09IG5vZGUpIHtcbiAgICByZXR1cm4gaW5zdDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEdpdmVuIGEgUmVhY3RET01Db21wb25lbnQgb3IgUmVhY3RET01UZXh0Q29tcG9uZW50LCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmdcbiAqIERPTSBub2RlLlxuICovXG5mdW5jdGlvbiBnZXROb2RlRnJvbUluc3RhbmNlKGluc3QpIHtcbiAgLy8gV2l0aG91dCB0aGlzIGZpcnN0IGludmFyaWFudCwgcGFzc2luZyBhIG5vbi1ET00tY29tcG9uZW50IHRyaWdnZXJzIHRoZSBuZXh0XG4gIC8vIGludmFyaWFudCBmb3IgYSBtaXNzaW5nIHBhcmVudCwgd2hpY2ggaXMgc3VwZXIgY29uZnVzaW5nLlxuICAhKGluc3QuX2hvc3ROb2RlICE9PSB1bmRlZmluZWQpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdnZXROb2RlRnJvbUluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzMzJykgOiB2b2lkIDA7XG5cbiAgaWYgKGluc3QuX2hvc3ROb2RlKSB7XG4gICAgcmV0dXJuIGluc3QuX2hvc3ROb2RlO1xuICB9XG5cbiAgLy8gV2FsayB1cCB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIGFuIGFuY2VzdG9yIHdob3NlIERPTSBub2RlIHdlIGhhdmUgY2FjaGVkLlxuICB2YXIgcGFyZW50cyA9IFtdO1xuICB3aGlsZSAoIWluc3QuX2hvc3ROb2RlKSB7XG4gICAgcGFyZW50cy5wdXNoKGluc3QpO1xuICAgICFpbnN0Ll9ob3N0UGFyZW50ID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdCBET00gdHJlZSByb290IHNob3VsZCBhbHdheXMgaGF2ZSBhIG5vZGUgcmVmZXJlbmNlLicpIDogX3Byb2RJbnZhcmlhbnQoJzM0JykgOiB2b2lkIDA7XG4gICAgaW5zdCA9IGluc3QuX2hvc3RQYXJlbnQ7XG4gIH1cblxuICAvLyBOb3cgcGFyZW50cyBjb250YWlucyBlYWNoIGFuY2VzdG9yIHRoYXQgZG9lcyAqbm90KiBoYXZlIGEgY2FjaGVkIG5hdGl2ZVxuICAvLyBub2RlLCBhbmQgYGluc3RgIGlzIHRoZSBkZWVwZXN0IGFuY2VzdG9yIHRoYXQgZG9lcy5cbiAgZm9yICg7IHBhcmVudHMubGVuZ3RoOyBpbnN0ID0gcGFyZW50cy5wb3AoKSkge1xuICAgIHByZWNhY2hlQ2hpbGROb2RlcyhpbnN0LCBpbnN0Ll9ob3N0Tm9kZSk7XG4gIH1cblxuICByZXR1cm4gaW5zdC5faG9zdE5vZGU7XG59XG5cbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSB7XG4gIGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlOiBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSxcbiAgZ2V0SW5zdGFuY2VGcm9tTm9kZTogZ2V0SW5zdGFuY2VGcm9tTm9kZSxcbiAgZ2V0Tm9kZUZyb21JbnN0YW5jZTogZ2V0Tm9kZUZyb21JbnN0YW5jZSxcbiAgcHJlY2FjaGVDaGlsZE5vZGVzOiBwcmVjYWNoZUNoaWxkTm9kZXMsXG4gIHByZWNhY2hlTm9kZTogcHJlY2FjaGVOb2RlLFxuICB1bmNhY2hlTm9kZTogdW5jYWNoZU5vZGVcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01Db21wb25lbnRUcmVlOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciB2YWxpZGF0ZURPTU5lc3RpbmcgPSByZXF1aXJlKCcuL3ZhbGlkYXRlRE9NTmVzdGluZycpO1xuXG52YXIgRE9DX05PREVfVFlQRSA9IDk7XG5cbmZ1bmN0aW9uIFJlYWN0RE9NQ29udGFpbmVySW5mbyh0b3BMZXZlbFdyYXBwZXIsIG5vZGUpIHtcbiAgdmFyIGluZm8gPSB7XG4gICAgX3RvcExldmVsV3JhcHBlcjogdG9wTGV2ZWxXcmFwcGVyLFxuICAgIF9pZENvdW50ZXI6IDEsXG4gICAgX293bmVyRG9jdW1lbnQ6IG5vZGUgPyBub2RlLm5vZGVUeXBlID09PSBET0NfTk9ERV9UWVBFID8gbm9kZSA6IG5vZGUub3duZXJEb2N1bWVudCA6IG51bGwsXG4gICAgX25vZGU6IG5vZGUsXG4gICAgX3RhZzogbm9kZSA/IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA6IG51bGwsXG4gICAgX25hbWVzcGFjZVVSSTogbm9kZSA/IG5vZGUubmFtZXNwYWNlVVJJIDogbnVsbFxuICB9O1xuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpbmZvLl9hbmNlc3RvckluZm8gPSBub2RlID8gdmFsaWRhdGVET01OZXN0aW5nLnVwZGF0ZWRBbmNlc3RvckluZm8obnVsbCwgaW5mby5fdGFnLCBudWxsKSA6IG51bGw7XG4gIH1cbiAgcmV0dXJuIGluZm87XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01Db250YWluZXJJbmZvOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgRE9NTGF6eVRyZWUgPSByZXF1aXJlKCcuL0RPTUxhenlUcmVlJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcblxudmFyIFJlYWN0RE9NRW1wdHlDb21wb25lbnQgPSBmdW5jdGlvbiAoaW5zdGFudGlhdGUpIHtcbiAgLy8gUmVhY3RDb21wb3NpdGVDb21wb25lbnQgdXNlcyB0aGlzOlxuICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG51bGw7XG4gIC8vIFJlYWN0RE9NQ29tcG9uZW50VHJlZSB1c2VzIHRoZXNlOlxuICB0aGlzLl9ob3N0Tm9kZSA9IG51bGw7XG4gIHRoaXMuX2hvc3RQYXJlbnQgPSBudWxsO1xuICB0aGlzLl9ob3N0Q29udGFpbmVySW5mbyA9IG51bGw7XG4gIHRoaXMuX2RvbUlEID0gMDtcbn07XG5fYXNzaWduKFJlYWN0RE9NRW1wdHlDb21wb25lbnQucHJvdG90eXBlLCB7XG4gIG1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0KSB7XG4gICAgdmFyIGRvbUlEID0gaG9zdENvbnRhaW5lckluZm8uX2lkQ291bnRlcisrO1xuICAgIHRoaXMuX2RvbUlEID0gZG9tSUQ7XG4gICAgdGhpcy5faG9zdFBhcmVudCA9IGhvc3RQYXJlbnQ7XG4gICAgdGhpcy5faG9zdENvbnRhaW5lckluZm8gPSBob3N0Q29udGFpbmVySW5mbztcblxuICAgIHZhciBub2RlVmFsdWUgPSAnIHJlYWN0LWVtcHR5OiAnICsgdGhpcy5fZG9tSUQgKyAnICc7XG4gICAgaWYgKHRyYW5zYWN0aW9uLnVzZUNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lckRvY3VtZW50ID0gaG9zdENvbnRhaW5lckluZm8uX293bmVyRG9jdW1lbnQ7XG4gICAgICB2YXIgbm9kZSA9IG93bmVyRG9jdW1lbnQuY3JlYXRlQ29tbWVudChub2RlVmFsdWUpO1xuICAgICAgUmVhY3RET01Db21wb25lbnRUcmVlLnByZWNhY2hlTm9kZSh0aGlzLCBub2RlKTtcbiAgICAgIHJldHVybiBET01MYXp5VHJlZShub2RlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRyYW5zYWN0aW9uLnJlbmRlclRvU3RhdGljTWFya3VwKSB7XG4gICAgICAgIC8vIE5vcm1hbGx5IHdlJ2QgaW5zZXJ0IGEgY29tbWVudCBub2RlLCBidXQgc2luY2UgdGhpcyBpcyBhIHNpdHVhdGlvblxuICAgICAgICAvLyB3aGVyZSBSZWFjdCB3b24ndCB0YWtlIG92ZXIgKHN0YXRpYyBwYWdlcyksIHdlIGNhbiBzaW1wbHkgcmV0dXJuXG4gICAgICAgIC8vIG5vdGhpbmcuXG4gICAgICAgIHJldHVybiAnJztcbiAgICAgIH1cbiAgICAgIHJldHVybiAnPCEtLScgKyBub2RlVmFsdWUgKyAnLS0+JztcbiAgICB9XG4gIH0sXG4gIHJlY2VpdmVDb21wb25lbnQ6IGZ1bmN0aW9uICgpIHt9LFxuICBnZXRIb3N0Tm9kZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0aGlzKTtcbiAgfSxcbiAgdW5tb3VudENvbXBvbmVudDogZnVuY3Rpb24gKCkge1xuICAgIFJlYWN0RE9NQ29tcG9uZW50VHJlZS51bmNhY2hlTm9kZSh0aGlzKTtcbiAgfVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01FbXB0eUNvbXBvbmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RET01GZWF0dXJlRmxhZ3MgPSB7XG4gIHVzZUNyZWF0ZUVsZW1lbnQ6IHRydWUsXG4gIHVzZUZpYmVyOiBmYWxzZVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUZlYXR1cmVGbGFnczsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NQ2hpbGRyZW5PcGVyYXRpb25zID0gcmVxdWlyZSgnLi9ET01DaGlsZHJlbk9wZXJhdGlvbnMnKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xuXG4vKipcbiAqIE9wZXJhdGlvbnMgdXNlZCB0byBwcm9jZXNzIHVwZGF0ZXMgdG8gRE9NIG5vZGVzLlxuICovXG52YXIgUmVhY3RET01JRE9wZXJhdGlvbnMgPSB7XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgYSBjb21wb25lbnQncyBjaGlsZHJlbiBieSBwcm9jZXNzaW5nIGEgc2VyaWVzIG9mIHVwZGF0ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7YXJyYXk8b2JqZWN0Pn0gdXBkYXRlcyBMaXN0IG9mIHVwZGF0ZSBjb25maWd1cmF0aW9ucy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBkYW5nZXJvdXNseVByb2Nlc3NDaGlsZHJlblVwZGF0ZXM6IGZ1bmN0aW9uIChwYXJlbnRJbnN0LCB1cGRhdGVzKSB7XG4gICAgdmFyIG5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShwYXJlbnRJbnN0KTtcbiAgICBET01DaGlsZHJlbk9wZXJhdGlvbnMucHJvY2Vzc1VwZGF0ZXMobm9kZSwgdXBkYXRlcyk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01JRE9wZXJhdGlvbnM7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKSxcbiAgICBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgRE9NUHJvcGVydHlPcGVyYXRpb25zID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eU9wZXJhdGlvbnMnKTtcbnZhciBMaW5rZWRWYWx1ZVV0aWxzID0gcmVxdWlyZSgnLi9MaW5rZWRWYWx1ZVV0aWxzJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIGRpZFdhcm5WYWx1ZUxpbmsgPSBmYWxzZTtcbnZhciBkaWRXYXJuQ2hlY2tlZExpbmsgPSBmYWxzZTtcbnZhciBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSBmYWxzZTtcbnZhciBkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkID0gZmFsc2U7XG52YXIgZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCA9IGZhbHNlO1xudmFyIGRpZFdhcm5VbmNvbnRyb2xsZWRUb0NvbnRyb2xsZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gZm9yY2VVcGRhdGVJZk1vdW50ZWQoKSB7XG4gIGlmICh0aGlzLl9yb290Tm9kZUlEKSB7XG4gICAgLy8gRE9NIGNvbXBvbmVudCBpcyBzdGlsbCBtb3VudGVkOyB1cGRhdGVcbiAgICBSZWFjdERPTUlucHV0LnVwZGF0ZVdyYXBwZXIodGhpcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDb250cm9sbGVkKHByb3BzKSB7XG4gIHZhciB1c2VzQ2hlY2tlZCA9IHByb3BzLnR5cGUgPT09ICdjaGVja2JveCcgfHwgcHJvcHMudHlwZSA9PT0gJ3JhZGlvJztcbiAgcmV0dXJuIHVzZXNDaGVja2VkID8gcHJvcHMuY2hlY2tlZCAhPSBudWxsIDogcHJvcHMudmFsdWUgIT0gbnVsbDtcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIGFuIDxpbnB1dD4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgc2V0dGluZyB0aGVzZSBvcHRpb25hbFxuICogcHJvcHM6IGBjaGVja2VkYCwgYHZhbHVlYCwgYGRlZmF1bHRDaGVja2VkYCwgYW5kIGBkZWZhdWx0VmFsdWVgLlxuICpcbiAqIElmIGBjaGVja2VkYCBvciBgdmFsdWVgIGFyZSBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zXG4gKiB0aGF0IGFmZmVjdCB0aGUgY2hlY2tlZCBzdGF0ZSBvciB2YWx1ZSB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiBJZiB0aGV5IGFyZSBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgbm90XG4gKiB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuIEluc3RlYWQsIHRoZSBwcm9wcyBtdXN0IGNoYW5nZSBpbiBvcmRlciBmb3JcbiAqIHRoZSByZW5kZXJlZCBlbGVtZW50IHRvIGJlIHVwZGF0ZWQuXG4gKlxuICogVGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBiZSBpbml0aWFsaXplZCBhcyB1bmNoZWNrZWQgKG9yIGBkZWZhdWx0Q2hlY2tlZGApXG4gKiB3aXRoIGFuIGVtcHR5IHZhbHVlIChvciBgZGVmYXVsdFZhbHVlYCkuXG4gKlxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDEyL1dELWh0bWw1LTIwMTIxMDI1L3RoZS1pbnB1dC1lbGVtZW50Lmh0bWxcbiAqL1xudmFyIFJlYWN0RE9NSW5wdXQgPSB7XG4gIGdldEhvc3RQcm9wczogZnVuY3Rpb24gKGluc3QsIHByb3BzKSB7XG4gICAgdmFyIHZhbHVlID0gTGlua2VkVmFsdWVVdGlscy5nZXRWYWx1ZShwcm9wcyk7XG4gICAgdmFyIGNoZWNrZWQgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldENoZWNrZWQocHJvcHMpO1xuXG4gICAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oe1xuICAgICAgLy8gTWFrZSBzdXJlIHdlIHNldCAudHlwZSBiZWZvcmUgYW55IG90aGVyIHByb3BlcnRpZXMgKHNldHRpbmcgLnZhbHVlXG4gICAgICAvLyBiZWZvcmUgLnR5cGUgbWVhbnMgLnZhbHVlIGlzIGxvc3QgaW4gSUUxMSBhbmQgYmVsb3cpXG4gICAgICB0eXBlOiB1bmRlZmluZWQsXG4gICAgICAvLyBNYWtlIHN1cmUgd2Ugc2V0IC5zdGVwIGJlZm9yZSAudmFsdWUgKHNldHRpbmcgLnZhbHVlIGJlZm9yZSAuc3RlcFxuICAgICAgLy8gbWVhbnMgLnZhbHVlIGlzIHJvdW5kZWQgb24gbW91bnQsIGJhc2VkIHVwb24gc3RlcCBwcmVjaXNpb24pXG4gICAgICBzdGVwOiB1bmRlZmluZWQsXG4gICAgICAvLyBNYWtlIHN1cmUgd2Ugc2V0IC5taW4gJiAubWF4IGJlZm9yZSAudmFsdWUgKHRvIGVuc3VyZSBwcm9wZXIgb3JkZXJcbiAgICAgIC8vIGluIGNvcm5lciBjYXNlcyBzdWNoIGFzIG1pbiBvciBtYXggZGVyaXZpbmcgZnJvbSB2YWx1ZSwgZS5nLiBJc3N1ZSAjNzE3MClcbiAgICAgIG1pbjogdW5kZWZpbmVkLFxuICAgICAgbWF4OiB1bmRlZmluZWRcbiAgICB9LCBwcm9wcywge1xuICAgICAgZGVmYXVsdENoZWNrZWQ6IHVuZGVmaW5lZCxcbiAgICAgIGRlZmF1bHRWYWx1ZTogdW5kZWZpbmVkLFxuICAgICAgdmFsdWU6IHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6IGluc3QuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUsXG4gICAgICBjaGVja2VkOiBjaGVja2VkICE9IG51bGwgPyBjaGVja2VkIDogaW5zdC5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkLFxuICAgICAgb25DaGFuZ2U6IGluc3QuX3dyYXBwZXJTdGF0ZS5vbkNoYW5nZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhvc3RQcm9wcztcbiAgfSxcblxuICBtb3VudFdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0LCBwcm9wcykge1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgTGlua2VkVmFsdWVVdGlscy5jaGVja1Byb3BUeXBlcygnaW5wdXQnLCBwcm9wcywgaW5zdC5fY3VycmVudEVsZW1lbnQuX293bmVyKTtcblxuICAgICAgdmFyIG93bmVyID0gaW5zdC5fY3VycmVudEVsZW1lbnQuX293bmVyO1xuXG4gICAgICBpZiAocHJvcHMudmFsdWVMaW5rICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZUxpbmspIHtcbiAgICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYHZhbHVlTGlua2AgcHJvcCBvbiBgaW5wdXRgIGlzIGRlcHJlY2F0ZWQ7IHNldCBgdmFsdWVgIGFuZCBgb25DaGFuZ2VgIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gICAgICAgIGRpZFdhcm5WYWx1ZUxpbmsgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLmNoZWNrZWRMaW5rICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5DaGVja2VkTGluaykge1xuICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdgY2hlY2tlZExpbmtgIHByb3Agb24gYGlucHV0YCBpcyBkZXByZWNhdGVkOyBzZXQgYHZhbHVlYCBhbmQgYG9uQ2hhbmdlYCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICAgICAgICBkaWRXYXJuQ2hlY2tlZExpbmsgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLmNoZWNrZWQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuQ2hlY2tlZERlZmF1bHRDaGVja2VkKSB7XG4gICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3RoIGNoZWNrZWQgYW5kIGRlZmF1bHRDaGVja2VkIHByb3BzLiAnICsgJ0lucHV0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSBjaGVja2VkIHByb3AsIG9yIHRoZSBkZWZhdWx0Q2hlY2tlZCBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGFuZCByZW1vdmUgb25lIG9mIHRoZXNlIHByb3BzLiBNb3JlIGluZm86ICcgKyAnaHR0cHM6Ly9mYi5tZS9yZWFjdC1jb250cm9sbGVkLWNvbXBvbmVudHMnLCBvd25lciAmJiBvd25lci5nZXROYW1lKCkgfHwgJ0EgY29tcG9uZW50JywgcHJvcHMudHlwZSkgOiB2b2lkIDA7XG4gICAgICAgIGRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgcHJvcHMuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSkge1xuICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyBjb250YWlucyBhbiBpbnB1dCBvZiB0eXBlICVzIHdpdGggYm90aCB2YWx1ZSBhbmQgZGVmYXVsdFZhbHVlIHByb3BzLiAnICsgJ0lucHV0IGVsZW1lbnRzIG11c3QgYmUgZWl0aGVyIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkICcgKyAnKHNwZWNpZnkgZWl0aGVyIHRoZSB2YWx1ZSBwcm9wLCBvciB0aGUgZGVmYXVsdFZhbHVlIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycsIG93bmVyICYmIG93bmVyLmdldE5hbWUoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKSA6IHZvaWQgMDtcbiAgICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlO1xuICAgIGluc3QuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICAgIGluaXRpYWxDaGVja2VkOiBwcm9wcy5jaGVja2VkICE9IG51bGwgPyBwcm9wcy5jaGVja2VkIDogcHJvcHMuZGVmYXVsdENoZWNrZWQsXG4gICAgICBpbml0aWFsVmFsdWU6IHByb3BzLnZhbHVlICE9IG51bGwgPyBwcm9wcy52YWx1ZSA6IGRlZmF1bHRWYWx1ZSxcbiAgICAgIGxpc3RlbmVyczogbnVsbCxcbiAgICAgIG9uQ2hhbmdlOiBfaGFuZGxlQ2hhbmdlLmJpbmQoaW5zdCksXG4gICAgICBjb250cm9sbGVkOiBpc0NvbnRyb2xsZWQocHJvcHMpXG4gICAgfTtcbiAgfSxcblxuICB1cGRhdGVXcmFwcGVyOiBmdW5jdGlvbiAoaW5zdCkge1xuICAgIHZhciBwcm9wcyA9IGluc3QuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgY29udHJvbGxlZCA9IGlzQ29udHJvbGxlZChwcm9wcyk7XG4gICAgICB2YXIgb3duZXIgPSBpbnN0Ll9jdXJyZW50RWxlbWVudC5fb3duZXI7XG5cbiAgICAgIGlmICghaW5zdC5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgJiYgY29udHJvbGxlZCAmJiAhZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCkge1xuICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyBpcyBjaGFuZ2luZyBhbiB1bmNvbnRyb2xsZWQgaW5wdXQgb2YgdHlwZSAlcyB0byBiZSBjb250cm9sbGVkLiAnICsgJ0lucHV0IGVsZW1lbnRzIHNob3VsZCBub3Qgc3dpdGNoIGZyb20gdW5jb250cm9sbGVkIHRvIGNvbnRyb2xsZWQgKG9yIHZpY2UgdmVyc2EpLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycsIG93bmVyICYmIG93bmVyLmdldE5hbWUoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKSA6IHZvaWQgMDtcbiAgICAgICAgZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoaW5zdC5fd3JhcHBlclN0YXRlLmNvbnRyb2xsZWQgJiYgIWNvbnRyb2xsZWQgJiYgIWRpZFdhcm5Db250cm9sbGVkVG9VbmNvbnRyb2xsZWQpIHtcbiAgICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXMgaXMgY2hhbmdpbmcgYSBjb250cm9sbGVkIGlucHV0IG9mIHR5cGUgJXMgdG8gYmUgdW5jb250cm9sbGVkLiAnICsgJ0lucHV0IGVsZW1lbnRzIHNob3VsZCBub3Qgc3dpdGNoIGZyb20gY29udHJvbGxlZCB0byB1bmNvbnRyb2xsZWQgKG9yIHZpY2UgdmVyc2EpLiAnICsgJ0RlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgaW5wdXQgJyArICdlbGVtZW50IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbXBvbmVudC4gTW9yZSBpbmZvOiBodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycsIG93bmVyICYmIG93bmVyLmdldE5hbWUoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKSA6IHZvaWQgMDtcbiAgICAgICAgZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVE9ETzogU2hvdWxkbid0IHRoaXMgYmUgZ2V0Q2hlY2tlZChwcm9wcyk/XG4gICAgdmFyIGNoZWNrZWQgPSBwcm9wcy5jaGVja2VkO1xuICAgIGlmIChjaGVja2VkICE9IG51bGwpIHtcbiAgICAgIERPTVByb3BlcnR5T3BlcmF0aW9ucy5zZXRWYWx1ZUZvclByb3BlcnR5KFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpLCAnY2hlY2tlZCcsIGNoZWNrZWQgfHwgZmFsc2UpO1xuICAgIH1cblxuICAgIHZhciBub2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCk7XG4gICAgdmFyIHZhbHVlID0gTGlua2VkVmFsdWVVdGlscy5nZXRWYWx1ZShwcm9wcyk7XG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gMCAmJiBub2RlLnZhbHVlID09PSAnJykge1xuICAgICAgICBub2RlLnZhbHVlID0gJzAnO1xuICAgICAgICAvLyBOb3RlOiBJRTkgcmVwb3J0cyBhIG51bWJlciBpbnB1dHMgYXMgJ3RleHQnLCBzbyBjaGVjayBwcm9wcyBpbnN0ZWFkLlxuICAgICAgfSBlbHNlIGlmIChwcm9wcy50eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICAvLyBTaW11bGF0ZSBgaW5wdXQudmFsdWVBc051bWJlcmAuIElFOSBkb2VzIG5vdCBzdXBwb3J0IGl0XG4gICAgICAgIHZhciB2YWx1ZUFzTnVtYmVyID0gcGFyc2VGbG9hdChub2RlLnZhbHVlLCAxMCkgfHwgMDtcblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgaWYgKHZhbHVlICE9IHZhbHVlQXNOdW1iZXIpIHtcbiAgICAgICAgICAvLyBDYXN0IGB2YWx1ZWAgdG8gYSBzdHJpbmcgdG8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBzZXQgY29ycmVjdGx5LiBXaGlsZVxuICAgICAgICAgIC8vIGJyb3dzZXJzIHR5cGljYWxseSBkbyB0aGlzIGFzIG5lY2Vzc2FyeSwganNkb20gZG9lc24ndC5cbiAgICAgICAgICBub2RlLnZhbHVlID0gJycgKyB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbm9kZS52YWx1ZSkge1xuICAgICAgICAvLyBDYXN0IGB2YWx1ZWAgdG8gYSBzdHJpbmcgdG8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBzZXQgY29ycmVjdGx5LiBXaGlsZVxuICAgICAgICAvLyBicm93c2VycyB0eXBpY2FsbHkgZG8gdGhpcyBhcyBuZWNlc3NhcnksIGpzZG9tIGRvZXNuJ3QuXG4gICAgICAgIG5vZGUudmFsdWUgPSAnJyArIHZhbHVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJvcHMudmFsdWUgPT0gbnVsbCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAvLyBJbiBDaHJvbWUsIGFzc2lnbmluZyBkZWZhdWx0VmFsdWUgdG8gY2VydGFpbiBpbnB1dCB0eXBlcyB0cmlnZ2VycyBpbnB1dCB2YWxpZGF0aW9uLlxuICAgICAgICAvLyBGb3IgbnVtYmVyIGlucHV0cywgdGhlIGRpc3BsYXkgdmFsdWUgbG9zZXMgdHJhaWxpbmcgZGVjaW1hbCBwb2ludHMuIEZvciBlbWFpbCBpbnB1dHMsXG4gICAgICAgIC8vIENocm9tZSByYWlzZXMgXCJUaGUgc3BlY2lmaWVkIHZhbHVlIDx4PiBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzXCIuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEhlcmUgd2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBkZWZhdWx0VmFsdWUgaGFzIGFjdHVhbGx5IGNoYW5nZWQsIGF2b2lkaW5nIHRoZXNlIHByb2JsZW1zXG4gICAgICAgIC8vIHdoZW4gdGhlIHVzZXIgaXMgaW5wdXR0aW5nIHRleHRcbiAgICAgICAgLy9cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MjUzXG4gICAgICAgIGlmIChub2RlLmRlZmF1bHRWYWx1ZSAhPT0gJycgKyBwcm9wcy5kZWZhdWx0VmFsdWUpIHtcbiAgICAgICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9ICcnICsgcHJvcHMuZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMuY2hlY2tlZCA9PSBudWxsICYmIHByb3BzLmRlZmF1bHRDaGVja2VkICE9IG51bGwpIHtcbiAgICAgICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICEhcHJvcHMuZGVmYXVsdENoZWNrZWQ7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHBvc3RNb3VudFdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgdmFyIHByb3BzID0gaW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHM7XG5cbiAgICAvLyBUaGlzIGlzIGluIHBvc3RNb3VudCBiZWNhdXNlIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBET00gbm9kZSwgd2hpY2ggaXMgbm90XG4gICAgLy8gYXZhaWxhYmxlIHVudGlsIGFmdGVyIHRoZSBjb21wb25lbnQgaGFzIG1vdW50ZWQuXG4gICAgdmFyIG5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtcblxuICAgIC8vIERldGFjaCB2YWx1ZSBmcm9tIGRlZmF1bHRWYWx1ZS4gV2Ugd29uJ3QgZG8gYW55dGhpbmcgaWYgd2UncmUgd29ya2luZyBvblxuICAgIC8vIHN1Ym1pdCBvciByZXNldCBpbnB1dHMgYXMgdGhvc2UgdmFsdWVzICYgZGVmYXVsdFZhbHVlcyBhcmUgbGlua2VkLiBUaGV5XG4gICAgLy8gYXJlIG5vdCByZXNldGFibGUgbm9kZXMgc28gdGhpcyBvcGVyYXRpb24gZG9lc24ndCBtYXR0ZXIgYW5kIGFjdHVhbGx5XG4gICAgLy8gcmVtb3ZlcyBicm93c2VyLWRlZmF1bHQgdmFsdWVzIChlZyBcIlN1Ym1pdCBRdWVyeVwiKSB3aGVuIG5vIHZhbHVlIGlzXG4gICAgLy8gcHJvdmlkZWQuXG5cbiAgICBzd2l0Y2ggKHByb3BzLnR5cGUpIHtcbiAgICAgIGNhc2UgJ3N1Ym1pdCc6XG4gICAgICBjYXNlICdyZXNldCc6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY29sb3InOlxuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICBjYXNlICdkYXRldGltZSc6XG4gICAgICBjYXNlICdkYXRldGltZS1sb2NhbCc6XG4gICAgICBjYXNlICdtb250aCc6XG4gICAgICBjYXNlICd0aW1lJzpcbiAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAvLyBUaGlzIGZpeGVzIHRoZSBuby1zaG93IGlzc3VlIG9uIGlPUyBTYWZhcmkgYW5kIEFuZHJvaWQgQ2hyb21lOlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyMzNcbiAgICAgICAgbm9kZS52YWx1ZSA9ICcnO1xuICAgICAgICBub2RlLnZhbHVlID0gbm9kZS5kZWZhdWx0VmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbm9kZS52YWx1ZSA9IG5vZGUudmFsdWU7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIE5vcm1hbGx5LCB3ZSdkIGp1c3QgZG8gYG5vZGUuY2hlY2tlZCA9IG5vZGUuY2hlY2tlZGAgdXBvbiBpbml0aWFsIG1vdW50LCBsZXNzIHRoaXMgYnVnXG4gICAgLy8gdGhpcyBpcyBuZWVkZWQgdG8gd29yayBhcm91bmQgYSBjaHJvbWUgYnVnIHdoZXJlIHNldHRpbmcgZGVmYXVsdENoZWNrZWRcbiAgICAvLyB3aWxsIHNvbWV0aW1lcyBpbmZsdWVuY2UgdGhlIHZhbHVlIG9mIGNoZWNrZWQgKGV2ZW4gYWZ0ZXIgZGV0YWNobWVudCkuXG4gICAgLy8gUmVmZXJlbmNlOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD02MDg0MTZcbiAgICAvLyBXZSBuZWVkIHRvIHRlbXBvcmFyaWx5IHVuc2V0IG5hbWUgdG8gYXZvaWQgZGlzcnVwdGluZyByYWRpbyBidXR0b24gZ3JvdXBzLlxuICAgIHZhciBuYW1lID0gbm9kZS5uYW1lO1xuICAgIGlmIChuYW1lICE9PSAnJykge1xuICAgICAgbm9kZS5uYW1lID0gJyc7XG4gICAgfVxuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhbm9kZS5kZWZhdWx0Q2hlY2tlZDtcbiAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gIW5vZGUuZGVmYXVsdENoZWNrZWQ7XG4gICAgaWYgKG5hbWUgIT09ICcnKSB7XG4gICAgICBub2RlLm5hbWUgPSBuYW1lO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gX2hhbmRsZUNoYW5nZShldmVudCkge1xuICB2YXIgcHJvcHMgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztcblxuICB2YXIgcmV0dXJuVmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmV4ZWN1dGVPbkNoYW5nZShwcm9wcywgZXZlbnQpO1xuXG4gIC8vIEhlcmUgd2UgdXNlIGFzYXAgdG8gd2FpdCB1bnRpbCBhbGwgdXBkYXRlcyBoYXZlIHByb3BhZ2F0ZWQsIHdoaWNoXG4gIC8vIGlzIGltcG9ydGFudCB3aGVuIHVzaW5nIGNvbnRyb2xsZWQgY29tcG9uZW50cyB3aXRoaW4gbGF5ZXJzOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzE2OThcbiAgUmVhY3RVcGRhdGVzLmFzYXAoZm9yY2VVcGRhdGVJZk1vdW50ZWQsIHRoaXMpO1xuXG4gIHZhciBuYW1lID0gcHJvcHMubmFtZTtcbiAgaWYgKHByb3BzLnR5cGUgPT09ICdyYWRpbycgJiYgbmFtZSAhPSBudWxsKSB7XG4gICAgdmFyIHJvb3ROb2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcyk7XG4gICAgdmFyIHF1ZXJ5Um9vdCA9IHJvb3ROb2RlO1xuXG4gICAgd2hpbGUgKHF1ZXJ5Um9vdC5wYXJlbnROb2RlKSB7XG4gICAgICBxdWVyeVJvb3QgPSBxdWVyeVJvb3QucGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICAvLyBJZiBgcm9vdE5vZGUuZm9ybWAgd2FzIG5vbi1udWxsLCB0aGVuIHdlIGNvdWxkIHRyeSBgZm9ybS5lbGVtZW50c2AsXG4gICAgLy8gYnV0IHRoYXQgc29tZXRpbWVzIGJlaGF2ZXMgc3RyYW5nZWx5IGluIElFOC4gV2UgY291bGQgYWxzbyB0cnkgdXNpbmdcbiAgICAvLyBgZm9ybS5nZXRFbGVtZW50c0J5TmFtZWAsIGJ1dCB0aGF0IHdpbGwgb25seSByZXR1cm4gZGlyZWN0IGNoaWxkcmVuXG4gICAgLy8gYW5kIHdvbid0IGluY2x1ZGUgaW5wdXRzIHRoYXQgdXNlIHRoZSBIVE1MNSBgZm9ybT1gIGF0dHJpYnV0ZS4gU2luY2VcbiAgICAvLyB0aGUgaW5wdXQgbWlnaHQgbm90IGV2ZW4gYmUgaW4gYSBmb3JtLCBsZXQncyBqdXN0IHVzZSB0aGUgZ2xvYmFsXG4gICAgLy8gYHF1ZXJ5U2VsZWN0b3JBbGxgIHRvIGVuc3VyZSB3ZSBkb24ndCBtaXNzIGFueXRoaW5nLlxuICAgIHZhciBncm91cCA9IHF1ZXJ5Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPScgKyBKU09OLnN0cmluZ2lmeSgnJyArIG5hbWUpICsgJ11bdHlwZT1cInJhZGlvXCJdJyk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyb3VwLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgb3RoZXJOb2RlID0gZ3JvdXBbaV07XG4gICAgICBpZiAob3RoZXJOb2RlID09PSByb290Tm9kZSB8fCBvdGhlck5vZGUuZm9ybSAhPT0gcm9vdE5vZGUuZm9ybSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBpZiByYWRpbyBidXR0b25zIHJlbmRlcmVkIGJ5IGRpZmZlcmVudCBjb3BpZXMgb2YgUmVhY3RcbiAgICAgIC8vIGFuZCB0aGUgc2FtZSBuYW1lIGFyZSByZW5kZXJlZCBpbnRvIHRoZSBzYW1lIGZvcm0gKHNhbWUgYXMgIzE5MzkpLlxuICAgICAgLy8gVGhhdCdzIHByb2JhYmx5IG9rYXk7IHdlIGRvbid0IHN1cHBvcnQgaXQganVzdCBhcyB3ZSBkb24ndCBzdXBwb3J0XG4gICAgICAvLyBtaXhpbmcgUmVhY3QgcmFkaW8gYnV0dG9ucyB3aXRoIG5vbi1SZWFjdCBvbmVzLlxuICAgICAgdmFyIG90aGVySW5zdGFuY2UgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShvdGhlck5vZGUpO1xuICAgICAgIW90aGVySW5zdGFuY2UgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0RE9NSW5wdXQ6IE1peGluZyBSZWFjdCBhbmQgbm9uLVJlYWN0IHJhZGlvIGlucHV0cyB3aXRoIHRoZSBzYW1lIGBuYW1lYCBpcyBub3Qgc3VwcG9ydGVkLicpIDogX3Byb2RJbnZhcmlhbnQoJzkwJykgOiB2b2lkIDA7XG4gICAgICAvLyBJZiB0aGlzIGlzIGEgY29udHJvbGxlZCByYWRpbyBidXR0b24gZ3JvdXAsIGZvcmNpbmcgdGhlIGlucHV0IHRoYXRcbiAgICAgIC8vIHdhcyBwcmV2aW91c2x5IGNoZWNrZWQgdG8gdXBkYXRlIHdpbGwgY2F1c2UgaXQgdG8gYmUgY29tZSByZS1jaGVja2VkXG4gICAgICAvLyBhcyBhcHByb3ByaWF0ZS5cbiAgICAgIFJlYWN0VXBkYXRlcy5hc2FwKGZvcmNlVXBkYXRlSWZNb3VudGVkLCBvdGhlckluc3RhbmNlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0dXJuVmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01JbnB1dDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NUHJvcGVydHkgPSByZXF1aXJlKCcuL0RPTVByb3BlcnR5Jyk7XG52YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgd2FybmVkUHJvcGVydGllcyA9IHt9O1xudmFyIHJBUklBID0gbmV3IFJlZ0V4cCgnXihhcmlhKS1bJyArIERPTVByb3BlcnR5LkFUVFJJQlVURV9OQU1FX0NIQVIgKyAnXSokJyk7XG5cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvcGVydHkodGFnTmFtZSwgbmFtZSwgZGVidWdJRCkge1xuICBpZiAod2FybmVkUHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAockFSSUEudGVzdChuYW1lKSkge1xuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgc3RhbmRhcmROYW1lID0gRE9NUHJvcGVydHkuZ2V0UG9zc2libGVTdGFuZGFyZE5hbWUuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gRE9NUHJvcGVydHkuZ2V0UG9zc2libGVTdGFuZGFyZE5hbWVbbG93ZXJDYXNlZE5hbWVdIDogbnVsbDtcblxuICAgIC8vIElmIHRoaXMgaXMgYW4gYXJpYS0qIGF0dHJpYnV0ZSwgYnV0IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIGtub3duIERPTVxuICAgIC8vIERPTSBwcm9wZXJ0aWVzLCB0aGVuIGl0IGlzIGFuIGludmFsaWQgYXJpYS0qIGF0dHJpYnV0ZS5cbiAgICBpZiAoc3RhbmRhcmROYW1lID09IG51bGwpIHtcbiAgICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBhcmlhLSogYXR0cmlidXRlcyBzaG91bGQgYmUgbG93ZXJjYXNlOyBzdWdnZXN0IHRoZSBsb3dlcmNhc2UgdmVyc2lvbi5cbiAgICBpZiAobmFtZSAhPT0gc3RhbmRhcmROYW1lKSB7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdVbmtub3duIEFSSUEgYXR0cmlidXRlICVzLiBEaWQgeW91IG1lYW4gJXM/JXMnLCBuYW1lLCBzdGFuZGFyZE5hbWUsIFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoZGVidWdJRCkpIDogdm9pZCAwO1xuICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gd2FybkludmFsaWRBUklBUHJvcHMoZGVidWdJRCwgZWxlbWVudCkge1xuICB2YXIgaW52YWxpZFByb3BzID0gW107XG5cbiAgZm9yICh2YXIga2V5IGluIGVsZW1lbnQucHJvcHMpIHtcbiAgICB2YXIgaXNWYWxpZCA9IHZhbGlkYXRlUHJvcGVydHkoZWxlbWVudC50eXBlLCBrZXksIGRlYnVnSUQpO1xuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgaW52YWxpZFByb3BzLnB1c2goa2V5KTtcbiAgICB9XG4gIH1cblxuICB2YXIgdW5rbm93blByb3BTdHJpbmcgPSBpbnZhbGlkUHJvcHMubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgcmV0dXJuICdgJyArIHByb3AgKyAnYCc7XG4gIH0pLmpvaW4oJywgJyk7XG5cbiAgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPT09IDEpIHtcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdJbnZhbGlkIGFyaWEgcHJvcCAlcyBvbiA8JXM+IHRhZy4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vZmIubWUvaW52YWxpZC1hcmlhLXByb3AlcycsIHVua25vd25Qcm9wU3RyaW5nLCBlbGVtZW50LnR5cGUsIFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoZGVidWdJRCkpIDogdm9pZCAwO1xuICB9IGVsc2UgaWYgKGludmFsaWRQcm9wcy5sZW5ndGggPiAxKSB7XG4gICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnSW52YWxpZCBhcmlhIHByb3BzICVzIG9uIDwlcz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9mYi5tZS9pbnZhbGlkLWFyaWEtcHJvcCVzJywgdW5rbm93blByb3BTdHJpbmcsIGVsZW1lbnQudHlwZSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKSkgOiB2b2lkIDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlRWxlbWVudChkZWJ1Z0lELCBlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50ID09IG51bGwgfHwgdHlwZW9mIGVsZW1lbnQudHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGVsZW1lbnQudHlwZS5pbmRleE9mKCctJykgPj0gMCB8fCBlbGVtZW50LnByb3BzLmlzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgd2FybkludmFsaWRBUklBUHJvcHMoZGVidWdJRCwgZWxlbWVudCk7XG59XG5cbnZhciBSZWFjdERPTUludmFsaWRBUklBSG9vayA9IHtcbiAgb25CZWZvcmVNb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQsIGVsZW1lbnQpIHtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGhhbmRsZUVsZW1lbnQoZGVidWdJRCwgZWxlbWVudCk7XG4gICAgfVxuICB9LFxuICBvbkJlZm9yZVVwZGF0ZUNvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQsIGVsZW1lbnQpIHtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGhhbmRsZUVsZW1lbnQoZGVidWdJRCwgZWxlbWVudCk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NSW52YWxpZEFSSUFIb29rOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcblxudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBkaWRXYXJuVmFsdWVOdWxsID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGhhbmRsZUVsZW1lbnQoZGVidWdJRCwgZWxlbWVudCkge1xuICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChlbGVtZW50LnR5cGUgIT09ICdpbnB1dCcgJiYgZWxlbWVudC50eXBlICE9PSAndGV4dGFyZWEnICYmIGVsZW1lbnQudHlwZSAhPT0gJ3NlbGVjdCcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGVsZW1lbnQucHJvcHMgIT0gbnVsbCAmJiBlbGVtZW50LnByb3BzLnZhbHVlID09PSBudWxsICYmICFkaWRXYXJuVmFsdWVOdWxsKSB7XG4gICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYHZhbHVlYCBwcm9wIG9uIGAlc2Agc2hvdWxkIG5vdCBiZSBudWxsLiAnICsgJ0NvbnNpZGVyIHVzaW5nIHRoZSBlbXB0eSBzdHJpbmcgdG8gY2xlYXIgdGhlIGNvbXBvbmVudCBvciBgdW5kZWZpbmVkYCAnICsgJ2ZvciB1bmNvbnRyb2xsZWQgY29tcG9uZW50cy4lcycsIGVsZW1lbnQudHlwZSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKSkgOiB2b2lkIDA7XG5cbiAgICBkaWRXYXJuVmFsdWVOdWxsID0gdHJ1ZTtcbiAgfVxufVxuXG52YXIgUmVhY3RET01OdWxsSW5wdXRWYWx1ZVByb3BIb29rID0ge1xuICBvbkJlZm9yZU1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCkge1xuICAgIGhhbmRsZUVsZW1lbnQoZGVidWdJRCwgZWxlbWVudCk7XG4gIH0sXG4gIG9uQmVmb3JlVXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCkge1xuICAgIGhhbmRsZUVsZW1lbnQoZGVidWdJRCwgZWxlbWVudCk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01OdWxsSW5wdXRWYWx1ZVByb3BIb29rOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3QnKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xudmFyIFJlYWN0RE9NU2VsZWN0ID0gcmVxdWlyZSgnLi9SZWFjdERPTVNlbGVjdCcpO1xuXG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcbnZhciBkaWRXYXJuSW52YWxpZE9wdGlvbkNoaWxkcmVuID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGZsYXR0ZW5DaGlsZHJlbihjaGlsZHJlbikge1xuICB2YXIgY29udGVudCA9ICcnO1xuXG4gIC8vIEZsYXR0ZW4gY2hpbGRyZW4gYW5kIHdhcm4gaWYgdGhleSBhcmVuJ3Qgc3RyaW5ncyBvciBudW1iZXJzO1xuICAvLyBpbnZhbGlkIHR5cGVzIGFyZSBpZ25vcmVkLlxuICBSZWFjdC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICBpZiAoY2hpbGQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgY2hpbGQgPT09ICdudW1iZXInKSB7XG4gICAgICBjb250ZW50ICs9IGNoaWxkO1xuICAgIH0gZWxzZSBpZiAoIWRpZFdhcm5JbnZhbGlkT3B0aW9uQ2hpbGRyZW4pIHtcbiAgICAgIGRpZFdhcm5JbnZhbGlkT3B0aW9uQ2hpbGRyZW4gPSB0cnVlO1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnT25seSBzdHJpbmdzIGFuZCBudW1iZXJzIGFyZSBzdXBwb3J0ZWQgYXMgPG9wdGlvbj4gY2hpbGRyZW4uJykgOiB2b2lkIDA7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY29udGVudDtcbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIGFuIDxvcHRpb24+IGhvc3QgY29tcG9uZW50IHRoYXQgd2FybnMgd2hlbiBgc2VsZWN0ZWRgIGlzIHNldC5cbiAqL1xudmFyIFJlYWN0RE9NT3B0aW9uID0ge1xuICBtb3VudFdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0LCBwcm9wcywgaG9zdFBhcmVudCkge1xuICAgIC8vIFRPRE8gKHl1bmdzdGVycyk6IFJlbW92ZSBzdXBwb3J0IGZvciBgc2VsZWN0ZWRgIGluIDxvcHRpb24+LlxuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHByb3BzLnNlbGVjdGVkID09IG51bGwsICdVc2UgdGhlIGBkZWZhdWx0VmFsdWVgIG9yIGB2YWx1ZWAgcHJvcHMgb24gPHNlbGVjdD4gaW5zdGVhZCBvZiAnICsgJ3NldHRpbmcgYHNlbGVjdGVkYCBvbiA8b3B0aW9uPi4nKSA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICAvLyBMb29rIHVwIHdoZXRoZXIgdGhpcyBvcHRpb24gaXMgJ3NlbGVjdGVkJ1xuICAgIHZhciBzZWxlY3RWYWx1ZSA9IG51bGw7XG4gICAgaWYgKGhvc3RQYXJlbnQgIT0gbnVsbCkge1xuICAgICAgdmFyIHNlbGVjdFBhcmVudCA9IGhvc3RQYXJlbnQ7XG5cbiAgICAgIGlmIChzZWxlY3RQYXJlbnQuX3RhZyA9PT0gJ29wdGdyb3VwJykge1xuICAgICAgICBzZWxlY3RQYXJlbnQgPSBzZWxlY3RQYXJlbnQuX2hvc3RQYXJlbnQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChzZWxlY3RQYXJlbnQgIT0gbnVsbCAmJiBzZWxlY3RQYXJlbnQuX3RhZyA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgc2VsZWN0VmFsdWUgPSBSZWFjdERPTVNlbGVjdC5nZXRTZWxlY3RWYWx1ZUNvbnRleHQoc2VsZWN0UGFyZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgdmFsdWUgaXMgbnVsbCAoZS5nLiwgbm8gc3BlY2lmaWVkIHZhbHVlIG9yIGFmdGVyIGluaXRpYWwgbW91bnQpXG4gICAgLy8gb3IgbWlzc2luZyAoZS5nLiwgZm9yIDxkYXRhbGlzdD4pLCB3ZSBkb24ndCBjaGFuZ2UgcHJvcHMuc2VsZWN0ZWRcbiAgICB2YXIgc2VsZWN0ZWQgPSBudWxsO1xuICAgIGlmIChzZWxlY3RWYWx1ZSAhPSBudWxsKSB7XG4gICAgICB2YXIgdmFsdWU7XG4gICAgICBpZiAocHJvcHMudmFsdWUgIT0gbnVsbCkge1xuICAgICAgICB2YWx1ZSA9IHByb3BzLnZhbHVlICsgJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZSA9IGZsYXR0ZW5DaGlsZHJlbihwcm9wcy5jaGlsZHJlbik7XG4gICAgICB9XG4gICAgICBzZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0VmFsdWUpKSB7XG4gICAgICAgIC8vIG11bHRpcGxlXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0VmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoJycgKyBzZWxlY3RWYWx1ZVtpXSA9PT0gdmFsdWUpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZWN0ZWQgPSAnJyArIHNlbGVjdFZhbHVlID09PSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpbnN0Ll93cmFwcGVyU3RhdGUgPSB7IHNlbGVjdGVkOiBzZWxlY3RlZCB9O1xuICB9LFxuXG4gIHBvc3RNb3VudFdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgLy8gdmFsdWU9XCJcIiBzaG91bGQgbWFrZSBhIHZhbHVlIGF0dHJpYnV0ZSAoIzYyMTkpXG4gICAgdmFyIHByb3BzID0gaW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHM7XG4gICAgaWYgKHByb3BzLnZhbHVlICE9IG51bGwpIHtcbiAgICAgIHZhciBub2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCk7XG4gICAgICBub2RlLnNldEF0dHJpYnV0ZSgndmFsdWUnLCBwcm9wcy52YWx1ZSk7XG4gICAgfVxuICB9LFxuXG4gIGdldEhvc3RQcm9wczogZnVuY3Rpb24gKGluc3QsIHByb3BzKSB7XG4gICAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oeyBzZWxlY3RlZDogdW5kZWZpbmVkLCBjaGlsZHJlbjogdW5kZWZpbmVkIH0sIHByb3BzKTtcblxuICAgIC8vIFJlYWQgc3RhdGUgb25seSBmcm9tIGluaXRpYWwgbW91bnQgYmVjYXVzZSA8c2VsZWN0PiB1cGRhdGVzIHZhbHVlXG4gICAgLy8gbWFudWFsbHk7IHdlIG5lZWQgdGhlIGluaXRpYWwgc3RhdGUgb25seSBmb3Igc2VydmVyIHJlbmRlcmluZ1xuICAgIGlmIChpbnN0Ll93cmFwcGVyU3RhdGUuc2VsZWN0ZWQgIT0gbnVsbCkge1xuICAgICAgaG9zdFByb3BzLnNlbGVjdGVkID0gaW5zdC5fd3JhcHBlclN0YXRlLnNlbGVjdGVkO1xuICAgIH1cblxuICAgIHZhciBjb250ZW50ID0gZmxhdHRlbkNoaWxkcmVuKHByb3BzLmNoaWxkcmVuKTtcblxuICAgIGlmIChjb250ZW50KSB7XG4gICAgICBob3N0UHJvcHMuY2hpbGRyZW4gPSBjb250ZW50O1xuICAgIH1cblxuICAgIHJldHVybiBob3N0UHJvcHM7XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTU9wdGlvbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIExpbmtlZFZhbHVlVXRpbHMgPSByZXF1aXJlKCcuL0xpbmtlZFZhbHVlVXRpbHMnKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xudmFyIFJlYWN0VXBkYXRlcyA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVzJyk7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgZGlkV2FyblZhbHVlTGluayA9IGZhbHNlO1xudmFyIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9IGZhbHNlO1xuXG5mdW5jdGlvbiB1cGRhdGVPcHRpb25zSWZQZW5kaW5nVXBkYXRlQW5kTW91bnRlZCgpIHtcbiAgaWYgKHRoaXMuX3Jvb3ROb2RlSUQgJiYgdGhpcy5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGUpIHtcbiAgICB0aGlzLl93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZSA9IGZhbHNlO1xuXG4gICAgdmFyIHByb3BzID0gdGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHM7XG4gICAgdmFyIHZhbHVlID0gTGlua2VkVmFsdWVVdGlscy5nZXRWYWx1ZShwcm9wcyk7XG5cbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgdXBkYXRlT3B0aW9ucyh0aGlzLCBCb29sZWFuKHByb3BzLm11bHRpcGxlKSwgdmFsdWUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpIHtcbiAgaWYgKG93bmVyKSB7XG4gICAgdmFyIG5hbWUgPSBvd25lci5nZXROYW1lKCk7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxudmFyIHZhbHVlUHJvcE5hbWVzID0gWyd2YWx1ZScsICdkZWZhdWx0VmFsdWUnXTtcblxuLyoqXG4gKiBWYWxpZGF0aW9uIGZ1bmN0aW9uIGZvciBgdmFsdWVgIGFuZCBgZGVmYXVsdFZhbHVlYC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrU2VsZWN0UHJvcFR5cGVzKGluc3QsIHByb3BzKSB7XG4gIHZhciBvd25lciA9IGluc3QuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjtcbiAgTGlua2VkVmFsdWVVdGlscy5jaGVja1Byb3BUeXBlcygnc2VsZWN0JywgcHJvcHMsIG93bmVyKTtcblxuICBpZiAocHJvcHMudmFsdWVMaW5rICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5WYWx1ZUxpbmspIHtcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdgdmFsdWVMaW5rYCBwcm9wIG9uIGBzZWxlY3RgIGlzIGRlcHJlY2F0ZWQ7IHNldCBgdmFsdWVgIGFuZCBgb25DaGFuZ2VgIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gICAgZGlkV2FyblZhbHVlTGluayA9IHRydWU7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlUHJvcE5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHByb3BOYW1lID0gdmFsdWVQcm9wTmFtZXNbaV07XG4gICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHByb3BzW3Byb3BOYW1lXSk7XG4gICAgaWYgKHByb3BzLm11bHRpcGxlICYmICFpc0FycmF5KSB7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYW4gYXJyYXkgaWYgJyArICdgbXVsdGlwbGVgIGlzIHRydWUuJXMnLCBwcm9wTmFtZSwgZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKG93bmVyKSkgOiB2b2lkIDA7XG4gICAgfSBlbHNlIGlmICghcHJvcHMubXVsdGlwbGUgJiYgaXNBcnJheSkge1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVGhlIGAlc2AgcHJvcCBzdXBwbGllZCB0byA8c2VsZWN0PiBtdXN0IGJlIGEgc2NhbGFyICcgKyAndmFsdWUgaWYgYG11bHRpcGxlYCBpcyBmYWxzZS4lcycsIHByb3BOYW1lLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpKSA6IHZvaWQgMDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlYWN0RE9NQ29tcG9uZW50fSBpbnN0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IG11bHRpcGxlXG4gKiBAcGFyYW0geyp9IHByb3BWYWx1ZSBBIHN0cmluZ2FibGUgKHdpdGggYG11bHRpcGxlYCwgYSBsaXN0IG9mIHN0cmluZ2FibGVzKS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZU9wdGlvbnMoaW5zdCwgbXVsdGlwbGUsIHByb3BWYWx1ZSkge1xuICB2YXIgc2VsZWN0ZWRWYWx1ZSwgaTtcbiAgdmFyIG9wdGlvbnMgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KS5vcHRpb25zO1xuXG4gIGlmIChtdWx0aXBsZSkge1xuICAgIHNlbGVjdGVkVmFsdWUgPSB7fTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgcHJvcFZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzZWxlY3RlZFZhbHVlWycnICsgcHJvcFZhbHVlW2ldXSA9IHRydWU7XG4gICAgfVxuICAgIGZvciAoaSA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VsZWN0ZWQgPSBzZWxlY3RlZFZhbHVlLmhhc093blByb3BlcnR5KG9wdGlvbnNbaV0udmFsdWUpO1xuICAgICAgaWYgKG9wdGlvbnNbaV0uc2VsZWN0ZWQgIT09IHNlbGVjdGVkKSB7XG4gICAgICAgIG9wdGlvbnNbaV0uc2VsZWN0ZWQgPSBzZWxlY3RlZDtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRG8gbm90IHNldCBgc2VsZWN0LnZhbHVlYCBhcyBleGFjdCBiZWhhdmlvciBpc24ndCBjb25zaXN0ZW50IGFjcm9zcyBhbGxcbiAgICAvLyBicm93c2VycyBmb3IgYWxsIGNhc2VzLlxuICAgIHNlbGVjdGVkVmFsdWUgPSAnJyArIHByb3BWYWx1ZTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgb3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG9wdGlvbnNbaV0udmFsdWUgPT09IHNlbGVjdGVkVmFsdWUpIHtcbiAgICAgICAgb3B0aW9uc1tpXS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICBvcHRpb25zWzBdLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBJbXBsZW1lbnRzIGEgPHNlbGVjdD4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgb3B0aW9uYWxseSBzZXR0aW5nIHRoZVxuICogcHJvcHMgYHZhbHVlYCBhbmQgYGRlZmF1bHRWYWx1ZWAuIElmIGBtdWx0aXBsZWAgaXMgZmFsc2UsIHRoZSBwcm9wIG11c3QgYmUgYVxuICogc3RyaW5nYWJsZS4gSWYgYG11bHRpcGxlYCBpcyB0cnVlLCB0aGUgcHJvcCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ2FibGVzLlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGNoYW5nZSB0aGVcbiAqIHNlbGVjdGVkIG9wdGlvbiB3aWxsIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgcmVuZGVyZWQgb3B0aW9ucy5cbiAqXG4gKiBJZiBpdCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBvcHRpb25zIHdpbGwgbm90XG4gKiB1cGRhdGUgaW4gcmVzcG9uc2UgdG8gdXNlciBhY3Rpb25zLiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluXG4gKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIG9wdGlvbnMgdG8gdXBkYXRlLlxuICpcbiAqIElmIGBkZWZhdWx0VmFsdWVgIGlzIHByb3ZpZGVkLCBhbnkgb3B0aW9ucyB3aXRoIHRoZSBzdXBwbGllZCB2YWx1ZXMgd2lsbCBiZVxuICogc2VsZWN0ZWQuXG4gKi9cbnZhciBSZWFjdERPTVNlbGVjdCA9IHtcbiAgZ2V0SG9zdFByb3BzOiBmdW5jdGlvbiAoaW5zdCwgcHJvcHMpIHtcbiAgICByZXR1cm4gX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgIG9uQ2hhbmdlOiBpbnN0Ll93cmFwcGVyU3RhdGUub25DaGFuZ2UsXG4gICAgICB2YWx1ZTogdW5kZWZpbmVkXG4gICAgfSk7XG4gIH0sXG5cbiAgbW91bnRXcmFwcGVyOiBmdW5jdGlvbiAoaW5zdCwgcHJvcHMpIHtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGNoZWNrU2VsZWN0UHJvcFR5cGVzKGluc3QsIHByb3BzKTtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTtcbiAgICBpbnN0Ll93cmFwcGVyU3RhdGUgPSB7XG4gICAgICBwZW5kaW5nVXBkYXRlOiBmYWxzZSxcbiAgICAgIGluaXRpYWxWYWx1ZTogdmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogcHJvcHMuZGVmYXVsdFZhbHVlLFxuICAgICAgbGlzdGVuZXJzOiBudWxsLFxuICAgICAgb25DaGFuZ2U6IF9oYW5kbGVDaGFuZ2UuYmluZChpbnN0KSxcbiAgICAgIHdhc011bHRpcGxlOiBCb29sZWFuKHByb3BzLm11bHRpcGxlKVxuICAgIH07XG5cbiAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlKSB7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdTZWxlY3QgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIHNlbGVjdCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycpIDogdm9pZCAwO1xuICAgICAgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gdHJ1ZTtcbiAgICB9XG4gIH0sXG5cbiAgZ2V0U2VsZWN0VmFsdWVDb250ZXh0OiBmdW5jdGlvbiAoaW5zdCkge1xuICAgIC8vIFJlYWN0RE9NT3B0aW9uIGxvb2tzIGF0IHRoaXMgaW5pdGlhbCB2YWx1ZSBzbyB0aGUgaW5pdGlhbCBnZW5lcmF0ZWRcbiAgICAvLyBtYXJrdXAgaGFzIGNvcnJlY3QgYHNlbGVjdGVkYCBhdHRyaWJ1dGVzXG4gICAgcmV0dXJuIGluc3QuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWU7XG4gIH0sXG5cbiAgcG9zdFVwZGF0ZVdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgdmFyIHByb3BzID0gaW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHM7XG5cbiAgICAvLyBBZnRlciB0aGUgaW5pdGlhbCBtb3VudCwgd2UgY29udHJvbCBzZWxlY3RlZC1uZXNzIG1hbnVhbGx5IHNvIGRvbid0IHBhc3NcbiAgICAvLyB0aGlzIHZhbHVlIGRvd25cbiAgICBpbnN0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlID0gdW5kZWZpbmVkO1xuXG4gICAgdmFyIHdhc011bHRpcGxlID0gaW5zdC5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlO1xuICAgIGluc3QuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZSA9IEJvb2xlYW4ocHJvcHMubXVsdGlwbGUpO1xuXG4gICAgdmFyIHZhbHVlID0gTGlua2VkVmFsdWVVdGlscy5nZXRWYWx1ZShwcm9wcyk7XG4gICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5wZW5kaW5nVXBkYXRlID0gZmFsc2U7XG4gICAgICB1cGRhdGVPcHRpb25zKGluc3QsIEJvb2xlYW4ocHJvcHMubXVsdGlwbGUpLCB2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh3YXNNdWx0aXBsZSAhPT0gQm9vbGVhbihwcm9wcy5tdWx0aXBsZSkpIHtcbiAgICAgIC8vIEZvciBzaW1wbGljaXR5LCByZWFwcGx5IGBkZWZhdWx0VmFsdWVgIGlmIGBtdWx0aXBsZWAgaXMgdG9nZ2xlZC5cbiAgICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICB1cGRhdGVPcHRpb25zKGluc3QsIEJvb2xlYW4ocHJvcHMubXVsdGlwbGUpLCBwcm9wcy5kZWZhdWx0VmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gUmV2ZXJ0IHRoZSBzZWxlY3QgYmFjayB0byBpdHMgZGVmYXVsdCB1bnNlbGVjdGVkIHN0YXRlLlxuICAgICAgICB1cGRhdGVPcHRpb25zKGluc3QsIEJvb2xlYW4ocHJvcHMubXVsdGlwbGUpLCBwcm9wcy5tdWx0aXBsZSA/IFtdIDogJycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gX2hhbmRsZUNoYW5nZShldmVudCkge1xuICB2YXIgcHJvcHMgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztcbiAgdmFyIHJldHVyblZhbHVlID0gTGlua2VkVmFsdWVVdGlscy5leGVjdXRlT25DaGFuZ2UocHJvcHMsIGV2ZW50KTtcblxuICBpZiAodGhpcy5fcm9vdE5vZGVJRCkge1xuICAgIHRoaXMuX3dyYXBwZXJTdGF0ZS5wZW5kaW5nVXBkYXRlID0gdHJ1ZTtcbiAgfVxuICBSZWFjdFVwZGF0ZXMuYXNhcCh1cGRhdGVPcHRpb25zSWZQZW5kaW5nVXBkYXRlQW5kTW91bnRlZCwgdGhpcyk7XG4gIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTVNlbGVjdDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xuXG52YXIgZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldCA9IHJlcXVpcmUoJy4vZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldCcpO1xudmFyIGdldFRleHRDb250ZW50QWNjZXNzb3IgPSByZXF1aXJlKCcuL2dldFRleHRDb250ZW50QWNjZXNzb3InKTtcblxuLyoqXG4gKiBXaGlsZSBgaXNDb2xsYXBzZWRgIGlzIGF2YWlsYWJsZSBvbiB0aGUgU2VsZWN0aW9uIG9iamVjdCBhbmQgYGNvbGxhcHNlZGBcbiAqIGlzIGF2YWlsYWJsZSBvbiB0aGUgUmFuZ2Ugb2JqZWN0LCBJRTExIHNvbWV0aW1lcyBnZXRzIHRoZW0gd3JvbmcuXG4gKiBJZiB0aGUgYW5jaG9yL2ZvY3VzIG5vZGVzIGFuZCBvZmZzZXRzIGFyZSB0aGUgc2FtZSwgdGhlIHJhbmdlIGlzIGNvbGxhcHNlZC5cbiAqL1xuZnVuY3Rpb24gaXNDb2xsYXBzZWQoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0LCBmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KSB7XG4gIHJldHVybiBhbmNob3JOb2RlID09PSBmb2N1c05vZGUgJiYgYW5jaG9yT2Zmc2V0ID09PSBmb2N1c09mZnNldDtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGFwcHJvcHJpYXRlIGFuY2hvciBhbmQgZm9jdXMgbm9kZS9vZmZzZXQgcGFpcnMgZm9yIElFLlxuICpcbiAqIFRoZSBjYXRjaCBoZXJlIGlzIHRoYXQgSUUncyBzZWxlY3Rpb24gQVBJIGRvZXNuJ3QgcHJvdmlkZSBpbmZvcm1hdGlvblxuICogYWJvdXQgd2hldGhlciB0aGUgc2VsZWN0aW9uIGlzIGZvcndhcmQgb3IgYmFja3dhcmQsIHNvIHdlIGhhdmUgdG9cbiAqIGJlaGF2ZSBhcyB0aG91Z2ggaXQncyBhbHdheXMgZm9yd2FyZC5cbiAqXG4gKiBJRSB0ZXh0IGRpZmZlcnMgZnJvbSBtb2Rlcm4gc2VsZWN0aW9uIGluIHRoYXQgaXQgYmVoYXZlcyBhcyB0aG91Z2hcbiAqIGJsb2NrIGVsZW1lbnRzIGVuZCB3aXRoIGEgbmV3IGxpbmUuIFRoaXMgbWVhbnMgY2hhcmFjdGVyIG9mZnNldHMgd2lsbFxuICogZGlmZmVyIGJldHdlZW4gdGhlIHR3byBBUElzLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRJRU9mZnNldHMobm9kZSkge1xuICB2YXIgc2VsZWN0aW9uID0gZG9jdW1lbnQuc2VsZWN0aW9uO1xuICB2YXIgc2VsZWN0ZWRSYW5nZSA9IHNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpO1xuICB2YXIgc2VsZWN0ZWRMZW5ndGggPSBzZWxlY3RlZFJhbmdlLnRleHQubGVuZ3RoO1xuXG4gIC8vIER1cGxpY2F0ZSBzZWxlY3Rpb24gc28gd2UgY2FuIG1vdmUgcmFuZ2Ugd2l0aG91dCBicmVha2luZyB1c2VyIHNlbGVjdGlvbi5cbiAgdmFyIGZyb21TdGFydCA9IHNlbGVjdGVkUmFuZ2UuZHVwbGljYXRlKCk7XG4gIGZyb21TdGFydC5tb3ZlVG9FbGVtZW50VGV4dChub2RlKTtcbiAgZnJvbVN0YXJ0LnNldEVuZFBvaW50KCdFbmRUb1N0YXJ0Jywgc2VsZWN0ZWRSYW5nZSk7XG5cbiAgdmFyIHN0YXJ0T2Zmc2V0ID0gZnJvbVN0YXJ0LnRleHQubGVuZ3RoO1xuICB2YXIgZW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQgKyBzZWxlY3RlZExlbmd0aDtcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBzdGFydE9mZnNldCxcbiAgICBlbmQ6IGVuZE9mZnNldFxuICB9O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHJldHVybiB7P29iamVjdH1cbiAqL1xuZnVuY3Rpb24gZ2V0TW9kZXJuT2Zmc2V0cyhub2RlKSB7XG4gIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uICYmIHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcblxuICBpZiAoIXNlbGVjdGlvbiB8fCBzZWxlY3Rpb24ucmFuZ2VDb3VudCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGFuY2hvck5vZGUgPSBzZWxlY3Rpb24uYW5jaG9yTm9kZTtcbiAgdmFyIGFuY2hvck9mZnNldCA9IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQ7XG4gIHZhciBmb2N1c05vZGUgPSBzZWxlY3Rpb24uZm9jdXNOb2RlO1xuICB2YXIgZm9jdXNPZmZzZXQgPSBzZWxlY3Rpb24uZm9jdXNPZmZzZXQ7XG5cbiAgdmFyIGN1cnJlbnRSYW5nZSA9IHNlbGVjdGlvbi5nZXRSYW5nZUF0KDApO1xuXG4gIC8vIEluIEZpcmVmb3gsIHJhbmdlLnN0YXJ0Q29udGFpbmVyIGFuZCByYW5nZS5lbmRDb250YWluZXIgY2FuIGJlIFwiYW5vbnltb3VzXG4gIC8vIGRpdnNcIiwgZS5nLiB0aGUgdXAvZG93biBidXR0b25zIG9uIGFuIDxpbnB1dCB0eXBlPVwibnVtYmVyXCI+LiBBbm9ueW1vdXNcbiAgLy8gZGl2cyBkbyBub3Qgc2VlbSB0byBleHBvc2UgcHJvcGVydGllcywgdHJpZ2dlcmluZyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcbiAgLy8gZXJyb3JcIiBpZiBhbnkgb2YgaXRzIHByb3BlcnRpZXMgYXJlIGFjY2Vzc2VkLiBUaGUgb25seSBzZWVtaW5nbHkgcG9zc2libGVcbiAgLy8gd2F5IHRvIGF2b2lkIGVycm9yaW5nIGlzIHRvIGFjY2VzcyBhIHByb3BlcnR5IHRoYXQgdHlwaWNhbGx5IHdvcmtzIGZvclxuICAvLyBub24tYW5vbnltb3VzIGRpdnMgYW5kIGNhdGNoIGFueSBlcnJvciB0aGF0IG1heSBvdGhlcndpc2UgYXJpc2UuIFNlZVxuICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0yMDg0MjdcbiAgdHJ5IHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtZXhwcmVzc2lvbnMgKi9cbiAgICBjdXJyZW50UmFuZ2Uuc3RhcnRDb250YWluZXIubm9kZVR5cGU7XG4gICAgY3VycmVudFJhbmdlLmVuZENvbnRhaW5lci5ub2RlVHlwZTtcbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBJZiB0aGUgbm9kZSBhbmQgb2Zmc2V0IHZhbHVlcyBhcmUgdGhlIHNhbWUsIHRoZSBzZWxlY3Rpb24gaXMgY29sbGFwc2VkLlxuICAvLyBgU2VsZWN0aW9uLmlzQ29sbGFwc2VkYCBpcyBhdmFpbGFibGUgbmF0aXZlbHksIGJ1dCBJRSBzb21ldGltZXMgZ2V0c1xuICAvLyB0aGlzIHZhbHVlIHdyb25nLlxuICB2YXIgaXNTZWxlY3Rpb25Db2xsYXBzZWQgPSBpc0NvbGxhcHNlZChzZWxlY3Rpb24uYW5jaG9yTm9kZSwgc2VsZWN0aW9uLmFuY2hvck9mZnNldCwgc2VsZWN0aW9uLmZvY3VzTm9kZSwgc2VsZWN0aW9uLmZvY3VzT2Zmc2V0KTtcblxuICB2YXIgcmFuZ2VMZW5ndGggPSBpc1NlbGVjdGlvbkNvbGxhcHNlZCA/IDAgOiBjdXJyZW50UmFuZ2UudG9TdHJpbmcoKS5sZW5ndGg7XG5cbiAgdmFyIHRlbXBSYW5nZSA9IGN1cnJlbnRSYW5nZS5jbG9uZVJhbmdlKCk7XG4gIHRlbXBSYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobm9kZSk7XG4gIHRlbXBSYW5nZS5zZXRFbmQoY3VycmVudFJhbmdlLnN0YXJ0Q29udGFpbmVyLCBjdXJyZW50UmFuZ2Uuc3RhcnRPZmZzZXQpO1xuXG4gIHZhciBpc1RlbXBSYW5nZUNvbGxhcHNlZCA9IGlzQ29sbGFwc2VkKHRlbXBSYW5nZS5zdGFydENvbnRhaW5lciwgdGVtcFJhbmdlLnN0YXJ0T2Zmc2V0LCB0ZW1wUmFuZ2UuZW5kQ29udGFpbmVyLCB0ZW1wUmFuZ2UuZW5kT2Zmc2V0KTtcblxuICB2YXIgc3RhcnQgPSBpc1RlbXBSYW5nZUNvbGxhcHNlZCA/IDAgOiB0ZW1wUmFuZ2UudG9TdHJpbmcoKS5sZW5ndGg7XG4gIHZhciBlbmQgPSBzdGFydCArIHJhbmdlTGVuZ3RoO1xuXG4gIC8vIERldGVjdCB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gaXMgYmFja3dhcmQuXG4gIHZhciBkZXRlY3Rpb25SYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gIGRldGVjdGlvblJhbmdlLnNldFN0YXJ0KGFuY2hvck5vZGUsIGFuY2hvck9mZnNldCk7XG4gIGRldGVjdGlvblJhbmdlLnNldEVuZChmb2N1c05vZGUsIGZvY3VzT2Zmc2V0KTtcbiAgdmFyIGlzQmFja3dhcmQgPSBkZXRlY3Rpb25SYW5nZS5jb2xsYXBzZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFydDogaXNCYWNrd2FyZCA/IGVuZCA6IHN0YXJ0LFxuICAgIGVuZDogaXNCYWNrd2FyZCA/IHN0YXJ0IDogZW5kXG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gb2Zmc2V0c1xuICovXG5mdW5jdGlvbiBzZXRJRU9mZnNldHMobm9kZSwgb2Zmc2V0cykge1xuICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS5kdXBsaWNhdGUoKTtcbiAgdmFyIHN0YXJ0LCBlbmQ7XG5cbiAgaWYgKG9mZnNldHMuZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGFydCA9IG9mZnNldHMuc3RhcnQ7XG4gICAgZW5kID0gc3RhcnQ7XG4gIH0gZWxzZSBpZiAob2Zmc2V0cy5zdGFydCA+IG9mZnNldHMuZW5kKSB7XG4gICAgc3RhcnQgPSBvZmZzZXRzLmVuZDtcbiAgICBlbmQgPSBvZmZzZXRzLnN0YXJ0O1xuICB9IGVsc2Uge1xuICAgIHN0YXJ0ID0gb2Zmc2V0cy5zdGFydDtcbiAgICBlbmQgPSBvZmZzZXRzLmVuZDtcbiAgfVxuXG4gIHJhbmdlLm1vdmVUb0VsZW1lbnRUZXh0KG5vZGUpO1xuICByYW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIHN0YXJ0KTtcbiAgcmFuZ2Uuc2V0RW5kUG9pbnQoJ0VuZFRvU3RhcnQnLCByYW5nZSk7XG4gIHJhbmdlLm1vdmVFbmQoJ2NoYXJhY3RlcicsIGVuZCAtIHN0YXJ0KTtcbiAgcmFuZ2Uuc2VsZWN0KCk7XG59XG5cbi8qKlxuICogSW4gbW9kZXJuIG5vbi1JRSBicm93c2Vycywgd2UgY2FuIHN1cHBvcnQgYm90aCBmb3J3YXJkIGFuZCBiYWNrd2FyZFxuICogc2VsZWN0aW9ucy5cbiAqXG4gKiBOb3RlOiBJRTEwKyBzdXBwb3J0cyB0aGUgU2VsZWN0aW9uIG9iamVjdCwgYnV0IGl0IGRvZXMgbm90IHN1cHBvcnRcbiAqIHRoZSBgZXh0ZW5kYCBtZXRob2QsIHdoaWNoIG1lYW5zIHRoYXQgZXZlbiBpbiBtb2Rlcm4gSUUsIGl0J3Mgbm90IHBvc3NpYmxlXG4gKiB0byBwcm9ncmFtbWF0aWNhbGx5IGNyZWF0ZSBhIGJhY2t3YXJkIHNlbGVjdGlvbi4gVGh1cywgZm9yIGFsbCBJRVxuICogdmVyc2lvbnMsIHdlIHVzZSB0aGUgb2xkIElFIEFQSSB0byBjcmVhdGUgb3VyIHNlbGVjdGlvbnMuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gb2Zmc2V0c1xuICovXG5mdW5jdGlvbiBzZXRNb2Rlcm5PZmZzZXRzKG5vZGUsIG9mZnNldHMpIHtcbiAgaWYgKCF3aW5kb3cuZ2V0U2VsZWN0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgdmFyIGxlbmd0aCA9IG5vZGVbZ2V0VGV4dENvbnRlbnRBY2Nlc3NvcigpXS5sZW5ndGg7XG4gIHZhciBzdGFydCA9IE1hdGgubWluKG9mZnNldHMuc3RhcnQsIGxlbmd0aCk7XG4gIHZhciBlbmQgPSBvZmZzZXRzLmVuZCA9PT0gdW5kZWZpbmVkID8gc3RhcnQgOiBNYXRoLm1pbihvZmZzZXRzLmVuZCwgbGVuZ3RoKTtcblxuICAvLyBJRSAxMSB1c2VzIG1vZGVybiBzZWxlY3Rpb24sIGJ1dCBkb2Vzbid0IHN1cHBvcnQgdGhlIGV4dGVuZCBtZXRob2QuXG4gIC8vIEZsaXAgYmFja3dhcmQgc2VsZWN0aW9ucywgc28gd2UgY2FuIHNldCB3aXRoIGEgc2luZ2xlIHJhbmdlLlxuICBpZiAoIXNlbGVjdGlvbi5leHRlbmQgJiYgc3RhcnQgPiBlbmQpIHtcbiAgICB2YXIgdGVtcCA9IGVuZDtcbiAgICBlbmQgPSBzdGFydDtcbiAgICBzdGFydCA9IHRlbXA7XG4gIH1cblxuICB2YXIgc3RhcnRNYXJrZXIgPSBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KG5vZGUsIHN0YXJ0KTtcbiAgdmFyIGVuZE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgZW5kKTtcblxuICBpZiAoc3RhcnRNYXJrZXIgJiYgZW5kTWFya2VyKSB7XG4gICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZXRTdGFydChzdGFydE1hcmtlci5ub2RlLCBzdGFydE1hcmtlci5vZmZzZXQpO1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcblxuICAgIGlmIChzdGFydCA+IGVuZCkge1xuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICAgIHNlbGVjdGlvbi5leHRlbmQoZW5kTWFya2VyLm5vZGUsIGVuZE1hcmtlci5vZmZzZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByYW5nZS5zZXRFbmQoZW5kTWFya2VyLm5vZGUsIGVuZE1hcmtlci5vZmZzZXQpO1xuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICB9XG4gIH1cbn1cblxudmFyIHVzZUlFT2Zmc2V0cyA9IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSAmJiAnc2VsZWN0aW9uJyBpbiBkb2N1bWVudCAmJiAhKCdnZXRTZWxlY3Rpb24nIGluIHdpbmRvdyk7XG5cbnZhciBSZWFjdERPTVNlbGVjdGlvbiA9IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICAgKi9cbiAgZ2V0T2Zmc2V0czogdXNlSUVPZmZzZXRzID8gZ2V0SUVPZmZzZXRzIDogZ2V0TW9kZXJuT2Zmc2V0cyxcblxuICAvKipcbiAgICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzXG4gICAqL1xuICBzZXRPZmZzZXRzOiB1c2VJRU9mZnNldHMgPyBzZXRJRU9mZnNldHMgOiBzZXRNb2Rlcm5PZmZzZXRzXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NU2VsZWN0aW9uOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50JyksXG4gICAgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIERPTUNoaWxkcmVuT3BlcmF0aW9ucyA9IHJlcXVpcmUoJy4vRE9NQ2hpbGRyZW5PcGVyYXRpb25zJyk7XG52YXIgRE9NTGF6eVRyZWUgPSByZXF1aXJlKCcuL0RPTUxhenlUcmVlJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcblxudmFyIGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3NlciA9IHJlcXVpcmUoJy4vZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgdmFsaWRhdGVET01OZXN0aW5nID0gcmVxdWlyZSgnLi92YWxpZGF0ZURPTU5lc3RpbmcnKTtcblxuLyoqXG4gKiBUZXh0IG5vZGVzIHZpb2xhdGUgYSBjb3VwbGUgYXNzdW1wdGlvbnMgdGhhdCBSZWFjdCBtYWtlcyBhYm91dCBjb21wb25lbnRzOlxuICpcbiAqICAtIFdoZW4gbW91bnRpbmcgdGV4dCBpbnRvIHRoZSBET00sIGFkamFjZW50IHRleHQgbm9kZXMgYXJlIG1lcmdlZC5cbiAqICAtIFRleHQgbm9kZXMgY2Fubm90IGJlIGFzc2lnbmVkIGEgUmVhY3Qgcm9vdCBJRC5cbiAqXG4gKiBUaGlzIGNvbXBvbmVudCBpcyB1c2VkIHRvIHdyYXAgc3RyaW5ncyBiZXR3ZWVuIGNvbW1lbnQgbm9kZXMgc28gdGhhdCB0aGV5XG4gKiBjYW4gdW5kZXJnbyB0aGUgc2FtZSByZWNvbmNpbGlhdGlvbiB0aGF0IGlzIGFwcGxpZWQgdG8gZWxlbWVudHMuXG4gKlxuICogVE9ETzogSW52ZXN0aWdhdGUgcmVwcmVzZW50aW5nIFJlYWN0IGNvbXBvbmVudHMgaW4gdGhlIERPTSB3aXRoIHRleHQgbm9kZXMuXG4gKlxuICogQGNsYXNzIFJlYWN0RE9NVGV4dENvbXBvbmVudFxuICogQGV4dGVuZHMgUmVhY3RDb21wb25lbnRcbiAqIEBpbnRlcm5hbFxuICovXG52YXIgUmVhY3RET01UZXh0Q29tcG9uZW50ID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgLy8gVE9ETzogVGhpcyBpcyByZWFsbHkgYSBSZWFjdFRleHQgKFJlYWN0Tm9kZSksIG5vdCBhIFJlYWN0RWxlbWVudFxuICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IHRleHQ7XG4gIHRoaXMuX3N0cmluZ1RleHQgPSAnJyArIHRleHQ7XG4gIC8vIFJlYWN0RE9NQ29tcG9uZW50VHJlZSB1c2VzIHRoZXNlOlxuICB0aGlzLl9ob3N0Tm9kZSA9IG51bGw7XG4gIHRoaXMuX2hvc3RQYXJlbnQgPSBudWxsO1xuXG4gIC8vIFByb3BlcnRpZXNcbiAgdGhpcy5fZG9tSUQgPSAwO1xuICB0aGlzLl9tb3VudEluZGV4ID0gMDtcbiAgdGhpcy5fY2xvc2luZ0NvbW1lbnQgPSBudWxsO1xuICB0aGlzLl9jb21tZW50Tm9kZXMgPSBudWxsO1xufTtcblxuX2Fzc2lnbihSZWFjdERPTVRleHRDb21wb25lbnQucHJvdG90eXBlLCB7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIG1hcmt1cCBmb3IgdGhpcyB0ZXh0IG5vZGUuIFRoaXMgbm9kZSBpcyBub3QgaW50ZW5kZWQgdG8gaGF2ZVxuICAgKiBhbnkgZmVhdHVyZXMgYmVzaWRlcyBjb250YWluaW5nIHRleHQgY29udGVudC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEByZXR1cm4ge3N0cmluZ30gTWFya3VwIGZvciB0aGlzIHRleHQgbm9kZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBtb3VudENvbXBvbmVudDogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgY29udGV4dCkge1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHBhcmVudEluZm87XG4gICAgICBpZiAoaG9zdFBhcmVudCAhPSBudWxsKSB7XG4gICAgICAgIHBhcmVudEluZm8gPSBob3N0UGFyZW50Ll9hbmNlc3RvckluZm87XG4gICAgICB9IGVsc2UgaWYgKGhvc3RDb250YWluZXJJbmZvICE9IG51bGwpIHtcbiAgICAgICAgcGFyZW50SW5mbyA9IGhvc3RDb250YWluZXJJbmZvLl9hbmNlc3RvckluZm87XG4gICAgICB9XG4gICAgICBpZiAocGFyZW50SW5mbykge1xuICAgICAgICAvLyBwYXJlbnRJbmZvIHNob3VsZCBhbHdheXMgYmUgcHJlc2VudCBleGNlcHQgZm9yIHRoZSB0b3AtbGV2ZWxcbiAgICAgICAgLy8gY29tcG9uZW50IHdoZW4gc2VydmVyIHJlbmRlcmluZ1xuICAgICAgICB2YWxpZGF0ZURPTU5lc3RpbmcobnVsbCwgdGhpcy5fc3RyaW5nVGV4dCwgdGhpcywgcGFyZW50SW5mbyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRvbUlEID0gaG9zdENvbnRhaW5lckluZm8uX2lkQ291bnRlcisrO1xuICAgIHZhciBvcGVuaW5nVmFsdWUgPSAnIHJlYWN0LXRleHQ6ICcgKyBkb21JRCArICcgJztcbiAgICB2YXIgY2xvc2luZ1ZhbHVlID0gJyAvcmVhY3QtdGV4dCAnO1xuICAgIHRoaXMuX2RvbUlEID0gZG9tSUQ7XG4gICAgdGhpcy5faG9zdFBhcmVudCA9IGhvc3RQYXJlbnQ7XG4gICAgaWYgKHRyYW5zYWN0aW9uLnVzZUNyZWF0ZUVsZW1lbnQpIHtcbiAgICAgIHZhciBvd25lckRvY3VtZW50ID0gaG9zdENvbnRhaW5lckluZm8uX293bmVyRG9jdW1lbnQ7XG4gICAgICB2YXIgb3BlbmluZ0NvbW1lbnQgPSBvd25lckRvY3VtZW50LmNyZWF0ZUNvbW1lbnQob3BlbmluZ1ZhbHVlKTtcbiAgICAgIHZhciBjbG9zaW5nQ29tbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlQ29tbWVudChjbG9zaW5nVmFsdWUpO1xuICAgICAgdmFyIGxhenlUcmVlID0gRE9NTGF6eVRyZWUob3duZXJEb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpO1xuICAgICAgRE9NTGF6eVRyZWUucXVldWVDaGlsZChsYXp5VHJlZSwgRE9NTGF6eVRyZWUob3BlbmluZ0NvbW1lbnQpKTtcbiAgICAgIGlmICh0aGlzLl9zdHJpbmdUZXh0KSB7XG4gICAgICAgIERPTUxhenlUcmVlLnF1ZXVlQ2hpbGQobGF6eVRyZWUsIERPTUxhenlUcmVlKG93bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodGhpcy5fc3RyaW5nVGV4dCkpKTtcbiAgICAgIH1cbiAgICAgIERPTUxhenlUcmVlLnF1ZXVlQ2hpbGQobGF6eVRyZWUsIERPTUxhenlUcmVlKGNsb3NpbmdDb21tZW50KSk7XG4gICAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUucHJlY2FjaGVOb2RlKHRoaXMsIG9wZW5pbmdDb21tZW50KTtcbiAgICAgIHRoaXMuX2Nsb3NpbmdDb21tZW50ID0gY2xvc2luZ0NvbW1lbnQ7XG4gICAgICByZXR1cm4gbGF6eVRyZWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlc2NhcGVkVGV4dCA9IGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlcih0aGlzLl9zdHJpbmdUZXh0KTtcblxuICAgICAgaWYgKHRyYW5zYWN0aW9uLnJlbmRlclRvU3RhdGljTWFya3VwKSB7XG4gICAgICAgIC8vIE5vcm1hbGx5IHdlJ2Qgd3JhcCB0aGlzIGJldHdlZW4gY29tbWVudCBub2RlcyBmb3IgdGhlIHJlYXNvbnMgc3RhdGVkXG4gICAgICAgIC8vIGFib3ZlLCBidXQgc2luY2UgdGhpcyBpcyBhIHNpdHVhdGlvbiB3aGVyZSBSZWFjdCB3b24ndCB0YWtlIG92ZXJcbiAgICAgICAgLy8gKHN0YXRpYyBwYWdlcyksIHdlIGNhbiBzaW1wbHkgcmV0dXJuIHRoZSB0ZXh0IGFzIGl0IGlzLlxuICAgICAgICByZXR1cm4gZXNjYXBlZFRleHQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnPCEtLScgKyBvcGVuaW5nVmFsdWUgKyAnLS0+JyArIGVzY2FwZWRUZXh0ICsgJzwhLS0nICsgY2xvc2luZ1ZhbHVlICsgJy0tPic7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoaXMgY29tcG9uZW50IGJ5IHVwZGF0aW5nIHRoZSB0ZXh0IGNvbnRlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RUZXh0fSBuZXh0VGV4dCBUaGUgbmV4dCB0ZXh0IGNvbnRlbnRcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlY2VpdmVDb21wb25lbnQ6IGZ1bmN0aW9uIChuZXh0VGV4dCwgdHJhbnNhY3Rpb24pIHtcbiAgICBpZiAobmV4dFRleHQgIT09IHRoaXMuX2N1cnJlbnRFbGVtZW50KSB7XG4gICAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG5leHRUZXh0O1xuICAgICAgdmFyIG5leHRTdHJpbmdUZXh0ID0gJycgKyBuZXh0VGV4dDtcbiAgICAgIGlmIChuZXh0U3RyaW5nVGV4dCAhPT0gdGhpcy5fc3RyaW5nVGV4dCkge1xuICAgICAgICAvLyBUT0RPOiBTYXZlIHRoaXMgYXMgcGVuZGluZyBwcm9wcyBhbmQgdXNlIHBlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeVxuICAgICAgICAvLyBhbmQvb3IgdXBkYXRlQ29tcG9uZW50IHRvIGRvIHRoZSBhY3R1YWwgdXBkYXRlIGZvciBjb25zaXN0ZW5jeSB3aXRoXG4gICAgICAgIC8vIG90aGVyIGNvbXBvbmVudCB0eXBlcz9cbiAgICAgICAgdGhpcy5fc3RyaW5nVGV4dCA9IG5leHRTdHJpbmdUZXh0O1xuICAgICAgICB2YXIgY29tbWVudE5vZGVzID0gdGhpcy5nZXRIb3N0Tm9kZSgpO1xuICAgICAgICBET01DaGlsZHJlbk9wZXJhdGlvbnMucmVwbGFjZURlbGltaXRlZFRleHQoY29tbWVudE5vZGVzWzBdLCBjb21tZW50Tm9kZXNbMV0sIG5leHRTdHJpbmdUZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgZ2V0SG9zdE5vZGU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaG9zdE5vZGUgPSB0aGlzLl9jb21tZW50Tm9kZXM7XG4gICAgaWYgKGhvc3ROb2RlKSB7XG4gICAgICByZXR1cm4gaG9zdE5vZGU7XG4gICAgfVxuICAgIGlmICghdGhpcy5fY2xvc2luZ0NvbW1lbnQpIHtcbiAgICAgIHZhciBvcGVuaW5nQ29tbWVudCA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpO1xuICAgICAgdmFyIG5vZGUgPSBvcGVuaW5nQ29tbWVudC5uZXh0U2libGluZztcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICEobm9kZSAhPSBudWxsKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnTWlzc2luZyBjbG9zaW5nIGNvbW1lbnQgZm9yIHRleHQgY29tcG9uZW50ICVzJywgdGhpcy5fZG9tSUQpIDogX3Byb2RJbnZhcmlhbnQoJzY3JywgdGhpcy5fZG9tSUQpIDogdm9pZCAwO1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gOCAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gJyAvcmVhY3QtdGV4dCAnKSB7XG4gICAgICAgICAgdGhpcy5fY2xvc2luZ0NvbW1lbnQgPSBub2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUgPSBub2RlLm5leHRTaWJsaW5nO1xuICAgICAgfVxuICAgIH1cbiAgICBob3N0Tm9kZSA9IFt0aGlzLl9ob3N0Tm9kZSwgdGhpcy5fY2xvc2luZ0NvbW1lbnRdO1xuICAgIHRoaXMuX2NvbW1lbnROb2RlcyA9IGhvc3ROb2RlO1xuICAgIHJldHVybiBob3N0Tm9kZTtcbiAgfSxcblxuICB1bm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fY2xvc2luZ0NvbW1lbnQgPSBudWxsO1xuICAgIHRoaXMuX2NvbW1lbnROb2RlcyA9IG51bGw7XG4gICAgUmVhY3RET01Db21wb25lbnRUcmVlLnVuY2FjaGVOb2RlKHRoaXMpO1xuICB9XG5cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NVGV4dENvbXBvbmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpLFxuICAgIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBMaW5rZWRWYWx1ZVV0aWxzID0gcmVxdWlyZSgnLi9MaW5rZWRWYWx1ZVV0aWxzJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIGRpZFdhcm5WYWx1ZUxpbmsgPSBmYWxzZTtcbnZhciBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmb3JjZVVwZGF0ZUlmTW91bnRlZCgpIHtcbiAgaWYgKHRoaXMuX3Jvb3ROb2RlSUQpIHtcbiAgICAvLyBET00gY29tcG9uZW50IGlzIHN0aWxsIG1vdW50ZWQ7IHVwZGF0ZVxuICAgIFJlYWN0RE9NVGV4dGFyZWEudXBkYXRlV3JhcHBlcih0aGlzKTtcbiAgfVxufVxuXG4vKipcbiAqIEltcGxlbWVudHMgYSA8dGV4dGFyZWE+IGhvc3QgY29tcG9uZW50IHRoYXQgYWxsb3dzIHNldHRpbmcgYHZhbHVlYCwgYW5kXG4gKiBgZGVmYXVsdFZhbHVlYC4gVGhpcyBkaWZmZXJzIGZyb20gdGhlIHRyYWRpdGlvbmFsIERPTSBBUEkgYmVjYXVzZSB2YWx1ZSBpc1xuICogdXN1YWxseSBzZXQgYXMgUENEQVRBIGNoaWxkcmVuLlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgbm90IHN1cHBsaWVkIChvciBudWxsL3VuZGVmaW5lZCksIHVzZXIgYWN0aW9ucyB0aGF0IGFmZmVjdCB0aGVcbiAqIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIElmIGB2YWx1ZWAgaXMgc3VwcGxpZWQgKGFuZCBub3QgbnVsbC91bmRlZmluZWQpLCB0aGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsXG4gKiBub3QgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LiBJbnN0ZWFkLCB0aGUgYHZhbHVlYCBwcm9wIG11c3QgY2hhbmdlIGluXG4gKiBvcmRlciBmb3IgdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggYW4gZW1wdHkgdmFsdWUsIHRoZSBwcm9wXG4gKiBgZGVmYXVsdFZhbHVlYCBpZiBzcGVjaWZpZWQsIG9yIHRoZSBjaGlsZHJlbiBjb250ZW50IChkZXByZWNhdGVkKS5cbiAqL1xudmFyIFJlYWN0RE9NVGV4dGFyZWEgPSB7XG4gIGdldEhvc3RQcm9wczogZnVuY3Rpb24gKGluc3QsIHByb3BzKSB7XG4gICAgIShwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PSBudWxsKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBkb2VzIG5vdCBtYWtlIHNlbnNlIG9uIDx0ZXh0YXJlYT4uJykgOiBfcHJvZEludmFyaWFudCgnOTEnKSA6IHZvaWQgMDtcblxuICAgIC8vIEFsd2F5cyBzZXQgY2hpbGRyZW4gdG8gdGhlIHNhbWUgdGhpbmcuIEluIElFOSwgdGhlIHNlbGVjdGlvbiByYW5nZSB3aWxsXG4gICAgLy8gZ2V0IHJlc2V0IGlmIGB0ZXh0Q29udGVudGAgaXMgbXV0YXRlZC4gIFdlIGNvdWxkIGFkZCBhIGNoZWNrIGluIHNldFRleHRDb250ZW50XG4gICAgLy8gdG8gb25seSBzZXQgdGhlIHZhbHVlIGlmL3doZW4gdGhlIHZhbHVlIGRpZmZlcnMgZnJvbSB0aGUgbm9kZSB2YWx1ZSAod2hpY2ggd291bGRcbiAgICAvLyBjb21wbGV0ZWx5IHNvbHZlIHRoaXMgSUU5IGJ1ZyksIGJ1dCBTZWJhc3RpYW4rQmVuIHNlZW1lZCB0byBsaWtlIHRoaXMgc29sdXRpb24uXG4gICAgLy8gVGhlIHZhbHVlIGNhbiBiZSBhIGJvb2xlYW4gb3Igb2JqZWN0IHNvIHRoYXQncyB3aHkgaXQncyBmb3JjZWQgdG8gYmUgYSBzdHJpbmcuXG4gICAgdmFyIGhvc3RQcm9wcyA9IF9hc3NpZ24oe30sIHByb3BzLCB7XG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgZGVmYXVsdFZhbHVlOiB1bmRlZmluZWQsXG4gICAgICBjaGlsZHJlbjogJycgKyBpbnN0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlLFxuICAgICAgb25DaGFuZ2U6IGluc3QuX3dyYXBwZXJTdGF0ZS5vbkNoYW5nZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhvc3RQcm9wcztcbiAgfSxcblxuICBtb3VudFdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0LCBwcm9wcykge1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgTGlua2VkVmFsdWVVdGlscy5jaGVja1Byb3BUeXBlcygndGV4dGFyZWEnLCBwcm9wcywgaW5zdC5fY3VycmVudEVsZW1lbnQuX293bmVyKTtcbiAgICAgIGlmIChwcm9wcy52YWx1ZUxpbmsgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlTGluaykge1xuICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdgdmFsdWVMaW5rYCBwcm9wIG9uIGB0ZXh0YXJlYWAgaXMgZGVwcmVjYXRlZDsgc2V0IGB2YWx1ZWAgYW5kIGBvbkNoYW5nZWAgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgICAgICAgZGlkV2FyblZhbHVlTGluayA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbERlZmF1bHRWYWwpIHtcbiAgICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVGV4dGFyZWEgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIHRleHRhcmVhICcgKyAnYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycpIDogdm9pZCAwO1xuICAgICAgICBkaWRXYXJuVmFsRGVmYXVsdFZhbCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHZhbHVlID0gTGlua2VkVmFsdWVVdGlscy5nZXRWYWx1ZShwcm9wcyk7XG4gICAgdmFyIGluaXRpYWxWYWx1ZSA9IHZhbHVlO1xuXG4gICAgLy8gT25seSBib3RoZXIgZmV0Y2hpbmcgZGVmYXVsdCB2YWx1ZSBpZiB3ZSdyZSBnb2luZyB0byB1c2UgaXRcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZTtcbiAgICAgIC8vIFRPRE8gKHl1bmdzdGVycyk6IFJlbW92ZSBzdXBwb3J0IGZvciBjaGlsZHJlbiBjb250ZW50IGluIDx0ZXh0YXJlYT4uXG4gICAgICB2YXIgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIGlmIChjaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBpbnN0ZWFkIG9mIHNldHRpbmcgJyArICdjaGlsZHJlbiBvbiA8dGV4dGFyZWE+LicpIDogdm9pZCAwO1xuICAgICAgICB9XG4gICAgICAgICEoZGVmYXVsdFZhbHVlID09IG51bGwpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdJZiB5b3Ugc3VwcGx5IGBkZWZhdWx0VmFsdWVgIG9uIGEgPHRleHRhcmVhPiwgZG8gbm90IHBhc3MgY2hpbGRyZW4uJykgOiBfcHJvZEludmFyaWFudCgnOTInKSA6IHZvaWQgMDtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgIShjaGlsZHJlbi5sZW5ndGggPD0gMSkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJzx0ZXh0YXJlYT4gY2FuIG9ubHkgaGF2ZSBhdCBtb3N0IG9uZSBjaGlsZC4nKSA6IF9wcm9kSW52YXJpYW50KCc5MycpIDogdm9pZCAwO1xuICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW5bMF07XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0VmFsdWUgPSAnJyArIGNoaWxkcmVuO1xuICAgICAgfVxuICAgICAgaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9ICcnO1xuICAgICAgfVxuICAgICAgaW5pdGlhbFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgIH1cblxuICAgIGluc3QuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICAgIGluaXRpYWxWYWx1ZTogJycgKyBpbml0aWFsVmFsdWUsXG4gICAgICBsaXN0ZW5lcnM6IG51bGwsXG4gICAgICBvbkNoYW5nZTogX2hhbmRsZUNoYW5nZS5iaW5kKGluc3QpXG4gICAgfTtcbiAgfSxcblxuICB1cGRhdGVXcmFwcGVyOiBmdW5jdGlvbiAoaW5zdCkge1xuICAgIHZhciBwcm9wcyA9IGluc3QuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuXG4gICAgdmFyIG5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtcbiAgICB2YXIgdmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTtcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgLy8gQ2FzdCBgdmFsdWVgIHRvIGEgc3RyaW5nIHRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgc2V0IGNvcnJlY3RseS4gV2hpbGVcbiAgICAgIC8vIGJyb3dzZXJzIHR5cGljYWxseSBkbyB0aGlzIGFzIG5lY2Vzc2FyeSwganNkb20gZG9lc24ndC5cbiAgICAgIHZhciBuZXdWYWx1ZSA9ICcnICsgdmFsdWU7XG5cbiAgICAgIC8vIFRvIGF2b2lkIHNpZGUgZWZmZWN0cyAoc3VjaCBhcyBsb3NpbmcgdGV4dCBzZWxlY3Rpb24pLCBvbmx5IHNldCB2YWx1ZSBpZiBjaGFuZ2VkXG4gICAgICBpZiAobmV3VmFsdWUgIT09IG5vZGUudmFsdWUpIHtcbiAgICAgICAgbm9kZS52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWU7XG4gICAgfVxuICB9LFxuXG4gIHBvc3RNb3VudFdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgLy8gVGhpcyBpcyBpbiBwb3N0TW91bnQgYmVjYXVzZSB3ZSBuZWVkIGFjY2VzcyB0byB0aGUgRE9NIG5vZGUsIHdoaWNoIGlzIG5vdFxuICAgIC8vIGF2YWlsYWJsZSB1bnRpbCBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBtb3VudGVkLlxuICAgIHZhciBub2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCk7XG4gICAgdmFyIHRleHRDb250ZW50ID0gbm9kZS50ZXh0Q29udGVudDtcblxuICAgIC8vIE9ubHkgc2V0IG5vZGUudmFsdWUgaWYgdGV4dENvbnRlbnQgaXMgZXF1YWwgdG8gdGhlIGV4cGVjdGVkXG4gICAgLy8gaW5pdGlhbCB2YWx1ZS4gSW4gSUUxMC9JRTExIHRoZXJlIGlzIGEgYnVnIHdoZXJlIHRoZSBwbGFjZWhvbGRlciBhdHRyaWJ1dGVcbiAgICAvLyB3aWxsIHBvcHVsYXRlIHRleHRDb250ZW50IGFzIHdlbGwuXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvMTAxNTI1L1xuICAgIGlmICh0ZXh0Q29udGVudCA9PT0gaW5zdC5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSkge1xuICAgICAgbm9kZS52YWx1ZSA9IHRleHRDb250ZW50O1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gX2hhbmRsZUNoYW5nZShldmVudCkge1xuICB2YXIgcHJvcHMgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztcbiAgdmFyIHJldHVyblZhbHVlID0gTGlua2VkVmFsdWVVdGlscy5leGVjdXRlT25DaGFuZ2UocHJvcHMsIGV2ZW50KTtcbiAgUmVhY3RVcGRhdGVzLmFzYXAoZm9yY2VVcGRhdGVJZk1vdW50ZWQsIHRoaXMpO1xuICByZXR1cm4gcmV0dXJuVmFsdWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01UZXh0YXJlYTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogUmV0dXJuIHRoZSBsb3dlc3QgY29tbW9uIGFuY2VzdG9yIG9mIEEgYW5kIEIsIG9yIG51bGwgaWYgdGhleSBhcmUgaW5cbiAqIGRpZmZlcmVudCB0cmVlcy5cbiAqL1xuZnVuY3Rpb24gZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoaW5zdEEsIGluc3RCKSB7XG4gICEoJ19ob3N0Tm9kZScgaW4gaW5zdEEpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdnZXROb2RlRnJvbUluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzMzJykgOiB2b2lkIDA7XG4gICEoJ19ob3N0Tm9kZScgaW4gaW5zdEIpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdnZXROb2RlRnJvbUluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzMzJykgOiB2b2lkIDA7XG5cbiAgdmFyIGRlcHRoQSA9IDA7XG4gIGZvciAodmFyIHRlbXBBID0gaW5zdEE7IHRlbXBBOyB0ZW1wQSA9IHRlbXBBLl9ob3N0UGFyZW50KSB7XG4gICAgZGVwdGhBKys7XG4gIH1cbiAgdmFyIGRlcHRoQiA9IDA7XG4gIGZvciAodmFyIHRlbXBCID0gaW5zdEI7IHRlbXBCOyB0ZW1wQiA9IHRlbXBCLl9ob3N0UGFyZW50KSB7XG4gICAgZGVwdGhCKys7XG4gIH1cblxuICAvLyBJZiBBIGlzIGRlZXBlciwgY3Jhd2wgdXAuXG4gIHdoaWxlIChkZXB0aEEgLSBkZXB0aEIgPiAwKSB7XG4gICAgaW5zdEEgPSBpbnN0QS5faG9zdFBhcmVudDtcbiAgICBkZXB0aEEtLTtcbiAgfVxuXG4gIC8vIElmIEIgaXMgZGVlcGVyLCBjcmF3bCB1cC5cbiAgd2hpbGUgKGRlcHRoQiAtIGRlcHRoQSA+IDApIHtcbiAgICBpbnN0QiA9IGluc3RCLl9ob3N0UGFyZW50O1xuICAgIGRlcHRoQi0tO1xuICB9XG5cbiAgLy8gV2FsayBpbiBsb2Nrc3RlcCB1bnRpbCB3ZSBmaW5kIGEgbWF0Y2guXG4gIHZhciBkZXB0aCA9IGRlcHRoQTtcbiAgd2hpbGUgKGRlcHRoLS0pIHtcbiAgICBpZiAoaW5zdEEgPT09IGluc3RCKSB7XG4gICAgICByZXR1cm4gaW5zdEE7XG4gICAgfVxuICAgIGluc3RBID0gaW5zdEEuX2hvc3RQYXJlbnQ7XG4gICAgaW5zdEIgPSBpbnN0Qi5faG9zdFBhcmVudDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBSZXR1cm4gaWYgQSBpcyBhbiBhbmNlc3RvciBvZiBCLlxuICovXG5mdW5jdGlvbiBpc0FuY2VzdG9yKGluc3RBLCBpbnN0Qikge1xuICAhKCdfaG9zdE5vZGUnIGluIGluc3RBKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnaXNBbmNlc3RvcjogSW52YWxpZCBhcmd1bWVudC4nKSA6IF9wcm9kSW52YXJpYW50KCczNScpIDogdm9pZCAwO1xuICAhKCdfaG9zdE5vZGUnIGluIGluc3RCKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnaXNBbmNlc3RvcjogSW52YWxpZCBhcmd1bWVudC4nKSA6IF9wcm9kSW52YXJpYW50KCczNScpIDogdm9pZCAwO1xuXG4gIHdoaWxlIChpbnN0Qikge1xuICAgIGlmIChpbnN0QiA9PT0gaW5zdEEpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpbnN0QiA9IGluc3RCLl9ob3N0UGFyZW50O1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIHBhcmVudCBpbnN0YW5jZSBvZiB0aGUgcGFzc2VkLWluIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBnZXRQYXJlbnRJbnN0YW5jZShpbnN0KSB7XG4gICEoJ19ob3N0Tm9kZScgaW4gaW5zdCkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2dldFBhcmVudEluc3RhbmNlOiBJbnZhbGlkIGFyZ3VtZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzM2JykgOiB2b2lkIDA7XG5cbiAgcmV0dXJuIGluc3QuX2hvc3RQYXJlbnQ7XG59XG5cbi8qKlxuICogU2ltdWxhdGVzIHRoZSB0cmF2ZXJzYWwgb2YgYSB0d28tcGhhc2UsIGNhcHR1cmUvYnViYmxlIGV2ZW50IGRpc3BhdGNoLlxuICovXG5mdW5jdGlvbiB0cmF2ZXJzZVR3b1BoYXNlKGluc3QsIGZuLCBhcmcpIHtcbiAgdmFyIHBhdGggPSBbXTtcbiAgd2hpbGUgKGluc3QpIHtcbiAgICBwYXRoLnB1c2goaW5zdCk7XG4gICAgaW5zdCA9IGluc3QuX2hvc3RQYXJlbnQ7XG4gIH1cbiAgdmFyIGk7XG4gIGZvciAoaSA9IHBhdGgubGVuZ3RoOyBpLS0gPiAwOykge1xuICAgIGZuKHBhdGhbaV0sICdjYXB0dXJlZCcsIGFyZyk7XG4gIH1cbiAgZm9yIChpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBmbihwYXRoW2ldLCAnYnViYmxlZCcsIGFyZyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcmF2ZXJzZXMgdGhlIElEIGhpZXJhcmNoeSBhbmQgaW52b2tlcyB0aGUgc3VwcGxpZWQgYGNiYCBvbiBhbnkgSURzIHRoYXRcbiAqIHNob3VsZCB3b3VsZCByZWNlaXZlIGEgYG1vdXNlRW50ZXJgIG9yIGBtb3VzZUxlYXZlYCBldmVudC5cbiAqXG4gKiBEb2VzIG5vdCBpbnZva2UgdGhlIGNhbGxiYWNrIG9uIHRoZSBuZWFyZXN0IGNvbW1vbiBhbmNlc3RvciBiZWNhdXNlIG5vdGhpbmdcbiAqIFwiZW50ZXJlZFwiIG9yIFwibGVmdFwiIHRoYXQgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gdHJhdmVyc2VFbnRlckxlYXZlKGZyb20sIHRvLCBmbiwgYXJnRnJvbSwgYXJnVG8pIHtcbiAgdmFyIGNvbW1vbiA9IGZyb20gJiYgdG8gPyBnZXRMb3dlc3RDb21tb25BbmNlc3Rvcihmcm9tLCB0bykgOiBudWxsO1xuICB2YXIgcGF0aEZyb20gPSBbXTtcbiAgd2hpbGUgKGZyb20gJiYgZnJvbSAhPT0gY29tbW9uKSB7XG4gICAgcGF0aEZyb20ucHVzaChmcm9tKTtcbiAgICBmcm9tID0gZnJvbS5faG9zdFBhcmVudDtcbiAgfVxuICB2YXIgcGF0aFRvID0gW107XG4gIHdoaWxlICh0byAmJiB0byAhPT0gY29tbW9uKSB7XG4gICAgcGF0aFRvLnB1c2godG8pO1xuICAgIHRvID0gdG8uX2hvc3RQYXJlbnQ7XG4gIH1cbiAgdmFyIGk7XG4gIGZvciAoaSA9IDA7IGkgPCBwYXRoRnJvbS5sZW5ndGg7IGkrKykge1xuICAgIGZuKHBhdGhGcm9tW2ldLCAnYnViYmxlZCcsIGFyZ0Zyb20pO1xuICB9XG4gIGZvciAoaSA9IHBhdGhUby5sZW5ndGg7IGktLSA+IDA7KSB7XG4gICAgZm4ocGF0aFRvW2ldLCAnY2FwdHVyZWQnLCBhcmdUbyk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzQW5jZXN0b3I6IGlzQW5jZXN0b3IsXG4gIGdldExvd2VzdENvbW1vbkFuY2VzdG9yOiBnZXRMb3dlc3RDb21tb25BbmNlc3RvcixcbiAgZ2V0UGFyZW50SW5zdGFuY2U6IGdldFBhcmVudEluc3RhbmNlLFxuICB0cmF2ZXJzZVR3b1BoYXNlOiB0cmF2ZXJzZVR3b1BoYXNlLFxuICB0cmF2ZXJzZUVudGVyTGVhdmU6IHRyYXZlcnNlRW50ZXJMZWF2ZVxufTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NUHJvcGVydHkgPSByZXF1aXJlKCcuL0RPTVByb3BlcnR5Jyk7XG52YXIgRXZlbnRQbHVnaW5SZWdpc3RyeSA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5SZWdpc3RyeScpO1xudmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDb21wb25lbnRUcmVlSG9vaycpO1xuXG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciByZWFjdFByb3BzID0ge1xuICAgIGNoaWxkcmVuOiB0cnVlLFxuICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB0cnVlLFxuICAgIGtleTogdHJ1ZSxcbiAgICByZWY6IHRydWUsXG5cbiAgICBhdXRvRm9jdXM6IHRydWUsXG4gICAgZGVmYXVsdFZhbHVlOiB0cnVlLFxuICAgIHZhbHVlTGluazogdHJ1ZSxcbiAgICBkZWZhdWx0Q2hlY2tlZDogdHJ1ZSxcbiAgICBjaGVja2VkTGluazogdHJ1ZSxcbiAgICBpbm5lckhUTUw6IHRydWUsXG4gICAgc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nOiB0cnVlLFxuICAgIG9uRm9jdXNJbjogdHJ1ZSxcbiAgICBvbkZvY3VzT3V0OiB0cnVlXG4gIH07XG4gIHZhciB3YXJuZWRQcm9wZXJ0aWVzID0ge307XG5cbiAgdmFyIHZhbGlkYXRlUHJvcGVydHkgPSBmdW5jdGlvbiAodGFnTmFtZSwgbmFtZSwgZGVidWdJRCkge1xuICAgIGlmIChET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG5hbWUpIHx8IERPTVByb3BlcnR5LmlzQ3VzdG9tQXR0cmlidXRlKG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHJlYWN0UHJvcHMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgcmVhY3RQcm9wc1tuYW1lXSB8fCB3YXJuZWRQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0gPSB0cnVlO1xuICAgIHZhciBsb3dlckNhc2VkTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIC8vIGRhdGEtKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBsb3dlcmNhc2U7IHN1Z2dlc3QgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uXG4gICAgdmFyIHN0YW5kYXJkTmFtZSA9IERPTVByb3BlcnR5LmlzQ3VzdG9tQXR0cmlidXRlKGxvd2VyQ2FzZWROYW1lKSA/IGxvd2VyQ2FzZWROYW1lIDogRE9NUHJvcGVydHkuZ2V0UG9zc2libGVTdGFuZGFyZE5hbWUuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gRE9NUHJvcGVydHkuZ2V0UG9zc2libGVTdGFuZGFyZE5hbWVbbG93ZXJDYXNlZE5hbWVdIDogbnVsbDtcblxuICAgIHZhciByZWdpc3RyYXRpb25OYW1lID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5wb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSA/IEV2ZW50UGx1Z2luUmVnaXN0cnkucG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gOiBudWxsO1xuXG4gICAgaWYgKHN0YW5kYXJkTmFtZSAhPSBudWxsKSB7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdVbmtub3duIERPTSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPyVzJywgbmFtZSwgc3RhbmRhcmROYW1lLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpKSA6IHZvaWQgMDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZSAhPSBudWxsKSB7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdVbmtub3duIGV2ZW50IGhhbmRsZXIgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiBgJXNgPyVzJywgbmFtZSwgcmVnaXN0cmF0aW9uTmFtZSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKSkgOiB2b2lkIDA7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gV2Ugd2VyZSB1bmFibGUgdG8gZ3Vlc3Mgd2hpY2ggcHJvcCB0aGUgdXNlciBpbnRlbmRlZC5cbiAgICAgIC8vIEl0IGlzIGxpa2VseSB0aGF0IHRoZSB1c2VyIHdhcyBqdXN0IGJsaW5kbHkgc3ByZWFkaW5nL2ZvcndhcmRpbmcgcHJvcHNcbiAgICAgIC8vIENvbXBvbmVudHMgc2hvdWxkIGJlIGNhcmVmdWwgdG8gb25seSByZW5kZXIgdmFsaWQgcHJvcHMvYXR0cmlidXRlcy5cbiAgICAgIC8vIFdhcm5pbmcgd2lsbCBiZSBpbnZva2VkIGluIHdhcm5Vbmtub3duUHJvcGVydGllcyB0byBhbGxvdyBncm91cGluZy5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG59XG5cbnZhciB3YXJuVW5rbm93blByb3BlcnRpZXMgPSBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCkge1xuICB2YXIgdW5rbm93blByb3BzID0gW107XG4gIGZvciAodmFyIGtleSBpbiBlbGVtZW50LnByb3BzKSB7XG4gICAgdmFyIGlzVmFsaWQgPSB2YWxpZGF0ZVByb3BlcnR5KGVsZW1lbnQudHlwZSwga2V5LCBkZWJ1Z0lEKTtcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIHVua25vd25Qcm9wcy5wdXNoKGtleSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHVua25vd25Qcm9wU3RyaW5nID0gdW5rbm93blByb3BzLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgIHJldHVybiAnYCcgKyBwcm9wICsgJ2AnO1xuICB9KS5qb2luKCcsICcpO1xuXG4gIGlmICh1bmtub3duUHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVW5rbm93biBwcm9wICVzIG9uIDwlcz4gdGFnLiBSZW1vdmUgdGhpcyBwcm9wIGZyb20gdGhlIGVsZW1lbnQuICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXVua25vd24tcHJvcCVzJywgdW5rbm93blByb3BTdHJpbmcsIGVsZW1lbnQudHlwZSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKSkgOiB2b2lkIDA7XG4gIH0gZWxzZSBpZiAodW5rbm93blByb3BzLmxlbmd0aCA+IDEpIHtcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdVbmtub3duIHByb3BzICVzIG9uIDwlcz4gdGFnLiBSZW1vdmUgdGhlc2UgcHJvcHMgZnJvbSB0aGUgZWxlbWVudC4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vZmIubWUvcmVhY3QtdW5rbm93bi1wcm9wJXMnLCB1bmtub3duUHJvcFN0cmluZywgZWxlbWVudC50eXBlLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpKSA6IHZvaWQgMDtcbiAgfVxufTtcblxuZnVuY3Rpb24gaGFuZGxlRWxlbWVudChkZWJ1Z0lELCBlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50ID09IG51bGwgfHwgdHlwZW9mIGVsZW1lbnQudHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGVsZW1lbnQudHlwZS5pbmRleE9mKCctJykgPj0gMCB8fCBlbGVtZW50LnByb3BzLmlzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHdhcm5Vbmtub3duUHJvcGVydGllcyhkZWJ1Z0lELCBlbGVtZW50KTtcbn1cblxudmFyIFJlYWN0RE9NVW5rbm93blByb3BlcnR5SG9vayA9IHtcbiAgb25CZWZvcmVNb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQsIGVsZW1lbnQpIHtcbiAgICBoYW5kbGVFbGVtZW50KGRlYnVnSUQsIGVsZW1lbnQpO1xuICB9LFxuICBvbkJlZm9yZVVwZGF0ZUNvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQsIGVsZW1lbnQpIHtcbiAgICBoYW5kbGVFbGVtZW50KGRlYnVnSUQsIGVsZW1lbnQpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NVW5rbm93blByb3BlcnR5SG9vazsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE2LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5pbmdIb29rID0gcmVxdWlyZSgnLi9SZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5pbmdIb29rJyk7XG52YXIgUmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2sgPSByZXF1aXJlKCcuL1JlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rJyk7XG52YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xuXG52YXIgcGVyZm9ybWFuY2VOb3cgPSByZXF1aXJlKCdmYmpzL2xpYi9wZXJmb3JtYW5jZU5vdycpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBob29rcyA9IFtdO1xudmFyIGRpZEhvb2tUaHJvd0ZvckV2ZW50ID0ge307XG5cbmZ1bmN0aW9uIGNhbGxIb29rKGV2ZW50LCBmbiwgY29udGV4dCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkge1xuICB0cnkge1xuICAgIGZuLmNhbGwoY29udGV4dCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZGlkSG9va1Rocm93Rm9yRXZlbnRbZXZlbnRdLCAnRXhjZXB0aW9uIHRocm93biBieSBob29rIHdoaWxlIGhhbmRsaW5nICVzOiAlcycsIGV2ZW50LCBlICsgJ1xcbicgKyBlLnN0YWNrKSA6IHZvaWQgMDtcbiAgICBkaWRIb29rVGhyb3dGb3JFdmVudFtldmVudF0gPSB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVtaXRFdmVudChldmVudCwgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGhvb2sgPSBob29rc1tpXTtcbiAgICB2YXIgZm4gPSBob29rW2V2ZW50XTtcbiAgICBpZiAoZm4pIHtcbiAgICAgIGNhbGxIb29rKGV2ZW50LCBmbiwgaG9vaywgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7XG4gICAgfVxuICB9XG59XG5cbnZhciBpc1Byb2ZpbGluZyA9IGZhbHNlO1xudmFyIGZsdXNoSGlzdG9yeSA9IFtdO1xudmFyIGxpZmVDeWNsZVRpbWVyU3RhY2sgPSBbXTtcbnZhciBjdXJyZW50Rmx1c2hOZXN0aW5nID0gMDtcbnZhciBjdXJyZW50Rmx1c2hNZWFzdXJlbWVudHMgPSBbXTtcbnZhciBjdXJyZW50Rmx1c2hTdGFydFRpbWUgPSAwO1xudmFyIGN1cnJlbnRUaW1lckRlYnVnSUQgPSBudWxsO1xudmFyIGN1cnJlbnRUaW1lclN0YXJ0VGltZSA9IDA7XG52YXIgY3VycmVudFRpbWVyTmVzdGVkRmx1c2hEdXJhdGlvbiA9IDA7XG52YXIgY3VycmVudFRpbWVyVHlwZSA9IG51bGw7XG5cbnZhciBsaWZlQ3ljbGVUaW1lckhhc1dhcm5lZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBjbGVhckhpc3RvcnkoKSB7XG4gIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sucHVyZ2VVbm1vdW50ZWRDb21wb25lbnRzKCk7XG4gIFJlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rLmNsZWFySGlzdG9yeSgpO1xufVxuXG5mdW5jdGlvbiBnZXRUcmVlU25hcHNob3QocmVnaXN0ZXJlZElEcykge1xuICByZXR1cm4gcmVnaXN0ZXJlZElEcy5yZWR1Y2UoZnVuY3Rpb24gKHRyZWUsIGlkKSB7XG4gICAgdmFyIG93bmVySUQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldE93bmVySUQoaWQpO1xuICAgIHZhciBwYXJlbnRJRCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0UGFyZW50SUQoaWQpO1xuICAgIHRyZWVbaWRdID0ge1xuICAgICAgZGlzcGxheU5hbWU6IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RGlzcGxheU5hbWUoaWQpLFxuICAgICAgdGV4dDogUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRUZXh0KGlkKSxcbiAgICAgIHVwZGF0ZUNvdW50OiBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFVwZGF0ZUNvdW50KGlkKSxcbiAgICAgIGNoaWxkSURzOiBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldENoaWxkSURzKGlkKSxcbiAgICAgIC8vIFRleHQgbm9kZXMgZG9uJ3QgaGF2ZSBvd25lcnMgYnV0IHRoaXMgaXMgY2xvc2UgZW5vdWdoLlxuICAgICAgb3duZXJJRDogb3duZXJJRCB8fCBwYXJlbnRJRCAmJiBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldE93bmVySUQocGFyZW50SUQpIHx8IDAsXG4gICAgICBwYXJlbnRJRDogcGFyZW50SURcbiAgICB9O1xuICAgIHJldHVybiB0cmVlO1xuICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIHJlc2V0TWVhc3VyZW1lbnRzKCkge1xuICB2YXIgcHJldmlvdXNTdGFydFRpbWUgPSBjdXJyZW50Rmx1c2hTdGFydFRpbWU7XG4gIHZhciBwcmV2aW91c01lYXN1cmVtZW50cyA9IGN1cnJlbnRGbHVzaE1lYXN1cmVtZW50cztcbiAgdmFyIHByZXZpb3VzT3BlcmF0aW9ucyA9IFJlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rLmdldEhpc3RvcnkoKTtcblxuICBpZiAoY3VycmVudEZsdXNoTmVzdGluZyA9PT0gMCkge1xuICAgIGN1cnJlbnRGbHVzaFN0YXJ0VGltZSA9IDA7XG4gICAgY3VycmVudEZsdXNoTWVhc3VyZW1lbnRzID0gW107XG4gICAgY2xlYXJIaXN0b3J5KCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHByZXZpb3VzTWVhc3VyZW1lbnRzLmxlbmd0aCB8fCBwcmV2aW91c09wZXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgdmFyIHJlZ2lzdGVyZWRJRHMgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFJlZ2lzdGVyZWRJRHMoKTtcbiAgICBmbHVzaEhpc3RvcnkucHVzaCh7XG4gICAgICBkdXJhdGlvbjogcGVyZm9ybWFuY2VOb3coKSAtIHByZXZpb3VzU3RhcnRUaW1lLFxuICAgICAgbWVhc3VyZW1lbnRzOiBwcmV2aW91c01lYXN1cmVtZW50cyB8fCBbXSxcbiAgICAgIG9wZXJhdGlvbnM6IHByZXZpb3VzT3BlcmF0aW9ucyB8fCBbXSxcbiAgICAgIHRyZWVTbmFwc2hvdDogZ2V0VHJlZVNuYXBzaG90KHJlZ2lzdGVyZWRJRHMpXG4gICAgfSk7XG4gIH1cblxuICBjbGVhckhpc3RvcnkoKTtcbiAgY3VycmVudEZsdXNoU3RhcnRUaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgY3VycmVudEZsdXNoTWVhc3VyZW1lbnRzID0gW107XG59XG5cbmZ1bmN0aW9uIGNoZWNrRGVidWdJRChkZWJ1Z0lEKSB7XG4gIHZhciBhbGxvd1Jvb3QgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuXG4gIGlmIChhbGxvd1Jvb3QgJiYgZGVidWdJRCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWRlYnVnSUQpIHtcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdSZWFjdERlYnVnVG9vbDogZGVidWdJRCBtYXkgbm90IGJlIGVtcHR5LicpIDogdm9pZCAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIGJlZ2luTGlmZUN5Y2xlVGltZXIoZGVidWdJRCwgdGltZXJUeXBlKSB7XG4gIGlmIChjdXJyZW50Rmx1c2hOZXN0aW5nID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChjdXJyZW50VGltZXJUeXBlICYmICFsaWZlQ3ljbGVUaW1lckhhc1dhcm5lZCkge1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1RoZXJlIGlzIGFuIGludGVybmFsIGVycm9yIGluIHRoZSBSZWFjdCBwZXJmb3JtYW5jZSBtZWFzdXJlbWVudCBjb2RlLiAnICsgJ0RpZCBub3QgZXhwZWN0ICVzIHRpbWVyIHRvIHN0YXJ0IHdoaWxlICVzIHRpbWVyIGlzIHN0aWxsIGluICcgKyAncHJvZ3Jlc3MgZm9yICVzIGluc3RhbmNlLicsIHRpbWVyVHlwZSwgY3VycmVudFRpbWVyVHlwZSB8fCAnbm8nLCBkZWJ1Z0lEID09PSBjdXJyZW50VGltZXJEZWJ1Z0lEID8gJ3RoZSBzYW1lJyA6ICdhbm90aGVyJykgOiB2b2lkIDA7XG4gICAgbGlmZUN5Y2xlVGltZXJIYXNXYXJuZWQgPSB0cnVlO1xuICB9XG4gIGN1cnJlbnRUaW1lclN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlTm93KCk7XG4gIGN1cnJlbnRUaW1lck5lc3RlZEZsdXNoRHVyYXRpb24gPSAwO1xuICBjdXJyZW50VGltZXJEZWJ1Z0lEID0gZGVidWdJRDtcbiAgY3VycmVudFRpbWVyVHlwZSA9IHRpbWVyVHlwZTtcbn1cblxuZnVuY3Rpb24gZW5kTGlmZUN5Y2xlVGltZXIoZGVidWdJRCwgdGltZXJUeXBlKSB7XG4gIGlmIChjdXJyZW50Rmx1c2hOZXN0aW5nID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChjdXJyZW50VGltZXJUeXBlICE9PSB0aW1lclR5cGUgJiYgIWxpZmVDeWNsZVRpbWVySGFzV2FybmVkKSB7XG4gICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVGhlcmUgaXMgYW4gaW50ZXJuYWwgZXJyb3IgaW4gdGhlIFJlYWN0IHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IGNvZGUuICcgKyAnV2UgZGlkIG5vdCBleHBlY3QgJXMgdGltZXIgdG8gc3RvcCB3aGlsZSAlcyB0aW1lciBpcyBzdGlsbCBpbiAnICsgJ3Byb2dyZXNzIGZvciAlcyBpbnN0YW5jZS4gUGxlYXNlIHJlcG9ydCB0aGlzIGFzIGEgYnVnIGluIFJlYWN0LicsIHRpbWVyVHlwZSwgY3VycmVudFRpbWVyVHlwZSB8fCAnbm8nLCBkZWJ1Z0lEID09PSBjdXJyZW50VGltZXJEZWJ1Z0lEID8gJ3RoZSBzYW1lJyA6ICdhbm90aGVyJykgOiB2b2lkIDA7XG4gICAgbGlmZUN5Y2xlVGltZXJIYXNXYXJuZWQgPSB0cnVlO1xuICB9XG4gIGlmIChpc1Byb2ZpbGluZykge1xuICAgIGN1cnJlbnRGbHVzaE1lYXN1cmVtZW50cy5wdXNoKHtcbiAgICAgIHRpbWVyVHlwZTogdGltZXJUeXBlLFxuICAgICAgaW5zdGFuY2VJRDogZGVidWdJRCxcbiAgICAgIGR1cmF0aW9uOiBwZXJmb3JtYW5jZU5vdygpIC0gY3VycmVudFRpbWVyU3RhcnRUaW1lIC0gY3VycmVudFRpbWVyTmVzdGVkRmx1c2hEdXJhdGlvblxuICAgIH0pO1xuICB9XG4gIGN1cnJlbnRUaW1lclN0YXJ0VGltZSA9IDA7XG4gIGN1cnJlbnRUaW1lck5lc3RlZEZsdXNoRHVyYXRpb24gPSAwO1xuICBjdXJyZW50VGltZXJEZWJ1Z0lEID0gbnVsbDtcbiAgY3VycmVudFRpbWVyVHlwZSA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHBhdXNlQ3VycmVudExpZmVDeWNsZVRpbWVyKCkge1xuICB2YXIgY3VycmVudFRpbWVyID0ge1xuICAgIHN0YXJ0VGltZTogY3VycmVudFRpbWVyU3RhcnRUaW1lLFxuICAgIG5lc3RlZEZsdXNoU3RhcnRUaW1lOiBwZXJmb3JtYW5jZU5vdygpLFxuICAgIGRlYnVnSUQ6IGN1cnJlbnRUaW1lckRlYnVnSUQsXG4gICAgdGltZXJUeXBlOiBjdXJyZW50VGltZXJUeXBlXG4gIH07XG4gIGxpZmVDeWNsZVRpbWVyU3RhY2sucHVzaChjdXJyZW50VGltZXIpO1xuICBjdXJyZW50VGltZXJTdGFydFRpbWUgPSAwO1xuICBjdXJyZW50VGltZXJOZXN0ZWRGbHVzaER1cmF0aW9uID0gMDtcbiAgY3VycmVudFRpbWVyRGVidWdJRCA9IG51bGw7XG4gIGN1cnJlbnRUaW1lclR5cGUgPSBudWxsO1xufVxuXG5mdW5jdGlvbiByZXN1bWVDdXJyZW50TGlmZUN5Y2xlVGltZXIoKSB7XG4gIHZhciBfbGlmZUN5Y2xlVGltZXJTdGFjayQgPSBsaWZlQ3ljbGVUaW1lclN0YWNrLnBvcCgpLFxuICAgICAgc3RhcnRUaW1lID0gX2xpZmVDeWNsZVRpbWVyU3RhY2skLnN0YXJ0VGltZSxcbiAgICAgIG5lc3RlZEZsdXNoU3RhcnRUaW1lID0gX2xpZmVDeWNsZVRpbWVyU3RhY2skLm5lc3RlZEZsdXNoU3RhcnRUaW1lLFxuICAgICAgZGVidWdJRCA9IF9saWZlQ3ljbGVUaW1lclN0YWNrJC5kZWJ1Z0lELFxuICAgICAgdGltZXJUeXBlID0gX2xpZmVDeWNsZVRpbWVyU3RhY2skLnRpbWVyVHlwZTtcblxuICB2YXIgbmVzdGVkRmx1c2hEdXJhdGlvbiA9IHBlcmZvcm1hbmNlTm93KCkgLSBuZXN0ZWRGbHVzaFN0YXJ0VGltZTtcbiAgY3VycmVudFRpbWVyU3RhcnRUaW1lID0gc3RhcnRUaW1lO1xuICBjdXJyZW50VGltZXJOZXN0ZWRGbHVzaER1cmF0aW9uICs9IG5lc3RlZEZsdXNoRHVyYXRpb247XG4gIGN1cnJlbnRUaW1lckRlYnVnSUQgPSBkZWJ1Z0lEO1xuICBjdXJyZW50VGltZXJUeXBlID0gdGltZXJUeXBlO1xufVxuXG52YXIgbGFzdE1hcmtUaW1lU3RhbXAgPSAwO1xudmFyIGNhblVzZVBlcmZvcm1hbmNlTWVhc3VyZSA9IHR5cGVvZiBwZXJmb3JtYW5jZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLm1hcmsgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLmNsZWFyTWFya3MgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLm1lYXN1cmUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHBlcmZvcm1hbmNlLmNsZWFyTWVhc3VyZXMgPT09ICdmdW5jdGlvbic7XG5cbmZ1bmN0aW9uIHNob3VsZE1hcmsoZGVidWdJRCkge1xuICBpZiAoIWlzUHJvZmlsaW5nIHx8ICFjYW5Vc2VQZXJmb3JtYW5jZU1lYXN1cmUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGVsZW1lbnQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEVsZW1lbnQoZGVidWdJRCk7XG4gIGlmIChlbGVtZW50ID09IG51bGwgfHwgdHlwZW9mIGVsZW1lbnQgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBpc0hvc3RFbGVtZW50ID0gdHlwZW9mIGVsZW1lbnQudHlwZSA9PT0gJ3N0cmluZyc7XG4gIGlmIChpc0hvc3RFbGVtZW50KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBtYXJrQmVnaW4oZGVidWdJRCwgbWFya1R5cGUpIHtcbiAgaWYgKCFzaG91bGRNYXJrKGRlYnVnSUQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIG1hcmtOYW1lID0gZGVidWdJRCArICc6OicgKyBtYXJrVHlwZTtcbiAgbGFzdE1hcmtUaW1lU3RhbXAgPSBwZXJmb3JtYW5jZU5vdygpO1xuICBwZXJmb3JtYW5jZS5tYXJrKG1hcmtOYW1lKTtcbn1cblxuZnVuY3Rpb24gbWFya0VuZChkZWJ1Z0lELCBtYXJrVHlwZSkge1xuICBpZiAoIXNob3VsZE1hcmsoZGVidWdJRCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbWFya05hbWUgPSBkZWJ1Z0lEICsgJzo6JyArIG1hcmtUeXBlO1xuICB2YXIgZGlzcGxheU5hbWUgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldERpc3BsYXlOYW1lKGRlYnVnSUQpIHx8ICdVbmtub3duJztcblxuICAvLyBDaHJvbWUgaGFzIGFuIGlzc3VlIG9mIGRyb3BwaW5nIG1hcmtlcnMgcmVjb3JkZWQgdG9vIGZhc3Q6XG4gIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTY0MDY1MlxuICAvLyBUbyB3b3JrIGFyb3VuZCB0aGlzLCB3ZSB3aWxsIG5vdCByZXBvcnQgdmVyeSBzbWFsbCBtZWFzdXJlbWVudHMuXG4gIC8vIEkgZGV0ZXJtaW5lZCB0aGUgbWFnaWMgbnVtYmVyIGJ5IHR3ZWFraW5nIGl0IGJhY2sgYW5kIGZvcnRoLlxuICAvLyAwLjA1bXMgd2FzIGVub3VnaCB0byBwcmV2ZW50IHRoZSBpc3N1ZSwgYnV0IEkgc2V0IGl0IHRvIDAuMW1zIHRvIGJlIHNhZmUuXG4gIC8vIFdoZW4gdGhlIGJ1ZyBpcyBmaXhlZCwgd2UgY2FuIGBtZWFzdXJlKClgIHVuY29uZGl0aW9uYWxseSBpZiB3ZSB3YW50IHRvLlxuICB2YXIgdGltZVN0YW1wID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgaWYgKHRpbWVTdGFtcCAtIGxhc3RNYXJrVGltZVN0YW1wID4gMC4xKSB7XG4gICAgdmFyIG1lYXN1cmVtZW50TmFtZSA9IGRpc3BsYXlOYW1lICsgJyBbJyArIG1hcmtUeXBlICsgJ10nO1xuICAgIHBlcmZvcm1hbmNlLm1lYXN1cmUobWVhc3VyZW1lbnROYW1lLCBtYXJrTmFtZSk7XG4gIH1cblxuICBwZXJmb3JtYW5jZS5jbGVhck1hcmtzKG1hcmtOYW1lKTtcbiAgcGVyZm9ybWFuY2UuY2xlYXJNZWFzdXJlcyhtZWFzdXJlbWVudE5hbWUpO1xufVxuXG52YXIgUmVhY3REZWJ1Z1Rvb2wgPSB7XG4gIGFkZEhvb2s6IGZ1bmN0aW9uIChob29rKSB7XG4gICAgaG9va3MucHVzaChob29rKTtcbiAgfSxcbiAgcmVtb3ZlSG9vazogZnVuY3Rpb24gKGhvb2spIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaG9va3NbaV0gPT09IGhvb2spIHtcbiAgICAgICAgaG9va3Muc3BsaWNlKGksIDEpO1xuICAgICAgICBpLS07XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBpc1Byb2ZpbGluZzogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBpc1Byb2ZpbGluZztcbiAgfSxcbiAgYmVnaW5Qcm9maWxpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoaXNQcm9maWxpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpc1Byb2ZpbGluZyA9IHRydWU7XG4gICAgZmx1c2hIaXN0b3J5Lmxlbmd0aCA9IDA7XG4gICAgcmVzZXRNZWFzdXJlbWVudHMoKTtcbiAgICBSZWFjdERlYnVnVG9vbC5hZGRIb29rKFJlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rKTtcbiAgfSxcbiAgZW5kUHJvZmlsaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFpc1Byb2ZpbGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlzUHJvZmlsaW5nID0gZmFsc2U7XG4gICAgcmVzZXRNZWFzdXJlbWVudHMoKTtcbiAgICBSZWFjdERlYnVnVG9vbC5yZW1vdmVIb29rKFJlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rKTtcbiAgfSxcbiAgZ2V0Rmx1c2hIaXN0b3J5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGZsdXNoSGlzdG9yeTtcbiAgfSxcbiAgb25CZWdpbkZsdXNoOiBmdW5jdGlvbiAoKSB7XG4gICAgY3VycmVudEZsdXNoTmVzdGluZysrO1xuICAgIHJlc2V0TWVhc3VyZW1lbnRzKCk7XG4gICAgcGF1c2VDdXJyZW50TGlmZUN5Y2xlVGltZXIoKTtcbiAgICBlbWl0RXZlbnQoJ29uQmVnaW5GbHVzaCcpO1xuICB9LFxuICBvbkVuZEZsdXNoOiBmdW5jdGlvbiAoKSB7XG4gICAgcmVzZXRNZWFzdXJlbWVudHMoKTtcbiAgICBjdXJyZW50Rmx1c2hOZXN0aW5nLS07XG4gICAgcmVzdW1lQ3VycmVudExpZmVDeWNsZVRpbWVyKCk7XG4gICAgZW1pdEV2ZW50KCdvbkVuZEZsdXNoJyk7XG4gIH0sXG4gIG9uQmVnaW5MaWZlQ3ljbGVUaW1lcjogZnVuY3Rpb24gKGRlYnVnSUQsIHRpbWVyVHlwZSkge1xuICAgIGNoZWNrRGVidWdJRChkZWJ1Z0lEKTtcbiAgICBlbWl0RXZlbnQoJ29uQmVnaW5MaWZlQ3ljbGVUaW1lcicsIGRlYnVnSUQsIHRpbWVyVHlwZSk7XG4gICAgbWFya0JlZ2luKGRlYnVnSUQsIHRpbWVyVHlwZSk7XG4gICAgYmVnaW5MaWZlQ3ljbGVUaW1lcihkZWJ1Z0lELCB0aW1lclR5cGUpO1xuICB9LFxuICBvbkVuZExpZmVDeWNsZVRpbWVyOiBmdW5jdGlvbiAoZGVidWdJRCwgdGltZXJUeXBlKSB7XG4gICAgY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpO1xuICAgIGVuZExpZmVDeWNsZVRpbWVyKGRlYnVnSUQsIHRpbWVyVHlwZSk7XG4gICAgbWFya0VuZChkZWJ1Z0lELCB0aW1lclR5cGUpO1xuICAgIGVtaXRFdmVudCgnb25FbmRMaWZlQ3ljbGVUaW1lcicsIGRlYnVnSUQsIHRpbWVyVHlwZSk7XG4gIH0sXG4gIG9uQmVnaW5Qcm9jZXNzaW5nQ2hpbGRDb250ZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgZW1pdEV2ZW50KCdvbkJlZ2luUHJvY2Vzc2luZ0NoaWxkQ29udGV4dCcpO1xuICB9LFxuICBvbkVuZFByb2Nlc3NpbmdDaGlsZENvbnRleHQ6IGZ1bmN0aW9uICgpIHtcbiAgICBlbWl0RXZlbnQoJ29uRW5kUHJvY2Vzc2luZ0NoaWxkQ29udGV4dCcpO1xuICB9LFxuICBvbkhvc3RPcGVyYXRpb246IGZ1bmN0aW9uIChvcGVyYXRpb24pIHtcbiAgICBjaGVja0RlYnVnSUQob3BlcmF0aW9uLmluc3RhbmNlSUQpO1xuICAgIGVtaXRFdmVudCgnb25Ib3N0T3BlcmF0aW9uJywgb3BlcmF0aW9uKTtcbiAgfSxcbiAgb25TZXRTdGF0ZTogZnVuY3Rpb24gKCkge1xuICAgIGVtaXRFdmVudCgnb25TZXRTdGF0ZScpO1xuICB9LFxuICBvblNldENoaWxkcmVuOiBmdW5jdGlvbiAoZGVidWdJRCwgY2hpbGREZWJ1Z0lEcykge1xuICAgIGNoZWNrRGVidWdJRChkZWJ1Z0lEKTtcbiAgICBjaGlsZERlYnVnSURzLmZvckVhY2goY2hlY2tEZWJ1Z0lEKTtcbiAgICBlbWl0RXZlbnQoJ29uU2V0Q2hpbGRyZW4nLCBkZWJ1Z0lELCBjaGlsZERlYnVnSURzKTtcbiAgfSxcbiAgb25CZWZvcmVNb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQsIGVsZW1lbnQsIHBhcmVudERlYnVnSUQpIHtcbiAgICBjaGVja0RlYnVnSUQoZGVidWdJRCk7XG4gICAgY2hlY2tEZWJ1Z0lEKHBhcmVudERlYnVnSUQsIHRydWUpO1xuICAgIGVtaXRFdmVudCgnb25CZWZvcmVNb3VudENvbXBvbmVudCcsIGRlYnVnSUQsIGVsZW1lbnQsIHBhcmVudERlYnVnSUQpO1xuICAgIG1hcmtCZWdpbihkZWJ1Z0lELCAnbW91bnQnKTtcbiAgfSxcbiAgb25Nb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQpIHtcbiAgICBjaGVja0RlYnVnSUQoZGVidWdJRCk7XG4gICAgbWFya0VuZChkZWJ1Z0lELCAnbW91bnQnKTtcbiAgICBlbWl0RXZlbnQoJ29uTW91bnRDb21wb25lbnQnLCBkZWJ1Z0lEKTtcbiAgfSxcbiAgb25CZWZvcmVVcGRhdGVDb21wb25lbnQ6IGZ1bmN0aW9uIChkZWJ1Z0lELCBlbGVtZW50KSB7XG4gICAgY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpO1xuICAgIGVtaXRFdmVudCgnb25CZWZvcmVVcGRhdGVDb21wb25lbnQnLCBkZWJ1Z0lELCBlbGVtZW50KTtcbiAgICBtYXJrQmVnaW4oZGVidWdJRCwgJ3VwZGF0ZScpO1xuICB9LFxuICBvblVwZGF0ZUNvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQpIHtcbiAgICBjaGVja0RlYnVnSUQoZGVidWdJRCk7XG4gICAgbWFya0VuZChkZWJ1Z0lELCAndXBkYXRlJyk7XG4gICAgZW1pdEV2ZW50KCdvblVwZGF0ZUNvbXBvbmVudCcsIGRlYnVnSUQpO1xuICB9LFxuICBvbkJlZm9yZVVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChkZWJ1Z0lEKSB7XG4gICAgY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpO1xuICAgIGVtaXRFdmVudCgnb25CZWZvcmVVbm1vdW50Q29tcG9uZW50JywgZGVidWdJRCk7XG4gICAgbWFya0JlZ2luKGRlYnVnSUQsICd1bm1vdW50Jyk7XG4gIH0sXG4gIG9uVW5tb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQpIHtcbiAgICBjaGVja0RlYnVnSUQoZGVidWdJRCk7XG4gICAgbWFya0VuZChkZWJ1Z0lELCAndW5tb3VudCcpO1xuICAgIGVtaXRFdmVudCgnb25Vbm1vdW50Q29tcG9uZW50JywgZGVidWdJRCk7XG4gIH0sXG4gIG9uVGVzdEV2ZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgZW1pdEV2ZW50KCdvblRlc3RFdmVudCcpO1xuICB9XG59O1xuXG4vLyBUT0RPIHJlbW92ZSB0aGVzZSB3aGVuIFJOL3d3dyBnZXRzIHVwZGF0ZWRcblJlYWN0RGVidWdUb29sLmFkZERldnRvb2wgPSBSZWFjdERlYnVnVG9vbC5hZGRIb29rO1xuUmVhY3REZWJ1Z1Rvb2wucmVtb3ZlRGV2dG9vbCA9IFJlYWN0RGVidWdUb29sLnJlbW92ZUhvb2s7XG5cblJlYWN0RGVidWdUb29sLmFkZEhvb2soUmVhY3RJbnZhbGlkU2V0U3RhdGVXYXJuaW5nSG9vayk7XG5SZWFjdERlYnVnVG9vbC5hZGRIb29rKFJlYWN0Q29tcG9uZW50VHJlZUhvb2spO1xudmFyIHVybCA9IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSAmJiB3aW5kb3cubG9jYXRpb24uaHJlZiB8fCAnJztcbmlmICgvWz8mXXJlYWN0X3BlcmZcXGIvLnRlc3QodXJsKSkge1xuICBSZWFjdERlYnVnVG9vbC5iZWdpblByb2ZpbGluZygpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RGVidWdUb29sOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZXMnKTtcbnZhciBUcmFuc2FjdGlvbiA9IHJlcXVpcmUoJy4vVHJhbnNhY3Rpb24nKTtcblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG5cbnZhciBSRVNFVF9CQVRDSEVEX1VQREFURVMgPSB7XG4gIGluaXRpYWxpemU6IGVtcHR5RnVuY3Rpb24sXG4gIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneS5pc0JhdGNoaW5nVXBkYXRlcyA9IGZhbHNlO1xuICB9XG59O1xuXG52YXIgRkxVU0hfQkFUQ0hFRF9VUERBVEVTID0ge1xuICBpbml0aWFsaXplOiBlbXB0eUZ1bmN0aW9uLFxuICBjbG9zZTogUmVhY3RVcGRhdGVzLmZsdXNoQmF0Y2hlZFVwZGF0ZXMuYmluZChSZWFjdFVwZGF0ZXMpXG59O1xuXG52YXIgVFJBTlNBQ1RJT05fV1JBUFBFUlMgPSBbRkxVU0hfQkFUQ0hFRF9VUERBVEVTLCBSRVNFVF9CQVRDSEVEX1VQREFURVNdO1xuXG5mdW5jdGlvbiBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5VHJhbnNhY3Rpb24oKSB7XG4gIHRoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKTtcbn1cblxuX2Fzc2lnbihSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5VHJhbnNhY3Rpb24ucHJvdG90eXBlLCBUcmFuc2FjdGlvbiwge1xuICBnZXRUcmFuc2FjdGlvbldyYXBwZXJzOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFRSQU5TQUNUSU9OX1dSQVBQRVJTO1xuICB9XG59KTtcblxudmFyIHRyYW5zYWN0aW9uID0gbmV3IFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3lUcmFuc2FjdGlvbigpO1xuXG52YXIgUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneSA9IHtcbiAgaXNCYXRjaGluZ1VwZGF0ZXM6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBDYWxsIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBpbiBhIGNvbnRleHQgd2l0aGluIHdoaWNoIGNhbGxzIHRvIGBzZXRTdGF0ZWBcbiAgICogYW5kIGZyaWVuZHMgYXJlIGJhdGNoZWQgc3VjaCB0aGF0IGNvbXBvbmVudHMgYXJlbid0IHVwZGF0ZWQgdW5uZWNlc3NhcmlseS5cbiAgICovXG4gIGJhdGNoZWRVcGRhdGVzOiBmdW5jdGlvbiAoY2FsbGJhY2ssIGEsIGIsIGMsIGQsIGUpIHtcbiAgICB2YXIgYWxyZWFkeUJhdGNoaW5nVXBkYXRlcyA9IFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3kuaXNCYXRjaGluZ1VwZGF0ZXM7XG5cbiAgICBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5LmlzQmF0Y2hpbmdVcGRhdGVzID0gdHJ1ZTtcblxuICAgIC8vIFRoZSBjb2RlIGlzIHdyaXR0ZW4gdGhpcyB3YXkgdG8gYXZvaWQgZXh0cmEgYWxsb2NhdGlvbnNcbiAgICBpZiAoYWxyZWFkeUJhdGNoaW5nVXBkYXRlcykge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGEsIGIsIGMsIGQsIGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJhbnNhY3Rpb24ucGVyZm9ybShjYWxsYmFjaywgbnVsbCwgYSwgYiwgYywgZCwgZSk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3k7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEFSSUFET01Qcm9wZXJ0eUNvbmZpZyA9IHJlcXVpcmUoJy4vQVJJQURPTVByb3BlcnR5Q29uZmlnJyk7XG52YXIgQmVmb3JlSW5wdXRFdmVudFBsdWdpbiA9IHJlcXVpcmUoJy4vQmVmb3JlSW5wdXRFdmVudFBsdWdpbicpO1xudmFyIENoYW5nZUV2ZW50UGx1Z2luID0gcmVxdWlyZSgnLi9DaGFuZ2VFdmVudFBsdWdpbicpO1xudmFyIERlZmF1bHRFdmVudFBsdWdpbk9yZGVyID0gcmVxdWlyZSgnLi9EZWZhdWx0RXZlbnRQbHVnaW5PcmRlcicpO1xudmFyIEVudGVyTGVhdmVFdmVudFBsdWdpbiA9IHJlcXVpcmUoJy4vRW50ZXJMZWF2ZUV2ZW50UGx1Z2luJyk7XG52YXIgSFRNTERPTVByb3BlcnR5Q29uZmlnID0gcmVxdWlyZSgnLi9IVE1MRE9NUHJvcGVydHlDb25maWcnKTtcbnZhciBSZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudCA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnRCcm93c2VyRW52aXJvbm1lbnQnKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnQnKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xudmFyIFJlYWN0RE9NRW1wdHlDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0RE9NRW1wdHlDb21wb25lbnQnKTtcbnZhciBSZWFjdERPTVRyZWVUcmF2ZXJzYWwgPSByZXF1aXJlKCcuL1JlYWN0RE9NVHJlZVRyYXZlcnNhbCcpO1xudmFyIFJlYWN0RE9NVGV4dENvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RET01UZXh0Q29tcG9uZW50Jyk7XG52YXIgUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneSA9IHJlcXVpcmUoJy4vUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneScpO1xudmFyIFJlYWN0RXZlbnRMaXN0ZW5lciA9IHJlcXVpcmUoJy4vUmVhY3RFdmVudExpc3RlbmVyJyk7XG52YXIgUmVhY3RJbmplY3Rpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5qZWN0aW9uJyk7XG52YXIgUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbicpO1xudmFyIFNWR0RPTVByb3BlcnR5Q29uZmlnID0gcmVxdWlyZSgnLi9TVkdET01Qcm9wZXJ0eUNvbmZpZycpO1xudmFyIFNlbGVjdEV2ZW50UGx1Z2luID0gcmVxdWlyZSgnLi9TZWxlY3RFdmVudFBsdWdpbicpO1xudmFyIFNpbXBsZUV2ZW50UGx1Z2luID0gcmVxdWlyZSgnLi9TaW1wbGVFdmVudFBsdWdpbicpO1xuXG52YXIgYWxyZWFkeUluamVjdGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGluamVjdCgpIHtcbiAgaWYgKGFscmVhZHlJbmplY3RlZCkge1xuICAgIC8vIFRPRE86IFRoaXMgaXMgY3VycmVudGx5IHRydWUgYmVjYXVzZSB0aGVzZSBpbmplY3Rpb25zIGFyZSBzaGFyZWQgYmV0d2VlblxuICAgIC8vIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIgcGFja2FnZS4gVGhleSBzaG91bGQgYmUgYnVpbHQgaW5kZXBlbmRlbnRseVxuICAgIC8vIGFuZCBub3Qgc2hhcmUgYW55IGluamVjdGlvbiBzdGF0ZS4gVGhlbiB0aGlzIHByb2JsZW0gd2lsbCBiZSBzb2x2ZWQuXG4gICAgcmV0dXJuO1xuICB9XG4gIGFscmVhZHlJbmplY3RlZCA9IHRydWU7XG5cbiAgUmVhY3RJbmplY3Rpb24uRXZlbnRFbWl0dGVyLmluamVjdFJlYWN0RXZlbnRMaXN0ZW5lcihSZWFjdEV2ZW50TGlzdGVuZXIpO1xuXG4gIC8qKlxuICAgKiBJbmplY3QgbW9kdWxlcyBmb3IgcmVzb2x2aW5nIERPTSBoaWVyYXJjaHkgYW5kIHBsdWdpbiBvcmRlcmluZy5cbiAgICovXG4gIFJlYWN0SW5qZWN0aW9uLkV2ZW50UGx1Z2luSHViLmluamVjdEV2ZW50UGx1Z2luT3JkZXIoRGVmYXVsdEV2ZW50UGx1Z2luT3JkZXIpO1xuICBSZWFjdEluamVjdGlvbi5FdmVudFBsdWdpblV0aWxzLmluamVjdENvbXBvbmVudFRyZWUoUmVhY3RET01Db21wb25lbnRUcmVlKTtcbiAgUmVhY3RJbmplY3Rpb24uRXZlbnRQbHVnaW5VdGlscy5pbmplY3RUcmVlVHJhdmVyc2FsKFJlYWN0RE9NVHJlZVRyYXZlcnNhbCk7XG5cbiAgLyoqXG4gICAqIFNvbWUgaW1wb3J0YW50IGV2ZW50IHBsdWdpbnMgaW5jbHVkZWQgYnkgZGVmYXVsdCAod2l0aG91dCBoYXZpbmcgdG8gcmVxdWlyZVxuICAgKiB0aGVtKS5cbiAgICovXG4gIFJlYWN0SW5qZWN0aW9uLkV2ZW50UGx1Z2luSHViLmluamVjdEV2ZW50UGx1Z2luc0J5TmFtZSh7XG4gICAgU2ltcGxlRXZlbnRQbHVnaW46IFNpbXBsZUV2ZW50UGx1Z2luLFxuICAgIEVudGVyTGVhdmVFdmVudFBsdWdpbjogRW50ZXJMZWF2ZUV2ZW50UGx1Z2luLFxuICAgIENoYW5nZUV2ZW50UGx1Z2luOiBDaGFuZ2VFdmVudFBsdWdpbixcbiAgICBTZWxlY3RFdmVudFBsdWdpbjogU2VsZWN0RXZlbnRQbHVnaW4sXG4gICAgQmVmb3JlSW5wdXRFdmVudFBsdWdpbjogQmVmb3JlSW5wdXRFdmVudFBsdWdpblxuICB9KTtcblxuICBSZWFjdEluamVjdGlvbi5Ib3N0Q29tcG9uZW50LmluamVjdEdlbmVyaWNDb21wb25lbnRDbGFzcyhSZWFjdERPTUNvbXBvbmVudCk7XG5cbiAgUmVhY3RJbmplY3Rpb24uSG9zdENvbXBvbmVudC5pbmplY3RUZXh0Q29tcG9uZW50Q2xhc3MoUmVhY3RET01UZXh0Q29tcG9uZW50KTtcblxuICBSZWFjdEluamVjdGlvbi5ET01Qcm9wZXJ0eS5pbmplY3RET01Qcm9wZXJ0eUNvbmZpZyhBUklBRE9NUHJvcGVydHlDb25maWcpO1xuICBSZWFjdEluamVjdGlvbi5ET01Qcm9wZXJ0eS5pbmplY3RET01Qcm9wZXJ0eUNvbmZpZyhIVE1MRE9NUHJvcGVydHlDb25maWcpO1xuICBSZWFjdEluamVjdGlvbi5ET01Qcm9wZXJ0eS5pbmplY3RET01Qcm9wZXJ0eUNvbmZpZyhTVkdET01Qcm9wZXJ0eUNvbmZpZyk7XG5cbiAgUmVhY3RJbmplY3Rpb24uRW1wdHlDb21wb25lbnQuaW5qZWN0RW1wdHlDb21wb25lbnRGYWN0b3J5KGZ1bmN0aW9uIChpbnN0YW50aWF0ZSkge1xuICAgIHJldHVybiBuZXcgUmVhY3RET01FbXB0eUNvbXBvbmVudChpbnN0YW50aWF0ZSk7XG4gIH0pO1xuXG4gIFJlYWN0SW5qZWN0aW9uLlVwZGF0ZXMuaW5qZWN0UmVjb25jaWxlVHJhbnNhY3Rpb24oUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbik7XG4gIFJlYWN0SW5qZWN0aW9uLlVwZGF0ZXMuaW5qZWN0QmF0Y2hpbmdTdHJhdGVneShSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5KTtcblxuICBSZWFjdEluamVjdGlvbi5Db21wb25lbnQuaW5qZWN0RW52aXJvbm1lbnQoUmVhY3RDb21wb25lbnRCcm93c2VyRW52aXJvbm1lbnQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaW5qZWN0OiBpbmplY3Rcbn07IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyBUaGUgU3ltYm9sIHVzZWQgdG8gdGFnIHRoZSBSZWFjdEVsZW1lbnQgdHlwZS4gSWYgdGhlcmUgaXMgbm8gbmF0aXZlIFN5bWJvbFxuLy8gbm9yIHBvbHlmaWxsLCB0aGVuIGEgcGxhaW4gbnVtYmVyIGlzIHVzZWQgZm9yIHBlcmZvcm1hbmNlLlxuXG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2xbJ2ZvciddICYmIFN5bWJvbFsnZm9yJ10oJ3JlYWN0LmVsZW1lbnQnKSB8fCAweGVhYzc7XG5cbm1vZHVsZS5leHBvcnRzID0gUkVBQ1RfRUxFTUVOVF9UWVBFOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBlbXB0eUNvbXBvbmVudEZhY3Rvcnk7XG5cbnZhciBSZWFjdEVtcHR5Q29tcG9uZW50SW5qZWN0aW9uID0ge1xuICBpbmplY3RFbXB0eUNvbXBvbmVudEZhY3Rvcnk6IGZ1bmN0aW9uIChmYWN0b3J5KSB7XG4gICAgZW1wdHlDb21wb25lbnRGYWN0b3J5ID0gZmFjdG9yeTtcbiAgfVxufTtcblxudmFyIFJlYWN0RW1wdHlDb21wb25lbnQgPSB7XG4gIGNyZWF0ZTogZnVuY3Rpb24gKGluc3RhbnRpYXRlKSB7XG4gICAgcmV0dXJuIGVtcHR5Q29tcG9uZW50RmFjdG9yeShpbnN0YW50aWF0ZSk7XG4gIH1cbn07XG5cblJlYWN0RW1wdHlDb21wb25lbnQuaW5qZWN0aW9uID0gUmVhY3RFbXB0eUNvbXBvbmVudEluamVjdGlvbjtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEVtcHR5Q29tcG9uZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGNhdWdodEVycm9yID0gbnVsbDtcblxuLyoqXG4gKiBDYWxsIGEgZnVuY3Rpb24gd2hpbGUgZ3VhcmRpbmcgYWdhaW5zdCBlcnJvcnMgdGhhdCBoYXBwZW5zIHdpdGhpbiBpdC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBvZiB0aGUgZ3VhcmQgdG8gdXNlIGZvciBsb2dnaW5nIG9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaW52b2tlXG4gKiBAcGFyYW0geyp9IGEgRmlyc3QgYXJndW1lbnRcbiAqIEBwYXJhbSB7Kn0gYiBTZWNvbmQgYXJndW1lbnRcbiAqL1xuZnVuY3Rpb24gaW52b2tlR3VhcmRlZENhbGxiYWNrKG5hbWUsIGZ1bmMsIGEpIHtcbiAgdHJ5IHtcbiAgICBmdW5jKGEpO1xuICB9IGNhdGNoICh4KSB7XG4gICAgaWYgKGNhdWdodEVycm9yID09PSBudWxsKSB7XG4gICAgICBjYXVnaHRFcnJvciA9IHg7XG4gICAgfVxuICB9XG59XG5cbnZhciBSZWFjdEVycm9yVXRpbHMgPSB7XG4gIGludm9rZUd1YXJkZWRDYWxsYmFjazogaW52b2tlR3VhcmRlZENhbGxiYWNrLFxuXG4gIC8qKlxuICAgKiBJbnZva2VkIGJ5IFJlYWN0VGVzdFV0aWxzLlNpbXVsYXRlIHNvIHRoYXQgYW55IGVycm9ycyB0aHJvd24gYnkgdGhlIGV2ZW50XG4gICAqIGhhbmRsZXIgYXJlIHN1cmUgdG8gYmUgcmV0aHJvd24gYnkgcmV0aHJvd0NhdWdodEVycm9yLlxuICAgKi9cbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrV2l0aENhdGNoOiBpbnZva2VHdWFyZGVkQ2FsbGJhY2ssXG5cbiAgLyoqXG4gICAqIER1cmluZyBleGVjdXRpb24gb2YgZ3VhcmRlZCBmdW5jdGlvbnMgd2Ugd2lsbCBjYXB0dXJlIHRoZSBmaXJzdCBlcnJvciB3aGljaFxuICAgKiB3ZSB3aWxsIHJldGhyb3cgdG8gYmUgaGFuZGxlZCBieSB0aGUgdG9wIGxldmVsIGVycm9yIGhhbmRsZXIuXG4gICAqL1xuICByZXRocm93Q2F1Z2h0RXJyb3I6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoY2F1Z2h0RXJyb3IpIHtcbiAgICAgIHZhciBlcnJvciA9IGNhdWdodEVycm9yO1xuICAgICAgY2F1Z2h0RXJyb3IgPSBudWxsO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG59O1xuXG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgLyoqXG4gICAqIFRvIGhlbHAgZGV2ZWxvcG1lbnQgd2UgY2FuIGdldCBiZXR0ZXIgZGV2dG9vbHMgaW50ZWdyYXRpb24gYnkgc2ltdWxhdGluZyBhXG4gICAqIHJlYWwgYnJvd3NlciBldmVudC5cbiAgICovXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LmRpc3BhdGNoRXZlbnQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgZmFrZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdyZWFjdCcpO1xuICAgIFJlYWN0RXJyb3JVdGlscy5pbnZva2VHdWFyZGVkQ2FsbGJhY2sgPSBmdW5jdGlvbiAobmFtZSwgZnVuYywgYSkge1xuICAgICAgdmFyIGJvdW5kRnVuYyA9IGZ1bmMuYmluZChudWxsLCBhKTtcbiAgICAgIHZhciBldnRUeXBlID0gJ3JlYWN0LScgKyBuYW1lO1xuICAgICAgZmFrZU5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldnRUeXBlLCBib3VuZEZ1bmMsIGZhbHNlKTtcbiAgICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICAgIGV2dC5pbml0RXZlbnQoZXZ0VHlwZSwgZmFsc2UsIGZhbHNlKTtcbiAgICAgIGZha2VOb2RlLmRpc3BhdGNoRXZlbnQoZXZ0KTtcbiAgICAgIGZha2VOb2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZ0VHlwZSwgYm91bmRGdW5jLCBmYWxzZSk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RXJyb3JVdGlsczsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXZlbnRQbHVnaW5IdWIgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luSHViJyk7XG5cbmZ1bmN0aW9uIHJ1bkV2ZW50UXVldWVJbkJhdGNoKGV2ZW50cykge1xuICBFdmVudFBsdWdpbkh1Yi5lbnF1ZXVlRXZlbnRzKGV2ZW50cyk7XG4gIEV2ZW50UGx1Z2luSHViLnByb2Nlc3NFdmVudFF1ZXVlKGZhbHNlKTtcbn1cblxudmFyIFJlYWN0RXZlbnRFbWl0dGVyTWl4aW4gPSB7XG5cbiAgLyoqXG4gICAqIFN0cmVhbXMgYSBmaXJlZCB0b3AtbGV2ZWwgZXZlbnQgdG8gYEV2ZW50UGx1Z2luSHViYCB3aGVyZSBwbHVnaW5zIGhhdmUgdGhlXG4gICAqIG9wcG9ydHVuaXR5IHRvIGNyZWF0ZSBgUmVhY3RFdmVudGBzIHRvIGJlIGRpc3BhdGNoZWQuXG4gICAqL1xuICBoYW5kbGVUb3BMZXZlbDogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdmFyIGV2ZW50cyA9IEV2ZW50UGx1Z2luSHViLmV4dHJhY3RFdmVudHModG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIHJ1bkV2ZW50UXVldWVJbkJhdGNoKGV2ZW50cyk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RFdmVudEVtaXR0ZXJNaXhpbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIEV2ZW50TGlzdGVuZXIgPSByZXF1aXJlKCdmYmpzL2xpYi9FdmVudExpc3RlbmVyJyk7XG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xudmFyIFBvb2xlZENsYXNzID0gcmVxdWlyZSgnLi9Qb29sZWRDbGFzcycpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZXMnKTtcblxudmFyIGdldEV2ZW50VGFyZ2V0ID0gcmVxdWlyZSgnLi9nZXRFdmVudFRhcmdldCcpO1xudmFyIGdldFVuYm91bmRlZFNjcm9sbFBvc2l0aW9uID0gcmVxdWlyZSgnZmJqcy9saWIvZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb24nKTtcblxuLyoqXG4gKiBGaW5kIHRoZSBkZWVwZXN0IFJlYWN0IGNvbXBvbmVudCBjb21wbGV0ZWx5IGNvbnRhaW5pbmcgdGhlIHJvb3Qgb2YgdGhlXG4gKiBwYXNzZWQtaW4gaW5zdGFuY2UgKGZvciB1c2Ugd2hlbiBlbnRpcmUgUmVhY3QgdHJlZXMgYXJlIG5lc3RlZCB3aXRoaW4gZWFjaFxuICogb3RoZXIpLiBJZiBSZWFjdCB0cmVlcyBhcmUgbm90IG5lc3RlZCwgcmV0dXJucyBudWxsLlxuICovXG5mdW5jdGlvbiBmaW5kUGFyZW50KGluc3QpIHtcbiAgLy8gVE9ETzogSXQgbWF5IGJlIGEgZ29vZCBpZGVhIHRvIGNhY2hlIHRoaXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSBET01cbiAgLy8gdHJhdmVyc2FsLCBidXQgY2FjaGluZyBpcyBkaWZmaWN1bHQgdG8gZG8gY29ycmVjdGx5IHdpdGhvdXQgdXNpbmcgYVxuICAvLyBtdXRhdGlvbiBvYnNlcnZlciB0byBsaXN0ZW4gZm9yIGFsbCBET00gY2hhbmdlcy5cbiAgd2hpbGUgKGluc3QuX2hvc3RQYXJlbnQpIHtcbiAgICBpbnN0ID0gaW5zdC5faG9zdFBhcmVudDtcbiAgfVxuICB2YXIgcm9vdE5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtcbiAgdmFyIGNvbnRhaW5lciA9IHJvb3ROb2RlLnBhcmVudE5vZGU7XG4gIHJldHVybiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoY29udGFpbmVyKTtcbn1cblxuLy8gVXNlZCB0byBzdG9yZSBhbmNlc3RvciBoaWVyYXJjaHkgaW4gdG9wIGxldmVsIGNhbGxiYWNrXG5mdW5jdGlvbiBUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBpbmcodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkge1xuICB0aGlzLnRvcExldmVsVHlwZSA9IHRvcExldmVsVHlwZTtcbiAgdGhpcy5uYXRpdmVFdmVudCA9IG5hdGl2ZUV2ZW50O1xuICB0aGlzLmFuY2VzdG9ycyA9IFtdO1xufVxuX2Fzc2lnbihUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBpbmcucHJvdG90eXBlLCB7XG4gIGRlc3RydWN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnRvcExldmVsVHlwZSA9IG51bGw7XG4gICAgdGhpcy5uYXRpdmVFdmVudCA9IG51bGw7XG4gICAgdGhpcy5hbmNlc3RvcnMubGVuZ3RoID0gMDtcbiAgfVxufSk7XG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oVG9wTGV2ZWxDYWxsYmFja0Jvb2tLZWVwaW5nLCBQb29sZWRDbGFzcy50d29Bcmd1bWVudFBvb2xlcik7XG5cbmZ1bmN0aW9uIGhhbmRsZVRvcExldmVsSW1wbChib29rS2VlcGluZykge1xuICB2YXIgbmF0aXZlRXZlbnRUYXJnZXQgPSBnZXRFdmVudFRhcmdldChib29rS2VlcGluZy5uYXRpdmVFdmVudCk7XG4gIHZhciB0YXJnZXRJbnN0ID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICAvLyBMb29wIHRocm91Z2ggdGhlIGhpZXJhcmNoeSwgaW4gY2FzZSB0aGVyZSdzIGFueSBuZXN0ZWQgY29tcG9uZW50cy5cbiAgLy8gSXQncyBpbXBvcnRhbnQgdGhhdCB3ZSBidWlsZCB0aGUgYXJyYXkgb2YgYW5jZXN0b3JzIGJlZm9yZSBjYWxsaW5nIGFueVxuICAvLyBldmVudCBoYW5kbGVycywgYmVjYXVzZSBldmVudCBoYW5kbGVycyBjYW4gbW9kaWZ5IHRoZSBET00sIGxlYWRpbmcgdG9cbiAgLy8gaW5jb25zaXN0ZW5jaWVzIHdpdGggUmVhY3RNb3VudCdzIG5vZGUgY2FjaGUuIFNlZSAjMTEwNS5cbiAgdmFyIGFuY2VzdG9yID0gdGFyZ2V0SW5zdDtcbiAgZG8ge1xuICAgIGJvb2tLZWVwaW5nLmFuY2VzdG9ycy5wdXNoKGFuY2VzdG9yKTtcbiAgICBhbmNlc3RvciA9IGFuY2VzdG9yICYmIGZpbmRQYXJlbnQoYW5jZXN0b3IpO1xuICB9IHdoaWxlIChhbmNlc3Rvcik7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBib29rS2VlcGluZy5hbmNlc3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICB0YXJnZXRJbnN0ID0gYm9va0tlZXBpbmcuYW5jZXN0b3JzW2ldO1xuICAgIFJlYWN0RXZlbnRMaXN0ZW5lci5faGFuZGxlVG9wTGV2ZWwoYm9va0tlZXBpbmcudG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBib29rS2VlcGluZy5uYXRpdmVFdmVudCwgZ2V0RXZlbnRUYXJnZXQoYm9va0tlZXBpbmcubmF0aXZlRXZlbnQpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzY3JvbGxWYWx1ZU1vbml0b3IoY2IpIHtcbiAgdmFyIHNjcm9sbFBvc2l0aW9uID0gZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb24od2luZG93KTtcbiAgY2Ioc2Nyb2xsUG9zaXRpb24pO1xufVxuXG52YXIgUmVhY3RFdmVudExpc3RlbmVyID0ge1xuICBfZW5hYmxlZDogdHJ1ZSxcbiAgX2hhbmRsZVRvcExldmVsOiBudWxsLFxuXG4gIFdJTkRPV19IQU5ETEU6IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSA/IHdpbmRvdyA6IG51bGwsXG5cbiAgc2V0SGFuZGxlVG9wTGV2ZWw6IGZ1bmN0aW9uIChoYW5kbGVUb3BMZXZlbCkge1xuICAgIFJlYWN0RXZlbnRMaXN0ZW5lci5faGFuZGxlVG9wTGV2ZWwgPSBoYW5kbGVUb3BMZXZlbDtcbiAgfSxcblxuICBzZXRFbmFibGVkOiBmdW5jdGlvbiAoZW5hYmxlZCkge1xuICAgIFJlYWN0RXZlbnRMaXN0ZW5lci5fZW5hYmxlZCA9ICEhZW5hYmxlZDtcbiAgfSxcblxuICBpc0VuYWJsZWQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gUmVhY3RFdmVudExpc3RlbmVyLl9lbmFibGVkO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUcmFwcyB0b3AtbGV2ZWwgZXZlbnRzIGJ5IHVzaW5nIGV2ZW50IGJ1YmJsaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9wTGV2ZWxUeXBlIFJlY29yZCBmcm9tIGBFdmVudENvbnN0YW50c2AuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoYW5kbGVyQmFzZU5hbWUgRXZlbnQgbmFtZSAoZS5nLiBcImNsaWNrXCIpLlxuICAgKiBAcGFyYW0ge29iamVjdH0gZWxlbWVudCBFbGVtZW50IG9uIHdoaWNoIHRvIGF0dGFjaCBsaXN0ZW5lci5cbiAgICogQHJldHVybiB7P29iamVjdH0gQW4gb2JqZWN0IHdpdGggYSByZW1vdmUgZnVuY3Rpb24gd2hpY2ggd2lsbCBmb3JjZWZ1bGx5XG4gICAqICAgICAgICAgICAgICAgICAgcmVtb3ZlIHRoZSBsaXN0ZW5lci5cbiAgICogQGludGVybmFsXG4gICAqL1xuICB0cmFwQnViYmxlZEV2ZW50OiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCBoYW5kbGVyQmFzZU5hbWUsIGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gRXZlbnRMaXN0ZW5lci5saXN0ZW4oZWxlbWVudCwgaGFuZGxlckJhc2VOYW1lLCBSZWFjdEV2ZW50TGlzdGVuZXIuZGlzcGF0Y2hFdmVudC5iaW5kKG51bGwsIHRvcExldmVsVHlwZSkpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBUcmFwcyBhIHRvcC1sZXZlbCBldmVudCBieSB1c2luZyBldmVudCBjYXB0dXJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BMZXZlbFR5cGUgUmVjb3JkIGZyb20gYEV2ZW50Q29uc3RhbnRzYC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGhhbmRsZXJCYXNlTmFtZSBFdmVudCBuYW1lIChlLmcuIFwiY2xpY2tcIikuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBlbGVtZW50IEVsZW1lbnQgb24gd2hpY2ggdG8gYXR0YWNoIGxpc3RlbmVyLlxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBBbiBvYmplY3Qgd2l0aCBhIHJlbW92ZSBmdW5jdGlvbiB3aGljaCB3aWxsIGZvcmNlZnVsbHlcbiAgICogICAgICAgICAgICAgICAgICByZW1vdmUgdGhlIGxpc3RlbmVyLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHRyYXBDYXB0dXJlZEV2ZW50OiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCBoYW5kbGVyQmFzZU5hbWUsIGVsZW1lbnQpIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gRXZlbnRMaXN0ZW5lci5jYXB0dXJlKGVsZW1lbnQsIGhhbmRsZXJCYXNlTmFtZSwgUmVhY3RFdmVudExpc3RlbmVyLmRpc3BhdGNoRXZlbnQuYmluZChudWxsLCB0b3BMZXZlbFR5cGUpKTtcbiAgfSxcblxuICBtb25pdG9yU2Nyb2xsVmFsdWU6IGZ1bmN0aW9uIChyZWZyZXNoKSB7XG4gICAgdmFyIGNhbGxiYWNrID0gc2Nyb2xsVmFsdWVNb25pdG9yLmJpbmQobnVsbCwgcmVmcmVzaCk7XG4gICAgRXZlbnRMaXN0ZW5lci5saXN0ZW4od2luZG93LCAnc2Nyb2xsJywgY2FsbGJhY2spO1xuICB9LFxuXG4gIGRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSB7XG4gICAgaWYgKCFSZWFjdEV2ZW50TGlzdGVuZXIuX2VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYm9va0tlZXBpbmcgPSBUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBpbmcuZ2V0UG9vbGVkKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpO1xuICAgIHRyeSB7XG4gICAgICAvLyBFdmVudCBxdWV1ZSBiZWluZyBwcm9jZXNzZWQgaW4gdGhlIHNhbWUgY3ljbGUgYWxsb3dzXG4gICAgICAvLyBgcHJldmVudERlZmF1bHRgLlxuICAgICAgUmVhY3RVcGRhdGVzLmJhdGNoZWRVcGRhdGVzKGhhbmRsZVRvcExldmVsSW1wbCwgYm9va0tlZXBpbmcpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBpbmcucmVsZWFzZShib29rS2VlcGluZyk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RXZlbnRMaXN0ZW5lcjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdEZlYXR1cmVGbGFncyA9IHtcbiAgLy8gV2hlbiB0cnVlLCBjYWxsIGNvbnNvbGUudGltZSgpIGJlZm9yZSBhbmQgLnRpbWVFbmQoKSBhZnRlciBlYWNoIHRvcC1sZXZlbFxuICAvLyByZW5kZXIgKGJvdGggaW5pdGlhbCByZW5kZXJzIGFuZCB1cGRhdGVzKS4gVXNlZnVsIHdoZW4gbG9va2luZyBhdCBwcm9kLW1vZGVcbiAgLy8gdGltZWxpbmUgcHJvZmlsZXMgaW4gQ2hyb21lLCBmb3IgZXhhbXBsZS5cbiAgbG9nVG9wTGV2ZWxSZW5kZXJzOiBmYWxzZVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEZlYXR1cmVGbGFnczsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbnZhciBnZW5lcmljQ29tcG9uZW50Q2xhc3MgPSBudWxsO1xudmFyIHRleHRDb21wb25lbnRDbGFzcyA9IG51bGw7XG5cbnZhciBSZWFjdEhvc3RDb21wb25lbnRJbmplY3Rpb24gPSB7XG4gIC8vIFRoaXMgYWNjZXB0cyBhIGNsYXNzIHRoYXQgcmVjZWl2ZXMgdGhlIHRhZyBzdHJpbmcuIFRoaXMgaXMgYSBjYXRjaCBhbGxcbiAgLy8gdGhhdCBjYW4gcmVuZGVyIGFueSBraW5kIG9mIHRhZy5cbiAgaW5qZWN0R2VuZXJpY0NvbXBvbmVudENsYXNzOiBmdW5jdGlvbiAoY29tcG9uZW50Q2xhc3MpIHtcbiAgICBnZW5lcmljQ29tcG9uZW50Q2xhc3MgPSBjb21wb25lbnRDbGFzcztcbiAgfSxcbiAgLy8gVGhpcyBhY2NlcHRzIGEgdGV4dCBjb21wb25lbnQgY2xhc3MgdGhhdCB0YWtlcyB0aGUgdGV4dCBzdHJpbmcgdG8gYmVcbiAgLy8gcmVuZGVyZWQgYXMgcHJvcHMuXG4gIGluamVjdFRleHRDb21wb25lbnRDbGFzczogZnVuY3Rpb24gKGNvbXBvbmVudENsYXNzKSB7XG4gICAgdGV4dENvbXBvbmVudENsYXNzID0gY29tcG9uZW50Q2xhc3M7XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IGEgaG9zdCBpbnRlcm5hbCBjb21wb25lbnQgY2xhc3MgZm9yIGEgc3BlY2lmaWMgdGFnLlxuICpcbiAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIGNyZWF0ZS5cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSBUaGUgaW50ZXJuYWwgY2xhc3MgY29uc3RydWN0b3IgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUludGVybmFsQ29tcG9uZW50KGVsZW1lbnQpIHtcbiAgIWdlbmVyaWNDb21wb25lbnRDbGFzcyA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVGhlcmUgaXMgbm8gcmVnaXN0ZXJlZCBjb21wb25lbnQgZm9yIHRoZSB0YWcgJXMnLCBlbGVtZW50LnR5cGUpIDogX3Byb2RJbnZhcmlhbnQoJzExMScsIGVsZW1lbnQudHlwZSkgOiB2b2lkIDA7XG4gIHJldHVybiBuZXcgZ2VuZXJpY0NvbXBvbmVudENsYXNzKGVsZW1lbnQpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVhY3RUZXh0fSB0ZXh0XG4gKiBAcmV0dXJuIHtSZWFjdENvbXBvbmVudH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VGb3JUZXh0KHRleHQpIHtcbiAgcmV0dXJuIG5ldyB0ZXh0Q29tcG9uZW50Q2xhc3ModGV4dCk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY29tcG9uZW50XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc1RleHRDb21wb25lbnQoY29tcG9uZW50KSB7XG4gIHJldHVybiBjb21wb25lbnQgaW5zdGFuY2VvZiB0ZXh0Q29tcG9uZW50Q2xhc3M7XG59XG5cbnZhciBSZWFjdEhvc3RDb21wb25lbnQgPSB7XG4gIGNyZWF0ZUludGVybmFsQ29tcG9uZW50OiBjcmVhdGVJbnRlcm5hbENvbXBvbmVudCxcbiAgY3JlYXRlSW5zdGFuY2VGb3JUZXh0OiBjcmVhdGVJbnN0YW5jZUZvclRleHQsXG4gIGlzVGV4dENvbXBvbmVudDogaXNUZXh0Q29tcG9uZW50LFxuICBpbmplY3Rpb246IFJlYWN0SG9zdENvbXBvbmVudEluamVjdGlvblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEhvc3RDb21wb25lbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNi1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGlzdG9yeSA9IFtdO1xuXG52YXIgUmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2sgPSB7XG4gIG9uSG9zdE9wZXJhdGlvbjogZnVuY3Rpb24gKG9wZXJhdGlvbikge1xuICAgIGhpc3RvcnkucHVzaChvcGVyYXRpb24pO1xuICB9LFxuICBjbGVhckhpc3Rvcnk6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoUmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2suX3ByZXZlbnRDbGVhcmluZykge1xuICAgICAgLy8gU2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgdGVzdHMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaGlzdG9yeSA9IFtdO1xuICB9LFxuICBnZXRIaXN0b3J5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGhpc3Rvcnk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2s7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIERPTVByb3BlcnR5ID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eScpO1xudmFyIEV2ZW50UGx1Z2luSHViID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpbkh1YicpO1xudmFyIEV2ZW50UGx1Z2luVXRpbHMgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luVXRpbHMnKTtcbnZhciBSZWFjdENvbXBvbmVudEVudmlyb25tZW50ID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudEVudmlyb25tZW50Jyk7XG52YXIgUmVhY3RFbXB0eUNvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RFbXB0eUNvbXBvbmVudCcpO1xudmFyIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJy4vUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyJyk7XG52YXIgUmVhY3RIb3N0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdEhvc3RDb21wb25lbnQnKTtcbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xuXG52YXIgUmVhY3RJbmplY3Rpb24gPSB7XG4gIENvbXBvbmVudDogUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5pbmplY3Rpb24sXG4gIERPTVByb3BlcnR5OiBET01Qcm9wZXJ0eS5pbmplY3Rpb24sXG4gIEVtcHR5Q29tcG9uZW50OiBSZWFjdEVtcHR5Q29tcG9uZW50LmluamVjdGlvbixcbiAgRXZlbnRQbHVnaW5IdWI6IEV2ZW50UGx1Z2luSHViLmluamVjdGlvbixcbiAgRXZlbnRQbHVnaW5VdGlsczogRXZlbnRQbHVnaW5VdGlscy5pbmplY3Rpb24sXG4gIEV2ZW50RW1pdHRlcjogUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLmluamVjdGlvbixcbiAgSG9zdENvbXBvbmVudDogUmVhY3RIb3N0Q29tcG9uZW50LmluamVjdGlvbixcbiAgVXBkYXRlczogUmVhY3RVcGRhdGVzLmluamVjdGlvblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEluamVjdGlvbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RET01TZWxlY3Rpb24gPSByZXF1aXJlKCcuL1JlYWN0RE9NU2VsZWN0aW9uJyk7XG5cbnZhciBjb250YWluc05vZGUgPSByZXF1aXJlKCdmYmpzL2xpYi9jb250YWluc05vZGUnKTtcbnZhciBmb2N1c05vZGUgPSByZXF1aXJlKCdmYmpzL2xpYi9mb2N1c05vZGUnKTtcbnZhciBnZXRBY3RpdmVFbGVtZW50ID0gcmVxdWlyZSgnZmJqcy9saWIvZ2V0QWN0aXZlRWxlbWVudCcpO1xuXG5mdW5jdGlvbiBpc0luRG9jdW1lbnQobm9kZSkge1xuICByZXR1cm4gY29udGFpbnNOb2RlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgbm9kZSk7XG59XG5cbi8qKlxuICogQFJlYWN0SW5wdXRTZWxlY3Rpb246IFJlYWN0IGlucHV0IHNlbGVjdGlvbiBtb2R1bGUuIEJhc2VkIG9uIFNlbGVjdGlvbi5qcyxcbiAqIGJ1dCBtb2RpZmllZCB0byBiZSBzdWl0YWJsZSBmb3IgcmVhY3QgYW5kIGhhcyBhIGNvdXBsZSBvZiBidWcgZml4ZXMgKGRvZXNuJ3RcbiAqIGFzc3VtZSBidXR0b25zIGhhdmUgcmFuZ2Ugc2VsZWN0aW9ucyBhbGxvd2VkKS5cbiAqIElucHV0IHNlbGVjdGlvbiBtb2R1bGUgZm9yIFJlYWN0LlxuICovXG52YXIgUmVhY3RJbnB1dFNlbGVjdGlvbiA9IHtcblxuICBoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXM6IGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gbm9kZU5hbWUgJiYgKG5vZGVOYW1lID09PSAnaW5wdXQnICYmIGVsZW0udHlwZSA9PT0gJ3RleHQnIHx8IG5vZGVOYW1lID09PSAndGV4dGFyZWEnIHx8IGVsZW0uY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScpO1xuICB9LFxuXG4gIGdldFNlbGVjdGlvbkluZm9ybWF0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudCgpO1xuICAgIHJldHVybiB7XG4gICAgICBmb2N1c2VkRWxlbTogZm9jdXNlZEVsZW0sXG4gICAgICBzZWxlY3Rpb25SYW5nZTogUmVhY3RJbnB1dFNlbGVjdGlvbi5oYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZm9jdXNlZEVsZW0pID8gUmVhY3RJbnB1dFNlbGVjdGlvbi5nZXRTZWxlY3Rpb24oZm9jdXNlZEVsZW0pIDogbnVsbFxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIEByZXN0b3JlU2VsZWN0aW9uOiBJZiBhbnkgc2VsZWN0aW9uIGluZm9ybWF0aW9uIHdhcyBwb3RlbnRpYWxseSBsb3N0LFxuICAgKiByZXN0b3JlIGl0LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHBlcmZvcm1pbmcgb3BlcmF0aW9ucyB0aGF0IGNvdWxkIHJlbW92ZSBkb21cbiAgICogbm9kZXMgYW5kIHBsYWNlIHRoZW0gYmFjayBpbiwgcmVzdWx0aW5nIGluIGZvY3VzIGJlaW5nIGxvc3QuXG4gICAqL1xuICByZXN0b3JlU2VsZWN0aW9uOiBmdW5jdGlvbiAocHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbikge1xuICAgIHZhciBjdXJGb2N1c2VkRWxlbSA9IGdldEFjdGl2ZUVsZW1lbnQoKTtcbiAgICB2YXIgcHJpb3JGb2N1c2VkRWxlbSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uZm9jdXNlZEVsZW07XG4gICAgdmFyIHByaW9yU2VsZWN0aW9uUmFuZ2UgPSBwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uLnNlbGVjdGlvblJhbmdlO1xuICAgIGlmIChjdXJGb2N1c2VkRWxlbSAhPT0gcHJpb3JGb2N1c2VkRWxlbSAmJiBpc0luRG9jdW1lbnQocHJpb3JGb2N1c2VkRWxlbSkpIHtcbiAgICAgIGlmIChSZWFjdElucHV0U2VsZWN0aW9uLmhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgICAgICBSZWFjdElucHV0U2VsZWN0aW9uLnNldFNlbGVjdGlvbihwcmlvckZvY3VzZWRFbGVtLCBwcmlvclNlbGVjdGlvblJhbmdlKTtcbiAgICAgIH1cbiAgICAgIGZvY3VzTm9kZShwcmlvckZvY3VzZWRFbGVtKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBnZXRTZWxlY3Rpb246IEdldHMgdGhlIHNlbGVjdGlvbiBib3VuZHMgb2YgYSBmb2N1c2VkIHRleHRhcmVhLCBpbnB1dCBvclxuICAgKiBjb250ZW50RWRpdGFibGUgbm9kZS5cbiAgICogLUBpbnB1dDogTG9vayB1cCBzZWxlY3Rpb24gYm91bmRzIG9mIHRoaXMgaW5wdXRcbiAgICogLUByZXR1cm4ge3N0YXJ0OiBzZWxlY3Rpb25TdGFydCwgZW5kOiBzZWxlY3Rpb25FbmR9XG4gICAqL1xuICBnZXRTZWxlY3Rpb246IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgIHZhciBzZWxlY3Rpb247XG5cbiAgICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgICAgLy8gTW9kZXJuIGJyb3dzZXIgd2l0aCBpbnB1dCBvciB0ZXh0YXJlYS5cbiAgICAgIHNlbGVjdGlvbiA9IHtcbiAgICAgICAgc3RhcnQ6IGlucHV0LnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICBlbmQ6IGlucHV0LnNlbGVjdGlvbkVuZFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LnNlbGVjdGlvbiAmJiBpbnB1dC5ub2RlTmFtZSAmJiBpbnB1dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnKSB7XG4gICAgICAvLyBJRTggaW5wdXQuXG4gICAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtcbiAgICAgIC8vIFRoZXJlIGNhbiBvbmx5IGJlIG9uZSBzZWxlY3Rpb24gcGVyIGRvY3VtZW50IGluIElFLCBzbyBpdCBtdXN0XG4gICAgICAvLyBiZSBpbiBvdXIgZWxlbWVudC5cbiAgICAgIGlmIChyYW5nZS5wYXJlbnRFbGVtZW50KCkgPT09IGlucHV0KSB7XG4gICAgICAgIHNlbGVjdGlvbiA9IHtcbiAgICAgICAgICBzdGFydDogLXJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgLWlucHV0LnZhbHVlLmxlbmd0aCksXG4gICAgICAgICAgZW5kOiAtcmFuZ2UubW92ZUVuZCgnY2hhcmFjdGVyJywgLWlucHV0LnZhbHVlLmxlbmd0aClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ29udGVudCBlZGl0YWJsZSBvciBvbGQgSUUgdGV4dGFyZWEuXG4gICAgICBzZWxlY3Rpb24gPSBSZWFjdERPTVNlbGVjdGlvbi5nZXRPZmZzZXRzKGlucHV0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0aW9uIHx8IHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICB9LFxuXG4gIC8qKlxuICAgKiBAc2V0U2VsZWN0aW9uOiBTZXRzIHRoZSBzZWxlY3Rpb24gYm91bmRzIG9mIGEgdGV4dGFyZWEgb3IgaW5wdXQgYW5kIGZvY3VzZXNcbiAgICogdGhlIGlucHV0LlxuICAgKiAtQGlucHV0ICAgICBTZXQgc2VsZWN0aW9uIGJvdW5kcyBvZiB0aGlzIGlucHV0IG9yIHRleHRhcmVhXG4gICAqIC1Ab2Zmc2V0cyAgIE9iamVjdCBvZiBzYW1lIGZvcm0gdGhhdCBpcyByZXR1cm5lZCBmcm9tIGdldCpcbiAgICovXG4gIHNldFNlbGVjdGlvbjogZnVuY3Rpb24gKGlucHV0LCBvZmZzZXRzKSB7XG4gICAgdmFyIHN0YXJ0ID0gb2Zmc2V0cy5zdGFydDtcbiAgICB2YXIgZW5kID0gb2Zmc2V0cy5lbmQ7XG4gICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmQgPSBzdGFydDtcbiAgICB9XG5cbiAgICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBpbnB1dCkge1xuICAgICAgaW5wdXQuc2VsZWN0aW9uU3RhcnQgPSBzdGFydDtcbiAgICAgIGlucHV0LnNlbGVjdGlvbkVuZCA9IE1hdGgubWluKGVuZCwgaW5wdXQudmFsdWUubGVuZ3RoKTtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50LnNlbGVjdGlvbiAmJiBpbnB1dC5ub2RlTmFtZSAmJiBpbnB1dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnKSB7XG4gICAgICB2YXIgcmFuZ2UgPSBpbnB1dC5jcmVhdGVUZXh0UmFuZ2UoKTtcbiAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgcmFuZ2UubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCBzdGFydCk7XG4gICAgICByYW5nZS5tb3ZlRW5kKCdjaGFyYWN0ZXInLCBlbmQgLSBzdGFydCk7XG4gICAgICByYW5nZS5zZWxlY3QoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgUmVhY3RET01TZWxlY3Rpb24uc2V0T2Zmc2V0cyhpbnB1dCwgb2Zmc2V0cyk7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0SW5wdXRTZWxlY3Rpb247IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBgUmVhY3RJbnN0YW5jZU1hcGAgbWFpbnRhaW5zIGEgbWFwcGluZyBmcm9tIGEgcHVibGljIGZhY2luZyBzdGF0ZWZ1bFxuICogaW5zdGFuY2UgKGtleSkgYW5kIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAodmFsdWUpLiBUaGlzIGFsbG93cyBwdWJsaWNcbiAqIG1ldGhvZHMgdG8gYWNjZXB0IHRoZSB1c2VyIGZhY2luZyBpbnN0YW5jZSBhcyBhbiBhcmd1bWVudCBhbmQgbWFwIHRoZW0gYmFja1xuICogdG8gaW50ZXJuYWwgbWV0aG9kcy5cbiAqL1xuXG4vLyBUT0RPOiBSZXBsYWNlIHRoaXMgd2l0aCBFUzY6IHZhciBSZWFjdEluc3RhbmNlTWFwID0gbmV3IE1hcCgpO1xuXG52YXIgUmVhY3RJbnN0YW5jZU1hcCA9IHtcblxuICAvKipcbiAgICogVGhpcyBBUEkgc2hvdWxkIGJlIGNhbGxlZCBgZGVsZXRlYCBidXQgd2UnZCBoYXZlIHRvIG1ha2Ugc3VyZSB0byBhbHdheXNcbiAgICogdHJhbnNmb3JtIHRoZXNlIHRvIHN0cmluZ3MgZm9yIElFIHN1cHBvcnQuIFdoZW4gdGhpcyB0cmFuc2Zvcm0gaXMgZnVsbHlcbiAgICogc3VwcG9ydGVkIHdlIGNhbiByZW5hbWUgaXQuXG4gICAqL1xuICByZW1vdmU6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICBrZXkuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSA9IHVuZGVmaW5lZDtcbiAgfSxcblxuICBnZXQ6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4ga2V5Ll9yZWFjdEludGVybmFsSW5zdGFuY2U7XG4gIH0sXG5cbiAgaGFzOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGtleS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlICE9PSB1bmRlZmluZWQ7XG4gIH0sXG5cbiAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIGtleS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlID0gdmFsdWU7XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEluc3RhbmNlTWFwOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTYtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gVHJ1c3QgdGhlIGRldmVsb3BlciB0byBvbmx5IHVzZSBSZWFjdEluc3RydW1lbnRhdGlvbiB3aXRoIGEgX19ERVZfXyBjaGVja1xuXG52YXIgZGVidWdUb29sID0gbnVsbDtcblxuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdERlYnVnVG9vbCA9IHJlcXVpcmUoJy4vUmVhY3REZWJ1Z1Rvb2wnKTtcbiAgZGVidWdUb29sID0gUmVhY3REZWJ1Z1Rvb2w7XG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBkZWJ1Z1Rvb2w6IGRlYnVnVG9vbCB9OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTYtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgcHJvY2Vzc2luZ0NoaWxkQ29udGV4dCA9IGZhbHNlO1xuXG4gIHZhciB3YXJuSW52YWxpZFNldFN0YXRlID0gZnVuY3Rpb24gKCkge1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghcHJvY2Vzc2luZ0NoaWxkQ29udGV4dCwgJ3NldFN0YXRlKC4uLik6IENhbm5vdCBjYWxsIHNldFN0YXRlKCkgaW5zaWRlIGdldENoaWxkQ29udGV4dCgpJykgOiB2b2lkIDA7XG4gIH07XG59XG5cbnZhciBSZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5pbmdIb29rID0ge1xuICBvbkJlZ2luUHJvY2Vzc2luZ0NoaWxkQ29udGV4dDogZnVuY3Rpb24gKCkge1xuICAgIHByb2Nlc3NpbmdDaGlsZENvbnRleHQgPSB0cnVlO1xuICB9LFxuICBvbkVuZFByb2Nlc3NpbmdDaGlsZENvbnRleHQ6IGZ1bmN0aW9uICgpIHtcbiAgICBwcm9jZXNzaW5nQ2hpbGRDb250ZXh0ID0gZmFsc2U7XG4gIH0sXG4gIG9uU2V0U3RhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICB3YXJuSW52YWxpZFNldFN0YXRlKCk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RJbnZhbGlkU2V0U3RhdGVXYXJuaW5nSG9vazsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgYWRsZXIzMiA9IHJlcXVpcmUoJy4vYWRsZXIzMicpO1xuXG52YXIgVEFHX0VORCA9IC9cXC8/Pi87XG52YXIgQ09NTUVOVF9TVEFSVCA9IC9ePFxcIVxcLVxcLS87XG5cbnZhciBSZWFjdE1hcmt1cENoZWNrc3VtID0ge1xuICBDSEVDS1NVTV9BVFRSX05BTUU6ICdkYXRhLXJlYWN0LWNoZWNrc3VtJyxcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hcmt1cCBNYXJrdXAgc3RyaW5nXG4gICAqIEByZXR1cm4ge3N0cmluZ30gTWFya3VwIHN0cmluZyB3aXRoIGNoZWNrc3VtIGF0dHJpYnV0ZSBhdHRhY2hlZFxuICAgKi9cbiAgYWRkQ2hlY2tzdW1Ub01hcmt1cDogZnVuY3Rpb24gKG1hcmt1cCkge1xuICAgIHZhciBjaGVja3N1bSA9IGFkbGVyMzIobWFya3VwKTtcblxuICAgIC8vIEFkZCBjaGVja3N1bSAoaGFuZGxlIGJvdGggcGFyZW50IHRhZ3MsIGNvbW1lbnRzIGFuZCBzZWxmLWNsb3NpbmcgdGFncylcbiAgICBpZiAoQ09NTUVOVF9TVEFSVC50ZXN0KG1hcmt1cCkpIHtcbiAgICAgIHJldHVybiBtYXJrdXA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtYXJrdXAucmVwbGFjZShUQUdfRU5ELCAnICcgKyBSZWFjdE1hcmt1cENoZWNrc3VtLkNIRUNLU1VNX0FUVFJfTkFNRSArICc9XCInICsgY2hlY2tzdW0gKyAnXCIkJicpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1hcmt1cCB0byB1c2VcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBlbGVtZW50IHJvb3QgUmVhY3QgZWxlbWVudFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciBvciBub3QgdGhlIG1hcmt1cCBpcyB0aGUgc2FtZVxuICAgKi9cbiAgY2FuUmV1c2VNYXJrdXA6IGZ1bmN0aW9uIChtYXJrdXAsIGVsZW1lbnQpIHtcbiAgICB2YXIgZXhpc3RpbmdDaGVja3N1bSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFJlYWN0TWFya3VwQ2hlY2tzdW0uQ0hFQ0tTVU1fQVRUUl9OQU1FKTtcbiAgICBleGlzdGluZ0NoZWNrc3VtID0gZXhpc3RpbmdDaGVja3N1bSAmJiBwYXJzZUludChleGlzdGluZ0NoZWNrc3VtLCAxMCk7XG4gICAgdmFyIG1hcmt1cENoZWNrc3VtID0gYWRsZXIzMihtYXJrdXApO1xuICAgIHJldHVybiBtYXJrdXBDaGVja3N1bSA9PT0gZXhpc3RpbmdDaGVja3N1bTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdE1hcmt1cENoZWNrc3VtOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBET01MYXp5VHJlZSA9IHJlcXVpcmUoJy4vRE9NTGF6eVRyZWUnKTtcbnZhciBET01Qcm9wZXJ0eSA9IHJlcXVpcmUoJy4vRE9NUHJvcGVydHknKTtcbnZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdCcpO1xudmFyIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJy4vUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyJyk7XG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDdXJyZW50T3duZXInKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xudmFyIFJlYWN0RE9NQ29udGFpbmVySW5mbyA9IHJlcXVpcmUoJy4vUmVhY3RET01Db250YWluZXJJbmZvJyk7XG52YXIgUmVhY3RET01GZWF0dXJlRmxhZ3MgPSByZXF1aXJlKCcuL1JlYWN0RE9NRmVhdHVyZUZsYWdzJyk7XG52YXIgUmVhY3RGZWF0dXJlRmxhZ3MgPSByZXF1aXJlKCcuL1JlYWN0RmVhdHVyZUZsYWdzJyk7XG52YXIgUmVhY3RJbnN0YW5jZU1hcCA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0YW5jZU1hcCcpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xudmFyIFJlYWN0TWFya3VwQ2hlY2tzdW0gPSByZXF1aXJlKCcuL1JlYWN0TWFya3VwQ2hlY2tzdW0nKTtcbnZhciBSZWFjdFJlY29uY2lsZXIgPSByZXF1aXJlKCcuL1JlYWN0UmVjb25jaWxlcicpO1xudmFyIFJlYWN0VXBkYXRlUXVldWUgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlUXVldWUnKTtcbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xuXG52YXIgZW1wdHlPYmplY3QgPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eU9iamVjdCcpO1xudmFyIGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQgPSByZXF1aXJlKCcuL2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQnKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciBzZXRJbm5lckhUTUwgPSByZXF1aXJlKCcuL3NldElubmVySFRNTCcpO1xudmFyIHNob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9zaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBBVFRSX05BTUUgPSBET01Qcm9wZXJ0eS5JRF9BVFRSSUJVVEVfTkFNRTtcbnZhciBST09UX0FUVFJfTkFNRSA9IERPTVByb3BlcnR5LlJPT1RfQVRUUklCVVRFX05BTUU7XG5cbnZhciBFTEVNRU5UX05PREVfVFlQRSA9IDE7XG52YXIgRE9DX05PREVfVFlQRSA9IDk7XG52YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERV9UWVBFID0gMTE7XG5cbnZhciBpbnN0YW5jZXNCeVJlYWN0Um9vdElEID0ge307XG5cbi8qKlxuICogRmluZHMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXJcbiAqIHRoYXQncyBub3QgY29tbW9uIGJldHdlZW4gdGhlIHR3byBnaXZlbiBzdHJpbmdzLlxuICpcbiAqIEByZXR1cm4ge251bWJlcn0gdGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgd2hlcmUgdGhlIHN0cmluZ3MgZGl2ZXJnZVxuICovXG5mdW5jdGlvbiBmaXJzdERpZmZlcmVuY2VJbmRleChzdHJpbmcxLCBzdHJpbmcyKSB7XG4gIHZhciBtaW5MZW4gPSBNYXRoLm1pbihzdHJpbmcxLmxlbmd0aCwgc3RyaW5nMi5sZW5ndGgpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG1pbkxlbjsgaSsrKSB7XG4gICAgaWYgKHN0cmluZzEuY2hhckF0KGkpICE9PSBzdHJpbmcyLmNoYXJBdChpKSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHJpbmcxLmxlbmd0aCA9PT0gc3RyaW5nMi5sZW5ndGggPyAtMSA6IG1pbkxlbjtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NRG9jdW1lbnR9IGNvbnRhaW5lciBET00gZWxlbWVudCB0aGF0IG1heSBjb250YWluXG4gKiBhIFJlYWN0IGNvbXBvbmVudFxuICogQHJldHVybiB7Pyp9IERPTSBlbGVtZW50IHRoYXQgbWF5IGhhdmUgdGhlIHJlYWN0Um9vdCBJRCwgb3IgbnVsbC5cbiAqL1xuZnVuY3Rpb24gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICBpZiAoIWNvbnRhaW5lcikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRE9DX05PREVfVFlQRSkge1xuICAgIHJldHVybiBjb250YWluZXIuZG9jdW1lbnRFbGVtZW50O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb250YWluZXIuZmlyc3RDaGlsZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbnRlcm5hbEdldElEKG5vZGUpIHtcbiAgLy8gSWYgbm9kZSBpcyBzb21ldGhpbmcgbGlrZSBhIHdpbmRvdywgZG9jdW1lbnQsIG9yIHRleHQgbm9kZSwgbm9uZSBvZlxuICAvLyB3aGljaCBzdXBwb3J0IGF0dHJpYnV0ZXMgb3IgYSAuZ2V0QXR0cmlidXRlIG1ldGhvZCwgZ3JhY2VmdWxseSByZXR1cm5cbiAgLy8gdGhlIGVtcHR5IHN0cmluZywgYXMgaWYgdGhlIGF0dHJpYnV0ZSB3ZXJlIG1pc3NpbmcuXG4gIHJldHVybiBub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZShBVFRSX05BTUUpIHx8ICcnO1xufVxuXG4vKipcbiAqIE1vdW50cyB0aGlzIGNvbXBvbmVudCBhbmQgaW5zZXJ0cyBpdCBpbnRvIHRoZSBET00uXG4gKlxuICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY29tcG9uZW50SW5zdGFuY2UgVGhlIGluc3RhbmNlIHRvIG1vdW50LlxuICogQHBhcmFtIHtET01FbGVtZW50fSBjb250YWluZXIgRE9NIGVsZW1lbnQgdG8gbW91bnQgaW50by5cbiAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkUmV1c2VNYXJrdXAgSWYgdHJ1ZSwgZG8gbm90IGluc2VydCBtYXJrdXBcbiAqL1xuZnVuY3Rpb24gbW91bnRDb21wb25lbnRJbnRvTm9kZSh3cmFwcGVySW5zdGFuY2UsIGNvbnRhaW5lciwgdHJhbnNhY3Rpb24sIHNob3VsZFJldXNlTWFya3VwLCBjb250ZXh0KSB7XG4gIHZhciBtYXJrZXJOYW1lO1xuICBpZiAoUmVhY3RGZWF0dXJlRmxhZ3MubG9nVG9wTGV2ZWxSZW5kZXJzKSB7XG4gICAgdmFyIHdyYXBwZWRFbGVtZW50ID0gd3JhcHBlckluc3RhbmNlLl9jdXJyZW50RWxlbWVudC5wcm9wcy5jaGlsZDtcbiAgICB2YXIgdHlwZSA9IHdyYXBwZWRFbGVtZW50LnR5cGU7XG4gICAgbWFya2VyTmFtZSA9ICdSZWFjdCBtb3VudDogJyArICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgPyB0eXBlIDogdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUpO1xuICAgIGNvbnNvbGUudGltZShtYXJrZXJOYW1lKTtcbiAgfVxuXG4gIHZhciBtYXJrdXAgPSBSZWFjdFJlY29uY2lsZXIubW91bnRDb21wb25lbnQod3JhcHBlckluc3RhbmNlLCB0cmFuc2FjdGlvbiwgbnVsbCwgUmVhY3RET01Db250YWluZXJJbmZvKHdyYXBwZXJJbnN0YW5jZSwgY29udGFpbmVyKSwgY29udGV4dCwgMCAvKiBwYXJlbnREZWJ1Z0lEICovXG4gICk7XG5cbiAgaWYgKG1hcmtlck5hbWUpIHtcbiAgICBjb25zb2xlLnRpbWVFbmQobWFya2VyTmFtZSk7XG4gIH1cblxuICB3cmFwcGVySW5zdGFuY2UuX3JlbmRlcmVkQ29tcG9uZW50Ll90b3BMZXZlbFdyYXBwZXIgPSB3cmFwcGVySW5zdGFuY2U7XG4gIFJlYWN0TW91bnQuX21vdW50SW1hZ2VJbnRvTm9kZShtYXJrdXAsIGNvbnRhaW5lciwgd3JhcHBlckluc3RhbmNlLCBzaG91bGRSZXVzZU1hcmt1cCwgdHJhbnNhY3Rpb24pO1xufVxuXG4vKipcbiAqIEJhdGNoZWQgbW91bnQuXG4gKlxuICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY29tcG9uZW50SW5zdGFuY2UgVGhlIGluc3RhbmNlIHRvIG1vdW50LlxuICogQHBhcmFtIHtET01FbGVtZW50fSBjb250YWluZXIgRE9NIGVsZW1lbnQgdG8gbW91bnQgaW50by5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkUmV1c2VNYXJrdXAgSWYgdHJ1ZSwgZG8gbm90IGluc2VydCBtYXJrdXBcbiAqL1xuZnVuY3Rpb24gYmF0Y2hlZE1vdW50Q29tcG9uZW50SW50b05vZGUoY29tcG9uZW50SW5zdGFuY2UsIGNvbnRhaW5lciwgc2hvdWxkUmV1c2VNYXJrdXAsIGNvbnRleHQpIHtcbiAgdmFyIHRyYW5zYWN0aW9uID0gUmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uZ2V0UG9vbGVkKFxuICAvKiB1c2VDcmVhdGVFbGVtZW50ICovXG4gICFzaG91bGRSZXVzZU1hcmt1cCAmJiBSZWFjdERPTUZlYXR1cmVGbGFncy51c2VDcmVhdGVFbGVtZW50KTtcbiAgdHJhbnNhY3Rpb24ucGVyZm9ybShtb3VudENvbXBvbmVudEludG9Ob2RlLCBudWxsLCBjb21wb25lbnRJbnN0YW5jZSwgY29udGFpbmVyLCB0cmFuc2FjdGlvbiwgc2hvdWxkUmV1c2VNYXJrdXAsIGNvbnRleHQpO1xuICBSZWFjdFVwZGF0ZXMuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5yZWxlYXNlKHRyYW5zYWN0aW9uKTtcbn1cblxuLyoqXG4gKiBVbm1vdW50cyBhIGNvbXBvbmVudCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBET00uXG4gKlxuICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gaW5zdGFuY2UgUmVhY3QgY29tcG9uZW50IGluc3RhbmNlLlxuICogQHBhcmFtIHtET01FbGVtZW50fSBjb250YWluZXIgRE9NIGVsZW1lbnQgdG8gdW5tb3VudCBmcm9tLlxuICogQGZpbmFsXG4gKiBAaW50ZXJuYWxcbiAqIEBzZWUge1JlYWN0TW91bnQudW5tb3VudENvbXBvbmVudEF0Tm9kZX1cbiAqL1xuZnVuY3Rpb24gdW5tb3VudENvbXBvbmVudEZyb21Ob2RlKGluc3RhbmNlLCBjb250YWluZXIsIHNhZmVseSkge1xuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWdpbkZsdXNoKCk7XG4gIH1cbiAgUmVhY3RSZWNvbmNpbGVyLnVubW91bnRDb21wb25lbnQoaW5zdGFuY2UsIHNhZmVseSk7XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkVuZEZsdXNoKCk7XG4gIH1cblxuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBET0NfTk9ERV9UWVBFKSB7XG4gICAgY29udGFpbmVyID0gY29udGFpbmVyLmRvY3VtZW50RWxlbWVudDtcbiAgfVxuXG4gIC8vIGh0dHA6Ly9qc3BlcmYuY29tL2VtcHR5aW5nLWEtbm9kZVxuICB3aGlsZSAoY29udGFpbmVyLmxhc3RDaGlsZCkge1xuICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZChjb250YWluZXIubGFzdENoaWxkKTtcbiAgfVxufVxuXG4vKipcbiAqIFRydWUgaWYgdGhlIHN1cHBsaWVkIERPTSBub2RlIGhhcyBhIGRpcmVjdCBSZWFjdC1yZW5kZXJlZCBjaGlsZCB0aGF0IGlzXG4gKiBub3QgYSBSZWFjdCByb290IGVsZW1lbnQuIFVzZWZ1bCBmb3Igd2FybmluZyBpbiBgcmVuZGVyYCxcbiAqIGB1bm1vdW50Q29tcG9uZW50QXROb2RlYCwgZXRjLlxuICpcbiAqIEBwYXJhbSB7P0RPTUVsZW1lbnR9IG5vZGUgVGhlIGNhbmRpZGF0ZSBET00gbm9kZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIERPTSBlbGVtZW50IGNvbnRhaW5zIGEgZGlyZWN0IGNoaWxkIHRoYXQgd2FzXG4gKiByZW5kZXJlZCBieSBSZWFjdCBidXQgaXMgbm90IGEgcm9vdCBlbGVtZW50LlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGhhc05vblJvb3RSZWFjdENoaWxkKGNvbnRhaW5lcikge1xuICB2YXIgcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gIGlmIChyb290RWwpIHtcbiAgICB2YXIgaW5zdCA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKHJvb3RFbCk7XG4gICAgcmV0dXJuICEhKGluc3QgJiYgaW5zdC5faG9zdFBhcmVudCk7XG4gIH1cbn1cblxuLyoqXG4gKiBUcnVlIGlmIHRoZSBzdXBwbGllZCBET00gbm9kZSBpcyBhIFJlYWN0IERPTSBlbGVtZW50IGFuZFxuICogaXQgaGFzIGJlZW4gcmVuZGVyZWQgYnkgYW5vdGhlciBjb3B5IG9mIFJlYWN0LlxuICpcbiAqIEBwYXJhbSB7P0RPTUVsZW1lbnR9IG5vZGUgVGhlIGNhbmRpZGF0ZSBET00gbm9kZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIERPTSBoYXMgYmVlbiByZW5kZXJlZCBieSBhbm90aGVyIGNvcHkgb2YgUmVhY3RcbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBub2RlSXNSZW5kZXJlZEJ5T3RoZXJJbnN0YW5jZShjb250YWluZXIpIHtcbiAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICByZXR1cm4gISEocm9vdEVsICYmIGlzUmVhY3ROb2RlKHJvb3RFbCkgJiYgIVJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKHJvb3RFbCkpO1xufVxuXG4vKipcbiAqIFRydWUgaWYgdGhlIHN1cHBsaWVkIERPTSBub2RlIGlzIGEgdmFsaWQgbm9kZSBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7P0RPTUVsZW1lbnR9IG5vZGUgVGhlIGNhbmRpZGF0ZSBET00gbm9kZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIERPTSBpcyBhIHZhbGlkIERPTSBub2RlLlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRDb250YWluZXIobm9kZSkge1xuICByZXR1cm4gISEobm9kZSAmJiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFX1RZUEUgfHwgbm9kZS5ub2RlVHlwZSA9PT0gRE9DX05PREVfVFlQRSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFX1RZUEUpKTtcbn1cblxuLyoqXG4gKiBUcnVlIGlmIHRoZSBzdXBwbGllZCBET00gbm9kZSBpcyBhIHZhbGlkIFJlYWN0IG5vZGUgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0gez9ET01FbGVtZW50fSBub2RlIFRoZSBjYW5kaWRhdGUgRE9NIG5vZGUuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBET00gaXMgYSB2YWxpZCBSZWFjdCBET00gbm9kZS5cbiAqIEBpbnRlcm5hbFxuICovXG5mdW5jdGlvbiBpc1JlYWN0Tm9kZShub2RlKSB7XG4gIHJldHVybiBpc1ZhbGlkQ29udGFpbmVyKG5vZGUpICYmIChub2RlLmhhc0F0dHJpYnV0ZShST09UX0FUVFJfTkFNRSkgfHwgbm9kZS5oYXNBdHRyaWJ1dGUoQVRUUl9OQU1FKSk7XG59XG5cbmZ1bmN0aW9uIGdldEhvc3RSb290SW5zdGFuY2VJbkNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgdmFyIHJvb3RFbCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICB2YXIgcHJldkhvc3RJbnN0YW5jZSA9IHJvb3RFbCAmJiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShyb290RWwpO1xuICByZXR1cm4gcHJldkhvc3RJbnN0YW5jZSAmJiAhcHJldkhvc3RJbnN0YW5jZS5faG9zdFBhcmVudCA/IHByZXZIb3N0SW5zdGFuY2UgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRUb3BMZXZlbFdyYXBwZXJJbkNvbnRhaW5lcihjb250YWluZXIpIHtcbiAgdmFyIHJvb3QgPSBnZXRIb3N0Um9vdEluc3RhbmNlSW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgcmV0dXJuIHJvb3QgPyByb290Ll9ob3N0Q29udGFpbmVySW5mby5fdG9wTGV2ZWxXcmFwcGVyIDogbnVsbDtcbn1cblxuLyoqXG4gKiBUZW1wb3JhcnkgKD8pIGhhY2sgc28gdGhhdCB3ZSBjYW4gc3RvcmUgYWxsIHRvcC1sZXZlbCBwZW5kaW5nIHVwZGF0ZXMgb25cbiAqIGNvbXBvc2l0ZXMgaW5zdGVhZCBvZiBoYXZpbmcgdG8gd29ycnkgYWJvdXQgZGlmZmVyZW50IHR5cGVzIG9mIGNvbXBvbmVudHNcbiAqIGhlcmUuXG4gKi9cbnZhciB0b3BMZXZlbFJvb3RDb3VudGVyID0gMTtcbnZhciBUb3BMZXZlbFdyYXBwZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucm9vdElEID0gdG9wTGV2ZWxSb290Q291bnRlcisrO1xufTtcblRvcExldmVsV3JhcHBlci5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA9IHt9O1xuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFRvcExldmVsV3JhcHBlci5kaXNwbGF5TmFtZSA9ICdUb3BMZXZlbFdyYXBwZXInO1xufVxuVG9wTGV2ZWxXcmFwcGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnByb3BzLmNoaWxkO1xufTtcblRvcExldmVsV3JhcHBlci5pc1JlYWN0VG9wTGV2ZWxXcmFwcGVyID0gdHJ1ZTtcblxuLyoqXG4gKiBNb3VudGluZyBpcyB0aGUgcHJvY2VzcyBvZiBpbml0aWFsaXppbmcgYSBSZWFjdCBjb21wb25lbnQgYnkgY3JlYXRpbmcgaXRzXG4gKiByZXByZXNlbnRhdGl2ZSBET00gZWxlbWVudHMgYW5kIGluc2VydGluZyB0aGVtIGludG8gYSBzdXBwbGllZCBgY29udGFpbmVyYC5cbiAqIEFueSBwcmlvciBjb250ZW50IGluc2lkZSBgY29udGFpbmVyYCBpcyBkZXN0cm95ZWQgaW4gdGhlIHByb2Nlc3MuXG4gKlxuICogICBSZWFjdE1vdW50LnJlbmRlcihcbiAqICAgICBjb21wb25lbnQsXG4gKiAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRhaW5lcicpXG4gKiAgICk7XG4gKlxuICogICA8ZGl2IGlkPVwiY29udGFpbmVyXCI+ICAgICAgICAgICAgICAgICAgIDwtLSBTdXBwbGllZCBgY29udGFpbmVyYC5cbiAqICAgICA8ZGl2IGRhdGEtcmVhY3RpZD1cIi4zXCI+ICAgICAgICAgICAgICA8LS0gUmVuZGVyZWQgcmVhY3RSb290IG9mIFJlYWN0XG4gKiAgICAgICAvLyAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuXG4gKiAgICAgPC9kaXY+XG4gKiAgIDwvZGl2PlxuICpcbiAqIEluc2lkZSBvZiBgY29udGFpbmVyYCwgdGhlIGZpcnN0IGVsZW1lbnQgcmVuZGVyZWQgaXMgdGhlIFwicmVhY3RSb290XCIuXG4gKi9cbnZhciBSZWFjdE1vdW50ID0ge1xuXG4gIFRvcExldmVsV3JhcHBlcjogVG9wTGV2ZWxXcmFwcGVyLFxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGRldnRvb2xzLiBUaGUga2V5cyBhcmUgbm90IGltcG9ydGFudC5cbiAgICovXG4gIF9pbnN0YW5jZXNCeVJlYWN0Um9vdElEOiBpbnN0YW5jZXNCeVJlYWN0Um9vdElELFxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGEgaG9vayBwcm92aWRlZCB0byBzdXBwb3J0IHJlbmRlcmluZyBSZWFjdCBjb21wb25lbnRzIHdoaWxlXG4gICAqIGVuc3VyaW5nIHRoYXQgdGhlIGFwcGFyZW50IHNjcm9sbCBwb3NpdGlvbiBvZiBpdHMgYGNvbnRhaW5lcmAgZG9lcyBub3RcbiAgICogY2hhbmdlLlxuICAgKlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBUaGUgYGNvbnRhaW5lcmAgYmVpbmcgcmVuZGVyZWQgaW50by5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gcmVuZGVyQ2FsbGJhY2sgVGhpcyBtdXN0IGJlIGNhbGxlZCBvbmNlIHRvIGRvIHRoZSByZW5kZXIuXG4gICAqL1xuICBzY3JvbGxNb25pdG9yOiBmdW5jdGlvbiAoY29udGFpbmVyLCByZW5kZXJDYWxsYmFjaykge1xuICAgIHJlbmRlckNhbGxiYWNrKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRha2UgYSBjb21wb25lbnQgdGhhdCdzIGFscmVhZHkgbW91bnRlZCBpbnRvIHRoZSBET00gYW5kIHJlcGxhY2UgaXRzIHByb3BzXG4gICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IHByZXZDb21wb25lbnQgY29tcG9uZW50IGluc3RhbmNlIGFscmVhZHkgaW4gdGhlIERPTVxuICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dEVsZW1lbnQgY29tcG9uZW50IGluc3RhbmNlIHRvIHJlbmRlclxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBjb250YWluZXIgdG8gcmVuZGVyIGludG9cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIGZ1bmN0aW9uIHRyaWdnZXJlZCBvbiBjb21wbGV0aW9uXG4gICAqL1xuICBfdXBkYXRlUm9vdENvbXBvbmVudDogZnVuY3Rpb24gKHByZXZDb21wb25lbnQsIG5leHRFbGVtZW50LCBuZXh0Q29udGV4dCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICAgIFJlYWN0TW91bnQuc2Nyb2xsTW9uaXRvcihjb250YWluZXIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIFJlYWN0VXBkYXRlUXVldWUuZW5xdWV1ZUVsZW1lbnRJbnRlcm5hbChwcmV2Q29tcG9uZW50LCBuZXh0RWxlbWVudCwgbmV4dENvbnRleHQpO1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIFJlYWN0VXBkYXRlUXVldWUuZW5xdWV1ZUNhbGxiYWNrSW50ZXJuYWwocHJldkNvbXBvbmVudCwgY2FsbGJhY2spO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHByZXZDb21wb25lbnQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbmRlciBhIG5ldyBjb21wb25lbnQgaW50byB0aGUgRE9NLiBIb29rZWQgYnkgaG9va3MhXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudCBlbGVtZW50IHRvIHJlbmRlclxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBjb250YWluZXIgdG8gcmVuZGVyIGludG9cbiAgICogQHBhcmFtIHtib29sZWFufSBzaG91bGRSZXVzZU1hcmt1cCBpZiB3ZSBzaG91bGQgc2tpcCB0aGUgbWFya3VwIGluc2VydGlvblxuICAgKiBAcmV0dXJuIHtSZWFjdENvbXBvbmVudH0gbmV4dENvbXBvbmVudFxuICAgKi9cbiAgX3JlbmRlck5ld1Jvb3RDb21wb25lbnQ6IGZ1bmN0aW9uIChuZXh0RWxlbWVudCwgY29udGFpbmVyLCBzaG91bGRSZXVzZU1hcmt1cCwgY29udGV4dCkge1xuICAgIC8vIFZhcmlvdXMgcGFydHMgb2Ygb3VyIGNvZGUgKHN1Y2ggYXMgUmVhY3RDb21wb3NpdGVDb21wb25lbnQnc1xuICAgIC8vIF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQpIGFzc3VtZSB0aGF0IGNhbGxzIHRvIHJlbmRlciBhcmVuJ3QgbmVzdGVkO1xuICAgIC8vIHZlcmlmeSB0aGF0IHRoYXQncyB0aGUgY2FzZS5cbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9PSBudWxsLCAnX3JlbmRlck5ld1Jvb3RDb21wb25lbnQoKTogUmVuZGVyIG1ldGhvZHMgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiAnICsgJ29mIHByb3BzIGFuZCBzdGF0ZTsgdHJpZ2dlcmluZyBuZXN0ZWQgY29tcG9uZW50IHVwZGF0ZXMgZnJvbSAnICsgJ3JlbmRlciBpcyBub3QgYWxsb3dlZC4gSWYgbmVjZXNzYXJ5LCB0cmlnZ2VyIG5lc3RlZCB1cGRhdGVzIGluICcgKyAnY29tcG9uZW50RGlkVXBkYXRlLiBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiAlcy4nLCBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ICYmIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogdm9pZCAwO1xuXG4gICAgIWlzVmFsaWRDb250YWluZXIoY29udGFpbmVyKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnX3JlZ2lzdGVyQ29tcG9uZW50KC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJykgOiBfcHJvZEludmFyaWFudCgnMzcnKSA6IHZvaWQgMDtcblxuICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5lbnN1cmVTY3JvbGxWYWx1ZU1vbml0b3JpbmcoKTtcbiAgICB2YXIgY29tcG9uZW50SW5zdGFuY2UgPSBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KG5leHRFbGVtZW50LCBmYWxzZSk7XG5cbiAgICAvLyBUaGUgaW5pdGlhbCByZW5kZXIgaXMgc3luY2hyb25vdXMgYnV0IGFueSB1cGRhdGVzIHRoYXQgaGFwcGVuIGR1cmluZ1xuICAgIC8vIHJlbmRlcmluZywgaW4gY29tcG9uZW50V2lsbE1vdW50IG9yIGNvbXBvbmVudERpZE1vdW50LCB3aWxsIGJlIGJhdGNoZWRcbiAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgYmF0Y2hpbmcgc3RyYXRlZ3kuXG5cbiAgICBSZWFjdFVwZGF0ZXMuYmF0Y2hlZFVwZGF0ZXMoYmF0Y2hlZE1vdW50Q29tcG9uZW50SW50b05vZGUsIGNvbXBvbmVudEluc3RhbmNlLCBjb250YWluZXIsIHNob3VsZFJldXNlTWFya3VwLCBjb250ZXh0KTtcblxuICAgIHZhciB3cmFwcGVySUQgPSBjb21wb25lbnRJbnN0YW5jZS5faW5zdGFuY2Uucm9vdElEO1xuICAgIGluc3RhbmNlc0J5UmVhY3RSb290SURbd3JhcHBlcklEXSA9IGNvbXBvbmVudEluc3RhbmNlO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudEluc3RhbmNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgUmVhY3QgY29tcG9uZW50IGludG8gdGhlIERPTSBpbiB0aGUgc3VwcGxpZWQgYGNvbnRhaW5lcmAuXG4gICAqXG4gICAqIElmIHRoZSBSZWFjdCBjb21wb25lbnQgd2FzIHByZXZpb3VzbHkgcmVuZGVyZWQgaW50byBgY29udGFpbmVyYCwgdGhpcyB3aWxsXG4gICAqIHBlcmZvcm0gYW4gdXBkYXRlIG9uIGl0IGFuZCBvbmx5IG11dGF0ZSB0aGUgRE9NIGFzIG5lY2Vzc2FyeSB0byByZWZsZWN0IHRoZVxuICAgKiBsYXRlc3QgUmVhY3QgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBwYXJlbnRDb21wb25lbnQgVGhlIGNvbmNlcHR1YWwgcGFyZW50IG9mIHRoaXMgcmVuZGVyIHRyZWUuXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudCBDb21wb25lbnQgZWxlbWVudCB0byByZW5kZXIuXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIERPTSBlbGVtZW50IHRvIHJlbmRlciBpbnRvLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gdHJpZ2dlcmVkIG9uIGNvbXBsZXRpb25cbiAgICogQHJldHVybiB7UmVhY3RDb21wb25lbnR9IENvbXBvbmVudCBpbnN0YW5jZSByZW5kZXJlZCBpbiBgY29udGFpbmVyYC5cbiAgICovXG4gIHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyOiBmdW5jdGlvbiAocGFyZW50Q29tcG9uZW50LCBuZXh0RWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICAgICEocGFyZW50Q29tcG9uZW50ICE9IG51bGwgJiYgUmVhY3RJbnN0YW5jZU1hcC5oYXMocGFyZW50Q29tcG9uZW50KSkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3BhcmVudENvbXBvbmVudCBtdXN0IGJlIGEgdmFsaWQgUmVhY3QgQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMzgnKSA6IHZvaWQgMDtcbiAgICByZXR1cm4gUmVhY3RNb3VudC5fcmVuZGVyU3VidHJlZUludG9Db250YWluZXIocGFyZW50Q29tcG9uZW50LCBuZXh0RWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjayk7XG4gIH0sXG5cbiAgX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyOiBmdW5jdGlvbiAocGFyZW50Q29tcG9uZW50LCBuZXh0RWxlbWVudCwgY29udGFpbmVyLCBjYWxsYmFjaykge1xuICAgIFJlYWN0VXBkYXRlUXVldWUudmFsaWRhdGVDYWxsYmFjayhjYWxsYmFjaywgJ1JlYWN0RE9NLnJlbmRlcicpO1xuICAgICFSZWFjdC5pc1ZhbGlkRWxlbWVudChuZXh0RWxlbWVudCkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0RE9NLnJlbmRlcigpOiBJbnZhbGlkIGNvbXBvbmVudCBlbGVtZW50LiVzJywgdHlwZW9mIG5leHRFbGVtZW50ID09PSAnc3RyaW5nJyA/ICcgSW5zdGVhZCBvZiBwYXNzaW5nIGEgc3RyaW5nIGxpa2UgXFwnZGl2XFwnLCBwYXNzICcgKyAnUmVhY3QuY3JlYXRlRWxlbWVudChcXCdkaXZcXCcpIG9yIDxkaXYgLz4uJyA6IHR5cGVvZiBuZXh0RWxlbWVudCA9PT0gJ2Z1bmN0aW9uJyA/ICcgSW5zdGVhZCBvZiBwYXNzaW5nIGEgY2xhc3MgbGlrZSBGb28sIHBhc3MgJyArICdSZWFjdC5jcmVhdGVFbGVtZW50KEZvbykgb3IgPEZvbyAvPi4nIDpcbiAgICAvLyBDaGVjayBpZiBpdCBxdWFja3MgbGlrZSBhbiBlbGVtZW50XG4gICAgbmV4dEVsZW1lbnQgIT0gbnVsbCAmJiBuZXh0RWxlbWVudC5wcm9wcyAhPT0gdW5kZWZpbmVkID8gJyBUaGlzIG1heSBiZSBjYXVzZWQgYnkgdW5pbnRlbnRpb25hbGx5IGxvYWRpbmcgdHdvIGluZGVwZW5kZW50ICcgKyAnY29waWVzIG9mIFJlYWN0LicgOiAnJykgOiBfcHJvZEludmFyaWFudCgnMzknLCB0eXBlb2YgbmV4dEVsZW1lbnQgPT09ICdzdHJpbmcnID8gJyBJbnN0ZWFkIG9mIHBhc3NpbmcgYSBzdHJpbmcgbGlrZSBcXCdkaXZcXCcsIHBhc3MgJyArICdSZWFjdC5jcmVhdGVFbGVtZW50KFxcJ2RpdlxcJykgb3IgPGRpdiAvPi4nIDogdHlwZW9mIG5leHRFbGVtZW50ID09PSAnZnVuY3Rpb24nID8gJyBJbnN0ZWFkIG9mIHBhc3NpbmcgYSBjbGFzcyBsaWtlIEZvbywgcGFzcyAnICsgJ1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9vKSBvciA8Rm9vIC8+LicgOiBuZXh0RWxlbWVudCAhPSBudWxsICYmIG5leHRFbGVtZW50LnByb3BzICE9PSB1bmRlZmluZWQgPyAnIFRoaXMgbWF5IGJlIGNhdXNlZCBieSB1bmludGVudGlvbmFsbHkgbG9hZGluZyB0d28gaW5kZXBlbmRlbnQgJyArICdjb3BpZXMgb2YgUmVhY3QuJyA6ICcnKSA6IHZvaWQgMDtcblxuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghY29udGFpbmVyIHx8ICFjb250YWluZXIudGFnTmFtZSB8fCBjb250YWluZXIudGFnTmFtZS50b1VwcGVyQ2FzZSgpICE9PSAnQk9EWScsICdyZW5kZXIoKTogUmVuZGVyaW5nIGNvbXBvbmVudHMgZGlyZWN0bHkgaW50byBkb2N1bWVudC5ib2R5IGlzICcgKyAnZGlzY291cmFnZWQsIHNpbmNlIGl0cyBjaGlsZHJlbiBhcmUgb2Z0ZW4gbWFuaXB1bGF0ZWQgYnkgdGhpcmQtcGFydHkgJyArICdzY3JpcHRzIGFuZCBicm93c2VyIGV4dGVuc2lvbnMuIFRoaXMgbWF5IGxlYWQgdG8gc3VidGxlICcgKyAncmVjb25jaWxpYXRpb24gaXNzdWVzLiBUcnkgcmVuZGVyaW5nIGludG8gYSBjb250YWluZXIgZWxlbWVudCBjcmVhdGVkICcgKyAnZm9yIHlvdXIgYXBwLicpIDogdm9pZCAwO1xuXG4gICAgdmFyIG5leHRXcmFwcGVkRWxlbWVudCA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9wTGV2ZWxXcmFwcGVyLCB7IGNoaWxkOiBuZXh0RWxlbWVudCB9KTtcblxuICAgIHZhciBuZXh0Q29udGV4dDtcbiAgICBpZiAocGFyZW50Q29tcG9uZW50KSB7XG4gICAgICB2YXIgcGFyZW50SW5zdCA9IFJlYWN0SW5zdGFuY2VNYXAuZ2V0KHBhcmVudENvbXBvbmVudCk7XG4gICAgICBuZXh0Q29udGV4dCA9IHBhcmVudEluc3QuX3Byb2Nlc3NDaGlsZENvbnRleHQocGFyZW50SW5zdC5fY29udGV4dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRDb250ZXh0ID0gZW1wdHlPYmplY3Q7XG4gICAgfVxuXG4gICAgdmFyIHByZXZDb21wb25lbnQgPSBnZXRUb3BMZXZlbFdyYXBwZXJJbkNvbnRhaW5lcihjb250YWluZXIpO1xuXG4gICAgaWYgKHByZXZDb21wb25lbnQpIHtcbiAgICAgIHZhciBwcmV2V3JhcHBlZEVsZW1lbnQgPSBwcmV2Q29tcG9uZW50Ll9jdXJyZW50RWxlbWVudDtcbiAgICAgIHZhciBwcmV2RWxlbWVudCA9IHByZXZXcmFwcGVkRWxlbWVudC5wcm9wcy5jaGlsZDtcbiAgICAgIGlmIChzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudChwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQpKSB7XG4gICAgICAgIHZhciBwdWJsaWNJbnN0ID0gcHJldkNvbXBvbmVudC5fcmVuZGVyZWRDb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKTtcbiAgICAgICAgdmFyIHVwZGF0ZWRDYWxsYmFjayA9IGNhbGxiYWNrICYmIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjYWxsYmFjay5jYWxsKHB1YmxpY0luc3QpO1xuICAgICAgICB9O1xuICAgICAgICBSZWFjdE1vdW50Ll91cGRhdGVSb290Q29tcG9uZW50KHByZXZDb21wb25lbnQsIG5leHRXcmFwcGVkRWxlbWVudCwgbmV4dENvbnRleHQsIGNvbnRhaW5lciwgdXBkYXRlZENhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIHB1YmxpY0luc3Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBSZWFjdE1vdW50LnVubW91bnRDb21wb25lbnRBdE5vZGUoY29udGFpbmVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmVhY3RSb290RWxlbWVudCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgIHZhciBjb250YWluZXJIYXNSZWFjdE1hcmt1cCA9IHJlYWN0Um9vdEVsZW1lbnQgJiYgISFpbnRlcm5hbEdldElEKHJlYWN0Um9vdEVsZW1lbnQpO1xuICAgIHZhciBjb250YWluZXJIYXNOb25Sb290UmVhY3RDaGlsZCA9IGhhc05vblJvb3RSZWFjdENoaWxkKGNvbnRhaW5lcik7XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghY29udGFpbmVySGFzTm9uUm9vdFJlYWN0Q2hpbGQsICdyZW5kZXIoLi4uKTogUmVwbGFjaW5nIFJlYWN0LXJlbmRlcmVkIGNoaWxkcmVuIHdpdGggYSBuZXcgcm9vdCAnICsgJ2NvbXBvbmVudC4gSWYgeW91IGludGVuZGVkIHRvIHVwZGF0ZSB0aGUgY2hpbGRyZW4gb2YgdGhpcyBub2RlLCAnICsgJ3lvdSBzaG91bGQgaW5zdGVhZCBoYXZlIHRoZSBleGlzdGluZyBjaGlsZHJlbiB1cGRhdGUgdGhlaXIgc3RhdGUgJyArICdhbmQgcmVuZGVyIHRoZSBuZXcgY29tcG9uZW50cyBpbnN0ZWFkIG9mIGNhbGxpbmcgUmVhY3RET00ucmVuZGVyLicpIDogdm9pZCAwO1xuXG4gICAgICBpZiAoIWNvbnRhaW5lckhhc1JlYWN0TWFya3VwIHx8IHJlYWN0Um9vdEVsZW1lbnQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgdmFyIHJvb3RFbGVtZW50U2libGluZyA9IHJlYWN0Um9vdEVsZW1lbnQ7XG4gICAgICAgIHdoaWxlIChyb290RWxlbWVudFNpYmxpbmcpIHtcbiAgICAgICAgICBpZiAoaW50ZXJuYWxHZXRJRChyb290RWxlbWVudFNpYmxpbmcpKSB7XG4gICAgICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdyZW5kZXIoKTogVGFyZ2V0IG5vZGUgaGFzIG1hcmt1cCByZW5kZXJlZCBieSBSZWFjdCwgYnV0IHRoZXJlICcgKyAnYXJlIHVucmVsYXRlZCBub2RlcyBhcyB3ZWxsLiBUaGlzIGlzIG1vc3QgY29tbW9ubHkgY2F1c2VkIGJ5ICcgKyAnd2hpdGUtc3BhY2UgaW5zZXJ0ZWQgYXJvdW5kIHNlcnZlci1yZW5kZXJlZCBtYXJrdXAuJykgOiB2b2lkIDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgcm9vdEVsZW1lbnRTaWJsaW5nID0gcm9vdEVsZW1lbnRTaWJsaW5nLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNob3VsZFJldXNlTWFya3VwID0gY29udGFpbmVySGFzUmVhY3RNYXJrdXAgJiYgIXByZXZDb21wb25lbnQgJiYgIWNvbnRhaW5lckhhc05vblJvb3RSZWFjdENoaWxkO1xuICAgIHZhciBjb21wb25lbnQgPSBSZWFjdE1vdW50Ll9yZW5kZXJOZXdSb290Q29tcG9uZW50KG5leHRXcmFwcGVkRWxlbWVudCwgY29udGFpbmVyLCBzaG91bGRSZXVzZU1hcmt1cCwgbmV4dENvbnRleHQpLl9yZW5kZXJlZENvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgY2FsbGJhY2suY2FsbChjb21wb25lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgUmVhY3QgY29tcG9uZW50IGludG8gdGhlIERPTSBpbiB0aGUgc3VwcGxpZWQgYGNvbnRhaW5lcmAuXG4gICAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdGRvbS5yZW5kZXJcbiAgICpcbiAgICogSWYgdGhlIFJlYWN0IGNvbXBvbmVudCB3YXMgcHJldmlvdXNseSByZW5kZXJlZCBpbnRvIGBjb250YWluZXJgLCB0aGlzIHdpbGxcbiAgICogcGVyZm9ybSBhbiB1cGRhdGUgb24gaXQgYW5kIG9ubHkgbXV0YXRlIHRoZSBET00gYXMgbmVjZXNzYXJ5IHRvIHJlZmxlY3QgdGhlXG4gICAqIGxhdGVzdCBSZWFjdCBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudCBDb21wb25lbnQgZWxlbWVudCB0byByZW5kZXIuXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIERPTSBlbGVtZW50IHRvIHJlbmRlciBpbnRvLlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gdHJpZ2dlcmVkIG9uIGNvbXBsZXRpb25cbiAgICogQHJldHVybiB7UmVhY3RDb21wb25lbnR9IENvbXBvbmVudCBpbnN0YW5jZSByZW5kZXJlZCBpbiBgY29udGFpbmVyYC5cbiAgICovXG4gIHJlbmRlcjogZnVuY3Rpb24gKG5leHRFbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIFJlYWN0TW91bnQuX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsIG5leHRFbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKTtcbiAgfSxcblxuICAvKipcbiAgICogVW5tb3VudHMgYW5kIGRlc3Ryb3lzIHRoZSBSZWFjdCBjb21wb25lbnQgcmVuZGVyZWQgaW4gdGhlIGBjb250YWluZXJgLlxuICAgKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3Rkb20udW5tb3VudGNvbXBvbmVudGF0bm9kZVxuICAgKlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBET00gZWxlbWVudCBjb250YWluaW5nIGEgUmVhY3QgY29tcG9uZW50LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGEgY29tcG9uZW50IHdhcyBmb3VuZCBpbiBhbmQgdW5tb3VudGVkIGZyb21cbiAgICogICAgICAgICAgICAgICAgICAgYGNvbnRhaW5lcmBcbiAgICovXG4gIHVubW91bnRDb21wb25lbnRBdE5vZGU6IGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgICAvLyBWYXJpb3VzIHBhcnRzIG9mIG91ciBjb2RlIChzdWNoIGFzIFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50J3NcbiAgICAvLyBfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50KSBhc3N1bWUgdGhhdCBjYWxscyB0byByZW5kZXIgYXJlbid0IG5lc3RlZDtcbiAgICAvLyB2ZXJpZnkgdGhhdCB0aGF0J3MgdGhlIGNhc2UuIChTdHJpY3RseSBzcGVha2luZywgdW5tb3VudGluZyB3b24ndCBjYXVzZSBhXG4gICAgLy8gcmVuZGVyIGJ1dCB3ZSBzdGlsbCBkb24ndCBleHBlY3QgdG8gYmUgaW4gYSByZW5kZXIgY2FsbCBoZXJlLilcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9PSBudWxsLCAndW5tb3VudENvbXBvbmVudEF0Tm9kZSgpOiBSZW5kZXIgbWV0aG9kcyBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uICcgKyAnb2YgcHJvcHMgYW5kIHN0YXRlOyB0cmlnZ2VyaW5nIG5lc3RlZCBjb21wb25lbnQgdXBkYXRlcyBmcm9tIHJlbmRlciAnICsgJ2lzIG5vdCBhbGxvd2VkLiBJZiBuZWNlc3NhcnksIHRyaWdnZXIgbmVzdGVkIHVwZGF0ZXMgaW4gJyArICdjb21wb25lbnREaWRVcGRhdGUuIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICVzLicsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7XG5cbiAgICAhaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd1bm1vdW50Q29tcG9uZW50QXROb2RlKC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IGEgRE9NIGVsZW1lbnQuJykgOiBfcHJvZEludmFyaWFudCgnNDAnKSA6IHZvaWQgMDtcblxuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFub2RlSXNSZW5kZXJlZEJ5T3RoZXJJbnN0YW5jZShjb250YWluZXIpLCAndW5tb3VudENvbXBvbmVudEF0Tm9kZSgpOiBUaGUgbm9kZSB5b3VcXCdyZSBhdHRlbXB0aW5nIHRvIHVubW91bnQgJyArICd3YXMgcmVuZGVyZWQgYnkgYW5vdGhlciBjb3B5IG9mIFJlYWN0LicpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIHZhciBwcmV2Q29tcG9uZW50ID0gZ2V0VG9wTGV2ZWxXcmFwcGVySW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgICBpZiAoIXByZXZDb21wb25lbnQpIHtcbiAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIGJlaW5nIHVubW91bnRlZCB3YXMgcmVuZGVyZWQgYnkgUmVhY3QsIGJ1dCBpc24ndCBhXG4gICAgICAvLyByb290IG5vZGUuXG4gICAgICB2YXIgY29udGFpbmVySGFzTm9uUm9vdFJlYWN0Q2hpbGQgPSBoYXNOb25Sb290UmVhY3RDaGlsZChjb250YWluZXIpO1xuXG4gICAgICAvLyBDaGVjayBpZiB0aGUgY29udGFpbmVyIGl0c2VsZiBpcyBhIFJlYWN0IHJvb3Qgbm9kZS5cbiAgICAgIHZhciBpc0NvbnRhaW5lclJlYWN0Um9vdCA9IGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gMSAmJiBjb250YWluZXIuaGFzQXR0cmlidXRlKFJPT1RfQVRUUl9OQU1FKTtcblxuICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghY29udGFpbmVySGFzTm9uUm9vdFJlYWN0Q2hpbGQsICd1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2RlIHlvdVxcJ3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCAnICsgJ3dhcyByZW5kZXJlZCBieSBSZWFjdCBhbmQgaXMgbm90IGEgdG9wLWxldmVsIGNvbnRhaW5lci4gJXMnLCBpc0NvbnRhaW5lclJlYWN0Um9vdCA/ICdZb3UgbWF5IGhhdmUgYWNjaWRlbnRhbGx5IHBhc3NlZCBpbiBhIFJlYWN0IHJvb3Qgbm9kZSBpbnN0ZWFkICcgKyAnb2YgaXRzIGNvbnRhaW5lci4nIDogJ0luc3RlYWQsIGhhdmUgdGhlIHBhcmVudCBjb21wb25lbnQgdXBkYXRlIGl0cyBzdGF0ZSBhbmQgJyArICdyZXJlbmRlciBpbiBvcmRlciB0byByZW1vdmUgdGhpcyBjb21wb25lbnQuJykgOiB2b2lkIDA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZGVsZXRlIGluc3RhbmNlc0J5UmVhY3RSb290SURbcHJldkNvbXBvbmVudC5faW5zdGFuY2Uucm9vdElEXTtcbiAgICBSZWFjdFVwZGF0ZXMuYmF0Y2hlZFVwZGF0ZXModW5tb3VudENvbXBvbmVudEZyb21Ob2RlLCBwcmV2Q29tcG9uZW50LCBjb250YWluZXIsIGZhbHNlKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcblxuICBfbW91bnRJbWFnZUludG9Ob2RlOiBmdW5jdGlvbiAobWFya3VwLCBjb250YWluZXIsIGluc3RhbmNlLCBzaG91bGRSZXVzZU1hcmt1cCwgdHJhbnNhY3Rpb24pIHtcbiAgICAhaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdtb3VudENvbXBvbmVudEludG9Ob2RlKC4uLik6IFRhcmdldCBjb250YWluZXIgaXMgbm90IHZhbGlkLicpIDogX3Byb2RJbnZhcmlhbnQoJzQxJykgOiB2b2lkIDA7XG5cbiAgICBpZiAoc2hvdWxkUmV1c2VNYXJrdXApIHtcbiAgICAgIHZhciByb290RWxlbWVudCA9IGdldFJlYWN0Um9vdEVsZW1lbnRJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgICAgaWYgKFJlYWN0TWFya3VwQ2hlY2tzdW0uY2FuUmV1c2VNYXJrdXAobWFya3VwLCByb290RWxlbWVudCkpIHtcbiAgICAgICAgUmVhY3RET01Db21wb25lbnRUcmVlLnByZWNhY2hlTm9kZShpbnN0YW5jZSwgcm9vdEVsZW1lbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgY2hlY2tzdW0gPSByb290RWxlbWVudC5nZXRBdHRyaWJ1dGUoUmVhY3RNYXJrdXBDaGVja3N1bS5DSEVDS1NVTV9BVFRSX05BTUUpO1xuICAgICAgICByb290RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoUmVhY3RNYXJrdXBDaGVja3N1bS5DSEVDS1NVTV9BVFRSX05BTUUpO1xuXG4gICAgICAgIHZhciByb290TWFya3VwID0gcm9vdEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICByb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoUmVhY3RNYXJrdXBDaGVja3N1bS5DSEVDS1NVTV9BVFRSX05BTUUsIGNoZWNrc3VtKTtcblxuICAgICAgICB2YXIgbm9ybWFsaXplZE1hcmt1cCA9IG1hcmt1cDtcbiAgICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgLy8gYmVjYXVzZSByb290TWFya3VwIGlzIHJldHJpZXZlZCBmcm9tIHRoZSBET00sIHZhcmlvdXMgbm9ybWFsaXphdGlvbnNcbiAgICAgICAgICAvLyB3aWxsIGhhdmUgb2NjdXJyZWQgd2hpY2ggd2lsbCBub3QgYmUgcHJlc2VudCBpbiBgbWFya3VwYC4gSGVyZSxcbiAgICAgICAgICAvLyBpbnNlcnQgbWFya3VwIGludG8gYSA8ZGl2PiBvciA8aWZyYW1lPiBkZXBlbmRpbmcgb24gdGhlIGNvbnRhaW5lclxuICAgICAgICAgIC8vIHR5cGUgdG8gcGVyZm9ybSB0aGUgc2FtZSBub3JtYWxpemF0aW9ucyBiZWZvcmUgY29tcGFyaW5nLlxuICAgICAgICAgIHZhciBub3JtYWxpemVyO1xuICAgICAgICAgIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERV9UWVBFKSB7XG4gICAgICAgICAgICBub3JtYWxpemVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBub3JtYWxpemVyLmlubmVySFRNTCA9IG1hcmt1cDtcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRNYXJrdXAgPSBub3JtYWxpemVyLmlubmVySFRNTDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9ybWFsaXplciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChub3JtYWxpemVyKTtcbiAgICAgICAgICAgIG5vcm1hbGl6ZXIuY29udGVudERvY3VtZW50LndyaXRlKG1hcmt1cCk7XG4gICAgICAgICAgICBub3JtYWxpemVkTWFya3VwID0gbm9ybWFsaXplci5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobm9ybWFsaXplcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRpZmZJbmRleCA9IGZpcnN0RGlmZmVyZW5jZUluZGV4KG5vcm1hbGl6ZWRNYXJrdXAsIHJvb3RNYXJrdXApO1xuICAgICAgICB2YXIgZGlmZmVyZW5jZSA9ICcgKGNsaWVudCkgJyArIG5vcm1hbGl6ZWRNYXJrdXAuc3Vic3RyaW5nKGRpZmZJbmRleCAtIDIwLCBkaWZmSW5kZXggKyAyMCkgKyAnXFxuIChzZXJ2ZXIpICcgKyByb290TWFya3VwLnN1YnN0cmluZyhkaWZmSW5kZXggLSAyMCwgZGlmZkluZGV4ICsgMjApO1xuXG4gICAgICAgICEoY29udGFpbmVyLm5vZGVUeXBlICE9PSBET0NfTk9ERV9UWVBFKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnWW91XFwncmUgdHJ5aW5nIHRvIHJlbmRlciBhIGNvbXBvbmVudCB0byB0aGUgZG9jdW1lbnQgdXNpbmcgc2VydmVyIHJlbmRlcmluZyBidXQgdGhlIGNoZWNrc3VtIHdhcyBpbnZhbGlkLiBUaGlzIHVzdWFsbHkgbWVhbnMgeW91IHJlbmRlcmVkIGEgZGlmZmVyZW50IGNvbXBvbmVudCB0eXBlIG9yIHByb3BzIG9uIHRoZSBjbGllbnQgZnJvbSB0aGUgb25lIG9uIHRoZSBzZXJ2ZXIsIG9yIHlvdXIgcmVuZGVyKCkgbWV0aG9kcyBhcmUgaW1wdXJlLiBSZWFjdCBjYW5ub3QgaGFuZGxlIHRoaXMgY2FzZSBkdWUgdG8gY3Jvc3MtYnJvd3NlciBxdWlya3MgYnkgcmVuZGVyaW5nIGF0IHRoZSBkb2N1bWVudCByb290LiBZb3Ugc2hvdWxkIGxvb2sgZm9yIGVudmlyb25tZW50IGRlcGVuZGVudCBjb2RlIGluIHlvdXIgY29tcG9uZW50cyBhbmQgZW5zdXJlIHRoZSBwcm9wcyBhcmUgdGhlIHNhbWUgY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZTpcXG4lcycsIGRpZmZlcmVuY2UpIDogX3Byb2RJbnZhcmlhbnQoJzQyJywgZGlmZmVyZW5jZSkgOiB2b2lkIDA7XG5cbiAgICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnUmVhY3QgYXR0ZW1wdGVkIHRvIHJldXNlIG1hcmt1cCBpbiBhIGNvbnRhaW5lciBidXQgdGhlICcgKyAnY2hlY2tzdW0gd2FzIGludmFsaWQuIFRoaXMgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgeW91IGFyZSAnICsgJ3VzaW5nIHNlcnZlciByZW5kZXJpbmcgYW5kIHRoZSBtYXJrdXAgZ2VuZXJhdGVkIG9uIHRoZSAnICsgJ3NlcnZlciB3YXMgbm90IHdoYXQgdGhlIGNsaWVudCB3YXMgZXhwZWN0aW5nLiBSZWFjdCBpbmplY3RlZCAnICsgJ25ldyBtYXJrdXAgdG8gY29tcGVuc2F0ZSB3aGljaCB3b3JrcyBidXQgeW91IGhhdmUgbG9zdCBtYW55ICcgKyAnb2YgdGhlIGJlbmVmaXRzIG9mIHNlcnZlciByZW5kZXJpbmcuIEluc3RlYWQsIGZpZ3VyZSBvdXQgJyArICd3aHkgdGhlIG1hcmt1cCBiZWluZyBnZW5lcmF0ZWQgaXMgZGlmZmVyZW50IG9uIHRoZSBjbGllbnQgJyArICdvciBzZXJ2ZXI6XFxuJXMnLCBkaWZmZXJlbmNlKSA6IHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgICEoY29udGFpbmVyLm5vZGVUeXBlICE9PSBET0NfTk9ERV9UWVBFKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnWW91XFwncmUgdHJ5aW5nIHRvIHJlbmRlciBhIGNvbXBvbmVudCB0byB0aGUgZG9jdW1lbnQgYnV0IHlvdSBkaWRuXFwndCB1c2Ugc2VydmVyIHJlbmRlcmluZy4gV2UgY2FuXFwndCBkbyB0aGlzIHdpdGhvdXQgdXNpbmcgc2VydmVyIHJlbmRlcmluZyBkdWUgdG8gY3Jvc3MtYnJvd3NlciBxdWlya3MuIFNlZSBSZWFjdERPTVNlcnZlci5yZW5kZXJUb1N0cmluZygpIGZvciBzZXJ2ZXIgcmVuZGVyaW5nLicpIDogX3Byb2RJbnZhcmlhbnQoJzQzJykgOiB2b2lkIDA7XG5cbiAgICBpZiAodHJhbnNhY3Rpb24udXNlQ3JlYXRlRWxlbWVudCkge1xuICAgICAgd2hpbGUgKGNvbnRhaW5lci5sYXN0Q2hpbGQpIHtcbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGNvbnRhaW5lci5sYXN0Q2hpbGQpO1xuICAgICAgfVxuICAgICAgRE9NTGF6eVRyZWUuaW5zZXJ0VHJlZUJlZm9yZShjb250YWluZXIsIG1hcmt1cCwgbnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldElubmVySFRNTChjb250YWluZXIsIG1hcmt1cCk7XG4gICAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUucHJlY2FjaGVOb2RlKGluc3RhbmNlLCBjb250YWluZXIuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgaG9zdE5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShjb250YWluZXIuZmlyc3RDaGlsZCk7XG4gICAgICBpZiAoaG9zdE5vZGUuX2RlYnVnSUQgIT09IDApIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgICAgaW5zdGFuY2VJRDogaG9zdE5vZGUuX2RlYnVnSUQsXG4gICAgICAgICAgdHlwZTogJ21vdW50JyxcbiAgICAgICAgICBwYXlsb2FkOiBtYXJrdXAudG9TdHJpbmcoKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RNb3VudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0SW5zdGFuY2VNYXAgPSByZXF1aXJlKCcuL1JlYWN0SW5zdGFuY2VNYXAnKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVyJyk7XG52YXIgUmVhY3RSZWNvbmNpbGVyID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZXInKTtcbnZhciBSZWFjdENoaWxkUmVjb25jaWxlciA9IHJlcXVpcmUoJy4vUmVhY3RDaGlsZFJlY29uY2lsZXInKTtcblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG52YXIgZmxhdHRlbkNoaWxkcmVuID0gcmVxdWlyZSgnLi9mbGF0dGVuQ2hpbGRyZW4nKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBNYWtlIGFuIHVwZGF0ZSBmb3IgbWFya3VwIHRvIGJlIHJlbmRlcmVkIGFuZCBpbnNlcnRlZCBhdCBhIHN1cHBsaWVkIGluZGV4LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgTWFya3VwIHRoYXQgcmVuZGVycyBpbnRvIGFuIGVsZW1lbnQuXG4gKiBAcGFyYW0ge251bWJlcn0gdG9JbmRleCBEZXN0aW5hdGlvbiBpbmRleC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIG1ha2VJbnNlcnRNYXJrdXAobWFya3VwLCBhZnRlck5vZGUsIHRvSW5kZXgpIHtcbiAgLy8gTk9URTogTnVsbCB2YWx1ZXMgcmVkdWNlIGhpZGRlbiBjbGFzc2VzLlxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdJTlNFUlRfTUFSS1VQJyxcbiAgICBjb250ZW50OiBtYXJrdXAsXG4gICAgZnJvbUluZGV4OiBudWxsLFxuICAgIGZyb21Ob2RlOiBudWxsLFxuICAgIHRvSW5kZXg6IHRvSW5kZXgsXG4gICAgYWZ0ZXJOb2RlOiBhZnRlck5vZGVcbiAgfTtcbn1cblxuLyoqXG4gKiBNYWtlIGFuIHVwZGF0ZSBmb3IgbW92aW5nIGFuIGV4aXN0aW5nIGVsZW1lbnQgdG8gYW5vdGhlciBpbmRleC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFNvdXJjZSBpbmRleCBvZiB0aGUgZXhpc3RpbmcgZWxlbWVudC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB0b0luZGV4IERlc3RpbmF0aW9uIGluZGV4IG9mIHRoZSBlbGVtZW50LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbWFrZU1vdmUoY2hpbGQsIGFmdGVyTm9kZSwgdG9JbmRleCkge1xuICAvLyBOT1RFOiBOdWxsIHZhbHVlcyByZWR1Y2UgaGlkZGVuIGNsYXNzZXMuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ01PVkVfRVhJU1RJTkcnLFxuICAgIGNvbnRlbnQ6IG51bGwsXG4gICAgZnJvbUluZGV4OiBjaGlsZC5fbW91bnRJbmRleCxcbiAgICBmcm9tTm9kZTogUmVhY3RSZWNvbmNpbGVyLmdldEhvc3ROb2RlKGNoaWxkKSxcbiAgICB0b0luZGV4OiB0b0luZGV4LFxuICAgIGFmdGVyTm9kZTogYWZ0ZXJOb2RlXG4gIH07XG59XG5cbi8qKlxuICogTWFrZSBhbiB1cGRhdGUgZm9yIHJlbW92aW5nIGFuIGVsZW1lbnQgYXQgYW4gaW5kZXguXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBJbmRleCBvZiB0aGUgZWxlbWVudCB0byByZW1vdmUuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBtYWtlUmVtb3ZlKGNoaWxkLCBub2RlKSB7XG4gIC8vIE5PVEU6IE51bGwgdmFsdWVzIHJlZHVjZSBoaWRkZW4gY2xhc3Nlcy5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnUkVNT1ZFX05PREUnLFxuICAgIGNvbnRlbnQ6IG51bGwsXG4gICAgZnJvbUluZGV4OiBjaGlsZC5fbW91bnRJbmRleCxcbiAgICBmcm9tTm9kZTogbm9kZSxcbiAgICB0b0luZGV4OiBudWxsLFxuICAgIGFmdGVyTm9kZTogbnVsbFxuICB9O1xufVxuXG4vKipcbiAqIE1ha2UgYW4gdXBkYXRlIGZvciBzZXR0aW5nIHRoZSBtYXJrdXAgb2YgYSBub2RlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgTWFya3VwIHRoYXQgcmVuZGVycyBpbnRvIGFuIGVsZW1lbnQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBtYWtlU2V0TWFya3VwKG1hcmt1cCkge1xuICAvLyBOT1RFOiBOdWxsIHZhbHVlcyByZWR1Y2UgaGlkZGVuIGNsYXNzZXMuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ1NFVF9NQVJLVVAnLFxuICAgIGNvbnRlbnQ6IG1hcmt1cCxcbiAgICBmcm9tSW5kZXg6IG51bGwsXG4gICAgZnJvbU5vZGU6IG51bGwsXG4gICAgdG9JbmRleDogbnVsbCxcbiAgICBhZnRlck5vZGU6IG51bGxcbiAgfTtcbn1cblxuLyoqXG4gKiBNYWtlIGFuIHVwZGF0ZSBmb3Igc2V0dGluZyB0aGUgdGV4dCBjb250ZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0Q29udGVudCBUZXh0IGNvbnRlbnQgdG8gc2V0LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbWFrZVRleHRDb250ZW50KHRleHRDb250ZW50KSB7XG4gIC8vIE5PVEU6IE51bGwgdmFsdWVzIHJlZHVjZSBoaWRkZW4gY2xhc3Nlcy5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnVEVYVF9DT05URU5UJyxcbiAgICBjb250ZW50OiB0ZXh0Q29udGVudCxcbiAgICBmcm9tSW5kZXg6IG51bGwsXG4gICAgZnJvbU5vZGU6IG51bGwsXG4gICAgdG9JbmRleDogbnVsbCxcbiAgICBhZnRlck5vZGU6IG51bGxcbiAgfTtcbn1cblxuLyoqXG4gKiBQdXNoIGFuIHVwZGF0ZSwgaWYgYW55LCBvbnRvIHRoZSBxdWV1ZS4gQ3JlYXRlcyBhIG5ldyBxdWV1ZSBpZiBub25lIGlzXG4gKiBwYXNzZWQgYW5kIGFsd2F5cyByZXR1cm5zIHRoZSBxdWV1ZS4gTXV0YXRpdmUuXG4gKi9cbmZ1bmN0aW9uIGVucXVldWUocXVldWUsIHVwZGF0ZSkge1xuICBpZiAodXBkYXRlKSB7XG4gICAgcXVldWUgPSBxdWV1ZSB8fCBbXTtcbiAgICBxdWV1ZS5wdXNoKHVwZGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHF1ZXVlO1xufVxuXG4vKipcbiAqIFByb2Nlc3NlcyBhbnkgZW5xdWV1ZWQgdXBkYXRlcy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBwcm9jZXNzUXVldWUoaW5zdCwgdXBkYXRlUXVldWUpIHtcbiAgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5wcm9jZXNzQ2hpbGRyZW5VcGRhdGVzKGluc3QsIHVwZGF0ZVF1ZXVlKTtcbn1cblxudmFyIHNldENoaWxkcmVuRm9ySW5zdHJ1bWVudGF0aW9uID0gZW1wdHlGdW5jdGlvbjtcbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgZ2V0RGVidWdJRCA9IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgaWYgKCFpbnN0Ll9kZWJ1Z0lEKSB7XG4gICAgICAvLyBDaGVjayBmb3IgQVJULWxpa2UgaW5zdGFuY2VzLiBUT0RPOiBUaGlzIGlzIHNpbGx5L2dyb3NzLlxuICAgICAgdmFyIGludGVybmFsO1xuICAgICAgaWYgKGludGVybmFsID0gUmVhY3RJbnN0YW5jZU1hcC5nZXQoaW5zdCkpIHtcbiAgICAgICAgaW5zdCA9IGludGVybmFsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW5zdC5fZGVidWdJRDtcbiAgfTtcbiAgc2V0Q2hpbGRyZW5Gb3JJbnN0cnVtZW50YXRpb24gPSBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcbiAgICB2YXIgZGVidWdJRCA9IGdldERlYnVnSUQodGhpcyk7XG4gICAgLy8gVE9ETzogUmVhY3QgTmF0aXZlIGVtcHR5IGNvbXBvbmVudHMgYXJlIGFsc28gbXVsdGljaGlsZC5cbiAgICAvLyBUaGlzIG1lYW5zIHRoZXkgc3RpbGwgZ2V0IGludG8gdGhpcyBtZXRob2QgYnV0IGRvbid0IGhhdmUgX2RlYnVnSUQuXG4gICAgaWYgKGRlYnVnSUQgIT09IDApIHtcbiAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblNldENoaWxkcmVuKGRlYnVnSUQsIGNoaWxkcmVuID8gT2JqZWN0LmtleXMoY2hpbGRyZW4pLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBjaGlsZHJlbltrZXldLl9kZWJ1Z0lEO1xuICAgICAgfSkgOiBbXSk7XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFJlYWN0TXVsdGlDaGlsZCBhcmUgY2FwYWJsZSBvZiByZWNvbmNpbGluZyBtdWx0aXBsZSBjaGlsZHJlbi5cbiAqXG4gKiBAY2xhc3MgUmVhY3RNdWx0aUNoaWxkXG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIFJlYWN0TXVsdGlDaGlsZCA9IHtcblxuICAvKipcbiAgICogUHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgZm9yIGNvbXBvbmVudHMgdGhhdCBtdXN0IHJlY29uY2lsZSBtdWx0aXBsZVxuICAgKiBjaGlsZHJlbi4gVGhpcyBpcyB1c2VkIGJ5IGBSZWFjdERPTUNvbXBvbmVudGAgdG8gbW91bnQsIHVwZGF0ZSwgYW5kXG4gICAqIHVubW91bnQgY2hpbGQgY29tcG9uZW50cy5cbiAgICpcbiAgICogQGxlbmRzIHtSZWFjdE11bHRpQ2hpbGQucHJvdG90eXBlfVxuICAgKi9cbiAgTWl4aW46IHtcblxuICAgIF9yZWNvbmNpbGVySW5zdGFudGlhdGVDaGlsZHJlbjogZnVuY3Rpb24gKG5lc3RlZENoaWxkcmVuLCB0cmFuc2FjdGlvbiwgY29udGV4dCkge1xuICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHZhciBzZWxmRGVidWdJRCA9IGdldERlYnVnSUQodGhpcyk7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50RWxlbWVudCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgcmV0dXJuIFJlYWN0Q2hpbGRSZWNvbmNpbGVyLmluc3RhbnRpYXRlQ2hpbGRyZW4obmVzdGVkQ2hpbGRyZW4sIHRyYW5zYWN0aW9uLCBjb250ZXh0LCBzZWxmRGVidWdJRCk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIFJlYWN0Q2hpbGRSZWNvbmNpbGVyLmluc3RhbnRpYXRlQ2hpbGRyZW4obmVzdGVkQ2hpbGRyZW4sIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICB9LFxuXG4gICAgX3JlY29uY2lsZXJVcGRhdGVDaGlsZHJlbjogZnVuY3Rpb24gKHByZXZDaGlsZHJlbiwgbmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMsIG1vdW50SW1hZ2VzLCByZW1vdmVkTm9kZXMsIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICB2YXIgbmV4dENoaWxkcmVuO1xuICAgICAgdmFyIHNlbGZEZWJ1Z0lEID0gMDtcbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBzZWxmRGVidWdJRCA9IGdldERlYnVnSUQodGhpcyk7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50RWxlbWVudCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQuX293bmVyO1xuICAgICAgICAgICAgbmV4dENoaWxkcmVuID0gZmxhdHRlbkNoaWxkcmVuKG5leHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzLCBzZWxmRGVidWdJRCk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBSZWFjdENoaWxkUmVjb25jaWxlci51cGRhdGVDaGlsZHJlbihwcmV2Q2hpbGRyZW4sIG5leHRDaGlsZHJlbiwgbW91bnRJbWFnZXMsIHJlbW92ZWROb2RlcywgdHJhbnNhY3Rpb24sIHRoaXMsIHRoaXMuX2hvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBzZWxmRGVidWdJRCk7XG4gICAgICAgICAgcmV0dXJuIG5leHRDaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbmV4dENoaWxkcmVuID0gZmxhdHRlbkNoaWxkcmVuKG5leHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzLCBzZWxmRGVidWdJRCk7XG4gICAgICBSZWFjdENoaWxkUmVjb25jaWxlci51cGRhdGVDaGlsZHJlbihwcmV2Q2hpbGRyZW4sIG5leHRDaGlsZHJlbiwgbW91bnRJbWFnZXMsIHJlbW92ZWROb2RlcywgdHJhbnNhY3Rpb24sIHRoaXMsIHRoaXMuX2hvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBzZWxmRGVidWdJRCk7XG4gICAgICByZXR1cm4gbmV4dENoaWxkcmVuO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSBcIm1vdW50IGltYWdlXCIgZm9yIGVhY2ggb2YgdGhlIHN1cHBsaWVkIGNoaWxkcmVuLiBJbiB0aGUgY2FzZVxuICAgICAqIG9mIGBSZWFjdERPTUNvbXBvbmVudGAsIGEgbW91bnQgaW1hZ2UgaXMgYSBzdHJpbmcgb2YgbWFya3VwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXN0ZWRDaGlsZHJlbiBOZXN0ZWQgY2hpbGQgbWFwcy5cbiAgICAgKiBAcmV0dXJuIHthcnJheX0gQW4gYXJyYXkgb2YgbW91bnRlZCByZXByZXNlbnRhdGlvbnMuXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgbW91bnRDaGlsZHJlbjogZnVuY3Rpb24gKG5lc3RlZENoaWxkcmVuLCB0cmFuc2FjdGlvbiwgY29udGV4dCkge1xuICAgICAgdmFyIGNoaWxkcmVuID0gdGhpcy5fcmVjb25jaWxlckluc3RhbnRpYXRlQ2hpbGRyZW4obmVzdGVkQ2hpbGRyZW4sIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICAgIHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW4gPSBjaGlsZHJlbjtcblxuICAgICAgdmFyIG1vdW50SW1hZ2VzID0gW107XG4gICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgZm9yICh2YXIgbmFtZSBpbiBjaGlsZHJlbikge1xuICAgICAgICBpZiAoY2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltuYW1lXTtcbiAgICAgICAgICB2YXIgc2VsZkRlYnVnSUQgPSAwO1xuICAgICAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgc2VsZkRlYnVnSUQgPSBnZXREZWJ1Z0lEKHRoaXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgbW91bnRJbWFnZSA9IFJlYWN0UmVjb25jaWxlci5tb3VudENvbXBvbmVudChjaGlsZCwgdHJhbnNhY3Rpb24sIHRoaXMsIHRoaXMuX2hvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBzZWxmRGVidWdJRCk7XG4gICAgICAgICAgY2hpbGQuX21vdW50SW5kZXggPSBpbmRleCsrO1xuICAgICAgICAgIG1vdW50SW1hZ2VzLnB1c2gobW91bnRJbWFnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHNldENoaWxkcmVuRm9ySW5zdHJ1bWVudGF0aW9uLmNhbGwodGhpcywgY2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbW91bnRJbWFnZXM7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2VzIGFueSByZW5kZXJlZCBjaGlsZHJlbiB3aXRoIGEgdGV4dCBjb250ZW50IHN0cmluZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXh0Q29udGVudCBTdHJpbmcgb2YgY29udGVudC5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB1cGRhdGVUZXh0Q29udGVudDogZnVuY3Rpb24gKG5leHRDb250ZW50KSB7XG4gICAgICB2YXIgcHJldkNoaWxkcmVuID0gdGhpcy5fcmVuZGVyZWRDaGlsZHJlbjtcbiAgICAgIC8vIFJlbW92ZSBhbnkgcmVuZGVyZWQgY2hpbGRyZW4uXG4gICAgICBSZWFjdENoaWxkUmVjb25jaWxlci51bm1vdW50Q2hpbGRyZW4ocHJldkNoaWxkcmVuLCBmYWxzZSk7XG4gICAgICBmb3IgKHZhciBuYW1lIGluIHByZXZDaGlsZHJlbikge1xuICAgICAgICBpZiAocHJldkNoaWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgIWZhbHNlID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd1cGRhdGVUZXh0Q29udGVudCBjYWxsZWQgb24gbm9uLWVtcHR5IGNvbXBvbmVudC4nKSA6IF9wcm9kSW52YXJpYW50KCcxMTgnKSA6IHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gU2V0IG5ldyB0ZXh0IGNvbnRlbnQuXG4gICAgICB2YXIgdXBkYXRlcyA9IFttYWtlVGV4dENvbnRlbnQobmV4dENvbnRlbnQpXTtcbiAgICAgIHByb2Nlc3NRdWV1ZSh0aGlzLCB1cGRhdGVzKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgYW55IHJlbmRlcmVkIGNoaWxkcmVuIHdpdGggYSBtYXJrdXAgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5leHRNYXJrdXAgU3RyaW5nIG9mIG1hcmt1cC5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB1cGRhdGVNYXJrdXA6IGZ1bmN0aW9uIChuZXh0TWFya3VwKSB7XG4gICAgICB2YXIgcHJldkNoaWxkcmVuID0gdGhpcy5fcmVuZGVyZWRDaGlsZHJlbjtcbiAgICAgIC8vIFJlbW92ZSBhbnkgcmVuZGVyZWQgY2hpbGRyZW4uXG4gICAgICBSZWFjdENoaWxkUmVjb25jaWxlci51bm1vdW50Q2hpbGRyZW4ocHJldkNoaWxkcmVuLCBmYWxzZSk7XG4gICAgICBmb3IgKHZhciBuYW1lIGluIHByZXZDaGlsZHJlbikge1xuICAgICAgICBpZiAocHJldkNoaWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgIWZhbHNlID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd1cGRhdGVUZXh0Q29udGVudCBjYWxsZWQgb24gbm9uLWVtcHR5IGNvbXBvbmVudC4nKSA6IF9wcm9kSW52YXJpYW50KCcxMTgnKSA6IHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHVwZGF0ZXMgPSBbbWFrZVNldE1hcmt1cChuZXh0TWFya3VwKV07XG4gICAgICBwcm9jZXNzUXVldWUodGhpcywgdXBkYXRlcyk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHJlbmRlcmVkIGNoaWxkcmVuIHdpdGggbmV3IGNoaWxkcmVuLlxuICAgICAqXG4gICAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cyBOZXN0ZWQgY2hpbGQgZWxlbWVudCBtYXBzLlxuICAgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB1cGRhdGVDaGlsZHJlbjogZnVuY3Rpb24gKG5leHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzLCB0cmFuc2FjdGlvbiwgY29udGV4dCkge1xuICAgICAgLy8gSG9vayB1c2VkIGJ5IFJlYWN0IEFSVFxuICAgICAgdGhpcy5fdXBkYXRlQ2hpbGRyZW4obmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMsIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cyBOZXN0ZWQgY2hpbGQgZWxlbWVudCBtYXBzLlxuICAgICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICAgKiBAZmluYWxcbiAgICAgKiBAcHJvdGVjdGVkXG4gICAgICovXG4gICAgX3VwZGF0ZUNoaWxkcmVuOiBmdW5jdGlvbiAobmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMsIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICB2YXIgcHJldkNoaWxkcmVuID0gdGhpcy5fcmVuZGVyZWRDaGlsZHJlbjtcbiAgICAgIHZhciByZW1vdmVkTm9kZXMgPSB7fTtcbiAgICAgIHZhciBtb3VudEltYWdlcyA9IFtdO1xuICAgICAgdmFyIG5leHRDaGlsZHJlbiA9IHRoaXMuX3JlY29uY2lsZXJVcGRhdGVDaGlsZHJlbihwcmV2Q2hpbGRyZW4sIG5leHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzLCBtb3VudEltYWdlcywgcmVtb3ZlZE5vZGVzLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG4gICAgICBpZiAoIW5leHRDaGlsZHJlbiAmJiAhcHJldkNoaWxkcmVuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciB1cGRhdGVzID0gbnVsbDtcbiAgICAgIHZhciBuYW1lO1xuICAgICAgLy8gYG5leHRJbmRleGAgd2lsbCBpbmNyZW1lbnQgZm9yIGVhY2ggY2hpbGQgaW4gYG5leHRDaGlsZHJlbmAsIGJ1dFxuICAgICAgLy8gYGxhc3RJbmRleGAgd2lsbCBiZSB0aGUgbGFzdCBpbmRleCB2aXNpdGVkIGluIGBwcmV2Q2hpbGRyZW5gLlxuICAgICAgdmFyIG5leHRJbmRleCA9IDA7XG4gICAgICB2YXIgbGFzdEluZGV4ID0gMDtcbiAgICAgIC8vIGBuZXh0TW91bnRJbmRleGAgd2lsbCBpbmNyZW1lbnQgZm9yIGVhY2ggbmV3bHkgbW91bnRlZCBjaGlsZC5cbiAgICAgIHZhciBuZXh0TW91bnRJbmRleCA9IDA7XG4gICAgICB2YXIgbGFzdFBsYWNlZE5vZGUgPSBudWxsO1xuICAgICAgZm9yIChuYW1lIGluIG5leHRDaGlsZHJlbikge1xuICAgICAgICBpZiAoIW5leHRDaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwcmV2Q2hpbGQgPSBwcmV2Q2hpbGRyZW4gJiYgcHJldkNoaWxkcmVuW25hbWVdO1xuICAgICAgICB2YXIgbmV4dENoaWxkID0gbmV4dENoaWxkcmVuW25hbWVdO1xuICAgICAgICBpZiAocHJldkNoaWxkID09PSBuZXh0Q2hpbGQpIHtcbiAgICAgICAgICB1cGRhdGVzID0gZW5xdWV1ZSh1cGRhdGVzLCB0aGlzLm1vdmVDaGlsZChwcmV2Q2hpbGQsIGxhc3RQbGFjZWROb2RlLCBuZXh0SW5kZXgsIGxhc3RJbmRleCkpO1xuICAgICAgICAgIGxhc3RJbmRleCA9IE1hdGgubWF4KHByZXZDaGlsZC5fbW91bnRJbmRleCwgbGFzdEluZGV4KTtcbiAgICAgICAgICBwcmV2Q2hpbGQuX21vdW50SW5kZXggPSBuZXh0SW5kZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHByZXZDaGlsZCkge1xuICAgICAgICAgICAgLy8gVXBkYXRlIGBsYXN0SW5kZXhgIGJlZm9yZSBgX21vdW50SW5kZXhgIGdldHMgdW5zZXQgYnkgdW5tb3VudGluZy5cbiAgICAgICAgICAgIGxhc3RJbmRleCA9IE1hdGgubWF4KHByZXZDaGlsZC5fbW91bnRJbmRleCwgbGFzdEluZGV4KTtcbiAgICAgICAgICAgIC8vIFRoZSBgcmVtb3ZlZE5vZGVzYCBsb29wIGJlbG93IHdpbGwgYWN0dWFsbHkgcmVtb3ZlIHRoZSBjaGlsZC5cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gVGhlIGNoaWxkIG11c3QgYmUgaW5zdGFudGlhdGVkIGJlZm9yZSBpdCdzIG1vdW50ZWQuXG4gICAgICAgICAgdXBkYXRlcyA9IGVucXVldWUodXBkYXRlcywgdGhpcy5fbW91bnRDaGlsZEF0SW5kZXgobmV4dENoaWxkLCBtb3VudEltYWdlc1tuZXh0TW91bnRJbmRleF0sIGxhc3RQbGFjZWROb2RlLCBuZXh0SW5kZXgsIHRyYW5zYWN0aW9uLCBjb250ZXh0KSk7XG4gICAgICAgICAgbmV4dE1vdW50SW5kZXgrKztcbiAgICAgICAgfVxuICAgICAgICBuZXh0SW5kZXgrKztcbiAgICAgICAgbGFzdFBsYWNlZE5vZGUgPSBSZWFjdFJlY29uY2lsZXIuZ2V0SG9zdE5vZGUobmV4dENoaWxkKTtcbiAgICAgIH1cbiAgICAgIC8vIFJlbW92ZSBjaGlsZHJlbiB0aGF0IGFyZSBubyBsb25nZXIgcHJlc2VudC5cbiAgICAgIGZvciAobmFtZSBpbiByZW1vdmVkTm9kZXMpIHtcbiAgICAgICAgaWYgKHJlbW92ZWROb2Rlcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgIHVwZGF0ZXMgPSBlbnF1ZXVlKHVwZGF0ZXMsIHRoaXMuX3VubW91bnRDaGlsZChwcmV2Q2hpbGRyZW5bbmFtZV0sIHJlbW92ZWROb2Rlc1tuYW1lXSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodXBkYXRlcykge1xuICAgICAgICBwcm9jZXNzUXVldWUodGhpcywgdXBkYXRlcyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9yZW5kZXJlZENoaWxkcmVuID0gbmV4dENoaWxkcmVuO1xuXG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgc2V0Q2hpbGRyZW5Gb3JJbnN0cnVtZW50YXRpb24uY2FsbCh0aGlzLCBuZXh0Q2hpbGRyZW4pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBVbm1vdW50cyBhbGwgcmVuZGVyZWQgY2hpbGRyZW4uIFRoaXMgc2hvdWxkIGJlIHVzZWQgdG8gY2xlYW4gdXAgY2hpbGRyZW5cbiAgICAgKiB3aGVuIHRoaXMgY29tcG9uZW50IGlzIHVubW91bnRlZC4gSXQgZG9lcyBub3QgYWN0dWFsbHkgcGVyZm9ybSBhbnlcbiAgICAgKiBiYWNrZW5kIG9wZXJhdGlvbnMuXG4gICAgICpcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICB1bm1vdW50Q2hpbGRyZW46IGZ1bmN0aW9uIChzYWZlbHkpIHtcbiAgICAgIHZhciByZW5kZXJlZENoaWxkcmVuID0gdGhpcy5fcmVuZGVyZWRDaGlsZHJlbjtcbiAgICAgIFJlYWN0Q2hpbGRSZWNvbmNpbGVyLnVubW91bnRDaGlsZHJlbihyZW5kZXJlZENoaWxkcmVuLCBzYWZlbHkpO1xuICAgICAgdGhpcy5fcmVuZGVyZWRDaGlsZHJlbiA9IG51bGw7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE1vdmVzIGEgY2hpbGQgY29tcG9uZW50IHRvIHRoZSBzdXBwbGllZCBpbmRleC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGNoaWxkIENvbXBvbmVudCB0byBtb3ZlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0b0luZGV4IERlc3RpbmF0aW9uIGluZGV4IG9mIHRoZSBlbGVtZW50LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBsYXN0SW5kZXggTGFzdCBpbmRleCB2aXNpdGVkIG9mIHRoZSBzaWJsaW5ncyBvZiBgY2hpbGRgLlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBtb3ZlQ2hpbGQ6IGZ1bmN0aW9uIChjaGlsZCwgYWZ0ZXJOb2RlLCB0b0luZGV4LCBsYXN0SW5kZXgpIHtcbiAgICAgIC8vIElmIHRoZSBpbmRleCBvZiBgY2hpbGRgIGlzIGxlc3MgdGhhbiBgbGFzdEluZGV4YCwgdGhlbiBpdCBuZWVkcyB0b1xuICAgICAgLy8gYmUgbW92ZWQuIE90aGVyd2lzZSwgd2UgZG8gbm90IG5lZWQgdG8gbW92ZSBpdCBiZWNhdXNlIGEgY2hpbGQgd2lsbCBiZVxuICAgICAgLy8gaW5zZXJ0ZWQgb3IgbW92ZWQgYmVmb3JlIGBjaGlsZGAuXG4gICAgICBpZiAoY2hpbGQuX21vdW50SW5kZXggPCBsYXN0SW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIG1ha2VNb3ZlKGNoaWxkLCBhZnRlck5vZGUsIHRvSW5kZXgpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgY2hpbGQgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY2hpbGQgQ29tcG9uZW50IHRvIGNyZWF0ZS5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW91bnRJbWFnZSBNYXJrdXAgdG8gaW5zZXJ0LlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBjcmVhdGVDaGlsZDogZnVuY3Rpb24gKGNoaWxkLCBhZnRlck5vZGUsIG1vdW50SW1hZ2UpIHtcbiAgICAgIHJldHVybiBtYWtlSW5zZXJ0TWFya3VwKG1vdW50SW1hZ2UsIGFmdGVyTm9kZSwgY2hpbGQuX21vdW50SW5kZXgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIGEgY2hpbGQgY29tcG9uZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY2hpbGQgQ2hpbGQgdG8gcmVtb3ZlLlxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICByZW1vdmVDaGlsZDogZnVuY3Rpb24gKGNoaWxkLCBub2RlKSB7XG4gICAgICByZXR1cm4gbWFrZVJlbW92ZShjaGlsZCwgbm9kZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE1vdW50cyBhIGNoaWxkIHdpdGggdGhlIHN1cHBsaWVkIG5hbWUuXG4gICAgICpcbiAgICAgKiBOT1RFOiBUaGlzIGlzIHBhcnQgb2YgYHVwZGF0ZUNoaWxkcmVuYCBhbmQgaXMgaGVyZSBmb3IgcmVhZGFiaWxpdHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjaGlsZCBDb21wb25lbnQgdG8gbW91bnQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgY2hpbGQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IGF0IHdoaWNoIHRvIGluc2VydCB0aGUgY2hpbGQuXG4gICAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX21vdW50Q2hpbGRBdEluZGV4OiBmdW5jdGlvbiAoY2hpbGQsIG1vdW50SW1hZ2UsIGFmdGVyTm9kZSwgaW5kZXgsIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICBjaGlsZC5fbW91bnRJbmRleCA9IGluZGV4O1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQ2hpbGQoY2hpbGQsIGFmdGVyTm9kZSwgbW91bnRJbWFnZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVubW91bnRzIGEgcmVuZGVyZWQgY2hpbGQuXG4gICAgICpcbiAgICAgKiBOT1RFOiBUaGlzIGlzIHBhcnQgb2YgYHVwZGF0ZUNoaWxkcmVuYCBhbmQgaXMgaGVyZSBmb3IgcmVhZGFiaWxpdHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjaGlsZCBDb21wb25lbnQgdG8gdW5tb3VudC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIF91bm1vdW50Q2hpbGQ6IGZ1bmN0aW9uIChjaGlsZCwgbm9kZSkge1xuICAgICAgdmFyIHVwZGF0ZSA9IHRoaXMucmVtb3ZlQ2hpbGQoY2hpbGQsIG5vZGUpO1xuICAgICAgY2hpbGQuX21vdW50SW5kZXggPSBudWxsO1xuICAgICAgcmV0dXJuIHVwZGF0ZTtcbiAgICB9XG5cbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0TXVsdGlDaGlsZDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdE5vZGVUeXBlcyA9IHtcbiAgSE9TVDogMCxcbiAgQ09NUE9TSVRFOiAxLFxuICBFTVBUWTogMixcblxuICBnZXRUeXBlOiBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmIChub2RlID09PSBudWxsIHx8IG5vZGUgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gUmVhY3ROb2RlVHlwZXMuRU1QVFk7XG4gICAgfSBlbHNlIGlmIChSZWFjdC5pc1ZhbGlkRWxlbWVudChub2RlKSkge1xuICAgICAgaWYgKHR5cGVvZiBub2RlLnR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIFJlYWN0Tm9kZVR5cGVzLkNPTVBPU0lURTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBSZWFjdE5vZGVUeXBlcy5IT1NUO1xuICAgICAgfVxuICAgIH1cbiAgICAhZmFsc2UgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1VuZXhwZWN0ZWQgbm9kZTogJXMnLCBub2RlKSA6IF9wcm9kSW52YXJpYW50KCcyNicsIG5vZGUpIDogdm9pZCAwO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Tm9kZVR5cGVzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgdmFsaWQgb3duZXIuXG4gKiBAZmluYWxcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZE93bmVyKG9iamVjdCkge1xuICByZXR1cm4gISEob2JqZWN0ICYmIHR5cGVvZiBvYmplY3QuYXR0YWNoUmVmID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmplY3QuZGV0YWNoUmVmID09PSAnZnVuY3Rpb24nKTtcbn1cblxuLyoqXG4gKiBSZWFjdE93bmVycyBhcmUgY2FwYWJsZSBvZiBzdG9yaW5nIHJlZmVyZW5jZXMgdG8gb3duZWQgY29tcG9uZW50cy5cbiAqXG4gKiBBbGwgY29tcG9uZW50cyBhcmUgY2FwYWJsZSBvZiAvL2JlaW5nLy8gcmVmZXJlbmNlZCBieSBvd25lciBjb21wb25lbnRzLCBidXRcbiAqIG9ubHkgUmVhY3RPd25lciBjb21wb25lbnRzIGFyZSBjYXBhYmxlIG9mIC8vcmVmZXJlbmNpbmcvLyBvd25lZCBjb21wb25lbnRzLlxuICogVGhlIG5hbWVkIHJlZmVyZW5jZSBpcyBrbm93biBhcyBhIFwicmVmXCIuXG4gKlxuICogUmVmcyBhcmUgYXZhaWxhYmxlIHdoZW4gbW91bnRlZCBhbmQgdXBkYXRlZCBkdXJpbmcgcmVjb25jaWxpYXRpb24uXG4gKlxuICogICB2YXIgTXlDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gKiAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHtcbiAqICAgICAgIHJldHVybiAoXG4gKiAgICAgICAgIDxkaXYgb25DbGljaz17dGhpcy5oYW5kbGVDbGlja30+XG4gKiAgICAgICAgICAgPEN1c3RvbUNvbXBvbmVudCByZWY9XCJjdXN0b21cIiAvPlxuICogICAgICAgICA8L2Rpdj5cbiAqICAgICAgICk7XG4gKiAgICAgfSxcbiAqICAgICBoYW5kbGVDbGljazogZnVuY3Rpb24oKSB7XG4gKiAgICAgICB0aGlzLnJlZnMuY3VzdG9tLmhhbmRsZUNsaWNrKCk7XG4gKiAgICAgfSxcbiAqICAgICBjb21wb25lbnREaWRNb3VudDogZnVuY3Rpb24oKSB7XG4gKiAgICAgICB0aGlzLnJlZnMuY3VzdG9tLmluaXRpYWxpemUoKTtcbiAqICAgICB9XG4gKiAgIH0pO1xuICpcbiAqIFJlZnMgc2hvdWxkIHJhcmVseSBiZSB1c2VkLiBXaGVuIHJlZnMgYXJlIHVzZWQsIHRoZXkgc2hvdWxkIG9ubHkgYmUgZG9uZSB0b1xuICogY29udHJvbCBkYXRhIHRoYXQgaXMgbm90IGhhbmRsZWQgYnkgUmVhY3QncyBkYXRhIGZsb3cuXG4gKlxuICogQGNsYXNzIFJlYWN0T3duZXJcbiAqL1xudmFyIFJlYWN0T3duZXIgPSB7XG4gIC8qKlxuICAgKiBBZGRzIGEgY29tcG9uZW50IGJ5IHJlZiB0byBhbiBvd25lciBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGNvbXBvbmVudCBDb21wb25lbnQgdG8gcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmIE5hbWUgYnkgd2hpY2ggdG8gcmVmZXIgdG8gdGhlIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIHtSZWFjdE93bmVyfSBvd25lciBDb21wb25lbnQgb24gd2hpY2ggdG8gcmVjb3JkIHRoZSByZWYuXG4gICAqIEBmaW5hbFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGFkZENvbXBvbmVudEFzUmVmVG86IGZ1bmN0aW9uIChjb21wb25lbnQsIHJlZiwgb3duZXIpIHtcbiAgICAhaXNWYWxpZE93bmVyKG93bmVyKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnYWRkQ29tcG9uZW50QXNSZWZUbyguLi4pOiBPbmx5IGEgUmVhY3RPd25lciBjYW4gaGF2ZSByZWZzLiBZb3UgbWlnaHQgYmUgYWRkaW5nIGEgcmVmIHRvIGEgY29tcG9uZW50IHRoYXQgd2FzIG5vdCBjcmVhdGVkIGluc2lkZSBhIGNvbXBvbmVudFxcJ3MgYHJlbmRlcmAgbWV0aG9kLCBvciB5b3UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgbG9hZGVkIChkZXRhaWxzOiBodHRwczovL2ZiLm1lL3JlYWN0LXJlZnMtbXVzdC1oYXZlLW93bmVyKS4nKSA6IF9wcm9kSW52YXJpYW50KCcxMTknKSA6IHZvaWQgMDtcbiAgICBvd25lci5hdHRhY2hSZWYocmVmLCBjb21wb25lbnQpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY29tcG9uZW50IGJ5IHJlZiBmcm9tIGFuIG93bmVyIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY29tcG9uZW50IENvbXBvbmVudCB0byBkZXJlZmVyZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZiBOYW1lIG9mIHRoZSByZWYgdG8gcmVtb3ZlLlxuICAgKiBAcGFyYW0ge1JlYWN0T3duZXJ9IG93bmVyIENvbXBvbmVudCBvbiB3aGljaCB0aGUgcmVmIGlzIHJlY29yZGVkLlxuICAgKiBAZmluYWxcbiAgICogQGludGVybmFsXG4gICAqL1xuICByZW1vdmVDb21wb25lbnRBc1JlZkZyb206IGZ1bmN0aW9uIChjb21wb25lbnQsIHJlZiwgb3duZXIpIHtcbiAgICAhaXNWYWxpZE93bmVyKG93bmVyKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAncmVtb3ZlQ29tcG9uZW50QXNSZWZGcm9tKC4uLik6IE9ubHkgYSBSZWFjdE93bmVyIGNhbiBoYXZlIHJlZnMuIFlvdSBtaWdodCBiZSByZW1vdmluZyBhIHJlZiB0byBhIGNvbXBvbmVudCB0aGF0IHdhcyBub3QgY3JlYXRlZCBpbnNpZGUgYSBjb21wb25lbnRcXCdzIGByZW5kZXJgIG1ldGhvZCwgb3IgeW91IGhhdmUgbXVsdGlwbGUgY29waWVzIG9mIFJlYWN0IGxvYWRlZCAoZGV0YWlsczogaHR0cHM6Ly9mYi5tZS9yZWFjdC1yZWZzLW11c3QtaGF2ZS1vd25lcikuJykgOiBfcHJvZEludmFyaWFudCgnMTIwJykgOiB2b2lkIDA7XG4gICAgdmFyIG93bmVyUHVibGljSW5zdGFuY2UgPSBvd25lci5nZXRQdWJsaWNJbnN0YW5jZSgpO1xuICAgIC8vIENoZWNrIHRoYXQgYGNvbXBvbmVudGAncyBvd25lciBpcyBzdGlsbCBhbGl2ZSBhbmQgdGhhdCBgY29tcG9uZW50YCBpcyBzdGlsbCB0aGUgY3VycmVudCByZWZcbiAgICAvLyBiZWNhdXNlIHdlIGRvIG5vdCB3YW50IHRvIGRldGFjaCB0aGUgcmVmIGlmIGFub3RoZXIgY29tcG9uZW50IHN0b2xlIGl0LlxuICAgIGlmIChvd25lclB1YmxpY0luc3RhbmNlICYmIG93bmVyUHVibGljSW5zdGFuY2UucmVmc1tyZWZdID09PSBjb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKSkge1xuICAgICAgb3duZXIuZGV0YWNoUmVmKHJlZik7XG4gICAgfVxuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RPd25lcjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcyA9IHt9O1xuXG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSB7XG4gICAgcHJvcDogJ3Byb3AnLFxuICAgIGNvbnRleHQ6ICdjb250ZXh0JyxcbiAgICBjaGlsZENvbnRleHQ6ICdjaGlsZCBjb250ZXh0J1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIENhbGxiYWNrUXVldWUgPSByZXF1aXJlKCcuL0NhbGxiYWNrUXVldWUnKTtcbnZhciBQb29sZWRDbGFzcyA9IHJlcXVpcmUoJy4vUG9vbGVkQ2xhc3MnKTtcbnZhciBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIgPSByZXF1aXJlKCcuL1JlYWN0QnJvd3NlckV2ZW50RW1pdHRlcicpO1xudmFyIFJlYWN0SW5wdXRTZWxlY3Rpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5wdXRTZWxlY3Rpb24nKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcbnZhciBUcmFuc2FjdGlvbiA9IHJlcXVpcmUoJy4vVHJhbnNhY3Rpb24nKTtcbnZhciBSZWFjdFVwZGF0ZVF1ZXVlID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZVF1ZXVlJyk7XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0LCB3aGVuIHBvc3NpYmxlLCB0aGUgc2VsZWN0aW9uIHJhbmdlIChjdXJyZW50bHkgc2VsZWN0ZWQgdGV4dFxuICogaW5wdXQpIGlzIG5vdCBkaXN0dXJiZWQgYnkgcGVyZm9ybWluZyB0aGUgdHJhbnNhY3Rpb24uXG4gKi9cbnZhciBTRUxFQ1RJT05fUkVTVE9SQVRJT04gPSB7XG4gIC8qKlxuICAgKiBAcmV0dXJuIHtTZWxlY3Rpb259IFNlbGVjdGlvbiBpbmZvcm1hdGlvbi5cbiAgICovXG4gIGluaXRpYWxpemU6IFJlYWN0SW5wdXRTZWxlY3Rpb24uZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb24sXG4gIC8qKlxuICAgKiBAcGFyYW0ge1NlbGVjdGlvbn0gc2VsIFNlbGVjdGlvbiBpbmZvcm1hdGlvbiByZXR1cm5lZCBmcm9tIGBpbml0aWFsaXplYC5cbiAgICovXG4gIGNsb3NlOiBSZWFjdElucHV0U2VsZWN0aW9uLnJlc3RvcmVTZWxlY3Rpb25cbn07XG5cbi8qKlxuICogU3VwcHJlc3NlcyBldmVudHMgKGJsdXIvZm9jdXMpIHRoYXQgY291bGQgYmUgaW5hZHZlcnRlbnRseSBkaXNwYXRjaGVkIGR1ZSB0b1xuICogaGlnaCBsZXZlbCBET00gbWFuaXB1bGF0aW9ucyAobGlrZSB0ZW1wb3JhcmlseSByZW1vdmluZyBhIHRleHQgaW5wdXQgZnJvbSB0aGVcbiAqIERPTSkuXG4gKi9cbnZhciBFVkVOVF9TVVBQUkVTU0lPTiA9IHtcbiAgLyoqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRoZSBlbmFibGVkIHN0YXR1cyBvZiBgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyYCBiZWZvcmVcbiAgICogdGhlIHJlY29uY2lsaWF0aW9uLlxuICAgKi9cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBjdXJyZW50bHlFbmFibGVkID0gUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLmlzRW5hYmxlZCgpO1xuICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5zZXRFbmFibGVkKGZhbHNlKTtcbiAgICByZXR1cm4gY3VycmVudGx5RW5hYmxlZDtcbiAgfSxcblxuICAvKipcbiAgICogQHBhcmFtIHtib29sZWFufSBwcmV2aW91c2x5RW5hYmxlZCBFbmFibGVkIHN0YXR1cyBvZlxuICAgKiAgIGBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXJgIGJlZm9yZSB0aGUgcmVjb25jaWxpYXRpb24gb2NjdXJyZWQuIGBjbG9zZWBcbiAgICogICByZXN0b3JlcyB0aGUgcHJldmlvdXMgdmFsdWUuXG4gICAqL1xuICBjbG9zZTogZnVuY3Rpb24gKHByZXZpb3VzbHlFbmFibGVkKSB7XG4gICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnNldEVuYWJsZWQocHJldmlvdXNseUVuYWJsZWQpO1xuICB9XG59O1xuXG4vKipcbiAqIFByb3ZpZGVzIGEgcXVldWUgZm9yIGNvbGxlY3RpbmcgYGNvbXBvbmVudERpZE1vdW50YCBhbmRcbiAqIGBjb21wb25lbnREaWRVcGRhdGVgIGNhbGxiYWNrcyBkdXJpbmcgdGhlIHRyYW5zYWN0aW9uLlxuICovXG52YXIgT05fRE9NX1JFQURZX1FVRVVFSU5HID0ge1xuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGludGVybmFsIGBvbkRPTVJlYWR5YCBxdWV1ZS5cbiAgICovXG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnJlYWN0TW91bnRSZWFkeS5yZXNldCgpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBBZnRlciBET00gaXMgZmx1c2hlZCwgaW52b2tlIGFsbCByZWdpc3RlcmVkIGBvbkRPTVJlYWR5YCBjYWxsYmFja3MuXG4gICAqL1xuICBjbG9zZTogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMucmVhY3RNb3VudFJlYWR5Lm5vdGlmeUFsbCgpO1xuICB9XG59O1xuXG4vKipcbiAqIEV4ZWN1dGVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIGBUcmFuc2FjdGlvbmAgaW5zdGFuY2UuIENvbnNpZGVyIHRoZXNlIGFzXG4gKiBiZWluZyBtZW1iZXIgbWV0aG9kcywgYnV0IHdpdGggYW4gaW1wbGllZCBvcmRlcmluZyB3aGlsZSBiZWluZyBpc29sYXRlZCBmcm9tXG4gKiBlYWNoIG90aGVyLlxuICovXG52YXIgVFJBTlNBQ1RJT05fV1JBUFBFUlMgPSBbU0VMRUNUSU9OX1JFU1RPUkFUSU9OLCBFVkVOVF9TVVBQUkVTU0lPTiwgT05fRE9NX1JFQURZX1FVRVVFSU5HXTtcblxuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFRSQU5TQUNUSU9OX1dSQVBQRVJTLnB1c2goe1xuICAgIGluaXRpYWxpemU6IFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZ2luRmx1c2gsXG4gICAgY2xvc2U6IFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkVuZEZsdXNoXG4gIH0pO1xufVxuXG4vKipcbiAqIEN1cnJlbnRseTpcbiAqIC0gVGhlIG9yZGVyIHRoYXQgdGhlc2UgYXJlIGxpc3RlZCBpbiB0aGUgdHJhbnNhY3Rpb24gaXMgY3JpdGljYWw6XG4gKiAtIFN1cHByZXNzZXMgZXZlbnRzLlxuICogLSBSZXN0b3JlcyBzZWxlY3Rpb24gcmFuZ2UuXG4gKlxuICogRnV0dXJlOlxuICogLSBSZXN0b3JlIGRvY3VtZW50L292ZXJmbG93IHNjcm9sbCBwb3NpdGlvbnMgdGhhdCB3ZXJlIHVuaW50ZW50aW9uYWxseVxuICogICBtb2RpZmllZCB2aWEgRE9NIGluc2VydGlvbnMgYWJvdmUgdGhlIHRvcCB2aWV3cG9ydCBib3VuZGFyeS5cbiAqIC0gSW1wbGVtZW50L2ludGVncmF0ZSB3aXRoIGN1c3RvbWl6ZWQgY29uc3RyYWludCBiYXNlZCBsYXlvdXQgc3lzdGVtIGFuZCBrZWVwXG4gKiAgIHRyYWNrIG9mIHdoaWNoIGRpbWVuc2lvbnMgbXVzdCBiZSByZW1lYXN1cmVkLlxuICpcbiAqIEBjbGFzcyBSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uXG4gKi9cbmZ1bmN0aW9uIFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24odXNlQ3JlYXRlRWxlbWVudCkge1xuICB0aGlzLnJlaW5pdGlhbGl6ZVRyYW5zYWN0aW9uKCk7XG4gIC8vIE9ubHkgc2VydmVyLXNpZGUgcmVuZGVyaW5nIHJlYWxseSBuZWVkcyB0aGlzIG9wdGlvbiAoc2VlXG4gIC8vIGBSZWFjdFNlcnZlclJlbmRlcmluZ2ApLCBidXQgc2VydmVyLXNpZGUgdXNlc1xuICAvLyBgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbmAgaW5zdGVhZC4gVGhpcyBvcHRpb24gaXMgaGVyZSBzbyB0aGF0IGl0J3NcbiAgLy8gYWNjZXNzaWJsZSBhbmQgZGVmYXVsdHMgdG8gZmFsc2Ugd2hlbiBgUmVhY3RET01Db21wb25lbnRgIGFuZFxuICAvLyBgUmVhY3RET01UZXh0Q29tcG9uZW50YCBjaGVja3MgaXQgaW4gYG1vdW50Q29tcG9uZW50YC5gXG4gIHRoaXMucmVuZGVyVG9TdGF0aWNNYXJrdXAgPSBmYWxzZTtcbiAgdGhpcy5yZWFjdE1vdW50UmVhZHkgPSBDYWxsYmFja1F1ZXVlLmdldFBvb2xlZChudWxsKTtcbiAgdGhpcy51c2VDcmVhdGVFbGVtZW50ID0gdXNlQ3JlYXRlRWxlbWVudDtcbn1cblxudmFyIE1peGluID0ge1xuICAvKipcbiAgICogQHNlZSBUcmFuc2FjdGlvblxuICAgKiBAYWJzdHJhY3RcbiAgICogQGZpbmFsXG4gICAqIEByZXR1cm4ge2FycmF5PG9iamVjdD59IExpc3Qgb2Ygb3BlcmF0aW9uIHdyYXAgcHJvY2VkdXJlcy5cbiAgICogICBUT0RPOiBjb252ZXJ0IHRvIGFycmF5PFRyYW5zYWN0aW9uV3JhcHBlcj5cbiAgICovXG4gIGdldFRyYW5zYWN0aW9uV3JhcHBlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gVFJBTlNBQ1RJT05fV1JBUFBFUlM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge29iamVjdH0gVGhlIHF1ZXVlIHRvIGNvbGxlY3QgYG9uRE9NUmVhZHlgIGNhbGxiYWNrcyB3aXRoLlxuICAgKi9cbiAgZ2V0UmVhY3RNb3VudFJlYWR5OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhY3RNb3VudFJlYWR5O1xuICB9LFxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBxdWV1ZSB0byBjb2xsZWN0IFJlYWN0IGFzeW5jIGV2ZW50cy5cbiAgICovXG4gIGdldFVwZGF0ZVF1ZXVlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFJlYWN0VXBkYXRlUXVldWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNhdmUgY3VycmVudCB0cmFuc2FjdGlvbiBzdGF0ZSAtLSBpZiB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhpcyBtZXRob2QgaXNcbiAgICogcGFzc2VkIHRvIGByb2xsYmFja2AsIHRoZSB0cmFuc2FjdGlvbiB3aWxsIGJlIHJlc2V0IHRvIHRoYXQgc3RhdGUuXG4gICAqL1xuICBjaGVja3BvaW50OiBmdW5jdGlvbiAoKSB7XG4gICAgLy8gcmVhY3RNb3VudFJlYWR5IGlzIHRoZSBvdXIgb25seSBzdGF0ZWZ1bCB3cmFwcGVyXG4gICAgcmV0dXJuIHRoaXMucmVhY3RNb3VudFJlYWR5LmNoZWNrcG9pbnQoKTtcbiAgfSxcblxuICByb2xsYmFjazogZnVuY3Rpb24gKGNoZWNrcG9pbnQpIHtcbiAgICB0aGlzLnJlYWN0TW91bnRSZWFkeS5yb2xsYmFjayhjaGVja3BvaW50KTtcbiAgfSxcblxuICAvKipcbiAgICogYFBvb2xlZENsYXNzYCBsb29rcyBmb3IgdGhpcywgYW5kIHdpbGwgaW52b2tlIHRoaXMgYmVmb3JlIGFsbG93aW5nIHRoaXNcbiAgICogaW5zdGFuY2UgdG8gYmUgcmV1c2VkLlxuICAgKi9cbiAgZGVzdHJ1Y3RvcjogZnVuY3Rpb24gKCkge1xuICAgIENhbGxiYWNrUXVldWUucmVsZWFzZSh0aGlzLnJlYWN0TW91bnRSZWFkeSk7XG4gICAgdGhpcy5yZWFjdE1vdW50UmVhZHkgPSBudWxsO1xuICB9XG59O1xuXG5fYXNzaWduKFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24ucHJvdG90eXBlLCBUcmFuc2FjdGlvbiwgTWl4aW4pO1xuXG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbik7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RSZWYgPSByZXF1aXJlKCcuL1JlYWN0UmVmJyk7XG52YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG4vKipcbiAqIEhlbHBlciB0byBjYWxsIFJlYWN0UmVmLmF0dGFjaFJlZnMgd2l0aCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQsIHNwbGl0IG91dFxuICogdG8gYXZvaWQgYWxsb2NhdGlvbnMgaW4gdGhlIHRyYW5zYWN0aW9uIG1vdW50LXJlYWR5IHF1ZXVlLlxuICovXG5mdW5jdGlvbiBhdHRhY2hSZWZzKCkge1xuICBSZWFjdFJlZi5hdHRhY2hSZWZzKHRoaXMsIHRoaXMuX2N1cnJlbnRFbGVtZW50KTtcbn1cblxudmFyIFJlYWN0UmVjb25jaWxlciA9IHtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudCwgcmVuZGVycyBtYXJrdXAsIGFuZCByZWdpc3RlcnMgZXZlbnQgbGlzdGVuZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBpbnRlcm5hbEluc3RhbmNlXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gez9vYmplY3R9IHRoZSBjb250YWluaW5nIGhvc3QgY29tcG9uZW50IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7P29iamVjdH0gaW5mbyBhYm91dCB0aGUgaG9zdCBjb250YWluZXJcbiAgICogQHJldHVybiB7P3N0cmluZ30gUmVuZGVyZWQgbWFya3VwIHRvIGJlIGluc2VydGVkIGludG8gdGhlIERPTS5cbiAgICogQGZpbmFsXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgbW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3RhbmNlLCB0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQsIHBhcmVudERlYnVnSUQgLy8gMCBpbiBwcm9kdWN0aW9uIGFuZCBmb3Igcm9vdHNcbiAgKSB7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCAhPT0gMCkge1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWZvcmVNb3VudENvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lELCBpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudCwgcGFyZW50RGVidWdJRCk7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBtYXJrdXAgPSBpbnRlcm5hbEluc3RhbmNlLm1vdW50Q29tcG9uZW50KHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgY29udGV4dCwgcGFyZW50RGVidWdJRCk7XG4gICAgaWYgKGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50ICYmIGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50LnJlZiAhPSBudWxsKSB7XG4gICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGF0dGFjaFJlZnMsIGludGVybmFsSW5zdGFuY2UpO1xuICAgIH1cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbk1vdW50Q29tcG9uZW50KGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFya3VwO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdmFsdWUgdGhhdCBjYW4gYmUgcGFzc2VkIHRvXG4gICAqIFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQucmVwbGFjZU5vZGVXaXRoTWFya3VwLlxuICAgKi9cbiAgZ2V0SG9zdE5vZGU6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3RhbmNlKSB7XG4gICAgcmV0dXJuIGludGVybmFsSW5zdGFuY2UuZ2V0SG9zdE5vZGUoKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVsZWFzZXMgYW55IHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgYG1vdW50Q29tcG9uZW50YC5cbiAgICpcbiAgICogQGZpbmFsXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdW5tb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGludGVybmFsSW5zdGFuY2UsIHNhZmVseSkge1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVmb3JlVW5tb3VudENvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICB9XG4gICAgUmVhY3RSZWYuZGV0YWNoUmVmcyhpbnRlcm5hbEluc3RhbmNlLCBpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudCk7XG4gICAgaW50ZXJuYWxJbnN0YW5jZS51bm1vdW50Q29tcG9uZW50KHNhZmVseSk7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCAhPT0gMCkge1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Vbm1vdW50Q29tcG9uZW50KGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogVXBkYXRlIGEgY29tcG9uZW50IHVzaW5nIGEgbmV3IGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGludGVybmFsSW5zdGFuY2VcbiAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IG5leHRFbGVtZW50XG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICogQGludGVybmFsXG4gICAqL1xuICByZWNlaXZlQ29tcG9uZW50OiBmdW5jdGlvbiAoaW50ZXJuYWxJbnN0YW5jZSwgbmV4dEVsZW1lbnQsIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgdmFyIHByZXZFbGVtZW50ID0gaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQ7XG5cbiAgICBpZiAobmV4dEVsZW1lbnQgPT09IHByZXZFbGVtZW50ICYmIGNvbnRleHQgPT09IGludGVybmFsSW5zdGFuY2UuX2NvbnRleHQpIHtcbiAgICAgIC8vIFNpbmNlIGVsZW1lbnRzIGFyZSBpbW11dGFibGUgYWZ0ZXIgdGhlIG93bmVyIGlzIHJlbmRlcmVkLFxuICAgICAgLy8gd2UgY2FuIGRvIGEgY2hlYXAgaWRlbnRpdHkgY29tcGFyZSBoZXJlIHRvIGRldGVybWluZSBpZiB0aGlzIGlzIGFcbiAgICAgIC8vIHN1cGVyZmx1b3VzIHJlY29uY2lsZS4gSXQncyBwb3NzaWJsZSBmb3Igc3RhdGUgdG8gYmUgbXV0YWJsZSBidXQgc3VjaFxuICAgICAgLy8gY2hhbmdlIHNob3VsZCB0cmlnZ2VyIGFuIHVwZGF0ZSBvZiB0aGUgb3duZXIgd2hpY2ggd291bGQgcmVjcmVhdGVcbiAgICAgIC8vIHRoZSBlbGVtZW50LiBXZSBleHBsaWNpdGx5IGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIG93bmVyIHNpbmNlXG4gICAgICAvLyBpdCdzIHBvc3NpYmxlIGZvciBhbiBlbGVtZW50IGNyZWF0ZWQgb3V0c2lkZSBhIGNvbXBvc2l0ZSB0byBiZVxuICAgICAgLy8gZGVlcGx5IG11dGF0ZWQgYW5kIHJldXNlZC5cblxuICAgICAgLy8gVE9ETzogQmFpbGluZyBvdXQgZWFybHkgaXMganVzdCBhIHBlcmYgb3B0aW1pemF0aW9uIHJpZ2h0P1xuICAgICAgLy8gVE9ETzogUmVtb3ZpbmcgdGhlIHJldHVybiBzdGF0ZW1lbnQgc2hvdWxkIGFmZmVjdCBjb3JyZWN0bmVzcz9cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZm9yZVVwZGF0ZUNvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lELCBuZXh0RWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlZnNDaGFuZ2VkID0gUmVhY3RSZWYuc2hvdWxkVXBkYXRlUmVmcyhwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQpO1xuXG4gICAgaWYgKHJlZnNDaGFuZ2VkKSB7XG4gICAgICBSZWFjdFJlZi5kZXRhY2hSZWZzKGludGVybmFsSW5zdGFuY2UsIHByZXZFbGVtZW50KTtcbiAgICB9XG5cbiAgICBpbnRlcm5hbEluc3RhbmNlLnJlY2VpdmVDb21wb25lbnQobmV4dEVsZW1lbnQsIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcblxuICAgIGlmIChyZWZzQ2hhbmdlZCAmJiBpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudCAmJiBpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudC5yZWYgIT0gbnVsbCkge1xuICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShhdHRhY2hSZWZzLCBpbnRlcm5hbEluc3RhbmNlKTtcbiAgICB9XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVwZGF0ZUNvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZsdXNoIGFueSBkaXJ0eSBjaGFuZ2VzIGluIGEgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBpbnRlcm5hbEluc3RhbmNlXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwZXJmb3JtVXBkYXRlSWZOZWNlc3Nhcnk6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3RhbmNlLCB0cmFuc2FjdGlvbiwgdXBkYXRlQmF0Y2hOdW1iZXIpIHtcbiAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fdXBkYXRlQmF0Y2hOdW1iZXIgIT09IHVwZGF0ZUJhdGNoTnVtYmVyKSB7XG4gICAgICAvLyBUaGUgY29tcG9uZW50J3MgZW5xdWV1ZWQgYmF0Y2ggbnVtYmVyIHNob3VsZCBhbHdheXMgYmUgdGhlIGN1cnJlbnRcbiAgICAgIC8vIGJhdGNoIG9yIHRoZSBmb2xsb3dpbmcgb25lLlxuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGludGVybmFsSW5zdGFuY2UuX3VwZGF0ZUJhdGNoTnVtYmVyID09IG51bGwgfHwgaW50ZXJuYWxJbnN0YW5jZS5fdXBkYXRlQmF0Y2hOdW1iZXIgPT09IHVwZGF0ZUJhdGNoTnVtYmVyICsgMSwgJ3BlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeTogVW5leHBlY3RlZCBiYXRjaCBudW1iZXIgKGN1cnJlbnQgJXMsICcgKyAncGVuZGluZyAlcyknLCB1cGRhdGVCYXRjaE51bWJlciwgaW50ZXJuYWxJbnN0YW5jZS5fdXBkYXRlQmF0Y2hOdW1iZXIpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZm9yZVVwZGF0ZUNvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lELCBpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIGludGVybmFsSW5zdGFuY2UucGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5KHRyYW5zYWN0aW9uKTtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVwZGF0ZUNvbXBvbmVudChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFJlY29uY2lsZXI7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RPd25lciA9IHJlcXVpcmUoJy4vUmVhY3RPd25lcicpO1xuXG52YXIgUmVhY3RSZWYgPSB7fTtcblxuZnVuY3Rpb24gYXR0YWNoUmVmKHJlZiwgY29tcG9uZW50LCBvd25lcikge1xuICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJlZihjb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gTGVnYWN5IHJlZlxuICAgIFJlYWN0T3duZXIuYWRkQ29tcG9uZW50QXNSZWZUbyhjb21wb25lbnQsIHJlZiwgb3duZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRldGFjaFJlZihyZWYsIGNvbXBvbmVudCwgb3duZXIpIHtcbiAgaWYgKHR5cGVvZiByZWYgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZWYobnVsbCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gTGVnYWN5IHJlZlxuICAgIFJlYWN0T3duZXIucmVtb3ZlQ29tcG9uZW50QXNSZWZGcm9tKGNvbXBvbmVudCwgcmVmLCBvd25lcik7XG4gIH1cbn1cblxuUmVhY3RSZWYuYXR0YWNoUmVmcyA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgZWxlbWVudCkge1xuICBpZiAoZWxlbWVudCA9PT0gbnVsbCB8fCB0eXBlb2YgZWxlbWVudCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHJlZiA9IGVsZW1lbnQucmVmO1xuICBpZiAocmVmICE9IG51bGwpIHtcbiAgICBhdHRhY2hSZWYocmVmLCBpbnN0YW5jZSwgZWxlbWVudC5fb3duZXIpO1xuICB9XG59O1xuXG5SZWFjdFJlZi5zaG91bGRVcGRhdGVSZWZzID0gZnVuY3Rpb24gKHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCkge1xuICAvLyBJZiBlaXRoZXIgdGhlIG93bmVyIG9yIGEgYHJlZmAgaGFzIGNoYW5nZWQsIG1ha2Ugc3VyZSB0aGUgbmV3ZXN0IG93bmVyXG4gIC8vIGhhcyBzdG9yZWQgYSByZWZlcmVuY2UgdG8gYHRoaXNgLCBhbmQgdGhlIHByZXZpb3VzIG93bmVyIChpZiBkaWZmZXJlbnQpXG4gIC8vIGhhcyBmb3Jnb3R0ZW4gdGhlIHJlZmVyZW5jZSB0byBgdGhpc2AuIFdlIHVzZSB0aGUgZWxlbWVudCBpbnN0ZWFkXG4gIC8vIG9mIHRoZSBwdWJsaWMgdGhpcy5wcm9wcyBiZWNhdXNlIHRoZSBwb3N0IHByb2Nlc3NpbmcgY2Fubm90IGRldGVybWluZVxuICAvLyBhIHJlZi4gVGhlIHJlZiBjb25jZXB0dWFsbHkgbGl2ZXMgb24gdGhlIGVsZW1lbnQuXG5cbiAgLy8gVE9ETzogU2hvdWxkIHRoaXMgZXZlbiBiZSBwb3NzaWJsZT8gVGhlIG93bmVyIGNhbm5vdCBjaGFuZ2UgYmVjYXVzZVxuICAvLyBpdCdzIGZvcmJpZGRlbiBieSBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudC4gVGhlIHJlZiBjYW4gY2hhbmdlXG4gIC8vIGlmIHlvdSBzd2FwIHRoZSBrZXlzIG9mIGJ1dCBub3QgdGhlIHJlZnMuIFJlY29uc2lkZXIgd2hlcmUgdGhpcyBjaGVja1xuICAvLyBpcyBtYWRlLiBJdCBwcm9iYWJseSBiZWxvbmdzIHdoZXJlIHRoZSBrZXkgY2hlY2tpbmcgYW5kXG4gIC8vIGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQgaXMgZG9uZS5cblxuICB2YXIgcHJldlJlZiA9IG51bGw7XG4gIHZhciBwcmV2T3duZXIgPSBudWxsO1xuICBpZiAocHJldkVsZW1lbnQgIT09IG51bGwgJiYgdHlwZW9mIHByZXZFbGVtZW50ID09PSAnb2JqZWN0Jykge1xuICAgIHByZXZSZWYgPSBwcmV2RWxlbWVudC5yZWY7XG4gICAgcHJldk93bmVyID0gcHJldkVsZW1lbnQuX293bmVyO1xuICB9XG5cbiAgdmFyIG5leHRSZWYgPSBudWxsO1xuICB2YXIgbmV4dE93bmVyID0gbnVsbDtcbiAgaWYgKG5leHRFbGVtZW50ICE9PSBudWxsICYmIHR5cGVvZiBuZXh0RWxlbWVudCA9PT0gJ29iamVjdCcpIHtcbiAgICBuZXh0UmVmID0gbmV4dEVsZW1lbnQucmVmO1xuICAgIG5leHRPd25lciA9IG5leHRFbGVtZW50Ll9vd25lcjtcbiAgfVxuXG4gIHJldHVybiBwcmV2UmVmICE9PSBuZXh0UmVmIHx8XG4gIC8vIElmIG93bmVyIGNoYW5nZXMgYnV0IHdlIGhhdmUgYW4gdW5jaGFuZ2VkIGZ1bmN0aW9uIHJlZiwgZG9uJ3QgdXBkYXRlIHJlZnNcbiAgdHlwZW9mIG5leHRSZWYgPT09ICdzdHJpbmcnICYmIG5leHRPd25lciAhPT0gcHJldk93bmVyO1xufTtcblxuUmVhY3RSZWYuZGV0YWNoUmVmcyA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgZWxlbWVudCkge1xuICBpZiAoZWxlbWVudCA9PT0gbnVsbCB8fCB0eXBlb2YgZWxlbWVudCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHJlZiA9IGVsZW1lbnQucmVmO1xuICBpZiAocmVmICE9IG51bGwpIHtcbiAgICBkZXRhY2hSZWYocmVmLCBpbnN0YW5jZSwgZWxlbWVudC5fb3duZXIpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UmVmOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUG9vbGVkQ2xhc3MgPSByZXF1aXJlKCcuL1Bvb2xlZENsYXNzJyk7XG52YXIgVHJhbnNhY3Rpb24gPSByZXF1aXJlKCcuL1RyYW5zYWN0aW9uJyk7XG52YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7XG52YXIgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZSA9IHJlcXVpcmUoJy4vUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZScpO1xuXG4vKipcbiAqIEV4ZWN1dGVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIGBUcmFuc2FjdGlvbmAgaW5zdGFuY2UuIENvbnNpZGVyIHRoZXNlIGFzXG4gKiBiZWluZyBtZW1iZXIgbWV0aG9kcywgYnV0IHdpdGggYW4gaW1wbGllZCBvcmRlcmluZyB3aGlsZSBiZWluZyBpc29sYXRlZCBmcm9tXG4gKiBlYWNoIG90aGVyLlxuICovXG52YXIgVFJBTlNBQ1RJT05fV1JBUFBFUlMgPSBbXTtcblxuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIFRSQU5TQUNUSU9OX1dSQVBQRVJTLnB1c2goe1xuICAgIGluaXRpYWxpemU6IFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZ2luRmx1c2gsXG4gICAgY2xvc2U6IFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkVuZEZsdXNoXG4gIH0pO1xufVxuXG52YXIgbm9vcENhbGxiYWNrUXVldWUgPSB7XG4gIGVucXVldWU6IGZ1bmN0aW9uICgpIHt9XG59O1xuXG4vKipcbiAqIEBjbGFzcyBSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHJlbmRlclRvU3RhdGljTWFya3VwXG4gKi9cbmZ1bmN0aW9uIFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24ocmVuZGVyVG9TdGF0aWNNYXJrdXApIHtcbiAgdGhpcy5yZWluaXRpYWxpemVUcmFuc2FjdGlvbigpO1xuICB0aGlzLnJlbmRlclRvU3RhdGljTWFya3VwID0gcmVuZGVyVG9TdGF0aWNNYXJrdXA7XG4gIHRoaXMudXNlQ3JlYXRlRWxlbWVudCA9IGZhbHNlO1xuICB0aGlzLnVwZGF0ZVF1ZXVlID0gbmV3IFJlYWN0U2VydmVyVXBkYXRlUXVldWUodGhpcyk7XG59XG5cbnZhciBNaXhpbiA9IHtcbiAgLyoqXG4gICAqIEBzZWUgVHJhbnNhY3Rpb25cbiAgICogQGFic3RyYWN0XG4gICAqIEBmaW5hbFxuICAgKiBAcmV0dXJuIHthcnJheX0gRW1wdHkgbGlzdCBvZiBvcGVyYXRpb24gd3JhcCBwcm9jZWR1cmVzLlxuICAgKi9cbiAgZ2V0VHJhbnNhY3Rpb25XcmFwcGVyczogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBUUkFOU0FDVElPTl9XUkFQUEVSUztcbiAgfSxcblxuICAvKipcbiAgICogQHJldHVybiB7b2JqZWN0fSBUaGUgcXVldWUgdG8gY29sbGVjdCBgb25ET01SZWFkeWAgY2FsbGJhY2tzIHdpdGguXG4gICAqL1xuICBnZXRSZWFjdE1vdW50UmVhZHk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbm9vcENhbGxiYWNrUXVldWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge29iamVjdH0gVGhlIHF1ZXVlIHRvIGNvbGxlY3QgUmVhY3QgYXN5bmMgZXZlbnRzLlxuICAgKi9cbiAgZ2V0VXBkYXRlUXVldWU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVRdWV1ZTtcbiAgfSxcblxuICAvKipcbiAgICogYFBvb2xlZENsYXNzYCBsb29rcyBmb3IgdGhpcywgYW5kIHdpbGwgaW52b2tlIHRoaXMgYmVmb3JlIGFsbG93aW5nIHRoaXNcbiAgICogaW5zdGFuY2UgdG8gYmUgcmV1c2VkLlxuICAgKi9cbiAgZGVzdHJ1Y3RvcjogZnVuY3Rpb24gKCkge30sXG5cbiAgY2hlY2twb2ludDogZnVuY3Rpb24gKCkge30sXG5cbiAgcm9sbGJhY2s6IGZ1bmN0aW9uICgpIHt9XG59O1xuXG5fYXNzaWduKFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24ucHJvdG90eXBlLCBUcmFuc2FjdGlvbiwgTWl4aW4pO1xuXG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbik7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbnZhciBSZWFjdFVwZGF0ZVF1ZXVlID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZVF1ZXVlJyk7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG5mdW5jdGlvbiB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgY2FsbGVyTmFtZSkge1xuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YXIgY29uc3RydWN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjtcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyguLi4pOiBDYW4gb25seSB1cGRhdGUgYSBtb3VudGluZyBjb21wb25lbnQuICcgKyAnVGhpcyB1c3VhbGx5IG1lYW5zIHlvdSBjYWxsZWQgJXMoKSBvdXRzaWRlIGNvbXBvbmVudFdpbGxNb3VudCgpIG9uIHRoZSBzZXJ2ZXIuICcgKyAnVGhpcyBpcyBhIG5vLW9wLiBQbGVhc2UgY2hlY2sgdGhlIGNvZGUgZm9yIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY2FsbGVyTmFtZSwgY29uc3RydWN0b3IgJiYgKGNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IGNvbnN0cnVjdG9yLm5hbWUpIHx8ICdSZWFjdENsYXNzJykgOiB2b2lkIDA7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSB1cGRhdGUgcXVldWUgdXNlZCBmb3Igc2VydmVyIHJlbmRlcmluZy5cbiAqIEl0IGRlbGVnYXRlcyB0byBSZWFjdFVwZGF0ZVF1ZXVlIHdoaWxlIHNlcnZlciByZW5kZXJpbmcgaXMgaW4gcHJvZ3Jlc3MgYW5kXG4gKiBzd2l0Y2hlcyB0byBSZWFjdE5vb3BVcGRhdGVRdWV1ZSBhZnRlciB0aGUgdHJhbnNhY3Rpb24gaGFzIGNvbXBsZXRlZC5cbiAqIEBjbGFzcyBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlXG4gKiBAcGFyYW0ge1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICovXG5cbnZhciBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlKHRyYW5zYWN0aW9uKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJlYWN0U2VydmVyVXBkYXRlUXVldWUpO1xuXG4gICAgdGhpcy50cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQgaXMgbW91bnRlZC5cbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2Ugd2Ugd2FudCB0byB0ZXN0LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIG1vdW50ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHByb3RlY3RlZFxuICAgKiBAZmluYWxcbiAgICovXG5cblxuICBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlLnByb3RvdHlwZS5pc01vdW50ZWQgPSBmdW5jdGlvbiBpc01vdW50ZWQocHVibGljSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIEVucXVldWUgYSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgYWxsIHRoZSBwZW5kaW5nIHVwZGF0ZXNcbiAgICogaGF2ZSBwcm9jZXNzZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRvIHVzZSBhcyBgdGhpc2AgY29udGV4dC5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cblxuICBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlLnByb3RvdHlwZS5lbnF1ZXVlQ2FsbGJhY2sgPSBmdW5jdGlvbiBlbnF1ZXVlQ2FsbGJhY2socHVibGljSW5zdGFuY2UsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uaXNJblRyYW5zYWN0aW9uKCkpIHtcbiAgICAgIFJlYWN0VXBkYXRlUXVldWUuZW5xdWV1ZUNhbGxiYWNrKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoXG4gICAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBZb3UgbWF5IHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qgb2YgdGhlXG4gICAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICAgKlxuICAgKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCwgYnV0IGl0IHdpbGwgaW52b2tlXG4gICAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cblxuICBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlLnByb3RvdHlwZS5lbnF1ZXVlRm9yY2VVcGRhdGUgPSBmdW5jdGlvbiBlbnF1ZXVlRm9yY2VVcGRhdGUocHVibGljSW5zdGFuY2UpIHtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5pc0luVHJhbnNhY3Rpb24oKSkge1xuICAgICAgUmVhY3RVcGRhdGVRdWV1ZS5lbnF1ZXVlRm9yY2VVcGRhdGUocHVibGljSW5zdGFuY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ2ZvcmNlVXBkYXRlJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgb3IgYHNldFN0YXRlYCB0byBtdXRhdGUgc3RhdGUuXG4gICAqIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAgICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fGZ1bmN0aW9ufSBjb21wbGV0ZVN0YXRlIE5leHQgc3RhdGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuXG4gIFJlYWN0U2VydmVyVXBkYXRlUXVldWUucHJvdG90eXBlLmVucXVldWVSZXBsYWNlU3RhdGUgPSBmdW5jdGlvbiBlbnF1ZXVlUmVwbGFjZVN0YXRlKHB1YmxpY0luc3RhbmNlLCBjb21wbGV0ZVN0YXRlKSB7XG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uaXNJblRyYW5zYWN0aW9uKCkpIHtcbiAgICAgIFJlYWN0VXBkYXRlUXVldWUuZW5xdWV1ZVJlcGxhY2VTdGF0ZShwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0YXRlJyk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gVGhpcyBvbmx5IGV4aXN0cyBiZWNhdXNlIF9wZW5kaW5nU3RhdGUgaXNcbiAgICogaW50ZXJuYWwuIFRoaXMgcHJvdmlkZXMgYSBtZXJnaW5nIHN0cmF0ZWd5IHRoYXQgaXMgbm90IGF2YWlsYWJsZSB0byBkZWVwXG4gICAqIHByb3BlcnRpZXMgd2hpY2ggaXMgY29uZnVzaW5nLiBUT0RPOiBFeHBvc2UgcGVuZGluZ1N0YXRlIG9yIGRvbid0IHVzZSBpdFxuICAgKiBkdXJpbmcgdGhlIG1lcmdlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggc3RhdGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuXG4gIFJlYWN0U2VydmVyVXBkYXRlUXVldWUucHJvdG90eXBlLmVucXVldWVTZXRTdGF0ZSA9IGZ1bmN0aW9uIGVucXVldWVTZXRTdGF0ZShwdWJsaWNJbnN0YW5jZSwgcGFydGlhbFN0YXRlKSB7XG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uaXNJblRyYW5zYWN0aW9uKCkpIHtcbiAgICAgIFJlYWN0VXBkYXRlUXVldWUuZW5xdWV1ZVNldFN0YXRlKHB1YmxpY0luc3RhbmNlLCBwYXJ0aWFsU3RhdGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3NldFN0YXRlJyk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlO1xufSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0U2VydmVyVXBkYXRlUXVldWU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVyJyk7XG52YXIgUmVhY3RJbnN0YW5jZU1hcCA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0YW5jZU1hcCcpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xudmFyIFJlYWN0VXBkYXRlcyA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVzJyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG5mdW5jdGlvbiBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpIHtcbiAgUmVhY3RVcGRhdGVzLmVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFVuZXhwZWN0ZWRBcmd1bWVudChhcmcpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgYXJnO1xuICBpZiAodHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuICB2YXIgZGlzcGxheU5hbWUgPSBhcmcuY29uc3RydWN0b3IgJiYgYXJnLmNvbnN0cnVjdG9yLm5hbWUgfHwgdHlwZTtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhcmcpO1xuICBpZiAoa2V5cy5sZW5ndGggPiAwICYmIGtleXMubGVuZ3RoIDwgMjApIHtcbiAgICByZXR1cm4gZGlzcGxheU5hbWUgKyAnIChrZXlzOiAnICsga2V5cy5qb2luKCcsICcpICsgJyknO1xuICB9XG4gIHJldHVybiBkaXNwbGF5TmFtZTtcbn1cblxuZnVuY3Rpb24gZ2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBkYXRlKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7XG4gIHZhciBpbnRlcm5hbEluc3RhbmNlID0gUmVhY3RJbnN0YW5jZU1hcC5nZXQocHVibGljSW5zdGFuY2UpO1xuICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBjdG9yID0gcHVibGljSW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgICAvLyBPbmx5IHdhcm4gd2hlbiB3ZSBoYXZlIGEgY2FsbGVyTmFtZS4gT3RoZXJ3aXNlIHdlIHNob3VsZCBiZSBzaWxlbnQuXG4gICAgICAvLyBXZSdyZSBwcm9iYWJseSBjYWxsaW5nIGZyb20gZW5xdWV1ZUNhbGxiYWNrLiBXZSBkb24ndCB3YW50IHRvIHdhcm5cbiAgICAgIC8vIHRoZXJlIGJlY2F1c2Ugd2UgYWxyZWFkeSB3YXJuZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGxpZmVjeWNsZSBtZXRob2QuXG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWNhbGxlck5hbWUsICclcyguLi4pOiBDYW4gb25seSB1cGRhdGUgYSBtb3VudGVkIG9yIG1vdW50aW5nIGNvbXBvbmVudC4gJyArICdUaGlzIHVzdWFsbHkgbWVhbnMgeW91IGNhbGxlZCAlcygpIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuICcgKyAnVGhpcyBpcyBhIG5vLW9wLiBQbGVhc2UgY2hlY2sgdGhlIGNvZGUgZm9yIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY2FsbGVyTmFtZSwgY3RvciAmJiAoY3Rvci5kaXNwbGF5TmFtZSB8fCBjdG9yLm5hbWUpIHx8ICdSZWFjdENsYXNzJykgOiB2b2lkIDA7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPT0gbnVsbCwgJyVzKC4uLik6IENhbm5vdCB1cGRhdGUgZHVyaW5nIGFuIGV4aXN0aW5nIHN0YXRlIHRyYW5zaXRpb24gKHN1Y2ggYXMgJyArICd3aXRoaW4gYHJlbmRlcmAgb3IgYW5vdGhlciBjb21wb25lbnRcXCdzIGNvbnN0cnVjdG9yKS4gUmVuZGVyIG1ldGhvZHMgJyArICdzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZTsgY29uc3RydWN0b3IgJyArICdzaWRlLWVmZmVjdHMgYXJlIGFuIGFudGktcGF0dGVybiwgYnV0IGNhbiBiZSBtb3ZlZCB0byAnICsgJ2Bjb21wb25lbnRXaWxsTW91bnRgLicsIGNhbGxlck5hbWUpIDogdm9pZCAwO1xuICB9XG5cbiAgcmV0dXJuIGludGVybmFsSW5zdGFuY2U7XG59XG5cbi8qKlxuICogUmVhY3RVcGRhdGVRdWV1ZSBhbGxvd3MgZm9yIHN0YXRlIHVwZGF0ZXMgdG8gYmUgc2NoZWR1bGVkIGludG8gYSBsYXRlclxuICogcmVjb25jaWxpYXRpb24gc3RlcC5cbiAqL1xudmFyIFJlYWN0VXBkYXRlUXVldWUgPSB7XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQgaXMgbW91bnRlZC5cbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2Ugd2Ugd2FudCB0byB0ZXN0LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIG1vdW50ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHByb3RlY3RlZFxuICAgKiBAZmluYWxcbiAgICovXG4gIGlzTW91bnRlZDogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlKSB7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgICAgaWYgKG93bmVyICE9PSBudWxsKSB7XG4gICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhvd25lci5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIsICclcyBpcyBhY2Nlc3NpbmcgaXNNb3VudGVkIGluc2lkZSBpdHMgcmVuZGVyKCkgZnVuY3Rpb24uICcgKyAncmVuZGVyKCkgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuIEl0IHNob3VsZCAnICsgJ25ldmVyIGFjY2VzcyBzb21ldGhpbmcgdGhhdCByZXF1aXJlcyBzdGFsZSBkYXRhIGZyb20gdGhlIHByZXZpb3VzICcgKyAncmVuZGVyLCBzdWNoIGFzIHJlZnMuIE1vdmUgdGhpcyBsb2dpYyB0byBjb21wb25lbnREaWRNb3VudCBhbmQgJyArICdjb21wb25lbnREaWRVcGRhdGUgaW5zdGVhZC4nLCBvd25lci5nZXROYW1lKCkgfHwgJ0EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICAgIG93bmVyLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBpbnRlcm5hbEluc3RhbmNlID0gUmVhY3RJbnN0YW5jZU1hcC5nZXQocHVibGljSW5zdGFuY2UpO1xuICAgIGlmIChpbnRlcm5hbEluc3RhbmNlKSB7XG4gICAgICAvLyBEdXJpbmcgY29tcG9uZW50V2lsbE1vdW50IGFuZCByZW5kZXIgdGhpcyB3aWxsIHN0aWxsIGJlIG51bGwgYnV0IGFmdGVyXG4gICAgICAvLyB0aGF0IHdpbGwgYWx3YXlzIHJlbmRlciB0byBzb21ldGhpbmcuIEF0IGxlYXN0IGZvciBub3cuIFNvIHdlIGNhbiB1c2VcbiAgICAgIC8vIHRoaXMgaGFjay5cbiAgICAgIHJldHVybiAhIWludGVybmFsSW5zdGFuY2UuX3JlbmRlcmVkQ29tcG9uZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBFbnF1ZXVlIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGFmdGVyIGFsbCB0aGUgcGVuZGluZyB1cGRhdGVzXG4gICAqIGhhdmUgcHJvY2Vzc2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0byB1c2UgYXMgYHRoaXNgIGNvbnRleHQuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgc3RhdGUgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGNhbGxlck5hbWUgTmFtZSBvZiB0aGUgY2FsbGluZyBmdW5jdGlvbiBpbiB0aGUgcHVibGljIEFQSS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlQ2FsbGJhY2s6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICBSZWFjdFVwZGF0ZVF1ZXVlLnZhbGlkYXRlQ2FsbGJhY2soY2FsbGJhY2ssIGNhbGxlck5hbWUpO1xuICAgIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBkYXRlKHB1YmxpY0luc3RhbmNlKTtcblxuICAgIC8vIFByZXZpb3VzbHkgd2Ugd291bGQgdGhyb3cgYW4gZXJyb3IgaWYgd2UgZGlkbid0IGhhdmUgYW4gaW50ZXJuYWxcbiAgICAvLyBpbnN0YW5jZS4gU2luY2Ugd2Ugd2FudCB0byBtYWtlIGl0IGEgbm8tb3AgaW5zdGVhZCwgd2UgbWlycm9yIHRoZSBzYW1lXG4gICAgLy8gYmVoYXZpb3Igd2UgaGF2ZSBpbiBvdGhlciBlbnF1ZXVlKiBtZXRob2RzLlxuICAgIC8vIFdlIGFsc28gbmVlZCB0byBpZ25vcmUgY2FsbGJhY2tzIGluIGNvbXBvbmVudFdpbGxNb3VudC4gU2VlXG4gICAgLy8gZW5xdWV1ZVVwZGF0ZXMuXG4gICAgaWYgKCFpbnRlcm5hbEluc3RhbmNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcykge1xuICAgICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcyA9IFtjYWxsYmFja107XG4gICAgfVxuICAgIC8vIFRPRE86IFRoZSBjYWxsYmFjayBoZXJlIGlzIGlnbm9yZWQgd2hlbiBzZXRTdGF0ZSBpcyBjYWxsZWQgZnJvbVxuICAgIC8vIGNvbXBvbmVudFdpbGxNb3VudC4gRWl0aGVyIGZpeCBpdCBvciBkaXNhbGxvdyBkb2luZyBzbyBjb21wbGV0ZWx5IGluXG4gICAgLy8gZmF2b3Igb2YgZ2V0SW5pdGlhbFN0YXRlLiBBbHRlcm5hdGl2ZWx5LCB3ZSBjYW4gZGlzYWxsb3dcbiAgICAvLyBjb21wb25lbnRXaWxsTW91bnQgZHVyaW5nIHNlcnZlci1zaWRlIHJlbmRlcmluZy5cbiAgICBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpO1xuICB9LFxuXG4gIGVucXVldWVDYWxsYmFja0ludGVybmFsOiBmdW5jdGlvbiAoaW50ZXJuYWxJbnN0YW5jZSwgY2FsbGJhY2spIHtcbiAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcykge1xuICAgICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcyA9IFtjYWxsYmFja107XG4gICAgfVxuICAgIGVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAgICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAgICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZUZvcmNlVXBkYXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IGdldEludGVybmFsSW5zdGFuY2VSZWFkeUZvclVwZGF0ZShwdWJsaWNJbnN0YW5jZSwgJ2ZvcmNlVXBkYXRlJyk7XG5cbiAgICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nRm9yY2VVcGRhdGUgPSB0cnVlO1xuXG4gICAgZW5xdWV1ZVVwZGF0ZShpbnRlcm5hbEluc3RhbmNlKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8gbXV0YXRlIHN0YXRlLlxuICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcGxldGVTdGF0ZSBOZXh0IHN0YXRlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgaW50ZXJuYWxJbnN0YW5jZSA9IGdldEludGVybmFsSW5zdGFuY2VSZWFkeUZvclVwZGF0ZShwdWJsaWNJbnN0YW5jZSwgJ3JlcGxhY2VTdGF0ZScpO1xuXG4gICAgaWYgKCFpbnRlcm5hbEluc3RhbmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ1N0YXRlUXVldWUgPSBbY29tcGxldGVTdGF0ZV07XG4gICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ1JlcGxhY2VTdGF0ZSA9IHRydWU7XG5cbiAgICAvLyBGdXR1cmUtcHJvb2YgMTUuNVxuICAgIGlmIChjYWxsYmFjayAhPT0gdW5kZWZpbmVkICYmIGNhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICBSZWFjdFVwZGF0ZVF1ZXVlLnZhbGlkYXRlQ2FsbGJhY2soY2FsbGJhY2ssICdyZXBsYWNlU3RhdGUnKTtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzKSB7XG4gICAgICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzID0gW2NhbGxiYWNrXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gVGhpcyBvbmx5IGV4aXN0cyBiZWNhdXNlIF9wZW5kaW5nU3RhdGUgaXNcbiAgICogaW50ZXJuYWwuIFRoaXMgcHJvdmlkZXMgYSBtZXJnaW5nIHN0cmF0ZWd5IHRoYXQgaXMgbm90IGF2YWlsYWJsZSB0byBkZWVwXG4gICAqIHByb3BlcnRpZXMgd2hpY2ggaXMgY29uZnVzaW5nLiBUT0RPOiBFeHBvc2UgcGVuZGluZ1N0YXRlIG9yIGRvbid0IHVzZSBpdFxuICAgKiBkdXJpbmcgdGhlIG1lcmdlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgdG8gYmUgbWVyZ2VkIHdpdGggc3RhdGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVNldFN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSkge1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0U3RhdGUoKTtcbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhwYXJ0aWFsU3RhdGUgIT0gbnVsbCwgJ3NldFN0YXRlKC4uLik6IFlvdSBwYXNzZWQgYW4gdW5kZWZpbmVkIG9yIG51bGwgc3RhdGUgb2JqZWN0OyAnICsgJ2luc3RlYWQsIHVzZSBmb3JjZVVwZGF0ZSgpLicpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBkYXRlKHB1YmxpY0luc3RhbmNlLCAnc2V0U3RhdGUnKTtcblxuICAgIGlmICghaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBxdWV1ZSA9IGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdTdGF0ZVF1ZXVlIHx8IChpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IFtdKTtcbiAgICBxdWV1ZS5wdXNoKHBhcnRpYWxTdGF0ZSk7XG5cbiAgICBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpO1xuICB9LFxuXG4gIGVucXVldWVFbGVtZW50SW50ZXJuYWw6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3RhbmNlLCBuZXh0RWxlbWVudCwgbmV4dENvbnRleHQpIHtcbiAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nRWxlbWVudCA9IG5leHRFbGVtZW50O1xuICAgIC8vIFRPRE86IGludHJvZHVjZSBfcGVuZGluZ0NvbnRleHQgaW5zdGVhZCBvZiBzZXR0aW5nIGl0IGRpcmVjdGx5LlxuICAgIGludGVybmFsSW5zdGFuY2UuX2NvbnRleHQgPSBuZXh0Q29udGV4dDtcbiAgICBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpO1xuICB9LFxuXG4gIHZhbGlkYXRlQ2FsbGJhY2s6IGZ1bmN0aW9uIChjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgICEoIWNhbGxiYWNrIHx8IHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzKC4uLik6IEV4cGVjdGVkIHRoZSBsYXN0IG9wdGlvbmFsIGBjYWxsYmFja2AgYXJndW1lbnQgdG8gYmUgYSBmdW5jdGlvbi4gSW5zdGVhZCByZWNlaXZlZDogJXMuJywgY2FsbGVyTmFtZSwgZm9ybWF0VW5leHBlY3RlZEFyZ3VtZW50KGNhbGxiYWNrKSkgOiBfcHJvZEludmFyaWFudCgnMTIyJywgY2FsbGVyTmFtZSwgZm9ybWF0VW5leHBlY3RlZEFyZ3VtZW50KGNhbGxiYWNrKSkgOiB2b2lkIDA7XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFVwZGF0ZVF1ZXVlOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50JyksXG4gICAgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIENhbGxiYWNrUXVldWUgPSByZXF1aXJlKCcuL0NhbGxiYWNrUXVldWUnKTtcbnZhciBQb29sZWRDbGFzcyA9IHJlcXVpcmUoJy4vUG9vbGVkQ2xhc3MnKTtcbnZhciBSZWFjdEZlYXR1cmVGbGFncyA9IHJlcXVpcmUoJy4vUmVhY3RGZWF0dXJlRmxhZ3MnKTtcbnZhciBSZWFjdFJlY29uY2lsZXIgPSByZXF1aXJlKCcuL1JlYWN0UmVjb25jaWxlcicpO1xudmFyIFRyYW5zYWN0aW9uID0gcmVxdWlyZSgnLi9UcmFuc2FjdGlvbicpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbnZhciBkaXJ0eUNvbXBvbmVudHMgPSBbXTtcbnZhciB1cGRhdGVCYXRjaE51bWJlciA9IDA7XG52YXIgYXNhcENhbGxiYWNrUXVldWUgPSBDYWxsYmFja1F1ZXVlLmdldFBvb2xlZCgpO1xudmFyIGFzYXBFbnF1ZXVlZCA9IGZhbHNlO1xuXG52YXIgYmF0Y2hpbmdTdHJhdGVneSA9IG51bGw7XG5cbmZ1bmN0aW9uIGVuc3VyZUluamVjdGVkKCkge1xuICAhKFJlYWN0VXBkYXRlcy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uICYmIGJhdGNoaW5nU3RyYXRlZ3kpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdFVwZGF0ZXM6IG11c3QgaW5qZWN0IGEgcmVjb25jaWxlIHRyYW5zYWN0aW9uIGNsYXNzIGFuZCBiYXRjaGluZyBzdHJhdGVneScpIDogX3Byb2RJbnZhcmlhbnQoJzEyMycpIDogdm9pZCAwO1xufVxuXG52YXIgTkVTVEVEX1VQREFURVMgPSB7XG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmRpcnR5Q29tcG9uZW50c0xlbmd0aCA9IGRpcnR5Q29tcG9uZW50cy5sZW5ndGg7XG4gIH0sXG4gIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoICE9PSBkaXJ0eUNvbXBvbmVudHMubGVuZ3RoKSB7XG4gICAgICAvLyBBZGRpdGlvbmFsIHVwZGF0ZXMgd2VyZSBlbnF1ZXVlZCBieSBjb21wb25lbnREaWRVcGRhdGUgaGFuZGxlcnMgb3JcbiAgICAgIC8vIHNpbWlsYXI7IGJlZm9yZSBvdXIgb3duIFVQREFURV9RVUVVRUlORyB3cmFwcGVyIGNsb3Nlcywgd2Ugd2FudCB0byBydW5cbiAgICAgIC8vIHRoZXNlIG5ldyB1cGRhdGVzIHNvIHRoYXQgaWYgQSdzIGNvbXBvbmVudERpZFVwZGF0ZSBjYWxscyBzZXRTdGF0ZSBvblxuICAgICAgLy8gQiwgQiB3aWxsIHVwZGF0ZSBiZWZvcmUgdGhlIGNhbGxiYWNrIEEncyB1cGRhdGVyIHByb3ZpZGVkIHdoZW4gY2FsbGluZ1xuICAgICAgLy8gc2V0U3RhdGUuXG4gICAgICBkaXJ0eUNvbXBvbmVudHMuc3BsaWNlKDAsIHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoKTtcbiAgICAgIGZsdXNoQmF0Y2hlZFVwZGF0ZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlydHlDb21wb25lbnRzLmxlbmd0aCA9IDA7XG4gICAgfVxuICB9XG59O1xuXG52YXIgVVBEQVRFX1FVRVVFSU5HID0ge1xuICBpbml0aWFsaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5jYWxsYmFja1F1ZXVlLnJlc2V0KCk7XG4gIH0sXG4gIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5jYWxsYmFja1F1ZXVlLm5vdGlmeUFsbCgpO1xuICB9XG59O1xuXG52YXIgVFJBTlNBQ1RJT05fV1JBUFBFUlMgPSBbTkVTVEVEX1VQREFURVMsIFVQREFURV9RVUVVRUlOR107XG5cbmZ1bmN0aW9uIFJlYWN0VXBkYXRlc0ZsdXNoVHJhbnNhY3Rpb24oKSB7XG4gIHRoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKTtcbiAgdGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGggPSBudWxsO1xuICB0aGlzLmNhbGxiYWNrUXVldWUgPSBDYWxsYmFja1F1ZXVlLmdldFBvb2xlZCgpO1xuICB0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uID0gUmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uZ2V0UG9vbGVkKFxuICAvKiB1c2VDcmVhdGVFbGVtZW50ICovdHJ1ZSk7XG59XG5cbl9hc3NpZ24oUmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbi5wcm90b3R5cGUsIFRyYW5zYWN0aW9uLCB7XG4gIGdldFRyYW5zYWN0aW9uV3JhcHBlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gVFJBTlNBQ1RJT05fV1JBUFBFUlM7XG4gIH0sXG5cbiAgZGVzdHJ1Y3RvcjogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoID0gbnVsbDtcbiAgICBDYWxsYmFja1F1ZXVlLnJlbGVhc2UodGhpcy5jYWxsYmFja1F1ZXVlKTtcbiAgICB0aGlzLmNhbGxiYWNrUXVldWUgPSBudWxsO1xuICAgIFJlYWN0VXBkYXRlcy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uLnJlbGVhc2UodGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbik7XG4gICAgdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbiA9IG51bGw7XG4gIH0sXG5cbiAgcGVyZm9ybTogZnVuY3Rpb24gKG1ldGhvZCwgc2NvcGUsIGEpIHtcbiAgICAvLyBFc3NlbnRpYWxseSBjYWxscyBgdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbi5wZXJmb3JtKG1ldGhvZCwgc2NvcGUsIGEpYFxuICAgIC8vIHdpdGggdGhpcyB0cmFuc2FjdGlvbidzIHdyYXBwZXJzIGFyb3VuZCBpdC5cbiAgICByZXR1cm4gVHJhbnNhY3Rpb24ucGVyZm9ybS5jYWxsKHRoaXMsIHRoaXMucmVjb25jaWxlVHJhbnNhY3Rpb24ucGVyZm9ybSwgdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbiwgbWV0aG9kLCBzY29wZSwgYSk7XG4gIH1cbn0pO1xuXG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oUmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbik7XG5cbmZ1bmN0aW9uIGJhdGNoZWRVcGRhdGVzKGNhbGxiYWNrLCBhLCBiLCBjLCBkLCBlKSB7XG4gIGVuc3VyZUluamVjdGVkKCk7XG4gIHJldHVybiBiYXRjaGluZ1N0cmF0ZWd5LmJhdGNoZWRVcGRhdGVzKGNhbGxiYWNrLCBhLCBiLCBjLCBkLCBlKTtcbn1cblxuLyoqXG4gKiBBcnJheSBjb21wYXJhdG9yIGZvciBSZWFjdENvbXBvbmVudHMgYnkgbW91bnQgb3JkZXJpbmcuXG4gKlxuICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gYzEgZmlyc3QgY29tcG9uZW50IHlvdSdyZSBjb21wYXJpbmdcbiAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGMyIHNlY29uZCBjb21wb25lbnQgeW91J3JlIGNvbXBhcmluZ1xuICogQHJldHVybiB7bnVtYmVyfSBSZXR1cm4gdmFsdWUgdXNhYmxlIGJ5IEFycmF5LnByb3RvdHlwZS5zb3J0KCkuXG4gKi9cbmZ1bmN0aW9uIG1vdW50T3JkZXJDb21wYXJhdG9yKGMxLCBjMikge1xuICByZXR1cm4gYzEuX21vdW50T3JkZXIgLSBjMi5fbW91bnRPcmRlcjtcbn1cblxuZnVuY3Rpb24gcnVuQmF0Y2hlZFVwZGF0ZXModHJhbnNhY3Rpb24pIHtcbiAgdmFyIGxlbiA9IHRyYW5zYWN0aW9uLmRpcnR5Q29tcG9uZW50c0xlbmd0aDtcbiAgIShsZW4gPT09IGRpcnR5Q29tcG9uZW50cy5sZW5ndGgpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBmbHVzaCB0cmFuc2FjdGlvblxcJ3Mgc3RvcmVkIGRpcnR5LWNvbXBvbmVudHMgbGVuZ3RoICglcykgdG8gbWF0Y2ggZGlydHktY29tcG9uZW50cyBhcnJheSBsZW5ndGggKCVzKS4nLCBsZW4sIGRpcnR5Q29tcG9uZW50cy5sZW5ndGgpIDogX3Byb2RJbnZhcmlhbnQoJzEyNCcsIGxlbiwgZGlydHlDb21wb25lbnRzLmxlbmd0aCkgOiB2b2lkIDA7XG5cbiAgLy8gU2luY2UgcmVjb25jaWxpbmcgYSBjb21wb25lbnQgaGlnaGVyIGluIHRoZSBvd25lciBoaWVyYXJjaHkgdXN1YWxseSAobm90XG4gIC8vIGFsd2F5cyAtLSBzZWUgc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkpIHdpbGwgcmVjb25jaWxlIGNoaWxkcmVuLCByZWNvbmNpbGVcbiAgLy8gdGhlbSBiZWZvcmUgdGhlaXIgY2hpbGRyZW4gYnkgc29ydGluZyB0aGUgYXJyYXkuXG4gIGRpcnR5Q29tcG9uZW50cy5zb3J0KG1vdW50T3JkZXJDb21wYXJhdG9yKTtcblxuICAvLyBBbnkgdXBkYXRlcyBlbnF1ZXVlZCB3aGlsZSByZWNvbmNpbGluZyBtdXN0IGJlIHBlcmZvcm1lZCBhZnRlciB0aGlzIGVudGlyZVxuICAvLyBiYXRjaC4gT3RoZXJ3aXNlLCBpZiBkaXJ0eUNvbXBvbmVudHMgaXMgW0EsIEJdIHdoZXJlIEEgaGFzIGNoaWxkcmVuIEIgYW5kXG4gIC8vIEMsIEIgY291bGQgdXBkYXRlIHR3aWNlIGluIGEgc2luZ2xlIGJhdGNoIGlmIEMncyByZW5kZXIgZW5xdWV1ZXMgYW4gdXBkYXRlXG4gIC8vIHRvIEIgKHNpbmNlIEIgd291bGQgaGF2ZSBhbHJlYWR5IHVwZGF0ZWQsIHdlIHNob3VsZCBza2lwIGl0LCBhbmQgdGhlIG9ubHlcbiAgLy8gd2F5IHdlIGNhbiBrbm93IHRvIGRvIHNvIGlzIGJ5IGNoZWNraW5nIHRoZSBiYXRjaCBjb3VudGVyKS5cbiAgdXBkYXRlQmF0Y2hOdW1iZXIrKztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgLy8gSWYgYSBjb21wb25lbnQgaXMgdW5tb3VudGVkIGJlZm9yZSBwZW5kaW5nIGNoYW5nZXMgYXBwbHksIGl0IHdpbGwgc3RpbGxcbiAgICAvLyBiZSBoZXJlLCBidXQgd2UgYXNzdW1lIHRoYXQgaXQgaGFzIGNsZWFyZWQgaXRzIF9wZW5kaW5nQ2FsbGJhY2tzIGFuZFxuICAgIC8vIHRoYXQgcGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5IGlzIGEgbm9vcC5cbiAgICB2YXIgY29tcG9uZW50ID0gZGlydHlDb21wb25lbnRzW2ldO1xuXG4gICAgLy8gSWYgcGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5IGhhcHBlbnMgdG8gZW5xdWV1ZSBhbnkgbmV3IHVwZGF0ZXMsIHdlXG4gICAgLy8gc2hvdWxkbid0IGV4ZWN1dGUgdGhlIGNhbGxiYWNrcyB1bnRpbCB0aGUgbmV4dCByZW5kZXIgaGFwcGVucywgc29cbiAgICAvLyBzdGFzaCB0aGUgY2FsbGJhY2tzIGZpcnN0XG4gICAgdmFyIGNhbGxiYWNrcyA9IGNvbXBvbmVudC5fcGVuZGluZ0NhbGxiYWNrcztcbiAgICBjb21wb25lbnQuX3BlbmRpbmdDYWxsYmFja3MgPSBudWxsO1xuXG4gICAgdmFyIG1hcmtlck5hbWU7XG4gICAgaWYgKFJlYWN0RmVhdHVyZUZsYWdzLmxvZ1RvcExldmVsUmVuZGVycykge1xuICAgICAgdmFyIG5hbWVkQ29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgICAgLy8gRHVjayB0eXBlIFRvcExldmVsV3JhcHBlci4gVGhpcyBpcyBwcm9iYWJseSBhbHdheXMgdHJ1ZS5cbiAgICAgIGlmIChjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50LnR5cGUuaXNSZWFjdFRvcExldmVsV3JhcHBlcikge1xuICAgICAgICBuYW1lZENvbXBvbmVudCA9IGNvbXBvbmVudC5fcmVuZGVyZWRDb21wb25lbnQ7XG4gICAgICB9XG4gICAgICBtYXJrZXJOYW1lID0gJ1JlYWN0IHVwZGF0ZTogJyArIG5hbWVkQ29tcG9uZW50LmdldE5hbWUoKTtcbiAgICAgIGNvbnNvbGUudGltZShtYXJrZXJOYW1lKTtcbiAgICB9XG5cbiAgICBSZWFjdFJlY29uY2lsZXIucGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5KGNvbXBvbmVudCwgdHJhbnNhY3Rpb24ucmVjb25jaWxlVHJhbnNhY3Rpb24sIHVwZGF0ZUJhdGNoTnVtYmVyKTtcblxuICAgIGlmIChtYXJrZXJOYW1lKSB7XG4gICAgICBjb25zb2xlLnRpbWVFbmQobWFya2VyTmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKGNhbGxiYWNrcykge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjYWxsYmFja3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uY2FsbGJhY2tRdWV1ZS5lbnF1ZXVlKGNhbGxiYWNrc1tqXSwgY29tcG9uZW50LmdldFB1YmxpY0luc3RhbmNlKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG52YXIgZmx1c2hCYXRjaGVkVXBkYXRlcyA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gUmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbidzIHdyYXBwZXJzIHdpbGwgY2xlYXIgdGhlIGRpcnR5Q29tcG9uZW50c1xuICAvLyBhcnJheSBhbmQgcGVyZm9ybSBhbnkgdXBkYXRlcyBlbnF1ZXVlZCBieSBtb3VudC1yZWFkeSBoYW5kbGVycyAoaS5lLixcbiAgLy8gY29tcG9uZW50RGlkVXBkYXRlKSBidXQgd2UgbmVlZCB0byBjaGVjayBoZXJlIHRvbyBpbiBvcmRlciB0byBjYXRjaFxuICAvLyB1cGRhdGVzIGVucXVldWVkIGJ5IHNldFN0YXRlIGNhbGxiYWNrcyBhbmQgYXNhcCBjYWxscy5cbiAgd2hpbGUgKGRpcnR5Q29tcG9uZW50cy5sZW5ndGggfHwgYXNhcEVucXVldWVkKSB7XG4gICAgaWYgKGRpcnR5Q29tcG9uZW50cy5sZW5ndGgpIHtcbiAgICAgIHZhciB0cmFuc2FjdGlvbiA9IFJlYWN0VXBkYXRlc0ZsdXNoVHJhbnNhY3Rpb24uZ2V0UG9vbGVkKCk7XG4gICAgICB0cmFuc2FjdGlvbi5wZXJmb3JtKHJ1bkJhdGNoZWRVcGRhdGVzLCBudWxsLCB0cmFuc2FjdGlvbik7XG4gICAgICBSZWFjdFVwZGF0ZXNGbHVzaFRyYW5zYWN0aW9uLnJlbGVhc2UodHJhbnNhY3Rpb24pO1xuICAgIH1cblxuICAgIGlmIChhc2FwRW5xdWV1ZWQpIHtcbiAgICAgIGFzYXBFbnF1ZXVlZCA9IGZhbHNlO1xuICAgICAgdmFyIHF1ZXVlID0gYXNhcENhbGxiYWNrUXVldWU7XG4gICAgICBhc2FwQ2FsbGJhY2tRdWV1ZSA9IENhbGxiYWNrUXVldWUuZ2V0UG9vbGVkKCk7XG4gICAgICBxdWV1ZS5ub3RpZnlBbGwoKTtcbiAgICAgIENhbGxiYWNrUXVldWUucmVsZWFzZShxdWV1ZSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIE1hcmsgYSBjb21wb25lbnQgYXMgbmVlZGluZyBhIHJlcmVuZGVyLCBhZGRpbmcgYW4gb3B0aW9uYWwgY2FsbGJhY2sgdG8gYVxuICogbGlzdCBvZiBmdW5jdGlvbnMgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBvbmNlIHRoZSByZXJlbmRlciBvY2N1cnMuXG4gKi9cbmZ1bmN0aW9uIGVucXVldWVVcGRhdGUoY29tcG9uZW50KSB7XG4gIGVuc3VyZUluamVjdGVkKCk7XG5cbiAgLy8gVmFyaW91cyBwYXJ0cyBvZiBvdXIgY29kZSAoc3VjaCBhcyBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCdzXG4gIC8vIF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQpIGFzc3VtZSB0aGF0IGNhbGxzIHRvIHJlbmRlciBhcmVuJ3QgbmVzdGVkO1xuICAvLyB2ZXJpZnkgdGhhdCB0aGF0J3MgdGhlIGNhc2UuIChUaGlzIGlzIGNhbGxlZCBieSBlYWNoIHRvcC1sZXZlbCB1cGRhdGVcbiAgLy8gZnVuY3Rpb24sIGxpa2Ugc2V0U3RhdGUsIGZvcmNlVXBkYXRlLCBldGMuOyBjcmVhdGlvbiBhbmRcbiAgLy8gZGVzdHJ1Y3Rpb24gb2YgdG9wLWxldmVsIGNvbXBvbmVudHMgaXMgZ3VhcmRlZCBpbiBSZWFjdE1vdW50LilcblxuICBpZiAoIWJhdGNoaW5nU3RyYXRlZ3kuaXNCYXRjaGluZ1VwZGF0ZXMpIHtcbiAgICBiYXRjaGluZ1N0cmF0ZWd5LmJhdGNoZWRVcGRhdGVzKGVucXVldWVVcGRhdGUsIGNvbXBvbmVudCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZGlydHlDb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgaWYgKGNvbXBvbmVudC5fdXBkYXRlQmF0Y2hOdW1iZXIgPT0gbnVsbCkge1xuICAgIGNvbXBvbmVudC5fdXBkYXRlQmF0Y2hOdW1iZXIgPSB1cGRhdGVCYXRjaE51bWJlciArIDE7XG4gIH1cbn1cblxuLyoqXG4gKiBFbnF1ZXVlIGEgY2FsbGJhY2sgdG8gYmUgcnVuIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgYmF0Y2hpbmcgY3ljbGUuIFRocm93c1xuICogaWYgbm8gdXBkYXRlcyBhcmUgY3VycmVudGx5IGJlaW5nIHBlcmZvcm1lZC5cbiAqL1xuZnVuY3Rpb24gYXNhcChjYWxsYmFjaywgY29udGV4dCkge1xuICAhYmF0Y2hpbmdTdHJhdGVneS5pc0JhdGNoaW5nVXBkYXRlcyA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RVcGRhdGVzLmFzYXA6IENhblxcJ3QgZW5xdWV1ZSBhbiBhc2FwIGNhbGxiYWNrIGluIGEgY29udGV4dCB3aGVyZXVwZGF0ZXMgYXJlIG5vdCBiZWluZyBiYXRjaGVkLicpIDogX3Byb2RJbnZhcmlhbnQoJzEyNScpIDogdm9pZCAwO1xuICBhc2FwQ2FsbGJhY2tRdWV1ZS5lbnF1ZXVlKGNhbGxiYWNrLCBjb250ZXh0KTtcbiAgYXNhcEVucXVldWVkID0gdHJ1ZTtcbn1cblxudmFyIFJlYWN0VXBkYXRlc0luamVjdGlvbiA9IHtcbiAgaW5qZWN0UmVjb25jaWxlVHJhbnNhY3Rpb246IGZ1bmN0aW9uIChSZWNvbmNpbGVUcmFuc2FjdGlvbikge1xuICAgICFSZWNvbmNpbGVUcmFuc2FjdGlvbiA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RVcGRhdGVzOiBtdXN0IHByb3ZpZGUgYSByZWNvbmNpbGUgdHJhbnNhY3Rpb24gY2xhc3MnKSA6IF9wcm9kSW52YXJpYW50KCcxMjYnKSA6IHZvaWQgMDtcbiAgICBSZWFjdFVwZGF0ZXMuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbiA9IFJlY29uY2lsZVRyYW5zYWN0aW9uO1xuICB9LFxuXG4gIGluamVjdEJhdGNoaW5nU3RyYXRlZ3k6IGZ1bmN0aW9uIChfYmF0Y2hpbmdTdHJhdGVneSkge1xuICAgICFfYmF0Y2hpbmdTdHJhdGVneSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RVcGRhdGVzOiBtdXN0IHByb3ZpZGUgYSBiYXRjaGluZyBzdHJhdGVneScpIDogX3Byb2RJbnZhcmlhbnQoJzEyNycpIDogdm9pZCAwO1xuICAgICEodHlwZW9mIF9iYXRjaGluZ1N0cmF0ZWd5LmJhdGNoZWRVcGRhdGVzID09PSAnZnVuY3Rpb24nKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RVcGRhdGVzOiBtdXN0IHByb3ZpZGUgYSBiYXRjaGVkVXBkYXRlcygpIGZ1bmN0aW9uJykgOiBfcHJvZEludmFyaWFudCgnMTI4JykgOiB2b2lkIDA7XG4gICAgISh0eXBlb2YgX2JhdGNoaW5nU3RyYXRlZ3kuaXNCYXRjaGluZ1VwZGF0ZXMgPT09ICdib29sZWFuJykgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0VXBkYXRlczogbXVzdCBwcm92aWRlIGFuIGlzQmF0Y2hpbmdVcGRhdGVzIGJvb2xlYW4gYXR0cmlidXRlJykgOiBfcHJvZEludmFyaWFudCgnMTI5JykgOiB2b2lkIDA7XG4gICAgYmF0Y2hpbmdTdHJhdGVneSA9IF9iYXRjaGluZ1N0cmF0ZWd5O1xuICB9XG59O1xuXG52YXIgUmVhY3RVcGRhdGVzID0ge1xuICAvKipcbiAgICogUmVhY3QgcmVmZXJlbmNlcyBgUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbmAgdXNpbmcgdGhpcyBwcm9wZXJ0eSBpbiBvcmRlclxuICAgKiB0byBhbGxvdyBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uOiBudWxsLFxuXG4gIGJhdGNoZWRVcGRhdGVzOiBiYXRjaGVkVXBkYXRlcyxcbiAgZW5xdWV1ZVVwZGF0ZTogZW5xdWV1ZVVwZGF0ZSxcbiAgZmx1c2hCYXRjaGVkVXBkYXRlczogZmx1c2hCYXRjaGVkVXBkYXRlcyxcbiAgaW5qZWN0aW9uOiBSZWFjdFVwZGF0ZXNJbmplY3Rpb24sXG4gIGFzYXA6IGFzYXBcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RVcGRhdGVzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gJzE1LjUuNCc7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIE5TID0ge1xuICB4bGluazogJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLFxuICB4bWw6ICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnXG59O1xuXG4vLyBXZSB1c2UgYXR0cmlidXRlcyBmb3IgZXZlcnl0aGluZyBTVkcgc28gbGV0J3MgYXZvaWQgc29tZSBkdXBsaWNhdGlvbiBhbmQgcnVuXG4vLyBjb2RlIGluc3RlYWQuXG4vLyBUaGUgZm9sbG93aW5nIGFyZSBhbGwgc3BlY2lmaWVkIGluIHRoZSBIVE1MIGNvbmZpZyBhbHJlYWR5IHNvIHdlIGV4Y2x1ZGUgaGVyZS5cbi8vIC0gY2xhc3MgKGFzIGNsYXNzTmFtZSlcbi8vIC0gY29sb3Jcbi8vIC0gaGVpZ2h0XG4vLyAtIGlkXG4vLyAtIGxhbmdcbi8vIC0gbWF4XG4vLyAtIG1lZGlhXG4vLyAtIG1ldGhvZFxuLy8gLSBtaW5cbi8vIC0gbmFtZVxuLy8gLSBzdHlsZVxuLy8gLSB0YXJnZXRcbi8vIC0gdHlwZVxuLy8gLSB3aWR0aFxudmFyIEFUVFJTID0ge1xuICBhY2NlbnRIZWlnaHQ6ICdhY2NlbnQtaGVpZ2h0JyxcbiAgYWNjdW11bGF0ZTogMCxcbiAgYWRkaXRpdmU6IDAsXG4gIGFsaWdubWVudEJhc2VsaW5lOiAnYWxpZ25tZW50LWJhc2VsaW5lJyxcbiAgYWxsb3dSZW9yZGVyOiAnYWxsb3dSZW9yZGVyJyxcbiAgYWxwaGFiZXRpYzogMCxcbiAgYW1wbGl0dWRlOiAwLFxuICBhcmFiaWNGb3JtOiAnYXJhYmljLWZvcm0nLFxuICBhc2NlbnQ6IDAsXG4gIGF0dHJpYnV0ZU5hbWU6ICdhdHRyaWJ1dGVOYW1lJyxcbiAgYXR0cmlidXRlVHlwZTogJ2F0dHJpYnV0ZVR5cGUnLFxuICBhdXRvUmV2ZXJzZTogJ2F1dG9SZXZlcnNlJyxcbiAgYXppbXV0aDogMCxcbiAgYmFzZUZyZXF1ZW5jeTogJ2Jhc2VGcmVxdWVuY3knLFxuICBiYXNlUHJvZmlsZTogJ2Jhc2VQcm9maWxlJyxcbiAgYmFzZWxpbmVTaGlmdDogJ2Jhc2VsaW5lLXNoaWZ0JyxcbiAgYmJveDogMCxcbiAgYmVnaW46IDAsXG4gIGJpYXM6IDAsXG4gIGJ5OiAwLFxuICBjYWxjTW9kZTogJ2NhbGNNb2RlJyxcbiAgY2FwSGVpZ2h0OiAnY2FwLWhlaWdodCcsXG4gIGNsaXA6IDAsXG4gIGNsaXBQYXRoOiAnY2xpcC1wYXRoJyxcbiAgY2xpcFJ1bGU6ICdjbGlwLXJ1bGUnLFxuICBjbGlwUGF0aFVuaXRzOiAnY2xpcFBhdGhVbml0cycsXG4gIGNvbG9ySW50ZXJwb2xhdGlvbjogJ2NvbG9yLWludGVycG9sYXRpb24nLFxuICBjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJyxcbiAgY29sb3JQcm9maWxlOiAnY29sb3ItcHJvZmlsZScsXG4gIGNvbG9yUmVuZGVyaW5nOiAnY29sb3ItcmVuZGVyaW5nJyxcbiAgY29udGVudFNjcmlwdFR5cGU6ICdjb250ZW50U2NyaXB0VHlwZScsXG4gIGNvbnRlbnRTdHlsZVR5cGU6ICdjb250ZW50U3R5bGVUeXBlJyxcbiAgY3Vyc29yOiAwLFxuICBjeDogMCxcbiAgY3k6IDAsXG4gIGQ6IDAsXG4gIGRlY2VsZXJhdGU6IDAsXG4gIGRlc2NlbnQ6IDAsXG4gIGRpZmZ1c2VDb25zdGFudDogJ2RpZmZ1c2VDb25zdGFudCcsXG4gIGRpcmVjdGlvbjogMCxcbiAgZGlzcGxheTogMCxcbiAgZGl2aXNvcjogMCxcbiAgZG9taW5hbnRCYXNlbGluZTogJ2RvbWluYW50LWJhc2VsaW5lJyxcbiAgZHVyOiAwLFxuICBkeDogMCxcbiAgZHk6IDAsXG4gIGVkZ2VNb2RlOiAnZWRnZU1vZGUnLFxuICBlbGV2YXRpb246IDAsXG4gIGVuYWJsZUJhY2tncm91bmQ6ICdlbmFibGUtYmFja2dyb3VuZCcsXG4gIGVuZDogMCxcbiAgZXhwb25lbnQ6IDAsXG4gIGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQ6ICdleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkJyxcbiAgZmlsbDogMCxcbiAgZmlsbE9wYWNpdHk6ICdmaWxsLW9wYWNpdHknLFxuICBmaWxsUnVsZTogJ2ZpbGwtcnVsZScsXG4gIGZpbHRlcjogMCxcbiAgZmlsdGVyUmVzOiAnZmlsdGVyUmVzJyxcbiAgZmlsdGVyVW5pdHM6ICdmaWx0ZXJVbml0cycsXG4gIGZsb29kQ29sb3I6ICdmbG9vZC1jb2xvcicsXG4gIGZsb29kT3BhY2l0eTogJ2Zsb29kLW9wYWNpdHknLFxuICBmb2N1c2FibGU6IDAsXG4gIGZvbnRGYW1pbHk6ICdmb250LWZhbWlseScsXG4gIGZvbnRTaXplOiAnZm9udC1zaXplJyxcbiAgZm9udFNpemVBZGp1c3Q6ICdmb250LXNpemUtYWRqdXN0JyxcbiAgZm9udFN0cmV0Y2g6ICdmb250LXN0cmV0Y2gnLFxuICBmb250U3R5bGU6ICdmb250LXN0eWxlJyxcbiAgZm9udFZhcmlhbnQ6ICdmb250LXZhcmlhbnQnLFxuICBmb250V2VpZ2h0OiAnZm9udC13ZWlnaHQnLFxuICBmb3JtYXQ6IDAsXG4gIGZyb206IDAsXG4gIGZ4OiAwLFxuICBmeTogMCxcbiAgZzE6IDAsXG4gIGcyOiAwLFxuICBnbHlwaE5hbWU6ICdnbHlwaC1uYW1lJyxcbiAgZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWw6ICdnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsJyxcbiAgZ2x5cGhPcmllbnRhdGlvblZlcnRpY2FsOiAnZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwnLFxuICBnbHlwaFJlZjogJ2dseXBoUmVmJyxcbiAgZ3JhZGllbnRUcmFuc2Zvcm06ICdncmFkaWVudFRyYW5zZm9ybScsXG4gIGdyYWRpZW50VW5pdHM6ICdncmFkaWVudFVuaXRzJyxcbiAgaGFuZ2luZzogMCxcbiAgaG9yaXpBZHZYOiAnaG9yaXotYWR2LXgnLFxuICBob3Jpek9yaWdpblg6ICdob3Jpei1vcmlnaW4teCcsXG4gIGlkZW9ncmFwaGljOiAwLFxuICBpbWFnZVJlbmRlcmluZzogJ2ltYWdlLXJlbmRlcmluZycsXG4gICdpbic6IDAsXG4gIGluMjogMCxcbiAgaW50ZXJjZXB0OiAwLFxuICBrOiAwLFxuICBrMTogMCxcbiAgazI6IDAsXG4gIGszOiAwLFxuICBrNDogMCxcbiAga2VybmVsTWF0cml4OiAna2VybmVsTWF0cml4JyxcbiAga2VybmVsVW5pdExlbmd0aDogJ2tlcm5lbFVuaXRMZW5ndGgnLFxuICBrZXJuaW5nOiAwLFxuICBrZXlQb2ludHM6ICdrZXlQb2ludHMnLFxuICBrZXlTcGxpbmVzOiAna2V5U3BsaW5lcycsXG4gIGtleVRpbWVzOiAna2V5VGltZXMnLFxuICBsZW5ndGhBZGp1c3Q6ICdsZW5ndGhBZGp1c3QnLFxuICBsZXR0ZXJTcGFjaW5nOiAnbGV0dGVyLXNwYWNpbmcnLFxuICBsaWdodGluZ0NvbG9yOiAnbGlnaHRpbmctY29sb3InLFxuICBsaW1pdGluZ0NvbmVBbmdsZTogJ2xpbWl0aW5nQ29uZUFuZ2xlJyxcbiAgbG9jYWw6IDAsXG4gIG1hcmtlckVuZDogJ21hcmtlci1lbmQnLFxuICBtYXJrZXJNaWQ6ICdtYXJrZXItbWlkJyxcbiAgbWFya2VyU3RhcnQ6ICdtYXJrZXItc3RhcnQnLFxuICBtYXJrZXJIZWlnaHQ6ICdtYXJrZXJIZWlnaHQnLFxuICBtYXJrZXJVbml0czogJ21hcmtlclVuaXRzJyxcbiAgbWFya2VyV2lkdGg6ICdtYXJrZXJXaWR0aCcsXG4gIG1hc2s6IDAsXG4gIG1hc2tDb250ZW50VW5pdHM6ICdtYXNrQ29udGVudFVuaXRzJyxcbiAgbWFza1VuaXRzOiAnbWFza1VuaXRzJyxcbiAgbWF0aGVtYXRpY2FsOiAwLFxuICBtb2RlOiAwLFxuICBudW1PY3RhdmVzOiAnbnVtT2N0YXZlcycsXG4gIG9mZnNldDogMCxcbiAgb3BhY2l0eTogMCxcbiAgb3BlcmF0b3I6IDAsXG4gIG9yZGVyOiAwLFxuICBvcmllbnQ6IDAsXG4gIG9yaWVudGF0aW9uOiAwLFxuICBvcmlnaW46IDAsXG4gIG92ZXJmbG93OiAwLFxuICBvdmVybGluZVBvc2l0aW9uOiAnb3ZlcmxpbmUtcG9zaXRpb24nLFxuICBvdmVybGluZVRoaWNrbmVzczogJ292ZXJsaW5lLXRoaWNrbmVzcycsXG4gIHBhaW50T3JkZXI6ICdwYWludC1vcmRlcicsXG4gIHBhbm9zZTE6ICdwYW5vc2UtMScsXG4gIHBhdGhMZW5ndGg6ICdwYXRoTGVuZ3RoJyxcbiAgcGF0dGVybkNvbnRlbnRVbml0czogJ3BhdHRlcm5Db250ZW50VW5pdHMnLFxuICBwYXR0ZXJuVHJhbnNmb3JtOiAncGF0dGVyblRyYW5zZm9ybScsXG4gIHBhdHRlcm5Vbml0czogJ3BhdHRlcm5Vbml0cycsXG4gIHBvaW50ZXJFdmVudHM6ICdwb2ludGVyLWV2ZW50cycsXG4gIHBvaW50czogMCxcbiAgcG9pbnRzQXRYOiAncG9pbnRzQXRYJyxcbiAgcG9pbnRzQXRZOiAncG9pbnRzQXRZJyxcbiAgcG9pbnRzQXRaOiAncG9pbnRzQXRaJyxcbiAgcHJlc2VydmVBbHBoYTogJ3ByZXNlcnZlQWxwaGEnLFxuICBwcmVzZXJ2ZUFzcGVjdFJhdGlvOiAncHJlc2VydmVBc3BlY3RSYXRpbycsXG4gIHByaW1pdGl2ZVVuaXRzOiAncHJpbWl0aXZlVW5pdHMnLFxuICByOiAwLFxuICByYWRpdXM6IDAsXG4gIHJlZlg6ICdyZWZYJyxcbiAgcmVmWTogJ3JlZlknLFxuICByZW5kZXJpbmdJbnRlbnQ6ICdyZW5kZXJpbmctaW50ZW50JyxcbiAgcmVwZWF0Q291bnQ6ICdyZXBlYXRDb3VudCcsXG4gIHJlcGVhdER1cjogJ3JlcGVhdER1cicsXG4gIHJlcXVpcmVkRXh0ZW5zaW9uczogJ3JlcXVpcmVkRXh0ZW5zaW9ucycsXG4gIHJlcXVpcmVkRmVhdHVyZXM6ICdyZXF1aXJlZEZlYXR1cmVzJyxcbiAgcmVzdGFydDogMCxcbiAgcmVzdWx0OiAwLFxuICByb3RhdGU6IDAsXG4gIHJ4OiAwLFxuICByeTogMCxcbiAgc2NhbGU6IDAsXG4gIHNlZWQ6IDAsXG4gIHNoYXBlUmVuZGVyaW5nOiAnc2hhcGUtcmVuZGVyaW5nJyxcbiAgc2xvcGU6IDAsXG4gIHNwYWNpbmc6IDAsXG4gIHNwZWN1bGFyQ29uc3RhbnQ6ICdzcGVjdWxhckNvbnN0YW50JyxcbiAgc3BlY3VsYXJFeHBvbmVudDogJ3NwZWN1bGFyRXhwb25lbnQnLFxuICBzcGVlZDogMCxcbiAgc3ByZWFkTWV0aG9kOiAnc3ByZWFkTWV0aG9kJyxcbiAgc3RhcnRPZmZzZXQ6ICdzdGFydE9mZnNldCcsXG4gIHN0ZERldmlhdGlvbjogJ3N0ZERldmlhdGlvbicsXG4gIHN0ZW1oOiAwLFxuICBzdGVtdjogMCxcbiAgc3RpdGNoVGlsZXM6ICdzdGl0Y2hUaWxlcycsXG4gIHN0b3BDb2xvcjogJ3N0b3AtY29sb3InLFxuICBzdG9wT3BhY2l0eTogJ3N0b3Atb3BhY2l0eScsXG4gIHN0cmlrZXRocm91Z2hQb3NpdGlvbjogJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nLFxuICBzdHJpa2V0aHJvdWdoVGhpY2tuZXNzOiAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnLFxuICBzdHJpbmc6IDAsXG4gIHN0cm9rZTogMCxcbiAgc3Ryb2tlRGFzaGFycmF5OiAnc3Ryb2tlLWRhc2hhcnJheScsXG4gIHN0cm9rZURhc2hvZmZzZXQ6ICdzdHJva2UtZGFzaG9mZnNldCcsXG4gIHN0cm9rZUxpbmVjYXA6ICdzdHJva2UtbGluZWNhcCcsXG4gIHN0cm9rZUxpbmVqb2luOiAnc3Ryb2tlLWxpbmVqb2luJyxcbiAgc3Ryb2tlTWl0ZXJsaW1pdDogJ3N0cm9rZS1taXRlcmxpbWl0JyxcbiAgc3Ryb2tlT3BhY2l0eTogJ3N0cm9rZS1vcGFjaXR5JyxcbiAgc3Ryb2tlV2lkdGg6ICdzdHJva2Utd2lkdGgnLFxuICBzdXJmYWNlU2NhbGU6ICdzdXJmYWNlU2NhbGUnLFxuICBzeXN0ZW1MYW5ndWFnZTogJ3N5c3RlbUxhbmd1YWdlJyxcbiAgdGFibGVWYWx1ZXM6ICd0YWJsZVZhbHVlcycsXG4gIHRhcmdldFg6ICd0YXJnZXRYJyxcbiAgdGFyZ2V0WTogJ3RhcmdldFknLFxuICB0ZXh0QW5jaG9yOiAndGV4dC1hbmNob3InLFxuICB0ZXh0RGVjb3JhdGlvbjogJ3RleHQtZGVjb3JhdGlvbicsXG4gIHRleHRSZW5kZXJpbmc6ICd0ZXh0LXJlbmRlcmluZycsXG4gIHRleHRMZW5ndGg6ICd0ZXh0TGVuZ3RoJyxcbiAgdG86IDAsXG4gIHRyYW5zZm9ybTogMCxcbiAgdTE6IDAsXG4gIHUyOiAwLFxuICB1bmRlcmxpbmVQb3NpdGlvbjogJ3VuZGVybGluZS1wb3NpdGlvbicsXG4gIHVuZGVybGluZVRoaWNrbmVzczogJ3VuZGVybGluZS10aGlja25lc3MnLFxuICB1bmljb2RlOiAwLFxuICB1bmljb2RlQmlkaTogJ3VuaWNvZGUtYmlkaScsXG4gIHVuaWNvZGVSYW5nZTogJ3VuaWNvZGUtcmFuZ2UnLFxuICB1bml0c1BlckVtOiAndW5pdHMtcGVyLWVtJyxcbiAgdkFscGhhYmV0aWM6ICd2LWFscGhhYmV0aWMnLFxuICB2SGFuZ2luZzogJ3YtaGFuZ2luZycsXG4gIHZJZGVvZ3JhcGhpYzogJ3YtaWRlb2dyYXBoaWMnLFxuICB2TWF0aGVtYXRpY2FsOiAndi1tYXRoZW1hdGljYWwnLFxuICB2YWx1ZXM6IDAsXG4gIHZlY3RvckVmZmVjdDogJ3ZlY3Rvci1lZmZlY3QnLFxuICB2ZXJzaW9uOiAwLFxuICB2ZXJ0QWR2WTogJ3ZlcnQtYWR2LXknLFxuICB2ZXJ0T3JpZ2luWDogJ3ZlcnQtb3JpZ2luLXgnLFxuICB2ZXJ0T3JpZ2luWTogJ3ZlcnQtb3JpZ2luLXknLFxuICB2aWV3Qm94OiAndmlld0JveCcsXG4gIHZpZXdUYXJnZXQ6ICd2aWV3VGFyZ2V0JyxcbiAgdmlzaWJpbGl0eTogMCxcbiAgd2lkdGhzOiAwLFxuICB3b3JkU3BhY2luZzogJ3dvcmQtc3BhY2luZycsXG4gIHdyaXRpbmdNb2RlOiAnd3JpdGluZy1tb2RlJyxcbiAgeDogMCxcbiAgeEhlaWdodDogJ3gtaGVpZ2h0JyxcbiAgeDE6IDAsXG4gIHgyOiAwLFxuICB4Q2hhbm5lbFNlbGVjdG9yOiAneENoYW5uZWxTZWxlY3RvcicsXG4gIHhsaW5rQWN0dWF0ZTogJ3hsaW5rOmFjdHVhdGUnLFxuICB4bGlua0FyY3JvbGU6ICd4bGluazphcmNyb2xlJyxcbiAgeGxpbmtIcmVmOiAneGxpbms6aHJlZicsXG4gIHhsaW5rUm9sZTogJ3hsaW5rOnJvbGUnLFxuICB4bGlua1Nob3c6ICd4bGluazpzaG93JyxcbiAgeGxpbmtUaXRsZTogJ3hsaW5rOnRpdGxlJyxcbiAgeGxpbmtUeXBlOiAneGxpbms6dHlwZScsXG4gIHhtbEJhc2U6ICd4bWw6YmFzZScsXG4gIHhtbG5zOiAwLFxuICB4bWxuc1hsaW5rOiAneG1sbnM6eGxpbmsnLFxuICB4bWxMYW5nOiAneG1sOmxhbmcnLFxuICB4bWxTcGFjZTogJ3htbDpzcGFjZScsXG4gIHk6IDAsXG4gIHkxOiAwLFxuICB5MjogMCxcbiAgeUNoYW5uZWxTZWxlY3RvcjogJ3lDaGFubmVsU2VsZWN0b3InLFxuICB6OiAwLFxuICB6b29tQW5kUGFuOiAnem9vbUFuZFBhbidcbn07XG5cbnZhciBTVkdET01Qcm9wZXJ0eUNvbmZpZyA9IHtcbiAgUHJvcGVydGllczoge30sXG4gIERPTUF0dHJpYnV0ZU5hbWVzcGFjZXM6IHtcbiAgICB4bGlua0FjdHVhdGU6IE5TLnhsaW5rLFxuICAgIHhsaW5rQXJjcm9sZTogTlMueGxpbmssXG4gICAgeGxpbmtIcmVmOiBOUy54bGluayxcbiAgICB4bGlua1JvbGU6IE5TLnhsaW5rLFxuICAgIHhsaW5rU2hvdzogTlMueGxpbmssXG4gICAgeGxpbmtUaXRsZTogTlMueGxpbmssXG4gICAgeGxpbmtUeXBlOiBOUy54bGluayxcbiAgICB4bWxCYXNlOiBOUy54bWwsXG4gICAgeG1sTGFuZzogTlMueG1sLFxuICAgIHhtbFNwYWNlOiBOUy54bWxcbiAgfSxcbiAgRE9NQXR0cmlidXRlTmFtZXM6IHt9XG59O1xuXG5PYmplY3Qua2V5cyhBVFRSUykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gIFNWR0RPTVByb3BlcnR5Q29uZmlnLlByb3BlcnRpZXNba2V5XSA9IDA7XG4gIGlmIChBVFRSU1trZXldKSB7XG4gICAgU1ZHRE9NUHJvcGVydHlDb25maWcuRE9NQXR0cmlidXRlTmFtZXNba2V5XSA9IEFUVFJTW2tleV07XG4gIH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNWR0RPTVByb3BlcnR5Q29uZmlnOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFdmVudFByb3BhZ2F0b3JzID0gcmVxdWlyZSgnLi9FdmVudFByb3BhZ2F0b3JzJyk7XG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RJbnB1dFNlbGVjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnB1dFNlbGVjdGlvbicpO1xudmFyIFN5bnRoZXRpY0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNFdmVudCcpO1xuXG52YXIgZ2V0QWN0aXZlRWxlbWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL2dldEFjdGl2ZUVsZW1lbnQnKTtcbnZhciBpc1RleHRJbnB1dEVsZW1lbnQgPSByZXF1aXJlKCcuL2lzVGV4dElucHV0RWxlbWVudCcpO1xudmFyIHNoYWxsb3dFcXVhbCA9IHJlcXVpcmUoJ2ZianMvbGliL3NoYWxsb3dFcXVhbCcpO1xuXG52YXIgc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50ID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmICdkb2N1bWVudE1vZGUnIGluIGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50TW9kZSA8PSAxMTtcblxudmFyIGV2ZW50VHlwZXMgPSB7XG4gIHNlbGVjdDoge1xuICAgIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOiB7XG4gICAgICBidWJibGVkOiAnb25TZWxlY3QnLFxuICAgICAgY2FwdHVyZWQ6ICdvblNlbGVjdENhcHR1cmUnXG4gICAgfSxcbiAgICBkZXBlbmRlbmNpZXM6IFsndG9wQmx1cicsICd0b3BDb250ZXh0TWVudScsICd0b3BGb2N1cycsICd0b3BLZXlEb3duJywgJ3RvcEtleVVwJywgJ3RvcE1vdXNlRG93bicsICd0b3BNb3VzZVVwJywgJ3RvcFNlbGVjdGlvbkNoYW5nZSddXG4gIH1cbn07XG5cbnZhciBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG52YXIgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG52YXIgbW91c2VEb3duID0gZmFsc2U7XG5cbi8vIFRyYWNrIHdoZXRoZXIgYSBsaXN0ZW5lciBleGlzdHMgZm9yIHRoaXMgcGx1Z2luLiBJZiBub25lIGV4aXN0LCB3ZSBkb1xuLy8gbm90IGV4dHJhY3QgZXZlbnRzLiBTZWUgIzM2MzkuXG52YXIgaGFzTGlzdGVuZXIgPSBmYWxzZTtcblxuLyoqXG4gKiBHZXQgYW4gb2JqZWN0IHdoaWNoIGlzIGEgdW5pcXVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbi5cbiAqXG4gKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgbm90IGJlIGNvbnNpc3RlbnQgYWNyb3NzIG5vZGVzIG9yIGJyb3dzZXJzLCBidXRcbiAqIHR3byBpZGVudGljYWwgc2VsZWN0aW9ucyBvbiB0aGUgc2FtZSBub2RlIHdpbGwgcmV0dXJuIGlkZW50aWNhbCBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRTZWxlY3Rpb24obm9kZSkge1xuICBpZiAoJ3NlbGVjdGlvblN0YXJ0JyBpbiBub2RlICYmIFJlYWN0SW5wdXRTZWxlY3Rpb24uaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKG5vZGUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXJ0OiBub2RlLnNlbGVjdGlvblN0YXJ0LFxuICAgICAgZW5kOiBub2RlLnNlbGVjdGlvbkVuZFxuICAgIH07XG4gIH0gZWxzZSBpZiAod2luZG93LmdldFNlbGVjdGlvbikge1xuICAgIHZhciBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFuY2hvck5vZGU6IHNlbGVjdGlvbi5hbmNob3JOb2RlLFxuICAgICAgYW5jaG9yT2Zmc2V0OiBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LFxuICAgICAgZm9jdXNOb2RlOiBzZWxlY3Rpb24uZm9jdXNOb2RlLFxuICAgICAgZm9jdXNPZmZzZXQ6IHNlbGVjdGlvbi5mb2N1c09mZnNldFxuICAgIH07XG4gIH0gZWxzZSBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uKSB7XG4gICAgdmFyIHJhbmdlID0gZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmVudEVsZW1lbnQ6IHJhbmdlLnBhcmVudEVsZW1lbnQoKSxcbiAgICAgIHRleHQ6IHJhbmdlLnRleHQsXG4gICAgICB0b3A6IHJhbmdlLmJvdW5kaW5nVG9wLFxuICAgICAgbGVmdDogcmFuZ2UuYm91bmRpbmdMZWZ0XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFBvbGwgc2VsZWN0aW9uIHRvIHNlZSB3aGV0aGVyIGl0J3MgY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4gez9TeW50aGV0aWNFdmVudH1cbiAqL1xuZnVuY3Rpb24gY29uc3RydWN0U2VsZWN0RXZlbnQobmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIC8vIEVuc3VyZSB3ZSBoYXZlIHRoZSByaWdodCBlbGVtZW50LCBhbmQgdGhhdCB0aGUgdXNlciBpcyBub3QgZHJhZ2dpbmcgYVxuICAvLyBzZWxlY3Rpb24gKHRoaXMgbWF0Y2hlcyBuYXRpdmUgYHNlbGVjdGAgZXZlbnQgYmVoYXZpb3IpLiBJbiBIVE1MNSwgc2VsZWN0XG4gIC8vIGZpcmVzIG9ubHkgb24gaW5wdXQgYW5kIHRleHRhcmVhIHRodXMgaWYgdGhlcmUncyBubyBmb2N1c2VkIGVsZW1lbnQgd2VcbiAgLy8gd29uJ3QgZGlzcGF0Y2guXG4gIGlmIChtb3VzZURvd24gfHwgYWN0aXZlRWxlbWVudCA9PSBudWxsIHx8IGFjdGl2ZUVsZW1lbnQgIT09IGdldEFjdGl2ZUVsZW1lbnQoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLy8gT25seSBmaXJlIHdoZW4gc2VsZWN0aW9uIGhhcyBhY3R1YWxseSBjaGFuZ2VkLlxuICB2YXIgY3VycmVudFNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbihhY3RpdmVFbGVtZW50KTtcbiAgaWYgKCFsYXN0U2VsZWN0aW9uIHx8ICFzaGFsbG93RXF1YWwobGFzdFNlbGVjdGlvbiwgY3VycmVudFNlbGVjdGlvbikpIHtcbiAgICBsYXN0U2VsZWN0aW9uID0gY3VycmVudFNlbGVjdGlvbjtcblxuICAgIHZhciBzeW50aGV0aWNFdmVudCA9IFN5bnRoZXRpY0V2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLnNlbGVjdCwgYWN0aXZlRWxlbWVudEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgICBzeW50aGV0aWNFdmVudC50eXBlID0gJ3NlbGVjdCc7XG4gICAgc3ludGhldGljRXZlbnQudGFyZ2V0ID0gYWN0aXZlRWxlbWVudDtcblxuICAgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhzeW50aGV0aWNFdmVudCk7XG5cbiAgICByZXR1cm4gc3ludGhldGljRXZlbnQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBUaGlzIHBsdWdpbiBjcmVhdGVzIGFuIGBvblNlbGVjdGAgZXZlbnQgdGhhdCBub3JtYWxpemVzIHNlbGVjdCBldmVudHNcbiAqIGFjcm9zcyBmb3JtIGVsZW1lbnRzLlxuICpcbiAqIFN1cHBvcnRlZCBlbGVtZW50cyBhcmU6XG4gKiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxlbWVudGApXG4gKiAtIHRleHRhcmVhXG4gKiAtIGNvbnRlbnRFZGl0YWJsZVxuICpcbiAqIFRoaXMgZGlmZmVycyBmcm9tIG5hdGl2ZSBicm93c2VyIGltcGxlbWVudGF0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHdheXM6XG4gKiAtIEZpcmVzIG9uIGNvbnRlbnRFZGl0YWJsZSBmaWVsZHMgYXMgd2VsbCBhcyBpbnB1dHMuXG4gKiAtIEZpcmVzIGZvciBjb2xsYXBzZWQgc2VsZWN0aW9uLlxuICogLSBGaXJlcyBhZnRlciB1c2VyIGlucHV0LlxuICovXG52YXIgU2VsZWN0RXZlbnRQbHVnaW4gPSB7XG5cbiAgZXZlbnRUeXBlczogZXZlbnRUeXBlcyxcblxuICBleHRyYWN0RXZlbnRzOiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICBpZiAoIWhhc0xpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcblxuICAgIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7XG4gICAgICAvLyBUcmFjayB0aGUgaW5wdXQgbm9kZSB0aGF0IGhhcyBmb2N1cy5cbiAgICAgIGNhc2UgJ3RvcEZvY3VzJzpcbiAgICAgICAgaWYgKGlzVGV4dElucHV0RWxlbWVudCh0YXJnZXROb2RlKSB8fCB0YXJnZXROb2RlLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgYWN0aXZlRWxlbWVudCA9IHRhcmdldE5vZGU7XG4gICAgICAgICAgYWN0aXZlRWxlbWVudEluc3QgPSB0YXJnZXRJbnN0O1xuICAgICAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wQmx1cic6XG4gICAgICAgIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xuICAgICAgICBhY3RpdmVFbGVtZW50SW5zdCA9IG51bGw7XG4gICAgICAgIGxhc3RTZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICBicmVhaztcblxuICAgICAgLy8gRG9uJ3QgZmlyZSB0aGUgZXZlbnQgd2hpbGUgdGhlIHVzZXIgaXMgZHJhZ2dpbmcuIFRoaXMgbWF0Y2hlcyB0aGVcbiAgICAgIC8vIHNlbWFudGljcyBvZiB0aGUgbmF0aXZlIHNlbGVjdCBldmVudC5cbiAgICAgIGNhc2UgJ3RvcE1vdXNlRG93bic6XG4gICAgICAgIG1vdXNlRG93biA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wQ29udGV4dE1lbnUnOlxuICAgICAgY2FzZSAndG9wTW91c2VVcCc6XG4gICAgICAgIG1vdXNlRG93biA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gY29uc3RydWN0U2VsZWN0RXZlbnQobmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICAgICAgLy8gQ2hyb21lIGFuZCBJRSBmaXJlIG5vbi1zdGFuZGFyZCBldmVudCB3aGVuIHNlbGVjdGlvbiBpcyBjaGFuZ2VkIChhbmRcbiAgICAgIC8vIHNvbWV0aW1lcyB3aGVuIGl0IGhhc24ndCkuIElFJ3MgZXZlbnQgZmlyZXMgb3V0IG9mIG9yZGVyIHdpdGggcmVzcGVjdFxuICAgICAgLy8gdG8ga2V5IGFuZCBpbnB1dCBldmVudHMgb24gZGVsZXRpb24sIHNvIHdlIGRpc2NhcmQgaXQuXG4gICAgICAvL1xuICAgICAgLy8gRmlyZWZveCBkb2Vzbid0IHN1cHBvcnQgc2VsZWN0aW9uY2hhbmdlLCBzbyBjaGVjayBzZWxlY3Rpb24gc3RhdHVzXG4gICAgICAvLyBhZnRlciBlYWNoIGtleSBlbnRyeS4gVGhlIHNlbGVjdGlvbiBjaGFuZ2VzIGFmdGVyIGtleWRvd24gYW5kIGJlZm9yZVxuICAgICAgLy8ga2V5dXAsIGJ1dCB3ZSBjaGVjayBvbiBrZXlkb3duIGFzIHdlbGwgaW4gdGhlIGNhc2Ugb2YgaG9sZGluZyBkb3duIGFcbiAgICAgIC8vIGtleSwgd2hlbiBtdWx0aXBsZSBrZXlkb3duIGV2ZW50cyBhcmUgZmlyZWQgYnV0IG9ubHkgb25lIGtleXVwIGlzLlxuICAgICAgLy8gVGhpcyBpcyBhbHNvIG91ciBhcHByb2FjaCBmb3IgSUUgaGFuZGxpbmcsIGZvciB0aGUgcmVhc29uIGFib3ZlLlxuICAgICAgY2FzZSAndG9wU2VsZWN0aW9uQ2hhbmdlJzpcbiAgICAgICAgaWYgKHNraXBTZWxlY3Rpb25DaGFuZ2VFdmVudCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlICd0b3BLZXlEb3duJzpcbiAgICAgIGNhc2UgJ3RvcEtleVVwJzpcbiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdFNlbGVjdEV2ZW50KG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG5cbiAgZGlkUHV0TGlzdGVuZXI6IGZ1bmN0aW9uIChpbnN0LCByZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lcikge1xuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lID09PSAnb25TZWxlY3QnKSB7XG4gICAgICBoYXNMaXN0ZW5lciA9IHRydWU7XG4gICAgfVxuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNlbGVjdEV2ZW50UGx1Z2luOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIEV2ZW50TGlzdGVuZXIgPSByZXF1aXJlKCdmYmpzL2xpYi9FdmVudExpc3RlbmVyJyk7XG52YXIgRXZlbnRQcm9wYWdhdG9ycyA9IHJlcXVpcmUoJy4vRXZlbnRQcm9wYWdhdG9ycycpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgU3ludGhldGljQW5pbWF0aW9uRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0FuaW1hdGlvbkV2ZW50Jyk7XG52YXIgU3ludGhldGljQ2xpcGJvYXJkRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0NsaXBib2FyZEV2ZW50Jyk7XG52YXIgU3ludGhldGljRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0V2ZW50Jyk7XG52YXIgU3ludGhldGljRm9jdXNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRm9jdXNFdmVudCcpO1xudmFyIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0tleWJvYXJkRXZlbnQnKTtcbnZhciBTeW50aGV0aWNNb3VzZUV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNNb3VzZUV2ZW50Jyk7XG52YXIgU3ludGhldGljRHJhZ0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNEcmFnRXZlbnQnKTtcbnZhciBTeW50aGV0aWNUb3VjaEV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNUb3VjaEV2ZW50Jyk7XG52YXIgU3ludGhldGljVHJhbnNpdGlvbkV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQnKTtcbnZhciBTeW50aGV0aWNVSUV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNVSUV2ZW50Jyk7XG52YXIgU3ludGhldGljV2hlZWxFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljV2hlZWxFdmVudCcpO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcbnZhciBnZXRFdmVudENoYXJDb2RlID0gcmVxdWlyZSgnLi9nZXRFdmVudENoYXJDb2RlJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogVHVybnNcbiAqIFsnYWJvcnQnLCAuLi5dXG4gKiBpbnRvXG4gKiBldmVudFR5cGVzID0ge1xuICogICAnYWJvcnQnOiB7XG4gKiAgICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAqICAgICAgIGJ1YmJsZWQ6ICdvbkFib3J0JyxcbiAqICAgICAgIGNhcHR1cmVkOiAnb25BYm9ydENhcHR1cmUnLFxuICogICAgIH0sXG4gKiAgICAgZGVwZW5kZW5jaWVzOiBbJ3RvcEFib3J0J10sXG4gKiAgIH0sXG4gKiAgIC4uLlxuICogfTtcbiAqIHRvcExldmVsRXZlbnRzVG9EaXNwYXRjaENvbmZpZyA9IHtcbiAqICAgJ3RvcEFib3J0JzogeyBzYW1lQ29uZmlnIH1cbiAqIH07XG4gKi9cbnZhciBldmVudFR5cGVzID0ge307XG52YXIgdG9wTGV2ZWxFdmVudHNUb0Rpc3BhdGNoQ29uZmlnID0ge307XG5bJ2Fib3J0JywgJ2FuaW1hdGlvbkVuZCcsICdhbmltYXRpb25JdGVyYXRpb24nLCAnYW5pbWF0aW9uU3RhcnQnLCAnYmx1cicsICdjYW5QbGF5JywgJ2NhblBsYXlUaHJvdWdoJywgJ2NsaWNrJywgJ2NvbnRleHRNZW51JywgJ2NvcHknLCAnY3V0JywgJ2RvdWJsZUNsaWNrJywgJ2RyYWcnLCAnZHJhZ0VuZCcsICdkcmFnRW50ZXInLCAnZHJhZ0V4aXQnLCAnZHJhZ0xlYXZlJywgJ2RyYWdPdmVyJywgJ2RyYWdTdGFydCcsICdkcm9wJywgJ2R1cmF0aW9uQ2hhbmdlJywgJ2VtcHRpZWQnLCAnZW5jcnlwdGVkJywgJ2VuZGVkJywgJ2Vycm9yJywgJ2ZvY3VzJywgJ2lucHV0JywgJ2ludmFsaWQnLCAna2V5RG93bicsICdrZXlQcmVzcycsICdrZXlVcCcsICdsb2FkJywgJ2xvYWRlZERhdGEnLCAnbG9hZGVkTWV0YWRhdGEnLCAnbG9hZFN0YXJ0JywgJ21vdXNlRG93bicsICdtb3VzZU1vdmUnLCAnbW91c2VPdXQnLCAnbW91c2VPdmVyJywgJ21vdXNlVXAnLCAncGFzdGUnLCAncGF1c2UnLCAncGxheScsICdwbGF5aW5nJywgJ3Byb2dyZXNzJywgJ3JhdGVDaGFuZ2UnLCAncmVzZXQnLCAnc2Nyb2xsJywgJ3NlZWtlZCcsICdzZWVraW5nJywgJ3N0YWxsZWQnLCAnc3VibWl0JywgJ3N1c3BlbmQnLCAndGltZVVwZGF0ZScsICd0b3VjaENhbmNlbCcsICd0b3VjaEVuZCcsICd0b3VjaE1vdmUnLCAndG91Y2hTdGFydCcsICd0cmFuc2l0aW9uRW5kJywgJ3ZvbHVtZUNoYW5nZScsICd3YWl0aW5nJywgJ3doZWVsJ10uZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgdmFyIGNhcGl0YWxpemVkRXZlbnQgPSBldmVudFswXS50b1VwcGVyQ2FzZSgpICsgZXZlbnQuc2xpY2UoMSk7XG4gIHZhciBvbkV2ZW50ID0gJ29uJyArIGNhcGl0YWxpemVkRXZlbnQ7XG4gIHZhciB0b3BFdmVudCA9ICd0b3AnICsgY2FwaXRhbGl6ZWRFdmVudDtcblxuICB2YXIgdHlwZSA9IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogb25FdmVudCxcbiAgICAgIGNhcHR1cmVkOiBvbkV2ZW50ICsgJ0NhcHR1cmUnXG4gICAgfSxcbiAgICBkZXBlbmRlbmNpZXM6IFt0b3BFdmVudF1cbiAgfTtcbiAgZXZlbnRUeXBlc1tldmVudF0gPSB0eXBlO1xuICB0b3BMZXZlbEV2ZW50c1RvRGlzcGF0Y2hDb25maWdbdG9wRXZlbnRdID0gdHlwZTtcbn0pO1xuXG52YXIgb25DbGlja0xpc3RlbmVycyA9IHt9O1xuXG5mdW5jdGlvbiBnZXREaWN0aW9uYXJ5S2V5KGluc3QpIHtcbiAgLy8gUHJldmVudHMgVjggcGVyZm9ybWFuY2UgaXNzdWU6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzcyMzJcbiAgcmV0dXJuICcuJyArIGluc3QuX3Jvb3ROb2RlSUQ7XG59XG5cbmZ1bmN0aW9uIGlzSW50ZXJhY3RpdmUodGFnKSB7XG4gIHJldHVybiB0YWcgPT09ICdidXR0b24nIHx8IHRhZyA9PT0gJ2lucHV0JyB8fCB0YWcgPT09ICdzZWxlY3QnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJztcbn1cblxudmFyIFNpbXBsZUV2ZW50UGx1Z2luID0ge1xuXG4gIGV2ZW50VHlwZXM6IGV2ZW50VHlwZXMsXG5cbiAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdmFyIGRpc3BhdGNoQ29uZmlnID0gdG9wTGV2ZWxFdmVudHNUb0Rpc3BhdGNoQ29uZmlnW3RvcExldmVsVHlwZV07XG4gICAgaWYgKCFkaXNwYXRjaENvbmZpZykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBFdmVudENvbnN0cnVjdG9yO1xuICAgIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7XG4gICAgICBjYXNlICd0b3BBYm9ydCc6XG4gICAgICBjYXNlICd0b3BDYW5QbGF5JzpcbiAgICAgIGNhc2UgJ3RvcENhblBsYXlUaHJvdWdoJzpcbiAgICAgIGNhc2UgJ3RvcER1cmF0aW9uQ2hhbmdlJzpcbiAgICAgIGNhc2UgJ3RvcEVtcHRpZWQnOlxuICAgICAgY2FzZSAndG9wRW5jcnlwdGVkJzpcbiAgICAgIGNhc2UgJ3RvcEVuZGVkJzpcbiAgICAgIGNhc2UgJ3RvcEVycm9yJzpcbiAgICAgIGNhc2UgJ3RvcElucHV0JzpcbiAgICAgIGNhc2UgJ3RvcEludmFsaWQnOlxuICAgICAgY2FzZSAndG9wTG9hZCc6XG4gICAgICBjYXNlICd0b3BMb2FkZWREYXRhJzpcbiAgICAgIGNhc2UgJ3RvcExvYWRlZE1ldGFkYXRhJzpcbiAgICAgIGNhc2UgJ3RvcExvYWRTdGFydCc6XG4gICAgICBjYXNlICd0b3BQYXVzZSc6XG4gICAgICBjYXNlICd0b3BQbGF5JzpcbiAgICAgIGNhc2UgJ3RvcFBsYXlpbmcnOlxuICAgICAgY2FzZSAndG9wUHJvZ3Jlc3MnOlxuICAgICAgY2FzZSAndG9wUmF0ZUNoYW5nZSc6XG4gICAgICBjYXNlICd0b3BSZXNldCc6XG4gICAgICBjYXNlICd0b3BTZWVrZWQnOlxuICAgICAgY2FzZSAndG9wU2Vla2luZyc6XG4gICAgICBjYXNlICd0b3BTdGFsbGVkJzpcbiAgICAgIGNhc2UgJ3RvcFN1Ym1pdCc6XG4gICAgICBjYXNlICd0b3BTdXNwZW5kJzpcbiAgICAgIGNhc2UgJ3RvcFRpbWVVcGRhdGUnOlxuICAgICAgY2FzZSAndG9wVm9sdW1lQ2hhbmdlJzpcbiAgICAgIGNhc2UgJ3RvcFdhaXRpbmcnOlxuICAgICAgICAvLyBIVE1MIEV2ZW50c1xuICAgICAgICAvLyBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L2luZGV4Lmh0bWwjZXZlbnRzLTBcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0V2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcEtleVByZXNzJzpcbiAgICAgICAgLy8gRmlyZWZveCBjcmVhdGVzIGEga2V5cHJlc3MgZXZlbnQgZm9yIGZ1bmN0aW9uIGtleXMgdG9vLiBUaGlzIHJlbW92ZXNcbiAgICAgICAgLy8gdGhlIHVud2FudGVkIGtleXByZXNzIGV2ZW50cy4gRW50ZXIgaXMgaG93ZXZlciBib3RoIHByaW50YWJsZSBhbmRcbiAgICAgICAgLy8gbm9uLXByaW50YWJsZS4gT25lIHdvdWxkIGV4cGVjdCBUYWIgdG8gYmUgYXMgd2VsbCAoYnV0IGl0IGlzbid0KS5cbiAgICAgICAgaWYgKGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgJ3RvcEtleURvd24nOlxuICAgICAgY2FzZSAndG9wS2V5VXAnOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljS2V5Ym9hcmRFdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BCbHVyJzpcbiAgICAgIGNhc2UgJ3RvcEZvY3VzJzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wQ2xpY2snOlxuICAgICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBjbGljayBldmVudCBvbiByaWdodCBtb3VzZSBjbGlja3MuIFRoaXMgcmVtb3ZlcyB0aGVcbiAgICAgICAgLy8gdW53YW50ZWQgY2xpY2sgZXZlbnRzLlxuICAgICAgICBpZiAobmF0aXZlRXZlbnQuYnV0dG9uID09PSAyKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgJ3RvcERvdWJsZUNsaWNrJzpcbiAgICAgIGNhc2UgJ3RvcE1vdXNlRG93bic6XG4gICAgICBjYXNlICd0b3BNb3VzZU1vdmUnOlxuICAgICAgY2FzZSAndG9wTW91c2VVcCc6XG4gICAgICAvLyBUT0RPOiBEaXNhYmxlZCBlbGVtZW50cyBzaG91bGQgbm90IHJlc3BvbmQgdG8gbW91c2UgZXZlbnRzXG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgICBjYXNlICd0b3BNb3VzZU91dCc6XG4gICAgICBjYXNlICd0b3BNb3VzZU92ZXInOlxuICAgICAgY2FzZSAndG9wQ29udGV4dE1lbnUnOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljTW91c2VFdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BEcmFnJzpcbiAgICAgIGNhc2UgJ3RvcERyYWdFbmQnOlxuICAgICAgY2FzZSAndG9wRHJhZ0VudGVyJzpcbiAgICAgIGNhc2UgJ3RvcERyYWdFeGl0JzpcbiAgICAgIGNhc2UgJ3RvcERyYWdMZWF2ZSc6XG4gICAgICBjYXNlICd0b3BEcmFnT3Zlcic6XG4gICAgICBjYXNlICd0b3BEcmFnU3RhcnQnOlxuICAgICAgY2FzZSAndG9wRHJvcCc6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNEcmFnRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wVG91Y2hDYW5jZWwnOlxuICAgICAgY2FzZSAndG9wVG91Y2hFbmQnOlxuICAgICAgY2FzZSAndG9wVG91Y2hNb3ZlJzpcbiAgICAgIGNhc2UgJ3RvcFRvdWNoU3RhcnQnOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljVG91Y2hFdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BBbmltYXRpb25FbmQnOlxuICAgICAgY2FzZSAndG9wQW5pbWF0aW9uSXRlcmF0aW9uJzpcbiAgICAgIGNhc2UgJ3RvcEFuaW1hdGlvblN0YXJ0JzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcFRyYW5zaXRpb25FbmQnOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljVHJhbnNpdGlvbkV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcFNjcm9sbCc6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNVSUV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcFdoZWVsJzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY1doZWVsRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wQ29weSc6XG4gICAgICBjYXNlICd0b3BDdXQnOlxuICAgICAgY2FzZSAndG9wUGFzdGUnOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljQ2xpcGJvYXJkRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAhRXZlbnRDb25zdHJ1Y3RvciA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnU2ltcGxlRXZlbnRQbHVnaW46IFVuaGFuZGxlZCBldmVudCB0eXBlLCBgJXNgLicsIHRvcExldmVsVHlwZSkgOiBfcHJvZEludmFyaWFudCgnODYnLCB0b3BMZXZlbFR5cGUpIDogdm9pZCAwO1xuICAgIHZhciBldmVudCA9IEV2ZW50Q29uc3RydWN0b3IuZ2V0UG9vbGVkKGRpc3BhdGNoQ29uZmlnLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhldmVudCk7XG4gICAgcmV0dXJuIGV2ZW50O1xuICB9LFxuXG4gIGRpZFB1dExpc3RlbmVyOiBmdW5jdGlvbiAoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXIpIHtcbiAgICAvLyBNb2JpbGUgU2FmYXJpIGRvZXMgbm90IGZpcmUgcHJvcGVybHkgYnViYmxlIGNsaWNrIGV2ZW50cyBvblxuICAgIC8vIG5vbi1pbnRlcmFjdGl2ZSBlbGVtZW50cywgd2hpY2ggbWVhbnMgZGVsZWdhdGVkIGNsaWNrIGxpc3RlbmVycyBkbyBub3RcbiAgICAvLyBmaXJlLiBUaGUgd29ya2Fyb3VuZCBmb3IgdGhpcyBidWcgaW52b2x2ZXMgYXR0YWNoaW5nIGFuIGVtcHR5IGNsaWNrXG4gICAgLy8gbGlzdGVuZXIgb24gdGhlIHRhcmdldCBub2RlLlxuICAgIC8vIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDEwLzA5L2NsaWNrX2V2ZW50X2RlbC5odG1sXG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvbkNsaWNrJyAmJiAhaXNJbnRlcmFjdGl2ZShpbnN0Ll90YWcpKSB7XG4gICAgICB2YXIga2V5ID0gZ2V0RGljdGlvbmFyeUtleShpbnN0KTtcbiAgICAgIHZhciBub2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCk7XG4gICAgICBpZiAoIW9uQ2xpY2tMaXN0ZW5lcnNba2V5XSkge1xuICAgICAgICBvbkNsaWNrTGlzdGVuZXJzW2tleV0gPSBFdmVudExpc3RlbmVyLmxpc3Rlbihub2RlLCAnY2xpY2snLCBlbXB0eUZ1bmN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgd2lsbERlbGV0ZUxpc3RlbmVyOiBmdW5jdGlvbiAoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSkge1xuICAgIGlmIChyZWdpc3RyYXRpb25OYW1lID09PSAnb25DbGljaycgJiYgIWlzSW50ZXJhY3RpdmUoaW5zdC5fdGFnKSkge1xuICAgICAgdmFyIGtleSA9IGdldERpY3Rpb25hcnlLZXkoaW5zdCk7XG4gICAgICBvbkNsaWNrTGlzdGVuZXJzW2tleV0ucmVtb3ZlKCk7XG4gICAgICBkZWxldGUgb25DbGlja0xpc3RlbmVyc1trZXldO1xuICAgIH1cbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNpbXBsZUV2ZW50UGx1Z2luOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBTeW50aGV0aWNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRXZlbnQnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtYW5pbWF0aW9ucy8jQW5pbWF0aW9uRXZlbnQtaW50ZXJmYWNlXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9BbmltYXRpb25FdmVudFxuICovXG52YXIgQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UgPSB7XG4gIGFuaW1hdGlvbk5hbWU6IG51bGwsXG4gIGVsYXBzZWRUaW1lOiBudWxsLFxuICBwc2V1ZG9FbGVtZW50OiBudWxsXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNFdmVudH1cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljQW5pbWF0aW9uRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljQW5pbWF0aW9uRXZlbnQsIEFuaW1hdGlvbkV2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNBbmltYXRpb25FdmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3ludGhldGljRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0V2ZW50Jyk7XG5cbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9jbGlwYm9hcmQtYXBpcy9cbiAqL1xudmFyIENsaXBib2FyZEV2ZW50SW50ZXJmYWNlID0ge1xuICBjbGlwYm9hcmREYXRhOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2NsaXBib2FyZERhdGEnIGluIGV2ZW50ID8gZXZlbnQuY2xpcGJvYXJkRGF0YSA6IHdpbmRvdy5jbGlwYm9hcmREYXRhO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNVSUV2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNDbGlwYm9hcmRFdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICByZXR1cm4gU3ludGhldGljRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cblN5bnRoZXRpY0V2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNDbGlwYm9hcmRFdmVudCwgQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBTeW50aGV0aWNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRXZlbnQnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWNvbXBvc2l0aW9uZXZlbnRzXG4gKi9cbnZhciBDb21wb3NpdGlvbkV2ZW50SW50ZXJmYWNlID0ge1xuICBkYXRhOiBudWxsXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNVSUV2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuU3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQsIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY01vdXNlRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY01vdXNlRXZlbnQnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIERyYWdFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cbnZhciBEcmFnRXZlbnRJbnRlcmZhY2UgPSB7XG4gIGRhdGFUcmFuc2ZlcjogbnVsbFxufTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAZXh0ZW5kcyB7U3ludGhldGljVUlFdmVudH1cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljRHJhZ0V2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNNb3VzZUV2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNNb3VzZUV2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNEcmFnRXZlbnQsIERyYWdFdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljRHJhZ0V2ZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUG9vbGVkQ2xhc3MgPSByZXF1aXJlKCcuL1Bvb2xlZENsYXNzJyk7XG5cbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlGdW5jdGlvbicpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBkaWRXYXJuRm9yQWRkZWROZXdQcm9wZXJ0eSA9IGZhbHNlO1xudmFyIGlzUHJveHlTdXBwb3J0ZWQgPSB0eXBlb2YgUHJveHkgPT09ICdmdW5jdGlvbic7XG5cbnZhciBzaG91bGRCZVJlbGVhc2VkUHJvcGVydGllcyA9IFsnZGlzcGF0Y2hDb25maWcnLCAnX3RhcmdldEluc3QnLCAnbmF0aXZlRXZlbnQnLCAnaXNEZWZhdWx0UHJldmVudGVkJywgJ2lzUHJvcGFnYXRpb25TdG9wcGVkJywgJ19kaXNwYXRjaExpc3RlbmVycycsICdfZGlzcGF0Y2hJbnN0YW5jZXMnXTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xudmFyIEV2ZW50SW50ZXJmYWNlID0ge1xuICB0eXBlOiBudWxsLFxuICB0YXJnZXQ6IG51bGwsXG4gIC8vIGN1cnJlbnRUYXJnZXQgaXMgc2V0IHdoZW4gZGlzcGF0Y2hpbmc7IG5vIHVzZSBpbiBjb3B5aW5nIGl0IGhlcmVcbiAgY3VycmVudFRhcmdldDogZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGwsXG4gIGV2ZW50UGhhc2U6IG51bGwsXG4gIGJ1YmJsZXM6IG51bGwsXG4gIGNhbmNlbGFibGU6IG51bGwsXG4gIHRpbWVTdGFtcDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIGV2ZW50LnRpbWVTdGFtcCB8fCBEYXRlLm5vdygpO1xuICB9LFxuICBkZWZhdWx0UHJldmVudGVkOiBudWxsLFxuICBpc1RydXN0ZWQ6IG51bGxcbn07XG5cbi8qKlxuICogU3ludGhldGljIGV2ZW50cyBhcmUgZGlzcGF0Y2hlZCBieSBldmVudCBwbHVnaW5zLCB0eXBpY2FsbHkgaW4gcmVzcG9uc2UgdG8gYVxuICogdG9wLWxldmVsIGV2ZW50IGRlbGVnYXRpb24gaGFuZGxlci5cbiAqXG4gKiBUaGVzZSBzeXN0ZW1zIHNob3VsZCBnZW5lcmFsbHkgdXNlIHBvb2xpbmcgdG8gcmVkdWNlIHRoZSBmcmVxdWVuY3kgb2YgZ2FyYmFnZVxuICogY29sbGVjdGlvbi4gVGhlIHN5c3RlbSBzaG91bGQgY2hlY2sgYGlzUGVyc2lzdGVudGAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlXG4gKiBldmVudCBzaG91bGQgYmUgcmVsZWFzZWQgaW50byB0aGUgcG9vbCBhZnRlciBiZWluZyBkaXNwYXRjaGVkLiBVc2VycyB0aGF0XG4gKiBuZWVkIGEgcGVyc2lzdGVkIGV2ZW50IHNob3VsZCBpbnZva2UgYHBlcnNpc3RgLlxuICpcbiAqIFN5bnRoZXRpYyBldmVudHMgKGFuZCBzdWJjbGFzc2VzKSBpbXBsZW1lbnQgdGhlIERPTSBMZXZlbCAzIEV2ZW50cyBBUEkgYnlcbiAqIG5vcm1hbGl6aW5nIGJyb3dzZXIgcXVpcmtzLiBTdWJjbGFzc2VzIGRvIG5vdCBuZWNlc3NhcmlseSBoYXZlIHRvIGltcGxlbWVudCBhXG4gKiBET00gaW50ZXJmYWNlOyBjdXN0b20gYXBwbGljYXRpb24tc3BlY2lmaWMgZXZlbnRzIGNhbiBhbHNvIHN1YmNsYXNzIHRoaXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHsqfSB0YXJnZXRJbnN0IE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHBhcmFtIHtET01FdmVudFRhcmdldH0gbmF0aXZlRXZlbnRUYXJnZXQgVGFyZ2V0IG5vZGUuXG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY0V2ZW50KGRpc3BhdGNoQ29uZmlnLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gdGhlc2UgaGF2ZSBhIGdldHRlci9zZXR0ZXIgZm9yIHdhcm5pbmdzXG4gICAgZGVsZXRlIHRoaXMubmF0aXZlRXZlbnQ7XG4gICAgZGVsZXRlIHRoaXMucHJldmVudERlZmF1bHQ7XG4gICAgZGVsZXRlIHRoaXMuc3RvcFByb3BhZ2F0aW9uO1xuICB9XG5cbiAgdGhpcy5kaXNwYXRjaENvbmZpZyA9IGRpc3BhdGNoQ29uZmlnO1xuICB0aGlzLl90YXJnZXRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgdGhpcy5uYXRpdmVFdmVudCA9IG5hdGl2ZUV2ZW50O1xuXG4gIHZhciBJbnRlcmZhY2UgPSB0aGlzLmNvbnN0cnVjdG9yLkludGVyZmFjZTtcbiAgZm9yICh2YXIgcHJvcE5hbWUgaW4gSW50ZXJmYWNlKSB7XG4gICAgaWYgKCFJbnRlcmZhY2UuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBkZWxldGUgdGhpc1twcm9wTmFtZV07IC8vIHRoaXMgaGFzIGEgZ2V0dGVyL3NldHRlciBmb3Igd2FybmluZ3NcbiAgICB9XG4gICAgdmFyIG5vcm1hbGl6ZSA9IEludGVyZmFjZVtwcm9wTmFtZV07XG4gICAgaWYgKG5vcm1hbGl6ZSkge1xuICAgICAgdGhpc1twcm9wTmFtZV0gPSBub3JtYWxpemUobmF0aXZlRXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJvcE5hbWUgPT09ICd0YXJnZXQnKSB7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gbmF0aXZlRXZlbnRUYXJnZXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW3Byb3BOYW1lXSA9IG5hdGl2ZUV2ZW50W3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZGVmYXVsdFByZXZlbnRlZCA9IG5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgIT0gbnVsbCA/IG5hdGl2ZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgOiBuYXRpdmVFdmVudC5yZXR1cm5WYWx1ZSA9PT0gZmFsc2U7XG4gIGlmIChkZWZhdWx0UHJldmVudGVkKSB7XG4gICAgdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zVHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNGYWxzZTtcbiAgfVxuICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0ZhbHNlO1xuICByZXR1cm4gdGhpcztcbn1cblxuX2Fzc2lnbihTeW50aGV0aWNFdmVudC5wcm90b3R5cGUsIHtcblxuICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRpdmVFdmVudDtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnByZXZlbnREZWZhdWx0KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LnJldHVyblZhbHVlICE9PSAndW5rbm93bicpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgdmFsaWQtdHlwZW9mXG4gICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlO1xuICB9LFxuXG4gIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgIHZhciBldmVudCA9IHRoaXMubmF0aXZlRXZlbnQ7XG4gICAgaWYgKCFldmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV2ZW50LmNhbmNlbEJ1YmJsZSAhPT0gJ3Vua25vd24nKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHZhbGlkLXR5cGVvZlxuICAgICAgLy8gVGhlIENoYW5nZUV2ZW50UGx1Z2luIHJlZ2lzdGVycyBhIFwicHJvcGVydHljaGFuZ2VcIiBldmVudCBmb3JcbiAgICAgIC8vIElFLiBUaGlzIGV2ZW50IGRvZXMgbm90IHN1cHBvcnQgYnViYmxpbmcgb3IgY2FuY2VsbGluZywgYW5kXG4gICAgICAvLyBhbnkgcmVmZXJlbmNlcyB0byBjYW5jZWxCdWJibGUgdGhyb3cgXCJNZW1iZXIgbm90IGZvdW5kXCIuICBBXG4gICAgICAvLyB0eXBlb2YgY2hlY2sgb2YgXCJ1bmtub3duXCIgY2lyY3VtdmVudHMgdGhpcyBpc3N1ZSAoYW5kIGlzIGFsc29cbiAgICAgIC8vIElFIHNwZWNpZmljKS5cbiAgICAgIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBXZSByZWxlYXNlIGFsbCBkaXNwYXRjaGVkIGBTeW50aGV0aWNFdmVudGBzIGFmdGVyIGVhY2ggZXZlbnQgbG9vcCwgYWRkaW5nXG4gICAqIHRoZW0gYmFjayBpbnRvIHRoZSBwb29sLiBUaGlzIGFsbG93cyBhIHdheSB0byBob2xkIG9udG8gYSByZWZlcmVuY2UgdGhhdFxuICAgKiB3b24ndCBiZSBhZGRlZCBiYWNrIGludG8gdGhlIHBvb2wuXG4gICAqL1xuICBwZXJzaXN0OiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5pc1BlcnNpc3RlbnQgPSBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zVHJ1ZTtcbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoaXMgZXZlbnQgc2hvdWxkIGJlIHJlbGVhc2VkIGJhY2sgaW50byB0aGUgcG9vbC5cbiAgICpcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGlzIHNob3VsZCBub3QgYmUgcmVsZWFzZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIGlzUGVyc2lzdGVudDogZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0ZhbHNlLFxuXG4gIC8qKlxuICAgKiBgUG9vbGVkQ2xhc3NgIGxvb2tzIGZvciBgZGVzdHJ1Y3RvcmAgb24gZWFjaCBpbnN0YW5jZSBpdCByZWxlYXNlcy5cbiAgICovXG4gIGRlc3RydWN0b3I6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgSW50ZXJmYWNlID0gdGhpcy5jb25zdHJ1Y3Rvci5JbnRlcmZhY2U7XG4gICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gSW50ZXJmYWNlKSB7XG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BOYW1lLCBnZXRQb29sZWRXYXJuaW5nUHJvcGVydHlEZWZpbml0aW9uKHByb3BOYW1lLCBJbnRlcmZhY2VbcHJvcE5hbWVdKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW3Byb3BOYW1lXSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2hvdWxkQmVSZWxlYXNlZFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXNbc2hvdWxkQmVSZWxlYXNlZFByb3BlcnRpZXNbaV1dID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ25hdGl2ZUV2ZW50JywgZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbignbmF0aXZlRXZlbnQnLCBudWxsKSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3ByZXZlbnREZWZhdWx0JywgZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbigncHJldmVudERlZmF1bHQnLCBlbXB0eUZ1bmN0aW9uKSk7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3N0b3BQcm9wYWdhdGlvbicsIGdldFBvb2xlZFdhcm5pbmdQcm9wZXJ0eURlZmluaXRpb24oJ3N0b3BQcm9wYWdhdGlvbicsIGVtcHR5RnVuY3Rpb24pKTtcbiAgICB9XG4gIH1cblxufSk7XG5cblN5bnRoZXRpY0V2ZW50LkludGVyZmFjZSA9IEV2ZW50SW50ZXJmYWNlO1xuXG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgaWYgKGlzUHJveHlTdXBwb3J0ZWQpIHtcbiAgICAvKmVzbGludC1kaXNhYmxlIG5vLWZ1bmMtYXNzaWduICovXG4gICAgU3ludGhldGljRXZlbnQgPSBuZXcgUHJveHkoU3ludGhldGljRXZlbnQsIHtcbiAgICAgIGNvbnN0cnVjdDogZnVuY3Rpb24gKHRhcmdldCwgYXJncykge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBseSh0YXJnZXQsIE9iamVjdC5jcmVhdGUodGFyZ2V0LnByb3RvdHlwZSksIGFyZ3MpO1xuICAgICAgfSxcbiAgICAgIGFwcGx5OiBmdW5jdGlvbiAoY29uc3RydWN0b3IsIHRoYXQsIGFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm94eShjb25zdHJ1Y3Rvci5hcHBseSh0aGF0LCBhcmdzKSwge1xuICAgICAgICAgIHNldDogZnVuY3Rpb24gKHRhcmdldCwgcHJvcCwgdmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChwcm9wICE9PSAnaXNQZXJzaXN0ZW50JyAmJiAhdGFyZ2V0LmNvbnN0cnVjdG9yLkludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiBzaG91bGRCZVJlbGVhc2VkUHJvcGVydGllcy5pbmRleE9mKHByb3ApID09PSAtMSkge1xuICAgICAgICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZGlkV2FybkZvckFkZGVkTmV3UHJvcGVydHkgfHwgdGFyZ2V0LmlzUGVyc2lzdGVudCgpLCAnVGhpcyBzeW50aGV0aWMgZXZlbnQgaXMgcmV1c2VkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiBJZiB5b3VcXCdyZSAnICsgJ3NlZWluZyB0aGlzLCB5b3VcXCdyZSBhZGRpbmcgYSBuZXcgcHJvcGVydHkgaW4gdGhlIHN5bnRoZXRpYyBldmVudCBvYmplY3QuICcgKyAnVGhlIHByb3BlcnR5IGlzIG5ldmVyIHJlbGVhc2VkLiBTZWUgJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWV2ZW50LXBvb2xpbmcgZm9yIG1vcmUgaW5mb3JtYXRpb24uJykgOiB2b2lkIDA7XG4gICAgICAgICAgICAgIGRpZFdhcm5Gb3JBZGRlZE5ld1Byb3BlcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvKmVzbGludC1lbmFibGUgbm8tZnVuYy1hc3NpZ24gKi9cbiAgfVxufVxuLyoqXG4gKiBIZWxwZXIgdG8gcmVkdWNlIGJvaWxlcnBsYXRlIHdoZW4gY3JlYXRpbmcgc3ViY2xhc3Nlcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBDbGFzc1xuICogQHBhcmFtIHs/b2JqZWN0fSBJbnRlcmZhY2VcbiAqL1xuU3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzID0gZnVuY3Rpb24gKENsYXNzLCBJbnRlcmZhY2UpIHtcbiAgdmFyIFN1cGVyID0gdGhpcztcblxuICB2YXIgRSA9IGZ1bmN0aW9uICgpIHt9O1xuICBFLnByb3RvdHlwZSA9IFN1cGVyLnByb3RvdHlwZTtcbiAgdmFyIHByb3RvdHlwZSA9IG5ldyBFKCk7XG5cbiAgX2Fzc2lnbihwcm90b3R5cGUsIENsYXNzLnByb3RvdHlwZSk7XG4gIENsYXNzLnByb3RvdHlwZSA9IHByb3RvdHlwZTtcbiAgQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2xhc3M7XG5cbiAgQ2xhc3MuSW50ZXJmYWNlID0gX2Fzc2lnbih7fSwgU3VwZXIuSW50ZXJmYWNlLCBJbnRlcmZhY2UpO1xuICBDbGFzcy5hdWdtZW50Q2xhc3MgPSBTdXBlci5hdWdtZW50Q2xhc3M7XG5cbiAgUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKENsYXNzLCBQb29sZWRDbGFzcy5mb3VyQXJndW1lbnRQb29sZXIpO1xufTtcblxuUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKFN5bnRoZXRpY0V2ZW50LCBQb29sZWRDbGFzcy5mb3VyQXJndW1lbnRQb29sZXIpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY0V2ZW50O1xuXG4vKipcbiAgKiBIZWxwZXIgdG8gbnVsbGlmeSBzeW50aGV0aWNFdmVudCBpbnN0YW5jZSBwcm9wZXJ0aWVzIHdoZW4gZGVzdHJ1Y3RpbmdcbiAgKlxuICAqIEBwYXJhbSB7b2JqZWN0fSBTeW50aGV0aWNFdmVudFxuICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wTmFtZVxuICAqIEByZXR1cm4ge29iamVjdH0gZGVmaW5lUHJvcGVydHkgb2JqZWN0XG4gICovXG5mdW5jdGlvbiBnZXRQb29sZWRXYXJuaW5nUHJvcGVydHlEZWZpbml0aW9uKHByb3BOYW1lLCBnZXRWYWwpIHtcbiAgdmFyIGlzRnVuY3Rpb24gPSB0eXBlb2YgZ2V0VmFsID09PSAnZnVuY3Rpb24nO1xuICByZXR1cm4ge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICBzZXQ6IHNldCxcbiAgICBnZXQ6IGdldFxuICB9O1xuXG4gIGZ1bmN0aW9uIHNldCh2YWwpIHtcbiAgICB2YXIgYWN0aW9uID0gaXNGdW5jdGlvbiA/ICdzZXR0aW5nIHRoZSBtZXRob2QnIDogJ3NldHRpbmcgdGhlIHByb3BlcnR5JztcbiAgICB3YXJuKGFjdGlvbiwgJ1RoaXMgaXMgZWZmZWN0aXZlbHkgYSBuby1vcCcpO1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBmdW5jdGlvbiBnZXQoKSB7XG4gICAgdmFyIGFjdGlvbiA9IGlzRnVuY3Rpb24gPyAnYWNjZXNzaW5nIHRoZSBtZXRob2QnIDogJ2FjY2Vzc2luZyB0aGUgcHJvcGVydHknO1xuICAgIHZhciByZXN1bHQgPSBpc0Z1bmN0aW9uID8gJ1RoaXMgaXMgYSBuby1vcCBmdW5jdGlvbicgOiAnVGhpcyBpcyBzZXQgdG8gbnVsbCc7XG4gICAgd2FybihhY3Rpb24sIHJlc3VsdCk7XG4gICAgcmV0dXJuIGdldFZhbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdhcm4oYWN0aW9uLCByZXN1bHQpIHtcbiAgICB2YXIgd2FybmluZ0NvbmRpdGlvbiA9IGZhbHNlO1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyh3YXJuaW5nQ29uZGl0aW9uLCAnVGhpcyBzeW50aGV0aWMgZXZlbnQgaXMgcmV1c2VkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiBJZiB5b3VcXCdyZSBzZWVpbmcgdGhpcywgJyArICd5b3VcXCdyZSAlcyBgJXNgIG9uIGEgcmVsZWFzZWQvbnVsbGlmaWVkIHN5bnRoZXRpYyBldmVudC4gJXMuICcgKyAnSWYgeW91IG11c3Qga2VlcCB0aGUgb3JpZ2luYWwgc3ludGhldGljIGV2ZW50IGFyb3VuZCwgdXNlIGV2ZW50LnBlcnNpc3QoKS4gJyArICdTZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC1ldmVudC1wb29saW5nIGZvciBtb3JlIGluZm9ybWF0aW9uLicsIGFjdGlvbiwgcHJvcE5hbWUsIHJlc3VsdCkgOiB2b2lkIDA7XG4gIH1cbn0iLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3ludGhldGljVUlFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljVUlFdmVudCcpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRm9jdXNFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cbnZhciBGb2N1c0V2ZW50SW50ZXJmYWNlID0ge1xuICByZWxhdGVkVGFyZ2V0OiBudWxsXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNVSUV2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNGb2N1c0V2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNVSUV2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNVSUV2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNGb2N1c0V2ZW50LCBGb2N1c0V2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNGb2N1c0V2ZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBTeW50aGV0aWNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRXZlbnQnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMTMxMTA1XG4gKiAgICAgIC8jZXZlbnRzLWlucHV0ZXZlbnRzXG4gKi9cbnZhciBJbnB1dEV2ZW50SW50ZXJmYWNlID0ge1xuICBkYXRhOiBudWxsXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNVSUV2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNJbnB1dEV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuU3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0lucHV0RXZlbnQsIElucHV0RXZlbnRJbnRlcmZhY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY0lucHV0RXZlbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY1VJRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY1VJRXZlbnQnKTtcblxudmFyIGdldEV2ZW50Q2hhckNvZGUgPSByZXF1aXJlKCcuL2dldEV2ZW50Q2hhckNvZGUnKTtcbnZhciBnZXRFdmVudEtleSA9IHJlcXVpcmUoJy4vZ2V0RXZlbnRLZXknKTtcbnZhciBnZXRFdmVudE1vZGlmaWVyU3RhdGUgPSByZXF1aXJlKCcuL2dldEV2ZW50TW9kaWZpZXJTdGF0ZScpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgS2V5Ym9hcmRFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cbnZhciBLZXlib2FyZEV2ZW50SW50ZXJmYWNlID0ge1xuICBrZXk6IGdldEV2ZW50S2V5LFxuICBsb2NhdGlvbjogbnVsbCxcbiAgY3RybEtleTogbnVsbCxcbiAgc2hpZnRLZXk6IG51bGwsXG4gIGFsdEtleTogbnVsbCxcbiAgbWV0YUtleTogbnVsbCxcbiAgcmVwZWF0OiBudWxsLFxuICBsb2NhbGU6IG51bGwsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZSxcbiAgLy8gTGVnYWN5IEludGVyZmFjZVxuICBjaGFyQ29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGNoYXJDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5UHJlc3MgZXZlbnQgYW5kIHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mXG4gICAgLy8gdGhlIGFjdHVhbCBwcmludGFibGUgY2hhcmFjdGVyLlxuXG4gICAgLy8gS2V5UHJlc3MgaXMgZGVwcmVjYXRlZCwgYnV0IGl0cyByZXBsYWNlbWVudCBpcyBub3QgeWV0IGZpbmFsIGFuZCBub3RcbiAgICAvLyBpbXBsZW1lbnRlZCBpbiBhbnkgbWFqb3IgYnJvd3Nlci4gT25seSBLZXlQcmVzcyBoYXMgY2hhckNvZGUuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH0sXG4gIGtleUNvZGU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGBrZXlDb2RlYCBpcyB0aGUgcmVzdWx0IG9mIGEgS2V5RG93bi9VcCBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyBwaHlzaWNhbCBrZXlib2FyZCBrZXkuXG5cbiAgICAvLyBUaGUgYWN0dWFsIG1lYW5pbmcgb2YgdGhlIHZhbHVlIGRlcGVuZHMgb24gdGhlIHVzZXJzJyBrZXlib2FyZCBsYXlvdXRcbiAgICAvLyB3aGljaCBjYW5ub3QgYmUgZGV0ZWN0ZWQuIEFzc3VtaW5nIHRoYXQgaXQgaXMgYSBVUyBrZXlib2FyZCBsYXlvdXRcbiAgICAvLyBwcm92aWRlcyBhIHN1cnByaXNpbmdseSBhY2N1cmF0ZSBtYXBwaW5nIGZvciBVUyBhbmQgRXVyb3BlYW4gdXNlcnMuXG4gICAgLy8gRHVlIHRvIHRoaXMsIGl0IGlzIGxlZnQgdG8gdGhlIHVzZXIgdG8gaW1wbGVtZW50IGF0IHRoaXMgdGltZS5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAgd2hpY2g6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIGB3aGljaGAgaXMgYW4gYWxpYXMgZm9yIGVpdGhlciBga2V5Q29kZWAgb3IgYGNoYXJDb2RlYCBkZXBlbmRpbmcgb24gdGhlXG4gICAgLy8gdHlwZSBvZiB0aGUgZXZlbnQuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgIHJldHVybiBnZXRFdmVudENoYXJDb2RlKGV2ZW50KTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBldmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgICByZXR1cm4gZXZlbnQua2V5Q29kZTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9XG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY0tleWJvYXJkRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY1VJRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cblN5bnRoZXRpY1VJRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0tleWJvYXJkRXZlbnQsIEtleWJvYXJkRXZlbnRJbnRlcmZhY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY0tleWJvYXJkRXZlbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY1VJRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY1VJRXZlbnQnKTtcbnZhciBWaWV3cG9ydE1ldHJpY3MgPSByZXF1aXJlKCcuL1ZpZXdwb3J0TWV0cmljcycpO1xuXG52YXIgZ2V0RXZlbnRNb2RpZmllclN0YXRlID0gcmVxdWlyZSgnLi9nZXRFdmVudE1vZGlmaWVyU3RhdGUnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIE1vdXNlRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG52YXIgTW91c2VFdmVudEludGVyZmFjZSA9IHtcbiAgc2NyZWVuWDogbnVsbCxcbiAgc2NyZWVuWTogbnVsbCxcbiAgY2xpZW50WDogbnVsbCxcbiAgY2xpZW50WTogbnVsbCxcbiAgY3RybEtleTogbnVsbCxcbiAgc2hpZnRLZXk6IG51bGwsXG4gIGFsdEtleTogbnVsbCxcbiAgbWV0YUtleTogbnVsbCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLFxuICBidXR0b246IGZ1bmN0aW9uIChldmVudCkge1xuICAgIC8vIFdlYmtpdCwgRmlyZWZveCwgSUU5K1xuICAgIC8vIHdoaWNoOiAgMSAyIDNcbiAgICAvLyBidXR0b246IDAgMSAyIChzdGFuZGFyZClcbiAgICB2YXIgYnV0dG9uID0gZXZlbnQuYnV0dG9uO1xuICAgIGlmICgnd2hpY2gnIGluIGV2ZW50KSB7XG4gICAgICByZXR1cm4gYnV0dG9uO1xuICAgIH1cbiAgICAvLyBJRTw5XG4gICAgLy8gd2hpY2g6ICB1bmRlZmluZWRcbiAgICAvLyBidXR0b246IDAgMCAwXG4gICAgLy8gYnV0dG9uOiAxIDQgMiAob25tb3VzZXVwKVxuICAgIHJldHVybiBidXR0b24gPT09IDIgPyAyIDogYnV0dG9uID09PSA0ID8gMSA6IDA7XG4gIH0sXG4gIGJ1dHRvbnM6IG51bGwsXG4gIHJlbGF0ZWRUYXJnZXQ6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiBldmVudC5yZWxhdGVkVGFyZ2V0IHx8IChldmVudC5mcm9tRWxlbWVudCA9PT0gZXZlbnQuc3JjRWxlbWVudCA/IGV2ZW50LnRvRWxlbWVudCA6IGV2ZW50LmZyb21FbGVtZW50KTtcbiAgfSxcbiAgLy8gXCJQcm9wcmlldGFyeVwiIEludGVyZmFjZS5cbiAgcGFnZVg6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAncGFnZVgnIGluIGV2ZW50ID8gZXZlbnQucGFnZVggOiBldmVudC5jbGllbnRYICsgVmlld3BvcnRNZXRyaWNzLmN1cnJlbnRTY3JvbGxMZWZ0O1xuICB9LFxuICBwYWdlWTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdwYWdlWScgaW4gZXZlbnQgPyBldmVudC5wYWdlWSA6IGV2ZW50LmNsaWVudFkgKyBWaWV3cG9ydE1ldHJpY3MuY3VycmVudFNjcm9sbFRvcDtcbiAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAZXh0ZW5kcyB7U3ludGhldGljVUlFdmVudH1cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljTW91c2VFdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICByZXR1cm4gU3ludGhldGljVUlFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuU3ludGhldGljVUlFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljTW91c2VFdmVudCwgTW91c2VFdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljTW91c2VFdmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3ludGhldGljVUlFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljVUlFdmVudCcpO1xuXG52YXIgZ2V0RXZlbnRNb2RpZmllclN0YXRlID0gcmVxdWlyZSgnLi9nZXRFdmVudE1vZGlmaWVyU3RhdGUnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIFRvdWNoRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvdG91Y2gtZXZlbnRzL1xuICovXG52YXIgVG91Y2hFdmVudEludGVyZmFjZSA9IHtcbiAgdG91Y2hlczogbnVsbCxcbiAgdGFyZ2V0VG91Y2hlczogbnVsbCxcbiAgY2hhbmdlZFRvdWNoZXM6IG51bGwsXG4gIGFsdEtleTogbnVsbCxcbiAgbWV0YUtleTogbnVsbCxcbiAgY3RybEtleTogbnVsbCxcbiAgc2hpZnRLZXk6IG51bGwsXG4gIGdldE1vZGlmaWVyU3RhdGU6IGdldEV2ZW50TW9kaWZpZXJTdGF0ZVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAZXh0ZW5kcyB7U3ludGhldGljVUlFdmVudH1cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljVG91Y2hFdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICByZXR1cm4gU3ludGhldGljVUlFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuU3ludGhldGljVUlFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljVG91Y2hFdmVudCwgVG91Y2hFdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljVG91Y2hFdmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3ludGhldGljRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0V2ZW50Jyk7XG5cbi8qKlxuICogQGludGVyZmFjZSBFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA5L1dELWNzczMtdHJhbnNpdGlvbnMtMjAwOTAzMjAvI3RyYW5zaXRpb24tZXZlbnRzLVxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVHJhbnNpdGlvbkV2ZW50XG4gKi9cbnZhciBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSB7XG4gIHByb3BlcnR5TmFtZTogbnVsbCxcbiAgZWxhcHNlZFRpbWU6IG51bGwsXG4gIHBzZXVkb0VsZW1lbnQ6IG51bGxcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY0V2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljVHJhbnNpdGlvbkV2ZW50LCBUcmFuc2l0aW9uRXZlbnRJbnRlcmZhY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3ludGhldGljRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0V2ZW50Jyk7XG5cbnZhciBnZXRFdmVudFRhcmdldCA9IHJlcXVpcmUoJy4vZ2V0RXZlbnRUYXJnZXQnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIFVJRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG52YXIgVUlFdmVudEludGVyZmFjZSA9IHtcbiAgdmlldzogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnZpZXcpIHtcbiAgICAgIHJldHVybiBldmVudC52aWV3O1xuICAgIH1cblxuICAgIHZhciB0YXJnZXQgPSBnZXRFdmVudFRhcmdldChldmVudCk7XG4gICAgaWYgKHRhcmdldC53aW5kb3cgPT09IHRhcmdldCkge1xuICAgICAgLy8gdGFyZ2V0IGlzIGEgd2luZG93IG9iamVjdFxuICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICB2YXIgZG9jID0gdGFyZ2V0Lm93bmVyRG9jdW1lbnQ7XG4gICAgLy8gVE9ETzogRmlndXJlIG91dCB3aHkgYG93bmVyRG9jdW1lbnRgIGlzIHNvbWV0aW1lcyB1bmRlZmluZWQgaW4gSUU4LlxuICAgIGlmIChkb2MpIHtcbiAgICAgIHJldHVybiBkb2MuZGVmYXVsdFZpZXcgfHwgZG9jLnBhcmVudFdpbmRvdztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICB9XG4gIH0sXG4gIGRldGFpbDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIGV2ZW50LmRldGFpbCB8fCAwO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNFdmVudH1cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljVUlFdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICByZXR1cm4gU3ludGhldGljRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cblN5bnRoZXRpY0V2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNVSUV2ZW50LCBVSUV2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNVSUV2ZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBTeW50aGV0aWNNb3VzZUV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNNb3VzZUV2ZW50Jyk7XG5cbi8qKlxuICogQGludGVyZmFjZSBXaGVlbEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xudmFyIFdoZWVsRXZlbnRJbnRlcmZhY2UgPSB7XG4gIGRlbHRhWDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdkZWx0YVgnIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFYIDpcbiAgICAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVhgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAocmlnaHQgaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhWCcgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YVggOiAwO1xuICB9LFxuICBkZWx0YVk6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnZGVsdGFZJyBpbiBldmVudCA/IGV2ZW50LmRlbHRhWSA6XG4gICAgLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFZYCBmb3IgV2Via2l0IGFuZCBub3JtYWxpemUgKGRvd24gaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhWScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YVkgOlxuICAgIC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhYCBmb3IgSUU8OSBhbmQgbm9ybWFsaXplIChkb3duIGlzIHBvc2l0aXZlKS5cbiAgICAnd2hlZWxEZWx0YScgaW4gZXZlbnQgPyAtZXZlbnQud2hlZWxEZWx0YSA6IDA7XG4gIH0sXG4gIGRlbHRhWjogbnVsbCxcblxuICAvLyBCcm93c2VycyB3aXRob3V0IFwiZGVsdGFNb2RlXCIgaXMgcmVwb3J0aW5nIGluIHJhdyB3aGVlbCBkZWx0YSB3aGVyZSBvbmVcbiAgLy8gbm90Y2ggb24gdGhlIHNjcm9sbCBpcyBhbHdheXMgKy8tIDEyMCwgcm91Z2hseSBlcXVpdmFsZW50IHRvIHBpeGVscy5cbiAgLy8gQSBnb29kIGFwcHJveGltYXRpb24gb2YgRE9NX0RFTFRBX0xJTkUgKDEpIGlzIDUlIG9mIHZpZXdwb3J0IHNpemUgb3JcbiAgLy8gfjQwIHBpeGVscywgZm9yIERPTV9ERUxUQV9TQ1JFRU4gKDIpIGl0IGlzIDg3LjUlIG9mIHZpZXdwb3J0IHNpemUuXG4gIGRlbHRhTW9kZTogbnVsbFxufTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAZXh0ZW5kcyB7U3ludGhldGljTW91c2VFdmVudH1cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljV2hlZWxFdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICByZXR1cm4gU3ludGhldGljTW91c2VFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuU3ludGhldGljTW91c2VFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljV2hlZWxFdmVudCwgV2hlZWxFdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljV2hlZWxFdmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxudmFyIE9CU0VSVkVEX0VSUk9SID0ge307XG5cbi8qKlxuICogYFRyYW5zYWN0aW9uYCBjcmVhdGVzIGEgYmxhY2sgYm94IHRoYXQgaXMgYWJsZSB0byB3cmFwIGFueSBtZXRob2Qgc3VjaCB0aGF0XG4gKiBjZXJ0YWluIGludmFyaWFudHMgYXJlIG1haW50YWluZWQgYmVmb3JlIGFuZCBhZnRlciB0aGUgbWV0aG9kIGlzIGludm9rZWRcbiAqIChFdmVuIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hpbGUgaW52b2tpbmcgdGhlIHdyYXBwZWQgbWV0aG9kKS4gV2hvZXZlclxuICogaW5zdGFudGlhdGVzIGEgdHJhbnNhY3Rpb24gY2FuIHByb3ZpZGUgZW5mb3JjZXJzIG9mIHRoZSBpbnZhcmlhbnRzIGF0XG4gKiBjcmVhdGlvbiB0aW1lLiBUaGUgYFRyYW5zYWN0aW9uYCBjbGFzcyBpdHNlbGYgd2lsbCBzdXBwbHkgb25lIGFkZGl0aW9uYWxcbiAqIGF1dG9tYXRpYyBpbnZhcmlhbnQgZm9yIHlvdSAtIHRoZSBpbnZhcmlhbnQgdGhhdCBhbnkgdHJhbnNhY3Rpb24gaW5zdGFuY2VcbiAqIHNob3VsZCBub3QgYmUgcnVuIHdoaWxlIGl0IGlzIGFscmVhZHkgYmVpbmcgcnVuLiBZb3Ugd291bGQgdHlwaWNhbGx5IGNyZWF0ZSBhXG4gKiBzaW5nbGUgaW5zdGFuY2Ugb2YgYSBgVHJhbnNhY3Rpb25gIGZvciByZXVzZSBtdWx0aXBsZSB0aW1lcywgdGhhdCBwb3RlbnRpYWxseVxuICogaXMgdXNlZCB0byB3cmFwIHNldmVyYWwgZGlmZmVyZW50IG1ldGhvZHMuIFdyYXBwZXJzIGFyZSBleHRyZW1lbHkgc2ltcGxlIC1cbiAqIHRoZXkgb25seSByZXF1aXJlIGltcGxlbWVudGluZyB0d28gbWV0aG9kcy5cbiAqXG4gKiA8cHJlPlxuICogICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXJzIChpbmplY3RlZCBhdCBjcmVhdGlvbiB0aW1lKVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgICAgICAgICtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tK1xuICogICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHYgICAgICAgIHwgICAgICAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICB8ICAgICAgKy0tLS0tLS0tLS0tLS0tLSsgICB8ICAgICAgICAgICAgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgfCAgICstLXwgICAgd3JhcHBlcjEgICB8LS0tfC0tLS0rICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgIHwgICB8ICArLS0tLS0tLS0tLS0tLS0tKyAgIHYgICAgfCAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICB8ICAgfCAgICAgICAgICArLS0tLS0tLS0tLS0tLSsgIHwgICAgICAgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgfCAgIHwgICAgICstLS0tfCAgIHdyYXBwZXIyICB8LS0tLS0tLS0rICAgfFxuICogICAgICAgICAgICAgICAgICAgIHwgICB8ICAgICB8ICAgICstLS0tLS0tLS0tLS0tKyAgfCAgICAgfCAgIHxcbiAqICAgICAgICAgICAgICAgICAgICB8ICAgfCAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwgICAgIHwgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgfCAgIHYgICAgIHYgICAgICAgICAgICAgICAgICAgICB2ICAgICB2ICAgfCB3cmFwcGVyXG4gKiAgICAgICAgICAgICAgICAgICAgfCArLS0tKyArLS0tKyAgICstLS0tLS0tLS0rICAgKy0tLSsgKy0tLSsgfCBpbnZhcmlhbnRzXG4gKiBwZXJmb3JtKGFueU1ldGhvZCkgfCB8ICAgfCB8ICAgfCAgIHwgICAgICAgICB8ICAgfCAgIHwgfCAgIHwgfCBtYWludGFpbmVkXG4gKiArLS0tLS0tLS0tLS0tLS0tLS0+fC18LS0tfC18LS0tfC0tPnxhbnlNZXRob2R8LS0tfC0tLXwtfC0tLXwtfC0tLS0tLS0tPlxuICogICAgICAgICAgICAgICAgICAgIHwgfCAgIHwgfCAgIHwgICB8ICAgICAgICAgfCAgIHwgICB8IHwgICB8IHxcbiAqICAgICAgICAgICAgICAgICAgICB8IHwgICB8IHwgICB8ICAgfCAgICAgICAgIHwgICB8ICAgfCB8ICAgfCB8XG4gKiAgICAgICAgICAgICAgICAgICAgfCB8ICAgfCB8ICAgfCAgIHwgICAgICAgICB8ICAgfCAgIHwgfCAgIHwgfFxuICogICAgICAgICAgICAgICAgICAgIHwgKy0tLSsgKy0tLSsgICArLS0tLS0tLS0tKyAgICstLS0rICstLS0rIHxcbiAqICAgICAgICAgICAgICAgICAgICB8ICBpbml0aWFsaXplICAgICAgICAgICAgICAgICAgICBjbG9zZSAgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICogPC9wcmU+XG4gKlxuICogVXNlIGNhc2VzOlxuICogLSBQcmVzZXJ2aW5nIHRoZSBpbnB1dCBzZWxlY3Rpb24gcmFuZ2VzIGJlZm9yZS9hZnRlciByZWNvbmNpbGlhdGlvbi5cbiAqICAgUmVzdG9yaW5nIHNlbGVjdGlvbiBldmVuIGluIHRoZSBldmVudCBvZiBhbiB1bmV4cGVjdGVkIGVycm9yLlxuICogLSBEZWFjdGl2YXRpbmcgZXZlbnRzIHdoaWxlIHJlYXJyYW5naW5nIHRoZSBET00sIHByZXZlbnRpbmcgYmx1cnMvZm9jdXNlcyxcbiAqICAgd2hpbGUgZ3VhcmFudGVlaW5nIHRoYXQgYWZ0ZXJ3YXJkcywgdGhlIGV2ZW50IHN5c3RlbSBpcyByZWFjdGl2YXRlZC5cbiAqIC0gRmx1c2hpbmcgYSBxdWV1ZSBvZiBjb2xsZWN0ZWQgRE9NIG11dGF0aW9ucyB0byB0aGUgbWFpbiBVSSB0aHJlYWQgYWZ0ZXIgYVxuICogICByZWNvbmNpbGlhdGlvbiB0YWtlcyBwbGFjZSBpbiBhIHdvcmtlciB0aHJlYWQuXG4gKiAtIEludm9raW5nIGFueSBjb2xsZWN0ZWQgYGNvbXBvbmVudERpZFVwZGF0ZWAgY2FsbGJhY2tzIGFmdGVyIHJlbmRlcmluZyBuZXdcbiAqICAgY29udGVudC5cbiAqIC0gKEZ1dHVyZSB1c2UgY2FzZSk6IFdyYXBwaW5nIHBhcnRpY3VsYXIgZmx1c2hlcyBvZiB0aGUgYFJlYWN0V29ya2VyYCBxdWV1ZVxuICogICB0byBwcmVzZXJ2ZSB0aGUgYHNjcm9sbFRvcGAgKGFuIGF1dG9tYXRpYyBzY3JvbGwgYXdhcmUgRE9NKS5cbiAqIC0gKEZ1dHVyZSB1c2UgY2FzZSk6IExheW91dCBjYWxjdWxhdGlvbnMgYmVmb3JlIGFuZCBhZnRlciBET00gdXBkYXRlcy5cbiAqXG4gKiBUcmFuc2FjdGlvbmFsIHBsdWdpbiBBUEk6XG4gKiAtIEEgbW9kdWxlIHRoYXQgaGFzIGFuIGBpbml0aWFsaXplYCBtZXRob2QgdGhhdCByZXR1cm5zIGFueSBwcmVjb21wdXRhdGlvbi5cbiAqIC0gYW5kIGEgYGNsb3NlYCBtZXRob2QgdGhhdCBhY2NlcHRzIHRoZSBwcmVjb21wdXRhdGlvbi4gYGNsb3NlYCBpcyBpbnZva2VkXG4gKiAgIHdoZW4gdGhlIHdyYXBwZWQgcHJvY2VzcyBpcyBjb21wbGV0ZWQsIG9yIGhhcyBmYWlsZWQuXG4gKlxuICogQHBhcmFtIHtBcnJheTxUcmFuc2FjdGlvbmFsV3JhcHBlcj59IHRyYW5zYWN0aW9uV3JhcHBlciBXcmFwcGVyIG1vZHVsZXNcbiAqIHRoYXQgaW1wbGVtZW50IGBpbml0aWFsaXplYCBhbmQgYGNsb3NlYC5cbiAqIEByZXR1cm4ge1RyYW5zYWN0aW9ufSBTaW5nbGUgdHJhbnNhY3Rpb24gZm9yIHJldXNlIGluIHRocmVhZC5cbiAqXG4gKiBAY2xhc3MgVHJhbnNhY3Rpb25cbiAqL1xudmFyIFRyYW5zYWN0aW9uSW1wbCA9IHtcbiAgLyoqXG4gICAqIFNldHMgdXAgdGhpcyBpbnN0YW5jZSBzbyB0aGF0IGl0IGlzIHByZXBhcmVkIGZvciBjb2xsZWN0aW5nIG1ldHJpY3MuIERvZXNcbiAgICogc28gc3VjaCB0aGF0IHRoaXMgc2V0dXAgbWV0aG9kIG1heSBiZSB1c2VkIG9uIGFuIGluc3RhbmNlIHRoYXQgaXMgYWxyZWFkeVxuICAgKiBpbml0aWFsaXplZCwgaW4gYSB3YXkgdGhhdCBkb2VzIG5vdCBjb25zdW1lIGFkZGl0aW9uYWwgbWVtb3J5IHVwb24gcmV1c2UuXG4gICAqIFRoYXQgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgZGVjaWRlIHRvIG1ha2UgeW91ciBzdWJjbGFzcyBvZiB0aGlzIG1peGluIGFcbiAgICogXCJQb29sZWRDbGFzc1wiLlxuICAgKi9cbiAgcmVpbml0aWFsaXplVHJhbnNhY3Rpb246IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uV3JhcHBlcnMgPSB0aGlzLmdldFRyYW5zYWN0aW9uV3JhcHBlcnMoKTtcbiAgICBpZiAodGhpcy53cmFwcGVySW5pdERhdGEpIHtcbiAgICAgIHRoaXMud3JhcHBlckluaXREYXRhLmxlbmd0aCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud3JhcHBlckluaXREYXRhID0gW107XG4gICAgfVxuICAgIHRoaXMuX2lzSW5UcmFuc2FjdGlvbiA9IGZhbHNlO1xuICB9LFxuXG4gIF9pc0luVHJhbnNhY3Rpb246IGZhbHNlLFxuXG4gIC8qKlxuICAgKiBAYWJzdHJhY3RcbiAgICogQHJldHVybiB7QXJyYXk8VHJhbnNhY3Rpb25XcmFwcGVyPn0gQXJyYXkgb2YgdHJhbnNhY3Rpb24gd3JhcHBlcnMuXG4gICAqL1xuICBnZXRUcmFuc2FjdGlvbldyYXBwZXJzOiBudWxsLFxuXG4gIGlzSW5UcmFuc2FjdGlvbjogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAhIXRoaXMuX2lzSW5UcmFuc2FjdGlvbjtcbiAgfSxcblxuICAvKipcbiAgICogRXhlY3V0ZXMgdGhlIGZ1bmN0aW9uIHdpdGhpbiBhIHNhZmV0eSB3aW5kb3cuIFVzZSB0aGlzIGZvciB0aGUgdG9wIGxldmVsXG4gICAqIG1ldGhvZHMgdGhhdCByZXN1bHQgaW4gbGFyZ2UgYW1vdW50cyBvZiBjb21wdXRhdGlvbi9tdXRhdGlvbnMgdGhhdCB3b3VsZFxuICAgKiBuZWVkIHRvIGJlIHNhZmV0eSBjaGVja2VkLiBUaGUgb3B0aW9uYWwgYXJndW1lbnRzIGhlbHBzIHByZXZlbnQgdGhlIG5lZWRcbiAgICogdG8gYmluZCBpbiBtYW55IGNhc2VzLlxuICAgKlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBtZXRob2QgTWVtYmVyIG9mIHNjb3BlIHRvIGNhbGwuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzY29wZSBTY29wZSB0byBpbnZva2UgZnJvbS5cbiAgICogQHBhcmFtIHtPYmplY3Q/PX0gYSBBcmd1bWVudCB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gICAqIEBwYXJhbSB7T2JqZWN0Pz19IGIgQXJndW1lbnQgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICAgKiBAcGFyYW0ge09iamVjdD89fSBjIEFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAgICogQHBhcmFtIHtPYmplY3Q/PX0gZCBBcmd1bWVudCB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gICAqIEBwYXJhbSB7T2JqZWN0Pz19IGUgQXJndW1lbnQgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICAgKiBAcGFyYW0ge09iamVjdD89fSBmIEFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAgICpcbiAgICogQHJldHVybiB7Kn0gUmV0dXJuIHZhbHVlIGZyb20gYG1ldGhvZGAuXG4gICAqL1xuICBwZXJmb3JtOiBmdW5jdGlvbiAobWV0aG9kLCBzY29wZSwgYSwgYiwgYywgZCwgZSwgZikge1xuICAgICEhdGhpcy5pc0luVHJhbnNhY3Rpb24oKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVHJhbnNhY3Rpb24ucGVyZm9ybSguLi4pOiBDYW5ub3QgaW5pdGlhbGl6ZSBhIHRyYW5zYWN0aW9uIHdoZW4gdGhlcmUgaXMgYWxyZWFkeSBhbiBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbi4nKSA6IF9wcm9kSW52YXJpYW50KCcyNycpIDogdm9pZCAwO1xuICAgIHZhciBlcnJvclRocm93bjtcbiAgICB2YXIgcmV0O1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9pc0luVHJhbnNhY3Rpb24gPSB0cnVlO1xuICAgICAgLy8gQ2F0Y2hpbmcgZXJyb3JzIG1ha2VzIGRlYnVnZ2luZyBtb3JlIGRpZmZpY3VsdCwgc28gd2Ugc3RhcnQgd2l0aFxuICAgICAgLy8gZXJyb3JUaHJvd24gc2V0IHRvIHRydWUgYmVmb3JlIHNldHRpbmcgaXQgdG8gZmFsc2UgYWZ0ZXIgY2FsbGluZ1xuICAgICAgLy8gY2xvc2UgLS0gaWYgaXQncyBzdGlsbCBzZXQgdG8gdHJ1ZSBpbiB0aGUgZmluYWxseSBibG9jaywgaXQgbWVhbnNcbiAgICAgIC8vIG9uZSBvZiB0aGVzZSBjYWxscyB0aHJldy5cbiAgICAgIGVycm9yVGhyb3duID0gdHJ1ZTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUFsbCgwKTtcbiAgICAgIHJldCA9IG1ldGhvZC5jYWxsKHNjb3BlLCBhLCBiLCBjLCBkLCBlLCBmKTtcbiAgICAgIGVycm9yVGhyb3duID0gZmFsc2U7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChlcnJvclRocm93bikge1xuICAgICAgICAgIC8vIElmIGBtZXRob2RgIHRocm93cywgcHJlZmVyIHRvIHNob3cgdGhhdCBzdGFjayB0cmFjZSBvdmVyIGFueSB0aHJvd25cbiAgICAgICAgICAvLyBieSBpbnZva2luZyBgY2xvc2VBbGxgLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlQWxsKDApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge31cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTaW5jZSBgbWV0aG9kYCBkaWRuJ3QgdGhyb3csIHdlIGRvbid0IHdhbnQgdG8gc2lsZW5jZSB0aGUgZXhjZXB0aW9uXG4gICAgICAgICAgLy8gaGVyZS5cbiAgICAgICAgICB0aGlzLmNsb3NlQWxsKDApO1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLl9pc0luVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcblxuICBpbml0aWFsaXplQWxsOiBmdW5jdGlvbiAoc3RhcnRJbmRleCkge1xuICAgIHZhciB0cmFuc2FjdGlvbldyYXBwZXJzID0gdGhpcy50cmFuc2FjdGlvbldyYXBwZXJzO1xuICAgIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDwgdHJhbnNhY3Rpb25XcmFwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHdyYXBwZXIgPSB0cmFuc2FjdGlvbldyYXBwZXJzW2ldO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQ2F0Y2hpbmcgZXJyb3JzIG1ha2VzIGRlYnVnZ2luZyBtb3JlIGRpZmZpY3VsdCwgc28gd2Ugc3RhcnQgd2l0aCB0aGVcbiAgICAgICAgLy8gT0JTRVJWRURfRVJST1Igc3RhdGUgYmVmb3JlIG92ZXJ3cml0aW5nIGl0IHdpdGggdGhlIHJlYWwgcmV0dXJuIHZhbHVlXG4gICAgICAgIC8vIG9mIGluaXRpYWxpemUgLS0gaWYgaXQncyBzdGlsbCBzZXQgdG8gT0JTRVJWRURfRVJST1IgaW4gdGhlIGZpbmFsbHlcbiAgICAgICAgLy8gYmxvY2ssIGl0IG1lYW5zIHdyYXBwZXIuaW5pdGlhbGl6ZSB0aHJldy5cbiAgICAgICAgdGhpcy53cmFwcGVySW5pdERhdGFbaV0gPSBPQlNFUlZFRF9FUlJPUjtcbiAgICAgICAgdGhpcy53cmFwcGVySW5pdERhdGFbaV0gPSB3cmFwcGVyLmluaXRpYWxpemUgPyB3cmFwcGVyLmluaXRpYWxpemUuY2FsbCh0aGlzKSA6IG51bGw7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAodGhpcy53cmFwcGVySW5pdERhdGFbaV0gPT09IE9CU0VSVkVEX0VSUk9SKSB7XG4gICAgICAgICAgLy8gVGhlIGluaXRpYWxpemVyIGZvciB3cmFwcGVyIGkgdGhyZXcgYW4gZXJyb3I7IGluaXRpYWxpemUgdGhlXG4gICAgICAgICAgLy8gcmVtYWluaW5nIHdyYXBwZXJzIGJ1dCBzaWxlbmNlIGFueSBleGNlcHRpb25zIGZyb20gdGhlbSB0byBlbnN1cmVcbiAgICAgICAgICAvLyB0aGF0IHRoZSBmaXJzdCBlcnJvciBpcyB0aGUgb25lIHRvIGJ1YmJsZSB1cC5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplQWxsKGkgKyAxKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEludm9rZXMgZWFjaCBvZiBgdGhpcy50cmFuc2FjdGlvbldyYXBwZXJzLmNsb3NlW2ldYCBmdW5jdGlvbnMsIHBhc3NpbmcgaW50b1xuICAgKiB0aGVtIHRoZSByZXNwZWN0aXZlIHJldHVybiB2YWx1ZXMgb2YgYHRoaXMudHJhbnNhY3Rpb25XcmFwcGVycy5pbml0W2ldYFxuICAgKiAoYGNsb3NlYHJzIHRoYXQgY29ycmVzcG9uZCB0byBpbml0aWFsaXplcnMgdGhhdCBmYWlsZWQgd2lsbCBub3QgYmVcbiAgICogaW52b2tlZCkuXG4gICAqL1xuICBjbG9zZUFsbDogZnVuY3Rpb24gKHN0YXJ0SW5kZXgpIHtcbiAgICAhdGhpcy5pc0luVHJhbnNhY3Rpb24oKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVHJhbnNhY3Rpb24uY2xvc2VBbGwoKTogQ2Fubm90IGNsb3NlIHRyYW5zYWN0aW9uIHdoZW4gbm9uZSBhcmUgb3Blbi4nKSA6IF9wcm9kSW52YXJpYW50KCcyOCcpIDogdm9pZCAwO1xuICAgIHZhciB0cmFuc2FjdGlvbldyYXBwZXJzID0gdGhpcy50cmFuc2FjdGlvbldyYXBwZXJzO1xuICAgIGZvciAodmFyIGkgPSBzdGFydEluZGV4OyBpIDwgdHJhbnNhY3Rpb25XcmFwcGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHdyYXBwZXIgPSB0cmFuc2FjdGlvbldyYXBwZXJzW2ldO1xuICAgICAgdmFyIGluaXREYXRhID0gdGhpcy53cmFwcGVySW5pdERhdGFbaV07XG4gICAgICB2YXIgZXJyb3JUaHJvd247XG4gICAgICB0cnkge1xuICAgICAgICAvLyBDYXRjaGluZyBlcnJvcnMgbWFrZXMgZGVidWdnaW5nIG1vcmUgZGlmZmljdWx0LCBzbyB3ZSBzdGFydCB3aXRoXG4gICAgICAgIC8vIGVycm9yVGhyb3duIHNldCB0byB0cnVlIGJlZm9yZSBzZXR0aW5nIGl0IHRvIGZhbHNlIGFmdGVyIGNhbGxpbmdcbiAgICAgICAgLy8gY2xvc2UgLS0gaWYgaXQncyBzdGlsbCBzZXQgdG8gdHJ1ZSBpbiB0aGUgZmluYWxseSBibG9jaywgaXQgbWVhbnNcbiAgICAgICAgLy8gd3JhcHBlci5jbG9zZSB0aHJldy5cbiAgICAgICAgZXJyb3JUaHJvd24gPSB0cnVlO1xuICAgICAgICBpZiAoaW5pdERhdGEgIT09IE9CU0VSVkVEX0VSUk9SICYmIHdyYXBwZXIuY2xvc2UpIHtcbiAgICAgICAgICB3cmFwcGVyLmNsb3NlLmNhbGwodGhpcywgaW5pdERhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVycm9yVGhyb3duID0gZmFsc2U7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoZXJyb3JUaHJvd24pIHtcbiAgICAgICAgICAvLyBUaGUgY2xvc2VyIGZvciB3cmFwcGVyIGkgdGhyZXcgYW4gZXJyb3I7IGNsb3NlIHRoZSByZW1haW5pbmdcbiAgICAgICAgICAvLyB3cmFwcGVycyBidXQgc2lsZW5jZSBhbnkgZXhjZXB0aW9ucyBmcm9tIHRoZW0gdG8gZW5zdXJlIHRoYXQgdGhlXG4gICAgICAgICAgLy8gZmlyc3QgZXJyb3IgaXMgdGhlIG9uZSB0byBidWJibGUgdXAuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VBbGwoaSArIDEpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy53cmFwcGVySW5pdERhdGEubGVuZ3RoID0gMDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2FjdGlvbkltcGw7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFZpZXdwb3J0TWV0cmljcyA9IHtcblxuICBjdXJyZW50U2Nyb2xsTGVmdDogMCxcblxuICBjdXJyZW50U2Nyb2xsVG9wOiAwLFxuXG4gIHJlZnJlc2hTY3JvbGxWYWx1ZXM6IGZ1bmN0aW9uIChzY3JvbGxQb3NpdGlvbikge1xuICAgIFZpZXdwb3J0TWV0cmljcy5jdXJyZW50U2Nyb2xsTGVmdCA9IHNjcm9sbFBvc2l0aW9uLng7XG4gICAgVmlld3BvcnRNZXRyaWNzLmN1cnJlbnRTY3JvbGxUb3AgPSBzY3JvbGxQb3NpdGlvbi55O1xuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gVmlld3BvcnRNZXRyaWNzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIEFjY3VtdWxhdGVzIGl0ZW1zIHRoYXQgbXVzdCBub3QgYmUgbnVsbCBvciB1bmRlZmluZWQgaW50byB0aGUgZmlyc3Qgb25lLiBUaGlzXG4gKiBpcyB1c2VkIHRvIGNvbnNlcnZlIG1lbW9yeSBieSBhdm9pZGluZyBhcnJheSBhbGxvY2F0aW9ucywgYW5kIHRodXMgc2FjcmlmaWNlc1xuICogQVBJIGNsZWFubmVzcy4gU2luY2UgYGN1cnJlbnRgIGNhbiBiZSBudWxsIGJlZm9yZSBiZWluZyBwYXNzZWQgaW4gYW5kIG5vdFxuICogbnVsbCBhZnRlciB0aGlzIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdG8gYXNzaWduIGl0IGJhY2sgdG8gYGN1cnJlbnRgOlxuICpcbiAqIGBhID0gYWNjdW11bGF0ZUludG8oYSwgYik7YFxuICpcbiAqIFRoaXMgQVBJIHNob3VsZCBiZSBzcGFyaW5nbHkgdXNlZC4gVHJ5IGBhY2N1bXVsYXRlYCBmb3Igc29tZXRoaW5nIGNsZWFuZXIuXG4gKlxuICogQHJldHVybiB7KnxhcnJheTwqPn0gQW4gYWNjdW11bGF0aW9uIG9mIGl0ZW1zLlxuICovXG5cbmZ1bmN0aW9uIGFjY3VtdWxhdGVJbnRvKGN1cnJlbnQsIG5leHQpIHtcbiAgIShuZXh0ICE9IG51bGwpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdhY2N1bXVsYXRlSW50byguLi4pOiBBY2N1bXVsYXRlZCBpdGVtcyBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4nKSA6IF9wcm9kSW52YXJpYW50KCczMCcpIDogdm9pZCAwO1xuXG4gIGlmIChjdXJyZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gbmV4dDtcbiAgfVxuXG4gIC8vIEJvdGggYXJlIG5vdCBlbXB0eS4gV2FybmluZzogTmV2ZXIgY2FsbCB4LmNvbmNhdCh5KSB3aGVuIHlvdSBhcmUgbm90XG4gIC8vIGNlcnRhaW4gdGhhdCB4IGlzIGFuIEFycmF5ICh4IGNvdWxkIGJlIGEgc3RyaW5nIHdpdGggY29uY2F0IG1ldGhvZCkuXG4gIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmV4dCkpIHtcbiAgICAgIGN1cnJlbnQucHVzaC5hcHBseShjdXJyZW50LCBuZXh0KTtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgICBjdXJyZW50LnB1c2gobmV4dCk7XG4gICAgcmV0dXJuIGN1cnJlbnQ7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShuZXh0KSkge1xuICAgIC8vIEEgYml0IHRvbyBkYW5nZXJvdXMgdG8gbXV0YXRlIGBuZXh0YC5cbiAgICByZXR1cm4gW2N1cnJlbnRdLmNvbmNhdChuZXh0KTtcbiAgfVxuXG4gIHJldHVybiBbY3VycmVudCwgbmV4dF07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYWNjdW11bGF0ZUludG87IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgTU9EID0gNjU1MjE7XG5cbi8vIGFkbGVyMzIgaXMgbm90IGNyeXB0b2dyYXBoaWNhbGx5IHN0cm9uZywgYW5kIGlzIG9ubHkgdXNlZCB0byBzYW5pdHkgY2hlY2sgdGhhdFxuLy8gbWFya3VwIGdlbmVyYXRlZCBvbiB0aGUgc2VydmVyIG1hdGNoZXMgdGhlIG1hcmt1cCBnZW5lcmF0ZWQgb24gdGhlIGNsaWVudC5cbi8vIFRoaXMgaW1wbGVtZW50YXRpb24gKGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgU2hlZXRKUyB2ZXJzaW9uKSBoYXMgYmVlbiBvcHRpbWl6ZWRcbi8vIGZvciBvdXIgdXNlIGNhc2UsIGF0IHRoZSBleHBlbnNlIG9mIGNvbmZvcm1pbmcgdG8gdGhlIGFkbGVyMzIgc3BlY2lmaWNhdGlvblxuLy8gZm9yIG5vbi1hc2NpaSBpbnB1dHMuXG5mdW5jdGlvbiBhZGxlcjMyKGRhdGEpIHtcbiAgdmFyIGEgPSAxO1xuICB2YXIgYiA9IDA7XG4gIHZhciBpID0gMDtcbiAgdmFyIGwgPSBkYXRhLmxlbmd0aDtcbiAgdmFyIG0gPSBsICYgfjB4MztcbiAgd2hpbGUgKGkgPCBtKSB7XG4gICAgdmFyIG4gPSBNYXRoLm1pbihpICsgNDA5NiwgbSk7XG4gICAgZm9yICg7IGkgPCBuOyBpICs9IDQpIHtcbiAgICAgIGIgKz0gKGEgKz0gZGF0YS5jaGFyQ29kZUF0KGkpKSArIChhICs9IGRhdGEuY2hhckNvZGVBdChpICsgMSkpICsgKGEgKz0gZGF0YS5jaGFyQ29kZUF0KGkgKyAyKSkgKyAoYSArPSBkYXRhLmNoYXJDb2RlQXQoaSArIDMpKTtcbiAgICB9XG4gICAgYSAlPSBNT0Q7XG4gICAgYiAlPSBNT0Q7XG4gIH1cbiAgZm9yICg7IGkgPCBsOyBpKyspIHtcbiAgICBiICs9IGEgKz0gZGF0YS5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIGEgJT0gTU9EO1xuICBiICU9IE1PRDtcbiAgcmV0dXJuIGEgfCBiIDw8IDE2O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFkbGVyMzI7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzID0gcmVxdWlyZSgnLi9SZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcycpO1xudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2s7XG5cbmlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnYgJiYgXCJkZXZlbG9wbWVudFwiID09PSAndGVzdCcpIHtcbiAgLy8gVGVtcG9yYXJ5IGhhY2suXG4gIC8vIElubGluZSByZXF1aXJlcyBkb24ndCB3b3JrIHdlbGwgd2l0aCBKZXN0OlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNDBcbiAgLy8gUmVtb3ZlIHRoZSBpbmxpbmUgcmVxdWlyZXMgd2hlbiB3ZSBkb24ndCBuZWVkIHRoZW0gYW55bW9yZTpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzE3OFxuICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbn1cblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSB2YWx1ZXMgbWF0Y2ggd2l0aCB0aGUgdHlwZSBzcGVjcy5cbiAqIEVycm9yIG1lc3NhZ2VzIGFyZSBtZW1vcml6ZWQgYW5kIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0eXBlU3BlY3MgTWFwIG9mIG5hbWUgdG8gYSBSZWFjdFByb3BUeXBlXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIFJ1bnRpbWUgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSB0eXBlLWNoZWNrZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBlLmcuIFwicHJvcFwiLCBcImNvbnRleHRcIiwgXCJjaGlsZCBjb250ZXh0XCJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wb25lbnROYW1lIE5hbWUgb2YgdGhlIGNvbXBvbmVudCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gez9vYmplY3R9IGVsZW1lbnQgVGhlIFJlYWN0IGVsZW1lbnQgdGhhdCBpcyBiZWluZyB0eXBlLWNoZWNrZWRcbiAqIEBwYXJhbSB7P251bWJlcn0gZGVidWdJRCBUaGUgUmVhY3QgY29tcG9uZW50IGluc3RhbmNlIHRoYXQgaXMgYmVpbmcgdHlwZS1jaGVja2VkXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja1JlYWN0VHlwZVNwZWModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50LCBkZWJ1Z0lEKSB7XG4gIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICBpZiAodHlwZVNwZWNzLmhhc093blByb3BlcnR5KHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgIHZhciBlcnJvcjtcbiAgICAgIC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAhKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSA9PT0gJ2Z1bmN0aW9uJykgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzOiAlcyB0eXBlIGAlc2AgaXMgaW52YWxpZDsgaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gUmVhY3QuUHJvcFR5cGVzLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dLCB0eXBlU3BlY05hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzg0JywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sIHR5cGVTcGVjTmFtZSkgOiB2b2lkIDA7XG4gICAgICAgIGVycm9yID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgfVxuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFlcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIEVycm9yLCAnJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yKSA6IHZvaWQgMDtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IubWVzc2FnZV0gPSB0cnVlO1xuXG4gICAgICAgIHZhciBjb21wb25lbnRTdGFja0luZm8gPSAnJztcblxuICAgICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBpZiAoIVJlYWN0Q29tcG9uZW50VHJlZUhvb2spIHtcbiAgICAgICAgICAgIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDb21wb25lbnRUcmVlSG9vaycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGVidWdJRCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcG9uZW50U3RhY2tJbmZvID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YWNrSW5mbyA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0Q3VycmVudFN0YWNrQWRkZW5kdW0oZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnRmFpbGVkICVzIHR5cGU6ICVzJXMnLCBsb2NhdGlvbiwgZXJyb3IubWVzc2FnZSwgY29tcG9uZW50U3RhY2tJbmZvKSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjaGVja1JlYWN0VHlwZVNwZWM7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbi8qIGdsb2JhbHMgTVNBcHAgKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENyZWF0ZSBhIGZ1bmN0aW9uIHdoaWNoIGhhcyAndW5zYWZlJyBwcml2aWxlZ2VzIChyZXF1aXJlZCBieSB3aW5kb3dzOCBhcHBzKVxuICovXG5cbnZhciBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgaWYgKHR5cGVvZiBNU0FwcCAhPT0gJ3VuZGVmaW5lZCcgJiYgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZzAsIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICAgIE1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmdW5jO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb247IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIENTU1Byb3BlcnR5ID0gcmVxdWlyZSgnLi9DU1NQcm9wZXJ0eScpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBpc1VuaXRsZXNzTnVtYmVyID0gQ1NTUHJvcGVydHkuaXNVbml0bGVzc051bWJlcjtcbnZhciBzdHlsZVdhcm5pbmdzID0ge307XG5cbi8qKlxuICogQ29udmVydCBhIHZhbHVlIGludG8gdGhlIHByb3BlciBjc3Mgd3JpdGFibGUgdmFsdWUuIFRoZSBzdHlsZSBuYW1lIGBuYW1lYFxuICogc2hvdWxkIGJlIGxvZ2ljYWwgKG5vIGh5cGhlbnMpLCBhcyBzcGVjaWZpZWRcbiAqIGluIGBDU1NQcm9wZXJ0eS5pc1VuaXRsZXNzTnVtYmVyYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBDU1MgcHJvcGVydHkgbmFtZSBzdWNoIGFzIGB0b3BNYXJnaW5gLlxuICogQHBhcmFtIHsqfSB2YWx1ZSBDU1MgcHJvcGVydHkgdmFsdWUgc3VjaCBhcyBgMTBweGAuXG4gKiBAcGFyYW0ge1JlYWN0RE9NQ29tcG9uZW50fSBjb21wb25lbnRcbiAqIEByZXR1cm4ge3N0cmluZ30gTm9ybWFsaXplZCBzdHlsZSB2YWx1ZSB3aXRoIGRpbWVuc2lvbnMgYXBwbGllZC5cbiAqL1xuZnVuY3Rpb24gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShuYW1lLCB2YWx1ZSwgY29tcG9uZW50KSB7XG4gIC8vIE5vdGUgdGhhdCB3ZSd2ZSByZW1vdmVkIGVzY2FwZVRleHRGb3JCcm93c2VyKCkgY2FsbHMgaGVyZSBzaW5jZSB0aGVcbiAgLy8gd2hvbGUgc3RyaW5nIHdpbGwgYmUgZXNjYXBlZCB3aGVuIHRoZSBhdHRyaWJ1dGUgaXMgaW5qZWN0ZWQgaW50b1xuICAvLyB0aGUgbWFya3VwLiBJZiB5b3UgcHJvdmlkZSB1bnNhZmUgdXNlciBkYXRhIGhlcmUgdGhleSBjYW4gaW5qZWN0XG4gIC8vIGFyYml0cmFyeSBDU1Mgd2hpY2ggbWF5IGJlIHByb2JsZW1hdGljIChJIGNvdWxkbid0IHJlcHJvIHRoaXMpOlxuICAvLyBodHRwczovL3d3dy5vd2FzcC5vcmcvaW5kZXgucGhwL1hTU19GaWx0ZXJfRXZhc2lvbl9DaGVhdF9TaGVldFxuICAvLyBodHRwOi8vd3d3LnRoZXNwYW5uZXIuY28udWsvMjAwNy8xMS8yNi91bHRpbWF0ZS14c3MtY3NzLWluamVjdGlvbi9cbiAgLy8gVGhpcyBpcyBub3QgYW4gWFNTIGhvbGUgYnV0IGluc3RlYWQgYSBwb3RlbnRpYWwgQ1NTIGluamVjdGlvbiBpc3N1ZVxuICAvLyB3aGljaCBoYXMgbGVhZCB0byBhIGdyZWF0ZXIgZGlzY3Vzc2lvbiBhYm91dCBob3cgd2UncmUgZ29pbmcgdG9cbiAgLy8gdHJ1c3QgVVJMcyBtb3ZpbmcgZm9yd2FyZC4gU2VlICMyMTE1OTAxXG5cbiAgdmFyIGlzRW1wdHkgPSB2YWx1ZSA9PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nIHx8IHZhbHVlID09PSAnJztcbiAgaWYgKGlzRW1wdHkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICB2YXIgaXNOb25OdW1lcmljID0gaXNOYU4odmFsdWUpO1xuICBpZiAoaXNOb25OdW1lcmljIHx8IHZhbHVlID09PSAwIHx8IGlzVW5pdGxlc3NOdW1iZXIuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgaXNVbml0bGVzc051bWJlcltuYW1lXSkge1xuICAgIHJldHVybiAnJyArIHZhbHVlOyAvLyBjYXN0IHRvIHN0cmluZ1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIC8vIEFsbG93ICcwJyB0byBwYXNzIHRocm91Z2ggd2l0aG91dCB3YXJuaW5nLiAwIGlzIGFscmVhZHkgc3BlY2lhbCBhbmRcbiAgICAgIC8vIGRvZXNuJ3QgcmVxdWlyZSB1bml0cywgc28gd2UgZG9uJ3QgbmVlZCB0byB3YXJuIGFib3V0IGl0LlxuICAgICAgaWYgKGNvbXBvbmVudCAmJiB2YWx1ZSAhPT0gJzAnKSB7XG4gICAgICAgIHZhciBvd25lciA9IGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQuX293bmVyO1xuICAgICAgICB2YXIgb3duZXJOYW1lID0gb3duZXIgPyBvd25lci5nZXROYW1lKCkgOiBudWxsO1xuICAgICAgICBpZiAob3duZXJOYW1lICYmICFzdHlsZVdhcm5pbmdzW293bmVyTmFtZV0pIHtcbiAgICAgICAgICBzdHlsZVdhcm5pbmdzW293bmVyTmFtZV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgd2FybmVkID0gZmFsc2U7XG4gICAgICAgIGlmIChvd25lck5hbWUpIHtcbiAgICAgICAgICB2YXIgd2FybmluZ3MgPSBzdHlsZVdhcm5pbmdzW293bmVyTmFtZV07XG4gICAgICAgICAgd2FybmVkID0gd2FybmluZ3NbbmFtZV07XG4gICAgICAgICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgICAgICAgIHdhcm5pbmdzW25hbWVdID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdhIGAlc2AgdGFnIChvd25lcjogYCVzYCkgd2FzIHBhc3NlZCBhIG51bWVyaWMgc3RyaW5nIHZhbHVlICcgKyAnZm9yIENTUyBwcm9wZXJ0eSBgJXNgICh2YWx1ZTogYCVzYCkgd2hpY2ggd2lsbCBiZSB0cmVhdGVkICcgKyAnYXMgYSB1bml0bGVzcyBudW1iZXIgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBSZWFjdC4nLCBjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50LnR5cGUsIG93bmVyTmFtZSB8fCAndW5rbm93bicsIG5hbWUsIHZhbHVlKSA6IHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gdmFsdWUgKyAncHgnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGRhbmdlcm91c1N0eWxlVmFsdWU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNi1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQmFzZWQgb24gdGhlIGVzY2FwZS1odG1sIGxpYnJhcnksIHdoaWNoIGlzIHVzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIGJlbG93OlxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMi0yMDEzIFRKIEhvbG93YXljaHVrXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgQW5kcmVhcyBMdWJiZVxuICogQ29weXJpZ2h0IChjKSAyMDE1IFRpYW5jaGVuZyBcIlRpbW90aHlcIiBHdVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZ1xuICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4gKiAnU29mdHdhcmUnKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4gKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4gKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG9cbiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0b1xuICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlXG4gKiBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgJ0FTIElTJywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCxcbiAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULlxuICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTllcbiAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsXG4gKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRVxuICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gY29kZSBjb3BpZWQgYW5kIG1vZGlmaWVkIGZyb20gZXNjYXBlLWh0bWxcbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIG1hdGNoSHRtbFJlZ0V4cCA9IC9bXCInJjw+XS87XG5cbi8qKlxuICogRXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgZ2l2ZW4gc3RyaW5nIG9mIGh0bWwuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBlc2NhcGUgZm9yIGluc2VydGluZyBpbnRvIEhUTUxcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBlc2NhcGVIdG1sKHN0cmluZykge1xuICB2YXIgc3RyID0gJycgKyBzdHJpbmc7XG4gIHZhciBtYXRjaCA9IG1hdGNoSHRtbFJlZ0V4cC5leGVjKHN0cik7XG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cblxuICB2YXIgZXNjYXBlO1xuICB2YXIgaHRtbCA9ICcnO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGFzdEluZGV4ID0gMDtcblxuICBmb3IgKGluZGV4ID0gbWF0Y2guaW5kZXg7IGluZGV4IDwgc3RyLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIHN3aXRjaCAoc3RyLmNoYXJDb2RlQXQoaW5kZXgpKSB7XG4gICAgICBjYXNlIDM0OlxuICAgICAgICAvLyBcIlxuICAgICAgICBlc2NhcGUgPSAnJnF1b3Q7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM4OlxuICAgICAgICAvLyAmXG4gICAgICAgIGVzY2FwZSA9ICcmYW1wOyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOTpcbiAgICAgICAgLy8gJ1xuICAgICAgICBlc2NhcGUgPSAnJiN4Mjc7JzsgLy8gbW9kaWZpZWQgZnJvbSBlc2NhcGUtaHRtbDsgdXNlZCB0byBiZSAnJiMzOSdcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDYwOlxuICAgICAgICAvLyA8XG4gICAgICAgIGVzY2FwZSA9ICcmbHQ7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDYyOlxuICAgICAgICAvLyA+XG4gICAgICAgIGVzY2FwZSA9ICcmZ3Q7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobGFzdEluZGV4ICE9PSBpbmRleCkge1xuICAgICAgaHRtbCArPSBzdHIuc3Vic3RyaW5nKGxhc3RJbmRleCwgaW5kZXgpO1xuICAgIH1cblxuICAgIGxhc3RJbmRleCA9IGluZGV4ICsgMTtcbiAgICBodG1sICs9IGVzY2FwZTtcbiAgfVxuXG4gIHJldHVybiBsYXN0SW5kZXggIT09IGluZGV4ID8gaHRtbCArIHN0ci5zdWJzdHJpbmcobGFzdEluZGV4LCBpbmRleCkgOiBodG1sO1xufVxuLy8gZW5kIGNvZGUgY29waWVkIGFuZCBtb2RpZmllZCBmcm9tIGVzY2FwZS1odG1sXG5cblxuLyoqXG4gKiBFc2NhcGVzIHRleHQgdG8gcHJldmVudCBzY3JpcHRpbmcgYXR0YWNrcy5cbiAqXG4gKiBAcGFyYW0geyp9IHRleHQgVGV4dCB2YWx1ZSB0byBlc2NhcGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEFuIGVzY2FwZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIodGV4dCkge1xuICBpZiAodHlwZW9mIHRleHQgPT09ICdib29sZWFuJyB8fCB0eXBlb2YgdGV4dCA9PT0gJ251bWJlcicpIHtcbiAgICAvLyB0aGlzIHNob3J0Y2lyY3VpdCBoZWxwcyBwZXJmIGZvciB0eXBlcyB0aGF0IHdlIGtub3cgd2lsbCBuZXZlciBoYXZlXG4gICAgLy8gc3BlY2lhbCBjaGFyYWN0ZXJzLCBlc3BlY2lhbGx5IGdpdmVuIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9mdGVuXG4gICAgLy8gZm9yIG51bWVyaWMgZG9tIGlkcy5cbiAgICByZXR1cm4gJycgKyB0ZXh0O1xuICB9XG4gIHJldHVybiBlc2NhcGVIdG1sKHRleHQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3NlcjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDdXJyZW50T3duZXInKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xudmFyIFJlYWN0SW5zdGFuY2VNYXAgPSByZXF1aXJlKCcuL1JlYWN0SW5zdGFuY2VNYXAnKTtcblxudmFyIGdldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlID0gcmVxdWlyZSgnLi9nZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZScpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgRE9NIG5vZGUgcmVuZGVyZWQgYnkgdGhpcyBlbGVtZW50LlxuICpcbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdGRvbS5maW5kZG9tbm9kZVxuICpcbiAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR8RE9NRWxlbWVudH0gY29tcG9uZW50T3JFbGVtZW50XG4gKiBAcmV0dXJuIHs/RE9NRWxlbWVudH0gVGhlIHJvb3Qgbm9kZSBvZiB0aGlzIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGZpbmRET01Ob2RlKGNvbXBvbmVudE9yRWxlbWVudCkge1xuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YXIgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIGlmIChvd25lciAhPT0gbnVsbCkge1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKG93bmVyLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciwgJyVzIGlzIGFjY2Vzc2luZyBmaW5kRE9NTm9kZSBpbnNpZGUgaXRzIHJlbmRlcigpLiAnICsgJ3JlbmRlcigpIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlLiBJdCBzaG91bGQgJyArICduZXZlciBhY2Nlc3Mgc29tZXRoaW5nIHRoYXQgcmVxdWlyZXMgc3RhbGUgZGF0YSBmcm9tIHRoZSBwcmV2aW91cyAnICsgJ3JlbmRlciwgc3VjaCBhcyByZWZzLiBNb3ZlIHRoaXMgbG9naWMgdG8gY29tcG9uZW50RGlkTW91bnQgYW5kICcgKyAnY29tcG9uZW50RGlkVXBkYXRlIGluc3RlYWQuJywgb3duZXIuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgb3duZXIuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKGNvbXBvbmVudE9yRWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGNvbXBvbmVudE9yRWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgIHJldHVybiBjb21wb25lbnRPckVsZW1lbnQ7XG4gIH1cblxuICB2YXIgaW5zdCA9IFJlYWN0SW5zdGFuY2VNYXAuZ2V0KGNvbXBvbmVudE9yRWxlbWVudCk7XG4gIGlmIChpbnN0KSB7XG4gICAgaW5zdCA9IGdldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlKGluc3QpO1xuICAgIHJldHVybiBpbnN0ID8gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCkgOiBudWxsO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBjb21wb25lbnRPckVsZW1lbnQucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgIWZhbHNlID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdmaW5kRE9NTm9kZSB3YXMgY2FsbGVkIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuJykgOiBfcHJvZEludmFyaWFudCgnNDQnKSA6IHZvaWQgMDtcbiAgfSBlbHNlIHtcbiAgICAhZmFsc2UgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0VsZW1lbnQgYXBwZWFycyB0byBiZSBuZWl0aGVyIFJlYWN0Q29tcG9uZW50IG5vciBET01Ob2RlIChrZXlzOiAlcyknLCBPYmplY3Qua2V5cyhjb21wb25lbnRPckVsZW1lbnQpKSA6IF9wcm9kSW52YXJpYW50KCc0NScsIE9iamVjdC5rZXlzKGNvbXBvbmVudE9yRWxlbWVudCkpIDogdm9pZCAwO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmluZERPTU5vZGU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgS2V5RXNjYXBlVXRpbHMgPSByZXF1aXJlKCcuL0tleUVzY2FwZVV0aWxzJyk7XG52YXIgdHJhdmVyc2VBbGxDaGlsZHJlbiA9IHJlcXVpcmUoJy4vdHJhdmVyc2VBbGxDaGlsZHJlbicpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rO1xuXG5pZiAodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHByb2Nlc3MuZW52ICYmIFwiZGV2ZWxvcG1lbnRcIiA9PT0gJ3Rlc3QnKSB7XG4gIC8vIFRlbXBvcmFyeSBoYWNrLlxuICAvLyBJbmxpbmUgcmVxdWlyZXMgZG9uJ3Qgd29yayB3ZWxsIHdpdGggSmVzdDpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy83MjQwXG4gIC8vIFJlbW92ZSB0aGUgaW5saW5lIHJlcXVpcmVzIHdoZW4gd2UgZG9uJ3QgbmVlZCB0aGVtIGFueW1vcmU6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9wdWxsLzcxNzhcbiAgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gdHJhdmVyc2VDb250ZXh0IENvbnRleHQgcGFzc2VkIHRocm91Z2ggdHJhdmVyc2FsLlxuICogQHBhcmFtIHs/UmVhY3RDb21wb25lbnR9IGNoaWxkIFJlYWN0IGNoaWxkIGNvbXBvbmVudC5cbiAqIEBwYXJhbSB7IXN0cmluZ30gbmFtZSBTdHJpbmcgbmFtZSBvZiBrZXkgcGF0aCB0byBjaGlsZC5cbiAqIEBwYXJhbSB7bnVtYmVyPX0gc2VsZkRlYnVnSUQgT3B0aW9uYWwgZGVidWdJRCBvZiB0aGUgY3VycmVudCBpbnRlcm5hbCBpbnN0YW5jZS5cbiAqL1xuZnVuY3Rpb24gZmxhdHRlblNpbmdsZUNoaWxkSW50b0NvbnRleHQodHJhdmVyc2VDb250ZXh0LCBjaGlsZCwgbmFtZSwgc2VsZkRlYnVnSUQpIHtcbiAgLy8gV2UgZm91bmQgYSBjb21wb25lbnQgaW5zdGFuY2UuXG4gIGlmICh0cmF2ZXJzZUNvbnRleHQgJiYgdHlwZW9mIHRyYXZlcnNlQ29udGV4dCA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgcmVzdWx0ID0gdHJhdmVyc2VDb250ZXh0O1xuICAgIHZhciBrZXlVbmlxdWUgPSByZXN1bHRbbmFtZV0gPT09IHVuZGVmaW5lZDtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICghUmVhY3RDb21wb25lbnRUcmVlSG9vaykge1xuICAgICAgICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbiAgICAgIH1cbiAgICAgIGlmICgha2V5VW5pcXVlKSB7XG4gICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2ZsYXR0ZW5DaGlsZHJlbiguLi4pOiBFbmNvdW50ZXJlZCB0d28gY2hpbGRyZW4gd2l0aCB0aGUgc2FtZSBrZXksICcgKyAnYCVzYC4gQ2hpbGQga2V5cyBtdXN0IGJlIHVuaXF1ZTsgd2hlbiB0d28gY2hpbGRyZW4gc2hhcmUgYSBrZXksIG9ubHkgJyArICd0aGUgZmlyc3QgY2hpbGQgd2lsbCBiZSB1c2VkLiVzJywgS2V5RXNjYXBlVXRpbHMudW5lc2NhcGUobmFtZSksIFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoc2VsZkRlYnVnSUQpKSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGtleVVuaXF1ZSAmJiBjaGlsZCAhPSBudWxsKSB7XG4gICAgICByZXN1bHRbbmFtZV0gPSBjaGlsZDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBGbGF0dGVucyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuIEFueSBudWxsXG4gKiBjaGlsZHJlbiB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIG9iamVjdC5cbiAqIEByZXR1cm4geyFvYmplY3R9IGZsYXR0ZW5lZCBjaGlsZHJlbiBrZXllZCBieSBuYW1lLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuQ2hpbGRyZW4oY2hpbGRyZW4sIHNlbGZEZWJ1Z0lEKSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG4gIHZhciByZXN1bHQgPSB7fTtcblxuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAodHJhdmVyc2VDb250ZXh0LCBjaGlsZCwgbmFtZSkge1xuICAgICAgcmV0dXJuIGZsYXR0ZW5TaW5nbGVDaGlsZEludG9Db250ZXh0KHRyYXZlcnNlQ29udGV4dCwgY2hpbGQsIG5hbWUsIHNlbGZEZWJ1Z0lEKTtcbiAgICB9LCByZXN1bHQpO1xuICB9IGVsc2Uge1xuICAgIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGZsYXR0ZW5TaW5nbGVDaGlsZEludG9Db250ZXh0LCByZXN1bHQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZmxhdHRlbkNoaWxkcmVuOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAcGFyYW0ge2FycmF5fSBhcnIgYW4gXCJhY2N1bXVsYXRpb25cIiBvZiBpdGVtcyB3aGljaCBpcyBlaXRoZXIgYW4gQXJyYXkgb3JcbiAqIGEgc2luZ2xlIGl0ZW0uIFVzZWZ1bCB3aGVuIHBhaXJlZCB3aXRoIHRoZSBgYWNjdW11bGF0ZWAgbW9kdWxlLiBUaGlzIGlzIGFcbiAqIHNpbXBsZSB1dGlsaXR5IHRoYXQgYWxsb3dzIHVzIHRvIHJlYXNvbiBhYm91dCBhIGNvbGxlY3Rpb24gb2YgaXRlbXMsIGJ1dFxuICogaGFuZGxpbmcgdGhlIGNhc2Ugd2hlbiB0aGVyZSBpcyBleGFjdGx5IG9uZSBpdGVtIChhbmQgd2UgZG8gbm90IG5lZWQgdG9cbiAqIGFsbG9jYXRlIGFuIGFycmF5KS5cbiAqL1xuXG5mdW5jdGlvbiBmb3JFYWNoQWNjdW11bGF0ZWQoYXJyLCBjYiwgc2NvcGUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgIGFyci5mb3JFYWNoKGNiLCBzY29wZSk7XG4gIH0gZWxzZSBpZiAoYXJyKSB7XG4gICAgY2IuY2FsbChzY29wZSwgYXJyKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZvckVhY2hBY2N1bXVsYXRlZDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIGBjaGFyQ29kZWAgcmVwcmVzZW50cyB0aGUgYWN0dWFsIFwiY2hhcmFjdGVyIGNvZGVcIiBhbmQgaXMgc2FmZSB0byB1c2Ugd2l0aFxuICogYFN0cmluZy5mcm9tQ2hhckNvZGVgLiBBcyBzdWNoLCBvbmx5IGtleXMgdGhhdCBjb3JyZXNwb25kIHRvIHByaW50YWJsZVxuICogY2hhcmFjdGVycyBwcm9kdWNlIGEgdmFsaWQgYGNoYXJDb2RlYCwgdGhlIG9ubHkgZXhjZXB0aW9uIHRvIHRoaXMgaXMgRW50ZXIuXG4gKiBUaGUgVGFiLWtleSBpcyBjb25zaWRlcmVkIG5vbi1wcmludGFibGUgYW5kIGRvZXMgbm90IGhhdmUgYSBgY2hhckNvZGVgLFxuICogcHJlc3VtYWJseSBiZWNhdXNlIGl0IGRvZXMgbm90IHByb2R1Y2UgYSB0YWItY2hhcmFjdGVyIGluIGJyb3dzZXJzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge251bWJlcn0gTm9ybWFsaXplZCBgY2hhckNvZGVgIHByb3BlcnR5LlxuICovXG5cbmZ1bmN0aW9uIGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGNoYXJDb2RlO1xuICB2YXIga2V5Q29kZSA9IG5hdGl2ZUV2ZW50LmtleUNvZGU7XG5cbiAgaWYgKCdjaGFyQ29kZScgaW4gbmF0aXZlRXZlbnQpIHtcbiAgICBjaGFyQ29kZSA9IG5hdGl2ZUV2ZW50LmNoYXJDb2RlO1xuXG4gICAgLy8gRkYgZG9lcyBub3Qgc2V0IGBjaGFyQ29kZWAgZm9yIHRoZSBFbnRlci1rZXksIGNoZWNrIGFnYWluc3QgYGtleUNvZGVgLlxuICAgIGlmIChjaGFyQ29kZSA9PT0gMCAmJiBrZXlDb2RlID09PSAxMykge1xuICAgICAgY2hhckNvZGUgPSAxMztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gSUU4IGRvZXMgbm90IGltcGxlbWVudCBgY2hhckNvZGVgLCBidXQgYGtleUNvZGVgIGhhcyB0aGUgY29ycmVjdCB2YWx1ZS5cbiAgICBjaGFyQ29kZSA9IGtleUNvZGU7XG4gIH1cblxuICAvLyBTb21lIG5vbi1wcmludGFibGUga2V5cyBhcmUgcmVwb3J0ZWQgaW4gYGNoYXJDb2RlYC9ga2V5Q29kZWAsIGRpc2NhcmQgdGhlbS5cbiAgLy8gTXVzdCBub3QgZGlzY2FyZCB0aGUgKG5vbi0pcHJpbnRhYmxlIEVudGVyLWtleS5cbiAgaWYgKGNoYXJDb2RlID49IDMyIHx8IGNoYXJDb2RlID09PSAxMykge1xuICAgIHJldHVybiBjaGFyQ29kZTtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEV2ZW50Q2hhckNvZGU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGdldEV2ZW50Q2hhckNvZGUgPSByZXF1aXJlKCcuL2dldEV2ZW50Q2hhckNvZGUnKTtcblxuLyoqXG4gKiBOb3JtYWxpemF0aW9uIG9mIGRlcHJlY2F0ZWQgSFRNTDUgYGtleWAgdmFsdWVzXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50I0tleV9uYW1lc1xuICovXG52YXIgbm9ybWFsaXplS2V5ID0ge1xuICAnRXNjJzogJ0VzY2FwZScsXG4gICdTcGFjZWJhcic6ICcgJyxcbiAgJ0xlZnQnOiAnQXJyb3dMZWZ0JyxcbiAgJ1VwJzogJ0Fycm93VXAnLFxuICAnUmlnaHQnOiAnQXJyb3dSaWdodCcsXG4gICdEb3duJzogJ0Fycm93RG93bicsXG4gICdEZWwnOiAnRGVsZXRlJyxcbiAgJ1dpbic6ICdPUycsXG4gICdNZW51JzogJ0NvbnRleHRNZW51JyxcbiAgJ0FwcHMnOiAnQ29udGV4dE1lbnUnLFxuICAnU2Nyb2xsJzogJ1Njcm9sbExvY2snLFxuICAnTW96UHJpbnRhYmxlS2V5JzogJ1VuaWRlbnRpZmllZCdcbn07XG5cbi8qKlxuICogVHJhbnNsYXRpb24gZnJvbSBsZWdhY3kgYGtleUNvZGVgIHRvIEhUTUw1IGBrZXlgXG4gKiBPbmx5IHNwZWNpYWwga2V5cyBzdXBwb3J0ZWQsIGFsbCBvdGhlcnMgZGVwZW5kIG9uIGtleWJvYXJkIGxheW91dCBvciBicm93c2VyXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50I0tleV9uYW1lc1xuICovXG52YXIgdHJhbnNsYXRlVG9LZXkgPSB7XG4gIDg6ICdCYWNrc3BhY2UnLFxuICA5OiAnVGFiJyxcbiAgMTI6ICdDbGVhcicsXG4gIDEzOiAnRW50ZXInLFxuICAxNjogJ1NoaWZ0JyxcbiAgMTc6ICdDb250cm9sJyxcbiAgMTg6ICdBbHQnLFxuICAxOTogJ1BhdXNlJyxcbiAgMjA6ICdDYXBzTG9jaycsXG4gIDI3OiAnRXNjYXBlJyxcbiAgMzI6ICcgJyxcbiAgMzM6ICdQYWdlVXAnLFxuICAzNDogJ1BhZ2VEb3duJyxcbiAgMzU6ICdFbmQnLFxuICAzNjogJ0hvbWUnLFxuICAzNzogJ0Fycm93TGVmdCcsXG4gIDM4OiAnQXJyb3dVcCcsXG4gIDM5OiAnQXJyb3dSaWdodCcsXG4gIDQwOiAnQXJyb3dEb3duJyxcbiAgNDU6ICdJbnNlcnQnLFxuICA0NjogJ0RlbGV0ZScsXG4gIDExMjogJ0YxJywgMTEzOiAnRjInLCAxMTQ6ICdGMycsIDExNTogJ0Y0JywgMTE2OiAnRjUnLCAxMTc6ICdGNicsXG4gIDExODogJ0Y3JywgMTE5OiAnRjgnLCAxMjA6ICdGOScsIDEyMTogJ0YxMCcsIDEyMjogJ0YxMScsIDEyMzogJ0YxMicsXG4gIDE0NDogJ051bUxvY2snLFxuICAxNDU6ICdTY3JvbGxMb2NrJyxcbiAgMjI0OiAnTWV0YSdcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7c3RyaW5nfSBOb3JtYWxpemVkIGBrZXlgIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiBnZXRFdmVudEtleShuYXRpdmVFdmVudCkge1xuICBpZiAobmF0aXZlRXZlbnQua2V5KSB7XG4gICAgLy8gTm9ybWFsaXplIGluY29uc2lzdGVudCB2YWx1ZXMgcmVwb3J0ZWQgYnkgYnJvd3NlcnMgZHVlIHRvXG4gICAgLy8gaW1wbGVtZW50YXRpb25zIG9mIGEgd29ya2luZyBkcmFmdCBzcGVjaWZpY2F0aW9uLlxuXG4gICAgLy8gRmlyZUZveCBpbXBsZW1lbnRzIGBrZXlgIGJ1dCByZXR1cm5zIGBNb3pQcmludGFibGVLZXlgIGZvciBhbGxcbiAgICAvLyBwcmludGFibGUgY2hhcmFjdGVycyAobm9ybWFsaXplZCB0byBgVW5pZGVudGlmaWVkYCksIGlnbm9yZSBpdC5cbiAgICB2YXIga2V5ID0gbm9ybWFsaXplS2V5W25hdGl2ZUV2ZW50LmtleV0gfHwgbmF0aXZlRXZlbnQua2V5O1xuICAgIGlmIChrZXkgIT09ICdVbmlkZW50aWZpZWQnKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfVxuXG4gIC8vIEJyb3dzZXIgZG9lcyBub3QgaW1wbGVtZW50IGBrZXlgLCBwb2x5ZmlsbCBhcyBtdWNoIG9mIGl0IGFzIHdlIGNhbi5cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICB2YXIgY2hhckNvZGUgPSBnZXRFdmVudENoYXJDb2RlKG5hdGl2ZUV2ZW50KTtcblxuICAgIC8vIFRoZSBlbnRlci1rZXkgaXMgdGVjaG5pY2FsbHkgYm90aCBwcmludGFibGUgYW5kIG5vbi1wcmludGFibGUgYW5kIGNhblxuICAgIC8vIHRodXMgYmUgY2FwdHVyZWQgYnkgYGtleXByZXNzYCwgbm8gb3RoZXIgbm9uLXByaW50YWJsZSBrZXkgc2hvdWxkLlxuICAgIHJldHVybiBjaGFyQ29kZSA9PT0gMTMgPyAnRW50ZXInIDogU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gIH1cbiAgaWYgKG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXlkb3duJyB8fCBuYXRpdmVFdmVudC50eXBlID09PSAna2V5dXAnKSB7XG4gICAgLy8gV2hpbGUgdXNlciBrZXlib2FyZCBsYXlvdXQgZGV0ZXJtaW5lcyB0aGUgYWN0dWFsIG1lYW5pbmcgb2YgZWFjaFxuICAgIC8vIGBrZXlDb2RlYCB2YWx1ZSwgYWxtb3N0IGFsbCBmdW5jdGlvbiBrZXlzIGhhdmUgYSB1bml2ZXJzYWwgdmFsdWUuXG4gICAgcmV0dXJuIHRyYW5zbGF0ZVRvS2V5W25hdGl2ZUV2ZW50LmtleUNvZGVdIHx8ICdVbmlkZW50aWZpZWQnO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRFdmVudEtleTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFRyYW5zbGF0aW9uIGZyb20gbW9kaWZpZXIga2V5IHRvIHRoZSBhc3NvY2lhdGVkIHByb3BlcnR5IGluIHRoZSBldmVudC5cbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNrZXlzLU1vZGlmaWVyc1xuICovXG5cbnZhciBtb2RpZmllcktleVRvUHJvcCA9IHtcbiAgJ0FsdCc6ICdhbHRLZXknLFxuICAnQ29udHJvbCc6ICdjdHJsS2V5JyxcbiAgJ01ldGEnOiAnbWV0YUtleScsXG4gICdTaGlmdCc6ICdzaGlmdEtleSdcbn07XG5cbi8vIElFOCBkb2VzIG5vdCBpbXBsZW1lbnQgZ2V0TW9kaWZpZXJTdGF0ZSBzbyB3ZSBzaW1wbHkgbWFwIGl0IHRvIHRoZSBvbmx5XG4vLyBtb2RpZmllciBrZXlzIGV4cG9zZWQgYnkgdGhlIGV2ZW50IGl0c2VsZiwgZG9lcyBub3Qgc3VwcG9ydCBMb2NrLWtleXMuXG4vLyBDdXJyZW50bHksIGFsbCBtYWpvciBicm93c2VycyBleGNlcHQgQ2hyb21lIHNlZW1zIHRvIHN1cHBvcnQgTG9jay1rZXlzLlxuZnVuY3Rpb24gbW9kaWZpZXJTdGF0ZUdldHRlcihrZXlBcmcpIHtcbiAgdmFyIHN5bnRoZXRpY0V2ZW50ID0gdGhpcztcbiAgdmFyIG5hdGl2ZUV2ZW50ID0gc3ludGhldGljRXZlbnQubmF0aXZlRXZlbnQ7XG4gIGlmIChuYXRpdmVFdmVudC5nZXRNb2RpZmllclN0YXRlKSB7XG4gICAgcmV0dXJuIG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUoa2V5QXJnKTtcbiAgfVxuICB2YXIga2V5UHJvcCA9IG1vZGlmaWVyS2V5VG9Qcm9wW2tleUFyZ107XG4gIHJldHVybiBrZXlQcm9wID8gISFuYXRpdmVFdmVudFtrZXlQcm9wXSA6IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudE1vZGlmaWVyU3RhdGUobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIG1vZGlmaWVyU3RhdGVHZXR0ZXI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0RXZlbnRNb2RpZmllclN0YXRlOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogR2V0cyB0aGUgdGFyZ2V0IG5vZGUgZnJvbSBhIG5hdGl2ZSBicm93c2VyIGV2ZW50IGJ5IGFjY291bnRpbmcgZm9yXG4gKiBpbmNvbnNpc3RlbmNpZXMgaW4gYnJvd3NlciBET00gQVBJcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtET01FdmVudFRhcmdldH0gVGFyZ2V0IG5vZGUuXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXZlbnRUYXJnZXQobmF0aXZlRXZlbnQpIHtcbiAgdmFyIHRhcmdldCA9IG5hdGl2ZUV2ZW50LnRhcmdldCB8fCBuYXRpdmVFdmVudC5zcmNFbGVtZW50IHx8IHdpbmRvdztcblxuICAvLyBOb3JtYWxpemUgU1ZHIDx1c2U+IGVsZW1lbnQgZXZlbnRzICM0OTYzXG4gIGlmICh0YXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpIHtcbiAgICB0YXJnZXQgPSB0YXJnZXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQ7XG4gIH1cblxuICAvLyBTYWZhcmkgbWF5IGZpcmUgZXZlbnRzIG9uIHRleHQgbm9kZXMgKE5vZGUuVEVYVF9OT0RFIGlzIDMpLlxuICAvLyBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvanMvZXZlbnRzX3Byb3BlcnRpZXMuaHRtbFxuICByZXR1cm4gdGFyZ2V0Lm5vZGVUeXBlID09PSAzID8gdGFyZ2V0LnBhcmVudE5vZGUgOiB0YXJnZXQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0RXZlbnRUYXJnZXQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0Tm9kZVR5cGVzID0gcmVxdWlyZSgnLi9SZWFjdE5vZGVUeXBlcycpO1xuXG5mdW5jdGlvbiBnZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZShpbnN0KSB7XG4gIHZhciB0eXBlO1xuXG4gIHdoaWxlICgodHlwZSA9IGluc3QuX3JlbmRlcmVkTm9kZVR5cGUpID09PSBSZWFjdE5vZGVUeXBlcy5DT01QT1NJVEUpIHtcbiAgICBpbnN0ID0gaW5zdC5fcmVuZGVyZWRDb21wb25lbnQ7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gUmVhY3ROb2RlVHlwZXMuSE9TVCkge1xuICAgIHJldHVybiBpbnN0Ll9yZW5kZXJlZENvbXBvbmVudDtcbiAgfSBlbHNlIGlmICh0eXBlID09PSBSZWFjdE5vZGVUeXBlcy5FTVBUWSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKiBnbG9iYWwgU3ltYm9sICovXG5cbnZhciBJVEVSQVRPUl9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbC5pdGVyYXRvcjtcbnZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJzsgLy8gQmVmb3JlIFN5bWJvbCBzcGVjLlxuXG4vKipcbiAqIFJldHVybnMgdGhlIGl0ZXJhdG9yIG1ldGhvZCBmdW5jdGlvbiBjb250YWluZWQgb24gdGhlIGl0ZXJhYmxlIG9iamVjdC5cbiAqXG4gKiBCZSBzdXJlIHRvIGludm9rZSB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgaXRlcmFibGUgYXMgY29udGV4dDpcbiAqXG4gKiAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG15SXRlcmFibGUpO1xuICogICAgIGlmIChpdGVyYXRvckZuKSB7XG4gKiAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobXlJdGVyYWJsZSk7XG4gKiAgICAgICAuLi5cbiAqICAgICB9XG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBtYXliZUl0ZXJhYmxlXG4gKiBAcmV0dXJuIHs/ZnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICB2YXIgaXRlcmF0b3JGbiA9IG1heWJlSXRlcmFibGUgJiYgKElURVJBVE9SX1NZTUJPTCAmJiBtYXliZUl0ZXJhYmxlW0lURVJBVE9SX1NZTUJPTF0gfHwgbWF5YmVJdGVyYWJsZVtGQVVYX0lURVJBVE9SX1NZTUJPTF0pO1xuICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gaXRlcmF0b3JGbjtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEl0ZXJhdG9yRm47IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBHaXZlbiBhbnkgbm9kZSByZXR1cm4gdGhlIGZpcnN0IGxlYWYgbm9kZSB3aXRob3V0IGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHJldHVybiB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuXG5mdW5jdGlvbiBnZXRMZWFmTm9kZShub2RlKSB7XG4gIHdoaWxlIChub2RlICYmIG5vZGUuZmlyc3RDaGlsZCkge1xuICAgIG5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gIH1cbiAgcmV0dXJuIG5vZGU7XG59XG5cbi8qKlxuICogR2V0IHRoZSBuZXh0IHNpYmxpbmcgd2l0aGluIGEgY29udGFpbmVyLiBUaGlzIHdpbGwgd2FsayB1cCB0aGVcbiAqIERPTSBpZiBhIG5vZGUncyBzaWJsaW5ncyBoYXZlIGJlZW4gZXhoYXVzdGVkLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01UZXh0Tm9kZX0gbm9kZVxuICogQHJldHVybiB7P0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9XG4gKi9cbmZ1bmN0aW9uIGdldFNpYmxpbmdOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5uZXh0U2libGluZykge1xuICAgICAgcmV0dXJuIG5vZGUubmV4dFNpYmxpbmc7XG4gICAgfVxuICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIG5vZGVzIHdoaWNoIGNvbnRhaW4gY2hhcmFjdGVycyBhdCBvZmZzZXQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSByb290XG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0KHJvb3QsIG9mZnNldCkge1xuICB2YXIgbm9kZSA9IGdldExlYWZOb2RlKHJvb3QpO1xuICB2YXIgbm9kZVN0YXJ0ID0gMDtcbiAgdmFyIG5vZGVFbmQgPSAwO1xuXG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgIG5vZGVFbmQgPSBub2RlU3RhcnQgKyBub2RlLnRleHRDb250ZW50Lmxlbmd0aDtcblxuICAgICAgaWYgKG5vZGVTdGFydCA8PSBvZmZzZXQgJiYgbm9kZUVuZCA+PSBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgIG9mZnNldDogb2Zmc2V0IC0gbm9kZVN0YXJ0XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG5vZGVTdGFydCA9IG5vZGVFbmQ7XG4gICAgfVxuXG4gICAgbm9kZSA9IGdldExlYWZOb2RlKGdldFNpYmxpbmdOb2RlKG5vZGUpKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnZmJqcy9saWIvRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcblxudmFyIGNvbnRlbnRLZXkgPSBudWxsO1xuXG4vKipcbiAqIEdldHMgdGhlIGtleSB1c2VkIHRvIGFjY2VzcyB0ZXh0IGNvbnRlbnQgb24gYSBET00gbm9kZS5cbiAqXG4gKiBAcmV0dXJuIHs/c3RyaW5nfSBLZXkgdXNlZCB0byBhY2Nlc3MgdGV4dCBjb250ZW50LlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGdldFRleHRDb250ZW50QWNjZXNzb3IoKSB7XG4gIGlmICghY29udGVudEtleSAmJiBFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00pIHtcbiAgICAvLyBQcmVmZXIgdGV4dENvbnRlbnQgdG8gaW5uZXJUZXh0IGJlY2F1c2UgbWFueSBicm93c2VycyBzdXBwb3J0IGJvdGggYnV0XG4gICAgLy8gU1ZHIDx0ZXh0PiBlbGVtZW50cyBkb24ndCBzdXBwb3J0IGlubmVyVGV4dCBldmVuIHdoZW4gPGRpdj4gZG9lcy5cbiAgICBjb250ZW50S2V5ID0gJ3RleHRDb250ZW50JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgPyAndGV4dENvbnRlbnQnIDogJ2lubmVyVGV4dCc7XG4gIH1cbiAgcmV0dXJuIGNvbnRlbnRLZXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VGV4dENvbnRlbnRBY2Nlc3NvcjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xuXG4vKipcbiAqIEdlbmVyYXRlIGEgbWFwcGluZyBvZiBzdGFuZGFyZCB2ZW5kb3IgcHJlZml4ZXMgdXNpbmcgdGhlIGRlZmluZWQgc3R5bGUgcHJvcGVydHkgYW5kIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0eWxlUHJvcFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuZnVuY3Rpb24gbWFrZVByZWZpeE1hcChzdHlsZVByb3AsIGV2ZW50TmFtZSkge1xuICB2YXIgcHJlZml4ZXMgPSB7fTtcblxuICBwcmVmaXhlc1tzdHlsZVByb3AudG9Mb3dlckNhc2UoKV0gPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgcHJlZml4ZXNbJ1dlYmtpdCcgKyBzdHlsZVByb3BdID0gJ3dlYmtpdCcgKyBldmVudE5hbWU7XG4gIHByZWZpeGVzWydNb3onICsgc3R5bGVQcm9wXSA9ICdtb3onICsgZXZlbnROYW1lO1xuICBwcmVmaXhlc1snbXMnICsgc3R5bGVQcm9wXSA9ICdNUycgKyBldmVudE5hbWU7XG4gIHByZWZpeGVzWydPJyArIHN0eWxlUHJvcF0gPSAnbycgKyBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcblxuICByZXR1cm4gcHJlZml4ZXM7XG59XG5cbi8qKlxuICogQSBsaXN0IG9mIGV2ZW50IG5hbWVzIHRvIGEgY29uZmlndXJhYmxlIGxpc3Qgb2YgdmVuZG9yIHByZWZpeGVzLlxuICovXG52YXIgdmVuZG9yUHJlZml4ZXMgPSB7XG4gIGFuaW1hdGlvbmVuZDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkVuZCcpLFxuICBhbmltYXRpb25pdGVyYXRpb246IG1ha2VQcmVmaXhNYXAoJ0FuaW1hdGlvbicsICdBbmltYXRpb25JdGVyYXRpb24nKSxcbiAgYW5pbWF0aW9uc3RhcnQ6IG1ha2VQcmVmaXhNYXAoJ0FuaW1hdGlvbicsICdBbmltYXRpb25TdGFydCcpLFxuICB0cmFuc2l0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdUcmFuc2l0aW9uJywgJ1RyYW5zaXRpb25FbmQnKVxufTtcblxuLyoqXG4gKiBFdmVudCBuYW1lcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGRldGVjdGVkIGFuZCBwcmVmaXhlZCAoaWYgYXBwbGljYWJsZSkuXG4gKi9cbnZhciBwcmVmaXhlZEV2ZW50TmFtZXMgPSB7fTtcblxuLyoqXG4gKiBFbGVtZW50IHRvIGNoZWNrIGZvciBwcmVmaXhlcyBvbi5cbiAqL1xudmFyIHN0eWxlID0ge307XG5cbi8qKlxuICogQm9vdHN0cmFwIGlmIGEgRE9NIGV4aXN0cy5cbiAqL1xuaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkge1xuICBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLnN0eWxlO1xuXG4gIC8vIE9uIHNvbWUgcGxhdGZvcm1zLCBpbiBwYXJ0aWN1bGFyIHNvbWUgcmVsZWFzZXMgb2YgQW5kcm9pZCA0LngsXG4gIC8vIHRoZSB1bi1wcmVmaXhlZCBcImFuaW1hdGlvblwiIGFuZCBcInRyYW5zaXRpb25cIiBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIG9uIHRoZVxuICAvLyBzdHlsZSBvYmplY3QgYnV0IHRoZSBldmVudHMgdGhhdCBmaXJlIHdpbGwgc3RpbGwgYmUgcHJlZml4ZWQsIHNvIHdlIG5lZWRcbiAgLy8gdG8gY2hlY2sgaWYgdGhlIHVuLXByZWZpeGVkIGV2ZW50cyBhcmUgdXNhYmxlLCBhbmQgaWYgbm90IHJlbW92ZSB0aGVtIGZyb20gdGhlIG1hcC5cbiAgaWYgKCEoJ0FuaW1hdGlvbkV2ZW50JyBpbiB3aW5kb3cpKSB7XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbmVuZC5hbmltYXRpb247XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbml0ZXJhdGlvbi5hbmltYXRpb247XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLmFuaW1hdGlvbnN0YXJ0LmFuaW1hdGlvbjtcbiAgfVxuXG4gIC8vIFNhbWUgYXMgYWJvdmVcbiAgaWYgKCEoJ1RyYW5zaXRpb25FdmVudCcgaW4gd2luZG93KSkge1xuICAgIGRlbGV0ZSB2ZW5kb3JQcmVmaXhlcy50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb247XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgdmVuZG9yIHByZWZpeGVkIGV2ZW50IG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoZXZlbnROYW1lKSB7XG4gIGlmIChwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBwcmVmaXhlZEV2ZW50TmFtZXNbZXZlbnROYW1lXTtcbiAgfSBlbHNlIGlmICghdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXSkge1xuICAgIHJldHVybiBldmVudE5hbWU7XG4gIH1cblxuICB2YXIgcHJlZml4TWFwID0gdmVuZG9yUHJlZml4ZXNbZXZlbnROYW1lXTtcblxuICBmb3IgKHZhciBzdHlsZVByb3AgaW4gcHJlZml4TWFwKSB7XG4gICAgaWYgKHByZWZpeE1hcC5oYXNPd25Qcm9wZXJ0eShzdHlsZVByb3ApICYmIHN0eWxlUHJvcCBpbiBzdHlsZSkge1xuICAgICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdID0gcHJlZml4TWFwW3N0eWxlUHJvcF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuICcnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50JyksXG4gICAgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpO1xudmFyIFJlYWN0RW1wdHlDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0RW1wdHlDb21wb25lbnQnKTtcbnZhciBSZWFjdEhvc3RDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0SG9zdENvbXBvbmVudCcpO1xuXG52YXIgZ2V0TmV4dERlYnVnSUQgPSByZXF1aXJlKCdyZWFjdC9saWIvZ2V0TmV4dERlYnVnSUQnKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG4vLyBUbyBhdm9pZCBhIGN5Y2xpYyBkZXBlbmRlbmN5LCB3ZSBjcmVhdGUgdGhlIGZpbmFsIGNsYXNzIGluIHRoaXMgbW9kdWxlXG52YXIgUmVhY3RDb21wb3NpdGVDb21wb25lbnRXcmFwcGVyID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgdGhpcy5jb25zdHJ1Y3QoZWxlbWVudCk7XG59O1xuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpIHtcbiAgaWYgKG93bmVyKSB7XG4gICAgdmFyIG5hbWUgPSBvd25lci5nZXROYW1lKCk7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgdHlwZSByZWZlcmVuY2UgaXMgYSBrbm93biBpbnRlcm5hbCB0eXBlLiBJLmUuIG5vdCBhIHVzZXJcbiAqIHByb3ZpZGVkIGNvbXBvc2l0ZSB0eXBlLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHR5cGVcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgdmFsaWQgaW50ZXJuYWwgdHlwZS5cbiAqL1xuZnVuY3Rpb24gaXNJbnRlcm5hbENvbXBvbmVudFR5cGUodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHR5cGUucHJvdG90eXBlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgdHlwZS5wcm90b3R5cGUubW91bnRDb21wb25lbnQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHR5cGUucHJvdG90eXBlLnJlY2VpdmVDb21wb25lbnQgPT09ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBSZWFjdE5vZGUsIGNyZWF0ZSBhbiBpbnN0YW5jZSB0aGF0IHdpbGwgYWN0dWFsbHkgYmUgbW91bnRlZC5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0Tm9kZX0gbm9kZVxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRIYXZlRGVidWdJRFxuICogQHJldHVybiB7b2JqZWN0fSBBIG5ldyBpbnN0YW5jZSBvZiB0aGUgZWxlbWVudCdzIGNvbnN0cnVjdG9yLlxuICogQHByb3RlY3RlZFxuICovXG5mdW5jdGlvbiBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KG5vZGUsIHNob3VsZEhhdmVEZWJ1Z0lEKSB7XG4gIHZhciBpbnN0YW5jZTtcblxuICBpZiAobm9kZSA9PT0gbnVsbCB8fCBub2RlID09PSBmYWxzZSkge1xuICAgIGluc3RhbmNlID0gUmVhY3RFbXB0eUNvbXBvbmVudC5jcmVhdGUoaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG5vZGUgPT09ICdvYmplY3QnKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBub2RlO1xuICAgIHZhciB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgIGlmICh0eXBlb2YgdHlwZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBpbmZvID0gJyc7XG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArICdpdFxcJ3MgZGVmaW5lZCBpbi4nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpbmZvICs9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShlbGVtZW50Ll9vd25lcik7XG4gICAgICAhZmFsc2UgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0VsZW1lbnQgdHlwZSBpcyBpbnZhbGlkOiBleHBlY3RlZCBhIHN0cmluZyAoZm9yIGJ1aWx0LWluIGNvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgY29tcG9uZW50cykgYnV0IGdvdDogJXMuJXMnLCB0eXBlID09IG51bGwgPyB0eXBlIDogdHlwZW9mIHR5cGUsIGluZm8pIDogX3Byb2RJbnZhcmlhbnQoJzEzMCcsIHR5cGUgPT0gbnVsbCA/IHR5cGUgOiB0eXBlb2YgdHlwZSwgaW5mbykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgLy8gU3BlY2lhbCBjYXNlIHN0cmluZyB2YWx1ZXNcbiAgICBpZiAodHlwZW9mIGVsZW1lbnQudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGluc3RhbmNlID0gUmVhY3RIb3N0Q29tcG9uZW50LmNyZWF0ZUludGVybmFsQ29tcG9uZW50KGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoaXNJbnRlcm5hbENvbXBvbmVudFR5cGUoZWxlbWVudC50eXBlKSkge1xuICAgICAgLy8gVGhpcyBpcyB0ZW1wb3JhcmlseSBhdmFpbGFibGUgZm9yIGN1c3RvbSBjb21wb25lbnRzIHRoYXQgYXJlIG5vdCBzdHJpbmdcbiAgICAgIC8vIHJlcHJlc2VudGF0aW9ucy4gSS5lLiBBUlQuIE9uY2UgdGhvc2UgYXJlIHVwZGF0ZWQgdG8gdXNlIHRoZSBzdHJpbmdcbiAgICAgIC8vIHJlcHJlc2VudGF0aW9uLCB3ZSBjYW4gZHJvcCB0aGlzIGNvZGUgcGF0aC5cbiAgICAgIGluc3RhbmNlID0gbmV3IGVsZW1lbnQudHlwZShlbGVtZW50KTtcblxuICAgICAgLy8gV2UgcmVuYW1lZCB0aGlzLiBBbGxvdyB0aGUgb2xkIG5hbWUgZm9yIGNvbXBhdC4gOihcbiAgICAgIGlmICghaW5zdGFuY2UuZ2V0SG9zdE5vZGUpIHtcbiAgICAgICAgaW5zdGFuY2UuZ2V0SG9zdE5vZGUgPSBpbnN0YW5jZS5nZXROYXRpdmVOb2RlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZSA9IG5ldyBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudFdyYXBwZXIoZWxlbWVudCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBub2RlID09PSAnc3RyaW5nJyB8fCB0eXBlb2Ygbm9kZSA9PT0gJ251bWJlcicpIHtcbiAgICBpbnN0YW5jZSA9IFJlYWN0SG9zdENvbXBvbmVudC5jcmVhdGVJbnN0YW5jZUZvclRleHQobm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgIWZhbHNlID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFbmNvdW50ZXJlZCBpbnZhbGlkIFJlYWN0IG5vZGUgb2YgdHlwZSAlcycsIHR5cGVvZiBub2RlKSA6IF9wcm9kSW52YXJpYW50KCcxMzEnLCB0eXBlb2Ygbm9kZSkgOiB2b2lkIDA7XG4gIH1cblxuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcodHlwZW9mIGluc3RhbmNlLm1vdW50Q29tcG9uZW50ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnN0YW5jZS5yZWNlaXZlQ29tcG9uZW50ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnN0YW5jZS5nZXRIb3N0Tm9kZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgaW5zdGFuY2UudW5tb3VudENvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJywgJ09ubHkgUmVhY3QgQ29tcG9uZW50cyBjYW4gYmUgbW91bnRlZC4nKSA6IHZvaWQgMDtcbiAgfVxuXG4gIC8vIFRoZXNlIHR3byBmaWVsZHMgYXJlIHVzZWQgYnkgdGhlIERPTSBhbmQgQVJUIGRpZmZpbmcgYWxnb3JpdGhtc1xuICAvLyByZXNwZWN0aXZlbHkuIEluc3RlYWQgb2YgdXNpbmcgZXhwYW5kb3Mgb24gY29tcG9uZW50cywgd2Ugc2hvdWxkIGJlXG4gIC8vIHN0b3JpbmcgdGhlIHN0YXRlIG5lZWRlZCBieSB0aGUgZGlmZmluZyBhbGdvcml0aG1zIGVsc2V3aGVyZS5cbiAgaW5zdGFuY2UuX21vdW50SW5kZXggPSAwO1xuICBpbnN0YW5jZS5fbW91bnRJbWFnZSA9IG51bGw7XG5cbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaW5zdGFuY2UuX2RlYnVnSUQgPSBzaG91bGRIYXZlRGVidWdJRCA/IGdldE5leHREZWJ1Z0lEKCkgOiAwO1xuICB9XG5cbiAgLy8gSW50ZXJuYWwgaW5zdGFuY2VzIHNob3VsZCBmdWxseSBjb25zdHJ1Y3RlZCBhdCB0aGlzIHBvaW50LCBzbyB0aGV5IHNob3VsZFxuICAvLyBub3QgZ2V0IGFueSBuZXcgZmllbGRzIGFkZGVkIHRvIHRoZW0gYXQgdGhpcyBwb2ludC5cbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucykge1xuICAgICAgT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKGluc3RhbmNlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbl9hc3NpZ24oUmVhY3RDb21wb3NpdGVDb21wb25lbnRXcmFwcGVyLnByb3RvdHlwZSwgUmVhY3RDb21wb3NpdGVDb21wb25lbnQsIHtcbiAgX2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQ6IGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnRcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnZmJqcy9saWIvRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcblxudmFyIHVzZUhhc0ZlYXR1cmU7XG5pZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7XG4gIHVzZUhhc0ZlYXR1cmUgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbiAmJiBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlICYmXG4gIC8vIGFsd2F5cyByZXR1cm5zIHRydWUgaW4gbmV3ZXIgYnJvd3NlcnMgYXMgcGVyIHRoZSBzdGFuZGFyZC5cbiAgLy8gQHNlZSBodHRwOi8vZG9tLnNwZWMud2hhdHdnLm9yZy8jZG9tLWRvbWltcGxlbWVudGF0aW9uLWhhc2ZlYXR1cmVcbiAgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgnJywgJycpICE9PSB0cnVlO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBldmVudCBpcyBzdXBwb3J0ZWQgaW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGVudmlyb25tZW50LlxuICpcbiAqIE5PVEU6IFRoaXMgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgZm9yIG5vbi1nZW5lcmljIGV2ZW50cyBzdWNoIGFzIGBjaGFuZ2VgLFxuICogYHJlc2V0YCwgYGxvYWRgLCBgZXJyb3JgLCBhbmQgYHNlbGVjdGAuXG4gKlxuICogQm9ycm93cyBmcm9tIE1vZGVybml6ci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lU3VmZml4IEV2ZW50IG5hbWUsIGUuZy4gXCJjbGlja1wiLlxuICogQHBhcmFtIHs/Ym9vbGVhbn0gY2FwdHVyZSBDaGVjayBpZiB0aGUgY2FwdHVyZSBwaGFzZSBpcyBzdXBwb3J0ZWQuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBldmVudCBpcyBzdXBwb3J0ZWQuXG4gKiBAaW50ZXJuYWxcbiAqIEBsaWNlbnNlIE1vZGVybml6ciAzLjAuMHByZSAoQ3VzdG9tIEJ1aWxkKSB8IE1JVFxuICovXG5mdW5jdGlvbiBpc0V2ZW50U3VwcG9ydGVkKGV2ZW50TmFtZVN1ZmZpeCwgY2FwdHVyZSkge1xuICBpZiAoIUV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSB8fCBjYXB0dXJlICYmICEoJ2FkZEV2ZW50TGlzdGVuZXInIGluIGRvY3VtZW50KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBldmVudE5hbWUgPSAnb24nICsgZXZlbnROYW1lU3VmZml4O1xuICB2YXIgaXNTdXBwb3J0ZWQgPSBldmVudE5hbWUgaW4gZG9jdW1lbnQ7XG5cbiAgaWYgKCFpc1N1cHBvcnRlZCkge1xuICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoZXZlbnROYW1lLCAncmV0dXJuOycpO1xuICAgIGlzU3VwcG9ydGVkID0gdHlwZW9mIGVsZW1lbnRbZXZlbnROYW1lXSA9PT0gJ2Z1bmN0aW9uJztcbiAgfVxuXG4gIGlmICghaXNTdXBwb3J0ZWQgJiYgdXNlSGFzRmVhdHVyZSAmJiBldmVudE5hbWVTdWZmaXggPT09ICd3aGVlbCcpIHtcbiAgICAvLyBUaGlzIGlzIHRoZSBvbmx5IHdheSB0byB0ZXN0IHN1cHBvcnQgZm9yIHRoZSBgd2hlZWxgIGV2ZW50IGluIElFOSsuXG4gICAgaXNTdXBwb3J0ZWQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCdFdmVudHMud2hlZWwnLCAnMy4wJyk7XG4gIH1cblxuICByZXR1cm4gaXNTdXBwb3J0ZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNFdmVudFN1cHBvcnRlZDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQHNlZSBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrL211bHRpcGFnZS90aGUtaW5wdXQtZWxlbWVudC5odG1sI2lucHV0LXR5cGUtYXR0ci1zdW1tYXJ5XG4gKi9cblxudmFyIHN1cHBvcnRlZElucHV0VHlwZXMgPSB7XG4gICdjb2xvcic6IHRydWUsXG4gICdkYXRlJzogdHJ1ZSxcbiAgJ2RhdGV0aW1lJzogdHJ1ZSxcbiAgJ2RhdGV0aW1lLWxvY2FsJzogdHJ1ZSxcbiAgJ2VtYWlsJzogdHJ1ZSxcbiAgJ21vbnRoJzogdHJ1ZSxcbiAgJ251bWJlcic6IHRydWUsXG4gICdwYXNzd29yZCc6IHRydWUsXG4gICdyYW5nZSc6IHRydWUsXG4gICdzZWFyY2gnOiB0cnVlLFxuICAndGVsJzogdHJ1ZSxcbiAgJ3RleHQnOiB0cnVlLFxuICAndGltZSc6IHRydWUsXG4gICd1cmwnOiB0cnVlLFxuICAnd2Vlayc6IHRydWVcbn07XG5cbmZ1bmN0aW9uIGlzVGV4dElucHV0RWxlbWVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnKSB7XG4gICAgcmV0dXJuICEhc3VwcG9ydGVkSW5wdXRUeXBlc1tlbGVtLnR5cGVdO1xuICB9XG5cbiAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNUZXh0SW5wdXRFbGVtZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIgPSByZXF1aXJlKCcuL2VzY2FwZVRleHRDb250ZW50Rm9yQnJvd3NlcicpO1xuXG4vKipcbiAqIEVzY2FwZXMgYXR0cmlidXRlIHZhbHVlIHRvIHByZXZlbnQgc2NyaXB0aW5nIGF0dGFja3MuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBlc2NhcGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEFuIGVzY2FwZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBxdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3Nlcih2YWx1ZSkge1xuICByZXR1cm4gJ1wiJyArIGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlcih2YWx1ZSkgKyAnXCInO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFdBUk5JTkc6IERPIE5PVCBtYW51YWxseSByZXF1aXJlIHRoaXMgbW9kdWxlLlxuICogVGhpcyBpcyBhIHJlcGxhY2VtZW50IGZvciBgaW52YXJpYW50KC4uLilgIHVzZWQgYnkgdGhlIGVycm9yIGNvZGUgc3lzdGVtXG4gKiBhbmQgd2lsbCBfb25seV8gYmUgcmVxdWlyZWQgYnkgdGhlIGNvcnJlc3BvbmRpbmcgYmFiZWwgcGFzcy5cbiAqIEl0IGFsd2F5cyB0aHJvd3MuXG4gKi9cblxuZnVuY3Rpb24gcmVhY3RQcm9kSW52YXJpYW50KGNvZGUpIHtcbiAgdmFyIGFyZ0NvdW50ID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG5cbiAgdmFyIG1lc3NhZ2UgPSAnTWluaWZpZWQgUmVhY3QgZXJyb3IgIycgKyBjb2RlICsgJzsgdmlzaXQgJyArICdodHRwOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvZXJyb3ItZGVjb2Rlci5odG1sP2ludmFyaWFudD0nICsgY29kZTtcblxuICBmb3IgKHZhciBhcmdJZHggPSAwOyBhcmdJZHggPCBhcmdDb3VudDsgYXJnSWR4KyspIHtcbiAgICBtZXNzYWdlICs9ICcmYXJnc1tdPScgKyBlbmNvZGVVUklDb21wb25lbnQoYXJndW1lbnRzW2FyZ0lkeCArIDFdKTtcbiAgfVxuXG4gIG1lc3NhZ2UgKz0gJyBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQnICsgJyBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4nO1xuXG4gIHZhciBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgZXJyb3IuZnJhbWVzVG9Qb3AgPSAxOyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IHJlYWN0UHJvZEludmFyaWFudCdzIG93biBmcmFtZVxuXG4gIHRocm93IGVycm9yO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlYWN0UHJvZEludmFyaWFudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RNb3VudCA9IHJlcXVpcmUoJy4vUmVhY3RNb3VudCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0TW91bnQucmVuZGVyU3VidHJlZUludG9Db250YWluZXI7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnZmJqcy9saWIvRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcbnZhciBET01OYW1lc3BhY2VzID0gcmVxdWlyZSgnLi9ET01OYW1lc3BhY2VzJyk7XG5cbnZhciBXSElURVNQQUNFX1RFU1QgPSAvXlsgXFxyXFxuXFx0XFxmXS87XG52YXIgTk9OVklTSUJMRV9URVNUID0gLzwoIS0tfGxpbmt8bm9zY3JpcHR8bWV0YXxzY3JpcHR8c3R5bGUpWyBcXHJcXG5cXHRcXGZcXC8+XS87XG5cbnZhciBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uID0gcmVxdWlyZSgnLi9jcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uJyk7XG5cbi8vIFNWRyB0ZW1wIGNvbnRhaW5lciBmb3IgSUUgbGFja2luZyBpbm5lckhUTUxcbnZhciByZXVzYWJsZVNWR0NvbnRhaW5lcjtcblxuLyoqXG4gKiBTZXQgdGhlIGlubmVySFRNTCBwcm9wZXJ0eSBvZiBhIG5vZGUsIGVuc3VyaW5nIHRoYXQgd2hpdGVzcGFjZSBpcyBwcmVzZXJ2ZWRcbiAqIGV2ZW4gaW4gSUU4LlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IGh0bWxcbiAqIEBpbnRlcm5hbFxuICovXG52YXIgc2V0SW5uZXJIVE1MID0gY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbiAobm9kZSwgaHRtbCkge1xuICAvLyBJRSBkb2VzIG5vdCBoYXZlIGlubmVySFRNTCBmb3IgU1ZHIG5vZGVzLCBzbyBpbnN0ZWFkIHdlIGluamVjdCB0aGVcbiAgLy8gbmV3IG1hcmt1cCBpbiBhIHRlbXAgbm9kZSBhbmQgdGhlbiBtb3ZlIHRoZSBjaGlsZCBub2RlcyBhY3Jvc3MgaW50b1xuICAvLyB0aGUgdGFyZ2V0IG5vZGVcbiAgaWYgKG5vZGUubmFtZXNwYWNlVVJJID09PSBET01OYW1lc3BhY2VzLnN2ZyAmJiAhKCdpbm5lckhUTUwnIGluIG5vZGUpKSB7XG4gICAgcmV1c2FibGVTVkdDb250YWluZXIgPSByZXVzYWJsZVNWR0NvbnRhaW5lciB8fCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICByZXVzYWJsZVNWR0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPHN2Zz4nICsgaHRtbCArICc8L3N2Zz4nO1xuICAgIHZhciBzdmdOb2RlID0gcmV1c2FibGVTVkdDb250YWluZXIuZmlyc3RDaGlsZDtcbiAgICB3aGlsZSAoc3ZnTm9kZS5maXJzdENoaWxkKSB7XG4gICAgICBub2RlLmFwcGVuZENoaWxkKHN2Z05vZGUuZmlyc3RDaGlsZCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIG5vZGUuaW5uZXJIVE1MID0gaHRtbDtcbiAgfVxufSk7XG5cbmlmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00pIHtcbiAgLy8gSUU4OiBXaGVuIHVwZGF0aW5nIGEganVzdCBjcmVhdGVkIG5vZGUgd2l0aCBpbm5lckhUTUwgb25seSBsZWFkaW5nXG4gIC8vIHdoaXRlc3BhY2UgaXMgcmVtb3ZlZC4gV2hlbiB1cGRhdGluZyBhbiBleGlzdGluZyBub2RlIHdpdGggaW5uZXJIVE1MXG4gIC8vIHdoaXRlc3BhY2UgaW4gcm9vdCBUZXh0Tm9kZXMgaXMgYWxzbyBjb2xsYXBzZWQuXG4gIC8vIEBzZWUgcXVpcmtzbW9kZS5vcmcvYnVncmVwb3J0cy9hcmNoaXZlcy8yMDA0LzExL2lubmVyaHRtbF9hbmRfdC5odG1sXG5cbiAgLy8gRmVhdHVyZSBkZXRlY3Rpb247IG9ubHkgSUU4IGlzIGtub3duIHRvIGJlaGF2ZSBpbXByb3Blcmx5IGxpa2UgdGhpcy5cbiAgdmFyIHRlc3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRlc3RFbGVtZW50LmlubmVySFRNTCA9ICcgJztcbiAgaWYgKHRlc3RFbGVtZW50LmlubmVySFRNTCA9PT0gJycpIHtcbiAgICBzZXRJbm5lckhUTUwgPSBmdW5jdGlvbiAobm9kZSwgaHRtbCkge1xuICAgICAgLy8gTWFnaWMgdGhlb3J5OiBJRTggc3VwcG9zZWRseSBkaWZmZXJlbnRpYXRlcyBiZXR3ZWVuIGFkZGVkIGFuZCB1cGRhdGVkXG4gICAgICAvLyBub2RlcyB3aGVuIHByb2Nlc3NpbmcgaW5uZXJIVE1MLCBpbm5lckhUTUwgb24gdXBkYXRlZCBub2RlcyBzdWZmZXJzXG4gICAgICAvLyBmcm9tIHdvcnNlIHdoaXRlc3BhY2UgYmVoYXZpb3IuIFJlLWFkZGluZyBhIG5vZGUgbGlrZSB0aGlzIHRyaWdnZXJzXG4gICAgICAvLyB0aGUgaW5pdGlhbCBhbmQgbW9yZSBmYXZvcmFibGUgd2hpdGVzcGFjZSBiZWhhdmlvci5cbiAgICAgIC8vIFRPRE86IFdoYXQgdG8gZG8gb24gYSBkZXRhY2hlZCBub2RlP1xuICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICBub2RlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5vZGUsIG5vZGUpO1xuICAgICAgfVxuXG4gICAgICAvLyBXZSBhbHNvIGltcGxlbWVudCBhIHdvcmthcm91bmQgZm9yIG5vbi12aXNpYmxlIHRhZ3MgZGlzYXBwZWFyaW5nIGludG9cbiAgICAgIC8vIHRoaW4gYWlyIG9uIElFOCwgdGhpcyBvbmx5IGhhcHBlbnMgaWYgdGhlcmUgaXMgbm8gdmlzaWJsZSB0ZXh0XG4gICAgICAvLyBpbi1mcm9udCBvZiB0aGUgbm9uLXZpc2libGUgdGFncy4gUGlnZ3liYWNrIG9uIHRoZSB3aGl0ZXNwYWNlIGZpeFxuICAgICAgLy8gYW5kIHNpbXBseSBjaGVjayBpZiBhbnkgbm9uLXZpc2libGUgdGFncyBhcHBlYXIgaW4gdGhlIHNvdXJjZS5cbiAgICAgIGlmIChXSElURVNQQUNFX1RFU1QudGVzdChodG1sKSB8fCBodG1sWzBdID09PSAnPCcgJiYgTk9OVklTSUJMRV9URVNULnRlc3QoaHRtbCkpIHtcbiAgICAgICAgLy8gUmVjb3ZlciBsZWFkaW5nIHdoaXRlc3BhY2UgYnkgdGVtcG9yYXJpbHkgcHJlcGVuZGluZyBhbnkgY2hhcmFjdGVyLlxuICAgICAgICAvLyBcXHVGRUZGIGhhcyB0aGUgcG90ZW50aWFsIGFkdmFudGFnZSBvZiBiZWluZyB6ZXJvLXdpZHRoL2ludmlzaWJsZS5cbiAgICAgICAgLy8gVWdsaWZ5SlMgZHJvcHMgVStGRUZGIGNoYXJzIHdoZW4gcGFyc2luZywgc28gdXNlIFN0cmluZy5mcm9tQ2hhckNvZGVcbiAgICAgICAgLy8gaW4gaG9wZXMgdGhhdCB0aGlzIGlzIHByZXNlcnZlZCBldmVuIGlmIFwiXFx1RkVGRlwiIGlzIHRyYW5zZm9ybWVkIHRvXG4gICAgICAgIC8vIHRoZSBhY3R1YWwgVW5pY29kZSBjaGFyYWN0ZXIgKGJ5IEJhYmVsLCBmb3IgZXhhbXBsZSkuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9taXNob28vVWdsaWZ5SlMyL2Jsb2IvdjIuNC4yMC9saWIvcGFyc2UuanMjTDIxNlxuICAgICAgICBub2RlLmlubmVySFRNTCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMHhGRUZGKSArIGh0bWw7XG5cbiAgICAgICAgLy8gZGVsZXRlRGF0YSBsZWF2ZXMgYW4gZW1wdHkgYFRleHROb2RlYCB3aGljaCBvZmZzZXRzIHRoZSBpbmRleCBvZiBhbGxcbiAgICAgICAgLy8gY2hpbGRyZW4uIERlZmluaXRlbHkgd2FudCB0byBhdm9pZCB0aGlzLlxuICAgICAgICB2YXIgdGV4dE5vZGUgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIGlmICh0ZXh0Tm9kZS5kYXRhLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQodGV4dE5vZGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRleHROb2RlLmRlbGV0ZURhdGEoMCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHRlc3RFbGVtZW50ID0gbnVsbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRJbm5lckhUTUw7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnZmJqcy9saWIvRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcbnZhciBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIgPSByZXF1aXJlKCcuL2VzY2FwZVRleHRDb250ZW50Rm9yQnJvd3NlcicpO1xudmFyIHNldElubmVySFRNTCA9IHJlcXVpcmUoJy4vc2V0SW5uZXJIVE1MJyk7XG5cbi8qKlxuICogU2V0IHRoZSB0ZXh0Q29udGVudCBwcm9wZXJ0eSBvZiBhIG5vZGUsIGVuc3VyaW5nIHRoYXQgd2hpdGVzcGFjZSBpcyBwcmVzZXJ2ZWRcbiAqIGV2ZW4gaW4gSUU4LiBpbm5lclRleHQgaXMgYSBwb29yIHN1YnN0aXR1dGUgZm9yIHRleHRDb250ZW50IGFuZCwgYW1vbmcgbWFueVxuICogaXNzdWVzLCBpbnNlcnRzIDxicj4gaW5zdGVhZCBvZiB0aGUgbGl0ZXJhbCBuZXdsaW5lIGNoYXJzLiBpbm5lckhUTUwgYmVoYXZlc1xuICogYXMgaXQgc2hvdWxkLlxuICpcbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gbm9kZVxuICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAqIEBpbnRlcm5hbFxuICovXG52YXIgc2V0VGV4dENvbnRlbnQgPSBmdW5jdGlvbiAobm9kZSwgdGV4dCkge1xuICBpZiAodGV4dCkge1xuICAgIHZhciBmaXJzdENoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuXG4gICAgaWYgKGZpcnN0Q2hpbGQgJiYgZmlyc3RDaGlsZCA9PT0gbm9kZS5sYXN0Q2hpbGQgJiYgZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSB0ZXh0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBub2RlLnRleHRDb250ZW50ID0gdGV4dDtcbn07XG5cbmlmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00pIHtcbiAgaWYgKCEoJ3RleHRDb250ZW50JyBpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKSB7XG4gICAgc2V0VGV4dENvbnRlbnQgPSBmdW5jdGlvbiAobm9kZSwgdGV4dCkge1xuICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgbm9kZS5ub2RlVmFsdWUgPSB0ZXh0O1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZXRJbm5lckhUTUwobm9kZSwgZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyKHRleHQpKTtcbiAgICB9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2V0VGV4dENvbnRlbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBHaXZlbiBhIGBwcmV2RWxlbWVudGAgYW5kIGBuZXh0RWxlbWVudGAsIGRldGVybWluZXMgaWYgdGhlIGV4aXN0aW5nXG4gKiBpbnN0YW5jZSBzaG91bGQgYmUgdXBkYXRlZCBhcyBvcHBvc2VkIHRvIGJlaW5nIGRlc3Ryb3llZCBvciByZXBsYWNlZCBieSBhIG5ld1xuICogaW5zdGFuY2UuIEJvdGggYXJndW1lbnRzIGFyZSBlbGVtZW50cy4gVGhpcyBlbnN1cmVzIHRoYXQgdGhpcyBsb2dpYyBjYW5cbiAqIG9wZXJhdGUgb24gc3RhdGVsZXNzIHRyZWVzIHdpdGhvdXQgYW55IGJhY2tpbmcgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBwcmV2RWxlbWVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0RWxlbWVudFxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZXhpc3RpbmcgaW5zdGFuY2Ugc2hvdWxkIGJlIHVwZGF0ZWQuXG4gKiBAcHJvdGVjdGVkXG4gKi9cblxuZnVuY3Rpb24gc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQocHJldkVsZW1lbnQsIG5leHRFbGVtZW50KSB7XG4gIHZhciBwcmV2RW1wdHkgPSBwcmV2RWxlbWVudCA9PT0gbnVsbCB8fCBwcmV2RWxlbWVudCA9PT0gZmFsc2U7XG4gIHZhciBuZXh0RW1wdHkgPSBuZXh0RWxlbWVudCA9PT0gbnVsbCB8fCBuZXh0RWxlbWVudCA9PT0gZmFsc2U7XG4gIGlmIChwcmV2RW1wdHkgfHwgbmV4dEVtcHR5KSB7XG4gICAgcmV0dXJuIHByZXZFbXB0eSA9PT0gbmV4dEVtcHR5O1xuICB9XG5cbiAgdmFyIHByZXZUeXBlID0gdHlwZW9mIHByZXZFbGVtZW50O1xuICB2YXIgbmV4dFR5cGUgPSB0eXBlb2YgbmV4dEVsZW1lbnQ7XG4gIGlmIChwcmV2VHlwZSA9PT0gJ3N0cmluZycgfHwgcHJldlR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIG5leHRUeXBlID09PSAnc3RyaW5nJyB8fCBuZXh0VHlwZSA9PT0gJ251bWJlcic7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5leHRUeXBlID09PSAnb2JqZWN0JyAmJiBwcmV2RWxlbWVudC50eXBlID09PSBuZXh0RWxlbWVudC50eXBlICYmIHByZXZFbGVtZW50LmtleSA9PT0gbmV4dEVsZW1lbnQua2V5O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVyJyk7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnRTeW1ib2wnKTtcblxudmFyIGdldEl0ZXJhdG9yRm4gPSByZXF1aXJlKCcuL2dldEl0ZXJhdG9yRm4nKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciBLZXlFc2NhcGVVdGlscyA9IHJlcXVpcmUoJy4vS2V5RXNjYXBlVXRpbHMnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgU0VQQVJBVE9SID0gJy4nO1xudmFyIFNVQlNFUEFSQVRPUiA9ICc6JztcblxuLyoqXG4gKiBUaGlzIGlzIGlubGluZWQgZnJvbSBSZWFjdEVsZW1lbnQgc2luY2UgdGhpcyBmaWxlIGlzIHNoYXJlZCBiZXR3ZWVuXG4gKiBpc29tb3JwaGljIGFuZCByZW5kZXJlcnMuIFdlIGNvdWxkIGV4dHJhY3QgdGhpcyB0byBhXG4gKlxuICovXG5cbi8qKlxuICogVE9ETzogVGVzdCB0aGF0IGEgc2luZ2xlIGNoaWxkIGFuZCBhbiBhcnJheSB3aXRoIG9uZSBpdGVtIGhhdmUgdGhlIHNhbWUga2V5XG4gKiBwYXR0ZXJuLlxuICovXG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG5cbi8qKlxuICogR2VuZXJhdGUgYSBrZXkgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyBhIGNvbXBvbmVudCB3aXRoaW4gYSBzZXQuXG4gKlxuICogQHBhcmFtIHsqfSBjb21wb25lbnQgQSBjb21wb25lbnQgdGhhdCBjb3VsZCBjb250YWluIGEgbWFudWFsIGtleS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCB0aGF0IGlzIHVzZWQgaWYgYSBtYW51YWwga2V5IGlzIG5vdCBwcm92aWRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZ2V0Q29tcG9uZW50S2V5KGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgLy8gRG8gc29tZSB0eXBlY2hlY2tpbmcgaGVyZSBzaW5jZSB3ZSBjYWxsIHRoaXMgYmxpbmRseS4gV2Ugd2FudCB0byBlbnN1cmVcbiAgLy8gdGhhdCB3ZSBkb24ndCBibG9jayBwb3RlbnRpYWwgZnV0dXJlIEVTIEFQSXMuXG4gIGlmIChjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgY29tcG9uZW50LmtleSAhPSBudWxsKSB7XG4gICAgLy8gRXhwbGljaXQga2V5XG4gICAgcmV0dXJuIEtleUVzY2FwZVV0aWxzLmVzY2FwZShjb21wb25lbnQua2V5KTtcbiAgfVxuICAvLyBJbXBsaWNpdCBrZXkgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggaW4gdGhlIHNldFxuICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHshc3RyaW5nfSBuYW1lU29GYXIgTmFtZSBvZiB0aGUga2V5IHBhdGggc28gZmFyLlxuICogQHBhcmFtIHshZnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIHRvIGludm9rZSB3aXRoIGVhY2ggY2hpbGQgZm91bmQuXG4gKiBAcGFyYW0gez8qfSB0cmF2ZXJzZUNvbnRleHQgVXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRocm91Z2hvdXQgdGhlIHRyYXZlcnNhbFxuICogcHJvY2Vzcy5cbiAqIEByZXR1cm4geyFudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhpcyBzdWJ0cmVlLlxuICovXG5mdW5jdGlvbiB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZHJlbiwgbmFtZVNvRmFyLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuO1xuXG4gIGlmICh0eXBlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAvLyBBbGwgb2YgdGhlIGFib3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC5cbiAgICBjaGlsZHJlbiA9IG51bGw7XG4gIH1cblxuICBpZiAoY2hpbGRyZW4gPT09IG51bGwgfHwgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicgfHxcbiAgLy8gVGhlIGZvbGxvd2luZyBpcyBpbmxpbmVkIGZyb20gUmVhY3RFbGVtZW50LiBUaGlzIG1lYW5zIHdlIGNhbiBvcHRpbWl6ZVxuICAvLyBzb21lIGNoZWNrcy4gUmVhY3QgRmliZXIgYWxzbyBpbmxpbmVzIHRoaXMgbG9naWMgZm9yIHNpbWlsYXIgcHVycG9zZXMuXG4gIHR5cGUgPT09ICdvYmplY3QnICYmIGNoaWxkcmVuLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICBjYWxsYmFjayh0cmF2ZXJzZUNvbnRleHQsIGNoaWxkcmVuLFxuICAgIC8vIElmIGl0J3MgdGhlIG9ubHkgY2hpbGQsIHRyZWF0IHRoZSBuYW1lIGFzIGlmIGl0IHdhcyB3cmFwcGVkIGluIGFuIGFycmF5XG4gICAgLy8gc28gdGhhdCBpdCdzIGNvbnNpc3RlbnQgaWYgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBncm93cy5cbiAgICBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkcmVuLCAwKSA6IG5hbWVTb0Zhcik7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICB2YXIgY2hpbGQ7XG4gIHZhciBuZXh0TmFtZTtcbiAgdmFyIHN1YnRyZWVDb3VudCA9IDA7IC8vIENvdW50IG9mIGNoaWxkcmVuIGZvdW5kIGluIHRoZSBjdXJyZW50IHN1YnRyZWUuXG4gIHZhciBuZXh0TmFtZVByZWZpeCA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgOiBuYW1lU29GYXIgKyBTVUJTRVBBUkFUT1I7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRDb21wb25lbnRLZXkoY2hpbGQsIGkpO1xuICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLCBuZXh0TmFtZSwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG4gICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChjaGlsZHJlbik7XG4gICAgICB2YXIgc3RlcDtcbiAgICAgIGlmIChpdGVyYXRvckZuICE9PSBjaGlsZHJlbi5lbnRyaWVzKSB7XG4gICAgICAgIHZhciBpaSA9IDA7XG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICBjaGlsZCA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldENvbXBvbmVudEtleShjaGlsZCwgaWkrKyk7XG4gICAgICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLCBuZXh0TmFtZSwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHZhciBtYXBzQXNDaGlsZHJlbkFkZGVuZHVtID0gJyc7XG4gICAgICAgICAgaWYgKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHZhciBtYXBzQXNDaGlsZHJlbk93bmVyTmFtZSA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuZ2V0TmFtZSgpO1xuICAgICAgICAgICAgaWYgKG1hcHNBc0NoaWxkcmVuT3duZXJOYW1lKSB7XG4gICAgICAgICAgICAgIG1hcHNBc0NoaWxkcmVuQWRkZW5kdW0gPSAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbWFwc0FzQ2hpbGRyZW5Pd25lck5hbWUgKyAnYC4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZGlkV2FybkFib3V0TWFwcywgJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHlldCBmdWxseSBzdXBwb3J0ZWQuIEl0IGlzIGFuICcgKyAnZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhhdCBtaWdodCBiZSByZW1vdmVkLiBDb252ZXJ0IGl0IHRvIGEgJyArICdzZXF1ZW5jZSAvIGl0ZXJhYmxlIG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4lcycsIG1hcHNBc0NoaWxkcmVuQWRkZW5kdW0pIDogdm9pZCAwO1xuICAgICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEl0ZXJhdG9yIHdpbGwgcHJvdmlkZSBlbnRyeSBbayx2XSB0dXBsZXMgcmF0aGVyIHRoYW4gdmFsdWVzLlxuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIGNoaWxkID0gZW50cnlbMV07XG4gICAgICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgS2V5RXNjYXBlVXRpbHMuZXNjYXBlKGVudHJ5WzBdKSArIFNVQlNFUEFSQVRPUiArIGdldENvbXBvbmVudEtleShjaGlsZCwgMCk7XG4gICAgICAgICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgYWRkZW5kdW0gPSAnJztcbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBhZGRlbmR1bSA9ICcgSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAnICsgJ2luc3RlYWQgb3Igd3JhcCB0aGUgb2JqZWN0IHVzaW5nIGNyZWF0ZUZyYWdtZW50KG9iamVjdCkgZnJvbSB0aGUgJyArICdSZWFjdCBhZGQtb25zLic7XG4gICAgICAgIGlmIChjaGlsZHJlbi5faXNSZWFjdEVsZW1lbnQpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSXQgbG9va3MgbGlrZSB5b3VcXCdyZSB1c2luZyBhbiBlbGVtZW50IGNyZWF0ZWQgYnkgYSBkaWZmZXJlbnQgJyArICd2ZXJzaW9uIG9mIFJlYWN0LiBNYWtlIHN1cmUgdG8gdXNlIG9ubHkgb25lIGNvcHkgb2YgUmVhY3QuJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgICAgICAgIHZhciBuYW1lID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5nZXROYW1lKCk7XG4gICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgIGFkZGVuZHVtICs9ICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBjaGlsZHJlblN0cmluZyA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgICAhZmFsc2UgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ09iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogJXMpLiVzJywgY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nLCBhZGRlbmR1bSkgOiBfcHJvZEludmFyaWFudCgnMzEnLCBjaGlsZHJlblN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRyZW5TdHJpbmcsIGFkZGVuZHVtKSA6IHZvaWQgMDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3VidHJlZUNvdW50O1xufVxuXG4vKipcbiAqIFRyYXZlcnNlcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAsIGJ1dFxuICogbWlnaHQgYWxzbyBiZSBzcGVjaWZpZWQgdGhyb3VnaCBhdHRyaWJ1dGVzOlxuICpcbiAqIC0gYHRyYXZlcnNlQWxsQ2hpbGRyZW4odGhpcy5wcm9wcy5jaGlsZHJlbiwgLi4uKWBcbiAqIC0gYHRyYXZlcnNlQWxsQ2hpbGRyZW4odGhpcy5wcm9wcy5sZWZ0UGFuZWxDaGlsZHJlbiwgLi4uKWBcbiAqXG4gKiBUaGUgYHRyYXZlcnNlQ29udGV4dGAgaXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdGhyb3VnaCB0aGVcbiAqIGVudGlyZSB0cmF2ZXJzYWwuIEl0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGFjY3VtdWxhdGlvbnMgb3IgYW55dGhpbmcgZWxzZSB0aGF0XG4gKiB0aGUgY2FsbGJhY2sgbWlnaHQgZmluZCByZWxldmFudC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIG9iamVjdC5cbiAqIEBwYXJhbSB7IWZ1bmN0aW9ufSBjYWxsYmFjayBUbyBpbnZva2UgdXBvbiB0cmF2ZXJzaW5nIGVhY2ggY2hpbGQuXG4gKiBAcGFyYW0gez8qfSB0cmF2ZXJzZUNvbnRleHQgQ29udGV4dCBmb3IgdHJhdmVyc2FsLlxuICogQHJldHVybiB7IW51bWJlcn0gVGhlIG51bWJlciBvZiBjaGlsZHJlbiBpbiB0aGlzIHN1YnRyZWUuXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZHJlbiwgJycsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRyYXZlcnNlQWxsQ2hpbGRyZW47IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlGdW5jdGlvbicpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciB2YWxpZGF0ZURPTU5lc3RpbmcgPSBlbXB0eUZ1bmN0aW9uO1xuXG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgLy8gVGhpcyB2YWxpZGF0aW9uIGNvZGUgd2FzIHdyaXR0ZW4gYmFzZWQgb24gdGhlIEhUTUw1IHBhcnNpbmcgc3BlYzpcbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tc2NvcGVcbiAgLy9cbiAgLy8gTm90ZTogdGhpcyBkb2VzIG5vdCBjYXRjaCBhbGwgaW52YWxpZCBuZXN0aW5nLCBub3IgZG9lcyBpdCB0cnkgdG8gKGFzIGl0J3NcbiAgLy8gbm90IGNsZWFyIHdoYXQgcHJhY3RpY2FsIGJlbmVmaXQgZG9pbmcgc28gcHJvdmlkZXMpOyBpbnN0ZWFkLCB3ZSB3YXJuIG9ubHlcbiAgLy8gZm9yIGNhc2VzIHdoZXJlIHRoZSBwYXJzZXIgd2lsbCBnaXZlIGEgcGFyc2UgdHJlZSBkaWZmZXJpbmcgZnJvbSB3aGF0IFJlYWN0XG4gIC8vIGludGVuZGVkLiBGb3IgZXhhbXBsZSwgPGI+PGRpdj48L2Rpdj48L2I+IGlzIGludmFsaWQgYnV0IHdlIGRvbid0IHdhcm5cbiAgLy8gYmVjYXVzZSBpdCBzdGlsbCBwYXJzZXMgY29ycmVjdGx5OyB3ZSBkbyB3YXJuIGZvciBvdGhlciBjYXNlcyBsaWtlIG5lc3RlZFxuICAvLyA8cD4gdGFncyB3aGVyZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZWNvbmQgZWxlbWVudCBpbXBsaWNpdGx5IGNsb3NlcyB0aGVcbiAgLy8gZmlyc3QsIGNhdXNpbmcgYSBjb25mdXNpbmcgbWVzcy5cblxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNzcGVjaWFsXG4gIHZhciBzcGVjaWFsVGFncyA9IFsnYWRkcmVzcycsICdhcHBsZXQnLCAnYXJlYScsICdhcnRpY2xlJywgJ2FzaWRlJywgJ2Jhc2UnLCAnYmFzZWZvbnQnLCAnYmdzb3VuZCcsICdibG9ja3F1b3RlJywgJ2JvZHknLCAnYnInLCAnYnV0dG9uJywgJ2NhcHRpb24nLCAnY2VudGVyJywgJ2NvbCcsICdjb2xncm91cCcsICdkZCcsICdkZXRhaWxzJywgJ2RpcicsICdkaXYnLCAnZGwnLCAnZHQnLCAnZW1iZWQnLCAnZmllbGRzZXQnLCAnZmlnY2FwdGlvbicsICdmaWd1cmUnLCAnZm9vdGVyJywgJ2Zvcm0nLCAnZnJhbWUnLCAnZnJhbWVzZXQnLCAnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnLCAnaGVhZCcsICdoZWFkZXInLCAnaGdyb3VwJywgJ2hyJywgJ2h0bWwnLCAnaWZyYW1lJywgJ2ltZycsICdpbnB1dCcsICdpc2luZGV4JywgJ2xpJywgJ2xpbmsnLCAnbGlzdGluZycsICdtYWluJywgJ21hcnF1ZWUnLCAnbWVudScsICdtZW51aXRlbScsICdtZXRhJywgJ25hdicsICdub2VtYmVkJywgJ25vZnJhbWVzJywgJ25vc2NyaXB0JywgJ29iamVjdCcsICdvbCcsICdwJywgJ3BhcmFtJywgJ3BsYWludGV4dCcsICdwcmUnLCAnc2NyaXB0JywgJ3NlY3Rpb24nLCAnc2VsZWN0JywgJ3NvdXJjZScsICdzdHlsZScsICdzdW1tYXJ5JywgJ3RhYmxlJywgJ3Rib2R5JywgJ3RkJywgJ3RlbXBsYXRlJywgJ3RleHRhcmVhJywgJ3Rmb290JywgJ3RoJywgJ3RoZWFkJywgJ3RpdGxlJywgJ3RyJywgJ3RyYWNrJywgJ3VsJywgJ3dicicsICd4bXAnXTtcblxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1zY29wZVxuICB2YXIgaW5TY29wZVRhZ3MgPSBbJ2FwcGxldCcsICdjYXB0aW9uJywgJ2h0bWwnLCAndGFibGUnLCAndGQnLCAndGgnLCAnbWFycXVlZScsICdvYmplY3QnLCAndGVtcGxhdGUnLFxuXG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2h0bWwtaW50ZWdyYXRpb24tcG9pbnRcbiAgLy8gVE9ETzogRGlzdGluZ3Vpc2ggYnkgbmFtZXNwYWNlIGhlcmUgLS0gZm9yIDx0aXRsZT4sIGluY2x1ZGluZyBpdCBoZXJlXG4gIC8vIGVycnMgb24gdGhlIHNpZGUgb2YgZmV3ZXIgd2FybmluZ3NcbiAgJ2ZvcmVpZ25PYmplY3QnLCAnZGVzYycsICd0aXRsZSddO1xuXG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLWJ1dHRvbi1zY29wZVxuICB2YXIgYnV0dG9uU2NvcGVUYWdzID0gaW5TY29wZVRhZ3MuY29uY2F0KFsnYnV0dG9uJ10pO1xuXG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2dlbmVyYXRlLWltcGxpZWQtZW5kLXRhZ3NcbiAgdmFyIGltcGxpZWRFbmRUYWdzID0gWydkZCcsICdkdCcsICdsaScsICdvcHRpb24nLCAnb3B0Z3JvdXAnLCAncCcsICdycCcsICdydCddO1xuXG4gIHZhciBlbXB0eUFuY2VzdG9ySW5mbyA9IHtcbiAgICBjdXJyZW50OiBudWxsLFxuXG4gICAgZm9ybVRhZzogbnVsbCxcbiAgICBhVGFnSW5TY29wZTogbnVsbCxcbiAgICBidXR0b25UYWdJblNjb3BlOiBudWxsLFxuICAgIG5vYnJUYWdJblNjb3BlOiBudWxsLFxuICAgIHBUYWdJbkJ1dHRvblNjb3BlOiBudWxsLFxuXG4gICAgbGlzdEl0ZW1UYWdBdXRvY2xvc2luZzogbnVsbCxcbiAgICBkbEl0ZW1UYWdBdXRvY2xvc2luZzogbnVsbFxuICB9O1xuXG4gIHZhciB1cGRhdGVkQW5jZXN0b3JJbmZvID0gZnVuY3Rpb24gKG9sZEluZm8sIHRhZywgaW5zdGFuY2UpIHtcbiAgICB2YXIgYW5jZXN0b3JJbmZvID0gX2Fzc2lnbih7fSwgb2xkSW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbyk7XG4gICAgdmFyIGluZm8gPSB7IHRhZzogdGFnLCBpbnN0YW5jZTogaW5zdGFuY2UgfTtcblxuICAgIGlmIChpblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGJ1dHRvblNjb3BlVGFncy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGUgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFNlZSBydWxlcyBmb3IgJ2xpJywgJ2RkJywgJ2R0JyBzdGFydCB0YWdzIGluXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluYm9keVxuICAgIGlmIChzcGVjaWFsVGFncy5pbmRleE9mKHRhZykgIT09IC0xICYmIHRhZyAhPT0gJ2FkZHJlc3MnICYmIHRhZyAhPT0gJ2RpdicgJiYgdGFnICE9PSAncCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDtcbiAgICAgIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZyA9IG51bGw7XG4gICAgfVxuXG4gICAgYW5jZXN0b3JJbmZvLmN1cnJlbnQgPSBpbmZvO1xuXG4gICAgaWYgKHRhZyA9PT0gJ2Zvcm0nKSB7XG4gICAgICBhbmNlc3RvckluZm8uZm9ybVRhZyA9IGluZm87XG4gICAgfVxuICAgIGlmICh0YWcgPT09ICdhJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmFUYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG4gICAgaWYgKHRhZyA9PT0gJ2J1dHRvbicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlID0gaW5mbztcbiAgICB9XG4gICAgaWYgKHRhZyA9PT0gJ25vYnInKSB7XG4gICAgICBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGUgPSBpbmZvO1xuICAgIH1cbiAgICBpZiAodGFnID09PSAncCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IGluZm87XG4gICAgfVxuICAgIGlmICh0YWcgPT09ICdsaScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG4gICAgaWYgKHRhZyA9PT0gJ2RkJyB8fCB0YWcgPT09ICdkdCcpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZyA9IGluZm87XG4gICAgfVxuXG4gICAgcmV0dXJuIGFuY2VzdG9ySW5mbztcbiAgfTtcblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyXG4gICAqL1xuICB2YXIgaXNUYWdWYWxpZFdpdGhQYXJlbnQgPSBmdW5jdGlvbiAodGFnLCBwYXJlbnRUYWcpIHtcbiAgICAvLyBGaXJzdCwgbGV0J3MgY2hlY2sgaWYgd2UncmUgaW4gYW4gdW51c3VhbCBwYXJzaW5nIG1vZGUuLi5cbiAgICBzd2l0Y2ggKHBhcmVudFRhZykge1xuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluc2VsZWN0XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnb3B0aW9uJyB8fCB0YWcgPT09ICdvcHRncm91cCcgfHwgdGFnID09PSAnI3RleHQnO1xuICAgICAgY2FzZSAnb3B0Z3JvdXAnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnb3B0aW9uJyB8fCB0YWcgPT09ICcjdGV4dCc7XG4gICAgICAvLyBTdHJpY3RseSBzcGVha2luZywgc2VlaW5nIGFuIDxvcHRpb24+IGRvZXNuJ3QgbWVhbiB3ZSdyZSBpbiBhIDxzZWxlY3Q+XG4gICAgICAvLyBidXRcbiAgICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICcjdGV4dCc7XG5cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRkXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5jYXB0aW9uXG4gICAgICAvLyBObyBzcGVjaWFsIGJlaGF2aW9yIHNpbmNlIHRoZXNlIHJ1bGVzIGZhbGwgYmFjayB0byBcImluIGJvZHlcIiBtb2RlIGZvclxuICAgICAgLy8gYWxsIGV4Y2VwdCBzcGVjaWFsIHRhYmxlIG5vZGVzIHdoaWNoIGNhdXNlIGJhZCBwYXJzaW5nIGJlaGF2aW9yIGFueXdheS5cblxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludHJcbiAgICAgIGNhc2UgJ3RyJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ3RoJyB8fCB0YWcgPT09ICd0ZCcgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50Ym9keVxuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgY2FzZSAndGhlYWQnOlxuICAgICAgY2FzZSAndGZvb3QnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAndHInIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcblxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluY29sZ3JvdXBcbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2NvbCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50YWJsZVxuICAgICAgY2FzZSAndGFibGUnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnY2FwdGlvbicgfHwgdGFnID09PSAnY29sZ3JvdXAnIHx8IHRhZyA9PT0gJ3Rib2R5JyB8fCB0YWcgPT09ICd0Zm9vdCcgfHwgdGFnID09PSAndGhlYWQnIHx8IHRhZyA9PT0gJ3N0eWxlJyB8fCB0YWcgPT09ICdzY3JpcHQnIHx8IHRhZyA9PT0gJ3RlbXBsYXRlJztcblxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluaGVhZFxuICAgICAgY2FzZSAnaGVhZCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdiYXNlJyB8fCB0YWcgPT09ICdiYXNlZm9udCcgfHwgdGFnID09PSAnYmdzb3VuZCcgfHwgdGFnID09PSAnbGluaycgfHwgdGFnID09PSAnbWV0YScgfHwgdGFnID09PSAndGl0bGUnIHx8IHRhZyA9PT0gJ25vc2NyaXB0JyB8fCB0YWcgPT09ICdub2ZyYW1lcycgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zZW1hbnRpY3MuaHRtbCN0aGUtaHRtbC1lbGVtZW50XG4gICAgICBjYXNlICdodG1sJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2hlYWQnIHx8IHRhZyA9PT0gJ2JvZHknO1xuICAgICAgY2FzZSAnI2RvY3VtZW50JzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2h0bWwnO1xuICAgIH1cblxuICAgIC8vIFByb2JhYmx5IGluIHRoZSBcImluIGJvZHlcIiBwYXJzaW5nIG1vZGUsIHNvIHdlIG91dGxhdyBvbmx5IHRhZyBjb21ib3NcbiAgICAvLyB3aGVyZSB0aGUgcGFyc2luZyBydWxlcyBjYXVzZSBpbXBsaWNpdCBvcGVucyBvciBjbG9zZXMgdG8gYmUgYWRkZWQuXG4gICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWluYm9keVxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdoMSc6XG4gICAgICBjYXNlICdoMic6XG4gICAgICBjYXNlICdoMyc6XG4gICAgICBjYXNlICdoNCc6XG4gICAgICBjYXNlICdoNSc6XG4gICAgICBjYXNlICdoNic6XG4gICAgICAgIHJldHVybiBwYXJlbnRUYWcgIT09ICdoMScgJiYgcGFyZW50VGFnICE9PSAnaDInICYmIHBhcmVudFRhZyAhPT0gJ2gzJyAmJiBwYXJlbnRUYWcgIT09ICdoNCcgJiYgcGFyZW50VGFnICE9PSAnaDUnICYmIHBhcmVudFRhZyAhPT0gJ2g2JztcblxuICAgICAgY2FzZSAncnAnOlxuICAgICAgY2FzZSAncnQnOlxuICAgICAgICByZXR1cm4gaW1wbGllZEVuZFRhZ3MuaW5kZXhPZihwYXJlbnRUYWcpID09PSAtMTtcblxuICAgICAgY2FzZSAnYm9keSc6XG4gICAgICBjYXNlICdjYXB0aW9uJzpcbiAgICAgIGNhc2UgJ2NvbCc6XG4gICAgICBjYXNlICdjb2xncm91cCc6XG4gICAgICBjYXNlICdmcmFtZSc6XG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgY2FzZSAndGJvZHknOlxuICAgICAgY2FzZSAndGQnOlxuICAgICAgY2FzZSAndGZvb3QnOlxuICAgICAgY2FzZSAndGgnOlxuICAgICAgY2FzZSAndGhlYWQnOlxuICAgICAgY2FzZSAndHInOlxuICAgICAgICAvLyBUaGVzZSB0YWdzIGFyZSBvbmx5IHZhbGlkIHdpdGggYSBmZXcgcGFyZW50cyB0aGF0IGhhdmUgc3BlY2lhbCBjaGlsZFxuICAgICAgICAvLyBwYXJzaW5nIHJ1bGVzIC0tIGlmIHdlJ3JlIGRvd24gaGVyZSwgdGhlbiBub25lIG9mIHRob3NlIG1hdGNoZWQgYW5kXG4gICAgICAgIC8vIHNvIHdlIGFsbG93IGl0IG9ubHkgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBwYXJlbnQgaXMsIGFzIGFsbCBvdGhlclxuICAgICAgICAvLyBjYXNlcyBhcmUgaW52YWxpZC5cbiAgICAgICAgcmV0dXJuIHBhcmVudFRhZyA9PSBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXJcbiAgICovXG4gIHZhciBmaW5kSW52YWxpZEFuY2VzdG9yRm9yVGFnID0gZnVuY3Rpb24gKHRhZywgYW5jZXN0b3JJbmZvKSB7XG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2FkZHJlc3MnOlxuICAgICAgY2FzZSAnYXJ0aWNsZSc6XG4gICAgICBjYXNlICdhc2lkZSc6XG4gICAgICBjYXNlICdibG9ja3F1b3RlJzpcbiAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICBjYXNlICdkZXRhaWxzJzpcbiAgICAgIGNhc2UgJ2RpYWxvZyc6XG4gICAgICBjYXNlICdkaXInOlxuICAgICAgY2FzZSAnZGl2JzpcbiAgICAgIGNhc2UgJ2RsJzpcbiAgICAgIGNhc2UgJ2ZpZWxkc2V0JzpcbiAgICAgIGNhc2UgJ2ZpZ2NhcHRpb24nOlxuICAgICAgY2FzZSAnZmlndXJlJzpcbiAgICAgIGNhc2UgJ2Zvb3Rlcic6XG4gICAgICBjYXNlICdoZWFkZXInOlxuICAgICAgY2FzZSAnaGdyb3VwJzpcbiAgICAgIGNhc2UgJ21haW4nOlxuICAgICAgY2FzZSAnbWVudSc6XG4gICAgICBjYXNlICduYXYnOlxuICAgICAgY2FzZSAnb2wnOlxuICAgICAgY2FzZSAncCc6XG4gICAgICBjYXNlICdzZWN0aW9uJzpcbiAgICAgIGNhc2UgJ3N1bW1hcnknOlxuICAgICAgY2FzZSAndWwnOlxuICAgICAgY2FzZSAncHJlJzpcbiAgICAgIGNhc2UgJ2xpc3RpbmcnOlxuICAgICAgY2FzZSAndGFibGUnOlxuICAgICAgY2FzZSAnaHInOlxuICAgICAgY2FzZSAneG1wJzpcbiAgICAgIGNhc2UgJ2gxJzpcbiAgICAgIGNhc2UgJ2gyJzpcbiAgICAgIGNhc2UgJ2gzJzpcbiAgICAgIGNhc2UgJ2g0JzpcbiAgICAgIGNhc2UgJ2g1JzpcbiAgICAgIGNhc2UgJ2g2JzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZTtcblxuICAgICAgY2FzZSAnZm9ybSc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uZm9ybVRhZyB8fCBhbmNlc3RvckluZm8ucFRhZ0luQnV0dG9uU2NvcGU7XG5cbiAgICAgIGNhc2UgJ2xpJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5saXN0SXRlbVRhZ0F1dG9jbG9zaW5nO1xuXG4gICAgICBjYXNlICdkZCc6XG4gICAgICBjYXNlICdkdCc6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uZGxJdGVtVGFnQXV0b2Nsb3Npbmc7XG5cbiAgICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZTtcblxuICAgICAgY2FzZSAnYSc6XG4gICAgICAgIC8vIFNwZWMgc2F5cyBzb21ldGhpbmcgYWJvdXQgc3RvcmluZyBhIGxpc3Qgb2YgbWFya2VycywgYnV0IGl0IHNvdW5kc1xuICAgICAgICAvLyBlcXVpdmFsZW50IHRvIHRoaXMgY2hlY2suXG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGU7XG5cbiAgICAgIGNhc2UgJ25vYnInOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLm5vYnJUYWdJblNjb3BlO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHaXZlbiBhIFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50IGluc3RhbmNlLCByZXR1cm4gYSBsaXN0IG9mIGl0cyByZWN1cnNpdmVcbiAgICogb3duZXJzLCBzdGFydGluZyBhdCB0aGUgcm9vdCBhbmQgZW5kaW5nIHdpdGggdGhlIGluc3RhbmNlIGl0c2VsZi5cbiAgICovXG4gIHZhciBmaW5kT3duZXJTdGFjayA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgIGlmICghaW5zdGFuY2UpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICB2YXIgc3RhY2sgPSBbXTtcbiAgICBkbyB7XG4gICAgICBzdGFjay5wdXNoKGluc3RhbmNlKTtcbiAgICB9IHdoaWxlIChpbnN0YW5jZSA9IGluc3RhbmNlLl9jdXJyZW50RWxlbWVudC5fb3duZXIpO1xuICAgIHN0YWNrLnJldmVyc2UoKTtcbiAgICByZXR1cm4gc3RhY2s7XG4gIH07XG5cbiAgdmFyIGRpZFdhcm4gPSB7fTtcblxuICB2YWxpZGF0ZURPTU5lc3RpbmcgPSBmdW5jdGlvbiAoY2hpbGRUYWcsIGNoaWxkVGV4dCwgY2hpbGRJbnN0YW5jZSwgYW5jZXN0b3JJbmZvKSB7XG4gICAgYW5jZXN0b3JJbmZvID0gYW5jZXN0b3JJbmZvIHx8IGVtcHR5QW5jZXN0b3JJbmZvO1xuICAgIHZhciBwYXJlbnRJbmZvID0gYW5jZXN0b3JJbmZvLmN1cnJlbnQ7XG4gICAgdmFyIHBhcmVudFRhZyA9IHBhcmVudEluZm8gJiYgcGFyZW50SW5mby50YWc7XG5cbiAgICBpZiAoY2hpbGRUZXh0ICE9IG51bGwpIHtcbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhjaGlsZFRhZyA9PSBudWxsLCAndmFsaWRhdGVET01OZXN0aW5nOiB3aGVuIGNoaWxkVGV4dCBpcyBwYXNzZWQsIGNoaWxkVGFnIHNob3VsZCBiZSBudWxsJykgOiB2b2lkIDA7XG4gICAgICBjaGlsZFRhZyA9ICcjdGV4dCc7XG4gICAgfVxuXG4gICAgdmFyIGludmFsaWRQYXJlbnQgPSBpc1RhZ1ZhbGlkV2l0aFBhcmVudChjaGlsZFRhZywgcGFyZW50VGFnKSA/IG51bGwgOiBwYXJlbnRJbmZvO1xuICAgIHZhciBpbnZhbGlkQW5jZXN0b3IgPSBpbnZhbGlkUGFyZW50ID8gbnVsbCA6IGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcoY2hpbGRUYWcsIGFuY2VzdG9ySW5mbyk7XG4gICAgdmFyIHByb2JsZW1hdGljID0gaW52YWxpZFBhcmVudCB8fCBpbnZhbGlkQW5jZXN0b3I7XG5cbiAgICBpZiAocHJvYmxlbWF0aWMpIHtcbiAgICAgIHZhciBhbmNlc3RvclRhZyA9IHByb2JsZW1hdGljLnRhZztcbiAgICAgIHZhciBhbmNlc3Rvckluc3RhbmNlID0gcHJvYmxlbWF0aWMuaW5zdGFuY2U7XG5cbiAgICAgIHZhciBjaGlsZE93bmVyID0gY2hpbGRJbnN0YW5jZSAmJiBjaGlsZEluc3RhbmNlLl9jdXJyZW50RWxlbWVudC5fb3duZXI7XG4gICAgICB2YXIgYW5jZXN0b3JPd25lciA9IGFuY2VzdG9ySW5zdGFuY2UgJiYgYW5jZXN0b3JJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQuX293bmVyO1xuXG4gICAgICB2YXIgY2hpbGRPd25lcnMgPSBmaW5kT3duZXJTdGFjayhjaGlsZE93bmVyKTtcbiAgICAgIHZhciBhbmNlc3Rvck93bmVycyA9IGZpbmRPd25lclN0YWNrKGFuY2VzdG9yT3duZXIpO1xuXG4gICAgICB2YXIgbWluU3RhY2tMZW4gPSBNYXRoLm1pbihjaGlsZE93bmVycy5sZW5ndGgsIGFuY2VzdG9yT3duZXJzLmxlbmd0aCk7XG4gICAgICB2YXIgaTtcblxuICAgICAgdmFyIGRlZXBlc3RDb21tb24gPSAtMTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBtaW5TdGFja0xlbjsgaSsrKSB7XG4gICAgICAgIGlmIChjaGlsZE93bmVyc1tpXSA9PT0gYW5jZXN0b3JPd25lcnNbaV0pIHtcbiAgICAgICAgICBkZWVwZXN0Q29tbW9uID0gaTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgVU5LTk9XTiA9ICcodW5rbm93biknO1xuICAgICAgdmFyIGNoaWxkT3duZXJOYW1lcyA9IGNoaWxkT3duZXJzLnNsaWNlKGRlZXBlc3RDb21tb24gKyAxKS5tYXAoZnVuY3Rpb24gKGluc3QpIHtcbiAgICAgICAgcmV0dXJuIGluc3QuZ2V0TmFtZSgpIHx8IFVOS05PV047XG4gICAgICB9KTtcbiAgICAgIHZhciBhbmNlc3Rvck93bmVyTmFtZXMgPSBhbmNlc3Rvck93bmVycy5zbGljZShkZWVwZXN0Q29tbW9uICsgMSkubWFwKGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgICAgIHJldHVybiBpbnN0LmdldE5hbWUoKSB8fCBVTktOT1dOO1xuICAgICAgfSk7XG4gICAgICB2YXIgb3duZXJJbmZvID0gW10uY29uY2F0KFxuICAgICAgLy8gSWYgdGhlIHBhcmVudCBhbmQgY2hpbGQgaW5zdGFuY2VzIGhhdmUgYSBjb21tb24gb3duZXIgYW5jZXN0b3IsIHN0YXJ0XG4gICAgICAvLyB3aXRoIHRoYXQgLS0gb3RoZXJ3aXNlIHdlIGp1c3Qgc3RhcnQgd2l0aCB0aGUgcGFyZW50J3Mgb3duZXJzLlxuICAgICAgZGVlcGVzdENvbW1vbiAhPT0gLTEgPyBjaGlsZE93bmVyc1tkZWVwZXN0Q29tbW9uXS5nZXROYW1lKCkgfHwgVU5LTk9XTiA6IFtdLCBhbmNlc3Rvck93bmVyTmFtZXMsIGFuY2VzdG9yVGFnLFxuICAgICAgLy8gSWYgd2UncmUgd2FybmluZyBhYm91dCBhbiBpbnZhbGlkIChub24tcGFyZW50KSBhbmNlc3RyeSwgYWRkICcuLi4nXG4gICAgICBpbnZhbGlkQW5jZXN0b3IgPyBbJy4uLiddIDogW10sIGNoaWxkT3duZXJOYW1lcywgY2hpbGRUYWcpLmpvaW4oJyA+ICcpO1xuXG4gICAgICB2YXIgd2FybktleSA9ICEhaW52YWxpZFBhcmVudCArICd8JyArIGNoaWxkVGFnICsgJ3wnICsgYW5jZXN0b3JUYWcgKyAnfCcgKyBvd25lckluZm87XG4gICAgICBpZiAoZGlkV2Fyblt3YXJuS2V5XSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBkaWRXYXJuW3dhcm5LZXldID0gdHJ1ZTtcblxuICAgICAgdmFyIHRhZ0Rpc3BsYXlOYW1lID0gY2hpbGRUYWc7XG4gICAgICB2YXIgd2hpdGVzcGFjZUluZm8gPSAnJztcbiAgICAgIGlmIChjaGlsZFRhZyA9PT0gJyN0ZXh0Jykge1xuICAgICAgICBpZiAoL1xcUy8udGVzdChjaGlsZFRleHQpKSB7XG4gICAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnVGV4dCBub2Rlcyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnV2hpdGVzcGFjZSB0ZXh0IG5vZGVzJztcbiAgICAgICAgICB3aGl0ZXNwYWNlSW5mbyA9ICcgTWFrZSBzdXJlIHlvdSBkb25cXCd0IGhhdmUgYW55IGV4dHJhIHdoaXRlc3BhY2UgYmV0d2VlbiB0YWdzIG9uICcgKyAnZWFjaCBsaW5lIG9mIHlvdXIgc291cmNlIGNvZGUuJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFnRGlzcGxheU5hbWUgPSAnPCcgKyBjaGlsZFRhZyArICc+JztcbiAgICAgIH1cblxuICAgICAgaWYgKGludmFsaWRQYXJlbnQpIHtcbiAgICAgICAgdmFyIGluZm8gPSAnJztcbiAgICAgICAgaWYgKGFuY2VzdG9yVGFnID09PSAndGFibGUnICYmIGNoaWxkVGFnID09PSAndHInKSB7XG4gICAgICAgICAgaW5mbyArPSAnIEFkZCBhIDx0Ym9keT4gdG8geW91ciBjb2RlIHRvIG1hdGNoIHRoZSBET00gdHJlZSBnZW5lcmF0ZWQgYnkgJyArICd0aGUgYnJvd3Nlci4nO1xuICAgICAgICB9XG4gICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgY2hpbGQgb2YgPCVzPi4lcyAnICsgJ1NlZSAlcy4lcycsIHRhZ0Rpc3BsYXlOYW1lLCBhbmNlc3RvclRhZywgd2hpdGVzcGFjZUluZm8sIG93bmVySW5mbywgaW5mbykgOiB2b2lkIDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICd2YWxpZGF0ZURPTU5lc3RpbmcoLi4uKTogJXMgY2Fubm90IGFwcGVhciBhcyBhIGRlc2NlbmRhbnQgb2YgJyArICc8JXM+LiBTZWUgJXMuJywgdGFnRGlzcGxheU5hbWUsIGFuY2VzdG9yVGFnLCBvd25lckluZm8pIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB2YWxpZGF0ZURPTU5lc3RpbmcudXBkYXRlZEFuY2VzdG9ySW5mbyA9IHVwZGF0ZWRBbmNlc3RvckluZm87XG5cbiAgLy8gRm9yIHRlc3RpbmdcbiAgdmFsaWRhdGVET01OZXN0aW5nLmlzVGFnVmFsaWRJbkNvbnRleHQgPSBmdW5jdGlvbiAodGFnLCBhbmNlc3RvckluZm8pIHtcbiAgICBhbmNlc3RvckluZm8gPSBhbmNlc3RvckluZm8gfHwgZW1wdHlBbmNlc3RvckluZm87XG4gICAgdmFyIHBhcmVudEluZm8gPSBhbmNlc3RvckluZm8uY3VycmVudDtcbiAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50SW5mbyAmJiBwYXJlbnRJbmZvLnRhZztcbiAgICByZXR1cm4gaXNUYWdWYWxpZFdpdGhQYXJlbnQodGFnLCBwYXJlbnRUYWcpICYmICFmaW5kSW52YWxpZEFuY2VzdG9yRm9yVGFnKHRhZywgYW5jZXN0b3JJbmZvKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB2YWxpZGF0ZURPTU5lc3Rpbmc7IiwiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwicmVhY3RcIiksIHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtcInJlYWN0XCIsIFwicHJvcC10eXBlc1wiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJEcm9wem9uZVwiXSA9IGZhY3RvcnkocmVxdWlyZShcInJlYWN0XCIpLCByZXF1aXJlKFwicHJvcC10eXBlc1wiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiRHJvcHpvbmVcIl0gPSBmYWN0b3J5KHJvb3RbXCJyZWFjdFwiXSwgcm9vdFtcInByb3AtdHlwZXNcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8yX18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfM19fKSB7XG5yZXR1cm4gLyoqKioqKi8gKGZ1bmN0aW9uKG1vZHVsZXMpIHsgLy8gd2VicGFja0Jvb3RzdHJhcFxuLyoqKioqKi8gXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuLyoqKioqKi8gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuLyoqKioqKi8gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKVxuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0ZXhwb3J0czoge30sXG4vKioqKioqLyBcdFx0XHRpZDogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsb2FkZWQ6IGZhbHNlXG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbi8qKioqKiovIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4vKioqKioqLyBcdH1cbi8qKioqKiovXG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbi8qKioqKiovIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oMCk7XG4vKioqKioqLyB9KVxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbi8qKioqKiovIChbXG4vKiAwICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovKGZ1bmN0aW9uKHByb2Nlc3MpIHsndXNlIHN0cmljdCc7XG5cdFxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0ICB2YWx1ZTogdHJ1ZVxuXHR9KTtcblx0XG5cdHZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cdFxuXHR2YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXHRcblx0dmFyIF9yZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMik7XG5cdFxuXHR2YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblx0XG5cdHZhciBfcHJvcFR5cGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblx0XG5cdHZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cdFxuXHR2YXIgX2F0dHJBY2NlcHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDQpO1xuXHRcblx0dmFyIF9hdHRyQWNjZXB0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2F0dHJBY2NlcHQpO1xuXHRcblx0dmFyIF9nZXREYXRhVHJhbnNmZXJJdGVtcyA9IF9fd2VicGFja19yZXF1aXJlX18oNSk7XG5cdFxuXHR2YXIgX2dldERhdGFUcmFuc2Zlckl0ZW1zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldERhdGFUcmFuc2Zlckl0ZW1zKTtcblx0XG5cdGZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cdFxuXHRmdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIgaSBpbiBvYmopIHsgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7IHRhcmdldFtpXSA9IG9ialtpXTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cdFxuXHRmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IGVsc2UgeyByZXR1cm4gQXJyYXkuZnJvbShhcnIpOyB9IH1cblx0XG5cdGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cdFxuXHRmdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblx0XG5cdGZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfSAvKiBlc2xpbnQgcHJlZmVyLXRlbXBsYXRlOiAwICovXG5cdFxuXHR2YXIgc3VwcG9ydE11bHRpcGxlID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudCAmJiBkb2N1bWVudC5jcmVhdGVFbGVtZW50ID8gJ211bHRpcGxlJyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpIDogdHJ1ZTtcblx0XG5cdHZhciBEcm9wem9uZSA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG5cdCAgX2luaGVyaXRzKERyb3B6b25lLCBfUmVhY3QkQ29tcG9uZW50KTtcblx0XG5cdCAgX2NyZWF0ZUNsYXNzKERyb3B6b25lLCBudWxsLCBbe1xuXHQgICAga2V5OiAnb25Eb2N1bWVudERyYWdPdmVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvbkRvY3VtZW50RHJhZ092ZXIoZSkge1xuXHQgICAgICAvLyBhbGxvdyB0aGUgZW50aXJlIGRvY3VtZW50IHRvIGJlIGEgZHJhZyB0YXJnZXRcblx0ICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgfVxuXHQgIH1dKTtcblx0XG5cdCAgZnVuY3Rpb24gRHJvcHpvbmUocHJvcHMsIGNvbnRleHQpIHtcblx0ICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBEcm9wem9uZSk7XG5cdFxuXHQgICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKERyb3B6b25lLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRHJvcHpvbmUpKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cdFxuXHQgICAgX3RoaXMucmVuZGVyQ2hpbGRyZW4gPSBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcblx0ICAgICAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgIHJldHVybiBjaGlsZHJlbihfdGhpcy5zdGF0ZSk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIGNoaWxkcmVuO1xuXHQgICAgfTtcblx0XG5cdCAgICBfdGhpcy5vbkNsaWNrID0gX3RoaXMub25DbGljay5iaW5kKF90aGlzKTtcblx0ICAgIF90aGlzLm9uRG9jdW1lbnREcm9wID0gX3RoaXMub25Eb2N1bWVudERyb3AuYmluZChfdGhpcyk7XG5cdCAgICBfdGhpcy5vbkRyYWdTdGFydCA9IF90aGlzLm9uRHJhZ1N0YXJ0LmJpbmQoX3RoaXMpO1xuXHQgICAgX3RoaXMub25EcmFnRW50ZXIgPSBfdGhpcy5vbkRyYWdFbnRlci5iaW5kKF90aGlzKTtcblx0ICAgIF90aGlzLm9uRHJhZ0xlYXZlID0gX3RoaXMub25EcmFnTGVhdmUuYmluZChfdGhpcyk7XG5cdCAgICBfdGhpcy5vbkRyYWdPdmVyID0gX3RoaXMub25EcmFnT3Zlci5iaW5kKF90aGlzKTtcblx0ICAgIF90aGlzLm9uRHJvcCA9IF90aGlzLm9uRHJvcC5iaW5kKF90aGlzKTtcblx0ICAgIF90aGlzLm9uRmlsZURpYWxvZ0NhbmNlbCA9IF90aGlzLm9uRmlsZURpYWxvZ0NhbmNlbC5iaW5kKF90aGlzKTtcblx0ICAgIF90aGlzLmZpbGVBY2NlcHRlZCA9IF90aGlzLmZpbGVBY2NlcHRlZC5iaW5kKF90aGlzKTtcblx0ICAgIF90aGlzLnNldFJlZiA9IF90aGlzLnNldFJlZi5iaW5kKF90aGlzKTtcblx0ICAgIF90aGlzLmlzRmlsZURpYWxvZ0FjdGl2ZSA9IGZhbHNlO1xuXHQgICAgX3RoaXMuc3RhdGUgPSB7XG5cdCAgICAgIGlzRHJhZ0FjdGl2ZTogZmFsc2UsXG5cdCAgICAgIGFjY2VwdGVkRmlsZXM6IFtdLFxuXHQgICAgICByZWplY3RlZEZpbGVzOiBbXVxuXHQgICAgfTtcblx0ICAgIHJldHVybiBfdGhpcztcblx0ICB9XG5cdFxuXHQgIF9jcmVhdGVDbGFzcyhEcm9wem9uZSwgW3tcblx0ICAgIGtleTogJ2NvbXBvbmVudERpZE1vdW50Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcblx0ICAgICAgdmFyIHByZXZlbnREcm9wT25Eb2N1bWVudCA9IHRoaXMucHJvcHMucHJldmVudERyb3BPbkRvY3VtZW50O1xuXHRcblx0ICAgICAgdGhpcy5kcmFnVGFyZ2V0cyA9IFtdO1xuXHRcblx0ICAgICAgaWYgKHByZXZlbnREcm9wT25Eb2N1bWVudCkge1xuXHQgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgRHJvcHpvbmUub25Eb2N1bWVudERyYWdPdmVyLCBmYWxzZSk7XG5cdCAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMub25Eb2N1bWVudERyb3AsIGZhbHNlKTtcblx0ICAgICAgfVxuXHQgICAgICAvLyBUcmllZCBpbXBsZW1lbnRpbmcgYWRkRXZlbnRMaXN0ZW5lciwgYnV0IGRpZG4ndCB3b3JrIG91dFxuXHQgICAgICBkb2N1bWVudC5ib2R5Lm9uZm9jdXMgPSB0aGlzLm9uRmlsZURpYWxvZ0NhbmNlbDtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdjb21wb25lbnRXaWxsVW5tb3VudCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG5cdCAgICAgIHZhciBwcmV2ZW50RHJvcE9uRG9jdW1lbnQgPSB0aGlzLnByb3BzLnByZXZlbnREcm9wT25Eb2N1bWVudDtcblx0XG5cdCAgICAgIGlmIChwcmV2ZW50RHJvcE9uRG9jdW1lbnQpIHtcblx0ICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIERyb3B6b25lLm9uRG9jdW1lbnREcmFnT3Zlcik7XG5cdCAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMub25Eb2N1bWVudERyb3ApO1xuXHQgICAgICB9XG5cdCAgICAgIC8vIENhbiBiZSByZXBsYWNlZCB3aXRoIHJlbW92ZUV2ZW50TGlzdGVuZXIsIGlmIGFkZEV2ZW50TGlzdGVuZXIgd29ya3Ncblx0ICAgICAgZG9jdW1lbnQuYm9keS5vbmZvY3VzID0gbnVsbDtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdvbkRvY3VtZW50RHJvcCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gb25Eb2N1bWVudERyb3AoZSkge1xuXHQgICAgICBpZiAodGhpcy5ub2RlLmNvbnRhaW5zKGUudGFyZ2V0KSkge1xuXHQgICAgICAgIC8vIGlmIHdlIGludGVyY2VwdGVkIGFuIGV2ZW50IGZvciBvdXIgaW5zdGFuY2UsIGxldCBpdCBwcm9wYWdhdGUgZG93biB0byB0aGUgaW5zdGFuY2UncyBvbkRyb3AgaGFuZGxlclxuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHQgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgIHRoaXMuZHJhZ1RhcmdldHMgPSBbXTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdvbkRyYWdTdGFydCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gb25EcmFnU3RhcnQoZSkge1xuXHQgICAgICBpZiAodGhpcy5wcm9wcy5vbkRyYWdTdGFydCkge1xuXHQgICAgICAgIHRoaXMucHJvcHMub25EcmFnU3RhcnQuY2FsbCh0aGlzLCBlKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29uRHJhZ0VudGVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvbkRyYWdFbnRlcihlKSB7XG5cdCAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblx0XG5cdCAgICAgIC8vIENvdW50IHRoZSBkcm9wem9uZSBhbmQgYW55IGNoaWxkcmVuIHRoYXQgYXJlIGVudGVyZWQuXG5cdCAgICAgIGlmICh0aGlzLmRyYWdUYXJnZXRzLmluZGV4T2YoZS50YXJnZXQpID09PSAtMSkge1xuXHQgICAgICAgIHRoaXMuZHJhZ1RhcmdldHMucHVzaChlLnRhcmdldCk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHZhciBmaWxlcyA9ICgwLCBfZ2V0RGF0YVRyYW5zZmVySXRlbXMyLmRlZmF1bHQpKGUpO1xuXHQgICAgICB2YXIgYWxsRmlsZXNBY2NlcHRlZCA9IHRoaXMuYWxsRmlsZXNBY2NlcHRlZChmaWxlcyk7XG5cdCAgICAgIHZhciBpc011bHRpcGxlQWxsb3dlZCA9IHRoaXMucHJvcHMubXVsdGlwbGUgfHwgZmlsZXMubGVuZ3RoIDw9IDE7XG5cdFxuXHQgICAgICB0aGlzLnNldFN0YXRlKHtcblx0ICAgICAgICBpc0RyYWdBY3RpdmU6IGFsbEZpbGVzQWNjZXB0ZWQsXG5cdCAgICAgICAgaXNEcmFnUmVqZWN0OiAhYWxsRmlsZXNBY2NlcHRlZCB8fCAhaXNNdWx0aXBsZUFsbG93ZWRcblx0ICAgICAgfSk7XG5cdFxuXHQgICAgICBpZiAodGhpcy5wcm9wcy5vbkRyYWdFbnRlcikge1xuXHQgICAgICAgIHRoaXMucHJvcHMub25EcmFnRW50ZXIuY2FsbCh0aGlzLCBlKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29uRHJhZ092ZXInLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIG9uRHJhZ092ZXIoZSkge1xuXHQgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcblx0ICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHQgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHQgICAgICB0cnkge1xuXHQgICAgICAgIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0ICAgICAgfSBjYXRjaCAoZXJyKSB7XG5cdCAgICAgICAgLy8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvclxuXHQgICAgICB9XG5cdFxuXHQgICAgICBpZiAodGhpcy5wcm9wcy5vbkRyYWdPdmVyKSB7XG5cdCAgICAgICAgdGhpcy5wcm9wcy5vbkRyYWdPdmVyLmNhbGwodGhpcywgZSk7XG5cdCAgICAgIH1cblx0ICAgICAgcmV0dXJuIGZhbHNlO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29uRHJhZ0xlYXZlJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvbkRyYWdMZWF2ZShlKSB7XG5cdCAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXHRcblx0ICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcblx0ICAgICAgLy8gT25seSBkZWFjdGl2YXRlIG9uY2UgdGhlIGRyb3B6b25lIGFuZCBhbGwgY2hpbGRyZW4gaGF2ZSBiZWVuIGxlZnQuXG5cdCAgICAgIHRoaXMuZHJhZ1RhcmdldHMgPSB0aGlzLmRyYWdUYXJnZXRzLmZpbHRlcihmdW5jdGlvbiAoZWwpIHtcblx0ICAgICAgICByZXR1cm4gZWwgIT09IGUudGFyZ2V0ICYmIF90aGlzMi5ub2RlLmNvbnRhaW5zKGVsKTtcblx0ICAgICAgfSk7XG5cdCAgICAgIGlmICh0aGlzLmRyYWdUYXJnZXRzLmxlbmd0aCA+IDApIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHRoaXMuc2V0U3RhdGUoe1xuXHQgICAgICAgIGlzRHJhZ0FjdGl2ZTogZmFsc2UsXG5cdCAgICAgICAgaXNEcmFnUmVqZWN0OiBmYWxzZVxuXHQgICAgICB9KTtcblx0XG5cdCAgICAgIGlmICh0aGlzLnByb3BzLm9uRHJhZ0xlYXZlKSB7XG5cdCAgICAgICAgdGhpcy5wcm9wcy5vbkRyYWdMZWF2ZS5jYWxsKHRoaXMsIGUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnb25Ecm9wJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvbkRyb3AoZSkge1xuXHQgICAgICB2YXIgX3RoaXMzID0gdGhpcztcblx0XG5cdCAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuXHQgICAgICAgICAgb25Ecm9wID0gX3Byb3BzLm9uRHJvcCxcblx0ICAgICAgICAgIG9uRHJvcEFjY2VwdGVkID0gX3Byb3BzLm9uRHJvcEFjY2VwdGVkLFxuXHQgICAgICAgICAgb25Ecm9wUmVqZWN0ZWQgPSBfcHJvcHMub25Ecm9wUmVqZWN0ZWQsXG5cdCAgICAgICAgICBtdWx0aXBsZSA9IF9wcm9wcy5tdWx0aXBsZSxcblx0ICAgICAgICAgIGRpc2FibGVQcmV2aWV3ID0gX3Byb3BzLmRpc2FibGVQcmV2aWV3O1xuXHRcblx0ICAgICAgdmFyIGZpbGVMaXN0ID0gKDAsIF9nZXREYXRhVHJhbnNmZXJJdGVtczIuZGVmYXVsdCkoZSk7XG5cdCAgICAgIHZhciBhY2NlcHRlZEZpbGVzID0gW107XG5cdCAgICAgIHZhciByZWplY3RlZEZpbGVzID0gW107XG5cdFxuXHQgICAgICAvLyBTdG9wIGRlZmF1bHQgYnJvd3NlciBiZWhhdmlvclxuXHQgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cdFxuXHQgICAgICAvLyBSZXNldCB0aGUgY291bnRlciBhbG9uZyB3aXRoIHRoZSBkcmFnIG9uIGEgZHJvcC5cblx0ICAgICAgdGhpcy5kcmFnVGFyZ2V0cyA9IFtdO1xuXHQgICAgICB0aGlzLmlzRmlsZURpYWxvZ0FjdGl2ZSA9IGZhbHNlO1xuXHRcblx0ICAgICAgZmlsZUxpc3QuZm9yRWFjaChmdW5jdGlvbiAoZmlsZSkge1xuXHQgICAgICAgIGlmICghZGlzYWJsZVByZXZpZXcpIHtcblx0ICAgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIGZpbGUucHJldmlldyA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG5cdCAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcblx0ICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcblx0ICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgcHJldmlldyBmb3IgZmlsZScsIGZpbGUsIGVycik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHRcblx0ICAgICAgICBpZiAoX3RoaXMzLmZpbGVBY2NlcHRlZChmaWxlKSAmJiBfdGhpczMuZmlsZU1hdGNoU2l6ZShmaWxlKSkge1xuXHQgICAgICAgICAgYWNjZXB0ZWRGaWxlcy5wdXNoKGZpbGUpO1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICByZWplY3RlZEZpbGVzLnB1c2goZmlsZSk7XG5cdCAgICAgICAgfVxuXHQgICAgICB9KTtcblx0XG5cdCAgICAgIGlmICghbXVsdGlwbGUpIHtcblx0ICAgICAgICAvLyBpZiBub3QgaW4gbXVsdGkgbW9kZSBhZGQgYW55IGV4dHJhIGFjY2VwdGVkIGZpbGVzIHRvIHJlamVjdGVkLlxuXHQgICAgICAgIC8vIFRoaXMgd2lsbCBhbGxvdyBlbmQgdXNlcnMgdG8gZWFzaWx5IGlnbm9yZSBhIG11bHRpIGZpbGUgZHJvcCBpbiBcInNpbmdsZVwiIG1vZGUuXG5cdCAgICAgICAgcmVqZWN0ZWRGaWxlcy5wdXNoLmFwcGx5KHJlamVjdGVkRmlsZXMsIF90b0NvbnN1bWFibGVBcnJheShhY2NlcHRlZEZpbGVzLnNwbGljZSgxKSkpO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBpZiAob25Ecm9wKSB7XG5cdCAgICAgICAgb25Ecm9wLmNhbGwodGhpcywgYWNjZXB0ZWRGaWxlcywgcmVqZWN0ZWRGaWxlcywgZSk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGlmIChyZWplY3RlZEZpbGVzLmxlbmd0aCA+IDAgJiYgb25Ecm9wUmVqZWN0ZWQpIHtcblx0ICAgICAgICBvbkRyb3BSZWplY3RlZC5jYWxsKHRoaXMsIHJlamVjdGVkRmlsZXMsIGUpO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICBpZiAoYWNjZXB0ZWRGaWxlcy5sZW5ndGggPiAwICYmIG9uRHJvcEFjY2VwdGVkKSB7XG5cdCAgICAgICAgb25Ecm9wQWNjZXB0ZWQuY2FsbCh0aGlzLCBhY2NlcHRlZEZpbGVzLCBlKTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgLy8gUmVzZXQgZHJhZyBzdGF0ZVxuXHQgICAgICB0aGlzLnNldFN0YXRlKHtcblx0ICAgICAgICBpc0RyYWdBY3RpdmU6IGZhbHNlLFxuXHQgICAgICAgIGlzRHJhZ1JlamVjdDogZmFsc2UsXG5cdCAgICAgICAgYWNjZXB0ZWRGaWxlczogYWNjZXB0ZWRGaWxlcyxcblx0ICAgICAgICByZWplY3RlZEZpbGVzOiByZWplY3RlZEZpbGVzXG5cdCAgICAgIH0pO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29uQ2xpY2snLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIG9uQ2xpY2soZSkge1xuXHQgICAgICB2YXIgX3Byb3BzMiA9IHRoaXMucHJvcHMsXG5cdCAgICAgICAgICBvbkNsaWNrID0gX3Byb3BzMi5vbkNsaWNrLFxuXHQgICAgICAgICAgZGlzYWJsZUNsaWNrID0gX3Byb3BzMi5kaXNhYmxlQ2xpY2s7XG5cdFxuXHQgICAgICBpZiAoIWRpc2FibGVDbGljaykge1xuXHQgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdCAgICAgICAgdGhpcy5vcGVuKCk7XG5cdCAgICAgICAgaWYgKG9uQ2xpY2spIHtcblx0ICAgICAgICAgIG9uQ2xpY2suY2FsbCh0aGlzLCBlKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdvbkZpbGVEaWFsb2dDYW5jZWwnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIG9uRmlsZURpYWxvZ0NhbmNlbCgpIHtcblx0ICAgICAgLy8gdGltZW91dCB3aWxsIG5vdCByZWNvZ25pemUgY29udGV4dCBvZiB0aGlzIG1ldGhvZFxuXHQgICAgICB2YXIgb25GaWxlRGlhbG9nQ2FuY2VsID0gdGhpcy5wcm9wcy5vbkZpbGVEaWFsb2dDYW5jZWw7XG5cdCAgICAgIHZhciBmaWxlSW5wdXRFbCA9IHRoaXMuZmlsZUlucHV0RWw7XG5cdCAgICAgIHZhciBpc0ZpbGVEaWFsb2dBY3RpdmUgPSB0aGlzLmlzRmlsZURpYWxvZ0FjdGl2ZTtcblx0ICAgICAgLy8gZXhlY3V0ZSB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBvbkZpbGVEaWFsb2dDYW5jZWwgaXMgZGVmaW5lZCBhbmQgRmlsZURpYWxvZ1xuXHQgICAgICAvLyBpcyBvcGVuZWQgaW4gdGhlIGJyb3dzZXJcblx0XG5cdCAgICAgIGlmIChvbkZpbGVEaWFsb2dDYW5jZWwgJiYgaXNGaWxlRGlhbG9nQWN0aXZlKSB7XG5cdCAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdCAgICAgICAgICAvLyBSZXR1cm5zIGFuIG9iamVjdCBhcyBGaWxlTGlzdFxuXHQgICAgICAgICAgdmFyIEZpbGVMaXN0ID0gZmlsZUlucHV0RWwuZmlsZXM7XG5cdCAgICAgICAgICBpZiAoIUZpbGVMaXN0Lmxlbmd0aCkge1xuXHQgICAgICAgICAgICBpc0ZpbGVEaWFsb2dBY3RpdmUgPSBmYWxzZTtcblx0ICAgICAgICAgICAgb25GaWxlRGlhbG9nQ2FuY2VsKCk7XG5cdCAgICAgICAgICB9XG5cdCAgICAgICAgfSwgMzAwKTtcblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ3NldFJlZicsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gc2V0UmVmKHJlZikge1xuXHQgICAgICB0aGlzLm5vZGUgPSByZWY7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZmlsZUFjY2VwdGVkJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmaWxlQWNjZXB0ZWQoZmlsZSkge1xuXHQgICAgICAvLyBGaXJlZm94IHZlcnNpb25zIHByaW9yIHRvIDUzIHJldHVybiBhIGJvZ3VzIE1JTUUgdHlwZSBmb3IgZXZlcnkgZmlsZSBkcmFnLCBzbyBkcmFnb3ZlcnMgd2l0aFxuXHQgICAgICAvLyB0aGF0IE1JTUUgdHlwZSB3aWxsIGFsd2F5cyBiZSBhY2NlcHRlZFxuXHQgICAgICByZXR1cm4gZmlsZS50eXBlID09PSAnYXBwbGljYXRpb24veC1tb3otZmlsZScgfHwgKDAsIF9hdHRyQWNjZXB0Mi5kZWZhdWx0KShmaWxlLCB0aGlzLnByb3BzLmFjY2VwdCk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnZmlsZU1hdGNoU2l6ZScsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gZmlsZU1hdGNoU2l6ZShmaWxlKSB7XG5cdCAgICAgIHJldHVybiBmaWxlLnNpemUgPD0gdGhpcy5wcm9wcy5tYXhTaXplICYmIGZpbGUuc2l6ZSA+PSB0aGlzLnByb3BzLm1pblNpemU7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnYWxsRmlsZXNBY2NlcHRlZCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gYWxsRmlsZXNBY2NlcHRlZChmaWxlcykge1xuXHQgICAgICByZXR1cm4gZmlsZXMuZXZlcnkodGhpcy5maWxlQWNjZXB0ZWQpO1xuXHQgICAgfVxuXHRcblx0ICAgIC8qKlxuXHQgICAgICogT3BlbiBzeXN0ZW0gZmlsZSB1cGxvYWQgZGlhbG9nLlxuXHQgICAgICpcblx0ICAgICAqIEBwdWJsaWNcblx0ICAgICAqL1xuXHRcblx0ICB9LCB7XG5cdCAgICBrZXk6ICdvcGVuJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvcGVuKCkge1xuXHQgICAgICB0aGlzLmlzRmlsZURpYWxvZ0FjdGl2ZSA9IHRydWU7XG5cdCAgICAgIHRoaXMuZmlsZUlucHV0RWwudmFsdWUgPSBudWxsO1xuXHQgICAgICB0aGlzLmZpbGVJbnB1dEVsLmNsaWNrKCk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAncmVuZGVyJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG5cdCAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXHRcblx0ICAgICAgdmFyIF9wcm9wczMgPSB0aGlzLnByb3BzLFxuXHQgICAgICAgICAgYWNjZXB0ID0gX3Byb3BzMy5hY2NlcHQsXG5cdCAgICAgICAgICBhY3RpdmVDbGFzc05hbWUgPSBfcHJvcHMzLmFjdGl2ZUNsYXNzTmFtZSxcblx0ICAgICAgICAgIGlucHV0UHJvcHMgPSBfcHJvcHMzLmlucHV0UHJvcHMsXG5cdCAgICAgICAgICBtdWx0aXBsZSA9IF9wcm9wczMubXVsdGlwbGUsXG5cdCAgICAgICAgICBuYW1lID0gX3Byb3BzMy5uYW1lLFxuXHQgICAgICAgICAgcmVqZWN0Q2xhc3NOYW1lID0gX3Byb3BzMy5yZWplY3RDbGFzc05hbWUsXG5cdCAgICAgICAgICBjaGlsZHJlbiA9IF9wcm9wczMuY2hpbGRyZW4sXG5cdCAgICAgICAgICByZXN0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9wcm9wczMsIFsnYWNjZXB0JywgJ2FjdGl2ZUNsYXNzTmFtZScsICdpbnB1dFByb3BzJywgJ211bHRpcGxlJywgJ25hbWUnLCAncmVqZWN0Q2xhc3NOYW1lJywgJ2NoaWxkcmVuJ10pO1xuXHRcblx0ICAgICAgdmFyIGFjdGl2ZVN0eWxlID0gcmVzdC5hY3RpdmVTdHlsZSxcblx0ICAgICAgICAgIGNsYXNzTmFtZSA9IHJlc3QuY2xhc3NOYW1lLFxuXHQgICAgICAgICAgcmVqZWN0U3R5bGUgPSByZXN0LnJlamVjdFN0eWxlLFxuXHQgICAgICAgICAgc3R5bGUgPSByZXN0LnN0eWxlLFxuXHQgICAgICAgICAgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocmVzdCwgWydhY3RpdmVTdHlsZScsICdjbGFzc05hbWUnLCAncmVqZWN0U3R5bGUnLCAnc3R5bGUnXSk7XG5cdFxuXHQgICAgICB2YXIgX3N0YXRlID0gdGhpcy5zdGF0ZSxcblx0ICAgICAgICAgIGlzRHJhZ0FjdGl2ZSA9IF9zdGF0ZS5pc0RyYWdBY3RpdmUsXG5cdCAgICAgICAgICBpc0RyYWdSZWplY3QgPSBfc3RhdGUuaXNEcmFnUmVqZWN0O1xuXHRcblx0XG5cdCAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZSB8fCAnJztcblx0XG5cdCAgICAgIGlmIChpc0RyYWdBY3RpdmUgJiYgYWN0aXZlQ2xhc3NOYW1lKSB7XG5cdCAgICAgICAgY2xhc3NOYW1lICs9ICcgJyArIGFjdGl2ZUNsYXNzTmFtZTtcblx0ICAgICAgfVxuXHQgICAgICBpZiAoaXNEcmFnUmVqZWN0ICYmIHJlamVjdENsYXNzTmFtZSkge1xuXHQgICAgICAgIGNsYXNzTmFtZSArPSAnICcgKyByZWplY3RDbGFzc05hbWU7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGlmICghY2xhc3NOYW1lICYmICFzdHlsZSAmJiAhYWN0aXZlU3R5bGUgJiYgIXJlamVjdFN0eWxlKSB7XG5cdCAgICAgICAgc3R5bGUgPSB7XG5cdCAgICAgICAgICB3aWR0aDogMjAwLFxuXHQgICAgICAgICAgaGVpZ2h0OiAyMDAsXG5cdCAgICAgICAgICBib3JkZXJXaWR0aDogMixcblx0ICAgICAgICAgIGJvcmRlckNvbG9yOiAnIzY2NicsXG5cdCAgICAgICAgICBib3JkZXJTdHlsZTogJ2Rhc2hlZCcsXG5cdCAgICAgICAgICBib3JkZXJSYWRpdXM6IDVcblx0ICAgICAgICB9O1xuXHQgICAgICAgIGFjdGl2ZVN0eWxlID0ge1xuXHQgICAgICAgICAgYm9yZGVyU3R5bGU6ICdzb2xpZCcsXG5cdCAgICAgICAgICBib3JkZXJDb2xvcjogJyM2YzYnLFxuXHQgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2VlZSdcblx0ICAgICAgICB9O1xuXHQgICAgICAgIHJlamVjdFN0eWxlID0ge1xuXHQgICAgICAgICAgYm9yZGVyU3R5bGU6ICdzb2xpZCcsXG5cdCAgICAgICAgICBib3JkZXJDb2xvcjogJyNjNjYnLFxuXHQgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2VlZSdcblx0ICAgICAgICB9O1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgYXBwbGllZFN0eWxlID0gdm9pZCAwO1xuXHQgICAgICBpZiAoYWN0aXZlU3R5bGUgJiYgaXNEcmFnQWN0aXZlKSB7XG5cdCAgICAgICAgYXBwbGllZFN0eWxlID0gX2V4dGVuZHMoe30sIHN0eWxlLCBhY3RpdmVTdHlsZSk7XG5cdCAgICAgIH0gZWxzZSBpZiAocmVqZWN0U3R5bGUgJiYgaXNEcmFnUmVqZWN0KSB7XG5cdCAgICAgICAgYXBwbGllZFN0eWxlID0gX2V4dGVuZHMoe30sIHN0eWxlLCByZWplY3RTdHlsZSk7XG5cdCAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgYXBwbGllZFN0eWxlID0gX2V4dGVuZHMoe30sIHN0eWxlKTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdmFyIGlucHV0QXR0cmlidXRlcyA9IHtcblx0ICAgICAgICBhY2NlcHQ6IGFjY2VwdCxcblx0ICAgICAgICB0eXBlOiAnZmlsZScsXG5cdCAgICAgICAgc3R5bGU6IHsgZGlzcGxheTogJ25vbmUnIH0sXG5cdCAgICAgICAgbXVsdGlwbGU6IHN1cHBvcnRNdWx0aXBsZSAmJiBtdWx0aXBsZSxcblx0ICAgICAgICByZWY6IGZ1bmN0aW9uIHJlZihlbCkge1xuXHQgICAgICAgICAgcmV0dXJuIF90aGlzNC5maWxlSW5wdXRFbCA9IGVsO1xuXHQgICAgICAgIH0sIC8vIGVzbGludC1kaXNhYmxlLWxpbmVcblx0ICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkRyb3Bcblx0ICAgICAgfTtcblx0XG5cdCAgICAgIGlmIChuYW1lICYmIG5hbWUubGVuZ3RoKSB7XG5cdCAgICAgICAgaW5wdXRBdHRyaWJ1dGVzLm5hbWUgPSBuYW1lO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICAvLyBSZW1vdmUgY3VzdG9tIHByb3BlcnRpZXMgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGUgd3JhcHBlciBkaXYgZWxlbWVudFxuXHQgICAgICB2YXIgY3VzdG9tUHJvcHMgPSBbJ2FjY2VwdGVkRmlsZXMnLCAncHJldmVudERyb3BPbkRvY3VtZW50JywgJ2Rpc2FibGVQcmV2aWV3JywgJ2Rpc2FibGVDbGljaycsICdvbkRyb3BBY2NlcHRlZCcsICdvbkRyb3BSZWplY3RlZCcsICdvbkZpbGVEaWFsb2dDYW5jZWwnLCAnbWF4U2l6ZScsICdtaW5TaXplJ107XG5cdCAgICAgIHZhciBkaXZQcm9wcyA9IF9leHRlbmRzKHt9LCBwcm9wcyk7XG5cdCAgICAgIGN1c3RvbVByb3BzLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcblx0ICAgICAgICByZXR1cm4gZGVsZXRlIGRpdlByb3BzW3Byb3BdO1xuXHQgICAgICB9KTtcblx0XG5cdCAgICAgIHJldHVybiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcblx0ICAgICAgICAnZGl2Jyxcblx0ICAgICAgICBfZXh0ZW5kcyh7XG5cdCAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSxcblx0ICAgICAgICAgIHN0eWxlOiBhcHBsaWVkU3R5bGVcblx0ICAgICAgICB9LCBkaXZQcm9wcyAvKiBleHBhbmQgdXNlciBwcm92aWRlZCBwcm9wcyBmaXJzdCBzbyBldmVudCBoYW5kbGVycyBhcmUgbmV2ZXIgb3ZlcnJpZGRlbiAqLywge1xuXHQgICAgICAgICAgb25DbGljazogdGhpcy5vbkNsaWNrLFxuXHQgICAgICAgICAgb25EcmFnU3RhcnQ6IHRoaXMub25EcmFnU3RhcnQsXG5cdCAgICAgICAgICBvbkRyYWdFbnRlcjogdGhpcy5vbkRyYWdFbnRlcixcblx0ICAgICAgICAgIG9uRHJhZ092ZXI6IHRoaXMub25EcmFnT3Zlcixcblx0ICAgICAgICAgIG9uRHJhZ0xlYXZlOiB0aGlzLm9uRHJhZ0xlYXZlLFxuXHQgICAgICAgICAgb25Ecm9wOiB0aGlzLm9uRHJvcCxcblx0ICAgICAgICAgIHJlZjogdGhpcy5zZXRSZWZcblx0ICAgICAgICB9KSxcblx0ICAgICAgICB0aGlzLnJlbmRlckNoaWxkcmVuKGNoaWxkcmVuKSxcblx0ICAgICAgICBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgnaW5wdXQnLCBfZXh0ZW5kcyh7fSwgaW5wdXRQcm9wcyAvKiBleHBhbmQgdXNlciBwcm92aWRlZCBpbnB1dFByb3BzIGZpcnN0IHNvIGlucHV0QXR0cmlidXRlcyBvdmVycmlkZSB0aGVtICovLCBpbnB1dEF0dHJpYnV0ZXMpKVxuXHQgICAgICApO1xuXHQgICAgfVxuXHQgIH1dKTtcblx0XG5cdCAgcmV0dXJuIERyb3B6b25lO1xuXHR9KF9yZWFjdDIuZGVmYXVsdC5Db21wb25lbnQpO1xuXHRcblx0RHJvcHpvbmUucHJvcFR5cGVzID0ge1xuXHQgIC8qKlxuXHQgICAqIEFsbG93IHNwZWNpZmljIHR5cGVzIG9mIGZpbGVzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL29rb25ldC9hdHRyLWFjY2VwdCBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cblx0ICAgKiBLZWVwIGluIG1pbmQgdGhhdCBtaW1lIHR5cGUgZGV0ZXJtaW5hdGlvbiBpcyBub3QgcmVsaWFibGUgYWNjcm9zcyBwbGF0Zm9ybXMuIENTViBmaWxlcyxcblx0ICAgKiBmb3IgZXhhbXBsZSwgYXJlIHJlcG9ydGVkIGFzIHRleHQvcGxhaW4gdW5kZXIgbWFjT1MgYnV0IGFzIGFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCB1bmRlclxuXHQgICAqIFdpbmRvd3MuIEluIHNvbWUgY2FzZXMgdGhlcmUgbWlnaHQgbm90IGJlIGEgbWltZSB0eXBlIHNldCBhdCBhbGwuXG5cdCAgICogU2VlOiBodHRwczovL2dpdGh1Yi5jb20vb2tvbmV0L3JlYWN0LWRyb3B6b25lL2lzc3Vlcy8yNzZcblx0ICAgKi9cblx0ICBhY2NlcHQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQuc3RyaW5nLFxuXHRcblx0ICAvKipcblx0ICAgKiBDb250ZW50cyBvZiB0aGUgZHJvcHpvbmVcblx0ICAgKi9cblx0ICBjaGlsZHJlbjogX3Byb3BUeXBlczIuZGVmYXVsdC5vbmVPZlR5cGUoW19wcm9wVHlwZXMyLmRlZmF1bHQubm9kZSwgX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jXSksXG5cdFxuXHQgIC8qKlxuXHQgICAqIERpc2FsbG93IGNsaWNraW5nIG9uIHRoZSBkcm9wem9uZSBjb250YWluZXIgdG8gb3BlbiBmaWxlIGRpYWxvZ1xuXHQgICAqL1xuXHQgIGRpc2FibGVDbGljazogX3Byb3BUeXBlczIuZGVmYXVsdC5ib29sLFxuXHRcblx0ICAvKipcblx0ICAgKiBFbmFibGUvZGlzYWJsZSBwcmV2aWV3IGdlbmVyYXRpb25cblx0ICAgKi9cblx0ICBkaXNhYmxlUHJldmlldzogX3Byb3BUeXBlczIuZGVmYXVsdC5ib29sLFxuXHRcblx0ICAvKipcblx0ICAgKiBJZiBmYWxzZSwgYWxsb3cgZHJvcHBlZCBpdGVtcyB0byB0YWtlIG92ZXIgdGhlIGN1cnJlbnQgYnJvd3NlciB3aW5kb3dcblx0ICAgKi9cblx0ICBwcmV2ZW50RHJvcE9uRG9jdW1lbnQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbCxcblx0XG5cdCAgLyoqXG5cdCAgICogUGFzcyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgdG8gdGhlIGA8aW5wdXQgdHlwZT1cImZpbGVcIi8+YCB0YWdcblx0ICAgKi9cblx0ICBpbnB1dFByb3BzOiBfcHJvcFR5cGVzMi5kZWZhdWx0Lm9iamVjdCxcblx0XG5cdCAgLyoqXG5cdCAgICogQWxsb3cgZHJvcHBpbmcgbXVsdGlwbGUgZmlsZXNcblx0ICAgKi9cblx0ICBtdWx0aXBsZTogX3Byb3BUeXBlczIuZGVmYXVsdC5ib29sLFxuXHRcblx0ICAvKipcblx0ICAgKiBgbmFtZWAgYXR0cmlidXRlIGZvciB0aGUgaW5wdXQgdGFnXG5cdCAgICovXG5cdCAgbmFtZTogX3Byb3BUeXBlczIuZGVmYXVsdC5zdHJpbmcsXG5cdFxuXHQgIC8qKlxuXHQgICAqIE1heGltdW0gZmlsZSBzaXplXG5cdCAgICovXG5cdCAgbWF4U2l6ZTogX3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIsXG5cdFxuXHQgIC8qKlxuXHQgICAqIE1pbmltdW0gZmlsZSBzaXplXG5cdCAgICovXG5cdCAgbWluU2l6ZTogX3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIsXG5cdFxuXHQgIC8qKlxuXHQgICAqIGNsYXNzTmFtZVxuXHQgICAqL1xuXHQgIGNsYXNzTmFtZTogX3Byb3BUeXBlczIuZGVmYXVsdC5zdHJpbmcsXG5cdFxuXHQgIC8qKlxuXHQgICAqIGNsYXNzTmFtZSBmb3IgYWNjZXB0ZWQgc3RhdGVcblx0ICAgKi9cblx0ICBhY3RpdmVDbGFzc05hbWU6IF9wcm9wVHlwZXMyLmRlZmF1bHQuc3RyaW5nLFxuXHRcblx0ICAvKipcblx0ICAgKiBjbGFzc05hbWUgZm9yIHJlamVjdGVkIHN0YXRlXG5cdCAgICovXG5cdCAgcmVqZWN0Q2xhc3NOYW1lOiBfcHJvcFR5cGVzMi5kZWZhdWx0LnN0cmluZyxcblx0XG5cdCAgLyoqXG5cdCAgICogQ1NTIHN0eWxlcyB0byBhcHBseVxuXHQgICAqL1xuXHQgIHN0eWxlOiBfcHJvcFR5cGVzMi5kZWZhdWx0Lm9iamVjdCxcblx0XG5cdCAgLyoqXG5cdCAgICogQ1NTIHN0eWxlcyB0byBhcHBseSB3aGVuIGRyb3Agd2lsbCBiZSBhY2NlcHRlZFxuXHQgICAqL1xuXHQgIGFjdGl2ZVN0eWxlOiBfcHJvcFR5cGVzMi5kZWZhdWx0Lm9iamVjdCxcblx0XG5cdCAgLyoqXG5cdCAgICogQ1NTIHN0eWxlcyB0byBhcHBseSB3aGVuIGRyb3Agd2lsbCBiZSByZWplY3RlZFxuXHQgICAqL1xuXHQgIHJlamVjdFN0eWxlOiBfcHJvcFR5cGVzMi5kZWZhdWx0Lm9iamVjdCxcblx0XG5cdCAgLyoqXG5cdCAgICogb25DbGljayBjYWxsYmFja1xuXHQgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG5cdCAgICovXG5cdCAgb25DbGljazogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuXHRcblx0ICAvKipcblx0ICAgKiBvbkRyb3AgY2FsbGJhY2tcblx0ICAgKi9cblx0ICBvbkRyb3A6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblx0XG5cdCAgLyoqXG5cdCAgICogb25Ecm9wQWNjZXB0ZWQgY2FsbGJhY2tcblx0ICAgKi9cblx0ICBvbkRyb3BBY2NlcHRlZDogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuXHRcblx0ICAvKipcblx0ICAgKiBvbkRyb3BSZWplY3RlZCBjYWxsYmFja1xuXHQgICAqL1xuXHQgIG9uRHJvcFJlamVjdGVkOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG5cdFxuXHQgIC8qKlxuXHQgICAqIG9uRHJhZ1N0YXJ0IGNhbGxiYWNrXG5cdCAgICovXG5cdCAgb25EcmFnU3RhcnQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblx0XG5cdCAgLyoqXG5cdCAgICogb25EcmFnRW50ZXIgY2FsbGJhY2tcblx0ICAgKi9cblx0ICBvbkRyYWdFbnRlcjogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuXHRcblx0ICAvKipcblx0ICAgKiBvbkRyYWdPdmVyIGNhbGxiYWNrXG5cdCAgICovXG5cdCAgb25EcmFnT3ZlcjogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuXHRcblx0ICAvKipcblx0ICAgKiBvbkRyYWdMZWF2ZSBjYWxsYmFja1xuXHQgICAqL1xuXHQgIG9uRHJhZ0xlYXZlOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG5cdFxuXHQgIC8qKlxuXHQgICAqIFByb3ZpZGUgYSBjYWxsYmFjayBvbiBjbGlja2luZyB0aGUgY2FuY2VsIGJ1dHRvbiBvZiB0aGUgZmlsZSBkaWFsb2dcblx0ICAgKi9cblx0ICBvbkZpbGVEaWFsb2dDYW5jZWw6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuY1xuXHR9O1xuXHRcblx0RHJvcHpvbmUuZGVmYXVsdFByb3BzID0ge1xuXHQgIHByZXZlbnREcm9wT25Eb2N1bWVudDogdHJ1ZSxcblx0ICBkaXNhYmxlUHJldmlldzogZmFsc2UsXG5cdCAgZGlzYWJsZUNsaWNrOiBmYWxzZSxcblx0ICBtdWx0aXBsZTogdHJ1ZSxcblx0ICBtYXhTaXplOiBJbmZpbml0eSxcblx0ICBtaW5TaXplOiAwXG5cdH07XG5cdFxuXHRleHBvcnRzLmRlZmF1bHQgPSBEcm9wem9uZTtcblx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107XG5cdC8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqL30uY2FsbChleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpKSlcblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0Ly8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG5cdHZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblx0XG5cdC8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuXHQvLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcblx0Ly8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuXHQvLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXHRcblx0dmFyIGNhY2hlZFNldFRpbWVvdXQ7XG5cdHZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cdFxuXHRmdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG5cdH1cblx0ZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xuXHR9XG5cdChmdW5jdGlvbiAoKSB7XG5cdCAgICB0cnkge1xuXHQgICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuXHQgICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcblx0ICAgICAgICB9XG5cdCAgICB9IGNhdGNoIChlKSB7XG5cdCAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG5cdCAgICB9XG5cdCAgICB0cnkge1xuXHQgICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcblx0ICAgICAgICB9IGVsc2Uge1xuXHQgICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuXHQgICAgICAgIH1cblx0ICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuXHQgICAgfVxuXHR9ICgpKVxuXHRmdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuXHQgICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcblx0ICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcblx0ICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuXHQgICAgfVxuXHQgICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcblx0ICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuXHQgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuXHQgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG5cdCAgICB9XG5cdCAgICB0cnkge1xuXHQgICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3Ncblx0ICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuXHQgICAgfSBjYXRjaChlKXtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcblx0ICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuXHQgICAgICAgIH0gY2F0Y2goZSl7XG5cdCAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG5cdCAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdFxuXHRcblx0fVxuXHRmdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG5cdCAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcblx0ICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcblx0ICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG5cdCAgICB9XG5cdCAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG5cdCAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcblx0ICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG5cdCAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuXHQgICAgfVxuXHQgICAgdHJ5IHtcblx0ICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG5cdCAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuXHQgICAgfSBjYXRjaCAoZSl7XG5cdCAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuXHQgICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcblx0ICAgICAgICB9IGNhdGNoIChlKXtcblx0ICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG5cdCAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcblx0ICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG5cdCAgICAgICAgfVxuXHQgICAgfVxuXHRcblx0XG5cdFxuXHR9XG5cdHZhciBxdWV1ZSA9IFtdO1xuXHR2YXIgZHJhaW5pbmcgPSBmYWxzZTtcblx0dmFyIGN1cnJlbnRRdWV1ZTtcblx0dmFyIHF1ZXVlSW5kZXggPSAtMTtcblx0XG5cdGZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcblx0ICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIGRyYWluaW5nID0gZmFsc2U7XG5cdCAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuXHQgICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG5cdCAgICB9IGVsc2Uge1xuXHQgICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcblx0ICAgIH1cblx0ICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcblx0ICAgICAgICBkcmFpblF1ZXVlKCk7XG5cdCAgICB9XG5cdH1cblx0XG5cdGZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG5cdCAgICBpZiAoZHJhaW5pbmcpIHtcblx0ICAgICAgICByZXR1cm47XG5cdCAgICB9XG5cdCAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcblx0ICAgIGRyYWluaW5nID0gdHJ1ZTtcblx0XG5cdCAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuXHQgICAgd2hpbGUobGVuKSB7XG5cdCAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG5cdCAgICAgICAgcXVldWUgPSBbXTtcblx0ICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG5cdCAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcblx0ICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG5cdCAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuXHQgICAgfVxuXHQgICAgY3VycmVudFF1ZXVlID0gbnVsbDtcblx0ICAgIGRyYWluaW5nID0gZmFsc2U7XG5cdCAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG5cdH1cblx0XG5cdHByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG5cdCAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG5cdCAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcblx0ICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuXHQgICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdCAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuXHQgICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcblx0ICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuXHQgICAgfVxuXHR9O1xuXHRcblx0Ly8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuXHRmdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcblx0ICAgIHRoaXMuZnVuID0gZnVuO1xuXHQgICAgdGhpcy5hcnJheSA9IGFycmF5O1xuXHR9XG5cdEl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcblx0ICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xuXHR9O1xuXHRwcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xuXHRwcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xuXHRwcm9jZXNzLmVudiA9IHt9O1xuXHRwcm9jZXNzLmFyZ3YgPSBbXTtcblx0cHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5cdHByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblx0XG5cdGZ1bmN0aW9uIG5vb3AoKSB7fVxuXHRcblx0cHJvY2Vzcy5vbiA9IG5vb3A7XG5cdHByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xuXHRwcm9jZXNzLm9uY2UgPSBub29wO1xuXHRwcm9jZXNzLm9mZiA9IG5vb3A7XG5cdHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xuXHRwcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5cdHByb2Nlc3MuZW1pdCA9IG5vb3A7XG5cdFxuXHRwcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xuXHR9O1xuXHRcblx0cHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcblx0cHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG5cdH07XG5cdHByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG5cblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzJfXztcblxuLyoqKi8gfSksXG4vKiAzICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzNfXztcblxuLyoqKi8gfSksXG4vKiA0ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cblx0bW9kdWxlLmV4cG9ydHM9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihlKXtpZihyW2VdKXJldHVybiByW2VdLmV4cG9ydHM7dmFyIG89cltlXT17ZXhwb3J0czp7fSxpZDplLGxvYWRlZDohMX07cmV0dXJuIHRbZV0uY2FsbChvLmV4cG9ydHMsbyxvLmV4cG9ydHMsbiksby5sb2FkZWQ9ITAsby5leHBvcnRzfXZhciByPXt9O3JldHVybiBuLm09dCxuLmM9cixuLnA9XCJcIixuKDApfShbZnVuY3Rpb24odCxuLHIpe1widXNlIHN0cmljdFwiO24uX19lc01vZHVsZT0hMCxyKDgpLHIoOSksbltcImRlZmF1bHRcIl09ZnVuY3Rpb24odCxuKXtpZih0JiZuKXt2YXIgcj1mdW5jdGlvbigpe3ZhciByPUFycmF5LmlzQXJyYXkobik/bjpuLnNwbGl0KFwiLFwiKSxlPXQubmFtZXx8XCJcIixvPXQudHlwZXx8XCJcIixpPW8ucmVwbGFjZSgvXFwvLiokLyxcIlwiKTtyZXR1cm57djpyLnNvbWUoZnVuY3Rpb24odCl7dmFyIG49dC50cmltKCk7cmV0dXJuXCIuXCI9PT1uLmNoYXJBdCgwKT9lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgobi50b0xvd2VyQ2FzZSgpKTovXFwvXFwqJC8udGVzdChuKT9pPT09bi5yZXBsYWNlKC9cXC8uKiQvLFwiXCIpOm89PT1ufSl9fSgpO2lmKFwib2JqZWN0XCI9PXR5cGVvZiByKXJldHVybiByLnZ9cmV0dXJuITB9LHQuZXhwb3J0cz1uW1wiZGVmYXVsdFwiXX0sZnVuY3Rpb24odCxuKXt2YXIgcj10LmV4cG9ydHM9e3ZlcnNpb246XCIxLjIuMlwifTtcIm51bWJlclwiPT10eXBlb2YgX19lJiYoX19lPXIpfSxmdW5jdGlvbih0LG4pe3ZhciByPXQuZXhwb3J0cz1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuTWF0aD09TWF0aD93aW5kb3c6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGYmJnNlbGYuTWF0aD09TWF0aD9zZWxmOkZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcIm51bWJlclwiPT10eXBlb2YgX19nJiYoX19nPXIpfSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigyKSxvPXIoMSksaT1yKDQpLHU9cigxOSksYz1cInByb3RvdHlwZVwiLGY9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShuLGFyZ3VtZW50cyl9fSxzPWZ1bmN0aW9uKHQsbixyKXt2YXIgYSxwLGwseSxkPXQmcy5HLGg9dCZzLlAsdj1kP2U6dCZzLlM/ZVtuXXx8KGVbbl09e30pOihlW25dfHx7fSlbY10seD1kP286b1tuXXx8KG9bbl09e30pO2QmJihyPW4pO2ZvcihhIGluIHIpcD0hKHQmcy5GKSYmdiYmYSBpbiB2LGw9KHA/djpyKVthXSx5PXQmcy5CJiZwP2YobCxlKTpoJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBsP2YoRnVuY3Rpb24uY2FsbCxsKTpsLHYmJiFwJiZ1KHYsYSxsKSx4W2FdIT1sJiZpKHgsYSx5KSxoJiYoKHhbY118fCh4W2NdPXt9KSlbYV09bCl9O2UuY29yZT1vLHMuRj0xLHMuRz0yLHMuUz00LHMuUD04LHMuQj0xNixzLlc9MzIsdC5leHBvcnRzPXN9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDUpLG89cigxOCk7dC5leHBvcnRzPXIoMjIpP2Z1bmN0aW9uKHQsbixyKXtyZXR1cm4gZS5zZXREZXNjKHQsbixvKDEscikpfTpmdW5jdGlvbih0LG4scil7cmV0dXJuIHRbbl09cix0fX0sZnVuY3Rpb24odCxuKXt2YXIgcj1PYmplY3Q7dC5leHBvcnRzPXtjcmVhdGU6ci5jcmVhdGUsZ2V0UHJvdG86ci5nZXRQcm90b3R5cGVPZixpc0VudW06e30ucHJvcGVydHlJc0VudW1lcmFibGUsZ2V0RGVzYzpyLmdldE93blByb3BlcnR5RGVzY3JpcHRvcixzZXREZXNjOnIuZGVmaW5lUHJvcGVydHksc2V0RGVzY3M6ci5kZWZpbmVQcm9wZXJ0aWVzLGdldEtleXM6ci5rZXlzLGdldE5hbWVzOnIuZ2V0T3duUHJvcGVydHlOYW1lcyxnZXRTeW1ib2xzOnIuZ2V0T3duUHJvcGVydHlTeW1ib2xzLGVhY2g6W10uZm9yRWFjaH19LGZ1bmN0aW9uKHQsbil7dmFyIHI9MCxlPU1hdGgucmFuZG9tKCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVyblwiU3ltYm9sKFwiLmNvbmNhdCh2b2lkIDA9PT10P1wiXCI6dCxcIilfXCIsKCsrcitlKS50b1N0cmluZygzNikpfX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMjApKFwid2tzXCIpLG89cigyKS5TeW1ib2w7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfHwoZVt0XT1vJiZvW3RdfHwob3x8cig2KSkoXCJTeW1ib2wuXCIrdCkpfX0sZnVuY3Rpb24odCxuLHIpe3IoMjYpLHQuZXhwb3J0cz1yKDEpLkFycmF5LnNvbWV9LGZ1bmN0aW9uKHQsbixyKXtyKDI1KSx0LmV4cG9ydHM9cigxKS5TdHJpbmcuZW5kc1dpdGh9LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHQpdGhyb3cgVHlwZUVycm9yKHQrXCIgaXMgbm90IGEgZnVuY3Rpb24hXCIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxuKXt2YXIgcj17fS50b1N0cmluZzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIuY2FsbCh0KS5zbGljZSg4LC0xKX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDEwKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxuLHIpe2lmKGUodCksdm9pZCAwPT09bilyZXR1cm4gdDtzd2l0Y2gocil7Y2FzZSAxOnJldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gdC5jYWxsKG4scil9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24ocixlKXtyZXR1cm4gdC5jYWxsKG4scixlKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihyLGUsbyl7cmV0dXJuIHQuY2FsbChuLHIsZSxvKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkobixhcmd1bWVudHMpfX19LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09dCl0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIrdCk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LG4scil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBuPS8uLzt0cnl7XCIvLi9cIlt0XShuKX1jYXRjaChlKXt0cnl7cmV0dXJuIG5bcig3KShcIm1hdGNoXCIpXT0hMSwhXCIvLi9cIlt0XShuKX1jYXRjaChvKXt9fXJldHVybiEwfX0sZnVuY3Rpb24odCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiEhdCgpfWNhdGNoKG4pe3JldHVybiEwfX19LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVyblwib2JqZWN0XCI9PXR5cGVvZiB0P251bGwhPT10OlwiZnVuY3Rpb25cIj09dHlwZW9mIHR9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigxNiksbz1yKDExKSxpPXIoNykoXCJtYXRjaFwiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIG47cmV0dXJuIGUodCkmJih2b2lkIDAhPT0obj10W2ldKT8hIW46XCJSZWdFeHBcIj09byh0KSl9fSxmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbih0LG4pe3JldHVybntlbnVtZXJhYmxlOiEoMSZ0KSxjb25maWd1cmFibGU6ISgyJnQpLHdyaXRhYmxlOiEoNCZ0KSx2YWx1ZTpufX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDIpLG89cig0KSxpPXIoNikoXCJzcmNcIiksdT1cInRvU3RyaW5nXCIsYz1GdW5jdGlvblt1XSxmPShcIlwiK2MpLnNwbGl0KHUpO3IoMSkuaW5zcGVjdFNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gYy5jYWxsKHQpfSwodC5leHBvcnRzPWZ1bmN0aW9uKHQsbixyLHUpe1wiZnVuY3Rpb25cIj09dHlwZW9mIHImJihvKHIsaSx0W25dP1wiXCIrdFtuXTpmLmpvaW4oU3RyaW5nKG4pKSksXCJuYW1lXCJpbiByfHwoci5uYW1lPW4pKSx0PT09ZT90W25dPXI6KHV8fGRlbGV0ZSB0W25dLG8odCxuLHIpKX0pKEZ1bmN0aW9uLnByb3RvdHlwZSx1LGZ1bmN0aW9uKCl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcyYmdGhpc1tpXXx8Yy5jYWxsKHRoaXMpfSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDIpLG89XCJfX2NvcmUtanNfc2hhcmVkX19cIixpPWVbb118fChlW29dPXt9KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGlbdF18fChpW3RdPXt9KX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDE3KSxvPXIoMTMpO3QuZXhwb3J0cz1mdW5jdGlvbih0LG4scil7aWYoZShuKSl0aHJvdyBUeXBlRXJyb3IoXCJTdHJpbmcjXCIrcitcIiBkb2Vzbid0IGFjY2VwdCByZWdleCFcIik7cmV0dXJuIFN0cmluZyhvKHQpKX19LGZ1bmN0aW9uKHQsbixyKXt0LmV4cG9ydHM9IXIoMTUpKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSxcImFcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pfSxmdW5jdGlvbih0LG4pe3ZhciByPU1hdGguY2VpbCxlPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0PSt0KT8wOih0PjA/ZTpyKSh0KX19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDIzKSxvPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdD4wP28oZSh0KSw5MDA3MTk5MjU0NzQwOTkxKTowfX0sZnVuY3Rpb24odCxuLHIpe1widXNlIHN0cmljdFwiO3ZhciBlPXIoMyksbz1yKDI0KSxpPXIoMjEpLHU9XCJlbmRzV2l0aFwiLGM9XCJcIlt1XTtlKGUuUCtlLkYqcigxNCkodSksXCJTdHJpbmdcIix7ZW5kc1dpdGg6ZnVuY3Rpb24odCl7dmFyIG49aSh0aGlzLHQsdSkscj1hcmd1bWVudHMsZT1yLmxlbmd0aD4xP3JbMV06dm9pZCAwLGY9byhuLmxlbmd0aCkscz12b2lkIDA9PT1lP2Y6TWF0aC5taW4obyhlKSxmKSxhPVN0cmluZyh0KTtyZXR1cm4gYz9jLmNhbGwobixhLHMpOm4uc2xpY2Uocy1hLmxlbmd0aCxzKT09PWF9fSl9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDUpLG89cigzKSxpPXIoMSkuQXJyYXl8fEFycmF5LHU9e30sYz1mdW5jdGlvbih0LG4pe2UuZWFjaC5jYWxsKHQuc3BsaXQoXCIsXCIpLGZ1bmN0aW9uKHQpe3ZvaWQgMD09biYmdCBpbiBpP3VbdF09aVt0XTp0IGluW10mJih1W3RdPXIoMTIpKEZ1bmN0aW9uLmNhbGwsW11bdF0sbikpfSl9O2MoXCJwb3AscmV2ZXJzZSxzaGlmdCxrZXlzLHZhbHVlcyxlbnRyaWVzXCIsMSksYyhcImluZGV4T2YsZXZlcnksc29tZSxmb3JFYWNoLG1hcCxmaWx0ZXIsZmluZCxmaW5kSW5kZXgsaW5jbHVkZXNcIiwzKSxjKFwiam9pbixzbGljZSxjb25jYXQscHVzaCxzcGxpY2UsdW5zaGlmdCxzb3J0LGxhc3RJbmRleE9mLHJlZHVjZSxyZWR1Y2VSaWdodCxjb3B5V2l0aGluLGZpbGxcIiksbyhvLlMsXCJBcnJheVwiLHUpfV0pO1xuXG4vKioqLyB9KSxcbi8qIDUgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRcInVzZSBzdHJpY3RcIjtcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRleHBvcnRzLmRlZmF1bHQgPSBnZXREYXRhVHJhbnNmZXJGaWxlcztcblx0ZnVuY3Rpb24gZ2V0RGF0YVRyYW5zZmVyRmlsZXMoZXZlbnQpIHtcblx0ICB2YXIgZGF0YVRyYW5zZmVySXRlbXNMaXN0ID0gW107XG5cdCAgaWYgKGV2ZW50LmRhdGFUcmFuc2Zlcikge1xuXHQgICAgdmFyIGR0ID0gZXZlbnQuZGF0YVRyYW5zZmVyO1xuXHQgICAgaWYgKGR0LmZpbGVzICYmIGR0LmZpbGVzLmxlbmd0aCkge1xuXHQgICAgICBkYXRhVHJhbnNmZXJJdGVtc0xpc3QgPSBkdC5maWxlcztcblx0ICAgIH0gZWxzZSBpZiAoZHQuaXRlbXMgJiYgZHQuaXRlbXMubGVuZ3RoKSB7XG5cdCAgICAgIC8vIER1cmluZyB0aGUgZHJhZyBldmVuIHRoZSBkYXRhVHJhbnNmZXIuZmlsZXMgaXMgbnVsbFxuXHQgICAgICAvLyBidXQgQ2hyb21lIGltcGxlbWVudHMgc29tZSBkcmFnIHN0b3JlLCB3aGljaCBpcyBhY2Nlc2libGUgdmlhIGRhdGFUcmFuc2Zlci5pdGVtc1xuXHQgICAgICBkYXRhVHJhbnNmZXJJdGVtc0xpc3QgPSBkdC5pdGVtcztcblx0ICAgIH1cblx0ICB9IGVsc2UgaWYgKGV2ZW50LnRhcmdldCAmJiBldmVudC50YXJnZXQuZmlsZXMpIHtcblx0ICAgIGRhdGFUcmFuc2Zlckl0ZW1zTGlzdCA9IGV2ZW50LnRhcmdldC5maWxlcztcblx0ICB9XG5cdCAgLy8gQ29udmVydCBmcm9tIERhdGFUcmFuc2Zlckl0ZW1zTGlzdCB0byB0aGUgbmF0aXZlIEFycmF5XG5cdCAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRhdGFUcmFuc2Zlckl0ZW1zTGlzdCk7XG5cdH1cblx0bW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTtcblxuLyoqKi8gfSlcbi8qKioqKiovIF0pXG59KTtcbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8qXG4gKiBDb3B5cmlnaHQgMjAxNywgWWFob28gSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLlxuICogU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wRGVmYXVsdCAoZXgpIHsgcmV0dXJuIChleCAmJiAodHlwZW9mIGV4ID09PSAnb2JqZWN0JykgJiYgJ2RlZmF1bHQnIGluIGV4KSA/IGV4WydkZWZhdWx0J10gOiBleDsgfVxuXG52YXIgYWxsTG9jYWxlRGF0YSA9IF9pbnRlcm9wRGVmYXVsdChyZXF1aXJlKCcuLi9sb2NhbGUtZGF0YS9pbmRleC5qcycpKTtcbnZhciBJbnRsTWVzc2FnZUZvcm1hdCA9IF9pbnRlcm9wRGVmYXVsdChyZXF1aXJlKCdpbnRsLW1lc3NhZ2Vmb3JtYXQnKSk7XG52YXIgSW50bFJlbGF0aXZlRm9ybWF0ID0gX2ludGVyb3BEZWZhdWx0KHJlcXVpcmUoJ2ludGwtcmVsYXRpdmVmb3JtYXQnKSk7XG52YXIgUHJvcFR5cGVzID0gX2ludGVyb3BEZWZhdWx0KHJlcXVpcmUoJ3Byb3AtdHlwZXMnKSk7XG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xudmFyIFJlYWN0X19kZWZhdWx0ID0gX2ludGVyb3BEZWZhdWx0KFJlYWN0KTtcbnZhciBpbnZhcmlhbnQgPSBfaW50ZXJvcERlZmF1bHQocmVxdWlyZSgnaW52YXJpYW50JykpO1xudmFyIG1lbW9pemVJbnRsQ29uc3RydWN0b3IgPSBfaW50ZXJvcERlZmF1bHQocmVxdWlyZSgnaW50bC1mb3JtYXQtY2FjaGUnKSk7XG5cbi8vIEdFTkVSQVRFRCBGSUxFXG52YXIgZGVmYXVsdExvY2FsZURhdGEgPSB7IFwibG9jYWxlXCI6IFwiZW5cIiwgXCJwbHVyYWxSdWxlRnVuY3Rpb25cIjogZnVuY3Rpb24gcGx1cmFsUnVsZUZ1bmN0aW9uKG4sIG9yZCkge1xuICAgIHZhciBzID0gU3RyaW5nKG4pLnNwbGl0KFwiLlwiKSxcbiAgICAgICAgdjAgPSAhc1sxXSxcbiAgICAgICAgdDAgPSBOdW1iZXIoc1swXSkgPT0gbixcbiAgICAgICAgbjEwID0gdDAgJiYgc1swXS5zbGljZSgtMSksXG4gICAgICAgIG4xMDAgPSB0MCAmJiBzWzBdLnNsaWNlKC0yKTtpZiAob3JkKSByZXR1cm4gbjEwID09IDEgJiYgbjEwMCAhPSAxMSA/IFwib25lXCIgOiBuMTAgPT0gMiAmJiBuMTAwICE9IDEyID8gXCJ0d29cIiA6IG4xMCA9PSAzICYmIG4xMDAgIT0gMTMgPyBcImZld1wiIDogXCJvdGhlclwiO3JldHVybiBuID09IDEgJiYgdjAgPyBcIm9uZVwiIDogXCJvdGhlclwiO1xuICB9LCBcImZpZWxkc1wiOiB7IFwieWVhclwiOiB7IFwiZGlzcGxheU5hbWVcIjogXCJ5ZWFyXCIsIFwicmVsYXRpdmVcIjogeyBcIjBcIjogXCJ0aGlzIHllYXJcIiwgXCIxXCI6IFwibmV4dCB5ZWFyXCIsIFwiLTFcIjogXCJsYXN0IHllYXJcIiB9LCBcInJlbGF0aXZlVGltZVwiOiB7IFwiZnV0dXJlXCI6IHsgXCJvbmVcIjogXCJpbiB7MH0geWVhclwiLCBcIm90aGVyXCI6IFwiaW4gezB9IHllYXJzXCIgfSwgXCJwYXN0XCI6IHsgXCJvbmVcIjogXCJ7MH0geWVhciBhZ29cIiwgXCJvdGhlclwiOiBcInswfSB5ZWFycyBhZ29cIiB9IH0gfSwgXCJtb250aFwiOiB7IFwiZGlzcGxheU5hbWVcIjogXCJtb250aFwiLCBcInJlbGF0aXZlXCI6IHsgXCIwXCI6IFwidGhpcyBtb250aFwiLCBcIjFcIjogXCJuZXh0IG1vbnRoXCIsIFwiLTFcIjogXCJsYXN0IG1vbnRoXCIgfSwgXCJyZWxhdGl2ZVRpbWVcIjogeyBcImZ1dHVyZVwiOiB7IFwib25lXCI6IFwiaW4gezB9IG1vbnRoXCIsIFwib3RoZXJcIjogXCJpbiB7MH0gbW9udGhzXCIgfSwgXCJwYXN0XCI6IHsgXCJvbmVcIjogXCJ7MH0gbW9udGggYWdvXCIsIFwib3RoZXJcIjogXCJ7MH0gbW9udGhzIGFnb1wiIH0gfSB9LCBcImRheVwiOiB7IFwiZGlzcGxheU5hbWVcIjogXCJkYXlcIiwgXCJyZWxhdGl2ZVwiOiB7IFwiMFwiOiBcInRvZGF5XCIsIFwiMVwiOiBcInRvbW9ycm93XCIsIFwiLTFcIjogXCJ5ZXN0ZXJkYXlcIiB9LCBcInJlbGF0aXZlVGltZVwiOiB7IFwiZnV0dXJlXCI6IHsgXCJvbmVcIjogXCJpbiB7MH0gZGF5XCIsIFwib3RoZXJcIjogXCJpbiB7MH0gZGF5c1wiIH0sIFwicGFzdFwiOiB7IFwib25lXCI6IFwiezB9IGRheSBhZ29cIiwgXCJvdGhlclwiOiBcInswfSBkYXlzIGFnb1wiIH0gfSB9LCBcImhvdXJcIjogeyBcImRpc3BsYXlOYW1lXCI6IFwiaG91clwiLCBcInJlbGF0aXZlVGltZVwiOiB7IFwiZnV0dXJlXCI6IHsgXCJvbmVcIjogXCJpbiB7MH0gaG91clwiLCBcIm90aGVyXCI6IFwiaW4gezB9IGhvdXJzXCIgfSwgXCJwYXN0XCI6IHsgXCJvbmVcIjogXCJ7MH0gaG91ciBhZ29cIiwgXCJvdGhlclwiOiBcInswfSBob3VycyBhZ29cIiB9IH0gfSwgXCJtaW51dGVcIjogeyBcImRpc3BsYXlOYW1lXCI6IFwibWludXRlXCIsIFwicmVsYXRpdmVUaW1lXCI6IHsgXCJmdXR1cmVcIjogeyBcIm9uZVwiOiBcImluIHswfSBtaW51dGVcIiwgXCJvdGhlclwiOiBcImluIHswfSBtaW51dGVzXCIgfSwgXCJwYXN0XCI6IHsgXCJvbmVcIjogXCJ7MH0gbWludXRlIGFnb1wiLCBcIm90aGVyXCI6IFwiezB9IG1pbnV0ZXMgYWdvXCIgfSB9IH0sIFwic2Vjb25kXCI6IHsgXCJkaXNwbGF5TmFtZVwiOiBcInNlY29uZFwiLCBcInJlbGF0aXZlXCI6IHsgXCIwXCI6IFwibm93XCIgfSwgXCJyZWxhdGl2ZVRpbWVcIjogeyBcImZ1dHVyZVwiOiB7IFwib25lXCI6IFwiaW4gezB9IHNlY29uZFwiLCBcIm90aGVyXCI6IFwiaW4gezB9IHNlY29uZHNcIiB9LCBcInBhc3RcIjogeyBcIm9uZVwiOiBcInswfSBzZWNvbmQgYWdvXCIsIFwib3RoZXJcIjogXCJ7MH0gc2Vjb25kcyBhZ29cIiB9IH0gfSB9IH07XG5cbi8qXG4gKiBDb3B5cmlnaHQgMjAxNSwgWWFob28gSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLlxuICogU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuXG5mdW5jdGlvbiBhZGRMb2NhbGVEYXRhKCkge1xuICAgIHZhciBkYXRhID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbXTtcblxuICAgIHZhciBsb2NhbGVzID0gQXJyYXkuaXNBcnJheShkYXRhKSA/IGRhdGEgOiBbZGF0YV07XG5cbiAgICBsb2NhbGVzLmZvckVhY2goZnVuY3Rpb24gKGxvY2FsZURhdGEpIHtcbiAgICAgICAgaWYgKGxvY2FsZURhdGEgJiYgbG9jYWxlRGF0YS5sb2NhbGUpIHtcbiAgICAgICAgICAgIEludGxNZXNzYWdlRm9ybWF0Ll9fYWRkTG9jYWxlRGF0YShsb2NhbGVEYXRhKTtcbiAgICAgICAgICAgIEludGxSZWxhdGl2ZUZvcm1hdC5fX2FkZExvY2FsZURhdGEobG9jYWxlRGF0YSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gaGFzTG9jYWxlRGF0YShsb2NhbGUpIHtcbiAgICB2YXIgbG9jYWxlUGFydHMgPSAobG9jYWxlIHx8ICcnKS5zcGxpdCgnLScpO1xuXG4gICAgd2hpbGUgKGxvY2FsZVBhcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKGhhc0lNRkFuZElSRkxvY2FsZURhdGEobG9jYWxlUGFydHMuam9pbignLScpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBsb2NhbGVQYXJ0cy5wb3AoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGhhc0lNRkFuZElSRkxvY2FsZURhdGEobG9jYWxlKSB7XG4gICAgdmFyIG5vcm1hbGl6ZWRMb2NhbGUgPSBsb2NhbGUgJiYgbG9jYWxlLnRvTG93ZXJDYXNlKCk7XG5cbiAgICByZXR1cm4gISEoSW50bE1lc3NhZ2VGb3JtYXQuX19sb2NhbGVEYXRhX19bbm9ybWFsaXplZExvY2FsZV0gJiYgSW50bFJlbGF0aXZlRm9ybWF0Ll9fbG9jYWxlRGF0YV9fW25vcm1hbGl6ZWRMb2NhbGVdKTtcbn1cblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmo7XG59IDogZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbn07XG5cblxuXG5cblxuXG5cblxuXG5cblxudmFyIGNsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn07XG5cbnZhciBjcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfTtcbn0oKTtcblxuXG5cblxuXG52YXIgZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiAob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG5cblxudmFyIGluaGVyaXRzID0gZnVuY3Rpb24gKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufTtcblxuXG5cblxuXG5cblxuXG5cbnZhciBvYmplY3RXaXRob3V0UHJvcGVydGllcyA9IGZ1bmN0aW9uIChvYmosIGtleXMpIHtcbiAgdmFyIHRhcmdldCA9IHt9O1xuXG4gIGZvciAodmFyIGkgaW4gb2JqKSB7XG4gICAgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTtcbiAgICB0YXJnZXRbaV0gPSBvYmpbaV07XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0O1xufTtcblxudmFyIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gPSBmdW5jdGlvbiAoc2VsZiwgY2FsbCkge1xuICBpZiAoIXNlbGYpIHtcbiAgICB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7XG4gIH1cblxuICByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjtcbn07XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbnZhciB0b0NvbnN1bWFibGVBcnJheSA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkge1xuICAgIGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG5cbiAgICByZXR1cm4gYXJyMjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShhcnIpO1xuICB9XG59O1xuXG4vKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cbiAqIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxudmFyIGJvb2wgPSBQcm9wVHlwZXMuYm9vbDtcbnZhciBudW1iZXIgPSBQcm9wVHlwZXMubnVtYmVyO1xudmFyIHN0cmluZyA9IFByb3BUeXBlcy5zdHJpbmc7XG52YXIgZnVuYyA9IFByb3BUeXBlcy5mdW5jO1xudmFyIG9iamVjdCA9IFByb3BUeXBlcy5vYmplY3Q7XG52YXIgb25lT2YgPSBQcm9wVHlwZXMub25lT2Y7XG52YXIgc2hhcGUgPSBQcm9wVHlwZXMuc2hhcGU7XG52YXIgYW55ID0gUHJvcFR5cGVzLmFueTtcblxudmFyIGxvY2FsZU1hdGNoZXIgPSBvbmVPZihbJ2Jlc3QgZml0JywgJ2xvb2t1cCddKTtcbnZhciBuYXJyb3dTaG9ydExvbmcgPSBvbmVPZihbJ25hcnJvdycsICdzaG9ydCcsICdsb25nJ10pO1xudmFyIG51bWVyaWMyZGlnaXQgPSBvbmVPZihbJ251bWVyaWMnLCAnMi1kaWdpdCddKTtcbnZhciBmdW5jUmVxID0gZnVuYy5pc1JlcXVpcmVkO1xuXG52YXIgaW50bENvbmZpZ1Byb3BUeXBlcyA9IHtcbiAgICBsb2NhbGU6IHN0cmluZyxcbiAgICBmb3JtYXRzOiBvYmplY3QsXG4gICAgbWVzc2FnZXM6IG9iamVjdCxcbiAgICB0ZXh0Q29tcG9uZW50OiBhbnksXG5cbiAgICBkZWZhdWx0TG9jYWxlOiBzdHJpbmcsXG4gICAgZGVmYXVsdEZvcm1hdHM6IG9iamVjdFxufTtcblxudmFyIGludGxGb3JtYXRQcm9wVHlwZXMgPSB7XG4gICAgZm9ybWF0RGF0ZTogZnVuY1JlcSxcbiAgICBmb3JtYXRUaW1lOiBmdW5jUmVxLFxuICAgIGZvcm1hdFJlbGF0aXZlOiBmdW5jUmVxLFxuICAgIGZvcm1hdE51bWJlcjogZnVuY1JlcSxcbiAgICBmb3JtYXRQbHVyYWw6IGZ1bmNSZXEsXG4gICAgZm9ybWF0TWVzc2FnZTogZnVuY1JlcSxcbiAgICBmb3JtYXRIVE1MTWVzc2FnZTogZnVuY1JlcVxufTtcblxudmFyIGludGxTaGFwZSA9IHNoYXBlKF9leHRlbmRzKHt9LCBpbnRsQ29uZmlnUHJvcFR5cGVzLCBpbnRsRm9ybWF0UHJvcFR5cGVzLCB7XG4gICAgZm9ybWF0dGVyczogb2JqZWN0LFxuICAgIG5vdzogZnVuY1JlcVxufSkpO1xuXG52YXIgbWVzc2FnZURlc2NyaXB0b3JQcm9wVHlwZXMgPSB7XG4gICAgaWQ6IHN0cmluZy5pc1JlcXVpcmVkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6IHN0cmluZ1xufTtcblxudmFyIGRhdGVUaW1lRm9ybWF0UHJvcFR5cGVzID0ge1xuICAgIGxvY2FsZU1hdGNoZXI6IGxvY2FsZU1hdGNoZXIsXG4gICAgZm9ybWF0TWF0Y2hlcjogb25lT2YoWydiYXNpYycsICdiZXN0IGZpdCddKSxcblxuICAgIHRpbWVab25lOiBzdHJpbmcsXG4gICAgaG91cjEyOiBib29sLFxuXG4gICAgd2Vla2RheTogbmFycm93U2hvcnRMb25nLFxuICAgIGVyYTogbmFycm93U2hvcnRMb25nLFxuICAgIHllYXI6IG51bWVyaWMyZGlnaXQsXG4gICAgbW9udGg6IG9uZU9mKFsnbnVtZXJpYycsICcyLWRpZ2l0JywgJ25hcnJvdycsICdzaG9ydCcsICdsb25nJ10pLFxuICAgIGRheTogbnVtZXJpYzJkaWdpdCxcbiAgICBob3VyOiBudW1lcmljMmRpZ2l0LFxuICAgIG1pbnV0ZTogbnVtZXJpYzJkaWdpdCxcbiAgICBzZWNvbmQ6IG51bWVyaWMyZGlnaXQsXG4gICAgdGltZVpvbmVOYW1lOiBvbmVPZihbJ3Nob3J0JywgJ2xvbmcnXSlcbn07XG5cbnZhciBudW1iZXJGb3JtYXRQcm9wVHlwZXMgPSB7XG4gICAgbG9jYWxlTWF0Y2hlcjogbG9jYWxlTWF0Y2hlcixcblxuICAgIHN0eWxlOiBvbmVPZihbJ2RlY2ltYWwnLCAnY3VycmVuY3knLCAncGVyY2VudCddKSxcbiAgICBjdXJyZW5jeTogc3RyaW5nLFxuICAgIGN1cnJlbmN5RGlzcGxheTogb25lT2YoWydzeW1ib2wnLCAnY29kZScsICduYW1lJ10pLFxuICAgIHVzZUdyb3VwaW5nOiBib29sLFxuXG4gICAgbWluaW11bUludGVnZXJEaWdpdHM6IG51bWJlcixcbiAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IG51bWJlcixcbiAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IG51bWJlcixcbiAgICBtaW5pbXVtU2lnbmlmaWNhbnREaWdpdHM6IG51bWJlcixcbiAgICBtYXhpbXVtU2lnbmlmaWNhbnREaWdpdHM6IG51bWJlclxufTtcblxudmFyIHJlbGF0aXZlRm9ybWF0UHJvcFR5cGVzID0ge1xuICAgIHN0eWxlOiBvbmVPZihbJ2Jlc3QgZml0JywgJ251bWVyaWMnXSksXG4gICAgdW5pdHM6IG9uZU9mKFsnc2Vjb25kJywgJ21pbnV0ZScsICdob3VyJywgJ2RheScsICdtb250aCcsICd5ZWFyJ10pXG59O1xuXG52YXIgcGx1cmFsRm9ybWF0UHJvcFR5cGVzID0ge1xuICAgIHN0eWxlOiBvbmVPZihbJ2NhcmRpbmFsJywgJ29yZGluYWwnXSlcbn07XG5cbi8qXG5IVE1MIGVzY2FwaW5nIGFuZCBzaGFsbG93LWVxdWFscyBpbXBsZW1lbnRhdGlvbnMgYXJlIHRoZSBzYW1lIGFzIFJlYWN0J3NcbihvbiBwdXJwb3NlLikgVGhlcmVmb3JlLCBpdCBoYXMgdGhlIGZvbGxvd2luZyBDb3B5cmlnaHQgYW5kIExpY2Vuc2luZzpcblxuQ29weXJpZ2h0IDIwMTMtMjAxNCwgRmFjZWJvb2ssIEluYy5cbkFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cblRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZSBMSUNFTlNFXG5maWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiBSZWFjdCdzIHNvdXJjZSB0cmVlLlxuKi9cblxudmFyIGludGxDb25maWdQcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhpbnRsQ29uZmlnUHJvcFR5cGVzKTtcblxudmFyIEVTQ0FQRURfQ0hBUlMgPSB7XG4gICAgJyYnOiAnJmFtcDsnLFxuICAgICc+JzogJyZndDsnLFxuICAgICc8JzogJyZsdDsnLFxuICAgICdcIic6ICcmcXVvdDsnLFxuICAgICdcXCcnOiAnJiN4Mjc7J1xufTtcblxudmFyIFVOU0FGRV9DSEFSU19SRUdFWCA9IC9bJj48XCInXS9nO1xuXG5mdW5jdGlvbiBlc2NhcGUoc3RyKSB7XG4gICAgcmV0dXJuICgnJyArIHN0cikucmVwbGFjZShVTlNBRkVfQ0hBUlNfUkVHRVgsIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gRVNDQVBFRF9DSEFSU1ttYXRjaF07XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGZpbHRlclByb3BzKHByb3BzLCB3aGl0ZWxpc3QpIHtcbiAgICB2YXIgZGVmYXVsdHMkJDEgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXG4gICAgcmV0dXJuIHdoaXRlbGlzdC5yZWR1Y2UoZnVuY3Rpb24gKGZpbHRlcmVkLCBuYW1lKSB7XG4gICAgICAgIGlmIChwcm9wcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgZmlsdGVyZWRbbmFtZV0gPSBwcm9wc1tuYW1lXTtcbiAgICAgICAgfSBlbHNlIGlmIChkZWZhdWx0cyQkMS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgICAgZmlsdGVyZWRbbmFtZV0gPSBkZWZhdWx0cyQkMVtuYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWx0ZXJlZDtcbiAgICB9LCB7fSk7XG59XG5cbmZ1bmN0aW9uIGludmFyaWFudEludGxDb250ZXh0KCkge1xuICAgIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgICAgaW50bCA9IF9yZWYuaW50bDtcblxuICAgIGludmFyaWFudChpbnRsLCAnW1JlYWN0IEludGxdIENvdWxkIG5vdCBmaW5kIHJlcXVpcmVkIGBpbnRsYCBvYmplY3QuICcgKyAnPEludGxQcm92aWRlcj4gbmVlZHMgdG8gZXhpc3QgaW4gdGhlIGNvbXBvbmVudCBhbmNlc3RyeS4nKTtcbn1cblxuZnVuY3Rpb24gc2hhbGxvd0VxdWFscyhvYmpBLCBvYmpCKSB7XG4gICAgaWYgKG9iakEgPT09IG9iakIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKCh0eXBlb2Ygb2JqQSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yob2JqQSkpICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8ICh0eXBlb2Ygb2JqQiA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2Yob2JqQikpICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgICB2YXIga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcblxuICAgIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVGVzdCBmb3IgQSdzIGtleXMgZGlmZmVyZW50IGZyb20gQi5cbiAgICB2YXIgYkhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5iaW5kKG9iakIpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5c0EubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFiSGFzT3duUHJvcGVydHkoa2V5c0FbaV0pIHx8IG9iakFba2V5c0FbaV1dICE9PSBvYmpCW2tleXNBW2ldXSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHNob3VsZEludGxDb21wb25lbnRVcGRhdGUoX3JlZjIsIG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgdmFyIHByb3BzID0gX3JlZjIucHJvcHMsXG4gICAgICAgIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICAgIF9yZWYyJGNvbnRleHQgPSBfcmVmMi5jb250ZXh0LFxuICAgICAgICBjb250ZXh0ID0gX3JlZjIkY29udGV4dCA9PT0gdW5kZWZpbmVkID8ge30gOiBfcmVmMiRjb250ZXh0O1xuICAgIHZhciBuZXh0Q29udGV4dCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG4gICAgdmFyIF9jb250ZXh0JGludGwgPSBjb250ZXh0LmludGwsXG4gICAgICAgIGludGwgPSBfY29udGV4dCRpbnRsID09PSB1bmRlZmluZWQgPyB7fSA6IF9jb250ZXh0JGludGw7XG4gICAgdmFyIF9uZXh0Q29udGV4dCRpbnRsID0gbmV4dENvbnRleHQuaW50bCxcbiAgICAgICAgbmV4dEludGwgPSBfbmV4dENvbnRleHQkaW50bCA9PT0gdW5kZWZpbmVkID8ge30gOiBfbmV4dENvbnRleHQkaW50bDtcblxuXG4gICAgcmV0dXJuICFzaGFsbG93RXF1YWxzKG5leHRQcm9wcywgcHJvcHMpIHx8ICFzaGFsbG93RXF1YWxzKG5leHRTdGF0ZSwgc3RhdGUpIHx8ICEobmV4dEludGwgPT09IGludGwgfHwgc2hhbGxvd0VxdWFscyhmaWx0ZXJQcm9wcyhuZXh0SW50bCwgaW50bENvbmZpZ1Byb3BOYW1lcyksIGZpbHRlclByb3BzKGludGwsIGludGxDb25maWdQcm9wTmFtZXMpKSk7XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgMjAxNSwgWWFob28gSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLlxuICogU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuXG4vLyBJbnNwaXJlZCBieSByZWFjdC1yZWR1eCdzIGBjb25uZWN0KClgIEhPQyBmYWN0b3J5IGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3JhY2t0L3JlYWN0LXJlZHV4XG5cbmZ1bmN0aW9uIGdldERpc3BsYXlOYW1lKENvbXBvbmVudCQkMSkge1xuICAgIHJldHVybiBDb21wb25lbnQkJDEuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50JCQxLm5hbWUgfHwgJ0NvbXBvbmVudCc7XG59XG5cbmZ1bmN0aW9uIGluamVjdEludGwoV3JhcHBlZENvbXBvbmVudCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICB2YXIgX29wdGlvbnMkaW50bFByb3BOYW1lID0gb3B0aW9ucy5pbnRsUHJvcE5hbWUsXG4gICAgICAgIGludGxQcm9wTmFtZSA9IF9vcHRpb25zJGludGxQcm9wTmFtZSA9PT0gdW5kZWZpbmVkID8gJ2ludGwnIDogX29wdGlvbnMkaW50bFByb3BOYW1lLFxuICAgICAgICBfb3B0aW9ucyR3aXRoUmVmID0gb3B0aW9ucy53aXRoUmVmLFxuICAgICAgICB3aXRoUmVmID0gX29wdGlvbnMkd2l0aFJlZiA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfb3B0aW9ucyR3aXRoUmVmO1xuXG4gICAgdmFyIEluamVjdEludGwgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICAgICAgICBpbmhlcml0cyhJbmplY3RJbnRsLCBfQ29tcG9uZW50KTtcblxuICAgICAgICBmdW5jdGlvbiBJbmplY3RJbnRsKHByb3BzLCBjb250ZXh0KSB7XG4gICAgICAgICAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBJbmplY3RJbnRsKTtcblxuICAgICAgICAgICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoSW5qZWN0SW50bC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKEluamVjdEludGwpKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICAgICAgICAgIGludmFyaWFudEludGxDb250ZXh0KGNvbnRleHQpO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlQ2xhc3MoSW5qZWN0SW50bCwgW3tcbiAgICAgICAgICAgIGtleTogJ2dldFdyYXBwZWRJbnN0YW5jZScsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0V3JhcHBlZEluc3RhbmNlKCkge1xuICAgICAgICAgICAgICAgIGludmFyaWFudCh3aXRoUmVmLCAnW1JlYWN0IEludGxdIFRvIGFjY2VzcyB0aGUgd3JhcHBlZCBpbnN0YW5jZSwgJyArICd0aGUgYHt3aXRoUmVmOiB0cnVlfWAgb3B0aW9uIG11c3QgYmUgc2V0IHdoZW4gY2FsbGluZzogJyArICdgaW5qZWN0SW50bCgpYCcpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmcy53cmFwcGVkSW5zdGFuY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGtleTogJ3JlbmRlcicsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFdyYXBwZWRDb21wb25lbnQsIF9leHRlbmRzKHt9LCB0aGlzLnByb3BzLCBkZWZpbmVQcm9wZXJ0eSh7fSwgaW50bFByb3BOYW1lLCB0aGlzLmNvbnRleHQuaW50bCksIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmOiB3aXRoUmVmID8gJ3dyYXBwZWRJbnN0YW5jZScgOiBudWxsXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XSk7XG4gICAgICAgIHJldHVybiBJbmplY3RJbnRsO1xuICAgIH0oUmVhY3QuQ29tcG9uZW50KTtcblxuICAgIEluamVjdEludGwuZGlzcGxheU5hbWUgPSAnSW5qZWN0SW50bCgnICsgZ2V0RGlzcGxheU5hbWUoV3JhcHBlZENvbXBvbmVudCkgKyAnKSc7XG4gICAgSW5qZWN0SW50bC5jb250ZXh0VHlwZXMgPSB7XG4gICAgICAgIGludGw6IGludGxTaGFwZVxuICAgIH07XG4gICAgSW5qZWN0SW50bC5XcmFwcGVkQ29tcG9uZW50ID0gV3JhcHBlZENvbXBvbmVudDtcblxuXG4gICAgcmV0dXJuIEluamVjdEludGw7XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgMjAxNSwgWWFob28gSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLlxuICogU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuXG5mdW5jdGlvbiBkZWZpbmVNZXNzYWdlcyhtZXNzYWdlRGVzY3JpcHRvcnMpIHtcbiAgLy8gVGhpcyBzaW1wbHkgcmV0dXJucyB3aGF0J3MgcGFzc2VkLWluIGJlY2F1c2UgaXQncyBtZWFudCB0byBiZSBhIGhvb2sgZm9yXG4gIC8vIGJhYmVsLXBsdWdpbi1yZWFjdC1pbnRsLlxuICByZXR1cm4gbWVzc2FnZURlc2NyaXB0b3JzO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cbiAqIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxuLy8gVGhpcyBpcyBhIFwiaGFja1wiIHVudGlsIGEgcHJvcGVyIGBpbnRsLXBsdXJhbGZvcm1hdGAgcGFja2FnZSBpcyBjcmVhdGVkLlxuXG5mdW5jdGlvbiByZXNvbHZlTG9jYWxlKGxvY2FsZXMpIHtcbiAgICAvLyBJbnRsTWVzc2FnZUZvcm1hdCNfcmVzb2x2ZUxvY2FsZSgpIGRvZXMgbm90IGRlcGVuZCBvbiBgdGhpc2AuXG4gICAgcmV0dXJuIEludGxNZXNzYWdlRm9ybWF0LnByb3RvdHlwZS5fcmVzb2x2ZUxvY2FsZShsb2NhbGVzKTtcbn1cblxuZnVuY3Rpb24gZmluZFBsdXJhbEZ1bmN0aW9uKGxvY2FsZSkge1xuICAgIC8vIEludGxNZXNzYWdlRm9ybWF0I19maW5kUGx1cmFsRnVuY3Rpb24oKSBkb2VzIG5vdCBkZXBlbmQgb24gYHRoaXNgLlxuICAgIHJldHVybiBJbnRsTWVzc2FnZUZvcm1hdC5wcm90b3R5cGUuX2ZpbmRQbHVyYWxSdWxlRnVuY3Rpb24obG9jYWxlKTtcbn1cblxudmFyIEludGxQbHVyYWxGb3JtYXQgPSBmdW5jdGlvbiBJbnRsUGx1cmFsRm9ybWF0KGxvY2FsZXMpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW50bFBsdXJhbEZvcm1hdCk7XG5cbiAgICB2YXIgdXNlT3JkaW5hbCA9IG9wdGlvbnMuc3R5bGUgPT09ICdvcmRpbmFsJztcbiAgICB2YXIgcGx1cmFsRm4gPSBmaW5kUGx1cmFsRnVuY3Rpb24ocmVzb2x2ZUxvY2FsZShsb2NhbGVzKSk7XG5cbiAgICB0aGlzLmZvcm1hdCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gcGx1cmFsRm4odmFsdWUsIHVzZU9yZGluYWwpO1xuICAgIH07XG59O1xuXG4vKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cbiAqIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxudmFyIERBVEVfVElNRV9GT1JNQVRfT1BUSU9OUyA9IE9iamVjdC5rZXlzKGRhdGVUaW1lRm9ybWF0UHJvcFR5cGVzKTtcbnZhciBOVU1CRVJfRk9STUFUX09QVElPTlMgPSBPYmplY3Qua2V5cyhudW1iZXJGb3JtYXRQcm9wVHlwZXMpO1xudmFyIFJFTEFUSVZFX0ZPUk1BVF9PUFRJT05TID0gT2JqZWN0LmtleXMocmVsYXRpdmVGb3JtYXRQcm9wVHlwZXMpO1xudmFyIFBMVVJBTF9GT1JNQVRfT1BUSU9OUyA9IE9iamVjdC5rZXlzKHBsdXJhbEZvcm1hdFByb3BUeXBlcyk7XG5cbnZhciBSRUxBVElWRV9GT1JNQVRfVEhSRVNIT0xEUyA9IHtcbiAgICBzZWNvbmQ6IDYwLCAvLyBzZWNvbmRzIHRvIG1pbnV0ZVxuICAgIG1pbnV0ZTogNjAsIC8vIG1pbnV0ZXMgdG8gaG91clxuICAgIGhvdXI6IDI0LCAvLyBob3VycyB0byBkYXlcbiAgICBkYXk6IDMwLCAvLyBkYXlzIHRvIG1vbnRoXG4gICAgbW9udGg6IDEyIH07XG5cbmZ1bmN0aW9uIHVwZGF0ZVJlbGF0aXZlRm9ybWF0VGhyZXNob2xkcyhuZXdUaHJlc2hvbGRzKSB7XG4gICAgdmFyIHRocmVzaG9sZHMgPSBJbnRsUmVsYXRpdmVGb3JtYXQudGhyZXNob2xkcztcbiAgICB0aHJlc2hvbGRzLnNlY29uZCA9IG5ld1RocmVzaG9sZHMuc2Vjb25kO1xuICAgIHRocmVzaG9sZHMubWludXRlID0gbmV3VGhyZXNob2xkcy5taW51dGU7XG4gICAgdGhyZXNob2xkcy5ob3VyID0gbmV3VGhyZXNob2xkcy5ob3VyO1xuICAgIHRocmVzaG9sZHMuZGF5ID0gbmV3VGhyZXNob2xkcy5kYXk7XG4gICAgdGhyZXNob2xkcy5tb250aCA9IG5ld1RocmVzaG9sZHMubW9udGg7XG59XG5cbmZ1bmN0aW9uIGdldE5hbWVkRm9ybWF0KGZvcm1hdHMsIHR5cGUsIG5hbWUpIHtcbiAgICB2YXIgZm9ybWF0ID0gZm9ybWF0cyAmJiBmb3JtYXRzW3R5cGVdICYmIGZvcm1hdHNbdHlwZV1bbmFtZV07XG4gICAgaWYgKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gZm9ybWF0O1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tSZWFjdCBJbnRsXSBObyAnICsgdHlwZSArICcgZm9ybWF0IG5hbWVkOiAnICsgbmFtZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXREYXRlKGNvbmZpZywgc3RhdGUsIHZhbHVlKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICAgIHZhciBsb2NhbGUgPSBjb25maWcubG9jYWxlLFxuICAgICAgICBmb3JtYXRzID0gY29uZmlnLmZvcm1hdHM7XG4gICAgdmFyIGZvcm1hdCA9IG9wdGlvbnMuZm9ybWF0O1xuXG5cbiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICB2YXIgZGVmYXVsdHMkJDEgPSBmb3JtYXQgJiYgZ2V0TmFtZWRGb3JtYXQoZm9ybWF0cywgJ2RhdGUnLCBmb3JtYXQpO1xuICAgIHZhciBmaWx0ZXJlZE9wdGlvbnMgPSBmaWx0ZXJQcm9wcyhvcHRpb25zLCBEQVRFX1RJTUVfRk9STUFUX09QVElPTlMsIGRlZmF1bHRzJCQxKTtcblxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS5nZXREYXRlVGltZUZvcm1hdChsb2NhbGUsIGZpbHRlcmVkT3B0aW9ucykuZm9ybWF0KGRhdGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tSZWFjdCBJbnRsXSBFcnJvciBmb3JtYXR0aW5nIGRhdGUuXFxuJyArIGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFN0cmluZyhkYXRlKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VGltZShjb25maWcsIHN0YXRlLCB2YWx1ZSkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcbiAgICB2YXIgbG9jYWxlID0gY29uZmlnLmxvY2FsZSxcbiAgICAgICAgZm9ybWF0cyA9IGNvbmZpZy5mb3JtYXRzO1xuICAgIHZhciBmb3JtYXQgPSBvcHRpb25zLmZvcm1hdDtcblxuXG4gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgdmFyIGRlZmF1bHRzJCQxID0gZm9ybWF0ICYmIGdldE5hbWVkRm9ybWF0KGZvcm1hdHMsICd0aW1lJywgZm9ybWF0KTtcbiAgICB2YXIgZmlsdGVyZWRPcHRpb25zID0gZmlsdGVyUHJvcHMob3B0aW9ucywgREFURV9USU1FX0ZPUk1BVF9PUFRJT05TLCBkZWZhdWx0cyQkMSk7XG5cbiAgICBpZiAoIWZpbHRlcmVkT3B0aW9ucy5ob3VyICYmICFmaWx0ZXJlZE9wdGlvbnMubWludXRlICYmICFmaWx0ZXJlZE9wdGlvbnMuc2Vjb25kKSB7XG4gICAgICAgIC8vIEFkZCBkZWZhdWx0IGZvcm1hdHRpbmcgb3B0aW9ucyBpZiBob3VyLCBtaW51dGUsIG9yIHNlY29uZCBpc24ndCBkZWZpbmVkLlxuICAgICAgICBmaWx0ZXJlZE9wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgZmlsdGVyZWRPcHRpb25zLCB7IGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnbnVtZXJpYycgfSk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHN0YXRlLmdldERhdGVUaW1lRm9ybWF0KGxvY2FsZSwgZmlsdGVyZWRPcHRpb25zKS5mb3JtYXQoZGF0ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1JlYWN0IEludGxdIEVycm9yIGZvcm1hdHRpbmcgdGltZS5cXG4nICsgZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gU3RyaW5nKGRhdGUpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRSZWxhdGl2ZShjb25maWcsIHN0YXRlLCB2YWx1ZSkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcbiAgICB2YXIgbG9jYWxlID0gY29uZmlnLmxvY2FsZSxcbiAgICAgICAgZm9ybWF0cyA9IGNvbmZpZy5mb3JtYXRzO1xuICAgIHZhciBmb3JtYXQgPSBvcHRpb25zLmZvcm1hdDtcblxuXG4gICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgdmFyIG5vdyA9IG5ldyBEYXRlKG9wdGlvbnMubm93KTtcbiAgICB2YXIgZGVmYXVsdHMkJDEgPSBmb3JtYXQgJiYgZ2V0TmFtZWRGb3JtYXQoZm9ybWF0cywgJ3JlbGF0aXZlJywgZm9ybWF0KTtcbiAgICB2YXIgZmlsdGVyZWRPcHRpb25zID0gZmlsdGVyUHJvcHMob3B0aW9ucywgUkVMQVRJVkVfRk9STUFUX09QVElPTlMsIGRlZmF1bHRzJCQxKTtcblxuICAgIC8vIENhcHR1cmUgdGhlIGN1cnJlbnQgdGhyZXNob2xkIHZhbHVlcywgdGhlbiB0ZW1wb3JhcmlseSBvdmVycmlkZSB0aGVtIHdpdGhcbiAgICAvLyBzcGVjaWZpYyB2YWx1ZXMganVzdCBmb3IgdGhpcyByZW5kZXIuXG4gICAgdmFyIG9sZFRocmVzaG9sZHMgPSBfZXh0ZW5kcyh7fSwgSW50bFJlbGF0aXZlRm9ybWF0LnRocmVzaG9sZHMpO1xuICAgIHVwZGF0ZVJlbGF0aXZlRm9ybWF0VGhyZXNob2xkcyhSRUxBVElWRV9GT1JNQVRfVEhSRVNIT0xEUyk7XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gc3RhdGUuZ2V0UmVsYXRpdmVGb3JtYXQobG9jYWxlLCBmaWx0ZXJlZE9wdGlvbnMpLmZvcm1hdChkYXRlLCB7XG4gICAgICAgICAgICBub3c6IGlzRmluaXRlKG5vdykgPyBub3cgOiBzdGF0ZS5ub3coKVxuICAgICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbUmVhY3QgSW50bF0gRXJyb3IgZm9ybWF0dGluZyByZWxhdGl2ZSB0aW1lLlxcbicgKyBlKTtcbiAgICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAgIHVwZGF0ZVJlbGF0aXZlRm9ybWF0VGhyZXNob2xkcyhvbGRUaHJlc2hvbGRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gU3RyaW5nKGRhdGUpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXROdW1iZXIoY29uZmlnLCBzdGF0ZSwgdmFsdWUpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG4gICAgdmFyIGxvY2FsZSA9IGNvbmZpZy5sb2NhbGUsXG4gICAgICAgIGZvcm1hdHMgPSBjb25maWcuZm9ybWF0cztcbiAgICB2YXIgZm9ybWF0ID0gb3B0aW9ucy5mb3JtYXQ7XG5cblxuICAgIHZhciBkZWZhdWx0cyQkMSA9IGZvcm1hdCAmJiBnZXROYW1lZEZvcm1hdChmb3JtYXRzLCAnbnVtYmVyJywgZm9ybWF0KTtcbiAgICB2YXIgZmlsdGVyZWRPcHRpb25zID0gZmlsdGVyUHJvcHMob3B0aW9ucywgTlVNQkVSX0ZPUk1BVF9PUFRJT05TLCBkZWZhdWx0cyQkMSk7XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gc3RhdGUuZ2V0TnVtYmVyRm9ybWF0KGxvY2FsZSwgZmlsdGVyZWRPcHRpb25zKS5mb3JtYXQodmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tSZWFjdCBJbnRsXSBFcnJvciBmb3JtYXR0aW5nIG51bWJlci5cXG4nICsgZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0UGx1cmFsKGNvbmZpZywgc3RhdGUsIHZhbHVlKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICAgIHZhciBsb2NhbGUgPSBjb25maWcubG9jYWxlO1xuXG5cbiAgICB2YXIgZmlsdGVyZWRPcHRpb25zID0gZmlsdGVyUHJvcHMob3B0aW9ucywgUExVUkFMX0ZPUk1BVF9PUFRJT05TKTtcblxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS5nZXRQbHVyYWxGb3JtYXQobG9jYWxlLCBmaWx0ZXJlZE9wdGlvbnMpLmZvcm1hdCh2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1JlYWN0IEludGxdIEVycm9yIGZvcm1hdHRpbmcgcGx1cmFsLlxcbicgKyBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnb3RoZXInO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRNZXNzYWdlKGNvbmZpZywgc3RhdGUpIHtcbiAgICB2YXIgbWVzc2FnZURlc2NyaXB0b3IgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuICAgIHZhciB2YWx1ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICAgIHZhciBsb2NhbGUgPSBjb25maWcubG9jYWxlLFxuICAgICAgICBmb3JtYXRzID0gY29uZmlnLmZvcm1hdHMsXG4gICAgICAgIG1lc3NhZ2VzID0gY29uZmlnLm1lc3NhZ2VzLFxuICAgICAgICBkZWZhdWx0TG9jYWxlID0gY29uZmlnLmRlZmF1bHRMb2NhbGUsXG4gICAgICAgIGRlZmF1bHRGb3JtYXRzID0gY29uZmlnLmRlZmF1bHRGb3JtYXRzO1xuICAgIHZhciBpZCA9IG1lc3NhZ2VEZXNjcmlwdG9yLmlkLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZSA9IG1lc3NhZ2VEZXNjcmlwdG9yLmRlZmF1bHRNZXNzYWdlO1xuXG4gICAgLy8gYGlkYCBpcyBhIHJlcXVpcmVkIGZpZWxkIG9mIGEgTWVzc2FnZSBEZXNjcmlwdG9yLlxuXG4gICAgaW52YXJpYW50KGlkLCAnW1JlYWN0IEludGxdIEFuIGBpZGAgbXVzdCBiZSBwcm92aWRlZCB0byBmb3JtYXQgYSBtZXNzYWdlLicpO1xuXG4gICAgdmFyIG1lc3NhZ2UgPSBtZXNzYWdlcyAmJiBtZXNzYWdlc1tpZF07XG4gICAgdmFyIGhhc1ZhbHVlcyA9IE9iamVjdC5rZXlzKHZhbHVlcykubGVuZ3RoID4gMDtcblxuICAgIC8vIEF2b2lkIGV4cGVuc2l2ZSBtZXNzYWdlIGZvcm1hdHRpbmcgZm9yIHNpbXBsZSBtZXNzYWdlcyB3aXRob3V0IHZhbHVlcy4gSW5cbiAgICAvLyBkZXZlbG9wbWVudCBtZXNzYWdlcyB3aWxsIGFsd2F5cyBiZSBmb3JtYXR0ZWQgaW4gY2FzZSBvZiBtaXNzaW5nIHZhbHVlcy5cbiAgICBpZiAoIWhhc1ZhbHVlcyAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlIHx8IGRlZmF1bHRNZXNzYWdlIHx8IGlkO1xuICAgIH1cblxuICAgIHZhciBmb3JtYXR0ZWRNZXNzYWdlID0gdm9pZCAwO1xuXG4gICAgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBmb3JtYXR0ZXIgPSBzdGF0ZS5nZXRNZXNzYWdlRm9ybWF0KG1lc3NhZ2UsIGxvY2FsZSwgZm9ybWF0cyk7XG5cbiAgICAgICAgICAgIGZvcm1hdHRlZE1lc3NhZ2UgPSBmb3JtYXR0ZXIuZm9ybWF0KHZhbHVlcyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1JlYWN0IEludGxdIEVycm9yIGZvcm1hdHRpbmcgbWVzc2FnZTogXCInICsgaWQgKyAnXCIgZm9yIGxvY2FsZTogXCInICsgbG9jYWxlICsgJ1wiJyArIChkZWZhdWx0TWVzc2FnZSA/ICcsIHVzaW5nIGRlZmF1bHQgbWVzc2FnZSBhcyBmYWxsYmFjay4nIDogJycpICsgKCdcXG4nICsgZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgd2FybmluZ3MgZnJvbSBsaXR0ZXJpbmcgdGhlIGNvbnNvbGUgaW4gZGV2ZWxvcG1lbnRcbiAgICAgICAgICAgIC8vIHdoZW4gbm8gYG1lc3NhZ2VzYCBhcmUgcGFzc2VkIGludG8gdGhlIDxJbnRsUHJvdmlkZXI+IGZvciB0aGVcbiAgICAgICAgICAgIC8vIGRlZmF1bHQgbG9jYWxlLCBhbmQgYSBkZWZhdWx0IG1lc3NhZ2UgaXMgaW4gdGhlIHNvdXJjZS5cbiAgICAgICAgICAgIGlmICghZGVmYXVsdE1lc3NhZ2UgfHwgbG9jYWxlICYmIGxvY2FsZS50b0xvd2VyQ2FzZSgpICE9PSBkZWZhdWx0TG9jYWxlLnRvTG93ZXJDYXNlKCkpIHtcblxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tSZWFjdCBJbnRsXSBNaXNzaW5nIG1lc3NhZ2U6IFwiJyArIGlkICsgJ1wiIGZvciBsb2NhbGU6IFwiJyArIGxvY2FsZSArICdcIicgKyAoZGVmYXVsdE1lc3NhZ2UgPyAnLCB1c2luZyBkZWZhdWx0IG1lc3NhZ2UgYXMgZmFsbGJhY2suJyA6ICcnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWZvcm1hdHRlZE1lc3NhZ2UgJiYgZGVmYXVsdE1lc3NhZ2UpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBfZm9ybWF0dGVyID0gc3RhdGUuZ2V0TWVzc2FnZUZvcm1hdChkZWZhdWx0TWVzc2FnZSwgZGVmYXVsdExvY2FsZSwgZGVmYXVsdEZvcm1hdHMpO1xuXG4gICAgICAgICAgICBmb3JtYXR0ZWRNZXNzYWdlID0gX2Zvcm1hdHRlci5mb3JtYXQodmFsdWVzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbUmVhY3QgSW50bF0gRXJyb3IgZm9ybWF0dGluZyB0aGUgZGVmYXVsdCBtZXNzYWdlIGZvcjogXCInICsgaWQgKyAnXCInICsgKCdcXG4nICsgZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFmb3JtYXR0ZWRNZXNzYWdlKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbUmVhY3QgSW50bF0gQ2Fubm90IGZvcm1hdCBtZXNzYWdlOiBcIicgKyBpZCArICdcIiwgJyArICgndXNpbmcgbWVzc2FnZSAnICsgKG1lc3NhZ2UgfHwgZGVmYXVsdE1lc3NhZ2UgPyAnc291cmNlJyA6ICdpZCcpICsgJyBhcyBmYWxsYmFjay4nKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZm9ybWF0dGVkTWVzc2FnZSB8fCBtZXNzYWdlIHx8IGRlZmF1bHRNZXNzYWdlIHx8IGlkO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRIVE1MTWVzc2FnZShjb25maWcsIHN0YXRlLCBtZXNzYWdlRGVzY3JpcHRvcikge1xuICAgIHZhciByYXdWYWx1ZXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuXG4gICAgLy8gUHJvY2VzcyBhbGwgdGhlIHZhbHVlcyBiZWZvcmUgdGhleSBhcmUgdXNlZCB3aGVuIGZvcm1hdHRpbmcgdGhlIElDVVxuICAgIC8vIE1lc3NhZ2Ugc3RyaW5nLiBTaW5jZSB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UgbWlnaHQgYmUgaW5qZWN0ZWQgdmlhXG4gICAgLy8gYGlubmVySFRNTGAsIGFsbCBTdHJpbmctYmFzZWQgdmFsdWVzIG5lZWQgdG8gYmUgSFRNTC1lc2NhcGVkLlxuICAgIHZhciBlc2NhcGVkVmFsdWVzID0gT2JqZWN0LmtleXMocmF3VmFsdWVzKS5yZWR1Y2UoZnVuY3Rpb24gKGVzY2FwZWQsIG5hbWUpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gcmF3VmFsdWVzW25hbWVdO1xuICAgICAgICBlc2NhcGVkW25hbWVdID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IGVzY2FwZSh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGVzY2FwZWQ7XG4gICAgfSwge30pO1xuXG4gICAgcmV0dXJuIGZvcm1hdE1lc3NhZ2UoY29uZmlnLCBzdGF0ZSwgbWVzc2FnZURlc2NyaXB0b3IsIGVzY2FwZWRWYWx1ZXMpO1xufVxuXG5cblxudmFyIGZvcm1hdCA9IE9iamVjdC5mcmVlemUoe1xuXHRmb3JtYXREYXRlOiBmb3JtYXREYXRlLFxuXHRmb3JtYXRUaW1lOiBmb3JtYXRUaW1lLFxuXHRmb3JtYXRSZWxhdGl2ZTogZm9ybWF0UmVsYXRpdmUsXG5cdGZvcm1hdE51bWJlcjogZm9ybWF0TnVtYmVyLFxuXHRmb3JtYXRQbHVyYWw6IGZvcm1hdFBsdXJhbCxcblx0Zm9ybWF0TWVzc2FnZTogZm9ybWF0TWVzc2FnZSxcblx0Zm9ybWF0SFRNTE1lc3NhZ2U6IGZvcm1hdEhUTUxNZXNzYWdlXG59KTtcblxuLypcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG4gKiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbnZhciBpbnRsQ29uZmlnUHJvcE5hbWVzJDEgPSBPYmplY3Qua2V5cyhpbnRsQ29uZmlnUHJvcFR5cGVzKTtcbnZhciBpbnRsRm9ybWF0UHJvcE5hbWVzID0gT2JqZWN0LmtleXMoaW50bEZvcm1hdFByb3BUeXBlcyk7XG5cbi8vIFRoZXNlIGFyZSBub3QgYSBzdGF0aWMgcHJvcGVydHkgb24gdGhlIGBJbnRsUHJvdmlkZXJgIGNsYXNzIHNvIHRoZSBpbnRsXG4vLyBjb25maWcgdmFsdWVzIGNhbiBiZSBpbmhlcml0ZWQgZnJvbSBhbiA8SW50bFByb3ZpZGVyPiBhbmNlc3Rvci5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gICAgZm9ybWF0czoge30sXG4gICAgbWVzc2FnZXM6IHt9LFxuICAgIHRleHRDb21wb25lbnQ6ICdzcGFuJyxcblxuICAgIGRlZmF1bHRMb2NhbGU6ICdlbicsXG4gICAgZGVmYXVsdEZvcm1hdHM6IHt9XG59O1xuXG52YXIgSW50bFByb3ZpZGVyID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICBpbmhlcml0cyhJbnRsUHJvdmlkZXIsIF9Db21wb25lbnQpO1xuXG4gICAgZnVuY3Rpb24gSW50bFByb3ZpZGVyKHByb3BzKSB7XG4gICAgICAgIHZhciBjb250ZXh0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICAgICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSW50bFByb3ZpZGVyKTtcblxuICAgICAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChJbnRsUHJvdmlkZXIuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihJbnRsUHJvdmlkZXIpKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICAgICAgaW52YXJpYW50KHR5cGVvZiBJbnRsICE9PSAndW5kZWZpbmVkJywgJ1tSZWFjdCBJbnRsXSBUaGUgYEludGxgIEFQSXMgbXVzdCBiZSBhdmFpbGFibGUgaW4gdGhlIHJ1bnRpbWUsICcgKyAnYW5kIGRvIG5vdCBhcHBlYXIgdG8gYmUgYnVpbHQtaW4uIEFuIGBJbnRsYCBwb2x5ZmlsbCBzaG91bGQgYmUgbG9hZGVkLlxcbicgKyAnU2VlOiBodHRwOi8vZm9ybWF0anMuaW8vZ3VpZGVzL3J1bnRpbWUtZW52aXJvbm1lbnRzLycpO1xuXG4gICAgICAgIHZhciBpbnRsQ29udGV4dCA9IGNvbnRleHQuaW50bDtcblxuICAgICAgICAvLyBVc2VkIHRvIHN0YWJpbGl6ZSB0aW1lIHdoZW4gcGVyZm9ybWluZyBhbiBpbml0aWFsIHJlbmRlcmluZyBzbyB0aGF0XG4gICAgICAgIC8vIGFsbCByZWxhdGl2ZSB0aW1lcyB1c2UgdGhlIHNhbWUgcmVmZXJlbmNlIFwibm93XCIgdGltZS5cblxuICAgICAgICB2YXIgaW5pdGlhbE5vdyA9IHZvaWQgMDtcbiAgICAgICAgaWYgKGlzRmluaXRlKHByb3BzLmluaXRpYWxOb3cpKSB7XG4gICAgICAgICAgICBpbml0aWFsTm93ID0gTnVtYmVyKHByb3BzLmluaXRpYWxOb3cpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gV2hlbiBhbiBgaW5pdGlhbE5vd2AgaXNuJ3QgcHJvdmlkZWQgdmlhIGBwcm9wc2AsIGxvb2sgdG8gc2VlIGFuXG4gICAgICAgICAgICAvLyA8SW50bFByb3ZpZGVyPiBleGlzdHMgaW4gdGhlIGFuY2VzdHJ5IGFuZCBjYWxsIGl0cyBgbm93KClgXG4gICAgICAgICAgICAvLyBmdW5jdGlvbiB0byBwcm9wYWdhdGUgaXRzIHZhbHVlIGZvciBcIm5vd1wiLlxuICAgICAgICAgICAgaW5pdGlhbE5vdyA9IGludGxDb250ZXh0ID8gaW50bENvbnRleHQubm93KCkgOiBEYXRlLm5vdygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRpbmcgYEludGwqYCBmb3JtYXR0ZXJzIGlzIGV4cGVuc2l2ZS4gSWYgdGhlcmUncyBhIHBhcmVudFxuICAgICAgICAvLyBgPEludGxQcm92aWRlcj5gLCB0aGVuIGl0cyBmb3JtYXR0ZXJzIHdpbGwgYmUgdXNlZC4gT3RoZXJ3aXNlLCB0aGlzXG4gICAgICAgIC8vIG1lbW9pemUgdGhlIGBJbnRsKmAgY29uc3RydWN0b3JzIGFuZCBjYWNoZSB0aGVtIGZvciB0aGUgbGlmZWN5Y2xlIG9mXG4gICAgICAgIC8vIHRoaXMgSW50bFByb3ZpZGVyIGluc3RhbmNlLlxuXG4gICAgICAgIHZhciBfcmVmID0gaW50bENvbnRleHQgfHwge30sXG4gICAgICAgICAgICBfcmVmJGZvcm1hdHRlcnMgPSBfcmVmLmZvcm1hdHRlcnMsXG4gICAgICAgICAgICBmb3JtYXR0ZXJzID0gX3JlZiRmb3JtYXR0ZXJzID09PSB1bmRlZmluZWQgPyB7XG4gICAgICAgICAgICBnZXREYXRlVGltZUZvcm1hdDogbWVtb2l6ZUludGxDb25zdHJ1Y3RvcihJbnRsLkRhdGVUaW1lRm9ybWF0KSxcbiAgICAgICAgICAgIGdldE51bWJlckZvcm1hdDogbWVtb2l6ZUludGxDb25zdHJ1Y3RvcihJbnRsLk51bWJlckZvcm1hdCksXG4gICAgICAgICAgICBnZXRNZXNzYWdlRm9ybWF0OiBtZW1vaXplSW50bENvbnN0cnVjdG9yKEludGxNZXNzYWdlRm9ybWF0KSxcbiAgICAgICAgICAgIGdldFJlbGF0aXZlRm9ybWF0OiBtZW1vaXplSW50bENvbnN0cnVjdG9yKEludGxSZWxhdGl2ZUZvcm1hdCksXG4gICAgICAgICAgICBnZXRQbHVyYWxGb3JtYXQ6IG1lbW9pemVJbnRsQ29uc3RydWN0b3IoSW50bFBsdXJhbEZvcm1hdClcbiAgICAgICAgfSA6IF9yZWYkZm9ybWF0dGVycztcblxuICAgICAgICBfdGhpcy5zdGF0ZSA9IF9leHRlbmRzKHt9LCBmb3JtYXR0ZXJzLCB7XG5cbiAgICAgICAgICAgIC8vIFdyYXBwZXIgdG8gcHJvdmlkZSBzdGFibGUgXCJub3dcIiB0aW1lIGZvciBpbml0aWFsIHJlbmRlci5cbiAgICAgICAgICAgIG5vdzogZnVuY3Rpb24gbm93KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fZGlkRGlzcGxheSA/IERhdGUubm93KCkgOiBpbml0aWFsTm93O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIGNyZWF0ZUNsYXNzKEludGxQcm92aWRlciwgW3tcbiAgICAgICAga2V5OiAnZ2V0Q29uZmlnJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldENvbmZpZygpIHtcbiAgICAgICAgICAgIHZhciBpbnRsQ29udGV4dCA9IHRoaXMuY29udGV4dC5pbnRsO1xuXG4gICAgICAgICAgICAvLyBCdWlsZCBhIHdoaXRlbGlzdGVkIGNvbmZpZyBvYmplY3QgZnJvbSBgcHJvcHNgLCBkZWZhdWx0cywgYW5kXG4gICAgICAgICAgICAvLyBgY29udGV4dC5pbnRsYCwgaWYgYW4gPEludGxQcm92aWRlcj4gZXhpc3RzIGluIHRoZSBhbmNlc3RyeS5cblxuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IGZpbHRlclByb3BzKHRoaXMucHJvcHMsIGludGxDb25maWdQcm9wTmFtZXMkMSwgaW50bENvbnRleHQpO1xuXG4gICAgICAgICAgICAvLyBBcHBseSBkZWZhdWx0IHByb3BzLiBUaGlzIG11c3QgYmUgYXBwbGllZCBsYXN0IGFmdGVyIHRoZSBwcm9wcyBoYXZlXG4gICAgICAgICAgICAvLyBiZWVuIHJlc29sdmVkIGFuZCBpbmhlcml0ZWQgZnJvbSBhbnkgPEludGxQcm92aWRlcj4gaW4gdGhlIGFuY2VzdHJ5LlxuICAgICAgICAgICAgLy8gVGhpcyBtYXRjaGVzIGhvdyBSZWFjdCByZXNvbHZlcyBgZGVmYXVsdFByb3BzYC5cbiAgICAgICAgICAgIGZvciAodmFyIHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgICAgICAgICAgIGlmIChjb25maWdbcHJvcE5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWhhc0xvY2FsZURhdGEoY29uZmlnLmxvY2FsZSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgX2NvbmZpZyA9IGNvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gX2NvbmZpZy5sb2NhbGUsXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRMb2NhbGUgPSBfY29uZmlnLmRlZmF1bHRMb2NhbGUsXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRGb3JtYXRzID0gX2NvbmZpZy5kZWZhdWx0Rm9ybWF0cztcblxuXG4gICAgICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1JlYWN0IEludGxdIE1pc3NpbmcgbG9jYWxlIGRhdGEgZm9yIGxvY2FsZTogXCInICsgbG9jYWxlICsgJ1wiLiAnICsgKCdVc2luZyBkZWZhdWx0IGxvY2FsZTogXCInICsgZGVmYXVsdExvY2FsZSArICdcIiBhcyBmYWxsYmFjay4nKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlcmUncyBubyByZWdpc3RlcmVkIGxvY2FsZSBkYXRhIGZvciBgbG9jYWxlYCwgdGhpcyB3aWxsXG4gICAgICAgICAgICAgICAgLy8gZmFsbGJhY2sgdG8gdGhlIGBkZWZhdWx0TG9jYWxlYCB0byBtYWtlIHN1cmUgdGhpbmdzIGNhbiByZW5kZXIuXG4gICAgICAgICAgICAgICAgLy8gVGhlIGBtZXNzYWdlc2AgYXJlIG92ZXJyaWRkZW4gdG8gdGhlIGBkZWZhdWx0UHJvcHNgIGVtcHR5IG9iamVjdFxuICAgICAgICAgICAgICAgIC8vIHRvIG1haW50YWluIHJlZmVyZW50aWFsIGVxdWFsaXR5IGFjcm9zcyByZS1yZW5kZXJzLiBJdCdzIGFzc3VtZWRcbiAgICAgICAgICAgICAgICAvLyBlYWNoIDxGb3JtYXR0ZWRNZXNzYWdlPiBjb250YWlucyBhIGBkZWZhdWx0TWVzc2FnZWAgcHJvcC5cbiAgICAgICAgICAgICAgICBjb25maWcgPSBfZXh0ZW5kcyh7fSwgY29uZmlnLCB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZTogZGVmYXVsdExvY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0czogZGVmYXVsdEZvcm1hdHMsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzOiBkZWZhdWx0UHJvcHMubWVzc2FnZXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnZ2V0Qm91bmRGb3JtYXRGbnMnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Qm91bmRGb3JtYXRGbnMoY29uZmlnLCBzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGludGxGb3JtYXRQcm9wTmFtZXMucmVkdWNlKGZ1bmN0aW9uIChib3VuZEZvcm1hdEZucywgbmFtZSkge1xuICAgICAgICAgICAgICAgIGJvdW5kRm9ybWF0Rm5zW25hbWVdID0gZm9ybWF0W25hbWVdLmJpbmQobnVsbCwgY29uZmlnLCBzdGF0ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGJvdW5kRm9ybWF0Rm5zO1xuICAgICAgICAgICAgfSwge30pO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdnZXRDaGlsZENvbnRleHQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q2hpbGRDb250ZXh0KCkge1xuICAgICAgICAgICAgdmFyIGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG5cbiAgICAgICAgICAgIC8vIEJpbmQgaW50bCBmYWN0b3JpZXMgYW5kIGN1cnJlbnQgY29uZmlnIHRvIHRoZSBmb3JtYXQgZnVuY3Rpb25zLlxuICAgICAgICAgICAgdmFyIGJvdW5kRm9ybWF0Rm5zID0gdGhpcy5nZXRCb3VuZEZvcm1hdEZucyhjb25maWcsIHRoaXMuc3RhdGUpO1xuXG4gICAgICAgICAgICB2YXIgX3N0YXRlID0gdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgICBub3cgPSBfc3RhdGUubm93LFxuICAgICAgICAgICAgICAgIGZvcm1hdHRlcnMgPSBvYmplY3RXaXRob3V0UHJvcGVydGllcyhfc3RhdGUsIFsnbm93J10pO1xuXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaW50bDogX2V4dGVuZHMoe30sIGNvbmZpZywgYm91bmRGb3JtYXRGbnMsIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyczogZm9ybWF0dGVycyxcbiAgICAgICAgICAgICAgICAgICAgbm93OiBub3dcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnc2hvdWxkQ29tcG9uZW50VXBkYXRlJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBuZXh0ID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICAgICAgbmV4dFtfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHNob3VsZEludGxDb21wb25lbnRVcGRhdGUuYXBwbHkodW5kZWZpbmVkLCBbdGhpc10uY29uY2F0KG5leHQpKTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnY29tcG9uZW50RGlkTW91bnQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgICAgICB0aGlzLl9kaWREaXNwbGF5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAncmVuZGVyJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgICAgIHJldHVybiBSZWFjdC5DaGlsZHJlbi5vbmx5KHRoaXMucHJvcHMuY2hpbGRyZW4pO1xuICAgICAgICB9XG4gICAgfV0pO1xuICAgIHJldHVybiBJbnRsUHJvdmlkZXI7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbkludGxQcm92aWRlci5kaXNwbGF5TmFtZSA9ICdJbnRsUHJvdmlkZXInO1xuSW50bFByb3ZpZGVyLmNvbnRleHRUeXBlcyA9IHtcbiAgICBpbnRsOiBpbnRsU2hhcGVcbn07XG5JbnRsUHJvdmlkZXIuY2hpbGRDb250ZXh0VHlwZXMgPSB7XG4gICAgaW50bDogaW50bFNoYXBlLmlzUmVxdWlyZWRcbn07XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBJbnRsUHJvdmlkZXIucHJvcFR5cGVzID0gX2V4dGVuZHMoe30sIGludGxDb25maWdQcm9wVHlwZXMsIHtcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLmVsZW1lbnQuaXNSZXF1aXJlZCxcbiAgICBpbml0aWFsTm93OiBQcm9wVHlwZXMuYW55XG59KSA6IHZvaWQgMDtcblxuLypcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG4gKiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbnZhciBGb3JtYXR0ZWREYXRlID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICBpbmhlcml0cyhGb3JtYXR0ZWREYXRlLCBfQ29tcG9uZW50KTtcblxuICAgIGZ1bmN0aW9uIEZvcm1hdHRlZERhdGUocHJvcHMsIGNvbnRleHQpIHtcbiAgICAgICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9ybWF0dGVkRGF0ZSk7XG5cbiAgICAgICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoRm9ybWF0dGVkRGF0ZS5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKEZvcm1hdHRlZERhdGUpKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICAgICAgaW52YXJpYW50SW50bENvbnRleHQoY29udGV4dCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG5cbiAgICBjcmVhdGVDbGFzcyhGb3JtYXR0ZWREYXRlLCBbe1xuICAgICAgICBrZXk6ICdzaG91bGRDb21wb25lbnRVcGRhdGUnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG5leHQgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgICAgICBuZXh0W19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gc2hvdWxkSW50bENvbXBvbmVudFVwZGF0ZS5hcHBseSh1bmRlZmluZWQsIFt0aGlzXS5jb25jYXQobmV4dCkpO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdyZW5kZXInLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICAgICAgdmFyIF9jb250ZXh0JGludGwgPSB0aGlzLmNvbnRleHQuaW50bCxcbiAgICAgICAgICAgICAgICBmb3JtYXREYXRlID0gX2NvbnRleHQkaW50bC5mb3JtYXREYXRlLFxuICAgICAgICAgICAgICAgIFRleHQgPSBfY29udGV4dCRpbnRsLnRleHRDb21wb25lbnQ7XG4gICAgICAgICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IF9wcm9wcy52YWx1ZSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbjtcblxuXG4gICAgICAgICAgICB2YXIgZm9ybWF0dGVkRGF0ZSA9IGZvcm1hdERhdGUodmFsdWUsIHRoaXMucHJvcHMpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuKGZvcm1hdHRlZERhdGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICBUZXh0LFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkRGF0ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1dKTtcbiAgICByZXR1cm4gRm9ybWF0dGVkRGF0ZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuRm9ybWF0dGVkRGF0ZS5kaXNwbGF5TmFtZSA9ICdGb3JtYXR0ZWREYXRlJztcbkZvcm1hdHRlZERhdGUuY29udGV4dFR5cGVzID0ge1xuICAgIGludGw6IGludGxTaGFwZVxufTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEZvcm1hdHRlZERhdGUucHJvcFR5cGVzID0gX2V4dGVuZHMoe30sIGRhdGVUaW1lRm9ybWF0UHJvcFR5cGVzLCB7XG4gICAgdmFsdWU6IFByb3BUeXBlcy5hbnkuaXNSZXF1aXJlZCxcbiAgICBmb3JtYXQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5mdW5jXG59KSA6IHZvaWQgMDtcblxuLypcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG4gKiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbnZhciBGb3JtYXR0ZWRUaW1lID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICBpbmhlcml0cyhGb3JtYXR0ZWRUaW1lLCBfQ29tcG9uZW50KTtcblxuICAgIGZ1bmN0aW9uIEZvcm1hdHRlZFRpbWUocHJvcHMsIGNvbnRleHQpIHtcbiAgICAgICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9ybWF0dGVkVGltZSk7XG5cbiAgICAgICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoRm9ybWF0dGVkVGltZS5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKEZvcm1hdHRlZFRpbWUpKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICAgICAgaW52YXJpYW50SW50bENvbnRleHQoY29udGV4dCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG5cbiAgICBjcmVhdGVDbGFzcyhGb3JtYXR0ZWRUaW1lLCBbe1xuICAgICAgICBrZXk6ICdzaG91bGRDb21wb25lbnRVcGRhdGUnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG5leHQgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgICAgICBuZXh0W19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gc2hvdWxkSW50bENvbXBvbmVudFVwZGF0ZS5hcHBseSh1bmRlZmluZWQsIFt0aGlzXS5jb25jYXQobmV4dCkpO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdyZW5kZXInLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICAgICAgdmFyIF9jb250ZXh0JGludGwgPSB0aGlzLmNvbnRleHQuaW50bCxcbiAgICAgICAgICAgICAgICBmb3JtYXRUaW1lID0gX2NvbnRleHQkaW50bC5mb3JtYXRUaW1lLFxuICAgICAgICAgICAgICAgIFRleHQgPSBfY29udGV4dCRpbnRsLnRleHRDb21wb25lbnQ7XG4gICAgICAgICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IF9wcm9wcy52YWx1ZSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbjtcblxuXG4gICAgICAgICAgICB2YXIgZm9ybWF0dGVkVGltZSA9IGZvcm1hdFRpbWUodmFsdWUsIHRoaXMucHJvcHMpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuKGZvcm1hdHRlZFRpbWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICBUZXh0LFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkVGltZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1dKTtcbiAgICByZXR1cm4gRm9ybWF0dGVkVGltZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuRm9ybWF0dGVkVGltZS5kaXNwbGF5TmFtZSA9ICdGb3JtYXR0ZWRUaW1lJztcbkZvcm1hdHRlZFRpbWUuY29udGV4dFR5cGVzID0ge1xuICAgIGludGw6IGludGxTaGFwZVxufTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEZvcm1hdHRlZFRpbWUucHJvcFR5cGVzID0gX2V4dGVuZHMoe30sIGRhdGVUaW1lRm9ybWF0UHJvcFR5cGVzLCB7XG4gICAgdmFsdWU6IFByb3BUeXBlcy5hbnkuaXNSZXF1aXJlZCxcbiAgICBmb3JtYXQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5mdW5jXG59KSA6IHZvaWQgMDtcblxuLypcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG4gKiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbnZhciBTRUNPTkQgPSAxMDAwO1xudmFyIE1JTlVURSA9IDEwMDAgKiA2MDtcbnZhciBIT1VSID0gMTAwMCAqIDYwICogNjA7XG52YXIgREFZID0gMTAwMCAqIDYwICogNjAgKiAyNDtcblxuLy8gVGhlIG1heGltdW0gdGltZXIgZGVsYXkgdmFsdWUgaXMgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIuXG4vLyBTZWU6IGh0dHBzOi8vbWRuLmlvL3NldFRpbWVvdXRcbnZhciBNQVhfVElNRVJfREVMQVkgPSAyMTQ3NDgzNjQ3O1xuXG5mdW5jdGlvbiBzZWxlY3RVbml0cyhkZWx0YSkge1xuICAgIHZhciBhYnNEZWx0YSA9IE1hdGguYWJzKGRlbHRhKTtcblxuICAgIGlmIChhYnNEZWx0YSA8IE1JTlVURSkge1xuICAgICAgICByZXR1cm4gJ3NlY29uZCc7XG4gICAgfVxuXG4gICAgaWYgKGFic0RlbHRhIDwgSE9VUikge1xuICAgICAgICByZXR1cm4gJ21pbnV0ZSc7XG4gICAgfVxuXG4gICAgaWYgKGFic0RlbHRhIDwgREFZKSB7XG4gICAgICAgIHJldHVybiAnaG91cic7XG4gICAgfVxuXG4gICAgLy8gVGhlIG1heGltdW0gc2NoZWR1bGVkIGRlbGF5IHdpbGwgYmUgbWVhc3VyZWQgaW4gZGF5cyBzaW5jZSB0aGUgbWF4aW11bVxuICAgIC8vIHRpbWVyIGRlbGF5IGlzIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpbiAyNSBkYXlzLlxuICAgIHJldHVybiAnZGF5Jztcbn1cblxuZnVuY3Rpb24gZ2V0VW5pdERlbGF5KHVuaXRzKSB7XG4gICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgcmV0dXJuIFNFQ09ORDtcbiAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgICAgIHJldHVybiBNSU5VVEU7XG4gICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgcmV0dXJuIEhPVVI7XG4gICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICByZXR1cm4gREFZO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIE1BWF9USU1FUl9ERUxBWTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzU2FtZURhdGUoYSwgYikge1xuICAgIGlmIChhID09PSBiKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHZhciBhVGltZSA9IG5ldyBEYXRlKGEpLmdldFRpbWUoKTtcbiAgICB2YXIgYlRpbWUgPSBuZXcgRGF0ZShiKS5nZXRUaW1lKCk7XG5cbiAgICByZXR1cm4gaXNGaW5pdGUoYVRpbWUpICYmIGlzRmluaXRlKGJUaW1lKSAmJiBhVGltZSA9PT0gYlRpbWU7XG59XG5cbnZhciBGb3JtYXR0ZWRSZWxhdGl2ZSA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gICAgaW5oZXJpdHMoRm9ybWF0dGVkUmVsYXRpdmUsIF9Db21wb25lbnQpO1xuXG4gICAgZnVuY3Rpb24gRm9ybWF0dGVkUmVsYXRpdmUocHJvcHMsIGNvbnRleHQpIHtcbiAgICAgICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9ybWF0dGVkUmVsYXRpdmUpO1xuXG4gICAgICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKEZvcm1hdHRlZFJlbGF0aXZlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRm9ybWF0dGVkUmVsYXRpdmUpKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICAgICAgaW52YXJpYW50SW50bENvbnRleHQoY29udGV4dCk7XG5cbiAgICAgICAgdmFyIG5vdyA9IGlzRmluaXRlKHByb3BzLmluaXRpYWxOb3cpID8gTnVtYmVyKHByb3BzLmluaXRpYWxOb3cpIDogY29udGV4dC5pbnRsLm5vdygpO1xuXG4gICAgICAgIC8vIGBub3dgIGlzIHN0b3JlZCBhcyBzdGF0ZSBzbyB0aGF0IGByZW5kZXIoKWAgcmVtYWlucyBhIGZ1bmN0aW9uIG9mXG4gICAgICAgIC8vIHByb3BzICsgc3RhdGUsIGluc3RlYWQgb2YgYWNjZXNzaW5nIGBEYXRlLm5vdygpYCBpbnNpZGUgYHJlbmRlcigpYC5cbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7IG5vdzogbm93IH07XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG5cbiAgICBjcmVhdGVDbGFzcyhGb3JtYXR0ZWRSZWxhdGl2ZSwgW3tcbiAgICAgICAga2V5OiAnc2NoZWR1bGVOZXh0VXBkYXRlJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNjaGVkdWxlTmV4dFVwZGF0ZShwcm9wcywgc3RhdGUpIHtcbiAgICAgICAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICAgICAgICAvLyBDYW5jZWwgYW5kIHBlbmRpbmcgdXBkYXRlIGJlY2F1c2Ugd2UncmUgc2NoZWR1bGluZyBhIG5ldyB1cGRhdGUuXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuXG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBwcm9wcy52YWx1ZSxcbiAgICAgICAgICAgICAgICB1bml0cyA9IHByb3BzLnVuaXRzLFxuICAgICAgICAgICAgICAgIHVwZGF0ZUludGVydmFsID0gcHJvcHMudXBkYXRlSW50ZXJ2YWw7XG5cbiAgICAgICAgICAgIHZhciB0aW1lID0gbmV3IERhdGUodmFsdWUpLmdldFRpbWUoKTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIGB1cGRhdGVJbnRlcnZhbGAgaXMgZmFsc3ksIGluY2x1ZGluZyBgMGAgb3Igd2UgZG9uJ3QgaGF2ZSBhXG4gICAgICAgICAgICAvLyB2YWxpZCBkYXRlLCB0aGVuIGF1dG8gdXBkYXRlcyBoYXZlIGJlZW4gdHVybmVkIG9mZiwgc28gd2UgYmFpbCBhbmRcbiAgICAgICAgICAgIC8vIHNraXAgc2NoZWR1bGluZyBhbiB1cGRhdGUuXG4gICAgICAgICAgICBpZiAoIXVwZGF0ZUludGVydmFsIHx8ICFpc0Zpbml0ZSh0aW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGRlbHRhID0gdGltZSAtIHN0YXRlLm5vdztcbiAgICAgICAgICAgIHZhciB1bml0RGVsYXkgPSBnZXRVbml0RGVsYXkodW5pdHMgfHwgc2VsZWN0VW5pdHMoZGVsdGEpKTtcbiAgICAgICAgICAgIHZhciB1bml0UmVtYWluZGVyID0gTWF0aC5hYnMoZGVsdGEgJSB1bml0RGVsYXkpO1xuXG4gICAgICAgICAgICAvLyBXZSB3YW50IHRoZSBsYXJnZXN0IHBvc3NpYmxlIHRpbWVyIGRlbGF5IHdoaWNoIHdpbGwgc3RpbGwgZGlzcGxheVxuICAgICAgICAgICAgLy8gYWNjdXJhdGUgaW5mb3JtYXRpb24gd2hpbGUgcmVkdWNpbmcgdW5uZWNlc3NhcnkgcmUtcmVuZGVycy4gVGhlIGRlbGF5XG4gICAgICAgICAgICAvLyBzaG91bGQgYmUgdW50aWwgdGhlIG5leHQgXCJpbnRlcmVzdGluZ1wiIG1vbWVudCwgbGlrZSBhIHRpY2sgZnJvbVxuICAgICAgICAgICAgLy8gXCIxIG1pbnV0ZSBhZ29cIiB0byBcIjIgbWludXRlcyBhZ29cIiB3aGVuIHRoZSBkZWx0YSBpcyAxMjAsMDAwbXMuXG4gICAgICAgICAgICB2YXIgZGVsYXkgPSBkZWx0YSA8IDAgPyBNYXRoLm1heCh1cGRhdGVJbnRlcnZhbCwgdW5pdERlbGF5IC0gdW5pdFJlbWFpbmRlcikgOiBNYXRoLm1heCh1cGRhdGVJbnRlcnZhbCwgdW5pdFJlbWFpbmRlcik7XG5cbiAgICAgICAgICAgIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMyLnNldFN0YXRlKHsgbm93OiBfdGhpczIuY29udGV4dC5pbnRsLm5vdygpIH0pO1xuICAgICAgICAgICAgfSwgZGVsYXkpO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdjb21wb25lbnREaWRNb3VudCcsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVOZXh0VXBkYXRlKHRoaXMucHJvcHMsIHRoaXMuc3RhdGUpO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoX3JlZikge1xuICAgICAgICAgICAgdmFyIG5leHRWYWx1ZSA9IF9yZWYudmFsdWU7XG5cbiAgICAgICAgICAgIC8vIFdoZW4gdGhlIGBwcm9wcy52YWx1ZWAgZGF0ZSBjaGFuZ2VzLCBgc3RhdGUubm93YCBuZWVkcyB0byBiZSB1cGRhdGVkLFxuICAgICAgICAgICAgLy8gYW5kIHRoZSBuZXh0IHVwZGF0ZSBjYW4gYmUgcmVzY2hlZHVsZWQuXG4gICAgICAgICAgICBpZiAoIWlzU2FtZURhdGUobmV4dFZhbHVlLCB0aGlzLnByb3BzLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBub3c6IHRoaXMuY29udGV4dC5pbnRsLm5vdygpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdzaG91bGRDb21wb25lbnRVcGRhdGUnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG5leHQgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgICAgICBuZXh0W19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gc2hvdWxkSW50bENvbXBvbmVudFVwZGF0ZS5hcHBseSh1bmRlZmluZWQsIFt0aGlzXS5jb25jYXQobmV4dCkpO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdjb21wb25lbnRXaWxsVXBkYXRlJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVcGRhdGUobmV4dFByb3BzLCBuZXh0U3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVOZXh0VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlKTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAnY29tcG9uZW50V2lsbFVubW91bnQnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdyZW5kZXInLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICAgICAgdmFyIF9jb250ZXh0JGludGwgPSB0aGlzLmNvbnRleHQuaW50bCxcbiAgICAgICAgICAgICAgICBmb3JtYXRSZWxhdGl2ZSA9IF9jb250ZXh0JGludGwuZm9ybWF0UmVsYXRpdmUsXG4gICAgICAgICAgICAgICAgVGV4dCA9IF9jb250ZXh0JGludGwudGV4dENvbXBvbmVudDtcbiAgICAgICAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgICAgIHZhbHVlID0gX3Byb3BzLnZhbHVlLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuO1xuXG5cbiAgICAgICAgICAgIHZhciBmb3JtYXR0ZWRSZWxhdGl2ZSA9IGZvcm1hdFJlbGF0aXZlKHZhbHVlLCBfZXh0ZW5kcyh7fSwgdGhpcy5wcm9wcywgdGhpcy5zdGF0ZSkpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuKGZvcm1hdHRlZFJlbGF0aXZlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgVGV4dCxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIGZvcm1hdHRlZFJlbGF0aXZlXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfV0pO1xuICAgIHJldHVybiBGb3JtYXR0ZWRSZWxhdGl2ZTtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuRm9ybWF0dGVkUmVsYXRpdmUuZGlzcGxheU5hbWUgPSAnRm9ybWF0dGVkUmVsYXRpdmUnO1xuRm9ybWF0dGVkUmVsYXRpdmUuY29udGV4dFR5cGVzID0ge1xuICAgIGludGw6IGludGxTaGFwZVxufTtcbkZvcm1hdHRlZFJlbGF0aXZlLmRlZmF1bHRQcm9wcyA9IHtcbiAgICB1cGRhdGVJbnRlcnZhbDogMTAwMCAqIDEwXG59O1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gRm9ybWF0dGVkUmVsYXRpdmUucHJvcFR5cGVzID0gX2V4dGVuZHMoe30sIHJlbGF0aXZlRm9ybWF0UHJvcFR5cGVzLCB7XG4gICAgdmFsdWU6IFByb3BUeXBlcy5hbnkuaXNSZXF1aXJlZCxcbiAgICBmb3JtYXQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgdXBkYXRlSW50ZXJ2YWw6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgaW5pdGlhbE5vdzogUHJvcFR5cGVzLmFueSxcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLmZ1bmNcbn0pIDogdm9pZCAwO1xuXG4vKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cbiAqIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxudmFyIEZvcm1hdHRlZE51bWJlciA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gICAgaW5oZXJpdHMoRm9ybWF0dGVkTnVtYmVyLCBfQ29tcG9uZW50KTtcblxuICAgIGZ1bmN0aW9uIEZvcm1hdHRlZE51bWJlcihwcm9wcywgY29udGV4dCkge1xuICAgICAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBGb3JtYXR0ZWROdW1iZXIpO1xuXG4gICAgICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKEZvcm1hdHRlZE51bWJlci5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKEZvcm1hdHRlZE51bWJlcikpLmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgICAgICBpbnZhcmlhbnRJbnRsQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIGNyZWF0ZUNsYXNzKEZvcm1hdHRlZE51bWJlciwgW3tcbiAgICAgICAga2V5OiAnc2hvdWxkQ29tcG9uZW50VXBkYXRlJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBuZXh0ID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICAgICAgbmV4dFtfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHNob3VsZEludGxDb21wb25lbnRVcGRhdGUuYXBwbHkodW5kZWZpbmVkLCBbdGhpc10uY29uY2F0KG5leHQpKTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAncmVuZGVyJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgICAgIHZhciBfY29udGV4dCRpbnRsID0gdGhpcy5jb250ZXh0LmludGwsXG4gICAgICAgICAgICAgICAgZm9ybWF0TnVtYmVyID0gX2NvbnRleHQkaW50bC5mb3JtYXROdW1iZXIsXG4gICAgICAgICAgICAgICAgVGV4dCA9IF9jb250ZXh0JGludGwudGV4dENvbXBvbmVudDtcbiAgICAgICAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgICAgIHZhbHVlID0gX3Byb3BzLnZhbHVlLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuO1xuXG5cbiAgICAgICAgICAgIHZhciBmb3JtYXR0ZWROdW1iZXIgPSBmb3JtYXROdW1iZXIodmFsdWUsIHRoaXMucHJvcHMpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuKGZvcm1hdHRlZE51bWJlcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgIFRleHQsXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWROdW1iZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XSk7XG4gICAgcmV0dXJuIEZvcm1hdHRlZE51bWJlcjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuRm9ybWF0dGVkTnVtYmVyLmRpc3BsYXlOYW1lID0gJ0Zvcm1hdHRlZE51bWJlcic7XG5Gb3JtYXR0ZWROdW1iZXIuY29udGV4dFR5cGVzID0ge1xuICAgIGludGw6IGludGxTaGFwZVxufTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEZvcm1hdHRlZE51bWJlci5wcm9wVHlwZXMgPSBfZXh0ZW5kcyh7fSwgbnVtYmVyRm9ybWF0UHJvcFR5cGVzLCB7XG4gICAgdmFsdWU6IFByb3BUeXBlcy5hbnkuaXNSZXF1aXJlZCxcbiAgICBmb3JtYXQ6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5mdW5jXG59KSA6IHZvaWQgMDtcblxuLypcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG4gKiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbnZhciBGb3JtYXR0ZWRQbHVyYWwgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICAgIGluaGVyaXRzKEZvcm1hdHRlZFBsdXJhbCwgX0NvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBGb3JtYXR0ZWRQbHVyYWwocHJvcHMsIGNvbnRleHQpIHtcbiAgICAgICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9ybWF0dGVkUGx1cmFsKTtcblxuICAgICAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChGb3JtYXR0ZWRQbHVyYWwuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihGb3JtYXR0ZWRQbHVyYWwpKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICAgICAgaW52YXJpYW50SW50bENvbnRleHQoY29udGV4dCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG5cbiAgICBjcmVhdGVDbGFzcyhGb3JtYXR0ZWRQbHVyYWwsIFt7XG4gICAgICAgIGtleTogJ3Nob3VsZENvbXBvbmVudFVwZGF0ZScsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUoKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbmV4dCA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgICAgICAgIG5leHRbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBzaG91bGRJbnRsQ29tcG9uZW50VXBkYXRlLmFwcGx5KHVuZGVmaW5lZCwgW3RoaXNdLmNvbmNhdChuZXh0KSk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ3JlbmRlcicsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgICAgICB2YXIgX2NvbnRleHQkaW50bCA9IHRoaXMuY29udGV4dC5pbnRsLFxuICAgICAgICAgICAgICAgIGZvcm1hdFBsdXJhbCA9IF9jb250ZXh0JGludGwuZm9ybWF0UGx1cmFsLFxuICAgICAgICAgICAgICAgIFRleHQgPSBfY29udGV4dCRpbnRsLnRleHRDb21wb25lbnQ7XG4gICAgICAgICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IF9wcm9wcy52YWx1ZSxcbiAgICAgICAgICAgICAgICBvdGhlciA9IF9wcm9wcy5vdGhlcixcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbjtcblxuXG4gICAgICAgICAgICB2YXIgcGx1cmFsQ2F0ZWdvcnkgPSBmb3JtYXRQbHVyYWwodmFsdWUsIHRoaXMucHJvcHMpO1xuICAgICAgICAgICAgdmFyIGZvcm1hdHRlZFBsdXJhbCA9IHRoaXMucHJvcHNbcGx1cmFsQ2F0ZWdvcnldIHx8IG90aGVyO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuKGZvcm1hdHRlZFBsdXJhbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgIFRleHQsXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRQbHVyYWxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XSk7XG4gICAgcmV0dXJuIEZvcm1hdHRlZFBsdXJhbDtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuRm9ybWF0dGVkUGx1cmFsLmRpc3BsYXlOYW1lID0gJ0Zvcm1hdHRlZFBsdXJhbCc7XG5Gb3JtYXR0ZWRQbHVyYWwuY29udGV4dFR5cGVzID0ge1xuICAgIGludGw6IGludGxTaGFwZVxufTtcbkZvcm1hdHRlZFBsdXJhbC5kZWZhdWx0UHJvcHMgPSB7XG4gICAgc3R5bGU6ICdjYXJkaW5hbCdcbn07XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBGb3JtYXR0ZWRQbHVyYWwucHJvcFR5cGVzID0gX2V4dGVuZHMoe30sIHBsdXJhbEZvcm1hdFByb3BUeXBlcywge1xuICAgIHZhbHVlOiBQcm9wVHlwZXMuYW55LmlzUmVxdWlyZWQsXG5cbiAgICBvdGhlcjogUHJvcFR5cGVzLm5vZGUuaXNSZXF1aXJlZCxcbiAgICB6ZXJvOiBQcm9wVHlwZXMubm9kZSxcbiAgICBvbmU6IFByb3BUeXBlcy5ub2RlLFxuICAgIHR3bzogUHJvcFR5cGVzLm5vZGUsXG4gICAgZmV3OiBQcm9wVHlwZXMubm9kZSxcbiAgICBtYW55OiBQcm9wVHlwZXMubm9kZSxcblxuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMuZnVuY1xufSkgOiB2b2lkIDA7XG5cbi8qXG4gKiBDb3B5cmlnaHQgMjAxNSwgWWFob28gSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLlxuICogU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuXG52YXIgRm9ybWF0dGVkTWVzc2FnZSA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gICAgaW5oZXJpdHMoRm9ybWF0dGVkTWVzc2FnZSwgX0NvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBGb3JtYXR0ZWRNZXNzYWdlKHByb3BzLCBjb250ZXh0KSB7XG4gICAgICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEZvcm1hdHRlZE1lc3NhZ2UpO1xuXG4gICAgICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKEZvcm1hdHRlZE1lc3NhZ2UuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihGb3JtYXR0ZWRNZXNzYWdlKSkuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgICAgIGludmFyaWFudEludGxDb250ZXh0KGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgY3JlYXRlQ2xhc3MoRm9ybWF0dGVkTWVzc2FnZSwgW3tcbiAgICAgICAga2V5OiAnc2hvdWxkQ29tcG9uZW50VXBkYXRlJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLnByb3BzLnZhbHVlcztcbiAgICAgICAgICAgIHZhciBuZXh0VmFsdWVzID0gbmV4dFByb3BzLnZhbHVlcztcblxuXG4gICAgICAgICAgICBpZiAoIXNoYWxsb3dFcXVhbHMobmV4dFZhbHVlcywgdmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTaW5jZSBgdmFsdWVzYCBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQsIHdlIGtub3cgdGhleSdyZSBub3RcbiAgICAgICAgICAgIC8vIGRpZmZlcmVudCwgc28gdGhlIGN1cnJlbnQgYHZhbHVlc2AgYXJlIGNhcnJpZWQgb3ZlciBzbyB0aGUgc2hhbGxvd1xuICAgICAgICAgICAgLy8gZXF1YWxzIGNvbXBhcmlzb24gb24gdGhlIG90aGVyIHByb3BzIGlzbid0IGFmZmVjdGVkIGJ5IHRoZSBgdmFsdWVzYC5cbiAgICAgICAgICAgIHZhciBuZXh0UHJvcHNUb0NoZWNrID0gX2V4dGVuZHMoe30sIG5leHRQcm9wcywge1xuICAgICAgICAgICAgICAgIHZhbHVlczogdmFsdWVzXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG5leHQgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICAgICAgbmV4dFtfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBzaG91bGRJbnRsQ29tcG9uZW50VXBkYXRlLmFwcGx5KHVuZGVmaW5lZCwgW3RoaXMsIG5leHRQcm9wc1RvQ2hlY2tdLmNvbmNhdChuZXh0KSk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ3JlbmRlcicsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgICAgICB2YXIgX2NvbnRleHQkaW50bCA9IHRoaXMuY29udGV4dC5pbnRsLFxuICAgICAgICAgICAgICAgIGZvcm1hdE1lc3NhZ2UgPSBfY29udGV4dCRpbnRsLmZvcm1hdE1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgVGV4dCA9IF9jb250ZXh0JGludGwudGV4dENvbXBvbmVudDtcbiAgICAgICAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgICAgIGlkID0gX3Byb3BzLmlkLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gX3Byb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlID0gX3Byb3BzLmRlZmF1bHRNZXNzYWdlLFxuICAgICAgICAgICAgICAgIHZhbHVlcyA9IF9wcm9wcy52YWx1ZXMsXG4gICAgICAgICAgICAgICAgX3Byb3BzJHRhZ05hbWUgPSBfcHJvcHMudGFnTmFtZSxcbiAgICAgICAgICAgICAgICBDb21wb25lbnQkJDEgPSBfcHJvcHMkdGFnTmFtZSA9PT0gdW5kZWZpbmVkID8gVGV4dCA6IF9wcm9wcyR0YWdOYW1lLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuO1xuXG5cbiAgICAgICAgICAgIHZhciB0b2tlbkRlbGltaXRlciA9IHZvaWQgMDtcbiAgICAgICAgICAgIHZhciB0b2tlbml6ZWRWYWx1ZXMgPSB2b2lkIDA7XG4gICAgICAgICAgICB2YXIgZWxlbWVudHMgPSB2b2lkIDA7XG5cbiAgICAgICAgICAgIHZhciBoYXNWYWx1ZXMgPSB2YWx1ZXMgJiYgT2JqZWN0LmtleXModmFsdWVzKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgaWYgKGhhc1ZhbHVlcykge1xuICAgICAgICAgICAgICAgIC8vIENyZWF0ZXMgYSB0b2tlbiB3aXRoIGEgcmFuZG9tIFVJRCB0aGF0IHNob3VsZCBub3QgYmUgZ3Vlc3NhYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gY29uZmxpY3Qgd2l0aCBvdGhlciBwYXJ0cyBvZiB0aGUgYG1lc3NhZ2VgIHN0cmluZy5cbiAgICAgICAgICAgICAgICB2YXIgdWlkID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMHgxMDAwMDAwMDAwMCkudG9TdHJpbmcoMTYpO1xuXG4gICAgICAgICAgICAgICAgdmFyIGdlbmVyYXRlVG9rZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnRUxFTUVOVC0nICsgdWlkICsgJy0nICsgKGNvdW50ZXIgKz0gMSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSgpO1xuXG4gICAgICAgICAgICAgICAgLy8gU3BsaXR0aW5nIHdpdGggYSBkZWxpbWl0ZXIgdG8gc3VwcG9ydCBJRTguIFdoZW4gdXNpbmcgYSByZWdleFxuICAgICAgICAgICAgICAgIC8vIHdpdGggYSBjYXB0dXJlIGdyb3VwIElFOCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBjYXB0dXJlIGdyb3VwIGluXG4gICAgICAgICAgICAgICAgLy8gdGhlIHJlc3VsdGluZyBhcnJheS5cbiAgICAgICAgICAgICAgICB0b2tlbkRlbGltaXRlciA9ICdAX18nICsgdWlkICsgJ19fQCc7XG4gICAgICAgICAgICAgICAgdG9rZW5pemVkVmFsdWVzID0ge307XG4gICAgICAgICAgICAgICAgZWxlbWVudHMgPSB7fTtcblxuICAgICAgICAgICAgICAgIC8vIEl0ZXJhdGVzIG92ZXIgdGhlIGBwcm9wc2AgdG8ga2VlcCB0cmFjayBvZiBhbnkgUmVhY3QgRWxlbWVudFxuICAgICAgICAgICAgICAgIC8vIHZhbHVlcyBzbyB0aGV5IGNhbiBiZSByZXByZXNlbnRlZCBieSB0aGUgYHRva2VuYCBhcyBhIHBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgYG1lc3NhZ2VgIGlzIGZvcm1hdHRlZC4gVGhpcyBhbGxvd3MgdGhlIGZvcm1hdHRlZFxuICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgdG8gdGhlbiBiZSBicm9rZW4tdXAgaW50byBwYXJ0cyB3aXRoIHJlZmVyZW5jZXMgdG8gdGhlXG4gICAgICAgICAgICAgICAgLy8gUmVhY3QgRWxlbWVudHMgaW5zZXJ0ZWQgYmFjayBpbi5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZXMpLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVzW25hbWVdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChSZWFjdC5pc1ZhbGlkRWxlbWVudCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IGdlbmVyYXRlVG9rZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuaXplZFZhbHVlc1tuYW1lXSA9IHRva2VuRGVsaW1pdGVyICsgdG9rZW4gKyB0b2tlbkRlbGltaXRlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzW3Rva2VuXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5pemVkVmFsdWVzW25hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSB7IGlkOiBpZCwgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLCBkZWZhdWx0TWVzc2FnZTogZGVmYXVsdE1lc3NhZ2UgfTtcbiAgICAgICAgICAgIHZhciBmb3JtYXR0ZWRNZXNzYWdlID0gZm9ybWF0TWVzc2FnZShkZXNjcmlwdG9yLCB0b2tlbml6ZWRWYWx1ZXMgfHwgdmFsdWVzKTtcblxuICAgICAgICAgICAgdmFyIG5vZGVzID0gdm9pZCAwO1xuXG4gICAgICAgICAgICB2YXIgaGFzRWxlbWVudHMgPSBlbGVtZW50cyAmJiBPYmplY3Qua2V5cyhlbGVtZW50cykubGVuZ3RoID4gMDtcbiAgICAgICAgICAgIGlmIChoYXNFbGVtZW50cykge1xuICAgICAgICAgICAgICAgIC8vIFNwbGl0IHRoZSBtZXNzYWdlIGludG8gcGFydHMgc28gdGhlIFJlYWN0IEVsZW1lbnQgdmFsdWVzIGNhcHR1cmVkXG4gICAgICAgICAgICAgICAgLy8gYWJvdmUgY2FuIGJlIGluc2VydGVkIGJhY2sgaW50byB0aGUgcmVuZGVyZWQgbWVzc2FnZS4gVGhpc1xuICAgICAgICAgICAgICAgIC8vIGFwcHJvYWNoIGFsbG93cyBtZXNzYWdlcyB0byByZW5kZXIgd2l0aCBSZWFjdCBFbGVtZW50cyB3aGlsZVxuICAgICAgICAgICAgICAgIC8vIGtlZXBpbmcgUmVhY3QncyB2aXJ0dWFsIGRpZmZpbmcgd29ya2luZyBwcm9wZXJseS5cbiAgICAgICAgICAgICAgICBub2RlcyA9IGZvcm1hdHRlZE1lc3NhZ2Uuc3BsaXQodG9rZW5EZWxpbWl0ZXIpLmZpbHRlcihmdW5jdGlvbiAocGFydCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFwYXJ0O1xuICAgICAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAocGFydCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudHNbcGFydF0gfHwgcGFydDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbm9kZXMgPSBbZm9ybWF0dGVkTWVzc2FnZV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW4uYXBwbHkodW5kZWZpbmVkLCB0b0NvbnN1bWFibGVBcnJheShub2RlcykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBOZWVkcyB0byB1c2UgYGNyZWF0ZUVsZW1lbnQoKWAgaW5zdGVhZCBvZiBKU1gsIG90aGVyd2lzZSBSZWFjdCB3aWxsXG4gICAgICAgICAgICAvLyB3YXJuIGFib3V0IGEgbWlzc2luZyBga2V5YCBwcm9wIHdpdGggcmljaC10ZXh0IG1lc3NhZ2UgZm9ybWF0dGluZy5cbiAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50LmFwcGx5KHVuZGVmaW5lZCwgW0NvbXBvbmVudCQkMSwgbnVsbF0uY29uY2F0KHRvQ29uc3VtYWJsZUFycmF5KG5vZGVzKSkpO1xuICAgICAgICB9XG4gICAgfV0pO1xuICAgIHJldHVybiBGb3JtYXR0ZWRNZXNzYWdlO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5Gb3JtYXR0ZWRNZXNzYWdlLmRpc3BsYXlOYW1lID0gJ0Zvcm1hdHRlZE1lc3NhZ2UnO1xuRm9ybWF0dGVkTWVzc2FnZS5jb250ZXh0VHlwZXMgPSB7XG4gICAgaW50bDogaW50bFNoYXBlXG59O1xuRm9ybWF0dGVkTWVzc2FnZS5kZWZhdWx0UHJvcHMgPSB7XG4gICAgdmFsdWVzOiB7fVxufTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEZvcm1hdHRlZE1lc3NhZ2UucHJvcFR5cGVzID0gX2V4dGVuZHMoe30sIG1lc3NhZ2VEZXNjcmlwdG9yUHJvcFR5cGVzLCB7XG4gICAgdmFsdWVzOiBQcm9wVHlwZXMub2JqZWN0LFxuICAgIHRhZ05hbWU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5mdW5jXG59KSA6IHZvaWQgMDtcblxuLypcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG4gKiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbnZhciBGb3JtYXR0ZWRIVE1MTWVzc2FnZSA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gICAgaW5oZXJpdHMoRm9ybWF0dGVkSFRNTE1lc3NhZ2UsIF9Db21wb25lbnQpO1xuXG4gICAgZnVuY3Rpb24gRm9ybWF0dGVkSFRNTE1lc3NhZ2UocHJvcHMsIGNvbnRleHQpIHtcbiAgICAgICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9ybWF0dGVkSFRNTE1lc3NhZ2UpO1xuXG4gICAgICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKEZvcm1hdHRlZEhUTUxNZXNzYWdlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRm9ybWF0dGVkSFRNTE1lc3NhZ2UpKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICAgICAgaW52YXJpYW50SW50bENvbnRleHQoY29udGV4dCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG5cbiAgICBjcmVhdGVDbGFzcyhGb3JtYXR0ZWRIVE1MTWVzc2FnZSwgW3tcbiAgICAgICAga2V5OiAnc2hvdWxkQ29tcG9uZW50VXBkYXRlJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZShuZXh0UHJvcHMpIHtcbiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSB0aGlzLnByb3BzLnZhbHVlcztcbiAgICAgICAgICAgIHZhciBuZXh0VmFsdWVzID0gbmV4dFByb3BzLnZhbHVlcztcblxuXG4gICAgICAgICAgICBpZiAoIXNoYWxsb3dFcXVhbHMobmV4dFZhbHVlcywgdmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTaW5jZSBgdmFsdWVzYCBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQsIHdlIGtub3cgdGhleSdyZSBub3RcbiAgICAgICAgICAgIC8vIGRpZmZlcmVudCwgc28gdGhlIGN1cnJlbnQgYHZhbHVlc2AgYXJlIGNhcnJpZWQgb3ZlciBzbyB0aGUgc2hhbGxvd1xuICAgICAgICAgICAgLy8gZXF1YWxzIGNvbXBhcmlzb24gb24gdGhlIG90aGVyIHByb3BzIGlzbid0IGFmZmVjdGVkIGJ5IHRoZSBgdmFsdWVzYC5cbiAgICAgICAgICAgIHZhciBuZXh0UHJvcHNUb0NoZWNrID0gX2V4dGVuZHMoe30sIG5leHRQcm9wcywge1xuICAgICAgICAgICAgICAgIHZhbHVlczogdmFsdWVzXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG5leHQgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICAgICAgbmV4dFtfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBzaG91bGRJbnRsQ29tcG9uZW50VXBkYXRlLmFwcGx5KHVuZGVmaW5lZCwgW3RoaXMsIG5leHRQcm9wc1RvQ2hlY2tdLmNvbmNhdChuZXh0KSk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ3JlbmRlcicsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgICAgICB2YXIgX2NvbnRleHQkaW50bCA9IHRoaXMuY29udGV4dC5pbnRsLFxuICAgICAgICAgICAgICAgIGZvcm1hdEhUTUxNZXNzYWdlID0gX2NvbnRleHQkaW50bC5mb3JtYXRIVE1MTWVzc2FnZSxcbiAgICAgICAgICAgICAgICBUZXh0ID0gX2NvbnRleHQkaW50bC50ZXh0Q29tcG9uZW50O1xuICAgICAgICAgICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgICAgICAgaWQgPSBfcHJvcHMuaWQsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBfcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2UgPSBfcHJvcHMuZGVmYXVsdE1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgcmF3VmFsdWVzID0gX3Byb3BzLnZhbHVlcyxcbiAgICAgICAgICAgICAgICBfcHJvcHMkdGFnTmFtZSA9IF9wcm9wcy50YWdOYW1lLFxuICAgICAgICAgICAgICAgIENvbXBvbmVudCQkMSA9IF9wcm9wcyR0YWdOYW1lID09PSB1bmRlZmluZWQgPyBUZXh0IDogX3Byb3BzJHRhZ05hbWUsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW47XG5cblxuICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSB7IGlkOiBpZCwgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uLCBkZWZhdWx0TWVzc2FnZTogZGVmYXVsdE1lc3NhZ2UgfTtcbiAgICAgICAgICAgIHZhciBmb3JtYXR0ZWRIVE1MTWVzc2FnZSA9IGZvcm1hdEhUTUxNZXNzYWdlKGRlc2NyaXB0b3IsIHJhd1ZhbHVlcyk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW4oZm9ybWF0dGVkSFRNTE1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTaW5jZSB0aGUgbWVzc2FnZSBwcmVzdW1hYmx5IGhhcyBIVE1MIGluIGl0LCB3ZSBuZWVkIHRvIHNldFxuICAgICAgICAgICAgLy8gYGlubmVySFRNTGAgaW4gb3JkZXIgZm9yIGl0IHRvIGJlIHJlbmRlcmVkIGFuZCBub3QgZXNjYXBlZCBieSBSZWFjdC5cbiAgICAgICAgICAgIC8vIFRvIGJlIHNhZmUsIGFsbCBzdHJpbmcgcHJvcCB2YWx1ZXMgd2VyZSBlc2NhcGVkIHdoZW4gZm9ybWF0dGluZyB0aGVcbiAgICAgICAgICAgIC8vIG1lc3NhZ2UuIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgbWVzc2FnZSBpcyBub3QgVUdDLCBhbmQgY2FtZSBmcm9tIHRoZVxuICAgICAgICAgICAgLy8gZGV2ZWxvcGVyIG1ha2luZyBpdCBtb3JlIGxpa2UgYSB0ZW1wbGF0ZS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBOb3RlOiBUaGVyZSdzIGEgcGVyZiBpbXBhY3Qgb2YgdXNpbmcgdGhpcyBjb21wb25lbnQgc2luY2UgdGhlcmUncyBub1xuICAgICAgICAgICAgLy8gd2F5IGZvciBSZWFjdCB0byBkbyBpdHMgdmlydHVhbCBET00gZGlmZmluZy5cbiAgICAgICAgICAgIHZhciBodG1sID0geyBfX2h0bWw6IGZvcm1hdHRlZEhUTUxNZXNzYWdlIH07XG4gICAgICAgICAgICByZXR1cm4gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChDb21wb25lbnQkJDEsIHsgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IGh0bWwgfSk7XG4gICAgICAgIH1cbiAgICB9XSk7XG4gICAgcmV0dXJuIEZvcm1hdHRlZEhUTUxNZXNzYWdlO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5Gb3JtYXR0ZWRIVE1MTWVzc2FnZS5kaXNwbGF5TmFtZSA9ICdGb3JtYXR0ZWRIVE1MTWVzc2FnZSc7XG5Gb3JtYXR0ZWRIVE1MTWVzc2FnZS5jb250ZXh0VHlwZXMgPSB7XG4gICAgaW50bDogaW50bFNoYXBlXG59O1xuRm9ybWF0dGVkSFRNTE1lc3NhZ2UuZGVmYXVsdFByb3BzID0ge1xuICAgIHZhbHVlczoge31cbn07XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBGb3JtYXR0ZWRIVE1MTWVzc2FnZS5wcm9wVHlwZXMgPSBfZXh0ZW5kcyh7fSwgbWVzc2FnZURlc2NyaXB0b3JQcm9wVHlwZXMsIHtcbiAgICB2YWx1ZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgdGFnTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLmZ1bmNcbn0pIDogdm9pZCAwO1xuXG4vKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cbiAqIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxuYWRkTG9jYWxlRGF0YShkZWZhdWx0TG9jYWxlRGF0YSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgMjAxNSwgWWFob28gSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLlxuICogU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuXG5hZGRMb2NhbGVEYXRhKGFsbExvY2FsZURhdGEpO1xuXG5leHBvcnRzLmFkZExvY2FsZURhdGEgPSBhZGRMb2NhbGVEYXRhO1xuZXhwb3J0cy5pbnRsU2hhcGUgPSBpbnRsU2hhcGU7XG5leHBvcnRzLmluamVjdEludGwgPSBpbmplY3RJbnRsO1xuZXhwb3J0cy5kZWZpbmVNZXNzYWdlcyA9IGRlZmluZU1lc3NhZ2VzO1xuZXhwb3J0cy5JbnRsUHJvdmlkZXIgPSBJbnRsUHJvdmlkZXI7XG5leHBvcnRzLkZvcm1hdHRlZERhdGUgPSBGb3JtYXR0ZWREYXRlO1xuZXhwb3J0cy5Gb3JtYXR0ZWRUaW1lID0gRm9ybWF0dGVkVGltZTtcbmV4cG9ydHMuRm9ybWF0dGVkUmVsYXRpdmUgPSBGb3JtYXR0ZWRSZWxhdGl2ZTtcbmV4cG9ydHMuRm9ybWF0dGVkTnVtYmVyID0gRm9ybWF0dGVkTnVtYmVyO1xuZXhwb3J0cy5Gb3JtYXR0ZWRQbHVyYWwgPSBGb3JtYXR0ZWRQbHVyYWw7XG5leHBvcnRzLkZvcm1hdHRlZE1lc3NhZ2UgPSBGb3JtYXR0ZWRNZXNzYWdlO1xuZXhwb3J0cy5Gb3JtYXR0ZWRIVE1MTWVzc2FnZSA9IEZvcm1hdHRlZEhUTUxNZXNzYWdlO1xuIiwiIWZ1bmN0aW9uKGUsYSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9YSgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoYSk6KGUuUmVhY3RJbnRsTG9jYWxlRGF0YT1lLlJlYWN0SW50bExvY2FsZURhdGF8fHt9LGUuUmVhY3RJbnRsTG9jYWxlRGF0YS5lbj1hKCkpfSh0aGlzLGZ1bmN0aW9uKCl7XCJ1c2Ugc3RyaWN0XCI7dmFyIGU9W3tsb2NhbGU6XCJlblwiLHBsdXJhbFJ1bGVGdW5jdGlvbjpmdW5jdGlvbihlLGEpe3ZhciBuPVN0cmluZyhlKS5zcGxpdChcIi5cIiksbD0hblsxXSxvPU51bWJlcihuWzBdKT09ZSx0PW8mJm5bMF0uc2xpY2UoLTEpLHI9byYmblswXS5zbGljZSgtMik7cmV0dXJuIGE/MT09dCYmMTEhPXI/XCJvbmVcIjoyPT10JiYxMiE9cj9cInR3b1wiOjM9PXQmJjEzIT1yP1wiZmV3XCI6XCJvdGhlclwiOjE9PWUmJmw/XCJvbmVcIjpcIm90aGVyXCJ9LGZpZWxkczp7eWVhcjp7ZGlzcGxheU5hbWU6XCJ5ZWFyXCIscmVsYXRpdmU6ezA6XCJ0aGlzIHllYXJcIiwxOlwibmV4dCB5ZWFyXCIsXCItMVwiOlwibGFzdCB5ZWFyXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJpbiB7MH0geWVhclwiLG90aGVyOlwiaW4gezB9IHllYXJzXCJ9LHBhc3Q6e29uZTpcInswfSB5ZWFyIGFnb1wiLG90aGVyOlwiezB9IHllYXJzIGFnb1wifX19LG1vbnRoOntkaXNwbGF5TmFtZTpcIm1vbnRoXCIscmVsYXRpdmU6ezA6XCJ0aGlzIG1vbnRoXCIsMTpcIm5leHQgbW9udGhcIixcIi0xXCI6XCJsYXN0IG1vbnRoXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJpbiB7MH0gbW9udGhcIixvdGhlcjpcImluIHswfSBtb250aHNcIn0scGFzdDp7b25lOlwiezB9IG1vbnRoIGFnb1wiLG90aGVyOlwiezB9IG1vbnRocyBhZ29cIn19fSxkYXk6e2Rpc3BsYXlOYW1lOlwiZGF5XCIscmVsYXRpdmU6ezA6XCJ0b2RheVwiLDE6XCJ0b21vcnJvd1wiLFwiLTFcIjpcInllc3RlcmRheVwifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiaW4gezB9IGRheVwiLG90aGVyOlwiaW4gezB9IGRheXNcIn0scGFzdDp7b25lOlwiezB9IGRheSBhZ29cIixvdGhlcjpcInswfSBkYXlzIGFnb1wifX19LGhvdXI6e2Rpc3BsYXlOYW1lOlwiaG91clwiLHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJpbiB7MH0gaG91clwiLG90aGVyOlwiaW4gezB9IGhvdXJzXCJ9LHBhc3Q6e29uZTpcInswfSBob3VyIGFnb1wiLG90aGVyOlwiezB9IGhvdXJzIGFnb1wifX19LG1pbnV0ZTp7ZGlzcGxheU5hbWU6XCJtaW51dGVcIixyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiaW4gezB9IG1pbnV0ZVwiLG90aGVyOlwiaW4gezB9IG1pbnV0ZXNcIn0scGFzdDp7b25lOlwiezB9IG1pbnV0ZSBhZ29cIixvdGhlcjpcInswfSBtaW51dGVzIGFnb1wifX19LHNlY29uZDp7ZGlzcGxheU5hbWU6XCJzZWNvbmRcIixyZWxhdGl2ZTp7MDpcIm5vd1wifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiaW4gezB9IHNlY29uZFwiLG90aGVyOlwiaW4gezB9IHNlY29uZHNcIn0scGFzdDp7b25lOlwiezB9IHNlY29uZCBhZ29cIixvdGhlcjpcInswfSBzZWNvbmRzIGFnb1wifX19fX0se2xvY2FsZTpcImVuLTAwMVwiLHBhcmVudExvY2FsZTpcImVuXCJ9LHtsb2NhbGU6XCJlbi0xNTBcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUFHXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1BSVwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tQVNcIixwYXJlbnRMb2NhbGU6XCJlblwifSx7bG9jYWxlOlwiZW4tQVRcIixwYXJlbnRMb2NhbGU6XCJlbi0xNTBcIn0se2xvY2FsZTpcImVuLUFVXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1CQlwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tQkVcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUJJXCIscGFyZW50TG9jYWxlOlwiZW5cIn0se2xvY2FsZTpcImVuLUJNXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1CU1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tQldcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUJaXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1DQVwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tQ0NcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUNIXCIscGFyZW50TG9jYWxlOlwiZW4tMTUwXCJ9LHtsb2NhbGU6XCJlbi1DS1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tQ01cIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUNYXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1DWVwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tREVcIixwYXJlbnRMb2NhbGU6XCJlbi0xNTBcIn0se2xvY2FsZTpcImVuLURHXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1ES1wiLHBhcmVudExvY2FsZTpcImVuLTE1MFwifSx7bG9jYWxlOlwiZW4tRE1cIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLURzcnRcIixwbHVyYWxSdWxlRnVuY3Rpb246ZnVuY3Rpb24oZSxhKXtyZXR1cm5cIm90aGVyXCJ9LGZpZWxkczp7eWVhcjp7ZGlzcGxheU5hbWU6XCJZZWFyXCIscmVsYXRpdmU6ezA6XCJ0aGlzIHllYXJcIiwxOlwibmV4dCB5ZWFyXCIsXCItMVwiOlwibGFzdCB5ZWFyXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvdGhlcjpcIit7MH0geVwifSxwYXN0OntvdGhlcjpcIi17MH0geVwifX19LG1vbnRoOntkaXNwbGF5TmFtZTpcIk1vbnRoXCIscmVsYXRpdmU6ezA6XCJ0aGlzIG1vbnRoXCIsMTpcIm5leHQgbW9udGhcIixcIi0xXCI6XCJsYXN0IG1vbnRoXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvdGhlcjpcIit7MH0gbVwifSxwYXN0OntvdGhlcjpcIi17MH0gbVwifX19LGRheTp7ZGlzcGxheU5hbWU6XCJEYXlcIixyZWxhdGl2ZTp7MDpcInRvZGF5XCIsMTpcInRvbW9ycm93XCIsXCItMVwiOlwieWVzdGVyZGF5XCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvdGhlcjpcIit7MH0gZFwifSxwYXN0OntvdGhlcjpcIi17MH0gZFwifX19LGhvdXI6e2Rpc3BsYXlOYW1lOlwiSG91clwiLHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvdGhlcjpcIit7MH0gaFwifSxwYXN0OntvdGhlcjpcIi17MH0gaFwifX19LG1pbnV0ZTp7ZGlzcGxheU5hbWU6XCJNaW51dGVcIixyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b3RoZXI6XCIrezB9IG1pblwifSxwYXN0OntvdGhlcjpcIi17MH0gbWluXCJ9fX0sc2Vjb25kOntkaXNwbGF5TmFtZTpcIlNlY29uZFwiLHJlbGF0aXZlOnswOlwibm93XCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvdGhlcjpcIit7MH0gc1wifSxwYXN0OntvdGhlcjpcIi17MH0gc1wifX19fX0se2xvY2FsZTpcImVuLUVSXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1GSVwiLHBhcmVudExvY2FsZTpcImVuLTE1MFwifSx7bG9jYWxlOlwiZW4tRkpcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUZLXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1GTVwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tR0JcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUdEXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1HR1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tR0hcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUdJXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1HTVwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tR1VcIixwYXJlbnRMb2NhbGU6XCJlblwifSx7bG9jYWxlOlwiZW4tR1lcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUhLXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1JRVwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tSUxcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUlNXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1JTlwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tSU9cIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUpFXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1KTVwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tS0VcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUtJXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1LTlwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tS1lcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUxDXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1MUlwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tTFNcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLU1HXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1NSFwiLHBhcmVudExvY2FsZTpcImVuXCJ9LHtsb2NhbGU6XCJlbi1NT1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tTVBcIixwYXJlbnRMb2NhbGU6XCJlblwifSx7bG9jYWxlOlwiZW4tTVNcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLU1UXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1NVVwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tTVdcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLU1ZXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1OQVwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tTkZcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLU5HXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1OTFwiLHBhcmVudExvY2FsZTpcImVuLTE1MFwifSx7bG9jYWxlOlwiZW4tTlJcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLU5VXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1OWlwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tUEdcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLVBIXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1QS1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tUE5cIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLVBSXCIscGFyZW50TG9jYWxlOlwiZW5cIn0se2xvY2FsZTpcImVuLVBXXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1SV1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tU0JcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLVNDXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1TRFwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tU0VcIixwYXJlbnRMb2NhbGU6XCJlbi0xNTBcIn0se2xvY2FsZTpcImVuLVNHXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1TSFwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tU0lcIixwYXJlbnRMb2NhbGU6XCJlbi0xNTBcIn0se2xvY2FsZTpcImVuLVNMXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1TU1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tU1hcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLVNaXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1TaGF3XCIscGx1cmFsUnVsZUZ1bmN0aW9uOmZ1bmN0aW9uKGUsYSl7cmV0dXJuXCJvdGhlclwifSxmaWVsZHM6e3llYXI6e2Rpc3BsYXlOYW1lOlwiWWVhclwiLHJlbGF0aXZlOnswOlwidGhpcyB5ZWFyXCIsMTpcIm5leHQgeWVhclwiLFwiLTFcIjpcImxhc3QgeWVhclwifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b3RoZXI6XCIrezB9IHlcIn0scGFzdDp7b3RoZXI6XCItezB9IHlcIn19fSxtb250aDp7ZGlzcGxheU5hbWU6XCJNb250aFwiLHJlbGF0aXZlOnswOlwidGhpcyBtb250aFwiLDE6XCJuZXh0IG1vbnRoXCIsXCItMVwiOlwibGFzdCBtb250aFwifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b3RoZXI6XCIrezB9IG1cIn0scGFzdDp7b3RoZXI6XCItezB9IG1cIn19fSxkYXk6e2Rpc3BsYXlOYW1lOlwiRGF5XCIscmVsYXRpdmU6ezA6XCJ0b2RheVwiLDE6XCJ0b21vcnJvd1wiLFwiLTFcIjpcInllc3RlcmRheVwifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b3RoZXI6XCIrezB9IGRcIn0scGFzdDp7b3RoZXI6XCItezB9IGRcIn19fSxob3VyOntkaXNwbGF5TmFtZTpcIkhvdXJcIixyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b3RoZXI6XCIrezB9IGhcIn0scGFzdDp7b3RoZXI6XCItezB9IGhcIn19fSxtaW51dGU6e2Rpc3BsYXlOYW1lOlwiTWludXRlXCIscmVsYXRpdmVUaW1lOntmdXR1cmU6e290aGVyOlwiK3swfSBtaW5cIn0scGFzdDp7b3RoZXI6XCItezB9IG1pblwifX19LHNlY29uZDp7ZGlzcGxheU5hbWU6XCJTZWNvbmRcIixyZWxhdGl2ZTp7MDpcIm5vd1wifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b3RoZXI6XCIrezB9IHNcIn0scGFzdDp7b3RoZXI6XCItezB9IHNcIn19fX19LHtsb2NhbGU6XCJlbi1UQ1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tVEtcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLVRPXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1UVFwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tVFZcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLVRaXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1VR1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tVU1cIixwYXJlbnRMb2NhbGU6XCJlblwifSx7bG9jYWxlOlwiZW4tVVNcIixwYXJlbnRMb2NhbGU6XCJlblwifSx7bG9jYWxlOlwiZW4tVkNcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLVZHXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1WSVwiLHBhcmVudExvY2FsZTpcImVuXCJ9LHtsb2NhbGU6XCJlbi1WVVwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tV1NcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLVpBXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1aTVwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tWldcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn1dO3JldHVybiBlfSk7XG4iLCIhZnVuY3Rpb24oZSxhKXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1hKCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShhKTooZS5SZWFjdEludGxMb2NhbGVEYXRhPWUuUmVhY3RJbnRsTG9jYWxlRGF0YXx8e30sZS5SZWFjdEludGxMb2NhbGVEYXRhLmVzPWEoKSl9KHRoaXMsZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgZT1be2xvY2FsZTpcImVzXCIscGx1cmFsUnVsZUZ1bmN0aW9uOmZ1bmN0aW9uKGUsYSl7cmV0dXJuIGE/XCJvdGhlclwiOjE9PWU/XCJvbmVcIjpcIm90aGVyXCJ9LGZpZWxkczp7eWVhcjp7ZGlzcGxheU5hbWU6XCJhw7FvXCIscmVsYXRpdmU6ezA6XCJlc3RlIGHDsW9cIiwxOlwiZWwgcHLDs3hpbW8gYcOxb1wiLFwiLTFcIjpcImVsIGHDsW8gcGFzYWRvXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGHDsW9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gYcOxb3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gYcOxb1wiLG90aGVyOlwiaGFjZSB7MH0gYcOxb3NcIn19fSxtb250aDp7ZGlzcGxheU5hbWU6XCJtZXNcIixyZWxhdGl2ZTp7MDpcImVzdGUgbWVzXCIsMTpcImVsIHByw7N4aW1vIG1lc1wiLFwiLTFcIjpcImVsIG1lcyBwYXNhZG9cIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gbWVzXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IG1lc2VzXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IG1lc1wiLG90aGVyOlwiaGFjZSB7MH0gbWVzZXNcIn19fSxkYXk6e2Rpc3BsYXlOYW1lOlwiZMOtYVwiLHJlbGF0aXZlOnswOlwiaG95XCIsMTpcIm1hw7FhbmFcIiwyOlwicGFzYWRvIG1hw7FhbmFcIixcIi0yXCI6XCJhbnRlYXllclwiLFwiLTFcIjpcImF5ZXJcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gZMOtYVwiLG90aGVyOlwiZGVudHJvIGRlIHswfSBkw61hc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBkw61hXCIsb3RoZXI6XCJoYWNlIHswfSBkw61hc1wifX19LGhvdXI6e2Rpc3BsYXlOYW1lOlwiaG9yYVwiLHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGhvcmFcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gaG9yYXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gaG9yYVwiLG90aGVyOlwiaGFjZSB7MH0gaG9yYXNcIn19fSxtaW51dGU6e2Rpc3BsYXlOYW1lOlwibWludXRvXCIscmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gbWludXRvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IG1pbnV0b3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gbWludXRvXCIsb3RoZXI6XCJoYWNlIHswfSBtaW51dG9zXCJ9fX0sc2Vjb25kOntkaXNwbGF5TmFtZTpcInNlZ3VuZG9cIixyZWxhdGl2ZTp7MDpcImFob3JhXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IHNlZ3VuZG9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gc2VndW5kb3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gc2VndW5kb1wiLG90aGVyOlwiaGFjZSB7MH0gc2VndW5kb3NcIn19fX19LHtsb2NhbGU6XCJlcy00MTlcIixwYXJlbnRMb2NhbGU6XCJlc1wifSx7bG9jYWxlOlwiZXMtQVJcIixwYXJlbnRMb2NhbGU6XCJlcy00MTlcIn0se2xvY2FsZTpcImVzLUJPXCIscGFyZW50TG9jYWxlOlwiZXMtNDE5XCJ9LHtsb2NhbGU6XCJlcy1DTFwiLHBhcmVudExvY2FsZTpcImVzLTQxOVwifSx7bG9jYWxlOlwiZXMtQ09cIixwYXJlbnRMb2NhbGU6XCJlcy00MTlcIn0se2xvY2FsZTpcImVzLUNSXCIscGFyZW50TG9jYWxlOlwiZXMtNDE5XCIsZmllbGRzOnt5ZWFyOntkaXNwbGF5TmFtZTpcImHDsW9cIixyZWxhdGl2ZTp7MDpcImVzdGUgYcOxb1wiLDE6XCJlbCBwcsOzeGltbyBhw7FvXCIsXCItMVwiOlwiZWwgYcOxbyBwYXNhZG9cIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gYcOxb1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBhw7Fvc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBhw7FvXCIsb3RoZXI6XCJoYWNlIHswfSBhw7Fvc1wifX19LG1vbnRoOntkaXNwbGF5TmFtZTpcIm1lc1wiLHJlbGF0aXZlOnswOlwiZXN0ZSBtZXNcIiwxOlwiZWwgcHLDs3hpbW8gbWVzXCIsXCItMVwiOlwiZWwgbWVzIHBhc2Fkb1wifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBtZXNcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gbWVzZXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gbWVzXCIsb3RoZXI6XCJoYWNlIHswfSBtZXNlc1wifX19LGRheTp7ZGlzcGxheU5hbWU6XCJkw61hXCIscmVsYXRpdmU6ezA6XCJob3lcIiwxOlwibWHDsWFuYVwiLDI6XCJwYXNhZG8gbWHDsWFuYVwiLFwiLTJcIjpcImFudGllclwiLFwiLTFcIjpcImF5ZXJcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gZMOtYVwiLG90aGVyOlwiZGVudHJvIGRlIHswfSBkw61hc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBkw61hXCIsb3RoZXI6XCJoYWNlIHswfSBkw61hc1wifX19LGhvdXI6e2Rpc3BsYXlOYW1lOlwiaG9yYVwiLHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGhvcmFcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gaG9yYXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gaG9yYVwiLG90aGVyOlwiaGFjZSB7MH0gaG9yYXNcIn19fSxtaW51dGU6e2Rpc3BsYXlOYW1lOlwibWludXRvXCIscmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gbWludXRvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IG1pbnV0b3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gbWludXRvXCIsb3RoZXI6XCJoYWNlIHswfSBtaW51dG9zXCJ9fX0sc2Vjb25kOntkaXNwbGF5TmFtZTpcInNlZ3VuZG9cIixyZWxhdGl2ZTp7MDpcImFob3JhXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IHNlZ3VuZG9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gc2VndW5kb3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gc2VndW5kb1wiLG90aGVyOlwiaGFjZSB7MH0gc2VndW5kb3NcIn19fX19LHtsb2NhbGU6XCJlcy1DVVwiLHBhcmVudExvY2FsZTpcImVzLTQxOVwifSx7bG9jYWxlOlwiZXMtRE9cIixwYXJlbnRMb2NhbGU6XCJlcy00MTlcIixmaWVsZHM6e3llYXI6e2Rpc3BsYXlOYW1lOlwiQcOxb1wiLHJlbGF0aXZlOnswOlwiZXN0ZSBhw7FvXCIsMTpcImVsIHByw7N4aW1vIGHDsW9cIixcIi0xXCI6XCJlbCBhw7FvIHBhc2Fkb1wifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBhw7FvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IGHDsW9zXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IGHDsW9cIixvdGhlcjpcImhhY2UgezB9IGHDsW9zXCJ9fX0sbW9udGg6e2Rpc3BsYXlOYW1lOlwiTWVzXCIscmVsYXRpdmU6ezA6XCJlc3RlIG1lc1wiLDE6XCJlbCBwcsOzeGltbyBtZXNcIixcIi0xXCI6XCJlbCBtZXMgcGFzYWRvXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IG1lc1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBtZXNlc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBtZXNcIixvdGhlcjpcImhhY2UgezB9IG1lc2VzXCJ9fX0sZGF5OntkaXNwbGF5TmFtZTpcIkTDrWFcIixyZWxhdGl2ZTp7MDpcImhveVwiLDE6XCJtYcOxYW5hXCIsMjpcInBhc2FkbyBtYcOxYW5hXCIsXCItMlwiOlwiYW50ZWF5ZXJcIixcIi0xXCI6XCJheWVyXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGTDrWFcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gZMOtYXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gZMOtYVwiLG90aGVyOlwiaGFjZSB7MH0gZMOtYXNcIn19fSxob3VyOntkaXNwbGF5TmFtZTpcImhvcmFcIixyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBob3JhXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IGhvcmFzXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IGhvcmFcIixvdGhlcjpcImhhY2UgezB9IGhvcmFzXCJ9fX0sbWludXRlOntkaXNwbGF5TmFtZTpcIk1pbnV0b1wiLHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IG1pbnV0b1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBtaW51dG9zXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IG1pbnV0b1wiLG90aGVyOlwiaGFjZSB7MH0gbWludXRvc1wifX19LHNlY29uZDp7ZGlzcGxheU5hbWU6XCJTZWd1bmRvXCIscmVsYXRpdmU6ezA6XCJhaG9yYVwifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBzZWd1bmRvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IHNlZ3VuZG9zXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IHNlZ3VuZG9cIixvdGhlcjpcImhhY2UgezB9IHNlZ3VuZG9zXCJ9fX19fSx7bG9jYWxlOlwiZXMtRUFcIixwYXJlbnRMb2NhbGU6XCJlc1wifSx7bG9jYWxlOlwiZXMtRUNcIixwYXJlbnRMb2NhbGU6XCJlcy00MTlcIn0se2xvY2FsZTpcImVzLUdRXCIscGFyZW50TG9jYWxlOlwiZXNcIn0se2xvY2FsZTpcImVzLUdUXCIscGFyZW50TG9jYWxlOlwiZXMtNDE5XCIsZmllbGRzOnt5ZWFyOntkaXNwbGF5TmFtZTpcImHDsW9cIixyZWxhdGl2ZTp7MDpcImVzdGUgYcOxb1wiLDE6XCJlbCBwcsOzeGltbyBhw7FvXCIsXCItMVwiOlwiZWwgYcOxbyBwYXNhZG9cIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gYcOxb1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBhw7Fvc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBhw7FvXCIsb3RoZXI6XCJoYWNlIHswfSBhw7Fvc1wifX19LG1vbnRoOntkaXNwbGF5TmFtZTpcIm1lc1wiLHJlbGF0aXZlOnswOlwiZXN0ZSBtZXNcIiwxOlwiZWwgcHLDs3hpbW8gbWVzXCIsXCItMVwiOlwiZWwgbWVzIHBhc2Fkb1wifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBtZXNcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gbWVzZXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gbWVzXCIsb3RoZXI6XCJoYWNlIHswfSBtZXNlc1wifX19LGRheTp7ZGlzcGxheU5hbWU6XCJkw61hXCIscmVsYXRpdmU6ezA6XCJob3lcIiwxOlwibWHDsWFuYVwiLDI6XCJwYXNhZG8gbWHDsWFuYVwiLFwiLTJcIjpcImFudGllclwiLFwiLTFcIjpcImF5ZXJcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gZMOtYVwiLG90aGVyOlwiZGVudHJvIGRlIHswfSBkw61hc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBkw61hXCIsb3RoZXI6XCJoYWNlIHswfSBkw61hc1wifX19LGhvdXI6e2Rpc3BsYXlOYW1lOlwiaG9yYVwiLHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGhvcmFcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gaG9yYXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gaG9yYVwiLG90aGVyOlwiaGFjZSB7MH0gaG9yYXNcIn19fSxtaW51dGU6e2Rpc3BsYXlOYW1lOlwibWludXRvXCIscmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gbWludXRvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IG1pbnV0b3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gbWludXRvXCIsb3RoZXI6XCJoYWNlIHswfSBtaW51dG9zXCJ9fX0sc2Vjb25kOntkaXNwbGF5TmFtZTpcInNlZ3VuZG9cIixyZWxhdGl2ZTp7MDpcImFob3JhXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IHNlZ3VuZG9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gc2VndW5kb3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gc2VndW5kb1wiLG90aGVyOlwiaGFjZSB7MH0gc2VndW5kb3NcIn19fX19LHtsb2NhbGU6XCJlcy1ITlwiLHBhcmVudExvY2FsZTpcImVzLTQxOVwiLGZpZWxkczp7eWVhcjp7ZGlzcGxheU5hbWU6XCJhw7FvXCIscmVsYXRpdmU6ezA6XCJlc3RlIGHDsW9cIiwxOlwiZWwgcHLDs3hpbW8gYcOxb1wiLFwiLTFcIjpcImVsIGHDsW8gcGFzYWRvXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGHDsW9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gYcOxb3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gYcOxb1wiLG90aGVyOlwiaGFjZSB7MH0gYcOxb3NcIn19fSxtb250aDp7ZGlzcGxheU5hbWU6XCJtZXNcIixyZWxhdGl2ZTp7MDpcImVzdGUgbWVzXCIsMTpcImVsIHByw7N4aW1vIG1lc1wiLFwiLTFcIjpcImVsIG1lcyBwYXNhZG9cIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gbWVzXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IG1lc2VzXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IG1lc1wiLG90aGVyOlwiaGFjZSB7MH0gbWVzZXNcIn19fSxkYXk6e2Rpc3BsYXlOYW1lOlwiZMOtYVwiLHJlbGF0aXZlOnswOlwiaG95XCIsMTpcIm1hw7FhbmFcIiwyOlwicGFzYWRvIG1hw7FhbmFcIixcIi0yXCI6XCJhbnRpZXJcIixcIi0xXCI6XCJheWVyXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGTDrWFcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gZMOtYXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gZMOtYVwiLG90aGVyOlwiaGFjZSB7MH0gZMOtYXNcIn19fSxob3VyOntkaXNwbGF5TmFtZTpcImhvcmFcIixyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBob3JhXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IGhvcmFzXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IGhvcmFcIixvdGhlcjpcImhhY2UgezB9IGhvcmFzXCJ9fX0sbWludXRlOntkaXNwbGF5TmFtZTpcIm1pbnV0b1wiLHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IG1pbnV0b1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBtaW51dG9zXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IG1pbnV0b1wiLG90aGVyOlwiaGFjZSB7MH0gbWludXRvc1wifX19LHNlY29uZDp7ZGlzcGxheU5hbWU6XCJzZWd1bmRvXCIscmVsYXRpdmU6ezA6XCJhaG9yYVwifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBzZWd1bmRvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IHNlZ3VuZG9zXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IHNlZ3VuZG9cIixvdGhlcjpcImhhY2UgezB9IHNlZ3VuZG9zXCJ9fX19fSx7bG9jYWxlOlwiZXMtSUNcIixwYXJlbnRMb2NhbGU6XCJlc1wifSx7bG9jYWxlOlwiZXMtTVhcIixwYXJlbnRMb2NhbGU6XCJlcy00MTlcIixmaWVsZHM6e3llYXI6e2Rpc3BsYXlOYW1lOlwiYcOxb1wiLHJlbGF0aXZlOnswOlwiZXN0ZSBhw7FvXCIsMTpcImVsIGHDsW8gcHLDs3hpbW9cIixcIi0xXCI6XCJlbCBhw7FvIHBhc2Fkb1wifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBhw7FvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IGHDsW9zXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IGHDsW9cIixvdGhlcjpcImhhY2UgezB9IGHDsW9zXCJ9fX0sbW9udGg6e2Rpc3BsYXlOYW1lOlwibWVzXCIscmVsYXRpdmU6ezA6XCJlc3RlIG1lc1wiLDE6XCJlbCBtZXMgcHLDs3hpbW9cIixcIi0xXCI6XCJlbCBtZXMgcGFzYWRvXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJlbiB7MH0gbWVzXCIsb3RoZXI6XCJlbiB7MH0gbWVzZXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gbWVzXCIsb3RoZXI6XCJoYWNlIHswfSBtZXNlc1wifX19LGRheTp7ZGlzcGxheU5hbWU6XCJkw61hXCIscmVsYXRpdmU6ezA6XCJob3lcIiwxOlwibWHDsWFuYVwiLDI6XCJwYXNhZG8gbWHDsWFuYVwiLFwiLTJcIjpcImFudGllclwiLFwiLTFcIjpcImF5ZXJcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gZMOtYVwiLG90aGVyOlwiZGVudHJvIGRlIHswfSBkw61hc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBkw61hXCIsb3RoZXI6XCJoYWNlIHswfSBkw61hc1wifX19LGhvdXI6e2Rpc3BsYXlOYW1lOlwiaG9yYVwiLHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGhvcmFcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gaG9yYXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gaG9yYVwiLG90aGVyOlwiaGFjZSB7MH0gaG9yYXNcIn19fSxtaW51dGU6e2Rpc3BsYXlOYW1lOlwibWludXRvXCIscmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gbWludXRvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IG1pbnV0b3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gbWludXRvXCIsb3RoZXI6XCJoYWNlIHswfSBtaW51dG9zXCJ9fX0sc2Vjb25kOntkaXNwbGF5TmFtZTpcInNlZ3VuZG9cIixyZWxhdGl2ZTp7MDpcImFob3JhXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IHNlZ3VuZG9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gc2VndW5kb3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gc2VndW5kb1wiLG90aGVyOlwiaGFjZSB7MH0gc2VndW5kb3NcIn19fX19LHtsb2NhbGU6XCJlcy1OSVwiLHBhcmVudExvY2FsZTpcImVzLTQxOVwiLGZpZWxkczp7eWVhcjp7ZGlzcGxheU5hbWU6XCJhw7FvXCIscmVsYXRpdmU6ezA6XCJlc3RlIGHDsW9cIiwxOlwiZWwgcHLDs3hpbW8gYcOxb1wiLFwiLTFcIjpcImVsIGHDsW8gcGFzYWRvXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGHDsW9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gYcOxb3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gYcOxb1wiLG90aGVyOlwiaGFjZSB7MH0gYcOxb3NcIn19fSxtb250aDp7ZGlzcGxheU5hbWU6XCJtZXNcIixyZWxhdGl2ZTp7MDpcImVzdGUgbWVzXCIsMTpcImVsIHByw7N4aW1vIG1lc1wiLFwiLTFcIjpcImVsIG1lcyBwYXNhZG9cIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gbWVzXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IG1lc2VzXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IG1lc1wiLG90aGVyOlwiaGFjZSB7MH0gbWVzZXNcIn19fSxkYXk6e2Rpc3BsYXlOYW1lOlwiZMOtYVwiLHJlbGF0aXZlOnswOlwiaG95XCIsMTpcIm1hw7FhbmFcIiwyOlwicGFzYWRvIG1hw7FhbmFcIixcIi0yXCI6XCJhbnRpZXJcIixcIi0xXCI6XCJheWVyXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGTDrWFcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gZMOtYXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gZMOtYVwiLG90aGVyOlwiaGFjZSB7MH0gZMOtYXNcIn19fSxob3VyOntkaXNwbGF5TmFtZTpcImhvcmFcIixyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBob3JhXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IGhvcmFzXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IGhvcmFcIixvdGhlcjpcImhhY2UgezB9IGhvcmFzXCJ9fX0sbWludXRlOntkaXNwbGF5TmFtZTpcIm1pbnV0b1wiLHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IG1pbnV0b1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBtaW51dG9zXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IG1pbnV0b1wiLG90aGVyOlwiaGFjZSB7MH0gbWludXRvc1wifX19LHNlY29uZDp7ZGlzcGxheU5hbWU6XCJzZWd1bmRvXCIscmVsYXRpdmU6ezA6XCJhaG9yYVwifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBzZWd1bmRvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IHNlZ3VuZG9zXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IHNlZ3VuZG9cIixvdGhlcjpcImhhY2UgezB9IHNlZ3VuZG9zXCJ9fX19fSx7bG9jYWxlOlwiZXMtUEFcIixwYXJlbnRMb2NhbGU6XCJlcy00MTlcIixmaWVsZHM6e3llYXI6e2Rpc3BsYXlOYW1lOlwiYcOxb1wiLHJlbGF0aXZlOnswOlwiZXN0ZSBhw7FvXCIsMTpcImVsIHByw7N4aW1vIGHDsW9cIixcIi0xXCI6XCJlbCBhw7FvIHBhc2Fkb1wifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBhw7FvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IGHDsW9zXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IGHDsW9cIixvdGhlcjpcImhhY2UgezB9IGHDsW9zXCJ9fX0sbW9udGg6e2Rpc3BsYXlOYW1lOlwibWVzXCIscmVsYXRpdmU6ezA6XCJlc3RlIG1lc1wiLDE6XCJlbCBwcsOzeGltbyBtZXNcIixcIi0xXCI6XCJlbCBtZXMgcGFzYWRvXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IG1lc1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBtZXNlc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBtZXNcIixvdGhlcjpcImhhY2UgezB9IG1lc2VzXCJ9fX0sZGF5OntkaXNwbGF5TmFtZTpcImTDrWFcIixyZWxhdGl2ZTp7MDpcImhveVwiLDE6XCJtYcOxYW5hXCIsMjpcInBhc2FkbyBtYcOxYW5hXCIsXCItMlwiOlwiYW50aWVyXCIsXCItMVwiOlwiYXllclwifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBkw61hXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IGTDrWFzXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IGTDrWFcIixvdGhlcjpcImhhY2UgezB9IGTDrWFzXCJ9fX0saG91cjp7ZGlzcGxheU5hbWU6XCJob3JhXCIscmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gaG9yYVwiLG90aGVyOlwiZGVudHJvIGRlIHswfSBob3Jhc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBob3JhXCIsb3RoZXI6XCJoYWNlIHswfSBob3Jhc1wifX19LG1pbnV0ZTp7ZGlzcGxheU5hbWU6XCJtaW51dG9cIixyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBtaW51dG9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gbWludXRvc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBtaW51dG9cIixvdGhlcjpcImhhY2UgezB9IG1pbnV0b3NcIn19fSxzZWNvbmQ6e2Rpc3BsYXlOYW1lOlwic2VndW5kb1wiLHJlbGF0aXZlOnswOlwiYWhvcmFcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gc2VndW5kb1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBzZWd1bmRvc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBzZWd1bmRvXCIsb3RoZXI6XCJoYWNlIHswfSBzZWd1bmRvc1wifX19fX0se2xvY2FsZTpcImVzLVBFXCIscGFyZW50TG9jYWxlOlwiZXMtNDE5XCJ9LHtsb2NhbGU6XCJlcy1QSFwiLHBhcmVudExvY2FsZTpcImVzXCJ9LHtsb2NhbGU6XCJlcy1QUlwiLHBhcmVudExvY2FsZTpcImVzLTQxOVwifSx7bG9jYWxlOlwiZXMtUFlcIixwYXJlbnRMb2NhbGU6XCJlcy00MTlcIixmaWVsZHM6e3llYXI6e2Rpc3BsYXlOYW1lOlwiYcOxb1wiLHJlbGF0aXZlOnswOlwiZXN0ZSBhw7FvXCIsMTpcImVsIHByw7N4aW1vIGHDsW9cIixcIi0xXCI6XCJlbCBhw7FvIHBhc2Fkb1wifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBhw7FvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IGHDsW9zXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IGHDsW9cIixvdGhlcjpcImhhY2UgezB9IGHDsW9zXCJ9fX0sbW9udGg6e2Rpc3BsYXlOYW1lOlwibWVzXCIscmVsYXRpdmU6ezA6XCJlc3RlIG1lc1wiLDE6XCJlbCBwcsOzeGltbyBtZXNcIixcIi0xXCI6XCJlbCBtZXMgcGFzYWRvXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IG1lc1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBtZXNlc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBtZXNcIixvdGhlcjpcImhhY2UgezB9IG1lc2VzXCJ9fX0sZGF5OntkaXNwbGF5TmFtZTpcImTDrWFcIixyZWxhdGl2ZTp7MDpcImhveVwiLDE6XCJtYcOxYW5hXCIsMjpcInBhc2FkbyBtYcOxYW5hXCIsXCItMlwiOlwiYW50ZXMgZGUgYXllclwiLFwiLTFcIjpcImF5ZXJcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gZMOtYVwiLG90aGVyOlwiZGVudHJvIGRlIHswfSBkw61hc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBkw61hXCIsb3RoZXI6XCJoYWNlIHswfSBkw61hc1wifX19LGhvdXI6e2Rpc3BsYXlOYW1lOlwiaG9yYVwiLHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGhvcmFcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gaG9yYXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gaG9yYVwiLG90aGVyOlwiaGFjZSB7MH0gaG9yYXNcIn19fSxtaW51dGU6e2Rpc3BsYXlOYW1lOlwibWludXRvXCIscmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gbWludXRvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IG1pbnV0b3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gbWludXRvXCIsb3RoZXI6XCJoYWNlIHswfSBtaW51dG9zXCJ9fX0sc2Vjb25kOntkaXNwbGF5TmFtZTpcInNlZ3VuZG9cIixyZWxhdGl2ZTp7MDpcImFob3JhXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IHNlZ3VuZG9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gc2VndW5kb3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gc2VndW5kb1wiLG90aGVyOlwiaGFjZSB7MH0gc2VndW5kb3NcIn19fX19LHtsb2NhbGU6XCJlcy1TVlwiLHBhcmVudExvY2FsZTpcImVzLTQxOVwiLGZpZWxkczp7eWVhcjp7ZGlzcGxheU5hbWU6XCJhw7FvXCIscmVsYXRpdmU6ezA6XCJlc3RlIGHDsW9cIiwxOlwiZWwgcHLDs3hpbW8gYcOxb1wiLFwiLTFcIjpcImVsIGHDsW8gcGFzYWRvXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGHDsW9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gYcOxb3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gYcOxb1wiLG90aGVyOlwiaGFjZSB7MH0gYcOxb3NcIn19fSxtb250aDp7ZGlzcGxheU5hbWU6XCJtZXNcIixyZWxhdGl2ZTp7MDpcImVzdGUgbWVzXCIsMTpcImVsIHByw7N4aW1vIG1lc1wiLFwiLTFcIjpcImVsIG1lcyBwYXNhZG9cIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gbWVzXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IG1lc2VzXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IG1lc1wiLG90aGVyOlwiaGFjZSB7MH0gbWVzZXNcIn19fSxkYXk6e2Rpc3BsYXlOYW1lOlwiZMOtYVwiLHJlbGF0aXZlOnswOlwiaG95XCIsMTpcIm1hw7FhbmFcIiwyOlwicGFzYWRvIG1hw7FhbmFcIixcIi0yXCI6XCJhbnRpZXJcIixcIi0xXCI6XCJheWVyXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGTDrWFcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gZMOtYXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gZMOtYVwiLG90aGVyOlwiaGFjZSB7MH0gZMOtYXNcIn19fSxob3VyOntkaXNwbGF5TmFtZTpcImhvcmFcIixyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBob3JhXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IGhvcmFzXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IGhvcmFcIixvdGhlcjpcImhhY2UgezB9IGhvcmFzXCJ9fX0sbWludXRlOntkaXNwbGF5TmFtZTpcIm1pbnV0b1wiLHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IG1pbnV0b1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBtaW51dG9zXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IG1pbnV0b1wiLG90aGVyOlwiaGFjZSB7MH0gbWludXRvc1wifX19LHNlY29uZDp7ZGlzcGxheU5hbWU6XCJzZWd1bmRvXCIscmVsYXRpdmU6ezA6XCJhaG9yYVwifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBzZWd1bmRvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IHNlZ3VuZG9zXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IHNlZ3VuZG9cIixvdGhlcjpcImhhY2UgezB9IHNlZ3VuZG9zXCJ9fX19fSx7bG9jYWxlOlwiZXMtVVNcIixwYXJlbnRMb2NhbGU6XCJlcy00MTlcIn0se2xvY2FsZTpcImVzLVVZXCIscGFyZW50TG9jYWxlOlwiZXMtNDE5XCJ9LHtsb2NhbGU6XCJlcy1WRVwiLHBhcmVudExvY2FsZTpcImVzLTQxOVwifV07cmV0dXJuIGV9KTtcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF93YXJuaW5nID0gcmVxdWlyZSgnd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbnZhciBfY29tcG9uZW50T3JFbGVtZW50ID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvY29tcG9uZW50T3JFbGVtZW50Jyk7XG5cbnZhciBfY29tcG9uZW50T3JFbGVtZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbXBvbmVudE9yRWxlbWVudCk7XG5cbnZhciBfZWxlbWVudFR5cGUgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlKTtcblxudmFyIF9Qb3J0YWwgPSByZXF1aXJlKCcuL1BvcnRhbCcpO1xuXG52YXIgX1BvcnRhbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Qb3J0YWwpO1xuXG52YXIgX01vZGFsTWFuYWdlciA9IHJlcXVpcmUoJy4vTW9kYWxNYW5hZ2VyJyk7XG5cbnZhciBfTW9kYWxNYW5hZ2VyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01vZGFsTWFuYWdlcik7XG5cbnZhciBfb3duZXJEb2N1bWVudCA9IHJlcXVpcmUoJy4vdXRpbHMvb3duZXJEb2N1bWVudCcpO1xuXG52YXIgX293bmVyRG9jdW1lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb3duZXJEb2N1bWVudCk7XG5cbnZhciBfYWRkRXZlbnRMaXN0ZW5lciA9IHJlcXVpcmUoJy4vdXRpbHMvYWRkRXZlbnRMaXN0ZW5lcicpO1xuXG52YXIgX2FkZEV2ZW50TGlzdGVuZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYWRkRXZlbnRMaXN0ZW5lcik7XG5cbnZhciBfYWRkRm9jdXNMaXN0ZW5lciA9IHJlcXVpcmUoJy4vdXRpbHMvYWRkRm9jdXNMaXN0ZW5lcicpO1xuXG52YXIgX2FkZEZvY3VzTGlzdGVuZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYWRkRm9jdXNMaXN0ZW5lcik7XG5cbnZhciBfaW5ET00gPSByZXF1aXJlKCdkb20taGVscGVycy91dGlsL2luRE9NJyk7XG5cbnZhciBfaW5ET00yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5ET00pO1xuXG52YXIgX2FjdGl2ZUVsZW1lbnQgPSByZXF1aXJlKCdkb20taGVscGVycy9hY3RpdmVFbGVtZW50Jyk7XG5cbnZhciBfYWN0aXZlRWxlbWVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hY3RpdmVFbGVtZW50KTtcblxudmFyIF9jb250YWlucyA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL3F1ZXJ5L2NvbnRhaW5zJyk7XG5cbnZhciBfY29udGFpbnMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29udGFpbnMpO1xuXG52YXIgX2dldENvbnRhaW5lciA9IHJlcXVpcmUoJy4vdXRpbHMvZ2V0Q29udGFpbmVyJyk7XG5cbnZhciBfZ2V0Q29udGFpbmVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldENvbnRhaW5lcik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH0gLyplc2xpbnQtZGlzYWJsZSByZWFjdC9wcm9wLXR5cGVzICovXG5cblxudmFyIG1vZGFsTWFuYWdlciA9IG5ldyBfTW9kYWxNYW5hZ2VyMi5kZWZhdWx0KCk7XG5cbi8qKlxuICogTG92ZSB0aGVtIG9yIGhhdGUgdGhlbSwgYDxNb2RhbC8+YCBwcm92aWRlcyBhIHNvbGlkIGZvdW5kYXRpb24gZm9yIGNyZWF0aW5nIGRpYWxvZ3MsIGxpZ2h0Ym94ZXMsIG9yIHdoYXRldmVyIGVsc2UuXG4gKiBUaGUgTW9kYWwgY29tcG9uZW50IHJlbmRlcnMgaXRzIGBjaGlsZHJlbmAgbm9kZSBpbiBmcm9udCBvZiBhIGJhY2tkcm9wIGNvbXBvbmVudC5cbiAqXG4gKiBUaGUgTW9kYWwgb2ZmZXJzIGEgZmV3IGhlbHBmdWwgZmVhdHVyZXMgb3ZlciB1c2luZyBqdXN0IGEgYDxQb3J0YWwvPmAgY29tcG9uZW50IGFuZCBzb21lIHN0eWxlczpcbiAqXG4gKiAtIE1hbmFnZXMgZGlhbG9nIHN0YWNraW5nIHdoZW4gb25lLWF0LWEtdGltZSBqdXN0IGlzbid0IGVub3VnaC5cbiAqIC0gQ3JlYXRlcyBhIGJhY2tkcm9wLCBmb3IgZGlzYWJsaW5nIGludGVyYWN0aW9uIGJlbG93IHRoZSBtb2RhbC5cbiAqIC0gSXQgcHJvcGVybHkgbWFuYWdlcyBmb2N1czsgbW92aW5nIHRvIHRoZSBtb2RhbCBjb250ZW50LCBhbmQga2VlcGluZyBpdCB0aGVyZSB1bnRpbCB0aGUgbW9kYWwgaXMgY2xvc2VkLlxuICogLSBJdCBkaXNhYmxlcyBzY3JvbGxpbmcgb2YgdGhlIHBhZ2UgY29udGVudCB3aGlsZSBvcGVuLlxuICogLSBBZGRzIHRoZSBhcHByb3ByaWF0ZSBBUklBIHJvbGVzIGFyZSBhdXRvbWF0aWNhbGx5LlxuICogLSBFYXNpbHkgcGx1Z2dhYmxlIGFuaW1hdGlvbnMgdmlhIGEgYDxUcmFuc2l0aW9uLz5gIGNvbXBvbmVudC5cbiAqXG4gKiBOb3RlIHRoYXQsIGluIHRoZSBzYW1lIHdheSB0aGUgYmFja2Ryb3AgZWxlbWVudCBwcmV2ZW50cyB1c2VycyBmcm9tIGNsaWNraW5nIG9yIGludGVyYWN0aW5nXG4gKiB3aXRoIHRoZSBwYWdlIGNvbnRlbnQgdW5kZXJuZWF0aCB0aGUgTW9kYWwsIFNjcmVlbiByZWFkZXJzIGFsc28gbmVlZCB0byBiZSBzaWduYWxlZCB0byBub3QgdG9cbiAqIGludGVyYWN0IHdpdGggcGFnZSBjb250ZW50IHdoaWxlIHRoZSBNb2RhbCBpcyBvcGVuLiBUbyBkbyB0aGlzLCB3ZSB1c2UgYSBjb21tb24gdGVjaG5pcXVlIG9mIGFwcGx5aW5nXG4gKiB0aGUgYGFyaWEtaGlkZGVuPSd0cnVlJ2AgYXR0cmlidXRlIHRvIHRoZSBub24tTW9kYWwgZWxlbWVudHMgaW4gdGhlIE1vZGFsIGBjb250YWluZXJgLiBUaGlzIG1lYW5zIHRoYXQgZm9yXG4gKiBhIE1vZGFsIHRvIGJlIHRydWx5IG1vZGFsLCBpdCBzaG91bGQgaGF2ZSBhIGBjb250YWluZXJgIHRoYXQgaXMgX291dHNpZGVfIHlvdXIgYXBwJ3NcbiAqIFJlYWN0IGhpZXJhcmNoeSAoc3VjaCBhcyB0aGUgZGVmYXVsdDogZG9jdW1lbnQuYm9keSkuXG4gKi9cblxudmFyIE1vZGFsID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKE1vZGFsLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBNb2RhbCgpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHZhciBfdGVtcCwgX3RoaXMsIF9yZXQ7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgTW9kYWwpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZXQgPSAoX3RlbXAgPSAoX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoX3JlZiA9IE1vZGFsLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTW9kYWwpKS5jYWxsLmFwcGx5KF9yZWYsIFt0aGlzXS5jb25jYXQoYXJncykpKSwgX3RoaXMpLCBfaW5pdGlhbGlzZVByb3BzLmNhbGwoX3RoaXMpLCBfdGVtcCksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhNb2RhbCwgW3tcbiAgICBrZXk6ICdvbWl0UHJvcHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBvbWl0UHJvcHMocHJvcHMsIHByb3BUeXBlcykge1xuXG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHByb3BzKTtcbiAgICAgIHZhciBuZXdQcm9wcyA9IHt9O1xuICAgICAga2V5cy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocHJvcFR5cGVzLCBwcm9wKSkge1xuICAgICAgICAgIG5ld1Byb3BzW3Byb3BdID0gcHJvcHNbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3UHJvcHM7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncmVuZGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICB2YXIgc2hvdyA9IF9wcm9wcy5zaG93O1xuICAgICAgdmFyIGNvbnRhaW5lciA9IF9wcm9wcy5jb250YWluZXI7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgVHJhbnNpdGlvbiA9IF9wcm9wcy50cmFuc2l0aW9uO1xuICAgICAgdmFyIGJhY2tkcm9wID0gX3Byb3BzLmJhY2tkcm9wO1xuICAgICAgdmFyIGRpYWxvZ1RyYW5zaXRpb25UaW1lb3V0ID0gX3Byb3BzLmRpYWxvZ1RyYW5zaXRpb25UaW1lb3V0O1xuICAgICAgdmFyIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWU7XG4gICAgICB2YXIgc3R5bGUgPSBfcHJvcHMuc3R5bGU7XG4gICAgICB2YXIgb25FeGl0ID0gX3Byb3BzLm9uRXhpdDtcbiAgICAgIHZhciBvbkV4aXRpbmcgPSBfcHJvcHMub25FeGl0aW5nO1xuICAgICAgdmFyIG9uRW50ZXIgPSBfcHJvcHMub25FbnRlcjtcbiAgICAgIHZhciBvbkVudGVyaW5nID0gX3Byb3BzLm9uRW50ZXJpbmc7XG4gICAgICB2YXIgb25FbnRlcmVkID0gX3Byb3BzLm9uRW50ZXJlZDtcblxuXG4gICAgICB2YXIgZGlhbG9nID0gX3JlYWN0Mi5kZWZhdWx0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pO1xuICAgICAgdmFyIGZpbHRlcmVkUHJvcHMgPSB0aGlzLm9taXRQcm9wcyh0aGlzLnByb3BzLCBNb2RhbC5wcm9wVHlwZXMpO1xuXG4gICAgICB2YXIgbW91bnRNb2RhbCA9IHNob3cgfHwgVHJhbnNpdGlvbiAmJiAhdGhpcy5zdGF0ZS5leGl0ZWQ7XG4gICAgICBpZiAoIW1vdW50TW9kYWwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciBfZGlhbG9nJHByb3BzID0gZGlhbG9nLnByb3BzO1xuICAgICAgdmFyIHJvbGUgPSBfZGlhbG9nJHByb3BzLnJvbGU7XG4gICAgICB2YXIgdGFiSW5kZXggPSBfZGlhbG9nJHByb3BzLnRhYkluZGV4O1xuXG5cbiAgICAgIGlmIChyb2xlID09PSB1bmRlZmluZWQgfHwgdGFiSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkaWFsb2cgPSAoMCwgX3JlYWN0LmNsb25lRWxlbWVudCkoZGlhbG9nLCB7XG4gICAgICAgICAgcm9sZTogcm9sZSA9PT0gdW5kZWZpbmVkID8gJ2RvY3VtZW50JyA6IHJvbGUsXG4gICAgICAgICAgdGFiSW5kZXg6IHRhYkluZGV4ID09IG51bGwgPyAnLTEnIDogdGFiSW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChUcmFuc2l0aW9uKSB7XG4gICAgICAgIGRpYWxvZyA9IF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgIFRyYW5zaXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHJhbnNpdGlvbkFwcGVhcjogdHJ1ZSxcbiAgICAgICAgICAgIHVubW91bnRPbkV4aXQ6IHRydWUsXG4gICAgICAgICAgICAnaW4nOiBzaG93LFxuICAgICAgICAgICAgdGltZW91dDogZGlhbG9nVHJhbnNpdGlvblRpbWVvdXQsXG4gICAgICAgICAgICBvbkV4aXQ6IG9uRXhpdCxcbiAgICAgICAgICAgIG9uRXhpdGluZzogb25FeGl0aW5nLFxuICAgICAgICAgICAgb25FeGl0ZWQ6IHRoaXMuaGFuZGxlSGlkZGVuLFxuICAgICAgICAgICAgb25FbnRlcjogb25FbnRlcixcbiAgICAgICAgICAgIG9uRW50ZXJpbmc6IG9uRW50ZXJpbmcsXG4gICAgICAgICAgICBvbkVudGVyZWQ6IG9uRW50ZXJlZFxuICAgICAgICAgIH0sXG4gICAgICAgICAgZGlhbG9nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgX1BvcnRhbDIuZGVmYXVsdCxcbiAgICAgICAge1xuICAgICAgICAgIHJlZjogdGhpcy5zZXRNb3VudE5vZGUsXG4gICAgICAgICAgY29udGFpbmVyOiBjb250YWluZXJcbiAgICAgICAgfSxcbiAgICAgICAgX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgJ2RpdicsXG4gICAgICAgICAgX2V4dGVuZHMoe1xuICAgICAgICAgICAgcmVmOiB0aGlzLnNldE1vZGFsTm9kZSxcbiAgICAgICAgICAgIHJvbGU6IHJvbGUgfHwgJ2RpYWxvZydcbiAgICAgICAgICB9LCBmaWx0ZXJlZFByb3BzLCB7XG4gICAgICAgICAgICBzdHlsZTogc3R5bGUsXG4gICAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGJhY2tkcm9wICYmIHRoaXMucmVuZGVyQmFja2Ryb3AoKSxcbiAgICAgICAgICBkaWFsb2dcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICAgIGlmIChuZXh0UHJvcHMuc2hvdykge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZXhpdGVkOiBmYWxzZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoIW5leHRQcm9wcy50cmFuc2l0aW9uKSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSBsZXQgaGFuZGxlSGlkZGVuIHRha2UgY2FyZSBvZiBtYXJraW5nIGV4aXRlZC5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGV4aXRlZDogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb21wb25lbnRXaWxsVXBkYXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVwZGF0ZShuZXh0UHJvcHMpIHtcbiAgICAgIGlmICghdGhpcy5wcm9wcy5zaG93ICYmIG5leHRQcm9wcy5zaG93KSB7XG4gICAgICAgIHRoaXMuY2hlY2tGb3JGb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudERpZE1vdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLl9pc01vdW50ZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMucHJvcHMuc2hvdykge1xuICAgICAgICB0aGlzLm9uU2hvdygpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudERpZFVwZGF0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgIHZhciB0cmFuc2l0aW9uID0gdGhpcy5wcm9wcy50cmFuc2l0aW9uO1xuXG5cbiAgICAgIGlmIChwcmV2UHJvcHMuc2hvdyAmJiAhdGhpcy5wcm9wcy5zaG93ICYmICF0cmFuc2l0aW9uKSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSBoYW5kbGVIaWRkZW4gd2lsbCBjYWxsIHRoaXMuXG4gICAgICAgIHRoaXMub25IaWRlKCk7XG4gICAgICB9IGVsc2UgaWYgKCFwcmV2UHJvcHMuc2hvdyAmJiB0aGlzLnByb3BzLnNob3cpIHtcbiAgICAgICAgdGhpcy5vblNob3coKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb21wb25lbnRXaWxsVW5tb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdmFyIF9wcm9wczIgPSB0aGlzLnByb3BzO1xuICAgICAgdmFyIHNob3cgPSBfcHJvcHMyLnNob3c7XG4gICAgICB2YXIgdHJhbnNpdGlvbiA9IF9wcm9wczIudHJhbnNpdGlvbjtcblxuXG4gICAgICB0aGlzLl9pc01vdW50ZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKHNob3cgfHwgdHJhbnNpdGlvbiAmJiAhdGhpcy5zdGF0ZS5leGl0ZWQpIHtcbiAgICAgICAgdGhpcy5vbkhpZGUoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL2luc3RlYWQgb2YgYSByZWYsIHdoaWNoIG1pZ2h0IGNvbmZsaWN0IHdpdGggb25lIHRoZSBwYXJlbnQgYXBwbGllZC5cblxuICB9XSk7XG5cbiAgcmV0dXJuIE1vZGFsO1xufShfcmVhY3QyLmRlZmF1bHQuQ29tcG9uZW50KTtcblxuTW9kYWwucHJvcFR5cGVzID0gX2V4dGVuZHMoe30sIF9Qb3J0YWwyLmRlZmF1bHQucHJvcFR5cGVzLCB7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgTW9kYWxcbiAgICovXG4gIHNob3c6IF9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbCxcblxuICAvKipcbiAgICogQSBOb2RlLCBDb21wb25lbnQgaW5zdGFuY2UsIG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBlaXRoZXIuIFRoZSBNb2RhbCBpcyBhcHBlbmRlZCB0byBpdCdzIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKlxuICAgKiBGb3IgdGhlIHNha2Ugb2YgYXNzaXN0aXZlIHRlY2hub2xvZ2llcywgdGhlIGNvbnRhaW5lciBzaG91bGQgdXN1YWxseSBiZSB0aGUgZG9jdW1lbnQgYm9keSwgc28gdGhhdCB0aGUgcmVzdCBvZiB0aGVcbiAgICogcGFnZSBjb250ZW50IGNhbiBiZSBwbGFjZWQgYmVoaW5kIGEgdmlydHVhbCBiYWNrZHJvcCBhcyB3ZWxsIGFzIGEgdmlzdWFsIG9uZS5cbiAgICovXG4gIGNvbnRhaW5lcjogX3Byb3BUeXBlczIuZGVmYXVsdC5vbmVPZlR5cGUoW19jb21wb25lbnRPckVsZW1lbnQyLmRlZmF1bHQsIF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuY10pLFxuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZpcmVkIHdoZW4gdGhlIE1vZGFsIGlzIG9wZW5pbmcuXG4gICAqL1xuICBvblNob3c6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBmaXJlZCB3aGVuIGVpdGhlciB0aGUgYmFja2Ryb3AgaXMgY2xpY2tlZCwgb3IgdGhlIGVzY2FwZSBrZXkgaXMgcHJlc3NlZC5cbiAgICpcbiAgICogVGhlIGBvbkhpZGVgIGNhbGxiYWNrIG9ubHkgc2lnbmFscyBpbnRlbnQgZnJvbSB0aGUgTW9kYWwsXG4gICAqIHlvdSBtdXN0IGFjdHVhbGx5IHNldCB0aGUgYHNob3dgIHByb3AgdG8gYGZhbHNlYCBmb3IgdGhlIE1vZGFsIHRvIGNsb3NlLlxuICAgKi9cbiAgb25IaWRlOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG5cbiAgLyoqXG4gICAqIEluY2x1ZGUgYSBiYWNrZHJvcCBjb21wb25lbnQuXG4gICAqL1xuICBiYWNrZHJvcDogX3Byb3BUeXBlczIuZGVmYXVsdC5vbmVPZlR5cGUoW19wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbCwgX3Byb3BUeXBlczIuZGVmYXVsdC5vbmVPZihbJ3N0YXRpYyddKV0pLFxuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGJhY2tkcm9wIGNvbXBvbmVudC4gVXNlZnVsIGZvciBjdXN0b21cbiAgICogYmFja2Ryb3AgcmVuZGVyaW5nLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAgcmVuZGVyQmFja2Ryb3A9e3Byb3BzID0+IDxNeUJhY2tkcm9wIHsuLi5wcm9wc30gLz59XG4gICAqIGBgYFxuICAgKi9cbiAgcmVuZGVyQmFja2Ryb3A6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBmaXJlZCB3aGVuIHRoZSBlc2NhcGUga2V5LCBpZiBzcGVjaWZpZWQgaW4gYGtleWJvYXJkYCwgaXMgcHJlc3NlZC5cbiAgICovXG4gIG9uRXNjYXBlS2V5VXA6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBmaXJlZCB3aGVuIHRoZSBiYWNrZHJvcCwgaWYgc3BlY2lmaWVkLCBpcyBjbGlja2VkLlxuICAgKi9cbiAgb25CYWNrZHJvcENsaWNrOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2JqZWN0IGZvciB0aGUgYmFja2Ryb3AgY29tcG9uZW50LlxuICAgKi9cbiAgYmFja2Ryb3BTdHlsZTogX3Byb3BUeXBlczIuZGVmYXVsdC5vYmplY3QsXG5cbiAgLyoqXG4gICAqIEEgY3NzIGNsYXNzIG9yIGNsYXNzZXMgZm9yIHRoZSBiYWNrZHJvcCBjb21wb25lbnQuXG4gICAqL1xuICBiYWNrZHJvcENsYXNzTmFtZTogX3Byb3BUeXBlczIuZGVmYXVsdC5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEEgY3NzIGNsYXNzIG9yIHNldCBvZiBjbGFzc2VzIGFwcGxpZWQgdG8gdGhlIG1vZGFsIGNvbnRhaW5lciB3aGVuIHRoZSBtb2RhbCBpcyBvcGVuLFxuICAgKiBhbmQgcmVtb3ZlZCB3aGVuIGl0IGlzIGNsb3NlZC5cbiAgICovXG4gIGNvbnRhaW5lckNsYXNzTmFtZTogX3Byb3BUeXBlczIuZGVmYXVsdC5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBtb2RhbCB3aGVuIGVzY2FwZSBrZXkgaXMgcHJlc3NlZFxuICAgKi9cbiAga2V5Ym9hcmQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbCxcblxuICAvKipcbiAgICogQSBgPFRyYW5zaXRpb24vPmAgY29tcG9uZW50IHRvIHVzZSBmb3IgdGhlIGRpYWxvZyBhbmQgYmFja2Ryb3AgY29tcG9uZW50cy5cbiAgICovXG4gIHRyYW5zaXRpb246IF9lbGVtZW50VHlwZTIuZGVmYXVsdCxcblxuICAvKipcbiAgICogVGhlIGB0aW1lb3V0YCBvZiB0aGUgZGlhbG9nIHRyYW5zaXRpb24gaWYgc3BlY2lmaWVkLiBUaGlzIG51bWJlciBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0XG4gICAqIHRyYW5zaXRpb24gY2FsbGJhY2tzIGFyZSBhbHdheXMgZmlyZWQsIGV2ZW4gaWYgYnJvd3NlciB0cmFuc2l0aW9uIGV2ZW50cyBhcmUgY2FuY2VsZWQuXG4gICAqXG4gICAqIFNlZSB0aGUgVHJhbnNpdGlvbiBgdGltZW91dGAgcHJvcCBmb3IgbW9yZSBpbmZvbWF0aW9uLlxuICAgKi9cbiAgZGlhbG9nVHJhbnNpdGlvblRpbWVvdXQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBUaGUgYHRpbWVvdXRgIG9mIHRoZSBiYWNrZHJvcCB0cmFuc2l0aW9uIGlmIHNwZWNpZmllZC4gVGhpcyBudW1iZXIgaXMgdXNlZCB0b1xuICAgKiBlbnN1cmUgdGhhdCB0cmFuc2l0aW9uIGNhbGxiYWNrcyBhcmUgYWx3YXlzIGZpcmVkLCBldmVuIGlmIGJyb3dzZXIgdHJhbnNpdGlvbiBldmVudHMgYXJlIGNhbmNlbGVkLlxuICAgKlxuICAgKiBTZWUgdGhlIFRyYW5zaXRpb24gYHRpbWVvdXRgIHByb3AgZm9yIG1vcmUgaW5mb21hdGlvbi5cbiAgICovXG4gIGJhY2tkcm9wVHJhbnNpdGlvblRpbWVvdXQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCBUaGUgbW9kYWwgd2lsbCBhdXRvbWF0aWNhbGx5IHNoaWZ0IGZvY3VzIHRvIGl0c2VsZiB3aGVuIGl0IG9wZW5zLCBhbmRcbiAgICogcmVwbGFjZSBpdCB0byB0aGUgbGFzdCBmb2N1c2VkIGVsZW1lbnQgd2hlbiBpdCBjbG9zZXMuIFRoaXMgYWxzb1xuICAgKiB3b3JrcyBjb3JyZWN0bHkgd2l0aCBhbnkgTW9kYWwgY2hpbGRyZW4gdGhhdCBoYXZlIHRoZSBgYXV0b0ZvY3VzYCBwcm9wLlxuICAgKlxuICAgKiBHZW5lcmFsbHkgdGhpcyBzaG91bGQgbmV2ZXIgYmUgc2V0IHRvIGBmYWxzZWAgYXMgaXQgbWFrZXMgdGhlIE1vZGFsIGxlc3NcbiAgICogYWNjZXNzaWJsZSB0byBhc3Npc3RpdmUgdGVjaG5vbG9naWVzLCBsaWtlIHNjcmVlbiByZWFkZXJzLlxuICAgKi9cbiAgYXV0b0ZvY3VzOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2wsXG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgIFRoZSBtb2RhbCB3aWxsIHByZXZlbnQgZm9jdXMgZnJvbSBsZWF2aW5nIHRoZSBNb2RhbCB3aGlsZSBvcGVuLlxuICAgKlxuICAgKiBHZW5lcmFsbHkgdGhpcyBzaG91bGQgbmV2ZXIgYmUgc2V0IHRvIGBmYWxzZWAgYXMgaXQgbWFrZXMgdGhlIE1vZGFsIGxlc3NcbiAgICogYWNjZXNzaWJsZSB0byBhc3Npc3RpdmUgdGVjaG5vbG9naWVzLCBsaWtlIHNjcmVlbiByZWFkZXJzLlxuICAgKi9cbiAgZW5mb3JjZUZvY3VzOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2wsXG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgIFRoZSBtb2RhbCB3aWxsIHJlc3RvcmUgZm9jdXMgdG8gcHJldmlvdXNseSBmb2N1c2VkIGVsZW1lbnQgb25jZVxuICAgKiBtb2RhbCBpcyBoaWRkZW5cbiAgICovXG4gIHJlc3RvcmVGb2N1czogX3Byb3BUeXBlczIuZGVmYXVsdC5ib29sLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBiZWZvcmUgdGhlIE1vZGFsIHRyYW5zaXRpb25zIGluXG4gICAqL1xuICBvbkVudGVyOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFzIHRoZSBNb2RhbCBiZWdpbnMgdG8gdHJhbnNpdGlvbiBpblxuICAgKi9cbiAgb25FbnRlcmluZzogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgTW9kYWwgZmluaXNoZXMgdHJhbnNpdGlvbmluZyBpblxuICAgKi9cbiAgb25FbnRlcmVkOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIHJpZ2h0IGJlZm9yZSB0aGUgTW9kYWwgdHJhbnNpdGlvbnMgb3V0XG4gICAqL1xuICBvbkV4aXQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYXMgdGhlIE1vZGFsIGJlZ2lucyB0byB0cmFuc2l0aW9uIG91dFxuICAgKi9cbiAgb25FeGl0aW5nOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBNb2RhbCBmaW5pc2hlcyB0cmFuc2l0aW9uaW5nIG91dFxuICAgKi9cbiAgb25FeGl0ZWQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblxuICAvKipcbiAgICogQSBNb2RhbE1hbmFnZXIgaW5zdGFuY2UgdXNlZCB0byB0cmFjayBhbmQgbWFuYWdlIHRoZSBzdGF0ZSBvZiBvcGVuXG4gICAqIE1vZGFscy4gVXNlZnVsIHdoZW4gY3VzdG9taXppbmcgaG93IG1vZGFscyBpbnRlcmFjdCB3aXRoaW4gYSBjb250YWluZXJcbiAgICovXG4gIG1hbmFnZXI6IF9wcm9wVHlwZXMyLmRlZmF1bHQub2JqZWN0LmlzUmVxdWlyZWRcbn0pO1xuTW9kYWwuZGVmYXVsdFByb3BzID0ge1xuICBzaG93OiBmYWxzZSxcbiAgYmFja2Ryb3A6IHRydWUsXG4gIGtleWJvYXJkOiB0cnVlLFxuICBhdXRvRm9jdXM6IHRydWUsXG4gIGVuZm9yY2VGb2N1czogdHJ1ZSxcbiAgcmVzdG9yZUZvY3VzOiB0cnVlLFxuICBvbkhpZGU6IGZ1bmN0aW9uIG9uSGlkZSgpIHt9LFxuICBtYW5hZ2VyOiBtb2RhbE1hbmFnZXIsXG4gIHJlbmRlckJhY2tkcm9wOiBmdW5jdGlvbiByZW5kZXJCYWNrZHJvcChwcm9wcykge1xuICAgIHJldHVybiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudCgnZGl2JywgcHJvcHMpO1xuICB9XG59O1xuXG52YXIgX2luaXRpYWxpc2VQcm9wcyA9IGZ1bmN0aW9uIF9pbml0aWFsaXNlUHJvcHMoKSB7XG4gIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gIHRoaXMuc3RhdGUgPSB7IGV4aXRlZDogIXRoaXMucHJvcHMuc2hvdyB9O1xuXG4gIHRoaXMucmVuZGVyQmFja2Ryb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9wcm9wczMgPSBfdGhpczIucHJvcHM7XG4gICAgdmFyIGJhY2tkcm9wU3R5bGUgPSBfcHJvcHMzLmJhY2tkcm9wU3R5bGU7XG4gICAgdmFyIGJhY2tkcm9wQ2xhc3NOYW1lID0gX3Byb3BzMy5iYWNrZHJvcENsYXNzTmFtZTtcbiAgICB2YXIgcmVuZGVyQmFja2Ryb3AgPSBfcHJvcHMzLnJlbmRlckJhY2tkcm9wO1xuICAgIHZhciBUcmFuc2l0aW9uID0gX3Byb3BzMy50cmFuc2l0aW9uO1xuICAgIHZhciBiYWNrZHJvcFRyYW5zaXRpb25UaW1lb3V0ID0gX3Byb3BzMy5iYWNrZHJvcFRyYW5zaXRpb25UaW1lb3V0O1xuXG5cbiAgICB2YXIgYmFja2Ryb3BSZWYgPSBmdW5jdGlvbiBiYWNrZHJvcFJlZihyZWYpIHtcbiAgICAgIHJldHVybiBfdGhpczIuYmFja2Ryb3AgPSByZWY7XG4gICAgfTtcblxuICAgIHZhciBiYWNrZHJvcCA9IHJlbmRlckJhY2tkcm9wKHtcbiAgICAgIHJlZjogYmFja2Ryb3BSZWYsXG4gICAgICBzdHlsZTogYmFja2Ryb3BTdHlsZSxcbiAgICAgIGNsYXNzTmFtZTogYmFja2Ryb3BDbGFzc05hbWUsXG4gICAgICBvbkNsaWNrOiBfdGhpczIuaGFuZGxlQmFja2Ryb3BDbGlja1xuICAgIH0pO1xuXG4gICAgaWYgKFRyYW5zaXRpb24pIHtcbiAgICAgIGJhY2tkcm9wID0gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIFRyYW5zaXRpb24sXG4gICAgICAgIHsgdHJhbnNpdGlvbkFwcGVhcjogdHJ1ZSxcbiAgICAgICAgICAnaW4nOiBfdGhpczIucHJvcHMuc2hvdyxcbiAgICAgICAgICB0aW1lb3V0OiBiYWNrZHJvcFRyYW5zaXRpb25UaW1lb3V0XG4gICAgICAgIH0sXG4gICAgICAgIGJhY2tkcm9wXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBiYWNrZHJvcDtcbiAgfTtcblxuICB0aGlzLm9uU2hvdyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZG9jID0gKDAsIF9vd25lckRvY3VtZW50Mi5kZWZhdWx0KShfdGhpczIpO1xuICAgIHZhciBjb250YWluZXIgPSAoMCwgX2dldENvbnRhaW5lcjIuZGVmYXVsdCkoX3RoaXMyLnByb3BzLmNvbnRhaW5lciwgZG9jLmJvZHkpO1xuXG4gICAgX3RoaXMyLnByb3BzLm1hbmFnZXIuYWRkKF90aGlzMiwgY29udGFpbmVyLCBfdGhpczIucHJvcHMuY29udGFpbmVyQ2xhc3NOYW1lKTtcblxuICAgIF90aGlzMi5fb25Eb2N1bWVudEtleXVwTGlzdGVuZXIgPSAoMCwgX2FkZEV2ZW50TGlzdGVuZXIyLmRlZmF1bHQpKGRvYywgJ2tleXVwJywgX3RoaXMyLmhhbmRsZURvY3VtZW50S2V5VXApO1xuXG4gICAgX3RoaXMyLl9vbkZvY3VzaW5MaXN0ZW5lciA9ICgwLCBfYWRkRm9jdXNMaXN0ZW5lcjIuZGVmYXVsdCkoX3RoaXMyLmVuZm9yY2VGb2N1cyk7XG5cbiAgICBfdGhpczIuZm9jdXMoKTtcblxuICAgIGlmIChfdGhpczIucHJvcHMub25TaG93KSB7XG4gICAgICBfdGhpczIucHJvcHMub25TaG93KCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMub25IaWRlID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMi5wcm9wcy5tYW5hZ2VyLnJlbW92ZShfdGhpczIpO1xuXG4gICAgX3RoaXMyLl9vbkRvY3VtZW50S2V5dXBMaXN0ZW5lci5yZW1vdmUoKTtcblxuICAgIF90aGlzMi5fb25Gb2N1c2luTGlzdGVuZXIucmVtb3ZlKCk7XG5cbiAgICBpZiAoX3RoaXMyLnByb3BzLnJlc3RvcmVGb2N1cykge1xuICAgICAgX3RoaXMyLnJlc3RvcmVMYXN0Rm9jdXMoKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5zZXRNb3VudE5vZGUgPSBmdW5jdGlvbiAocmVmKSB7XG4gICAgX3RoaXMyLm1vdW50Tm9kZSA9IHJlZiA/IHJlZi5nZXRNb3VudE5vZGUoKSA6IHJlZjtcbiAgfTtcblxuICB0aGlzLnNldE1vZGFsTm9kZSA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICBfdGhpczIubW9kYWxOb2RlID0gcmVmO1xuICB9O1xuXG4gIHRoaXMuaGFuZGxlSGlkZGVuID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMi5zZXRTdGF0ZSh7IGV4aXRlZDogdHJ1ZSB9KTtcbiAgICBfdGhpczIub25IaWRlKCk7XG5cbiAgICBpZiAoX3RoaXMyLnByb3BzLm9uRXhpdGVkKSB7XG4gICAgICB2YXIgX3Byb3BzNDtcblxuICAgICAgKF9wcm9wczQgPSBfdGhpczIucHJvcHMpLm9uRXhpdGVkLmFwcGx5KF9wcm9wczQsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaGFuZGxlQmFja2Ryb3BDbGljayA9IGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKGUudGFyZ2V0ICE9PSBlLmN1cnJlbnRUYXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoX3RoaXMyLnByb3BzLm9uQmFja2Ryb3BDbGljaykge1xuICAgICAgX3RoaXMyLnByb3BzLm9uQmFja2Ryb3BDbGljayhlKTtcbiAgICB9XG5cbiAgICBpZiAoX3RoaXMyLnByb3BzLmJhY2tkcm9wID09PSB0cnVlKSB7XG4gICAgICBfdGhpczIucHJvcHMub25IaWRlKCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaGFuZGxlRG9jdW1lbnRLZXlVcCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgaWYgKF90aGlzMi5wcm9wcy5rZXlib2FyZCAmJiBlLmtleUNvZGUgPT09IDI3ICYmIF90aGlzMi5pc1RvcE1vZGFsKCkpIHtcbiAgICAgIGlmIChfdGhpczIucHJvcHMub25Fc2NhcGVLZXlVcCkge1xuICAgICAgICBfdGhpczIucHJvcHMub25Fc2NhcGVLZXlVcChlKTtcbiAgICAgIH1cbiAgICAgIF90aGlzMi5wcm9wcy5vbkhpZGUoKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5jaGVja0ZvckZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChfaW5ET00yLmRlZmF1bHQpIHtcbiAgICAgIF90aGlzMi5sYXN0Rm9jdXMgPSAoMCwgX2FjdGl2ZUVsZW1lbnQyLmRlZmF1bHQpKCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuZm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGF1dG9Gb2N1cyA9IF90aGlzMi5wcm9wcy5hdXRvRm9jdXM7XG4gICAgdmFyIG1vZGFsQ29udGVudCA9IF90aGlzMi5nZXREaWFsb2dFbGVtZW50KCk7XG4gICAgdmFyIGN1cnJlbnQgPSAoMCwgX2FjdGl2ZUVsZW1lbnQyLmRlZmF1bHQpKCgwLCBfb3duZXJEb2N1bWVudDIuZGVmYXVsdCkoX3RoaXMyKSk7XG4gICAgdmFyIGZvY3VzSW5Nb2RhbCA9IGN1cnJlbnQgJiYgKDAsIF9jb250YWluczIuZGVmYXVsdCkobW9kYWxDb250ZW50LCBjdXJyZW50KTtcblxuICAgIGlmIChtb2RhbENvbnRlbnQgJiYgYXV0b0ZvY3VzICYmICFmb2N1c0luTW9kYWwpIHtcbiAgICAgIF90aGlzMi5sYXN0Rm9jdXMgPSBjdXJyZW50O1xuXG4gICAgICBpZiAoIW1vZGFsQ29udGVudC5oYXNBdHRyaWJ1dGUoJ3RhYkluZGV4JykpIHtcbiAgICAgICAgbW9kYWxDb250ZW50LnNldEF0dHJpYnV0ZSgndGFiSW5kZXgnLCAtMSk7XG4gICAgICAgICgwLCBfd2FybmluZzIuZGVmYXVsdCkoZmFsc2UsICdUaGUgbW9kYWwgY29udGVudCBub2RlIGRvZXMgbm90IGFjY2VwdCBmb2N1cy4gJyArICdGb3IgdGhlIGJlbmVmaXQgb2YgYXNzaXN0aXZlIHRlY2hub2xvZ2llcywgdGhlIHRhYkluZGV4IG9mIHRoZSBub2RlIGlzIGJlaW5nIHNldCB0byBcIi0xXCIuJyk7XG4gICAgICB9XG5cbiAgICAgIG1vZGFsQ29udGVudC5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLnJlc3RvcmVMYXN0Rm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gU3VwcG9ydDogPD1JRTExIGRvZXNuJ3Qgc3VwcG9ydCBgZm9jdXMoKWAgb24gc3ZnIGVsZW1lbnRzIChSQjogIzkxNylcbiAgICBpZiAoX3RoaXMyLmxhc3RGb2N1cyAmJiBfdGhpczIubGFzdEZvY3VzLmZvY3VzKSB7XG4gICAgICBfdGhpczIubGFzdEZvY3VzLmZvY3VzKCk7XG4gICAgICBfdGhpczIubGFzdEZvY3VzID0gbnVsbDtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5lbmZvcmNlRm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVuZm9yY2VGb2N1cyA9IF90aGlzMi5wcm9wcy5lbmZvcmNlRm9jdXM7XG5cblxuICAgIGlmICghZW5mb3JjZUZvY3VzIHx8ICFfdGhpczIuX2lzTW91bnRlZCB8fCAhX3RoaXMyLmlzVG9wTW9kYWwoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBhY3RpdmUgPSAoMCwgX2FjdGl2ZUVsZW1lbnQyLmRlZmF1bHQpKCgwLCBfb3duZXJEb2N1bWVudDIuZGVmYXVsdCkoX3RoaXMyKSk7XG4gICAgdmFyIG1vZGFsID0gX3RoaXMyLmdldERpYWxvZ0VsZW1lbnQoKTtcblxuICAgIGlmIChtb2RhbCAmJiBtb2RhbCAhPT0gYWN0aXZlICYmICEoMCwgX2NvbnRhaW5zMi5kZWZhdWx0KShtb2RhbCwgYWN0aXZlKSkge1xuICAgICAgbW9kYWwuZm9jdXMoKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5nZXREaWFsb2dFbGVtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBub2RlID0gX3RoaXMyLm1vZGFsTm9kZTtcbiAgICByZXR1cm4gbm9kZSAmJiBub2RlLmxhc3RDaGlsZDtcbiAgfTtcblxuICB0aGlzLmlzVG9wTW9kYWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF90aGlzMi5wcm9wcy5tYW5hZ2VyLmlzVG9wTW9kYWwoX3RoaXMyKTtcbiAgfTtcbn07XG5cbk1vZGFsLk1hbmFnZXIgPSBfTW9kYWxNYW5hZ2VyMi5kZWZhdWx0O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBNb2RhbDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9zdHlsZSA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL3N0eWxlJyk7XG5cbnZhciBfc3R5bGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3R5bGUpO1xuXG52YXIgX2NsYXNzID0gcmVxdWlyZSgnZG9tLWhlbHBlcnMvY2xhc3MnKTtcblxudmFyIF9jbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzcyk7XG5cbnZhciBfc2Nyb2xsYmFyU2l6ZSA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL3V0aWwvc2Nyb2xsYmFyU2l6ZScpO1xuXG52YXIgX3Njcm9sbGJhclNpemUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2Nyb2xsYmFyU2l6ZSk7XG5cbnZhciBfaXNPdmVyZmxvd2luZyA9IHJlcXVpcmUoJy4vdXRpbHMvaXNPdmVyZmxvd2luZycpO1xuXG52YXIgX2lzT3ZlcmZsb3dpbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNPdmVyZmxvd2luZyk7XG5cbnZhciBfbWFuYWdlQXJpYUhpZGRlbiA9IHJlcXVpcmUoJy4vdXRpbHMvbWFuYWdlQXJpYUhpZGRlbicpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBmaW5kSW5kZXhPZihhcnIsIGNiKSB7XG4gIHZhciBpZHggPSAtMTtcbiAgYXJyLnNvbWUoZnVuY3Rpb24gKGQsIGkpIHtcbiAgICBpZiAoY2IoZCwgaSkpIHtcbiAgICAgIGlkeCA9IGk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gaWR4O1xufVxuXG5mdW5jdGlvbiBmaW5kQ29udGFpbmVyKGRhdGEsIG1vZGFsKSB7XG4gIHJldHVybiBmaW5kSW5kZXhPZihkYXRhLCBmdW5jdGlvbiAoZCkge1xuICAgIHJldHVybiBkLm1vZGFscy5pbmRleE9mKG1vZGFsKSAhPT0gLTE7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZXRDb250YWluZXJTdHlsZShzdGF0ZSwgY29udGFpbmVyKSB7XG4gIHZhciBzdHlsZSA9IHsgb3ZlcmZsb3c6ICdoaWRkZW4nIH07XG5cbiAgLy8gd2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgYWN0dWFsIGBzdHlsZWAgaGVyZVxuICAvLyBiZWNhc3VlIHdlIHdpbGwgb3ZlcnJpZGUgaXRcbiAgc3RhdGUuc3R5bGUgPSB7XG4gICAgb3ZlcmZsb3c6IGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvdyxcbiAgICBwYWRkaW5nUmlnaHQ6IGNvbnRhaW5lci5zdHlsZS5wYWRkaW5nUmlnaHRcbiAgfTtcblxuICBpZiAoc3RhdGUub3ZlcmZsb3dpbmcpIHtcbiAgICAvLyB1c2UgY29tcHV0ZWQgc3R5bGUsIGhlcmUgdG8gZ2V0IHRoZSByZWFsIHBhZGRpbmdcbiAgICAvLyB0byBhZGQgb3VyIHNjcm9sbGJhciB3aWR0aFxuICAgIHN0eWxlLnBhZGRpbmdSaWdodCA9IHBhcnNlSW50KCgwLCBfc3R5bGUyLmRlZmF1bHQpKGNvbnRhaW5lciwgJ3BhZGRpbmdSaWdodCcpIHx8IDAsIDEwKSArICgwLCBfc2Nyb2xsYmFyU2l6ZTIuZGVmYXVsdCkoKSArICdweCc7XG4gIH1cblxuICAoMCwgX3N0eWxlMi5kZWZhdWx0KShjb250YWluZXIsIHN0eWxlKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQ29udGFpbmVyU3R5bGUoX3JlZiwgY29udGFpbmVyKSB7XG4gIHZhciBzdHlsZSA9IF9yZWYuc3R5bGU7XG5cblxuICBPYmplY3Qua2V5cyhzdHlsZSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5zdHlsZVtrZXldID0gc3R5bGVba2V5XTtcbiAgfSk7XG59XG4vKipcbiAqIFByb3BlciBzdGF0ZSBtYW5hZ21lbnQgZm9yIGNvbnRhaW5lcnMgYW5kIHRoZSBtb2RhbHMgaW4gdGhvc2UgY29udGFpbmVycy5cbiAqXG4gKiBAaW50ZXJuYWwgVXNlZCBieSB0aGUgTW9kYWwgdG8gZW5zdXJlIHByb3BlciBzdHlsaW5nIG9mIGNvbnRhaW5lcnMuXG4gKi9cblxudmFyIE1vZGFsTWFuYWdlciA9IGZ1bmN0aW9uIE1vZGFsTWFuYWdlcigpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB2YXIgX3JlZjIgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTtcblxuICB2YXIgX3JlZjIkaGlkZVNpYmxpbmdOb2RlID0gX3JlZjIuaGlkZVNpYmxpbmdOb2RlcztcbiAgdmFyIGhpZGVTaWJsaW5nTm9kZXMgPSBfcmVmMiRoaWRlU2libGluZ05vZGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBfcmVmMiRoaWRlU2libGluZ05vZGU7XG4gIHZhciBfcmVmMiRoYW5kbGVDb250YWluZXIgPSBfcmVmMi5oYW5kbGVDb250YWluZXJPdmVyZmxvdztcbiAgdmFyIGhhbmRsZUNvbnRhaW5lck92ZXJmbG93ID0gX3JlZjIkaGFuZGxlQ29udGFpbmVyID09PSB1bmRlZmluZWQgPyB0cnVlIDogX3JlZjIkaGFuZGxlQ29udGFpbmVyO1xuXG4gIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNb2RhbE1hbmFnZXIpO1xuXG4gIHRoaXMuYWRkID0gZnVuY3Rpb24gKG1vZGFsLCBjb250YWluZXIsIGNsYXNzTmFtZSkge1xuICAgIHZhciBtb2RhbElkeCA9IF90aGlzLm1vZGFscy5pbmRleE9mKG1vZGFsKTtcbiAgICB2YXIgY29udGFpbmVySWR4ID0gX3RoaXMuY29udGFpbmVycy5pbmRleE9mKGNvbnRhaW5lcik7XG5cbiAgICBpZiAobW9kYWxJZHggIT09IC0xKSB7XG4gICAgICByZXR1cm4gbW9kYWxJZHg7XG4gICAgfVxuXG4gICAgbW9kYWxJZHggPSBfdGhpcy5tb2RhbHMubGVuZ3RoO1xuICAgIF90aGlzLm1vZGFscy5wdXNoKG1vZGFsKTtcblxuICAgIGlmIChfdGhpcy5oaWRlU2libGluZ05vZGVzKSB7XG4gICAgICAoMCwgX21hbmFnZUFyaWFIaWRkZW4uaGlkZVNpYmxpbmdzKShjb250YWluZXIsIG1vZGFsLm1vdW50Tm9kZSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRhaW5lcklkeCAhPT0gLTEpIHtcbiAgICAgIF90aGlzLmRhdGFbY29udGFpbmVySWR4XS5tb2RhbHMucHVzaChtb2RhbCk7XG4gICAgICByZXR1cm4gbW9kYWxJZHg7XG4gICAgfVxuXG4gICAgdmFyIGRhdGEgPSB7XG4gICAgICBtb2RhbHM6IFttb2RhbF0sXG4gICAgICAvL3JpZ2h0IG5vdyBvbmx5IHRoZSBmaXJzdCBtb2RhbCBvZiBhIGNvbnRhaW5lciB3aWxsIGhhdmUgaXRzIGNsYXNzZXMgYXBwbGllZFxuICAgICAgY2xhc3NlczogY2xhc3NOYW1lID8gY2xhc3NOYW1lLnNwbGl0KC9cXHMrLykgOiBbXSxcblxuICAgICAgb3ZlcmZsb3dpbmc6ICgwLCBfaXNPdmVyZmxvd2luZzIuZGVmYXVsdCkoY29udGFpbmVyKVxuICAgIH07XG5cbiAgICBpZiAoX3RoaXMuaGFuZGxlQ29udGFpbmVyT3ZlcmZsb3cpIHtcbiAgICAgIHNldENvbnRhaW5lclN0eWxlKGRhdGEsIGNvbnRhaW5lcik7XG4gICAgfVxuXG4gICAgZGF0YS5jbGFzc2VzLmZvckVhY2goX2NsYXNzMi5kZWZhdWx0LmFkZENsYXNzLmJpbmQobnVsbCwgY29udGFpbmVyKSk7XG5cbiAgICBfdGhpcy5jb250YWluZXJzLnB1c2goY29udGFpbmVyKTtcbiAgICBfdGhpcy5kYXRhLnB1c2goZGF0YSk7XG5cbiAgICByZXR1cm4gbW9kYWxJZHg7XG4gIH07XG5cbiAgdGhpcy5yZW1vdmUgPSBmdW5jdGlvbiAobW9kYWwpIHtcbiAgICB2YXIgbW9kYWxJZHggPSBfdGhpcy5tb2RhbHMuaW5kZXhPZihtb2RhbCk7XG5cbiAgICBpZiAobW9kYWxJZHggPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGNvbnRhaW5lcklkeCA9IGZpbmRDb250YWluZXIoX3RoaXMuZGF0YSwgbW9kYWwpO1xuICAgIHZhciBkYXRhID0gX3RoaXMuZGF0YVtjb250YWluZXJJZHhdO1xuICAgIHZhciBjb250YWluZXIgPSBfdGhpcy5jb250YWluZXJzW2NvbnRhaW5lcklkeF07XG5cbiAgICBkYXRhLm1vZGFscy5zcGxpY2UoZGF0YS5tb2RhbHMuaW5kZXhPZihtb2RhbCksIDEpO1xuXG4gICAgX3RoaXMubW9kYWxzLnNwbGljZShtb2RhbElkeCwgMSk7XG5cbiAgICAvLyBpZiB0aGF0IHdhcyB0aGUgbGFzdCBtb2RhbCBpbiBhIGNvbnRhaW5lcixcbiAgICAvLyBjbGVhbiB1cCB0aGUgY29udGFpbmVyXG4gICAgaWYgKGRhdGEubW9kYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZGF0YS5jbGFzc2VzLmZvckVhY2goX2NsYXNzMi5kZWZhdWx0LnJlbW92ZUNsYXNzLmJpbmQobnVsbCwgY29udGFpbmVyKSk7XG5cbiAgICAgIGlmIChfdGhpcy5oYW5kbGVDb250YWluZXJPdmVyZmxvdykge1xuICAgICAgICByZW1vdmVDb250YWluZXJTdHlsZShkYXRhLCBjb250YWluZXIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMuaGlkZVNpYmxpbmdOb2Rlcykge1xuICAgICAgICAoMCwgX21hbmFnZUFyaWFIaWRkZW4uc2hvd1NpYmxpbmdzKShjb250YWluZXIsIG1vZGFsLm1vdW50Tm9kZSk7XG4gICAgICB9XG4gICAgICBfdGhpcy5jb250YWluZXJzLnNwbGljZShjb250YWluZXJJZHgsIDEpO1xuICAgICAgX3RoaXMuZGF0YS5zcGxpY2UoY29udGFpbmVySWR4LCAxKTtcbiAgICB9IGVsc2UgaWYgKF90aGlzLmhpZGVTaWJsaW5nTm9kZXMpIHtcbiAgICAgIC8vb3RoZXJ3aXNlIG1ha2Ugc3VyZSB0aGUgbmV4dCB0b3AgbW9kYWwgaXMgdmlzaWJsZSB0byBhIFNSXG4gICAgICAoMCwgX21hbmFnZUFyaWFIaWRkZW4uYXJpYUhpZGRlbikoZmFsc2UsIGRhdGEubW9kYWxzW2RhdGEubW9kYWxzLmxlbmd0aCAtIDFdLm1vdW50Tm9kZSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaXNUb3BNb2RhbCA9IGZ1bmN0aW9uIChtb2RhbCkge1xuICAgIHJldHVybiAhIV90aGlzLm1vZGFscy5sZW5ndGggJiYgX3RoaXMubW9kYWxzW190aGlzLm1vZGFscy5sZW5ndGggLSAxXSA9PT0gbW9kYWw7XG4gIH07XG5cbiAgdGhpcy5oaWRlU2libGluZ05vZGVzID0gaGlkZVNpYmxpbmdOb2RlcztcbiAgdGhpcy5oYW5kbGVDb250YWluZXJPdmVyZmxvdyA9IGhhbmRsZUNvbnRhaW5lck92ZXJmbG93O1xuICB0aGlzLm1vZGFscyA9IFtdO1xuICB0aGlzLmNvbnRhaW5lcnMgPSBbXTtcbiAgdGhpcy5kYXRhID0gW107XG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBNb2RhbE1hbmFnZXI7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfUG9ydGFsID0gcmVxdWlyZSgnLi9Qb3J0YWwnKTtcblxudmFyIF9Qb3J0YWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUG9ydGFsKTtcblxudmFyIF9Qb3NpdGlvbiA9IHJlcXVpcmUoJy4vUG9zaXRpb24nKTtcblxudmFyIF9Qb3NpdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Qb3NpdGlvbik7XG5cbnZhciBfUm9vdENsb3NlV3JhcHBlciA9IHJlcXVpcmUoJy4vUm9vdENsb3NlV3JhcHBlcicpO1xuXG52YXIgX1Jvb3RDbG9zZVdyYXBwZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUm9vdENsb3NlV3JhcHBlcik7XG5cbnZhciBfZWxlbWVudFR5cGUgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbi8qKlxuICogQnVpbHQgb24gdG9wIG9mIGA8UG9zaXRpb24vPmAgYW5kIGA8UG9ydGFsLz5gLCB0aGUgb3ZlcmxheSBjb21wb25lbnQgaXMgZ3JlYXQgZm9yIGN1c3RvbSB0b29sdGlwIG92ZXJsYXlzLlxuICovXG52YXIgT3ZlcmxheSA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhPdmVybGF5LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBPdmVybGF5KHByb3BzLCBjb250ZXh0KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE92ZXJsYXkpO1xuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKE92ZXJsYXkuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihPdmVybGF5KSkuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgX3RoaXMuaGFuZGxlSGlkZGVuID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMuc2V0U3RhdGUoeyBleGl0ZWQ6IHRydWUgfSk7XG5cbiAgICAgIGlmIChfdGhpcy5wcm9wcy5vbkV4aXRlZCkge1xuICAgICAgICB2YXIgX3RoaXMkcHJvcHM7XG5cbiAgICAgICAgKF90aGlzJHByb3BzID0gX3RoaXMucHJvcHMpLm9uRXhpdGVkLmFwcGx5KF90aGlzJHByb3BzLCBhcmd1bWVudHMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHsgZXhpdGVkOiAhcHJvcHMuc2hvdyB9O1xuICAgIF90aGlzLm9uSGlkZGVuTGlzdGVuZXIgPSBfdGhpcy5oYW5kbGVIaWRkZW4uYmluZChfdGhpcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE92ZXJsYXksIFt7XG4gICAga2V5OiAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICBpZiAobmV4dFByb3BzLnNob3cpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGV4aXRlZDogZmFsc2UgfSk7XG4gICAgICB9IGVsc2UgaWYgKCFuZXh0UHJvcHMudHJhbnNpdGlvbikge1xuICAgICAgICAvLyBPdGhlcndpc2UgbGV0IGhhbmRsZUhpZGRlbiB0YWtlIGNhcmUgb2YgbWFya2luZyBleGl0ZWQuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBleGl0ZWQ6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncmVuZGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICB2YXIgY29udGFpbmVyID0gX3Byb3BzLmNvbnRhaW5lcjtcbiAgICAgIHZhciBjb250YWluZXJQYWRkaW5nID0gX3Byb3BzLmNvbnRhaW5lclBhZGRpbmc7XG4gICAgICB2YXIgdGFyZ2V0ID0gX3Byb3BzLnRhcmdldDtcbiAgICAgIHZhciBwbGFjZW1lbnQgPSBfcHJvcHMucGxhY2VtZW50O1xuICAgICAgdmFyIHNob3VsZFVwZGF0ZVBvc2l0aW9uID0gX3Byb3BzLnNob3VsZFVwZGF0ZVBvc2l0aW9uO1xuICAgICAgdmFyIHJvb3RDbG9zZSA9IF9wcm9wcy5yb290Q2xvc2U7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgVHJhbnNpdGlvbiA9IF9wcm9wcy50cmFuc2l0aW9uO1xuXG4gICAgICB2YXIgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3Byb3BzLCBbJ2NvbnRhaW5lcicsICdjb250YWluZXJQYWRkaW5nJywgJ3RhcmdldCcsICdwbGFjZW1lbnQnLCAnc2hvdWxkVXBkYXRlUG9zaXRpb24nLCAncm9vdENsb3NlJywgJ2NoaWxkcmVuJywgJ3RyYW5zaXRpb24nXSk7XG5cbiAgICAgIC8vIERvbid0IHVuLXJlbmRlciB0aGUgb3ZlcmxheSB3aGlsZSBpdCdzIHRyYW5zaXRpb25pbmcgb3V0LlxuXG5cbiAgICAgIHZhciBtb3VudE92ZXJsYXkgPSBwcm9wcy5zaG93IHx8IFRyYW5zaXRpb24gJiYgIXRoaXMuc3RhdGUuZXhpdGVkO1xuICAgICAgaWYgKCFtb3VudE92ZXJsYXkpIHtcbiAgICAgICAgLy8gRG9uJ3QgYm90aGVyIHNob3dpbmcgYW55dGhpbmcgaWYgd2UgZG9uJ3QgaGF2ZSB0by5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuO1xuXG4gICAgICAvLyBQb3NpdGlvbiBpcyBiZSBpbm5lci1tb3N0IGJlY2F1c2UgaXQgYWRkcyBpbmxpbmUgc3R5bGVzIGludG8gdGhlIGNoaWxkLFxuICAgICAgLy8gd2hpY2ggdGhlIG90aGVyIHdyYXBwZXJzIGRvbid0IGZvcndhcmQgY29ycmVjdGx5LlxuICAgICAgY2hpbGQgPSBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgX1Bvc2l0aW9uMi5kZWZhdWx0LFxuICAgICAgICB7IGNvbnRhaW5lcjogY29udGFpbmVyLCBjb250YWluZXJQYWRkaW5nOiBjb250YWluZXJQYWRkaW5nLCB0YXJnZXQ6IHRhcmdldCwgcGxhY2VtZW50OiBwbGFjZW1lbnQsIHNob3VsZFVwZGF0ZVBvc2l0aW9uOiBzaG91bGRVcGRhdGVQb3NpdGlvbiB9LFxuICAgICAgICBjaGlsZFxuICAgICAgKTtcblxuICAgICAgaWYgKFRyYW5zaXRpb24pIHtcbiAgICAgICAgdmFyIG9uRXhpdCA9IHByb3BzLm9uRXhpdDtcbiAgICAgICAgdmFyIG9uRXhpdGluZyA9IHByb3BzLm9uRXhpdGluZztcbiAgICAgICAgdmFyIG9uRW50ZXIgPSBwcm9wcy5vbkVudGVyO1xuICAgICAgICB2YXIgb25FbnRlcmluZyA9IHByb3BzLm9uRW50ZXJpbmc7XG4gICAgICAgIHZhciBvbkVudGVyZWQgPSBwcm9wcy5vbkVudGVyZWQ7XG5cbiAgICAgICAgLy8gVGhpcyBhbmltYXRlcyB0aGUgY2hpbGQgbm9kZSBieSBpbmplY3RpbmcgcHJvcHMsIHNvIGl0IG11c3QgcHJlY2VkZVxuICAgICAgICAvLyBhbnl0aGluZyB0aGF0IGFkZHMgYSB3cmFwcGluZyBkaXYuXG5cbiAgICAgICAgY2hpbGQgPSBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBUcmFuc2l0aW9uLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgICdpbic6IHByb3BzLnNob3csXG4gICAgICAgICAgICB0cmFuc2l0aW9uQXBwZWFyOiB0cnVlLFxuICAgICAgICAgICAgb25FeGl0OiBvbkV4aXQsXG4gICAgICAgICAgICBvbkV4aXRpbmc6IG9uRXhpdGluZyxcbiAgICAgICAgICAgIG9uRXhpdGVkOiB0aGlzLm9uSGlkZGVuTGlzdGVuZXIsXG4gICAgICAgICAgICBvbkVudGVyOiBvbkVudGVyLFxuICAgICAgICAgICAgb25FbnRlcmluZzogb25FbnRlcmluZyxcbiAgICAgICAgICAgIG9uRW50ZXJlZDogb25FbnRlcmVkXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjaGlsZFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIGdvZXMgYWZ0ZXIgZXZlcnl0aGluZyBlbHNlIGJlY2F1c2UgaXQgYWRkcyBhIHdyYXBwaW5nIGRpdi5cbiAgICAgIGlmIChyb290Q2xvc2UpIHtcbiAgICAgICAgY2hpbGQgPSBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBfUm9vdENsb3NlV3JhcHBlcjIuZGVmYXVsdCxcbiAgICAgICAgICB7IG9uUm9vdENsb3NlOiBwcm9wcy5vbkhpZGUgfSxcbiAgICAgICAgICBjaGlsZFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIF9Qb3J0YWwyLmRlZmF1bHQsXG4gICAgICAgIHsgY29udGFpbmVyOiBjb250YWluZXIgfSxcbiAgICAgICAgY2hpbGRcbiAgICAgICk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE92ZXJsYXk7XG59KF9yZWFjdDIuZGVmYXVsdC5Db21wb25lbnQpO1xuXG5PdmVybGF5LnByb3BUeXBlcyA9IF9leHRlbmRzKHt9LCBfUG9ydGFsMi5kZWZhdWx0LnByb3BUeXBlcywgX1Bvc2l0aW9uMi5kZWZhdWx0LnByb3BUeXBlcywge1xuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHZpc2liaWxpdHkgb2YgdGhlIE92ZXJsYXlcbiAgICovXG4gIHNob3c6IF9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbCxcblxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBvdmVybGF5IHNob3VsZCB0cmlnZ2VyIGBvbkhpZGVgIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG91dHNpZGUgdGhlIG92ZXJsYXlcbiAgICovXG4gIHJvb3RDbG9zZTogX3Byb3BUeXBlczIuZGVmYXVsdC5ib29sLFxuXG4gIC8qKlxuICAgKiBBIENhbGxiYWNrIGZpcmVkIGJ5IHRoZSBPdmVybGF5IHdoZW4gaXQgd2lzaGVzIHRvIGJlIGhpZGRlbi5cbiAgICpcbiAgICogX19yZXF1aXJlZF9fIHdoZW4gYHJvb3RDbG9zZWAgaXMgYHRydWVgLlxuICAgKlxuICAgKiBAdHlwZSBmdW5jXG4gICAqL1xuICBvbkhpZGU6IGZ1bmN0aW9uIG9uSGlkZShwcm9wcykge1xuICAgIHZhciBwcm9wVHlwZSA9IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYztcbiAgICBpZiAocHJvcHMucm9vdENsb3NlKSB7XG4gICAgICBwcm9wVHlwZSA9IHByb3BUeXBlLmlzUmVxdWlyZWQ7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcFR5cGUuYXBwbHkodW5kZWZpbmVkLCBbcHJvcHNdLmNvbmNhdChhcmdzKSk7XG4gIH0sXG5cblxuICAvKipcbiAgICogQSBgPFRyYW5zaXRpb24vPmAgY29tcG9uZW50IHVzZWQgdG8gYW5pbWF0ZSB0aGUgb3ZlcmxheSBjaGFuZ2VzIHZpc2liaWxpdHkuXG4gICAqL1xuICB0cmFuc2l0aW9uOiBfZWxlbWVudFR5cGUyLmRlZmF1bHQsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGJlZm9yZSB0aGUgT3ZlcmxheSB0cmFuc2l0aW9ucyBpblxuICAgKi9cbiAgb25FbnRlcjogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhcyB0aGUgT3ZlcmxheSBiZWdpbnMgdG8gdHJhbnNpdGlvbiBpblxuICAgKi9cbiAgb25FbnRlcmluZzogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgT3ZlcmxheSBmaW5pc2hlcyB0cmFuc2l0aW9uaW5nIGluXG4gICAqL1xuICBvbkVudGVyZWQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgcmlnaHQgYmVmb3JlIHRoZSBPdmVybGF5IHRyYW5zaXRpb25zIG91dFxuICAgKi9cbiAgb25FeGl0OiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFzIHRoZSBPdmVybGF5IGJlZ2lucyB0byB0cmFuc2l0aW9uIG91dFxuICAgKi9cbiAgb25FeGl0aW5nOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBPdmVybGF5IGZpbmlzaGVzIHRyYW5zaXRpb25pbmcgb3V0XG4gICAqL1xuICBvbkV4aXRlZDogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jXG59KTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gT3ZlcmxheTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9yZWFjdERvbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuXG52YXIgX3JlYWN0RG9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0RG9tKTtcblxudmFyIF9jb21wb25lbnRPckVsZW1lbnQgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9jb21wb25lbnRPckVsZW1lbnQnKTtcblxudmFyIF9jb21wb25lbnRPckVsZW1lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29tcG9uZW50T3JFbGVtZW50KTtcblxudmFyIF9vd25lckRvY3VtZW50ID0gcmVxdWlyZSgnLi91dGlscy9vd25lckRvY3VtZW50Jyk7XG5cbnZhciBfb3duZXJEb2N1bWVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vd25lckRvY3VtZW50KTtcblxudmFyIF9nZXRDb250YWluZXIgPSByZXF1aXJlKCcuL3V0aWxzL2dldENvbnRhaW5lcicpO1xuXG52YXIgX2dldENvbnRhaW5lcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9nZXRDb250YWluZXIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbi8qKlxuICogVGhlIGA8UG9ydGFsLz5gIGNvbXBvbmVudCByZW5kZXJzIGl0cyBjaGlsZHJlbiBpbnRvIGEgbmV3IFwic3VidHJlZVwiIG91dHNpZGUgb2YgY3VycmVudCBjb21wb25lbnQgaGllcmFyY2h5LlxuICogWW91IGNhbiB0aGluayBvZiBpdCBhcyBhIGRlY2xhcmF0aXZlIGBhcHBlbmRDaGlsZCgpYCwgb3IgalF1ZXJ5J3MgYCQuZm4uYXBwZW5kVG8oKWAuXG4gKiBUaGUgY2hpbGRyZW4gb2YgYDxQb3J0YWwvPmAgY29tcG9uZW50IHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGBjb250YWluZXJgIHNwZWNpZmllZC5cbiAqL1xudmFyIFBvcnRhbCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhQb3J0YWwsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFBvcnRhbCgpIHtcbiAgICB2YXIgX3JlZjtcblxuICAgIHZhciBfdGVtcCwgX3RoaXMsIF9yZXQ7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9ydGFsKTtcblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBfcmV0ID0gKF90ZW1wID0gKF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKF9yZWYgPSBQb3J0YWwuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihQb3J0YWwpKS5jYWxsLmFwcGx5KF9yZWYsIFt0aGlzXS5jb25jYXQoYXJncykpKSwgX3RoaXMpLCBfdGhpcy5fbW91bnRPdmVybGF5VGFyZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFfdGhpcy5fb3ZlcmxheVRhcmdldCkge1xuICAgICAgICBfdGhpcy5fb3ZlcmxheVRhcmdldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBfdGhpcy5fcG9ydGFsQ29udGFpbmVyTm9kZSA9ICgwLCBfZ2V0Q29udGFpbmVyMi5kZWZhdWx0KShfdGhpcy5wcm9wcy5jb250YWluZXIsICgwLCBfb3duZXJEb2N1bWVudDIuZGVmYXVsdCkoX3RoaXMpLmJvZHkpO1xuICAgICAgICBfdGhpcy5fcG9ydGFsQ29udGFpbmVyTm9kZS5hcHBlbmRDaGlsZChfdGhpcy5fb3ZlcmxheVRhcmdldCk7XG4gICAgICB9XG4gICAgfSwgX3RoaXMuX3VubW91bnRPdmVybGF5VGFyZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLl9vdmVybGF5VGFyZ2V0KSB7XG4gICAgICAgIF90aGlzLl9wb3J0YWxDb250YWluZXJOb2RlLnJlbW92ZUNoaWxkKF90aGlzLl9vdmVybGF5VGFyZ2V0KTtcbiAgICAgICAgX3RoaXMuX292ZXJsYXlUYXJnZXQgPSBudWxsO1xuICAgICAgfVxuICAgICAgX3RoaXMuX3BvcnRhbENvbnRhaW5lck5vZGUgPSBudWxsO1xuICAgIH0sIF90aGlzLl9yZW5kZXJPdmVybGF5ID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICB2YXIgb3ZlcmxheSA9ICFfdGhpcy5wcm9wcy5jaGlsZHJlbiA/IG51bGwgOiBfcmVhY3QyLmRlZmF1bHQuQ2hpbGRyZW4ub25seShfdGhpcy5wcm9wcy5jaGlsZHJlbik7XG5cbiAgICAgIC8vIFNhdmUgcmVmZXJlbmNlIGZvciBmdXR1cmUgYWNjZXNzLlxuICAgICAgaWYgKG92ZXJsYXkgIT09IG51bGwpIHtcbiAgICAgICAgX3RoaXMuX21vdW50T3ZlcmxheVRhcmdldCgpO1xuICAgICAgICBfdGhpcy5fb3ZlcmxheUluc3RhbmNlID0gX3JlYWN0RG9tMi5kZWZhdWx0LnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKF90aGlzLCBvdmVybGF5LCBfdGhpcy5fb3ZlcmxheVRhcmdldCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVbnJlbmRlciBpZiB0aGUgY29tcG9uZW50IGlzIG51bGwgZm9yIHRyYW5zaXRpb25zIHRvIG51bGxcbiAgICAgICAgX3RoaXMuX3VucmVuZGVyT3ZlcmxheSgpO1xuICAgICAgICBfdGhpcy5fdW5tb3VudE92ZXJsYXlUYXJnZXQoKTtcbiAgICAgIH1cbiAgICB9LCBfdGhpcy5fdW5yZW5kZXJPdmVybGF5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLl9vdmVybGF5VGFyZ2V0KSB7XG4gICAgICAgIF9yZWFjdERvbTIuZGVmYXVsdC51bm1vdW50Q29tcG9uZW50QXROb2RlKF90aGlzLl9vdmVybGF5VGFyZ2V0KTtcbiAgICAgICAgX3RoaXMuX292ZXJsYXlJbnN0YW5jZSA9IG51bGw7XG4gICAgICB9XG4gICAgfSwgX3RoaXMuZ2V0TW91bnROb2RlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLl9vdmVybGF5VGFyZ2V0O1xuICAgIH0sIF90aGlzLmdldE92ZXJsYXlET01Ob2RlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFfdGhpcy5faXNNb3VudGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZ2V0T3ZlcmxheURPTU5vZGUoKTogQSBjb21wb25lbnQgbXVzdCBiZSBtb3VudGVkIHRvIGhhdmUgYSBET00gbm9kZS4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzLl9vdmVybGF5SW5zdGFuY2UpIHtcbiAgICAgICAgcmV0dXJuIF9yZWFjdERvbTIuZGVmYXVsdC5maW5kRE9NTm9kZShfdGhpcy5fb3ZlcmxheUluc3RhbmNlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSwgX3RlbXApLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihfdGhpcywgX3JldCk7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUG9ydGFsLCBbe1xuICAgIGtleTogJ2NvbXBvbmVudERpZE1vdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLl9pc01vdW50ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5fcmVuZGVyT3ZlcmxheSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudERpZFVwZGF0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgIHRoaXMuX3JlbmRlck92ZXJsYXkoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICAgIGlmICh0aGlzLl9vdmVybGF5VGFyZ2V0ICYmIG5leHRQcm9wcy5jb250YWluZXIgIT09IHRoaXMucHJvcHMuY29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMuX3BvcnRhbENvbnRhaW5lck5vZGUucmVtb3ZlQ2hpbGQodGhpcy5fb3ZlcmxheVRhcmdldCk7XG4gICAgICAgIHRoaXMuX3BvcnRhbENvbnRhaW5lck5vZGUgPSAoMCwgX2dldENvbnRhaW5lcjIuZGVmYXVsdCkobmV4dFByb3BzLmNvbnRhaW5lciwgKDAsIF9vd25lckRvY3VtZW50Mi5kZWZhdWx0KSh0aGlzKS5ib2R5KTtcbiAgICAgICAgdGhpcy5fcG9ydGFsQ29udGFpbmVyTm9kZS5hcHBlbmRDaGlsZCh0aGlzLl9vdmVybGF5VGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb21wb25lbnRXaWxsVW5tb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgdGhpcy5faXNNb3VudGVkID0gZmFsc2U7XG4gICAgICB0aGlzLl91bnJlbmRlck92ZXJsYXkoKTtcbiAgICAgIHRoaXMuX3VubW91bnRPdmVybGF5VGFyZ2V0KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncmVuZGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFBvcnRhbDtcbn0oX3JlYWN0Mi5kZWZhdWx0LkNvbXBvbmVudCk7XG5cblBvcnRhbC5kaXNwbGF5TmFtZSA9ICdQb3J0YWwnO1xuUG9ydGFsLnByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIEEgTm9kZSwgQ29tcG9uZW50IGluc3RhbmNlLCBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgZWl0aGVyLiBUaGUgYGNvbnRhaW5lcmAgd2lsbCBoYXZlIHRoZSBQb3J0YWwgY2hpbGRyZW5cbiAgICogYXBwZW5kZWQgdG8gaXQuXG4gICAqL1xuICBjb250YWluZXI6IF9wcm9wVHlwZXMyLmRlZmF1bHQub25lT2ZUeXBlKFtfY29tcG9uZW50T3JFbGVtZW50Mi5kZWZhdWx0LCBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmNdKVxufTtcbmV4cG9ydHMuZGVmYXVsdCA9IFBvcnRhbDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfcmVhY3REb20gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcblxudmFyIF9yZWFjdERvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdERvbSk7XG5cbnZhciBfY29tcG9uZW50T3JFbGVtZW50ID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvY29tcG9uZW50T3JFbGVtZW50Jyk7XG5cbnZhciBfY29tcG9uZW50T3JFbGVtZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbXBvbmVudE9yRWxlbWVudCk7XG5cbnZhciBfY2FsY3VsYXRlUG9zaXRpb24gPSByZXF1aXJlKCcuL3V0aWxzL2NhbGN1bGF0ZVBvc2l0aW9uJyk7XG5cbnZhciBfY2FsY3VsYXRlUG9zaXRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2FsY3VsYXRlUG9zaXRpb24pO1xuXG52YXIgX2dldENvbnRhaW5lciA9IHJlcXVpcmUoJy4vdXRpbHMvZ2V0Q29udGFpbmVyJyk7XG5cbnZhciBfZ2V0Q29udGFpbmVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldENvbnRhaW5lcik7XG5cbnZhciBfb3duZXJEb2N1bWVudCA9IHJlcXVpcmUoJy4vdXRpbHMvb3duZXJEb2N1bWVudCcpO1xuXG52YXIgX293bmVyRG9jdW1lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb3duZXJEb2N1bWVudCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvYmosIGtleXMpIHsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBpIGluIG9iaikgeyBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTsgdGFyZ2V0W2ldID0gb2JqW2ldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG4vKipcbiAqIFRoZSBQb3NpdGlvbiBjb21wb25lbnQgY2FsY3VsYXRlcyB0aGUgY29vcmRpbmF0ZXMgZm9yIGl0cyBjaGlsZCwgdG8gcG9zaXRpb25cbiAqIGl0IHJlbGF0aXZlIHRvIGEgYHRhcmdldGAgY29tcG9uZW50IG9yIG5vZGUuIFVzZWZ1bCBmb3IgY3JlYXRpbmcgY2FsbG91dHNcbiAqIGFuZCB0b29sdGlwcywgdGhlIFBvc2l0aW9uIGNvbXBvbmVudCBpbmplY3RzIGEgYHN0eWxlYCBwcm9wcyB3aXRoIGBsZWZ0YCBhbmRcbiAqIGB0b3BgIHZhbHVlcyBmb3IgcG9zaXRpb25pbmcgeW91ciBjb21wb25lbnQuXG4gKlxuICogSXQgYWxzbyBpbmplY3RzIFwiYXJyb3dcIiBgbGVmdGAsIGFuZCBgdG9wYCB2YWx1ZXMgZm9yIHN0eWxpbmcgY2FsbG91dCBhcnJvd3NcbiAqIGZvciBnaXZpbmcgeW91ciBjb21wb25lbnRzIGEgc2Vuc2Ugb2YgZGlyZWN0aW9uYWxpdHkuXG4gKi9cbnZhciBQb3NpdGlvbiA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhQb3NpdGlvbiwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUG9zaXRpb24ocHJvcHMsIGNvbnRleHQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9zaXRpb24pO1xuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKFBvc2l0aW9uLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoUG9zaXRpb24pKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICBfdGhpcy5nZXRUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gX3RoaXMucHJvcHMudGFyZ2V0O1xuXG4gICAgICB2YXIgdGFyZ2V0RWxlbWVudCA9IHR5cGVvZiB0YXJnZXQgPT09ICdmdW5jdGlvbicgPyB0YXJnZXQoKSA6IHRhcmdldDtcbiAgICAgIHJldHVybiB0YXJnZXRFbGVtZW50ICYmIF9yZWFjdERvbTIuZGVmYXVsdC5maW5kRE9NTm9kZSh0YXJnZXRFbGVtZW50KSB8fCBudWxsO1xuICAgIH07XG5cbiAgICBfdGhpcy5tYXliZVVwZGF0ZVBvc2l0aW9uID0gZnVuY3Rpb24gKHBsYWNlbWVudENoYW5nZWQpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBfdGhpcy5nZXRUYXJnZXQoKTtcblxuICAgICAgaWYgKCFfdGhpcy5wcm9wcy5zaG91bGRVcGRhdGVQb3NpdGlvbiAmJiB0YXJnZXQgPT09IF90aGlzLl9sYXN0VGFyZ2V0ICYmICFwbGFjZW1lbnRDaGFuZ2VkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMudXBkYXRlUG9zaXRpb24odGFyZ2V0KTtcbiAgICB9O1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBwb3NpdGlvbkxlZnQ6IDAsXG4gICAgICBwb3NpdGlvblRvcDogMCxcbiAgICAgIGFycm93T2Zmc2V0TGVmdDogbnVsbCxcbiAgICAgIGFycm93T2Zmc2V0VG9wOiBudWxsXG4gICAgfTtcblxuICAgIF90aGlzLl9uZWVkc0ZsdXNoID0gZmFsc2U7XG4gICAgX3RoaXMuX2xhc3RUYXJnZXQgPSBudWxsO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQb3NpdGlvbiwgW3tcbiAgICBrZXk6ICdjb21wb25lbnREaWRNb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbih0aGlzLmdldFRhcmdldCgpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpIHtcbiAgICAgIHRoaXMuX25lZWRzRmx1c2ggPSB0cnVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudERpZFVwZGF0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgIGlmICh0aGlzLl9uZWVkc0ZsdXNoKSB7XG4gICAgICAgIHRoaXMuX25lZWRzRmx1c2ggPSBmYWxzZTtcbiAgICAgICAgdGhpcy5tYXliZVVwZGF0ZVBvc2l0aW9uKHRoaXMucHJvcHMucGxhY2VtZW50ICE9PSBwcmV2UHJvcHMucGxhY2VtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZW5kZXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcztcbiAgICAgIHZhciBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lO1xuXG4gICAgICB2YXIgcHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3Byb3BzLCBbJ2NoaWxkcmVuJywgJ2NsYXNzTmFtZSddKTtcblxuICAgICAgdmFyIF9zdGF0ZSA9IHRoaXMuc3RhdGU7XG4gICAgICB2YXIgcG9zaXRpb25MZWZ0ID0gX3N0YXRlLnBvc2l0aW9uTGVmdDtcbiAgICAgIHZhciBwb3NpdGlvblRvcCA9IF9zdGF0ZS5wb3NpdGlvblRvcDtcblxuICAgICAgdmFyIGFycm93UG9zaXRpb24gPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3N0YXRlLCBbJ3Bvc2l0aW9uTGVmdCcsICdwb3NpdGlvblRvcCddKTtcblxuICAgICAgLy8gVGhlc2Ugc2hvdWxkIG5vdCBiZSBmb3J3YXJkZWQgdG8gdGhlIGNoaWxkLlxuXG5cbiAgICAgIGRlbGV0ZSBwcm9wcy50YXJnZXQ7XG4gICAgICBkZWxldGUgcHJvcHMuY29udGFpbmVyO1xuICAgICAgZGVsZXRlIHByb3BzLmNvbnRhaW5lclBhZGRpbmc7XG4gICAgICBkZWxldGUgcHJvcHMuc2hvdWxkVXBkYXRlUG9zaXRpb247XG5cbiAgICAgIHZhciBjaGlsZCA9IF9yZWFjdDIuZGVmYXVsdC5DaGlsZHJlbi5vbmx5KGNoaWxkcmVuKTtcbiAgICAgIHJldHVybiAoMCwgX3JlYWN0LmNsb25lRWxlbWVudCkoY2hpbGQsIF9leHRlbmRzKHt9LCBwcm9wcywgYXJyb3dQb3NpdGlvbiwge1xuICAgICAgICAvLyBGSVhNRTogRG9uJ3QgZm9yd2FyZCBgcG9zaXRpb25MZWZ0YCBhbmQgYHBvc2l0aW9uVG9wYCB2aWEgYm90aCBwcm9wc1xuICAgICAgICAvLyBhbmQgYHByb3BzLnN0eWxlYC5cbiAgICAgICAgcG9zaXRpb25MZWZ0OiBwb3NpdGlvbkxlZnQsXG4gICAgICAgIHBvc2l0aW9uVG9wOiBwb3NpdGlvblRvcCxcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyLmRlZmF1bHQpKGNsYXNzTmFtZSwgY2hpbGQucHJvcHMuY2xhc3NOYW1lKSxcbiAgICAgICAgc3R5bGU6IF9leHRlbmRzKHt9LCBjaGlsZC5wcm9wcy5zdHlsZSwge1xuICAgICAgICAgIGxlZnQ6IHBvc2l0aW9uTGVmdCxcbiAgICAgICAgICB0b3A6IHBvc2l0aW9uVG9wXG4gICAgICAgIH0pXG4gICAgICB9KSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAndXBkYXRlUG9zaXRpb24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVQb3NpdGlvbih0YXJnZXQpIHtcbiAgICAgIHRoaXMuX2xhc3RUYXJnZXQgPSB0YXJnZXQ7XG5cbiAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIHBvc2l0aW9uTGVmdDogMCxcbiAgICAgICAgICBwb3NpdGlvblRvcDogMCxcbiAgICAgICAgICBhcnJvd09mZnNldExlZnQ6IG51bGwsXG4gICAgICAgICAgYXJyb3dPZmZzZXRUb3A6IG51bGxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgb3ZlcmxheSA9IF9yZWFjdERvbTIuZGVmYXVsdC5maW5kRE9NTm9kZSh0aGlzKTtcbiAgICAgIHZhciBjb250YWluZXIgPSAoMCwgX2dldENvbnRhaW5lcjIuZGVmYXVsdCkodGhpcy5wcm9wcy5jb250YWluZXIsICgwLCBfb3duZXJEb2N1bWVudDIuZGVmYXVsdCkodGhpcykuYm9keSk7XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoKDAsIF9jYWxjdWxhdGVQb3NpdGlvbjIuZGVmYXVsdCkodGhpcy5wcm9wcy5wbGFjZW1lbnQsIG92ZXJsYXksIHRhcmdldCwgY29udGFpbmVyLCB0aGlzLnByb3BzLmNvbnRhaW5lclBhZGRpbmcpKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUG9zaXRpb247XG59KF9yZWFjdDIuZGVmYXVsdC5Db21wb25lbnQpO1xuXG5Qb3NpdGlvbi5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBBIG5vZGUsIGVsZW1lbnQsIG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBlaXRoZXIuIFRoZSBjaGlsZCB3aWxsIGJlXG4gICAqIGJlIHBvc2l0aW9uZWQgbmV4dCB0byB0aGUgYHRhcmdldGAgc3BlY2lmaWVkLlxuICAgKi9cbiAgdGFyZ2V0OiBfcHJvcFR5cGVzMi5kZWZhdWx0Lm9uZU9mVHlwZShbX2NvbXBvbmVudE9yRWxlbWVudDIuZGVmYXVsdCwgX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jXSksXG5cbiAgLyoqXG4gICAqIFwib2Zmc2V0UGFyZW50XCIgb2YgdGhlIGNvbXBvbmVudFxuICAgKi9cbiAgY29udGFpbmVyOiBfcHJvcFR5cGVzMi5kZWZhdWx0Lm9uZU9mVHlwZShbX2NvbXBvbmVudE9yRWxlbWVudDIuZGVmYXVsdCwgX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jXSksXG4gIC8qKlxuICAgKiBNaW5pbXVtIHNwYWNpbmcgaW4gcGl4ZWxzIGJldHdlZW4gY29udGFpbmVyIGJvcmRlciBhbmQgY29tcG9uZW50IGJvcmRlclxuICAgKi9cbiAgY29udGFpbmVyUGFkZGluZzogX3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIsXG4gIC8qKlxuICAgKiBIb3cgdG8gcG9zaXRpb24gdGhlIGNvbXBvbmVudCByZWxhdGl2ZSB0byB0aGUgdGFyZ2V0XG4gICAqL1xuICBwbGFjZW1lbnQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQub25lT2YoWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXSksXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBwb3NpdGlvbiBzaG91bGQgYmUgY2hhbmdlZCBvbiBlYWNoIHVwZGF0ZVxuICAgKi9cbiAgc2hvdWxkVXBkYXRlUG9zaXRpb246IF9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbFxufTtcblxuUG9zaXRpb24uZGlzcGxheU5hbWUgPSAnUG9zaXRpb24nO1xuXG5Qb3NpdGlvbi5kZWZhdWx0UHJvcHMgPSB7XG4gIGNvbnRhaW5lclBhZGRpbmc6IDAsXG4gIHBsYWNlbWVudDogJ3JpZ2h0JyxcbiAgc2hvdWxkVXBkYXRlUG9zaXRpb246IGZhbHNlXG59O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBQb3NpdGlvbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9jb250YWlucyA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL3F1ZXJ5L2NvbnRhaW5zJyk7XG5cbnZhciBfY29udGFpbnMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29udGFpbnMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX3JlYWN0RG9tID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5cbnZhciBfcmVhY3REb20yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3REb20pO1xuXG52YXIgX2FkZEV2ZW50TGlzdGVuZXIgPSByZXF1aXJlKCcuL3V0aWxzL2FkZEV2ZW50TGlzdGVuZXInKTtcblxudmFyIF9hZGRFdmVudExpc3RlbmVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FkZEV2ZW50TGlzdGVuZXIpO1xuXG52YXIgX293bmVyRG9jdW1lbnQgPSByZXF1aXJlKCcuL3V0aWxzL293bmVyRG9jdW1lbnQnKTtcblxudmFyIF9vd25lckRvY3VtZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX293bmVyRG9jdW1lbnQpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBlc2NhcGVLZXlDb2RlID0gMjc7XG5cbmZ1bmN0aW9uIGlzTGVmdENsaWNrRXZlbnQoZXZlbnQpIHtcbiAgcmV0dXJuIGV2ZW50LmJ1dHRvbiA9PT0gMDtcbn1cblxuZnVuY3Rpb24gaXNNb2RpZmllZEV2ZW50KGV2ZW50KSB7XG4gIHJldHVybiAhIShldmVudC5tZXRhS2V5IHx8IGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50LnNoaWZ0S2V5KTtcbn1cblxuLyoqXG4gKiBUaGUgYDxSb290Q2xvc2VXcmFwcGVyLz5gIGNvbXBvbmVudCByZWdpc3RlcnMgeW91ciBjYWxsYmFjayBvbiB0aGUgZG9jdW1lbnRcbiAqIHdoZW4gcmVuZGVyZWQuIFBvd2VycyB0aGUgYDxPdmVybGF5Lz5gIGNvbXBvbmVudC4gVGhpcyBpcyB1c2VkIGFjaGlldmUgbW9kYWxcbiAqIHN0eWxlIGJlaGF2aW9yIHdoZXJlIHlvdXIgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgdHJpZXMgdG9cbiAqIGludGVyYWN0IHdpdGggdGhlIHJlc3Qgb2YgdGhlIGRvY3VtZW50IG9yIGhpdHMgdGhlIGBlc2NgIGtleS5cbiAqL1xuXG52YXIgUm9vdENsb3NlV3JhcHBlciA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhSb290Q2xvc2VXcmFwcGVyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBSb290Q2xvc2VXcmFwcGVyKHByb3BzLCBjb250ZXh0KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFJvb3RDbG9zZVdyYXBwZXIpO1xuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKFJvb3RDbG9zZVdyYXBwZXIuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihSb290Q2xvc2VXcmFwcGVyKSkuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgX3RoaXMuYWRkRXZlbnRMaXN0ZW5lcnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgZXZlbnQgPSBfdGhpcy5wcm9wcy5ldmVudDtcblxuICAgICAgdmFyIGRvYyA9ICgwLCBfb3duZXJEb2N1bWVudDIuZGVmYXVsdCkoX3RoaXMpO1xuXG4gICAgICAvLyBVc2UgY2FwdHVyZSBmb3IgdGhpcyBsaXN0ZW5lciBzbyBpdCBmaXJlcyBiZWZvcmUgUmVhY3QncyBsaXN0ZW5lciwgdG9cbiAgICAgIC8vIGF2b2lkIGZhbHNlIHBvc2l0aXZlcyBpbiB0aGUgY29udGFpbnMoKSBjaGVjayBiZWxvdyBpZiB0aGUgdGFyZ2V0IERPTVxuICAgICAgLy8gZWxlbWVudCBpcyByZW1vdmVkIGluIHRoZSBSZWFjdCBtb3VzZSBjYWxsYmFjay5cbiAgICAgIF90aGlzLmRvY3VtZW50TW91c2VDYXB0dXJlTGlzdGVuZXIgPSAoMCwgX2FkZEV2ZW50TGlzdGVuZXIyLmRlZmF1bHQpKGRvYywgZXZlbnQsIF90aGlzLmhhbmRsZU1vdXNlQ2FwdHVyZSwgdHJ1ZSk7XG5cbiAgICAgIF90aGlzLmRvY3VtZW50TW91c2VMaXN0ZW5lciA9ICgwLCBfYWRkRXZlbnRMaXN0ZW5lcjIuZGVmYXVsdCkoZG9jLCBldmVudCwgX3RoaXMuaGFuZGxlTW91c2UpO1xuXG4gICAgICBfdGhpcy5kb2N1bWVudEtleXVwTGlzdGVuZXIgPSAoMCwgX2FkZEV2ZW50TGlzdGVuZXIyLmRlZmF1bHQpKGRvYywgJ2tleXVwJywgX3RoaXMuaGFuZGxlS2V5VXApO1xuICAgIH07XG5cbiAgICBfdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChfdGhpcy5kb2N1bWVudE1vdXNlQ2FwdHVyZUxpc3RlbmVyKSB7XG4gICAgICAgIF90aGlzLmRvY3VtZW50TW91c2VDYXB0dXJlTGlzdGVuZXIucmVtb3ZlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy5kb2N1bWVudE1vdXNlTGlzdGVuZXIpIHtcbiAgICAgICAgX3RoaXMuZG9jdW1lbnRNb3VzZUxpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMuZG9jdW1lbnRLZXl1cExpc3RlbmVyKSB7XG4gICAgICAgIF90aGlzLmRvY3VtZW50S2V5dXBMaXN0ZW5lci5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlTW91c2VDYXB0dXJlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIF90aGlzLnByZXZlbnRNb3VzZVJvb3RDbG9zZSA9IGlzTW9kaWZpZWRFdmVudChlKSB8fCAhaXNMZWZ0Q2xpY2tFdmVudChlKSB8fCAoMCwgX2NvbnRhaW5zMi5kZWZhdWx0KShfcmVhY3REb20yLmRlZmF1bHQuZmluZERPTU5vZGUoX3RoaXMpLCBlLnRhcmdldCk7XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZU1vdXNlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICghX3RoaXMucHJldmVudE1vdXNlUm9vdENsb3NlICYmIF90aGlzLnByb3BzLm9uUm9vdENsb3NlKSB7XG4gICAgICAgIF90aGlzLnByb3BzLm9uUm9vdENsb3NlKGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVLZXlVcCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBpZiAoZS5rZXlDb2RlID09PSBlc2NhcGVLZXlDb2RlICYmIF90aGlzLnByb3BzLm9uUm9vdENsb3NlKSB7XG4gICAgICAgIF90aGlzLnByb3BzLm9uUm9vdENsb3NlKGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5wcmV2ZW50TW91c2VSb290Q2xvc2UgPSBmYWxzZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoUm9vdENsb3NlV3JhcHBlciwgW3tcbiAgICBrZXk6ICdjb21wb25lbnREaWRNb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgaWYgKCF0aGlzLnByb3BzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb21wb25lbnREaWRVcGRhdGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgICBpZiAoIXRoaXMucHJvcHMuZGlzYWJsZWQgJiYgcHJldlByb3BzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy5kaXNhYmxlZCAmJiAhcHJldlByb3BzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb21wb25lbnRXaWxsVW5tb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgaWYgKCF0aGlzLnByb3BzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZW5kZXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUm9vdENsb3NlV3JhcHBlcjtcbn0oX3JlYWN0Mi5kZWZhdWx0LkNvbXBvbmVudCk7XG5cblJvb3RDbG9zZVdyYXBwZXIuZGlzcGxheU5hbWUgPSAnUm9vdENsb3NlV3JhcHBlcic7XG5cblJvb3RDbG9zZVdyYXBwZXIucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgY2xpY2sgb3IgbW91c2Vkb3duLiBBbHNvIHRyaWdnZXJzIHdoZW4gdXNlciBoaXRzIGBlc2NgLlxuICAgKi9cbiAgb25Sb290Q2xvc2U6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcbiAgLyoqXG4gICAqIENoaWxkcmVuIHRvIHJlbmRlci5cbiAgICovXG4gIGNoaWxkcmVuOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmVsZW1lbnQsXG4gIC8qKlxuICAgKiBEaXNhYmxlIHRoZSB0aGUgUm9vdENsb3NlV3JhcHBlciwgcHJldmVudGluZyBpdCBmcm9tIHRyaWdnZXJpbmcgYG9uUm9vdENsb3NlYC5cbiAgICovXG4gIGRpc2FibGVkOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2wsXG4gIC8qKlxuICAgKiBDaG9vc2Ugd2hpY2ggZG9jdW1lbnQgbW91c2UgZXZlbnQgdG8gYmluZCB0by5cbiAgICovXG4gIGV2ZW50OiBfcHJvcFR5cGVzMi5kZWZhdWx0Lm9uZU9mKFsnY2xpY2snLCAnbW91c2Vkb3duJ10pXG59O1xuXG5Sb290Q2xvc2VXcmFwcGVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgZXZlbnQ6ICdjbGljaydcbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFJvb3RDbG9zZVdyYXBwZXI7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLkVYSVRJTkcgPSBleHBvcnRzLkVOVEVSRUQgPSBleHBvcnRzLkVOVEVSSU5HID0gZXhwb3J0cy5FWElURUQgPSBleHBvcnRzLlVOTU9VTlRFRCA9IHVuZGVmaW5lZDtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfb24gPSByZXF1aXJlKCdkb20taGVscGVycy9ldmVudHMvb24nKTtcblxudmFyIF9vbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vbik7XG5cbnZhciBfcHJvcGVydGllcyA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL3RyYW5zaXRpb24vcHJvcGVydGllcycpO1xuXG52YXIgX3Byb3BlcnRpZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcGVydGllcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfcmVhY3REb20gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcblxudmFyIF9yZWFjdERvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdERvbSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvYmosIGtleXMpIHsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBpIGluIG9iaikgeyBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTsgdGFyZ2V0W2ldID0gb2JqW2ldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgdHJhbnNpdGlvbkVuZEV2ZW50ID0gX3Byb3BlcnRpZXMyLmRlZmF1bHQuZW5kO1xuXG52YXIgVU5NT1VOVEVEID0gZXhwb3J0cy5VTk1PVU5URUQgPSAwO1xudmFyIEVYSVRFRCA9IGV4cG9ydHMuRVhJVEVEID0gMTtcbnZhciBFTlRFUklORyA9IGV4cG9ydHMuRU5URVJJTkcgPSAyO1xudmFyIEVOVEVSRUQgPSBleHBvcnRzLkVOVEVSRUQgPSAzO1xudmFyIEVYSVRJTkcgPSBleHBvcnRzLkVYSVRJTkcgPSA0O1xuXG4vKipcbiAqIFRoZSBUcmFuc2l0aW9uIGNvbXBvbmVudCBsZXRzIHlvdSBkZWZpbmUgYW5kIHJ1biBjc3MgdHJhbnNpdGlvbnMgd2l0aCBhIHNpbXBsZSBkZWNsYXJhdGl2ZSBhcGkuXG4gKiBJdCB3b3JrcyBzaW1pbGFyIHRvIFJlYWN0J3Mgb3duIFtDU1NUcmFuc2l0aW9uR3JvdXBdKGh0dHA6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy9hbmltYXRpb24uaHRtbCNoaWdoLWxldmVsLWFwaS1yZWFjdGNzc3RyYW5zaXRpb25ncm91cClcbiAqIGJ1dCBpcyBzcGVjaWZpY2FsbHkgb3B0aW1pemVkIGZvciB0cmFuc2l0aW9uaW5nIGEgc2luZ2xlIGNoaWxkIFwiaW5cIiBvciBcIm91dFwiLlxuICpcbiAqIFlvdSBkb24ndCBldmVuIG5lZWQgdG8gdXNlIGNsYXNzIGJhc2VkIGNzcyB0cmFuc2l0aW9ucyBpZiB5b3UgZG9uJ3Qgd2FudCB0byAoYnV0IGl0IGlzIGVhc2llc3QpLlxuICogVGhlIGV4dGVuc2l2ZSBzZXQgb2YgbGlmZWN5Y2xlIGNhbGxiYWNrcyBtZWFucyB5b3UgaGF2ZSBjb250cm9sIG92ZXJcbiAqIHRoZSB0cmFuc2l0aW9uaW5nIG5vdyBhdCBlYWNoIHN0ZXAgb2YgdGhlIHdheS5cbiAqL1xuXG52YXIgVHJhbnNpdGlvbiA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gIF9pbmhlcml0cyhUcmFuc2l0aW9uLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBUcmFuc2l0aW9uKHByb3BzLCBjb250ZXh0KSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFRyYW5zaXRpb24pO1xuXG4gICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKFRyYW5zaXRpb24uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihUcmFuc2l0aW9uKSkuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgX3RoaXMudXBkYXRlU3RhdHVzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLm5leHRTdGF0dXMgIT09IG51bGwpIHtcbiAgICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBuZXh0U3RhdHVzIHdpbGwgYWx3YXlzIGJlIEVOVEVSSU5HIG9yIEVYSVRJTkcuXG4gICAgICAgICAgX3RoaXMuY2FuY2VsTmV4dENhbGxiYWNrKCk7XG4gICAgICAgICAgdmFyIG5vZGUgPSBfcmVhY3REb20yLmRlZmF1bHQuZmluZERPTU5vZGUoX3RoaXMpO1xuXG4gICAgICAgICAgaWYgKF90aGlzLm5leHRTdGF0dXMgPT09IEVOVEVSSU5HKSB7XG4gICAgICAgICAgICBfdGhpcy5wcm9wcy5vbkVudGVyKG5vZGUpO1xuXG4gICAgICAgICAgICBfdGhpcy5zYWZlU2V0U3RhdGUoeyBzdGF0dXM6IEVOVEVSSU5HIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgX3RoaXMucHJvcHMub25FbnRlcmluZyhub2RlKTtcblxuICAgICAgICAgICAgICBfdGhpcy5vblRyYW5zaXRpb25FbmQobm9kZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIF90aGlzLnNhZmVTZXRTdGF0ZSh7IHN0YXR1czogRU5URVJFRCB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICBfdGhpcy5wcm9wcy5vbkVudGVyZWQobm9kZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzLnByb3BzLm9uRXhpdChub2RlKTtcblxuICAgICAgICAgICAgX3RoaXMuc2FmZVNldFN0YXRlKHsgc3RhdHVzOiBFWElUSU5HIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgX3RoaXMucHJvcHMub25FeGl0aW5nKG5vZGUpO1xuXG4gICAgICAgICAgICAgIF90aGlzLm9uVHJhbnNpdGlvbkVuZChub2RlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuc2FmZVNldFN0YXRlKHsgc3RhdHVzOiBFWElURUQgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgX3RoaXMucHJvcHMub25FeGl0ZWQobm9kZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXMubmV4dFN0YXR1cyA9IG51bGw7XG4gICAgICAgIH0pKCk7XG4gICAgICB9IGVsc2UgaWYgKF90aGlzLnByb3BzLnVubW91bnRPbkV4aXQgJiYgX3RoaXMuc3RhdGUuc3RhdHVzID09PSBFWElURUQpIHtcbiAgICAgICAgX3RoaXMuc2V0U3RhdGUoeyBzdGF0dXM6IFVOTU9VTlRFRCB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuY2FuY2VsTmV4dENhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLm5leHRDYWxsYmFjayAhPT0gbnVsbCkge1xuICAgICAgICBfdGhpcy5uZXh0Q2FsbGJhY2suY2FuY2VsKCk7XG4gICAgICAgIF90aGlzLm5leHRDYWxsYmFjayA9IG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnNhZmVTZXRTdGF0ZSA9IGZ1bmN0aW9uIChuZXh0U3RhdGUsIGNhbGxiYWNrKSB7XG4gICAgICAvLyBUaGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnksIGJ1dCB0aGVyZSBhcmUgd2VpcmQgcmFjZSBjb25kaXRpb25zIHdpdGhcbiAgICAgIC8vIHNldFN0YXRlIGNhbGxiYWNrcyBhbmQgdW5tb3VudGluZyBpbiB0ZXN0aW5nLCBzbyBhbHdheXMgbWFrZSBzdXJlIHRoYXRcbiAgICAgIC8vIHdlIGNhbiBjYW5jZWwgYW55IHBlbmRpbmcgc2V0U3RhdGUgY2FsbGJhY2tzIGFmdGVyIHdlIHVubW91bnQuXG4gICAgICBfdGhpcy5zZXRTdGF0ZShuZXh0U3RhdGUsIF90aGlzLnNldE5leHRDYWxsYmFjayhjYWxsYmFjaykpO1xuICAgIH07XG5cbiAgICBfdGhpcy5zZXROZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIHZhciBhY3RpdmUgPSB0cnVlO1xuXG4gICAgICBfdGhpcy5uZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgIF90aGlzLm5leHRDYWxsYmFjayA9IG51bGw7XG5cbiAgICAgICAgICBjYWxsYmFjayhldmVudCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIF90aGlzLm5leHRDYWxsYmFjay5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIF90aGlzLm5leHRDYWxsYmFjaztcbiAgICB9O1xuXG4gICAgX3RoaXMub25UcmFuc2l0aW9uRW5kID0gZnVuY3Rpb24gKG5vZGUsIGhhbmRsZXIpIHtcbiAgICAgIF90aGlzLnNldE5leHRDYWxsYmFjayhoYW5kbGVyKTtcblxuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgKDAsIF9vbjIuZGVmYXVsdCkobm9kZSwgdHJhbnNpdGlvbkVuZEV2ZW50LCBfdGhpcy5uZXh0Q2FsbGJhY2spO1xuICAgICAgICBzZXRUaW1lb3V0KF90aGlzLm5leHRDYWxsYmFjaywgX3RoaXMucHJvcHMudGltZW91dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRUaW1lb3V0KF90aGlzLm5leHRDYWxsYmFjaywgMCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBpbml0aWFsU3RhdHVzID0gdm9pZCAwO1xuICAgIF90aGlzLm5leHRTdGF0dXMgPSBudWxsO1xuXG4gICAgaWYgKHByb3BzLmluKSB7XG4gICAgICBpZiAocHJvcHMudHJhbnNpdGlvbkFwcGVhcikge1xuICAgICAgICBpbml0aWFsU3RhdHVzID0gRVhJVEVEO1xuICAgICAgICBfdGhpcy5uZXh0U3RhdHVzID0gRU5URVJJTkc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbml0aWFsU3RhdHVzID0gRU5URVJFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHByb3BzLnVubW91bnRPbkV4aXQgfHwgcHJvcHMubW91bnRPbkVudGVyKSB7XG4gICAgICAgIGluaXRpYWxTdGF0dXMgPSBVTk1PVU5URUQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbml0aWFsU3RhdHVzID0gRVhJVEVEO1xuICAgICAgfVxuICAgIH1cblxuICAgIF90aGlzLnN0YXRlID0geyBzdGF0dXM6IGluaXRpYWxTdGF0dXMgfTtcblxuICAgIF90aGlzLm5leHRDYWxsYmFjayA9IG51bGw7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFRyYW5zaXRpb24sIFt7XG4gICAga2V5OiAnY29tcG9uZW50RGlkTW91bnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMudXBkYXRlU3RhdHVzKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICB2YXIgc3RhdHVzID0gdGhpcy5zdGF0ZS5zdGF0dXM7XG5cblxuICAgICAgaWYgKG5leHRQcm9wcy5pbikge1xuICAgICAgICBpZiAoc3RhdHVzID09PSBVTk1PVU5URUQpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgc3RhdHVzOiBFWElURUQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gRU5URVJJTkcgJiYgc3RhdHVzICE9PSBFTlRFUkVEKSB7XG4gICAgICAgICAgdGhpcy5uZXh0U3RhdHVzID0gRU5URVJJTkc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT09IEVOVEVSSU5HIHx8IHN0YXR1cyA9PT0gRU5URVJFRCkge1xuICAgICAgICAgIHRoaXMubmV4dFN0YXR1cyA9IEVYSVRJTkc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb21wb25lbnREaWRVcGRhdGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1cygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudFdpbGxVbm1vdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLmNhbmNlbE5leHRDYWxsYmFjaygpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlbmRlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBzdGF0dXMgPSB0aGlzLnN0YXRlLnN0YXR1cztcbiAgICAgIGlmIChzdGF0dXMgPT09IFVOTU9VTlRFRCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHM7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW47XG4gICAgICB2YXIgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZTtcblxuICAgICAgdmFyIGNoaWxkUHJvcHMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3Byb3BzLCBbJ2NoaWxkcmVuJywgJ2NsYXNzTmFtZSddKTtcblxuICAgICAgT2JqZWN0LmtleXMoVHJhbnNpdGlvbi5wcm9wVHlwZXMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICByZXR1cm4gZGVsZXRlIGNoaWxkUHJvcHNba2V5XTtcbiAgICAgIH0pO1xuXG4gICAgICB2YXIgdHJhbnNpdGlvbkNsYXNzTmFtZSA9IHZvaWQgMDtcbiAgICAgIGlmIChzdGF0dXMgPT09IEVYSVRFRCkge1xuICAgICAgICB0cmFuc2l0aW9uQ2xhc3NOYW1lID0gdGhpcy5wcm9wcy5leGl0ZWRDbGFzc05hbWU7XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gRU5URVJJTkcpIHtcbiAgICAgICAgdHJhbnNpdGlvbkNsYXNzTmFtZSA9IHRoaXMucHJvcHMuZW50ZXJpbmdDbGFzc05hbWU7XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gRU5URVJFRCkge1xuICAgICAgICB0cmFuc2l0aW9uQ2xhc3NOYW1lID0gdGhpcy5wcm9wcy5lbnRlcmVkQ2xhc3NOYW1lO1xuICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT09IEVYSVRJTkcpIHtcbiAgICAgICAgdHJhbnNpdGlvbkNsYXNzTmFtZSA9IHRoaXMucHJvcHMuZXhpdGluZ0NsYXNzTmFtZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGNoaWxkID0gX3JlYWN0Mi5kZWZhdWx0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pO1xuICAgICAgcmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jbG9uZUVsZW1lbnQoY2hpbGQsIF9leHRlbmRzKHt9LCBjaGlsZFByb3BzLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMi5kZWZhdWx0KShjaGlsZC5wcm9wcy5jbGFzc05hbWUsIGNsYXNzTmFtZSwgdHJhbnNpdGlvbkNsYXNzTmFtZSlcbiAgICAgIH0pKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gVHJhbnNpdGlvbjtcbn0oX3JlYWN0Mi5kZWZhdWx0LkNvbXBvbmVudCk7XG5cblRyYW5zaXRpb24ucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogU2hvdyB0aGUgY29tcG9uZW50OyB0cmlnZ2VycyB0aGUgZW50ZXIgb3IgZXhpdCBhbmltYXRpb25cbiAgICovXG4gIGluOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2wsXG5cbiAgLyoqXG4gICAqIFdhaXQgdW50aWwgdGhlIGZpcnN0IFwiZW50ZXJcIiB0cmFuc2l0aW9uIHRvIG1vdW50IHRoZSBjb21wb25lbnQgKGFkZCBpdCB0byB0aGUgRE9NKVxuICAgKi9cbiAgbW91bnRPbkVudGVyOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2wsXG5cbiAgLyoqXG4gICAqIFVubW91bnQgdGhlIGNvbXBvbmVudCAocmVtb3ZlIGl0IGZyb20gdGhlIERPTSkgd2hlbiBpdCBpcyBub3Qgc2hvd25cbiAgICovXG4gIHVubW91bnRPbkV4aXQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbCxcblxuICAvKipcbiAgICogUnVuIHRoZSBlbnRlciBhbmltYXRpb24gd2hlbiB0aGUgY29tcG9uZW50IG1vdW50cywgaWYgaXQgaXMgaW5pdGlhbGx5XG4gICAqIHNob3duXG4gICAqL1xuICB0cmFuc2l0aW9uQXBwZWFyOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2wsXG5cbiAgLyoqXG4gICAqIEEgVGltZW91dCBmb3IgdGhlIGFuaW1hdGlvbiwgaW4gbWlsbGlzZWNvbmRzLCB0byBlbnN1cmUgdGhhdCBhIG5vZGUgZG9lc24ndFxuICAgKiB0cmFuc2l0aW9uIGluZGVmaW5hdGVseSBpZiB0aGUgYnJvd3NlciB0cmFuc2l0aW9uRW5kIGV2ZW50cyBhcmVcbiAgICogY2FuY2VsZWQgb3IgaW50ZXJydXB0ZWQuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQgdGhpcyBpcyBzZXQgdG8gYSBoaWdoIG51bWJlciAoNSBzZWNvbmRzKSBhcyBhIGZhaWxzYWZlLiBZb3Ugc2hvdWxkIGNvbnNpZGVyXG4gICAqIHNldHRpbmcgdGhpcyB0byB0aGUgZHVyYXRpb24gb2YgeW91ciBhbmltYXRpb24gKG9yIGEgYml0IGFib3ZlIGl0KS5cbiAgICovXG4gIHRpbWVvdXQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBDU1MgY2xhc3Mgb3IgY2xhc3NlcyBhcHBsaWVkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBleGl0ZWRcbiAgICovXG4gIGV4aXRlZENsYXNzTmFtZTogX3Byb3BUeXBlczIuZGVmYXVsdC5zdHJpbmcsXG4gIC8qKlxuICAgKiBDU1MgY2xhc3Mgb3IgY2xhc3NlcyBhcHBsaWVkIHdoaWxlIHRoZSBjb21wb25lbnQgaXMgZXhpdGluZ1xuICAgKi9cbiAgZXhpdGluZ0NsYXNzTmFtZTogX3Byb3BUeXBlczIuZGVmYXVsdC5zdHJpbmcsXG4gIC8qKlxuICAgKiBDU1MgY2xhc3Mgb3IgY2xhc3NlcyBhcHBsaWVkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBlbnRlcmVkXG4gICAqL1xuICBlbnRlcmVkQ2xhc3NOYW1lOiBfcHJvcFR5cGVzMi5kZWZhdWx0LnN0cmluZyxcbiAgLyoqXG4gICAqIENTUyBjbGFzcyBvciBjbGFzc2VzIGFwcGxpZWQgd2hpbGUgdGhlIGNvbXBvbmVudCBpcyBlbnRlcmluZ1xuICAgKi9cbiAgZW50ZXJpbmdDbGFzc05hbWU6IF9wcm9wVHlwZXMyLmRlZmF1bHQuc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBiZWZvcmUgdGhlIFwiZW50ZXJpbmdcIiBjbGFzc2VzIGFyZSBhcHBsaWVkXG4gICAqL1xuICBvbkVudGVyOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgXCJlbnRlcmluZ1wiIGNsYXNzZXMgYXJlIGFwcGxpZWRcbiAgICovXG4gIG9uRW50ZXJpbmc6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBcImVudGVyXCIgY2xhc3NlcyBhcmUgYXBwbGllZFxuICAgKi9cbiAgb25FbnRlcmVkOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBiZWZvcmUgdGhlIFwiZXhpdGluZ1wiIGNsYXNzZXMgYXJlIGFwcGxpZWRcbiAgICovXG4gIG9uRXhpdDogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIFwiZXhpdGluZ1wiIGNsYXNzZXMgYXJlIGFwcGxpZWRcbiAgICovXG4gIG9uRXhpdGluZzogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIFwiZXhpdGVkXCIgY2xhc3NlcyBhcmUgYXBwbGllZFxuICAgKi9cbiAgb25FeGl0ZWQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuY1xufTtcblxuLy8gTmFtZSB0aGUgZnVuY3Rpb24gc28gaXQgaXMgY2xlYXJlciBpbiB0aGUgZG9jdW1lbnRhdGlvblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cblRyYW5zaXRpb24uZGlzcGxheU5hbWUgPSAnVHJhbnNpdGlvbic7XG5cblRyYW5zaXRpb24uZGVmYXVsdFByb3BzID0ge1xuICBpbjogZmFsc2UsXG4gIHVubW91bnRPbkV4aXQ6IGZhbHNlLFxuICB0cmFuc2l0aW9uQXBwZWFyOiBmYWxzZSxcblxuICB0aW1lb3V0OiA1MDAwLFxuXG4gIG9uRW50ZXI6IG5vb3AsXG4gIG9uRW50ZXJpbmc6IG5vb3AsXG4gIG9uRW50ZXJlZDogbm9vcCxcblxuICBvbkV4aXQ6IG5vb3AsXG4gIG9uRXhpdGluZzogbm9vcCxcbiAgb25FeGl0ZWQ6IG5vb3Bcbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFRyYW5zaXRpb247IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAobm9kZSwgZXZlbnQsIGhhbmRsZXIsIGNhcHR1cmUpIHtcbiAgKDAsIF9vbjIuZGVmYXVsdCkobm9kZSwgZXZlbnQsIGhhbmRsZXIsIGNhcHR1cmUpO1xuXG4gIHJldHVybiB7XG4gICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICAoMCwgX29mZjIuZGVmYXVsdCkobm9kZSwgZXZlbnQsIGhhbmRsZXIsIGNhcHR1cmUpO1xuICAgIH1cbiAgfTtcbn07XG5cbnZhciBfb24gPSByZXF1aXJlKCdkb20taGVscGVycy9ldmVudHMvb24nKTtcblxudmFyIF9vbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vbik7XG5cbnZhciBfb2ZmID0gcmVxdWlyZSgnZG9tLWhlbHBlcnMvZXZlbnRzL29mZicpO1xuXG52YXIgX29mZjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vZmYpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBhZGRGb2N1c0xpc3RlbmVyO1xuLyoqXG4gKiBGaXJlZm94IGRvZXNuJ3QgaGF2ZSBhIGZvY3VzaW4gZXZlbnQgc28gdXNpbmcgY2FwdHVyZSBpcyBlYXNpZXN0IHdheSB0byBnZXQgYnViYmxpbmdcbiAqIElFOCBjYW4ndCBkbyBhZGRFdmVudExpc3RlbmVyLCBidXQgZG9lcyBoYXZlIG9uZm9jdXNpbiwgc28gd2UgdXNlIHRoYXQgaW4gaWU4XG4gKlxuICogV2Ugb25seSBhbGxvdyBvbmUgTGlzdGVuZXIgYXQgYSB0aW1lIHRvIGF2b2lkIHN0YWNrIG92ZXJmbG93c1xuICovXG5mdW5jdGlvbiBhZGRGb2N1c0xpc3RlbmVyKGhhbmRsZXIpIHtcbiAgdmFyIHVzZUZvY3VzaW4gPSAhZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcjtcbiAgdmFyIHJlbW92ZSA9IHZvaWQgMDtcblxuICBpZiAodXNlRm9jdXNpbikge1xuICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50KCdvbmZvY3VzaW4nLCBoYW5kbGVyKTtcbiAgICByZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQuZGV0YWNoRXZlbnQoJ29uZm9jdXNpbicsIGhhbmRsZXIpO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCBoYW5kbGVyLCB0cnVlKTtcbiAgICByZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLCBoYW5kbGVyLCB0cnVlKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsgcmVtb3ZlOiByZW1vdmUgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGNhbGN1bGF0ZVBvc2l0aW9uO1xuXG52YXIgX29mZnNldCA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL3F1ZXJ5L29mZnNldCcpO1xuXG52YXIgX29mZnNldDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vZmZzZXQpO1xuXG52YXIgX3Bvc2l0aW9uID0gcmVxdWlyZSgnZG9tLWhlbHBlcnMvcXVlcnkvcG9zaXRpb24nKTtcblxudmFyIF9wb3NpdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NpdGlvbik7XG5cbnZhciBfc2Nyb2xsVG9wID0gcmVxdWlyZSgnZG9tLWhlbHBlcnMvcXVlcnkvc2Nyb2xsVG9wJyk7XG5cbnZhciBfc2Nyb2xsVG9wMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Njcm9sbFRvcCk7XG5cbnZhciBfb3duZXJEb2N1bWVudCA9IHJlcXVpcmUoJy4vb3duZXJEb2N1bWVudCcpO1xuXG52YXIgX293bmVyRG9jdW1lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb3duZXJEb2N1bWVudCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIGdldENvbnRhaW5lckRpbWVuc2lvbnMoY29udGFpbmVyTm9kZSkge1xuICB2YXIgd2lkdGggPSB2b2lkIDAsXG4gICAgICBoZWlnaHQgPSB2b2lkIDAsXG4gICAgICBzY3JvbGwgPSB2b2lkIDA7XG5cbiAgaWYgKGNvbnRhaW5lck5vZGUudGFnTmFtZSA9PT0gJ0JPRFknKSB7XG4gICAgd2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICBoZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICBzY3JvbGwgPSAoMCwgX3Njcm9sbFRvcDIuZGVmYXVsdCkoKDAsIF9vd25lckRvY3VtZW50Mi5kZWZhdWx0KShjb250YWluZXJOb2RlKS5kb2N1bWVudEVsZW1lbnQpIHx8ICgwLCBfc2Nyb2xsVG9wMi5kZWZhdWx0KShjb250YWluZXJOb2RlKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgX2dldE9mZnNldCA9ICgwLCBfb2Zmc2V0Mi5kZWZhdWx0KShjb250YWluZXJOb2RlKTtcblxuICAgIHdpZHRoID0gX2dldE9mZnNldC53aWR0aDtcbiAgICBoZWlnaHQgPSBfZ2V0T2Zmc2V0LmhlaWdodDtcblxuICAgIHNjcm9sbCA9ICgwLCBfc2Nyb2xsVG9wMi5kZWZhdWx0KShjb250YWluZXJOb2RlKTtcbiAgfVxuXG4gIHJldHVybiB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQsIHNjcm9sbDogc2Nyb2xsIH07XG59XG5cbmZ1bmN0aW9uIGdldFRvcERlbHRhKHRvcCwgb3ZlcmxheUhlaWdodCwgY29udGFpbmVyLCBwYWRkaW5nKSB7XG4gIHZhciBjb250YWluZXJEaW1lbnNpb25zID0gZ2V0Q29udGFpbmVyRGltZW5zaW9ucyhjb250YWluZXIpO1xuICB2YXIgY29udGFpbmVyU2Nyb2xsID0gY29udGFpbmVyRGltZW5zaW9ucy5zY3JvbGw7XG4gIHZhciBjb250YWluZXJIZWlnaHQgPSBjb250YWluZXJEaW1lbnNpb25zLmhlaWdodDtcblxuICB2YXIgdG9wRWRnZU9mZnNldCA9IHRvcCAtIHBhZGRpbmcgLSBjb250YWluZXJTY3JvbGw7XG4gIHZhciBib3R0b21FZGdlT2Zmc2V0ID0gdG9wICsgcGFkZGluZyAtIGNvbnRhaW5lclNjcm9sbCArIG92ZXJsYXlIZWlnaHQ7XG5cbiAgaWYgKHRvcEVkZ2VPZmZzZXQgPCAwKSB7XG4gICAgcmV0dXJuIC10b3BFZGdlT2Zmc2V0O1xuICB9IGVsc2UgaWYgKGJvdHRvbUVkZ2VPZmZzZXQgPiBjb250YWluZXJIZWlnaHQpIHtcbiAgICByZXR1cm4gY29udGFpbmVySGVpZ2h0IC0gYm90dG9tRWRnZU9mZnNldDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRMZWZ0RGVsdGEobGVmdCwgb3ZlcmxheVdpZHRoLCBjb250YWluZXIsIHBhZGRpbmcpIHtcbiAgdmFyIGNvbnRhaW5lckRpbWVuc2lvbnMgPSBnZXRDb250YWluZXJEaW1lbnNpb25zKGNvbnRhaW5lcik7XG4gIHZhciBjb250YWluZXJXaWR0aCA9IGNvbnRhaW5lckRpbWVuc2lvbnMud2lkdGg7XG5cbiAgdmFyIGxlZnRFZGdlT2Zmc2V0ID0gbGVmdCAtIHBhZGRpbmc7XG4gIHZhciByaWdodEVkZ2VPZmZzZXQgPSBsZWZ0ICsgcGFkZGluZyArIG92ZXJsYXlXaWR0aDtcblxuICBpZiAobGVmdEVkZ2VPZmZzZXQgPCAwKSB7XG4gICAgcmV0dXJuIC1sZWZ0RWRnZU9mZnNldDtcbiAgfSBlbHNlIGlmIChyaWdodEVkZ2VPZmZzZXQgPiBjb250YWluZXJXaWR0aCkge1xuICAgIHJldHVybiBjb250YWluZXJXaWR0aCAtIHJpZ2h0RWRnZU9mZnNldDtcbiAgfVxuXG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBjYWxjdWxhdGVQb3NpdGlvbihwbGFjZW1lbnQsIG92ZXJsYXlOb2RlLCB0YXJnZXQsIGNvbnRhaW5lciwgcGFkZGluZykge1xuICB2YXIgY2hpbGRPZmZzZXQgPSBjb250YWluZXIudGFnTmFtZSA9PT0gJ0JPRFknID8gKDAsIF9vZmZzZXQyLmRlZmF1bHQpKHRhcmdldCkgOiAoMCwgX3Bvc2l0aW9uMi5kZWZhdWx0KSh0YXJnZXQsIGNvbnRhaW5lcik7XG5cbiAgdmFyIF9nZXRPZmZzZXQyID0gKDAsIF9vZmZzZXQyLmRlZmF1bHQpKG92ZXJsYXlOb2RlKTtcblxuICB2YXIgb3ZlcmxheUhlaWdodCA9IF9nZXRPZmZzZXQyLmhlaWdodDtcbiAgdmFyIG92ZXJsYXlXaWR0aCA9IF9nZXRPZmZzZXQyLndpZHRoO1xuXG5cbiAgdmFyIHBvc2l0aW9uTGVmdCA9IHZvaWQgMCxcbiAgICAgIHBvc2l0aW9uVG9wID0gdm9pZCAwLFxuICAgICAgYXJyb3dPZmZzZXRMZWZ0ID0gdm9pZCAwLFxuICAgICAgYXJyb3dPZmZzZXRUb3AgPSB2b2lkIDA7XG5cbiAgaWYgKHBsYWNlbWVudCA9PT0gJ2xlZnQnIHx8IHBsYWNlbWVudCA9PT0gJ3JpZ2h0Jykge1xuICAgIHBvc2l0aW9uVG9wID0gY2hpbGRPZmZzZXQudG9wICsgKGNoaWxkT2Zmc2V0LmhlaWdodCAtIG92ZXJsYXlIZWlnaHQpIC8gMjtcblxuICAgIGlmIChwbGFjZW1lbnQgPT09ICdsZWZ0Jykge1xuICAgICAgcG9zaXRpb25MZWZ0ID0gY2hpbGRPZmZzZXQubGVmdCAtIG92ZXJsYXlXaWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9zaXRpb25MZWZ0ID0gY2hpbGRPZmZzZXQubGVmdCArIGNoaWxkT2Zmc2V0LndpZHRoO1xuICAgIH1cblxuICAgIHZhciB0b3BEZWx0YSA9IGdldFRvcERlbHRhKHBvc2l0aW9uVG9wLCBvdmVybGF5SGVpZ2h0LCBjb250YWluZXIsIHBhZGRpbmcpO1xuXG4gICAgcG9zaXRpb25Ub3AgKz0gdG9wRGVsdGE7XG4gICAgYXJyb3dPZmZzZXRUb3AgPSA1MCAqICgxIC0gMiAqIHRvcERlbHRhIC8gb3ZlcmxheUhlaWdodCkgKyAnJSc7XG4gICAgYXJyb3dPZmZzZXRMZWZ0ID0gdm9pZCAwO1xuICB9IGVsc2UgaWYgKHBsYWNlbWVudCA9PT0gJ3RvcCcgfHwgcGxhY2VtZW50ID09PSAnYm90dG9tJykge1xuICAgIHBvc2l0aW9uTGVmdCA9IGNoaWxkT2Zmc2V0LmxlZnQgKyAoY2hpbGRPZmZzZXQud2lkdGggLSBvdmVybGF5V2lkdGgpIC8gMjtcblxuICAgIGlmIChwbGFjZW1lbnQgPT09ICd0b3AnKSB7XG4gICAgICBwb3NpdGlvblRvcCA9IGNoaWxkT2Zmc2V0LnRvcCAtIG92ZXJsYXlIZWlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvc2l0aW9uVG9wID0gY2hpbGRPZmZzZXQudG9wICsgY2hpbGRPZmZzZXQuaGVpZ2h0O1xuICAgIH1cblxuICAgIHZhciBsZWZ0RGVsdGEgPSBnZXRMZWZ0RGVsdGEocG9zaXRpb25MZWZ0LCBvdmVybGF5V2lkdGgsIGNvbnRhaW5lciwgcGFkZGluZyk7XG5cbiAgICBwb3NpdGlvbkxlZnQgKz0gbGVmdERlbHRhO1xuICAgIGFycm93T2Zmc2V0TGVmdCA9IDUwICogKDEgLSAyICogbGVmdERlbHRhIC8gb3ZlcmxheVdpZHRoKSArICclJztcbiAgICBhcnJvd09mZnNldFRvcCA9IHZvaWQgMDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGNPdmVybGF5UG9zaXRpb24oKTogTm8gc3VjaCBwbGFjZW1lbnQgb2YgXCInICsgcGxhY2VtZW50ICsgJ1wiIGZvdW5kLicpO1xuICB9XG5cbiAgcmV0dXJuIHsgcG9zaXRpb25MZWZ0OiBwb3NpdGlvbkxlZnQsIHBvc2l0aW9uVG9wOiBwb3NpdGlvblRvcCwgYXJyb3dPZmZzZXRMZWZ0OiBhcnJvd09mZnNldExlZnQsIGFycm93T2Zmc2V0VG9wOiBhcnJvd09mZnNldFRvcCB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZ2V0Q29udGFpbmVyO1xuXG52YXIgX3JlYWN0RG9tID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5cbnZhciBfcmVhY3REb20yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3REb20pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBnZXRDb250YWluZXIoY29udGFpbmVyLCBkZWZhdWx0Q29udGFpbmVyKSB7XG4gIGNvbnRhaW5lciA9IHR5cGVvZiBjb250YWluZXIgPT09ICdmdW5jdGlvbicgPyBjb250YWluZXIoKSA6IGNvbnRhaW5lcjtcbiAgcmV0dXJuIF9yZWFjdERvbTIuZGVmYXVsdC5maW5kRE9NTm9kZShjb250YWluZXIpIHx8IGRlZmF1bHRDb250YWluZXI7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBpc092ZXJmbG93aW5nO1xuXG52YXIgX2lzV2luZG93ID0gcmVxdWlyZSgnZG9tLWhlbHBlcnMvcXVlcnkvaXNXaW5kb3cnKTtcblxudmFyIF9pc1dpbmRvdzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pc1dpbmRvdyk7XG5cbnZhciBfb3duZXJEb2N1bWVudCA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL293bmVyRG9jdW1lbnQnKTtcblxudmFyIF9vd25lckRvY3VtZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX293bmVyRG9jdW1lbnQpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBpc0JvZHkobm9kZSkge1xuICByZXR1cm4gbm9kZSAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2JvZHknO1xufVxuXG5mdW5jdGlvbiBib2R5SXNPdmVyZmxvd2luZyhub2RlKSB7XG4gIHZhciBkb2MgPSAoMCwgX293bmVyRG9jdW1lbnQyLmRlZmF1bHQpKG5vZGUpO1xuICB2YXIgd2luID0gKDAsIF9pc1dpbmRvdzIuZGVmYXVsdCkoZG9jKTtcbiAgdmFyIGZ1bGxXaWR0aCA9IHdpbi5pbm5lcldpZHRoO1xuXG4gIC8vIFN1cHBvcnQ6IGllOCwgbm8gaW5uZXJXaWR0aFxuICBpZiAoIWZ1bGxXaWR0aCkge1xuICAgIHZhciBkb2N1bWVudEVsZW1lbnRSZWN0ID0gZG9jLmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBmdWxsV2lkdGggPSBkb2N1bWVudEVsZW1lbnRSZWN0LnJpZ2h0IC0gTWF0aC5hYnMoZG9jdW1lbnRFbGVtZW50UmVjdC5sZWZ0KTtcbiAgfVxuXG4gIHJldHVybiBkb2MuYm9keS5jbGllbnRXaWR0aCA8IGZ1bGxXaWR0aDtcbn1cblxuZnVuY3Rpb24gaXNPdmVyZmxvd2luZyhjb250YWluZXIpIHtcbiAgdmFyIHdpbiA9ICgwLCBfaXNXaW5kb3cyLmRlZmF1bHQpKGNvbnRhaW5lcik7XG5cbiAgcmV0dXJuIHdpbiB8fCBpc0JvZHkoY29udGFpbmVyKSA/IGJvZHlJc092ZXJmbG93aW5nKGNvbnRhaW5lcikgOiBjb250YWluZXIuc2Nyb2xsSGVpZ2h0ID4gY29udGFpbmVyLmNsaWVudEhlaWdodDtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuYXJpYUhpZGRlbiA9IGFyaWFIaWRkZW47XG5leHBvcnRzLmhpZGVTaWJsaW5ncyA9IGhpZGVTaWJsaW5ncztcbmV4cG9ydHMuc2hvd1NpYmxpbmdzID0gc2hvd1NpYmxpbmdzO1xuXG52YXIgQkxBQ0tMSVNUID0gWyd0ZW1wbGF0ZScsICdzY3JpcHQnLCAnc3R5bGUnXTtcblxudmFyIGlzSGlkYWJsZSA9IGZ1bmN0aW9uIGlzSGlkYWJsZShfcmVmKSB7XG4gIHZhciBub2RlVHlwZSA9IF9yZWYubm9kZVR5cGU7XG4gIHZhciB0YWdOYW1lID0gX3JlZi50YWdOYW1lO1xuICByZXR1cm4gbm9kZVR5cGUgPT09IDEgJiYgQkxBQ0tMSVNULmluZGV4T2YodGFnTmFtZS50b0xvd2VyQ2FzZSgpKSA9PT0gLTE7XG59O1xuXG52YXIgc2libGluZ3MgPSBmdW5jdGlvbiBzaWJsaW5ncyhjb250YWluZXIsIG1vdW50LCBjYikge1xuICBtb3VudCA9IFtdLmNvbmNhdChtb3VudCk7XG5cbiAgW10uZm9yRWFjaC5jYWxsKGNvbnRhaW5lci5jaGlsZHJlbiwgZnVuY3Rpb24gKG5vZGUpIHtcbiAgICBpZiAobW91bnQuaW5kZXhPZihub2RlKSA9PT0gLTEgJiYgaXNIaWRhYmxlKG5vZGUpKSB7XG4gICAgICBjYihub2RlKTtcbiAgICB9XG4gIH0pO1xufTtcblxuZnVuY3Rpb24gYXJpYUhpZGRlbihzaG93LCBub2RlKSB7XG4gIGlmICghbm9kZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoc2hvdykge1xuICAgIG5vZGUuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gIH0gZWxzZSB7XG4gICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGlkZVNpYmxpbmdzKGNvbnRhaW5lciwgbW91bnROb2RlKSB7XG4gIHNpYmxpbmdzKGNvbnRhaW5lciwgbW91bnROb2RlLCBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBhcmlhSGlkZGVuKHRydWUsIG5vZGUpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gc2hvd1NpYmxpbmdzKGNvbnRhaW5lciwgbW91bnROb2RlKSB7XG4gIHNpYmxpbmdzKGNvbnRhaW5lciwgbW91bnROb2RlLCBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBhcmlhSGlkZGVuKGZhbHNlLCBub2RlKTtcbiAgfSk7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoY29tcG9uZW50T3JFbGVtZW50KSB7XG4gIHJldHVybiAoMCwgX293bmVyRG9jdW1lbnQyLmRlZmF1bHQpKF9yZWFjdERvbTIuZGVmYXVsdC5maW5kRE9NTm9kZShjb21wb25lbnRPckVsZW1lbnQpKTtcbn07XG5cbnZhciBfcmVhY3REb20gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcblxudmFyIF9yZWFjdERvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdERvbSk7XG5cbnZhciBfb3duZXJEb2N1bWVudCA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL293bmVyRG9jdW1lbnQnKTtcblxudmFyIF9vd25lckRvY3VtZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX293bmVyRG9jdW1lbnQpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHQgPSBhbGw7XG5cbnZhciBfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIgPSByZXF1aXJlKCcuL3V0aWxzL2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBhbGwoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCB2YWxpZGF0b3JzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgdmFsaWRhdG9yc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFsbFByb3BUeXBlcygpIHtcbiAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgYXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgIH1cblxuICAgIHZhciBlcnJvciA9IG51bGw7XG5cbiAgICB2YWxpZGF0b3JzLmZvckVhY2goZnVuY3Rpb24gKHZhbGlkYXRvcikge1xuICAgICAgaWYgKGVycm9yICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgcmVzdWx0ID0gdmFsaWRhdG9yLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IgPSByZXN1bHQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cblxuICByZXR1cm4gKDAsIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcjIuZGVmYXVsdCkoYWxsUHJvcFR5cGVzKTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIgPSByZXF1aXJlKCcuL3V0aWxzL2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgdmFyIHByb3BUeXBlID0gdHlwZW9mIHByb3BWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YocHJvcFZhbHVlKTtcblxuICBpZiAoX3JlYWN0Mi5kZWZhdWx0LmlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlIFJlYWN0RWxlbWVudCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBSZWFjdENvbXBvbmVudCBvciBhICcpICsgJ0RPTUVsZW1lbnQuIFlvdSBjYW4gdXN1YWxseSBvYnRhaW4gYSBSZWFjdENvbXBvbmVudCBvciBET01FbGVtZW50ICcgKyAnZnJvbSBhIFJlYWN0RWxlbWVudCBieSBhdHRhY2hpbmcgYSByZWYgdG8gaXQuJyk7XG4gIH1cblxuICBpZiAoKHByb3BUeXBlICE9PSAnb2JqZWN0JyB8fCB0eXBlb2YgcHJvcFZhbHVlLnJlbmRlciAhPT0gJ2Z1bmN0aW9uJykgJiYgcHJvcFZhbHVlLm5vZGVUeXBlICE9PSAxKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdmFsdWUgYCcgKyBwcm9wVmFsdWUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBSZWFjdENvbXBvbmVudCBvciBhICcpICsgJ0RPTUVsZW1lbnQuJyk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gKDAsIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcjIuZGVmYXVsdCkodmFsaWRhdGUpOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlciA9IHJlcXVpcmUoJy4vdXRpbHMvY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXInKTtcblxudmFyIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIGVsZW1lbnRUeXBlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICB2YXIgcHJvcFR5cGUgPSB0eXBlb2YgcHJvcFZhbHVlID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihwcm9wVmFsdWUpO1xuXG4gIGlmIChfcmVhY3QyLmRlZmF1bHQuaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgUmVhY3RFbGVtZW50ICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBlbGVtZW50IHR5cGUgKGEgc3RyaW5nICcpICsgJ29yIGEgUmVhY3RDbGFzcykuJyk7XG4gIH1cblxuICBpZiAocHJvcFR5cGUgIT09ICdmdW5jdGlvbicgJiYgcHJvcFR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdmFsdWUgYCcgKyBwcm9wVmFsdWUgKyAnYCAnICsgKCdzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYW4gZWxlbWVudCB0eXBlIChhIHN0cmluZyAnKSArICdvciBhIFJlYWN0Q2xhc3MpLicpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9ICgwLCBfY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIyLmRlZmF1bHQpKGVsZW1lbnRUeXBlKTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHQgPSBpc1JlcXVpcmVkRm9yQTExeTtcbmZ1bmN0aW9uIGlzUmVxdWlyZWRGb3JBMTF5KHZhbGlkYXRvcikge1xuICByZXR1cm4gZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgdmFyIGNvbXBvbmVudE5hbWVTYWZlID0gY29tcG9uZW50TmFtZSB8fCAnPDxhbm9ueW1vdXM+Pic7XG4gICAgdmFyIHByb3BGdWxsTmFtZVNhZmUgPSBwcm9wRnVsbE5hbWUgfHwgcHJvcE5hbWU7XG5cbiAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoJ1RoZSAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lU2FmZSArICdgIGlzIHJlcXVpcmVkIHRvIG1ha2UgJyArICgnYCcgKyBjb21wb25lbnROYW1lU2FmZSArICdgIGFjY2Vzc2libGUgZm9yIHVzZXJzIG9mIGFzc2lzdGl2ZSAnKSArICd0ZWNobm9sb2dpZXMgc3VjaCBhcyBzY3JlZW4gcmVhZGVycy4nKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiA1ID8gX2xlbiAtIDUgOiAwKSwgX2tleSA9IDU7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleSAtIDVdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0b3IuYXBwbHkodW5kZWZpbmVkLCBbcHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lXS5jb25jYXQoYXJncykpO1xuICB9O1xufSIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuZGVmYXVsdCA9IGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyO1xuLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuLy8gTW9zdGx5IHRha2VuIGZyb20gUmVhY3RQcm9wVHlwZXMuXG5cbmZ1bmN0aW9uIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKSB7XG4gIGZ1bmN0aW9uIGNoZWNrVHlwZShpc1JlcXVpcmVkLCBwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZVNhZmUgPSBjb21wb25lbnROYW1lIHx8ICc8PGFub255bW91cz4+JztcbiAgICB2YXIgcHJvcEZ1bGxOYW1lU2FmZSA9IHByb3BGdWxsTmFtZSB8fCBwcm9wTmFtZTtcblxuICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT0gbnVsbCkge1xuICAgICAgaWYgKGlzUmVxdWlyZWQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignUmVxdWlyZWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZVNhZmUgKyAnYCB3YXMgbm90IHNwZWNpZmllZCAnICsgKCdpbiBgJyArIGNvbXBvbmVudE5hbWVTYWZlICsgJ2AuJykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiA2ID8gX2xlbiAtIDYgOiAwKSwgX2tleSA9IDY7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleSAtIDZdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0ZS5hcHBseSh1bmRlZmluZWQsIFtwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWVTYWZlLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lU2FmZV0uY29uY2F0KGFyZ3MpKTtcbiAgfVxuXG4gIHZhciBjaGFpbmVkQ2hlY2tUeXBlID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgZmFsc2UpO1xuICBjaGFpbmVkQ2hlY2tUeXBlLmlzUmVxdWlyZWQgPSBjaGVja1R5cGUuYmluZChudWxsLCB0cnVlKTtcblxuICByZXR1cm4gY2hhaW5lZENoZWNrVHlwZTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmNyZWF0ZVByb3ZpZGVyID0gY3JlYXRlUHJvdmlkZXI7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9Qcm9wVHlwZXMgPSByZXF1aXJlKCcuLi91dGlscy9Qcm9wVHlwZXMnKTtcblxudmFyIF93YXJuaW5nID0gcmVxdWlyZSgnLi4vdXRpbHMvd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIGRpZFdhcm5BYm91dFJlY2VpdmluZ1N0b3JlID0gZmFsc2U7XG5mdW5jdGlvbiB3YXJuQWJvdXRSZWNlaXZpbmdTdG9yZSgpIHtcbiAgaWYgKGRpZFdhcm5BYm91dFJlY2VpdmluZ1N0b3JlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGRpZFdhcm5BYm91dFJlY2VpdmluZ1N0b3JlID0gdHJ1ZTtcblxuICAoMCwgX3dhcm5pbmcyLmRlZmF1bHQpKCc8UHJvdmlkZXI+IGRvZXMgbm90IHN1cHBvcnQgY2hhbmdpbmcgYHN0b3JlYCBvbiB0aGUgZmx5LiAnICsgJ0l0IGlzIG1vc3QgbGlrZWx5IHRoYXQgeW91IHNlZSB0aGlzIGVycm9yIGJlY2F1c2UgeW91IHVwZGF0ZWQgdG8gJyArICdSZWR1eCAyLnggYW5kIFJlYWN0IFJlZHV4IDIueCB3aGljaCBubyBsb25nZXIgaG90IHJlbG9hZCByZWR1Y2VycyAnICsgJ2F1dG9tYXRpY2FsbHkuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVhY3Rqcy9yZWFjdC1yZWR1eC9yZWxlYXNlcy8nICsgJ3RhZy92Mi4wLjAgZm9yIHRoZSBtaWdyYXRpb24gaW5zdHJ1Y3Rpb25zLicpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVQcm92aWRlcigpIHtcbiAgdmFyIF9Qcm92aWRlciRjaGlsZENvbnRleDtcblxuICB2YXIgc3RvcmVLZXkgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdzdG9yZSc7XG4gIHZhciBzdWJLZXkgPSBhcmd1bWVudHNbMV07XG5cbiAgdmFyIHN1YnNjcmlwdGlvbktleSA9IHN1YktleSB8fCBzdG9yZUtleSArICdTdWJzY3JpcHRpb24nO1xuXG4gIHZhciBQcm92aWRlciA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gICAgX2luaGVyaXRzKFByb3ZpZGVyLCBfQ29tcG9uZW50KTtcblxuICAgIFByb3ZpZGVyLnByb3RvdHlwZS5nZXRDaGlsZENvbnRleHQgPSBmdW5jdGlvbiBnZXRDaGlsZENvbnRleHQoKSB7XG4gICAgICB2YXIgX3JlZjtcblxuICAgICAgcmV0dXJuIF9yZWYgPSB7fSwgX3JlZltzdG9yZUtleV0gPSB0aGlzW3N0b3JlS2V5XSwgX3JlZltzdWJzY3JpcHRpb25LZXldID0gbnVsbCwgX3JlZjtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gUHJvdmlkZXIocHJvcHMsIGNvbnRleHQpIHtcbiAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQcm92aWRlcik7XG5cbiAgICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgICBfdGhpc1tzdG9yZUtleV0gPSBwcm9wcy5zdG9yZTtcbiAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG5cbiAgICBQcm92aWRlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgcmV0dXJuIF9yZWFjdC5DaGlsZHJlbi5vbmx5KHRoaXMucHJvcHMuY2hpbGRyZW4pO1xuICAgIH07XG5cbiAgICByZXR1cm4gUHJvdmlkZXI7XG4gIH0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgUHJvdmlkZXIucHJvdG90eXBlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBmdW5jdGlvbiAobmV4dFByb3BzKSB7XG4gICAgICBpZiAodGhpc1tzdG9yZUtleV0gIT09IG5leHRQcm9wcy5zdG9yZSkge1xuICAgICAgICB3YXJuQWJvdXRSZWNlaXZpbmdTdG9yZSgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBQcm92aWRlci5wcm9wVHlwZXMgPSB7XG4gICAgc3RvcmU6IF9Qcm9wVHlwZXMuc3RvcmVTaGFwZS5pc1JlcXVpcmVkLFxuICAgIGNoaWxkcmVuOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmVsZW1lbnQuaXNSZXF1aXJlZFxuICB9O1xuICBQcm92aWRlci5jaGlsZENvbnRleHRUeXBlcyA9IChfUHJvdmlkZXIkY2hpbGRDb250ZXggPSB7fSwgX1Byb3ZpZGVyJGNoaWxkQ29udGV4W3N0b3JlS2V5XSA9IF9Qcm9wVHlwZXMuc3RvcmVTaGFwZS5pc1JlcXVpcmVkLCBfUHJvdmlkZXIkY2hpbGRDb250ZXhbc3Vic2NyaXB0aW9uS2V5XSA9IF9Qcm9wVHlwZXMuc3Vic2NyaXB0aW9uU2hhcGUsIF9Qcm92aWRlciRjaGlsZENvbnRleCk7XG4gIFByb3ZpZGVyLmRpc3BsYXlOYW1lID0gJ1Byb3ZpZGVyJztcblxuICByZXR1cm4gUHJvdmlkZXI7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGNyZWF0ZVByb3ZpZGVyKCk7IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBjb25uZWN0QWR2YW5jZWQ7XG5cbnZhciBfaG9pc3ROb25SZWFjdFN0YXRpY3MgPSByZXF1aXJlKCdob2lzdC1ub24tcmVhY3Qtc3RhdGljcycpO1xuXG52YXIgX2hvaXN0Tm9uUmVhY3RTdGF0aWNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hvaXN0Tm9uUmVhY3RTdGF0aWNzKTtcblxudmFyIF9pbnZhcmlhbnQgPSByZXF1aXJlKCdpbnZhcmlhbnQnKTtcblxudmFyIF9pbnZhcmlhbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW52YXJpYW50KTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfU3Vic2NyaXB0aW9uID0gcmVxdWlyZSgnLi4vdXRpbHMvU3Vic2NyaXB0aW9uJyk7XG5cbnZhciBfU3Vic2NyaXB0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1N1YnNjcmlwdGlvbik7XG5cbnZhciBfUHJvcFR5cGVzID0gcmVxdWlyZSgnLi4vdXRpbHMvUHJvcFR5cGVzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG52YXIgaG90UmVsb2FkaW5nVmVyc2lvbiA9IDA7XG52YXIgZHVtbXlTdGF0ZSA9IHt9O1xuZnVuY3Rpb24gbm9vcCgpIHt9XG5mdW5jdGlvbiBtYWtlU2VsZWN0b3JTdGF0ZWZ1bChzb3VyY2VTZWxlY3Rvciwgc3RvcmUpIHtcbiAgLy8gd3JhcCB0aGUgc2VsZWN0b3IgaW4gYW4gb2JqZWN0IHRoYXQgdHJhY2tzIGl0cyByZXN1bHRzIGJldHdlZW4gcnVucy5cbiAgdmFyIHNlbGVjdG9yID0ge1xuICAgIHJ1bjogZnVuY3Rpb24gcnVuQ29tcG9uZW50U2VsZWN0b3IocHJvcHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBuZXh0UHJvcHMgPSBzb3VyY2VTZWxlY3RvcihzdG9yZS5nZXRTdGF0ZSgpLCBwcm9wcyk7XG4gICAgICAgIGlmIChuZXh0UHJvcHMgIT09IHNlbGVjdG9yLnByb3BzIHx8IHNlbGVjdG9yLmVycm9yKSB7XG4gICAgICAgICAgc2VsZWN0b3Iuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICBzZWxlY3Rvci5wcm9wcyA9IG5leHRQcm9wcztcbiAgICAgICAgICBzZWxlY3Rvci5lcnJvciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNlbGVjdG9yLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IHRydWU7XG4gICAgICAgIHNlbGVjdG9yLmVycm9yID0gZXJyb3I7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBzZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gY29ubmVjdEFkdmFuY2VkKFxuLypcbiAgc2VsZWN0b3JGYWN0b3J5IGlzIGEgZnVuYyB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciByZXR1cm5pbmcgdGhlIHNlbGVjdG9yIGZ1bmN0aW9uIHVzZWQgdG9cbiAgY29tcHV0ZSBuZXcgcHJvcHMgZnJvbSBzdGF0ZSwgcHJvcHMsIGFuZCBkaXNwYXRjaC4gRm9yIGV4YW1wbGU6XG4gICAgIGV4cG9ydCBkZWZhdWx0IGNvbm5lY3RBZHZhbmNlZCgoZGlzcGF0Y2gsIG9wdGlvbnMpID0+IChzdGF0ZSwgcHJvcHMpID0+ICh7XG4gICAgICB0aGluZzogc3RhdGUudGhpbmdzW3Byb3BzLnRoaW5nSWRdLFxuICAgICAgc2F2ZVRoaW5nOiBmaWVsZHMgPT4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvcnMuc2F2ZVRoaW5nKHByb3BzLnRoaW5nSWQsIGZpZWxkcykpLFxuICAgIH0pKShZb3VyQ29tcG9uZW50KVxuICAgQWNjZXNzIHRvIGRpc3BhdGNoIGlzIHByb3ZpZGVkIHRvIHRoZSBmYWN0b3J5IHNvIHNlbGVjdG9yRmFjdG9yaWVzIGNhbiBiaW5kIGFjdGlvbkNyZWF0b3JzXG4gIG91dHNpZGUgb2YgdGhlaXIgc2VsZWN0b3IgYXMgYW4gb3B0aW1pemF0aW9uLiBPcHRpb25zIHBhc3NlZCB0byBjb25uZWN0QWR2YW5jZWQgYXJlIHBhc3NlZCB0b1xuICB0aGUgc2VsZWN0b3JGYWN0b3J5LCBhbG9uZyB3aXRoIGRpc3BsYXlOYW1lIGFuZCBXcmFwcGVkQ29tcG9uZW50LCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LlxuICAgTm90ZSB0aGF0IHNlbGVjdG9yRmFjdG9yeSBpcyByZXNwb25zaWJsZSBmb3IgYWxsIGNhY2hpbmcvbWVtb2l6YXRpb24gb2YgaW5ib3VuZCBhbmQgb3V0Ym91bmRcbiAgcHJvcHMuIERvIG5vdCB1c2UgY29ubmVjdEFkdmFuY2VkIGRpcmVjdGx5IHdpdGhvdXQgbWVtb2l6aW5nIHJlc3VsdHMgYmV0d2VlbiBjYWxscyB0byB5b3VyXG4gIHNlbGVjdG9yLCBvdGhlcndpc2UgdGhlIENvbm5lY3QgY29tcG9uZW50IHdpbGwgcmUtcmVuZGVyIG9uIGV2ZXJ5IHN0YXRlIG9yIHByb3BzIGNoYW5nZS5cbiovXG5zZWxlY3RvckZhY3RvcnkpIHtcbiAgdmFyIF9jb250ZXh0VHlwZXMsIF9jaGlsZENvbnRleHRUeXBlcztcblxuICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge30sXG4gICAgICBfcmVmJGdldERpc3BsYXlOYW1lID0gX3JlZi5nZXREaXNwbGF5TmFtZSxcbiAgICAgIGdldERpc3BsYXlOYW1lID0gX3JlZiRnZXREaXNwbGF5TmFtZSA9PT0gdW5kZWZpbmVkID8gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICByZXR1cm4gJ0Nvbm5lY3RBZHZhbmNlZCgnICsgbmFtZSArICcpJztcbiAgfSA6IF9yZWYkZ2V0RGlzcGxheU5hbWUsXG4gICAgICBfcmVmJG1ldGhvZE5hbWUgPSBfcmVmLm1ldGhvZE5hbWUsXG4gICAgICBtZXRob2ROYW1lID0gX3JlZiRtZXRob2ROYW1lID09PSB1bmRlZmluZWQgPyAnY29ubmVjdEFkdmFuY2VkJyA6IF9yZWYkbWV0aG9kTmFtZSxcbiAgICAgIF9yZWYkcmVuZGVyQ291bnRQcm9wID0gX3JlZi5yZW5kZXJDb3VudFByb3AsXG4gICAgICByZW5kZXJDb3VudFByb3AgPSBfcmVmJHJlbmRlckNvdW50UHJvcCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogX3JlZiRyZW5kZXJDb3VudFByb3AsXG4gICAgICBfcmVmJHNob3VsZEhhbmRsZVN0YXQgPSBfcmVmLnNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyxcbiAgICAgIHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyA9IF9yZWYkc2hvdWxkSGFuZGxlU3RhdCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IF9yZWYkc2hvdWxkSGFuZGxlU3RhdCxcbiAgICAgIF9yZWYkc3RvcmVLZXkgPSBfcmVmLnN0b3JlS2V5LFxuICAgICAgc3RvcmVLZXkgPSBfcmVmJHN0b3JlS2V5ID09PSB1bmRlZmluZWQgPyAnc3RvcmUnIDogX3JlZiRzdG9yZUtleSxcbiAgICAgIF9yZWYkd2l0aFJlZiA9IF9yZWYud2l0aFJlZixcbiAgICAgIHdpdGhSZWYgPSBfcmVmJHdpdGhSZWYgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogX3JlZiR3aXRoUmVmLFxuICAgICAgY29ubmVjdE9wdGlvbnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgWydnZXREaXNwbGF5TmFtZScsICdtZXRob2ROYW1lJywgJ3JlbmRlckNvdW50UHJvcCcsICdzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMnLCAnc3RvcmVLZXknLCAnd2l0aFJlZiddKTtcblxuICB2YXIgc3Vic2NyaXB0aW9uS2V5ID0gc3RvcmVLZXkgKyAnU3Vic2NyaXB0aW9uJztcbiAgdmFyIHZlcnNpb24gPSBob3RSZWxvYWRpbmdWZXJzaW9uKys7XG5cbiAgdmFyIGNvbnRleHRUeXBlcyA9IChfY29udGV4dFR5cGVzID0ge30sIF9jb250ZXh0VHlwZXNbc3RvcmVLZXldID0gX1Byb3BUeXBlcy5zdG9yZVNoYXBlLCBfY29udGV4dFR5cGVzW3N1YnNjcmlwdGlvbktleV0gPSBfUHJvcFR5cGVzLnN1YnNjcmlwdGlvblNoYXBlLCBfY29udGV4dFR5cGVzKTtcbiAgdmFyIGNoaWxkQ29udGV4dFR5cGVzID0gKF9jaGlsZENvbnRleHRUeXBlcyA9IHt9LCBfY2hpbGRDb250ZXh0VHlwZXNbc3Vic2NyaXB0aW9uS2V5XSA9IF9Qcm9wVHlwZXMuc3Vic2NyaXB0aW9uU2hhcGUsIF9jaGlsZENvbnRleHRUeXBlcyk7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXBXaXRoQ29ubmVjdChXcmFwcGVkQ29tcG9uZW50KSB7XG4gICAgKDAsIF9pbnZhcmlhbnQyLmRlZmF1bHQpKHR5cGVvZiBXcmFwcGVkQ29tcG9uZW50ID09ICdmdW5jdGlvbicsICdZb3UgbXVzdCBwYXNzIGEgY29tcG9uZW50IHRvIHRoZSBmdW5jdGlvbiByZXR1cm5lZCBieSAnICsgKCdjb25uZWN0LiBJbnN0ZWFkIHJlY2VpdmVkICcgKyBKU09OLnN0cmluZ2lmeShXcmFwcGVkQ29tcG9uZW50KSkpO1xuXG4gICAgdmFyIHdyYXBwZWRDb21wb25lbnROYW1lID0gV3JhcHBlZENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBXcmFwcGVkQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCc7XG5cbiAgICB2YXIgZGlzcGxheU5hbWUgPSBnZXREaXNwbGF5TmFtZSh3cmFwcGVkQ29tcG9uZW50TmFtZSk7XG5cbiAgICB2YXIgc2VsZWN0b3JGYWN0b3J5T3B0aW9ucyA9IF9leHRlbmRzKHt9LCBjb25uZWN0T3B0aW9ucywge1xuICAgICAgZ2V0RGlzcGxheU5hbWU6IGdldERpc3BsYXlOYW1lLFxuICAgICAgbWV0aG9kTmFtZTogbWV0aG9kTmFtZSxcbiAgICAgIHJlbmRlckNvdW50UHJvcDogcmVuZGVyQ291bnRQcm9wLFxuICAgICAgc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzOiBzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMsXG4gICAgICBzdG9yZUtleTogc3RvcmVLZXksXG4gICAgICB3aXRoUmVmOiB3aXRoUmVmLFxuICAgICAgZGlzcGxheU5hbWU6IGRpc3BsYXlOYW1lLFxuICAgICAgd3JhcHBlZENvbXBvbmVudE5hbWU6IHdyYXBwZWRDb21wb25lbnROYW1lLFxuICAgICAgV3JhcHBlZENvbXBvbmVudDogV3JhcHBlZENvbXBvbmVudFxuICAgIH0pO1xuXG4gICAgdmFyIENvbm5lY3QgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICAgICAgX2luaGVyaXRzKENvbm5lY3QsIF9Db21wb25lbnQpO1xuXG4gICAgICBmdW5jdGlvbiBDb25uZWN0KHByb3BzLCBjb250ZXh0KSB7XG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBDb25uZWN0KTtcblxuICAgICAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBfQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgICAgICBfdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgX3RoaXMuc3RhdGUgPSB7fTtcbiAgICAgICAgX3RoaXMucmVuZGVyQ291bnQgPSAwO1xuICAgICAgICBfdGhpcy5zdG9yZSA9IHByb3BzW3N0b3JlS2V5XSB8fCBjb250ZXh0W3N0b3JlS2V5XTtcbiAgICAgICAgX3RoaXMucHJvcHNNb2RlID0gQm9vbGVhbihwcm9wc1tzdG9yZUtleV0pO1xuICAgICAgICBfdGhpcy5zZXRXcmFwcGVkSW5zdGFuY2UgPSBfdGhpcy5zZXRXcmFwcGVkSW5zdGFuY2UuYmluZChfdGhpcyk7XG5cbiAgICAgICAgKDAsIF9pbnZhcmlhbnQyLmRlZmF1bHQpKF90aGlzLnN0b3JlLCAnQ291bGQgbm90IGZpbmQgXCInICsgc3RvcmVLZXkgKyAnXCIgaW4gZWl0aGVyIHRoZSBjb250ZXh0IG9yIHByb3BzIG9mICcgKyAoJ1wiJyArIGRpc3BsYXlOYW1lICsgJ1wiLiBFaXRoZXIgd3JhcCB0aGUgcm9vdCBjb21wb25lbnQgaW4gYSA8UHJvdmlkZXI+LCAnKSArICgnb3IgZXhwbGljaXRseSBwYXNzIFwiJyArIHN0b3JlS2V5ICsgJ1wiIGFzIGEgcHJvcCB0byBcIicgKyBkaXNwbGF5TmFtZSArICdcIi4nKSk7XG5cbiAgICAgICAgX3RoaXMuaW5pdFNlbGVjdG9yKCk7XG4gICAgICAgIF90aGlzLmluaXRTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgICAgfVxuXG4gICAgICBDb25uZWN0LnByb3RvdHlwZS5nZXRDaGlsZENvbnRleHQgPSBmdW5jdGlvbiBnZXRDaGlsZENvbnRleHQoKSB7XG4gICAgICAgIHZhciBfcmVmMjtcblxuICAgICAgICAvLyBJZiB0aGlzIGNvbXBvbmVudCByZWNlaXZlZCBzdG9yZSBmcm9tIHByb3BzLCBpdHMgc3Vic2NyaXB0aW9uIHNob3VsZCBiZSB0cmFuc3BhcmVudFxuICAgICAgICAvLyB0byBhbnkgZGVzY2VuZGFudHMgcmVjZWl2aW5nIHN0b3JlK3N1YnNjcmlwdGlvbiBmcm9tIGNvbnRleHQ7IGl0IHBhc3NlcyBhbG9uZ1xuICAgICAgICAvLyBzdWJzY3JpcHRpb24gcGFzc2VkIHRvIGl0LiBPdGhlcndpc2UsIGl0IHNoYWRvd3MgdGhlIHBhcmVudCBzdWJzY3JpcHRpb24sIHdoaWNoIGFsbG93c1xuICAgICAgICAvLyBDb25uZWN0IHRvIGNvbnRyb2wgb3JkZXJpbmcgb2Ygbm90aWZpY2F0aW9ucyB0byBmbG93IHRvcC1kb3duLlxuICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5wcm9wc01vZGUgPyBudWxsIDogdGhpcy5zdWJzY3JpcHRpb247XG4gICAgICAgIHJldHVybiBfcmVmMiA9IHt9LCBfcmVmMltzdWJzY3JpcHRpb25LZXldID0gc3Vic2NyaXB0aW9uIHx8IHRoaXMuY29udGV4dFtzdWJzY3JpcHRpb25LZXldLCBfcmVmMjtcbiAgICAgIH07XG5cbiAgICAgIENvbm5lY3QucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIGlmICghc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzKSByZXR1cm47XG5cbiAgICAgICAgLy8gY29tcG9uZW50V2lsbE1vdW50IGZpcmVzIGR1cmluZyBzZXJ2ZXIgc2lkZSByZW5kZXJpbmcsIGJ1dCBjb21wb25lbnREaWRNb3VudCBhbmRcbiAgICAgICAgLy8gY29tcG9uZW50V2lsbFVubW91bnQgZG8gbm90LiBCZWNhdXNlIG9mIHRoaXMsIHRyeVN1YnNjcmliZSBoYXBwZW5zIGR1cmluZyAuLi5kaWRNb3VudC5cbiAgICAgICAgLy8gT3RoZXJ3aXNlLCB1bnN1YnNjcmlwdGlvbiB3b3VsZCBuZXZlciB0YWtlIHBsYWNlIGR1cmluZyBTU1IsIGNhdXNpbmcgYSBtZW1vcnkgbGVhay5cbiAgICAgICAgLy8gVG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGEgY2hpbGQgY29tcG9uZW50IG1heSBoYXZlIHRyaWdnZXJlZCBhIHN0YXRlIGNoYW5nZSBieVxuICAgICAgICAvLyBkaXNwYXRjaGluZyBhbiBhY3Rpb24gaW4gaXRzIGNvbXBvbmVudFdpbGxNb3VudCwgd2UgaGF2ZSB0byByZS1ydW4gdGhlIHNlbGVjdCBhbmQgbWF5YmVcbiAgICAgICAgLy8gcmUtcmVuZGVyLlxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbi50cnlTdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rvci5ydW4odGhpcy5wcm9wcyk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdG9yLnNob3VsZENvbXBvbmVudFVwZGF0ZSkgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgICAgfTtcblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0b3IucnVuKG5leHRQcm9wcyk7XG4gICAgICB9O1xuXG4gICAgICBDb25uZWN0LnByb3RvdHlwZS5zaG91bGRDb21wb25lbnRVcGRhdGUgPSBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlbGVjdG9yLnNob3VsZENvbXBvbmVudFVwZGF0ZTtcbiAgICAgIH07XG5cbiAgICAgIENvbm5lY3QucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikgdGhpcy5zdWJzY3JpcHRpb24udHJ5VW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLm5vdGlmeU5lc3RlZFN1YnMgPSBub29wO1xuICAgICAgICB0aGlzLnN0b3JlID0gbnVsbDtcbiAgICAgICAgdGhpcy5zZWxlY3Rvci5ydW4gPSBub29wO1xuICAgICAgICB0aGlzLnNlbGVjdG9yLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IGZhbHNlO1xuICAgICAgfTtcblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUuZ2V0V3JhcHBlZEluc3RhbmNlID0gZnVuY3Rpb24gZ2V0V3JhcHBlZEluc3RhbmNlKCkge1xuICAgICAgICAoMCwgX2ludmFyaWFudDIuZGVmYXVsdCkod2l0aFJlZiwgJ1RvIGFjY2VzcyB0aGUgd3JhcHBlZCBpbnN0YW5jZSwgeW91IG5lZWQgdG8gc3BlY2lmeSAnICsgKCd7IHdpdGhSZWY6IHRydWUgfSBpbiB0aGUgb3B0aW9ucyBhcmd1bWVudCBvZiB0aGUgJyArIG1ldGhvZE5hbWUgKyAnKCkgY2FsbC4nKSk7XG4gICAgICAgIHJldHVybiB0aGlzLndyYXBwZWRJbnN0YW5jZTtcbiAgICAgIH07XG5cbiAgICAgIENvbm5lY3QucHJvdG90eXBlLnNldFdyYXBwZWRJbnN0YW5jZSA9IGZ1bmN0aW9uIHNldFdyYXBwZWRJbnN0YW5jZShyZWYpIHtcbiAgICAgICAgdGhpcy53cmFwcGVkSW5zdGFuY2UgPSByZWY7XG4gICAgICB9O1xuXG4gICAgICBDb25uZWN0LnByb3RvdHlwZS5pbml0U2VsZWN0b3IgPSBmdW5jdGlvbiBpbml0U2VsZWN0b3IoKSB7XG4gICAgICAgIHZhciBzb3VyY2VTZWxlY3RvciA9IHNlbGVjdG9yRmFjdG9yeSh0aGlzLnN0b3JlLmRpc3BhdGNoLCBzZWxlY3RvckZhY3RvcnlPcHRpb25zKTtcbiAgICAgICAgdGhpcy5zZWxlY3RvciA9IG1ha2VTZWxlY3RvclN0YXRlZnVsKHNvdXJjZVNlbGVjdG9yLCB0aGlzLnN0b3JlKTtcbiAgICAgICAgdGhpcy5zZWxlY3Rvci5ydW4odGhpcy5wcm9wcyk7XG4gICAgICB9O1xuXG4gICAgICBDb25uZWN0LnByb3RvdHlwZS5pbml0U3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gaW5pdFN1YnNjcmlwdGlvbigpIHtcbiAgICAgICAgaWYgKCFzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMpIHJldHVybjtcblxuICAgICAgICAvLyBwYXJlbnRTdWIncyBzb3VyY2Ugc2hvdWxkIG1hdGNoIHdoZXJlIHN0b3JlIGNhbWUgZnJvbTogcHJvcHMgdnMuIGNvbnRleHQuIEEgY29tcG9uZW50XG4gICAgICAgIC8vIGNvbm5lY3RlZCB0byB0aGUgc3RvcmUgdmlhIHByb3BzIHNob3VsZG4ndCB1c2Ugc3Vic2NyaXB0aW9uIGZyb20gY29udGV4dCwgb3IgdmljZSB2ZXJzYS5cbiAgICAgICAgdmFyIHBhcmVudFN1YiA9ICh0aGlzLnByb3BzTW9kZSA/IHRoaXMucHJvcHMgOiB0aGlzLmNvbnRleHQpW3N1YnNjcmlwdGlvbktleV07XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbmV3IF9TdWJzY3JpcHRpb24yLmRlZmF1bHQodGhpcy5zdG9yZSwgcGFyZW50U3ViLCB0aGlzLm9uU3RhdGVDaGFuZ2UuYmluZCh0aGlzKSk7XG5cbiAgICAgICAgLy8gYG5vdGlmeU5lc3RlZFN1YnNgIGlzIGR1cGxpY2F0ZWQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBjb21wb25lbnQgaXMgIHVubW91bnRlZCBpblxuICAgICAgICAvLyB0aGUgbWlkZGxlIG9mIHRoZSBub3RpZmljYXRpb24gbG9vcCwgd2hlcmUgYHRoaXMuc3Vic2NyaXB0aW9uYCB3aWxsIHRoZW4gYmUgbnVsbC4gQW5cbiAgICAgICAgLy8gZXh0cmEgbnVsbCBjaGVjayBldmVyeSBjaGFuZ2UgY2FuIGJlIGF2b2lkZWQgYnkgY29weWluZyB0aGUgbWV0aG9kIG9udG8gYHRoaXNgIGFuZCB0aGVuXG4gICAgICAgIC8vIHJlcGxhY2luZyBpdCB3aXRoIGEgbm8tb3Agb24gdW5tb3VudC4gVGhpcyBjYW4gcHJvYmFibHkgYmUgYXZvaWRlZCBpZiBTdWJzY3JpcHRpb24nc1xuICAgICAgICAvLyBsaXN0ZW5lcnMgbG9naWMgaXMgY2hhbmdlZCB0byBub3QgY2FsbCBsaXN0ZW5lcnMgdGhhdCBoYXZlIGJlZW4gdW5zdWJzY3JpYmVkIGluIHRoZVxuICAgICAgICAvLyBtaWRkbGUgb2YgdGhlIG5vdGlmaWNhdGlvbiBsb29wLlxuICAgICAgICB0aGlzLm5vdGlmeU5lc3RlZFN1YnMgPSB0aGlzLnN1YnNjcmlwdGlvbi5ub3RpZnlOZXN0ZWRTdWJzLmJpbmQodGhpcy5zdWJzY3JpcHRpb24pO1xuICAgICAgfTtcblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUub25TdGF0ZUNoYW5nZSA9IGZ1bmN0aW9uIG9uU3RhdGVDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0b3IucnVuKHRoaXMucHJvcHMpO1xuXG4gICAgICAgIGlmICghdGhpcy5zZWxlY3Rvci5zaG91bGRDb21wb25lbnRVcGRhdGUpIHtcbiAgICAgICAgICB0aGlzLm5vdGlmeU5lc3RlZFN1YnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudERpZFVwZGF0ZSA9IHRoaXMubm90aWZ5TmVzdGVkU3Vic09uQ29tcG9uZW50RGlkVXBkYXRlO1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoZHVtbXlTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIENvbm5lY3QucHJvdG90eXBlLm5vdGlmeU5lc3RlZFN1YnNPbkNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIG5vdGlmeU5lc3RlZFN1YnNPbkNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgICAgLy8gYGNvbXBvbmVudERpZFVwZGF0ZWAgaXMgY29uZGl0aW9uYWxseSBpbXBsZW1lbnRlZCB3aGVuIGBvblN0YXRlQ2hhbmdlYCBkZXRlcm1pbmVzIGl0XG4gICAgICAgIC8vIG5lZWRzIHRvIG5vdGlmeSBuZXN0ZWQgc3Vicy4gT25jZSBjYWxsZWQsIGl0IHVuaW1wbGVtZW50cyBpdHNlbGYgdW50aWwgZnVydGhlciBzdGF0ZVxuICAgICAgICAvLyBjaGFuZ2VzIG9jY3VyLiBEb2luZyBpdCB0aGlzIHdheSB2cyBoYXZpbmcgYSBwZXJtYW5lbnQgYGNvbXBvbmVudERpZE1vdW50YCB0aGF0IGRvZXNcbiAgICAgICAgLy8gYSBib29sZWFuIGNoZWNrIGV2ZXJ5IHRpbWUgYXZvaWRzIGFuIGV4dHJhIG1ldGhvZCBjYWxsIG1vc3Qgb2YgdGhlIHRpbWUsIHJlc3VsdGluZ1xuICAgICAgICAvLyBpbiBzb21lIHBlcmYgYm9vc3QuXG4gICAgICAgIHRoaXMuY29tcG9uZW50RGlkVXBkYXRlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLm5vdGlmeU5lc3RlZFN1YnMoKTtcbiAgICAgIH07XG5cbiAgICAgIENvbm5lY3QucHJvdG90eXBlLmlzU3Vic2NyaWJlZCA9IGZ1bmN0aW9uIGlzU3Vic2NyaWJlZCgpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5zdWJzY3JpcHRpb24pICYmIHRoaXMuc3Vic2NyaXB0aW9uLmlzU3Vic2NyaWJlZCgpO1xuICAgICAgfTtcblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUuYWRkRXh0cmFQcm9wcyA9IGZ1bmN0aW9uIGFkZEV4dHJhUHJvcHMocHJvcHMpIHtcbiAgICAgICAgaWYgKCF3aXRoUmVmICYmICFyZW5kZXJDb3VudFByb3AgJiYgISh0aGlzLnByb3BzTW9kZSAmJiB0aGlzLnN1YnNjcmlwdGlvbikpIHJldHVybiBwcm9wcztcbiAgICAgICAgLy8gbWFrZSBhIHNoYWxsb3cgY29weSBzbyB0aGF0IGZpZWxkcyBhZGRlZCBkb24ndCBsZWFrIHRvIHRoZSBvcmlnaW5hbCBzZWxlY3Rvci5cbiAgICAgICAgLy8gdGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgJ3JlZicgc2luY2UgdGhhdCdzIGEgcmVmZXJlbmNlIGJhY2sgdG8gdGhlIGNvbXBvbmVudFxuICAgICAgICAvLyBpbnN0YW5jZS4gYSBzaW5nbGV0b24gbWVtb2l6ZWQgc2VsZWN0b3Igd291bGQgdGhlbiBiZSBob2xkaW5nIGEgcmVmZXJlbmNlIHRvIHRoZVxuICAgICAgICAvLyBpbnN0YW5jZSwgcHJldmVudGluZyB0aGUgaW5zdGFuY2UgZnJvbSBiZWluZyBnYXJiYWdlIGNvbGxlY3RlZCwgYW5kIHRoYXQgd291bGQgYmUgYmFkXG4gICAgICAgIHZhciB3aXRoRXh0cmFzID0gX2V4dGVuZHMoe30sIHByb3BzKTtcbiAgICAgICAgaWYgKHdpdGhSZWYpIHdpdGhFeHRyYXMucmVmID0gdGhpcy5zZXRXcmFwcGVkSW5zdGFuY2U7XG4gICAgICAgIGlmIChyZW5kZXJDb3VudFByb3ApIHdpdGhFeHRyYXNbcmVuZGVyQ291bnRQcm9wXSA9IHRoaXMucmVuZGVyQ291bnQrKztcbiAgICAgICAgaWYgKHRoaXMucHJvcHNNb2RlICYmIHRoaXMuc3Vic2NyaXB0aW9uKSB3aXRoRXh0cmFzW3N1YnNjcmlwdGlvbktleV0gPSB0aGlzLnN1YnNjcmlwdGlvbjtcbiAgICAgICAgcmV0dXJuIHdpdGhFeHRyYXM7XG4gICAgICB9O1xuXG4gICAgICBDb25uZWN0LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgIHZhciBzZWxlY3RvciA9IHRoaXMuc2VsZWN0b3I7XG4gICAgICAgIHNlbGVjdG9yLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChzZWxlY3Rvci5lcnJvcikge1xuICAgICAgICAgIHRocm93IHNlbGVjdG9yLmVycm9yO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAoMCwgX3JlYWN0LmNyZWF0ZUVsZW1lbnQpKFdyYXBwZWRDb21wb25lbnQsIHRoaXMuYWRkRXh0cmFQcm9wcyhzZWxlY3Rvci5wcm9wcykpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gQ29ubmVjdDtcbiAgICB9KF9yZWFjdC5Db21wb25lbnQpO1xuXG4gICAgQ29ubmVjdC5XcmFwcGVkQ29tcG9uZW50ID0gV3JhcHBlZENvbXBvbmVudDtcbiAgICBDb25uZWN0LmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG4gICAgQ29ubmVjdC5jaGlsZENvbnRleHRUeXBlcyA9IGNoaWxkQ29udGV4dFR5cGVzO1xuICAgIENvbm5lY3QuY29udGV4dFR5cGVzID0gY29udGV4dFR5cGVzO1xuICAgIENvbm5lY3QucHJvcFR5cGVzID0gY29udGV4dFR5cGVzO1xuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBDb25uZWN0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVwZGF0ZSgpIHtcbiAgICAgICAgLy8gV2UgYXJlIGhvdCByZWxvYWRpbmchXG4gICAgICAgIGlmICh0aGlzLnZlcnNpb24gIT09IHZlcnNpb24pIHtcbiAgICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICAgIHRoaXMuaW5pdFNlbGVjdG9yKCk7XG5cbiAgICAgICAgICBpZiAodGhpcy5zdWJzY3JpcHRpb24pIHRoaXMuc3Vic2NyaXB0aW9uLnRyeVVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgdGhpcy5pbml0U3Vic2NyaXB0aW9uKCk7XG4gICAgICAgICAgaWYgKHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcykgdGhpcy5zdWJzY3JpcHRpb24udHJ5U3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuICgwLCBfaG9pc3ROb25SZWFjdFN0YXRpY3MyLmRlZmF1bHQpKENvbm5lY3QsIFdyYXBwZWRDb21wb25lbnQpO1xuICB9O1xufSIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuZXhwb3J0cy5jcmVhdGVDb25uZWN0ID0gY3JlYXRlQ29ubmVjdDtcblxudmFyIF9jb25uZWN0QWR2YW5jZWQgPSByZXF1aXJlKCcuLi9jb21wb25lbnRzL2Nvbm5lY3RBZHZhbmNlZCcpO1xuXG52YXIgX2Nvbm5lY3RBZHZhbmNlZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb25uZWN0QWR2YW5jZWQpO1xuXG52YXIgX3NoYWxsb3dFcXVhbCA9IHJlcXVpcmUoJy4uL3V0aWxzL3NoYWxsb3dFcXVhbCcpO1xuXG52YXIgX3NoYWxsb3dFcXVhbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zaGFsbG93RXF1YWwpO1xuXG52YXIgX21hcERpc3BhdGNoVG9Qcm9wcyA9IHJlcXVpcmUoJy4vbWFwRGlzcGF0Y2hUb1Byb3BzJyk7XG5cbnZhciBfbWFwRGlzcGF0Y2hUb1Byb3BzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX21hcERpc3BhdGNoVG9Qcm9wcyk7XG5cbnZhciBfbWFwU3RhdGVUb1Byb3BzID0gcmVxdWlyZSgnLi9tYXBTdGF0ZVRvUHJvcHMnKTtcblxudmFyIF9tYXBTdGF0ZVRvUHJvcHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbWFwU3RhdGVUb1Byb3BzKTtcblxudmFyIF9tZXJnZVByb3BzID0gcmVxdWlyZSgnLi9tZXJnZVByb3BzJyk7XG5cbnZhciBfbWVyZ2VQcm9wczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9tZXJnZVByb3BzKTtcblxudmFyIF9zZWxlY3RvckZhY3RvcnkgPSByZXF1aXJlKCcuL3NlbGVjdG9yRmFjdG9yeScpO1xuXG52YXIgX3NlbGVjdG9yRmFjdG9yeTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zZWxlY3RvckZhY3RvcnkpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIgaSBpbiBvYmopIHsgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7IHRhcmdldFtpXSA9IG9ialtpXTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbi8qXG4gIGNvbm5lY3QgaXMgYSBmYWNhZGUgb3ZlciBjb25uZWN0QWR2YW5jZWQuIEl0IHR1cm5zIGl0cyBhcmdzIGludG8gYSBjb21wYXRpYmxlXG4gIHNlbGVjdG9yRmFjdG9yeSwgd2hpY2ggaGFzIHRoZSBzaWduYXR1cmU6XG5cbiAgICAoZGlzcGF0Y2gsIG9wdGlvbnMpID0+IChuZXh0U3RhdGUsIG5leHRPd25Qcm9wcykgPT4gbmV4dEZpbmFsUHJvcHNcbiAgXG4gIGNvbm5lY3QgcGFzc2VzIGl0cyBhcmdzIHRvIGNvbm5lY3RBZHZhbmNlZCBhcyBvcHRpb25zLCB3aGljaCB3aWxsIGluIHR1cm4gcGFzcyB0aGVtIHRvXG4gIHNlbGVjdG9yRmFjdG9yeSBlYWNoIHRpbWUgYSBDb25uZWN0IGNvbXBvbmVudCBpbnN0YW5jZSBpcyBpbnN0YW50aWF0ZWQgb3IgaG90IHJlbG9hZGVkLlxuXG4gIHNlbGVjdG9yRmFjdG9yeSByZXR1cm5zIGEgZmluYWwgcHJvcHMgc2VsZWN0b3IgZnJvbSBpdHMgbWFwU3RhdGVUb1Byb3BzLFxuICBtYXBTdGF0ZVRvUHJvcHNGYWN0b3JpZXMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yaWVzLCBtZXJnZVByb3BzLFxuICBtZXJnZVByb3BzRmFjdG9yaWVzLCBhbmQgcHVyZSBhcmdzLlxuXG4gIFRoZSByZXN1bHRpbmcgZmluYWwgcHJvcHMgc2VsZWN0b3IgaXMgY2FsbGVkIGJ5IHRoZSBDb25uZWN0IGNvbXBvbmVudCBpbnN0YW5jZSB3aGVuZXZlclxuICBpdCByZWNlaXZlcyBuZXcgcHJvcHMgb3Igc3RvcmUgc3RhdGUuXG4gKi9cblxuZnVuY3Rpb24gbWF0Y2goYXJnLCBmYWN0b3JpZXMsIG5hbWUpIHtcbiAgZm9yICh2YXIgaSA9IGZhY3Rvcmllcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciByZXN1bHQgPSBmYWN0b3JpZXNbaV0oYXJnKTtcbiAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChkaXNwYXRjaCwgb3B0aW9ucykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB2YWx1ZSBvZiB0eXBlICcgKyB0eXBlb2YgYXJnICsgJyBmb3IgJyArIG5hbWUgKyAnIGFyZ3VtZW50IHdoZW4gY29ubmVjdGluZyBjb21wb25lbnQgJyArIG9wdGlvbnMud3JhcHBlZENvbXBvbmVudE5hbWUgKyAnLicpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdHJpY3RFcXVhbChhLCBiKSB7XG4gIHJldHVybiBhID09PSBiO1xufVxuXG4vLyBjcmVhdGVDb25uZWN0IHdpdGggZGVmYXVsdCBhcmdzIGJ1aWxkcyB0aGUgJ29mZmljaWFsJyBjb25uZWN0IGJlaGF2aW9yLiBDYWxsaW5nIGl0IHdpdGhcbi8vIGRpZmZlcmVudCBvcHRpb25zIG9wZW5zIHVwIHNvbWUgdGVzdGluZyBhbmQgZXh0ZW5zaWJpbGl0eSBzY2VuYXJpb3NcbmZ1bmN0aW9uIGNyZWF0ZUNvbm5lY3QoKSB7XG4gIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fSxcbiAgICAgIF9yZWYkY29ubmVjdEhPQyA9IF9yZWYuY29ubmVjdEhPQyxcbiAgICAgIGNvbm5lY3RIT0MgPSBfcmVmJGNvbm5lY3RIT0MgPT09IHVuZGVmaW5lZCA/IF9jb25uZWN0QWR2YW5jZWQyLmRlZmF1bHQgOiBfcmVmJGNvbm5lY3RIT0MsXG4gICAgICBfcmVmJG1hcFN0YXRlVG9Qcm9wc0YgPSBfcmVmLm1hcFN0YXRlVG9Qcm9wc0ZhY3RvcmllcyxcbiAgICAgIG1hcFN0YXRlVG9Qcm9wc0ZhY3RvcmllcyA9IF9yZWYkbWFwU3RhdGVUb1Byb3BzRiA9PT0gdW5kZWZpbmVkID8gX21hcFN0YXRlVG9Qcm9wczIuZGVmYXVsdCA6IF9yZWYkbWFwU3RhdGVUb1Byb3BzRixcbiAgICAgIF9yZWYkbWFwRGlzcGF0Y2hUb1BybyA9IF9yZWYubWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yaWVzLFxuICAgICAgbWFwRGlzcGF0Y2hUb1Byb3BzRmFjdG9yaWVzID0gX3JlZiRtYXBEaXNwYXRjaFRvUHJvID09PSB1bmRlZmluZWQgPyBfbWFwRGlzcGF0Y2hUb1Byb3BzMi5kZWZhdWx0IDogX3JlZiRtYXBEaXNwYXRjaFRvUHJvLFxuICAgICAgX3JlZiRtZXJnZVByb3BzRmFjdG9yID0gX3JlZi5tZXJnZVByb3BzRmFjdG9yaWVzLFxuICAgICAgbWVyZ2VQcm9wc0ZhY3RvcmllcyA9IF9yZWYkbWVyZ2VQcm9wc0ZhY3RvciA9PT0gdW5kZWZpbmVkID8gX21lcmdlUHJvcHMyLmRlZmF1bHQgOiBfcmVmJG1lcmdlUHJvcHNGYWN0b3IsXG4gICAgICBfcmVmJHNlbGVjdG9yRmFjdG9yeSA9IF9yZWYuc2VsZWN0b3JGYWN0b3J5LFxuICAgICAgc2VsZWN0b3JGYWN0b3J5ID0gX3JlZiRzZWxlY3RvckZhY3RvcnkgPT09IHVuZGVmaW5lZCA/IF9zZWxlY3RvckZhY3RvcnkyLmRlZmF1bHQgOiBfcmVmJHNlbGVjdG9yRmFjdG9yeTtcblxuICByZXR1cm4gZnVuY3Rpb24gY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcykge1xuICAgIHZhciBfcmVmMiA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge30sXG4gICAgICAgIF9yZWYyJHB1cmUgPSBfcmVmMi5wdXJlLFxuICAgICAgICBwdXJlID0gX3JlZjIkcHVyZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IF9yZWYyJHB1cmUsXG4gICAgICAgIF9yZWYyJGFyZVN0YXRlc0VxdWFsID0gX3JlZjIuYXJlU3RhdGVzRXF1YWwsXG4gICAgICAgIGFyZVN0YXRlc0VxdWFsID0gX3JlZjIkYXJlU3RhdGVzRXF1YWwgPT09IHVuZGVmaW5lZCA/IHN0cmljdEVxdWFsIDogX3JlZjIkYXJlU3RhdGVzRXF1YWwsXG4gICAgICAgIF9yZWYyJGFyZU93blByb3BzRXF1YSA9IF9yZWYyLmFyZU93blByb3BzRXF1YWwsXG4gICAgICAgIGFyZU93blByb3BzRXF1YWwgPSBfcmVmMiRhcmVPd25Qcm9wc0VxdWEgPT09IHVuZGVmaW5lZCA/IF9zaGFsbG93RXF1YWwyLmRlZmF1bHQgOiBfcmVmMiRhcmVPd25Qcm9wc0VxdWEsXG4gICAgICAgIF9yZWYyJGFyZVN0YXRlUHJvcHNFcSA9IF9yZWYyLmFyZVN0YXRlUHJvcHNFcXVhbCxcbiAgICAgICAgYXJlU3RhdGVQcm9wc0VxdWFsID0gX3JlZjIkYXJlU3RhdGVQcm9wc0VxID09PSB1bmRlZmluZWQgPyBfc2hhbGxvd0VxdWFsMi5kZWZhdWx0IDogX3JlZjIkYXJlU3RhdGVQcm9wc0VxLFxuICAgICAgICBfcmVmMiRhcmVNZXJnZWRQcm9wc0UgPSBfcmVmMi5hcmVNZXJnZWRQcm9wc0VxdWFsLFxuICAgICAgICBhcmVNZXJnZWRQcm9wc0VxdWFsID0gX3JlZjIkYXJlTWVyZ2VkUHJvcHNFID09PSB1bmRlZmluZWQgPyBfc2hhbGxvd0VxdWFsMi5kZWZhdWx0IDogX3JlZjIkYXJlTWVyZ2VkUHJvcHNFLFxuICAgICAgICBleHRyYU9wdGlvbnMgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZjIsIFsncHVyZScsICdhcmVTdGF0ZXNFcXVhbCcsICdhcmVPd25Qcm9wc0VxdWFsJywgJ2FyZVN0YXRlUHJvcHNFcXVhbCcsICdhcmVNZXJnZWRQcm9wc0VxdWFsJ10pO1xuXG4gICAgdmFyIGluaXRNYXBTdGF0ZVRvUHJvcHMgPSBtYXRjaChtYXBTdGF0ZVRvUHJvcHMsIG1hcFN0YXRlVG9Qcm9wc0ZhY3RvcmllcywgJ21hcFN0YXRlVG9Qcm9wcycpO1xuICAgIHZhciBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzID0gbWF0Y2gobWFwRGlzcGF0Y2hUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3JpZXMsICdtYXBEaXNwYXRjaFRvUHJvcHMnKTtcbiAgICB2YXIgaW5pdE1lcmdlUHJvcHMgPSBtYXRjaChtZXJnZVByb3BzLCBtZXJnZVByb3BzRmFjdG9yaWVzLCAnbWVyZ2VQcm9wcycpO1xuXG4gICAgcmV0dXJuIGNvbm5lY3RIT0Moc2VsZWN0b3JGYWN0b3J5LCBfZXh0ZW5kcyh7XG4gICAgICAvLyB1c2VkIGluIGVycm9yIG1lc3NhZ2VzXG4gICAgICBtZXRob2ROYW1lOiAnY29ubmVjdCcsXG5cbiAgICAgIC8vIHVzZWQgdG8gY29tcHV0ZSBDb25uZWN0J3MgZGlzcGxheU5hbWUgZnJvbSB0aGUgd3JhcHBlZCBjb21wb25lbnQncyBkaXNwbGF5TmFtZS5cbiAgICAgIGdldERpc3BsYXlOYW1lOiBmdW5jdGlvbiBnZXREaXNwbGF5TmFtZShuYW1lKSB7XG4gICAgICAgIHJldHVybiAnQ29ubmVjdCgnICsgbmFtZSArICcpJztcbiAgICAgIH0sXG5cbiAgICAgIC8vIGlmIG1hcFN0YXRlVG9Qcm9wcyBpcyBmYWxzeSwgdGhlIENvbm5lY3QgY29tcG9uZW50IGRvZXNuJ3Qgc3Vic2NyaWJlIHRvIHN0b3JlIHN0YXRlIGNoYW5nZXNcbiAgICAgIHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlczogQm9vbGVhbihtYXBTdGF0ZVRvUHJvcHMpLFxuXG4gICAgICAvLyBwYXNzZWQgdGhyb3VnaCB0byBzZWxlY3RvckZhY3RvcnlcbiAgICAgIGluaXRNYXBTdGF0ZVRvUHJvcHM6IGluaXRNYXBTdGF0ZVRvUHJvcHMsXG4gICAgICBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzOiBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzLFxuICAgICAgaW5pdE1lcmdlUHJvcHM6IGluaXRNZXJnZVByb3BzLFxuICAgICAgcHVyZTogcHVyZSxcbiAgICAgIGFyZVN0YXRlc0VxdWFsOiBhcmVTdGF0ZXNFcXVhbCxcbiAgICAgIGFyZU93blByb3BzRXF1YWw6IGFyZU93blByb3BzRXF1YWwsXG4gICAgICBhcmVTdGF0ZVByb3BzRXF1YWw6IGFyZVN0YXRlUHJvcHNFcXVhbCxcbiAgICAgIGFyZU1lcmdlZFByb3BzRXF1YWw6IGFyZU1lcmdlZFByb3BzRXF1YWxcblxuICAgIH0sIGV4dHJhT3B0aW9ucykpO1xuICB9O1xufVxuXG5leHBvcnRzLmRlZmF1bHQgPSBjcmVhdGVDb25uZWN0KCk7IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy53aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNGdW5jdGlvbiA9IHdoZW5NYXBEaXNwYXRjaFRvUHJvcHNJc0Z1bmN0aW9uO1xuZXhwb3J0cy53aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNNaXNzaW5nID0gd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzTWlzc2luZztcbmV4cG9ydHMud2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzT2JqZWN0ID0gd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzT2JqZWN0O1xuXG52YXIgX3JlZHV4ID0gcmVxdWlyZSgncmVkdXgnKTtcblxudmFyIF93cmFwTWFwVG9Qcm9wcyA9IHJlcXVpcmUoJy4vd3JhcE1hcFRvUHJvcHMnKTtcblxuZnVuY3Rpb24gd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzRnVuY3Rpb24obWFwRGlzcGF0Y2hUb1Byb3BzKSB7XG4gIHJldHVybiB0eXBlb2YgbWFwRGlzcGF0Y2hUb1Byb3BzID09PSAnZnVuY3Rpb24nID8gKDAsIF93cmFwTWFwVG9Qcm9wcy53cmFwTWFwVG9Qcm9wc0Z1bmMpKG1hcERpc3BhdGNoVG9Qcm9wcywgJ21hcERpc3BhdGNoVG9Qcm9wcycpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNNaXNzaW5nKG1hcERpc3BhdGNoVG9Qcm9wcykge1xuICByZXR1cm4gIW1hcERpc3BhdGNoVG9Qcm9wcyA/ICgwLCBfd3JhcE1hcFRvUHJvcHMud3JhcE1hcFRvUHJvcHNDb25zdGFudCkoZnVuY3Rpb24gKGRpc3BhdGNoKSB7XG4gICAgcmV0dXJuIHsgZGlzcGF0Y2g6IGRpc3BhdGNoIH07XG4gIH0pIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNPYmplY3QobWFwRGlzcGF0Y2hUb1Byb3BzKSB7XG4gIHJldHVybiBtYXBEaXNwYXRjaFRvUHJvcHMgJiYgdHlwZW9mIG1hcERpc3BhdGNoVG9Qcm9wcyA9PT0gJ29iamVjdCcgPyAoMCwgX3dyYXBNYXBUb1Byb3BzLndyYXBNYXBUb1Byb3BzQ29uc3RhbnQpKGZ1bmN0aW9uIChkaXNwYXRjaCkge1xuICAgIHJldHVybiAoMCwgX3JlZHV4LmJpbmRBY3Rpb25DcmVhdG9ycykobWFwRGlzcGF0Y2hUb1Byb3BzLCBkaXNwYXRjaCk7XG4gIH0pIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnRzLmRlZmF1bHQgPSBbd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzRnVuY3Rpb24sIHdoZW5NYXBEaXNwYXRjaFRvUHJvcHNJc01pc3NpbmcsIHdoZW5NYXBEaXNwYXRjaFRvUHJvcHNJc09iamVjdF07IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy53aGVuTWFwU3RhdGVUb1Byb3BzSXNGdW5jdGlvbiA9IHdoZW5NYXBTdGF0ZVRvUHJvcHNJc0Z1bmN0aW9uO1xuZXhwb3J0cy53aGVuTWFwU3RhdGVUb1Byb3BzSXNNaXNzaW5nID0gd2hlbk1hcFN0YXRlVG9Qcm9wc0lzTWlzc2luZztcblxudmFyIF93cmFwTWFwVG9Qcm9wcyA9IHJlcXVpcmUoJy4vd3JhcE1hcFRvUHJvcHMnKTtcblxuZnVuY3Rpb24gd2hlbk1hcFN0YXRlVG9Qcm9wc0lzRnVuY3Rpb24obWFwU3RhdGVUb1Byb3BzKSB7XG4gIHJldHVybiB0eXBlb2YgbWFwU3RhdGVUb1Byb3BzID09PSAnZnVuY3Rpb24nID8gKDAsIF93cmFwTWFwVG9Qcm9wcy53cmFwTWFwVG9Qcm9wc0Z1bmMpKG1hcFN0YXRlVG9Qcm9wcywgJ21hcFN0YXRlVG9Qcm9wcycpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB3aGVuTWFwU3RhdGVUb1Byb3BzSXNNaXNzaW5nKG1hcFN0YXRlVG9Qcm9wcykge1xuICByZXR1cm4gIW1hcFN0YXRlVG9Qcm9wcyA/ICgwLCBfd3JhcE1hcFRvUHJvcHMud3JhcE1hcFRvUHJvcHNDb25zdGFudCkoZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7fTtcbiAgfSkgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFt3aGVuTWFwU3RhdGVUb1Byb3BzSXNGdW5jdGlvbiwgd2hlbk1hcFN0YXRlVG9Qcm9wc0lzTWlzc2luZ107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5leHBvcnRzLmRlZmF1bHRNZXJnZVByb3BzID0gZGVmYXVsdE1lcmdlUHJvcHM7XG5leHBvcnRzLndyYXBNZXJnZVByb3BzRnVuYyA9IHdyYXBNZXJnZVByb3BzRnVuYztcbmV4cG9ydHMud2hlbk1lcmdlUHJvcHNJc0Z1bmN0aW9uID0gd2hlbk1lcmdlUHJvcHNJc0Z1bmN0aW9uO1xuZXhwb3J0cy53aGVuTWVyZ2VQcm9wc0lzT21pdHRlZCA9IHdoZW5NZXJnZVByb3BzSXNPbWl0dGVkO1xuXG52YXIgX3ZlcmlmeVBsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi4vdXRpbHMvdmVyaWZ5UGxhaW5PYmplY3QnKTtcblxudmFyIF92ZXJpZnlQbGFpbk9iamVjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF92ZXJpZnlQbGFpbk9iamVjdCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIGRlZmF1bHRNZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKSB7XG4gIHJldHVybiBfZXh0ZW5kcyh7fSwgb3duUHJvcHMsIHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMpO1xufVxuXG5mdW5jdGlvbiB3cmFwTWVyZ2VQcm9wc0Z1bmMobWVyZ2VQcm9wcykge1xuICByZXR1cm4gZnVuY3Rpb24gaW5pdE1lcmdlUHJvcHNQcm94eShkaXNwYXRjaCwgX3JlZikge1xuICAgIHZhciBkaXNwbGF5TmFtZSA9IF9yZWYuZGlzcGxheU5hbWUsXG4gICAgICAgIHB1cmUgPSBfcmVmLnB1cmUsXG4gICAgICAgIGFyZU1lcmdlZFByb3BzRXF1YWwgPSBfcmVmLmFyZU1lcmdlZFByb3BzRXF1YWw7XG5cbiAgICB2YXIgaGFzUnVuT25jZSA9IGZhbHNlO1xuICAgIHZhciBtZXJnZWRQcm9wcyA9IHZvaWQgMDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBtZXJnZVByb3BzUHJveHkoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpIHtcbiAgICAgIHZhciBuZXh0TWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcblxuICAgICAgaWYgKGhhc1J1bk9uY2UpIHtcbiAgICAgICAgaWYgKCFwdXJlIHx8ICFhcmVNZXJnZWRQcm9wc0VxdWFsKG5leHRNZXJnZWRQcm9wcywgbWVyZ2VkUHJvcHMpKSBtZXJnZWRQcm9wcyA9IG5leHRNZXJnZWRQcm9wcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhc1J1bk9uY2UgPSB0cnVlO1xuICAgICAgICBtZXJnZWRQcm9wcyA9IG5leHRNZXJnZWRQcm9wcztcblxuICAgICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpICgwLCBfdmVyaWZ5UGxhaW5PYmplY3QyLmRlZmF1bHQpKG1lcmdlZFByb3BzLCBkaXNwbGF5TmFtZSwgJ21lcmdlUHJvcHMnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICAgIH07XG4gIH07XG59XG5cbmZ1bmN0aW9uIHdoZW5NZXJnZVByb3BzSXNGdW5jdGlvbihtZXJnZVByb3BzKSB7XG4gIHJldHVybiB0eXBlb2YgbWVyZ2VQcm9wcyA9PT0gJ2Z1bmN0aW9uJyA/IHdyYXBNZXJnZVByb3BzRnVuYyhtZXJnZVByb3BzKSA6IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gd2hlbk1lcmdlUHJvcHNJc09taXR0ZWQobWVyZ2VQcm9wcykge1xuICByZXR1cm4gIW1lcmdlUHJvcHMgPyBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRNZXJnZVByb3BzO1xuICB9IDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnRzLmRlZmF1bHQgPSBbd2hlbk1lcmdlUHJvcHNJc0Z1bmN0aW9uLCB3aGVuTWVyZ2VQcm9wc0lzT21pdHRlZF07IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5pbXB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5ID0gaW1wdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeTtcbmV4cG9ydHMucHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkgPSBwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeTtcbmV4cG9ydHMuZGVmYXVsdCA9IGZpbmFsUHJvcHNTZWxlY3RvckZhY3Rvcnk7XG5cbnZhciBfdmVyaWZ5U3Vic2VsZWN0b3JzID0gcmVxdWlyZSgnLi92ZXJpZnlTdWJzZWxlY3RvcnMnKTtcblxudmFyIF92ZXJpZnlTdWJzZWxlY3RvcnMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmVyaWZ5U3Vic2VsZWN0b3JzKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBpbXB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCBkaXNwYXRjaCkge1xuICByZXR1cm4gZnVuY3Rpb24gaW1wdXJlRmluYWxQcm9wc1NlbGVjdG9yKHN0YXRlLCBvd25Qcm9wcykge1xuICAgIHJldHVybiBtZXJnZVByb3BzKG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpLCBtYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG93blByb3BzKSwgb3duUHJvcHMpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgZGlzcGF0Y2gsIF9yZWYpIHtcbiAgdmFyIGFyZVN0YXRlc0VxdWFsID0gX3JlZi5hcmVTdGF0ZXNFcXVhbCxcbiAgICAgIGFyZU93blByb3BzRXF1YWwgPSBfcmVmLmFyZU93blByb3BzRXF1YWwsXG4gICAgICBhcmVTdGF0ZVByb3BzRXF1YWwgPSBfcmVmLmFyZVN0YXRlUHJvcHNFcXVhbDtcblxuICB2YXIgaGFzUnVuQXRMZWFzdE9uY2UgPSBmYWxzZTtcbiAgdmFyIHN0YXRlID0gdm9pZCAwO1xuICB2YXIgb3duUHJvcHMgPSB2b2lkIDA7XG4gIHZhciBzdGF0ZVByb3BzID0gdm9pZCAwO1xuICB2YXIgZGlzcGF0Y2hQcm9wcyA9IHZvaWQgMDtcbiAgdmFyIG1lcmdlZFByb3BzID0gdm9pZCAwO1xuXG4gIGZ1bmN0aW9uIGhhbmRsZUZpcnN0Q2FsbChmaXJzdFN0YXRlLCBmaXJzdE93blByb3BzKSB7XG4gICAgc3RhdGUgPSBmaXJzdFN0YXRlO1xuICAgIG93blByb3BzID0gZmlyc3RPd25Qcm9wcztcbiAgICBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgaGFzUnVuQXRMZWFzdE9uY2UgPSB0cnVlO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU5ld1Byb3BzQW5kTmV3U3RhdGUoKSB7XG4gICAgc3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuXG4gICAgaWYgKG1hcERpc3BhdGNoVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgZGlzcGF0Y2hQcm9wcyA9IG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpO1xuXG4gICAgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVOZXdQcm9wcygpIHtcbiAgICBpZiAobWFwU3RhdGVUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG5cbiAgICBpZiAobWFwRGlzcGF0Y2hUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSBkaXNwYXRjaFByb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvd25Qcm9wcyk7XG5cbiAgICBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU5ld1N0YXRlKCkge1xuICAgIHZhciBuZXh0U3RhdGVQcm9wcyA9IG1hcFN0YXRlVG9Qcm9wcyhzdGF0ZSwgb3duUHJvcHMpO1xuICAgIHZhciBzdGF0ZVByb3BzQ2hhbmdlZCA9ICFhcmVTdGF0ZVByb3BzRXF1YWwobmV4dFN0YXRlUHJvcHMsIHN0YXRlUHJvcHMpO1xuICAgIHN0YXRlUHJvcHMgPSBuZXh0U3RhdGVQcm9wcztcblxuICAgIGlmIChzdGF0ZVByb3BzQ2hhbmdlZCkgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcblxuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZVN1YnNlcXVlbnRDYWxscyhuZXh0U3RhdGUsIG5leHRPd25Qcm9wcykge1xuICAgIHZhciBwcm9wc0NoYW5nZWQgPSAhYXJlT3duUHJvcHNFcXVhbChuZXh0T3duUHJvcHMsIG93blByb3BzKTtcbiAgICB2YXIgc3RhdGVDaGFuZ2VkID0gIWFyZVN0YXRlc0VxdWFsKG5leHRTdGF0ZSwgc3RhdGUpO1xuICAgIHN0YXRlID0gbmV4dFN0YXRlO1xuICAgIG93blByb3BzID0gbmV4dE93blByb3BzO1xuXG4gICAgaWYgKHByb3BzQ2hhbmdlZCAmJiBzdGF0ZUNoYW5nZWQpIHJldHVybiBoYW5kbGVOZXdQcm9wc0FuZE5ld1N0YXRlKCk7XG4gICAgaWYgKHByb3BzQ2hhbmdlZCkgcmV0dXJuIGhhbmRsZU5ld1Byb3BzKCk7XG4gICAgaWYgKHN0YXRlQ2hhbmdlZCkgcmV0dXJuIGhhbmRsZU5ld1N0YXRlKCk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIHB1cmVGaW5hbFByb3BzU2VsZWN0b3IobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpIHtcbiAgICByZXR1cm4gaGFzUnVuQXRMZWFzdE9uY2UgPyBoYW5kbGVTdWJzZXF1ZW50Q2FsbHMobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpIDogaGFuZGxlRmlyc3RDYWxsKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKTtcbiAgfTtcbn1cblxuLy8gVE9ETzogQWRkIG1vcmUgY29tbWVudHNcblxuLy8gSWYgcHVyZSBpcyB0cnVlLCB0aGUgc2VsZWN0b3IgcmV0dXJuZWQgYnkgc2VsZWN0b3JGYWN0b3J5IHdpbGwgbWVtb2l6ZSBpdHMgcmVzdWx0cyxcbi8vIGFsbG93aW5nIGNvbm5lY3RBZHZhbmNlZCdzIHNob3VsZENvbXBvbmVudFVwZGF0ZSB0byByZXR1cm4gZmFsc2UgaWYgZmluYWxcbi8vIHByb3BzIGhhdmUgbm90IGNoYW5nZWQuIElmIGZhbHNlLCB0aGUgc2VsZWN0b3Igd2lsbCBhbHdheXMgcmV0dXJuIGEgbmV3XG4vLyBvYmplY3QgYW5kIHNob3VsZENvbXBvbmVudFVwZGF0ZSB3aWxsIGFsd2F5cyByZXR1cm4gdHJ1ZS5cblxuZnVuY3Rpb24gZmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeShkaXNwYXRjaCwgX3JlZjIpIHtcbiAgdmFyIGluaXRNYXBTdGF0ZVRvUHJvcHMgPSBfcmVmMi5pbml0TWFwU3RhdGVUb1Byb3BzLFxuICAgICAgaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyA9IF9yZWYyLmluaXRNYXBEaXNwYXRjaFRvUHJvcHMsXG4gICAgICBpbml0TWVyZ2VQcm9wcyA9IF9yZWYyLmluaXRNZXJnZVByb3BzLFxuICAgICAgb3B0aW9ucyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmMiwgWydpbml0TWFwU3RhdGVUb1Byb3BzJywgJ2luaXRNYXBEaXNwYXRjaFRvUHJvcHMnLCAnaW5pdE1lcmdlUHJvcHMnXSk7XG5cbiAgdmFyIG1hcFN0YXRlVG9Qcm9wcyA9IGluaXRNYXBTdGF0ZVRvUHJvcHMoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuICB2YXIgbWFwRGlzcGF0Y2hUb1Byb3BzID0gaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3B0aW9ucyk7XG4gIHZhciBtZXJnZVByb3BzID0gaW5pdE1lcmdlUHJvcHMoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuXG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICgwLCBfdmVyaWZ5U3Vic2VsZWN0b3JzMi5kZWZhdWx0KShtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgb3B0aW9ucy5kaXNwbGF5TmFtZSk7XG4gIH1cblxuICB2YXIgc2VsZWN0b3JGYWN0b3J5ID0gb3B0aW9ucy5wdXJlID8gcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkgOiBpbXB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5O1xuXG4gIHJldHVybiBzZWxlY3RvckZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BhdGNoLCBvcHRpb25zKTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHQgPSB2ZXJpZnlTdWJzZWxlY3RvcnM7XG5cbnZhciBfd2FybmluZyA9IHJlcXVpcmUoJy4uL3V0aWxzL3dhcm5pbmcnKTtcblxudmFyIF93YXJuaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3dhcm5pbmcpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiB2ZXJpZnkoc2VsZWN0b3IsIG1ldGhvZE5hbWUsIGRpc3BsYXlOYW1lKSB7XG4gIGlmICghc2VsZWN0b3IpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgdmFsdWUgZm9yICcgKyBtZXRob2ROYW1lICsgJyBpbiAnICsgZGlzcGxheU5hbWUgKyAnLicpO1xuICB9IGVsc2UgaWYgKG1ldGhvZE5hbWUgPT09ICdtYXBTdGF0ZVRvUHJvcHMnIHx8IG1ldGhvZE5hbWUgPT09ICdtYXBEaXNwYXRjaFRvUHJvcHMnKSB7XG4gICAgaWYgKCFzZWxlY3Rvci5oYXNPd25Qcm9wZXJ0eSgnZGVwZW5kc09uT3duUHJvcHMnKSkge1xuICAgICAgKDAsIF93YXJuaW5nMi5kZWZhdWx0KSgnVGhlIHNlbGVjdG9yIGZvciAnICsgbWV0aG9kTmFtZSArICcgb2YgJyArIGRpc3BsYXlOYW1lICsgJyBkaWQgbm90IHNwZWNpZnkgYSB2YWx1ZSBmb3IgZGVwZW5kc09uT3duUHJvcHMuJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVN1YnNlbGVjdG9ycyhtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgdmVyaWZ5KG1hcFN0YXRlVG9Qcm9wcywgJ21hcFN0YXRlVG9Qcm9wcycsIGRpc3BsYXlOYW1lKTtcbiAgdmVyaWZ5KG1hcERpc3BhdGNoVG9Qcm9wcywgJ21hcERpc3BhdGNoVG9Qcm9wcycsIGRpc3BsYXlOYW1lKTtcbiAgdmVyaWZ5KG1lcmdlUHJvcHMsICdtZXJnZVByb3BzJywgZGlzcGxheU5hbWUpO1xufSIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMud3JhcE1hcFRvUHJvcHNDb25zdGFudCA9IHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQ7XG5leHBvcnRzLmdldERlcGVuZHNPbk93blByb3BzID0gZ2V0RGVwZW5kc09uT3duUHJvcHM7XG5leHBvcnRzLndyYXBNYXBUb1Byb3BzRnVuYyA9IHdyYXBNYXBUb1Byb3BzRnVuYztcblxudmFyIF92ZXJpZnlQbGFpbk9iamVjdCA9IHJlcXVpcmUoJy4uL3V0aWxzL3ZlcmlmeVBsYWluT2JqZWN0Jyk7XG5cbnZhciBfdmVyaWZ5UGxhaW5PYmplY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmVyaWZ5UGxhaW5PYmplY3QpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiB3cmFwTWFwVG9Qcm9wc0NvbnN0YW50KGdldENvbnN0YW50KSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbml0Q29uc3RhbnRTZWxlY3RvcihkaXNwYXRjaCwgb3B0aW9ucykge1xuICAgIHZhciBjb25zdGFudCA9IGdldENvbnN0YW50KGRpc3BhdGNoLCBvcHRpb25zKTtcblxuICAgIGZ1bmN0aW9uIGNvbnN0YW50U2VsZWN0b3IoKSB7XG4gICAgICByZXR1cm4gY29uc3RhbnQ7XG4gICAgfVxuICAgIGNvbnN0YW50U2VsZWN0b3IuZGVwZW5kc09uT3duUHJvcHMgPSBmYWxzZTtcbiAgICByZXR1cm4gY29uc3RhbnRTZWxlY3RvcjtcbiAgfTtcbn1cblxuLy8gZGVwZW5kc09uT3duUHJvcHMgaXMgdXNlZCBieSBjcmVhdGVNYXBUb1Byb3BzUHJveHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcGFzcyBwcm9wcyBhcyBhcmdzXG4vLyB0byB0aGUgbWFwVG9Qcm9wcyBmdW5jdGlvbiBiZWluZyB3cmFwcGVkLiBJdCBpcyBhbHNvIHVzZWQgYnkgbWFrZVB1cmVQcm9wc1NlbGVjdG9yIHRvIGRldGVybWluZVxuLy8gd2hldGhlciBtYXBUb1Byb3BzIG5lZWRzIHRvIGJlIGludm9rZWQgd2hlbiBwcm9wcyBoYXZlIGNoYW5nZWQuXG4vLyBcbi8vIEEgbGVuZ3RoIG9mIG9uZSBzaWduYWxzIHRoYXQgbWFwVG9Qcm9wcyBkb2VzIG5vdCBkZXBlbmQgb24gcHJvcHMgZnJvbSB0aGUgcGFyZW50IGNvbXBvbmVudC5cbi8vIEEgbGVuZ3RoIG9mIHplcm8gaXMgYXNzdW1lZCB0byBtZWFuIG1hcFRvUHJvcHMgaXMgZ2V0dGluZyBhcmdzIHZpYSBhcmd1bWVudHMgb3IgLi4uYXJncyBhbmRcbi8vIHRoZXJlZm9yZSBub3QgcmVwb3J0aW5nIGl0cyBsZW5ndGggYWNjdXJhdGVseS4uXG5mdW5jdGlvbiBnZXREZXBlbmRzT25Pd25Qcm9wcyhtYXBUb1Byb3BzKSB7XG4gIHJldHVybiBtYXBUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzICE9PSBudWxsICYmIG1hcFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMgIT09IHVuZGVmaW5lZCA/IEJvb2xlYW4obWFwVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcykgOiBtYXBUb1Byb3BzLmxlbmd0aCAhPT0gMTtcbn1cblxuLy8gVXNlZCBieSB3aGVuTWFwU3RhdGVUb1Byb3BzSXNGdW5jdGlvbiBhbmQgd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzRnVuY3Rpb24sXG4vLyB0aGlzIGZ1bmN0aW9uIHdyYXBzIG1hcFRvUHJvcHMgaW4gYSBwcm94eSBmdW5jdGlvbiB3aGljaCBkb2VzIHNldmVyYWwgdGhpbmdzOlxuLy8gXG4vLyAgKiBEZXRlY3RzIHdoZXRoZXIgdGhlIG1hcFRvUHJvcHMgZnVuY3Rpb24gYmVpbmcgY2FsbGVkIGRlcGVuZHMgb24gcHJvcHMsIHdoaWNoXG4vLyAgICBpcyB1c2VkIGJ5IHNlbGVjdG9yRmFjdG9yeSB0byBkZWNpZGUgaWYgaXQgc2hvdWxkIHJlaW52b2tlIG9uIHByb3BzIGNoYW5nZXMuXG4vLyAgICBcbi8vICAqIE9uIGZpcnN0IGNhbGwsIGhhbmRsZXMgbWFwVG9Qcm9wcyBpZiByZXR1cm5zIGFub3RoZXIgZnVuY3Rpb24sIGFuZCB0cmVhdHMgdGhhdFxuLy8gICAgbmV3IGZ1bmN0aW9uIGFzIHRoZSB0cnVlIG1hcFRvUHJvcHMgZm9yIHN1YnNlcXVlbnQgY2FsbHMuXG4vLyAgICBcbi8vICAqIE9uIGZpcnN0IGNhbGwsIHZlcmlmaWVzIHRoZSBmaXJzdCByZXN1bHQgaXMgYSBwbGFpbiBvYmplY3QsIGluIG9yZGVyIHRvIHdhcm5cbi8vICAgIHRoZSBkZXZlbG9wZXIgdGhhdCB0aGVpciBtYXBUb1Byb3BzIGZ1bmN0aW9uIGlzIG5vdCByZXR1cm5pbmcgYSB2YWxpZCByZXN1bHQuXG4vLyAgICBcbmZ1bmN0aW9uIHdyYXBNYXBUb1Byb3BzRnVuYyhtYXBUb1Byb3BzLCBtZXRob2ROYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbml0UHJveHlTZWxlY3RvcihkaXNwYXRjaCwgX3JlZikge1xuICAgIHZhciBkaXNwbGF5TmFtZSA9IF9yZWYuZGlzcGxheU5hbWU7XG5cbiAgICB2YXIgcHJveHkgPSBmdW5jdGlvbiBtYXBUb1Byb3BzUHJveHkoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcykge1xuICAgICAgcmV0dXJuIHByb3h5LmRlcGVuZHNPbk93blByb3BzID8gcHJveHkubWFwVG9Qcm9wcyhzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKSA6IHByb3h5Lm1hcFRvUHJvcHMoc3RhdGVPckRpc3BhdGNoKTtcbiAgICB9O1xuXG4gICAgLy8gYWxsb3cgZGV0ZWN0RmFjdG9yeUFuZFZlcmlmeSB0byBnZXQgb3duUHJvcHNcbiAgICBwcm94eS5kZXBlbmRzT25Pd25Qcm9wcyA9IHRydWU7XG5cbiAgICBwcm94eS5tYXBUb1Byb3BzID0gZnVuY3Rpb24gZGV0ZWN0RmFjdG9yeUFuZFZlcmlmeShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKSB7XG4gICAgICBwcm94eS5tYXBUb1Byb3BzID0gbWFwVG9Qcm9wcztcbiAgICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gZ2V0RGVwZW5kc09uT3duUHJvcHMobWFwVG9Qcm9wcyk7XG4gICAgICB2YXIgcHJvcHMgPSBwcm94eShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKTtcblxuICAgICAgaWYgKHR5cGVvZiBwcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcm94eS5tYXBUb1Byb3BzID0gcHJvcHM7XG4gICAgICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gZ2V0RGVwZW5kc09uT3duUHJvcHMocHJvcHMpO1xuICAgICAgICBwcm9wcyA9IHByb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpICgwLCBfdmVyaWZ5UGxhaW5PYmplY3QyLmRlZmF1bHQpKHByb3BzLCBkaXNwbGF5TmFtZSwgbWV0aG9kTmFtZSk7XG5cbiAgICAgIHJldHVybiBwcm9wcztcbiAgICB9O1xuXG4gICAgcmV0dXJuIHByb3h5O1xuICB9O1xufSIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuY29ubmVjdCA9IGV4cG9ydHMuY29ubmVjdEFkdmFuY2VkID0gZXhwb3J0cy5jcmVhdGVQcm92aWRlciA9IGV4cG9ydHMuUHJvdmlkZXIgPSB1bmRlZmluZWQ7XG5cbnZhciBfUHJvdmlkZXIgPSByZXF1aXJlKCcuL2NvbXBvbmVudHMvUHJvdmlkZXInKTtcblxudmFyIF9Qcm92aWRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Qcm92aWRlcik7XG5cbnZhciBfY29ubmVjdEFkdmFuY2VkID0gcmVxdWlyZSgnLi9jb21wb25lbnRzL2Nvbm5lY3RBZHZhbmNlZCcpO1xuXG52YXIgX2Nvbm5lY3RBZHZhbmNlZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb25uZWN0QWR2YW5jZWQpO1xuXG52YXIgX2Nvbm5lY3QgPSByZXF1aXJlKCcuL2Nvbm5lY3QvY29ubmVjdCcpO1xuXG52YXIgX2Nvbm5lY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29ubmVjdCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuUHJvdmlkZXIgPSBfUHJvdmlkZXIyLmRlZmF1bHQ7XG5leHBvcnRzLmNyZWF0ZVByb3ZpZGVyID0gX1Byb3ZpZGVyLmNyZWF0ZVByb3ZpZGVyO1xuZXhwb3J0cy5jb25uZWN0QWR2YW5jZWQgPSBfY29ubmVjdEFkdmFuY2VkMi5kZWZhdWx0O1xuZXhwb3J0cy5jb25uZWN0ID0gX2Nvbm5lY3QyLmRlZmF1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5zdG9yZVNoYXBlID0gZXhwb3J0cy5zdWJzY3JpcHRpb25TaGFwZSA9IHVuZGVmaW5lZDtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBzdWJzY3JpcHRpb25TaGFwZSA9IGV4cG9ydHMuc3Vic2NyaXB0aW9uU2hhcGUgPSBfcHJvcFR5cGVzMi5kZWZhdWx0LnNoYXBlKHtcbiAgdHJ5U3Vic2NyaWJlOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMuaXNSZXF1aXJlZCxcbiAgdHJ5VW5zdWJzY3JpYmU6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYy5pc1JlcXVpcmVkLFxuICBub3RpZnlOZXN0ZWRTdWJzOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMuaXNSZXF1aXJlZCxcbiAgaXNTdWJzY3JpYmVkOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMuaXNSZXF1aXJlZFxufSk7XG5cbnZhciBzdG9yZVNoYXBlID0gZXhwb3J0cy5zdG9yZVNoYXBlID0gX3Byb3BUeXBlczIuZGVmYXVsdC5zaGFwZSh7XG4gIHN1YnNjcmliZTogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLmlzUmVxdWlyZWQsXG4gIGRpc3BhdGNoOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMuaXNSZXF1aXJlZCxcbiAgZ2V0U3RhdGU6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYy5pc1JlcXVpcmVkXG59KTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuLy8gZW5jYXBzdWxhdGVzIHRoZSBzdWJzY3JpcHRpb24gbG9naWMgZm9yIGNvbm5lY3RpbmcgYSBjb21wb25lbnQgdG8gdGhlIHJlZHV4IHN0b3JlLCBhc1xuLy8gd2VsbCBhcyBuZXN0aW5nIHN1YnNjcmlwdGlvbnMgb2YgZGVzY2VuZGFudCBjb21wb25lbnRzLCBzbyB0aGF0IHdlIGNhbiBlbnN1cmUgdGhlXG4vLyBhbmNlc3RvciBjb21wb25lbnRzIHJlLXJlbmRlciBiZWZvcmUgZGVzY2VuZGFudHNcblxudmFyIENMRUFSRUQgPSBudWxsO1xudmFyIG51bGxMaXN0ZW5lcnMgPSB7XG4gIG5vdGlmeTogZnVuY3Rpb24gbm90aWZ5KCkge31cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpc3RlbmVyQ29sbGVjdGlvbigpIHtcbiAgLy8gdGhlIGN1cnJlbnQvbmV4dCBwYXR0ZXJuIGlzIGNvcGllZCBmcm9tIHJlZHV4J3MgY3JlYXRlU3RvcmUgY29kZS5cbiAgLy8gVE9ETzogcmVmYWN0b3IrZXhwb3NlIHRoYXQgY29kZSB0byBiZSByZXVzYWJsZSBoZXJlP1xuICB2YXIgY3VycmVudCA9IFtdO1xuICB2YXIgbmV4dCA9IFtdO1xuXG4gIHJldHVybiB7XG4gICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgbmV4dCA9IENMRUFSRUQ7XG4gICAgICBjdXJyZW50ID0gQ0xFQVJFRDtcbiAgICB9LFxuICAgIG5vdGlmeTogZnVuY3Rpb24gbm90aWZ5KCkge1xuICAgICAgdmFyIGxpc3RlbmVycyA9IGN1cnJlbnQgPSBuZXh0O1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGlzdGVuZXJzW2ldKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgICAgdmFyIGlzU3Vic2NyaWJlZCA9IHRydWU7XG4gICAgICBpZiAobmV4dCA9PT0gY3VycmVudCkgbmV4dCA9IGN1cnJlbnQuc2xpY2UoKTtcbiAgICAgIG5leHQucHVzaChsaXN0ZW5lcik7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHtcbiAgICAgICAgaWYgKCFpc1N1YnNjcmliZWQgfHwgY3VycmVudCA9PT0gQ0xFQVJFRCkgcmV0dXJuO1xuICAgICAgICBpc1N1YnNjcmliZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAobmV4dCA9PT0gY3VycmVudCkgbmV4dCA9IGN1cnJlbnQuc2xpY2UoKTtcbiAgICAgICAgbmV4dC5zcGxpY2UobmV4dC5pbmRleE9mKGxpc3RlbmVyKSwgMSk7XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbn1cblxudmFyIFN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU3Vic2NyaXB0aW9uKHN0b3JlLCBwYXJlbnRTdWIsIG9uU3RhdGVDaGFuZ2UpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU3Vic2NyaXB0aW9uKTtcblxuICAgIHRoaXMuc3RvcmUgPSBzdG9yZTtcbiAgICB0aGlzLnBhcmVudFN1YiA9IHBhcmVudFN1YjtcbiAgICB0aGlzLm9uU3RhdGVDaGFuZ2UgPSBvblN0YXRlQ2hhbmdlO1xuICAgIHRoaXMudW5zdWJzY3JpYmUgPSBudWxsO1xuICAgIHRoaXMubGlzdGVuZXJzID0gbnVsbExpc3RlbmVycztcbiAgfVxuXG4gIFN1YnNjcmlwdGlvbi5wcm90b3R5cGUuYWRkTmVzdGVkU3ViID0gZnVuY3Rpb24gYWRkTmVzdGVkU3ViKGxpc3RlbmVyKSB7XG4gICAgdGhpcy50cnlTdWJzY3JpYmUoKTtcbiAgICByZXR1cm4gdGhpcy5saXN0ZW5lcnMuc3Vic2NyaWJlKGxpc3RlbmVyKTtcbiAgfTtcblxuICBTdWJzY3JpcHRpb24ucHJvdG90eXBlLm5vdGlmeU5lc3RlZFN1YnMgPSBmdW5jdGlvbiBub3RpZnlOZXN0ZWRTdWJzKCkge1xuICAgIHRoaXMubGlzdGVuZXJzLm5vdGlmeSgpO1xuICB9O1xuXG4gIFN1YnNjcmlwdGlvbi5wcm90b3R5cGUuaXNTdWJzY3JpYmVkID0gZnVuY3Rpb24gaXNTdWJzY3JpYmVkKCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMudW5zdWJzY3JpYmUpO1xuICB9O1xuXG4gIFN1YnNjcmlwdGlvbi5wcm90b3R5cGUudHJ5U3Vic2NyaWJlID0gZnVuY3Rpb24gdHJ5U3Vic2NyaWJlKCkge1xuICAgIGlmICghdGhpcy51bnN1YnNjcmliZSkge1xuICAgICAgdGhpcy51bnN1YnNjcmliZSA9IHRoaXMucGFyZW50U3ViID8gdGhpcy5wYXJlbnRTdWIuYWRkTmVzdGVkU3ViKHRoaXMub25TdGF0ZUNoYW5nZSkgOiB0aGlzLnN0b3JlLnN1YnNjcmliZSh0aGlzLm9uU3RhdGVDaGFuZ2UpO1xuXG4gICAgICB0aGlzLmxpc3RlbmVycyA9IGNyZWF0ZUxpc3RlbmVyQ29sbGVjdGlvbigpO1xuICAgIH1cbiAgfTtcblxuICBTdWJzY3JpcHRpb24ucHJvdG90eXBlLnRyeVVuc3Vic2NyaWJlID0gZnVuY3Rpb24gdHJ5VW5zdWJzY3JpYmUoKSB7XG4gICAgaWYgKHRoaXMudW5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUgPSBudWxsO1xuICAgICAgdGhpcy5saXN0ZW5lcnMuY2xlYXIoKTtcbiAgICAgIHRoaXMubGlzdGVuZXJzID0gbnVsbExpc3RlbmVycztcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFN1YnNjcmlwdGlvbjtcbn0oKTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gU3Vic2NyaXB0aW9uOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuZGVmYXVsdCA9IHNoYWxsb3dFcXVhbDtcbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5mdW5jdGlvbiBpcyh4LCB5KSB7XG4gIGlmICh4ID09PSB5KSB7XG4gICAgcmV0dXJuIHggIT09IDAgfHwgeSAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaGFsbG93RXF1YWwob2JqQSwgb2JqQikge1xuICBpZiAoaXMob2JqQSwgb2JqQikpIHJldHVybiB0cnVlO1xuXG4gIGlmICh0eXBlb2Ygb2JqQSAhPT0gJ29iamVjdCcgfHwgb2JqQSA9PT0gbnVsbCB8fCB0eXBlb2Ygb2JqQiAhPT0gJ29iamVjdCcgfHwgb2JqQiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICB2YXIga2V5c0IgPSBPYmplY3Qua2V5cyhvYmpCKTtcblxuICBpZiAoa2V5c0EubGVuZ3RoICE9PSBrZXlzQi5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXNBLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCFoYXNPd24uY2FsbChvYmpCLCBrZXlzQVtpXSkgfHwgIWlzKG9iakFba2V5c0FbaV1dLCBvYmpCW2tleXNBW2ldXSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHQgPSB2ZXJpZnlQbGFpbk9iamVjdDtcblxudmFyIF9pc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnbG9kYXNoL2lzUGxhaW5PYmplY3QnKTtcblxudmFyIF9pc1BsYWluT2JqZWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2lzUGxhaW5PYmplY3QpO1xuXG52YXIgX3dhcm5pbmcgPSByZXF1aXJlKCcuL3dhcm5pbmcnKTtcblxudmFyIF93YXJuaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3dhcm5pbmcpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiB2ZXJpZnlQbGFpbk9iamVjdCh2YWx1ZSwgZGlzcGxheU5hbWUsIG1ldGhvZE5hbWUpIHtcbiAgaWYgKCEoMCwgX2lzUGxhaW5PYmplY3QyLmRlZmF1bHQpKHZhbHVlKSkge1xuICAgICgwLCBfd2FybmluZzIuZGVmYXVsdCkobWV0aG9kTmFtZSArICcoKSBpbiAnICsgZGlzcGxheU5hbWUgKyAnIG11c3QgcmV0dXJuIGEgcGxhaW4gb2JqZWN0LiBJbnN0ZWFkIHJlY2VpdmVkICcgKyB2YWx1ZSArICcuJyk7XG4gIH1cbn0iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmRlZmF1bHQgPSB3YXJuaW5nO1xuLyoqXG4gKiBQcmludHMgYSB3YXJuaW5nIGluIHRoZSBjb25zb2xlIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuICB0cnkge1xuICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgaWYgeW91IGVuYWJsZVxuICAgIC8vIFwiYnJlYWsgb24gYWxsIGV4Y2VwdGlvbnNcIiBpbiB5b3VyIGNvbnNvbGUsXG4gICAgLy8gaXQgd291bGQgcGF1c2UgdGhlIGV4ZWN1dGlvbiBhdCB0aGlzIGxpbmUuXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWVtcHR5ICovXG4gIH0gY2F0Y2ggKGUpIHt9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tZW1wdHkgKi9cbn0iLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFJlYWN0Q2hpbGRyZW4gPSByZXF1aXJlKCcuL1JlYWN0Q2hpbGRyZW4nKTtcbnZhciBSZWFjdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnQnKTtcbnZhciBSZWFjdFB1cmVDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0UHVyZUNvbXBvbmVudCcpO1xudmFyIFJlYWN0Q2xhc3MgPSByZXF1aXJlKCcuL1JlYWN0Q2xhc3MnKTtcbnZhciBSZWFjdERPTUZhY3RvcmllcyA9IHJlcXVpcmUoJy4vUmVhY3RET01GYWN0b3JpZXMnKTtcbnZhciBSZWFjdEVsZW1lbnQgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudCcpO1xudmFyIFJlYWN0UHJvcFR5cGVzID0gcmVxdWlyZSgnLi9SZWFjdFByb3BUeXBlcycpO1xudmFyIFJlYWN0VmVyc2lvbiA9IHJlcXVpcmUoJy4vUmVhY3RWZXJzaW9uJyk7XG5cbnZhciBvbmx5Q2hpbGQgPSByZXF1aXJlKCcuL29ubHlDaGlsZCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBjcmVhdGVFbGVtZW50ID0gUmVhY3RFbGVtZW50LmNyZWF0ZUVsZW1lbnQ7XG52YXIgY3JlYXRlRmFjdG9yeSA9IFJlYWN0RWxlbWVudC5jcmVhdGVGYWN0b3J5O1xudmFyIGNsb25lRWxlbWVudCA9IFJlYWN0RWxlbWVudC5jbG9uZUVsZW1lbnQ7XG5cbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgY2FuRGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL2NhbkRlZmluZVByb3BlcnR5Jyk7XG4gIHZhciBSZWFjdEVsZW1lbnRWYWxpZGF0b3IgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudFZhbGlkYXRvcicpO1xuICB2YXIgZGlkV2FyblByb3BUeXBlc0RlcHJlY2F0ZWQgPSBmYWxzZTtcbiAgY3JlYXRlRWxlbWVudCA9IFJlYWN0RWxlbWVudFZhbGlkYXRvci5jcmVhdGVFbGVtZW50O1xuICBjcmVhdGVGYWN0b3J5ID0gUmVhY3RFbGVtZW50VmFsaWRhdG9yLmNyZWF0ZUZhY3Rvcnk7XG4gIGNsb25lRWxlbWVudCA9IFJlYWN0RWxlbWVudFZhbGlkYXRvci5jbG9uZUVsZW1lbnQ7XG59XG5cbnZhciBfX3NwcmVhZCA9IF9hc3NpZ247XG5cbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIF9fc3ByZWFkID0gZnVuY3Rpb24gKCkge1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyh3YXJuZWQsICdSZWFjdC5fX3NwcmVhZCBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuIFVzZSAnICsgJ09iamVjdC5hc3NpZ24gZGlyZWN0bHkgb3IgYW5vdGhlciBoZWxwZXIgZnVuY3Rpb24gd2l0aCBzaW1pbGFyICcgKyAnc2VtYW50aWNzLiBZb3UgbWF5IGJlIHNlZWluZyB0aGlzIHdhcm5pbmcgZHVlIHRvIHlvdXIgY29tcGlsZXIuICcgKyAnU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtc3ByZWFkLWRlcHJlY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuJykgOiB2b2lkIDA7XG4gICAgd2FybmVkID0gdHJ1ZTtcbiAgICByZXR1cm4gX2Fzc2lnbi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG52YXIgUmVhY3QgPSB7XG5cbiAgLy8gTW9kZXJuXG5cbiAgQ2hpbGRyZW46IHtcbiAgICBtYXA6IFJlYWN0Q2hpbGRyZW4ubWFwLFxuICAgIGZvckVhY2g6IFJlYWN0Q2hpbGRyZW4uZm9yRWFjaCxcbiAgICBjb3VudDogUmVhY3RDaGlsZHJlbi5jb3VudCxcbiAgICB0b0FycmF5OiBSZWFjdENoaWxkcmVuLnRvQXJyYXksXG4gICAgb25seTogb25seUNoaWxkXG4gIH0sXG5cbiAgQ29tcG9uZW50OiBSZWFjdENvbXBvbmVudCxcbiAgUHVyZUNvbXBvbmVudDogUmVhY3RQdXJlQ29tcG9uZW50LFxuXG4gIGNyZWF0ZUVsZW1lbnQ6IGNyZWF0ZUVsZW1lbnQsXG4gIGNsb25lRWxlbWVudDogY2xvbmVFbGVtZW50LFxuICBpc1ZhbGlkRWxlbWVudDogUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50LFxuXG4gIC8vIENsYXNzaWNcblxuICBQcm9wVHlwZXM6IFJlYWN0UHJvcFR5cGVzLFxuICBjcmVhdGVDbGFzczogUmVhY3RDbGFzcy5jcmVhdGVDbGFzcyxcbiAgY3JlYXRlRmFjdG9yeTogY3JlYXRlRmFjdG9yeSxcbiAgY3JlYXRlTWl4aW46IGZ1bmN0aW9uIChtaXhpbikge1xuICAgIC8vIEN1cnJlbnRseSBhIG5vb3AuIFdpbGwgYmUgdXNlZCB0byB2YWxpZGF0ZSBhbmQgdHJhY2UgbWl4aW5zLlxuICAgIHJldHVybiBtaXhpbjtcbiAgfSxcblxuICAvLyBUaGlzIGxvb2tzIERPTSBzcGVjaWZpYyBidXQgdGhlc2UgYXJlIGFjdHVhbGx5IGlzb21vcnBoaWMgaGVscGVyc1xuICAvLyBzaW5jZSB0aGV5IGFyZSBqdXN0IGdlbmVyYXRpbmcgRE9NIHN0cmluZ3MuXG4gIERPTTogUmVhY3RET01GYWN0b3JpZXMsXG5cbiAgdmVyc2lvbjogUmVhY3RWZXJzaW9uLFxuXG4gIC8vIERlcHJlY2F0ZWQgaG9vayBmb3IgSlNYIHNwcmVhZCwgZG9uJ3QgdXNlIHRoaXMgZm9yIGFueXRoaW5nLlxuICBfX3NwcmVhZDogX19zcHJlYWRcbn07XG5cbi8vIFRPRE86IEZpeCB0ZXN0cyBzbyB0aGF0IHRoaXMgZGVwcmVjYXRpb24gd2FybmluZyBkb2Vzbid0IGNhdXNlIGZhaWx1cmVzLlxuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIGlmIChjYW5EZWZpbmVQcm9wZXJ0eSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFjdCwgJ1Byb3BUeXBlcycsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZGlkV2FyblByb3BUeXBlc0RlcHJlY2F0ZWQsICdBY2Nlc3NpbmcgUHJvcFR5cGVzIHZpYSB0aGUgbWFpbiBSZWFjdCBwYWNrYWdlIGlzIGRlcHJlY2F0ZWQuIFVzZSAnICsgJ3RoZSBwcm9wLXR5cGVzIHBhY2thZ2UgZnJvbSBucG0gaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgICAgICAgZGlkV2FyblByb3BUeXBlc0RlcHJlY2F0ZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gUmVhY3RQcm9wVHlwZXM7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUG9vbGVkQ2xhc3MgPSByZXF1aXJlKCcuL1Bvb2xlZENsYXNzJyk7XG52YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTtcblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG52YXIgdHJhdmVyc2VBbGxDaGlsZHJlbiA9IHJlcXVpcmUoJy4vdHJhdmVyc2VBbGxDaGlsZHJlbicpO1xuXG52YXIgdHdvQXJndW1lbnRQb29sZXIgPSBQb29sZWRDbGFzcy50d29Bcmd1bWVudFBvb2xlcjtcbnZhciBmb3VyQXJndW1lbnRQb29sZXIgPSBQb29sZWRDbGFzcy5mb3VyQXJndW1lbnRQb29sZXI7XG5cbnZhciB1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCA9IC9cXC8rL2c7XG5mdW5jdGlvbiBlc2NhcGVVc2VyUHJvdmlkZWRLZXkodGV4dCkge1xuICByZXR1cm4gKCcnICsgdGV4dCkucmVwbGFjZSh1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCwgJyQmLycpO1xufVxuXG4vKipcbiAqIFBvb2xlZENsYXNzIHJlcHJlc2VudGluZyB0aGUgYm9va2tlZXBpbmcgYXNzb2NpYXRlZCB3aXRoIHBlcmZvcm1pbmcgYSBjaGlsZFxuICogdHJhdmVyc2FsLiBBbGxvd3MgYXZvaWRpbmcgYmluZGluZyBjYWxsYmFja3MuXG4gKlxuICogQGNvbnN0cnVjdG9yIEZvckVhY2hCb29rS2VlcGluZ1xuICogQHBhcmFtIHshZnVuY3Rpb259IGZvckVhY2hGdW5jdGlvbiBGdW5jdGlvbiB0byBwZXJmb3JtIHRyYXZlcnNhbCB3aXRoLlxuICogQHBhcmFtIHs/Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCB0byBwZXJmb3JtIGNvbnRleHQgd2l0aC5cbiAqL1xuZnVuY3Rpb24gRm9yRWFjaEJvb2tLZWVwaW5nKGZvckVhY2hGdW5jdGlvbiwgZm9yRWFjaENvbnRleHQpIHtcbiAgdGhpcy5mdW5jID0gZm9yRWFjaEZ1bmN0aW9uO1xuICB0aGlzLmNvbnRleHQgPSBmb3JFYWNoQ29udGV4dDtcbiAgdGhpcy5jb3VudCA9IDA7XG59XG5Gb3JFYWNoQm9va0tlZXBpbmcucHJvdG90eXBlLmRlc3RydWN0b3IgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZnVuYyA9IG51bGw7XG4gIHRoaXMuY29udGV4dCA9IG51bGw7XG4gIHRoaXMuY291bnQgPSAwO1xufTtcblBvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhGb3JFYWNoQm9va0tlZXBpbmcsIHR3b0FyZ3VtZW50UG9vbGVyKTtcblxuZnVuY3Rpb24gZm9yRWFjaFNpbmdsZUNoaWxkKGJvb2tLZWVwaW5nLCBjaGlsZCwgbmFtZSkge1xuICB2YXIgZnVuYyA9IGJvb2tLZWVwaW5nLmZ1bmMsXG4gICAgICBjb250ZXh0ID0gYm9va0tlZXBpbmcuY29udGV4dDtcblxuICBmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGJvb2tLZWVwaW5nLmNvdW50KyspO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jaGlsZHJlbi5mb3JlYWNoXG4gKlxuICogVGhlIHByb3ZpZGVkIGZvckVhY2hGdW5jKGNoaWxkLCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZvckVhY2hGdW5jXG4gKiBAcGFyYW0geyp9IGZvckVhY2hDb250ZXh0IENvbnRleHQgZm9yIGZvckVhY2hDb250ZXh0LlxuICovXG5mdW5jdGlvbiBmb3JFYWNoQ2hpbGRyZW4oY2hpbGRyZW4sIGZvckVhY2hGdW5jLCBmb3JFYWNoQ29udGV4dCkge1xuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkge1xuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuICB2YXIgdHJhdmVyc2VDb250ZXh0ID0gRm9yRWFjaEJvb2tLZWVwaW5nLmdldFBvb2xlZChmb3JFYWNoRnVuYywgZm9yRWFjaENvbnRleHQpO1xuICB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBmb3JFYWNoU2luZ2xlQ2hpbGQsIHRyYXZlcnNlQ29udGV4dCk7XG4gIEZvckVhY2hCb29rS2VlcGluZy5yZWxlYXNlKHRyYXZlcnNlQ29udGV4dCk7XG59XG5cbi8qKlxuICogUG9vbGVkQ2xhc3MgcmVwcmVzZW50aW5nIHRoZSBib29ra2VlcGluZyBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIGNoaWxkXG4gKiBtYXBwaW5nLiBBbGxvd3MgYXZvaWRpbmcgYmluZGluZyBjYWxsYmFja3MuXG4gKlxuICogQGNvbnN0cnVjdG9yIE1hcEJvb2tLZWVwaW5nXG4gKiBAcGFyYW0geyEqfSBtYXBSZXN1bHQgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG9yZGVyZWQgbWFwIG9mIHJlc3VsdHMuXG4gKiBAcGFyYW0geyFmdW5jdGlvbn0gbWFwRnVuY3Rpb24gRnVuY3Rpb24gdG8gcGVyZm9ybSBtYXBwaW5nIHdpdGguXG4gKiBAcGFyYW0gez8qfSBtYXBDb250ZXh0IENvbnRleHQgdG8gcGVyZm9ybSBtYXBwaW5nIHdpdGguXG4gKi9cbmZ1bmN0aW9uIE1hcEJvb2tLZWVwaW5nKG1hcFJlc3VsdCwga2V5UHJlZml4LCBtYXBGdW5jdGlvbiwgbWFwQ29udGV4dCkge1xuICB0aGlzLnJlc3VsdCA9IG1hcFJlc3VsdDtcbiAgdGhpcy5rZXlQcmVmaXggPSBrZXlQcmVmaXg7XG4gIHRoaXMuZnVuYyA9IG1hcEZ1bmN0aW9uO1xuICB0aGlzLmNvbnRleHQgPSBtYXBDb250ZXh0O1xuICB0aGlzLmNvdW50ID0gMDtcbn1cbk1hcEJvb2tLZWVwaW5nLnByb3RvdHlwZS5kZXN0cnVjdG9yID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLnJlc3VsdCA9IG51bGw7XG4gIHRoaXMua2V5UHJlZml4ID0gbnVsbDtcbiAgdGhpcy5mdW5jID0gbnVsbDtcbiAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgdGhpcy5jb3VudCA9IDA7XG59O1xuUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKE1hcEJvb2tLZWVwaW5nLCBmb3VyQXJndW1lbnRQb29sZXIpO1xuXG5mdW5jdGlvbiBtYXBTaW5nbGVDaGlsZEludG9Db250ZXh0KGJvb2tLZWVwaW5nLCBjaGlsZCwgY2hpbGRLZXkpIHtcbiAgdmFyIHJlc3VsdCA9IGJvb2tLZWVwaW5nLnJlc3VsdCxcbiAgICAgIGtleVByZWZpeCA9IGJvb2tLZWVwaW5nLmtleVByZWZpeCxcbiAgICAgIGZ1bmMgPSBib29rS2VlcGluZy5mdW5jLFxuICAgICAgY29udGV4dCA9IGJvb2tLZWVwaW5nLmNvbnRleHQ7XG5cblxuICB2YXIgbWFwcGVkQ2hpbGQgPSBmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGJvb2tLZWVwaW5nLmNvdW50KyspO1xuICBpZiAoQXJyYXkuaXNBcnJheShtYXBwZWRDaGlsZCkpIHtcbiAgICBtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsKG1hcHBlZENoaWxkLCByZXN1bHQsIGNoaWxkS2V5LCBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zQXJndW1lbnQpO1xuICB9IGVsc2UgaWYgKG1hcHBlZENoaWxkICE9IG51bGwpIHtcbiAgICBpZiAoUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KG1hcHBlZENoaWxkKSkge1xuICAgICAgbWFwcGVkQ2hpbGQgPSBSZWFjdEVsZW1lbnQuY2xvbmVBbmRSZXBsYWNlS2V5KG1hcHBlZENoaWxkLFxuICAgICAgLy8gS2VlcCBib3RoIHRoZSAobWFwcGVkKSBhbmQgb2xkIGtleXMgaWYgdGhleSBkaWZmZXIsIGp1c3QgYXNcbiAgICAgIC8vIHRyYXZlcnNlQWxsQ2hpbGRyZW4gdXNlZCB0byBkbyBmb3Igb2JqZWN0cyBhcyBjaGlsZHJlblxuICAgICAga2V5UHJlZml4ICsgKG1hcHBlZENoaWxkLmtleSAmJiAoIWNoaWxkIHx8IGNoaWxkLmtleSAhPT0gbWFwcGVkQ2hpbGQua2V5KSA/IGVzY2FwZVVzZXJQcm92aWRlZEtleShtYXBwZWRDaGlsZC5rZXkpICsgJy8nIDogJycpICsgY2hpbGRLZXkpO1xuICAgIH1cbiAgICByZXN1bHQucHVzaChtYXBwZWRDaGlsZCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbChjaGlsZHJlbiwgYXJyYXksIHByZWZpeCwgZnVuYywgY29udGV4dCkge1xuICB2YXIgZXNjYXBlZFByZWZpeCA9ICcnO1xuICBpZiAocHJlZml4ICE9IG51bGwpIHtcbiAgICBlc2NhcGVkUHJlZml4ID0gZXNjYXBlVXNlclByb3ZpZGVkS2V5KHByZWZpeCkgKyAnLyc7XG4gIH1cbiAgdmFyIHRyYXZlcnNlQ29udGV4dCA9IE1hcEJvb2tLZWVwaW5nLmdldFBvb2xlZChhcnJheSwgZXNjYXBlZFByZWZpeCwgZnVuYywgY29udGV4dCk7XG4gIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIG1hcFNpbmdsZUNoaWxkSW50b0NvbnRleHQsIHRyYXZlcnNlQ29udGV4dCk7XG4gIE1hcEJvb2tLZWVwaW5nLnJlbGVhc2UodHJhdmVyc2VDb250ZXh0KTtcbn1cblxuLyoqXG4gKiBNYXBzIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuY2hpbGRyZW4ubWFwXG4gKlxuICogVGhlIHByb3ZpZGVkIG1hcEZ1bmN0aW9uKGNoaWxkLCBrZXksIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZnVuYyBUaGUgbWFwIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgZm9yIG1hcEZ1bmN0aW9uLlxuICogQHJldHVybiB7b2JqZWN0fSBPYmplY3QgY29udGFpbmluZyB0aGUgb3JkZXJlZCBtYXAgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gbWFwQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmMsIGNvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsKGNoaWxkcmVuLCByZXN1bHQsIG51bGwsIGZ1bmMsIGNvbnRleHQpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmb3JFYWNoU2luZ2xlQ2hpbGREdW1teSh0cmF2ZXJzZUNvbnRleHQsIGNoaWxkLCBuYW1lKSB7XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIENvdW50IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhc1xuICogYHByb3BzLmNoaWxkcmVuYC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuY2hpbGRyZW4uY291bnRcbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiBjaGlsZHJlbi5cbiAqL1xuZnVuY3Rpb24gY291bnRDaGlsZHJlbihjaGlsZHJlbiwgY29udGV4dCkge1xuICByZXR1cm4gdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaFNpbmdsZUNoaWxkRHVtbXksIG51bGwpO1xufVxuXG4vKipcbiAqIEZsYXR0ZW4gYSBjaGlsZHJlbiBvYmplY3QgKHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCkgYW5kXG4gKiByZXR1cm4gYW4gYXJyYXkgd2l0aCBhcHByb3ByaWF0ZWx5IHJlLWtleWVkIGNoaWxkcmVuLlxuICpcbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jaGlsZHJlbi50b2FycmF5XG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXkoY2hpbGRyZW4pIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsKGNoaWxkcmVuLCByZXN1bHQsIG51bGwsIGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNBcmd1bWVudCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbnZhciBSZWFjdENoaWxkcmVuID0ge1xuICBmb3JFYWNoOiBmb3JFYWNoQ2hpbGRyZW4sXG4gIG1hcDogbWFwQ2hpbGRyZW4sXG4gIG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWw6IG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwsXG4gIGNvdW50OiBjb3VudENoaWxkcmVuLFxuICB0b0FycmF5OiB0b0FycmF5XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q2hpbGRyZW47IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKSxcbiAgICBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3RDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50Jyk7XG52YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTtcbnZhciBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcyA9IHJlcXVpcmUoJy4vUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMnKTtcbnZhciBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHJlcXVpcmUoJy4vUmVhY3ROb29wVXBkYXRlUXVldWUnKTtcblxudmFyIGVtcHR5T2JqZWN0ID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlPYmplY3QnKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgTUlYSU5TX0tFWSA9ICdtaXhpbnMnO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gYWxsb3cgdGhlIGNyZWF0aW9uIG9mIGFub255bW91cyBmdW5jdGlvbnMgd2hpY2ggZG8gbm90XG4vLyBoYXZlIC5uYW1lIHNldCB0byB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgYmVpbmcgYXNzaWduZWQgdG8uXG5mdW5jdGlvbiBpZGVudGl0eShmbikge1xuICByZXR1cm4gZm47XG59XG5cbi8qKlxuICogUG9saWNpZXMgdGhhdCBkZXNjcmliZSBtZXRob2RzIGluIGBSZWFjdENsYXNzSW50ZXJmYWNlYC5cbiAqL1xuXG5cbnZhciBpbmplY3RlZE1peGlucyA9IFtdO1xuXG4vKipcbiAqIENvbXBvc2l0ZSBjb21wb25lbnRzIGFyZSBoaWdoZXItbGV2ZWwgY29tcG9uZW50cyB0aGF0IGNvbXBvc2Ugb3RoZXIgY29tcG9zaXRlXG4gKiBvciBob3N0IGNvbXBvbmVudHMuXG4gKlxuICogVG8gY3JlYXRlIGEgbmV3IHR5cGUgb2YgYFJlYWN0Q2xhc3NgLCBwYXNzIGEgc3BlY2lmaWNhdGlvbiBvZlxuICogeW91ciBuZXcgY2xhc3MgdG8gYFJlYWN0LmNyZWF0ZUNsYXNzYC4gVGhlIG9ubHkgcmVxdWlyZW1lbnQgb2YgeW91ciBjbGFzc1xuICogc3BlY2lmaWNhdGlvbiBpcyB0aGF0IHlvdSBpbXBsZW1lbnQgYSBgcmVuZGVyYCBtZXRob2QuXG4gKlxuICogICB2YXIgTXlDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gKiAgICAgcmVuZGVyOiBmdW5jdGlvbigpIHtcbiAqICAgICAgIHJldHVybiA8ZGl2PkhlbGxvIFdvcmxkPC9kaXY+O1xuICogICAgIH1cbiAqICAgfSk7XG4gKlxuICogVGhlIGNsYXNzIHNwZWNpZmljYXRpb24gc3VwcG9ydHMgYSBzcGVjaWZpYyBwcm90b2NvbCBvZiBtZXRob2RzIHRoYXQgaGF2ZVxuICogc3BlY2lhbCBtZWFuaW5nIChlLmcuIGByZW5kZXJgKS4gU2VlIGBSZWFjdENsYXNzSW50ZXJmYWNlYCBmb3JcbiAqIG1vcmUgdGhlIGNvbXByZWhlbnNpdmUgcHJvdG9jb2wuIEFueSBvdGhlciBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIGluIHRoZVxuICogY2xhc3Mgc3BlY2lmaWNhdGlvbiB3aWxsIGJlIGF2YWlsYWJsZSBvbiB0aGUgcHJvdG90eXBlLlxuICpcbiAqIEBpbnRlcmZhY2UgUmVhY3RDbGFzc0ludGVyZmFjZVxuICogQGludGVybmFsXG4gKi9cbnZhciBSZWFjdENsYXNzSW50ZXJmYWNlID0ge1xuXG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBNaXhpbiBvYmplY3RzIHRvIGluY2x1ZGUgd2hlbiBkZWZpbmluZyB5b3VyIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHR5cGUge2FycmF5fVxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIG1peGluczogJ0RFRklORV9NQU5ZJyxcblxuICAvKipcbiAgICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydGllcyBhbmQgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBkZWZpbmVkIG9uXG4gICAqIHRoZSBjb21wb25lbnQncyBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIGl0cyBwcm90b3R5cGUgKHN0YXRpYyBtZXRob2RzKS5cbiAgICpcbiAgICogQHR5cGUge29iamVjdH1cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBzdGF0aWNzOiAnREVGSU5FX01BTlknLFxuXG4gIC8qKlxuICAgKiBEZWZpbml0aW9uIG9mIHByb3AgdHlwZXMgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKlxuICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIHByb3BUeXBlczogJ0RFRklORV9NQU5ZJyxcblxuICAvKipcbiAgICogRGVmaW5pdGlvbiBvZiBjb250ZXh0IHR5cGVzIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHR5cGUge29iamVjdH1cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBjb250ZXh0VHlwZXM6ICdERUZJTkVfTUFOWScsXG5cbiAgLyoqXG4gICAqIERlZmluaXRpb24gb2YgY29udGV4dCB0eXBlcyB0aGlzIGNvbXBvbmVudCBzZXRzIGZvciBpdHMgY2hpbGRyZW4uXG4gICAqXG4gICAqIEB0eXBlIHtvYmplY3R9XG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgY2hpbGRDb250ZXh0VHlwZXM6ICdERUZJTkVfTUFOWScsXG5cbiAgLy8gPT09PSBEZWZpbml0aW9uIG1ldGhvZHMgPT09PVxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBtb3VudGVkLiBWYWx1ZXMgaW4gdGhlIG1hcHBpbmcgd2lsbCBiZSBzZXQgb25cbiAgICogYHRoaXMucHJvcHNgIGlmIHRoYXQgcHJvcCBpcyBub3Qgc3BlY2lmaWVkIChpLmUuIHVzaW5nIGFuIGBpbmAgY2hlY2spLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJlZm9yZSBgZ2V0SW5pdGlhbFN0YXRlYCBhbmQgdGhlcmVmb3JlIGNhbm5vdCByZWx5XG4gICAqIG9uIGB0aGlzLnN0YXRlYCBvciB1c2UgYHRoaXMuc2V0U3RhdGVgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgZ2V0RGVmYXVsdFByb3BzOiAnREVGSU5FX01BTllfTUVSR0VEJyxcblxuICAvKipcbiAgICogSW52b2tlZCBvbmNlIGJlZm9yZSB0aGUgY29tcG9uZW50IGlzIG1vdW50ZWQuIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSB1c2VkXG4gICAqIGFzIHRoZSBpbml0aWFsIHZhbHVlIG9mIGB0aGlzLnN0YXRlYC5cbiAgICpcbiAgICogICBnZXRJbml0aWFsU3RhdGU6IGZ1bmN0aW9uKCkge1xuICAgKiAgICAgcmV0dXJuIHtcbiAgICogICAgICAgaXNPbjogZmFsc2UsXG4gICAqICAgICAgIGZvb0JhejogbmV3IEJhekZvbygpXG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgZ2V0SW5pdGlhbFN0YXRlOiAnREVGSU5FX01BTllfTUVSR0VEJyxcblxuICAvKipcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIGdldENoaWxkQ29udGV4dDogJ0RFRklORV9NQU5ZX01FUkdFRCcsXG5cbiAgLyoqXG4gICAqIFVzZXMgcHJvcHMgZnJvbSBgdGhpcy5wcm9wc2AgYW5kIHN0YXRlIGZyb20gYHRoaXMuc3RhdGVgIHRvIHJlbmRlciB0aGVcbiAgICogc3RydWN0dXJlIG9mIHRoZSBjb21wb25lbnQuXG4gICAqXG4gICAqIE5vIGd1YXJhbnRlZXMgYXJlIG1hZGUgYWJvdXQgd2hlbiBvciBob3cgb2Z0ZW4gdGhpcyBtZXRob2QgaXMgaW52b2tlZCwgc29cbiAgICogaXQgbXVzdCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMuXG4gICAqXG4gICAqICAgcmVuZGVyOiBmdW5jdGlvbigpIHtcbiAgICogICAgIHZhciBuYW1lID0gdGhpcy5wcm9wcy5uYW1lO1xuICAgKiAgICAgcmV0dXJuIDxkaXY+SGVsbG8sIHtuYW1lfSE8L2Rpdj47XG4gICAqICAgfVxuICAgKlxuICAgKiBAcmV0dXJuIHtSZWFjdENvbXBvbmVudH1cbiAgICogQHJlcXVpcmVkXG4gICAqL1xuICByZW5kZXI6ICdERUZJTkVfT05DRScsXG5cbiAgLy8gPT09PSBEZWxlZ2F0ZSBtZXRob2RzID09PT1cblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgaW5pdGlhbGx5IGNyZWF0ZWQgYW5kIGFib3V0IHRvIGJlIG1vdW50ZWQuXG4gICAqIFRoaXMgbWF5IGhhdmUgc2lkZSBlZmZlY3RzLCBidXQgYW55IGV4dGVybmFsIHN1YnNjcmlwdGlvbnMgb3IgZGF0YSBjcmVhdGVkXG4gICAqIGJ5IHRoaXMgbWV0aG9kIG11c3QgYmUgY2xlYW5lZCB1cCBpbiBgY29tcG9uZW50V2lsbFVubW91bnRgLlxuICAgKlxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIGNvbXBvbmVudFdpbGxNb3VudDogJ0RFRklORV9NQU5ZJyxcblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gbW91bnRlZCBhbmQgaGFzIGEgRE9NIHJlcHJlc2VudGF0aW9uLlxuICAgKiBIb3dldmVyLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUgRE9NIG5vZGUgaXMgaW4gdGhlIGRvY3VtZW50LlxuICAgKlxuICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBvcGVyYXRlIG9uIHRoZSBET00gd2hlbiB0aGUgY29tcG9uZW50IGhhc1xuICAgKiBiZWVuIG1vdW50ZWQgKGluaXRpYWxpemVkIGFuZCByZW5kZXJlZCkgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IHJvb3ROb2RlIERPTSBlbGVtZW50IHJlcHJlc2VudGluZyB0aGUgY29tcG9uZW50LlxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIGNvbXBvbmVudERpZE1vdW50OiAnREVGSU5FX01BTlknLFxuXG4gIC8qKlxuICAgKiBJbnZva2VkIGJlZm9yZSB0aGUgY29tcG9uZW50IHJlY2VpdmVzIG5ldyBwcm9wcy5cbiAgICpcbiAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcmVhY3QgdG8gYSBwcm9wIHRyYW5zaXRpb24gYnkgdXBkYXRpbmcgdGhlXG4gICAqIHN0YXRlIHVzaW5nIGB0aGlzLnNldFN0YXRlYC4gQ3VycmVudCBwcm9wcyBhcmUgYWNjZXNzZWQgdmlhIGB0aGlzLnByb3BzYC5cbiAgICpcbiAgICogICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiBmdW5jdGlvbihuZXh0UHJvcHMsIG5leHRDb250ZXh0KSB7XG4gICAqICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICogICAgICAgbGlrZXNJbmNyZWFzaW5nOiBuZXh0UHJvcHMubGlrZUNvdW50ID4gdGhpcy5wcm9wcy5saWtlQ291bnRcbiAgICogICAgIH0pO1xuICAgKiAgIH1cbiAgICpcbiAgICogTk9URTogVGhlcmUgaXMgbm8gZXF1aXZhbGVudCBgY29tcG9uZW50V2lsbFJlY2VpdmVTdGF0ZWAuIEFuIGluY29taW5nIHByb3BcbiAgICogdHJhbnNpdGlvbiBtYXkgY2F1c2UgYSBzdGF0ZSBjaGFuZ2UsIGJ1dCB0aGUgb3Bwb3NpdGUgaXMgbm90IHRydWUuIElmIHlvdVxuICAgKiBuZWVkIGl0LCB5b3UgYXJlIHByb2JhYmx5IGxvb2tpbmcgZm9yIGBjb21wb25lbnRXaWxsVXBkYXRlYC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9wc1xuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6ICdERUZJTkVfTUFOWScsXG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hpbGUgZGVjaWRpbmcgaWYgdGhlIGNvbXBvbmVudCBzaG91bGQgYmUgdXBkYXRlZCBhcyBhIHJlc3VsdCBvZlxuICAgKiByZWNlaXZpbmcgbmV3IHByb3BzLCBzdGF0ZSBhbmQvb3IgY29udGV4dC5cbiAgICpcbiAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gYHJldHVybiBmYWxzZWAgd2hlbiB5b3UncmUgY2VydGFpbiB0aGF0IHRoZVxuICAgKiB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgcHJvcHMvc3RhdGUvY29udGV4dCB3aWxsIG5vdCByZXF1aXJlIGEgY29tcG9uZW50XG4gICAqIHVwZGF0ZS5cbiAgICpcbiAgICogICBzaG91bGRDb21wb25lbnRVcGRhdGU6IGZ1bmN0aW9uKG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCkge1xuICAgKiAgICAgcmV0dXJuICFlcXVhbChuZXh0UHJvcHMsIHRoaXMucHJvcHMpIHx8XG4gICAqICAgICAgICFlcXVhbChuZXh0U3RhdGUsIHRoaXMuc3RhdGUpIHx8XG4gICAqICAgICAgICFlcXVhbChuZXh0Q29udGV4dCwgdGhpcy5jb250ZXh0KTtcbiAgICogICB9XG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBuZXh0UHJvcHNcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0U3RhdGVcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0Q29udGV4dFxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBjb21wb25lbnQgc2hvdWxkIHVwZGF0ZS5cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBzaG91bGRDb21wb25lbnRVcGRhdGU6ICdERUZJTkVfT05DRScsXG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGFib3V0IHRvIHVwZGF0ZSBkdWUgdG8gYSB0cmFuc2l0aW9uIGZyb21cbiAgICogYHRoaXMucHJvcHNgLCBgdGhpcy5zdGF0ZWAgYW5kIGB0aGlzLmNvbnRleHRgIHRvIGBuZXh0UHJvcHNgLCBgbmV4dFN0YXRlYFxuICAgKiBhbmQgYG5leHRDb250ZXh0YC5cbiAgICpcbiAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gcGVyZm9ybSBwcmVwYXJhdGlvbiBiZWZvcmUgYW4gdXBkYXRlIG9jY3Vycy5cbiAgICpcbiAgICogTk9URTogWW91ICoqY2Fubm90KiogdXNlIGB0aGlzLnNldFN0YXRlKClgIGluIHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gbmV4dFByb3BzXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dFN0YXRlXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dENvbnRleHRcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIGNvbXBvbmVudFdpbGxVcGRhdGU6ICdERUZJTkVfTUFOWScsXG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50J3MgRE9NIHJlcHJlc2VudGF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQuXG4gICAqXG4gICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIG9wZXJhdGUgb24gdGhlIERPTSB3aGVuIHRoZSBjb21wb25lbnQgaGFzXG4gICAqIGJlZW4gdXBkYXRlZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHByZXZQcm9wc1xuICAgKiBAcGFyYW0gez9vYmplY3R9IHByZXZTdGF0ZVxuICAgKiBAcGFyYW0gez9vYmplY3R9IHByZXZDb250ZXh0XG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gcm9vdE5vZGUgRE9NIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBjb21wb25lbnQuXG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgY29tcG9uZW50RGlkVXBkYXRlOiAnREVGSU5FX01BTlknLFxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBhYm91dCB0byBiZSByZW1vdmVkIGZyb20gaXRzIHBhcmVudCBhbmQgaGF2ZVxuICAgKiBpdHMgRE9NIHJlcHJlc2VudGF0aW9uIGRlc3Ryb3llZC5cbiAgICpcbiAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gZGVhbGxvY2F0ZSBhbnkgZXh0ZXJuYWwgcmVzb3VyY2VzLlxuICAgKlxuICAgKiBOT1RFOiBUaGVyZSBpcyBubyBgY29tcG9uZW50RGlkVW5tb3VudGAgc2luY2UgeW91ciBjb21wb25lbnQgd2lsbCBoYXZlIGJlZW5cbiAgICogZGVzdHJveWVkIGJ5IHRoYXQgcG9pbnQuXG4gICAqXG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgY29tcG9uZW50V2lsbFVubW91bnQ6ICdERUZJTkVfTUFOWScsXG5cbiAgLy8gPT09PSBBZHZhbmNlZCBtZXRob2RzID09PT1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgY29tcG9uZW50J3MgY3VycmVudGx5IG1vdW50ZWQgRE9NIHJlcHJlc2VudGF0aW9uLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGlzIGltcGxlbWVudHMgUmVhY3QncyByZW5kZXJpbmcgYW5kIHJlY29uY2lsaWF0aW9uIGFsZ29yaXRobS5cbiAgICogU29waGlzdGljYXRlZCBjbGllbnRzIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQGludGVybmFsXG4gICAqIEBvdmVycmlkYWJsZVxuICAgKi9cbiAgdXBkYXRlQ29tcG9uZW50OiAnT1ZFUlJJREVfQkFTRSdcblxufTtcblxuLyoqXG4gKiBNYXBwaW5nIGZyb20gY2xhc3Mgc3BlY2lmaWNhdGlvbiBrZXlzIHRvIHNwZWNpYWwgcHJvY2Vzc2luZyBmdW5jdGlvbnMuXG4gKlxuICogQWx0aG91Z2ggdGhlc2UgYXJlIGRlY2xhcmVkIGxpa2UgaW5zdGFuY2UgcHJvcGVydGllcyBpbiB0aGUgc3BlY2lmaWNhdGlvblxuICogd2hlbiBkZWZpbmluZyBjbGFzc2VzIHVzaW5nIGBSZWFjdC5jcmVhdGVDbGFzc2AsIHRoZXkgYXJlIGFjdHVhbGx5IHN0YXRpY1xuICogYW5kIGFyZSBhY2Nlc3NpYmxlIG9uIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkIG9mIHRoZSBwcm90b3R5cGUuIERlc3BpdGVcbiAqIGJlaW5nIHN0YXRpYywgdGhleSBtdXN0IGJlIGRlZmluZWQgb3V0c2lkZSBvZiB0aGUgXCJzdGF0aWNzXCIga2V5IHVuZGVyXG4gKiB3aGljaCBhbGwgb3RoZXIgc3RhdGljIG1ldGhvZHMgYXJlIGRlZmluZWQuXG4gKi9cbnZhciBSRVNFUlZFRF9TUEVDX0tFWVMgPSB7XG4gIGRpc3BsYXlOYW1lOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIGRpc3BsYXlOYW1lKSB7XG4gICAgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgfSxcbiAgbWl4aW5zOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIG1peGlucykge1xuICAgIGlmIChtaXhpbnMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWl4aW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1peFNwZWNJbnRvQ29tcG9uZW50KENvbnN0cnVjdG9yLCBtaXhpbnNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgY2hpbGRDb250ZXh0VHlwZXM6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgY2hpbGRDb250ZXh0VHlwZXMpIHtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhbGlkYXRlVHlwZURlZihDb25zdHJ1Y3RvciwgY2hpbGRDb250ZXh0VHlwZXMsICdjaGlsZENvbnRleHQnKTtcbiAgICB9XG4gICAgQ29uc3RydWN0b3IuY2hpbGRDb250ZXh0VHlwZXMgPSBfYXNzaWduKHt9LCBDb25zdHJ1Y3Rvci5jaGlsZENvbnRleHRUeXBlcywgY2hpbGRDb250ZXh0VHlwZXMpO1xuICB9LFxuICBjb250ZXh0VHlwZXM6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgY29udGV4dFR5cGVzKSB7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YWxpZGF0ZVR5cGVEZWYoQ29uc3RydWN0b3IsIGNvbnRleHRUeXBlcywgJ2NvbnRleHQnKTtcbiAgICB9XG4gICAgQ29uc3RydWN0b3IuY29udGV4dFR5cGVzID0gX2Fzc2lnbih7fSwgQ29uc3RydWN0b3IuY29udGV4dFR5cGVzLCBjb250ZXh0VHlwZXMpO1xuICB9LFxuICAvKipcbiAgICogU3BlY2lhbCBjYXNlIGdldERlZmF1bHRQcm9wcyB3aGljaCBzaG91bGQgbW92ZSBpbnRvIHN0YXRpY3MgYnV0IHJlcXVpcmVzXG4gICAqIGF1dG9tYXRpYyBtZXJnaW5nLlxuICAgKi9cbiAgZ2V0RGVmYXVsdFByb3BzOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIGdldERlZmF1bHRQcm9wcykge1xuICAgIGlmIChDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMpIHtcbiAgICAgIENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcyA9IGNyZWF0ZU1lcmdlZFJlc3VsdEZ1bmN0aW9uKENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcywgZ2V0RGVmYXVsdFByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzID0gZ2V0RGVmYXVsdFByb3BzO1xuICAgIH1cbiAgfSxcbiAgcHJvcFR5cGVzOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3BUeXBlcykge1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFsaWRhdGVUeXBlRGVmKENvbnN0cnVjdG9yLCBwcm9wVHlwZXMsICdwcm9wJyk7XG4gICAgfVxuICAgIENvbnN0cnVjdG9yLnByb3BUeXBlcyA9IF9hc3NpZ24oe30sIENvbnN0cnVjdG9yLnByb3BUeXBlcywgcHJvcFR5cGVzKTtcbiAgfSxcbiAgc3RhdGljczogZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBzdGF0aWNzKSB7XG4gICAgbWl4U3RhdGljU3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIHN0YXRpY3MpO1xuICB9LFxuICBhdXRvYmluZDogZnVuY3Rpb24gKCkge30gfTtcblxuZnVuY3Rpb24gdmFsaWRhdGVUeXBlRGVmKENvbnN0cnVjdG9yLCB0eXBlRGVmLCBsb2NhdGlvbikge1xuICBmb3IgKHZhciBwcm9wTmFtZSBpbiB0eXBlRGVmKSB7XG4gICAgaWYgKHR5cGVEZWYuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAvLyB1c2UgYSB3YXJuaW5nIGluc3RlYWQgb2YgYW4gaW52YXJpYW50IHNvIGNvbXBvbmVudHNcbiAgICAgIC8vIGRvbid0IHNob3cgdXAgaW4gcHJvZCBidXQgb25seSBpbiBfX0RFVl9fXG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcodHlwZW9mIHR5cGVEZWZbcHJvcE5hbWVdID09PSAnZnVuY3Rpb24nLCAnJXM6ICVzIHR5cGUgYCVzYCBpcyBpbnZhbGlkOyBpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSAnICsgJ1JlYWN0LlByb3BUeXBlcy4nLCBDb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCAnUmVhY3RDbGFzcycsIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXSwgcHJvcE5hbWUpIDogdm9pZCAwO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZU1ldGhvZE92ZXJyaWRlKGlzQWxyZWFkeURlZmluZWQsIG5hbWUpIHtcbiAgdmFyIHNwZWNQb2xpY3kgPSBSZWFjdENsYXNzSW50ZXJmYWNlLmhhc093blByb3BlcnR5KG5hbWUpID8gUmVhY3RDbGFzc0ludGVyZmFjZVtuYW1lXSA6IG51bGw7XG5cbiAgLy8gRGlzYWxsb3cgb3ZlcnJpZGluZyBvZiBiYXNlIGNsYXNzIG1ldGhvZHMgdW5sZXNzIGV4cGxpY2l0bHkgYWxsb3dlZC5cbiAgaWYgKFJlYWN0Q2xhc3NNaXhpbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICEoc3BlY1BvbGljeSA9PT0gJ09WRVJSSURFX0JBU0UnKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RDbGFzc0ludGVyZmFjZTogWW91IGFyZSBhdHRlbXB0aW5nIHRvIG92ZXJyaWRlIGAlc2AgZnJvbSB5b3VyIGNsYXNzIHNwZWNpZmljYXRpb24uIEVuc3VyZSB0aGF0IHlvdXIgbWV0aG9kIG5hbWVzIGRvIG5vdCBvdmVybGFwIHdpdGggUmVhY3QgbWV0aG9kcy4nLCBuYW1lKSA6IF9wcm9kSW52YXJpYW50KCc3MycsIG5hbWUpIDogdm9pZCAwO1xuICB9XG5cbiAgLy8gRGlzYWxsb3cgZGVmaW5pbmcgbWV0aG9kcyBtb3JlIHRoYW4gb25jZSB1bmxlc3MgZXhwbGljaXRseSBhbGxvd2VkLlxuICBpZiAoaXNBbHJlYWR5RGVmaW5lZCkge1xuICAgICEoc3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5ZJyB8fCBzcGVjUG9saWN5ID09PSAnREVGSU5FX01BTllfTUVSR0VEJykgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q2xhc3NJbnRlcmZhY2U6IFlvdSBhcmUgYXR0ZW1wdGluZyB0byBkZWZpbmUgYCVzYCBvbiB5b3VyIGNvbXBvbmVudCBtb3JlIHRoYW4gb25jZS4gVGhpcyBjb25mbGljdCBtYXkgYmUgZHVlIHRvIGEgbWl4aW4uJywgbmFtZSkgOiBfcHJvZEludmFyaWFudCgnNzQnLCBuYW1lKSA6IHZvaWQgMDtcbiAgfVxufVxuXG4vKipcbiAqIE1peGluIGhlbHBlciB3aGljaCBoYW5kbGVzIHBvbGljeSB2YWxpZGF0aW9uIGFuZCByZXNlcnZlZFxuICogc3BlY2lmaWNhdGlvbiBrZXlzIHdoZW4gYnVpbGRpbmcgUmVhY3QgY2xhc3Nlcy5cbiAqL1xuZnVuY3Rpb24gbWl4U3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIHNwZWMpIHtcbiAgaWYgKCFzcGVjKSB7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgdHlwZW9mU3BlYyA9IHR5cGVvZiBzcGVjO1xuICAgICAgdmFyIGlzTWl4aW5WYWxpZCA9IHR5cGVvZlNwZWMgPT09ICdvYmplY3QnICYmIHNwZWMgIT09IG51bGw7XG5cbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhpc01peGluVmFsaWQsICclczogWW91XFwncmUgYXR0ZW1wdGluZyB0byBpbmNsdWRlIGEgbWl4aW4gdGhhdCBpcyBlaXRoZXIgbnVsbCAnICsgJ29yIG5vdCBhbiBvYmplY3QuIENoZWNrIHRoZSBtaXhpbnMgaW5jbHVkZWQgYnkgdGhlIGNvbXBvbmVudCwgJyArICdhcyB3ZWxsIGFzIGFueSBtaXhpbnMgdGhleSBpbmNsdWRlIHRoZW1zZWx2ZXMuICcgKyAnRXhwZWN0ZWQgb2JqZWN0IGJ1dCBnb3QgJXMuJywgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgJ1JlYWN0Q2xhc3MnLCBzcGVjID09PSBudWxsID8gbnVsbCA6IHR5cGVvZlNwZWMpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gICEodHlwZW9mIHNwZWMgIT09ICdmdW5jdGlvbicpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdENsYXNzOiBZb3VcXCdyZSBhdHRlbXB0aW5nIHRvIHVzZSBhIGNvbXBvbmVudCBjbGFzcyBvciBmdW5jdGlvbiBhcyBhIG1peGluLiBJbnN0ZWFkLCBqdXN0IHVzZSBhIHJlZ3VsYXIgb2JqZWN0LicpIDogX3Byb2RJbnZhcmlhbnQoJzc1JykgOiB2b2lkIDA7XG4gICEhUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KHNwZWMpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdENsYXNzOiBZb3VcXCdyZSBhdHRlbXB0aW5nIHRvIHVzZSBhIGNvbXBvbmVudCBhcyBhIG1peGluLiBJbnN0ZWFkLCBqdXN0IHVzZSBhIHJlZ3VsYXIgb2JqZWN0LicpIDogX3Byb2RJbnZhcmlhbnQoJzc2JykgOiB2b2lkIDA7XG5cbiAgdmFyIHByb3RvID0gQ29uc3RydWN0b3IucHJvdG90eXBlO1xuICB2YXIgYXV0b0JpbmRQYWlycyA9IHByb3RvLl9fcmVhY3RBdXRvQmluZFBhaXJzO1xuXG4gIC8vIEJ5IGhhbmRsaW5nIG1peGlucyBiZWZvcmUgYW55IG90aGVyIHByb3BlcnRpZXMsIHdlIGVuc3VyZSB0aGUgc2FtZVxuICAvLyBjaGFpbmluZyBvcmRlciBpcyBhcHBsaWVkIHRvIG1ldGhvZHMgd2l0aCBERUZJTkVfTUFOWSBwb2xpY3ksIHdoZXRoZXJcbiAgLy8gbWl4aW5zIGFyZSBsaXN0ZWQgYmVmb3JlIG9yIGFmdGVyIHRoZXNlIG1ldGhvZHMgaW4gdGhlIHNwZWMuXG4gIGlmIChzcGVjLmhhc093blByb3BlcnR5KE1JWElOU19LRVkpKSB7XG4gICAgUkVTRVJWRURfU1BFQ19LRVlTLm1peGlucyhDb25zdHJ1Y3Rvciwgc3BlYy5taXhpbnMpO1xuICB9XG5cbiAgZm9yICh2YXIgbmFtZSBpbiBzcGVjKSB7XG4gICAgaWYgKCFzcGVjLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobmFtZSA9PT0gTUlYSU5TX0tFWSkge1xuICAgICAgLy8gV2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWQgbWl4aW5zIGluIGEgc3BlY2lhbCBjYXNlIGFib3ZlLlxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIHByb3BlcnR5ID0gc3BlY1tuYW1lXTtcbiAgICB2YXIgaXNBbHJlYWR5RGVmaW5lZCA9IHByb3RvLmhhc093blByb3BlcnR5KG5hbWUpO1xuICAgIHZhbGlkYXRlTWV0aG9kT3ZlcnJpZGUoaXNBbHJlYWR5RGVmaW5lZCwgbmFtZSk7XG5cbiAgICBpZiAoUkVTRVJWRURfU1BFQ19LRVlTLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBSRVNFUlZFRF9TUEVDX0tFWVNbbmFtZV0oQ29uc3RydWN0b3IsIHByb3BlcnR5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2V0dXAgbWV0aG9kcyBvbiBwcm90b3R5cGU6XG4gICAgICAvLyBUaGUgZm9sbG93aW5nIG1lbWJlciBtZXRob2RzIHNob3VsZCBub3QgYmUgYXV0b21hdGljYWxseSBib3VuZDpcbiAgICAgIC8vIDEuIEV4cGVjdGVkIFJlYWN0Q2xhc3MgbWV0aG9kcyAoaW4gdGhlIFwiaW50ZXJmYWNlXCIpLlxuICAgICAgLy8gMi4gT3ZlcnJpZGRlbiBtZXRob2RzICh0aGF0IHdlcmUgbWl4ZWQgaW4pLlxuICAgICAgdmFyIGlzUmVhY3RDbGFzc01ldGhvZCA9IFJlYWN0Q2xhc3NJbnRlcmZhY2UuaGFzT3duUHJvcGVydHkobmFtZSk7XG4gICAgICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgIHZhciBzaG91bGRBdXRvQmluZCA9IGlzRnVuY3Rpb24gJiYgIWlzUmVhY3RDbGFzc01ldGhvZCAmJiAhaXNBbHJlYWR5RGVmaW5lZCAmJiBzcGVjLmF1dG9iaW5kICE9PSBmYWxzZTtcblxuICAgICAgaWYgKHNob3VsZEF1dG9CaW5kKSB7XG4gICAgICAgIGF1dG9CaW5kUGFpcnMucHVzaChuYW1lLCBwcm9wZXJ0eSk7XG4gICAgICAgIHByb3RvW25hbWVdID0gcHJvcGVydHk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaXNBbHJlYWR5RGVmaW5lZCkge1xuICAgICAgICAgIHZhciBzcGVjUG9saWN5ID0gUmVhY3RDbGFzc0ludGVyZmFjZVtuYW1lXTtcblxuICAgICAgICAgIC8vIFRoZXNlIGNhc2VzIHNob3VsZCBhbHJlYWR5IGJlIGNhdWdodCBieSB2YWxpZGF0ZU1ldGhvZE92ZXJyaWRlLlxuICAgICAgICAgICEoaXNSZWFjdENsYXNzTWV0aG9kICYmIChzcGVjUG9saWN5ID09PSAnREVGSU5FX01BTllfTUVSR0VEJyB8fCBzcGVjUG9saWN5ID09PSAnREVGSU5FX01BTlknKSkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q2xhc3M6IFVuZXhwZWN0ZWQgc3BlYyBwb2xpY3kgJXMgZm9yIGtleSAlcyB3aGVuIG1peGluZyBpbiBjb21wb25lbnQgc3BlY3MuJywgc3BlY1BvbGljeSwgbmFtZSkgOiBfcHJvZEludmFyaWFudCgnNzcnLCBzcGVjUG9saWN5LCBuYW1lKSA6IHZvaWQgMDtcblxuICAgICAgICAgIC8vIEZvciBtZXRob2RzIHdoaWNoIGFyZSBkZWZpbmVkIG1vcmUgdGhhbiBvbmNlLCBjYWxsIHRoZSBleGlzdGluZ1xuICAgICAgICAgIC8vIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlIG5ldyBwcm9wZXJ0eSwgbWVyZ2luZyBpZiBhcHByb3ByaWF0ZS5cbiAgICAgICAgICBpZiAoc3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5ZX01FUkdFRCcpIHtcbiAgICAgICAgICAgIHByb3RvW25hbWVdID0gY3JlYXRlTWVyZ2VkUmVzdWx0RnVuY3Rpb24ocHJvdG9bbmFtZV0sIHByb3BlcnR5KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHNwZWNQb2xpY3kgPT09ICdERUZJTkVfTUFOWScpIHtcbiAgICAgICAgICAgIHByb3RvW25hbWVdID0gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKHByb3RvW25hbWVdLCBwcm9wZXJ0eSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3RvW25hbWVdID0gcHJvcGVydHk7XG4gICAgICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBBZGQgdmVyYm9zZSBkaXNwbGF5TmFtZSB0byB0aGUgZnVuY3Rpb24sIHdoaWNoIGhlbHBzIHdoZW4gbG9va2luZ1xuICAgICAgICAgICAgLy8gYXQgcHJvZmlsaW5nIHRvb2xzLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gJ2Z1bmN0aW9uJyAmJiBzcGVjLmRpc3BsYXlOYW1lKSB7XG4gICAgICAgICAgICAgIHByb3RvW25hbWVdLmRpc3BsYXlOYW1lID0gc3BlYy5kaXNwbGF5TmFtZSArICdfJyArIG5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG1peFN0YXRpY1NwZWNJbnRvQ29tcG9uZW50KENvbnN0cnVjdG9yLCBzdGF0aWNzKSB7XG4gIGlmICghc3RhdGljcykge1xuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKHZhciBuYW1lIGluIHN0YXRpY3MpIHtcbiAgICB2YXIgcHJvcGVydHkgPSBzdGF0aWNzW25hbWVdO1xuICAgIGlmICghc3RhdGljcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGlzUmVzZXJ2ZWQgPSBuYW1lIGluIFJFU0VSVkVEX1NQRUNfS0VZUztcbiAgICAhIWlzUmVzZXJ2ZWQgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q2xhc3M6IFlvdSBhcmUgYXR0ZW1wdGluZyB0byBkZWZpbmUgYSByZXNlcnZlZCBwcm9wZXJ0eSwgYCVzYCwgdGhhdCBzaG91bGRuXFwndCBiZSBvbiB0aGUgXCJzdGF0aWNzXCIga2V5LiBEZWZpbmUgaXQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgaW5zdGVhZDsgaXQgd2lsbCBzdGlsbCBiZSBhY2Nlc3NpYmxlIG9uIHRoZSBjb25zdHJ1Y3Rvci4nLCBuYW1lKSA6IF9wcm9kSW52YXJpYW50KCc3OCcsIG5hbWUpIDogdm9pZCAwO1xuXG4gICAgdmFyIGlzSW5oZXJpdGVkID0gbmFtZSBpbiBDb25zdHJ1Y3RvcjtcbiAgICAhIWlzSW5oZXJpdGVkID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdENsYXNzOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gZGVmaW5lIGAlc2Agb24geW91ciBjb21wb25lbnQgbW9yZSB0aGFuIG9uY2UuIFRoaXMgY29uZmxpY3QgbWF5IGJlIGR1ZSB0byBhIG1peGluLicsIG5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzc5JywgbmFtZSkgOiB2b2lkIDA7XG4gICAgQ29uc3RydWN0b3JbbmFtZV0gPSBwcm9wZXJ0eTtcbiAgfVxufVxuXG4vKipcbiAqIE1lcmdlIHR3byBvYmplY3RzLCBidXQgdGhyb3cgaWYgYm90aCBjb250YWluIHRoZSBzYW1lIGtleS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb25lIFRoZSBmaXJzdCBvYmplY3QsIHdoaWNoIGlzIG11dGF0ZWQuXG4gKiBAcGFyYW0ge29iamVjdH0gdHdvIFRoZSBzZWNvbmQgb2JqZWN0XG4gKiBAcmV0dXJuIHtvYmplY3R9IG9uZSBhZnRlciBpdCBoYXMgYmVlbiBtdXRhdGVkIHRvIGNvbnRhaW4gZXZlcnl0aGluZyBpbiB0d28uXG4gKi9cbmZ1bmN0aW9uIG1lcmdlSW50b1dpdGhOb0R1cGxpY2F0ZUtleXMob25lLCB0d28pIHtcbiAgIShvbmUgJiYgdHdvICYmIHR5cGVvZiBvbmUgPT09ICdvYmplY3QnICYmIHR5cGVvZiB0d28gPT09ICdvYmplY3QnKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnbWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cygpOiBDYW5ub3QgbWVyZ2Ugbm9uLW9iamVjdHMuJykgOiBfcHJvZEludmFyaWFudCgnODAnKSA6IHZvaWQgMDtcblxuICBmb3IgKHZhciBrZXkgaW4gdHdvKSB7XG4gICAgaWYgKHR3by5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAhKG9uZVtrZXldID09PSB1bmRlZmluZWQpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzKCk6IFRyaWVkIHRvIG1lcmdlIHR3byBvYmplY3RzIHdpdGggdGhlIHNhbWUga2V5OiBgJXNgLiBUaGlzIGNvbmZsaWN0IG1heSBiZSBkdWUgdG8gYSBtaXhpbjsgaW4gcGFydGljdWxhciwgdGhpcyBtYXkgYmUgY2F1c2VkIGJ5IHR3byBnZXRJbml0aWFsU3RhdGUoKSBvciBnZXREZWZhdWx0UHJvcHMoKSBtZXRob2RzIHJldHVybmluZyBvYmplY3RzIHdpdGggY2xhc2hpbmcga2V5cy4nLCBrZXkpIDogX3Byb2RJbnZhcmlhbnQoJzgxJywga2V5KSA6IHZvaWQgMDtcbiAgICAgIG9uZVtrZXldID0gdHdvW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBvbmU7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0d28gZnVuY3Rpb25zIGFuZCBtZXJnZXMgdGhlaXIgcmV0dXJuIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBvbmUgRnVuY3Rpb24gdG8gaW52b2tlIGZpcnN0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gdHdvIEZ1bmN0aW9uIHRvIGludm9rZSBzZWNvbmQuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn0gRnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSB0d28gYXJndW1lbnQgZnVuY3Rpb25zLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlTWVyZ2VkUmVzdWx0RnVuY3Rpb24ob25lLCB0d28pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlZFJlc3VsdCgpIHtcbiAgICB2YXIgYSA9IG9uZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHZhciBiID0gdHdvLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgaWYgKGEgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGI7XG4gICAgfSBlbHNlIGlmIChiID09IG51bGwpIHtcbiAgICAgIHJldHVybiBhO1xuICAgIH1cbiAgICB2YXIgYyA9IHt9O1xuICAgIG1lcmdlSW50b1dpdGhOb0R1cGxpY2F0ZUtleXMoYywgYSk7XG4gICAgbWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cyhjLCBiKTtcbiAgICByZXR1cm4gYztcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHR3byBmdW5jdGlvbnMgYW5kIGlnbm9yZXMgdGhlaXIgcmV0dXJuIHZhbGVzLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IG9uZSBGdW5jdGlvbiB0byBpbnZva2UgZmlyc3QuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSB0d28gRnVuY3Rpb24gdG8gaW52b2tlIHNlY29uZC5cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSBGdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIHR3byBhcmd1bWVudCBmdW5jdGlvbnMuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjcmVhdGVDaGFpbmVkRnVuY3Rpb24ob25lLCB0d28pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNoYWluZWRGdW5jdGlvbigpIHtcbiAgICBvbmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB0d28uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBCaW5kcyBhIG1ldGhvZCB0byB0aGUgY29tcG9uZW50LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb21wb25lbnQgQ29tcG9uZW50IHdob3NlIG1ldGhvZCBpcyBnb2luZyB0byBiZSBib3VuZC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IG1ldGhvZCBNZXRob2QgdG8gYmUgYm91bmQuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbn0gVGhlIGJvdW5kIG1ldGhvZC5cbiAqL1xuZnVuY3Rpb24gYmluZEF1dG9CaW5kTWV0aG9kKGNvbXBvbmVudCwgbWV0aG9kKSB7XG4gIHZhciBib3VuZE1ldGhvZCA9IG1ldGhvZC5iaW5kKGNvbXBvbmVudCk7XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZENvbnRleHQgPSBjb21wb25lbnQ7XG4gICAgYm91bmRNZXRob2QuX19yZWFjdEJvdW5kTWV0aG9kID0gbWV0aG9kO1xuICAgIGJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZEFyZ3VtZW50cyA9IG51bGw7XG4gICAgdmFyIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnQuY29uc3RydWN0b3IuZGlzcGxheU5hbWU7XG4gICAgdmFyIF9iaW5kID0gYm91bmRNZXRob2QuYmluZDtcbiAgICBib3VuZE1ldGhvZC5iaW5kID0gZnVuY3Rpb24gKG5ld1RoaXMpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgLy8gVXNlciBpcyB0cnlpbmcgdG8gYmluZCgpIGFuIGF1dG9ib3VuZCBtZXRob2Q7IHdlIGVmZmVjdGl2ZWx5IHdpbGxcbiAgICAgIC8vIGlnbm9yZSB0aGUgdmFsdWUgb2YgXCJ0aGlzXCIgdGhhdCB0aGUgdXNlciBpcyB0cnlpbmcgdG8gdXNlLCBzb1xuICAgICAgLy8gbGV0J3Mgd2Fybi5cbiAgICAgIGlmIChuZXdUaGlzICE9PSBjb21wb25lbnQgJiYgbmV3VGhpcyAhPT0gbnVsbCkge1xuICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdiaW5kKCk6IFJlYWN0IGNvbXBvbmVudCBtZXRob2RzIG1heSBvbmx5IGJlIGJvdW5kIHRvIHRoZSAnICsgJ2NvbXBvbmVudCBpbnN0YW5jZS4gU2VlICVzJywgY29tcG9uZW50TmFtZSkgOiB2b2lkIDA7XG4gICAgICB9IGVsc2UgaWYgKCFhcmdzLmxlbmd0aCkge1xuICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdiaW5kKCk6IFlvdSBhcmUgYmluZGluZyBhIGNvbXBvbmVudCBtZXRob2QgdG8gdGhlIGNvbXBvbmVudC4gJyArICdSZWFjdCBkb2VzIHRoaXMgZm9yIHlvdSBhdXRvbWF0aWNhbGx5IGluIGEgaGlnaC1wZXJmb3JtYW5jZSAnICsgJ3dheSwgc28geW91IGNhbiBzYWZlbHkgcmVtb3ZlIHRoaXMgY2FsbC4gU2VlICVzJywgY29tcG9uZW50TmFtZSkgOiB2b2lkIDA7XG4gICAgICAgIHJldHVybiBib3VuZE1ldGhvZDtcbiAgICAgIH1cbiAgICAgIHZhciByZWJvdW5kTWV0aG9kID0gX2JpbmQuYXBwbHkoYm91bmRNZXRob2QsIGFyZ3VtZW50cyk7XG4gICAgICByZWJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZENvbnRleHQgPSBjb21wb25lbnQ7XG4gICAgICByZWJvdW5kTWV0aG9kLl9fcmVhY3RCb3VuZE1ldGhvZCA9IG1ldGhvZDtcbiAgICAgIHJlYm91bmRNZXRob2QuX19yZWFjdEJvdW5kQXJndW1lbnRzID0gYXJncztcbiAgICAgIHJldHVybiByZWJvdW5kTWV0aG9kO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGJvdW5kTWV0aG9kO1xufVxuXG4vKipcbiAqIEJpbmRzIGFsbCBhdXRvLWJvdW5kIG1ldGhvZHMgaW4gYSBjb21wb25lbnQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNvbXBvbmVudCBDb21wb25lbnQgd2hvc2UgbWV0aG9kIGlzIGdvaW5nIHRvIGJlIGJvdW5kLlxuICovXG5mdW5jdGlvbiBiaW5kQXV0b0JpbmRNZXRob2RzKGNvbXBvbmVudCkge1xuICB2YXIgcGFpcnMgPSBjb21wb25lbnQuX19yZWFjdEF1dG9CaW5kUGFpcnM7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGFpcnMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICB2YXIgYXV0b0JpbmRLZXkgPSBwYWlyc1tpXTtcbiAgICB2YXIgbWV0aG9kID0gcGFpcnNbaSArIDFdO1xuICAgIGNvbXBvbmVudFthdXRvQmluZEtleV0gPSBiaW5kQXV0b0JpbmRNZXRob2QoY29tcG9uZW50LCBtZXRob2QpO1xuICB9XG59XG5cbi8qKlxuICogQWRkIG1vcmUgdG8gdGhlIFJlYWN0Q2xhc3MgYmFzZSBjbGFzcy4gVGhlc2UgYXJlIGFsbCBsZWdhY3kgZmVhdHVyZXMgYW5kXG4gKiB0aGVyZWZvcmUgbm90IGFscmVhZHkgcGFydCBvZiB0aGUgbW9kZXJuIFJlYWN0Q29tcG9uZW50LlxuICovXG52YXIgUmVhY3RDbGFzc01peGluID0ge1xuXG4gIC8qKlxuICAgKiBUT0RPOiBUaGlzIHdpbGwgYmUgZGVwcmVjYXRlZCBiZWNhdXNlIHN0YXRlIHNob3VsZCBhbHdheXMga2VlcCBhIGNvbnNpc3RlbnRcbiAgICogdHlwZSBzaWduYXR1cmUgYW5kIHRoZSBvbmx5IHVzZSBjYXNlIGZvciB0aGlzLCBpcyB0byBhdm9pZCB0aGF0LlxuICAgKi9cbiAgcmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAobmV3U3RhdGUsIGNhbGxiYWNrKSB7XG4gICAgdGhpcy51cGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUodGhpcywgbmV3U3RhdGUpO1xuICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgdGhpcy51cGRhdGVyLmVucXVldWVDYWxsYmFjayh0aGlzLCBjYWxsYmFjaywgJ3JlcGxhY2VTdGF0ZScpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIG1vdW50ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHByb3RlY3RlZFxuICAgKiBAZmluYWxcbiAgICovXG4gIGlzTW91bnRlZDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZXIuaXNNb3VudGVkKHRoaXMpO1xuICB9XG59O1xuXG52YXIgUmVhY3RDbGFzc0NvbXBvbmVudCA9IGZ1bmN0aW9uICgpIHt9O1xuX2Fzc2lnbihSZWFjdENsYXNzQ29tcG9uZW50LnByb3RvdHlwZSwgUmVhY3RDb21wb25lbnQucHJvdG90eXBlLCBSZWFjdENsYXNzTWl4aW4pO1xuXG52YXIgZGlkV2FybkRlcHJlY2F0ZWQgPSBmYWxzZTtcblxuLyoqXG4gKiBNb2R1bGUgZm9yIGNyZWF0aW5nIGNvbXBvc2l0ZSBjb21wb25lbnRzLlxuICpcbiAqIEBjbGFzcyBSZWFjdENsYXNzXG4gKi9cbnZhciBSZWFjdENsYXNzID0ge1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY29tcG9zaXRlIGNvbXBvbmVudCBjbGFzcyBnaXZlbiBhIGNsYXNzIHNwZWNpZmljYXRpb24uXG4gICAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jcmVhdGVjbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gc3BlYyBDbGFzcyBzcGVjaWZpY2F0aW9uICh3aGljaCBtdXN0IGRlZmluZSBgcmVuZGVyYCkuXG4gICAqIEByZXR1cm4ge2Z1bmN0aW9ufSBDb21wb25lbnQgY29uc3RydWN0b3IgZnVuY3Rpb24uXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGNyZWF0ZUNsYXNzOiBmdW5jdGlvbiAoc3BlYykge1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGRpZFdhcm5EZXByZWNhdGVkLCAnJXM6IFJlYWN0LmNyZWF0ZUNsYXNzIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDE2LiAnICsgJ1VzZSBwbGFpbiBKYXZhU2NyaXB0IGNsYXNzZXMgaW5zdGVhZC4gSWYgeW91XFwncmUgbm90IHlldCByZWFkeSB0byAnICsgJ21pZ3JhdGUsIGNyZWF0ZS1yZWFjdC1jbGFzcyBpcyBhdmFpbGFibGUgb24gbnBtIGFzIGEgJyArICdkcm9wLWluIHJlcGxhY2VtZW50LicsIHNwZWMgJiYgc3BlYy5kaXNwbGF5TmFtZSB8fCAnQSBDb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICAgIGRpZFdhcm5EZXByZWNhdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBUbyBrZWVwIG91ciB3YXJuaW5ncyBtb3JlIHVuZGVyc3RhbmRhYmxlLCB3ZSdsbCB1c2UgYSBsaXR0bGUgaGFjayBoZXJlIHRvXG4gICAgLy8gZW5zdXJlIHRoYXQgQ29uc3RydWN0b3IubmFtZSAhPT0gJ0NvbnN0cnVjdG9yJy4gVGhpcyBtYWtlcyBzdXJlIHdlIGRvbid0XG4gICAgLy8gdW5uZWNlc3NhcmlseSBpZGVudGlmeSBhIGNsYXNzIHdpdGhvdXQgZGlzcGxheU5hbWUgYXMgJ0NvbnN0cnVjdG9yJy5cbiAgICB2YXIgQ29uc3RydWN0b3IgPSBpZGVudGl0eShmdW5jdGlvbiAocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgICAgIC8vIFRoaXMgY29uc3RydWN0b3IgZ2V0cyBvdmVycmlkZGVuIGJ5IG1vY2tzLiBUaGUgYXJndW1lbnQgaXMgdXNlZFxuICAgICAgLy8gYnkgbW9ja3MgdG8gYXNzZXJ0IG9uIHdoYXQgZ2V0cyBtb3VudGVkLlxuXG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHRoaXMgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvciwgJ1NvbWV0aGluZyBpcyBjYWxsaW5nIGEgUmVhY3QgY29tcG9uZW50IGRpcmVjdGx5LiBVc2UgYSBmYWN0b3J5IG9yICcgKyAnSlNYIGluc3RlYWQuIFNlZTogaHR0cHM6Ly9mYi5tZS9yZWFjdC1sZWdhY3lmYWN0b3J5JykgOiB2b2lkIDA7XG4gICAgICB9XG5cbiAgICAgIC8vIFdpcmUgdXAgYXV0by1iaW5kaW5nXG4gICAgICBpZiAodGhpcy5fX3JlYWN0QXV0b0JpbmRQYWlycy5sZW5ndGgpIHtcbiAgICAgICAgYmluZEF1dG9CaW5kTWV0aG9kcyh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICAgICAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcblxuICAgICAgdGhpcy5zdGF0ZSA9IG51bGw7XG5cbiAgICAgIC8vIFJlYWN0Q2xhc3NlcyBkb2Vzbid0IGhhdmUgY29uc3RydWN0b3JzLiBJbnN0ZWFkLCB0aGV5IHVzZSB0aGVcbiAgICAgIC8vIGdldEluaXRpYWxTdGF0ZSBhbmQgY29tcG9uZW50V2lsbE1vdW50IG1ldGhvZHMgZm9yIGluaXRpYWxpemF0aW9uLlxuXG4gICAgICB2YXIgaW5pdGlhbFN0YXRlID0gdGhpcy5nZXRJbml0aWFsU3RhdGUgPyB0aGlzLmdldEluaXRpYWxTdGF0ZSgpIDogbnVsbDtcbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAvLyBXZSBhbGxvdyBhdXRvLW1vY2tzIHRvIHByb2NlZWQgYXMgaWYgdGhleSdyZSByZXR1cm5pbmcgbnVsbC5cbiAgICAgICAgaWYgKGluaXRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMuZ2V0SW5pdGlhbFN0YXRlLl9pc01vY2tGdW5jdGlvbikge1xuICAgICAgICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgYmFkIHByYWN0aWNlLiBDb25zaWRlciB3YXJuaW5nIGhlcmUgYW5kXG4gICAgICAgICAgLy8gZGVwcmVjYXRpbmcgdGhpcyBjb252ZW5pZW5jZS5cbiAgICAgICAgICBpbml0aWFsU3RhdGUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAhKHR5cGVvZiBpbml0aWFsU3RhdGUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGluaXRpYWxTdGF0ZSkpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICclcy5nZXRJbml0aWFsU3RhdGUoKTogbXVzdCByZXR1cm4gYW4gb2JqZWN0IG9yIG51bGwnLCBDb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IF9wcm9kSW52YXJpYW50KCc4MicsIENvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogdm9pZCAwO1xuXG4gICAgICB0aGlzLnN0YXRlID0gaW5pdGlhbFN0YXRlO1xuICAgIH0pO1xuICAgIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IG5ldyBSZWFjdENsYXNzQ29tcG9uZW50KCk7XG4gICAgQ29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uc3RydWN0b3I7XG4gICAgQ29uc3RydWN0b3IucHJvdG90eXBlLl9fcmVhY3RBdXRvQmluZFBhaXJzID0gW107XG5cbiAgICBpbmplY3RlZE1peGlucy5mb3JFYWNoKG1peFNwZWNJbnRvQ29tcG9uZW50LmJpbmQobnVsbCwgQ29uc3RydWN0b3IpKTtcblxuICAgIG1peFNwZWNJbnRvQ29tcG9uZW50KENvbnN0cnVjdG9yLCBzcGVjKTtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIGRlZmF1bHRQcm9wcyBwcm9wZXJ0eSBhZnRlciBhbGwgbWl4aW5zIGhhdmUgYmVlbiBtZXJnZWQuXG4gICAgaWYgKENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcykge1xuICAgICAgQ29uc3RydWN0b3IuZGVmYXVsdFByb3BzID0gQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzKCk7XG4gICAgfVxuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAvLyBUaGlzIGlzIGEgdGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIHVzZSBvZiB0aGVzZSBtZXRob2QgbmFtZXMgaXMgb2ssXG4gICAgICAvLyBzaW5jZSBpdCdzIHVzZWQgd2l0aCBjcmVhdGVDbGFzcy4gSWYgaXQncyBub3QsIHRoZW4gaXQncyBsaWtlbHkgYVxuICAgICAgLy8gbWlzdGFrZSBzbyB3ZSdsbCB3YXJuIHlvdSB0byB1c2UgdGhlIHN0YXRpYyBwcm9wZXJ0eSwgcHJvcGVydHlcbiAgICAgIC8vIGluaXRpYWxpemVyIG9yIGNvbnN0cnVjdG9yIHJlc3BlY3RpdmVseS5cbiAgICAgIGlmIChDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMpIHtcbiAgICAgICAgQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkID0ge307XG4gICAgICB9XG4gICAgICBpZiAoQ29uc3RydWN0b3IucHJvdG90eXBlLmdldEluaXRpYWxTdGF0ZSkge1xuICAgICAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuZ2V0SW5pdGlhbFN0YXRlLmlzUmVhY3RDbGFzc0FwcHJvdmVkID0ge307XG4gICAgICB9XG4gICAgfVxuXG4gICAgIUNvbnN0cnVjdG9yLnByb3RvdHlwZS5yZW5kZXIgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2NyZWF0ZUNsYXNzKC4uLik6IENsYXNzIHNwZWNpZmljYXRpb24gbXVzdCBpbXBsZW1lbnQgYSBgcmVuZGVyYCBtZXRob2QuJykgOiBfcHJvZEludmFyaWFudCgnODMnKSA6IHZvaWQgMDtcblxuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFDb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29tcG9uZW50U2hvdWxkVXBkYXRlLCAnJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk/ICcgKyAnVGhlIG5hbWUgaXMgcGhyYXNlZCBhcyBhIHF1ZXN0aW9uIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzICcgKyAnZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuJywgc3BlYy5kaXNwbGF5TmFtZSB8fCAnQSBjb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghQ29uc3RydWN0b3IucHJvdG90eXBlLmNvbXBvbmVudFdpbGxSZWNpZXZlUHJvcHMsICclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcygpLiBEaWQgeW91IG1lYW4gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcygpPycsIHNwZWMuZGlzcGxheU5hbWUgfHwgJ0EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgLy8gUmVkdWNlIHRpbWUgc3BlbnQgZG9pbmcgbG9va3VwcyBieSBzZXR0aW5nIHRoZXNlIG9uIHRoZSBwcm90b3R5cGUuXG4gICAgZm9yICh2YXIgbWV0aG9kTmFtZSBpbiBSZWFjdENsYXNzSW50ZXJmYWNlKSB7XG4gICAgICBpZiAoIUNvbnN0cnVjdG9yLnByb3RvdHlwZVttZXRob2ROYW1lXSkge1xuICAgICAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfSxcblxuICBpbmplY3Rpb246IHtcbiAgICBpbmplY3RNaXhpbjogZnVuY3Rpb24gKG1peGluKSB7XG4gICAgICBpbmplY3RlZE1peGlucy5wdXNoKG1peGluKTtcbiAgICB9XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdENsYXNzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHJlcXVpcmUoJy4vUmVhY3ROb29wVXBkYXRlUXVldWUnKTtcblxudmFyIGNhbkRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9jYW5EZWZpbmVQcm9wZXJ0eScpO1xudmFyIGVtcHR5T2JqZWN0ID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlPYmplY3QnKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgaGVscGVycyBmb3IgdGhlIHVwZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50LlxuICovXG5mdW5jdGlvbiBSZWFjdENvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICAvLyBXZSBpbml0aWFsaXplIHRoZSBkZWZhdWx0IHVwZGF0ZXIgYnV0IHRoZSByZWFsIG9uZSBnZXRzIGluamVjdGVkIGJ5IHRoZVxuICAvLyByZW5kZXJlci5cbiAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbn1cblxuUmVhY3RDb21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQgPSB7fTtcblxuLyoqXG4gKiBTZXRzIGEgc3Vic2V0IG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIHRvIG11dGF0ZVxuICogc3RhdGUuIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAqXG4gKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBjYWxscyB0byBgc2V0U3RhdGVgIHdpbGwgcnVuIHN5bmNocm9ub3VzbHksXG4gKiBhcyB0aGV5IG1heSBldmVudHVhbGx5IGJlIGJhdGNoZWQgdG9nZXRoZXIuICBZb3UgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWxcbiAqIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBjYWxsIHRvIHNldFN0YXRlIGlzIGFjdHVhbGx5XG4gKiBjb21wbGV0ZWQuXG4gKlxuICogV2hlbiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHNldFN0YXRlLCBpdCB3aWxsIGJlIGNhbGxlZCBhdCBzb21lIHBvaW50IGluXG4gKiB0aGUgZnV0dXJlIChub3Qgc3luY2hyb25vdXNseSkuIEl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHVwIHRvIGRhdGVcbiAqIGNvbXBvbmVudCBhcmd1bWVudHMgKHN0YXRlLCBwcm9wcywgY29udGV4dCkuIFRoZXNlIHZhbHVlcyBjYW4gYmUgZGlmZmVyZW50XG4gKiBmcm9tIHRoaXMuKiBiZWNhdXNlIHlvdXIgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBhZnRlciByZWNlaXZlUHJvcHMgYnV0IGJlZm9yZVxuICogc2hvdWxkQ29tcG9uZW50VXBkYXRlLCBhbmQgdGhpcyBuZXcgc3RhdGUsIHByb3BzLCBhbmQgY29udGV4dCB3aWxsIG5vdCB5ZXQgYmVcbiAqIGFzc2lnbmVkIHRvIHRoaXMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IHBhcnRpYWxTdGF0ZSBOZXh0IHBhcnRpYWwgc3RhdGUgb3IgZnVuY3Rpb24gdG9cbiAqICAgICAgICBwcm9kdWNlIG5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBjdXJyZW50IHN0YXRlLlxuICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLlxuICogQGZpbmFsXG4gKiBAcHJvdGVjdGVkXG4gKi9cblJlYWN0Q29tcG9uZW50LnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrKSB7XG4gICEodHlwZW9mIHBhcnRpYWxTdGF0ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHBhcnRpYWxTdGF0ZSA9PT0gJ2Z1bmN0aW9uJyB8fCBwYXJ0aWFsU3RhdGUgPT0gbnVsbCkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3NldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLicpIDogX3Byb2RJbnZhcmlhbnQoJzg1JykgOiB2b2lkIDA7XG4gIHRoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcywgcGFydGlhbFN0YXRlKTtcbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgdGhpcy51cGRhdGVyLmVucXVldWVDYWxsYmFjayh0aGlzLCBjYWxsYmFjaywgJ3NldFN0YXRlJyk7XG4gIH1cbn07XG5cbi8qKlxuICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gKlxuICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gKlxuICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAqXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHVwZGF0ZSBpcyBjb21wbGV0ZS5cbiAqIEBmaW5hbFxuICogQHByb3RlY3RlZFxuICovXG5SZWFjdENvbXBvbmVudC5wcm90b3R5cGUuZm9yY2VVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgdGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzKTtcbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgdGhpcy51cGRhdGVyLmVucXVldWVDYWxsYmFjayh0aGlzLCBjYWxsYmFjaywgJ2ZvcmNlVXBkYXRlJyk7XG4gIH1cbn07XG5cbi8qKlxuICogRGVwcmVjYXRlZCBBUElzLiBUaGVzZSBBUElzIHVzZWQgdG8gZXhpc3Qgb24gY2xhc3NpYyBSZWFjdCBjbGFzc2VzIGJ1dCBzaW5jZVxuICogd2Ugd291bGQgbGlrZSB0byBkZXByZWNhdGUgdGhlbSwgd2UncmUgbm90IGdvaW5nIHRvIG1vdmUgdGhlbSBvdmVyIHRvIHRoaXNcbiAqIG1vZGVybiBiYXNlIGNsYXNzLiBJbnN0ZWFkLCB3ZSBkZWZpbmUgYSBnZXR0ZXIgdGhhdCB3YXJucyBpZiBpdCdzIGFjY2Vzc2VkLlxuICovXG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIGRlcHJlY2F0ZWRBUElzID0ge1xuICAgIGlzTW91bnRlZDogWydpc01vdW50ZWQnLCAnSW5zdGVhZCwgbWFrZSBzdXJlIHRvIGNsZWFuIHVwIHN1YnNjcmlwdGlvbnMgYW5kIHBlbmRpbmcgcmVxdWVzdHMgaW4gJyArICdjb21wb25lbnRXaWxsVW5tb3VudCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4nXSxcbiAgICByZXBsYWNlU3RhdGU6IFsncmVwbGFjZVN0YXRlJywgJ1JlZmFjdG9yIHlvdXIgY29kZSB0byB1c2Ugc2V0U3RhdGUgaW5zdGVhZCAoc2VlICcgKyAnaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy8zMjM2KS4nXVxuICB9O1xuICB2YXIgZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nID0gZnVuY3Rpb24gKG1ldGhvZE5hbWUsIGluZm8pIHtcbiAgICBpZiAoY2FuRGVmaW5lUHJvcGVydHkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWFjdENvbXBvbmVudC5wcm90b3R5cGUsIG1ldGhvZE5hbWUsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXMoLi4uKSBpcyBkZXByZWNhdGVkIGluIHBsYWluIEphdmFTY3JpcHQgUmVhY3QgY2xhc3Nlcy4gJXMnLCBpbmZvWzBdLCBpbmZvWzFdKSA6IHZvaWQgMDtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG4gIGZvciAodmFyIGZuTmFtZSBpbiBkZXByZWNhdGVkQVBJcykge1xuICAgIGlmIChkZXByZWNhdGVkQVBJcy5oYXNPd25Qcm9wZXJ0eShmbk5hbWUpKSB7XG4gICAgICBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcoZm5OYW1lLCBkZXByZWNhdGVkQVBJc1tmbk5hbWVdKTtcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdENvbXBvbmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE2LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJy4vUmVhY3RDdXJyZW50T3duZXInKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbmZ1bmN0aW9uIGlzTmF0aXZlKGZuKSB7XG4gIC8vIEJhc2VkIG9uIGlzTmF0aXZlKCkgZnJvbSBMb2Rhc2hcbiAgdmFyIGZ1bmNUb1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcbiAgdmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbiAgdmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICsgZnVuY1RvU3RyaW5nXG4gIC8vIFRha2UgYW4gZXhhbXBsZSBuYXRpdmUgZnVuY3Rpb24gc291cmNlIGZvciBjb21wYXJpc29uXG4gIC5jYWxsKGhhc093blByb3BlcnR5KVxuICAvLyBTdHJpcCByZWdleCBjaGFyYWN0ZXJzIHNvIHdlIGNhbiB1c2UgaXQgZm9yIHJlZ2V4XG4gIC5yZXBsYWNlKC9bXFxcXF4kLiorPygpW1xcXXt9fF0vZywgJ1xcXFwkJicpXG4gIC8vIFJlbW92ZSBoYXNPd25Qcm9wZXJ0eSBmcm9tIHRoZSB0ZW1wbGF0ZSB0byBtYWtlIGl0IGdlbmVyaWNcbiAgLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFxcXFwoKXwgZm9yIC4rPyg/PVxcXFxcXF0pL2csICckMS4qPycpICsgJyQnKTtcbiAgdHJ5IHtcbiAgICB2YXIgc291cmNlID0gZnVuY1RvU3RyaW5nLmNhbGwoZm4pO1xuICAgIHJldHVybiByZUlzTmF0aXZlLnRlc3Qoc291cmNlKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbnZhciBjYW5Vc2VDb2xsZWN0aW9ucyA9XG4vLyBBcnJheS5mcm9tXG50eXBlb2YgQXJyYXkuZnJvbSA9PT0gJ2Z1bmN0aW9uJyAmJlxuLy8gTWFwXG50eXBlb2YgTWFwID09PSAnZnVuY3Rpb24nICYmIGlzTmF0aXZlKE1hcCkgJiZcbi8vIE1hcC5wcm90b3R5cGUua2V5c1xuTWFwLnByb3RvdHlwZSAhPSBudWxsICYmIHR5cGVvZiBNYXAucHJvdG90eXBlLmtleXMgPT09ICdmdW5jdGlvbicgJiYgaXNOYXRpdmUoTWFwLnByb3RvdHlwZS5rZXlzKSAmJlxuLy8gU2V0XG50eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nICYmIGlzTmF0aXZlKFNldCkgJiZcbi8vIFNldC5wcm90b3R5cGUua2V5c1xuU2V0LnByb3RvdHlwZSAhPSBudWxsICYmIHR5cGVvZiBTZXQucHJvdG90eXBlLmtleXMgPT09ICdmdW5jdGlvbicgJiYgaXNOYXRpdmUoU2V0LnByb3RvdHlwZS5rZXlzKTtcblxudmFyIHNldEl0ZW07XG52YXIgZ2V0SXRlbTtcbnZhciByZW1vdmVJdGVtO1xudmFyIGdldEl0ZW1JRHM7XG52YXIgYWRkUm9vdDtcbnZhciByZW1vdmVSb290O1xudmFyIGdldFJvb3RJRHM7XG5cbmlmIChjYW5Vc2VDb2xsZWN0aW9ucykge1xuICB2YXIgaXRlbU1hcCA9IG5ldyBNYXAoKTtcbiAgdmFyIHJvb3RJRFNldCA9IG5ldyBTZXQoKTtcblxuICBzZXRJdGVtID0gZnVuY3Rpb24gKGlkLCBpdGVtKSB7XG4gICAgaXRlbU1hcC5zZXQoaWQsIGl0ZW0pO1xuICB9O1xuICBnZXRJdGVtID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgcmV0dXJuIGl0ZW1NYXAuZ2V0KGlkKTtcbiAgfTtcbiAgcmVtb3ZlSXRlbSA9IGZ1bmN0aW9uIChpZCkge1xuICAgIGl0ZW1NYXBbJ2RlbGV0ZSddKGlkKTtcbiAgfTtcbiAgZ2V0SXRlbUlEcyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShpdGVtTWFwLmtleXMoKSk7XG4gIH07XG5cbiAgYWRkUm9vdCA9IGZ1bmN0aW9uIChpZCkge1xuICAgIHJvb3RJRFNldC5hZGQoaWQpO1xuICB9O1xuICByZW1vdmVSb290ID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgcm9vdElEU2V0WydkZWxldGUnXShpZCk7XG4gIH07XG4gIGdldFJvb3RJRHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20ocm9vdElEU2V0LmtleXMoKSk7XG4gIH07XG59IGVsc2Uge1xuICB2YXIgaXRlbUJ5S2V5ID0ge307XG4gIHZhciByb290QnlLZXkgPSB7fTtcblxuICAvLyBVc2Ugbm9uLW51bWVyaWMga2V5cyB0byBwcmV2ZW50IFY4IHBlcmZvcm1hbmNlIGlzc3VlczpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzIzMlxuICB2YXIgZ2V0S2V5RnJvbUlEID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgcmV0dXJuICcuJyArIGlkO1xuICB9O1xuICB2YXIgZ2V0SURGcm9tS2V5ID0gZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBwYXJzZUludChrZXkuc3Vic3RyKDEpLCAxMCk7XG4gIH07XG5cbiAgc2V0SXRlbSA9IGZ1bmN0aW9uIChpZCwgaXRlbSkge1xuICAgIHZhciBrZXkgPSBnZXRLZXlGcm9tSUQoaWQpO1xuICAgIGl0ZW1CeUtleVtrZXldID0gaXRlbTtcbiAgfTtcbiAgZ2V0SXRlbSA9IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBrZXkgPSBnZXRLZXlGcm9tSUQoaWQpO1xuICAgIHJldHVybiBpdGVtQnlLZXlba2V5XTtcbiAgfTtcbiAgcmVtb3ZlSXRlbSA9IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBrZXkgPSBnZXRLZXlGcm9tSUQoaWQpO1xuICAgIGRlbGV0ZSBpdGVtQnlLZXlba2V5XTtcbiAgfTtcbiAgZ2V0SXRlbUlEcyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoaXRlbUJ5S2V5KS5tYXAoZ2V0SURGcm9tS2V5KTtcbiAgfTtcblxuICBhZGRSb290ID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGtleSA9IGdldEtleUZyb21JRChpZCk7XG4gICAgcm9vdEJ5S2V5W2tleV0gPSB0cnVlO1xuICB9O1xuICByZW1vdmVSb290ID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGtleSA9IGdldEtleUZyb21JRChpZCk7XG4gICAgZGVsZXRlIHJvb3RCeUtleVtrZXldO1xuICB9O1xuICBnZXRSb290SURzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhyb290QnlLZXkpLm1hcChnZXRJREZyb21LZXkpO1xuICB9O1xufVxuXG52YXIgdW5tb3VudGVkSURzID0gW107XG5cbmZ1bmN0aW9uIHB1cmdlRGVlcChpZCkge1xuICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICBpZiAoaXRlbSkge1xuICAgIHZhciBjaGlsZElEcyA9IGl0ZW0uY2hpbGRJRHM7XG5cbiAgICByZW1vdmVJdGVtKGlkKTtcbiAgICBjaGlsZElEcy5mb3JFYWNoKHB1cmdlRGVlcCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVDb21wb25lbnRGcmFtZShuYW1lLCBzb3VyY2UsIG93bmVyTmFtZSkge1xuICByZXR1cm4gJ1xcbiAgICBpbiAnICsgKG5hbWUgfHwgJ1Vua25vd24nKSArIChzb3VyY2UgPyAnIChhdCAnICsgc291cmNlLmZpbGVOYW1lLnJlcGxhY2UoL14uKltcXFxcXFwvXS8sICcnKSArICc6JyArIHNvdXJjZS5saW5lTnVtYmVyICsgJyknIDogb3duZXJOYW1lID8gJyAoY3JlYXRlZCBieSAnICsgb3duZXJOYW1lICsgJyknIDogJycpO1xufVxuXG5mdW5jdGlvbiBnZXREaXNwbGF5TmFtZShlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gJyNlbXB0eSc7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBlbGVtZW50ID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiAnI3RleHQnO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50LnR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQudHlwZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZWxlbWVudC50eXBlLmRpc3BsYXlOYW1lIHx8IGVsZW1lbnQudHlwZS5uYW1lIHx8ICdVbmtub3duJztcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXNjcmliZUlEKGlkKSB7XG4gIHZhciBuYW1lID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXREaXNwbGF5TmFtZShpZCk7XG4gIHZhciBlbGVtZW50ID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRFbGVtZW50KGlkKTtcbiAgdmFyIG93bmVySUQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldE93bmVySUQoaWQpO1xuICB2YXIgb3duZXJOYW1lO1xuICBpZiAob3duZXJJRCkge1xuICAgIG93bmVyTmFtZSA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RGlzcGxheU5hbWUob3duZXJJRCk7XG4gIH1cbiAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGVsZW1lbnQsICdSZWFjdENvbXBvbmVudFRyZWVIb29rOiBNaXNzaW5nIFJlYWN0IGVsZW1lbnQgZm9yIGRlYnVnSUQgJXMgd2hlbiAnICsgJ2J1aWxkaW5nIHN0YWNrJywgaWQpIDogdm9pZCAwO1xuICByZXR1cm4gZGVzY3JpYmVDb21wb25lbnRGcmFtZShuYW1lLCBlbGVtZW50ICYmIGVsZW1lbnQuX3NvdXJjZSwgb3duZXJOYW1lKTtcbn1cblxudmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSB7XG4gIG9uU2V0Q2hpbGRyZW46IGZ1bmN0aW9uIChpZCwgbmV4dENoaWxkSURzKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTtcbiAgICAhaXRlbSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnSXRlbSBtdXN0IGhhdmUgYmVlbiBzZXQnKSA6IF9wcm9kSW52YXJpYW50KCcxNDQnKSA6IHZvaWQgMDtcbiAgICBpdGVtLmNoaWxkSURzID0gbmV4dENoaWxkSURzO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXh0Q2hpbGRJRHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBuZXh0Q2hpbGRJRCA9IG5leHRDaGlsZElEc1tpXTtcbiAgICAgIHZhciBuZXh0Q2hpbGQgPSBnZXRJdGVtKG5leHRDaGlsZElEKTtcbiAgICAgICFuZXh0Q2hpbGQgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkIGhvb2sgZXZlbnRzIHRvIGZpcmUgZm9yIHRoZSBjaGlsZCBiZWZvcmUgaXRzIHBhcmVudCBpbmNsdWRlcyBpdCBpbiBvblNldENoaWxkcmVuKCkuJykgOiBfcHJvZEludmFyaWFudCgnMTQwJykgOiB2b2lkIDA7XG4gICAgICAhKG5leHRDaGlsZC5jaGlsZElEcyAhPSBudWxsIHx8IHR5cGVvZiBuZXh0Q2hpbGQuZWxlbWVudCAhPT0gJ29iamVjdCcgfHwgbmV4dENoaWxkLmVsZW1lbnQgPT0gbnVsbCkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkIG9uU2V0Q2hpbGRyZW4oKSB0byBmaXJlIGZvciBhIGNvbnRhaW5lciBjaGlsZCBiZWZvcmUgaXRzIHBhcmVudCBpbmNsdWRlcyBpdCBpbiBvblNldENoaWxkcmVuKCkuJykgOiBfcHJvZEludmFyaWFudCgnMTQxJykgOiB2b2lkIDA7XG4gICAgICAhbmV4dENoaWxkLmlzTW91bnRlZCA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgb25Nb3VudENvbXBvbmVudCgpIHRvIGZpcmUgZm9yIHRoZSBjaGlsZCBiZWZvcmUgaXRzIHBhcmVudCBpbmNsdWRlcyBpdCBpbiBvblNldENoaWxkcmVuKCkuJykgOiBfcHJvZEludmFyaWFudCgnNzEnKSA6IHZvaWQgMDtcbiAgICAgIGlmIChuZXh0Q2hpbGQucGFyZW50SUQgPT0gbnVsbCkge1xuICAgICAgICBuZXh0Q2hpbGQucGFyZW50SUQgPSBpZDtcbiAgICAgICAgLy8gVE9ETzogVGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IGJ1dCBtb3VudGluZyBhIG5ldyByb290IGR1cmluZyBpblxuICAgICAgICAvLyBjb21wb25lbnRXaWxsTW91bnQgY3VycmVudGx5IGNhdXNlcyBub3QteWV0LW1vdW50ZWQgY29tcG9uZW50cyB0b1xuICAgICAgICAvLyBiZSBwdXJnZWQgZnJvbSBvdXIgdHJlZSBkYXRhIHNvIHRoZWlyIHBhcmVudCBpZCBpcyBtaXNzaW5nLlxuICAgICAgfVxuICAgICAgIShuZXh0Q2hpbGQucGFyZW50SUQgPT09IGlkKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgb25CZWZvcmVNb3VudENvbXBvbmVudCgpIHBhcmVudCBhbmQgb25TZXRDaGlsZHJlbigpIHRvIGJlIGNvbnNpc3RlbnQgKCVzIGhhcyBwYXJlbnRzICVzIGFuZCAlcykuJywgbmV4dENoaWxkSUQsIG5leHRDaGlsZC5wYXJlbnRJRCwgaWQpIDogX3Byb2RJbnZhcmlhbnQoJzE0MicsIG5leHRDaGlsZElELCBuZXh0Q2hpbGQucGFyZW50SUQsIGlkKSA6IHZvaWQgMDtcbiAgICB9XG4gIH0sXG4gIG9uQmVmb3JlTW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChpZCwgZWxlbWVudCwgcGFyZW50SUQpIHtcbiAgICB2YXIgaXRlbSA9IHtcbiAgICAgIGVsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICBwYXJlbnRJRDogcGFyZW50SUQsXG4gICAgICB0ZXh0OiBudWxsLFxuICAgICAgY2hpbGRJRHM6IFtdLFxuICAgICAgaXNNb3VudGVkOiBmYWxzZSxcbiAgICAgIHVwZGF0ZUNvdW50OiAwXG4gICAgfTtcbiAgICBzZXRJdGVtKGlkLCBpdGVtKTtcbiAgfSxcbiAgb25CZWZvcmVVcGRhdGVDb21wb25lbnQ6IGZ1bmN0aW9uIChpZCwgZWxlbWVudCkge1xuICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gICAgaWYgKCFpdGVtIHx8ICFpdGVtLmlzTW91bnRlZCkge1xuICAgICAgLy8gV2UgbWF5IGVuZCB1cCBoZXJlIGFzIGEgcmVzdWx0IG9mIHNldFN0YXRlKCkgaW4gY29tcG9uZW50V2lsbFVubW91bnQoKS5cbiAgICAgIC8vIEluIHRoaXMgY2FzZSwgaWdub3JlIHRoZSBlbGVtZW50LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtLmVsZW1lbnQgPSBlbGVtZW50O1xuICB9LFxuICBvbk1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICAgICFpdGVtID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdJdGVtIG11c3QgaGF2ZSBiZWVuIHNldCcpIDogX3Byb2RJbnZhcmlhbnQoJzE0NCcpIDogdm9pZCAwO1xuICAgIGl0ZW0uaXNNb3VudGVkID0gdHJ1ZTtcbiAgICB2YXIgaXNSb290ID0gaXRlbS5wYXJlbnRJRCA9PT0gMDtcbiAgICBpZiAoaXNSb290KSB7XG4gICAgICBhZGRSb290KGlkKTtcbiAgICB9XG4gIH0sXG4gIG9uVXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICAgIGlmICghaXRlbSB8fCAhaXRlbS5pc01vdW50ZWQpIHtcbiAgICAgIC8vIFdlIG1heSBlbmQgdXAgaGVyZSBhcyBhIHJlc3VsdCBvZiBzZXRTdGF0ZSgpIGluIGNvbXBvbmVudFdpbGxVbm1vdW50KCkuXG4gICAgICAvLyBJbiB0aGlzIGNhc2UsIGlnbm9yZSB0aGUgZWxlbWVudC5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaXRlbS51cGRhdGVDb3VudCsrO1xuICB9LFxuICBvblVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgaXQgZXhpc3RzLlxuICAgICAgLy8gYGl0ZW1gIG1pZ2h0IG5vdCBleGlzdCBpZiBpdCBpcyBpbnNpZGUgYW4gZXJyb3IgYm91bmRhcnksIGFuZCBhIHNpYmxpbmdcbiAgICAgIC8vIGVycm9yIGJvdW5kYXJ5IGNoaWxkIHRocmV3IHdoaWxlIG1vdW50aW5nLiBUaGVuIHRoaXMgaW5zdGFuY2UgbmV2ZXJcbiAgICAgIC8vIGdvdCBhIGNoYW5jZSB0byBtb3VudCwgYnV0IGl0IHN0aWxsIGdldHMgYW4gdW5tb3VudGluZyBldmVudCBkdXJpbmdcbiAgICAgIC8vIHRoZSBlcnJvciBib3VuZGFyeSBjbGVhbnVwLlxuICAgICAgaXRlbS5pc01vdW50ZWQgPSBmYWxzZTtcbiAgICAgIHZhciBpc1Jvb3QgPSBpdGVtLnBhcmVudElEID09PSAwO1xuICAgICAgaWYgKGlzUm9vdCkge1xuICAgICAgICByZW1vdmVSb290KGlkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdW5tb3VudGVkSURzLnB1c2goaWQpO1xuICB9LFxuICBwdXJnZVVubW91bnRlZENvbXBvbmVudHM6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoUmVhY3RDb21wb25lbnRUcmVlSG9vay5fcHJldmVudFB1cmdpbmcpIHtcbiAgICAgIC8vIFNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHRlc3RpbmcuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB1bm1vdW50ZWRJRHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpZCA9IHVubW91bnRlZElEc1tpXTtcbiAgICAgIHB1cmdlRGVlcChpZCk7XG4gICAgfVxuICAgIHVubW91bnRlZElEcy5sZW5ndGggPSAwO1xuICB9LFxuICBpc01vdW50ZWQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gICAgcmV0dXJuIGl0ZW0gPyBpdGVtLmlzTW91bnRlZCA6IGZhbHNlO1xuICB9LFxuICBnZXRDdXJyZW50U3RhY2tBZGRlbmR1bTogZnVuY3Rpb24gKHRvcEVsZW1lbnQpIHtcbiAgICB2YXIgaW5mbyA9ICcnO1xuICAgIGlmICh0b3BFbGVtZW50KSB7XG4gICAgICB2YXIgbmFtZSA9IGdldERpc3BsYXlOYW1lKHRvcEVsZW1lbnQpO1xuICAgICAgdmFyIG93bmVyID0gdG9wRWxlbWVudC5fb3duZXI7XG4gICAgICBpbmZvICs9IGRlc2NyaWJlQ29tcG9uZW50RnJhbWUobmFtZSwgdG9wRWxlbWVudC5fc291cmNlLCBvd25lciAmJiBvd25lci5nZXROYW1lKCkpO1xuICAgIH1cblxuICAgIHZhciBjdXJyZW50T3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIHZhciBpZCA9IGN1cnJlbnRPd25lciAmJiBjdXJyZW50T3duZXIuX2RlYnVnSUQ7XG5cbiAgICBpbmZvICs9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoaWQpO1xuICAgIHJldHVybiBpbmZvO1xuICB9LFxuICBnZXRTdGFja0FkZGVuZHVtQnlJRDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGluZm8gPSAnJztcbiAgICB3aGlsZSAoaWQpIHtcbiAgICAgIGluZm8gKz0gZGVzY3JpYmVJRChpZCk7XG4gICAgICBpZCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0UGFyZW50SUQoaWQpO1xuICAgIH1cbiAgICByZXR1cm4gaW5mbztcbiAgfSxcbiAgZ2V0Q2hpbGRJRHM6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gICAgcmV0dXJuIGl0ZW0gPyBpdGVtLmNoaWxkSURzIDogW107XG4gIH0sXG4gIGdldERpc3BsYXlOYW1lOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgZWxlbWVudCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RWxlbWVudChpZCk7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGdldERpc3BsYXlOYW1lKGVsZW1lbnQpO1xuICB9LFxuICBnZXRFbGVtZW50OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICAgIHJldHVybiBpdGVtID8gaXRlbS5lbGVtZW50IDogbnVsbDtcbiAgfSxcbiAgZ2V0T3duZXJJRDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEVsZW1lbnQoaWQpO1xuICAgIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5fb3duZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudC5fb3duZXIuX2RlYnVnSUQ7XG4gIH0sXG4gIGdldFBhcmVudElEOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICAgIHJldHVybiBpdGVtID8gaXRlbS5wYXJlbnRJRCA6IG51bGw7XG4gIH0sXG4gIGdldFNvdXJjZTogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTtcbiAgICB2YXIgZWxlbWVudCA9IGl0ZW0gPyBpdGVtLmVsZW1lbnQgOiBudWxsO1xuICAgIHZhciBzb3VyY2UgPSBlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50Ll9zb3VyY2UgOiBudWxsO1xuICAgIHJldHVybiBzb3VyY2U7XG4gIH0sXG4gIGdldFRleHQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBlbGVtZW50ID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRFbGVtZW50KGlkKTtcbiAgICBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuICcnICsgZWxlbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9LFxuICBnZXRVcGRhdGVDb3VudDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTtcbiAgICByZXR1cm4gaXRlbSA/IGl0ZW0udXBkYXRlQ291bnQgOiAwO1xuICB9LFxuXG5cbiAgZ2V0Um9vdElEczogZ2V0Um9vdElEcyxcbiAgZ2V0UmVnaXN0ZXJlZElEczogZ2V0SXRlbUlEc1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBLZWVwcyB0cmFjayBvZiB0aGUgY3VycmVudCBvd25lci5cbiAqXG4gKiBUaGUgY3VycmVudCBvd25lciBpcyB0aGUgY29tcG9uZW50IHdobyBzaG91bGQgb3duIGFueSBjb21wb25lbnRzIHRoYXQgYXJlXG4gKiBjdXJyZW50bHkgYmVpbmcgY29uc3RydWN0ZWQuXG4gKi9cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEB0eXBlIHtSZWFjdENvbXBvbmVudH1cbiAgICovXG4gIGN1cnJlbnQ6IG51bGxcblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEN1cnJlbnRPd25lcjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBmYWN0b3J5IHRoYXQgY3JlYXRlcyBIVE1MIHRhZyBlbGVtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgY3JlYXRlRE9NRmFjdG9yeSA9IFJlYWN0RWxlbWVudC5jcmVhdGVGYWN0b3J5O1xuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBSZWFjdEVsZW1lbnRWYWxpZGF0b3IgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudFZhbGlkYXRvcicpO1xuICBjcmVhdGVET01GYWN0b3J5ID0gUmVhY3RFbGVtZW50VmFsaWRhdG9yLmNyZWF0ZUZhY3Rvcnk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hcHBpbmcgZnJvbSBzdXBwb3J0ZWQgSFRNTCB0YWdzIHRvIGBSZWFjdERPTUNvbXBvbmVudGAgY2xhc3Nlcy5cbiAqIFRoaXMgaXMgYWxzbyBhY2Nlc3NpYmxlIHZpYSBgUmVhY3QuRE9NYC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbnZhciBSZWFjdERPTUZhY3RvcmllcyA9IHtcbiAgYTogY3JlYXRlRE9NRmFjdG9yeSgnYScpLFxuICBhYmJyOiBjcmVhdGVET01GYWN0b3J5KCdhYmJyJyksXG4gIGFkZHJlc3M6IGNyZWF0ZURPTUZhY3RvcnkoJ2FkZHJlc3MnKSxcbiAgYXJlYTogY3JlYXRlRE9NRmFjdG9yeSgnYXJlYScpLFxuICBhcnRpY2xlOiBjcmVhdGVET01GYWN0b3J5KCdhcnRpY2xlJyksXG4gIGFzaWRlOiBjcmVhdGVET01GYWN0b3J5KCdhc2lkZScpLFxuICBhdWRpbzogY3JlYXRlRE9NRmFjdG9yeSgnYXVkaW8nKSxcbiAgYjogY3JlYXRlRE9NRmFjdG9yeSgnYicpLFxuICBiYXNlOiBjcmVhdGVET01GYWN0b3J5KCdiYXNlJyksXG4gIGJkaTogY3JlYXRlRE9NRmFjdG9yeSgnYmRpJyksXG4gIGJkbzogY3JlYXRlRE9NRmFjdG9yeSgnYmRvJyksXG4gIGJpZzogY3JlYXRlRE9NRmFjdG9yeSgnYmlnJyksXG4gIGJsb2NrcXVvdGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2Jsb2NrcXVvdGUnKSxcbiAgYm9keTogY3JlYXRlRE9NRmFjdG9yeSgnYm9keScpLFxuICBicjogY3JlYXRlRE9NRmFjdG9yeSgnYnInKSxcbiAgYnV0dG9uOiBjcmVhdGVET01GYWN0b3J5KCdidXR0b24nKSxcbiAgY2FudmFzOiBjcmVhdGVET01GYWN0b3J5KCdjYW52YXMnKSxcbiAgY2FwdGlvbjogY3JlYXRlRE9NRmFjdG9yeSgnY2FwdGlvbicpLFxuICBjaXRlOiBjcmVhdGVET01GYWN0b3J5KCdjaXRlJyksXG4gIGNvZGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2NvZGUnKSxcbiAgY29sOiBjcmVhdGVET01GYWN0b3J5KCdjb2wnKSxcbiAgY29sZ3JvdXA6IGNyZWF0ZURPTUZhY3RvcnkoJ2NvbGdyb3VwJyksXG4gIGRhdGE6IGNyZWF0ZURPTUZhY3RvcnkoJ2RhdGEnKSxcbiAgZGF0YWxpc3Q6IGNyZWF0ZURPTUZhY3RvcnkoJ2RhdGFsaXN0JyksXG4gIGRkOiBjcmVhdGVET01GYWN0b3J5KCdkZCcpLFxuICBkZWw6IGNyZWF0ZURPTUZhY3RvcnkoJ2RlbCcpLFxuICBkZXRhaWxzOiBjcmVhdGVET01GYWN0b3J5KCdkZXRhaWxzJyksXG4gIGRmbjogY3JlYXRlRE9NRmFjdG9yeSgnZGZuJyksXG4gIGRpYWxvZzogY3JlYXRlRE9NRmFjdG9yeSgnZGlhbG9nJyksXG4gIGRpdjogY3JlYXRlRE9NRmFjdG9yeSgnZGl2JyksXG4gIGRsOiBjcmVhdGVET01GYWN0b3J5KCdkbCcpLFxuICBkdDogY3JlYXRlRE9NRmFjdG9yeSgnZHQnKSxcbiAgZW06IGNyZWF0ZURPTUZhY3RvcnkoJ2VtJyksXG4gIGVtYmVkOiBjcmVhdGVET01GYWN0b3J5KCdlbWJlZCcpLFxuICBmaWVsZHNldDogY3JlYXRlRE9NRmFjdG9yeSgnZmllbGRzZXQnKSxcbiAgZmlnY2FwdGlvbjogY3JlYXRlRE9NRmFjdG9yeSgnZmlnY2FwdGlvbicpLFxuICBmaWd1cmU6IGNyZWF0ZURPTUZhY3RvcnkoJ2ZpZ3VyZScpLFxuICBmb290ZXI6IGNyZWF0ZURPTUZhY3RvcnkoJ2Zvb3RlcicpLFxuICBmb3JtOiBjcmVhdGVET01GYWN0b3J5KCdmb3JtJyksXG4gIGgxOiBjcmVhdGVET01GYWN0b3J5KCdoMScpLFxuICBoMjogY3JlYXRlRE9NRmFjdG9yeSgnaDInKSxcbiAgaDM6IGNyZWF0ZURPTUZhY3RvcnkoJ2gzJyksXG4gIGg0OiBjcmVhdGVET01GYWN0b3J5KCdoNCcpLFxuICBoNTogY3JlYXRlRE9NRmFjdG9yeSgnaDUnKSxcbiAgaDY6IGNyZWF0ZURPTUZhY3RvcnkoJ2g2JyksXG4gIGhlYWQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2hlYWQnKSxcbiAgaGVhZGVyOiBjcmVhdGVET01GYWN0b3J5KCdoZWFkZXInKSxcbiAgaGdyb3VwOiBjcmVhdGVET01GYWN0b3J5KCdoZ3JvdXAnKSxcbiAgaHI6IGNyZWF0ZURPTUZhY3RvcnkoJ2hyJyksXG4gIGh0bWw6IGNyZWF0ZURPTUZhY3RvcnkoJ2h0bWwnKSxcbiAgaTogY3JlYXRlRE9NRmFjdG9yeSgnaScpLFxuICBpZnJhbWU6IGNyZWF0ZURPTUZhY3RvcnkoJ2lmcmFtZScpLFxuICBpbWc6IGNyZWF0ZURPTUZhY3RvcnkoJ2ltZycpLFxuICBpbnB1dDogY3JlYXRlRE9NRmFjdG9yeSgnaW5wdXQnKSxcbiAgaW5zOiBjcmVhdGVET01GYWN0b3J5KCdpbnMnKSxcbiAga2JkOiBjcmVhdGVET01GYWN0b3J5KCdrYmQnKSxcbiAga2V5Z2VuOiBjcmVhdGVET01GYWN0b3J5KCdrZXlnZW4nKSxcbiAgbGFiZWw6IGNyZWF0ZURPTUZhY3RvcnkoJ2xhYmVsJyksXG4gIGxlZ2VuZDogY3JlYXRlRE9NRmFjdG9yeSgnbGVnZW5kJyksXG4gIGxpOiBjcmVhdGVET01GYWN0b3J5KCdsaScpLFxuICBsaW5rOiBjcmVhdGVET01GYWN0b3J5KCdsaW5rJyksXG4gIG1haW46IGNyZWF0ZURPTUZhY3RvcnkoJ21haW4nKSxcbiAgbWFwOiBjcmVhdGVET01GYWN0b3J5KCdtYXAnKSxcbiAgbWFyazogY3JlYXRlRE9NRmFjdG9yeSgnbWFyaycpLFxuICBtZW51OiBjcmVhdGVET01GYWN0b3J5KCdtZW51JyksXG4gIG1lbnVpdGVtOiBjcmVhdGVET01GYWN0b3J5KCdtZW51aXRlbScpLFxuICBtZXRhOiBjcmVhdGVET01GYWN0b3J5KCdtZXRhJyksXG4gIG1ldGVyOiBjcmVhdGVET01GYWN0b3J5KCdtZXRlcicpLFxuICBuYXY6IGNyZWF0ZURPTUZhY3RvcnkoJ25hdicpLFxuICBub3NjcmlwdDogY3JlYXRlRE9NRmFjdG9yeSgnbm9zY3JpcHQnKSxcbiAgb2JqZWN0OiBjcmVhdGVET01GYWN0b3J5KCdvYmplY3QnKSxcbiAgb2w6IGNyZWF0ZURPTUZhY3RvcnkoJ29sJyksXG4gIG9wdGdyb3VwOiBjcmVhdGVET01GYWN0b3J5KCdvcHRncm91cCcpLFxuICBvcHRpb246IGNyZWF0ZURPTUZhY3RvcnkoJ29wdGlvbicpLFxuICBvdXRwdXQ6IGNyZWF0ZURPTUZhY3RvcnkoJ291dHB1dCcpLFxuICBwOiBjcmVhdGVET01GYWN0b3J5KCdwJyksXG4gIHBhcmFtOiBjcmVhdGVET01GYWN0b3J5KCdwYXJhbScpLFxuICBwaWN0dXJlOiBjcmVhdGVET01GYWN0b3J5KCdwaWN0dXJlJyksXG4gIHByZTogY3JlYXRlRE9NRmFjdG9yeSgncHJlJyksXG4gIHByb2dyZXNzOiBjcmVhdGVET01GYWN0b3J5KCdwcm9ncmVzcycpLFxuICBxOiBjcmVhdGVET01GYWN0b3J5KCdxJyksXG4gIHJwOiBjcmVhdGVET01GYWN0b3J5KCdycCcpLFxuICBydDogY3JlYXRlRE9NRmFjdG9yeSgncnQnKSxcbiAgcnVieTogY3JlYXRlRE9NRmFjdG9yeSgncnVieScpLFxuICBzOiBjcmVhdGVET01GYWN0b3J5KCdzJyksXG4gIHNhbXA6IGNyZWF0ZURPTUZhY3RvcnkoJ3NhbXAnKSxcbiAgc2NyaXB0OiBjcmVhdGVET01GYWN0b3J5KCdzY3JpcHQnKSxcbiAgc2VjdGlvbjogY3JlYXRlRE9NRmFjdG9yeSgnc2VjdGlvbicpLFxuICBzZWxlY3Q6IGNyZWF0ZURPTUZhY3RvcnkoJ3NlbGVjdCcpLFxuICBzbWFsbDogY3JlYXRlRE9NRmFjdG9yeSgnc21hbGwnKSxcbiAgc291cmNlOiBjcmVhdGVET01GYWN0b3J5KCdzb3VyY2UnKSxcbiAgc3BhbjogY3JlYXRlRE9NRmFjdG9yeSgnc3BhbicpLFxuICBzdHJvbmc6IGNyZWF0ZURPTUZhY3RvcnkoJ3N0cm9uZycpLFxuICBzdHlsZTogY3JlYXRlRE9NRmFjdG9yeSgnc3R5bGUnKSxcbiAgc3ViOiBjcmVhdGVET01GYWN0b3J5KCdzdWInKSxcbiAgc3VtbWFyeTogY3JlYXRlRE9NRmFjdG9yeSgnc3VtbWFyeScpLFxuICBzdXA6IGNyZWF0ZURPTUZhY3RvcnkoJ3N1cCcpLFxuICB0YWJsZTogY3JlYXRlRE9NRmFjdG9yeSgndGFibGUnKSxcbiAgdGJvZHk6IGNyZWF0ZURPTUZhY3RvcnkoJ3Rib2R5JyksXG4gIHRkOiBjcmVhdGVET01GYWN0b3J5KCd0ZCcpLFxuICB0ZXh0YXJlYTogY3JlYXRlRE9NRmFjdG9yeSgndGV4dGFyZWEnKSxcbiAgdGZvb3Q6IGNyZWF0ZURPTUZhY3RvcnkoJ3Rmb290JyksXG4gIHRoOiBjcmVhdGVET01GYWN0b3J5KCd0aCcpLFxuICB0aGVhZDogY3JlYXRlRE9NRmFjdG9yeSgndGhlYWQnKSxcbiAgdGltZTogY3JlYXRlRE9NRmFjdG9yeSgndGltZScpLFxuICB0aXRsZTogY3JlYXRlRE9NRmFjdG9yeSgndGl0bGUnKSxcbiAgdHI6IGNyZWF0ZURPTUZhY3RvcnkoJ3RyJyksXG4gIHRyYWNrOiBjcmVhdGVET01GYWN0b3J5KCd0cmFjaycpLFxuICB1OiBjcmVhdGVET01GYWN0b3J5KCd1JyksXG4gIHVsOiBjcmVhdGVET01GYWN0b3J5KCd1bCcpLFxuICAndmFyJzogY3JlYXRlRE9NRmFjdG9yeSgndmFyJyksXG4gIHZpZGVvOiBjcmVhdGVET01GYWN0b3J5KCd2aWRlbycpLFxuICB3YnI6IGNyZWF0ZURPTUZhY3RvcnkoJ3dicicpLFxuXG4gIC8vIFNWR1xuICBjaXJjbGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2NpcmNsZScpLFxuICBjbGlwUGF0aDogY3JlYXRlRE9NRmFjdG9yeSgnY2xpcFBhdGgnKSxcbiAgZGVmczogY3JlYXRlRE9NRmFjdG9yeSgnZGVmcycpLFxuICBlbGxpcHNlOiBjcmVhdGVET01GYWN0b3J5KCdlbGxpcHNlJyksXG4gIGc6IGNyZWF0ZURPTUZhY3RvcnkoJ2cnKSxcbiAgaW1hZ2U6IGNyZWF0ZURPTUZhY3RvcnkoJ2ltYWdlJyksXG4gIGxpbmU6IGNyZWF0ZURPTUZhY3RvcnkoJ2xpbmUnKSxcbiAgbGluZWFyR3JhZGllbnQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2xpbmVhckdyYWRpZW50JyksXG4gIG1hc2s6IGNyZWF0ZURPTUZhY3RvcnkoJ21hc2snKSxcbiAgcGF0aDogY3JlYXRlRE9NRmFjdG9yeSgncGF0aCcpLFxuICBwYXR0ZXJuOiBjcmVhdGVET01GYWN0b3J5KCdwYXR0ZXJuJyksXG4gIHBvbHlnb246IGNyZWF0ZURPTUZhY3RvcnkoJ3BvbHlnb24nKSxcbiAgcG9seWxpbmU6IGNyZWF0ZURPTUZhY3RvcnkoJ3BvbHlsaW5lJyksXG4gIHJhZGlhbEdyYWRpZW50OiBjcmVhdGVET01GYWN0b3J5KCdyYWRpYWxHcmFkaWVudCcpLFxuICByZWN0OiBjcmVhdGVET01GYWN0b3J5KCdyZWN0JyksXG4gIHN0b3A6IGNyZWF0ZURPTUZhY3RvcnkoJ3N0b3AnKSxcbiAgc3ZnOiBjcmVhdGVET01GYWN0b3J5KCdzdmcnKSxcbiAgdGV4dDogY3JlYXRlRE9NRmFjdG9yeSgndGV4dCcpLFxuICB0c3BhbjogY3JlYXRlRE9NRmFjdG9yeSgndHNwYW4nKVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUZhY3RvcmllczsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgnLi9SZWFjdEN1cnJlbnRPd25lcicpO1xuXG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcbnZhciBjYW5EZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vY2FuRGVmaW5lUHJvcGVydHknKTtcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudFN5bWJvbCcpO1xuXG52YXIgUkVTRVJWRURfUFJPUFMgPSB7XG4gIGtleTogdHJ1ZSxcbiAgcmVmOiB0cnVlLFxuICBfX3NlbGY6IHRydWUsXG4gIF9fc291cmNlOiB0cnVlXG59O1xuXG52YXIgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24sIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duO1xuXG5mdW5jdGlvbiBoYXNWYWxpZFJlZihjb25maWcpIHtcbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAncmVmJykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ3JlZicpLmdldDtcbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbmZpZy5yZWYgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgJ2tleScpKSB7XG4gICAgICB2YXIgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb25maWcsICdrZXknKS5nZXQ7XG4gICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBjb25maWcua2V5ICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nS2V5ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24pIHtcbiAgICAgIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duID0gdHJ1ZTtcbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzOiBga2V5YCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9mYi5tZS9yZWFjdC1zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKSA6IHZvaWQgMDtcbiAgICB9XG4gIH07XG4gIHdhcm5BYm91dEFjY2Vzc2luZ0tleS5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ2tleScsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ0tleSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgd2FybkFib3V0QWNjZXNzaW5nUmVmID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24pIHtcbiAgICAgIHNwZWNpYWxQcm9wUmVmV2FybmluZ1Nob3duID0gdHJ1ZTtcbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzOiBgcmVmYCBpcyBub3QgYSBwcm9wLiBUcnlpbmcgdG8gYWNjZXNzIGl0IHdpbGwgcmVzdWx0ICcgKyAnaW4gYHVuZGVmaW5lZGAgYmVpbmcgcmV0dXJuZWQuIElmIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgc2FtZSAnICsgJ3ZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgJyArICdwcm9wLiAoaHR0cHM6Ly9mYi5tZS9yZWFjdC1zcGVjaWFsLXByb3BzKScsIGRpc3BsYXlOYW1lKSA6IHZvaWQgMDtcbiAgICB9XG4gIH07XG4gIHdhcm5BYm91dEFjY2Vzc2luZ1JlZi5pc1JlYWN0V2FybmluZyA9IHRydWU7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgJ3JlZicsIHtcbiAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ1JlZixcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSk7XG59XG5cbi8qKlxuICogRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IFJlYWN0IGVsZW1lbnQuIFRoaXMgbm8gbG9uZ2VyIGFkaGVyZXMgdG9cbiAqIHRoZSBjbGFzcyBwYXR0ZXJuLCBzbyBkbyBub3QgdXNlIG5ldyB0byBjYWxsIGl0LiBBbHNvLCBubyBpbnN0YW5jZW9mIGNoZWNrXG4gKiB3aWxsIHdvcmsuIEluc3RlYWQgdGVzdCAkJHR5cGVvZiBmaWVsZCBhZ2FpbnN0IFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSB0byBjaGVja1xuICogaWYgc29tZXRoaW5nIGlzIGEgUmVhY3QgRWxlbWVudC5cbiAqXG4gKiBAcGFyYW0geyp9IHR5cGVcbiAqIEBwYXJhbSB7Kn0ga2V5XG4gKiBAcGFyYW0ge3N0cmluZ3xvYmplY3R9IHJlZlxuICogQHBhcmFtIHsqfSBzZWxmIEEgKnRlbXBvcmFyeSogaGVscGVyIHRvIGRldGVjdCBwbGFjZXMgd2hlcmUgYHRoaXNgIGlzXG4gKiBkaWZmZXJlbnQgZnJvbSB0aGUgYG93bmVyYCB3aGVuIFJlYWN0LmNyZWF0ZUVsZW1lbnQgaXMgY2FsbGVkLCBzbyB0aGF0IHdlXG4gKiBjYW4gd2Fybi4gV2Ugd2FudCB0byBnZXQgcmlkIG9mIG93bmVyIGFuZCByZXBsYWNlIHN0cmluZyBgcmVmYHMgd2l0aCBhcnJvd1xuICogZnVuY3Rpb25zLCBhbmQgYXMgbG9uZyBhcyBgdGhpc2AgYW5kIG93bmVyIGFyZSB0aGUgc2FtZSwgdGhlcmUgd2lsbCBiZSBub1xuICogY2hhbmdlIGluIGJlaGF2aW9yLlxuICogQHBhcmFtIHsqfSBzb3VyY2UgQW4gYW5ub3RhdGlvbiBvYmplY3QgKGFkZGVkIGJ5IGEgdHJhbnNwaWxlciBvciBvdGhlcndpc2UpXG4gKiBpbmRpY2F0aW5nIGZpbGVuYW1lLCBsaW5lIG51bWJlciwgYW5kL29yIG90aGVyIGluZm9ybWF0aW9uLlxuICogQHBhcmFtIHsqfSBvd25lclxuICogQHBhcmFtIHsqfSBwcm9wc1xuICogQGludGVybmFsXG4gKi9cbnZhciBSZWFjdEVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKSB7XG4gIHZhciBlbGVtZW50ID0ge1xuICAgIC8vIFRoaXMgdGFnIGFsbG93IHVzIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgYXMgYSBSZWFjdCBFbGVtZW50XG4gICAgJCR0eXBlb2Y6IFJFQUNUX0VMRU1FTlRfVFlQRSxcblxuICAgIC8vIEJ1aWx0LWluIHByb3BlcnRpZXMgdGhhdCBiZWxvbmcgb24gdGhlIGVsZW1lbnRcbiAgICB0eXBlOiB0eXBlLFxuICAgIGtleToga2V5LFxuICAgIHJlZjogcmVmLFxuICAgIHByb3BzOiBwcm9wcyxcblxuICAgIC8vIFJlY29yZCB0aGUgY29tcG9uZW50IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGlzIGVsZW1lbnQuXG4gICAgX293bmVyOiBvd25lclxuICB9O1xuXG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIC8vIFRoZSB2YWxpZGF0aW9uIGZsYWcgaXMgY3VycmVudGx5IG11dGF0aXZlLiBXZSBwdXQgaXQgb25cbiAgICAvLyBhbiBleHRlcm5hbCBiYWNraW5nIHN0b3JlIHNvIHRoYXQgd2UgY2FuIGZyZWV6ZSB0aGUgd2hvbGUgb2JqZWN0LlxuICAgIC8vIFRoaXMgY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBXZWFrTWFwIG9uY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgaW5cbiAgICAvLyBjb21tb25seSB1c2VkIGRldmVsb3BtZW50IGVudmlyb25tZW50cy5cbiAgICBlbGVtZW50Ll9zdG9yZSA9IHt9O1xuXG4gICAgLy8gVG8gbWFrZSBjb21wYXJpbmcgUmVhY3RFbGVtZW50cyBlYXNpZXIgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHdlIG1ha2VcbiAgICAvLyB0aGUgdmFsaWRhdGlvbiBmbGFnIG5vbi1lbnVtZXJhYmxlICh3aGVyZSBwb3NzaWJsZSwgd2hpY2ggc2hvdWxkXG4gICAgLy8gaW5jbHVkZSBldmVyeSBlbnZpcm9ubWVudCB3ZSBydW4gdGVzdHMgaW4pLCBzbyB0aGUgdGVzdCBmcmFtZXdvcmtcbiAgICAvLyBpZ25vcmVzIGl0LlxuICAgIGlmIChjYW5EZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGVsZW1lbnQuX3N0b3JlLCAndmFsaWRhdGVkJywge1xuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICAvLyBzZWxmIGFuZCBzb3VyY2UgYXJlIERFViBvbmx5IHByb3BlcnRpZXMuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zZWxmJywge1xuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogc2VsZlxuICAgICAgfSk7XG4gICAgICAvLyBUd28gZWxlbWVudHMgY3JlYXRlZCBpbiB0d28gZGlmZmVyZW50IHBsYWNlcyBzaG91bGQgYmUgY29uc2lkZXJlZFxuICAgICAgLy8gZXF1YWwgZm9yIHRlc3RpbmcgcHVycG9zZXMgYW5kIHRoZXJlZm9yZSB3ZSBoaWRlIGl0IGZyb20gZW51bWVyYXRpb24uXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudCwgJ19zb3VyY2UnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBzb3VyY2VcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgPSBmYWxzZTtcbiAgICAgIGVsZW1lbnQuX3NlbGYgPSBzZWxmO1xuICAgICAgZWxlbWVudC5fc291cmNlID0gc291cmNlO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50LnByb3BzKTtcbiAgICAgIE9iamVjdC5mcmVlemUoZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IFJlYWN0RWxlbWVudCBvZiB0aGUgZ2l2ZW4gdHlwZS5cbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jcmVhdGVlbGVtZW50XG4gKi9cblJlYWN0RWxlbWVudC5jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gKHR5cGUsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgdmFyIHByb3BOYW1lO1xuXG4gIC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcbiAgdmFyIHByb3BzID0ge307XG5cbiAgdmFyIGtleSA9IG51bGw7XG4gIHZhciByZWYgPSBudWxsO1xuICB2YXIgc2VsZiA9IG51bGw7XG4gIHZhciBzb3VyY2UgPSBudWxsO1xuXG4gIGlmIChjb25maWcgIT0gbnVsbCkge1xuICAgIGlmIChoYXNWYWxpZFJlZihjb25maWcpKSB7XG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgIH1cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIHNlbGYgPSBjb25maWcuX19zZWxmID09PSB1bmRlZmluZWQgPyBudWxsIDogY29uZmlnLl9fc2VsZjtcbiAgICBzb3VyY2UgPSBjb25maWcuX19zb3VyY2UgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zb3VyY2U7XG4gICAgLy8gUmVtYWluaW5nIHByb3BlcnRpZXMgYXJlIGFkZGVkIHRvIGEgbmV3IHByb3BzIG9iamVjdFxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cbiAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoT2JqZWN0LmZyZWV6ZSkge1xuICAgICAgICBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH1cblxuICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgaWYgKHR5cGUgJiYgdHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gdHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgZm9yIChwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoa2V5IHx8IHJlZikge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wcy4kJHR5cGVvZiA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvcHMuJCR0eXBlb2YgIT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgICAgICB2YXIgZGlzcGxheU5hbWUgPSB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyA/IHR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8ICdVbmtub3duJyA6IHR5cGU7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICBkZWZpbmVSZWZQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCwgcHJvcHMpO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIFJlYWN0RWxlbWVudHMgb2YgYSBnaXZlbiB0eXBlLlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNyZWF0ZWZhY3RvcnlcbiAqL1xuUmVhY3RFbGVtZW50LmNyZWF0ZUZhY3RvcnkgPSBmdW5jdGlvbiAodHlwZSkge1xuICB2YXIgZmFjdG9yeSA9IFJlYWN0RWxlbWVudC5jcmVhdGVFbGVtZW50LmJpbmQobnVsbCwgdHlwZSk7XG4gIC8vIEV4cG9zZSB0aGUgdHlwZSBvbiB0aGUgZmFjdG9yeSBhbmQgdGhlIHByb3RvdHlwZSBzbyB0aGF0IGl0IGNhbiBiZVxuICAvLyBlYXNpbHkgYWNjZXNzZWQgb24gZWxlbWVudHMuIEUuZy4gYDxGb28gLz4udHlwZSA9PT0gRm9vYC5cbiAgLy8gVGhpcyBzaG91bGQgbm90IGJlIG5hbWVkIGBjb25zdHJ1Y3RvcmAgc2luY2UgdGhpcyBtYXkgbm90IGJlIHRoZSBmdW5jdGlvblxuICAvLyB0aGF0IGNyZWF0ZWQgdGhlIGVsZW1lbnQsIGFuZCBpdCBtYXkgbm90IGV2ZW4gYmUgYSBjb25zdHJ1Y3Rvci5cbiAgLy8gTGVnYWN5IGhvb2sgVE9ETzogV2FybiBpZiB0aGlzIGlzIGFjY2Vzc2VkXG4gIGZhY3RvcnkudHlwZSA9IHR5cGU7XG4gIHJldHVybiBmYWN0b3J5O1xufTtcblxuUmVhY3RFbGVtZW50LmNsb25lQW5kUmVwbGFjZUtleSA9IGZ1bmN0aW9uIChvbGRFbGVtZW50LCBuZXdLZXkpIHtcbiAgdmFyIG5ld0VsZW1lbnQgPSBSZWFjdEVsZW1lbnQob2xkRWxlbWVudC50eXBlLCBuZXdLZXksIG9sZEVsZW1lbnQucmVmLCBvbGRFbGVtZW50Ll9zZWxmLCBvbGRFbGVtZW50Ll9zb3VyY2UsIG9sZEVsZW1lbnQuX293bmVyLCBvbGRFbGVtZW50LnByb3BzKTtcblxuICByZXR1cm4gbmV3RWxlbWVudDtcbn07XG5cbi8qKlxuICogQ2xvbmUgYW5kIHJldHVybiBhIG5ldyBSZWFjdEVsZW1lbnQgdXNpbmcgZWxlbWVudCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQuXG4gKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuY2xvbmVlbGVtZW50XG4gKi9cblJlYWN0RWxlbWVudC5jbG9uZUVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCwgY29uZmlnLCBjaGlsZHJlbikge1xuICB2YXIgcHJvcE5hbWU7XG5cbiAgLy8gT3JpZ2luYWwgcHJvcHMgYXJlIGNvcGllZFxuICB2YXIgcHJvcHMgPSBfYXNzaWduKHt9LCBlbGVtZW50LnByb3BzKTtcblxuICAvLyBSZXNlcnZlZCBuYW1lcyBhcmUgZXh0cmFjdGVkXG4gIHZhciBrZXkgPSBlbGVtZW50LmtleTtcbiAgdmFyIHJlZiA9IGVsZW1lbnQucmVmO1xuICAvLyBTZWxmIGlzIHByZXNlcnZlZCBzaW5jZSB0aGUgb3duZXIgaXMgcHJlc2VydmVkLlxuICB2YXIgc2VsZiA9IGVsZW1lbnQuX3NlbGY7XG4gIC8vIFNvdXJjZSBpcyBwcmVzZXJ2ZWQgc2luY2UgY2xvbmVFbGVtZW50IGlzIHVubGlrZWx5IHRvIGJlIHRhcmdldGVkIGJ5IGFcbiAgLy8gdHJhbnNwaWxlciwgYW5kIHRoZSBvcmlnaW5hbCBzb3VyY2UgaXMgcHJvYmFibHkgYSBiZXR0ZXIgaW5kaWNhdG9yIG9mIHRoZVxuICAvLyB0cnVlIG93bmVyLlxuICB2YXIgc291cmNlID0gZWxlbWVudC5fc291cmNlO1xuXG4gIC8vIE93bmVyIHdpbGwgYmUgcHJlc2VydmVkLCB1bmxlc3MgcmVmIGlzIG92ZXJyaWRkZW5cbiAgdmFyIG93bmVyID0gZWxlbWVudC5fb3duZXI7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIC8vIFNpbGVudGx5IHN0ZWFsIHRoZSByZWYgZnJvbSB0aGUgcGFyZW50LlxuICAgICAgcmVmID0gY29uZmlnLnJlZjtcbiAgICAgIG93bmVyID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudDtcbiAgICB9XG4gICAgaWYgKGhhc1ZhbGlkS2V5KGNvbmZpZykpIHtcbiAgICAgIGtleSA9ICcnICsgY29uZmlnLmtleTtcbiAgICB9XG5cbiAgICAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBvdmVycmlkZSBleGlzdGluZyBwcm9wc1xuICAgIHZhciBkZWZhdWx0UHJvcHM7XG4gICAgaWYgKGVsZW1lbnQudHlwZSAmJiBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzKSB7XG4gICAgICBkZWZhdWx0UHJvcHMgPSBlbGVtZW50LnR5cGUuZGVmYXVsdFByb3BzO1xuICAgIH1cbiAgICBmb3IgKHByb3BOYW1lIGluIGNvbmZpZykge1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBwcm9wTmFtZSkgJiYgIVJFU0VSVkVEX1BST1BTLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBpZiAoY29uZmlnW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkICYmIGRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gUmVzb2x2ZSBkZWZhdWx0IHByb3BzXG4gICAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQ2hpbGRyZW4gY2FuIGJlIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQsIGFuZCB0aG9zZSBhcmUgdHJhbnNmZXJyZWQgb250b1xuICAvLyB0aGUgbmV3bHkgYWxsb2NhdGVkIHByb3BzIG9iamVjdC5cbiAgdmFyIGNoaWxkcmVuTGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCAtIDI7XG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBBcnJheShjaGlsZHJlbkxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAyXTtcbiAgICB9XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZEFycmF5O1xuICB9XG5cbiAgcmV0dXJuIFJlYWN0RWxlbWVudChlbGVtZW50LnR5cGUsIGtleSwgcmVmLCBzZWxmLCBzb3VyY2UsIG93bmVyLCBwcm9wcyk7XG59O1xuXG4vKipcbiAqIFZlcmlmaWVzIHRoZSBvYmplY3QgaXMgYSBSZWFjdEVsZW1lbnQuXG4gKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuaXN2YWxpZGVsZW1lbnRcbiAqIEBwYXJhbSB7P29iamVjdH0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBvYmplY3RgIGlzIGEgdmFsaWQgY29tcG9uZW50LlxuICogQGZpbmFsXG4gKi9cblJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudCA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmIG9iamVjdCAhPT0gbnVsbCAmJiBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RFbGVtZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4vKipcbiAqIFJlYWN0RWxlbWVudFZhbGlkYXRvciBwcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIGEgZWxlbWVudCBmYWN0b3J5XG4gKiB3aGljaCB2YWxpZGF0ZXMgdGhlIHByb3BzIHBhc3NlZCB0byB0aGUgZWxlbWVudC4gVGhpcyBpcyBpbnRlbmRlZCB0byBiZVxuICogdXNlZCBvbmx5IGluIERFViBhbmQgY291bGQgYmUgcmVwbGFjZWQgYnkgYSBzdGF0aWMgdHlwZSBjaGVja2VyIGZvciBsYW5ndWFnZXNcbiAqIHRoYXQgc3VwcG9ydCBpdC5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJy4vUmVhY3RDdXJyZW50T3duZXInKTtcbnZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG52YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTtcblxudmFyIGNoZWNrUmVhY3RUeXBlU3BlYyA9IHJlcXVpcmUoJy4vY2hlY2tSZWFjdFR5cGVTcGVjJyk7XG5cbnZhciBjYW5EZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vY2FuRGVmaW5lUHJvcGVydHknKTtcbnZhciBnZXRJdGVyYXRvckZuID0gcmVxdWlyZSgnLi9nZXRJdGVyYXRvckZuJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCkge1xuICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIHZhciBuYW1lID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5nZXROYW1lKCk7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHJldHVybiAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgfVxuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZ2V0U291cmNlSW5mb0Vycm9yQWRkZW5kdW0oZWxlbWVudFByb3BzKSB7XG4gIGlmIChlbGVtZW50UHJvcHMgIT09IG51bGwgJiYgZWxlbWVudFByb3BzICE9PSB1bmRlZmluZWQgJiYgZWxlbWVudFByb3BzLl9fc291cmNlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgc291cmNlID0gZWxlbWVudFByb3BzLl9fc291cmNlO1xuICAgIHZhciBmaWxlTmFtZSA9IHNvdXJjZS5maWxlTmFtZS5yZXBsYWNlKC9eLipbXFxcXFxcL10vLCAnJyk7XG4gICAgdmFyIGxpbmVOdW1iZXIgPSBzb3VyY2UubGluZU51bWJlcjtcbiAgICByZXR1cm4gJyBDaGVjayB5b3VyIGNvZGUgYXQgJyArIGZpbGVOYW1lICsgJzonICsgbGluZU51bWJlciArICcuJztcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogV2FybiBpZiB0aGVyZSdzIG5vIGtleSBleHBsaWNpdGx5IHNldCBvbiBkeW5hbWljIGFycmF5cyBvZiBjaGlsZHJlbiBvclxuICogb2JqZWN0IGtleXMgYXJlIG5vdCB2YWxpZC4gVGhpcyBhbGxvd3MgdXMgdG8ga2VlcCB0cmFjayBvZiBjaGlsZHJlbiBiZXR3ZWVuXG4gKiB1cGRhdGVzLlxuICovXG52YXIgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICB2YXIgaW5mbyA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bSgpO1xuXG4gIGlmICghaW5mbykge1xuICAgIHZhciBwYXJlbnROYW1lID0gdHlwZW9mIHBhcmVudFR5cGUgPT09ICdzdHJpbmcnID8gcGFyZW50VHlwZSA6IHBhcmVudFR5cGUuZGlzcGxheU5hbWUgfHwgcGFyZW50VHlwZS5uYW1lO1xuICAgIGlmIChwYXJlbnROYW1lKSB7XG4gICAgICBpbmZvID0gJyBDaGVjayB0aGUgdG9wLWxldmVsIHJlbmRlciBjYWxsIHVzaW5nIDwnICsgcGFyZW50TmFtZSArICc+Lic7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmZvO1xufVxuXG4vKipcbiAqIFdhcm4gaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGV4cGxpY2l0IGtleSBhc3NpZ25lZCB0byBpdC5cbiAqIFRoaXMgZWxlbWVudCBpcyBpbiBhbiBhcnJheS4gVGhlIGFycmF5IGNvdWxkIGdyb3cgYW5kIHNocmluayBvciBiZVxuICogcmVvcmRlcmVkLiBBbGwgY2hpbGRyZW4gdGhhdCBoYXZlbid0IGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYXJlIHJlcXVpcmVkIHRvXG4gKiBoYXZlIGEgXCJrZXlcIiBwcm9wZXJ0eSBhc3NpZ25lZCB0byBpdC4gRXJyb3Igc3RhdHVzZXMgYXJlIGNhY2hlZCBzbyBhIHdhcm5pbmdcbiAqIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0aGF0IHJlcXVpcmVzIGEga2V5LlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIGVsZW1lbnQncyBwYXJlbnQncyB0eXBlLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUV4cGxpY2l0S2V5KGVsZW1lbnQsIHBhcmVudFR5cGUpIHtcbiAgaWYgKCFlbGVtZW50Ll9zdG9yZSB8fCBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgfHwgZWxlbWVudC5rZXkgIT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgPSB0cnVlO1xuXG4gIHZhciBtZW1vaXplciA9IG93bmVySGFzS2V5VXNlV2FybmluZy51bmlxdWVLZXkgfHwgKG93bmVySGFzS2V5VXNlV2FybmluZy51bmlxdWVLZXkgPSB7fSk7XG5cbiAgdmFyIGN1cnJlbnRDb21wb25lbnRFcnJvckluZm8gPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpO1xuICBpZiAobWVtb2l6ZXJbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10pIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbWVtb2l6ZXJbY3VycmVudENvbXBvbmVudEVycm9ySW5mb10gPSB0cnVlO1xuXG4gIC8vIFVzdWFsbHkgdGhlIGN1cnJlbnQgb3duZXIgaXMgdGhlIG9mZmVuZGVyLCBidXQgaWYgaXQgYWNjZXB0cyBjaGlsZHJlbiBhcyBhXG4gIC8vIHByb3BlcnR5LCBpdCBtYXkgYmUgdGhlIGNyZWF0b3Igb2YgdGhlIGNoaWxkIHRoYXQncyByZXNwb25zaWJsZSBmb3JcbiAgLy8gYXNzaWduaW5nIGl0IGEga2V5LlxuICB2YXIgY2hpbGRPd25lciA9ICcnO1xuICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Ll9vd25lciAmJiBlbGVtZW50Ll9vd25lciAhPT0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgIC8vIEdpdmUgdGhlIGNvbXBvbmVudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGlzIGNoaWxkLlxuICAgIGNoaWxkT3duZXIgPSAnIEl0IHdhcyBwYXNzZWQgYSBjaGlsZCBmcm9tICcgKyBlbGVtZW50Ll9vd25lci5nZXROYW1lKCkgKyAnLic7XG4gIH1cblxuICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdFYWNoIGNoaWxkIGluIGFuIGFycmF5IG9yIGl0ZXJhdG9yIHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4nICsgJyVzJXMgU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLiVzJywgY3VycmVudENvbXBvbmVudEVycm9ySW5mbywgY2hpbGRPd25lciwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRDdXJyZW50U3RhY2tBZGRlbmR1bShlbGVtZW50KSkgOiB2b2lkIDA7XG59XG5cbi8qKlxuICogRW5zdXJlIHRoYXQgZXZlcnkgZWxlbWVudCBlaXRoZXIgaXMgcGFzc2VkIGluIGEgc3RhdGljIGxvY2F0aW9uLCBpbiBhblxuICogYXJyYXkgd2l0aCBhbiBleHBsaWNpdCBrZXlzIHByb3BlcnR5IGRlZmluZWQsIG9yIGluIGFuIG9iamVjdCBsaXRlcmFsXG4gKiB3aXRoIHZhbGlkIGtleSBwcm9wZXJ0eS5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UmVhY3ROb2RlfSBub2RlIFN0YXRpY2FsbHkgcGFzc2VkIGNoaWxkIG9mIGFueSB0eXBlLlxuICogQHBhcmFtIHsqfSBwYXJlbnRUeXBlIG5vZGUncyBwYXJlbnQncyB0eXBlLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZUNoaWxkS2V5cyhub2RlLCBwYXJlbnRUeXBlKSB7XG4gIGlmICh0eXBlb2Ygbm9kZSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkobm9kZSkpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBjaGlsZCA9IG5vZGVbaV07XG4gICAgICBpZiAoUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KGNoaWxkLCBwYXJlbnRUeXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgLy8gVGhpcyBlbGVtZW50IHdhcyBwYXNzZWQgaW4gYSB2YWxpZCBsb2NhdGlvbi5cbiAgICBpZiAobm9kZS5fc3RvcmUpIHtcbiAgICAgIG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG4gICAgfVxuICB9IGVsc2UgaWYgKG5vZGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obm9kZSk7XG4gICAgLy8gRW50cnkgaXRlcmF0b3JzIHByb3ZpZGUgaW1wbGljaXQga2V5cy5cbiAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IG5vZGUuZW50cmllcykge1xuICAgICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwobm9kZSk7XG4gICAgICAgIHZhciBzdGVwO1xuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgaWYgKFJlYWN0RWxlbWVudC5pc1ZhbGlkRWxlbWVudChzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShzdGVwLnZhbHVlLCBwYXJlbnRUeXBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHaXZlbiBhbiBlbGVtZW50LCB2YWxpZGF0ZSB0aGF0IGl0cyBwcm9wcyBmb2xsb3cgdGhlIHByb3BUeXBlcyBkZWZpbml0aW9uLFxuICogcHJvdmlkZWQgYnkgdGhlIHR5cGUuXG4gKlxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnRcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCkge1xuICB2YXIgY29tcG9uZW50Q2xhc3MgPSBlbGVtZW50LnR5cGU7XG4gIGlmICh0eXBlb2YgY29tcG9uZW50Q2xhc3MgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG5hbWUgPSBjb21wb25lbnRDbGFzcy5kaXNwbGF5TmFtZSB8fCBjb21wb25lbnRDbGFzcy5uYW1lO1xuICBpZiAoY29tcG9uZW50Q2xhc3MucHJvcFR5cGVzKSB7XG4gICAgY2hlY2tSZWFjdFR5cGVTcGVjKGNvbXBvbmVudENsYXNzLnByb3BUeXBlcywgZWxlbWVudC5wcm9wcywgJ3Byb3AnLCBuYW1lLCBlbGVtZW50LCBudWxsKTtcbiAgfVxuICBpZiAodHlwZW9mIGNvbXBvbmVudENsYXNzLmdldERlZmF1bHRQcm9wcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhjb21wb25lbnRDbGFzcy5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQsICdnZXREZWZhdWx0UHJvcHMgaXMgb25seSB1c2VkIG9uIGNsYXNzaWMgUmVhY3QuY3JlYXRlQ2xhc3MgJyArICdkZWZpbml0aW9ucy4gVXNlIGEgc3RhdGljIHByb3BlcnR5IG5hbWVkIGBkZWZhdWx0UHJvcHNgIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gIH1cbn1cblxudmFyIFJlYWN0RWxlbWVudFZhbGlkYXRvciA9IHtcblxuICBjcmVhdGVFbGVtZW50OiBmdW5jdGlvbiAodHlwZSwgcHJvcHMsIGNoaWxkcmVuKSB7XG4gICAgdmFyIHZhbGlkVHlwZSA9IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJztcbiAgICAvLyBXZSB3YXJuIGluIHRoaXMgY2FzZSBidXQgZG9uJ3QgdGhyb3cuIFdlIGV4cGVjdCB0aGUgZWxlbWVudCBjcmVhdGlvbiB0b1xuICAgIC8vIHN1Y2NlZWQgYW5kIHRoZXJlIHdpbGwgbGlrZWx5IGJlIGVycm9ycyBpbiByZW5kZXIuXG4gICAgaWYgKCF2YWxpZFR5cGUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIGluZm8gPSAnJztcbiAgICAgICAgaWYgKHR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdHlwZSA9PT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gbnVsbCAmJiBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBpbmZvICs9ICcgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgJyArICdpdFxcJ3MgZGVmaW5lZCBpbi4nO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNvdXJjZUluZm8gPSBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShwcm9wcyk7XG4gICAgICAgIGlmIChzb3VyY2VJbmZvKSB7XG4gICAgICAgICAgaW5mbyArPSBzb3VyY2VJbmZvO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluZm8gKz0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbmZvICs9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0Q3VycmVudFN0YWNrQWRkZW5kdW0oKTtcblxuICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdSZWFjdC5jcmVhdGVFbGVtZW50OiB0eXBlIGlzIGludmFsaWQgLS0gZXhwZWN0ZWQgYSBzdHJpbmcgKGZvciAnICsgJ2J1aWx0LWluIGNvbXBvbmVudHMpIG9yIGEgY2xhc3MvZnVuY3Rpb24gKGZvciBjb21wb3NpdGUgJyArICdjb21wb25lbnRzKSBidXQgZ290OiAlcy4lcycsIHR5cGUgPT0gbnVsbCA/IHR5cGUgOiB0eXBlb2YgdHlwZSwgaW5mbykgOiB2b2lkIDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGVsZW1lbnQgPSBSZWFjdEVsZW1lbnQuY3JlYXRlRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgLy8gVGhlIHJlc3VsdCBjYW4gYmUgbnVsbGlzaCBpZiBhIG1vY2sgb3IgYSBjdXN0b20gZnVuY3Rpb24gaXMgdXNlZC5cbiAgICAvLyBUT0RPOiBEcm9wIHRoaXMgd2hlbiB0aGVzZSBhcmUgbm8gbG9uZ2VyIGFsbG93ZWQgYXMgdGhlIHR5cGUgYXJndW1lbnQuXG4gICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLy8gU2tpcCBrZXkgd2FybmluZyBpZiB0aGUgdHlwZSBpc24ndCB2YWxpZCBzaW5jZSBvdXIga2V5IHZhbGlkYXRpb24gbG9naWNcbiAgICAvLyBkb2Vzbid0IGV4cGVjdCBhIG5vbi1zdHJpbmcvZnVuY3Rpb24gdHlwZSBhbmQgY2FuIHRocm93IGNvbmZ1c2luZyBlcnJvcnMuXG4gICAgLy8gV2UgZG9uJ3Qgd2FudCBleGNlcHRpb24gYmVoYXZpb3IgdG8gZGlmZmVyIGJldHdlZW4gZGV2IGFuZCBwcm9kLlxuICAgIC8vIChSZW5kZXJpbmcgd2lsbCB0aHJvdyB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlIGFuZCBhcyBzb29uIGFzIHRoZSB0eXBlIGlzXG4gICAgLy8gZml4ZWQsIHRoZSBrZXkgd2FybmluZ3Mgd2lsbCBhcHBlYXIuKVxuICAgIGlmICh2YWxpZFR5cGUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgdHlwZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFsaWRhdGVQcm9wVHlwZXMoZWxlbWVudCk7XG5cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfSxcblxuICBjcmVhdGVGYWN0b3J5OiBmdW5jdGlvbiAodHlwZSkge1xuICAgIHZhciB2YWxpZGF0ZWRGYWN0b3J5ID0gUmVhY3RFbGVtZW50VmFsaWRhdG9yLmNyZWF0ZUVsZW1lbnQuYmluZChudWxsLCB0eXBlKTtcbiAgICAvLyBMZWdhY3kgaG9vayBUT0RPOiBXYXJuIGlmIHRoaXMgaXMgYWNjZXNzZWRcbiAgICB2YWxpZGF0ZWRGYWN0b3J5LnR5cGUgPSB0eXBlO1xuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoY2FuRGVmaW5lUHJvcGVydHkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZhbGlkYXRlZEZhY3RvcnksICd0eXBlJywge1xuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnRmFjdG9yeS50eXBlIGlzIGRlcHJlY2F0ZWQuIEFjY2VzcyB0aGUgY2xhc3MgZGlyZWN0bHkgJyArICdiZWZvcmUgcGFzc2luZyBpdCB0byBjcmVhdGVGYWN0b3J5LicpIDogdm9pZCAwO1xuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICd0eXBlJywge1xuICAgICAgICAgICAgICB2YWx1ZTogdHlwZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2YWxpZGF0ZWRGYWN0b3J5O1xuICB9LFxuXG4gIGNsb25lRWxlbWVudDogZnVuY3Rpb24gKGVsZW1lbnQsIHByb3BzLCBjaGlsZHJlbikge1xuICAgIHZhciBuZXdFbGVtZW50ID0gUmVhY3RFbGVtZW50LmNsb25lRWxlbWVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIG5ld0VsZW1lbnQudHlwZSk7XG4gICAgfVxuICAgIHZhbGlkYXRlUHJvcFR5cGVzKG5ld0VsZW1lbnQpO1xuICAgIHJldHVybiBuZXdFbGVtZW50O1xuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RFbGVtZW50VmFsaWRhdG9yOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG5mdW5jdGlvbiB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgY2FsbGVyTmFtZSkge1xuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YXIgY29uc3RydWN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjtcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyguLi4pOiBDYW4gb25seSB1cGRhdGUgYSBtb3VudGVkIG9yIG1vdW50aW5nIGNvbXBvbmVudC4gJyArICdUaGlzIHVzdWFsbHkgbWVhbnMgeW91IGNhbGxlZCAlcygpIG9uIGFuIHVubW91bnRlZCBjb21wb25lbnQuICcgKyAnVGhpcyBpcyBhIG5vLW9wLiBQbGVhc2UgY2hlY2sgdGhlIGNvZGUgZm9yIHRoZSAlcyBjb21wb25lbnQuJywgY2FsbGVyTmFtZSwgY2FsbGVyTmFtZSwgY29uc3RydWN0b3IgJiYgKGNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IGNvbnN0cnVjdG9yLm5hbWUpIHx8ICdSZWFjdENsYXNzJykgOiB2b2lkIDA7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBBUEkgZm9yIGFuIHVwZGF0ZSBxdWV1ZS5cbiAqL1xudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0ge1xuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBjb21wb3NpdGUgY29tcG9uZW50IGlzIG1vdW50ZWQuXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHdlIHdhbnQgdG8gdGVzdC5cbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBtb3VudGVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGZpbmFsXG4gICAqL1xuICBpc01vdW50ZWQ6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICAvKipcbiAgICogRW5xdWV1ZSBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhZnRlciBhbGwgdGhlIHBlbmRpbmcgdXBkYXRlc1xuICAgKiBoYXZlIHByb2Nlc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdG8gdXNlIGFzIGB0aGlzYCBjb250ZXh0LlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZUNhbGxiYWNrOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UsIGNhbGxiYWNrKSB7fSxcblxuICAvKipcbiAgICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICAgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICAgKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC5cbiAgICpcbiAgICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICAgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogUmVwbGFjZXMgYWxsIG9mIHRoZSBzdGF0ZS4gQWx3YXlzIHVzZSB0aGlzIG9yIGBzZXRTdGF0ZWAgdG8gbXV0YXRlIHN0YXRlLlxuICAgKiBZb3Ugc2hvdWxkIHRyZWF0IGB0aGlzLnN0YXRlYCBhcyBpbW11dGFibGUuXG4gICAqXG4gICAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gICAqIGFjY2Vzc2luZyBgdGhpcy5zdGF0ZWAgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBvbGQgdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29tcGxldGVTdGF0ZSBOZXh0IHN0YXRlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVSZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY29tcGxldGVTdGF0ZSkge1xuICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0YXRlJyk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2UgX3BlbmRpbmdTdGF0ZSBpc1xuICAgKiBpbnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcgc3RyYXRlZ3kgdGhhdCBpcyBub3QgYXZhaWxhYmxlIHRvIGRlZXBcbiAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25mdXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0XG4gICAqIGR1cmluZyB0aGUgbWVyZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBzdGF0ZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgcGFydGlhbFN0YXRlKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdzZXRTdGF0ZScpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcmVxdWlyZSA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50JyksXG4gICAgaXNWYWxpZEVsZW1lbnQgPSBfcmVxdWlyZS5pc1ZhbGlkRWxlbWVudDtcblxudmFyIGZhY3RvcnkgPSByZXF1aXJlKCdwcm9wLXR5cGVzL2ZhY3RvcnknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KGlzVmFsaWRFbGVtZW50KTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIFJlYWN0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudCcpO1xudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0gcmVxdWlyZSgnLi9SZWFjdE5vb3BVcGRhdGVRdWV1ZScpO1xuXG52YXIgZW1wdHlPYmplY3QgPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eU9iamVjdCcpO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgaGVscGVycyBmb3IgdGhlIHVwZGF0aW5nIHN0YXRlIG9mIGEgY29tcG9uZW50LlxuICovXG5mdW5jdGlvbiBSZWFjdFB1cmVDb21wb25lbnQocHJvcHMsIGNvbnRleHQsIHVwZGF0ZXIpIHtcbiAgLy8gRHVwbGljYXRlZCBmcm9tIFJlYWN0Q29tcG9uZW50LlxuICB0aGlzLnByb3BzID0gcHJvcHM7XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICAvLyBXZSBpbml0aWFsaXplIHRoZSBkZWZhdWx0IHVwZGF0ZXIgYnV0IHRoZSByZWFsIG9uZSBnZXRzIGluamVjdGVkIGJ5IHRoZVxuICAvLyByZW5kZXJlci5cbiAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbn1cblxuZnVuY3Rpb24gQ29tcG9uZW50RHVtbXkoKSB7fVxuQ29tcG9uZW50RHVtbXkucHJvdG90eXBlID0gUmVhY3RDb21wb25lbnQucHJvdG90eXBlO1xuUmVhY3RQdXJlQ29tcG9uZW50LnByb3RvdHlwZSA9IG5ldyBDb21wb25lbnREdW1teSgpO1xuUmVhY3RQdXJlQ29tcG9uZW50LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlYWN0UHVyZUNvbXBvbmVudDtcbi8vIEF2b2lkIGFuIGV4dHJhIHByb3RvdHlwZSBqdW1wIGZvciB0aGVzZSBtZXRob2RzLlxuX2Fzc2lnbihSZWFjdFB1cmVDb21wb25lbnQucHJvdG90eXBlLCBSZWFjdENvbXBvbmVudC5wcm90b3R5cGUpO1xuUmVhY3RQdXJlQ29tcG9uZW50LnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCA9IHRydWU7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RQdXJlQ29tcG9uZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGNhbkRlZmluZVByb3BlcnR5ID0gZmFsc2U7XG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdHJ5IHtcbiAgICAvLyAkRmxvd0ZpeE1lIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9mbG93L2lzc3Vlcy8yODVcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICd4JywgeyBnZXQ6IGZ1bmN0aW9uICgpIHt9IH0pO1xuICAgIGNhbkRlZmluZVByb3BlcnR5ID0gdHJ1ZTtcbiAgfSBjYXRjaCAoeCkge1xuICAgIC8vIElFIHdpbGwgZmFpbCBvbiBkZWZpbmVQcm9wZXJ0eVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2FuRGVmaW5lUHJvcGVydHk7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzID0gcmVxdWlyZSgnLi9SZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcycpO1xudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2s7XG5cbmlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnYgJiYgXCJkZXZlbG9wbWVudFwiID09PSAndGVzdCcpIHtcbiAgLy8gVGVtcG9yYXJ5IGhhY2suXG4gIC8vIElubGluZSByZXF1aXJlcyBkb24ndCB3b3JrIHdlbGwgd2l0aCBKZXN0OlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNDBcbiAgLy8gUmVtb3ZlIHRoZSBpbmxpbmUgcmVxdWlyZXMgd2hlbiB3ZSBkb24ndCBuZWVkIHRoZW0gYW55bW9yZTpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzE3OFxuICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG59XG5cbnZhciBsb2dnZWRUeXBlRmFpbHVyZXMgPSB7fTtcblxuLyoqXG4gKiBBc3NlcnQgdGhhdCB0aGUgdmFsdWVzIG1hdGNoIHdpdGggdGhlIHR5cGUgc3BlY3MuXG4gKiBFcnJvciBtZXNzYWdlcyBhcmUgbWVtb3JpemVkIGFuZCB3aWxsIG9ubHkgYmUgc2hvd24gb25jZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gdHlwZVNwZWNzIE1hcCBvZiBuYW1lIHRvIGEgUmVhY3RQcm9wVHlwZVxuICogQHBhcmFtIHtvYmplY3R9IHZhbHVlcyBSdW50aW1lIHZhbHVlcyB0aGF0IG5lZWQgdG8gYmUgdHlwZS1jaGVja2VkXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiBcInByb3BcIiwgXCJjb250ZXh0XCIsIFwiY2hpbGQgY29udGV4dFwiXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcG9uZW50TmFtZSBOYW1lIG9mIHRoZSBjb21wb25lbnQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICogQHBhcmFtIHs/b2JqZWN0fSBlbGVtZW50IFRoZSBSZWFjdCBlbGVtZW50IHRoYXQgaXMgYmVpbmcgdHlwZS1jaGVja2VkXG4gKiBAcGFyYW0gez9udW1iZXJ9IGRlYnVnSUQgVGhlIFJlYWN0IGNvbXBvbmVudCBpbnN0YW5jZSB0aGF0IGlzIGJlaW5nIHR5cGUtY2hlY2tlZFxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tSZWFjdFR5cGVTcGVjKHR5cGVTcGVjcywgdmFsdWVzLCBsb2NhdGlvbiwgY29tcG9uZW50TmFtZSwgZWxlbWVudCwgZGVidWdJRCkge1xuICBmb3IgKHZhciB0eXBlU3BlY05hbWUgaW4gdHlwZVNwZWNzKSB7XG4gICAgaWYgKHR5cGVTcGVjcy5oYXNPd25Qcm9wZXJ0eSh0eXBlU3BlY05hbWUpKSB7XG4gICAgICB2YXIgZXJyb3I7XG4gICAgICAvLyBQcm9wIHR5cGUgdmFsaWRhdGlvbiBtYXkgdGhyb3cuIEluIGNhc2UgdGhleSBkbywgd2UgZG9uJ3Qgd2FudCB0b1xuICAgICAgLy8gZmFpbCB0aGUgcmVuZGVyIHBoYXNlIHdoZXJlIGl0IGRpZG4ndCBmYWlsIGJlZm9yZS4gU28gd2UgbG9nIGl0LlxuICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGFuIGludmFyaWFudCB0aGF0IGdldHMgY2F1Z2h0LiBJdCdzIHRoZSBzYW1lXG4gICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgISh0eXBlb2YgdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0gPT09ICdmdW5jdGlvbicpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICclczogJXMgdHlwZSBgJXNgIGlzIGludmFsaWQ7IGl0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tIFJlYWN0LlByb3BUeXBlcy4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXSwgdHlwZVNwZWNOYW1lKSA6IF9wcm9kSW52YXJpYW50KCc4NCcsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dLCB0eXBlU3BlY05hbWUpIDogdm9pZCAwO1xuICAgICAgICBlcnJvciA9IHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdKHZhbHVlcywgdHlwZVNwZWNOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgbnVsbCwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgZXJyb3IgPSBleDtcbiAgICAgIH1cbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghZXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciwgJyVzOiB0eXBlIHNwZWNpZmljYXRpb24gb2YgJXMgYCVzYCBpcyBpbnZhbGlkOyB0aGUgdHlwZSBjaGVja2VyICcgKyAnZnVuY3Rpb24gbXVzdCByZXR1cm4gYG51bGxgIG9yIGFuIGBFcnJvcmAgYnV0IHJldHVybmVkIGEgJXMuICcgKyAnWW91IG1heSBoYXZlIGZvcmdvdHRlbiB0byBwYXNzIGFuIGFyZ3VtZW50IHRvIHRoZSB0eXBlIGNoZWNrZXIgJyArICdjcmVhdG9yIChhcnJheU9mLCBpbnN0YW5jZU9mLCBvYmplY3RPZiwgb25lT2YsIG9uZU9mVHlwZSwgYW5kICcgKyAnc2hhcGUgYWxsIHJlcXVpcmUgYW4gYXJndW1lbnQpLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dLCB0eXBlU3BlY05hbWUsIHR5cGVvZiBlcnJvcikgOiB2b2lkIDA7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAvLyBPbmx5IG1vbml0b3IgdGhpcyBmYWlsdXJlIG9uY2UgYmVjYXVzZSB0aGVyZSB0ZW5kcyB0byBiZSBhIGxvdCBvZiB0aGVcbiAgICAgICAgLy8gc2FtZSBlcnJvci5cbiAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTtcblxuICAgICAgICB2YXIgY29tcG9uZW50U3RhY2tJbmZvID0gJyc7XG5cbiAgICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgaWYgKCFSZWFjdENvbXBvbmVudFRyZWVIb29rKSB7XG4gICAgICAgICAgICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkZWJ1Z0lEICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wb25lbnRTdGFja0luZm8gPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcG9uZW50U3RhY2tJbmZvID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRDdXJyZW50U3RhY2tBZGRlbmR1bShlbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdGYWlsZWQgJXMgdHlwZTogJXMlcycsIGxvY2F0aW9uLCBlcnJvci5tZXNzYWdlLCBjb21wb25lbnRTdGFja0luZm8pIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNoZWNrUmVhY3RUeXBlU3BlYzsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBuZXh0RGVidWdJRCA9IDE7XG5cbmZ1bmN0aW9uIGdldE5leHREZWJ1Z0lEKCkge1xuICByZXR1cm4gbmV4dERlYnVnSUQrKztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXROZXh0RGVidWdJRDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0RWxlbWVudCA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBjaGlsZCBpbiBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4gYW5kIHZlcmlmaWVzIHRoYXQgdGhlcmVcbiAqIGlzIG9ubHkgb25lIGNoaWxkIGluIHRoZSBjb2xsZWN0aW9uLlxuICpcbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jaGlsZHJlbi5vbmx5XG4gKlxuICogVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgYSBzaW5nbGUgY2hpbGQgZ2V0c1xuICogcGFzc2VkIHdpdGhvdXQgYSB3cmFwcGVyLCBidXQgdGhlIHB1cnBvc2Ugb2YgdGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgdG9cbiAqIGFic3RyYWN0IGF3YXkgdGhlIHBhcnRpY3VsYXIgc3RydWN0dXJlIG9mIGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7P29iamVjdH0gY2hpbGRyZW4gQ2hpbGQgY29sbGVjdGlvbiBzdHJ1Y3R1cmUuXG4gKiBAcmV0dXJuIHtSZWFjdEVsZW1lbnR9IFRoZSBmaXJzdCBhbmQgb25seSBgUmVhY3RFbGVtZW50YCBjb250YWluZWQgaW4gdGhlXG4gKiBzdHJ1Y3R1cmUuXG4gKi9cbmZ1bmN0aW9uIG9ubHlDaGlsZChjaGlsZHJlbikge1xuICAhUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuJykgOiBfcHJvZEludmFyaWFudCgnMTQzJykgOiB2b2lkIDA7XG4gIHJldHVybiBjaGlsZHJlbjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvbmx5Q2hpbGQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgnLi9SZWFjdEN1cnJlbnRPd25lcicpO1xudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50U3ltYm9sJyk7XG5cbnZhciBnZXRJdGVyYXRvckZuID0gcmVxdWlyZSgnLi9nZXRJdGVyYXRvckZuJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgS2V5RXNjYXBlVXRpbHMgPSByZXF1aXJlKCcuL0tleUVzY2FwZVV0aWxzJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIFNFUEFSQVRPUiA9ICcuJztcbnZhciBTVUJTRVBBUkFUT1IgPSAnOic7XG5cbi8qKlxuICogVGhpcyBpcyBpbmxpbmVkIGZyb20gUmVhY3RFbGVtZW50IHNpbmNlIHRoaXMgZmlsZSBpcyBzaGFyZWQgYmV0d2VlblxuICogaXNvbW9ycGhpYyBhbmQgcmVuZGVyZXJzLiBXZSBjb3VsZCBleHRyYWN0IHRoaXMgdG8gYVxuICpcbiAqL1xuXG4vKipcbiAqIFRPRE86IFRlc3QgdGhhdCBhIHNpbmdsZSBjaGlsZCBhbmQgYW4gYXJyYXkgd2l0aCBvbmUgaXRlbSBoYXZlIHRoZSBzYW1lIGtleVxuICogcGF0dGVybi5cbiAqL1xuXG52YXIgZGlkV2FybkFib3V0TWFwcyA9IGZhbHNlO1xuXG4vKipcbiAqIEdlbmVyYXRlIGEga2V5IHN0cmluZyB0aGF0IGlkZW50aWZpZXMgYSBjb21wb25lbnQgd2l0aGluIGEgc2V0LlxuICpcbiAqIEBwYXJhbSB7Kn0gY29tcG9uZW50IEEgY29tcG9uZW50IHRoYXQgY291bGQgY29udGFpbiBhIG1hbnVhbCBrZXkuXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggdGhhdCBpcyB1c2VkIGlmIGEgbWFudWFsIGtleSBpcyBub3QgcHJvdmlkZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldENvbXBvbmVudEtleShjb21wb25lbnQsIGluZGV4KSB7XG4gIC8vIERvIHNvbWUgdHlwZWNoZWNraW5nIGhlcmUgc2luY2Ugd2UgY2FsbCB0aGlzIGJsaW5kbHkuIFdlIHdhbnQgdG8gZW5zdXJlXG4gIC8vIHRoYXQgd2UgZG9uJ3QgYmxvY2sgcG90ZW50aWFsIGZ1dHVyZSBFUyBBUElzLlxuICBpZiAoY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQgPT09ICdvYmplY3QnICYmIGNvbXBvbmVudC5rZXkgIT0gbnVsbCkge1xuICAgIC8vIEV4cGxpY2l0IGtleVxuICAgIHJldHVybiBLZXlFc2NhcGVVdGlscy5lc2NhcGUoY29tcG9uZW50LmtleSk7XG4gIH1cbiAgLy8gSW1wbGljaXQga2V5IGRldGVybWluZWQgYnkgdGhlIGluZGV4IGluIHRoZSBzZXRcbiAgcmV0dXJuIGluZGV4LnRvU3RyaW5nKDM2KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7IXN0cmluZ30gbmFtZVNvRmFyIE5hbWUgb2YgdGhlIGtleSBwYXRoIHNvIGZhci5cbiAqIEBwYXJhbSB7IWZ1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayB0byBpbnZva2Ugd2l0aCBlYWNoIGNoaWxkIGZvdW5kLlxuICogQHBhcmFtIHs/Kn0gdHJhdmVyc2VDb250ZXh0IFVzZWQgdG8gcGFzcyBpbmZvcm1hdGlvbiB0aHJvdWdob3V0IHRoZSB0cmF2ZXJzYWxcbiAqIHByb2Nlc3MuXG4gKiBAcmV0dXJuIHshbnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHRoaXMgc3VidHJlZS5cbiAqL1xuZnVuY3Rpb24gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGRyZW4sIG5hbWVTb0ZhciwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBjaGlsZHJlbjtcblxuICBpZiAodHlwZSA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgLy8gQWxsIG9mIHRoZSBhYm92ZSBhcmUgcGVyY2VpdmVkIGFzIG51bGwuXG4gICAgY2hpbGRyZW4gPSBudWxsO1xuICB9XG5cbiAgaWYgKGNoaWxkcmVuID09PSBudWxsIHx8IHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdudW1iZXInIHx8XG4gIC8vIFRoZSBmb2xsb3dpbmcgaXMgaW5saW5lZCBmcm9tIFJlYWN0RWxlbWVudC4gVGhpcyBtZWFucyB3ZSBjYW4gb3B0aW1pemVcbiAgLy8gc29tZSBjaGVja3MuIFJlYWN0IEZpYmVyIGFsc28gaW5saW5lcyB0aGlzIGxvZ2ljIGZvciBzaW1pbGFyIHB1cnBvc2VzLlxuICB0eXBlID09PSAnb2JqZWN0JyAmJiBjaGlsZHJlbi4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgY2FsbGJhY2sodHJhdmVyc2VDb250ZXh0LCBjaGlsZHJlbixcbiAgICAvLyBJZiBpdCdzIHRoZSBvbmx5IGNoaWxkLCB0cmVhdCB0aGUgbmFtZSBhcyBpZiBpdCB3YXMgd3JhcHBlZCBpbiBhbiBhcnJheVxuICAgIC8vIHNvIHRoYXQgaXQncyBjb25zaXN0ZW50IGlmIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gZ3Jvd3MuXG4gICAgbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiArIGdldENvbXBvbmVudEtleShjaGlsZHJlbiwgMCkgOiBuYW1lU29GYXIpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgdmFyIGNoaWxkO1xuICB2YXIgbmV4dE5hbWU7XG4gIHZhciBzdWJ0cmVlQ291bnQgPSAwOyAvLyBDb3VudCBvZiBjaGlsZHJlbiBmb3VuZCBpbiB0aGUgY3VycmVudCBzdWJ0cmVlLlxuICB2YXIgbmV4dE5hbWVQcmVmaXggPSBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SIDogbmFtZVNvRmFyICsgU1VCU0VQQVJBVE9SO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCBpKTtcbiAgICAgIHN1YnRyZWVDb3VudCArPSB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZCwgbmV4dE5hbWUsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oY2hpbGRyZW4pO1xuICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYXRvckZuLmNhbGwoY2hpbGRyZW4pO1xuICAgICAgdmFyIHN0ZXA7XG4gICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gY2hpbGRyZW4uZW50cmllcykge1xuICAgICAgICB2YXIgaWkgPSAwO1xuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgY2hpbGQgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRDb21wb25lbnRLZXkoY2hpbGQsIGlpKyspO1xuICAgICAgICAgIHN1YnRyZWVDb3VudCArPSB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZCwgbmV4dE5hbWUsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICB2YXIgbWFwc0FzQ2hpbGRyZW5BZGRlbmR1bSA9ICcnO1xuICAgICAgICAgIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgICAgICAgICB2YXIgbWFwc0FzQ2hpbGRyZW5Pd25lck5hbWUgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKTtcbiAgICAgICAgICAgIGlmIChtYXBzQXNDaGlsZHJlbk93bmVyTmFtZSkge1xuICAgICAgICAgICAgICBtYXBzQXNDaGlsZHJlbkFkZGVuZHVtID0gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG1hcHNBc0NoaWxkcmVuT3duZXJOYW1lICsgJ2AuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGRpZFdhcm5BYm91dE1hcHMsICdVc2luZyBNYXBzIGFzIGNoaWxkcmVuIGlzIG5vdCB5ZXQgZnVsbHkgc3VwcG9ydGVkLiBJdCBpcyBhbiAnICsgJ2V4cGVyaW1lbnRhbCBmZWF0dXJlIHRoYXQgbWlnaHQgYmUgcmVtb3ZlZC4gQ29udmVydCBpdCB0byBhICcgKyAnc2VxdWVuY2UgLyBpdGVyYWJsZSBvZiBrZXllZCBSZWFjdEVsZW1lbnRzIGluc3RlYWQuJXMnLCBtYXBzQXNDaGlsZHJlbkFkZGVuZHVtKSA6IHZvaWQgMDtcbiAgICAgICAgICBkaWRXYXJuQWJvdXRNYXBzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJdGVyYXRvciB3aWxsIHByb3ZpZGUgZW50cnkgW2ssdl0gdHVwbGVzIHJhdGhlciB0aGFuIHZhbHVlcy5cbiAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICBjaGlsZCA9IGVudHJ5WzFdO1xuICAgICAgICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIEtleUVzY2FwZVV0aWxzLmVzY2FwZShlbnRyeVswXSkgKyBTVUJTRVBBUkFUT1IgKyBnZXRDb21wb25lbnRLZXkoY2hpbGQsIDApO1xuICAgICAgICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLCBuZXh0TmFtZSwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgdmFyIGFkZGVuZHVtID0gJyc7XG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgYWRkZW5kdW0gPSAnIElmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgJyArICdpbnN0ZWFkIG9yIHdyYXAgdGhlIG9iamVjdCB1c2luZyBjcmVhdGVGcmFnbWVudChvYmplY3QpIGZyb20gdGhlICcgKyAnUmVhY3QgYWRkLW9ucy4nO1xuICAgICAgICBpZiAoY2hpbGRyZW4uX2lzUmVhY3RFbGVtZW50KSB7XG4gICAgICAgICAgYWRkZW5kdW0gPSAnIEl0IGxvb2tzIGxpa2UgeW91XFwncmUgdXNpbmcgYW4gZWxlbWVudCBjcmVhdGVkIGJ5IGEgZGlmZmVyZW50ICcgKyAndmVyc2lvbiBvZiBSZWFjdC4gTWFrZSBzdXJlIHRvIHVzZSBvbmx5IG9uZSBjb3B5IG9mIFJlYWN0Lic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICAgICAgICB2YXIgbmFtZSA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuZ2V0TmFtZSgpO1xuICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICBhZGRlbmR1bSArPSAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbmFtZSArICdgLic7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgY2hpbGRyZW5TdHJpbmcgPSBTdHJpbmcoY2hpbGRyZW4pO1xuICAgICAgIWZhbHNlID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdPYmplY3RzIGFyZSBub3QgdmFsaWQgYXMgYSBSZWFjdCBjaGlsZCAoZm91bmQ6ICVzKS4lcycsIGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZHJlblN0cmluZywgYWRkZW5kdW0pIDogX3Byb2RJbnZhcmlhbnQoJzMxJywgY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nLCBhZGRlbmR1bSkgOiB2b2lkIDA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN1YnRyZWVDb3VudDtcbn1cblxuLyoqXG4gKiBUcmF2ZXJzZXMgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLCBidXRcbiAqIG1pZ2h0IGFsc28gYmUgc3BlY2lmaWVkIHRocm91Z2ggYXR0cmlidXRlczpcbiAqXG4gKiAtIGB0cmF2ZXJzZUFsbENoaWxkcmVuKHRoaXMucHJvcHMuY2hpbGRyZW4sIC4uLilgXG4gKiAtIGB0cmF2ZXJzZUFsbENoaWxkcmVuKHRoaXMucHJvcHMubGVmdFBhbmVsQ2hpbGRyZW4sIC4uLilgXG4gKlxuICogVGhlIGB0cmF2ZXJzZUNvbnRleHRgIGlzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRoYXQgaXMgcGFzc2VkIHRocm91Z2ggdGhlXG4gKiBlbnRpcmUgdHJhdmVyc2FsLiBJdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBhY2N1bXVsYXRpb25zIG9yIGFueXRoaW5nIGVsc2UgdGhhdFxuICogdGhlIGNhbGxiYWNrIG1pZ2h0IGZpbmQgcmVsZXZhbnQuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBvYmplY3QuXG4gKiBAcGFyYW0geyFmdW5jdGlvbn0gY2FsbGJhY2sgVG8gaW52b2tlIHVwb24gdHJhdmVyc2luZyBlYWNoIGNoaWxkLlxuICogQHBhcmFtIHs/Kn0gdHJhdmVyc2VDb250ZXh0IENvbnRleHQgZm9yIHRyYXZlcnNhbC5cbiAqIEByZXR1cm4geyFudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhpcyBzdWJ0cmVlLlxuICovXG5mdW5jdGlvbiB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICByZXR1cm4gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGRyZW4sICcnLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0cmF2ZXJzZUFsbENoaWxkcmVuOyIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9SZWFjdCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZnVuY3Rpb24gY3JlYXRlVGh1bmtNaWRkbGV3YXJlKGV4dHJhQXJndW1lbnQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIGRpc3BhdGNoID0gX3JlZi5kaXNwYXRjaCxcbiAgICAgICAgZ2V0U3RhdGUgPSBfcmVmLmdldFN0YXRlO1xuICAgIHJldHVybiBmdW5jdGlvbiAobmV4dCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhY3Rpb24pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gYWN0aW9uKGRpc3BhdGNoLCBnZXRTdGF0ZSwgZXh0cmFBcmd1bWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV4dChhY3Rpb24pO1xuICAgICAgfTtcbiAgICB9O1xuICB9O1xufVxuXG52YXIgdGh1bmsgPSBjcmVhdGVUaHVua01pZGRsZXdhcmUoKTtcbnRodW5rLndpdGhFeHRyYUFyZ3VtZW50ID0gY3JlYXRlVGh1bmtNaWRkbGV3YXJlO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSB0aHVuazsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGFwcGx5TWlkZGxld2FyZTtcblxudmFyIF9jb21wb3NlID0gcmVxdWlyZSgnLi9jb21wb3NlJyk7XG5cbnZhciBfY29tcG9zZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb21wb3NlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzdG9yZSBlbmhhbmNlciB0aGF0IGFwcGxpZXMgbWlkZGxld2FyZSB0byB0aGUgZGlzcGF0Y2ggbWV0aG9kXG4gKiBvZiB0aGUgUmVkdXggc3RvcmUuIFRoaXMgaXMgaGFuZHkgZm9yIGEgdmFyaWV0eSBvZiB0YXNrcywgc3VjaCBhcyBleHByZXNzaW5nXG4gKiBhc3luY2hyb25vdXMgYWN0aW9ucyBpbiBhIGNvbmNpc2UgbWFubmVyLCBvciBsb2dnaW5nIGV2ZXJ5IGFjdGlvbiBwYXlsb2FkLlxuICpcbiAqIFNlZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UgYXMgYW4gZXhhbXBsZSBvZiB0aGUgUmVkdXggbWlkZGxld2FyZS5cbiAqXG4gKiBCZWNhdXNlIG1pZGRsZXdhcmUgaXMgcG90ZW50aWFsbHkgYXN5bmNocm9ub3VzLCB0aGlzIHNob3VsZCBiZSB0aGUgZmlyc3RcbiAqIHN0b3JlIGVuaGFuY2VyIGluIHRoZSBjb21wb3NpdGlvbiBjaGFpbi5cbiAqXG4gKiBOb3RlIHRoYXQgZWFjaCBtaWRkbGV3YXJlIHdpbGwgYmUgZ2l2ZW4gdGhlIGBkaXNwYXRjaGAgYW5kIGBnZXRTdGF0ZWAgZnVuY3Rpb25zXG4gKiBhcyBuYW1lZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gbWlkZGxld2FyZXMgVGhlIG1pZGRsZXdhcmUgY2hhaW4gdG8gYmUgYXBwbGllZC5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBzdG9yZSBlbmhhbmNlciBhcHBseWluZyB0aGUgbWlkZGxld2FyZS5cbiAqL1xuZnVuY3Rpb24gYXBwbHlNaWRkbGV3YXJlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbWlkZGxld2FyZXMgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBtaWRkbGV3YXJlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoY3JlYXRlU3RvcmUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBlbmhhbmNlcikge1xuICAgICAgdmFyIHN0b3JlID0gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKTtcbiAgICAgIHZhciBfZGlzcGF0Y2ggPSBzdG9yZS5kaXNwYXRjaDtcbiAgICAgIHZhciBjaGFpbiA9IFtdO1xuXG4gICAgICB2YXIgbWlkZGxld2FyZUFQSSA9IHtcbiAgICAgICAgZ2V0U3RhdGU6IHN0b3JlLmdldFN0YXRlLFxuICAgICAgICBkaXNwYXRjaDogZnVuY3Rpb24gZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIF9kaXNwYXRjaChhY3Rpb24pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY2hhaW4gPSBtaWRkbGV3YXJlcy5tYXAoZnVuY3Rpb24gKG1pZGRsZXdhcmUpIHtcbiAgICAgICAgcmV0dXJuIG1pZGRsZXdhcmUobWlkZGxld2FyZUFQSSk7XG4gICAgICB9KTtcbiAgICAgIF9kaXNwYXRjaCA9IF9jb21wb3NlMlsnZGVmYXVsdCddLmFwcGx5KHVuZGVmaW5lZCwgY2hhaW4pKHN0b3JlLmRpc3BhdGNoKTtcblxuICAgICAgcmV0dXJuIF9leHRlbmRzKHt9LCBzdG9yZSwge1xuICAgICAgICBkaXNwYXRjaDogX2Rpc3BhdGNoXG4gICAgICB9KTtcbiAgICB9O1xuICB9O1xufSIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGJpbmRBY3Rpb25DcmVhdG9ycztcbmZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3IsIGRpc3BhdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoKGFjdGlvbkNyZWF0b3IuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBUdXJucyBhbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFyZSBhY3Rpb24gY3JlYXRvcnMsIGludG8gYW4gb2JqZWN0IHdpdGggdGhlXG4gKiBzYW1lIGtleXMsIGJ1dCB3aXRoIGV2ZXJ5IGZ1bmN0aW9uIHdyYXBwZWQgaW50byBhIGBkaXNwYXRjaGAgY2FsbCBzbyB0aGV5XG4gKiBtYXkgYmUgaW52b2tlZCBkaXJlY3RseS4gVGhpcyBpcyBqdXN0IGEgY29udmVuaWVuY2UgbWV0aG9kLCBhcyB5b3UgY2FuIGNhbGxcbiAqIGBzdG9yZS5kaXNwYXRjaChNeUFjdGlvbkNyZWF0b3JzLmRvU29tZXRoaW5nKCkpYCB5b3Vyc2VsZiBqdXN0IGZpbmUuXG4gKlxuICogRm9yIGNvbnZlbmllbmNlLCB5b3UgY2FuIGFsc28gcGFzcyBhIHNpbmdsZSBmdW5jdGlvbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQsXG4gKiBhbmQgZ2V0IGEgZnVuY3Rpb24gaW4gcmV0dXJuLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258T2JqZWN0fSBhY3Rpb25DcmVhdG9ycyBBbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFyZSBhY3Rpb25cbiAqIGNyZWF0b3IgZnVuY3Rpb25zLiBPbmUgaGFuZHkgd2F5IHRvIG9idGFpbiBpdCBpcyB0byB1c2UgRVM2IGBpbXBvcnQgKiBhc2BcbiAqIHN5bnRheC4gWW91IG1heSBhbHNvIHBhc3MgYSBzaW5nbGUgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZGlzcGF0Y2ggVGhlIGBkaXNwYXRjaGAgZnVuY3Rpb24gYXZhaWxhYmxlIG9uIHlvdXIgUmVkdXhcbiAqIHN0b3JlLlxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbnxPYmplY3R9IFRoZSBvYmplY3QgbWltaWNraW5nIHRoZSBvcmlnaW5hbCBvYmplY3QsIGJ1dCB3aXRoXG4gKiBldmVyeSBhY3Rpb24gY3JlYXRvciB3cmFwcGVkIGludG8gdGhlIGBkaXNwYXRjaGAgY2FsbC4gSWYgeW91IHBhc3NlZCBhXG4gKiBmdW5jdGlvbiBhcyBgYWN0aW9uQ3JlYXRvcnNgLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYWxzbyBiZSBhIHNpbmdsZVxuICogZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGJpbmRBY3Rpb25DcmVhdG9ycyhhY3Rpb25DcmVhdG9ycywgZGlzcGF0Y2gpIHtcbiAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9ycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9ycywgZGlzcGF0Y2gpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9ycyAhPT0gJ29iamVjdCcgfHwgYWN0aW9uQ3JlYXRvcnMgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2JpbmRBY3Rpb25DcmVhdG9ycyBleHBlY3RlZCBhbiBvYmplY3Qgb3IgYSBmdW5jdGlvbiwgaW5zdGVhZCByZWNlaXZlZCAnICsgKGFjdGlvbkNyZWF0b3JzID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIGFjdGlvbkNyZWF0b3JzKSArICcuICcgKyAnRGlkIHlvdSB3cml0ZSBcImltcG9ydCBBY3Rpb25DcmVhdG9ycyBmcm9tXCIgaW5zdGVhZCBvZiBcImltcG9ydCAqIGFzIEFjdGlvbkNyZWF0b3JzIGZyb21cIj8nKTtcbiAgfVxuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWN0aW9uQ3JlYXRvcnMpO1xuICB2YXIgYm91bmRBY3Rpb25DcmVhdG9ycyA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICB2YXIgYWN0aW9uQ3JlYXRvciA9IGFjdGlvbkNyZWF0b3JzW2tleV07XG4gICAgaWYgKHR5cGVvZiBhY3Rpb25DcmVhdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBib3VuZEFjdGlvbkNyZWF0b3JzW2tleV0gPSBiaW5kQWN0aW9uQ3JlYXRvcihhY3Rpb25DcmVhdG9yLCBkaXNwYXRjaCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBib3VuZEFjdGlvbkNyZWF0b3JzO1xufSIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGNvbWJpbmVSZWR1Y2VycztcblxudmFyIF9jcmVhdGVTdG9yZSA9IHJlcXVpcmUoJy4vY3JlYXRlU3RvcmUnKTtcblxudmFyIF9pc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnbG9kYXNoL2lzUGxhaW5PYmplY3QnKTtcblxudmFyIF9pc1BsYWluT2JqZWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2lzUGxhaW5PYmplY3QpO1xuXG52YXIgX3dhcm5pbmcgPSByZXF1aXJlKCcuL3V0aWxzL3dhcm5pbmcnKTtcblxudmFyIF93YXJuaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3dhcm5pbmcpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIGdldFVuZGVmaW5lZFN0YXRlRXJyb3JNZXNzYWdlKGtleSwgYWN0aW9uKSB7XG4gIHZhciBhY3Rpb25UeXBlID0gYWN0aW9uICYmIGFjdGlvbi50eXBlO1xuICB2YXIgYWN0aW9uTmFtZSA9IGFjdGlvblR5cGUgJiYgJ1wiJyArIGFjdGlvblR5cGUudG9TdHJpbmcoKSArICdcIicgfHwgJ2FuIGFjdGlvbic7XG5cbiAgcmV0dXJuICdHaXZlbiBhY3Rpb24gJyArIGFjdGlvbk5hbWUgKyAnLCByZWR1Y2VyIFwiJyArIGtleSArICdcIiByZXR1cm5lZCB1bmRlZmluZWQuICcgKyAnVG8gaWdub3JlIGFuIGFjdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIHByZXZpb3VzIHN0YXRlLic7XG59XG5cbmZ1bmN0aW9uIGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2UoaW5wdXRTdGF0ZSwgcmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKSB7XG4gIHZhciByZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKHJlZHVjZXJzKTtcbiAgdmFyIGFyZ3VtZW50TmFtZSA9IGFjdGlvbiAmJiBhY3Rpb24udHlwZSA9PT0gX2NyZWF0ZVN0b3JlLkFjdGlvblR5cGVzLklOSVQgPyAncHJlbG9hZGVkU3RhdGUgYXJndW1lbnQgcGFzc2VkIHRvIGNyZWF0ZVN0b3JlJyA6ICdwcmV2aW91cyBzdGF0ZSByZWNlaXZlZCBieSB0aGUgcmVkdWNlcic7XG5cbiAgaWYgKHJlZHVjZXJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnU3RvcmUgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHJlZHVjZXIuIE1ha2Ugc3VyZSB0aGUgYXJndW1lbnQgcGFzc2VkICcgKyAndG8gY29tYmluZVJlZHVjZXJzIGlzIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIHJlZHVjZXJzLic7XG4gIH1cblxuICBpZiAoISgwLCBfaXNQbGFpbk9iamVjdDJbJ2RlZmF1bHQnXSkoaW5wdXRTdGF0ZSkpIHtcbiAgICByZXR1cm4gJ1RoZSAnICsgYXJndW1lbnROYW1lICsgJyBoYXMgdW5leHBlY3RlZCB0eXBlIG9mIFwiJyArIHt9LnRvU3RyaW5nLmNhbGwoaW5wdXRTdGF0ZSkubWF0Y2goL1xccyhbYS16fEEtWl0rKS8pWzFdICsgJ1wiLiBFeHBlY3RlZCBhcmd1bWVudCB0byBiZSBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nICcgKyAoJ2tleXM6IFwiJyArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgJ1wiJyk7XG4gIH1cblxuICB2YXIgdW5leHBlY3RlZEtleXMgPSBPYmplY3Qua2V5cyhpbnB1dFN0YXRlKS5maWx0ZXIoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiAhcmVkdWNlcnMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhdW5leHBlY3RlZEtleUNhY2hlW2tleV07XG4gIH0pO1xuXG4gIHVuZXhwZWN0ZWRLZXlzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHVuZXhwZWN0ZWRLZXlDYWNoZVtrZXldID0gdHJ1ZTtcbiAgfSk7XG5cbiAgaWYgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gJ1VuZXhwZWN0ZWQgJyArICh1bmV4cGVjdGVkS2V5cy5sZW5ndGggPiAxID8gJ2tleXMnIDogJ2tleScpICsgJyAnICsgKCdcIicgKyB1bmV4cGVjdGVkS2V5cy5qb2luKCdcIiwgXCInKSArICdcIiBmb3VuZCBpbiAnICsgYXJndW1lbnROYW1lICsgJy4gJykgKyAnRXhwZWN0ZWQgdG8gZmluZCBvbmUgb2YgdGhlIGtub3duIHJlZHVjZXIga2V5cyBpbnN0ZWFkOiAnICsgKCdcIicgKyByZWR1Y2VyS2V5cy5qb2luKCdcIiwgXCInKSArICdcIi4gVW5leHBlY3RlZCBrZXlzIHdpbGwgYmUgaWdub3JlZC4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnRSZWR1Y2VyU2FuaXR5KHJlZHVjZXJzKSB7XG4gIE9iamVjdC5rZXlzKHJlZHVjZXJzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgcmVkdWNlciA9IHJlZHVjZXJzW2tleV07XG4gICAgdmFyIGluaXRpYWxTdGF0ZSA9IHJlZHVjZXIodW5kZWZpbmVkLCB7IHR5cGU6IF9jcmVhdGVTdG9yZS5BY3Rpb25UeXBlcy5JTklUIH0pO1xuXG4gICAgaWYgKHR5cGVvZiBpbml0aWFsU3RhdGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZHVjZXIgXCInICsga2V5ICsgJ1wiIHJldHVybmVkIHVuZGVmaW5lZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uICcgKyAnSWYgdGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgcmVkdWNlciBpcyB1bmRlZmluZWQsIHlvdSBtdXN0ICcgKyAnZXhwbGljaXRseSByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSAnICsgJ25vdCBiZSB1bmRlZmluZWQuJyk7XG4gICAgfVxuXG4gICAgdmFyIHR5cGUgPSAnQEByZWR1eC9QUk9CRV9VTktOT1dOX0FDVElPTl8nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCcnKS5qb2luKCcuJyk7XG4gICAgaWYgKHR5cGVvZiByZWR1Y2VyKHVuZGVmaW5lZCwgeyB0eXBlOiB0eXBlIH0pID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWR1Y2VyIFwiJyArIGtleSArICdcIiByZXR1cm5lZCB1bmRlZmluZWQgd2hlbiBwcm9iZWQgd2l0aCBhIHJhbmRvbSB0eXBlLiAnICsgKCdEb25cXCd0IHRyeSB0byBoYW5kbGUgJyArIF9jcmVhdGVTdG9yZS5BY3Rpb25UeXBlcy5JTklUICsgJyBvciBvdGhlciBhY3Rpb25zIGluIFwicmVkdXgvKlwiICcpICsgJ25hbWVzcGFjZS4gVGhleSBhcmUgY29uc2lkZXJlZCBwcml2YXRlLiBJbnN0ZWFkLCB5b3UgbXVzdCByZXR1cm4gdGhlICcgKyAnY3VycmVudCBzdGF0ZSBmb3IgYW55IHVua25vd24gYWN0aW9ucywgdW5sZXNzIGl0IGlzIHVuZGVmaW5lZCwgJyArICdpbiB3aGljaCBjYXNlIHlvdSBtdXN0IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZSwgcmVnYXJkbGVzcyBvZiB0aGUgJyArICdhY3Rpb24gdHlwZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5IG5vdCBiZSB1bmRlZmluZWQuJyk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBUdXJucyBhbiBvYmplY3Qgd2hvc2UgdmFsdWVzIGFyZSBkaWZmZXJlbnQgcmVkdWNlciBmdW5jdGlvbnMsIGludG8gYSBzaW5nbGVcbiAqIHJlZHVjZXIgZnVuY3Rpb24uIEl0IHdpbGwgY2FsbCBldmVyeSBjaGlsZCByZWR1Y2VyLCBhbmQgZ2F0aGVyIHRoZWlyIHJlc3VsdHNcbiAqIGludG8gYSBzaW5nbGUgc3RhdGUgb2JqZWN0LCB3aG9zZSBrZXlzIGNvcnJlc3BvbmQgdG8gdGhlIGtleXMgb2YgdGhlIHBhc3NlZFxuICogcmVkdWNlciBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlZHVjZXJzIEFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgY29ycmVzcG9uZCB0byBkaWZmZXJlbnRcbiAqIHJlZHVjZXIgZnVuY3Rpb25zIHRoYXQgbmVlZCB0byBiZSBjb21iaW5lZCBpbnRvIG9uZS4gT25lIGhhbmR5IHdheSB0byBvYnRhaW5cbiAqIGl0IGlzIHRvIHVzZSBFUzYgYGltcG9ydCAqIGFzIHJlZHVjZXJzYCBzeW50YXguIFRoZSByZWR1Y2VycyBtYXkgbmV2ZXIgcmV0dXJuXG4gKiB1bmRlZmluZWQgZm9yIGFueSBhY3Rpb24uIEluc3RlYWQsIHRoZXkgc2hvdWxkIHJldHVybiB0aGVpciBpbml0aWFsIHN0YXRlXG4gKiBpZiB0aGUgc3RhdGUgcGFzc2VkIHRvIHRoZW0gd2FzIHVuZGVmaW5lZCwgYW5kIHRoZSBjdXJyZW50IHN0YXRlIGZvciBhbnlcbiAqIHVucmVjb2duaXplZCBhY3Rpb24uXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIHJlZHVjZXIgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGV2ZXJ5IHJlZHVjZXIgaW5zaWRlIHRoZVxuICogcGFzc2VkIG9iamVjdCwgYW5kIGJ1aWxkcyBhIHN0YXRlIG9iamVjdCB3aXRoIHRoZSBzYW1lIHNoYXBlLlxuICovXG5mdW5jdGlvbiBjb21iaW5lUmVkdWNlcnMocmVkdWNlcnMpIHtcbiAgdmFyIHJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMocmVkdWNlcnMpO1xuICB2YXIgZmluYWxSZWR1Y2VycyA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHJlZHVjZXJLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGtleSA9IHJlZHVjZXJLZXlzW2ldO1xuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICgwLCBfd2FybmluZzJbJ2RlZmF1bHQnXSkoJ05vIHJlZHVjZXIgcHJvdmlkZWQgZm9yIGtleSBcIicgKyBrZXkgKyAnXCInKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHJlZHVjZXJzW2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZpbmFsUmVkdWNlcnNba2V5XSA9IHJlZHVjZXJzW2tleV07XG4gICAgfVxuICB9XG4gIHZhciBmaW5hbFJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMoZmluYWxSZWR1Y2Vycyk7XG5cbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdmFyIHVuZXhwZWN0ZWRLZXlDYWNoZSA9IHt9O1xuICB9XG5cbiAgdmFyIHNhbml0eUVycm9yO1xuICB0cnkge1xuICAgIGFzc2VydFJlZHVjZXJTYW5pdHkoZmluYWxSZWR1Y2Vycyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzYW5pdHlFcnJvciA9IGU7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gY29tYmluYXRpb24oKSB7XG4gICAgdmFyIHN0YXRlID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07XG4gICAgdmFyIGFjdGlvbiA9IGFyZ3VtZW50c1sxXTtcblxuICAgIGlmIChzYW5pdHlFcnJvcikge1xuICAgICAgdGhyb3cgc2FuaXR5RXJyb3I7XG4gICAgfVxuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgd2FybmluZ01lc3NhZ2UgPSBnZXRVbmV4cGVjdGVkU3RhdGVTaGFwZVdhcm5pbmdNZXNzYWdlKHN0YXRlLCBmaW5hbFJlZHVjZXJzLCBhY3Rpb24sIHVuZXhwZWN0ZWRLZXlDYWNoZSk7XG4gICAgICBpZiAod2FybmluZ01lc3NhZ2UpIHtcbiAgICAgICAgKDAsIF93YXJuaW5nMlsnZGVmYXVsdCddKSh3YXJuaW5nTWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICB2YXIgbmV4dFN0YXRlID0ge307XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaW5hbFJlZHVjZXJLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0gZmluYWxSZWR1Y2VyS2V5c1tpXTtcbiAgICAgIHZhciByZWR1Y2VyID0gZmluYWxSZWR1Y2Vyc1trZXldO1xuICAgICAgdmFyIHByZXZpb3VzU3RhdGVGb3JLZXkgPSBzdGF0ZVtrZXldO1xuICAgICAgdmFyIG5leHRTdGF0ZUZvcktleSA9IHJlZHVjZXIocHJldmlvdXNTdGF0ZUZvcktleSwgYWN0aW9uKTtcbiAgICAgIGlmICh0eXBlb2YgbmV4dFN0YXRlRm9yS2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIgZXJyb3JNZXNzYWdlID0gZ2V0VW5kZWZpbmVkU3RhdGVFcnJvck1lc3NhZ2Uoa2V5LCBhY3Rpb24pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIG5leHRTdGF0ZVtrZXldID0gbmV4dFN0YXRlRm9yS2V5O1xuICAgICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgbmV4dFN0YXRlRm9yS2V5ICE9PSBwcmV2aW91c1N0YXRlRm9yS2V5O1xuICAgIH1cbiAgICByZXR1cm4gaGFzQ2hhbmdlZCA/IG5leHRTdGF0ZSA6IHN0YXRlO1xuICB9O1xufSIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSBjb21wb3NlO1xuLyoqXG4gKiBDb21wb3NlcyBzaW5nbGUtYXJndW1lbnQgZnVuY3Rpb25zIGZyb20gcmlnaHQgdG8gbGVmdC4gVGhlIHJpZ2h0bW9zdFxuICogZnVuY3Rpb24gY2FuIHRha2UgbXVsdGlwbGUgYXJndW1lbnRzIGFzIGl0IHByb3ZpZGVzIHRoZSBzaWduYXR1cmUgZm9yXG4gKiB0aGUgcmVzdWx0aW5nIGNvbXBvc2l0ZSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gey4uLkZ1bmN0aW9ufSBmdW5jcyBUaGUgZnVuY3Rpb25zIHRvIGNvbXBvc2UuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgZnVuY3Rpb24gb2J0YWluZWQgYnkgY29tcG9zaW5nIHRoZSBhcmd1bWVudCBmdW5jdGlvbnNcbiAqIGZyb20gcmlnaHQgdG8gbGVmdC4gRm9yIGV4YW1wbGUsIGNvbXBvc2UoZiwgZywgaCkgaXMgaWRlbnRpY2FsIHRvIGRvaW5nXG4gKiAoLi4uYXJncykgPT4gZihnKGgoLi4uYXJncykpKS5cbiAqL1xuXG5mdW5jdGlvbiBjb21wb3NlKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgZnVuY3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBmdW5jc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIGlmIChmdW5jcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgICAgcmV0dXJuIGFyZztcbiAgICB9O1xuICB9XG5cbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBmdW5jc1swXTtcbiAgfVxuXG4gIHZhciBsYXN0ID0gZnVuY3NbZnVuY3MubGVuZ3RoIC0gMV07XG4gIHZhciByZXN0ID0gZnVuY3Muc2xpY2UoMCwgLTEpO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiByZXN0LnJlZHVjZVJpZ2h0KGZ1bmN0aW9uIChjb21wb3NlZCwgZikge1xuICAgICAgcmV0dXJuIGYoY29tcG9zZWQpO1xuICAgIH0sIGxhc3QuYXBwbHkodW5kZWZpbmVkLCBhcmd1bWVudHMpKTtcbiAgfTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLkFjdGlvblR5cGVzID0gdW5kZWZpbmVkO1xuZXhwb3J0c1snZGVmYXVsdCddID0gY3JlYXRlU3RvcmU7XG5cbnZhciBfaXNQbGFpbk9iamVjdCA9IHJlcXVpcmUoJ2xvZGFzaC9pc1BsYWluT2JqZWN0Jyk7XG5cbnZhciBfaXNQbGFpbk9iamVjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pc1BsYWluT2JqZWN0KTtcblxudmFyIF9zeW1ib2xPYnNlcnZhYmxlID0gcmVxdWlyZSgnc3ltYm9sLW9ic2VydmFibGUnKTtcblxudmFyIF9zeW1ib2xPYnNlcnZhYmxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N5bWJvbE9ic2VydmFibGUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbi8qKlxuICogVGhlc2UgYXJlIHByaXZhdGUgYWN0aW9uIHR5cGVzIHJlc2VydmVkIGJ5IFJlZHV4LlxuICogRm9yIGFueSB1bmtub3duIGFjdGlvbnMsIHlvdSBtdXN0IHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS5cbiAqIElmIHRoZSBjdXJyZW50IHN0YXRlIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLlxuICogRG8gbm90IHJlZmVyZW5jZSB0aGVzZSBhY3Rpb24gdHlwZXMgZGlyZWN0bHkgaW4geW91ciBjb2RlLlxuICovXG52YXIgQWN0aW9uVHlwZXMgPSBleHBvcnRzLkFjdGlvblR5cGVzID0ge1xuICBJTklUOiAnQEByZWR1eC9JTklUJ1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgUmVkdXggc3RvcmUgdGhhdCBob2xkcyB0aGUgc3RhdGUgdHJlZS5cbiAqIFRoZSBvbmx5IHdheSB0byBjaGFuZ2UgdGhlIGRhdGEgaW4gdGhlIHN0b3JlIGlzIHRvIGNhbGwgYGRpc3BhdGNoKClgIG9uIGl0LlxuICpcbiAqIFRoZXJlIHNob3VsZCBvbmx5IGJlIGEgc2luZ2xlIHN0b3JlIGluIHlvdXIgYXBwLiBUbyBzcGVjaWZ5IGhvdyBkaWZmZXJlbnRcbiAqIHBhcnRzIG9mIHRoZSBzdGF0ZSB0cmVlIHJlc3BvbmQgdG8gYWN0aW9ucywgeW91IG1heSBjb21iaW5lIHNldmVyYWwgcmVkdWNlcnNcbiAqIGludG8gYSBzaW5nbGUgcmVkdWNlciBmdW5jdGlvbiBieSB1c2luZyBgY29tYmluZVJlZHVjZXJzYC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWR1Y2VyIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBuZXh0IHN0YXRlIHRyZWUsIGdpdmVuXG4gKiB0aGUgY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgYWN0aW9uIHRvIGhhbmRsZS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gW3ByZWxvYWRlZFN0YXRlXSBUaGUgaW5pdGlhbCBzdGF0ZS4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGh5ZHJhdGUgdGhlIHN0YXRlIGZyb20gdGhlIHNlcnZlciBpbiB1bml2ZXJzYWwgYXBwcywgb3IgdG8gcmVzdG9yZSBhXG4gKiBwcmV2aW91c2x5IHNlcmlhbGl6ZWQgdXNlciBzZXNzaW9uLlxuICogSWYgeW91IHVzZSBgY29tYmluZVJlZHVjZXJzYCB0byBwcm9kdWNlIHRoZSByb290IHJlZHVjZXIgZnVuY3Rpb24sIHRoaXMgbXVzdCBiZVxuICogYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUgc2hhcGUgYXMgYGNvbWJpbmVSZWR1Y2Vyc2Aga2V5cy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlbmhhbmNlciBUaGUgc3RvcmUgZW5oYW5jZXIuIFlvdSBtYXkgb3B0aW9uYWxseSBzcGVjaWZ5IGl0XG4gKiB0byBlbmhhbmNlIHRoZSBzdG9yZSB3aXRoIHRoaXJkLXBhcnR5IGNhcGFiaWxpdGllcyBzdWNoIGFzIG1pZGRsZXdhcmUsXG4gKiB0aW1lIHRyYXZlbCwgcGVyc2lzdGVuY2UsIGV0Yy4gVGhlIG9ubHkgc3RvcmUgZW5oYW5jZXIgdGhhdCBzaGlwcyB3aXRoIFJlZHV4XG4gKiBpcyBgYXBwbHlNaWRkbGV3YXJlKClgLlxuICpcbiAqIEByZXR1cm5zIHtTdG9yZX0gQSBSZWR1eCBzdG9yZSB0aGF0IGxldHMgeW91IHJlYWQgdGhlIHN0YXRlLCBkaXNwYXRjaCBhY3Rpb25zXG4gKiBhbmQgc3Vic2NyaWJlIHRvIGNoYW5nZXMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVN0b3JlKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBlbmhhbmNlcikge1xuICB2YXIgX3JlZjI7XG5cbiAgaWYgKHR5cGVvZiBwcmVsb2FkZWRTdGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZW5oYW5jZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgZW5oYW5jZXIgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgICBwcmVsb2FkZWRTdGF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZW5oYW5jZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0aGUgZW5oYW5jZXIgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW5oYW5jZXIoY3JlYXRlU3RvcmUpKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcmVkdWNlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdGhlIHJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgfVxuXG4gIHZhciBjdXJyZW50UmVkdWNlciA9IHJlZHVjZXI7XG4gIHZhciBjdXJyZW50U3RhdGUgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgdmFyIGN1cnJlbnRMaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzO1xuICB2YXIgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKG5leHRMaXN0ZW5lcnMgPT09IGN1cnJlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzLnNsaWNlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBzdGF0ZSB0cmVlIG1hbmFnZWQgYnkgdGhlIHN0b3JlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7YW55fSBUaGUgY3VycmVudCBzdGF0ZSB0cmVlIG9mIHlvdXIgYXBwbGljYXRpb24uXG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdGF0ZSgpIHtcbiAgICByZXR1cm4gY3VycmVudFN0YXRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjaGFuZ2UgbGlzdGVuZXIuIEl0IHdpbGwgYmUgY2FsbGVkIGFueSB0aW1lIGFuIGFjdGlvbiBpcyBkaXNwYXRjaGVkLFxuICAgKiBhbmQgc29tZSBwYXJ0IG9mIHRoZSBzdGF0ZSB0cmVlIG1heSBwb3RlbnRpYWxseSBoYXZlIGNoYW5nZWQuIFlvdSBtYXkgdGhlblxuICAgKiBjYWxsIGBnZXRTdGF0ZSgpYCB0byByZWFkIHRoZSBjdXJyZW50IHN0YXRlIHRyZWUgaW5zaWRlIHRoZSBjYWxsYmFjay5cbiAgICpcbiAgICogWW91IG1heSBjYWxsIGBkaXNwYXRjaCgpYCBmcm9tIGEgY2hhbmdlIGxpc3RlbmVyLCB3aXRoIHRoZSBmb2xsb3dpbmdcbiAgICogY2F2ZWF0czpcbiAgICpcbiAgICogMS4gVGhlIHN1YnNjcmlwdGlvbnMgYXJlIHNuYXBzaG90dGVkIGp1c3QgYmVmb3JlIGV2ZXJ5IGBkaXNwYXRjaCgpYCBjYWxsLlxuICAgKiBJZiB5b3Ugc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIHdoaWxlIHRoZSBsaXN0ZW5lcnMgYXJlIGJlaW5nIGludm9rZWQsIHRoaXNcbiAgICogd2lsbCBub3QgaGF2ZSBhbnkgZWZmZWN0IG9uIHRoZSBgZGlzcGF0Y2goKWAgdGhhdCBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MuXG4gICAqIEhvd2V2ZXIsIHRoZSBuZXh0IGBkaXNwYXRjaCgpYCBjYWxsLCB3aGV0aGVyIG5lc3RlZCBvciBub3QsIHdpbGwgdXNlIGEgbW9yZVxuICAgKiByZWNlbnQgc25hcHNob3Qgb2YgdGhlIHN1YnNjcmlwdGlvbiBsaXN0LlxuICAgKlxuICAgKiAyLiBUaGUgbGlzdGVuZXIgc2hvdWxkIG5vdCBleHBlY3QgdG8gc2VlIGFsbCBzdGF0ZSBjaGFuZ2VzLCBhcyB0aGUgc3RhdGVcbiAgICogbWlnaHQgaGF2ZSBiZWVuIHVwZGF0ZWQgbXVsdGlwbGUgdGltZXMgZHVyaW5nIGEgbmVzdGVkIGBkaXNwYXRjaCgpYCBiZWZvcmVcbiAgICogdGhlIGxpc3RlbmVyIGlzIGNhbGxlZC4gSXQgaXMsIGhvd2V2ZXIsIGd1YXJhbnRlZWQgdGhhdCBhbGwgc3Vic2NyaWJlcnNcbiAgICogcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIGBkaXNwYXRjaCgpYCBzdGFydGVkIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGxhdGVzdFxuICAgKiBzdGF0ZSBieSB0aGUgdGltZSBpdCBleGl0cy5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgQSBjYWxsYmFjayB0byBiZSBpbnZva2VkIG9uIGV2ZXJ5IGRpc3BhdGNoLlxuICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgZnVuY3Rpb24gdG8gcmVtb3ZlIHRoaXMgY2hhbmdlIGxpc3RlbmVyLlxuICAgKi9cbiAgZnVuY3Rpb24gc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHZhciBpc1N1YnNjcmliZWQgPSB0cnVlO1xuXG4gICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgIG5leHRMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICBpZiAoIWlzU3Vic2NyaWJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlzU3Vic2NyaWJlZCA9IGZhbHNlO1xuXG4gICAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgICB2YXIgaW5kZXggPSBuZXh0TGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgbmV4dExpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhbiBhY3Rpb24uIEl0IGlzIHRoZSBvbmx5IHdheSB0byB0cmlnZ2VyIGEgc3RhdGUgY2hhbmdlLlxuICAgKlxuICAgKiBUaGUgYHJlZHVjZXJgIGZ1bmN0aW9uLCB1c2VkIHRvIGNyZWF0ZSB0aGUgc3RvcmUsIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlXG4gICAqIGN1cnJlbnQgc3RhdGUgdHJlZSBhbmQgdGhlIGdpdmVuIGBhY3Rpb25gLiBJdHMgcmV0dXJuIHZhbHVlIHdpbGxcbiAgICogYmUgY29uc2lkZXJlZCB0aGUgKipuZXh0Kiogc3RhdGUgb2YgdGhlIHRyZWUsIGFuZCB0aGUgY2hhbmdlIGxpc3RlbmVyc1xuICAgKiB3aWxsIGJlIG5vdGlmaWVkLlxuICAgKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIHBsYWluIG9iamVjdCBhY3Rpb25zLiBJZiB5b3Ugd2FudCB0b1xuICAgKiBkaXNwYXRjaCBhIFByb21pc2UsIGFuIE9ic2VydmFibGUsIGEgdGh1bmssIG9yIHNvbWV0aGluZyBlbHNlLCB5b3UgbmVlZCB0b1xuICAgKiB3cmFwIHlvdXIgc3RvcmUgY3JlYXRpbmcgZnVuY3Rpb24gaW50byB0aGUgY29ycmVzcG9uZGluZyBtaWRkbGV3YXJlLiBGb3JcbiAgICogZXhhbXBsZSwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgYHJlZHV4LXRodW5rYCBwYWNrYWdlLiBFdmVuIHRoZVxuICAgKiBtaWRkbGV3YXJlIHdpbGwgZXZlbnR1YWxseSBkaXNwYXRjaCBwbGFpbiBvYmplY3QgYWN0aW9ucyB1c2luZyB0aGlzIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGFjdGlvbiBBIHBsYWluIG9iamVjdCByZXByZXNlbnRpbmcg4oCcd2hhdCBjaGFuZ2Vk4oCdLiBJdCBpc1xuICAgKiBhIGdvb2QgaWRlYSB0byBrZWVwIGFjdGlvbnMgc2VyaWFsaXphYmxlIHNvIHlvdSBjYW4gcmVjb3JkIGFuZCByZXBsYXkgdXNlclxuICAgKiBzZXNzaW9ucywgb3IgdXNlIHRoZSB0aW1lIHRyYXZlbGxpbmcgYHJlZHV4LWRldnRvb2xzYC4gQW4gYWN0aW9uIG11c3QgaGF2ZVxuICAgKiBhIGB0eXBlYCBwcm9wZXJ0eSB3aGljaCBtYXkgbm90IGJlIGB1bmRlZmluZWRgLiBJdCBpcyBhIGdvb2QgaWRlYSB0byB1c2VcbiAgICogc3RyaW5nIGNvbnN0YW50cyBmb3IgYWN0aW9uIHR5cGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBGb3IgY29udmVuaWVuY2UsIHRoZSBzYW1lIGFjdGlvbiBvYmplY3QgeW91IGRpc3BhdGNoZWQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCwgaWYgeW91IHVzZSBhIGN1c3RvbSBtaWRkbGV3YXJlLCBpdCBtYXkgd3JhcCBgZGlzcGF0Y2goKWAgdG9cbiAgICogcmV0dXJuIHNvbWV0aGluZyBlbHNlIChmb3IgZXhhbXBsZSwgYSBQcm9taXNlIHlvdSBjYW4gYXdhaXQpLlxuICAgKi9cbiAgZnVuY3Rpb24gZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgaWYgKCEoMCwgX2lzUGxhaW5PYmplY3QyWydkZWZhdWx0J10pKGFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWN0aW9ucyBtdXN0IGJlIHBsYWluIG9iamVjdHMuICcgKyAnVXNlIGN1c3RvbSBtaWRkbGV3YXJlIGZvciBhc3luYyBhY3Rpb25zLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYWN0aW9uLnR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjdGlvbnMgbWF5IG5vdCBoYXZlIGFuIHVuZGVmaW5lZCBcInR5cGVcIiBwcm9wZXJ0eS4gJyArICdIYXZlIHlvdSBtaXNzcGVsbGVkIGEgY29uc3RhbnQ/Jyk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVkdWNlcnMgbWF5IG5vdCBkaXNwYXRjaCBhY3Rpb25zLicpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpc0Rpc3BhdGNoaW5nID0gdHJ1ZTtcbiAgICAgIGN1cnJlbnRTdGF0ZSA9IGN1cnJlbnRSZWR1Y2VyKGN1cnJlbnRTdGF0ZSwgYWN0aW9uKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBsaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzID0gbmV4dExpc3RlbmVycztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgbGlzdGVuZXJzW2ldKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgcmVkdWNlciBjdXJyZW50bHkgdXNlZCBieSB0aGUgc3RvcmUgdG8gY2FsY3VsYXRlIHRoZSBzdGF0ZS5cbiAgICpcbiAgICogWW91IG1pZ2h0IG5lZWQgdGhpcyBpZiB5b3VyIGFwcCBpbXBsZW1lbnRzIGNvZGUgc3BsaXR0aW5nIGFuZCB5b3Ugd2FudCB0b1xuICAgKiBsb2FkIHNvbWUgb2YgdGhlIHJlZHVjZXJzIGR5bmFtaWNhbGx5LiBZb3UgbWlnaHQgYWxzbyBuZWVkIHRoaXMgaWYgeW91XG4gICAqIGltcGxlbWVudCBhIGhvdCByZWxvYWRpbmcgbWVjaGFuaXNtIGZvciBSZWR1eC5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dFJlZHVjZXIgVGhlIHJlZHVjZXIgZm9yIHRoZSBzdG9yZSB0byB1c2UgaW5zdGVhZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBmdW5jdGlvbiByZXBsYWNlUmVkdWNlcihuZXh0UmVkdWNlcikge1xuICAgIGlmICh0eXBlb2YgbmV4dFJlZHVjZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdGhlIG5leHRSZWR1Y2VyIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgY3VycmVudFJlZHVjZXIgPSBuZXh0UmVkdWNlcjtcbiAgICBkaXNwYXRjaCh7IHR5cGU6IEFjdGlvblR5cGVzLklOSVQgfSk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJvcGVyYWJpbGl0eSBwb2ludCBmb3Igb2JzZXJ2YWJsZS9yZWFjdGl2ZSBsaWJyYXJpZXMuXG4gICAqIEByZXR1cm5zIHtvYnNlcnZhYmxlfSBBIG1pbmltYWwgb2JzZXJ2YWJsZSBvZiBzdGF0ZSBjaGFuZ2VzLlxuICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBvYnNlcnZhYmxlIHByb3Bvc2FsOlxuICAgKiBodHRwczovL2dpdGh1Yi5jb20vemVucGFyc2luZy9lcy1vYnNlcnZhYmxlXG4gICAqL1xuICBmdW5jdGlvbiBvYnNlcnZhYmxlKCkge1xuICAgIHZhciBfcmVmO1xuXG4gICAgdmFyIG91dGVyU3Vic2NyaWJlID0gc3Vic2NyaWJlO1xuICAgIHJldHVybiBfcmVmID0ge1xuICAgICAgLyoqXG4gICAgICAgKiBUaGUgbWluaW1hbCBvYnNlcnZhYmxlIHN1YnNjcmlwdGlvbiBtZXRob2QuXG4gICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JzZXJ2ZXIgQW55IG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIG9ic2VydmVyLlxuICAgICAgICogVGhlIG9ic2VydmVyIG9iamVjdCBzaG91bGQgaGF2ZSBhIGBuZXh0YCBtZXRob2QuXG4gICAgICAgKiBAcmV0dXJucyB7c3Vic2NyaXB0aW9ufSBBbiBvYmplY3Qgd2l0aCBhbiBgdW5zdWJzY3JpYmVgIG1ldGhvZCB0aGF0IGNhblxuICAgICAgICogYmUgdXNlZCB0byB1bnN1YnNjcmliZSB0aGUgb2JzZXJ2YWJsZSBmcm9tIHRoZSBzdG9yZSwgYW5kIHByZXZlbnQgZnVydGhlclxuICAgICAgICogZW1pc3Npb24gb2YgdmFsdWVzIGZyb20gdGhlIG9ic2VydmFibGUuXG4gICAgICAgKi9cbiAgICAgIHN1YnNjcmliZTogZnVuY3Rpb24gc3Vic2NyaWJlKG9ic2VydmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb2JzZXJ2ZXIgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgdGhlIG9ic2VydmVyIHRvIGJlIGFuIG9iamVjdC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG9ic2VydmVTdGF0ZSgpIHtcbiAgICAgICAgICBpZiAob2JzZXJ2ZXIubmV4dCkge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChnZXRTdGF0ZSgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlU3RhdGUoKTtcbiAgICAgICAgdmFyIHVuc3Vic2NyaWJlID0gb3V0ZXJTdWJzY3JpYmUob2JzZXJ2ZVN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHsgdW5zdWJzY3JpYmU6IHVuc3Vic2NyaWJlIH07XG4gICAgICB9XG4gICAgfSwgX3JlZltfc3ltYm9sT2JzZXJ2YWJsZTJbJ2RlZmF1bHQnXV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBfcmVmO1xuICB9XG5cbiAgLy8gV2hlbiBhIHN0b3JlIGlzIGNyZWF0ZWQsIGFuIFwiSU5JVFwiIGFjdGlvbiBpcyBkaXNwYXRjaGVkIHNvIHRoYXQgZXZlcnlcbiAgLy8gcmVkdWNlciByZXR1cm5zIHRoZWlyIGluaXRpYWwgc3RhdGUuIFRoaXMgZWZmZWN0aXZlbHkgcG9wdWxhdGVzXG4gIC8vIHRoZSBpbml0aWFsIHN0YXRlIHRyZWUuXG4gIGRpc3BhdGNoKHsgdHlwZTogQWN0aW9uVHlwZXMuSU5JVCB9KTtcblxuICByZXR1cm4gX3JlZjIgPSB7XG4gICAgZGlzcGF0Y2g6IGRpc3BhdGNoLFxuICAgIHN1YnNjcmliZTogc3Vic2NyaWJlLFxuICAgIGdldFN0YXRlOiBnZXRTdGF0ZSxcbiAgICByZXBsYWNlUmVkdWNlcjogcmVwbGFjZVJlZHVjZXJcbiAgfSwgX3JlZjJbX3N5bWJvbE9ic2VydmFibGUyWydkZWZhdWx0J11dID0gb2JzZXJ2YWJsZSwgX3JlZjI7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5jb21wb3NlID0gZXhwb3J0cy5hcHBseU1pZGRsZXdhcmUgPSBleHBvcnRzLmJpbmRBY3Rpb25DcmVhdG9ycyA9IGV4cG9ydHMuY29tYmluZVJlZHVjZXJzID0gZXhwb3J0cy5jcmVhdGVTdG9yZSA9IHVuZGVmaW5lZDtcblxudmFyIF9jcmVhdGVTdG9yZSA9IHJlcXVpcmUoJy4vY3JlYXRlU3RvcmUnKTtcblxudmFyIF9jcmVhdGVTdG9yZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVTdG9yZSk7XG5cbnZhciBfY29tYmluZVJlZHVjZXJzID0gcmVxdWlyZSgnLi9jb21iaW5lUmVkdWNlcnMnKTtcblxudmFyIF9jb21iaW5lUmVkdWNlcnMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29tYmluZVJlZHVjZXJzKTtcblxudmFyIF9iaW5kQWN0aW9uQ3JlYXRvcnMgPSByZXF1aXJlKCcuL2JpbmRBY3Rpb25DcmVhdG9ycycpO1xuXG52YXIgX2JpbmRBY3Rpb25DcmVhdG9yczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9iaW5kQWN0aW9uQ3JlYXRvcnMpO1xuXG52YXIgX2FwcGx5TWlkZGxld2FyZSA9IHJlcXVpcmUoJy4vYXBwbHlNaWRkbGV3YXJlJyk7XG5cbnZhciBfYXBwbHlNaWRkbGV3YXJlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FwcGx5TWlkZGxld2FyZSk7XG5cbnZhciBfY29tcG9zZSA9IHJlcXVpcmUoJy4vY29tcG9zZScpO1xuXG52YXIgX2NvbXBvc2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29tcG9zZSk7XG5cbnZhciBfd2FybmluZyA9IHJlcXVpcmUoJy4vdXRpbHMvd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuLypcbiogVGhpcyBpcyBhIGR1bW15IGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBmdW5jdGlvbiBuYW1lIGhhcyBiZWVuIGFsdGVyZWQgYnkgbWluaWZpY2F0aW9uLlxuKiBJZiB0aGUgZnVuY3Rpb24gaGFzIGJlZW4gbWluaWZpZWQgYW5kIE5PREVfRU5WICE9PSAncHJvZHVjdGlvbicsIHdhcm4gdGhlIHVzZXIuXG4qL1xuZnVuY3Rpb24gaXNDcnVzaGVkKCkge31cblxuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nICYmIHR5cGVvZiBpc0NydXNoZWQubmFtZSA9PT0gJ3N0cmluZycgJiYgaXNDcnVzaGVkLm5hbWUgIT09ICdpc0NydXNoZWQnKSB7XG4gICgwLCBfd2FybmluZzJbJ2RlZmF1bHQnXSkoJ1lvdSBhcmUgY3VycmVudGx5IHVzaW5nIG1pbmlmaWVkIGNvZGUgb3V0c2lkZSBvZiBOT0RFX0VOViA9PT0gXFwncHJvZHVjdGlvblxcJy4gJyArICdUaGlzIG1lYW5zIHRoYXQgeW91IGFyZSBydW5uaW5nIGEgc2xvd2VyIGRldmVsb3BtZW50IGJ1aWxkIG9mIFJlZHV4LiAnICsgJ1lvdSBjYW4gdXNlIGxvb3NlLWVudmlmeSAoaHR0cHM6Ly9naXRodWIuY29tL3plcnRvc2gvbG9vc2UtZW52aWZ5KSBmb3IgYnJvd3NlcmlmeSAnICsgJ29yIERlZmluZVBsdWdpbiBmb3Igd2VicGFjayAoaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zMDAzMDAzMSkgJyArICd0byBlbnN1cmUgeW91IGhhdmUgdGhlIGNvcnJlY3QgY29kZSBmb3IgeW91ciBwcm9kdWN0aW9uIGJ1aWxkLicpO1xufVxuXG5leHBvcnRzLmNyZWF0ZVN0b3JlID0gX2NyZWF0ZVN0b3JlMlsnZGVmYXVsdCddO1xuZXhwb3J0cy5jb21iaW5lUmVkdWNlcnMgPSBfY29tYmluZVJlZHVjZXJzMlsnZGVmYXVsdCddO1xuZXhwb3J0cy5iaW5kQWN0aW9uQ3JlYXRvcnMgPSBfYmluZEFjdGlvbkNyZWF0b3JzMlsnZGVmYXVsdCddO1xuZXhwb3J0cy5hcHBseU1pZGRsZXdhcmUgPSBfYXBwbHlNaWRkbGV3YXJlMlsnZGVmYXVsdCddO1xuZXhwb3J0cy5jb21wb3NlID0gX2NvbXBvc2UyWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0gd2FybmluZztcbi8qKlxuICogUHJpbnRzIGEgd2FybmluZyBpbiB0aGUgY29uc29sZSBpZiBpdCBleGlzdHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgVGhlIHdhcm5pbmcgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiB3YXJuaW5nKG1lc3NhZ2UpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cbiAgdHJ5IHtcbiAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IGlmIHlvdSBlbmFibGVcbiAgICAvLyBcImJyZWFrIG9uIGFsbCBleGNlcHRpb25zXCIgaW4geW91ciBjb25zb2xlLFxuICAgIC8vIGl0IHdvdWxkIHBhdXNlIHRoZSBleGVjdXRpb24gYXQgdGhpcyBsaW5lLlxuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1lbXB0eSAqL1xuICB9IGNhdGNoIChlKSB7fVxuICAvKiBlc2xpbnQtZW5hYmxlIG5vLWVtcHR5ICovXG59IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9pbmRleCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3BvbnlmaWxsID0gcmVxdWlyZSgnLi9wb255ZmlsbCcpO1xuXG52YXIgX3BvbnlmaWxsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3BvbnlmaWxsKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcm9vdDsgLyogZ2xvYmFsIHdpbmRvdyAqL1xuXG5cbmlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgcm9vdCA9IHNlbGY7XG59IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSB3aW5kb3c7XG59IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSBnbG9iYWw7XG59IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSBtb2R1bGU7XG59IGVsc2Uge1xuICByb290ID0gRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbn1cblxudmFyIHJlc3VsdCA9ICgwLCBfcG9ueWZpbGwyWydkZWZhdWx0J10pKHJvb3QpO1xuZXhwb3J0c1snZGVmYXVsdCddID0gcmVzdWx0OyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHN5bWJvbE9ic2VydmFibGVQb255ZmlsbDtcbmZ1bmN0aW9uIHN5bWJvbE9ic2VydmFibGVQb255ZmlsbChyb290KSB7XG5cdHZhciByZXN1bHQ7XG5cdHZhciBfU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cblx0aWYgKHR5cGVvZiBfU3ltYm9sID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0aWYgKF9TeW1ib2wub2JzZXJ2YWJsZSkge1xuXHRcdFx0cmVzdWx0ID0gX1N5bWJvbC5vYnNlcnZhYmxlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHQgPSBfU3ltYm9sKCdvYnNlcnZhYmxlJyk7XG5cdFx0XHRfU3ltYm9sLm9ic2VydmFibGUgPSByZXN1bHQ7XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdHJlc3VsdCA9ICdAQG9ic2VydmFibGUnO1xuXHR9XG5cblx0cmV0dXJuIHJlc3VsdDtcbn07IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBjcmVhdGVVbmNvbnRyb2xsYWJsZTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX2ludmFyaWFudCA9IHJlcXVpcmUoJ2ludmFyaWFudCcpO1xuXG52YXIgX2ludmFyaWFudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnZhcmlhbnQpO1xuXG52YXIgX3V0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xuXG52YXIgdXRpbHMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfdXRpbHMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHsgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkgeyByZXR1cm4gb2JqOyB9IGVsc2UgeyB2YXIgbmV3T2JqID0ge307IGlmIChvYmogIT0gbnVsbCkgeyBmb3IgKHZhciBrZXkgaW4gb2JqKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSBuZXdPYmpba2V5XSA9IG9ialtrZXldOyB9IH0gbmV3T2JqLmRlZmF1bHQgPSBvYmo7IHJldHVybiBuZXdPYmo7IH0gfVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbmZ1bmN0aW9uIGNyZWF0ZVVuY29udHJvbGxhYmxlKG1peGluLCBzZXQpIHtcblxuICByZXR1cm4gdW5jb250cm9sbGFibGU7XG5cbiAgZnVuY3Rpb24gdW5jb250cm9sbGFibGUoQ29tcG9uZW50LCBjb250cm9sbGVkVmFsdWVzKSB7XG4gICAgdmFyIF9jbGFzcywgX3RlbXA7XG5cbiAgICB2YXIgbWV0aG9kcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogW107XG5cbiAgICB2YXIgZGlzcGxheU5hbWUgPSBDb21wb25lbnQuZGlzcGxheU5hbWUgfHwgQ29tcG9uZW50Lm5hbWUgfHwgJ0NvbXBvbmVudCcsXG4gICAgICAgIGJhc2VQcm9wVHlwZXMgPSB1dGlscy5nZXRUeXBlKENvbXBvbmVudCkucHJvcFR5cGVzLFxuICAgICAgICBpc0NvbXBvc2l0ZUNvbXBvbmVudCA9IHV0aWxzLmlzUmVhY3RDb21wb25lbnQoQ29tcG9uZW50KSxcbiAgICAgICAgY29udHJvbGxlZFByb3BzID0gT2JqZWN0LmtleXMoY29udHJvbGxlZFZhbHVlcyksXG4gICAgICAgIHByb3BUeXBlcztcblxuICAgIHZhciBPTUlUX1BST1BTID0gWyd2YWx1ZUxpbmsnLCAnY2hlY2tlZExpbmsnXS5jb25jYXQoY29udHJvbGxlZFByb3BzLm1hcCh1dGlscy5kZWZhdWx0S2V5KSk7XG5cbiAgICBwcm9wVHlwZXMgPSB1dGlscy51bmNvbnRyb2xsZWRQcm9wVHlwZXMoY29udHJvbGxlZFZhbHVlcywgYmFzZVByb3BUeXBlcywgZGlzcGxheU5hbWUpO1xuXG4gICAgKDAsIF9pbnZhcmlhbnQyLmRlZmF1bHQpKGlzQ29tcG9zaXRlQ29tcG9uZW50IHx8ICFtZXRob2RzLmxlbmd0aCwgJ1t1bmNvbnRyb2xsYWJsZV0gc3RhdGVsZXNzIGZ1bmN0aW9uIGNvbXBvbmVudHMgY2Fubm90IHBhc3MgdGhyb3VnaCBtZXRob2RzICcgKyAnYmVjYXVzZSB0aGV5IGhhdmUgbm8gYXNzb2NpYXRlZCBpbnN0YW5jZXMuIENoZWNrIGNvbXBvbmVudDogJyArIGRpc3BsYXlOYW1lICsgJywgJyArICdhdHRlbXB0aW5nIHRvIHBhc3MgdGhyb3VnaCBtZXRob2RzOiAnICsgbWV0aG9kcy5qb2luKCcsICcpKTtcblxuICAgIG1ldGhvZHMgPSB1dGlscy50cmFuc2Zvcm0obWV0aG9kcywgZnVuY3Rpb24gKG9iaiwgbWV0aG9kKSB7XG4gICAgICBvYmpbbWV0aG9kXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF9yZWZzJGlubmVyO1xuXG4gICAgICAgIHJldHVybiAoX3JlZnMkaW5uZXIgPSB0aGlzLnJlZnMuaW5uZXIpW21ldGhvZF0uYXBwbHkoX3JlZnMkaW5uZXIsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgIH0sIHt9KTtcblxuICAgIHZhciBjb21wb25lbnQgPSAoX3RlbXAgPSBfY2xhc3MgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAgICAgX2luaGVyaXRzKGNvbXBvbmVudCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgICAgIGZ1bmN0aW9uIGNvbXBvbmVudCgpIHtcbiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIGNvbXBvbmVudCk7XG5cbiAgICAgICAgcmV0dXJuIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgICB9XG5cbiAgICAgIGNvbXBvbmVudC5wcm90b3R5cGUuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkge1xuICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gIW1peGluLnNob3VsZENvbXBvbmVudFVwZGF0ZSB8fCBtaXhpbi5zaG91bGRDb21wb25lbnRVcGRhdGUuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICB9O1xuXG4gICAgICBjb21wb25lbnQucHJvdG90eXBlLmNvbXBvbmVudFdpbGxNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxNb3VudCgpIHtcbiAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcblxuICAgICAgICB0aGlzLl92YWx1ZXMgPSB7fTtcblxuICAgICAgICBjb250cm9sbGVkUHJvcHMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgX3RoaXMyLl92YWx1ZXNba2V5XSA9IHByb3BzW3V0aWxzLmRlZmF1bHRLZXkoa2V5KV07XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgLyoqXG4gICAgICAgKiBJZiBhIHByb3Agc3dpdGNoZXMgZnJvbSBjb250cm9sbGVkIHRvIFVuY29udHJvbGxlZFxuICAgICAgICogcmVzZXQgaXRzIHZhbHVlIHRvIHRoZSBkZWZhdWx0VmFsdWVcbiAgICAgICAqL1xuXG5cbiAgICAgIGNvbXBvbmVudC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzKSB7XG4gICAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHM7XG5cbiAgICAgICAgaWYgKG1peGluLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMpIHtcbiAgICAgICAgICBtaXhpbi5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLmNhbGwodGhpcywgbmV4dFByb3BzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRyb2xsZWRQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICBpZiAodXRpbHMuZ2V0VmFsdWUobmV4dFByb3BzLCBrZXkpID09PSB1bmRlZmluZWQgJiYgdXRpbHMuZ2V0VmFsdWUocHJvcHMsIGtleSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgX3RoaXMzLl92YWx1ZXNba2V5XSA9IG5leHRQcm9wc1t1dGlscy5kZWZhdWx0S2V5KGtleSldO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb21wb25lbnQucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHRoaXMudW5tb3VudGVkID0gdHJ1ZTtcbiAgICAgIH07XG5cbiAgICAgIGNvbXBvbmVudC5wcm90b3R5cGUuZ2V0Q29udHJvbGxlZEluc3RhbmNlID0gZnVuY3Rpb24gZ2V0Q29udHJvbGxlZEluc3RhbmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWZzLmlubmVyO1xuICAgICAgfTtcblxuICAgICAgY29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICAgIHZhciBuZXdQcm9wcyA9IHt9LFxuICAgICAgICAgICAgcHJvcHMgPSBvbWl0UHJvcHModGhpcy5wcm9wcyk7XG5cbiAgICAgICAgdXRpbHMuZWFjaChjb250cm9sbGVkVmFsdWVzLCBmdW5jdGlvbiAoaGFuZGxlLCBwcm9wTmFtZSkge1xuICAgICAgICAgIHZhciBsaW5rUHJvcE5hbWUgPSB1dGlscy5nZXRMaW5rTmFtZShwcm9wTmFtZSksXG4gICAgICAgICAgICAgIHByb3AgPSBfdGhpczQucHJvcHNbcHJvcE5hbWVdO1xuXG4gICAgICAgICAgaWYgKGxpbmtQcm9wTmFtZSAmJiAhaXNQcm9wKF90aGlzNC5wcm9wcywgcHJvcE5hbWUpICYmIGlzUHJvcChfdGhpczQucHJvcHMsIGxpbmtQcm9wTmFtZSkpIHtcbiAgICAgICAgICAgIHByb3AgPSBfdGhpczQucHJvcHNbbGlua1Byb3BOYW1lXS52YWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXdQcm9wc1twcm9wTmFtZV0gPSBwcm9wICE9PSB1bmRlZmluZWQgPyBwcm9wIDogX3RoaXM0Ll92YWx1ZXNbcHJvcE5hbWVdO1xuXG4gICAgICAgICAgbmV3UHJvcHNbaGFuZGxlXSA9IHNldEFuZE5vdGlmeS5iaW5kKF90aGlzNCwgcHJvcE5hbWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBuZXdQcm9wcyA9IF9leHRlbmRzKHt9LCBwcm9wcywgbmV3UHJvcHMsIHtcbiAgICAgICAgICByZWY6IGlzQ29tcG9zaXRlQ29tcG9uZW50ID8gJ2lubmVyJyA6IG51bGxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgbmV3UHJvcHMpO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9KF9yZWFjdDIuZGVmYXVsdC5Db21wb25lbnQpLCBfY2xhc3MuZGlzcGxheU5hbWUgPSAnVW5jb250cm9sbGVkKCcgKyBkaXNwbGF5TmFtZSArICcpJywgX2NsYXNzLnByb3BUeXBlcyA9IHByb3BUeXBlcywgX3RlbXApO1xuXG4gICAgX2V4dGVuZHMoY29tcG9uZW50LnByb3RvdHlwZSwgbWV0aG9kcyk7XG5cbiAgICBjb21wb25lbnQuQ29udHJvbGxlZENvbXBvbmVudCA9IENvbXBvbmVudDtcblxuICAgIC8qKlxuICAgICAqIHVzZWZ1bCB3aGVuIHdyYXBwaW5nIGEgQ29tcG9uZW50IGFuZCB5b3Ugd2FudCB0byBjb250cm9sXG4gICAgICogZXZlcnl0aGluZ1xuICAgICAqL1xuICAgIGNvbXBvbmVudC5kZWZlckNvbnRyb2xUbyA9IGZ1bmN0aW9uIChuZXdDb21wb25lbnQpIHtcbiAgICAgIHZhciBhZGRpdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgdmFyIG5leHRNZXRob2RzID0gYXJndW1lbnRzWzJdO1xuXG4gICAgICByZXR1cm4gdW5jb250cm9sbGFibGUobmV3Q29tcG9uZW50LCBfZXh0ZW5kcyh7fSwgY29udHJvbGxlZFZhbHVlcywgYWRkaXRpb25zKSwgbmV4dE1ldGhvZHMpO1xuICAgIH07XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuXG4gICAgZnVuY3Rpb24gc2V0QW5kTm90aWZ5KHByb3BOYW1lLCB2YWx1ZSkge1xuICAgICAgdmFyIGxpbmtOYW1lID0gdXRpbHMuZ2V0TGlua05hbWUocHJvcE5hbWUpLFxuICAgICAgICAgIGhhbmRsZXIgPSB0aGlzLnByb3BzW2NvbnRyb2xsZWRWYWx1ZXNbcHJvcE5hbWVdXTtcblxuICAgICAgaWYgKGxpbmtOYW1lICYmIGlzUHJvcCh0aGlzLnByb3BzLCBsaW5rTmFtZSkgJiYgIWhhbmRsZXIpIHtcbiAgICAgICAgaGFuZGxlciA9IHRoaXMucHJvcHNbbGlua05hbWVdLnJlcXVlc3RDaGFuZ2U7XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yID4gMiA/IF9sZW4yIC0gMiA6IDApLCBfa2V5MiA9IDI7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnc1tfa2V5MiAtIDJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgc2V0KHRoaXMsIHByb3BOYW1lLCBoYW5kbGVyLCB2YWx1ZSwgYXJncyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNQcm9wKHByb3BzLCBwcm9wKSB7XG4gICAgICByZXR1cm4gcHJvcHNbcHJvcF0gIT09IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbWl0UHJvcHMocHJvcHMpIHtcbiAgICAgIHZhciByZXN1bHQgPSB7fTtcblxuICAgICAgdXRpbHMuZWFjaChwcm9wcywgZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgaWYgKE9NSVRfUFJPUFMuaW5kZXhPZihrZXkpID09PSAtMSkgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2NyZWF0ZVVuY29udHJvbGxhYmxlID0gcmVxdWlyZSgnLi9jcmVhdGVVbmNvbnRyb2xsYWJsZScpO1xuXG52YXIgX2NyZWF0ZVVuY29udHJvbGxhYmxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZVVuY29udHJvbGxhYmxlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIG1peGluID0ge1xuICBzaG91bGRDb21wb25lbnRVcGRhdGU6IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpIHtcbiAgICAvL2xldCB0aGUgZm9yY2VVcGRhdGUgdHJpZ2dlciB0aGUgdXBkYXRlXG4gICAgcmV0dXJuICF0aGlzLl9ub3RpZnlpbmc7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIHNldChjb21wb25lbnQsIHByb3BOYW1lLCBoYW5kbGVyLCB2YWx1ZSwgYXJncykge1xuICBpZiAoaGFuZGxlcikge1xuICAgIGNvbXBvbmVudC5fbm90aWZ5aW5nID0gdHJ1ZTtcbiAgICBoYW5kbGVyLmNhbGwuYXBwbHkoaGFuZGxlciwgW2NvbXBvbmVudCwgdmFsdWVdLmNvbmNhdChhcmdzKSk7XG4gICAgY29tcG9uZW50Ll9ub3RpZnlpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIGNvbXBvbmVudC5fdmFsdWVzW3Byb3BOYW1lXSA9IHZhbHVlO1xuXG4gIGlmICghY29tcG9uZW50LnVubW91bnRlZCkgY29tcG9uZW50LmZvcmNlVXBkYXRlKCk7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9ICgwLCBfY3JlYXRlVW5jb250cm9sbGFibGUyLmRlZmF1bHQpKG1peGluLCBzZXQpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy52ZXJzaW9uID0gdW5kZWZpbmVkO1xuZXhwb3J0cy51bmNvbnRyb2xsZWRQcm9wVHlwZXMgPSB1bmNvbnRyb2xsZWRQcm9wVHlwZXM7XG5leHBvcnRzLmdldFR5cGUgPSBnZXRUeXBlO1xuZXhwb3J0cy5nZXRWYWx1ZSA9IGdldFZhbHVlO1xuZXhwb3J0cy5nZXRMaW5rTmFtZSA9IGdldExpbmtOYW1lO1xuZXhwb3J0cy5kZWZhdWx0S2V5ID0gZGVmYXVsdEtleTtcbmV4cG9ydHMuY2hhaW4gPSBjaGFpbjtcbmV4cG9ydHMudHJhbnNmb3JtID0gdHJhbnNmb3JtO1xuZXhwb3J0cy5lYWNoID0gZWFjaDtcbmV4cG9ydHMuaGFzID0gaGFzO1xuZXhwb3J0cy5pc1JlYWN0Q29tcG9uZW50ID0gaXNSZWFjdENvbXBvbmVudDtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX2ludmFyaWFudCA9IHJlcXVpcmUoJ2ludmFyaWFudCcpO1xuXG52YXIgX2ludmFyaWFudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnZhcmlhbnQpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiByZWFkT25seVByb3BUeXBlKGhhbmRsZXIsIG5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChwcm9wcywgcHJvcE5hbWUpIHtcbiAgICBpZiAocHJvcHNbcHJvcE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICghcHJvcHNbaGFuZGxlcl0pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignWW91IGhhdmUgcHJvdmlkZWQgYSBgJyArIHByb3BOYW1lICsgJ2AgcHJvcCB0byAnICsgJ2AnICsgbmFtZSArICdgIHdpdGhvdXQgYW4gYCcgKyBoYW5kbGVyICsgJ2AgaGFuZGxlci4gVGhpcyB3aWxsIHJlbmRlciBhIHJlYWQtb25seSBmaWVsZC4gJyArICdJZiB0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGAnICsgZGVmYXVsdEtleShwcm9wTmFtZSkgKyAnYC4gT3RoZXJ3aXNlLCBzZXQgYCcgKyBoYW5kbGVyICsgJ2AnKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5cbmZ1bmN0aW9uIHVuY29udHJvbGxlZFByb3BUeXBlcyhjb250cm9sbGVkVmFsdWVzLCBiYXNlUHJvcFR5cGVzLCBkaXNwbGF5TmFtZSkge1xuICB2YXIgcHJvcFR5cGVzID0ge307XG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgJiYgYmFzZVByb3BUeXBlcykge1xuICAgIHRyYW5zZm9ybShjb250cm9sbGVkVmFsdWVzLCBmdW5jdGlvbiAob2JqLCBoYW5kbGVyLCBwcm9wKSB7XG4gICAgICAoMCwgX2ludmFyaWFudDIuZGVmYXVsdCkodHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnICYmIGhhbmRsZXIudHJpbSgpLmxlbmd0aCwgJ1VuY29udHJvbGxhYmxlIC0gWyVzXTogdGhlIHByb3AgYCVzYCBuZWVkcyBhIHZhbGlkIGhhbmRsZXIga2V5IG5hbWUgaW4gb3JkZXIgdG8gbWFrZSBpdCB1bmNvbnRyb2xsYWJsZScsIGRpc3BsYXlOYW1lLCBwcm9wKTtcblxuICAgICAgb2JqW3Byb3BdID0gcmVhZE9ubHlQcm9wVHlwZShoYW5kbGVyLCBkaXNwbGF5TmFtZSk7XG4gICAgfSwgcHJvcFR5cGVzKTtcbiAgfVxuXG4gIHJldHVybiBwcm9wVHlwZXM7XG59XG5cbnZhciB2ZXJzaW9uID0gZXhwb3J0cy52ZXJzaW9uID0gX3JlYWN0Mi5kZWZhdWx0LnZlcnNpb24uc3BsaXQoJy4nKS5tYXAocGFyc2VGbG9hdCk7XG5cbmZ1bmN0aW9uIGdldFR5cGUoY29tcG9uZW50KSB7XG4gIGlmICh2ZXJzaW9uWzBdID49IDE1IHx8IHZlcnNpb25bMF0gPT09IDAgJiYgdmVyc2lvblsxXSA+PSAxMykgcmV0dXJuIGNvbXBvbmVudDtcblxuICByZXR1cm4gY29tcG9uZW50LnR5cGU7XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlKHByb3BzLCBuYW1lKSB7XG4gIHZhciBsaW5rUHJvcE5hbWUgPSBnZXRMaW5rTmFtZShuYW1lKTtcblxuICBpZiAobGlua1Byb3BOYW1lICYmICFpc1Byb3AocHJvcHMsIG5hbWUpICYmIGlzUHJvcChwcm9wcywgbGlua1Byb3BOYW1lKSkgcmV0dXJuIHByb3BzW2xpbmtQcm9wTmFtZV0udmFsdWU7XG5cbiAgcmV0dXJuIHByb3BzW25hbWVdO1xufVxuXG5mdW5jdGlvbiBpc1Byb3AocHJvcHMsIHByb3ApIHtcbiAgcmV0dXJuIHByb3BzW3Byb3BdICE9PSB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldExpbmtOYW1lKG5hbWUpIHtcbiAgcmV0dXJuIG5hbWUgPT09ICd2YWx1ZScgPyAndmFsdWVMaW5rJyA6IG5hbWUgPT09ICdjaGVja2VkJyA/ICdjaGVja2VkTGluaycgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0S2V5KGtleSkge1xuICByZXR1cm4gJ2RlZmF1bHQnICsga2V5LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsga2V5LnN1YnN0cigxKTtcbn1cblxuZnVuY3Rpb24gY2hhaW4odGhpc0FyZywgYSwgYikge1xuICByZXR1cm4gZnVuY3Rpb24gY2hhaW5lZEZ1bmN0aW9uKCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICBhcmdzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIGEgJiYgYS5jYWxsLmFwcGx5KGEsIFt0aGlzQXJnXS5jb25jYXQoYXJncykpO1xuICAgIGIgJiYgYi5jYWxsLmFwcGx5KGIsIFt0aGlzQXJnXS5jb25jYXQoYXJncykpO1xuICB9O1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm0ob2JqLCBjYiwgc2VlZCkge1xuICBlYWNoKG9iaiwgY2IuYmluZChudWxsLCBzZWVkID0gc2VlZCB8fCAoQXJyYXkuaXNBcnJheShvYmopID8gW10gOiB7fSkpKTtcbiAgcmV0dXJuIHNlZWQ7XG59XG5cbmZ1bmN0aW9uIGVhY2gob2JqLCBjYiwgdGhpc0FyZykge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLmZvckVhY2goY2IsIHRoaXNBcmcpO1xuXG4gIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICBpZiAoaGFzKG9iaiwga2V5KSkgY2IuY2FsbCh0aGlzQXJnLCBvYmpba2V5XSwga2V5LCBvYmopO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhcyhvLCBrKSB7XG4gIHJldHVybiBvID8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIGspIDogZmFsc2U7XG59XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gaXNSZWFjdENvbXBvbmVudChjb21wb25lbnQpIHtcbiAgcmV0dXJuICEhKGNvbXBvbmVudCAmJiBjb21wb25lbnQucHJvdG90eXBlICYmIGNvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHB1bnljb2RlID0gcmVxdWlyZSgncHVueWNvZGUnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbmV4cG9ydHMucGFyc2UgPSB1cmxQYXJzZTtcbmV4cG9ydHMucmVzb2x2ZSA9IHVybFJlc29sdmU7XG5leHBvcnRzLnJlc29sdmVPYmplY3QgPSB1cmxSZXNvbHZlT2JqZWN0O1xuZXhwb3J0cy5mb3JtYXQgPSB1cmxGb3JtYXQ7XG5cbmV4cG9ydHMuVXJsID0gVXJsO1xuXG5mdW5jdGlvbiBVcmwoKSB7XG4gIHRoaXMucHJvdG9jb2wgPSBudWxsO1xuICB0aGlzLnNsYXNoZXMgPSBudWxsO1xuICB0aGlzLmF1dGggPSBudWxsO1xuICB0aGlzLmhvc3QgPSBudWxsO1xuICB0aGlzLnBvcnQgPSBudWxsO1xuICB0aGlzLmhvc3RuYW1lID0gbnVsbDtcbiAgdGhpcy5oYXNoID0gbnVsbDtcbiAgdGhpcy5zZWFyY2ggPSBudWxsO1xuICB0aGlzLnF1ZXJ5ID0gbnVsbDtcbiAgdGhpcy5wYXRobmFtZSA9IG51bGw7XG4gIHRoaXMucGF0aCA9IG51bGw7XG4gIHRoaXMuaHJlZiA9IG51bGw7XG59XG5cbi8vIFJlZmVyZW5jZTogUkZDIDM5ODYsIFJGQyAxODA4LCBSRkMgMjM5NlxuXG4vLyBkZWZpbmUgdGhlc2UgaGVyZSBzbyBhdCBsZWFzdCB0aGV5IG9ubHkgaGF2ZSB0byBiZVxuLy8gY29tcGlsZWQgb25jZSBvbiB0aGUgZmlyc3QgbW9kdWxlIGxvYWQuXG52YXIgcHJvdG9jb2xQYXR0ZXJuID0gL14oW2EtejAtOS4rLV0rOikvaSxcbiAgICBwb3J0UGF0dGVybiA9IC86WzAtOV0qJC8sXG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGEgc2ltcGxlIHBhdGggVVJMXG4gICAgc2ltcGxlUGF0aFBhdHRlcm4gPSAvXihcXC9cXC8/KD8hXFwvKVteXFw/XFxzXSopKFxcP1teXFxzXSopPyQvLFxuXG4gICAgLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgcmVzZXJ2ZWQgZm9yIGRlbGltaXRpbmcgVVJMcy5cbiAgICAvLyBXZSBhY3R1YWxseSBqdXN0IGF1dG8tZXNjYXBlIHRoZXNlLlxuICAgIGRlbGltcyA9IFsnPCcsICc+JywgJ1wiJywgJ2AnLCAnICcsICdcXHInLCAnXFxuJywgJ1xcdCddLFxuXG4gICAgLy8gUkZDIDIzOTY6IGNoYXJhY3RlcnMgbm90IGFsbG93ZWQgZm9yIHZhcmlvdXMgcmVhc29ucy5cbiAgICB1bndpc2UgPSBbJ3snLCAnfScsICd8JywgJ1xcXFwnLCAnXicsICdgJ10uY29uY2F0KGRlbGltcyksXG5cbiAgICAvLyBBbGxvd2VkIGJ5IFJGQ3MsIGJ1dCBjYXVzZSBvZiBYU1MgYXR0YWNrcy4gIEFsd2F5cyBlc2NhcGUgdGhlc2UuXG4gICAgYXV0b0VzY2FwZSA9IFsnXFwnJ10uY29uY2F0KHVud2lzZSksXG4gICAgLy8gQ2hhcmFjdGVycyB0aGF0IGFyZSBuZXZlciBldmVyIGFsbG93ZWQgaW4gYSBob3N0bmFtZS5cbiAgICAvLyBOb3RlIHRoYXQgYW55IGludmFsaWQgY2hhcnMgYXJlIGFsc28gaGFuZGxlZCwgYnV0IHRoZXNlXG4gICAgLy8gYXJlIHRoZSBvbmVzIHRoYXQgYXJlICpleHBlY3RlZCogdG8gYmUgc2Vlbiwgc28gd2UgZmFzdC1wYXRoXG4gICAgLy8gdGhlbS5cbiAgICBub25Ib3N0Q2hhcnMgPSBbJyUnLCAnLycsICc/JywgJzsnLCAnIyddLmNvbmNhdChhdXRvRXNjYXBlKSxcbiAgICBob3N0RW5kaW5nQ2hhcnMgPSBbJy8nLCAnPycsICcjJ10sXG4gICAgaG9zdG5hbWVNYXhMZW4gPSAyNTUsXG4gICAgaG9zdG5hbWVQYXJ0UGF0dGVybiA9IC9eWythLXowLTlBLVpfLV17MCw2M30kLyxcbiAgICBob3N0bmFtZVBhcnRTdGFydCA9IC9eKFsrYS16MC05QS1aXy1dezAsNjN9KSguKikkLyxcbiAgICAvLyBwcm90b2NvbHMgdGhhdCBjYW4gYWxsb3cgXCJ1bnNhZmVcIiBhbmQgXCJ1bndpc2VcIiBjaGFycy5cbiAgICB1bnNhZmVQcm90b2NvbCA9IHtcbiAgICAgICdqYXZhc2NyaXB0JzogdHJ1ZSxcbiAgICAgICdqYXZhc2NyaXB0Oic6IHRydWVcbiAgICB9LFxuICAgIC8vIHByb3RvY29scyB0aGF0IG5ldmVyIGhhdmUgYSBob3N0bmFtZS5cbiAgICBob3N0bGVzc1Byb3RvY29sID0ge1xuICAgICAgJ2phdmFzY3JpcHQnOiB0cnVlLFxuICAgICAgJ2phdmFzY3JpcHQ6JzogdHJ1ZVxuICAgIH0sXG4gICAgLy8gcHJvdG9jb2xzIHRoYXQgYWx3YXlzIGNvbnRhaW4gYSAvLyBiaXQuXG4gICAgc2xhc2hlZFByb3RvY29sID0ge1xuICAgICAgJ2h0dHAnOiB0cnVlLFxuICAgICAgJ2h0dHBzJzogdHJ1ZSxcbiAgICAgICdmdHAnOiB0cnVlLFxuICAgICAgJ2dvcGhlcic6IHRydWUsXG4gICAgICAnZmlsZSc6IHRydWUsXG4gICAgICAnaHR0cDonOiB0cnVlLFxuICAgICAgJ2h0dHBzOic6IHRydWUsXG4gICAgICAnZnRwOic6IHRydWUsXG4gICAgICAnZ29waGVyOic6IHRydWUsXG4gICAgICAnZmlsZTonOiB0cnVlXG4gICAgfSxcbiAgICBxdWVyeXN0cmluZyA9IHJlcXVpcmUoJ3F1ZXJ5c3RyaW5nJyk7XG5cbmZ1bmN0aW9uIHVybFBhcnNlKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKHVybCAmJiB1dGlsLmlzT2JqZWN0KHVybCkgJiYgdXJsIGluc3RhbmNlb2YgVXJsKSByZXR1cm4gdXJsO1xuXG4gIHZhciB1ID0gbmV3IFVybDtcbiAgdS5wYXJzZSh1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KTtcbiAgcmV0dXJuIHU7XG59XG5cblVybC5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbih1cmwsIHBhcnNlUXVlcnlTdHJpbmcsIHNsYXNoZXNEZW5vdGVIb3N0KSB7XG4gIGlmICghdXRpbC5pc1N0cmluZyh1cmwpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlBhcmFtZXRlciAndXJsJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgXCIgKyB0eXBlb2YgdXJsKTtcbiAgfVxuXG4gIC8vIENvcHkgY2hyb21lLCBJRSwgb3BlcmEgYmFja3NsYXNoLWhhbmRsaW5nIGJlaGF2aW9yLlxuICAvLyBCYWNrIHNsYXNoZXMgYmVmb3JlIHRoZSBxdWVyeSBzdHJpbmcgZ2V0IGNvbnZlcnRlZCB0byBmb3J3YXJkIHNsYXNoZXNcbiAgLy8gU2VlOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9MjU5MTZcbiAgdmFyIHF1ZXJ5SW5kZXggPSB1cmwuaW5kZXhPZignPycpLFxuICAgICAgc3BsaXR0ZXIgPVxuICAgICAgICAgIChxdWVyeUluZGV4ICE9PSAtMSAmJiBxdWVyeUluZGV4IDwgdXJsLmluZGV4T2YoJyMnKSkgPyAnPycgOiAnIycsXG4gICAgICB1U3BsaXQgPSB1cmwuc3BsaXQoc3BsaXR0ZXIpLFxuICAgICAgc2xhc2hSZWdleCA9IC9cXFxcL2c7XG4gIHVTcGxpdFswXSA9IHVTcGxpdFswXS5yZXBsYWNlKHNsYXNoUmVnZXgsICcvJyk7XG4gIHVybCA9IHVTcGxpdC5qb2luKHNwbGl0dGVyKTtcblxuICB2YXIgcmVzdCA9IHVybDtcblxuICAvLyB0cmltIGJlZm9yZSBwcm9jZWVkaW5nLlxuICAvLyBUaGlzIGlzIHRvIHN1cHBvcnQgcGFyc2Ugc3R1ZmYgbGlrZSBcIiAgaHR0cDovL2Zvby5jb20gIFxcblwiXG4gIHJlc3QgPSByZXN0LnRyaW0oKTtcblxuICBpZiAoIXNsYXNoZXNEZW5vdGVIb3N0ICYmIHVybC5zcGxpdCgnIycpLmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIFRyeSBmYXN0IHBhdGggcmVnZXhwXG4gICAgdmFyIHNpbXBsZVBhdGggPSBzaW1wbGVQYXRoUGF0dGVybi5leGVjKHJlc3QpO1xuICAgIGlmIChzaW1wbGVQYXRoKSB7XG4gICAgICB0aGlzLnBhdGggPSByZXN0O1xuICAgICAgdGhpcy5ocmVmID0gcmVzdDtcbiAgICAgIHRoaXMucGF0aG5hbWUgPSBzaW1wbGVQYXRoWzFdO1xuICAgICAgaWYgKHNpbXBsZVBhdGhbMl0pIHtcbiAgICAgICAgdGhpcy5zZWFyY2ggPSBzaW1wbGVQYXRoWzJdO1xuICAgICAgICBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSBxdWVyeXN0cmluZy5wYXJzZSh0aGlzLnNlYXJjaC5zdWJzdHIoMSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucXVlcnkgPSB0aGlzLnNlYXJjaC5zdWJzdHIoMSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgICB0aGlzLnNlYXJjaCA9ICcnO1xuICAgICAgICB0aGlzLnF1ZXJ5ID0ge307XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1cblxuICB2YXIgcHJvdG8gPSBwcm90b2NvbFBhdHRlcm4uZXhlYyhyZXN0KTtcbiAgaWYgKHByb3RvKSB7XG4gICAgcHJvdG8gPSBwcm90b1swXTtcbiAgICB2YXIgbG93ZXJQcm90byA9IHByb3RvLnRvTG93ZXJDYXNlKCk7XG4gICAgdGhpcy5wcm90b2NvbCA9IGxvd2VyUHJvdG87XG4gICAgcmVzdCA9IHJlc3Quc3Vic3RyKHByb3RvLmxlbmd0aCk7XG4gIH1cblxuICAvLyBmaWd1cmUgb3V0IGlmIGl0J3MgZ290IGEgaG9zdFxuICAvLyB1c2VyQHNlcnZlciBpcyAqYWx3YXlzKiBpbnRlcnByZXRlZCBhcyBhIGhvc3RuYW1lLCBhbmQgdXJsXG4gIC8vIHJlc29sdXRpb24gd2lsbCB0cmVhdCAvL2Zvby9iYXIgYXMgaG9zdD1mb28scGF0aD1iYXIgYmVjYXVzZSB0aGF0J3NcbiAgLy8gaG93IHRoZSBicm93c2VyIHJlc29sdmVzIHJlbGF0aXZlIFVSTHMuXG4gIGlmIChzbGFzaGVzRGVub3RlSG9zdCB8fCBwcm90byB8fCByZXN0Lm1hdGNoKC9eXFwvXFwvW15AXFwvXStAW15AXFwvXSsvKSkge1xuICAgIHZhciBzbGFzaGVzID0gcmVzdC5zdWJzdHIoMCwgMikgPT09ICcvLyc7XG4gICAgaWYgKHNsYXNoZXMgJiYgIShwcm90byAmJiBob3N0bGVzc1Byb3RvY29sW3Byb3RvXSkpIHtcbiAgICAgIHJlc3QgPSByZXN0LnN1YnN0cigyKTtcbiAgICAgIHRoaXMuc2xhc2hlcyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFob3N0bGVzc1Byb3RvY29sW3Byb3RvXSAmJlxuICAgICAgKHNsYXNoZXMgfHwgKHByb3RvICYmICFzbGFzaGVkUHJvdG9jb2xbcHJvdG9dKSkpIHtcblxuICAgIC8vIHRoZXJlJ3MgYSBob3N0bmFtZS5cbiAgICAvLyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgLywgPywgOywgb3IgIyBlbmRzIHRoZSBob3N0LlxuICAgIC8vXG4gICAgLy8gSWYgdGhlcmUgaXMgYW4gQCBpbiB0aGUgaG9zdG5hbWUsIHRoZW4gbm9uLWhvc3QgY2hhcnMgKmFyZSogYWxsb3dlZFxuICAgIC8vIHRvIHRoZSBsZWZ0IG9mIHRoZSBsYXN0IEAgc2lnbiwgdW5sZXNzIHNvbWUgaG9zdC1lbmRpbmcgY2hhcmFjdGVyXG4gICAgLy8gY29tZXMgKmJlZm9yZSogdGhlIEAtc2lnbi5cbiAgICAvLyBVUkxzIGFyZSBvYm5veGlvdXMuXG4gICAgLy9cbiAgICAvLyBleDpcbiAgICAvLyBodHRwOi8vYUBiQGMvID0+IHVzZXI6YUBiIGhvc3Q6Y1xuICAgIC8vIGh0dHA6Ly9hQGI/QGMgPT4gdXNlcjphIGhvc3Q6YyBwYXRoOi8/QGNcblxuICAgIC8vIHYwLjEyIFRPRE8oaXNhYWNzKTogVGhpcyBpcyBub3QgcXVpdGUgaG93IENocm9tZSBkb2VzIHRoaW5ncy5cbiAgICAvLyBSZXZpZXcgb3VyIHRlc3QgY2FzZSBhZ2FpbnN0IGJyb3dzZXJzIG1vcmUgY29tcHJlaGVuc2l2ZWx5LlxuXG4gICAgLy8gZmluZCB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYW55IGhvc3RFbmRpbmdDaGFyc1xuICAgIHZhciBob3N0RW5kID0gLTE7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBob3N0RW5kaW5nQ2hhcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBoZWMgPSByZXN0LmluZGV4T2YoaG9zdEVuZGluZ0NoYXJzW2ldKTtcbiAgICAgIGlmIChoZWMgIT09IC0xICYmIChob3N0RW5kID09PSAtMSB8fCBoZWMgPCBob3N0RW5kKSlcbiAgICAgICAgaG9zdEVuZCA9IGhlYztcbiAgICB9XG5cbiAgICAvLyBhdCB0aGlzIHBvaW50LCBlaXRoZXIgd2UgaGF2ZSBhbiBleHBsaWNpdCBwb2ludCB3aGVyZSB0aGVcbiAgICAvLyBhdXRoIHBvcnRpb24gY2Fubm90IGdvIHBhc3QsIG9yIHRoZSBsYXN0IEAgY2hhciBpcyB0aGUgZGVjaWRlci5cbiAgICB2YXIgYXV0aCwgYXRTaWduO1xuICAgIGlmIChob3N0RW5kID09PSAtMSkge1xuICAgICAgLy8gYXRTaWduIGNhbiBiZSBhbnl3aGVyZS5cbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYXRTaWduIG11c3QgYmUgaW4gYXV0aCBwb3J0aW9uLlxuICAgICAgLy8gaHR0cDovL2FAYi9jQGQgPT4gaG9zdDpiIGF1dGg6YSBwYXRoOi9jQGRcbiAgICAgIGF0U2lnbiA9IHJlc3QubGFzdEluZGV4T2YoJ0AnLCBob3N0RW5kKTtcbiAgICB9XG5cbiAgICAvLyBOb3cgd2UgaGF2ZSBhIHBvcnRpb24gd2hpY2ggaXMgZGVmaW5pdGVseSB0aGUgYXV0aC5cbiAgICAvLyBQdWxsIHRoYXQgb2ZmLlxuICAgIGlmIChhdFNpZ24gIT09IC0xKSB7XG4gICAgICBhdXRoID0gcmVzdC5zbGljZSgwLCBhdFNpZ24pO1xuICAgICAgcmVzdCA9IHJlc3Quc2xpY2UoYXRTaWduICsgMSk7XG4gICAgICB0aGlzLmF1dGggPSBkZWNvZGVVUklDb21wb25lbnQoYXV0aCk7XG4gICAgfVxuXG4gICAgLy8gdGhlIGhvc3QgaXMgdGhlIHJlbWFpbmluZyB0byB0aGUgbGVmdCBvZiB0aGUgZmlyc3Qgbm9uLWhvc3QgY2hhclxuICAgIGhvc3RFbmQgPSAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vbkhvc3RDaGFycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhlYyA9IHJlc3QuaW5kZXhPZihub25Ib3N0Q2hhcnNbaV0pO1xuICAgICAgaWYgKGhlYyAhPT0gLTEgJiYgKGhvc3RFbmQgPT09IC0xIHx8IGhlYyA8IGhvc3RFbmQpKVxuICAgICAgICBob3N0RW5kID0gaGVjO1xuICAgIH1cbiAgICAvLyBpZiB3ZSBzdGlsbCBoYXZlIG5vdCBoaXQgaXQsIHRoZW4gdGhlIGVudGlyZSB0aGluZyBpcyBhIGhvc3QuXG4gICAgaWYgKGhvc3RFbmQgPT09IC0xKVxuICAgICAgaG9zdEVuZCA9IHJlc3QubGVuZ3RoO1xuXG4gICAgdGhpcy5ob3N0ID0gcmVzdC5zbGljZSgwLCBob3N0RW5kKTtcbiAgICByZXN0ID0gcmVzdC5zbGljZShob3N0RW5kKTtcblxuICAgIC8vIHB1bGwgb3V0IHBvcnQuXG4gICAgdGhpcy5wYXJzZUhvc3QoKTtcblxuICAgIC8vIHdlJ3ZlIGluZGljYXRlZCB0aGF0IHRoZXJlIGlzIGEgaG9zdG5hbWUsXG4gICAgLy8gc28gZXZlbiBpZiBpdCdzIGVtcHR5LCBpdCBoYXMgdG8gYmUgcHJlc2VudC5cbiAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZSB8fCAnJztcblxuICAgIC8vIGlmIGhvc3RuYW1lIGJlZ2lucyB3aXRoIFsgYW5kIGVuZHMgd2l0aCBdXG4gICAgLy8gYXNzdW1lIHRoYXQgaXQncyBhbiBJUHY2IGFkZHJlc3MuXG4gICAgdmFyIGlwdjZIb3N0bmFtZSA9IHRoaXMuaG9zdG5hbWVbMF0gPT09ICdbJyAmJlxuICAgICAgICB0aGlzLmhvc3RuYW1lW3RoaXMuaG9zdG5hbWUubGVuZ3RoIC0gMV0gPT09ICddJztcblxuICAgIC8vIHZhbGlkYXRlIGEgbGl0dGxlLlxuICAgIGlmICghaXB2Nkhvc3RuYW1lKSB7XG4gICAgICB2YXIgaG9zdHBhcnRzID0gdGhpcy5ob3N0bmFtZS5zcGxpdCgvXFwuLyk7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGhvc3RwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgdmFyIHBhcnQgPSBob3N0cGFydHNbaV07XG4gICAgICAgIGlmICghcGFydCkgY29udGludWU7XG4gICAgICAgIGlmICghcGFydC5tYXRjaChob3N0bmFtZVBhcnRQYXR0ZXJuKSkge1xuICAgICAgICAgIHZhciBuZXdwYXJ0ID0gJyc7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGsgPSBwYXJ0Lmxlbmd0aDsgaiA8IGs7IGorKykge1xuICAgICAgICAgICAgaWYgKHBhcnQuY2hhckNvZGVBdChqKSA+IDEyNykge1xuICAgICAgICAgICAgICAvLyB3ZSByZXBsYWNlIG5vbi1BU0NJSSBjaGFyIHdpdGggYSB0ZW1wb3JhcnkgcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0aGlzIHRvIG1ha2Ugc3VyZSBzaXplIG9mIGhvc3RuYW1lIGlzIG5vdFxuICAgICAgICAgICAgICAvLyBicm9rZW4gYnkgcmVwbGFjaW5nIG5vbi1BU0NJSSBieSBub3RoaW5nXG4gICAgICAgICAgICAgIG5ld3BhcnQgKz0gJ3gnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbmV3cGFydCArPSBwYXJ0W2pdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB3ZSB0ZXN0IGFnYWluIHdpdGggQVNDSUkgY2hhciBvbmx5XG4gICAgICAgICAgaWYgKCFuZXdwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFBhdHRlcm4pKSB7XG4gICAgICAgICAgICB2YXIgdmFsaWRQYXJ0cyA9IGhvc3RwYXJ0cy5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgIHZhciBub3RIb3N0ID0gaG9zdHBhcnRzLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgICAgIHZhciBiaXQgPSBwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFN0YXJ0KTtcbiAgICAgICAgICAgIGlmIChiaXQpIHtcbiAgICAgICAgICAgICAgdmFsaWRQYXJ0cy5wdXNoKGJpdFsxXSk7XG4gICAgICAgICAgICAgIG5vdEhvc3QudW5zaGlmdChiaXRbMl0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vdEhvc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHJlc3QgPSAnLycgKyBub3RIb3N0LmpvaW4oJy4nKSArIHJlc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhvc3RuYW1lID0gdmFsaWRQYXJ0cy5qb2luKCcuJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5ob3N0bmFtZS5sZW5ndGggPiBob3N0bmFtZU1heExlbikge1xuICAgICAgdGhpcy5ob3N0bmFtZSA9ICcnO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBob3N0bmFtZXMgYXJlIGFsd2F5cyBsb3dlciBjYXNlLlxuICAgICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAoIWlwdjZIb3N0bmFtZSkge1xuICAgICAgLy8gSUROQSBTdXBwb3J0OiBSZXR1cm5zIGEgcHVueWNvZGVkIHJlcHJlc2VudGF0aW9uIG9mIFwiZG9tYWluXCIuXG4gICAgICAvLyBJdCBvbmx5IGNvbnZlcnRzIHBhcnRzIG9mIHRoZSBkb21haW4gbmFtZSB0aGF0XG4gICAgICAvLyBoYXZlIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCBpLmUuIGl0IGRvZXNuJ3QgbWF0dGVyIGlmXG4gICAgICAvLyB5b3UgY2FsbCBpdCB3aXRoIGEgZG9tYWluIHRoYXQgYWxyZWFkeSBpcyBBU0NJSS1vbmx5LlxuICAgICAgdGhpcy5ob3N0bmFtZSA9IHB1bnljb2RlLnRvQVNDSUkodGhpcy5ob3N0bmFtZSk7XG4gICAgfVxuXG4gICAgdmFyIHAgPSB0aGlzLnBvcnQgPyAnOicgKyB0aGlzLnBvcnQgOiAnJztcbiAgICB2YXIgaCA9IHRoaXMuaG9zdG5hbWUgfHwgJyc7XG4gICAgdGhpcy5ob3N0ID0gaCArIHA7XG4gICAgdGhpcy5ocmVmICs9IHRoaXMuaG9zdDtcblxuICAgIC8vIHN0cmlwIFsgYW5kIF0gZnJvbSB0aGUgaG9zdG5hbWVcbiAgICAvLyB0aGUgaG9zdCBmaWVsZCBzdGlsbCByZXRhaW5zIHRoZW0sIHRob3VnaFxuICAgIGlmIChpcHY2SG9zdG5hbWUpIHtcbiAgICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lLnN1YnN0cigxLCB0aGlzLmhvc3RuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgaWYgKHJlc3RbMF0gIT09ICcvJykge1xuICAgICAgICByZXN0ID0gJy8nICsgcmVzdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBub3cgcmVzdCBpcyBzZXQgdG8gdGhlIHBvc3QtaG9zdCBzdHVmZi5cbiAgLy8gY2hvcCBvZmYgYW55IGRlbGltIGNoYXJzLlxuICBpZiAoIXVuc2FmZVByb3RvY29sW2xvd2VyUHJvdG9dKSB7XG5cbiAgICAvLyBGaXJzdCwgbWFrZSAxMDAlIHN1cmUgdGhhdCBhbnkgXCJhdXRvRXNjYXBlXCIgY2hhcnMgZ2V0XG4gICAgLy8gZXNjYXBlZCwgZXZlbiBpZiBlbmNvZGVVUklDb21wb25lbnQgZG9lc24ndCB0aGluayB0aGV5XG4gICAgLy8gbmVlZCB0byBiZS5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IGF1dG9Fc2NhcGUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgYWUgPSBhdXRvRXNjYXBlW2ldO1xuICAgICAgaWYgKHJlc3QuaW5kZXhPZihhZSkgPT09IC0xKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIHZhciBlc2MgPSBlbmNvZGVVUklDb21wb25lbnQoYWUpO1xuICAgICAgaWYgKGVzYyA9PT0gYWUpIHtcbiAgICAgICAgZXNjID0gZXNjYXBlKGFlKTtcbiAgICAgIH1cbiAgICAgIHJlc3QgPSByZXN0LnNwbGl0KGFlKS5qb2luKGVzYyk7XG4gICAgfVxuICB9XG5cblxuICAvLyBjaG9wIG9mZiBmcm9tIHRoZSB0YWlsIGZpcnN0LlxuICB2YXIgaGFzaCA9IHJlc3QuaW5kZXhPZignIycpO1xuICBpZiAoaGFzaCAhPT0gLTEpIHtcbiAgICAvLyBnb3QgYSBmcmFnbWVudCBzdHJpbmcuXG4gICAgdGhpcy5oYXNoID0gcmVzdC5zdWJzdHIoaGFzaCk7XG4gICAgcmVzdCA9IHJlc3Quc2xpY2UoMCwgaGFzaCk7XG4gIH1cbiAgdmFyIHFtID0gcmVzdC5pbmRleE9mKCc/Jyk7XG4gIGlmIChxbSAhPT0gLTEpIHtcbiAgICB0aGlzLnNlYXJjaCA9IHJlc3Quc3Vic3RyKHFtKTtcbiAgICB0aGlzLnF1ZXJ5ID0gcmVzdC5zdWJzdHIocW0gKyAxKTtcbiAgICBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5c3RyaW5nLnBhcnNlKHRoaXMucXVlcnkpO1xuICAgIH1cbiAgICByZXN0ID0gcmVzdC5zbGljZSgwLCBxbSk7XG4gIH0gZWxzZSBpZiAocGFyc2VRdWVyeVN0cmluZykge1xuICAgIC8vIG5vIHF1ZXJ5IHN0cmluZywgYnV0IHBhcnNlUXVlcnlTdHJpbmcgc3RpbGwgcmVxdWVzdGVkXG4gICAgdGhpcy5zZWFyY2ggPSAnJztcbiAgICB0aGlzLnF1ZXJ5ID0ge307XG4gIH1cbiAgaWYgKHJlc3QpIHRoaXMucGF0aG5hbWUgPSByZXN0O1xuICBpZiAoc2xhc2hlZFByb3RvY29sW2xvd2VyUHJvdG9dICYmXG4gICAgICB0aGlzLmhvc3RuYW1lICYmICF0aGlzLnBhdGhuYW1lKSB7XG4gICAgdGhpcy5wYXRobmFtZSA9ICcvJztcbiAgfVxuXG4gIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgaWYgKHRoaXMucGF0aG5hbWUgfHwgdGhpcy5zZWFyY2gpIHtcbiAgICB2YXIgcCA9IHRoaXMucGF0aG5hbWUgfHwgJyc7XG4gICAgdmFyIHMgPSB0aGlzLnNlYXJjaCB8fCAnJztcbiAgICB0aGlzLnBhdGggPSBwICsgcztcbiAgfVxuXG4gIC8vIGZpbmFsbHksIHJlY29uc3RydWN0IHRoZSBocmVmIGJhc2VkIG9uIHdoYXQgaGFzIGJlZW4gdmFsaWRhdGVkLlxuICB0aGlzLmhyZWYgPSB0aGlzLmZvcm1hdCgpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGZvcm1hdCBhIHBhcnNlZCBvYmplY3QgaW50byBhIHVybCBzdHJpbmdcbmZ1bmN0aW9uIHVybEZvcm1hdChvYmopIHtcbiAgLy8gZW5zdXJlIGl0J3MgYW4gb2JqZWN0LCBhbmQgbm90IGEgc3RyaW5nIHVybC5cbiAgLy8gSWYgaXQncyBhbiBvYmosIHRoaXMgaXMgYSBuby1vcC5cbiAgLy8gdGhpcyB3YXksIHlvdSBjYW4gY2FsbCB1cmxfZm9ybWF0KCkgb24gc3RyaW5nc1xuICAvLyB0byBjbGVhbiB1cCBwb3RlbnRpYWxseSB3b25reSB1cmxzLlxuICBpZiAodXRpbC5pc1N0cmluZyhvYmopKSBvYmogPSB1cmxQYXJzZShvYmopO1xuICBpZiAoIShvYmogaW5zdGFuY2VvZiBVcmwpKSByZXR1cm4gVXJsLnByb3RvdHlwZS5mb3JtYXQuY2FsbChvYmopO1xuICByZXR1cm4gb2JqLmZvcm1hdCgpO1xufVxuXG5VcmwucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgYXV0aCA9IHRoaXMuYXV0aCB8fCAnJztcbiAgaWYgKGF1dGgpIHtcbiAgICBhdXRoID0gZW5jb2RlVVJJQ29tcG9uZW50KGF1dGgpO1xuICAgIGF1dGggPSBhdXRoLnJlcGxhY2UoLyUzQS9pLCAnOicpO1xuICAgIGF1dGggKz0gJ0AnO1xuICB9XG5cbiAgdmFyIHByb3RvY29sID0gdGhpcy5wcm90b2NvbCB8fCAnJyxcbiAgICAgIHBhdGhuYW1lID0gdGhpcy5wYXRobmFtZSB8fCAnJyxcbiAgICAgIGhhc2ggPSB0aGlzLmhhc2ggfHwgJycsXG4gICAgICBob3N0ID0gZmFsc2UsXG4gICAgICBxdWVyeSA9ICcnO1xuXG4gIGlmICh0aGlzLmhvc3QpIHtcbiAgICBob3N0ID0gYXV0aCArIHRoaXMuaG9zdDtcbiAgfSBlbHNlIGlmICh0aGlzLmhvc3RuYW1lKSB7XG4gICAgaG9zdCA9IGF1dGggKyAodGhpcy5ob3N0bmFtZS5pbmRleE9mKCc6JykgPT09IC0xID9cbiAgICAgICAgdGhpcy5ob3N0bmFtZSA6XG4gICAgICAgICdbJyArIHRoaXMuaG9zdG5hbWUgKyAnXScpO1xuICAgIGlmICh0aGlzLnBvcnQpIHtcbiAgICAgIGhvc3QgKz0gJzonICsgdGhpcy5wb3J0O1xuICAgIH1cbiAgfVxuXG4gIGlmICh0aGlzLnF1ZXJ5ICYmXG4gICAgICB1dGlsLmlzT2JqZWN0KHRoaXMucXVlcnkpICYmXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnF1ZXJ5KS5sZW5ndGgpIHtcbiAgICBxdWVyeSA9IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeSh0aGlzLnF1ZXJ5KTtcbiAgfVxuXG4gIHZhciBzZWFyY2ggPSB0aGlzLnNlYXJjaCB8fCAocXVlcnkgJiYgKCc/JyArIHF1ZXJ5KSkgfHwgJyc7XG5cbiAgaWYgKHByb3RvY29sICYmIHByb3RvY29sLnN1YnN0cigtMSkgIT09ICc6JykgcHJvdG9jb2wgKz0gJzonO1xuXG4gIC8vIG9ubHkgdGhlIHNsYXNoZWRQcm90b2NvbHMgZ2V0IHRoZSAvLy4gIE5vdCBtYWlsdG86LCB4bXBwOiwgZXRjLlxuICAvLyB1bmxlc3MgdGhleSBoYWQgdGhlbSB0byBiZWdpbiB3aXRoLlxuICBpZiAodGhpcy5zbGFzaGVzIHx8XG4gICAgICAoIXByb3RvY29sIHx8IHNsYXNoZWRQcm90b2NvbFtwcm90b2NvbF0pICYmIGhvc3QgIT09IGZhbHNlKSB7XG4gICAgaG9zdCA9ICcvLycgKyAoaG9zdCB8fCAnJyk7XG4gICAgaWYgKHBhdGhuYW1lICYmIHBhdGhuYW1lLmNoYXJBdCgwKSAhPT0gJy8nKSBwYXRobmFtZSA9ICcvJyArIHBhdGhuYW1lO1xuICB9IGVsc2UgaWYgKCFob3N0KSB7XG4gICAgaG9zdCA9ICcnO1xuICB9XG5cbiAgaWYgKGhhc2ggJiYgaGFzaC5jaGFyQXQoMCkgIT09ICcjJykgaGFzaCA9ICcjJyArIGhhc2g7XG4gIGlmIChzZWFyY2ggJiYgc2VhcmNoLmNoYXJBdCgwKSAhPT0gJz8nKSBzZWFyY2ggPSAnPycgKyBzZWFyY2g7XG5cbiAgcGF0aG5hbWUgPSBwYXRobmFtZS5yZXBsYWNlKC9bPyNdL2csIGZ1bmN0aW9uKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChtYXRjaCk7XG4gIH0pO1xuICBzZWFyY2ggPSBzZWFyY2gucmVwbGFjZSgnIycsICclMjMnKTtcblxuICByZXR1cm4gcHJvdG9jb2wgKyBob3N0ICsgcGF0aG5hbWUgKyBzZWFyY2ggKyBoYXNoO1xufTtcblxuZnVuY3Rpb24gdXJsUmVzb2x2ZShzb3VyY2UsIHJlbGF0aXZlKSB7XG4gIHJldHVybiB1cmxQYXJzZShzb3VyY2UsIGZhbHNlLCB0cnVlKS5yZXNvbHZlKHJlbGF0aXZlKTtcbn1cblxuVXJsLnByb3RvdHlwZS5yZXNvbHZlID0gZnVuY3Rpb24ocmVsYXRpdmUpIHtcbiAgcmV0dXJuIHRoaXMucmVzb2x2ZU9iamVjdCh1cmxQYXJzZShyZWxhdGl2ZSwgZmFsc2UsIHRydWUpKS5mb3JtYXQoKTtcbn07XG5cbmZ1bmN0aW9uIHVybFJlc29sdmVPYmplY3Qoc291cmNlLCByZWxhdGl2ZSkge1xuICBpZiAoIXNvdXJjZSkgcmV0dXJuIHJlbGF0aXZlO1xuICByZXR1cm4gdXJsUGFyc2Uoc291cmNlLCBmYWxzZSwgdHJ1ZSkucmVzb2x2ZU9iamVjdChyZWxhdGl2ZSk7XG59XG5cblVybC5wcm90b3R5cGUucmVzb2x2ZU9iamVjdCA9IGZ1bmN0aW9uKHJlbGF0aXZlKSB7XG4gIGlmICh1dGlsLmlzU3RyaW5nKHJlbGF0aXZlKSkge1xuICAgIHZhciByZWwgPSBuZXcgVXJsKCk7XG4gICAgcmVsLnBhcnNlKHJlbGF0aXZlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgcmVsYXRpdmUgPSByZWw7XG4gIH1cblxuICB2YXIgcmVzdWx0ID0gbmV3IFVybCgpO1xuICB2YXIgdGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKTtcbiAgZm9yICh2YXIgdGsgPSAwOyB0ayA8IHRrZXlzLmxlbmd0aDsgdGsrKykge1xuICAgIHZhciB0a2V5ID0gdGtleXNbdGtdO1xuICAgIHJlc3VsdFt0a2V5XSA9IHRoaXNbdGtleV07XG4gIH1cblxuICAvLyBoYXNoIGlzIGFsd2F5cyBvdmVycmlkZGVuLCBubyBtYXR0ZXIgd2hhdC5cbiAgLy8gZXZlbiBocmVmPVwiXCIgd2lsbCByZW1vdmUgaXQuXG4gIHJlc3VsdC5oYXNoID0gcmVsYXRpdmUuaGFzaDtcblxuICAvLyBpZiB0aGUgcmVsYXRpdmUgdXJsIGlzIGVtcHR5LCB0aGVuIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IHRvIGRvIGhlcmUuXG4gIGlmIChyZWxhdGl2ZS5ocmVmID09PSAnJykge1xuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBocmVmcyBsaWtlIC8vZm9vL2JhciBhbHdheXMgY3V0IHRvIHRoZSBwcm90b2NvbC5cbiAgaWYgKHJlbGF0aXZlLnNsYXNoZXMgJiYgIXJlbGF0aXZlLnByb3RvY29sKSB7XG4gICAgLy8gdGFrZSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgcHJvdG9jb2wgZnJvbSByZWxhdGl2ZVxuICAgIHZhciBya2V5cyA9IE9iamVjdC5rZXlzKHJlbGF0aXZlKTtcbiAgICBmb3IgKHZhciByayA9IDA7IHJrIDwgcmtleXMubGVuZ3RoOyByaysrKSB7XG4gICAgICB2YXIgcmtleSA9IHJrZXlzW3JrXTtcbiAgICAgIGlmIChya2V5ICE9PSAncHJvdG9jb2wnKVxuICAgICAgICByZXN1bHRbcmtleV0gPSByZWxhdGl2ZVtya2V5XTtcbiAgICB9XG5cbiAgICAvL3VybFBhcnNlIGFwcGVuZHMgdHJhaWxpbmcgLyB0byB1cmxzIGxpa2UgaHR0cDovL3d3dy5leGFtcGxlLmNvbVxuICAgIGlmIChzbGFzaGVkUHJvdG9jb2xbcmVzdWx0LnByb3RvY29sXSAmJlxuICAgICAgICByZXN1bHQuaG9zdG5hbWUgJiYgIXJlc3VsdC5wYXRobmFtZSkge1xuICAgICAgcmVzdWx0LnBhdGggPSByZXN1bHQucGF0aG5hbWUgPSAnLyc7XG4gICAgfVxuXG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmIChyZWxhdGl2ZS5wcm90b2NvbCAmJiByZWxhdGl2ZS5wcm90b2NvbCAhPT0gcmVzdWx0LnByb3RvY29sKSB7XG4gICAgLy8gaWYgaXQncyBhIGtub3duIHVybCBwcm90b2NvbCwgdGhlbiBjaGFuZ2luZ1xuICAgIC8vIHRoZSBwcm90b2NvbCBkb2VzIHdlaXJkIHRoaW5nc1xuICAgIC8vIGZpcnN0LCBpZiBpdCdzIG5vdCBmaWxlOiwgdGhlbiB3ZSBNVVNUIGhhdmUgYSBob3N0LFxuICAgIC8vIGFuZCBpZiB0aGVyZSB3YXMgYSBwYXRoXG4gICAgLy8gdG8gYmVnaW4gd2l0aCwgdGhlbiB3ZSBNVVNUIGhhdmUgYSBwYXRoLlxuICAgIC8vIGlmIGl0IGlzIGZpbGU6LCB0aGVuIHRoZSBob3N0IGlzIGRyb3BwZWQsXG4gICAgLy8gYmVjYXVzZSB0aGF0J3Mga25vd24gdG8gYmUgaG9zdGxlc3MuXG4gICAgLy8gYW55dGhpbmcgZWxzZSBpcyBhc3N1bWVkIHRvIGJlIGFic29sdXRlLlxuICAgIGlmICghc2xhc2hlZFByb3RvY29sW3JlbGF0aXZlLnByb3RvY29sXSkge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhyZWxhdGl2ZSk7XG4gICAgICBmb3IgKHZhciB2ID0gMDsgdiA8IGtleXMubGVuZ3RoOyB2KyspIHtcbiAgICAgICAgdmFyIGsgPSBrZXlzW3ZdO1xuICAgICAgICByZXN1bHRba10gPSByZWxhdGl2ZVtrXTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICByZXN1bHQucHJvdG9jb2wgPSByZWxhdGl2ZS5wcm90b2NvbDtcbiAgICBpZiAoIXJlbGF0aXZlLmhvc3QgJiYgIWhvc3RsZXNzUHJvdG9jb2xbcmVsYXRpdmUucHJvdG9jb2xdKSB7XG4gICAgICB2YXIgcmVsUGF0aCA9IChyZWxhdGl2ZS5wYXRobmFtZSB8fCAnJykuc3BsaXQoJy8nKTtcbiAgICAgIHdoaWxlIChyZWxQYXRoLmxlbmd0aCAmJiAhKHJlbGF0aXZlLmhvc3QgPSByZWxQYXRoLnNoaWZ0KCkpKTtcbiAgICAgIGlmICghcmVsYXRpdmUuaG9zdCkgcmVsYXRpdmUuaG9zdCA9ICcnO1xuICAgICAgaWYgKCFyZWxhdGl2ZS5ob3N0bmFtZSkgcmVsYXRpdmUuaG9zdG5hbWUgPSAnJztcbiAgICAgIGlmIChyZWxQYXRoWzBdICE9PSAnJykgcmVsUGF0aC51bnNoaWZ0KCcnKTtcbiAgICAgIGlmIChyZWxQYXRoLmxlbmd0aCA8IDIpIHJlbFBhdGgudW5zaGlmdCgnJyk7XG4gICAgICByZXN1bHQucGF0aG5hbWUgPSByZWxQYXRoLmpvaW4oJy8nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnBhdGhuYW1lID0gcmVsYXRpdmUucGF0aG5hbWU7XG4gICAgfVxuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgcmVzdWx0Lmhvc3QgPSByZWxhdGl2ZS5ob3N0IHx8ICcnO1xuICAgIHJlc3VsdC5hdXRoID0gcmVsYXRpdmUuYXV0aDtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSByZWxhdGl2ZS5ob3N0bmFtZSB8fCByZWxhdGl2ZS5ob3N0O1xuICAgIHJlc3VsdC5wb3J0ID0gcmVsYXRpdmUucG9ydDtcbiAgICAvLyB0byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmIChyZXN1bHQucGF0aG5hbWUgfHwgcmVzdWx0LnNlYXJjaCkge1xuICAgICAgdmFyIHAgPSByZXN1bHQucGF0aG5hbWUgfHwgJyc7XG4gICAgICB2YXIgcyA9IHJlc3VsdC5zZWFyY2ggfHwgJyc7XG4gICAgICByZXN1bHQucGF0aCA9IHAgKyBzO1xuICAgIH1cbiAgICByZXN1bHQuc2xhc2hlcyA9IHJlc3VsdC5zbGFzaGVzIHx8IHJlbGF0aXZlLnNsYXNoZXM7XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHZhciBpc1NvdXJjZUFicyA9IChyZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nKSxcbiAgICAgIGlzUmVsQWJzID0gKFxuICAgICAgICAgIHJlbGF0aXZlLmhvc3QgfHxcbiAgICAgICAgICByZWxhdGl2ZS5wYXRobmFtZSAmJiByZWxhdGl2ZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJ1xuICAgICAgKSxcbiAgICAgIG11c3RFbmRBYnMgPSAoaXNSZWxBYnMgfHwgaXNTb3VyY2VBYnMgfHxcbiAgICAgICAgICAgICAgICAgICAgKHJlc3VsdC5ob3N0ICYmIHJlbGF0aXZlLnBhdGhuYW1lKSksXG4gICAgICByZW1vdmVBbGxEb3RzID0gbXVzdEVuZEFicyxcbiAgICAgIHNyY1BhdGggPSByZXN1bHQucGF0aG5hbWUgJiYgcmVzdWx0LnBhdGhuYW1lLnNwbGl0KCcvJykgfHwgW10sXG4gICAgICByZWxQYXRoID0gcmVsYXRpdmUucGF0aG5hbWUgJiYgcmVsYXRpdmUucGF0aG5hbWUuc3BsaXQoJy8nKSB8fCBbXSxcbiAgICAgIHBzeWNob3RpYyA9IHJlc3VsdC5wcm90b2NvbCAmJiAhc2xhc2hlZFByb3RvY29sW3Jlc3VsdC5wcm90b2NvbF07XG5cbiAgLy8gaWYgdGhlIHVybCBpcyBhIG5vbi1zbGFzaGVkIHVybCwgdGhlbiByZWxhdGl2ZVxuICAvLyBsaW5rcyBsaWtlIC4uLy4uIHNob3VsZCBiZSBhYmxlXG4gIC8vIHRvIGNyYXdsIHVwIHRvIHRoZSBob3N0bmFtZSwgYXMgd2VsbC4gIFRoaXMgaXMgc3RyYW5nZS5cbiAgLy8gcmVzdWx0LnByb3RvY29sIGhhcyBhbHJlYWR5IGJlZW4gc2V0IGJ5IG5vdy5cbiAgLy8gTGF0ZXIgb24sIHB1dCB0aGUgZmlyc3QgcGF0aCBwYXJ0IGludG8gdGhlIGhvc3QgZmllbGQuXG4gIGlmIChwc3ljaG90aWMpIHtcbiAgICByZXN1bHQuaG9zdG5hbWUgPSAnJztcbiAgICByZXN1bHQucG9ydCA9IG51bGw7XG4gICAgaWYgKHJlc3VsdC5ob3N0KSB7XG4gICAgICBpZiAoc3JjUGF0aFswXSA9PT0gJycpIHNyY1BhdGhbMF0gPSByZXN1bHQuaG9zdDtcbiAgICAgIGVsc2Ugc3JjUGF0aC51bnNoaWZ0KHJlc3VsdC5ob3N0KTtcbiAgICB9XG4gICAgcmVzdWx0Lmhvc3QgPSAnJztcbiAgICBpZiAocmVsYXRpdmUucHJvdG9jb2wpIHtcbiAgICAgIHJlbGF0aXZlLmhvc3RuYW1lID0gbnVsbDtcbiAgICAgIHJlbGF0aXZlLnBvcnQgPSBudWxsO1xuICAgICAgaWYgKHJlbGF0aXZlLmhvc3QpIHtcbiAgICAgICAgaWYgKHJlbFBhdGhbMF0gPT09ICcnKSByZWxQYXRoWzBdID0gcmVsYXRpdmUuaG9zdDtcbiAgICAgICAgZWxzZSByZWxQYXRoLnVuc2hpZnQocmVsYXRpdmUuaG9zdCk7XG4gICAgICB9XG4gICAgICByZWxhdGl2ZS5ob3N0ID0gbnVsbDtcbiAgICB9XG4gICAgbXVzdEVuZEFicyA9IG11c3RFbmRBYnMgJiYgKHJlbFBhdGhbMF0gPT09ICcnIHx8IHNyY1BhdGhbMF0gPT09ICcnKTtcbiAgfVxuXG4gIGlmIChpc1JlbEFicykge1xuICAgIC8vIGl0J3MgYWJzb2x1dGUuXG4gICAgcmVzdWx0Lmhvc3QgPSAocmVsYXRpdmUuaG9zdCB8fCByZWxhdGl2ZS5ob3N0ID09PSAnJykgP1xuICAgICAgICAgICAgICAgICAgcmVsYXRpdmUuaG9zdCA6IHJlc3VsdC5ob3N0O1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IChyZWxhdGl2ZS5ob3N0bmFtZSB8fCByZWxhdGl2ZS5ob3N0bmFtZSA9PT0gJycpID9cbiAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZS5ob3N0bmFtZSA6IHJlc3VsdC5ob3N0bmFtZTtcbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIHNyY1BhdGggPSByZWxQYXRoO1xuICAgIC8vIGZhbGwgdGhyb3VnaCB0byB0aGUgZG90LWhhbmRsaW5nIGJlbG93LlxuICB9IGVsc2UgaWYgKHJlbFBhdGgubGVuZ3RoKSB7XG4gICAgLy8gaXQncyByZWxhdGl2ZVxuICAgIC8vIHRocm93IGF3YXkgdGhlIGV4aXN0aW5nIGZpbGUsIGFuZCB0YWtlIHRoZSBuZXcgcGF0aCBpbnN0ZWFkLlxuICAgIGlmICghc3JjUGF0aCkgc3JjUGF0aCA9IFtdO1xuICAgIHNyY1BhdGgucG9wKCk7XG4gICAgc3JjUGF0aCA9IHNyY1BhdGguY29uY2F0KHJlbFBhdGgpO1xuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gIH0gZWxzZSBpZiAoIXV0aWwuaXNOdWxsT3JVbmRlZmluZWQocmVsYXRpdmUuc2VhcmNoKSkge1xuICAgIC8vIGp1c3QgcHVsbCBvdXQgdGhlIHNlYXJjaC5cbiAgICAvLyBsaWtlIGhyZWY9Jz9mb28nLlxuICAgIC8vIFB1dCB0aGlzIGFmdGVyIHRoZSBvdGhlciB0d28gY2FzZXMgYmVjYXVzZSBpdCBzaW1wbGlmaWVzIHRoZSBib29sZWFuc1xuICAgIGlmIChwc3ljaG90aWMpIHtcbiAgICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlc3VsdC5ob3N0ID0gc3JjUGF0aC5zaGlmdCgpO1xuICAgICAgLy9vY2NhdGlvbmFseSB0aGUgYXV0aCBjYW4gZ2V0IHN0dWNrIG9ubHkgaW4gaG9zdFxuICAgICAgLy90aGlzIGVzcGVjaWFsbHkgaGFwcGVucyBpbiBjYXNlcyBsaWtlXG4gICAgICAvL3VybC5yZXNvbHZlT2JqZWN0KCdtYWlsdG86bG9jYWwxQGRvbWFpbjEnLCAnbG9jYWwyQGRvbWFpbjInKVxuICAgICAgdmFyIGF1dGhJbkhvc3QgPSByZXN1bHQuaG9zdCAmJiByZXN1bHQuaG9zdC5pbmRleE9mKCdAJykgPiAwID9cbiAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhvc3Quc3BsaXQoJ0AnKSA6IGZhbHNlO1xuICAgICAgaWYgKGF1dGhJbkhvc3QpIHtcbiAgICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICAgIHJlc3VsdC5ob3N0ID0gcmVzdWx0Lmhvc3RuYW1lID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQuc2VhcmNoID0gcmVsYXRpdmUuc2VhcmNoO1xuICAgIHJlc3VsdC5xdWVyeSA9IHJlbGF0aXZlLnF1ZXJ5O1xuICAgIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAoIXV0aWwuaXNOdWxsKHJlc3VsdC5wYXRobmFtZSkgfHwgIXV0aWwuaXNOdWxsKHJlc3VsdC5zZWFyY2gpKSB7XG4gICAgICByZXN1bHQucGF0aCA9IChyZXN1bHQucGF0aG5hbWUgPyByZXN1bHQucGF0aG5hbWUgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gICAgfVxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAoIXNyY1BhdGgubGVuZ3RoKSB7XG4gICAgLy8gbm8gcGF0aCBhdCBhbGwuICBlYXN5LlxuICAgIC8vIHdlJ3ZlIGFscmVhZHkgaGFuZGxlZCB0aGUgb3RoZXIgc3R1ZmYgYWJvdmUuXG4gICAgcmVzdWx0LnBhdGhuYW1lID0gbnVsbDtcbiAgICAvL3RvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5zZWFyY2gpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gJy8nICsgcmVzdWx0LnNlYXJjaDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnBhdGggPSBudWxsO1xuICAgIH1cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gaWYgYSB1cmwgRU5EcyBpbiAuIG9yIC4uLCB0aGVuIGl0IG11c3QgZ2V0IGEgdHJhaWxpbmcgc2xhc2guXG4gIC8vIGhvd2V2ZXIsIGlmIGl0IGVuZHMgaW4gYW55dGhpbmcgZWxzZSBub24tc2xhc2h5LFxuICAvLyB0aGVuIGl0IG11c3QgTk9UIGdldCBhIHRyYWlsaW5nIHNsYXNoLlxuICB2YXIgbGFzdCA9IHNyY1BhdGguc2xpY2UoLTEpWzBdO1xuICB2YXIgaGFzVHJhaWxpbmdTbGFzaCA9IChcbiAgICAgIChyZXN1bHQuaG9zdCB8fCByZWxhdGl2ZS5ob3N0IHx8IHNyY1BhdGgubGVuZ3RoID4gMSkgJiZcbiAgICAgIChsYXN0ID09PSAnLicgfHwgbGFzdCA9PT0gJy4uJykgfHwgbGFzdCA9PT0gJycpO1xuXG4gIC8vIHN0cmlwIHNpbmdsZSBkb3RzLCByZXNvbHZlIGRvdWJsZSBkb3RzIHRvIHBhcmVudCBkaXJcbiAgLy8gaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgdmFyIHVwID0gMDtcbiAgZm9yICh2YXIgaSA9IHNyY1BhdGgubGVuZ3RoOyBpID49IDA7IGktLSkge1xuICAgIGxhc3QgPSBzcmNQYXRoW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgc3JjUGF0aC5zcGxpY2UoaSwgMSk7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXApIHtcbiAgICAgIHNyY1BhdGguc3BsaWNlKGksIDEpO1xuICAgICAgdXAtLTtcbiAgICB9XG4gIH1cblxuICAvLyBpZiB0aGUgcGF0aCBpcyBhbGxvd2VkIHRvIGdvIGFib3ZlIHRoZSByb290LCByZXN0b3JlIGxlYWRpbmcgLi5zXG4gIGlmICghbXVzdEVuZEFicyAmJiAhcmVtb3ZlQWxsRG90cykge1xuICAgIGZvciAoOyB1cC0tOyB1cCkge1xuICAgICAgc3JjUGF0aC51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChtdXN0RW5kQWJzICYmIHNyY1BhdGhbMF0gIT09ICcnICYmXG4gICAgICAoIXNyY1BhdGhbMF0gfHwgc3JjUGF0aFswXS5jaGFyQXQoMCkgIT09ICcvJykpIHtcbiAgICBzcmNQYXRoLnVuc2hpZnQoJycpO1xuICB9XG5cbiAgaWYgKGhhc1RyYWlsaW5nU2xhc2ggJiYgKHNyY1BhdGguam9pbignLycpLnN1YnN0cigtMSkgIT09ICcvJykpIHtcbiAgICBzcmNQYXRoLnB1c2goJycpO1xuICB9XG5cbiAgdmFyIGlzQWJzb2x1dGUgPSBzcmNQYXRoWzBdID09PSAnJyB8fFxuICAgICAgKHNyY1BhdGhbMF0gJiYgc3JjUGF0aFswXS5jaGFyQXQoMCkgPT09ICcvJyk7XG5cbiAgLy8gcHV0IHRoZSBob3N0IGJhY2tcbiAgaWYgKHBzeWNob3RpYykge1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlc3VsdC5ob3N0ID0gaXNBYnNvbHV0ZSA/ICcnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1BhdGgubGVuZ3RoID8gc3JjUGF0aC5zaGlmdCgpIDogJyc7XG4gICAgLy9vY2NhdGlvbmFseSB0aGUgYXV0aCBjYW4gZ2V0IHN0dWNrIG9ubHkgaW4gaG9zdFxuICAgIC8vdGhpcyBlc3BlY2lhbGx5IGhhcHBlbnMgaW4gY2FzZXMgbGlrZVxuICAgIC8vdXJsLnJlc29sdmVPYmplY3QoJ21haWx0bzpsb2NhbDFAZG9tYWluMScsICdsb2NhbDJAZG9tYWluMicpXG4gICAgdmFyIGF1dGhJbkhvc3QgPSByZXN1bHQuaG9zdCAmJiByZXN1bHQuaG9zdC5pbmRleE9mKCdAJykgPiAwID9cbiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ob3N0LnNwbGl0KCdAJykgOiBmYWxzZTtcbiAgICBpZiAoYXV0aEluSG9zdCkge1xuICAgICAgcmVzdWx0LmF1dGggPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICByZXN1bHQuaG9zdCA9IHJlc3VsdC5ob3N0bmFtZSA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICB9XG4gIH1cblxuICBtdXN0RW5kQWJzID0gbXVzdEVuZEFicyB8fCAocmVzdWx0Lmhvc3QgJiYgc3JjUGF0aC5sZW5ndGgpO1xuXG4gIGlmIChtdXN0RW5kQWJzICYmICFpc0Fic29sdXRlKSB7XG4gICAgc3JjUGF0aC51bnNoaWZ0KCcnKTtcbiAgfVxuXG4gIGlmICghc3JjUGF0aC5sZW5ndGgpIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBudWxsO1xuICAgIHJlc3VsdC5wYXRoID0gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQucGF0aG5hbWUgPSBzcmNQYXRoLmpvaW4oJy8nKTtcbiAgfVxuXG4gIC8vdG8gc3VwcG9ydCByZXF1ZXN0Lmh0dHBcbiAgaWYgKCF1dGlsLmlzTnVsbChyZXN1bHQucGF0aG5hbWUpIHx8ICF1dGlsLmlzTnVsbChyZXN1bHQuc2VhcmNoKSkge1xuICAgIHJlc3VsdC5wYXRoID0gKHJlc3VsdC5wYXRobmFtZSA/IHJlc3VsdC5wYXRobmFtZSA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAocmVzdWx0LnNlYXJjaCA/IHJlc3VsdC5zZWFyY2ggOiAnJyk7XG4gIH1cbiAgcmVzdWx0LmF1dGggPSByZWxhdGl2ZS5hdXRoIHx8IHJlc3VsdC5hdXRoO1xuICByZXN1bHQuc2xhc2hlcyA9IHJlc3VsdC5zbGFzaGVzIHx8IHJlbGF0aXZlLnNsYXNoZXM7XG4gIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuVXJsLnByb3RvdHlwZS5wYXJzZUhvc3QgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGhvc3QgPSB0aGlzLmhvc3Q7XG4gIHZhciBwb3J0ID0gcG9ydFBhdHRlcm4uZXhlYyhob3N0KTtcbiAgaWYgKHBvcnQpIHtcbiAgICBwb3J0ID0gcG9ydFswXTtcbiAgICBpZiAocG9ydCAhPT0gJzonKSB7XG4gICAgICB0aGlzLnBvcnQgPSBwb3J0LnN1YnN0cigxKTtcbiAgICB9XG4gICAgaG9zdCA9IGhvc3Quc3Vic3RyKDAsIGhvc3QubGVuZ3RoIC0gcG9ydC5sZW5ndGgpO1xuICB9XG4gIGlmIChob3N0KSB0aGlzLmhvc3RuYW1lID0gaG9zdDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc1N0cmluZzogZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHR5cGVvZihhcmcpID09PSAnc3RyaW5nJztcbiAgfSxcbiAgaXNPYmplY3Q6IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB0eXBlb2YoYXJnKSA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xuICB9LFxuICBpc051bGw6IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBhcmcgPT09IG51bGw7XG4gIH0sXG4gIGlzTnVsbE9yVW5kZWZpbmVkOiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gYXJnID09IG51bGw7XG4gIH1cbn07XG4iLCIvKiEgaHR0cHM6Ly9tdGhzLmJlL3V0ZjhqcyB2Mi4xLjIgYnkgQG1hdGhpYXMgKi9cbjsoZnVuY3Rpb24ocm9vdCkge1xuXG5cdC8vIERldGVjdCBmcmVlIHZhcmlhYmxlcyBgZXhwb3J0c2Bcblx0dmFyIGZyZWVFeHBvcnRzID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgJiYgZXhwb3J0cztcblxuXHQvLyBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYFxuXHR2YXIgZnJlZU1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmXG5cdFx0bW9kdWxlLmV4cG9ydHMgPT0gZnJlZUV4cG9ydHMgJiYgbW9kdWxlO1xuXG5cdC8vIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgLCBmcm9tIE5vZGUuanMgb3IgQnJvd3NlcmlmaWVkIGNvZGUsXG5cdC8vIGFuZCB1c2UgaXQgYXMgYHJvb3RgXG5cdHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWw7XG5cdGlmIChmcmVlR2xvYmFsLmdsb2JhbCA9PT0gZnJlZUdsb2JhbCB8fCBmcmVlR2xvYmFsLndpbmRvdyA9PT0gZnJlZUdsb2JhbCkge1xuXHRcdHJvb3QgPSBmcmVlR2xvYmFsO1xuXHR9XG5cblx0LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0dmFyIHN0cmluZ0Zyb21DaGFyQ29kZSA9IFN0cmluZy5mcm9tQ2hhckNvZGU7XG5cblx0Ly8gVGFrZW4gZnJvbSBodHRwczovL210aHMuYmUvcHVueWNvZGVcblx0ZnVuY3Rpb24gdWNzMmRlY29kZShzdHJpbmcpIHtcblx0XHR2YXIgb3V0cHV0ID0gW107XG5cdFx0dmFyIGNvdW50ZXIgPSAwO1xuXHRcdHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuXHRcdHZhciB2YWx1ZTtcblx0XHR2YXIgZXh0cmE7XG5cdFx0d2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcblx0XHRcdHZhbHVlID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRcdGlmICh2YWx1ZSA+PSAweEQ4MDAgJiYgdmFsdWUgPD0gMHhEQkZGICYmIGNvdW50ZXIgPCBsZW5ndGgpIHtcblx0XHRcdFx0Ly8gaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyXG5cdFx0XHRcdGV4dHJhID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRcdFx0aWYgKChleHRyYSAmIDB4RkMwMCkgPT0gMHhEQzAwKSB7IC8vIGxvdyBzdXJyb2dhdGVcblx0XHRcdFx0XHRvdXRwdXQucHVzaCgoKHZhbHVlICYgMHgzRkYpIDw8IDEwKSArIChleHRyYSAmIDB4M0ZGKSArIDB4MTAwMDApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHVubWF0Y2hlZCBzdXJyb2dhdGU7IG9ubHkgYXBwZW5kIHRoaXMgY29kZSB1bml0LCBpbiBjYXNlIHRoZSBuZXh0XG5cdFx0XHRcdFx0Ly8gY29kZSB1bml0IGlzIHRoZSBoaWdoIHN1cnJvZ2F0ZSBvZiBhIHN1cnJvZ2F0ZSBwYWlyXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2godmFsdWUpO1xuXHRcdFx0XHRcdGNvdW50ZXItLTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3V0cHV0LnB1c2godmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb3V0cHV0O1xuXHR9XG5cblx0Ly8gVGFrZW4gZnJvbSBodHRwczovL210aHMuYmUvcHVueWNvZGVcblx0ZnVuY3Rpb24gdWNzMmVuY29kZShhcnJheSkge1xuXHRcdHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cdFx0dmFyIGluZGV4ID0gLTE7XG5cdFx0dmFyIHZhbHVlO1xuXHRcdHZhciBvdXRwdXQgPSAnJztcblx0XHR3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuXHRcdFx0dmFsdWUgPSBhcnJheVtpbmRleF07XG5cdFx0XHRpZiAodmFsdWUgPiAweEZGRkYpIHtcblx0XHRcdFx0dmFsdWUgLT0gMHgxMDAwMDtcblx0XHRcdFx0b3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG5cdFx0XHRcdHZhbHVlID0gMHhEQzAwIHwgdmFsdWUgJiAweDNGRjtcblx0XHRcdH1cblx0XHRcdG91dHB1dCArPSBzdHJpbmdGcm9tQ2hhckNvZGUodmFsdWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gb3V0cHV0O1xuXHR9XG5cblx0ZnVuY3Rpb24gY2hlY2tTY2FsYXJWYWx1ZShjb2RlUG9pbnQpIHtcblx0XHRpZiAoY29kZVBvaW50ID49IDB4RDgwMCAmJiBjb2RlUG9pbnQgPD0gMHhERkZGKSB7XG5cdFx0XHR0aHJvdyBFcnJvcihcblx0XHRcdFx0J0xvbmUgc3Vycm9nYXRlIFUrJyArIGNvZGVQb2ludC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArXG5cdFx0XHRcdCcgaXMgbm90IGEgc2NhbGFyIHZhbHVlJ1xuXHRcdFx0KTtcblx0XHR9XG5cdH1cblx0LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0ZnVuY3Rpb24gY3JlYXRlQnl0ZShjb2RlUG9pbnQsIHNoaWZ0KSB7XG5cdFx0cmV0dXJuIHN0cmluZ0Zyb21DaGFyQ29kZSgoKGNvZGVQb2ludCA+PiBzaGlmdCkgJiAweDNGKSB8IDB4ODApO1xuXHR9XG5cblx0ZnVuY3Rpb24gZW5jb2RlQ29kZVBvaW50KGNvZGVQb2ludCkge1xuXHRcdGlmICgoY29kZVBvaW50ICYgMHhGRkZGRkY4MCkgPT0gMCkgeyAvLyAxLWJ5dGUgc2VxdWVuY2Vcblx0XHRcdHJldHVybiBzdHJpbmdGcm9tQ2hhckNvZGUoY29kZVBvaW50KTtcblx0XHR9XG5cdFx0dmFyIHN5bWJvbCA9ICcnO1xuXHRcdGlmICgoY29kZVBvaW50ICYgMHhGRkZGRjgwMCkgPT0gMCkgeyAvLyAyLWJ5dGUgc2VxdWVuY2Vcblx0XHRcdHN5bWJvbCA9IHN0cmluZ0Zyb21DaGFyQ29kZSgoKGNvZGVQb2ludCA+PiA2KSAmIDB4MUYpIHwgMHhDMCk7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKChjb2RlUG9pbnQgJiAweEZGRkYwMDAwKSA9PSAwKSB7IC8vIDMtYnl0ZSBzZXF1ZW5jZVxuXHRcdFx0Y2hlY2tTY2FsYXJWYWx1ZShjb2RlUG9pbnQpO1xuXHRcdFx0c3ltYm9sID0gc3RyaW5nRnJvbUNoYXJDb2RlKCgoY29kZVBvaW50ID4+IDEyKSAmIDB4MEYpIHwgMHhFMCk7XG5cdFx0XHRzeW1ib2wgKz0gY3JlYXRlQnl0ZShjb2RlUG9pbnQsIDYpO1xuXHRcdH1cblx0XHRlbHNlIGlmICgoY29kZVBvaW50ICYgMHhGRkUwMDAwMCkgPT0gMCkgeyAvLyA0LWJ5dGUgc2VxdWVuY2Vcblx0XHRcdHN5bWJvbCA9IHN0cmluZ0Zyb21DaGFyQ29kZSgoKGNvZGVQb2ludCA+PiAxOCkgJiAweDA3KSB8IDB4RjApO1xuXHRcdFx0c3ltYm9sICs9IGNyZWF0ZUJ5dGUoY29kZVBvaW50LCAxMik7XG5cdFx0XHRzeW1ib2wgKz0gY3JlYXRlQnl0ZShjb2RlUG9pbnQsIDYpO1xuXHRcdH1cblx0XHRzeW1ib2wgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKChjb2RlUG9pbnQgJiAweDNGKSB8IDB4ODApO1xuXHRcdHJldHVybiBzeW1ib2w7XG5cdH1cblxuXHRmdW5jdGlvbiB1dGY4ZW5jb2RlKHN0cmluZykge1xuXHRcdHZhciBjb2RlUG9pbnRzID0gdWNzMmRlY29kZShzdHJpbmcpO1xuXHRcdHZhciBsZW5ndGggPSBjb2RlUG9pbnRzLmxlbmd0aDtcblx0XHR2YXIgaW5kZXggPSAtMTtcblx0XHR2YXIgY29kZVBvaW50O1xuXHRcdHZhciBieXRlU3RyaW5nID0gJyc7XG5cdFx0d2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcblx0XHRcdGNvZGVQb2ludCA9IGNvZGVQb2ludHNbaW5kZXhdO1xuXHRcdFx0Ynl0ZVN0cmluZyArPSBlbmNvZGVDb2RlUG9pbnQoY29kZVBvaW50KTtcblx0XHR9XG5cdFx0cmV0dXJuIGJ5dGVTdHJpbmc7XG5cdH1cblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHRmdW5jdGlvbiByZWFkQ29udGludWF0aW9uQnl0ZSgpIHtcblx0XHRpZiAoYnl0ZUluZGV4ID49IGJ5dGVDb3VudCkge1xuXHRcdFx0dGhyb3cgRXJyb3IoJ0ludmFsaWQgYnl0ZSBpbmRleCcpO1xuXHRcdH1cblxuXHRcdHZhciBjb250aW51YXRpb25CeXRlID0gYnl0ZUFycmF5W2J5dGVJbmRleF0gJiAweEZGO1xuXHRcdGJ5dGVJbmRleCsrO1xuXG5cdFx0aWYgKChjb250aW51YXRpb25CeXRlICYgMHhDMCkgPT0gMHg4MCkge1xuXHRcdFx0cmV0dXJuIGNvbnRpbnVhdGlvbkJ5dGUgJiAweDNGO1xuXHRcdH1cblxuXHRcdC8vIElmIHdlIGVuZCB1cCBoZXJlLCBpdOKAmXMgbm90IGEgY29udGludWF0aW9uIGJ5dGVcblx0XHR0aHJvdyBFcnJvcignSW52YWxpZCBjb250aW51YXRpb24gYnl0ZScpO1xuXHR9XG5cblx0ZnVuY3Rpb24gZGVjb2RlU3ltYm9sKCkge1xuXHRcdHZhciBieXRlMTtcblx0XHR2YXIgYnl0ZTI7XG5cdFx0dmFyIGJ5dGUzO1xuXHRcdHZhciBieXRlNDtcblx0XHR2YXIgY29kZVBvaW50O1xuXG5cdFx0aWYgKGJ5dGVJbmRleCA+IGJ5dGVDb3VudCkge1xuXHRcdFx0dGhyb3cgRXJyb3IoJ0ludmFsaWQgYnl0ZSBpbmRleCcpO1xuXHRcdH1cblxuXHRcdGlmIChieXRlSW5kZXggPT0gYnl0ZUNvdW50KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gUmVhZCBmaXJzdCBieXRlXG5cdFx0Ynl0ZTEgPSBieXRlQXJyYXlbYnl0ZUluZGV4XSAmIDB4RkY7XG5cdFx0Ynl0ZUluZGV4Kys7XG5cblx0XHQvLyAxLWJ5dGUgc2VxdWVuY2UgKG5vIGNvbnRpbnVhdGlvbiBieXRlcylcblx0XHRpZiAoKGJ5dGUxICYgMHg4MCkgPT0gMCkge1xuXHRcdFx0cmV0dXJuIGJ5dGUxO1xuXHRcdH1cblxuXHRcdC8vIDItYnl0ZSBzZXF1ZW5jZVxuXHRcdGlmICgoYnl0ZTEgJiAweEUwKSA9PSAweEMwKSB7XG5cdFx0XHRieXRlMiA9IHJlYWRDb250aW51YXRpb25CeXRlKCk7XG5cdFx0XHRjb2RlUG9pbnQgPSAoKGJ5dGUxICYgMHgxRikgPDwgNikgfCBieXRlMjtcblx0XHRcdGlmIChjb2RlUG9pbnQgPj0gMHg4MCkge1xuXHRcdFx0XHRyZXR1cm4gY29kZVBvaW50O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgRXJyb3IoJ0ludmFsaWQgY29udGludWF0aW9uIGJ5dGUnKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyAzLWJ5dGUgc2VxdWVuY2UgKG1heSBpbmNsdWRlIHVucGFpcmVkIHN1cnJvZ2F0ZXMpXG5cdFx0aWYgKChieXRlMSAmIDB4RjApID09IDB4RTApIHtcblx0XHRcdGJ5dGUyID0gcmVhZENvbnRpbnVhdGlvbkJ5dGUoKTtcblx0XHRcdGJ5dGUzID0gcmVhZENvbnRpbnVhdGlvbkJ5dGUoKTtcblx0XHRcdGNvZGVQb2ludCA9ICgoYnl0ZTEgJiAweDBGKSA8PCAxMikgfCAoYnl0ZTIgPDwgNikgfCBieXRlMztcblx0XHRcdGlmIChjb2RlUG9pbnQgPj0gMHgwODAwKSB7XG5cdFx0XHRcdGNoZWNrU2NhbGFyVmFsdWUoY29kZVBvaW50KTtcblx0XHRcdFx0cmV0dXJuIGNvZGVQb2ludDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IEVycm9yKCdJbnZhbGlkIGNvbnRpbnVhdGlvbiBieXRlJyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gNC1ieXRlIHNlcXVlbmNlXG5cdFx0aWYgKChieXRlMSAmIDB4RjgpID09IDB4RjApIHtcblx0XHRcdGJ5dGUyID0gcmVhZENvbnRpbnVhdGlvbkJ5dGUoKTtcblx0XHRcdGJ5dGUzID0gcmVhZENvbnRpbnVhdGlvbkJ5dGUoKTtcblx0XHRcdGJ5dGU0ID0gcmVhZENvbnRpbnVhdGlvbkJ5dGUoKTtcblx0XHRcdGNvZGVQb2ludCA9ICgoYnl0ZTEgJiAweDA3KSA8PCAweDEyKSB8IChieXRlMiA8PCAweDBDKSB8XG5cdFx0XHRcdChieXRlMyA8PCAweDA2KSB8IGJ5dGU0O1xuXHRcdFx0aWYgKGNvZGVQb2ludCA+PSAweDAxMDAwMCAmJiBjb2RlUG9pbnQgPD0gMHgxMEZGRkYpIHtcblx0XHRcdFx0cmV0dXJuIGNvZGVQb2ludDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aHJvdyBFcnJvcignSW52YWxpZCBVVEYtOCBkZXRlY3RlZCcpO1xuXHR9XG5cblx0dmFyIGJ5dGVBcnJheTtcblx0dmFyIGJ5dGVDb3VudDtcblx0dmFyIGJ5dGVJbmRleDtcblx0ZnVuY3Rpb24gdXRmOGRlY29kZShieXRlU3RyaW5nKSB7XG5cdFx0Ynl0ZUFycmF5ID0gdWNzMmRlY29kZShieXRlU3RyaW5nKTtcblx0XHRieXRlQ291bnQgPSBieXRlQXJyYXkubGVuZ3RoO1xuXHRcdGJ5dGVJbmRleCA9IDA7XG5cdFx0dmFyIGNvZGVQb2ludHMgPSBbXTtcblx0XHR2YXIgdG1wO1xuXHRcdHdoaWxlICgodG1wID0gZGVjb2RlU3ltYm9sKCkpICE9PSBmYWxzZSkge1xuXHRcdFx0Y29kZVBvaW50cy5wdXNoKHRtcCk7XG5cdFx0fVxuXHRcdHJldHVybiB1Y3MyZW5jb2RlKGNvZGVQb2ludHMpO1xuXHR9XG5cblx0LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0dmFyIHV0ZjggPSB7XG5cdFx0J3ZlcnNpb24nOiAnMi4xLjInLFxuXHRcdCdlbmNvZGUnOiB1dGY4ZW5jb2RlLFxuXHRcdCdkZWNvZGUnOiB1dGY4ZGVjb2RlXG5cdH07XG5cblx0Ly8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3Igc3BlY2lmaWMgY29uZGl0aW9uIHBhdHRlcm5zXG5cdC8vIGxpa2UgdGhlIGZvbGxvd2luZzpcblx0aWYgKFxuXHRcdHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBkZWZpbmUuYW1kID09ICdvYmplY3QnICYmXG5cdFx0ZGVmaW5lLmFtZFxuXHQpIHtcblx0XHRkZWZpbmUoZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gdXRmODtcblx0XHR9KTtcblx0fVx0ZWxzZSBpZiAoZnJlZUV4cG9ydHMgJiYgIWZyZWVFeHBvcnRzLm5vZGVUeXBlKSB7XG5cdFx0aWYgKGZyZWVNb2R1bGUpIHsgLy8gaW4gTm9kZS5qcyBvciBSaW5nb0pTIHYwLjguMCtcblx0XHRcdGZyZWVNb2R1bGUuZXhwb3J0cyA9IHV0Zjg7XG5cdFx0fSBlbHNlIHsgLy8gaW4gTmFyd2hhbCBvciBSaW5nb0pTIHYwLjcuMC1cblx0XHRcdHZhciBvYmplY3QgPSB7fTtcblx0XHRcdHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdC5oYXNPd25Qcm9wZXJ0eTtcblx0XHRcdGZvciAodmFyIGtleSBpbiB1dGY4KSB7XG5cdFx0XHRcdGhhc093blByb3BlcnR5LmNhbGwodXRmOCwga2V5KSAmJiAoZnJlZUV4cG9ydHNba2V5XSA9IHV0Zjhba2V5XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgeyAvLyBpbiBSaGlubyBvciBhIHdlYiBicm93c2VyXG5cdFx0cm9vdC51dGY4ID0gdXRmODtcblx0fVxuXG59KHRoaXMpKTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBTaW1pbGFyIHRvIGludmFyaWFudCBidXQgb25seSBsb2dzIGEgd2FybmluZyBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCBtZXQuXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGxvZyBpc3N1ZXMgaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIGluIGNyaXRpY2FsXG4gKiBwYXRocy4gUmVtb3ZpbmcgdGhlIGxvZ2dpbmcgY29kZSBmb3IgcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMgd2lsbCBrZWVwIHRoZVxuICogc2FtZSBsb2dpYyBhbmQgZm9sbG93IHRoZSBzYW1lIGNvZGUgcGF0aHMuXG4gKi9cblxudmFyIHdhcm5pbmcgPSBmdW5jdGlvbigpIHt9O1xuXG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgd2FybmluZyA9IGZ1bmN0aW9uKGNvbmRpdGlvbiwgZm9ybWF0LCBhcmdzKSB7XG4gICAgdmFyIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gPiAyID8gbGVuIC0gMiA6IDApO1xuICAgIGZvciAodmFyIGtleSA9IDI7IGtleSA8IGxlbjsga2V5KyspIHtcbiAgICAgIGFyZ3Nba2V5IC0gMl0gPSBhcmd1bWVudHNba2V5XTtcbiAgICB9XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdgd2FybmluZyhjb25kaXRpb24sIGZvcm1hdCwgLi4uYXJncylgIHJlcXVpcmVzIGEgd2FybmluZyAnICtcbiAgICAgICAgJ21lc3NhZ2UgYXJndW1lbnQnXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChmb3JtYXQubGVuZ3RoIDwgMTAgfHwgKC9eW3NcXFddKiQvKS50ZXN0KGZvcm1hdCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSB3YXJuaW5nIGZvcm1hdCBzaG91bGQgYmUgYWJsZSB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzICcgK1xuICAgICAgICAnd2FybmluZy4gUGxlYXNlLCB1c2UgYSBtb3JlIGRlc2NyaXB0aXZlIGZvcm1hdCB0aGFuOiAnICsgZm9ybWF0XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgdmFyIG1lc3NhZ2UgPSAnV2FybmluZzogJyArXG4gICAgICAgIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgICAgfSk7XG4gICAgICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIH0gY2F0Y2goeCkge31cbiAgICB9XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gd2FybmluZztcbiIsInZhciBidW5kbGVGbiA9IGFyZ3VtZW50c1szXTtcbnZhciBzb3VyY2VzID0gYXJndW1lbnRzWzRdO1xudmFyIGNhY2hlID0gYXJndW1lbnRzWzVdO1xuXG52YXIgc3RyaW5naWZ5ID0gSlNPTi5zdHJpbmdpZnk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCBvcHRpb25zKSB7XG4gICAgdmFyIHdrZXk7XG4gICAgdmFyIGNhY2hlS2V5cyA9IE9iamVjdC5rZXlzKGNhY2hlKTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2FjaGVLZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB2YXIga2V5ID0gY2FjaGVLZXlzW2ldO1xuICAgICAgICB2YXIgZXhwID0gY2FjaGVba2V5XS5leHBvcnRzO1xuICAgICAgICAvLyBVc2luZyBiYWJlbCBhcyBhIHRyYW5zcGlsZXIgdG8gdXNlIGVzbW9kdWxlLCB0aGUgZXhwb3J0IHdpbGwgYWx3YXlzXG4gICAgICAgIC8vIGJlIGFuIG9iamVjdCB3aXRoIHRoZSBkZWZhdWx0IGV4cG9ydCBhcyBhIHByb3BlcnR5IG9mIGl0LiBUbyBlbnN1cmVcbiAgICAgICAgLy8gdGhlIGV4aXN0aW5nIGFwaSBhbmQgYmFiZWwgZXNtb2R1bGUgZXhwb3J0cyBhcmUgYm90aCBzdXBwb3J0ZWQgd2VcbiAgICAgICAgLy8gY2hlY2sgZm9yIGJvdGhcbiAgICAgICAgaWYgKGV4cCA9PT0gZm4gfHwgZXhwICYmIGV4cC5kZWZhdWx0ID09PSBmbikge1xuICAgICAgICAgICAgd2tleSA9IGtleTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF3a2V5KSB7XG4gICAgICAgIHdrZXkgPSBNYXRoLmZsb29yKE1hdGgucG93KDE2LCA4KSAqIE1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgdmFyIHdjYWNoZSA9IHt9O1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNhY2hlS2V5cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBrZXkgPSBjYWNoZUtleXNbaV07XG4gICAgICAgICAgICB3Y2FjaGVba2V5XSA9IGtleTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2VzW3drZXldID0gW1xuICAgICAgICAgICAgRnVuY3Rpb24oWydyZXF1aXJlJywnbW9kdWxlJywnZXhwb3J0cyddLCAnKCcgKyBmbiArICcpKHNlbGYpJyksXG4gICAgICAgICAgICB3Y2FjaGVcbiAgICAgICAgXTtcbiAgICB9XG4gICAgdmFyIHNrZXkgPSBNYXRoLmZsb29yKE1hdGgucG93KDE2LCA4KSAqIE1hdGgucmFuZG9tKCkpLnRvU3RyaW5nKDE2KTtcblxuICAgIHZhciBzY2FjaGUgPSB7fTsgc2NhY2hlW3drZXldID0gd2tleTtcbiAgICBzb3VyY2VzW3NrZXldID0gW1xuICAgICAgICBGdW5jdGlvbihbJ3JlcXVpcmUnXSwgKFxuICAgICAgICAgICAgLy8gdHJ5IHRvIGNhbGwgZGVmYXVsdCBpZiBkZWZpbmVkIHRvIGFsc28gc3VwcG9ydCBiYWJlbCBlc21vZHVsZVxuICAgICAgICAgICAgLy8gZXhwb3J0c1xuICAgICAgICAgICAgJ3ZhciBmID0gcmVxdWlyZSgnICsgc3RyaW5naWZ5KHdrZXkpICsgJyk7JyArXG4gICAgICAgICAgICAnKGYuZGVmYXVsdCA/IGYuZGVmYXVsdCA6IGYpKHNlbGYpOydcbiAgICAgICAgKSksXG4gICAgICAgIHNjYWNoZVxuICAgIF07XG5cbiAgICB2YXIgd29ya2VyU291cmNlcyA9IHt9O1xuICAgIHJlc29sdmVTb3VyY2VzKHNrZXkpO1xuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZVNvdXJjZXMoa2V5KSB7XG4gICAgICAgIHdvcmtlclNvdXJjZXNba2V5XSA9IHRydWU7XG5cbiAgICAgICAgZm9yICh2YXIgZGVwUGF0aCBpbiBzb3VyY2VzW2tleV1bMV0pIHtcbiAgICAgICAgICAgIHZhciBkZXBLZXkgPSBzb3VyY2VzW2tleV1bMV1bZGVwUGF0aF07XG4gICAgICAgICAgICBpZiAoIXdvcmtlclNvdXJjZXNbZGVwS2V5XSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmVTb3VyY2VzKGRlcEtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc3JjID0gJygnICsgYnVuZGxlRm4gKyAnKSh7J1xuICAgICAgICArIE9iamVjdC5rZXlzKHdvcmtlclNvdXJjZXMpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5naWZ5KGtleSkgKyAnOlsnXG4gICAgICAgICAgICAgICAgKyBzb3VyY2VzW2tleV1bMF1cbiAgICAgICAgICAgICAgICArICcsJyArIHN0cmluZ2lmeShzb3VyY2VzW2tleV1bMV0pICsgJ10nXG4gICAgICAgICAgICA7XG4gICAgICAgIH0pLmpvaW4oJywnKVxuICAgICAgICArICd9LHt9LFsnICsgc3RyaW5naWZ5KHNrZXkpICsgJ10pJ1xuICAgIDtcblxuICAgIHZhciBVUkwgPSB3aW5kb3cuVVJMIHx8IHdpbmRvdy53ZWJraXRVUkwgfHwgd2luZG93Lm1velVSTCB8fCB3aW5kb3cubXNVUkw7XG5cbiAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtzcmNdLCB7IHR5cGU6ICd0ZXh0L2phdmFzY3JpcHQnIH0pO1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYmFyZSkgeyByZXR1cm4gYmxvYjsgfVxuICAgIHZhciB3b3JrZXJVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyKHdvcmtlclVybCk7XG4gICAgd29ya2VyLm9iamVjdFVSTCA9IHdvcmtlclVybDtcbiAgICByZXR1cm4gd29ya2VyO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DSEFSU0VUUyA9IHt9O1xuZXhwb3J0cy5ERUZBVUxUX0NIQVJTRVQgPSBleHBvcnRzLkNIQVJTRVRTWydCJ107XG5leHBvcnRzLkNIQVJTRVRTWycwJ10gPSB7XG4gICAgJ2AnOiAnXFx1MjVjNicsXG4gICAgJ2EnOiAnXFx1MjU5MicsXG4gICAgJ2InOiAnXFx1MDAwOScsXG4gICAgJ2MnOiAnXFx1MDAwYycsXG4gICAgJ2QnOiAnXFx1MDAwZCcsXG4gICAgJ2UnOiAnXFx1MDAwYScsXG4gICAgJ2YnOiAnXFx1MDBiMCcsXG4gICAgJ2cnOiAnXFx1MDBiMScsXG4gICAgJ2gnOiAnXFx1MjQyNCcsXG4gICAgJ2knOiAnXFx1MDAwYicsXG4gICAgJ2onOiAnXFx1MjUxOCcsXG4gICAgJ2snOiAnXFx1MjUxMCcsXG4gICAgJ2wnOiAnXFx1MjUwYycsXG4gICAgJ20nOiAnXFx1MjUxNCcsXG4gICAgJ24nOiAnXFx1MjUzYycsXG4gICAgJ28nOiAnXFx1MjNiYScsXG4gICAgJ3AnOiAnXFx1MjNiYicsXG4gICAgJ3EnOiAnXFx1MjUwMCcsXG4gICAgJ3InOiAnXFx1MjNiYycsXG4gICAgJ3MnOiAnXFx1MjNiZCcsXG4gICAgJ3QnOiAnXFx1MjUxYycsXG4gICAgJ3UnOiAnXFx1MjUyNCcsXG4gICAgJ3YnOiAnXFx1MjUzNCcsXG4gICAgJ3cnOiAnXFx1MjUyYycsXG4gICAgJ3gnOiAnXFx1MjUwMicsXG4gICAgJ3knOiAnXFx1MjI2NCcsXG4gICAgJ3onOiAnXFx1MjI2NScsXG4gICAgJ3snOiAnXFx1MDNjMCcsXG4gICAgJ3wnOiAnXFx1MjI2MCcsXG4gICAgJ30nOiAnXFx1MDBhMycsXG4gICAgJ34nOiAnXFx1MDBiNydcbn07XG5leHBvcnRzLkNIQVJTRVRTWydBJ10gPSB7XG4gICAgJyMnOiAnwqMnXG59O1xuZXhwb3J0cy5DSEFSU0VUU1snQiddID0gbnVsbDtcbmV4cG9ydHMuQ0hBUlNFVFNbJzQnXSA9IHtcbiAgICAnIyc6ICfCoycsXG4gICAgJ0AnOiAnwr4nLFxuICAgICdbJzogJ2lqJyxcbiAgICAnXFxcXCc6ICfCvScsXG4gICAgJ10nOiAnfCcsXG4gICAgJ3snOiAnwqgnLFxuICAgICd8JzogJ2YnLFxuICAgICd9JzogJ8K8JyxcbiAgICAnfic6ICfCtCdcbn07XG5leHBvcnRzLkNIQVJTRVRTWydDJ10gPVxuICAgIGV4cG9ydHMuQ0hBUlNFVFNbJzUnXSA9IHtcbiAgICAgICAgJ1snOiAnw4QnLFxuICAgICAgICAnXFxcXCc6ICfDlicsXG4gICAgICAgICddJzogJ8OFJyxcbiAgICAgICAgJ14nOiAnw5wnLFxuICAgICAgICAnYCc6ICfDqScsXG4gICAgICAgICd7JzogJ8OkJyxcbiAgICAgICAgJ3wnOiAnw7YnLFxuICAgICAgICAnfSc6ICfDpScsXG4gICAgICAgICd+JzogJ8O8J1xuICAgIH07XG5leHBvcnRzLkNIQVJTRVRTWydSJ10gPSB7XG4gICAgJyMnOiAnwqMnLFxuICAgICdAJzogJ8OgJyxcbiAgICAnWyc6ICfCsCcsXG4gICAgJ1xcXFwnOiAnw6cnLFxuICAgICddJzogJ8KnJyxcbiAgICAneyc6ICfDqScsXG4gICAgJ3wnOiAnw7knLFxuICAgICd9JzogJ8OoJyxcbiAgICAnfic6ICfCqCdcbn07XG5leHBvcnRzLkNIQVJTRVRTWydRJ10gPSB7XG4gICAgJ0AnOiAnw6AnLFxuICAgICdbJzogJ8OiJyxcbiAgICAnXFxcXCc6ICfDpycsXG4gICAgJ10nOiAnw6onLFxuICAgICdeJzogJ8OuJyxcbiAgICAnYCc6ICfDtCcsXG4gICAgJ3snOiAnw6knLFxuICAgICd8JzogJ8O5JyxcbiAgICAnfSc6ICfDqCcsXG4gICAgJ34nOiAnw7snXG59O1xuZXhwb3J0cy5DSEFSU0VUU1snSyddID0ge1xuICAgICdAJzogJ8KnJyxcbiAgICAnWyc6ICfDhCcsXG4gICAgJ1xcXFwnOiAnw5YnLFxuICAgICddJzogJ8OcJyxcbiAgICAneyc6ICfDpCcsXG4gICAgJ3wnOiAnw7YnLFxuICAgICd9JzogJ8O8JyxcbiAgICAnfic6ICfDnydcbn07XG5leHBvcnRzLkNIQVJTRVRTWydZJ10gPSB7XG4gICAgJyMnOiAnwqMnLFxuICAgICdAJzogJ8KnJyxcbiAgICAnWyc6ICfCsCcsXG4gICAgJ1xcXFwnOiAnw6cnLFxuICAgICddJzogJ8OpJyxcbiAgICAnYCc6ICfDuScsXG4gICAgJ3snOiAnw6AnLFxuICAgICd8JzogJ8OyJyxcbiAgICAnfSc6ICfDqCcsXG4gICAgJ34nOiAnw6wnXG59O1xuZXhwb3J0cy5DSEFSU0VUU1snRSddID1cbiAgICBleHBvcnRzLkNIQVJTRVRTWyc2J10gPSB7XG4gICAgICAgICdAJzogJ8OEJyxcbiAgICAgICAgJ1snOiAnw4YnLFxuICAgICAgICAnXFxcXCc6ICfDmCcsXG4gICAgICAgICddJzogJ8OFJyxcbiAgICAgICAgJ14nOiAnw5wnLFxuICAgICAgICAnYCc6ICfDpCcsXG4gICAgICAgICd7JzogJ8OmJyxcbiAgICAgICAgJ3wnOiAnw7gnLFxuICAgICAgICAnfSc6ICfDpScsXG4gICAgICAgICd+JzogJ8O8J1xuICAgIH07XG5leHBvcnRzLkNIQVJTRVRTWydaJ10gPSB7XG4gICAgJyMnOiAnwqMnLFxuICAgICdAJzogJ8KnJyxcbiAgICAnWyc6ICfCoScsXG4gICAgJ1xcXFwnOiAnw5EnLFxuICAgICddJzogJ8K/JyxcbiAgICAneyc6ICfCsCcsXG4gICAgJ3wnOiAnw7EnLFxuICAgICd9JzogJ8OnJ1xufTtcbmV4cG9ydHMuQ0hBUlNFVFNbJ0gnXSA9XG4gICAgZXhwb3J0cy5DSEFSU0VUU1snNyddID0ge1xuICAgICAgICAnQCc6ICfDiScsXG4gICAgICAgICdbJzogJ8OEJyxcbiAgICAgICAgJ1xcXFwnOiAnw5YnLFxuICAgICAgICAnXSc6ICfDhScsXG4gICAgICAgICdeJzogJ8OcJyxcbiAgICAgICAgJ2AnOiAnw6knLFxuICAgICAgICAneyc6ICfDpCcsXG4gICAgICAgICd8JzogJ8O2JyxcbiAgICAgICAgJ30nOiAnw6UnLFxuICAgICAgICAnfic6ICfDvCdcbiAgICB9O1xuZXhwb3J0cy5DSEFSU0VUU1snPSddID0ge1xuICAgICcjJzogJ8O5JyxcbiAgICAnQCc6ICfDoCcsXG4gICAgJ1snOiAnw6knLFxuICAgICdcXFxcJzogJ8OnJyxcbiAgICAnXSc6ICfDqicsXG4gICAgJ14nOiAnw64nLFxuICAgICdfJzogJ8OoJyxcbiAgICAnYCc6ICfDtCcsXG4gICAgJ3snOiAnw6QnLFxuICAgICd8JzogJ8O2JyxcbiAgICAnfSc6ICfDvCcsXG4gICAgJ34nOiAnw7snXG59O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGFyc2V0cy5qcy5tYXBcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIENvbXBvc2l0aW9uSGVscGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDb21wb3NpdGlvbkhlbHBlcih0ZXh0YXJlYSwgY29tcG9zaXRpb25WaWV3LCB0ZXJtaW5hbCkge1xuICAgICAgICB0aGlzLnRleHRhcmVhID0gdGV4dGFyZWE7XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25WaWV3ID0gY29tcG9zaXRpb25WaWV3O1xuICAgICAgICB0aGlzLnRlcm1pbmFsID0gdGVybWluYWw7XG4gICAgICAgIHRoaXMuaXNDb21wb3NpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pc1NlbmRpbmdDb21wb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uUG9zaXRpb24gPSB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcbiAgICB9XG4gICAgQ29tcG9zaXRpb25IZWxwZXIucHJvdG90eXBlLmNvbXBvc2l0aW9uc3RhcnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuaXNDb21wb3NpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uUG9zaXRpb24uc3RhcnQgPSB0aGlzLnRleHRhcmVhLnZhbHVlLmxlbmd0aDtcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvblZpZXcudGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvblZpZXcuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgfTtcbiAgICBDb21wb3NpdGlvbkhlbHBlci5wcm90b3R5cGUuY29tcG9zaXRpb251cGRhdGUgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvblZpZXcudGV4dENvbnRlbnQgPSBldi5kYXRhO1xuICAgICAgICB0aGlzLnVwZGF0ZUNvbXBvc2l0aW9uRWxlbWVudHMoKTtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpcy5jb21wb3NpdGlvblBvc2l0aW9uLmVuZCA9IF90aGlzLnRleHRhcmVhLnZhbHVlLmxlbmd0aDtcbiAgICAgICAgfSwgMCk7XG4gICAgfTtcbiAgICBDb21wb3NpdGlvbkhlbHBlci5wcm90b3R5cGUuY29tcG9zaXRpb25lbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuZmluYWxpemVDb21wb3NpdGlvbih0cnVlKTtcbiAgICB9O1xuICAgIENvbXBvc2l0aW9uSGVscGVyLnByb3RvdHlwZS5rZXlkb3duID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIGlmICh0aGlzLmlzQ29tcG9zaW5nIHx8IHRoaXMuaXNTZW5kaW5nQ29tcG9zaXRpb24pIHtcbiAgICAgICAgICAgIGlmIChldi5rZXlDb2RlID09PSAyMjkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChldi5rZXlDb2RlID09PSAxNiB8fCBldi5rZXlDb2RlID09PSAxNyB8fCBldi5rZXlDb2RlID09PSAxOCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZmluYWxpemVDb21wb3NpdGlvbihmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2LmtleUNvZGUgPT09IDIyOSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVBbnlUZXh0YXJlYUNoYW5nZXMoKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIENvbXBvc2l0aW9uSGVscGVyLnByb3RvdHlwZS5maW5hbGl6ZUNvbXBvc2l0aW9uID0gZnVuY3Rpb24gKHdhaXRGb3JQcm9wb2dhdGlvbikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uVmlldy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgICAgdGhpcy5pc0NvbXBvc2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNsZWFyVGV4dGFyZWFQb3NpdGlvbigpO1xuICAgICAgICBpZiAoIXdhaXRGb3JQcm9wb2dhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5pc1NlbmRpbmdDb21wb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgdmFyIGlucHV0ID0gdGhpcy50ZXh0YXJlYS52YWx1ZS5zdWJzdHJpbmcodGhpcy5jb21wb3NpdGlvblBvc2l0aW9uLnN0YXJ0LCB0aGlzLmNvbXBvc2l0aW9uUG9zaXRpb24uZW5kKTtcbiAgICAgICAgICAgIHRoaXMudGVybWluYWwuaGFuZGxlcihpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YXIgY3VycmVudENvbXBvc2l0aW9uUG9zaXRpb25fMSA9IHtcbiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5jb21wb3NpdGlvblBvc2l0aW9uLnN0YXJ0LFxuICAgICAgICAgICAgICAgIGVuZDogdGhpcy5jb21wb3NpdGlvblBvc2l0aW9uLmVuZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmlzU2VuZGluZ0NvbXBvc2l0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5pc1NlbmRpbmdDb21wb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy5pc1NlbmRpbmdDb21wb3NpdGlvbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSB2b2lkIDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5pc0NvbXBvc2luZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBfdGhpcy50ZXh0YXJlYS52YWx1ZS5zdWJzdHJpbmcoY3VycmVudENvbXBvc2l0aW9uUG9zaXRpb25fMS5zdGFydCwgY3VycmVudENvbXBvc2l0aW9uUG9zaXRpb25fMS5lbmQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBfdGhpcy50ZXh0YXJlYS52YWx1ZS5zdWJzdHJpbmcoY3VycmVudENvbXBvc2l0aW9uUG9zaXRpb25fMS5zdGFydCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgX3RoaXMudGVybWluYWwuaGFuZGxlcihpbnB1dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENvbXBvc2l0aW9uSGVscGVyLnByb3RvdHlwZS5oYW5kbGVBbnlUZXh0YXJlYUNoYW5nZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBvbGRWYWx1ZSA9IHRoaXMudGV4dGFyZWEudmFsdWU7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCFfdGhpcy5pc0NvbXBvc2luZykge1xuICAgICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IF90aGlzLnRleHRhcmVhLnZhbHVlO1xuICAgICAgICAgICAgICAgIHZhciBkaWZmID0gbmV3VmFsdWUucmVwbGFjZShvbGRWYWx1ZSwgJycpO1xuICAgICAgICAgICAgICAgIGlmIChkaWZmLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMudGVybWluYWwuaGFuZGxlcihkaWZmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDApO1xuICAgIH07XG4gICAgQ29tcG9zaXRpb25IZWxwZXIucHJvdG90eXBlLnVwZGF0ZUNvbXBvc2l0aW9uRWxlbWVudHMgPSBmdW5jdGlvbiAoZG9udFJlY3Vyc2UpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKCF0aGlzLmlzQ29tcG9zaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGN1cnNvciA9IHRoaXMudGVybWluYWwuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudGVybWluYWwtY3Vyc29yJyk7XG4gICAgICAgIGlmIChjdXJzb3IpIHtcbiAgICAgICAgICAgIHZhciB4dGVybVJvd3MgPSB0aGlzLnRlcm1pbmFsLmVsZW1lbnQucXVlcnlTZWxlY3RvcignLnh0ZXJtLXJvd3MnKTtcbiAgICAgICAgICAgIHZhciBjdXJzb3JUb3AgPSB4dGVybVJvd3Mub2Zmc2V0VG9wICsgY3Vyc29yLm9mZnNldFRvcDtcbiAgICAgICAgICAgIHRoaXMuY29tcG9zaXRpb25WaWV3LnN0eWxlLmxlZnQgPSBjdXJzb3Iub2Zmc2V0TGVmdCArICdweCc7XG4gICAgICAgICAgICB0aGlzLmNvbXBvc2l0aW9uVmlldy5zdHlsZS50b3AgPSBjdXJzb3JUb3AgKyAncHgnO1xuICAgICAgICAgICAgdGhpcy5jb21wb3NpdGlvblZpZXcuc3R5bGUuaGVpZ2h0ID0gY3Vyc29yLm9mZnNldEhlaWdodCArICdweCc7XG4gICAgICAgICAgICB0aGlzLmNvbXBvc2l0aW9uVmlldy5zdHlsZS5saW5lSGVpZ2h0ID0gY3Vyc29yLm9mZnNldEhlaWdodCArICdweCc7XG4gICAgICAgICAgICB2YXIgY29tcG9zaXRpb25WaWV3Qm91bmRzID0gdGhpcy5jb21wb3NpdGlvblZpZXcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICB0aGlzLnRleHRhcmVhLnN0eWxlLmxlZnQgPSBjdXJzb3Iub2Zmc2V0TGVmdCArICdweCc7XG4gICAgICAgICAgICB0aGlzLnRleHRhcmVhLnN0eWxlLnRvcCA9IGN1cnNvclRvcCArICdweCc7XG4gICAgICAgICAgICB0aGlzLnRleHRhcmVhLnN0eWxlLndpZHRoID0gY29tcG9zaXRpb25WaWV3Qm91bmRzLndpZHRoICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMudGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gY29tcG9zaXRpb25WaWV3Qm91bmRzLmhlaWdodCArICdweCc7XG4gICAgICAgICAgICB0aGlzLnRleHRhcmVhLnN0eWxlLmxpbmVIZWlnaHQgPSBjb21wb3NpdGlvblZpZXdCb3VuZHMuaGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRvbnRSZWN1cnNlKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLnVwZGF0ZUNvbXBvc2l0aW9uRWxlbWVudHModHJ1ZSk7IH0sIDApO1xuICAgICAgICB9XG4gICAgfTtcbiAgICA7XG4gICAgQ29tcG9zaXRpb25IZWxwZXIucHJvdG90eXBlLmNsZWFyVGV4dGFyZWFQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy50ZXh0YXJlYS5zdHlsZS5sZWZ0ID0gJyc7XG4gICAgICAgIHRoaXMudGV4dGFyZWEuc3R5bGUudG9wID0gJyc7XG4gICAgfTtcbiAgICA7XG4gICAgcmV0dXJuIENvbXBvc2l0aW9uSGVscGVyO1xufSgpKTtcbmV4cG9ydHMuQ29tcG9zaXRpb25IZWxwZXIgPSBDb21wb3NpdGlvbkhlbHBlcjtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q29tcG9zaXRpb25IZWxwZXIuanMubWFwXG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBDMDtcbihmdW5jdGlvbiAoQzApIHtcbiAgICBDMC5OVUwgPSAnXFx4MDAnO1xuICAgIEMwLlNPSCA9ICdcXHgwMSc7XG4gICAgQzAuU1RYID0gJ1xceDAyJztcbiAgICBDMC5FVFggPSAnXFx4MDMnO1xuICAgIEMwLkVPVCA9ICdcXHgwNCc7XG4gICAgQzAuRU5RID0gJ1xceDA1JztcbiAgICBDMC5BQ0sgPSAnXFx4MDYnO1xuICAgIEMwLkJFTCA9ICdcXHgwNyc7XG4gICAgQzAuQlMgPSAnXFx4MDgnO1xuICAgIEMwLkhUID0gJ1xceDA5JztcbiAgICBDMC5MRiA9ICdcXHgwYSc7XG4gICAgQzAuVlQgPSAnXFx4MGInO1xuICAgIEMwLkZGID0gJ1xceDBjJztcbiAgICBDMC5DUiA9ICdcXHgwZCc7XG4gICAgQzAuU08gPSAnXFx4MGUnO1xuICAgIEMwLlNJID0gJ1xceDBmJztcbiAgICBDMC5ETEUgPSAnXFx4MTAnO1xuICAgIEMwLkRDMSA9ICdcXHgxMSc7XG4gICAgQzAuREMyID0gJ1xceDEyJztcbiAgICBDMC5EQzMgPSAnXFx4MTMnO1xuICAgIEMwLkRDNCA9ICdcXHgxNCc7XG4gICAgQzAuTkFLID0gJ1xceDE1JztcbiAgICBDMC5TWU4gPSAnXFx4MTYnO1xuICAgIEMwLkVUQiA9ICdcXHgxNyc7XG4gICAgQzAuQ0FOID0gJ1xceDE4JztcbiAgICBDMC5FTSA9ICdcXHgxOSc7XG4gICAgQzAuU1VCID0gJ1xceDFhJztcbiAgICBDMC5FU0MgPSAnXFx4MWInO1xuICAgIEMwLkZTID0gJ1xceDFjJztcbiAgICBDMC5HUyA9ICdcXHgxZCc7XG4gICAgQzAuUlMgPSAnXFx4MWUnO1xuICAgIEMwLlVTID0gJ1xceDFmJztcbiAgICBDMC5TUCA9ICdcXHgyMCc7XG4gICAgQzAuREVMID0gJ1xceDdmJztcbn0pKEMwID0gZXhwb3J0cy5DMCB8fCAoZXhwb3J0cy5DMCA9IHt9KSk7XG47XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUVzY2FwZVNlcXVlbmNlcy5qcy5tYXBcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuO1xudmFyIEV2ZW50RW1pdHRlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICAgICAgICB0aGlzLl9ldmVudHMgPSB0aGlzLl9ldmVudHMgfHwge307XG4gICAgfVxuICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAodHlwZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gdGhpcy5fZXZlbnRzW3R5cGVdIHx8IFtdO1xuICAgICAgICB0aGlzLl9ldmVudHNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG4gICAgfTtcbiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uICh0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgICBpZiAoIXRoaXMuX2V2ZW50c1t0eXBlXSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBvYmogPSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgICAgIHZhciBpID0gb2JqLmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICAgICAgaWYgKG9ialtpXSA9PT0gbGlzdGVuZXIgfHwgb2JqW2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikge1xuICAgICAgICAgICAgICAgIG9iai5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIGlmICh0aGlzLl9ldmVudHNbdHlwZV0pIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uICh0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgICBmdW5jdGlvbiBvbigpIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHRoaXMub2ZmKHR5cGUsIG9uKTtcbiAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBvbi5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICAgICAgICByZXR1cm4gdGhpcy5vbih0eXBlLCBvbik7XG4gICAgfTtcbiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICBpZiAoIXRoaXMuX2V2ZW50c1t0eXBlXSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgdmFyIG9iaiA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIG9ialtpXS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXZlbnRzW3R5cGVdIHx8IFtdO1xuICAgIH07XG4gICAgcmV0dXJuIEV2ZW50RW1pdHRlcjtcbn0oKSk7XG5leHBvcnRzLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXZlbnRFbWl0dGVyLmpzLm1hcFxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgRXNjYXBlU2VxdWVuY2VzXzEgPSByZXF1aXJlKFwiLi9Fc2NhcGVTZXF1ZW5jZXNcIik7XG52YXIgQ2hhcnNldHNfMSA9IHJlcXVpcmUoXCIuL0NoYXJzZXRzXCIpO1xudmFyIElucHV0SGFuZGxlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gSW5wdXRIYW5kbGVyKF90ZXJtaW5hbCkge1xuICAgICAgICB0aGlzLl90ZXJtaW5hbCA9IF90ZXJtaW5hbDtcbiAgICB9XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5hZGRDaGFyID0gZnVuY3Rpb24gKGNoYXIsIGNvZGUpIHtcbiAgICAgICAgaWYgKGNoYXIgPj0gJyAnKSB7XG4gICAgICAgICAgICB2YXIgY2hfd2lkdGggPSB3Y3dpZHRoKGNvZGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLmNoYXJzZXQgJiYgdGhpcy5fdGVybWluYWwuY2hhcnNldFtjaGFyXSkge1xuICAgICAgICAgICAgICAgIGNoYXIgPSB0aGlzLl90ZXJtaW5hbC5jaGFyc2V0W2NoYXJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHJvdyA9IHRoaXMuX3Rlcm1pbmFsLnkgKyB0aGlzLl90ZXJtaW5hbC55YmFzZTtcbiAgICAgICAgICAgIGlmICghY2hfd2lkdGggJiYgdGhpcy5fdGVybWluYWwueCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC5saW5lcy5nZXQocm93KVt0aGlzLl90ZXJtaW5hbC54IC0gMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl90ZXJtaW5hbC5saW5lcy5nZXQocm93KVt0aGlzLl90ZXJtaW5hbC54IC0gMV1bMl0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC5saW5lcy5nZXQocm93KVt0aGlzLl90ZXJtaW5hbC54IC0gMl0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubGluZXMuZ2V0KHJvdylbdGhpcy5fdGVybWluYWwueCAtIDJdWzFdICs9IGNoYXI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5saW5lcy5nZXQocm93KVt0aGlzLl90ZXJtaW5hbC54IC0gMV1bMV0gKz0gY2hhcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC51cGRhdGVSYW5nZSh0aGlzLl90ZXJtaW5hbC55KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLnggKyBjaF93aWR0aCAtIDEgPj0gdGhpcy5fdGVybWluYWwuY29scykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC53cmFwYXJvdW5kTW9kZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC54ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueSsrO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGVybWluYWwueSA+IHRoaXMuX3Rlcm1pbmFsLnNjcm9sbEJvdHRvbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueS0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2Nyb2xsKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaF93aWR0aCA9PT0gMilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByb3cgPSB0aGlzLl90ZXJtaW5hbC55ICsgdGhpcy5fdGVybWluYWwueWJhc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5fdGVybWluYWwuaW5zZXJ0TW9kZSkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG1vdmVzID0gMDsgbW92ZXMgPCBjaF93aWR0aDsgKyttb3Zlcykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlZCA9IHRoaXMuX3Rlcm1pbmFsLmxpbmVzLmdldCh0aGlzLl90ZXJtaW5hbC55ICsgdGhpcy5fdGVybWluYWwueWJhc2UpLnBvcCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlZFsyXSA9PT0gMFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5fdGVybWluYWwubGluZXMuZ2V0KHJvdylbdGhpcy5fdGVybWluYWwuY29scyAtIDJdXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLl90ZXJtaW5hbC5saW5lcy5nZXQocm93KVt0aGlzLl90ZXJtaW5hbC5jb2xzIC0gMl1bMl0gPT09IDIpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5saW5lcy5nZXQocm93KVt0aGlzLl90ZXJtaW5hbC5jb2xzIC0gMl0gPSBbdGhpcy5fdGVybWluYWwuY3VyQXR0ciwgJyAnLCAxXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubGluZXMuZ2V0KHJvdykuc3BsaWNlKHRoaXMuX3Rlcm1pbmFsLngsIDAsIFt0aGlzLl90ZXJtaW5hbC5jdXJBdHRyLCAnICcsIDFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5saW5lcy5nZXQocm93KVt0aGlzLl90ZXJtaW5hbC54XSA9IFt0aGlzLl90ZXJtaW5hbC5jdXJBdHRyLCBjaGFyLCBjaF93aWR0aF07XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC54Kys7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC51cGRhdGVSYW5nZSh0aGlzLl90ZXJtaW5hbC55KTtcbiAgICAgICAgICAgIGlmIChjaF93aWR0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmxpbmVzLmdldChyb3cpW3RoaXMuX3Rlcm1pbmFsLnhdID0gW3RoaXMuX3Rlcm1pbmFsLmN1ckF0dHIsICcnLCAwXTtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC54Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuYmVsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKCF0aGlzLl90ZXJtaW5hbC52aXN1YWxCZWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGVybWluYWwuZWxlbWVudC5zdHlsZS5ib3JkZXJDb2xvciA9ICd3aGl0ZSc7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX3Rlcm1pbmFsLmVsZW1lbnQuc3R5bGUuYm9yZGVyQ29sb3IgPSAnJzsgfSwgMTApO1xuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwucG9wT25CZWxsKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLmxpbmVGZWVkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwuY29udmVydEVvbCkge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGVybWluYWwueSsrO1xuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwueSA+IHRoaXMuX3Rlcm1pbmFsLnNjcm9sbEJvdHRvbSkge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueS0tO1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2Nyb2xsKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLnggPj0gdGhpcy5fdGVybWluYWwuY29scykge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueC0tO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLmNhcnJpYWdlUmV0dXJuID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC54ID0gMDtcbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuYmFja3NwYWNlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwueCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLngtLTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS50YWIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnggPSB0aGlzLl90ZXJtaW5hbC5uZXh0U3RvcCgpO1xuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5zaGlmdE91dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fdGVybWluYWwuc2V0Z0xldmVsKDEpO1xuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5zaGlmdEluID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC5zZXRnTGV2ZWwoMCk7XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLmluc2VydENoYXJzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGFyYW0sIHJvdywgaiwgY2g7XG4gICAgICAgIHBhcmFtID0gcGFyYW1zWzBdO1xuICAgICAgICBpZiAocGFyYW0gPCAxKVxuICAgICAgICAgICAgcGFyYW0gPSAxO1xuICAgICAgICByb3cgPSB0aGlzLl90ZXJtaW5hbC55ICsgdGhpcy5fdGVybWluYWwueWJhc2U7XG4gICAgICAgIGogPSB0aGlzLl90ZXJtaW5hbC54O1xuICAgICAgICBjaCA9IFt0aGlzLl90ZXJtaW5hbC5lcmFzZUF0dHIoKSwgJyAnLCAxXTtcbiAgICAgICAgd2hpbGUgKHBhcmFtLS0gJiYgaiA8IHRoaXMuX3Rlcm1pbmFsLmNvbHMpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmxpbmVzLmdldChyb3cpLnNwbGljZShqKyssIDAsIGNoKTtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmxpbmVzLmdldChyb3cpLnBvcCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLmN1cnNvclVwID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbMF07XG4gICAgICAgIGlmIChwYXJhbSA8IDEpIHtcbiAgICAgICAgICAgIHBhcmFtID0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90ZXJtaW5hbC55IC09IHBhcmFtO1xuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwueSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnkgPSAwO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLmN1cnNvckRvd24gPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1swXTtcbiAgICAgICAgaWYgKHBhcmFtIDwgMSkge1xuICAgICAgICAgICAgcGFyYW0gPSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnkgKz0gcGFyYW07XG4gICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC55ID49IHRoaXMuX3Rlcm1pbmFsLnJvd3MpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnkgPSB0aGlzLl90ZXJtaW5hbC5yb3dzIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwueCA+PSB0aGlzLl90ZXJtaW5hbC5jb2xzKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC54LS07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuY3Vyc29yRm9yd2FyZCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zWzBdO1xuICAgICAgICBpZiAocGFyYW0gPCAxKSB7XG4gICAgICAgICAgICBwYXJhbSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGVybWluYWwueCArPSBwYXJhbTtcbiAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLnggPj0gdGhpcy5fdGVybWluYWwuY29scykge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueCA9IHRoaXMuX3Rlcm1pbmFsLmNvbHMgLSAxO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLmN1cnNvckJhY2t3YXJkID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbMF07XG4gICAgICAgIGlmIChwYXJhbSA8IDEpIHtcbiAgICAgICAgICAgIHBhcmFtID0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwueCA+PSB0aGlzLl90ZXJtaW5hbC5jb2xzKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC54LS07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGVybWluYWwueCAtPSBwYXJhbTtcbiAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLnggPCAwKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC54ID0gMDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5jdXJzb3JOZXh0TGluZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zWzBdO1xuICAgICAgICBpZiAocGFyYW0gPCAxKSB7XG4gICAgICAgICAgICBwYXJhbSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGVybWluYWwueSArPSBwYXJhbTtcbiAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLnkgPj0gdGhpcy5fdGVybWluYWwucm93cykge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueSA9IHRoaXMuX3Rlcm1pbmFsLnJvd3MgLSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnggPSAwO1xuICAgIH07XG4gICAgO1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuY3Vyc29yUHJlY2VkaW5nTGluZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zWzBdO1xuICAgICAgICBpZiAocGFyYW0gPCAxKSB7XG4gICAgICAgICAgICBwYXJhbSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGVybWluYWwueSAtPSBwYXJhbTtcbiAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLnkgPCAwKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC55ID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90ZXJtaW5hbC54ID0gMDtcbiAgICB9O1xuICAgIDtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLmN1cnNvckNoYXJBYnNvbHV0ZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zWzBdO1xuICAgICAgICBpZiAocGFyYW0gPCAxKSB7XG4gICAgICAgICAgICBwYXJhbSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGVybWluYWwueCA9IHBhcmFtIC0gMTtcbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuY3Vyc29yUG9zaXRpb24gPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciByb3csIGNvbDtcbiAgICAgICAgcm93ID0gcGFyYW1zWzBdIC0gMTtcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgY29sID0gcGFyYW1zWzFdIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdyA8IDApIHtcbiAgICAgICAgICAgIHJvdyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocm93ID49IHRoaXMuX3Rlcm1pbmFsLnJvd3MpIHtcbiAgICAgICAgICAgIHJvdyA9IHRoaXMuX3Rlcm1pbmFsLnJvd3MgLSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2wgPCAwKSB7XG4gICAgICAgICAgICBjb2wgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGNvbCA+PSB0aGlzLl90ZXJtaW5hbC5jb2xzKSB7XG4gICAgICAgICAgICBjb2wgPSB0aGlzLl90ZXJtaW5hbC5jb2xzIC0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90ZXJtaW5hbC54ID0gY29sO1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC55ID0gcm93O1xuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5jdXJzb3JGb3J3YXJkVGFiID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbMF0gfHwgMTtcbiAgICAgICAgd2hpbGUgKHBhcmFtLS0pIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnggPSB0aGlzLl90ZXJtaW5hbC5uZXh0U3RvcCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLmVyYXNlSW5EaXNwbGF5ID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgajtcbiAgICAgICAgc3dpdGNoIChwYXJhbXNbMF0pIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5lcmFzZVJpZ2h0KHRoaXMuX3Rlcm1pbmFsLngsIHRoaXMuX3Rlcm1pbmFsLnkpO1xuICAgICAgICAgICAgICAgIGogPSB0aGlzLl90ZXJtaW5hbC55ICsgMTtcbiAgICAgICAgICAgICAgICBmb3IgKDsgaiA8IHRoaXMuX3Rlcm1pbmFsLnJvd3M7IGorKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5lcmFzZUxpbmUoaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmVyYXNlTGVmdCh0aGlzLl90ZXJtaW5hbC54LCB0aGlzLl90ZXJtaW5hbC55KTtcbiAgICAgICAgICAgICAgICBqID0gdGhpcy5fdGVybWluYWwueTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoai0tKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmVyYXNlTGluZShqKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgaiA9IHRoaXMuX3Rlcm1pbmFsLnJvd3M7XG4gICAgICAgICAgICAgICAgd2hpbGUgKGotLSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuZXJhc2VMaW5lKGopO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHZhciBzY3JvbGxCYWNrU2l6ZSA9IHRoaXMuX3Rlcm1pbmFsLmxpbmVzLmxlbmd0aCAtIHRoaXMuX3Rlcm1pbmFsLnJvd3M7XG4gICAgICAgICAgICAgICAgaWYgKHNjcm9sbEJhY2tTaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5saW5lcy50cmltU3RhcnQoc2Nyb2xsQmFja1NpemUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC55YmFzZSA9IE1hdGgubWF4KHRoaXMuX3Rlcm1pbmFsLnliYXNlIC0gc2Nyb2xsQmFja1NpemUsIDApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC55ZGlzcCA9IE1hdGgubWF4KHRoaXMuX3Rlcm1pbmFsLnlkaXNwIC0gc2Nyb2xsQmFja1NpemUsIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5lcmFzZUluTGluZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgc3dpdGNoIChwYXJhbXNbMF0pIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5lcmFzZVJpZ2h0KHRoaXMuX3Rlcm1pbmFsLngsIHRoaXMuX3Rlcm1pbmFsLnkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmVyYXNlTGVmdCh0aGlzLl90ZXJtaW5hbC54LCB0aGlzLl90ZXJtaW5hbC55KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5lcmFzZUxpbmUodGhpcy5fdGVybWluYWwueSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuaW5zZXJ0TGluZXMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXJhbSwgcm93LCBqO1xuICAgICAgICBwYXJhbSA9IHBhcmFtc1swXTtcbiAgICAgICAgaWYgKHBhcmFtIDwgMSkge1xuICAgICAgICAgICAgcGFyYW0gPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJvdyA9IHRoaXMuX3Rlcm1pbmFsLnkgKyB0aGlzLl90ZXJtaW5hbC55YmFzZTtcbiAgICAgICAgaiA9IHRoaXMuX3Rlcm1pbmFsLnJvd3MgLSAxIC0gdGhpcy5fdGVybWluYWwuc2Nyb2xsQm90dG9tO1xuICAgICAgICBqID0gdGhpcy5fdGVybWluYWwucm93cyAtIDEgKyB0aGlzLl90ZXJtaW5hbC55YmFzZSAtIGogKyAxO1xuICAgICAgICB3aGlsZSAocGFyYW0tLSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLmxpbmVzLmxlbmd0aCA9PT0gdGhpcy5fdGVybWluYWwubGluZXMubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubGluZXMudHJpbVN0YXJ0KDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnliYXNlLS07XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueWRpc3AtLTtcbiAgICAgICAgICAgICAgICByb3ctLTtcbiAgICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5saW5lcy5zcGxpY2Uocm93LCAwLCB0aGlzLl90ZXJtaW5hbC5ibGFua0xpbmUodHJ1ZSkpO1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubGluZXMuc3BsaWNlKGosIDEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnVwZGF0ZVJhbmdlKHRoaXMuX3Rlcm1pbmFsLnkpO1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC51cGRhdGVSYW5nZSh0aGlzLl90ZXJtaW5hbC5zY3JvbGxCb3R0b20pO1xuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5kZWxldGVMaW5lcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhcmFtLCByb3csIGo7XG4gICAgICAgIHBhcmFtID0gcGFyYW1zWzBdO1xuICAgICAgICBpZiAocGFyYW0gPCAxKSB7XG4gICAgICAgICAgICBwYXJhbSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgcm93ID0gdGhpcy5fdGVybWluYWwueSArIHRoaXMuX3Rlcm1pbmFsLnliYXNlO1xuICAgICAgICBqID0gdGhpcy5fdGVybWluYWwucm93cyAtIDEgLSB0aGlzLl90ZXJtaW5hbC5zY3JvbGxCb3R0b207XG4gICAgICAgIGogPSB0aGlzLl90ZXJtaW5hbC5yb3dzIC0gMSArIHRoaXMuX3Rlcm1pbmFsLnliYXNlIC0gajtcbiAgICAgICAgd2hpbGUgKHBhcmFtLS0pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC5saW5lcy5sZW5ndGggPT09IHRoaXMuX3Rlcm1pbmFsLmxpbmVzLm1heExlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmxpbmVzLnRyaW1TdGFydCgxKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC55YmFzZSAtPSAxO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnlkaXNwIC09IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5saW5lcy5zcGxpY2UoaiArIDEsIDAsIHRoaXMuX3Rlcm1pbmFsLmJsYW5rTGluZSh0cnVlKSk7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5saW5lcy5zcGxpY2Uocm93LCAxKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90ZXJtaW5hbC51cGRhdGVSYW5nZSh0aGlzLl90ZXJtaW5hbC55KTtcbiAgICAgICAgdGhpcy5fdGVybWluYWwudXBkYXRlUmFuZ2UodGhpcy5fdGVybWluYWwuc2Nyb2xsQm90dG9tKTtcbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuZGVsZXRlQ2hhcnMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXJhbSwgcm93LCBjaDtcbiAgICAgICAgcGFyYW0gPSBwYXJhbXNbMF07XG4gICAgICAgIGlmIChwYXJhbSA8IDEpIHtcbiAgICAgICAgICAgIHBhcmFtID0gMTtcbiAgICAgICAgfVxuICAgICAgICByb3cgPSB0aGlzLl90ZXJtaW5hbC55ICsgdGhpcy5fdGVybWluYWwueWJhc2U7XG4gICAgICAgIGNoID0gW3RoaXMuX3Rlcm1pbmFsLmVyYXNlQXR0cigpLCAnICcsIDFdO1xuICAgICAgICB3aGlsZSAocGFyYW0tLSkge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubGluZXMuZ2V0KHJvdykuc3BsaWNlKHRoaXMuX3Rlcm1pbmFsLngsIDEpO1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubGluZXMuZ2V0KHJvdykucHVzaChjaCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuc2Nyb2xsVXAgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1swXSB8fCAxO1xuICAgICAgICB3aGlsZSAocGFyYW0tLSkge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubGluZXMuc3BsaWNlKHRoaXMuX3Rlcm1pbmFsLnliYXNlICsgdGhpcy5fdGVybWluYWwuc2Nyb2xsVG9wLCAxKTtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmxpbmVzLnNwbGljZSh0aGlzLl90ZXJtaW5hbC55YmFzZSArIHRoaXMuX3Rlcm1pbmFsLnNjcm9sbEJvdHRvbSwgMCwgdGhpcy5fdGVybWluYWwuYmxhbmtMaW5lKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnVwZGF0ZVJhbmdlKHRoaXMuX3Rlcm1pbmFsLnNjcm9sbFRvcCk7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnVwZGF0ZVJhbmdlKHRoaXMuX3Rlcm1pbmFsLnNjcm9sbEJvdHRvbSk7XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLnNjcm9sbERvd24gPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1swXSB8fCAxO1xuICAgICAgICB3aGlsZSAocGFyYW0tLSkge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubGluZXMuc3BsaWNlKHRoaXMuX3Rlcm1pbmFsLnliYXNlICsgdGhpcy5fdGVybWluYWwuc2Nyb2xsQm90dG9tLCAxKTtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmxpbmVzLnNwbGljZSh0aGlzLl90ZXJtaW5hbC55YmFzZSArIHRoaXMuX3Rlcm1pbmFsLnNjcm9sbFRvcCwgMCwgdGhpcy5fdGVybWluYWwuYmxhbmtMaW5lKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnVwZGF0ZVJhbmdlKHRoaXMuX3Rlcm1pbmFsLnNjcm9sbFRvcCk7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnVwZGF0ZVJhbmdlKHRoaXMuX3Rlcm1pbmFsLnNjcm9sbEJvdHRvbSk7XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLmVyYXNlQ2hhcnMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXJhbSwgcm93LCBqLCBjaDtcbiAgICAgICAgcGFyYW0gPSBwYXJhbXNbMF07XG4gICAgICAgIGlmIChwYXJhbSA8IDEpIHtcbiAgICAgICAgICAgIHBhcmFtID0gMTtcbiAgICAgICAgfVxuICAgICAgICByb3cgPSB0aGlzLl90ZXJtaW5hbC55ICsgdGhpcy5fdGVybWluYWwueWJhc2U7XG4gICAgICAgIGogPSB0aGlzLl90ZXJtaW5hbC54O1xuICAgICAgICBjaCA9IFt0aGlzLl90ZXJtaW5hbC5lcmFzZUF0dHIoKSwgJyAnLCAxXTtcbiAgICAgICAgd2hpbGUgKHBhcmFtLS0gJiYgaiA8IHRoaXMuX3Rlcm1pbmFsLmNvbHMpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmxpbmVzLmdldChyb3cpW2orK10gPSBjaDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5jdXJzb3JCYWNrd2FyZFRhYiA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zWzBdIHx8IDE7XG4gICAgICAgIHdoaWxlIChwYXJhbS0tKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC54ID0gdGhpcy5fdGVybWluYWwucHJldlN0b3AoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5jaGFyUG9zQWJzb2x1dGUgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1swXTtcbiAgICAgICAgaWYgKHBhcmFtIDwgMSkge1xuICAgICAgICAgICAgcGFyYW0gPSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnggPSBwYXJhbSAtIDE7XG4gICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC54ID49IHRoaXMuX3Rlcm1pbmFsLmNvbHMpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnggPSB0aGlzLl90ZXJtaW5hbC5jb2xzIC0gMTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5IUG9zaXRpb25SZWxhdGl2ZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zWzBdO1xuICAgICAgICBpZiAocGFyYW0gPCAxKSB7XG4gICAgICAgICAgICBwYXJhbSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGVybWluYWwueCArPSBwYXJhbTtcbiAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLnggPj0gdGhpcy5fdGVybWluYWwuY29scykge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueCA9IHRoaXMuX3Rlcm1pbmFsLmNvbHMgLSAxO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLnJlcGVhdFByZWNlZGluZ0NoYXJhY3RlciA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zWzBdIHx8IDEsIGxpbmUgPSB0aGlzLl90ZXJtaW5hbC5saW5lcy5nZXQodGhpcy5fdGVybWluYWwueWJhc2UgKyB0aGlzLl90ZXJtaW5hbC55KSwgY2ggPSBsaW5lW3RoaXMuX3Rlcm1pbmFsLnggLSAxXSB8fCBbdGhpcy5fdGVybWluYWwuZGVmQXR0ciwgJyAnLCAxXTtcbiAgICAgICAgd2hpbGUgKHBhcmFtLS0pIHtcbiAgICAgICAgICAgIGxpbmVbdGhpcy5fdGVybWluYWwueCsrXSA9IGNoO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLnNlbmREZXZpY2VBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zWzBdID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fdGVybWluYWwucHJlZml4KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdGVybWluYWwuaXMoJ3h0ZXJtJykgfHwgdGhpcy5fdGVybWluYWwuaXMoJ3J4dnQtdW5pY29kZScpIHx8IHRoaXMuX3Rlcm1pbmFsLmlzKCdzY3JlZW4nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNlbmQoRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1s/MTsyYycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fdGVybWluYWwuaXMoJ2xpbnV4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zZW5kKEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbPzZjJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5fdGVybWluYWwucHJlZml4ID09PSAnPicpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC5pcygneHRlcm0nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNlbmQoRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1s+MDsyNzY7MGMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX3Rlcm1pbmFsLmlzKCdyeHZ0LXVuaWNvZGUnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNlbmQoRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1s+ODU7OTU7MGMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX3Rlcm1pbmFsLmlzKCdsaW51eCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2VuZChwYXJhbXNbMF0gKyAnYycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fdGVybWluYWwuaXMoJ3NjcmVlbicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2VuZChFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWz44Mzs0MDAwMzswYycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLmxpbmVQb3NBYnNvbHV0ZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zWzBdO1xuICAgICAgICBpZiAocGFyYW0gPCAxKSB7XG4gICAgICAgICAgICBwYXJhbSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGVybWluYWwueSA9IHBhcmFtIC0gMTtcbiAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLnkgPj0gdGhpcy5fdGVybWluYWwucm93cykge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueSA9IHRoaXMuX3Rlcm1pbmFsLnJvd3MgLSAxO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLlZQb3NpdGlvblJlbGF0aXZlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbMF07XG4gICAgICAgIGlmIChwYXJhbSA8IDEpIHtcbiAgICAgICAgICAgIHBhcmFtID0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90ZXJtaW5hbC55ICs9IHBhcmFtO1xuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwueSA+PSB0aGlzLl90ZXJtaW5hbC5yb3dzKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC55ID0gdGhpcy5fdGVybWluYWwucm93cyAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLnggPj0gdGhpcy5fdGVybWluYWwuY29scykge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueC0tO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLkhWUG9zaXRpb24gPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIGlmIChwYXJhbXNbMF0gPCAxKVxuICAgICAgICAgICAgcGFyYW1zWzBdID0gMTtcbiAgICAgICAgaWYgKHBhcmFtc1sxXSA8IDEpXG4gICAgICAgICAgICBwYXJhbXNbMV0gPSAxO1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC55ID0gcGFyYW1zWzBdIC0gMTtcbiAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLnkgPj0gdGhpcy5fdGVybWluYWwucm93cykge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueSA9IHRoaXMuX3Rlcm1pbmFsLnJvd3MgLSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnggPSBwYXJhbXNbMV0gLSAxO1xuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwueCA+PSB0aGlzLl90ZXJtaW5hbC5jb2xzKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC54ID0gdGhpcy5fdGVybWluYWwuY29scyAtIDE7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUudGFiQ2xlYXIgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1swXTtcbiAgICAgICAgaWYgKHBhcmFtIDw9IDApIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl90ZXJtaW5hbC50YWJzW3RoaXMuX3Rlcm1pbmFsLnhdO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBhcmFtID09PSAzKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC50YWJzID0ge307XG4gICAgICAgIH1cbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuc2V0TW9kZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0TW9kZShbcGFyYW1zW2ldXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl90ZXJtaW5hbC5wcmVmaXgpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGFyYW1zWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5pbnNlcnRNb2RlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5fdGVybWluYWwucHJlZml4ID09PSAnPycpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGFyYW1zWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5hcHBsaWNhdGlvbkN1cnNvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2V0Z0NoYXJzZXQoMCwgQ2hhcnNldHNfMS5ERUZBVUxUX0NIQVJTRVQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zZXRnQ2hhcnNldCgxLCBDaGFyc2V0c18xLkRFRkFVTFRfQ0hBUlNFVCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNldGdDaGFyc2V0KDIsIENoYXJzZXRzXzEuREVGQVVMVF9DSEFSU0VUKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2V0Z0NoYXJzZXQoMywgQ2hhcnNldHNfMS5ERUZBVUxUX0NIQVJTRVQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNhdmVkQ29scyA9IHRoaXMuX3Rlcm1pbmFsLmNvbHM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnJlc2l6ZSgxMzIsIHRoaXMuX3Rlcm1pbmFsLnJvd3MpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLm9yaWdpbk1vZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLndyYXBhcm91bmRNb2RlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2NjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubG9nKCdTZXJpYWwgcG9ydCByZXF1ZXN0ZWQgYXBwbGljYXRpb24ga2V5cGFkLicpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5hcHBsaWNhdGlvbktleXBhZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnZpZXdwb3J0LnN5bmNTY3JvbGxBcmVhKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICBjYXNlIDEwMDA6XG4gICAgICAgICAgICAgICAgY2FzZSAxMDAyOlxuICAgICAgICAgICAgICAgIGNhc2UgMTAwMzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueDEwTW91c2UgPSBwYXJhbXNbMF0gPT09IDk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnZ0MjAwTW91c2UgPSBwYXJhbXNbMF0gPT09IDEwMDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLm5vcm1hbE1vdXNlID0gcGFyYW1zWzBdID4gMTAwMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubW91c2VFdmVudHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5lbGVtZW50LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubG9nKCdCaW5kaW5nIHRvIG1vdXNlIGV2ZW50cy4nKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDA0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zZW5kRm9jdXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEwMDU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnV0Zk1vdXNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDA2OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zZ3JNb3VzZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTAxNTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwudXJ4dnRNb3VzZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmN1cnNvckhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEwNDk6XG4gICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICBjYXNlIDQ3OlxuICAgICAgICAgICAgICAgIGNhc2UgMTA0NzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl90ZXJtaW5hbC5ub3JtYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub3JtYWwgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXM6IHRoaXMuX3Rlcm1pbmFsLmxpbmVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHliYXNlOiB0aGlzLl90ZXJtaW5hbC55YmFzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZGlzcDogdGhpcy5fdGVybWluYWwueWRpc3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogdGhpcy5fdGVybWluYWwueCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiB0aGlzLl90ZXJtaW5hbC55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogdGhpcy5fdGVybWluYWwuc2Nyb2xsVG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbEJvdHRvbTogdGhpcy5fdGVybWluYWwuc2Nyb2xsQm90dG9tLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYnM6IHRoaXMuX3Rlcm1pbmFsLnRhYnNcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwudmlld3BvcnQuc3luY1Njcm9sbEFyZWEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLm5vcm1hbCA9IG5vcm1hbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNob3dDdXJzb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5yZXNldE1vZGUgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0TW9kZShbcGFyYW1zW2ldXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl90ZXJtaW5hbC5wcmVmaXgpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGFyYW1zWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5pbnNlcnRNb2RlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuX3Rlcm1pbmFsLnByZWZpeCA9PT0gJz8nKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBhcmFtc1swXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuYXBwbGljYXRpb25DdXJzb3IgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGVybWluYWwuY29scyA9PT0gMTMyICYmIHRoaXMuX3Rlcm1pbmFsLnNhdmVkQ29scykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwucmVzaXplKHRoaXMuX3Rlcm1pbmFsLnNhdmVkQ29scywgdGhpcy5fdGVybWluYWwucm93cyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3Rlcm1pbmFsLnNhdmVkQ29scztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5vcmlnaW5Nb2RlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwud3JhcGFyb3VuZE1vZGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA2NjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubG9nKCdTd2l0Y2hpbmcgYmFjayB0byBub3JtYWwga2V5cGFkLicpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5hcHBsaWNhdGlvbktleXBhZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC52aWV3cG9ydC5zeW5jU2Nyb2xsQXJlYSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgY2FzZSAxMDAwOlxuICAgICAgICAgICAgICAgIGNhc2UgMTAwMjpcbiAgICAgICAgICAgICAgICBjYXNlIDEwMDM6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLngxME1vdXNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnZ0MjAwTW91c2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubm9ybWFsTW91c2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubW91c2VFdmVudHMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuZWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDA0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zZW5kRm9jdXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDA1OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC51dGZNb3VzZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEwMDY6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNnck1vdXNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTAxNTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwudXJ4dnRNb3VzZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI1OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5jdXJzb3JIaWRkZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEwNDk6XG4gICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICBjYXNlIDQ3OlxuICAgICAgICAgICAgICAgIGNhc2UgMTA0NzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLm5vcm1hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubGluZXMgPSB0aGlzLl90ZXJtaW5hbC5ub3JtYWwubGluZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC55YmFzZSA9IHRoaXMuX3Rlcm1pbmFsLm5vcm1hbC55YmFzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnlkaXNwID0gdGhpcy5fdGVybWluYWwubm9ybWFsLnlkaXNwO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueCA9IHRoaXMuX3Rlcm1pbmFsLm5vcm1hbC54O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueSA9IHRoaXMuX3Rlcm1pbmFsLm5vcm1hbC55O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2Nyb2xsVG9wID0gdGhpcy5fdGVybWluYWwubm9ybWFsLnNjcm9sbFRvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNjcm9sbEJvdHRvbSA9IHRoaXMuX3Rlcm1pbmFsLm5vcm1hbC5zY3JvbGxCb3R0b207XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC50YWJzID0gdGhpcy5fdGVybWluYWwubm9ybWFsLnRhYnM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5ub3JtYWwgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwucmVmcmVzaCgwLCB0aGlzLl90ZXJtaW5hbC5yb3dzIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC52aWV3cG9ydC5zeW5jU2Nyb2xsQXJlYSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2hvd0N1cnNvcigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLmNoYXJBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA9PT0gMSAmJiBwYXJhbXNbMF0gPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmN1ckF0dHIgPSB0aGlzLl90ZXJtaW5hbC5kZWZBdHRyO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBsID0gcGFyYW1zLmxlbmd0aCwgaSA9IDAsIGZsYWdzID0gdGhpcy5fdGVybWluYWwuY3VyQXR0ciA+PiAxOCwgZmcgPSAodGhpcy5fdGVybWluYWwuY3VyQXR0ciA+PiA5KSAmIDB4MWZmLCBiZyA9IHRoaXMuX3Rlcm1pbmFsLmN1ckF0dHIgJiAweDFmZiwgcDtcbiAgICAgICAgZm9yICg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgIHAgPSBwYXJhbXNbaV07XG4gICAgICAgICAgICBpZiAocCA+PSAzMCAmJiBwIDw9IDM3KSB7XG4gICAgICAgICAgICAgICAgZmcgPSBwIC0gMzA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwID49IDQwICYmIHAgPD0gNDcpIHtcbiAgICAgICAgICAgICAgICBiZyA9IHAgLSA0MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHAgPj0gOTAgJiYgcCA8PSA5Nykge1xuICAgICAgICAgICAgICAgIHAgKz0gODtcbiAgICAgICAgICAgICAgICBmZyA9IHAgLSA5MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHAgPj0gMTAwICYmIHAgPD0gMTA3KSB7XG4gICAgICAgICAgICAgICAgcCArPSA4O1xuICAgICAgICAgICAgICAgIGJnID0gcCAtIDEwMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHAgPT09IDApIHtcbiAgICAgICAgICAgICAgICBmbGFncyA9IHRoaXMuX3Rlcm1pbmFsLmRlZkF0dHIgPj4gMTg7XG4gICAgICAgICAgICAgICAgZmcgPSAodGhpcy5fdGVybWluYWwuZGVmQXR0ciA+PiA5KSAmIDB4MWZmO1xuICAgICAgICAgICAgICAgIGJnID0gdGhpcy5fdGVybWluYWwuZGVmQXR0ciAmIDB4MWZmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGZsYWdzIHw9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwID09PSA0KSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHAgPT09IDUpIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSA0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocCA9PT0gNykge1xuICAgICAgICAgICAgICAgIGZsYWdzIHw9IDg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwID09PSA4KSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gMTY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwID09PSAyMikge1xuICAgICAgICAgICAgICAgIGZsYWdzICY9IH4xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocCA9PT0gMjQpIHtcbiAgICAgICAgICAgICAgICBmbGFncyAmPSB+MjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHAgPT09IDI1KSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgJj0gfjQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwID09PSAyNykge1xuICAgICAgICAgICAgICAgIGZsYWdzICY9IH44O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocCA9PT0gMjgpIHtcbiAgICAgICAgICAgICAgICBmbGFncyAmPSB+MTY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwID09PSAzOSkge1xuICAgICAgICAgICAgICAgIGZnID0gKHRoaXMuX3Rlcm1pbmFsLmRlZkF0dHIgPj4gOSkgJiAweDFmZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHAgPT09IDQ5KSB7XG4gICAgICAgICAgICAgICAgYmcgPSB0aGlzLl90ZXJtaW5hbC5kZWZBdHRyICYgMHgxZmY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwID09PSAzOCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbaSArIDFdID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgZmcgPSB0aGlzLl90ZXJtaW5hbC5tYXRjaENvbG9yKHBhcmFtc1tpXSAmIDB4ZmYsIHBhcmFtc1tpICsgMV0gJiAweGZmLCBwYXJhbXNbaSArIDJdICYgMHhmZik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmZyA9PT0gLTEpXG4gICAgICAgICAgICAgICAgICAgICAgICBmZyA9IDB4MWZmO1xuICAgICAgICAgICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtc1tpICsgMV0gPT09IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgICAgICAgICAgICBwID0gcGFyYW1zW2ldICYgMHhmZjtcbiAgICAgICAgICAgICAgICAgICAgZmcgPSBwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHAgPT09IDQ4KSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtc1tpICsgMV0gPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgICAgICAgICAgICBiZyA9IHRoaXMuX3Rlcm1pbmFsLm1hdGNoQ29sb3IocGFyYW1zW2ldICYgMHhmZiwgcGFyYW1zW2kgKyAxXSAmIDB4ZmYsIHBhcmFtc1tpICsgMl0gJiAweGZmKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJnID09PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGJnID0gMHgxZmY7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyYW1zW2kgKyAxXSA9PT0gNSkge1xuICAgICAgICAgICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgICAgICAgICAgIHAgPSBwYXJhbXNbaV0gJiAweGZmO1xuICAgICAgICAgICAgICAgICAgICBiZyA9IHA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocCA9PT0gMTAwKSB7XG4gICAgICAgICAgICAgICAgZmcgPSAodGhpcy5fdGVybWluYWwuZGVmQXR0ciA+PiA5KSAmIDB4MWZmO1xuICAgICAgICAgICAgICAgIGJnID0gdGhpcy5fdGVybWluYWwuZGVmQXR0ciAmIDB4MWZmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuZXJyb3IoJ1Vua25vd24gU0dSIGF0dHJpYnV0ZTogJWQuJywgcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGVybWluYWwuY3VyQXR0ciA9IChmbGFncyA8PCAxOCkgfCAoZmcgPDwgOSkgfCBiZztcbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuZGV2aWNlU3RhdHVzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICBpZiAoIXRoaXMuX3Rlcm1pbmFsLnByZWZpeCkge1xuICAgICAgICAgICAgc3dpdGNoIChwYXJhbXNbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNlbmQoRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1swbicpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNlbmQoRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1snXG4gICAgICAgICAgICAgICAgICAgICAgICArICh0aGlzLl90ZXJtaW5hbC55ICsgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICsgJzsnXG4gICAgICAgICAgICAgICAgICAgICAgICArICh0aGlzLl90ZXJtaW5hbC54ICsgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICsgJ1InKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5fdGVybWluYWwucHJlZml4ID09PSAnPycpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGFyYW1zWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zZW5kKEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbPydcbiAgICAgICAgICAgICAgICAgICAgICAgICsgKHRoaXMuX3Rlcm1pbmFsLnkgKyAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgKyAnOydcbiAgICAgICAgICAgICAgICAgICAgICAgICsgKHRoaXMuX3Rlcm1pbmFsLnggKyAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgKyAnUicpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI1OlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDI2OlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDUzOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5zb2Z0UmVzZXQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLmN1cnNvckhpZGRlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC5pbnNlcnRNb2RlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLm9yaWdpbk1vZGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fdGVybWluYWwud3JhcGFyb3VuZE1vZGUgPSB0cnVlO1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC5hcHBsaWNhdGlvbktleXBhZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC52aWV3cG9ydC5zeW5jU2Nyb2xsQXJlYSgpO1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC5hcHBsaWNhdGlvbkN1cnNvciA9IGZhbHNlO1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC5zY3JvbGxUb3AgPSAwO1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC5zY3JvbGxCb3R0b20gPSB0aGlzLl90ZXJtaW5hbC5yb3dzIC0gMTtcbiAgICAgICAgdGhpcy5fdGVybWluYWwuY3VyQXR0ciA9IHRoaXMuX3Rlcm1pbmFsLmRlZkF0dHI7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnggPSB0aGlzLl90ZXJtaW5hbC55ID0gMDtcbiAgICAgICAgdGhpcy5fdGVybWluYWwuY2hhcnNldCA9IG51bGw7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLmdsZXZlbCA9IDA7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLmNoYXJzZXRzID0gW251bGxdO1xuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5zZXRDdXJzb3JTdHlsZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zWzBdIDwgMSA/IDEgOiBwYXJhbXNbMF07XG4gICAgICAgIHN3aXRjaCAocGFyYW0pIHtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zZXRPcHRpb24oJ2N1cnNvclN0eWxlJywgJ2Jsb2NrJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2V0T3B0aW9uKCdjdXJzb3JTdHlsZScsICd1bmRlcmxpbmUnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zZXRPcHRpb24oJ2N1cnNvclN0eWxlJywgJ2JhcicpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHZhciBpc0JsaW5raW5nID0gcGFyYW0gJSAyID09PSAxO1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC5zZXRPcHRpb24oJ2N1cnNvckJsaW5rJywgaXNCbGlua2luZyk7XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLnNldFNjcm9sbFJlZ2lvbiA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLnByZWZpeClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5fdGVybWluYWwuc2Nyb2xsVG9wID0gKHBhcmFtc1swXSB8fCAxKSAtIDE7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNjcm9sbEJvdHRvbSA9IChwYXJhbXNbMV0gJiYgcGFyYW1zWzFdIDw9IHRoaXMuX3Rlcm1pbmFsLnJvd3MgPyBwYXJhbXNbMV0gOiB0aGlzLl90ZXJtaW5hbC5yb3dzKSAtIDE7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnggPSAwO1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC55ID0gMDtcbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuc2F2ZUN1cnNvciA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdGhpcy5fdGVybWluYWwuc2F2ZWRYID0gdGhpcy5fdGVybWluYWwueDtcbiAgICAgICAgdGhpcy5fdGVybWluYWwuc2F2ZWRZID0gdGhpcy5fdGVybWluYWwueTtcbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUucmVzdG9yZUN1cnNvciA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdGhpcy5fdGVybWluYWwueCA9IHRoaXMuX3Rlcm1pbmFsLnNhdmVkWCB8fCAwO1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC55ID0gdGhpcy5fdGVybWluYWwuc2F2ZWRZIHx8IDA7XG4gICAgfTtcbiAgICByZXR1cm4gSW5wdXRIYW5kbGVyO1xufSgpKTtcbmV4cG9ydHMuSW5wdXRIYW5kbGVyID0gSW5wdXRIYW5kbGVyO1xudmFyIHdjd2lkdGggPSAoZnVuY3Rpb24gKG9wdHMpIHtcbiAgICB2YXIgQ09NQklOSU5HID0gW1xuICAgICAgICBbMHgwMzAwLCAweDAzNkZdLCBbMHgwNDgzLCAweDA0ODZdLCBbMHgwNDg4LCAweDA0ODldLFxuICAgICAgICBbMHgwNTkxLCAweDA1QkRdLCBbMHgwNUJGLCAweDA1QkZdLCBbMHgwNUMxLCAweDA1QzJdLFxuICAgICAgICBbMHgwNUM0LCAweDA1QzVdLCBbMHgwNUM3LCAweDA1QzddLCBbMHgwNjAwLCAweDA2MDNdLFxuICAgICAgICBbMHgwNjEwLCAweDA2MTVdLCBbMHgwNjRCLCAweDA2NUVdLCBbMHgwNjcwLCAweDA2NzBdLFxuICAgICAgICBbMHgwNkQ2LCAweDA2RTRdLCBbMHgwNkU3LCAweDA2RThdLCBbMHgwNkVBLCAweDA2RURdLFxuICAgICAgICBbMHgwNzBGLCAweDA3MEZdLCBbMHgwNzExLCAweDA3MTFdLCBbMHgwNzMwLCAweDA3NEFdLFxuICAgICAgICBbMHgwN0E2LCAweDA3QjBdLCBbMHgwN0VCLCAweDA3RjNdLCBbMHgwOTAxLCAweDA5MDJdLFxuICAgICAgICBbMHgwOTNDLCAweDA5M0NdLCBbMHgwOTQxLCAweDA5NDhdLCBbMHgwOTRELCAweDA5NERdLFxuICAgICAgICBbMHgwOTUxLCAweDA5NTRdLCBbMHgwOTYyLCAweDA5NjNdLCBbMHgwOTgxLCAweDA5ODFdLFxuICAgICAgICBbMHgwOUJDLCAweDA5QkNdLCBbMHgwOUMxLCAweDA5QzRdLCBbMHgwOUNELCAweDA5Q0RdLFxuICAgICAgICBbMHgwOUUyLCAweDA5RTNdLCBbMHgwQTAxLCAweDBBMDJdLCBbMHgwQTNDLCAweDBBM0NdLFxuICAgICAgICBbMHgwQTQxLCAweDBBNDJdLCBbMHgwQTQ3LCAweDBBNDhdLCBbMHgwQTRCLCAweDBBNERdLFxuICAgICAgICBbMHgwQTcwLCAweDBBNzFdLCBbMHgwQTgxLCAweDBBODJdLCBbMHgwQUJDLCAweDBBQkNdLFxuICAgICAgICBbMHgwQUMxLCAweDBBQzVdLCBbMHgwQUM3LCAweDBBQzhdLCBbMHgwQUNELCAweDBBQ0RdLFxuICAgICAgICBbMHgwQUUyLCAweDBBRTNdLCBbMHgwQjAxLCAweDBCMDFdLCBbMHgwQjNDLCAweDBCM0NdLFxuICAgICAgICBbMHgwQjNGLCAweDBCM0ZdLCBbMHgwQjQxLCAweDBCNDNdLCBbMHgwQjRELCAweDBCNERdLFxuICAgICAgICBbMHgwQjU2LCAweDBCNTZdLCBbMHgwQjgyLCAweDBCODJdLCBbMHgwQkMwLCAweDBCQzBdLFxuICAgICAgICBbMHgwQkNELCAweDBCQ0RdLCBbMHgwQzNFLCAweDBDNDBdLCBbMHgwQzQ2LCAweDBDNDhdLFxuICAgICAgICBbMHgwQzRBLCAweDBDNERdLCBbMHgwQzU1LCAweDBDNTZdLCBbMHgwQ0JDLCAweDBDQkNdLFxuICAgICAgICBbMHgwQ0JGLCAweDBDQkZdLCBbMHgwQ0M2LCAweDBDQzZdLCBbMHgwQ0NDLCAweDBDQ0RdLFxuICAgICAgICBbMHgwQ0UyLCAweDBDRTNdLCBbMHgwRDQxLCAweDBENDNdLCBbMHgwRDRELCAweDBENERdLFxuICAgICAgICBbMHgwRENBLCAweDBEQ0FdLCBbMHgwREQyLCAweDBERDRdLCBbMHgwREQ2LCAweDBERDZdLFxuICAgICAgICBbMHgwRTMxLCAweDBFMzFdLCBbMHgwRTM0LCAweDBFM0FdLCBbMHgwRTQ3LCAweDBFNEVdLFxuICAgICAgICBbMHgwRUIxLCAweDBFQjFdLCBbMHgwRUI0LCAweDBFQjldLCBbMHgwRUJCLCAweDBFQkNdLFxuICAgICAgICBbMHgwRUM4LCAweDBFQ0RdLCBbMHgwRjE4LCAweDBGMTldLCBbMHgwRjM1LCAweDBGMzVdLFxuICAgICAgICBbMHgwRjM3LCAweDBGMzddLCBbMHgwRjM5LCAweDBGMzldLCBbMHgwRjcxLCAweDBGN0VdLFxuICAgICAgICBbMHgwRjgwLCAweDBGODRdLCBbMHgwRjg2LCAweDBGODddLCBbMHgwRjkwLCAweDBGOTddLFxuICAgICAgICBbMHgwRjk5LCAweDBGQkNdLCBbMHgwRkM2LCAweDBGQzZdLCBbMHgxMDJELCAweDEwMzBdLFxuICAgICAgICBbMHgxMDMyLCAweDEwMzJdLCBbMHgxMDM2LCAweDEwMzddLCBbMHgxMDM5LCAweDEwMzldLFxuICAgICAgICBbMHgxMDU4LCAweDEwNTldLCBbMHgxMTYwLCAweDExRkZdLCBbMHgxMzVGLCAweDEzNUZdLFxuICAgICAgICBbMHgxNzEyLCAweDE3MTRdLCBbMHgxNzMyLCAweDE3MzRdLCBbMHgxNzUyLCAweDE3NTNdLFxuICAgICAgICBbMHgxNzcyLCAweDE3NzNdLCBbMHgxN0I0LCAweDE3QjVdLCBbMHgxN0I3LCAweDE3QkRdLFxuICAgICAgICBbMHgxN0M2LCAweDE3QzZdLCBbMHgxN0M5LCAweDE3RDNdLCBbMHgxN0RELCAweDE3RERdLFxuICAgICAgICBbMHgxODBCLCAweDE4MERdLCBbMHgxOEE5LCAweDE4QTldLCBbMHgxOTIwLCAweDE5MjJdLFxuICAgICAgICBbMHgxOTI3LCAweDE5MjhdLCBbMHgxOTMyLCAweDE5MzJdLCBbMHgxOTM5LCAweDE5M0JdLFxuICAgICAgICBbMHgxQTE3LCAweDFBMThdLCBbMHgxQjAwLCAweDFCMDNdLCBbMHgxQjM0LCAweDFCMzRdLFxuICAgICAgICBbMHgxQjM2LCAweDFCM0FdLCBbMHgxQjNDLCAweDFCM0NdLCBbMHgxQjQyLCAweDFCNDJdLFxuICAgICAgICBbMHgxQjZCLCAweDFCNzNdLCBbMHgxREMwLCAweDFEQ0FdLCBbMHgxREZFLCAweDFERkZdLFxuICAgICAgICBbMHgyMDBCLCAweDIwMEZdLCBbMHgyMDJBLCAweDIwMkVdLCBbMHgyMDYwLCAweDIwNjNdLFxuICAgICAgICBbMHgyMDZBLCAweDIwNkZdLCBbMHgyMEQwLCAweDIwRUZdLCBbMHgzMDJBLCAweDMwMkZdLFxuICAgICAgICBbMHgzMDk5LCAweDMwOUFdLCBbMHhBODA2LCAweEE4MDZdLCBbMHhBODBCLCAweEE4MEJdLFxuICAgICAgICBbMHhBODI1LCAweEE4MjZdLCBbMHhGQjFFLCAweEZCMUVdLCBbMHhGRTAwLCAweEZFMEZdLFxuICAgICAgICBbMHhGRTIwLCAweEZFMjNdLCBbMHhGRUZGLCAweEZFRkZdLCBbMHhGRkY5LCAweEZGRkJdLFxuICAgICAgICBbMHgxMEEwMSwgMHgxMEEwM10sIFsweDEwQTA1LCAweDEwQTA2XSwgWzB4MTBBMEMsIDB4MTBBMEZdLFxuICAgICAgICBbMHgxMEEzOCwgMHgxMEEzQV0sIFsweDEwQTNGLCAweDEwQTNGXSwgWzB4MUQxNjcsIDB4MUQxNjldLFxuICAgICAgICBbMHgxRDE3MywgMHgxRDE4Ml0sIFsweDFEMTg1LCAweDFEMThCXSwgWzB4MUQxQUEsIDB4MUQxQURdLFxuICAgICAgICBbMHgxRDI0MiwgMHgxRDI0NF0sIFsweEUwMDAxLCAweEUwMDAxXSwgWzB4RTAwMjAsIDB4RTAwN0ZdLFxuICAgICAgICBbMHhFMDEwMCwgMHhFMDFFRl1cbiAgICBdO1xuICAgIGZ1bmN0aW9uIGJpc2VhcmNoKHVjcykge1xuICAgICAgICB2YXIgbWluID0gMDtcbiAgICAgICAgdmFyIG1heCA9IENPTUJJTklORy5sZW5ndGggLSAxO1xuICAgICAgICB2YXIgbWlkO1xuICAgICAgICBpZiAodWNzIDwgQ09NQklOSU5HWzBdWzBdIHx8IHVjcyA+IENPTUJJTklOR1ttYXhdWzFdKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB3aGlsZSAobWF4ID49IG1pbikge1xuICAgICAgICAgICAgbWlkID0gTWF0aC5mbG9vcigobWluICsgbWF4KSAvIDIpO1xuICAgICAgICAgICAgaWYgKHVjcyA+IENPTUJJTklOR1ttaWRdWzFdKVxuICAgICAgICAgICAgICAgIG1pbiA9IG1pZCArIDE7XG4gICAgICAgICAgICBlbHNlIGlmICh1Y3MgPCBDT01CSU5JTkdbbWlkXVswXSlcbiAgICAgICAgICAgICAgICBtYXggPSBtaWQgLSAxO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2N3aWR0aCh1Y3MpIHtcbiAgICAgICAgaWYgKHVjcyA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBvcHRzLm51bDtcbiAgICAgICAgaWYgKHVjcyA8IDMyIHx8ICh1Y3MgPj0gMHg3ZiAmJiB1Y3MgPCAweGEwKSlcbiAgICAgICAgICAgIHJldHVybiBvcHRzLmNvbnRyb2w7XG4gICAgICAgIGlmIChiaXNlYXJjaCh1Y3MpKVxuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIGlmIChpc1dpZGUodWNzKSkge1xuICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzV2lkZSh1Y3MpIHtcbiAgICAgICAgcmV0dXJuICh1Y3MgPj0gMHgxMTAwICYmICh1Y3MgPD0gMHgxMTVmIHx8XG4gICAgICAgICAgICB1Y3MgPT09IDB4MjMyOSB8fFxuICAgICAgICAgICAgdWNzID09PSAweDIzMmEgfHxcbiAgICAgICAgICAgICh1Y3MgPj0gMHgyZTgwICYmIHVjcyA8PSAweGE0Y2YgJiYgdWNzICE9PSAweDMwM2YpIHx8XG4gICAgICAgICAgICAodWNzID49IDB4YWMwMCAmJiB1Y3MgPD0gMHhkN2EzKSB8fFxuICAgICAgICAgICAgKHVjcyA+PSAweGY5MDAgJiYgdWNzIDw9IDB4ZmFmZikgfHxcbiAgICAgICAgICAgICh1Y3MgPj0gMHhmZTEwICYmIHVjcyA8PSAweGZlMTkpIHx8XG4gICAgICAgICAgICAodWNzID49IDB4ZmUzMCAmJiB1Y3MgPD0gMHhmZTZmKSB8fFxuICAgICAgICAgICAgKHVjcyA+PSAweGZmMDAgJiYgdWNzIDw9IDB4ZmY2MCkgfHxcbiAgICAgICAgICAgICh1Y3MgPj0gMHhmZmUwICYmIHVjcyA8PSAweGZmZTYpIHx8XG4gICAgICAgICAgICAodWNzID49IDB4MjAwMDAgJiYgdWNzIDw9IDB4MmZmZmQpIHx8XG4gICAgICAgICAgICAodWNzID49IDB4MzAwMDAgJiYgdWNzIDw9IDB4M2ZmZmQpKSk7XG4gICAgfVxuICAgIHJldHVybiB3Y3dpZHRoO1xufSkoeyBudWw6IDAsIGNvbnRyb2w6IDAgfSk7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUlucHV0SGFuZGxlci5qcy5tYXBcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIElOVkFMSURfTElOS19DTEFTUyA9ICd4dGVybS1pbnZhbGlkLWxpbmsnO1xudmFyIHByb3RvY29sQ2xhdXNlID0gJyhodHRwcz86XFxcXC9cXFxcLyknO1xudmFyIGRvbWFpbkNoYXJhY3RlclNldCA9ICdbXFxcXGRhLXpcXFxcLi1dKyc7XG52YXIgbmVnYXRlZERvbWFpbkNoYXJhY3RlclNldCA9ICdbXlxcXFxkYS16XFxcXC4tXSsnO1xudmFyIGRvbWFpbkJvZHlDbGF1c2UgPSAnKCcgKyBkb21haW5DaGFyYWN0ZXJTZXQgKyAnKSc7XG52YXIgdGxkQ2xhdXNlID0gJyhbYS16XFxcXC5dezIsNn0pJztcbnZhciBpcENsYXVzZSA9ICcoKFxcXFxkezEsM31cXFxcLil7M31cXFxcZHsxLDN9KSc7XG52YXIgbG9jYWxIb3N0Q2xhdXNlID0gJyhsb2NhbGhvc3QpJztcbnZhciBwb3J0Q2xhdXNlID0gJyg6XFxcXGR7MSw1fSknO1xudmFyIGhvc3RDbGF1c2UgPSAnKCgnICsgZG9tYWluQm9keUNsYXVzZSArICdcXFxcLicgKyB0bGRDbGF1c2UgKyAnKXwnICsgaXBDbGF1c2UgKyAnfCcgKyBsb2NhbEhvc3RDbGF1c2UgKyAnKScgKyBwb3J0Q2xhdXNlICsgJz8nO1xudmFyIHBhdGhDbGF1c2UgPSAnKFxcXFwvW1xcXFwvXFxcXHdcXFxcLlxcXFwtJX5dKikqJztcbnZhciBxdWVyeVN0cmluZ0hhc2hGcmFnbWVudENoYXJhY3RlclNldCA9ICdbMC05XFxcXHdcXFxcW1xcXFxdXFxcXChcXFxcKVxcXFwvXFxcXD9cXFxcISNAJCUmXFwnKissOjt+XFxcXD1cXFxcLlxcXFwtXSonO1xudmFyIHF1ZXJ5U3RyaW5nQ2xhdXNlID0gJyhcXFxcPycgKyBxdWVyeVN0cmluZ0hhc2hGcmFnbWVudENoYXJhY3RlclNldCArICcpPyc7XG52YXIgaGFzaEZyYWdtZW50Q2xhdXNlID0gJygjJyArIHF1ZXJ5U3RyaW5nSGFzaEZyYWdtZW50Q2hhcmFjdGVyU2V0ICsgJyk/JztcbnZhciBuZWdhdGVkUGF0aENoYXJhY3RlclNldCA9ICdbXlxcXFwvXFxcXHdcXFxcLlxcXFwtJV0rJztcbnZhciBib2R5Q2xhdXNlID0gaG9zdENsYXVzZSArIHBhdGhDbGF1c2UgKyBxdWVyeVN0cmluZ0NsYXVzZSArIGhhc2hGcmFnbWVudENsYXVzZTtcbnZhciBzdGFydCA9ICcoPzpefCcgKyBuZWdhdGVkRG9tYWluQ2hhcmFjdGVyU2V0ICsgJykoJztcbnZhciBlbmQgPSAnKSgkfCcgKyBuZWdhdGVkUGF0aENoYXJhY3RlclNldCArICcpJztcbnZhciBzdHJpY3RVcmxSZWdleCA9IG5ldyBSZWdFeHAoc3RhcnQgKyBwcm90b2NvbENsYXVzZSArIGJvZHlDbGF1c2UgKyBlbmQpO1xudmFyIEhZUEVSVEVYVF9MSU5LX01BVENIRVJfSUQgPSAwO1xudmFyIExpbmtpZmllciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTGlua2lmaWVyKCkge1xuICAgICAgICB0aGlzLl9uZXh0TGlua01hdGNoZXJJZCA9IEhZUEVSVEVYVF9MSU5LX01BVENIRVJfSUQ7XG4gICAgICAgIHRoaXMuX3Jvd1RpbWVvdXRJZHMgPSBbXTtcbiAgICAgICAgdGhpcy5fbGlua01hdGNoZXJzID0gW107XG4gICAgICAgIHRoaXMucmVnaXN0ZXJMaW5rTWF0Y2hlcihzdHJpY3RVcmxSZWdleCwgbnVsbCwgeyBtYXRjaEluZGV4OiAxIH0pO1xuICAgIH1cbiAgICBMaW5raWZpZXIucHJvdG90eXBlLmF0dGFjaFRvRG9tID0gZnVuY3Rpb24gKGRvY3VtZW50LCByb3dzKSB7XG4gICAgICAgIHRoaXMuX2RvY3VtZW50ID0gZG9jdW1lbnQ7XG4gICAgICAgIHRoaXMuX3Jvd3MgPSByb3dzO1xuICAgIH07XG4gICAgTGlua2lmaWVyLnByb3RvdHlwZS5saW5raWZ5Um93ID0gZnVuY3Rpb24gKHJvd0luZGV4KSB7XG4gICAgICAgIGlmICghdGhpcy5fZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGltZW91dElkID0gdGhpcy5fcm93VGltZW91dElkc1tyb3dJbmRleF07XG4gICAgICAgIGlmICh0aW1lb3V0SWQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Jvd1RpbWVvdXRJZHNbcm93SW5kZXhdID0gc2V0VGltZW91dCh0aGlzLl9saW5raWZ5Um93LmJpbmQodGhpcywgcm93SW5kZXgpLCBMaW5raWZpZXIuVElNRV9CRUZPUkVfTElOS0lGWSk7XG4gICAgfTtcbiAgICBMaW5raWZpZXIucHJvdG90eXBlLnNldEh5cGVydGV4dExpbmtIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5fbGlua01hdGNoZXJzW0hZUEVSVEVYVF9MSU5LX01BVENIRVJfSURdLmhhbmRsZXIgPSBoYW5kbGVyO1xuICAgIH07XG4gICAgTGlua2lmaWVyLnByb3RvdHlwZS5zZXRIeXBlcnRleHRWYWxpZGF0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5fbGlua01hdGNoZXJzW0hZUEVSVEVYVF9MSU5LX01BVENIRVJfSURdLnZhbGlkYXRpb25DYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIH07XG4gICAgTGlua2lmaWVyLnByb3RvdHlwZS5yZWdpc3RlckxpbmtNYXRjaGVyID0gZnVuY3Rpb24gKHJlZ2V4LCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgICAgIGlmICh0aGlzLl9uZXh0TGlua01hdGNoZXJJZCAhPT0gSFlQRVJURVhUX0xJTktfTUFUQ0hFUl9JRCAmJiAhaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdoYW5kbGVyIG11c3QgYmUgZGVmaW5lZCcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBtYXRjaGVyID0ge1xuICAgICAgICAgICAgaWQ6IHRoaXMuX25leHRMaW5rTWF0Y2hlcklkKyssXG4gICAgICAgICAgICByZWdleDogcmVnZXgsXG4gICAgICAgICAgICBoYW5kbGVyOiBoYW5kbGVyLFxuICAgICAgICAgICAgbWF0Y2hJbmRleDogb3B0aW9ucy5tYXRjaEluZGV4LFxuICAgICAgICAgICAgdmFsaWRhdGlvbkNhbGxiYWNrOiBvcHRpb25zLnZhbGlkYXRpb25DYWxsYmFjayxcbiAgICAgICAgICAgIHByaW9yaXR5OiBvcHRpb25zLnByaW9yaXR5IHx8IDBcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fYWRkTGlua01hdGNoZXJUb0xpc3QobWF0Y2hlcik7XG4gICAgICAgIHJldHVybiBtYXRjaGVyLmlkO1xuICAgIH07XG4gICAgTGlua2lmaWVyLnByb3RvdHlwZS5fYWRkTGlua01hdGNoZXJUb0xpc3QgPSBmdW5jdGlvbiAobWF0Y2hlcikge1xuICAgICAgICBpZiAodGhpcy5fbGlua01hdGNoZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fbGlua01hdGNoZXJzLnB1c2gobWF0Y2hlcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMuX2xpbmtNYXRjaGVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgaWYgKG1hdGNoZXIucHJpb3JpdHkgPD0gdGhpcy5fbGlua01hdGNoZXJzW2ldLnByaW9yaXR5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGlua01hdGNoZXJzLnNwbGljZShpICsgMSwgMCwgbWF0Y2hlcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xpbmtNYXRjaGVycy5zcGxpY2UoMCwgMCwgbWF0Y2hlcik7XG4gICAgfTtcbiAgICBMaW5raWZpZXIucHJvdG90eXBlLmRlcmVnaXN0ZXJMaW5rTWF0Y2hlciA9IGZ1bmN0aW9uIChtYXRjaGVySWQpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLl9saW5rTWF0Y2hlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9saW5rTWF0Y2hlcnNbaV0uaWQgPT09IG1hdGNoZXJJZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xpbmtNYXRjaGVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgTGlua2lmaWVyLnByb3RvdHlwZS5fbGlua2lmeVJvdyA9IGZ1bmN0aW9uIChyb3dJbmRleCkge1xuICAgICAgICB2YXIgcm93ID0gdGhpcy5fcm93c1tyb3dJbmRleF07XG4gICAgICAgIGlmICghcm93KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRleHQgPSByb3cudGV4dENvbnRlbnQ7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fbGlua01hdGNoZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbWF0Y2hlciA9IHRoaXMuX2xpbmtNYXRjaGVyc1tpXTtcbiAgICAgICAgICAgIHZhciBsaW5rRWxlbWVudHMgPSB0aGlzLl9kb0xpbmtpZnlSb3cocm93LCBtYXRjaGVyKTtcbiAgICAgICAgICAgIGlmIChsaW5rRWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyLnZhbGlkYXRpb25DYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgX2xvb3BfMSA9IGZ1bmN0aW9uIChqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IGxpbmtFbGVtZW50c1tqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXIudmFsaWRhdGlvbkNhbGxiYWNrKGVsZW1lbnQudGV4dENvbnRlbnQsIGVsZW1lbnQsIGZ1bmN0aW9uIChpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChJTlZBTElEX0xJTktfQ0xBU1MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGxpbmtFbGVtZW50cy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2xvb3BfMShqKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIExpbmtpZmllci5wcm90b3R5cGUuX2RvTGlua2lmeVJvdyA9IGZ1bmN0aW9uIChyb3csIG1hdGNoZXIpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICB2YXIgaXNIdHRwTGlua01hdGNoZXIgPSBtYXRjaGVyLmlkID09PSBIWVBFUlRFWFRfTElOS19NQVRDSEVSX0lEO1xuICAgICAgICB2YXIgbm9kZXMgPSByb3cuY2hpbGROb2RlcztcbiAgICAgICAgdmFyIG1hdGNoID0gcm93LnRleHRDb250ZW50Lm1hdGNoKG1hdGNoZXIucmVnZXgpO1xuICAgICAgICBpZiAoIW1hdGNoIHx8IG1hdGNoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdXJpID0gbWF0Y2hbdHlwZW9mIG1hdGNoZXIubWF0Y2hJbmRleCAhPT0gJ251bWJlcicgPyAwIDogbWF0Y2hlci5tYXRjaEluZGV4XTtcbiAgICAgICAgdmFyIHJvd1N0YXJ0SW5kZXggPSBtYXRjaC5pbmRleCArIHVyaS5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07XG4gICAgICAgICAgICB2YXIgc2VhcmNoSW5kZXggPSBub2RlLnRleHRDb250ZW50LmluZGV4T2YodXJpKTtcbiAgICAgICAgICAgIGlmIChzZWFyY2hJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIGxpbmtFbGVtZW50ID0gdGhpcy5fY3JlYXRlQW5jaG9yRWxlbWVudCh1cmksIG1hdGNoZXIuaGFuZGxlciwgaXNIdHRwTGlua01hdGNoZXIpO1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gdXJpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVwbGFjZU5vZGUobm9kZSwgbGlua0VsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBub2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQubm9kZU5hbWUgPT09ICdBJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChsaW5rRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBub2Rlc0FkZGVkID0gdGhpcy5fcmVwbGFjZU5vZGVTdWJzdHJpbmdXaXRoTm9kZShub2RlLCBsaW5rRWxlbWVudCwgdXJpLCBzZWFyY2hJbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gbm9kZXNBZGRlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobGlua0VsZW1lbnQpO1xuICAgICAgICAgICAgICAgIG1hdGNoID0gcm93LnRleHRDb250ZW50LnN1YnN0cmluZyhyb3dTdGFydEluZGV4KS5tYXRjaChtYXRjaGVyLnJlZ2V4KTtcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoIHx8IG1hdGNoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB1cmkgPSBtYXRjaFt0eXBlb2YgbWF0Y2hlci5tYXRjaEluZGV4ICE9PSAnbnVtYmVyJyA/IDAgOiBtYXRjaGVyLm1hdGNoSW5kZXhdO1xuICAgICAgICAgICAgICAgIHJvd1N0YXJ0SW5kZXggKz0gbWF0Y2guaW5kZXggKyB1cmkubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcbiAgICBMaW5raWZpZXIucHJvdG90eXBlLl9jcmVhdGVBbmNob3JFbGVtZW50ID0gZnVuY3Rpb24gKHVyaSwgaGFuZGxlciwgaXNIeXBlcnRleHRMaW5rSGFuZGxlcikge1xuICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IHVyaTtcbiAgICAgICAgZWxlbWVudC5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGlzSHlwZXJ0ZXh0TGlua0hhbmRsZXIpIHtcbiAgICAgICAgICAgIGVsZW1lbnQuaHJlZiA9IHVyaTtcbiAgICAgICAgICAgIGVsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXIoZXZlbnQsIHVyaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKElOVkFMSURfTElOS19DTEFTUykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlcihldmVudCwgdXJpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH07XG4gICAgTGlua2lmaWVyLnByb3RvdHlwZS5fcmVwbGFjZU5vZGUgPSBmdW5jdGlvbiAob2xkTm9kZSkge1xuICAgICAgICB2YXIgbmV3Tm9kZXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIG5ld05vZGVzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYXJlbnQgPSBvbGROb2RlLnBhcmVudE5vZGU7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmV3Tm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUobmV3Tm9kZXNbaV0sIG9sZE5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChvbGROb2RlKTtcbiAgICB9O1xuICAgIExpbmtpZmllci5wcm90b3R5cGUuX3JlcGxhY2VOb2RlU3Vic3RyaW5nV2l0aE5vZGUgPSBmdW5jdGlvbiAodGFyZ2V0Tm9kZSwgbmV3Tm9kZSwgc3Vic3RyaW5nLCBzdWJzdHJpbmdJbmRleCkge1xuICAgICAgICB2YXIgbm9kZSA9IHRhcmdldE5vZGU7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAzKSB7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZE5vZGVzWzBdO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLmNoaWxkTm9kZXMubGVuZ3RoID09PSAwICYmIG5vZGUubm9kZVR5cGUgIT09IDMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndGFyZ2V0Tm9kZSBtdXN0IGJlIGEgdGV4dCBub2RlIG9yIG9ubHkgY29udGFpbiBhIHNpbmdsZSB0ZXh0IG5vZGUnKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZnVsbFRleHQgPSBub2RlLnRleHRDb250ZW50O1xuICAgICAgICBpZiAoc3Vic3RyaW5nSW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHZhciByaWdodFRleHRfMSA9IGZ1bGxUZXh0LnN1YnN0cmluZyhzdWJzdHJpbmcubGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciByaWdodFRleHROb2RlXzEgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShyaWdodFRleHRfMSk7XG4gICAgICAgICAgICB0aGlzLl9yZXBsYWNlTm9kZShub2RlLCBuZXdOb2RlLCByaWdodFRleHROb2RlXzEpO1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1YnN0cmluZ0luZGV4ID09PSB0YXJnZXROb2RlLnRleHRDb250ZW50Lmxlbmd0aCAtIHN1YnN0cmluZy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBsZWZ0VGV4dF8xID0gZnVsbFRleHQuc3Vic3RyaW5nKDAsIHN1YnN0cmluZ0luZGV4KTtcbiAgICAgICAgICAgIHZhciBsZWZ0VGV4dE5vZGVfMSA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxlZnRUZXh0XzEpO1xuICAgICAgICAgICAgdGhpcy5fcmVwbGFjZU5vZGUobm9kZSwgbGVmdFRleHROb2RlXzEsIG5ld05vZGUpO1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxlZnRUZXh0ID0gZnVsbFRleHQuc3Vic3RyaW5nKDAsIHN1YnN0cmluZ0luZGV4KTtcbiAgICAgICAgdmFyIGxlZnRUZXh0Tm9kZSA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxlZnRUZXh0KTtcbiAgICAgICAgdmFyIHJpZ2h0VGV4dCA9IGZ1bGxUZXh0LnN1YnN0cmluZyhzdWJzdHJpbmdJbmRleCArIHN1YnN0cmluZy5sZW5ndGgpO1xuICAgICAgICB2YXIgcmlnaHRUZXh0Tm9kZSA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKHJpZ2h0VGV4dCk7XG4gICAgICAgIHRoaXMuX3JlcGxhY2VOb2RlKG5vZGUsIGxlZnRUZXh0Tm9kZSwgbmV3Tm9kZSwgcmlnaHRUZXh0Tm9kZSk7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH07XG4gICAgcmV0dXJuIExpbmtpZmllcjtcbn0oKSk7XG5MaW5raWZpZXIuVElNRV9CRUZPUkVfTElOS0lGWSA9IDIwMDtcbmV4cG9ydHMuTGlua2lmaWVyID0gTGlua2lmaWVyO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1MaW5raWZpZXIuanMubWFwXG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBFc2NhcGVTZXF1ZW5jZXNfMSA9IHJlcXVpcmUoXCIuL0VzY2FwZVNlcXVlbmNlc1wiKTtcbnZhciBDaGFyc2V0c18xID0gcmVxdWlyZShcIi4vQ2hhcnNldHNcIik7XG52YXIgbm9ybWFsU3RhdGVIYW5kbGVyID0ge307XG5ub3JtYWxTdGF0ZUhhbmRsZXJbRXNjYXBlU2VxdWVuY2VzXzEuQzAuQkVMXSA9IGZ1bmN0aW9uIChwYXJzZXIsIGhhbmRsZXIpIHsgcmV0dXJuIGhhbmRsZXIuYmVsbCgpOyB9O1xubm9ybWFsU3RhdGVIYW5kbGVyW0VzY2FwZVNlcXVlbmNlc18xLkMwLkxGXSA9IGZ1bmN0aW9uIChwYXJzZXIsIGhhbmRsZXIpIHsgcmV0dXJuIGhhbmRsZXIubGluZUZlZWQoKTsgfTtcbm5vcm1hbFN0YXRlSGFuZGxlcltFc2NhcGVTZXF1ZW5jZXNfMS5DMC5WVF0gPSBub3JtYWxTdGF0ZUhhbmRsZXJbRXNjYXBlU2VxdWVuY2VzXzEuQzAuTEZdO1xubm9ybWFsU3RhdGVIYW5kbGVyW0VzY2FwZVNlcXVlbmNlc18xLkMwLkZGXSA9IG5vcm1hbFN0YXRlSGFuZGxlcltFc2NhcGVTZXF1ZW5jZXNfMS5DMC5MRl07XG5ub3JtYWxTdGF0ZUhhbmRsZXJbRXNjYXBlU2VxdWVuY2VzXzEuQzAuQ1JdID0gZnVuY3Rpb24gKHBhcnNlciwgaGFuZGxlcikgeyByZXR1cm4gaGFuZGxlci5jYXJyaWFnZVJldHVybigpOyB9O1xubm9ybWFsU3RhdGVIYW5kbGVyW0VzY2FwZVNlcXVlbmNlc18xLkMwLkJTXSA9IGZ1bmN0aW9uIChwYXJzZXIsIGhhbmRsZXIpIHsgcmV0dXJuIGhhbmRsZXIuYmFja3NwYWNlKCk7IH07XG5ub3JtYWxTdGF0ZUhhbmRsZXJbRXNjYXBlU2VxdWVuY2VzXzEuQzAuSFRdID0gZnVuY3Rpb24gKHBhcnNlciwgaGFuZGxlcikgeyByZXR1cm4gaGFuZGxlci50YWIoKTsgfTtcbm5vcm1hbFN0YXRlSGFuZGxlcltFc2NhcGVTZXF1ZW5jZXNfMS5DMC5TT10gPSBmdW5jdGlvbiAocGFyc2VyLCBoYW5kbGVyKSB7IHJldHVybiBoYW5kbGVyLnNoaWZ0T3V0KCk7IH07XG5ub3JtYWxTdGF0ZUhhbmRsZXJbRXNjYXBlU2VxdWVuY2VzXzEuQzAuU0ldID0gZnVuY3Rpb24gKHBhcnNlciwgaGFuZGxlcikgeyByZXR1cm4gaGFuZGxlci5zaGlmdEluKCk7IH07XG5ub3JtYWxTdGF0ZUhhbmRsZXJbRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDXSA9IGZ1bmN0aW9uIChwYXJzZXIsIGhhbmRsZXIpIHsgcmV0dXJuIHBhcnNlci5zZXRTdGF0ZShQYXJzZXJTdGF0ZS5FU0NBUEVEKTsgfTtcbnZhciBlc2NhcGVkU3RhdGVIYW5kbGVyID0ge307XG5lc2NhcGVkU3RhdGVIYW5kbGVyWydbJ10gPSBmdW5jdGlvbiAocGFyc2VyLCB0ZXJtaW5hbCkge1xuICAgIHRlcm1pbmFsLnBhcmFtcyA9IFtdO1xuICAgIHRlcm1pbmFsLmN1cnJlbnRQYXJhbSA9IDA7XG4gICAgcGFyc2VyLnNldFN0YXRlKFBhcnNlclN0YXRlLkNTSV9QQVJBTSk7XG59O1xuZXNjYXBlZFN0YXRlSGFuZGxlclsnXSddID0gZnVuY3Rpb24gKHBhcnNlciwgdGVybWluYWwpIHtcbiAgICB0ZXJtaW5hbC5wYXJhbXMgPSBbXTtcbiAgICB0ZXJtaW5hbC5jdXJyZW50UGFyYW0gPSAwO1xuICAgIHBhcnNlci5zZXRTdGF0ZShQYXJzZXJTdGF0ZS5PU0MpO1xufTtcbmVzY2FwZWRTdGF0ZUhhbmRsZXJbJ1AnXSA9IGZ1bmN0aW9uIChwYXJzZXIsIHRlcm1pbmFsKSB7XG4gICAgdGVybWluYWwucGFyYW1zID0gW107XG4gICAgdGVybWluYWwuY3VycmVudFBhcmFtID0gMDtcbiAgICBwYXJzZXIuc2V0U3RhdGUoUGFyc2VyU3RhdGUuRENTKTtcbn07XG5lc2NhcGVkU3RhdGVIYW5kbGVyWydfJ10gPSBmdW5jdGlvbiAocGFyc2VyLCB0ZXJtaW5hbCkge1xuICAgIHBhcnNlci5zZXRTdGF0ZShQYXJzZXJTdGF0ZS5JR05PUkUpO1xufTtcbmVzY2FwZWRTdGF0ZUhhbmRsZXJbJ14nXSA9IGZ1bmN0aW9uIChwYXJzZXIsIHRlcm1pbmFsKSB7XG4gICAgcGFyc2VyLnNldFN0YXRlKFBhcnNlclN0YXRlLklHTk9SRSk7XG59O1xuZXNjYXBlZFN0YXRlSGFuZGxlclsnYyddID0gZnVuY3Rpb24gKHBhcnNlciwgdGVybWluYWwpIHtcbiAgICB0ZXJtaW5hbC5yZXNldCgpO1xufTtcbmVzY2FwZWRTdGF0ZUhhbmRsZXJbJ0UnXSA9IGZ1bmN0aW9uIChwYXJzZXIsIHRlcm1pbmFsKSB7XG4gICAgdGVybWluYWwueCA9IDA7XG4gICAgdGVybWluYWwuaW5kZXgoKTtcbiAgICBwYXJzZXIuc2V0U3RhdGUoUGFyc2VyU3RhdGUuTk9STUFMKTtcbn07XG5lc2NhcGVkU3RhdGVIYW5kbGVyWydEJ10gPSBmdW5jdGlvbiAocGFyc2VyLCB0ZXJtaW5hbCkge1xuICAgIHRlcm1pbmFsLmluZGV4KCk7XG4gICAgcGFyc2VyLnNldFN0YXRlKFBhcnNlclN0YXRlLk5PUk1BTCk7XG59O1xuZXNjYXBlZFN0YXRlSGFuZGxlclsnTSddID0gZnVuY3Rpb24gKHBhcnNlciwgdGVybWluYWwpIHtcbiAgICB0ZXJtaW5hbC5yZXZlcnNlSW5kZXgoKTtcbiAgICBwYXJzZXIuc2V0U3RhdGUoUGFyc2VyU3RhdGUuTk9STUFMKTtcbn07XG5lc2NhcGVkU3RhdGVIYW5kbGVyWyclJ10gPSBmdW5jdGlvbiAocGFyc2VyLCB0ZXJtaW5hbCkge1xuICAgIHRlcm1pbmFsLnNldGdMZXZlbCgwKTtcbiAgICB0ZXJtaW5hbC5zZXRnQ2hhcnNldCgwLCBDaGFyc2V0c18xLkRFRkFVTFRfQ0hBUlNFVCk7XG4gICAgcGFyc2VyLnNldFN0YXRlKFBhcnNlclN0YXRlLk5PUk1BTCk7XG4gICAgcGFyc2VyLnNraXBOZXh0Q2hhcigpO1xufTtcbmVzY2FwZWRTdGF0ZUhhbmRsZXJbRXNjYXBlU2VxdWVuY2VzXzEuQzAuQ0FOXSA9IGZ1bmN0aW9uIChwYXJzZXIpIHsgcmV0dXJuIHBhcnNlci5zZXRTdGF0ZShQYXJzZXJTdGF0ZS5OT1JNQUwpOyB9O1xudmFyIGNzaVBhcmFtU3RhdGVIYW5kbGVyID0ge307XG5jc2lQYXJhbVN0YXRlSGFuZGxlclsnPyddID0gZnVuY3Rpb24gKHBhcnNlcikgeyByZXR1cm4gcGFyc2VyLnNldFByZWZpeCgnPycpOyB9O1xuY3NpUGFyYW1TdGF0ZUhhbmRsZXJbJz4nXSA9IGZ1bmN0aW9uIChwYXJzZXIpIHsgcmV0dXJuIHBhcnNlci5zZXRQcmVmaXgoJz4nKTsgfTtcbmNzaVBhcmFtU3RhdGVIYW5kbGVyWychJ10gPSBmdW5jdGlvbiAocGFyc2VyKSB7IHJldHVybiBwYXJzZXIuc2V0UHJlZml4KCchJyk7IH07XG5jc2lQYXJhbVN0YXRlSGFuZGxlclsnMCddID0gZnVuY3Rpb24gKHBhcnNlcikgeyByZXR1cm4gcGFyc2VyLnNldFBhcmFtKHBhcnNlci5nZXRQYXJhbSgpICogMTApOyB9O1xuY3NpUGFyYW1TdGF0ZUhhbmRsZXJbJzEnXSA9IGZ1bmN0aW9uIChwYXJzZXIpIHsgcmV0dXJuIHBhcnNlci5zZXRQYXJhbShwYXJzZXIuZ2V0UGFyYW0oKSAqIDEwICsgMSk7IH07XG5jc2lQYXJhbVN0YXRlSGFuZGxlclsnMiddID0gZnVuY3Rpb24gKHBhcnNlcikgeyByZXR1cm4gcGFyc2VyLnNldFBhcmFtKHBhcnNlci5nZXRQYXJhbSgpICogMTAgKyAyKTsgfTtcbmNzaVBhcmFtU3RhdGVIYW5kbGVyWyczJ10gPSBmdW5jdGlvbiAocGFyc2VyKSB7IHJldHVybiBwYXJzZXIuc2V0UGFyYW0ocGFyc2VyLmdldFBhcmFtKCkgKiAxMCArIDMpOyB9O1xuY3NpUGFyYW1TdGF0ZUhhbmRsZXJbJzQnXSA9IGZ1bmN0aW9uIChwYXJzZXIpIHsgcmV0dXJuIHBhcnNlci5zZXRQYXJhbShwYXJzZXIuZ2V0UGFyYW0oKSAqIDEwICsgNCk7IH07XG5jc2lQYXJhbVN0YXRlSGFuZGxlclsnNSddID0gZnVuY3Rpb24gKHBhcnNlcikgeyByZXR1cm4gcGFyc2VyLnNldFBhcmFtKHBhcnNlci5nZXRQYXJhbSgpICogMTAgKyA1KTsgfTtcbmNzaVBhcmFtU3RhdGVIYW5kbGVyWyc2J10gPSBmdW5jdGlvbiAocGFyc2VyKSB7IHJldHVybiBwYXJzZXIuc2V0UGFyYW0ocGFyc2VyLmdldFBhcmFtKCkgKiAxMCArIDYpOyB9O1xuY3NpUGFyYW1TdGF0ZUhhbmRsZXJbJzcnXSA9IGZ1bmN0aW9uIChwYXJzZXIpIHsgcmV0dXJuIHBhcnNlci5zZXRQYXJhbShwYXJzZXIuZ2V0UGFyYW0oKSAqIDEwICsgNyk7IH07XG5jc2lQYXJhbVN0YXRlSGFuZGxlclsnOCddID0gZnVuY3Rpb24gKHBhcnNlcikgeyByZXR1cm4gcGFyc2VyLnNldFBhcmFtKHBhcnNlci5nZXRQYXJhbSgpICogMTAgKyA4KTsgfTtcbmNzaVBhcmFtU3RhdGVIYW5kbGVyWyc5J10gPSBmdW5jdGlvbiAocGFyc2VyKSB7IHJldHVybiBwYXJzZXIuc2V0UGFyYW0ocGFyc2VyLmdldFBhcmFtKCkgKiAxMCArIDkpOyB9O1xuY3NpUGFyYW1TdGF0ZUhhbmRsZXJbJyQnXSA9IGZ1bmN0aW9uIChwYXJzZXIpIHsgcmV0dXJuIHBhcnNlci5zZXRQb3N0Zml4KCckJyk7IH07XG5jc2lQYXJhbVN0YXRlSGFuZGxlclsnXCInXSA9IGZ1bmN0aW9uIChwYXJzZXIpIHsgcmV0dXJuIHBhcnNlci5zZXRQb3N0Zml4KCdcIicpOyB9O1xuY3NpUGFyYW1TdGF0ZUhhbmRsZXJbJyAnXSA9IGZ1bmN0aW9uIChwYXJzZXIpIHsgcmV0dXJuIHBhcnNlci5zZXRQb3N0Zml4KCcgJyk7IH07XG5jc2lQYXJhbVN0YXRlSGFuZGxlclsnXFwnJ10gPSBmdW5jdGlvbiAocGFyc2VyKSB7IHJldHVybiBwYXJzZXIuc2V0UG9zdGZpeCgnXFwnJyk7IH07XG5jc2lQYXJhbVN0YXRlSGFuZGxlclsnOyddID0gZnVuY3Rpb24gKHBhcnNlcikgeyByZXR1cm4gcGFyc2VyLmZpbmFsaXplUGFyYW0oKTsgfTtcbmNzaVBhcmFtU3RhdGVIYW5kbGVyW0VzY2FwZVNlcXVlbmNlc18xLkMwLkNBTl0gPSBmdW5jdGlvbiAocGFyc2VyKSB7IHJldHVybiBwYXJzZXIuc2V0U3RhdGUoUGFyc2VyU3RhdGUuTk9STUFMKTsgfTtcbnZhciBjc2lTdGF0ZUhhbmRsZXIgPSB7fTtcbmNzaVN0YXRlSGFuZGxlclsnQCddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7IHJldHVybiBoYW5kbGVyLmluc2VydENoYXJzKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ0EnXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5jdXJzb3JVcChwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWydCJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHsgcmV0dXJuIGhhbmRsZXIuY3Vyc29yRG93bihwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWydDJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHsgcmV0dXJuIGhhbmRsZXIuY3Vyc29yRm9yd2FyZChwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWydEJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHsgcmV0dXJuIGhhbmRsZXIuY3Vyc29yQmFja3dhcmQocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlclsnRSddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7IHJldHVybiBoYW5kbGVyLmN1cnNvck5leHRMaW5lKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ0YnXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5jdXJzb3JQcmVjZWRpbmdMaW5lKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ0cnXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5jdXJzb3JDaGFyQWJzb2x1dGUocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlclsnSCddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7IHJldHVybiBoYW5kbGVyLmN1cnNvclBvc2l0aW9uKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ0knXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5jdXJzb3JGb3J3YXJkVGFiKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ0onXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5lcmFzZUluRGlzcGxheShwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWydLJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHsgcmV0dXJuIGhhbmRsZXIuZXJhc2VJbkxpbmUocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlclsnTCddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7IHJldHVybiBoYW5kbGVyLmluc2VydExpbmVzKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ00nXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5kZWxldGVMaW5lcyhwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWydQJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHsgcmV0dXJuIGhhbmRsZXIuZGVsZXRlQ2hhcnMocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlclsnUyddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7IHJldHVybiBoYW5kbGVyLnNjcm9sbFVwKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ1QnXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkge1xuICAgIGlmIChwYXJhbXMubGVuZ3RoIDwgMiAmJiAhcHJlZml4KSB7XG4gICAgICAgIGhhbmRsZXIuc2Nyb2xsRG93bihwYXJhbXMpO1xuICAgIH1cbn07XG5jc2lTdGF0ZUhhbmRsZXJbJ1gnXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5lcmFzZUNoYXJzKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ1onXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5jdXJzb3JCYWNrd2FyZFRhYihwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWydgJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHsgcmV0dXJuIGhhbmRsZXIuY2hhclBvc0Fic29sdXRlKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ2EnXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5IUG9zaXRpb25SZWxhdGl2ZShwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWydiJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHsgcmV0dXJuIGhhbmRsZXIucmVwZWF0UHJlY2VkaW5nQ2hhcmFjdGVyKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ2MnXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5zZW5kRGV2aWNlQXR0cmlidXRlcyhwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWydkJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHsgcmV0dXJuIGhhbmRsZXIubGluZVBvc0Fic29sdXRlKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ2UnXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5WUG9zaXRpb25SZWxhdGl2ZShwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWydmJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHsgcmV0dXJuIGhhbmRsZXIuSFZQb3NpdGlvbihwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWydnJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHsgcmV0dXJuIGhhbmRsZXIudGFiQ2xlYXIocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlclsnaCddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7IHJldHVybiBoYW5kbGVyLnNldE1vZGUocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlclsnbCddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7IHJldHVybiBoYW5kbGVyLnJlc2V0TW9kZShwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWydtJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHsgcmV0dXJuIGhhbmRsZXIuY2hhckF0dHJpYnV0ZXMocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlclsnbiddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7IHJldHVybiBoYW5kbGVyLmRldmljZVN0YXR1cyhwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWydwJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHtcbiAgICBzd2l0Y2ggKHByZWZpeCkge1xuICAgICAgICBjYXNlICchJzpcbiAgICAgICAgICAgIGhhbmRsZXIuc29mdFJlc2V0KHBhcmFtcyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG59O1xuY3NpU3RhdGVIYW5kbGVyWydxJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgsIHBvc3RmaXgpIHtcbiAgICBpZiAocG9zdGZpeCA9PT0gJyAnKSB7XG4gICAgICAgIGhhbmRsZXIuc2V0Q3Vyc29yU3R5bGUocGFyYW1zKTtcbiAgICB9XG59O1xuY3NpU3RhdGVIYW5kbGVyWydyJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zKSB7IHJldHVybiBoYW5kbGVyLnNldFNjcm9sbFJlZ2lvbihwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWydzJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zKSB7IHJldHVybiBoYW5kbGVyLnNhdmVDdXJzb3IocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlclsndSddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcykgeyByZXR1cm4gaGFuZGxlci5yZXN0b3JlQ3Vyc29yKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbRXNjYXBlU2VxdWVuY2VzXzEuQzAuQ0FOXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCwgcG9zdGZpeCwgcGFyc2VyKSB7IHJldHVybiBwYXJzZXIuc2V0U3RhdGUoUGFyc2VyU3RhdGUuTk9STUFMKTsgfTtcbnZhciBQYXJzZXJTdGF0ZTtcbihmdW5jdGlvbiAoUGFyc2VyU3RhdGUpIHtcbiAgICBQYXJzZXJTdGF0ZVtQYXJzZXJTdGF0ZVtcIk5PUk1BTFwiXSA9IDBdID0gXCJOT1JNQUxcIjtcbiAgICBQYXJzZXJTdGF0ZVtQYXJzZXJTdGF0ZVtcIkVTQ0FQRURcIl0gPSAxXSA9IFwiRVNDQVBFRFwiO1xuICAgIFBhcnNlclN0YXRlW1BhcnNlclN0YXRlW1wiQ1NJX1BBUkFNXCJdID0gMl0gPSBcIkNTSV9QQVJBTVwiO1xuICAgIFBhcnNlclN0YXRlW1BhcnNlclN0YXRlW1wiQ1NJXCJdID0gM10gPSBcIkNTSVwiO1xuICAgIFBhcnNlclN0YXRlW1BhcnNlclN0YXRlW1wiT1NDXCJdID0gNF0gPSBcIk9TQ1wiO1xuICAgIFBhcnNlclN0YXRlW1BhcnNlclN0YXRlW1wiQ0hBUlNFVFwiXSA9IDVdID0gXCJDSEFSU0VUXCI7XG4gICAgUGFyc2VyU3RhdGVbUGFyc2VyU3RhdGVbXCJEQ1NcIl0gPSA2XSA9IFwiRENTXCI7XG4gICAgUGFyc2VyU3RhdGVbUGFyc2VyU3RhdGVbXCJJR05PUkVcIl0gPSA3XSA9IFwiSUdOT1JFXCI7XG59KShQYXJzZXJTdGF0ZSB8fCAoUGFyc2VyU3RhdGUgPSB7fSkpO1xudmFyIFBhcnNlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGFyc2VyKF9pbnB1dEhhbmRsZXIsIF90ZXJtaW5hbCkge1xuICAgICAgICB0aGlzLl9pbnB1dEhhbmRsZXIgPSBfaW5wdXRIYW5kbGVyO1xuICAgICAgICB0aGlzLl90ZXJtaW5hbCA9IF90ZXJtaW5hbDtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBQYXJzZXJTdGF0ZS5OT1JNQUw7XG4gICAgfVxuICAgIFBhcnNlci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB2YXIgbCA9IGRhdGEubGVuZ3RoLCBqLCBjcywgY2gsIGNvZGUsIGxvdztcbiAgICAgICAgdGhpcy5fcG9zaXRpb24gPSAwO1xuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwuc3Vycm9nYXRlX2hpZ2gpIHtcbiAgICAgICAgICAgIGRhdGEgPSB0aGlzLl90ZXJtaW5hbC5zdXJyb2dhdGVfaGlnaCArIGRhdGE7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zdXJyb2dhdGVfaGlnaCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOyB0aGlzLl9wb3NpdGlvbiA8IGw7IHRoaXMuX3Bvc2l0aW9uKyspIHtcbiAgICAgICAgICAgIGNoID0gZGF0YVt0aGlzLl9wb3NpdGlvbl07XG4gICAgICAgICAgICBjb2RlID0gZGF0YS5jaGFyQ29kZUF0KHRoaXMuX3Bvc2l0aW9uKTtcbiAgICAgICAgICAgIGlmICgweEQ4MDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4REJGRikge1xuICAgICAgICAgICAgICAgIGxvdyA9IGRhdGEuY2hhckNvZGVBdCh0aGlzLl9wb3NpdGlvbiArIDEpO1xuICAgICAgICAgICAgICAgIGlmIChpc05hTihsb3cpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnN1cnJvZ2F0ZV9oaWdoID0gY2g7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb2RlID0gKChjb2RlIC0gMHhEODAwKSAqIDB4NDAwKSArIChsb3cgLSAweERDMDApICsgMHgxMDAwMDtcbiAgICAgICAgICAgICAgICBjaCArPSBkYXRhLmNoYXJBdCh0aGlzLl9wb3NpdGlvbiArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKDB4REMwMCA8PSBjb2RlICYmIGNvZGUgPD0gMHhERkZGKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLl9zdGF0ZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgUGFyc2VyU3RhdGUuTk9STUFMOlxuICAgICAgICAgICAgICAgICAgICBpZiAoY2ggaW4gbm9ybWFsU3RhdGVIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxTdGF0ZUhhbmRsZXJbY2hdKHRoaXMsIHRoaXMuX2lucHV0SGFuZGxlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dEhhbmRsZXIuYWRkQ2hhcihjaCwgY29kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBQYXJzZXJTdGF0ZS5FU0NBUEVEOlxuICAgICAgICAgICAgICAgICAgICBpZiAoY2ggaW4gZXNjYXBlZFN0YXRlSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFN0YXRlSGFuZGxlcltjaF0odGhpcywgdGhpcy5fdGVybWluYWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKCc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcpJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyonOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICctJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy4nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5nY2hhcnNldCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5nY2hhcnNldCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5nY2hhcnNldCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5nY2hhcnNldCA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5nY2hhcnNldCA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5nY2hhcnNldCA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSBQYXJzZXJTdGF0ZS5DSEFSU0VUO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuZ2NoYXJzZXQgPSAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gUGFyc2VyU3RhdGUuQ0hBUlNFVDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3NpdGlvbi0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdPJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ24nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNldGdMZXZlbCgyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ28nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNldGdMZXZlbCgzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3wnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNldGdMZXZlbCgzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ30nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNldGdMZXZlbCgyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ34nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNldGdMZXZlbCgxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0SGFuZGxlci5zYXZlQ3Vyc29yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSBQYXJzZXJTdGF0ZS5OT1JNQUw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc4JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dEhhbmRsZXIucmVzdG9yZUN1cnNvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gUGFyc2VyU3RhdGUuTk9STUFMO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnIyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSBQYXJzZXJTdGF0ZS5OT1JNQUw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcG9zaXRpb24rKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0gnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnRhYlNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gUGFyc2VyU3RhdGUuTk9STUFMO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubG9nKCdTZXJpYWwgcG9ydCByZXF1ZXN0ZWQgYXBwbGljYXRpb24ga2V5cGFkLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmFwcGxpY2F0aW9uS2V5cGFkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC52aWV3cG9ydC5zeW5jU2Nyb2xsQXJlYSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gUGFyc2VyU3RhdGUuTk9STUFMO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubG9nKCdTd2l0Y2hpbmcgYmFjayB0byBub3JtYWwga2V5cGFkLicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmFwcGxpY2F0aW9uS2V5cGFkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwudmlld3BvcnQuc3luY1Njcm9sbEFyZWEoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IFBhcnNlclN0YXRlLk5PUk1BTDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSBQYXJzZXJTdGF0ZS5OT1JNQUw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuZXJyb3IoJ1Vua25vd24gRVNDIGNvbnRyb2w6ICVzLicsIGNoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFBhcnNlclN0YXRlLkNIQVJTRVQ6XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaCBpbiBDaGFyc2V0c18xLkNIQVJTRVRTKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcyA9IENoYXJzZXRzXzEuQ0hBUlNFVFNbY2hdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSAnLycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNraXBOZXh0Q2hhcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3MgPSBDaGFyc2V0c18xLkRFRkFVTFRfQ0hBUlNFVDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zZXRnQ2hhcnNldCh0aGlzLl90ZXJtaW5hbC5nY2hhcnNldCwgY3MpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5nY2hhcnNldCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gUGFyc2VyU3RhdGUuTk9STUFMO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFBhcnNlclN0YXRlLk9TQzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgfHwgY2ggPT09IEVzY2FwZVNlcXVlbmNlc18xLkMwLkJFTCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcG9zaXRpb24rKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnBhcmFtcy5wdXNoKHRoaXMuX3Rlcm1pbmFsLmN1cnJlbnRQYXJhbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX3Rlcm1pbmFsLnBhcmFtc1swXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGVybWluYWwucGFyYW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC50aXRsZSA9IHRoaXMuX3Rlcm1pbmFsLnBhcmFtc1sxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmhhbmRsZVRpdGxlKHRoaXMuX3Rlcm1pbmFsLnRpdGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTk6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA1OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTEwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTExOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTEyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTEzOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE1OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE2OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE3OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTE4OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnBhcmFtcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuY3VycmVudFBhcmFtID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gUGFyc2VyU3RhdGUuTk9STUFMO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl90ZXJtaW5hbC5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuY3VycmVudFBhcmFtID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmN1cnJlbnRQYXJhbSAqIDEwICsgY2guY2hhckNvZGVBdCgwKSAtIDQ4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gJzsnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnBhcmFtcy5wdXNoKHRoaXMuX3Rlcm1pbmFsLmN1cnJlbnRQYXJhbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmN1cnJlbnRQYXJhbSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmN1cnJlbnRQYXJhbSArPSBjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFBhcnNlclN0YXRlLkNTSV9QQVJBTTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoIGluIGNzaVBhcmFtU3RhdGVIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjc2lQYXJhbVN0YXRlSGFuZGxlcltjaF0odGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmFsaXplUGFyYW0oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSBQYXJzZXJTdGF0ZS5DU0k7XG4gICAgICAgICAgICAgICAgY2FzZSBQYXJzZXJTdGF0ZS5DU0k6XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaCBpbiBjc2lTdGF0ZUhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzaVN0YXRlSGFuZGxlcltjaF0odGhpcy5faW5wdXRIYW5kbGVyLCB0aGlzLl90ZXJtaW5hbC5wYXJhbXMsIHRoaXMuX3Rlcm1pbmFsLnByZWZpeCwgdGhpcy5fdGVybWluYWwucG9zdGZpeCwgdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5lcnJvcignVW5rbm93biBDU0kgY29kZTogJXMuJywgY2gpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gUGFyc2VyU3RhdGUuTk9STUFMO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5wcmVmaXggPSAnJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwucG9zdGZpeCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFBhcnNlclN0YXRlLkRDUzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgfHwgY2ggPT09IEVzY2FwZVNlcXVlbmNlc18xLkMwLkJFTCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09PSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcG9zaXRpb24rKztcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fdGVybWluYWwucHJlZml4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnJHEnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHQgPSB0aGlzLl90ZXJtaW5hbC5jdXJyZW50UGFyYW0sIHZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1wicSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQgPSAnMFwicSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcInAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ID0gJzYxXCJwJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ID0gJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAodGhpcy5fdGVybWluYWwuc2Nyb2xsVG9wICsgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAnOydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAodGhpcy5fdGVybWluYWwuc2Nyb2xsQm90dG9tICsgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAncic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdCA9ICcwbSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmVycm9yKCdVbmtub3duIERDUyBQdDogJXMuJywgcHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2VuZChFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnUCcgKyArdmFsaWQgKyAnJHInICsgcHQgKyBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnXFxcXCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcrcCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJytxJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQgPSB0aGlzLl90ZXJtaW5hbC5jdXJyZW50UGFyYW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2VuZChFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnUCcgKyArdmFsaWQgKyAnK3InICsgcHQgKyBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnXFxcXCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5lcnJvcignVW5rbm93biBEQ1MgcHJlZml4OiAlcy4nLCB0aGlzLl90ZXJtaW5hbC5wcmVmaXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmN1cnJlbnRQYXJhbSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5wcmVmaXggPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gUGFyc2VyU3RhdGUuTk9STUFMO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLl90ZXJtaW5hbC5jdXJyZW50UGFyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fdGVybWluYWwucHJlZml4ICYmIGNoICE9PSAnJCcgJiYgY2ggIT09ICcrJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmN1cnJlbnRQYXJhbSA9IGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fdGVybWluYWwucHJlZml4Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmN1cnJlbnRQYXJhbSA9IGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwucHJlZml4ICs9IGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuY3VycmVudFBhcmFtICs9IGNoO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgUGFyc2VyU3RhdGUuSUdOT1JFOlxuICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyB8fCBjaCA9PT0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuQkVMKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3NpdGlvbisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSBQYXJzZXJTdGF0ZS5OT1JNQUw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFBhcnNlci5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcbiAgICB9O1xuICAgIFBhcnNlci5wcm90b3R5cGUuc2V0UHJlZml4ID0gZnVuY3Rpb24gKHByZWZpeCkge1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC5wcmVmaXggPSBwcmVmaXg7XG4gICAgfTtcbiAgICBQYXJzZXIucHJvdG90eXBlLnNldFBvc3RmaXggPSBmdW5jdGlvbiAocG9zdGZpeCkge1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC5wb3N0Zml4ID0gcG9zdGZpeDtcbiAgICB9O1xuICAgIFBhcnNlci5wcm90b3R5cGUuc2V0UGFyYW0gPSBmdW5jdGlvbiAocGFyYW0pIHtcbiAgICAgICAgdGhpcy5fdGVybWluYWwuY3VycmVudFBhcmFtID0gcGFyYW07XG4gICAgfTtcbiAgICBQYXJzZXIucHJvdG90eXBlLmdldFBhcmFtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGVybWluYWwuY3VycmVudFBhcmFtO1xuICAgIH07XG4gICAgUGFyc2VyLnByb3RvdHlwZS5maW5hbGl6ZVBhcmFtID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC5wYXJhbXMucHVzaCh0aGlzLl90ZXJtaW5hbC5jdXJyZW50UGFyYW0pO1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC5jdXJyZW50UGFyYW0gPSAwO1xuICAgIH07XG4gICAgUGFyc2VyLnByb3RvdHlwZS5za2lwTmV4dENoYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uKys7XG4gICAgfTtcbiAgICByZXR1cm4gUGFyc2VyO1xufSgpKTtcbmV4cG9ydHMuUGFyc2VyID0gUGFyc2VyO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1QYXJzZXIuanMubWFwXG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBNQVhfUkVGUkVTSF9GUkFNRV9TS0lQID0gNTtcbnZhciBGTEFHUztcbihmdW5jdGlvbiAoRkxBR1MpIHtcbiAgICBGTEFHU1tGTEFHU1tcIkJPTERcIl0gPSAxXSA9IFwiQk9MRFwiO1xuICAgIEZMQUdTW0ZMQUdTW1wiVU5ERVJMSU5FXCJdID0gMl0gPSBcIlVOREVSTElORVwiO1xuICAgIEZMQUdTW0ZMQUdTW1wiQkxJTktcIl0gPSA0XSA9IFwiQkxJTktcIjtcbiAgICBGTEFHU1tGTEFHU1tcIklOVkVSU0VcIl0gPSA4XSA9IFwiSU5WRVJTRVwiO1xuICAgIEZMQUdTW0ZMQUdTW1wiSU5WSVNJQkxFXCJdID0gMTZdID0gXCJJTlZJU0lCTEVcIjtcbn0pKEZMQUdTIHx8IChGTEFHUyA9IHt9KSk7XG47XG52YXIgYnJva2VuQm9sZCA9IG51bGw7XG52YXIgUmVuZGVyZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFJlbmRlcmVyKF90ZXJtaW5hbCkge1xuICAgICAgICB0aGlzLl90ZXJtaW5hbCA9IF90ZXJtaW5hbDtcbiAgICAgICAgdGhpcy5fcmVmcmVzaFJvd3NRdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLl9yZWZyZXNoRnJhbWVzU2tpcHBlZCA9IDA7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hBbmltYXRpb25GcmFtZSA9IG51bGw7XG4gICAgICAgIGlmIChicm9rZW5Cb2xkID09PSBudWxsKSB7XG4gICAgICAgICAgICBicm9rZW5Cb2xkID0gY2hlY2tCb2xkQnJva2VuKHRoaXMuX3Rlcm1pbmFsLmVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFJlbmRlcmVyLnByb3RvdHlwZS5xdWV1ZVJlZnJlc2ggPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICAgICAgICB0aGlzLl9yZWZyZXNoUm93c1F1ZXVlLnB1c2goeyBzdGFydDogc3RhcnQsIGVuZDogZW5kIH0pO1xuICAgICAgICBpZiAoIXRoaXMuX3JlZnJlc2hBbmltYXRpb25GcmFtZSkge1xuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9yZWZyZXNoTG9vcC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVuZGVyZXIucHJvdG90eXBlLl9yZWZyZXNoTG9vcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHNraXBGcmFtZSA9IHRoaXMuX3Rlcm1pbmFsLndyaXRlQnVmZmVyLmxlbmd0aCA+IDAgJiYgdGhpcy5fcmVmcmVzaEZyYW1lc1NraXBwZWQrKyA8PSBNQVhfUkVGUkVTSF9GUkFNRV9TS0lQO1xuICAgICAgICBpZiAoc2tpcEZyYW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWZyZXNoQW5pbWF0aW9uRnJhbWUgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZnJlc2hMb29wLmJpbmQodGhpcykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlZnJlc2hGcmFtZXNTa2lwcGVkID0gMDtcbiAgICAgICAgdmFyIHN0YXJ0O1xuICAgICAgICB2YXIgZW5kO1xuICAgICAgICBpZiAodGhpcy5fcmVmcmVzaFJvd3NRdWV1ZS5sZW5ndGggPiA0KSB7XG4gICAgICAgICAgICBzdGFydCA9IDA7XG4gICAgICAgICAgICBlbmQgPSB0aGlzLl90ZXJtaW5hbC5yb3dzIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5fcmVmcmVzaFJvd3NRdWV1ZVswXS5zdGFydDtcbiAgICAgICAgICAgIGVuZCA9IHRoaXMuX3JlZnJlc2hSb3dzUXVldWVbMF0uZW5kO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLl9yZWZyZXNoUm93c1F1ZXVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3JlZnJlc2hSb3dzUXVldWVbaV0uc3RhcnQgPCBzdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHRoaXMuX3JlZnJlc2hSb3dzUXVldWVbaV0uc3RhcnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yZWZyZXNoUm93c1F1ZXVlW2ldLmVuZCA+IGVuZCkge1xuICAgICAgICAgICAgICAgICAgICBlbmQgPSB0aGlzLl9yZWZyZXNoUm93c1F1ZXVlW2ldLmVuZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVmcmVzaFJvd3NRdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLl9yZWZyZXNoQW5pbWF0aW9uRnJhbWUgPSBudWxsO1xuICAgICAgICB0aGlzLl9yZWZyZXNoKHN0YXJ0LCBlbmQpO1xuICAgIH07XG4gICAgUmVuZGVyZXIucHJvdG90eXBlLl9yZWZyZXNoID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgdmFyIHgsIHksIGksIGxpbmUsIG91dCwgY2gsIGNoX3dpZHRoLCB3aWR0aCwgZGF0YSwgYXR0ciwgYmcsIGZnLCBmbGFncywgcm93LCBwYXJlbnQsIGZvY3VzZWQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgICBpZiAoZW5kIC0gc3RhcnQgPj0gdGhpcy5fdGVybWluYWwucm93cyAvIDIpIHtcbiAgICAgICAgICAgIHBhcmVudCA9IHRoaXMuX3Rlcm1pbmFsLmVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5lbGVtZW50LnJlbW92ZUNoaWxkKHRoaXMuX3Rlcm1pbmFsLnJvd0NvbnRhaW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd2lkdGggPSB0aGlzLl90ZXJtaW5hbC5jb2xzO1xuICAgICAgICB5ID0gc3RhcnQ7XG4gICAgICAgIGlmIChlbmQgPj0gdGhpcy5fdGVybWluYWwucm93cykge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubG9nKCdgZW5kYCBpcyB0b28gbGFyZ2UuIE1vc3QgbGlrZWx5IGEgYmFkIENTUi4nKTtcbiAgICAgICAgICAgIGVuZCA9IHRoaXMuX3Rlcm1pbmFsLnJvd3MgLSAxO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOyB5IDw9IGVuZDsgeSsrKSB7XG4gICAgICAgICAgICByb3cgPSB5ICsgdGhpcy5fdGVybWluYWwueWRpc3A7XG4gICAgICAgICAgICBsaW5lID0gdGhpcy5fdGVybWluYWwubGluZXMuZ2V0KHJvdyk7XG4gICAgICAgICAgICBpZiAoIWxpbmUgfHwgIXRoaXMuX3Rlcm1pbmFsLmNoaWxkcmVuW3ldKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXQgPSAnJztcbiAgICAgICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC55ID09PSB5IC0gKHRoaXMuX3Rlcm1pbmFsLnliYXNlIC0gdGhpcy5fdGVybWluYWwueWRpc3ApXG4gICAgICAgICAgICAgICAgJiYgdGhpcy5fdGVybWluYWwuY3Vyc29yU3RhdGVcbiAgICAgICAgICAgICAgICAmJiAhdGhpcy5fdGVybWluYWwuY3Vyc29ySGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgeCA9IHRoaXMuX3Rlcm1pbmFsLng7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB4ID0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhdHRyID0gdGhpcy5fdGVybWluYWwuZGVmQXR0cjtcbiAgICAgICAgICAgIGkgPSAwO1xuICAgICAgICAgICAgZm9yICg7IGkgPCB3aWR0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFsaW5lW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkYXRhID0gbGluZVtpXVswXTtcbiAgICAgICAgICAgICAgICBjaCA9IGxpbmVbaV1bMV07XG4gICAgICAgICAgICAgICAgY2hfd2lkdGggPSBsaW5lW2ldWzJdO1xuICAgICAgICAgICAgICAgIGlmICghY2hfd2lkdGgpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlmIChpID09PSB4KVxuICAgICAgICAgICAgICAgICAgICBkYXRhID0gLTE7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEgIT09IGF0dHIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIgIT09IHRoaXMuX3Rlcm1pbmFsLmRlZkF0dHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnPC9zcGFuPic7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgIT09IHRoaXMuX3Rlcm1pbmFsLmRlZkF0dHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnPHNwYW4gY2xhc3M9XCJyZXZlcnNlLXZpZGVvIHRlcm1pbmFsLWN1cnNvclwiPic7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnID0gZGF0YSAmIDB4MWZmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZnID0gKGRhdGEgPj4gOSkgJiAweDFmZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IGRhdGEgPj4gMTg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRkxBR1MuQk9MRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJyb2tlbkJvbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZXMucHVzaCgneHRlcm0tYm9sZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZyA8IDgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZyArPSA4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGTEFHUy5VTkRFUkxJTkUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCd4dGVybS11bmRlcmxpbmUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRkxBR1MuQkxJTkspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCd4dGVybS1ibGluaycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGTEFHUy5JTlZFUlNFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnID0gW2ZnLCBmZyA9IGJnXVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmIDEpICYmIGZnIDwgOClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZnICs9IDg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIEZMQUdTLklOVklTSUJMRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWVzLnB1c2goJ3h0ZXJtLWhpZGRlbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGTEFHUy5JTlZFUlNFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiZyA9PT0gMjU3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZyA9IDE1O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZyA9PT0gMjU2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZyA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJnIDwgMjU2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZXMucHVzaCgneHRlcm0tYmctY29sb3ItJyArIGJnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZnIDwgMjU2KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZXMucHVzaCgneHRlcm0tY29sb3ItJyArIGZnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICc8c3Bhbic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnIGNsYXNzPVwiJyArIGNsYXNzTmFtZXMuam9pbignICcpICsgJ1wiJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICc+JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2hfd2lkdGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICc8c3BhbiBjbGFzcz1cInh0ZXJtLXdpZGUtY2hhclwiPic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN3aXRjaCAoY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnJic6XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJyZhbXA7JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICc8JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnJmx0Oyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJyZndDsnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPD0gJyAnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcmbmJzcDsnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9IGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjaF93aWR0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJzwvc3Bhbj4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBhdHRyID0gZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhdHRyICE9PSB0aGlzLl90ZXJtaW5hbC5kZWZBdHRyKSB7XG4gICAgICAgICAgICAgICAgb3V0ICs9ICc8L3NwYW4+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmNoaWxkcmVuW3ldLmlubmVySFRNTCA9IG91dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX3Rlcm1pbmFsLnJvd0NvbnRhaW5lcik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGVybWluYWwuZW1pdCgncmVmcmVzaCcsIHsgZWxlbWVudDogdGhpcy5fdGVybWluYWwuZWxlbWVudCwgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9KTtcbiAgICB9O1xuICAgIDtcbiAgICByZXR1cm4gUmVuZGVyZXI7XG59KCkpO1xuZXhwb3J0cy5SZW5kZXJlciA9IFJlbmRlcmVyO1xuZnVuY3Rpb24gY2hlY2tCb2xkQnJva2VuKHRlcm1pbmFsKSB7XG4gICAgdmFyIGRvY3VtZW50ID0gdGVybWluYWwub3duZXJEb2N1bWVudDtcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgZWwuaW5uZXJIVE1MID0gJ2hlbGxvIHdvcmxkJztcbiAgICB0ZXJtaW5hbC5hcHBlbmRDaGlsZChlbCk7XG4gICAgdmFyIHcxID0gZWwub2Zmc2V0V2lkdGg7XG4gICAgdmFyIGgxID0gZWwub2Zmc2V0SGVpZ2h0O1xuICAgIGVsLnN0eWxlLmZvbnRXZWlnaHQgPSAnYm9sZCc7XG4gICAgdmFyIHcyID0gZWwub2Zmc2V0V2lkdGg7XG4gICAgdmFyIGgyID0gZWwub2Zmc2V0SGVpZ2h0O1xuICAgIHRlcm1pbmFsLnJlbW92ZUNoaWxkKGVsKTtcbiAgICByZXR1cm4gdzEgIT09IHcyIHx8IGgxICE9PSBoMjtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UmVuZGVyZXIuanMubWFwXG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBWaWV3cG9ydCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVmlld3BvcnQodGVybWluYWwsIHZpZXdwb3J0RWxlbWVudCwgc2Nyb2xsQXJlYSwgY2hhck1lYXN1cmUpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdGhpcy50ZXJtaW5hbCA9IHRlcm1pbmFsO1xuICAgICAgICB0aGlzLnZpZXdwb3J0RWxlbWVudCA9IHZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgdGhpcy5zY3JvbGxBcmVhID0gc2Nyb2xsQXJlYTtcbiAgICAgICAgdGhpcy5jaGFyTWVhc3VyZSA9IGNoYXJNZWFzdXJlO1xuICAgICAgICB0aGlzLmN1cnJlbnRSb3dIZWlnaHQgPSAwO1xuICAgICAgICB0aGlzLmxhc3RSZWNvcmRlZEJ1ZmZlckxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMubGFzdFJlY29yZGVkVmlld3BvcnRIZWlnaHQgPSAwO1xuICAgICAgICB0aGlzLnRlcm1pbmFsLm9uKCdzY3JvbGwnLCB0aGlzLnN5bmNTY3JvbGxBcmVhLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLnRlcm1pbmFsLm9uKCdyZXNpemUnLCB0aGlzLnN5bmNTY3JvbGxBcmVhLmJpbmQodGhpcykpO1xuICAgICAgICB0aGlzLnZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLm9uU2Nyb2xsLmJpbmQodGhpcykpO1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLnN5bmNTY3JvbGxBcmVhKCk7IH0sIDApO1xuICAgIH1cbiAgICBWaWV3cG9ydC5wcm90b3R5cGUucmVmcmVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuY2hhck1lYXN1cmUuaGVpZ2h0ID4gMCkge1xuICAgICAgICAgICAgdmFyIHJvd0hlaWdodENoYW5nZWQgPSB0aGlzLmNoYXJNZWFzdXJlLmhlaWdodCAhPT0gdGhpcy5jdXJyZW50Um93SGVpZ2h0O1xuICAgICAgICAgICAgaWYgKHJvd0hlaWdodENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRSb3dIZWlnaHQgPSB0aGlzLmNoYXJNZWFzdXJlLmhlaWdodDtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdwb3J0RWxlbWVudC5zdHlsZS5saW5lSGVpZ2h0ID0gdGhpcy5jaGFyTWVhc3VyZS5oZWlnaHQgKyAncHgnO1xuICAgICAgICAgICAgICAgIHRoaXMudGVybWluYWwucm93Q29udGFpbmVyLnN0eWxlLmxpbmVIZWlnaHQgPSB0aGlzLmNoYXJNZWFzdXJlLmhlaWdodCArICdweCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdmlld3BvcnRIZWlnaHRDaGFuZ2VkID0gdGhpcy5sYXN0UmVjb3JkZWRWaWV3cG9ydEhlaWdodCAhPT0gdGhpcy50ZXJtaW5hbC5yb3dzO1xuICAgICAgICAgICAgaWYgKHJvd0hlaWdodENoYW5nZWQgfHwgdmlld3BvcnRIZWlnaHRDaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0UmVjb3JkZWRWaWV3cG9ydEhlaWdodCA9IHRoaXMudGVybWluYWwucm93cztcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdwb3J0RWxlbWVudC5zdHlsZS5oZWlnaHQgPSB0aGlzLmNoYXJNZWFzdXJlLmhlaWdodCAqIHRoaXMudGVybWluYWwucm93cyArICdweCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEFyZWEuc3R5bGUuaGVpZ2h0ID0gKHRoaXMuY2hhck1lYXN1cmUuaGVpZ2h0ICogdGhpcy5sYXN0UmVjb3JkZWRCdWZmZXJMZW5ndGgpICsgJ3B4JztcbiAgICAgICAgfVxuICAgIH07XG4gICAgVmlld3BvcnQucHJvdG90eXBlLnN5bmNTY3JvbGxBcmVhID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5sYXN0UmVjb3JkZWRCdWZmZXJMZW5ndGggIT09IHRoaXMudGVybWluYWwubGluZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmxhc3RSZWNvcmRlZEJ1ZmZlckxlbmd0aCA9IHRoaXMudGVybWluYWwubGluZXMubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5sYXN0UmVjb3JkZWRWaWV3cG9ydEhlaWdodCAhPT0gdGhpcy50ZXJtaW5hbC5yb3dzKSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNoYXJNZWFzdXJlLmhlaWdodCAhPT0gdGhpcy5jdXJyZW50Um93SGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHNjcm9sbFRvcCA9IHRoaXMudGVybWluYWwueWRpc3AgKiB0aGlzLmN1cnJlbnRSb3dIZWlnaHQ7XG4gICAgICAgIGlmICh0aGlzLnZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3AgIT09IHNjcm9sbFRvcCkge1xuICAgICAgICAgICAgdGhpcy52aWV3cG9ydEVsZW1lbnQuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBWaWV3cG9ydC5wcm90b3R5cGUub25TY3JvbGwgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgdmFyIG5ld1JvdyA9IE1hdGgucm91bmQodGhpcy52aWV3cG9ydEVsZW1lbnQuc2Nyb2xsVG9wIC8gdGhpcy5jdXJyZW50Um93SGVpZ2h0KTtcbiAgICAgICAgdmFyIGRpZmYgPSBuZXdSb3cgLSB0aGlzLnRlcm1pbmFsLnlkaXNwO1xuICAgICAgICB0aGlzLnRlcm1pbmFsLnNjcm9sbERpc3AoZGlmZiwgdHJ1ZSk7XG4gICAgfTtcbiAgICBWaWV3cG9ydC5wcm90b3R5cGUub25XaGVlbCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICBpZiAoZXYuZGVsdGFZID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG11bHRpcGxpZXIgPSAxO1xuICAgICAgICBpZiAoZXYuZGVsdGFNb2RlID09PSBXaGVlbEV2ZW50LkRPTV9ERUxUQV9MSU5FKSB7XG4gICAgICAgICAgICBtdWx0aXBsaWVyID0gdGhpcy5jdXJyZW50Um93SGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGV2LmRlbHRhTW9kZSA9PT0gV2hlZWxFdmVudC5ET01fREVMVEFfUEFHRSkge1xuICAgICAgICAgICAgbXVsdGlwbGllciA9IHRoaXMuY3VycmVudFJvd0hlaWdodCAqIHRoaXMudGVybWluYWwucm93cztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3AgKz0gZXYuZGVsdGFZICogbXVsdGlwbGllcjtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICB9O1xuICAgIDtcbiAgICByZXR1cm4gVmlld3BvcnQ7XG59KCkpO1xuZXhwb3J0cy5WaWV3cG9ydCA9IFZpZXdwb3J0O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1WaWV3cG9ydC5qcy5tYXBcbiIsIi8qKlxuICogRml0IHRlcm1pbmFsIGNvbHVtbnMgYW5kIHJvd3MgdG8gdGhlIGRpbWVuc2lvbnMgb2YgaXRzIERPTSBlbGVtZW50LlxuICpcbiAqICMjIEFwcHJvYWNoXG4gKiAtIFJvd3M6IFRydW5jYXRlIHRoZSBkaXZpc2lvbiBvZiB0aGUgdGVybWluYWwgcGFyZW50IGVsZW1lbnQgaGVpZ2h0IGJ5IHRoZSB0ZXJtaW5hbCByb3cgaGVpZ2h0LlxuICpcbiAqIC0gQ29sdW1uczogVHJ1bmNhdGUgdGhlIGRpdmlzaW9uIG9mIHRoZSB0ZXJtaW5hbCBwYXJlbnQgZWxlbWVudCB3aWR0aCBieSB0aGUgdGVybWluYWwgY2hhcmFjdGVyXG4gKiB3aWR0aCAoYXBwbHkgZGlzcGxheTogaW5saW5lIGF0IHRoZSB0ZXJtaW5hbCByb3cgYW5kIHRydW5jYXRlIGl0cyB3aWR0aCB3aXRoIHRoZSBjdXJyZW50XG4gKiBudW1iZXIgb2YgY29sdW1ucykuXG4gKiBAbW9kdWxlIHh0ZXJtL2FkZG9ucy9maXQvZml0XG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG4oZnVuY3Rpb24gKGZpdCkge1xuICBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKSB7XG4gICAgLypcbiAgICAgKiBDb21tb25KUyBlbnZpcm9ubWVudFxuICAgICAqL1xuICAgIG1vZHVsZS5leHBvcnRzID0gZml0KHJlcXVpcmUoJy4uLy4uL3h0ZXJtJykpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJykge1xuICAgIC8qXG4gICAgICogUmVxdWlyZS5qcyBpcyBhdmFpbGFibGVcbiAgICAgKi9cbiAgICBkZWZpbmUoWycuLi8uLi94dGVybSddLCBmaXQpO1xuICB9IGVsc2Uge1xuICAgIC8qXG4gICAgICogUGxhaW4gYnJvd3NlciBlbnZpcm9ubWVudFxuICAgICAqL1xuICAgIGZpdCh3aW5kb3cuVGVybWluYWwpO1xuICB9XG59KShmdW5jdGlvbiAoWHRlcm0pIHtcbiAgdmFyIGV4cG9ydHMgPSB7fTtcblxuICBleHBvcnRzLnByb3Bvc2VHZW9tZXRyeSA9IGZ1bmN0aW9uICh0ZXJtKSB7XG4gICAgaWYgKCF0ZXJtLmVsZW1lbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBwYXJlbnRFbGVtZW50U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0ZXJtLmVsZW1lbnQucGFyZW50RWxlbWVudCksXG4gICAgICAgIHBhcmVudEVsZW1lbnRIZWlnaHQgPSBwYXJzZUludChwYXJlbnRFbGVtZW50U3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnaGVpZ2h0JykpLFxuICAgICAgICBwYXJlbnRFbGVtZW50V2lkdGggPSBNYXRoLm1heCgwLCBwYXJzZUludChwYXJlbnRFbGVtZW50U3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnd2lkdGgnKSkgLSAxNyksXG4gICAgICAgIGVsZW1lbnRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRlcm0uZWxlbWVudCksXG4gICAgICAgIGVsZW1lbnRQYWRkaW5nVmVyID0gcGFyc2VJbnQoZWxlbWVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctdG9wJykpICsgcGFyc2VJbnQoZWxlbWVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctYm90dG9tJykpLFxuICAgICAgICBlbGVtZW50UGFkZGluZ0hvciA9IHBhcnNlSW50KGVsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXJpZ2h0JykpICsgcGFyc2VJbnQoZWxlbWVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctbGVmdCcpKSxcbiAgICAgICAgYXZhaWxhYmxlSGVpZ2h0ID0gcGFyZW50RWxlbWVudEhlaWdodCAtIGVsZW1lbnRQYWRkaW5nVmVyLFxuICAgICAgICBhdmFpbGFibGVXaWR0aCA9IHBhcmVudEVsZW1lbnRXaWR0aCAtIGVsZW1lbnRQYWRkaW5nSG9yLFxuICAgICAgICBjb250YWluZXIgPSB0ZXJtLnJvd0NvbnRhaW5lcixcbiAgICAgICAgc3ViamVjdFJvdyA9IHRlcm0ucm93Q29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkLFxuICAgICAgICBjb250ZW50QnVmZmVyID0gc3ViamVjdFJvdy5pbm5lckhUTUwsXG4gICAgICAgIGNoYXJhY3RlckhlaWdodCxcbiAgICAgICAgcm93cyxcbiAgICAgICAgY2hhcmFjdGVyV2lkdGgsXG4gICAgICAgIGNvbHMsXG4gICAgICAgIGdlb21ldHJ5O1xuXG4gICAgc3ViamVjdFJvdy5zdHlsZS5kaXNwbGF5ID0gJ2lubGluZSc7XG4gICAgc3ViamVjdFJvdy5pbm5lckhUTUwgPSAnVyc7IC8vIENvbW1vbiBjaGFyYWN0ZXIgZm9yIG1lYXN1cmluZyB3aWR0aCwgYWx0aG91Z2ggb24gbW9ub3NwYWNlXG4gICAgY2hhcmFjdGVyV2lkdGggPSBzdWJqZWN0Um93LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIHN1YmplY3RSb3cuc3R5bGUuZGlzcGxheSA9ICcnOyAvLyBSZXZlcnQgc3R5bGUgYmVmb3JlIGNhbGN1bGF0aW5nIGhlaWdodCwgc2luY2UgdGhleSBkaWZmZXIuXG4gICAgY2hhcmFjdGVySGVpZ2h0ID0gc3ViamVjdFJvdy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgc3ViamVjdFJvdy5pbm5lckhUTUwgPSBjb250ZW50QnVmZmVyO1xuXG4gICAgcm93cyA9IHBhcnNlSW50KGF2YWlsYWJsZUhlaWdodCAvIGNoYXJhY3RlckhlaWdodCk7XG4gICAgY29scyA9IHBhcnNlSW50KGF2YWlsYWJsZVdpZHRoIC8gY2hhcmFjdGVyV2lkdGgpO1xuXG4gICAgZ2VvbWV0cnkgPSB7Y29sczogY29scywgcm93czogcm93c307XG4gICAgcmV0dXJuIGdlb21ldHJ5O1xuICB9O1xuXG4gIGV4cG9ydHMuZml0ID0gZnVuY3Rpb24gKHRlcm0pIHtcbiAgICB2YXIgZ2VvbWV0cnkgPSBleHBvcnRzLnByb3Bvc2VHZW9tZXRyeSh0ZXJtKTtcblxuICAgIGlmIChnZW9tZXRyeSkge1xuICAgICAgdGVybS5yZXNpemUoZ2VvbWV0cnkuY29scywgZ2VvbWV0cnkucm93cyk7XG4gICAgfVxuICB9O1xuXG4gIFh0ZXJtLnByb3RvdHlwZS5wcm9wb3NlR2VvbWV0cnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMucHJvcG9zZUdlb21ldHJ5KHRoaXMpO1xuICB9O1xuXG4gIFh0ZXJtLnByb3RvdHlwZS5maXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGV4cG9ydHMuZml0KHRoaXMpO1xuICB9O1xuXG4gIHJldHVybiBleHBvcnRzO1xufSk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmZ1bmN0aW9uIHByZXBhcmVUZXh0Rm9yQ2xpcGJvYXJkKHRleHQpIHtcbiAgICB2YXIgc3BhY2UgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDMyKSwgbm9uQnJlYWtpbmdTcGFjZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMTYwKSwgYWxsTm9uQnJlYWtpbmdTcGFjZXMgPSBuZXcgUmVnRXhwKG5vbkJyZWFraW5nU3BhY2UsICdnJyksIHByb2Nlc3NlZFRleHQgPSB0ZXh0LnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24gKGxpbmUpIHtcbiAgICAgICAgdmFyIHByb2Nlc3NlZExpbmUgPSBsaW5lLnJlcGxhY2UoL1xccyskL2csICcnKS5yZXBsYWNlKGFsbE5vbkJyZWFraW5nU3BhY2VzLCBzcGFjZSk7XG4gICAgICAgIHJldHVybiBwcm9jZXNzZWRMaW5lO1xuICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgIHJldHVybiBwcm9jZXNzZWRUZXh0O1xufVxuZXhwb3J0cy5wcmVwYXJlVGV4dEZvckNsaXBib2FyZCA9IHByZXBhcmVUZXh0Rm9yQ2xpcGJvYXJkO1xuZnVuY3Rpb24gY29weUhhbmRsZXIoZXYsIHRlcm0pIHtcbiAgICB2YXIgY29waWVkVGV4dCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpLCB0ZXh0ID0gcHJlcGFyZVRleHRGb3JDbGlwYm9hcmQoY29waWVkVGV4dCk7XG4gICAgaWYgKHRlcm0uYnJvd3Nlci5pc01TSUUpIHtcbiAgICAgICAgd2luZG93LmNsaXBib2FyZERhdGEuc2V0RGF0YSgnVGV4dCcsIHRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZXYuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCd0ZXh0L3BsYWluJywgdGV4dCk7XG4gICAgfVxuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG59XG5leHBvcnRzLmNvcHlIYW5kbGVyID0gY29weUhhbmRsZXI7XG5mdW5jdGlvbiBwYXN0ZUhhbmRsZXIoZXYsIHRlcm0pIHtcbiAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB2YXIgdGV4dDtcbiAgICB2YXIgZGlzcGF0Y2hQYXN0ZSA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIHRlcm0uaGFuZGxlcih0ZXh0KTtcbiAgICAgICAgdGVybS50ZXh0YXJlYS52YWx1ZSA9ICcnO1xuICAgICAgICByZXR1cm4gdGVybS5jYW5jZWwoZXYpO1xuICAgIH07XG4gICAgaWYgKHRlcm0uYnJvd3Nlci5pc01TSUUpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5jbGlwYm9hcmREYXRhKSB7XG4gICAgICAgICAgICB0ZXh0ID0gd2luZG93LmNsaXBib2FyZERhdGEuZ2V0RGF0YSgnVGV4dCcpO1xuICAgICAgICAgICAgZGlzcGF0Y2hQYXN0ZSh0ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKGV2LmNsaXBib2FyZERhdGEpIHtcbiAgICAgICAgICAgIHRleHQgPSBldi5jbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQvcGxhaW4nKTtcbiAgICAgICAgICAgIGRpc3BhdGNoUGFzdGUodGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLnBhc3RlSGFuZGxlciA9IHBhc3RlSGFuZGxlcjtcbmZ1bmN0aW9uIHJpZ2h0Q2xpY2tIYW5kbGVyKGV2LCB0ZXJtKSB7XG4gICAgdmFyIHMgPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKSwgc2VsZWN0ZWRUZXh0ID0gcHJlcGFyZVRleHRGb3JDbGlwYm9hcmQocy50b1N0cmluZygpKSwgY2xpY2tJc09uU2VsZWN0aW9uID0gZmFsc2UsIHggPSBldi5jbGllbnRYLCB5ID0gZXYuY2xpZW50WTtcbiAgICBpZiAocy5yYW5nZUNvdW50KSB7XG4gICAgICAgIHZhciByID0gcy5nZXRSYW5nZUF0KDApLCBjciA9IHIuZ2V0Q2xpZW50UmVjdHMoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHJlY3QgPSBjcltpXTtcbiAgICAgICAgICAgIGNsaWNrSXNPblNlbGVjdGlvbiA9ICgoeCA+IHJlY3QubGVmdCkgJiYgKHggPCByZWN0LnJpZ2h0KSAmJlxuICAgICAgICAgICAgICAgICh5ID4gcmVjdC50b3ApICYmICh5IDwgcmVjdC5ib3R0b20pKTtcbiAgICAgICAgICAgIGlmIChjbGlja0lzT25TZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZWN0ZWRUZXh0Lm1hdGNoKC9eXFxzJC8pIHx8ICFzZWxlY3RlZFRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBjbGlja0lzT25TZWxlY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWNsaWNrSXNPblNlbGVjdGlvbikge1xuICAgICAgICB0ZXJtLnRleHRhcmVhLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICAgICAgdGVybS50ZXh0YXJlYS5zdHlsZS53aWR0aCA9ICcyMHB4JztcbiAgICAgICAgdGVybS50ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSAnMjBweCc7XG4gICAgICAgIHRlcm0udGV4dGFyZWEuc3R5bGUubGVmdCA9ICh4IC0gMTApICsgJ3B4JztcbiAgICAgICAgdGVybS50ZXh0YXJlYS5zdHlsZS50b3AgPSAoeSAtIDEwKSArICdweCc7XG4gICAgICAgIHRlcm0udGV4dGFyZWEuc3R5bGUuekluZGV4ID0gJzEwMDAnO1xuICAgICAgICB0ZXJtLnRleHRhcmVhLmZvY3VzKCk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGVybS50ZXh0YXJlYS5zdHlsZS5wb3NpdGlvbiA9IG51bGw7XG4gICAgICAgICAgICB0ZXJtLnRleHRhcmVhLnN0eWxlLndpZHRoID0gbnVsbDtcbiAgICAgICAgICAgIHRlcm0udGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gbnVsbDtcbiAgICAgICAgICAgIHRlcm0udGV4dGFyZWEuc3R5bGUubGVmdCA9IG51bGw7XG4gICAgICAgICAgICB0ZXJtLnRleHRhcmVhLnN0eWxlLnRvcCA9IG51bGw7XG4gICAgICAgICAgICB0ZXJtLnRleHRhcmVhLnN0eWxlLnpJbmRleCA9IG51bGw7XG4gICAgICAgIH0sIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMucmlnaHRDbGlja0hhbmRsZXIgPSByaWdodENsaWNrSGFuZGxlcjtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2xpcGJvYXJkLmpzLm1hcFxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgR2VuZXJpY18xID0gcmVxdWlyZShcIi4vR2VuZXJpY1wiKTtcbnZhciBpc05vZGUgPSAodHlwZW9mIG5hdmlnYXRvciA9PT0gJ3VuZGVmaW5lZCcpID8gdHJ1ZSA6IGZhbHNlO1xudmFyIHVzZXJBZ2VudCA9IChpc05vZGUpID8gJ25vZGUnIDogbmF2aWdhdG9yLnVzZXJBZ2VudDtcbnZhciBwbGF0Zm9ybSA9IChpc05vZGUpID8gJ25vZGUnIDogbmF2aWdhdG9yLnBsYXRmb3JtO1xuZXhwb3J0cy5pc0ZpcmVmb3ggPSAhIX51c2VyQWdlbnQuaW5kZXhPZignRmlyZWZveCcpO1xuZXhwb3J0cy5pc01TSUUgPSAhIX51c2VyQWdlbnQuaW5kZXhPZignTVNJRScpIHx8ICEhfnVzZXJBZ2VudC5pbmRleE9mKCdUcmlkZW50Jyk7XG5leHBvcnRzLmlzTWFjID0gR2VuZXJpY18xLmNvbnRhaW5zKFsnTWFjaW50b3NoJywgJ01hY0ludGVsJywgJ01hY1BQQycsICdNYWM2OEsnXSwgcGxhdGZvcm0pO1xuZXhwb3J0cy5pc0lwYWQgPSBwbGF0Zm9ybSA9PT0gJ2lQYWQnO1xuZXhwb3J0cy5pc0lwaG9uZSA9IHBsYXRmb3JtID09PSAnaVBob25lJztcbmV4cG9ydHMuaXNNU1dpbmRvd3MgPSBHZW5lcmljXzEuY29udGFpbnMoWydXaW5kb3dzJywgJ1dpbjE2JywgJ1dpbjMyJywgJ1dpbkNFJ10sIHBsYXRmb3JtKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9QnJvd3Nlci5qcy5tYXBcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7XG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gICAgfTtcbn0pKCk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgRXZlbnRFbWl0dGVyX2pzXzEgPSByZXF1aXJlKFwiLi4vRXZlbnRFbWl0dGVyLmpzXCIpO1xudmFyIENoYXJNZWFzdXJlID0gKGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgICBfX2V4dGVuZHMoQ2hhck1lYXN1cmUsIF9zdXBlcik7XG4gICAgZnVuY3Rpb24gQ2hhck1lYXN1cmUoZG9jdW1lbnQsIHBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpcztcbiAgICAgICAgX3RoaXMuX2RvY3VtZW50ID0gZG9jdW1lbnQ7XG4gICAgICAgIF90aGlzLl9wYXJlbnRFbGVtZW50ID0gcGFyZW50RWxlbWVudDtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ2hhck1lYXN1cmUucHJvdG90eXBlLCBcIndpZHRoXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2lkdGg7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDaGFyTWVhc3VyZS5wcm90b3R5cGUsIFwiaGVpZ2h0XCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBDaGFyTWVhc3VyZS5wcm90b3R5cGUubWVhc3VyZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgaWYgKCF0aGlzLl9tZWFzdXJlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5fbWVhc3VyZUVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICB0aGlzLl9tZWFzdXJlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgICAgICB0aGlzLl9tZWFzdXJlRWxlbWVudC5zdHlsZS50b3AgPSAnMCc7XG4gICAgICAgICAgICB0aGlzLl9tZWFzdXJlRWxlbWVudC5zdHlsZS5sZWZ0ID0gJy05OTk5ZW0nO1xuICAgICAgICAgICAgdGhpcy5fbWVhc3VyZUVsZW1lbnQudGV4dENvbnRlbnQgPSAnVyc7XG4gICAgICAgICAgICB0aGlzLl9tZWFzdXJlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICAgICAgICAgIHRoaXMuX3BhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fbWVhc3VyZUVsZW1lbnQpO1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fZG9NZWFzdXJlKCk7IH0sIDApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZG9NZWFzdXJlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENoYXJNZWFzdXJlLnByb3RvdHlwZS5fZG9NZWFzdXJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZ2VvbWV0cnkgPSB0aGlzLl9tZWFzdXJlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKGdlb21ldHJ5LndpZHRoID09PSAwIHx8IGdlb21ldHJ5LmhlaWdodCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl93aWR0aCAhPT0gZ2VvbWV0cnkud2lkdGggfHwgdGhpcy5faGVpZ2h0ICE9PSBnZW9tZXRyeS5oZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dpZHRoID0gZ2VvbWV0cnkud2lkdGg7XG4gICAgICAgICAgICB0aGlzLl9oZWlnaHQgPSBnZW9tZXRyeS5oZWlnaHQ7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2NoYXJzaXplY2hhbmdlZCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gQ2hhck1lYXN1cmU7XG59KEV2ZW50RW1pdHRlcl9qc18xLkV2ZW50RW1pdHRlcikpO1xuZXhwb3J0cy5DaGFyTWVhc3VyZSA9IENoYXJNZWFzdXJlO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaGFyTWVhc3VyZS5qcy5tYXBcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIENpcmN1bGFyTGlzdCA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQ2lyY3VsYXJMaXN0KG1heExlbmd0aCkge1xuICAgICAgICB0aGlzLl9hcnJheSA9IG5ldyBBcnJheShtYXhMZW5ndGgpO1xuICAgICAgICB0aGlzLl9zdGFydEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5fbGVuZ3RoID0gMDtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENpcmN1bGFyTGlzdC5wcm90b3R5cGUsIFwibWF4TGVuZ3RoXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXJyYXkubGVuZ3RoO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdNYXhMZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBuZXdBcnJheSA9IG5ldyBBcnJheShuZXdNYXhMZW5ndGgpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBNYXRoLm1pbihuZXdNYXhMZW5ndGgsIHRoaXMubGVuZ3RoKTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbmV3QXJyYXlbaV0gPSB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleChpKV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9hcnJheSA9IG5ld0FycmF5O1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRJbmRleCA9IDA7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDaXJjdWxhckxpc3QucHJvdG90eXBlLCBcImxlbmd0aFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xlbmd0aDtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmV3TGVuZ3RoKSB7XG4gICAgICAgICAgICBpZiAobmV3TGVuZ3RoID4gdGhpcy5fbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMuX2xlbmd0aDsgaSA8IG5ld0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2FycmF5W2ldID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2xlbmd0aCA9IG5ld0xlbmd0aDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENpcmN1bGFyTGlzdC5wcm90b3R5cGUsIFwiZm9yRWFjaFwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FycmF5LmZvckVhY2g7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIENpcmN1bGFyTGlzdC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleChpbmRleCldO1xuICAgIH07XG4gICAgQ2lyY3VsYXJMaXN0LnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiAoaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KGluZGV4KV0gPSB2YWx1ZTtcbiAgICB9O1xuICAgIENpcmN1bGFyTGlzdC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleCh0aGlzLl9sZW5ndGgpXSA9IHZhbHVlO1xuICAgICAgICBpZiAodGhpcy5fbGVuZ3RoID09PSB0aGlzLm1heExlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5fc3RhcnRJbmRleCsrO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXJ0SW5kZXggPT09IHRoaXMubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRJbmRleCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9sZW5ndGgrKztcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ2lyY3VsYXJMaXN0LnByb3RvdHlwZS5wb3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleCh0aGlzLl9sZW5ndGgtLSAtIDEpXTtcbiAgICB9O1xuICAgIENpcmN1bGFyTGlzdC5wcm90b3R5cGUuc3BsaWNlID0gZnVuY3Rpb24gKHN0YXJ0LCBkZWxldGVDb3VudCkge1xuICAgICAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGl0ZW1zW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWxldGVDb3VudCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgdGhpcy5fbGVuZ3RoIC0gZGVsZXRlQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KGkpXSA9IHRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KGkgKyBkZWxldGVDb3VudCldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbGVuZ3RoIC09IGRlbGV0ZUNvdW50O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzLl9sZW5ndGggLSAxOyBpID49IHN0YXJ0OyBpLS0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleChpICsgaXRlbXMubGVuZ3RoKV0gPSB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleChpKV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYXJyYXlbdGhpcy5fZ2V0Q3ljbGljSW5kZXgoc3RhcnQgKyBpKV0gPSBpdGVtc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9sZW5ndGggKyBpdGVtcy5sZW5ndGggPiB0aGlzLm1heExlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0SW5kZXggKz0gKHRoaXMuX2xlbmd0aCArIGl0ZW1zLmxlbmd0aCkgLSB0aGlzLm1heExlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9sZW5ndGggPSB0aGlzLm1heExlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xlbmd0aCArPSBpdGVtcy5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENpcmN1bGFyTGlzdC5wcm90b3R5cGUudHJpbVN0YXJ0ID0gZnVuY3Rpb24gKGNvdW50KSB7XG4gICAgICAgIGlmIChjb3VudCA+IHRoaXMuX2xlbmd0aCkge1xuICAgICAgICAgICAgY291bnQgPSB0aGlzLl9sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3RhcnRJbmRleCArPSBjb3VudDtcbiAgICAgICAgdGhpcy5fbGVuZ3RoIC09IGNvdW50O1xuICAgIH07XG4gICAgQ2lyY3VsYXJMaXN0LnByb3RvdHlwZS5zaGlmdEVsZW1lbnRzID0gZnVuY3Rpb24gKHN0YXJ0LCBjb3VudCwgb2Zmc2V0KSB7XG4gICAgICAgIGlmIChjb3VudCA8PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLl9sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RhcnQgYXJndW1lbnQgb3V0IG9mIHJhbmdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0ICsgb2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc2hpZnQgZWxlbWVudHMgaW4gbGlzdCBiZXlvbmQgaW5kZXggMCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvZmZzZXQgPiAwKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gY291bnQgLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KHN0YXJ0ICsgaSArIG9mZnNldCwgdGhpcy5nZXQoc3RhcnQgKyBpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZXhwYW5kTGlzdEJ5ID0gKHN0YXJ0ICsgY291bnQgKyBvZmZzZXQpIC0gdGhpcy5fbGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGV4cGFuZExpc3RCeSA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sZW5ndGggKz0gZXhwYW5kTGlzdEJ5O1xuICAgICAgICAgICAgICAgIHdoaWxlICh0aGlzLl9sZW5ndGggPiB0aGlzLm1heExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9sZW5ndGgtLTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRJbmRleCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KHN0YXJ0ICsgaSArIG9mZnNldCwgdGhpcy5nZXQoc3RhcnQgKyBpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIENpcmN1bGFyTGlzdC5wcm90b3R5cGUuX2dldEN5Y2xpY0luZGV4ID0gZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAgIHJldHVybiAodGhpcy5fc3RhcnRJbmRleCArIGluZGV4KSAlIHRoaXMubWF4TGVuZ3RoO1xuICAgIH07XG4gICAgcmV0dXJuIENpcmN1bGFyTGlzdDtcbn0oKSk7XG5leHBvcnRzLkNpcmN1bGFyTGlzdCA9IENpcmN1bGFyTGlzdDtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2lyY3VsYXJMaXN0LmpzLm1hcFxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5mdW5jdGlvbiBjb250YWlucyhhcnIsIGVsKSB7XG4gICAgcmV0dXJuIGFyci5pbmRleE9mKGVsKSA+PSAwO1xufVxuZXhwb3J0cy5jb250YWlucyA9IGNvbnRhaW5zO1xuO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1HZW5lcmljLmpzLm1hcFxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgQ29tcG9zaXRpb25IZWxwZXJfMSA9IHJlcXVpcmUoXCIuL0NvbXBvc2l0aW9uSGVscGVyXCIpO1xudmFyIEV2ZW50RW1pdHRlcl8xID0gcmVxdWlyZShcIi4vRXZlbnRFbWl0dGVyXCIpO1xudmFyIFZpZXdwb3J0XzEgPSByZXF1aXJlKFwiLi9WaWV3cG9ydFwiKTtcbnZhciBDbGlwYm9hcmRfMSA9IHJlcXVpcmUoXCIuL2hhbmRsZXJzL0NsaXBib2FyZFwiKTtcbnZhciBDaXJjdWxhckxpc3RfMSA9IHJlcXVpcmUoXCIuL3V0aWxzL0NpcmN1bGFyTGlzdFwiKTtcbnZhciBFc2NhcGVTZXF1ZW5jZXNfMSA9IHJlcXVpcmUoXCIuL0VzY2FwZVNlcXVlbmNlc1wiKTtcbnZhciBJbnB1dEhhbmRsZXJfMSA9IHJlcXVpcmUoXCIuL0lucHV0SGFuZGxlclwiKTtcbnZhciBQYXJzZXJfMSA9IHJlcXVpcmUoXCIuL1BhcnNlclwiKTtcbnZhciBSZW5kZXJlcl8xID0gcmVxdWlyZShcIi4vUmVuZGVyZXJcIik7XG52YXIgTGlua2lmaWVyXzEgPSByZXF1aXJlKFwiLi9MaW5raWZpZXJcIik7XG52YXIgQ2hhck1lYXN1cmVfMSA9IHJlcXVpcmUoXCIuL3V0aWxzL0NoYXJNZWFzdXJlXCIpO1xudmFyIEJyb3dzZXIgPSByZXF1aXJlKFwiLi91dGlscy9Ccm93c2VyXCIpO1xudmFyIGRvY3VtZW50ID0gKHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcpID8gd2luZG93LmRvY3VtZW50IDogbnVsbDtcbnZhciBXUklURV9CVUZGRVJfUEFVU0VfVEhSRVNIT0xEID0gNTtcbnZhciBXUklURV9CQVRDSF9TSVpFID0gMzAwO1xudmFyIENVUlNPUl9CTElOS19JTlRFUlZBTCA9IDYwMDtcbmZ1bmN0aW9uIFRlcm1pbmFsKG9wdGlvbnMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRlcm1pbmFsKSkge1xuICAgICAgICByZXR1cm4gbmV3IFRlcm1pbmFsKGFyZ3VtZW50c1swXSwgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pO1xuICAgIH1cbiAgICBzZWxmLmJyb3dzZXIgPSBCcm93c2VyO1xuICAgIHNlbGYuY2FuY2VsID0gVGVybWluYWwuY2FuY2VsO1xuICAgIEV2ZW50RW1pdHRlcl8xLkV2ZW50RW1pdHRlci5jYWxsKHRoaXMpO1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGNvbHM6IGFyZ3VtZW50c1swXSxcbiAgICAgICAgICAgIHJvd3M6IGFyZ3VtZW50c1sxXSxcbiAgICAgICAgICAgIGhhbmRsZXI6IGFyZ3VtZW50c1syXVxuICAgICAgICB9O1xuICAgIH1cbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICBPYmplY3Qua2V5cyhUZXJtaW5hbC5kZWZhdWx0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmIChvcHRpb25zW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgb3B0aW9uc1trZXldID0gVGVybWluYWwub3B0aW9uc1trZXldO1xuICAgICAgICAgICAgaWYgKFRlcm1pbmFsW2tleV0gIT09IFRlcm1pbmFsLmRlZmF1bHRzW2tleV0pIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zW2tleV0gPSBUZXJtaW5hbFtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNlbGZba2V5XSA9IG9wdGlvbnNba2V5XTtcbiAgICB9KTtcbiAgICBpZiAob3B0aW9ucy5jb2xvcnMubGVuZ3RoID09PSA4KSB7XG4gICAgICAgIG9wdGlvbnMuY29sb3JzID0gb3B0aW9ucy5jb2xvcnMuY29uY2F0KFRlcm1pbmFsLl9jb2xvcnMuc2xpY2UoOCkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zLmNvbG9ycy5sZW5ndGggPT09IDE2KSB7XG4gICAgICAgIG9wdGlvbnMuY29sb3JzID0gb3B0aW9ucy5jb2xvcnMuY29uY2F0KFRlcm1pbmFsLl9jb2xvcnMuc2xpY2UoMTYpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAob3B0aW9ucy5jb2xvcnMubGVuZ3RoID09PSAxMCkge1xuICAgICAgICBvcHRpb25zLmNvbG9ycyA9IG9wdGlvbnMuY29sb3JzLnNsaWNlKDAsIC0yKS5jb25jYXQoVGVybWluYWwuX2NvbG9ycy5zbGljZSg4LCAtMiksIG9wdGlvbnMuY29sb3JzLnNsaWNlKC0yKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnMuY29sb3JzLmxlbmd0aCA9PT0gMTgpIHtcbiAgICAgICAgb3B0aW9ucy5jb2xvcnMgPSBvcHRpb25zLmNvbG9ycy5jb25jYXQoVGVybWluYWwuX2NvbG9ycy5zbGljZSgxNiwgLTIpLCBvcHRpb25zLmNvbG9ycy5zbGljZSgtMikpO1xuICAgIH1cbiAgICB0aGlzLmNvbG9ycyA9IG9wdGlvbnMuY29sb3JzO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5wYXJlbnQgPSBvcHRpb25zLmJvZHkgfHwgb3B0aW9ucy5wYXJlbnQgfHwgKGRvY3VtZW50ID8gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXSA6IG51bGwpO1xuICAgIHRoaXMuY29scyA9IG9wdGlvbnMuY29scyB8fCBvcHRpb25zLmdlb21ldHJ5WzBdO1xuICAgIHRoaXMucm93cyA9IG9wdGlvbnMucm93cyB8fCBvcHRpb25zLmdlb21ldHJ5WzFdO1xuICAgIHRoaXMuZ2VvbWV0cnkgPSBbdGhpcy5jb2xzLCB0aGlzLnJvd3NdO1xuICAgIGlmIChvcHRpb25zLmhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5vbignZGF0YScsIG9wdGlvbnMuaGFuZGxlcik7XG4gICAgfVxuICAgIHRoaXMueWJhc2UgPSAwO1xuICAgIHRoaXMueWRpc3AgPSAwO1xuICAgIHRoaXMueCA9IDA7XG4gICAgdGhpcy55ID0gMDtcbiAgICB0aGlzLmN1cnNvclN0YXRlID0gMDtcbiAgICB0aGlzLmN1cnNvckhpZGRlbiA9IGZhbHNlO1xuICAgIHRoaXMuY29udmVydEVvbDtcbiAgICB0aGlzLnF1ZXVlID0gJyc7XG4gICAgdGhpcy5zY3JvbGxUb3AgPSAwO1xuICAgIHRoaXMuc2Nyb2xsQm90dG9tID0gdGhpcy5yb3dzIC0gMTtcbiAgICB0aGlzLmN1c3RvbUtleWRvd25IYW5kbGVyID0gbnVsbDtcbiAgICB0aGlzLmN1cnNvckJsaW5rSW50ZXJ2YWwgPSBudWxsO1xuICAgIHRoaXMuYXBwbGljYXRpb25LZXlwYWQgPSBmYWxzZTtcbiAgICB0aGlzLmFwcGxpY2F0aW9uQ3Vyc29yID0gZmFsc2U7XG4gICAgdGhpcy5vcmlnaW5Nb2RlID0gZmFsc2U7XG4gICAgdGhpcy5pbnNlcnRNb2RlID0gZmFsc2U7XG4gICAgdGhpcy53cmFwYXJvdW5kTW9kZSA9IHRydWU7XG4gICAgdGhpcy5ub3JtYWwgPSBudWxsO1xuICAgIHRoaXMuY2hhcnNldCA9IG51bGw7XG4gICAgdGhpcy5nY2hhcnNldCA9IG51bGw7XG4gICAgdGhpcy5nbGV2ZWwgPSAwO1xuICAgIHRoaXMuY2hhcnNldHMgPSBbbnVsbF07XG4gICAgdGhpcy5kZWNMb2NhdG9yO1xuICAgIHRoaXMueDEwTW91c2U7XG4gICAgdGhpcy52dDIwME1vdXNlO1xuICAgIHRoaXMudnQzMDBNb3VzZTtcbiAgICB0aGlzLm5vcm1hbE1vdXNlO1xuICAgIHRoaXMubW91c2VFdmVudHM7XG4gICAgdGhpcy5zZW5kRm9jdXM7XG4gICAgdGhpcy51dGZNb3VzZTtcbiAgICB0aGlzLnNnck1vdXNlO1xuICAgIHRoaXMudXJ4dnRNb3VzZTtcbiAgICB0aGlzLmVsZW1lbnQ7XG4gICAgdGhpcy5jaGlsZHJlbjtcbiAgICB0aGlzLnJlZnJlc2hTdGFydDtcbiAgICB0aGlzLnJlZnJlc2hFbmQ7XG4gICAgdGhpcy5zYXZlZFg7XG4gICAgdGhpcy5zYXZlZFk7XG4gICAgdGhpcy5zYXZlZENvbHM7XG4gICAgdGhpcy5yZWFkYWJsZSA9IHRydWU7XG4gICAgdGhpcy53cml0YWJsZSA9IHRydWU7XG4gICAgdGhpcy5kZWZBdHRyID0gKDAgPDwgMTgpIHwgKDI1NyA8PCA5KSB8ICgyNTYgPDwgMCk7XG4gICAgdGhpcy5jdXJBdHRyID0gdGhpcy5kZWZBdHRyO1xuICAgIHRoaXMucGFyYW1zID0gW107XG4gICAgdGhpcy5jdXJyZW50UGFyYW0gPSAwO1xuICAgIHRoaXMucHJlZml4ID0gJyc7XG4gICAgdGhpcy5wb3N0Zml4ID0gJyc7XG4gICAgdGhpcy5pbnB1dEhhbmRsZXIgPSBuZXcgSW5wdXRIYW5kbGVyXzEuSW5wdXRIYW5kbGVyKHRoaXMpO1xuICAgIHRoaXMucGFyc2VyID0gbmV3IFBhcnNlcl8xLlBhcnNlcih0aGlzLmlucHV0SGFuZGxlciwgdGhpcyk7XG4gICAgdGhpcy5yZW5kZXJlciA9IHRoaXMucmVuZGVyZXIgfHwgbnVsbDtcbiAgICB0aGlzLmxpbmtpZmllciA9IHRoaXMubGlua2lmaWVyIHx8IG5ldyBMaW5raWZpZXJfMS5MaW5raWZpZXIoKTtcbiAgICB0aGlzLndyaXRlQnVmZmVyID0gW107XG4gICAgdGhpcy53cml0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB0aGlzLnhvZmZTZW50VG9DYXRjaFVwID0gZmFsc2U7XG4gICAgdGhpcy53cml0ZVN0b3BwZWQgPSBmYWxzZTtcbiAgICB0aGlzLnN1cnJvZ2F0ZV9oaWdoID0gJyc7XG4gICAgdGhpcy5saW5lcyA9IG5ldyBDaXJjdWxhckxpc3RfMS5DaXJjdWxhckxpc3QodGhpcy5zY3JvbGxiYWNrKTtcbiAgICB2YXIgaSA9IHRoaXMucm93cztcbiAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgIHRoaXMubGluZXMucHVzaCh0aGlzLmJsYW5rTGluZSgpKTtcbiAgICB9XG4gICAgdGhpcy50YWJzO1xuICAgIHRoaXMuc2V0dXBTdG9wcygpO1xuICAgIHRoaXMudXNlclNjcm9sbGluZyA9IGZhbHNlO1xufVxuaW5oZXJpdHMoVGVybWluYWwsIEV2ZW50RW1pdHRlcl8xLkV2ZW50RW1pdHRlcik7XG5UZXJtaW5hbC5wcm90b3R5cGUuZXJhc2VBdHRyID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAodGhpcy5kZWZBdHRyICYgfjB4MWZmKSB8ICh0aGlzLmN1ckF0dHIgJiAweDFmZik7XG59O1xuVGVybWluYWwudGFuZ29Db2xvcnMgPSBbXG4gICAgJyMyZTM0MzYnLFxuICAgICcjY2MwMDAwJyxcbiAgICAnIzRlOWEwNicsXG4gICAgJyNjNGEwMDAnLFxuICAgICcjMzQ2NWE0JyxcbiAgICAnIzc1NTA3YicsXG4gICAgJyMwNjk4OWEnLFxuICAgICcjZDNkN2NmJyxcbiAgICAnIzU1NTc1MycsXG4gICAgJyNlZjI5MjknLFxuICAgICcjOGFlMjM0JyxcbiAgICAnI2ZjZTk0ZicsXG4gICAgJyM3MjlmY2YnLFxuICAgICcjYWQ3ZmE4JyxcbiAgICAnIzM0ZTJlMicsXG4gICAgJyNlZWVlZWMnXG5dO1xuVGVybWluYWwuY29sb3JzID0gKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY29sb3JzID0gVGVybWluYWwudGFuZ29Db2xvcnMuc2xpY2UoKSwgciA9IFsweDAwLCAweDVmLCAweDg3LCAweGFmLCAweGQ3LCAweGZmXSwgaTtcbiAgICBpID0gMDtcbiAgICBmb3IgKDsgaSA8IDIxNjsgaSsrKSB7XG4gICAgICAgIG91dChyWyhpIC8gMzYpICUgNiB8IDBdLCByWyhpIC8gNikgJSA2IHwgMF0sIHJbaSAlIDZdKTtcbiAgICB9XG4gICAgaSA9IDA7XG4gICAgZm9yICg7IGkgPCAyNDsgaSsrKSB7XG4gICAgICAgIHIgPSA4ICsgaSAqIDEwO1xuICAgICAgICBvdXQociwgciwgcik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG91dChyLCBnLCBiKSB7XG4gICAgICAgIGNvbG9ycy5wdXNoKCcjJyArIGhleChyKSArIGhleChnKSArIGhleChiKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhleChjKSB7XG4gICAgICAgIGMgPSBjLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgcmV0dXJuIGMubGVuZ3RoIDwgMiA/ICcwJyArIGMgOiBjO1xuICAgIH1cbiAgICByZXR1cm4gY29sb3JzO1xufSkoKTtcblRlcm1pbmFsLl9jb2xvcnMgPSBUZXJtaW5hbC5jb2xvcnMuc2xpY2UoKTtcblRlcm1pbmFsLnZjb2xvcnMgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBvdXQgPSBbXSwgY29sb3JzID0gVGVybWluYWwuY29sb3JzLCBpID0gMCwgY29sb3I7XG4gICAgZm9yICg7IGkgPCAyNTY7IGkrKykge1xuICAgICAgICBjb2xvciA9IHBhcnNlSW50KGNvbG9yc1tpXS5zdWJzdHJpbmcoMSksIDE2KTtcbiAgICAgICAgb3V0LnB1c2goW1xuICAgICAgICAgICAgKGNvbG9yID4+IDE2KSAmIDB4ZmYsXG4gICAgICAgICAgICAoY29sb3IgPj4gOCkgJiAweGZmLFxuICAgICAgICAgICAgY29sb3IgJiAweGZmXG4gICAgICAgIF0pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufSkoKTtcblRlcm1pbmFsLmRlZmF1bHRzID0ge1xuICAgIGNvbG9yczogVGVybWluYWwuY29sb3JzLFxuICAgIHRoZW1lOiAnZGVmYXVsdCcsXG4gICAgY29udmVydEVvbDogZmFsc2UsXG4gICAgdGVybU5hbWU6ICd4dGVybScsXG4gICAgZ2VvbWV0cnk6IFs4MCwgMjRdLFxuICAgIGN1cnNvckJsaW5rOiBmYWxzZSxcbiAgICBjdXJzb3JTdHlsZTogJ2Jsb2NrJyxcbiAgICB2aXN1YWxCZWxsOiBmYWxzZSxcbiAgICBwb3BPbkJlbGw6IGZhbHNlLFxuICAgIHNjcm9sbGJhY2s6IDEwMDAsXG4gICAgc2NyZWVuS2V5czogZmFsc2UsXG4gICAgZGVidWc6IGZhbHNlLFxuICAgIGNhbmNlbEV2ZW50czogZmFsc2UsXG4gICAgZGlzYWJsZVN0ZGluOiBmYWxzZSxcbiAgICB1c2VGbG93Q29udHJvbDogZmFsc2UsXG4gICAgdGFiU3RvcFdpZHRoOiA4XG59O1xuVGVybWluYWwub3B0aW9ucyA9IHt9O1xuVGVybWluYWwuZm9jdXMgPSBudWxsO1xuZWFjaChrZXlzKFRlcm1pbmFsLmRlZmF1bHRzKSwgZnVuY3Rpb24gKGtleSkge1xuICAgIFRlcm1pbmFsW2tleV0gPSBUZXJtaW5hbC5kZWZhdWx0c1trZXldO1xuICAgIFRlcm1pbmFsLm9wdGlvbnNba2V5XSA9IFRlcm1pbmFsLmRlZmF1bHRzW2tleV07XG59KTtcblRlcm1pbmFsLnByb3RvdHlwZS5mb2N1cyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0YXJlYS5mb2N1cygpO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5nZXRPcHRpb24gPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghKGtleSBpbiBUZXJtaW5hbC5kZWZhdWx0cykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBvcHRpb24gd2l0aCBrZXkgXCInICsga2V5ICsgJ1wiJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zW2tleV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnNba2V5XTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNba2V5XTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuc2V0T3B0aW9uID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICBpZiAoIShrZXkgaW4gVGVybWluYWwuZGVmYXVsdHMpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gb3B0aW9uIHdpdGgga2V5IFwiJyArIGtleSArICdcIicpO1xuICAgIH1cbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlICdzY3JvbGxiYWNrJzpcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnNba2V5XSAhPT0gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5saW5lcy5sZW5ndGggPiB2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYW1vdW50VG9UcmltID0gdGhpcy5saW5lcy5sZW5ndGggLSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5lZWRzUmVmcmVzaCA9ICh0aGlzLnlkaXNwIC0gYW1vdW50VG9UcmltIDwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZXMudHJpbVN0YXJ0KGFtb3VudFRvVHJpbSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMueWJhc2UgPSBNYXRoLm1heCh0aGlzLnliYXNlIC0gYW1vdW50VG9UcmltLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55ZGlzcCA9IE1hdGgubWF4KHRoaXMueWRpc3AgLSBhbW91bnRUb1RyaW0sIDApO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmVlZHNSZWZyZXNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2goMCwgdGhpcy5yb3dzIC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5saW5lcy5tYXhMZW5ndGggPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZXdwb3J0LnN5bmNTY3JvbGxBcmVhKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpc1trZXldID0gdmFsdWU7XG4gICAgdGhpcy5vcHRpb25zW2tleV0gPSB2YWx1ZTtcbiAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlICdjdXJzb3JCbGluayc6XG4gICAgICAgICAgICB0aGlzLnNldEN1cnNvckJsaW5raW5nKHZhbHVlKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjdXJzb3JTdHlsZSc6XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShcInh0ZXJtLWN1cnNvci1zdHlsZS11bmRlcmxpbmVcIiwgdmFsdWUgPT09ICd1bmRlcmxpbmUnKTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKFwieHRlcm0tY3Vyc29yLXN0eWxlLWJhclwiLCB2YWx1ZSA9PT0gJ2JhcicpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RhYlN0b3BXaWR0aCc6XG4gICAgICAgICAgICB0aGlzLnNldHVwU3RvcHMoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbn07XG5UZXJtaW5hbC5wcm90b3R5cGUucmVzdGFydEN1cnNvckJsaW5raW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuc2V0Q3Vyc29yQmxpbmtpbmcodGhpcy5vcHRpb25zLmN1cnNvckJsaW5rKTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuc2V0Q3Vyc29yQmxpbmtpbmcgPSBmdW5jdGlvbiAoZW5hYmxlZCkge1xuICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKCd4dGVybS1jdXJzb3ItYmxpbmsnLCBlbmFibGVkKTtcbiAgICB0aGlzLmNsZWFyQ3Vyc29yQmxpbmtpbmdJbnRlcnZhbCgpO1xuICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy5jdXJzb3JCbGlua0ludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3h0ZXJtLWN1cnNvci1ibGluay1vbicpO1xuICAgICAgICB9LCBDVVJTT1JfQkxJTktfSU5URVJWQUwpO1xuICAgIH1cbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuY2xlYXJDdXJzb3JCbGlua2luZ0ludGVydmFsID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCd4dGVybS1jdXJzb3ItYmxpbmstb24nKTtcbiAgICBpZiAodGhpcy5jdXJzb3JCbGlua0ludGVydmFsKSB7XG4gICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5jdXJzb3JCbGlua0ludGVydmFsKTtcbiAgICAgICAgdGhpcy5jdXJzb3JCbGlua0ludGVydmFsID0gbnVsbDtcbiAgICB9XG59O1xuVGVybWluYWwuYmluZEZvY3VzID0gZnVuY3Rpb24gKHRlcm0pIHtcbiAgICBvbih0ZXJtLnRleHRhcmVhLCAnZm9jdXMnLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgaWYgKHRlcm0uc2VuZEZvY3VzKSB7XG4gICAgICAgICAgICB0ZXJtLnNlbmQoRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1tJJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGVybS5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2ZvY3VzJyk7XG4gICAgICAgIHRlcm0uc2hvd0N1cnNvcigpO1xuICAgICAgICB0ZXJtLnJlc3RhcnRDdXJzb3JCbGlua2luZy5hcHBseSh0ZXJtKTtcbiAgICAgICAgVGVybWluYWwuZm9jdXMgPSB0ZXJtO1xuICAgICAgICB0ZXJtLmVtaXQoJ2ZvY3VzJywgeyB0ZXJtaW5hbDogdGVybSB9KTtcbiAgICB9KTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuYmx1ciA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy50ZXh0YXJlYS5ibHVyKCk7XG59O1xuVGVybWluYWwuYmluZEJsdXIgPSBmdW5jdGlvbiAodGVybSkge1xuICAgIG9uKHRlcm0udGV4dGFyZWEsICdibHVyJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIHRlcm0ucmVmcmVzaCh0ZXJtLnksIHRlcm0ueSk7XG4gICAgICAgIGlmICh0ZXJtLnNlbmRGb2N1cykge1xuICAgICAgICAgICAgdGVybS5zZW5kKEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbTycpO1xuICAgICAgICB9XG4gICAgICAgIHRlcm0uZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdmb2N1cycpO1xuICAgICAgICB0ZXJtLmNsZWFyQ3Vyc29yQmxpbmtpbmdJbnRlcnZhbC5hcHBseSh0ZXJtKTtcbiAgICAgICAgVGVybWluYWwuZm9jdXMgPSBudWxsO1xuICAgICAgICB0ZXJtLmVtaXQoJ2JsdXInLCB7IHRlcm1pbmFsOiB0ZXJtIH0pO1xuICAgIH0pO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5pbml0R2xvYmFsID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB0ZXJtID0gdGhpcztcbiAgICBUZXJtaW5hbC5iaW5kS2V5cyh0aGlzKTtcbiAgICBUZXJtaW5hbC5iaW5kRm9jdXModGhpcyk7XG4gICAgVGVybWluYWwuYmluZEJsdXIodGhpcyk7XG4gICAgb24odGhpcy5lbGVtZW50LCAnY29weScsIGZ1bmN0aW9uIChldikge1xuICAgICAgICBDbGlwYm9hcmRfMS5jb3B5SGFuZGxlci5jYWxsKHRoaXMsIGV2LCB0ZXJtKTtcbiAgICB9KTtcbiAgICBvbih0aGlzLnRleHRhcmVhLCAncGFzdGUnLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgQ2xpcGJvYXJkXzEucGFzdGVIYW5kbGVyLmNhbGwodGhpcywgZXYsIHRlcm0pO1xuICAgIH0pO1xuICAgIG9uKHRoaXMuZWxlbWVudCwgJ3Bhc3RlJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIENsaXBib2FyZF8xLnBhc3RlSGFuZGxlci5jYWxsKHRoaXMsIGV2LCB0ZXJtKTtcbiAgICB9KTtcbiAgICBmdW5jdGlvbiByaWdodENsaWNrSGFuZGxlcldyYXBwZXIoZXYpIHtcbiAgICAgICAgQ2xpcGJvYXJkXzEucmlnaHRDbGlja0hhbmRsZXIuY2FsbCh0aGlzLCBldiwgdGVybSk7XG4gICAgfVxuICAgIGlmICh0ZXJtLmJyb3dzZXIuaXNGaXJlZm94KSB7XG4gICAgICAgIG9uKHRoaXMuZWxlbWVudCwgJ21vdXNlZG93bicsIGZ1bmN0aW9uIChldikge1xuICAgICAgICAgICAgaWYgKGV2LmJ1dHRvbiA9PSAyKSB7XG4gICAgICAgICAgICAgICAgcmlnaHRDbGlja0hhbmRsZXJXcmFwcGVyKGV2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBvbih0aGlzLmVsZW1lbnQsICdjb250ZXh0bWVudScsIHJpZ2h0Q2xpY2tIYW5kbGVyV3JhcHBlcik7XG4gICAgfVxufTtcblRlcm1pbmFsLmJpbmRLZXlzID0gZnVuY3Rpb24gKHRlcm0pIHtcbiAgICBvbih0ZXJtLmVsZW1lbnQsICdrZXlkb3duJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9IHRoaXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0ZXJtLmtleURvd24oZXYpO1xuICAgIH0sIHRydWUpO1xuICAgIG9uKHRlcm0uZWxlbWVudCwgJ2tleXByZXNzJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9IHRoaXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0ZXJtLmtleVByZXNzKGV2KTtcbiAgICB9LCB0cnVlKTtcbiAgICBvbih0ZXJtLmVsZW1lbnQsICdrZXl1cCcsIGZ1bmN0aW9uIChldikge1xuICAgICAgICBpZiAoIXdhc01vbmRpZmllcktleU9ubHlFdmVudChldikpIHtcbiAgICAgICAgICAgIHRlcm0uZm9jdXModGVybSk7XG4gICAgICAgIH1cbiAgICB9LCB0cnVlKTtcbiAgICBvbih0ZXJtLnRleHRhcmVhLCAna2V5ZG93bicsIGZ1bmN0aW9uIChldikge1xuICAgICAgICB0ZXJtLmtleURvd24oZXYpO1xuICAgIH0sIHRydWUpO1xuICAgIG9uKHRlcm0udGV4dGFyZWEsICdrZXlwcmVzcycsIGZ1bmN0aW9uIChldikge1xuICAgICAgICB0ZXJtLmtleVByZXNzKGV2KTtcbiAgICAgICAgdGhpcy52YWx1ZSA9ICcnO1xuICAgIH0sIHRydWUpO1xuICAgIG9uKHRlcm0udGV4dGFyZWEsICdjb21wb3NpdGlvbnN0YXJ0JywgdGVybS5jb21wb3NpdGlvbkhlbHBlci5jb21wb3NpdGlvbnN0YXJ0LmJpbmQodGVybS5jb21wb3NpdGlvbkhlbHBlcikpO1xuICAgIG9uKHRlcm0udGV4dGFyZWEsICdjb21wb3NpdGlvbnVwZGF0ZScsIHRlcm0uY29tcG9zaXRpb25IZWxwZXIuY29tcG9zaXRpb251cGRhdGUuYmluZCh0ZXJtLmNvbXBvc2l0aW9uSGVscGVyKSk7XG4gICAgb24odGVybS50ZXh0YXJlYSwgJ2NvbXBvc2l0aW9uZW5kJywgdGVybS5jb21wb3NpdGlvbkhlbHBlci5jb21wb3NpdGlvbmVuZC5iaW5kKHRlcm0uY29tcG9zaXRpb25IZWxwZXIpKTtcbiAgICB0ZXJtLm9uKCdyZWZyZXNoJywgdGVybS5jb21wb3NpdGlvbkhlbHBlci51cGRhdGVDb21wb3NpdGlvbkVsZW1lbnRzLmJpbmQodGVybS5jb21wb3NpdGlvbkhlbHBlcikpO1xuICAgIHRlcm0ub24oJ3JlZnJlc2gnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICB0ZXJtLnF1ZXVlTGlua2lmaWNhdGlvbihkYXRhLnN0YXJ0LCBkYXRhLmVuZCk7XG4gICAgfSk7XG59O1xuVGVybWluYWwucHJvdG90eXBlLmluc2VydFJvdyA9IGZ1bmN0aW9uIChyb3cpIHtcbiAgICBpZiAodHlwZW9mIHJvdyAhPSAnb2JqZWN0Jykge1xuICAgICAgICByb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB9XG4gICAgdGhpcy5yb3dDb250YWluZXIuYXBwZW5kQ2hpbGQocm93KTtcbiAgICB0aGlzLmNoaWxkcmVuLnB1c2gocm93KTtcbiAgICByZXR1cm4gcm93O1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24gKHBhcmVudCwgZm9jdXMpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXMsIGkgPSAwLCBkaXY7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQgfHwgdGhpcy5wYXJlbnQ7XG4gICAgaWYgKCF0aGlzLnBhcmVudCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rlcm1pbmFsIHJlcXVpcmVzIGEgcGFyZW50IGVsZW1lbnQuJyk7XG4gICAgfVxuICAgIHRoaXMuY29udGV4dCA9IHRoaXMucGFyZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG4gICAgdGhpcy5kb2N1bWVudCA9IHRoaXMucGFyZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgdGhpcy5ib2R5ID0gdGhpcy5kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdO1xuICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Rlcm1pbmFsJyk7XG4gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3h0ZXJtJyk7XG4gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLXRoZW1lLScgKyB0aGlzLnRoZW1lKTtcbiAgICB0aGlzLnNldEN1cnNvckJsaW5raW5nKHRoaXMub3B0aW9ucy5jdXJzb3JCbGluayk7XG4gICAgdGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodDtcbiAgICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsIDApO1xuICAgIHRoaXMudmlld3BvcnRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy52aWV3cG9ydEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgneHRlcm0tdmlld3BvcnQnKTtcbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy52aWV3cG9ydEVsZW1lbnQpO1xuICAgIHRoaXMudmlld3BvcnRTY3JvbGxBcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy52aWV3cG9ydFNjcm9sbEFyZWEuY2xhc3NMaXN0LmFkZCgneHRlcm0tc2Nyb2xsLWFyZWEnKTtcbiAgICB0aGlzLnZpZXdwb3J0RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnZpZXdwb3J0U2Nyb2xsQXJlYSk7XG4gICAgdGhpcy5yb3dDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLnJvd0NvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd4dGVybS1yb3dzJyk7XG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucm93Q29udGFpbmVyKTtcbiAgICB0aGlzLmNoaWxkcmVuID0gW107XG4gICAgdGhpcy5saW5raWZpZXIuYXR0YWNoVG9Eb20oZG9jdW1lbnQsIHRoaXMuY2hpbGRyZW4pO1xuICAgIHRoaXMuaGVscGVyQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5oZWxwZXJDb250YWluZXIuY2xhc3NMaXN0LmFkZCgneHRlcm0taGVscGVycycpO1xuICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmhlbHBlckNvbnRhaW5lcik7XG4gICAgdGhpcy50ZXh0YXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgdGhpcy50ZXh0YXJlYS5jbGFzc0xpc3QuYWRkKCd4dGVybS1oZWxwZXItdGV4dGFyZWEnKTtcbiAgICB0aGlzLnRleHRhcmVhLnNldEF0dHJpYnV0ZSgnYXV0b2NvcnJlY3QnLCAnb2ZmJyk7XG4gICAgdGhpcy50ZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ2F1dG9jYXBpdGFsaXplJywgJ29mZicpO1xuICAgIHRoaXMudGV4dGFyZWEuc2V0QXR0cmlidXRlKCdzcGVsbGNoZWNrJywgJ2ZhbHNlJyk7XG4gICAgdGhpcy50ZXh0YXJlYS50YWJJbmRleCA9IDA7XG4gICAgdGhpcy50ZXh0YXJlYS5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi5lbWl0KCdmb2N1cycsIHsgdGVybWluYWw6IHNlbGYgfSk7XG4gICAgfSk7XG4gICAgdGhpcy50ZXh0YXJlYS5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLmVtaXQoJ2JsdXInLCB7IHRlcm1pbmFsOiBzZWxmIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuaGVscGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMudGV4dGFyZWEpO1xuICAgIHRoaXMuY29tcG9zaXRpb25WaWV3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5jb21wb3NpdGlvblZpZXcuY2xhc3NMaXN0LmFkZCgnY29tcG9zaXRpb24tdmlldycpO1xuICAgIHRoaXMuY29tcG9zaXRpb25IZWxwZXIgPSBuZXcgQ29tcG9zaXRpb25IZWxwZXJfMS5Db21wb3NpdGlvbkhlbHBlcih0aGlzLnRleHRhcmVhLCB0aGlzLmNvbXBvc2l0aW9uVmlldywgdGhpcyk7XG4gICAgdGhpcy5oZWxwZXJDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jb21wb3NpdGlvblZpZXcpO1xuICAgIHRoaXMuY2hhclNpemVTdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHRoaXMuaGVscGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY2hhclNpemVTdHlsZUVsZW1lbnQpO1xuICAgIGZvciAoOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgICAgdGhpcy5pbnNlcnRSb3coKTtcbiAgICB9XG4gICAgdGhpcy5wYXJlbnQuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KTtcbiAgICB0aGlzLmNoYXJNZWFzdXJlID0gbmV3IENoYXJNZWFzdXJlXzEuQ2hhck1lYXN1cmUoZG9jdW1lbnQsIHRoaXMuaGVscGVyQ29udGFpbmVyKTtcbiAgICB0aGlzLmNoYXJNZWFzdXJlLm9uKCdjaGFyc2l6ZWNoYW5nZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYudXBkYXRlQ2hhclNpemVDU1MoKTtcbiAgICB9KTtcbiAgICB0aGlzLmNoYXJNZWFzdXJlLm1lYXN1cmUoKTtcbiAgICB0aGlzLnZpZXdwb3J0ID0gbmV3IFZpZXdwb3J0XzEuVmlld3BvcnQodGhpcywgdGhpcy52aWV3cG9ydEVsZW1lbnQsIHRoaXMudmlld3BvcnRTY3JvbGxBcmVhLCB0aGlzLmNoYXJNZWFzdXJlKTtcbiAgICB0aGlzLnJlbmRlcmVyID0gbmV3IFJlbmRlcmVyXzEuUmVuZGVyZXIodGhpcyk7XG4gICAgdGhpcy5yZWZyZXNoKDAsIHRoaXMucm93cyAtIDEpO1xuICAgIHRoaXMuaW5pdEdsb2JhbCgpO1xuICAgIGlmICh0eXBlb2YgZm9jdXMgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSAnWW91IGRpZCBub3QgcGFzcyB0aGUgYGZvY3VzYCBhcmd1bWVudCBpbiBgVGVybWluYWwucHJvdG90eXBlLm9wZW4oKWAuXFxuJztcbiAgICAgICAgbWVzc2FnZSArPSAnVGhlIGBmb2N1c2AgYXJndW1lbnQgbm93IGRlZmF1bHRzIHRvIGB0cnVlYCBidXQgc3RhcnRpbmcgd2l0aCB4dGVybS5qcyAzLjAgJztcbiAgICAgICAgbWVzc2FnZSArPSAnaXQgd2lsbCBkZWZhdWx0IHRvIGBmYWxzZWAuJztcbiAgICAgICAgY29uc29sZS53YXJuKG1lc3NhZ2UpO1xuICAgICAgICBmb2N1cyA9IHRydWU7XG4gICAgfVxuICAgIGlmIChmb2N1cykge1xuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgfVxuICAgIG9uKHRoaXMuZWxlbWVudCwgJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCksIGNvbGxhcHNlZCA9IHNlbGVjdGlvbi5pc0NvbGxhcHNlZCwgaXNSYW5nZSA9IHR5cGVvZiBjb2xsYXBzZWQgPT0gJ2Jvb2xlYW4nID8gIWNvbGxhcHNlZCA6IHNlbGVjdGlvbi50eXBlID09ICdSYW5nZSc7XG4gICAgICAgIGlmICghaXNSYW5nZSkge1xuICAgICAgICAgICAgc2VsZi5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5iaW5kTW91c2UoKTtcbiAgICB0aGlzLmVtaXQoJ29wZW4nKTtcbn07XG5UZXJtaW5hbC5sb2FkQWRkb24gPSBmdW5jdGlvbiAoYWRkb24sIGNhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gcmVxdWlyZSgnLi9hZGRvbnMvJyArIGFkZG9uICsgJy8nICsgYWRkb24pO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHJlcXVpcmUoWycuL2FkZG9ucy8nICsgYWRkb24gKyAnLycgKyBhZGRvbl0sIGNhbGxiYWNrKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Nhbm5vdCBsb2FkIGEgbW9kdWxlIHdpdGhvdXQgYSBDb21tb25KUyBvciBSZXF1aXJlSlMgZW52aXJvbm1lbnQuJyk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuVGVybWluYWwucHJvdG90eXBlLnVwZGF0ZUNoYXJTaXplQ1NTID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuY2hhclNpemVTdHlsZUVsZW1lbnQudGV4dENvbnRlbnQgPSAnLnh0ZXJtLXdpZGUtY2hhcnt3aWR0aDonICsgKHRoaXMuY2hhck1lYXN1cmUud2lkdGggKiAyKSArICdweDt9Jztcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuYmluZE1vdXNlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBlbCA9IHRoaXMuZWxlbWVudCwgc2VsZiA9IHRoaXMsIHByZXNzZWQgPSAzMjtcbiAgICBmdW5jdGlvbiBzZW5kQnV0dG9uKGV2KSB7XG4gICAgICAgIHZhciBidXR0b24sIHBvcztcbiAgICAgICAgYnV0dG9uID0gZ2V0QnV0dG9uKGV2KTtcbiAgICAgICAgcG9zID0gZ2V0Q29vcmRzKGV2KTtcbiAgICAgICAgaWYgKCFwb3MpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHNlbmRFdmVudChidXR0b24sIHBvcyk7XG4gICAgICAgIHN3aXRjaCAoZXYub3ZlcnJpZGVUeXBlIHx8IGV2LnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICAgICAgICAgICAgcHJlc3NlZCA9IGJ1dHRvbjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21vdXNldXAnOlxuICAgICAgICAgICAgICAgIHByZXNzZWQgPSAzMjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3doZWVsJzpcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzZW5kTW92ZShldikge1xuICAgICAgICB2YXIgYnV0dG9uID0gcHJlc3NlZCwgcG9zO1xuICAgICAgICBwb3MgPSBnZXRDb29yZHMoZXYpO1xuICAgICAgICBpZiAoIXBvcylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgYnV0dG9uICs9IDMyO1xuICAgICAgICBzZW5kRXZlbnQoYnV0dG9uLCBwb3MpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBlbmNvZGUoZGF0YSwgY2gpIHtcbiAgICAgICAgaWYgKCFzZWxmLnV0Zk1vdXNlKSB7XG4gICAgICAgICAgICBpZiAoY2ggPT09IDI1NSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5wdXNoKDApO1xuICAgICAgICAgICAgaWYgKGNoID4gMTI3KVxuICAgICAgICAgICAgICAgIGNoID0gMTI3O1xuICAgICAgICAgICAgZGF0YS5wdXNoKGNoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gMjA0NylcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5wdXNoKDApO1xuICAgICAgICAgICAgaWYgKGNoIDwgMTI3KSB7XG4gICAgICAgICAgICAgICAgZGF0YS5wdXNoKGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjaCA+IDIwNDcpXG4gICAgICAgICAgICAgICAgICAgIGNoID0gMjA0NztcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2goMHhDMCB8IChjaCA+PiA2KSk7XG4gICAgICAgICAgICAgICAgZGF0YS5wdXNoKDB4ODAgfCAoY2ggJiAweDNGKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc2VuZEV2ZW50KGJ1dHRvbiwgcG9zKSB7XG4gICAgICAgIGlmIChzZWxmLnZ0MzAwTW91c2UpIHtcbiAgICAgICAgICAgIGJ1dHRvbiAmPSAzO1xuICAgICAgICAgICAgcG9zLnggLT0gMzI7XG4gICAgICAgICAgICBwb3MueSAtPSAzMjtcbiAgICAgICAgICAgIHZhciBkYXRhID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1syNCc7XG4gICAgICAgICAgICBpZiAoYnV0dG9uID09PSAwKVxuICAgICAgICAgICAgICAgIGRhdGEgKz0gJzEnO1xuICAgICAgICAgICAgZWxzZSBpZiAoYnV0dG9uID09PSAxKVxuICAgICAgICAgICAgICAgIGRhdGEgKz0gJzMnO1xuICAgICAgICAgICAgZWxzZSBpZiAoYnV0dG9uID09PSAyKVxuICAgICAgICAgICAgICAgIGRhdGEgKz0gJzUnO1xuICAgICAgICAgICAgZWxzZSBpZiAoYnV0dG9uID09PSAzKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBkYXRhICs9ICcwJztcbiAgICAgICAgICAgIGRhdGEgKz0gJ35bJyArIHBvcy54ICsgJywnICsgcG9zLnkgKyAnXVxccic7XG4gICAgICAgICAgICBzZWxmLnNlbmQoZGF0YSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbGYuZGVjTG9jYXRvcikge1xuICAgICAgICAgICAgYnV0dG9uICY9IDM7XG4gICAgICAgICAgICBwb3MueCAtPSAzMjtcbiAgICAgICAgICAgIHBvcy55IC09IDMyO1xuICAgICAgICAgICAgaWYgKGJ1dHRvbiA9PT0gMClcbiAgICAgICAgICAgICAgICBidXR0b24gPSAyO1xuICAgICAgICAgICAgZWxzZSBpZiAoYnV0dG9uID09PSAxKVxuICAgICAgICAgICAgICAgIGJ1dHRvbiA9IDQ7XG4gICAgICAgICAgICBlbHNlIGlmIChidXR0b24gPT09IDIpXG4gICAgICAgICAgICAgICAgYnV0dG9uID0gNjtcbiAgICAgICAgICAgIGVsc2UgaWYgKGJ1dHRvbiA9PT0gMylcbiAgICAgICAgICAgICAgICBidXR0b24gPSAzO1xuICAgICAgICAgICAgc2VsZi5zZW5kKEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbJ1xuICAgICAgICAgICAgICAgICsgYnV0dG9uXG4gICAgICAgICAgICAgICAgKyAnOydcbiAgICAgICAgICAgICAgICArIChidXR0b24gPT09IDMgPyA0IDogMClcbiAgICAgICAgICAgICAgICArICc7J1xuICAgICAgICAgICAgICAgICsgcG9zLnlcbiAgICAgICAgICAgICAgICArICc7J1xuICAgICAgICAgICAgICAgICsgcG9zLnhcbiAgICAgICAgICAgICAgICArICc7J1xuICAgICAgICAgICAgICAgICsgKHBvcy5wYWdlIHx8IDApXG4gICAgICAgICAgICAgICAgKyAnJncnKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZi51cnh2dE1vdXNlKSB7XG4gICAgICAgICAgICBwb3MueCAtPSAzMjtcbiAgICAgICAgICAgIHBvcy55IC09IDMyO1xuICAgICAgICAgICAgcG9zLngrKztcbiAgICAgICAgICAgIHBvcy55Kys7XG4gICAgICAgICAgICBzZWxmLnNlbmQoRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1snICsgYnV0dG9uICsgJzsnICsgcG9zLnggKyAnOycgKyBwb3MueSArICdNJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlbGYuc2dyTW91c2UpIHtcbiAgICAgICAgICAgIHBvcy54IC09IDMyO1xuICAgICAgICAgICAgcG9zLnkgLT0gMzI7XG4gICAgICAgICAgICBzZWxmLnNlbmQoRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1s8J1xuICAgICAgICAgICAgICAgICsgKCgoYnV0dG9uICYgMykgPT09IDMgPyBidXR0b24gJiB+MyA6IGJ1dHRvbikgLSAzMilcbiAgICAgICAgICAgICAgICArICc7J1xuICAgICAgICAgICAgICAgICsgcG9zLnhcbiAgICAgICAgICAgICAgICArICc7J1xuICAgICAgICAgICAgICAgICsgcG9zLnlcbiAgICAgICAgICAgICAgICArICgoYnV0dG9uICYgMykgPT09IDMgPyAnbScgOiAnTScpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZGF0YSA9IFtdO1xuICAgICAgICBlbmNvZGUoZGF0YSwgYnV0dG9uKTtcbiAgICAgICAgZW5jb2RlKGRhdGEsIHBvcy54KTtcbiAgICAgICAgZW5jb2RlKGRhdGEsIHBvcy55KTtcbiAgICAgICAgc2VsZi5zZW5kKEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbTScgKyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgZGF0YSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRCdXR0b24oZXYpIHtcbiAgICAgICAgdmFyIGJ1dHRvbiwgc2hpZnQsIG1ldGEsIGN0cmwsIG1vZDtcbiAgICAgICAgc3dpdGNoIChldi5vdmVycmlkZVR5cGUgfHwgZXYudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICAgICAgICAgICAgICBidXR0b24gPSBldi5idXR0b24gIT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICA/ICtldi5idXR0b25cbiAgICAgICAgICAgICAgICAgICAgOiBldi53aGljaCAhPSBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGV2LndoaWNoIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLmJyb3dzZXIuaXNNU0lFKSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbiA9IGJ1dHRvbiA9PT0gMSA/IDAgOiBidXR0b24gPT09IDQgPyAxIDogYnV0dG9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21vdXNldXAnOlxuICAgICAgICAgICAgICAgIGJ1dHRvbiA9IDM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdET01Nb3VzZVNjcm9sbCc6XG4gICAgICAgICAgICAgICAgYnV0dG9uID0gZXYuZGV0YWlsIDwgMFxuICAgICAgICAgICAgICAgICAgICA/IDY0XG4gICAgICAgICAgICAgICAgICAgIDogNjU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd3aGVlbCc6XG4gICAgICAgICAgICAgICAgYnV0dG9uID0gZXYud2hlZWxEZWx0YVkgPiAwXG4gICAgICAgICAgICAgICAgICAgID8gNjRcbiAgICAgICAgICAgICAgICAgICAgOiA2NTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBzaGlmdCA9IGV2LnNoaWZ0S2V5ID8gNCA6IDA7XG4gICAgICAgIG1ldGEgPSBldi5tZXRhS2V5ID8gOCA6IDA7XG4gICAgICAgIGN0cmwgPSBldi5jdHJsS2V5ID8gMTYgOiAwO1xuICAgICAgICBtb2QgPSBzaGlmdCB8IG1ldGEgfCBjdHJsO1xuICAgICAgICBpZiAoc2VsZi52dDIwME1vdXNlKSB7XG4gICAgICAgICAgICBtb2QgJj0gY3RybDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghc2VsZi5ub3JtYWxNb3VzZSkge1xuICAgICAgICAgICAgbW9kID0gMDtcbiAgICAgICAgfVxuICAgICAgICBidXR0b24gPSAoMzIgKyAobW9kIDw8IDIpKSArIGJ1dHRvbjtcbiAgICAgICAgcmV0dXJuIGJ1dHRvbjtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0Q29vcmRzKGV2KSB7XG4gICAgICAgIHZhciB4LCB5LCB3LCBoLCBlbDtcbiAgICAgICAgaWYgKGV2LnBhZ2VYID09IG51bGwpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHggPSBldi5wYWdlWDtcbiAgICAgICAgeSA9IGV2LnBhZ2VZO1xuICAgICAgICBlbCA9IHNlbGYuZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKGVsICYmIGVsICE9PSBzZWxmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICAgICAgeCAtPSBlbC5vZmZzZXRMZWZ0O1xuICAgICAgICAgICAgeSAtPSBlbC5vZmZzZXRUb3A7XG4gICAgICAgICAgICBlbCA9ICdvZmZzZXRQYXJlbnQnIGluIGVsXG4gICAgICAgICAgICAgICAgPyBlbC5vZmZzZXRQYXJlbnRcbiAgICAgICAgICAgICAgICA6IGVsLnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgeCA9IE1hdGguY2VpbCh4IC8gc2VsZi5jaGFyTWVhc3VyZS53aWR0aCk7XG4gICAgICAgIHkgPSBNYXRoLmNlaWwoeSAvIHNlbGYuY2hhck1lYXN1cmUuaGVpZ2h0KTtcbiAgICAgICAgaWYgKHggPCAwKVxuICAgICAgICAgICAgeCA9IDA7XG4gICAgICAgIGlmICh4ID4gc2VsZi5jb2xzKVxuICAgICAgICAgICAgeCA9IHNlbGYuY29scztcbiAgICAgICAgaWYgKHkgPCAwKVxuICAgICAgICAgICAgeSA9IDA7XG4gICAgICAgIGlmICh5ID4gc2VsZi5yb3dzKVxuICAgICAgICAgICAgeSA9IHNlbGYucm93cztcbiAgICAgICAgeCArPSAzMjtcbiAgICAgICAgeSArPSAzMjtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHgsXG4gICAgICAgICAgICB5OiB5LFxuICAgICAgICAgICAgdHlwZTogJ3doZWVsJ1xuICAgICAgICB9O1xuICAgIH1cbiAgICBvbihlbCwgJ21vdXNlZG93bicsIGZ1bmN0aW9uIChldikge1xuICAgICAgICBpZiAoIXNlbGYubW91c2VFdmVudHMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHNlbmRCdXR0b24oZXYpO1xuICAgICAgICBzZWxmLmZvY3VzKCk7XG4gICAgICAgIGlmIChzZWxmLnZ0MjAwTW91c2UpIHtcbiAgICAgICAgICAgIGV2Lm92ZXJyaWRlVHlwZSA9ICdtb3VzZXVwJztcbiAgICAgICAgICAgIHNlbmRCdXR0b24oZXYpO1xuICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsKGV2KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZi5ub3JtYWxNb3VzZSlcbiAgICAgICAgICAgIG9uKHNlbGYuZG9jdW1lbnQsICdtb3VzZW1vdmUnLCBzZW5kTW92ZSk7XG4gICAgICAgIGlmICghc2VsZi54MTBNb3VzZSkge1xuICAgICAgICAgICAgb24oc2VsZi5kb2N1bWVudCwgJ21vdXNldXAnLCBmdW5jdGlvbiB1cChldikge1xuICAgICAgICAgICAgICAgIHNlbmRCdXR0b24oZXYpO1xuICAgICAgICAgICAgICAgIGlmIChzZWxmLm5vcm1hbE1vdXNlKVxuICAgICAgICAgICAgICAgICAgICBvZmYoc2VsZi5kb2N1bWVudCwgJ21vdXNlbW92ZScsIHNlbmRNb3ZlKTtcbiAgICAgICAgICAgICAgICBvZmYoc2VsZi5kb2N1bWVudCwgJ21vdXNldXAnLCB1cCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsKGV2KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWxmLmNhbmNlbChldik7XG4gICAgfSk7XG4gICAgb24oZWwsICd3aGVlbCcsIGZ1bmN0aW9uIChldikge1xuICAgICAgICBpZiAoIXNlbGYubW91c2VFdmVudHMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmIChzZWxmLngxME1vdXNlXG4gICAgICAgICAgICB8fCBzZWxmLnZ0MzAwTW91c2VcbiAgICAgICAgICAgIHx8IHNlbGYuZGVjTG9jYXRvcilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgc2VuZEJ1dHRvbihldik7XG4gICAgICAgIHJldHVybiBzZWxmLmNhbmNlbChldik7XG4gICAgfSk7XG4gICAgb24oZWwsICd3aGVlbCcsIGZ1bmN0aW9uIChldikge1xuICAgICAgICBpZiAoc2VsZi5tb3VzZUV2ZW50cylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgc2VsZi52aWV3cG9ydC5vbldoZWVsKGV2KTtcbiAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsKGV2KTtcbiAgICB9KTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnJlYWRhYmxlID0gZmFsc2U7XG4gICAgdGhpcy53cml0YWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIHRoaXMuaGFuZGxlciA9IGZ1bmN0aW9uICgpIHsgfTtcbiAgICB0aGlzLndyaXRlID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgIGlmICh0aGlzLmVsZW1lbnQgJiYgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50KTtcbiAgICB9XG59O1xuVGVybWluYWwucHJvdG90eXBlLnJlZnJlc2ggPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIucXVldWVSZWZyZXNoKHN0YXJ0LCBlbmQpO1xuICAgIH1cbn07XG5UZXJtaW5hbC5wcm90b3R5cGUucXVldWVMaW5raWZpY2F0aW9uID0gZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAodGhpcy5saW5raWZpZXIpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmxpbmtpZmllci5saW5raWZ5Um93KGkpO1xuICAgICAgICB9XG4gICAgfVxufTtcblRlcm1pbmFsLnByb3RvdHlwZS5zaG93Q3Vyc29yID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5jdXJzb3JTdGF0ZSkge1xuICAgICAgICB0aGlzLmN1cnNvclN0YXRlID0gMTtcbiAgICAgICAgdGhpcy5yZWZyZXNoKHRoaXMueSwgdGhpcy55KTtcbiAgICB9XG59O1xuVGVybWluYWwucHJvdG90eXBlLnNjcm9sbCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcm93O1xuICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA9PT0gdGhpcy5saW5lcy5tYXhMZW5ndGgpIHtcbiAgICAgICAgdGhpcy5saW5lcy50cmltU3RhcnQoMSk7XG4gICAgICAgIHRoaXMueWJhc2UtLTtcbiAgICAgICAgaWYgKHRoaXMueWRpc3AgIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMueWRpc3AtLTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnliYXNlKys7XG4gICAgaWYgKCF0aGlzLnVzZXJTY3JvbGxpbmcpIHtcbiAgICAgICAgdGhpcy55ZGlzcCA9IHRoaXMueWJhc2U7XG4gICAgfVxuICAgIHJvdyA9IHRoaXMueWJhc2UgKyB0aGlzLnJvd3MgLSAxO1xuICAgIHJvdyAtPSB0aGlzLnJvd3MgLSAxIC0gdGhpcy5zY3JvbGxCb3R0b207XG4gICAgaWYgKHJvdyA9PT0gdGhpcy5saW5lcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5saW5lcy5wdXNoKHRoaXMuYmxhbmtMaW5lKCkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5saW5lcy5zcGxpY2Uocm93LCAwLCB0aGlzLmJsYW5rTGluZSgpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2Nyb2xsVG9wICE9PSAwKSB7XG4gICAgICAgIGlmICh0aGlzLnliYXNlICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnliYXNlLS07XG4gICAgICAgICAgICBpZiAoIXRoaXMudXNlclNjcm9sbGluZykge1xuICAgICAgICAgICAgICAgIHRoaXMueWRpc3AgPSB0aGlzLnliYXNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubGluZXMuc3BsaWNlKHRoaXMueWJhc2UgKyB0aGlzLnNjcm9sbFRvcCwgMSk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlUmFuZ2UodGhpcy5zY3JvbGxUb3ApO1xuICAgIHRoaXMudXBkYXRlUmFuZ2UodGhpcy5zY3JvbGxCb3R0b20pO1xuICAgIHRoaXMuZW1pdCgnc2Nyb2xsJywgdGhpcy55ZGlzcCk7XG59O1xuVGVybWluYWwucHJvdG90eXBlLnNjcm9sbERpc3AgPSBmdW5jdGlvbiAoZGlzcCwgc3VwcHJlc3NTY3JvbGxFdmVudCkge1xuICAgIGlmIChkaXNwIDwgMCkge1xuICAgICAgICB0aGlzLnVzZXJTY3JvbGxpbmcgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmIChkaXNwICsgdGhpcy55ZGlzcCA+PSB0aGlzLnliYXNlKSB7XG4gICAgICAgIHRoaXMudXNlclNjcm9sbGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnlkaXNwICs9IGRpc3A7XG4gICAgaWYgKHRoaXMueWRpc3AgPiB0aGlzLnliYXNlKSB7XG4gICAgICAgIHRoaXMueWRpc3AgPSB0aGlzLnliYXNlO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLnlkaXNwIDwgMCkge1xuICAgICAgICB0aGlzLnlkaXNwID0gMDtcbiAgICB9XG4gICAgaWYgKCFzdXBwcmVzc1Njcm9sbEV2ZW50KSB7XG4gICAgICAgIHRoaXMuZW1pdCgnc2Nyb2xsJywgdGhpcy55ZGlzcCk7XG4gICAgfVxuICAgIHRoaXMucmVmcmVzaCgwLCB0aGlzLnJvd3MgLSAxKTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuc2Nyb2xsUGFnZXMgPSBmdW5jdGlvbiAocGFnZUNvdW50KSB7XG4gICAgdGhpcy5zY3JvbGxEaXNwKHBhZ2VDb3VudCAqICh0aGlzLnJvd3MgLSAxKSk7XG59O1xuVGVybWluYWwucHJvdG90eXBlLnNjcm9sbFRvVG9wID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuc2Nyb2xsRGlzcCgtdGhpcy55ZGlzcCk7XG59O1xuVGVybWluYWwucHJvdG90eXBlLnNjcm9sbFRvQm90dG9tID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuc2Nyb2xsRGlzcCh0aGlzLnliYXNlIC0gdGhpcy55ZGlzcCk7XG59O1xuVGVybWluYWwucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB0aGlzLndyaXRlQnVmZmVyLnB1c2goZGF0YSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy51c2VGbG93Q29udHJvbCAmJiAhdGhpcy54b2ZmU2VudFRvQ2F0Y2hVcCAmJiB0aGlzLndyaXRlQnVmZmVyLmxlbmd0aCA+PSBXUklURV9CVUZGRVJfUEFVU0VfVEhSRVNIT0xEKSB7XG4gICAgICAgIHRoaXMuc2VuZChFc2NhcGVTZXF1ZW5jZXNfMS5DMC5EQzMpO1xuICAgICAgICB0aGlzLnhvZmZTZW50VG9DYXRjaFVwID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLndyaXRlSW5Qcm9ncmVzcyAmJiB0aGlzLndyaXRlQnVmZmVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy53cml0ZUluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5pbm5lcldyaXRlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuaW5uZXJXcml0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgd3JpdGVCYXRjaCA9IHRoaXMud3JpdGVCdWZmZXIuc3BsaWNlKDAsIFdSSVRFX0JBVENIX1NJWkUpO1xuICAgIHdoaWxlICh3cml0ZUJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIGRhdGEgPSB3cml0ZUJhdGNoLnNoaWZ0KCk7XG4gICAgICAgIHZhciBsID0gZGF0YS5sZW5ndGgsIGkgPSAwLCBqLCBjcywgY2gsIGNvZGUsIGxvdywgY2hfd2lkdGgsIHJvdztcbiAgICAgICAgaWYgKHRoaXMueG9mZlNlbnRUb0NhdGNoVXAgJiYgd3JpdGVCYXRjaC5sZW5ndGggPT09IDAgJiYgdGhpcy53cml0ZUJ1ZmZlci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZChFc2NhcGVTZXF1ZW5jZXNfMS5DMC5EQzEpO1xuICAgICAgICAgICAgdGhpcy54b2ZmU2VudFRvQ2F0Y2hVcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVmcmVzaFN0YXJ0ID0gdGhpcy55O1xuICAgICAgICB0aGlzLnJlZnJlc2hFbmQgPSB0aGlzLnk7XG4gICAgICAgIHRoaXMucGFyc2VyLnBhcnNlKGRhdGEpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJhbmdlKHRoaXMueSk7XG4gICAgICAgIHRoaXMucmVmcmVzaCh0aGlzLnJlZnJlc2hTdGFydCwgdGhpcy5yZWZyZXNoRW5kKTtcbiAgICB9XG4gICAgaWYgKHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5pbm5lcldyaXRlKCk7XG4gICAgICAgIH0sIDApO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhpcy53cml0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB9XG59O1xuVGVybWluYWwucHJvdG90eXBlLndyaXRlbG4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHRoaXMud3JpdGUoZGF0YSArICdcXHJcXG4nKTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuYXR0YWNoQ3VzdG9tS2V5ZG93bkhhbmRsZXIgPSBmdW5jdGlvbiAoY3VzdG9tS2V5ZG93bkhhbmRsZXIpIHtcbiAgICB0aGlzLmN1c3RvbUtleWRvd25IYW5kbGVyID0gY3VzdG9tS2V5ZG93bkhhbmRsZXI7XG59O1xuVGVybWluYWwucHJvdG90eXBlLnNldEh5cGVydGV4dExpbmtIYW5kbGVyID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICBpZiAoIXRoaXMubGlua2lmaWVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGF0dGFjaCBhIGh5cGVydGV4dCBsaW5rIGhhbmRsZXIgYmVmb3JlIFRlcm1pbmFsLm9wZW4gaXMgY2FsbGVkJyk7XG4gICAgfVxuICAgIHRoaXMubGlua2lmaWVyLnNldEh5cGVydGV4dExpbmtIYW5kbGVyKGhhbmRsZXIpO1xuICAgIHRoaXMucmVmcmVzaCgwLCB0aGlzLnJvd3MgLSAxKTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuc2V0SHlwZXJ0ZXh0VmFsaWRhdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24gKGhhbmRsZXIpIHtcbiAgICBpZiAoIXRoaXMubGlua2lmaWVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGF0dGFjaCBhIGh5cGVydGV4dCB2YWxpZGF0aW9uIGNhbGxiYWNrIGJlZm9yZSBUZXJtaW5hbC5vcGVuIGlzIGNhbGxlZCcpO1xuICAgIH1cbiAgICB0aGlzLmxpbmtpZmllci5zZXRIeXBlcnRleHRWYWxpZGF0aW9uQ2FsbGJhY2soaGFuZGxlcik7XG4gICAgdGhpcy5yZWZyZXNoKDAsIHRoaXMucm93cyAtIDEpO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5yZWdpc3RlckxpbmtNYXRjaGVyID0gZnVuY3Rpb24gKHJlZ2V4LCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMubGlua2lmaWVyKSB7XG4gICAgICAgIHZhciBtYXRjaGVySWQgPSB0aGlzLmxpbmtpZmllci5yZWdpc3RlckxpbmtNYXRjaGVyKHJlZ2V4LCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoKDAsIHRoaXMucm93cyAtIDEpO1xuICAgICAgICByZXR1cm4gbWF0Y2hlcklkO1xuICAgIH1cbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuZGVyZWdpc3RlckxpbmtNYXRjaGVyID0gZnVuY3Rpb24gKG1hdGNoZXJJZCkge1xuICAgIGlmICh0aGlzLmxpbmtpZmllcikge1xuICAgICAgICBpZiAodGhpcy5saW5raWZpZXIuZGVyZWdpc3RlckxpbmtNYXRjaGVyKG1hdGNoZXJJZCkpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaCgwLCB0aGlzLnJvd3MgLSAxKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5UZXJtaW5hbC5wcm90b3R5cGUua2V5RG93biA9IGZ1bmN0aW9uIChldikge1xuICAgIGlmICh0aGlzLmN1c3RvbUtleWRvd25IYW5kbGVyICYmIHRoaXMuY3VzdG9tS2V5ZG93bkhhbmRsZXIoZXYpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMucmVzdGFydEN1cnNvckJsaW5raW5nKCk7XG4gICAgaWYgKCF0aGlzLmNvbXBvc2l0aW9uSGVscGVyLmtleWRvd24uYmluZCh0aGlzLmNvbXBvc2l0aW9uSGVscGVyKShldikpIHtcbiAgICAgICAgaWYgKHRoaXMueWJhc2UgIT09IHRoaXMueWRpc3ApIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5ldmFsdWF0ZUtleUVzY2FwZVNlcXVlbmNlKGV2KTtcbiAgICBpZiAocmVzdWx0LmtleSA9PT0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuREMzKSB7XG4gICAgICAgIHRoaXMud3JpdGVTdG9wcGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAocmVzdWx0LmtleSA9PT0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuREMxKSB7XG4gICAgICAgIHRoaXMud3JpdGVTdG9wcGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGlmIChyZXN1bHQuc2Nyb2xsRGlzcCkge1xuICAgICAgICB0aGlzLnNjcm9sbERpc3AocmVzdWx0LnNjcm9sbERpc3ApO1xuICAgICAgICByZXR1cm4gdGhpcy5jYW5jZWwoZXYsIHRydWUpO1xuICAgIH1cbiAgICBpZiAoaXNUaGlyZExldmVsU2hpZnQodGhpcywgZXYpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAocmVzdWx0LmNhbmNlbCkge1xuICAgICAgICB0aGlzLmNhbmNlbChldiwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmICghcmVzdWx0LmtleSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgdGhpcy5lbWl0KCdrZXlkb3duJywgZXYpO1xuICAgIHRoaXMuZW1pdCgna2V5JywgcmVzdWx0LmtleSwgZXYpO1xuICAgIHRoaXMuc2hvd0N1cnNvcigpO1xuICAgIHRoaXMuaGFuZGxlcihyZXN1bHQua2V5KTtcbiAgICByZXR1cm4gdGhpcy5jYW5jZWwoZXYsIHRydWUpO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5ldmFsdWF0ZUtleUVzY2FwZVNlcXVlbmNlID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgdmFyIHJlc3VsdCA9IHtcbiAgICAgICAgY2FuY2VsOiBmYWxzZSxcbiAgICAgICAga2V5OiB1bmRlZmluZWQsXG4gICAgICAgIHNjcm9sbERpc3A6IHVuZGVmaW5lZFxuICAgIH07XG4gICAgdmFyIG1vZGlmaWVycyA9IGV2LnNoaWZ0S2V5IDw8IDAgfCBldi5hbHRLZXkgPDwgMSB8IGV2LmN0cmxLZXkgPDwgMiB8IGV2Lm1ldGFLZXkgPDwgMztcbiAgICBzd2l0Y2ggKGV2LmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSA4OlxuICAgICAgICAgICAgaWYgKGV2LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkJTO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkRFTDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICBpZiAoZXYuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1taJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5IVDtcbiAgICAgICAgICAgIHJlc3VsdC5jYW5jZWwgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuQ1I7XG4gICAgICAgICAgICByZXN1bHQuY2FuY2VsID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQztcbiAgICAgICAgICAgIHJlc3VsdC5jYW5jZWwgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzc6XG4gICAgICAgICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTsnICsgKG1vZGlmaWVycyArIDEpICsgJ0QnO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQua2V5ID09IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTszRCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9ICh0aGlzLmJyb3dzZXIuaXNNYWMpID8gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ2InIDogRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1sxOzVEJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmFwcGxpY2F0aW9uQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdPRCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1tEJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzE7JyArIChtb2RpZmllcnMgKyAxKSArICdDJztcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmtleSA9PSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzE7M0MnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSAodGhpcy5icm93c2VyLmlzTWFjKSA/IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdmJyA6IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTs1Qyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5hcHBsaWNhdGlvbkN1cnNvcikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnT0MnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbQyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzODpcbiAgICAgICAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1sxOycgKyAobW9kaWZpZXJzICsgMSkgKyAnQSc7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5rZXkgPT0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1sxOzNBJykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1sxOzVBJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmFwcGxpY2F0aW9uQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdPQSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1tBJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQwOlxuICAgICAgICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzE7JyArIChtb2RpZmllcnMgKyAxKSArICdCJztcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmtleSA9PSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzE7M0InKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzE7NUInO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuYXBwbGljYXRpb25DdXJzb3IpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ09CJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnW0InO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDU6XG4gICAgICAgICAgICBpZiAoIWV2LnNoaWZ0S2V5ICYmICFldi5jdHJsS2V5KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMn4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDY6XG4gICAgICAgICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMzsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbM34nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzY6XG4gICAgICAgICAgICBpZiAobW9kaWZpZXJzKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzE7JyArIChtb2RpZmllcnMgKyAxKSArICdIJztcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuYXBwbGljYXRpb25DdXJzb3IpXG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdPSCc7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbSCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzNTpcbiAgICAgICAgICAgIGlmIChtb2RpZmllcnMpXG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTsnICsgKG1vZGlmaWVycyArIDEpICsgJ0YnO1xuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5hcHBsaWNhdGlvbkN1cnNvcilcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ09GJztcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1tGJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDMzOlxuICAgICAgICAgICAgaWYgKGV2LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnNjcm9sbERpc3AgPSAtKHRoaXMucm93cyAtIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbNX4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzQ6XG4gICAgICAgICAgICBpZiAoZXYuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuc2Nyb2xsRGlzcCA9IHRoaXMucm93cyAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1s2fic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMTI6XG4gICAgICAgICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTsnICsgKG1vZGlmaWVycyArIDEpICsgJ1AnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdPUCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMTM6XG4gICAgICAgICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTsnICsgKG1vZGlmaWVycyArIDEpICsgJ1EnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdPUSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMTQ6XG4gICAgICAgICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTsnICsgKG1vZGlmaWVycyArIDEpICsgJ1InO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdPUic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMTU6XG4gICAgICAgICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTsnICsgKG1vZGlmaWVycyArIDEpICsgJ1MnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdPUyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMTY6XG4gICAgICAgICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTU7JyArIChtb2RpZmllcnMgKyAxKSArICd+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzE1fic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMTc6XG4gICAgICAgICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTc7JyArIChtb2RpZmllcnMgKyAxKSArICd+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzE3fic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMTg6XG4gICAgICAgICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTg7JyArIChtb2RpZmllcnMgKyAxKSArICd+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzE4fic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMTk6XG4gICAgICAgICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTk7JyArIChtb2RpZmllcnMgKyAxKSArICd+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzE5fic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjA6XG4gICAgICAgICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMjA7JyArIChtb2RpZmllcnMgKyAxKSArICd+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzIwfic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjE6XG4gICAgICAgICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMjE7JyArIChtb2RpZmllcnMgKyAxKSArICd+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzIxfic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjI6XG4gICAgICAgICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMjM7JyArIChtb2RpZmllcnMgKyAxKSArICd+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzIzfic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjM6XG4gICAgICAgICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMjQ7JyArIChtb2RpZmllcnMgKyAxKSArICd+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzI0fic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChldi5jdHJsS2V5ICYmICFldi5zaGlmdEtleSAmJiAhZXYuYWx0S2V5ICYmICFldi5tZXRhS2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGV2LmtleUNvZGUgPj0gNjUgJiYgZXYua2V5Q29kZSA8PSA5MCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gU3RyaW5nLmZyb21DaGFyQ29kZShldi5rZXlDb2RlIC0gNjQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChldi5rZXlDb2RlID09PSAzMikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gU3RyaW5nLmZyb21DaGFyQ29kZSgwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXYua2V5Q29kZSA+PSA1MSAmJiBldi5rZXlDb2RlIDw9IDU1KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2LmtleUNvZGUgLSA1MSArIDI3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXYua2V5Q29kZSA9PT0gNTYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMTI3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXYua2V5Q29kZSA9PT0gMjE5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDI3KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXYua2V5Q29kZSA9PT0gMjIwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDI4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXYua2V5Q29kZSA9PT0gMjIxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDI5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICghdGhpcy5icm93c2VyLmlzTWFjICYmIGV2LmFsdEtleSAmJiAhZXYuY3RybEtleSAmJiAhZXYubWV0YUtleSkge1xuICAgICAgICAgICAgICAgIGlmIChldi5rZXlDb2RlID49IDY1ICYmIGV2LmtleUNvZGUgPD0gOTApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArIFN0cmluZy5mcm9tQ2hhckNvZGUoZXYua2V5Q29kZSArIDMyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXYua2V5Q29kZSA9PT0gMTkyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnYCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV2LmtleUNvZGUgPj0gNDggJiYgZXYua2V5Q29kZSA8PSA1Nykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgKGV2LmtleUNvZGUgLSA0OCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuVGVybWluYWwucHJvdG90eXBlLnNldGdMZXZlbCA9IGZ1bmN0aW9uIChnKSB7XG4gICAgdGhpcy5nbGV2ZWwgPSBnO1xuICAgIHRoaXMuY2hhcnNldCA9IHRoaXMuY2hhcnNldHNbZ107XG59O1xuVGVybWluYWwucHJvdG90eXBlLnNldGdDaGFyc2V0ID0gZnVuY3Rpb24gKGcsIGNoYXJzZXQpIHtcbiAgICB0aGlzLmNoYXJzZXRzW2ddID0gY2hhcnNldDtcbiAgICBpZiAodGhpcy5nbGV2ZWwgPT09IGcpIHtcbiAgICAgICAgdGhpcy5jaGFyc2V0ID0gY2hhcnNldDtcbiAgICB9XG59O1xuVGVybWluYWwucHJvdG90eXBlLmtleVByZXNzID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgdmFyIGtleTtcbiAgICB0aGlzLmNhbmNlbChldik7XG4gICAgaWYgKGV2LmNoYXJDb2RlKSB7XG4gICAgICAgIGtleSA9IGV2LmNoYXJDb2RlO1xuICAgIH1cbiAgICBlbHNlIGlmIChldi53aGljaCA9PSBudWxsKSB7XG4gICAgICAgIGtleSA9IGV2LmtleUNvZGU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2LndoaWNoICE9PSAwICYmIGV2LmNoYXJDb2RlICE9PSAwKSB7XG4gICAgICAgIGtleSA9IGV2LndoaWNoO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoIWtleSB8fCAoKGV2LmFsdEtleSB8fCBldi5jdHJsS2V5IHx8IGV2Lm1ldGFLZXkpICYmICFpc1RoaXJkTGV2ZWxTaGlmdCh0aGlzLCBldikpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAga2V5ID0gU3RyaW5nLmZyb21DaGFyQ29kZShrZXkpO1xuICAgIHRoaXMuZW1pdCgna2V5cHJlc3MnLCBrZXksIGV2KTtcbiAgICB0aGlzLmVtaXQoJ2tleScsIGtleSwgZXYpO1xuICAgIHRoaXMuc2hvd0N1cnNvcigpO1xuICAgIHRoaXMuaGFuZGxlcihrZXkpO1xuICAgIHJldHVybiBmYWxzZTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIGlmICghdGhpcy5xdWV1ZSkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHNlbGYuaGFuZGxlcihzZWxmLnF1ZXVlKTtcbiAgICAgICAgICAgIHNlbGYucXVldWUgPSAnJztcbiAgICAgICAgfSwgMSk7XG4gICAgfVxuICAgIHRoaXMucXVldWUgKz0gZGF0YTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuYmVsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMudmlzdWFsQmVsbClcbiAgICAgICAgcmV0dXJuO1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLmVsZW1lbnQuc3R5bGUuYm9yZGVyQ29sb3IgPSAnd2hpdGUnO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLmVsZW1lbnQuc3R5bGUuYm9yZGVyQ29sb3IgPSAnJztcbiAgICB9LCAxMCk7XG4gICAgaWYgKHRoaXMucG9wT25CZWxsKVxuICAgICAgICB0aGlzLmZvY3VzKCk7XG59O1xuVGVybWluYWwucHJvdG90eXBlLmxvZyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuZGVidWcpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAoIXRoaXMuY29udGV4dC5jb25zb2xlIHx8ICF0aGlzLmNvbnRleHQuY29uc29sZS5sb2cpXG4gICAgICAgIHJldHVybjtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgdGhpcy5jb250ZXh0LmNvbnNvbGUubG9nLmFwcGx5KHRoaXMuY29udGV4dC5jb25zb2xlLCBhcmdzKTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmRlYnVnKVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKCF0aGlzLmNvbnRleHQuY29uc29sZSB8fCAhdGhpcy5jb250ZXh0LmNvbnNvbGUuZXJyb3IpXG4gICAgICAgIHJldHVybjtcbiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgdGhpcy5jb250ZXh0LmNvbnNvbGUuZXJyb3IuYXBwbHkodGhpcy5jb250ZXh0LmNvbnNvbGUsIGFyZ3MpO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5yZXNpemUgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgIGlmIChpc05hTih4KSB8fCBpc05hTih5KSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBsaW5lLCBlbCwgaSwgaiwgY2gsIGFkZFRvWTtcbiAgICBpZiAoeCA9PT0gdGhpcy5jb2xzICYmIHkgPT09IHRoaXMucm93cykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh4IDwgMSlcbiAgICAgICAgeCA9IDE7XG4gICAgaWYgKHkgPCAxKVxuICAgICAgICB5ID0gMTtcbiAgICBqID0gdGhpcy5jb2xzO1xuICAgIGlmIChqIDwgeCkge1xuICAgICAgICBjaCA9IFt0aGlzLmRlZkF0dHIsICcgJywgMV07XG4gICAgICAgIGkgPSB0aGlzLmxpbmVzLmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMubGluZXMuZ2V0KGkpLmxlbmd0aCA8IHgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVzLmdldChpKS5wdXNoKGNoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNvbHMgPSB4O1xuICAgIHRoaXMuc2V0dXBTdG9wcyh0aGlzLmNvbHMpO1xuICAgIGogPSB0aGlzLnJvd3M7XG4gICAgYWRkVG9ZID0gMDtcbiAgICBpZiAoaiA8IHkpIHtcbiAgICAgICAgZWwgPSB0aGlzLmVsZW1lbnQ7XG4gICAgICAgIHdoaWxlIChqKysgPCB5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5saW5lcy5sZW5ndGggPCB5ICsgdGhpcy55YmFzZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnliYXNlID4gMCAmJiB0aGlzLmxpbmVzLmxlbmd0aCA8PSB0aGlzLnliYXNlICsgdGhpcy55ICsgYWRkVG9ZICsgMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnliYXNlLS07XG4gICAgICAgICAgICAgICAgICAgIGFkZFRvWSsrO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy55ZGlzcCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueWRpc3AtLTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lcy5wdXNoKHRoaXMuYmxhbmtMaW5lKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA8IHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluc2VydFJvdygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB3aGlsZSAoai0tID4geSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubGluZXMubGVuZ3RoID4geSArIHRoaXMueWJhc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5saW5lcy5sZW5ndGggPiB0aGlzLnliYXNlICsgdGhpcy55ICsgMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVzLnBvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55YmFzZSsrO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnlkaXNwKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4geSkge1xuICAgICAgICAgICAgICAgIGVsID0gdGhpcy5jaGlsZHJlbi5zaGlmdCgpO1xuICAgICAgICAgICAgICAgIGlmICghZWwpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHRoaXMucm93cyA9IHk7XG4gICAgaWYgKHRoaXMueSA+PSB5KSB7XG4gICAgICAgIHRoaXMueSA9IHkgLSAxO1xuICAgIH1cbiAgICBpZiAoYWRkVG9ZKSB7XG4gICAgICAgIHRoaXMueSArPSBhZGRUb1k7XG4gICAgfVxuICAgIGlmICh0aGlzLnggPj0geCkge1xuICAgICAgICB0aGlzLnggPSB4IC0gMTtcbiAgICB9XG4gICAgdGhpcy5zY3JvbGxUb3AgPSAwO1xuICAgIHRoaXMuc2Nyb2xsQm90dG9tID0geSAtIDE7XG4gICAgdGhpcy5jaGFyTWVhc3VyZS5tZWFzdXJlKCk7XG4gICAgdGhpcy5yZWZyZXNoKDAsIHRoaXMucm93cyAtIDEpO1xuICAgIHRoaXMubm9ybWFsID0gbnVsbDtcbiAgICB0aGlzLmdlb21ldHJ5ID0gW3RoaXMuY29scywgdGhpcy5yb3dzXTtcbiAgICB0aGlzLmVtaXQoJ3Jlc2l6ZScsIHsgdGVybWluYWw6IHRoaXMsIGNvbHM6IHgsIHJvd3M6IHkgfSk7XG59O1xuVGVybWluYWwucHJvdG90eXBlLnVwZGF0ZVJhbmdlID0gZnVuY3Rpb24gKHkpIHtcbiAgICBpZiAoeSA8IHRoaXMucmVmcmVzaFN0YXJ0KVxuICAgICAgICB0aGlzLnJlZnJlc2hTdGFydCA9IHk7XG4gICAgaWYgKHkgPiB0aGlzLnJlZnJlc2hFbmQpXG4gICAgICAgIHRoaXMucmVmcmVzaEVuZCA9IHk7XG59O1xuVGVybWluYWwucHJvdG90eXBlLm1heFJhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMucmVmcmVzaFN0YXJ0ID0gMDtcbiAgICB0aGlzLnJlZnJlc2hFbmQgPSB0aGlzLnJvd3MgLSAxO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5zZXR1cFN0b3BzID0gZnVuY3Rpb24gKGkpIHtcbiAgICBpZiAoaSAhPSBudWxsKSB7XG4gICAgICAgIGlmICghdGhpcy50YWJzW2ldKSB7XG4gICAgICAgICAgICBpID0gdGhpcy5wcmV2U3RvcChpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhpcy50YWJzID0ge307XG4gICAgICAgIGkgPSAwO1xuICAgIH1cbiAgICBmb3IgKDsgaSA8IHRoaXMuY29sczsgaSArPSB0aGlzLmdldE9wdGlvbigndGFiU3RvcFdpZHRoJykpIHtcbiAgICAgICAgdGhpcy50YWJzW2ldID0gdHJ1ZTtcbiAgICB9XG59O1xuVGVybWluYWwucHJvdG90eXBlLnByZXZTdG9wID0gZnVuY3Rpb24gKHgpIHtcbiAgICBpZiAoeCA9PSBudWxsKVxuICAgICAgICB4ID0gdGhpcy54O1xuICAgIHdoaWxlICghdGhpcy50YWJzWy0teF0gJiYgeCA+IDApXG4gICAgICAgIDtcbiAgICByZXR1cm4geCA+PSB0aGlzLmNvbHNcbiAgICAgICAgPyB0aGlzLmNvbHMgLSAxXG4gICAgICAgIDogeCA8IDAgPyAwIDogeDtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUubmV4dFN0b3AgPSBmdW5jdGlvbiAoeCkge1xuICAgIGlmICh4ID09IG51bGwpXG4gICAgICAgIHggPSB0aGlzLng7XG4gICAgd2hpbGUgKCF0aGlzLnRhYnNbKyt4XSAmJiB4IDwgdGhpcy5jb2xzKVxuICAgICAgICA7XG4gICAgcmV0dXJuIHggPj0gdGhpcy5jb2xzXG4gICAgICAgID8gdGhpcy5jb2xzIC0gMVxuICAgICAgICA6IHggPCAwID8gMCA6IHg7XG59O1xuVGVybWluYWwucHJvdG90eXBlLmVyYXNlUmlnaHQgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgIHZhciBsaW5lID0gdGhpcy5saW5lcy5nZXQodGhpcy55YmFzZSArIHkpO1xuICAgIGlmICghbGluZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBjaCA9IFt0aGlzLmVyYXNlQXR0cigpLCAnICcsIDFdO1xuICAgIGZvciAoOyB4IDwgdGhpcy5jb2xzOyB4KyspIHtcbiAgICAgICAgbGluZVt4XSA9IGNoO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVJhbmdlKHkpO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5lcmFzZUxlZnQgPSBmdW5jdGlvbiAoeCwgeSkge1xuICAgIHZhciBsaW5lID0gdGhpcy5saW5lcy5nZXQodGhpcy55YmFzZSArIHkpO1xuICAgIGlmICghbGluZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBjaCA9IFt0aGlzLmVyYXNlQXR0cigpLCAnICcsIDFdO1xuICAgIHgrKztcbiAgICB3aGlsZSAoeC0tKSB7XG4gICAgICAgIGxpbmVbeF0gPSBjaDtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVSYW5nZSh5KTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHRoaXMueWJhc2UgPT09IDAgJiYgdGhpcy55ID09PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5saW5lcy5zZXQoMCwgdGhpcy5saW5lcy5nZXQodGhpcy55YmFzZSArIHRoaXMueSkpO1xuICAgIHRoaXMubGluZXMubGVuZ3RoID0gMTtcbiAgICB0aGlzLnlkaXNwID0gMDtcbiAgICB0aGlzLnliYXNlID0gMDtcbiAgICB0aGlzLnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgdGhpcy5yb3dzOyBpKyspIHtcbiAgICAgICAgdGhpcy5saW5lcy5wdXNoKHRoaXMuYmxhbmtMaW5lKCkpO1xuICAgIH1cbiAgICB0aGlzLnJlZnJlc2goMCwgdGhpcy5yb3dzIC0gMSk7XG4gICAgdGhpcy5lbWl0KCdzY3JvbGwnLCB0aGlzLnlkaXNwKTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuZXJhc2VMaW5lID0gZnVuY3Rpb24gKHkpIHtcbiAgICB0aGlzLmVyYXNlUmlnaHQoMCwgeSk7XG59O1xuVGVybWluYWwucHJvdG90eXBlLmJsYW5rTGluZSA9IGZ1bmN0aW9uIChjdXIpIHtcbiAgICB2YXIgYXR0ciA9IGN1clxuICAgICAgICA/IHRoaXMuZXJhc2VBdHRyKClcbiAgICAgICAgOiB0aGlzLmRlZkF0dHI7XG4gICAgdmFyIGNoID0gW2F0dHIsICcgJywgMV0sIGxpbmUgPSBbXSwgaSA9IDA7XG4gICAgZm9yICg7IGkgPCB0aGlzLmNvbHM7IGkrKykge1xuICAgICAgICBsaW5lW2ldID0gY2g7XG4gICAgfVxuICAgIHJldHVybiBsaW5lO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5jaCA9IGZ1bmN0aW9uIChjdXIpIHtcbiAgICByZXR1cm4gY3VyXG4gICAgICAgID8gW3RoaXMuZXJhc2VBdHRyKCksICcgJywgMV1cbiAgICAgICAgOiBbdGhpcy5kZWZBdHRyLCAnICcsIDFdO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5pcyA9IGZ1bmN0aW9uICh0ZXJtKSB7XG4gICAgdmFyIG5hbWUgPSB0aGlzLnRlcm1OYW1lO1xuICAgIHJldHVybiAobmFtZSArICcnKS5pbmRleE9mKHRlcm0pID09PSAwO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5oYW5kbGVyID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLmRpc2FibGVTdGRpbikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnliYXNlICE9PSB0aGlzLnlkaXNwKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsVG9Cb3R0b20oKTtcbiAgICB9XG4gICAgdGhpcy5lbWl0KCdkYXRhJywgZGF0YSk7XG59O1xuVGVybWluYWwucHJvdG90eXBlLmhhbmRsZVRpdGxlID0gZnVuY3Rpb24gKHRpdGxlKSB7XG4gICAgdGhpcy5lbWl0KCd0aXRsZScsIHRpdGxlKTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuaW5kZXggPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy55Kys7XG4gICAgaWYgKHRoaXMueSA+IHRoaXMuc2Nyb2xsQm90dG9tKSB7XG4gICAgICAgIHRoaXMueS0tO1xuICAgICAgICB0aGlzLnNjcm9sbCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy54ID49IHRoaXMuY29scykge1xuICAgICAgICB0aGlzLngtLTtcbiAgICB9XG59O1xuVGVybWluYWwucHJvdG90eXBlLnJldmVyc2VJbmRleCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgajtcbiAgICBpZiAodGhpcy55ID09PSB0aGlzLnNjcm9sbFRvcCkge1xuICAgICAgICB0aGlzLmxpbmVzLnNoaWZ0RWxlbWVudHModGhpcy55ICsgdGhpcy55YmFzZSwgdGhpcy5yb3dzIC0gMSwgMSk7XG4gICAgICAgIHRoaXMubGluZXMuc2V0KHRoaXMueSArIHRoaXMueWJhc2UsIHRoaXMuYmxhbmtMaW5lKHRydWUpKTtcbiAgICAgICAgdGhpcy51cGRhdGVSYW5nZSh0aGlzLnNjcm9sbFRvcCk7XG4gICAgICAgIHRoaXMudXBkYXRlUmFuZ2UodGhpcy5zY3JvbGxCb3R0b20pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhpcy55LS07XG4gICAgfVxufTtcblRlcm1pbmFsLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLm9wdGlvbnMucm93cyA9IHRoaXMucm93cztcbiAgICB0aGlzLm9wdGlvbnMuY29scyA9IHRoaXMuY29scztcbiAgICB2YXIgY3VzdG9tS2V5ZG93bkhhbmRsZXIgPSB0aGlzLmN1c3RvbUtleWRvd25IYW5kbGVyO1xuICAgIHZhciBjdXJzb3JCbGlua0ludGVydmFsID0gdGhpcy5jdXJzb3JCbGlua0ludGVydmFsO1xuICAgIFRlcm1pbmFsLmNhbGwodGhpcywgdGhpcy5vcHRpb25zKTtcbiAgICB0aGlzLmN1c3RvbUtleWRvd25IYW5kbGVyID0gY3VzdG9tS2V5ZG93bkhhbmRsZXI7XG4gICAgdGhpcy5jdXJzb3JCbGlua0ludGVydmFsID0gY3Vyc29yQmxpbmtJbnRlcnZhbDtcbiAgICB0aGlzLnJlZnJlc2goMCwgdGhpcy5yb3dzIC0gMSk7XG4gICAgdGhpcy52aWV3cG9ydC5zeW5jU2Nyb2xsQXJlYSgpO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS50YWJTZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy50YWJzW3RoaXMueF0gPSB0cnVlO1xufTtcbmZ1bmN0aW9uIG9uKGVsLCB0eXBlLCBoYW5kbGVyLCBjYXB0dXJlKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGVsKSkge1xuICAgICAgICBlbCA9IFtlbF07XG4gICAgfVxuICAgIGVsLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIGNhcHR1cmUgfHwgZmFsc2UpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gb2ZmKGVsLCB0eXBlLCBoYW5kbGVyLCBjYXB0dXJlKSB7XG4gICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBoYW5kbGVyLCBjYXB0dXJlIHx8IGZhbHNlKTtcbn1cbmZ1bmN0aW9uIGNhbmNlbChldiwgZm9yY2UpIHtcbiAgICBpZiAoIXRoaXMuY2FuY2VsRXZlbnRzICYmICFmb3JjZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaW5oZXJpdHMoY2hpbGQsIHBhcmVudCkge1xuICAgIGZ1bmN0aW9uIGYoKSB7XG4gICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDtcbiAgICB9XG4gICAgZi5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlO1xuICAgIGNoaWxkLnByb3RvdHlwZSA9IG5ldyBmO1xufVxuZnVuY3Rpb24gaW5kZXhPZihvYmosIGVsKSB7XG4gICAgdmFyIGkgPSBvYmoubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgaWYgKG9ialtpXSA9PT0gZWwpXG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xufVxuZnVuY3Rpb24gaXNUaGlyZExldmVsU2hpZnQodGVybSwgZXYpIHtcbiAgICB2YXIgdGhpcmRMZXZlbEtleSA9ICh0ZXJtLmJyb3dzZXIuaXNNYWMgJiYgZXYuYWx0S2V5ICYmICFldi5jdHJsS2V5ICYmICFldi5tZXRhS2V5KSB8fFxuICAgICAgICAodGVybS5icm93c2VyLmlzTVNXaW5kb3dzICYmIGV2LmFsdEtleSAmJiBldi5jdHJsS2V5ICYmICFldi5tZXRhS2V5KTtcbiAgICBpZiAoZXYudHlwZSA9PSAna2V5cHJlc3MnKSB7XG4gICAgICAgIHJldHVybiB0aGlyZExldmVsS2V5O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcmRMZXZlbEtleSAmJiAoIWV2LmtleUNvZGUgfHwgZXYua2V5Q29kZSA+IDQ3KTtcbn1cblRlcm1pbmFsLnByb3RvdHlwZS5tYXRjaENvbG9yID0gbWF0Y2hDb2xvcjtcbmZ1bmN0aW9uIG1hdGNoQ29sb3IocjEsIGcxLCBiMSkge1xuICAgIHZhciBoYXNoID0gKHIxIDw8IDE2KSB8IChnMSA8PCA4KSB8IGIxO1xuICAgIGlmIChtYXRjaENvbG9yLl9jYWNoZVtoYXNoXSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBtYXRjaENvbG9yLl9jYWNoZVtoYXNoXTtcbiAgICB9XG4gICAgdmFyIGxkaWZmID0gSW5maW5pdHksIGxpID0gLTEsIGkgPSAwLCBjLCByMiwgZzIsIGIyLCBkaWZmO1xuICAgIGZvciAoOyBpIDwgVGVybWluYWwudmNvbG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjID0gVGVybWluYWwudmNvbG9yc1tpXTtcbiAgICAgICAgcjIgPSBjWzBdO1xuICAgICAgICBnMiA9IGNbMV07XG4gICAgICAgIGIyID0gY1syXTtcbiAgICAgICAgZGlmZiA9IG1hdGNoQ29sb3IuZGlzdGFuY2UocjEsIGcxLCBiMSwgcjIsIGcyLCBiMik7XG4gICAgICAgIGlmIChkaWZmID09PSAwKSB7XG4gICAgICAgICAgICBsaSA9IGk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGlmZiA8IGxkaWZmKSB7XG4gICAgICAgICAgICBsZGlmZiA9IGRpZmY7XG4gICAgICAgICAgICBsaSA9IGk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoQ29sb3IuX2NhY2hlW2hhc2hdID0gbGk7XG59XG5tYXRjaENvbG9yLl9jYWNoZSA9IHt9O1xubWF0Y2hDb2xvci5kaXN0YW5jZSA9IGZ1bmN0aW9uIChyMSwgZzEsIGIxLCByMiwgZzIsIGIyKSB7XG4gICAgcmV0dXJuIE1hdGgucG93KDMwICogKHIxIC0gcjIpLCAyKVxuICAgICAgICArIE1hdGgucG93KDU5ICogKGcxIC0gZzIpLCAyKVxuICAgICAgICArIE1hdGgucG93KDExICogKGIxIC0gYjIpLCAyKTtcbn07XG5mdW5jdGlvbiBlYWNoKG9iaiwgaXRlciwgY29uKSB7XG4gICAgaWYgKG9iai5mb3JFYWNoKVxuICAgICAgICByZXR1cm4gb2JqLmZvckVhY2goaXRlciwgY29uKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgICAgICBpdGVyLmNhbGwoY29uLCBvYmpbaV0sIGksIG9iaik7XG4gICAgfVxufVxuZnVuY3Rpb24gd2FzTW9uZGlmaWVyS2V5T25seUV2ZW50KGV2KSB7XG4gICAgcmV0dXJuIGV2LmtleUNvZGUgPT09IDE2IHx8XG4gICAgICAgIGV2LmtleUNvZGUgPT09IDE3IHx8XG4gICAgICAgIGV2LmtleUNvZGUgPT09IDE4O1xufVxuZnVuY3Rpb24ga2V5cyhvYmopIHtcbiAgICBpZiAoT2JqZWN0LmtleXMpXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhvYmopO1xuICAgIHZhciBrZXksIGtleXMgPSBbXTtcbiAgICBmb3IgKGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrZXlzO1xufVxuVGVybWluYWwuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyXzEuRXZlbnRFbWl0dGVyO1xuVGVybWluYWwuaW5oZXJpdHMgPSBpbmhlcml0cztcblRlcm1pbmFsLm9uID0gb247XG5UZXJtaW5hbC5vZmYgPSBvZmY7XG5UZXJtaW5hbC5jYW5jZWwgPSBjYW5jZWw7XG5tb2R1bGUuZXhwb3J0cyA9IFRlcm1pbmFsO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD14dGVybS5qcy5tYXBcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHJlbmRlciB9IGZyb20gJ3JlYWN0LWRvbSdcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAncmVhY3QtcmVkdXgnXG5pbXBvcnQgY29uZmlndXJlU3RvcmUgZnJvbSAnLi9zdG9yZS9jb25maWd1cmUtc3RvcmUnXG5pbXBvcnQgeyBzZWxlY3RTZWN0aW9uIH0gZnJvbSAnLi9hY3Rpb25zL2FwcCdcblxuaW1wb3J0IFJlbW90ZSBmcm9tICcuL2NvbW1vbi9saWIvcmVtb3RlJ1xuaW1wb3J0IEFwcCBmcm9tICcuL2NvbXBvbmVudHMvYXBwJ1xuXG5pbXBvcnQgeyBJbnRsUHJvdmlkZXIsIGFkZExvY2FsZURhdGEgfSBmcm9tICdyZWFjdC1pbnRsJ1xuaW1wb3J0IGVzIGZyb20gJ3JlYWN0LWludGwvbG9jYWxlLWRhdGEvZXMnXG5pbXBvcnQgZW4gZnJvbSAncmVhY3QtaW50bC9sb2NhbGUtZGF0YS9lbidcbmltcG9ydCBtZXNzYWdlc0VTIGZyb20gJy4vdHJhbnNsYXRpb25zL2VzLmpzb24nXG5pbXBvcnQgbWVzc2FnZXNFTiBmcm9tICcuL3RyYW5zbGF0aW9ucy9lbi5qc29uJ1xuYWRkTG9jYWxlRGF0YShbLi4uZW4sIC4uLmVzXSlcbmNvbnN0IGRlZmF1bHRMb2NhbGUgPSAnZW4nXG5cbmNsYXNzIEVIb3J1cyB7XG4gIGNvbnN0cnVjdG9yIChjb25maWcgPSB7fSkge1xuICAgIGNvbnN0IGhlYWRlciA9ICh0eXBlb2YgY29uZmlnLmhlYWRlciAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICA/IGNvbmZpZy5oZWFkZXJcbiAgICAgIDogdHJ1ZVxuICAgIGNvbnN0IHtcbiAgICAgIGFnZW50TGFzdENvbnRhY3QsIGFnZW50SXNCdXN5LCBsb2dvLCBzZWN0aW9uLCBsb2NhbGUsXG4gICAgICBoYW5kbGVEaXNjb25uZWN0LCBwYXNzLCBoYW5kbGVUZW1wUGFzc0dlbmVyYXRlZCwgdG1wUGFzc1xuICAgIH0gPSBjb25maWdcblxuICAgIFJlbW90ZS5pbml0aWFsaXplKGNvbmZpZylcblxuICAgIC8vIFN0b3JlIChyZWR1eClcbiAgICBjb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gICAgICBhcHA6IHtcbiAgICAgICAgbG9nb1VSTDogbG9nbyxcbiAgICAgICAgc2hvd0hlYWRlcjogaGVhZGVyLFxuICAgICAgICBoYW5kbGVEaXNjb25uZWN0OiBoYW5kbGVEaXNjb25uZWN0IHx8ICgoKSA9PiB7fSksXG4gICAgICAgIGhhbmRsZVRlbXBQYXNzR2VuZXJhdGVkXG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc2VjdGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGluaXRpYWxTdGF0ZS5hcHAuc2VjdGlvbnMgPSB7XG4gICAgICAgIGFjdGl2ZTogc2VjdGlvbixcbiAgICAgICAgZmlyc3RBY3RpdmU6IHNlY3Rpb25cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBhZ2VudExhc3RDb250YWN0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaW5pdGlhbFN0YXRlLmFwcC5hZ2VudExhc3RDb250YWN0ID0gYWdlbnRMYXN0Q29udGFjdFxuICAgIH1cbiAgICBpZiAodHlwZW9mIGFnZW50SXNCdXN5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaW5pdGlhbFN0YXRlLmFwcC5hZ2VudElzQnVzeSA9IGFnZW50SXNCdXN5XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGFzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGluaXRpYWxTdGF0ZS5hcHAucGFzcyA9IHBhc3NcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0bXBQYXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaW5pdGlhbFN0YXRlLmFwcC50bXBQYXNzID0gdG1wUGFzc1xuICAgIH1cblxuICAgIGlmIChsb2NhbGUpIHtcbiAgICAgIHRoaXMuX2xvY2FsZSA9IGxvY2FsZVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIG5hdmlnYXRvci5sYW5ndWFnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX2xvY2FsZSA9IG5hdmlnYXRvci5sYW5ndWFnZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9sb2NhbGUgPSAnZW4nXG4gICAgfVxuICAgIHRoaXMuX21lc3NhZ2VzID0ge31cbiAgICBzd2l0Y2ggKHRoaXMuX2xvY2FsZSkge1xuICAgICAgY2FzZSAnZXMnOlxuICAgICAgICB0aGlzLl9tZXNzYWdlcyA9IG1lc3NhZ2VzRVNcbiAgICAgICAgYnJlYWtcbiAgICAgIC8vIEVuZ2xpc2ggaXMgdGhlIGRlZmF1bHQgbGFuZ3VhZ2VcbiAgICAgIGNhc2UgJ2VuJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuX21lc3NhZ2VzID0gbWVzc2FnZXNFTlxuICAgICAgICBicmVha1xuICAgIH1cblxuICAgIHRoaXMuX3N0b3JlID0gY29uZmlndXJlU3RvcmUoaW5pdGlhbFN0YXRlKVxuICB9XG5cbiAgcmVuZGVySW4gKGVsZW1lbnQpIHtcbiAgICByZW5kZXIoXG4gICAgICA8UHJvdmlkZXIgc3RvcmU9e3RoaXMuX3N0b3JlfT5cbiAgICAgICAgPEludGxQcm92aWRlclxuICAgICAgICAgIGRlZmF1bHRMb2NhbGU9e1xuICAgICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJyA/IHRoaXMuX2xvY2FsZSA6IGRlZmF1bHRMb2NhbGVcbiAgICAgICAgICB9XG4gICAgICAgICAgbG9jYWxlPXt0aGlzLl9sb2NhbGV9XG4gICAgICAgICAgbWVzc2FnZXM9e3RoaXMuX21lc3NhZ2VzfT5cbiAgICAgICAgICA8QXBwIC8+XG4gICAgICAgIDwvSW50bFByb3ZpZGVyPlxuICAgICAgPC9Qcm92aWRlcj4sXG4gICAgICBlbGVtZW50XG4gICAgKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvLyBzZXQgbG9nbyAobG9nbykge1xuICAvLyAgIHRoaXMuX2xvZ28gPSBsb2dvXG4gIC8vIH1cbiAgZ2V0IGxvZ28gKCkge1xuICAgIHJldHVybiB0aGlzLl9zdG9yZS5nZXRTdGF0ZSgpLmFwcC5sb2dvVVJMXG4gIH1cblxuICAvLyBzZXQgaGVhZGVyICh2YWx1ZSkge1xuICAvLyAgIHRoaXMuX2hlYWRlciA9IHZhbHVlXG4gIC8vIH1cbiAgZ2V0IGhlYWRlciAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlLmdldFN0YXRlKCkuYXBwLnNob3dIZWFkZXJcbiAgfVxuXG4gIC8vIHNldCBoYW5kbGVEaXNjb25uZWN0IChoYW5kbGVEaXNjb25uZWN0KSB7XG4gIC8vICAgdGhpcy5faGFuZGxlRGlzY29ubmVjdCA9IGhhbmRsZURpc2Nvbm5lY3RcbiAgLy8gfVxuICBnZXQgaGFuZGxlRGlzY29ubmVjdCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlLmdldFN0YXRlKCkuYXBwLmhhbmRsZURpc2Nvbm5lY3RcbiAgfVxuXG4gIC8vIHNldCBhZ2VudExhc3RDb250YWN0IChhZ2VudExhc3RDb250YWN0KSB7XG4gIC8vICAgdGhpcy5fYWdlbnRMYXN0Q29udGFjdCA9IGFnZW50TGFzdENvbnRhY3RcbiAgLy8gfVxuICBnZXQgYWdlbnRMYXN0Q29udGFjdCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlLmdldFN0YXRlKCkuYXBwLmFnZW50TGFzdENvbnRhY3RcbiAgfVxuXG4gIC8vIHNldCBhZ2VudElzQnVzeSAoYWdlbnRJc0J1c3kpIHtcbiAgLy8gICB0aGlzLl9hZ2VudElzQnVzeSA9IGFnZW50SXNCdXN5XG4gIC8vIH1cbiAgZ2V0IGFnZW50SXNCdXN5ICgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmUuZ2V0U3RhdGUoKS5hcHAuYWdlbnRJc0J1c3lcbiAgfVxuXG4gIC8vIHNldCBzZWN0aW9uIChzZWN0aW9uKSB7XG4gIC8vICAgdGhpcy5fc2VjdGlvbiA9IHNlY3Rpb25cbiAgLy8gfVxuICBjaGFuZ2VTZWN0aW9uIChzZWN0aW9uKSB7XG4gICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2goc2VsZWN0U2VjdGlvbihzZWN0aW9uKSlcbiAgfVxuICBnZXQgc2VjdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlLmdldFN0YXRlKCkuYXBwLnNlY3Rpb25zLmFjdGl2ZVxuICB9XG5cbiAgZ2V0IHN0YXRlICgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmUuZ2V0U3RhdGUoKVxuICB9XG5cbiAgZ2V0IHJlbW90ZSAoKSB7XG4gICAgcmV0dXJuIFJlbW90ZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEVIb3J1c1xuIiwiaW1wb3J0IFJlbW90ZSBmcm9tICcuLi9jb21tb24vbGliL3JlbW90ZSdcbmltcG9ydCB7IFBST1RPIH0gZnJvbSAnLi4vY29uc3RhbnRzJ1xuXG5pbXBvcnQge1xuICAvLyBDb25uZWN0aW9uXG4gIFJFU0VUX0FHRU5UX1NUQVRFLCBDT05OX0FHRU5UX1JFUVVFU1QsIENPTk5fQUdFTlRfU1VDQ0VTUywgQ09OTl9BR0VOVF9GQUlMVVJFLFxuICBESVNDT05OX0FHRU5UX1JFUVVFU1QsIERJU0NPTk5fQUdFTlRfU1VDQ0VTUywgQ0xFQVJfQ09OTl9FUlJPUixcbiAgLy8gQXV0aGVudGljYXRpb25cbiAgQVVUSF9BR0VOVF9SRVFVRVNULCBBVVRIX0FHRU5UX1NVQ0NFU1MsIEFVVEhfQUdFTlRfRkFJTFVSRSxcbiAgUkVWT0tFX0FHRU5UX0FVVEgsIENMRUFSX0FVVEhfRVJST1IsXG4gIC8vIFRlbXBvcmFyeSBwYXNzXG4gIFRFTVBfUEFTU19SRVFVRVNULCBURU1QX1BBU1NfU1VDQ0VTUywgVEVNUF9QQVNTX0ZBSUxVUkUsXG4gIC8vIERhdGFcbiAgRkVUQ0hfQUdFTlRfUkVRVUVTVCwgRkVUQ0hfQUdFTlRfU1VDQ0VTUywgRkVUQ0hfQUdFTlRfRkFJTFVSRSxcbiAgQ0xFQVJfQUdFTlRfRVJST1Jcbn0gZnJvbSAnLi4vY29uc3RhbnRzL2FnZW50J1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRBZ2VudFN0YXRlICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBSRVNFVF9BR0VOVF9TVEFURVxuICB9XG59XG5cbi8vIENvbm5lY3Rpb25cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyQ29ubmVjdGlvbkVycm9yICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBDTEVBUl9DT05OX0VSUk9SXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbm5lY3Rpb25BZ2VudFJlcXVlc3QgKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IENPTk5fQUdFTlRfUkVRVUVTVFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25uZWN0aW9uQWdlbnRTdWNjZXNzIChjb25uZWN0ZWRBdCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IENPTk5fQUdFTlRfU1VDQ0VTUyxcbiAgICBwYXlsb2FkOiB7XG4gICAgICBjb25uZWN0ZWRBdFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29ubmVjdGlvbkFnZW50RmFpbHVyZSAoZXJyb3IpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBDT05OX0FHRU5UX0ZBSUxVUkUsXG4gICAgcGF5bG9hZDoge1xuICAgICAgZXJyb3JDb2RlOiBlcnJvci5yZXNwb25zZS5jb2RlLFxuICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5yZXNwb25zZS5yZWFzb25cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc2Nvbm5lY3Rpb25BZ2VudFJlcXVlc3QgKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IERJU0NPTk5fQUdFTlRfUkVRVUVTVFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNjb25uZWN0aW9uQWdlbnRTdWNjZXNzICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBESVNDT05OX0FHRU5UX1NVQ0NFU1NcbiAgfVxufVxuXG4vLyBBdXRoZW50aWNhdGlvblxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJBdXRoZW50aWNhdGlvbkVycm9yICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBDTEVBUl9BVVRIX0VSUk9SXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJldm9rZUFnZW50QXV0aGVudGljYXRpb24gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFJFVk9LRV9BR0VOVF9BVVRIXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF1dGVudGljYXRlQWdlbnRSZXF1ZXN0ICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBVVRIX0FHRU5UX1JFUVVFU1RcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXV0ZW50aWNhdGVBZ2VudFN1Y2Nlc3MgKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFVVEhfQUdFTlRfU1VDQ0VTU1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhdXRlbnRpY2F0ZUFnZW50RmFpbHVyZSAoZXJyb3IpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBVVRIX0FHRU5UX0ZBSUxVUkUsXG4gICAgcGF5bG9hZDoge1xuICAgICAgZXJyb3JDb2RlOiBlcnJvci5yZXNwb25zZS5jb2RlLFxuICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5yZXNwb25zZS5yZWFzb25cbiAgICB9XG4gIH1cbn1cblxuLy8gVEhVTktcbmV4cG9ydCBmdW5jdGlvbiBzZW5kQWdlbnRQYXNzd29yZCAocGFzc3dvcmQpIHtcbiAgcmV0dXJuIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICBkaXNwYXRjaChhdXRlbnRpY2F0ZUFnZW50UmVxdWVzdCgpKVxuICAgIFJlbW90ZS5zZW5kKHtcbiAgICAgIHByb3RvOiBQUk9UTy5BR0VOVF9QQVNTLFxuICAgICAgZGF0YTogcGFzc3dvcmRcbiAgICB9KVxuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gc2VuZEFnZW50VG1wUGFzc3dvcmQgKHBhc3N3b3JkKSB7XG4gIHJldHVybiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgZGlzcGF0Y2goYXV0ZW50aWNhdGVBZ2VudFJlcXVlc3QoKSlcbiAgICBSZW1vdGUuc2VuZCh7XG4gICAgICBwcm90bzogUFJPVE8uVEVNUF9MT0dJTixcbiAgICAgIGRhdGE6IHBhc3N3b3JkXG4gICAgfSlcbiAgfVxufVxuXG4vLyBUZW1wb3JhcnkgcGFzc1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcFBhc3NSZXF1ZXN0ICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBURU1QX1BBU1NfUkVRVUVTVFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW1wUGFzc1N1Y2Nlc3MgKHBhc3MsIGV4cGlyZXNBdCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFRFTVBfUEFTU19TVUNDRVNTLFxuICAgIHBheWxvYWQ6IHtcbiAgICAgIHBhc3MsXG4gICAgICBleHBpcmVzQXRcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRlbXBQYXNzRmFpbHVyZSAoZXJyb3IpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBURU1QX1BBU1NfRkFJTFVSRSxcbiAgICBwYXlsb2FkOiB7XG4gICAgICBlcnJvckNvZGU6IGVycm9yLnJlc3BvbnNlLmNvZGUsXG4gICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLnJlc3BvbnNlLnJlYXNvblxuICAgIH1cbiAgfVxufVxuXG4vLyBUSFVOS1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRlbXBQYXNzIChleHBpcmVzKSB7XG4gIHJldHVybiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgZGlzcGF0Y2goZ2V0VGVtcFBhc3NSZXF1ZXN0KCkpXG4gICAgUmVtb3RlLnNlbmQoe1xuICAgICAgcHJvdG86IFBST1RPLlRFTVBfUEFTUyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgYWN0aW9uOiAnZ2V0X3RlbXBfcGFzcycsXG4gICAgICAgIGV4cGlyZXNcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8vIERhdGFcblxuZXhwb3J0IGZ1bmN0aW9uIGZldGNoQWdlbnRSZXF1ZXN0ICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBGRVRDSF9BR0VOVF9SRVFVRVNUXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZldGNoQWdlbnRTdWNjZXNzIChkYXRhLCByZWNlaXZlZEF0KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogRkVUQ0hfQUdFTlRfU1VDQ0VTUyxcbiAgICBwYXlsb2FkOiB7XG4gICAgICBkYXRhLFxuICAgICAgcmVjZWl2ZWRBdFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmV0Y2hBZ2VudEZhaWx1cmUgKGVycm9yKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogRkVUQ0hfQUdFTlRfRkFJTFVSRSxcbiAgICBwYXlsb2FkOiB7XG4gICAgICBlcnJvckNvZGU6IGVycm9yLnJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIGVycm9yTWVzc2FnZTogZXJyb3IucmVzcG9uc2Uuc3RhdHVzVGV4dFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJBZ2VudEVycm9yICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBDTEVBUl9BR0VOVF9FUlJPUlxuICB9XG59XG5cbi8vIFRIVU5LXG5leHBvcnQgZnVuY3Rpb24gZmV0Y2hBZ2VudCAoKSB7XG4gIHJldHVybiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgZGlzcGF0Y2goZmV0Y2hBZ2VudFJlcXVlc3QoKSlcbiAgICBSZW1vdGUuc2VuZCh7XG4gICAgICBwcm90bzogUFJPVE8uU1lTVEVNLFxuICAgICAgZGF0YToge1xuICAgICAgICBhY3Rpb246ICdnZXQnXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuIiwiaW1wb3J0IFJlbW90ZSBmcm9tICcuLi9jb21tb24vbGliL3JlbW90ZSdcbmltcG9ydCB7IFBST1RPIH0gZnJvbSAnLi4vY29uc3RhbnRzJ1xuaW1wb3J0IHtcbiAgRkVUQ0hfU0VDVElPTlNfUkVRVUVTVCwgRkVUQ0hfU0VDVElPTlNfU1VDQ0VTUywgRkVUQ0hfU0VDVElPTlNfRkFJTFVSRSxcbiAgRkVUQ0hfUkVNT1RFX1NFQ1RJT05fUkVRVUVTVCwgRkVUQ0hfUkVNT1RFX1NFQ1RJT05fRU5ELFxuICBVUERBVEVfU0VDVElPTiwgU0VMRUNUX1NFQ1RJT04sIEVOQUJMRV9TRUNUSU9OLCBESVNBQkxFX1NFQ1RJT04sXG4gIEFMTE9XX1NFQ1RJT04sIFJFU0VUX0JMT0NLX1JFUVVFU1QsIFJFU0VUX0ZJUlNUX0FDVElWRV9TRUNUSU9OLFxuICBJTkZPUk1fUkVNT1RFX1NFQ1RJT05fRU5ELFxuICBVUERBVEVfTE9HT19VUkwsXG4gIFNIT1dfSEVBREVSLCBISURFX0hFQURFUixcbiAgVVBEQVRFX0RJU0NPTk5FQ1RfSEFORExFUlxufSBmcm9tICcuLi9jb25zdGFudHMvYXBwJ1xuaW1wb3J0IHsgc2VuZEFnZW50UGFzc3dvcmQsIHNlbmRBZ2VudFRtcFBhc3N3b3JkIH0gZnJvbSAnLi4vYWN0aW9ucy9hZ2VudCdcblxuY29uc3QgVU5CTE9DS19USU1FT1VUID0gNjAwMDBcblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFNlY3Rpb24gKGtleSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFNFTEVDVF9TRUNUSU9OLFxuICAgIHBheWxvYWQ6IHtcbiAgICAgIGtleVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlU2VjdGlvbiAoa2V5KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogRU5BQkxFX1NFQ1RJT04sXG4gICAgcGF5bG9hZDoge1xuICAgICAga2V5XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNhYmxlU2VjdGlvbiAoa2V5KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogRElTQUJMRV9TRUNUSU9OLFxuICAgIHBheWxvYWQ6IHtcbiAgICAgIGtleVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU2VjdGlvbiAoa2V5LCBkYXRhKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogVVBEQVRFX1NFQ1RJT04sXG4gICAgcGF5bG9hZDoge1xuICAgICAga2V5LFxuICAgICAgZGF0YVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxsb3dTZWN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBBTExPV19TRUNUSU9OLFxuICAgIHBheWxvYWQ6IHtcbiAgICAgIGtleVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRCbG9ja1JlcXVlc3QgKGtleSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFJFU0VUX0JMT0NLX1JFUVVFU1QsXG4gICAgcGF5bG9hZDoge1xuICAgICAga2V5XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaFNlY3Rpb25zUmVxdWVzdCAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogRkVUQ0hfU0VDVElPTlNfUkVRVUVTVFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaFNlY3Rpb25zU3VjY2VzcyAoaXRlbXMsIHJlY2VpdmVkQXQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBGRVRDSF9TRUNUSU9OU19TVUNDRVNTLFxuICAgIHBheWxvYWQ6IHtcbiAgICAgIGl0ZW1zXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaFJlbW90ZVNlY3Rpb25SZXF1ZXN0IChrZXkpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBGRVRDSF9SRU1PVEVfU0VDVElPTl9SRVFVRVNULFxuICAgIHBheWxvYWQ6IHtcbiAgICAgIGtleVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmV0Y2hSZW1vdGVTZWN0aW9uRW5kIChrZXkpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBGRVRDSF9SRU1PVEVfU0VDVElPTl9FTkQsXG4gICAgcGF5bG9hZDoge1xuICAgICAga2V5XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmZvcm1SZW1vdGVTZWN0aW9uRW5kIChrZXkpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBJTkZPUk1fUkVNT1RFX1NFQ1RJT05fRU5ELFxuICAgIHBheWxvYWQ6IHtcbiAgICAgIGtleVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmV0Y2hTZWN0aW9uc0ZhaWx1cmUgKGVycm9yKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogRkVUQ0hfU0VDVElPTlNfRkFJTFVSRSxcbiAgICBwYXlsb2FkOiB7XG4gICAgICBzdGF0dXM6IGVycm9yLnJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHN0YXR1c1RleHQ6IGVycm9yLnJlc3BvbnNlLnN0YXR1c1RleHRcbiAgICB9XG4gIH1cbn1cblxuLy8gVEhVTktcbmV4cG9ydCBmdW5jdGlvbiBmZXRjaFNlY3Rpb25zICgpIHtcbiAgcmV0dXJuIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICBkaXNwYXRjaChmZXRjaFNlY3Rpb25zUmVxdWVzdCgpKVxuICAgIFJlbW90ZS5zZW5kKHtcbiAgICAgIHByb3RvOiBQUk9UTy5TWVNURU0sXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGFjdGlvbjogJ3NlY3Rpb24nXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vLyBUSFVOS1xuZXhwb3J0IGZ1bmN0aW9uIGZldGNoUmVtb3RlU2VjdGlvbiAoc2VjdGlvbikge1xuICByZXR1cm4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIGRpc3BhdGNoKGZldGNoUmVtb3RlU2VjdGlvblJlcXVlc3Qoc2VjdGlvbikpXG4gICAgUmVtb3RlLnNlbmQoe1xuICAgICAgcHJvdG86IFBST1RPLlRFTVBfU0VDVElPTixcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgYWN0aW9uOiAnYWNjZXNzX3NlY3Rpb24nLFxuICAgICAgICBzZWN0aW9uXG4gICAgICB9XG4gICAgfSlcbiAgICBjb25zdCByZXNldERlbGF5ZWQgPSAoKSA9PiB7IGRpc3BhdGNoKHJlc2V0QmxvY2tSZXF1ZXN0KHNlY3Rpb24pKSB9XG4gICAgc2V0VGltZW91dChyZXNldERlbGF5ZWQsIFVOQkxPQ0tfVElNRU9VVClcbiAgfVxufVxuXG4vLyBUSFVOS1xuZXhwb3J0IGZ1bmN0aW9uIGluZm9ybVJlbW90ZVNlY3Rpb24gKHNlY3Rpb24pIHtcbiAgcmV0dXJuIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICBkaXNwYXRjaChpbmZvcm1SZW1vdGVTZWN0aW9uRW5kKHNlY3Rpb24pKVxuICAgIFJlbW90ZS5zZW5kKHtcbiAgICAgIHByb3RvOiBQUk9UTy5URU1QX1NFQ1RJT04sXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGFjdGlvbjogJ2FjY2Vzc19zZWN0aW9uJyxcbiAgICAgICAgc2VjdGlvblxuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0Rmlyc3RBY3RpdmVTZWN0aW9uICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBSRVNFVF9GSVJTVF9BQ1RJVkVfU0VDVElPTlxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVMb2dvVVJMIChsb2dvVVJMKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogVVBEQVRFX0xPR09fVVJMLFxuICAgIHBheWxvYWQ6IHtcbiAgICAgIGxvZ29VUkxcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3dIZWFkZXIgKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFNIT1dfSEVBREVSXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhpZGVIZWFkZXIgKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEhJREVfSEVBREVSXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZURpc2Nvbm5lY3RIYW5kbGVyIChoYW5kbGVEaXNjb25uZWN0KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogVVBEQVRFX0RJU0NPTk5FQ1RfSEFORExFUixcbiAgICBwYXlsb2FkOiB7XG4gICAgICBoYW5kbGVEaXNjb25uZWN0XG4gICAgfVxuICB9XG59XG5cbi8vIFRIVU5LXG4vLyBTZWFyY2ggaW50byB0aGUgc3RhdGUgZm9yIGEgcGFzc3dvcmQgb3IgYSB0ZW1wb3JhcnkgcGFzc3dvcmRcbmV4cG9ydCBmdW5jdGlvbiB0cnlQYXNzd29yZHMgKCkge1xuICByZXR1cm4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHsgcGFzcywgdG1wUGFzcywgaGFuZGxlVGVtcFBhc3NHZW5lcmF0ZWQgfSA9IGdldFN0YXRlKCkuYXBwXG4gICAgaWYgKHBhc3MgJiYgcGFzcy5sZW5ndGggPiAwKSB7XG4gICAgICBkaXNwYXRjaChzZW5kQWdlbnRQYXNzd29yZChwYXNzKSlcbiAgICAgIC8vIERpc2FibGUgdGhlIHNoYXJlIHNlY3Rpb24gaWYgdGhlIGhhbmRsZXIgZnVuY3Rpb24gdG8gZ2VuZXJhdGVcbiAgICAgIC8vIHRoZSBzaGFyZSBVUkwgaXMgZW1wdHlcbiAgICAgIGlmICghaGFuZGxlVGVtcFBhc3NHZW5lcmF0ZWQpIGRpc3BhdGNoKGRpc2FibGVTZWN0aW9uKCdzaGFyZScpKVxuICAgIH0gZWxzZSBpZiAodG1wUGFzcyAmJiB0bXBQYXNzLmxlbmd0aCA+IDApIHtcbiAgICAgIGRpc3BhdGNoKGRpc2FibGVTZWN0aW9uKCdzaGFyZScpKVxuICAgICAgZGlzcGF0Y2goc2VuZEFnZW50VG1wUGFzc3dvcmQodG1wUGFzcykpXG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgUmVtb3RlIGZyb20gJy4uL2NvbW1vbi9saWIvcmVtb3RlJ1xuaW1wb3J0IHsgUFJPVE8gfSBmcm9tICcuLi9jb25zdGFudHMnXG5cbmltcG9ydCB7XG4gIFJFU0VUX0RJU1BMQVlfU1RBVEUsIFVQREFURV9ESVNQTEFZX0RBVEEsIENMRUFSX0RJU1BMQVlfRVJST1IsXG4gIENPTk5fRElTUExBWV9SRVFVRVNULCBDT05OX0RJU1BMQVlfU1VDQ0VTUywgQ09OTl9ESVNQTEFZX0ZBSUxVUkUsXG4gIERJU0NPTk5fRElTUExBWV9SRVFVRVNULCBESVNDT05OX0RJU1BMQVlfU1VDQ0VTU1xufSBmcm9tICcuLi9jb25zdGFudHMvZGlzcGxheSdcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0RGlzcGxheVN0YXRlICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBSRVNFVF9ESVNQTEFZX1NUQVRFXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXlEYXRhIChkYXRhKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogVVBEQVRFX0RJU1BMQVlfREFUQSxcbiAgICBwYXlsb2FkOiB7XG4gICAgICBkYXRhXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckRpc3BsYXlFcnJvciAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQ0xFQVJfRElTUExBWV9FUlJPUlxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25uZWN0aW9uRGlzcGxheVJlcXVlc3QgKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IENPTk5fRElTUExBWV9SRVFVRVNUXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbm5lY3Rpb25EaXNwbGF5U3VjY2VzcyAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQ09OTl9ESVNQTEFZX1NVQ0NFU1NcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29ubmVjdGlvbkRpc3BsYXlGYWlsdXJlIChlcnJvcikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IENPTk5fRElTUExBWV9GQUlMVVJFLFxuICAgIHBheWxvYWQ6IHtcbiAgICAgIGVycm9yQ29kZTogZXJyb3IucmVzcG9uc2UuY29kZSxcbiAgICAgIGVycm9yTWVzc2FnZTogZXJyb3IucmVzcG9uc2UucmVhc29uXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkaXNjb25uZWN0aW9uRGlzcGxheVJlcXVlc3QgKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IERJU0NPTk5fRElTUExBWV9SRVFVRVNUXG4gIH1cbn1cblxuLy8gVEhVTktcbmV4cG9ydCBmdW5jdGlvbiBkaXNjb25lY3REaXNwbGF5ICgpIHtcbiAgcmV0dXJuIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICBSZW1vdGUuc2VuZCh7IHByb3RvOiBQUk9UTy5ESVNQTEFZX0NMT1NFIH0pXG4gICAgZGlzcGF0Y2goZGlzY29ubmVjdGlvbkRpc3BsYXlSZXF1ZXN0KCkpXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc2Nvbm5lY3Rpb25EaXNwbGF5U3VjY2VzcyAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogRElTQ09OTl9ESVNQTEFZX1NVQ0NFU1NcbiAgfVxufVxuIiwiXG5pbXBvcnQgUmVtb3RlIGZyb20gJy4uL2NvbW1vbi9saWIvcmVtb3RlJ1xuaW1wb3J0IHRvUGF0aEFycmF5IGZyb20gJy4uL2xpYi9maWxlcy9wYXRoLWFycmF5J1xuaW1wb3J0IHsgYmFzZTY0RW5jQXJyIH0gZnJvbSAnLi4vY29tbW9uL2xpYi9iYXNlNjQnXG5cbmltcG9ydCB7IFBST1RPIH0gZnJvbSAnLi4vY29uc3RhbnRzJ1xuXG5pbXBvcnQge1xuICBDSEFOR0VfRElSX0ZJTEVTLFxuICBGRVRDSF9GSUxFU19SRVFVRVNULCBGRVRDSF9GSUxFU19TVUNDRVNTLCBGRVRDSF9GSUxFU19GQUlMVVJFLFxuICBERUxFVEVfRklMRV9SRVFVRVNULCBERUxFVEVfRklMRV9TVUNDRVNTLCBERUxFVEVfRklMRV9GQUlMVVJFLFxuICBDTEVBUl9GSUxFU19FUlJPUiwgQ0xFQVJfRklMRV9FUlJPUixcbiAgRE9XTkxPQURfRklMRV9GQUlMVVJFLCBDTEVBUl9ET1dOTE9BRF9GSUxFX0VSUk9SLFxuICBVUExPQURfRklMRV9GQUlMVVJFLCBDTEVBUl9VUExPQURfRklMRV9FUlJPUlxufSBmcm9tICcuLi9jb25zdGFudHMvZmlsZXMnXG5cbmltcG9ydCB7IGdldEZpbGUgfSBmcm9tICcuLi9yZWR1Y2Vycy9maWxlcydcblxuZXhwb3J0IGNvbnN0IGNkID0gKHBhdGgpID0+ICh7XG4gIHR5cGU6IENIQU5HRV9ESVJfRklMRVMsXG4gIHBheWxvYWQ6IHtcbiAgICBwYXRoQXJyYXk6IHRvUGF0aEFycmF5KHBhdGgpXG4gIH1cbn0pXG5cbmV4cG9ydCBjb25zdCBmZXRjaEZpbGVzUmVxdWVzdCA9IChwYXRoKSA9PiAoe1xuICB0eXBlOiBGRVRDSF9GSUxFU19SRVFVRVNULFxuICBwYXlsb2FkOiB7XG4gICAgcGF0aEFycmF5OiB0b1BhdGhBcnJheShwYXRoKVxuICB9XG59KVxuXG5leHBvcnQgY29uc3QgZmV0Y2hGaWxlc0ZhaWx1cmUgPSAocGF0aCwgZXJyb3IpID0+ICh7XG4gIHR5cGU6IEZFVENIX0ZJTEVTX0ZBSUxVUkUsXG4gIHBheWxvYWQ6IHtcbiAgICBwYXRoQXJyYXk6IHRvUGF0aEFycmF5KHBhdGgpLFxuICAgIGVycm9yQ29kZTogZXJyb3IucmVzcG9uc2Uuc3RhdHVzLFxuICAgIGVycm9yTWVzc2FnZTogZXJyb3IucmVzcG9uc2Uuc3RhdHVzVGV4dFxuICB9XG59KVxuXG5leHBvcnQgY29uc3QgZmV0Y2hGaWxlc1N1Y2Nlc3MgPSAocGF0aCwgaXRlbXMsIHJlY2VpdmVkQXQsIHtcbiAgcm9vdElzV2luLFxuICByb290SXNQb3NpeCxcbiAgcm9vdElzUmVhZGFibGUsXG4gIHJvb3RJc1dyaXRhYmxlXG59ID0ge30pID0+ICh7XG4gIHR5cGU6IEZFVENIX0ZJTEVTX1NVQ0NFU1MsXG4gIHBheWxvYWQ6IHtcbiAgICBwYXRoQXJyYXk6IHRvUGF0aEFycmF5KHBhdGgpLFxuICAgIHJlY2VpdmVkQXQsXG4gICAgaXRlbXMsXG4gICAgcm9vdElzV2luLFxuICAgIHJvb3RJc1Bvc2l4LFxuICAgIHJvb3RJc1JlYWRhYmxlLFxuICAgIHJvb3RJc1dyaXRhYmxlXG4gIH1cbn0pXG5cbi8vIFRIVU5LXG5leHBvcnQgY29uc3QgZmV0Y2hGaWxlcyA9IChwYXRoKSA9PiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gIGRpc3BhdGNoKGZldGNoRmlsZXNSZXF1ZXN0KHBhdGgpKVxuICAvLyBXU1xuICBSZW1vdGUuc2VuZCh7XG4gICAgcHJvdG86IFBST1RPLkZJTEVTLFxuICAgIGRhdGE6IHtcbiAgICAgIGFjdGlvbjogJ2xzJyxcbiAgICAgIHBhdGg6IHBhdGhcbiAgICB9XG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjbGVhckZpbGVzRXJyb3IgPSAocGF0aCkgPT4gKHtcbiAgdHlwZTogQ0xFQVJfRklMRVNfRVJST1IsXG4gIHBheWxvYWQ6IHtcbiAgICBwYXRoQXJyYXk6IHRvUGF0aEFycmF5KHBhdGgpXG4gIH1cbn0pXG5cbmV4cG9ydCBjb25zdCBkZWxldGVGaWxlUmVxdWVzdCA9IChwYXRoKSA9PiAoe1xuICB0eXBlOiBERUxFVEVfRklMRV9SRVFVRVNULFxuICBwYXlsb2FkOiB7XG4gICAgcGF0aEFycmF5OiB0b1BhdGhBcnJheShwYXRoKVxuICB9XG59KVxuXG5leHBvcnQgY29uc3QgZGVsZXRlRmlsZUZhaWx1cmUgPSAocGF0aCwgZXJyb3IpID0+ICh7XG4gIHR5cGU6IERFTEVURV9GSUxFX0ZBSUxVUkUsXG4gIHBheWxvYWQ6IHtcbiAgICBwYXRoQXJyYXk6IHRvUGF0aEFycmF5KHBhdGgpLFxuICAgIGVycm9yQ29kZTogZXJyb3IucmVzcG9uc2Uuc3RhdHVzLFxuICAgIGVycm9yTWVzc2FnZTogZXJyb3IucmVzcG9uc2Uuc3RhdHVzVGV4dFxuICB9XG59KVxuXG5leHBvcnQgY29uc3QgZGVsZXRlRmlsZVN1Y2Nlc3MgPSAocGF0aCkgPT4gKHtcbiAgdHlwZTogREVMRVRFX0ZJTEVfU1VDQ0VTUyxcbiAgcGF5bG9hZDoge1xuICAgIHBhdGhBcnJheTogdG9QYXRoQXJyYXkocGF0aClcbiAgfVxufSlcblxuLy8gVEhVTktcbmV4cG9ydCBjb25zdCBkZWxldGVGaWxlID0gKHBhdGgpID0+IChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgY29uc3QgZmlsZSA9IGdldEZpbGUoZ2V0U3RhdGUoKS5maWxlcywgcGF0aClcblxuICBpZiAoZmlsZSkge1xuICAgIGRpc3BhdGNoKGRlbGV0ZUZpbGVSZXF1ZXN0KHBhdGgpKVxuICAgIFJlbW90ZS5zZW5kKHtcbiAgICAgIHByb3RvOiBQUk9UTy5GSUxFUyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgYWN0aW9uOiAnZGVsZXRlJyxcbiAgICAgICAgZGlyX25hbWU6IGZpbGUuZGlybmFtZSxcbiAgICAgICAgZmlsZV9uYW1lOiBmaWxlLmJhc2VuYW1lXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgY2xlYXJGaWxlRXJyb3IgPSAocGF0aCkgPT4gKHtcbiAgdHlwZTogQ0xFQVJfRklMRV9FUlJPUixcbiAgcGF5bG9hZDoge1xuICAgIHBhdGhBcnJheTogdG9QYXRoQXJyYXkocGF0aClcbiAgfVxufSlcblxuLy8gRG93bmxvYWQvVXBsb2FkXG5cbmV4cG9ydCBjb25zdCBkb3dubG9hZEZpbGVGYWlsdXJlID0gKHBhdGgsIGVycm9yKSA9PiAoe1xuICB0eXBlOiBET1dOTE9BRF9GSUxFX0ZBSUxVUkUsXG4gIHBheWxvYWQ6IHtcbiAgICBwYXRoLFxuICAgIGVycm9yQ29kZTogZXJyb3IucmVzcG9uc2Uuc3RhdHVzLFxuICAgIGVycm9yTWVzc2FnZTogZXJyb3IucmVzcG9uc2Uuc3RhdHVzVGV4dFxuICB9XG59KVxuXG5leHBvcnQgY29uc3QgY2xlYXJEb3dubG9hZEZpbGVFcnJvciA9IChwYXRoKSA9PiAoe1xuICB0eXBlOiBDTEVBUl9ET1dOTE9BRF9GSUxFX0VSUk9SLFxuICBwYXlsb2FkOiB7IHBhdGggfVxufSlcblxuZXhwb3J0IGNvbnN0IHVwbG9hZEZpbGVGYWlsdXJlID0gKHBhdGgsIGVycm9yKSA9PiAoe1xuICB0eXBlOiBVUExPQURfRklMRV9GQUlMVVJFLFxuICBwYXlsb2FkOiB7XG4gICAgcGF0aCxcbiAgICBlcnJvckNvZGU6IGVycm9yLnJlc3BvbnNlLnN0YXR1cyxcbiAgICBlcnJvck1lc3NhZ2U6IGVycm9yLnJlc3BvbnNlLnN0YXR1c1RleHRcbiAgfVxufSlcblxuZXhwb3J0IGNvbnN0IGNsZWFyVXBsb2FkRmlsZUVycm9yID0gKHBhdGgpID0+ICh7XG4gIHR5cGU6IENMRUFSX1VQTE9BRF9GSUxFX0VSUk9SLFxuICBwYXlsb2FkOiB7IHBhdGggfVxufSlcblxuLy8gTk9UIEFOIEFDVElPTiBDUkVBVE9SXG5leHBvcnQgY29uc3Qgc2VuZENodW5rID0gKGRpcm5hbWUsIGJhc2VuYW1lLCBjaHVuaywgb2Zmc2V0LCBzaXplKSA9PiB7XG4gIGNvbnN0IGNodW5rVmlldyA9IG5ldyBVaW50OEFycmF5KGNodW5rKVxuICBSZW1vdGUuc2VuZCh7XG4gICAgcHJvdG86IFBST1RPLkZJTEVTLFxuICAgIGRhdGE6IHtcbiAgICAgIGFjdGlvbjogJ3VwbG9hZCcsXG4gICAgICBkaXJfbmFtZTogZGlybmFtZSxcbiAgICAgIGZpbGVfbmFtZTogYmFzZW5hbWUsXG4gICAgICBjaHVuazogYmFzZTY0RW5jQXJyKGNodW5rVmlldyksXG4gICAgICBvZmZzZXQ6IG9mZnNldCxcbiAgICAgIHNpemU6IHNpemVcbiAgICB9XG4gIH0pXG59XG5cbi8vIE5PVCBBTiBBQ1RJT04gQ1JFQVRPUlxuZXhwb3J0IGNvbnN0IHJlcXVlc3RDaHVuayA9IChkaXJuYW1lLCBiYXNlbmFtZSwgb2Zmc2V0KSA9PiB7XG4gIFJlbW90ZS5zZW5kKHtcbiAgICBwcm90bzogUFJPVE8uRklMRVMsXG4gICAgZGF0YToge1xuICAgICAgYWN0aW9uOiAnZG93bmxvYWQnLFxuICAgICAgZGlyX25hbWU6IGRpcm5hbWUsXG4gICAgICBmaWxlX25hbWU6IGJhc2VuYW1lLFxuICAgICAgb2Zmc2V0OiBvZmZzZXRcbiAgICB9XG4gIH0pXG59XG4iLCJpbXBvcnQgUmVtb3RlIGZyb20gJy4uL2NvbW1vbi9saWIvcmVtb3RlJ1xuaW1wb3J0IHsgUFJPVE8gfSBmcm9tICcuLi9jb25zdGFudHMnXG5cbmltcG9ydCB7XG4gIFJFU0VUX1RFUk1fU1RBVEUsXG4gIElOSVRfVEVSTV9SRVFVRVNULFxuICBJTklUX1RFUk1fU1VDQ0VTUyxcbiAgSU5JVF9URVJNX0ZBSUxVUkUsXG4gIFNBVkVfVEVSTV9EQVRBLFxuICBDTEVBUl9URVJNX0VSUk9SXG59IGZyb20gJy4uL2NvbnN0YW50cy90ZXJtaW5hbCdcblxuZXhwb3J0IGNvbnN0IHJlc2V0VGVybVN0YXRlID0gKCkgPT4gKHsgdHlwZTogUkVTRVRfVEVSTV9TVEFURSB9KVxuXG5leHBvcnQgY29uc3QgaW5pdGlhbGl6ZVRlcm1SZXF1ZXN0ID0gKGNvbHMsIHJvd3MpID0+ICh7XG4gIHR5cGU6IElOSVRfVEVSTV9SRVFVRVNULFxuICBwYXlsb2FkOiB7IGNvbHMsIHJvd3MgfVxufSlcblxuZXhwb3J0IGNvbnN0IGluaXRpYWxpemVUZXJtU3VjY2VzcyA9IChpbml0aWFsaXplZEF0KSA9PiAoe1xuICB0eXBlOiBJTklUX1RFUk1fU1VDQ0VTUyxcbiAgcGF5bG9hZDogeyBpbml0aWFsaXplZEF0IH1cbn0pXG5cbmV4cG9ydCBjb25zdCBpbml0aWFsaXplVGVybUZhaWx1cmUgPSAoZXJyb3IpID0+ICh7XG4gIHR5cGU6IElOSVRfVEVSTV9GQUlMVVJFLFxuICBwYXlsb2FkOiB7XG4gICAgZXJyb3JDb2RlOiBlcnJvci5yZXNwb25zZS5zdGF0dXMsXG4gICAgZXJyb3JNZXNzYWdlOiBlcnJvci5yZXNwb25zZS5zdGF0dXNUZXh0XG4gIH1cbn0pXG5cbmV4cG9ydCBjb25zdCBjbGVhclRlcm1FcnJvciA9ICgpID0+ICh7IHR5cGU6IENMRUFSX1RFUk1fRVJST1IgfSlcblxuLy8gVEhVTktcbmV4cG9ydCBjb25zdCBpbml0aWFsaXplVGVybSA9IChjb2xzLCByb3dzKSA9PiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gIGRpc3BhdGNoKGluaXRpYWxpemVUZXJtUmVxdWVzdChjb2xzLCByb3dzKSlcbiAgUmVtb3RlLnNlbmQoeyBwcm90bzogUFJPVE8uVEVSTV9JTklULCBkYXRhOiB7IGNvbHMsIHJvd3MgfSB9KVxufVxuXG5leHBvcnQgY29uc3Qgc2F2ZVRlcm1EYXRhID0gKG5ld0RhdGEsIGRhdGFSZXZlaXZlZEF0KSA9PiAoe1xuICB0eXBlOiBTQVZFX1RFUk1fREFUQSxcbiAgcGF5bG9hZDogeyBuZXdEYXRhLCBkYXRhUmV2ZWl2ZWRBdCB9XG59KVxuXG4vLyBUSFVOS1xuZXhwb3J0IGNvbnN0IHNlbmRUZXJtRGF0YSA9IChkYXRhKSA9PiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gIFJlbW90ZS5zZW5kKHsgcHJvdG86IFBST1RPLlRFUk0sIGRhdGEgfSlcbn1cbiIsImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ3JlYWN0J1xuXG5jbGFzcyBCYXNlQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgLy8gQmluZCB0aGUgY2xhc3MgY29udGV4dCB0byB0aGUgZXZlbnQgaGFuZGxlcnNcbiAgX2JpbmQgKC4uLm1ldGhvZHMpIHtcbiAgICBtZXRob2RzLmZvckVhY2goKG1ldGhvZCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzW21ldGhvZF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRoaXNbbWV0aG9kXSA9IHRoaXNbbWV0aG9kXS5iaW5kKHRoaXMpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCYXNlQ29tcG9uZW50XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJ1xuXG5jbGFzcyBDZWxsIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG4gICAgdGhpcy5faGFuZGxlQ2VsbENsaWNrID0gdGhpcy5faGFuZGxlQ2VsbENsaWNrLmJpbmQodGhpcylcbiAgfVxuXG4gIF9oYW5kbGVDZWxsQ2xpY2sgKGNlbGxEYXRhKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgdGhpcy5wcm9wcy5vbkNlbGxDbGljayA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgID8gKGV2ZW50KSA9PiB0aGlzLnByb3BzLm9uQ2VsbENsaWNrKGV2ZW50LCBjZWxsRGF0YSlcbiAgICAgIDogbnVsbFxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGNvbHVtbktleSwgYWxpZ24sIHdpZHRoLCBjZWxsRm9ybWF0dGVyLCBjaGlsZHJlbiB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IGNlbGxTdHlsZSA9IHsgd2lkdGg6IHdpZHRoIHx8ICdhdXRvJyB9XG4gICAgY29uc3QgY2xhc3NlcyA9IFsgYHRleHQtJHthbGlnbn1gIF1cblxuICAgIC8vIFRyeSB0byBmb3JtYXQgdGhlIGNoaWxkcmVuXG4gICAgY29uc3QgZm9ybWF0dGVkQ2hpbGRyZW4gPSAodHlwZW9mIGNlbGxGb3JtYXR0ZXIgPT09ICdmdW5jdGlvbicpXG4gICAgICA/IGNlbGxGb3JtYXR0ZXIoY2hpbGRyZW4pXG4gICAgICA6IGNoaWxkcmVuXG5cbiAgICB2YXIgY2VsbERhdGEgPSB7XG4gICAgICBjb2x1bW5LZXk6IGNvbHVtbktleSxcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICAgIGFsaWduOiBhbGlnbixcbiAgICAgIHdpZHRoOiB3aWR0aFxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8dGRcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc25hbWVzKGNsYXNzZXMpfVxuICAgICAgICBzdHlsZT17Y2VsbFN0eWxlfVxuICAgICAgICBvbkNsaWNrPXt0aGlzLl9oYW5kbGVDZWxsQ2xpY2soY2VsbERhdGEpfT5cbiAgICAgICAgeyBmb3JtYXR0ZWRDaGlsZHJlbiB9XG4gICAgICA8L3RkPlxuICAgIClcbiAgfVxufVxuXG5DZWxsLnByb3BUeXBlcyA9IHtcbiAgY29sdW1uS2V5OiBSZWFjdC5Qcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICAgIFJlYWN0LlByb3BUeXBlcy5udW1iZXJcbiAgXSkuaXNSZXF1aXJlZCxcbiAgYWxpZ246IFJlYWN0LlByb3BUeXBlcy5vbmVPZihbJ2xlZnQnLCAnY2VudGVyJywgJ3JpZ2h0J10pLFxuICB3aWR0aDogUmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgICBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyXG4gIF0pLFxuICBjZWxsRm9ybWF0dGVyOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgb25DZWxsQ2xpY2s6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBjaGlsZHJlbjogUmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgICBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICAgIFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICAgIFJlYWN0LlByb3BUeXBlcy5vYmplY3RcbiAgXSlcbn1cbkNlbGwuZGVmYXVsdFByb3BzID0ge1xuICBhbGlnbjogJ2NlbnRlcidcbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2VsbFxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcydcblxuY2xhc3MgSGVhZENlbGwgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGFsaWduLCB3aWR0aCwgaGVhZEZvcm1hdHRlciwgY2hpbGRyZW4sIG9uQ2xpY2ssIHNvcnRCdXR0b25cbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgY29uc3QgY2xhc3NlcyA9IFsgYHRleHQtJHthbGlnbn1gIF1cbiAgICBjb25zdCBoZWFkU3R5bGUgPSB7IHdpZHRoOiB3aWR0aCB8fCAnYXV0bycgfVxuICAgIGlmICh0eXBlb2Ygb25DbGljayA9PT0gJ2Z1bmN0aW9uJykgaGVhZFN0eWxlLmN1cnNvciA9ICdwb2ludGVyJ1xuXG4gICAgLy8gVHJ5IHRvIGZvcm1hdCB0aGUgY2hpbGRyZW5cbiAgICBjb25zdCBmb3JtYXR0ZWRDaGlsZHJlbiA9ICh0eXBlb2YgaGVhZEZvcm1hdHRlciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgID8gaGVhZEZvcm1hdHRlcihjaGlsZHJlbilcbiAgICAgIDogY2hpbGRyZW5cblxuICAgIHJldHVybiAoXG4gICAgICA8dGhcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKGNsYXNzZXMpfVxuICAgICAgICBzdHlsZT17aGVhZFN0eWxlfVxuICAgICAgICBvbkNsaWNrPXtvbkNsaWNrfT5cbiAgICAgICAgeyBmb3JtYXR0ZWRDaGlsZHJlbiB9XG4gICAgICAgIHsgc29ydEJ1dHRvbiAmJlxuICAgICAgICAgIHNvcnRCdXR0b25cbiAgICAgICAgfVxuICAgICAgPC90aD5cbiAgICApXG4gIH1cbn1cblxuSGVhZENlbGwucHJvcFR5cGVzID0ge1xuICBjb2x1bW5LZXk6IFJlYWN0LlByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgIFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gICAgUmVhY3QuUHJvcFR5cGVzLm51bWJlclxuICBdKS5pc1JlcXVpcmVkLFxuICBhbGlnbjogUmVhY3QuUHJvcFR5cGVzLm9uZU9mKFsnbGVmdCcsICdjZW50ZXInLCAncmlnaHQnXSksXG4gIHdpZHRoOiBSZWFjdC5Qcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICAgIFJlYWN0LlByb3BUeXBlcy5udW1iZXJcbiAgXSksXG4gIGhlYWRGb3JtYXR0ZXI6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBzb3J0QnV0dG9uOiBSZWFjdC5Qcm9wVHlwZXMuZWxlbWVudCxcbiAgb25DbGljazogUmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gICAgUmVhY3QuUHJvcFR5cGVzLmJvb2xcbiAgXSksXG4gIGNoaWxkcmVuOiBSZWFjdC5Qcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkXG59XG5IZWFkQ2VsbC5kZWZhdWx0UHJvcHMgPSB7XG4gIGFsaWduOiAnY2VudGVyJ1xufVxuXG5leHBvcnQgZGVmYXVsdCBIZWFkQ2VsbFxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSAnY2xhc3NuYW1lcydcblxuaW1wb3J0IENvbHVtbiBmcm9tICcuLi9saWIvQ29sdW1uJ1xuaW1wb3J0IENlbGwgZnJvbSAnLi9DZWxsJ1xuXG5jbGFzcyBSb3cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgY29sdW1ucywgZGF0YSwgc2VsZWN0ZWQsIHJvd1NlbGVjdGlvbiB9ID0gdGhpcy5wcm9wc1xuXG4gICAgY29uc3QgY2xhc3NlcyA9IHsgJ2luZm8nOiBzZWxlY3RlZCB9XG4gICAgY29uc3Qgc3R5bGUgPSB7IGN1cnNvcjogJ3BvaW50ZXInIH1cblxuICAgIGNvbnN0IGhhbmRsZUNsaWNrID0gKHR5cGVvZiByb3dTZWxlY3Rpb24gIT09ICd1bmRlZmluZWQnKVxuICAgICAgPyAoZXZlbnQpID0+IHJvd1NlbGVjdGlvbihkYXRhLCAhc2VsZWN0ZWQpXG4gICAgICA6IG51bGxcblxuICAgIHJldHVybiAoXG4gICAgICA8dHJcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVzKGNsYXNzZXMpfVxuICAgICAgICBvbkNsaWNrPXtoYW5kbGVDbGlja31cbiAgICAgICAgc3R5bGU9e3N0eWxlfT5cbiAgICAgICAge1xuICAgICAgICAgIGNvbHVtbnMubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgIGlmIChjb2x1bW4uaGlkZGVuKSByZXR1cm4gbnVsbFxuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8Q2VsbFxuICAgICAgICAgICAgICAgIGtleT17Y29sdW1uLmRhdGFLZXl9XG4gICAgICAgICAgICAgICAgY29sdW1uS2V5PXtjb2x1bW4uZGF0YUtleX1cbiAgICAgICAgICAgICAgICBhbGlnbj17Y29sdW1uLmFsaWdufVxuICAgICAgICAgICAgICAgIHdpZHRoPXtjb2x1bW4ud2lkdGh9XG4gICAgICAgICAgICAgICAgY2VsbEZvcm1hdHRlcj17Y29sdW1uLmNlbGxGb3JtYXR0ZXJ9PlxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGRhdGFbY29sdW1uLmRhdGFLZXldXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L0NlbGw+XG4gICAgICAgICAgICApXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgPC90cj5cbiAgICApXG4gIH1cbn1cblxuUm93LnByb3BUeXBlcyA9IHtcbiAgLy8gQ29sdW1uc1xuICBjb2x1bW5zOiBSZWFjdC5Qcm9wVHlwZXMuYXJyYXlPZihSZWFjdC5Qcm9wVHlwZXMuaW5zdGFuY2VPZihDb2x1bW4pKS5pc1JlcXVpcmVkLFxuICAvLyBEYXRhIG9mIHRoZSByb3dcbiAgZGF0YTogUmVhY3QuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAvLyBXZXRoZXIgaXMgc2VsZWN0ZWQgb3Igbm90XG4gIHNlbGVjdGVkOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgLy8gSW50ZXJuYWwgZnVuY3Rpb24gd2hpY2ggdHJpZ2dlcnMgdGhlIHJvdyBzZWxlY3Rpb24gY2hhbmdlXG4gIHJvd1NlbGVjdGlvbjogUmVhY3QuUHJvcFR5cGVzLmZ1bmNcbn1cblJvdy5kZWZhdWx0UHJvcHMgPSB7XG4gIHNlbGVjdGVkOiBmYWxzZVxufVxuXG5leHBvcnQgZGVmYXVsdCBSb3dcbiIsImltcG9ydCBSZWFjdCwgeyBQcm9wVHlwZXMgfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IENvbHVtbiBmcm9tICcuLi9saWIvQ29sdW1uJ1xuaW1wb3J0IFJvdyBmcm9tICcuL1JvdydcblxuY2xhc3MgVEJvZHkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRhdGEsIGNvbHVtbnMsIGtleVZhbHVlLCBrZXlWYWx1ZVNlbGVjdGVkLCByb3dTZWxlY3Rpb25cbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDx0Ym9keT5cbiAgICAgICAge1xuICAgICAgICAgIC8vIEl0ZXJhdGUgdGhlIHJvd3NcbiAgICAgICAgICBkYXRhLm1hcCgocm93RGF0YSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IGZhbHNlXG5cbiAgICAgICAgICAgIC8vIFRoZSByb3cgb25seSBjYW4gYmUgc2VsZWN0ZWQgdGhlbiB0aGUgJ2tleVZhbHVlJyBpcyBzZXR0ZWRcbiAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5VmFsdWUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIGtleVZhbHVlU2VsZWN0ZWQgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgICAgICAoKHR5cGVvZiBrZXlWYWx1ZVNlbGVjdGVkID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZVNlbGVjdGVkLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgICAgICB0eXBlb2Yga2V5VmFsdWVTZWxlY3RlZCA9PT0gJ251bWJlcicpICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHJvd0RhdGFba2V5VmFsdWVdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBzZWxlY3RlZCA9IChyb3dEYXRhW2tleVZhbHVlXSA9PT0ga2V5VmFsdWVTZWxlY3RlZClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPFJvd1xuICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgY29sdW1ucz17Y29sdW1uc31cbiAgICAgICAgICAgICAgICBkYXRhPXtyb3dEYXRhfVxuICAgICAgICAgICAgICAgIGtleVZhbHVlPXtrZXlWYWx1ZX1cbiAgICAgICAgICAgICAgICBzZWxlY3RlZD17c2VsZWN0ZWR9XG4gICAgICAgICAgICAgICAgcm93U2VsZWN0aW9uPXtyb3dTZWxlY3Rpb259IC8+XG4gICAgICAgICAgICApXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgPC90Ym9keT5cbiAgICApXG4gIH1cbn1cblxuVEJvZHkucHJvcFR5cGVzID0ge1xuICAvLyBDb2x1bW5zXG4gIGNvbHVtbnM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5pbnN0YW5jZU9mKENvbHVtbikpLmlzUmVxdWlyZWQsXG4gIC8vIFJvd3NcbiAgZGF0YTogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLm9iamVjdCkuaXNSZXF1aXJlZCxcbiAgLy8gQ29sdW1uIHdoaWNoIGNvbnRhaW5zIHVuaXF1ZSB2YWx1ZXNcbiAga2V5VmFsdWU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKSxcbiAgLy8gSWRlbnRpZmllciBvZiB0aGUgc2VsZWN0ZWQgcm93LiBJdCBpcyBhIHZhbHVlIG9mIHRoZSAna2V5VmFsdWUnIGNvbHVtblxuICBrZXlWYWx1ZVNlbGVjdGVkOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gIC8vIEludGVybmFsIGZ1bmN0aW9uIHdoaWNoIHRyaWdnZXJzIHRoZSByb3cgc2VsZWN0aW9uIGNoYW5nZVxuICByb3dTZWxlY3Rpb246IFByb3BUeXBlcy5mdW5jXG59XG5cbmV4cG9ydCBkZWZhdWx0IFRCb2R5XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBHbHlwaGljb24gfSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5cbmltcG9ydCBIZWFkQ2VsbCBmcm9tICcuL0hlYWRDZWxsJ1xuaW1wb3J0IENvbHVtbiBmcm9tICcuLi9saWIvQ29sdW1uJ1xuXG5jbGFzcyBUSGVhZCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy5yZW5kZXJTb3J0QnV0dG9uID0gdGhpcy5yZW5kZXJTb3J0QnV0dG9uLmJpbmQodGhpcylcbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBjb2x1bW5zLCBvcmRlckJ5LCBjaGFuZ2VPcmRlciwgY2hhbmdlU29ydEhhbmRsZXIgfSA9IHRoaXMucHJvcHNcbiAgICByZXR1cm4gKFxuICAgICAgPHRoZWFkPlxuICAgICAgICA8dHI+XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29sdW1ucy5tYXAoKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJIZWFkQ2VsbChjb2x1bW4sIG9yZGVyQnksIGNoYW5nZU9yZGVyLCBjaGFuZ2VTb3J0SGFuZGxlcilcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICA8L3RyPlxuICAgICAgPC90aGVhZD5cbiAgICApXG4gIH1cblxuICByZW5kZXJIZWFkQ2VsbCAoY29sdW1uLCBvcmRlckJ5LCBjaGFuZ2VPcmRlciwgY2hhbmdlU29ydEhhbmRsZXIpIHtcbiAgICBpZiAoY29sdW1uLmhpZGRlbikgcmV0dXJuIG51bGxcblxuICAgIC8vIFNvcnQgYnV0dG9uXG4gICAgdmFyIHNvcnRCdXR0b24gPSBudWxsXG4gICAgaWYgKGNvbHVtbi5zb3J0YWJsZSAmJiBjb2x1bW4uZGF0YUtleSA9PT0gb3JkZXJCeS5jb2x1bW5LZXkpIHtcbiAgICAgIHNvcnRCdXR0b24gPSB0aGlzLnJlbmRlclNvcnRCdXR0b24oY29sdW1uLnNvcnRQcm9wcy50eXBlLCBvcmRlckJ5LnZhbHVlKVxuICAgIH1cbiAgICAvLyBTb3J0IGhhbmRsZXJcbiAgICB2YXIgc29ydENsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAgIGNoYW5nZVNvcnRIYW5kbGVyKGNvbHVtbi5zb3J0UHJvcHNbJ3NvcnQtaGFuZGxlciddKVxuXG4gICAgICBpZiAob3JkZXJCeS5jb2x1bW5LZXkgIT09IGNvbHVtbi5kYXRhS2V5KSB7XG4gICAgICAgIGNoYW5nZU9yZGVyKGNvbHVtbi5kYXRhS2V5LCAnQVNDJylcbiAgICAgIH0gZWxzZSBpZiAob3JkZXJCeS52YWx1ZSA9PT0gJ0FTQycpIHtcbiAgICAgICAgY2hhbmdlT3JkZXIoY29sdW1uLmRhdGFLZXksICdERVNDJylcbiAgICAgIH0gZWxzZSBpZiAob3JkZXJCeS52YWx1ZSA9PT0gJ0RFU0MnKSB7XG4gICAgICAgIGNoYW5nZU9yZGVyKCcnLCAnQVNDJylcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPEhlYWRDZWxsXG4gICAgICAgIGtleT17Y29sdW1uLmRhdGFLZXl9XG4gICAgICAgIGNvbHVtbktleT17Y29sdW1uLmRhdGFLZXl9XG4gICAgICAgIGFsaWduPXtjb2x1bW4uYWxpZ259XG4gICAgICAgIHdpZHRoPXtjb2x1bW4ud2lkdGh9XG4gICAgICAgIGhlYWRGb3JtYXR0ZXI9e2NvbHVtbi5oZWFkRm9ybWF0dGVyfVxuICAgICAgICBzb3J0QnV0dG9uPXtzb3J0QnV0dG9ufVxuICAgICAgICBvbkNsaWNrPXtjb2x1bW4uc29ydGFibGUgPyBzb3J0Q2xpY2sgOiBmYWxzZX1cbiAgICAgICAgZmlsdGVyQnV0dG9uPXtudWxsfT5cbiAgICAgICAge1xuICAgICAgICAgIGNvbHVtbi5uYW1lXG4gICAgICAgIH1cbiAgICAgIDwvSGVhZENlbGw+XG4gICAgKVxuICB9XG5cbiAgcmVuZGVyU29ydEJ1dHRvbiAodHlwZSwgdmFsdWUpIHtcbiAgICB2YXIgYnV0dG9uVHlwZSA9ICcnXG4gICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodmFsdWUgPT09ICdERVNDJykgYnV0dG9uVHlwZSA9ICdzb3J0LWJ5LWFscGhhYmV0LWFsdCdcbiAgICAgIGVsc2UgYnV0dG9uVHlwZSA9ICdzb3J0LWJ5LWFscGhhYmV0J1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gJ0RFU0MnKSBidXR0b25UeXBlID0gJ3NvcnQtYnktb3JkZXItYWx0J1xuICAgICAgZWxzZSBidXR0b25UeXBlID0gJ3NvcnQtYnktb3JkZXInXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gJ0RFU0MnKSBidXR0b25UeXBlID0gJ3NvcnQtYnktYXR0cmlidXRlcy1hbHQnXG4gICAgICBlbHNlIGJ1dHRvblR5cGUgPSAnc29ydC1ieS1hdHRyaWJ1dGVzJ1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8R2x5cGhpY29uXG4gICAgICAgIHN0eWxlPXt7IHBhZGRpbmdMZWZ0OiAnMTBweCcgfX1cbiAgICAgICAgZ2x5cGg9e2J1dHRvblR5cGV9XG4gICAgICAgIGNsYXNzTmFtZT0ncHVsbC1yaWdodCcgLz5cbiAgICApXG4gIH1cbn1cblxuVEhlYWQucHJvcFR5cGVzID0ge1xuICBjb2x1bW5zOiBSZWFjdC5Qcm9wVHlwZXMuYXJyYXlPZihSZWFjdC5Qcm9wVHlwZXMuaW5zdGFuY2VPZihDb2x1bW4pKS5pc1JlcXVpcmVkLFxuICAvLyBPYmplY3Qgd2l0aCB0aGUgc29ydCBkYXRhXG4gIG9yZGVyQnk6IFJlYWN0LlByb3BUeXBlcy5vYmplY3QuaXNSZXF1aXJlZCxcbiAgLy8gRnVuY3Rpb24gdG8gY2hhbmdlIHRoZSByb3dzIHNvcnRcbiAgY2hhbmdlT3JkZXI6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGNoYW5nZVNvcnRIYW5kbGVyOiBSZWFjdC5Qcm9wVHlwZXMuZnVuY1xufVxuXG5leHBvcnQgZGVmYXVsdCBUSGVhZFxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcydcblxuaW1wb3J0IENvbHVtbiBmcm9tICcuLi9saWIvQ29sdW1uJ1xuaW1wb3J0IFRIZWFkIGZyb20gJy4vVEhlYWQnXG5pbXBvcnQgVEJvZHkgZnJvbSAnLi9UQm9keSdcblxuY2xhc3MgVGFibGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBvcmRlckJ5OiB0aGlzLnByb3BzLm9yZGVyQnksXG4gICAgICBrZXlWYWx1ZVNlbGVjdGVkOiB0aGlzLnByb3BzLmtleVZhbHVlU2VsZWN0ZWQsXG4gICAgICBoYW5kbGVTb3J0OiBmYWxzZVxuICAgIH1cblxuICAgIHRoaXMuX29uUm93U2VsZWN0aW9uID0gdGhpcy5fb25Sb3dTZWxlY3Rpb24uYmluZCh0aGlzKVxuICAgIHRoaXMuX2NoYW5nZU9yZGVyID0gdGhpcy5fY2hhbmdlT3JkZXIuYmluZCh0aGlzKVxuICAgIHRoaXMuX2NoYW5nZVNvcnRIYW5kbGVyID0gdGhpcy5fY2hhbmdlU29ydEhhbmRsZXIuYmluZCh0aGlzKVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb2x1bW5zLCBkYXRhLCBrZXlWYWx1ZSwgcmVzcG9uc2l2ZSwgYm9yZGVyZWQsIGNvbmRlbnNlZCwgaG92ZXIsIHN0cmlwZWRcbiAgICB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgb3JkZXJCeSwga2V5VmFsdWVTZWxlY3RlZCwgaGFuZGxlU29ydCB9ID0gdGhpcy5zdGF0ZVxuICAgIGNvbnN0IHNvcnRLZXkgPSBvcmRlckJ5LmNvbHVtbktleVxuICAgIGNvbnN0IHNvcnRUeXBlID0gb3JkZXJCeS52YWx1ZVxuXG4gICAgY29uc3Qgc29ydEhhbmRsZXIgPSBoYW5kbGVTb3J0IHx8IHRoaXMuZGVmYXVsdEhhbmRsZVNvcnRcblxuICAgIC8vIFNvcnQgdGhlIGl0ZW1zXG4gICAgY29uc3Qgcm93cyA9IChvcmRlckJ5LmNvbHVtbktleS5sZW5ndGggPiAwKVxuICAgICAgPyBkYXRhLnNvcnQoc29ydEhhbmRsZXIoc29ydEtleSwgc29ydFR5cGUpKVxuICAgICAgOiBkYXRhLnNsaWNlKClcblxuICAgIHZhciBjbGFzc2VzID0ge1xuICAgICAgJ3RhYmxlJzogdHJ1ZSxcbiAgICAgICd0YWJsZS1ib3JkZXJlZCc6IGJvcmRlcmVkLFxuICAgICAgJ3RhYmxlLWNvbmRlbnNlZCc6IGNvbmRlbnNlZCxcbiAgICAgICd0YWJsZS1ob3Zlcic6IGhvdmVyLFxuICAgICAgJ3RhYmxlLXN0cmlwZWQnOiBzdHJpcGVkXG4gICAgfVxuXG4gICAgdmFyIHRhYmxlID1cbiAgICAgIDx0YWJsZSBjbGFzc05hbWU9e2NsYXNzbmFtZXMoY2xhc3Nlcyl9PlxuICAgICAgICA8VEhlYWRcbiAgICAgICAgICBjb2x1bW5zPXtjb2x1bW5zfVxuICAgICAgICAgIG9yZGVyQnk9e29yZGVyQnl9XG4gICAgICAgICAgY2hhbmdlT3JkZXI9e3RoaXMuX2NoYW5nZU9yZGVyfVxuICAgICAgICAgIGNoYW5nZVNvcnRIYW5kbGVyPXt0aGlzLl9jaGFuZ2VTb3J0SGFuZGxlcn0gLz5cbiAgICAgICAgPFRCb2R5XG4gICAgICAgICAga2V5VmFsdWU9e2tleVZhbHVlfVxuICAgICAgICAgIGtleVZhbHVlU2VsZWN0ZWQ9e2tleVZhbHVlU2VsZWN0ZWR9XG4gICAgICAgICAgY29sdW1ucz17Y29sdW1uc31cbiAgICAgICAgICBkYXRhPXtyb3dzfVxuICAgICAgICAgIHJvd1NlbGVjdGlvbj17dGhpcy5fb25Sb3dTZWxlY3Rpb259IC8+XG4gICAgICA8L3RhYmxlPlxuXG4gICAgcmV0dXJuIHJlc3BvbnNpdmUgPyA8ZGl2PnsgdGFibGUgfTwvZGl2PiA6IHRhYmxlXG4gIH1cblxuICBkZWZhdWx0SGFuZGxlU29ydCAoc29ydEtleSwgc29ydFR5cGUpIHtcbiAgICByZXR1cm4gKGEsIGIpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgYVtzb3J0S2V5XSA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICB0eXBlb2YgYltzb3J0S2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH1cblxuICAgICAgbGV0IHZhbEEgPSBhW3NvcnRLZXldXG4gICAgICBsZXQgdmFsQiA9IGJbc29ydEtleV1cblxuICAgICAgaWYgKHR5cGVvZiB2YWxBID09PSAnc3RyaW5nJykgdmFsQSA9IHZhbEEudG9Mb3dlckNhc2UoKVxuICAgICAgaWYgKHR5cGVvZiB2YWxCID09PSAnc3RyaW5nJykgdmFsQiA9IHZhbEIudG9Mb3dlckNhc2UoKVxuXG4gICAgICBpZiAoc29ydFR5cGUgPT09ICdBU0MnKSB7XG4gICAgICAgIGlmICh2YWxBIDwgdmFsQikgcmV0dXJuIC0xXG4gICAgICAgIGlmICh2YWxBID4gdmFsQikgcmV0dXJuIDFcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh2YWxBID4gdmFsQikgcmV0dXJuIC0xXG4gICAgICAgIGlmICh2YWxBIDwgdmFsQikgcmV0dXJuIDFcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfY2hhbmdlT3JkZXIgKGNvbHVtbktleSwgdmFsdWUgPSAnQVNDJykge1xuICAgIGlmICh0eXBlb2YgY29sdW1uS2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKHZhbHVlID09PSAnQVNDJyB8fCB2YWx1ZSA9PT0gJ0RFU0MnKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgIG9yZGVyQnk6IHtcbiAgICAgICAgICAgIGNvbHVtbktleTogY29sdW1uS2V5LFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9jaGFuZ2VTb3J0SGFuZGxlciAoaGFuZGxlU29ydCkge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBoYW5kbGVTb3J0IH0pXG4gIH1cblxuICBfb25Sb3dTZWxlY3Rpb24gKHJvd0RhdGEsIGlzU2VsZWN0ZWQpIHtcbiAgICBjb25zdCB7IGtleVZhbHVlLCBvblJvd1NlbGVjdGVkLCBvblJvd1Vuc2VsZWN0ZWQgfSA9IHRoaXMucHJvcHNcblxuICAgIGlmICh0eXBlb2Yga2V5VmFsdWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciA9ICh0eXBlb2Ygcm93RGF0YVtrZXlWYWx1ZV0gIT09ICd1bmRlZmluZWQnKVxuICAgICAgICA/IHJvd0RhdGFba2V5VmFsdWVdXG4gICAgICAgIDogZmFsc2VcblxuICAgICAgaWYgKGlkZW50aWZpZXIgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBrZXlWYWx1ZVNlbGVjdGVkOiBpc1NlbGVjdGVkID8gaWRlbnRpZmllciA6ICcnIH0pXG5cbiAgICAgICAgaWYgKGlzU2VsZWN0ZWQgJiYgb25Sb3dTZWxlY3RlZCkge1xuICAgICAgICAgIG9uUm93U2VsZWN0ZWQoaWRlbnRpZmllciwgcm93RGF0YSlcbiAgICAgICAgfSBlbHNlIGlmICghaXNTZWxlY3RlZCAmJiBvblJvd1Vuc2VsZWN0ZWQpIHtcbiAgICAgICAgICBvblJvd1Vuc2VsZWN0ZWQoaWRlbnRpZmllciwgcm93RGF0YSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5UYWJsZS5wcm9wVHlwZXMgPSB7XG4gIC8vIENvbHVtbnNcbiAgY29sdW1uczogUmVhY3QuUHJvcFR5cGVzLmFycmF5T2YoUmVhY3QuUHJvcFR5cGVzLmluc3RhbmNlT2YoQ29sdW1uKSksXG4gIC8vIFJvd3NcbiAgZGF0YTogUmVhY3QuUHJvcFR5cGVzLmFycmF5T2YoUmVhY3QuUHJvcFR5cGVzLm9iamVjdCksXG4gIC8vIENvbHVtbiB3aGljaCBjb250YWlucyB1bmlxdWUgdmFsdWVzXG4gIGtleVZhbHVlOiBSZWFjdC5Qcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICAgIFJlYWN0LlByb3BUeXBlcy5udW1iZXJcbiAgXSksXG4gIC8vIElkZW50aWZpZXIgb2YgdGhlIHNlbGVjdGVkIHJvdy4gSXQgaXMgYSB2YWx1ZSBvZiB0aGUgJ2tleVZhbHVlJyBjb2x1bW5cbiAga2V5VmFsdWVTZWxlY3RlZDogUmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgICBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyXG4gIF0pLFxuICAvLyBVc2VyIGRlZmluZWQgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBleGVjdXRlZCB3aGVuIGEgcm93IGlzIHNlbGVjdGVkXG4gIG9uUm93U2VsZWN0ZWQ6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICAvLyBVc2VyIGRlZmluZWQgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBleGVjdXRlZCB3aGVuIGEgcm93IGlzIHVuc2VsZWN0ZWRcbiAgb25Sb3dVbnNlbGVjdGVkOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgLy8gT2JqZWN0IHsnY29sdW1uS2V5JywgJ3ZhbHVlJ30gdG8gc29ydCB0aGUgcm93c1xuICBvcmRlckJ5OiBSZWFjdC5Qcm9wVHlwZXMub2JqZWN0LFxuICAvLyBDbGFzc2VzXG4gIGJvcmRlcmVkOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgY29uZGVuc2VkOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaG92ZXI6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICByZXNwb25zaXZlOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgc3RyaXBlZDogUmVhY3QuUHJvcFR5cGVzLmJvb2xcbn1cblRhYmxlLmRlZmF1bHRQcm9wcyA9IHtcbiAgY29sdW1uczogW10sXG4gIGRhdGE6IFtdLFxuICBvcmRlckJ5OiB7XG4gICAgY29sdW1uS2V5OiAnJyxcbiAgICB2YWx1ZTogJ0FTQydcbiAgfSxcbiAgLy8gQ2xhc3Nlc1xuICBib3JkZXJlZDogZmFsc2UsXG4gIGNvbmRlbnNlZDogZmFsc2UsXG4gIGhvdmVyOiBmYWxzZSxcbiAgcmVzcG9uc2l2ZTogZmFsc2UsXG4gIHN0cmlwZWQ6IGZhbHNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IFRhYmxlXG4iLCJpbXBvcnQgVGFibGUgZnJvbSAnLi9jb21wb25lbnRzL1RhYmxlJ1xuaW1wb3J0IENvbHVtbiBmcm9tICcuL2xpYi9Db2x1bW4nXG5cbmV4cG9ydCBkZWZhdWx0IFRhYmxlXG5leHBvcnQgeyBDb2x1bW4gYXMgRGF0YUNvbHVtbiB9XG4iLCJcbmNsYXNzIENvbHVtbiB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5oaWRkZW4gPSBwcm9wcy5oaWRkZW4gfHwgZmFsc2VcbiAgICB0aGlzLmRhdGFLZXkgPSBwcm9wcy5kYXRhS2V5XG4gICAgdGhpcy5uYW1lID0gcHJvcHMubmFtZVxuICAgIHRoaXMuYWxpZ24gPSBwcm9wcy5hbGlnbiB8fCAnbGVmdCdcbiAgICB0aGlzLndpZHRoID0gcHJvcHMud2lkdGggfHwgJ2F1dG8nXG4gICAgdGhpcy5oZWFkRm9ybWF0dGVyID0gcHJvcHMuaGVhZEZvcm1hdHRlclxuICAgIHRoaXMuY2VsbEZvcm1hdHRlciA9IHByb3BzLmNlbGxGb3JtYXR0ZXJcbiAgICB0aGlzLm9uQ2VsbENsaWNrID0gcHJvcHMub25DZWxsQ2xpY2tcblxuICAgIHRoaXMuc29ydGFibGUgPSBwcm9wcy5zb3J0YWJsZSB8fCBmYWxzZVxuICAgIHRoaXMuc29ydEJ5ID0gcHJvcHMuc29ydEJ5IHx8ICdBU0MnXG4gICAgdGhpcy5zb3J0UHJvcHMgPSBwcm9wcy5zb3J0UHJvcHNcbiAgfVxuXG4gIHNldCBoaWRkZW4gKGhpZGRlbikge1xuICAgIC8vIGhpZGRlblxuICAgIHZhciBoaWRkZW5UeXBlID0gdHlwZW9mIGhpZGRlblxuICAgIGlmIChoaWRkZW5UeXBlID09PSAnYm9vbGVhbicpIHRoaXMuX2hpZGRlbiA9IGhpZGRlblxuICAgIGVsc2UgdGhpcy5faGlkZGVuID0gZmFsc2VcbiAgfVxuXG4gIGdldCBoaWRkZW4gKCkge1xuICAgIHJldHVybiB0aGlzLl9oaWRkZW5cbiAgfVxuXG4gIHNldCBkYXRhS2V5IChkYXRhS2V5KSB7XG4gICAgLy8gZGF0YUtleVxuICAgIHZhciBkYXRhS2V5VHlwZSA9IHR5cGVvZiBkYXRhS2V5XG4gICAgaWYgKGRhdGFLZXlUeXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGRhdGEga2V5IGlzIHJlcXVpcmVkJylcbiAgICB9XG4gICAgaWYgKGRhdGFLZXlUeXBlICE9PSAnc3RyaW5nJyAmJiBkYXRhS2V5VHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBkYXRhIGtleSBvZiB0aGUgY29sdW1uIHNob3VsZCBiZSBhIHN0cmluZyBvciBhIG51bWJlcicpXG4gICAgfVxuICAgIHRoaXMuX2RhdGFLZXkgPSBkYXRhS2V5XG4gIH1cblxuICBnZXQgZGF0YUtleSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFLZXlcbiAgfVxuXG4gIHNldCBuYW1lIChuYW1lKSB7XG4gICAgLy8gbmFtZVxuICAgIHZhciBuYW1lVHlwZSA9IHR5cGVvZiBuYW1lXG4gICAgaWYgKG5hbWVUeXBlID09PSAnc3RyaW5nJykgdGhpcy5fbmFtZSA9IG5hbWVcbiAgfVxuXG4gIGdldCBuYW1lICgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZVxuICB9XG5cbiAgc2V0IGFsaWduIChhbGlnbikge1xuICAgIC8vIGFsaWduXG4gICAgdmFyIHZhbGlkQWxpZ24gPSBbJ2xlZnQnLCAnY2VudGVyJywgJ3JpZ2h0J11cbiAgICB2YXIgYWxpZ25UeXBlID0gdHlwZW9mIGFsaWduXG4gICAgaWYgKGFsaWduVHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsaWRBbGlnbi5pbmRleE9mKGFsaWduKSAhPT0gLTEpIHtcbiAgICAgIHRoaXMuX2FsaWduID0gYWxpZ25cbiAgICB9XG4gIH1cblxuICBnZXQgYWxpZ24gKCkge1xuICAgIHJldHVybiB0aGlzLl9hbGlnblxuICB9XG5cbiAgc2V0IHdpZHRoICh3aWR0aCkge1xuICAgIC8vIHdpZHRoXG4gICAgdmFyIHdpZHRoVHlwZSA9IHR5cGVvZiB3aWR0aFxuICAgIGlmICh3aWR0aFR5cGUgPT09ICdudW1iZXInKSB0aGlzLl93aWR0aCA9IGAke3dpZHRofXB4YFxuICAgIGVsc2UgaWYgKHdpZHRoVHlwZSA9PT0gJ3N0cmluZycpIHRoaXMuX3dpZHRoID0gd2lkdGhcbiAgfVxuXG4gIGdldCB3aWR0aCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dpZHRoXG4gIH1cblxuICBzZXQgaGVhZEZvcm1hdHRlciAoaGVhZEZvcm1hdHRlcikge1xuICAgIC8vIGhlYWRGb3JtYXR0ZXJcbiAgICB2YXIgaGVhZEZvcm1hdHRlclR5cGUgPSB0eXBlb2YgaGVhZEZvcm1hdHRlclxuICAgIGlmIChoZWFkRm9ybWF0dGVyVHlwZSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5faGVhZEZvcm1hdHRlciA9IGhlYWRGb3JtYXR0ZXJcbiAgfVxuXG4gIGdldCBoZWFkRm9ybWF0dGVyICgpIHtcbiAgICByZXR1cm4gdGhpcy5faGVhZEZvcm1hdHRlclxuICB9XG5cbiAgc2V0IGNlbGxGb3JtYXR0ZXIgKGNlbGxGb3JtYXR0ZXIpIHtcbiAgICAvLyBjZWxsRm9ybWF0dGVyXG4gICAgdmFyIGNlbGxGb3JtYXR0ZXJUeXBlID0gdHlwZW9mIGNlbGxGb3JtYXR0ZXJcbiAgICBpZiAoY2VsbEZvcm1hdHRlclR5cGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX2NlbGxGb3JtYXR0ZXIgPSBjZWxsRm9ybWF0dGVyXG4gIH1cblxuICBnZXQgY2VsbEZvcm1hdHRlciAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NlbGxGb3JtYXR0ZXJcbiAgfVxuXG4gIHNldCBvbkNlbGxDbGljayAob25DZWxsQ2xpY2spIHtcbiAgICAvLyBvbkNlbGxDbGlja1xuICAgIHZhciBvbkNlbGxDbGlja1R5cGUgPSB0eXBlb2Ygb25DZWxsQ2xpY2tcbiAgICBpZiAob25DZWxsQ2xpY2tUeXBlID09PSAnZnVuY3Rpb24nKSB0aGlzLl9vbkNlbGxDbGljayA9IG9uQ2VsbENsaWNrXG4gIH1cblxuICBnZXQgb25DZWxsQ2xpY2sgKCkge1xuICAgIHJldHVybiB0aGlzLl9vbkNlbGxDbGlja1xuICB9XG5cbiAgc2V0IHNvcnRhYmxlIChzb3J0YWJsZSkge1xuICAgIC8vIHNvcnRhYmxlXG4gICAgdmFyIHNvcnRhYmxlVHlwZSA9IHR5cGVvZiBzb3J0YWJsZVxuICAgIGlmIChzb3J0YWJsZVR5cGUgPT09ICdib29sZWFuJykgdGhpcy5fc29ydGFibGUgPSBzb3J0YWJsZVxuICAgIGVsc2UgdGhpcy5fc29ydGFibGUgPSBmYWxzZVxuICB9XG5cbiAgZ2V0IHNvcnRhYmxlICgpIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydGFibGVcbiAgfVxuXG4gIHNldCBzb3J0QnkgKHNvcnRCeSkge1xuICAgIC8vIHNvcnRCeVxuICAgIHZhciBzb3J0QnlUeXBlID0gdHlwZW9mIHNvcnRCeVxuICAgIGlmIChzb3J0QnlUeXBlID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAoc29ydEJ5VHlwZSA9PT0gJ0FTQycgfHwgc29ydEJ5VHlwZSA9PT0gJ0RFU0MnKSkge1xuICAgICAgdGhpcy5fc29ydEJ5ID0gc29ydEJ5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NvcnRCeSA9ICdBU0MnXG4gICAgfVxuICB9XG5cbiAgZ2V0IHNvcnRCeSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvcnRCeVxuICB9XG5cbiAgc3RhdGljIGdldCBkZWZhdWx0U29ydFByb3BzICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ2F0dHJpYnV0ZXMnLFxuICAgICAgJ3NvcnQtaGFuZGxlcic6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgc2V0IHNvcnRQcm9wcyAoc29ydFByb3BzKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9zb3J0UHJvcHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLl9zb3J0UHJvcHMgPSBDb2x1bW4uZGVmYXVsdFNvcnRQcm9wc1xuICAgIH1cbiAgICAvLyBzb3J0UHJvcHNcbiAgICB2YXIgc29ydFByb3BzVHlwZSA9IHR5cGVvZiBzb3J0UHJvcHNcbiAgICBpZiAoc29ydFByb3BzVHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh0eXBlb2Ygc29ydFByb3BzLnR5cGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgKHNvcnRQcm9wcy50eXBlID09PSAnbnVtYmVyJyB8fCBzb3J0UHJvcHMudHlwZSA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgIHRoaXMuX3NvcnRQcm9wcy50eXBlID0gc29ydFByb3BzLnR5cGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3NvcnRQcm9wcy50eXBlID0gQ29sdW1uLmRlZmF1bHRTb3J0UHJvcHMudHlwZVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHNvcnRQcm9wc1snc29ydC1oYW5kbGVyJ10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpcy5fc29ydFByb3BzWydzb3J0LWhhbmRsZXInXSA9IHNvcnRQcm9wc1snc29ydC1oYW5kbGVyJ11cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3NvcnRQcm9wc1snc29ydC1oYW5kbGVyJ10gPSBDb2x1bW4uZGVmYXVsdFNvcnRQcm9wc1snc29ydC1oYW5kbGVyJ11cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc29ydFByb3BzID0gQ29sdW1uLmRlZmF1bHRTb3J0UHJvcHNcbiAgICB9XG4gIH1cblxuICBnZXQgc29ydFByb3BzICgpIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydFByb3BzXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29sdW1uXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5cbmNsYXNzIE92ZXJsYXkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIHRoaXMuX2dldERpc3BsYXlTaXplID0gKCkgPT4ge1xuICAgICAgbGV0IFsgd2lkdGgsIGhlaWdodCBdID0gWyAwLCAwIF1cbiAgICAgIHJldHVybiBbIHdpZHRoLCBoZWlnaHQgXVxuICAgIH1cbiAgICB0aGlzLl9oYW5kbGVSZXNpemUgPSB0aGlzLnByb3BzLm9uUmVzaXplXG4gICAgICA/IChldmVudCkgPT4gdGhpcy5wcm9wcy5vblJlc2l6ZSguLi50aGlzLl9nZXREaXNwbGF5U2l6ZSgpKVxuICAgICAgOiAoKSA9PiB7fVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IHNob3dCYWNrZ3JvdW5kLCBhbGlnbiwgY2hpbGRyZW4gfSA9IHRoaXMucHJvcHNcblxuICAgIGxldCBhbGlnbm1lbnQgPSB7fVxuICAgIHN3aXRjaCAoYWxpZ24pIHtcbiAgICAgIGNhc2UgJ2NlbnRlcic6XG4gICAgICAgIGFsaWdubWVudCA9IHtcbiAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcidcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgYWxpZ25tZW50ID0ge1xuICAgICAgICAgIGFsaWduSXRlbXM6ICdmbGV4LXN0YXJ0JyxcbiAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcidcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgYWxpZ25tZW50ID0ge1xuICAgICAgICAgIGFsaWduSXRlbXM6ICdmbGV4LWVuZCcsXG4gICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICBhbGlnbm1lbnQgPSB7XG4gICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdmbGV4LXN0YXJ0J1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIGFsaWdubWVudCA9IHtcbiAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2ZsZXgtZW5kJ1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgY29uc3Qgb3ZlcmxheVN0eWxlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5mdWxsU2NyZWVuU3R5bGUsIGFsaWdubWVudCwge1xuICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgekluZGV4OiAnMjAwMCcsXG4gICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZSdcbiAgICB9KVxuICAgIGNvbnN0IGJhY2tncm91bmRTdHlsZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZnVsbFNjcmVlblN0eWxlLFxuICAgICAgdGhpcy5iYWNrZ3JvdW5kQ29sb3JTdHlsZSwgeyBwb3NpdGlvbjogJ2Fic29sdXRlJyB9KVxuICAgIGNvbnN0IG92ZXJsYXlDb250ZW50U3R5bGUgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmZ1bGxTY3JlZW5TdHlsZSwge1xuICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICBwb2ludGVyRXZlbnRzOiAnYXV0bydcbiAgICB9KVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgcmVmPSdvdmVybGF5JyBjbGFzc05hbWU9J292ZXJsYXknIHN0eWxlPXtvdmVybGF5U3R5bGV9PlxuICAgICAgICB7IHNob3dCYWNrZ3JvdW5kICYmXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J292ZXJsYXktYmFja2dyb3VuZCcgc3R5bGU9e2JhY2tncm91bmRTdHlsZX0gLz5cbiAgICAgICAgfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nb3ZlcmxheS1jb250ZW50JyBzdHlsZT17b3ZlcmxheUNvbnRlbnRTdHlsZX0+XG4gICAgICAgICAgeyBjaGlsZHJlbiB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIGlmICh3aW5kb3cpIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9oYW5kbGVSZXNpemUpXG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCAoKSB7XG4gICAgaWYgKHdpbmRvdykgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX2hhbmRsZVJlc2l6ZSlcbiAgfVxuXG4gIGdldCBmdWxsU2NyZWVuU3R5bGUgKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgIHRvcDogJzAnLFxuICAgICAgYm90dG9tOiAnMCcsXG4gICAgICBsZWZ0OiAnMCcsXG4gICAgICByaWdodDogJzAnLFxuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nXG4gICAgfVxuICB9XG5cbiAgZ2V0IGJhY2tncm91bmRDb2xvclN0eWxlICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmFja2dyb3VuZDogJ3JnYmEoMCwgMCwgMCwgMC44KSdcbiAgICB9XG4gIH1cbn1cblxuT3ZlcmxheS5wcm9wVHlwZXMgPSB7XG4gIHNob3dCYWNrZ3JvdW5kOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgYWxpZ246IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIG9uUmVzaXplOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgY2hpbGRyZW46IFJlYWN0LlByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWRcbn1cbk92ZXJsYXkuZGVmYXVsdFByb3BzID0ge1xuICBzaG93QmFja2dyb3VuZDogZmFsc2UsXG4gIGFsaWduOiAnY2VudGVyJ1xufVxuXG5leHBvcnQgZGVmYXVsdCBPdmVybGF5XG4iLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50LCBQcm9wVHlwZXMgfSBmcm9tICdyZWFjdCdcblxuY2xhc3MgQXJlYSBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcFR5cGVzICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGF0aDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICAgICAgZmlsbDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIHN0cm9rZTogUHJvcFR5cGVzLnN0cmluZ1xuICAgIH1cbiAgfVxuICBzdGF0aWMgZ2V0IGRlZmF1bHRQcm9wcyAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGw6ICcjMzE4MkJEJyxcbiAgICAgIHN0cm9rZTogbnVsbFxuICAgIH1cbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxwYXRoXG4gICAgICAgIGQ9e3RoaXMucHJvcHMucGF0aH1cbiAgICAgICAgZmlsbD17dGhpcy5wcm9wcy5maWxsfVxuICAgICAgICBzdHJva2U9e3RoaXMucHJvcHMuc3Ryb2tlfSAvPlxuICAgIClcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBcmVhXG4iLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50LCBQcm9wVHlwZXMgfSBmcm9tICdyZWFjdCdcbmltcG9ydCBkMyBmcm9tICdkMydcbmltcG9ydCBEYXRhU2VyaWVzIGZyb20gJy4vRGF0YVNlcmllcydcbmltcG9ydCB7IENoYXJ0IH0gZnJvbSAnLi4vY29tbW9uJ1xuXG5jbGFzcyBBcmVhQ2hhcnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgZ2V0IHByb3BUeXBlcyAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gICAgICBoZWlnaHQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKSxcbiAgICAgIGZpbGw6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICBzdHJva2U6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICBpbnRlcnBvbGF0ZTogUHJvcFR5cGVzLmJvb2wsXG4gICAgICBpbnRlcnBvbGF0aW9uVHlwZTogUHJvcFR5cGVzLnN0cmluZ1xuICAgIH1cbiAgfVxuICBzdGF0aWMgZ2V0IGRlZmF1bHRQcm9wcyAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGludGVycG9sYXRlOiBmYWxzZSxcbiAgICAgIGludGVycG9sYXRpb25UeXBlOiBudWxsXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzXG5cbiAgICB2YXIgaW50ZXJwb2xhdGlvblR5cGUgPSBwcm9wcy5pbnRlcnBvbGF0aW9uVHlwZSB8fFxuICAgICAgKHByb3BzLmludGVycG9sYXRlID8gJ2NhcmRpbmFsJyA6ICdsaW5lYXInKVxuXG4gICAgdmFyIHhTY2FsZSA9IGQzLnNjYWxlLmxpbmVhcigpXG4gICAgLy8gdmFyIHhTY2FsZSA9IGQzLnRpbWUuc2NhbGUoKVxuICAgICAgLnJhbmdlKFswLCBwcm9wcy53aWR0aF0pXG4gICAgICAuZG9tYWluKGQzLmV4dGVudChwcm9wcy5kYXRhLm1hcCgoZCkgPT4gZC54KSkpXG4gICAgdmFyIHlTY2FsZSA9IGQzLnNjYWxlLmxpbmVhcigpXG4gICAgICAucmFuZ2UoW3Byb3BzLmhlaWdodCwgMF0pXG4gICAgICAuZG9tYWluKFswLCAxMDBdKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxDaGFydFxuICAgICAgICB3aWR0aD17cHJvcHMud2lkdGh9XG4gICAgICAgIGhlaWdodD17cHJvcHMuaGVpZ2h0fT5cbiAgICAgICAgPERhdGFTZXJpZXNcbiAgICAgICAgICB3aWR0aD17cHJvcHMud2lkdGh9XG4gICAgICAgICAgaGVpZ2h0PXtwcm9wcy5oZWlnaHR9XG4gICAgICAgICAgZmlsbD17cHJvcHMuZmlsbH1cbiAgICAgICAgICBzdHJva2U9e3Byb3BzLnN0cm9rZX1cbiAgICAgICAgICBkYXRhPXtwcm9wcy5kYXRhfVxuICAgICAgICAgIHhTY2FsZT17eFNjYWxlfVxuICAgICAgICAgIHlTY2FsZT17eVNjYWxlfVxuICAgICAgICAgIGludGVycG9sYXRpb25UeXBlPXtpbnRlcnBvbGF0aW9uVHlwZX0gLz5cbiAgICAgIDwvQ2hhcnQ+XG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFyZWFDaGFydFxuIiwiaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCwgUHJvcFR5cGVzIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgZDMgZnJvbSAnZDMnXG5pbXBvcnQgQXJlYSBmcm9tICcuL0FyZWEnXG5cbmNsYXNzIERhdGFTZXJpZXMgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgZ2V0IHByb3BUeXBlcyAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGw6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICBzdHJva2U6IFByb3BUeXBlcy5zdHJpbmdcbiAgICAgIC8vIGludGVycG9sYXRpb25UeXBlOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgLy8geFNjYWxlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgLy8geVNjYWxlOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICAgICAgLy8gZGF0YTogUHJvcFR5cGVzLmFycmF5LFxuICAgICAgLy8gaGVpZ2h0OiBQcm9wVHlwZXMubnVtYmVyXG4gICAgfVxuICB9XG4gIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BzICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW50ZXJwb2xhdGlvblR5cGU6ICdsaW5lYXInXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7XG4gICAgICB4U2NhbGUsIHlTY2FsZSwgaW50ZXJwb2xhdGlvblR5cGUsIGhlaWdodCwgZGF0YSwgZmlsbCwgc3Ryb2tlXG4gICAgfSA9IHRoaXMucHJvcHNcblxuICAgIHZhciBhcmVhID0gZDMuc3ZnLmFyZWEoKVxuICAgICAgLngoKGQpID0+IHhTY2FsZShkLngpKVxuICAgICAgLnkwKGhlaWdodClcbiAgICAgIC55MSgoZCkgPT4geVNjYWxlKGQueSkpXG4gICAgICAuaW50ZXJwb2xhdGUoaW50ZXJwb2xhdGlvblR5cGUpXG5cbiAgICB2YXIgcGF0aCA9IGFyZWEoZGF0YSlcblxuICAgIHJldHVybiAoXG4gICAgICA8QXJlYSBwYXRoPXtwYXRofSBmaWxsPXtmaWxsfSBzdHJva2U9e3N0cm9rZX0gLz5cbiAgICApXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRGF0YVNlcmllc1xuIiwiaW1wb3J0IEFyZWFDaGFydCBmcm9tICcuL0FyZWFDaGFydCdcblxuZXhwb3J0IGRlZmF1bHQgQXJlYUNoYXJ0XG4iLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50LCBQcm9wVHlwZXMgfSBmcm9tICdyZWFjdCdcblxuY2xhc3MgQ2hhcnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0aWMgZ2V0IHByb3BUeXBlcyAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuc3RyaW5nLCBQcm9wVHlwZXMubnVtYmVyXSksXG4gICAgICBoZWlndGg6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKVxuICAgIH1cbiAgfVxuICBzdGF0aWMgZ2V0IGRlZmF1bHRQcm9wcyAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiA0MDAsXG4gICAgICBoZWlnaHQ6IDIwMFxuICAgIH1cbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyB3aWR0aCwgaGVpZ3RoLCBjaGlsZHJlbiB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IGNoYXJ0U3R5bGUgPSB7XG4gICAgICBiYWNrZ3JvdW5kOiAncmdiKDQxLDE3MCwyMDQpJyxcbiAgICAgIGJvcmRlclJhZGl1czogJzVweCdcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPHN2ZyBzdHlsZT17Y2hhcnRTdHlsZX0gd2lkdGg9e3dpZHRofSBoZWlnaHQ9e2hlaWd0aH0+XG4gICAgICAgIHsgY2hpbGRyZW4gfVxuICAgICAgPC9zdmc+XG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENoYXJ0XG4iLCJpbXBvcnQgQ2hhcnQgZnJvbSAnLi9DaGFydCdcblxuZXhwb3J0IHsgQ2hhcnQgfVxuIiwiaW1wb3J0IEFyZWFDaGFydCBmcm9tICcuL2FyZWEtY2hhcnQnXG5cbmV4cG9ydCB7IEFyZWFDaGFydCB9XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQge1xuICBUb29sdGlwLCBPdmVybGF5VHJpZ2dlciwgRHJvcGRvd24sXG4gIEJ1dHRvbiwgR2x5cGhpY29uLCBNZW51SXRlbVxufSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQgeyBpbmplY3RJbnRsIH0gZnJvbSAncmVhY3QtaW50bCdcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnXG5cbmNsYXNzIFJlZnJlc2hCdXR0b24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAvLyBEZWZhdWx0IHBlcmlvZHNcbiAgc3RhdGljIGdldCBwZXJpb2RzICgpIHtcbiAgICByZXR1cm4gbmV3IE1hcCgpXG4gICAgICAuc2V0KDAsICdOZXZlcicpXG4gICAgICAuc2V0KDUsICc1IHNlY29uZHMnKVxuICAgICAgLnNldCgxMCwgJzEwIHNlY29uZHMnKVxuICAgICAgLnNldCgxNSwgJzE1IHNlY29uZHMnKVxuICAgICAgLnNldCgzMCwgJzMwIHNlY29uZHMnKVxuICAgICAgLnNldCg2MCwgJzEgbWludXRlJylcbiAgfVxuXG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgLy8gTWVzc2FnZXMgZGVmaW5pdGlvbnNcbiAgICB0aGlzLm1lc3NhZ2VzID0ge1xuICAgICAgbGFzdFVwZGF0ZToge1xuICAgICAgICBpZDogJ2xhc3RVcGRhdGUnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0xhc3QgdXBkYXRlJ1xuICAgICAgfSxcbiAgICAgIG5ldmVyVXBkYXRlZDoge1xuICAgICAgICBpZDogJ25ldmVyVXBkYXRlZCcsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnTmV2ZXIgdXBkYXRlZCdcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9fY2hhbmdlTGFzdFVwZGF0ZU1lc3NhZ2UgPSB0aGlzLl9fY2hhbmdlTGFzdFVwZGF0ZU1lc3NhZ2UuYmluZCh0aGlzKVxuICAgIHRoaXMuX19zdGFydEludGVydmFsID0gdGhpcy5fX3N0YXJ0SW50ZXJ2YWwuYmluZCh0aGlzKVxuICAgIHRoaXMuX19zdG9wSW50ZXJ2YWwgPSB0aGlzLl9fc3RvcEludGVydmFsLmJpbmQodGhpcylcbiAgICB0aGlzLl9fbGFzdFVwZGF0ZU1lc3NhZ2UgPSB0aGlzLl9fbGFzdFVwZGF0ZU1lc3NhZ2UuYmluZCh0aGlzKVxuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGxhc3RVcGRhdGVNZXNzYWdlOiB0aGlzLl9fbGFzdFVwZGF0ZU1lc3NhZ2UodGhpcy5wcm9wcy5sYXN0VXBkYXRlKVxuICAgIH1cbiAgfVxuXG4gIF9fbGFzdFVwZGF0ZU1lc3NhZ2UgKHRpbWVzdGFtcCkge1xuICAgIGNvbnN0IGRlZmluZU1lc3NhZ2UgPSB0aGlzLnByb3BzLmludGwuZm9ybWF0TWVzc2FnZVxuICAgIGNvbnN0IHJlbGF0aXZlRGF0ZSA9IHRoaXMucHJvcHMuaW50bC5mb3JtYXRSZWxhdGl2ZVxuICAgIHJldHVybiB0aW1lc3RhbXBcbiAgICAgID8gYCR7ZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLmxhc3RVcGRhdGUpfSAke3JlbGF0aXZlRGF0ZSh0aW1lc3RhbXApfWBcbiAgICAgIDogZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLm5ldmVyVXBkYXRlZClcbiAgfVxuXG4gIF9fY2hhbmdlTGFzdFVwZGF0ZU1lc3NhZ2UgKCkge1xuICAgIC8vIFVwZGF0ZSB0aGUgbGFzdCB1cGRhdGUgdG9vbHRpcFxuICAgIGNvbnN0IHsgbGFzdFVwZGF0ZSB9ID0gdGhpcy5wcm9wc1xuICAgIGlmIChsYXN0VXBkYXRlICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGxhc3RVcGRhdGVNZXNzYWdlOiB0aGlzLl9fbGFzdFVwZGF0ZU1lc3NhZ2UobGFzdFVwZGF0ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgX19zdGFydEludGVydmFsICgpIHtcbiAgICBpZiAoIXRoaXMuX19pbnRlcnZhbElEKSB7XG4gICAgICB0aGlzLl9fY2hhbmdlTGFzdFVwZGF0ZU1lc3NhZ2UoKVxuICAgICAgdGhpcy5fX2ludGVydmFsSUQgPSBzZXRJbnRlcnZhbCh0aGlzLl9fY2hhbmdlTGFzdFVwZGF0ZU1lc3NhZ2UsIDEwMDApXG4gICAgfVxuICB9XG5cbiAgX19zdG9wSW50ZXJ2YWwgKCkge1xuICAgIGlmICh0aGlzLl9faW50ZXJ2YWxJRCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9faW50ZXJ2YWxJRClcbiAgICAgIGRlbGV0ZSB0aGlzLl9faW50ZXJ2YWxJRFxuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICB0aGlzLl9fc3RhcnRJbnRlcnZhbCgpXG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCAoKSB7XG4gICAgdGhpcy5fX3N0b3BJbnRlcnZhbCgpXG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHRvb2x0aXAgPSAoaWQsIG1lc3NhZ2UpID0+ICg8VG9vbHRpcCBpZD17aWR9PnttZXNzYWdlfTwvVG9vbHRpcD4pXG4gICAgY29uc3QgeyBsYXN0VXBkYXRlTWVzc2FnZSB9ID0gdGhpcy5zdGF0ZVxuICAgIGNvbnN0IHtcbiAgICAgIGhhbmRsZVJlZnJlc2gsIGhhbmRsZVBlcmlvZENoYW5nZSwgY2hpbGRyZW4sXG4gICAgICBwZXJpb2RzLCBhY3RpdmVQZXJpb2QsIGVuYWJsZVBlcmlvZHNcbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgdmFyIHJlZnJlc2hCdXR0b24gPSAoXG4gICAgICA8QnV0dG9uIG9uQ2xpY2s9e2hhbmRsZVJlZnJlc2h9PlxuICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdyZWZyZXNoJyAvPlxuICAgICAgICB7IGNoaWxkcmVuICYmIDxzcGFuPiZuYnNwOzwvc3Bhbj4gfVxuICAgICAgICB7IGNoaWxkcmVuIH1cbiAgICAgIDwvQnV0dG9uPlxuICAgIClcblxuICAgIHJldHVybiAoXG4gICAgICA8T3ZlcmxheVRyaWdnZXJcbiAgICAgICAgcGxhY2VtZW50PSdyaWdodCdcbiAgICAgICAgb3ZlcmxheT17dG9vbHRpcCgnbGFzdC11cGRhdGUtdG9vbHRpcCcsIGxhc3RVcGRhdGVNZXNzYWdlKX0+XG4gICAgICAgIHtcbiAgICAgICAgICBlbmFibGVQZXJpb2RzXG4gICAgICAgICAgICA/IChcbiAgICAgICAgICAgICAgPERyb3Bkb3duIGlkPSdyZWZyZXNoLWJ1dHRvbicgY2xhc3NOYW1lPSdyZWZyZXNoLWJ1dHRvbic+XG4gICAgICAgICAgICAgICAgeyByZWZyZXNoQnV0dG9uIH1cbiAgICAgICAgICAgICAgICA8RHJvcGRvd24uVG9nZ2xlIC8+XG4gICAgICAgICAgICAgICAgPERyb3Bkb3duLk1lbnU+XG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIFsuLi5wZXJpb2RzLmtleXMoKV0ubWFwKChwZXJpb2QsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgPE1lbnVJdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzbmFtZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnYWN0aXZlJzogKHBlcmlvZCA9PT0gYWN0aXZlUGVyaW9kKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRLZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgICAgICAgb25TZWxlY3Q9eygpID0+IGhhbmRsZVBlcmlvZENoYW5nZShwZXJpb2QpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kcy5nZXQocGVyaW9kKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvTWVudUl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9Ecm9wZG93bi5NZW51PlxuICAgICAgICAgICAgICA8L0Ryb3Bkb3duPlxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiAoXG4gICAgICAgICAgICAgIHJlZnJlc2hCdXR0b25cbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgPC9PdmVybGF5VHJpZ2dlcj5cbiAgICApXG4gIH1cbn1cblxuUmVmcmVzaEJ1dHRvbi5wcm9wVHlwZXMgPSB7XG4gIGhhbmRsZVJlZnJlc2g6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGhhbmRsZVBlcmlvZENoYW5nZTogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIHBlcmlvZHM6IFJlYWN0LlByb3BUeXBlcy5pbnN0YW5jZU9mKE1hcCksXG4gIGFjdGl2ZVBlcmlvZDogUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgZW5hYmxlUGVyaW9kczogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGxhc3RVcGRhdGU6IFJlYWN0LlByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgIFJlYWN0LlByb3BUeXBlcy5pbnN0YW5jZU9mKERhdGUpLFxuICAgIFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gICAgUmVhY3QuUHJvcFR5cGVzLmJvb2xcbiAgXSksXG4gIGNoaWxkcmVuOiBSZWFjdC5Qcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBSZWFjdC5Qcm9wVHlwZXMubm9kZSxcbiAgICBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nXG4gIF0pLFxuICBpbnRsOiBSZWFjdC5Qcm9wVHlwZXMub2JqZWN0XG59XG5cblJlZnJlc2hCdXR0b24uZGVmYXVsdFByb3BzID0ge1xuICBhY3RpdmVQZXJpb2Q6IDAsXG4gIGxhc3RVcGRhdGU6IGZhbHNlLFxuICBwZXJpb2RzOiBSZWZyZXNoQnV0dG9uLnBlcmlvZHMsXG4gIGVuYWJsZVBlcmlvZHM6IHRydWVcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5qZWN0SW50bChSZWZyZXNoQnV0dG9uKVxuIiwiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJ1xuaW1wb3J0IFJlbW90ZSBmcm9tICcuL3JlbW90ZSdcbmltcG9ydCB7IFBST1RPIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJ1xuXG5jb25zdCBPUEVOID0gJ29wZW4nXG5jb25zdCBNRVNTQUdFID0gJ21lc3NhZ2UnXG5jb25zdCBDTE9TRSA9ICdjbG9zZSdcbmNvbnN0IEVSUk9SID0gJ2Vycm9yJ1xuXG5jbGFzcyBGYWtlV2ViU29ja2V0IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IgKHVyaSkge1xuICAgIHN1cGVyKClcblxuICAgIC8vIEJpbmQgZXZlbnRzXG4gICAgUmVtb3RlLm9uT3BlbigoZXZlbnQpID0+IHtcblxuICAgIH0pXG4gICAgUmVtb3RlLm9uQ2xvc2UoKGV2ZW50KSA9PiB7XG5cbiAgICB9KVxuICAgIFJlbW90ZS5vbkVycm9yKChldmVudCkgPT4ge1xuXG4gICAgfSlcblxuICAgIC8vIE1FR0FIQUNLOiBFeHRyYWN0IHRoZSBtb2RlIGZyb20gdGhlIGNvbm5lY3Rpb24gdXJpXG4gICAgbGV0IG1vZGVcbiAgICB0cnkge1xuICAgICAgbW9kZSA9IE51bWJlci5wYXJzZUludCh1cmkubWF0Y2goLzpcXC9cXC8oXFxkKylbOi9dL2kpWzFdLCAxMClcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIG1vZGUgPSBQUk9UTy5ESVNQTEFZXG4gICAgfVxuXG4gICAgdGhpcy5tb2RlID0gbW9kZVxuXG4gICAgLy8gRXhlY3V0ZSB0aGUgb3BlbiBvbiB0aGUgbmV4dCB0aWNrIHRvIGFsbG93IHRoZSBldmVudHMgY2FsbGJhY2sgc2V0XG4gICAgc2V0VGltZW91dCh0aGlzLm9wZW4uYmluZCh0aGlzKSwgMSlcbiAgfVxuXG4gIHNldCBtb2RlIChtb2RlKSB7XG4gICAgdGhpcy5fX21vZGUgPSBtb2RlXG4gIH1cblxuICBnZXQgbW9kZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19tb2RlXG4gIH1cblxuICBzZXQgb25tZXNzYWdlIChjYWxsYmFjaykge1xuICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKE1FU1NBR0UpXG4gICAgdGhpcy5vbihNRVNTQUdFLCBjYWxsYmFjaylcbiAgfVxuXG4gIHNldCBvbm9wZW4gKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoT1BFTilcbiAgICB0aGlzLm9uKE9QRU4sIGNhbGxiYWNrKVxuICB9XG5cbiAgc2V0IG9uY2xvc2UgKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoQ0xPU0UpXG4gICAgdGhpcy5vbihDTE9TRSwgY2FsbGJhY2spXG4gIH1cblxuICBzZXQgb25lcnJvciAoY2FsbGJhY2spIHtcbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhFUlJPUilcbiAgICB0aGlzLm9uKEVSUk9SLCBjYWxsYmFjaylcbiAgfVxuXG4gIHNldCBiaW5hcnlUeXBlIChiaW5hcnlUeXBlKSB7XG4gICAgLy8gRG8gbm90aGluZ1xuICB9XG5cbiAgZ2V0IGJ1ZmZlcmVkQW1vdW50ICgpIHtcbiAgICByZXR1cm4gUmVtb3RlLmJ1ZmZlcmVkQW1vdW50XG4gIH1cblxuICBnZXQgcHJvdG9jb2wgKCkge1xuICAgIHJldHVybiBSZW1vdGUucHJvdG9jb2xcbiAgfVxuXG4gIGdldCByZWFkeVN0YXRlICgpIHtcbiAgICByZXR1cm4gUmVtb3RlLnN0YXRlXG4gIH1cblxuICBvcGVuICgpIHtcbiAgICB0aGlzLmVtaXQoT1BFTilcblxuICAgIC8vIFZOQyBtb2RlXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gUFJPVE8uRElTUExBWSkge1xuICAgICAgUmVtb3RlLm9uKFBST1RPLkRJU1BMQVlfSU5JVCwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdSZWNlaXZlZCcsIFBST1RPLkRJU1BMQVlfSU5JVCwgcmVzcG9uc2UpXG4gICAgICAgIHRoaXMuZW1pdChNRVNTQUdFLCB7IGRhdGE6IHJlc3BvbnNlLmRhdGFCdWZmZXIgfSlcbiAgICAgIH0pXG4gICAgICBSZW1vdGUub24oUFJPVE8uRElTUExBWV9DTE9TRSwgKCkgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnUmVjZWl2ZWQnLCBQUk9UTy5ESVNQTEFZX0NMT1NFKVxuICAgICAgICB0aGlzLmVtaXQoQ0xPU0UsIHt9KVxuICAgICAgfSlcbiAgICAgIFJlbW90ZS5vbihQUk9UTy5ESVNQTEFZLCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1JlY2VpdmVkJywgUFJPVE8uRElTUExBWSwgcmVzcG9uc2UpXG4gICAgICAgIHRoaXMuZW1pdChNRVNTQUdFLCB7IGRhdGE6IHJlc3BvbnNlLmRhdGFCdWZmZXIgfSlcbiAgICAgIH0pXG5cbiAgICAgIC8vIEluaXQgUkZCIHByb3RvY29sXG4gICAgICB0aGlzLnNlbmQoeyBhY3Rpb246ICdjb25uZWN0JyB9LCBQUk9UTy5ESVNQTEFZX0lOSVQpXG4gICAgfVxuICB9XG5cbiAgY2xvc2UgKCkge1xuICAgIC8vIFZOQyBtb2RlXG4gICAgaWYgKHRoaXMubW9kZSA9PT0gUFJPVE8uRElTUExBWSkge1xuICAgICAgUmVtb3RlLnJlbW92ZUFsbExpc3RlbmVycyhQUk9UTy5ESVNQTEFZX0lOSVQpXG4gICAgICBSZW1vdGUucmVtb3ZlQWxsTGlzdGVuZXJzKFBST1RPLkRJU1BMQVlfQ0xPU0UpXG4gICAgICBSZW1vdGUucmVtb3ZlQWxsTGlzdGVuZXJzKFBST1RPLkRJU1BMQVkpXG4gICAgfVxuXG4gICAgdGhpcy5lbWl0KENMT1NFLCB7fSlcbiAgfVxuXG4gIHNlbmQgKG1lc3NhZ2UsIHByb3RvID0gUFJPVE8uRElTUExBWSkge1xuICAgIFJlbW90ZS5zZW5kKHtcbiAgICAgIHByb3RvOiBwcm90byxcbiAgICAgIGRhdGE6IG1lc3NhZ2VcbiAgICB9KVxuICB9XG59XG5cbkZha2VXZWJTb2NrZXQuTk9USU5JVCA9IFJlbW90ZS5OT1RJTklUXG5GYWtlV2ViU29ja2V0LkNPTk5FQ1RJTkcgPSBSZW1vdGUuQ09OTkVDVElOR1xuRmFrZVdlYlNvY2tldC5PUEVOID0gUmVtb3RlLk9QRU5cbkZha2VXZWJTb2NrZXQuQ0xPU0lORyA9IFJlbW90ZS5DTE9TSU5HXG5GYWtlV2ViU29ja2V0LkNMT1NFRCA9IFJlbW90ZS5DTE9TRURcblxuZXhwb3J0IGRlZmF1bHQgRmFrZVdlYlNvY2tldFxuIiwiY2xhc3MgTG9nZ2VyIHtcbiAgY29uc3RydWN0b3IgKHByb3BzID0ge30pIHtcbiAgICB0aGlzLnNlY3Rpb24gPSBwcm9wcy5zZWN0aW9uIHx8ICcnXG4gIH1cblxuICBkb0xvZyAodHlwZSwgLi4ucGFyYW1zKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGNvbnNvbGVbdHlwZV0odGhpcy5zZWN0aW9uID8gYFske3RoaXMuc2VjdGlvbn1dYCA6ICcnLCAuLi5wYXJhbXMpXG4gICAgfVxuICB9XG5cbiAgbG9nICguLi5wYXJhbXMpIHtcbiAgICB0aGlzLmRvTG9nKCdsb2cnLCAuLi5wYXJhbXMpXG4gIH1cblxuICBlcnJvciAoLi4ucGFyYW1zKSB7XG4gICAgdGhpcy5kb0xvZygnZXJyb3InLCAuLi5wYXJhbXMpXG4gIH1cblxuICB3YXJuaW5nICguLi5wYXJhbXMpIHtcbiAgICB0aGlzLmRvTG9nKCd3YXJuJywgLi4ucGFyYW1zKVxuICB9XG5cbiAgaW5mbyAoLi4ucGFyYW1zKSB7XG4gICAgdGhpcy5kb0xvZygnaW5mbycsIC4uLnBhcmFtcylcbiAgfVxuXG4gIHRyYWNlICguLi5wYXJhbXMpIHtcbiAgICB0aGlzLmRvTG9nKCd0cmFjZScsIC4uLnBhcmFtcylcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBMb2dnZXJcbiIsIid1c2Ugc3RyaWN0J1xuXG4vKiBcXFxufCp8XG58KnwgIEJhc2U2NCAvIGJpbmFyeSBkYXRhIC8gVVRGLTggc3RyaW5ncyB1dGlsaXRpZXNcbnwqfFxufCp8ICBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L0Jhc2U2NF9lbmNvZGluZ19hbmRfZGVjb2RpbmdcbnwqfFxuXFwgKi9cblxuLyogQXJyYXkgb2YgYnl0ZXMgdG8gYmFzZTY0IHN0cmluZyBkZWNvZGluZyAqL1xuXG5mdW5jdGlvbiBiNjRUb1VpbnQ2IChuQ2hyKSB7XG4gIHJldHVybiBuQ2hyID4gNjQgJiYgbkNociA8IDkxXG4gICAgICA/IG5DaHIgLSA2NVxuICAgIDogbkNociA+IDk2ICYmIG5DaHIgPCAxMjNcbiAgICAgID8gbkNociAtIDcxXG4gICAgOiBuQ2hyID4gNDcgJiYgbkNociA8IDU4XG4gICAgICA/IG5DaHIgKyA0XG4gICAgOiBuQ2hyID09PSA0M1xuICAgICAgPyA2MlxuICAgIDogbkNociA9PT0gNDdcbiAgICAgID8gNjNcbiAgICA6IDBcbn1cblxuZnVuY3Rpb24gYmFzZTY0RGVjVG9BcnIgKHNCYXNlNjQsIG5CbG9ja3NTaXplKSB7XG4gIHZhciBzQjY0RW5jID0gc0Jhc2U2NC5yZXBsYWNlKC9bXkEtWmEtejAtOVxcK1xcL10vZywgJycpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgdmFyIG5JbkxlbiA9IHNCNjRFbmMubGVuZ3RoXG4gIHZhciBuT3V0TGVuID0gbkJsb2Nrc1NpemUgPyBNYXRoLmNlaWwoKG5JbkxlbiAqIDMgKyAxID4+IDIpIC8gbkJsb2Nrc1NpemUpICogbkJsb2Nrc1NpemUgOiBuSW5MZW4gKiAzICsgMSA+PiAyXG4gIHZhciB0YUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobk91dExlbilcblxuICBmb3IgKHZhciBuTW9kMywgbk1vZDQsIG5VaW50MjQgPSAwLCBuT3V0SWR4ID0gMCwgbkluSWR4ID0gMDsgbkluSWR4IDwgbkluTGVuOyBuSW5JZHgrKykge1xuICAgIG5Nb2Q0ID0gbkluSWR4ICYgM1xuICAgIG5VaW50MjQgfD0gYjY0VG9VaW50NihzQjY0RW5jLmNoYXJDb2RlQXQobkluSWR4KSkgPDwgMTggLSA2ICogbk1vZDRcbiAgICBpZiAobk1vZDQgPT09IDMgfHwgbkluTGVuIC0gbkluSWR4ID09PSAxKSB7XG4gICAgICBmb3IgKG5Nb2QzID0gMDsgbk1vZDMgPCAzICYmIG5PdXRJZHggPCBuT3V0TGVuOyBuTW9kMysrLCBuT3V0SWR4KyspIHtcbiAgICAgICAgdGFCeXRlc1tuT3V0SWR4XSA9IG5VaW50MjQgPj4+ICgxNiA+Pj4gbk1vZDMgJiAyNCkgJiAyNTVcbiAgICAgIH1cbiAgICAgIG5VaW50MjQgPSAwXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhQnl0ZXNcbn1cblxuLyogQmFzZTY0IHN0cmluZyB0byBhcnJheSBlbmNvZGluZyAqL1xuXG5mdW5jdGlvbiB1aW50NlRvQjY0IChuVWludDYpIHtcbiAgcmV0dXJuIG5VaW50NiA8IDI2XG4gICAgICA/IG5VaW50NiArIDY1XG4gICAgOiBuVWludDYgPCA1MlxuICAgICAgPyBuVWludDYgKyA3MVxuICAgIDogblVpbnQ2IDwgNjJcbiAgICAgID8gblVpbnQ2IC0gNFxuICAgIDogblVpbnQ2ID09PSA2MlxuICAgICAgPyA0M1xuICAgIDogblVpbnQ2ID09PSA2M1xuICAgICAgPyA0N1xuICAgIDogNjVcbn1cblxuZnVuY3Rpb24gYmFzZTY0RW5jQXJyIChhQnl0ZXMpIHtcbiAgdmFyIG5Nb2QzID0gMlxuICB2YXIgc0I2NEVuYyA9ICcnXG5cbiAgZm9yICh2YXIgbkxlbiA9IGFCeXRlcy5sZW5ndGgsIG5VaW50MjQgPSAwLCBuSWR4ID0gMDsgbklkeCA8IG5MZW47IG5JZHgrKykge1xuICAgIG5Nb2QzID0gbklkeCAlIDNcbiAgICBpZiAobklkeCA+IDAgJiYgKG5JZHggKiA0IC8gMykgJSA3NiA9PT0gMCkgeyBzQjY0RW5jICs9ICdcXHJcXG4nIH1cbiAgICBuVWludDI0IHw9IGFCeXRlc1tuSWR4XSA8PCAoMTYgPj4+IG5Nb2QzICYgMjQpXG4gICAgaWYgKG5Nb2QzID09PSAyIHx8IGFCeXRlcy5sZW5ndGggLSBuSWR4ID09PSAxKSB7XG4gICAgICBzQjY0RW5jICs9IFN0cmluZy5mcm9tQ2hhckNvZGUodWludDZUb0I2NChuVWludDI0ID4+PiAxOCAmIDYzKSwgdWludDZUb0I2NChuVWludDI0ID4+PiAxMiAmIDYzKSwgdWludDZUb0I2NChuVWludDI0ID4+PiA2ICYgNjMpLCB1aW50NlRvQjY0KG5VaW50MjQgJiA2MykpXG4gICAgICBuVWludDI0ID0gMFxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzQjY0RW5jLnN1YnN0cigwLCBzQjY0RW5jLmxlbmd0aCAtIDIgKyBuTW9kMykgKyAobk1vZDMgPT09IDIgPyAnJyA6IG5Nb2QzID09PSAxID8gJz0nIDogJz09Jylcbn1cblxuLyogVVRGLTggYXJyYXkgdG8gRE9NU3RyaW5nIGFuZCB2aWNlIHZlcnNhICovXG5cbmZ1bmN0aW9uIFVURjhBcnJUb1N0ciAoYUJ5dGVzKSB7XG4gIHZhciBzVmlldyA9ICcnXG5cbiAgZm9yICh2YXIgblBhcnQsIG5MZW4gPSBhQnl0ZXMubGVuZ3RoLCBuSWR4ID0gMDsgbklkeCA8IG5MZW47IG5JZHgrKykge1xuICAgIG5QYXJ0ID0gYUJ5dGVzW25JZHhdXG4gICAgc1ZpZXcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgIG5QYXJ0ID4gMjUxICYmIG5QYXJ0IDwgMjU0ICYmIG5JZHggKyA1IDwgbkxlbiAvKiBzaXggYnl0ZXMgKi9cbiAgICAgICAgLyogKG5QYXJ0IC0gMjUyIDw8IDMwKSBtYXkgYmUgbm90IHNvIHNhZmUgaW4gRUNNQVNjcmlwdCEgU28uLi46ICovXG4gICAgICAgID8gKG5QYXJ0IC0gMjUyKSAqIDEwNzM3NDE4MjQgKyAoYUJ5dGVzWysrbklkeF0gLSAxMjggPDwgMjQpICsgKGFCeXRlc1srK25JZHhdIC0gMTI4IDw8IDE4KSArIChhQnl0ZXNbKytuSWR4XSAtIDEyOCA8PCAxMikgKyAoYUJ5dGVzWysrbklkeF0gLSAxMjggPDwgNikgKyBhQnl0ZXNbKytuSWR4XSAtIDEyOFxuICAgICAgOiBuUGFydCA+IDI0NyAmJiBuUGFydCA8IDI1MiAmJiBuSWR4ICsgNCA8IG5MZW4gLyogZml2ZSBieXRlcyAqL1xuICAgICAgICA/IChuUGFydCAtIDI0OCA8PCAyNCkgKyAoYUJ5dGVzWysrbklkeF0gLSAxMjggPDwgMTgpICsgKGFCeXRlc1srK25JZHhdIC0gMTI4IDw8IDEyKSArIChhQnl0ZXNbKytuSWR4XSAtIDEyOCA8PCA2KSArIGFCeXRlc1srK25JZHhdIC0gMTI4XG4gICAgICA6IG5QYXJ0ID4gMjM5ICYmIG5QYXJ0IDwgMjQ4ICYmIG5JZHggKyAzIDwgbkxlbiAvKiBmb3VyIGJ5dGVzICovXG4gICAgICAgID8gKG5QYXJ0IC0gMjQwIDw8IDE4KSArIChhQnl0ZXNbKytuSWR4XSAtIDEyOCA8PCAxMikgKyAoYUJ5dGVzWysrbklkeF0gLSAxMjggPDwgNikgKyBhQnl0ZXNbKytuSWR4XSAtIDEyOFxuICAgICAgOiBuUGFydCA+IDIyMyAmJiBuUGFydCA8IDI0MCAmJiBuSWR4ICsgMiA8IG5MZW4gLyogdGhyZWUgYnl0ZXMgKi9cbiAgICAgICAgPyAoblBhcnQgLSAyMjQgPDwgMTIpICsgKGFCeXRlc1srK25JZHhdIC0gMTI4IDw8IDYpICsgYUJ5dGVzWysrbklkeF0gLSAxMjhcbiAgICAgIDogblBhcnQgPiAxOTEgJiYgblBhcnQgPCAyMjQgJiYgbklkeCArIDEgPCBuTGVuIC8qIHR3byBieXRlcyAqL1xuICAgICAgICA/IChuUGFydCAtIDE5MiA8PCA2KSArIGFCeXRlc1srK25JZHhdIC0gMTI4XG4gICAgICA6IG5QYXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIHNWaWV3XG59XG5cbmZ1bmN0aW9uIHN0clRvVVRGOEFyciAoc0RPTVN0cikge1xuICB2YXIgYUJ5dGVzXG4gIHZhciBuQ2hyXG4gIHZhciBuU3RyTGVuID0gc0RPTVN0ci5sZW5ndGhcbiAgdmFyIG5BcnJMZW4gPSAwXG5cbiAgLyogbWFwcGluZy4uLiAqL1xuXG4gIGZvciAodmFyIG5NYXBJZHggPSAwOyBuTWFwSWR4IDwgblN0ckxlbjsgbk1hcElkeCsrKSB7XG4gICAgbkNociA9IHNET01TdHIuY2hhckNvZGVBdChuTWFwSWR4KVxuICAgIG5BcnJMZW4gKz0gbkNociA8IDB4ODAgPyAxIDogbkNociA8IDB4ODAwID8gMiA6IG5DaHIgPCAweDEwMDAwID8gMyA6IG5DaHIgPCAweDIwMDAwMCA/IDQgOiBuQ2hyIDwgMHg0MDAwMDAwID8gNSA6IDZcbiAgfVxuXG4gIGFCeXRlcyA9IG5ldyBVaW50OEFycmF5KG5BcnJMZW4pXG5cbiAgLyogdHJhbnNjcmlwdGlvbi4uLiAqL1xuXG4gIGZvciAodmFyIG5JZHggPSAwLCBuQ2hySWR4ID0gMDsgbklkeCA8IG5BcnJMZW47IG5DaHJJZHgrKykge1xuICAgIG5DaHIgPSBzRE9NU3RyLmNoYXJDb2RlQXQobkNocklkeClcbiAgICBpZiAobkNociA8IDEyOCkge1xuICAgICAgLyogb25lIGJ5dGUgKi9cbiAgICAgIGFCeXRlc1tuSWR4KytdID0gbkNoclxuICAgIH0gZWxzZSBpZiAobkNociA8IDB4ODAwKSB7XG4gICAgICAvKiB0d28gYnl0ZXMgKi9cbiAgICAgIGFCeXRlc1tuSWR4KytdID0gMTkyICsgKG5DaHIgPj4+IDYpXG4gICAgICBhQnl0ZXNbbklkeCsrXSA9IDEyOCArIChuQ2hyICYgNjMpXG4gICAgfSBlbHNlIGlmIChuQ2hyIDwgMHgxMDAwMCkge1xuICAgICAgLyogdGhyZWUgYnl0ZXMgKi9cbiAgICAgIGFCeXRlc1tuSWR4KytdID0gMjI0ICsgKG5DaHIgPj4+IDEyKVxuICAgICAgYUJ5dGVzW25JZHgrK10gPSAxMjggKyAobkNociA+Pj4gNiAmIDYzKVxuICAgICAgYUJ5dGVzW25JZHgrK10gPSAxMjggKyAobkNociAmIDYzKVxuICAgIH0gZWxzZSBpZiAobkNociA8IDB4MjAwMDAwKSB7XG4gICAgICAvKiBmb3VyIGJ5dGVzICovXG4gICAgICBhQnl0ZXNbbklkeCsrXSA9IDI0MCArIChuQ2hyID4+PiAxOClcbiAgICAgIGFCeXRlc1tuSWR4KytdID0gMTI4ICsgKG5DaHIgPj4+IDEyICYgNjMpXG4gICAgICBhQnl0ZXNbbklkeCsrXSA9IDEyOCArIChuQ2hyID4+PiA2ICYgNjMpXG4gICAgICBhQnl0ZXNbbklkeCsrXSA9IDEyOCArIChuQ2hyICYgNjMpXG4gICAgfSBlbHNlIGlmIChuQ2hyIDwgMHg0MDAwMDAwKSB7XG4gICAgICAvKiBmaXZlIGJ5dGVzICovXG4gICAgICBhQnl0ZXNbbklkeCsrXSA9IDI0OCArIChuQ2hyID4+PiAyNClcbiAgICAgIGFCeXRlc1tuSWR4KytdID0gMTI4ICsgKG5DaHIgPj4+IDE4ICYgNjMpXG4gICAgICBhQnl0ZXNbbklkeCsrXSA9IDEyOCArIChuQ2hyID4+PiAxMiAmIDYzKVxuICAgICAgYUJ5dGVzW25JZHgrK10gPSAxMjggKyAobkNociA+Pj4gNiAmIDYzKVxuICAgICAgYUJ5dGVzW25JZHgrK10gPSAxMjggKyAobkNociAmIDYzKVxuICAgIH0gZWxzZSAvKiBpZiAobkNociA8PSAweDdmZmZmZmZmKSAqLyB7XG4gICAgICAvKiBzaXggYnl0ZXMgKi9cbiAgICAgIGFCeXRlc1tuSWR4KytdID0gMjUyICsgKG5DaHIgPj4+IDMwKVxuICAgICAgYUJ5dGVzW25JZHgrK10gPSAxMjggKyAobkNociA+Pj4gMjQgJiA2MylcbiAgICAgIGFCeXRlc1tuSWR4KytdID0gMTI4ICsgKG5DaHIgPj4+IDE4ICYgNjMpXG4gICAgICBhQnl0ZXNbbklkeCsrXSA9IDEyOCArIChuQ2hyID4+PiAxMiAmIDYzKVxuICAgICAgYUJ5dGVzW25JZHgrK10gPSAxMjggKyAobkNociA+Pj4gNiAmIDYzKVxuICAgICAgYUJ5dGVzW25JZHgrK10gPSAxMjggKyAobkNociAmIDYzKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhQnl0ZXNcbn1cblxuZnVuY3Rpb24gc3RyVG9CYXNlNjQgKHN0cklucHV0KSB7XG4gIGlmICh0eXBlb2Ygc3RySW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGlucHV0IHNob3VsZCBiZSBhIHN0cmluZycpXG4gIH1cblxuICByZXR1cm4gYmFzZTY0RW5jQXJyKHN0clRvVVRGOEFycihzdHJJbnB1dCkpXG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvU3RyIChiYXNlNjRJbnB1dCkge1xuICBpZiAodHlwZW9mIGJhc2U2NElucHV0ICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBpbnB1dCBzaG91bGQgYmUgYSBzdHJpbmcnKVxuICB9XG5cbiAgcmV0dXJuIFVURjhBcnJUb1N0cihiYXNlNjREZWNUb0FycihiYXNlNjRJbnB1dCkpXG59XG5cbmV4cG9ydCB7XG4gIGJhc2U2NERlY1RvQXJyLFxuICBiYXNlNjRFbmNBcnIsXG4gIFVURjhBcnJUb1N0cixcbiAgc3RyVG9VVEY4QXJyLFxuICBzdHJUb0Jhc2U2NCxcbiAgYmFzZTY0VG9TdHJcbn1cbiIsIi8qIGdsb2JhbHMgV2ViU29ja2V0ICovXG5cbmltcG9ydCBFdmVudEVtbWl0ZXIgZnJvbSAnZXZlbnRzJ1xuaW1wb3J0IHVybFBhcnNlciBmcm9tICd1cmwnXG5cbmNsYXNzIFJlbW90ZSBleHRlbmRzIEV2ZW50RW1taXRlciB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzLl9faXNDb25uZWN0aW5nID0gZmFsc2VcbiAgICB0aGlzLl9faXNEaXNjb25uZWN0aW5nID0gZmFsc2VcbiAgfVxuXG4gIGluaXRpYWxpemUgKHBhcmFtcyA9IHt9KSB7XG4gICAgLy8gQ2hlY2sgcmVxdWlyZWQgcGFyYW1zXG4gICAgaWYgKCFwYXJhbXMudXJsIHx8ICFwYXJhbXMuYWdlbnRJRCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcnMnKVxuICAgIH1cblxuICAgIHRoaXMudXJsID0gcGFyYW1zLnVybFxuICAgIHRoaXMuYWdlbnRJRCA9IHBhcmFtcy5hZ2VudElEXG5cbiAgICBpZiAocGFyYW1zLm9uT3BlbikgdGhpcy5vbk9wZW4ocGFyYW1zLm9uT3BlbilcbiAgICBpZiAocGFyYW1zLm9uT3BlbmluZykgdGhpcy5vbk9wZW5pbmcocGFyYW1zLm9uT3BlbmluZylcbiAgICBpZiAocGFyYW1zLm9uQ2xvc2luZykgdGhpcy5vbkNsb3NpbmcocGFyYW1zLm9uQ2xvc2luZylcbiAgICBpZiAocGFyYW1zLm9uQ2xvc2UpIHRoaXMub25DbG9zZShwYXJhbXMub25DbG9zZSlcbiAgICBpZiAocGFyYW1zLm9uRXJyb3IpIHRoaXMub25FcnJvcihwYXJhbXMub25FcnJvcilcbiAgICBpZiAocGFyYW1zLm9uTWVzc2FnZSkgdGhpcy5vbk1lc3NhZ2UocGFyYW1zLm9uTWVzc2FnZSlcbiAgICBpZiAocGFyYW1zLm1lc3NhZ2VQYXJzZXIpIHRoaXMubWVzc2FnZVBhcnNlciA9IHBhcmFtcy5tZXNzYWdlUGFyc2VyXG4gIH1cblxuICBzZXQgYWdlbnRJRCAoYWdlbnRJRCkge1xuICAgIHZhciBhZ2VudElEVHlwZSA9IHR5cGVvZiBhZ2VudElEXG4gICAgaWYgKGFnZW50SURUeXBlICE9PSAnbnVtYmVyJyAmJiBhZ2VudElEVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBhZ2VudCBJRCBzaG91bGQgYmUgYSBudW1iZXIgb3IgYSBzdHJpbmcnKVxuICAgIH1cbiAgICB0aGlzLl9fYWdlbnRJRCA9IGFnZW50SURcblxuICAgIHRoaXMuX191cmwucGF0aG5hbWUgPSAnLycgKyB0aGlzLl9fYWdlbnRJRFxuICB9XG5cbiAgZ2V0IGFnZW50SUQgKCkge1xuICAgIHJldHVybiB0aGlzLl9fYWdlbnRJRFxuICB9XG5cbiAgc2V0IHVybCAodXJsKSB7XG4gICAgdmFyIHVybFR5cGUgPSB0eXBlb2YgdXJsXG4gICAgaWYgKHVybFR5cGUgIT09ICdzdHJpbmcnICYmIHVybFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgVVJMIHNob3VsZCBiZSBhbiBVUkwgb2JqZWN0IG9yIGEgc3RyaW5nJylcbiAgICB9XG5cbiAgICBpZiAodXJsVHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX191cmwgPSB1cmxQYXJzZXIucGFyc2UodXJsKVxuICAgIH0gZWxzZSBpZiAodXJsVHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHRoaXMuX191cmwgPSB1cmxcbiAgICAgIC8vIEVuc3VyZSBzbGFzaGVzXG4gICAgICB0aGlzLl9fdXJsLnNsYXNoZXMgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgZ2V0IHVybCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX191cmxcbiAgfVxuXG4gIGdldCB1cmxTdHJpbmcgKCkge1xuICAgIHJldHVybiB1cmxQYXJzZXIuZm9ybWF0KHRoaXMudXJsKVxuICB9XG5cbiAgZ2V0IHByb3RvY29sICgpIHtcbiAgICByZXR1cm4gJ2JpbmFyeSdcbiAgfVxuXG4gIGdldCBidWZmZXJlZEFtb3VudCAoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9fd3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodGhpcy5fX3dzLnJlYWR5U3RhdGUgPT09IFJlbW90ZS5PUEVOKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9fd3MuYnVmZmVyZWRBbW91bnRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgc3RhdGUgKCkge1xuICAgIGlmICh0aGlzLl9faXNDb25uZWN0aW5nKSByZXR1cm4gUmVtb3RlLkNPTk5FQ1RJTkdcbiAgICBlbHNlIGlmICh0aGlzLl9faXNEaXNjb25uZWN0aW5nKSByZXR1cm4gUmVtb3RlLkNMT1NJTkdcbiAgICBlbHNlIGlmICghdGhpcy5hZ2VudElEKSByZXR1cm4gUmVtb3RlLk5PVElOSVRcblxuICAgIGlmICh0eXBlb2YgdGhpcy5fX3dzICE9PSAndW5kZWZpbmVkJykgcmV0dXJuIHRoaXMuX193cy5yZWFkeVN0YXRlXG5cbiAgICByZXR1cm4gUmVtb3RlLkNMT1NFRFxuICB9XG5cbiAgZ2V0IGlzQ29ubmVjdGVkICgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX193cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fd3MucmVhZHlTdGF0ZSA9PT0gUmVtb3RlLk9QRU5cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBzZXQgbWVzc2FnZVBhcnNlciAobWVzc2FnZVBhcnNlcikge1xuICAgIGlmICh0eXBlb2YgbWVzc2FnZVBhcnNlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5fX21lc3NhZ2VQYXJzZXIgPSBtZXNzYWdlUGFyc2VyXG4gICAgfVxuICB9XG5cbiAgLy8gLS0gRXZlbnQgaGFuZGxlcnMgLS0gLy9cbiAgX19zdGFydENvblRpbWVvdXQgKHRpbWUgPSAxMDAwMCkge1xuICAgIHRoaXMuX19jb25UaW1lciA9IHNldFRpbWVvdXQodGhpcy5jbG9zZS5iaW5kKHRoaXMpLCB0aW1lKVxuICB9XG5cbiAgX19zdG9wQ29uVGltZW91dCAoKSB7XG4gICAgaWYgKHRoaXMuX19jb25UaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX19jb25UaW1lcilcbiAgICAgIHRoaXMuX19jb25UaW1lciA9IG51bGxcbiAgICB9XG4gIH1cblxuICBfX29uT3BlbiAoZXZlbnQpIHtcbiAgICB0aGlzLl9fc3RvcENvblRpbWVvdXQoKVxuXG4gICAgdGhpcy5fX2lzQ29ubmVjdGluZyA9IGZhbHNlXG4gICAgdGhpcy5fX2lzRGlzY29ubmVjdGluZyA9IGZhbHNlXG4gICAgdGhpcy5lbWl0KCdvcGVuJywgZXZlbnQpXG4gIH1cblxuICBfX29uT3BlbmluZyAoKSB7XG4gICAgdGhpcy5fX3N0YXJ0Q29uVGltZW91dCgpXG5cbiAgICB0aGlzLl9faXNDb25uZWN0aW5nID0gdHJ1ZVxuICAgIHRoaXMuX19pc0Rpc2Nvbm5lY3RpbmcgPSBmYWxzZVxuICAgIHRoaXMuZW1pdCgnb3BlbmluZycpXG4gIH1cblxuICBfX29uQ2xvc2UgKGV2ZW50KSB7XG4gICAgdGhpcy5fX3N0b3BDb25UaW1lb3V0KClcblxuICAgIHRoaXMuX19pc0Nvbm5lY3RpbmcgPSBmYWxzZVxuICAgIHRoaXMuX19pc0Rpc2Nvbm5lY3RpbmcgPSBmYWxzZVxuICAgIHRoaXMuZW1pdCgnY2xvc2UnLCBldmVudClcbiAgfVxuXG4gIF9fb25DbG9zaW5nICgpIHtcbiAgICB0aGlzLl9fc3RvcENvblRpbWVvdXQoKVxuXG4gICAgdGhpcy5fX2lzQ29ubmVjdGluZyA9IGZhbHNlXG4gICAgdGhpcy5fX2lzRGlzY29ubmVjdGluZyA9IHRydWVcbiAgICB0aGlzLmVtaXQoJ2Nsb3NpbmcnKVxuICB9XG5cbiAgX19vbkVycm9yIChldmVudCkge1xuICAgIHRoaXMuX19zdG9wQ29uVGltZW91dCgpXG5cbiAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXZlbnQpXG4gIH1cblxuICBfX29uTWVzc2FnZSAoZXZlbnQpIHtcbiAgICB0aGlzLmVtaXQoJ21lc3NhZ2UnLCBldmVudC5kYXRhKVxuICB9XG5cbiAgb25PcGVuIChjYWxsYmFjaykge1xuICAgIHJldHVybiB0aGlzLm9uKCdvcGVuJywgY2FsbGJhY2spXG4gIH1cblxuICBvbk9wZW5pbmcgKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMub24oJ29wZW5pbmcnLCBjYWxsYmFjaylcbiAgfVxuXG4gIG9uQ2xvc2UgKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMub24oJ2Nsb3NlJywgY2FsbGJhY2spXG4gIH1cblxuICBvbkNsb3NpbmcgKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMub24oJ2Nsb3NpbmcnLCBjYWxsYmFjaylcbiAgfVxuXG4gIG9uRXJyb3IgKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMub24oJ2Vycm9yJywgY2FsbGJhY2spXG4gIH1cblxuICBvbk1lc3NhZ2UgKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMub24oJ21lc3NhZ2UnLCBjYWxsYmFjaylcbiAgfVxuXG4gIGNvbm5lY3QgKCkge1xuICAgIC8vIEhBQ0sgLy9cbiAgICAvLyB2YXIgb3BlbiA9IHRoaXMuX19vbk9wZW4uYmluZCh0aGlzKVxuICAgIC8vIHRoaXMuX193cyA9IHt9XG4gICAgLy8gdGhpcy5fX3dzLnNlbmQgPSAoKT0+e31cbiAgICAvLyB0aGlzLl9fd3MuY2xvc2UgPSAoKT0+e31cbiAgICAvLyB0aGlzLl9fd3MucmVhZHlTdGF0ZSA9IFJlbW90ZS5PUEVOXG4gICAgLy8gb3BlbigpXG4gICAgLy8gcmV0dXJuXG4gICAgLy8gSEFDSyAvL1xuXG4gICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkICYmIHRoaXMuYWdlbnRJRCkge1xuICAgICAgLy8gRmlyZSBvcGVuaW5nIGV2ZW50XG4gICAgICB0aGlzLl9fb25PcGVuaW5nKClcblxuICAgICAgdGhpcy5fX3dzID0gbmV3IFdlYlNvY2tldCh0aGlzLnVybFN0cmluZywgdGhpcy5wcm90b2NvbClcbiAgICAgIHRoaXMuX193cy5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJ1xuICAgICAgdGhpcy5fX3dzLm9ub3BlbiA9IHRoaXMuX19vbk9wZW4uYmluZCh0aGlzKVxuICAgICAgdGhpcy5fX3dzLm9uY2xvc2UgPSB0aGlzLl9fb25DbG9zZS5iaW5kKHRoaXMpXG4gICAgICB0aGlzLl9fd3Mub25lcnJvciA9IHRoaXMuX19vbkVycm9yLmJpbmQodGhpcylcbiAgICAgIHRoaXMuX193cy5vbm1lc3NhZ2UgPSB0aGlzLl9fb25NZXNzYWdlLmJpbmQodGhpcylcbiAgICB9XG4gIH1cblxuICByZWNvbm5lY3QgKCkge1xuICAgIHRoaXMuY29ubmVjdCgpXG4gIH1cblxuICBjbG9zZSAoKSB7XG4gICAgLy8gRmlyZSBjbG9zaW5nIGV2ZW50XG4gICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHRoaXMuX19vbkNsb3NpbmcoKVxuICAgIGlmICh0aGlzLl9fd3MpIHRoaXMuX193cy5jbG9zZSgpXG4gIH1cblxuICBzZW5kIChtZXNzYWdlKSB7XG4gICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5fX21lc3NhZ2VQYXJzZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbWVzc2FnZSA9IHRoaXMuX19tZXNzYWdlUGFyc2VyKG1lc3NhZ2UpXG4gICAgICB9XG4gICAgICB0aGlzLl9fd3Muc2VuZChtZXNzYWdlKVxuICAgIH1cbiAgfVxufVxuXG5SZW1vdGUuTk9USU5JVCA9IC0xXG5SZW1vdGUuQ09OTkVDVElORyA9IDBcblJlbW90ZS5PUEVOID0gMVxuUmVtb3RlLkNMT1NJTkcgPSAyXG5SZW1vdGUuQ0xPU0VEID0gM1xuXG5leHBvcnQgZGVmYXVsdCBSZW1vdGVcbiIsIi8vIHNyYy9jb21tb24vbGliL3JlbW90ZS9SZW1vdGVBZ2VudC5qc1xuXG5pbXBvcnQgUmVtb3RlIGZyb20gJy4vUmVtb3RlJ1xuaW1wb3J0IFJlbW90ZVJlc3BvbnNlIGZyb20gJy4vcmVzcG9uc2UtZGF0YSdcblxuY2xhc3MgUmVtb3RlQWdlbnQgZXh0ZW5kcyBSZW1vdGUge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgdGhpcy5tZXNzYWdlUGFyc2VyID0gKG1lc3NhZ2UpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UuZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyIHx8XG4gICAgICAgICAgICBtZXNzYWdlLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlLnByb3RvID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbWVzc2FnZSA9IChtZXNzYWdlLmRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcilcbiAgICAgICAgICAgICAgPyBtZXNzYWdlLmRhdGEgLy8gQXJyYXlCdWZmZXJcbiAgICAgICAgICAgICAgOiBtZXNzYWdlLmRhdGEuYnVmZmVyIC8vIEFycmF5QnVmZmVyIGZyb20gVWludDhBcnJheVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTZW5kIGFuIEFycmF5QnVmZmVyIHdpdGggdGhlIHByb3RvICsgbWVzc2FnZVxuICAgICAgICAgICAgY29uc3QgbVZpZXcgPSBuZXcgVWludDhBcnJheSgxICsgbWVzc2FnZS5kYXRhLmJ5dGVMZW5ndGgpIC8vIFByb3RvIC0+IDEgYnl0ZVxuICAgICAgICAgICAgbVZpZXcuc2V0KG5ldyBVaW50OEFycmF5KFttZXNzYWdlLnByb3RvXSksIDApXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gKG1lc3NhZ2UuZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKVxuICAgICAgICAgICAgICA/IG5ldyBVaW50OEFycmF5KG1lc3NhZ2UuZGF0YSkgLy8gdHlwZWQgYXJyYXkgZnJvbSBidWZmZXJcbiAgICAgICAgICAgICAgOiBtZXNzYWdlLmRhdGEgLy8gYWxyZWFkeSBhIHR5cGVkIGFycmF5XG4gICAgICAgICAgICBtVmlldy5zZXQoZGF0YSwgMSlcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBtVmlldy5idWZmZXJcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IGZpbmFsTWVzc2FnZSA9ICcnXG4gICAgICAgICAgLy8gUHJvdG9cbiAgICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UucHJvdG8gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBmaW5hbE1lc3NhZ2UgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShtZXNzYWdlLnByb3RvKVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBEYXRhXG4gICAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlLmRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBmaW5hbE1lc3NhZ2UgKz0gbWVzc2FnZS5kYXRhXG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbWVzc2FnZS5kYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgZmluYWxNZXNzYWdlICs9IEpTT04uc3RyaW5naWZ5KG1lc3NhZ2UuZGF0YSlcbiAgICAgICAgICB9XG4gICAgICAgICAgbWVzc2FnZSA9IGZpbmFsTWVzc2FnZVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLmJ1ZmZlclxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWVzc2FnZVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IChyZXNwb25zZSkgPT4ge1xuICAgICAgLy8gcmVzcG9uc2Ugd2lsbCBhbHdheXMgYmUgQXJyYXlCdWZmZXJcbiAgICAgIGlmICghKHJlc3BvbnNlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSByZXR1cm5cbiAgICAgIGNvbnN0IHJSZXNwb25zZSA9IG5ldyBSZW1vdGVSZXNwb25zZShyZXNwb25zZSlcbiAgICAgIHRoaXMuZW1pdChyUmVzcG9uc2UucHJvdG8sIHJSZXNwb25zZSlcbiAgICB9XG5cbiAgICB0aGlzLm9uTWVzc2FnZShyZXNwb25zZUhhbmRsZXIpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVtb3RlQWdlbnRcbiIsIi8vIHNyYy9jb21tb24vbGliL3JlbW90ZS9pbmRleC5qc1xuXG5pbXBvcnQgUmVtb3RlQWdlbnQgZnJvbSAnLi9SZW1vdGVBZ2VudCdcblxuY29uc3QgYWdlbnQgPSBuZXcgUmVtb3RlQWdlbnQoKVxuYWdlbnQuTk9USU5JVCA9IC0xXG5hZ2VudC5DT05ORUNUSU5HID0gMFxuYWdlbnQuT1BFTiA9IDFcbmFnZW50LkNMT1NJTkcgPSAyXG5hZ2VudC5DTE9TRUQgPSAzXG5cbi8vIEV4cG9ydGluZyB0aGlzIHdheSB0aGUgY2xhc3Mgd2lsbCBhY3QgYXMgYSBzaW5nbGV0b25cbmV4cG9ydCBkZWZhdWx0IGFnZW50XG4iLCJpbXBvcnQgdXRmOCBmcm9tICd1dGY4J1xuXG5mdW5jdGlvbiBSZXNwb25zZURhdGEgKHJlc3BvbnNlKSB7XG4gIC8vIENyZWF0ZSBhIFVURi04IHZpZXcgdG8gcmVhZCB0aGUgUFJPVE9cbiAgdGhpcy5wcm90byA9IChuZXcgVWludDhBcnJheShyZXNwb25zZS5zbGljZSgwLCAxKSkpWzBdXG4gIC8vIFRoZSBkYXRhIHdpbGwgYmUgYW4gQXJyYXlCdWZmZXIgd2l0aG91dCB0aGUgcHJvdG9cbiAgdGhpcy5kYXRhQnVmZmVyID0gcmVzcG9uc2Uuc2xpY2UoMSkgLy8gc3RhcnRzIGZyb20gdGhlIGJ5dGUgOFxuXG4gIC8vIERhdGEgcmVwcmVzZW50ZWQgYXMgYSBVVEYtOCBzdHJpbmdcbiAgbGV0IGRhdGFTdHJpbmdcblxuICBjb25zdCB1SW50OFRvU3RyaW5nID0gKHU4YSkgPT4ge1xuICAgIGNvbnN0IENIVU5LX1NJWkUgPSAweDgwMDBcbiAgICBjb25zdCBjaHVua3MgPSBbXVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1OGEubGVuZ3RoOyBpICs9IENIVU5LX1NJWkUpIHtcbiAgICAgIGNodW5rcy5wdXNoKFxuICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHU4YS5zdWJhcnJheShpLCBpICsgQ0hVTktfU0laRSkpXG4gICAgICApXG4gICAgfVxuXG4gICAgcmV0dXJuIGNodW5rcy5qb2luKCcnKVxuICB9XG5cbiAgdGhpcy50b1N0cmluZyA9ICgpID0+IHtcbiAgICAvLyBMYXp5IGxvYWRcbiAgICBpZiAoIWRhdGFTdHJpbmcpIHtcbiAgICAgIGRhdGFTdHJpbmcgPSB1SW50OFRvU3RyaW5nKG5ldyBVaW50OEFycmF5KHRoaXMuZGF0YUJ1ZmZlcikpXG4gICAgfVxuICAgIHJldHVybiBkYXRhU3RyaW5nXG4gIH1cblxuICAvLyBEYXRhIHJlcHJlc2VudGVkIGFzIGFuIE9iamVjdFxuICBsZXQgZGF0YVxuXG4gIHRoaXMudG9KU09OID0gKCkgPT4ge1xuICAgIC8vIExhenkgbG9hZFxuICAgIGlmICghZGF0YSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gV0FSTklORzogVGhlIHJlY2VpdmVkIGRhdGEgd2hpY2ggd2FzIGpzb24gZW5jb2RlZCBpbnRvIHRoZSBhZ2VudFxuICAgICAgICAvLyBuZWVkcyB0byBiZSBkb3VibGUgVVRGOCBkZWNvZGVkXG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHV0ZjguZGVjb2RlKHRoaXMudG9TdHJpbmcoKSkpXG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UodGhpcy50b1N0cmluZygpKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGF0YVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFJlc3BvbnNlRGF0YVxuIiwiZXhwb3J0IGNsYXNzIGZ1bGxTY3JlZW5VdGlsIHtcbiAgc3VwcG9ydGVkRnVsbHNjcmVlbiAoKSB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBlbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICByZXR1cm4gKGVsZW0ucmVxdWVzdEZ1bGxzY3JlZW4gfHxcbiAgICAgICAgICAgICAgZWxlbS5tc1JlcXVlc3RGdWxsc2NyZWVuIHx8XG4gICAgICAgICAgICAgIGVsZW0ubW96UmVxdWVzdEZ1bGxTY3JlZW4gfHxcbiAgICAgICAgICAgICAgZWxlbS53ZWJraXRSZXF1ZXN0RnVsbFNjcmVlbilcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBlbmFibGVkRnVsbHNjcmVlbiAoKSB7XG4gICAgaWYgKCF0aGlzLnN1cHBvcnRlZEZ1bGxzY3JlZW4oKSB8fCB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIChkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCB8fFxuICAgICAgICAgICAgZG9jdW1lbnQubXNGdWxsc2NyZWVuRWxlbWVudCB8fFxuICAgICAgICAgICAgZG9jdW1lbnQubW96RnVsbFNjcmVlbkVsZW1lbnQgfHxcbiAgICAgICAgICAgIGRvY3VtZW50LndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50KVxuICB9XG5cbiAgZXhpdEZ1bGxzY3JlZW4gKCkge1xuICAgIGlmICghdGhpcy5zdXBwb3J0ZWRGdWxsc2NyZWVuKCkgfHwgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykgcmV0dXJuXG4gICAgaWYgKHRoaXMuZW5hYmxlZEZ1bGxzY3JlZW4oKSkge1xuICAgICAgaWYgKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKSBkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpXG4gICAgICBlbHNlIGlmIChkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKSBkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKClcbiAgICAgIGVsc2UgaWYgKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pIGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKVxuICAgICAgZWxzZSBpZiAoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pIGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKClcbiAgICB9XG4gIH1cblxuICByZXF1ZXN0RnVsbHNjcmVlbiAoZWxlbSkge1xuICAgIGlmICghdGhpcy5zdXBwb3J0ZWRGdWxsc2NyZWVuKCkgfHwgdHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykgcmV0dXJuXG5cbiAgICBpZiAoIXRoaXMuZW5hYmxlZEZ1bGxzY3JlZW4oKSkge1xuICAgICAgaWYgKGVsZW0ucmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgZWxlbS5yZXF1ZXN0RnVsbHNjcmVlbigpXG4gICAgICB9IGVsc2UgaWYgKGVsZW0ubXNSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICBlbGVtLm1zUmVxdWVzdEZ1bGxzY3JlZW4oKVxuICAgICAgfSBlbHNlIGlmIChlbGVtLm1velJlcXVlc3RGdWxsU2NyZWVuKSB7XG4gICAgICAgIGVsZW0ubW96UmVxdWVzdEZ1bGxTY3JlZW4oKVxuICAgICAgfSBlbHNlIGlmIChlbGVtLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgIGVsZW0ud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4od2luZG93LkVsZW1lbnQuQUxMT1dfS0VZQk9BUkRfSU5QVVQpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhpdEZ1bGxzY3JlZW4oKVxuICAgIH1cbiAgfVxuXG4gIGJpbmRGdWxsc2NyZWVuRXZlbnRzIChjYWxsYmFjaywgY2FsbGJhY2tFcnJvcikge1xuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIGNhbGxiYWNrID0gKCkgPT4ge31cbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrRXJyb3IgIT09ICdmdW5jdGlvbicpIGNhbGxiYWNrRXJyb3IgPSAoKSA9PiB7fVxuXG4gICAgLy8gTm8gcHJlZml4XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmVycm9yJywgKGV2ZW50KSA9PiB7XG4gICAgICBjYWxsYmFja0Vycm9yKGV2ZW50KVxuICAgIH0pXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIChldmVudCkgPT4ge1xuICAgICAgY2FsbGJhY2soZXZlbnQpXG4gICAgfSlcblxuICAgIC8vIE1TIHByZWZpeFxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ01TRnVsbHNjcmVlbkVycm9yJywgKGV2ZW50KSA9PiB7XG4gICAgICBjYWxsYmFja0Vycm9yKGV2ZW50KVxuICAgIH0pXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignTVNGdWxsc2NyZWVuQ2hhbmdlJywgKGV2ZW50KSA9PiB7XG4gICAgICBjYWxsYmFjayhldmVudClcbiAgICB9KVxuXG4gICAgLy8gbW96IHByZWZpeFxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vemZ1bGxzY3JlZW5lcnJvcicsIChldmVudCkgPT4ge1xuICAgICAgY2FsbGJhY2tFcnJvcihldmVudClcbiAgICB9KVxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vemZ1bGxzY3JlZW5jaGFuZ2UnLCAoZXZlbnQpID0+IHtcbiAgICAgIGNhbGxiYWNrKGV2ZW50KVxuICAgIH0pXG5cbiAgICAvLyB3ZWJraXQgcHJlZml4XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd2Via2l0ZnVsbHNjcmVlbmVycm9yJywgKGV2ZW50KSA9PiB7XG4gICAgICBjYWxsYmFja0Vycm9yKGV2ZW50KVxuICAgIH0pXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignd2Via2l0ZnVsbHNjcmVlbmNoYW5nZScsIChldmVudCkgPT4ge1xuICAgICAgY2FsbGJhY2soZXZlbnQpXG4gICAgfSlcbiAgfVxuXG4gIHVuYmluZEZ1bGxzY3JlZW5FdmVudHMgKGNhbGxiYWNrLCBjYWxsYmFja0Vycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykgY2FsbGJhY2sgPSAoKSA9PiB7fVxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2tFcnJvciAhPT0gJ2Z1bmN0aW9uJykgY2FsbGJhY2tFcnJvciA9ICgpID0+IHt9XG5cbiAgICAvLyBObyBwcmVmaXhcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmdWxsc2NyZWVuZXJyb3InLCBjYWxsYmFja0Vycm9yKVxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBjYWxsYmFjaylcblxuICAgIC8vIE1TIHByZWZpeFxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ01TRnVsbHNjcmVlbkVycm9yJywgY2FsbGJhY2tFcnJvcilcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdNU0Z1bGxzY3JlZW5DaGFuZ2UnLCBjYWxsYmFjaylcblxuICAgIC8vIG1veiBwcmVmaXhcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3pmdWxsc2NyZWVuZXJyb3InLCBjYWxsYmFja0Vycm9yKVxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vemZ1bGxzY3JlZW5jaGFuZ2UnLCBjYWxsYmFjaylcblxuICAgIC8vIHdlYmtpdCBwcmVmaXhcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd3ZWJraXRmdWxsc2NyZWVuZXJyb3InLCBjYWxsYmFja0Vycm9yKVxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnLCBjYWxsYmFjaylcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZW5zdXJlQm9vbCA9ICh2YWx1ZSwgZXJyTWVzcyA9ICdUaGUgdmFsdWUgc2hvdWxkIGJlIGJvb2xlYW4nKSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJykge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKSkpIHtcbiAgICAgICAgdmFsdWUgPSBCb29sZWFuKE51bWJlci5wYXJzZUludCh2YWx1ZSwgMTApKVxuICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gJ3RydWUnIHx8IHZhbHVlID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHZhbHVlID0gKHZhbHVlID09PSAndHJ1ZScpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGVyck1lc3MpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICB2YWx1ZSA9IEJvb2xlYW4oTnVtYmVyLnBhcnNlSW50KHZhbHVlLCAxMCkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoZXJyTWVzcylcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlXG59XG5cbi8qKlxuICogQ3V0cyB0aGUgdGV4dCBpZiB0aGVpciBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWxlY3RlZCBtYXggbGVuZ3RoXG4gKiBhbmQgYXBwbGllcyB0aGUgc2VsZWN0ZWQgZWxsaXBzZSB0byB0aGUgcmVzdWx0IHRleHQuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRleHQgdG8gY3V0XG4gKiBAcGFyYW0ge251bWJlcn0gbWF4IE1heGltdW0gbGVuZ3RoIGFmdGVyIGN1dHRpbmcgdGhlIHRleHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbGxpcHNlIFN0cmluZyB0byBiZSBhZGRlZCB0byB0aGUgY3V0dGVkIHRleHRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IEZ1bGwgdGV4dCBvciB0ZXh0IGN1dHRlZCB3aXRoIHRoZSBlbGxpcHNlXG4gKi9cbmV4cG9ydCBjb25zdCBlbGxpcHNpemUgPSAoc3RyLCBtYXggPSAxNDAsIGVsbGlwc2UgPSAn4oCmJykgPT4gKFxuICAoc3RyLnRyaW0oKS5sZW5ndGggPiBtYXgpID8gc3RyLnN1YnN0cigwLCBtYXgpLnRyaW0oKSArIGVsbGlwc2UgOiBzdHJcbilcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGluamVjdEludGwgfSBmcm9tICdyZWFjdC1pbnRsJ1xuaW1wb3J0IHtcbiAgTW9kYWwsIEJ1dHRvbiwgR2x5cGhpY29uLCBGb3JtR3JvdXAsIElucHV0R3JvdXAsIEZvcm1Db250cm9sXG59IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcblxuZXhwb3J0IGNsYXNzIEFnZW50QXV0aGVudGljYXRpb24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIHRoaXMuaGFuZGxlSGlkZSA9IChldmVudCkgPT4ge1xuICAgICAgcHJvcHMuaGFuZGxlSGlkZSgpXG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVTdWJtaXQgPSAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIHByb3BzLmhhbmRsZVN1Ym1pdChldmVudC50YXJnZXQucGFzc3dvcmQudmFsdWUpXG4gICAgICBwcm9wcy5oYW5kbGVIaWRlKClcbiAgICB9XG5cbiAgICB0aGlzLm1lc3NhZ2VzID0ge1xuICAgICAgYWdlbnRQYXNzd29yZDoge1xuICAgICAgICBpZDogJ2FnZW50UGFzc3dvcmQnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0FnZW50IHBhc3N3b3JkJ1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBzaG93IH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgZGVmaW5lTWVzc2FnZSA9IHRoaXMucHJvcHMuaW50bC5mb3JtYXRNZXNzYWdlXG5cbiAgICByZXR1cm4gKFxuICAgICAgPE1vZGFsXG4gICAgICAgIHNob3c9e3Nob3d9XG4gICAgICAgIGtleWJvYXJkXG4gICAgICAgIG9uSGlkZT17dGhpcy5oYW5kbGVIaWRlfVxuICAgICAgICBic1NpemU9J3NtYWxsJ1xuICAgICAgICBhcmlhLWxhYmVsbGVkYnk9J2NvbnRhaW5lZC1tb2RhbC10aXRsZS1zbSc+XG4gICAgICAgIDxNb2RhbC5IZWFkZXIgY2xvc2VCdXR0b249e2ZhbHNlfT5cbiAgICAgICAgICA8TW9kYWwuVGl0bGUgaWQ9J2NvbnRhaW5lZC1tb2RhbC10aXRsZS1zbSc+XG4gICAgICAgICAgICB7IGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy5hZ2VudFBhc3N3b3JkKSB9XG4gICAgICAgICAgPC9Nb2RhbC5UaXRsZT5cbiAgICAgICAgPC9Nb2RhbC5IZWFkZXI+XG4gICAgICAgIDxNb2RhbC5Cb2R5PlxuICAgICAgICAgIDxmb3JtIG9uU3VibWl0PXt0aGlzLmhhbmRsZVN1Ym1pdH0+XG4gICAgICAgICAgICA8Rm9ybUdyb3VwPlxuICAgICAgICAgICAgICA8SW5wdXRHcm91cD5cbiAgICAgICAgICAgICAgICA8SW5wdXRHcm91cC5CdXR0b24+XG4gICAgICAgICAgICAgICAgICA8QnV0dG9uIHR5cGU9J3N1Ym1pdCcgYnNTdHlsZT0ncHJpbWFyeSc+XG4gICAgICAgICAgICAgICAgICAgIDxHbHlwaGljb24gZ2x5cGg9J2xvZy1pbicgLz5cbiAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvSW5wdXRHcm91cC5CdXR0b24+XG4gICAgICAgICAgICAgICAgPEZvcm1Db250cm9sXG4gICAgICAgICAgICAgICAgICBjb21wb25lbnRDbGFzcz0naW5wdXQnXG4gICAgICAgICAgICAgICAgICBhdXRvRm9jdXNcbiAgICAgICAgICAgICAgICAgIG9uRm9jdXM9eyhlKSA9PiBlLnRhcmdldC5zZWxlY3QoKX1cbiAgICAgICAgICAgICAgICAgIG5hbWU9J3Bhc3N3b3JkJ1xuICAgICAgICAgICAgICAgICAgdHlwZT0ncGFzc3dvcmQnXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17dGhpcy5tZXNzYWdlfVxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgLz5cbiAgICAgICAgICAgICAgPC9JbnB1dEdyb3VwPlxuICAgICAgICAgICAgPC9Gb3JtR3JvdXA+XG4gICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L01vZGFsLkJvZHk+XG4gICAgICA8L01vZGFsPlxuICAgIClcbiAgfVxufVxuXG5BZ2VudEF1dGhlbnRpY2F0aW9uLnByb3BUeXBlcyA9IHtcbiAgaGFuZGxlU3VibWl0OiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBoYW5kbGVIaWRlOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgc2hvdzogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG5cbiAgaW50bDogUmVhY3QuUHJvcFR5cGVzLm9iamVjdFxufVxuXG5BZ2VudEF1dGhlbnRpY2F0aW9uLmRlZmF1bHRQcm9wcyA9IHtcbiAgaGFuZGxlSGlkZTogKCkgPT4ge30sXG4gIGZvcm1hdE1lc3NhZ2U6ICgpID0+IHt9LFxuICBzaG93OiB0cnVlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdEludGwoQWdlbnRBdXRoZW50aWNhdGlvbilcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCdcbmltcG9ydCB7IGluamVjdEludGwsIGludGxTaGFwZSB9IGZyb20gJ3JlYWN0LWludGwnXG5pbXBvcnQgUmVtb3RlIGZyb20gJy4uL2NvbW1vbi9saWIvcmVtb3RlJ1xuXG5pbXBvcnQgeyBnZXRTZWN0aW9uLCBnZXRBY3RpdmVTZWN0aW9uLCBnZXRGaXJzdEFjdGl2ZSB9IGZyb20gJy4uL3JlZHVjZXJzL2FwcCdcbmltcG9ydCB7IHNlbmRBZ2VudFBhc3N3b3JkIH0gZnJvbSAnLi4vYWN0aW9ucy9hZ2VudCdcbmltcG9ydCB7IGZldGNoUmVtb3RlU2VjdGlvbiwgcmVzZXRGaXJzdEFjdGl2ZVNlY3Rpb24sIGluZm9ybVJlbW90ZVNlY3Rpb24gfVxuICBmcm9tICcuLi9hY3Rpb25zL2FwcCdcblxuaW1wb3J0IGJpbmRSZXNwb25zZXMgZnJvbSAnLi4vcmVzcG9uc2VzJ1xuXG4vLyBDb21wb25lbnRzXG5pbXBvcnQgSGVhZGVyIGZyb20gJy4uL2NvbXBvbmVudHMvaGVhZGVyJ1xuaW1wb3J0IEluZm9QYW5lbCBmcm9tICcuLi9jb21wb25lbnRzL2luZm8tcGFuZWwnXG5pbXBvcnQgQWdlbnRBdXRoZW50aWNhdGlvbiBmcm9tICcuLi9jb21wb25lbnRzL2FnZW50LWF1dGhlbnRpY2F0aW9uJ1xuaW1wb3J0IFNlY3Rpb24sIHsgUGVyc2lzdGVudFNlY3Rpb25zIH0gZnJvbSAnLi4vY29tcG9uZW50cy9zZWN0aW9uJ1xuXG5jbGFzcyBBcHAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIC8vIEJpbmQgYWxsIHRoZSByZW1vdGUgZXZlbnQgaGFuZGxlcnMgLy9cbiAgICBjb25zdCB7IGRpc3BhdGNoLCBpbnRsIH0gPSB0aGlzLnByb3BzXG4gICAgYmluZFJlc3BvbnNlcyhSZW1vdGUsIGRpc3BhdGNoLCBpbnRsKVxuXG4gICAgdGhpcy5oYW5kbGVEaXNjb25uZWN0Q2xpY2sgPSAoKSA9PiB7XG4gICAgICBpZiAoUmVtb3RlLmlzQ29ubmVjdGVkKSB7XG4gICAgICAgIFJlbW90ZS5jbG9zZSgpXG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KHByb3BzLmhhbmRsZURpc2Nvbm5lY3RDbGljaywgMTAwKVxuICAgIH1cblxuICAgIHRoaXMucmVjb25uZWN0ID0gUmVtb3RlLnJlY29ubmVjdC5iaW5kKFJlbW90ZSlcbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgc2hvd0hlYWRlciwgc2VsZWN0ZWRTZWN0aW9uLCBoYW5kbGVBZ2VudFBhc3NTdWJtaXQsXG4gICAgICBhbGxvd1NlY3Rpb24sIGJsb2NrUmVxdWVzdFNlY3Rpb24sIGZldGNoaW5nUmVtb3RlU2VjdGlvbixcbiAgICAgIGluZm9ybVJlbW90ZVNlY3Rpb24sXG4gICAgICBmZXRjaFNlY3Rpb24sIGluZm9ybVNlY3Rpb24sIGZpcnN0QWN0aXZlU2VjdGlvbiwgaGFuZGxlRmlyc3RBY3RpdmVTZWN0aW9uLFxuICAgICAgLy8gQ29ubmVjdGlvblxuICAgICAgaXNVbmtub3duLCBpc0J1c3ksIGlzQ29ubmVjdGluZywgaXNEaXNjb25uZWN0aW5nLCBpc0Nvbm5lY3RlZCxcbiAgICAgIGNvbm5lY3Rpb25FcnJvciwgY29ubmVjdGlvbkVycm9yQ29kZSwgY29ubmVjdGlvbkVycm9yTWVzc2FnZSxcbiAgICAgIC8vIEF1dGhlbnRpY2F0aW9uXG4gICAgICBpc0F1dGhlbnRpY2F0aW5nLCBpc0F1dGhlbnRpY2F0ZWQsXG4gICAgICBhdXRoZW50aWNhdGlvbkVycm9yLCBhdXRoZW50aWNhdGlvbkVycm9yQ29kZSwgYXV0aGVudGljYXRpb25FcnJvck1lc3NhZ2UsXG4gICAgICAvLyBBZ2VudCBpbmZvXG4gICAgICBhZ2VudElELCBhZ2VudEhvc3RuYW1lXG4gICAgfSA9IHRoaXMucHJvcHNcblxuICAgIGNvbnN0IGhhbmRsZUFsbG93U2VjdGlvbkNsaWNrID0gaW5mb3JtUmVtb3RlU2VjdGlvblxuICAgICAgPyBpbmZvcm1TZWN0aW9uXG4gICAgICA6IGZldGNoU2VjdGlvblxuXG4gICAgY29uc3QgY29udGFpbmVyU3R5bGUgPSB7XG4gICAgICBwYWRkaW5nVG9wOiBzaG93SGVhZGVyID8gJzcwcHgnIDogJzIwcHgnXG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgaWQ9J2Vob3J1cy1hcHAnPlxuICAgICAgICB7IHNob3dIZWFkZXIgJiZcbiAgICAgICAgICA8SGVhZGVyXG4gICAgICAgICAgICBhZ2VudElEPXthZ2VudElEfVxuICAgICAgICAgICAgYWdlbnRIb3N0bmFtZT17YWdlbnRIb3N0bmFtZX1cbiAgICAgICAgICAgIGhhbmRsZURpc2Nvbm5lY3RDbGljaz17dGhpcy5oYW5kbGVEaXNjb25uZWN0Q2xpY2t9IC8+XG4gICAgICAgIH1cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGlkPSdlaG9ydXMtY29udGFpbmVyJ1xuICAgICAgICAgIGNsYXNzTmFtZT0nY29udGFpbmVyLWZsdWlkJ1xuICAgICAgICAgIHN0eWxlPXtjb250YWluZXJTdHlsZX0+XG4gICAgICAgICAgeyBpc0Nvbm5lY3RlZCAmJiBpc0F1dGhlbnRpY2F0ZWQgJiZcbiAgICAgICAgICAgIDxTZWN0aW9uXG4gICAgICAgICAgICAgIHNlbGVjdGVkPXtzZWxlY3RlZFNlY3Rpb259XG4gICAgICAgICAgICAgIGFsbG93PXthbGxvd1NlY3Rpb259XG4gICAgICAgICAgICAgIGJsb2NrUmVxdWVzdD17YmxvY2tSZXF1ZXN0U2VjdGlvbn1cbiAgICAgICAgICAgICAgaGFuZGxlQWxsb3dTZWN0aW9uQ2xpY2s9e2hhbmRsZUFsbG93U2VjdGlvbkNsaWNrfVxuICAgICAgICAgICAgICBmZXRjaGluZ1JlbW90ZT17ZmV0Y2hpbmdSZW1vdGVTZWN0aW9ufVxuICAgICAgICAgICAgICBmaXJzdEFjdGl2ZT17Zmlyc3RBY3RpdmVTZWN0aW9ufVxuICAgICAgICAgICAgICByZXNldEZpcnN0QWN0aXZlPXtoYW5kbGVGaXJzdEFjdGl2ZVNlY3Rpb259IC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIHsgaXNDb25uZWN0ZWQgJiYgaXNBdXRoZW50aWNhdGVkICYmXG4gICAgICAgICAgICA8UGVyc2lzdGVudFNlY3Rpb25zIC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIHsgKCFpc0Nvbm5lY3RlZCB8fCAhaXNBdXRoZW50aWNhdGVkKSAmJlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPEluZm9QYW5lbFxuICAgICAgICAgICAgICAgIGlzVW5rbm93bj17aXNVbmtub3dufVxuICAgICAgICAgICAgICAgIGlzQnVzeT17aXNCdXN5fVxuICAgICAgICAgICAgICAgIGlzQ29ubmVjdGluZz17aXNDb25uZWN0aW5nfVxuICAgICAgICAgICAgICAgIGlzRGlzY29ubmVjdGluZz17aXNEaXNjb25uZWN0aW5nfVxuICAgICAgICAgICAgICAgIGlzQ29ubmVjdGVkPXtpc0Nvbm5lY3RlZH1cbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uRXJyb3I9e2Nvbm5lY3Rpb25FcnJvcn1cbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uRXJyb3JDb2RlPXtjb25uZWN0aW9uRXJyb3JDb2RlfVxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25FcnJvck1lc3NhZ2U9e2Nvbm5lY3Rpb25FcnJvck1lc3NhZ2V9XG4gICAgICAgICAgICAgICAgaXNBdXRoZW50aWNhdGluZz17aXNBdXRoZW50aWNhdGluZ31cbiAgICAgICAgICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ9e2lzQXV0aGVudGljYXRlZH1cbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbkVycm9yPXthdXRoZW50aWNhdGlvbkVycm9yfVxuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uRXJyb3JDb2RlPXthdXRoZW50aWNhdGlvbkVycm9yQ29kZX1cbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbkVycm9yTWVzc2FnZT17YXV0aGVudGljYXRpb25FcnJvck1lc3NhZ2V9XG4gICAgICAgICAgICAgICAgaGFuZGxlQ29ubmVjdGlvbj17dGhpcy5yZWNvbm5lY3R9XG4gICAgICAgICAgICAgICAgdGltZXI9ezYwfSAvPlxuICAgICAgICAgICAgICB7IGlzQ29ubmVjdGVkICYmICFpc0F1dGhlbnRpY2F0aW5nICYmICFpc0F1dGhlbnRpY2F0ZWQgJiZcbiAgICAgICAgICAgICAgICA8QWdlbnRBdXRoZW50aWNhdGlvbiBoYW5kbGVTdWJtaXQ9e2hhbmRsZUFnZW50UGFzc1N1Ym1pdH0gLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICAvLyBJbml0IFdlYlNvY2tldCBjb25uZWN0aW9uXG4gICAgaWYgKFJlbW90ZS5hZ2VudElEKSB7XG4gICAgICBzZXRUaW1lb3V0KFJlbW90ZS5jb25uZWN0LmJpbmQoUmVtb3RlKSwgMSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGFnZW50IElEJylcbiAgICB9XG4gIH1cbn1cblxuQXBwLnByb3BUeXBlcyA9IHtcbiAgc2hvd0hlYWRlcjogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIHNlbGVjdGVkU2VjdGlvbjogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgYWxsb3dTZWN0aW9uOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgYmxvY2tSZXF1ZXN0U2VjdGlvbjogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGZldGNoaW5nUmVtb3RlU2VjdGlvbjogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGZpcnN0QWN0aXZlU2VjdGlvbjogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgaW5mb3JtUmVtb3RlU2VjdGlvbjogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGhhbmRsZUZpcnN0QWN0aXZlU2VjdGlvbjogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGhhbmRsZURpc2Nvbm5lY3RDbGljazogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGhhbmRsZUFnZW50UGFzc1N1Ym1pdDogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgZmV0Y2hTZWN0aW9uOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgaW5mb3JtU2VjdGlvbjogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIC8vIENvbm5lY3Rpb25cbiAgaXNVbmtub3duOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaXNCdXN5OiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaXNDb25uZWN0aW5nOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaXNEaXNjb25uZWN0aW5nOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaXNDb25uZWN0ZWQ6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBjb25uZWN0aW9uRXJyb3I6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBjb25uZWN0aW9uRXJyb3JDb2RlOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICBjb25uZWN0aW9uRXJyb3JNZXNzYWdlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICAvLyBBdXRoZW50aWNhdGlvblxuICBpc0F1dGhlbnRpY2F0aW5nOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaXNBdXRoZW50aWNhdGVkOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgYXV0aGVudGljYXRpb25FcnJvcjogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGF1dGhlbnRpY2F0aW9uRXJyb3JDb2RlOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICBhdXRoZW50aWNhdGlvbkVycm9yTWVzc2FnZTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgLy8gQWdlbnQgaW5mb1xuICBhZ2VudElEOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBhZ2VudEhvc3RuYW1lOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICAvLyBSZWR1eCBhbmQgSW50bCByZWZlcmVuY2VzXG4gIGRpc3BhdGNoOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBpbnRsOiBpbnRsU2hhcGUuaXNSZXF1aXJlZFxufVxuXG5BcHAuZGVmYXVsdFByb3BzID0ge1xuICBzaG93SGVhZGVyOiB0cnVlLFxuICBhbGxvd1NlY3Rpb246IGZhbHNlLFxuICBibG9ja1JlcXVlc3Q6IGZhbHNlLFxuICBmZXRjaGluZ1JlbW90ZTogZmFsc2UsXG4gIGluZm9ybVJlbW90ZVNlY3Rpb246IGZhbHNlLFxuICAvLyBDb25uZWN0aW9uXG4gIGlzVW5rbm93bjogZmFsc2UsXG4gIGlzQnVzeTogZmFsc2UsXG4gIGlzQ29ubmVjdGluZzogZmFsc2UsXG4gIGlzRGlzY29ubmVjdGluZzogZmFsc2UsXG4gIGlzQ29ubmVjdGVkOiBmYWxzZSxcbiAgY29ubmVjdGlvbkVycm9yOiBmYWxzZSxcbiAgY29ubmVjdGlvbkVycm9yQ29kZTogbnVsbCxcbiAgY29ubmVjdGlvbkVycm9yTWVzc2FnZTogbnVsbCxcbiAgLy8gQXV0aGVudGljYXRpb25cbiAgaXNBdXRoZW50aWNhdGluZzogZmFsc2UsXG4gIGlzQXV0aGVudGljYXRlZDogZmFsc2UsXG4gIGF1dGhlbnRpY2F0aW9uRXJyb3I6IGZhbHNlLFxuICBhdXRoZW50aWNhdGlvbkVycm9yQ29kZTogbnVsbCxcbiAgYXV0aGVudGljYXRpb25FcnJvck1lc3NhZ2U6IG51bGwsXG4gIC8vIEFnZW50IGluZm9cbiAgYWdlbnRJRDogJycsXG4gIGFnZW50SG9zdG5hbWU6ICcnXG59XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9IChzdGF0ZSwgcHJvcHMpID0+IHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKVxuICBjb25zdCBwZXJpb2QgPSA2MDAwMDAgLy8gVGVuIG1pbnV0ZXMgaW4gbXNcbiAgY29uc3QgaXNVbmtub3duID0gc3RhdGUuYXBwLmFnZW50TGFzdENvbnRhY3QgJiZcbiAgICAobm93IC0gc3RhdGUuYXBwLmFnZW50TGFzdENvbnRhY3QgPiBwZXJpb2QpXG5cbiAgY29uc3QgbmV3UHJvcHMgPSB7XG4gICAgc2hvd0hlYWRlcjogc3RhdGUuYXBwLnNob3dIZWFkZXIsXG4gICAgaGFuZGxlRGlzY29ubmVjdENsaWNrOiBzdGF0ZS5hcHAuaGFuZGxlRGlzY29ubmVjdCxcbiAgICAvLyBDb25uZWN0aW9uXG4gICAgaXNVbmtub3duLFxuICAgIGlzQnVzeTogc3RhdGUuYXBwLmFnZW50SXNCdXN5LFxuICAgIGlzQ29ubmVjdGluZzogc3RhdGUuYWdlbnQuaXNDb25uZWN0aW5nLFxuICAgIGlzRGlzY29ubmVjdGluZzogc3RhdGUuYWdlbnQuaXNEaXNjb25uZWN0aW5nLFxuICAgIGlzQ29ubmVjdGVkOiBzdGF0ZS5hZ2VudC5pc0Nvbm5lY3RlZCxcbiAgICBjb25uZWN0aW9uRXJyb3I6IHN0YXRlLmFnZW50LmNvbm5lY3Rpb25FcnJvcixcbiAgICBjb25uZWN0aW9uRXJyb3JDb2RlOiBzdGF0ZS5hZ2VudC5jb25uZWN0aW9uRXJyb3JDb2RlLFxuICAgIGNvbm5lY3Rpb25FcnJvck1lc3NhZ2U6IHN0YXRlLmFnZW50LmNvbm5lY3Rpb25FcnJvck1lc3NhZ2UsXG4gICAgLy8gQXV0aGVudGljYXRpb25cbiAgICBpc0F1dGhlbnRpY2F0aW5nOiBzdGF0ZS5hZ2VudC5pc0F1dGhlbnRpY2F0aW5nLFxuICAgIGlzQXV0aGVudGljYXRlZDogc3RhdGUuYWdlbnQuaXNBdXRoZW50aWNhdGVkLFxuICAgIGF1dGhlbnRpY2F0aW9uRXJyb3I6IHN0YXRlLmFnZW50LmF1dGhlbnRpY2F0aW9uRXJyb3IsXG4gICAgYXV0aGVudGljYXRpb25FcnJvckNvZGU6IHN0YXRlLmFnZW50LmF1dGhlbnRpY2F0aW9uRXJyb3JDb2RlLFxuICAgIGF1dGhlbnRpY2F0aW9uRXJyb3JNZXNzYWdlOiBzdGF0ZS5hZ2VudC5hdXRoZW50aWNhdGlvbkVycm9yTWVzc2FnZSxcbiAgICAvLyBBZ2VudCBpbmZvXG4gICAgYWdlbnRJRDogc3RhdGUuYWdlbnQuaWQsXG4gICAgYWdlbnRIb3N0bmFtZTogc3RhdGUuYWdlbnQuaG9zdG5hbWVcbiAgfVxuICBjb25zdCBhY3RpdmVTZWN0aW9uID0gZ2V0QWN0aXZlU2VjdGlvbihzdGF0ZS5hcHApXG4gIGlmIChhY3RpdmVTZWN0aW9uKSB7XG4gICAgbmV3UHJvcHMuc2VsZWN0ZWRTZWN0aW9uID0gYWN0aXZlU2VjdGlvblxuICAgIGNvbnN0IHNlY3Rpb25Qcm9wcyA9IGdldFNlY3Rpb24oc3RhdGUuYXBwLCBhY3RpdmVTZWN0aW9uKVxuICAgIG5ld1Byb3BzLmFsbG93U2VjdGlvbiA9IHNlY3Rpb25Qcm9wcy5hbGxvd1xuICAgIG5ld1Byb3BzLmJsb2NrUmVxdWVzdFNlY3Rpb24gPSBzZWN0aW9uUHJvcHMuYmxvY2tSZXF1ZXN0XG4gICAgbmV3UHJvcHMuaW5mb3JtUmVtb3RlU2VjdGlvbiA9IHNlY3Rpb25Qcm9wcy5pbmZvcm1cbiAgICBuZXdQcm9wcy5mZXRjaGluZ1JlbW90ZVNlY3Rpb24gPSBzZWN0aW9uUHJvcHMuZmV0Y2hpbmdSZW1vdGVcbiAgfVxuICBjb25zdCBmaXJzdFNlY3Rpb24gPSBnZXRGaXJzdEFjdGl2ZShzdGF0ZS5hcHApXG4gIGlmIChmaXJzdFNlY3Rpb24pIHtcbiAgICBuZXdQcm9wcy5maXJzdEFjdGl2ZVNlY3Rpb24gPSBmaXJzdFNlY3Rpb25cbiAgfVxuXG4gIHJldHVybiBuZXdQcm9wc1xufVxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gKGRpc3BhdGNoLCBwcm9wcykgPT4ge1xuICByZXR1cm4ge1xuICAgIGRpc3BhdGNoLFxuICAgIGhhbmRsZUFnZW50UGFzc1N1Ym1pdDogKHBhc3MpID0+IGRpc3BhdGNoKHNlbmRBZ2VudFBhc3N3b3JkKHBhc3MpKSxcbiAgICBmZXRjaFNlY3Rpb246IChzZWN0aW9uKSA9PiBkaXNwYXRjaChmZXRjaFJlbW90ZVNlY3Rpb24oc2VjdGlvbikpLFxuICAgIGluZm9ybVNlY3Rpb246IChzZWN0aW9uKSA9PiBkaXNwYXRjaChpbmZvcm1SZW1vdGVTZWN0aW9uKHNlY3Rpb24pKSxcbiAgICBoYW5kbGVGaXJzdEFjdGl2ZVNlY3Rpb246IChzZWN0aW9uKSA9PiBkaXNwYXRjaChyZXNldEZpcnN0QWN0aXZlU2VjdGlvbigpKVxuICB9XG59XG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShpbmplY3RJbnRsKEFwcCkpXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQge1xuICBCdXR0b24sIEJ1dHRvbkdyb3VwLCBCdXR0b25Ub29sYmFyLCBHbHlwaGljb24sIE92ZXJsYXlUcmlnZ2VyLCBUb29sdGlwXG59IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcbmltcG9ydCB7IGRlZmluZU1lc3NhZ2VzLCBGb3JtYXR0ZWRNZXNzYWdlIH0gZnJvbSAncmVhY3QtaW50bCdcbmltcG9ydCBEaXNwbGF5S2V5c0J1dHRvbiBmcm9tICcuL2tleXMtYnV0dG9uJ1xuaW1wb3J0IEtleWJvYXJkQnV0dG9uIGZyb20gJy4va2V5Ym9hcmQtYnV0dG9uJ1xuXG4vLyBNZXNzYWdlcyBkZWZpbml0aW9uXG5jb25zdCBtZXNzYWdlcyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgZGlzY29ubmVjdDoge1xuICAgIGlkOiAnZGlzY29ubmVjdCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdEaXNjb25uZWN0J1xuICB9LFxuICBjb25uZWN0OiB7XG4gICAgaWQ6ICdjb25uZWN0JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0Nvbm5lY3QnXG4gIH0sXG4gIGZ1bGxzY3JlZW46IHtcbiAgICBpZDogJ2Z1bGxzY3JlZW4nLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRnVsbHNjcmVlbidcbiAgfSxcbiAgZXhpdEZ1bGxzY3JlZW46IHtcbiAgICBpZDogJ2V4aXRGdWxsc2NyZWVuJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0V4aXQgZnVsbHNjcmVlbidcbiAgfSxcbiAgY2xpcGJvYXJkOiB7XG4gICAgaWQ6ICdjbGlwYm9hcmQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnQ2xpcGJvYXJkJ1xuICB9LFxuICB0cnVlQ29sb3I6IHtcbiAgICBpZDogJ3RydWVDb2xvcicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUcnVlIENvbG9yJ1xuICB9LFxuICBsb2NhbEN1cnNvcjoge1xuICAgIGlkOiAnbG9jYWxDdXJzb3InLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnTG9jYWwgQ3Vyc29yJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Rpc3BsYXkgdGhlIGxvY2FsIG1vdXNlIG9uIHJlbW90ZSBWTkMnXG4gIH0sXG4gIHNoYXJlZDoge1xuICAgIGlkOiAnc2hhcmVkJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1NoYXJlZCdcbiAgfSxcbiAgdmlld09ubHk6IHtcbiAgICBpZDogJ3ZpZXdPbmx5JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1ZpZXcgT25seScsXG4gICAgZGVzY3JpcHRpb246ICdPbmx5IGRpc3BsYXkgcmVtb3RlIGRlc2t0b3AgYW5kIGNhbm5vdCBpbnRlcmFjdCB3aXRoIGl0J1xuICB9LFxuICBmdWxsTWVudToge1xuICAgIGlkOiAnZnVsbE1lbnUnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRnVsbCBNZW51JyxcbiAgICBkZXNjcmlwdGlvbjogJ0Rpc3BsYXkgYWxsIG9wdGlvbnMgaW4gVk5DIG1lbnUnXG4gIH0sXG4gIHNtYWxsTWVudToge1xuICAgIGlkOiAnc21hbGxNZW51JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1NtYWxsIE1lbnUnLFxuICAgIGRlc2NyaXB0aW9uOiAnRGlzcGxheSBsZXNzIG9wdGlvbnMgaW4gVk5DIG1lbnUnXG4gIH1cbn0pXG5cbmNsYXNzIERpc3BsYXlCdXR0b25zIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICB0aGlzLmhhbmRsZUNvbm5lY3RDbGljayA9IHRoaXMucHJvcHMuaGFuZGxlQ29ubmVjdENsaWNrXG4gICAgICA/IChldmVudCkgPT4gdGhpcy5wcm9wcy5oYW5kbGVDb25uZWN0Q2xpY2soKVxuICAgICAgOiAoKSA9PiB7fVxuICAgIHRoaXMuaGFuZGxlRGlzY29ubmVjdENsaWNrID0gdGhpcy5wcm9wcy5oYW5kbGVEaXNjb25uZWN0Q2xpY2tcbiAgICAgID8gKGV2ZW50KSA9PiB0aGlzLnByb3BzLmhhbmRsZURpc2Nvbm5lY3RDbGljaygpXG4gICAgICA6ICgpID0+IHt9XG4gICAgdGhpcy5oYW5kbGVGdWxsU2NyZWVuQ2xpY2sgPSB0aGlzLnByb3BzLmhhbmRsZUZ1bGxTY3JlZW5DbGlja1xuICAgICAgPyAoZXZlbnQpID0+IHRoaXMucHJvcHMuaGFuZGxlRnVsbFNjcmVlbkNsaWNrKClcbiAgICAgIDogKCkgPT4ge31cbiAgICB0aGlzLmhhbmRsZVRydWVDb2xvckNsaWNrID0gdGhpcy5wcm9wcy5oYW5kbGVUcnVlQ29sb3JDbGlja1xuICAgICAgPyAodmFsdWUpID0+IChldmVudCkgPT4gdGhpcy5wcm9wcy5oYW5kbGVUcnVlQ29sb3JDbGljayh2YWx1ZSlcbiAgICAgIDogKCkgPT4ge31cbiAgICB0aGlzLmhhbmRsZUxvY2FsQ3Vyc29yQ2xpY2sgPSB0aGlzLnByb3BzLmhhbmRsZUxvY2FsQ3Vyc29yQ2xpY2tcbiAgICAgID8gKHZhbHVlKSA9PiAoZXZlbnQpID0+IHRoaXMucHJvcHMuaGFuZGxlTG9jYWxDdXJzb3JDbGljayh2YWx1ZSlcbiAgICAgIDogKCkgPT4ge31cbiAgICB0aGlzLmhhbmRsZVNoYXJlZENsaWNrID0gdGhpcy5wcm9wcy5oYW5kbGVTaGFyZWRDbGlja1xuICAgICAgPyAodmFsdWUpID0+IChldmVudCkgPT4gdGhpcy5wcm9wcy5oYW5kbGVTaGFyZWRDbGljayh2YWx1ZSlcbiAgICAgIDogKCkgPT4ge31cbiAgICB0aGlzLmhhbmRsZVZpZXdPbmx5Q2xpY2sgPSB0aGlzLnByb3BzLmhhbmRsZVZpZXdPbmx5Q2xpY2tcbiAgICAgID8gKHZhbHVlKSA9PiAoZXZlbnQpID0+IHRoaXMucHJvcHMuaGFuZGxlVmlld09ubHlDbGljayh2YWx1ZSlcbiAgICAgIDogKCkgPT4ge31cbiAgICB0aGlzLmhhbmRsZUNsaXBib2FyZENsaWNrID0gdGhpcy5wcm9wcy5oYW5kbGVDbGlwYm9hcmRDbGlja1xuICAgICAgPyAoZXZlbnQpID0+IHRoaXMucHJvcHMuaGFuZGxlQ2xpcGJvYXJkQ2xpY2soKVxuICAgICAgOiAoKSA9PiB7fVxuICAgIHRoaXMuaGFuZGxlUGFuZWxTaXplQ2xpY2sgPSB0aGlzLnByb3BzLmhhbmRsZVBhbmVsU2l6ZUNsaWNrXG4gICAgICA/IChldmVudCkgPT4gdGhpcy5wcm9wcy5oYW5kbGVQYW5lbFNpemVDbGljaygpXG4gICAgICA6ICgpID0+IHt9XG4gICAgdGhpcy5zZW5kS2V5ID0gdGhpcy5wcm9wcy5zZW5kS2V5XG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGlzTW9iaWxlLCBpc0Nvbm5lY3RpbmcsIGlzQ29ubmVjdGVkLCBpc0Z1bGxzY3JlZW4sIHNob3dGdWxsc2NyZWVuQnRuLFxuICAgICAgdHJ1ZUNvbG9yLCBsb2NhbEN1cnNvciwgc2hhcmVkLCB2aWV3T25seSwgY2xpcGJvYXJkLCB0b29sdGlwUGxhY2VtZW50LFxuICAgICAgdG9nZ2xlUGFuZWxTaXplLCBwYW5lbFNtYWxsLCBjaGlsZHJlbixcbiAgICAgIG9uVmlydHVhbEtleWJvYXJkVXNlZFxuICAgIH0gPSB0aGlzLnByb3BzXG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBpZD0nZGlzcGxheS1idXR0b25zJz5cbiAgICAgICAgPEJ1dHRvblRvb2xiYXI+XG4gICAgICAgICAgeyAoaXNDb25uZWN0ZWQgfHwgaXNDb25uZWN0aW5nKSAmJlxuICAgICAgICAgICAgPE92ZXJsYXlUcmlnZ2VyXG4gICAgICAgICAgICAgIHBsYWNlbWVudD17dG9vbHRpcFBsYWNlbWVudH1cbiAgICAgICAgICAgICAgb3ZlcmxheT17XG4gICAgICAgICAgICAgICAgPFRvb2x0aXAgaWQ9J2Rpc3AtdG9vbHRpcC1kaXNjb25uZWN0Jz5cbiAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5kaXNjb25uZWN0fSAvPlxuICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgfT5cbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ncHVsbC1yaWdodCdcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZURpc2Nvbm5lY3RDbGlja30+XG4gICAgICAgICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD0nbG9nLW91dCcgLz5cbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICA8L092ZXJsYXlUcmlnZ2VyPlxuICAgICAgICAgIH1cbiAgICAgICAgICB7ICghaXNDb25uZWN0ZWQgJiYgIWlzQ29ubmVjdGluZykgJiZcbiAgICAgICAgICAgIDxPdmVybGF5VHJpZ2dlclxuICAgICAgICAgICAgICBwbGFjZW1lbnQ9e3Rvb2x0aXBQbGFjZW1lbnR9XG4gICAgICAgICAgICAgIG92ZXJsYXk9e1xuICAgICAgICAgICAgICAgIDxUb29sdGlwIGlkPSdkaXNwLXRvb2x0aXAtY29ubmVjdCc+XG4gICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMuY29ubmVjdH0gLz5cbiAgICAgICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICAgIH0+XG4gICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9J3B1bGwtcmlnaHQnXG4gICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVDb25uZWN0Q2xpY2t9PlxuICAgICAgICAgICAgICAgIDxHbHlwaGljb24gZ2x5cGg9J2xvZy1pbicgLz5cbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICA8L092ZXJsYXlUcmlnZ2VyPlxuICAgICAgICAgIH1cbiAgICAgICAgICB7IGlzQ29ubmVjdGVkICYmIHNob3dGdWxsc2NyZWVuQnRuICYmIGlzRnVsbHNjcmVlbiAmJiAhcGFuZWxTbWFsbCAmJlxuICAgICAgICAgICAgPE92ZXJsYXlUcmlnZ2VyXG4gICAgICAgICAgICAgIHBsYWNlbWVudD17dG9vbHRpcFBsYWNlbWVudH1cbiAgICAgICAgICAgICAgb3ZlcmxheT17XG4gICAgICAgICAgICAgICAgPFRvb2x0aXAgaWQ9J2Rpc3AtdG9vbHRpcC1leGl0LWZ1bGxzY3JlZW4nPlxuICAgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLmV4aXRGdWxsc2NyZWVufSAvPlxuICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgfT5cbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ncHVsbC1yaWdodCdcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZUZ1bGxTY3JlZW5DbGlja30+XG4gICAgICAgICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD0ncmVzaXplLXNtYWxsJyAvPlxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgIDwvT3ZlcmxheVRyaWdnZXI+XG4gICAgICAgICAgfVxuICAgICAgICAgIHsgaXNDb25uZWN0ZWQgJiYgc2hvd0Z1bGxzY3JlZW5CdG4gJiYgIWlzRnVsbHNjcmVlbiAmJiAhcGFuZWxTbWFsbCAmJlxuICAgICAgICAgICAgPE92ZXJsYXlUcmlnZ2VyXG4gICAgICAgICAgICAgIHBsYWNlbWVudD17dG9vbHRpcFBsYWNlbWVudH1cbiAgICAgICAgICAgICAgb3ZlcmxheT17XG4gICAgICAgICAgICAgICAgPFRvb2x0aXAgaWQ9J2Rpc3AtdG9vbHRpcC1mdWxsc2NyZWVuJz5cbiAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5mdWxsc2NyZWVufSAvPlxuICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgfT5cbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ncHVsbC1yaWdodCdcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZUZ1bGxTY3JlZW5DbGlja30+XG4gICAgICAgICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD0ncmVzaXplLWZ1bGwnIC8+XG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgPC9PdmVybGF5VHJpZ2dlcj5cbiAgICAgICAgICB9XG4gICAgICAgICAgeyBpc0Nvbm5lY3RlZCAmJiAhcGFuZWxTbWFsbCAmJlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3B1bGwtcmlnaHQgYnRuLWdyb3VwJz5cbiAgICAgICAgICAgICAgPERpc3BsYXlLZXlzQnV0dG9uIHNlbmRLZXk9e3RoaXMuc2VuZEtleX0gLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICB7IGlzQ29ubmVjdGVkICYmIGlzTW9iaWxlICYmICFwYW5lbFNtYWxsICYmXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncHVsbC1yaWdodCBidG4tZ3JvdXAnPlxuICAgICAgICAgICAgICA8S2V5Ym9hcmRCdXR0b24gb25WaXJ0dWFsS2V5Ym9hcmRVc2VkPXtvblZpcnR1YWxLZXlib2FyZFVzZWR9IC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgICAgeyBpc0Nvbm5lY3RlZCAmJiBjbGlwYm9hcmQgJiYgIXBhbmVsU21hbGwgJiZcbiAgICAgICAgICAgIDxPdmVybGF5VHJpZ2dlclxuICAgICAgICAgICAgICBwbGFjZW1lbnQ9e3Rvb2x0aXBQbGFjZW1lbnR9XG4gICAgICAgICAgICAgIG92ZXJsYXk9e1xuICAgICAgICAgICAgICAgIDxUb29sdGlwIGlkPSdkaXNwLXRvb2x0aXAtY2xpcGJvYXJkJz5cbiAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5jbGlwYm9hcmR9IC8+XG4gICAgICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgICAgICB9PlxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdwdWxsLXJpZ2h0J1xuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlQ2xpcGJvYXJkQ2xpY2t9PlxuICAgICAgICAgICAgICAgIDxHbHlwaGljb24gZ2x5cGg9J2NvcHknIC8+XG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgPC9PdmVybGF5VHJpZ2dlcj5cbiAgICAgICAgICB9XG4gICAgICAgICAgeyAhaXNDb25uZWN0ZWQgJiZcbiAgICAgICAgICAgIDxCdXR0b25Hcm91cCBjbGFzc05hbWU9J3B1bGwtcmlnaHQnPlxuICAgICAgICAgICAgICA8T3ZlcmxheVRyaWdnZXJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9e3Rvb2x0aXBQbGFjZW1lbnR9XG4gICAgICAgICAgICAgICAgb3ZlcmxheT17XG4gICAgICAgICAgICAgICAgICA8VG9vbHRpcCBpZD0nZGlzcC10b29sdGlwLXRydWUtY29sb3InPlxuICAgICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMudHJ1ZUNvbG9yfSAvPlxuICAgICAgICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgICAgICAgIH0+XG4gICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzQ29ubmVjdGluZyB8fCBpc0Nvbm5lY3RlZH1cbiAgICAgICAgICAgICAgICAgIGFjdGl2ZT17dHJ1ZUNvbG9yfVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVUcnVlQ29sb3JDbGljayghdHJ1ZUNvbG9yKX0+XG4gICAgICAgICAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSd0aW50JyAvPlxuICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICA8L092ZXJsYXlUcmlnZ2VyPlxuICAgICAgICAgICAgICA8T3ZlcmxheVRyaWdnZXJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9e3Rvb2x0aXBQbGFjZW1lbnR9XG4gICAgICAgICAgICAgICAgb3ZlcmxheT17XG4gICAgICAgICAgICAgICAgICA8VG9vbHRpcCBpZD0nZGlzcC10b29sdGlwLWxvY2FsLWN1cnNvcic+XG4gICAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5sb2NhbEN1cnNvcn0gLz5cbiAgICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgICB9PlxuICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc0Nvbm5lY3RpbmcgfHwgaXNDb25uZWN0ZWR9XG4gICAgICAgICAgICAgICAgICBhY3RpdmU9e2xvY2FsQ3Vyc29yfVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVMb2NhbEN1cnNvckNsaWNrKCFsb2NhbEN1cnNvcil9PlxuICAgICAgICAgICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD0nYXN0ZXJpc2snIC8+XG4gICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgIDwvT3ZlcmxheVRyaWdnZXI+XG4gICAgICAgICAgICAgIDxPdmVybGF5VHJpZ2dlclxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD17dG9vbHRpcFBsYWNlbWVudH1cbiAgICAgICAgICAgICAgICBvdmVybGF5PXtcbiAgICAgICAgICAgICAgICAgIDxUb29sdGlwIGlkPSdkaXNwLXRvb2x0aXAtc2hhcmVkJz5cbiAgICAgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLnNoYXJlZH0gLz5cbiAgICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgICB9PlxuICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc0Nvbm5lY3RpbmcgfHwgaXNDb25uZWN0ZWR9XG4gICAgICAgICAgICAgICAgICBhY3RpdmU9e3NoYXJlZH1cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlU2hhcmVkQ2xpY2soIXNoYXJlZCl9PlxuICAgICAgICAgICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD0nc2hhcmUtYWx0JyAvPlxuICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICA8L092ZXJsYXlUcmlnZ2VyPlxuICAgICAgICAgICAgICA8T3ZlcmxheVRyaWdnZXJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9e3Rvb2x0aXBQbGFjZW1lbnR9XG4gICAgICAgICAgICAgICAgb3ZlcmxheT17XG4gICAgICAgICAgICAgICAgICA8VG9vbHRpcCBpZD0nZGlzcC10b29sdGlwLXZpZXctb25seSc+XG4gICAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy52aWV3T25seX0gLz5cbiAgICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgICB9PlxuICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtpc0Nvbm5lY3RpbmcgfHwgaXNDb25uZWN0ZWR9XG4gICAgICAgICAgICAgICAgICBhY3RpdmU9e3ZpZXdPbmx5fVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVWaWV3T25seUNsaWNrKCF2aWV3T25seSl9PlxuICAgICAgICAgICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD0nZXllLW9wZW4nIC8+XG4gICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgIDwvT3ZlcmxheVRyaWdnZXI+XG4gICAgICAgICAgICA8L0J1dHRvbkdyb3VwPlxuICAgICAgICAgIH1cbiAgICAgICAgICB7ICFwYW5lbFNtYWxsICYmIGNoaWxkcmVuIH1cbiAgICAgICAgICB7IGlzQ29ubmVjdGVkICYmIHRvZ2dsZVBhbmVsU2l6ZSAmJlxuICAgICAgICAgICAgPE92ZXJsYXlUcmlnZ2VyXG4gICAgICAgICAgICAgIHBsYWNlbWVudD17dG9vbHRpcFBsYWNlbWVudH1cbiAgICAgICAgICAgICAgb3ZlcmxheT17XG4gICAgICAgICAgICAgICAgPFRvb2x0aXAgaWQ9J2Rpc3AtdG9vbHRpcC10b2dnbGUtYnRucy1wYW4tc2l6ZSc+XG4gICAgICAgICAgICAgICAgICB7IHBhbmVsU21hbGwgJiYgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLmZ1bGxNZW51fSAvPiB9XG4gICAgICAgICAgICAgICAgICB7ICFwYW5lbFNtYWxsICYmIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5zbWFsbE1lbnV9IC8+IH1cbiAgICAgICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICAgIH0+XG4gICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9J3B1bGwtcmlnaHQnXG4gICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVQYW5lbFNpemVDbGlja30+XG4gICAgICAgICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD17cGFuZWxTbWFsbCA/ICdwbHVzJyA6ICdtaW51cyd9IC8+XG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgPC9PdmVybGF5VHJpZ2dlcj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvQnV0dG9uVG9vbGJhcj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxufVxuXG5EaXNwbGF5QnV0dG9ucy5wcm9wVHlwZXMgPSB7XG4gIGlzTW9iaWxlOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaXNDb25uZWN0aW5nOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaXNEaWNvbm5lY3Rpbmc6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBpc0Nvbm5lY3RlZDogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGhhbmRsZUNvbm5lY3RDbGljazogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGhhbmRsZURpc2Nvbm5lY3RDbGljazogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGlzRnVsbHNjcmVlbjogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIHNob3dGdWxsc2NyZWVuQnRuOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaGFuZGxlRnVsbFNjcmVlbkNsaWNrOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgdHJ1ZUNvbG9yOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaGFuZGxlVHJ1ZUNvbG9yQ2xpY2s6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBsb2NhbEN1cnNvcjogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGhhbmRsZUxvY2FsQ3Vyc29yQ2xpY2s6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBzaGFyZWQ6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBoYW5kbGVTaGFyZWRDbGljazogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIHZpZXdPbmx5OiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaGFuZGxlVmlld09ubHlDbGljazogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGNsaXBib2FyZDogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGhhbmRsZUNsaXBib2FyZENsaWNrOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgc2VuZEtleTogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgaGFuZGxlUGFuZWxTaXplQ2xpY2s6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICB0b2dnbGVQYW5lbFNpemU6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBwYW5lbFNtYWxsOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgdG9vbHRpcFBsYWNlbWVudDogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgb25WaXJ0dWFsS2V5Ym9hcmRVc2VkOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgY2hpbGRyZW46IFJlYWN0LlByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgIFJlYWN0LlByb3BUeXBlcy5hcnJheU9mKFJlYWN0LlByb3BUeXBlcy5ub2RlKSxcbiAgICBSZWFjdC5Qcm9wVHlwZXMubm9kZVxuICBdKVxufVxuRGlzcGxheUJ1dHRvbnMuZGVmYXVsdFByb3BzID0ge1xuICBpc01vYmlsZTogZmFsc2UsXG4gIGlzQ29ubmVjdGluZzogZmFsc2UsXG4gIGlzRGljb25uZWN0aW5nOiBmYWxzZSxcbiAgaXNDb25uZWN0ZWQ6IGZhbHNlLFxuICBpc0Z1bGxzY3JlZW46IGZhbHNlLFxuICBzaG93RnVsbHNjcmVlbkJ0bjogZmFsc2UsXG4gIHRydWVDb2xvcjogdHJ1ZSxcbiAgbG9jYWxDdXJzb3I6IHRydWUsXG4gIHNoYXJlZDogdHJ1ZSxcbiAgdmlld09ubHk6IGZhbHNlLFxuICBjbGlwYm9hcmQ6IGZhbHNlLFxuICB0b2dnbGVQYW5lbFNpemU6IGZhbHNlLFxuICBwYW5lbFNtYWxsOiBmYWxzZSxcbiAgdG9vbHRpcFBsYWNlbWVudDogJ2JvdHRvbSdcbn1cblxuZXhwb3J0IGRlZmF1bHQgRGlzcGxheUJ1dHRvbnNcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IE1vZGFsLCBCdXR0b24sIEZvcm1Db250cm9sLCBOYXYsIE5hdkl0ZW0gfSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQgeyBpbmplY3RJbnRsIH0gZnJvbSAncmVhY3QtaW50bCdcblxuY2xhc3MgQ2xpcGJvYXJkTW9kYWwgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBsb2M6ICdyZW1vdGUnLFxuICAgICAgbG9jYWxUZXh0OiAnJ1xuICAgIH1cblxuICAgIHRoaXMuaGFuZGxlQ2xvc2UgPSB0aGlzLnByb3BzLmhhbmRsZUNsb3NlXG4gICAgICA/IChldmVudCkgPT4gdGhpcy5wcm9wcy5oYW5kbGVDbG9zZSgpXG4gICAgICA6ICgpID0+IHt9XG4gICAgLy8gTWVudVxuICAgIHRoaXMuaGFuZGxlU2VsZWN0ID0gKGxvYykgPT4gKGV2ZW50KSA9PiB0aGlzLnNldFN0YXRlKHsgbG9jIH0pXG5cbiAgICB0aGlzLmhhbmRsZUxvY2FsVGV4dENoYW5nZSA9IChldmVudCkgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGxvY2FsVGV4dDogZXZlbnQudGFyZ2V0LnZhbHVlIH0pXG4gICAgfVxuICAgIC8vIFRleHRhcmVhIHRvIHJlbW90ZSBjbGlwYm9hcmRcbiAgICB0aGlzLmhhbmRsZVNlbmQgPSAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIGNvbnN0IHsgb25DbGlwYm9hcmRTZW5kIH0gPSB0aGlzLnByb3BzXG4gICAgICBjb25zdCB7IGxvY2FsVGV4dCB9ID0gdGhpcy5zdGF0ZVxuICAgICAgaWYgKG9uQ2xpcGJvYXJkU2VuZCkgb25DbGlwYm9hcmRTZW5kKGxvY2FsVGV4dClcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBsb2NhbFRleHQ6ICcnIH0pXG4gICAgfVxuXG4gICAgLy8gTWVzc2FnZXMgZGVmaW5pdGlvblxuICAgIHRoaXMubWVzc2FnZXMgPSB7XG4gICAgICByZW1vdGU6IHtcbiAgICAgICAgaWQ6ICdyZW1vdGUnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ1JlbW90ZSdcbiAgICAgIH0sXG4gICAgICBsb2NhbDoge1xuICAgICAgICBpZDogJ2xvY2FsJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdMb2NhbCdcbiAgICAgIH0sXG4gICAgICBub3RoaW5nQ29waWVkOiB7XG4gICAgICAgIGlkOiAnbm90aGluZ0NvcGllZCcsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnTm90aGluZyBjb3BpZWQnXG4gICAgICB9LFxuICAgICAgY3VycmVudENsaXBib2FyZEV4cGxhaW5hdGlvbjoge1xuICAgICAgICBpZDogJ2N1cnJlbnRDbGlwYm9hcmRFeHBsYWluYXRpb24nLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ1RoaXMgaXMgdGhlIGN1cnJlbnQgY2xpcGJvYXJkIG9uIHRoZSByZW1vdGUgbWFjaGluZS4gQ29weSB3aGF0IHlvdSBuZWVkJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdNZXNzYWdlIGRpc3BsYXllZCB0byBjb3B5IGxvY2FsIGNsaXBib2FyZCB0byByZW1vdGUgbWFjaGluZSdcbiAgICAgIH0sXG4gICAgICBjbGlja1NlbmRDbGlwYm9hcmQ6IHtcbiAgICAgICAgaWQ6ICdjbGlja1NlbmRDbGlwYm9hcmQnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0NsaWNrIHRvIHNlbmQgdGhlIHRleHQgdG8gdGhlIHJlbW90ZSBjbGlwYm9hcmQuJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdIZWxwIGNsaWNrYWJsZSBtZXNzYWdlIHdoZW4gd3JpdGUgdGV4dCB0byBzZW5kIHRvIHJlbW90ZSBjbGlwYm9hcmQnXG4gICAgICB9LFxuICAgICAgc2VuZDoge1xuICAgICAgICBpZDogJ3NlbmQnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ3NlbmQnXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IHNob3csIHJlbW90ZUNsaXBib2FyZFRleHQgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCB7IGxvYywgbG9jYWxUZXh0IH0gPSB0aGlzLnN0YXRlXG4gICAgY29uc3QgZGVmaW5lTWVzc2FnZSA9IHRoaXMucHJvcHMuaW50bC5mb3JtYXRNZXNzYWdlXG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9J2NsaXBib2FyZC1mb3JtJyA+XG4gICAgICAgIDxNb2RhbFxuICAgICAgICAgIHNob3c9e3Nob3d9XG4gICAgICAgICAga2V5Ym9hcmRcbiAgICAgICAgICBiYWNrZHJvcFxuICAgICAgICAgIG9uSGlkZT17dGhpcy5oYW5kbGVDbG9zZX1cbiAgICAgICAgICBhcmlhLWxhYmVsbGVkYnk9J2NvbnRhaW5lZC1tb2RhbC10aXRsZSc+XG4gICAgICAgICAgPE1vZGFsLkhlYWRlciBjbG9zZUJ1dHRvbj5cbiAgICAgICAgICAgIDxOYXYgaWQ9J2NvbnRhaW5lZC1tb2RhbC10aXRsZScgYnNTdHlsZT0ncGlsbHMnIGp1c3RpZmllZD5cbiAgICAgICAgICAgICAgPE5hdkl0ZW1cbiAgICAgICAgICAgICAgICBhY3RpdmU9e2xvYyA9PT0gJ3JlbW90ZSd9XG4gICAgICAgICAgICAgICAgb25TZWxlY3Q9e3RoaXMuaGFuZGxlU2VsZWN0KCdyZW1vdGUnKX0+XG4gICAgICAgICAgICAgICAgeyBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMucmVtb3RlKSB9XG4gICAgICAgICAgICAgIDwvTmF2SXRlbT5cbiAgICAgICAgICAgICAgPE5hdkl0ZW1cbiAgICAgICAgICAgICAgICBhY3RpdmU9e2xvYyA9PT0gJ2xvY2FsJ31cbiAgICAgICAgICAgICAgICBvblNlbGVjdD17dGhpcy5oYW5kbGVTZWxlY3QoJ2xvY2FsJyl9PlxuICAgICAgICAgICAgICAgIHsgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLmxvY2FsKSB9XG4gICAgICAgICAgICAgIDwvTmF2SXRlbT5cbiAgICAgICAgICAgIDwvTmF2PlxuICAgICAgICAgIDwvTW9kYWwuSGVhZGVyPlxuICAgICAgICAgIDxNb2RhbC5Cb2R5PlxuICAgICAgICAgICAgeyBsb2MgPT09ICdyZW1vdGUnICYmXG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgeyByZW1vdGVDbGlwYm9hcmRUZXh0Lmxlbmd0aCA8PSAwICYmXG4gICAgICAgICAgICAgICAgICBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMubm90aGluZ0NvcGllZClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeyByZW1vdGVDbGlwYm9hcmRUZXh0Lmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgIDxGb3JtQ29udHJvbFxuICAgICAgICAgICAgICAgICAgICB0eXBlPSd0ZXh0YXJlYSdcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Q2xhc3M9J3RleHRhcmVhJ1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU9e3JlbW90ZUNsaXBib2FyZFRleHR9XG4gICAgICAgICAgICAgICAgICAgIG9uRm9jdXM9eyhldmVudCkgPT4gZXZlbnQudGFyZ2V0LnNlbGVjdCgpfSAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB7IGxvYyA9PT0gJ2xvY2FsJyAmJlxuICAgICAgICAgICAgICA8Rm9ybUNvbnRyb2xcbiAgICAgICAgICAgICAgICB0eXBlPSd0ZXh0YXJlYSdcbiAgICAgICAgICAgICAgICBjb21wb25lbnRDbGFzcz0ndGV4dGFyZWEnXG4gICAgICAgICAgICAgICAgdmFsdWU9e2xvY2FsVGV4dH1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5oYW5kbGVMb2NhbFRleHRDaGFuZ2V9XG4gICAgICAgICAgICAgICAgb25Gb2N1cz17KGV2ZW50KSA9PiBldmVudC50YXJnZXQuc2VsZWN0KCl9IC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9Nb2RhbC5Cb2R5PlxuICAgICAgICAgIDxNb2RhbC5Gb290ZXI+XG4gICAgICAgICAgICB7IGxvYyA9PT0gJ3JlbW90ZScgJiZcbiAgICAgICAgICAgICAgPHNtYWxsPlxuICAgICAgICAgICAgICAgIHsgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLmN1cnJlbnRDbGlwYm9hcmRFeHBsYWluYXRpb24pIH1cbiAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHsgbG9jID09PSAnbG9jYWwnICYmXG4gICAgICAgICAgICAgIDxzbWFsbD5cbiAgICAgICAgICAgICAgICB7IGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy5jbGlja1NlbmRDbGlwYm9hcmQpIH1cbiAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHsgbG9jID09PSAnbG9jYWwnICYmXG4gICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPSdzdWJtaXQnXG4gICAgICAgICAgICAgICAgYnNTdHlsZT0ncHJpbWFyeSdcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZVNlbmR9PlxuICAgICAgICAgICAgICAgIHsgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLnNlbmQpIH1cbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9Nb2RhbC5Gb290ZXI+XG4gICAgICAgIDwvTW9kYWw+XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cbn1cblxuQ2xpcGJvYXJkTW9kYWwucHJvcFR5cGVzID0ge1xuICBzaG93OiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgcmVtb3RlQ2xpcGJvYXJkVGV4dDogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgaGFuZGxlQ2xvc2U6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBvbkNsaXBib2FyZFNlbmQ6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBpbnRsOiBSZWFjdC5Qcm9wVHlwZXMub2JqZWN0XG59XG5DbGlwYm9hcmRNb2RhbC5kZWZhdWx0UHJvcHMgPSB7XG4gIHNob3c6IGZhbHNlLFxuICByZW1vdGVDbGlwYm9hcmRUZXh0OiAnJ1xufVxuXG5leHBvcnQgZGVmYXVsdCBpbmplY3RJbnRsKENsaXBib2FyZE1vZGFsKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4J1xuaW1wb3J0IHsgZGVmaW5lTWVzc2FnZXMsIEZvcm1hdHRlZE1lc3NhZ2UgfSBmcm9tICdyZWFjdC1pbnRsJ1xuaW1wb3J0IHtcbiAgQWxlcnQsIFdlbGwsIEJ1dHRvbiwgR2x5cGhpY29uLCBPdmVybGF5VHJpZ2dlciwgVG9vbHRpcFxufSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQgUkZCIGZyb20gJ0BucmF5bmF1ZC9ub3ZuYy9saWIvcmZiJ1xuaW1wb3J0IEtleXN5bWRlZiBmcm9tICdAbnJheW5hdWQvbm92bmMvbGliL2lucHV0L2tleXN5bWRlZidcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnXG5pbXBvcnQgTW9iaWxlRGV0ZWN0IGZyb20gJ21vYmlsZS1kZXRlY3QnXG5pbXBvcnQgeyBzYXZlQXMgfSBmcm9tICdmaWxlc2F2ZXIuanMvRmlsZVNhdmVyJ1xuaW1wb3J0IHRvQmxvYiBmcm9tICdjYW52YXMtdG8tYmxvYidcblxuaW1wb3J0IExvZ2dlciBmcm9tICcuLi8uLi9jb21tb24vbGliL0xvZ2dlcidcbmltcG9ydCB7IFBST1RPIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJ1xuaW1wb3J0IEZha2VXZWJTb2NrZXQgZnJvbSAnLi4vLi4vY29tbW9uL2xpYi9GYWtlV2ViU29ja2V0J1xuXG5pbXBvcnQgeyBzaG93SGVhZGVyLCBoaWRlSGVhZGVyIH0gZnJvbSAnLi4vLi4vYWN0aW9ucy9hcHAnXG5pbXBvcnQge1xuICB1cGRhdGVEaXNwbGF5RGF0YSxcbiAgY29ubmVjdGlvbkRpc3BsYXlSZXF1ZXN0LCBjb25uZWN0aW9uRGlzcGxheVN1Y2Nlc3MsIGNvbm5lY3Rpb25EaXNwbGF5RmFpbHVyZSxcbiAgZGlzY29uZWN0RGlzcGxheSwgZGlzY29ubmVjdGlvbkRpc3BsYXlSZXF1ZXN0LCBkaXNjb25uZWN0aW9uRGlzcGxheVN1Y2Nlc3MsXG4gIGNsZWFyRGlzcGxheUVycm9yXG59IGZyb20gJy4uLy4uL2FjdGlvbnMvZGlzcGxheSdcbmltcG9ydCB7IGdldEFjdGl2ZVNlY3Rpb24sIGdldFNlY3Rpb24gfSBmcm9tICcuLi8uLi9yZWR1Y2Vycy9hcHAnXG5cbi8vIENvbXBvbmVudHNcbmltcG9ydCBPdmVybGF5IGZyb20gJy4uLy4uL2NvbW1vbi9jb21wb25lbnRzL292ZXJsYXknXG5pbXBvcnQgRGlzcGxheUJ1dHRvbnMgZnJvbSAnLi9idXR0b25zJ1xuaW1wb3J0IERpc3BsYXlQYXNzRm9ybSBmcm9tICcuL3Bhc3MtZm9ybSdcbmltcG9ydCBDbGlwYm9hcmRNb2RhbCBmcm9tICcuL2NsaXBib2FyZC1tb2RhbCdcblxuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih7IHNlY3Rpb246ICdEaXNwbGF5IG1haW4nIH0pXG5cbi8vIE1lc3NhZ2VzIGRlZmluaXRpb25zXG5jb25zdCBtZXNzYWdlcyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgbW92ZURvd246IHtcbiAgICBpZDogJ21vdmVEb3duJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ01vdmUgZG93bidcbiAgfSxcbiAgbW92ZVVwOiB7XG4gICAgaWQ6ICdtb3ZlVXAnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnTW92ZSB1cCdcbiAgfSxcbiAgdGFrZVNjcmVlbnNob3Q6IHtcbiAgICBpZDogJ3Rha2VTY3JlZW5zaG90JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1Rha2Ugc2NyZWVuc2hvdCdcbiAgfSxcbiAgZXJyb3I6IHtcbiAgICBpZDogJ2Vycm9yJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0Vycm9yJ1xuICB9LFxuICBkaXNjb25uZWN0ZWRJbmZvOiB7XG4gICAgaWQ6ICdkaXNjb25uZWN0ZWRJbmZvJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1ByZXNzIFxcJ0Nvbm5lY3RcXCcgYnV0dG9uIHRvIGFjY2VzcyB0aGUgcmVtb3RlIGRlc2suJ1xuICB9LFxuICBjb25uZWN0aW5nRG90czoge1xuICAgIGlkOiAnY29ubmVjdGluZ0RvdHMnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnQ29ubmVjdGluZy4uLidcbiAgfSxcbiAgZGlzY29ubmVjdGluZ0RvdHM6IHtcbiAgICBpZDogJ2Rpc2Nvbm5lY3RpbmdEb3RzJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0Rpc2Nvbm5lY3RpbmcuLi4nXG4gIH1cbn0pXG5cbmV4cG9ydCBjbGFzcyBEaXNwbGF5IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgaGVhZGVyOiB0aGlzLnByb3BzLmhlYWRlcixcbiAgICAgIHNob3dQYXNzRm9ybTogZmFsc2UsXG4gICAgICBpc0Z1bGxzY3JlZW46IGZhbHNlLFxuICAgICAgYnV0dG9uc0FsaWdubWVudDogJ3RvcCcsXG4gICAgICBpc01vYmlsZTogZmFsc2UsXG4gICAgICByZW1vdGVDbGlwYm9hcmRUZXh0OiAnJyxcbiAgICAgIHNob3dDbGlwYm9hcmRNb2RhbDogZmFsc2UsXG4gICAgICBidXR0b25zUGFuZWxTbWFsbDogZmFsc2VcbiAgICB9XG5cbiAgICB0aGlzLnJmYiA9IG51bGxcblxuICAgIC8vIEhBQ0s6IFN0b3JlIHRoZSByZWYgdG8gdGhlIG5hdGl2ZSB3ZWJzb2NrZXQgbGlicmFyeSB0byByZXN0b3JlIGl0IGxhdGVyXG4gICAgdGhpcy5uYXRpdmVXZWJTb2NrZXQgPSBXZWJTb2NrZXRcblxuICAgIHRoaXMuY29ubmVjdERpc3BsYXkgPSB0aGlzLmNvbm5lY3REaXNwbGF5LmJpbmQodGhpcylcbiAgICB0aGlzLmRpc2Nvbm5lY3REaXNwbGF5ID0gdGhpcy5kaXNjb25uZWN0RGlzcGxheS5iaW5kKHRoaXMpXG4gICAgdGhpcy5yZXF1ZXN0RnVsbHNjcmVlbiA9IHRoaXMucmVxdWVzdEZ1bGxzY3JlZW4uYmluZCh0aGlzKVxuICAgIHRoaXMuZXhpdEZ1bGxzY3JlZW4gPSB0aGlzLmV4aXRGdWxsc2NyZWVuLmJpbmQodGhpcylcbiAgICB0aGlzLl9vblVwZGF0ZVN0YXRlID0gdGhpcy5fb25VcGRhdGVTdGF0ZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5fb25EaXNjb25uZWN0ZWQgPSB0aGlzLl9vbkRpc2Nvbm5lY3RlZC5iaW5kKHRoaXMpXG4gICAgdGhpcy5faGFuZGxlUmVzaXplID0gdGhpcy5faGFuZGxlUmVzaXplLmJpbmQodGhpcylcbiAgICB0aGlzLl9nZXREaXNwbGF5U2l6ZSA9IHRoaXMuX2dldERpc3BsYXlTaXplLmJpbmQodGhpcylcbiAgICB0aGlzLl9oYW5kbGVQYXNzU3VibWl0ID0gdGhpcy5faGFuZGxlUGFzc1N1Ym1pdC5iaW5kKHRoaXMpXG5cbiAgICB0aGlzLmhhbmRsZVRydWVDb2xvckNsaWNrID0gKHRydWVDb2xvcikgPT5cbiAgICAgIHRoaXMucHJvcHMudXBkYXRlRGlzcGxheURhdGEoeyB0cnVlQ29sb3IgfSlcbiAgICB0aGlzLmhhbmRsZUxvY2FsQ3Vyc29yQ2xpY2sgPSAobG9jYWxDdXJzb3IpID0+XG4gICAgICB0aGlzLnByb3BzLnVwZGF0ZURpc3BsYXlEYXRhKHsgbG9jYWxDdXJzb3IgfSlcbiAgICB0aGlzLmhhbmRsZVNoYXJlZENsaWNrID0gKHNoYXJlZCkgPT5cbiAgICAgIHRoaXMucHJvcHMudXBkYXRlRGlzcGxheURhdGEoeyBzaGFyZWQgfSlcbiAgICB0aGlzLmhhbmRsZVZpZXdPbmx5Q2xpY2sgPSAodmlld09ubHkpID0+XG4gICAgICB0aGlzLnByb3BzLnVwZGF0ZURpc3BsYXlEYXRhKHsgdmlld09ubHkgfSlcbiAgICB0aGlzLmhhbmRsZUZ1bGxTY3JlZW5DbGljayA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgaXNGdWxsc2NyZWVuIH0gPSB0aGlzLnN0YXRlXG4gICAgICBpZiAoaXNGdWxsc2NyZWVuKSB0aGlzLmV4aXRGdWxsc2NyZWVuKClcbiAgICAgIGVsc2UgdGhpcy5yZXF1ZXN0RnVsbHNjcmVlbigpXG4gICAgfVxuXG4gICAgdGhpcy5fY29ubmVjdFJGQiA9IChtb2RlLCBwYXNzKSA9PiB7XG4gICAgICBpZiAodGhpcy5yZmIpIHtcbiAgICAgICAgZ2xvYmFsLldlYlNvY2tldCA9IEZha2VXZWJTb2NrZXQgLy8gSEFDSzogVXNlIGEgY3VzdG9tIGltcGxlbWVudGF0aW9uXG4gICAgICAgIHRoaXMucmZiLmNvbm5lY3QobW9kZSwgNTkwMCwgcGFzcylcbiAgICAgICAgZ2xvYmFsLldlYlNvY2tldCA9IHRoaXMubmF0aXZlV2ViU29ja2V0IC8vIEhBQ0s6IFJlc3RvcmUgaW1wbGVtZW50YXRpb25cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNlbmRLZXkgPSAoLi4ucGFyYW1zKSA9PiB7XG4gICAgICBpZiAodGhpcy5yZmIpIHRoaXMucmZiLnNlbmRLZXkoLi4ucGFyYW1zKVxuICAgIH1cblxuICAgIHRoaXMuY2hlY2tNb2JpbGUgPSAoKSA9PiB7XG4gICAgICBpZiAod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpIHtcbiAgICAgICAgY29uc3QgbWQgPSBuZXcgTW9iaWxlRGV0ZWN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KVxuICAgICAgICBpZiAobWQubW9iaWxlKCkpIHJldHVybiB0aGlzLnNldFN0YXRlKHsgaXNNb2JpbGU6IHRydWUgfSlcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc01vYmlsZTogZmFsc2UgfSlcbiAgICB9XG5cbiAgICB0aGlzLl9vbkNsaXBib2FyZFJlY2VpdmUgPSAocmZiLCB0ZXh0KSA9PiB7XG4gICAgICAvLyBsb2dnZXIubG9nKCdbUkZCXScsICdbQ2xpcGJvYXJkIGluY29taW5nXScsIHRleHQpXG4gICAgICB0aGlzLnNldFN0YXRlKHsgcmVtb3RlQ2xpcGJvYXJkVGV4dDogdGV4dCB9KVxuICAgIH1cblxuICAgIHRoaXMudG9nZ2xlQ2xpcGJvYXJkTW9kYWwgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7IHNob3dDbGlwYm9hcmRNb2RhbCB9ID0gdGhpcy5zdGF0ZVxuICAgICAgaWYgKHNob3dDbGlwYm9hcmRNb2RhbCkgdGhpcy5fZ3JhYklucHV0KClcbiAgICAgIGVsc2UgdGhpcy5fdW5ncmFiSW5wdXQoKVxuICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNob3dDbGlwYm9hcmRNb2RhbDogIXNob3dDbGlwYm9hcmRNb2RhbCB9KVxuICAgIH1cbiAgICB0aGlzLm9uTG9jYWxDbGlwYm9hcmRTZW5kID0gKHRleHQpID0+IHtcbiAgICAgIGlmICh0aGlzLnJmYikgdGhpcy5yZmIuY2xpcGJvYXJkUGFzdGVGcm9tKHRleHQpXG4gICAgfVxuXG4gICAgdGhpcy50YWtlU2NyZWVuc2hvdCA9IChldmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGlzcGxheVJlZikge1xuICAgICAgICB0aGlzLmRpc3BsYXlSZWYudG9CbG9iKChibG9iKSA9PiBzYXZlQXMoYmxvYiwgJ3NjcmVlbnNob3QucG5nJykpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gV2hlbiBub3JtYWwga2V5Ym9hcmQgZXZlbnRzIGFyZSBsZWZ0IHVuY291Z2h0LCB1c2UgdGhlIGlucHV0IGV2ZW50cyBmcm9tXG4gICAgLy8gdGhlIGtleWJvYXJkaW5wdXQgZWxlbWVudCBpbnN0ZWFkIGFuZCBnZW5lcmF0ZSB0aGUgY29ycmVzcG9uZGluZyBrZXkgZXZlbnRzLlxuICAgIC8vIFRoaXMgY29kZSBpcyByZXF1aXJlZCBzaW5jZSBzb21lIGJyb3dzZXJzIG9uIEFuZHJvaWQgYXJlIGluY29uc2lzdGVudCBpblxuICAgIC8vIHNlbmRpbmcga2V5Q29kZXMgaW4gdGhlIG5vcm1hbCBrZXlib2FyZCBldmVudHMgd2hlbiB1c2luZyBvbiBzY3JlZW4ga2V5Ym9hcmRzLlxuICAgIHRoaXMuaGFuZGxlVmlydHVhbEtleWJvYXJkVXNlZCA9ICh2YWx1ZSkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBUT0RPOiBDaGFuZ2Ugb24gbm92bmMgdXBkYXRlXG4gICAgICAgIGNvbnN0IHsga2V5c3ltIH0gPSBLZXlzeW1kZWYubG9va3VwKHZhbHVlLmNoYXJDb2RlQXQoaSkpIHx8IHt9XG4gICAgICAgIGlmIChrZXlzeW0pIHRoaXMucmZiLnNlbmRLZXkoa2V5c3ltKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudG9nZ2xlQnV0dG9uc1BhbmVsU2l6ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBidXR0b25zUGFuZWxTbWFsbDogIXRoaXMuc3RhdGUuYnV0dG9uc1BhbmVsU21hbGwgfSlcbiAgICB9XG5cbiAgICAvLyBIYWNrIHRvIGFsbG93IHRoZSBub1ZOQyBsaWJyYXJ5IHVzZSB0aGUgcGVyc2lzdGVudCB3ZWJzb2NrZXQgY29ubmVjdGlvblxuICAgIGlmICghZ2xvYmFsLk5hdGl2ZVdlYlNvY2tldCkgZ2xvYmFsLk5hdGl2ZVdlYlNvY2tldCA9IEZha2VXZWJTb2NrZXRcblxuICAgIHRoaXMuX3ByZXZlbnRDYW52YXNEZWZhdWx0ID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgIH1cbiAgfVxuXG4gIGdldCBkaXNwbGF5Qm9yZGVyV2lkdGggKCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGlzTW9iaWxlLCBzaG93UGFzc0Zvcm0sIGlzRnVsbHNjcmVlbiwgYnV0dG9uc0FsaWdubWVudCxcbiAgICAgIHJlbW90ZUNsaXBib2FyZFRleHQsIHNob3dDbGlwYm9hcmRNb2RhbCwgYnV0dG9uc1BhbmVsU21hbGxcbiAgICB9ID0gdGhpcy5zdGF0ZVxuICAgIGNvbnN0IHtcbiAgICAgIHNob3csIGlzQWdlbnRDb25uZWN0ZWQsIGlzQWdlbnRBdXRoZW50aWNhdGVkLFxuICAgICAgaXNDb25uZWN0aW5nLCBpc0Rpc2Nvbm5lY3RpbmcsIGlzQ29ubmVjdGVkLCBlcnJvciwgZXJyb3JNZXNzYWdlLFxuICAgICAgdHJ1ZUNvbG9yLCBsb2NhbEN1cnNvciwgc2hhcmVkLCB2aWV3T25seVxuICAgIH0gPSB0aGlzLnByb3BzXG5cbiAgICBjb25zdCBoaWRkZW4gPSAhc2hvdyB8fCAhaXNBZ2VudENvbm5lY3RlZCB8fCAhaXNBZ2VudEF1dGhlbnRpY2F0ZWRcblxuICAgIGNvbnN0IGlzQnV0dG9uc1VwID0gYnV0dG9uc0FsaWdubWVudCA9PT0gJ3RvcCdcbiAgICBjb25zdCBoYW5kbGVNb3ZlQ2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgIGlmIChpc0J1dHRvbnNVcCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgYnV0dG9uc0FsaWdubWVudDogJ2JvdHRvbScgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBidXR0b25zQWxpZ25tZW50OiAndG9wJyB9KVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBtb3ZlQnV0dG9uID0gKFxuICAgICAgPE92ZXJsYXlUcmlnZ2VyXG4gICAgICAgIHBsYWNlbWVudD17IWlzQnV0dG9uc1VwID8gJ3RvcCcgOiAnYm90dG9tJ31cbiAgICAgICAgb3ZlcmxheT17XG4gICAgICAgICAgPFRvb2x0aXAgaWQ9J2Rpc3AtdG9vbHRpcC1tb3ZlLWJ1dHRvbnMnPlxuICAgICAgICAgICAgeyBpc0J1dHRvbnNVcCAmJiA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMubW92ZURvd259IC8+IH1cbiAgICAgICAgICAgIHsgIWlzQnV0dG9uc1VwICYmIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5tb3ZlVXB9IC8+IH1cbiAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgIH0+XG4gICAgICAgIDxCdXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9J3B1bGwtcmlnaHQnXG4gICAgICAgICAgb25DbGljaz17aGFuZGxlTW92ZUNsaWNrfT5cbiAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPXtpc0J1dHRvbnNVcCA/ICdhcnJvdy1kb3duJyA6ICdhcnJvdy11cCd9IC8+XG4gICAgICAgIDwvQnV0dG9uPlxuICAgICAgPC9PdmVybGF5VHJpZ2dlcj5cbiAgICApXG5cbiAgICBjb25zdCBzY3JlZW5zaG90QnV0dG9uID0gKFxuICAgICAgPE92ZXJsYXlUcmlnZ2VyXG4gICAgICAgIHBsYWNlbWVudD17IWlzQnV0dG9uc1VwID8gJ3RvcCcgOiAnYm90dG9tJ31cbiAgICAgICAgb3ZlcmxheT17XG4gICAgICAgICAgPFRvb2x0aXAgaWQ9J2Rpc3AtdG9vbHRpcC1zY3ItYnV0dG9ucyc+XG4gICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMudGFrZVNjcmVlbnNob3R9IC8+XG4gICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICB9PlxuICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgY2xhc3NOYW1lPSdwdWxsLXJpZ2h0J1xuICAgICAgICAgIG9uQ2xpY2s9e3RoaXMudGFrZVNjcmVlbnNob3R9PlxuICAgICAgICAgIDxHbHlwaGljb24gZ2x5cGg9J2NhbWVyYScgLz5cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICA8L092ZXJsYXlUcmlnZ2VyPlxuICAgIClcblxuICAgIGNvbnN0IGJ1dHRvbnMgPSAoXG4gICAgICA8RGlzcGxheUJ1dHRvbnNcbiAgICAgICAgaXNNb2JpbGU9e2lzTW9iaWxlfVxuICAgICAgICBpc0Nvbm5lY3Rpbmc9e2lzQ29ubmVjdGluZ31cbiAgICAgICAgaXNEaXNjb25uZWN0aW5nPXtpc0Rpc2Nvbm5lY3Rpbmd9XG4gICAgICAgIGlzQ29ubmVjdGVkPXtpc0Nvbm5lY3RlZH1cbiAgICAgICAgaGFuZGxlQ29ubmVjdENsaWNrPXt0aGlzLmNvbm5lY3REaXNwbGF5fVxuICAgICAgICBoYW5kbGVEaXNjb25uZWN0Q2xpY2s9e3RoaXMuZGlzY29ubmVjdERpc3BsYXl9XG4gICAgICAgIGlzRnVsbHNjcmVlbj17aXNGdWxsc2NyZWVufVxuICAgICAgICBzaG93RnVsbHNjcmVlbkJ0blxuICAgICAgICBoYW5kbGVGdWxsU2NyZWVuQ2xpY2s9e3RoaXMuaGFuZGxlRnVsbFNjcmVlbkNsaWNrfVxuICAgICAgICB0cnVlQ29sb3I9e3RydWVDb2xvcn1cbiAgICAgICAgaGFuZGxlVHJ1ZUNvbG9yQ2xpY2s9e3RoaXMuaGFuZGxlVHJ1ZUNvbG9yQ2xpY2t9XG4gICAgICAgIGxvY2FsQ3Vyc29yPXtsb2NhbEN1cnNvcn1cbiAgICAgICAgaGFuZGxlTG9jYWxDdXJzb3JDbGljaz17dGhpcy5oYW5kbGVMb2NhbEN1cnNvckNsaWNrfVxuICAgICAgICBzaGFyZWQ9e3NoYXJlZH1cbiAgICAgICAgaGFuZGxlU2hhcmVkQ2xpY2s9e3RoaXMuaGFuZGxlU2hhcmVkQ2xpY2t9XG4gICAgICAgIHZpZXdPbmx5PXt2aWV3T25seX1cbiAgICAgICAgaGFuZGxlVmlld09ubHlDbGljaz17dGhpcy5oYW5kbGVWaWV3T25seUNsaWNrfVxuICAgICAgICBjbGlwYm9hcmRcbiAgICAgICAgaGFuZGxlQ2xpcGJvYXJkQ2xpY2s9e3RoaXMudG9nZ2xlQ2xpcGJvYXJkTW9kYWx9XG4gICAgICAgIHNlbmRLZXk9e3RoaXMuc2VuZEtleX1cbiAgICAgICAgdG9nZ2xlUGFuZWxTaXplXG4gICAgICAgIGhhbmRsZVBhbmVsU2l6ZUNsaWNrPXt0aGlzLnRvZ2dsZUJ1dHRvbnNQYW5lbFNpemV9XG4gICAgICAgIHBhbmVsU21hbGw9e2J1dHRvbnNQYW5lbFNtYWxsfVxuICAgICAgICB0b29sdGlwUGxhY2VtZW50PXshaXNCdXR0b25zVXAgPyAndG9wJyA6ICdib3R0b20nfVxuICAgICAgICBvblZpcnR1YWxLZXlib2FyZFVzZWQ9e3RoaXMuaGFuZGxlVmlydHVhbEtleWJvYXJkVXNlZH0+XG4gICAgICAgIHsgaXNDb25uZWN0ZWQgJiYgc2NyZWVuc2hvdEJ1dHRvbiB9XG4gICAgICAgIHsgaXNGdWxsc2NyZWVuICYmIG1vdmVCdXR0b24gfVxuICAgICAgPC9EaXNwbGF5QnV0dG9ucz5cbiAgICApXG4gICAgY29uc3QgcGFuZWwgPSAoYnV0dG9ucykgPT4gKFxuICAgICAgPFdlbGwgYnNTaXplPSdzbWFsbCcgc3R5bGU9e3sgbWFyZ2luQm90dG9tOiAnMCcgfX0+XG4gICAgICAgIHsgYnV0dG9ucyB9XG4gICAgICA8L1dlbGw+XG4gICAgKVxuXG4gICAgY29uc3QgZGlzcGxheVN0eWxlID0gKGlzRnVsbHNjcmVlbilcbiAgICAgID8ge1xuICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgdG9wOiAnMCcsXG4gICAgICAgIGJvdHRvbTogJzAnLFxuICAgICAgICBsZWZ0OiAnMCcsXG4gICAgICAgIHJpZ2h0OiAnMCcsXG4gICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInXG4gICAgICB9XG4gICAgICA6IHt9XG4gICAgY29uc3QgY1N0eWxlID0gKGlzQ29ubmVjdGVkICYmICFpc0Rpc2Nvbm5lY3RpbmcgJiYgdGhpcy5kaXNwbGF5Qm9yZGVyV2lkdGggPiAwKVxuICAgICAgPyB7XG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLCAvLyBUbyBmaXQgdGhlIGNvbnRlbnQgc2l6ZVxuICAgICAgICBmb250U2l6ZTogJzBweCcsIC8vIFRyaWNrIHRvIGF2b2lkIHRoZSBib3R0b20gc3BhY2UgZnJvbSBpbmxpbmUtYmxvY2tcbiAgICAgICAgYm9yZGVyOiBgJHt0aGlzLmRpc3BsYXlCb3JkZXJXaWR0aH1weCBzb2xpZCBibGFja2BcbiAgICAgIH1cbiAgICAgIDoge31cblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT17Y2xhc3NuYW1lcygnZGlzcGxheS1tYWluJywgeyAnaGlkZGVuJzogaGlkZGVuIH0pfVxuICAgICAgICByZWY9eyhyZWYpID0+IHsgdGhpcy5tYWluRGl2UmVmID0gcmVmIH19PlxuICAgICAgICB7IHNob3dQYXNzRm9ybSAmJlxuICAgICAgICAgIDxEaXNwbGF5UGFzc0Zvcm0gc2hvdyBoYW5kbGVTdWJtaXQ9e3RoaXMuX2hhbmRsZVBhc3NTdWJtaXR9IC8+XG4gICAgICAgIH1cbiAgICAgICAgeyAhaXNGdWxsc2NyZWVuICYmIGJ1dHRvbnMgfVxuICAgICAgICB7ICFpc0Z1bGxzY3JlZW4gJiYgPGJyIC8+IH1cbiAgICAgICAgeyBpc0Z1bGxzY3JlZW4gJiZcbiAgICAgICAgICA8T3ZlcmxheSBhbGlnbj17aXNCdXR0b25zVXAgPyAndG9wJyA6ICdib3R0b20nfT5cbiAgICAgICAgICAgIHsgcGFuZWwoYnV0dG9ucykgfVxuICAgICAgICAgIDwvT3ZlcmxheT5cbiAgICAgICAgfVxuICAgICAgICB7IGVycm9yICYmXG4gICAgICAgICAgPEFsZXJ0IGJzU3R5bGU9J2Rhbmdlcicgb25EaXNtaXNzPXt0aGlzLnByb3BzLmNsZWFyRGlzcGxheUVycm9yfT5cbiAgICAgICAgICAgIHsgZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDAgJiYgZXJyb3JNZXNzYWdlIH1cbiAgICAgICAgICAgIHsgZXJyb3JNZXNzYWdlLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMuZXJyb3J9IC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9BbGVydD5cbiAgICAgICAgfVxuICAgICAgICB7ICghaXNDb25uZWN0ZWQgfHwgKGlzQ29ubmVjdGVkICYmIGlzRGlzY29ubmVjdGluZykpICYmXG4gICAgICAgICAgPEFsZXJ0PlxuICAgICAgICAgICAgeyAhaXNDb25uZWN0aW5nICYmICFpc0Rpc2Nvbm5lY3RpbmcgJiZcbiAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLmRpc2Nvbm5lY3RlZEluZm99IC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB7IGlzQ29ubmVjdGluZyAmJlxuICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMuY29ubmVjdGluZ0RvdHN9IC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB7IGlzRGlzY29ubmVjdGluZyAmJlxuICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMuZGlzY29ubmVjdGluZ0RvdHN9IC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9BbGVydD5cbiAgICAgICAgfVxuICAgICAgICA8Q2xpcGJvYXJkTW9kYWxcbiAgICAgICAgICBzaG93PXtzaG93Q2xpcGJvYXJkTW9kYWx9XG4gICAgICAgICAgcmVtb3RlQ2xpcGJvYXJkVGV4dD17cmVtb3RlQ2xpcGJvYXJkVGV4dH1cbiAgICAgICAgICBoYW5kbGVDbG9zZT17dGhpcy50b2dnbGVDbGlwYm9hcmRNb2RhbH1cbiAgICAgICAgICBvbkNsaXBib2FyZFNlbmQ9e3RoaXMub25Mb2NhbENsaXBib2FyZFNlbmR9IC8+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBpZD0nZGlzcGxheS1jb250YWluZXInXG4gICAgICAgICAgY2xhc3NOYW1lPSd0ZXh0LWNlbnRlcidcbiAgICAgICAgICBzdHlsZT17ZGlzcGxheVN0eWxlfT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPXtjU3R5bGV9PlxuICAgICAgICAgICAgPGNhbnZhc1xuICAgICAgICAgICAgICBvbkNvbnRleHRNZW51PXt0aGlzLl9wcmV2ZW50Q2FudmFzRGVmYXVsdH1cbiAgICAgICAgICAgICAgcmVmPXsocmVmKSA9PiB7IHRoaXMuZGlzcGxheVJlZiA9IHJlZiB9fSAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICB0aGlzLmNoZWNrTW9iaWxlKClcbiAgICBpZiAod2luZG93KSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5faGFuZGxlUmVzaXplKVxuXG4gICAgLy8gQWRkIHRoZSB0b0Jsb2IgcG9seWZpbGxcbiAgICBpZiAoIXRvQmxvYi5zdXBwb3J0ZWQpIHRvQmxvYi5pbml0KClcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVcGRhdGUgKG5leHRQcm9wcywgbmV4dFN0YXRlKSB7XG4gICAgY29uc3Qgc2hvdyA9IG5leHRQcm9wcyAmJiBuZXh0UHJvcHMuc2hvdyAmJlxuICAgICAgbmV4dFByb3BzLmlzQWdlbnRDb25uZWN0ZWQgJiYgbmV4dFByb3BzLmlzQWdlbnRBdXRoZW50aWNhdGVkXG4gICAgY29uc3QgcHJldlNob3cgPSB0aGlzLnByb3BzLnNob3cgJiZcbiAgICAgIHRoaXMucHJvcHMuaXNBZ2VudENvbm5lY3RlZCAmJiB0aGlzLnByb3BzLmlzQWdlbnRBdXRoZW50aWNhdGVkXG4gICAgLy8gV2lsbCBiZSBzaG93IHdoZW4gdXBkYXRlZCwgc28gdXBkYXRlIHRoZSBoZWFkZXIgdmFsdWVcbiAgICBpZiAoc2hvdyAmJiAhcHJldlNob3cpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBoZWFkZXI6IHRoaXMucHJvcHMuaGVhZGVyIH0pXG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlIChwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xuICAgIGNvbnN0IHByZXZTaG93ID0gcHJldlByb3BzICYmIHByZXZQcm9wcy5zaG93ICYmXG4gICAgICBwcmV2UHJvcHMuaXNBZ2VudENvbm5lY3RlZCAmJiBwcmV2UHJvcHMuaXNBZ2VudEF1dGhlbnRpY2F0ZWRcbiAgICBjb25zdCBzaG93ID0gdGhpcy5wcm9wcy5zaG93ICYmXG4gICAgICB0aGlzLnByb3BzLmlzQWdlbnRDb25uZWN0ZWQgJiYgdGhpcy5wcm9wcy5pc0FnZW50QXV0aGVudGljYXRlZFxuXG4gICAgaWYgKHByZXZTdGF0ZS5pc0Z1bGxzY3JlZW4gIT09IHRoaXMuc3RhdGUuaXNGdWxsc2NyZWVuKSB0aGlzLl9oYW5kbGVSZXNpemUoKVxuXG4gICAgaWYgKHNob3cgJiYgIXByZXZTaG93KSB7XG4gICAgICAvLyBTb2Z0IG1vdW50XG4gICAgICB0aGlzLl9ncmFiSW5wdXQoKVxuICAgICAgLy8gQWRkIHRoZSByZXNpemUgbGlzdGVuZXJzXG4gICAgICBpZiAod2luZG93KSB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5faGFuZGxlUmVzaXplKVxuICAgICAgLy8gUmVzaXplIGV2ZXJ5IHRpbWUgdGhlIHVzZXIgZW50ZXIgdGhlIHNlY3Rpb24gKHRoZSBzaXplIG1heSBoYXZlIGNoYW5nZWQpXG4gICAgICB0aGlzLl9oYW5kbGVSZXNpemUoKVxuICAgIH0gZWxzZSBpZiAoIXNob3cgJiYgcHJldlNob3cpIHtcbiAgICAgIC8vIFNvZnQgdW5tb3VudFxuICAgICAgaWYgKHRoaXMucHJvcHMuc2hvd0hlYWRlciAmJiB0aGlzLnN0YXRlLmhlYWRlcikgdGhpcy5wcm9wcy5zaG93SGVhZGVyKClcbiAgICAgIHRoaXMuX3VuZ3JhYklucHV0KClcbiAgICAgIC8vIFJlbW92ZSB0aGUgcmVzaXplIGxpc3RlbmVyc1xuICAgICAgaWYgKHdpbmRvdykgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX2hhbmRsZVJlc2l6ZSlcbiAgICB9XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCAoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2hvd0hlYWRlciAmJiB0aGlzLnN0YXRlLmhlYWRlcikgdGhpcy5wcm9wcy5zaG93SGVhZGVyKClcbiAgICBpZiAod2luZG93KSB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5faGFuZGxlUmVzaXplKVxuXG4gICAgaWYgKHRoaXMucmZiKSB0aGlzLmRpc2Nvbm5lY3REaXNwbGF5KClcblxuICAgIHRoaXMuX2NsZWFyVGltZXIoKVxuICB9XG5cbiAgX2dyYWJJbnB1dCAoKSB7XG4gICAgaWYgKHRoaXMucmZiKSB7XG4gICAgICBpZiAodGhpcy5yZmIuZ2V0X2tleWJvYXJkKSB0aGlzLnJmYi5nZXRfa2V5Ym9hcmQoKS5ncmFiKClcbiAgICAgIGlmICh0aGlzLnJmYi5nZXRfbW91c2UpIHRoaXMucmZiLmdldF9tb3VzZSgpLmdyYWIoKVxuICAgIH1cbiAgfVxuXG4gIF91bmdyYWJJbnB1dCAoKSB7XG4gICAgaWYgKHRoaXMucmZiKSB7XG4gICAgICBpZiAodGhpcy5yZmIuZ2V0X2tleWJvYXJkKSB0aGlzLnJmYi5nZXRfa2V5Ym9hcmQoKS51bmdyYWIoKVxuICAgICAgaWYgKHRoaXMucmZiLmdldF9tb3VzZSkgdGhpcy5yZmIuZ2V0X21vdXNlKCkudW5ncmFiKClcbiAgICB9XG4gIH1cblxuICBfaW5pdFRpbWVyIChjYWxsYmFjaywgc2Vjb25kcyA9IDEwKSB7XG4gICAgdGhpcy5fY2xlYXJUaW1lcigpXG4gICAgdGhpcy5fdGltZXJSZWYgPSBzZXRUaW1lb3V0KGNhbGxiYWNrLmJpbmQodGhpcyksIHNlY29uZHMgKiAxMDAwKVxuICB9XG5cbiAgX2NsZWFyVGltZXIgKCkge1xuICAgIGlmICh0aGlzLl90aW1lclJlZikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyUmVmKVxuICAgICAgdGhpcy5fdGltZXJSZWYgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgX2hhbmRsZVBhc3NTdWJtaXQgKHBhc3MpIHtcbiAgICB0aGlzLnNldFN0YXRlKHsgc2hvd1Bhc3NGb3JtOiBmYWxzZSB9KVxuICAgIC8vIFBlcmZvcm0gYSByZWFsIGNvbm5lY3Rpb25cbiAgICAvLyBIYWNrIHRvIHBhc3MgdGhlIG1vZGUgdG8gdGhlIEZha2VXZWJTb2NrZXRcbiAgICB0aGlzLl9jb25uZWN0UkZCKFBST1RPLkRJU1BMQVksIHBhc3MpXG4gICAgdGhpcy5faW5pdFRpbWVyKHRoaXMuZGlzY29ubmVjdERpc3BsYXkpXG4gIH1cblxuICBfZ2V0RGlzcGxheVNpemUgKCkge1xuICAgIGNvbnN0IHsgaXNGdWxsc2NyZWVuIH0gPSB0aGlzLnN0YXRlXG5cbiAgICBpZiAoaXNGdWxsc2NyZWVuKSB7XG4gICAgICBjb25zdCB3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIHx8XG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCB8fFxuICAgICAgICBkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoXG4gICAgICBjb25zdCBoZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgfHxcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCB8fFxuICAgICAgICBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodFxuICAgICAgcmV0dXJuIFt3aWR0aCwgaGVpZ2h0XVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBoZWlnaHRXaW5kb3cgPSBOdW1iZXIuaXNOYU4od2luZG93LmlubmVySGVpZ2h0KVxuICAgICAgICA/IHdpbmRvdy5jbGllbnRIZWlnaHRcbiAgICAgICAgOiB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgICAgIGNvbnN0IGhlaWdodFRvVG9wID0gdGhpcy5kaXNwbGF5UmVmLm9mZnNldFRvcFxuICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLm1haW5EaXZSZWYub2Zmc2V0V2lkdGhcbiAgICAgIGNvbnN0IGhlaWdodCA9IChoZWlnaHRXaW5kb3cgLSBoZWlnaHRUb1RvcCAtIDEwKVxuICAgICAgcmV0dXJuIFt3aWR0aCwgaGVpZ2h0XVxuICAgIH1cbiAgfVxuXG4gIF9oYW5kbGVSZXNpemUgKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMucHJvcHMuaXNDb25uZWN0ZWQgJiYgdGhpcy5yZmIpIHtcbiAgICAgIGNvbnN0IFsgd2lkdGgsIGhlaWdodCBdID0gdGhpcy5fZ2V0RGlzcGxheVNpemUoKVxuICAgICAgdGhpcy5yZmIuZ2V0X2Rpc3BsYXkoKS5hdXRvc2NhbGUod2lkdGgsIGhlaWdodCwgdHJ1ZSlcbiAgICB9XG4gIH1cblxuICByZXF1ZXN0RnVsbHNjcmVlbiAoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuaGlkZUhlYWRlcikgdGhpcy5wcm9wcy5oaWRlSGVhZGVyKClcbiAgICB0aGlzLnNldFN0YXRlKHsgaXNGdWxsc2NyZWVuOiB0cnVlIH0pXG4gIH1cblxuICBleGl0RnVsbHNjcmVlbiAoKSB7XG4gICAgaWYgKHRoaXMucHJvcHMuc2hvd0hlYWRlciAmJiB0aGlzLnN0YXRlLmhlYWRlcikgdGhpcy5wcm9wcy5zaG93SGVhZGVyKClcbiAgICB0aGlzLnNldFN0YXRlKHsgaXNGdWxsc2NyZWVuOiBmYWxzZSB9KVxuICB9XG5cbiAgX29uVXBkYXRlU3RhdGUgKHJmYiwgc3RhdGUsIG9sZHN0YXRlKSB7XG4gICAgbG9nZ2VyLmxvZygnW1JGQl0nLCAnc3RhdGU6Jywgc3RhdGUsICdvbGQgc3RhdGU6Jywgb2xkc3RhdGUpXG5cbiAgICBpZiAoc3RhdGUgPT09ICdjb25uZWN0Jykge1xuICAgICAgdGhpcy5wcm9wcy5jb25uZWN0aW9uRGlzcGxheVJlcXVlc3QoKVxuICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09ICdjb25uZWN0ZWQnKSB7XG4gICAgICB0aGlzLl9jbGVhclRpbWVyKClcbiAgICAgIHRoaXMucHJvcHMuY29ubmVjdGlvbkRpc3BsYXlTdWNjZXNzKClcbiAgICAgIHRoaXMuX2hhbmRsZVJlc2l6ZSgpXG4gICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gJ2Rpc2Nvbm5lY3QnKSB7XG4gICAgICB0aGlzLnByb3BzLmRpc2Nvbm5lY3Rpb25EaXNwbGF5UmVxdWVzdCgpXG4gICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gJ2Rpc2Nvbm5lY3RlZCcpIHtcbiAgICAgIHRoaXMuZXhpdEZ1bGxzY3JlZW4oKVxuICAgICAgdGhpcy5wcm9wcy5kaXNjb25uZWN0aW9uRGlzcGxheVN1Y2Nlc3MoKVxuICAgIH1cbiAgfVxuXG4gIF9vbkRpc2Nvbm5lY3RlZCAocmZiLCByZWFzb24pIHtcbiAgICBpZiAocmVhc29uICYmIHJlYXNvbi5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcignVk5DIGVycm9yJylcbiAgICAgIGVycm9yLnJlc3BvbnNlID0geyBjb2RlOiA1MDAsIHJlYXNvbiB9XG4gICAgICB0aGlzLnByb3BzLmNvbm5lY3Rpb25EaXNwbGF5RmFpbHVyZShlcnJvcilcbiAgICB9XG4gIH1cblxuICBjb25uZWN0RGlzcGxheSAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgdHJ1ZUNvbG9yLCBsb2NhbEN1cnNvciwgc2hhcmVkLCB2aWV3T25seVxuICAgIH0gPSB0aGlzLnByb3BzXG5cbiAgICB0aGlzLnJmYiA9IG5ldyBSRkIoe1xuICAgICAgdGFyZ2V0OiB0aGlzLmRpc3BsYXlSZWYsXG4gICAgICB3c1Byb3RvY29sczogWydiaW5hcnknXSxcbiAgICAgIHRydWVfY29sb3I6IHRydWVDb2xvcixcbiAgICAgIGxvY2FsX2N1cnNvcjogbG9jYWxDdXJzb3IsXG4gICAgICBzaGFyZWQ6IHNoYXJlZCxcbiAgICAgIHZpZXdfb25seTogdmlld09ubHksXG4gICAgICB2aWV3cG9ydERyYWc6IGZhbHNlLFxuICAgICAgb25VcGRhdGVTdGF0ZTogdGhpcy5fb25VcGRhdGVTdGF0ZSxcbiAgICAgIG9uRGlzY29ubmVjdGVkOiB0aGlzLl9vbkRpc2Nvbm5lY3RlZCxcbiAgICAgIG9uQ2xpcGJvYXJkOiB0aGlzLl9vbkNsaXBib2FyZFJlY2VpdmUsXG4gICAgICBvblBhc3N3b3JkUmVxdWlyZWQ6IChyZmIpID0+IGxvZ2dlci5sb2coJ1tSRkJdJywgJ1Bhc3N3b3JkIHJlcXVpcmVkJylcbiAgICB9KVxuXG4gICAgLy8gSGFjayB0byBwYXNzIHRoZSBtb2RlIHRvIHRoZSBGYWtlV2ViU29ja2V0XG4gICAgdGhpcy5fY29ubmVjdFJGQihQUk9UTy5ESVNQTEFZKVxuICB9XG5cbiAgZGlzY29ubmVjdERpc3BsYXkgKCkge1xuICAgIHRoaXMucHJvcHMuZGlzY29uZWN0RGlzcGxheSgpXG4gICAgaWYgKHRoaXMucmZiICYmIHRoaXMucmZiLl9yZmJfY29ubmVjdGlvbl9zdGF0ZSAhPT0gJ2Rpc2Nvbm5lY3RlZCcpIHtcbiAgICAgIHRoaXMucmZiLmRpc2Nvbm5lY3QoKVxuICAgICAgLy8gSEFDSzogVG8gaGlkZSB0aGUgY2FudmFzIHNpbmNlIHRoZSBjbGVhclJlY3QgZnVuY3Rpb25cbiAgICAgIC8vIGNhbGxlZCBpbnNpZGUgdGhpcy5yZmIuZGlzY29ubmVjdCgpIGRvZXMgbm90IHdvcmtcbiAgICAgIHRoaXMuZGlzcGxheVJlZi5oZWlnaHQgPSAwXG4gICAgfVxuICB9XG59XG5cbkRpc3BsYXkucHJvcFR5cGVzID0ge1xuICBzaG93OiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaGVhZGVyOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbC5pc1JlcXVpcmVkLFxuICBpc0FnZW50Q29ubmVjdGVkOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaXNBZ2VudEF1dGhlbnRpY2F0ZWQ6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuXG4gIGlzQ29ubmVjdGluZzogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGlzRGlzY29ubmVjdGluZzogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGlzQ29ubmVjdGVkOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgZXJyb3I6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBlcnJvck1lc3NhZ2U6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG5cbiAgdHJ1ZUNvbG9yOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgbG9jYWxDdXJzb3I6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBzaGFyZWQ6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICB2aWV3T25seTogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG5cbiAgdXBkYXRlRGlzcGxheURhdGE6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGNvbm5lY3Rpb25EaXNwbGF5UmVxdWVzdDogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgY29ubmVjdGlvbkRpc3BsYXlTdWNjZXNzOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBjb25uZWN0aW9uRGlzcGxheUZhaWx1cmU6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGRpc2NvbmVjdERpc3BsYXk6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGRpc2Nvbm5lY3Rpb25EaXNwbGF5UmVxdWVzdDogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgZGlzY29ubmVjdGlvbkRpc3BsYXlTdWNjZXNzOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBjbGVhckRpc3BsYXlFcnJvcjogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgc2hvd0hlYWRlcjogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgaGlkZUhlYWRlcjogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxufVxuRGlzcGxheS5kZWZhdWx0UHJvcHMgPSB7XG4gIHNob3c6IGZhbHNlLFxuICBpc0FnZW50Q29ubmVjdGVkOiBmYWxzZSxcbiAgaXNBZ2VudEF1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxuXG4gIGlzQ29ubmVjdGluZzogZmFsc2UsXG4gIGlzRGlzY29ubmVjdGluZzogZmFsc2UsXG4gIGlzQ29ubmVjdGVkOiBmYWxzZSxcbiAgZXJyb3I6IGZhbHNlLFxuICBlcnJvck1lc3NhZ2U6ICcnLFxuXG4gIHRydWVDb2xvcjogdHJ1ZSxcbiAgbG9jYWxDdXJzb3I6IHRydWUsXG4gIHNoYXJlZDogdHJ1ZSxcbiAgdmlld09ubHk6IGZhbHNlXG59XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IGFwcCwgYWdlbnQsIGRpc3BsYXkgfSkgPT4ge1xuICBjb25zdCBhY3RpdmVTZWN0aW9uID0gZ2V0QWN0aXZlU2VjdGlvbihhcHApXG4gIGNvbnN0IGRpc3BsYXlTZWN0aW9uID0gZ2V0U2VjdGlvbihhcHAsIGFjdGl2ZVNlY3Rpb24pXG4gIGNvbnN0IHsgc2hvd0hlYWRlcjogaGVhZGVyIH0gPSBhcHBcbiAgY29uc3Qge1xuICAgIGlzQ29ubmVjdGVkOiBpc0FnZW50Q29ubmVjdGVkLCBpc0F1dGhlbnRpY2F0ZWQ6IGlzQWdlbnRBdXRoZW50aWNhdGVkXG4gIH0gPSBhZ2VudFxuICBjb25zdCB7XG4gICAgaXNDb25uZWN0aW5nLCBpc0Rpc2Nvbm5lY3RpbmcsIGlzQ29ubmVjdGVkLFxuICAgIGVycm9yLCBlcnJvck1lc3NhZ2UsXG4gICAgdHJ1ZUNvbG9yLCBsb2NhbEN1cnNvciwgc2hhcmVkLCB2aWV3T25seSwgd2lsbE5lZWRQYXNzLCBzaG93UGFzc0Zvcm1cbiAgfSA9IGRpc3BsYXlcblxuICByZXR1cm4ge1xuICAgIC8vIEFwcFxuICAgIHNob3c6IGFjdGl2ZVNlY3Rpb24gPT09ICdkaXNwbGF5JyAmJiBkaXNwbGF5U2VjdGlvbi5hbGxvdyxcbiAgICBoZWFkZXIsXG4gICAgLy8gQWdlbnRcbiAgICBpc0FnZW50Q29ubmVjdGVkLFxuICAgIGlzQWdlbnRBdXRoZW50aWNhdGVkLFxuICAgIC8vIERpc3BsYXlcbiAgICBpc0Nvbm5lY3RpbmcsXG4gICAgaXNEaXNjb25uZWN0aW5nLFxuICAgIGlzQ29ubmVjdGVkLFxuICAgIGVycm9yLFxuICAgIGVycm9yTWVzc2FnZSxcbiAgICB0cnVlQ29sb3IsXG4gICAgbG9jYWxDdXJzb3IsXG4gICAgc2hhcmVkLFxuICAgIHZpZXdPbmx5LFxuICAgIHdpbGxOZWVkUGFzcyxcbiAgICBzaG93UGFzc0Zvcm1cbiAgfVxufVxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gKGRpc3BhdGNoKSA9PiB7XG4gIHJldHVybiB7XG4gICAgdXBkYXRlRGlzcGxheURhdGE6IChkYXRhKSA9PiBkaXNwYXRjaCh1cGRhdGVEaXNwbGF5RGF0YShkYXRhKSksXG4gICAgY29ubmVjdGlvbkRpc3BsYXlSZXF1ZXN0OiAoKSA9PiBkaXNwYXRjaChjb25uZWN0aW9uRGlzcGxheVJlcXVlc3QoKSksXG4gICAgY29ubmVjdGlvbkRpc3BsYXlTdWNjZXNzOiAoKSA9PiBkaXNwYXRjaChjb25uZWN0aW9uRGlzcGxheVN1Y2Nlc3MoKSksXG4gICAgY29ubmVjdGlvbkRpc3BsYXlGYWlsdXJlOiAoZXJyKSA9PiBkaXNwYXRjaChjb25uZWN0aW9uRGlzcGxheUZhaWx1cmUoZXJyKSksXG4gICAgZGlzY29uZWN0RGlzcGxheTogKCkgPT4gZGlzcGF0Y2goZGlzY29uZWN0RGlzcGxheSgpKSxcbiAgICBkaXNjb25uZWN0aW9uRGlzcGxheVJlcXVlc3Q6ICgpID0+IGRpc3BhdGNoKGRpc2Nvbm5lY3Rpb25EaXNwbGF5UmVxdWVzdCgpKSxcbiAgICBkaXNjb25uZWN0aW9uRGlzcGxheVN1Y2Nlc3M6ICgpID0+IGRpc3BhdGNoKGRpc2Nvbm5lY3Rpb25EaXNwbGF5U3VjY2VzcygpKSxcbiAgICBjbGVhckRpc3BsYXlFcnJvcjogKCkgPT4gZGlzcGF0Y2goY2xlYXJEaXNwbGF5RXJyb3IoKSksXG4gICAgc2hvd0hlYWRlcjogKCkgPT4gZGlzcGF0Y2goc2hvd0hlYWRlcigpKSxcbiAgICBoaWRlSGVhZGVyOiAoKSA9PiBkaXNwYXRjaChoaWRlSGVhZGVyKCkpXG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMpKERpc3BsYXkpXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBCdXR0b24sIEdseXBoaWNvbiwgT3ZlcmxheVRyaWdnZXIsIFRvb2x0aXAgfSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQgeyBkZWZpbmVNZXNzYWdlcywgRm9ybWF0dGVkTWVzc2FnZSB9IGZyb20gJ3JlYWN0LWludGwnXG5cbi8vIE1lc3NhZ2VzIGRlZmluaXRpb25zXG5jb25zdCBtZXNzYWdlcyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAga2V5Ym9hcmQ6IHtcbiAgICBpZDogJ2tleWJvYXJkJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0tleWJvYXJkJ1xuICB9XG59KVxuXG5jbGFzcyBLZXlib2FyZEJ1dHRvbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGZvY3VzZWQ6IGZhbHNlXG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVGb2N1cyA9IChlKSA9PiB0aGlzLnNldFN0YXRlKHsgZm9jdXNlZDogdHJ1ZSB9KVxuICAgIHRoaXMuaGFuZGxlQmx1ciA9IChlKSA9PiB0aGlzLnNldFN0YXRlKHsgZm9jdXNlZDogZmFsc2UgfSlcblxuICAgIHRoaXMuc2hvd1ZpcnR1YWxLZXlib2FyZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gdGhpcy5yZWZzLmlucHV0XG4gICAgICBpZiAoIXRoaXMuc3RhdGUuZm9jdXNlZCkge1xuICAgICAgICBpbnB1dC5mb2N1cygpXG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBsID0gaW5wdXQudmFsdWUubGVuZ3RoXG4gICAgICAgICAgLy8gTW92ZSB0aGUgY2FyZXQgdG8gdGhlIGVuZFxuICAgICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKGwsIGwpXG4gICAgICAgIH0gY2F0Y2ggKGVycikge30gLy8gc2V0U2VsZWN0aW9uUmFuZ2UgaXMgdW5kZWZpbmVkIGluIEdvb2dsZSBDaHJvbWVcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmhpZGVWaXJ0dWFsS2V5Ym9hcmQgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5mb2N1c2VkKSB0aGlzLnJlZnMuaW5wdXQuYmx1cigpXG4gICAgfVxuXG4gICAgdGhpcy50b2dnbGVWaXJ0dWFsS2V5Ym9hcmQgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5zdGF0ZS5mb2N1c2VkKSB0aGlzLmhpZGVWaXJ0dWFsS2V5Ym9hcmQoKVxuICAgICAgZWxzZSB0aGlzLnNob3dWaXJ0dWFsS2V5Ym9hcmQoKVxuICAgIH1cblxuICAgIHRoaXMuaGFuZGxlQ2hhbmdlID0gKGUpID0+IHtcbiAgICAgIGNvbnN0IHsgb25WaXJ0dWFsS2V5Ym9hcmRVc2VkIH0gPSB0aGlzLnByb3BzXG4gICAgICBpZiAob25WaXJ0dWFsS2V5Ym9hcmRVc2VkKSBvblZpcnR1YWxLZXlib2FyZFVzZWQoZS50YXJnZXQudmFsdWUpXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCBpbnZpc2libGVJbnB1dCA9IHtcbiAgICAgIHdpZHRoOiAnMCcsXG4gICAgICBoZWlnaHQ6ICcwJyxcbiAgICAgIGJvcmRlcjogJ25vbmUnLFxuICAgICAgb3V0bGluZTogJ25vbmUnXG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIDxPdmVybGF5VHJpZ2dlclxuICAgICAgICAgIHBsYWNlbWVudD0nYm90dG9tJ1xuICAgICAgICAgIG92ZXJsYXk9e1xuICAgICAgICAgICAgPFRvb2x0aXAgaWQ9J2Rpc3AtdG9vbHRpcC1rZXlib2FyZCc+XG4gICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5rZXlib2FyZH0gLz5cbiAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICB9PlxuICAgICAgICAgIDxCdXR0b24gb25DbGljaz17dGhpcy50b2dnbGVWaXJ0dWFsS2V5Ym9hcmR9PlxuICAgICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD0ncGVuY2lsJyAvPlxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICA8L092ZXJsYXlUcmlnZ2VyPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBpZD0na2V5Ym9hcmQtaW5wdXQnXG4gICAgICAgICAgcmVmPSdpbnB1dCdcbiAgICAgICAgICB0eXBlPSd0ZXh0J1xuICAgICAgICAgIGF1dG9DYXBpdGFsaXplPSdvZmYnXG4gICAgICAgICAgYXV0b0NvcnJlY3Q9J29mZidcbiAgICAgICAgICBhdXRvQ29tcGxldGU9J29mZidcbiAgICAgICAgICBzcGVsbENoZWNrPSdmYWxzZSdcbiAgICAgICAgICB2YWx1ZT0nJyAvLyBDb250cm9sbGVkXG4gICAgICAgICAgb25DaGFuZ2U9e3RoaXMuaGFuZGxlQ2hhbmdlfVxuICAgICAgICAgIG9uRm9jdXM9e3RoaXMuaGFuZGxlRm9jdXN9XG4gICAgICAgICAgb25CbHVyPXt0aGlzLmhhbmRsZUJsdXJ9XG4gICAgICAgICAgc3R5bGU9e2ludmlzaWJsZUlucHV0fSAvPlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59XG5cbktleWJvYXJkQnV0dG9uLnByb3BUeXBlcyA9IHtcbiAgb25WaXJ0dWFsS2V5Ym9hcmRVc2VkOiBSZWFjdC5Qcm9wVHlwZXMuZnVuY1xufVxuXG5leHBvcnQgZGVmYXVsdCBLZXlib2FyZEJ1dHRvblxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IEtleXMgZnJvbSAnQG5yYXluYXVkL25vdm5jL2xpYi9pbnB1dC9rZXlzeW0nXG5pbXBvcnQgeyBpbmplY3RJbnRsIH0gZnJvbSAncmVhY3QtaW50bCdcblxuY29uc3QgQ1RSTF9BTFRfREVMID0gJ0NUUkxfQUxUX0RFTCdcbmNvbnN0IENUUkxfU0hJRlRfRVNDID0gJ0NUUkxfU0hJRlRfRVNDJ1xuXG5jbGFzcyBEaXNwbGF5S2V5c0J1dHRvbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy5zZW5kS2V5ID0gdGhpcy5wcm9wcy5zZW5kS2V5ID8gdGhpcy5wcm9wcy5zZW5kS2V5IDogKCkgPT4ge31cbiAgICB0aGlzLnNlbmRLZXlzID0gKHZhbHVlKSA9PiB7XG4gICAgICB0aGlzLmdldENvbWJpbmF0aW9uKHZhbHVlKSh0aGlzLnNlbmRLZXkpXG4gICAgfVxuICAgIHRoaXMuaGFuZGxlQ29tYlN1Ym1pdCA9IChldmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgdGhpcy5zZW5kS2V5cyhldmVudC50YXJnZXQuY29tYmluYXRpb24udmFsdWUpXG4gICAgfVxuXG4gICAgLy8gTWVzc2FnZXMgZGVmaW5pdGlvbnNcbiAgICB0aGlzLm1lc3NhZ2VzID0ge1xuICAgICAgc2VuZDoge1xuICAgICAgICBpZDogJ3NlbmQnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ1NlbmQnXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCBkZWZpbmVNZXNzYWdlID0gdGhpcy5wcm9wcy5pbnRsLmZvcm1hdE1lc3NhZ2VcblxuICAgIHJldHVybiAoXG4gICAgICA8Zm9ybVxuICAgICAgICBpZD0nZGlzcGxheS1rZXlzLWJ1dHRvbidcbiAgICAgICAgY2xhc3NOYW1lPSdmb3JtLWlubGluZSdcbiAgICAgICAgb25TdWJtaXQ9e3RoaXMuaGFuZGxlQ29tYlN1Ym1pdH1cbiAgICAgICAgc3R5bGU9e3sgZGlzcGxheTogJ2lubGluZScgfX0+XG4gICAgICAgIDxzZWxlY3RcbiAgICAgICAgICB0eXBlPSdzZWxlY3QnXG4gICAgICAgICAgbmFtZT0nY29tYmluYXRpb24nXG4gICAgICAgICAgY2xhc3NOYW1lPSdmb3JtLWNvbnRyb2wnXG4gICAgICAgICAgc3R5bGU9e3sgZGlzcGxheTogJ2lubGluZScsIHdpZHRoOiAnYXV0bycgfX0+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT17Q1RSTF9BTFRfREVMfT5DdHJsK0FsdCtEZWw8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPXtDVFJMX1NISUZUX0VTQ30+Q3RybCtTaGlmdCtFc2M8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIHR5cGU9J3N1Ym1pdCdcbiAgICAgICAgICB2YWx1ZT17ZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLnNlbmQpfVxuICAgICAgICAgIGNsYXNzTmFtZT0nYnRuIGJ0bi1kZWZhdWx0J1xuICAgICAgICAgIHN0eWxlPXt7IGZsb2F0OiAnbm9uZScgfX0gLz5cbiAgICAgIDwvZm9ybT5cbiAgICApXG4gIH1cblxuICBnZXRDb21iaW5hdGlvbiAodmFsdWUpIHtcbiAgICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgICBjYXNlIENUUkxfQUxUX0RFTDpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZEN0cmxBbHREZWxcbiAgICAgIGNhc2UgQ1RSTF9TSElGVF9FU0M6XG4gICAgICAgIHJldHVybiB0aGlzLnNlbmRDdHJsU2hpZnRFc2NcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAoKSA9PiB7fVxuICAgIH1cbiAgfVxuXG4gIHNlbmRDdHJsQWx0RGVsIChzZW5kS2V5KSB7XG4gICAgc2VuZEtleShLZXlzLlhLX0NvbnRyb2xfTCwgMSlcbiAgICBzZW5kS2V5KEtleXMuWEtfQWx0X0wsIDEpXG4gICAgc2VuZEtleShLZXlzLlhLX0RlbGV0ZSwgMSlcbiAgICBzZW5kS2V5KEtleXMuWEtfRGVsZXRlLCAwKVxuICAgIHNlbmRLZXkoS2V5cy5YS19BbHRfTCwgMClcbiAgICBzZW5kS2V5KEtleXMuWEtfQ29udHJvbF9MLCAwKVxuICB9XG5cbiAgc2VuZEN0cmxTaGlmdEVzYyAoc2VuZEtleSkge1xuICAgIHNlbmRLZXkoS2V5cy5YS19Db250cm9sX0wsIDEpXG4gICAgc2VuZEtleShLZXlzLlhLX1NoaWZ0X0wsIDEpXG4gICAgc2VuZEtleShLZXlzLlhLX0VzY2FwZSwgMSlcbiAgICBzZW5kS2V5KEtleXMuWEtfRXNjYXBlLCAwKVxuICAgIHNlbmRLZXkoS2V5cy5YS19TaGlmdF9MLCAwKVxuICAgIHNlbmRLZXkoS2V5cy5YS19Db250cm9sX0wsIDApXG4gIH1cbn1cblxuRGlzcGxheUtleXNCdXR0b24ucHJvcFR5cGVzID0ge1xuICBzZW5kS2V5OiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBpbnRsOiBSZWFjdC5Qcm9wVHlwZXMub2JqZWN0XG59XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdEludGwoRGlzcGxheUtleXNCdXR0b24pXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQge1xuICBNb2RhbCwgQnV0dG9uLCBHbHlwaGljb24sIEZvcm1Hcm91cCwgSW5wdXRHcm91cCwgRm9ybUNvbnRyb2xcbn0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuaW1wb3J0IHsgaW5qZWN0SW50bCB9IGZyb20gJ3JlYWN0LWludGwnXG5cbmNsYXNzIERpc3BsYXlQYXNzRm9ybSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy5oYW5kbGVDbG9zZSA9IHRoaXMucHJvcHMuaGFuZGxlQ2xvc2VcbiAgICAgID8gKGV2ZW50KSA9PiB0aGlzLnByb3BzLmhhbmRsZUNsb3NlKClcbiAgICAgIDogKCkgPT4ge31cbiAgICB0aGlzLmhhbmRsZVN1Ym1pdCA9IChldmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgdGhpcy5wcm9wcy5oYW5kbGVTdWJtaXQoZXZlbnQudGFyZ2V0WydkaXNwbGF5LXBhc3MnXS52YWx1ZSlcbiAgICB9XG5cbiAgICB0aGlzLm1lc3NhZ2VzID0ge1xuICAgICAgZGlzcGxheVBhc3N3b3JkOiB7XG4gICAgICAgIGlkOiAnZGlzcGxheVBhc3N3b3JkJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdEaXNwbGF5IHBhc3N3b3JkJ1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBzaG93IH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgZGVmaW5lTWVzc2FnZSA9IHRoaXMucHJvcHMuaW50bC5mb3JtYXRNZXNzYWdlXG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBpZD0nZGlzcGxheS1wYXNzLWZvcm0nPlxuICAgICAgICA8TW9kYWxcbiAgICAgICAgICBzaG93PXtzaG93fVxuICAgICAgICAgIGtleWJvYXJkPXtmYWxzZX1cbiAgICAgICAgICBiYWNrZHJvcD0nc3RhdGljJ1xuICAgICAgICAgIG9uSGlkZT17dGhpcy5oYW5kbGVDbG9zZX1cbiAgICAgICAgICBic1NpemU9J3NtYWxsJ1xuICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT0nY29udGFpbmVkLW1vZGFsLXRpdGxlLXNtJz5cbiAgICAgICAgICA8TW9kYWwuSGVhZGVyIGNsb3NlQnV0dG9uPXtmYWxzZX0+XG4gICAgICAgICAgICA8TW9kYWwuVGl0bGUgaWQ9J2NvbnRhaW5lZC1tb2RhbC10aXRsZS1zbSc+XG4gICAgICAgICAgICAgIHsgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLmRpc3BsYXlQYXNzd29yZCkgfVxuICAgICAgICAgICAgPC9Nb2RhbC5UaXRsZT5cbiAgICAgICAgICA8L01vZGFsLkhlYWRlcj5cbiAgICAgICAgICA8TW9kYWwuQm9keT5cbiAgICAgICAgICAgIDxmb3JtIG9uU3VibWl0PXt0aGlzLmhhbmRsZVN1Ym1pdH0+XG4gICAgICAgICAgICAgIDxGb3JtR3JvdXA+XG4gICAgICAgICAgICAgICAgPElucHV0R3JvdXA+XG4gICAgICAgICAgICAgICAgICA8SW5wdXRHcm91cC5CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b24gdHlwZT0nc3VibWl0JyBic1N0eWxlPSdwcmltYXJ5Jz5cbiAgICAgICAgICAgICAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdvaycgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICA8L0lucHV0R3JvdXAuQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPEZvcm1Db250cm9sXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudENsYXNzPSdpbnB1dCdcbiAgICAgICAgICAgICAgICAgICAgYXV0b0ZvY3VzXG4gICAgICAgICAgICAgICAgICAgIG9uRm9jdXM9eyhlKSA9PiBlLnRhcmdldC5zZWxlY3QoKX1cbiAgICAgICAgICAgICAgICAgICAgbmFtZT0nZGlzcGxheS1wYXNzJ1xuICAgICAgICAgICAgICAgICAgICB0eXBlPSdwYXNzd29yZCdcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9J1Bhc3N3b3JkJ1xuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCAvPlxuICAgICAgICAgICAgICAgIDwvSW5wdXRHcm91cD5cbiAgICAgICAgICAgICAgPC9Gb3JtR3JvdXA+XG4gICAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgICAgPC9Nb2RhbC5Cb2R5PlxuICAgICAgICA8L01vZGFsPlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59XG5cbkRpc3BsYXlQYXNzRm9ybS5wcm9wVHlwZXMgPSB7XG4gIHNob3c6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBoYW5kbGVDbG9zZTogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGhhbmRsZVN1Ym1pdDogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgaW50bDogUmVhY3QuUHJvcFR5cGVzLm9iamVjdFxufVxuRGlzcGxheVBhc3NGb3JtLmRlZmF1bHRQcm9wcyA9IHtcbiAgc2hvdzogZmFsc2Vcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5qZWN0SW50bChEaXNwbGF5UGFzc0Zvcm0pXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBlbGxpcHNpemUgfSBmcm9tICcuLi9jb21tb24vbGliL3V0aWwnXG5cbi8qXG4gKiBDdXRzIHRoZSB0ZXh0IChjaGlsZHJlbikgaWYgdGhlaXIgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2VsZWN0ZWRcbiAqIG1heCBsZW5ndGggYW5kIGFwcGxpZXMgdGhlIHNlbGVjdGVkIGVsbGlwc2UgdG8gdGhlIHJlc3VsdCB0ZXh0LlxuICovXG5jb25zdCBFbGxpcHNpemUgPSAoeyBjaGlsZHJlbiwgbWF4LCBlbGxpcHNlIH0pID0+IChcbiAgPHNwYW4gdGl0bGU9e2NoaWxkcmVufT5cbiAgICB7ICEhY2hpbGRyZW4gJiYgZWxsaXBzaXplKGNoaWxkcmVuLCBtYXgsIGVsbGlwc2UpIH1cbiAgPC9zcGFuPlxuKVxuXG5FbGxpcHNpemUucHJvcFR5cGVzID0ge1xuICBjaGlsZHJlbjogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgbWF4OiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICBlbGxpcHNlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nXG59XG5cbmV4cG9ydCBkZWZhdWx0IEVsbGlwc2l6ZVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcydcbmltcG9ydCB7IEdseXBoaWNvbiB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcblxuY2xhc3MgQnJlYWRjcnVtYnMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIHRoaXMucGFyc2VQYXRobmFtZSA9IChwYXRobmFtZSwgc2VwYXJhdG9yKSA9PiB7XG4gICAgICByZXR1cm4gcGF0aG5hbWVcbiAgICAgICAgLnNwbGl0KHNlcGFyYXRvcilcbiAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAmJiBpdGVtLmxlbmd0aCA+IDApXG4gICAgICAgIC5tYXAoKGJhc2VuYW1lLCBpbmRleCwgYmFzZW5hbWVzKSA9PiAoe1xuICAgICAgICAgIHBhdGhuYW1lOiBiYXNlbmFtZXMuc2xpY2UoMCwgaW5kZXggKyAxKS5qb2luKHNlcGFyYXRvciksXG4gICAgICAgICAgYmFzZW5hbWUsXG4gICAgICAgICAgYWN0aXZlOiAoaW5kZXggPT09IGJhc2VuYW1lcy5sZW5ndGggLSAxKVxuICAgICAgICB9KSlcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVDbGljayA9ICh0eXBlb2YgdGhpcy5wcm9wcy5vblNlbGVjdGlvbiA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgID8gKHBhdGhuYW1lID0gJycpID0+IChldmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb3BzLm9uU2VsZWN0aW9uKHBhdGhuYW1lKVxuICAgICAgfVxuICAgICAgOiAoKSA9PiAoZXZlbnQpID0+IHt9XG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgcGF0aG5hbWUsIHNlcGFyYXRvciB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5wYXJzZVBhdGhuYW1lKHBhdGhuYW1lLCBzZXBhcmF0b3IpXG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9J2ZpbGVzLWJyZWFkY3J1bWJzJz5cbiAgICAgICAgPG9sIGNsYXNzTmFtZT0nYnJlYWRjcnVtYic+XG4gICAgICAgICAgPGxpIGNsYXNzTmFtZT17Y2xhc3NuYW1lcyh7IGFjdGl2ZTogaXRlbXMubGVuZ3RoIDw9IDAgfSl9PlxuICAgICAgICAgICAgeyBpdGVtcy5sZW5ndGggPD0gMCAmJiA8R2x5cGhpY29uIGdseXBoPSdob21lJyAvPiB9XG4gICAgICAgICAgICB7IGl0ZW1zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgPGEgaHJlZj0nLycgb25DbGljaz17dGhpcy5oYW5kbGVDbGljaygpfT5cbiAgICAgICAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdob21lJyAvPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBpdGVtcy5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbGFzc25hbWVzKHsgYWN0aXZlOiBpdGVtLmFjdGl2ZSB9KX0+XG4gICAgICAgICAgICAgICAgICB7IGl0ZW0uYWN0aXZlICYmXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYmFzZW5hbWVcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHsgIWl0ZW0uYWN0aXZlICYmXG4gICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgaHJlZj17aXRlbS5wYXRobmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZUNsaWNrKGl0ZW0ucGF0aG5hbWUpfT5cbiAgICAgICAgICAgICAgICAgICAgICB7IGl0ZW0uYmFzZW5hbWUgfVxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIDwvb2w+XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cbn1cblxuQnJlYWRjcnVtYnMucHJvcFR5cGVzID0ge1xuICBwYXRobmFtZTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBzZXBhcmF0b3I6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIG9uU2VsZWN0aW9uOiBSZWFjdC5Qcm9wVHlwZXMuZnVuY1xufVxuQnJlYWRjcnVtYnMuZGVmYXVsdFByb3BzID0ge1xuICBzZXBhcmF0b3I6ICcvJ1xufVxuXG5leHBvcnQgZGVmYXVsdCBCcmVhZGNydW1ic1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQnV0dG9uR3JvdXAsIEJ1dHRvbiwgR2x5cGhpY29uIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuaW1wb3J0IHtcbiAgZGVmaW5lTWVzc2FnZXMsIGluamVjdEludGwsIGludGxTaGFwZSwgRm9ybWF0dGVkTWVzc2FnZVxufSBmcm9tICdyZWFjdC1pbnRsJ1xuXG5pbXBvcnQgUmVmcmVzaEJ1dHRvbiBmcm9tICcuLi8uLi9jb21tb24vY29tcG9uZW50cy9yZWZyZXNoLWJ1dHRvbidcbmltcG9ydCBEb3dubG9hZHNNb2RhbCBmcm9tICcuL2Rvd25sb2Fkcy1tb2RhbCdcbmltcG9ydCBVcGxvYWRzTW9kYWwgZnJvbSAnLi91cGxvYWRzLW1vZGFsJ1xuXG5jb25zdCBtZXNzYWdlcyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgcmVmcmVzaERpcmVjdG9yeToge1xuICAgIGlkOiAncmVmcmVzaERpcmVjdG9yeScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdSZWZyZXNoIGRpcmVjdG9yeSdcbiAgfSxcbiAgZG93bmxvYWRzOiB7XG4gICAgaWQ6ICdkb3dubG9hZHMnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRG93bmxvYWRzJ1xuICB9LFxuICB1cGxvYWRzOiB7XG4gICAgaWQ6ICd1cGxvYWRzJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1VwbG9hZHMnXG4gIH1cbn0pXG5cbmNsYXNzIEZpbGVzQnV0dG9ucyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgZGlybmFtZSwgc2VwYXJhdG9yLFxuICAgICAgaXNVcGxvYWRpbmcsIHVwbG9hZEVuYWJsZWQsIGxhc3RVcGRhdGUsIG9uUmVmcmVzaENsaWNrLFxuICAgICAgaXNEb3dubG9hZGluZywgc2hvd0Rvd25sb2Fkcywgb25Eb3dubG9hZHNDbGljayxcbiAgICAgIHNob3dVcGxvYWRzLCBvblVwbG9hZHNDbGljaywgaW50bDogeyBmb3JtYXRNZXNzYWdlIH1cbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgaWQ9J2ZpbGVzLWJ1dHRvbnMnPlxuICAgICAgICA8RG93bmxvYWRzTW9kYWwgc2hvdz17c2hvd0Rvd25sb2Fkc30gaGFuZGxlSGlkZT17b25Eb3dubG9hZHNDbGlja30gLz5cbiAgICAgICAgPFVwbG9hZHNNb2RhbFxuICAgICAgICAgIGRpcm5hbWU9e2Rpcm5hbWV9XG4gICAgICAgICAgc2VwYXJhdG9yPXtzZXBhcmF0b3J9XG4gICAgICAgICAgc2hvdz17c2hvd1VwbG9hZHN9XG4gICAgICAgICAgaGFuZGxlSGlkZT17b25VcGxvYWRzQ2xpY2t9XG4gICAgICAgICAgdXBsb2FkRW5hYmxlZD17dXBsb2FkRW5hYmxlZH0gLz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3Jvdyc+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbC1tZC04IHRleHQtbGVmdCc+XG4gICAgICAgICAgICA8UmVmcmVzaEJ1dHRvblxuICAgICAgICAgICAgICBoYW5kbGVSZWZyZXNoPXtvblJlZnJlc2hDbGlja31cbiAgICAgICAgICAgICAgbGFzdFVwZGF0ZT17bGFzdFVwZGF0ZX1cbiAgICAgICAgICAgICAgZW5hYmxlUGVyaW9kcz17ZmFsc2V9PlxuICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMucmVmcmVzaERpcmVjdG9yeX0gLz5cbiAgICAgICAgICAgIDwvUmVmcmVzaEJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sLW1kLTQgdGV4dC1yaWdodCc+XG4gICAgICAgICAgICB7ICEhbGFzdFVwZGF0ZSAmJlxuICAgICAgICAgICAgICA8QnV0dG9uR3JvdXA+XG4gICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtpc0Rvd25sb2FkaW5nID8gJ2J1dHRvbi1jb2xvci1hbmltYXRlJyA6ICcnfVxuICAgICAgICAgICAgICAgICAgYnNTdHlsZT0nZGVmYXVsdCdcbiAgICAgICAgICAgICAgICAgIHRpdGxlPXtmb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmRvd25sb2Fkcyl9XG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXtvbkRvd25sb2Fkc0NsaWNrfT5cbiAgICAgICAgICAgICAgICAgIDxHbHlwaGljb24gZ2x5cGg9J2Nsb3VkLWRvd25sb2FkJyAvPlxuICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17aXNVcGxvYWRpbmcgPyAnYnV0dG9uLWNvbG9yLWFuaW1hdGUnIDogJyd9XG4gICAgICAgICAgICAgICAgICBic1N0eWxlPSdkZWZhdWx0J1xuICAgICAgICAgICAgICAgICAgdGl0bGU9e2Zvcm1hdE1lc3NhZ2UobWVzc2FnZXMudXBsb2Fkcyl9XG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXtvblVwbG9hZHNDbGlja30+XG4gICAgICAgICAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdjbG91ZC11cGxvYWQnIC8+XG4gICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgIDwvQnV0dG9uR3JvdXA+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59XG5cbkZpbGVzQnV0dG9ucy5wcm9wVHlwZXMgPSB7XG4gIGRpcm5hbWU6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgc2VwYXJhdG9yOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuXG4gIGxhc3RVcGRhdGU6IFJlYWN0LlByb3BUeXBlcy5pbnN0YW5jZU9mKERhdGUpLFxuXG4gIG9uUmVmcmVzaENsaWNrOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBpc0Rvd25sb2FkaW5nOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgc2hvd0Rvd25sb2FkczogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIG9uRG93bmxvYWRzQ2xpY2s6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGlzVXBsb2FkaW5nOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgc2hvd1VwbG9hZHM6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICB1cGxvYWRFbmFibGVkOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgb25VcGxvYWRzQ2xpY2s6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG5cbiAgaW50bDogaW50bFNoYXBlLmlzUmVxdWlyZWRcbn1cblxuRmlsZXNCdXR0b25zLmRlZmF1bHRQcm9wcyA9IHtcbiAgbGFzdFVwZGF0ZTogZmFsc2UsXG5cbiAgaXNEb3dubG9hZGluZzogZmFsc2UsXG4gIHNob3dEb3dubG9hZHM6IGZhbHNlLFxuICBpc1VwbG9hZGluZzogZmFsc2UsXG4gIHNob3dVcGxvYWRzOiBmYWxzZVxufVxuXG5leHBvcnQgZGVmYXVsdCBpbmplY3RJbnRsKEZpbGVzQnV0dG9ucylcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCdcbmltcG9ydCB7IEFsZXJ0LCBNb2RhbCB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcbmltcG9ydCB7IGRlZmluZU1lc3NhZ2VzLCBGb3JtYXR0ZWRNZXNzYWdlIH0gZnJvbSAncmVhY3QtaW50bCdcblxuaW1wb3J0IHsgY2xlYXJEb3dubG9hZEZpbGVFcnJvciB9IGZyb20gJy4uLy4uL2FjdGlvbnMvZmlsZXMnXG5pbXBvcnQgeyBnZXREb3dubG9hZEVycm9ycyB9IGZyb20gJy4uLy4uL3JlZHVjZXJzL2ZpbGVzJ1xuXG5pbXBvcnQgRG93bmxvYWRzIGZyb20gJy4vZG93bmxvYWRzJ1xuXG5jb25zdCBtZXNzYWdlcyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgZG93bmxvYWRzOiB7XG4gICAgaWQ6ICdkb3dubG9hZHMnLCBkZWZhdWx0TWVzc2FnZTogJ0Rvd25sb2FkcydcbiAgfVxufSlcblxuY29uc3QgRG93bmxvYWRzTW9kYWwgPSAoe1xuICBzaG93LCBoYW5kbGVIaWRlLCBkb3dubG9hZEVycm9ycywgY2xlYXJEb3dubG9hZEVycm9yXG59KSA9PiAoXG4gIDxNb2RhbCBzaG93PXtzaG93fSBvbkhpZGU9e2hhbmRsZUhpZGV9PlxuICAgIDxNb2RhbC5IZWFkZXIgY2xvc2VCdXR0b24+XG4gICAgICA8TW9kYWwuVGl0bGU+XG4gICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5kb3dubG9hZHN9IC8+XG4gICAgICA8L01vZGFsLlRpdGxlPlxuICAgIDwvTW9kYWwuSGVhZGVyPlxuICAgIDxNb2RhbC5Cb2R5PlxuICAgICAgeyBkb3dubG9hZEVycm9ycy5sZW5ndGggPiAwICYmXG4gICAgICAgIGRvd25sb2FkRXJyb3JzLm1hcCgoeyBwYXRoLCBtZXNzYWdlIH0sIGkpID0+IChcbiAgICAgICAgICA8QWxlcnRcbiAgICAgICAgICAgIGtleT17aX1cbiAgICAgICAgICAgIGJzU3R5bGU9J2RhbmdlcidcbiAgICAgICAgICAgIG9uRGlzbWlzcz17KGUpID0+IGNsZWFyRG93bmxvYWRFcnJvcihwYXRoKX0+XG4gICAgICAgICAgICB7IG1lc3NhZ2UgfVxuICAgICAgICAgIDwvQWxlcnQ+XG4gICAgICAgICkpXG4gICAgICB9XG4gICAgICA8RG93bmxvYWRzIC8+XG4gICAgPC9Nb2RhbC5Cb2R5PlxuICA8L01vZGFsPlxuKVxuXG5Eb3dubG9hZHNNb2RhbC5wcm9wVHlwZXMgPSB7XG4gIHNob3c6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBoYW5kbGVIaWRlOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuXG4gIGRvd25sb2FkRXJyb3JzOiBSZWFjdC5Qcm9wVHlwZXMuYXJyYXlPZihSZWFjdC5Qcm9wVHlwZXMuc2hhcGUoe1xuICAgIHBhdGg6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gICAgY29kZTogUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgICBtZXNzYWdlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nXG4gIH0pKSxcbiAgY2xlYXJEb3dubG9hZEVycm9yOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkXG59XG5Eb3dubG9hZHNNb2RhbC5kZWZhdWx0UHJvcFR5cGVzID0ge1xuICBzaG93OiBmYWxzZSxcblxuICBkb3dubG9hZEVycm9yczogW11cbn1cblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgZmlsZXMgfSkgPT4gKHtcbiAgZG93bmxvYWRFcnJvcnM6IGdldERvd25sb2FkRXJyb3JzKGZpbGVzKVxufSlcbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IChkaXNwYXRjaCkgPT4gKHtcbiAgY2xlYXJEb3dubG9hZEVycm9yOiAocGF0aCkgPT4gZGlzcGF0Y2goY2xlYXJEb3dubG9hZEZpbGVFcnJvcihwYXRoKSlcbn0pXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShEb3dubG9hZHNNb2RhbClcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJ1dHRvbiwgTGlzdEdyb3VwLCBMaXN0R3JvdXBJdGVtLCBBbGVydCB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcbmltcG9ydCB7IGRlZmluZU1lc3NhZ2VzLCBGb3JtYXR0ZWRNZXNzYWdlIH0gZnJvbSAncmVhY3QtaW50bCdcblxuaW1wb3J0IEZpbGVzRG93bmxvYWRDb250cm9sbGVyIGZyb20gJy4uLy4uL2xpYi9maWxlcy9maWxlcy1kb3dubG9hZC1jb250cm9sbGVyJ1xuaW1wb3J0IEVsbGlwc2l6ZSBmcm9tICcuLi9lbGxpcHNpemUnXG5pbXBvcnQgUHJvZ3Jlc3NCYXIgZnJvbSAnLi4vcHJvZ3Jlc3MtYmFyJ1xuXG5jb25zdCBGSUxFTkFNRV9NQVhfTEVOR1RIID0gNTBcblxuY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gIGVtcHR5OiB7XG4gICAgaWQ6ICdlbXB0eScsIGRlZmF1bHRNZXNzYWdlOiAnRW1wdHknXG4gIH1cbn0pXG5cbmNvbnN0IERvd25sb2FkcyA9ICh7IGZpbGVzLCBvblJlbW92ZUZpbGUgfSkgPT4gKFxuICA8TGlzdEdyb3VwIGNsYXNzTmFtZT0nZmlsZXMtZG93bmxvYWQtZG93bmxvYWRzJz5cbiAgICB7IGZpbGVzLmxlbmd0aCA8PSAwICYmXG4gICAgICA8QWxlcnQgYnNTdHlsZT0nZGFuZ2VyJz5cbiAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLmVtcHR5fSAvPlxuICAgICAgPC9BbGVydD5cbiAgICB9XG4gICAgeyBmaWxlcy5sZW5ndGggPiAwICYmXG4gICAgICBmaWxlcy5tYXAoKHsgYmFzZW5hbWU6IG5hbWUsIHBhdGgsIHByb2dyZXNzIH0sIGluZGV4KSA9PiAoXG4gICAgICAgIDxMaXN0R3JvdXBJdGVtXG4gICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICBic1N0eWxlPXsocHJvZ3Jlc3MgPCAxMDApID8gJ2luZm8nIDogJ3N1Y2Nlc3MnfT5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICB0eXBlPSdidXR0b24nXG4gICAgICAgICAgICBjbGFzc05hbWU9J2Nsb3NlJ1xuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gb25SZW1vdmVGaWxlKHBhdGgpfT5cbiAgICAgICAgICAgIDxzcGFuPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgPEVsbGlwc2l6ZSBtYXg9e0ZJTEVOQU1FX01BWF9MRU5HVEh9PntuYW1lfTwvRWxsaXBzaXplPlxuICAgICAgICAgIDxQcm9ncmVzc0JhciB2YWx1ZT17cHJvZ3Jlc3N9IC8+XG4gICAgICAgIDwvTGlzdEdyb3VwSXRlbT5cbiAgICAgICkpXG4gICAgfVxuICA8L0xpc3RHcm91cD5cbilcblxuRG93bmxvYWRzLnByb3BUeXBlcyA9IHtcbiAgZmlsZXM6IFJlYWN0LlByb3BUeXBlcy5hcnJheSxcbiAgb25SZW1vdmVGaWxlOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkXG59XG5cbkRvd25sb2Fkcy5kZWZhdWx0UHJvcHMgPSB7XG4gIGZpbGVzOiBbXVxufVxuXG5jbGFzcyBEb3dubG9hZHNDb250YWluZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIHRoaXMuZ2V0RG93bmxvYWRGaWxlcyA9ICgpID0+ICh7XG4gICAgICBmaWxlczogRmlsZXNEb3dubG9hZENvbnRyb2xsZXIuZmlsZXMubWFwKChmaWxlRG93bmxvYWQsIGluZGV4KSA9PiAoe1xuICAgICAgICBwYXRoOiBmaWxlRG93bmxvYWQuZmlsZS5wYXRoLFxuICAgICAgICBkaXJuYW1lOiBmaWxlRG93bmxvYWQuZmlsZS5kaXJuYW1lLFxuICAgICAgICBiYXNlbmFtZTogZmlsZURvd25sb2FkLmZpbGUuYmFzZW5hbWUsXG4gICAgICAgIHByb2dyZXNzOiBmaWxlRG93bmxvYWQucHJvZ3Jlc3NcbiAgICAgIH0pKVxuICAgIH0pXG5cbiAgICB0aGlzLmhhbmRsZUZpbGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHRoaXMuZ2V0RG93bmxvYWRGaWxlcylcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZVJlbW92ZUZpbGUgPSAocGF0aCkgPT4gRmlsZXNEb3dubG9hZENvbnRyb2xsZXIucmVtb3ZlRmlsZShwYXRoKVxuXG4gICAgdGhpcy5zdGF0ZSA9IHRoaXMuZ2V0RG93bmxvYWRGaWxlcygpXG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgZmlsZXMgfSA9IHRoaXMuc3RhdGVcbiAgICByZXR1cm4gKDxEb3dubG9hZHMgZmlsZXM9e2ZpbGVzfSBvblJlbW92ZUZpbGU9e3RoaXMuaGFuZGxlUmVtb3ZlRmlsZX0gLz4pXG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgRmlsZXNEb3dubG9hZENvbnRyb2xsZXIub24oJ2ZpbGUnLCB0aGlzLmhhbmRsZUZpbGUpXG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCAoKSB7XG4gICAgRmlsZXNEb3dubG9hZENvbnRyb2xsZXIucmVtb3ZlTGlzdGVuZXIoJ2ZpbGUnLCB0aGlzLmhhbmRsZUZpbGUpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRG93bmxvYWRzQ29udGFpbmVyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBkZWZpbmVNZXNzYWdlcywgRm9ybWF0dGVkTWVzc2FnZSB9IGZyb20gJ3JlYWN0LWludGwnXG5cbmNvbnN0IG1lc3NhZ2VzID0gZGVmaW5lTWVzc2FnZXMoe1xuICB1cGxvYWREaXNhYmxlZDoge1xuICAgIGlkOiAndXBsb2FkLWRpc2FibGVkJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1VwbG9hZCBkaXNhYmxlZCBvbiB0aGlzIGRpcmVjdG9yeSdcbiAgfSxcbiAgdXBsb2FkRHJvcDoge1xuICAgIGlkOiAndXBsb2FkLWRyb3AnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRHJvcCB0aGUgZmlsZSB0byBzdGFydCB0aGUgdXBsb2FkJ1xuICB9XG59KVxuXG5jb25zdCBGaWxlRHJvcE1lc3NhZ2UgPSAoeyB1cGxvYWRFbmFibGVkIH0pID0+IChcbiAgPHNwYW4gY2xhc3NOYW1lPSdsZWFkJz5cbiAgICB7IHVwbG9hZEVuYWJsZWQgJiYgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLnVwbG9hZERyb3B9IC8+IH1cbiAgICB7ICF1cGxvYWRFbmFibGVkICYmIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy51cGxvYWREaXNhYmxlZH0gLz4gfVxuICA8L3NwYW4+XG4pXG5cbkZpbGVEcm9wTWVzc2FnZS5wcm9wVHlwZXMgPSB7XG4gIHVwbG9hZEVuYWJsZWQ6IFJlYWN0LlByb3BUeXBlcy5ib29sXG59XG5cbmV4cG9ydCBkZWZhdWx0IEZpbGVEcm9wTWVzc2FnZVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuXG5jb25zdCBzdHlsZSA9IHtcbiAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gIHRvcDogMCxcbiAgcmlnaHQ6IDAsXG4gIGJvdHRvbTogMCxcbiAgbGVmdDogMCxcbiAgY29sb3I6ICcjZmZmJyxcbiAgYmFja2dyb3VuZDogJ3JnYmEoMCwwLDAsMC41KScsXG4gIHpJbmRleDogMTFcbn1cblxuY29uc3QgYm9yZGVyTWFyZ2luID0gMTBcblxuY29uc3QgYm9yZGVyU3R5bGUgPSB7XG4gIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICB0b3A6IGJvcmRlck1hcmdpbixcbiAgcmlnaHQ6IGJvcmRlck1hcmdpbixcbiAgYm90dG9tOiBib3JkZXJNYXJnaW4sXG4gIGxlZnQ6IGJvcmRlck1hcmdpbixcbiAgYm9yZGVyQ29sb3I6ICcjZWVlJyxcbiAgYm9yZGVyUmFkaXVzOiAnNHB4JyxcbiAgYm9yZGVyU3R5bGU6ICdkYXNoZWQnLFxuICBib3JkZXJXaWR0aDogJzRweCdcbn1cblxuY29uc3QgZ2V0Qm9yZGVyU3R5bGUgPSAoeyBvZmZzZXRUb3AgPSAwIH0pID0+ICh7XG4gIC4uLmJvcmRlclN0eWxlLFxuICB0b3A6IGJvcmRlclN0eWxlLnRvcCArIG9mZnNldFRvcFxufSlcblxuY29uc3QgRmlsZURyb3BPdmVybGF5ID0gKHsgb2Zmc2V0VG9wLCBjaGlsZHJlbiB9KSA9PiAoXG4gIDxkaXYgc3R5bGU9e3N0eWxlfT5cbiAgICA8ZGl2IHN0eWxlPXtnZXRCb3JkZXJTdHlsZSh7IG9mZnNldFRvcCB9KX0+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT0ndGV4dC1jZW50ZXInPnsgY2hpbGRyZW4gfTwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbilcblxuRmlsZURyb3BPdmVybGF5LnByb3BUeXBlcyA9IHtcbiAgb2Zmc2V0VG9wOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICBjaGlsZHJlbjogUmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUmVhY3QuUHJvcFR5cGVzLm5vZGUsXG4gICAgUmVhY3QuUHJvcFR5cGVzLnN0cmluZ1xuICBdKVxufVxuXG5leHBvcnQgZGVmYXVsdCBGaWxlRHJvcE92ZXJsYXlcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCBEcm9wem9uZSBmcm9tICdyZWFjdC1kcm9wem9uZSdcbmltcG9ydCBGaWxlRHJvcE92ZXJsYXkgZnJvbSAnLi9maWxlLWRyb3Atb3ZlcmxheSdcblxuY2xhc3MgRmlsZURyb3B6b25lIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZHJvcHpvbmVBY3RpdmU6IGZhbHNlXG4gICAgfVxuXG4gICAgdGhpcy5zaG93RHJvcHpvbmVPdmVybGF5ID0gKCkgPT4gdGhpcy5zZXRTdGF0ZSh7IGRyb3B6b25lQWN0aXZlOiB0cnVlIH0pXG4gICAgdGhpcy5oaWRlRHJvcHpvbmVPdmVybGF5ID0gKCkgPT4gdGhpcy5zZXRTdGF0ZSh7IGRyb3B6b25lQWN0aXZlOiBmYWxzZSB9KVxuICAgIHRoaXMuaGFuZGxlRmlsZXNEcm9wID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIHRoaXMucHJvcHMub25Ecm9wKC4uLmFyZ3MpXG4gICAgICB0aGlzLmhpZGVEcm9wem9uZU92ZXJsYXkoKVxuICAgIH1cbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgb3ZlcmxheU1lc3NhZ2UsIG92ZXJsYXlPZmZzZXRUb3AsIGRyb3B6b25lUmVmLCBjaGlsZHJlbiwgLi4ucHJvcHNcbiAgICB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgZHJvcHpvbmVBY3RpdmUgfSA9IHRoaXMuc3RhdGVcblxuICAgIHJldHVybiAoXG4gICAgICA8RHJvcHpvbmVcbiAgICAgICAgc3R5bGU9e3t9fVxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAgIHJlZj17ZHJvcHpvbmVSZWZ9XG4gICAgICAgIG9uRHJhZ0VudGVyPXt0aGlzLnNob3dEcm9wem9uZU92ZXJsYXl9XG4gICAgICAgIG9uRHJhZ0xlYXZlPXt0aGlzLmhpZGVEcm9wem9uZU92ZXJsYXl9XG4gICAgICAgIG9uRHJvcD17dGhpcy5oYW5kbGVGaWxlc0Ryb3B9PlxuICAgICAgICB7IGRyb3B6b25lQWN0aXZlICYmXG4gICAgICAgICAgPEZpbGVEcm9wT3ZlcmxheSBvZmZzZXRUb3A9e292ZXJsYXlPZmZzZXRUb3B9PlxuICAgICAgICAgICAgeyBvdmVybGF5TWVzc2FnZSB9XG4gICAgICAgICAgPC9GaWxlRHJvcE92ZXJsYXk+XG4gICAgICAgIH1cbiAgICAgICAgeyBjaGlsZHJlbiB9XG4gICAgICA8L0Ryb3B6b25lPlxuICAgIClcbiAgfVxufVxuXG5GaWxlRHJvcHpvbmUucHJvcFR5cGVzID0ge1xuICBkaXNhYmxlQ2xpY2s6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBkaXNhYmxlUHJldmlldzogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGRyb3B6b25lUmVmOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgb25Ecm9wOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBvdmVybGF5TWVzc2FnZTogRmlsZURyb3BPdmVybGF5LnByb3BUeXBlcy5jaGlsZHJlbi5pc1JlcXVpcmVkLFxuICBvdmVybGF5T2Zmc2V0VG9wOiBGaWxlRHJvcE92ZXJsYXkucHJvcFR5cGVzLm9mZnNldFRvcCxcbiAgY2hpbGRyZW46IFJlYWN0LlByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgIFJlYWN0LlByb3BUeXBlcy5hcnJheU9mKFJlYWN0LlByb3BUeXBlcy5ub2RlKSxcbiAgICBSZWFjdC5Qcm9wVHlwZXMubm9kZVxuICBdKVxufVxuXG5leHBvcnQgZGVmYXVsdCBGaWxlRHJvcHpvbmVcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCdcbmltcG9ydCB7IEFsZXJ0IH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuaW1wb3J0IHtcbiAgZGVmaW5lTWVzc2FnZXMsIGluamVjdEludGwsIGludGxTaGFwZSwgRm9ybWF0dGVkTWVzc2FnZVxufSBmcm9tICdyZWFjdC1pbnRsJ1xuXG5pbXBvcnQge1xuICBjZCwgZmV0Y2hGaWxlcywgZGVsZXRlRmlsZSxcbiAgY2xlYXJGaWxlc0Vycm9yLCBjbGVhckZpbGVFcnJvcixcbiAgY2xlYXJEb3dubG9hZEZpbGVFcnJvciwgY2xlYXJVcGxvYWRGaWxlRXJyb3Jcbn0gZnJvbSAnLi4vLi4vYWN0aW9ucy9maWxlcydcbmltcG9ydCB7XG4gIGdldEl0ZW1zTWV0YWRhdGEsIGdldEl0ZW1zLCBnZXREaXIsXG4gIGdldEl0ZW1zRXJyb3JzLCBnZXREb3dubG9hZEVycm9ycywgZ2V0VXBsb2FkRXJyb3JzXG59IGZyb20gJy4uLy4uL3JlZHVjZXJzL2ZpbGVzJ1xuXG5pbXBvcnQgVXNlckZpbGUgZnJvbSAnLi4vLi4vbGliL2ZpbGVzL3VzZXItZmlsZSdcbmltcG9ydCBGaWxlSXRlbSBmcm9tICcuLi8uLi9saWIvZmlsZXMvZmlsZS1pdGVtJ1xuaW1wb3J0IEZpbGVzRG93bmxvYWRDb250cm9sbGVyIGZyb20gJy4uLy4uL2xpYi9maWxlcy9maWxlcy1kb3dubG9hZC1jb250cm9sbGVyJ1xuaW1wb3J0IEZpbGVzVXBsb2FkQ29udHJvbGxlciBmcm9tICcuLi8uLi9saWIvZmlsZXMvZmlsZXMtdXBsb2FkLWNvbnRyb2xsZXInXG5cbmltcG9ydCBGaWxlc0J1dHRvbnMgZnJvbSAnLi9idXR0b25zJ1xuaW1wb3J0IEZpbGVzQnJlYWRjcnVtYnMgZnJvbSAnLi9icmVhZGNydW1icydcbmltcG9ydCBGaWxlc1RhYmxlIGZyb20gJy4vdGFibGUnXG5pbXBvcnQgRmlsZURyb3B6b25lIGZyb20gJy4vZmlsZS1kcm9wem9uZSdcbmltcG9ydCBGaWxlRHJvcE1lc3NhZ2UgZnJvbSAnLi9maWxlLWRyb3AtbWVzc2FnZSdcblxuY29uc3QgRE9XTkxPQURfU0laRV9MSU1JVCA9IDEwNDg1NzYwMCAvLyAxMDAgKiAxMDI0ICogMTAyNCA8MTAwTUJcbmNvbnN0IENBQ0hFX0lOVEVSVkFMID0gMTgwMDAwIC8vIDMgbWludXRlcyAqIDYwIHNlY29uZHMgKiAxMDAwIG1pbGlzZWNvbmRzXG5cbmNvbnN0IG1lc3NhZ2VzID0gZGVmaW5lTWVzc2FnZXMoe1xuICBsb2FkaW5nRG90czoge1xuICAgIGlkOiAnbG9hZGluZ0RvdHMnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnTG9hZGluZy4uLidcbiAgfSxcbiAgdGhlcmVBcmVOb0ZpbGVzOiB7XG4gICAgaWQ6ICd0aGVyZUFyZU5vRmlsZXMnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlcmUgYXJlIG5vIGZpbGVzJ1xuICB9LFxuICB1cGxvYWREaXNhYmxlZDoge1xuICAgIGlkOiAndXBsb2FkLWRpc2FibGVkJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1VwbG9hZCBkaXNhYmxlZCBvbiB0aGlzIGRpcmVjdG9yeSdcbiAgfSxcbiAgZmlsZXNEb3dubG9hZExpbWl0OiB7XG4gICAgaWQ6ICdmaWxlc0Rvd25sb2FkTGltaXQnLFxuICAgIGRlZmluZU1lc3NhZ2U6ICdDdXJyZW50bHksIHRoZSBkb3dubG9hZCBpcyBzdXBwb3J0ZWQgb25seSB3aXRoIGl0ZW1zIG9mIDEwME1CIG9yIGxlc3MuJyxcbiAgICBkZXNjcmlwdGlvbjogJ0ZpbGVzIHNpemUgbGltaXRhdGlvbiBtZXNzYWdlJ1xuICB9LFxuICBlcnJvcjoge1xuICAgIGlkOiAnZXJyb3InLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRXJyb3InXG4gIH1cbn0pXG5cbmV4cG9ydCBjbGFzcyBGaWxlc01haW4gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBzaG93RG93bmxvYWRzOiBmYWxzZSxcbiAgICAgIHNob3dVcGxvYWRzOiBmYWxzZSxcbiAgICAgIGlzVXBsb2FkaW5nOiBmYWxzZSxcbiAgICAgIGlzRG93bmxvYWRpbmc6IGZhbHNlXG4gICAgfVxuXG4gICAgdGhpcy5vcGVuVXBsb2FkcyA9ICgpID0+IHRoaXMuc2V0U3RhdGUoeyBzaG93VXBsb2FkczogdHJ1ZSB9KVxuICAgIHRoaXMuY2xvc2VVcGxvYWRzID0gKCkgPT4gdGhpcy5zZXRTdGF0ZSh7IHNob3dVcGxvYWRzOiBmYWxzZSB9KVxuICAgIHRoaXMudG9nZ2xlVXBsb2FkcyA9ICgpID0+IHRoaXMuc2V0U3RhdGUoeyBzaG93VXBsb2FkczogIXRoaXMuc3RhdGUuc2hvd1VwbG9hZHMgfSlcblxuICAgIHRoaXMub3BlbkRvd25sb2FkcyA9ICgpID0+IHRoaXMuc2V0U3RhdGUoeyBzaG93RG93bmxvYWRzOiB0cnVlIH0pXG4gICAgdGhpcy5jbG9zZURvd25sb2FkcyA9ICgpID0+IHRoaXMuc2V0U3RhdGUoeyBzaG93RG93bmxvYWRzOiBmYWxzZSB9KVxuICAgIHRoaXMudG9nZ2xlRG93bmxvYWRzID0gKCkgPT4gdGhpcy5zZXRTdGF0ZSh7IHNob3dEb3dubG9hZHM6ICF0aGlzLnN0YXRlLnNob3dEb3dubG9hZHMgfSlcblxuICAgIHRoaXMuY2xlYXJFcnJvciA9IChlKSA9PiB7XG4gICAgICBjb25zdCB7IHBhdGgsIGNsZWFyRXJyb3IgfSA9IHRoaXMucHJvcHNcbiAgICAgIGlmIChjbGVhckVycm9yKSBjbGVhckVycm9yKHBhdGgpXG4gICAgfVxuXG4gICAgdGhpcy5jbGVhckl0ZW1FcnJvciA9IChwYXRoKSA9PiAoZSkgPT4ge1xuICAgICAgY29uc3QgeyBjbGVhckl0ZW1FcnJvciB9ID0gdGhpcy5wcm9wc1xuICAgICAgaWYgKGNsZWFySXRlbUVycm9yKSBjbGVhckl0ZW1FcnJvcihwYXRoKVxuICAgIH1cblxuICAgIHRoaXMuY2xlYXJEb3dubG9hZEVycm9yID0gKHBhdGgpID0+IChlKSA9PiB7XG4gICAgICBjb25zdCB7IGNsZWFyRG93bmxvYWRFcnJvciB9ID0gdGhpcy5wcm9wc1xuICAgICAgaWYgKGNsZWFyRG93bmxvYWRFcnJvcikgY2xlYXJEb3dubG9hZEVycm9yKHBhdGgpXG4gICAgfVxuXG4gICAgdGhpcy5jbGVhclVwbG9hZEVycm9yID0gKHBhdGgpID0+IChlKSA9PiB7XG4gICAgICBjb25zdCB7IGNsZWFyVXBsb2FkRXJyb3IgfSA9IHRoaXMucHJvcHNcbiAgICAgIGlmIChjbGVhclVwbG9hZEVycm9yKSBjbGVhclVwbG9hZEVycm9yKHBhdGgpXG4gICAgfVxuXG4gICAgY29uc3QgYWRkRmlsZSA9IChmaWxlSGFuZGxlKSA9PiB7XG4gICAgICAvLyBTdGFydCB0byB1cGxvYWQgYSBmaWxlXG4gICAgICBjb25zdCB7IHBhdGgsIHNlcGFyYXRvciB9ID0gdGhpcy5wcm9wc1xuICAgICAgY29uc3QgdHlwZU9TID0gc2VwYXJhdG9yID09PSAnLycgPyAnbGludXgnIDogJ3dpbidcbiAgICAgIGNvbnN0IGZpbGUgPSBuZXcgVXNlckZpbGUoZmlsZUhhbmRsZSwgcGF0aCwgdHlwZU9TKVxuICAgICAgRmlsZXNVcGxvYWRDb250cm9sbGVyLmFkZEZpbGUoZmlsZSlcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVGaWxlc0Ryb3AgPSAoYWNjZXB0ZWRGaWxlcykgPT4ge1xuICAgICAgaWYgKHRoaXMucHJvcHMuaXNXcml0YWJsZSkgYWNjZXB0ZWRGaWxlcy5mb3JFYWNoKGFkZEZpbGUpXG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVVcGxvYWRDb21wbGV0ZWQgPSAocGF0aG5hbWUpID0+IHtcbiAgICAgIC8vIFVwZGF0ZSB0aGUgZGlyZWN0b3J5IG9mIHRoZSBjb21wbGV0ZWQgZmlsZVxuICAgICAgY29uc3QgeyBzZXBhcmF0b3IsIGZldGNoRmlsZXMgfSA9IHRoaXMucHJvcHNcbiAgICAgIGNvbnN0IHR5cGVPUyA9IHNlcGFyYXRvciA9PT0gJy8nID8gJ2xpbnV4JyA6ICd3aW4nXG4gICAgICBjb25zdCBmaWxlID0gbmV3IEZpbGVJdGVtKHBhdGhuYW1lLCB7fSwgdHlwZU9TKVxuICAgICAgZmV0Y2hGaWxlcyhmaWxlLmRpcm5hbWUpXG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVVcGxvYWRQcm9ncmVzcyA9IChwYXRobmFtZSwgcHJvZ3Jlc3MpID0+IHtcbiAgICAgIGlmIChwcm9ncmVzcyA+PSAxMDApIHRoaXMuaGFuZGxlVXBsb2FkQ29tcGxldGVkKHBhdGhuYW1lKVxuICAgIH1cblxuICAgIGNvbnN0IGlzVXBsb2FkaW5nID0gKCkgPT4gRmlsZXNVcGxvYWRDb250cm9sbGVyLmZpbGVzLmxlbmd0aCA+IDBcbiAgICB0aGlzLmNoZWNrVXBsb2FkaW5nID0gKCkgPT4gdGhpcy5zZXRTdGF0ZSh7IGlzVXBsb2FkaW5nOiBpc1VwbG9hZGluZygpIH0pXG4gICAgY29uc3QgaXNEb3dubG9hZGluZyA9ICgpID0+IEZpbGVzRG93bmxvYWRDb250cm9sbGVyLmZpbGVzLmxlbmd0aCA+IDBcbiAgICB0aGlzLmNoZWNrRG93bmxvYWRpbmcgPSAoKSA9PiB0aGlzLnNldFN0YXRlKHsgaXNEb3dubG9hZGluZzogaXNEb3dubG9hZGluZygpIH0pXG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGlzV3JpdGFibGUsIHBhdGgsIHNlcGFyYXRvciwgaXRlbXMsIGlzRmV0Y2hpbmcsIHJlY2VpdmVkQXQsXG4gICAgICBmZXRjaEZpbGVzLCBjZCwgZGVsZXRlRmlsZSxcbiAgICAgIGVycm9yLCBlcnJvckNvZGUsIGl0ZW1zRXJyb3JzLCBkb3dubG9hZEVycm9ycywgdXBsb2FkRXJyb3JzLFxuICAgICAgc2hvd0hlYWRlciwgaW50bDogeyBmb3JtYXRNZXNzYWdlIH1cbiAgICB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgaXNEb3dubG9hZGluZywgc2hvd0Rvd25sb2FkcywgaXNVcGxvYWRpbmcsIHNob3dVcGxvYWRzIH0gPSB0aGlzLnN0YXRlXG5cbiAgICByZXR1cm4gKFxuICAgICAgPEZpbGVEcm9wem9uZVxuICAgICAgICBvbkRyb3A9e3RoaXMuaGFuZGxlRmlsZXNEcm9wfVxuICAgICAgICBvdmVybGF5TWVzc2FnZT17PEZpbGVEcm9wTWVzc2FnZSB1cGxvYWRFbmFibGVkPXtpc1dyaXRhYmxlfSAvPn1cbiAgICAgICAgb3ZlcmxheU9mZnNldFRvcD17c2hvd0hlYWRlciA/IDUwIDogMH1cbiAgICAgICAgZGlzYWJsZUNsaWNrXG4gICAgICAgIGRpc2FibGVQcmV2aWV3PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nZmlsZXMtbWFpbic+XG4gICAgICAgICAgPEZpbGVzQnJlYWRjcnVtYnMgcGF0aG5hbWU9e3BhdGh9IHNlcGFyYXRvcj17c2VwYXJhdG9yfSBvblNlbGVjdGlvbj17Y2R9IC8+XG4gICAgICAgICAgeyBlcnJvciAmJlxuICAgICAgICAgICAgPEFsZXJ0IGJzU3R5bGU9J2Rhbmdlcicgb25EaXNtaXNzPXt0aGlzLmNsZWFyRXJyb3J9PlxuICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZVxuICAgICAgICAgICAgICAgIHsuLi4obWVzc2FnZXNbZXJyb3JDb2RlXSB8fCBtZXNzYWdlcy5lcnJvcil9XG4gICAgICAgICAgICAgICAgdmFsdWVzPXt7IHBhdGggfX0gLz5cbiAgICAgICAgICAgIDwvQWxlcnQ+XG4gICAgICAgICAgfVxuICAgICAgICAgIHsgaXRlbXNFcnJvcnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgaXRlbXNFcnJvcnMubWFwKCh7IHBhdGgsIGNvZGUsIG1lc3NhZ2UgfSwgaSkgPT4gKFxuICAgICAgICAgICAgICA8QWxlcnQga2V5PXtpfSBic1N0eWxlPSdkYW5nZXInIG9uRGlzbWlzcz17dGhpcy5jbGVhckl0ZW1FcnJvcihwYXRoKX0+XG4gICAgICAgICAgICAgICAgeyBtZXNzYWdlIH1cbiAgICAgICAgICAgICAgPC9BbGVydD5cbiAgICAgICAgICAgICkpXG4gICAgICAgICAgfVxuICAgICAgICAgIHsgIXNob3dEb3dubG9hZHMgJiYgZG93bmxvYWRFcnJvcnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgZG93bmxvYWRFcnJvcnMubWFwKCh7IHBhdGgsIGNvZGUsIG1lc3NhZ2UgfSwgaSkgPT4gKFxuICAgICAgICAgICAgICA8QWxlcnQga2V5PXtpfSBic1N0eWxlPSdkYW5nZXInIG9uRGlzbWlzcz17dGhpcy5jbGVhckRvd25sb2FkRXJyb3IocGF0aCl9PlxuICAgICAgICAgICAgICAgIHsgbWVzc2FnZSB9XG4gICAgICAgICAgICAgIDwvQWxlcnQ+XG4gICAgICAgICAgICApKVxuICAgICAgICAgIH1cbiAgICAgICAgICB7ICFzaG93VXBsb2FkcyAmJiB1cGxvYWRFcnJvcnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgdXBsb2FkRXJyb3JzLm1hcCgoeyBwYXRoLCBjb2RlLCBtZXNzYWdlIH0sIGkpID0+IChcbiAgICAgICAgICAgICAgPEFsZXJ0IGtleT17aX0gYnNTdHlsZT0nZGFuZ2VyJyBvbkRpc21pc3M9e3RoaXMuY2xlYXJVcGxvYWRFcnJvcihwYXRoKX0+XG4gICAgICAgICAgICAgICAgeyBtZXNzYWdlIH1cbiAgICAgICAgICAgICAgPC9BbGVydD5cbiAgICAgICAgICAgICkpXG4gICAgICAgICAgfVxuICAgICAgICAgIHsgIWVycm9yICYmXG4gICAgICAgICAgICA8RmlsZXNCdXR0b25zXG4gICAgICAgICAgICAgIGRpcm5hbWU9e3BhdGh9XG4gICAgICAgICAgICAgIHNlcGFyYXRvcj17c2VwYXJhdG9yfVxuICAgICAgICAgICAgICBsYXN0VXBkYXRlPXtyZWNlaXZlZEF0fVxuICAgICAgICAgICAgICBvblJlZnJlc2hDbGljaz17KCkgPT4gZmV0Y2hGaWxlcyhwYXRoKX1cbiAgICAgICAgICAgICAgaXNVcGxvYWRpbmc9e2lzVXBsb2FkaW5nfVxuICAgICAgICAgICAgICBzaG93VXBsb2Fkcz17c2hvd1VwbG9hZHN9XG4gICAgICAgICAgICAgIHVwbG9hZEVuYWJsZWQ9e2lzV3JpdGFibGV9XG4gICAgICAgICAgICAgIG9uVXBsb2Fkc0NsaWNrPXt0aGlzLnRvZ2dsZVVwbG9hZHN9XG4gICAgICAgICAgICAgIGlzRG93bmxvYWRpbmc9e2lzRG93bmxvYWRpbmd9XG4gICAgICAgICAgICAgIHNob3dEb3dubG9hZHM9e3Nob3dEb3dubG9hZHN9XG4gICAgICAgICAgICAgIG9uRG93bmxvYWRzQ2xpY2s9e3RoaXMudG9nZ2xlRG93bmxvYWRzfSAvPlxuICAgICAgICAgIH1cbiAgICAgICAgICB7IGlzRmV0Y2hpbmcgJiYgPGJyIC8+IH1cbiAgICAgICAgICB7IGlzRmV0Y2hpbmcgJiZcbiAgICAgICAgICAgIDxBbGVydD48Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMubG9hZGluZ0RvdHN9IC8+PC9BbGVydD5cbiAgICAgICAgICB9XG4gICAgICAgICAgeyByZWNlaXZlZEF0ICYmIDxiciAvPiB9XG4gICAgICAgICAgeyByZWNlaXZlZEF0ICYmIGl0ZW1zLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgPEFsZXJ0IGJzU3R5bGU9J2Rhbmdlcic+XG4gICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy50aGVyZUFyZU5vRmlsZXN9IC8+XG4gICAgICAgICAgICA8L0FsZXJ0PlxuICAgICAgICAgIH1cbiAgICAgICAgICB7IHJlY2VpdmVkQXQgJiYgaXRlbXMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgPEZpbGVzVGFibGVcbiAgICAgICAgICAgICAgaXRlbXM9e2l0ZW1zfVxuICAgICAgICAgICAgICBvbkl0ZW1DbGljaz17XG4gICAgICAgICAgICAgICAgKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzRGlyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNkKGl0ZW0ucGF0aClcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxJdGVtID0gaXRlbXMuZmluZCgoaSkgPT4gaXRlbS5wYXRoID09PSBpLnBhdGgpXG4gICAgICAgICAgICAgICAgICAgIGlmICghZnVsbEl0ZW0pIHJldHVyblxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICAgICAgICBwYXRoLFxuICAgICAgICAgICAgICAgICAgICAgIHNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWNhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICBjYW5CZURlbGV0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgaXNSZWFkYWJsZTogcmVhZGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgaXNXcml0YWJsZTogd3JpdGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgaXNXaW5cbiAgICAgICAgICAgICAgICAgICAgfSA9IGZ1bGxJdGVtXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZUl0ZW0gPSBuZXcgRmlsZUl0ZW0ocGF0aCwge1xuICAgICAgICAgICAgICAgICAgICAgIHNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgbGFzdE1vZGlmaWNhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICBjYW5CZURlbGV0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgcmVhZGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGVcbiAgICAgICAgICAgICAgICAgICAgfSwgaXNXaW4gPyAnd2luJyA6ICdsaW51eCcpXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlSXRlbS5zaXplIHx8IGZpbGVJdGVtLnNpemUgPCAoRE9XTkxPQURfU0laRV9MSU1JVCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5hZGRGaWxlKGZpbGVJdGVtKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIGFsZXJ0IGlzIGFuIHVnbHkgd2F5LiBSZWZhY3RvciBpbiB0aGUgZnV0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFsZXJ0KGZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuZmlsZXNEb3dubG9hZExpbWl0KSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkZWxldGVGaWxlPXtkZWxldGVGaWxlfSAvPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L0ZpbGVEcm9wem9uZT5cbiAgICApXG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgY29uc3QgeyBwYXRoLCBmZXRjaEZpbGVzIH0gPSB0aGlzLnByb3BzXG4gICAgZmV0Y2hGaWxlcyhwYXRoKVxuICAgIEZpbGVzVXBsb2FkQ29udHJvbGxlci5vbignZmlsZScsIHRoaXMuY2hlY2tVcGxvYWRpbmcpXG4gICAgRmlsZXNVcGxvYWRDb250cm9sbGVyLm9uKCdwcm9ncmVzcycsIHRoaXMuaGFuZGxlVXBsb2FkUHJvZ3Jlc3MpXG4gICAgRmlsZXNEb3dubG9hZENvbnRyb2xsZXIub24oJ2ZpbGUnLCB0aGlzLmNoZWNrRG93bmxvYWRpbmcpXG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCAoKSB7XG4gICAgRmlsZXNVcGxvYWRDb250cm9sbGVyLnJlbW92ZUxpc3RlbmVyKCdmaWxlJywgdGhpcy5jaGVja1VwbG9hZGluZylcbiAgICBGaWxlc1VwbG9hZENvbnRyb2xsZXIucmVtb3ZlTGlzdGVuZXIoJ3Byb2dyZXNzJywgdGhpcy5oYW5kbGVVcGxvYWRQcm9ncmVzcylcbiAgICBGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5yZW1vdmVMaXN0ZW5lcignZmlsZScsIHRoaXMuY2hlY2tEb3dubG9hZGluZylcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgKHsgcGF0aDogbmV4dFBhdGgsIGlzRmV0Y2hpbmcsIHJlY2VpdmVkQXQsIG5vdyB9KSB7XG4gICAgY29uc3QgeyBwYXRoLCBmZXRjaEZpbGVzIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgY2FjaGUgPSBub3cgJiYgcmVjZWl2ZWRBdCAmJlxuICAgICAgbm93LmdldFRpbWUoKSAtIHJlY2VpdmVkQXQuZ2V0VGltZSgpIDwgQ0FDSEVfSU5URVJWQUxcbiAgICBpZiAocGF0aCAhPT0gbmV4dFBhdGggJiYgIWlzRmV0Y2hpbmcgJiYgIWNhY2hlKSBmZXRjaEZpbGVzKG5leHRQYXRoKVxuICB9XG59XG5cbkZpbGVzTWFpbi5wcm9wVHlwZXMgPSB7XG4gIHBhdGg6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGlzV3JpdGFibGU6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBzZXBhcmF0b3I6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGl0ZW1zOiBSZWFjdC5Qcm9wVHlwZXMuYXJyYXksXG4gIGlzRmV0Y2hpbmc6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICByZWNlaXZlZEF0OiBSZWFjdC5Qcm9wVHlwZXMuaW5zdGFuY2VPZihEYXRlKSxcblxuICBjZDogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgZmV0Y2hGaWxlczogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcblxuICBkZWxldGVGaWxlOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcblxuICBlcnJvcjogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGVycm9yQ29kZTogUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgZXJyb3JNZXNzYWdlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBjbGVhckVycm9yOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcblxuICBpdGVtc0Vycm9yczogUmVhY3QuUHJvcFR5cGVzLmFycmF5T2YoUmVhY3QuUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBwYXRoOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNvZGU6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gICAgbWVzc2FnZTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZ1xuICB9KSksXG4gIGNsZWFySXRlbUVycm9yOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcblxuICBkb3dubG9hZEVycm9yczogUmVhY3QuUHJvcFR5cGVzLmFycmF5T2YoUmVhY3QuUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBwYXRoOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNvZGU6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gICAgbWVzc2FnZTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZ1xuICB9KSksXG4gIGNsZWFyRG93bmxvYWRFcnJvcjogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG5cbiAgdXBsb2FkRXJyb3JzOiBSZWFjdC5Qcm9wVHlwZXMuYXJyYXlPZihSZWFjdC5Qcm9wVHlwZXMuc2hhcGUoe1xuICAgIHBhdGg6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gICAgY29kZTogUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgICBtZXNzYWdlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nXG4gIH0pKSxcbiAgY2xlYXJVcGxvYWRFcnJvcjogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG5cbiAgc2hvd0hlYWRlcjogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIG5vdzogUmVhY3QuUHJvcFR5cGVzLmluc3RhbmNlT2YoRGF0ZSksXG4gIGludGw6IGludGxTaGFwZS5pc1JlcXVpcmVkXG59XG5cbkZpbGVzTWFpbi5kZWZhdWx0UHJvcHMgPSB7XG4gIGlzV3JpdGFibGU6IGZhbHNlLFxuICBwYXRoOiAnJyxcbiAgc2VwYXJhdG9yOiAnLycsXG4gIGl0ZW1zOiBbXSxcblxuICBpdGVtc0Vycm9yczogW10sXG4gIGRvd25sb2FkRXJyb3JzOiBbXSxcbiAgdXBsb2FkRXJyb3JzOiBbXVxufVxuXG5jb25zdCBwYXJzZUl0ZW1zID0gKGl0ZW1zKSA9PiBpdGVtc1xuICAuc29ydCgoYSwgYikgPT4ge1xuICAgIGlmIChhLmlzRGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGlmIChiLmlzRGlyKSByZXR1cm4gMVxuICAgIGVsc2UgcmV0dXJuIDBcbiAgfSlcbiAgLm1hcCgoe1xuICAgIHBhdGgsIGJhc2VuYW1lLCBpc0RpciwgaXNEcml2ZSwgaXNGaWxlLCBzaXplLCBtaW1lVHlwZSwgbGFzdE1vZGlmaWNhdGlvbixcbiAgICBpc1JlYWRhYmxlLCBpc1dyaXRhYmxlLCBjYW5CZURlbGV0ZWQsIGlzRGVsZXRpbmcsIGlzV2luXG4gIH0sIGluZGV4KSA9PiAoe1xuICAgIGJhc2VuYW1lOiB7XG4gICAgICBwYXRoLFxuICAgICAgbmFtZTogYmFzZW5hbWUsXG4gICAgICBpc0RpcixcbiAgICAgIGlzRHJpdmUsXG4gICAgICBpc1JlYWRhYmxlXG4gICAgfSxcbiAgICBidXR0b25zOiB7XG4gICAgICBwYXRoLFxuICAgICAgaXNGaWxlLFxuICAgICAgaXNEZWxldGluZyxcbiAgICAgIGNhbkJlRGVsZXRlZDogY2FuQmVEZWxldGVkICYmIGlzV3JpdGFibGVcbiAgICB9LFxuICAgIHBhdGgsXG4gICAgc2l6ZSxcbiAgICBsYXN0TW9kaWZpY2F0aW9uLFxuICAgIG1pbWVUeXBlLFxuICAgIGNhbkJlRGVsZXRlZCxcbiAgICBpc1JlYWRhYmxlLFxuICAgIGlzV3JpdGFibGUsXG4gICAgaXNXaW5cbiAgfSkpXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBhcHA6IHsgc2hvd0hlYWRlciB9LCBmaWxlcyB9KSA9PiB7XG4gIGNvbnN0IGN1cnJlbnRQYXRoQXJyYXkgPSBmaWxlcy5wYXRoQXJyYXlcbiAgY29uc3Qgc2VwYXJhdG9yID0gKGZpbGVzLnJvb3RJc1Bvc2l4KSA/ICcvJyA6ICdcXFxcJ1xuICBjb25zdCB7XG4gICAgaXNGZXRjaGluZywgcmVjZWl2ZWRBdCwgZXJyb3IsIGVycm9yQ29kZSwgZXJyb3JNZXNzYWdlXG4gIH0gPSBnZXRJdGVtc01ldGFkYXRhKGZpbGVzLCBjdXJyZW50UGF0aEFycmF5KSB8fCB7fVxuXG4gIGNvbnN0IGlzV3JpdGFibGUgPSBjdXJyZW50UGF0aEFycmF5Lmxlbmd0aCA9PT0gMFxuICAgID8gZmlsZXMucm9vdElzV3JpdGFibGVcbiAgICA6IChnZXREaXIoZmlsZXMsIGN1cnJlbnRQYXRoQXJyYXkpIHx8IHt9KS5pc1dyaXRhYmxlXG5cbiAgY29uc3QgaXRlbXNFcnJvcnMgPSBnZXRJdGVtc0Vycm9ycyhmaWxlcywgY3VycmVudFBhdGhBcnJheSlcbiAgY29uc3QgZG93bmxvYWRFcnJvcnMgPSBnZXREb3dubG9hZEVycm9ycyhmaWxlcylcbiAgY29uc3QgdXBsb2FkRXJyb3JzID0gZ2V0VXBsb2FkRXJyb3JzKGZpbGVzKVxuXG4gIHJldHVybiB7XG4gICAgaXRlbXM6IHBhcnNlSXRlbXMoZ2V0SXRlbXMoZmlsZXMsIGN1cnJlbnRQYXRoQXJyYXkpIHx8IFtdKSxcbiAgICBwYXRoOiBjdXJyZW50UGF0aEFycmF5LmpvaW4oc2VwYXJhdG9yKSxcbiAgICByb290SXNXaW46IGZpbGVzLnJvb3RJc1dpbixcbiAgICBzZXBhcmF0b3IsXG4gICAgaXNXcml0YWJsZSxcbiAgICBpc0ZldGNoaW5nLFxuICAgIHJlY2VpdmVkQXQsXG4gICAgZXJyb3IsXG4gICAgZXJyb3JDb2RlLFxuICAgIGVycm9yTWVzc2FnZSxcbiAgICBpdGVtc0Vycm9ycyxcbiAgICBkb3dubG9hZEVycm9ycyxcbiAgICB1cGxvYWRFcnJvcnMsXG4gICAgc2hvd0hlYWRlcixcbiAgICBub3c6IG5ldyBEYXRlKClcbiAgfVxufVxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gKGRpc3BhdGNoKSA9PiAoe1xuICBjZDogKHBhdGgpID0+IGRpc3BhdGNoKGNkKHBhdGgpKSxcbiAgZmV0Y2hGaWxlczogKHBhdGgpID0+IGRpc3BhdGNoKGZldGNoRmlsZXMocGF0aCkpLFxuICBjbGVhckVycm9yOiAocGF0aCkgPT4gZGlzcGF0Y2goY2xlYXJGaWxlc0Vycm9yKHBhdGgpKSxcbiAgY2xlYXJJdGVtRXJyb3I6IChwYXRoKSA9PiBkaXNwYXRjaChjbGVhckZpbGVFcnJvcihwYXRoKSksXG4gIGNsZWFyRG93bmxvYWRFcnJvcjogKHBhdGgpID0+IGRpc3BhdGNoKGNsZWFyRG93bmxvYWRGaWxlRXJyb3IocGF0aCkpLFxuICBjbGVhclVwbG9hZEVycm9yOiAocGF0aCkgPT4gZGlzcGF0Y2goY2xlYXJVcGxvYWRGaWxlRXJyb3IocGF0aCkpLFxuICBkZWxldGVGaWxlOiAocGF0aCkgPT4gZGlzcGF0Y2goZGVsZXRlRmlsZShwYXRoKSlcbn0pXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KFxuICBtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wc1xuKShpbmplY3RJbnRsKEZpbGVzTWFpbikpXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBCdXR0b24sIEdseXBoaWNvbiwgT3ZlcmxheVRyaWdnZXIsIFBvcG92ZXIgfSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQge1xuICBkZWZpbmVNZXNzYWdlcywgaW5qZWN0SW50bCwgaW50bFNoYXBlLCBGb3JtYXR0ZWRNZXNzYWdlXG59IGZyb20gJ3JlYWN0LWludGwnXG5pbXBvcnQgaHVtYW5pemUgZnJvbSAnaHVtYW5pemUnXG5cbmltcG9ydCBEYXRhVGFibGUsIHsgRGF0YUNvbHVtbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9jb21wb25lbnRzL2RhdGEtdGFibGUnXG5cbmNvbnN0IG1lc3NhZ2VzID0gZGVmaW5lTWVzc2FnZXMoe1xuICBuYW1lOiB7XG4gICAgaWQ6ICduYW1lJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ05hbWUnXG4gIH0sXG4gIHNpemU6IHtcbiAgICBpZDogJ3NpemUnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnU2l6ZSdcbiAgfSxcbiAgbGFzdE1vZGlmaWNhdGlvbjoge1xuICAgIGlkOiAnbGFzdE1vZGlmaWNhdGlvbicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdMYXN0IG1vZGlmaWNhdGlvbidcbiAgfSxcbiAgYWN0aW9uczoge1xuICAgIGlkOiAnYWN0aW9ucycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdBY3Rpb25zJ1xuICB9LFxuICB0aGVGaWxlV2lsbEJlRGVsZXRlZDoge1xuICAgIGlkOiAndGhlRmlsZVdpbGxCZURlbGV0ZWQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlIGZpbGUgd2lsbCBiZSBkZWxldGVkJ1xuICB9LFxuICB5ZXM6IHtcbiAgICBpZDogJ3llcycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdZZXMnXG4gIH0sXG4gIGFyZVlvdVN1cmVRdWVzdGlvbk1hcms6IHtcbiAgICBpZDogJ2FyZVlvdVN1cmVRdWVzdGlvbk1hcmsnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnQXJlIHlvdSBzdXJlPydcbiAgfSxcbiAgZGVsZXRlOiB7XG4gICAgaWQ6ICdkZWxldGUnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRGVsZXRlJ1xuICB9XG59KVxuXG5jbGFzcyBGaWxlc1RhYmxlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICB0aGlzLmhhbmRsZVJlc2l6ZSA9IChldmVudCkgPT4ge1xuICAgICAgY29uc3QgaGVpZ2h0V2luZG93ID0gTnVtYmVyLmlzTmFOKHdpbmRvdy5pbm5lckhlaWdodClcbiAgICAgICAgPyB3aW5kb3cuY2xpZW50SGVpZ2h0XG4gICAgICAgIDogd2luZG93LmlubmVySGVpZ2h0XG4gICAgICBjb25zdCBoZWlnaHRGaWxlc0J1dHRvbnMgPSAodGhpcy50YWJsZVJlZikgPyB0aGlzLnRhYmxlUmVmLm9mZnNldFRvcCA6IDBcblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGhlaWdodDogKGhlaWdodFdpbmRvdykgPyAoaGVpZ2h0V2luZG93IC0gaGVpZ2h0RmlsZXNCdXR0b25zKSAtIDEwIDogMFxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZUl0ZW1DbGljayA9IChpdGVtKSA9PiAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG5cbiAgICAgIGNvbnN0IHsgb25JdGVtQ2xpY2sgfSA9IHRoaXMucHJvcHNcbiAgICAgIGlmIChvbkl0ZW1DbGljaykgb25JdGVtQ2xpY2soaXRlbSlcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZURlbGV0ZSA9IChwYXRoKSA9PiAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG5cbiAgICAgIGNvbnN0IHsgZGVsZXRlRmlsZSB9ID0gdGhpcy5wcm9wc1xuICAgICAgaWYgKGRlbGV0ZUZpbGUpIGRlbGV0ZUZpbGUocGF0aClcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZU5hbWVTb3J0ID0gKHNvcnRLZXksIHNvcnRUeXBlKSA9PiB7XG4gICAgICByZXR1cm4gKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBhW3NvcnRLZXldID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgdHlwZW9mIGJbc29ydEtleV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2YWxBID0gYVtzb3J0S2V5XS5uYW1lXG4gICAgICAgIGxldCB2YWxCID0gYltzb3J0S2V5XS5uYW1lXG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWxBID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgdHlwZW9mIHZhbEIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsQSA9PT0gJ3N0cmluZycpIHZhbEEgPSB2YWxBLnRvTG93ZXJDYXNlKClcbiAgICAgICAgaWYgKHR5cGVvZiB2YWxCID09PSAnc3RyaW5nJykgdmFsQiA9IHZhbEIudG9Mb3dlckNhc2UoKVxuXG4gICAgICAgIGlmIChzb3J0VHlwZSA9PT0gJ0FTQycpIHtcbiAgICAgICAgICBpZiAodmFsQSA8IHZhbEIpIHJldHVybiAtMVxuICAgICAgICAgIGlmICh2YWxBID4gdmFsQikgcmV0dXJuIDFcbiAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh2YWxBID4gdmFsQikgcmV0dXJuIC0xXG4gICAgICAgICAgaWYgKHZhbEEgPCB2YWxCKSByZXR1cm4gMVxuICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZVJvd1NlbGVjdGVkID0gdGhpcy5wcm9wcy5vblJvd1NlbGVjdGVkXG4gICAgICA/IHRoaXMucHJvcHMub25Sb3dTZWxlY3RlZFxuICAgICAgOiAoaWRlbnRpZmllciwgcm93RGF0YSkgPT4ge31cblxuICAgIHRoaXMuaGFuZGxlUm93VW5zZWxlY3RlZCA9IHRoaXMucHJvcHMub25Sb3dVbnNlbGVjdGVkXG4gICAgICA/IHRoaXMucHJvcHMub25Sb3dVbnNlbGVjdGVkXG4gICAgICA6IChpZGVudGlmaWVyLCByb3dEYXRhKSA9PiB7fVxuXG4gICAgdGhpcy5zdGF0ZSA9IHsgaGVpZ2h0OiAwIH1cbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBoZWlnaHQgfSA9IHRoaXMuc3RhdGVcbiAgICBjb25zdCB7IGl0ZW1zLCBpbnRsOiB7IGZvcm1hdE1lc3NhZ2UsIGZvcm1hdFJlbGF0aXZlIH0gfSA9IHRoaXMucHJvcHNcblxuICAgIGNvbnN0IHBhdGhDb2wgPSBuZXcgRGF0YUNvbHVtbih7XG4gICAgICBkYXRhS2V5OiAncGF0aCcsXG4gICAgICBuYW1lOiAnUGF0aCcsXG4gICAgICBoaWRkZW46IHRydWVcbiAgICB9KVxuICAgIGNvbnN0IG5hbWVDb2wgPSBuZXcgRGF0YUNvbHVtbih7XG4gICAgICBkYXRhS2V5OiAnYmFzZW5hbWUnLFxuICAgICAgbmFtZTogZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5uYW1lKSxcbiAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgc29ydFByb3BzOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAnc29ydC1oYW5kbGVyJzogdGhpcy5oYW5kbGVOYW1lU29ydFxuICAgICAgfSxcbiAgICAgIGFsaWduOiAnbGVmdCcsXG4gICAgICBjZWxsRm9ybWF0dGVyOiAoZGF0YSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLm5hbWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBkYXRhLmlzRGlyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICB0eXBlb2YgZGF0YS5wYXRoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY29uc3QgZ2x5cGggPSBkYXRhLmlzRGlyXG4gICAgICAgICAgICAgID8gZGF0YS5pc0RyaXZlXG4gICAgICAgICAgICAgICAgPyAnaGRkJ1xuICAgICAgICAgICAgICAgIDogJ2ZvbGRlci1vcGVuJ1xuICAgICAgICAgICAgICA6ICdmaWxlJ1xuICAgICAgICAgICAgY29uc3QgY2VsbENvbnRlbnQgPSAoXG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD17Z2x5cGh9IC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+eyBkYXRhLm5hbWUgfTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAoZGF0YS5pc1JlYWRhYmxlKSB7XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGEgY2xhc3NOYW1lPSdmaWxlLWxpbmsnIG9uQ2xpY2s9e3RoaXMuaGFuZGxlSXRlbUNsaWNrKGRhdGEpfT5cbiAgICAgICAgICAgICAgICAgIHsgY2VsbENvbnRlbnQgfVxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gQ2FuJ3QgYmUgZG93bmxvYWRlZFxuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT0nZmlsZS1saW5rJz5cbiAgICAgICAgICAgICAgICAgIHsgY2VsbENvbnRlbnQgfVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJ04vQSdcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGFcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgY29uc3Qgc2l6ZUNvbCA9IG5ldyBEYXRhQ29sdW1uKHtcbiAgICAgIGRhdGFLZXk6ICdzaXplJyxcbiAgICAgIG5hbWU6IGZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuc2l6ZSksXG4gICAgICBhbGlnbjogJ3JpZ2h0JyxcbiAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgd2lkdGg6ICcyMCUnLFxuICAgICAgc29ydFByb3BzOiB7XG4gICAgICAgIHR5cGU6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAgY2VsbEZvcm1hdHRlcjogKHNpemUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzaXplID09PSAndW5kZWZpbmVkJykgc2l6ZSA9IGh1bWFuaXplLmZpbGVzaXplKDApXG4gICAgICAgIGVsc2UgaWYgKHNpemUgPT09IGZhbHNlKSBzaXplID0gJy0tJ1xuICAgICAgICBlbHNlIHNpemUgPSBodW1hbml6ZS5maWxlc2l6ZShzaXplKVxuICAgICAgICByZXR1cm4gc2l6ZVxuICAgICAgfVxuICAgIH0pXG4gICAgY29uc3QgbG1vZENvbCA9IG5ldyBEYXRhQ29sdW1uKHtcbiAgICAgIGRhdGFLZXk6ICdsYXN0TW9kaWZpY2F0aW9uJyxcbiAgICAgIG5hbWU6IGZvcm1hdE1lc3NhZ2UobWVzc2FnZXMubGFzdE1vZGlmaWNhdGlvbiksXG4gICAgICBhbGlnbjogJ3JpZ2h0JyxcbiAgICAgIHdpZHRoOiAnMjAlJyxcbiAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgY2VsbEZvcm1hdHRlcjogKHRpbWVzdGFtcCkgPT4gdGltZXN0YW1wID49IDBcbiAgICAgICAgPyBmb3JtYXRSZWxhdGl2ZSh0aW1lc3RhbXAgKiAxMDAwKVxuICAgICAgICA6ICctLSdcbiAgICB9KVxuICAgIGNvbnN0IGJ1dHRvbnNDb2wgPSBuZXcgRGF0YUNvbHVtbih7XG4gICAgICBkYXRhS2V5OiAnYnV0dG9ucycsXG4gICAgICBuYW1lOiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmFjdGlvbnMpLFxuICAgICAgYWxpZ246ICdjZW50ZXInLFxuICAgICAgd2lkdGg6ICc1JScsXG4gICAgICBjZWxsRm9ybWF0dGVyOiAoZGF0YSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmIGRhdGEuaXNGaWxlICYmIGRhdGEuY2FuQmVEZWxldGVkKSB7XG4gICAgICAgICAgaWYgKGRhdGEuaXNEZWxldGluZykge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPEdseXBoaWNvblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nZ2x5cGhpY29uLXJlZnJlc2gtYW5pbWF0ZSdcbiAgICAgICAgICAgICAgICBnbHlwaD0ncmVmcmVzaCcgLz5cbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxPdmVybGF5VHJpZ2dlciB0cmlnZ2VyPSdjbGljaycgcGxhY2VtZW50PSdsZWZ0JyByb290Q2xvc2Ugb3ZlcmxheT17XG4gICAgICAgICAgICAgIDxQb3BvdmVyXG4gICAgICAgICAgICAgICAgaWQ9J3BvcG92ZXItY29uZmlybS1kZWxldGUnXG4gICAgICAgICAgICAgICAgdGl0bGU9e2Zvcm1hdE1lc3NhZ2UobWVzc2FnZXMuYXJlWW91U3VyZVF1ZXN0aW9uTWFyayl9PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSd0ZXh0LWNlbnRlcic+XG4gICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMudGhlRmlsZVdpbGxCZURlbGV0ZWR9IC8+XG4gICAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgYnNTdHlsZT0nZGFuZ2VyJ1xuICAgICAgICAgICAgICAgICAgICBic1NpemU9J3NtYWxsJ1xuICAgICAgICAgICAgICAgICAgICB0aXRsZT0nQ29uZmlybSBkZWxldGlvbidcbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVEZWxldGUoZGF0YS5wYXRoKX0+XG4gICAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy55ZXN9IC8+XG4gICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9Qb3BvdmVyPlxuICAgICAgICAgICAgICB9PlxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgYnNTdHlsZT0nZGVmYXVsdCdcbiAgICAgICAgICAgICAgICBic1NpemU9J3hzbWFsbCdcbiAgICAgICAgICAgICAgICB0aXRsZT17Zm9ybWF0TWVzc2FnZShtZXNzYWdlcy5kZWxldGUpfT5cbiAgICAgICAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSd0cmFzaCcgLz5cbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICA8L092ZXJsYXlUcmlnZ2VyPlxuICAgICAgICAgIClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IGNvbXBvbmVudFN0eWxlID0ge31cbiAgICBpZiAoaGVpZ2h0KSB7XG4gICAgICBjb21wb25lbnRTdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnXG4gICAgICBjb21wb25lbnRTdHlsZS5vdmVyZmxvdyA9ICdhdXRvJ1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGlkPSdmaWxlcy10YWJsZSdcbiAgICAgICAgc3R5bGU9e2NvbXBvbmVudFN0eWxlfVxuICAgICAgICByZWY9eyhyZWYpID0+IHsgdGhpcy50YWJsZVJlZiA9IHJlZiB9fT5cbiAgICAgICAgPERhdGFUYWJsZVxuICAgICAgICAgIGtleVZhbHVlPSdwYXRoJ1xuICAgICAgICAgIGNvbHVtbnM9e1sgcGF0aENvbCwgbmFtZUNvbCwgc2l6ZUNvbCwgbG1vZENvbCwgYnV0dG9uc0NvbCBdfVxuICAgICAgICAgIGRhdGE9e2l0ZW1zfVxuICAgICAgICAgIG9uUm93U2VsZWN0ZWQ9e3RoaXMuaGFuZGxlUm93U2VsZWN0ZWR9XG4gICAgICAgICAgb25Sb3dVbnNlbGVjdGVkPXt0aGlzLmhhbmRsZVJvd1Vuc2VsZWN0ZWR9XG4gICAgICAgICAgaG92ZXJcbiAgICAgICAgICByZXNwb25zaXZlIC8+XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgdGhpcy5oYW5kbGVSZXNpemUoKVxuICAgIGlmICh3aW5kb3cpIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLmhhbmRsZVJlc2l6ZSlcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50ICgpIHtcbiAgICBpZiAod2luZG93KSB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5oYW5kbGVSZXNpemUpXG4gIH1cbn1cblxuRmlsZXNUYWJsZS5wcm9wVHlwZXMgPSB7XG4gIGl0ZW1zOiBSZWFjdC5Qcm9wVHlwZXMuYXJyYXksXG4gIG9uSXRlbUNsaWNrOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgb25Sb3dTZWxlY3RlZDogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIG9uUm93VW5zZWxlY3RlZDogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGRlbGV0ZUZpbGU6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBpbnRsOiBpbnRsU2hhcGUuaXNSZXF1aXJlZFxufVxuXG5GaWxlc1RhYmxlLmRlZmF1bHRQcm9wcyA9IHtcbiAgaXRlbXM6IFtdXG59XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdEludGwoRmlsZXNUYWJsZSlcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCdcbmltcG9ydCB7IEFsZXJ0LCBNb2RhbCB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcbmltcG9ydCB7IGRlZmluZU1lc3NhZ2VzLCBGb3JtYXR0ZWRNZXNzYWdlIH0gZnJvbSAncmVhY3QtaW50bCdcblxuaW1wb3J0IHsgY2xlYXJVcGxvYWRGaWxlRXJyb3IgfSBmcm9tICcuLi8uLi9hY3Rpb25zL2ZpbGVzJ1xuaW1wb3J0IHsgZ2V0VXBsb2FkRXJyb3JzIH0gZnJvbSAnLi4vLi4vcmVkdWNlcnMvZmlsZXMnXG5cbmltcG9ydCBVcGxvYWRzIGZyb20gJy4vdXBsb2FkcydcblxuY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gIHVwbG9hZHM6IHtcbiAgICBpZDogJ3VwbG9hZHMnLCBkZWZhdWx0TWVzc2FnZTogJ1VwbG9hZHMnXG4gIH1cbn0pXG5cbmNvbnN0IFVwbG9hZHNNb2RhbCA9ICh7XG4gIGRpcm5hbWUsIHNlcGFyYXRvciwgc2hvdywgaGFuZGxlSGlkZSwgdXBsb2FkRW5hYmxlZCxcbiAgdXBsb2FkRXJyb3JzLCBjbGVhclVwbG9hZEVycm9yXG59KSA9PiAoXG4gIDxNb2RhbCBzaG93PXtzaG93fSBvbkhpZGU9e2hhbmRsZUhpZGV9PlxuICAgIDxNb2RhbC5IZWFkZXIgY2xvc2VCdXR0b24+XG4gICAgICA8TW9kYWwuVGl0bGU+XG4gICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy51cGxvYWRzfSAvPlxuICAgICAgPC9Nb2RhbC5UaXRsZT5cbiAgICA8L01vZGFsLkhlYWRlcj5cbiAgICA8TW9kYWwuQm9keT5cbiAgICAgIHsgdXBsb2FkRXJyb3JzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgdXBsb2FkRXJyb3JzLm1hcCgoeyBwYXRoLCBtZXNzYWdlIH0sIGkpID0+IChcbiAgICAgICAgICA8QWxlcnRcbiAgICAgICAgICAgIGtleT17aX1cbiAgICAgICAgICAgIGJzU3R5bGU9J2RhbmdlcidcbiAgICAgICAgICAgIG9uRGlzbWlzcz17KGUpID0+IGNsZWFyVXBsb2FkRXJyb3IocGF0aCl9PlxuICAgICAgICAgICAgeyBtZXNzYWdlIH1cbiAgICAgICAgICA8L0FsZXJ0PlxuICAgICAgICApKVxuICAgICAgfVxuICAgICAgPFVwbG9hZHNcbiAgICAgICAgZGlybmFtZT17ZGlybmFtZX1cbiAgICAgICAgc2VwYXJhdG9yPXtzZXBhcmF0b3J9XG4gICAgICAgIHVwbG9hZEVuYWJsZWQ9e3VwbG9hZEVuYWJsZWR9IC8+XG4gICAgPC9Nb2RhbC5Cb2R5PlxuICA8L01vZGFsPlxuKVxuXG5VcGxvYWRzTW9kYWwucHJvcFR5cGVzID0ge1xuICBkaXJuYW1lOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIHNlcGFyYXRvcjogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcblxuICBzaG93OiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaGFuZGxlSGlkZTogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIHVwbG9hZEVuYWJsZWQ6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuXG4gIHVwbG9hZEVycm9yczogUmVhY3QuUHJvcFR5cGVzLmFycmF5T2YoUmVhY3QuUHJvcFR5cGVzLnNoYXBlKHtcbiAgICBwYXRoOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNvZGU6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gICAgbWVzc2FnZTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZ1xuICB9KSksXG4gIGNsZWFyVXBsb2FkRXJyb3I6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbn1cblxuVXBsb2Fkc01vZGFsLmRlZmF1bHRQcm9wVHlwZXMgPSB7XG4gIHNob3c6IGZhbHNlLFxuICB1cGxvYWRFcnJvcnM6IFtdXG59XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IGZpbGVzIH0pID0+ICh7XG4gIHVwbG9hZEVycm9yczogZ2V0VXBsb2FkRXJyb3JzKGZpbGVzKVxufSlcbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IChkaXNwYXRjaCkgPT4gKHtcbiAgY2xlYXJVcGxvYWRFcnJvcjogKHBhdGgpID0+IGRpc3BhdGNoKGNsZWFyVXBsb2FkRmlsZUVycm9yKHBhdGgpKVxufSlcbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMpKFVwbG9hZHNNb2RhbClcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJ1dHRvbiwgTGlzdEdyb3VwLCBMaXN0R3JvdXBJdGVtIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuaW1wb3J0IHsgZGVmaW5lTWVzc2FnZXMsIEZvcm1hdHRlZE1lc3NhZ2UgfSBmcm9tICdyZWFjdC1pbnRsJ1xuXG5pbXBvcnQgRmlsZXNVcGxvYWRDb250cm9sbGVyIGZyb20gJy4uLy4uL2xpYi9maWxlcy9maWxlcy11cGxvYWQtY29udHJvbGxlcidcbmltcG9ydCBVc2VyRmlsZSBmcm9tICcuLi8uLi9saWIvZmlsZXMvdXNlci1maWxlJ1xuaW1wb3J0IEVsbGlwc2l6ZSBmcm9tICcuLi9lbGxpcHNpemUnXG5pbXBvcnQgUHJvZ3Jlc3NCYXIgZnJvbSAnLi4vcHJvZ3Jlc3MtYmFyJ1xuaW1wb3J0IEZpbGVEcm9wem9uZSBmcm9tICcuL2ZpbGUtZHJvcHpvbmUnXG5pbXBvcnQgRmlsZURyb3BNZXNzYWdlIGZyb20gJy4vZmlsZS1kcm9wLW1lc3NhZ2UnXG5cbmNvbnN0IEZJTEVOQU1FX01BWF9MRU5HVEggPSA1MFxuXG5jb25zdCBtZXNzYWdlcyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgY2xpY2tUb1VwbG9hZDoge1xuICAgIGlkOiAnY2xpY2stdG8tdXBsb2FkJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0NsaWNrIHRvIHVwbG9hZCdcbiAgfVxufSlcblxuY2xhc3MgVXBsb2FkcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy5kcm9wem9uZSA9IG51bGxcbiAgICB0aGlzLm9wZW5VcGxvYWRzU2VsZWN0b3IgPSAoKSA9PiB7IGlmICh0aGlzLmRyb3B6b25lKSB0aGlzLmRyb3B6b25lLm9wZW4oKSB9XG4gICAgdGhpcy5oYW5kbGVVcGxvYWRDbGljayA9IChlKSA9PiB0aGlzLm9wZW5VcGxvYWRzU2VsZWN0b3IoKVxuICAgIGNvbnN0IGFkZEZpbGUgPSAoZmlsZUhhbmRsZSkgPT4ge1xuICAgICAgY29uc3QgeyBkaXJuYW1lLCBzZXBhcmF0b3IgfSA9IHRoaXMucHJvcHNcbiAgICAgIGNvbnN0IHR5cGVPUyA9IHNlcGFyYXRvciA9PT0gJy8nID8gJ2xpbnV4JyA6ICd3aW4nXG4gICAgICBjb25zdCBmaWxlID0gbmV3IFVzZXJGaWxlKGZpbGVIYW5kbGUsIGRpcm5hbWUsIHR5cGVPUylcbiAgICAgIEZpbGVzVXBsb2FkQ29udHJvbGxlci5hZGRGaWxlKGZpbGUpXG4gICAgfVxuICAgIHRoaXMuaGFuZGxlRmlsZXNEcm9wID0gKGFjY2VwdGVkRmlsZXMpID0+IHtcbiAgICAgIGlmICh0aGlzLnByb3BzLnVwbG9hZEVuYWJsZWQpIGFjY2VwdGVkRmlsZXMuZm9yRWFjaChhZGRGaWxlKVxuICAgIH1cbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBmaWxlcywgdXBsb2FkRW5hYmxlZCwgb25SZW1vdmVGaWxlIH0gPSB0aGlzLnByb3BzXG5cbiAgICByZXR1cm4gKFxuICAgICAgPEZpbGVEcm9wem9uZVxuICAgICAgICBkcm9wem9uZVJlZj17KHJlZikgPT4geyB0aGlzLmRyb3B6b25lID0gcmVmIH19XG4gICAgICAgIG9uRHJvcD17dGhpcy5oYW5kbGVGaWxlc0Ryb3B9XG4gICAgICAgIG92ZXJsYXlNZXNzYWdlPXs8RmlsZURyb3BNZXNzYWdlIHVwbG9hZEVuYWJsZWQ9e3VwbG9hZEVuYWJsZWR9IC8+fVxuICAgICAgICBkaXNhYmxlQ2xpY2tcbiAgICAgICAgZGlzYWJsZVByZXZpZXc+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdmaWxlLXVwbG9hZHMnPlxuICAgICAgICAgIHsgdXBsb2FkRW5hYmxlZCAmJlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3RleHQtY2VudGVyJz5cbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9J2J1dHRvbidcbiAgICAgICAgICAgICAgICBic1N0eWxlPSdwcmltYXJ5J1xuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlVXBsb2FkQ2xpY2t9PlxuICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5jbGlja1RvVXBsb2FkfSAvPlxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICB7IGZpbGVzLmxlbmd0aCA+IDAgJiYgPGJyIC8+IH1cbiAgICAgICAgICB7IGZpbGVzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIDxMaXN0R3JvdXA+XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmaWxlcy5tYXAoKHsgYmFzZW5hbWU6IG5hbWUsIHBhdGgsIHByb2dyZXNzIH0sIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgICA8TGlzdEdyb3VwSXRlbVxuICAgICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgICBic1N0eWxlPXsocHJvZ3Jlc3MgPCAxMDApID8gJ2luZm8nIDogJ3N1Y2Nlc3MnfT5cbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9J2J1dHRvbidcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9J2Nsb3NlJ1xuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eyhlKSA9PiBvblJlbW92ZUZpbGUocGF0aCl9PlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiZ0aW1lczs8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8RWxsaXBzaXplIG1heD17RklMRU5BTUVfTUFYX0xFTkdUSH0+e25hbWV9PC9FbGxpcHNpemU+XG4gICAgICAgICAgICAgICAgICAgIDxQcm9ncmVzc0JhciB2YWx1ZT17cHJvZ3Jlc3N9IC8+XG4gICAgICAgICAgICAgICAgICA8L0xpc3RHcm91cEl0ZW0+XG4gICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9MaXN0R3JvdXA+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvRmlsZURyb3B6b25lPlxuICAgIClcbiAgfVxufVxuXG5VcGxvYWRzLnByb3BUeXBlcyA9IHtcbiAgZGlybmFtZTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBzZXBhcmF0b3I6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGZpbGVzOiBSZWFjdC5Qcm9wVHlwZXMuYXJyYXksXG4gIHVwbG9hZEVuYWJsZWQ6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBvblJlbW92ZUZpbGU6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbn1cblxuVXBsb2Fkcy5kZWZhdWx0UHJvcHMgPSB7XG4gIHNlcGFyYXRvcjogJy8nLFxuICBmaWxlczogW11cbn1cblxuY2xhc3MgVXBsb2Fkc0NvbnRhaW5lciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy5nZXRVcGxvYWRGaWxlcyA9ICgpID0+ICh7XG4gICAgICBmaWxlczogRmlsZXNVcGxvYWRDb250cm9sbGVyLmZpbGVzLm1hcCgoZmlsZVVwbG9hZCwgaW5kZXgpID0+ICh7XG4gICAgICAgIHBhdGg6IGZpbGVVcGxvYWQuZmlsZS5wYXRoLFxuICAgICAgICBkaXJuYW1lOiBmaWxlVXBsb2FkLmZpbGUuZGlybmFtZSxcbiAgICAgICAgYmFzZW5hbWU6IGZpbGVVcGxvYWQuZmlsZS5iYXNlbmFtZSxcbiAgICAgICAgcHJvZ3Jlc3M6IGZpbGVVcGxvYWQucHJvZ3Jlc3NcbiAgICAgIH0pKVxuICAgIH0pXG5cbiAgICB0aGlzLmhhbmRsZUZpbGUgPSAoKSA9PiB0aGlzLnNldFN0YXRlKHRoaXMuZ2V0VXBsb2FkRmlsZXMpXG5cbiAgICB0aGlzLmhhbmRsZVJlbW92ZUZpbGUgPSAocGF0aCkgPT4gRmlsZXNVcGxvYWRDb250cm9sbGVyLnJlbW92ZUZpbGUocGF0aClcblxuICAgIHRoaXMuc3RhdGUgPSB0aGlzLmdldFVwbG9hZEZpbGVzKClcbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBmaWxlcyB9ID0gdGhpcy5zdGF0ZVxuICAgIGNvbnN0IHsgZGlybmFtZSwgc2VwYXJhdG9yLCB1cGxvYWRFbmFibGVkIH0gPSB0aGlzLnByb3BzXG4gICAgcmV0dXJuIChcbiAgICAgIDxVcGxvYWRzXG4gICAgICAgIGRpcm5hbWU9e2Rpcm5hbWV9XG4gICAgICAgIHNlcGFyYXRvcj17c2VwYXJhdG9yfVxuICAgICAgICB1cGxvYWRFbmFibGVkPXt1cGxvYWRFbmFibGVkfVxuICAgICAgICBmaWxlcz17ZmlsZXN9XG4gICAgICAgIG9uUmVtb3ZlRmlsZT17dGhpcy5oYW5kbGVSZW1vdmVGaWxlfSAvPlxuICAgIClcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICBGaWxlc1VwbG9hZENvbnRyb2xsZXIub24oJ2ZpbGUnLCB0aGlzLmhhbmRsZUZpbGUpXG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCAoKSB7XG4gICAgRmlsZXNVcGxvYWRDb250cm9sbGVyLnJlbW92ZUxpc3RlbmVyKCdmaWxlJywgdGhpcy5oYW5kbGVGaWxlKVxuICB9XG59XG5cblVwbG9hZHNDb250YWluZXIucHJvcFR5cGVzID0ge1xuICBkaXJuYW1lOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIHNlcGFyYXRvcjogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgdXBsb2FkRW5hYmxlZDogUmVhY3QuUHJvcFR5cGVzLmJvb2xcbn1cblxuZXhwb3J0IGRlZmF1bHQgVXBsb2Fkc0NvbnRhaW5lclxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4J1xuaW1wb3J0IHsgR2x5cGhpY29uLCBOYXZiYXIsIE5hdiwgTWVudUl0ZW0sIE5hdkl0ZW0gfSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQgeyBGb3JtYXR0ZWRNZXNzYWdlIH0gZnJvbSAncmVhY3QtaW50bCdcblxuaW1wb3J0IHtcbiAgc2VsZWN0U2VjdGlvbiwgZmV0Y2hSZW1vdGVTZWN0aW9uLCBpbmZvcm1SZW1vdGVTZWN0aW9uXG59IGZyb20gJy4uL2FjdGlvbnMvYXBwJ1xuaW1wb3J0IHsgZ2V0U2VjdGlvbnMsIGdldEFjdGl2ZVNlY3Rpb24gfSBmcm9tICcuLi9yZWR1Y2Vycy9hcHAnXG5pbXBvcnQgRWxsaXBzaXplIGZyb20gJy4vZWxsaXBzaXplJ1xuXG5leHBvcnQgY2xhc3MgSGVhZGVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICBpZiAocHJvcHMuc2VsZWN0U2VjdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3RTZWN0aW9uID0gKHNlY3Rpb24pID0+IChldmVudCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNlY3Rpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgcHJvcHMuc2VsZWN0U2VjdGlvbigpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvcHMuc2VsZWN0U2VjdGlvbihzZWN0aW9uLmtleSlcbiAgICAgICAgICAvLyBSZXF1ZXN0IGNvbmRpdGlvblxuICAgICAgICAgIGNvbnN0IHJlcXVlc3RDb25kaXRpb24gPSAhc2VjdGlvbi5hbGxvdyAmJlxuICAgICAgICAgICAgIXNlY3Rpb24uZmV0Y2hpbmdSZW1vdGUgJiZcbiAgICAgICAgICAgICFzZWN0aW9uLmJsb2NrUmVxdWVzdFxuICAgICAgICAgIGlmIChyZXF1ZXN0Q29uZGl0aW9uKSB7XG4gICAgICAgICAgICBpZiAoc2VjdGlvbi5pbmZvcm0pIHByb3BzLmluZm9ybVNlY3Rpb24oc2VjdGlvbi5rZXkpXG4gICAgICAgICAgICBlbHNlIHByb3BzLmZldGNoU2VjdGlvbihzZWN0aW9uLmtleSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb3BzLmhhbmRsZURpc2Nvbm5lY3RDbGljaykge1xuICAgICAgdGhpcy5oYW5kbGVEaXNjb25uZWN0Q2xpY2sgPSBwcm9wcy5oYW5kbGVEaXNjb25uZWN0Q2xpY2tcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYW5kbGVEaXNjb25uZWN0Q2xpY2sgPSAoKSA9PiB7fVxuICAgIH1cbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBsb2dvLCBzZWN0aW9ucywgYWN0aXZlU2VjdGlvbiwgYWdlbnRJRCwgYWdlbnRIb3N0bmFtZSB9ID0gdGhpcy5wcm9wc1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxOYXZiYXIgaWQ9J2Vob3J1cy1oZWFkZXInIGZpeGVkVG9wIGludmVyc2UgY29sbGFwc2VPblNlbGVjdCBmbHVpZD5cbiAgICAgICAgPE5hdmJhci5IZWFkZXI+XG4gICAgICAgICAgeyBsb2dvLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIDxOYXZiYXIuQnJhbmQ+XG4gICAgICAgICAgICAgIDxpbWcgc3JjPXtsb2dvfSBvbkNsaWNrPXt0aGlzLnNlbGVjdFNlY3Rpb24oKX0gLz5cbiAgICAgICAgICAgIDwvTmF2YmFyLkJyYW5kPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8TmF2YmFyLlRvZ2dsZSAvPlxuICAgICAgICA8L05hdmJhci5IZWFkZXI+XG5cbiAgICAgICAgPE5hdmJhci5Db2xsYXBzZT5cbiAgICAgICAgICA8TmF2PlxuICAgICAgICAgICAgeyBzZWN0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgIHNlY3Rpb25zXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoc2VjdGlvbikgPT4gc2VjdGlvbi5lbmFibGVkKVxuICAgICAgICAgICAgICAgIC5tYXAoKHNlY3Rpb24sIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgICA8TmF2SXRlbVxuICAgICAgICAgICAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgICAgICAgICAgICBldmVudEtleT17aW5kZXggKyAxfVxuICAgICAgICAgICAgICAgICAgICBhY3RpdmU9e2FjdGl2ZVNlY3Rpb24gPT09IHNlY3Rpb24ua2V5fVxuICAgICAgICAgICAgICAgICAgICBvblNlbGVjdD17dGhpcy5zZWxlY3RTZWN0aW9uKHNlY3Rpb24pfT5cbiAgICAgICAgICAgICAgICAgICAgeyAhIXNlY3Rpb24ubmFtZSAmJiBzZWN0aW9uLm5hbWUubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD17c2VjdGlvbi5rZXl9XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZT17c2VjdGlvbi5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvTmF2SXRlbT5cbiAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvTmF2PlxuXG4gICAgICAgICAgPE5hdiBwdWxsUmlnaHQ+XG4gICAgICAgICAgICA8TWVudUl0ZW0gZXZlbnRLZXk9JzEnIG9uU2VsZWN0PXt0aGlzLmhhbmRsZURpc2Nvbm5lY3RDbGlja30+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPXt7IHBvc2l0aW9uOiAncmVsYXRpdmUnLCB0b3A6ICcycHgnIH19PlxuICAgICAgICAgICAgICAgIDxHbHlwaGljb24gZ2x5cGg9J29mZicgLz5cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8c3Bhbj4mbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgIHsgYWdlbnRIb3N0bmFtZS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgPHNwYW4+KDxFbGxpcHNpemUgbWF4PXsxMH0+eyBhZ2VudEhvc3RuYW1lIH08L0VsbGlwc2l6ZT4pPC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHsgYWdlbnRIb3N0bmFtZS5sZW5ndGggPD0gMCAmJiBhZ2VudElELmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICA8c3Bhbj4oPEVsbGlwc2l6ZSBtYXg9ezEwfT57IGBJRDogJHthZ2VudElEfWAgfTwvRWxsaXBzaXplPik8L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvTWVudUl0ZW0+XG4gICAgICAgICAgPC9OYXY+XG4gICAgICAgIDwvTmF2YmFyLkNvbGxhcHNlPlxuICAgICAgPC9OYXZiYXI+XG4gICAgKVxuICB9XG59XG5cbkhlYWRlci5wcm9wVHlwZXMgPSB7XG4gIGxvZ286IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGFjdGl2ZVNlY3Rpb246IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIHNlY3Rpb25zOiBSZWFjdC5Qcm9wVHlwZXMuYXJyYXksXG4gIHNlbGVjdFNlY3Rpb246IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBmZXRjaFNlY3Rpb246IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBpbmZvcm1TZWN0aW9uOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgaGFuZGxlRGlzY29ubmVjdENsaWNrOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgLy8gQWdlbnQgaW5mb1xuICBhZ2VudElEOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBhZ2VudEhvc3RuYW1lOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nXG59XG5cbkhlYWRlci5kZWZhdWx0UHJvcHMgPSB7XG4gIGxvZ286ICcnLFxuICBhY3RpdmVTZWN0aW9uOiAnJyxcbiAgc2VjdGlvbnM6IFtdLFxuICBmZXRjaFNlY3Rpb246ICgpID0+IHt9LFxuICBpbmZvcm1TZWN0aW9uOiAoKSA9PiB7fSxcbiAgLy8gQWdlbnQgaW5mb1xuICBhZ2VudElEOiAnJyxcbiAgYWdlbnRIb3N0bmFtZTogJydcbn1cblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHN0YXRlLCBwcm9wcykgPT4ge1xuICBjb25zdCBuZXdQcm9wcyA9IHtcbiAgICBsb2dvOiBzdGF0ZS5hcHAubG9nb1VSTCxcbiAgICBzZWN0aW9uczogZ2V0U2VjdGlvbnMoc3RhdGUuYXBwKVxuICB9XG4gIGNvbnN0IGFjdGl2ZVNlY3Rpb24gPSBnZXRBY3RpdmVTZWN0aW9uKHN0YXRlLmFwcClcbiAgaWYgKGFjdGl2ZVNlY3Rpb24pIG5ld1Byb3BzLmFjdGl2ZVNlY3Rpb24gPSBhY3RpdmVTZWN0aW9uXG5cbiAgcmV0dXJuIG5ld1Byb3BzXG59XG5jb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSAoZGlzcGF0Y2gsIHByb3BzKSA9PiB7XG4gIHJldHVybiB7XG4gICAgZmV0Y2hTZWN0aW9uOiAoa2V5KSA9PiBkaXNwYXRjaChmZXRjaFJlbW90ZVNlY3Rpb24oa2V5KSksXG4gICAgaW5mb3JtU2VjdGlvbjogKGtleSkgPT4gZGlzcGF0Y2goaW5mb3JtUmVtb3RlU2VjdGlvbihrZXkpKSxcbiAgICBzZWxlY3RTZWN0aW9uOiAoa2V5KSA9PiBkaXNwYXRjaChzZWxlY3RTZWN0aW9uKGtleSkpXG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMpKEhlYWRlcilcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEp1bWJvdHJvbiwgQnV0dG9uIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuaW1wb3J0IHsgaW5qZWN0SW50bCwgaW50bFNoYXBlLCBkZWZpbmVNZXNzYWdlcyB9IGZyb20gJ3JlYWN0LWludGwnXG5pbXBvcnQgeyBBVVRIX0lOVkFMSUQsIEFVVEhfVElNRU9VVCB9IGZyb20gJy4uL2NvbnN0YW50cy9hdXRoJ1xuaW1wb3J0IHtcbiAgQ0xPU0VfTk9STUFMLCBDTE9TRV9HT0lOR19BV0FZLCBDTE9TRV9QUk9UT0NPTF9FUlJPUiwgQ0xPU0VfVU5TVVBQT1JURUQsXG4gIENMT1NFX05PX1NUQVRVUywgQ0xPU0VfQUJOT1JNQUwsIENMT1NFX1VOU1VQUE9SVEVEX0RBVEEsXG4gIENMT1NFX1BPTElDWV9WSU9MQVRJT04sIENMT1NFX1RPT19MQVJHRSwgQ0xPU0VfTUlTU0lOR19FWFRFTlNJT04sXG4gIENMT1NFX0lOVEVSTkFMX0VSUk9SLCBDTE9TRV9TRVJWSUNFX1JFU1RBUlQsIENMT1NFX1RSWV9BR0FJTl9MQVRFUixcbiAgQ0xPU0VfVExTX0hBTkRTSEFLRSwgQ0xPU0VfQVVUSF9JTlZBTElELCBDTE9TRV9BVVRIX1RJTUVPVVQsIENMT1NFX0lOQUNUSVZJVFksXG4gIENMT1NFX0FVVEhfRVhQSVJFRFxufSBmcm9tICcuLi9jb25zdGFudHMvd2Vic29ja2V0J1xuXG5jb25zdCBtZXNzYWdlRGVzY3JpcHRvcnMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gIGNvbm5lY3RpbmdEb3RzOiB7XG4gICAgaWQ6ICdjb25uZWN0aW5nRG90cycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdDb25uZWN0aW5nLi4uJ1xuICB9LFxuICBkaXNjb25uZWN0aW5nRG90czoge1xuICAgIGlkOiAnZGlzY29ubmVjdGluZ0RvdHMnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRGlzY29ubmVjdGluZy4uLidcbiAgfSxcbiAgYnllTWVzc2FnZToge1xuICAgIGlkOiAnYnllTWVzc2FnZScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdTbyBsb25nLCBodW1hbi4uLicsXG4gICAgZGVzY3JpcHRpb246ICdNZXNzYWdlIGRpc3BsYXllZCB3aGlsZSB0aGUgY2xpZW50IGlzIGRpc2Nvbm5lY3RpbmcnXG4gIH0sXG4gIGJsb2NrZWRTZWN0aW9uOiB7XG4gICAgaWQ6ICdibG9ja2VkU2VjdGlvbicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdCbG9ja2VkIHNlY3Rpb24nLFxuICAgIGRlc2NyaXB0aW9uOiAnVGl0bGUgZGlzcGxheWVkIHdoZW4gcmVtb3RlIHVzZXIgcmVqZWN0IGEgY29ubmVjdGlvbiB0byBhIHNlY3Rpb24nXG4gIH0sXG4gIGJsb2NrZWRTZWN0aW9uU3ViOiB7XG4gICAgaWQ6ICdibG9ja2VkU2VjdGlvblN1YicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGlzIHNlY3Rpb24gcmVxdWlyZXMgYWN0aXZlIHZhbGlkYXRpb24uIFdhaXRpbmcgdG8gbG9jYWwgdXNlcicsXG4gICAgZGVzY3JpcHRpb246ICdTdWJ0aXRsZSBkaXNwbGF5ZWQgd2hlbiByZW1vdGUgdXNlciByZWplY3QgYSBjb25uZWN0aW9uIHRvIGEgc2VjdGlvbidcbiAgfSxcbiAgY29ubmVjdGlvbkZhaWxlZE1haW46IHtcbiAgICBpZDogJ2Nvbm5lY3Rpb25GYWlsZWRNYWluJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0l0IHNlZW1zIHRoZSBjb25uZWN0aW9uIGZhaWxlZCcsXG4gICAgZGVzY3JpcHRpb246ICdNZXNzYWdlIGRpc3BsYXllZCBhbHdheXMgd2hlbiBjb25uZWN0aW9uIGZhaWxlZCdcbiAgfSxcbiAgY29ubmVjdGlvbkZhaWxlZEJ1c3k6IHtcbiAgICBpZDogJ2Nvbm5lY3Rpb25GYWlsZWRCdXN5JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1Byb2JhYmx5IGFub3RoZXIgdXNlciBpcyB1c2luZyB0aGUgYWdlbnQgYXQgdGhpcyBtb21lbnQnLFxuICAgIGRlc2NyaXB0aW9uOiAnTWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBjb25uZWN0aW9uIGZhaWxlZCBiZWNhdXNlIGFub3RoZXIgY2xpZW50IGlzIGNvbm5lY3RpbmcgdG8gdGhlIHNhbWUgYWdlbnQuJ1xuICB9LFxuICBjb25uZWN0aW9uRmFpbGVkRG93bjoge1xuICAgIGlkOiAnY29ubmVjdGlvbkZhaWxlZERvd24nLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlIGFnZW50IGlzIHByb2JhYmx5IGRvd24sIHNpbmNlIGl0cyBsYXN0IGNvbnRhY3Qgd2FzIGEgbG9uZyB0aW1lIGFnby4nLFxuICAgIGRlc2NyaXB0aW9uOiAnTWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBjb25uZWN0aW9uIGZhaWxlZCBiZWNhdXNlIGFnZW50IGlzIGRvd24uJ1xuICB9LFxuICBjb25uZWN0aW9uRmFpbGVkU2VydmVyOiB7XG4gICAgaWQ6ICdjb25uZWN0aW9uRmFpbGVkU2VydmVyJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZSBzZXJ2ZXIgY2FuIGJlIHVucmVhY2hhYmxlIG9yIG1heSBiZSBhIGNvbm5lY3Rpb24gc3RpbGwgb3Blbi4gVHJ5IGFnYWluJyxcbiAgICBkZXNjcmlwdGlvbjogJ01lc3NhZ2UgZGlzcGxheWVkIHdoZW4gY29ubmVjdGlvbiBmYWlsZWQgYmVjYXVzZSBjYW5ub3QgY29ubmVjdCB3aXRoIHNlcnZlci4nXG4gIH0sXG4gIG5vdENvbm5lY3RlZDoge1xuICAgIGlkOiAnbm90Q29ubmVjdGVkJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ05vdCBjb25uZWN0ZWQnXG4gIH0sXG4gIHJlY29ubmVjdE5vdzoge1xuICAgIGlkOiAncmVjb25uZWN0Tm93JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1JlY29ubmVjdCBub3cnXG4gIH0sXG4gIHRyeVJlbG9hZGluZzoge1xuICAgIGlkOiAndHJ5UmVsb2FkaW5nJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RyeSByZWxvYWRpbmcgdGhlIHBhZ2UnXG4gIH0sXG4gIGF1dGhlbnRpY2F0aW5nRG90czoge1xuICAgIGlkOiAnYXV0aGVudGljYXRpbmdEb3RzJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0F1dGhlbnRpY2F0aW5nLi4uJ1xuICB9LFxuICBhdXRoZW50aWNhdGluZ1N1Yjoge1xuICAgIGlkOiAnYXV0aGVudGljYXRpbmdTdWInLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnTGV0IG1lIHNlZSBob3cgcmVsaWFibGUgeW91IGFyZScsXG4gICAgZGVzY3JpcHRpb246ICdTdWJ0aXRsZSB3aGlsZSBwYXNzd29yZCBpcyBiZWVuIGNoZWNrZWQnXG4gIH0sXG4gIG5vdEF1dGhlbnRpY2F0ZWQ6IHtcbiAgICBpZDogJ25vdEF1dGhlbnRpY2F0ZWQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnTm90IGF1dGhlbnRpY2F0ZWQnXG4gIH0sXG4gIHBhc3N3b3JkTmVlZGVkOiB7XG4gICAgaWQ6ICdwYXNzd29yZE5lZWRlZCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdQYXNzd29yZCBuZWVkZWQnXG4gIH0sXG4gIG5vdEluaXRpYWxpemVkOiB7XG4gICAgaWQ6ICdub3RJbml0aWFsaXplZCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdOb3QgaW5pdGlhbGl6ZWQnXG4gIH0sXG4gIGludmFsaWRQYXNzd29yZDoge1xuICAgIGlkOiAnaW52YWxpZFBhc3N3b3JkJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0ludmFsaWQgcGFzc3dvcmQnXG4gIH0sXG4gIHRpbWVvdXRQYXNzd29yZDoge1xuICAgIGlkOiAndGltZW91dFBhc3N3b3JkJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZSBhZ2VudCBoYXMgY2xvc2VkIHRoZSBjb25uZWN0aW9uIGR1ZSB0byBhIHRpbWVvdXQgd2hpbGUgZXhwZWN0aW5nIHRvIGNvbXBsZXRlIHRoZSBhdXRoZW50aWNhdGlvbiBwcm9jZXNzLicsXG4gICAgZGVzY3JpcHRpb246ICdNZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZSB0aW1lIHRvIHR5cGUgdGhlIHBhc3N3b3JkIGlzIGVsYXBzZWQnXG4gIH0sXG4gIHNvY2tldE1lc3NhZ2VDbG9zZU5vcm1hbDoge1xuICAgIGlkOiAnc29ja2V0TWVzc2FnZUNsb3NlTm9ybWFsJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZCBzdWNjZXNzZnVsbHkuJyxcbiAgICBkZXNjcmlwdGlvbjogJ01lc3NhZ2UgZGlzcGxheWVkIHdoZW4gY29ubmVjdGlvbiBpcyBjbG9zZWQgZ3JhY2VmdWxseSdcbiAgfSxcbiAgc29ja2V0TWVzc2FnZUNsb3NlR29pbmdBd2F5OiB7XG4gICAgaWQ6ICdzb2NrZXRNZXNzYWdlQ2xvc2VHb2luZ0F3YXknLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlIGFnZW50IGhhcyBjbG9zZWQgdGhlIGNvbm5lY3Rpb24uJyxcbiAgICBkZXNjcmlwdGlvbjogJ01lc3NhZ2UgZGlzcGxheWVkIHdoZW4gdGhlIGFnZW50IGNsb3NlZCB0aGUgY29ubmVjdGlvbidcbiAgfSxcbiAgc29ja2V0TWVzc2FnZUNsb3NlUHJvdG9jb2xFcnJvcjoge1xuICAgIGlkOiAnc29ja2V0TWVzc2FnZUNsb3NlUHJvdG9jb2xFcnJvcicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgYWdlbnQgaXMgdGVybWluYXRpbmcgdGhlIGNvbm5lY3Rpb24gZHVlIHRvIGEgcHJvdG9jb2wgZXJyb3IuJyxcbiAgICBkZXNjcmlwdGlvbjogJ01lc3NhZ2UgZGlzcGxheWVkIHdoZW4gcHJvdG9jb2wgZmFpbHMnXG4gIH0sXG4gIHNvY2tldE1lc3NhZ2VDbG9zZVVuc3VwcG9ydGVkOiB7XG4gICAgaWQ6ICdzb2NrZXRNZXNzYWdlQ2xvc2VVbnN1cHBvcnRlZCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgY29ubmVjdGlvbiBpcyBiZWluZyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIGFnZW50IHJlY2VpdmVkIGRhdGEgb2YgYSB0eXBlIGl0IGNhbm5vdCBhY2NlcHQuJyxcbiAgICBkZXNjcmlwdGlvbjogJ01lc3NhZ2UgZGlzcGxheWVkIHdoZW4gYWdlbnQgcmVjZWl2ZSBhbiB1bnN1cHBvcnRlZCBjb2RlJ1xuICB9LFxuICBzb2NrZXRNZXNzYWdlQ2xvc2VOb1N0YXR1czoge1xuICAgIGlkOiAnc29ja2V0TWVzc2FnZUNsb3NlTm9TdGF0dXMnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnTm8gc3RhdHVzIGNvZGUgd2FzIHByb3ZpZGVkIGV2ZW4gdGhvdWdoIG9uZSB3YXMgZXhwZWN0ZWQuJyxcbiAgICBkZXNjcmlwdGlvbjogJ01lc3NhZ2UgZGlzcGxheWVkIHdoZW4gc2VuZCBhIGNsb3NlIG1lc3NhZ2UgYW5kIGFnZW5kIGRvZXMgbm90IGFuc3dlcidcbiAgfSxcbiAgc29ja2V0TWVzc2FnZUNsb3NlQWJub3JtYWw6IHtcbiAgICBpZDogJ3NvY2tldE1lc3NhZ2VDbG9zZUFibm9ybWFsJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgYWJub3JtYWxseSB3aXRob3V0IGEgY2xvc2Ugc2lnbmFsLicsXG4gICAgZGVzY3JpcHRpb246ICdNZXNzYWdlIGRpc3BsYXllZCB3aGVuIGNvbm5lY3Rpb24gaXMgY2xvc2VkIGFibm9ybWFsbHknXG4gIH0sXG4gIHNvY2tldE1lc3NhZ2VDbG9zZVVuc3VwcG9ydGVkRGF0YToge1xuICAgIGlkOiAnc29ja2V0TWVzc2FnZUNsb3NlVW5zdXBwb3J0ZWREYXRhJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZSBhZ2VudCBpcyB0ZXJtaW5hdGluIHRoZSBjb25uZWN0aW9uIGJlY2F1c2UgYSBtZXNzYWdlIHdhcyByZWNlaXZlZCB0aGF0IGNvbnRhaW5lZCBpbmNvbnNpc3RlbnQgZGF0YS4nLFxuICAgIGRlc2NyaXB0aW9uOiAnTWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBjb25uZWN0aW9uIGVuZHMgYmVjYXVzZSB1bnN1cHBvcnRlZCBkYXRhIGlzIHJlY2VpdmVkJ1xuICB9LFxuICBzb2NrZXRNZXNzYWdlQ2xvc2VQb2xpY3lWaW9sYXRpb246IHtcbiAgICBpZDogJ3NvY2tldE1lc3NhZ2VDbG9zZVBvbGljeVZpb2xhdGlvbicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgYWdlbnQgaXMgdGVybWluYXRpbmcgdGhlIGNvbm5lY3Rpb24gYmVjYXVzZSBpdCByZWNlaXZlZCBhIG1lc3NhZ2UgdGhhdCB2aW9sYXRlcyBpdHMgcG9saWN5LicsXG4gICAgZGVzY3JpcHRpb246ICdNZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZSBwb2xpY3kgaXMgdmlvbGF0ZWQnXG4gIH0sXG4gIHNvY2tldE1lc3NhZ2VDbG9zZVRvb0xhcmdlOiB7XG4gICAgaWQ6ICdzb2NrZXRNZXNzYWdlQ2xvc2VUb29MYXJnZScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgYWdlbnQgaXMgdGVybWluYXRpbmcgdGhlIGNvbm5lY3Rpb24gYmVjYXVzZSBhIGRhdGEgZnJhbWUgd2FzIHJlY2VpdmVkIHRoYXQgaXMgdG9vIGxhcmdlLicsXG4gICAgZGVzY3JpcHRpb246ICdNZXNzYWdlIGRpc3BsYXllZCB3aGVuIGNvbm5lY3Rpb24gaXMgY2xvc2VkIGJlY2F1c2UgZGF0YSBpcyBsYXJnZXIgdGhhbiBzdXBwb3J0ZWQnXG4gIH0sXG4gIHNvY2tldE1lc3NhZ2VDbG9zZU1pc3NpbmdFeHRlbnNpb246IHtcbiAgICBpZDogJ3NvY2tldE1lc3NhZ2VDbG9zZU1pc3NpbmdFeHRlbnNpb24nLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlIGNsaWVudCBpcyB0ZXJtaW5hdGluZyB0aGUgY29ubmVjdGlvbiBiZWNhdXNlIGl0IGV4cGVjdGVkIHRoZSBhZ2VudCB0byBuZWdvdGlhdGUgb25lIG9yIG1vcmUgZXh0ZW5zaW9uLCBidXQgaXQgZGlkblxcJ3QuJyxcbiAgICBkZXNjcmlwdGlvbjogJ01lc3NhZ2UgZGlzcGxheWVkIHdoZW4gaXQgaXMgdHJ5IHRvIHVzZSBhIG1pc3NpbmcgZXh0ZW5zaW9uJ1xuICB9LFxuICBzb2NrZXRNZXNzYWdlQ2xvc2VJbnRlcm5hbEVycm9yOiB7XG4gICAgaWQ6ICdzb2NrZXRNZXNzYWdlQ2xvc2VJbnRlcm5hbEVycm9yJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZSBhZ2VudCBpcyB0ZXJtaW5hdGluZyB0aGUgY29ubmVjdGlvbiBiZWNhdXNlIGl0IGVuY291bnRlcmVkIGFuIHVuZXhwZWN0ZWQgY29uZGl0aW9uIHRoYXQgcHJldmVudGVkIGl0IGZyb20gZnVsZmlsbGluZyB0aGUgcmVxdWVzdC4nLFxuICAgIGRlc2NyaXB0aW9uOiAnTWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBhbiBpbnRlcm5hbCBlcnJvciBvY2N1cnMnXG4gIH0sXG4gIHNvY2tldE1lc3NhZ2VDbG9zZVNlcnZpY2VSZXN0YXJ0OiB7XG4gICAgaWQ6ICdzb2NrZXRNZXNzYWdlQ2xvc2VTZXJ2aWNlUmVzdGFydCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgYWdlbnQgaXMgdGVybWluYXRpbmcgdGhlIGNvbm5lY3Rpb24gYmVjYXVzZSBpdCBpcyByZXN0YXJ0aW5nLicsXG4gICAgZGVzY3JpcHRpb246ICdNZXNzYWdlIGRpc3BsYXllZCB3aGVuIGNvbm5lY3Rpb24gaXMgdGVybWluYXRpbmcgZHVlIHRvIGEgcmVzdGFydCdcbiAgfSxcbiAgc29ja2V0TWVzc2FnZUNsb3NlVHJ5QWdhaW5MYXRlcjoge1xuICAgIGlkOiAnc29ja2V0TWVzc2FnZUNsb3NlVHJ5QWdhaW5MYXRlcicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgYWdlbnQgaXMgdGVybWluYXRpbmcgdGhlIGNvbm5lY3Rpb24gZHVlIHRvIGEgdGVtcG9yYXJ5IGNvbmRpdGlvbi4nLFxuICAgIGRlc2NyaXB0aW9uOiAnTWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBjbG9zZSBjb25uZWN0aW9uIGR1ZSB0byBhIHRlbXBvcmFyeSBjb25kaXRpb24uJ1xuICB9LFxuICBzb2NrZXRNZXNzYWdlQ2xvc2VUbHNIYW5kc2hha2U6IHtcbiAgICBpZDogJ3NvY2tldE1lc3NhZ2VDbG9zZVRsc0hhbmRzaGFrZScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIGR1ZSB0byBhIGZhaWx1cmUgdG8gcGVyZm9ybSBhIFRMUyBoYW5kc2hha2UuJyxcbiAgICBkZXNjcmlwdGlvbjogJ01lc3NhZ2UgZGlzcGxheWVkIHdoZW4gVExTIGhhbmRzaGFrZSBmYWlscy4nXG4gIH0sXG4gIHNvY2tldE1lc3NhZ2VDbG9zZUluYWN0aXZpdHk6IHtcbiAgICBpZDogJ3NvY2tldE1lc3NhZ2VDbG9zZUluYWN0aXZpdHknLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlIGFnZW50IGhhcyBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gZHVlIHRvIGluYWN0aXZpdHkuJyxcbiAgICBkZXNjcmlwdGlvbjogJ01lc3NhZ2UgZGlzcGxheWVkIHdoZW4gY29ubmVjdGlvbiBjbG9zZWQgZHVlIHRvIGluYWN0aXZpdHknXG4gIH0sXG4gIHNvY2tldE1lc3NhZ2VDbG9zZUF1dGhFeHBpcmVkOiB7XG4gICAgaWQ6ICdzb2NrZXRNZXNzYWdlQ2xvc2VBdXRoRXhwaXJlZCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgYWdlbnQgaGFzIGNsb3NlZCB0aGUgY29ubmVjdGlvbiBiZWNhdXNlIHRoZSB0ZW1wb3JhcnkgYXV0aG9yaXphdGlvbiBoYXMgZXhwaXJlZC4nLFxuICAgIGRlc2NyaXB0aW9uOiAnTWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiB0aGUgdGVtcG9yYXJ5IGF1dGhvcml6YXRpb24gaGFzIGV4cGlyZWQgYW5kIGNvbm5lY3Rpb24gaXMgY2xvc2VkLidcbiAgfSxcbiAgc29ja2V0TWVzc2FnZUNsb3NlRGVmYXVsdDoge1xuICAgIGlkOiAnc29ja2V0TWVzc2FnZUNsb3NlRGVmYXVsdCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIHdpdGhvdXQgcmVjZWl2aW5nIGEgdmFsaWQgY29kZS4nLFxuICAgIGRlc2NyaXB0aW9uOiAnTWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBjbG9zZSBjb25uZWN0aW9uIHdoZW4gYSBnZW5lcmljIGZhaWwgaXMgcHJvZHVjZWQnXG4gIH1cbn0pXG5cbmNsYXNzIEluZm9QYW5lbCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy5zdGF0ZSA9IHsgY291bnQ6IHRoaXMucHJvcHMudGltZXIsIGNhbnRDb25uZWN0OiBmYWxzZSB9XG4gICAgdGhpcy5nZXRQYW5lbE1lc3NhZ2VzID0gdGhpcy5nZXRQYW5lbE1lc3NhZ2VzLmJpbmQodGhpcylcbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyB0aXRsZSwgZGVzY3JpcHRpb24sIHJlY29ubmVjdCwgYnV0dG9uIH0gPSB0aGlzLmdldFBhbmVsTWVzc2FnZXMoKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxKdW1ib3Ryb24+XG4gICAgICAgIHsgdGl0bGUubGVuZ3RoID4gMCAmJiA8aDE+eyB0aXRsZSB9PC9oMT4gfVxuICAgICAgICB7IChkZXNjcmlwdGlvbi5sZW5ndGggPiAwIHx8IHJlY29ubmVjdC5sZW5ndGggPiAwKSAmJlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICB7IGRlc2NyaXB0aW9uLmxlbmd0aCA+IDAgJiYgPHA+eyBkZXNjcmlwdGlvbiB9PC9wPiB9XG4gICAgICAgICAgICB7IHJlY29ubmVjdC5sZW5ndGggPiAwICYmIDxwPnsgcmVjb25uZWN0IH08L3A+IH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICB7IGJ1dHRvbi5sZW5ndGggPiAwICYmXG4gICAgICAgICAgPHA+XG4gICAgICAgICAgICA8QnV0dG9uIGJzU3R5bGU9J3ByaW1hcnknIG9uQ2xpY2s9e3RoaXMucHJvcHMuaGFuZGxlQ29ubmVjdGlvbn0+XG4gICAgICAgICAgICAgIHsgYnV0dG9uIH1cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgfVxuICAgICAgPC9KdW1ib3Ryb24+XG4gICAgKVxuICB9XG5cbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAobmV4dFByb3BzKSB7XG4gICAgY29uc3QgeyBpc0Nvbm5lY3RpbmcsIGlzQ29ubmVjdGVkIH0gPSBuZXh0UHJvcHNcbiAgICBjb25zdCB3YXNDb25uZWN0aW5nID0gdGhpcy5wcm9wcy5pc0Nvbm5lY3RpbmdcblxuICAgIGlmIChpc0Nvbm5lY3RpbmcpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBjYW50Q29ubmVjdDogZmFsc2UgfSlcbiAgICB9IGVsc2UgaWYgKHdhc0Nvbm5lY3RpbmcgJiYgIWlzQ29ubmVjdGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgY2FudENvbm5lY3Q6IHRydWUgfSlcbiAgICB9XG4gIH1cblxuICBnZXRQYW5lbE1lc3NhZ2VzICgpIHtcbiAgICBjb25zdCBtZXNzYWdlcyA9IHtcbiAgICAgIHRpdGxlOiAnJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgIHJlY29ubmVjdDogJycsXG4gICAgICBidXR0b246ICcnXG4gICAgfVxuXG4gICAgY29uc3QgeyBjYW50Q29ubmVjdCB9ID0gdGhpcy5zdGF0ZVxuICAgIGNvbnN0IHtcbiAgICAgIC8vIENvbm5lY3Rpb25cbiAgICAgIGlzVW5rbm93biwgaXNCdXN5LFxuICAgICAgaXNDb25uZWN0aW5nLCBpc0Rpc2Nvbm5lY3RpbmcsIGlzQ29ubmVjdGVkLFxuICAgICAgY29ubmVjdGlvbkVycm9yLCBjb25uZWN0aW9uRXJyb3JDb2RlLFxuICAgICAgLy8gQXV0aGVudGljYXRpb25cbiAgICAgIGlzQXV0aGVudGljYXRpbmcsIGlzQXV0aGVudGljYXRlZCxcbiAgICAgIGF1dGhlbnRpY2F0aW9uRXJyb3IsIGF1dGhlbnRpY2F0aW9uRXJyb3JDb2RlLCBhdXRoZW50aWNhdGlvbkVycm9yTWVzc2FnZSxcbiAgICAgIC8vIEZldGNoaW5nIHJlbW90ZSBzZWN0aW9uXG4gICAgICBpc0ZldGNoaW5nU2VjdGlvbixcbiAgICAgIC8vIGludGwgcHJvdmlkZXJcbiAgICAgIGludGxcbiAgICB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IGZvcm1hdE1lc3NhZ2UgPSBpbnRsLmZvcm1hdE1lc3NhZ2VcblxuICAgIGlmIChpc0Nvbm5lY3RpbmcpIHtcbiAgICAgIG1lc3NhZ2VzLnRpdGxlID0gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuY29ubmVjdGluZ0RvdHMpXG4gICAgICBtZXNzYWdlcy5kZXNjcmlwdGlvbiA9ICcnXG4gICAgfSBlbHNlIGlmIChpc0Rpc2Nvbm5lY3RpbmcpIHtcbiAgICAgIG1lc3NhZ2VzLnRpdGxlID0gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuZGlzY29ubmVjdGluZ0RvdHMpXG4gICAgICBtZXNzYWdlcy5kZXNjcmlwdGlvbiA9IGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLmJ5ZU1lc3NhZ2UpXG4gICAgfSBlbHNlIGlmIChpc0ZldGNoaW5nU2VjdGlvbikge1xuICAgICAgbWVzc2FnZXMudGl0bGUgPSBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5ibG9ja2VkU2VjdGlvbilcbiAgICAgIG1lc3NhZ2VzLmRlc2NyaXB0aW9uID0gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuYmxvY2tlZFNlY3Rpb25TdWIpXG4gICAgfSBlbHNlIGlmICghaXNDb25uZWN0ZWQpIHtcbiAgICAgIGlmIChjb25uZWN0aW9uRXJyb3IgfHwgY2FudENvbm5lY3QgfHwgYXV0aGVudGljYXRpb25FcnJvcikge1xuICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuY29ubmVjdGlvbkZhaWxlZE1haW4pXG4gICAgICAgIGlmIChhdXRoZW50aWNhdGlvbkVycm9yKSB7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gdGhpcy5nZXRXZWJTb2NrZXRDbG9zZU1lc3NhZ2UoYXV0aGVudGljYXRpb25FcnJvckNvZGUsXG4gICAgICAgICAgICBhdXRoZW50aWNhdGlvbkVycm9yTWVzc2FnZSlcbiAgICAgICAgfSBlbHNlIGlmIChjYW50Q29ubmVjdCkge1xuICAgICAgICAgIGlmIChpc0J1c3kpIHtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSAnICcgKyBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5jb25uZWN0aW9uRmFpbGVkQnVzeSlcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzVW5rbm93bikge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlICs9ICcgJyArIGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLmNvbm5lY3Rpb25GYWlsZWREb3duKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gJyAnICsgZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuY29ubmVjdGlvbkZhaWxlZFNlcnZlcilcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gdGhpcy5nZXRXZWJTb2NrZXRDbG9zZU1lc3NhZ2UoY29ubmVjdGlvbkVycm9yQ29kZSlcbiAgICAgICAgfVxuXG4gICAgICAgIG1lc3NhZ2VzLnRpdGxlID0gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMubm90Q29ubmVjdGVkKVxuICAgICAgICBtZXNzYWdlcy5kZXNjcmlwdGlvbiA9IGVycm9yTWVzc2FnZVxuICAgICAgICBpZiAoY29ubmVjdGlvbkVycm9yQ29kZSAhPT0gQ0xPU0VfQVVUSF9FWFBJUkVEKSB7XG4gICAgICAgICAgbWVzc2FnZXMuYnV0dG9uID0gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMucmVjb25uZWN0Tm93KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXNzYWdlcy50aXRsZSA9IGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLm5vdENvbm5lY3RlZClcbiAgICAgICAgbWVzc2FnZXMuZGVzY3JpcHRpb24gPSBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy50cnlSZWxvYWRpbmcpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0Nvbm5lY3RlZCkge1xuICAgICAgaWYgKGlzQXV0aGVudGljYXRpbmcpIHtcbiAgICAgICAgbWVzc2FnZXMudGl0bGUgPSBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5hdXRoZW50aWNhdGluZ0RvdHMpXG4gICAgICAgIG1lc3NhZ2VzLmRlc2NyaXB0aW9uID0gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuYXV0aGVudGljYXRpbmdTdWIpXG4gICAgICB9IGVsc2UgaWYgKCFpc0F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgICAgbWVzc2FnZXMudGl0bGUgPSBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5ub3RBdXRoZW50aWNhdGVkKVxuICAgICAgICBtZXNzYWdlcy5kZXNjcmlwdGlvbiA9IGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLnBhc3N3b3JkTmVlZGVkKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtZXNzYWdlcy50aXRsZSA9IGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLm5vdEluaXRpYWxpemVkKVxuICAgICAgbWVzc2FnZXMuZGVzY3JpcHRpb24gPSBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy50cnlSZWxvYWRpbmcpXG4gICAgfVxuXG4gICAgcmV0dXJuIG1lc3NhZ2VzXG4gIH1cblxuICBnZXRBdXRoZW50aWNhdGlvbkVycm9yTWVzc2FnZSAoY29kZSwgcmVhc29uKSB7XG4gICAgY29uc3QgZm9ybWF0TWVzc2FnZSA9IHRoaXMucHJvcHMuaW50bC5mb3JtYXRNZXNzYWdlXG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICBjYXNlIEFVVEhfSU5WQUxJRDpcbiAgICAgICAgcmV0dXJuIGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLmludmFsaWRQYXNzd29yZClcbiAgICAgIGNhc2UgQVVUSF9USU1FT1VUOlxuICAgICAgICByZXR1cm4gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMudGltZW91dFBhc3N3b3JkKVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHJlYXNvblxuICAgIH1cbiAgfVxuXG4gIGdldFdlYlNvY2tldENsb3NlTWVzc2FnZSAoY29kZSkge1xuICAgIGNvbnN0IGZvcm1hdE1lc3NhZ2UgPSB0aGlzLnByb3BzLmludGwuZm9ybWF0TWVzc2FnZVxuICAgIHN3aXRjaCAoY29kZSkge1xuICAgICAgY2FzZSBDTE9TRV9OT1JNQUw6XG4gICAgICAgIHJldHVybiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5zb2NrZXRNZXNzYWdlQ2xvc2VOb3JtYWwpXG4gICAgICBjYXNlIENMT1NFX0dPSU5HX0FXQVk6XG4gICAgICAgIHJldHVybiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5zb2NrZXRNZXNzYWdlQ2xvc2VHb2luZ0F3YXkpXG4gICAgICBjYXNlIENMT1NFX1BST1RPQ09MX0VSUk9SOlxuICAgICAgICByZXR1cm4gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuc29ja2V0TWVzc2FnZUNsb3NlUHJvdG9jb2xFcnJvcilcbiAgICAgIGNhc2UgQ0xPU0VfVU5TVVBQT1JURUQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5zb2NrZXRNZXNzYWdlQ2xvc2VVbnN1cHBvcnRlZClcbiAgICAgIGNhc2UgQ0xPU0VfTk9fU1RBVFVTOlxuICAgICAgICByZXR1cm4gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuc29ja2V0TWVzc2FnZUNsb3NlTm9TdGF0dXMpXG4gICAgICBjYXNlIENMT1NFX0FCTk9STUFMOlxuICAgICAgICByZXR1cm4gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuc29ja2V0TWVzc2FnZUNsb3NlQWJub3JtYWwpXG4gICAgICBjYXNlIENMT1NFX1VOU1VQUE9SVEVEX0RBVEE6XG4gICAgICAgIHJldHVybiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5zb2NrZXRNZXNzYWdlQ2xvc2VVbnN1cHBvcnRlZERhdGEpXG4gICAgICBjYXNlIENMT1NFX1BPTElDWV9WSU9MQVRJT046XG4gICAgICAgIHJldHVybiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5zb2NrZXRNZXNzYWdlQ2xvc2VQb2xpY3lWaW9sYXRpb24pXG4gICAgICBjYXNlIENMT1NFX1RPT19MQVJHRTpcbiAgICAgICAgcmV0dXJuIGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLnNvY2tldE1lc3NhZ2VDbG9zZVRvb0xhcmdlKVxuICAgICAgY2FzZSBDTE9TRV9NSVNTSU5HX0VYVEVOU0lPTjpcbiAgICAgICAgcmV0dXJuIGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLnNvY2tldE1lc3NhZ2VDbG9zZU1pc3NpbmdFeHRlbnNpb24pXG4gICAgICBjYXNlIENMT1NFX0lOVEVSTkFMX0VSUk9SOlxuICAgICAgICByZXR1cm4gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuc29ja2V0TWVzc2FnZUNsb3NlSW50ZXJuYWxFcnJvcilcbiAgICAgIGNhc2UgQ0xPU0VfU0VSVklDRV9SRVNUQVJUOlxuICAgICAgICByZXR1cm4gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuc29ja2V0TWVzc2FnZUNsb3NlU2VydmljZVJlc3RhcnQpXG4gICAgICBjYXNlIENMT1NFX1RSWV9BR0FJTl9MQVRFUjpcbiAgICAgICAgcmV0dXJuIGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLnNvY2tldE1lc3NhZ2VDbG9zZVRyeUFnYWluTGF0ZXIpXG4gICAgICBjYXNlIENMT1NFX1RMU19IQU5EU0hBS0U6XG4gICAgICAgIHJldHVybiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5zb2NrZXRNZXNzYWdlQ2xvc2VUbHNIYW5kc2hha2UpXG4gICAgICBjYXNlIENMT1NFX0FVVEhfSU5WQUxJRDpcbiAgICAgICAgcmV0dXJuIGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLmludmFsaWRQYXNzd29yZClcbiAgICAgIGNhc2UgQ0xPU0VfQVVUSF9USU1FT1VUOlxuICAgICAgICByZXR1cm4gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMudGltZW91dFBhc3N3b3JkKVxuICAgICAgY2FzZSBDTE9TRV9JTkFDVElWSVRZOlxuICAgICAgICByZXR1cm4gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuc29ja2V0TWVzc2FnZUNsb3NlSW5hY3Rpdml0eSlcbiAgICAgIGNhc2UgQ0xPU0VfQVVUSF9FWFBJUkVEOlxuICAgICAgICByZXR1cm4gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuc29ja2V0TWVzc2FnZUNsb3NlQXV0aEV4cGlyZWQpXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuc29ja2V0TWVzc2FnZUNsb3NlRGVmYXVsdClcbiAgICB9XG4gIH1cbn1cblxuSW5mb1BhbmVsLnByb3BUeXBlcyA9IHtcbiAgaGFuZGxlQ29ubmVjdGlvbjogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgdGltZXI6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIC8vIENvbm5lY3Rpb25cbiAgaXNVbmtub3duOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaXNCdXN5OiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaXNDb25uZWN0aW5nOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaXNEaXNjb25uZWN0aW5nOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaXNDb25uZWN0ZWQ6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBjb25uZWN0aW9uRXJyb3I6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBjb25uZWN0aW9uRXJyb3JDb2RlOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICBjb25uZWN0aW9uRXJyb3JNZXNzYWdlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICAvLyBBdXRoZW50aWNhdGlvblxuICBpc0F1dGhlbnRpY2F0aW5nOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaXNBdXRoZW50aWNhdGVkOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgYXV0aGVudGljYXRpb25FcnJvcjogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGF1dGhlbnRpY2F0aW9uRXJyb3JDb2RlOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICBhdXRoZW50aWNhdGlvbkVycm9yTWVzc2FnZTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgLy8gRmV0Y2hpbmcgcmVtb3RlIHNlY3Rpb25cbiAgaXNGZXRjaGluZ1NlY3Rpb246IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuXG4gIGludGw6IGludGxTaGFwZS5pc1JlcXVpcmVkXG59XG5cbkluZm9QYW5lbC5kZWZhdWx0UHJvcHMgPSB7XG4gIHRpbWVyOiAzMCxcbiAgLy8gQ29ubmVjdGlvblxuICBpc1Vua25vd246IGZhbHNlLFxuICBpc0J1c3k6IGZhbHNlLFxuICBpc0Nvbm5lY3Rpbmc6IGZhbHNlLFxuICBpc0Rpc2Nvbm5lY3Rpbmc6IGZhbHNlLFxuICBpc0Nvbm5lY3RlZDogZmFsc2UsXG4gIGNvbm5lY3Rpb25FcnJvcjogZmFsc2UsXG4gIGNvbm5lY3Rpb25FcnJvckNvZGU6IG51bGwsXG4gIGNvbm5lY3Rpb25FcnJvck1lc3NhZ2U6IG51bGwsXG4gIC8vIEF1dGhlbnRpY2F0aW9uXG4gIGlzQXV0aGVudGljYXRpbmc6IGZhbHNlLFxuICBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxuICBhdXRoZW50aWNhdGlvbkVycm9yOiBmYWxzZSxcbiAgYXV0aGVudGljYXRpb25FcnJvckNvZGU6IG51bGwsXG4gIGF1dGhlbnRpY2F0aW9uRXJyb3JNZXNzYWdlOiBudWxsLFxuICAvLyBGZXRjaGluZyByZW1vdGUgc2VjdGlvblxuICBpc0ZldGNoaW5nU2VjdGlvbjogZmFsc2Vcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5qZWN0SW50bChJbmZvUGFuZWwpXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBQcm9ncmVzc0JhciB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcblxuY2xhc3MgUHJvZ3Jlc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgdmFsdWUgfSA9IHRoaXMucHJvcHNcbiAgICByZXR1cm4gKFxuICAgICAgPFByb2dyZXNzQmFyXG4gICAgICAgIG5vdz17dmFsdWV9XG4gICAgICAgIGFjdGl2ZT17KHZhbHVlIDwgMTAwKX1cbiAgICAgICAgbGFiZWw9e2Ake3ZhbHVlLnRvRml4ZWQoMil9JWB9IC8+XG4gICAgKVxuICB9XG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlIChuZXh0UHJvcHMpIHtcbiAgICBjb25zdCB7IHZhbHVlIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgeyB2YWx1ZTogbmV4dFZhbHVlIH0gPSBuZXh0UHJvcHNcbiAgICByZXR1cm4gKHZhbHVlLnRvRml4ZWQoMikgIT09IG5leHRWYWx1ZS50b0ZpeGVkKDIpKVxuICB9XG59XG5cblByb2dyZXNzLnByb3BUeXBlcyA9IHtcbiAgdmFsdWU6IFJlYWN0LlByb3BUeXBlcy5udW1iZXJcbn1cblxuUHJvZ3Jlc3MuZGVmYXVsdFByb3BzID0ge1xuICB2YWx1ZTogMFxufVxuXG5leHBvcnQgZGVmYXVsdCBQcm9ncmVzc1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgSnVtYm90cm9uLCBCdXR0b24gfSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQgeyBpbmplY3RJbnRsIH0gZnJvbSAncmVhY3QtaW50bCdcblxuY2xhc3MgUmVxdWVzdFNlY3Rpb24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBzZWN0aW9uOiB0aGlzLnByb3BzLnNlY3Rpb24sXG4gICAgICBibG9ja1JlcXVlc3Q6IHRoaXMucHJvcHMuYmxvY2tSZXF1ZXN0LFxuICAgICAgZmlyc3RBY3RpdmU6IHRoaXMucHJvcHMuZmlyc3RBY3RpdmVcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZVRyeUFnYWluID0gKCkgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5oYW5kbGVBbGxvd1NlY3Rpb25DbGljayh0aGlzLnN0YXRlLnNlY3Rpb24pXG4gICAgfVxuXG4gICAgdGhpcy5maXJzdEFjdGl2YXRpb24gPSAoKSA9PiB7XG4gICAgICB0aGlzLnByb3BzLmhhbmRsZUFsbG93U2VjdGlvbkNsaWNrKHRoaXMuc3RhdGUuZmlyc3RBY3RpdmUpXG4gICAgICB0aGlzLnByb3BzLnJlc2V0Rmlyc3RBY3RpdmUoKVxuICAgIH1cblxuICAgIC8vIE1lc3NhZ2VzIGRlZmluaXRpb25zXG4gICAgdGhpcy5tZXNzYWdlcyA9IHtcbiAgICAgIGZvcmJpZGRlblNlY3Rpb246IHtcbiAgICAgICAgaWQ6ICdmb3JiaWRkZW5TZWN0aW9uJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdGb3JiaWRkZW4gc2VjdGlvbicsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGl0bGUgZGlzcGxheWVkIHdoZW4gYSB1c2VyIHJlZnVzZSB0aGUgY29ubmV0aW9uIHRvIGEgc2VjdGlvbidcbiAgICAgIH0sXG4gICAgICBmb3JiaWRkZW5TZWN0aW9uU3ViOiB7XG4gICAgICAgIGlkOiAnZm9yYmlkZGVuU2VjdGlvblN1YicsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnQSByZW1vdGUgdXNlciBhY3RpdmVseSByZWZ1c2VkIHlvdXIgcmVxdWVzdCB0byBvcGVuIHtzZWN0aW9ufS4nLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1N1YnRpdGxlIGRpc3BsYXllZCB3aGVuIGEgdXNlciByZWZ1c2UgdGhlIGNvbm5ldGlvbiB0byBhIHNlY3Rpb24nXG4gICAgICB9LFxuICAgICAgdHJ5QWdhaW46IHtcbiAgICAgICAgaWQ6ICd0cnlBZ2FpbicsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnVHJ5IGFnYWluJ1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3Qgc2VjdGlvbiA9IHRoaXMucHJvcHMuc2VjdGlvblxuICAgIGNvbnN0IGJsb2NrUmVxdWVzdCA9IHRoaXMucHJvcHMuYmxvY2tSZXF1ZXN0XG4gICAgY29uc3QgZGVmaW5lTWVzc2FnZSA9IHRoaXMucHJvcHMuaW50bC5mb3JtYXRNZXNzYWdlXG5cbiAgICByZXR1cm4gKFxuICAgICAgPEp1bWJvdHJvbiA+XG4gICAgICAgIDxoMT57IGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy5mb3JiaWRkZW5TZWN0aW9uKSB9PC9oMT5cblxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxwPnsgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLmZvcmJpZGRlblNlY3Rpb25TdWIsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHNlY3Rpb246IGRlZmluZU1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIGlkOiBzZWN0aW9uLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnTi9BJ1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSkgfVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgeyAhYmxvY2tSZXF1ZXN0ICYmXG4gICAgICAgICAgPHA+XG4gICAgICAgICAgICA8QnV0dG9uIGJzU3R5bGU9J3ByaW1hcnknIG9uQ2xpY2s9e3RoaXMuaGFuZGxlVHJ5QWdhaW59ID5cbiAgICAgICAgICAgICAgeyBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMudHJ5QWdhaW4pIH1cbiAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgfVxuICAgICAgPC9KdW1ib3Ryb24+XG4gICAgKVxuICB9XG5cbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAobmV4dFByb3BzKSB7XG4gICAgY29uc3QgeyBzZWN0aW9uLCBibG9ja1JlcXVlc3QsIGZpcnN0QWN0aXZlIH0gPSBuZXh0UHJvcHNcblxuICAgIHRoaXMuc2V0U3RhdGUoeyBzZWN0aW9uLCBibG9ja1JlcXVlc3QsIGZpcnN0QWN0aXZlIH0pXG4gIH1cblxuICBjb21wb25lbnRXaWxsTW91bnQgKCkge1xuICAgIGNvbnN0IHsgZmlyc3RBY3RpdmUgfSA9IHRoaXMucHJvcHNcbiAgICBpZiAoZmlyc3RBY3RpdmUpIHtcbiAgICAgIHRoaXMuZmlyc3RBY3RpdmF0aW9uKGZpcnN0QWN0aXZlKVxuICAgIH1cbiAgfVxufVxuXG5SZXF1ZXN0U2VjdGlvbi5wcm9wVHlwZXMgPSB7XG4gIHNlY3Rpb246IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGJsb2NrUmVxdWVzdDogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGZpcnN0QWN0aXZlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICByZXNldEZpcnN0QWN0aXZlOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgaGFuZGxlQWxsb3dTZWN0aW9uQ2xpY2s6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBpbnRsOiBSZWFjdC5Qcm9wVHlwZXMub2JqZWN0XG59XG5cblJlcXVlc3RTZWN0aW9uLmRlZmF1bHRQcm9wcyA9IHtcbiAgc2VjdGlvbjogJycsXG4gIGJsb2NrUmVxdWVzdDogZmFsc2UsXG4gIGZpcnN0QWN0aXZlOiBudWxsLFxuICByZXNldEZpcnN0QWN0aXZlOiAoKSA9PiB7fSxcbiAgaGFuZGxlQWxsb3dTZWN0aW9uQ2xpY2s6ICgpID0+IHt9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdEludGwoUmVxdWVzdFNlY3Rpb24pXG4iLCIvLyBzcmMvY29tcG9uZW50cy9hcHAtbWFpbi9pbmRleC5qc3hcblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQ29udGFpbmVyIH0gZnJvbSAnZmx1eC91dGlscydcblxuLy8gQ29tcG9uZW50c1xuaW1wb3J0IFN5c3RlbVZpZXcgZnJvbSAnLi4vY29tcG9uZW50cy9zeXN0ZW0nXG5pbXBvcnQgU2VydmljZXNNYWluIGZyb20gJy4uL3NlcnZpY2VzLW1hbmFnZXIvY29tcG9uZW50cy9zZXJ2aWNlcy1tYWluJ1xuaW1wb3J0IFByb2Nlc3Nlc01haW4gZnJvbSAnLi4vcHJvY2Vzc2VzLW1hbmFnZXIvY29tcG9uZW50cydcbmltcG9ydCBGaWxlc1ZpZXcgZnJvbSAnLi4vY29tcG9uZW50cy9maWxlcydcbmltcG9ydCBUZXJtaW5hbFZpZXcgZnJvbSAnLi4vY29tcG9uZW50cy90ZXJtaW5hbCdcbmltcG9ydCBEaXNwbGF5VmlldyBmcm9tICcuLi9jb21wb25lbnRzL2Rpc3BsYXknXG5pbXBvcnQgU2hhcmVBZ2VudCBmcm9tICcuLi9jb21wb25lbnRzL3NoYXJlJ1xuaW1wb3J0IFJlcXVlc3RTZWN0aW9uIGZyb20gJy4uL2NvbXBvbmVudHMvcmVxdWVzdC1zZWN0aW9uJ1xuaW1wb3J0IEluZm9QYW5lbCBmcm9tICcuLi9jb21wb25lbnRzL2luZm8tcGFuZWwnXG5cbmNvbnN0IFByb2Nlc3Nlc0NvbnRhaW5lciA9IENvbnRhaW5lci5jcmVhdGUoUHJvY2Vzc2VzTWFpbiwgeyB3aXRoUHJvcHM6IGZhbHNlIH0pXG5jb25zdCBTZXJ2aWNlc0NvbnRhaW5lciA9IENvbnRhaW5lci5jcmVhdGUoU2VydmljZXNNYWluLCB7IHdpdGhQcm9wczogZmFsc2UgfSlcblxuY29uc3QgU2VjdGlvbiA9IChwcm9wcykgPT4gKFxuICA8ZGl2IGlkPSdlaG9ydXMtc2VjdGlvbic+XG4gICAgeyBwcm9wcy5zZWxlY3RlZCA9PT0gJ3N5c3RlbScgJiZcbiAgICAgIDxTeXN0ZW1WaWV3IC8+XG4gICAgfVxuICAgIHsgcHJvcHMuc2VsZWN0ZWQgPT09ICdwcm9jZXNzZXMnICYmIHByb3BzLmFsbG93ICYmXG4gICAgICA8UHJvY2Vzc2VzQ29udGFpbmVyIC8+XG4gICAgfVxuICAgIHsgcHJvcHMuc2VsZWN0ZWQgPT09ICdzZXJ2aWNlcycgJiYgcHJvcHMuYWxsb3cgJiZcbiAgICAgIDxTZXJ2aWNlc0NvbnRhaW5lciAvPlxuICAgIH1cbiAgICB7IHByb3BzLnNlbGVjdGVkID09PSAnZmlsZXMnICYmIHByb3BzLmFsbG93ICYmIDxGaWxlc1ZpZXcgLz4gfVxuICAgIHsgcHJvcHMuc2VsZWN0ZWQgPT09ICdzaGFyZScgJiYgcHJvcHMuYWxsb3cgJiZcbiAgICAgIDxTaGFyZUFnZW50IC8+XG4gICAgfVxuICAgIHsgcHJvcHMuc2VsZWN0ZWQgIT09ICdzeXN0ZW0nICYmICFwcm9wcy5hbGxvdyAmJiAhcHJvcHMuZmV0Y2hpbmdSZW1vdGUgJiZcbiAgICAgIDxSZXF1ZXN0U2VjdGlvblxuICAgICAgICBzZWN0aW9uPXtwcm9wcy5zZWxlY3RlZH1cbiAgICAgICAgYmxvY2tSZXF1ZXN0PXtwcm9wcy5ibG9ja1JlcXVlc3R9XG4gICAgICAgIGhhbmRsZUFsbG93U2VjdGlvbkNsaWNrPXtwcm9wcy5oYW5kbGVBbGxvd1NlY3Rpb25DbGlja31cbiAgICAgICAgZmlyc3RBY3RpdmU9e3Byb3BzLmZpcnN0QWN0aXZlfVxuICAgICAgICByZXNldEZpcnN0QWN0aXZlPXtwcm9wcy5yZXNldEZpcnN0QWN0aXZlfSAvPlxuICAgIH1cbiAgICB7IHByb3BzLmZldGNoaW5nUmVtb3RlICYmICFwcm9wcy5hbGxvdyAmJlxuICAgICAgPEluZm9QYW5lbCBpc0ZldGNoaW5nU2VjdGlvbiAvPlxuICAgIH1cbiAgPC9kaXY+XG4pXG5TZWN0aW9uLnByb3BUeXBlcyA9IHtcbiAgc2VsZWN0ZWQ6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGFsbG93OiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgYmxvY2tSZXF1ZXN0OiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgZmV0Y2hpbmdSZW1vdGU6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBmaXJzdEFjdGl2ZTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgcmVzZXRGaXJzdEFjdGl2ZTogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGhhbmRsZUFsbG93U2VjdGlvbkNsaWNrOiBSZWFjdC5Qcm9wVHlwZXMuZnVuY1xufVxuU2VjdGlvbi5kZWZhdWx0UHJvcHMgPSB7XG4gIHNlbGVjdGVkOiAnc3lzdGVtJyxcbiAgYWxsb3c6IGZhbHNlLFxuICBibG9ja1JlcXVlc3Q6IGZhbHNlLFxuICBmZXRjaGluZ1JlbW90ZTogZmFsc2UsXG4gIGZpcnN0QWN0aXZlOiBudWxsLFxuICByZXNldEZpcnN0QWN0aXZlOiAoKSA9PiB7fSxcbiAgaGFuZGxlQWxsb3dTZWN0aW9uQ2xpY2s6ICgpID0+IHt9XG59XG5cbi8vIEhBQ0sgdG8gYXZvaWQgdGhlIHRlcm1pbmFsIGFuZCBkaXNwbGF5IHVubW91bnRcbmV4cG9ydCBjb25zdCBQZXJzaXN0ZW50U2VjdGlvbnMgPSAocHJvcHMpID0+IChcbiAgPGRpdiBpZD0nZWhvcnVzLXBlcnNpc3RlbnQtY29udGFpbmVyJz5cbiAgICA8VGVybWluYWxWaWV3IC8+XG4gICAgPERpc3BsYXlWaWV3IC8+XG4gIDwvZGl2PlxuKVxuXG5leHBvcnQgZGVmYXVsdCBTZWN0aW9uXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnXG5pbXBvcnQge1xuICBGb3JtR3JvdXAsIElucHV0R3JvdXAsIEZvcm1Db250cm9sLCBBbGVydCwgQnV0dG9uXG59IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcbmltcG9ydCB7XG4gIGRlZmluZU1lc3NhZ2VzLCBpbmplY3RJbnRsLCBpbnRsU2hhcGUsIEZvcm1hdHRlZE1lc3NhZ2Vcbn0gZnJvbSAncmVhY3QtaW50bCdcblxuaW1wb3J0IHsgZ2V0VGVtcFBhc3MgfSBmcm9tICcuLi9hY3Rpb25zL2FnZW50J1xuXG4vLyBNZXNzYWdlcyBkZWZpbml0aW9uc1xuY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gIGVycm9yOiB7XG4gICAgaWQ6ICdlcnJvcicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdFcnJvcidcbiAgfSxcbiAgZXhwaXJhdGlvbkluTWludXRlczoge1xuICAgIGlkOiAnZXhwaXJhdGlvbkluTWludXRlcycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdFeHBpcmF0aW9uIGluIG1pbnV0ZXMnXG4gIH0sXG4gIHNoYXJlQWdlbnRBY2Nlc3M6IHtcbiAgICBpZDogJ3NoYXJlLWFnZW50LWFjY2VzcycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdTaGFyZSB0aGUgYWNjZXNzIHRvIHRoaXMgYWdlbnQnLFxuICAgIGRlc2NyaXB0aW9uOiAnRXhwbGFuYXRpb24gc2hhcmluZyB0aGUgYWNjZXNzJ1xuICB9LFxuICBzaGFyZVdhcm5pbmc6IHtcbiAgICBpZDogJ3NoYXJlLXdhcm5pbmctbWVzc2FnZScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdSZW1lbWJlciB0byBkaXNjb25uZWN0IGZyb20gdGhpcyBhZ2VudCB0byBhbGxvdyB0aGUgY29ubmVjdGlvbiBvZiBhbm90aGVyIHVzZXInLFxuICAgIGRlc2NyaXB0aW9uOiAnRXhwbGFuYXRpb24gYWJvdXQgZGlzY29ubmVjdGluZyBiZWZvcmUgc2hhcmUgdGhlIFVSTCBvZiBhZ2VudCBzaGFyaW5nJ1xuICB9LFxuICBnZW5lcmF0ZVVybEV4cGxhbmF0aW9uOiB7XG4gICAgaWQ6ICdnZW5lcmF0ZVVybEV4cGxhbmF0aW9uJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1dpdGggdGhpcyB1cmwsIHBlb3BsZSB3aWxsIGFjY2VzcyBkaXJlY3RseSB0byB0aGlzIGFnZW50IGR1cmluZyB0aGUgdGltZSBzcGVjaWZpZWQgd2l0aG91dCB0aGUgcmVxdWlyZW1lbnRzIG9mIGhhdmluZyBhbiBhY2NvdW50IG9yIGJlaW5nIGxvZ2dlZCBpbi4nLFxuICAgIGRlc2NyaXB0aW9uOiAnRXhwbGFuYXRpb24gYWJvdXQgZ2VuZXJhdGluZyB1cmwnXG4gIH0sXG4gIHJlcXVlc3RpbmdQYXNzRG90czoge1xuICAgIGlkOiAncmVxdWVzdGluZ1Bhc3NEb3RzJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1JlcXVlc3RpbmcgcGFzcy4uLidcbiAgfSxcbiAgcmVxdWVzdGluZ1VybERvdHM6IHtcbiAgICBpZDogJ3JlcXVlc3RpbmdVcmxEb3RzJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1JlcXVlc3RpbmcgVVJMLi4uJ1xuICB9LFxuICBnZW5lcmF0ZVVybDoge1xuICAgIGlkOiAnZ2VuZXJhdGVVcmwnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnR2VuZXJhdGUgVVJMJ1xuICB9LFxuICB0ZW1wb3JhcnlVcmw6IHtcbiAgICBpZDogJ3RlbXBvcmFyeVVybCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUZW1wb3JhcnkgVVJMJ1xuICB9LFxuICBkaXNjb25uZWN0VXNlcjoge1xuICAgIGlkOiAnZGlzY29ubmVjdFVzZXInLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRGlzY29ubmVjdCBub3cnXG4gIH1cbn0pXG5cbmNsYXNzIFNoYXJlQWdlbnRVUkwgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgICAgIGVycm9yOiBmYWxzZSxcbiAgICAgIGVycm9yTWVzc2FnZTogJycsXG4gICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgIHVybDogJydcbiAgICB9XG5cbiAgICB0aGlzLnN0YXRlID0gaW5pdGlhbFN0YXRlXG5cbiAgICB0aGlzLmdlblNoYXJlVVJMID0gKHtcbiAgICAgIHBhc3MsIGV4cGlyZXNBdCA9IDMwMCwgaGFuZGxlVGVtcFBhc3NHZW5lcmF0ZWRcbiAgICB9ID0gdGhpcy5wcm9wcykgPT4ge1xuICAgICAgLy8gTG9hZGluZyBzdGFydFxuICAgICAgdGhpcy5zZXRTdGF0ZShPYmplY3QuYXNzaWduKHt9LCBpbml0aWFsU3RhdGUsIHsgbG9hZGluZzogdHJ1ZSB9KSlcblxuICAgICAgY29uc3QgZXhwaXJlc0luID0gZXhwaXJlc0F0IC0gKERhdGUubm93KCkgLyAxMDAwIHwgMClcblxuICAgICAgLy8gU2lnbmF0dXJlIG9mIGhhbmRsZVRlbXBQYXNzR2VuZXJhdGVkOlxuICAgICAgLy8gKHBhc3M6IFN0cmluZywgZXhwaXJlc0luOiBJbnQsIGNhbGxiYWNrOiAoZXJyOiBFcnJvciwgdXJsOiBTdHJpbmcpID0+IFZvaWQpID0+IFZvaWRcbiAgICAgIGhhbmRsZVRlbXBQYXNzR2VuZXJhdGVkKHBhc3MsIGV4cGlyZXNJbiwgKGVyciwgdXJsKSA9PiB7XG4gICAgICAgIC8vIExvYWRpbmcgZW5kc1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZShPYmplY3QuYXNzaWduKHt9LCBpbml0aWFsU3RhdGUsIHtcbiAgICAgICAgICAgIGVycm9yOiB0cnVlLCBlcnJvck1lc3NhZ2U6IGVyci5tZXNzYWdlXG4gICAgICAgICAgfSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZShPYmplY3QuYXNzaWduKHt9LCBpbml0aWFsU3RhdGUsIHsgdXJsOiB1cmwgfSkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGVycm9yLCBlcnJvck1lc3NhZ2UsIGxvYWRpbmcsIHVybCB9ID0gdGhpcy5zdGF0ZVxuICAgIGNvbnN0IHsgaW50bDogeyBmb3JtYXRNZXNzYWdlIH0sIGhhbmRsZURpc2Nvbm5lY3RDbGljayB9ID0gdGhpcy5wcm9wc1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXY+XG4gICAgICAgIHsgZXJyb3IgJiZcbiAgICAgICAgICA8QWxlcnQgYnNTdHlsZT0nZGFuZ2VyJz5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IGVycm9yTWVzc2FnZVxuICAgICAgICAgICAgICAgIDogPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLmVycm9yfSAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvQWxlcnQ+XG4gICAgICAgIH1cbiAgICAgICAgeyBsb2FkaW5nICYmXG4gICAgICAgICAgPEFsZXJ0PjxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5yZXF1ZXN0aW5nVXJsRG90c30gLz48L0FsZXJ0PlxuICAgICAgICB9XG4gICAgICAgIHsgIWxvYWRpbmcgJiYgdXJsLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzTmFtZT0naGVscCc+XG4gICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5nZW5lcmF0ZVVybEV4cGxhbmF0aW9ufSAvPlxuICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgIDxGb3JtQ29udHJvbFxuICAgICAgICAgICAgICBjb21wb25lbnRDbGFzcz0naW5wdXQnXG4gICAgICAgICAgICAgIG5hbWU9J3RlbXAtdXJsJ1xuICAgICAgICAgICAgICB0eXBlPSd0ZXh0J1xuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17Zm9ybWF0TWVzc2FnZShtZXNzYWdlcy50ZW1wb3JhcnlVcmwpfVxuICAgICAgICAgICAgICB2YWx1ZT17dXJsfVxuICAgICAgICAgICAgICBvbkZvY3VzPXsoZSkgPT4gZS50YXJnZXQuc2VsZWN0KCl9XG4gICAgICAgICAgICAgIGF1dG9Gb2N1cyAvPlxuICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nYWxlcnQgYWxlcnQtZGFuZ2VyJyByb2xlPSdhbGVydCc+XG4gICAgICAgICAgICAgIDxoND5cbiAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMuc2hhcmVXYXJuaW5nfSAvPlxuICAgICAgICAgICAgICAgIHshIWhhbmRsZURpc2Nvbm5lY3RDbGljayAmJlxuICAgICAgICAgICAgICAgICAgPHNwYW4+Jm5ic3A7XG4gICAgICAgICAgICAgICAgICAgIDxCdXR0b24gb25DbGljaz17aGFuZGxlRGlzY29ubmVjdENsaWNrfT5cbiAgICAgICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMuZGlzY29ubmVjdFVzZXJ9IC8+XG4gICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9oND5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgdGhpcy5nZW5TaGFyZVVSTCgpXG4gIH1cblxuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIChuZXh0UHJvcHMpIHtcbiAgICBpZiAobmV4dFByb3BzLnBhc3MgJiZcbiAgICAgICAgbmV4dFByb3BzLnBhc3MubGVuZ3RoID4gMCAmJlxuICAgICAgICBuZXh0UHJvcHMucGFzcyAhPT0gdGhpcy5wcm9wcy5wYXNzKSB7XG4gICAgICB0aGlzLmdlblNoYXJlVVJMKHsgLi4udGhpcy5wcm9wcywgLi4ubmV4dFByb3BzIH0pXG4gICAgfVxuICB9XG59XG5cblNoYXJlQWdlbnRVUkwucHJvcFR5cGVzID0ge1xuICBwYXNzOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIGV4cGlyZXNBdDogUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgaGFuZGxlVGVtcFBhc3NHZW5lcmF0ZWQ6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGludGw6IGludGxTaGFwZS5pc1JlcXVpcmVkLFxuICBoYW5kbGVEaXNjb25uZWN0Q2xpY2s6IFJlYWN0LlByb3BUeXBlcy5mdW5jXG59XG5cbmNsYXNzIFNoYXJlQWdlbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIHRoaXMuaGFuZGxlU3VibWl0ID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgY29uc3QgeyBnZXRUZW1wUGFzcywgZGVmYXVsdEV4cGlyYXRpb24gfSA9IHRoaXMucHJvcHNcbiAgICAgIGlmIChnZXRUZW1wUGFzcykge1xuICAgICAgICBjb25zdCBtaW51dGVzID0gZS50YXJnZXQubWludXRlcy52YWx1ZSB8fCBkZWZhdWx0RXhwaXJhdGlvblxuICAgICAgICBjb25zdCBzZWNvbmRzID0gbWludXRlcyAqIDYwXG4gICAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IE51bWJlci5wYXJzZUludCgoRGF0ZS5ub3coKSAvIDEwMDApICsgc2Vjb25kcywgMTApXG4gICAgICAgIGdldFRlbXBQYXNzKGV4cGlyZXNBdClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRlZmF1bHRFeHBpcmF0aW9uLCBlcnJvciwgZXJyb3JNZXNzYWdlLCBmZXRjaGluZyxcbiAgICAgIHBhc3MsIGV4cGlyZXNBdCwgaGFuZGxlVGVtcFBhc3NHZW5lcmF0ZWQsXG4gICAgICBpbnRsLCBoYW5kbGVEaXNjb25uZWN0Q2xpY2tcbiAgICB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgZm9ybWF0TWVzc2FnZSB9ID0gaW50bFxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdwYW5lbCBwYW5lbC1kZWZhdWx0Jz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3BhbmVsLWhlYWRpbmcnPlxuICAgICAgICAgIDxoND48Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMuc2hhcmVBZ2VudEFjY2Vzc30gLz48L2g0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3BhbmVsLWJvZHknPlxuICAgICAgICAgIHsgZXJyb3IgJiZcbiAgICAgICAgICAgIDxBbGVydCBic1N0eWxlPSdkYW5nZXInPlxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgID8gZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgICA6IDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5lcnJvcn0gLz5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9BbGVydD5cbiAgICAgICAgICB9XG4gICAgICAgICAgeyBmZXRjaGluZyAmJlxuICAgICAgICAgICAgPEFsZXJ0PjxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5yZXF1ZXN0aW5nUGFzc0RvdHN9IC8+PC9BbGVydD5cbiAgICAgICAgICB9XG4gICAgICAgICAgeyAhZmV0Y2hpbmcgJiZcbiAgICAgICAgICAgIDxmb3JtIG9uU3VibWl0PXt0aGlzLmhhbmRsZVN1Ym1pdH0+XG4gICAgICAgICAgICAgIDxzbWFsbD5cbiAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMuZXhwaXJhdGlvbkluTWludXRlc30gLz5cbiAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgPEZvcm1Hcm91cD5cbiAgICAgICAgICAgICAgICA8SW5wdXRHcm91cD5cbiAgICAgICAgICAgICAgICAgIDxJbnB1dEdyb3VwLkJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiB0eXBlPSdzdWJtaXQnIGJzU3R5bGU9J3ByaW1hcnknPlxuICAgICAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5nZW5lcmF0ZVVybH0gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICA8L0lucHV0R3JvdXAuQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPEZvcm1Db250cm9sXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudENsYXNzPSdpbnB1dCdcbiAgICAgICAgICAgICAgICAgICAgbmFtZT0nbWludXRlcydcbiAgICAgICAgICAgICAgICAgICAgdHlwZT0nbnVtYmVyJ1xuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17Zm9ybWF0TWVzc2FnZShtZXNzYWdlcy5leHBpcmF0aW9uSW5NaW51dGVzKX1cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlPXtkZWZhdWx0RXhwaXJhdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgYXV0b0ZvY3VzXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIC8+XG4gICAgICAgICAgICAgICAgPC9JbnB1dEdyb3VwPlxuICAgICAgICAgICAgICA8L0Zvcm1Hcm91cD5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICB9XG4gICAgICAgICAgeyAhZmV0Y2hpbmcgJiYgKHBhc3MgJiYgcGFzcy5sZW5ndGggPiAwKSAmJlxuICAgICAgICAgICAgPFNoYXJlQWdlbnRVUkxcbiAgICAgICAgICAgICAgcGFzcz17cGFzc31cbiAgICAgICAgICAgICAgZXhwaXJlc0F0PXtleHBpcmVzQXR9XG4gICAgICAgICAgICAgIGhhbmRsZVRlbXBQYXNzR2VuZXJhdGVkPXtoYW5kbGVUZW1wUGFzc0dlbmVyYXRlZH1cbiAgICAgICAgICAgICAgaGFuZGxlRGlzY29ubmVjdENsaWNrPXtoYW5kbGVEaXNjb25uZWN0Q2xpY2t9XG4gICAgICAgICAgICAgIGludGw9e2ludGx9IC8+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxufVxuXG5TaGFyZUFnZW50LnByb3BUeXBlcyA9IE9iamVjdC5hc3NpZ24oe1xuICBkZWZhdWx0RXhwaXJhdGlvbjogUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgZXJyb3I6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBlcnJvck1lc3NhZ2U6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGZldGNoaW5nOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgcGFzczogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgZXhwaXJlc0F0OiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICBnZXRUZW1wUGFzczogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGhhbmRsZVRlbXBQYXNzR2VuZXJhdGVkOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBpbnRsOiBpbnRsU2hhcGUuaXNSZXF1aXJlZCxcbiAgaGFuZGxlRGlzY29ubmVjdENsaWNrOiBSZWFjdC5Qcm9wVHlwZXMuZnVuY1xufSwgU2hhcmVBZ2VudFVSTC5wcm9wVHlwZXMpXG5cblNoYXJlQWdlbnQuZGVmYXVsdFByb3BzID0ge1xuICBkZWZhdWx0RXhwaXJhdGlvbjogMTUsXG4gIGVycm9yOiBmYWxzZSxcbiAgZXJyb3JNZXNzYWdlOiAnJyxcbiAgZmV0Y2hpbmc6IGZhbHNlLFxuICBwYXNzOiAnJyxcbiAgZ2V0VGVtcFBhc3M6ICgpID0+IHt9XG59XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9IChzdGF0ZSkgPT4gKHtcbiAgZXJyb3I6IHN0YXRlLmFnZW50LnRlbXBQYXNzLmVycm9yLFxuICBlcnJvck1lc3NhZ2U6IHN0YXRlLmFnZW50LnRlbXBQYXNzLmVycm9yTWVzc2FnZSxcbiAgZmV0Y2hpbmc6IHN0YXRlLmFnZW50LnRlbXBQYXNzLmZldGNoaW5nLFxuICBwYXNzOiBzdGF0ZS5hZ2VudC50ZW1wUGFzcy5wYXNzLFxuICBleHBpcmVzQXQ6IHN0YXRlLmFnZW50LnRlbXBQYXNzLmV4cGlyZXNBdCxcbiAgaGFuZGxlVGVtcFBhc3NHZW5lcmF0ZWQ6IHN0YXRlLmFwcC5oYW5kbGVUZW1wUGFzc0dlbmVyYXRlZCxcbiAgaGFuZGxlRGlzY29ubmVjdENsaWNrOiBzdGF0ZS5hcHAuaGFuZGxlRGlzY29ubmVjdFxufSlcbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IChkaXNwYXRjaCwgcHJvcHMpID0+ICh7XG4gIGdldFRlbXBQYXNzOiAoZXhwaXJlcykgPT4gZGlzcGF0Y2goZ2V0VGVtcFBhc3MoZXhwaXJlcykpXG59KVxuZXhwb3J0IGRlZmF1bHQgaW5qZWN0SW50bChcbiAgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoU2hhcmVBZ2VudClcbilcbiIsIi8vIHNyYy9zeXN0ZW0vY29tcG9uZW50cy9zeXN0ZW0tYWRkcmVzcy9pbmRleC5qc3hcblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgaW5qZWN0SW50bCB9IGZyb20gJ3JlYWN0LWludGwnXG5cbi8vIE1lc3NhZ2VzIGRlZmluaXRpb25zXG5jb25zdCBtZXNzYWdlcyA9IHtcbiAgaG9zdG5hbWU6IHtcbiAgICBpZDogJ2hvc3RuYW1lJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0hvc3RhbmFtZSdcbiAgfSxcbiAgYWRkcmVzczoge1xuICAgIGlkOiAnYWRkcmVzcycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdBZGRyZXNzJ1xuICB9XG59XG5cbi8vIEltcGxlbWVudHMgZmx1eCBDb250YWluZXJcbmNsYXNzIFN5c3RlbUFkZHJlc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IGRlZmluZU1lc3NhZ2UgPSB0aGlzLnByb3BzLmludGwuZm9ybWF0TWVzc2FnZVxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0nc3lzdGVtLWFkZHJlc3Mgd2VsbCc+XG4gICAgICAgIHtcbiAgICAgICAgICAodGhpcy5wcm9wcy5ob3N0bmFtZS5sZW5ndGggPiAwKVxuICAgICAgICAgID8gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICAgICAgICB7IGRlZmluZU1lc3NhZ2UobWVzc2FnZXMuaG9zdG5hbWUpIH1cbiAgICAgICAgICAgICAgPC9zdHJvbmc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdwdWxsLXJpZ2h0Jz5cbiAgICAgICAgICAgICAgICB7IHRoaXMucHJvcHMuaG9zdG5hbWUgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIClcbiAgICAgICAgICA6IG51bGxcbiAgICAgICAgfVxuICAgICAgICB7XG4gICAgICAgICAgKHRoaXMucHJvcHMuYWRkcmVzcy5sZW5ndGggPiAwKVxuICAgICAgICAgID8gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICAgICAgICB7IGRlZmluZU1lc3NhZ2UobWVzc2FnZXMuYWRkcmVzcykgfVxuICAgICAgICAgICAgICA8L3N0cm9uZz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3B1bGwtcmlnaHQnPlxuICAgICAgICAgICAgICAgIHsgdGhpcy5wcm9wcy5hZGRyZXNzIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApXG4gICAgICAgICAgOiBudWxsXG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIHNob3VsZENvbXBvbmVudFVwZGF0ZSAobmV4dFByb3BzKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucHJvcHMuaG9zdG5hbWUgIT09IG5leHRQcm9wcy5ob3N0bmFtZSB8fFxuICAgICAgdGhpcy5wcm9wcy5hZGRyZXNzICE9PSBuZXh0UHJvcHMuYWRkcmVzc1xuICAgIClcbiAgfVxufVxuXG5TeXN0ZW1BZGRyZXNzLnByb3BUeXBlcyA9IHtcbiAgaG9zdG5hbWU6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGFkZHJlc3M6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG5cbiAgaW50bDogUmVhY3QuUHJvcFR5cGVzLm9iamVjdFxufVxuXG5TeXN0ZW1BZGRyZXNzLmRlZmF1bHRQcm9wcyA9IHtcbiAgaG9zdG5hbWU6ICcnLFxuICBhZGRyZXNzOiAnJ1xufVxuXG5leHBvcnQgZGVmYXVsdCBpbmplY3RJbnRsKFN5c3RlbUFkZHJlc3MpXG4iLCIvLyBzcmMvc3lzdGVtL2NvbXBvbmVudHMvc3lzdGVtLWFnZW50L2luZGV4LmpzeFxuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnXG5pbXBvcnQgeyBGb3JtYXR0ZWRNZXNzYWdlLCBGb3JtYXR0ZWRSZWxhdGl2ZSB9IGZyb20gJ3JlYWN0LWludGwnXG5cbi8vIE1lc3NhZ2VzIGRlZmluaXRpb25zXG5jb25zdCBtZXNzYWdlcyA9IHtcbiAgYWdlbnRWZXJzaW9uOiB7XG4gICAgaWQ6ICdhZ2VudFZlcnNpb24nLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnQWdlbnQgdmVyc2lvbidcbiAgfSxcbiAgdXB0aW1lOiB7XG4gICAgaWQ6ICd1cHRpbWUnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVXB0aW1lJ1xuICB9XG59XG5cbi8vIEltcGxlbWVudHMgZmx1eCBDb250YWluZXJcbmNsYXNzIFN5c3RlbUFnZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9J3N5c3RlbS1hZ2VudCB3ZWxsJz5cbiAgICAgICAge1xuICAgICAgICAgICh0aGlzLnByb3BzLnZlcnNpb24ubGVuZ3RoID4gMClcbiAgICAgICAgICA/IChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxzdHJvbmc+XG4gICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLmFnZW50VmVyc2lvbn0gLz5cbiAgICAgICAgICAgICAgPC9zdHJvbmc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdwdWxsLXJpZ2h0Jz5cbiAgICAgICAgICAgICAgICB7IHRoaXMucHJvcHMudmVyc2lvbiB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKVxuICAgICAgICAgIDogbnVsbFxuICAgICAgICB9XG4gICAgICAgIHtcbiAgICAgICAgICAodGhpcy5wcm9wcy51cHRpbWUpXG4gICAgICAgICAgPyAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy51cHRpbWV9IC8+XG4gICAgICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncHVsbC1yaWdodCc+XG4gICAgICAgICAgICAgICAgPEZvcm1hdHRlZFJlbGF0aXZlXG4gICAgICAgICAgICAgICAgICB2YWx1ZT17dGhpcy5wcm9wcy5ub3cgLSB0aGlzLnByb3BzLnVwdGltZX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIClcbiAgICAgICAgICA6IG51bGxcbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlIChuZXh0UHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wcm9wcy52ZXJzaW9uICE9PSBuZXh0UHJvcHMudmVyc2lvbiB8fFxuICAgICAgdGhpcy5wcm9wcy51cHRpbWUgIT09IG5leHRQcm9wcy51cHRpbWVcbiAgICApXG4gIH1cbn1cblxuU3lzdGVtQWdlbnQucHJvcFR5cGVzID0ge1xuICB2ZXJzaW9uOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICB1cHRpbWU6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIG5vdzogUmVhY3QuUHJvcFR5cGVzLmluc3RhbmNlT2YoRGF0ZSlcbn1cblxuU3lzdGVtQWdlbnQuZGVmYXVsdFByb3BzID0ge1xuICB2ZXJzaW9uOiAnJyxcbiAgdXB0aW1lOiAwXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QoKCkgPT4gKHsgbm93OiBuZXcgRGF0ZSgpIH0pKShTeXN0ZW1BZ2VudClcbiIsIi8vIHNyYy9zeXN0ZW0vY29tcG9uZW50cy9zeXN0ZW0tZGVzY3JpcHRpb24vaW5kZXguanN4XG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcblxuLy8gSW1wbGVtZW50cyBmbHV4IENvbnRhaW5lclxuY2xhc3MgU3lzdGVtRGVzY3JpcHRpb24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIgKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0nc3lzdGVtLWRlc2NyaXB0aW9uIHdlbGwnPlxuICAgICAgICB7IHRoaXMucHJvcHMuZGVzY3JpcHRpb24gfVxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlIChuZXh0UHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wcm9wcy5kZXNjcmlwdGlvbiAhPT0gbmV4dFByb3BzLmRlc2NyaXB0aW9uXG4gICAgKVxuICB9XG59XG5cblN5c3RlbURlc2NyaXB0aW9uLnByb3BUeXBlcyA9IHtcbiAgZGVzY3JpcHRpb246IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZFxufVxuXG5TeXN0ZW1EZXNjcmlwdGlvbi5kZWZhdWx0UHJvcHMgPSB7XG4gIGRlc2NyaXB0aW9uOiAnJ1xufVxuXG5leHBvcnQgZGVmYXVsdCBTeXN0ZW1EZXNjcmlwdGlvblxuIiwiLy8gc3JjL3N5c3RlbS9jb21wb25lbnRzL3N5c3RlbS1oYXJkd2FyZS9pbmRleC5qc3hcblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IGh1bWFuaXplIGZyb20gJ2h1bWFuaXplJ1xuaW1wb3J0IHsgaW50bFNoYXBlLCBpbmplY3RJbnRsIH0gZnJvbSAncmVhY3QtaW50bCdcblxuLy8gTWVzc2FnZXMgZGVmaW5pdGlvbnNcbmNvbnN0IG1lc3NhZ2VzID0ge1xuICBjcHU6IHtcbiAgICBpZDogJ2NwdScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdDUFUnXG4gIH0sXG4gIHJhbToge1xuICAgIGlkOiAncmFtJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1JBTSdcbiAgfSxcbiAgaGRkOiB7XG4gICAgaWQ6ICdoZGQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnSEREJ1xuICB9XG59XG5cbi8vIEltcGxlbWVudHMgZmx1eCBDb250YWluZXJcbmNsYXNzIFN5c3RlbUhhcmR3YXJlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCBkZWZpbmVNZXNzYWdlID0gdGhpcy5wcm9wcy5pbnRsLmZvcm1hdE1lc3NhZ2VcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9J3N5c3RlbS1oYXJkd2FyZSB3ZWxsJz5cbiAgICAgICAge1xuICAgICAgICAgICh0aGlzLnByb3BzLmNwdURlc2NyaXB0aW9uLmxlbmd0aCA+IDApXG4gICAgICAgICAgPyAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgICAgICAgIHsgZGVmaW5lTWVzc2FnZShtZXNzYWdlcy5jcHUpIH1cbiAgICAgICAgICAgICAgPC9zdHJvbmc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdwdWxsLXJpZ2h0Jz5cbiAgICAgICAgICAgICAgICB7IHRoaXMucHJvcHMuY3B1RGVzY3JpcHRpb24gfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIClcbiAgICAgICAgICA6IG51bGxcbiAgICAgICAgfVxuICAgICAgICB7XG4gICAgICAgICAgKHRoaXMucHJvcHMucmFtKVxuICAgICAgICAgID8gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICAgICAgICB7IGRlZmluZU1lc3NhZ2UobWVzc2FnZXMucmFtKSB9XG4gICAgICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncHVsbC1yaWdodCc+XG4gICAgICAgICAgICAgICAgeyBodW1hbml6ZS5maWxlc2l6ZSh0aGlzLnByb3BzLnJhbSkgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIClcbiAgICAgICAgICA6IG51bGxcbiAgICAgICAgfVxuICAgICAgICB7XG4gICAgICAgICAgKHRoaXMucHJvcHMuaGRkKVxuICAgICAgICAgID8gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICAgICAgICB7IGRlZmluZU1lc3NhZ2UobWVzc2FnZXMuaGRkKSB9XG4gICAgICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncHVsbC1yaWdodCc+XG4gICAgICAgICAgICAgICAgeyBodW1hbml6ZS5maWxlc2l6ZSh0aGlzLnByb3BzLmhkZCkgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIClcbiAgICAgICAgICA6IG51bGxcbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlIChuZXh0UHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wcm9wcy5jcHVEZXNjcmlwdGlvbiAhPT0gbmV4dFByb3BzLmNwdURlc2NyaXB0aW9uIHx8XG4gICAgICB0aGlzLnByb3BzLnJhbSAhPT0gbmV4dFByb3BzLnJhbSB8fFxuICAgICAgdGhpcy5wcm9wcy5oZGQgIT09IG5leHRQcm9wcy5oZGRcbiAgICApXG4gIH1cbn1cblxuU3lzdGVtSGFyZHdhcmUucHJvcFR5cGVzID0ge1xuICBjcHVEZXNjcmlwdGlvbjogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgcmFtOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICBoZGQ6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIGludGw6IGludGxTaGFwZS5pc1JlcXVpcmVkXG59XG5cblN5c3RlbUhhcmR3YXJlLmRlZmF1bHRQcm9wcyA9IHtcbiAgY3B1RGVzY3JpcHRpb246ICcnLFxuICByYW06IDAsXG4gIGhkZDogMFxufVxuXG5leHBvcnQgZGVmYXVsdCBpbmplY3RJbnRsKFN5c3RlbUhhcmR3YXJlKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4J1xuaW1wb3J0IHsgQWxlcnQgfSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQgeyBpbmplY3RJbnRsIH0gZnJvbSAncmVhY3QtaW50bCdcblxuaW1wb3J0IHsgZmV0Y2hBZ2VudCB9IGZyb20gJy4uLy4uL2FjdGlvbnMvYWdlbnQnXG5pbXBvcnQgU3lzdGVtRGVzY3JpcHRpb24gZnJvbSAnLi9kZXNjcmlwdGlvbidcbmltcG9ydCBTeXN0ZW1IYXJkd2FyZSBmcm9tICcuL2hhcmR3YXJlJ1xuaW1wb3J0IFN5c3RlbU9TIGZyb20gJy4vb3MnXG5pbXBvcnQgU3lzdGVtQWdlbnQgZnJvbSAnLi9hZ2VudCdcbmltcG9ydCBTeXN0ZW1BZGRyZXNzIGZyb20gJy4vYWRkcmVzcydcblxuY29uc3QgbWVzc2FnZXMgPSB7XG4gIGNvbm5lY3RlZFRvOiB7XG4gICAgaWQ6ICdjb25uZWN0ZWRUbycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdDb25uZWN0ZWQgdG8ge2hvc3RuYW1lfSAoSUQ6e2FnZW50SUR9KScsXG4gICAgZGVzY3JpcHRpb246ICdUaXRsZSBmcm9tIHN5c3RlbSBpbmZvcm1hdGlvbiBjb25uZWN0aW9uIHRvIHJlbW90ZSBtYWNoaW5lJyxcbiAgICB2YWx1ZXM6IHtcbiAgICAgIGhvc3RuYW1lOiAnTi9BJ1xuICAgIH1cbiAgfSxcbiAgbG9hZGluZ0RvdHM6IHtcbiAgICBpZDogJ2xvYWRpbmdEb3RzJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0xvYWRpbmcuLi4nXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFN5c3RlbSA9IChwcm9wcykgPT4gKFxuICA8ZGl2IGNsYXNzTmFtZT0nc3lzdGVtLW1haW4gY29udGFpbmVyLWZsdWlkJz5cbiAgICA8aDM+XG4gICAgICB7IHByb3BzLmRlZmluZU1lc3NhZ2UoXG4gICAgICAgIG1lc3NhZ2VzLmNvbm5lY3RlZFRvLCB7XG4gICAgICAgICAgaG9zdG5hbWU6IHByb3BzLmhvc3RuYW1lLFxuICAgICAgICAgIGFnZW50SUQ6IHByb3BzLmFnZW50SUQgfVxuICAgICAgICApIH1cbiAgICA8L2gzPlxuICAgIDxiciAvPlxuICAgIHsgcHJvcHMuaXNGZXRjaGluZyAmJlxuICAgICAgPEFsZXJ0PlxuICAgICAgICB7IHByb3BzLmRlZmluZU1lc3NhZ2UobWVzc2FnZXMubG9hZGluZ0RvdHMpIH1cbiAgICAgIDwvQWxlcnQ+XG4gICAgfVxuICAgIHsgcHJvcHMuZGVzY3JpcHRpb24gJiYgcHJvcHMuZGVzY3JpcHRpb24ubGVuZ3RoID4gMCAmJlxuICAgICAgPGRpdiBjbGFzc05hbWU9J3Jvdyc+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2wteHMtMTInPlxuICAgICAgICAgIDxTeXN0ZW1EZXNjcmlwdGlvbiBkZXNjcmlwdGlvbj17cHJvcHMuZGVzY3JpcHRpb259IC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICAgIHsgIXByb3BzLmlzRmV0Y2hpbmcgJiYgISFwcm9wcy5yZWNlaXZlZEF0ICYmXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93Jz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbC14cy0xMiBjb2wtc20tNic+XG4gICAgICAgICAgPFN5c3RlbUhhcmR3YXJlXG4gICAgICAgICAgICBjcHVEZXNjcmlwdGlvbj17cHJvcHMuY3B1RGVzY3JpcHRpb259XG4gICAgICAgICAgICByYW09e3Byb3BzLnJhbX1cbiAgICAgICAgICAgIGhkZD17cHJvcHMuaGRkfSAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbC14cy0xMiBjb2wtc20tNic+XG4gICAgICAgICAgPFN5c3RlbU9TXG4gICAgICAgICAgICBvcz17cHJvcHMub3N9XG4gICAgICAgICAgICBvc1ZlcnNpb249e3Byb3BzLm9zVmVyc2lvbn1cbiAgICAgICAgICAgIGxhbmd1YWdlPXtwcm9wcy5sYW5ndWFnZX0gLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgeyAhcHJvcHMuaXNGZXRjaGluZyAmJiAhIXByb3BzLnJlY2VpdmVkQXQgJiZcbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cnPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sLXhzLTEyIGNvbC1zbS02Jz5cbiAgICAgICAgICA8U3lzdGVtQWdlbnRcbiAgICAgICAgICAgIHZlcnNpb249e3Byb3BzLnZlcnNpb259XG4gICAgICAgICAgICB1cHRpbWU9e3Byb3BzLnVwdGltZX0gLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2wteHMtMTIgY29sLXNtLTYnPlxuICAgICAgICAgIDxTeXN0ZW1BZGRyZXNzXG4gICAgICAgICAgICBob3N0bmFtZT17cHJvcHMuaG9zdG5hbWV9XG4gICAgICAgICAgICBhZGRyZXNzPXtwcm9wcy5hZGRyZXNzfSAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9kaXY+XG4pXG5cblN5c3RlbS5wcm9wVHlwZXMgPSB7XG4gIGlzRmV0Y2hpbmc6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICByZWNlaXZlZEF0OiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICBhZ2VudElEOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIGRlc2NyaXB0aW9uOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBjcHVEZXNjcmlwdGlvbjogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgcmFtOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICBoZGQ6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIG9zOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBvc1ZlcnNpb246IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGxhbmd1YWdlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICB2ZXJzaW9uOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICB1cHRpbWU6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIGhvc3RuYW1lOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBhZGRyZXNzOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBkZWZpbmVNZXNzYWdlOiBSZWFjdC5Qcm9wVHlwZXMuZnVuY1xufVxuU3lzdGVtLmRlZmF1bHRQcm9wcyA9IHtcbiAgaXNGZXRjaGluZzogZmFsc2UsXG4gIHJlY2VpdmVkQXQ6IG51bGxcbn1cblxuY2xhc3MgU3lzdGVtRmV0Y2hlciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgcmV0dXJuIDxTeXN0ZW0gey4uLnRoaXMucHJvcHN9IC8+XG4gIH1cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIGNvbnN0IFBFUklPRCA9IDE4MDAwMCAvLyAzIG1pbnV0ZXNcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gICAgaWYgKCF0aGlzLnByb3BzLmlzRmV0Y2hpbmcgJiYgKCF0aGlzLnByb3BzLnJlY2VpdmVkQXQgfHxcbiAgICAgICAgdGhpcy5wcm9wcy5yZWNlaXZlZEF0IDwgbm93IC0gUEVSSU9EKSkge1xuICAgICAgdGhpcy5wcm9wcy5mZXRjaEFnZW50KClcbiAgICB9XG4gIH1cbn1cblN5c3RlbUZldGNoZXIucHJvcFR5cGVzID0ge1xuICBmZXRjaEFnZW50OiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBpc0ZldGNoaW5nOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgcmVjZWl2ZWRBdDogUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcblxuICBpbnRsOiBSZWFjdC5Qcm9wVHlwZXMub2JqZWN0XG59XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9IChzdGF0ZSwgcHJvcHMpID0+IHtcbiAgcmV0dXJuIHtcbiAgICBpc0ZldGNoaW5nOiBzdGF0ZS5hZ2VudC5pc0ZldGNoaW5nLFxuICAgIHJlY2VpdmVkQXQ6IHN0YXRlLmFnZW50LnJlY2VpdmVkQXQsXG4gICAgYWdlbnRJRDogc3RhdGUuYWdlbnQuaWQsXG4gICAgdXB0aW1lOiBzdGF0ZS5hZ2VudC51cHRpbWUsXG4gICAgdmVyc2lvbjogc3RhdGUuYWdlbnQudmVyc2lvbixcbiAgICBhZGRyZXNzOiBzdGF0ZS5hZ2VudC5hZGRyZXNzLFxuICAgIGhvc3RuYW1lOiBzdGF0ZS5hZ2VudC5ob3N0bmFtZSxcbiAgICBkZXNjcmlwdGlvbjogc3RhdGUuYWdlbnQuZGVzY3JpcHRpb24sXG4gICAgbGFuZ3VhZ2U6IHN0YXRlLmFnZW50Lmxhbmd1YWdlLFxuICAgIG9zOiBzdGF0ZS5hZ2VudC5vcyxcbiAgICBvc1ZlcnNpb246IHN0YXRlLmFnZW50Lm9zVmVyc2lvbixcbiAgICBjcHVEZXNjcmlwdGlvbjogc3RhdGUuYWdlbnQuY3B1RGVzY3JpcHRpb24sXG4gICAgcmFtOiBzdGF0ZS5hZ2VudC5yYW0sXG4gICAgaGRkOiBzdGF0ZS5hZ2VudC5oZGRcbiAgfVxufVxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gKGRpc3BhdGNoLCBwcm9wcykgPT4ge1xuICByZXR1cm4ge1xuICAgIGZldGNoQWdlbnQ6ICgpID0+IGRpc3BhdGNoKGZldGNoQWdlbnQoKSksXG4gICAgZGVmaW5lTWVzc2FnZTogcHJvcHMuaW50bC5mb3JtYXRNZXNzYWdlXG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGluamVjdEludGwoY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoU3lzdGVtRmV0Y2hlcikpXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBpbmplY3RJbnRsIH0gZnJvbSAncmVhY3QtaW50bCdcblxuLy8gTWVzc2FnZXMgZGVmaW5pdGlvbnNcbmNvbnN0IG1lc3NhZ2VzID0ge1xuICBvczoge1xuICAgIGlkOiAnb3MnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnT1MnXG4gIH0sXG4gIGxhbjoge1xuICAgIGlkOiAnbGFuZ3VhZ2UnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnTGFuZ3VhZ2UnXG4gIH0sXG4gIGFyY2g6IHtcbiAgICBpZDogJ2FyY2hpdGVjdHVyZScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdBcmNoaXRlY2h0dXJlJ1xuICB9XG59XG5cbi8vIEltcGxlbWVudHMgZmx1eCBDb250YWluZXJcbmNsYXNzIFN5c3RlbU9TIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IG9zLCBvc1ZlcnNpb24sIGFyY2hpdGVjdHVyZSwgbGFuZ3VhZ2UgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCBkZWZpbmVNZXNzYWdlID0gdGhpcy5wcm9wcy5pbnRsLmZvcm1hdE1lc3NhZ2VcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0nc3lzdGVtLW9zIHdlbGwnPlxuICAgICAgICB7IG9zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICAgICAgeyBkZWZpbmVNZXNzYWdlKG1lc3NhZ2VzLm9zKSB9XG4gICAgICAgICAgICA8L3N0cm9uZz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdwdWxsLXJpZ2h0Jz5cbiAgICAgICAgICAgICAgeyBgJHtvc30gJHtvc1ZlcnNpb259YCB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICB7IGFyY2hpdGVjdHVyZS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxzdHJvbmc+XG4gICAgICAgICAgICAgIHsgZGVmaW5lTWVzc2FnZShtZXNzYWdlcy5hcmNoKSB9XG4gICAgICAgICAgICA8L3N0cm9uZz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdwdWxsLXJpZ2h0Jz5cbiAgICAgICAgICAgICAgeyBhcmNoaXRlY3R1cmUgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgeyBsYW5ndWFnZS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxzdHJvbmc+XG4gICAgICAgICAgICAgIHsgZGVmaW5lTWVzc2FnZShtZXNzYWdlcy5sYW4pIH1cbiAgICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3B1bGwtcmlnaHQnPlxuICAgICAgICAgICAgICB7IGxhbmd1YWdlIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cblxuICBzaG91bGRDb21wb25lbnRVcGRhdGUgKG5leHRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnByb3BzLm9zICE9PSBuZXh0UHJvcHMub3MgfHxcbiAgICAgIHRoaXMucHJvcHMub3NWZXJzaW9uICE9PSBuZXh0UHJvcHMub3NWZXJzaW9uIHx8XG4gICAgICB0aGlzLnByb3BzLmFyY2hpdGVjdHVyZSAhPT0gbmV4dFByb3BzLmFyY2hpdGVjdHVyZSB8fFxuICAgICAgdGhpcy5wcm9wcy5sYW5ndWFnZSAhPT0gbmV4dFByb3BzLmxhbmd1YWdlXG4gICAgKVxuICB9XG59XG5cblN5c3RlbU9TLnByb3BUeXBlcyA9IHtcbiAgb3M6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIG9zVmVyc2lvbjogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgYXJjaGl0ZWN0dXJlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBsYW5ndWFnZTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgaW50bDogUmVhY3QuUHJvcFR5cGVzLm9iamVjdFxufVxuXG5TeXN0ZW1PUy5kZWZhdWx0UHJvcHMgPSB7XG4gIG9zOiAnJyxcbiAgb3NWZXJzaW9uOiAnJyxcbiAgYXJjaGl0ZWN0dXJlOiAnJyxcbiAgbGFuZ3VhZ2U6ICcnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdEludGwoU3lzdGVtT1MpXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnXG5pbXBvcnQgeyBkZWZpbmVNZXNzYWdlcywgRm9ybWF0dGVkTWVzc2FnZSB9IGZyb20gJ3JlYWN0LWludGwnXG5pbXBvcnQgeyBBbGVydCB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcbmltcG9ydCBUZXJtIGZyb20gJ3h0ZXJtJ1xuaW1wb3J0IHsgcHJvcG9zZUdlb21ldHJ5IH0gZnJvbSAneHRlcm0vbGliL2FkZG9ucy9maXQnXG5pbXBvcnQgeyByZXNldFRlcm1TdGF0ZSwgaW5pdGlhbGl6ZVRlcm0sIHNlbmRUZXJtRGF0YSB9IGZyb20gJy4uL2FjdGlvbnMvdGVybWluYWwnXG5pbXBvcnQgeyBnZXRBY3RpdmVTZWN0aW9uLCBnZXRTZWN0aW9uIH0gZnJvbSAnLi4vcmVkdWNlcnMvYXBwJ1xuXG5jb25zdCBtZXNzYWdlcyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgbG9hZGluZ0RvdHM6IHsgaWQ6ICdsb2FkaW5nRG90cycsIGRlZmF1bHRNZXNzYWdlOiAnTG9hZGluZy4uLicgfVxufSlcblxuY29uc3QgSEVBREVSU0laRSA9IDUwXG5cbmV4cG9ydCBjbGFzcyBUZXJtaW5hbCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy50ZXJtID0gbnVsbFxuICAgIC8vIFRvIGZvY3VzIHRoZSB0ZXJtIHRleHRhcmVhXG4gICAgdGhpcy5fZm9jdXNUZXJtID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudGVybUZvY3VzVFJlZikgY2xlYXJUaW1lb3V0KHRoaXMudGVybUZvY3VzVFJlZilcbiAgICAgIHRoaXMudGVybUZvY3VzVFJlZiA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy50ZXJtKSB0aGlzLnRlcm0udGV4dGFyZWEuZm9jdXMoKVxuICAgICAgfSwgMSlcbiAgICB9XG4gICAgdGhpcy5fZGVzdHJveVRlcm0gPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy50ZXJtKSB7XG4gICAgICAgIHRoaXMudGVybS5kZXN0cm95KClcbiAgICAgICAgdGhpcy50ZXJtID0gbnVsbFxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9jcmVhdGVUZXJtID0gKCkgPT4ge1xuICAgICAgdGhpcy5fZGVzdHJveVRlcm0oKVxuICAgICAgdGhpcy50ZXJtID0gbmV3IFRlcm0oeyBjdXJzb3JCbGluazogdHJ1ZSB9KVxuICAgICAgdGhpcy50ZXJtLm9uKCdkYXRhJywgdGhpcy5wcm9wcy5zZW5kVGVybURhdGEpXG4gICAgICB0aGlzLnRlcm0ub3Blbih0aGlzLnJlZnMudGVybSwgdHJ1ZSlcbiAgICAgIGNvbnN0IHsgY29scywgcm93cyB9ID0gcHJvcG9zZUdlb21ldHJ5KHRoaXMudGVybSlcbiAgICAgIHRoaXMudGVybS5yZXNpemUoY29scywgcm93cylcbiAgICAgIHRoaXMucHJvcHMuaW5pdGlhbGl6ZVRlcm0oY29scywgcm93cylcbiAgICB9XG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgc2hvdywgc2hvd0hlYWRlciwgaXNJbml0aWFsaXppbmcgfSA9IHRoaXMucHJvcHNcbiAgICByZXR1cm4gKFxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9J3Rlcm1pbmFsLW1haW4nXG4gICAgICAgIHJlZj0nY29udGFpbmVyJz5cbiAgICAgICAgeyBzaG93ICYmICF0aGlzLnRlcm0gJiYgaXNJbml0aWFsaXppbmcgJiZcbiAgICAgICAgICA8QWxlcnQ+PEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLmxvYWRpbmdEb3RzfSAvPjwvQWxlcnQ+XG4gICAgICAgIH1cbiAgICAgICAgPGRpdiBzdHlsZT17e1xuICAgICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICAgIHRvcDogc2hvdyA/IChzaG93SGVhZGVyID8gYCR7SEVBREVSU0laRX1weGAgOiAnMHB4JykgOiBgY2FsYygxMDB2aCArIDEwMHB4KWAsXG4gICAgICAgICAgbGVmdDogJzBweCcsXG4gICAgICAgICAgd2lkdGg6ICcxMDB2dycsXG4gICAgICAgICAgaGVpZ2h0OiBzaG93SGVhZGVyID8gYGNhbGMoMTAwdmggLSAke0hFQURFUlNJWkV9cHgpYCA6ICcxMDB2aCcsXG4gICAgICAgICAgYmFja2dyb3VuZDogJyMwMDAwMDAnXG4gICAgICAgIH19PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSd0ZXJtaW5hbC1jb250YWluZXInIHJlZj0ndGVybScgc3R5bGU9e3tcbiAgICAgICAgICAgIGhlaWdodDogd2luZG93XG4gICAgICAgICAgICAgID8gc2hvd0hlYWRlclxuICAgICAgICAgICAgICAgID8gYCR7d2luZG93LmlubmVySGVpZ2h0IC0gSEVBREVSU0laRX1weGBcbiAgICAgICAgICAgICAgICA6IGAke3dpbmRvdy5pbm5lckhlaWdodH1weGBcbiAgICAgICAgICAgICAgOiAnMTAwJSdcbiAgICAgICAgICB9fSAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICBjb25zdCB7IHNob3csIGlzSW5pdGlhbGl6ZWQsIGlzSW5pdGlhbGl6aW5nIH0gPSB0aGlzLnByb3BzXG4gICAgaWYgKHNob3cgJiYgIXRoaXMudGVybSAmJiAhaXNJbml0aWFsaXplZCAmJiAhaXNJbml0aWFsaXppbmcpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVRlcm0oKVxuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgKG5leHRQcm9wcykge1xuICAgIHZhciB7XG4gICAgICBpc0FjdGl2ZSwgc2hvdywgaXNJbml0aWFsaXplZCwgaXNJbml0aWFsaXppbmcsIG5ld0RhdGEsIGRhdGFSZXZlaXZlZEF0XG4gICAgfSA9IG5leHRQcm9wc1xuXG4gICAgaWYgKGlzQWN0aXZlICYmICF0aGlzLnByb3BzLmlzQWN0aXZlICYmICEhdGhpcy50ZXJtKSB7XG4gICAgICB0aGlzLl9mb2N1c1Rlcm0oKVxuICAgIH1cbiAgICBpZiAoc2hvdyAmJiAhdGhpcy50ZXJtICYmICFpc0luaXRpYWxpemVkICYmICFpc0luaXRpYWxpemluZykge1xuICAgICAgdGhpcy5fY3JlYXRlVGVybSgpXG4gICAgICB0aGlzLl9mb2N1c1Rlcm0oKVxuICAgIH1cbiAgICBpZiAodGhpcy50ZXJtICYmIGlzSW5pdGlhbGl6ZWQgJiYgbmV3RGF0YSAmJlxuICAgICAgICB0aGlzLnByb3BzLmRhdGFSZXZlaXZlZEF0ICE9PSBkYXRhUmV2ZWl2ZWRBdCkge1xuICAgICAgLy8gTmV3IGRhdGEgdG8gd3JpdGVcbiAgICAgIHRoaXMudGVybS53cml0ZShuZXdEYXRhKVxuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50ICgpIHtcbiAgICB0aGlzLl9kZXN0cm95VGVybSgpXG4gICAgdGhpcy5wcm9wcy5yZXNldFRlcm1TdGF0ZSgpXG4gIH1cbn1cblxuVGVybWluYWwucHJvcFR5cGVzID0ge1xuICBpc0FjdGl2ZTogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIHNob3c6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBpc0luaXRpYWxpemluZzogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGlzSW5pdGlhbGl6ZWQ6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBjb2xzOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICByb3dzOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICBuZXdEYXRhOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBkYXRhUmV2ZWl2ZWRBdDogUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgcmVzZXRUZXJtU3RhdGU6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGluaXRpYWxpemVUZXJtOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBzZW5kVGVybURhdGE6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG5cbiAgc2hvd0hlYWRlcjogUmVhY3QuUHJvcFR5cGVzLmJvb2xcbn1cblRlcm1pbmFsLmRlZmF1bHRQcm9wcyA9IHtcbiAgaXNBY3RpdmU6IGZhbHNlLFxuICBzaG93OiBmYWxzZSxcbiAgaXNJbml0aWFsaXppbmc6IGZhbHNlLFxuICBpc0luaXRpYWxpemVkOiBmYWxzZSxcbiAgY29sczogODAsXG4gIHJvd3M6IDI0LFxuICBuZXdEYXRhOiBudWxsLFxuICBkYXRhUmV2ZWl2ZWRBdDogbnVsbFxufVxuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoc3RhdGUsIHByb3BzKSA9PiB7XG4gIGNvbnN0IGFjdGl2ZSA9IGdldEFjdGl2ZVNlY3Rpb24oc3RhdGUuYXBwKVxuICBjb25zdCB0ZXJtaW5hbFNlY3Rpb24gPSBnZXRTZWN0aW9uKHN0YXRlLmFwcCwgYWN0aXZlKVxuICByZXR1cm4ge1xuICAgIGlzSW5pdGlhbGl6aW5nOiBzdGF0ZS50ZXJtaW5hbC5pc0luaXRpYWxpemluZyxcbiAgICBpc0luaXRpYWxpemVkOiBzdGF0ZS50ZXJtaW5hbC5pc0luaXRpYWxpemVkLFxuICAgIGNvbHM6IHN0YXRlLnRlcm1pbmFsLmNvbHMsXG4gICAgcm93czogc3RhdGUudGVybWluYWwucm93cyxcbiAgICBuZXdEYXRhOiBzdGF0ZS50ZXJtaW5hbC5uZXdEYXRhLFxuICAgIGRhdGFSZXZlaXZlZEF0OiBzdGF0ZS50ZXJtaW5hbC5kYXRhUmV2ZWl2ZWRBdCxcbiAgICBpc0FjdGl2ZTogYWN0aXZlID09PSAndGVybWluYWwnLFxuICAgIHNob3c6IChhY3RpdmUgPT09ICd0ZXJtaW5hbCcgJiYgdGVybWluYWxTZWN0aW9uLmFsbG93ICYmXG4gICAgICBzdGF0ZS5hZ2VudC5pc0Nvbm5lY3RlZCAmJiBzdGF0ZS5hZ2VudC5pc0F1dGhlbnRpY2F0ZWQpLFxuICAgIHNob3dIZWFkZXI6IHN0YXRlLmFwcC5zaG93SGVhZGVyXG4gIH1cbn1cblxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gKGRpc3BhdGNoLCBwcm9wcykgPT4ge1xuICByZXR1cm4ge1xuICAgIHJlc2V0VGVybVN0YXRlOiAoKSA9PiBkaXNwYXRjaChyZXNldFRlcm1TdGF0ZSgpKSxcbiAgICBpbml0aWFsaXplVGVybTogKGNvbHMsIHJvd3MpID0+IGRpc3BhdGNoKGluaXRpYWxpemVUZXJtKGNvbHMsIHJvd3MpKSxcbiAgICBzZW5kVGVybURhdGE6IChkYXRhKSA9PiBkaXNwYXRjaChzZW5kVGVybURhdGEoZGF0YSkpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoVGVybWluYWwpXG4iLCIvLyBDb25uZWN0aW9uXG5leHBvcnQgY29uc3QgUkVTRVRfQUdFTlRfU1RBVEUgPSAnQ0xJRU5UX1JFU0VUX0FHRU5UX1NUQVRFJ1xuZXhwb3J0IGNvbnN0IENPTk5fQUdFTlRfUkVRVUVTVCA9ICdDTElFTlRfQ09OTl9BR0VOVF9SRVFVRVNUJ1xuZXhwb3J0IGNvbnN0IENPTk5fQUdFTlRfU1VDQ0VTUyA9ICdDTElFTlRfQ09OTl9BR0VOVF9TVUNDRVNTJ1xuZXhwb3J0IGNvbnN0IENPTk5fQUdFTlRfRkFJTFVSRSA9ICdDTElFTlRfQ09OTl9BR0VOVF9GQUlMVVJFJ1xuZXhwb3J0IGNvbnN0IERJU0NPTk5fQUdFTlRfUkVRVUVTVCA9ICdDTElFTlRfRElTQ09OTl9BR0VOVF9SRVFVRVNUJ1xuZXhwb3J0IGNvbnN0IERJU0NPTk5fQUdFTlRfU1VDQ0VTUyA9ICdDTElFTlRfRElTQ09OTl9BR0VOVF9TVUNDRVNTJ1xuZXhwb3J0IGNvbnN0IENMRUFSX0NPTk5fRVJST1IgPSAnQ0xJRU5UX0NMRUFSX0NPTk5fRVJST1InXG4vLyBBdXRoZW50aWNhdGlvblxuZXhwb3J0IGNvbnN0IEFVVEhfQUdFTlRfUkVRVUVTVCA9ICdDTElFTlRfQVVUSF9BR0VOVF9SRVFVRVNUJ1xuZXhwb3J0IGNvbnN0IEFVVEhfQUdFTlRfU1VDQ0VTUyA9ICdDTElFTlRfQVVUSF9BR0VOVF9TVUNDRVNTJ1xuZXhwb3J0IGNvbnN0IEFVVEhfQUdFTlRfRkFJTFVSRSA9ICdDTElFTlRfQVVUSF9BR0VOVF9GQUlMVVJFJ1xuZXhwb3J0IGNvbnN0IFJFVk9LRV9BR0VOVF9BVVRIID0gJ0NMSUVOVF9SRVZPS0VfQUdFTlRfQVVUSCdcbmV4cG9ydCBjb25zdCBDTEVBUl9BVVRIX0VSUk9SID0gJ0NMSUVOVF9DTEVBUl9BVVRIX0VSUk9SJ1xuLy8gVGVtcG9yYXJ5IHBhc3NcbmV4cG9ydCBjb25zdCBURU1QX1BBU1NfUkVRVUVTVCA9ICdURU1QX1BBU1NfUkVRVUVTVCdcbmV4cG9ydCBjb25zdCBURU1QX1BBU1NfU1VDQ0VTUyA9ICdURU1QX1BBU1NfU1VDQ0VTUydcbmV4cG9ydCBjb25zdCBURU1QX1BBU1NfRkFJTFVSRSA9ICdURU1QX1BBU1NfRkFJTFVSRSdcbi8vIERhdGFcbmV4cG9ydCBjb25zdCBGRVRDSF9BR0VOVF9SRVFVRVNUID0gJ0NMSUVOVF9GRVRDSF9BR0VOVF9SRVFVRVNUJ1xuZXhwb3J0IGNvbnN0IEZFVENIX0FHRU5UX1NVQ0NFU1MgPSAnQ0xJRU5UX0ZFVENIX0FHRU5UX1NVQ0NFU1MnXG5leHBvcnQgY29uc3QgRkVUQ0hfQUdFTlRfRkFJTFVSRSA9ICdDTElFTlRfRkVUQ0hfQUdFTlRfRkFJTFVSRSdcbmV4cG9ydCBjb25zdCBDTEVBUl9BR0VOVF9FUlJPUiA9ICdDTElFTlRfQ0xFQVJfQUdFTlRfRVJST1InXG4iLCJcbi8vIFNlY3Rpb25zXG5leHBvcnQgY29uc3QgRkVUQ0hfU0VDVElPTlNfUkVRVUVTVCA9ICdDTElFTlRfRkVUQ0hfU0VDVElPTlNfUkVRVUVTVCdcbmV4cG9ydCBjb25zdCBGRVRDSF9TRUNUSU9OU19TVUNDRVNTID0gJ0NMSUVOVF9GRVRDSF9TRUNUSU9OU19TVUNDRVNTJ1xuZXhwb3J0IGNvbnN0IEZFVENIX1NFQ1RJT05TX0ZBSUxVUkUgPSAnQ0xJRU5UX0ZFVENIX1NFQ1RJT05TX0ZBSUxVUkUnXG5leHBvcnQgY29uc3QgRkVUQ0hfUkVNT1RFX1NFQ1RJT05fUkVRVUVTVCA9ICdDTElFTlRfRkVUQ0hfUkVNT1RFX1NFQ1RJT05fUkVRVUVTVCdcbmV4cG9ydCBjb25zdCBGRVRDSF9SRU1PVEVfU0VDVElPTl9FTkQgPSAnQ0xJRU5UX0ZFVENIX1JFTU9URV9TRUNUSU9OX0VORCdcbmV4cG9ydCBjb25zdCBJTkZPUk1fUkVNT1RFX1NFQ1RJT05fRU5EID0gJ0NMSUVOVF9JTkZPUk1fUkVNT1RFX1NFQ1RJT05fRU5EJ1xuZXhwb3J0IGNvbnN0IFJFU0VUX0ZJUlNUX0FDVElWRV9TRUNUSU9OID0gJ0NMSUVOVF9SRVNFVF9GSVJTVF9BQ1RJVkVfU0VDVElPTidcbmV4cG9ydCBjb25zdCBVUERBVEVfU0VDVElPTiA9ICdDTElFTlRfVVBEQVRFX1NFQ1RJT04nXG5leHBvcnQgY29uc3QgU0VMRUNUX1NFQ1RJT04gPSAnQ0xJRU5UX1NFTEVDVF9TRUNUSU9OJ1xuZXhwb3J0IGNvbnN0IEVOQUJMRV9TRUNUSU9OID0gJ0NMSUVOVF9FTkFCTEVfU0VDVElPTidcbmV4cG9ydCBjb25zdCBESVNBQkxFX1NFQ1RJT04gPSAnQ0xJRU5UX0RJU0FCTEVfU0VDVElPTidcbmV4cG9ydCBjb25zdCBBTExPV19TRUNUSU9OID0gJ0NMSUVOVF9BTExPV19TRUNUSU9OJ1xuZXhwb3J0IGNvbnN0IFJFU0VUX0JMT0NLX1JFUVVFU1QgPSAnQ0xJRU5UX1JFU0VUX0JMT0NLX1JFUVVFU1QnXG5cbi8vIEFwcFxuZXhwb3J0IGNvbnN0IFVQREFURV9MT0dPX1VSTCA9ICdDTElFTlRfVVBEQVRFX0xPR09fVVJMJ1xuZXhwb3J0IGNvbnN0IFNIT1dfSEVBREVSID0gJ0NMSUVOVF9TSE9XX0hFQURFUidcbmV4cG9ydCBjb25zdCBISURFX0hFQURFUiA9ICdDTElFTlRfSElERV9IRUFERVInXG5leHBvcnQgY29uc3QgVVBEQVRFX0RJU0NPTk5FQ1RfSEFORExFUiA9ICdDTElFTlRfVVBEQVRFX0RJU0NPTk5FQ1RfSEFORExFUidcbiIsIlxuLy8gQXV0aFxuZXhwb3J0IGNvbnN0IEFVVEhfSU5WQUxJRCA9IDFcbmV4cG9ydCBjb25zdCBBVVRIX1RJTUVPVVQgPSAyXG4iLCJcbmV4cG9ydCBjb25zdCBSRVNFVF9ESVNQTEFZX1NUQVRFID0gJ0NMSUVOVF9SRVNFVF9ESVNQTEFZX1NUQVRFJ1xuZXhwb3J0IGNvbnN0IFVQREFURV9ESVNQTEFZX0RBVEEgPSAnQ0xJRU5UX1VQREFURV9ESVNQTEFZX0RBVEEnXG5leHBvcnQgY29uc3QgQ0xFQVJfRElTUExBWV9FUlJPUiA9ICdDTElFTlRfQ0xFQVJfRElTUExBWV9FUlJPUidcbmV4cG9ydCBjb25zdCBDT05OX0RJU1BMQVlfUkVRVUVTVCA9ICdDTElFTlRfQ09OTl9ESVNQTEFZX1JFUVVFU1QnXG5leHBvcnQgY29uc3QgQ09OTl9ESVNQTEFZX1NVQ0NFU1MgPSAnQ0xJRU5UX0NPTk5fRElTUExBWV9TVUNDRVNTJ1xuZXhwb3J0IGNvbnN0IENPTk5fRElTUExBWV9GQUlMVVJFID0gJ0NMSUVOVF9DT05OX0RJU1BMQVlfRkFJTFVSRSdcbmV4cG9ydCBjb25zdCBESVNDT05OX0RJU1BMQVlfUkVRVUVTVCA9ICdDTElFTlRfRElTQ09OTl9ESVNQTEFZX1JFUVVFU1QnXG5leHBvcnQgY29uc3QgRElTQ09OTl9ESVNQTEFZX1NVQ0NFU1MgPSAnQ0xJRU5UX0RJU0NPTk5fRElTUExBWV9TVUNDRVNTJ1xuZXhwb3J0IGNvbnN0IERJU0NPTk5fRElTUExBWV9GQUlMVVJFID0gJ0NMSUVOVF9ESVNDT05OX0RJU1BMQVlfRkFJTFVSRSdcbiIsIlxuZXhwb3J0IGNvbnN0IENIQU5HRV9ESVJfRklMRVMgPSAnQ0hBTkdFX0RJUl9GSUxFUydcbmV4cG9ydCBjb25zdCBGRVRDSF9GSUxFU19SRVFVRVNUID0gJ0ZFVENIX0ZJTEVTX1JFUVVFU1QnXG5leHBvcnQgY29uc3QgRkVUQ0hfRklMRVNfU1VDQ0VTUyA9ICdGRVRDSF9GSUxFU19TVUNDRVNTJ1xuZXhwb3J0IGNvbnN0IEZFVENIX0ZJTEVTX0ZBSUxVUkUgPSAnRkVUQ0hfRklMRVNfRkFJTFVSRSdcbmV4cG9ydCBjb25zdCBGRVRDSF9GSUxFX1NVQ0NFU1MgPSAnRkVUQ0hfRklMRV9TVUNDRVNTJ1xuZXhwb3J0IGNvbnN0IERFTEVURV9GSUxFX1JFUVVFU1QgPSAnREVMRVRFX0ZJTEVfUkVRVUVTVCdcbmV4cG9ydCBjb25zdCBERUxFVEVfRklMRV9TVUNDRVNTID0gJ0RFTEVURV9GSUxFX1NVQ0NFU1MnXG5leHBvcnQgY29uc3QgREVMRVRFX0ZJTEVfRkFJTFVSRSA9ICdERUxFVEVfRklMRV9GQUlMVVJFJ1xuZXhwb3J0IGNvbnN0IENMRUFSX0ZJTEVTX0VSUk9SID0gJ0NMRUFSX0ZJTEVTX0VSUk9SJ1xuZXhwb3J0IGNvbnN0IENMRUFSX0ZJTEVfRVJST1IgPSAnQ0xFQVJfRklMRV9FUlJPUidcblxuLy8gRG93bmxvYWRzIC8gVXBsb2Fkc1xuZXhwb3J0IGNvbnN0IERPV05MT0FEX0ZJTEVfRkFJTFVSRSA9ICdET1dOTE9BRF9GSUxFX0ZBSUxVUkUnXG5leHBvcnQgY29uc3QgQ0xFQVJfRE9XTkxPQURfRklMRV9FUlJPUiA9ICdDTEVBUl9ET1dOTE9BRF9GSUxFX0VSUk9SJ1xuZXhwb3J0IGNvbnN0IFVQTE9BRF9GSUxFX0ZBSUxVUkUgPSAnVVBMT0FEX0ZJTEVfRkFJTFVSRSdcbmV4cG9ydCBjb25zdCBDTEVBUl9VUExPQURfRklMRV9FUlJPUiA9ICdDTEVBUl9VUExPQURfRklMRV9FUlJPUidcblxuLy8gRXJyb3IgY29kZXNcbmV4cG9ydCBjb25zdCBFUlJPUl9GRVRDSCA9IDQwMDAxXG5leHBvcnQgY29uc3QgRVJST1JfREVMRVRFID0gNDAwMDJcbmV4cG9ydCBjb25zdCBFUlJPUl9ET1dOTE9BRCA9IDQwMDAzXG5leHBvcnQgY29uc3QgRVJST1JfVVBMT0FEID0gNDAwMDRcbiIsIlxuZXhwb3J0IGNvbnN0IFBST1RPID0ge1xuICBBR0VOVF9QQVNTOiAxLFxuICBDT05OX1JFQURZOiAyLFxuICBBVVRIX0VSUk9SOiAzLFxuICBESVNQTEFZX0lOSVQ6IDEwLFxuICBESVNQTEFZOiAxMSxcbiAgRElTUExBWV9DTE9TRTogMTIsXG4gIFNFUlZJQ0VTOiAyMCxcbiAgUFJPQ0VTU0VTOiAzMCxcbiAgRklMRVM6IDQwLFxuICBURVJNX0lOSVQ6IDUwLFxuICBURVJNOiA1MSxcbiAgU1lTVEVNOiA2MCxcbiAgVEVNUF9QQVNTOiA3MCxcbiAgVEVNUF9MT0dJTjogNzEsXG4gIFRFTVBfU0VDVElPTjogNzJcbn1cbiIsIlxuZXhwb3J0IGNvbnN0IFJFU0VUX1RFUk1fU1RBVEUgPSAnQ0xJRU5UX1JFU0VUX1RFUk1fU1RBVEUnXG5leHBvcnQgY29uc3QgSU5JVF9URVJNX1JFUVVFU1QgPSAnQ0xJRU5UX0lOSVRfVEVSTV9SRVFVRVNUJ1xuZXhwb3J0IGNvbnN0IElOSVRfVEVSTV9TVUNDRVNTID0gJ0NMSUVOVF9JTklUX1RFUk1fU1VDQ0VTUydcbmV4cG9ydCBjb25zdCBJTklUX1RFUk1fRkFJTFVSRSA9ICdDTElFTlRfSU5JVF9URVJNX0ZBSUxVUkUnXG5leHBvcnQgY29uc3QgU0FWRV9URVJNX0RBVEEgPSAnQ0xJRU5UX1NBVkVfVEVSTV9EQVRBJ1xuZXhwb3J0IGNvbnN0IENMRUFSX1RFUk1fRVJST1IgPSAnQ0xJRU5UX0NMRUFSX1RFUk1fRVJST1InXG4iLCIvLyBSZXNlcnZlZCBjb2Rlc1xuZXhwb3J0IGNvbnN0IENMT1NFX05PUk1BTCA9IDEwMDBcbmV4cG9ydCBjb25zdCBDTE9TRV9HT0lOR19BV0FZID0gMTAwMVxuZXhwb3J0IGNvbnN0IENMT1NFX1BST1RPQ09MX0VSUk9SID0gMTAwMlxuZXhwb3J0IGNvbnN0IENMT1NFX1VOU1VQUE9SVEVEID0gMTAwM1xuZXhwb3J0IGNvbnN0IENMT1NFX1JFU0VSVkVEXzEwMDQgPSAxMDA0XG5leHBvcnQgY29uc3QgQ0xPU0VfTk9fU1RBVFVTID0gMTAwNVxuZXhwb3J0IGNvbnN0IENMT1NFX0FCTk9STUFMID0gMTAwNlxuZXhwb3J0IGNvbnN0IENMT1NFX1VOU1VQUE9SVEVEX0RBVEEgPSAxMDA3XG5leHBvcnQgY29uc3QgQ0xPU0VfUE9MSUNZX1ZJT0xBVElPTiA9IDEwMDhcbmV4cG9ydCBjb25zdCBDTE9TRV9UT09fTEFSR0UgPSAxMDA5XG5leHBvcnQgY29uc3QgQ0xPU0VfTUlTU0lOR19FWFRFTlNJT04gPSAxMDEwXG5leHBvcnQgY29uc3QgQ0xPU0VfSU5URVJOQUxfRVJST1IgPSAxMDExXG5leHBvcnQgY29uc3QgQ0xPU0VfU0VSVklDRV9SRVNUQVJUID0gMTAxMlxuZXhwb3J0IGNvbnN0IENMT1NFX1RSWV9BR0FJTl9MQVRFUiA9IDEwMTNcbmV4cG9ydCBjb25zdCBDTE9TRV9SRVNFUlZFRF8xMDE0ID0gMTAxNFxuZXhwb3J0IGNvbnN0IENMT1NFX1RMU19IQU5EU0hBS0UgPSAxMDE1XG5cbi8vIEFwcGxpY2F0aW9uIGNvZGVzXG5leHBvcnQgY29uc3QgQ0xPU0VfQVVUSF9JTlZBTElEID0gNDAwMFxuZXhwb3J0IGNvbnN0IENMT1NFX0FVVEhfVElNRU9VVCA9IDQwMDFcbmV4cG9ydCBjb25zdCBDTE9TRV9JTkFDVElWSVRZID0gNDAxMFxuZXhwb3J0IGNvbnN0IENMT1NFX0FVVEhfRVhQSVJFRCA9IDQwMTFcbiIsImltcG9ydCB7IERpc3BhdGNoZXIgfSBmcm9tICdmbHV4J1xubGV0IEFwcERpc3BhdGNoZXIgPSBuZXcgRGlzcGF0Y2hlcigpXG5leHBvcnQgZGVmYXVsdCBBcHBEaXNwYXRjaGVyXG4iLCJpbXBvcnQgTG9nZ2VyIGZyb20gJy4vY29tbW9uL2xpYi9Mb2dnZXInXG5pbXBvcnQgRUhvcnVzIGZyb20gJy4vRUhvcnVzJ1xuaW1wb3J0ICdiYWJlbC1yZWdpc3Rlcidcblxud2luZG93LkxvZ2dlciA9IExvZ2dlclxud2luZG93LkVIb3J1cyA9IEVIb3J1c1xuIiwiaW1wb3J0IEZTSXRlbSBmcm9tICcuL2ZzLWl0ZW0nXG5cbmNsYXNzIERpckl0ZW0gZXh0ZW5kcyBGU0l0ZW0ge1xuICBjb25zdHJ1Y3RvciAocGF0aCwgcHJvcHMgPSB7fSwgdHlwZU9TKSB7XG4gICAgc3VwZXIocGF0aCwgdHlwZU9TKVxuXG4gICAgdGhpcy5fX2l0ZW1zID0gbmV3IE1hcCgpXG4gICAgdGhpcy5fX2xvYWRlZCA9IGZhbHNlXG5cbiAgICBpZiAocHJvcHMubGFzdE1vZGlmaWNhdGlvbikgdGhpcy5sYXN0TW9kaWZpY2F0aW9uID0gcHJvcHMubGFzdE1vZGlmaWNhdGlvblxuICAgIHRoaXMucmVhZGFibGUgPSBwcm9wcy5yZWFkYWJsZSB8fCBmYWxzZVxuICAgIHRoaXMud3JpdGFibGUgPSBwcm9wcy53cml0YWJsZSB8fCBmYWxzZVxuICB9XG5cbiAgZ2V0IGlzRGlyICgpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgZ2V0IGxvYWRlZCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19sb2FkZWRcbiAgfVxuXG4gIHNldCBsb2FkZWQgKGxvYWRlZCkge1xuICAgIGlmICh0eXBlb2YgbG9hZGVkID09PSAnYm9vbGVhbicpIHRoaXMuX19sb2FkZWQgPSBsb2FkZWRcbiAgfVxuXG4gIGdldCBzaXplICgpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGdldCBleHRlbnNpb24gKCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgZ2V0IGl0ZW1zICgpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX19pdGVtcy52YWx1ZXMoKV1cbiAgfVxuXG4gIHNldCBpdGVtcyAoaXRlbXMpIHtcbiAgICBpZiAodHlwZW9mIGl0ZW1zW1N5bWJvbC5pdGVyYXRvcl0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGl0ZW1zJylcbiAgICB9XG5cbiAgICB0aGlzLl9faXRlbXMuY2xlYXIoKVxuICAgIGZvciAobGV0IGluZGV4IGluIGl0ZW1zKSB7XG4gICAgICBsZXQgaXRlbSA9IGl0ZW1zW2luZGV4XVxuICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBGU0l0ZW0pIHRoaXMuYWRkKGl0ZW0pXG4gICAgfVxuICB9XG5cbiAgYWRkIChpdGVtKSB7XG4gICAgaWYgKCEoaXRlbSBpbnN0YW5jZW9mIEZTSXRlbSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgaXRlbScpXG4gICAgdGhpcy5fX2l0ZW1zLnNldChpdGVtLmJhc2VuYW1lLCBpdGVtKVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBoYXMgKGJhc2VuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX19pdGVtcy5oYXMoYmFzZW5hbWUpXG4gIH1cblxuICBnZXQgKGJhc2VuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuX19pdGVtcy5nZXQoYmFzZW5hbWUpXG4gIH1cblxuICBkZWxldGUgKGJhc2VuYW1lKSB7XG4gICAgaWYgKHRoaXMuaGFzKGJhc2VuYW1lKSkgdGhpcy5fX2l0ZW1zLmRlbGV0ZShiYXNlbmFtZSlcbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IERpckl0ZW1cbiIsImltcG9ydCBGaWxlSXRlbSBmcm9tICcuL2ZpbGUtaXRlbSdcblxuY2xhc3MgRmlsZURvd25sb2FkIHtcbiAgY29uc3RydWN0b3IgKGZpbGUsIG9mZnNldCA9IDApIHtcbiAgICBpZiAoIShmaWxlIGluc3RhbmNlb2YgRmlsZUl0ZW0pIHx8ICFmaWxlLnNpemUpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgZmlsZScpXG4gICAgfVxuXG4gICAgLy8gU3RvcmUgdGhlIHVzZXIgZmlsZVxuICAgIHRoaXMuX19maWxlID0gZmlsZVxuICAgIHRoaXMuX19vZmZzZXQgPSBvZmZzZXRcbiAgICB0aGlzLl9fc2l6ZSA9IHRoaXMuX19maWxlLnNpemVcbiAgICB0aGlzLl9fcHJvZ3Jlc3MgPSAwXG5cbiAgICB0aGlzLl9fYiA9IG5ldyBBcnJheUJ1ZmZlcih0aGlzLnNpemUpXG4gICAgdGhpcy5fX2JWaWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fX2IpXG4gIH1cblxuICAvLyBPZmZzZXQgKGluIGJ5dGVzKVxuICBfX2NoZWNrT2Zmc2V0IChvZmZzZXQpIHtcbiAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBvZmZzZXQgc2hvdWxkIGJlIGEgbnVtYmVyJylcbiAgICB9IGVsc2UgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgb2Zmc2V0IHNob3VsZCBiZSBlcXVhbCBvciBncmVhdGVyIHRoYW4gMCcpXG4gICAgfVxuICB9XG5cbiAgc2V0IG9mZnNldCAob2Zmc2V0KSB7XG4gICAgdGhpcy5fX2NoZWNrT2Zmc2V0KG9mZnNldClcbiAgICB0aGlzLl9fb2Zmc2V0ID0gb2Zmc2V0XG5cbiAgICB0aGlzLl9fdXBkYXRlUHJvZ3Jlc3MoKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGdldCBvZmZzZXQgKCkge1xuICAgIHJldHVybiB0aGlzLl9fb2Zmc2V0XG4gIH1cblxuICAvLyBTaXplIChpbiBieXRlcylcbiAgZ2V0IHNpemUgKCkge1xuICAgIHJldHVybiB0aGlzLl9fc2l6ZVxuICB9XG5cbiAgLy8gUHJvZ3Jlc3NcbiAgZ2V0IHByb2dyZXNzICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3Byb2dyZXNzXG4gIH1cblxuICBfX3VwZGF0ZVByb2dyZXNzICgpIHtcbiAgICB2YXIgcHJvZ3Jlc3MgPSAwXG4gICAgaWYgKHRoaXMub2Zmc2V0ID4gMCAmJiB0aGlzLnNpemUgPiAwKSB7XG4gICAgICBwcm9ncmVzcyA9ICh0aGlzLm9mZnNldCA8IHRoaXMuc2l6ZSlcbiAgICAgICAgPyAoKHRoaXMub2Zmc2V0ICogMTAwKSAvIHRoaXMuc2l6ZSlcbiAgICAgICAgOiAxMDBcbiAgICB9XG4gICAgdGhpcy5fX3Byb2dyZXNzID0gcHJvZ3Jlc3NcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvLyBGaWxlXG4gIGdldCBmaWxlICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2ZpbGVcbiAgfVxuXG4gIC8vIFNhdmUgY2h1bmsgaW50byB0aGUgYnVmZmVyXG4gIHNhdmVDaHVuayAoY2h1bmssIG9mZnNldCwgY2h1bmtTaXplKSB7XG4gICAgaWYgKHRoaXMub2Zmc2V0IDw9IG9mZnNldCkge1xuICAgICAgbGV0IGN1cnJPZmZzZXQgPSBvZmZzZXRcbiAgICAgIGNvbnN0IG1heE9mZnNldCA9IG9mZnNldCArIGNodW5rU2l6ZVxuXG4gICAgICBmb3IgKGxldCBiIG9mIGNodW5rKSB7XG4gICAgICAgIHRoaXMuX19iVmlld1tjdXJyT2Zmc2V0XSA9IGJcblxuICAgICAgICBpZiAoY3Vyck9mZnNldCA8IHRoaXMuX19iLmJ5dGVMZW5ndGggJiYgY3Vyck9mZnNldCA8IG1heE9mZnNldCkge1xuICAgICAgICAgIGN1cnJPZmZzZXQrK1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5vZmZzZXQgPSBjdXJyT2Zmc2V0XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHRvQmxvYiAodHlwZSA9ICd0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTgnKSB7XG4gICAgcmV0dXJuIG5ldyBCbG9iKFt0aGlzLl9fYl0sIHsgdHlwZTogdHlwZSB9KVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZpbGVEb3dubG9hZFxuIiwiaW1wb3J0IEZTSXRlbSBmcm9tICcuL2ZzLWl0ZW0nXG5cbmNsYXNzIEZpbGVJdGVtIGV4dGVuZHMgRlNJdGVtIHtcbiAgY29uc3RydWN0b3IgKHBhdGgsIHByb3BzID0ge30sIHR5cGVPUykge1xuICAgIHN1cGVyKHBhdGgsIHR5cGVPUylcblxuICAgIHRoaXMuc2l6ZSA9IHByb3BzLnNpemUgfHwgMFxuICAgIHRoaXMubWltZVR5cGUgPSBwcm9wcy5taW1lVHlwZSB8fCAnJ1xuICAgIHRoaXMubGFzdE1vZGlmaWNhdGlvbiA9IHByb3BzLmxhc3RNb2RpZmljYXRpb24gfHwgMFxuICAgIHRoaXMuY2FuQmVEZWxldGVkID0gcHJvcHMuY2FuQmVEZWxldGVkIHx8IGZhbHNlXG4gICAgdGhpcy5yZWFkYWJsZSA9IHByb3BzLnJlYWRhYmxlIHx8IGZhbHNlXG4gICAgdGhpcy53cml0YWJsZSA9IHByb3BzLndyaXRhYmxlIHx8IGZhbHNlXG4gIH1cblxuICBnZXQgaXNGaWxlICgpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgZ2V0IG1pbWVUeXBlICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX21pbWVUeXBlXG4gIH1cblxuICBzZXQgbWltZVR5cGUgKG1pbWVUeXBlKSB7XG4gICAgaWYgKHR5cGVvZiBtaW1lVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBtaW1lLXR5cGUgc2hvdWxkIGJlIHN0cmluZycpXG4gICAgfVxuICAgIHRoaXMuX19taW1lVHlwZSA9IG1pbWVUeXBlXG4gIH1cblxuICBnZXQgc2l6ZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19zaXplXG4gIH1cblxuICBzZXQgc2l6ZSAoc2l6ZSkge1xuICAgIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBzaXplIHNob3VsZCBiZSBudW1lcmljJylcbiAgICB9XG4gICAgdGhpcy5fX3NpemUgPSBzaXplXG4gIH1cblxuICBnZXQgaXNEZWxldGluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19pc0RlbGV0aW5nIHx8IGZhbHNlXG4gIH1cbiAgc2V0IGlzRGVsZXRpbmcgKGRlbGV0aW5nKSB7XG4gICAgaWYgKHR5cGVvZiBkZWxldGluZyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgc2hvdWxkIGJlIGJvb2xlYW4nKVxuICAgIH1cbiAgICB0aGlzLl9faXNEZWxldGluZyA9IGRlbGV0aW5nXG4gIH1cblxuICBnZXQgY2FuQmVEZWxldGVkICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2NhbkJlRGVsZXRlZFxuICB9XG4gIHNldCBjYW5CZURlbGV0ZWQgKGNhbkJlKSB7XG4gICAgaWYgKHR5cGVvZiBjYW5CZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgc2hvdWxkIGJlIGJvb2xlYW4nKVxuICAgIH1cbiAgICB0aGlzLl9fY2FuQmVEZWxldGVkID0gY2FuQmVcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGaWxlSXRlbVxuIiwiaW1wb3J0IFVzZXJGaWxlIGZyb20gJy4vdXNlci1maWxlJ1xuXG5jbGFzcyBGaWxlVXBsb2FkIHtcbiAgY29uc3RydWN0b3IgKHVzZXJGaWxlLCBvZmZzZXQgPSAwKSB7XG4gICAgLy8gaWYgKCFGaWxlVXBsb2FkLmlzU3VwcG9ydGVkKVxuICAgIC8vICAgRmlsZVVwbG9hZC5ub3RTdXBwb3J0ZWQoKVxuICAgIGlmICghKHVzZXJGaWxlIGluc3RhbmNlb2YgVXNlckZpbGUpIHx8ICF1c2VyRmlsZS5zaXplKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGZpbGUnKVxuICAgIH1cblxuICAgIC8vIFN0b3JlIHRoZSB1c2VyIGZpbGVcbiAgICB0aGlzLl9fdXNlckZpbGUgPSB1c2VyRmlsZVxuICAgIHRoaXMuX19vZmZzZXQgPSBvZmZzZXRcbiAgICB0aGlzLl9fc2l6ZSA9IHRoaXMuX191c2VyRmlsZS5zaXplXG4gICAgdGhpcy5fX3Byb2dyZXNzID0gMFxuICB9XG5cbiAgLy8gT2Zmc2V0IChpbiBieXRlcylcbiAgX19jaGVja09mZnNldCAob2Zmc2V0KSB7XG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgIT09ICdudW1iZXInKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgb2Zmc2V0IHNob3VsZCBiZSBhIG51bWJlcicpXG4gICAgfSBlbHNlIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIG9mZnNldCBzaG91bGQgYmUgZXF1YWwgb3IgZ3JlYXRlciB0aGFuIDAnKVxuICAgIH1cbiAgfVxuXG4gIHNldCBvZmZzZXQgKG9mZnNldCkge1xuICAgIHRoaXMuX19jaGVja09mZnNldChvZmZzZXQpXG4gICAgdGhpcy5fX29mZnNldCA9IG9mZnNldFxuXG4gICAgdGhpcy5fX3VwZGF0ZVByb2dyZXNzKClcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBnZXQgb2Zmc2V0ICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX29mZnNldFxuICB9XG5cbiAgLy8gU2l6ZSAoaW4gYnl0ZXMpXG4gIGdldCBzaXplICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3NpemVcbiAgfVxuXG4gIC8vIFByb2dyZXNzXG4gIGdldCBwcm9ncmVzcyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19wcm9ncmVzc1xuICB9XG5cbiAgX191cGRhdGVQcm9ncmVzcyAoKSB7XG4gICAgdmFyIHByb2dyZXNzID0gMFxuICAgIGlmICh0aGlzLm9mZnNldCA+IDAgJiYgdGhpcy5zaXplID4gMCkge1xuICAgICAgcHJvZ3Jlc3MgPSAodGhpcy5vZmZzZXQgPCB0aGlzLnNpemUpXG4gICAgICAgID8gKCh0aGlzLm9mZnNldCAqIDEwMCkgLyB0aGlzLnNpemUpXG4gICAgICAgIDogMTAwXG4gICAgfVxuICAgIHRoaXMuX19wcm9ncmVzcyA9IHByb2dyZXNzXG4gIH1cblxuICAvLyBGaWxlXG4gIGdldCBmaWxlICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3VzZXJGaWxlXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmlsZVVwbG9hZFxuIiwiaW1wb3J0IFVzZXJGaWxlIGZyb20gJy4vdXNlci1maWxlJ1xuaW1wb3J0IFVzZXJGaWxlUmVhZGVyIGZyb20gJy4vdXNlci1maWxlLXJlYWRlcidcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKHNlbGYpIHtcbiAgc2VsZi5maWxlUmVhZGVyID0gbnVsbFxuXG4gIC8vIFV0aWwgZnVuY3Rpb25cbiAgc2VsZi5lbWl0ID0gKGFjdGlvblR5cGUsIHBheWxvYWQgPSB7fSkgPT4ge1xuICAgIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgICAgYWN0aW9uVHlwZTogYWN0aW9uVHlwZSxcbiAgICAgIHBheWxvYWQ6IHBheWxvYWRcbiAgICB9KVxuICB9XG5cbiAgLy8gUmVhY3QgdG8gdGhlICdyZWFkJyBldmVudCByZWNlaXZlZCBmcm9tIFVzZXJGaWxlUmVhZGVyXG4gIHNlbGYuaGFuZGxlUmVhZCA9IChjaHVuaywgb2Zmc2V0LCBsZW5ndGgpID0+IHtcbiAgICBzZWxmLmVtaXQoJ3JlYWQnLCB7IGNodW5rOiBjaHVuaywgb2Zmc2V0OiBvZmZzZXQsIGxlbmd0aDogbGVuZ3RoIH0pXG4gIH1cbiAgLy8gRXJyb3IgaGFuZGxpbmdcbiAgc2VsZi5oYW5kbGVFcnJvciA9IChlcnJvcikgPT4ge1xuICAgIHNlbGYuZW1pdCgnZXJyb3InLCB7IGVycm9yOiBlcnJvci5tZXNzYWdlIH0pXG4gIH1cbiAgLy8gSGFuZGxlIHRoZSAnZmlsZScgZXZlbnQgcmVjZWl2ZWQgZnJvbSB0aGUgbWFzdGVyXG4gIHNlbGYubG9hZEZpbGUgPSAoZmlsZUhhbmRsZSwgZGlybmFtZSwgdHlwZU9TKSA9PiB7XG4gICAgaWYgKHNlbGYuZmlsZVJlYWRlcikge1xuICAgICAgc2VsZi5oYW5kbGVFcnJvcihuZXcgRXJyb3IoJ1RoZSBmaWxlIGV4aXN0cyB5ZXQnKSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsZXQgZmlsZSA9IG5ldyBVc2VyRmlsZShmaWxlSGFuZGxlLCBkaXJuYW1lLCB0eXBlT1MpXG4gICAgICBzZWxmLmZpbGVSZWFkZXIgPSBuZXcgVXNlckZpbGVSZWFkZXIoZmlsZSlcblxuICAgICAgc2VsZi5maWxlUmVhZGVyLm9uKCdyZWFkJywgKGNodW5rLCBvZmZzZXQsIGxlbmd0aCkgPT4ge1xuICAgICAgICBzZWxmLmhhbmRsZVJlYWQoY2h1bmssIG9mZnNldCwgbGVuZ3RoKVxuICAgICAgfSlcbiAgICAgIHNlbGYuZmlsZVJlYWRlci5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgc2VsZi5oYW5kbGVFcnJvcihlcnJvcilcbiAgICAgIH0pXG5cbiAgICAgIHNlbGYuZW1pdCgnZmlsZScpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNlbGYuZmlsZVJlYWRlciA9IG51bGxcbiAgICAgIHNlbGYuaGFuZGxlRXJyb3IoZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgLy8gUmVjZWl2ZWQgbWVzc2FnZXNcbiAgc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2ZW50KSA9PiB7XG4gICAgdmFyIGFjdGlvblR5cGUgPSBldmVudC5kYXRhLmFjdGlvblR5cGVcbiAgICB2YXIgcGF5bG9hZCA9IGV2ZW50LmRhdGEucGF5bG9hZFxuXG4gICAgLy8gY29uc29sZS5sb2coJ1tGaWxlc1dvcmtlcl0nLCBhY3Rpb25UeXBlLCBwYXlsb2FkKSAvLyBERUJVR1xuXG4gICAgc3dpdGNoIChhY3Rpb25UeXBlKSB7XG4gICAgICBjYXNlICdmaWxlJzpcbiAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLmZpbGVIYW5kbGUgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICBwYXlsb2FkLmZpbGVIYW5kbGUgaW5zdGFuY2VvZiBGaWxlICYmXG4gICAgICAgICAgICB0eXBlb2YgcGF5bG9hZC5kaXJuYW1lID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgICAgdHlwZW9mIHBheWxvYWQudHlwZU9TID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHNlbGYubG9hZEZpbGUocGF5bG9hZC5maWxlSGFuZGxlLCBwYXlsb2FkLmRpcm5hbWUsIHBheWxvYWQudHlwZU9TKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbGYuaGFuZGxlRXJyb3IobmV3IEVycm9yKCdJbnZhbGlkIHBheWxvYWQgd2hlbiBsb2FkaW5nIHRoZSBmaWxlJykpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3JlYWQnOlxuICAgICAgICBpZiAoIXNlbGYuZmlsZVJlYWRlcikge1xuICAgICAgICAgIHNlbGYuaGFuZGxlRXJyb3IobmV3IEVycm9yKCdUaGUgZmlsZSBkb25cXCd0IGV4aXN0cyB5ZXQnKSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgb2Zmc2V0ID0gKHBheWxvYWQub2Zmc2V0KSA/IHBheWxvYWQub2Zmc2V0IDogMFxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNlbGYuZmlsZVJlYWRlci5yZWFkKG9mZnNldClcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgc2VsZi5oYW5kbGVFcnJvcihlcnJvcilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHNlbGYuaGFuZGxlRXJyb3IobmV3IEVycm9yKCdJbnZhbGlkIGFjdGlvbiB0eXBlJykpXG4gICAgfVxuICB9KVxufVxuIiwiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJ1xuXG4vLyBzYXZlQXNcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGVzYXZlci5qcy9GaWxlU2F2ZXInXG5cbmltcG9ydCBGaWxlRG93bmxvYWQgZnJvbSAnLi9maWxlLWRvd25sb2FkJ1xuaW1wb3J0IEZpbGVJdGVtIGZyb20gJy4vZmlsZS1pdGVtJ1xuXG5pbXBvcnQgTG9nZ2VyIGZyb20gJy4uLy4uL2NvbW1vbi9saWIvTG9nZ2VyJ1xuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHsgc2VjdGlvbjogJ0ZpbGVzIGRvd25sb2FkIGNvbnRyb2xsZXInIH0pXG5cbmNsYXNzIEZpbGVzRG93bmxvYWRDb250cm9sbGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIGlmICghRmlsZXNEb3dubG9hZENvbnRyb2xsZXIuaXNTdXBwb3J0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmVhdHVyZSBub3Qgc3VwcG9ydGVkJylcbiAgICB9XG5cbiAgICBzdXBlcigpXG5cbiAgICAvLyBGaWxlc1xuICAgIHRoaXMuX19maWxlcyA9IG5ldyBNYXAoKVxuICAgIC8vIFF1ZXVlXG4gICAgdGhpcy5fX3EgPSBbXVxuICAgIC8vIFN0YXRlXG4gICAgdGhpcy5fX3N0YXRlID0gRmlsZXNEb3dubG9hZENvbnRyb2xsZXIuUlVOTklOR1xuICB9XG5cbiAgc2V0IHJlcXVlc3RDaHVua0FjdGlvbiAoYWN0aW9uKSB7XG4gICAgdGhpcy5fX3JlcXVlc3RDaHVua0FjdGlvbiA9IGFjdGlvblxuICB9XG5cbiAgZ2V0IHN0YXRlICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3N0YXRlXG4gIH1cblxuICAvLyBGaWxlc1xuICBnZXQgZmlsZXMgKCkge1xuICAgIHJldHVybiBbLi4udGhpcy5fX2ZpbGVzLnZhbHVlcygpXVxuICB9XG5cbiAgYWRkRmlsZSAoZmlsZSkge1xuICAgIGlmICghKGZpbGUgaW5zdGFuY2VvZiBGaWxlSXRlbSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ05vdCBhIHZhbGlkIGZpbGUnKVxuXG4gICAgdmFyIGZpbGVEb3dubG9hZCA9IG5ldyBGaWxlRG93bmxvYWQoZmlsZSlcblxuICAgIGlmICghdGhpcy5fX2ZpbGVzLmhhcyhmaWxlRG93bmxvYWQuZmlsZS5wYXRoKSkge1xuICAgICAgdGhpcy5fX2ZpbGVzLnNldChmaWxlRG93bmxvYWQuZmlsZS5wYXRoLCBmaWxlRG93bmxvYWQpXG5cbiAgICAgIC8vIEVtaXQgYSBmaWxlIGV2ZW50XG4gICAgICB0aGlzLmVtaXQoRmlsZXNEb3dubG9hZENvbnRyb2xsZXIuRklMRSwgZmlsZURvd25sb2FkLmZpbGUucGF0aCwgZmlsZURvd25sb2FkKVxuXG4gICAgICAvLyBSZXF1ZXN0IGRvd25sb2FkXG4gICAgICB0aGlzLmRvd25sb2FkKGZpbGVEb3dubG9hZC5maWxlLnBhdGgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJlbW92ZUZpbGUgKHBhdGgpIHtcbiAgICBpZiAodGhpcy5fX2ZpbGVzLmhhcyhwYXRoKSkge1xuICAgICAgdGhpcy5fX2ZpbGVzLmRlbGV0ZShwYXRoKVxuXG4gICAgICAvLyBFbWl0IGEgZmlsZSBldmVudFxuICAgICAgdGhpcy5lbWl0KEZpbGVzRG93bmxvYWRDb250cm9sbGVyLkZJTEUsIHBhdGgsIG51bGwpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGNsZWFuRmlsZXMgKCkge1xuICAgIGZvciAobGV0IFssIGZpbGVdIG9mIHRoaXMuX19maWxlcykge1xuICAgICAgdGhpcy5yZW1vdmVGaWxlKGZpbGUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8vIFRhc2tzXG4gIF9fYWRkVGFzayAodGFzaykge1xuICAgIHRoaXMuX19xLnBvcCh0YXNrKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIF9fZ2V0VGFzayAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19xLnNoaWZ0KClcbiAgfVxuXG4gIF9fY2xlYW5UYXNrcyAoKSB7XG4gICAgdGhpcy5fX3EgPSBbXVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIF9fZmx1c2ggKCkge1xuICAgIGZvciAobGV0IHRhc2s7IHRoaXMuc3RhdGUgPT09IEZpbGVzRG93bmxvYWRDb250cm9sbGVyLlJVTk5JTkcgJiYgKHRhc2sgPSB0aGlzLl9fZ2V0VGFzaygpKTspIHtcbiAgICAgIGNvbnN0IHsgYWN0aW9uLCBwYXlsb2FkIH0gPSB0YXNrXG5cbiAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgJ2Rvd25sb2FkJzpcbiAgICAgICAgICBpZiAodGhpcy5fX2ZpbGVzLmhhcyhwYXlsb2FkLnBhdGgpKSB0aGlzLmRvd25sb2FkKHBheWxvYWQucGF0aClcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEFzayBmb3IgYSBuZXcgY2h1bmsgb2YgdGhlIGZpbGVcbiAgZG93bmxvYWQgKHBhdGgpIHtcbiAgICBpZiAoIXRoaXMuX19maWxlcy5oYXMocGF0aCkpIHRocm93IG5ldyBFcnJvcignVGhpcyBmaWxlIGRvZXNuXFwndCBleGlzdCcpXG5cbiAgICBpZiAodGhpcy5fX3N0YXRlID09PSBGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5QQVVTRUQpIHtcbiAgICAgIHRoaXMuX19hZGRUYXNrKHtcbiAgICAgICAgYWN0aW9uOiAnZG93bmxvYWQnLFxuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgcGF0aDogcGF0aFxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9fcmVxdWVzdENodW5rKHBhdGgpXG4gICAgfVxuICB9XG5cbiAgX19yZXF1ZXN0Q2h1bmsgKHBhdGgpIHtcbiAgICBpZiAoIXRoaXMuX19maWxlcy5oYXMocGF0aCkpIHRocm93IG5ldyBFcnJvcignVGhpcyBmaWxlIGRvZXNuXFwndCBleGlzdCcpXG5cbiAgICB2YXIgZmlsZURvd25sb2FkID0gdGhpcy5fX2ZpbGVzLmdldChwYXRoKVxuICAgIGlmIChmaWxlRG93bmxvYWQucHJvZ3Jlc3MgPCAxMDApIHtcbiAgICAgIGlmICh0aGlzLl9fc3RhdGUgPT09IEZpbGVzRG93bmxvYWRDb250cm9sbGVyLlJVTk5JTkcpIHtcbiAgICAgICAgbGV0IHsgZmlsZTogeyBkaXJuYW1lLCBiYXNlbmFtZSB9LCBvZmZzZXQgfSA9IGZpbGVEb3dubG9hZFxuICAgICAgICB0aGlzLl9fcmVxdWVzdENodW5rQWN0aW9uKGRpcm5hbWUsIGJhc2VuYW1lLCBvZmZzZXQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQWZ0ZXIgc2F2aW5nIGEgY2h1bmssIGFzayBmb3IgYSBuZXcgdW50aWwgMTAwJSBjb21wbGV0ZWRcbiAgc2F2ZUNodW5rIChwYXRoLCBjaHVuaywgb2Zmc2V0LCBjaHVua1NpemUpIHtcbiAgICBpZiAodGhpcy5fX2ZpbGVzLmhhcyhwYXRoKSkge1xuICAgICAgbGV0IGZpbGVEb3dubG9hZCA9IHRoaXMuX19maWxlcy5nZXQocGF0aClcblxuICAgICAgLy8gVW50aWwgdGhlIHJlbW90ZSByZWNlaXZlIHRoZSBvZmZzZXRcbiAgICAgIG9mZnNldCA9IGZpbGVEb3dubG9hZC5vZmZzZXRcblxuICAgICAgaWYgKGZpbGVEb3dubG9hZC5vZmZzZXQgPD0gb2Zmc2V0KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZmlsZURvd25sb2FkLnNhdmVDaHVuayhjaHVuaywgb2Zmc2V0LCBjaHVua1NpemUpXG4gICAgICAgICAgY2h1bmsgPSBudWxsXG5cbiAgICAgICAgICAvLyBFbWl0IGEgcHJvZ3Jlc3MgZXZlbnRcbiAgICAgICAgICB0aGlzLmVtaXQoRmlsZXNEb3dubG9hZENvbnRyb2xsZXIuUFJPR1JFU1MsIHBhdGgsIGZpbGVEb3dubG9hZC5wcm9ncmVzcylcbiAgICAgICAgICAvLyBFbWl0IGEgZmlsZSBldmVudFxuICAgICAgICAgIHRoaXMuZW1pdChGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5GSUxFLCBwYXRoLCBmaWxlRG93bmxvYWQpXG5cbiAgICAgICAgICAvLyBTYXZlIHRoZSBmaWxlXG4gICAgICAgICAgaWYgKGZpbGVEb3dubG9hZC5wcm9ncmVzcyA8IDEwMCkge1xuICAgICAgICAgICAgdGhpcy5fX2ZpbGVzLnNldChwYXRoLCBmaWxlRG93bmxvYWQpXG4gICAgICAgICAgICAvLyBSZXF1ZXN0IGRvd25sb2FkXG4gICAgICAgICAgICB0aGlzLmRvd25sb2FkKHBhdGgpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNhdmVBcyhmaWxlRG93bmxvYWQudG9CbG9iKCksIGZpbGVEb3dubG9hZC5maWxlLmJhc2VuYW1lLCB0cnVlKVxuICAgICAgICAgICAgdGhpcy5yZW1vdmVGaWxlKHBhdGgpXG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvcilcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBwYXVzZURvd25sb2FkcyAoKSB7XG4gICAgdGhpcy5fX3N0YXRlID0gRmlsZXNEb3dubG9hZENvbnRyb2xsZXIuUEFVU0VEXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnREb3dubG9hZHMgKCkge1xuICAgIHRoaXMuX19zdGF0ZSA9IEZpbGVzRG93bmxvYWRDb250cm9sbGVyLlJVTk5JTkdcbiAgICB0aGlzLl9fZmx1c2goKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHN0b3BEb3dubG9hZHMgKCkge1xuICAgIHRoaXMuX19zdGF0ZSA9IEZpbGVzRG93bmxvYWRDb250cm9sbGVyLlBBVVNFRFxuICAgIHRoaXMuX19jbGVhblRhc2tzKClcbiAgICB0aGlzLmNsZWFuRmlsZXMoKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG4vLyBTdGF0ZXNcbkZpbGVzRG93bmxvYWRDb250cm9sbGVyLlBBVVNFRCA9ICdwYXVzZWQnXG5GaWxlc0Rvd25sb2FkQ29udHJvbGxlci5SVU5OSU5HID0gJ3J1bm5pbmcnXG5cbi8vIEV2ZW50c1xuRmlsZXNEb3dubG9hZENvbnRyb2xsZXIuRklMRSA9ICdmaWxlJ1xuRmlsZXNEb3dubG9hZENvbnRyb2xsZXIuUFJPR1JFU1MgPSAncHJvZ3Jlc3MnXG5cbkZpbGVzRG93bmxvYWRDb250cm9sbGVyLmlzU3VwcG9ydGVkID0gKHdpbmRvdyAmJiB3aW5kb3cuRmlsZSAmJiB3aW5kb3cuRmlsZVJlYWRlciAmJiB3aW5kb3cuRmlsZUxpc3QgJiYgd2luZG93LkJsb2IpXG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBGaWxlc0Rvd25sb2FkQ29udHJvbGxlcigpXG4iLCJpbXBvcnQgd29yayBmcm9tICd3ZWJ3b3JraWZ5J1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJ1xuXG5pbXBvcnQgTG9nZ2VyIGZyb20gJy4uLy4uL2NvbW1vbi9saWIvTG9nZ2VyJ1xuXG5pbXBvcnQgRmlsZVdvcmtlciBmcm9tICcuL2ZpbGUtd29ya2VyJ1xuaW1wb3J0IEZpbGVVcGxvYWQgZnJvbSAnLi9maWxlLXVwbG9hZCdcbmltcG9ydCBVc2VyRmlsZSBmcm9tICcuL3VzZXItZmlsZSdcblxuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih7IHNlY3Rpb246ICdGaWxlcyB1cGxvYWQgY29udHJvbGxlcicgfSlcblxuY2xhc3MgRmlsZXNVcGxvYWRDb250cm9sbGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIGlmICghRmlsZXNVcGxvYWRDb250cm9sbGVyLmlzU3VwcG9ydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZlYXR1cmUgbm90IHN1cHBvcnRlZCcpXG4gICAgfVxuXG4gICAgc3VwZXIoKVxuXG4gICAgLy8gRmlsZXNcbiAgICB0aGlzLl9fZmlsZXMgPSBuZXcgTWFwKClcbiAgICAvLyBXb3JrZXJzXG4gICAgdGhpcy5fX3dvcmtlcnMgPSBuZXcgTWFwKClcbiAgICAvLyBRdWV1ZVxuICAgIHRoaXMuX19xID0gW11cbiAgICAvLyBTdGF0ZVxuICAgIHRoaXMuX19zdGF0ZSA9IEZpbGVzVXBsb2FkQ29udHJvbGxlci5SVU5OSU5HXG4gIH1cblxuICBzZXQgc2VuZENodW5rQWN0aW9uIChhY3Rpb24pIHtcbiAgICB0aGlzLl9fc2VuZENodW5rQWN0aW9uID0gYWN0aW9uXG4gIH1cblxuICBnZXQgc3RhdGUgKCkge1xuICAgIHJldHVybiB0aGlzLl9fc3RhdGVcbiAgfVxuXG4gIC8vIEZpbGVzXG4gIGdldCBmaWxlcyAoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9fZmlsZXMudmFsdWVzKCldXG4gIH1cblxuICBhZGRGaWxlIChmaWxlKSB7XG4gICAgaWYgKCEoZmlsZSBpbnN0YW5jZW9mIFVzZXJGaWxlKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignTm90IGEgdXNlciBmaWxlJylcblxuICAgIGNvbnN0IGZpbGVVcGxvYWQgPSBuZXcgRmlsZVVwbG9hZChmaWxlKVxuXG4gICAgaWYgKCF0aGlzLl9fZmlsZXMuaGFzKGZpbGVVcGxvYWQuZmlsZS5wYXRoKSkge1xuICAgICAgdGhpcy5fX2ZpbGVzLnNldChmaWxlVXBsb2FkLmZpbGUucGF0aCwgZmlsZVVwbG9hZClcblxuICAgICAgLy8gRW1pdCBhIGZpbGUgZXZlbnRcbiAgICAgIHRoaXMuZW1pdChGaWxlc1VwbG9hZENvbnRyb2xsZXIuRklMRSwgZmlsZVVwbG9hZC5maWxlLnBhdGgsIGZpbGVVcGxvYWQpXG5cbiAgICAgIC8vIFJlcXVlc3QgcmVhZFxuICAgICAgdGhpcy51cGxvYWQoZmlsZVVwbG9hZC5maWxlLnBhdGgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJlbW92ZVdvcmtlciAocGF0aCkge1xuICAgIGlmICh0aGlzLl9fd29ya2Vycy5oYXMocGF0aCkpIHtcbiAgICAgIHRoaXMuX193b3JrZXJzLmdldChwYXRoKS50ZXJtaW5hdGUoKVxuICAgICAgdGhpcy5fX3dvcmtlcnMuZGVsZXRlKHBhdGgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHJlbW92ZUZpbGUgKHBhdGgpIHtcbiAgICB0aGlzLnJlbW92ZVdvcmtlcihwYXRoKVxuXG4gICAgaWYgKHRoaXMuX19maWxlcy5oYXMocGF0aCkpIHtcbiAgICAgIHRoaXMuX19maWxlcy5kZWxldGUocGF0aClcblxuICAgICAgLy8gRW1pdCBhIGZpbGUgZXZlbnRcbiAgICAgIHRoaXMuZW1pdChGaWxlc1VwbG9hZENvbnRyb2xsZXIuRklMRSwgcGF0aCwgbnVsbClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgY2xlYW5GaWxlcyAoKSB7XG4gICAgZm9yIChsZXQgWywgZmlsZV0gb2YgdGhpcy5fX2ZpbGVzKSB7XG4gICAgICB0aGlzLnJlbW92ZUZpbGUoZmlsZSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLy8gVGFza3NcbiAgX19hZGRUYXNrICh0YXNrKSB7XG4gICAgdGhpcy5fX3EucG9wKHRhc2spXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgX19nZXRUYXNrICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3Euc2hpZnQoKVxuICB9XG5cbiAgX19jbGVhblRhc2tzICgpIHtcbiAgICB0aGlzLl9fcSA9IFtdXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgX19mbHVzaCAoKSB7XG4gICAgZm9yIChsZXQgdGFzazsgdGhpcy5zdGF0ZSA9PT0gRmlsZXNVcGxvYWRDb250cm9sbGVyLlJVTk5JTkcgJiYgKHRhc2sgPSB0aGlzLl9fZ2V0VGFzaygpKTspIHtcbiAgICAgIGNvbnN0IHsgYWN0aW9uLCBwYXlsb2FkIH0gPSB0YXNrXG5cbiAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgJ3VwbG9hZCc6XG4gICAgICAgICAgLy8gUmVxdWVzdCByZWFkXG4gICAgICAgICAgaWYgKHRoaXMuX19maWxlcy5oYXMocGF5bG9hZC5wYXRoKSkgdGhpcy51cGxvYWQocGF5bG9hZC5wYXRoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlRmlsZU9mZnNldCAocGF0aCwgb2Zmc2V0KSB7XG4gICAgaWYgKHRoaXMuX19maWxlcy5oYXMocGF0aCkpIHtcbiAgICAgIGxldCBmaWxlVXBsb2FkID0gdGhpcy5fX2ZpbGVzLmdldChwYXRoKVxuXG4gICAgICBmaWxlVXBsb2FkLm9mZnNldCA9IG9mZnNldFxuICAgICAgLy8gRW1pdCBhIHByb2dyZXNzIGV2ZW50XG4gICAgICB0aGlzLmVtaXQoRmlsZXNVcGxvYWRDb250cm9sbGVyLlBST0dSRVNTLCBwYXRoLCBmaWxlVXBsb2FkLnByb2dyZXNzKVxuXG4gICAgICB0aGlzLl9fZmlsZXMuc2V0KHBhdGgsIGZpbGVVcGxvYWQpXG4gICAgICAvLyBFbWl0IGEgZmlsZSBldmVudFxuICAgICAgdGhpcy5lbWl0KEZpbGVzVXBsb2FkQ29udHJvbGxlci5GSUxFLCBwYXRoLCBmaWxlVXBsb2FkKVxuXG4gICAgICBpZiAoZmlsZVVwbG9hZC5wcm9ncmVzcyA8IDEwMCkge1xuICAgICAgICAvLyBSZXF1ZXN0IHVwbG9hZFxuICAgICAgICB0aGlzLnVwbG9hZChwYXRoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVXb3JrZXIocGF0aClcbiAgICAgICAgdGhpcy5yZW1vdmVGaWxlKHBhdGgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBsb2FkIChwYXRoKSB7XG4gICAgaWYgKCF0aGlzLl9fZmlsZXMuaGFzKHBhdGgpKSB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgZmlsZSBkb2VzblxcJ3QgZXhpc3QnKVxuXG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IEZpbGVzVXBsb2FkQ29udHJvbGxlci5QQVVTRUQpIHtcbiAgICAgIHRoaXMuX19hZGRUYXNrKHtcbiAgICAgICAgYWN0aW9uOiAndXBsb2FkJyxcbiAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgIHBhdGg6IHBhdGhcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fX3JlcXVlc3RSZWFkKHBhdGgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIF9fcmVxdWVzdFJlYWQgKHBhdGgpIHtcbiAgICBpZiAoIXRoaXMuX19maWxlcy5oYXMocGF0aCkpIHRocm93IG5ldyBFcnJvcignVGhpcyBmaWxlIGRvZXNuXFwndCBleGlzdCcpXG5cbiAgICBjb25zdCBmaWxlVXBsb2FkID0gdGhpcy5fX2ZpbGVzLmdldChwYXRoKVxuICAgIGlmIChmaWxlVXBsb2FkLnByb2dyZXNzIDwgMTAwKSB7XG4gICAgICBpZiAodGhpcy5fX3N0YXRlID09PSBGaWxlc1VwbG9hZENvbnRyb2xsZXIuUlVOTklORykge1xuICAgICAgICB0aGlzLl9faW5pdFdvcmtlcihwYXRoKVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IGxvZ2dlci5lcnJvcihlcnJvcikpXG4gICAgICAgICAgLnRoZW4oKHdvcmtlcikgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9fd29ya2Vycy5oYXMocGF0aCkpIHRoaXMuX193b3JrZXJzLnNldChwYXRoLCB3b3JrZXIpXG5cbiAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSByZWFkIHdoaWNoIHdpbGwgZmlyZSB0aGUgY2h1bmsgc2VuZGluZ1xuICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgYWN0aW9uVHlwZTogJ3JlYWQnLFxuICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0OiBmaWxlVXBsb2FkLm9mZnNldFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlV29ya2VyKHBhdGgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIF9faGFuZGxlV29ya2VyUmVhZCAoZmlsZSwgY2h1bmssIG9mZnNldCwgbGVuZ3RoKSB7XG4gICAgdGhpcy5fX3NlbmRDaHVua0FjdGlvbihmaWxlLmRpcm5hbWUsIGZpbGUuYmFzZW5hbWUsIGNodW5rLCBvZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIF9faW5pdFdvcmtlciAocGF0aCkge1xuICAgIGNvbnN0IGZpbGVzID0gdGhpcy5fX2ZpbGVzXG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCFmaWxlcy5oYXMocGF0aCkpIHRocm93IG5ldyBFcnJvcignVGhpcyBmaWxlIGRvZXNuXFwndCBleGlzdCcpXG5cbiAgICAgIC8vIFJldHVybiB0aGUgZXhpc3Rpbmcgd29ya2VyXG4gICAgICBpZiAodGhpcy5fX3dvcmtlcnMuaGFzKHBhdGgpKSB7XG4gICAgICAgIHJlc29sdmUodGhpcy5fX3dvcmtlcnMuZ2V0KHBhdGgpLCAxKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHdvcmtlclxuICAgICAgY29uc3Qgd29ya2VyID0gd29yayhGaWxlV29ya2VyKVxuICAgICAgbGV0IGZpbGUgPSBmaWxlcy5nZXQocGF0aCkuZmlsZVxuXG4gICAgICAvLyBBZGQgd29ya2VyIGxpc3RlbmVyc1xuICAgICAgd29ya2VyLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgeyBhY3Rpb25UeXBlLCBwYXlsb2FkIH0gPSBldmVudC5kYXRhXG5cbiAgICAgICAgLy8gbG9nZ2VyLmxvZyhhY3Rpb25UeXBlLCBwYXlsb2FkKSAvLyBERUJVR1xuXG4gICAgICAgIHN3aXRjaCAoYWN0aW9uVHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgcHJvbWlzZVxuICAgICAgICAgICAgcmVzb2x2ZSh3b3JrZXIsIDApXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ3JlYWQnOlxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXlsb2FkLmNodW5rICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBwYXlsb2FkLm9mZnNldCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgcGF5bG9hZC5sZW5ndGggPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgIHRoaXMuX19oYW5kbGVXb3JrZXJSZWFkKGZpbGUsIHBheWxvYWQuY2h1bmssIHBheWxvYWQub2Zmc2V0LCBwYXlsb2FkLmxlbmd0aClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignSW52YWxpZCBwYXlsb2FkIG9uIHJlYWQgZXZlbnQnKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICAvLyBSZWplY3QgdGhlIHByb21pc2VcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IocGF5bG9hZC5lcnJvcikpXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0ludmFsaWQgYWN0aW9uIHR5cGUnKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBTZW5kIGEgbWVzc2FnZSB0byBsb2FkIHRoZSBmaWxlXG4gICAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBhY3Rpb25UeXBlOiAnZmlsZScsXG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICBmaWxlSGFuZGxlOiBmaWxlLmZpbGVIYW5kbGUsXG4gICAgICAgICAgZGlybmFtZTogZmlsZS5kaXJuYW1lLFxuICAgICAgICAgIHR5cGVPUzogZmlsZS50eXBlT1NcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgcGF1c2VVcGxvYWRzICgpIHtcbiAgICB0aGlzLl9fc3RhdGUgPSBGaWxlc1VwbG9hZENvbnRyb2xsZXIuUEFVU0VEXG4gIH1cblxuICBzdGFydFVwbG9hZHMgKCkge1xuICAgIHRoaXMuX19zdGF0ZSA9IEZpbGVzVXBsb2FkQ29udHJvbGxlci5SVU5OSU5HXG4gICAgdGhpcy5fX2ZsdXNoKClcbiAgfVxuXG4gIHN0b3BVcGxvYWRzICgpIHtcbiAgICB0aGlzLl9fc3RhdGUgPSBGaWxlc1VwbG9hZENvbnRyb2xsZXIuUEFVU0VEXG4gICAgdGhpcy5fX2NsZWFuVGFza3MoKVxuICAgIHRoaXMuY2xlYW5GaWxlcygpXG4gIH1cbn1cblxuLy8gU3RhdGVzXG5GaWxlc1VwbG9hZENvbnRyb2xsZXIuUEFVU0VEID0gJ3BhdXNlZCdcbkZpbGVzVXBsb2FkQ29udHJvbGxlci5SVU5OSU5HID0gJ3J1bm5pbmcnXG5cbi8vIEV2ZW50c1xuRmlsZXNVcGxvYWRDb250cm9sbGVyLkZJTEUgPSAnZmlsZSdcbkZpbGVzVXBsb2FkQ29udHJvbGxlci5QUk9HUkVTUyA9ICdwcm9ncmVzcydcblxuRmlsZXNVcGxvYWRDb250cm9sbGVyLmlzU3VwcG9ydGVkID0gKHdpbmRvdyAmJiB3aW5kb3cuRmlsZSAmJiB3aW5kb3cuRmlsZVJlYWRlciAmJiB3aW5kb3cuRmlsZUxpc3QgJiYgd2luZG93LkJsb2IpXG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBGaWxlc1VwbG9hZENvbnRyb2xsZXIoKVxuIiwiaW1wb3J0IHBhdGhQYXJzZSBmcm9tICdwYXRoLXBhcnNlJ1xuaW1wb3J0IGdldFBhdGhQYXJzZXIsIHsgTU9ERV9QT1NJWCwgTU9ERV9XSU4gfSBmcm9tICcuL3BhdGgtcGFyc2VyJ1xuaW1wb3J0IHsgZW5zdXJlQm9vbCB9IGZyb20gJy4uLy4uL2NvbW1vbi9saWIvdXRpbCdcblxuY2xhc3MgRlNJdGVtIHtcbiAgY29uc3RydWN0b3IgKHBhdGgsIHR5cGVPUykge1xuICAgIC8vIEZpcnN0ISEgRG8gdGhpcyBiZWZvcmUgc2V0dGluZyB0aGUgcGF0aFxuICAgIHRoaXMudHlwZU9TID0gdHlwZU9TXG5cbiAgICB0aGlzLnBhdGggPSBwYXRoXG4gICAgdGhpcy5fX2xhc3RNb2RpZmljYXRpb24gPSAwXG4gICAgdGhpcy5fX2xhc3RVcGRhdGUgPSAwXG4gICAgdGhpcy5fcmVhZGFibGUgPSBmYWxzZVxuICAgIHRoaXMuX3dyaXRhYmxlID0gZmFsc2VcbiAgfVxuXG4gIHNldCB0eXBlT1MgKHR5cGVPUykge1xuICAgIHRoaXMuX190eXBlT1MgPSB0eXBlT1NcbiAgICBpZiAodHlwZU9TICYmXG4gICAgdHlwZU9TLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3dpbicpICYmXG4gICAgIXR5cGVPUy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdkYXJ3aW4nKSkge1xuICAgICAgdGhpcy5fX3Bvc2l4ID0gZmFsc2VcbiAgICAgIHRoaXMuX193aW4gPSB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX19wb3NpeCA9IHRydWVcbiAgICAgIHRoaXMuX193aW4gPSBmYWxzZVxuICAgIH1cblxuICAgIC8vIFJlYnVpbGQgcGF0aFxuICAgIGlmICh0aGlzLl9fcGF0aCkgdGhpcy5wYXRoID0gdGhpcy5wYXRoXG4gIH1cblxuICBnZXQgdHlwZU9TICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3R5cGVPU1xuICB9XG5cbiAgZ2V0IGlzUG9zaXggKCkge1xuICAgIHJldHVybiB0aGlzLl9fcG9zaXhcbiAgfVxuXG4gIGdldCBpc1dpbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX193aW5cbiAgfVxuXG4gIGdldCBpc0RpciAoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBnZXQgaXNEcml2ZSAoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBnZXQgaXNGaWxlICgpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGdldCBzZXBhcmF0b3IgKCkge1xuICAgIHJldHVybiAodGhpcy5pc1dpbiA/ICdcXFxcJyA6ICcvJylcbiAgfVxuXG4gIGdldCBwYXRoICgpIHtcbiAgICBpZiAodGhpcy5kaXJuYW1lLmxlbmd0aCA8PSAwICYmIHRoaXMuYmFzZW5hbWUubGVuZ3RoIDw9IDApIHJldHVybiAnJ1xuICAgIGVsc2UgaWYgKHRoaXMuZGlybmFtZS5sZW5ndGggPD0gMCkgcmV0dXJuIHRoaXMuYmFzZW5hbWVcbiAgICBlbHNlIGlmICh0aGlzLmJhc2VuYW1lLmxlbmd0aCA8PSAwKSByZXR1cm4gdGhpcy5kaXJuYW1lXG4gICAgZWxzZSByZXR1cm4gYCR7dGhpcy5kaXJuYW1lfSR7dGhpcy5zZXBhcmF0b3J9JHt0aGlzLmJhc2VuYW1lfWBcbiAgfVxuXG4gIHNldCBwYXRoIChwYXRoKSB7XG4gICAgaWYgKHR5cGVvZiBwYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHBhdGggc2hvdWxkIGJlIGEgc3RyaW5nJylcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoUGFyc2VyID0gZ2V0UGF0aFBhcnNlcih0aGlzLmlzV2luID8gTU9ERV9XSU4gOiBNT0RFX1BPU0lYKVxuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aC5sZW5ndGggPiAwID8gcGF0aFBhcnNlci5ub3JtYWxpemUocGF0aCkgOiAnJ1xuXG4gICAgaWYgKHRoaXMuaXNXaW4pIHtcbiAgICAgIHRoaXMuX19wYXRoID0gcGF0aFBhcnNlLndpbjMyKG5vcm1hbGl6ZWRQYXRoLnJlcGxhY2UoL1xcLy8sICdcXFxcJykpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX19wYXRoID0gcGF0aFBhcnNlLnBvc2l4KG5vcm1hbGl6ZWRQYXRoKVxuICAgIH1cbiAgfVxuXG4gIGdldCByb290ICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3BhdGgucm9vdC5yZXBsYWNlKC9bXFxcXFxcL10kLywgJycpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgfVxuXG4gIGdldCBkaXJuYW1lICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3BhdGguZGlyLnJlcGxhY2UoL1tcXFxcXFwvXSQvLCAnJykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICB9XG5cbiAgZ2V0IGJhc2VuYW1lICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3BhdGguYmFzZVxuICB9XG5cbiAgZ2V0IG5hbWUgKCkge1xuICAgIHJldHVybiB0aGlzLl9fcGF0aC5uYW1lXG4gIH1cblxuICBnZXQgZXh0ZW5zaW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3BhdGguZXh0XG4gIH1cblxuICBnZXQgbGFzdE1vZGlmaWNhdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19sYXN0TW9kaWZpY2F0aW9uXG4gIH1cblxuICAvLyBJbiB1dGltZXN0YW1wIHdpdGggbWlsbGlzZWNvbmRzXG4gIHNldCBsYXN0TW9kaWZpY2F0aW9uIChsYXN0TW9kaWZpY2F0aW9uKSB7XG4gICAgdGhpcy5fX2xhc3RNb2RpZmljYXRpb24gPSBsYXN0TW9kaWZpY2F0aW9uXG4gIH1cblxuICAvLyBEYXRlIG9mIHRoZSBsYXN0IHJlbW90ZSBtb2RpZmljYXRpb24gaW4gdGhpcyBvYmplY3QgaW4gdXRpbWVzdGFtcCB3aXRoIG1pbGxpc2Vjb25kc1xuICBnZXQgbGFzdFVwZGF0ZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19sYXN0VXBkYXRlXG4gIH1cblxuICAvLyBEYXRlIG9mIHRoZSBsYXN0IHJlbW90ZSBtb2RpZmljYXRpb24gaW4gdGhpcyBvYmplY3QgaW4gdXRpbWVzdGFtcCB3aXRoIG1pbGxpc2Vjb25kc1xuICBzZXQgbGFzdFVwZGF0ZSAobGFzdFVwZGF0ZSkge1xuICAgIHRoaXMuX19sYXN0VXBkYXRlID0gbGFzdFVwZGF0ZVxuICAgIHRoaXMubG9hZGVkID0gdHJ1ZVxuICB9XG5cbiAgZ2V0IGlzRGVsZXRpbmcgKCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHNldCBpc0RlbGV0aW5nIChkZWxldGluZykge1xuICAgIC8vIGxvbCBub3RoaW5nIGhhcHBlbnNcbiAgfVxuXG4gIGdldCBjYW5CZURlbGV0ZWQgKCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHNldCBjYW5CZURlbGV0ZWQgKGNhbkJlKSB7XG4gICAgLy8gbG9sIG5vdGhpbmcgaGFwcGVuc1xuICB9XG5cbiAgZ2V0IHJlYWRhYmxlICgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZGFibGVcbiAgfVxuICBzZXQgcmVhZGFibGUgKHZhbHVlKSB7XG4gICAgdGhpcy5fcmVhZGFibGUgPSBlbnN1cmVCb29sKHZhbHVlLCAncmVhZGFibGUgdmFsdWUgc2hvdWxkIGJlIGJvb2xlYW4nKVxuICB9XG5cbiAgZ2V0IHdyaXRhYmxlICgpIHtcbiAgICByZXR1cm4gdGhpcy5fd3JpdGFibGVcbiAgfVxuICBzZXQgd3JpdGFibGUgKHZhbHVlKSB7XG4gICAgdGhpcy5fd3JpdGFibGUgPSBlbnN1cmVCb29sKHZhbHVlLCAnd3JpdGFibGUgdmFsdWUgc2hvdWxkIGJlIGJvb2xlYW4nKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZTSXRlbVxuIiwiaW1wb3J0IGdldFBhdGhQYXJzZXIsIHsgTU9ERV9QT1NJWCwgTU9ERV9XSU4gfSBmcm9tICcuL3BhdGgtcGFyc2VyJ1xuZXhwb3J0IHsgTU9ERV9QT1NJWCwgTU9ERV9XSU4gfSBmcm9tICcuL3BhdGgtcGFyc2VyJ1xuXG5jb25zdCBTRVBfUE9TSVggPSAnLydcbmNvbnN0IFNFUF9XSU4gPSAnXFxcXCdcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtNT0RFX1BPU0lYfE1PREVfV0lOfSBtb2RlXG4gKlxuICogQHJldHVybiBBcnJheSBvZiBldmVyeSBpdGVtIG9mIHRoZSBwYXRoXG4gKlxuICogQHRocm93cyBFcnJvciB3aGVuIHRoZSBtb2RlIGlzIGludmFsaWRcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKHBhdGggPSBTRVBfUE9TSVgsIG1vZGUgPSBNT0RFX1BPU0lYKSA9PiB7XG4gIGlmIChtb2RlICE9PSBNT0RFX1BPU0lYICYmIG1vZGUgIT09IE1PREVfV0lOKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbW9kZScpXG5cbiAgaWYgKHBhdGgubGVuZ3RoID09PSAwIHx8XG4gICAgICAobW9kZSA9PT0gTU9ERV9QT1NJWCAmJiBwYXRoID09PSBTRVBfUE9TSVgpIHx8XG4gICAgICAobW9kZSA9PT0gTU9ERV9XSU4gJiYgcGF0aCA9PT0gU0VQX1dJTikpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuXG4gIGNvbnN0IHBhdGhQYXJzZXIgPSBnZXRQYXRoUGFyc2VyKG1vZGUpXG5cbiAgbGV0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aFBhcnNlci5ub3JtYWxpemUocGF0aClcbiAgaWYgKG1vZGUgPT09IE1PREVfV0lOICYmIG5vcm1hbGl6ZWRQYXRoLmluZGV4T2YoU0VQX1BPU0lYKSAhPT0gLTEpIHtcbiAgICBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZWRQYXRoLnJlcGxhY2UoL1xcLy9nLCBTRVBfV0lOKVxuICB9IGVsc2UgaWYgKG1vZGUgPT09IE1PREVfUE9TSVggJiYgbm9ybWFsaXplZFBhdGguaW5kZXhPZihTRVBfV0lOKSAhPT0gLTEpIHtcbiAgICBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZWRQYXRoLnJlcGxhY2UoL1xcXFwvZywgU0VQX1BPU0lYKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICBub3JtYWxpemVkUGF0aC5pbmRleE9mKHBhdGhQYXJzZXIuc2VwKSA9PT0gMFxuICAgICAgPyBub3JtYWxpemVkUGF0aC5zdWJzdHIoMSlcbiAgICAgIDogbm9ybWFsaXplZFBhdGhcbiAgKS5zcGxpdChwYXRoUGFyc2VyLnNlcClcbn1cbiIsImltcG9ydCBwYXRoTW9kdWxlIGZyb20gJ3BhdGgnXG5cbmV4cG9ydCBjb25zdCBNT0RFX1BPU0lYID0gJ01PREVfUE9TSVgnXG5leHBvcnQgY29uc3QgTU9ERV9XSU4gPSAnTU9ERV9XSU4nXG5cbi8qKlxuICogQHBhcmFtIHtNT0RFX1BPU0lYfE1PREVfV0lOfSBtb2RlXG4gKlxuICogQHJldHVybiBOb2RlIG1vZHVsZSAncGF0aCdcbiAqXG4gKiBAdGhyb3dzIEVycm9yIHdoZW4gdGhlIG1vZGUgaXMgaW52YWxpZFxuICovXG5leHBvcnQgZGVmYXVsdCAobW9kZSA9IE1PREVfUE9TSVgpID0+IHtcbiAgaWYgKG1vZGUgPT09IE1PREVfUE9TSVgpIHJldHVybiB7IC4uLnBhdGhNb2R1bGUsIHNlcDogJy8nIH1cbiAgZWxzZSBpZiAobW9kZSA9PT0gTU9ERV9XSU4pIHJldHVybiB7IC4uLnBhdGhNb2R1bGUsIHNlcDogJ1xcXFwnIH1cbiAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbW9kZScpXG59XG4iLCJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnXG5pbXBvcnQgVXNlckZpbGUgZnJvbSAnLi91c2VyLWZpbGUnXG5cbi8vIENvbnZlcnNpb24gY29uc3RhbnRzXG5jb25zdCBCWVRFID0gMVxuY29uc3QgS0lMT0JZVEUgPSBCWVRFICogMTAyNFxuXG5jbGFzcyBVc2VyRmlsZVJlYWRlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIHN0YXRpYyBnZXQgbm90U3VwcG9ydGVkICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZlYXR1cmUgbm90IHN1cHBvcnRlZCcpXG4gIH1cblxuICBjb25zdHJ1Y3RvciAodXNlckZpbGUsIGNodW5rU2l6ZSA9IChLSUxPQllURSAqIDE2KSkge1xuICAgIGlmICghKHVzZXJGaWxlIGluc3RhbmNlb2YgVXNlckZpbGUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGZpbGUnKVxuXG4gICAgc3VwZXIoKVxuXG4gICAgLy8gU3RvcmUgdGhlIHVzZXIgZmlsZVxuICAgIHRoaXMuX191c2VyRmlsZSA9IHVzZXJGaWxlXG5cbiAgICAvLyBDaHVua1xuICAgIHRoaXMuY2h1bmtTaXplID0gY2h1bmtTaXplXG5cbiAgICAvLyBDaGVjayB0aGUgc2xpY2UgbWV0aG9kXG4gICAgaWYgKCF0aGlzLl9fdXNlckZpbGUuc2xpY2UpIFVzZXJGaWxlUmVhZGVyLm5vdFN1cHBvcnRlZCgpXG4gIH1cblxuICAvLyBDaHVuayAoaW4gYnl0ZXMpXG4gIGNoZWNrQ2h1bmtTaXplIChjaHVua1NpemUpIHtcbiAgICBpZiAodHlwZW9mIGNodW5rU2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBjaHVuayBzaXplIHNob3VsZCBiZSBhIG51bWJlcicpXG4gICAgfSBlbHNlIGlmIChjaHVua1NpemUgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSBjaHVuayBzaXplIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMCcpXG4gICAgfVxuICB9XG5cbiAgc2V0IGNodW5rU2l6ZSAoY2h1bmtTaXplKSB7XG4gICAgdGhpcy5jaGVja0NodW5rU2l6ZShjaHVua1NpemUpXG5cbiAgICB0aGlzLl9fY2h1bmtTaXplID0gY2h1bmtTaXplXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgZ2V0IGNodW5rU2l6ZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19jaHVua1NpemVcbiAgfVxuXG4gIC8vIE9mZnNldCAoaW4gYnl0ZXMpXG4gIGNoZWNrT2Zmc2V0IChvZmZzZXQpIHtcbiAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBvZmZzZXQgc2hvdWxkIGJlIGEgbnVtYmVyJylcbiAgICB9IGVsc2UgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgb2Zmc2V0IHNob3VsZCBiZSBlcXVhbCBvciBncmVhdGVyIHRoYW4gMCcpXG4gICAgfVxuICB9XG5cbiAgLy8gQmxvYiBzbGljZSBtZXRob2RcbiAgc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgICByZXR1cm4gdGhpcy5fX3VzZXJGaWxlLnNsaWNlKHN0YXJ0LCBlbmQpXG4gIH1cblxuICBlcnJvckhhbmRsZXIgKGV2ZW50KSB7XG4gICAgdmFyIGVycm9yID0gZXZlbnQudGFyZ2V0LmVycm9yXG5cbiAgICBzd2l0Y2ggKGVycm9yLmNvZGUpIHtcbiAgICAgIGNhc2UgZXJyb3IuTk9UX0ZPVU5EX0VSUjpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlIE5vdCBGb3VuZCcpXG4gICAgICBjYXNlIGVycm9yLk5PVF9SRUFEQUJMRV9FUlI6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmlsZSBpcyBub3QgcmVhZGFibGUnKVxuICAgICAgY2FzZSBlcnJvci5BQk9SVF9FUlI6XG4gICAgICAgIGJyZWFrXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkIHJlYWRpbmcgdGhpcyBmaWxlJylcbiAgICB9XG4gIH1cblxuICByZWFkIChvZmZzZXQsIGNodW5rU2l6ZSkge1xuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIG9mZnNldCBpcyBub3QgZGVmaW5lZCcpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2h1bmtTaXplID09PSAndW5kZWZpbmVkJykgY2h1bmtTaXplID0gdGhpcy5jaHVua1NpemVcblxuICAgIHRoaXMuY2hlY2tPZmZzZXQob2Zmc2V0KVxuICAgIHRoaXMuY2hlY2tDaHVua1NpemUoY2h1bmtTaXplKVxuXG4gICAgdmFyIHNpemUgPSB0aGlzLl9fdXNlckZpbGUuc2l6ZVxuXG4gICAgaWYgKG9mZnNldCA+PSBzaXplKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09mZnNldCBlcXVhbCBvciBncmVhdGVyIHRoYW4gZmlsZSBzaXplJylcbiAgICB9XG5cbiAgICBpZiAoKG9mZnNldCArIGNodW5rU2l6ZSkgPiBzaXplKSBjaHVua1NpemUgPSBzaXplIC0gb2Zmc2V0XG5cbiAgICBjb25zdCBzdGFydCA9IG9mZnNldFxuICAgIGNvbnN0IGVuZCA9IG9mZnNldCArIGNodW5rU2l6ZVxuICAgIGNvbnN0IGJsb2IgPSB0aGlzLnNsaWNlKHN0YXJ0LCBlbmQpXG4gICAgbGV0IHJlYWRlciA9IG51bGxcbiAgICBsZXQgcmVhZGVyVHlwZSA9IG51bGxcbiAgICBsZXQgcHJvY2Vzc1NsaWNlID0gKHNsaWNlKSA9PiB7XG4gICAgICB0aGlzLm9mZnNldCArPSBjaHVua1NpemVcbiAgICAgIHRoaXMuZW1pdCgncmVhZCcsIHNsaWNlLCBvZmZzZXQsIGNodW5rU2l6ZSlcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKVxuICAgICAgcmVhZGVyVHlwZSA9ICdGaWxlUmVhZGVyJ1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBGaWxlUmVhZGVyIG5vdCBzdXBwb3J0ZWQgaW4gV1cgKHRoYW5rcywgRmlyZWZveClcbiAgICB9XG4gICAgaWYgKCFyZWFkZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlYWRlciA9IG5ldyB3aW5kb3cuRmlsZVJlYWRlclN5bmMoKVxuICAgICAgICByZWFkZXJUeXBlID0gJ0ZpbGVSZWFkZXJTeW5jJ1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gRmlsZVJlYWRlclN5bmMgbm90IHN1cHBvcnRlZCAoLi4uLi4uLi4pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmlsZVJlYWRlciBvciBGaWxlUmVhZGVyU3luYyBub3Qgc3VwcG9ydGVkJylcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVhZGVyVHlwZSAmJiByZWFkZXJUeXBlID09PSAnRmlsZVJlYWRlcicpIHtcbiAgICAgIHByb2Nlc3NTbGljZS5iaW5kKHRoaXMpXG4gICAgICByZWFkZXIub25sb2FkZW5kID0gKGV2ZW50KSA9PiB7XG4gICAgICAgIGxldCB0YXJnZXQgPSBldmVudC50YXJnZXRcblxuICAgICAgICBpZiAodGFyZ2V0LnJlYWR5U3RhdGUgIT09IEZpbGVSZWFkZXIuRE9ORSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgcmVhZGluZyB0aGUgZmlsZScpXG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzU2xpY2UodGFyZ2V0LnJlc3VsdClcbiAgICAgIH1cbiAgICAgIHJlYWRlci5vbmVycm9yID0gdGhpcy5lcnJvckhhbmRsZXIuYmluZCh0aGlzKVxuICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBzbGljZSA9IHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKVxuICAgICAgcHJvY2Vzc1NsaWNlKHNsaWNlKVxuICAgIH1cbiAgfVxuXG4gIHJlYWRGcm9tIChvZmZzZXQpIHtcbiAgICB0aGlzLnJlYWQob2Zmc2V0KVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVzZXJGaWxlUmVhZGVyXG4iLCJpbXBvcnQgRmlsZUl0ZW0gZnJvbSAnLi9maWxlLWl0ZW0nXG5pbXBvcnQgRGlySXRlbSBmcm9tICcuL2Rpci1pdGVtJ1xuXG5jbGFzcyBVc2VyRmlsZSBleHRlbmRzIEZpbGVJdGVtIHtcbiAgc3RhdGljIGdldCBpc1N1cHBvcnRlZCAoKSB7XG4gICAgcmV0dXJuICh3aW5kb3cgJiYgd2luZG93LkZpbGUgJiYgd2luZG93LkZpbGVSZWFkZXIgJiYgd2luZG93LkZpbGVMaXN0ICYmIHdpbmRvdy5CbG9iKVxuICB9XG5cbiAgY29uc3RydWN0b3IgKGZpbGVIYW5kbGUsIGRlc3QsIHR5cGVPUykge1xuICAgIC8vIGlmICghVXNlckZpbGUuaXNTdXBwb3J0ZWQpXG4gICAgLy8gICB0aHJvdyBuZXcgRXJyb3IoJ0ZlYXR1cmUgbm90IHN1cHBvcnRlZCcpXG4gICAgaWYgKCEoZmlsZUhhbmRsZSBpbnN0YW5jZW9mIEZpbGUpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIGZpbGUgaGFuZGxlcicpXG4gICAgfVxuXG4gICAgc3VwZXIoZGVzdCwge1xuICAgICAgc2l6ZTogZmlsZUhhbmRsZS5zaXplLFxuICAgICAgbWltZVR5cGU6IGZpbGVIYW5kbGUudHlwZSxcbiAgICAgIGxhc3RNb2RpZmljYXRpb246IGZpbGVIYW5kbGUubGFzdE1vZGlmaWVkXG4gICAgfSwgdHlwZU9TKVxuXG4gICAgLy8gRml4IHRoZSBwYXRoIG5vdyB3ZSBoYXZlIHRoZSBvcyB0eXBlXG4gICAgY29uc3QgZGlyID0gbmV3IERpckl0ZW0oZGVzdCwge30sIHR5cGVPUylcbiAgICB0aGlzLnBhdGggPSAoZGlyLnBhdGgubGVuZ3RoID4gMClcbiAgICAgID8gZGlyLnBhdGggKyBkaXIuc2VwYXJhdG9yICsgZmlsZUhhbmRsZS5uYW1lXG4gICAgICA6IGZpbGVIYW5kbGUubmFtZVxuXG4gICAgLy8gU3RvcmUgdGhlIGZpbGUgaGFuZGxlXG4gICAgdGhpcy5maWxlSGFuZGxlID0gZmlsZUhhbmRsZVxuICB9XG5cbiAgc2xpY2UgKHN0YXJ0LCBlbmQpIHtcbiAgICB2YXIgYmxvYiA9IG51bGxcbiAgICBpZiAoJ3NsaWNlJyBpbiB0aGlzLmZpbGVIYW5kbGUpIHtcbiAgICAgIGJsb2IgPSB0aGlzLmZpbGVIYW5kbGUuc2xpY2Uoc3RhcnQsIGVuZClcbiAgICB9IGVsc2UgaWYgKCd3ZWJraXRTbGljZScgaW4gdGhpcy5maWxlSGFuZGxlKSB7XG4gICAgICBibG9iID0gdGhpcy5maWxlSGFuZGxlLndlYmtpdFNsaWNlKHN0YXJ0LCBlbmQpXG4gICAgfSBlbHNlIGlmICgnbW96U2xpY2UnIGluIHRoaXMuZmlsZUhhbmRsZSkge1xuICAgICAgYmxvYiA9IHRoaXMuZmlsZUhhbmRsZS5tb3pTbGljZShzdGFydCwgZW5kKVxuICAgIH1cblxuICAgIHJldHVybiBibG9iXG4gIH1cblxuICBnZXQgaXNDbG9zZWQgKCkge1xuICAgIHJldHVybiB0aGlzLmZpbGVIYW5kbGUuaXNDbG9zZWRcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBVc2VyRmlsZVxuIiwiY2xhc3MgUHJvY2VzcyB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5QSUQgPSBwcm9wcy5QSURcbiAgICB0aGlzLnVzZXIgPSBwcm9wcy51c2VyXG4gICAgdGhpcy5uYW1lID0gcHJvcHMubmFtZVxuICAgIHRoaXMuQ1BVID0gcHJvcHMuQ1BVXG4gICAgdGhpcy5SQU0gPSBwcm9wcy5SQU1cbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gcHJvcHMuZGVzY3JpcHRpb25cbiAgfVxuXG4gIHNldCBQSUQgKFBJRCkge1xuICAgIGlmICh0eXBlb2YgUElEID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFBJRCBvZiB0aGUgcHJvY2VzcyBpcyByZXF1aXJlZCcpXG4gICAgfVxuICAgIGlmIChOdW1iZXIuaXNOYU4oUElEKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFBJRCBvZiB0aGUgcHJvY2VzcyBzaG91bGQgYmUgYSBudW1iZXInKVxuICAgIH1cbiAgICB0aGlzLl9QSUQgPSBQSURcbiAgfVxuICBnZXQgUElEICgpIHtcbiAgICByZXR1cm4gdGhpcy5fUElEXG4gIH1cblxuICBzZXQgdXNlciAodXNlciA9ICcnKSB7XG4gICAgaWYgKHR5cGVvZiB1c2VyICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHVzZXIgb2YgdGhlIHByb2Nlc3Mgc2hvdWxkIGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgdGhpcy5fdXNlciA9IHVzZXJcbiAgfVxuICBnZXQgdXNlciAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJcbiAgfVxuXG4gIHNldCBuYW1lIChuYW1lID0gJycpIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgbmFtZSBvZiB0aGUgcHJvY2VzcyBpcyByZXF1aXJlZCcpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBuYW1lIG9mIHRoZSBwcm9jZXNzIHNob3VsZCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIHRoaXMuX25hbWUgPSBuYW1lXG4gIH1cbiAgZ2V0IG5hbWUgKCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lXG4gIH1cblxuICBzZXQgQ1BVIChDUFUgPSAwKSB7XG4gICAgdGhpcy5fQ1BVID0gIU51bWJlci5pc05hTihDUFUpXG4gICAgICA/IE51bWJlcihDUFUudG9GaXhlZCgxKSlcbiAgICAgIDogMFxuICB9XG4gIGdldCBDUFUgKCkge1xuICAgIHJldHVybiB0aGlzLl9DUFVcbiAgfVxuXG4gIHNldCBSQU0gKFJBTSA9IDApIHtcbiAgICB0aGlzLl9SQU0gPSAhTnVtYmVyLmlzTmFOKFJBTSlcbiAgICAgID8gTnVtYmVyKFJBTSlcbiAgICAgIDogMFxuICB9XG4gIGdldCBSQU0gKCkge1xuICAgIHJldHVybiB0aGlzLl9SQU1cbiAgfVxuXG4gIHNldCBkZXNjcmlwdGlvbiAoZGVzY3JpcHRpb24gPSAnJykge1xuICAgIGlmICh0eXBlb2YgZGVzY3JpcHRpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHByb2Nlc3Mgc2hvdWxkIGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgdGhpcy5fZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvblxuICB9XG4gIGdldCBkZXNjcmlwdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9uXG4gIH1cblxuICBzdGF0aWMgZ2V0IHNvcnRIYW5kbGVyICgpIHtcbiAgICByZXR1cm4gKHByb3AsIG9yZGVyKSA9PiB7XG4gICAgICAvLyBPbmx5IEFTQyBvciBERVNDIGFyZSBzdXBwb3J0ZWRcbiAgICAgIGlmIChvcmRlciAhPT0gJ0FTQycgJiYgb3JkZXIgIT09ICdERVNDJykgb3JkZXIgPSAnQVNDJ1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIGxldCByZXMgPSAwXG4gICAgICAgIGNvbnN0IHZhbEEgPSAodHlwZW9mIGFbcHJvcF0gPT09ICdzdHJpbmcnKVxuICAgICAgICAgID8gYVtwcm9wXS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgOiBhW3Byb3BdXG4gICAgICAgIGNvbnN0IHZhbEIgPSAodHlwZW9mIGJbcHJvcF0gPT09ICdzdHJpbmcnKVxuICAgICAgICAgID8gYltwcm9wXS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgOiBiW3Byb3BdXG5cbiAgICAgICAgaWYgKHZhbEEgPT09IHZhbEIpIHJlcyA9IDBcbiAgICAgICAgaWYgKG9yZGVyID09PSAnQVNDJykgcmVzID0gdmFsQSA+IHZhbEIgPyAxIDogLTFcbiAgICAgICAgZWxzZSBpZiAob3JkZXIgPT09ICdERVNDJykgcmVzID0gdmFsQSA8IHZhbEIgPyAxIDogLTFcblxuICAgICAgICByZXR1cm4gcmVzXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBpZGVudGlmaWVyICgpIHtcbiAgICByZXR1cm4gKFBJRCwgbmFtZSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBQSUQgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBwcm9jZXNzIFBJRCBzaG91bGQgYmUgYSBudW1iZXInKVxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgcHJvY2VzcyBuYW1lIGlzIG5vdCBhIHN0cmluZycpXG4gICAgICB9XG4gICAgICByZXR1cm4gU3ltYm9sLmZvcihgWyR7UElEfV0gJHtuYW1lfWApXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBkZWZhdXRTb3J0T2JqZWN0ICgpIHtcbiAgICByZXR1cm4gbmV3IE1hcCgpXG4gICAgICAuc2V0KCdQSUQnLCAnJylcbiAgICAgIC5zZXQoJ3VzZXInLCAnJylcbiAgICAgIC5zZXQoJ25hbWUnLCAnJylcbiAgICAgIC5zZXQoJ0NQVScsICcnKVxuICAgICAgLnNldCgnUkFNJywgJycpXG4gICAgICAuc2V0KCdkZXNjcmlwdGlvbicsICcnKVxuICB9XG5cbiAgc3RhdGljIGdldCBkZWZhdXRGaWx0ZXJPYmplY3QgKCkge1xuICAgIHJldHVybiBuZXcgTWFwKClcbiAgICAgIC5zZXQoJ1BJRCcsICcnKVxuICAgICAgLnNldCgndXNlcicsICcnKVxuICAgICAgLnNldCgnbmFtZScsICcnKVxuICAgICAgLnNldCgnQ1BVJywgJycpXG4gICAgICAuc2V0KCdSQU0nLCAnJylcbiAgICAgIC5zZXQoJ2Rlc2NyaXB0aW9uJywgJycpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUHJvY2Vzc1xuIiwiLy8gc3JjL3Byb2Nlc3Nlcy1tYW5hZ2VyL2FjdGlvbnMvaW5kZXguanNcblxuaW1wb3J0IEFwcERpc3BhdGNoZXIgZnJvbSAnLi4vLi4vZGlzcGF0Y2hlcidcbmltcG9ydCBQcm9jZXNzZXNDb25zdGFudHMgZnJvbSAnLi4vY29uc3RhbnRzJ1xuaW1wb3J0IFJlbW90ZSBmcm9tICcuLi8uLi9jb21tb24vbGliL3JlbW90ZSdcbmltcG9ydCB7IFBST1RPIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJ1xuXG5jb25zdCBQcm9jZXNzZXNBY3Rpb25zID0ge1xuICAvLyAtLSBSZW1vdGUgLS0gLy9cblxuICByZXF1ZXN0TGlzdDogKCkgPT4ge1xuICAgIFJlbW90ZS5zZW5kKHtcbiAgICAgIHByb3RvOiBQUk9UTy5QUk9DRVNTRVMsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGFjdGlvbjogJ2xpc3QnXG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICByZXF1ZXN0U3RvcDogKFBJRCwgbmFtZSkgPT4ge1xuICAgIFJlbW90ZS5zZW5kKHtcbiAgICAgIHByb3RvOiBQUk9UTy5QUk9DRVNTRVMsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGFjdGlvbjogJ3N0b3AnLFxuICAgICAgICBwaWQ6IFBJRCxcbiAgICAgICAgcHJvY2Vzc19uYW1lOiBuYW1lXG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICAvLyAtLSBMb2NhbCAtLSAvL1xuXG4gIGluaXRpYWxpemVTdG9yZTogKCkgPT4ge1xuICAgIEFwcERpc3BhdGNoZXIuZGlzcGF0Y2goe1xuICAgICAgYWN0aW9uVHlwZTogUHJvY2Vzc2VzQ29uc3RhbnRzLklOSVRfUFJPQ0VTU0VTX1NUT1JFXG4gICAgfSlcbiAgfSxcblxuICBmaWx0ZXI6IChwcm9wLCBmaWx0ZXIpID0+IHtcbiAgICBBcHBEaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIGFjdGlvblR5cGU6IFByb2Nlc3Nlc0NvbnN0YW50cy5GSUxURVJfUFJPQ0VTU0VTLFxuICAgICAgcHJvcDogcHJvcCxcbiAgICAgIGZpbHRlcjogZmlsdGVyXG4gICAgfSlcbiAgfSxcblxuICBzb3J0OiAocHJvcCwgb3JkZXIpID0+IHtcbiAgICBBcHBEaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIGFjdGlvblR5cGU6IFByb2Nlc3Nlc0NvbnN0YW50cy5TT1JUX1BST0NFU1NFUyxcbiAgICAgIHByb3A6IHByb3AsXG4gICAgICBvcmRlcjogb3JkZXJcbiAgICB9KVxuICB9LFxuXG4gIGZldGNoOiAobGlzdCwgc3lzdGVtSW5mbywgdGltZXN0YW1wKSA9PiB7XG4gICAgQXBwRGlzcGF0Y2hlci5kaXNwYXRjaCh7XG4gICAgICBhY3Rpb25UeXBlOiBQcm9jZXNzZXNDb25zdGFudHMuRkVUQ0hfUFJPQ0VTU0VTLFxuICAgICAgbGlzdDogbGlzdCxcbiAgICAgIHN5c3RlbUluZm86IHN5c3RlbUluZm8sXG4gICAgICB0aW1lc3RhbXA6IHRpbWVzdGFtcFxuICAgIH0pXG4gIH0sXG5cbiAgc2VsZWN0OiAoUElELCBuYW1lKSA9PiB7XG4gICAgQXBwRGlzcGF0Y2hlci5kaXNwYXRjaCh7XG4gICAgICBhY3Rpb25UeXBlOiBQcm9jZXNzZXNDb25zdGFudHMuU0VMRUNUX1BST0NFU1MsXG4gICAgICBQSUQ6IFBJRCxcbiAgICAgIG5hbWU6IG5hbWVcbiAgICB9KVxuICB9LFxuXG4gIGNsZWFuU2VsZWN0ZWQ6ICgpID0+IHtcbiAgICBBcHBEaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIGFjdGlvblR5cGU6IFByb2Nlc3Nlc0NvbnN0YW50cy5DTEVBTl9TRUxFQ1RFRF9QUk9DRVNTXG4gICAgfSlcbiAgfSxcblxuICBzdG9wOiAoUElELCBuYW1lKSA9PiB7XG4gICAgQXBwRGlzcGF0Y2hlci5kaXNwYXRjaCh7XG4gICAgICBhY3Rpb25UeXBlOiBQcm9jZXNzZXNDb25zdGFudHMuU1RPUF9QUk9DRVNTLFxuICAgICAgUElEOiBQSUQsXG4gICAgICBuYW1lOiBuYW1lXG4gICAgfSlcbiAgfSxcblxuICByZW1vdmU6IChQSUQsIG5hbWUpID0+IHtcbiAgICBBcHBEaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIGFjdGlvblR5cGU6IFByb2Nlc3Nlc0NvbnN0YW50cy5SRU1PVkVfUFJPQ0VTUyxcbiAgICAgIFBJRDogUElELFxuICAgICAgbmFtZTogbmFtZVxuICAgIH0pXG4gIH0sXG5cbiAgYWRkVG9TdG9wcGluZzogKFBJRCwgbmFtZSkgPT4ge1xuICAgIEFwcERpc3BhdGNoZXIuZGlzcGF0Y2goe1xuICAgICAgYWN0aW9uVHlwZTogUHJvY2Vzc2VzQ29uc3RhbnRzLkFERF9UT19TVE9QUElORyxcbiAgICAgIFBJRDogUElELFxuICAgICAgbmFtZTogbmFtZVxuICAgIH0pXG4gIH0sXG5cbiAgcmVtb3ZlRnJvbVN0b3BwaW5nOiAoUElELCBuYW1lKSA9PiB7XG4gICAgQXBwRGlzcGF0Y2hlci5kaXNwYXRjaCh7XG4gICAgICBhY3Rpb25UeXBlOiBQcm9jZXNzZXNDb25zdGFudHMuUkVNT1ZFX0ZST01fU1RPUFBJTkcsXG4gICAgICBQSUQ6IFBJRCxcbiAgICAgIG5hbWU6IG5hbWVcbiAgICB9KVxuICB9LFxuXG4gIGNoYW5nZVBlcmlvZDogKHBlcmlvZCkgPT4ge1xuICAgIEFwcERpc3BhdGNoZXIuZGlzcGF0Y2goe1xuICAgICAgYWN0aW9uVHlwZTogUHJvY2Vzc2VzQ29uc3RhbnRzLkNIQU5HRV9QRVJJT0QsXG4gICAgICBwZXJpb2Q6IHBlcmlvZFxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUHJvY2Vzc2VzQWN0aW9uc1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHtcbiAgQnV0dG9uLCBHbHlwaGljb24sIE92ZXJsYXlUcmlnZ2VyLCBUb29sdGlwLCBGb3JtQ29udHJvbFxufSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQgeyBpbmplY3RJbnRsIH0gZnJvbSAncmVhY3QtaW50bCdcblxuaW1wb3J0IFByb2Nlc3MgZnJvbSAnLi4vUHJvY2VzcydcbmltcG9ydCBQcm9jZXNzZXNBY3Rpb25zIGZyb20gJy4uL2FjdGlvbnMnXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuLi8uLi9jb21tb24vY29tcG9uZW50cy9CYXNlQ29tcG9uZW50J1xuaW1wb3J0IFJlZnJlc2hCdXR0b24gZnJvbSAnLi4vLi4vY29tbW9uL2NvbXBvbmVudHMvcmVmcmVzaC1idXR0b24nXG5cbmNsYXNzIFByb2Nlc3Nlc0J1dHRvbnMgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICAvLyBNZXNzYWdlcyBkZWZpbml0aW9uc1xuICAgIHRoaXMubWVzc2FnZXMgPSB7XG4gICAgICBYX1NlY29uZHM6IHtcbiAgICAgICAgaWQ6ICdYX1NlY29uZHMnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ3tuU2Vjb25kcywgcGx1cmFsLCA9MHtOZXZlcn0gb25leyMgc2Vjb25kfSBvdGhlcnsjIHNlY29uZHN9fScsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnT25seSB0cmFuc2xhdGUgXCJOZXZlclwiLCBcInNlY29uZFwiIGFuZCBcInNlY29uZHNcIidcbiAgICAgIH0sXG4gICAgICBYX01pbnV0ZXM6IHtcbiAgICAgICAgaWQ6ICdYX01pbnV0ZXMnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ3tuTWludXRlcywgcGx1cmFsLCA9MHtOZXZlcn0gb25leyMgbWludXRlfSBvdGhlcnsjIG1pbnV0ZXN9fScsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnT25seSB0cmFuc2xhdGUgXCJOZXZlclwiLCBcIm1pbnV0ZVwiIGFuZCBcIm1pbnV0ZXNcIidcbiAgICAgIH0sXG4gICAgICByZWZyZXNoUHJvY2Vzc2VzOiB7XG4gICAgICAgIGlkOiAncmVmcmVzaFByb2Nlc3NlcycsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnUmVmcmVzaCBwcm9jZXNzZXMnXG4gICAgICB9LFxuICAgICAgc3RvcFByb2Nlc3M6IHtcbiAgICAgICAgaWQ6ICdzdG9wUHJvY2VzcycsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnU3RvcCBwcm9jZXNzJ1xuICAgICAgfSxcbiAgICAgIGNsaWNrT25BUHJvY2Vzczoge1xuICAgICAgICBpZDogJ2NsaWNrT25BUHJvY2VzcycsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnQ2xpY2sgb24gYSBwcm9jZXNzJ1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZ2V0UGVyaW9kcyA9IChkZWZpbmVNZXNzYWdlKSA9PiB7XG4gICAgICB2YXIgcGVyaW9kcyA9IG5ldyBNYXAoKVxuICAgICAgcGVyaW9kcy5zZXQoMCwgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLlhfU2Vjb25kcywgeyBuU2Vjb25kczogMCB9KSlcbiAgICAgIHBlcmlvZHMuc2V0KDUsIGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy5YX1NlY29uZHMsIHsgblNlY29uZHM6IDUgfSkpXG4gICAgICBwZXJpb2RzLnNldCgxMCwgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLlhfU2Vjb25kcywgeyBuU2Vjb25kczogMTAgfSkpXG4gICAgICBwZXJpb2RzLnNldCgxNSwgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLlhfU2Vjb25kcywgeyBuU2Vjb25kczogMTUgfSkpXG4gICAgICBwZXJpb2RzLnNldCgzMCwgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLlhfU2Vjb25kcywgeyBuU2Vjb25kczogMzAgfSkpXG4gICAgICBwZXJpb2RzLnNldCg2MCwgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLlhfTWludXRlcywgeyBuTWludXRlczogMSB9KSlcblxuICAgICAgcmV0dXJuIHBlcmlvZHNcbiAgICB9XG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IGRlZmluZU1lc3NhZ2UgPSB0aGlzLnByb3BzLmludGwuZm9ybWF0TWVzc2FnZVxuXG4gICAgbGV0IHByb2Nlc3NUZXh0ID0gZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLmNsaWNrT25BUHJvY2VzcylcbiAgICBsZXQgYnV0dG9uRGlzYWJsZWQgPSB0cnVlXG5cbiAgICBpZiAodGhpcy5wcm9wcy5wcm9jZXNzIGluc3RhbmNlb2YgUHJvY2Vzcykge1xuICAgICAgcHJvY2Vzc1RleHQgPSB0aGlzLnByb3BzLnByb2Nlc3MubmFtZVxuICAgICAgYnV0dG9uRGlzYWJsZWQgPSAhIXRoaXMucHJvcHMucHJvY2Vzcy5zdG9wcGluZ1xuICAgIH1cblxuICAgIGNvbnN0IHRvb2x0aXAgPSAoaWQsIG1lc3NhZ2UpID0+IDxUb29sdGlwIGlkPXtpZH0+e21lc3NhZ2V9PC9Ub29sdGlwPlxuICAgIGNvbnN0IGhhbmRsZVJlZnJlc2ggPSAoKSA9PiBQcm9jZXNzZXNBY3Rpb25zLnJlcXVlc3RMaXN0KClcbiAgICBjb25zdCBoYW5kbGVQZXJpb2RDaGFuZ2UgPSAocGVyaW9kKSA9PiB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5vblBlcmlvZENoYW5nZSkge1xuICAgICAgICBQcm9jZXNzZXNBY3Rpb25zLmNoYW5nZVBlcmlvZChwZXJpb2QpXG4gICAgICAgIHRoaXMucHJvcHMub25QZXJpb2RDaGFuZ2UocGVyaW9kKVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGhhbmRsZUJ1dHRvbkNsaWNrID0gKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBpZiAodGhpcy5wcm9wcy5wcm9jZXNzIGluc3RhbmNlb2YgUHJvY2Vzcykge1xuICAgICAgICAvLyBBZGQgdGhlIHByb2Nlc3MgdG8gYSBsaXN0IG9mIHByb2Nlc3NlcyBpbiBzdG9wcGluZyBzdGF0ZVxuICAgICAgICBQcm9jZXNzZXNBY3Rpb25zLmFkZFRvU3RvcHBpbmcodGhpcy5wcm9wcy5wcm9jZXNzLlBJRCwgdGhpcy5wcm9wcy5wcm9jZXNzLm5hbWUpXG4gICAgICAgIC8vIFNlbmQgYSB0YXNrIHRvIHRoZSByZW1vdGUgdG8gc3RvcCB0aGUgcHJvY2Vzc1xuICAgICAgICBQcm9jZXNzZXNBY3Rpb25zLnJlcXVlc3RTdG9wKHRoaXMucHJvcHMucHJvY2Vzcy5QSUQsIHRoaXMucHJvcHMucHJvY2Vzcy5uYW1lKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGlkPSdwcm9jZXNzZXMtYnV0dG9ucyc+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cnPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2wtbWQtMyB0ZXh0LWxlZnQnPlxuICAgICAgICAgICAgPFJlZnJlc2hCdXR0b25cbiAgICAgICAgICAgICAgbGFzdFVwZGF0ZT17dGhpcy5wcm9wcy5sYXN0VXBkYXRlfVxuICAgICAgICAgICAgICBwZXJpb2RzPXt0aGlzLmdldFBlcmlvZHMoZGVmaW5lTWVzc2FnZSl9XG4gICAgICAgICAgICAgIGFjdGl2ZVBlcmlvZD17dGhpcy5wcm9wcy51cGRhdGVQZXJpb2R9XG4gICAgICAgICAgICAgIGhhbmRsZVJlZnJlc2g9e2hhbmRsZVJlZnJlc2h9XG4gICAgICAgICAgICAgIGhhbmRsZVBlcmlvZENoYW5nZT17aGFuZGxlUGVyaW9kQ2hhbmdlfT5cbiAgICAgICAgICAgICAgeyBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMucmVmcmVzaFByb2Nlc3NlcykgfVxuICAgICAgICAgICAgPC9SZWZyZXNoQnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2wtbWQtOCB0ZXh0LXJpZ2h0Jz5cbiAgICAgICAgICAgIDxGb3JtQ29udHJvbC5TdGF0aWM+eyBwcm9jZXNzVGV4dCB9PC9Gb3JtQ29udHJvbC5TdGF0aWM+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbC1tZC0xIHRleHQtcmlnaHQnPlxuICAgICAgICAgICAgPE92ZXJsYXlUcmlnZ2VyXG4gICAgICAgICAgICAgIHBsYWNlbWVudD0nYm90dG9tJ1xuICAgICAgICAgICAgICBvdmVybGF5PXt0b29sdGlwKFxuICAgICAgICAgICAgICAgICdwcm9jLXRvb2x0aXAtc3RvcCcsXG4gICAgICAgICAgICAgICAgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLnN0b3BQcm9jZXNzKVxuICAgICAgICAgICAgICApfT5cbiAgICAgICAgICAgICAgPEJ1dHRvbiBkaXNhYmxlZD17YnV0dG9uRGlzYWJsZWR9IG9uQ2xpY2s9e2hhbmRsZUJ1dHRvbkNsaWNrfT5cbiAgICAgICAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdzdG9wJyAvPlxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgIDwvT3ZlcmxheVRyaWdnZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59XG5cblByb2Nlc3Nlc0J1dHRvbnMucHJvcFR5cGVzID0ge1xuICB1cGRhdGVQZXJpb2Q6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIHByb2Nlc3M6IFJlYWN0LlByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgIFJlYWN0LlByb3BUeXBlcy5pbnN0YW5jZU9mKFByb2Nlc3MpLCBSZWFjdC5Qcm9wVHlwZXMuYm9vbFxuICBdKSxcbiAgbGFzdFVwZGF0ZTogUmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUmVhY3QuUHJvcFR5cGVzLm51bWJlciwgUmVhY3QuUHJvcFR5cGVzLmJvb2xcbiAgXSksXG4gIG9uUGVyaW9kQ2hhbmdlOiBSZWFjdC5Qcm9wVHlwZXMuZnVuY1xufVxuUHJvY2Vzc2VzQnV0dG9ucy5kZWZhdWx0UHJvcHMgPSB7XG4gIHVwZGF0ZVBlcmlvZDogMCxcbiAgcHJvY2VzczogZmFsc2UsXG4gIGxhc3RVcGRhdGU6IGZhbHNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdEludGwoUHJvY2Vzc2VzQnV0dG9ucylcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUNvbnRyb2wgfSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQgeyBpbmplY3RJbnRsIH0gZnJvbSAncmVhY3QtaW50bCdcblxuaW1wb3J0IFByb2Nlc3Nlc0FjdGlvbnMgZnJvbSAnLi4vYWN0aW9ucydcblxuY2xhc3MgUHJvY2Vzc2VzRmlsdGVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICAvLyBNZXNzYWdlcyBkZWZpbml0aW9uc1xuICAgIHRoaXMubWVzc2FnZXMgPSB7XG4gICAgICBmaWx0ZXJQcm9jZXNzOiB7XG4gICAgICAgIGlkOiAnZmlsdGVyUHJvY2VzcycsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnRmlsdGVyIGxpc3QgYnkgUElELCB1c2VyIG9yIG5hbWUnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1BsYWNlaG9sZGVyIGludG8gdGV4dGJveCBvZiBwcm9jZXNzZXMgZmlsdGVyJ1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgZGVmaW5lTWVzc2FnZSA9IHRoaXMucHJvcHMuaW50bC5mb3JtYXRNZXNzYWdlXG4gICAgcmV0dXJuIChcbiAgICAgIDxGb3JtR3JvdXA+XG4gICAgICAgIDxGb3JtQ29udHJvbFxuICAgICAgICAgIGNvbXBvbmVudENsYXNzPSdpbnB1dCdcbiAgICAgICAgICB0eXBlPSd0ZXh0J1xuICAgICAgICAgIGJzU2l6ZT0nc21hbGwnXG4gICAgICAgICAgcGxhY2Vob2xkZXI9e2RlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy5maWx0ZXJQcm9jZXNzKX1cbiAgICAgICAgICB2YWx1ZT17dGhpcy5zZWFyY2hUZXh0fVxuICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4ge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICBQcm9jZXNzZXNBY3Rpb25zLmZpbHRlcihbJ1BJRCcsICd1c2VyJywgJ25hbWUnXSwgZS50YXJnZXQudmFsdWUpXG4gICAgICAgICAgfX0gLz5cbiAgICAgIDwvRm9ybUdyb3VwPlxuICAgIClcbiAgfVxuXG4gIGdldCBzZWFyY2hUZXh0ICgpIHtcbiAgICBjb25zdCB7IGZpbHRlciB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IGZpbHRlclBJRCA9IGZpbHRlci5nZXQoJ1BJRCcpXG4gICAgY29uc3QgZmlsdGVyVXNlciA9IGZpbHRlci5nZXQoJ3VzZXInKVxuICAgIGNvbnN0IGZpbHRlck5hbWUgPSBmaWx0ZXIuZ2V0KCduYW1lJylcblxuICAgIGlmICh0eXBlb2YgZmlsdGVyTmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiYgZmlsdGVyTmFtZS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZmlsdGVyTmFtZVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpbHRlclVzZXIgIT09ICd1bmRlZmluZWQnICYmIGZpbHRlclVzZXIubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZpbHRlclVzZXJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBmaWx0ZXJQSUQgIT09ICd1bmRlZmluZWQnICYmIGZpbHRlclBJRC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZmlsdGVyUElEXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgfVxufVxuXG5Qcm9jZXNzZXNGaWx0ZXIucHJvcFR5cGVzID0ge1xuICBmaWx0ZXI6IFJlYWN0LlByb3BUeXBlcy5pbnN0YW5jZU9mKE1hcCkuaXNSZXF1aXJlZCxcbiAgaW50bDogUmVhY3QuUHJvcFR5cGVzLm9iamVjdFxufVxuXG5leHBvcnQgZGVmYXVsdCBpbmplY3RJbnRsKFByb2Nlc3Nlc0ZpbHRlcilcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGluamVjdEludGwgfSBmcm9tICdyZWFjdC1pbnRsJ1xuaW1wb3J0IGh1bWFuaXplIGZyb20gJ2h1bWFuaXplJ1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi4vLi4vY29tbW9uL2NvbXBvbmVudHMvQmFzZUNvbXBvbmVudCdcbmltcG9ydCB7IEFyZWFDaGFydCB9IGZyb20gJy4uLy4uL2NvbW1vbi9jb21wb25lbnRzL3JlYWN0LWNoYXJ0cydcblxuY2xhc3MgUHJvY2Vzc2VzR3JhcGhzIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgLy8gTWVzc2FnZXMgZGVmaW5pdGlvbnNcbiAgICB0aGlzLm1lc3NhZ2VzID0ge1xuICAgICAgY3B1OiB7XG4gICAgICAgIGlkOiAnY3B1JyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdDUFUnXG4gICAgICB9LFxuICAgICAgcmFtOiB7XG4gICAgICAgIGlkOiAncmFtJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdSQU0nXG4gICAgICB9LFxuICAgICAgdXNlZDoge1xuICAgICAgICBpZDogJ3VzZWQnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ1VzZWQnXG4gICAgICB9LFxuICAgICAgdG90YWw6IHtcbiAgICAgICAgaWQ6ICd0b3RhbCcsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnVG90YWwnXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGRhdGFDUFUsIGRhdGFSQU0sIHVzZWRDUFUsIHVzZWRSQU0sIHRvdGFsUkFNIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgZGVmaW5lTWVzc2FnZSA9IHRoaXMucHJvcHMuaW50bC5mb3JtYXRNZXNzYWdlXG5cbiAgICBjb25zdCBiYWNrZ3JvdW5kQ29sb3IgPSAncmdiKDQxLDE3MCwyMDQpJ1xuICAgIGNvbnN0IGNoYXJ0Q29sb3IgPSAncmdiKDI1NSwxODksMzApJ1xuICAgIGNvbnN0IGNoYXJ0U3R5bGUgPSB7XG4gICAgICBiYWNrZ3JvdW5kOiBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBib3JkZXJSYWRpdXM6ICc1cHgnXG4gICAgfVxuICAgIGNvbnN0IGNvbXBvbmVudFN0eWxlID0ge1xuICAgICAgaGVpZ2h0OiAnODBweCcsXG4gICAgICB2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJ1xuICAgIH1cblxuICAgIC8vIERvIG5vdCByZW5kZXIgdGhlIHZpZXchXG4gICAgaWYgKCFkYXRhQ1BVIHx8ICFkYXRhUkFNIHx8ICF0b3RhbFJBTSB8fFxuICAgICAgICBkYXRhQ1BVLmxlbmd0aCA8PSAwIHx8IGRhdGFSQU0ubGVuZ3RoIDw9IDApIHJldHVybiBudWxsXG5cbiAgICAvLyBEbyBub3QgcmVuZGVyIHRoZSB2aWV3IVxuICAgIGlmICh0eXBlb2YgdXNlZENQVSAhPT0gJ251bWJlcicgfHwgdHlwZW9mIHVzZWRSQU0gIT09ICdudW1iZXInKSByZXR1cm4gbnVsbFxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgaWQ9J3Byb2Nlc3Nlcy1ncmFwaHMnIHN0eWxlPXtjb21wb25lbnRTdHlsZX0gY2xhc3NOYW1lPSdoaWRkZW4teHMnPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93Jz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sLW1kLTQgdGV4dC1sZWZ0Jz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2wtbWQtNiB0ZXh0LWxlZnQnPlxuICAgICAgICAgICAgICA8aDQ+eyBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuY3B1KSB9PC9oND5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbC1tZC02IHRleHQtcmlnaHQnPlxuICAgICAgICAgICAgICA8aDM+eyB1c2VkQ1BVLnRvRml4ZWQoMikgKyAnJScgfTwvaDM+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sLW1kLTIgdGV4dC1jZW50ZXInPlxuICAgICAgICAgICAgPEFyZWFDaGFydFxuICAgICAgICAgICAgICBzdHlsZT17Y2hhcnRTdHlsZX1cbiAgICAgICAgICAgICAgZmlsbD17Y2hhcnRDb2xvcn1cbiAgICAgICAgICAgICAgc3Ryb2tlPXtjaGFydENvbG9yfVxuICAgICAgICAgICAgICB3aWR0aD17MTYwfVxuICAgICAgICAgICAgICBoZWlnaHQ9ezgwfVxuICAgICAgICAgICAgICBkYXRhPXtkYXRhQ1BVfSAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2wtbWQtMiB0ZXh0LWNlbnRlcic+XG4gICAgICAgICAgICA8QXJlYUNoYXJ0XG4gICAgICAgICAgICAgIHN0eWxlPXtjaGFydFN0eWxlfVxuICAgICAgICAgICAgICBmaWxsPXtjaGFydENvbG9yfVxuICAgICAgICAgICAgICBzdHJva2U9e2NoYXJ0Q29sb3J9XG4gICAgICAgICAgICAgIHdpZHRoPXsxNjB9XG4gICAgICAgICAgICAgIGhlaWdodD17ODB9XG4gICAgICAgICAgICAgIGRhdGE9e2RhdGFSQU19IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbC1tZC00IHRleHQtcmlnaHQnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbC1tZC04IHRleHQtbGVmdCc+XG4gICAgICAgICAgICAgIDxoNT5cbiAgICAgICAgICAgICAgICB7IGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy51c2VkKX1cbiAgICAgICAgICAgICAgICB7ICc6ICcgfVxuICAgICAgICAgICAgICAgIHsgaHVtYW5pemUuZmlsZXNpemUodXNlZFJBTSkgfVxuICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgICA8aDU+XG4gICAgICAgICAgICAgICAgeyBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMudG90YWwpfVxuICAgICAgICAgICAgICAgIHsgJzogJyB9XG4gICAgICAgICAgICAgICAgeyBodW1hbml6ZS5maWxlc2l6ZSh0b3RhbFJBTSkgfVxuICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sLW1kLTQgdGV4dC1yaWdodCc+XG4gICAgICAgICAgICAgIDxoND57IGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy5yYW0pIH08L2g0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59XG5cblByb2Nlc3Nlc0dyYXBocy5wcm9wVHlwZXMgPSB7XG4gIGRhdGFDUFU6IFJlYWN0LlByb3BUeXBlcy5hcnJheS5pc1JlcXVpcmVkLFxuICBkYXRhUkFNOiBSZWFjdC5Qcm9wVHlwZXMuYXJyYXkuaXNSZXF1aXJlZCxcbiAgdXNlZENQVTogUmVhY3QuUHJvcFR5cGVzLm51bWJlci5pc1JlcXVpcmVkLFxuICB1c2VkUkFNOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHRvdGFsUkFNOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIGxhc3RVcGRhdGU6IFJlYWN0LlByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgIFJlYWN0LlByb3BUeXBlcy5udW1iZXIsIFJlYWN0LlByb3BUeXBlcy5ib29sXG4gIF0pXG59XG5Qcm9jZXNzZXNHcmFwaHMuZGVmYXVsdFByb3BzID0ge1xuICBkYXRhQ1BVOiBbXSxcbiAgZGF0YVJBTTogW10sXG4gIHVzZWRDUFU6IDAsXG4gIHVzZWRSQU06IDAsXG4gIHRvdGFsUkFNOiAwLFxuICBsYXN0VXBkYXRlOiBmYWxzZVxufVxuXG5leHBvcnQgZGVmYXVsdCBpbmplY3RJbnRsKFByb2Nlc3Nlc0dyYXBocylcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCBMb2dnZXIgZnJvbSAnLi4vLi4vY29tbW9uL2xpYi9Mb2dnZXInXG5pbXBvcnQgUHJvY2Vzc2VzQWN0aW9ucyBmcm9tICcuLi9hY3Rpb25zJ1xuaW1wb3J0IFByb2Nlc3Nlc1N0b3JlIGZyb20gJy4uL3N0b3JlJ1xuaW1wb3J0IFByb2Nlc3MgZnJvbSAnLi4vUHJvY2VzcydcblxuLy8gQ29tcG9uZW50c1xuaW1wb3J0IFByb2Nlc3Nlc0ZpbHRlciBmcm9tICcuL2ZpbHRlcidcbmltcG9ydCBQcm9jZXNzZXNCdXR0b25zIGZyb20gJy4vYnV0dG9ucydcbmltcG9ydCBQcm9jZXNzZXNUYWJsZSBmcm9tICcuL3RhYmxlJ1xuaW1wb3J0IFByb2Nlc3Nlc0dyYXBocyBmcm9tICcuL2dyYXBocydcblxuY2xhc3MgUHJvY2Vzc2VzTWFpbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHN0YXRpYyBnZXRTdG9yZXMgKCkge1xuICAgIHJldHVybiBbUHJvY2Vzc2VzU3RvcmVdXG4gIH1cblxuICBzdGF0aWMgY2FsY3VsYXRlU3RhdGUgKHByZXZTdGF0ZSwgcHJvcHMpIHtcbiAgICBjb25zdCBzdGF0aWNMb2dnZXIgPSBuZXcgTG9nZ2VyKHsgc2VjdGlvbjogJ1Byb2Nlc3NlcyBtYWluIChzdGF0aWMpJyB9KVxuXG4gICAgLy8gLS0gUHJvY2VzcyB0aGUgcHJvY2Vzc2VzIC0tIC8vXG4gICAgbGV0IHByb2Nlc3Nlc1xuICAgIHRyeSB7XG4gICAgICBwcm9jZXNzZXMgPSBQcm9jZXNzZXNNYWluLmdldFByb2Nlc3NlZFByb2Nlc3NlcyhQcm9jZXNzZXNTdG9yZS5wcm9jZXNzZXMpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHN0YXRpY0xvZ2dlci5lcnJvcihlcnJvcilcbiAgICB9XG4gICAgLy8gLS0gUHJvY2VzcyB0aGUgcHJvY2Vzc2VzIC0tIC8vXG5cbiAgICAvLyAtLSBQcm9jZXNzIHRoZSBncmFwaCBkYXRhIC0tIC8vXG4gICAgbGV0IGNwdUdyYXBoRGF0YSA9IFtdXG4gICAgbGV0IHJhbUdyYXBoRGF0YSA9IFtdXG4gICAgY29uc3QgY3B1RGF0YSA9IHByb2Nlc3Nlcy5yZWR1Y2UoKHRvdGFsLCBwcm9jZXNzKSA9PiB0b3RhbCArIHByb2Nlc3MuQ1BVLCAwKVxuICAgIGxldCByYW1EYXRhID0gUHJvY2Vzc2VzU3RvcmUuc3lzdGVtSW5mby5hdmFpbGFibGVSQU0gfHwgMFxuICAgIGxldCB0b3RhbFJBTSA9IFByb2Nlc3Nlc1N0b3JlLnN5c3RlbUluZm8udG90YWxSQU0gfHwgMFxuICAgIHJhbURhdGEgPSB0b3RhbFJBTSA8IHJhbURhdGEgPyB0b3RhbFJBTSA6IHJhbURhdGFcblxuICAgIC8vIGJyYWNrZXQgc2NvcGVcbiAgICB7XG4gICAgICAvLyBUaGlzIHZhcmlhYmxlcyBkb2Vzbid0IGV4aXN0IG91dHNpZGUgdGhlIGJyYWNrZXRzXG4gICAgICBsZXQgbGFzdFVwZGF0ZSA9IFByb2Nlc3Nlc1N0b3JlLnByb2Nlc3Nlc0xhc3RVcGRhdGVcbiAgICAgIGxldCB1cGRhdGVQZXJpb2QgPSBQcm9jZXNzZXNTdG9yZS51cGRhdGVQZXJpb2QgfHwgNVxuICAgICAgbGV0IGdyYXBoUGVyaW9kID0gdXBkYXRlUGVyaW9kICogMjVcbiAgICAgICAgLy8gQ29udmVydCB0byAlXG4gICAgICBsZXQgcmFtRGF0YVBlciA9IHRvdGFsUkFNID8gKHJhbURhdGEgKiAxMDApIC8gdG90YWxSQU0gOiAwXG5cbiAgICAgIC8vIFRoZSBmaXJzdCB0aW1lIHRoZSBjb21wb25lbnQgaXMgcmVuZGVyZWQsIG5vIHJlcXVlc3QgZm9yIGRhdGEgaGFzIGJlZW4gcGVyZm9ybWVkXG4gICAgICBpZiAocHJldlN0YXRlKSB7XG4gICAgICAgIC8vIEZpcnN0IHByb2Nlc3NlcyBsaXN0IHJlY2VpdmVkIG9yIHJlY2VpdmVkIGEgbmV3IHZhbGlkIHByb2Nlc3NlcyBsaXN0XG4gICAgICAgIGlmICh0b3RhbFJBTSAmJiBsYXN0VXBkYXRlICE9PSBmYWxzZSAmJlxuICAgICAgICAgICAgKHByZXZTdGF0ZS5sYXN0VXBkYXRlID09PSBmYWxzZSB8fFxuICAgICAgICAgICAgICAocHJldlN0YXRlLmxhc3RVcGRhdGUgIT09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgbGFzdFVwZGF0ZSA+IHByZXZTdGF0ZS5sYXN0VXBkYXRlKSkpIHtcbiAgICAgICAgICAvLyBDb252ZXJ0IGxhc3RVcGRhdGUgYW5kIHVwZGF0ZVBlcmlvZCBmb20gbXMgdG8gc2Vjb25kc1xuICAgICAgICAgIGxhc3RVcGRhdGUgLz0gMTAwMFxuICAgICAgICAgIHVwZGF0ZVBlcmlvZCAvPSAxMDAwXG5cbiAgICAgICAgICBsZXQgc3RhcnRUaW1lc3RhbXAgPSBsYXN0VXBkYXRlIC0gKGdyYXBoUGVyaW9kICsgKHVwZGF0ZVBlcmlvZCAqIDIpKVxuXG4gICAgICAgICAgLy8gUmVtb3ZlIG9sZCBkYXRhLlxuICAgICAgICAgIC8vIEdpdmUgZXh0cmEgdGltZSBiZWZvcmUgdGhlIGluaXQgdGltZSBvZiB0aGUgZ3JhcGhcbiAgICAgICAgICAvLyAodHdvIHRpbWVzIHRoZSB1cGRhdGUgcGVyaW9kKVxuICAgICAgICAgIGlmIChwcmV2U3RhdGUuY3B1R3JhcGhEYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNwdUdyYXBoRGF0YSA9IHByZXZTdGF0ZS5jcHVHcmFwaERhdGEuZmlsdGVyKChwcm9jZXNzKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiAocHJvY2Vzcy54ID4gc3RhcnRUaW1lc3RhbXAgJiYgcHJvY2Vzcy54IDwgbGFzdFVwZGF0ZSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUHVzaCB0aGUgbGFzdCB2YWx1ZSBhbmQgZmlsbCB3aXRoIHplcm9zIHRoZSBwb3NzaWJsZSBwZXJpb2RcbiAgICAgICAgICAvLyBiZXR3ZWVuIHRoZSBmaXJzdCB2YWx1ZSBhbmQgdGhlIGluaXQgdGltZSBvZiB0aGUgZ3JhcGguXG4gICAgICAgICAgY3B1R3JhcGhEYXRhLnB1c2goeyB4OiBsYXN0VXBkYXRlLCB5OiBjcHVEYXRhIH0pXG4gICAgICAgICAgd2hpbGUgKGNwdUdyYXBoRGF0YVswXS54ID4gKGxhc3RVcGRhdGUgLSBncmFwaFBlcmlvZCkpIHtcbiAgICAgICAgICAgIGNwdUdyYXBoRGF0YS51bnNoaWZ0KHsgeDogKGNwdUdyYXBoRGF0YVswXS54IC0gdXBkYXRlUGVyaW9kKSwgeTogMCB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlbW92ZSBvbGQgZGF0YS5cbiAgICAgICAgICAvLyBHaXZlIGV4dHJhIHRpbWUgYmVmb3JlIHRoZSBpbml0IHRpbWUgb2YgdGhlIGdyYXBoXG4gICAgICAgICAgLy8gKHR3byB0aW1lcyB0aGUgdXBkYXRlIHBlcmlvZClcbiAgICAgICAgICBpZiAocHJldlN0YXRlLnJhbUdyYXBoRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByYW1HcmFwaERhdGEgPSBwcmV2U3RhdGUucmFtR3JhcGhEYXRhLmZpbHRlcigocHJvY2VzcykgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gKHByb2Nlc3MueCA+IHN0YXJ0VGltZXN0YW1wICYmIHByb2Nlc3MueCA8IGxhc3RVcGRhdGUpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFB1c2ggdGhlIGxhc3QgdmFsdWUgYW5kIGZpbGwgd2l0aCB6ZXJvcyB0aGUgcG9zc2libGUgcGVyaW9kXG4gICAgICAgICAgLy8gYmV0d2VlbiB0aGUgZmlyc3QgdmFsdWUgYW5kIHRoZSBpbml0IHRpbWUgb2YgdGhlIGdyYXBoLlxuICAgICAgICAgIHJhbUdyYXBoRGF0YS5wdXNoKHsgeDogbGFzdFVwZGF0ZSwgeTogcmFtRGF0YVBlciB9KVxuICAgICAgICAgIHdoaWxlIChyYW1HcmFwaERhdGFbMF0ueCA+IChsYXN0VXBkYXRlIC0gZ3JhcGhQZXJpb2QpKSB7XG4gICAgICAgICAgICByYW1HcmFwaERhdGEudW5zaGlmdCh7IHg6IChyYW1HcmFwaERhdGFbMF0ueCAtIHVwZGF0ZVBlcmlvZCksIHk6IDAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY3B1R3JhcGhEYXRhID0gcHJldlN0YXRlLmNwdUdyYXBoRGF0YVxuICAgICAgICAgIHJhbUdyYXBoRGF0YSA9IHByZXZTdGF0ZS5yYW1HcmFwaERhdGFcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3B1R3JhcGhEYXRhID0gdGhpcy5kZWZhdWx0R3JhcGhEYXRhKGdyYXBoUGVyaW9kLCB1cGRhdGVQZXJpb2QpXG4gICAgICAgIHJhbUdyYXBoRGF0YSA9IHRoaXMuZGVmYXVsdEdyYXBoRGF0YShncmFwaFBlcmlvZCwgdXBkYXRlUGVyaW9kKVxuICAgICAgfVxuICAgIH1cbiAgICAvLyAtLSBQcm9jZXNzIHRoZSBncmFwaCBkYXRhIC0tIC8vXG5cbiAgICByZXR1cm4ge1xuICAgICAgcHJvY2Vzc2VzOiBwcm9jZXNzZXMgfHwgW10sXG4gICAgICBjcHVHcmFwaERhdGE6IGNwdUdyYXBoRGF0YSxcbiAgICAgIHVzZWRDUFU6IGNwdURhdGEsXG4gICAgICByYW1HcmFwaERhdGE6IHJhbUdyYXBoRGF0YSxcbiAgICAgIHVzZWRSQU06IHJhbURhdGEsXG4gICAgICB0b3RhbFJBTTogUHJvY2Vzc2VzU3RvcmUuc3lzdGVtSW5mby50b3RhbFJBTSxcbiAgICAgIHNlbGVjdGVkUHJvY2VzczogUHJvY2Vzc2VzU3RvcmUuc2VsZWN0ZWRQcm9jZXNzLFxuICAgICAgbGFzdFVwZGF0ZTogUHJvY2Vzc2VzU3RvcmUucHJvY2Vzc2VzTGFzdFVwZGF0ZSxcbiAgICAgIHVwZGF0ZVBlcmlvZDogUHJvY2Vzc2VzU3RvcmUudXBkYXRlUGVyaW9kLFxuICAgICAgZmlsdGVyOiBQcm9jZXNzZXNTdG9yZS5maWx0ZXIsXG4gICAgICBvcmRlcjogUHJvY2Vzc2VzU3RvcmUub3JkZXJcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0UHJvY2Vzc2VkUHJvY2Vzc2VzIChwcm9jZXNzZXMpIHtcbiAgICAvLyBUZW1wXG4gICAgcHJvY2Vzc2VzID0gcHJvY2Vzc2VzXG4gICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICB2YXIgcmVzID0gUHJvY2Vzcy5zb3J0SGFuZGxlcignbmFtZScsICdBU0MnKShhLCBiKVxuICAgICAgICByZXR1cm4gKHJlcyA9PT0gMCkgPyBQcm9jZXNzLnNvcnRIYW5kbGVyKCdQSUQnLCAnQVNDJykoYSwgYikgOiByZXNcbiAgICAgIH0pXG5cbiAgICByZXR1cm4gcHJvY2Vzc2VzXG4gIH1cblxuICBzdGF0aWMgZ2V0RmlsdGVyZWRQcm9jZXNzZXMgKHByb2Nlc3Nlcykge1xuICAgIGNvbnN0IGZpbHRlciA9IFByb2Nlc3Nlc1N0b3JlLmZpbHRlclxuICAgIGNvbnN0IHBpZEZpbHRlciA9IGZpbHRlci5nZXQoJ1BJRCcpXG4gICAgY29uc3QgdXNlckZpbHRlciA9IGZpbHRlci5nZXQoJ3VzZXInKVxuICAgIGNvbnN0IG5hbWVGaWx0ZXIgPSBmaWx0ZXIuZ2V0KCduYW1lJylcblxuICAgIC8vIEVtcHR5IGZpbHRlclxuICAgIGlmICgoIXBpZEZpbHRlciB8fCBwaWRGaWx0ZXIubGVuZ3RoIDw9IDApICYmXG4gICAgICAgICghdXNlckZpbHRlciB8fCB1c2VyRmlsdGVyLmxlbmd0aCA8PSAwKSAmJlxuICAgICAgICAoIW5hbWVGaWx0ZXIgfHwgbmFtZUZpbHRlci5sZW5ndGggPD0gMCkpIHtcbiAgICAgIHJldHVybiBwcm9jZXNzZXNcbiAgICB9XG4gICAgLy8gRmlsdGVyIHByb2Nlc3Nlc1xuICAgIHJldHVybiBwcm9jZXNzZXMuZmlsdGVyKChwcm9jLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgY2hlY2tQSUQgPSAodHlwZW9mIHBpZEZpbHRlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgU3RyaW5nKHByb2MuUElEKS5pbmRleE9mKHBpZEZpbHRlcikgIT09IC0xKVxuICAgICAgY29uc3QgY2hlY2tVc2VyID0gKHR5cGVvZiB1c2VyRmlsdGVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICB1c2VyRmlsdGVyLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgcHJvYy51c2VyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZih1c2VyRmlsdGVyLnRvTG93ZXJDYXNlKCkpICE9PSAtMSlcbiAgICAgIGNvbnN0IGNoZWNrTmFtZSA9ICh0eXBlb2YgbmFtZUZpbHRlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgbmFtZUZpbHRlci5sZW5ndGggPiAwICYmXG4gICAgICAgIHByb2MubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YobmFtZUZpbHRlci50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpXG5cbiAgICAgIHJldHVybiAoY2hlY2tQSUQgfHwgY2hlY2tVc2VyIHx8IGNoZWNrTmFtZSlcbiAgICB9KVxuICB9XG5cbiAgc3RhdGljIGRlZmF1bHRHcmFwaERhdGEgKGdyYXBoUGVyaW9kLCB1cGRhdGVQZXJpb2QpIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpIC8gMTAwMFxuICAgIGxldCBjcHVHcmFwaERhdGEgPSBbXVxuICAgIGxldCBhdXhUaW1lc3RhbXAgPSB0aW1lc3RhbXAgLSAoZ3JhcGhQZXJpb2QgKyAodXBkYXRlUGVyaW9kICogMikpXG4gICAgd2hpbGUgKGF1eFRpbWVzdGFtcCA8IHRpbWVzdGFtcCkge1xuICAgICAgY3B1R3JhcGhEYXRhLnB1c2goeyB4OiBhdXhUaW1lc3RhbXAsIHk6IDAgfSlcbiAgICAgIGF1eFRpbWVzdGFtcCArPSB1cGRhdGVQZXJpb2RcbiAgICB9XG4gICAgY3B1R3JhcGhEYXRhLnB1c2goeyB4OiBhdXhUaW1lc3RhbXAsIHk6IDAgfSlcblxuICAgIHJldHVybiBjcHVHcmFwaERhdGFcbiAgfVxuXG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy5zdGFydFVwZGF0ZUludGVydmFsID0gdGhpcy5zdGFydFVwZGF0ZUludGVydmFsLmJpbmQodGhpcylcbiAgICB0aGlzLnN0b3BVcGRhdGVJbnRlcnZhbCA9IHRoaXMuc3RvcFVwZGF0ZUludGVydmFsLmJpbmQodGhpcylcbiAgfVxuXG4gIHN0YXJ0VXBkYXRlSW50ZXJ2YWwgKHBlcmlvZCkge1xuICAgIHRoaXMuc3RvcFVwZGF0ZUludGVydmFsKClcbiAgICBpZiAocGVyaW9kKSB7XG4gICAgICB0aGlzLl9fdXBkYXRlSW50ZXJ2YWxJRCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgUHJvY2Vzc2VzQWN0aW9ucy5yZXF1ZXN0TGlzdCgpXG4gICAgICB9LCBwZXJpb2QgKiAxMDAwKVxuICAgIH1cbiAgfVxuXG4gIHN0b3BVcGRhdGVJbnRlcnZhbCAoKSB7XG4gICAgaWYgKHRoaXMuX191cGRhdGVJbnRlcnZhbElEKSBjbGVhckludGVydmFsKHRoaXMuX191cGRhdGVJbnRlcnZhbElEKVxuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIC8vIEZldGNoIHRoZSBwcm9jZXNzZXMgYmVmb3JlIHJlbmRlcmluZ1xuICAgIGlmICh0aGlzLnN0YXRlLmxhc3RVcGRhdGUgPT09IGZhbHNlKSBQcm9jZXNzZXNBY3Rpb25zLnJlcXVlc3RMaXN0KClcbiAgICB0aGlzLnN0YXJ0VXBkYXRlSW50ZXJ2YWwodGhpcy5zdGF0ZS51cGRhdGVQZXJpb2QpXG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCAoKSB7XG4gICAgdGhpcy5zdG9wVXBkYXRlSW50ZXJ2YWwoKVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBzZWxlY3RlZFByb2Nlc3MsIGxhc3RVcGRhdGUsIHVwZGF0ZVBlcmlvZCwgcHJvY2Vzc2VzLFxuICAgICAgY3B1R3JhcGhEYXRhLCB1c2VkQ1BVLCByYW1HcmFwaERhdGEsIHVzZWRSQU0sIHRvdGFsUkFNLFxuICAgICAgZmlsdGVyXG4gICAgfSA9IHRoaXMuc3RhdGVcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0ncHJvY2Vzc3Nlcy1tYWluJz5cbiAgICAgICAgPFByb2Nlc3Nlc0ZpbHRlciBmaWx0ZXI9e2ZpbHRlcn0gLz5cbiAgICAgICAgPFByb2Nlc3Nlc0J1dHRvbnNcbiAgICAgICAgICBwcm9jZXNzPXtzZWxlY3RlZFByb2Nlc3N9XG4gICAgICAgICAgbGFzdFVwZGF0ZT17bGFzdFVwZGF0ZX1cbiAgICAgICAgICB1cGRhdGVQZXJpb2Q9e3VwZGF0ZVBlcmlvZH1cbiAgICAgICAgICBvblBlcmlvZENoYW5nZT17dGhpcy5zdGFydFVwZGF0ZUludGVydmFsfSAvPlxuICAgICAgICA8YnIgLz5cbiAgICAgICAgPFByb2Nlc3Nlc1RhYmxlXG4gICAgICAgICAgcHJvY2Vzc2VzPXtQcm9jZXNzZXNNYWluLmdldEZpbHRlcmVkUHJvY2Vzc2VzKHByb2Nlc3Nlcyl9XG4gICAgICAgICAgbGFzdFVwZGF0ZT17bGFzdFVwZGF0ZX0gLz5cbiAgICAgICAgPFByb2Nlc3Nlc0dyYXBoc1xuICAgICAgICAgIGRhdGFDUFU9e2NwdUdyYXBoRGF0YX1cbiAgICAgICAgICB1c2VkQ1BVPXt1c2VkQ1BVfVxuICAgICAgICAgIGRhdGFSQU09e3JhbUdyYXBoRGF0YX1cbiAgICAgICAgICB1c2VkUkFNPXt1c2VkUkFNfVxuICAgICAgICAgIHRvdGFsUkFNPXt0b3RhbFJBTX1cbiAgICAgICAgICBsYXN0VXBkYXRlPXtsYXN0VXBkYXRlfSAvPlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59XG5cblByb2Nlc3Nlc01haW4ucHJvcFR5cGVzID0ge1xuICBwcm9jZXNzZXM6IFJlYWN0LlByb3BUeXBlcy5hcnJheU9mKFJlYWN0LlByb3BUeXBlcy5pbnN0YW5jZU9mKFByb2Nlc3MpKSxcbiAgbGFzdFVwZGF0ZTogUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgdXBkYXRlUGVyaW9kOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICBmaWx0ZXI6IFJlYWN0LlByb3BUeXBlcy5pbnN0YW5jZU9mKE1hcCksXG4gIG9yZGVyOiBSZWFjdC5Qcm9wVHlwZXMuaW5zdGFuY2VPZihNYXApXG59XG5cbmV4cG9ydCBkZWZhdWx0IFByb2Nlc3Nlc01haW5cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEFsZXJ0IH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuaW1wb3J0IHsgaW5qZWN0SW50bCB9IGZyb20gJ3JlYWN0LWludGwnXG5pbXBvcnQgaHVtYW5pemUgZnJvbSAnaHVtYW5pemUnXG5pbXBvcnQgUHJvY2VzcyBmcm9tICcuLi9Qcm9jZXNzJ1xuaW1wb3J0IFByb2Nlc3Nlc0FjdGlvbnMgZnJvbSAnLi4vYWN0aW9ucydcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4uLy4uL2NvbW1vbi9jb21wb25lbnRzL0Jhc2VDb21wb25lbnQnXG5pbXBvcnQgRGF0YVRhYmxlLCB7IERhdGFDb2x1bW4gfSBmcm9tICcuLi8uLi9jb21tb24vY29tcG9uZW50cy9kYXRhLXRhYmxlJ1xuXG5jbGFzcyBQcm9jZXNzZXNUYWJsZSBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcbiAgICB0aGlzLnN0YXRlID0geyBoZWlnaHQ6IHRoaXMucHJvcHMuaGVpZ2h0IHx8IDAgfVxuICAgIHRoaXMuX2JpbmQoJ19faGFuZGxlUmVzaXplJylcblxuICAgIC8vIE1lc3NhZ2VzIGRlZmluaXRpb25zXG4gICAgdGhpcy5tZXNzYWdlcyA9IHtcbiAgICAgIHBpZDoge1xuICAgICAgICBpZDogJ3BpZCcsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnUElEJ1xuICAgICAgfSxcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgaWQ6ICd1c2VyJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdVc2VyJ1xuICAgICAgfSxcbiAgICAgIG5hbWU6IHtcbiAgICAgICAgaWQ6ICduYW1lJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdOYW1lJ1xuICAgICAgfSxcbiAgICAgIGNwdToge1xuICAgICAgICBpZDogJ2NwdScsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnQ1BVJ1xuICAgICAgfSxcbiAgICAgIHJhbToge1xuICAgICAgICBpZDogJ3JhbScsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnUkFNJ1xuICAgICAgfSxcbiAgICAgIGxvYWRpbmdEb3RzOiB7XG4gICAgICAgIGlkOiAnbG9hZGluZ0RvdHMnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0xvYWRpbmcuLi4nXG4gICAgICB9LFxuICAgICAgdGhlcmVBcmVOb1Byb2Nlc3Nlczoge1xuICAgICAgICBpZDogJ3RoZXJlQXJlTm9Qcm9jZXNzZXMnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZXJlIGFyZSBubyBwcm9jZXNzZXMnXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX19oYW5kbGVSZXNpemUgKGV2ZW50KSB7XG4gICAgY29uc3QgaGVpZ2h0V2luZG93ID0gTnVtYmVyLmlzTmFOKHdpbmRvdy5pbm5lckhlaWdodClcbiAgICAgID8gd2luZG93LmNsaWVudEhlaWdodFxuICAgICAgOiB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgICBjb25zdCB0aGlzVGFibGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvY2Vzc2VzLXRhYmxlJylcbiAgICBjb25zdCBoZWlnaHRQcm9jQnV0dG9ucyA9IHRoaXNUYWJsZSA/IHRoaXNUYWJsZS5vZmZzZXRUb3AgOiAwXG4gICAgY29uc3QgZ3JhcGhzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Byb2Nlc3Nlcy1ncmFwaHMnKVxuICAgIGNvbnN0IGhlaWdodEdyYXBocyA9IGdyYXBocyA/IGdyYXBocy5vZmZzZXRIZWlnaHQgOiA4MCAvLyBVZ2x5IGFuZCBhd2Z1bCBoYWNrXG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGhlaWdodDogaGVpZ2h0V2luZG93XG4gICAgICAgID8gKGhlaWdodFdpbmRvdyAtIGhlaWdodFByb2NCdXR0b25zIC0gaGVpZ2h0R3JhcGhzIC0gMjApXG4gICAgICAgIDogMFxuICAgIH0pXG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgdGhpcy5fX2hhbmRsZVJlc2l6ZSgpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX19oYW5kbGVSZXNpemUpXG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCAoKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX19oYW5kbGVSZXNpemUpXG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZVxuICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IGRlZmluZU1lc3NhZ2UgPSB0aGlzLnByb3BzLmludGwuZm9ybWF0TWVzc2FnZVxuXG4gICAgY29uc3QgcGlkQ29sID0gbmV3IERhdGFDb2x1bW4oe1xuICAgICAgZGF0YUtleTogJ1BJRCcsXG4gICAgICBuYW1lOiBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMucGlkKSxcbiAgICAgIGFsaWduOiAnbGVmdCcsXG4gICAgICB3aWR0aDogJzgwcHgnLFxuICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICBoaWRkZW46IGZhbHNlLFxuICAgICAgc29ydFByb3BzOiB7XG4gICAgICAgIHR5cGU6ICdudW1iZXInXG4gICAgICB9XG4gICAgfSlcbiAgICBjb25zdCB1c2VyQ29sID0gbmV3IERhdGFDb2x1bW4oe1xuICAgICAgZGF0YUtleTogJ3VzZXInLFxuICAgICAgbmFtZTogZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLnVzZXIpLFxuICAgICAgYWxpZ246ICdsZWZ0JyxcbiAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgc29ydFByb3BzOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnXG4gICAgICB9XG4gICAgfSlcbiAgICBjb25zdCBuYW1lQ29sID0gbmV3IERhdGFDb2x1bW4oe1xuICAgICAgZGF0YUtleTogJ25hbWUnLFxuICAgICAgbmFtZTogZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLm5hbWUpLFxuICAgICAgYWxpZ246ICdsZWZ0JyxcbiAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgc29ydFByb3BzOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnXG4gICAgICB9XG4gICAgfSlcbiAgICBjb25zdCBjcHVDb2wgPSBuZXcgRGF0YUNvbHVtbih7XG4gICAgICBkYXRhS2V5OiAnQ1BVJyxcbiAgICAgIG5hbWU6IGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy5jcHUpLFxuICAgICAgYWxpZ246ICdyaWdodCcsXG4gICAgICB3aWR0aDogJzcwcHgnLFxuICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICBzb3J0UHJvcHM6IHtcbiAgICAgICAgdHlwZTogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICBjZWxsRm9ybWF0dGVyOiAoY2VsbCkgPT4gY2VsbCArICclJ1xuICAgIH0pXG4gICAgY29uc3QgbWVtQ29sID0gbmV3IERhdGFDb2x1bW4oe1xuICAgICAgZGF0YUtleTogJ1JBTScsXG4gICAgICBuYW1lOiBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMucmFtKSxcbiAgICAgIGFsaWduOiAncmlnaHQnLFxuICAgICAgd2lkdGg6ICcxMDBweCcsXG4gICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIHNvcnRQcm9wczoge1xuICAgICAgICB0eXBlOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIGNlbGxGb3JtYXR0ZXI6IChjZWxsKSA9PiBodW1hbml6ZS5maWxlc2l6ZShjZWxsKVxuICAgIH0pXG5cbiAgICBjb25zdCBvblJvd1NlbGVjdGVkID0gKGlkZW50aWZpZXIsIHJvd0RhdGEpID0+IFByb2Nlc3Nlc0FjdGlvbnMuc2VsZWN0KHJvd0RhdGEuUElELCByb3dEYXRhLm5hbWUpXG4gICAgY29uc3Qgb25Sb3dVbnNlbGVjdGVkID0gKGlkZW50aWZpZXIsIHJvd0RhdGEpID0+IFByb2Nlc3Nlc0FjdGlvbnMuY2xlYW5TZWxlY3RlZCgpXG5cbiAgICBsZXQgY29tcG9uZW50U3R5bGUgPSB7fVxuICAgIGlmIChzdGF0ZS5oZWlnaHQpIHtcbiAgICAgIGNvbXBvbmVudFN0eWxlLmhlaWdodCA9IHN0YXRlLmhlaWdodCArICdweCdcbiAgICAgIGNvbXBvbmVudFN0eWxlLm92ZXJmbG93ID0gJ2F1dG8nXG4gICAgICBjb21wb25lbnRTdHlsZS5tYXJnaW5Cb3R0b20gPSAnMTBweCdcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBpZD0ncHJvY2Vzc2VzLXRhYmxlJyBzdHlsZT17Y29tcG9uZW50U3R5bGV9PlxuICAgICAgICB7ICFwcm9wcy5sYXN0VXBkYXRlICYmXG4gICAgICAgICAgPEFsZXJ0IGJzU3R5bGU9J2luZm8nPlxuICAgICAgICAgICAgeyBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMubG9hZGluZ0RvdHMpIH1cbiAgICAgICAgICA8L0FsZXJ0PlxuICAgICAgICB9XG4gICAgICAgIHsgcHJvcHMubGFzdFVwZGF0ZSAmJiBwcm9wcy5wcm9jZXNzZXMubGVuZ3RoIDw9IDAgJiZcbiAgICAgICAgICA8QWxlcnQgYnNTdHlsZT0nZGFuZ2VyJz5cbiAgICAgICAgICAgIHsgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLnRoZXJlQXJlTm9Qcm9jZXNzZXMpIH1cbiAgICAgICAgICA8L0FsZXJ0PlxuICAgICAgICB9XG4gICAgICAgIHsgcHJvcHMubGFzdFVwZGF0ZSAmJiBwcm9wcy5wcm9jZXNzZXMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIDxEYXRhVGFibGVcbiAgICAgICAgICAgIGtleVZhbHVlPSdQSUQnXG4gICAgICAgICAgICBjb2x1bW5zPXtbcGlkQ29sLCB1c2VyQ29sLCBuYW1lQ29sLCBjcHVDb2wsIG1lbUNvbF19XG4gICAgICAgICAgICBkYXRhPXtwcm9wcy5wcm9jZXNzZXN9XG4gICAgICAgICAgICBvblJvd1NlbGVjdGVkPXtwcm9wcy5vblJvd1NlbGVjdGVkIHx8IG9uUm93U2VsZWN0ZWR9XG4gICAgICAgICAgICBvblJvd1Vuc2VsZWN0ZWQ9e3Byb3BzLm9uUm93VW5zZWxlY3RlZCB8fCBvblJvd1Vuc2VsZWN0ZWR9XG4gICAgICAgICAgICBib3JkZXJlZCBob3ZlciByZXNwb25zaXZlIHN0cmlwZWQgY29uZGVuc2VkIC8+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxufVxuXG5Qcm9jZXNzZXNUYWJsZS5wcm9wVHlwZXMgPSB7XG4gIHByb2Nlc3NlczogUmVhY3QuUHJvcFR5cGVzLmFycmF5T2YoUmVhY3QuUHJvcFR5cGVzLmluc3RhbmNlT2YoUHJvY2VzcykpLFxuICBsYXN0VXBkYXRlOiBSZWFjdC5Qcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLCBSZWFjdC5Qcm9wVHlwZXMuYm9vbFxuICBdKSxcbiAgb25Sb3dTZWxlY3RlZDogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIG9uUm93VW5zZWxlY3RlZDogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGludGw6IFJlYWN0LlByb3BUeXBlcy5vYmplY3Rcbn1cblByb2Nlc3Nlc1RhYmxlLmRlZmF1bHRQcm9wcyA9IHtcbiAgcHJvY2Vzc2VzOiBbXSxcbiAgbGFzdFVwZGF0ZTogZmFsc2UsXG4gIGhlaWdodDogMFxufVxuXG5leHBvcnQgZGVmYXVsdCBpbmplY3RJbnRsKFByb2Nlc3Nlc1RhYmxlKVxuIiwiLy8gc3JjL3Byb2Nlc3Nlcy1tYW5hZ2VyL2NvbnN0YW50cy9pbmRleC5qc1xuXG5jb25zdCBQcm9jZXNzZXNDb25zdGFudHMgPSB7XG4gIElOSVRfUFJPQ0VTU0VTX1NUT1JFOiAnaW5pdC1wcm9jZXNzZXMtc3RvcmUnLFxuICBGSUxURVJfUFJPQ0VTU0VTOiAnZmlsdGVyLXByb2Nlc3NlcycsXG4gIFNPUlRfUFJPQ0VTU0VTOiAnc29ydC1wcm9jZXNzZXMnLFxuICBGRVRDSF9QUk9DRVNTRVM6ICdmZXRjaC1wcm9jZXNzZXMnLFxuICBTRUxFQ1RfUFJPQ0VTUzogJ3NlbGVjdC1wcm9jZXNzJyxcbiAgQ0xFQU5fU0VMRUNURURfUFJPQ0VTUzogJ2NsZWFuLXNlbGVjdGVkLXByb2Nlc3MnLFxuICBTVE9QX1BST0NFU1M6ICdzdG9wLXByb2Nlc3MnLFxuICBSRU1PVkVfUFJPQ0VTUzogJ3JlbW92ZS1wcm9jZXNzJyxcbiAgQUREX1RPX1NUT1BQSU5HOiAnYWRkLXByb2Nlc3MtdG8tc3RvcHBpbmcnLFxuICBSRU1PVkVfRlJPTV9TVE9QUElORzogJ3JlbW92ZS1wcm9jZXNzLWZyb20tc3RvcHBpbmcnLFxuICBDSEFOR0VfUEVSSU9EOiAncHJvY2Vzc2VzLWNoYW5nZS1wZXJpb2QnXG59XG5cbmV4cG9ydCBkZWZhdWx0IFByb2Nlc3Nlc0NvbnN0YW50c1xuIiwiLy8gc3JjL3Byb2Nlc3Nlcy1tYW5hZ2VyL3N0b3Jlcy9pbmRleC5qc1xuXG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ2ZsdXgvdXRpbHMnXG5pbXBvcnQgQXBwRGlzcGF0Y2hlciBmcm9tICcuLi8uLi9kaXNwYXRjaGVyJ1xuaW1wb3J0IExvZ2dlciBmcm9tICcuLi8uLi9jb21tb24vbGliL0xvZ2dlcidcblxuaW1wb3J0IFByb2Nlc3Nlc0NvbnN0YW50cyBmcm9tICcuLi9jb25zdGFudHMnXG5pbXBvcnQgUHJvY2VzcyBmcm9tICcuLi9Qcm9jZXNzJ1xuXG52YXIgbG9nZ2VyID0gbmV3IExvZ2dlcih7IHNlY3Rpb246ICdQcm9jZXNzZXMgc3RvcmUnIH0pXG5cbmNsYXNzIFByb2Nlc3Nlc1N0b3JlIGV4dGVuZHMgU3RvcmUge1xuICBjb25zdHJ1Y3RvciAoZGlzcGF0Y2hlcikge1xuICAgIHN1cGVyKGRpc3BhdGNoZXIpXG5cbiAgICB0aGlzLmluaXRpYWxpemUoKVxuICB9XG5cbiAgaW5pdGlhbGl6ZSAoKSB7XG4gICAgLy8gUHJvY2Vzc2VzIGxpc3RcbiAgICB0aGlzLl9fcHJvY2Vzc2VzID0gbmV3IE1hcCgpXG4gICAgLy8gTGFzdCB1cGRhdGUgb2YgcHJvY2Vzc2VzIGxpc3RcbiAgICB0aGlzLl9fcHJvY2Vzc2VzTGFzdFVwZGF0ZSA9IGZhbHNlXG4gICAgLy8gU2VsZWN0ZWQgcHJvY2Vzc1xuICAgIHRoaXMuX19jbGVhblNlbGVjdGVkUHJvY2VzcygpXG4gICAgLy8gU3RvcHBpbmcgcHJvY2Vzc2VzXG4gICAgdGhpcy5fX2NsZWFuU3RvcHBpbmdQcm9jZXNzZXMoKVxuICAgIC8vIFN5c3RlbSBpbmZvXG4gICAgdGhpcy5fX3N5c3RlbUluZm8gPSB7fVxuICAgIC8vIFByb2Nlc3MgZmlsdGVyXG4gICAgdGhpcy5fX2NsZWFuRmlsdGVyKClcbiAgICAvLyBQcm9jZXNzIG9yZGVyXG4gICAgdGhpcy5fX2NsZWFuT3JkZXIoKVxuICAgIC8vIFN0YXJ0IHNvcnRpbmcgYnkgbmFtZVxuICAgIHRoaXMuX19vcmRlci5zZXQoJ25hbWUnLCAnQVNDJylcbiAgICAvLyBEZWZhdWx0IHVwZGF0ZSBwZXJpb2RcbiAgICB0aGlzLl9fdXBkYXRlUGVyaW9kID0gNSAvLyBEZWZhdWx0XG4gIH1cblxuICB2YWxpZGF0ZVByb2Nlc3NJZGVudGlmaWVyIChQSUQsIG5hbWUpIHtcbiAgICB2YXIgcmVzdWx0ID0gdHJ1ZVxuICAgIHZhciBtZXNzYWdlID0gJydcbiAgICB2YXIgZXJyb3IgPSBudWxsXG5cbiAgICBpZiAodHlwZW9mIFBJRCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHJlc3VsdCA9IGZhbHNlXG4gICAgICBtZXNzYWdlID0gJ1RoZSBwcm9jZXNzIFBJRCBzaG91bGQgYmUgYSBudW1iZXInXG4gICAgICBlcnJvciA9IG5ldyBUeXBlRXJyb3IobWVzc2FnZSlcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgcmVzdWx0ID0gZmFsc2VcbiAgICAgIG1lc3NhZ2UgPSAnVGhlIHByb2Nlc3MgbmFtZSBzaG91bGQgYmUgYSBzdHJpbmcnXG4gICAgICBlcnJvciA9IG5ldyBUeXBlRXJyb3IobWVzc2FnZSlcbiAgICB9XG5cbiAgICByZXR1cm4geyByZXN1bHQsIG1lc3NhZ2UsIGVycm9yIH1cbiAgfVxuXG4gIC8vIC0tIEdldHRlcnMgLS0gLy9cblxuICBwcm9jZXNzIChQSUQsIG5hbWUpIHtcbiAgICB2YXIgeyBlcnJvciB9ID0gdGhpcy52YWxpZGF0ZVByb2Nlc3NJZGVudGlmaWVyKFBJRCwgbmFtZSlcbiAgICBpZiAoZXJyb3IpIHRocm93IGVycm9yXG5cbiAgICByZXR1cm4gdGhpcy5fX3Byb2Nlc3Nlcy5nZXQoUHJvY2Vzcy5pZGVudGlmaWVyKFBJRCwgbmFtZSkpXG4gIH1cblxuICBnZXQgcHJvY2Vzc2VzICgpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX19wcm9jZXNzZXMudmFsdWVzKCldXG4gIH1cblxuICBnZXQgcHJvY2Vzc2VzTGFzdFVwZGF0ZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19wcm9jZXNzZXNMYXN0VXBkYXRlXG4gIH1cblxuICBnZXQgc2VsZWN0ZWRQcm9jZXNzICgpIHtcbiAgICB2YXIgcHJvY2VzcyA9IHRoaXMuX19zZWxlY3RlZFByb2Nlc3NcbiAgICBpZiAodHlwZW9mIChwcm9jZXNzLlBJRCkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICB0eXBlb2YgKHByb2Nlc3MubmFtZSkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBBZGQgdGhlIHN0b3BwaW5nIHByb3BlcnR5XG4gICAgICBwcm9jZXNzLnN0b3BwaW5nID0gdGhpcy5pc1Byb2Nlc3NTdG9wcGluZyhwcm9jZXNzLlBJRCwgcHJvY2Vzcy5uYW1lKVxuICAgIH1cblxuICAgIHJldHVybiBwcm9jZXNzXG4gIH1cblxuICBpc1Byb2Nlc3NTdG9wcGluZyAoUElELCBuYW1lKSB7XG4gICAgdmFyIHsgZXJyb3IgfSA9IHRoaXMudmFsaWRhdGVQcm9jZXNzSWRlbnRpZmllcihQSUQsIG5hbWUpXG4gICAgaWYgKGVycm9yKSB0aHJvdyBlcnJvclxuXG4gICAgdmFyIGlkZW50aWZpZXIgPSBQcm9jZXNzLmlkZW50aWZpZXIoUElELCBuYW1lKVxuXG4gICAgcmV0dXJuICh0aGlzLl9fcHJvY2Vzc2VzLmhhcyhpZGVudGlmaWVyKSAmJlxuICAgICAgICAgICAgdGhpcy5fX3Byb2Nlc3Nlc1N0b3BwaW5nLmluZGV4T2YoaWRlbnRpZmllcikgIT09IC0xKVxuICB9XG5cbiAgZ2V0IHN5c3RlbUluZm8gKCkge1xuICAgIHJldHVybiB0aGlzLl9fc3lzdGVtSW5mb1xuICB9XG5cbiAgZ2V0IGZpbHRlciAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19maWx0ZXJcbiAgfVxuXG4gIGdldCBvcmRlciAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19vcmRlclxuICB9XG5cbiAgZ2V0IHVwZGF0ZVBlcmlvZCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX191cGRhdGVQZXJpb2RcbiAgfVxuXG4gIC8vIC0tIFNldHRlcnMgKFByaXZhdGUpIC0tIC8vXG5cbiAgLypcbiAgICogVGhlIHByb2Nlc3NlcyBwYXJhbWV0ZXIgYWNjZXB0IGFuIGFycmF5IG9mIFByb2Nlc3Mgb2JqZWN0c1xuICAgKiBvciBhbnkgaXRlcmFibGUgb2YganMgb2JqZWN0cy4gSWYgdGhlIGlkZW50aWZpZXIgcHJvcGVydHlcbiAgICogZG9udCBleGlzdCBpbiB0aGUganMgb2JqZWN0LCB0aGVpciBrZXkgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgX19zZXRQcm9jZXNzZXMgKHByb2Nlc3Nlcykge1xuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mIHByb2Nlc3NlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHByb2Nlc3NlcyBzb3VyY2UgaXMgZW1wdHknKVxuICAgICAgfVxuICAgICAgdGhpcy5fX2NsZWFyUHJvY2Vzc2VzKClcbiAgICAgIHRoaXMuX19hZGRQcm9jZXNzZXMocHJvY2Vzc2VzKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBQcm9wYWdhdGUgZXJyb3JcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLypcbiAgICogVGhlIHByb2Nlc3NlcyBwYXJhbWV0ZXIgYWNjZXB0IGFuIGFycmF5IG9mIFByb2Nlc3Mgb2JqZWN0c1xuICAgKiBvciBhbnkgaXRlcmFibGUgb2YganMgb2JqZWN0cy4gSWYgdGhlIG5hbWUgcHJvcGVydHlcbiAgICogZG9uJ3QgZXhpc3QgaW4gdGhlIGpzIG9iamVjdCwgdGhlaXIga2V5IHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIF9fYWRkUHJvY2Vzc2VzIChwcm9jZXNzZXMpIHtcbiAgICBpZiAodHlwZW9mIHByb2Nlc3NlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBwcm9jZXNzZXMgc291cmNlIGlzIGVtcHR5JylcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gJ3Byb2Nlc3Nlcycgc2hvdWxkIGJlIGl0ZXJhYmxlXG4gICAgICBsZXQgcHJvY2Vzc2VzSXRlcmFibGVcblxuICAgICAgLy8gSXRlcmFibGVcbiAgICAgIGlmICh0eXBlb2YgcHJvY2Vzc2VzW1N5bWJvbC5pdGVyYXRvcl0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHByb2Nlc3Nlc0l0ZXJhYmxlID0gcHJvY2Vzc2VzXG4gICAgICAvLyBOb3QgaXRlcmFibGVcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHByb2Nlc3NlcyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gR2V0IGFuIGl0ZXJhYmxlIG9iamVjdCBmcm9tIHRoZSBwbGFpbiBqcyBvYmplY3RcbiAgICAgICAgcHJvY2Vzc2VzSXRlcmFibGUgPSBuZXcgTWFwKClcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHByb2Nlc3Nlcykge1xuICAgICAgICAgIHByb2Nlc3Nlc0l0ZXJhYmxlLnNldChrZXksIHByb2Nlc3Nlc1trZXldKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgcHJvY2Vzc2VzSXRlcmFibGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBwcm9jZXNzZXMgc291cmNlIGlzIG5vdCBpdGVyYWJsZScpXG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IFtrZXksIHByb2Nlc3NdIG9mIHByb2Nlc3Nlc0l0ZXJhYmxlKSB7XG4gICAgICAgIC8vIGlkZW50aWZpZXIgY2hlY2tcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzLlBJRCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB2YXIgUElEID0gTnVtYmVyLnBhcnNlSW50KGtleSlcbiAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihQSUQpKSB7XG4gICAgICAgICAgICBwcm9jZXNzLlBJRCA9IFBJRFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDT05TT0xFIFRSQUNFXG4gICAgICAgICAgICBsb2dnZXIud2FybmluZygnVGhlIGVsZW1lbnQgaXMgbm90IHdlbGwgZm9ybWVkIGFuZCBjYW5ub3QgYmUgaW50cm9kdWNlZCcsIHByb2Nlc3MpXG4gICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX19hZGRQcm9jZXNzKHByb2Nlc3MpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFByb3BhZ2F0ZSBlcnJvclxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICBfX2NsZWFyUHJvY2VzcyAoUElELCBuYW1lKSB7XG4gICAgY29uc3QgeyBlcnJvciB9ID0gdGhpcy52YWxpZGF0ZVByb2Nlc3NJZGVudGlmaWVyKFBJRCwgbmFtZSlcbiAgICBpZiAoZXJyb3IpIHRocm93IGVycm9yXG5cbiAgICB0aGlzLl9fcHJvY2Vzc2VzLmRlbGV0ZShQcm9jZXNzLmlkZW50aWZpZXIoUElELCBuYW1lKSlcbiAgfVxuXG4gIF9fY2xlYXJQcm9jZXNzZXMgKCkge1xuICAgIGlmICh0aGlzLl9fcHJvY2Vzc2VzLnNpemUgPiAwKSB0aGlzLl9fcHJvY2Vzc2VzLmNsZWFyKClcbiAgfVxuXG4gIF9fYWRkUHJvY2VzcyAocHJvY2Vzcykge1xuICAgIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBwcm9jZXNzIHNvdXJjZSBpcyBlbXB0eScpXG4gICAgfVxuICAgIGNvbnN0IHsgZXJyb3IgfSA9IHRoaXMudmFsaWRhdGVQcm9jZXNzSWRlbnRpZmllcihwcm9jZXNzLlBJRCwgcHJvY2Vzcy5uYW1lKVxuICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3JcblxuICAgIHRyeSB7XG4gICAgICBpZiAocHJvY2VzcyBpbnN0YW5jZW9mIFByb2Nlc3MpIHtcbiAgICAgICAgdGhpcy5fX3Byb2Nlc3Nlcy5zZXQoUHJvY2Vzcy5pZGVudGlmaWVyKHByb2Nlc3MuUElELCBwcm9jZXNzLm5hbWUpLCBwcm9jZXNzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fX3Byb2Nlc3Nlcy5zZXQoUHJvY2Vzcy5pZGVudGlmaWVyKHByb2Nlc3MuUElELCBwcm9jZXNzLm5hbWUpLCBuZXcgUHJvY2Vzcyhwcm9jZXNzKSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gUHJvcGFnYXRlIGVycm9yXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIF9fc2V0U2VsZWN0ZWRQcm9jZXNzIChQSUQsIG5hbWUpIHtcbiAgICBjb25zdCB7IGVycm9yIH0gPSB0aGlzLnZhbGlkYXRlUHJvY2Vzc0lkZW50aWZpZXIoUElELCBuYW1lKVxuICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3JcblxuICAgIHRoaXMuX19zZWxlY3RlZFByb2Nlc3MgPSBuZXcgUHJvY2Vzcyh7IFBJRCwgbmFtZSB9KVxuICB9XG5cbiAgX19jbGVhblNlbGVjdGVkUHJvY2VzcyAoKSB7XG4gICAgdGhpcy5fX3NlbGVjdGVkUHJvY2VzcyA9ICcnXG4gIH1cblxuICBfX2FkZFRvU3RvcHBpbmdQcm9jZXNzZXMgKFBJRCwgbmFtZSkge1xuICAgIHZhciB7IGVycm9yIH0gPSB0aGlzLnZhbGlkYXRlUHJvY2Vzc0lkZW50aWZpZXIoUElELCBuYW1lKVxuICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3JcblxuICAgIGNvbnN0IGlkZW50aWZpZXIgPSBQcm9jZXNzLmlkZW50aWZpZXIoUElELCBuYW1lKVxuXG4gICAgaWYgKHRoaXMuX19wcm9jZXNzZXMuaGFzKGlkZW50aWZpZXIpICYmXG4gICAgICAgICF0aGlzLl9fcHJvY2Vzc2VzU3RvcHBpbmcuaW5kZXhPZihpZGVudGlmaWVyKSAhPT0gLTEpIHtcbiAgICAgIHRoaXMuX19wcm9jZXNzZXNTdG9wcGluZy5wdXNoKGlkZW50aWZpZXIpXG4gICAgfVxuICB9XG5cbiAgX19yZW1vdmVGcm9tU3RvcHBpbmdQcm9jZXNzZXMgKFBJRCwgbmFtZSkge1xuICAgIHZhciB7IGVycm9yIH0gPSB0aGlzLnZhbGlkYXRlUHJvY2Vzc0lkZW50aWZpZXIoUElELCBuYW1lKVxuICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3JcblxuICAgIHZhciBpZGVudGlmaWVyID0gUHJvY2Vzcy5pZGVudGlmaWVyKFBJRCwgbmFtZSlcbiAgICB2YXIgaW5kZXggPSB0aGlzLl9fcHJvY2Vzc2VzU3RvcHBpbmcuaW5kZXhPZihpZGVudGlmaWVyKVxuXG4gICAgaWYgKGluZGV4ID4gLTEpIHRoaXMuX19zZXJ2aWNlc1VwZGF0aW5nLnNwbGljZShpbmRleCwgMSlcbiAgfVxuXG4gIF9fdXBkYXRlU3RvcHBpbmdQcm9jZXNzZXMgKCkge1xuICAgIHRoaXMuX19wcm9jZXNzZXNTdG9wcGluZy5maWx0ZXIoKGlkZW50aWZpZXIpID0+IHRoaXMuX19wcm9jZXNzZXMuaGFzKGlkZW50aWZpZXIpKVxuICB9XG5cbiAgX19jbGVhblN0b3BwaW5nUHJvY2Vzc2VzICgpIHtcbiAgICB0aGlzLl9fcHJvY2Vzc2VzU3RvcHBpbmcgPSBbXVxuICB9XG5cbiAgX19zZXRGaWx0ZXIgKHByb3AsIGZpbHRlcikge1xuICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvcC5sZW5ndGggPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGZpbHRlciBpdGVtIGlzIGVtcHR5JylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZmlsdGVyIGlzIG5vdCBhIHN0cmluZycpXG4gICAgfVxuXG4gICAgaWYgKCEocHJvcCBpbnN0YW5jZW9mIEFycmF5KSkgcHJvcCA9IFtwcm9wXVxuXG4gICAgcHJvcC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX19maWx0ZXIuaGFzKGl0ZW0pKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBmaWx0ZXIgaXRlbSBkbyBub3QgZXhpc3RzJylcbiAgICAgIH1cblxuICAgICAgdGhpcy5fX2ZpbHRlci5zZXQoaXRlbSwgZmlsdGVyKVxuICAgIH0pXG4gIH1cblxuICBfX2NsZWFuRmlsdGVyICgpIHtcbiAgICB0aGlzLl9fZmlsdGVyID0gUHJvY2Vzcy5kZWZhdXRGaWx0ZXJPYmplY3RcbiAgfVxuXG4gIF9fc2V0T3JkZXIgKHByb3AsIG9yZGVyKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wID09PSAndW5kZWZpbmVkJyB8fCBwcm9wLmxlbmd0aCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgb3JkZXIgaXRlbSBpcyBlbXB0eScpXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9fb3JkZXIuaGFzKHByb3ApKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgb3JkZXIgaXRlbSBkbyBub3QgZXhpc3RzJylcbiAgICB9XG5cbiAgICBsZXQgbGFzdE9yZGVyID0gdGhpcy5fX29yZGVyLmdldChwcm9wKVxuXG4gICAgLy8gUmVzZXQgdGhlIG9yZGVyXG4gICAgdGhpcy5fX29yZGVyID0gUHJvY2Vzcy5kZWZhdXRTb3J0T2JqZWN0XG5cbiAgICAvLyBXaGVuIHRoZSBwYXJhbSBvcmRlciBpcyB1bmRlZmluZWQsIGNoYW5nZSB0aGUgbGFzdCBvcmRlclxuICAgIGlmICh0eXBlb2Ygb3JkZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAobGFzdE9yZGVyID09PSAnJykge1xuICAgICAgICBvcmRlciA9ICdBU0MnXG4gICAgICB9IGVsc2UgaWYgKGxhc3RPcmRlciA9PT0gJ0FTQycpIHtcbiAgICAgICAgb3JkZXIgPSAnREVTQydcbiAgICAgIH0gZWxzZSBpZiAobGFzdE9yZGVyID09PSAnREVTQycpIHtcbiAgICAgICAgb3JkZXIgPSAnJ1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX19vcmRlci5zZXQocHJvcCwgb3JkZXIpXG4gIH1cblxuICBfX2NsZWFuT3JkZXIgKCkge1xuICAgIHRoaXMuX19vcmRlciA9IFByb2Nlc3MuZGVmYXV0U29ydE9iamVjdFxuICB9XG5cbiAgLy8gLS0gRGlzcGF0Y2hlciByZWdpc3RlciAtLSAvL1xuXG4gIF9fb25EaXNwYXRjaCAocGF5bG9hZCkge1xuICAgIHN3aXRjaCAocGF5bG9hZC5hY3Rpb25UeXBlKSB7XG4gICAgICBjYXNlIFByb2Nlc3Nlc0NvbnN0YW50cy5JTklUX1BST0NFU1NFU19TVE9SRTpcbiAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICBsb2dnZXIuaW5mbygnSW5pdGlhbGl6aW5nIHN0b3JlLi4uJylcblxuICAgICAgICAvLyBXaWxsIHJlY2VpdmUgcGF5bG9hZC5maWx0ZXJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplKClcblxuICAgICAgICAvLyBOb3RpZnkgdGhlIG9ic2VydmVycyB0aGF0IHRoZSBzdG9yZSBjaGFuZ2VkXG4gICAgICAgIHRoaXMuX19lbWl0Q2hhbmdlKClcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBQcm9jZXNzZXNDb25zdGFudHMuRklMVEVSX1BST0NFU1NFUzpcbiAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICBsb2dnZXIuaW5mbygnRmlsdGVyaW5nIHByb2Nlc3Nlcy4uLicpXG5cbiAgICAgICAgLy8gV2lsbCByZWNlaXZlIHBheWxvYWQuZmlsdGVyXG4gICAgICAgIHRoaXMuX19zZXRGaWx0ZXIocGF5bG9hZC5wcm9wLCBwYXlsb2FkLmZpbHRlcilcblxuICAgICAgICAvLyBOb3RpZnkgdGhlIG9ic2VydmVycyB0aGF0IHRoZSBzdG9yZSBjaGFuZ2VkXG4gICAgICAgIHRoaXMuX19lbWl0Q2hhbmdlKClcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBQcm9jZXNzZXNDb25zdGFudHMuU09SVF9QUk9DRVNTRVM6XG4gICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1NvcnRpbmcgcHJvY2Vzc2VzLi4uJylcblxuICAgICAgICAvLyBXaWxsIHJlY2VpdmUgcGF5bG9hZC5wcm9wIGFuZCBwYXlsb2FkLm9yZGVyXG4gICAgICAgIHRoaXMuX19zZXRPcmRlcihwYXlsb2FkLnByb3AsIHBheWxvYWQub3JkZXIpXG5cbiAgICAgICAgLy8gTm90aWZ5IHRoZSBvYnNlcnZlcnMgdGhhdCB0aGUgc3RvcmUgY2hhbmdlZFxuICAgICAgICB0aGlzLl9fZW1pdENoYW5nZSgpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgUHJvY2Vzc2VzQ29uc3RhbnRzLkZFVENIX1BST0NFU1NFUzpcbiAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICBsb2dnZXIuaW5mbygnUmV0cmlldmluZyBwcm9jZXNzZXMuLi4nKVxuXG4gICAgICAgIGlmIChwYXlsb2FkLmxpc3QpIHtcbiAgICAgICAgICAvLyBXaWxsIHJlY2VpdmUgcGF5bG9hZC5saXN0IGFuZCBwYXlsb2FkLnRpbWVzdGFtcFxuICAgICAgICAgIHRoaXMuX19zZXRQcm9jZXNzZXMocGF5bG9hZC5saXN0KVxuICAgICAgICAgIHRoaXMuX19wcm9jZXNzZXNMYXN0VXBkYXRlID0gRGF0ZS5ub3coKVxuXG4gICAgICAgICAgaWYgKHBheWxvYWQuc3lzdGVtSW5mbykge1xuICAgICAgICAgICAgdGhpcy5fX3N5c3RlbUluZm8gPSB7XG4gICAgICAgICAgICAgIHRvdGFsUkFNOiBwYXlsb2FkLnN5c3RlbUluZm8udG90YWxSQU0sXG4gICAgICAgICAgICAgIGF2YWlsYWJsZVJBTTogcGF5bG9hZC5zeXN0ZW1JbmZvLmF2YWlsYWJsZVJBTVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIE5vdGlmeSB0aGUgb2JzZXJ2ZXJzIHRoYXQgdGhlIHN0b3JlIGNoYW5nZWRcbiAgICAgICAgICB0aGlzLl9fZW1pdENoYW5nZSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdJbnZhbGlkIHByb2Nlc3NlcycpXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBQcm9jZXNzZXNDb25zdGFudHMuU0VMRUNUX1BST0NFU1M6XG4gICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1NlbGVjdGluZyBwcm9jZXNzLi4uJylcblxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgeyByZXN1bHQgfSA9IHRoaXMudmFsaWRhdGVQcm9jZXNzSWRlbnRpZmllcihwYXlsb2FkLlBJRCwgcGF5bG9hZC5uYW1lKVxuICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIC8vIFdpbGwgcmVjZWl2ZSBwYXlsb2FkLlBJRCBhbmQgcGF5bG9hZC5uYW1lXG4gICAgICAgICAgICBpZiAoIXBheWxvYWQubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2Vob3J1cycpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX19zZXRTZWxlY3RlZFByb2Nlc3MocGF5bG9hZC5QSUQsIHBheWxvYWQubmFtZSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX19jbGVhblNlbGVjdGVkUHJvY2VzcygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBOb3RpZnkgdGhlIG9ic2VydmVycyB0aGF0IHRoZSBzdG9yZSBjaGFuZ2VkXG4gICAgICAgICAgICB0aGlzLl9fZW1pdENoYW5nZSgpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdJbnZhbGlkIHZhbHVlcyBmb3IgdGhlIHByb2Nlc3Mgc2VsZWN0aW9uJylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBQcm9jZXNzZXNDb25zdGFudHMuQ0xFQU5fU0VMRUNURURfUFJPQ0VTUzpcbiAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICBsb2dnZXIuaW5mbygnRGVzZWxlY3RpbmcgdGhlIHByb2Nlc3MuLi4nKVxuXG4gICAgICAgIC8vIFdpbGwgcmVjZWl2ZSBwYXlsb2FkLmlkZW50aWZpZXJcbiAgICAgICAgdGhpcy5fX2NsZWFuU2VsZWN0ZWRQcm9jZXNzKClcblxuICAgICAgICAvLyBOb3RpZnkgdGhlIG9ic2VydmVycyB0aGF0IHRoZSBzdG9yZSBjaGFuZ2VkXG4gICAgICAgIHRoaXMuX19lbWl0Q2hhbmdlKClcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBQcm9jZXNzZXNDb25zdGFudHMuU1RPUF9QUk9DRVNTOlxuICAgICAgICAvLyBDT05TT0xFIFRSQUNFXG4gICAgICAgIGxvZ2dlci5pbmZvKGBTdG9wcGluZyB0aGUgcHJvY2VzcyAnJHtwYXlsb2FkLm5hbWV9JyBbJHtwYXlsb2FkLlBJRH1dYClcblxuICAgICAgICAvLyAvLyBXaWxsIHJlY2VpdmUgcGF5bG9hZC5QSUQgYW5kIHBheWxvYWQubmFtZVxuICAgICAgICAvLyBpZiAodHlwZW9mIHBheWxvYWQuUElEICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcGF5bG9hZC5uYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAvL1xuICAgICAgICAvLyAgIC8vIE5vdGlmeSB0aGUgb2JzZXJ2ZXJzIHRoYXQgdGhlIHN0b3JlIGNoYW5nZWRcbiAgICAgICAgLy8gICB0aGlzLl9fZW1pdENoYW5nZSgpXG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gZWxzZSB7XG4gICAgICAgIC8vICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICAvLyAgIGxvZ2dlci53YXJuaW5nKCdJbnZhbGlkIHZhbHVlcyBmb3Igc3RvcHBpbmcgdGhlIHByb2Nlc3MnKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFByb2Nlc3Nlc0NvbnN0YW50cy5BRERfVE9fU1RPUFBJTkc6XG4gICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgbG9nZ2VyLmluZm8oYEFkZGluZyB0aGUgcHJvY2VzcyAnJHtwYXlsb2FkLm5hbWV9JyBbJHtwYXlsb2FkLlBJRH1dIHRvIHRoZSBzdG9wcGluZyBsaXN0YClcblxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2lsbCByZWNlaXZlIHBheWxvYWQuUElEIGFuZCBwYXlsb2FkLm5hbWVcbiAgICAgICAgICBjb25zdCB7IHJlc3VsdCB9ID0gdGhpcy52YWxpZGF0ZVByb2Nlc3NJZGVudGlmaWVyKHBheWxvYWQuUElELCBwYXlsb2FkLm5hbWUpXG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5fX2FkZFRvU3RvcHBpbmdQcm9jZXNzZXMocGF5bG9hZC5QSUQsIHBheWxvYWQubmFtZSlcblxuICAgICAgICAgICAgLy8gTm90aWZ5IHRoZSBvYnNlcnZlcnMgdGhhdCB0aGUgc3RvcmUgY2hhbmdlZFxuICAgICAgICAgICAgdGhpcy5fX2VtaXRDaGFuZ2UoKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDT05TT0xFIFRSQUNFXG4gICAgICAgICAgICBsb2dnZXIud2FybmluZygnSW52YWxpZCB2YWx1ZXMgZm9yIHN0b3BwaW5nIHRoZSBwcm9jZXNzJylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBQcm9jZXNzZXNDb25zdGFudHMuUkVNT1ZFX0ZST01fU1RPUFBJTkc6XG4gICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgbG9nZ2VyLmluZm8oYFJlbW92aW5nIHRoZSBwcm9jZXNzICcke3BheWxvYWQubmFtZX0nIFske3BheWxvYWQuUElEfV0gZnJvbSB0aGUgc3RvcHBpbmcgbGlzdGApXG5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFdpbGwgcmVjZWl2ZSBwYXlsb2FkLlBJRCBhbmQgcGF5bG9hZC5uYW1lXG4gICAgICAgICAgY29uc3QgeyByZXN1bHQgfSA9IHRoaXMudmFsaWRhdGVQcm9jZXNzSWRlbnRpZmllcihwYXlsb2FkLlBJRCwgcGF5bG9hZC5uYW1lKVxuICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuX19yZW1vdmVGcm9tU3RvcHBpbmdQcm9jZXNzZXMocGF5bG9hZC5QSUQsIHBheWxvYWQubmFtZSlcblxuICAgICAgICAgICAgLy8gTm90aWZ5IHRoZSBvYnNlcnZlcnMgdGhhdCB0aGUgc3RvcmUgY2hhbmdlZFxuICAgICAgICAgICAgdGhpcy5fX2VtaXRDaGFuZ2UoKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDT05TT0xFIFRSQUNFXG4gICAgICAgICAgICBsb2dnZXIud2FybmluZygnSW52YWxpZCB2YWx1ZXMgZm9yIHN0b3BwaW5nIHRoZSBwcm9jZXNzJylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBQcm9jZXNzZXNDb25zdGFudHMuUkVNT1ZFX1BST0NFU1M6XG4gICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgbG9nZ2VyLmluZm8oYFJlbW92aW5nIHRoZSBwcm9jZXNzICcke3BheWxvYWQubmFtZX0nIFske3BheWxvYWQuUElEfV1gKVxuXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXaWxsIHJlY2VpdmUgcGF5bG9hZC5QSUQgYW5kIHBheWxvYWQubmFtZVxuICAgICAgICAgIGNvbnN0IHsgcmVzdWx0IH0gPSB0aGlzLnZhbGlkYXRlUHJvY2Vzc0lkZW50aWZpZXIocGF5bG9hZC5QSUQsIHBheWxvYWQubmFtZSlcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLl9fY2xlYXJQcm9jZXNzKHBheWxvYWQuUElELCBwYXlsb2FkLm5hbWUpXG5cbiAgICAgICAgICAgIC8vIE5vdGlmeSB0aGUgb2JzZXJ2ZXJzIHRoYXQgdGhlIHN0b3JlIGNoYW5nZWRcbiAgICAgICAgICAgIHRoaXMuX19lbWl0Q2hhbmdlKClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0ludmFsaWQgdmFsdWVzIGZvciByZW1vdmluZyB0aGUgcHJvY2VzcycpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgUHJvY2Vzc2VzQ29uc3RhbnRzLkNIQU5HRV9QRVJJT0Q6XG4gICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1VwZGF0aW5nIHRoZSBwZXJpb2QuLi4nKVxuXG4gICAgICAgIC8vIFdpbGwgcmVjZWl2ZSBwYXlsb2FkLnBlcmlvZFxuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQucGVyaW9kID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIGlmIChwYXlsb2FkLnBlcmlvZCA8IDApIHBheWxvYWQucGVyaW9kID0gMFxuICAgICAgICAgIHRoaXMuX191cGRhdGVQZXJpb2QgPSBwYXlsb2FkLnBlcmlvZFxuXG4gICAgICAgICAgLy8gTm90aWZ5IHRoZSBvYnNlcnZlcnMgdGhhdCB0aGUgc3RvcmUgY2hhbmdlZFxuICAgICAgICAgIHRoaXMuX19lbWl0Q2hhbmdlKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBDT05TT0xFIFRSQUNFXG4gICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0ludmFsaWQgcGVyaW9kJylcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgIH1cbiAgfVxufVxuXG4vLyBFeHBvcnRpbmcgdGhpcyB3YXkgdGhlIGNsYXNzIHdpbGwgYWN0IGFzIGEgc2luZ2xldG9uXG5leHBvcnQgZGVmYXVsdCBuZXcgUHJvY2Vzc2VzU3RvcmUoQXBwRGlzcGF0Y2hlcilcbiIsImltcG9ydCB7XG4gIC8vIENvbm5lY3Rpb25cbiAgUkVTRVRfQUdFTlRfU1RBVEUsIENPTk5fQUdFTlRfUkVRVUVTVCwgQ09OTl9BR0VOVF9TVUNDRVNTLCBDT05OX0FHRU5UX0ZBSUxVUkUsXG4gIERJU0NPTk5fQUdFTlRfUkVRVUVTVCwgRElTQ09OTl9BR0VOVF9TVUNDRVNTLCBDTEVBUl9DT05OX0VSUk9SLFxuICAvLyBBdXRoZW50aWNhdGlvblxuICBBVVRIX0FHRU5UX1JFUVVFU1QsIEFVVEhfQUdFTlRfU1VDQ0VTUywgQVVUSF9BR0VOVF9GQUlMVVJFLFxuICBSRVZPS0VfQUdFTlRfQVVUSCwgQ0xFQVJfQVVUSF9FUlJPUixcbiAgLy8gVGVtcG9yYXJ5IHBhc3NcbiAgVEVNUF9QQVNTX1JFUVVFU1QsIFRFTVBfUEFTU19TVUNDRVNTLCBURU1QX1BBU1NfRkFJTFVSRSxcbiAgLy8gRGF0YVxuICBGRVRDSF9BR0VOVF9SRVFVRVNULCBGRVRDSF9BR0VOVF9TVUNDRVNTLCBGRVRDSF9BR0VOVF9GQUlMVVJFLFxuICBDTEVBUl9BR0VOVF9FUlJPUlxufSBmcm9tICcuLi9jb25zdGFudHMvYWdlbnQnXG5cbi8vIFRlbXBvcmFyeSBwYXNzIHRvIHNoYXJlIGFjY2Vzc1xuY29uc3QgaW5pdGlhbFRlbXBQYXNzU3RhdGUgPSB7XG4gIGVycm9yOiBmYWxzZSxcbiAgZXJyb3JNZXNzYWdlOiAnJyxcbiAgZmV0Y2hpbmc6IGZhbHNlLFxuICBleHBpcmVzQXQ6IG51bGwsXG4gIGRhdGE6IG51bGxcbn1cblxuY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICBpZDogJycsXG4gIC8vIENvbm5lY3Rpb25cbiAgaXNDb25uZWN0aW5nOiBmYWxzZSxcbiAgaXNEaXNjb25uZWN0aW5nOiBmYWxzZSxcbiAgaXNDb25uZWN0ZWQ6IGZhbHNlLFxuICBjb25uZWN0ZWRBdDogbnVsbCxcbiAgY29ubmVjdGlvbkVycm9yOiBmYWxzZSxcbiAgY29ubmVjdGlvbkVycm9yQ29kZTogbnVsbCxcbiAgY29ubmVjdGlvbkVycm9yTWVzc2FnZTogbnVsbCxcbiAgLy8gQXV0aGVudGljYXRpb25cbiAgaXNBdXRoZW50aWNhdGluZzogZmFsc2UsXG4gIGlzQXV0aGVudGljYXRlZDogZmFsc2UsXG4gIGF1dGhlbnRpY2F0aW9uRXJyb3I6IGZhbHNlLFxuICBhdXRoZW50aWNhdGlvbkVycm9yQ29kZTogbnVsbCxcbiAgYXV0aGVudGljYXRpb25FcnJvck1lc3NhZ2U6IG51bGwsXG4gIC8vIFRlbXBvcmFyeSBwYXNzIHRvIHNoYXJlIGFjY2Vzc1xuICB0ZW1wUGFzczogaW5pdGlhbFRlbXBQYXNzU3RhdGUsXG4gIC8vIERhdGFcbiAgdXB0aW1lOiAwLFxuICB2ZXJzaW9uOiAnJyxcbiAgYWRkcmVzczogJycsXG4gIGhvc3RuYW1lOiAnJyxcbiAgZGVzY3JpcHRpb246ICcnLFxuICBsYW5ndWFnZTogJycsXG4gIG9zOiAndW5rbm93bicsXG4gIG9zVmVyc2lvbjogJycsXG4gIGFyY2hpdGVjdHVyZTogJycsXG4gIGNwdURlc2NyaXB0aW9uOiAnJyxcbiAgcmFtOiAwLFxuICBoZGQ6IDAsXG4gIGlzRmV0Y2hpbmc6IGZhbHNlLFxuICByZWNlaXZlZEF0OiBudWxsLFxuICBlcnJvcjogZmFsc2UsXG4gIGVycm9yQ29kZTogbnVsbCxcbiAgZXJyb3JNZXNzYWdlOiBudWxsXG59XG5cbmNvbnN0IHRlbXBQYXNzUmVkdWNlciA9IChzdGF0ZSA9IGluaXRpYWxUZW1wUGFzc1N0YXRlLCBhY3Rpb24pID0+IHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgVEVNUF9QQVNTX1JFUVVFU1Q6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgaW5pdGlhbFRlbXBQYXNzU3RhdGUsIHsgZmV0Y2hpbmc6IHRydWUgfSlcbiAgICBjYXNlIFRFTVBfUEFTU19TVUNDRVNTOlxuICAgICAgY29uc3QgeyBwYXNzLCBleHBpcmVzQXQgfSA9IGFjdGlvbi5wYXlsb2FkXG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgaW5pdGlhbFRlbXBQYXNzU3RhdGUsIHsgcGFzcywgZXhwaXJlc0F0IH0pXG4gICAgY2FzZSBURU1QX1BBU1NfRkFJTFVSRTpcbiAgICAgIGNvbnN0IHsgZXJyb3IsIGVycm9yTWVzc2FnZSB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBpbml0aWFsVGVtcFBhc3NTdGF0ZSwgeyBlcnJvciwgZXJyb3JNZXNzYWdlIH0pXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBzdGF0ZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IChzdGF0ZSA9IGluaXRpYWxTdGF0ZSwgYWN0aW9uKSA9PiB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIFJFU0VUX0FHRU5UX1NUQVRFOlxuICAgICAgcmV0dXJuIGluaXRpYWxTdGF0ZVxuICAgIC8vIENvbm5lY3Rpb25cbiAgICBjYXNlIENPTk5fQUdFTlRfUkVRVUVTVDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc0Nvbm5lY3Rpbmc6IHRydWUsXG4gICAgICAgIGlzQ29ubmVjdGVkOiBmYWxzZVxuICAgICAgfSlcbiAgICBjYXNlIENPTk5fQUdFTlRfU1VDQ0VTUzpcbiAgICAgIGNvbnN0IHsgY29ubmVjdGVkQXQgfSA9IGFjdGlvbi5wYXlsb2FkXG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgaXNDb25uZWN0aW5nOiBmYWxzZSxcbiAgICAgICAgaXNDb25uZWN0ZWQ6IHRydWUsXG4gICAgICAgIGNvbm5lY3RlZEF0XG4gICAgICB9KVxuICAgIGNhc2UgQ09OTl9BR0VOVF9GQUlMVVJFOlxuICAgICAgY29uc3QgeyBlcnJvckNvZGUsIGVycm9yTWVzc2FnZSB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc0Nvbm5lY3Rpbmc6IGZhbHNlLFxuICAgICAgICBpc0Nvbm5lY3RlZDogZmFsc2UsXG4gICAgICAgIGNvbm5lY3Rpb25FcnJvcjogdHJ1ZSxcbiAgICAgICAgY29ubmVjdGlvbkVycm9yQ29kZTogZXJyb3JDb2RlLFxuICAgICAgICBjb25uZWN0aW9uRXJyb3JNZXNzYWdlOiBlcnJvck1lc3NhZ2VcbiAgICAgIH0pXG4gICAgY2FzZSBESVNDT05OX0FHRU5UX1JFUVVFU1Q6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgaXNEaXNjb25uZWN0aW5nOiB0cnVlXG4gICAgICB9KVxuICAgIGNhc2UgRElTQ09OTl9BR0VOVF9TVUNDRVNTOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGlzRGlzY29ubmVjdGluZzogZmFsc2UsXG4gICAgICAgIGlzQ29ubmVjdGVkOiBmYWxzZVxuICAgICAgfSlcbiAgICBjYXNlIENMRUFSX0NPTk5fRVJST1I6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgY29ubmVjdGlvbkVycm9yOiBpbml0aWFsU3RhdGUuY29ubmVjdGlvbkVycm9yLFxuICAgICAgICBjb25uZWN0aW9uRXJyb3JDb2RlOiBpbml0aWFsU3RhdGUuY29ubmVjdGlvbkVycm9yQ29kZSxcbiAgICAgICAgY29ubmVjdGlvbkVycm9yTWVzc2FnZTogaW5pdGlhbFN0YXRlLmNvbm5lY3Rpb25FcnJvck1lc3NhZ2VcbiAgICAgIH0pXG4gICAgLy8gQXV0aGVudGljYXRpb25cbiAgICBjYXNlIFJFVk9LRV9BR0VOVF9BVVRIOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGlzQXV0aGVudGljYXRpbmc6IGZhbHNlLFxuICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlXG4gICAgICB9KVxuICAgIGNhc2UgQVVUSF9BR0VOVF9SRVFVRVNUOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGlzQXV0aGVudGljYXRpbmc6IHRydWUsXG4gICAgICAgIGlzQXV0aGVudGljYXRlZDogZmFsc2VcbiAgICAgIH0pXG4gICAgY2FzZSBBVVRIX0FHRU5UX1NVQ0NFU1M6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgaXNBdXRoZW50aWNhdGluZzogZmFsc2UsXG4gICAgICAgIGlzQXV0aGVudGljYXRlZDogdHJ1ZVxuICAgICAgfSlcbiAgICBjYXNlIEFVVEhfQUdFTlRfRkFJTFVSRTpcbiAgICAgIHtcbiAgICAgICAgY29uc3QgeyBlcnJvckNvZGUsIGVycm9yTWVzc2FnZSB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgICAgaXNBdXRoZW50aWNhdGluZzogZmFsc2UsXG4gICAgICAgICAgaXNBdXRoZW50aWNhdGVkOiBmYWxzZSxcbiAgICAgICAgICBhdXRoZW50aWNhdGlvbkVycm9yOiB0cnVlLFxuICAgICAgICAgIGF1dGhlbnRpY2F0aW9uRXJyb3JDb2RlOiBlcnJvckNvZGUsXG4gICAgICAgICAgYXV0aGVudGljYXRpb25FcnJvck1lc3NhZ2U6IGVycm9yTWVzc2FnZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIGNhc2UgQ0xFQVJfQVVUSF9FUlJPUjpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBhdXRoZW50aWNhdGlvbkVycm9yOiBpbml0aWFsU3RhdGUuYXV0aGVudGljYXRpb25FcnJvcixcbiAgICAgICAgYXV0aGVudGljYXRpb25FcnJvckNvZGU6IGluaXRpYWxTdGF0ZS5hdXRoZW50aWNhdGlvbkVycm9yQ29kZSxcbiAgICAgICAgYXV0aGVudGljYXRpb25FcnJvck1lc3NhZ2U6IGluaXRpYWxTdGF0ZS5hdXRoZW50aWNhdGlvbkVycm9yTWVzc2FnZVxuICAgICAgfSlcbiAgICAvLyBUZW1wb3JhcnkgcGFzc1xuICAgIGNhc2UgVEVNUF9QQVNTX1JFUVVFU1Q6XG4gICAgY2FzZSBURU1QX1BBU1NfU1VDQ0VTUzpcbiAgICBjYXNlIFRFTVBfUEFTU19GQUlMVVJFOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIHRlbXBQYXNzOiB0ZW1wUGFzc1JlZHVjZXIoc3RhdGUudGVtcFBhc3MsIGFjdGlvbilcbiAgICAgIH0pXG4gICAgLy8gRGF0YVxuICAgIGNhc2UgRkVUQ0hfQUdFTlRfUkVRVUVTVDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc0ZldGNoaW5nOiB0cnVlXG4gICAgICB9KVxuICAgIGNhc2UgRkVUQ0hfQUdFTlRfU1VDQ0VTUzpcbiAgICAgIGNvbnN0IHsgZGF0YSwgcmVjZWl2ZWRBdCB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgaWQsIHVwdGltZSwgdmVyc2lvbiwgYWRkcmVzcywgaG9zdG5hbWUsIGRlc2NyaXB0aW9uLFxuICAgICAgICBsYW5ndWFnZSwgb3MsIG9zVmVyc2lvbiwgYXJjaGl0ZWN0dXJlLCBjcHVEZXNjcmlwdGlvbiwgcmFtLCBoZGRcbiAgICAgIH0gPSBkYXRhXG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgaXNGZXRjaGluZzogZmFsc2UsXG4gICAgICAgIHJlY2VpdmVkQXQsXG4gICAgICAgIGlkLFxuICAgICAgICB1cHRpbWUsXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIGFkZHJlc3MsXG4gICAgICAgIGhvc3RuYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIG9zLFxuICAgICAgICBvc1ZlcnNpb24sXG4gICAgICAgIGFyY2hpdGVjdHVyZSxcbiAgICAgICAgY3B1RGVzY3JpcHRpb24sXG4gICAgICAgIHJhbSxcbiAgICAgICAgaGRkXG4gICAgICB9KVxuICAgIGNhc2UgRkVUQ0hfQUdFTlRfRkFJTFVSRTpcbiAgICAgIHtcbiAgICAgICAgY29uc3QgeyBlcnJvckNvZGUsIGVycm9yTWVzc2FnZSB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgICAgaXNGZXRjaGluZzogZmFsc2UsXG4gICAgICAgICAgZXJyb3I6IHRydWUsXG4gICAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICAgIGVycm9yTWVzc2FnZVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIGNhc2UgQ0xFQVJfQUdFTlRfRVJST1I6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgZXJyb3I6IGZhbHNlLFxuICAgICAgICBlcnJvckNvZGU6IG51bGwsXG4gICAgICAgIGVycm9yTWVzc2FnZTogbnVsbFxuICAgICAgfSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlXG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIFVQREFURV9MT0dPX1VSTCxcbiAgU0hPV19IRUFERVIsIEhJREVfSEVBREVSLFxuICBVUERBVEVfRElTQ09OTkVDVF9IQU5ETEVSXG59IGZyb20gJy4uL2NvbnN0YW50cy9hcHAnXG5cbmltcG9ydCBzZWN0aW9uc1JlZHVjZXIsIHtcbiAgZ2V0QWN0aXZlU2VjdGlvbiBhcyBnZXRBY3RpdmVTZWN0aW9uVXRpbCxcbiAgZ2V0U2VjdGlvbiBhcyBnZXRTZWN0aW9uVXRpbCxcbiAgZ2V0U2VjdGlvbnMgYXMgZ2V0U2VjdGlvbnNVdGlsLFxuICBnZXRGaXJzdEFjdGl2ZSBhcyBnZXRGaXJzdEFjdGl2ZVV0aWxcbn0gZnJvbSAnLi4vcmVkdWNlcnMvc2VjdGlvbnMnXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3RpdmVTZWN0aW9uIChzdGF0ZSkge1xuICByZXR1cm4gZ2V0QWN0aXZlU2VjdGlvblV0aWwoc3RhdGUuc2VjdGlvbnMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWN0aW9uIChzdGF0ZSwga2V5KSB7XG4gIHJldHVybiBnZXRTZWN0aW9uVXRpbChzdGF0ZS5zZWN0aW9ucywga2V5KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VjdGlvbnMgKHN0YXRlKSB7XG4gIHJldHVybiBnZXRTZWN0aW9uc1V0aWwoc3RhdGUuc2VjdGlvbnMpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaXJzdEFjdGl2ZSAoc3RhdGUpIHtcbiAgcmV0dXJuIGdldEZpcnN0QWN0aXZlVXRpbChzdGF0ZS5zZWN0aW9ucylcbn1cblxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlID0ge1xuICBsb2dvVVJMOiAnJyxcbiAgc2hvd0hlYWRlcjogdHJ1ZSxcbiAgYWdlbnRMYXN0Q29udGFjdDogMCxcbiAgYWdlbnRJc0J1c3k6IGZhbHNlLFxuICBoYW5kbGVEaXNjb25uZWN0OiAoKSA9PiB7fSxcbiAgaGFuZGxlVGVtcFBhc3NHZW5lcmF0ZWQ6IG51bGwsXG4gIHBhc3M6IG51bGwsXG4gIHRtcFBhc3M6IG51bGxcbn0sIGFjdGlvbikgPT4ge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBVUERBVEVfTE9HT19VUkw6XG4gICAgICBjb25zdCB7IGxvZ29VUkwgfSA9IGFjdGlvbi5wYXlsb2FkXG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgbG9nb1VSTFxuICAgICAgfSlcbiAgICBjYXNlIFNIT1dfSEVBREVSOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIHNob3dIZWFkZXI6IHRydWVcbiAgICAgIH0pXG4gICAgY2FzZSBISURFX0hFQURFUjpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBzaG93SGVhZGVyOiBmYWxzZVxuICAgICAgfSlcbiAgICBjYXNlIFVQREFURV9ESVNDT05ORUNUX0hBTkRMRVI6XG4gICAgICBjb25zdCB7IGhhbmRsZURpc2Nvbm5lY3QgfSA9IHRoaXMucGF5bG9hZFxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGhhbmRsZURpc2Nvbm5lY3RcbiAgICAgIH0pXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBzZWN0aW9uczogc2VjdGlvbnNSZWR1Y2VyKHN0YXRlLnNlY3Rpb25zLCBhY3Rpb24pXG4gICAgICB9KVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBSRVNFVF9ESVNQTEFZX1NUQVRFLCBVUERBVEVfRElTUExBWV9EQVRBLCBDTEVBUl9ESVNQTEFZX0VSUk9SLFxuICBDT05OX0RJU1BMQVlfUkVRVUVTVCwgQ09OTl9ESVNQTEFZX1NVQ0NFU1MsIENPTk5fRElTUExBWV9GQUlMVVJFLFxuICBESVNDT05OX0RJU1BMQVlfUkVRVUVTVCwgRElTQ09OTl9ESVNQTEFZX1NVQ0NFU1Ncbn0gZnJvbSAnLi4vY29uc3RhbnRzL2Rpc3BsYXknXG5cbmNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgdHJ1ZUNvbG9yOiB0cnVlLFxuICBsb2NhbEN1cnNvcjogdHJ1ZSxcbiAgc2hhcmVkOiB0cnVlLFxuICB2aWV3T25seTogZmFsc2UsXG4gIGlzQ29ubmVjdGluZzogZmFsc2UsXG4gIGlzRGlzY29ubmVjdGluZzogZmFsc2UsXG4gIGlzQ29ubmVjdGVkOiBmYWxzZSxcbiAgZXJyb3I6IGZhbHNlLFxuICBlcnJvckNvZGU6IG51bGwsXG4gIGVycm9yTWVzc2FnZTogbnVsbFxufVxuXG5leHBvcnQgZGVmYXVsdCAoc3RhdGUgPSBpbml0aWFsU3RhdGUsIGFjdGlvbikgPT4ge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBSRVNFVF9ESVNQTEFZX1NUQVRFOlxuICAgICAgcmV0dXJuIGluaXRpYWxTdGF0ZVxuICAgIGNhc2UgQ09OTl9ESVNQTEFZX1JFUVVFU1Q6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgaXNDb25uZWN0aW5nOiB0cnVlLFxuICAgICAgICBpc0Rpc2Nvbm5lY3Rpbmc6IGZhbHNlLFxuICAgICAgICBpc0Nvbm5lY3RlZDogZmFsc2UsXG4gICAgICAgIGVycm9yOiBpbml0aWFsU3RhdGUuZXJyb3IsXG4gICAgICAgIGVycm9yQ29kZTogaW5pdGlhbFN0YXRlLmVycm9yQ29kZSxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBpbml0aWFsU3RhdGUuZXJyb3JNZXNzYWdlXG4gICAgICB9KVxuICAgIGNhc2UgQ09OTl9ESVNQTEFZX1NVQ0NFU1M6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgaXNDb25uZWN0aW5nOiBmYWxzZSxcbiAgICAgICAgaXNEaXNjb25uZWN0aW5nOiBmYWxzZSxcbiAgICAgICAgaXNDb25uZWN0ZWQ6IHRydWVcbiAgICAgIH0pXG4gICAgY2FzZSBDT05OX0RJU1BMQVlfRkFJTFVSRTpcbiAgICAgIHtcbiAgICAgICAgY29uc3QgeyBlcnJvckNvZGUsIGVycm9yTWVzc2FnZSB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgICAgaXNDb25uZWN0aW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0Rpc2Nvbm5lY3Rpbmc6IGZhbHNlLFxuICAgICAgICAgIGlzQ29ubmVjdGVkOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgY2FzZSBESVNDT05OX0RJU1BMQVlfUkVRVUVTVDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc0Nvbm5lY3Rpbmc6IGZhbHNlLFxuICAgICAgICBpc0Rpc2Nvbm5lY3Rpbmc6IHRydWVcbiAgICAgIH0pXG4gICAgY2FzZSBESVNDT05OX0RJU1BMQVlfU1VDQ0VTUzpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc0Nvbm5lY3Rpbmc6IGZhbHNlLFxuICAgICAgICBpc0Rpc2Nvbm5lY3Rpbmc6IGZhbHNlLFxuICAgICAgICBpc0Nvbm5lY3RlZDogZmFsc2VcbiAgICAgIH0pXG4gICAgY2FzZSBVUERBVEVfRElTUExBWV9EQVRBOlxuICAgICAgY29uc3QgeyBkYXRhIH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCBkYXRhKVxuICAgIGNhc2UgQ0xFQVJfRElTUExBWV9FUlJPUjpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBlcnJvcjogaW5pdGlhbFN0YXRlLmVycm9yLFxuICAgICAgICBlcnJvckNvZGU6IGluaXRpYWxTdGF0ZS5lcnJvckNvZGUsXG4gICAgICAgIGVycm9yTWVzc2FnZTogaW5pdGlhbFN0YXRlLmVycm9yTWVzc2FnZVxuICAgICAgfSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlXG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIENIQU5HRV9ESVJfRklMRVMsXG4gIEZFVENIX0ZJTEVTX1JFUVVFU1QsIEZFVENIX0ZJTEVTX1NVQ0NFU1MsIEZFVENIX0ZJTEVTX0ZBSUxVUkUsXG4gIEZFVENIX0ZJTEVfU1VDQ0VTUyxcbiAgREVMRVRFX0ZJTEVfUkVRVUVTVCwgREVMRVRFX0ZJTEVfU1VDQ0VTUywgREVMRVRFX0ZJTEVfRkFJTFVSRSxcbiAgQ0xFQVJfRklMRVNfRVJST1IsIENMRUFSX0ZJTEVfRVJST1IsXG4gIERPV05MT0FEX0ZJTEVfRkFJTFVSRSwgQ0xFQVJfRE9XTkxPQURfRklMRV9FUlJPUixcbiAgVVBMT0FEX0ZJTEVfRkFJTFVSRSwgQ0xFQVJfVVBMT0FEX0ZJTEVfRVJST1Jcbn0gZnJvbSAnLi4vY29uc3RhbnRzL2ZpbGVzJ1xuXG5pbXBvcnQgdG9QYXRoQXJyYXkgZnJvbSAnLi4vbGliL2ZpbGVzL3BhdGgtYXJyYXknXG5cbi8qICogKiBTRUxFQ1RPUlMgKiAqICovXG5cbmV4cG9ydCBjb25zdCBnZXRDdXJyZW50UGF0aEFycmF5ID0gKHsgcGF0aEFycmF5IH0pID0+IHBhdGhBcnJheVxuXG5jb25zdCBUWVBFX0ZJTEUgPSAnVFlQRV9GSUxFJ1xuY29uc3QgVFlQRV9ESVIgPSAnVFlQRV9ESVInXG5jb25zdCBUWVBFX0FMTCA9ICdUWVBFX0FMTCdcbmV4cG9ydCBjb25zdCBnZXRJdGVtID0gKHN0YXRlLCBwYXRoLCB0eXBlID0gVFlQRV9BTEwpID0+IHtcbiAgaWYgKCFwYXRoIHx8IHBhdGgubGVuZ3RoID09PSAwKSBUeXBlRXJyb3IoJ1BhdGggcmVxdWlyZWQnKVxuICBjb25zdCBwYXRoQXJyYXkgPSAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSA/IHRvUGF0aEFycmF5KHBhdGgpIDogcGF0aFxuXG4gIGlmIChwYXRoQXJyYXkubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IFsgYmFzZW5hbWUsIC4uLm5ld1BhdGhBcnJheSBdID0gcGF0aEFycmF5XG5cbiAgICBjb25zdCBpdGVtID0gKHN0YXRlLml0ZW1zIHx8IHN0YXRlKS5ieUJhc2VuYW1lW2Jhc2VuYW1lXVxuICAgIGlmIChuZXdQYXRoQXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAodHlwZSA9PT0gVFlQRV9BTEwgfHxcbiAgICAgICAgICAodHlwZSA9PT0gVFlQRV9GSUxFICYmIGl0ZW0uaXNGaWxlKSB8fFxuICAgICAgICAgICh0eXBlID09PSBUWVBFX0RJUiAmJiBpdGVtLmlzRGlyKSB8fFxuICAgICAgICAgICh0eXBlID09PSBUWVBFX0RJUiAmJiBpdGVtLmlzRHJpdmUpKSB7XG4gICAgICAgIHJldHVybiBpdGVtXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpdGVtLmlzRGlyIHx8IGl0ZW0uaXNEcml2ZSkge1xuICAgICAgICAvLyBAcmVjdXJzaXZlXG4gICAgICAgIHJldHVybiBnZXRJdGVtKGl0ZW0uaXRlbXMsIG5ld1BhdGhBcnJheSwgdHlwZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldEZpbGUgPSAoLi4uYXJncykgPT4gZ2V0SXRlbSguLi5hcmdzLCBUWVBFX0ZJTEUpXG5cbmV4cG9ydCBjb25zdCBnZXREaXIgPSAoLi4uYXJncykgPT4gZ2V0SXRlbSguLi5hcmdzLCBUWVBFX0RJUilcblxuZXhwb3J0IGNvbnN0IGdldEl0ZW1zTWV0YWRhdGEgPSAoc3RhdGUsIHBhdGggPSAnJykgPT4ge1xuICBjb25zdCBwYXRoQXJyYXkgPSAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSA/IHRvUGF0aEFycmF5KHBhdGgpIDogcGF0aFxuICByZXR1cm4gKHBhdGhBcnJheS5sZW5ndGggPiAwKVxuICAgID8gKGdldERpcihzdGF0ZSwgcGF0aEFycmF5KSB8fCB7fSkuaXRlbXNcbiAgICA6IHN0YXRlLml0ZW1zXG59XG5cbmV4cG9ydCBjb25zdCBnZXRJdGVtcyA9IChzdGF0ZSwgcGF0aCA9ICcnLCB0eXBlID0gVFlQRV9BTEwpID0+IHtcbiAgY29uc3QgcGF0aEFycmF5ID0gKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykgPyB0b1BhdGhBcnJheShwYXRoKSA6IHBhdGhcblxuICBjb25zdCBpdGVtcyA9IGdldEl0ZW1zTWV0YWRhdGEoc3RhdGUsIHBhdGhBcnJheSlcblxuICBpZiAoIWl0ZW1zKSByZXR1cm4gW11cblxuICAvLyBSZXR1cm4gdGhlIGl0ZW1zXG4gIHJldHVybiBpdGVtcy5iYXNlbmFtZXNcbiAgICAubWFwKChiKSA9PiBpdGVtcy5ieUJhc2VuYW1lW2JdKVxuICAgIC5maWx0ZXIoKGkpID0+IChcbiAgICAgIHR5cGUgPT09IFRZUEVfQUxMIHx8XG4gICAgICAgICh0eXBlID09PSBUWVBFX0ZJTEUgJiYgaS5pc0ZpbGUpIHx8XG4gICAgICAgICh0eXBlID09PSBUWVBFX0RJUiAmJiBpLmlzRGlyKSB8fFxuICAgICAgICAodHlwZSA9PT0gVFlQRV9ESVIgJiYgaS5pc0RyaXZlKVxuICAgICkpXG59XG5cbmNvbnN0IGlzSXRlbUVycm9yID0gKHsgZXJyb3IgfSkgPT4gZXJyb3JcbmNvbnN0IGl0ZW1FcnJvciA9ICh7IHBhdGgsIGVycm9yQ29kZTogY29kZSwgZXJyb3JNZXNzYWdlOiBtZXNzYWdlIH0pID0+ICh7XG4gIHBhdGgsIGNvZGUsIG1lc3NhZ2Vcbn0pXG5leHBvcnQgY29uc3QgZ2V0SXRlbXNFcnJvcnMgPSAoLi4uYXJncykgPT4gZ2V0SXRlbXMoLi4uYXJncylcbiAgLmZpbHRlcihpc0l0ZW1FcnJvcikubWFwKGl0ZW1FcnJvcilcblxuY29uc3QgZ2V0RXJyb3JzID0gKGVycm9ycykgPT4gZXJyb3JzLnBhdGhzLm1hcCgocGF0aCkgPT4gKHtcbiAgcGF0aCxcbiAgLi4uZXJyb3JzLmJ5UGF0aFtwYXRoXVxufSkpXG5leHBvcnQgY29uc3QgZ2V0RG93bmxvYWRFcnJvcnMgPSAoc3RhdGUpID0+IGdldEVycm9ycyhzdGF0ZS5kb3dubG9hZHMuZXJyb3JzKVxuZXhwb3J0IGNvbnN0IGdldFVwbG9hZEVycm9ycyA9IChzdGF0ZSkgPT4gZ2V0RXJyb3JzKHN0YXRlLnVwbG9hZHMuZXJyb3JzKVxuXG4vKiAqICogUkVEVUNFUlMgKiAqICovXG5cbmNvbnN0IGluaXRpYWxGaWxlU3RhdGUgPSB7XG4gIHNlcGFyYXRvcjogJy8nLFxuICBwYXRoOiAnJyxcbiAgZGlybmFtZTogJycsXG4gIGJhc2VuYW1lOiAnJyxcbiAgbGFzdE1vZGlmaWNhdGlvbjogbnVsbCxcblxuICBpc0ZpbGU6IGZhbHNlLFxuICBtaW1lVHlwZTogbnVsbCxcbiAgc2l6ZTogbnVsbCxcbiAgY2FuQmVEZWxldGVkOiBmYWxzZSxcblxuICBpc0RpcjogZmFsc2UsXG4gIGlzRHJpdmU6IGZhbHNlLFxuICBpdGVtczogdW5kZWZpbmVkLCAvLyBpdGVtc1JlZHVjZXJcblxuICBpc1dyaXRhYmxlOiBmYWxzZSxcbiAgaXNSZWFkYWJsZTogZmFsc2UsXG4gIGlzUG9zaXg6IGZhbHNlLFxuICBpc1dpbjogZmFsc2UsXG5cbiAgaXNEZWxldGluZzogZmFsc2UsXG4gIGVycm9yOiBmYWxzZSxcbiAgZXJyb3JDb2RlOiBudWxsLFxuICBlcnJvck1lc3NhZ2U6IG51bGxcbn1cblxuY29uc3QgZmlsZVJlZHVjZXIgPSAoc3RhdGUgPSBpbml0aWFsRmlsZVN0YXRlLCBhY3Rpb24pID0+IHtcbiAgaWYgKCFhY3Rpb24ucGF5bG9hZCkgcmV0dXJuIHN0YXRlXG4gIGNvbnN0IHsgcGF0aEFycmF5ID0gW10gfSA9IGFjdGlvbi5wYXlsb2FkXG5cbiAgLy8gVXBkYXRlIHRoaXMgbGV2ZWxcbiAgaWYgKHBhdGhBcnJheS5sZW5ndGggPT09IDApIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICBjYXNlIEZFVENIX0ZJTEVfU1VDQ0VTUzpcbiAgICAgICAgY29uc3QgeyBkYXRhIH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgICAvLyBjb25zdCB7ICB9ID0gZGF0YVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgLy8gSW5pdCB0aGUgY2hpbGRyZW4gcmVkdWNlclxuICAgICAgICAgIGl0ZW1zOiAoZGF0YS5pc0RpciB8fCBkYXRhLmlzRHJpdmUpXG4gICAgICAgICAgICA/IGl0ZW1zUmVkdWNlcihzdGF0ZS5pdGVtcywgeyB0eXBlOiBudWxsIH0pXG4gICAgICAgICAgICA6IHN0YXRlLml0ZW1zLFxuICAgICAgICAgIGVycm9yOiBpbml0aWFsU3RhdGUuZXJyb3IsXG4gICAgICAgICAgZXJyb3JDb2RlOiBpbml0aWFsU3RhdGUuZXJyb3JDb2RlLFxuICAgICAgICAgIGVycm9yTWVzc2FnZTogaW5pdGlhbFN0YXRlLmVycm9yTWVzc2FnZVxuICAgICAgICB9XG4gICAgICBjYXNlIEZFVENIX0ZJTEVTX1NVQ0NFU1M6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgLy8gU2F2ZSBpbnRvIHRoZSBjaGlsZHJlbiByZWR1Y2VyXG4gICAgICAgICAgaXRlbXM6IChzdGF0ZS5pc0RpciB8fCBzdGF0ZS5pc0RyaXZlKVxuICAgICAgICAgICAgPyBpdGVtc1JlZHVjZXIoc3RhdGUuaXRlbXMsIGFjdGlvbilcbiAgICAgICAgICAgIDogc3RhdGUuaXRlbXNcbiAgICAgICAgfVxuICAgICAgY2FzZSBERUxFVEVfRklMRV9SRVFVRVNUOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIGlzRGVsZXRpbmc6IHRydWUsXG4gICAgICAgICAgZXJyb3I6IGluaXRpYWxTdGF0ZS5lcnJvcixcbiAgICAgICAgICBlcnJvckNvZGU6IGluaXRpYWxTdGF0ZS5lcnJvckNvZGUsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBpbml0aWFsU3RhdGUuZXJyb3JNZXNzYWdlXG4gICAgICAgIH1cbiAgICAgIGNhc2UgREVMRVRFX0ZJTEVfRkFJTFVSRTpcbiAgICAgICAgY29uc3QgeyBlcnJvckNvZGUsIGVycm9yTWVzc2FnZSB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBpc0RlbGV0aW5nOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlXG4gICAgICAgIH1cbiAgICAgIGNhc2UgQ0xFQVJfRklMRV9FUlJPUjpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBlcnJvcjogaW5pdGlhbFN0YXRlLmVycm9yLFxuICAgICAgICAgIGVycm9yQ29kZTogaW5pdGlhbFN0YXRlLmVycm9yQ29kZSxcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGluaXRpYWxTdGF0ZS5lcnJvck1lc3NhZ2VcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBpdGVtczogKHN0YXRlLmlzRGlyIHx8IHN0YXRlLmlzRHJpdmUpXG4gICAgICAgICAgICA/IGl0ZW1zUmVkdWNlcihzdGF0ZS5pdGVtcywgYWN0aW9uKVxuICAgICAgICAgICAgOiBzdGF0ZS5pdGVtc1xuICAgICAgICB9XG4gICAgfVxuICAvLyBQcm9wYWdhdGUgdGhlIGFjdGlvblxuICB9IGVsc2Uge1xuICAgIHJldHVybiAoc3RhdGUuaXNEaXIgfHwgc3RhdGUuaXNEcml2ZSlcbiAgICAgID8geyAuLi5zdGF0ZSwgaXRlbXM6IGl0ZW1zUmVkdWNlcihzdGF0ZS5pdGVtcywgYWN0aW9uKSB9XG4gICAgICA6IHN0YXRlXG4gIH1cbn1cblxuY29uc3QgZmlsZXNCeUJhc2VuYW1lUmVkdWNlciA9IChzdGF0ZSA9IHt9LCBhY3Rpb24pID0+IHtcbiAgaWYgKCFhY3Rpb24ucGF5bG9hZCkgcmV0dXJuIHN0YXRlXG4gIGNvbnN0IHsgcGF0aEFycmF5OiBbIGJhc2VuYW1lLCAuLi5wYXRoQXJyYXkgXSA9IFtdIH0gPSBhY3Rpb24ucGF5bG9hZFxuXG4gIGlmIChiYXNlbmFtZSkge1xuICAgIC8vIFVwZGF0ZSBhIGl0ZW0gb2YgdGhpcyBsZXZlbFxuICAgIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICAgIGNhc2UgREVMRVRFX0ZJTEVfU1VDQ0VTUzpcbiAgICAgICAgICBjb25zdCB7IFtiYXNlbmFtZV06IGl0ZW0sIC4uLnJlc3QgfSA9IHN0YXRlXG4gICAgICAgICAgcmV0dXJuIChpdGVtKSA/IHJlc3QgOiBzdGF0ZVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIFtiYXNlbmFtZV06IGZpbGVSZWR1Y2VyKHN0YXRlW2Jhc2VuYW1lXSwge1xuICAgICAgICAgICAgICAuLi5hY3Rpb24sXG4gICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICAuLi5hY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgICAgICAgICBwYXRoQXJyYXk6IFtdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIC8vIFByb3BhZ2F0ZSB0aGUgYWN0aW9uXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBbYmFzZW5hbWVdOiBmaWxlUmVkdWNlcihzdGF0ZVtiYXNlbmFtZV0sIHtcbiAgICAgICAgICAuLi5hY3Rpb24sXG4gICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgLi4uYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgICBwYXRoQXJyYXlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICAvLyBVcGRhdGUgdGhpcyBsZXZlbFxuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgRkVUQ0hfRklMRVNfU1VDQ0VTUzpcbiAgICAgICAgY29uc3QgeyBpdGVtcyB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgICAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoYWNjLCBpdGVtKSA9PiAoe1xuICAgICAgICAgIC4uLmFjYyxcbiAgICAgICAgICBbaXRlbS5iYXNlbmFtZV06IGZpbGVSZWR1Y2VyKHN0YXRlW2l0ZW0uYmFzZW5hbWVdLCB7XG4gICAgICAgICAgICAuLi5hY3Rpb24sXG4gICAgICAgICAgICB0eXBlOiBGRVRDSF9GSUxFX1NVQ0NFU1MsXG4gICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgIC4uLmFjdGlvbi5wYXlsb2FkLFxuICAgICAgICAgICAgICBkYXRhOiBpdGVtXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfSksIHt9KVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHN0YXRlXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGZpbGVzQmFzZW5hbWVzUmVkdWNlciA9IChzdGF0ZSA9IFtdLCBhY3Rpb24pID0+IHtcbiAgaWYgKCFhY3Rpb24ucGF5bG9hZCkgcmV0dXJuIHN0YXRlXG4gIGNvbnN0IHsgcGF0aEFycmF5OiBbIGJhc2VuYW1lLCAuLi5wYXRoQXJyYXkgXSA9IFtdIH0gPSBhY3Rpb24ucGF5bG9hZFxuICAvLyBPbmx5IGFsbG93IHRoZSBlZGl0aW9uIG9mIHRoaXMgbGV2ZWxcbiAgaWYgKHBhdGhBcnJheS5sZW5ndGggPiAwKSByZXR1cm4gc3RhdGVcblxuICBpZiAoYmFzZW5hbWUpIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICBjYXNlIERFTEVURV9GSUxFX1NVQ0NFU1M6XG4gICAgICAgIGNvbnN0IGluZGV4ID0gc3RhdGUuaW5kZXhPZihiYXNlbmFtZSlcbiAgICAgICAgcmV0dXJuIChpbmRleCAhPT0gLTEpXG4gICAgICAgICAgPyBbLi4uc3RhdGUuc2xpY2UoMCwgaW5kZXgpLCAuLi5zdGF0ZS5zbGljZShpbmRleCArIDEpXVxuICAgICAgICAgIDogc3RhdGVcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBzdGF0ZVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICBjYXNlIEZFVENIX0ZJTEVTX1NVQ0NFU1M6XG4gICAgICAgIGNvbnN0IHsgaXRlbXMgfSA9IGFjdGlvbi5wYXlsb2FkXG4gICAgICAgIHJldHVybiBpdGVtcy5tYXAoKGZpbGUpID0+IGZpbGUuYmFzZW5hbWUpXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gc3RhdGVcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICBieUJhc2VuYW1lOiB7fSxcbiAgYmFzZW5hbWVzOiBbXSxcblxuICBpc0ZldGNoaW5nOiBmYWxzZSxcbiAgcmVjZWl2ZWRBdDogbnVsbCxcbiAgZXJyb3I6IGZhbHNlLFxuICBlcnJvckNvZGU6IG51bGwsXG4gIGVycm9yTWVzc2FnZTogbnVsbFxufVxuZXhwb3J0IGNvbnN0IGl0ZW1zUmVkdWNlciA9IChzdGF0ZSA9IGluaXRpYWxTdGF0ZSwgYWN0aW9uKSA9PiB7XG4gIGlmICghYWN0aW9uLnBheWxvYWQpIHJldHVybiBzdGF0ZVxuICBjb25zdCB7IHBhdGhBcnJheSA9IFtdIH0gPSBhY3Rpb24ucGF5bG9hZFxuXG4gIGlmIChwYXRoQXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gVXBkYXRlIHRoaXMgbm9kZVxuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgRkVUQ0hfRklMRVNfUkVRVUVTVDpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBpc0ZldGNoaW5nOiB0cnVlLFxuICAgICAgICAgIGVycm9yOiBpbml0aWFsU3RhdGUuZXJyb3IsXG4gICAgICAgICAgZXJyb3JDb2RlOiBpbml0aWFsU3RhdGUuZXJyb3JDb2RlLFxuICAgICAgICAgIGVycm9yTWVzc2FnZTogaW5pdGlhbFN0YXRlLmVycm9yTWVzc2FnZVxuICAgICAgICB9XG4gICAgICBjYXNlIEZFVENIX0ZJTEVTX1NVQ0NFU1M6XG4gICAgICAgIGNvbnN0IHsgcmVjZWl2ZWRBdCB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBpc0ZldGNoaW5nOiBmYWxzZSxcbiAgICAgICAgICByZWNlaXZlZEF0LFxuICAgICAgICAgIGJ5QmFzZW5hbWU6IGZpbGVzQnlCYXNlbmFtZVJlZHVjZXIoc3RhdGUuYnlCYXNlbmFtZSwgYWN0aW9uKSxcbiAgICAgICAgICBiYXNlbmFtZXM6IGZpbGVzQmFzZW5hbWVzUmVkdWNlcihzdGF0ZS5iYXNlbmFtZXMsIGFjdGlvbiksXG4gICAgICAgICAgZXJyb3I6IGluaXRpYWxTdGF0ZS5lcnJvcixcbiAgICAgICAgICBlcnJvckNvZGU6IGluaXRpYWxTdGF0ZS5lcnJvckNvZGUsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBpbml0aWFsU3RhdGUuZXJyb3JNZXNzYWdlXG4gICAgICAgIH1cbiAgICAgIGNhc2UgRkVUQ0hfRklMRVNfRkFJTFVSRTpcbiAgICAgICAgY29uc3QgeyBlcnJvckNvZGUsIGVycm9yTWVzc2FnZSB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBpc0ZldGNoaW5nOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlXG4gICAgICAgIH1cbiAgICAgIGNhc2UgQ0xFQVJfRklMRVNfRVJST1I6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgZXJyb3I6IGluaXRpYWxTdGF0ZS5lcnJvcixcbiAgICAgICAgICBlcnJvckNvZGU6IGluaXRpYWxTdGF0ZS5lcnJvckNvZGUsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBpbml0aWFsU3RhdGUuZXJyb3JNZXNzYWdlXG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgYnlCYXNlbmFtZTogZmlsZXNCeUJhc2VuYW1lUmVkdWNlcihzdGF0ZS5ieUJhc2VuYW1lLCBhY3Rpb24pLFxuICAgICAgICAgIGJhc2VuYW1lczogZmlsZXNCYXNlbmFtZXNSZWR1Y2VyKHN0YXRlLmJhc2VuYW1lcywgYWN0aW9uKVxuICAgICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHBhdGhBcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBVcGRhdGUgYSBjaGlsZCBpdGVtXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgYnlCYXNlbmFtZTogZmlsZXNCeUJhc2VuYW1lUmVkdWNlcihzdGF0ZS5ieUJhc2VuYW1lLCBhY3Rpb24pLFxuICAgICAgYmFzZW5hbWVzOiBmaWxlc0Jhc2VuYW1lc1JlZHVjZXIoc3RhdGUuYmFzZW5hbWVzLCBhY3Rpb24pXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIEtlZXAgc2VhcmNoaW5nIHRoZSBub2RlXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgYnlCYXNlbmFtZTogZmlsZXNCeUJhc2VuYW1lUmVkdWNlcihzdGF0ZS5ieUJhc2VuYW1lLCBhY3Rpb24pXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGluaXRpYWxFcnJvcnNTdGF0ZSA9IHtcbiAgYnlQYXRoOiB7fSxcbiAgcGF0aHM6IFtdXG59XG5jb25zdCBjcmVhdGVFcnJvcnNSZWR1Y2VyID0gKHsgZmlsZUZhaWx1cmVUeXBlLCBjbGVhckZpbGVFcnJvclR5cGUgfSkgPT4ge1xuICByZXR1cm4gKHN0YXRlID0gaW5pdGlhbEVycm9yc1N0YXRlLCBhY3Rpb24pID0+IHtcbiAgICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgICBjYXNlIGZpbGVGYWlsdXJlVHlwZTpcbiAgICAgICAge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHBhdGgsIGVycm9yQ29kZTogY29kZSwgZXJyb3JNZXNzYWdlOiBtZXNzYWdlXG4gICAgICAgICAgfSA9IGFjdGlvbi5wYXlsb2FkXG4gICAgICAgICAgY29uc3QgcGF0aHNJbmRleCA9IHN0YXRlLnBhdGhzLmluZGV4T2YocGF0aClcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBieVBhdGg6IHtcbiAgICAgICAgICAgICAgLi4uc3RhdGUuYnlQYXRoLFxuICAgICAgICAgICAgICBbcGF0aF06IHsgY29kZSwgbWVzc2FnZSB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGF0aHM6IChwYXRoc0luZGV4ID09PSAtMSlcbiAgICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUucGF0aHMsXG4gICAgICAgICAgICAgICAgcGF0aFxuICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIDogW1xuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnBhdGhzLnNsaWNlKDAsIHBhdGhzSW5kZXgpLFxuICAgICAgICAgICAgICAgIC4uLnN0YXRlLnBhdGhzLnNsaWNlKHBhdGhzSW5kZXggKyAxKSxcbiAgICAgICAgICAgICAgICBwYXRoXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIGNhc2UgY2xlYXJGaWxlRXJyb3JUeXBlOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3QgeyBwYXRoIH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgICAgIGNvbnN0IHsgW3BhdGhdOiB0YXJnZXQsIC4uLnJlc3RCeVBhdGggfSA9IHN0YXRlLmJ5UGF0aFxuXG4gICAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybiBzdGF0ZVxuICAgICAgICAgIGNvbnN0IHBhdGhJbmRleCA9IHN0YXRlLnBhdGhzLmluZGV4T2YocGF0aClcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgICBieVBhdGg6IHJlc3RCeVBhdGgsXG4gICAgICAgICAgICBwYXRoczogW1xuICAgICAgICAgICAgICAuLi5zdGF0ZS5wYXRocy5zbGljZSgwLCBwYXRoSW5kZXgpLFxuICAgICAgICAgICAgICAuLi5zdGF0ZS5wYXRocy5zbGljZShwYXRoSW5kZXggKyAxKVxuICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHN0YXRlXG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGRvd25sb2FkRXJyb3JzUmVkdWNlciA9IGNyZWF0ZUVycm9yc1JlZHVjZXIoe1xuICBmaWxlRmFpbHVyZVR5cGU6IERPV05MT0FEX0ZJTEVfRkFJTFVSRSxcbiAgY2xlYXJGaWxlRXJyb3JUeXBlOiBDTEVBUl9ET1dOTE9BRF9GSUxFX0VSUk9SXG59KVxuXG5jb25zdCBkb3dubG9hZHNSZWR1Y2VyID0gKHN0YXRlID0geyBlcnJvcnM6IHVuZGVmaW5lZCB9LCBhY3Rpb24pID0+IHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgZXJyb3JzOiBkb3dubG9hZEVycm9yc1JlZHVjZXIoc3RhdGUuZXJyb3JzLCBhY3Rpb24pXG4gICAgICB9XG4gIH1cbn1cblxuY29uc3QgdXBsb2FkRXJyb3JzUmVkdWNlciA9IGNyZWF0ZUVycm9yc1JlZHVjZXIoe1xuICBmaWxlRmFpbHVyZVR5cGU6IFVQTE9BRF9GSUxFX0ZBSUxVUkUsXG4gIGNsZWFyRmlsZUVycm9yVHlwZTogQ0xFQVJfVVBMT0FEX0ZJTEVfRVJST1Jcbn0pXG5cbmNvbnN0IHVwbG9hZHNSZWR1Y2VyID0gKHN0YXRlID0geyBlcnJvcnM6IHVuZGVmaW5lZCB9LCBhY3Rpb24pID0+IHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgZXJyb3JzOiB1cGxvYWRFcnJvcnNSZWR1Y2VyKHN0YXRlLmVycm9ycywgYWN0aW9uKVxuICAgICAgfVxuICB9XG59XG5cbmNvbnN0IGluaXRpYWxNYWluU3RhdGUgPSB7XG4gIHBhdGhBcnJheTogW10sXG4gIHJvb3RJc1dpbjogZmFsc2UsXG4gIHJvb3RJc1Bvc2l4OiB0cnVlLFxuICByb290SXNSZWFkYWJsZTogZmFsc2UsXG4gIHJvb3RJc1dyaXRhYmxlOiBmYWxzZSxcbiAgaXRlbXM6IHVuZGVmaW5lZCxcbiAgZG93bmxvYWRzOiB1bmRlZmluZWQsXG4gIHVwbG9hZHM6IHVuZGVmaW5lZFxufVxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlID0gaW5pdGlhbE1haW5TdGF0ZSwgYWN0aW9uKSA9PiB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIENIQU5HRV9ESVJfRklMRVM6XG4gICAgICBjb25zdCB7IHBhdGhBcnJheSB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBwYXRoQXJyYXlcbiAgICAgIH1cbiAgICBjYXNlIEZFVENIX0ZJTEVTX1NVQ0NFU1M6XG4gICAgICBjb25zdCB7XG4gICAgICAgIHJvb3RJc1dpbiwgcm9vdElzUG9zaXgsIHJvb3RJc1JlYWRhYmxlLCByb290SXNXcml0YWJsZVxuICAgICAgfSA9IGFjdGlvbi5wYXlsb2FkXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgaXRlbXM6IGl0ZW1zUmVkdWNlcihzdGF0ZS5pdGVtcywgYWN0aW9uKSxcbiAgICAgICAgcm9vdElzV2luOiB0eXBlb2YgKHJvb3RJc1dpbikgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgPyByb290SXNXaW4gOiBzdGF0ZS5yb290SXNXaW4sXG4gICAgICAgIHJvb3RJc1Bvc2l4OiB0eXBlb2YgKHJvb3RJc1Bvc2l4KSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICA/IHJvb3RJc1Bvc2l4IDogc3RhdGUucm9vdElzUG9zaXgsXG4gICAgICAgIHJvb3RJc1JlYWRhYmxlOiB0eXBlb2YgKHJvb3RJc1JlYWRhYmxlKSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICA/IHJvb3RJc1JlYWRhYmxlIDogc3RhdGUucm9vdElzUmVhZGFibGUsXG4gICAgICAgIHJvb3RJc1dyaXRhYmxlOiB0eXBlb2YgKHJvb3RJc1dyaXRhYmxlKSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICA/IHJvb3RJc1dyaXRhYmxlIDogc3RhdGUucm9vdElzV3JpdGFibGVcbiAgICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGl0ZW1zOiBpdGVtc1JlZHVjZXIoc3RhdGUuaXRlbXMsIGFjdGlvbiksXG4gICAgICAgIGRvd25sb2FkczogZG93bmxvYWRzUmVkdWNlcihzdGF0ZS5kb3dubG9hZHMsIGFjdGlvbiksXG4gICAgICAgIHVwbG9hZHM6IHVwbG9hZHNSZWR1Y2VyKHN0YXRlLnVwbG9hZHMsIGFjdGlvbilcbiAgICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgY29tYmluZVJlZHVjZXJzIH0gZnJvbSAncmVkdXgnXG5pbXBvcnQgYXBwIGZyb20gJy4uL3JlZHVjZXJzL2FwcCdcbmltcG9ydCBhZ2VudCBmcm9tICcuLi9yZWR1Y2Vycy9hZ2VudCdcbmltcG9ydCB0ZXJtaW5hbCBmcm9tICcuLi9yZWR1Y2Vycy90ZXJtaW5hbCdcbmltcG9ydCBkaXNwbGF5IGZyb20gJy4uL3JlZHVjZXJzL2Rpc3BsYXknXG5pbXBvcnQgZmlsZXMgZnJvbSAnLi4vcmVkdWNlcnMvZmlsZXMnXG5cbmV4cG9ydCBkZWZhdWx0IGNvbWJpbmVSZWR1Y2Vycyh7XG4gIGFwcCxcbiAgYWdlbnQsXG4gIHRlcm1pbmFsLFxuICBkaXNwbGF5LFxuICBmaWxlc1xufSlcbiIsImltcG9ydCB7XG4gIEZFVENIX1NFQ1RJT05TX1JFUVVFU1QsIEZFVENIX1NFQ1RJT05TX1NVQ0NFU1MsIEZFVENIX1NFQ1RJT05TX0ZBSUxVUkUsXG4gIEZFVENIX1JFTU9URV9TRUNUSU9OX1JFUVVFU1QsIEZFVENIX1JFTU9URV9TRUNUSU9OX0VORCxcbiAgUkVTRVRfRklSU1RfQUNUSVZFX1NFQ1RJT04sIElORk9STV9SRU1PVEVfU0VDVElPTl9FTkQsXG4gIFVQREFURV9TRUNUSU9OLCBTRUxFQ1RfU0VDVElPTiwgRU5BQkxFX1NFQ1RJT04sIERJU0FCTEVfU0VDVElPTiwgQUxMT1dfU0VDVElPTixcbiAgUkVTRVRfQkxPQ0tfUkVRVUVTVFxufSBmcm9tICcuLi9jb25zdGFudHMvYXBwJ1xuXG5jb25zdCBzZWN0aW9uUmVkdWNlciA9IChzdGF0ZSA9IHtcbiAga2V5OiAnJyxcbiAgbmFtZTogJycsXG4gIGVuYWJsZWQ6IGZhbHNlLFxuICBibG9ja1JlcXVlc3Q6IGZhbHNlLFxuICBhbGxvdzogZmFsc2UsXG4gIGluZm9ybTogZmFsc2Vcbn0sIGFjdGlvbikgPT4ge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBFTkFCTEVfU0VDVElPTjpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBlbmFibGVkOiB0cnVlXG4gICAgICB9KVxuICAgIGNhc2UgRElTQUJMRV9TRUNUSU9OOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBhbGxvdzogZmFsc2VcbiAgICAgIH0pXG4gICAgY2FzZSBVUERBVEVfU0VDVElPTjpcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBlbmFibGVkOiBkYXRhLmVuYWJsZWQsXG4gICAgICAgIGFsbG93OiBkYXRhLmFsbG93LFxuICAgICAgICBpbmZvcm06IGRhdGEuaW5mb3JtXG4gICAgICB9KVxuICAgIGNhc2UgQUxMT1dfU0VDVElPTjpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwgeyBhbGxvdzogdHJ1ZSB9KVxuICAgIGNhc2UgUkVTRVRfQkxPQ0tfUkVRVUVTVDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBibG9ja1JlcXVlc3Q6IGZhbHNlLFxuICAgICAgICBmZXRjaGluZ1JlbW90ZTogZmFsc2VcbiAgICAgIH0pXG4gICAgY2FzZSBGRVRDSF9SRU1PVEVfU0VDVElPTl9SRVFVRVNUOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGZldGNoaW5nUmVtb3RlOiB0cnVlLFxuICAgICAgICBibG9ja1JlcXVlc3Q6IHRydWVcbiAgICAgIH0pXG4gICAgY2FzZSBGRVRDSF9SRU1PVEVfU0VDVElPTl9FTkQ6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgZmV0Y2hpbmdSZW1vdGU6IGZhbHNlXG4gICAgICB9KVxuICAgIGNhc2UgSU5GT1JNX1JFTU9URV9TRUNUSU9OX0VORDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpbmZvcm06IGZhbHNlLFxuICAgICAgICBhbGxvdzogdHJ1ZVxuICAgICAgfSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlXG4gIH1cbn1cblxuY29uc3Qgc2VjdGlvbnNCeUtleVJlZHVjZXIgPSAoc3RhdGUgPSB7XG4gICd0ZXJtaW5hbCc6IHtcbiAgICBrZXk6ICd0ZXJtaW5hbCcsXG4gICAgbmFtZTogJ1Rlcm1pbmFsJyxcbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgICBibG9ja1JlcXVlc3Q6IGZhbHNlLFxuICAgIGFsbG93OiBmYWxzZSxcbiAgICBmZXRjaGluZ1JlbW90ZTogZmFsc2UsXG4gICAgaW5mb3JtOiBmYWxzZVxuICB9LFxuICAnZGlzcGxheSc6IHtcbiAgICBrZXk6ICdkaXNwbGF5JyxcbiAgICBuYW1lOiAnRGlzcGxheScsXG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgYmxvY2tSZXF1ZXN0OiBmYWxzZSxcbiAgICBhbGxvdzogZmFsc2UsXG4gICAgZmV0Y2hpbmdSZW1vdGU6IGZhbHNlLFxuICAgIGluZm9ybTogZmFsc2VcbiAgfSxcbiAgJ3Byb2Nlc3Nlcyc6IHtcbiAgICBrZXk6ICdwcm9jZXNzZXMnLFxuICAgIG5hbWU6ICdQcm9jZXNzZXMnLFxuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIGJsb2NrUmVxdWVzdDogZmFsc2UsXG4gICAgYWxsb3c6IGZhbHNlLFxuICAgIGZldGNoaW5nUmVtb3RlOiBmYWxzZSxcbiAgICBpbmZvcm06IGZhbHNlXG4gIH0sXG4gICdzZXJ2aWNlcyc6IHtcbiAgICBrZXk6ICdzZXJ2aWNlcycsXG4gICAgbmFtZTogJ1NlcnZpY2VzJyxcbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgICBibG9ja1JlcXVlc3Q6IGZhbHNlLFxuICAgIGFsbG93OiBmYWxzZSxcbiAgICBmZXRjaGluZ1JlbW90ZTogZmFsc2UsXG4gICAgaW5mb3JtOiBmYWxzZVxuICB9LFxuICAnZmlsZXMnOiB7XG4gICAga2V5OiAnZmlsZXMnLFxuICAgIG5hbWU6ICdGaWxlcycsXG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgYmxvY2tSZXF1ZXN0OiBmYWxzZSxcbiAgICBhbGxvdzogZmFsc2UsXG4gICAgZmV0Y2hpbmdSZW1vdGU6IGZhbHNlLFxuICAgIGluZm9ybTogZmFsc2VcbiAgfSxcbiAgJ3NoYXJlJzoge1xuICAgIGtleTogJ3NoYXJlJyxcbiAgICBuYW1lOiAnU2hhcmUnLFxuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIGJsb2NrUmVxdWVzdDogZmFsc2UsXG4gICAgYWxsb3c6IGZhbHNlLFxuICAgIGZldGNoaW5nUmVtb3RlOiBmYWxzZSxcbiAgICBpbmZvcm06IGZhbHNlXG4gIH1cbn0sIGFjdGlvbikgPT4ge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBGRVRDSF9TRUNUSU9OU19TVUNDRVNTOlxuICAgICAgY29uc3QgeyBpdGVtcyB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgIGxldCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKVxuICAgICAgaXRlbXMuZm9yRWFjaCgoc2VjdGlvbikgPT4ge1xuICAgICAgICBuZXdTdGF0ZVtzZWN0aW9uLmtleV0gPSBzZWN0aW9uUmVkdWNlcihzdGF0ZVtzZWN0aW9uLmtleV0sIHtcbiAgICAgICAgICB0eXBlOiBVUERBVEVfU0VDVElPTixcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBkYXRhOiBzZWN0aW9uXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICAgIGl0ZW1zLmZvckVhY2goKHNlY3Rpb24pID0+IHtcbiAgICAgICAgbmV3U3RhdGVbc2VjdGlvbi5rZXldID0gc2VjdGlvblJlZHVjZXIobmV3U3RhdGVbc2VjdGlvbi5rZXldLCB7XG4gICAgICAgICAgdHlwZTogUkVTRVRfQkxPQ0tfUkVRVUVTVCxcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBkYXRhOiBzZWN0aW9uXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICAgIHJldHVybiBuZXdTdGF0ZVxuICAgIGNhc2UgRU5BQkxFX1NFQ1RJT046XG4gICAgY2FzZSBESVNBQkxFX1NFQ1RJT046XG4gICAgY2FzZSBVUERBVEVfU0VDVElPTjpcbiAgICBjYXNlIEFMTE9XX1NFQ1RJT046XG4gICAgY2FzZSBSRVNFVF9CTE9DS19SRVFVRVNUOlxuICAgIGNhc2UgRkVUQ0hfUkVNT1RFX1NFQ1RJT05fUkVRVUVTVDpcbiAgICBjYXNlIEZFVENIX1JFTU9URV9TRUNUSU9OX0VORDpcbiAgICBjYXNlIElORk9STV9SRU1PVEVfU0VDVElPTl9FTkQ6XG4gICAgICBjb25zdCB7IGtleSB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBba2V5XTogc2VjdGlvblJlZHVjZXIoc3RhdGVba2V5XSwgYWN0aW9uKVxuICAgICAgfSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlXG4gIH1cbn1cblxuY29uc3Qgc2VjdGlvbnNLZXlzUmVkdWNlciA9IChzdGF0ZSA9IFtcbiAgJ3Rlcm1pbmFsJywgJ2Rpc3BsYXknLCAncHJvY2Vzc2VzJywgJ3NlcnZpY2VzJywgJ2ZpbGVzJywgJ3NoYXJlJ1xuXSwgYWN0aW9uKSA9PiB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIEZFVENIX1NFQ1RJT05TX1NVQ0NFU1M6XG4gICAgICByZXR1cm4gc3RhdGVcbiAgICAgIC8vIGNvbnN0IHsgaXRlbXMgfSA9IGFjdGlvbi5wYXlsb2FkXG4gICAgICAvLyByZXR1cm4gaXRlbXMubWFwKChzZWN0aW9uKSA9PiBzZWN0aW9uLmtleSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldEFjdGl2ZVNlY3Rpb24gPSAoc3RhdGUpID0+IHtcbiAgY29uc3QgYWN0aXZlS2V5ID0gc3RhdGUuYWN0aXZlXG4gIGlmIChhY3RpdmVLZXkgJiYgc3RhdGUuYnlLZXlbYWN0aXZlS2V5XSkge1xuICAgIGNvbnN0IGFjdGl2ZVNlY3Rpb24gPSBzdGF0ZS5ieUtleVthY3RpdmVLZXldXG4gICAgaWYgKGFjdGl2ZVNlY3Rpb24uZW5hYmxlZCkgcmV0dXJuIGFjdGl2ZUtleVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBnZXRTZWN0aW9uID0gKHN0YXRlLCBrZXkpID0+IHtcbiAgcmV0dXJuIHN0YXRlLmJ5S2V5W2tleV1cbn1cblxuZXhwb3J0IGNvbnN0IGdldFNlY3Rpb25zID0gKHN0YXRlKSA9PiB7XG4gIHJldHVybiBzdGF0ZS5rZXlzLm1hcCgoa2V5KSA9PiBnZXRTZWN0aW9uKHN0YXRlLCBrZXkpKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Rmlyc3RBY3RpdmUgPSAoc3RhdGUpID0+IHtcbiAgcmV0dXJuIHN0YXRlLmZpcnN0QWN0aXZlXG59XG5cbmV4cG9ydCBkZWZhdWx0IChzdGF0ZSA9IHtcbiAgYWN0aXZlOiBudWxsLFxuICBmaXJzdEFjdGl2ZTogbnVsbCxcbiAgaXNGZXRjaGluZzogZmFsc2UsXG4gIHJlY2VpdmVkQXQ6IG51bGwsXG4gIGVycm9yOiBmYWxzZSxcbiAgZXJyb3JDb2RlOiBudWxsLFxuICBlcnJvck1lc3NhZ2U6IG51bGxcbn0sIGFjdGlvbikgPT4ge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBTRUxFQ1RfU0VDVElPTjpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBhY3RpdmU6IGFjdGlvbi5wYXlsb2FkLmtleVxuICAgICAgfSlcbiAgICBjYXNlIEZFVENIX1NFQ1RJT05TX1JFUVVFU1Q6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgaXNGZXRjaGluZzogdHJ1ZVxuICAgICAgfSlcbiAgICBjYXNlIEZFVENIX1NFQ1RJT05TX0ZBSUxVUkU6XG4gICAgICBjb25zdCB7IGVycm9yQ29kZSwgZXJyb3JNZXNzYWdlIH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGlzRmV0Y2hpbmc6IGZhbHNlLFxuICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICBlcnJvck1lc3NhZ2VcbiAgICAgIH0pXG4gICAgY2FzZSBGRVRDSF9TRUNUSU9OU19TVUNDRVNTOlxuICAgICAgY29uc3QgeyByZWNlaXZlZEF0IH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGlzRmV0Y2hpbmc6IHRydWUsXG4gICAgICAgIHJlY2VpdmVkQXQsXG4gICAgICAgIGJ5S2V5OiBzZWN0aW9uc0J5S2V5UmVkdWNlcihzdGF0ZS5ieUtleSwgYWN0aW9uKSxcbiAgICAgICAga2V5czogc2VjdGlvbnNLZXlzUmVkdWNlcihzdGF0ZS5rZXlzLCBhY3Rpb24pXG4gICAgICB9KVxuICAgIGNhc2UgUkVTRVRfRklSU1RfQUNUSVZFX1NFQ1RJT046XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgZmlyc3RBY3RpdmU6IG51bGxcbiAgICAgIH0pXG4gICAgY2FzZSBFTkFCTEVfU0VDVElPTjpcbiAgICBjYXNlIERJU0FCTEVfU0VDVElPTjpcbiAgICBjYXNlIEFMTE9XX1NFQ1RJT046XG4gICAgY2FzZSBGRVRDSF9SRU1PVEVfU0VDVElPTl9SRVFVRVNUOlxuICAgIGNhc2UgRkVUQ0hfUkVNT1RFX1NFQ1RJT05fRU5EOlxuICAgIGNhc2UgUkVTRVRfQkxPQ0tfUkVRVUVTVDpcbiAgICBjYXNlIElORk9STV9SRU1PVEVfU0VDVElPTl9FTkQ6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBieUtleTogc2VjdGlvbnNCeUtleVJlZHVjZXIoc3RhdGUuYnlLZXksIGFjdGlvbiksXG4gICAgICAgIGtleXM6IHNlY3Rpb25zS2V5c1JlZHVjZXIoc3RhdGUua2V5cywgYWN0aW9uKVxuICAgICAgfSlcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgUkVTRVRfVEVSTV9TVEFURSxcbiAgSU5JVF9URVJNX1JFUVVFU1QsXG4gIElOSVRfVEVSTV9TVUNDRVNTLFxuICBJTklUX1RFUk1fRkFJTFVSRSxcbiAgU0FWRV9URVJNX0RBVEEsXG4gIENMRUFSX1RFUk1fRVJST1Jcbn0gZnJvbSAnLi4vY29uc3RhbnRzL3Rlcm1pbmFsJ1xuXG5jb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gIGNvbHM6IDgwLFxuICByb3dzOiAyNCxcbiAgaXNJbml0aWFsaXppbmc6IGZhbHNlLFxuICBpc0luaXRpYWxpemVkOiBmYWxzZSxcbiAgaW5pdGlhbGl6ZWRBdDogbnVsbCxcbiAgZXJyb3I6IGZhbHNlLFxuICBlcnJvckNvZGU6IG51bGwsXG4gIGVycm9yTWVzc2FnZTogbnVsbCxcbiAgbmV3RGF0YTogbnVsbCxcbiAgZGF0YVJldmVpdmVkQXQ6IG51bGxcbn1cblxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24pID0+IHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgUkVTRVRfVEVSTV9TVEFURTpcbiAgICAgIHJldHVybiB7IC4uLmluaXRpYWxTdGF0ZSB9XG4gICAgY2FzZSBJTklUX1RFUk1fUkVRVUVTVDpcbiAgICAgIGNvbnN0IHsgY29scywgcm93cyB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc0luaXRpYWxpemluZzogdHJ1ZSxcbiAgICAgICAgaXNJbml0aWFsaXplZDogZmFsc2UsXG4gICAgICAgIGNvbHMsXG4gICAgICAgIHJvd3NcbiAgICAgIH0pXG4gICAgY2FzZSBJTklUX1RFUk1fU1VDQ0VTUzpcbiAgICAgIGNvbnN0IHsgaW5pdGlhbGl6ZWRBdCB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc0luaXRpYWxpemluZzogZmFsc2UsXG4gICAgICAgIGlzSW5pdGlhbGl6ZWQ6IHRydWUsXG4gICAgICAgIGluaXRpYWxpemVkQXRcbiAgICAgIH0pXG4gICAgY2FzZSBJTklUX1RFUk1fRkFJTFVSRTpcbiAgICAgIGNvbnN0IHsgZXJyb3JDb2RlLCBlcnJvck1lc3NhZ2UgfSA9IGFjdGlvbi5wYXlsb2FkXG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgaXNJbml0aWFsaXppbmc6IGZhbHNlLFxuICAgICAgICBpc0luaXRpYWxpemVkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHRydWUsXG4gICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgZXJyb3JNZXNzYWdlXG4gICAgICB9KVxuICAgIGNhc2UgU0FWRV9URVJNX0RBVEE6XG4gICAgICBjb25zdCB7IG5ld0RhdGEsIGRhdGFSZXZlaXZlZEF0IH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIG5ld0RhdGEsXG4gICAgICAgIGRhdGFSZXZlaXZlZEF0XG4gICAgICB9KVxuICAgIGNhc2UgQ0xFQVJfVEVSTV9FUlJPUjpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBlcnJvcjogZmFsc2UsXG4gICAgICAgIGVycm9yQ29kZTogbnVsbCxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBudWxsXG4gICAgICB9KVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGVcbiAgfVxufVxuIiwiaW1wb3J0IHsgZGVmaW5lTWVzc2FnZXMgfSBmcm9tICdyZWFjdC1pbnRsJ1xuXG5pbXBvcnQgTG9nZ2VyIGZyb20gJy4uL2NvbW1vbi9saWIvTG9nZ2VyJ1xuaW1wb3J0IHsgYmFzZTY0RGVjVG9BcnIgfSBmcm9tICcuLi9jb21tb24vbGliL2Jhc2U2NCdcblxuaW1wb3J0IHsgUFJPVE8gfSBmcm9tICcuLi9jb25zdGFudHMnXG5pbXBvcnQge1xuICBFUlJPUl9GRVRDSCwgRVJST1JfREVMRVRJT04sIEVSUk9SX0RPV05MT0FELCBFUlJPUl9VUExPQURcbn0gZnJvbSAnLi4vY29uc3RhbnRzL2ZpbGVzJ1xuXG5pbXBvcnQge1xuICBmZXRjaEZpbGVzU3VjY2VzcywgZmV0Y2hGaWxlc0ZhaWx1cmUsXG4gIGRlbGV0ZUZpbGVTdWNjZXNzLCBkZWxldGVGaWxlRmFpbHVyZSxcbiAgZG93bmxvYWRGaWxlRmFpbHVyZSwgdXBsb2FkRmlsZUZhaWx1cmUsXG4gIHJlcXVlc3RDaHVuaywgc2VuZENodW5rXG59IGZyb20gJy4uL2FjdGlvbnMvZmlsZXMnXG5cbmltcG9ydCBEaXJJdGVtIGZyb20gJy4uL2xpYi9maWxlcy9kaXItaXRlbSdcbmltcG9ydCBGaWxlc0Rvd25sb2FkQ29udHJvbGxlciBmcm9tICcuLi9saWIvZmlsZXMvZmlsZXMtZG93bmxvYWQtY29udHJvbGxlcidcbmltcG9ydCBGaWxlc1VwbG9hZENvbnRyb2xsZXIgZnJvbSAnLi4vbGliL2ZpbGVzL2ZpbGVzLXVwbG9hZC1jb250cm9sbGVyJ1xuaW1wb3J0IGdldFBhdGhQYXJzZXIsIHsgTU9ERV9QT1NJWCwgTU9ERV9XSU4gfSBmcm9tICcuLi9saWIvZmlsZXMvcGF0aC1wYXJzZXInXG5pbXBvcnQgdG9QYXRoQXJyYXkgZnJvbSAnLi4vbGliL2ZpbGVzL3BhdGgtYXJyYXknXG5cbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoeyBzZWN0aW9uOiAnRmlsZXMgcmVzcG9uc2UnIH0pXG5cbmNvbnN0IG1lc3NhZ2VzID0gZGVmaW5lTWVzc2FnZXMoe1xuICBlcnJvckRpcmVjdG9yeToge1xuICAgIGlkOiAnZXJyb3ItZmVjaGluZy1yb290JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0Vycm9yIG9wZW5pbmcgdGhlIGRpcmVjdG9yeToge3BhdGh9JyxcbiAgICB2YWx1ZXM6IHtcbiAgICAgIHBhdGg6ICctJ1xuICAgIH1cbiAgfSxcbiAgZXJyb3JSb290OiB7XG4gICAgaWQ6ICdlcnJvci1mZWNoaW5nLWRpcicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdFcnJvciBvcGVuaW5nIHRoZSByb290IGRpcmVjdG9yeSdcbiAgfSxcbiAgZXJyb3JVcGxvYWQ6IHtcbiAgICBpZDogJ2Vycm9yLXVwbG9hZC1maWxlJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1VwbG9hZCBmYWlsZWQgKHtwYXRofSknLFxuICAgIHZhbHVlczoge1xuICAgICAgcGF0aDogJy0nXG4gICAgfVxuICB9LFxuICBlcnJvckRvd25sb2FkOiB7XG4gICAgaWQ6ICdlcnJvci1kb3dubG9hZC1maWxlJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0Rvd25sb2FkIGZhaWxlZCAoe3BhdGh9KScsXG4gICAgdmFsdWVzOiB7XG4gICAgICBwYXRoOiAnLSdcbiAgICB9XG4gIH0sXG4gIGVycm9yRGVsZXRpbmc6IHtcbiAgICBpZDogJ2Vycm9yLWRlbGV0aW5nLWZpbGUnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRXJyb3IgZGVsZXRpbmcgdGhlIGZpbGUge3BhdGh9JyxcbiAgICB2YWx1ZXM6IHtcbiAgICAgIHBhdGg6ICdOL0EnXG4gICAgfVxuICB9XG59KVxuXG5leHBvcnQgZGVmYXVsdCAocmVtb3RlLCBkaXNwYXRjaCwgaW50bCkgPT4ge1xuICAvLyBCaW5kIHRoZSBmaWxlcyB1cGxvYWQgc3RhdGUgdG8gdGhlIGZpbGVzIHN0b3JlXG4gIC8vIEZpbGVzVXBsb2FkQ29udHJvbGxlci5vbignZmlsZScsIChwYXRoLCBmaWxlVXBsb2FkKSA9PiB7XG4gIC8vICAgRmlsZXNBY3Rpb25zLnVwZGF0ZUZpbGVVcGxvYWQocGF0aCwgZmlsZVVwbG9hZClcbiAgLy8gfSlcblxuICAvLyBBZGQgdGhlIGFjdGlvbiB0byByZXF1ZXN0IG5ldyBjaHVua3MgdG8gdGhlIGZpbGVzIGRvd25sb2FkIGNvbnRyb2xsZXJcbiAgRmlsZXNEb3dubG9hZENvbnRyb2xsZXIucmVxdWVzdENodW5rQWN0aW9uID0gcmVxdWVzdENodW5rXG4gIC8vIEFkZCB0aGUgYWN0aW9uIHRvIHNlbmQgbmV3IGNodW5rcyB0byB0aGUgZmlsZXMgdXBsb2FkIGNvbnRyb2xsZXJcbiAgRmlsZXNVcGxvYWRDb250cm9sbGVyLnNlbmRDaHVua0FjdGlvbiA9IHNlbmRDaHVua1xuXG4gIC8vIEhhbmRsZSB0aGUgd3MgY29ubmVjdGlvbiBldmVudHNcbiAgcmVtb3RlLm9uT3BlbigoZXZlbnQpID0+IHtcbiAgICBGaWxlc1VwbG9hZENvbnRyb2xsZXIuc3RhcnRVcGxvYWRzKClcbiAgICBGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5zdGFydERvd25sb2FkcygpXG4gIH0pXG4gIHJlbW90ZS5vbkNsb3NlKChldmVudCkgPT4ge1xuICAgIEZpbGVzVXBsb2FkQ29udHJvbGxlci5wYXVzZVVwbG9hZHMoKVxuICAgIEZpbGVzRG93bmxvYWRDb250cm9sbGVyLnBhdXNlRG93bmxvYWRzKClcbiAgfSlcbiAgcmVtb3RlLm9uQ2xvc2luZygoZXZlbnQpID0+IHtcbiAgICAvLyBUaGlzIGlzIGEgbWFudWFsIGNsb3NlXG4gICAgRmlsZXNVcGxvYWRDb250cm9sbGVyLnN0b3BVcGxvYWRzKClcbiAgICBGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5zdG9wRG93bmxvYWRzKClcbiAgfSlcbiAgcmVtb3RlLm9uKFBST1RPLkZJTEVTLCAocmVzcG9uc2UpID0+IHtcbiAgICAvLyBkYXRhIHNob3VsZCBiZSBhIEpTT05cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlLnRvSlNPTigpXG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YS5hY3Rpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIGFjdGlvbiBvbiBtZXNzYWdlJylcbiAgICAgIH1cblxuICAgICAgLy8gbG9nZ2VyLmluZm8oJ1tQUk9UTy5GSUxFU10nLCBkYXRhKVxuXG4gICAgICBzd2l0Y2ggKGRhdGEuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgJ2xzJzpcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGEuc3RhdHVzICE9PSAndW5kZWZpbmVkJyAmJiAhZGF0YS5zdGF0dXMpIHtcbiAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcigpXG4gICAgICAgICAgICBlcnJvci5yZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgc3RhdHVzOiBFUlJPUl9GRVRDSCxcbiAgICAgICAgICAgICAgc3RhdHVzVGV4dDogdHlwZW9mIGRhdGEucGF0aCA9PT0gJ3N0cmluZycgJiYgZGF0YS5wYXRoLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IGludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5lcnJvckRpcmVjdG9yeSwgeyBwYXRoOiBkYXRhLnBhdGggfSlcbiAgICAgICAgICAgICAgICA6IGludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5lcnJvclJvb3QpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNwYXRjaChmZXRjaEZpbGVzRmFpbHVyZShkYXRhLnBhdGgsIGVycm9yKSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIHBhdGhcbiAgICAgICAgICAgICAgdHlwZW9mIGRhdGEucGF0aCAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBsaXN0XG4gICAgICAgICAgICAgIHR5cGVvZiBkYXRhLmxpc3QgIT09ICdvYmplY3QnIHx8XG4gICAgICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgdGltZXN0YW1wXG4gICAgICAgICAgICAgIHR5cGVvZiBkYXRhLnRpbWVzdGFtcCA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBvc1xuICAgICAgICAgICAgICB0eXBlb2YgZGF0YS5vcyAhPT0gJ3N0cmluZydcbiAgICAgICAgICAgICkgdGhyb3cgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyIG9uIG1lc3NhZ2UnKVxuXG4gICAgICAgICAgICBjb25zdCBjYW5CZURlbGV0ZWQgPSAodHlwZW9mIGRhdGEuZmlsZURlbGV0ZSAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgID8gISFOdW1iZXIucGFyc2VJbnQoZGF0YS5maWxlRGVsZXRlLCAxMClcbiAgICAgICAgICAgICAgOiBmYWxzZVxuXG4gICAgICAgICAgICBjb25zdCBpc1dpbiA9IGRhdGEub3MudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnd2luJykgJiZcbiAgICAgICAgICAgICAgIWRhdGEub3MudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZGFyd2luJylcbiAgICAgICAgICAgIGNvbnN0IGlzUG9zaXggPSAhaXNXaW5cbiAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJzZXIgPSBnZXRQYXRoUGFyc2VyKGlzV2luID8gTU9ERV9XSU4gOiBNT0RFX1BPU0lYKVxuICAgICAgICAgICAgLy8gR2V0IHJpZCBvZiBtaXhlZCBzZXBhcmF0b3JzXG4gICAgICAgICAgICBjb25zdCByZXBsYWNlTWl4ZWRTZXAgPSAocCkgPT4gaXNXaW4gPyBwLnJlcGxhY2UoL1xcLy8sICdcXFxcJykgOiBwXG4gICAgICAgICAgICBjb25zdCBkaXJuYW1lID0gcmVwbGFjZU1peGVkU2VwKGRhdGEucGF0aClcbiAgICAgICAgICAgIGNvbnN0IGpvaW5QYXRoID0gKGJhc2VuYW1lKSA9PiByZXBsYWNlTWl4ZWRTZXAocGF0aFBhcnNlci5qb2luKGRpcm5hbWUsIGJhc2VuYW1lKSlcblxuICAgICAgICAgICAgY29uc3QgcGFyc2VGaWxlcyA9IChpdGVtcykgPT4gaXRlbXMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgICAgICBzZXBhcmF0b3I6IHBhdGhQYXJzZXIuc2VwLFxuICAgICAgICAgICAgICBwYXRoOiBqb2luUGF0aChpdGVtWydmaWxlX25hbWUnXSksXG4gICAgICAgICAgICAgIGRpcm5hbWUsXG4gICAgICAgICAgICAgIGJhc2VuYW1lOiBpdGVtWydmaWxlX25hbWUnXSxcbiAgICAgICAgICAgICAgbGFzdE1vZGlmaWNhdGlvbjogaXRlbVsnbXRpbWUnXSxcbiAgICAgICAgICAgICAgaXNGaWxlOiAhaXRlbVsnaXNfZGlyJ10gJiYgIWl0ZW1bJ2lzX2RyaXZlJ10sXG4gICAgICAgICAgICAgIG1pbWVUeXBlOiBpdGVtWydtaW1lX3R5cGUnXSxcbiAgICAgICAgICAgICAgc2l6ZTogaXRlbVsnZmlsZV9zaXplJ10sXG4gICAgICAgICAgICAgIGNhbkJlRGVsZXRlZCxcbiAgICAgICAgICAgICAgaXNEaXI6ICEhaXRlbVsnaXNfZGlyJ10sXG4gICAgICAgICAgICAgIGlzRHJpdmU6ICEhaXRlbVsnaXNfZHJpdmUnXSxcbiAgICAgICAgICAgICAgaXNXcml0YWJsZTogISFpdGVtWyd3cml0YWJsZSddLFxuICAgICAgICAgICAgICBpc1JlYWRhYmxlOiAhIWl0ZW1bJ3JlYWRhYmxlJ10sXG4gICAgICAgICAgICAgIGlzUG9zaXgsXG4gICAgICAgICAgICAgIGlzV2luXG4gICAgICAgICAgICB9KSlcblxuICAgICAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKVxuXG4gICAgICAgICAgICBjb25zdCBwYXRoQXJyYXkgPSB0b1BhdGhBcnJheShkaXJuYW1lLCBpc1dpbiA/IE1PREVfV0lOIDogTU9ERV9QT1NJWClcbiAgICAgICAgICAgIGNvbnN0IHJvb3REYXRhID0gcGF0aEFycmF5Lmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICByb290SXNXaW46IGlzV2luLFxuICAgICAgICAgICAgICAgIHJvb3RJc1Bvc2l4OiBpc1Bvc2l4LFxuICAgICAgICAgICAgICAgIHJvb3RJc1JlYWRhYmxlOiAhIWRhdGEucmVhZGFibGUsXG4gICAgICAgICAgICAgICAgcm9vdElzV3JpdGFibGU6ICEhZGF0YS53cml0YWJsZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDoge31cblxuICAgICAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICAgIGZldGNoRmlsZXNTdWNjZXNzKGRpcm5hbWUsIHBhcnNlRmlsZXMoZGF0YS5saXN0KSwgbm93LCByb290RGF0YSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlICd1cGxvYWQnOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgZGlyX25hbWVcbiAgICAgICAgICAgIHR5cGVvZiBkYXRhLmRpcl9uYW1lICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBmaWxlX25hbWVcbiAgICAgICAgICAgIHR5cGVvZiBkYXRhLmZpbGVfbmFtZSAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgdGltZXN0YW1wXG4gICAgICAgICAgICB0eXBlb2YgZGF0YS50aW1lc3RhbXAgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIG9zXG4gICAgICAgICAgICB0eXBlb2YgZGF0YS5vcyAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgc3RhdHVzXG4gICAgICAgICAgICB0eXBlb2YgZGF0YS5zdGF0dXMgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIG9mZnNldFxuICAgICAgICAgICAgKGRhdGEuc3RhdHVzICYmIHR5cGVvZiBkYXRhLm9mZnNldCAhPT0gJ251bWJlcicpXG4gICAgICAgICAgKSB0aHJvdyBFcnJvcignTWlzc2luZyBwYXJhbWV0ZXIgb24gbWVzc2FnZScpXG5cbiAgICAgICAgICAvLyBVc2UgYSBuZXcgc2NvcGUgYmxvY2tcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBkaXIgPSBuZXcgRGlySXRlbShkYXRhLmRpcl9uYW1lLCB7fSwgZGF0YS5vcylcbiAgICAgICAgICAgIC8vIEZpeCB0aGUgcGF0aCBub3cgd2UgaGF2ZSB0aGUgb3MgdHlwZVxuICAgICAgICAgICAgY29uc3QgcGF0aCA9IChkaXIucGF0aC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICA/IGRpci5wYXRoICsgZGlyLnNlcGFyYXRvciArIGRhdGEuZmlsZV9uYW1lXG4gICAgICAgICAgICAgIDogZGF0YS5maWxlX25hbWVcblxuICAgICAgICAgICAgaWYgKCFkYXRhLnN0YXR1cykge1xuICAgICAgICAgICAgICBGaWxlc1VwbG9hZENvbnRyb2xsZXIucmVtb3ZlRmlsZShwYXRoKVxuICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoKVxuICAgICAgICAgICAgICBlcnJvci5yZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IEVSUk9SX1VQTE9BRCxcbiAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiBpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuZXJyb3JVcGxvYWQsIHsgcGF0aCB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRpc3BhdGNoKHVwbG9hZEZpbGVGYWlsdXJlKHBhdGgsIGVycm9yKSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIEZpbGVzVXBsb2FkQ29udHJvbGxlci51cGRhdGVGaWxlT2Zmc2V0KFxuICAgICAgICAgICAgICAgIHBhdGgsIGRhdGEub2Zmc2V0LCBkYXRhLnRpbWVzdGFtcFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSAnZG93bmxvYWQnOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgZGlyX25hbWVcbiAgICAgICAgICAgIHR5cGVvZiBkYXRhLmRpcl9uYW1lICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBmaWxlX25hbWVcbiAgICAgICAgICAgIHR5cGVvZiBkYXRhLmZpbGVfbmFtZSAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgdGltZXN0YW1wXG4gICAgICAgICAgICB0eXBlb2YgZGF0YS50aW1lc3RhbXAgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIG9zXG4gICAgICAgICAgICB0eXBlb2YgZGF0YS5vcyAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgc2l6ZVxuICAgICAgICAgICAgdHlwZW9mIGRhdGEuc2l6ZSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICApIHRocm93IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlciBvbiBtZXNzYWdlJylcblxuICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgb2Zmc2V0XG4gICAgICAgICAgLy8gaWYgKHR5cGVvZiBkYXRhLm9mZnNldCAhPT0gJ251bWJlcicpXG4gICAgICAgICAgLy8gICB0aHJvdyBFcnJvcignTWlzc2luZyBwYXJhbWV0ZXIgb24gbWVzc2FnZScpXG4gICAgICAgICAgLy8gT0ZGU0VUIE1JU1NJTkchISFcblxuICAgICAgICAgIC8vIFVzZSBhIG5ldyBzY29wZSBibG9ja1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGRpciA9IG5ldyBEaXJJdGVtKGRhdGEuZGlyX25hbWUsIHt9LCBkYXRhLm9zKVxuICAgICAgICAgICAgLy8gRml4IHRoZSBwYXRoIG5vdyB3ZSBoYXZlIHRoZSBvcyB0eXBlXG4gICAgICAgICAgICBjb25zdCBwYXRoID0gKGRpci5wYXRoLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgID8gZGlyLnBhdGggKyBkaXIuc2VwYXJhdG9yICsgZGF0YS5maWxlX25hbWVcbiAgICAgICAgICAgICAgOiBkYXRhLmZpbGVfbmFtZVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEuc3RhdHVzICE9PSAndW5kZWZpbmVkJyAmJiAhZGF0YS5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgRmlsZXNEb3dubG9hZENvbnRyb2xsZXIucmVtb3ZlRmlsZShwYXRoKVxuICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoKVxuICAgICAgICAgICAgICBlcnJvci5yZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IEVSUk9SX0RPV05MT0FELFxuICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IGludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5lcnJvckRvd25sb2FkLCB7IHBhdGggfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkaXNwYXRjaChkb3dubG9hZEZpbGVGYWlsdXJlKHBhdGgsIGVycm9yKSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRhdGEuY2h1bmsgPSBiYXNlNjREZWNUb0FycihkYXRhLmNodW5rKVxuXG4gICAgICAgICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IE51bWJlci5wYXJzZUludChkYXRhLnNpemUsIDEwKVxuICAgICAgICAgICAgICBGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5zYXZlQ2h1bmsoXG4gICAgICAgICAgICAgICAgcGF0aCwgZGF0YS5jaHVuaywgZGF0YS5vZmZzZXQsIGNodW5rU2l6ZVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBzdGF0dXNcbiAgICAgICAgICAgIHR5cGVvZiBkYXRhLnN0YXR1cyA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgb3NcbiAgICAgICAgICAgIHR5cGVvZiBkYXRhLm9zICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBkaXJfbmFtZVxuICAgICAgICAgICAgdHlwZW9mIGRhdGEuZGlyX25hbWUgIT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIGZpbGVfbmFtZVxuICAgICAgICAgICAgdHlwZW9mIGRhdGEuZmlsZV9uYW1lICE9PSAnc3RyaW5nJ1xuICAgICAgICAgICkgdGhyb3cgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyIG9uIG1lc3NhZ2UnKVxuXG4gICAgICAgICAgLy8gVXNlIGEgbmV3IHNjb3BlIGJsb2NrXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgZGlyID0gbmV3IERpckl0ZW0oZGF0YS5kaXJfbmFtZSwge30sIGRhdGEub3MpXG4gICAgICAgICAgICAvLyBGaXggdGhlIHBhdGggbm93IHdlIGhhdmUgdGhlIG9zIHR5cGVcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSAoZGlyLnBhdGgubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgPyBkaXIucGF0aCArIGRpci5zZXBhcmF0b3IgKyBkYXRhLmZpbGVfbmFtZVxuICAgICAgICAgICAgICA6IGRhdGEuZmlsZV9uYW1lXG5cbiAgICAgICAgICAgIGlmIChkYXRhLnN0YXR1cykge1xuICAgICAgICAgICAgICAvLyBTdWNjZXNzXG4gICAgICAgICAgICAgIGRpc3BhdGNoKGRlbGV0ZUZpbGVTdWNjZXNzKHBhdGgpKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gRmFpbHVyZVxuICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoKVxuICAgICAgICAgICAgICBlcnJvci5yZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IEVSUk9SX0RFTEVUSU9OLFxuICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IGludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5lcnJvckRlbGV0aW5nLCB7IHBhdGggfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkaXNwYXRjaChkZWxldGVGaWxlRmFpbHVyZShwYXRoLCBlcnJvcikpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0ludmFsaWQgYWN0aW9uOicsIGRhdGEuYWN0aW9uKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgfVxuICB9KVxufVxuIiwiaW1wb3J0IExvZ2dlciBmcm9tICcuLi9jb21tb24vbGliL0xvZ2dlcidcbmltcG9ydCB7IFBST1RPIH0gZnJvbSAnLi4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgZmV0Y2hTZWN0aW9ucywgdHJ5UGFzc3dvcmRzIH0gZnJvbSAnLi4vYWN0aW9ucy9hcHAnXG5pbXBvcnQge1xuICBmZXRjaEFnZW50LFxuICBjb25uZWN0aW9uQWdlbnRSZXF1ZXN0LCBjb25uZWN0aW9uQWdlbnRTdWNjZXNzLCBjb25uZWN0aW9uQWdlbnRGYWlsdXJlLFxuICBkaXNjb25uZWN0aW9uQWdlbnRTdWNjZXNzLCBkaXNjb25uZWN0aW9uQWdlbnRSZXF1ZXN0LCBjbGVhckNvbm5lY3Rpb25FcnJvcixcbiAgYXV0ZW50aWNhdGVBZ2VudFN1Y2Nlc3MsIGF1dGVudGljYXRlQWdlbnRGYWlsdXJlLCByZXZva2VBZ2VudEF1dGhlbnRpY2F0aW9uLFxuICBjbGVhckF1dGhlbnRpY2F0aW9uRXJyb3Jcbn0gZnJvbSAnLi4vYWN0aW9ucy9hZ2VudCdcblxuaW1wb3J0IGJpbmRUZXJtaW5hbFJlc3BvbnNlcyBmcm9tICcuLi9yZXNwb25zZXMvdGVybWluYWwnXG5pbXBvcnQgYmluZFN5c3RlbVJlc3BvbnNlcyBmcm9tICcuLi9yZXNwb25zZXMvc3lzdGVtJ1xuaW1wb3J0IGJpbmRQcm9jZXNzZXNSZXNwb25zZXMgZnJvbSAnLi4vcmVzcG9uc2VzL3Byb2Nlc3NlcydcbmltcG9ydCBiaW5kRmlsZXNSZXNwb25zZXMgZnJvbSAnLi4vcmVzcG9uc2VzL2ZpbGVzJ1xuaW1wb3J0IGJpbmRTZXJ2aWNlc1Jlc3BvbnNlcyBmcm9tICcuLi9yZXNwb25zZXMvc2VydmljZXMnXG5cbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoeyBzZWN0aW9uOiAnUmVzcG9uc2VzJyB9KVxuXG5leHBvcnQgZGVmYXVsdCAocmVtb3RlLCBkaXNwYXRjaCwgaW50bCkgPT4ge1xuICAvLyBSZWdpc3RlciByZW1vdGUgbGlzdGVuZXJzXG5cbiAgLy8gTGlzdGVuIGZvciBzdGF0ZSBjaGFuZ2VzXG4gIHJlbW90ZS5vbk9wZW4oKGV2ZW50KSA9PiB7XG4gICAgbG9nZ2VyLmluZm8oJ1t3c10nLCAnQ29ubmVjdGlvbiBvcGVuJywgZXZlbnQpXG4gICAgZGlzcGF0Y2goY29ubmVjdGlvbkFnZW50U3VjY2VzcyhEYXRlLm5vdygpKSlcbiAgfSlcbiAgcmVtb3RlLm9uT3BlbmluZygoZXZlbnQpID0+IHtcbiAgICBsb2dnZXIuaW5mbygnW3dzXScsICdPcGVuaW5nIGNvbm5lY3Rpb24uLi4nKVxuICAgIGRpc3BhdGNoKGNsZWFyQXV0aGVudGljYXRpb25FcnJvcigpKVxuICAgIGRpc3BhdGNoKGNsZWFyQ29ubmVjdGlvbkVycm9yKCkpXG4gICAgZGlzcGF0Y2goY29ubmVjdGlvbkFnZW50UmVxdWVzdCgpKVxuICB9KVxuICByZW1vdGUub25DbG9zZSgoZXZlbnQpID0+IHtcbiAgICBsb2dnZXIuaW5mbygnW3dzXScsICdDb25uZWN0aW9uIGNsb3NlZCcsIGV2ZW50KVxuICAgIGlmICghZXZlbnQud2FzQ2xlYW4gfHwgZXZlbnQuY29kZSAhPT0gMTAwMCkge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ1dlYlNvY2tldCBlcnJvcicpXG4gICAgICBlcnJvci5yZXNwb25zZSA9IHtcbiAgICAgICAgY29kZTogZXZlbnQuY29kZSxcbiAgICAgICAgcmVhc29uOiBldmVudC5yZWFzb25cbiAgICAgIH1cbiAgICAgIGRpc3BhdGNoKGNvbm5lY3Rpb25BZ2VudEZhaWx1cmUoZXJyb3IpKVxuICAgIH1cbiAgICBkaXNwYXRjaChyZXZva2VBZ2VudEF1dGhlbnRpY2F0aW9uKCkpXG4gICAgZGlzcGF0Y2goZGlzY29ubmVjdGlvbkFnZW50U3VjY2VzcygpKVxuICB9KVxuICByZW1vdGUub25DbG9zaW5nKChldmVudCkgPT4ge1xuICAgIGxvZ2dlci5pbmZvKCdbd3NdJywgJ0Nsb3NpbmcgY29ubmVjdGlvbi4uLicpXG4gICAgLy8gVGhpcyBpcyBhIG1hbnVhbCBjbG9zZVxuICAgIGRpc3BhdGNoKGRpc2Nvbm5lY3Rpb25BZ2VudFJlcXVlc3QoKSlcbiAgfSlcbiAgcmVtb3RlLm9uRXJyb3IoKGV2ZW50KSA9PiB7XG4gICAgbG9nZ2VyLmluZm8oJ1t3c10nLCAnQ29ubmVjdGlvbiBlcnJvcicsIGV2ZW50KVxuICB9KVxuXG4gIC8vIExpc3RlbiBjb25uZWN0aW9uIHJlYWR5XG4gIHJlbW90ZS5vbihQUk9UTy5DT05OX1JFQURZLCAoKSA9PiB7XG4gICAgZGlzcGF0Y2goYXV0ZW50aWNhdGVBZ2VudFN1Y2Nlc3MoKSlcbiAgICBkaXNwYXRjaChmZXRjaFNlY3Rpb25zKCkpXG4gICAgZGlzcGF0Y2goZmV0Y2hBZ2VudCgpKVxuICB9KVxuICAvLyBMaXN0ZW4gYWdlbnQgcGFzc3dvcmQgbmVlZGVkXG4gIHJlbW90ZS5vbihQUk9UTy5BR0VOVF9QQVNTLCAoKSA9PiB7XG4gICAgbG9nZ2VyLmluZm8oJ05lZWRlZCBwYXNzJylcbiAgICAvLyBUcnkgdG8gdXNlIGEgcG9zc2libGUgdG1wIHBhc3NcbiAgICBkaXNwYXRjaCh0cnlQYXNzd29yZHMoKSlcbiAgfSlcbiAgLy8gTGlzdGVuIGF1dGggZXJyb3JzXG4gIHJlbW90ZS5vbihQUk9UTy5BVVRIX0VSUk9SLCAocmVzcG9uc2UpID0+IHtcbiAgICBsb2dnZXIuaW5mbygnQXV0aCBlcnJvcicpXG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ0F1dGhlbnRpY2F0aW9uIGVycm9yJylcbiAgICBjb25zdCBkYXRhID0gcmVzcG9uc2UudG9KU09OKClcbiAgICBlcnJvci5yZXNwb25zZSA9IHtcbiAgICAgIGNvZGU6IGRhdGEuY29kZSxcbiAgICAgIHJlYXNvbjogZGF0YS5yZWFzb25cbiAgICB9XG4gICAgZGlzcGF0Y2goYXV0ZW50aWNhdGVBZ2VudEZhaWx1cmUoZXJyb3IpKVxuICB9KVxuXG4gIC8vIFN5c3RlbSAvL1xuICBiaW5kU3lzdGVtUmVzcG9uc2VzKHJlbW90ZSwgZGlzcGF0Y2gsIGludGwpXG4gIC8vIFByb2Nlc3NlcyAvL1xuICBiaW5kUHJvY2Vzc2VzUmVzcG9uc2VzKHJlbW90ZSwgZGlzcGF0Y2gsIGludGwpXG4gIC8vIEZpbGVzIC8vXG4gIGJpbmRGaWxlc1Jlc3BvbnNlcyhyZW1vdGUsIGRpc3BhdGNoLCBpbnRsKVxuICAvLyBTZXJ2aWNlcyAvL1xuICBiaW5kU2VydmljZXNSZXNwb25zZXMocmVtb3RlLCBkaXNwYXRjaCwgaW50bClcbiAgLy8gVGVybWluYWwgLy9cbiAgYmluZFRlcm1pbmFsUmVzcG9uc2VzKHJlbW90ZSwgZGlzcGF0Y2gsIGludGwpXG59XG4iLCJpbXBvcnQgTG9nZ2VyIGZyb20gJy4uL2NvbW1vbi9saWIvTG9nZ2VyJ1xuaW1wb3J0IHsgUFJPVE8gfSBmcm9tICcuLi9jb25zdGFudHMnXG5pbXBvcnQgUHJvY2Vzc2VzQWN0aW9ucyBmcm9tICcuLi9wcm9jZXNzZXMtbWFuYWdlci9hY3Rpb25zJ1xuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHsgc2VjdGlvbjogJ1Byb2Nlc3NlcyByZXNwb25zZScgfSlcblxuZXhwb3J0IGRlZmF1bHQgKHJlbW90ZSwgZGlzcGF0Y2gpID0+IHtcbiAgcmVtb3RlLm9uKFBST1RPLlBST0NFU1NFUywgKHJlc3BvbnNlKSA9PiB7XG4gICAgLy8gZGF0YSBzaG91bGQgYmUgYSBKU09OXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS50b0pTT04oKVxuXG4gICAgICBpZiAodHlwZW9mIGRhdGEuYWN0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBhY3Rpb24gb24gbWVzc2FnZScpXG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKCdbUFJPVE8uUFJPQ0VTU0VTXScsIGRhdGEpXG5cbiAgICAgIHN3aXRjaCAoZGF0YS5hY3Rpb24pIHtcbiAgICAgICAgY2FzZSAnbGlzdCc6XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBsaXN0XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmxpc3QgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBwYXJhbWV0ZXIgb24gbWVzc2FnZScpXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgc3lzaW5mb1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS5zeXNpbmZvICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyIG9uIG1lc3NhZ2UnKVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIHRpbWVzdGFtcFxuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS50aW1lc3RhbXAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBwYXJhbWV0ZXIgb24gbWVzc2FnZScpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUGFyc2Ugc3lzaW5mb1xuICAgICAgICAgIGxldCB0b3RhbFJBTSA9IE51bWJlci5wYXJzZUZsb2F0KGRhdGEuc3lzaW5mby5yYW1fdG90YWwpXG4gICAgICAgICAgbGV0IGF2YWlsYWJsZVJBTSA9IE51bWJlci5wYXJzZUZsb2F0KGRhdGEuc3lzaW5mby5yYW1fYXZhaWwpXG5cbiAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHRvdGFsUkFNKSB8fCBOdW1iZXIuaXNOYU4oYXZhaWxhYmxlUkFNKSB8fFxuICAgICAgICAgICAgICB0b3RhbFJBTSA8IDAgfHwgYXZhaWxhYmxlUkFNIDwgMCB8fCBhdmFpbGFibGVSQU0gPiB0b3RhbFJBTSkge1xuICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbnZhbGlkIHBhcmFtZXRlciBvbiBtZXNzYWdlJylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFeHBlY3QgdGhlIGRhdGEgaW4gS0IgYW5kIGNvbnZlcnRzIGl0IHRvIEJ5dGVzXG4gICAgICAgICAgdG90YWxSQU0gKj0gMTAyNFxuICAgICAgICAgIGF2YWlsYWJsZVJBTSAqPSAxMDI0XG5cbiAgICAgICAgICBsZXQgc3lzdGVtSW5mbyA9IHtcbiAgICAgICAgICAgIHRvdGFsUkFNLFxuICAgICAgICAgICAgYXZhaWxhYmxlUkFNXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgUHJvY2Vzc2VzQWN0aW9ucy5mZXRjaChkYXRhLmxpc3QsIHN5c3RlbUluZm8sIGRhdGEudGltZXN0YW1wKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3N0b3AnOlxuICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgcmVzdWx0XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLnJlc3VsdCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlciBvbiBtZXNzYWdlJylcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBwaWRcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGEucGlkICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyIG9uIG1lc3NhZ2UnKVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIHByb2Nlc3NfbmFtZVxuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS5wcm9jZXNzX25hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBwYXJhbWV0ZXIgb24gbWVzc2FnZScpXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgdGltZXN0YW1wXG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLnRpbWVzdGFtcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlciBvbiBtZXNzYWdlJylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZGF0YS5tZXNzYWdlKSBsb2dnZXIuaW5mbyhkYXRhLm1lc3NhZ2UpXG4gICAgICAgICAgaWYgKGRhdGEucmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgcHJvY2Vzc1xuICAgICAgICAgICAgUHJvY2Vzc2VzQWN0aW9ucy5yZW1vdmUoZGF0YS5waWQsIGRhdGEucHJvY2Vzc19uYW1lKVxuICAgICAgICAgICAgLy8gQ2xlYW4gc2VsZWN0ZWQgcHJvY2Vzc1xuICAgICAgICAgICAgUHJvY2Vzc2VzQWN0aW9ucy5jbGVhblNlbGVjdGVkKClcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUmVtb3ZlIHRoZSBwcm9jZXNzIGZyb20gdGhlIGxpc3Qgb2YgcHJvY2Vzc2VzIGluIHN0b3BwaW5nIHN0YXRlXG4gICAgICAgICAgUHJvY2Vzc2VzQWN0aW9ucy5yZW1vdmVGcm9tU3RvcHBpbmcoZGF0YS5waWQsIGRhdGEucHJvY2Vzc19uYW1lKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0ludmFsaWQgYWN0aW9uOicsIGRhdGEuYWN0aW9uKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgfVxuICB9KVxufVxuIiwiaW1wb3J0IExvZ2dlciBmcm9tICcuLi9jb21tb24vbGliL0xvZ2dlcidcbmltcG9ydCB7IFBST1RPIH0gZnJvbSAnLi4vY29uc3RhbnRzJ1xuaW1wb3J0IFNlcnZpY2VzQWN0aW9ucyBmcm9tICcuLi9zZXJ2aWNlcy1tYW5hZ2VyL2FjdGlvbnMnXG5cbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoeyBzZWN0aW9uOiAnRmlsZXMgcmVzcG9uc2UnIH0pXG5cbmV4cG9ydCBkZWZhdWx0IChyZW1vdGUsIGRpc3BhdGNoKSA9PiB7XG4gIHJlbW90ZS5vbihQUk9UTy5TRVJWSUNFUywgKHJlc3BvbnNlKSA9PiB7XG4gICAgLy8gZGF0YSBzaG91bGQgYmUgYSBKU09OXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS50b0pTT04oKVxuXG4gICAgICBpZiAodHlwZW9mIGRhdGEuYWN0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBhY3Rpb24gb24gbWVzc2FnZScpXG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZGF0YS5hY3Rpb24pIHtcbiAgICAgICAgY2FzZSAnbGlzdCc6XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBsaXN0XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmxpc3QgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBwYXJhbWV0ZXIgb24gbWVzc2FnZScpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS50aW1lc3RhbXAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBwYXJhbWV0ZXIgb24gbWVzc2FnZScpXG4gICAgICAgICAgfVxuICAgICAgICAgIFNlcnZpY2VzQWN0aW9ucy5mZXRjaChkYXRhLmxpc3QsIGRhdGEudGltZXN0YW1wKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3N0YXJ0JzpcbiAgICAgICAgY2FzZSAnc3RvcCc6XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBsaXN0XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLnJlc3VsdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlciBvbiBtZXNzYWdlJylcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLnN0YXR1cyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlciBvbiBtZXNzYWdlJylcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLnNlcnZpY2VfbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlciBvbiBtZXNzYWdlJylcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLnRpbWVzdGFtcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlciBvbiBtZXNzYWdlJylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzdGF0dXMtdGltZXN0YW1wLXJlc3VsdC1zZXJ2aWNlX25hbWVcbiAgICAgICAgICBpZiAoZGF0YS5tZXNzYWdlKSBsb2dnZXIuaW5mbyhkYXRhLm1lc3NhZ2UpXG4gICAgICAgICAgaWYgKGRhdGEucmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNlcnZpY2Ugc3RhdHVzXG4gICAgICAgICAgICBTZXJ2aWNlc0FjdGlvbnMudXBkYXRlU3RhdHVzKGRhdGEuc2VydmljZV9uYW1lLCBkYXRhLnN0YXR1cylcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc2VydmljZSBmcm9tIHRoZSBsaXN0IG9mIHNlcnZpY2VzIGluIHVwZGF0aW5nIHN0YXRlXG4gICAgICAgICAgICBTZXJ2aWNlc0FjdGlvbnMucmVtb3ZlRnJvbVVwZGF0aW5nKGRhdGEuc2VydmljZV9uYW1lKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdJbnZhbGlkIGFjdGlvbicsIGRhdGEuYWN0aW9uKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgfVxuICB9KVxufVxuIiwiaW1wb3J0IExvZ2dlciBmcm9tICcuLi9jb21tb24vbGliL0xvZ2dlcidcbmltcG9ydCB7IFBST1RPIH0gZnJvbSAnLi4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgZmV0Y2hTZWN0aW9uc1N1Y2Nlc3MsIGFsbG93U2VjdGlvbiwgZmV0Y2hSZW1vdGVTZWN0aW9uRW5kIH0gZnJvbSAnLi4vYWN0aW9ucy9hcHAnXG5pbXBvcnQgeyBmZXRjaEFnZW50U3VjY2VzcywgZ2V0VGVtcFBhc3NTdWNjZXNzIH0gZnJvbSAnLi4vYWN0aW9ucy9hZ2VudCdcblxuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih7IHNlY3Rpb246ICdTeXN0ZW0gcmVzcG9uc2UnIH0pXG5cbmV4cG9ydCBkZWZhdWx0IChyZW1vdGUsIGRpc3BhdGNoKSA9PiB7XG4gIHJlbW90ZS5vbihQUk9UTy5TWVNURU0sIChyZXNwb25zZSkgPT4ge1xuICAgIC8vIGRhdGEgc2hvdWxkIGJlIGEgSlNPTlxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2UudG9KU09OKClcblxuICAgICAgaWYgKHR5cGVvZiBkYXRhLmFjdGlvbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ01pc3NpbmcgYWN0aW9uIG9uIG1lc3NhZ2UnKVxuICAgICAgfVxuXG4gICAgICAvLyBsb2dnZXIuaW5mbygnW1BST1RPLlNZU1RFTV0nLCBkYXRhKVxuXG4gICAgICBzd2l0Y2ggKGRhdGEuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgJ2dldCc6XG4gICAgICAgICAgbGV0IGFnZW50RGF0YSA9IGRhdGEuZ2V0IHx8IHt9XG4gICAgICAgICAgbGV0IHN5c3RlbUluZm8gPSB7XG4gICAgICAgICAgICBpZDogcmVtb3RlLmFnZW50SURcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciB1cHRpbWVcbiAgICAgICAgICBpZiAodHlwZW9mIGFnZW50RGF0YS51cHRpbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihhZ2VudERhdGEudXB0aW1lKSkge1xuICAgICAgICAgICAgICBzeXN0ZW1JbmZvLnVwdGltZSA9IE51bWJlci5wYXJzZUludChhZ2VudERhdGEudXB0aW1lLCAxMClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciB2ZXJzaW9uXG4gICAgICAgICAgaWYgKHR5cGVvZiBhZ2VudERhdGEudmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHN5c3RlbUluZm8udmVyc2lvbiA9IGFnZW50RGF0YS52ZXJzaW9uXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgYWRkcmVzc1xuICAgICAgICAgIGlmICh0eXBlb2YgYWdlbnREYXRhLmFkZHJlc3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBzeXN0ZW1JbmZvLmFkZHJlc3MgPSBhZ2VudERhdGEuYWRkcmVzc1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIGhvc3RuYW1lXG4gICAgICAgICAgaWYgKHR5cGVvZiBhZ2VudERhdGEuaG9zdG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBzeXN0ZW1JbmZvLmhvc3RuYW1lID0gYWdlbnREYXRhLmhvc3RuYW1lXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgZGVzY3JpcHRpb25cbiAgICAgICAgICBpZiAodHlwZW9mIGFnZW50RGF0YS5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHN5c3RlbUluZm8uZGVzY3JpcHRpb24gPSBhZ2VudERhdGEuZGVzY3JpcHRpb25cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBsYW5ndWFnZVxuICAgICAgICAgIGlmICh0eXBlb2YgYWdlbnREYXRhLmxhbmd1YWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc3lzdGVtSW5mby5sYW5ndWFnZSA9IGFnZW50RGF0YS5sYW5ndWFnZVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIG9zXG4gICAgICAgICAgaWYgKHR5cGVvZiBhZ2VudERhdGEub3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBzeXN0ZW1JbmZvLm9zID0gYWdlbnREYXRhLm9zXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgb3NWZXJzaW9uXG4gICAgICAgICAgaWYgKHR5cGVvZiBhZ2VudERhdGEub3NWZXJzaW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc3lzdGVtSW5mby5vc1ZlcnNpb24gPSBhZ2VudERhdGEub3NWZXJzaW9uXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgYXJjaGl0ZWN0dXJlXG4gICAgICAgICAgaWYgKHR5cGVvZiBhZ2VudERhdGEuYXJjaGl0ZWN0dXJlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc3lzdGVtSW5mby5hcmNoaXRlY3R1cmUgPSBhZ2VudERhdGEuYXJjaGl0ZWN0dXJlXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgY3B1RGVzY3JpcHRpb25cbiAgICAgICAgICBpZiAodHlwZW9mIGFnZW50RGF0YS5jcHVEZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHN5c3RlbUluZm8uY3B1RGVzY3JpcHRpb24gPSBhZ2VudERhdGEuY3B1RGVzY3JpcHRpb25cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciByYW1cbiAgICAgICAgICBpZiAodHlwZW9mIGFnZW50RGF0YS5yYW0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihhZ2VudERhdGEucmFtKSkge1xuICAgICAgICAgICAgICBzeXN0ZW1JbmZvLnJhbSA9IE51bWJlci5wYXJzZUludChhZ2VudERhdGEucmFtLCAxMClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBoZGRcbiAgICAgICAgICBpZiAodHlwZW9mIGFnZW50RGF0YS5oZGQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihhZ2VudERhdGEuaGRkKSkge1xuICAgICAgICAgICAgICBzeXN0ZW1JbmZvLmhkZCA9IE51bWJlci5wYXJzZUludChhZ2VudERhdGEuaGRkLCAxMClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gICAgICAgICAgZGlzcGF0Y2goZmV0Y2hBZ2VudFN1Y2Nlc3Moc3lzdGVtSW5mbywgbm93KSlcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdzZWN0aW9uJzpcbiAgICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGRhdGEuc2VjdGlvblxuXG4gICAgICAgICAgaWYgKHNlY3Rpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gW11cbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHNlY3Rpb25zLmRpc3BsYXlNYW5hZ2VyKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXk6ICdkaXNwbGF5JyxcbiAgICAgICAgICAgICAgICBlbmFibGVkOiBzZWN0aW9ucy5kaXNwbGF5TWFuYWdlciA9PT0gMSxcbiAgICAgICAgICAgICAgICBhbGxvdzogdHlwZW9mIChzZWN0aW9ucy5hc2tEaXNwbGF5TWFuYWdlcikgPT09ICd1bmRlZmluZWQnLFxuICAgICAgICAgICAgICAgIGluZm9ybTogc2VjdGlvbnMuaW5mb3JtRGlzcGxheU1hbmFnZXIgPT09IDFcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHNlY3Rpb25zLmZpbGVUcmFuc2ZlcikgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGRhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiAnZmlsZXMnLFxuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHNlY3Rpb25zLmZpbGVUcmFuc2ZlciA9PT0gMSxcbiAgICAgICAgICAgICAgICBhbGxvdzogdHlwZW9mIChzZWN0aW9ucy5hc2tGaWxlVHJhbnNmZXIpID09PSAndW5kZWZpbmVkJyxcbiAgICAgICAgICAgICAgICBpbmZvcm06IHNlY3Rpb25zLmluZm9ybUZpbGVUcmFuc2ZlciA9PT0gMVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoc2VjdGlvbnMucmVtb3RlU2hlbGwpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogJ3Rlcm1pbmFsJyxcbiAgICAgICAgICAgICAgICBlbmFibGVkOiBzZWN0aW9ucy5yZW1vdGVTaGVsbCA9PT0gMSxcbiAgICAgICAgICAgICAgICBhbGxvdzogdHlwZW9mIChzZWN0aW9ucy5hc2tSZW1vdGVTaGVsbCkgPT09ICd1bmRlZmluZWQnLFxuICAgICAgICAgICAgICAgIGluZm9ybTogc2VjdGlvbnMuaW5mb3JtUmVtb3RlU2hlbGwgPT09IDFcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHNlY3Rpb25zLnNlY3Rpb25Qcm9jZXNzZXMpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogJ3Byb2Nlc3NlcycsXG4gICAgICAgICAgICAgICAgZW5hYmxlZDogc2VjdGlvbnMuc2VjdGlvblByb2Nlc3NlcyA9PT0gMSxcbiAgICAgICAgICAgICAgICBhbGxvdzogdHlwZW9mIChzZWN0aW9ucy5hc2tTZWN0aW9uUHJvY2Vzc2VzKSA9PT0gJ3VuZGVmaW5lZCcsXG4gICAgICAgICAgICAgICAgaW5mb3JtOiBzZWN0aW9ucy5pbmZvcm1TZWN0aW9uUHJvY2Vzc2VzID09PSAxXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogJ3Byb2Nlc3NlcycsXG4gICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhbGxvdzogdHJ1ZVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoc2VjdGlvbnMuc2VjdGlvblNlcnZpY2VzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXk6ICdzZXJ2aWNlcycsXG4gICAgICAgICAgICAgICAgZW5hYmxlZDogc2VjdGlvbnMuc2VjdGlvblNlcnZpY2VzID09PSAxLFxuICAgICAgICAgICAgICAgIGFsbG93OiB0eXBlb2YgKHNlY3Rpb25zLmFza1NlY3Rpb25TZXJ2aWNlcykgPT09ICd1bmRlZmluZWQnLFxuICAgICAgICAgICAgICAgIGluZm9ybTogc2VjdGlvbnMuaW5mb3JtU2VjdGlvblNlcnZpY2VzID09PSAxXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogJ3NlcnZpY2VzJyxcbiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGFsbG93OiB0cnVlXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIChzZWN0aW9ucy5zZWN0aW9uU2hhcmUpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogJ3NoYXJlJyxcbiAgICAgICAgICAgICAgICBlbmFibGVkOiBzZWN0aW9ucy5zZWN0aW9uU2hhcmUgPT09IDEsXG4gICAgICAgICAgICAgICAgYWxsb3c6IHR5cGVvZiAoc2VjdGlvbnMuYXNrU2VjdGlvblNoYXJlKSA9PT0gJ3VuZGVmaW5lZCcsXG4gICAgICAgICAgICAgICAgaW5mb3JtOiBzZWN0aW9ucy5pbmZvcm1TZWN0aW9uU2hhcmUgPT09IDFcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiAnc2hhcmUnLFxuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgYWxsb3c6IHRydWVcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc3BhdGNoKGZldGNoU2VjdGlvbnNTdWNjZXNzKGRhdGEsIG5vdykpXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0ludmFsaWQgYWN0aW9uOicsIGRhdGEuYWN0aW9uKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgfVxuICB9KVxuXG4gIHJlbW90ZS5vbihQUk9UTy5URU1QX1BBU1MsIChyZXNwb25zZSkgPT4ge1xuICAgIC8vIGRhdGEgc2hvdWxkIGJlIGEgSlNPTlxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2UudG9KU09OKClcblxuICAgICAgaWYgKHR5cGVvZiBkYXRhLmFjdGlvbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ01pc3NpbmcgYWN0aW9uIG9uIG1lc3NhZ2UnKVxuICAgICAgfVxuXG4gICAgICAvLyBsb2dnZXIuaW5mbygnW1BST1RPLlRFTVBfUEFTU10nLCBkYXRhKVxuXG4gICAgICBzd2l0Y2ggKGRhdGEuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgJ2dldF90ZW1wX3Bhc3MnOlxuICAgICAgICAgIGNvbnN0IHBhc3MgPSBkYXRhLnBhc3N3b3JkXG4gICAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gZGF0YS5leHBpcmVzXG4gICAgICAgICAgLy8gZ2V0VGVtcFBhc3NGYWlsdXJlKGVycilcbiAgICAgICAgICBkaXNwYXRjaChnZXRUZW1wUGFzc1N1Y2Nlc3MocGFzcywgZXhwaXJlc0F0KSlcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdJbnZhbGlkIGFjdGlvbjonLCBkYXRhLmFjdGlvbilcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGVycm9yKVxuICAgIH1cbiAgfSlcblxuICByZW1vdGUub24oUFJPVE8uVEVNUF9TRUNUSU9OLCAocmVzcG9uc2UpID0+IHtcbiAgICAvLyBkYXRhIHNob3VsZCBiZSBhIEpTT05cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlLnRvSlNPTigpXG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YS5hY3Rpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIGFjdGlvbiBvbiBtZXNzYWdlJylcbiAgICAgIH1cblxuICAgICAgLy8gbG9nZ2VyLmluZm8oJ1tQUk9UTy5URU1QX1BBU1NdJywgZGF0YSlcblxuICAgICAgc3dpdGNoIChkYXRhLmFjdGlvbikge1xuICAgICAgICBjYXNlICdhY2Nlc3Nfc2VjdGlvbic6XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBzdGF0dXNcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGEuc3RhdHVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyIG9uIG1lc3NhZ2UnKVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIG9mZnNldFxuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS5zZWN0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyIG9uIG1lc3NhZ2UnKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYXRhLnN0YXR1cykge1xuICAgICAgICAgICAgZGlzcGF0Y2goYWxsb3dTZWN0aW9uKGRhdGEuc2VjdGlvbikpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKGZldGNoUmVtb3RlU2VjdGlvbkVuZChkYXRhLnNlY3Rpb24pKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdJbnZhbGlkIGFjdGlvbjonLCBkYXRhLmFjdGlvbilcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGVycm9yKVxuICAgIH1cbiAgfSlcbn1cbiIsImltcG9ydCBMb2dnZXIgZnJvbSAnLi4vY29tbW9uL2xpYi9Mb2dnZXInXG5pbXBvcnQgeyBQUk9UTyB9IGZyb20gJy4uL2NvbnN0YW50cydcbmltcG9ydCB7XG4gIHNhdmVUZXJtRGF0YSwgaW5pdGlhbGl6ZVRlcm1TdWNjZXNzLCBpbml0aWFsaXplVGVybUZhaWx1cmVcbn0gZnJvbSAnLi4vYWN0aW9ucy90ZXJtaW5hbCdcblxuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih7IHNlY3Rpb246ICdUZXJtaW5hbCByZXNwb25zZScgfSlcblxuZXhwb3J0IGRlZmF1bHQgKHJlbW90ZSwgZGlzcGF0Y2gpID0+IHtcbiAgLy8gVGVybWluYWwgLy9cbiAgcmVtb3RlLm9uKFBST1RPLlRFUk0sIChyZXNwb25zZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBkaXNwYXRjaChzYXZlVGVybURhdGEocmVzcG9uc2UudG9TdHJpbmcoKSwgRGF0ZS5ub3coKSkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihlcnJvcilcbiAgICB9XG4gIH0pXG4gIHJlbW90ZS5vbihQUk9UTy5URVJNX0lOSVQsIChyZXNwb25zZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAocmVzcG9uc2UudG9TdHJpbmcoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGRpc3BhdGNoKGluaXRpYWxpemVUZXJtU3VjY2VzcyhEYXRlLm5vdygpKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcignRXJyb3IgaW5pdGlhbGl6aW5nIHRoZSB0ZXJtaW5hbCcpXG4gICAgICAgIGVyci5yZXNwb25zZSA9IHtcbiAgICAgICAgICBzdGF0dXM6IDUwMCxcbiAgICAgICAgICBzdGF0dXNUZXh0OiAnRXJyb3IgaW5pdGlhbGl6aW5nIHRoZSB0ZXJtaW5hbCdcbiAgICAgICAgfVxuICAgICAgICBkaXNwYXRjaChpbml0aWFsaXplVGVybUZhaWx1cmUoZXJyKSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGVycm9yKVxuICAgIH1cbiAgfSlcbn1cbiIsImNsYXNzIFNlcnZpY2Uge1xuICAvLyBTZXJ2aWNlcyBzdGF0dXNlcyBmb3IgV2luZG93c1xuICBzdGF0aWMgZ2V0IE5PVF9SVU5OSU5HICgpIHtcbiAgICByZXR1cm4gJ05vdCBydW5uaW5nJ1xuICB9XG4gIHN0YXRpYyBnZXQgU1RBUlRfUEVORElORyAoKSB7XG4gICAgcmV0dXJuICdTdGFydCBwZW5kaW5nJ1xuICB9XG4gIHN0YXRpYyBnZXQgU1RPUF9QRU5ESU5HICgpIHtcbiAgICByZXR1cm4gJ1N0b3AgcGVuZGluZydcbiAgfVxuICBzdGF0aWMgZ2V0IFJVTk5JTkcgKCkge1xuICAgIHJldHVybiAnUnVubmluZydcbiAgfVxuICBzdGF0aWMgZ2V0IFJFU1VNRV9QRU5ESU5HICgpIHtcbiAgICByZXR1cm4gJ1Jlc3VtZSBwZW5kaW5nJ1xuICB9XG4gIHN0YXRpYyBnZXQgUEFVU0VfUEVORElORyAoKSB7XG4gICAgcmV0dXJuICdQYXVzZSBwZW5kaW5nJ1xuICB9XG4gIHN0YXRpYyBnZXQgUEFVU0VEICgpIHtcbiAgICByZXR1cm4gJ1BhdXNlZCdcbiAgfVxuXG4gIHN0YXRpYyBnZXQgVU5LTk9XTiAoKSB7XG4gICAgcmV0dXJuICdVbmtub3duJ1xuICB9XG5cbiAgc3RhdGljIGdldCBwb3NzaWJsZVN0YXR1cyAoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IFNlcnZpY2UuTk9UX1JVTk5JTkcsXG4gICAgICAgIG1lc3NhZ2U6IFNlcnZpY2UubWVzc2FnZXMubm90UnVubmluZ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IFNlcnZpY2UuU1RBUlRfUEVORElORyxcbiAgICAgICAgbWVzc2FnZTogU2VydmljZS5tZXNzYWdlcy5zdGFydFBlbmRpbmdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiBTZXJ2aWNlLlNUT1BfUEVORElORyxcbiAgICAgICAgbWVzc2FnZTogU2VydmljZS5tZXNzYWdlcy5zdG9wUGVuZGluZ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IFNlcnZpY2UuUlVOTklORyxcbiAgICAgICAgbWVzc2FnZTogU2VydmljZS5tZXNzYWdlcy5ydW5uaW5nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB2YWx1ZTogU2VydmljZS5SRVNVTUVfUEVORElORyxcbiAgICAgICAgbWVzc2FnZTogU2VydmljZS5tZXNzYWdlcy5yZXN1bWVQZW5kaW5nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB2YWx1ZTogU2VydmljZS5QQVVTRV9QRU5ESU5HLFxuICAgICAgICBtZXNzYWdlOiBTZXJ2aWNlLm1lc3NhZ2VzLnBhdXNlUGVuZGluZ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IFNlcnZpY2UuUEFVU0VELFxuICAgICAgICBtZXNzYWdlOiBTZXJ2aWNlLm1lc3NhZ2VzLnBhdXNlZFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IFNlcnZpY2UuVU5LTk9XTixcbiAgICAgICAgbWVzc2FnZTogU2VydmljZS5tZXNzYWdlcy51bmtub3duXG4gICAgICB9XG4gICAgXVxuICB9XG5cbiAgc3RhdGljIGdldCBtZXNzYWdlcyAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vdFJ1bm5pbmc6IHtcbiAgICAgICAgaWQ6ICdub3RSdW5uaW5nJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdOb3QgUnVubmluZydcbiAgICAgIH0sXG4gICAgICBzdGFydFBlbmRpbmc6IHtcbiAgICAgICAgaWQ6ICdzdGFydFBlbmRpbmcnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ1N0YXJ0IHBlbmRpbmcnXG4gICAgICB9LFxuICAgICAgc3RvcFBlbmRpbmc6IHtcbiAgICAgICAgaWQ6ICdzdG9wUGVuZGluZycsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnU3RvcCBwZW5kaW5nJ1xuICAgICAgfSxcbiAgICAgIHJ1bm5pbmc6IHtcbiAgICAgICAgaWQ6ICdydW5uaW5nJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdSdW5uaW5nJ1xuICAgICAgfSxcbiAgICAgIHJlc3VtZVBlbmRpbmc6IHtcbiAgICAgICAgaWQ6ICdyZXN1bWVQZW5kaW5nJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdSZXN1bWUgcGVuZGluZydcbiAgICAgIH0sXG4gICAgICBwYXVzZVBlbmRpbmc6IHtcbiAgICAgICAgaWQ6ICdwYXVzZVBlbmRpbmcnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ1BhdXNlIHBlbmRpbmcnXG4gICAgICB9LFxuICAgICAgcGF1c2VkOiB7XG4gICAgICAgIGlkOiAncGF1c2VkJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdQYXVzZWQnXG4gICAgICB9LFxuICAgICAgdW5rbm93bjoge1xuICAgICAgICBpZDogJ3Vua25vd24nLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ1Vua25vd24nXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBzb3J0SGFuZGxlciAoKSB7XG4gICAgcmV0dXJuIChwcm9wLCBvcmRlcikgPT4ge1xuICAgICAgLy8gT25seSBBU0Mgb3IgREVTQyBhcmUgc3VwcG9ydGVkXG4gICAgICBpZiAob3JkZXIgIT09ICdBU0MnICYmIG9yZGVyICE9PSAnREVTQycpIG9yZGVyID0gJ0FTQydcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICBsZXQgcmVzID0gMFxuICAgICAgICBpZiAoYVtwcm9wXSA9PT0gYltwcm9wXSkgcmVzID0gMFxuICAgICAgICBpZiAob3JkZXIgPT09ICdBU0MnKSByZXMgPSBhW3Byb3BdID4gYltwcm9wXSA/IDEgOiAtMVxuICAgICAgICBlbHNlIGlmIChvcmRlciA9PT0gJ0RFU0MnKSByZXMgPSBhW3Byb3BdIDwgYltwcm9wXSA/IDEgOiAtMVxuXG4gICAgICAgIHJldHVybiByZXNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IGRlZmF1dFNvcnRPYmplY3QgKCkge1xuICAgIGxldCByZXMgPSBuZXcgTWFwKClcbiAgICByZXMuc2V0KCdpZGVudGlmaWVyJywgJycpXG4gICAgcmVzLnNldCgnbmFtZScsICcnKVxuICAgIHJlcy5zZXQoJ2Rlc2NyaXB0aW9uJywgJycpXG4gICAgcmVzLnNldCgnc3RhdHVzJywgJycpXG5cbiAgICByZXR1cm4gcmVzXG4gIH1cblxuICBzdGF0aWMgZ2V0IGRlZmF1dEZpbHRlck9iamVjdCAoKSB7XG4gICAgbGV0IHJlcyA9IG5ldyBNYXAoKVxuICAgIHJlcy5zZXQoJ2lkZW50aWZpZXInLCAnJylcbiAgICByZXMuc2V0KCduYW1lJywgJycpXG4gICAgcmVzLnNldCgnZGVzY3JpcHRpb24nLCAnJylcbiAgICByZXMuc2V0KCdzdGF0dXMnLCAnJylcblxuICAgIHJldHVybiByZXNcbiAgfVxuXG4gIGNvbnN0cnVjdG9yIChwcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5pZGVudGlmaWVyID0gJydcbiAgICB0aGlzLm5hbWUgPSAnJ1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSAnJ1xuICAgIHRoaXMuc3RhdHVzID0gU2VydmljZS5VTktOT1dOXG5cbiAgICBpZiAodHlwZW9mIHByb3BzLmlkZW50aWZpZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgaWRlbnRpZmllciBvZiB0aGUgc2VydmljZSBpcyByZXF1aXJlZCcpXG4gICAgfVxuICAgIC8vIG5hbWUgc2hvdWxkIGJlIGEgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5uYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2Ugc2hvdWxkIGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgdGhpcy5pZGVudGlmaWVyID0gcHJvcHMuaWRlbnRpZmllclxuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5uYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gbmFtZSBzaG91bGQgYmUgYSBzdHJpbmdcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMubmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGZ1bGwgaWRlbnRpZmllciBvZiB0aGUgc2VydmljZSBzaG91bGQgYmUgYSBzdHJpbmcnKVxuICAgICAgfVxuICAgICAgdGhpcy5uYW1lID0gcHJvcHMubmFtZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hbWUgPSB0aGlzLmlkZW50aWZpZXJcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByb3BzLmRlc2NyaXB0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IHByb3BzLmRlc2NyaXB0aW9uXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5zdGF0dXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnN0YXR1cyA9IHByb3BzLnN0YXR1c1xuICAgIH1cbiAgfVxuXG4gIHNldCBzdGF0dXMgKHN0YXR1cykge1xuICAgIGlmICh0eXBlb2Ygc3RhdHVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRW1wdHkgc3RhdHVzJylcbiAgICB9XG4gICAgLy8gc3RhdHVzIHNob3VsZCBiZSBhIHN0cmluZ1xuICAgIGlmICh0eXBlb2Ygc3RhdHVzICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHN0YXR1cyBvZiB0aGUgc2VydmljZSBzaG91bGQgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICB0aGlzLl9fc3RhdHVzID0gU2VydmljZS5VTktOT1dOXG4gICAgLy8gT25seSBhY2NlcHQgZXhpc3Rpbmcgc3RhdHVzXG4gICAgc3RhdHVzID0gc3RhdHVzLnRyaW0oKVxuICAgIGlmIChzdGF0dXMgPT09IFNlcnZpY2UuTk9UX1JVTk5JTkcgfHxcbiAgICAgICAgc3RhdHVzID09PSBTZXJ2aWNlLlNUQVJUX1BFTkRJTkcgfHxcbiAgICAgICAgc3RhdHVzID09PSBTZXJ2aWNlLlNUT1BfUEVORElORyB8fFxuICAgICAgICBzdGF0dXMgPT09IFNlcnZpY2UuUlVOTklORyB8fFxuICAgICAgICBzdGF0dXMgPT09IFNlcnZpY2UuUkVTVU1FX1BFTkRJTkcgfHxcbiAgICAgICAgc3RhdHVzID09PSBTZXJ2aWNlLlBBVVNFX1BFTkRJTkcgfHxcbiAgICAgICAgc3RhdHVzID09PSBTZXJ2aWNlLlBBVVNFRCkge1xuICAgICAgdGhpcy5fX3N0YXR1cyA9IHN0YXR1c1xuICAgIH1cbiAgfVxuXG4gIGdldCBzdGF0dXMgKCkge1xuICAgIHJldHVybiB0aGlzLl9fc3RhdHVzXG4gIH1cblxuICBnZXQgbWVzc2FnZVN0YXR1cyAoKSB7XG4gICAgc3dpdGNoICh0aGlzLl9fc3RhdHVzKSB7XG4gICAgICBjYXNlIFNlcnZpY2UuTk9UX1JVTk5JTkc6XG4gICAgICAgIHJldHVybiBTZXJ2aWNlLm1lc3NhZ2VzLm5vdFJ1bm5pbmdcbiAgICAgIGNhc2UgU2VydmljZS5TVEFSVF9QRU5ESU5HOlxuICAgICAgICByZXR1cm4gU2VydmljZS5tZXNzYWdlcy5zdGFydFBlbmRpbmdcbiAgICAgIGNhc2UgU2VydmljZS5TVE9QX1BFTkRJTkc6XG4gICAgICAgIHJldHVybiBTZXJ2aWNlLm1lc3NhZ2VzLnN0b3BQZW5kaW5nXG4gICAgICBjYXNlIFNlcnZpY2UuUlVOTklORzpcbiAgICAgICAgcmV0dXJuIFNlcnZpY2UubWVzc2FnZXMucnVubmluZ1xuICAgICAgY2FzZSBTZXJ2aWNlLlJFU1VNRV9QRU5ESU5HOlxuICAgICAgICByZXR1cm4gU2VydmljZS5tZXNzYWdlcy5yZXN1bWVQZW5kaW5nXG4gICAgICBjYXNlIFNlcnZpY2UuUEFVU0VfUEVORElORzpcbiAgICAgICAgcmV0dXJuIFNlcnZpY2UubWVzc2FnZXMucGF1c2VQZW5kaW5nXG4gICAgICBjYXNlIFNlcnZpY2UuUEFVU0VEOlxuICAgICAgICByZXR1cm4gU2VydmljZS5tZXNzYWdlcy5wYXVzZWRcbiAgICAgIGNhc2UgU2VydmljZS5VTktOT1dOOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFNlcnZpY2UubWVzc2FnZXMudW5rbm93blxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTZXJ2aWNlXG4iLCIvLyBzcmMvc2VydmljZXMtbWFuYWdlci9hY3Rpb25zL2luZGV4LmpzXG5cbmltcG9ydCBBcHBEaXNwYXRjaGVyIGZyb20gJy4uLy4uL2Rpc3BhdGNoZXInXG5pbXBvcnQgUmVtb3RlIGZyb20gJy4uLy4uL2NvbW1vbi9saWIvcmVtb3RlJ1xuaW1wb3J0IFNlcnZpY2VzQ29uc3RhbnRzIGZyb20gJy4uL2NvbnN0YW50cydcbmltcG9ydCB7IFBST1RPIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJ1xuXG5jb25zdCBTZXJ2aWNlc0FjdGlvbnMgPSB7XG4gIC8vIC0tIFJlbW90ZSAtLSAvL1xuXG4gIHJlcXVlc3RMaXN0OiAoKSA9PiB7XG4gICAgUmVtb3RlLnNlbmQoe1xuICAgICAgcHJvdG86IFBST1RPLlNFUlZJQ0VTLFxuICAgICAgZGF0YToge1xuICAgICAgICBhY3Rpb246ICdsaXN0J1xuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgcmVxdWVzdFN0b3A6IChpZGVudGlmaWVyKSA9PiB7XG4gICAgUmVtb3RlLnNlbmQoe1xuICAgICAgcHJvdG86IFBST1RPLlNFUlZJQ0VTLFxuICAgICAgZGF0YToge1xuICAgICAgICBhY3Rpb246ICdzdG9wJyxcbiAgICAgICAgc2VydmljZV9uYW1lOiBpZGVudGlmaWVyXG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICByZXF1ZXN0U3RhcnQ6IChpZGVudGlmaWVyKSA9PiB7XG4gICAgUmVtb3RlLnNlbmQoe1xuICAgICAgcHJvdG86IFBST1RPLlNFUlZJQ0VTLFxuICAgICAgZGF0YToge1xuICAgICAgICBhY3Rpb246ICdzdGFydCcsXG4gICAgICAgIHNlcnZpY2VfbmFtZTogaWRlbnRpZmllclxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgcmVxdWVzdFJlc3RhcnQ6IChpZGVudGlmaWVyKSA9PiB7XG4gICAgUmVtb3RlLnNlbmQoe1xuICAgICAgcHJvdG86IFBST1RPLlNFUlZJQ0VTLFxuICAgICAgZGF0YToge1xuICAgICAgICBhY3Rpb246ICdyZXN0YXJ0JyxcbiAgICAgICAgc2VydmljZV9uYW1lOiBpZGVudGlmaWVyXG4gICAgICB9XG4gICAgfSlcbiAgfSxcbiAgLy8gLS0gTG9jYWwgLS0gLy9cblxuICBpbml0aWFsaXplU3RvcmU6ICgpID0+IHtcbiAgICBBcHBEaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIGFjdGlvblR5cGU6IFNlcnZpY2VzQ29uc3RhbnRzLklOSVRfU0VSVklDRVNfU1RPUkVcbiAgICB9KVxuICB9LFxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgdGhlIHNlcnZpY2VzIGxpc3RcbiAgICogQHBhcmFtICB7c3RyaW5nfSBwcm9wZXJ0eSBvZiB0aGUgc2VydmljZVxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IFtvcHRpb25hbF0gdGV4dCBmaWx0ZXJcbiAgICovXG4gIGZpbHRlcjogKHByb3AsIGZpbHRlcikgPT4ge1xuICAgIEFwcERpc3BhdGNoZXIuZGlzcGF0Y2goe1xuICAgICAgYWN0aW9uVHlwZTogU2VydmljZXNDb25zdGFudHMuRklMVEVSX1NFUlZJQ0VTLFxuICAgICAgcHJvcDogcHJvcCxcbiAgICAgIGZpbHRlcjogZmlsdGVyXG4gICAgfSlcbiAgfSxcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBzZXJ2aWNlcyBkYXRhIGZyb20gdGhlIHNlcnZlclxuICAgKi9cbiAgZmV0Y2g6IChsaXN0LCB0aW1lc3RhbXApID0+IHtcbiAgICBBcHBEaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIGFjdGlvblR5cGU6IFNlcnZpY2VzQ29uc3RhbnRzLkZFVENIX1NFUlZJQ0VTLFxuICAgICAgbGlzdDogbGlzdCxcbiAgICAgIHRpbWVzdGFtcDogdGltZXN0YW1wXG4gICAgfSlcbiAgfSxcblxuICB1cGRhdGVTdGF0dXM6IChpZGVudGlmaWVyLCBzdGF0dXMpID0+IHtcbiAgICBBcHBEaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIGFjdGlvblR5cGU6IFNlcnZpY2VzQ29uc3RhbnRzLlVQREFURV9TVEFUVVMsXG4gICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgc3RhdHVzOiBzdGF0dXNcbiAgICB9KVxuICB9LFxuXG4gIGFkZFRvVXBkYXRpbmc6IChpZGVudGlmaWVyKSA9PiB7XG4gICAgQXBwRGlzcGF0Y2hlci5kaXNwYXRjaCh7XG4gICAgICBhY3Rpb25UeXBlOiBTZXJ2aWNlc0NvbnN0YW50cy5BRERfVE9fVVBEQVRJTkcsXG4gICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyXG4gICAgfSlcbiAgfSxcblxuICByZW1vdmVGcm9tVXBkYXRpbmc6IChpZGVudGlmaWVyKSA9PiB7XG4gICAgQXBwRGlzcGF0Y2hlci5kaXNwYXRjaCh7XG4gICAgICBhY3Rpb25UeXBlOiBTZXJ2aWNlc0NvbnN0YW50cy5SRU1PVkVfRlJPTV9VUERBVElORyxcbiAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXJcbiAgICB9KVxuICB9LFxuXG4gIC8qKlxuICAgKiBTZWxlY3QgYSBzZXJ2aWNlXG4gICAqIEBwYXJhbSAge3N0cmluZ30gaWRlbnRpZmllciBJZGVudGlmaWVyIG9mIHRoZSBzZXJ2aWNlIHRvIHN0YXJ5XG4gICAqL1xuICBzZWxlY3Q6IChpZGVudGlmaWVyKSA9PiB7XG4gICAgQXBwRGlzcGF0Y2hlci5kaXNwYXRjaCh7XG4gICAgICBhY3Rpb25UeXBlOiBTZXJ2aWNlc0NvbnN0YW50cy5TRUxFQ1RfU0VSVklDRSxcbiAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXJcbiAgICB9KVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIHNlcmN2aWNlIHNlbGVjdGlvblxuICAgKi9cbiAgY2xlYW5TZWxlY3RlZDogKCkgPT4ge1xuICAgIEFwcERpc3BhdGNoZXIuZGlzcGF0Y2goe1xuICAgICAgYWN0aW9uVHlwZTogU2VydmljZXNDb25zdGFudHMuQ0xFQU5fU0VMRUNURURfU0VSVklDRVxuICAgIH0pXG4gIH0sXG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgc2VydmljZXMgYXV0byB1cGRhdGUgcGVyaW9kXG4gICAqIEBwYXJhbSAge3N0cmluZ30gcGVyaW9kIFBlcmlvZCBpbiBzZWNvbmRzXG4gICAqL1xuICBjaGFuZ2VQZXJpb2Q6IChwZXJpb2QpID0+IHtcbiAgICBBcHBEaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIGFjdGlvblR5cGU6IFNlcnZpY2VzQ29uc3RhbnRzLkNIQU5HRV9QRVJJT0QsXG4gICAgICBwZXJpb2Q6IHBlcmlvZFxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2VydmljZXNBY3Rpb25zXG4iLCIvLyBzcmMvc2VydmljZXMtbWFuYWdlci9jb21wb25lbnRzL3NlcnZpY2VzLWJ1dHRvbnMvaW5kZXguanN4XG5cbmltcG9ydCBSZWFjdCwgeyBQcm9wVHlwZXMgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGluamVjdEludGwgfSBmcm9tICdyZWFjdC1pbnRsJ1xuaW1wb3J0IHtcbiAgQnV0dG9uLCBCdXR0b25Hcm91cCxcbiAgR2x5cGhpY29uLCBPdmVybGF5VHJpZ2dlciwgVG9vbHRpcCwgRm9ybUNvbnRyb2xcbn0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuXG5pbXBvcnQgU2VydmljZSBmcm9tICcuLi8uLi9TZXJ2aWNlJ1xuaW1wb3J0IFNlcnZpY2VzQWN0aW9ucyBmcm9tICcuLi8uLi9hY3Rpb25zJ1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi4vLi4vLi4vY29tbW9uL2NvbXBvbmVudHMvQmFzZUNvbXBvbmVudCdcbmltcG9ydCBSZWZyZXNoQnV0dG9uIGZyb20gJy4uLy4uLy4uL2NvbW1vbi9jb21wb25lbnRzL3JlZnJlc2gtYnV0dG9uJ1xuXG5jbGFzcyBTZXJ2aWNlc0J1dHRvbnMgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgc3RhdGljIGdldCBwcm9wVHlwZXMgKCkge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGVQZXJpb2Q6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgICBzZXJ2aWNlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuaW5zdGFuY2VPZihTZXJ2aWNlKSwgUHJvcFR5cGVzLmJvb2xdKSxcbiAgICAgIGxhc3RVcGRhdGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5ib29sXSksXG4gICAgICBvblBlcmlvZENoYW5nZTogUHJvcFR5cGVzLmZ1bmNcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IGRlZmF1bHRQcm9wcyAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZVBlcmlvZDogMCxcbiAgICAgIHNlcnZpY2U6IGZhbHNlLFxuICAgICAgbGFzdFVwZGF0ZTogZmFsc2VcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIHRoaXMuX2JpbmQoJ19faGFuZGxlU3RhcnRCdXR0b25DbGljaycsICdfX2hhbmRsZVN0b3BCdXR0b25DbGljaycsXG4gICAgICAnX19oYW5kbGVSZXN0YXJ0QnV0dG9uQ2xpY2snKVxuXG4gICAgdGhpcy5nZXRQZXJpb2RzID0gKGRlZmluZU1lc3NhZ2UpID0+IHtcbiAgICAgIHZhciBwZXJpb2RzID0gbmV3IE1hcCgpXG4gICAgICBwZXJpb2RzLnNldCgwLCBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuWF9TZWNvbmRzLCB7IG5TZWNvbmRzOiAwIH0pKVxuICAgICAgcGVyaW9kcy5zZXQoNSwgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLlhfU2Vjb25kcywgeyBuU2Vjb25kczogNSB9KSlcbiAgICAgIHBlcmlvZHMuc2V0KDEwLCBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuWF9TZWNvbmRzLCB7IG5TZWNvbmRzOiAxMCB9KSlcbiAgICAgIHBlcmlvZHMuc2V0KDE1LCBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuWF9TZWNvbmRzLCB7IG5TZWNvbmRzOiAxNSB9KSlcbiAgICAgIHBlcmlvZHMuc2V0KDMwLCBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuWF9TZWNvbmRzLCB7IG5TZWNvbmRzOiAzMCB9KSlcbiAgICAgIHBlcmlvZHMuc2V0KDYwLCBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuWF9NaW51dGVzLCB7IG5NaW51dGVzOiAxIH0pKVxuXG4gICAgICByZXR1cm4gcGVyaW9kc1xuICAgIH1cblxuICAgIC8vIE1lc3NhZ2VzIGRlZmluaXRpb25zXG4gICAgdGhpcy5tZXNzYWdlcyA9IHtcbiAgICAgIGNsaWNrT25BU2VydmljZToge1xuICAgICAgICBpZDogJ2NsaWNrT25BU2VydmljZScsXG4gICAgICAgIGRlZmluZU1lc3NhZ2U6ICdDbGljayBvbiBhIHNlcnZpY2UnXG4gICAgICB9LFxuICAgICAgcmVmcmVzaFNlcnZpY2VzOiB7XG4gICAgICAgIGlkOiAncmVmcmVzaFNlcnZpY2VzJyxcbiAgICAgICAgZGVmaW5lTWVzc2FnZTogJ1JlZnJlc2ggc2VydmljZXMnXG4gICAgICB9LFxuICAgICAgWF9TZWNvbmRzOiB7XG4gICAgICAgIGlkOiAnWF9TZWNvbmRzJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICd7blNlY29uZHMsIHBsdXJhbCwgPTB7TmV2ZXJ9IG9uZXsjIHNlY29uZH0gb3RoZXJ7IyBzZWNvbmRzfX0nLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ09ubHkgdHJhbnNsYXRlIFwiTmV2ZXJcIiwgXCJzZWNvbmRcIiBhbmQgXCJzZWNvbmRzXCInXG4gICAgICB9LFxuICAgICAgWF9NaW51dGVzOiB7XG4gICAgICAgIGlkOiAnWF9NaW51dGVzJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICd7bk1pbnV0ZXMsIHBsdXJhbCwgPTB7TmV2ZXJ9IG9uZXsjIG1pbnV0ZX0gb3RoZXJ7IyBtaW51dGVzfX0nLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ09ubHkgdHJhbnNsYXRlIFwiTmV2ZXJcIiwgXCJtaW51dGVcIiBhbmQgXCJtaW51dGVzXCInXG4gICAgICB9LFxuICAgICAgc3RvcFNlcnZpY2U6IHtcbiAgICAgICAgaWQ6ICdzdG9wU2VydmljZScsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnU3RvcCBzZXJ2aWNlJ1xuICAgICAgfSxcbiAgICAgIHN0YXJ0U2VydmljZToge1xuICAgICAgICBpZDogJ3N0YXJ0U2VydmljZScsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnU3RhcnQgc2VydmljZSdcbiAgICAgIH0sXG4gICAgICByZXN0YXJ0U2VydmljZToge1xuICAgICAgICBpZDogJ3Jlc3RhcnRTZXJ2aWNlJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdSZXN0YXJ0IHNlcnZpY2UnXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuXG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCAoKSB7XG5cbiAgfVxuXG4gIF9faGFuZGxlU3RhcnRCdXR0b25DbGljayAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnNlcnZpY2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBBZGQgdGhlIHNlcnZpY2UgdG8gYSBsaXN0IG9mIHNlcnZpY2VzIGluIHVwZGF0aW5nIHN0YXRlXG4gICAgICBTZXJ2aWNlc0FjdGlvbnMuYWRkVG9VcGRhdGluZyh0aGlzLnByb3BzLnNlcnZpY2UuaWRlbnRpZmllcilcbiAgICAgIC8vIFVwZGF0ZSB0aGUgc2VydmljZSBzdGF0dXNcbiAgICAgIFNlcnZpY2VzQWN0aW9ucy51cGRhdGVTdGF0dXModGhpcy5wcm9wcy5zZXJ2aWNlLmlkZW50aWZpZXIsIFNlcnZpY2UuU1RBUlRfUEVORElORylcbiAgICAgIC8vIFJlcXVlc3QgdGhlIHNlcnZpY2UgY2hhbmdlXG4gICAgICBTZXJ2aWNlc0FjdGlvbnMucmVxdWVzdFN0YXJ0KHRoaXMucHJvcHMuc2VydmljZS5pZGVudGlmaWVyKVxuICAgIH1cbiAgfVxuXG4gIF9faGFuZGxlU3RvcEJ1dHRvbkNsaWNrIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuc2VydmljZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIEFkZCB0aGUgc2VydmljZSB0byBhIGxpc3Qgb2Ygc2VydmljZXMgaW4gdXBkYXRpbmcgc3RhdGVcbiAgICAgIFNlcnZpY2VzQWN0aW9ucy5yZW1vdmVGcm9tVXBkYXRpbmcodGhpcy5wcm9wcy5zZXJ2aWNlLmlkZW50aWZpZXIpXG4gICAgICAvLyBVcGRhdGUgdGhlIHNlcnZpY2Ugc3RhdHVzXG4gICAgICBTZXJ2aWNlc0FjdGlvbnMudXBkYXRlU3RhdHVzKHRoaXMucHJvcHMuc2VydmljZS5pZGVudGlmaWVyLCBTZXJ2aWNlLlNUT1BfUEVORElORylcbiAgICAgIC8vIFJlcXVlc3QgdGhlIHNlcnZpY2UgY2hhbmdlXG4gICAgICBTZXJ2aWNlc0FjdGlvbnMucmVxdWVzdFN0b3AodGhpcy5wcm9wcy5zZXJ2aWNlLmlkZW50aWZpZXIpXG4gICAgfVxuICB9XG5cbiAgX19oYW5kbGVSZXN0YXJ0QnV0dG9uQ2xpY2sgKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5zZXJ2aWNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gQWRkIHRoZSBzZXJ2aWNlIHRvIGEgbGlzdCBvZiBzZXJ2aWNlcyBpbiB1cGRhdGluZyBzdGF0ZVxuICAgICAgU2VydmljZXNBY3Rpb25zLnJlbW92ZUZyb21VcGRhdGluZyh0aGlzLnByb3BzLnNlcnZpY2UuaWRlbnRpZmllcilcbiAgICAgIC8vIFVwZGF0ZSB0aGUgc2VydmljZSBzdGF0dXNcbiAgICAgIFNlcnZpY2VzQWN0aW9ucy51cGRhdGVTdGF0dXModGhpcy5wcm9wcy5zZXJ2aWNlLmlkZW50aWZpZXIsIFNlcnZpY2UuU1RPUF9QRU5ESU5HKVxuICAgICAgLy8gUmVxdWVzdCB0aGUgc2VydmljZSBjaGFuZ2VcbiAgICAgIFNlcnZpY2VzQWN0aW9ucy5yZXF1ZXN0UmVzdGFydCh0aGlzLnByb3BzLnNlcnZpY2UuaWRlbnRpZmllcilcbiAgICB9XG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnByb3BzLnNlcnZpY2VcbiAgICBjb25zdCBkZWZpbmVNZXNzYWdlID0gdGhpcy5wcm9wcy5pbnRsLmZvcm1hdE1lc3NhZ2VcbiAgICBsZXQgc2VydmljZVRleHQgPSBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuY2xpY2tPbkFTZXJ2aWNlKVxuICAgIGxldCBpc1NlbGVjdGVkID0gZmFsc2VcbiAgICBsZXQgc3RhcnRFbmFibGVkID0gZmFsc2VcbiAgICBsZXQgc3RvcEVuYWJsZWQgPSBmYWxzZVxuXG4gICAgaWYgKHNlcnZpY2UgaW5zdGFuY2VvZiBTZXJ2aWNlKSB7XG4gICAgICBzZXJ2aWNlVGV4dCA9IHNlcnZpY2UubmFtZVxuICAgICAgaXNTZWxlY3RlZCA9IHRydWVcbiAgICAgIHN0YXJ0RW5hYmxlZCA9IChzZXJ2aWNlLnN0YXR1cyA9PT0gU2VydmljZS5OT1RfUlVOTklORyB8fCBzZXJ2aWNlLnN0YXR1cyA9PT0gU2VydmljZS5QQVVTRUQpXG4gICAgICBzdG9wRW5hYmxlZCA9IChzZXJ2aWNlLnN0YXR1cyA9PT0gU2VydmljZS5SVU5OSU5HIHx8IHNlcnZpY2Uuc3RhdHVzID09PSBTZXJ2aWNlLlBBVVNFRClcbiAgICB9XG5cbiAgICBjb25zdCB0b29sdGlwID0gKGlkLCBtZXNzYWdlKSA9PiA8VG9vbHRpcCBpZD17aWR9PnttZXNzYWdlfTwvVG9vbHRpcD5cbiAgICBjb25zdCBoYW5kbGVSZWZyZXNoID0gKCkgPT4gU2VydmljZXNBY3Rpb25zLnJlcXVlc3RMaXN0KClcbiAgICBjb25zdCBoYW5kbGVQZXJpb2RDaGFuZ2UgPSAocGVyaW9kKSA9PiB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5vblBlcmlvZENoYW5nZSkge1xuICAgICAgICBTZXJ2aWNlc0FjdGlvbnMuY2hhbmdlUGVyaW9kKHBlcmlvZClcbiAgICAgICAgdGhpcy5wcm9wcy5vblBlcmlvZENoYW5nZShwZXJpb2QpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVmcmVzaEJ1dHRvbiA9IChcbiAgICAgIDxSZWZyZXNoQnV0dG9uXG4gICAgICAgIGxhc3RVcGRhdGU9e3RoaXMucHJvcHMubGFzdFVwZGF0ZX1cbiAgICAgICAgcGVyaW9kcz17dGhpcy5nZXRQZXJpb2RzKGRlZmluZU1lc3NhZ2UpfVxuICAgICAgICBhY3RpdmVQZXJpb2Q9e3RoaXMucHJvcHMudXBkYXRlUGVyaW9kfVxuICAgICAgICBoYW5kbGVSZWZyZXNoPXtoYW5kbGVSZWZyZXNofVxuICAgICAgICBoYW5kbGVQZXJpb2RDaGFuZ2U9e2hhbmRsZVBlcmlvZENoYW5nZX0+XG4gICAgICAgIHsgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLnJlZnJlc2hTZXJ2aWNlcykgfVxuICAgICAgPC9SZWZyZXNoQnV0dG9uPlxuICAgIClcblxuICAgIGNvbnN0IHN0YXJ0QnV0dG9uID0gKFxuICAgICAgPE92ZXJsYXlUcmlnZ2VyXG4gICAgICAgIHBsYWNlbWVudD0nYm90dG9tJ1xuICAgICAgICBvdmVybGF5PXt0b29sdGlwKFxuICAgICAgICAgICdzZXJ2aWNlcy10b29sdGlwLXN0YXJ0JyxcbiAgICAgICAgICBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuc3RhcnRTZXJ2aWNlKVxuICAgICAgICApfT5cbiAgICAgICAgPEJ1dHRvblxuICAgICAgICAgIGRpc2FibGVkPXshc3RhcnRFbmFibGVkIHx8ICFpc1NlbGVjdGVkfVxuICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuX19oYW5kbGVTdGFydEJ1dHRvbkNsaWNrfT5cbiAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdwbGF5JyAvPlxuICAgICAgICA8L0J1dHRvbj5cbiAgICAgIDwvT3ZlcmxheVRyaWdnZXI+XG4gICAgKVxuXG4gICAgY29uc3Qgc3RvcEJ1dHRvbiA9IChcbiAgICAgIDxPdmVybGF5VHJpZ2dlclxuICAgICAgICBwbGFjZW1lbnQ9J2JvdHRvbSdcbiAgICAgICAgb3ZlcmxheT17dG9vbHRpcChcbiAgICAgICAgICAnc2VydmljZXMtdG9vbHRpcC1zdG9wJyxcbiAgICAgICAgICBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuc3RvcFNlcnZpY2UpXG4gICAgICAgICl9PlxuICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgZGlzYWJsZWQ9eyFzdG9wRW5hYmxlZCB8fCAhaXNTZWxlY3RlZH1cbiAgICAgICAgICBvbkNsaWNrPXt0aGlzLl9faGFuZGxlU3RvcEJ1dHRvbkNsaWNrfT5cbiAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdzdG9wJyAvPlxuICAgICAgICA8L0J1dHRvbj5cbiAgICAgIDwvT3ZlcmxheVRyaWdnZXI+XG4gICAgKVxuICAgIGNvbnN0IHJlc3RhcnRCdXR0b24gPSAoXG4gICAgICA8T3ZlcmxheVRyaWdnZXJcbiAgICAgICAgcGxhY2VtZW50PSdib3R0b20nXG4gICAgICAgIG92ZXJsYXk9e3Rvb2x0aXAoXG4gICAgICAgICAgJ3NlcnZpY2VzLXRvb2x0aXAtcmVzdGFydCcsXG4gICAgICAgICAgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLnJlc3RhcnRTZXJ2aWNlKVxuICAgICAgICApfT5cbiAgICAgICAgPEJ1dHRvblxuICAgICAgICAgIGRpc2FibGVkPXshc3RvcEVuYWJsZWQgfHwgIWlzU2VsZWN0ZWR9XG4gICAgICAgICAgb25DbGljaz17dGhpcy5fX2hhbmRsZVJlc3RhcnRCdXR0b25DbGlja30+XG4gICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD0ncmVwZWF0JyAvPlxuICAgICAgICA8L0J1dHRvbj5cbiAgICAgIDwvT3ZlcmxheVRyaWdnZXI+XG4gICAgKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cnPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sLW1kLTMgdGV4dC1sZWZ0Jz5cbiAgICAgICAgICB7IHJlZnJlc2hCdXR0b24gfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbC1tZC03IHRleHQtcmlnaHQnPlxuICAgICAgICAgIDxGb3JtQ29udHJvbC5TdGF0aWM+XG4gICAgICAgICAgICB7IHNlcnZpY2VUZXh0IH1cbiAgICAgICAgICA8L0Zvcm1Db250cm9sLlN0YXRpYz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2wtbWQtMiB0ZXh0LXJpZ2h0Jz5cbiAgICAgICAgICA8QnV0dG9uR3JvdXA+XG4gICAgICAgICAgICB7IHN0YXJ0QnV0dG9uIH1cbiAgICAgICAgICAgIHsgc3RvcEJ1dHRvbiB9XG4gICAgICAgICAgICB7IHJlc3RhcnRCdXR0b24gfVxuICAgICAgICAgIDwvQnV0dG9uR3JvdXA+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdEludGwoU2VydmljZXNCdXR0b25zKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgRm9ybSwgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCwgQ29udHJvbExhYmVsLCBDb2wgfSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQgeyBpbmplY3RJbnRsLCBpbnRsU2hhcGUsIEZvcm1hdHRlZE1lc3NhZ2UgfSBmcm9tICdyZWFjdC1pbnRsJ1xuXG5pbXBvcnQgU2VydmljZSBmcm9tICcuLi8uLi9TZXJ2aWNlJ1xuaW1wb3J0IFNlcnZpY2VzQWN0aW9ucyBmcm9tICcuLi8uLi9hY3Rpb25zJ1xuXG5jbGFzcyBTZXJ2aWNlc0ZpbHRlciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy5faGFuZGxlU2VhcmNoQ2hhbmdlID0gKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBTZXJ2aWNlc0FjdGlvbnMuZmlsdGVyKFsnbmFtZScsICdkZXNjcmlwdGlvbiddLCBldmVudC50YXJnZXQudmFsdWUpXG4gICAgfVxuICAgIHRoaXMuX2hhbmRsZVR5cGVDaGFuZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIFNlcnZpY2VzQWN0aW9ucy5maWx0ZXIoJ3N0YXR1cycsIGV2ZW50LnRhcmdldC52YWx1ZSlcbiAgICB9XG5cbiAgICB0aGlzLm1lc3NhZ2VzID0ge1xuICAgICAgdHlwZVRvRmlsdGVyOiB7XG4gICAgICAgIGlkOiAndHlwZVRvRmlsdGVyJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdUeXBlIHRvIGZpbHRlcidcbiAgICAgIH0sXG4gICAgICBhbnk6IHtcbiAgICAgICAgaWQ6ICdhbnknLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0FueSdcbiAgICAgIH0sXG4gICAgICBzZWFyY2g6IHtcbiAgICAgICAgaWQ6ICdzZWFyY2gnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ1NlYXJjaCdcbiAgICAgIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgaWQ6ICdzdGF0dXMnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ1N0YXR1cydcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IGZpbHRlck5hbWUgPSB0aGlzLnByb3BzLmZpbHRlci5nZXQoJ25hbWUnKVxuICAgIGNvbnN0IGZpbHRlckRlc2NyaXB0aW9uID0gdGhpcy5wcm9wcy5maWx0ZXIuZ2V0KCdkZXNjcmlwdGlvbicpXG4gICAgY29uc3QgZGVmaW5lTWVzc2FnZSA9IHRoaXMucHJvcHMuaW50bC5mb3JtYXRNZXNzYWdlXG5cbiAgICBsZXQgdGV4dFZhbHVlID0gJydcbiAgICBpZiAodHlwZW9mIGZpbHRlck5hbWUgIT09ICd1bmRlZmluZWQnICYmIGZpbHRlck5hbWUubGVuZ3RoID4gMCkge1xuICAgICAgdGV4dFZhbHVlID0gZmlsdGVyTmFtZVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpbHRlckRlc2NyaXB0aW9uICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBmaWx0ZXJEZXNjcmlwdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICB0ZXh0VmFsdWUgPSBmaWx0ZXJEZXNjcmlwdGlvblxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8Rm9ybSBob3Jpem9udGFsIG9uU3VibWl0PXsoZSkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpfT5cbiAgICAgICAgPEZvcm1Hcm91cCBjb250cm9sSWQ9J3NlcnZpY2VzLXNlYXJjaC10ZXh0Jz5cbiAgICAgICAgICA8Q29sIGNvbXBvbmVudENsYXNzPXtDb250cm9sTGFiZWx9IHNtPXsyfT5cbiAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi50aGlzLm1lc3NhZ2VzLnNlYXJjaH0gLz5cbiAgICAgICAgICA8L0NvbD5cbiAgICAgICAgICA8Q29sIHNtPXsxMH0+XG4gICAgICAgICAgICA8Rm9ybUNvbnRyb2xcbiAgICAgICAgICAgICAgY29tcG9uZW50Q2xhc3M9J2lucHV0J1xuICAgICAgICAgICAgICB0eXBlPSd0ZXh0J1xuICAgICAgICAgICAgICBic1NpemU9J3NtYWxsJ1xuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17ZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLnR5cGVUb0ZpbHRlcil9XG4gICAgICAgICAgICAgIHZhbHVlPXt0ZXh0VmFsdWV9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLl9oYW5kbGVTZWFyY2hDaGFuZ2V9IC8+XG4gICAgICAgICAgPC9Db2w+XG4gICAgICAgIDwvRm9ybUdyb3VwPlxuICAgICAgICA8Rm9ybUdyb3VwIGNvbnRyb2xJZD0nc2VydmljZXMtc2VhcmNoLXN0YXR1cyc+XG4gICAgICAgICAgPENvbCBjb21wb25lbnRDbGFzcz17Q29udHJvbExhYmVsfSBzbT17Mn0+XG4gICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4udGhpcy5tZXNzYWdlcy5zdGF0dXN9IC8+XG4gICAgICAgICAgPC9Db2w+XG4gICAgICAgICAgPENvbCBzbT17MTB9PlxuICAgICAgICAgICAgPEZvcm1Db250cm9sXG4gICAgICAgICAgICAgIGNvbXBvbmVudENsYXNzPSdzZWxlY3QnXG4gICAgICAgICAgICAgIGJzU2l6ZT0nc21hbGwnXG4gICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnByb3BzLmZpbHRlci5nZXQoJ3N0YXR1cycpfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5faGFuZGxlVHlwZUNoYW5nZX0+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Jyc+XG4gICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLnRoaXMubWVzc2FnZXMuYW55fSAvPlxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFNlcnZpY2UucG9zc2libGVTdGF0dXMubWFwKChzdGF0dXMsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17aW5kZXh9IHZhbHVlPXtzdGF0dXMudmFsdWV9PlxuICAgICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4uc3RhdHVzLm1lc3NhZ2V9IC8+XG4gICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L0Zvcm1Db250cm9sPlxuICAgICAgICAgIDwvQ29sPlxuICAgICAgICA8L0Zvcm1Hcm91cD5cbiAgICAgIDwvRm9ybT5cbiAgICApXG4gIH1cbn1cblxuU2VydmljZXNGaWx0ZXIucHJvcFR5cGVzID0ge1xuICBmaWx0ZXI6IFJlYWN0LlByb3BUeXBlcy5pbnN0YW5jZU9mKE1hcCkuaXNSZXF1aXJlZCxcbiAgaW50bDogaW50bFNoYXBlLmlzUmVxdWlyZWRcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5qZWN0SW50bChTZXJ2aWNlc0ZpbHRlcilcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFBhbmVsIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuaW1wb3J0IHsgaW5qZWN0SW50bCwgaW50bFNoYXBlIH0gZnJvbSAncmVhY3QtaW50bCdcblxuaW1wb3J0IExvZ2dlciBmcm9tICcuLi8uLi8uLi9jb21tb24vbGliL0xvZ2dlcidcbmltcG9ydCBTZXJ2aWNlIGZyb20gJy4uLy4uL1NlcnZpY2UnXG5pbXBvcnQgU2VydmljZXNBY3Rpb25zIGZyb20gJy4uLy4uL2FjdGlvbnMnXG5pbXBvcnQgU2VydmljZXNTdG9yZSBmcm9tICcuLi8uLi9zdG9yZSdcblxuLy8gQ29tcG9uZW50c1xuaW1wb3J0IFNlcnZpY2VzRmlsdGVyIGZyb20gJy4uL3NlcnZpY2VzLWZpbHRlcidcbmltcG9ydCBTZXJ2aWNlc0J1dHRvbnMgZnJvbSAnLi4vc2VydmljZXMtYnV0dG9ucydcbmltcG9ydCBTZXJ2aWNlc1RhYmxlIGZyb20gJy4uL3NlcnZpY2VzLXRhYmxlJ1xuXG4vLyBIQUNLOiBGbHV4IGNhbm5vdCBzdXBwb3J0IGluamVjdEludGwgaW4gbWFpbiBDb21wb25lbnRzXG4vLyBUT0RPOiBNaWdyYXRlIHRvIFJlZHV4XG5jbGFzcyBTZXJ2aWNlc01haW5QdXJlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICAvLyBNZXNzYWdlcyBkZWZpbml0aW9uc1xuICAgIHRoaXMubWVzc2FnZXMgPSB7XG4gICAgICBmaWx0ZXI6IHtcbiAgICAgICAgaWQ6ICdmaWx0ZXInLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0ZpbHRlcidcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBzZXJ2aWNlcywgc2VsZWN0ZWRTZXJ2aWNlLCBmaWx0ZXIsIGxhc3RVcGRhdGUsIHVwZGF0ZVBlcmlvZCwgb25QZXJpb2RDaGFuZ2VcbiAgICB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IGRlZmluZU1lc3NhZ2UgPSB0aGlzLnByb3BzLmludGwuZm9ybWF0TWVzc2FnZVxuICAgIHJldHVybiAoXG4gICAgICA8c2VjdGlvbiBpZD0nc2VydmljZXMtbWFpbic+XG4gICAgICAgIDxQYW5lbFxuICAgICAgICAgIGNvbGxhcHNpYmxlXG4gICAgICAgICAgaGVhZGVyPXtkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuZmlsdGVyKX1cbiAgICAgICAgICBjbGFzc05hbWU9J2hpZGRlbi14cyc+XG4gICAgICAgICAgPFNlcnZpY2VzRmlsdGVyIGZpbHRlcj17ZmlsdGVyfSAvPlxuICAgICAgICA8L1BhbmVsPlxuICAgICAgICA8U2VydmljZXNCdXR0b25zXG4gICAgICAgICAgc2VydmljZT17c2VsZWN0ZWRTZXJ2aWNlfVxuICAgICAgICAgIGxhc3RVcGRhdGU9e2xhc3RVcGRhdGV9XG4gICAgICAgICAgdXBkYXRlUGVyaW9kPXt1cGRhdGVQZXJpb2R9XG4gICAgICAgICAgb25QZXJpb2RDaGFuZ2U9e29uUGVyaW9kQ2hhbmdlfSAvPlxuICAgICAgICA8YnIgLz5cbiAgICAgICAgPFNlcnZpY2VzVGFibGUgc2VydmljZXM9e3NlcnZpY2VzfSBsYXN0VXBkYXRlPXtsYXN0VXBkYXRlfSAvPlxuICAgICAgPC9zZWN0aW9uPlxuICAgIClcbiAgfVxufVxuXG5jb25zdCBTZXJ2aWNlc01haW5JbnRsID0gaW5qZWN0SW50bChTZXJ2aWNlc01haW5QdXJlKVxuXG4vLyBJbXBsZW1lbnRzIGZsdXggQ29udGFpbmVyXG5jbGFzcyBTZXJ2aWNlc01haW4gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0aWMgZ2V0U3RvcmVzICgpIHtcbiAgICByZXR1cm4gW1NlcnZpY2VzU3RvcmVdXG4gIH1cblxuICBzdGF0aWMgY2FsY3VsYXRlU3RhdGUgKHByZXZTdGF0ZSwgcHJvcHMpIHtcbiAgICBjb25zdCBzdGF0aWNMb2dnZXIgPSBuZXcgTG9nZ2VyKHsgc2VjdGlvbjogJ1NlcnZpY2VzIG1haW4gKHN0YXRpYyknIH0pXG5cbiAgICBsZXQgc2VydmljZXNcbiAgICB0cnkge1xuICAgICAgc2VydmljZXMgPSBTZXJ2aWNlc01haW4uZ2V0UHJvY2Vzc2VkU2VydmljZXMoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzdGF0aWNMb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlcnZpY2VzOiBzZXJ2aWNlcyB8fCBbXSxcbiAgICAgIHNlbGVjdGVkU2VydmljZTogU2VydmljZXNTdG9yZS5zZWxlY3RlZFNlcnZpY2UsXG4gICAgICBsYXN0VXBkYXRlOiBTZXJ2aWNlc1N0b3JlLnNlcnZpY2VzTGFzdFVwZGF0ZSxcbiAgICAgIHVwZGF0ZVBlcmlvZDogU2VydmljZXNTdG9yZS51cGRhdGVQZXJpb2QsXG4gICAgICBmaWx0ZXI6IFNlcnZpY2VzU3RvcmUuZmlsdGVyXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldFByb2Nlc3NlZFNlcnZpY2VzICgpIHtcbiAgICBjb25zdCBzZXJ2aWNlcyA9IFNlcnZpY2VzU3RvcmUuc2VydmljZXNcbiAgICBjb25zdCBmaWx0ZXIgPSBTZXJ2aWNlc1N0b3JlLmZpbHRlclxuXG4gICAgaWYgKCEoc2VydmljZXMgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBzZXJ2aWNlcyBsaXN0IHNob3VsZCBiZSBhbiBBcnJheScpXG4gICAgfVxuICAgIGlmICghKGZpbHRlciBpbnN0YW5jZW9mIE1hcCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBmaWx0ZXIgc2hvdWxkIGJlIGEgTWFwJylcbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgdGhlIHNlcnZpY2VzXG4gICAgbGV0IHByb2Nlc3NlZFNlcnZpY2VzID0gc2VydmljZXMuZmlsdGVyKChzZXJ2aWNlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgbmFtZUZpbHRlciA9IGZpbHRlci5nZXQoJ25hbWUnKVxuICAgICAgY29uc3QgZGVzY0ZpbHRlciA9IGZpbHRlci5nZXQoJ2Rlc2NyaXB0aW9uJylcbiAgICAgIGNvbnN0IHN0YXR1c0ZpbHRlciA9IGZpbHRlci5nZXQoJ3N0YXR1cycpXG5cbiAgICAgIC8vIENoZWNrIG5hbWVcbiAgICAgIGlmICh0eXBlb2YgbmFtZUZpbHRlciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmFtZUZpbHRlci5sZW5ndGggPiAwICYmXG4gICAgICAgIHNlcnZpY2UubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YobmFtZUZpbHRlci50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgLy8gQ2hlY2sgZGVzY3JpcHRpb25cbiAgICAgICAgaWYgKHR5cGVvZiBkZXNjRmlsdGVyICE9PSAndW5kZWZpbmVkJyAmJiBkZXNjRmlsdGVyLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIHNlcnZpY2UuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5pbmRleE9mKGRlc2NGaWx0ZXIudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgc3RhdHVzXG4gICAgICBpZiAodHlwZW9mIHN0YXR1c0ZpbHRlciAhPT0gJ3VuZGVmaW5lZCcgJiYgc3RhdHVzRmlsdGVyLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICBzZXJ2aWNlLnN0YXR1cy50b0xvd2VyQ2FzZSgpICE9PSBzdGF0dXNGaWx0ZXIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSlcblxuICAgIC8vIFByb2Nlc3MgYSBzb3J0IHdpdGggdGhlIGZvdW5kIGl0ZW1cbiAgICBjb25zdCBzb3J0SGFuZGxlciA9IFNlcnZpY2Uuc29ydEhhbmRsZXIoJ2lkZW50aWZpZXInKVxuICAgIHByb2Nlc3NlZFNlcnZpY2VzID0gcHJvY2Vzc2VkU2VydmljZXMuc29ydChzb3J0SGFuZGxlcilcblxuICAgIHJldHVybiBwcm9jZXNzZWRTZXJ2aWNlc1xuICB9XG5cbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICB0aGlzLnN0YXJ0VXBkYXRlSW50ZXJ2YWwgPSAocGVyaW9kKSA9PiB7XG4gICAgICB0aGlzLnN0b3BVcGRhdGVJbnRlcnZhbCgpXG4gICAgICBpZiAocGVyaW9kKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUludGVydmFsSUQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgU2VydmljZXNBY3Rpb25zLnJlcXVlc3RMaXN0KClcbiAgICAgICAgfSwgcGVyaW9kICogMTAwMClcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdG9wVXBkYXRlSW50ZXJ2YWwgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fdXBkYXRlSW50ZXJ2YWxJRCkgY2xlYXJJbnRlcnZhbCh0aGlzLl91cGRhdGVJbnRlcnZhbElEKVxuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICAvLyBGZXRjaCB0aGUgc2VydmljZXMgYmVmb3JlIHJlbmRlcmluZ1xuICAgIGlmICh0aGlzLnN0YXRlLmxhc3RVcGRhdGUgPT09IGZhbHNlKSBTZXJ2aWNlc0FjdGlvbnMucmVxdWVzdExpc3QoKVxuICAgIHRoaXMuc3RhcnRVcGRhdGVJbnRlcnZhbCh0aGlzLnN0YXRlLnVwZGF0ZVBlcmlvZClcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50ICgpIHtcbiAgICB0aGlzLnN0b3BVcGRhdGVJbnRlcnZhbCgpXG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8U2VydmljZXNNYWluSW50bFxuICAgICAgICB7Li4udGhpcy5zdGF0ZX1cbiAgICAgICAgb25QZXJpb2RDaGFuZ2U9e3RoaXMuc3RhcnRVcGRhdGVJbnRlcnZhbH0gLz5cbiAgICApXG4gIH1cbn1cblxuU2VydmljZXNNYWluLnByb3BUeXBlcyA9IHtcbiAgc2VydmljZXM6IFJlYWN0LlByb3BUeXBlcy5hcnJheU9mKFJlYWN0LlByb3BUeXBlcy5pbnN0YW5jZU9mKFNlcnZpY2UpKSxcbiAgc2VsZWN0ZWRTZXJ2aWNlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBsYXN0VXBkYXRlOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICB1cGRhdGVQZXJpb2Q6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIGZpbHRlcjogUmVhY3QuUHJvcFR5cGVzLmluc3RhbmNlT2YoTWFwKVxufVxuXG5TZXJ2aWNlc01haW5QdXJlLnByb3BUeXBlcyA9IE9iamVjdC5hc3NpZ24oe30sIFNlcnZpY2VzTWFpbi5wcm9wVHlwZXMsIHtcbiAgaW50bDogaW50bFNoYXBlLmlzUmVxdWlyZWRcbn0pXG5cbmV4cG9ydCBkZWZhdWx0IFNlcnZpY2VzTWFpblxuIiwiLy8gc3JjL3NlcnZpY2VzLW1hbmFnZXIvY29tcG9uZW50cy9zZXJ2aWNlcy10YWJsZS9pbmRleC5qc3hcblxuaW1wb3J0IFJlYWN0LCB7IFByb3BUeXBlcyB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQWxlcnQgfSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQgeyBpbmplY3RJbnRsIH0gZnJvbSAncmVhY3QtaW50bCdcblxuaW1wb3J0IFNlcnZpY2UgZnJvbSAnLi4vLi4vU2VydmljZSdcbmltcG9ydCBTZXJ2aWNlc0FjdGlvbnMgZnJvbSAnLi4vLi4vYWN0aW9ucydcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9jb21wb25lbnRzL0Jhc2VDb21wb25lbnQnXG5pbXBvcnQgRGF0YVRhYmxlLCB7IERhdGFDb2x1bW4gfSBmcm9tICcuLi8uLi8uLi9jb21tb24vY29tcG9uZW50cy9kYXRhLXRhYmxlJ1xuXG5jbGFzcyBTZXJ2aWNlc1RhYmxlIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcFR5cGVzICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VydmljZXM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5pbnN0YW5jZU9mKFNlcnZpY2UpKSxcbiAgICAgIGxhc3RVcGRhdGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5ib29sXSksXG4gICAgICBvblJvd1NlbGVjdGVkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgIG9uUm93VW5zZWxlY3RlZDogUHJvcFR5cGVzLmZ1bmNcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IGRlZmF1bHRQcm9wcyAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlcnZpY2VzOiBbXSxcbiAgICAgIGxhc3RVcGRhdGU6IGZhbHNlLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICB0aGlzLmRlZmF1bHRIZWlnaHQgPSA0MDBcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBoZWlnaHQ6IHRoaXMuZGVmYXVsdEhlaWdodFxuICAgIH1cbiAgICB0aGlzLl9iaW5kKCdfX2hhbmRsZVJlc2l6ZScpXG5cbiAgICB0aGlzLm1lc3NhZ2VzID0ge1xuICAgICAgaWRlbnRpZmllcjoge1xuICAgICAgICBpZDogJ2lkZW50aWZpZXInLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0lkZW50aWZpZXInXG4gICAgICB9LFxuICAgICAgbmFtZToge1xuICAgICAgICBpZDogJ25hbWUnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ05hbWUnXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IHtcbiAgICAgICAgaWQ6ICdkZXNjcmlwdGlvbicsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnRGVzY3JpcHRpb24nXG4gICAgICB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGlkOiAnc3RhdHVzJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdTdGF0dXMnXG4gICAgICB9LFxuICAgICAgbG9hZGluZ0RvdHM6IHtcbiAgICAgICAgaWQ6ICdsb2FkaW5nRG90cycsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnTG9hZGluZy4uLidcbiAgICAgIH0sXG4gICAgICB0aGVyZUFyZU5vU2VydmljZXM6IHtcbiAgICAgICAgaWQ6ICd0aGVyZUFyZU5vU2VydmljZXMnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZXJlIGFyZSBubyBzZXJ2aWNlcydcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfX2hhbmRsZVJlc2l6ZSAoZXZlbnQpIHtcbiAgICBjb25zdCBoZWlnaHRXaW5kb3cgPSBOdW1iZXIuaXNOYU4od2luZG93LmlubmVySGVpZ2h0KVxuICAgICAgPyB3aW5kb3cuY2xpZW50SGVpZ2h0XG4gICAgICA6IHdpbmRvdy5pbm5lckhlaWdodFxuICAgIGNvbnN0IHRoaXNUYWJsZVRvVG9wID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2VzLXRhYmxlJykub2Zmc2V0VG9wXG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGhlaWdodDogKGhlaWdodFdpbmRvdylcbiAgICAgICAgPyAoaGVpZ2h0V2luZG93IC0gdGhpc1RhYmxlVG9Ub3ApIC0gMTBcbiAgICAgICAgOiB0aGlzLmRlZmF1bHRIZWlnaHRcbiAgICB9KVxuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIHRoaXMuX19oYW5kbGVSZXNpemUoKVxuXG4gICAgaWYgKHdpbmRvdykgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX19oYW5kbGVSZXNpemUpXG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCAoKSB7XG4gICAgaWYgKHdpbmRvdykgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX19oYW5kbGVSZXNpemUpXG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZVxuICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IGRlZmluZU1lc3NhZ2UgPSB0aGlzLnByb3BzLmludGwuZm9ybWF0TWVzc2FnZVxuICAgIGNvbnN0IHNlcnZpY2VzQ29tcGxldGVkID0gdGhpcy5wcm9wcy5zZXJ2aWNlcy5tYXAoKHNlcnZpY2UpID0+IHtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzZXJ2aWNlLFxuICAgICAgICB7IHN0YXR1c01lc3NhZ2U6IGRlZmluZU1lc3NhZ2Uoc2VydmljZS5tZXNzYWdlU3RhdHVzKSB9KVxuICAgIH0pXG5cbiAgICBjb25zdCBpZGVudGlmaWVyQ29sID0gbmV3IERhdGFDb2x1bW4oe1xuICAgICAgZGF0YUtleTogJ2lkZW50aWZpZXInLFxuICAgICAgbmFtZTogZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLmlkZW50aWZpZXIpLFxuICAgICAgaGlkZGVuOiB0cnVlXG4gICAgfSlcbiAgICBjb25zdCBuYW1lQ29sID0gbmV3IERhdGFDb2x1bW4oe1xuICAgICAgZGF0YUtleTogJ25hbWUnLFxuICAgICAgbmFtZTogZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLm5hbWUpLFxuICAgICAgYWxpZ246ICdsZWZ0JyxcbiAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgc29ydFByb3BzOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnXG4gICAgICB9XG4gICAgfSlcbiAgICBjb25zdCBkZXNjQ29sID0gbmV3IERhdGFDb2x1bW4oe1xuICAgICAgZGF0YUtleTogJ2Rlc2NyaXB0aW9uJyxcbiAgICAgIG5hbWU6IGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy5kZXNjcmlwdGlvbiksXG4gICAgICBhbGlnbjogJ2xlZnQnLFxuICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICBzb3J0UHJvcHM6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZydcbiAgICAgIH1cbiAgICB9KVxuICAgIGNvbnN0IHN0YXR1c0NvbCA9IG5ldyBEYXRhQ29sdW1uKHtcbiAgICAgIGRhdGFLZXk6ICdzdGF0dXNNZXNzYWdlJyxcbiAgICAgIG5hbWU6IGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy5zdGF0dXMpLFxuICAgICAgYWxpZ246ICdyaWdodCcsXG4gICAgICB3aWR0aDogJzEwMHB4JyxcbiAgICAgIHNvcnRhYmxlOiB0cnVlXG4gICAgfSlcbiAgICBjb25zdCBvcmRlckJ5ID0ge1xuICAgICAgY29sdW1uS2V5OiBuYW1lQ29sLmRhdGFLZXksXG4gICAgICB2YWx1ZTogJ0FTQydcbiAgICB9XG5cbiAgICBjb25zdCBvblJvd1NlbGVjdGVkID0gKGlkZW50aWZpZXIsIHJvd0RhdGEpID0+IFNlcnZpY2VzQWN0aW9ucy5zZWxlY3Qocm93RGF0YS5pZGVudGlmaWVyKVxuICAgIGNvbnN0IG9uUm93VW5zZWxlY3RlZCA9IChpZGVudGlmaWVyLCByb3dEYXRhKSA9PiBTZXJ2aWNlc0FjdGlvbnMuY2xlYW5TZWxlY3RlZCgpXG5cbiAgICBjb25zdCBjb21wb25lbnRTdHlsZSA9IHt9XG4gICAgaWYgKHN0YXRlLmhlaWdodCkge1xuICAgICAgY29tcG9uZW50U3R5bGUuaGVpZ2h0ID0gc3RhdGUuaGVpZ2h0ICsgJ3B4J1xuICAgICAgY29tcG9uZW50U3R5bGUub3ZlcmZsb3cgPSAnYXV0bydcbiAgICAgIGNvbXBvbmVudFN0eWxlLm1hcmdpbkJvdHRvbSA9ICcxMHB4J1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGlkPSdzZXJ2aWNlcy10YWJsZScgc3R5bGU9e2NvbXBvbmVudFN0eWxlfT5cbiAgICAgICAgeyAhcHJvcHMubGFzdFVwZGF0ZSAmJlxuICAgICAgICAgIDxBbGVydCBic1N0eWxlPSdpbmZvJz5cbiAgICAgICAgICAgIHsgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLmxvYWRpbmdEb3RzKSB9XG4gICAgICAgICAgPC9BbGVydD5cbiAgICAgICAgfVxuICAgICAgICB7IHByb3BzLmxhc3RVcGRhdGUgJiYgc2VydmljZXNDb21wbGV0ZWQubGVuZ3RoIDw9IDAgJiZcbiAgICAgICAgICA8QWxlcnQgYnNTdHlsZT0nZGFuZ2VyJz5cbiAgICAgICAgICAgIHsgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLnRoZXJlQXJlTm9TZXJ2aWNlcykgfVxuICAgICAgICAgIDwvQWxlcnQ+XG4gICAgICAgIH1cbiAgICAgICAgeyBwcm9wcy5sYXN0VXBkYXRlICYmIHNlcnZpY2VzQ29tcGxldGVkLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICA8RGF0YVRhYmxlXG4gICAgICAgICAgICBrZXlWYWx1ZT0naWRlbnRpZmllcidcbiAgICAgICAgICAgIGNvbHVtbnM9e1tpZGVudGlmaWVyQ29sLCBuYW1lQ29sLCBkZXNjQ29sLCBzdGF0dXNDb2xdfVxuICAgICAgICAgICAgb3JkZXJCeT17b3JkZXJCeX1cbiAgICAgICAgICAgIGRhdGE9e3NlcnZpY2VzQ29tcGxldGVkfVxuICAgICAgICAgICAgYm9yZGVyZWRcbiAgICAgICAgICAgIGhvdmVyXG4gICAgICAgICAgICByZXNwb25zaXZlXG4gICAgICAgICAgICBzdHJpcGVkXG4gICAgICAgICAgICBjb25kZW5zZWRcbiAgICAgICAgICAgIG9uUm93U2VsZWN0ZWQ9e3Byb3BzLm9uUm93U2VsZWN0ZWQgfHwgb25Sb3dTZWxlY3RlZH1cbiAgICAgICAgICAgIG9uUm93VW5zZWxlY3RlZD17cHJvcHMub25Sb3dVbnNlbGVjdGVkIHx8IG9uUm93VW5zZWxlY3RlZH0gLz5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdEludGwoU2VydmljZXNUYWJsZSlcbiIsImNvbnN0IFNlcnZpY2VzQ29uc3RhbnRzID0ge1xuICBJTklUX1NFUlZJQ0VTX1NUT1JFOiAnaW5pdC1zZXJ2aWNlcy1zdG9yZScsXG4gIEZJTFRFUl9TRVJWSUNFUzogJ2ZpbHRlci1zZXJ2aWNlcycsXG4gIFNPUlRfU0VSVklDRVM6ICdzb3J0LXNlcnZpY2VzJyxcbiAgRkVUQ0hfU0VSVklDRVM6ICdmZXRjaC1zZXJ2aWNlcycsXG4gIFNFTEVDVF9TRVJWSUNFOiAnc2VsZWN0LXNlcnZpY2UnLFxuICBDTEVBTl9TRUxFQ1RFRF9TRVJWSUNFOiAnY2xlYW4tc2VsZWN0ZWQtc2VydmljZScsXG4gIFNUQVJUX1NFUlZJQ0U6ICdzdGFydC1zZXJ2aWNlJyxcbiAgU1RPUF9TRVJWSUNFOiAnc3RvcC1zZXJ2aWNlJyxcbiAgVVBEQVRFX1NUQVRVUzogJ3VwZGF0ZS1zZXJ2aWNlLXN0YXR1cycsXG4gIEFERF9UT19VUERBVElORzogJ2FkZC1zZXJ2aWNlLXRvLXVwZGF0aW5nJyxcbiAgUkVNT1ZFX0ZST01fVVBEQVRJTkc6ICdyZW1vdmUtc2VydmljZS1mcm9tLXVwZGF0aW5nJyxcbiAgQ0hBTkdFX1BFUklPRDogJ3NlcnZpY2VzLWNoYW5nZS1wZXJpb2QnXG59XG5cbmV4cG9ydCBkZWZhdWx0IFNlcnZpY2VzQ29uc3RhbnRzXG4iLCIvLyBzcmMvc2VydmljZXMtbWFuYWdlci9zdG9yZS9pbmRleC5qc1xuXG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ2ZsdXgvdXRpbHMnXG5pbXBvcnQgQXBwRGlzcGF0Y2hlciBmcm9tICcuLi8uLi9kaXNwYXRjaGVyJ1xuaW1wb3J0IExvZ2dlciBmcm9tICcuLi8uLi9jb21tb24vbGliL0xvZ2dlcidcbmltcG9ydCBTZXJ2aWNlc0NvbnN0YW50cyBmcm9tICcuLi9jb25zdGFudHMnXG5pbXBvcnQgU2VydmljZSBmcm9tICcuLi9TZXJ2aWNlJ1xuXG52YXIgbG9nZ2VyID0gbmV3IExvZ2dlcih7IHNlY3Rpb246ICdTZXJ2aWNlcyBzdG9yZScgfSlcblxuY2xhc3MgU2VydmljZXNTdG9yZSBleHRlbmRzIFN0b3JlIHtcbiAgY29uc3RydWN0b3IgKGRpc3BhdGNoZXIpIHtcbiAgICBzdXBlcihkaXNwYXRjaGVyKVxuXG4gICAgdGhpcy5pbml0aWFsaXplKClcbiAgfVxuXG4gIGluaXRpYWxpemUgKCkge1xuICAgIC8vIFNlcnZpY2VzIGxpc3RcbiAgICB0aGlzLl9fc2VydmljZXMgPSBuZXcgTWFwKClcbiAgICAvLyBMYXN0IHVwZGF0ZSBvZiBzZXJ2aWNlcyBsaXN0XG4gICAgdGhpcy5fX3NlcnZpY2VzTGFzdFVwZGF0ZSA9IGZhbHNlXG4gICAgLy8gU2VsZWN0ZWQgc2VydmljZVxuICAgIHRoaXMuX19jbGVhblNlbGVjdGVkU2VydmljZSgpXG4gICAgLy8gVXBkYXRpbmcgc2VydmljZXNcbiAgICB0aGlzLl9fY2xlYW5VcGRhdGluZ1NlcnZpY2VzKClcbiAgICAvLyBTZXJ2aWNlcyBmaWx0ZXJcbiAgICB0aGlzLl9fY2xlYW5GaWx0ZXIoKVxuICAgIC8vIERlZmF1bHQgdXBkYXRlIHBlcmlvZFxuICAgIHRoaXMuX191cGRhdGVQZXJpb2QgPSA2MCAvLyBEZWZhdWx0XG4gIH1cblxuICAvLyAtLSBHZXR0ZXJzIC0tIC8vXG5cbiAgc2VydmljZSAoaWRlbnRpZmllcikge1xuICAgIGlmICh0eXBlb2YgaWRlbnRpZmllciA9PT0gJ3VuZGVmaW5lZCcgfHwgaWRlbnRpZmllci5sZW5ndGggPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHNlcnZpY2UgaWRlbnRpZmllciBpcyBlbXB0eScpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgaWRlbnRpZmllciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBpZGVudGlmaWVyIGlzIG5vdCBhIHN0cmluZycpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9fc2VydmljZXMuZ2V0KGlkZW50aWZpZXIpXG4gIH1cblxuICBnZXQgc2VydmljZXMgKCkge1xuICAgIHJldHVybiBbLi4udGhpcy5fX3NlcnZpY2VzLnZhbHVlcygpXVxuICB9XG5cbiAgZ2V0IHNlcnZpY2VzTGFzdFVwZGF0ZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19zZXJ2aWNlc0xhc3RVcGRhdGVcbiAgfVxuXG4gIGdldCBzZWxlY3RlZFNlcnZpY2UgKCkge1xuICAgIGlmICh0aGlzLl9fc2VsZWN0ZWRTZXJ2aWNlLmxlbmd0aCA+IDAgJiYgdGhpcy5fX3NlcnZpY2VzLmhhcyh0aGlzLl9fc2VsZWN0ZWRTZXJ2aWNlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19zZXJ2aWNlcy5nZXQodGhpcy5fX3NlbGVjdGVkU2VydmljZSlcbiAgICB9IGVsc2UgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpc1NlcnZpY2VVcGRhdGluZyAoaWRlbnRpZmllcikge1xuICAgIHJldHVybiAodGhpcy5fX3NlcnZpY2VzLmhhcyhpZGVudGlmaWVyKSAmJiB0aGlzLl9fc2VydmljZXNVcGRhdGluZy5pbmRleE9mKGlkZW50aWZpZXIpICE9PSAtMSlcbiAgfVxuXG4gIGdldCBmaWx0ZXIgKCkge1xuICAgIHJldHVybiB0aGlzLl9fZmlsdGVyXG4gIH1cblxuICBnZXQgdXBkYXRlUGVyaW9kICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3VwZGF0ZVBlcmlvZFxuICB9XG5cbiAgLy8gLS0gU2V0dGVycyAoUHJpdmF0ZSkgLS0gLy9cblxuICAvKlxuICAgKiBUaGUgc2VydmljZXMgcGFyYW1ldGVyIGFjY2VwdCBhbiBhcnJheSBvZiBTZXJ2aWNlIG9iamVjdHNcbiAgICogb3IgYW55IGl0ZXJhYmxlIG9mIGpzIG9iamVjdHMuIElmIHRoZSBpZGVudGlmaWVyIHByb3BlcnR5XG4gICAqIGRvbnQgZXhpc3QgaW4gdGhlIGpzIG9iamVjdCwgdGhlaXIga2V5IHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIF9fc2V0U2VydmljZXMgKHNlcnZpY2VzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2Ygc2VydmljZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBzZXJ2aWNlcyBzb3VyY2UgaXMgZW1wdHknKVxuICAgICAgfVxuICAgICAgdGhpcy5fX2NsZWFyU2VydmljZXMoKVxuICAgICAgdGhpcy5fX2FkZFNlcnZpY2VzKHNlcnZpY2VzKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBQcm9wYWdhdGUgZXJyb3JcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLypcbiAgICogVGhlIHNlcnZpY2VzIHBhcmFtZXRlciBhY2NlcHQgYW4gYXJyYXkgb2YgU2VydmljZSBvYmplY3RzXG4gICAqIG9yIGFueSBpdGVyYWJsZSBvZiBqcyBvYmplY3RzLiBJZiB0aGUgaWRlbnRpZmllciBwcm9wZXJ0eVxuICAgKiBkb250IGV4aXN0IGluIHRoZSBqcyBvYmplY3QsIHRoZWlyIGtleSB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBfX2FkZFNlcnZpY2VzIChzZXJ2aWNlcykge1xuICAgIGlmICh0eXBlb2Ygc2VydmljZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgc2VydmljZXMgc291cmNlIGlzIGVtcHR5JylcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gJ3NlcnZpY2VzJyBzaG91bGQgYmUgaXRlcmFibGVcbiAgICAgIGxldCBzZXJ2aWNlc0l0ZXJhYmxlXG5cbiAgICAgIC8vIEl0ZXJhYmxlXG4gICAgICBpZiAodHlwZW9mIHNlcnZpY2VzW1N5bWJvbC5pdGVyYXRvcl0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNlcnZpY2VzSXRlcmFibGUgPSBzZXJ2aWNlc1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VydmljZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIEdldCBhbiBpdGVyYWJsZSBvYmplY3QgZnJvbSB0aGUgcGxhaW4ganMgb2JqZWN0XG4gICAgICAgIHNlcnZpY2VzSXRlcmFibGUgPSBuZXcgTWFwKClcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHNlcnZpY2VzKSB7XG4gICAgICAgICAgc2VydmljZXNJdGVyYWJsZS5zZXQoa2V5LCBzZXJ2aWNlc1trZXldKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2VydmljZXNJdGVyYWJsZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHNlcnZpY2VzIHNvdXJjZSBpcyBub3QgaXRlcmFibGUnKVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgW2tleSwgc2VydmljZV0gb2Ygc2VydmljZXNJdGVyYWJsZSkge1xuICAgICAgICAvLyBpZGVudGlmaWVyIGNoZWNrXG4gICAgICAgIGlmICh0eXBlb2Ygc2VydmljZS5pZGVudGlmaWVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2VydmljZS5pZGVudGlmaWVyID0ga2V5XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdUaGUgZWxlbWVudCBpcyBub3Qgd2VsbCBmb3JtZWQgYW5kIGNhbm5vdCBiZSBpbnRyb2R1Y2VkJywgc2VydmljZSlcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fX2FkZFNlcnZpY2Uoc2VydmljZSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gUHJvcGFnYXRlIGVycm9yXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIF9fY2xlYXJTZXJ2aWNlIChpZGVudGlmaWVyKSB7XG4gICAgaWYgKHR5cGVvZiBpZGVudGlmaWVyID09PSAndW5kZWZpbmVkJyB8fCBpZGVudGlmaWVyLmxlbmd0aCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgc2VydmljZSBpZGVudGlmaWVyIGlzIGVtcHR5JylcbiAgICB9XG5cbiAgICB0aGlzLl9fc2VydmljZXMuZGVsZXRlKGlkZW50aWZpZXIpXG4gIH1cblxuICBfX2NsZWFyU2VydmljZXMgKCkge1xuICAgIGlmICh0aGlzLl9fc2VydmljZXMuc2l6ZSA+IDApIHRoaXMuX19zZXJ2aWNlcy5jbGVhcigpXG4gIH1cblxuICBfX2FkZFNlcnZpY2UgKHNlcnZpY2UpIHtcbiAgICBpZiAodHlwZW9mIHNlcnZpY2UgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgc2VydmljZSBzb3VyY2UgaXMgZW1wdHknKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHNlcnZpY2UuaWRlbnRpZmllciA9PT0gJ3VuZGVmaW5lZCcgfHwgc2VydmljZS5pZGVudGlmaWVyLmxlbmd0aCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHNlcnZpY2UnKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAoc2VydmljZSBpbnN0YW5jZW9mIFNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5fX3NlcnZpY2VzLnNldChzZXJ2aWNlLmlkZW50aWZpZXIsIHNlcnZpY2UpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9fc2VydmljZXMuc2V0KHNlcnZpY2UuaWRlbnRpZmllciwgbmV3IFNlcnZpY2Uoc2VydmljZSkpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFByb3BhZ2F0ZSBlcnJvclxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICBfX3NldFNlbGVjdGVkU2VydmljZSAoaWRlbnRpZmllcikge1xuICAgIGlmICh0eXBlb2YgaWRlbnRpZmllciA9PT0gJ3VuZGVmaW5lZCcgfHwgaWRlbnRpZmllci5sZW5ndGggPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHNlcnZpY2UgaWRlbnRpZmllciBpcyBlbXB0eScpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgaWRlbnRpZmllciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBpZGVudGlmaWVyIGlzIG5vdCBhIHN0cmluZycpXG4gICAgfVxuICAgIHRoaXMuX19zZWxlY3RlZFNlcnZpY2UgPSBpZGVudGlmaWVyXG4gICAgcmV0dXJuIGlkZW50aWZpZXJcbiAgfVxuXG4gIF9fY2xlYW5TZWxlY3RlZFNlcnZpY2UgKCkge1xuICAgIHRoaXMuX19zZWxlY3RlZFNlcnZpY2UgPSAnJ1xuICB9XG5cbiAgX19hZGRUb1VwZGF0aW5nU2VydmljZXMgKGlkZW50aWZpZXIpIHtcbiAgICBpZiAodGhpcy5fX3NlcnZpY2VzLmhhcyhpZGVudGlmaWVyKSAmJiAhdGhpcy5fX3NlcnZpY2VzVXBkYXRpbmcuaW5kZXhPZihpZGVudGlmaWVyKSAhPT0gLTEpIHtcbiAgICAgIHRoaXMuX19zZXJ2aWNlc1VwZGF0aW5nLnB1c2goaWRlbnRpZmllcilcbiAgICB9XG4gIH1cblxuICBfX3JlbW92ZUZyb21VcGRhdGluZ1NlcnZpY2VzIChpZGVudGlmaWVyKSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5fX3NlcnZpY2VzVXBkYXRpbmcuaW5kZXhPZihpZGVudGlmaWVyKVxuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLl9fc2VydmljZXNVcGRhdGluZy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgfVxuICB9XG5cbiAgX191cGRhdGVVcGRhdGluZ1NlcnZpY2VzICgpIHtcbiAgICB0aGlzLl9fc2VydmljZXNVcGRhdGluZy5maWx0ZXIoKGlkZW50aWZpZXIpID0+IHRoaXMuX19zZXJ2aWNlcy5oYXMoaWRlbnRpZmllcikpXG4gIH1cblxuICBfX2NsZWFuVXBkYXRpbmdTZXJ2aWNlcyAoKSB7XG4gICAgdGhpcy5fX3NlcnZpY2VzVXBkYXRpbmcgPSBbXVxuICB9XG5cbiAgX19zZXRGaWx0ZXIgKHByb3AsIGZpbHRlcikge1xuICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvcC5sZW5ndGggPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGZpbHRlciBpdGVtIGlzIGVtcHR5JylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZmlsdGVyIGlzIG5vdCBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICghKHByb3AgaW5zdGFuY2VvZiBBcnJheSkpIHByb3AgPSBbcHJvcF1cblxuICAgIHByb3AuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9fZmlsdGVyLmhhcyhpdGVtKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZmlsdGVyIGl0ZW0gZG8gbm90IGV4aXN0cycpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX19maWx0ZXIuc2V0KGl0ZW0sIGZpbHRlcilcbiAgICB9KVxuICB9XG5cbiAgX19jbGVhbkZpbHRlciAoKSB7XG4gICAgdGhpcy5fX2ZpbHRlciA9IFNlcnZpY2UuZGVmYXV0RmlsdGVyT2JqZWN0XG4gIH1cblxuICAvLyAtLSBEaXNwYXRjaGVyIHJlZ2lzdGVyIC0tIC8vXG5cbiAgX19vbkRpc3BhdGNoIChwYXlsb2FkKSB7XG4gICAgc3dpdGNoIChwYXlsb2FkLmFjdGlvblR5cGUpIHtcbiAgICAgIGNhc2UgU2VydmljZXNDb25zdGFudHMuSU5JVF9TRVJWSUNFU19TVE9SRTpcbiAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICBsb2dnZXIuaW5mbygnSW5pdGlhbGl6aW5nIHRoZSBzdG9yZS4uLicpXG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplKClcblxuICAgICAgICAvLyBOb3RpZnkgdGhlIG9ic2VydmVycyB0aGF0IHRoZSBzdG9yZSBjaGFuZ2VkXG4gICAgICAgIHRoaXMuX19lbWl0Q2hhbmdlKClcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBTZXJ2aWNlc0NvbnN0YW50cy5GSUxURVJfU0VSVklDRVM6XG4gICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0ZpbHRlcmluZyB0aGUgc2VydmljZXMuLi4nKVxuXG4gICAgICAgIC8vIFdpbGwgcmVjZWl2ZSBwYXlsb2FkLmZpbHRlclxuICAgICAgICB0aGlzLl9fc2V0RmlsdGVyKHBheWxvYWQucHJvcCwgcGF5bG9hZC5maWx0ZXIpXG5cbiAgICAgICAgLy8gTm90aWZ5IHRoZSBvYnNlcnZlcnMgdGhhdCB0aGUgc3RvcmUgY2hhbmdlZFxuICAgICAgICB0aGlzLl9fZW1pdENoYW5nZSgpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgU2VydmljZXNDb25zdGFudHMuRkVUQ0hfU0VSVklDRVM6XG4gICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1JlY2VpdmluZyBzZXJ2aWNlcy4uLicpXG5cbiAgICAgICAgaWYgKHBheWxvYWQubGlzdCkge1xuICAgICAgICAgIC8vIFdpbGwgcmVjZWl2ZSBwYXlsb2FkLmxpc3QgYW5kIHBheWxvYWQudGltZXN0YW1wXG4gICAgICAgICAgdGhpcy5fX3NldFNlcnZpY2VzKHBheWxvYWQubGlzdClcbiAgICAgICAgICB0aGlzLl9fc2VydmljZXNMYXN0VXBkYXRlID0gRGF0ZS5ub3coKVxuXG4gICAgICAgICAgLy8gTm90aWZ5IHRoZSBvYnNlcnZlcnMgdGhhdCB0aGUgc3RvcmUgY2hhbmdlZFxuICAgICAgICAgIHRoaXMuX19lbWl0Q2hhbmdlKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIXRoaXMuX19zZXJ2aWNlc0xhc3RVcGRhdGUpIHRoaXMuX19zZXJ2aWNlc0xhc3RVcGRhdGUgPSBEYXRlLm5vdygpXG4gICAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdJbnZhbGlkIHNlcnZpY2VzJylcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFNlcnZpY2VzQ29uc3RhbnRzLlVQREFURV9TVEFUVVM6XG4gICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgbG9nZ2VyLmluZm8oYFVwZGF0aW5nIHRoZSBzZXJ2aWNlICcke3BheWxvYWQuaWRlbnRpZmllcn0nIHN0YXR1c2ApXG5cbiAgICAgICAgaWYgKHRoaXMuX19zZXJ2aWNlcy5oYXMocGF5bG9hZC5pZGVudGlmaWVyKSAmJiBwYXlsb2FkLnN0YXR1cykge1xuICAgICAgICAgIC8vIFdpbGwgcmVjZWl2ZSBwYXlsb2FkLmxpc3QgYW5kIHBheWxvYWQuc3RhdHVzXG4gICAgICAgICAgbGV0IHNlcnZpY2UgPSB0aGlzLl9fc2VydmljZXMuZ2V0KHBheWxvYWQuaWRlbnRpZmllcilcbiAgICAgICAgICBzZXJ2aWNlLnN0YXR1cyA9IHBheWxvYWQuc3RhdHVzXG4gICAgICAgICAgdGhpcy5fX3NlcnZpY2VzLnNldChwYXlsb2FkLmlkZW50aWZpZXIsIHNlcnZpY2UpXG5cbiAgICAgICAgICAvLyBOb3RpZnkgdGhlIG9ic2VydmVycyB0aGF0IHRoZSBzdG9yZSBjaGFuZ2VkXG4gICAgICAgICAgdGhpcy5fX2VtaXRDaGFuZ2UoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgICBsb2dnZXIud2FybmluZygnSW52YWxpZCBzZXJ2aWNlIGlkZW50aWZpZXIgb3Igc3RhdHVzJylcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFNlcnZpY2VzQ29uc3RhbnRzLkFERF9UT19VUERBVElORzpcbiAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICBsb2dnZXIuaW5mbyhgQWRkaW5nIHRoZSBzZXJ2aWNlICcke3BheWxvYWQuaWRlbnRpZmllcn0nIHRvIHRoZSB1cGRhdGluZyBsaXN0YClcblxuICAgICAgICAvLyBXaWxsIHJlY2VpdmUgcGF5bG9hZC5pZGVudGlmaWVyXG4gICAgICAgIGlmIChwYXlsb2FkLmlkZW50aWZpZXIpIHtcbiAgICAgICAgICB0aGlzLl9fYWRkVG9VcGRhdGluZ1NlcnZpY2VzKHBheWxvYWQuaWRlbnRpZmllcilcblxuICAgICAgICAgIC8vIE5vdGlmeSB0aGUgb2JzZXJ2ZXJzIHRoYXQgdGhlIHN0b3JlIGNoYW5nZWRcbiAgICAgICAgICB0aGlzLl9fZW1pdENoYW5nZSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdJbnZhbGlkIHZhbHVlcyBmb3IgdXBkYXRpbmcgdGhlIHNlcnZpY2UnKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgU2VydmljZXNDb25zdGFudHMuUkVNT1ZFX0ZST01fVVBEQVRJTkc6XG4gICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgbG9nZ2VyLmluZm8oYFJlbW92aW5nIHRoZSBzZXJ2aWNlICcke3BheWxvYWQuaWRlbnRpZmllcn0nIGZyb20gdGhlIHVwZGF0aW5nIGxpc3RgKVxuXG4gICAgICAgIC8vIFdpbGwgcmVjZWl2ZSBwYXlsb2FkLmlkZW50aWZpZXJcbiAgICAgICAgaWYgKHBheWxvYWQuaWRlbnRpZmllcikge1xuICAgICAgICAgIHRoaXMuX19yZW1vdmVGcm9tVXBkYXRpbmdTZXJ2aWNlcyhwYXlsb2FkLmlkZW50aWZpZXIpXG5cbiAgICAgICAgICAvLyBOb3RpZnkgdGhlIG9ic2VydmVycyB0aGF0IHRoZSBzdG9yZSBjaGFuZ2VkXG4gICAgICAgICAgdGhpcy5fX2VtaXRDaGFuZ2UoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgICBsb2dnZXIud2FybmluZygnSW52YWxpZCB2YWx1ZXMgZm9yIHVwZGF0aW5nIHRoZSBzZXJ2aWNlJylcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFNlcnZpY2VzQ29uc3RhbnRzLlNFTEVDVF9TRVJWSUNFOlxuICAgICAgICAvLyBDT05TT0xFIFRSQUNFXG4gICAgICAgIGxvZ2dlci5pbmZvKCdTZWxlY3RpbmcgYSBzZXJ2aWNlLi4uJylcblxuICAgICAgICAvLyBXaWxsIHJlY2VpdmUgcGF5bG9hZC5pZGVudGlmaWVyXG4gICAgICAgIGlmICh0aGlzLl9fc2VydmljZXMuaGFzKHBheWxvYWQuaWRlbnRpZmllcikgJiZcbiAgICAgICAgICAgIHRoaXMuX19zZXJ2aWNlcy5nZXQocGF5bG9hZC5pZGVudGlmaWVyKVxuICAgICAgICAgICAgICAubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2Vob3J1cycpKSB7XG4gICAgICAgICAgdGhpcy5fX2NsZWFuU2VsZWN0ZWRTZXJ2aWNlKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9fc2V0U2VsZWN0ZWRTZXJ2aWNlKHBheWxvYWQuaWRlbnRpZmllcilcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdGlmeSB0aGUgb2JzZXJ2ZXJzIHRoYXQgdGhlIHN0b3JlIGNoYW5nZWRcbiAgICAgICAgdGhpcy5fX2VtaXRDaGFuZ2UoKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFNlcnZpY2VzQ29uc3RhbnRzLkNMRUFOX1NFTEVDVEVEX1NFUlZJQ0U6XG4gICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0Rlc2VsZWN0aW5nIHRoZSBzZXJ2aWNlLi4uJylcblxuICAgICAgICAvLyBXaWxsIHJlY2VpdmUgcGF5bG9hZC5pZGVudGlmaWVyXG4gICAgICAgIHRoaXMuX19jbGVhblNlbGVjdGVkU2VydmljZSgpXG5cbiAgICAgICAgLy8gTm90aWZ5IHRoZSBvYnNlcnZlcnMgdGhhdCB0aGUgc3RvcmUgY2hhbmdlZFxuICAgICAgICB0aGlzLl9fZW1pdENoYW5nZSgpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgU2VydmljZXNDb25zdGFudHMuQ0hBTkdFX1BFUklPRDpcbiAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICBsb2dnZXIuaW5mbygnVXBkYXRpbmcgdGhlIHBlcmlvZC4uLicpXG5cbiAgICAgICAgLy8gV2lsbCByZWNlaXZlIHBheWxvYWQucGVyaW9kXG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC5wZXJpb2QgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgaWYgKHBheWxvYWQucGVyaW9kIDwgMCkgcGF5bG9hZC5wZXJpb2QgPSAwXG4gICAgICAgICAgdGhpcy5fX3VwZGF0ZVBlcmlvZCA9IHBheWxvYWQucGVyaW9kXG5cbiAgICAgICAgICAvLyBOb3RpZnkgdGhlIG9ic2VydmVycyB0aGF0IHRoZSBzdG9yZSBjaGFuZ2VkXG4gICAgICAgICAgdGhpcy5fX2VtaXRDaGFuZ2UoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgICBsb2dnZXIud2FybmluZygnSW52YWxpZCBwZXJpb2QnKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9XG59XG5cbi8vIEV4cG9ydGluZyB0aGlzIHdheSB0aGUgY2xhc3Mgd2lsbCBhY3QgYXMgYSBzaW5nbGV0b25cbmV4cG9ydCBkZWZhdWx0IG5ldyBTZXJ2aWNlc1N0b3JlKEFwcERpc3BhdGNoZXIpXG4iLCJpbXBvcnQgeyBjcmVhdGVTdG9yZSwgYXBwbHlNaWRkbGV3YXJlIH0gZnJvbSAncmVkdXgnXG5pbXBvcnQgdGh1bmtNaWRkbGV3YXJlIGZyb20gJ3JlZHV4LXRodW5rJ1xuXG4vLyBSZWR1Y2Vyc1xuaW1wb3J0IHJvb3RSZWR1Y2VyIGZyb20gJy4uL3JlZHVjZXJzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb25maWd1cmVTdG9yZSAoaW5pdGlhbFN0YXRlID0ge30pIHtcbiAgY29uc3QgY3JlYXRlID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRldlRvb2xzRXh0ZW5zaW9uXG4gICAgPyB3aW5kb3cuZGV2VG9vbHNFeHRlbnNpb24oKShjcmVhdGVTdG9yZSlcbiAgICA6IGNyZWF0ZVN0b3JlXG5cbiAgY29uc3QgY3JlYXRlU3RvcmVXaXRoTWlkZGxld2FyZSA9IGFwcGx5TWlkZGxld2FyZSh0aHVua01pZGRsZXdhcmUpKGNyZWF0ZSlcblxuICByZXR1cm4gY3JlYXRlU3RvcmVXaXRoTWlkZGxld2FyZShyb290UmVkdWNlciwgaW5pdGlhbFN0YXRlKVxufVxuIiwibW9kdWxlLmV4cG9ydHM9e1xuICBcImRpc2Nvbm5lY3RcIjogXCJEaXNjb25uZWN0XCIsXG4gIFwidGVybWluYWxcIjogXCJUZXJtaW5hbFwiLFxuICBcImRpc3BsYXlcIjogXCJEaXNwbGF5XCIsXG4gIFwicHJvY2Vzc2VzXCI6IFwiUHJvY2Vzc2VzXCIsXG4gIFwic2VydmljZXNcIjogXCJTZXJ2aWNlc1wiLFxuICBcImZpbGVzXCI6IFwiRmlsZXNcIixcbiAgXCJzaGFyZVwiOiBcIlNoYXJlXCIsXG4gIFwiYWdlbnRQYXNzd29yZFwiOiBcIkFnZW50IHBhc3N3b3JkXCIsXG4gIFwiY29ubmVjdFwiOiBcIkNvbm5lY3RcIixcbiAgXCJmdWxsc2NyZWVuXCI6IFwiRnVsbHNjcmVlblwiLFxuICBcImV4aXRGdWxsc2NyZWVuXCI6IFwiRXhpdCBmdWxsc2NyZWVuXCIsXG4gIFwiY2xpcGJvYXJkXCI6IFwiQ2xpcGJvYXJkXCIsXG4gIFwidHJ1ZUNvbG9yXCI6IFwiVHJ1ZSBjb2xvclwiLFxuICBcImxvY2FsQ3Vyc29yXCI6IFwiTG9jYWwgY3Vyc29yXCIsXG4gIFwic2hhcmVkXCI6IFwiU2hhcmVkXCIsXG4gIFwidmlld09ubHlcIjogXCJWaWV3IG9ubHlcIixcbiAgXCJmdWxsTWVudVwiOiBcIkZ1bGwgbWVudVwiLFxuICBcInNtYWxsTWVudVwiOiBcIlNtYWxsIG1lbnVcIixcbiAgXCJzZW5kXCI6IFwiU2VuZFwiLFxuICBcInJlbW90ZVwiOiBcIlJlbW90ZVwiLFxuICBcImxvY2FsXCI6IFwiTG9jYWxcIixcbiAgXCJub3RoaW5nQ29waWVkXCI6IFwiTm90aGluZyBjb3BpZWRcIixcbiAgXCJjdXJyZW50Q2xpcGJvYXJkRXhwbGFpbmF0aW9uXCI6IFwiVGhpcyBpcyB0aGUgY3VycmVudCBjbGlwYm9hcmQgb24gdGhlIHJlbW90ZSBtYWNoaW5lLiBDb3B5IHdoYXQgeW91IG5lZWQuXCIsXG4gIFwiY2xpY2tTZW5kQ2xpcGJvYXJkXCI6IFwiQ2xpY2sgdG8gc2VuZCB0aGUgdGV4dCB0byB0aGUgcmVtb3RlIGNsaXBib2FyZC5cIixcbiAgXCJtb3ZlRG93blwiOiBcIk1vdmUgZG93blwiLFxuICBcIm1vdmVVcFwiOiBcIk1vdmUgdXBcIixcbiAgXCJ0YWtlU2NyZWVuc2hvdFwiOiBcIlRha2Ugc2NyZWVuc2hvdFwiLFxuICBcImVycm9yXCI6IFwiRXJyb3JcIixcbiAgXCJkaXNjb25uZWN0ZWRcIjogXCJEaXNjb25uZWN0ZWRcIixcbiAgXCJjb25uZWN0aW5nRG90c1wiOiBcIkNvbm5lY3RpbmcuLi5cIixcbiAgXCJkaXNjb25uZWN0aW5nRG90c1wiOiBcIkRpc2Nvbm5lY3RpbmcuLi5cIixcbiAgXCJjb25uZWN0ZWRUb1wiOiBcIkNvbm5lY3RlZCB0byB7aG9zdG5hbWV9IChJRDp7YWdlbnRJRH0pXCIsXG4gIFwibG9hZGluZ0RvdHNcIjogXCJMb2FkaW5nLi4uXCIsXG4gIFwib3NcIjogXCJPU1wiLFxuICBcImxhbmd1YWdlXCI6IFwiTGFuZ3VhZ2VcIixcbiAgXCJhcmNoaXRlY3R1cmVcIjogXCJBcmNoaXRlY3R1cmVcIixcbiAgXCJjcHVcIjogXCJDUFVcIixcbiAgXCJyYW1cIjogXCJSQU1cIixcbiAgXCJoZGRcIjogXCJIRERcIixcbiAgXCJhZ2VudFZlcnNpb25cIjogXCJBZ2VudCB2ZXJzaW9uXCIsXG4gIFwidXB0aW1lXCI6IFwiVXB0aW1lXCIsXG4gIFwiaG9zdG5hbWVcIjogXCJIb3N0bmFtZVwiLFxuICBcImFkZHJlc3NcIjogXCJBZGRyZXNzXCIsXG4gIFwiYnllTWVzc2FnZVwiOiBcIlNvIGxvbmcsIGh1bWFuXCIsXG4gIFwiYmxvY2tlZFNlY3Rpb25cIiA6IFwiQmxvY2tlZCBzZWN0aW9uXCIsXG4gIFwiYmxvY2tlZFNlY3Rpb25TdWJcIiA6IFwiVGhpcyBzZWN0aW9uIHJlcXVpcmVzIGFjdGl2ZSB2YWxpZGF0aW9uLiBXYWl0aW5nIHRvIGxvY2FsIHVzZXJcIixcbiAgXCJjb25uZWN0aW9uRmFpbGVkTWFpblwiIDogXCJJdCBzZWVtcyB0aGUgY29ubmVjdGlvbiBmYWlsZWRcIixcbiAgXCJjb25uZWN0aW9uRmFpbGVkQnVzeVwiIDogXCJQcm9iYWJseSBhbm90aGVyIHVzZXIgaXMgdXNpbmcgdGhlIGFnZW50IGF0IHRoaXMgbW9tZW50LlwiLFxuICBcImNvbm5lY3Rpb25GYWlsZWREb3duXCIgOiBcIlRoZSBhZ2VudCBpcyBwcm9iYWJseSBkb3duLCBzaW5jZSBpdHMgbGFzdCBjb250YWN0IHdhcyBhIGxvbmcgdGltZSBhZ28uXCIsXG4gIFwiY29ubmVjdGlvbkZhaWxlZFNlcnZlclwiIDogXCJUaGUgc2VydmVyIGNhbiBiZSB1bnJlYWNoYWJsZSBvciBtYXkgYmUgYSBjb25uZWN0aW9uIHN0aWxsIG9wZW4uIFRyeSBhZ2Fpbi5cIixcbiAgXCJub3RDb25uZWN0ZWRcIiA6IFwiTm90IGNvbm5lY3RlZFwiLFxuICBcInJlY29ubmVjdE5vd1wiIDogXCJSZWNvbm5lY3Qgbm93XCIsXG4gIFwidHJ5UmVsb2FkaW5nXCIgOiBcIlRyeSByZWxvYWRpbmcgdGhlIHBhZ2VcIixcbiAgXCJhdXRoZW50aWNhdGluZ0RvdHNcIiA6IFwiQXV0aGVudGljYXRpbmcuLi5cIixcbiAgXCJhdXRoZW50aWNhdGluZ1N1YlwiIDogXCJMZXQgbWUgc2VlIGhvdyByZWxpYWJsZSB5b3UgYXJlXCIsXG4gIFwibm90QXV0aGVudGljYXRlZFwiIDogXCJOb3QgYXV0aGVudGljYXRlZFwiLFxuICBcInBhc3N3b3JkTmVlZGVkXCIgOiBcIlBhc3N3b3JkIG5lZWRlZFwiLFxuICBcIm5vdEluaXRpYWxpemVkXCIgOiBcIk5vdCBpbml0aWFsaXplZFwiLFxuICBcImludmFsaWRQYXNzd29yZFwiIDogXCJJbnZhbGlkIHBhc3N3b3JkXCIsXG4gIFwidGltZW91dFBhc3N3b3JkXCIgOiBcIlRoZSBhZ2VudCBoYXMgY2xvc2VkIHRoZSBjb25uZWN0aW9uIGR1ZSB0byBhIHRpbWVvdXQgd2hpbGUgZXhwZWN0aW5nIHRvIGNvbXBsZXRlIHRoZSBhdXRoZW50aWNhdGlvbiBwcm9jZXNzLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZU5vcm1hbFwiIDogXCJUaGUgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQgc3VjY2Vzc2Z1bGx5LlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZUdvaW5nQXdheVwiIDogXCJUaGUgYWdlbnQgaGFzIGNsb3NlZCB0aGUgY29ubmVjdGlvbi5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VQcm90b2NvbEVycm9yXCIgOiBcIlRoZSBhZ2VudCBpcyB0ZXJtaW5hdGluZyB0aGUgY29ubmVjdGlvbiBkdWUgdG8gYSBwcm90b2NvbCBlcnJvci5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VVbnN1cHBvcnRlZFwiIDogXCJUaGUgY29ubmVjdGlvbiBpcyBiZWluZyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIGFnZW50IHJlY2VpdmVkIGRhdGEgb2YgYSB0eXBlIGl0IGNhbm5vdCBhY2NlcHQuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlTm9TdGF0dXNcIiA6IFwiTm8gc3RhdHVzIGNvZGUgd2FzIHByb3ZpZGVkIGV2ZW4gdGhvdWdoIG9uZSB3YXMgZXhwZWN0ZWQuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlQWJub3JtYWxcIiA6IFwiVGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCBhYm5vcm1hbGx5IHdpdGhvdXQgYSBjbG9zZSBzaWduYWwuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlVW5zdXBwb3J0ZWREYXRhXCIgOiBcIlRoZSBhZ2VudCBpcyB0ZXJtaW5hdGluIHRoZSBjb25uZWN0aW9uIGJlY2F1c2UgYSBtZXNzYWdlIHdhcyByZWNlaXZlZCB0aGF0IGNvbnRhaW5lZCBpbmNvbnNpc3RlbnQgZGF0YS5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VQb2xpY3lWaW9sYXRpb25cIiA6IFwiVGhlIGFnZW50IGlzIHRlcm1pbmF0aW5nIHRoZSBjb25uZWN0aW9uIGJlY2F1c2UgaXQgcmVjZWl2ZWQgYSBtZXNzYWdlIHRoYXQgdmlvbGF0ZXMgaXRzIHBvbGljeS5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VUb29MYXJnZVwiIDogXCJUaGUgYWdlbnQgaXMgdGVybWluYXRpbmcgdGhlIGNvbm5lY3Rpb24gYmVjYXVzZSBhIGRhdGEgZnJhbWUgd2FzIHJlY2VpdmVkIHRoYXQgaXMgdG9vIGxhcmdlLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZU1pc3NpbmdFeHRlbnNpb25cIiA6IFwiVGhlIGNsaWVudCBpcyB0ZXJtaW5hdGluZyB0aGUgY29ubmVjdGlvbiBiZWNhdXNlIGl0IGV4cGVjdGVkIHRoZSBhZ2VudCB0byBuZWdvdGlhdGUgb25lIG9yIG1vcmUgZXh0ZW5zaW9uLCBidXQgaXQgZGlkbid0LlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZUludGVybmFsRXJyb3JcIiA6IFwiVGhlIGFnZW50IGlzIHRlcm1pbmF0aW5nIHRoZSBjb25uZWN0aW9uIGJlY2F1c2UgaXQgZW5jb3VudGVyZWQgYW4gdW5leHBlY3RlZCBjb25kaXRpb24gdGhhdCBwcmV2ZW50ZWQgaXQgZnJvbSBmdWxmaWxsaW5nIHRoZSByZXF1ZXN0LlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZVNlcnZpY2VSZXN0YXJ0XCIgOiBcIlRoZSBhZ2VudCBpcyB0ZXJtaW5hdGluZyB0aGUgY29ubmVjdGlvbiBiZWNhdXNlIGl0IGlzIHJlc3RhcnRpbmcuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlVHJ5QWdhaW5MYXRlclwiIDogXCJUaGUgYWdlbnQgaXMgdGVybWluYXRpbmcgdGhlIGNvbm5lY3Rpb24gZHVlIHRvIGEgdGVtcG9yYXJ5IGNvbmRpdGlvbi5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VUbHNIYW5kc2hha2VcIiA6IFwiVGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCBkdWUgdG8gYSBmYWlsdXJlIHRvIHBlcmZvcm0gYSBUTFMgaGFuZHNoYWtlLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZUluYWN0aXZpdHlcIiA6IFwiVGhlIGFnZW50IGhhcyBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gZHVlIHRvIGluYWN0aXZpdHkuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlQXV0aEV4cGlyZWRcIiA6IFwiVGhlIGFnZW50IGhhcyBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gYmVjYXVzZSB0aGUgdGVtcG9yYXJ5IGF1dGhvcml6YXRpb24gaGFzIGV4cGlyZWQuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlRGVmYXVsdFwiIDogXCJUaGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIHdpdGhvdXQgcmVjZWl2aW5nIGEgdmFsaWQgY29kZS5cIixcbiAgXCJmb3JiaWRkZW5TZWN0aW9uXCIgOiBcIkZvcmJpZGRlbiBzZWN0aW9uXCIsXG4gIFwiZm9yYmlkZGVuU2VjdGlvblN1YlwiIDogXCJBIHJlbW90ZSB1c2VyIGFjdGl2ZWx5IHJlZnVzZWQgeW91ciByZXF1ZXN0IHRvIG9wZW4ge3NlY3Rpb259LlwiLFxuICBcInRyeUFnYWluXCIgOiBcIlRyeSBhZ2FpblwiLFxuICBcInNoYXJlLWFnZW50LWFjY2Vzc1wiOiBcIlNoYXJlIHRoZSBhY2Nlc3MgdG8gdGhpcyBhZ2VudFwiLFxuICBcInNoYXJlLXdhcm5pbmctbWVzc2FnZVwiOiBcIlJlbWVtYmVyIHRvIGRpc2Nvbm5lY3QgZnJvbSB0aGlzIGFnZW50IHRvIGFsbG93IHRoZSBjb25uZWN0aW9uIG9mIGFub3RoZXIgdXNlclwiLFxuICBcInJlcXVlc3RpbmdQYXNzRG90c1wiIDogXCJSZXF1ZXN0aW5nIHBhc3MuLi5cIixcbiAgXCJleHBpcmF0aW9uSW5NaW51dGVzXCIgOiBcIkV4cGlyYXRpb24gaW4gbWludXRlc1wiLFxuICBcImdlbmVyYXRlVXJsRXhwbGFuYXRpb25cIiA6IFwiV2l0aCB0aGlzIHVybCwgcGVvcGxlIHdpbGwgYWNjZXNzIGRpcmVjdGx5IHRvIHRoZSBhZ2VudCBkdXJpbmcgdGhlIHRpbWUgc3BlY2lmaWVkIGFuZCB3aXRob3V0IHRoZSByZXF1aXJlbWVudHMgb2YgaGF2aW5nIGFuIGFjY291bnQgb3IgYmVpbmcgbG9nZ2VkIGluXCIsXG4gIFwicmVxdWVzdGluZ1VybERvdHNcIiA6IFwiUmVxdWVzdGluZyBVUkwuLi5cIixcbiAgXCJnZW5lcmF0ZVVybFwiIDogXCJHZW5lcmF0ZSBVUkxcIixcbiAgXCJ0ZW1wb3JhcnlVcmxcIiA6IFwiVGVtcG9yYXJ5IFVSTFwiLFxuICBcIlhfU2Vjb25kc1wiIDogXCJ7blNlY29uZHMsIHBsdXJhbCwgPTB7TmV2ZXJ9IG9uZXsjIHNlY29uZH0gb3RoZXJ7IyBzZWNvbmRzfX1cIixcbiAgXCJYX01pbnV0ZXNcIiA6IFwie25NaW51dGVzLCBwbHVyYWwsID0we05ldmVyfSBvbmV7IyBtaW51dGV9IG90aGVyeyMgbWludXRlc319XCIsXG4gIFwicmVmcmVzaFByb2Nlc3Nlc1wiIDogXCJSZWZyZXNoIHByb2Nlc3Nlc1wiLFxuICBcInN0b3BQcm9jZXNzXCIgOiBcIlN0b3AgcHJvY2Vzc1wiLFxuICBcImNsaWNrT25BUHJvY2Vzc1wiIDogXCJDbGljayBvbiBhIHByb2Nlc3NcIixcbiAgXCJmaWx0ZXJQcm9jZXNzXCIgOiBcIkZpbHRlciBsaXN0IGJ5IFBJRCwgdXNlciBvciBuYW1lXCIsXG4gIFwidXNlZFwiOiBcIlVzZWRcIixcbiAgXCJ0b3RhbFwiOiBcIlRvdGFsXCIsXG4gIFwicGlkXCIgOiBcIlBJRFwiLFxuICBcInVzZXJcIiA6IFwiVXNlclwiLFxuICBcIm5hbWVcIiA6IFwiTmFtZVwiLFxuICBcInRoZXJlQXJlTm9Qcm9jZXNzZXNcIiA6IFwiVGhlcmUgYXJlIG5vIHByb2Nlc3Nlc1wiLFxuICBcImNsaWNrT25BU2VydmljZVwiIDogXCJDbGljayBvbiBhIHNlcnZpY2VcIixcbiAgXCJyZWZyZXNoU2VydmljZXNcIiA6IFwiUmVmcmVzaCBzZXJ2aWNlc1wiLFxuICBcInN0YXJ0U2VydmljZVwiIDogXCJTdGFydCBzZXJ2aWNlXCIsXG4gIFwic3RvcFNlcnZpY2VcIiA6IFwiU3RvcCBzZXJ2aWNlXCIsXG4gIFwidHlwZVRvRmlsdGVyXCIgOiBcIlR5cGUgdG8gZmlsdGVyXCIsXG4gIFwiYW55XCIgOiBcIkFueVwiLFxuICBcInNlYXJjaFwiIDogXCJTZWFyY2hcIixcbiAgXCJpZGVudGlmaWVyXCIgOiBcIklkZW50aWZpZXJcIixcbiAgXCJkZXNjcmlwdGlvblwiIDogXCJEZXNjcmlwdGlvblwiLFxuICBcInN0YXR1c1wiIDogXCJTdGF0dXNcIixcbiAgXCJ0aGVyZUFyZU5vU2VydmljZXNcIiA6IFwiVGhlcmUgYXJlIG5vIHNlcnZpY2VzXCIsXG4gIFwibm90UnVubmluZ1wiIDogXCJOb3QgUnVubmluZ1wiLFxuICBcImZpbHRlclwiIDogXCJGaWx0ZXJcIixcbiAgXCJyZWZyZXNoRGlyZWN0b3J5XCIgOiBcIlJlZnJlc2ggZGlyZWN0b3J5XCIsXG4gIFwiZG93bmxvYWRzXCIgOiBcIkRvd25sb2Fkc1wiLFxuICBcInVwbG9hZHNcIiA6IFwiVXBsb2Fkc1wiLFxuICBcImVtcHR5XCIgOiBcIkVtcHR5XCIsXG4gIFwiZmlsZXNEb3dubG9hZExpbWl0XCIgOiBcIkN1cnJlbnRseSwgdGhlIGRvd25sb2FkIGlzIHN1cHBvcnRlZCBvbmx5IHdpdGggaXRlbXMgb2YgMTAwTUIgb3IgbGVzc1wiLFxuICBcInRoZUZpbGVXaWxsQmVEZWxldGVkXCIgOiBcIlRoZSBmaWxlIHdpbGwgYmUgZGVsZXRlZFwiLFxuICBcInllc1wiIDogXCJZZXNcIixcbiAgXCJhY3Rpb25zXCIgOiBcIkFjdGlvbnNcIixcbiAgXCJsYXN0TW9kaWZpY2F0aW9uXCIgOiBcIkxhc3QgbW9kaWZpY2F0aW9uXCIsXG4gIFwiY29uZmlybURlbGV0aW9uXCIgOiBcIkNvbmZpcm0gZGVsZXRpb25cIixcbiAgXCJ0aGVyZUFyZU5vRmlsZXNcIiA6IFwiVGhlcmUgYXJlIG5vIGZpbGVzXCIsXG4gIFwic2l6ZVwiIDogXCJTaXplXCIsXG4gIFwiZGVsZXRlXCIgOiBcIkRlbGV0ZVwiLFxuICBcImFyZVlvdVN1cmVRdWVzdGlvbk1hcmtcIjogXCJBcmUgeW91IHN1cmU/XCIsXG4gIFwibGFzdFVwZGF0ZVwiIDogXCJMYXN0IHVwZGF0ZVwiLFxuICBcIm5ldmVyVXBkYXRlZFwiIDogXCJOZXZlciB1cGRhdGVkXCIsXG4gIFwibm9Sb290RGlyZWN0b3J5XCIgOiBcIk5vIHJvb3QgZGlyZWN0b3J5XCIsXG4gIFwic3RhcnRQZW5kaW5nXCIgOiBcIlN0YXJ0IHBlbmRpbmdcIixcbiAgXCJzdG9wUGVuZGluZ1wiIDogXCJTdG9wIHBlbmRpbmdcIixcbiAgXCJydW5uaW5nXCIgOiBcIlJ1bm5pbmdcIixcbiAgXCJyZXN1bWVQZW5kaW5nXCIgOiBcIlJlc3VtZSBwZW5kaW5nXCIsXG4gIFwicGF1c2VQZW5kaW5nXCIgOiBcIlBhdXNlIHBlbmRpbmdcIixcbiAgXCJwYXVzZWRcIiA6IFwiUGF1c2VkXCIsXG4gIFwidW5rbm93blwiIDogXCJVbmtub3duXCIsXG4gIFwiZGlzY29ubmVjdGVkSW5mb1wiIDogXCJQcmVzcyAnQ29ubmVjdCcgYnV0dG9uIHRvIGFjY2VzcyB0aGUgcmVtb3RlIGRlc2suXCIsXG4gIFwiZXJyb3ItZmVjaGluZy1yb290XCIgOiBcIkVycm9yIG9wZW5pbmcgdGhlIHJvb3QgZGlyZWN0b3J5XCIsXG4gIFwiZXJyb3ItZmVjaGluZy1kaXJcIiA6IFwiRXJyb3Igb3BlbmluZyB0aGUgZGlyZWN0b3J5OiB7cGF0aH1cIixcbiAgXCJlcnJvci11cGxvYWQtZmlsZVwiIDogXCJVcGxvYWQgZmFpbGVkICh7cGF0aH0pXCIsXG4gIFwiZXJyb3ItZG93bmxvYWQtZmlsZVwiIDogXCJEb3dubG9hZCBmYWlsZWQgKHtwYXRofSlcIixcbiAgXCJlcnJvci1kZWxldGluZy1maWxlXCIgOiBcIkVycm9yIGRlbGV0aW5nIHRoZSBmaWxlIHtwYXRofVwiLFxuICBcInJlc3RhcnRTZXJ2aWNlXCIgOiBcIlJlc3RhcnQgc2VydmljZVwiLFxuICBcInVwbG9hZC1kaXNhYmxlZFwiOiBcIlVwbG9hZCBkaXNhYmxlZCBvbiB0aGlzIGRpcmVjdG9yeVwiLFxuICBcImNsaWNrLXRvLXVwbG9hZFwiOiBcIkNsaWNrIHRvIHVwbG9hZFwiLFxuICBcInVwbG9hZC1kcm9wXCI6IFwiRHJvcCB0aGUgZmlsZSB0byBzdGFydCB0aGUgdXBsb2FkXCJcbn1cbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgXCJkaXNjb25uZWN0XCI6IFwiRGVzY29uZWN0YXJcIixcbiAgXCJ0ZXJtaW5hbFwiOiBcIkNvbnNvbGFcIixcbiAgXCJkaXNwbGF5XCI6IFwiRXNjcml0b3Jpb1wiLFxuICBcInByb2Nlc3Nlc1wiOiBcIlByb2Nlc29zXCIsXG4gIFwic2VydmljZXNcIjogXCJTZXJ2aWNpb3NcIixcbiAgXCJmaWxlc1wiOiBcIkFyY2hpdm9zXCIsXG4gIFwic2hhcmVcIjogXCJDb21wYXJ0aXJcIixcbiAgXCJhZ2VudFBhc3N3b3JkXCI6IFwiQ29udHJhc2XDsWEgZGVsIGFnZW50ZVwiLFxuICBcImNvbm5lY3RcIjogXCJDb25lY3RhclwiLFxuICBcImZ1bGxzY3JlZW5cIjogXCJQYW50YWxsYSBjb21wbGV0YVwiLFxuICBcImV4aXRGdWxsc2NyZWVuXCI6IFwiU2FsaXIgZGUgcGFudGFsbGEgY29tcGxldGFcIixcbiAgXCJjbGlwYm9hcmRcIjogXCJQb3J0YXBhcGVsZXNcIixcbiAgXCJ0cnVlQ29sb3JcIjogXCJDb2xvciByZWFsXCIsXG4gIFwibG9jYWxDdXJzb3JcIjogXCJQdW50ZXJvIGxvY2FsXCIsXG4gIFwic2hhcmVkXCI6IFwiQ29tcGFydGlkb1wiLFxuICBcInZpZXdPbmx5XCI6IFwiU29sbyBsZWN0dXJhXCIsXG4gIFwiZnVsbE1lbnVcIjogXCJNZW7DuiBjb21wbGV0b1wiLFxuICBcInNtYWxsTWVudVwiOiBcIk1lbsO6IHBlcXVlw7FvXCIsXG4gIFwic2VuZFwiOiBcIkVudmlhclwiLFxuICBcInJlbW90ZVwiOiBcIlJlbW90b1wiLFxuICBcImxvY2FsXCI6IFwiTG9jYWxcIixcbiAgXCJub3RoaW5nQ29waWVkXCI6IFwiTmFkYSBjb3BpYWRvXCIsXG4gIFwiY3VycmVudENsaXBib2FyZEV4cGxhaW5hdGlvblwiOiBcIkVzdGUgZXMgZWwgcG9ydGFwYXBlbGVzIGRlIGxhIG3DoXF1aW5hIHJlbW90YS4gQ29waWEgbG8gcXVlIG5lY2VzaXRlcy5cIixcbiAgXCJjbGlja1NlbmRDbGlwYm9hcmRcIjogXCJIYXogY2xpY2sgcGFyYSBlbnZpYXIgZWwgdGV4dG8gYWwgcG9ydGFwYXBlbGVzIHJlbW90by5cIixcbiAgXCJtb3ZlRG93blwiOiBcIk1vdmVyIGFiYWpvXCIsXG4gIFwibW92ZVVwXCI6IFwiTW92ZXIgYXJyaWJhXCIsXG4gIFwidGFrZVNjcmVlbnNob3RcIjogXCJUb21hciBjYXB0dXJhIGRlIHBhbnRhbGxhXCIsXG4gIFwiZXJyb3JcIjogXCJFcnJvclwiLFxuICBcImRpc2Nvbm5lY3RlZFwiOiBcIkRlc2NvbmVjdGFkb1wiLFxuICBcImNvbm5lY3RpbmdEb3RzXCI6IFwiQ29uZWN0YW5kby4uLlwiLFxuICBcImRpc2Nvbm5lY3RpbmdEb3RzXCI6IFwiRGVzY29uZWN0YW5kby4uLlwiLFxuICBcImNvbm5lY3RlZFRvXCI6IFwiQ29uZWN0YWRvIGEge2hvc3RuYW1lfSAoSUQ6e2FnZW50SUR9KVwiLFxuICBcImxvYWRpbmdEb3RzXCI6IFwiQ2FyZ2FuZG8uLi5cIixcbiAgXCJvc1wiOiBcIk9TXCIsXG4gIFwibGFuZ3VhZ2VcIjogXCJJZGlvbWFcIixcbiAgXCJhcmNoaXRlY3R1cmVcIjogXCJBcnF1aXRlY3R1cmFcIixcbiAgXCJjcHVcIjogXCJDUFVcIixcbiAgXCJyYW1cIjogXCJSQU1cIixcbiAgXCJoZGRcIjogXCJIRERcIixcbiAgXCJhZ2VudFZlcnNpb25cIjogXCJWZXJzacOzbiBkZWwgYWdlbnRlXCIsXG4gIFwidXB0aW1lXCI6IFwiVGllbXBvIGVuIGzDrW5lYVwiLFxuICBcImhvc3RuYW1lXCI6IFwiSG9zdG5hbWVcIixcbiAgXCJhZGRyZXNzXCI6IFwiRGlyZWNjacOzblwiLFxuICBcImJ5ZU1lc3NhZ2VcIjogXCJIYXN0YSBwcm9udG8sIGh1bWFub1wiLFxuICBcImJsb2NrZWRTZWN0aW9uXCIgOiBcIlNlY2Npw7NuIGJsb3F1ZWFkYVwiLFxuICBcImJsb2NrZWRTZWN0aW9uU3ViXCIgOiBcIkVzdGEgc2VjY2nDs24gcmVxdWllcmUgdW5hIHZhbGlkYWNpw7NuIGFjdGl2YS4gRXNwZXJhbmRvIGFsIHVzdWFyaW8gbG9jYWxcIixcbiAgXCJjb25uZWN0aW9uRmFpbGVkTWFpblwiIDogXCJQYXJlY2UgcXVlIGxhIGNvbmV4acOzbiBoYSBmYWxsYWRvXCIsXG4gIFwiY29ubmVjdGlvbkZhaWxlZEJ1c3lcIiA6IFwiUHJvYmFibGVtZW50ZSBvdHJvIHVzdWFyaW8gZXN0w6kgdXNhbmRvIGVsIGFnZW50ZSBlbiBlc3RlIG1vbWVudG8uXCIsXG4gIFwiY29ubmVjdGlvbkZhaWxlZERvd25cIiA6IFwiRWwgYWdlbnRlIHByb2JhYmxlbWVudGUgZXN0w6EgY2HDrWRvIHlhIHF1ZSBlbCDDumx0aW1vIGNvbnRhY3RvIGZ1ZSBoYWNlIG11Y2hvIHRpZW1wby5cIixcbiAgXCJjb25uZWN0aW9uRmFpbGVkU2VydmVyXCIgOiBcIk5vIHNlIHB1ZWRlIGFjY2VkZXIgYWwgc2Vydmlkb3IgbyBwdWVkZSBxdWUgaGF5YSB1bmEgY29uZXhpw7NuIHlhIGFiaWVydGEuIEludMOpbnRhbG8gZGUgbnVldm8uXCIsXG4gIFwibm90Q29ubmVjdGVkXCIgOiBcIk5vIGNvbmVjdGFkb1wiLFxuICBcInJlY29ubmVjdE5vd1wiIDogXCJDb25lY3RhciBkZSBudWV2byBhaG9yYVwiLFxuICBcInRyeVJlbG9hZGluZ1wiIDogXCJJbnRlbnRhIHJlY2FyZ2FyIGxhIHDDoWdpbmFcIixcbiAgXCJhdXRoZW50aWNhdGluZ0RvdHNcIiA6IFwiQXV0ZW50aWNhbmRvLi4uXCIsXG4gIFwiYXV0aGVudGljYXRpbmdTdWJcIiA6IFwiVmFtb3MgYSB2ZXIgY8OzbW8gZGUgZmlhciBlcmVzLlwiLFxuICBcIm5vdEF1dGhlbnRpY2F0ZWRcIiA6IFwiTm8gYXV0ZW50aWNhZG9cIixcbiAgXCJwYXNzd29yZE5lZWRlZFwiIDogXCJMYSBjb250cmFzZcOxYSBlcyBuZWNlc2FyaWFcIixcbiAgXCJub3RJbml0aWFsaXplZFwiIDogXCJObyBpbmljaWFsaXphZG9cIixcbiAgXCJpbnZhbGlkUGFzc3dvcmRcIiA6IFwiQ29udHJhc2XDsWEgbm8gdsOhbGlkYVwiLFxuICBcInRpbWVvdXRQYXNzd29yZFwiIDogXCJFbCBhZ2VudGUgaGEgY2VycmFkbyBsYSBjb25leGnDs24gcG9yIGluYWN0aXZpZGFkIG1pZW50cmFzIHNlIGNvbXBsZXRhYmEgZWwgcHJvY2VzbyBkZSBhdXRlbnRpY2FjacOzbi5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VOb3JtYWxcIiA6IFwiTGEgY29uZXhpw7NuIHNlIGhhIGNlcnJhZG8gY29uIMOpeGl0by5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VHb2luZ0F3YXlcIiA6IFwiRWwgYWdlbnRlIGhhIGNlcnJhZG8gbGEgY29uZXhpw7NuLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZVByb3RvY29sRXJyb3JcIiA6IFwiRWwgYWdlbnRlIGhhIGNlcnJhZG8gbGEgY29uZXhpw7NuIGRlYmlkbyBhIHVuIGVycm9yIGRlIHByb3RvY29sby5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VVbnN1cHBvcnRlZFwiIDogXCJMYSBjb25leGnDs24gc2UgaGEgY2VycmFuZG8gZGViaWRvIGEgcXVlIGVsIGFnZW50ZSBoYSByZWNpYmlkbyBkYXRvcyBkZSB1biB0aXBvIHF1ZSBubyBwdWVkZSBhY2VwdGFyLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZU5vU3RhdHVzXCIgOiBcIk5vIHNlIGhhIHJlY2liaWRvIHVuIGPDs2RpZ28gZGUgZXN0YWRvIGN1YW5kbyBzZSBlc3BlcmFiYSB1bm8uXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlQWJub3JtYWxcIiA6IFwiTGEgY29uZXhpw7NuIHNlIGNlcnLDsyBkZSBmb3JtYSBhbsOzbWFsYSBzaW4gdW5hIHNlw7FhbCBkZSBjaWVycmUuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlVW5zdXBwb3J0ZWREYXRhXCIgOiBcIkVsIGFnZW50ZSBoYSBjZXJyYWRvIGxhIGNvbmV4acOzbiBwb3JxdWUgc2UgaGEgcmVjaWJpZG8gdW4gbWVuc2FqZSBjb24gZGF0b3MgaW5jb25zaXN0ZW50ZXMuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlUG9saWN5VmlvbGF0aW9uXCIgOiBcIkVsIGFnZW50ZSBoYSBjZXJyYWRvIGxhIGNvbmV4acOzbiBwb3JxdWUgcmVjaWJpw7MgdW4gbWVuc2FqZSBxdWUgdmlvbGEgc3UgcG9sw610aWNhLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZVRvb0xhcmdlXCIgOiBcIkVsIGFnZW50ZSBoYSBjZXJyYWRvIGxhIGNvbmV4acOzbiBwb3JxdWUgc2UgcmVjaWJpw7MgdW5hIHRyYW1hIGRlIGRhdG9zIGRlbWFzaWFkbyBncmFuZGUuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlTWlzc2luZ0V4dGVuc2lvblwiIDogXCJFbCBjbGllbnRlIGhhIGNlcnJhZG8gbGEgY29uZXhpw7NuIHBvcnF1ZSBlc3BlcmFiYSBxdWUgZWwgYWdlbnRlIG5lZ29jaWFzZSB1bmEgZXh0ZW5zacOzbiB5IG5vIGxvIGhhIGhlY2hvLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZUludGVybmFsRXJyb3JcIiA6IFwiRWwgYWdlbnRlIGhhIGNlcnJhZG8gbGEgY29uZXhpw7NuIHBvcnF1ZSBoYSBlbmNvbnRyYWRvIHVuYSBjb25kaWNpw7NuIGluZXNwZXJhZGEgcXVlIGhhIGltcGVkaWRvIHF1ZSBzZSBjb21wbGV0YXNlIGxhIHBldGljacOzbi5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VTZXJ2aWNlUmVzdGFydFwiIDogXCJFbCBhZ2VudGUgaGEgY2VycmFkbyBsYSBjb25leGnDs24gcG9ycXVlIHNlIGVzdMOhIHJlaW5pY2lhbmRvLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZVRyeUFnYWluTGF0ZXJcIiA6IFwiRWwgYWdlbnRlIGhhIGNlcnJhZG8gbGEgY29uZXhpw7NuIGRlYmlkbyBhIHVuIHByb2JsZW1hIHRlbXBvcmFsLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZVRsc0hhbmRzaGFrZVwiIDogXCJMYSBjb25leGnDs24gc2UgaGEgY2VycmFkbyBkZWJpZG8gYSB1biBmYWxsbyBlbiBsYSBuZWdvY2lhY2nDs24gZGVsIHNhbHVkbyBUTFMuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlSW5hY3Rpdml0eVwiIDogXCJFbCBhZ2VudGUgaGEgY2VycmFkbyBsYSBjb25leGnDs24gcG9yIGluYWN0aXZpZGFkLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZUF1dGhFeHBpcmVkXCIgOiBcIkVsIGFnZW50ZSBoYSBjZXJyYWRvIGxhIGNvbmV4acOzbiBwb3JxdWUgbGEgYXV0b3JpemFjacOzbiB0ZW1wb3JhbCBoYSBjYWR1Y2Fkby5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VEZWZhdWx0XCIgOiBcIkxhIGNvbmV4acOzbiBzZSBoYSBjZXJyYWRvIHNpbiByZWNpYmlyIHVuIGPDs2RpZ28gdsOhbGlkby5cIixcbiAgXCJmb3JiaWRkZW5TZWN0aW9uXCIgOiBcIlNlY2Npw7NuIGluYWNjZXNpYmxlXCIsXG4gIFwiZm9yYmlkZGVuU2VjdGlvblN1YlwiIDogXCJVbiB1c3VhcmlvIHJlbW90byBoYSByZWNoYXphZG8gYWN0aXZhbWVudGUgbGEgcGV0aWNpw7NuIGRlIGFicmlyIHtzZWN0aW9ufS5cIixcbiAgXCJ0cnlBZ2FpblwiIDogXCJJbnRlbnRhciBkZSBudWV2b1wiLFxuICBcInNoYXJlLWFnZW50LWFjY2Vzc1wiOiBcIkNvbXBhcnRlIGVsIGFjY2VzbyBhIGVzdGUgYWdlbnRlXCIsXG4gIFwic2hhcmUtd2FybmluZy1tZXNzYWdlXCI6IFwiUmVjdWVyZGEgZGVzY29uZWN0YXJ0ZSBkZSBlc3RlIGFnZW50ZSBwYXJhIHBlcm10aXIgbGEgY29uZXhpw7NuIGRlIG90cm8gdXN1YXJpb1wiLFxuICBcInJlcXVlc3RpbmdQYXNzRG90c1wiIDogXCJQaWRpZW5kbyBjb250cmFzZcOxYS4uLlwiLFxuICBcImV4cGlyYXRpb25Jbk1pbnV0ZXNcIiA6IFwiQ2FkdWNpZGFkIChlbiBtaW51dG9zKVwiLFxuICBcImdlbmVyYXRlVXJsRXhwbGFuYXRpb25cIiA6IFwiQ29uIGVzdGEgVVJMIG90cmFzIHBlcnNvbmFzIHB1ZWRlbiBhY2NlZGVyIGRpcmVjdGFtZW50ZSBhbCBhZ2VudGUgZHVyYW50ZSBlbCB0aWVtcG8gZXNwZWNpZmljYWRvIHkgc2luIG5lY2VzaWRhZCBkZSBjcmVhciB1bmEgY3VlbnRhIG8gaW5pY2lhciB1bmEgc2VzacOzblwiLFxuICBcInJlcXVlc3RpbmdVcmxEb3RzXCIgOiBcIlBpZGllbmRvIFVSTC4uLlwiLFxuICBcImdlbmVyYXRlVXJsXCIgOiBcIkdlbmVyYXIgVVJMXCIsXG4gIFwidGVtcG9yYXJ5VXJsXCIgOiBcIlVSTCB0ZW1wb3JhbFwiLFxuICBcIlhfU2Vjb25kc1wiIDogXCJ7blNlY29uZHMsIHBsdXJhbCwgPTB7TnVuY2F9IG9uZXsjIHNlZ3VuZG99IG90aGVyeyMgc2VndW5kb3N9fVwiLFxuICBcIlhfTWludXRlc1wiIDogXCJ7bk1pbnV0ZXMsIHBsdXJhbCwgPTB7TnVuY2F9IG9uZXsjIG1pbnV0b30gb3RoZXJ7IyBtaW51dG9zfX1cIixcbiAgXCJyZWZyZXNoUHJvY2Vzc2VzXCIgOiBcIlJlZnJlc2NhciBwcm9jZXNvc1wiLFxuICBcInN0b3BQcm9jZXNzXCIgOiBcIlBhcmFyIHByb2Nlc29cIixcbiAgXCJjbGlja09uQVByb2Nlc3NcIiA6IFwiSGFjZXIgY2xpY2sgZW4gdW4gcHJvY2Vzb1wiLFxuICBcImZpbHRlclByb2Nlc3NcIiA6IFwiRmlsdHJhciBwb3IgUElELCB1c3VhcmlvIG8gbm9tYnJlXCIsXG4gIFwidXNlZFwiOiBcIlVzYWRvXCIsXG4gIFwidG90YWxcIjogXCJUb3RhbFwiLFxuICBcInBpZFwiIDogXCJQSURcIixcbiAgXCJ1c2VyXCIgOiBcIlVzdWFyaW9cIixcbiAgXCJuYW1lXCIgOiBcIk5vbWJyZVwiLFxuICBcInRoZXJlQXJlTm9Qcm9jZXNzZXNcIiA6IFwiTm8gaGF5IHByb2Nlc29zXCIsXG4gIFwiY2xpY2tPbkFTZXJ2aWNlXCIgOiBcIkhhY2VyIGNsaWNrIGVuIHVuIHNlcnZpY2lvXCIsXG4gIFwicmVmcmVzaFNlcnZpY2VzXCIgOiBcIlJlZnJlc2NhciBzZXJ2aWNpb3NcIixcbiAgXCJzdGFydFNlcnZpY2VcIiA6IFwiSW5pY2lhciBzZXJ2aWNpb1wiLFxuICBcInN0b3BTZXJ2aWNlXCIgOiBcIlBhcmFyIHNlcnZpY2lvXCIsXG4gIFwidHlwZVRvRmlsdGVyXCIgOiBcIkVzY3JpYmUgcGFyYSBmaWx0cmFyXCIsXG4gIFwiYW55XCIgOiBcIkN1YWxxdWllcmFcIixcbiAgXCJzZWFyY2hcIiA6IFwiQnVzY2FyXCIsXG4gIFwiaWRlbnRpZmllclwiIDogXCJJZGVudGlmaWNhZG9yXCIsXG4gIFwiZGVzY3JpcHRpb25cIiA6IFwiRGVzY3JpcGNpw7NuXCIsXG4gIFwic3RhdHVzXCIgOiBcIkVzdGFkb1wiLFxuICBcInRoZXJlQXJlTm9TZXJ2aWNlc1wiIDogXCJObyBoYXkgc2VydmljaW9zXCIsXG4gIFwibm90UnVubmluZ1wiIDogXCJQYXJhZG9cIixcbiAgXCJmaWx0ZXJcIiA6IFwiRmlsdHJvXCIsXG4gIFwicmVmcmVzaERpcmVjdG9yeVwiIDogXCJSZWZyZXNjYXIgY2FycGV0YVwiLFxuICBcImRvd25sb2Fkc1wiIDogXCJEZXNjYXJnYXNcIixcbiAgXCJ1cGxvYWRzXCIgOiBcIlN1YmlkYXNcIixcbiAgXCJlbXB0eVwiIDogXCJWYWPDrW9cIixcbiAgXCJmaWxlc0Rvd25sb2FkTGltaXRcIiA6IFwiQWN0dWFsbWVudGUsIHNvbG8gc2UgcHVlZGVuIGRlc2NhcmdhciBhcmNoaXZvcyBkZSAxMDBNQiBvIG1lbm9zXCIsXG4gIFwidGhlRmlsZVdpbGxCZURlbGV0ZWRcIiA6IFwiRWwgYXJjaGl2byBzZSBib3JyYXLDoVwiLFxuICBcInllc1wiIDogXCJTw61cIixcbiAgXCJhY3Rpb25zXCIgOiBcIkFjY2lvbmVzXCIsXG4gIFwibGFzdE1vZGlmaWNhdGlvblwiIDogXCLDmmx0aW1hIG1vZGlmaWNhY2nDs25cIixcbiAgXCJjb25maXJtRGVsZXRpb25cIiA6IFwiQ29uZmlybWFyIGVsIGJvcnJhZG9cIixcbiAgXCJ0aGVyZUFyZU5vRmlsZXNcIiA6IFwiTm8gaGF5IGFyY2hpdm9zXCIsXG4gIFwic2l6ZVwiIDogXCJUYW1hw7FvXCIsXG4gIFwiZGVsZXRlXCIgOiBcIkJvcnJhclwiLFxuICBcImFyZVlvdVN1cmVRdWVzdGlvbk1hcmtcIiA6IFwiwr9Fc3TDoXMgc2VndXJvP1wiLFxuICBcImxhc3RVcGRhdGVcIiA6IFwiw5psdGltYSBhY3R1YWxpemFjacOzblwiLFxuICBcIm5ldmVyVXBkYXRlZFwiIDogXCJOdW5jYSBzZSBoYSBhY3R1YWxpemFkb1wiLFxuICBcIm5vUm9vdERpcmVjdG9yeVwiIDogXCJObyBoYXkgZGlyZWN0b3JpbyByYcOtelwiLFxuICBcInN0YXJ0UGVuZGluZ1wiIDogXCJBcnJhbmNhbmRvXCIsXG4gIFwic3RvcFBlbmRpbmdcIiA6IFwiUGFyYW5kb1wiLFxuICBcInJ1bm5pbmdcIiA6IFwiQ29ycmllbmRvXCIsXG4gIFwicmVzdW1lUGVuZGluZ1wiIDogXCJSZWluaWNpYW5kb1wiLFxuICBcInBhdXNlUGVuZGluZ1wiIDogXCJQYXVzYW5kb1wiLFxuICBcInBhdXNlZFwiIDogXCJQYXVzYWRvXCIsXG4gIFwidW5rbm93blwiIDogXCJEZXNjb25vY2lkb1wiLFxuICBcImRpc2Nvbm5lY3RlZEluZm9cIiA6IFwiUHVsc2UgZWwgYm90w7NuICdDb25lY3RhcicgcGFyYSBhY2NlZGVyIGFsIGVzY3JpdG9yaW8gcmVtb3RvLlwiLFxuICBcImVycm9yLWZlY2hpbmctcm9vdFwiIDogXCJFcnJvciBhbCBhYnJpciBlbCBkaXJlY3RvcmlvIHJhw616XCIsXG4gIFwiZXJyb3ItZmVjaGluZy1kaXJcIiA6IFwiRXJyb3IgYWwgYWJyaXIgbGEgY2FycGV0YToge3BhdGh9XCIsXG4gIFwiZXJyb3ItdXBsb2FkLWZpbGVcIiA6IFwiU3ViaWRhIGZhbGxpZGEgKHtwYXRofSlcIixcbiAgXCJlcnJvci1kb3dubG9hZC1maWxlXCIgOiBcIkRlc2NhcmdhIGZhbGxpZGEgKHtwYXRofSlcIixcbiAgXCJlcnJvci1kZWxldGluZy1maWxlXCIgOiBcIkVycm9yIGFsIGVsaW1pbmFyIGVsIGFyY2hpdm8ge3BhdGh9XCIsXG4gIFwicmVzdGFydFNlcnZpY2VcIiA6IFwiUmVpbmljaWFyIHNlcnZpY2lvXCIsXG4gIFwidXBsb2FkLWRpc2FibGVkXCI6IFwiU3ViaWRhIGRlc2hhYmlsaXRhZGEgZW4gZXN0ZSBkaXJlY3RvcmlvXCIsXG4gIFwiY2xpY2stdG8tdXBsb2FkXCI6IFwiQ2xpY2sgcGFyYSBzdWJpciB1biBmaWNoZXJvXCIsXG4gIFwidXBsb2FkLWRyb3BcIjogXCJTdWVsdGEgZWwgYXJjaGl2byBwYXJhIGNvbWVuemFyIGxhIHN1YmlkYVwiXG59XG4iXX0= +},{}]},{},[642]) +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvQG5yYXluYXVkL25vdm5jL2xpYi9iYXNlNjQuanMiLCJub2RlX21vZHVsZXMvQG5yYXluYXVkL25vdm5jL2xpYi9kZXMuanMiLCJub2RlX21vZHVsZXMvQG5yYXluYXVkL25vdm5jL2xpYi9kaXNwbGF5LmpzIiwibm9kZV9tb2R1bGVzL0BucmF5bmF1ZC9ub3ZuYy9saWIvaW5mbGF0b3IubW9kLmpzIiwibm9kZV9tb2R1bGVzL0BucmF5bmF1ZC9ub3ZuYy9saWIvaW5wdXQvZGV2aWNlcy5qcyIsIm5vZGVfbW9kdWxlcy9AbnJheW5hdWQvbm92bmMvbGliL2lucHV0L2tleXN5bS5qcyIsIm5vZGVfbW9kdWxlcy9AbnJheW5hdWQvbm92bmMvbGliL2lucHV0L2tleXN5bWRlZi5qcyIsIm5vZGVfbW9kdWxlcy9AbnJheW5hdWQvbm92bmMvbGliL2lucHV0L3V0aWwuanMiLCJub2RlX21vZHVsZXMvQG5yYXluYXVkL25vdm5jL2xpYi9pbnB1dC94dHNjYW5jb2Rlcy5qcyIsIm5vZGVfbW9kdWxlcy9AbnJheW5hdWQvbm92bmMvbGliL3JmYi5qcyIsIm5vZGVfbW9kdWxlcy9AbnJheW5hdWQvbm92bmMvbGliL3V0aWwuanMiLCJub2RlX21vZHVsZXMvQG5yYXluYXVkL25vdm5jL2xpYi93ZWJzb2NrLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJlZ2lzdGVyL2xpYi9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9hcnJheS9mcm9tLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZW50cmllcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L3NldC1wcm90b3R5cGUtb2YuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC92YWx1ZXMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL3N5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvc3ltYm9sL2l0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjay5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy90eXBlb2YuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL2FycmF5L2Zyb20uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9lbnRyaWVzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3Qvc2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L3ZhbHVlcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9zeW1ib2wvaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2EtZnVuY3Rpb24uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1pbmNsdWRlcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY2xhc3NvZi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29mLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb3JlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jcmVhdGUtcHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2N0eC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2VudW0tYnVnLWtleXMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2VudW0ta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZXhwb3J0LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19mYWlscy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZ2xvYmFsLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oYXMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2hpZGUuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2h0bWwuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItc3RlcC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlcmF0b3JzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19rZXlvZi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbGlicmFyeS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fbWV0YS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWFzc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWRwLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHBzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wZC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcG4tZXh0LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wbi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdvcHMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1ncG8uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1rZXlzLWludGVybmFsLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LXBpZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LXRvLWFycmF5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19yZWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXByb3RvLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtdG8tc3RyaW5nLXRhZy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2hhcmVkLWtleS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2hhcmVkLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zdHJpbmctYXQuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLWluZGV4LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pbnRlZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1sZW5ndGguanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL191aWQuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3drcy1kZWZpbmUuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3drcy1leHQuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3drcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5LmZyb20uanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LmFycmF5Lml0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5zeW1ib2wuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3Lm9iamVjdC5lbnRyaWVzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5vYmplY3QudmFsdWVzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5zeW1ib2wuYXN5bmMtaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3LnN5bWJvbC5vYnNlcnZhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanMiLCJub2RlX21vZHVsZXMvY2FudmFzLXRvLWJsb2IvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2xhc3NuYW1lcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9kMy9kMy5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy9hY3RpdmVFbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2NsYXNzL2FkZENsYXNzLmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2NsYXNzL2hhc0NsYXNzLmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2NsYXNzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2NsYXNzL3JlbW92ZUNsYXNzLmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2V2ZW50cy9maWx0ZXIuanMiLCJub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXZlbnRzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL2V2ZW50cy9saXN0ZW4uanMiLCJub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvZXZlbnRzL29mZi5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy9ldmVudHMvb24uanMiLCJub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvb3duZXJEb2N1bWVudC5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy9xdWVyeS9jb250YWlucy5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy9xdWVyeS9pc1dpbmRvdy5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy9xdWVyeS9vZmZzZXQuanMiLCJub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvcXVlcnkvb2Zmc2V0UGFyZW50LmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL3F1ZXJ5L3Bvc2l0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL3F1ZXJ5L3F1ZXJ5U2VsZWN0b3JBbGwuanMiLCJub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvcXVlcnkvc2Nyb2xsTGVmdC5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy9xdWVyeS9zY3JvbGxUb3AuanMiLCJub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvc3R5bGUvZ2V0Q29tcHV0ZWRTdHlsZS5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy9zdHlsZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy9zdHlsZS9yZW1vdmVTdHlsZS5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy90cmFuc2l0aW9uL2lzVHJhbnNmb3JtLmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL3RyYW5zaXRpb24vcHJvcGVydGllcy5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy91dGlsL2NhbWVsaXplLmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL3V0aWwvY2FtZWxpemVTdHlsZS5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy91dGlsL2h5cGhlbmF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9kb20taGVscGVycy91dGlsL2h5cGhlbmF0ZVN0eWxlLmpzIiwibm9kZV9tb2R1bGVzL2RvbS1oZWxwZXJzL3V0aWwvaW5ET00uanMiLCJub2RlX21vZHVsZXMvZG9tLWhlbHBlcnMvdXRpbC9zY3JvbGxiYXJTaXplLmpzIiwibm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCJub2RlX21vZHVsZXMvZmJlbWl0dGVyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2ZiZW1pdHRlci9saWIvQmFzZUV2ZW50RW1pdHRlci5qcyIsIm5vZGVfbW9kdWxlcy9mYmVtaXR0ZXIvbGliL0VtaXR0ZXJTdWJzY3JpcHRpb24uanMiLCJub2RlX21vZHVsZXMvZmJlbWl0dGVyL2xpYi9FdmVudFN1YnNjcmlwdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9mYmVtaXR0ZXIvbGliL0V2ZW50U3Vic2NyaXB0aW9uVmVuZG9yLmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL0V2ZW50TGlzdGVuZXIuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvRXhlY3V0aW9uRW52aXJvbm1lbnQuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvY2FtZWxpemUuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvY2FtZWxpemVTdHlsZU5hbWUuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvY29udGFpbnNOb2RlLmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL2NyZWF0ZUFycmF5RnJvbU1peGVkLmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL2NyZWF0ZU5vZGVzRnJvbU1hcmt1cC5qcyIsIm5vZGVfbW9kdWxlcy9mYmpzL2xpYi9lbXB0eUZ1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL2VtcHR5T2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL2ZvY3VzTm9kZS5qcyIsIm5vZGVfbW9kdWxlcy9mYmpzL2xpYi9nZXRBY3RpdmVFbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL2dldE1hcmt1cFdyYXAuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb24uanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvaHlwaGVuYXRlLmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL2h5cGhlbmF0ZVN0eWxlTmFtZS5qcyIsIm5vZGVfbW9kdWxlcy9mYmpzL2xpYi9pbnZhcmlhbnQuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvaXNOb2RlLmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL2lzVGV4dE5vZGUuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvbWVtb2l6ZVN0cmluZ09ubHkuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvcGVyZm9ybWFuY2UuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvcGVyZm9ybWFuY2VOb3cuanMiLCJub2RlX21vZHVsZXMvZmJqcy9saWIvc2hhbGxvd0VxdWFsLmpzIiwibm9kZV9tb2R1bGVzL2ZianMvbGliL3dhcm5pbmcuanMiLCJub2RlX21vZHVsZXMvZmlsZXNhdmVyLmpzL0ZpbGVTYXZlci5qcyIsIm5vZGVfbW9kdWxlcy9mbHV4L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2ZsdXgvbGliL0Rpc3BhdGNoZXIuanMiLCJub2RlX21vZHVsZXMvZmx1eC9saWIvRmx1eENvbnRhaW5lci5qcyIsIm5vZGVfbW9kdWxlcy9mbHV4L2xpYi9GbHV4TWFwU3RvcmUuanMiLCJub2RlX21vZHVsZXMvZmx1eC9saWIvRmx1eE1peGluTGVnYWN5LmpzIiwibm9kZV9tb2R1bGVzL2ZsdXgvbGliL0ZsdXhSZWR1Y2VTdG9yZS5qcyIsIm5vZGVfbW9kdWxlcy9mbHV4L2xpYi9GbHV4U3RvcmUuanMiLCJub2RlX21vZHVsZXMvZmx1eC9saWIvRmx1eFN0b3JlR3JvdXAuanMiLCJub2RlX21vZHVsZXMvZmx1eC9saWIvYWJzdHJhY3RNZXRob2QuanMiLCJub2RlX21vZHVsZXMvZmx1eC9ub2RlX21vZHVsZXMvZmJqcy9saWIvaW52YXJpYW50LmpzIiwibm9kZV9tb2R1bGVzL2ZsdXgvbm9kZV9tb2R1bGVzL2ZianMvbGliL3NoYWxsb3dFcXVhbC5qcyIsIm5vZGVfbW9kdWxlcy9mbHV4L3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2h1bWFuaXplL2h1bWFuaXplLmpzIiwibm9kZV9tb2R1bGVzL2ltbXV0YWJsZS9kaXN0L2ltbXV0YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLWZvcm1hdC1jYWNoZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLWZvcm1hdC1jYWNoZS9saWIvZXM1LmpzIiwibm9kZV9tb2R1bGVzL2ludGwtZm9ybWF0LWNhY2hlL2xpYi9tZW1vaXplci5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLW1lc3NhZ2Vmb3JtYXQtcGFyc2VyL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2ludGwtbWVzc2FnZWZvcm1hdC1wYXJzZXIvbGliL3BhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLW1lc3NhZ2Vmb3JtYXQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaW50bC1tZXNzYWdlZm9ybWF0L2xpYi9jb21waWxlci5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLW1lc3NhZ2Vmb3JtYXQvbGliL2NvcmUuanMiLCJub2RlX21vZHVsZXMvaW50bC1tZXNzYWdlZm9ybWF0L2xpYi9lbi5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLW1lc3NhZ2Vmb3JtYXQvbGliL2VzNS5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLW1lc3NhZ2Vmb3JtYXQvbGliL21haW4uanMiLCJub2RlX21vZHVsZXMvaW50bC1tZXNzYWdlZm9ybWF0L2xpYi91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLXJlbGF0aXZlZm9ybWF0L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2ludGwtcmVsYXRpdmVmb3JtYXQvbGliL2NvcmUuanMiLCJub2RlX21vZHVsZXMvaW50bC1yZWxhdGl2ZWZvcm1hdC9saWIvZGlmZi5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLXJlbGF0aXZlZm9ybWF0L2xpYi9lbi5qcyIsIm5vZGVfbW9kdWxlcy9pbnRsLXJlbGF0aXZlZm9ybWF0L2xpYi9lczUuanMiLCJub2RlX21vZHVsZXMvaW52YXJpYW50L2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMva2V5Y29kZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX1N5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19mcmVlR2xvYmFsLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0UHJvdG90eXBlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fZ2V0UmF3VGFnLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fb2JqZWN0VG9TdHJpbmcuanMiLCJub2RlX21vZHVsZXMvbG9kYXNoL19vdmVyQXJnLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9fcm9vdC5qcyIsIm5vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3RMaWtlLmpzIiwibm9kZV9tb2R1bGVzL2xvZGFzaC9pc1BsYWluT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL21vYmlsZS1kZXRlY3QvbW9iaWxlLWRldGVjdC5qcyIsIm5vZGVfbW9kdWxlcy9vYmplY3QtYXNzaWduL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3V0aWxzL2NvbW1vbi5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2FkbGVyMzIuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jcmMzMi5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZmZhc3QuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mdHJlZXMuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi96c3RyZWFtLmpzIiwibm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYXRoLXBhcnNlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3Byb2Nlc3MvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2NoZWNrUHJvcFR5cGVzLmpzIiwibm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvZmFjdG9yeS5qcyIsIm5vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2ZhY3RvcnlXaXRoVGhyb3dpbmdTaGltcy5qcyIsIm5vZGVfbW9kdWxlcy9wcm9wLXR5cGVzL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzIiwibm9kZV9tb2R1bGVzL3Byb3AtdHlwZXMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvcC10eXBlcy9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQuanMiLCJub2RlX21vZHVsZXMvcHVueWNvZGUvcHVueWNvZGUuanMiLCJub2RlX21vZHVsZXMvcXVlcnlzdHJpbmctZXMzL2RlY29kZS5qcyIsIm5vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvZW5jb2RlLmpzIiwibm9kZV9tb2R1bGVzL3F1ZXJ5c3RyaW5nLWVzMy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0FjY29yZGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0FsZXJ0LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvQmFkZ2UuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9CcmVhZGNydW1iLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvQnJlYWRjcnVtYkl0ZW0uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9CdXR0b24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9CdXR0b25Hcm91cC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0J1dHRvblRvb2xiYXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9DYXJvdXNlbC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0Nhcm91c2VsQ2FwdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0Nhcm91c2VsSXRlbS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0NoZWNrYm94LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvQ2xlYXJmaXguanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9DbG9zZUJ1dHRvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0NvbC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0NvbGxhcHNlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvQ29udHJvbExhYmVsLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvRHJvcGRvd24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9Ecm9wZG93bkJ1dHRvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0Ryb3Bkb3duTWVudS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0Ryb3Bkb3duVG9nZ2xlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvRmFkZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0Zvcm0uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9Gb3JtQ29udHJvbC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0Zvcm1Db250cm9sRmVlZGJhY2suanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9Gb3JtQ29udHJvbFN0YXRpYy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0Zvcm1Hcm91cC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0dseXBoaWNvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0dyaWQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9IZWxwQmxvY2suanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9JbWFnZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL0lucHV0R3JvdXAuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9JbnB1dEdyb3VwQWRkb24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9JbnB1dEdyb3VwQnV0dG9uLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvSnVtYm90cm9uLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvTGFiZWwuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9MaXN0R3JvdXAuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9MaXN0R3JvdXBJdGVtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvTWVkaWEuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9NZWRpYUJvZHkuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9NZWRpYUhlYWRpbmcuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9NZWRpYUxlZnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9NZWRpYUxpc3QuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9NZWRpYUxpc3RJdGVtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvTWVkaWFSaWdodC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL01lbnVJdGVtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvTW9kYWwuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9Nb2RhbEJvZHkuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9Nb2RhbERpYWxvZy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL01vZGFsRm9vdGVyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvTW9kYWxIZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9Nb2RhbFRpdGxlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvTmF2LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvTmF2RHJvcGRvd24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9OYXZJdGVtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvTmF2YmFyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvTmF2YmFyQnJhbmQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9OYXZiYXJDb2xsYXBzZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL05hdmJhckhlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL05hdmJhclRvZ2dsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL092ZXJsYXkuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9PdmVybGF5VHJpZ2dlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1BhZ2VIZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9QYWdlSXRlbS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1BhZ2VyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvUGFnZXJJdGVtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvUGFnaW5hdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1BhZ2luYXRpb25CdXR0b24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9QYW5lbC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1BhbmVsR3JvdXAuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9Qb3BvdmVyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvUHJvZ3Jlc3NCYXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9SYWRpby5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1Jlc3BvbnNpdmVFbWJlZC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1Jvdy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1NhZmVBbmNob3IuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9TcGxpdEJ1dHRvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1NwbGl0VG9nZ2xlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvVGFiLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvVGFiQ29udGFpbmVyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvVGFiQ29udGVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1RhYlBhbmUuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9UYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL1RhYnMuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9UaHVtYm5haWwuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi9Ub29sdGlwLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvV2VsbC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvdXRpbHMvUHJvcFR5cGVzLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvdXRpbHMvU3R5bGVDb25maWcuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtYm9vdHN0cmFwL2xpYi91dGlscy9UcmFuc2l0aW9uRXZlbnRzLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvdXRpbHMvVmFsaWRDb21wb25lbnRDaGlsZHJlbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL3V0aWxzL2Jvb3RzdHJhcFV0aWxzLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvdXRpbHMvY2FwaXRhbGl6ZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL3V0aWxzL2NyZWF0ZUNoYWluZWRGdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL3V0aWxzL2RlcHJlY2F0aW9uV2FybmluZy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1ib290c3RyYXAvbGliL3V0aWxzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWJvb3RzdHJhcC9saWIvdXRpbHMvc3BsaXRDb21wb25lbnRQcm9wcy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9BUklBRE9NUHJvcGVydHlDb25maWcuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9BdXRvRm9jdXNVdGlscy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0JlZm9yZUlucHV0RXZlbnRQbHVnaW4uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9DU1NQcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0NTU1Byb3BlcnR5T3BlcmF0aW9ucy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0NhbGxiYWNrUXVldWUuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9DaGFuZ2VFdmVudFBsdWdpbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0RPTUNoaWxkcmVuT3BlcmF0aW9ucy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0RPTUxhenlUcmVlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvRE9NTmFtZXNwYWNlcy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0RPTVByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvRE9NUHJvcGVydHlPcGVyYXRpb25zLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvRGFuZ2VyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvRGVmYXVsdEV2ZW50UGx1Z2luT3JkZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9FbnRlckxlYXZlRXZlbnRQbHVnaW4uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9FdmVudFBsdWdpbkh1Yi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0V2ZW50UGx1Z2luUmVnaXN0cnkuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9FdmVudFBsdWdpblV0aWxzLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvRXZlbnRQcm9wYWdhdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0ZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0hUTUxET01Qcm9wZXJ0eUNvbmZpZy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL0tleUVzY2FwZVV0aWxzLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvTGlua2VkVmFsdWVVdGlscy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1Bvb2xlZENsYXNzLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RDaGlsZFJlY29uY2lsZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdENvbXBvc2l0ZUNvbXBvbmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01Db21wb25lbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTUNvbXBvbmVudEZsYWdzLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01Db21wb25lbnRUcmVlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01Db250YWluZXJJbmZvLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01FbXB0eUNvbXBvbmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NRmVhdHVyZUZsYWdzLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01JRE9wZXJhdGlvbnMuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTUlucHV0LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01JbnZhbGlkQVJJQUhvb2suanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTU51bGxJbnB1dFZhbHVlUHJvcEhvb2suanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTU9wdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RE9NU2VsZWN0LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01TZWxlY3Rpb24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTVRleHRDb21wb25lbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERPTVRleHRhcmVhLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01UcmVlVHJhdmVyc2FsLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RET01Vbmtub3duUHJvcGVydHlIb29rLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3REZWJ1Z1Rvb2wuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3REZWZhdWx0SW5qZWN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RFbGVtZW50U3ltYm9sLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RFbXB0eUNvbXBvbmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RXJyb3JVdGlscy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0RXZlbnRFbWl0dGVyTWl4aW4uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdEV2ZW50TGlzdGVuZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdEZlYXR1cmVGbGFncy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0SG9zdENvbXBvbmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0SG9zdE9wZXJhdGlvbkhpc3RvcnlIb29rLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RJbmplY3Rpb24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdElucHV0U2VsZWN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RJbnN0YW5jZU1hcC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0SW5zdHJ1bWVudGF0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RJbnZhbGlkU2V0U3RhdGVXYXJuaW5nSG9vay5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0TWFya3VwQ2hlY2tzdW0uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdE1vdW50LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RNdWx0aUNoaWxkLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3ROb2RlVHlwZXMuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdE93bmVyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdFJlY29uY2lsZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdFJlZi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9SZWFjdFNlcnZlclVwZGF0ZVF1ZXVlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvUmVhY3RVcGRhdGVRdWV1ZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0VXBkYXRlcy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1JlYWN0VmVyc2lvbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1NWR0RPTVByb3BlcnR5Q29uZmlnLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvU2VsZWN0RXZlbnRQbHVnaW4uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9TaW1wbGVFdmVudFBsdWdpbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0FuaW1hdGlvbkV2ZW50LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvU3ludGhldGljQ2xpcGJvYXJkRXZlbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvU3ludGhldGljRHJhZ0V2ZW50LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvU3ludGhldGljRXZlbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNGb2N1c0V2ZW50LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvU3ludGhldGljSW5wdXRFdmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY0tleWJvYXJkRXZlbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNNb3VzZUV2ZW50LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvU3ludGhldGljVG91Y2hFdmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY1RyYW5zaXRpb25FdmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL1N5bnRoZXRpY1VJRXZlbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9TeW50aGV0aWNXaGVlbEV2ZW50LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvVHJhbnNhY3Rpb24uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9WaWV3cG9ydE1ldHJpY3MuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9hY2N1bXVsYXRlSW50by5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2FkbGVyMzIuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9jaGVja1JlYWN0VHlwZVNwZWMuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9jcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvZGFuZ2Vyb3VzU3R5bGVWYWx1ZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2VzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2ZpbmRET01Ob2RlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvZmxhdHRlbkNoaWxkcmVuLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvZm9yRWFjaEFjY3VtdWxhdGVkLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvZ2V0RXZlbnRDaGFyQ29kZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldEV2ZW50S2V5LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvZ2V0RXZlbnRNb2RpZmllclN0YXRlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvZ2V0RXZlbnRUYXJnZXQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9nZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldEl0ZXJhdG9yRm4uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9nZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvZ2V0VGV4dENvbnRlbnRBY2Nlc3Nvci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2dldFZlbmRvclByZWZpeGVkRXZlbnROYW1lLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL2lzRXZlbnRTdXBwb3J0ZWQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9pc1RleHRJbnB1dEVsZW1lbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9xdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL3JlYWN0UHJvZEludmFyaWFudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvc2V0SW5uZXJIVE1MLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9saWIvc2V0VGV4dENvbnRlbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi9zaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1kb20vbGliL3RyYXZlcnNlQWxsQ2hpbGRyZW4uanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZG9tL2xpYi92YWxpZGF0ZURPTU5lc3RpbmcuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtZHJvcHpvbmUvZGlzdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1pbnRsL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1pbnRsL2xvY2FsZS1kYXRhL2VuLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LWludGwvbG9jYWxlLWRhdGEvZXMuanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL01vZGFsLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LW92ZXJsYXlzL2xpYi9Nb2RhbE1hbmFnZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL092ZXJsYXkuanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL1BvcnRhbC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1vdmVybGF5cy9saWIvUG9zaXRpb24uanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL1Jvb3RDbG9zZVdyYXBwZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL1RyYW5zaXRpb24uanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL3V0aWxzL2FkZEV2ZW50TGlzdGVuZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL3V0aWxzL2FkZEZvY3VzTGlzdGVuZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL3V0aWxzL2NhbGN1bGF0ZVBvc2l0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LW92ZXJsYXlzL2xpYi91dGlscy9nZXRDb250YWluZXIuanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL3V0aWxzL2lzT3ZlcmZsb3dpbmcuanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL3V0aWxzL21hbmFnZUFyaWFIaWRkZW4uanMiLCJub2RlX21vZHVsZXMvcmVhY3Qtb3ZlcmxheXMvbGliL3V0aWxzL293bmVyRG9jdW1lbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtcHJvcC10eXBlcy9saWIvYWxsLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LXByb3AtdHlwZXMvbGliL2NvbXBvbmVudE9yRWxlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1wcm9wLXR5cGVzL2xpYi9pc1JlcXVpcmVkRm9yQTExeS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1wcm9wLXR5cGVzL2xpYi91dGlscy9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9saWIvY29tcG9uZW50cy9Qcm92aWRlci5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9saWIvY29tcG9uZW50cy9jb25uZWN0QWR2YW5jZWQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbGliL2Nvbm5lY3QvY29ubmVjdC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9saWIvY29ubmVjdC9tYXBEaXNwYXRjaFRvUHJvcHMuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbGliL2Nvbm5lY3QvbWFwU3RhdGVUb1Byb3BzLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2xpYi9jb25uZWN0L21lcmdlUHJvcHMuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbGliL2Nvbm5lY3Qvc2VsZWN0b3JGYWN0b3J5LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2xpYi9jb25uZWN0L3ZlcmlmeVN1YnNlbGVjdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9saWIvY29ubmVjdC93cmFwTWFwVG9Qcm9wcy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbGliL3V0aWxzL1Byb3BUeXBlcy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC1yZWR1eC9saWIvdXRpbHMvU3Vic2NyaXB0aW9uLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2xpYi91dGlscy9zaGFsbG93RXF1YWwuanMiLCJub2RlX21vZHVsZXMvcmVhY3QtcmVkdXgvbGliL3V0aWxzL3ZlcmlmeVBsYWluT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0LXJlZHV4L2xpYi91dGlscy93YXJuaW5nLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9SZWFjdC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RDaGlsZHJlbi5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RDbGFzcy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RDb21wb25lbnQuanMiLCJub2RlX21vZHVsZXMvcmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2suanMiLCJub2RlX21vZHVsZXMvcmVhY3QvbGliL1JlYWN0Q3VycmVudE93bmVyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9SZWFjdERPTUZhY3Rvcmllcy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RFbGVtZW50LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9SZWFjdEVsZW1lbnRWYWxpZGF0b3IuanMiLCJub2RlX21vZHVsZXMvcmVhY3QvbGliL1JlYWN0Tm9vcFVwZGF0ZVF1ZXVlLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9SZWFjdFByb3BUeXBlcy5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvUmVhY3RQdXJlQ29tcG9uZW50LmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9jYW5EZWZpbmVQcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvY2hlY2tSZWFjdFR5cGVTcGVjLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0L2xpYi9nZXROZXh0RGVidWdJRC5qcyIsIm5vZGVfbW9kdWxlcy9yZWFjdC9saWIvb25seUNoaWxkLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0L2xpYi90cmF2ZXJzZUFsbENoaWxkcmVuLmpzIiwibm9kZV9tb2R1bGVzL3JlYWN0L3JlYWN0LmpzIiwibm9kZV9tb2R1bGVzL3JlZHV4LXRodW5rL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9yZWR1eC9saWIvYXBwbHlNaWRkbGV3YXJlLmpzIiwibm9kZV9tb2R1bGVzL3JlZHV4L2xpYi9iaW5kQWN0aW9uQ3JlYXRvcnMuanMiLCJub2RlX21vZHVsZXMvcmVkdXgvbGliL2NvbWJpbmVSZWR1Y2Vycy5qcyIsIm5vZGVfbW9kdWxlcy9yZWR1eC9saWIvY29tcG9zZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWR1eC9saWIvY3JlYXRlU3RvcmUuanMiLCJub2RlX21vZHVsZXMvcmVkdXgvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3JlZHV4L2xpYi91dGlscy93YXJuaW5nLmpzIiwibm9kZV9tb2R1bGVzL3N5bWJvbC1vYnNlcnZhYmxlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3N5bWJvbC1vYnNlcnZhYmxlL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zeW1ib2wtb2JzZXJ2YWJsZS9saWIvcG9ueWZpbGwuanMiLCJub2RlX21vZHVsZXMvdW5jb250cm9sbGFibGUvY3JlYXRlVW5jb250cm9sbGFibGUuanMiLCJub2RlX21vZHVsZXMvdW5jb250cm9sbGFibGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdW5jb250cm9sbGFibGUvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvdXJsL3VybC5qcyIsIm5vZGVfbW9kdWxlcy91cmwvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy91dGY4L3V0ZjguanMiLCJub2RlX21vZHVsZXMvd2FybmluZy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3dlYndvcmtpZnkvaW5kZXguanMiLCJub2RlX21vZHVsZXMveHRlcm0vbGliL0NoYXJzZXRzLmpzIiwibm9kZV9tb2R1bGVzL3h0ZXJtL2xpYi9Db21wb3NpdGlvbkhlbHBlci5qcyIsIm5vZGVfbW9kdWxlcy94dGVybS9saWIvRXNjYXBlU2VxdWVuY2VzLmpzIiwibm9kZV9tb2R1bGVzL3h0ZXJtL2xpYi9FdmVudEVtaXR0ZXIuanMiLCJub2RlX21vZHVsZXMveHRlcm0vbGliL0lucHV0SGFuZGxlci5qcyIsIm5vZGVfbW9kdWxlcy94dGVybS9saWIvTGlua2lmaWVyLmpzIiwibm9kZV9tb2R1bGVzL3h0ZXJtL2xpYi9QYXJzZXIuanMiLCJub2RlX21vZHVsZXMveHRlcm0vbGliL1JlbmRlcmVyLmpzIiwibm9kZV9tb2R1bGVzL3h0ZXJtL2xpYi9WaWV3cG9ydC5qcyIsIm5vZGVfbW9kdWxlcy94dGVybS9saWIvYWRkb25zL2ZpdC9maXQuanMiLCJub2RlX21vZHVsZXMveHRlcm0vbGliL2hhbmRsZXJzL0NsaXBib2FyZC5qcyIsIm5vZGVfbW9kdWxlcy94dGVybS9saWIvdXRpbHMvQnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy94dGVybS9saWIvdXRpbHMvQ2hhck1lYXN1cmUuanMiLCJub2RlX21vZHVsZXMveHRlcm0vbGliL3V0aWxzL0NpcmN1bGFyTGlzdC5qcyIsIm5vZGVfbW9kdWxlcy94dGVybS9saWIvdXRpbHMvR2VuZXJpYy5qcyIsIm5vZGVfbW9kdWxlcy94dGVybS9saWIveHRlcm0uanMiLCJzcmMvRUhvcnVzLmpzIiwic3JjL2FjdGlvbnMvYWdlbnQuanMiLCJzcmMvYWN0aW9ucy9hcHAuanMiLCJzcmMvYWN0aW9ucy9kaXNwbGF5LmpzIiwic3JjL2FjdGlvbnMvZmlsZXMuanMiLCJzcmMvYWN0aW9ucy90ZXJtaW5hbC5qcyIsInNyYy9jb21tb24vY29tcG9uZW50cy9CYXNlQ29tcG9uZW50LmpzeCIsInNyYy9jb21tb24vY29tcG9uZW50cy9kYXRhLXRhYmxlL2NvbXBvbmVudHMvQ2VsbC5qc3giLCJzcmMvY29tbW9uL2NvbXBvbmVudHMvZGF0YS10YWJsZS9jb21wb25lbnRzL0hlYWRDZWxsLmpzeCIsInNyYy9jb21tb24vY29tcG9uZW50cy9kYXRhLXRhYmxlL2NvbXBvbmVudHMvUm93LmpzeCIsInNyYy9jb21tb24vY29tcG9uZW50cy9kYXRhLXRhYmxlL2NvbXBvbmVudHMvVEJvZHkuanN4Iiwic3JjL2NvbW1vbi9jb21wb25lbnRzL2RhdGEtdGFibGUvY29tcG9uZW50cy9USGVhZC5qc3giLCJzcmMvY29tbW9uL2NvbXBvbmVudHMvZGF0YS10YWJsZS9jb21wb25lbnRzL1RhYmxlLmpzeCIsInNyYy9jb21tb24vY29tcG9uZW50cy9kYXRhLXRhYmxlL2luZGV4LmpzIiwic3JjL2NvbW1vbi9jb21wb25lbnRzL2RhdGEtdGFibGUvbGliL0NvbHVtbi5qcyIsInNyYy9jb21tb24vY29tcG9uZW50cy9vdmVybGF5LmpzeCIsInNyYy9jb21tb24vY29tcG9uZW50cy9yZWFjdC1jaGFydHMvYXJlYS1jaGFydC9BcmVhLmpzeCIsInNyYy9jb21tb24vY29tcG9uZW50cy9yZWFjdC1jaGFydHMvYXJlYS1jaGFydC9BcmVhQ2hhcnQuanN4Iiwic3JjL2NvbW1vbi9jb21wb25lbnRzL3JlYWN0LWNoYXJ0cy9hcmVhLWNoYXJ0L0RhdGFTZXJpZXMuanN4Iiwic3JjL2NvbW1vbi9jb21wb25lbnRzL3JlYWN0LWNoYXJ0cy9hcmVhLWNoYXJ0L2luZGV4LmpzIiwic3JjL2NvbW1vbi9jb21wb25lbnRzL3JlYWN0LWNoYXJ0cy9jb21tb24vQ2hhcnQuanN4Iiwic3JjL2NvbW1vbi9jb21wb25lbnRzL3JlYWN0LWNoYXJ0cy9jb21tb24vaW5kZXguanMiLCJzcmMvY29tbW9uL2NvbXBvbmVudHMvcmVhY3QtY2hhcnRzL2luZGV4LmpzIiwic3JjL2NvbW1vbi9jb21wb25lbnRzL3JlZnJlc2gtYnV0dG9uLmpzeCIsInNyYy9jb21tb24vbGliL0Zha2VXZWJTb2NrZXQuanMiLCJzcmMvY29tbW9uL2xpYi9Mb2dnZXIuanMiLCJzcmMvY29tbW9uL2xpYi9iYXNlNjQuanMiLCJzcmMvY29tbW9uL2xpYi9yZW1vdGUvUmVtb3RlLmpzIiwic3JjL2NvbW1vbi9saWIvcmVtb3RlL1JlbW90ZUFnZW50LmpzIiwic3JjL2NvbW1vbi9saWIvcmVtb3RlL2luZGV4LmpzIiwic3JjL2NvbW1vbi9saWIvcmVtb3RlL3Jlc3BvbnNlLWRhdGEuanMiLCJzcmMvY29tbW9uL2xpYi91dGlsLmpzIiwic3JjL2NvbXBvbmVudHMvYWdlbnQtYXV0aGVudGljYXRpb24uanN4Iiwic3JjL2NvbXBvbmVudHMvYXBwLmpzeCIsInNyYy9jb21wb25lbnRzL2Rpc3BsYXkvYnV0dG9ucy5qc3giLCJzcmMvY29tcG9uZW50cy9kaXNwbGF5L2NsaXBib2FyZC1tb2RhbC5qc3giLCJzcmMvY29tcG9uZW50cy9kaXNwbGF5L2luZGV4LmpzeCIsInNyYy9jb21wb25lbnRzL2Rpc3BsYXkva2V5Ym9hcmQtYnV0dG9uLmpzeCIsInNyYy9jb21wb25lbnRzL2Rpc3BsYXkva2V5cy1idXR0b24uanN4Iiwic3JjL2NvbXBvbmVudHMvZGlzcGxheS9wYXNzLWZvcm0uanN4Iiwic3JjL2NvbXBvbmVudHMvZWxsaXBzaXplLmpzeCIsInNyYy9jb21wb25lbnRzL2ZpbGVzL2JyZWFkY3J1bWJzLmpzeCIsInNyYy9jb21wb25lbnRzL2ZpbGVzL2J1dHRvbnMuanN4Iiwic3JjL2NvbXBvbmVudHMvZmlsZXMvZG93bmxvYWRzLW1vZGFsLmpzeCIsInNyYy9jb21wb25lbnRzL2ZpbGVzL2Rvd25sb2Fkcy5qc3giLCJzcmMvY29tcG9uZW50cy9maWxlcy9maWxlLWRyb3AtbWVzc2FnZS5qc3giLCJzcmMvY29tcG9uZW50cy9maWxlcy9maWxlLWRyb3Atb3ZlcmxheS5qc3giLCJzcmMvY29tcG9uZW50cy9maWxlcy9maWxlLWRyb3B6b25lLmpzeCIsInNyYy9jb21wb25lbnRzL2ZpbGVzL2luZGV4LmpzeCIsInNyYy9jb21wb25lbnRzL2ZpbGVzL3RhYmxlLmpzeCIsInNyYy9jb21wb25lbnRzL2ZpbGVzL3VwbG9hZHMtbW9kYWwuanN4Iiwic3JjL2NvbXBvbmVudHMvZmlsZXMvdXBsb2Fkcy5qc3giLCJzcmMvY29tcG9uZW50cy9oZWFkZXIuanN4Iiwic3JjL2NvbXBvbmVudHMvaW5mby1wYW5lbC5qc3giLCJzcmMvY29tcG9uZW50cy9wcm9ncmVzcy1iYXIuanN4Iiwic3JjL2NvbXBvbmVudHMvcmVxdWVzdC1zZWN0aW9uLmpzeCIsInNyYy9jb21wb25lbnRzL3NlY3Rpb24uanN4Iiwic3JjL2NvbXBvbmVudHMvc2hhcmUuanN4Iiwic3JjL2NvbXBvbmVudHMvc3lzdGVtL2FkZHJlc3MuanN4Iiwic3JjL2NvbXBvbmVudHMvc3lzdGVtL2FnZW50LmpzeCIsInNyYy9jb21wb25lbnRzL3N5c3RlbS9kZXNjcmlwdGlvbi5qc3giLCJzcmMvY29tcG9uZW50cy9zeXN0ZW0vaGFyZHdhcmUuanN4Iiwic3JjL2NvbXBvbmVudHMvc3lzdGVtL2luZGV4LmpzeCIsInNyYy9jb21wb25lbnRzL3N5c3RlbS9vcy5qc3giLCJzcmMvY29tcG9uZW50cy90ZXJtaW5hbC5qc3giLCJzcmMvY29uc3RhbnRzL2FnZW50LmpzIiwic3JjL2NvbnN0YW50cy9hcHAuanMiLCJzcmMvY29uc3RhbnRzL2F1dGguanMiLCJzcmMvY29uc3RhbnRzL2Rpc3BsYXkuanMiLCJzcmMvY29uc3RhbnRzL2ZpbGVzLmpzIiwic3JjL2NvbnN0YW50cy9pbmRleC5qcyIsInNyYy9jb25zdGFudHMvdGVybWluYWwuanMiLCJzcmMvY29uc3RhbnRzL3dlYnNvY2tldC5qcyIsInNyYy9kaXNwYXRjaGVyL2luZGV4LmpzIiwic3JjL2luZGV4LmpzIiwic3JjL2xpYi9maWxlcy9kaXItaXRlbS5qcyIsInNyYy9saWIvZmlsZXMvZmlsZS1kb3dubG9hZC5qcyIsInNyYy9saWIvZmlsZXMvZmlsZS1pdGVtLmpzIiwic3JjL2xpYi9maWxlcy9maWxlLXVwbG9hZC5qcyIsInNyYy9saWIvZmlsZXMvZmlsZS13b3JrZXIuanMiLCJzcmMvbGliL2ZpbGVzL2ZpbGVzLWRvd25sb2FkLWNvbnRyb2xsZXIuanMiLCJzcmMvbGliL2ZpbGVzL2ZpbGVzLXVwbG9hZC1jb250cm9sbGVyLmpzIiwic3JjL2xpYi9maWxlcy9mcy1pdGVtLmpzIiwic3JjL2xpYi9maWxlcy9wYXRoLWFycmF5LmpzIiwic3JjL2xpYi9maWxlcy9wYXRoLXBhcnNlci5qcyIsInNyYy9saWIvZmlsZXMvdXNlci1maWxlLXJlYWRlci5qcyIsInNyYy9saWIvZmlsZXMvdXNlci1maWxlLmpzIiwic3JjL3Byb2Nlc3Nlcy1tYW5hZ2VyL1Byb2Nlc3MuanMiLCJzcmMvcHJvY2Vzc2VzLW1hbmFnZXIvYWN0aW9ucy9pbmRleC5qcyIsInNyYy9wcm9jZXNzZXMtbWFuYWdlci9jb21wb25lbnRzL2J1dHRvbnMuanN4Iiwic3JjL3Byb2Nlc3Nlcy1tYW5hZ2VyL2NvbXBvbmVudHMvZmlsdGVyLmpzeCIsInNyYy9wcm9jZXNzZXMtbWFuYWdlci9jb21wb25lbnRzL2dyYXBocy5qc3giLCJzcmMvcHJvY2Vzc2VzLW1hbmFnZXIvY29tcG9uZW50cy9pbmRleC5qc3giLCJzcmMvcHJvY2Vzc2VzLW1hbmFnZXIvY29tcG9uZW50cy90YWJsZS5qc3giLCJzcmMvcHJvY2Vzc2VzLW1hbmFnZXIvY29uc3RhbnRzL2luZGV4LmpzIiwic3JjL3Byb2Nlc3Nlcy1tYW5hZ2VyL3N0b3JlL2luZGV4LmpzIiwic3JjL3JlZHVjZXJzL2FnZW50LmpzIiwic3JjL3JlZHVjZXJzL2FwcC5qcyIsInNyYy9yZWR1Y2Vycy9kaXNwbGF5LmpzIiwic3JjL3JlZHVjZXJzL2ZpbGVzLmpzIiwic3JjL3JlZHVjZXJzL2luZGV4LmpzIiwic3JjL3JlZHVjZXJzL3NlY3Rpb25zLmpzIiwic3JjL3JlZHVjZXJzL3Rlcm1pbmFsLmpzIiwic3JjL3Jlc3BvbnNlcy9maWxlcy5qcyIsInNyYy9yZXNwb25zZXMvaW5kZXguanMiLCJzcmMvcmVzcG9uc2VzL3Byb2Nlc3Nlcy5qcyIsInNyYy9yZXNwb25zZXMvc2VydmljZXMuanMiLCJzcmMvcmVzcG9uc2VzL3N5c3RlbS5qcyIsInNyYy9yZXNwb25zZXMvdGVybWluYWwuanMiLCJzcmMvc2VydmljZXMtbWFuYWdlci9TZXJ2aWNlLmpzIiwic3JjL3NlcnZpY2VzLW1hbmFnZXIvYWN0aW9ucy9pbmRleC5qcyIsInNyYy9zZXJ2aWNlcy1tYW5hZ2VyL2NvbXBvbmVudHMvc2VydmljZXMtYnV0dG9ucy9pbmRleC5qc3giLCJzcmMvc2VydmljZXMtbWFuYWdlci9jb21wb25lbnRzL3NlcnZpY2VzLWZpbHRlci9pbmRleC5qc3giLCJzcmMvc2VydmljZXMtbWFuYWdlci9jb21wb25lbnRzL3NlcnZpY2VzLW1haW4vaW5kZXguanN4Iiwic3JjL3NlcnZpY2VzLW1hbmFnZXIvY29tcG9uZW50cy9zZXJ2aWNlcy10YWJsZS9pbmRleC5qc3giLCJzcmMvc2VydmljZXMtbWFuYWdlci9jb25zdGFudHMvaW5kZXguanMiLCJzcmMvc2VydmljZXMtbWFuYWdlci9zdG9yZS9pbmRleC5qcyIsInNyYy9zdG9yZS9jb25maWd1cmUtc3RvcmUuanMiLCJzcmMvdHJhbnNsYXRpb25zL2VuLmpzb24iLCJzcmMvdHJhbnNsYXRpb25zL2VzLmpzb24iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztBQ0FBOzs7O0FBSUE7O0FBRUE7QUFDQTs7QUFFQSxJQUFJLFNBQVM7QUFDVDtBQUNBLG1CQUFnQixvRUFBb0UsS0FBcEUsQ0FBMEUsRUFBMUUsQ0FGUDtBQUdULGVBQWdCLEdBSFA7O0FBS1QsWUFBUSxVQUFVLElBQVYsRUFBZ0I7QUFDcEI7O0FBQ0EsWUFBSSxTQUFTLEVBQWI7QUFDQSxZQUFJLGdCQUFnQixPQUFPLGFBQTNCO0FBQ0EsWUFBSSxTQUFTLEtBQUssTUFBbEI7QUFDQSxZQUFJLFlBQWEsU0FBUyxDQUExQjtBQUNBOztBQUVBLGFBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSyxTQUFTLENB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O0FDREE7QUFDQTs7QUNEQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTs7QUNBQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7O0FDRkE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTs7QUNGQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTs7QUNBQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2oxU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDOUxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3RHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN0T0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDL0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMWRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbDNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzkwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4U0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzk5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6VkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2VkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMvQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2hPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzdGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaGdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNyaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeGNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDMUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUN2R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbmFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDaEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2xKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9GQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdE1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDalpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzdKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM5VkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9IQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdlFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDMU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQzFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDN0dBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDek5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMvVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ROQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1VkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMvTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ROQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDckZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4VkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcFJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN0VUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDeEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcDRCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2K0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDak1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeGhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hjQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6UEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDNTJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDNW5EQTtBQUNBOztBQ0RBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdE9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNVZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9IQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2p0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDblZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7OztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3BDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5S0E7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBOzs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbkhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzV0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNwUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaktBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbDZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMWRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIvKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLiAqL1xuXG4vLyBGcm9tOiBodHRwOi8vaGcubW96aWxsYS5vcmcvbW96aWxsYS1jZW50cmFsL3Jhdy1maWxlL2VjMTA2MzBiMWE1NC9qcy9zcmMvZGV2dG9vbHMvamludC9zdW5zcGlkZXIvc3RyaW5nLWJhc2U2NC5qc1xuXG4vKmpzbGludCB3aGl0ZTogZmFsc2UgKi9cbi8qZ2xvYmFsIGNvbnNvbGUgKi9cblxudmFyIEJhc2U2NCA9IHtcbiAgICAvKiBDb252ZXJ0IGRhdGEgKGFuIGFycmF5IG9mIGludGVnZXJzKSB0byBhIEJhc2U2NCBzdHJpbmcuICovXG4gICAgdG9CYXNlNjRUYWJsZSA6ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPScuc3BsaXQoJycpLFxuICAgIGJhc2U2NFBhZCAgICAgOiAnPScsXG5cbiAgICBlbmNvZGU6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIFwidXNlIHN0cmljdFwiO1xuICAgICAgICB2YXIgcmVzdWx0ID0gJyc7XG4gICAgICAgIHZhciB0b0Jhc2U2NFRhYmxlID0gQmFzZTY0LnRvQmFzZTY0VGFibGU7XG4gICAgICAgIHZhciBsZW5ndGggPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgdmFyIGxlbmd0aHBhZCA9IChsZW5ndGggJSAzKTtcbiAgICAgICAgLy8gQ29udmVydCBldmVyeSB0aHJlZSBieXRlcyB0byA0IGFzY2lpIGNoYXJhY3RlcnMuXG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAobGVuZ3RoIC0gMik7IGkgKz0gMykge1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRvQmFzZTY0VGFibGVbZGF0YVtpXSA+PiAyXTtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0b0Jhc2U2NFRhYmxlWygoZGF0YVtpXSAmIDB4MDMpIDw8IDQpICsgKGRhdGFbaSArIDFdID4+IDQpXTtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0b0Jhc2U2NFRhYmxlWygoZGF0YVtpICsgMV0gJiAweDBmKSA8PCAyKSArIChkYXRhW2kgKyAyXSA+PiA2KV07XG4gICAgICAgICAgICByZXN1bHQgKz0gdG9CYXNlNjRUYWJsZVtkYXRhW2kgKyAyXSAmIDB4M2ZdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udmVydCB0aGUgcmVtYWluaW5nIDEgb3IgMiBieXRlcywgcGFkIG91dCB0byA0IGNoYXJhY3RlcnMuXG4gICAgICAgIHZhciBqID0gMDtcbiAgICAgICAgaWYgKGxlbmd0aHBhZCA9PT0gMikge1xuICAgICAgICAgICAgaiA9IGxlbmd0aCAtIGxlbmd0aHBhZDtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0b0Jhc2U2NFRhYmxlW2RhdGFbal0gPj4gMl07XG4gICAgICAgICAgICByZXN1bHQgKz0gdG9CYXNlNjRUYWJsZVsoKGRhdGFbal0gJiAweDAzKSA8PCA0KSArIChkYXRhW2ogKyAxXSA+PiA0KV07XG4gICAgICAgICAgICByZXN1bHQgKz0gdG9CYXNlNjRUYWJsZVsoZGF0YVtqICsgMV0gJiAweDBmKSA8PCAyXTtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0b0Jhc2U2NFRhYmxlWzY0XTtcbiAgICAgICAgfSBlbHNlIGlmIChsZW5ndGhwYWQgPT09IDEpIHtcbiAgICAgICAgICAgIGogPSBsZW5ndGggLSBsZW5ndGhwYWQ7XG4gICAgICAgICAgICByZXN1bHQgKz0gdG9CYXNlNjRUYWJsZVtkYXRhW2pdID4+IDJdO1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRvQmFzZTY0VGFibGVbKGRhdGFbal0gJiAweDAzKSA8PCA0XTtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0b0Jhc2U2NFRhYmxlWzY0XTtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0b0Jhc2U2NFRhYmxlWzY0XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIC8qIENvbnZlcnQgQmFzZTY0IGRhdGEgdG8gYSBzdHJpbmcgKi9cbiAgICAvKiBqc2hpbnQgLVcwMTMgKi9cbiAgICB0b0JpbmFyeVRhYmxlIDogW1xuICAgICAgICAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSxcbiAgICAgICAgLTEsLTEsLTEsLTEsIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsLTEsXG4gICAgICAgIC0xLC0xLC0xLC0xLCAtMSwtMSwtMSwtMSwgLTEsLTEsLTEsNjIsIC0xLC0xLC0xLDYzLFxuICAgICAgICA1Miw1Myw1NCw1NSwgNTYsNTcsNTgsNTksIDYwLDYxLC0xLC0xLCAtMSwgMCwtMSwtMSxcbiAgICAgICAgLTEsIDAsIDEsIDIsICAzLCA0LCA1LCA2LCAgNywgOCwgOSwxMCwgMTEsMTIsMTMsMTQsXG4gICAgICAgIDE1LDE2LDE3LDE4LCAxOSwyMCwyMSwyMiwgMjMsMjQsMjUsLTEsIC0xLC0xLC0xLC0xLFxuICAgICAgICAtMSwyNiwyNywyOCwgMjksMzAsMzEsMzIsIDMzLDM0LDM1LDM2LCAzNywzOCwzOSw0MCxcbiAgICAgICAgNDEsNDIsNDMsNDQsIDQ1LDQ2LDQ3LDQ4LCA0OSw1MCw1MSwtMSwgLTEsLTEsLTEsLTFcbiAgICBdLFxuICAgIC8qIGpzaGludCArVzAxMyAqL1xuXG4gICAgZGVjb2RlOiBmdW5jdGlvbiAoZGF0YSwgb2Zmc2V0KSB7XG4gICAgICAgIFwidXNlIHN0cmljdFwiO1xuICAgICAgICBvZmZzZXQgPSB0eXBlb2Yob2Zmc2V0KSAhPT0gJ3VuZGVmaW5lZCcgPyBvZmZzZXQgOiAwO1xuICAgICAgICB2YXIgdG9CaW5hcnlUYWJsZSA9IEJhc2U2NC50b0JpbmFyeVRhYmxlO1xuICAgICAgICB2YXIgYmFzZTY0UGFkID0gQmFzZTY0LmJhc2U2NFBhZDtcbiAgICAgICAgdmFyIHJlc3VsdCwgcmVzdWx0X2xlbmd0aDtcbiAgICAgICAgdmFyIGxlZnRiaXRzID0gMDsgLy8gbnVtYmVyIG9mIGJpdHMgZGVjb2RlZCwgYnV0IHlldCB0byBiZSBhcHBlbmRlZFxuICAgICAgICB2YXIgbGVmdGRhdGEgPSAwOyAvLyBiaXRzIGRlY29kZWQsIGJ1dCB5ZXQgdG8gYmUgYXBwZW5kZWRcbiAgICAgICAgdmFyIGRhdGFfbGVuZ3RoID0gZGF0YS5pbmRleE9mKCc9JykgLSBvZmZzZXQ7XG5cbiAgICAgICAgaWYgKGRhdGFfbGVuZ3RoIDwgMCkgeyBkYXRhX2xlbmd0aCA9IGRhdGEubGVuZ3RoIC0gb2Zmc2V0OyB9XG5cbiAgICAgICAgLyogRXZlcnkgZm91ciBjaGFyYWN0ZXJzIGlzIDMgcmVzdWx0aW5nIG51bWJlcnMgKi9cbiAgICAgICAgcmVzdWx0X2xlbmd0aCA9IChkYXRhX2xlbmd0aCA+PiAyKSAqIDMgKyBNYXRoLmZsb29yKChkYXRhX2xlbmd0aCAlIDQpIC8gMS41KTtcbiAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KHJlc3VsdF9sZW5ndGgpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgb25lIGJ5IG9uZS5cbiAgICAgICAgZm9yICh2YXIgaWR4ID0gMCwgaSA9IG9mZnNldDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBjID0gdG9CaW5hcnlUYWJsZVtkYXRhLmNoYXJDb2RlQXQoaSkgJiAweDdmXTtcbiAgICAgICAgICAgIHZhciBwYWRkaW5nID0gKGRhdGEuY2hhckF0KGkpID09PSBiYXNlNjRQYWQpO1xuICAgICAgICAgICAgLy8gU2tpcCBpbGxlZ2FsIGNoYXJhY3RlcnMgYW5kIHdoaXRlc3BhY2VcbiAgICAgICAgICAgIGlmIChjID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJJbGxlZ2FsIGNoYXJhY3RlciBjb2RlIFwiICsgZGF0YS5jaGFyQ29kZUF0KGkpICsgXCIgYXQgcG9zaXRpb24gXCIgKyBpKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ29sbGVjdCBkYXRhIGludG8gbGVmdGRhdGEsIHVwZGF0ZSBiaXRjb3VudFxuICAgICAgICAgICAgbGVmdGRhdGEgPSAobGVmdGRhdGEgPDwgNikgfCBjO1xuICAgICAgICAgICAgbGVmdGJpdHMgKz0gNjtcblxuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSA4IG9yIG1vcmUgYml0cywgYXBwZW5kIDggYml0cyB0byB0aGUgcmVzdWx0XG4gICAgICAgICAgICBpZiAobGVmdGJpdHMgPj0gOCkge1xuICAgICAgICAgICAgICAgIGxlZnRiaXRzIC09IDg7XG4gICAgICAgICAgICAgICAgLy8gQXBwZW5kIGlmIG5vdCBwYWRkaW5nLlxuICAgICAgICAgICAgICAgIGlmICghcGFkZGluZykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRbaWR4KytdID0gKGxlZnRkYXRhID4+IGxlZnRiaXRzKSAmIDB4ZmY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxlZnRkYXRhICY9ICgxIDw8IGxlZnRiaXRzKSAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGVyZSBhcmUgYW55IGJpdHMgbGVmdCwgdGhlIGJhc2U2NCBzdHJpbmcgd2FzIGNvcnJ1cHRlZFxuICAgICAgICBpZiAobGVmdGJpdHMpIHtcbiAgICAgICAgICAgIGVyciA9IG5ldyBFcnJvcignQ29ycnVwdGVkIGJhc2U2NCBzdHJpbmcnKTtcbiAgICAgICAgICAgIGVyci5uYW1lID0gJ0Jhc2U2NC1FcnJvcic7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn07IC8qIEVuZCBvZiBCYXNlNjQgbmFtZXNwYWNlICovXG5cbmV4cG9ydCBkZWZhdWx0IEJhc2U2NDtcbiIsIi8qXG4gKiBQb3J0ZWQgZnJvbSBGbGFzaGxpZ2h0IFZOQyBBY3Rpb25TY3JpcHQgaW1wbGVtZW50YXRpb246XG4gKiAgICAgaHR0cDovL3d3dy53aXpoZWxwLmNvbS9mbGFzaGxpZ2h0LXZuYy9cbiAqXG4gKiBGdWxsIGF0dHJpYnV0aW9uIGZvbGxvd3M6XG4gKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICpcbiAqIFRoaXMgREVTIGNsYXNzIGhhcyBiZWVuIGV4dHJhY3RlZCBmcm9tIHBhY2thZ2UgQWNtZS5DcnlwdG8gZm9yIHVzZSBpbiBWTkMuXG4gKiBUaGUgdW5uZWNlc3Nhcnkgb2RkIHBhcml0eSBjb2RlIGhhcyBiZWVuIHJlbW92ZWQuXG4gKlxuICogVGhlc2UgY2hhbmdlcyBhcmU6XG4gKiAgQ29weXJpZ2h0IChDKSAxOTk5IEFUJlQgTGFib3JhdG9yaWVzIENhbWJyaWRnZS4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS5cbiAqXG5cbiAqIERlc0NpcGhlciAtIHRoZSBERVMgZW5jcnlwdGlvbiBtZXRob2RcbiAqXG4gKiBUaGUgbWVhdCBvZiB0aGlzIGNvZGUgaXMgYnkgRGF2ZSBaaW1tZXJtYW4gPGR6aW1tQHdpZGdldC5jb20+LCBhbmQgaXM6XG4gKlxuICogQ29weXJpZ2h0IChjKSAxOTk2IFdpZGdldCBXb3Jrc2hvcCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmVcbiAqIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgTk9OLUNPTU1FUkNJQUwgb3IgQ09NTUVSQ0lBTCBwdXJwb3NlcyBhbmRcbiAqIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgY29weXJpZ2h0IG5vdGljZSBpcyBrZXB0XG4gKiBpbnRhY3QuXG4gKlxuICogV0lER0VUIFdPUktTSE9QIE1BS0VTIE5PIFJFUFJFU0VOVEFUSU9OUyBPUiBXQVJSQU5USUVTIEFCT1VUIFRIRSBTVUlUQUJJTElUWVxuICogT0YgVEhFIFNPRlRXQVJFLCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEXG4gKiBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQVxuICogUEFSVElDVUxBUiBQVVJQT1NFLCBPUiBOT04tSU5GUklOR0VNRU5ULiBXSURHRVQgV09SS1NIT1AgU0hBTEwgTk9UIEJFIExJQUJMRVxuICogRk9SIEFOWSBEQU1BR0VTIFNVRkZFUkVEIEJZIExJQ0VOU0VFIEFTIEEgUkVTVUxUIE9GIFVTSU5HLCBNT0RJRllJTkcgT1JcbiAqIERJU1RSSUJVVElORyBUSElTIFNPRlRXQVJFIE9SIElUUyBERVJJVkFUSVZFUy5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIE5PVCBERVNJR05FRCBPUiBJTlRFTkRFRCBGT1IgVVNFIE9SIFJFU0FMRSBBUyBPTi1MSU5FXG4gKiBDT05UUk9MIEVRVUlQTUVOVCBJTiBIQVpBUkRPVVMgRU5WSVJPTk1FTlRTIFJFUVVJUklORyBGQUlMLVNBRkVcbiAqIFBFUkZPUk1BTkNFLCBTVUNIIEFTIElOIFRIRSBPUEVSQVRJT04gT0YgTlVDTEVBUiBGQUNJTElUSUVTLCBBSVJDUkFGVFxuICogTkFWSUdBVElPTiBPUiBDT01NVU5JQ0FUSU9OIFNZU1RFTVMsIEFJUiBUUkFGRklDIENPTlRST0wsIERJUkVDVCBMSUZFXG4gKiBTVVBQT1JUIE1BQ0hJTkVTLCBPUiBXRUFQT05TIFNZU1RFTVMsIElOIFdISUNIIFRIRSBGQUlMVVJFIE9GIFRIRVxuICogU09GVFdBUkUgQ09VTEQgTEVBRCBESVJFQ1RMWSBUTyBERUFUSCwgUEVSU09OQUwgSU5KVVJZLCBPUiBTRVZFUkVcbiAqIFBIWVNJQ0FMIE9SIEVOVklST05NRU5UQUwgREFNQUdFIChcIkhJR0ggUklTSyBBQ1RJVklUSUVTXCIpLiAgV0lER0VUIFdPUktTSE9QXG4gKiBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVFkgT0YgRklUTkVTUyBGT1JcbiAqIEhJR0ggUklTSyBBQ1RJVklUSUVTLlxuICpcbiAqXG4gKiBUaGUgcmVzdCBpczpcbiAqXG4gKiBDb3B5cmlnaHQgKEMpIDE5OTYgYnkgSmVmIFBvc2thbnplciA8amVmQGFjbWUuY29tPi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnNcbiAqIGFyZSBtZXQ6XG4gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGVcbiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORFxuICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFXG4gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRVxuICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEVcbiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMXG4gKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EU1xuICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pXG4gKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVFxuICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWVxuICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRlxuICogU1VDSCBEQU1BR0UuXG4gKlxuICogVmlzaXQgdGhlIEFDTUUgTGFicyBKYXZhIHBhZ2UgZm9yIHVwLXRvLWRhdGUgdmVyc2lvbnMgb2YgdGhpcyBhbmQgb3RoZXJcbiAqIGZpbmUgSmF2YSB1dGlsaXRpZXM6IGh0dHA6Ly93d3cuYWNtZS5jb20vamF2YS9cbiAqL1xuXG4vKiBqc2xpbnQgd2hpdGU6IGZhbHNlICovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERFUyhwYXNzd2QpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIC8vIFRhYmxlcywgcGVybXV0YXRpb25zLCBTLWJveGVzLCBldGMuXG4gICAgLy8ganNoaW50IC1XMDEzXG4gICAgdmFyIFBDMiA9IFsxMywxNiwxMCwyMywgMCwgNCwgMiwyNywxNCwgNSwyMCwgOSwyMiwxOCwxMSwgMyxcbiAgICAgICAgICAgICAgIDI1LCA3LDE1LCA2LDI2LDE5LDEyLCAxLDQwLDUxLDMwLDM2LDQ2LDU0LDI5LDM5LFxuICAgICAgICAgICAgICAgNTAsNDQsMzIsNDcsNDMsNDgsMzgsNTUsMzMsNTIsNDUsNDEsNDksMzUsMjgsMzEgXSxcbiAgICAgICAgdG90cm90ID0gWyAxLCAyLCA0LCA2LCA4LDEwLDEyLDE0LDE1LDE3LDE5LDIxLDIzLDI1LDI3LDI4XSxcbiAgICAgICAgeiA9IDB4MCwgYSxiLGMsZCxlLGYsIFNQMSxTUDIsU1AzLFNQNCxTUDUsU1A2LFNQNyxTUDgsXG4gICAgICAgIGtleXMgPSBbXTtcblxuICAgIC8vIGpzaGludCAtVzAxNVxuICAgIGE9MTw8MTY7IGI9MTw8MjQ7IGM9YXxiOyBkPTE8PDI7IGU9MTw8MTA7IGY9ZHxlO1xuICAgIFNQMSA9IFtjfGUsenx6LGF8eixjfGYsY3xkLGF8Zix6fGQsYXx6LHp8ZSxjfGUsY3xmLHp8ZSxifGYsY3xkLGJ8eix6fGQsXG4gICAgICAgICAgIHp8ZixifGUsYnxlLGF8ZSxhfGUsY3x6LGN8eixifGYsYXxkLGJ8ZCxifGQsYXxkLHp8eix6fGYsYXxmLGJ8eixcbiAgICAgICAgICAgYXx6LGN8Zix6fGQsY3x6LGN8ZSxifHosYnx6LHp8ZSxjfGQsYXx6LGF8ZSxifGQsenxlLHp8ZCxifGYsYXxmLFxuICAgICAgICAgICBjfGYsYXxkLGN8eixifGYsYnxkLHp8ZixhfGYsY3xlLHp8ZixifGUsYnxlLHp8eixhfGQsYXxlLHp8eixjfGRdO1xuICAgIGE9MTw8MjA7IGI9MTw8MzE7IGM9YXxiOyBkPTE8PDU7IGU9MTw8MTU7IGY9ZHxlO1xuICAgIFNQMiA9IFtjfGYsYnxlLHp8ZSxhfGYsYXx6LHp8ZCxjfGQsYnxmLGJ8ZCxjfGYsY3xlLGJ8eixifGUsYXx6LHp8ZCxjfGQsXG4gICAgICAgICAgIGF8ZSxhfGQsYnxmLHp8eixifHosenxlLGF8ZixjfHosYXxkLGJ8ZCx6fHosYXxlLHp8ZixjfGUsY3x6LHp8ZixcbiAgICAgICAgICAgenx6LGF8ZixjfGQsYXx6LGJ8ZixjfHosY3xlLHp8ZSxjfHosYnxlLHp8ZCxjfGYsYXxmLHp8ZCx6fGUsYnx6LFxuICAgICAgICAgICB6fGYsY3xlLGF8eixifGQsYXxkLGJ8ZixifGQsYXxkLGF8ZSx6fHosYnxlLHp8ZixifHosY3xkLGN8ZixhfGVdO1xuICAgIGE9MTw8MTc7IGI9MTw8Mjc7IGM9YXxiOyBkPTE8PDM7IGU9MTw8OTsgZj1kfGU7XG4gICAgU1AzID0gW3p8ZixjfGUsenx6LGN8ZCxifGUsenx6LGF8ZixifGUsYXxkLGJ8ZCxifGQsYXx6LGN8ZixhfGQsY3x6LHp8ZixcbiAgICAgICAgICAgYnx6LHp8ZCxjfGUsenxlLGF8ZSxjfHosY3xkLGF8ZixifGYsYXxlLGF8eixifGYsenxkLGN8Zix6fGUsYnx6LFxuICAgICAgICAgICBjfGUsYnx6LGF8ZCx6fGYsYXx6LGN8ZSxifGUsenx6LHp8ZSxhfGQsY3xmLGJ8ZSxifGQsenxlLHp8eixjfGQsXG4gICAgICAgICAgIGJ8ZixhfHosYnx6LGN8Zix6fGQsYXxmLGF8ZSxifGQsY3x6LGJ8Zix6fGYsY3x6LGF8Zix6fGQsY3xkLGF8ZV07XG4gICAgYT0xPDwxMzsgYj0xPDwyMzsgYz1hfGI7IGQ9MTw8MDsgZT0xPDw3OyBmPWR8ZTtcbiAgICBTUDQgPSBbY3xkLGF8ZixhfGYsenxlLGN8ZSxifGYsYnxkLGF8ZCx6fHosY3x6LGN8eixjfGYsenxmLHp8eixifGUsYnxkLFxuICAgICAgICAgICB6fGQsYXx6LGJ8eixjfGQsenxlLGJ8eixhfGQsYXxlLGJ8Zix6fGQsYXxlLGJ8ZSxhfHosY3xlLGN8Zix6fGYsXG4gICAgICAgICAgIGJ8ZSxifGQsY3x6LGN8Zix6fGYsenx6LHp8eixjfHosYXxlLGJ8ZSxifGYsenxkLGN8ZCxhfGYsYXxmLHp8ZSxcbiAgICAgICAgICAgY3xmLHp8Zix6fGQsYXx6LGJ8ZCxhfGQsY3xlLGJ8ZixhfGQsYXxlLGJ8eixjfGQsenxlLGJ8eixhfHosY3xlXTtcbiAgICBhPTE8PDI1OyBiPTE8PDMwOyBjPWF8YjsgZD0xPDw4OyBlPTE8PDE5OyBmPWR8ZTtcbiAgICBTUDUgPSBbenxkLGF8ZixhfGUsY3xkLHp8ZSx6fGQsYnx6LGF8ZSxifGYsenxlLGF8ZCxifGYsY3xkLGN8ZSx6fGYsYnx6LFxuICAgICAgICAgICBhfHosYnxlLGJ8ZSx6fHosYnxkLGN8ZixjfGYsYXxkLGN8ZSxifGQsenx6LGN8eixhfGYsYXx6LGN8eix6fGYsXG4gICAgICAgICAgIHp8ZSxjfGQsenxkLGF8eixifHosYXxlLGN8ZCxifGYsYXxkLGJ8eixjfGUsYXxmLGJ8Zix6fGQsYXx6LGN8ZSxcbiAgICAgICAgICAgY3xmLHp8ZixjfHosY3xmLGF8ZSx6fHosYnxlLGN8eix6fGYsYXxkLGJ8ZCx6fGUsenx6LGJ8ZSxhfGYsYnxkXTtcbiAgICBhPTE8PDIyOyBiPTE8PDI5OyBjPWF8YjsgZD0xPDw0OyBlPTE8PDE0OyBmPWR8ZTtcbiAgICBTUDYgPSBbYnxkLGN8eix6fGUsY3xmLGN8eix6fGQsY3xmLGF8eixifGUsYXxmLGF8eixifGQsYXxkLGJ8ZSxifHosenxmLFxuICAgICAgICAgICB6fHosYXxkLGJ8Zix6fGUsYXxlLGJ8Zix6fGQsY3xkLGN8ZCx6fHosYXxmLGN8ZSx6fGYsYXxlLGN8ZSxifHosXG4gICAgICAgICAgIGJ8ZSx6fGQsY3xkLGF8ZSxjfGYsYXx6LHp8ZixifGQsYXx6LGJ8ZSxifHosenxmLGJ8ZCxjfGYsYXxlLGN8eixcbiAgICAgICAgICAgYXxmLGN8ZSx6fHosY3xkLHp8ZCx6fGUsY3x6LGF8Zix6fGUsYXxkLGJ8Zix6fHosY3xlLGJ8eixhfGQsYnxmXTtcbiAgICBhPTE8PDIxOyBiPTE8PDI2OyBjPWF8YjsgZD0xPDwxOyBlPTE8PDExOyBmPWR8ZTtcbiAgICBTUDcgPSBbYXx6LGN8ZCxifGYsenx6LHp8ZSxifGYsYXxmLGN8ZSxjfGYsYXx6LHp8eixifGQsenxkLGJ8eixjfGQsenxmLFxuICAgICAgICAgICBifGUsYXxmLGF8ZCxifGUsYnxkLGN8eixjfGUsYXxkLGN8eix6fGUsenxmLGN8ZixhfGUsenxkLGJ8eixhfGUsXG4gICAgICAgICAgIGJ8eixhfGUsYXx6LGJ8ZixifGYsY3xkLGN8ZCx6fGQsYXxkLGJ8eixifGUsYXx6LGN8ZSx6fGYsYXxmLGN8ZSxcbiAgICAgICAgICAgenxmLGJ8ZCxjfGYsY3x6LGF8ZSx6fHosenxkLGN8Zix6fHosYXxmLGN8eix6fGUsYnxkLGJ8ZSx6fGUsYXxkXTtcbiAgICBhPTE8PDE4OyBiPTE8PDI4OyBjPWF8YjsgZD0xPDw2OyBlPTE8PDEyOyBmPWR8ZTtcbiAgICBTUDggPSBbYnxmLHp8ZSxhfHosY3xmLGJ8eixifGYsenxkLGJ8eixhfGQsY3x6LGN8ZixhfGUsY3xlLGF8Zix6fGUsenxkLFxuICAgICAgICAgICBjfHosYnxkLGJ8ZSx6fGYsYXxlLGF8ZCxjfGQsY3xlLHp8Zix6fHosenx6LGN8ZCxifGQsYnxlLGF8ZixhfHosXG4gICAgICAgICAgIGF8ZixhfHosY3xlLHp8ZSx6fGQsY3xkLHp8ZSxhfGYsYnxlLHp8ZCxifGQsY3x6LGN8ZCxifHosYXx6LGJ8ZixcbiAgICAgICAgICAgenx6LGN8ZixhfGQsYnxkLGN8eixifGUsYnxmLHp8eixjfGYsYXxlLGF8ZSx6fGYsenxmLGF8ZCxifHosY3xlXTtcbiAgICAvLyBqc2hpbnQgK1cwMTMsK1cwMTVcblxuICAgIC8vIFNldCB0aGUga2V5LlxuICAgIGZ1bmN0aW9uIHNldEtleXMoa2V5QmxvY2spIHtcbiAgICAgICAgdmFyIGksIGosIGwsIG0sIG4sIG8sIHBjMW0gPSBbXSwgcGNyID0gW10sIGtuID0gW10sXG4gICAgICAgICAgICByYXcwLCByYXcxLCByYXdpLCBLbkxpO1xuXG4gICAgICAgIGZvciAoaiA9IDAsIGwgPSA1NjsgaiA8IDU2OyArK2osIGwgLT0gOCkge1xuICAgICAgICAgICAgbCArPSBsIDwgLTUgPyA2NSA6IGwgPCAtMyA/IDMxIDogbCA8IC0xID8gNjMgOiBsID09PSAyNyA/IDM1IDogMDsgLy8gUEMxXG4gICAgICAgICAgICBtID0gbCAmIDB4NztcbiAgICAgICAgICAgIHBjMW1bal0gPSAoKGtleUJsb2NrW2wgPj4+IDNdICYgKDE8PG0pKSAhPT0gMCkgPyAxOiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgICAgICAgIG0gPSBpIDw8IDE7XG4gICAgICAgICAgICBuID0gbSArIDE7XG4gICAgICAgICAgICBrblttXSA9IGtuW25dID0gMDtcbiAgICAgICAgICAgIGZvciAobyA9IDI4OyBvIDwgNTk7IG8gKz0gMjgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGogPSBvIC0gMjg7IGogPCBvOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgbCA9IGogKyB0b3Ryb3RbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsIDwgbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGNyW2pdID0gcGMxbVtsXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBjcltqXSA9IHBjMW1bbCAtIDI4XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyNDsgKytqKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBjcltQQzJbal1dICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGtuW21dIHw9IDEgPDwgKDIzIC0gaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChwY3JbUEMyW2ogKyAyNF1dICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGtuW25dIHw9IDEgPDwgKDIzIC0gaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29va2V5XG4gICAgICAgIGZvciAoaSA9IDAsIHJhd2kgPSAwLCBLbkxpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgICAgICAgIHJhdzAgPSBrbltyYXdpKytdO1xuICAgICAgICAgICAgcmF3MSA9IGtuW3Jhd2krK107XG4gICAgICAgICAgICBrZXlzW0tuTGldID0gKHJhdzAgJiAweDAwZmMwMDAwKSA8PCA2O1xuICAgICAgICAgICAga2V5c1tLbkxpXSB8PSAocmF3MCAmIDB4MDAwMDBmYzApIDw8IDEwO1xuICAgICAgICAgICAga2V5c1tLbkxpXSB8PSAocmF3MSAmIDB4MDBmYzAwMDApID4+PiAxMDtcbiAgICAgICAgICAgIGtleXNbS25MaV0gfD0gKHJhdzEgJiAweDAwMDAwZmMwKSA+Pj4gNjtcbiAgICAgICAgICAgICsrS25MaTtcbiAgICAgICAgICAgIGtleXNbS25MaV0gPSAocmF3MCAmIDB4MDAwM2YwMDApIDw8IDEyO1xuICAgICAgICAgICAga2V5c1tLbkxpXSB8PSAocmF3MCAmIDB4MDAwMDAwM2YpIDw8IDE2O1xuICAgICAgICAgICAga2V5c1tLbkxpXSB8PSAocmF3MSAmIDB4MDAwM2YwMDApID4+PiA0O1xuICAgICAgICAgICAga2V5c1tLbkxpXSB8PSAocmF3MSAmIDB4MDAwMDAwM2YpO1xuICAgICAgICAgICAgKytLbkxpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW5jcnlwdCA4IGJ5dGVzIG9mIHRleHRcbiAgICBmdW5jdGlvbiBlbmM4KHRleHQpIHtcbiAgICAgICAgdmFyIGkgPSAwLCBiID0gdGV4dC5zbGljZSgpLCBmdmFsLCBrZXlzaSA9IDAsXG4gICAgICAgICAgICBsLCByLCB4OyAvLyBsZWZ0LCByaWdodCwgYWNjdW11bGF0b3JcblxuICAgICAgICAvLyBTcXVhc2ggOCBieXRlcyB0byAyIGludHNcbiAgICAgICAgbCA9IGJbaSsrXTw8MjQgfCBiW2krK108PDE2IHwgYltpKytdPDw4IHwgYltpKytdO1xuICAgICAgICByID0gYltpKytdPDwyNCB8IGJbaSsrXTw8MTYgfCBiW2krK108PDggfCBiW2krK107XG5cbiAgICAgICAgeCA9ICgobCA+Pj4gNCkgXiByKSAmIDB4MGYwZjBmMGY7XG4gICAgICAgIHIgXj0geDtcbiAgICAgICAgbCBePSAoeCA8PCA0KTtcbiAgICAgICAgeCA9ICgobCA+Pj4gMTYpIF4gcikgJiAweDAwMDBmZmZmO1xuICAgICAgICByIF49IHg7XG4gICAgICAgIGwgXj0gKHggPDwgMTYpO1xuICAgICAgICB4ID0gKChyID4+PiAyKSBeIGwpICYgMHgzMzMzMzMzMztcbiAgICAgICAgbCBePSB4O1xuICAgICAgICByIF49ICh4IDw8IDIpO1xuICAgICAgICB4ID0gKChyID4+PiA4KSBeIGwpICYgMHgwMGZmMDBmZjtcbiAgICAgICAgbCBePSB4O1xuICAgICAgICByIF49ICh4IDw8IDgpO1xuICAgICAgICByID0gKHIgPDwgMSkgfCAoKHIgPj4+IDMxKSAmIDEpO1xuICAgICAgICB4ID0gKGwgXiByKSAmIDB4YWFhYWFhYWE7XG4gICAgICAgIGwgXj0geDtcbiAgICAgICAgciBePSB4O1xuICAgICAgICBsID0gKGwgPDwgMSkgfCAoKGwgPj4+IDMxKSAmIDEpO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHtcbiAgICAgICAgICAgIHggPSAociA8PCAyOCkgfCAociA+Pj4gNCk7XG4gICAgICAgICAgICB4IF49IGtleXNba2V5c2krK107XG4gICAgICAgICAgICBmdmFsID0gIFNQN1t4ICYgMHgzZl07XG4gICAgICAgICAgICBmdmFsIHw9IFNQNVsoeCA+Pj4gOCkgJiAweDNmXTtcbiAgICAgICAgICAgIGZ2YWwgfD0gU1AzWyh4ID4+PiAxNikgJiAweDNmXTtcbiAgICAgICAgICAgIGZ2YWwgfD0gU1AxWyh4ID4+PiAyNCkgJiAweDNmXTtcbiAgICAgICAgICAgIHggPSByIF4ga2V5c1trZXlzaSsrXTtcbiAgICAgICAgICAgIGZ2YWwgfD0gU1A4W3ggJiAweDNmXTtcbiAgICAgICAgICAgIGZ2YWwgfD0gU1A2Wyh4ID4+PiA4KSAmIDB4M2ZdO1xuICAgICAgICAgICAgZnZhbCB8PSBTUDRbKHggPj4+IDE2KSAmIDB4M2ZdO1xuICAgICAgICAgICAgZnZhbCB8PSBTUDJbKHggPj4+IDI0KSAmIDB4M2ZdO1xuICAgICAgICAgICAgbCBePSBmdmFsO1xuICAgICAgICAgICAgeCA9IChsIDw8IDI4KSB8IChsID4+PiA0KTtcbiAgICAgICAgICAgIHggXj0ga2V5c1trZXlzaSsrXTtcbiAgICAgICAgICAgIGZ2YWwgPSAgU1A3W3ggJiAweDNmXTtcbiAgICAgICAgICAgIGZ2YWwgfD0gU1A1Wyh4ID4+PiA4KSAmIDB4M2ZdO1xuICAgICAgICAgICAgZnZhbCB8PSBTUDNbKHggPj4+IDE2KSAmIDB4M2ZdO1xuICAgICAgICAgICAgZnZhbCB8PSBTUDFbKHggPj4+IDI0KSAmIDB4M2ZdO1xuICAgICAgICAgICAgeCA9IGwgXiBrZXlzW2tleXNpKytdO1xuICAgICAgICAgICAgZnZhbCB8PSBTUDhbeCAmIDB4MDAwMDAwM2ZdO1xuICAgICAgICAgICAgZnZhbCB8PSBTUDZbKHggPj4+IDgpICYgMHgzZl07XG4gICAgICAgICAgICBmdmFsIHw9IFNQNFsoeCA+Pj4gMTYpICYgMHgzZl07XG4gICAgICAgICAgICBmdmFsIHw9IFNQMlsoeCA+Pj4gMjQpICYgMHgzZl07XG4gICAgICAgICAgICByIF49IGZ2YWw7XG4gICAgICAgIH1cblxuICAgICAgICByID0gKHIgPDwgMzEpIHwgKHIgPj4+IDEpO1xuICAgICAgICB4ID0gKGwgXiByKSAmIDB4YWFhYWFhYWE7XG4gICAgICAgIGwgXj0geDtcbiAgICAgICAgciBePSB4O1xuICAgICAgICBsID0gKGwgPDwgMzEpIHwgKGwgPj4+IDEpO1xuICAgICAgICB4ID0gKChsID4+PiA4KSBeIHIpICYgMHgwMGZmMDBmZjtcbiAgICAgICAgciBePSB4O1xuICAgICAgICBsIF49ICh4IDw8IDgpO1xuICAgICAgICB4ID0gKChsID4+PiAyKSBeIHIpICYgMHgzMzMzMzMzMztcbiAgICAgICAgciBePSB4O1xuICAgICAgICBsIF49ICh4IDw8IDIpO1xuICAgICAgICB4ID0gKChyID4+PiAxNikgXiBsKSAmIDB4MDAwMGZmZmY7XG4gICAgICAgIGwgXj0geDtcbiAgICAgICAgciBePSAoeCA8PCAxNik7XG4gICAgICAgIHggPSAoKHIgPj4+IDQpIF4gbCkgJiAweDBmMGYwZjBmO1xuICAgICAgICBsIF49IHg7XG4gICAgICAgIHIgXj0gKHggPDwgNCk7XG5cbiAgICAgICAgLy8gU3ByZWFkIGludHMgdG8gYnl0ZXNcbiAgICAgICAgeCA9IFtyLCBsXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykge1xuICAgICAgICAgICAgYltpXSA9ICh4W2k+Pj4yXSA+Pj4gKDggKiAoMyAtIChpICUgNCkpKSkgJSAyNTY7XG4gICAgICAgICAgICBpZiAoYltpXSA8IDApIHsgYltpXSArPSAyNTY7IH0gLy8gdW5zaWduZWRcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYjtcbiAgICB9XG5cbiAgICAvLyBFbmNyeXB0IDE2IGJ5dGVzIG9mIHRleHQgdXNpbmcgcGFzc3dkIGFzIGtleVxuICAgIGZ1bmN0aW9uIGVuY3J5cHQodCkge1xuICAgICAgICByZXR1cm4gZW5jOCh0LnNsaWNlKDAsIDgpKS5jb25jYXQoZW5jOCh0LnNsaWNlKDgsIDE2KSkpO1xuICAgIH1cblxuICAgIHNldEtleXMocGFzc3dkKTsgICAgICAgICAgICAgLy8gU2V0dXAga2V5c1xuICAgIHJldHVybiB7J2VuY3J5cHQnOiBlbmNyeXB0fTsgLy8gUHVibGljIGludGVyZmFjZVxuXG59OyAvLyBmdW5jdGlvbiBERVNcbiIsIi8qXG4gKiBub1ZOQzogSFRNTDUgVk5DIGNsaWVudFxuICogQ29weXJpZ2h0IChDKSAyMDEyIEpvZWwgTWFydGluXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgU2FtdWVsIE1hbm5laGVkIGZvciBDZW5kaW8gQUJcbiAqIExpY2Vuc2VkIHVuZGVyIE1QTCAyLjAgKHNlZSBMSUNFTlNFLnR4dClcbiAqXG4gKiBTZWUgUkVBRE1FLm1kIGZvciB1c2FnZSBhbmQgaW50ZWdyYXRpb24gaW5zdHJ1Y3Rpb25zLlxuICovXG5cbi8qanNsaW50IGJyb3dzZXI6IHRydWUsIHdoaXRlOiBmYWxzZSAqL1xuLypnbG9iYWwgVXRpbCwgQmFzZTY0LCBjaGFuZ2VDdXJzb3IgKi9cblxuaW1wb3J0IFV0aWwgZnJvbSBcIi4vdXRpbFwiO1xuaW1wb3J0IEJhc2U2NCBmcm9tIFwiLi9iYXNlNjRcIjtcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBEaXNwbGF5KGRlZmF1bHRzKSB7XG4gICAgdGhpcy5fZHJhd0N0eCA9IG51bGw7XG4gICAgdGhpcy5fY19mb3JjZUNhbnZhcyA9IGZhbHNlO1xuXG4gICAgdGhpcy5fcmVuZGVyUSA9IFtdOyAgLy8gcXVldWUgZHJhd2luZyBhY3Rpb25zIGZvciBpbi1vZGVyIHJlbmRlcmluZ1xuICAgIHRoaXMuX2ZsdXNoaW5nID0gZmFsc2U7XG5cbiAgICAvLyB0aGUgZnVsbCBmcmFtZSBidWZmZXIgKGxvZ2ljYWwgY2FudmFzKSBzaXplXG4gICAgdGhpcy5fZmJfd2lkdGggPSAwO1xuICAgIHRoaXMuX2ZiX2hlaWdodCA9IDA7XG5cbiAgICAvLyB0aGUgc2l6ZSBsaW1pdCBvZiB0aGUgdmlld3BvcnQgKHN0YXJ0IGRpc2FibGVkKVxuICAgIHRoaXMuX21heFdpZHRoID0gMDtcbiAgICB0aGlzLl9tYXhIZWlnaHQgPSAwO1xuXG4gICAgLy8gdGhlIHZpc2libGUgXCJwaHlzaWNhbCBjYW52YXNcIiB2aWV3cG9ydFxuICAgIHRoaXMuX3ZpZXdwb3J0TG9jID0geyAneCc6IDAsICd5JzogMCwgJ3cnOiAwLCAnaCc6IDAgfTtcbiAgICB0aGlzLl9jbGVhblJlY3QgPSB7ICd4MSc6IDAsICd5MSc6IDAsICd4Mic6IC0xLCAneTInOiAtMSB9O1xuXG4gICAgdGhpcy5fcHJldkRyYXdTdHlsZSA9IFwiXCI7XG4gICAgdGhpcy5fdGlsZSA9IG51bGw7XG4gICAgdGhpcy5fdGlsZTE2eDE2ID0gbnVsbDtcbiAgICB0aGlzLl90aWxlX3ggPSAwO1xuICAgIHRoaXMuX3RpbGVfeSA9IDA7XG5cbiAgICBVdGlsLnNldF9kZWZhdWx0cyh0aGlzLCBkZWZhdWx0cywge1xuICAgICAgICAndHJ1ZV9jb2xvcic6IHRydWUsXG4gICAgICAgICdjb2xvdXJNYXAnOiBbXSxcbiAgICAgICAgJ3NjYWxlJzogMS4wLFxuICAgICAgICAndmlld3BvcnQnOiBmYWxzZSxcbiAgICAgICAgJ3JlbmRlcl9tb2RlJzogJycsXG4gICAgICAgIFwib25GbHVzaFwiOiBmdW5jdGlvbiAoKSB7fSxcbiAgICB9KTtcblxuICAgIFV0aWwuRGVidWcoXCI+PiBEaXNwbGF5LmNvbnN0cnVjdG9yXCIpO1xuXG4gICAgaWYgKCF0aGlzLl90YXJnZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGFyZ2V0IG11c3QgYmUgc2V0XCIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5fdGFyZ2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldCBtdXN0IGJlIGEgRE9NIGVsZW1lbnQnKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3RhcmdldC5nZXRDb250ZXh0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vIGdldENvbnRleHQgbWV0aG9kXCIpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fZHJhd0N0eCkge1xuICAgICAgICB0aGlzLl9kcmF3Q3R4ID0gdGhpcy5fdGFyZ2V0LmdldENvbnRleHQoJzJkJyk7XG4gICAgfVxuXG4gICAgVXRpbC5EZWJ1ZyhcIlVzZXIgQWdlbnQ6IFwiICsgbmF2aWdhdG9yLnVzZXJBZ2VudCk7XG4gICAgaWYgKFV0aWwuRW5naW5lLmdlY2tvKSB7IFV0aWwuRGVidWcoXCJCcm93c2VyOiBnZWNrbyBcIiArIFV0aWwuRW5naW5lLmdlY2tvKTsgfVxuICAgIGlmIChVdGlsLkVuZ2luZS53ZWJraXQpIHsgVXRpbC5EZWJ1ZyhcIkJyb3dzZXI6IHdlYmtpdCBcIiArIFV0aWwuRW5naW5lLndlYmtpdCk7IH1cbiAgICBpZiAoVXRpbC5FbmdpbmUudHJpZGVudCkgeyBVdGlsLkRlYnVnKFwiQnJvd3NlcjogdHJpZGVudCBcIiArIFV0aWwuRW5naW5lLnRyaWRlbnQpOyB9XG4gICAgaWYgKFV0aWwuRW5naW5lLnByZXN0bykgeyBVdGlsLkRlYnVnKFwiQnJvd3NlcjogcHJlc3RvIFwiICsgVXRpbC5FbmdpbmUucHJlc3RvKTsgfVxuXG4gICAgdGhpcy5jbGVhcigpO1xuXG4gICAgLy8gQ2hlY2sgY2FudmFzIGZlYXR1cmVzXG4gICAgaWYgKCdjcmVhdGVJbWFnZURhdGEnIGluIHRoaXMuX2RyYXdDdHgpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyX21vZGUgPSAnY2FudmFzIHJlbmRlcmluZyc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FudmFzIGRvZXMgbm90IHN1cHBvcnQgY3JlYXRlSW1hZ2VEYXRhXCIpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9wcmVmZXJfanMgPT09IG51bGwpIHtcbiAgICAgICAgVXRpbC5JbmZvKFwiUHJlZmVyaW5nIGphdmFzY3JpcHQgb3BlcmF0aW9uc1wiKTtcbiAgICAgICAgdGhpcy5fcHJlZmVyX2pzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmUgYnJvd3NlciBzdXBwb3J0IGZvciBzZXR0aW5nIHRoZSBjdXJzb3IgdmlhIGRhdGEgVVJJIHNjaGVtZVxuICAgIGlmICh0aGlzLl9jdXJzb3JfdXJpIHx8IHRoaXMuX2N1cnNvcl91cmkgPT09IG51bGwgfHxcbiAgICAgICAgICAgIHRoaXMuX2N1cnNvcl91cmkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLl9jdXJzb3JfdXJpID0gVXRpbC5icm93c2VyU3VwcG9ydHNDdXJzb3JVUklzKCk7XG4gICAgfVxuXG4gICAgVXRpbC5EZWJ1ZyhcIjw8IERpc3BsYXkuY29uc3RydWN0b3JcIik7XG59O1xuXG4oZnVuY3Rpb24gKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgdmFyIFNVUFBPUlRTX0lNQUdFREFUQV9DT05TVFJVQ1RPUiA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICAgIG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDQpLCAxLCAxKTtcbiAgICAgICAgU1VQUE9SVFNfSU1BR0VEQVRBX0NPTlNUUlVDVE9SID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAvLyBpZ25vcmUgZmFpbHVyZVxuICAgIH1cblxuXG4gICAgRGlzcGxheS5wcm90b3R5cGUgPSB7XG4gICAgICAgIC8vIFB1YmxpYyBtZXRob2RzXG4gICAgICAgIHZpZXdwb3J0Q2hhbmdlUG9zOiBmdW5jdGlvbiAoZGVsdGFYLCBkZWx0YVkpIHtcbiAgICAgICAgICAgIHZhciB2cCA9IHRoaXMuX3ZpZXdwb3J0TG9jO1xuICAgICAgICAgICAgZGVsdGFYID0gTWF0aC5mbG9vcihkZWx0YVgpO1xuICAgICAgICAgICAgZGVsdGFZID0gTWF0aC5mbG9vcihkZWx0YVkpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3ZpZXdwb3J0KSB7XG4gICAgICAgICAgICAgICAgZGVsdGFYID0gLXZwLnc7ICAvLyBjbGFtcGVkIGxhdGVyIG9mIG91dCBvZiBib3VuZHNcbiAgICAgICAgICAgICAgICBkZWx0YVkgPSAtdnAuaDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHZ4MiA9IHZwLnggKyB2cC53IC0gMTtcbiAgICAgICAgICAgIHZhciB2eTIgPSB2cC55ICsgdnAuaCAtIDE7XG5cbiAgICAgICAgICAgIC8vIFBvc2l0aW9uIGNoYW5nZVxuXG4gICAgICAgICAgICBpZiAoZGVsdGFYIDwgMCAmJiB2cC54ICsgZGVsdGFYIDwgMCkge1xuICAgICAgICAgICAgICAgIGRlbHRhWCA9IC12cC54O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZ4MiArIGRlbHRhWCA+PSB0aGlzLl9mYl93aWR0aCkge1xuICAgICAgICAgICAgICAgIGRlbHRhWCAtPSB2eDIgKyBkZWx0YVggLSB0aGlzLl9mYl93aWR0aCArIDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2cC55ICsgZGVsdGFZIDwgMCkge1xuICAgICAgICAgICAgICAgIGRlbHRhWSA9IC12cC55O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZ5MiArIGRlbHRhWSA+PSB0aGlzLl9mYl9oZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBkZWx0YVkgLT0gKHZ5MiArIGRlbHRhWSAtIHRoaXMuX2ZiX2hlaWdodCArIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGVsdGFYID09PSAwICYmIGRlbHRhWSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFV0aWwuRGVidWcoXCJ2aWV3cG9ydENoYW5nZSBkZWx0YVg6IFwiICsgZGVsdGFYICsgXCIsIGRlbHRhWTogXCIgKyBkZWx0YVkpO1xuXG4gICAgICAgICAgICB2cC54ICs9IGRlbHRhWDtcbiAgICAgICAgICAgIHZ4MiArPSBkZWx0YVg7XG4gICAgICAgICAgICB2cC55ICs9IGRlbHRhWTtcbiAgICAgICAgICAgIHZ5MiArPSBkZWx0YVk7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgY2xlYW4gcmVjdGFuZ2xlXG4gICAgICAgICAgICB2YXIgY3IgPSB0aGlzLl9jbGVhblJlY3Q7XG4gICAgICAgICAgICBpZiAodnAueCA+IGNyLngxKSB7XG4gICAgICAgICAgICAgICAgY3IueDEgPSB2cC54O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZ4MiA8IGNyLngyKSB7XG4gICAgICAgICAgICAgICAgY3IueDIgPSB2eDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodnAueSA+IGNyLnkxKSB7XG4gICAgICAgICAgICAgICAgY3IueTEgPSB2cC55O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZ5MiA8IGNyLnkyKSB7XG4gICAgICAgICAgICAgICAgY3IueTIgPSB2eTI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB4MSwgdztcbiAgICAgICAgICAgIGlmIChkZWx0YVggPCAwKSB7XG4gICAgICAgICAgICAgICAgLy8gU2hpZnQgdmlld3BvcnQgbGVmdCwgcmVkcmF3IGxlZnQgc2VjdGlvblxuICAgICAgICAgICAgICAgIHgxID0gMDtcbiAgICAgICAgICAgICAgICB3ID0gLWRlbHRhWDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU2hpZnQgdmlld3BvcnQgcmlnaHQsIHJlZHJhdyByaWdodCBzZWN0aW9uXG4gICAgICAgICAgICAgICAgeDEgPSB2cC53IC0gZGVsdGFYO1xuICAgICAgICAgICAgICAgIHcgPSBkZWx0YVg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB5MSwgaDtcbiAgICAgICAgICAgIGlmIChkZWx0YVkgPCAwKSB7XG4gICAgICAgICAgICAgICAgLy8gU2hpZnQgdmlld3BvcnQgdXAsIHJlZHJhdyB0b3Agc2VjdGlvblxuICAgICAgICAgICAgICAgIHkxID0gMDtcbiAgICAgICAgICAgICAgICBoID0gLWRlbHRhWTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gU2hpZnQgdmlld3BvcnQgZG93biwgcmVkcmF3IGJvdHRvbSBzZWN0aW9uXG4gICAgICAgICAgICAgICAgeTEgPSB2cC5oIC0gZGVsdGFZO1xuICAgICAgICAgICAgICAgIGggPSBkZWx0YVk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBzYXZlU3R5bGUgPSB0aGlzLl9kcmF3Q3R4LmZpbGxTdHlsZTtcbiAgICAgICAgICAgIHZhciBjYW52YXMgPSB0aGlzLl90YXJnZXQ7XG4gICAgICAgICAgICB0aGlzLl9kcmF3Q3R4LmZpbGxTdHlsZSA9IFwicmdiKDI1NSwyNTUsMjU1KVwiO1xuXG4gICAgICAgICAgICAvLyBEdWUgdG8gdGhpcyBidWcgYW1vbmcgb3RoZXJzIFsxXSB3ZSBuZWVkIHRvIGRpc2FibGUgdGhlIGltYWdlLXNtb290aGluZyB0b1xuICAgICAgICAgICAgLy8gYXZvaWQgZ2V0dGluZyBhIGJsdXIgZWZmZWN0IHdoZW4gcGFubmluZy5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAxLiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTk0NzE5XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBzZXQgdGhlc2UgZXZlcnkgdGltZSBzaW5jZSBhbGwgcHJvcGVydGllcyBhcmUgcmVzZXRcbiAgICAgICAgICAgIC8vIHdoZW4gdGhlIHRoZSBzaXplIGlzIGNoYW5nZWRcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcmF3Q3R4Lm1vekltYWdlU21vb3RoaW5nRW5hYmxlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdDdHgubW96SW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2RyYXdDdHgud2Via2l0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhd0N0eC53ZWJraXRJbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZHJhd0N0eC5tc0ltYWdlU21vb3RoaW5nRW5hYmxlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdDdHgubXNJbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZHJhd0N0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kcmF3Q3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDb3B5IHRoZSB2YWxpZCBwYXJ0IG9mIHRoZSB2aWV3cG9ydCB0byB0aGUgc2hpZnRlZCBsb2NhdGlvblxuICAgICAgICAgICAgdGhpcy5fZHJhd0N0eC5kcmF3SW1hZ2UoY2FudmFzLCAwLCAwLCB2cC53LCB2cC5oLCAtZGVsdGFYLCAtZGVsdGFZLCB2cC53LCB2cC5oKTtcblxuICAgICAgICAgICAgaWYgKGRlbHRhWCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdDdHguZmlsbFJlY3QoeDEsIDAsIHcsIHZwLmgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRlbHRhWSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdDdHguZmlsbFJlY3QoMCwgeTEsIHZwLncsIGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZHJhd0N0eC5maWxsU3R5bGUgPSBzYXZlU3R5bGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdmlld3BvcnRDaGFuZ2VTaXplOiBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Yod2lkdGgpID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZihoZWlnaHQpID09PSBcInVuZGVmaW5lZFwiKSB7XG5cbiAgICAgICAgICAgICAgICBVdGlsLkRlYnVnKFwiU2V0dGluZyB2aWV3cG9ydCB0byBmdWxsIGRpc3BsYXkgcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHdpZHRoID0gdGhpcy5fZmJfd2lkdGg7XG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5fZmJfaGVpZ2h0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdnAgPSB0aGlzLl92aWV3cG9ydExvYztcbiAgICAgICAgICAgIGlmICh2cC53ICE9PSB3aWR0aCB8fCB2cC5oICE9PSBoZWlnaHQpIHtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl92aWV3cG9ydCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWF4V2lkdGggIT09IDAgJiYgd2lkdGggPiB0aGlzLl9tYXhXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSB0aGlzLl9tYXhXaWR0aDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWF4SGVpZ2h0ICE9PSAwICYmIGhlaWdodCA+IHRoaXMuX21heEhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gdGhpcy5fbWF4SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGNyID0gdGhpcy5fY2xlYW5SZWN0O1xuXG4gICAgICAgICAgICAgICAgaWYgKHdpZHRoIDwgdnAudyAmJiAgY3IueDIgPiB2cC54ICsgd2lkdGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNyLngyID0gdnAueCArIHdpZHRoIC0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGhlaWdodCA8IHZwLmggJiYgIGNyLnkyID4gdnAueSArIGhlaWdodCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY3IueTIgPSB2cC55ICsgaGVpZ2h0IC0gMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2cC53ID0gd2lkdGg7XG4gICAgICAgICAgICAgICAgdnAuaCA9IGhlaWdodDtcblxuICAgICAgICAgICAgICAgIHZhciBjYW52YXMgPSB0aGlzLl90YXJnZXQ7XG4gICAgICAgICAgICAgICAgaWYgKGNhbnZhcy53aWR0aCAhPT0gd2lkdGggfHwgY2FudmFzLmhlaWdodCAhPT0gaGVpZ2h0KSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBzYXZlIHRoZSBjYW52YXMgZGF0YSBzaW5jZSBjaGFuZ2luZyB0aGUgc2l6ZSB3aWxsIGNsZWFyIGl0XG4gICAgICAgICAgICAgICAgICAgIHZhciBzYXZlSW1nID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZwLncgPiAwICYmIHZwLmggPiAwICYmIGNhbnZhcy53aWR0aCA+IDAgJiYgY2FudmFzLmhlaWdodCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbWdfd2lkdGggPSBjYW52YXMud2lkdGggPCB2cC53ID8gY2FudmFzLndpZHRoIDogdnAudztcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbWdfaGVpZ2h0ID0gY2FudmFzLmhlaWdodCA8IHZwLmggPyBjYW52YXMuaGVpZ2h0IDogdnAuaDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVJbWcgPSB0aGlzLl9kcmF3Q3R4LmdldEltYWdlRGF0YSgwLCAwLCBpbWdfd2lkdGgsIGltZ19oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbnZhcy53aWR0aCAhPT0gd2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjYW52YXMuaGVpZ2h0ICE9PSBoZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYW52YXMuc3R5bGUuaGVpZ2h0ID0gaGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzYXZlSW1nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kcmF3Q3R4LnB1dEltYWdlRGF0YShzYXZlSW1nLCAwLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvLyBSZXR1cm4gYSBtYXAgb2YgY2xlYW4gYW5kIGRpcnR5IGFyZWFzIG9mIHRoZSB2aWV3cG9ydCBhbmQgcmVzZXQgdGhlXG4gICAgICAgIC8vIHRyYWNraW5nIG9mIGNsZWFuIGFuZCBkaXJ0eSBhcmVhc1xuICAgICAgICAvL1xuICAgICAgICAvLyBSZXR1cm5zOiB7ICdjbGVhbkJveCc6IHsgJ3gnOiB4LCAneSc6IHksICd3JzogdywgJ2gnOiBofSxcbiAgICAgICAgLy8gICAgICAgICAgICAnZGlydHlCb3hlcyc6IFt7ICd4JzogeCwgJ3knOiB5LCAndyc6IHcsICdoJzogaCB9LCAuLi5dIH1cbiAgICAgICAgZ2V0Q2xlYW5EaXJ0eVJlc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdnAgPSB0aGlzLl92aWV3cG9ydExvYztcbiAgICAgICAgICAgIHZhciBjciA9IHRoaXMuX2NsZWFuUmVjdDtcblxuICAgICAgICAgICAgdmFyIGNsZWFuQm94ID0geyAneCc6IGNyLngxLCAneSc6IGNyLnkxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndyc6IGNyLngyIC0gY3IueDEgKyAxLCAnaCc6IGNyLnkyIC0gY3IueTEgKyAxIH07XG5cbiAgICAgICAgICAgIHZhciBkaXJ0eUJveGVzID0gW107XG4gICAgICAgICAgICBpZiAoY3IueDEgPj0gY3IueDIgfHwgY3IueTEgPj0gY3IueTIpIHtcbiAgICAgICAgICAgICAgICAvLyBXaG9sZSB2aWV3cG9ydCBpcyBkaXJ0eVxuICAgICAgICAgICAgICAgIGRpcnR5Qm94ZXMucHVzaCh7ICd4JzogdnAueCwgJ3knOiB2cC55LCAndyc6IHZwLncsICdoJzogdnAuaCB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gUmVkcmF3IGRpcnR5IHJlZ2lvbnNcbiAgICAgICAgICAgICAgICB2YXIgdngyID0gdnAueCArIHZwLncgLSAxO1xuICAgICAgICAgICAgICAgIHZhciB2eTIgPSB2cC55ICsgdnAuaCAtIDE7XG5cbiAgICAgICAgICAgICAgICBpZiAodnAueCA8IGNyLngxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxlZnQgc2lkZSBkaXJ0eSByZWdpb25cbiAgICAgICAgICAgICAgICAgICAgZGlydHlCb3hlcy5wdXNoKHsneCc6IHZwLngsICd5JzogdnAueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndyc6IGNyLngxIC0gdnAueCArIDEsICdoJzogdnAuaH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodngyID4gY3IueDIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHQgc2lkZSBkaXJ0eSByZWdpb25cbiAgICAgICAgICAgICAgICAgICAgZGlydHlCb3hlcy5wdXNoKHsneCc6IGNyLngyICsgMSwgJ3knOiB2cC55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3JzogdngyIC0gY3IueDIsICdoJzogdnAuaH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZih2cC55IDwgY3IueTEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdG9wL21pZGRsZSBkaXJ0eSByZWdpb25cbiAgICAgICAgICAgICAgICAgICAgZGlydHlCb3hlcy5wdXNoKHsneCc6IGNyLngxLCAneSc6IHZwLnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnOiBjci54MiAtIGNyLngxICsgMSwgJ2gnOiBjci55MSAtIHZwLnl9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHZ5MiA+IGNyLnkyKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJvdHRvbS9taWRkbGUgZGlydHkgcmVnaW9uXG4gICAgICAgICAgICAgICAgICAgIGRpcnR5Qm94ZXMucHVzaCh7J3gnOiBjci54MSwgJ3knOiBjci55MiArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3cnOiBjci54MiAtIGNyLngxICsgMSwgJ2gnOiB2eTIgLSBjci55Mn0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fY2xlYW5SZWN0ID0geyd4MSc6IHZwLngsICd5MSc6IHZwLnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3gyJzogdnAueCArIHZwLncgLSAxLCAneTInOiB2cC55ICsgdnAuaCAtIDF9O1xuXG4gICAgICAgICAgICByZXR1cm4geydjbGVhbkJveCc6IGNsZWFuQm94LCAnZGlydHlCb3hlcyc6IGRpcnR5Qm94ZXN9O1xuICAgICAgICB9LFxuXG4gICAgICAgIGFic1g6IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICByZXR1cm4geCArIHRoaXMuX3ZpZXdwb3J0TG9jLng7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYWJzWTogZnVuY3Rpb24gKHkpIHtcbiAgICAgICAgICAgIHJldHVybiB5ICsgdGhpcy5fdmlld3BvcnRMb2MueTtcbiAgICAgICAgfSxcblxuICAgICAgICByZXNpemU6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLl9wcmV2RHJhd1N0eWxlID0gXCJcIjtcblxuICAgICAgICAgICAgdGhpcy5fZmJfd2lkdGggPSB3aWR0aDtcbiAgICAgICAgICAgIHRoaXMuX2ZiX2hlaWdodCA9IGhlaWdodDtcblxuICAgICAgICAgICAgdGhpcy5fcmVzY2FsZSh0aGlzLl9zY2FsZSk7XG5cbiAgICAgICAgICAgIHRoaXMudmlld3BvcnRDaGFuZ2VTaXplKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2xlYXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9sb2dvKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemUodGhpcy5fbG9nby53aWR0aCwgdGhpcy5fbG9nby5oZWlnaHQpO1xuICAgICAgICAgICAgICAgIHRoaXMuYmxpdFN0cmluZ0ltYWdlKHRoaXMuX2xvZ28uZGF0YSwgMCwgMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChVdGlsLkVuZ2luZS50cmlkZW50ID09PSA2KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5CKGRpcmVjdHhtYW4xMik6IHRoZXJlJ3MgYSBidWcgaW4gSUUxMCB3aGVyZSB3ZSBjYW4gZmFpbCB0byBhY3R1YWxseVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBjbGVhciB0aGUgY2FudmFzIGhlcmUgYmVjYXVzZSBvZiB0aGUgcmVzaXplLlxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBDbGVhcmluZyB0aGUgY3VycmVudCB2aWV3cG9ydCBmaXJzdCBmaXhlcyB0aGUgaXNzdWVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZHJhd0N0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5fdmlld3BvcnRMb2MudywgdGhpcy5fdmlld3BvcnRMb2MuaCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplKDI0MCwgMjApO1xuICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdDdHguY2xlYXJSZWN0KDAsIDAsIHRoaXMuX3ZpZXdwb3J0TG9jLncsIHRoaXMuX3ZpZXdwb3J0TG9jLmgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJRID0gW107XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGVuZGluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVuZGVyUS5sZW5ndGggPiAwO1xuICAgICAgICB9LFxuXG4gICAgICAgIGZsdXNoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZW5kZXJRLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uRmx1c2goKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmx1c2hpbmcgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGZpbGxSZWN0OiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgY29sb3IsIGZyb21fcXVldWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZW5kZXJRLmxlbmd0aCAhPT0gMCAmJiAhZnJvbV9xdWV1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlclFfcHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2ZpbGwnLFxuICAgICAgICAgICAgICAgICAgICAneCc6IHgsXG4gICAgICAgICAgICAgICAgICAgICd5JzogeSxcbiAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJzogd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICdoZWlnaHQnOiBoZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICdjb2xvcic6IGNvbG9yXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NldEZpbGxDb2xvcihjb2xvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhd0N0eC5maWxsUmVjdCh4IC0gdGhpcy5fdmlld3BvcnRMb2MueCwgeSAtIHRoaXMuX3ZpZXdwb3J0TG9jLnksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGNvcHlJbWFnZTogZnVuY3Rpb24gKG9sZF94LCBvbGRfeSwgbmV3X3gsIG5ld195LCB3LCBoLCBmcm9tX3F1ZXVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmVuZGVyUS5sZW5ndGggIT09IDAgJiYgIWZyb21fcXVldWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJRX3B1c2goe1xuICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdjb3B5JyxcbiAgICAgICAgICAgICAgICAgICAgJ29sZF94Jzogb2xkX3gsXG4gICAgICAgICAgICAgICAgICAgICdvbGRfeSc6IG9sZF95LFxuICAgICAgICAgICAgICAgICAgICAneCc6IG5ld194LFxuICAgICAgICAgICAgICAgICAgICAneSc6IG5ld195LFxuICAgICAgICAgICAgICAgICAgICAnd2lkdGgnOiB3LFxuICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0JzogaCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIHgxID0gb2xkX3ggLSB0aGlzLl92aWV3cG9ydExvYy54O1xuICAgICAgICAgICAgICAgIHZhciB5MSA9IG9sZF95IC0gdGhpcy5fdmlld3BvcnRMb2MueTtcbiAgICAgICAgICAgICAgICB2YXIgeDIgPSBuZXdfeCAtIHRoaXMuX3ZpZXdwb3J0TG9jLng7XG4gICAgICAgICAgICAgICAgdmFyIHkyID0gbmV3X3kgLSB0aGlzLl92aWV3cG9ydExvYy55O1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fZHJhd0N0eC5kcmF3SW1hZ2UodGhpcy5fdGFyZ2V0LCB4MSwgeTEsIHcsIGgsIHgyLCB5MiwgdywgaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW1hZ2VSZWN0OiBmdW5jdGlvbih4LCB5LCBtaW1lLCBhcnIpIHtcbiAgICAgICAgICAgIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAgICAgICAgICAgIGltZy5zcmMgPSBcImRhdGE6IFwiICsgbWltZSArIFwiO2Jhc2U2NCxcIiArIEJhc2U2NC5lbmNvZGUoYXJyKTtcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlclFfcHVzaCh7XG4gICAgICAgICAgICAgICAgJ3R5cGUnOiAnaW1nJyxcbiAgICAgICAgICAgICAgICAnaW1nJzogaW1nLFxuICAgICAgICAgICAgICAgICd4JzogeCxcbiAgICAgICAgICAgICAgICAneSc6IHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIHN0YXJ0IHVwZGF0aW5nIGEgdGlsZVxuICAgICAgICBzdGFydFRpbGU6IGZ1bmN0aW9uICh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjb2xvcikge1xuICAgICAgICAgICAgdGhpcy5fdGlsZV94ID0geDtcbiAgICAgICAgICAgIHRoaXMuX3RpbGVfeSA9IHk7XG4gICAgICAgICAgICBpZiAod2lkdGggPT09IDE2ICYmIGhlaWdodCA9PT0gMTYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90aWxlID0gdGhpcy5fdGlsZTE2eDE2O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90aWxlID0gdGhpcy5fZHJhd0N0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9wcmVmZXJfanMpIHtcbiAgICAgICAgICAgICAgICB2YXIgYmdyO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cnVlX2NvbG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGJnciA9IGNvbG9yO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJnciA9IHRoaXMuX2NvbG91ck1hcFtjb2xvclswXV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciByZWQgPSBiZ3JbMl07XG4gICAgICAgICAgICAgICAgdmFyIGdyZWVuID0gYmdyWzFdO1xuICAgICAgICAgICAgICAgIHZhciBibHVlID0gYmdyWzBdO1xuXG4gICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl90aWxlLmRhdGE7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3aWR0aCAqIGhlaWdodCAqIDQ7IGkgKz0gNCkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhW2ldID0gcmVkO1xuICAgICAgICAgICAgICAgICAgICBkYXRhW2kgKyAxXSA9IGdyZWVuO1xuICAgICAgICAgICAgICAgICAgICBkYXRhW2kgKyAyXSA9IGJsdWU7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFbaSArIDNdID0gMjU1O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxsUmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBjb2xvciwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gdXBkYXRlIHN1Yi1yZWN0YW5nbGUgb2YgdGhlIGN1cnJlbnQgdGlsZVxuICAgICAgICBzdWJUaWxlOiBmdW5jdGlvbiAoeCwgeSwgdywgaCwgY29sb3IpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9wcmVmZXJfanMpIHtcbiAgICAgICAgICAgICAgICB2YXIgYmdyO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90cnVlX2NvbG9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGJnciA9IGNvbG9yO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGJnciA9IHRoaXMuX2NvbG91ck1hcFtjb2xvclswXV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciByZWQgPSBiZ3JbMl07XG4gICAgICAgICAgICAgICAgdmFyIGdyZWVuID0gYmdyWzFdO1xuICAgICAgICAgICAgICAgIHZhciBibHVlID0gYmdyWzBdO1xuICAgICAgICAgICAgICAgIHZhciB4ZW5kID0geCArIHc7XG4gICAgICAgICAgICAgICAgdmFyIHllbmQgPSB5ICsgaDtcblxuICAgICAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fdGlsZS5kYXRhO1xuICAgICAgICAgICAgICAgIHZhciB3aWR0aCA9IHRoaXMuX3RpbGUud2lkdGg7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IHk7IGogPCB5ZW5kOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IHg7IGkgPCB4ZW5kOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gKGkgKyAoaiAqIHdpZHRoKSkgKiA0O1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtwXSA9IHJlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbcCArIDFdID0gZ3JlZW47XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW3AgKyAyXSA9IGJsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW3AgKyAzXSA9IDI1NTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxsUmVjdCh0aGlzLl90aWxlX3ggKyB4LCB0aGlzLl90aWxlX3kgKyB5LCB3LCBoLCBjb2xvciwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gZHJhdyB0aGUgY3VycmVudCB0aWxlIHRvIHRoZSBzY3JlZW5cbiAgICAgICAgZmluaXNoVGlsZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3ByZWZlcl9qcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdDdHgucHV0SW1hZ2VEYXRhKHRoaXMuX3RpbGUsIHRoaXMuX3RpbGVfeCAtIHRoaXMuX3ZpZXdwb3J0TG9jLngsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGlsZV95IC0gdGhpcy5fdmlld3BvcnRMb2MueSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlbHNlOiBOby1vcCAtLSBhbHJlYWR5IGRvbmUgYnkgc2V0U3ViVGlsZVxuICAgICAgICB9LFxuXG4gICAgICAgIGJsaXRJbWFnZTogZnVuY3Rpb24gKHgsIHksIHdpZHRoLCBoZWlnaHQsIGFyciwgb2Zmc2V0LCBmcm9tX3F1ZXVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmVuZGVyUS5sZW5ndGggIT09IDAgJiYgIWZyb21fcXVldWUpIHtcbiAgICAgICAgICAgICAgICAvLyBOQihkaXJlY3R4bWFuMTIpOiBpdCdzIHRlY2huaWNhbGx5IG1vcmUgcGVyZm9ybWFudCBoZXJlIHRvIHVzZSBwcmVhbGxvY2F0ZWQgYXJyYXlzLFxuICAgICAgICAgICAgICAgIC8vIGJ1dCBpdCdzIGEgbG90IG9mIGV4dHJhIHdvcmsgZm9yIG5vdCBhIGxvdCBvZiBwYXlvZmYgLS0gaWYgd2UncmUgdXNpbmcgdGhlIHJlbmRlciBxdWV1ZSxcbiAgICAgICAgICAgICAgICAvLyB0aGlzIHByb2JhYmx5IGlzbid0IGdldHRpbmcgY2FsbGVkICpuZWFybHkqIGFzIG11Y2hcbiAgICAgICAgICAgICAgICB2YXIgbmV3X2FyciA9IG5ldyBVaW50OEFycmF5KHdpZHRoICogaGVpZ2h0ICogNCk7XG4gICAgICAgICAgICAgICAgbmV3X2Fyci5zZXQobmV3IFVpbnQ4QXJyYXkoYXJyLmJ1ZmZlciwgMCwgbmV3X2Fyci5sZW5ndGgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJRX3B1c2goe1xuICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdibGl0JyxcbiAgICAgICAgICAgICAgICAgICAgJ2RhdGEnOiBuZXdfYXJyLFxuICAgICAgICAgICAgICAgICAgICAneCc6IHgsXG4gICAgICAgICAgICAgICAgICAgICd5JzogeSxcbiAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJzogd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICdoZWlnaHQnOiBoZWlnaHQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3RydWVfY29sb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9iZ3J4SW1hZ2VEYXRhKHgsIHksIHRoaXMuX3ZpZXdwb3J0TG9jLngsIHRoaXMuX3ZpZXdwb3J0TG9jLnksIHdpZHRoLCBoZWlnaHQsIGFyciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY21hcEltYWdlRGF0YSh4LCB5LCB0aGlzLl92aWV3cG9ydExvYy54LCB0aGlzLl92aWV3cG9ydExvYy55LCB3aWR0aCwgaGVpZ2h0LCBhcnIsIG9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgYmxpdFJnYkltYWdlOiBmdW5jdGlvbiAoeCwgeSAsIHdpZHRoLCBoZWlnaHQsIGFyciwgb2Zmc2V0LCBmcm9tX3F1ZXVlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmVuZGVyUS5sZW5ndGggIT09IDAgJiYgIWZyb21fcXVldWUpIHtcbiAgICAgICAgICAgICAgICAvLyBOQihkaXJlY3R4bWFuMTIpOiBpdCdzIHRlY2huaWNhbGx5IG1vcmUgcGVyZm9ybWFudCBoZXJlIHRvIHVzZSBwcmVhbGxvY2F0ZWQgYXJyYXlzLFxuICAgICAgICAgICAgICAgIC8vIGJ1dCBpdCdzIGEgbG90IG9mIGV4dHJhIHdvcmsgZm9yIG5vdCBhIGxvdCBvZiBwYXlvZmYgLS0gaWYgd2UncmUgdXNpbmcgdGhlIHJlbmRlciBxdWV1ZSxcbiAgICAgICAgICAgICAgICAvLyB0aGlzIHByb2JhYmx5IGlzbid0IGdldHRpbmcgY2FsbGVkICpuZWFybHkqIGFzIG11Y2hcbiAgICAgICAgICAgICAgICB2YXIgbmV3X2FyciA9IG5ldyBVaW50OEFycmF5KHdpZHRoICogaGVpZ2h0ICogMyk7XG4gICAgICAgICAgICAgICAgbmV3X2Fyci5zZXQobmV3IFVpbnQ4QXJyYXkoYXJyLmJ1ZmZlciwgMCwgbmV3X2Fyci5sZW5ndGgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJRX3B1c2goe1xuICAgICAgICAgICAgICAgICAgICAndHlwZSc6ICdibGl0UmdiJyxcbiAgICAgICAgICAgICAgICAgICAgJ2RhdGEnOiBuZXdfYXJyLFxuICAgICAgICAgICAgICAgICAgICAneCc6IHgsXG4gICAgICAgICAgICAgICAgICAgICd5JzogeSxcbiAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJzogd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICdoZWlnaHQnOiBoZWlnaHQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3RydWVfY29sb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZ2JJbWFnZURhdGEoeCwgeSwgdGhpcy5fdmlld3BvcnRMb2MueCwgdGhpcy5fdmlld3BvcnRMb2MueSwgd2lkdGgsIGhlaWdodCwgYXJyLCBvZmZzZXQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBwcm9iYWJseSB3cm9uZz9cbiAgICAgICAgICAgICAgICB0aGlzLl9jbWFwSW1hZ2VEYXRhKHgsIHksIHRoaXMuX3ZpZXdwb3J0TG9jLngsIHRoaXMuX3ZpZXdwb3J0TG9jLnksIHdpZHRoLCBoZWlnaHQsIGFyciwgb2Zmc2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBibGl0UmdieEltYWdlOiBmdW5jdGlvbiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgYXJyLCBvZmZzZXQsIGZyb21fcXVldWUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZW5kZXJRLmxlbmd0aCAhPT0gMCAmJiAhZnJvbV9xdWV1ZSkge1xuICAgICAgICAgICAgICAgIC8vIE5CKGRpcmVjdHhtYW4xMik6IGl0J3MgdGVjaG5pY2FsbHkgbW9yZSBwZXJmb3JtYW50IGhlcmUgdG8gdXNlIHByZWFsbG9jYXRlZCBhcnJheXMsXG4gICAgICAgICAgICAgICAgLy8gYnV0IGl0J3MgYSBsb3Qgb2YgZXh0cmEgd29yayBmb3Igbm90IGEgbG90IG9mIHBheW9mZiAtLSBpZiB3ZSdyZSB1c2luZyB0aGUgcmVuZGVyIHF1ZXVlLFxuICAgICAgICAgICAgICAgIC8vIHRoaXMgcHJvYmFibHkgaXNuJ3QgZ2V0dGluZyBjYWxsZWQgKm5lYXJseSogYXMgbXVjaFxuICAgICAgICAgICAgICAgIHZhciBuZXdfYXJyID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWlnaHQgKiA0KTtcbiAgICAgICAgICAgICAgICBuZXdfYXJyLnNldChuZXcgVWludDhBcnJheShhcnIuYnVmZmVyLCAwLCBuZXdfYXJyLmxlbmd0aCkpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlclFfcHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICd0eXBlJzogJ2JsaXRSZ2J4JyxcbiAgICAgICAgICAgICAgICAgICAgJ2RhdGEnOiBuZXdfYXJyLFxuICAgICAgICAgICAgICAgICAgICAneCc6IHgsXG4gICAgICAgICAgICAgICAgICAgICd5JzogeSxcbiAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJzogd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICdoZWlnaHQnOiBoZWlnaHQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3JnYnhJbWFnZURhdGEoeCwgeSwgdGhpcy5fdmlld3BvcnRMb2MueCwgdGhpcy5fdmlld3BvcnRMb2MueSwgd2lkdGgsIGhlaWdodCwgYXJyLCBvZmZzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGJsaXRTdHJpbmdJbWFnZTogZnVuY3Rpb24gKHN0ciwgeCwgeSkge1xuICAgICAgICAgICAgdmFyIGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICAgICAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kcmF3Q3R4LmRyYXdJbWFnZShpbWcsIHggLSB0aGlzLl92aWV3cG9ydExvYy54LCB5IC0gdGhpcy5fdmlld3BvcnRMb2MueSk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcyk7XG4gICAgICAgICAgICBpbWcuc3JjID0gc3RyO1xuICAgICAgICAgICAgcmV0dXJuIGltZzsgLy8gZm9yIGRlYnVnZ2luZyBwdXJwb3Nlc1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIHdyYXAgY3R4LmRyYXdJbWFnZSBidXQgcmVsYXRpdmUgdG8gdmlld3BvcnRcbiAgICAgICAgZHJhd0ltYWdlOiBmdW5jdGlvbiAoaW1nLCB4LCB5KSB7XG4gICAgICAgICAgICB0aGlzLl9kcmF3Q3R4LmRyYXdJbWFnZShpbWcsIHggLSB0aGlzLl92aWV3cG9ydExvYy54LCB5IC0gdGhpcy5fdmlld3BvcnRMb2MueSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2hhbmdlQ3Vyc29yOiBmdW5jdGlvbiAocGl4ZWxzLCBtYXNrLCBob3R4LCBob3R5LCB3LCBoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY3Vyc29yX3VyaSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBVdGlsLldhcm4oXCJjaGFuZ2VDdXJzb3IgY2FsbGVkIGJ1dCBubyBjdXJzb3IgZGF0YSBVUkkgc3VwcG9ydFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl90cnVlX2NvbG9yKSB7XG4gICAgICAgICAgICAgICAgRGlzcGxheS5jaGFuZ2VDdXJzb3IodGhpcy5fdGFyZ2V0LCBwaXhlbHMsIG1hc2ssIGhvdHgsIGhvdHksIHcsIGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBEaXNwbGF5LmNoYW5nZUN1cnNvcih0aGlzLl90YXJnZXQsIHBpeGVscywgbWFzaywgaG90eCwgaG90eSwgdywgaCwgdGhpcy5fY29sb3VyTWFwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBkZWZhdWx0Q3Vyc29yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLl90YXJnZXQuc3R5bGUuY3Vyc29yID0gXCJkZWZhdWx0XCI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGlzYWJsZUxvY2FsQ3Vyc29yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLl90YXJnZXQuc3R5bGUuY3Vyc29yID0gXCJub25lXCI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2xpcHBpbmdEaXNwbGF5OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgdnAgPSB0aGlzLl92aWV3cG9ydExvYztcblxuICAgICAgICAgICAgdmFyIGZiQ2xpcCA9IHRoaXMuX2ZiX3dpZHRoID4gdnAudyB8fCB0aGlzLl9mYl9oZWlnaHQgPiB2cC5oO1xuICAgICAgICAgICAgdmFyIGxpbWl0ZWRWcCA9IHRoaXMuX21heFdpZHRoICE9PSAwICYmIHRoaXMuX21heEhlaWdodCAhPT0gMDtcbiAgICAgICAgICAgIHZhciBjbGlwcGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAobGltaXRlZFZwKSB7XG4gICAgICAgICAgICAgICAgY2xpcHBpbmcgPSB2cC53ID4gdGhpcy5fbWF4V2lkdGggfHwgdnAuaCA+IHRoaXMuX21heEhlaWdodDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZiQ2xpcCB8fCAobGltaXRlZFZwICYmIGNsaXBwaW5nKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBPdmVycmlkZGVuIGdldHRlcnMvc2V0dGVyc1xuICAgICAgICBnZXRfY29udGV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RyYXdDdHg7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0X3NjYWxlOiBmdW5jdGlvbiAoc2NhbGUpIHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc2NhbGUoc2NhbGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldF93aWR0aDogZnVuY3Rpb24gKHcpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZiX3dpZHRoID0gdztcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0X3dpZHRoOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZmJfd2lkdGg7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0X2hlaWdodDogZnVuY3Rpb24gKGgpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZiX2hlaWdodCA9ICBoO1xuICAgICAgICB9LFxuICAgICAgICBnZXRfaGVpZ2h0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZmJfaGVpZ2h0O1xuICAgICAgICB9LFxuXG4gICAgICAgIGF1dG9zY2FsZTogZnVuY3Rpb24gKGNvbnRhaW5lcldpZHRoLCBjb250YWluZXJIZWlnaHQsIGRvd25zY2FsZU9ubHkpIHtcbiAgICAgICAgICAgIHZhciB0YXJnZXRBc3BlY3RSYXRpbyA9IGNvbnRhaW5lcldpZHRoIC8gY29udGFpbmVySGVpZ2h0O1xuICAgICAgICAgICAgdmFyIGZiQXNwZWN0UmF0aW8gPSB0aGlzLl9mYl93aWR0aCAvIHRoaXMuX2ZiX2hlaWdodDtcblxuICAgICAgICAgICAgdmFyIHNjYWxlUmF0aW87XG4gICAgICAgICAgICBpZiAoZmJBc3BlY3RSYXRpbyA+PSB0YXJnZXRBc3BlY3RSYXRpbykge1xuICAgICAgICAgICAgICAgIHNjYWxlUmF0aW8gPSBjb250YWluZXJXaWR0aCAvIHRoaXMuX2ZiX3dpZHRoO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzY2FsZVJhdGlvID0gY29udGFpbmVySGVpZ2h0IC8gdGhpcy5fZmJfaGVpZ2h0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdGFyZ2V0VywgdGFyZ2V0SDtcbiAgICAgICAgICAgIGlmIChzY2FsZVJhdGlvID4gMS4wICYmIGRvd25zY2FsZU9ubHkpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRXID0gdGhpcy5fZmJfd2lkdGg7XG4gICAgICAgICAgICAgICAgdGFyZ2V0SCA9IHRoaXMuX2ZiX2hlaWdodDtcbiAgICAgICAgICAgICAgICBzY2FsZVJhdGlvID0gMS4wO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmYkFzcGVjdFJhdGlvID49IHRhcmdldEFzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0VyA9IGNvbnRhaW5lcldpZHRoO1xuICAgICAgICAgICAgICAgIHRhcmdldEggPSBNYXRoLnJvdW5kKGNvbnRhaW5lcldpZHRoIC8gZmJBc3BlY3RSYXRpbyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldFcgPSBNYXRoLnJvdW5kKGNvbnRhaW5lckhlaWdodCAqIGZiQXNwZWN0UmF0aW8pO1xuICAgICAgICAgICAgICAgIHRhcmdldEggPSBjb250YWluZXJIZWlnaHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE5CKGRpcmVjdHhtYW4xMik6IElmIHlvdSBzZXQgdGhlIHdpZHRoIGRpcmVjdGx5LCBvciBzZXQgdGhlXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBzdHlsZSB3aWR0aCB0byBhIG51bWJlciwgdGhlIGNhbnZhcyBpcyBjbGVhcmVkLlxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgSG93ZXZlciwgaWYgeW91IHNldCB0aGUgc3R5bGUgd2lkdGggdG8gYSBzdHJpbmdcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICgnTk5OcHgnKSwgdGhlIGNhbnZhcyBpcyBzY2FsZWQgd2l0aG91dCBjbGVhcmluZy5cbiAgICAgICAgICAgIHRoaXMuX3RhcmdldC5zdHlsZS53aWR0aCA9IHRhcmdldFcgKyAncHgnO1xuICAgICAgICAgICAgdGhpcy5fdGFyZ2V0LnN0eWxlLmhlaWdodCA9IHRhcmdldEggKyAncHgnO1xuXG4gICAgICAgICAgICB0aGlzLl9zY2FsZSA9IHNjYWxlUmF0aW87XG5cbiAgICAgICAgICAgIHJldHVybiBzY2FsZVJhdGlvOyAgLy8gc28gdGhhdCB0aGUgbW91c2UsIGV0YyBzY2FsZSBjYW4gYmUgc2V0XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gUHJpdmF0ZSBNZXRob2RzXG4gICAgICAgIF9yZXNjYWxlOiBmdW5jdGlvbiAoZmFjdG9yKSB7XG4gICAgICAgICAgICB0aGlzLl9zY2FsZSA9IGZhY3RvcjtcblxuICAgICAgICAgICAgdmFyIHc7XG4gICAgICAgICAgICB2YXIgaDtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX3ZpZXdwb3J0ICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4V2lkdGggIT09IDAgJiYgdGhpcy5fbWF4SGVpZ2h0ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgdyA9IE1hdGgubWluKHRoaXMuX2ZiX3dpZHRoLCB0aGlzLl9tYXhXaWR0aCk7XG4gICAgICAgICAgICAgICAgaCA9IE1hdGgubWluKHRoaXMuX2ZiX2hlaWdodCwgdGhpcy5fbWF4SGVpZ2h0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdyA9IHRoaXMuX2ZiX3dpZHRoO1xuICAgICAgICAgICAgICAgIGggPSB0aGlzLl9mYl9oZWlnaHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3RhcmdldC5zdHlsZS53aWR0aCA9IE1hdGgucm91bmQoZmFjdG9yICogdykgKyAncHgnO1xuICAgICAgICAgICAgdGhpcy5fdGFyZ2V0LnN0eWxlLmhlaWdodCA9IE1hdGgucm91bmQoZmFjdG9yICogaCkgKyAncHgnO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9zZXRGaWxsQ29sb3I6IGZ1bmN0aW9uIChjb2xvcikge1xuICAgICAgICAgICAgdmFyIGJncjtcbiAgICAgICAgICAgIGlmICh0aGlzLl90cnVlX2NvbG9yKSB7XG4gICAgICAgICAgICAgICAgYmdyID0gY29sb3I7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJnciA9IHRoaXMuX2NvbG91ck1hcFtjb2xvcl07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBuZXdTdHlsZSA9ICdyZ2IoJyArIGJnclsyXSArICcsJyArIGJnclsxXSArICcsJyArIGJnclswXSArICcpJztcbiAgICAgICAgICAgIGlmIChuZXdTdHlsZSAhPT0gdGhpcy5fcHJldkRyYXdTdHlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RyYXdDdHguZmlsbFN0eWxlID0gbmV3U3R5bGU7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJldkRyYXdTdHlsZSA9IG5ld1N0eWxlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9yZ2JJbWFnZURhdGE6IGZ1bmN0aW9uICh4LCB5LCB2eCwgdnksIHdpZHRoLCBoZWlnaHQsIGFyciwgb2Zmc2V0KSB7XG4gICAgICAgICAgICB2YXIgaW1nID0gdGhpcy5fZHJhd0N0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IGltZy5kYXRhO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGogPSBvZmZzZXQ7IGkgPCB3aWR0aCAqIGhlaWdodCAqIDQ7IGkgKz0gNCwgaiArPSAzKSB7XG4gICAgICAgICAgICAgICAgZGF0YVtpXSAgICAgPSBhcnJbal07XG4gICAgICAgICAgICAgICAgZGF0YVtpICsgMV0gPSBhcnJbaiArIDFdO1xuICAgICAgICAgICAgICAgIGRhdGFbaSArIDJdID0gYXJyW2ogKyAyXTtcbiAgICAgICAgICAgICAgICBkYXRhW2kgKyAzXSA9IDI1NTsgIC8vIEFscGhhXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9kcmF3Q3R4LnB1dEltYWdlRGF0YShpbWcsIHggLSB2eCwgeSAtIHZ5KTtcbiAgICAgICAgfSxcblxuICAgICAgICBfYmdyeEltYWdlRGF0YTogZnVuY3Rpb24gKHgsIHksIHZ4LCB2eSwgd2lkdGgsIGhlaWdodCwgYXJyLCBvZmZzZXQpIHtcbiAgICAgICAgICAgIHZhciBpbWcgPSB0aGlzLl9kcmF3Q3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICAgIHZhciBkYXRhID0gaW1nLmRhdGE7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IG9mZnNldDsgaSA8IHdpZHRoICogaGVpZ2h0ICogNDsgaSArPSA0LCBqICs9IDQpIHtcbiAgICAgICAgICAgICAgICBkYXRhW2ldICAgICA9IGFycltqICsgMl07XG4gICAgICAgICAgICAgICAgZGF0YVtpICsgMV0gPSBhcnJbaiArIDFdO1xuICAgICAgICAgICAgICAgIGRhdGFbaSArIDJdID0gYXJyW2pdO1xuICAgICAgICAgICAgICAgIGRhdGFbaSArIDNdID0gMjU1OyAgLy8gQWxwaGFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2RyYXdDdHgucHV0SW1hZ2VEYXRhKGltZywgeCAtIHZ4LCB5IC0gdnkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9yZ2J4SW1hZ2VEYXRhOiBmdW5jdGlvbiAoeCwgeSwgdngsIHZ5LCB3aWR0aCwgaGVpZ2h0LCBhcnIsIG9mZnNldCkge1xuICAgICAgICAgICAgLy8gTkIoZGlyZWN0eG1hbjEyKTogYXJyIG11c3QgYmUgYW4gVHlwZSBBcnJheSB2aWV3XG4gICAgICAgICAgICB2YXIgaW1nO1xuICAgICAgICAgICAgaWYgKFNVUFBPUlRTX0lNQUdFREFUQV9DT05TVFJVQ1RPUikge1xuICAgICAgICAgICAgICAgIGltZyA9IG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGFyci5idWZmZXIsIGFyci5ieXRlT2Zmc2V0LCB3aWR0aCAqIGhlaWdodCAqIDQpLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaW1nID0gdGhpcy5fZHJhd0N0eC5jcmVhdGVJbWFnZURhdGEod2lkdGgsIGhlaWdodCk7XG4gICAgICAgICAgICAgICAgaW1nLmRhdGEuc2V0KG5ldyBVaW50OENsYW1wZWRBcnJheShhcnIuYnVmZmVyLCBhcnIuYnl0ZU9mZnNldCwgd2lkdGggKiBoZWlnaHQgKiA0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9kcmF3Q3R4LnB1dEltYWdlRGF0YShpbWcsIHggLSB2eCwgeSAtIHZ5KTtcbiAgICAgICAgfSxcblxuICAgICAgICBfY21hcEltYWdlRGF0YTogZnVuY3Rpb24gKHgsIHksIHZ4LCB2eSwgd2lkdGgsIGhlaWdodCwgYXJyLCBvZmZzZXQpIHtcbiAgICAgICAgICAgIHZhciBpbWcgPSB0aGlzLl9kcmF3Q3R4LmNyZWF0ZUltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgICAgIHZhciBkYXRhID0gaW1nLmRhdGE7XG4gICAgICAgICAgICB2YXIgY21hcCA9IHRoaXMuX2NvbG91ck1hcDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gb2Zmc2V0OyBpIDwgd2lkdGggKiBoZWlnaHQgKiA0OyBpICs9IDQsIGorKykge1xuICAgICAgICAgICAgICAgIHZhciBiZ3IgPSBjbWFwW2FycltqXV07XG4gICAgICAgICAgICAgICAgZGF0YVtpXSAgICAgPSBiZ3JbMl07XG4gICAgICAgICAgICAgICAgZGF0YVtpICsgMV0gPSBiZ3JbMV07XG4gICAgICAgICAgICAgICAgZGF0YVtpICsgMl0gPSBiZ3JbMF07XG4gICAgICAgICAgICAgICAgZGF0YVtpICsgM10gPSAyNTU7ICAvLyBBbHBoYVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fZHJhd0N0eC5wdXRJbWFnZURhdGEoaW1nLCB4IC0gdngsIHkgLSB2eSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX3JlbmRlclFfcHVzaDogZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyUS5wdXNoKGFjdGlvbik7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmVuZGVyUS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGNhbiBiZSByZW5kZXJlZCBpbW1lZGlhdGVseSBpdCB3aWxsIGJlLCBvdGhlcndpc2VcbiAgICAgICAgICAgICAgICAvLyB0aGUgc2Nhbm5lciB3aWxsIHdhaXQgZm9yIHRoZSByZWxldmFudCBldmVudFxuICAgICAgICAgICAgICAgIHRoaXMuX3NjYW5fcmVuZGVyUSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9yZXN1bWVfcmVuZGVyUTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBcInRoaXNcIiBpcyB0aGUgb2JqZWN0IHRoYXQgaXMgcmVhZHksIG5vdCB0aGVcbiAgICAgICAgICAgIC8vIGRpc3BsYXkgb2JqZWN0XG4gICAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0aGlzLl9ub1ZOQ19kaXNwbGF5Ll9yZXN1bWVfcmVuZGVyUSk7XG4gICAgICAgICAgICB0aGlzLl9ub1ZOQ19kaXNwbGF5Ll9zY2FuX3JlbmRlclEoKTtcbiAgICAgICAgfSxcblxuICAgICAgICBfc2Nhbl9yZW5kZXJROiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgcmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgd2hpbGUgKHJlYWR5ICYmIHRoaXMuX3JlbmRlclEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciBhID0gdGhpcy5fcmVuZGVyUVswXTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGEudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdjb3B5JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29weUltYWdlKGEub2xkX3gsIGEub2xkX3ksIGEueCwgYS55LCBhLndpZHRoLCBhLmhlaWdodCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZmlsbCc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGxSZWN0KGEueCwgYS55LCBhLndpZHRoLCBhLmhlaWdodCwgYS5jb2xvciwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYmxpdCc6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJsaXRJbWFnZShhLngsIGEueSwgYS53aWR0aCwgYS5oZWlnaHQsIGEuZGF0YSwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYmxpdFJnYic6XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJsaXRSZ2JJbWFnZShhLngsIGEueSwgYS53aWR0aCwgYS5oZWlnaHQsIGEuZGF0YSwgMCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnYmxpdFJnYngnOlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ibGl0UmdieEltYWdlKGEueCwgYS55LCBhLndpZHRoLCBhLmhlaWdodCwgYS5kYXRhLCAwLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdpbWcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEuaW1nLmNvbXBsZXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3SW1hZ2UoYS5pbWcsIGEueCwgYS55KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5pbWcuX25vVk5DX2Rpc3BsYXkgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaW1nLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCB0aGlzLl9yZXN1bWVfcmVuZGVyUSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB3YWl0IGZvciB0aGlzIGltYWdlIHRvICdsb2FkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGtlZXAgdGhpbmdzIGluLW9yZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZWFkeSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJRLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fcmVuZGVyUS5sZW5ndGggPT09IDAgJiYgdGhpcy5fZmx1c2hpbmcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mbHVzaGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uRmx1c2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgVXRpbC5tYWtlX3Byb3BlcnRpZXMoRGlzcGxheSwgW1xuICAgICAgICBbJ3RhcmdldCcsICd3bycsICdkb20nXSwgICAgICAgLy8gQ2FudmFzIGVsZW1lbnQgZm9yIHJlbmRlcmluZ1xuICAgICAgICBbJ2NvbnRleHQnLCAncm8nLCAncmF3J10sICAgICAgLy8gQ2FudmFzIDJEIGNvbnRleHQgZm9yIHJlbmRlcmluZyAocmVhZC1vbmx5KVxuICAgICAgICBbJ2xvZ28nLCAncncnLCAncmF3J10sICAgICAgICAgLy8gTG9nbyB0byBkaXNwbGF5IHdoZW4gY2xlYXJlZDoge1wid2lkdGhcIjogdywgXCJoZWlnaHRcIjogaCwgXCJkYXRhXCI6IGRhdGF9XG4gICAgICAgIFsndHJ1ZV9jb2xvcicsICdydycsICdib29sJ10sICAvLyBVc2UgdHJ1ZS1jb2xvciBwaXhlbCBkYXRhXG4gICAgICAgIFsnY29sb3VyTWFwJywgJ3J3JywgJ2FyciddLCAgICAvLyBDb2xvdXIgbWFwIGFycmF5ICh3aGVuIG5vdCB0cnVlLWNvbG9yKVxuICAgICAgICBbJ3NjYWxlJywgJ3J3JywgJ2Zsb2F0J10sICAgICAgLy8gRGlzcGxheSBhcmVhIHNjYWxlIGZhY3RvciAwLjAgLSAxLjBcbiAgICAgICAgWyd2aWV3cG9ydCcsICdydycsICdib29sJ10sICAgIC8vIFVzZSB2aWV3cG9ydCBjbGlwcGluZ1xuICAgICAgICBbJ3dpZHRoJywgJ3J3JywgJ2ludCddLCAgICAgICAgLy8gRGlzcGxheSBhcmVhIHdpZHRoXG4gICAgICAgIFsnaGVpZ2h0JywgJ3J3JywgJ2ludCddLCAgICAgICAvLyBEaXNwbGF5IGFyZWEgaGVpZ2h0XG4gICAgICAgIFsnbWF4V2lkdGgnLCAncncnLCAnaW50J10sICAgICAvLyBWaWV3cG9ydCBtYXggd2lkdGggKDAgaWYgZGlzYWJsZWQpXG4gICAgICAgIFsnbWF4SGVpZ2h0JywgJ3J3JywgJ2ludCddLCAgICAvLyBWaWV3cG9ydCBtYXggaGVpZ2h0ICgwIGlmIGRpc2FibGVkKVxuXG4gICAgICAgIFsncmVuZGVyX21vZGUnLCAncm8nLCAnc3RyJ10sICAvLyBDYW52YXMgcmVuZGVyaW5nIG1vZGUgKHJlYWQtb25seSlcblxuICAgICAgICBbJ3ByZWZlcl9qcycsICdydycsICdzdHInXSwgICAgLy8gUHJlZmVyIEphdmFzY3JpcHQgb3ZlciBjYW52YXMgbWV0aG9kc1xuICAgICAgICBbJ2N1cnNvcl91cmknLCAncncnLCAncmF3J10sICAgLy8gQ2FuIHdlIHJlbmRlciBjdXJzb3IgdXNpbmcgZGF0YSBVUklcblxuICAgICAgICBbJ29uRmx1c2gnLCAncncnLCAnZnVuYyddLCAgICAgLy8gb25GbHVzaCgpOiBBIGZsdXNoIHJlcXVlc3QgaGFzIGZpbmlzaGVkXG4gICAgXSk7XG5cbiAgICAvLyBDbGFzcyBNZXRob2RzXG4gICAgRGlzcGxheS5jaGFuZ2VDdXJzb3IgPSBmdW5jdGlvbiAodGFyZ2V0LCBwaXhlbHMsIG1hc2ssIGhvdHgsIGhvdHksIHcwLCBoMCwgY21hcCkge1xuICAgICAgICB2YXIgdyA9IHcwO1xuICAgICAgICB2YXIgaCA9IGgwO1xuICAgICAgICBpZiAoaCA8IHcpIHtcbiAgICAgICAgICAgIGggPSB3OyAgLy8gaW5jcmVhc2UgaCB0byBtYWtlIGl0IHNxdWFyZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdyA9IGg7ICAvLyBpbmNyZWFzZSB3IHRvIG1ha2UgaXQgc3F1YXJlXG4gICAgICAgIH1cblxuICAgICAgICB2YXIgY3VyID0gW107XG5cbiAgICAgICAgLy8gUHVzaCBtdWx0aS1ieXRlIGxpdHRsZS1lbmRpYW4gdmFsdWVzXG4gICAgICAgIGN1ci5wdXNoMTZsZSA9IGZ1bmN0aW9uIChudW0pIHtcbiAgICAgICAgICAgIHRoaXMucHVzaChudW0gJiAweEZGLCAobnVtID4+IDgpICYgMHhGRik7XG4gICAgICAgIH07XG4gICAgICAgIGN1ci5wdXNoMzJsZSA9IGZ1bmN0aW9uIChudW0pIHtcbiAgICAgICAgICAgIHRoaXMucHVzaChudW0gJiAweEZGLFxuICAgICAgICAgICAgICAgICAgICAgIChudW0gPj4gOCkgJiAweEZGLFxuICAgICAgICAgICAgICAgICAgICAgIChudW0gPj4gMTYpICYgMHhGRixcbiAgICAgICAgICAgICAgICAgICAgICAobnVtID4+IDI0KSAmIDB4RkYpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBJSERSc3ogPSA0MDtcbiAgICAgICAgdmFyIFJHQnN6ID0gdyAqIGggKiA0O1xuICAgICAgICB2YXIgWE9Sc3ogPSBNYXRoLmNlaWwoKHcgKiBoKSAvIDguMCk7XG4gICAgICAgIHZhciBBTkRzeiA9IE1hdGguY2VpbCgodyAqIGgpIC8gOC4wKTtcblxuICAgICAgICBjdXIucHVzaDE2bGUoMCk7ICAgICAgICAvLyAwOiBSZXNlcnZlZFxuICAgICAgICBjdXIucHVzaDE2bGUoMik7ICAgICAgICAvLyAyOiAuQ1VSIHR5cGVcbiAgICAgICAgY3VyLnB1c2gxNmxlKDEpOyAgICAgICAgLy8gNDogTnVtYmVyIG9mIGltYWdlcywgMSBmb3Igbm9uLWFuaW1hdGVkIGljb1xuXG4gICAgICAgIC8vIEN1cnNvciAjMSBoZWFkZXIgKElDT05ESVJFTlRSWSlcbiAgICAgICAgY3VyLnB1c2godyk7ICAgICAgICAgICAgLy8gNjogd2lkdGhcbiAgICAgICAgY3VyLnB1c2goaCk7ICAgICAgICAgICAgLy8gNzogaGVpZ2h0XG4gICAgICAgIGN1ci5wdXNoKDApOyAgICAgICAgICAgIC8vIDg6IGNvbG9ycywgMCAtPiB0cnVlLWNvbG9yXG4gICAgICAgIGN1ci5wdXNoKDApOyAgICAgICAgICAgIC8vIDk6IHJlc2VydmVkXG4gICAgICAgIGN1ci5wdXNoMTZsZShob3R4KTsgICAgIC8vIDEwOiBob3RzcG90IHggY29vcmRpbmF0ZVxuICAgICAgICBjdXIucHVzaDE2bGUoaG90eSk7ICAgICAvLyAxMjogaG90c3BvdCB5IGNvb3JkaW5hdGVcbiAgICAgICAgY3VyLnB1c2gzMmxlKElIRFJzeiArIFJHQnN6ICsgWE9Sc3ogKyBBTkRzeik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE0OiBjdXJzb3IgZGF0YSBieXRlIHNpemVcbiAgICAgICAgY3VyLnB1c2gzMmxlKDIyKTsgICAgICAgLy8gMTg6IG9mZnNldCBvZiBjdXJzb3IgZGF0YSBpbiB0aGUgZmlsZVxuXG4gICAgICAgIC8vIEN1cnNvciAjMSBJbmZvSGVhZGVyIChJQ09OSU1BR0UvQklUTUFQSU5GTylcbiAgICAgICAgY3VyLnB1c2gzMmxlKElIRFJzeik7ICAgLy8gMjI6IEluZm9IZWFkZXIgc2l6ZVxuICAgICAgICBjdXIucHVzaDMybGUodyk7ICAgICAgICAvLyAyNjogQ3Vyc29yIHdpZHRoXG4gICAgICAgIGN1ci5wdXNoMzJsZShoICogMik7ICAgIC8vIDMwOiBYT1IrQU5EIGhlaWdodFxuICAgICAgICBjdXIucHVzaDE2bGUoMSk7ICAgICAgICAvLyAzNDogbnVtYmVyIG9mIHBsYW5lc1xuICAgICAgICBjdXIucHVzaDE2bGUoMzIpOyAgICAgICAvLyAzNjogYml0cyBwZXIgcGl4ZWxcbiAgICAgICAgY3VyLnB1c2gzMmxlKDApOyAgICAgICAgLy8gMzg6IFR5cGUgb2YgY29tcHJlc3Npb25cblxuICAgICAgICBjdXIucHVzaDMybGUoWE9Sc3ogKyBBTkRzeik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQyOiBTaXplIG9mIEltYWdlXG4gICAgICAgIGN1ci5wdXNoMzJsZSgwKTsgICAgICAgIC8vIDQ2OiByZXNlcnZlZFxuICAgICAgICBjdXIucHVzaDMybGUoMCk7ICAgICAgICAvLyA1MDogcmVzZXJ2ZWRcbiAgICAgICAgY3VyLnB1c2gzMmxlKDApOyAgICAgICAgLy8gNTQ6IHJlc2VydmVkXG4gICAgICAgIGN1ci5wdXNoMzJsZSgwKTsgICAgICAgIC8vIDU4OiByZXNlcnZlZFxuXG4gICAgICAgIC8vIDYyOiBjb2xvciBkYXRhIChSR0JRVUFEIGljQ29sb3JzW10pXG4gICAgICAgIHZhciB5LCB4O1xuICAgICAgICBmb3IgKHkgPSBoIC0gMTsgeSA+PSAwOyB5LS0pIHtcbiAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHtcbiAgICAgICAgICAgICAgICBpZiAoeCA+PSB3MCB8fCB5ID49IGgwKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1ci5wdXNoKDApOyAgLy8gYmx1ZVxuICAgICAgICAgICAgICAgICAgICBjdXIucHVzaCgwKTsgIC8vIGdyZWVuXG4gICAgICAgICAgICAgICAgICAgIGN1ci5wdXNoKDApOyAgLy8gcmVkXG4gICAgICAgICAgICAgICAgICAgIGN1ci5wdXNoKDApOyAgLy8gYWxwaGFcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0geSAqIE1hdGguY2VpbCh3MCAvIDgpICsgTWF0aC5mbG9vcih4IC8gOCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhbHBoYSA9IChtYXNrW2lkeF0gPDwgKHggJSA4KSkgJiAweDgwID8gMjU1IDogMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNtYXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9ICh3MCAqIHkpICsgeDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZ2IgPSBjbWFwW3BpeGVsc1tpZHhdXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ci5wdXNoKHJnYlsyXSk7ICAvLyBibHVlXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXIucHVzaChyZ2JbMV0pOyAgLy8gZ3JlZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ci5wdXNoKHJnYlswXSk7ICAvLyByZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ci5wdXNoKGFscGhhKTsgICAvLyBhbHBoYVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gKCh3MCAqIHkpICsgeCkgKiA0O1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyLnB1c2gocGl4ZWxzW2lkeCArIDJdKTsgLy8gYmx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyLnB1c2gocGl4ZWxzW2lkeCArIDFdKTsgLy8gZ3JlZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1ci5wdXNoKHBpeGVsc1tpZHhdKTsgICAgIC8vIHJlZFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyLnB1c2goYWxwaGEpOyAgICAgICAgICAgLy8gYWxwaGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFhPUi9iaXRtYXNrIGRhdGEgKEJZVEUgaWNYT1JbXSlcbiAgICAgICAgLy8gKGlnbm9yZWQsIGp1c3QgbmVlZHMgdG8gYmUgdGhlIHJpZ2h0IHNpemUpXG4gICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHtcbiAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBNYXRoLmNlaWwodyAvIDgpOyB4KyspIHtcbiAgICAgICAgICAgICAgICBjdXIucHVzaCgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFORC9iaXRtYXNrIGRhdGEgKEJZVEUgaWNBTkRbXSlcbiAgICAgICAgLy8gKGlnbm9yZWQsIGp1c3QgbmVlZHMgdG8gYmUgdGhlIHJpZ2h0IHNpemUpXG4gICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHtcbiAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBNYXRoLmNlaWwodyAvIDgpOyB4KyspIHtcbiAgICAgICAgICAgICAgICBjdXIucHVzaCgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHZhciB1cmwgPSAnZGF0YTppbWFnZS94LWljb247YmFzZTY0LCcgKyBCYXNlNjQuZW5jb2RlKGN1cik7XG4gICAgICAgIHRhcmdldC5zdHlsZS5jdXJzb3IgPSAndXJsKCcgKyB1cmwgKyAnKScgKyBob3R4ICsgJyAnICsgaG90eSArICcsIGRlZmF1bHQnO1xuICAgIH07XG59KSgpO1xuIiwidmFyIHpsaWIgPSByZXF1aXJlKCdwYWtvL2xpYi96bGliL2luZmxhdGUuanMnKTtcbnZhciBaU3RyZWFtID0gcmVxdWlyZSgncGFrby9saWIvemxpYi96c3RyZWFtLmpzJyk7XG5cbmZ1bmN0aW9uIEluZmxhdGUoKSB7XG4gICAgdGhpcy5zdHJtID0gbmV3IFpTdHJlYW0oKTtcbiAgICB0aGlzLmNodW5rU2l6ZSA9IDEwMjQgKiAxMCAqIDEwO1xuICAgIHRoaXMuc3RybS5vdXRwdXQgPSBuZXcgVWludDhBcnJheSh0aGlzLmNodW5rU2l6ZSk7XG4gICAgdGhpcy53aW5kb3dCaXRzID0gNTtcblxuICAgIHpsaWIuaW5mbGF0ZUluaXQodGhpcy5zdHJtLCB0aGlzLndpbmRvd0JpdHMpO1xufTtcblxuSW5mbGF0ZS5wcm90b3R5cGUgPSB7XG4gICAgaW5mbGF0ZTogZnVuY3Rpb24gKGRhdGEsIGZsdXNoLCBleHBlY3RlZCkge1xuICAgICAgICB0aGlzLnN0cm0uaW5wdXQgPSBkYXRhO1xuICAgICAgICB0aGlzLnN0cm0uYXZhaWxfaW4gPSB0aGlzLnN0cm0uaW5wdXQubGVuZ3RoO1xuICAgICAgICB0aGlzLnN0cm0ubmV4dF9pbiA9IDA7XG4gICAgICAgIHRoaXMuc3RybS5uZXh0X291dCA9IDA7XG5cbiAgICAgICAgLy8gcmVzaXplIG91ciBvdXRwdXQgYnVmZmVyIGlmIGl0J3MgdG9vIHNtYWxsXG4gICAgICAgIC8vICh3ZSBjb3VsZCBqdXN0IHVzZSBtdWx0aXBsZSBjaHVua3MsIGJ1dCB0aGF0IHdvdWxkIGNhdXNlIGFuIGV4dHJhXG4gICAgICAgIC8vIGFsbG9jYXRpb24gZWFjaCB0aW1lIHRvIGZsYXR0ZW4gdGhlIGNodW5rcylcbiAgICAgICAgaWYgKGV4cGVjdGVkID4gdGhpcy5jaHVua1NpemUpIHtcbiAgICAgICAgICAgIHRoaXMuY2h1bmtTaXplID0gZXhwZWN0ZWQ7XG4gICAgICAgICAgICB0aGlzLnN0cm0ub3V0cHV0ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5jaHVua1NpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdHJtLmF2YWlsX291dCA9IHRoaXMuY2h1bmtTaXplO1xuXG4gICAgICAgIHpsaWIuaW5mbGF0ZSh0aGlzLnN0cm0sIGZsdXNoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodGhpcy5zdHJtLm91dHB1dC5idWZmZXIsIDAsIHRoaXMuc3RybS5uZXh0X291dCk7XG4gICAgfSxcblxuICAgIHJlc2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHpsaWIuaW5mbGF0ZVJlc2V0KHRoaXMuc3RybSk7XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7IEluZmxhdGU6IEluZmxhdGUgfTtcbiIsIi8qXG4gKiBub1ZOQzogSFRNTDUgVk5DIGNsaWVudFxuICogQ29weXJpZ2h0IChDKSAyMDEyIEpvZWwgTWFydGluXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTMgU2FtdWVsIE1hbm5laGVkIGZvciBDZW5kaW8gQUJcbiAqIExpY2Vuc2VkIHVuZGVyIE1QTCAyLjAgb3IgYW55IGxhdGVyIHZlcnNpb24gKHNlZSBMSUNFTlNFLnR4dClcbiAqL1xuXG4vKmpzbGludCBicm93c2VyOiB0cnVlLCB3aGl0ZTogZmFsc2UgKi9cbi8qZ2xvYmFsIHdpbmRvdywgVXRpbCAqL1xuXG5pbXBvcnQgVXRpbCBmcm9tIFwiLi4vdXRpbFwiO1xuaW1wb3J0IEtleWJvYXJkVXRpbCBmcm9tIFwiLi91dGlsXCI7XG5cblxuZXhwb3J0IHZhciBLZXlib2FyZDtcblxuKGZ1bmN0aW9uICgpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIC8vXG4gICAgLy8gS2V5Ym9hcmQgZXZlbnQgaGFuZGxlclxuICAgIC8vXG5cbiAgICBLZXlib2FyZCA9IGZ1bmN0aW9uIChkZWZhdWx0cykge1xuICAgICAgICB0aGlzLl9rZXlEb3duTGlzdCA9IFtdOyAgICAgICAgIC8vIExpc3Qgb2YgZGVwcmVzc2VkIGtleXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoZXZlbiBpZiB0aGV5IGFyZSBoYXBweSlcblxuICAgICAgICBVdGlsLnNldF9kZWZhdWx0cyh0aGlzLCBkZWZhdWx0cywge1xuICAgICAgICAgICAgJ3RhcmdldCc6IGRvY3VtZW50LFxuICAgICAgICAgICAgJ2ZvY3VzZWQnOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGNyZWF0ZSB0aGUga2V5Ym9hcmQgaGFuZGxlclxuICAgICAgICB0aGlzLl9oYW5kbGVyID0gbmV3IEtleWJvYXJkVXRpbC5LZXlFdmVudERlY29kZXIoS2V5Ym9hcmRVdGlsLk1vZGlmaWVyU3luYygpLFxuICAgICAgICAgICAgS2V5Ym9hcmRVdGlsLlZlcmlmeUNoYXJNb2RpZmllciggLyoganNoaW50IG5ld2NhcDogZmFsc2UgKi9cbiAgICAgICAgICAgICAgICBLZXlib2FyZFV0aWwuVHJhY2tLZXlTdGF0ZShcbiAgICAgICAgICAgICAgICAgICAgS2V5Ym9hcmRVdGlsLkVzY2FwZU1vZGlmaWVycyh0aGlzLl9oYW5kbGVSZmJFdmVudC5iaW5kKHRoaXMpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgKTsgLyoganNoaW50IG5ld2NhcDogdHJ1ZSAqL1xuXG4gICAgICAgIC8vIGtlZXAgdGhlc2UgaGVyZSBzbyB3ZSBjYW4gcmVmZXIgdG8gdGhlbSBsYXRlclxuICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXJzID0ge1xuICAgICAgICAgICAgJ2tleXVwJzogdGhpcy5faGFuZGxlS2V5VXAuYmluZCh0aGlzKSxcbiAgICAgICAgICAgICdrZXlkb3duJzogdGhpcy5faGFuZGxlS2V5RG93bi5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgJ2tleXByZXNzJzogdGhpcy5faGFuZGxlS2V5UHJlc3MuYmluZCh0aGlzKSxcbiAgICAgICAgICAgICdibHVyJzogdGhpcy5fYWxsS2V5c1VwLmJpbmQodGhpcylcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgS2V5Ym9hcmQucHJvdG90eXBlID0ge1xuICAgICAgICAvLyBwcml2YXRlIG1ldGhvZHNcblxuICAgICAgICBfaGFuZGxlUmZiRXZlbnQ6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fb25LZXlQcmVzcykge1xuICAgICAgICAgICAgICAgIFV0aWwuRGVidWcoXCJvbktleVByZXNzIFwiICsgKGUudHlwZSA9PSAna2V5ZG93bicgPyBcImRvd25cIiA6IFwidXBcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIsIGtleXN5bTogXCIgKyBlLmtleXN5bS5rZXlzeW0gKyBcIihcIiArIGUua2V5c3ltLmtleW5hbWUgKyBcIilcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25LZXlQcmVzcyhlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBzZXRRRU1VVk5DS2V5Ym9hcmRIYW5kbGVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVyID0gbmV3IEtleWJvYXJkVXRpbC5RRU1VS2V5RXZlbnREZWNvZGVyKEtleWJvYXJkVXRpbC5Nb2RpZmllclN5bmMoKSxcbiAgICAgICAgICAgICAgICBLZXlib2FyZFV0aWwuVHJhY2tRRU1VS2V5U3RhdGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZVJmYkV2ZW50LmJpbmQodGhpcylcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9oYW5kbGVLZXlEb3duOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9mb2N1c2VkKSB7IHJldHVybiB0cnVlOyB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9oYW5kbGVyLmtleWRvd24oZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBTdXBwcmVzcyBidWJibGluZy9kZWZhdWx0IGFjdGlvbnNcbiAgICAgICAgICAgICAgICBVdGlsLnN0b3BFdmVudChlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEFsbG93IHRoZSBldmVudCB0byBidWJibGUgYW5kIGJlY29tZSBhIGtleVByZXNzIGV2ZW50IHdoaWNoXG4gICAgICAgICAgICAgICAgLy8gd2lsbCBoYXZlIHRoZSBjaGFyYWN0ZXIgY29kZSB0cmFuc2xhdGVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2hhbmRsZUtleVByZXNzOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9mb2N1c2VkKSB7IHJldHVybiB0cnVlOyB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9oYW5kbGVyLmtleXByZXNzKGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gU3VwcHJlc3MgYnViYmxpbmcvZGVmYXVsdCBhY3Rpb25zXG4gICAgICAgICAgICAgICAgVXRpbC5zdG9wRXZlbnQoZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBbGxvdyB0aGUgZXZlbnQgdG8gYnViYmxlIGFuZCBiZWNvbWUgYSBrZXlQcmVzcyBldmVudCB3aGljaFxuICAgICAgICAgICAgICAgIC8vIHdpbGwgaGF2ZSB0aGUgY2hhcmFjdGVyIGNvZGUgdHJhbnNsYXRlZFxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9oYW5kbGVLZXlVcDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fZm9jdXNlZCkgeyByZXR1cm4gdHJ1ZTsgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5faGFuZGxlci5rZXl1cChlKSkge1xuICAgICAgICAgICAgICAgIC8vIFN1cHByZXNzIGJ1YmJsaW5nL2RlZmF1bHQgYWN0aW9uc1xuICAgICAgICAgICAgICAgIFV0aWwuc3RvcEV2ZW50KGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQWxsb3cgdGhlIGV2ZW50IHRvIGJ1YmJsZSBhbmQgYmVjb21lIGEga2V5UHJlc3MgZXZlbnQgd2hpY2hcbiAgICAgICAgICAgICAgICAvLyB3aWxsIGhhdmUgdGhlIGNoYXJhY3RlciBjb2RlIHRyYW5zbGF0ZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBfYWxsS2V5c1VwOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBVdGlsLkRlYnVnKFwiPj4gS2V5Ym9hcmQuYWxsS2V5c1VwXCIpO1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlci5yZWxlYXNlQWxsKCk7XG4gICAgICAgICAgICBVdGlsLkRlYnVnKFwiPDwgS2V5Ym9hcmQuYWxsS2V5c1VwXCIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIFB1YmxpYyBtZXRob2RzXG5cbiAgICAgICAgZ3JhYjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy9VdGlsLkRlYnVnKFwiPj4gS2V5Ym9hcmQuZ3JhYlwiKTtcbiAgICAgICAgICAgIHZhciBjID0gdGhpcy5fdGFyZ2V0O1xuXG4gICAgICAgICAgICBjLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9ldmVudEhhbmRsZXJzLmtleWRvd24pO1xuICAgICAgICAgICAgYy5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMuX2V2ZW50SGFuZGxlcnMua2V5dXApO1xuICAgICAgICAgICAgYy5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIHRoaXMuX2V2ZW50SGFuZGxlcnMua2V5cHJlc3MpO1xuXG4gICAgICAgICAgICAvLyBSZWxlYXNlIChrZXkgdXApIGlmIHdpbmRvdyBsb3NlcyBmb2N1c1xuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLl9ldmVudEhhbmRsZXJzLmJsdXIpO1xuXG4gICAgICAgICAgICAvL1V0aWwuRGVidWcoXCI8PCBLZXlib2FyZC5ncmFiXCIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVuZ3JhYjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy9VdGlsLkRlYnVnKFwiPj4gS2V5Ym9hcmQudW5ncmFiXCIpO1xuICAgICAgICAgICAgdmFyIGMgPSB0aGlzLl90YXJnZXQ7XG5cbiAgICAgICAgICAgIGMucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2V2ZW50SGFuZGxlcnMua2V5ZG93bik7XG4gICAgICAgICAgICBjLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5fZXZlbnRIYW5kbGVycy5rZXl1cCk7XG4gICAgICAgICAgICBjLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgdGhpcy5fZXZlbnRIYW5kbGVycy5rZXlwcmVzcyk7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMuX2V2ZW50SGFuZGxlcnMuYmx1cik7XG5cbiAgICAgICAgICAgIC8vIFJlbGVhc2UgKGtleSB1cCkgYWxsIGtleXMgdGhhdCBhcmUgaW4gYSBkb3duIHN0YXRlXG4gICAgICAgICAgICB0aGlzLl9hbGxLZXlzVXAoKTtcblxuICAgICAgICAgICAgLy9VdGlsLkRlYnVnKFwiPj4gS2V5Ym9hcmQudW5ncmFiXCIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHN5bmM6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVyLnN5bmNNb2RpZmllcnMoZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgVXRpbC5tYWtlX3Byb3BlcnRpZXMoS2V5Ym9hcmQsIFtcbiAgICAgICAgWyd0YXJnZXQnLCAgICAgJ3dvJywgJ2RvbSddLCAgLy8gRE9NIGVsZW1lbnQgdGhhdCBjYXB0dXJlcyBrZXlib2FyZCBpbnB1dFxuICAgICAgICBbJ2ZvY3VzZWQnLCAgICAncncnLCAnYm9vbCddLCAvLyBDYXB0dXJlIGFuZCBzZW5kIGtleSBldmVudHNcblxuICAgICAgICBbJ29uS2V5UHJlc3MnLCAncncnLCAnZnVuYyddIC8vIEhhbmRsZXIgZm9yIGtleSBwcmVzcy9yZWxlYXNlXG4gICAgXSk7XG59KSgpO1xuXG5leHBvcnQgdmFyIE1vdXNlO1xuXG4oZnVuY3Rpb24gKCkge1xuICAgIE1vdXNlID0gZnVuY3Rpb24gKGRlZmF1bHRzKSB7XG4gICAgICAgIHRoaXMuX21vdXNlQ2FwdHVyZWQgID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5fZG91YmxlQ2xpY2tUaW1lciA9IG51bGw7XG4gICAgICAgIHRoaXMuX2xhc3RUb3VjaFBvcyA9IG51bGw7XG5cbiAgICAgICAgLy8gQ29uZmlndXJhdGlvbiBhdHRyaWJ1dGVzXG4gICAgICAgIFV0aWwuc2V0X2RlZmF1bHRzKHRoaXMsIGRlZmF1bHRzLCB7XG4gICAgICAgICAgICAndGFyZ2V0JzogZG9jdW1lbnQsXG4gICAgICAgICAgICAnZm9jdXNlZCc6IHRydWUsXG4gICAgICAgICAgICAnc2NhbGUnOiAxLjAsXG4gICAgICAgICAgICAndG91Y2hCdXR0b24nOiAxXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcnMgPSB7XG4gICAgICAgICAgICAnbW91c2Vkb3duJzogdGhpcy5faGFuZGxlTW91c2VEb3duLmJpbmQodGhpcyksXG4gICAgICAgICAgICAnbW91c2V1cCc6IHRoaXMuX2hhbmRsZU1vdXNlVXAuYmluZCh0aGlzKSxcbiAgICAgICAgICAgICdtb3VzZW1vdmUnOiB0aGlzLl9oYW5kbGVNb3VzZU1vdmUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgICdtb3VzZXdoZWVsJzogdGhpcy5faGFuZGxlTW91c2VXaGVlbC5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgJ21vdXNlZGlzYWJsZSc6IHRoaXMuX2hhbmRsZU1vdXNlRGlzYWJsZS5iaW5kKHRoaXMpXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIE1vdXNlLnByb3RvdHlwZSA9IHtcbiAgICAgICAgLy8gcHJpdmF0ZSBtZXRob2RzXG4gICAgICAgIF9jYXB0dXJlTW91c2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8vIGNhcHR1cmluZyB0aGUgbW91c2UgZW5zdXJlcyB3ZSBnZXQgdGhlIG1vdXNldXAgZXZlbnRcbiAgICAgICAgICAgIGlmICh0aGlzLl90YXJnZXQuc2V0Q2FwdHVyZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhcmdldC5zZXRDYXB0dXJlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHNvbWUgYnJvd3NlcnMgZ2l2ZSB1cyBtb3VzZXVwIGV2ZW50cyByZWdhcmRsZXNzLFxuICAgICAgICAgICAgLy8gc28gaWYgd2UgbmV2ZXIgY2FwdHVyZWQgdGhlIG1vdXNlLCB3ZSBjYW4gZGlzcmVnYXJkIHRoZSBldmVudFxuICAgICAgICAgICAgdGhpcy5fbW91c2VDYXB0dXJlZCA9IHRydWU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX3JlbGVhc2VNb3VzZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3RhcmdldC5yZWxlYXNlQ2FwdHVyZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhcmdldC5yZWxlYXNlQ2FwdHVyZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbW91c2VDYXB0dXJlZCA9IGZhbHNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9yZXNldERvdWJsZUNsaWNrVGltZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuX2RvdWJsZUNsaWNrVGltZXIgPSBudWxsO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9oYW5kbGVNb3VzZUJ1dHRvbjogZnVuY3Rpb24gKGUsIGRvd24pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fZm9jdXNlZCkgeyByZXR1cm4gdHJ1ZTsgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fbm90aWZ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZ5KGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZXZ0ID0gKGUgPyBlIDogd2luZG93LmV2ZW50KTtcbiAgICAgICAgICAgIHZhciBwb3MgPSBVdGlsLmdldEV2ZW50UG9zaXRpb24oZSwgdGhpcy5fdGFyZ2V0LCB0aGlzLl9zY2FsZSk7XG5cbiAgICAgICAgICAgIHZhciBibWFzaztcbiAgICAgICAgICAgIGlmIChlLnRvdWNoZXMgfHwgZS5jaGFuZ2VkVG91Y2hlcykge1xuICAgICAgICAgICAgICAgIC8vIFRvdWNoIGRldmljZVxuXG4gICAgICAgICAgICAgICAgLy8gV2hlbiB0d28gdG91Y2hlcyBvY2N1ciB3aXRoaW4gNTAwIG1zIG9mIGVhY2ggb3RoZXIgYW5kIGFyZVxuICAgICAgICAgICAgICAgIC8vIGNsb3NlIGVub3VnaCB0b2dldGhlciBhIGRvdWJsZSBjbGljayBpcyB0cmlnZ2VyZWQuXG4gICAgICAgICAgICAgICAgaWYgKGRvd24gPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZG91YmxlQ2xpY2tUaW1lciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFzdFRvdWNoUG9zID0gcG9zO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2RvdWJsZUNsaWNrVGltZXIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSB0d28gdG91Y2hlcyBpcyBzbWFsbCBlbm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGF0dGVyIHRvdWNoIHRvIHRoZSBwb3NpdGlvbiBvZlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGZpcnN0LlxuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgeHMgPSB0aGlzLl9sYXN0VG91Y2hQb3MueCAtIHBvcy54O1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHlzID0gdGhpcy5fbGFzdFRvdWNoUG9zLnkgLSBwb3MueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkID0gTWF0aC5zcXJ0KCh4cyAqIHhzKSArICh5cyAqIHlzKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBnb2FsIGlzIHRvIHRyaWdnZXIgb24gYSBjZXJ0YWluIHBoeXNpY2FsIHdpZHRoLCB0aGVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZVBpeGVsUmF0aW8gYnJpbmdzIHVzIGEgYml0IGNsb3NlciBidXQgaXMgbm90IG9wdGltYWwuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGhyZXNob2xkID0gMjAgKiAod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCA8IHRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IHRoaXMuX2xhc3RUb3VjaFBvcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kb3VibGVDbGlja1RpbWVyID0gc2V0VGltZW91dCh0aGlzLl9yZXNldERvdWJsZUNsaWNrVGltZXIuYmluZCh0aGlzKSwgNTAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYm1hc2sgPSB0aGlzLl90b3VjaEJ1dHRvbjtcbiAgICAgICAgICAgICAgICAvLyBJZiBibWFzayBpcyBzZXRcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZ0LndoaWNoKSB7XG4gICAgICAgICAgICAgICAgLyogZXZlcnl0aGluZyBleGNlcHQgSUUgKi9cbiAgICAgICAgICAgICAgICBibWFzayA9IDEgPDwgZXZ0LmJ1dHRvbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLyogSUUgaW5jbHVkaW5nIDkgKi9cbiAgICAgICAgICAgICAgICBibWFzayA9IChldnQuYnV0dG9uICYgMHgxKSArICAgICAgLy8gTGVmdFxuICAgICAgICAgICAgICAgICAgICAgICAgKGV2dC5idXR0b24gJiAweDIpICogMiArICAvLyBSaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgKGV2dC5idXR0b24gJiAweDQpIC8gMjsgICAvLyBNaWRkbGVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX29uTW91c2VCdXR0b24pIHtcbiAgICAgICAgICAgICAgICBVdGlsLkRlYnVnKFwib25Nb3VzZUJ1dHRvbiBcIiArIChkb3duID8gXCJkb3duXCIgOiBcInVwXCIpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLCB4OiBcIiArIHBvcy54ICsgXCIsIHk6IFwiICsgcG9zLnkgKyBcIiwgYm1hc2s6IFwiICsgYm1hc2spO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uTW91c2VCdXR0b24ocG9zLngsIHBvcy55LCBkb3duLCBibWFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBVdGlsLnN0b3BFdmVudChlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSxcblxuICAgICAgICBfaGFuZGxlTW91c2VEb3duOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgdGhpcy5fY2FwdHVyZU1vdXNlKCk7XG4gICAgICAgICAgICB0aGlzLl9oYW5kbGVNb3VzZUJ1dHRvbihlLCAxKTtcbiAgICAgICAgfSxcblxuICAgICAgICBfaGFuZGxlTW91c2VVcDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fbW91c2VDYXB0dXJlZCkgeyByZXR1cm47IH1cblxuICAgICAgICAgICAgdGhpcy5faGFuZGxlTW91c2VCdXR0b24oZSwgMCk7XG4gICAgICAgICAgICB0aGlzLl9yZWxlYXNlTW91c2UoKTtcbiAgICAgICAgfSxcblxuICAgICAgICBfaGFuZGxlTW91c2VXaGVlbDogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fZm9jdXNlZCkgeyByZXR1cm4gdHJ1ZTsgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fbm90aWZ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbm90aWZ5KGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZXZ0ID0gKGUgPyBlIDogd2luZG93LmV2ZW50KTtcbiAgICAgICAgICAgIHZhciBwb3MgPSBVdGlsLmdldEV2ZW50UG9zaXRpb24oZSwgdGhpcy5fdGFyZ2V0LCB0aGlzLl9zY2FsZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9vbk1vdXNlQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV2dC5kZWx0YVggPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uTW91c2VCdXR0b24ocG9zLngsIHBvcy55LCAxLCAxIDw8IDUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbk1vdXNlQnV0dG9uKHBvcy54LCBwb3MueSwgMCwgMSA8PCA1KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2dC5kZWx0YVggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uTW91c2VCdXR0b24ocG9zLngsIHBvcy55LCAxLCAxIDw8IDYpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbk1vdXNlQnV0dG9uKHBvcy54LCBwb3MueSwgMCwgMSA8PCA2KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZXZ0LmRlbHRhWSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25Nb3VzZUJ1dHRvbihwb3MueCwgcG9zLnksIDEsIDEgPDwgMyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uTW91c2VCdXR0b24ocG9zLngsIHBvcy55LCAwLCAxIDw8IDMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZ0LmRlbHRhWSA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25Nb3VzZUJ1dHRvbihwb3MueCwgcG9zLnksIDEsIDEgPDwgNCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uTW91c2VCdXR0b24ocG9zLngsIHBvcy55LCAwLCAxIDw8IDQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgVXRpbC5zdG9wRXZlbnQoZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2hhbmRsZU1vdXNlTW92ZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGlmICghIHRoaXMuX2ZvY3VzZWQpIHsgcmV0dXJuIHRydWU7IH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX25vdGlmeSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmeShlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGV2dCA9IChlID8gZSA6IHdpbmRvdy5ldmVudCk7XG4gICAgICAgICAgICB2YXIgcG9zID0gVXRpbC5nZXRFdmVudFBvc2l0aW9uKGUsIHRoaXMuX3RhcmdldCwgdGhpcy5fc2NhbGUpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX29uTW91c2VNb3ZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb25Nb3VzZU1vdmUocG9zLngsIHBvcy55KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFV0aWwuc3RvcEV2ZW50KGUpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9oYW5kbGVNb3VzZURpc2FibGU6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2ZvY3VzZWQpIHsgcmV0dXJuIHRydWU7IH1cblxuICAgICAgICAgICAgdmFyIGV2dCA9IChlID8gZSA6IHdpbmRvdy5ldmVudCk7XG4gICAgICAgICAgICB2YXIgcG9zID0gVXRpbC5nZXRFdmVudFBvc2l0aW9uKGUsIHRoaXMuX3RhcmdldCwgdGhpcy5fc2NhbGUpO1xuXG4gICAgICAgICAgICAvKiBTdG9wIHByb3BhZ2F0aW9uIGlmIGluc2lkZSBjYW52YXMgYXJlYSAqL1xuICAgICAgICAgICAgaWYgKChwb3MucmVhbHggPj0gMCkgJiYgKHBvcy5yZWFseSA+PSAwKSAmJlxuICAgICAgICAgICAgICAgIChwb3MucmVhbHggPCB0aGlzLl90YXJnZXQub2Zmc2V0V2lkdGgpICYmXG4gICAgICAgICAgICAgICAgKHBvcy5yZWFseSA8IHRoaXMuX3RhcmdldC5vZmZzZXRIZWlnaHQpKSB7XG4gICAgICAgICAgICAgICAgLy9VdGlsLkRlYnVnKFwibW91c2UgZXZlbnQgZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgVXRpbC5zdG9wRXZlbnQoZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8vIFB1YmxpYyBtZXRob2RzXG4gICAgICAgIGdyYWI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBjID0gdGhpcy5fdGFyZ2V0O1xuXG4gICAgICAgICAgICBpZiAoVXRpbC5pc1RvdWNoRGV2aWNlKSB7XG4gICAgICAgICAgICAgICAgYy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZWRvd24pO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2V1cCk7XG4gICAgICAgICAgICAgICAgYy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2V1cCk7XG4gICAgICAgICAgICAgICAgYy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLl9ldmVudEhhbmRsZXJzLm1vdXNlbW92ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2Vkb3duKTtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZXVwKTtcbiAgICAgICAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2V1cCk7XG4gICAgICAgICAgICBjLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2Vtb3ZlKTtcbiAgICAgICAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCB0aGlzLl9ldmVudEhhbmRsZXJzLm1vdXNld2hlZWwpO1xuXG4gICAgICAgICAgICAvKiBXb3JrIGFyb3VuZCByaWdodCBhbmQgbWlkZGxlIGNsaWNrIGJyb3dzZXIgYmVoYXZpb3JzICovXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2VkaXNhYmxlKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCB0aGlzLl9ldmVudEhhbmRsZXJzLm1vdXNlZGlzYWJsZSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdW5ncmFiOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgYyA9IHRoaXMuX3RhcmdldDtcblxuICAgICAgICAgICAgaWYgKFV0aWwuaXNUb3VjaERldmljZSkge1xuICAgICAgICAgICAgICAgIGMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2Vkb3duKTtcbiAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9ldmVudEhhbmRsZXJzLm1vdXNldXApO1xuICAgICAgICAgICAgICAgIGMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9ldmVudEhhbmRsZXJzLm1vdXNldXApO1xuICAgICAgICAgICAgICAgIGMucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZW1vdmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCB0aGlzLl9ldmVudEhhbmRsZXJzLm1vdXNlZG93bik7XG4gICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2V2ZW50SGFuZGxlcnMubW91c2V1cCk7XG4gICAgICAgICAgICBjLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLl9ldmVudEhhbmRsZXJzLm1vdXNldXApO1xuICAgICAgICAgICAgYy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9ldmVudEhhbmRsZXJzLm1vdXNlbW92ZSk7XG4gICAgICAgICAgICBjLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3doZWVsJywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZXdoZWVsKTtcblxuICAgICAgICAgICAgLyogV29yayBhcm91bmQgcmlnaHQgYW5kIG1pZGRsZSBjbGljayBicm93c2VyIGJlaGF2aW9ycyAqL1xuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9ldmVudEhhbmRsZXJzLm1vdXNlZGlzYWJsZSk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgdGhpcy5fZXZlbnRIYW5kbGVycy5tb3VzZWRpc2FibGUpO1xuXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgVXRpbC5tYWtlX3Byb3BlcnRpZXMoTW91c2UsIFtcbiAgICAgICAgWyd0YXJnZXQnLCAgICAgICAgICdybycsICdkb20nXSwgICAvLyBET00gZWxlbWVudCB0aGF0IGNhcHR1cmVzIG1vdXNlIGlucHV0XG4gICAgICAgIFsnbm90aWZ5JywgICAgICAgICAncm8nLCAnZnVuYyddLCAgLy8gRnVuY3Rpb24gdG8gY2FsbCB0byBub3RpZnkgd2hlbmV2ZXIgYSBtb3VzZSBldmVudCBpcyByZWNlaXZlZFxuICAgICAgICBbJ2ZvY3VzZWQnLCAgICAgICAgJ3J3JywgJ2Jvb2wnXSwgIC8vIENhcHR1cmUgYW5kIHNlbmQgbW91c2UgY2xpY2tzL21vdmVtZW50XG4gICAgICAgIFsnc2NhbGUnLCAgICAgICAgICAncncnLCAnZmxvYXQnXSwgLy8gVmlld3BvcnQgc2NhbGUgZmFjdG9yIDAuMCAtIDEuMFxuXG4gICAgICAgIFsnb25Nb3VzZUJ1dHRvbicsICAncncnLCAnZnVuYyddLCAgLy8gSGFuZGxlciBmb3IgbW91c2UgYnV0dG9uIGNsaWNrL3JlbGVhc2VcbiAgICAgICAgWydvbk1vdXNlTW92ZScsICAgICdydycsICdmdW5jJ10sICAvLyBIYW5kbGVyIGZvciBtb3VzZSBtb3ZlbWVudFxuICAgICAgICBbJ3RvdWNoQnV0dG9uJywgICAgJ3J3JywgJ2ludCddICAgIC8vIEJ1dHRvbiBtYXNrICgxLCAyLCA0KSBmb3IgdG91Y2ggZGV2aWNlcyAoMCBtZWFucyBpZ25vcmUgY2xpY2tzKVxuICAgIF0pO1xufSkoKTtcbiIsInZhciBLZXlUYWJsZSA9IHtcbiAgICBYS19Wb2lkU3ltYm9sOiAgICAgICAgICAgICAgICAgIDB4ZmZmZmZmLCAvKiBWb2lkIHN5bWJvbCAqL1xuXG4gICAgWEtfQmFja1NwYWNlOiAgICAgICAgICAgICAgICAgICAweGZmMDgsIC8qIEJhY2sgc3BhY2UsIGJhY2sgY2hhciAqL1xuICAgIFhLX1RhYjogICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjA5LFxuICAgIFhLX0xpbmVmZWVkOiAgICAgICAgICAgICAgICAgICAgMHhmZjBhLCAvKiBMaW5lZmVlZCwgTEYgKi9cbiAgICBYS19DbGVhcjogICAgICAgICAgICAgICAgICAgICAgIDB4ZmYwYixcbiAgICBYS19SZXR1cm46ICAgICAgICAgICAgICAgICAgICAgIDB4ZmYwZCwgLyogUmV0dXJuLCBlbnRlciAqL1xuICAgIFhLX1BhdXNlOiAgICAgICAgICAgICAgICAgICAgICAgMHhmZjEzLCAvKiBQYXVzZSwgaG9sZCAqL1xuICAgIFhLX1Njcm9sbF9Mb2NrOiAgICAgICAgICAgICAgICAgMHhmZjE0LFxuICAgIFhLX1N5c19SZXE6ICAgICAgICAgICAgICAgICAgICAgMHhmZjE1LFxuICAgIFhLX0VzY2FwZTogICAgICAgICAgICAgICAgICAgICAgMHhmZjFiLFxuICAgIFhLX0RlbGV0ZTogICAgICAgICAgICAgICAgICAgICAgMHhmZmZmLCAvKiBEZWxldGUsIHJ1Ym91dCAqL1xuXG4gICAgLyogQ3Vyc29yIGNvbnRyb2wgJiBtb3Rpb24gKi9cblxuICAgIFhLX0hvbWU6ICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjUwLFxuICAgIFhLX0xlZnQ6ICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjUxLCAvKiBNb3ZlIGxlZnQsIGxlZnQgYXJyb3cgKi9cbiAgICBYS19VcDogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY1MiwgLyogTW92ZSB1cCwgdXAgYXJyb3cgKi9cbiAgICBYS19SaWdodDogICAgICAgICAgICAgICAgICAgICAgIDB4ZmY1MywgLyogTW92ZSByaWdodCwgcmlnaHQgYXJyb3cgKi9cbiAgICBYS19Eb3duOiAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmY1NCwgLyogTW92ZSBkb3duLCBkb3duIGFycm93ICovXG4gICAgWEtfUHJpb3I6ICAgICAgICAgICAgICAgICAgICAgICAweGZmNTUsIC8qIFByaW9yLCBwcmV2aW91cyAqL1xuICAgIFhLX1BhZ2VfVXA6ICAgICAgICAgICAgICAgICAgICAgMHhmZjU1LFxuICAgIFhLX05leHQ6ICAgICAgICAgICAgICAgICAgICAgICAgMHhmZjU2LCAvKiBOZXh0ICovXG4gICAgWEtfUGFnZV9Eb3duOiAgICAgICAgICAgICAgICAgICAweGZmNTYsXG4gICAgWEtfRW5kOiAgICAgICAgICAgICAgICAgICAgICAgICAweGZmNTcsIC8qIEVPTCAqL1xuICAgIFhLX0JlZ2luOiAgICAgICAgICAgICAgICAgICAgICAgMHhmZjU4LCAvKiBCT0wgKi9cblxuXG4gICAgLyogTWlzYyBmdW5jdGlvbnMgKi9cblxuICAgIFhLX1NlbGVjdDogICAgICAgICAgICAgICAgICAgICAgMHhmZjYwLCAvKiBTZWxlY3QsIG1hcmsgKi9cbiAgICBYS19QcmludDogICAgICAgICAgICAgICAgICAgICAgIDB4ZmY2MSxcbiAgICBYS19FeGVjdXRlOiAgICAgICAgICAgICAgICAgICAgIDB4ZmY2MiwgLyogRXhlY3V0ZSwgcnVuLCBkbyAqL1xuICAgIFhLX0luc2VydDogICAgICAgICAgICAgICAgICAgICAgMHhmZjYzLCAvKiBJbnNlcnQsIGluc2VydCBoZXJlICovXG4gICAgWEtfVW5kbzogICAgICAgICAgICAgICAgICAgICAgICAweGZmNjUsXG4gICAgWEtfUmVkbzogICAgICAgICAgICAgICAgICAgICAgICAweGZmNjYsIC8qIFJlZG8sIGFnYWluICovXG4gICAgWEtfTWVudTogICAgICAgICAgICAgICAgICAgICAgICAweGZmNjcsXG4gICAgWEtfRmluZDogICAgICAgICAgICAgICAgICAgICAgICAweGZmNjgsIC8qIEZpbmQsIHNlYXJjaCAqL1xuICAgIFhLX0NhbmNlbDogICAgICAgICAgICAgICAgICAgICAgMHhmZjY5LCAvKiBDYW5jZWwsIHN0b3AsIGFib3J0LCBleGl0ICovXG4gICAgWEtfSGVscDogICAgICAgICAgICAgICAgICAgICAgICAweGZmNmEsIC8qIEhlbHAgKi9cbiAgICBYS19CcmVhazogICAgICAgICAgICAgICAgICAgICAgIDB4ZmY2YixcbiAgICBYS19Nb2RlX3N3aXRjaDogICAgICAgICAgICAgICAgIDB4ZmY3ZSwgLyogQ2hhcmFjdGVyIHNldCBzd2l0Y2ggKi9cbiAgICBYS19zY3JpcHRfc3dpdGNoOiAgICAgICAgICAgICAgIDB4ZmY3ZSwgLyogQWxpYXMgZm9yIG1vZGVfc3dpdGNoICovXG4gICAgWEtfTnVtX0xvY2s6ICAgICAgICAgICAgICAgICAgICAweGZmN2YsXG5cbiAgICAvKiBLZXlwYWQgZnVuY3Rpb25zLCBrZXlwYWQgbnVtYmVycyBjbGV2ZXJseSBjaG9zZW4gdG8gbWFwIHRvIEFTQ0lJICovXG5cbiAgICBYS19LUF9TcGFjZTogICAgICAgICAgICAgICAgICAgIDB4ZmY4MCwgLyogU3BhY2UgKi9cbiAgICBYS19LUF9UYWI6ICAgICAgICAgICAgICAgICAgICAgIDB4ZmY4OSxcbiAgICBYS19LUF9FbnRlcjogICAgICAgICAgICAgICAgICAgIDB4ZmY4ZCwgLyogRW50ZXIgKi9cbiAgICBYS19LUF9GMTogICAgICAgICAgICAgICAgICAgICAgIDB4ZmY5MSwgLyogUEYxLCBLUF9BLCAuLi4gKi9cbiAgICBYS19LUF9GMjogICAgICAgICAgICAgICAgICAgICAgIDB4ZmY5MixcbiAgICBYS19LUF9GMzogICAgICAgICAgICAgICAgICAgICAgIDB4ZmY5MyxcbiAgICBYS19LUF9GNDogICAgICAgICAgICAgICAgICAgICAgIDB4ZmY5NCxcbiAgICBYS19LUF9Ib21lOiAgICAgICAgICAgICAgICAgICAgIDB4ZmY5NSxcbiAgICBYS19LUF9MZWZ0OiAgICAgICAgICAgICAgICAgICAgIDB4ZmY5NixcbiAgICBYS19LUF9VcDogICAgICAgICAgICAgICAgICAgICAgIDB4ZmY5NyxcbiAgICBYS19LUF9SaWdodDogICAgICAgICAgICAgICAgICAgIDB4ZmY5OCxcbiAgICBYS19LUF9Eb3duOiAgICAgICAgICAgICAgICAgICAgIDB4ZmY5OSxcbiAgICBYS19LUF9QcmlvcjogICAgICAgICAgICAgICAgICAgIDB4ZmY5YSxcbiAgICBYS19LUF9QYWdlX1VwOiAgICAgICAgICAgICAgICAgIDB4ZmY5YSxcbiAgICBYS19LUF9OZXh0OiAgICAgICAgICAgICAgICAgICAgIDB4ZmY5YixcbiAgICBYS19LUF9QYWdlX0Rvd246ICAgICAgICAgICAgICAgIDB4ZmY5YixcbiAgICBYS19LUF9FbmQ6ICAgICAgICAgICAgICAgICAgICAgIDB4ZmY5YyxcbiAgICBYS19LUF9CZWdpbjogICAgICAgICAgICAgICAgICAgIDB4ZmY5ZCxcbiAgICBYS19LUF9JbnNlcnQ6ICAgICAgICAgICAgICAgICAgIDB4ZmY5ZSxcbiAgICBYS19LUF9EZWxldGU6ICAgICAgICAgICAgICAgICAgIDB4ZmY5ZixcbiAgICBYS19LUF9FcXVhbDogICAgICAgICAgICAgICAgICAgIDB4ZmZiZCwgLyogRXF1YWxzICovXG4gICAgWEtfS1BfTXVsdGlwbHk6ICAgICAgICAgICAgICAgICAweGZmYWEsXG4gICAgWEtfS1BfQWRkOiAgICAgICAgICAgICAgICAgICAgICAweGZmYWIsXG4gICAgWEtfS1BfU2VwYXJhdG9yOiAgICAgICAgICAgICAgICAweGZmYWMsIC8qIFNlcGFyYXRvciwgb2Z0ZW4gY29tbWEgKi9cbiAgICBYS19LUF9TdWJ0cmFjdDogICAgICAgICAgICAgICAgIDB4ZmZhZCxcbiAgICBYS19LUF9EZWNpbWFsOiAgICAgICAgICAgICAgICAgIDB4ZmZhZSxcbiAgICBYS19LUF9EaXZpZGU6ICAgICAgICAgICAgICAgICAgIDB4ZmZhZixcblxuICAgIFhLX0tQXzA6ICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmIwLFxuICAgIFhLX0tQXzE6ICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmIxLFxuICAgIFhLX0tQXzI6ICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmIyLFxuICAgIFhLX0tQXzM6ICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmIzLFxuICAgIFhLX0tQXzQ6ICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmI0LFxuICAgIFhLX0tQXzU6ICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmI1LFxuICAgIFhLX0tQXzY6ICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmI2LFxuICAgIFhLX0tQXzc6ICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmI3LFxuICAgIFhLX0tQXzg6ICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmI4LFxuICAgIFhLX0tQXzk6ICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmI5LFxuXG4gICAgLypcbiAgICAgKiBBdXhpbGlhcnkgZnVuY3Rpb25zOyBub3RlIHRoZSBkdXBsaWNhdGUgZGVmaW5pdGlvbnMgZm9yIGxlZnQgYW5kIHJpZ2h0XG4gICAgICogZnVuY3Rpb24ga2V5czsgIFN1biBrZXlib2FyZHMgYW5kIGEgZmV3IG90aGVyIG1hbnVmYWN0dXJlcnMgaGF2ZSBzdWNoXG4gICAgICogZnVuY3Rpb24ga2V5IGdyb3VwcyBvbiB0aGUgbGVmdCBhbmQvb3IgcmlnaHQgc2lkZXMgb2YgdGhlIGtleWJvYXJkLlxuICAgICAqIFdlJ3ZlIG5vdCBmb3VuZCBhIGtleWJvYXJkIHdpdGggbW9yZSB0aGFuIDM1IGZ1bmN0aW9uIGtleXMgdG90YWwuXG4gICAgICovXG5cbiAgICBYS19GMTogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiZSxcbiAgICBYS19GMjogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZiZixcbiAgICBYS19GMzogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjMCxcbiAgICBYS19GNDogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjMSxcbiAgICBYS19GNTogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjMixcbiAgICBYS19GNjogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjMyxcbiAgICBYS19GNzogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjNCxcbiAgICBYS19GODogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjNSxcbiAgICBYS19GOTogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjNixcbiAgICBYS19GMTA6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjNyxcbiAgICBYS19GMTE6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjOCxcbiAgICBYS19MMTogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjOCxcbiAgICBYS19GMTI6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjOSxcbiAgICBYS19MMjogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjOSxcbiAgICBYS19GMTM6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjYSxcbiAgICBYS19MMzogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjYSxcbiAgICBYS19GMTQ6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjYixcbiAgICBYS19MNDogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjYixcbiAgICBYS19GMTU6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjYyxcbiAgICBYS19MNTogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjYyxcbiAgICBYS19GMTY6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjZCxcbiAgICBYS19MNjogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjZCxcbiAgICBYS19GMTc6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjZSxcbiAgICBYS19MNzogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjZSxcbiAgICBYS19GMTg6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjZixcbiAgICBYS19MODogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZjZixcbiAgICBYS19GMTk6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkMCxcbiAgICBYS19MOTogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkMCxcbiAgICBYS19GMjA6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkMSxcbiAgICBYS19MMTA6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkMSxcbiAgICBYS19GMjE6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkMixcbiAgICBYS19SMTogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkMixcbiAgICBYS19GMjI6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkMyxcbiAgICBYS19SMjogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkMyxcbiAgICBYS19GMjM6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkNCxcbiAgICBYS19SMzogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkNCxcbiAgICBYS19GMjQ6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkNSxcbiAgICBYS19SNDogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkNSxcbiAgICBYS19GMjU6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkNixcbiAgICBYS19SNTogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkNixcbiAgICBYS19GMjY6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkNyxcbiAgICBYS19SNjogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkNyxcbiAgICBYS19GMjc6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkOCxcbiAgICBYS19SNzogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkOCxcbiAgICBYS19GMjg6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkOSxcbiAgICBYS19SODogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkOSxcbiAgICBYS19GMjk6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkYSxcbiAgICBYS19SOTogICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkYSxcbiAgICBYS19GMzA6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkYixcbiAgICBYS19SMTA6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkYixcbiAgICBYS19GMzE6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkYyxcbiAgICBYS19SMTE6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkYyxcbiAgICBYS19GMzI6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkZCxcbiAgICBYS19SMTI6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkZCxcbiAgICBYS19GMzM6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkZSxcbiAgICBYS19SMTM6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkZSxcbiAgICBYS19GMzQ6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkZixcbiAgICBYS19SMTQ6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZkZixcbiAgICBYS19GMzU6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZlMCxcbiAgICBYS19SMTU6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZlMCxcblxuICAgIC8qIE1vZGlmaWVycyAqL1xuXG4gICAgWEtfU2hpZnRfTDogICAgICAgICAgICAgICAgICAgICAweGZmZTEsIC8qIExlZnQgc2hpZnQgKi9cbiAgICBYS19TaGlmdF9SOiAgICAgICAgICAgICAgICAgICAgIDB4ZmZlMiwgLyogUmlnaHQgc2hpZnQgKi9cbiAgICBYS19Db250cm9sX0w6ICAgICAgICAgICAgICAgICAgIDB4ZmZlMywgLyogTGVmdCBjb250cm9sICovXG4gICAgWEtfQ29udHJvbF9SOiAgICAgICAgICAgICAgICAgICAweGZmZTQsIC8qIFJpZ2h0IGNvbnRyb2wgKi9cbiAgICBYS19DYXBzX0xvY2s6ICAgICAgICAgICAgICAgICAgIDB4ZmZlNSwgLyogQ2FwcyBsb2NrICovXG4gICAgWEtfU2hpZnRfTG9jazogICAgICAgICAgICAgICAgICAweGZmZTYsIC8qIFNoaWZ0IGxvY2sgKi9cblxuICAgIFhLX01ldGFfTDogICAgICAgICAgICAgICAgICAgICAgMHhmZmU3LCAvKiBMZWZ0IG1ldGEgKi9cbiAgICBYS19NZXRhX1I6ICAgICAgICAgICAgICAgICAgICAgIDB4ZmZlOCwgLyogUmlnaHQgbWV0YSAqL1xuICAgIFhLX0FsdF9MOiAgICAgICAgICAgICAgICAgICAgICAgMHhmZmU5LCAvKiBMZWZ0IGFsdCAqL1xuICAgIFhLX0FsdF9SOiAgICAgICAgICAgICAgICAgICAgICAgMHhmZmVhLCAvKiBSaWdodCBhbHQgKi9cbiAgICBYS19TdXBlcl9MOiAgICAgICAgICAgICAgICAgICAgIDB4ZmZlYiwgLyogTGVmdCBzdXBlciAqL1xuICAgIFhLX1N1cGVyX1I6ICAgICAgICAgICAgICAgICAgICAgMHhmZmVjLCAvKiBSaWdodCBzdXBlciAqL1xuICAgIFhLX0h5cGVyX0w6ICAgICAgICAgICAgICAgICAgICAgMHhmZmVkLCAvKiBMZWZ0IGh5cGVyICovXG4gICAgWEtfSHlwZXJfUjogICAgICAgICAgICAgICAgICAgICAweGZmZWUsIC8qIFJpZ2h0IGh5cGVyICovXG5cbiAgICBYS19JU09fTGV2ZWwzX1NoaWZ0OiAgICAgICAgICAgIDB4ZmUwMywgLyogQWx0R3IgKi9cblxuICAgIC8qXG4gICAgICogTGF0aW4gMVxuICAgICAqIChJU08vSUVDIDg4NTktMTogVW5pY29kZSBVKzAwMjAuLlUrMDBGRilcbiAgICAgKiBCeXRlIDM6IDBcbiAgICAgKi9cblxuICAgIFhLX3NwYWNlOiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwLCAvKiBVKzAwMjAgU1BBQ0UgKi9cbiAgICBYS19leGNsYW06ICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMSwgLyogVSswMDIxIEVYQ0xBTUFUSU9OIE1BUksgKi9cbiAgICBYS19xdW90ZWRibDogICAgICAgICAgICAgICAgICAgIDB4MDAyMiwgLyogVSswMDIyIFFVT1RBVElPTiBNQVJLICovXG4gICAgWEtfbnVtYmVyc2lnbjogICAgICAgICAgICAgICAgICAweDAwMjMsIC8qIFUrMDAyMyBOVU1CRVIgU0lHTiAqL1xuICAgIFhLX2RvbGxhcjogICAgICAgICAgICAgICAgICAgICAgMHgwMDI0LCAvKiBVKzAwMjQgRE9MTEFSIFNJR04gKi9cbiAgICBYS19wZXJjZW50OiAgICAgICAgICAgICAgICAgICAgIDB4MDAyNSwgLyogVSswMDI1IFBFUkNFTlQgU0lHTiAqL1xuICAgIFhLX2FtcGVyc2FuZDogICAgICAgICAgICAgICAgICAgMHgwMDI2LCAvKiBVKzAwMjYgQU1QRVJTQU5EICovXG4gICAgWEtfYXBvc3Ryb3BoZTogICAgICAgICAgICAgICAgICAweDAwMjcsIC8qIFUrMDAyNyBBUE9TVFJPUEhFICovXG4gICAgWEtfcXVvdGVyaWdodDogICAgICAgICAgICAgICAgICAweDAwMjcsIC8qIGRlcHJlY2F0ZWQgKi9cbiAgICBYS19wYXJlbmxlZnQ6ICAgICAgICAgICAgICAgICAgIDB4MDAyOCwgLyogVSswMDI4IExFRlQgUEFSRU5USEVTSVMgKi9cbiAgICBYS19wYXJlbnJpZ2h0OiAgICAgICAgICAgICAgICAgIDB4MDAyOSwgLyogVSswMDI5IFJJR0hUIFBBUkVOVEhFU0lTICovXG4gICAgWEtfYXN0ZXJpc2s6ICAgICAgICAgICAgICAgICAgICAweDAwMmEsIC8qIFUrMDAyQSBBU1RFUklTSyAqL1xuICAgIFhLX3BsdXM6ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDJiLCAvKiBVKzAwMkIgUExVUyBTSUdOICovXG4gICAgWEtfY29tbWE6ICAgICAgICAgICAgICAgICAgICAgICAweDAwMmMsIC8qIFUrMDAyQyBDT01NQSAqL1xuICAgIFhLX21pbnVzOiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDJkLCAvKiBVKzAwMkQgSFlQSEVOLU1JTlVTICovXG4gICAgWEtfcGVyaW9kOiAgICAgICAgICAgICAgICAgICAgICAweDAwMmUsIC8qIFUrMDAyRSBGVUxMIFNUT1AgKi9cbiAgICBYS19zbGFzaDogICAgICAgICAgICAgICAgICAgICAgIDB4MDAyZiwgLyogVSswMDJGIFNPTElEVVMgKi9cbiAgICBYS18wOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzMCwgLyogVSswMDMwIERJR0lUIFpFUk8gKi9cbiAgICBYS18xOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzMSwgLyogVSswMDMxIERJR0lUIE9ORSAqL1xuICAgIFhLXzI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDMyLCAvKiBVKzAwMzIgRElHSVQgVFdPICovXG4gICAgWEtfMzogICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzMsIC8qIFUrMDAzMyBESUdJVCBUSFJFRSAqL1xuICAgIFhLXzQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDM0LCAvKiBVKzAwMzQgRElHSVQgRk9VUiAqL1xuICAgIFhLXzU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDM1LCAvKiBVKzAwMzUgRElHSVQgRklWRSAqL1xuICAgIFhLXzY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDM2LCAvKiBVKzAwMzYgRElHSVQgU0lYICovXG4gICAgWEtfNzogICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMzcsIC8qIFUrMDAzNyBESUdJVCBTRVZFTiAqL1xuICAgIFhLXzg6ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDM4LCAvKiBVKzAwMzggRElHSVQgRUlHSFQgKi9cbiAgICBYS185OiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzOSwgLyogVSswMDM5IERJR0lUIE5JTkUgKi9cbiAgICBYS19jb2xvbjogICAgICAgICAgICAgICAgICAgICAgIDB4MDAzYSwgLyogVSswMDNBIENPTE9OICovXG4gICAgWEtfc2VtaWNvbG9uOiAgICAgICAgICAgICAgICAgICAweDAwM2IsIC8qIFUrMDAzQiBTRU1JQ09MT04gKi9cbiAgICBYS19sZXNzOiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAzYywgLyogVSswMDNDIExFU1MtVEhBTiBTSUdOICovXG4gICAgWEtfZXF1YWw6ICAgICAgICAgICAgICAgICAgICAgICAweDAwM2QsIC8qIFUrMDAzRCBFUVVBTFMgU0lHTiAqL1xuICAgIFhLX2dyZWF0ZXI6ICAgICAgICAgICAgICAgICAgICAgMHgwMDNlLCAvKiBVKzAwM0UgR1JFQVRFUi1USEFOIFNJR04gKi9cbiAgICBYS19xdWVzdGlvbjogICAgICAgICAgICAgICAgICAgIDB4MDAzZiwgLyogVSswMDNGIFFVRVNUSU9OIE1BUksgKi9cbiAgICBYS19hdDogICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MCwgLyogVSswMDQwIENPTU1FUkNJQUwgQVQgKi9cbiAgICBYS19BOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MSwgLyogVSswMDQxIExBVElOIENBUElUQUwgTEVUVEVSIEEgKi9cbiAgICBYS19COiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MiwgLyogVSswMDQyIExBVElOIENBUElUQUwgTEVUVEVSIEIgKi9cbiAgICBYS19DOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MywgLyogVSswMDQzIExBVElOIENBUElUQUwgTEVUVEVSIEMgKi9cbiAgICBYS19EOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0NCwgLyogVSswMDQ0IExBVElOIENBUElUQUwgTEVUVEVSIEQgKi9cbiAgICBYS19FOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0NSwgLyogVSswMDQ1IExBVElOIENBUElUQUwgTEVUVEVSIEUgKi9cbiAgICBYS19GOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0NiwgLyogVSswMDQ2IExBVElOIENBUElUQUwgTEVUVEVSIEYgKi9cbiAgICBYS19HOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0NywgLyogVSswMDQ3IExBVElOIENBUElUQUwgTEVUVEVSIEcgKi9cbiAgICBYS19IOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0OCwgLyogVSswMDQ4IExBVElOIENBUElUQUwgTEVUVEVSIEggKi9cbiAgICBYS19JOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0OSwgLyogVSswMDQ5IExBVElOIENBUElUQUwgTEVUVEVSIEkgKi9cbiAgICBYS19KOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0YSwgLyogVSswMDRBIExBVElOIENBUElUQUwgTEVUVEVSIEogKi9cbiAgICBYS19LOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0YiwgLyogVSswMDRCIExBVElOIENBUElUQUwgTEVUVEVSIEsgKi9cbiAgICBYS19MOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0YywgLyogVSswMDRDIExBVElOIENBUElUQUwgTEVUVEVSIEwgKi9cbiAgICBYS19NOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0ZCwgLyogVSswMDREIExBVElOIENBUElUQUwgTEVUVEVSIE0gKi9cbiAgICBYS19OOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0ZSwgLyogVSswMDRFIExBVElOIENBUElUQUwgTEVUVEVSIE4gKi9cbiAgICBYS19POiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0ZiwgLyogVSswMDRGIExBVElOIENBUElUQUwgTEVUVEVSIE8gKi9cbiAgICBYS19QOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1MCwgLyogVSswMDUwIExBVElOIENBUElUQUwgTEVUVEVSIFAgKi9cbiAgICBYS19ROiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1MSwgLyogVSswMDUxIExBVElOIENBUElUQUwgTEVUVEVSIFEgKi9cbiAgICBYS19SOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1MiwgLyogVSswMDUyIExBVElOIENBUElUQUwgTEVUVEVSIFIgKi9cbiAgICBYS19TOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1MywgLyogVSswMDUzIExBVElOIENBUElUQUwgTEVUVEVSIFMgKi9cbiAgICBYS19UOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1NCwgLyogVSswMDU0IExBVElOIENBUElUQUwgTEVUVEVSIFQgKi9cbiAgICBYS19VOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1NSwgLyogVSswMDU1IExBVElOIENBUElUQUwgTEVUVEVSIFUgKi9cbiAgICBYS19WOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1NiwgLyogVSswMDU2IExBVElOIENBUElUQUwgTEVUVEVSIFYgKi9cbiAgICBYS19XOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1NywgLyogVSswMDU3IExBVElOIENBUElUQUwgTEVUVEVSIFcgKi9cbiAgICBYS19YOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1OCwgLyogVSswMDU4IExBVElOIENBUElUQUwgTEVUVEVSIFggKi9cbiAgICBYS19ZOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1OSwgLyogVSswMDU5IExBVElOIENBUElUQUwgTEVUVEVSIFkgKi9cbiAgICBYS19aOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA1YSwgLyogVSswMDVBIExBVElOIENBUElUQUwgTEVUVEVSIFogKi9cbiAgICBYS19icmFja2V0bGVmdDogICAgICAgICAgICAgICAgIDB4MDA1YiwgLyogVSswMDVCIExFRlQgU1FVQVJFIEJSQUNLRVQgKi9cbiAgICBYS19iYWNrc2xhc2g6ICAgICAgICAgICAgICAgICAgIDB4MDA1YywgLyogVSswMDVDIFJFVkVSU0UgU09MSURVUyAqL1xuICAgIFhLX2JyYWNrZXRyaWdodDogICAgICAgICAgICAgICAgMHgwMDVkLCAvKiBVKzAwNUQgUklHSFQgU1FVQVJFIEJSQUNLRVQgKi9cbiAgICBYS19hc2NpaWNpcmN1bTogICAgICAgICAgICAgICAgIDB4MDA1ZSwgLyogVSswMDVFIENJUkNVTUZMRVggQUNDRU5UICovXG4gICAgWEtfdW5kZXJzY29yZTogICAgICAgICAgICAgICAgICAweDAwNWYsIC8qIFUrMDA1RiBMT1cgTElORSAqL1xuICAgIFhLX2dyYXZlOiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYwLCAvKiBVKzAwNjAgR1JBVkUgQUNDRU5UICovXG4gICAgWEtfcXVvdGVsZWZ0OiAgICAgICAgICAgICAgICAgICAweDAwNjAsIC8qIGRlcHJlY2F0ZWQgKi9cbiAgICBYS19hOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2MSwgLyogVSswMDYxIExBVElOIFNNQUxMIExFVFRFUiBBICovXG4gICAgWEtfYjogICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjIsIC8qIFUrMDA2MiBMQVRJTiBTTUFMTCBMRVRURVIgQiAqL1xuICAgIFhLX2M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDYzLCAvKiBVKzAwNjMgTEFUSU4gU01BTEwgTEVUVEVSIEMgKi9cbiAgICBYS19kOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2NCwgLyogVSswMDY0IExBVElOIFNNQUxMIExFVFRFUiBEICovXG4gICAgWEtfZTogICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjUsIC8qIFUrMDA2NSBMQVRJTiBTTUFMTCBMRVRURVIgRSAqL1xuICAgIFhLX2Y6ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDY2LCAvKiBVKzAwNjYgTEFUSU4gU01BTEwgTEVUVEVSIEYgKi9cbiAgICBYS19nOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2NywgLyogVSswMDY3IExBVElOIFNNQUxMIExFVFRFUiBHICovXG4gICAgWEtfaDogICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNjgsIC8qIFUrMDA2OCBMQVRJTiBTTUFMTCBMRVRURVIgSCAqL1xuICAgIFhLX2k6ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDY5LCAvKiBVKzAwNjkgTEFUSU4gU01BTEwgTEVUVEVSIEkgKi9cbiAgICBYS19qOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2YSwgLyogVSswMDZBIExBVElOIFNNQUxMIExFVFRFUiBKICovXG4gICAgWEtfazogICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNmIsIC8qIFUrMDA2QiBMQVRJTiBTTUFMTCBMRVRURVIgSyAqL1xuICAgIFhLX2w6ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDZjLCAvKiBVKzAwNkMgTEFUSU4gU01BTEwgTEVUVEVSIEwgKi9cbiAgICBYS19tOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA2ZCwgLyogVSswMDZEIExBVElOIFNNQUxMIExFVFRFUiBNICovXG4gICAgWEtfbjogICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNmUsIC8qIFUrMDA2RSBMQVRJTiBTTUFMTCBMRVRURVIgTiAqL1xuICAgIFhLX286ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDZmLCAvKiBVKzAwNkYgTEFUSU4gU01BTEwgTEVUVEVSIE8gKi9cbiAgICBYS19wOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3MCwgLyogVSswMDcwIExBVElOIFNNQUxMIExFVFRFUiBQICovXG4gICAgWEtfcTogICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzEsIC8qIFUrMDA3MSBMQVRJTiBTTUFMTCBMRVRURVIgUSAqL1xuICAgIFhLX3I6ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDcyLCAvKiBVKzAwNzIgTEFUSU4gU01BTEwgTEVUVEVSIFIgKi9cbiAgICBYS19zOiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3MywgLyogVSswMDczIExBVElOIFNNQUxMIExFVFRFUiBTICovXG4gICAgWEtfdDogICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzQsIC8qIFUrMDA3NCBMQVRJTiBTTUFMTCBMRVRURVIgVCAqL1xuICAgIFhLX3U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDc1LCAvKiBVKzAwNzUgTEFUSU4gU01BTEwgTEVUVEVSIFUgKi9cbiAgICBYS192OiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3NiwgLyogVSswMDc2IExBVElOIFNNQUxMIExFVFRFUiBWICovXG4gICAgWEtfdzogICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNzcsIC8qIFUrMDA3NyBMQVRJTiBTTUFMTCBMRVRURVIgVyAqL1xuICAgIFhLX3g6ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDc4LCAvKiBVKzAwNzggTEFUSU4gU01BTEwgTEVUVEVSIFggKi9cbiAgICBYS195OiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3OSwgLyogVSswMDc5IExBVElOIFNNQUxMIExFVFRFUiBZICovXG4gICAgWEtfejogICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwN2EsIC8qIFUrMDA3QSBMQVRJTiBTTUFMTCBMRVRURVIgWiAqL1xuICAgIFhLX2JyYWNlbGVmdDogICAgICAgICAgICAgICAgICAgMHgwMDdiLCAvKiBVKzAwN0IgTEVGVCBDVVJMWSBCUkFDS0VUICovXG4gICAgWEtfYmFyOiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwN2MsIC8qIFUrMDA3QyBWRVJUSUNBTCBMSU5FICovXG4gICAgWEtfYnJhY2VyaWdodDogICAgICAgICAgICAgICAgICAweDAwN2QsIC8qIFUrMDA3RCBSSUdIVCBDVVJMWSBCUkFDS0VUICovXG4gICAgWEtfYXNjaWl0aWxkZTogICAgICAgICAgICAgICAgICAweDAwN2UsIC8qIFUrMDA3RSBUSUxERSAqL1xuXG4gICAgWEtfbm9icmVha3NwYWNlOiAgICAgICAgICAgICAgICAweDAwYTAsIC8qIFUrMDBBMCBOTy1CUkVBSyBTUEFDRSAqL1xuICAgIFhLX2V4Y2xhbWRvd246ICAgICAgICAgICAgICAgICAgMHgwMGExLCAvKiBVKzAwQTEgSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSyAqL1xuICAgIFhLX2NlbnQ6ICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGEyLCAvKiBVKzAwQTIgQ0VOVCBTSUdOICovXG4gICAgWEtfc3Rlcmxpbmc6ICAgICAgICAgICAgICAgICAgICAweDAwYTMsIC8qIFUrMDBBMyBQT1VORCBTSUdOICovXG4gICAgWEtfY3VycmVuY3k6ICAgICAgICAgICAgICAgICAgICAweDAwYTQsIC8qIFUrMDBBNCBDVVJSRU5DWSBTSUdOICovXG4gICAgWEtfeWVuOiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwYTUsIC8qIFUrMDBBNSBZRU4gU0lHTiAqL1xuICAgIFhLX2Jyb2tlbmJhcjogICAgICAgICAgICAgICAgICAgMHgwMGE2LCAvKiBVKzAwQTYgQlJPS0VOIEJBUiAqL1xuICAgIFhLX3NlY3Rpb246ICAgICAgICAgICAgICAgICAgICAgMHgwMGE3LCAvKiBVKzAwQTcgU0VDVElPTiBTSUdOICovXG4gICAgWEtfZGlhZXJlc2lzOiAgICAgICAgICAgICAgICAgICAweDAwYTgsIC8qIFUrMDBBOCBESUFFUkVTSVMgKi9cbiAgICBYS19jb3B5cmlnaHQ6ICAgICAgICAgICAgICAgICAgIDB4MDBhOSwgLyogVSswMEE5IENPUFlSSUdIVCBTSUdOICovXG4gICAgWEtfb3JkZmVtaW5pbmU6ICAgICAgICAgICAgICAgICAweDAwYWEsIC8qIFUrMDBBQSBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUiAqL1xuICAgIFhLX2d1aWxsZW1vdGxlZnQ6ICAgICAgICAgICAgICAgMHgwMGFiLCAvKiBVKzAwQUIgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksgKi9cbiAgICBYS19ub3RzaWduOiAgICAgICAgICAgICAgICAgICAgIDB4MDBhYywgLyogVSswMEFDIE5PVCBTSUdOICovXG4gICAgWEtfaHlwaGVuOiAgICAgICAgICAgICAgICAgICAgICAweDAwYWQsIC8qIFUrMDBBRCBTT0ZUIEhZUEhFTiAqL1xuICAgIFhLX3JlZ2lzdGVyZWQ6ICAgICAgICAgICAgICAgICAgMHgwMGFlLCAvKiBVKzAwQUUgUkVHSVNURVJFRCBTSUdOICovXG4gICAgWEtfbWFjcm9uOiAgICAgICAgICAgICAgICAgICAgICAweDAwYWYsIC8qIFUrMDBBRiBNQUNST04gKi9cbiAgICBYS19kZWdyZWU6ICAgICAgICAgICAgICAgICAgICAgIDB4MDBiMCwgLyogVSswMEIwIERFR1JFRSBTSUdOICovXG4gICAgWEtfcGx1c21pbnVzOiAgICAgICAgICAgICAgICAgICAweDAwYjEsIC8qIFUrMDBCMSBQTFVTLU1JTlVTIFNJR04gKi9cbiAgICBYS190d29zdXBlcmlvcjogICAgICAgICAgICAgICAgIDB4MDBiMiwgLyogVSswMEIyIFNVUEVSU0NSSVBUIFRXTyAqL1xuICAgIFhLX3RocmVlc3VwZXJpb3I6ICAgICAgICAgICAgICAgMHgwMGIzLCAvKiBVKzAwQjMgU1VQRVJTQ1JJUFQgVEhSRUUgKi9cbiAgICBYS19hY3V0ZTogICAgICAgICAgICAgICAgICAgICAgIDB4MDBiNCwgLyogVSswMEI0IEFDVVRFIEFDQ0VOVCAqL1xuICAgIFhLX211OiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGI1LCAvKiBVKzAwQjUgTUlDUk8gU0lHTiAqL1xuICAgIFhLX3BhcmFncmFwaDogICAgICAgICAgICAgICAgICAgMHgwMGI2LCAvKiBVKzAwQjYgUElMQ1JPVyBTSUdOICovXG4gICAgWEtfcGVyaW9kY2VudGVyZWQ6ICAgICAgICAgICAgICAweDAwYjcsIC8qIFUrMDBCNyBNSURETEUgRE9UICovXG4gICAgWEtfY2VkaWxsYTogICAgICAgICAgICAgICAgICAgICAweDAwYjgsIC8qIFUrMDBCOCBDRURJTExBICovXG4gICAgWEtfb25lc3VwZXJpb3I6ICAgICAgICAgICAgICAgICAweDAwYjksIC8qIFUrMDBCOSBTVVBFUlNDUklQVCBPTkUgKi9cbiAgICBYS19tYXNjdWxpbmU6ICAgICAgICAgICAgICAgICAgIDB4MDBiYSwgLyogVSswMEJBIE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUiAqL1xuICAgIFhLX2d1aWxsZW1vdHJpZ2h0OiAgICAgICAgICAgICAgMHgwMGJiLCAvKiBVKzAwQkIgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLICovXG4gICAgWEtfb25lcXVhcnRlcjogICAgICAgICAgICAgICAgICAweDAwYmMsIC8qIFUrMDBCQyBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIgKi9cbiAgICBYS19vbmVoYWxmOiAgICAgICAgICAgICAgICAgICAgIDB4MDBiZCwgLyogVSswMEJEIFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRiAqL1xuICAgIFhLX3RocmVlcXVhcnRlcnM6ICAgICAgICAgICAgICAgMHgwMGJlLCAvKiBVKzAwQkUgVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTICovXG4gICAgWEtfcXVlc3Rpb25kb3duOiAgICAgICAgICAgICAgICAweDAwYmYsIC8qIFUrMDBCRiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLICovXG4gICAgWEtfQWdyYXZlOiAgICAgICAgICAgICAgICAgICAgICAweDAwYzAsIC8qIFUrMDBDMCBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUgKi9cbiAgICBYS19BYWN1dGU6ICAgICAgICAgICAgICAgICAgICAgIDB4MDBjMSwgLyogVSswMEMxIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURSAqL1xuICAgIFhLX0FjaXJjdW1mbGV4OiAgICAgICAgICAgICAgICAgMHgwMGMyLCAvKiBVKzAwQzIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVggKi9cbiAgICBYS19BdGlsZGU6ICAgICAgICAgICAgICAgICAgICAgIDB4MDBjMywgLyogVSswMEMzIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERSAqL1xuICAgIFhLX0FkaWFlcmVzaXM6ICAgICAgICAgICAgICAgICAgMHgwMGM0LCAvKiBVKzAwQzQgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUyAqL1xuICAgIFhLX0FyaW5nOiAgICAgICAgICAgICAgICAgICAgICAgMHgwMGM1LCAvKiBVKzAwQzUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUgKi9cbiAgICBYS19BRTogICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBjNiwgLyogVSswMEM2IExBVElOIENBUElUQUwgTEVUVEVSIEFFICovXG4gICAgWEtfQ2NlZGlsbGE6ICAgICAgICAgICAgICAgICAgICAweDAwYzcsIC8qIFUrMDBDNyBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQSAqL1xuICAgIFhLX0VncmF2ZTogICAgICAgICAgICAgICAgICAgICAgMHgwMGM4LCAvKiBVKzAwQzggTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFICovXG4gICAgWEtfRWFjdXRlOiAgICAgICAgICAgICAgICAgICAgICAweDAwYzksIC8qIFUrMDBDOSBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUgKi9cbiAgICBYS19FY2lyY3VtZmxleDogICAgICAgICAgICAgICAgIDB4MDBjYSwgLyogVSswMENBIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYICovXG4gICAgWEtfRWRpYWVyZXNpczogICAgICAgICAgICAgICAgICAweDAwY2IsIC8qIFUrMDBDQiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTICovXG4gICAgWEtfSWdyYXZlOiAgICAgICAgICAgICAgICAgICAgICAweDAwY2MsIC8qIFUrMDBDQyBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUgKi9cbiAgICBYS19JYWN1dGU6ICAgICAgICAgICAgICAgICAgICAgIDB4MDBjZCwgLyogVSswMENEIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURSAqL1xuICAgIFhLX0ljaXJjdW1mbGV4OiAgICAgICAgICAgICAgICAgMHgwMGNlLCAvKiBVKzAwQ0UgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVggKi9cbiAgICBYS19JZGlhZXJlc2lzOiAgICAgICAgICAgICAgICAgIDB4MDBjZiwgLyogVSswMENGIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMgKi9cbiAgICBYS19FVEg6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBkMCwgLyogVSswMEQwIExBVElOIENBUElUQUwgTEVUVEVSIEVUSCAqL1xuICAgIFhLX0V0aDogICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGQwLCAvKiBkZXByZWNhdGVkICovXG4gICAgWEtfTnRpbGRlOiAgICAgICAgICAgICAgICAgICAgICAweDAwZDEsIC8qIFUrMDBEMSBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUgKi9cbiAgICBYS19PZ3JhdmU6ICAgICAgICAgICAgICAgICAgICAgIDB4MDBkMiwgLyogVSswMEQyIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRSAqL1xuICAgIFhLX09hY3V0ZTogICAgICAgICAgICAgICAgICAgICAgMHgwMGQzLCAvKiBVKzAwRDMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFICovXG4gICAgWEtfT2NpcmN1bWZsZXg6ICAgICAgICAgICAgICAgICAweDAwZDQsIC8qIFUrMDBENCBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCAqL1xuICAgIFhLX090aWxkZTogICAgICAgICAgICAgICAgICAgICAgMHgwMGQ1LCAvKiBVKzAwRDUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFICovXG4gICAgWEtfT2RpYWVyZXNpczogICAgICAgICAgICAgICAgICAweDAwZDYsIC8qIFUrMDBENiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTICovXG4gICAgWEtfbXVsdGlwbHk6ICAgICAgICAgICAgICAgICAgICAweDAwZDcsIC8qIFUrMDBENyBNVUxUSVBMSUNBVElPTiBTSUdOICovXG4gICAgWEtfT3NsYXNoOiAgICAgICAgICAgICAgICAgICAgICAweDAwZDgsIC8qIFUrMDBEOCBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFICovXG4gICAgWEtfT29ibGlxdWU6ICAgICAgICAgICAgICAgICAgICAweDAwZDgsIC8qIFUrMDBEOCBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFICovXG4gICAgWEtfVWdyYXZlOiAgICAgICAgICAgICAgICAgICAgICAweDAwZDksIC8qIFUrMDBEOSBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUgKi9cbiAgICBYS19VYWN1dGU6ICAgICAgICAgICAgICAgICAgICAgIDB4MDBkYSwgLyogVSswMERBIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURSAqL1xuICAgIFhLX1VjaXJjdW1mbGV4OiAgICAgICAgICAgICAgICAgMHgwMGRiLCAvKiBVKzAwREIgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVggKi9cbiAgICBYS19VZGlhZXJlc2lzOiAgICAgICAgICAgICAgICAgIDB4MDBkYywgLyogVSswMERDIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMgKi9cbiAgICBYS19ZYWN1dGU6ICAgICAgICAgICAgICAgICAgICAgIDB4MDBkZCwgLyogVSswMEREIExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURSAqL1xuICAgIFhLX1RIT1JOOiAgICAgICAgICAgICAgICAgICAgICAgMHgwMGRlLCAvKiBVKzAwREUgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVEhPUk4gKi9cbiAgICBYS19UaG9ybjogICAgICAgICAgICAgICAgICAgICAgIDB4MDBkZSwgLyogZGVwcmVjYXRlZCAqL1xuICAgIFhLX3NzaGFycDogICAgICAgICAgICAgICAgICAgICAgMHgwMGRmLCAvKiBVKzAwREYgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMgKi9cbiAgICBYS19hZ3JhdmU6ICAgICAgICAgICAgICAgICAgICAgIDB4MDBlMCwgLyogVSswMEUwIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUgKi9cbiAgICBYS19hYWN1dGU6ICAgICAgICAgICAgICAgICAgICAgIDB4MDBlMSwgLyogVSswMEUxIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUgKi9cbiAgICBYS19hY2lyY3VtZmxleDogICAgICAgICAgICAgICAgIDB4MDBlMiwgLyogVSswMEUyIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWCAqL1xuICAgIFhLX2F0aWxkZTogICAgICAgICAgICAgICAgICAgICAgMHgwMGUzLCAvKiBVKzAwRTMgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERSAqL1xuICAgIFhLX2FkaWFlcmVzaXM6ICAgICAgICAgICAgICAgICAgMHgwMGU0LCAvKiBVKzAwRTQgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMgKi9cbiAgICBYS19hcmluZzogICAgICAgICAgICAgICAgICAgICAgIDB4MDBlNSwgLyogVSswMEU1IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRSAqL1xuICAgIFhLX2FlOiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGU2LCAvKiBVKzAwRTYgTEFUSU4gU01BTEwgTEVUVEVSIEFFICovXG4gICAgWEtfY2NlZGlsbGE6ICAgICAgICAgICAgICAgICAgICAweDAwZTcsIC8qIFUrMDBFNyBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEgKi9cbiAgICBYS19lZ3JhdmU6ICAgICAgICAgICAgICAgICAgICAgIDB4MDBlOCwgLyogVSswMEU4IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUgKi9cbiAgICBYS19lYWN1dGU6ICAgICAgICAgICAgICAgICAgICAgIDB4MDBlOSwgLyogVSswMEU5IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUgKi9cbiAgICBYS19lY2lyY3VtZmxleDogICAgICAgICAgICAgICAgIDB4MDBlYSwgLyogVSswMEVBIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWCAqL1xuICAgIFhLX2VkaWFlcmVzaXM6ICAgICAgICAgICAgICAgICAgMHgwMGViLCAvKiBVKzAwRUIgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMgKi9cbiAgICBYS19pZ3JhdmU6ICAgICAgICAgICAgICAgICAgICAgIDB4MDBlYywgLyogVSswMEVDIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUgKi9cbiAgICBYS19pYWN1dGU6ICAgICAgICAgICAgICAgICAgICAgIDB4MDBlZCwgLyogVSswMEVEIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUgKi9cbiAgICBYS19pY2lyY3VtZmxleDogICAgICAgICAgICAgICAgIDB4MDBlZSwgLyogVSswMEVFIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWCAqL1xuICAgIFhLX2lkaWFlcmVzaXM6ICAgICAgICAgICAgICAgICAgMHgwMGVmLCAvKiBVKzAwRUYgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMgKi9cbiAgICBYS19ldGg6ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBmMCwgLyogVSswMEYwIExBVElOIFNNQUxMIExFVFRFUiBFVEggKi9cbiAgICBYS19udGlsZGU6ICAgICAgICAgICAgICAgICAgICAgIDB4MDBmMSwgLyogVSswMEYxIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUgKi9cbiAgICBYS19vZ3JhdmU6ICAgICAgICAgICAgICAgICAgICAgIDB4MDBmMiwgLyogVSswMEYyIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUgKi9cbiAgICBYS19vYWN1dGU6ICAgICAgICAgICAgICAgICAgICAgIDB4MDBmMywgLyogVSswMEYzIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUgKi9cbiAgICBYS19vY2lyY3VtZmxleDogICAgICAgICAgICAgICAgIDB4MDBmNCwgLyogVSswMEY0IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWCAqL1xuICAgIFhLX290aWxkZTogICAgICAgICAgICAgICAgICAgICAgMHgwMGY1LCAvKiBVKzAwRjUgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERSAqL1xuICAgIFhLX29kaWFlcmVzaXM6ICAgICAgICAgICAgICAgICAgMHgwMGY2LCAvKiBVKzAwRjYgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMgKi9cbiAgICBYS19kaXZpc2lvbjogICAgICAgICAgICAgICAgICAgIDB4MDBmNywgLyogVSswMEY3IERJVklTSU9OIFNJR04gKi9cbiAgICBYS19vc2xhc2g6ICAgICAgICAgICAgICAgICAgICAgIDB4MDBmOCwgLyogVSswMEY4IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFICovXG4gICAgWEtfb29ibGlxdWU6ICAgICAgICAgICAgICAgICAgICAweDAwZjgsIC8qIFUrMDBGOCBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRSAqL1xuICAgIFhLX3VncmF2ZTogICAgICAgICAgICAgICAgICAgICAgMHgwMGY5LCAvKiBVKzAwRjkgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRSAqL1xuICAgIFhLX3VhY3V0ZTogICAgICAgICAgICAgICAgICAgICAgMHgwMGZhLCAvKiBVKzAwRkEgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURSAqL1xuICAgIFhLX3VjaXJjdW1mbGV4OiAgICAgICAgICAgICAgICAgMHgwMGZiLCAvKiBVKzAwRkIgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYICovXG4gICAgWEtfdWRpYWVyZXNpczogICAgICAgICAgICAgICAgICAweDAwZmMsIC8qIFUrMDBGQyBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUyAqL1xuICAgIFhLX3lhY3V0ZTogICAgICAgICAgICAgICAgICAgICAgMHgwMGZkLCAvKiBVKzAwRkQgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURSAqL1xuICAgIFhLX3Rob3JuOiAgICAgICAgICAgICAgICAgICAgICAgMHgwMGZlLCAvKiBVKzAwRkUgTEFUSU4gU01BTEwgTEVUVEVSIFRIT1JOICovXG4gICAgWEtfeWRpYWVyZXNpczogICAgICAgICAgICAgICAgICAweDAwZmYsIC8qIFUrMDBGRiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUyAqL1xufTtcblxuZXhwb3J0IGRlZmF1bHQgS2V5VGFibGU7XG4iLCIvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIG1hcHBpbmdzIGZyb20gVW5pY29kZSBjb2RlcG9pbnRzIHRvIHRoZSBrZXlzeW0gdmFsdWVzXG4vLyAoYW5kIG9wdGlvbmFsbHksIGtleSBuYW1lcykgZXhwZWN0ZWQgYnkgdGhlIFJGQiBwcm90b2NvbFxuLy8gSG93IHRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkOlxuLy8gbm9kZSAvVXNlcnMvamFsZi9kZXYvbWkvbm92bmMvdXRpbHMvcGFyc2UuanMgL29wdC9YMTEvaW5jbHVkZS9YMTEva2V5c3ltZGVmLmhcblxudmFyIGtleXN5bXMgPSAoZnVuY3Rpb24oKXtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICB2YXIga2V5bmFtZXMgPSBudWxsO1xuICAgIHZhciBjb2RlcG9pbnRzID0ge1wiMzJcIjozMixcIjMzXCI6MzMsXCIzNFwiOjM0LFwiMzVcIjozNSxcIjM2XCI6MzYsXCIzN1wiOjM3LFwiMzhcIjozOCxcIjM5XCI6MzksXCI0MFwiOjQwLFwiNDFcIjo0MSxcIjQyXCI6NDIsXCI0M1wiOjQzLFwiNDRcIjo0NCxcIjQ1XCI6NDUsXCI0NlwiOjQ2LFwiNDdcIjo0NyxcIjQ4XCI6NDgsXCI0OVwiOjQ5LFwiNTBcIjo1MCxcIjUxXCI6NTEsXCI1MlwiOjUyLFwiNTNcIjo1MyxcIjU0XCI6NTQsXCI1NVwiOjU1LFwiNTZcIjo1NixcIjU3XCI6NTcsXCI1OFwiOjU4LFwiNTlcIjo1OSxcIjYwXCI6NjAsXCI2MVwiOjYxLFwiNjJcIjo2MixcIjYzXCI6NjMsXCI2NFwiOjY0LFwiNjVcIjo2NSxcIjY2XCI6NjYsXCI2N1wiOjY3LFwiNjhcIjo2OCxcIjY5XCI6NjksXCI3MFwiOjcwLFwiNzFcIjo3MSxcIjcyXCI6NzIsXCI3M1wiOjczLFwiNzRcIjo3NCxcIjc1XCI6NzUsXCI3NlwiOjc2LFwiNzdcIjo3NyxcIjc4XCI6NzgsXCI3OVwiOjc5LFwiODBcIjo4MCxcIjgxXCI6ODEsXCI4MlwiOjgyLFwiODNcIjo4MyxcIjg0XCI6ODQsXCI4NVwiOjg1LFwiODZcIjo4NixcIjg3XCI6ODcsXCI4OFwiOjg4LFwiODlcIjo4OSxcIjkwXCI6OTAsXCI5MVwiOjkxLFwiOTJcIjo5MixcIjkzXCI6OTMsXCI5NFwiOjk0LFwiOTVcIjo5NSxcIjk2XCI6OTYsXCI5N1wiOjk3LFwiOThcIjo5OCxcIjk5XCI6OTksXCIxMDBcIjoxMDAsXCIxMDFcIjoxMDEsXCIxMDJcIjoxMDIsXCIxMDNcIjoxMDMsXCIxMDRcIjoxMDQsXCIxMDVcIjoxMDUsXCIxMDZcIjoxMDYsXCIxMDdcIjoxMDcsXCIxMDhcIjoxMDgsXCIxMDlcIjoxMDksXCIxMTBcIjoxMTAsXCIxMTFcIjoxMTEsXCIxMTJcIjoxMTIsXCIxMTNcIjoxMTMsXCIxMTRcIjoxMTQsXCIxMTVcIjoxMTUsXCIxMTZcIjoxMTYsXCIxMTdcIjoxMTcsXCIxMThcIjoxMTgsXCIxMTlcIjoxMTksXCIxMjBcIjoxMjAsXCIxMjFcIjoxMjEsXCIxMjJcIjoxMjIsXCIxMjNcIjoxMjMsXCIxMjRcIjoxMjQsXCIxMjVcIjoxMjUsXCIxMjZcIjoxMjYsXCIxNjBcIjoxNjAsXCIxNjFcIjoxNjEsXCIxNjJcIjoxNjIsXCIxNjNcIjoxNjMsXCIxNjRcIjoxNjQsXCIxNjVcIjoxNjUsXCIxNjZcIjoxNjYsXCIxNjdcIjoxNjcsXCIxNjhcIjoxNjgsXCIxNjlcIjoxNjksXCIxNzBcIjoxNzAsXCIxNzFcIjoxNzEsXCIxNzJcIjoxNzIsXCIxNzNcIjoxNzMsXCIxNzRcIjoxNzQsXCIxNzVcIjoxNzUsXCIxNzZcIjoxNzYsXCIxNzdcIjoxNzcsXCIxNzhcIjoxNzgsXCIxNzlcIjoxNzksXCIxODBcIjoxODAsXCIxODFcIjoxODEsXCIxODJcIjoxODIsXCIxODNcIjoxODMsXCIxODRcIjoxODQsXCIxODVcIjoxODUsXCIxODZcIjoxODYsXCIxODdcIjoxODcsXCIxODhcIjoxODgsXCIxODlcIjoxODksXCIxOTBcIjoxOTAsXCIxOTFcIjoxOTEsXCIxOTJcIjoxOTIsXCIxOTNcIjoxOTMsXCIxOTRcIjoxOTQsXCIxOTVcIjoxOTUsXCIxOTZcIjoxOTYsXCIxOTdcIjoxOTcsXCIxOThcIjoxOTgsXCIxOTlcIjoxOTksXCIyMDBcIjoyMDAsXCIyMDFcIjoyMDEsXCIyMDJcIjoyMDIsXCIyMDNcIjoyMDMsXCIyMDRcIjoyMDQsXCIyMDVcIjoyMDUsXCIyMDZcIjoyMDYsXCIyMDdcIjoyMDcsXCIyMDhcIjoyMDgsXCIyMDlcIjoyMDksXCIyMTBcIjoyMTAsXCIyMTFcIjoyMTEsXCIyMTJcIjoyMTIsXCIyMTNcIjoyMTMsXCIyMTRcIjoyMTQsXCIyMTVcIjoyMTUsXCIyMTZcIjoyMTYsXCIyMTdcIjoyMTcsXCIyMThcIjoyMTgsXCIyMTlcIjoyMTksXCIyMjBcIjoyMjAsXCIyMjFcIjoyMjEsXCIyMjJcIjoyMjIsXCIyMjNcIjoyMjMsXCIyMjRcIjoyMjQsXCIyMjVcIjoyMjUsXCIyMjZcIjoyMjYsXCIyMjdcIjoyMjcsXCIyMjhcIjoyMjgsXCIyMjlcIjoyMjksXCIyMzBcIjoyMzAsXCIyMzFcIjoyMzEsXCIyMzJcIjoyMzIsXCIyMzNcIjoyMzMsXCIyMzRcIjoyMzQsXCIyMzVcIjoyMzUsXCIyMzZcIjoyMzYsXCIyMzdcIjoyMzcsXCIyMzhcIjoyMzgsXCIyMzlcIjoyMzksXCIyNDBcIjoyNDAsXCIyNDFcIjoyNDEsXCIyNDJcIjoyNDIsXCIyNDNcIjoyNDMsXCIyNDRcIjoyNDQsXCIyNDVcIjoyNDUsXCIyNDZcIjoyNDYsXCIyNDdcIjoyNDcsXCIyNDhcIjoyNDgsXCIyNDlcIjoyNDksXCIyNTBcIjoyNTAsXCIyNTFcIjoyNTEsXCIyNTJcIjoyNTIsXCIyNTNcIjoyNTMsXCIyNTRcIjoyNTQsXCIyNTVcIjoyNTUsXCIyNTZcIjo5NjAsXCIyNTdcIjo5OTIsXCIyNThcIjo0NTEsXCIyNTlcIjo0ODMsXCIyNjBcIjo0MTcsXCIyNjFcIjo0MzMsXCIyNjJcIjo0NTQsXCIyNjNcIjo0ODYsXCIyNjRcIjo3MTAsXCIyNjVcIjo3NDIsXCIyNjZcIjo3MDksXCIyNjdcIjo3NDEsXCIyNjhcIjo0NTYsXCIyNjlcIjo0ODgsXCIyNzBcIjo0NjMsXCIyNzFcIjo0OTUsXCIyNzJcIjo0NjQsXCIyNzNcIjo0OTYsXCIyNzRcIjo5MzgsXCIyNzVcIjo5NTQsXCIyNzhcIjo5NzIsXCIyNzlcIjoxMDA0LFwiMjgwXCI6NDU4LFwiMjgxXCI6NDkwLFwiMjgyXCI6NDYwLFwiMjgzXCI6NDkyLFwiMjg0XCI6NzI4LFwiMjg1XCI6NzYwLFwiMjg2XCI6NjgzLFwiMjg3XCI6Njk5LFwiMjg4XCI6NzI1LFwiMjg5XCI6NzU3LFwiMjkwXCI6OTM5LFwiMjkxXCI6OTU1LFwiMjkyXCI6Njc4LFwiMjkzXCI6Njk0LFwiMjk0XCI6NjczLFwiMjk1XCI6Njg5LFwiMjk2XCI6OTMzLFwiMjk3XCI6OTQ5LFwiMjk4XCI6OTc1LFwiMjk5XCI6MTAwNyxcIjMwMFwiOjE2Nzc3NTE2LFwiMzAxXCI6MTY3Nzc1MTcsXCIzMDJcIjo5NjcsXCIzMDNcIjo5OTksXCIzMDRcIjo2ODEsXCIzMDVcIjo2OTcsXCIzMDhcIjo2ODQsXCIzMDlcIjo3MDAsXCIzMTBcIjo5NzksXCIzMTFcIjoxMDExLFwiMzEyXCI6OTMwLFwiMzEzXCI6NDUzLFwiMzE0XCI6NDg1LFwiMzE1XCI6OTM0LFwiMzE2XCI6OTUwLFwiMzE3XCI6NDIxLFwiMzE4XCI6NDM3LFwiMzIxXCI6NDE5LFwiMzIyXCI6NDM1LFwiMzIzXCI6NDY1LFwiMzI0XCI6NDk3LFwiMzI1XCI6OTc3LFwiMzI2XCI6MTAwOSxcIjMyN1wiOjQ2NixcIjMyOFwiOjQ5OCxcIjMzMFwiOjk1NyxcIjMzMVwiOjk1OSxcIjMzMlwiOjk3OCxcIjMzM1wiOjEwMTAsXCIzMzZcIjo0NjksXCIzMzdcIjo1MDEsXCIzMzhcIjo1MDUyLFwiMzM5XCI6NTA1MyxcIjM0MFwiOjQ0OCxcIjM0MVwiOjQ4MCxcIjM0MlwiOjkzMSxcIjM0M1wiOjk0NyxcIjM0NFwiOjQ3MixcIjM0NVwiOjUwNCxcIjM0NlwiOjQyMixcIjM0N1wiOjQzOCxcIjM0OFwiOjczNCxcIjM0OVwiOjc2NixcIjM1MFwiOjQyNixcIjM1MVwiOjQ0MixcIjM1MlwiOjQyNSxcIjM1M1wiOjQ0MSxcIjM1NFwiOjQ3OCxcIjM1NVwiOjUxMCxcIjM1NlwiOjQyNyxcIjM1N1wiOjQ0MyxcIjM1OFwiOjk0MCxcIjM1OVwiOjk1NixcIjM2MFwiOjk4OSxcIjM2MVwiOjEwMjEsXCIzNjJcIjo5OTAsXCIzNjNcIjoxMDIyLFwiMzY0XCI6NzMzLFwiMzY1XCI6NzY1LFwiMzY2XCI6NDczLFwiMzY3XCI6NTA1LFwiMzY4XCI6NDc1LFwiMzY5XCI6NTA3LFwiMzcwXCI6OTg1LFwiMzcxXCI6MTAxNyxcIjM3MlwiOjE2Nzc3NTg4LFwiMzczXCI6MTY3Nzc1ODksXCIzNzRcIjoxNjc3NzU5MCxcIjM3NVwiOjE2Nzc3NTkxLFwiMzc2XCI6NTA1NCxcIjM3N1wiOjQyOCxcIjM3OFwiOjQ0NCxcIjM3OVwiOjQzMSxcIjM4MFwiOjQ0NyxcIjM4MVwiOjQzMCxcIjM4MlwiOjQ0NixcIjM5OVwiOjE2Nzc3NjE1LFwiNDAyXCI6MjI5NCxcIjQxNVwiOjE2Nzc3NjMxLFwiNDE2XCI6MTY3Nzc2MzIsXCI0MTdcIjoxNjc3NzYzMyxcIjQzMVwiOjE2Nzc3NjQ3LFwiNDMyXCI6MTY3Nzc2NDgsXCI0MzdcIjoxNjc3NzY1MyxcIjQzOFwiOjE2Nzc3NjU0LFwiNDM5XCI6MTY3Nzc2NTUsXCI0NjZcIjoxNjc3NzY4MSxcIjQ4NlwiOjE2Nzc3NzAyLFwiNDg3XCI6MTY3Nzc3MDMsXCI2MDFcIjoxNjc3NzgxNyxcIjYyOVwiOjE2Nzc3ODQ1LFwiNjU4XCI6MTY3Nzc4NzQsXCI3MTFcIjo0MzksXCI3MjhcIjo0MTgsXCI3MjlcIjo1MTEsXCI3MzFcIjo0MzQsXCI3MzNcIjo0NDUsXCI5MDFcIjoxOTY2LFwiOTAyXCI6MTk1MyxcIjkwNFwiOjE5NTQsXCI5MDVcIjoxOTU1LFwiOTA2XCI6MTk1NixcIjkwOFwiOjE5NTksXCI5MTBcIjoxOTYwLFwiOTExXCI6MTk2MyxcIjkxMlwiOjE5NzQsXCI5MTNcIjoxOTg1LFwiOTE0XCI6MTk4NixcIjkxNVwiOjE5ODcsXCI5MTZcIjoxOTg4LFwiOTE3XCI6MTk4OSxcIjkxOFwiOjE5OTAsXCI5MTlcIjoxOTkxLFwiOTIwXCI6MTk5MixcIjkyMVwiOjE5OTMsXCI5MjJcIjoxOTk0LFwiOTIzXCI6MTk5NSxcIjkyNFwiOjE5OTYsXCI5MjVcIjoxOTk3LFwiOTI2XCI6MTk5OCxcIjkyN1wiOjE5OTksXCI5MjhcIjoyMDAwLFwiOTI5XCI6MjAwMSxcIjkzMVwiOjIwMDIsXCI5MzJcIjoyMDA0LFwiOTMzXCI6MjAwNSxcIjkzNFwiOjIwMDYsXCI5MzVcIjoyMDA3LFwiOTM2XCI6MjAwOCxcIjkzN1wiOjIwMDksXCI5MzhcIjoxOTU3LFwiOTM5XCI6MTk2MSxcIjk0MFwiOjE5NjksXCI5NDFcIjoxOTcwLFwiOTQyXCI6MTk3MSxcIjk0M1wiOjE5NzIsXCI5NDRcIjoxOTc4LFwiOTQ1XCI6MjAxNyxcIjk0NlwiOjIwMTgsXCI5NDdcIjoyMDE5LFwiOTQ4XCI6MjAyMCxcIjk0OVwiOjIwMjEsXCI5NTBcIjoyMDIyLFwiOTUxXCI6MjAyMyxcIjk1MlwiOjIwMjQsXCI5NTNcIjoyMDI1LFwiOTU0XCI6MjAyNixcIjk1NVwiOjIwMjcsXCI5NTZcIjoyMDI4LFwiOTU3XCI6MjAyOSxcIjk1OFwiOjIwMzAsXCI5NTlcIjoyMDMxLFwiOTYwXCI6MjAzMixcIjk2MVwiOjIwMzMsXCI5NjJcIjoyMDM1LFwiOTYzXCI6MjAzNCxcIjk2NFwiOjIwMzYsXCI5NjVcIjoyMDM3LFwiOTY2XCI6MjAzOCxcIjk2N1wiOjIwMzksXCI5NjhcIjoyMDQwLFwiOTY5XCI6MjA0MSxcIjk3MFwiOjE5NzMsXCI5NzFcIjoxOTc3LFwiOTcyXCI6MTk3NSxcIjk3M1wiOjE5NzYsXCI5NzRcIjoxOTc5LFwiMTAyNVwiOjE3MTUsXCIxMDI2XCI6MTcxMyxcIjEwMjdcIjoxNzE0LFwiMTAyOFwiOjE3MTYsXCIxMDI5XCI6MTcxNyxcIjEwMzBcIjoxNzE4LFwiMTAzMVwiOjE3MTksXCIxMDMyXCI6MTcyMCxcIjEwMzNcIjoxNzIxLFwiMTAzNFwiOjE3MjIsXCIxMDM1XCI6MTcyMyxcIjEwMzZcIjoxNzI0LFwiMTAzOFwiOjE3MjYsXCIxMDM5XCI6MTcyNyxcIjEwNDBcIjoxNzYxLFwiMTA0MVwiOjE3NjIsXCIxMDQyXCI6MTc4MyxcIjEwNDNcIjoxNzY3LFwiMTA0NFwiOjE3NjQsXCIxMDQ1XCI6MTc2NSxcIjEwNDZcIjoxNzgyLFwiMTA0N1wiOjE3ODYsXCIxMDQ4XCI6MTc2OSxcIjEwNDlcIjoxNzcwLFwiMTA1MFwiOjE3NzEsXCIxMDUxXCI6MTc3MixcIjEwNTJcIjoxNzczLFwiMTA1M1wiOjE3NzQsXCIxMDU0XCI6MTc3NSxcIjEwNTVcIjoxNzc2LFwiMTA1NlwiOjE3NzgsXCIxMDU3XCI6MTc3OSxcIjEwNThcIjoxNzgwLFwiMTA1OVwiOjE3ODEsXCIxMDYwXCI6MTc2NixcIjEwNjFcIjoxNzY4LFwiMTA2MlwiOjE3NjMsXCIxMDYzXCI6MTc5MCxcIjEwNjRcIjoxNzg3LFwiMTA2NVwiOjE3ODksXCIxMDY2XCI6MTc5MSxcIjEwNjdcIjoxNzg1LFwiMTA2OFwiOjE3ODQsXCIxMDY5XCI6MTc4OCxcIjEwNzBcIjoxNzYwLFwiMTA3MVwiOjE3NzcsXCIxMDcyXCI6MTcyOSxcIjEwNzNcIjoxNzMwLFwiMTA3NFwiOjE3NTEsXCIxMDc1XCI6MTczNSxcIjEwNzZcIjoxNzMyLFwiMTA3N1wiOjE3MzMsXCIxMDc4XCI6MTc1MCxcIjEwNzlcIjoxNzU0LFwiMTA4MFwiOjE3MzcsXCIxMDgxXCI6MTczOCxcIjEwODJcIjoxNzM5LFwiMTA4M1wiOjE3NDAsXCIxMDg0XCI6MTc0MSxcIjEwODVcIjoxNzQyLFwiMTA4NlwiOjE3NDMsXCIxMDg3XCI6MTc0NCxcIjEwODhcIjoxNzQ2LFwiMTA4OVwiOjE3NDcsXCIxMDkwXCI6MTc0OCxcIjEwOTFcIjoxNzQ5LFwiMTA5MlwiOjE3MzQsXCIxMDkzXCI6MTczNixcIjEwOTRcIjoxNzMxLFwiMTA5NVwiOjE3NTgsXCIxMDk2XCI6MTc1NSxcIjEwOTdcIjoxNzU3LFwiMTA5OFwiOjE3NTksXCIxMDk5XCI6MTc1MyxcIjExMDBcIjoxNzUyLFwiMTEwMVwiOjE3NTYsXCIxMTAyXCI6MTcyOCxcIjExMDNcIjoxNzQ1LFwiMTEwNVwiOjE2OTksXCIxMTA2XCI6MTY5NyxcIjExMDdcIjoxNjk4LFwiMTEwOFwiOjE3MDAsXCIxMTA5XCI6MTcwMSxcIjExMTBcIjoxNzAyLFwiMTExMVwiOjE3MDMsXCIxMTEyXCI6MTcwNCxcIjExMTNcIjoxNzA1LFwiMTExNFwiOjE3MDYsXCIxMTE1XCI6MTcwNyxcIjExMTZcIjoxNzA4LFwiMTExOFwiOjE3MTAsXCIxMTE5XCI6MTcxMSxcIjExNjhcIjoxNzI1LFwiMTE2OVwiOjE3MDksXCIxMTcwXCI6MTY3NzgzODYsXCIxMTcxXCI6MTY3NzgzODcsXCIxMTc0XCI6MTY3NzgzOTAsXCIxMTc1XCI6MTY3NzgzOTEsXCIxMTc4XCI6MTY3NzgzOTQsXCIxMTc5XCI6MTY3NzgzOTUsXCIxMTgwXCI6MTY3NzgzOTYsXCIxMTgxXCI6MTY3NzgzOTcsXCIxMTg2XCI6MTY3Nzg0MDIsXCIxMTg3XCI6MTY3Nzg0MDMsXCIxMTk4XCI6MTY3Nzg0MTQsXCIxMTk5XCI6MTY3Nzg0MTUsXCIxMjAwXCI6MTY3Nzg0MTYsXCIxMjAxXCI6MTY3Nzg0MTcsXCIxMjAyXCI6MTY3Nzg0MTgsXCIxMjAzXCI6MTY3Nzg0MTksXCIxMjA2XCI6MTY3Nzg0MjIsXCIxMjA3XCI6MTY3Nzg0MjMsXCIxMjA4XCI6MTY3Nzg0MjQsXCIxMjA5XCI6MTY3Nzg0MjUsXCIxMjEwXCI6MTY3Nzg0MjYsXCIxMjExXCI6MTY3Nzg0MjcsXCIxMjQwXCI6MTY3Nzg0NTYsXCIxMjQxXCI6MTY3Nzg0NTcsXCIxMjUwXCI6MTY3Nzg0NjYsXCIxMjUxXCI6MTY3Nzg0NjcsXCIxMjU2XCI6MTY3Nzg0NzIsXCIxMjU3XCI6MTY3Nzg0NzMsXCIxMjYyXCI6MTY3Nzg0NzgsXCIxMjYzXCI6MTY3Nzg0NzksXCIxMzI5XCI6MTY3Nzg1NDUsXCIxMzMwXCI6MTY3Nzg1NDYsXCIxMzMxXCI6MTY3Nzg1NDcsXCIxMzMyXCI6MTY3Nzg1NDgsXCIxMzMzXCI6MTY3Nzg1NDksXCIxMzM0XCI6MTY3Nzg1NTAsXCIxMzM1XCI6MTY3Nzg1NTEsXCIxMzM2XCI6MTY3Nzg1NTIsXCIxMzM3XCI6MTY3Nzg1NTMsXCIxMzM4XCI6MTY3Nzg1NTQsXCIxMzM5XCI6MTY3Nzg1NTUsXCIxMzQwXCI6MTY3Nzg1NTYsXCIxMzQxXCI6MTY3Nzg1NTcsXCIxMzQyXCI6MTY3Nzg1NTgsXCIxMzQzXCI6MTY3Nzg1NTksXCIxMzQ0XCI6MTY3Nzg1NjAsXCIxMzQ1XCI6MTY3Nzg1NjEsXCIxMzQ2XCI6MTY3Nzg1NjIsXCIxMzQ3XCI6MTY3Nzg1NjMsXCIxMzQ4XCI6MTY3Nzg1NjQsXCIxMzQ5XCI6MTY3Nzg1NjUsXCIxMzUwXCI6MTY3Nzg1NjYsXCIxMzUxXCI6MTY3Nzg1NjcsXCIxMzUyXCI6MTY3Nzg1NjgsXCIxMzUzXCI6MTY3Nzg1NjksXCIxMzU0XCI6MTY3Nzg1NzAsXCIxMzU1XCI6MTY3Nzg1NzEsXCIxMzU2XCI6MTY3Nzg1NzIsXCIxMzU3XCI6MTY3Nzg1NzMsXCIxMzU4XCI6MTY3Nzg1NzQsXCIxMzU5XCI6MTY3Nzg1NzUsXCIxMzYwXCI6MTY3Nzg1NzYsXCIxMzYxXCI6MTY3Nzg1NzcsXCIxMzYyXCI6MTY3Nzg1NzgsXCIxMzYzXCI6MTY3Nzg1NzksXCIxMzY0XCI6MTY3Nzg1ODAsXCIxMzY1XCI6MTY3Nzg1ODEsXCIxMzY2XCI6MTY3Nzg1ODIsXCIxMzcwXCI6MTY3Nzg1ODYsXCIxMzcxXCI6MTY3Nzg1ODcsXCIxMzcyXCI6MTY3Nzg1ODgsXCIxMzczXCI6MTY3Nzg1ODksXCIxMzc0XCI6MTY3Nzg1OTAsXCIxMzc3XCI6MTY3Nzg1OTMsXCIxMzc4XCI6MTY3Nzg1OTQsXCIxMzc5XCI6MTY3Nzg1OTUsXCIxMzgwXCI6MTY3Nzg1OTYsXCIxMzgxXCI6MTY3Nzg1OTcsXCIxMzgyXCI6MTY3Nzg1OTgsXCIxMzgzXCI6MTY3Nzg1OTksXCIxMzg0XCI6MTY3Nzg2MDAsXCIxMzg1XCI6MTY3Nzg2MDEsXCIxMzg2XCI6MTY3Nzg2MDIsXCIxMzg3XCI6MTY3Nzg2MDMsXCIxMzg4XCI6MTY3Nzg2MDQsXCIxMzg5XCI6MTY3Nzg2MDUsXCIxMzkwXCI6MTY3Nzg2MDYsXCIxMzkxXCI6MTY3Nzg2MDcsXCIxMzkyXCI6MTY3Nzg2MDgsXCIxMzkzXCI6MTY3Nzg2MDksXCIxMzk0XCI6MTY3Nzg2MTAsXCIxMzk1XCI6MTY3Nzg2MTEsXCIxMzk2XCI6MTY3Nzg2MTIsXCIxMzk3XCI6MTY3Nzg2MTMsXCIxMzk4XCI6MTY3Nzg2MTQsXCIxMzk5XCI6MTY3Nzg2MTUsXCIxNDAwXCI6MTY3Nzg2MTYsXCIxNDAxXCI6MTY3Nzg2MTcsXCIxNDAyXCI6MTY3Nzg2MTgsXCIxNDAzXCI6MTY3Nzg2MTksXCIxNDA0XCI6MTY3Nzg2MjAsXCIxNDA1XCI6MTY3Nzg2MjEsXCIxNDA2XCI6MTY3Nzg2MjIsXCIxNDA3XCI6MTY3Nzg2MjMsXCIxNDA4XCI6MTY3Nzg2MjQsXCIxNDA5XCI6MTY3Nzg2MjUsXCIxNDEwXCI6MTY3Nzg2MjYsXCIxNDExXCI6MTY3Nzg2MjcsXCIxNDEyXCI6MTY3Nzg2MjgsXCIxNDEzXCI6MTY3Nzg2MjksXCIxNDE0XCI6MTY3Nzg2MzAsXCIxNDE1XCI6MTY3Nzg2MzEsXCIxNDE3XCI6MTY3Nzg2MzMsXCIxNDE4XCI6MTY3Nzg2MzQsXCIxNDg4XCI6MzI5NixcIjE0ODlcIjozMjk3LFwiMTQ5MFwiOjMyOTgsXCIxNDkxXCI6MzI5OSxcIjE0OTJcIjozMzAwLFwiMTQ5M1wiOjMzMDEsXCIxNDk0XCI6MzMwMixcIjE0OTVcIjozMzAzLFwiMTQ5NlwiOjMzMDQsXCIxNDk3XCI6MzMwNSxcIjE0OThcIjozMzA2LFwiMTQ5OVwiOjMzMDcsXCIxNTAwXCI6MzMwOCxcIjE1MDFcIjozMzA5LFwiMTUwMlwiOjMzMTAsXCIxNTAzXCI6MzMxMSxcIjE1MDRcIjozMzEyLFwiMTUwNVwiOjMzMTMsXCIxNTA2XCI6MzMxNCxcIjE1MDdcIjozMzE1LFwiMTUwOFwiOjMzMTYsXCIxNTA5XCI6MzMxNyxcIjE1MTBcIjozMzE4LFwiMTUxMVwiOjMzMTksXCIxNTEyXCI6MzMyMCxcIjE1MTNcIjozMzIxLFwiMTUxNFwiOjMzMjIsXCIxNTQ4XCI6MTQ1MixcIjE1NjNcIjoxNDY3LFwiMTU2N1wiOjE0NzEsXCIxNTY5XCI6MTQ3MyxcIjE1NzBcIjoxNDc0LFwiMTU3MVwiOjE0NzUsXCIxNTcyXCI6MTQ3NixcIjE1NzNcIjoxNDc3LFwiMTU3NFwiOjE0NzgsXCIxNTc1XCI6MTQ3OSxcIjE1NzZcIjoxNDgwLFwiMTU3N1wiOjE0ODEsXCIxNTc4XCI6MTQ4MixcIjE1NzlcIjoxNDgzLFwiMTU4MFwiOjE0ODQsXCIxNTgxXCI6MTQ4NSxcIjE1ODJcIjoxNDg2LFwiMTU4M1wiOjE0ODcsXCIxNTg0XCI6MTQ4OCxcIjE1ODVcIjoxNDg5LFwiMTU4NlwiOjE0OTAsXCIxNTg3XCI6MTQ5MSxcIjE1ODhcIjoxNDkyLFwiMTU4OVwiOjE0OTMsXCIxNTkwXCI6MTQ5NCxcIjE1OTFcIjoxNDk1LFwiMTU5MlwiOjE0OTYsXCIxNTkzXCI6MTQ5NyxcIjE1OTRcIjoxNDk4LFwiMTYwMFwiOjE1MDQsXCIxNjAxXCI6MTUwNSxcIjE2MDJcIjoxNTA2LFwiMTYwM1wiOjE1MDcsXCIxNjA0XCI6MTUwOCxcIjE2MDVcIjoxNTA5LFwiMTYwNlwiOjE1MTAsXCIxNjA3XCI6MTUxMSxcIjE2MDhcIjoxNTEyLFwiMTYwOVwiOjE1MTMsXCIxNjEwXCI6MTUxNCxcIjE2MTFcIjoxNTE1LFwiMTYxMlwiOjE1MTYsXCIxNjEzXCI6MTUxNyxcIjE2MTRcIjoxNTE4LFwiMTYxNVwiOjE1MTksXCIxNjE2XCI6MTUyMCxcIjE2MTdcIjoxNTIxLFwiMTYxOFwiOjE1MjIsXCIxNjE5XCI6MTY3Nzg4MzUsXCIxNjIwXCI6MTY3Nzg4MzYsXCIxNjIxXCI6MTY3Nzg4MzcsXCIxNjMyXCI6MTY3Nzg4NDgsXCIxNjMzXCI6MTY3Nzg4NDksXCIxNjM0XCI6MTY3Nzg4NTAsXCIxNjM1XCI6MTY3Nzg4NTEsXCIxNjM2XCI6MTY3Nzg4NTIsXCIxNjM3XCI6MTY3Nzg4NTMsXCIxNjM4XCI6MTY3Nzg4NTQsXCIxNjM5XCI6MTY3Nzg4NTUsXCIxNjQwXCI6MTY3Nzg4NTYsXCIxNjQxXCI6MTY3Nzg4NTcsXCIxNjQyXCI6MTY3Nzg4NTgsXCIxNjQ4XCI6MTY3Nzg4NjQsXCIxNjU3XCI6MTY3Nzg4NzMsXCIxNjYyXCI6MTY3Nzg4NzgsXCIxNjcwXCI6MTY3Nzg4ODYsXCIxNjcyXCI6MTY3Nzg4ODgsXCIxNjgxXCI6MTY3Nzg4OTcsXCIxNjg4XCI6MTY3Nzg5MDQsXCIxNzAwXCI6MTY3Nzg5MTYsXCIxNzA1XCI6MTY3Nzg5MjEsXCIxNzExXCI6MTY3Nzg5MjcsXCIxNzIyXCI6MTY3Nzg5MzgsXCIxNzI2XCI6MTY3Nzg5NDIsXCIxNzI5XCI6MTY3Nzg5NDUsXCIxNzQwXCI6MTY3Nzg5NTYsXCIxNzQ2XCI6MTY3Nzg5NjIsXCIxNzQ4XCI6MTY3Nzg5NjQsXCIxNzc2XCI6MTY3Nzg5OTIsXCIxNzc3XCI6MTY3Nzg5OTMsXCIxNzc4XCI6MTY3Nzg5OTQsXCIxNzc5XCI6MTY3Nzg5OTUsXCIxNzgwXCI6MTY3Nzg5OTYsXCIxNzgxXCI6MTY3Nzg5OTcsXCIxNzgyXCI6MTY3Nzg5OTgsXCIxNzgzXCI6MTY3Nzg5OTksXCIxNzg0XCI6MTY3NzkwMDAsXCIxNzg1XCI6MTY3NzkwMDEsXCIzNDU4XCI6MTY3ODA2NzQsXCIzNDU5XCI6MTY3ODA2NzUsXCIzNDYxXCI6MTY3ODA2NzcsXCIzNDYyXCI6MTY3ODA2NzgsXCIzNDYzXCI6MTY3ODA2NzksXCIzNDY0XCI6MTY3ODA2ODAsXCIzNDY1XCI6MTY3ODA2ODEsXCIzNDY2XCI6MTY3ODA2ODIsXCIzNDY3XCI6MTY3ODA2ODMsXCIzNDY4XCI6MTY3ODA2ODQsXCIzNDY5XCI6MTY3ODA2ODUsXCIzNDcwXCI6MTY3ODA2ODYsXCIzNDcxXCI6MTY3ODA2ODcsXCIzNDcyXCI6MTY3ODA2ODgsXCIzNDczXCI6MTY3ODA2ODksXCIzNDc0XCI6MTY3ODA2OTAsXCIzNDc1XCI6MTY3ODA2OTEsXCIzNDc2XCI6MTY3ODA2OTIsXCIzNDc3XCI6MTY3ODA2OTMsXCIzNDc4XCI6MTY3ODA2OTQsXCIzNDgyXCI6MTY3ODA2OTgsXCIzNDgzXCI6MTY3ODA2OTksXCIzNDg0XCI6MTY3ODA3MDAsXCIzNDg1XCI6MTY3ODA3MDEsXCIzNDg2XCI6MTY3ODA3MDIsXCIzNDg3XCI6MTY3ODA3MDMsXCIzNDg4XCI6MTY3ODA3MDQsXCIzNDg5XCI6MTY3ODA3MDUsXCIzNDkwXCI6MTY3ODA3MDYsXCIzNDkxXCI6MTY3ODA3MDcsXCIzNDkyXCI6MTY3ODA3MDgsXCIzNDkzXCI6MTY3ODA3MDksXCIzNDk0XCI6MTY3ODA3MTAsXCIzNDk1XCI6MTY3ODA3MTEsXCIzNDk2XCI6MTY3ODA3MTIsXCIzNDk3XCI6MTY3ODA3MTMsXCIzNDk4XCI6MTY3ODA3MTQsXCIzNDk5XCI6MTY3ODA3MTUsXCIzNTAwXCI6MTY3ODA3MTYsXCIzNTAxXCI6MTY3ODA3MTcsXCIzNTAyXCI6MTY3ODA3MTgsXCIzNTAzXCI6MTY3ODA3MTksXCIzNTA0XCI6MTY3ODA3MjAsXCIzNTA1XCI6MTY3ODA3MjEsXCIzNTA3XCI6MTY3ODA3MjMsXCIzNTA4XCI6MTY3ODA3MjQsXCIzNTA5XCI6MTY3ODA3MjUsXCIzNTEwXCI6MTY3ODA3MjYsXCIzNTExXCI6MTY3ODA3MjcsXCIzNTEyXCI6MTY3ODA3MjgsXCIzNTEzXCI6MTY3ODA3MjksXCIzNTE0XCI6MTY3ODA3MzAsXCIzNTE1XCI6MTY3ODA3MzEsXCIzNTE3XCI6MTY3ODA3MzMsXCIzNTIwXCI6MTY3ODA3MzYsXCIzNTIxXCI6MTY3ODA3MzcsXCIzNTIyXCI6MTY3ODA3MzgsXCIzNTIzXCI6MTY3ODA3MzksXCIzNTI0XCI6MTY3ODA3NDAsXCIzNTI1XCI6MTY3ODA3NDEsXCIzNTI2XCI6MTY3ODA3NDIsXCIzNTMwXCI6MTY3ODA3NDYsXCIzNTM1XCI6MTY3ODA3NTEsXCIzNTM2XCI6MTY3ODA3NTIsXCIzNTM3XCI6MTY3ODA3NTMsXCIzNTM4XCI6MTY3ODA3NTQsXCIzNTM5XCI6MTY3ODA3NTUsXCIzNTQwXCI6MTY3ODA3NTYsXCIzNTQyXCI6MTY3ODA3NTgsXCIzNTQ0XCI6MTY3ODA3NjAsXCIzNTQ1XCI6MTY3ODA3NjEsXCIzNTQ2XCI6MTY3ODA3NjIsXCIzNTQ3XCI6MTY3ODA3NjMsXCIzNTQ4XCI6MTY3ODA3NjQsXCIzNTQ5XCI6MTY3ODA3NjUsXCIzNTUwXCI6MTY3ODA3NjYsXCIzNTUxXCI6MTY3ODA3NjcsXCIzNTcwXCI6MTY3ODA3ODYsXCIzNTcxXCI6MTY3ODA3ODcsXCIzNTcyXCI6MTY3ODA3ODgsXCIzNTg1XCI6MzQ4OSxcIjM1ODZcIjozNDkwLFwiMzU4N1wiOjM0OTEsXCIzNTg4XCI6MzQ5MixcIjM1ODlcIjozNDkzLFwiMzU5MFwiOjM0OTQsXCIzNTkxXCI6MzQ5NSxcIjM1OTJcIjozNDk2LFwiMzU5M1wiOjM0OTcsXCIzNTk0XCI6MzQ5OCxcIjM1OTVcIjozNDk5LFwiMzU5NlwiOjM1MDAsXCIzNTk3XCI6MzUwMSxcIjM1OThcIjozNTAyLFwiMzU5OVwiOjM1MDMsXCIzNjAwXCI6MzUwNCxcIjM2MDFcIjozNTA1LFwiMzYwMlwiOjM1MDYsXCIzNjAzXCI6MzUwNyxcIjM2MDRcIjozNTA4LFwiMzYwNVwiOjM1MDksXCIzNjA2XCI6MzUxMCxcIjM2MDdcIjozNTExLFwiMzYwOFwiOjM1MTIsXCIzNjA5XCI6MzUxMyxcIjM2MTBcIjozNTE0LFwiMzYxMVwiOjM1MTUsXCIzNjEyXCI6MzUxNixcIjM2MTNcIjozNTE3LFwiMzYxNFwiOjM1MTgsXCIzNjE1XCI6MzUxOSxcIjM2MTZcIjozNTIwLFwiMzYxN1wiOjM1MjEsXCIzNjE4XCI6MzUyMixcIjM2MTlcIjozNTIzLFwiMzYyMFwiOjM1MjQsXCIzNjIxXCI6MzUyNSxcIjM2MjJcIjozNTI2LFwiMzYyM1wiOjM1MjcsXCIzNjI0XCI6MzUyOCxcIjM2MjVcIjozNTI5LFwiMzYyNlwiOjM1MzAsXCIzNjI3XCI6MzUzMSxcIjM2MjhcIjozNTMyLFwiMzYyOVwiOjM1MzMsXCIzNjMwXCI6MzUzNCxcIjM2MzFcIjozNTM1LFwiMzYzMlwiOjM1MzYsXCIzNjMzXCI6MzUzNyxcIjM2MzRcIjozNTM4LFwiMzYzNVwiOjM1MzksXCIzNjM2XCI6MzU0MCxcIjM2MzdcIjozNTQxLFwiMzYzOFwiOjM1NDIsXCIzNjM5XCI6MzU0MyxcIjM2NDBcIjozNTQ0LFwiMzY0MVwiOjM1NDUsXCIzNjQyXCI6MzU0NixcIjM2NDdcIjozNTUxLFwiMzY0OFwiOjM1NTIsXCIzNjQ5XCI6MzU1MyxcIjM2NTBcIjozNTU0LFwiMzY1MVwiOjM1NTUsXCIzNjUyXCI6MzU1NixcIjM2NTNcIjozNTU3LFwiMzY1NFwiOjM1NTgsXCIzNjU1XCI6MzU1OSxcIjM2NTZcIjozNTYwLFwiMzY1N1wiOjM1NjEsXCIzNjU4XCI6MzU2MixcIjM2NTlcIjozNTYzLFwiMzY2MFwiOjM1NjQsXCIzNjYxXCI6MzU2NSxcIjM2NjRcIjozNTY4LFwiMzY2NVwiOjM1NjksXCIzNjY2XCI6MzU3MCxcIjM2NjdcIjozNTcxLFwiMzY2OFwiOjM1NzIsXCIzNjY5XCI6MzU3MyxcIjM2NzBcIjozNTc0LFwiMzY3MVwiOjM1NzUsXCIzNjcyXCI6MzU3NixcIjM2NzNcIjozNTc3LFwiNDMwNFwiOjE2NzgxNTIwLFwiNDMwNVwiOjE2NzgxNTIxLFwiNDMwNlwiOjE2NzgxNTIyLFwiNDMwN1wiOjE2NzgxNTIzLFwiNDMwOFwiOjE2NzgxNTI0LFwiNDMwOVwiOjE2NzgxNTI1LFwiNDMxMFwiOjE2NzgxNTI2LFwiNDMxMVwiOjE2NzgxNTI3LFwiNDMxMlwiOjE2NzgxNTI4LFwiNDMxM1wiOjE2NzgxNTI5LFwiNDMxNFwiOjE2NzgxNTMwLFwiNDMxNVwiOjE2NzgxNTMxLFwiNDMxNlwiOjE2NzgxNTMyLFwiNDMxN1wiOjE2NzgxNTMzLFwiNDMxOFwiOjE2NzgxNTM0LFwiNDMxOVwiOjE2NzgxNTM1LFwiNDMyMFwiOjE2NzgxNTM2LFwiNDMyMVwiOjE2NzgxNTM3LFwiNDMyMlwiOjE2NzgxNTM4LFwiNDMyM1wiOjE2NzgxNTM5LFwiNDMyNFwiOjE2NzgxNTQwLFwiNDMyNVwiOjE2NzgxNTQxLFwiNDMyNlwiOjE2NzgxNTQyLFwiNDMyN1wiOjE2NzgxNTQzLFwiNDMyOFwiOjE2NzgxNTQ0LFwiNDMyOVwiOjE2NzgxNTQ1LFwiNDMzMFwiOjE2NzgxNTQ2LFwiNDMzMVwiOjE2NzgxNTQ3LFwiNDMzMlwiOjE2NzgxNTQ4LFwiNDMzM1wiOjE2NzgxNTQ5LFwiNDMzNFwiOjE2NzgxNTUwLFwiNDMzNVwiOjE2NzgxNTUxLFwiNDMzNlwiOjE2NzgxNTUyLFwiNDMzN1wiOjE2NzgxNTUzLFwiNDMzOFwiOjE2NzgxNTU0LFwiNDMzOVwiOjE2NzgxNTU1LFwiNDM0MFwiOjE2NzgxNTU2LFwiNDM0MVwiOjE2NzgxNTU3LFwiNDM0MlwiOjE2NzgxNTU4LFwiNzY4MlwiOjE2Nzg0ODk4LFwiNzY4M1wiOjE2Nzg0ODk5LFwiNzY5MFwiOjE2Nzg0OTA2LFwiNzY5MVwiOjE2Nzg0OTA3LFwiNzcxMFwiOjE2Nzg0OTI2LFwiNzcxMVwiOjE2Nzg0OTI3LFwiNzczNFwiOjE2Nzg0OTUwLFwiNzczNVwiOjE2Nzg0OTUxLFwiNzc0NFwiOjE2Nzg0OTYwLFwiNzc0NVwiOjE2Nzg0OTYxLFwiNzc2NlwiOjE2Nzg0OTgyLFwiNzc2N1wiOjE2Nzg0OTgzLFwiNzc3NlwiOjE2Nzg0OTkyLFwiNzc3N1wiOjE2Nzg0OTkzLFwiNzc4NlwiOjE2Nzg1MDAyLFwiNzc4N1wiOjE2Nzg1MDAzLFwiNzgwOFwiOjE2Nzg1MDI0LFwiNzgwOVwiOjE2Nzg1MDI1LFwiNzgxMFwiOjE2Nzg1MDI2LFwiNzgxMVwiOjE2Nzg1MDI3LFwiNzgxMlwiOjE2Nzg1MDI4LFwiNzgxM1wiOjE2Nzg1MDI5LFwiNzgxOFwiOjE2Nzg1MDM0LFwiNzgxOVwiOjE2Nzg1MDM1LFwiNzg0MFwiOjE2Nzg1MDU2LFwiNzg0MVwiOjE2Nzg1MDU3LFwiNzg0MlwiOjE2Nzg1MDU4LFwiNzg0M1wiOjE2Nzg1MDU5LFwiNzg0NFwiOjE2Nzg1MDYwLFwiNzg0NVwiOjE2Nzg1MDYxLFwiNzg0NlwiOjE2Nzg1MDYyLFwiNzg0N1wiOjE2Nzg1MDYzLFwiNzg0OFwiOjE2Nzg1MDY0LFwiNzg0OVwiOjE2Nzg1MDY1LFwiNzg1MFwiOjE2Nzg1MDY2LFwiNzg1MVwiOjE2Nzg1MDY3LFwiNzg1MlwiOjE2Nzg1MDY4LFwiNzg1M1wiOjE2Nzg1MDY5LFwiNzg1NFwiOjE2Nzg1MDcwLFwiNzg1NVwiOjE2Nzg1MDcxLFwiNzg1NlwiOjE2Nzg1MDcyLFwiNzg1N1wiOjE2Nzg1MDczLFwiNzg1OFwiOjE2Nzg1MDc0LFwiNzg1OVwiOjE2Nzg1MDc1LFwiNzg2MFwiOjE2Nzg1MDc2LFwiNzg2MVwiOjE2Nzg1MDc3LFwiNzg2MlwiOjE2Nzg1MDc4LFwiNzg2M1wiOjE2Nzg1MDc5LFwiNzg2NFwiOjE2Nzg1MDgwLFwiNzg2NVwiOjE2Nzg1MDgxLFwiNzg2NlwiOjE2Nzg1MDgyLFwiNzg2N1wiOjE2Nzg1MDgzLFwiNzg2OFwiOjE2Nzg1MDg0LFwiNzg2OVwiOjE2Nzg1MDg1LFwiNzg3MFwiOjE2Nzg1MDg2LFwiNzg3MVwiOjE2Nzg1MDg3LFwiNzg3MlwiOjE2Nzg1MDg4LFwiNzg3M1wiOjE2Nzg1MDg5LFwiNzg3NFwiOjE2Nzg1MDkwLFwiNzg3NVwiOjE2Nzg1MDkxLFwiNzg3NlwiOjE2Nzg1MDkyLFwiNzg3N1wiOjE2Nzg1MDkzLFwiNzg3OFwiOjE2Nzg1MDk0LFwiNzg3OVwiOjE2Nzg1MDk1LFwiNzg4MFwiOjE2Nzg1MDk2LFwiNzg4MVwiOjE2Nzg1MDk3LFwiNzg4MlwiOjE2Nzg1MDk4LFwiNzg4M1wiOjE2Nzg1MDk5LFwiNzg4NFwiOjE2Nzg1MTAwLFwiNzg4NVwiOjE2Nzg1MTAxLFwiNzg4NlwiOjE2Nzg1MTAyLFwiNzg4N1wiOjE2Nzg1MTAzLFwiNzg4OFwiOjE2Nzg1MTA0LFwiNzg4OVwiOjE2Nzg1MTA1LFwiNzg5MFwiOjE2Nzg1MTA2LFwiNzg5MVwiOjE2Nzg1MTA3LFwiNzg5MlwiOjE2Nzg1MTA4LFwiNzg5M1wiOjE2Nzg1MTA5LFwiNzg5NFwiOjE2Nzg1MTEwLFwiNzg5NVwiOjE2Nzg1MTExLFwiNzg5NlwiOjE2Nzg1MTEyLFwiNzg5N1wiOjE2Nzg1MTEzLFwiNzg5OFwiOjE2Nzg1MTE0LFwiNzg5OVwiOjE2Nzg1MTE1LFwiNzkwMFwiOjE2Nzg1MTE2LFwiNzkwMVwiOjE2Nzg1MTE3LFwiNzkwMlwiOjE2Nzg1MTE4LFwiNzkwM1wiOjE2Nzg1MTE5LFwiNzkwNFwiOjE2Nzg1MTIwLFwiNzkwNVwiOjE2Nzg1MTIxLFwiNzkwNlwiOjE2Nzg1MTIyLFwiNzkwN1wiOjE2Nzg1MTIzLFwiNzkwOFwiOjE2Nzg1MTI0LFwiNzkwOVwiOjE2Nzg1MTI1LFwiNzkxMFwiOjE2Nzg1MTI2LFwiNzkxMVwiOjE2Nzg1MTI3LFwiNzkxMlwiOjE2Nzg1MTI4LFwiNzkxM1wiOjE2Nzg1MTI5LFwiNzkxNFwiOjE2Nzg1MTMwLFwiNzkxNVwiOjE2Nzg1MTMxLFwiNzkxNlwiOjE2Nzg1MTMyLFwiNzkxN1wiOjE2Nzg1MTMzLFwiNzkxOFwiOjE2Nzg1MTM0LFwiNzkxOVwiOjE2Nzg1MTM1LFwiNzkyMFwiOjE2Nzg1MTM2LFwiNzkyMVwiOjE2Nzg1MTM3LFwiNzkyMlwiOjE2Nzg1MTM4LFwiNzkyM1wiOjE2Nzg1MTM5LFwiNzkyNFwiOjE2Nzg1MTQwLFwiNzkyNVwiOjE2Nzg1MTQxLFwiNzkyNlwiOjE2Nzg1MTQyLFwiNzkyN1wiOjE2Nzg1MTQzLFwiNzkyOFwiOjE2Nzg1MTQ0LFwiNzkyOVwiOjE2Nzg1MTQ1LFwiODE5NFwiOjI3MjIsXCI4MTk1XCI6MjcyMSxcIjgxOTZcIjoyNzIzLFwiODE5N1wiOjI3MjQsXCI4MTk5XCI6MjcyNSxcIjgyMDBcIjoyNzI2LFwiODIwMVwiOjI3MjcsXCI4MjAyXCI6MjcyOCxcIjgyMTBcIjoyNzQ3LFwiODIxMVwiOjI3MzAsXCI4MjEyXCI6MjcyOSxcIjgyMTNcIjoxOTY3LFwiODIxNVwiOjMyOTUsXCI4MjE2XCI6Mjc2OCxcIjgyMTdcIjoyNzY5LFwiODIxOFwiOjI4MTMsXCI4MjIwXCI6Mjc3MCxcIjgyMjFcIjoyNzcxLFwiODIyMlwiOjI4MTQsXCI4MjI0XCI6MjgwMSxcIjgyMjVcIjoyODAyLFwiODIyNlwiOjI3OTAsXCI4MjI5XCI6MjczNSxcIjgyMzBcIjoyNzM0LFwiODI0MFwiOjI3NzMsXCI4MjQyXCI6Mjc3NCxcIjgyNDNcIjoyNzc1LFwiODI0OFwiOjI4MTIsXCI4MjU0XCI6MTE1MCxcIjgzMDRcIjoxNjc4NTUyMCxcIjgzMDhcIjoxNjc4NTUyNCxcIjgzMDlcIjoxNjc4NTUyNSxcIjgzMTBcIjoxNjc4NTUyNixcIjgzMTFcIjoxNjc4NTUyNyxcIjgzMTJcIjoxNjc4NTUyOCxcIjgzMTNcIjoxNjc4NTUyOSxcIjgzMjBcIjoxNjc4NTUzNixcIjgzMjFcIjoxNjc4NTUzNyxcIjgzMjJcIjoxNjc4NTUzOCxcIjgzMjNcIjoxNjc4NTUzOSxcIjgzMjRcIjoxNjc4NTU0MCxcIjgzMjVcIjoxNjc4NTU0MSxcIjgzMjZcIjoxNjc4NTU0MixcIjgzMjdcIjoxNjc4NTU0MyxcIjgzMjhcIjoxNjc4NTU0NCxcIjgzMjlcIjoxNjc4NTU0NSxcIjgzNTJcIjoxNjc4NTU2OCxcIjgzNTNcIjoxNjc4NTU2OSxcIjgzNTRcIjoxNjc4NTU3MCxcIjgzNTVcIjoxNjc4NTU3MSxcIjgzNTZcIjoxNjc4NTU3MixcIjgzNTdcIjoxNjc4NTU3MyxcIjgzNThcIjoxNjc4NTU3NCxcIjgzNTlcIjoxNjc4NTU3NSxcIjgzNjBcIjoxNjc4NTU3NixcIjgzNjFcIjozODM5LFwiODM2MlwiOjE2Nzg1NTc4LFwiODM2M1wiOjE2Nzg1NTc5LFwiODM2NFwiOjgzNjQsXCI4NDUzXCI6Mjc0NCxcIjg0NzBcIjoxNzEyLFwiODQ3MVwiOjI4MTEsXCI4NDc4XCI6Mjc3MixcIjg0ODJcIjoyNzYxLFwiODUzMVwiOjI3MzYsXCI4NTMyXCI6MjczNyxcIjg1MzNcIjoyNzM4LFwiODUzNFwiOjI3MzksXCI4NTM1XCI6Mjc0MCxcIjg1MzZcIjoyNzQxLFwiODUzN1wiOjI3NDIsXCI4NTM4XCI6Mjc0MyxcIjg1MzlcIjoyNzU1LFwiODU0MFwiOjI3NTYsXCI4NTQxXCI6Mjc1NyxcIjg1NDJcIjoyNzU4LFwiODU5MlwiOjIyOTksXCI4NTkzXCI6MjMwMCxcIjg1OTRcIjoyMzAxLFwiODU5NVwiOjIzMDIsXCI4NjU4XCI6MjI1NCxcIjg2NjBcIjoyMjUzLFwiODcwNlwiOjIyODcsXCI4NzA5XCI6MTY3ODU5MjUsXCI4NzExXCI6MjI0NSxcIjg3MTJcIjoxNjc4NTkyOCxcIjg3MTNcIjoxNjc4NTkyOSxcIjg3MTVcIjoxNjc4NTkzMSxcIjg3MjhcIjozMDE4LFwiODczMFwiOjIyNjIsXCI4NzMxXCI6MTY3ODU5NDcsXCI4NzMyXCI6MTY3ODU5NDgsXCI4NzMzXCI6MjI0MSxcIjg3MzRcIjoyMjQyLFwiODc0M1wiOjIyNzAsXCI4NzQ0XCI6MjI3MSxcIjg3NDVcIjoyMjY4LFwiODc0NlwiOjIyNjksXCI4NzQ3XCI6MjIzOSxcIjg3NDhcIjoxNjc4NTk2NCxcIjg3NDlcIjoxNjc4NTk2NSxcIjg3NTZcIjoyMjQwLFwiODc1N1wiOjE2Nzg1OTczLFwiODc2NFwiOjIyNDgsXCI4NzcxXCI6MjI0OSxcIjg3NzNcIjoxNjc4NTk5MixcIjg3NzVcIjoxNjc4NTk5MSxcIjg4MDBcIjoyMjM3LFwiODgwMVwiOjIyNTUsXCI4ODAyXCI6MTY3ODYwMTgsXCI4ODAzXCI6MTY3ODYwMTksXCI4ODA0XCI6MjIzNixcIjg4MDVcIjoyMjM4LFwiODgzNFwiOjIyNjYsXCI4ODM1XCI6MjI2NyxcIjg4NjZcIjozMDY4LFwiODg2N1wiOjMwMzYsXCI4ODY4XCI6MzAxMCxcIjg4NjlcIjozMDIyLFwiODk2OFwiOjMwMjcsXCI4OTcwXCI6MzAxMixcIjg5ODFcIjoyODEwLFwiODk5MlwiOjIyMTIsXCI4OTkzXCI6MjIxMyxcIjkxMDlcIjozMDIwLFwiOTExNVwiOjIyMTksXCI5MTE3XCI6MjIyMCxcIjkxMThcIjoyMjIxLFwiOTEyMFwiOjIyMjIsXCI5MTIxXCI6MjIxNSxcIjkxMjNcIjoyMjE2LFwiOTEyNFwiOjIyMTcsXCI5MTI2XCI6MjIxOCxcIjkxMjhcIjoyMjIzLFwiOTEzMlwiOjIyMjQsXCI5MTQzXCI6MjIwOSxcIjkxNDZcIjoyNTQzLFwiOTE0N1wiOjI1NDQsXCI5MTQ4XCI6MjU0NixcIjkxNDlcIjoyNTQ3LFwiOTIyNVwiOjI1MzAsXCI5MjI2XCI6MjUzMyxcIjkyMjdcIjoyNTM3LFwiOTIyOFwiOjI1MzEsXCI5MjI5XCI6MjUzMixcIjkyNTFcIjoyNzMyLFwiOTI1MlwiOjI1MzYsXCI5NDcyXCI6MjIxMSxcIjk0NzRcIjoyMjE0LFwiOTQ4NFwiOjIyMTAsXCI5NDg4XCI6MjUzOSxcIjk0OTJcIjoyNTQxLFwiOTQ5NlwiOjI1MzgsXCI5NTAwXCI6MjU0OCxcIjk1MDhcIjoyNTQ5LFwiOTUxNlwiOjI1NTEsXCI5NTI0XCI6MjU1MCxcIjk1MzJcIjoyNTQyLFwiOTYxOFwiOjI1MjksXCI5NjQyXCI6Mjc5MSxcIjk2NDNcIjoyNzg1LFwiOTY0NFwiOjI3NzksXCI5NjQ1XCI6Mjc4NixcIjk2NDZcIjoyNzgzLFwiOTY0N1wiOjI3NjcsXCI5NjUwXCI6Mjc5MixcIjk2NTFcIjoyNzg3LFwiOTY1NFwiOjI3ODEsXCI5NjU1XCI6Mjc2NSxcIjk2NjBcIjoyNzkzLFwiOTY2MVwiOjI3ODgsXCI5NjY0XCI6Mjc4MCxcIjk2NjVcIjoyNzY0LFwiOTY3MFwiOjI1MjgsXCI5Njc1XCI6Mjc2NixcIjk2NzlcIjoyNzgyLFwiOTcwMlwiOjI3ODQsXCI5NzM0XCI6Mjc4OSxcIjk3NDJcIjoyODA5LFwiOTc0N1wiOjI3NjIsXCI5NzU2XCI6Mjc5NCxcIjk3NThcIjoyNzk1LFwiOTc5MlwiOjI4MDgsXCI5Nzk0XCI6MjgwNyxcIjk4MjdcIjoyNzk2LFwiOTgyOVwiOjI3OTgsXCI5ODMwXCI6Mjc5NyxcIjk4MzdcIjoyODA2LFwiOTgzOVwiOjI4MDUsXCIxMDAwM1wiOjI4MDMsXCIxMDAwN1wiOjI4MDQsXCIxMDAxM1wiOjI3NzcsXCIxMDAxNlwiOjI4MDAsXCIxMDIxNlwiOjI3NDgsXCIxMDIxN1wiOjI3NTAsXCIxMDI0MFwiOjE2Nzg3NDU2LFwiMTAyNDFcIjoxNjc4NzQ1NyxcIjEwMjQyXCI6MTY3ODc0NTgsXCIxMDI0M1wiOjE2Nzg3NDU5LFwiMTAyNDRcIjoxNjc4NzQ2MCxcIjEwMjQ1XCI6MTY3ODc0NjEsXCIxMDI0NlwiOjE2Nzg3NDYyLFwiMTAyNDdcIjoxNjc4NzQ2MyxcIjEwMjQ4XCI6MTY3ODc0NjQsXCIxMDI0OVwiOjE2Nzg3NDY1LFwiMTAyNTBcIjoxNjc4NzQ2NixcIjEwMjUxXCI6MTY3ODc0NjcsXCIxMDI1MlwiOjE2Nzg3NDY4LFwiMTAyNTNcIjoxNjc4NzQ2OSxcIjEwMjU0XCI6MTY3ODc0NzAsXCIxMDI1NVwiOjE2Nzg3NDcxLFwiMTAyNTZcIjoxNjc4NzQ3MixcIjEwMjU3XCI6MTY3ODc0NzMsXCIxMDI1OFwiOjE2Nzg3NDc0LFwiMTAyNTlcIjoxNjc4NzQ3NSxcIjEwMjYwXCI6MTY3ODc0NzYsXCIxMDI2MVwiOjE2Nzg3NDc3LFwiMTAyNjJcIjoxNjc4NzQ3OCxcIjEwMjYzXCI6MTY3ODc0NzksXCIxMDI2NFwiOjE2Nzg3NDgwLFwiMTAyNjVcIjoxNjc4NzQ4MSxcIjEwMjY2XCI6MTY3ODc0ODIsXCIxMDI2N1wiOjE2Nzg3NDgzLFwiMTAyNjhcIjoxNjc4NzQ4NCxcIjEwMjY5XCI6MTY3ODc0ODUsXCIxMDI3MFwiOjE2Nzg3NDg2LFwiMTAyNzFcIjoxNjc4NzQ4NyxcIjEwMjcyXCI6MTY3ODc0ODgsXCIxMDI3M1wiOjE2Nzg3NDg5LFwiMTAyNzRcIjoxNjc4NzQ5MCxcIjEwMjc1XCI6MTY3ODc0OTEsXCIxMDI3NlwiOjE2Nzg3NDkyLFwiMTAyNzdcIjoxNjc4NzQ5MyxcIjEwMjc4XCI6MTY3ODc0OTQsXCIxMDI3OVwiOjE2Nzg3NDk1LFwiMTAyODBcIjoxNjc4NzQ5NixcIjEwMjgxXCI6MTY3ODc0OTcsXCIxMDI4MlwiOjE2Nzg3NDk4LFwiMTAyODNcIjoxNjc4NzQ5OSxcIjEwMjg0XCI6MTY3ODc1MDAsXCIxMDI4NVwiOjE2Nzg3NTAxLFwiMTAyODZcIjoxNjc4NzUwMixcIjEwMjg3XCI6MTY3ODc1MDMsXCIxMDI4OFwiOjE2Nzg3NTA0LFwiMTAyODlcIjoxNjc4NzUwNSxcIjEwMjkwXCI6MTY3ODc1MDYsXCIxMDI5MVwiOjE2Nzg3NTA3LFwiMTAyOTJcIjoxNjc4NzUwOCxcIjEwMjkzXCI6MTY3ODc1MDksXCIxMDI5NFwiOjE2Nzg3NTEwLFwiMTAyOTVcIjoxNjc4NzUxMSxcIjEwMjk2XCI6MTY3ODc1MTIsXCIxMDI5N1wiOjE2Nzg3NTEzLFwiMTAyOThcIjoxNjc4NzUxNCxcIjEwMjk5XCI6MTY3ODc1MTUsXCIxMDMwMFwiOjE2Nzg3NTE2LFwiMTAzMDFcIjoxNjc4NzUxNyxcIjEwMzAyXCI6MTY3ODc1MTgsXCIxMDMwM1wiOjE2Nzg3NTE5LFwiMTAzMDRcIjoxNjc4NzUyMCxcIjEwMzA1XCI6MTY3ODc1MjEsXCIxMDMwNlwiOjE2Nzg3NTIyLFwiMTAzMDdcIjoxNjc4NzUyMyxcIjEwMzA4XCI6MTY3ODc1MjQsXCIxMDMwOVwiOjE2Nzg3NTI1LFwiMTAzMTBcIjoxNjc4NzUyNixcIjEwMzExXCI6MTY3ODc1MjcsXCIxMDMxMlwiOjE2Nzg3NTI4LFwiMTAzMTNcIjoxNjc4NzUyOSxcIjEwMzE0XCI6MTY3ODc1MzAsXCIxMDMxNVwiOjE2Nzg3NTMxLFwiMTAzMTZcIjoxNjc4NzUzMixcIjEwMzE3XCI6MTY3ODc1MzMsXCIxMDMxOFwiOjE2Nzg3NTM0LFwiMTAzMTlcIjoxNjc4NzUzNSxcIjEwMzIwXCI6MTY3ODc1MzYsXCIxMDMyMVwiOjE2Nzg3NTM3LFwiMTAzMjJcIjoxNjc4NzUzOCxcIjEwMzIzXCI6MTY3ODc1MzksXCIxMDMyNFwiOjE2Nzg3NTQwLFwiMTAzMjVcIjoxNjc4NzU0MSxcIjEwMzI2XCI6MTY3ODc1NDIsXCIxMDMyN1wiOjE2Nzg3NTQzLFwiMTAzMjhcIjoxNjc4NzU0NCxcIjEwMzI5XCI6MTY3ODc1NDUsXCIxMDMzMFwiOjE2Nzg3NTQ2LFwiMTAzMzFcIjoxNjc4NzU0NyxcIjEwMzMyXCI6MTY3ODc1NDgsXCIxMDMzM1wiOjE2Nzg3NTQ5LFwiMTAzMzRcIjoxNjc4NzU1MCxcIjEwMzM1XCI6MTY3ODc1NTEsXCIxMDMzNlwiOjE2Nzg3NTUyLFwiMTAzMzdcIjoxNjc4NzU1MyxcIjEwMzM4XCI6MTY3ODc1NTQsXCIxMDMzOVwiOjE2Nzg3NTU1LFwiMTAzNDBcIjoxNjc4NzU1NixcIjEwMzQxXCI6MTY3ODc1NTcsXCIxMDM0MlwiOjE2Nzg3NTU4LFwiMTAzNDNcIjoxNjc4NzU1OSxcIjEwMzQ0XCI6MTY3ODc1NjAsXCIxMDM0NVwiOjE2Nzg3NTYxLFwiMTAzNDZcIjoxNjc4NzU2MixcIjEwMzQ3XCI6MTY3ODc1NjMsXCIxMDM0OFwiOjE2Nzg3NTY0LFwiMTAzNDlcIjoxNjc4NzU2NSxcIjEwMzUwXCI6MTY3ODc1NjYsXCIxMDM1MVwiOjE2Nzg3NTY3LFwiMTAzNTJcIjoxNjc4NzU2OCxcIjEwMzUzXCI6MTY3ODc1NjksXCIxMDM1NFwiOjE2Nzg3NTcwLFwiMTAzNTVcIjoxNjc4NzU3MSxcIjEwMzU2XCI6MTY3ODc1NzIsXCIxMDM1N1wiOjE2Nzg3NTczLFwiMTAzNThcIjoxNjc4NzU3NCxcIjEwMzU5XCI6MTY3ODc1NzUsXCIxMDM2MFwiOjE2Nzg3NTc2LFwiMTAzNjFcIjoxNjc4NzU3NyxcIjEwMzYyXCI6MTY3ODc1NzgsXCIxMDM2M1wiOjE2Nzg3NTc5LFwiMTAzNjRcIjoxNjc4NzU4MCxcIjEwMzY1XCI6MTY3ODc1ODEsXCIxMDM2NlwiOjE2Nzg3NTgyLFwiMTAzNjdcIjoxNjc4NzU4MyxcIjEwMzY4XCI6MTY3ODc1ODQsXCIxMDM2OVwiOjE2Nzg3NTg1LFwiMTAzNzBcIjoxNjc4NzU4NixcIjEwMzcxXCI6MTY3ODc1ODcsXCIxMDM3MlwiOjE2Nzg3NTg4LFwiMTAzNzNcIjoxNjc4NzU4OSxcIjEwMzc0XCI6MTY3ODc1OTAsXCIxMDM3NVwiOjE2Nzg3NTkxLFwiMTAzNzZcIjoxNjc4NzU5MixcIjEwMzc3XCI6MTY3ODc1OTMsXCIxMDM3OFwiOjE2Nzg3NTk0LFwiMTAzNzlcIjoxNjc4NzU5NSxcIjEwMzgwXCI6MTY3ODc1OTYsXCIxMDM4MVwiOjE2Nzg3NTk3LFwiMTAzODJcIjoxNjc4NzU5OCxcIjEwMzgzXCI6MTY3ODc1OTksXCIxMDM4NFwiOjE2Nzg3NjAwLFwiMTAzODVcIjoxNjc4NzYwMSxcIjEwMzg2XCI6MTY3ODc2MDIsXCIxMDM4N1wiOjE2Nzg3NjAzLFwiMTAzODhcIjoxNjc4NzYwNCxcIjEwMzg5XCI6MTY3ODc2MDUsXCIxMDM5MFwiOjE2Nzg3NjA2LFwiMTAzOTFcIjoxNjc4NzYwNyxcIjEwMzkyXCI6MTY3ODc2MDgsXCIxMDM5M1wiOjE2Nzg3NjA5LFwiMTAzOTRcIjoxNjc4NzYxMCxcIjEwMzk1XCI6MTY3ODc2MTEsXCIxMDM5NlwiOjE2Nzg3NjEyLFwiMTAzOTdcIjoxNjc4NzYxMyxcIjEwMzk4XCI6MTY3ODc2MTQsXCIxMDM5OVwiOjE2Nzg3NjE1LFwiMTA0MDBcIjoxNjc4NzYxNixcIjEwNDAxXCI6MTY3ODc2MTcsXCIxMDQwMlwiOjE2Nzg3NjE4LFwiMTA0MDNcIjoxNjc4NzYxOSxcIjEwNDA0XCI6MTY3ODc2MjAsXCIxMDQwNVwiOjE2Nzg3NjIxLFwiMTA0MDZcIjoxNjc4NzYyMixcIjEwNDA3XCI6MTY3ODc2MjMsXCIxMDQwOFwiOjE2Nzg3NjI0LFwiMTA0MDlcIjoxNjc4NzYyNSxcIjEwNDEwXCI6MTY3ODc2MjYsXCIxMDQxMVwiOjE2Nzg3NjI3LFwiMTA0MTJcIjoxNjc4NzYyOCxcIjEwNDEzXCI6MTY3ODc2MjksXCIxMDQxNFwiOjE2Nzg3NjMwLFwiMTA0MTVcIjoxNjc4NzYzMSxcIjEwNDE2XCI6MTY3ODc2MzIsXCIxMDQxN1wiOjE2Nzg3NjMzLFwiMTA0MThcIjoxNjc4NzYzNCxcIjEwNDE5XCI6MTY3ODc2MzUsXCIxMDQyMFwiOjE2Nzg3NjM2LFwiMTA0MjFcIjoxNjc4NzYzNyxcIjEwNDIyXCI6MTY3ODc2MzgsXCIxMDQyM1wiOjE2Nzg3NjM5LFwiMTA0MjRcIjoxNjc4NzY0MCxcIjEwNDI1XCI6MTY3ODc2NDEsXCIxMDQyNlwiOjE2Nzg3NjQyLFwiMTA0MjdcIjoxNjc4NzY0MyxcIjEwNDI4XCI6MTY3ODc2NDQsXCIxMDQyOVwiOjE2Nzg3NjQ1LFwiMTA0MzBcIjoxNjc4NzY0NixcIjEwNDMxXCI6MTY3ODc2NDcsXCIxMDQzMlwiOjE2Nzg3NjQ4LFwiMTA0MzNcIjoxNjc4NzY0OSxcIjEwNDM0XCI6MTY3ODc2NTAsXCIxMDQzNVwiOjE2Nzg3NjUxLFwiMTA0MzZcIjoxNjc4NzY1MixcIjEwNDM3XCI6MTY3ODc2NTMsXCIxMDQzOFwiOjE2Nzg3NjU0LFwiMTA0MzlcIjoxNjc4NzY1NSxcIjEwNDQwXCI6MTY3ODc2NTYsXCIxMDQ0MVwiOjE2Nzg3NjU3LFwiMTA0NDJcIjoxNjc4NzY1OCxcIjEwNDQzXCI6MTY3ODc2NTksXCIxMDQ0NFwiOjE2Nzg3NjYwLFwiMTA0NDVcIjoxNjc4NzY2MSxcIjEwNDQ2XCI6MTY3ODc2NjIsXCIxMDQ0N1wiOjE2Nzg3NjYzLFwiMTA0NDhcIjoxNjc4NzY2NCxcIjEwNDQ5XCI6MTY3ODc2NjUsXCIxMDQ1MFwiOjE2Nzg3NjY2LFwiMTA0NTFcIjoxNjc4NzY2NyxcIjEwNDUyXCI6MTY3ODc2NjgsXCIxMDQ1M1wiOjE2Nzg3NjY5LFwiMTA0NTRcIjoxNjc4NzY3MCxcIjEwNDU1XCI6MTY3ODc2NzEsXCIxMDQ1NlwiOjE2Nzg3NjcyLFwiMTA0NTdcIjoxNjc4NzY3MyxcIjEwNDU4XCI6MTY3ODc2NzQsXCIxMDQ1OVwiOjE2Nzg3Njc1LFwiMTA0NjBcIjoxNjc4NzY3NixcIjEwNDYxXCI6MTY3ODc2NzcsXCIxMDQ2MlwiOjE2Nzg3Njc4LFwiMTA0NjNcIjoxNjc4NzY3OSxcIjEwNDY0XCI6MTY3ODc2ODAsXCIxMDQ2NVwiOjE2Nzg3NjgxLFwiMTA0NjZcIjoxNjc4NzY4MixcIjEwNDY3XCI6MTY3ODc2ODMsXCIxMDQ2OFwiOjE2Nzg3Njg0LFwiMTA0NjlcIjoxNjc4NzY4NSxcIjEwNDcwXCI6MTY3ODc2ODYsXCIxMDQ3MVwiOjE2Nzg3Njg3LFwiMTA0NzJcIjoxNjc4NzY4OCxcIjEwNDczXCI6MTY3ODc2ODksXCIxMDQ3NFwiOjE2Nzg3NjkwLFwiMTA0NzVcIjoxNjc4NzY5MSxcIjEwNDc2XCI6MTY3ODc2OTIsXCIxMDQ3N1wiOjE2Nzg3NjkzLFwiMTA0NzhcIjoxNjc4NzY5NCxcIjEwNDc5XCI6MTY3ODc2OTUsXCIxMDQ4MFwiOjE2Nzg3Njk2LFwiMTA0ODFcIjoxNjc4NzY5NyxcIjEwNDgyXCI6MTY3ODc2OTgsXCIxMDQ4M1wiOjE2Nzg3Njk5LFwiMTA0ODRcIjoxNjc4NzcwMCxcIjEwNDg1XCI6MTY3ODc3MDEsXCIxMDQ4NlwiOjE2Nzg3NzAyLFwiMTA0ODdcIjoxNjc4NzcwMyxcIjEwNDg4XCI6MTY3ODc3MDQsXCIxMDQ4OVwiOjE2Nzg3NzA1LFwiMTA0OTBcIjoxNjc4NzcwNixcIjEwNDkxXCI6MTY3ODc3MDcsXCIxMDQ5MlwiOjE2Nzg3NzA4LFwiMTA0OTNcIjoxNjc4NzcwOSxcIjEwNDk0XCI6MTY3ODc3MTAsXCIxMDQ5NVwiOjE2Nzg3NzExLFwiMTIyODlcIjoxMTg4LFwiMTIyOTBcIjoxMTg1LFwiMTIzMDBcIjoxMTg2LFwiMTIzMDFcIjoxMTg3LFwiMTI0NDNcIjoxMjQ2LFwiMTI0NDRcIjoxMjQ3LFwiMTI0NDlcIjoxMTkxLFwiMTI0NTBcIjoxMjAxLFwiMTI0NTFcIjoxMTkyLFwiMTI0NTJcIjoxMjAyLFwiMTI0NTNcIjoxMTkzLFwiMTI0NTRcIjoxMjAzLFwiMTI0NTVcIjoxMTk0LFwiMTI0NTZcIjoxMjA0LFwiMTI0NTdcIjoxMTk1LFwiMTI0NThcIjoxMjA1LFwiMTI0NTlcIjoxMjA2LFwiMTI0NjFcIjoxMjA3LFwiMTI0NjNcIjoxMjA4LFwiMTI0NjVcIjoxMjA5LFwiMTI0NjdcIjoxMjEwLFwiMTI0NjlcIjoxMjExLFwiMTI0NzFcIjoxMjEyLFwiMTI0NzNcIjoxMjEzLFwiMTI0NzVcIjoxMjE0LFwiMTI0NzdcIjoxMjE1LFwiMTI0NzlcIjoxMjE2LFwiMTI0ODFcIjoxMjE3LFwiMTI0ODNcIjoxMTk5LFwiMTI0ODRcIjoxMjE4LFwiMTI0ODZcIjoxMjE5LFwiMTI0ODhcIjoxMjIwLFwiMTI0OTBcIjoxMjIxLFwiMTI0OTFcIjoxMjIyLFwiMTI0OTJcIjoxMjIzLFwiMTI0OTNcIjoxMjI0LFwiMTI0OTRcIjoxMjI1LFwiMTI0OTVcIjoxMjI2LFwiMTI0OThcIjoxMjI3LFwiMTI1MDFcIjoxMjI4LFwiMTI1MDRcIjoxMjI5LFwiMTI1MDdcIjoxMjMwLFwiMTI1MTBcIjoxMjMxLFwiMTI1MTFcIjoxMjMyLFwiMTI1MTJcIjoxMjMzLFwiMTI1MTNcIjoxMjM0LFwiMTI1MTRcIjoxMjM1LFwiMTI1MTVcIjoxMTk2LFwiMTI1MTZcIjoxMjM2LFwiMTI1MTdcIjoxMTk3LFwiMTI1MThcIjoxMjM3LFwiMTI1MTlcIjoxMTk4LFwiMTI1MjBcIjoxMjM4LFwiMTI1MjFcIjoxMjM5LFwiMTI1MjJcIjoxMjQwLFwiMTI1MjNcIjoxMjQxLFwiMTI1MjRcIjoxMjQyLFwiMTI1MjVcIjoxMjQzLFwiMTI1MjdcIjoxMjQ0LFwiMTI1MzBcIjoxMTkwLFwiMTI1MzFcIjoxMjQ1LFwiMTI1MzlcIjoxMTg5LFwiMTI1NDBcIjoxMjAwfTtcblxuICAgIGZ1bmN0aW9uIGxvb2t1cChrKSB7IHJldHVybiBrID8ge2tleXN5bTogaywga2V5bmFtZToga2V5bmFtZXMgPyBrZXluYW1lc1trXSA6IGt9IDogdW5kZWZpbmVkOyB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZnJvbVVuaWNvZGUgOiBmdW5jdGlvbih1KSB7XG4gICAgICAgICAgICB2YXIga2V5c3ltID0gY29kZXBvaW50c1t1XTtcbiAgICAgICAgICAgIGlmIChrZXlzeW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGtleXN5bSA9IDB4MDEwMDAwMDAgfCB1O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGxvb2t1cChrZXlzeW0pO1xuICAgICAgICB9LFxuICAgICAgICBsb29rdXAgOiBsb29rdXBcbiAgICB9O1xufSkoKTtcblxuZXhwb3J0IGRlZmF1bHQga2V5c3ltc1xuIiwiaW1wb3J0IEtleVRhYmxlIGZyb20gXCIuL2tleXN5bVwiO1xuaW1wb3J0IGtleXN5bXMgZnJvbSBcIi4va2V5c3ltZGVmXCI7XG5cblxudmFyIEtleWJvYXJkVXRpbCA9IHt9O1xuXG4oZnVuY3Rpb24oKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBmdW5jdGlvbiBzdWJzdGl0dXRlQ29kZXBvaW50KGNwKSB7XG4gICAgICAgIC8vIEFueSBVbmljb2RlIGNvZGUgcG9pbnRzIHdoaWNoIGRvIG5vdCBoYXZlIGNvcnJlc3BvbmRpbmcga2V5c3ltIGVudHJpZXNcbiAgICAgICAgLy8gY2FuIGJlIHN3YXBwZWQgb3V0IGZvciBhbm90aGVyIGNvZGUgcG9pbnQgYnkgYWRkaW5nIHRoZW0gdG8gdGhpcyB0YWJsZVxuICAgICAgICB2YXIgc3Vic3RpdHV0aW9ucyA9IHtcbiAgICAgICAgICAgIC8vIHtTLHN9IHdpdGggY29tbWEgYmVsb3cgLT4ge1Msc30gd2l0aCBjZWRpbGxhXG4gICAgICAgICAgICAweDIxOCA6IDB4MTVlLFxuICAgICAgICAgICAgMHgyMTkgOiAweDE1ZixcbiAgICAgICAgICAgIC8vIHtULHR9IHdpdGggY29tbWEgYmVsb3cgLT4ge1QsdH0gd2l0aCBjZWRpbGxhXG4gICAgICAgICAgICAweDIxYSA6IDB4MTYyLFxuICAgICAgICAgICAgMHgyMWIgOiAweDE2M1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBzdWIgPSBzdWJzdGl0dXRpb25zW2NwXTtcbiAgICAgICAgcmV0dXJuIHN1YiA/IHN1YiA6IGNwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTWFjKCkge1xuICAgICAgICByZXR1cm4gbmF2aWdhdG9yICYmICEhKC9tYWMvaSkuZXhlYyhuYXZpZ2F0b3IucGxhdGZvcm0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc1dpbmRvd3MoKSB7XG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IgJiYgISEoL3dpbi9pKS5leGVjKG5hdmlnYXRvci5wbGF0Zm9ybSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzTGludXgoKSB7XG4gICAgICAgIHJldHVybiBuYXZpZ2F0b3IgJiYgISEoL2xpbnV4L2kpLmV4ZWMobmF2aWdhdG9yLnBsYXRmb3JtKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBhIG1vZGlmaWVyIHdoaWNoIGlzIG5vdCB0aGUgc3BlY2lmaWVkIGNoYXIgbW9kaWZpZXIgKGFuZCBpcyBub3Qgc2hpZnQpIGlzIGRvd25cbiAgICBmdW5jdGlvbiBoYXNTaG9ydGN1dE1vZGlmaWVyKGNoYXJNb2RpZmllciwgY3VycmVudE1vZGlmaWVycykge1xuICAgICAgICB2YXIgbW9kcyA9IHt9O1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gY3VycmVudE1vZGlmaWVycykge1xuICAgICAgICAgICAgaWYgKHBhcnNlSW50KGtleSkgIT09IEtleVRhYmxlLlhLX1NoaWZ0X0wpIHtcbiAgICAgICAgICAgICAgICBtb2RzW2tleV0gPSBjdXJyZW50TW9kaWZpZXJzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3VtID0gMDtcbiAgICAgICAgZm9yICh2YXIgayBpbiBjdXJyZW50TW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBpZiAobW9kc1trXSkge1xuICAgICAgICAgICAgICAgICsrc3VtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNDaGFyTW9kaWZpZXIoY2hhck1vZGlmaWVyLCBtb2RzKSkge1xuICAgICAgICAgICAgcmV0dXJuIHN1bSA+IGNoYXJNb2RpZmllci5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gc3VtID4gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgY2hhciBtb2RpZmllciBpcyBjdXJyZW50bHkgZG93blxuICAgIGZ1bmN0aW9uIGhhc0NoYXJNb2RpZmllcihjaGFyTW9kaWZpZXIsIGN1cnJlbnRNb2RpZmllcnMpIHtcbiAgICAgICAgaWYgKGNoYXJNb2RpZmllci5sZW5ndGggPT09IDApIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFyTW9kaWZpZXIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGlmICghY3VycmVudE1vZGlmaWVyc1tjaGFyTW9kaWZpZXJbaV1dKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEhlbHBlciBvYmplY3QgdHJhY2tpbmcgbW9kaWZpZXIga2V5IHN0YXRlXG4gICAgLy8gYW5kIGdlbmVyYXRlcyBmYWtlIGtleSBldmVudHMgdG8gY29tcGVuc2F0ZSBpZiBpdCBnZXRzIG91dCBvZiBzeW5jXG4gICAgZnVuY3Rpb24gTW9kaWZpZXJTeW5jKGNoYXJNb2RpZmllcikge1xuICAgICAgICBpZiAoIWNoYXJNb2RpZmllcikge1xuICAgICAgICAgICAgaWYgKGlzTWFjKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBvbiBNYWMsIE9wdGlvbiAoQUtBIEFsdCkgaXMgdXNlZCBhcyBhIGNoYXIgbW9kaWZpZXJcbiAgICAgICAgICAgICAgICBjaGFyTW9kaWZpZXIgPSBbS2V5VGFibGUuWEtfQWx0X0xdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNXaW5kb3dzKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBvbiBXaW5kb3dzLCBDdHJsK0FsdCBpcyB1c2VkIGFzIGEgY2hhciBtb2RpZmllclxuICAgICAgICAgICAgICAgIGNoYXJNb2RpZmllciA9IFtLZXlUYWJsZS5YS19BbHRfTCwgS2V5VGFibGUuWEtfQ29udHJvbF9MXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzTGludXgoKSkge1xuICAgICAgICAgICAgICAgIC8vIG9uIExpbnV4LCBJU08gTGV2ZWwgMyBTaGlmdCAoQWx0R3IpIGlzIHVzZWQgYXMgYSBjaGFyIG1vZGlmaWVyXG4gICAgICAgICAgICAgICAgY2hhck1vZGlmaWVyID0gW0tleVRhYmxlLlhLX0lTT19MZXZlbDNfU2hpZnRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY2hhck1vZGlmaWVyID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3RhdGUgPSB7fTtcbiAgICAgICAgc3RhdGVbS2V5VGFibGUuWEtfQ29udHJvbF9MXSA9IGZhbHNlO1xuICAgICAgICBzdGF0ZVtLZXlUYWJsZS5YS19BbHRfTF0gPSBmYWxzZTtcbiAgICAgICAgc3RhdGVbS2V5VGFibGUuWEtfSVNPX0xldmVsM19TaGlmdF0gPSBmYWxzZTtcbiAgICAgICAgc3RhdGVbS2V5VGFibGUuWEtfU2hpZnRfTF0gPSBmYWxzZTtcbiAgICAgICAgc3RhdGVbS2V5VGFibGUuWEtfTWV0YV9MXSA9IGZhbHNlO1xuXG4gICAgICAgIGZ1bmN0aW9uIHN5bmMoZXZ0LCBrZXlzeW0pIHtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgIGZ1bmN0aW9uIHN5bmNLZXkoa2V5c3ltKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtrZXlzeW06IGtleXN5bXMubG9va3VwKGtleXN5bSksIHR5cGU6IHN0YXRlW2tleXN5bV0gPyAna2V5ZG93bicgOiAna2V5dXAnfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGV2dC5jdHJsS2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICBldnQuY3RybEtleSAhPT0gc3RhdGVbS2V5VGFibGUuWEtfQ29udHJvbF9MXSAmJiBrZXlzeW0gIT09IEtleVRhYmxlLlhLX0NvbnRyb2xfTCkge1xuICAgICAgICAgICAgICAgIHN0YXRlW0tleVRhYmxlLlhLX0NvbnRyb2xfTF0gPSBldnQuY3RybEtleTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzeW5jS2V5KEtleVRhYmxlLlhLX0NvbnRyb2xfTCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV2dC5hbHRLZXkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIGV2dC5hbHRLZXkgIT09IHN0YXRlW0tleVRhYmxlLlhLX0FsdF9MXSAmJiBrZXlzeW0gIT09IEtleVRhYmxlLlhLX0FsdF9MKSB7XG4gICAgICAgICAgICAgICAgc3RhdGVbS2V5VGFibGUuWEtfQWx0X0xdID0gZXZ0LmFsdEtleTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzeW5jS2V5KEtleVRhYmxlLlhLX0FsdF9MKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXZ0LmFsdEdyYXBoS2V5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICBldnQuYWx0R3JhcGhLZXkgIT09IHN0YXRlW0tleVRhYmxlLlhLX0lTT19MZXZlbDNfU2hpZnRdICYmIGtleXN5bSAhPT0gS2V5VGFibGUuWEtfSVNPX0xldmVsM19TaGlmdCkge1xuICAgICAgICAgICAgICAgIHN0YXRlW0tleVRhYmxlLlhLX0lTT19MZXZlbDNfU2hpZnRdID0gZXZ0LmFsdEdyYXBoS2V5O1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHN5bmNLZXkoS2V5VGFibGUuWEtfSVNPX0xldmVsM19TaGlmdCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV2dC5zaGlmdEtleSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgZXZ0LnNoaWZ0S2V5ICE9PSBzdGF0ZVtLZXlUYWJsZS5YS19TaGlmdF9MXSAmJiBrZXlzeW0gIT09IEtleVRhYmxlLlhLX1NoaWZ0X0wpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZVtLZXlUYWJsZS5YS19TaGlmdF9MXSA9IGV2dC5zaGlmdEtleTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChzeW5jS2V5KEtleVRhYmxlLlhLX1NoaWZ0X0wpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChldnQubWV0YUtleSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgZXZ0Lm1ldGFLZXkgIT09IHN0YXRlW0tleVRhYmxlLlhLX01ldGFfTF0gJiYga2V5c3ltICE9PSBLZXlUYWJsZS5YS19NZXRhX0wpIHtcbiAgICAgICAgICAgICAgICBzdGF0ZVtLZXlUYWJsZS5YS19NZXRhX0xdID0gZXZ0Lm1ldGFLZXk7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goc3luY0tleShLZXlUYWJsZS5YS19NZXRhX0wpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gc3luY0tleUV2ZW50KGV2dCwgZG93bikge1xuICAgICAgICAgICAgdmFyIG9iaiA9IGdldEtleXN5bShldnQpO1xuICAgICAgICAgICAgdmFyIGtleXN5bSA9IG9iaiA/IG9iai5rZXlzeW0gOiBudWxsO1xuXG4gICAgICAgICAgICAvLyBmaXJzdCwgYXBwbHkgdGhlIGV2ZW50IGl0c2VsZiwgaWYgcmVsZXZhbnRcbiAgICAgICAgICAgIGlmIChrZXlzeW0gIT09IG51bGwgJiYgc3RhdGVba2V5c3ltXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc3RhdGVba2V5c3ltXSA9IGRvd247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc3luYyhldnQsIGtleXN5bSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLy8gc3luYyBvbiB0aGUgYXBwcm9wcmlhdGUga2V5Ym9hcmQgZXZlbnRcbiAgICAgICAgICAgIGtleWRvd246IGZ1bmN0aW9uKGV2dCkgeyByZXR1cm4gc3luY0tleUV2ZW50KGV2dCwgdHJ1ZSk7fSxcbiAgICAgICAgICAgIGtleXVwOiBmdW5jdGlvbihldnQpIHsgcmV0dXJuIHN5bmNLZXlFdmVudChldnQsIGZhbHNlKTt9LFxuICAgICAgICAgICAgLy8gQ2FsbCB0aGlzIHdpdGggYSBub24ta2V5Ym9hcmQgZXZlbnQgKHN1Y2ggYXMgbW91c2UgZXZlbnRzKSB0byB1c2UgaXRzIG1vZGlmaWVyIHN0YXRlIHRvIHN5bmNocm9uaXplIGFueXdheVxuICAgICAgICAgICAgc3luY0FueTogZnVuY3Rpb24oZXZ0KSB7IHJldHVybiBzeW5jKGV2dCk7fSxcblxuICAgICAgICAgICAgLy8gaXMgYSBzaG9ydGN1dCBtb2RpZmllciBkb3duP1xuICAgICAgICAgICAgaGFzU2hvcnRjdXRNb2RpZmllcjogZnVuY3Rpb24oKSB7IHJldHVybiBoYXNTaG9ydGN1dE1vZGlmaWVyKGNoYXJNb2RpZmllciwgc3RhdGUpOyB9LFxuICAgICAgICAgICAgLy8gaWYgYSBjaGFyIG1vZGlmaWVyIGlzIGRvd24sIHJldHVybiB0aGUga2V5cyBpdCBjb25zaXN0cyBvZiwgb3RoZXJ3aXNlIHJldHVybiBudWxsXG4gICAgICAgICAgICBhY3RpdmVDaGFyTW9kaWZpZXI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gaGFzQ2hhck1vZGlmaWVyKGNoYXJNb2RpZmllciwgc3RhdGUpID8gY2hhck1vZGlmaWVyIDogbnVsbDsgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEdldCBhIGtleSBJRCBmcm9tIGEga2V5Ym9hcmQgZXZlbnRcbiAgICAvLyBNYXkgYmUgYSBzdHJpbmcgb3IgYW4gaW50ZWdlciBkZXBlbmRpbmcgb24gdGhlIGF2YWlsYWJsZSBwcm9wZXJ0aWVzXG4gICAgZnVuY3Rpb24gZ2V0S2V5KGV2dCl7XG4gICAgICAgIGlmICgna2V5Q29kZScgaW4gZXZ0ICYmICdrZXknIGluIGV2dCkge1xuICAgICAgICAgICAgcmV0dXJuIGV2dC5rZXkgKyAnOicgKyBldnQua2V5Q29kZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgna2V5Q29kZScgaW4gZXZ0KSB7XG4gICAgICAgICAgICByZXR1cm4gZXZ0LmtleUNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZXZ0LmtleTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdldCB0aGUgbW9zdCByZWxpYWJsZSBrZXlzeW0gdmFsdWUgd2UgY2FuIGdldCBmcm9tIGEga2V5IGV2ZW50XG4gICAgLy8gaWYgY2hhci9jaGFyQ29kZSBpcyBhdmFpbGFibGUsIHByZWZlciB0aG9zZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0byBrZXkva2V5Q29kZS93aGljaFxuICAgIGZ1bmN0aW9uIGdldEtleXN5bShldnQpe1xuICAgICAgICB2YXIgY29kZXBvaW50O1xuICAgICAgICBpZiAoZXZ0LmNoYXIgJiYgZXZ0LmNoYXIubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBjb2RlcG9pbnQgPSBldnQuY2hhci5jaGFyQ29kZUF0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXZ0LmNoYXJDb2RlKSB7XG4gICAgICAgICAgICBjb2RlcG9pbnQgPSBldnQuY2hhckNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXZ0LmtleUNvZGUgJiYgZXZ0LnR5cGUgPT09ICdrZXlwcmVzcycpIHtcbiAgICAgICAgICAgIC8vIElFMTAgc3RvcmVzIHRoZSBjaGFyIGNvZGUgYXMga2V5Q29kZSwgYW5kIGhhcyBubyBvdGhlciB1c2VmdWwgcHJvcGVydGllc1xuICAgICAgICAgICAgY29kZXBvaW50ID0gZXZ0LmtleUNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvZGVwb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIGtleXN5bXMuZnJvbVVuaWNvZGUoc3Vic3RpdHV0ZUNvZGVwb2ludChjb2RlcG9pbnQpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB3ZSBjb3VsZCBjaGVjayBldnQua2V5IGhlcmUuXG4gICAgICAgIC8vIExlZ2FsIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2tleS12YWx1ZXMtbGlzdCxcbiAgICAgICAgLy8gc28gd2UgXCJqdXN0XCIgbmVlZCB0byBtYXAgdGhlbSB0byBrZXlzeW0sIGJ1dCBBRkFJSyB0aGlzIGlzIG9ubHkgYXZhaWxhYmxlIGluIElFMTAsIHdoaWNoIGFsc28gcHJvdmlkZXMgZXZ0LmtleVxuICAgICAgICAvLyBzbyB3ZSBkb24ndCAqbmVlZCogaXQgeWV0XG4gICAgICAgIGlmIChldnQua2V5Q29kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGtleXN5bXMubG9va3VwKGtleXN5bUZyb21LZXlDb2RlKGV2dC5rZXlDb2RlLCBldnQuc2hpZnRLZXkpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZ0LndoaWNoKSB7XG4gICAgICAgICAgICByZXR1cm4ga2V5c3ltcy5sb29rdXAoa2V5c3ltRnJvbUtleUNvZGUoZXZ0LndoaWNoLCBldnQuc2hpZnRLZXkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBHaXZlbiBhIGtleWNvZGUsIHRyeSB0byBwcmVkaWN0IHdoaWNoIGtleXN5bSBpdCBtaWdodCBiZS5cbiAgICAvLyBJZiB0aGUga2V5Y29kZSBpcyB1bmtub3duLCBudWxsIGlzIHJldHVybmVkLlxuICAgIGZ1bmN0aW9uIGtleXN5bUZyb21LZXlDb2RlKGtleWNvZGUsIHNoaWZ0UHJlc3NlZCkge1xuICAgICAgICBpZiAodHlwZW9mKGtleWNvZGUpICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gd29uJ3QgYmUgYWNjdXJhdGUgZm9yIGF6ZXJ0eVxuICAgICAgICBpZiAoa2V5Y29kZSA+PSAweDMwICYmIGtleWNvZGUgPD0gMHgzOSkge1xuICAgICAgICAgICAgcmV0dXJuIGtleWNvZGU7IC8vIGRpZ2l0XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleWNvZGUgPj0gMHg0MSAmJiBrZXljb2RlIDw9IDB4NWEpIHtcbiAgICAgICAgICAgIC8vIHJlbWFwIHRvIGxvd2VyY2FzZSB1bmxlc3Mgc2hpZnQgaXMgZG93blxuICAgICAgICAgICAgcmV0dXJuIHNoaWZ0UHJlc3NlZCA/IGtleWNvZGUgOiBrZXljb2RlICsgMzI7IC8vIEEtWlxuICAgICAgICB9XG4gICAgICAgIGlmIChrZXljb2RlID49IDB4NjAgJiYga2V5Y29kZSA8PSAweDY5KSB7XG4gICAgICAgICAgICByZXR1cm4gS2V5VGFibGUuWEtfS1BfMCArIChrZXljb2RlIC0gMHg2MCk7IC8vIG51bXBhZCAwLTlcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaChrZXljb2RlKSB7XG4gICAgICAgICAgICBjYXNlIDB4MjA6IHJldHVybiBLZXlUYWJsZS5YS19zcGFjZTtcbiAgICAgICAgICAgIGNhc2UgMHg2YTogcmV0dXJuIEtleVRhYmxlLlhLX0tQX011bHRpcGx5O1xuICAgICAgICAgICAgY2FzZSAweDZiOiByZXR1cm4gS2V5VGFibGUuWEtfS1BfQWRkO1xuICAgICAgICAgICAgY2FzZSAweDZjOiByZXR1cm4gS2V5VGFibGUuWEtfS1BfU2VwYXJhdG9yO1xuICAgICAgICAgICAgY2FzZSAweDZkOiByZXR1cm4gS2V5VGFibGUuWEtfS1BfU3VidHJhY3Q7XG4gICAgICAgICAgICBjYXNlIDB4NmU6IHJldHVybiBLZXlUYWJsZS5YS19LUF9EZWNpbWFsO1xuICAgICAgICAgICAgY2FzZSAweDZmOiByZXR1cm4gS2V5VGFibGUuWEtfS1BfRGl2aWRlO1xuICAgICAgICAgICAgY2FzZSAweGJiOiByZXR1cm4gS2V5VGFibGUuWEtfcGx1cztcbiAgICAgICAgICAgIGNhc2UgMHhiYzogcmV0dXJuIEtleVRhYmxlLlhLX2NvbW1hO1xuICAgICAgICAgICAgY2FzZSAweGJkOiByZXR1cm4gS2V5VGFibGUuWEtfbWludXM7XG4gICAgICAgICAgICBjYXNlIDB4YmU6IHJldHVybiBLZXlUYWJsZS5YS19wZXJpb2Q7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9uQ2hhcmFjdGVyS2V5KHtrZXlDb2RlOiBrZXljb2RlfSk7XG4gICAgfVxuXG4gICAgLy8gaWYgdGhlIGtleSBpcyBhIGtub3duIG5vbi1jaGFyYWN0ZXIga2V5IChhbnkga2V5IHdoaWNoIGRvZXNuJ3QgZ2VuZXJhdGUgY2hhcmFjdGVyIGRhdGEpXG4gICAgLy8gcmV0dXJuIGl0cyBrZXlzeW0gdmFsdWUuIE90aGVyd2lzZSByZXR1cm4gbnVsbFxuICAgIGZ1bmN0aW9uIG5vbkNoYXJhY3RlcktleShldnQpIHtcbiAgICAgICAgLy8gZXZ0LmtleSBub3QgaW1wbGVtZW50ZWQgeWV0XG4gICAgICAgIGlmICghZXZ0LmtleUNvZGUpIHsgcmV0dXJuIG51bGw7IH1cbiAgICAgICAgdmFyIGtleWNvZGUgPSBldnQua2V5Q29kZTtcblxuICAgICAgICBpZiAoa2V5Y29kZSA+PSAweDcwICYmIGtleWNvZGUgPD0gMHg4Nykge1xuICAgICAgICAgICAgcmV0dXJuIEtleVRhYmxlLlhLX0YxICsga2V5Y29kZSAtIDB4NzA7IC8vIEYxLUYyNFxuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAoa2V5Y29kZSkge1xuXG4gICAgICAgICAgICBjYXNlIDggOiByZXR1cm4gS2V5VGFibGUuWEtfQmFja1NwYWNlO1xuICAgICAgICAgICAgY2FzZSAxMyA6IHJldHVybiBLZXlUYWJsZS5YS19SZXR1cm47XG5cbiAgICAgICAgICAgIGNhc2UgOSA6IHJldHVybiBLZXlUYWJsZS5YS19UYWI7XG5cbiAgICAgICAgICAgIGNhc2UgMjcgOiByZXR1cm4gS2V5VGFibGUuWEtfRXNjYXBlO1xuICAgICAgICAgICAgY2FzZSA0NiA6IHJldHVybiBLZXlUYWJsZS5YS19EZWxldGU7XG5cbiAgICAgICAgICAgIGNhc2UgMzYgOiByZXR1cm4gS2V5VGFibGUuWEtfSG9tZTtcbiAgICAgICAgICAgIGNhc2UgMzUgOiByZXR1cm4gS2V5VGFibGUuWEtfRW5kO1xuICAgICAgICAgICAgY2FzZSAzMyA6IHJldHVybiBLZXlUYWJsZS5YS19QYWdlX1VwO1xuICAgICAgICAgICAgY2FzZSAzNCA6IHJldHVybiBLZXlUYWJsZS5YS19QYWdlX0Rvd247XG4gICAgICAgICAgICBjYXNlIDQ1IDogcmV0dXJuIEtleVRhYmxlLlhLX0luc2VydDtcblxuICAgICAgICAgICAgY2FzZSAzNyA6IHJldHVybiBLZXlUYWJsZS5YS19MZWZ0O1xuICAgICAgICAgICAgY2FzZSAzOCA6IHJldHVybiBLZXlUYWJsZS5YS19VcDtcbiAgICAgICAgICAgIGNhc2UgMzkgOiByZXR1cm4gS2V5VGFibGUuWEtfUmlnaHQ7XG4gICAgICAgICAgICBjYXNlIDQwIDogcmV0dXJuIEtleVRhYmxlLlhLX0Rvd247XG5cbiAgICAgICAgICAgIGNhc2UgMTYgOiByZXR1cm4gS2V5VGFibGUuWEtfU2hpZnRfTDtcbiAgICAgICAgICAgIGNhc2UgMTcgOiByZXR1cm4gS2V5VGFibGUuWEtfQ29udHJvbF9MO1xuICAgICAgICAgICAgY2FzZSAxOCA6IHJldHVybiBLZXlUYWJsZS5YS19BbHRfTDsgLy8gYWxzbzogT3B0aW9uLWtleSBvbiBNYWNcblxuICAgICAgICAgICAgY2FzZSAyMjQgOiByZXR1cm4gS2V5VGFibGUuWEtfTWV0YV9MO1xuICAgICAgICAgICAgY2FzZSAyMjUgOiByZXR1cm4gS2V5VGFibGUuWEtfSVNPX0xldmVsM19TaGlmdDsgLy8gQWx0R3JcbiAgICAgICAgICAgIGNhc2UgOTEgOiByZXR1cm4gS2V5VGFibGUuWEtfU3VwZXJfTDsgLy8gYWxzbzogV2luZG93cy1rZXlcbiAgICAgICAgICAgIGNhc2UgOTIgOiByZXR1cm4gS2V5VGFibGUuWEtfU3VwZXJfUjsgLy8gYWxzbzogV2luZG93cy1rZXlcbiAgICAgICAgICAgIGNhc2UgOTMgOiByZXR1cm4gS2V5VGFibGUuWEtfTWVudTsgLy8gYWxzbzogV2luZG93cy1NZW51LCBDb21tYW5kIG9uIE1hY1xuICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBLZXlib2FyZFV0aWwuaGFzU2hvcnRjdXRNb2RpZmllciA9IGhhc1Nob3J0Y3V0TW9kaWZpZXI7XG4gICAgS2V5Ym9hcmRVdGlsLmhhc0NoYXJNb2RpZmllciA9IGhhc0NoYXJNb2RpZmllcjtcbiAgICBLZXlib2FyZFV0aWwuTW9kaWZpZXJTeW5jID0gTW9kaWZpZXJTeW5jO1xuICAgIEtleWJvYXJkVXRpbC5nZXRLZXkgPSBnZXRLZXk7XG4gICAgS2V5Ym9hcmRVdGlsLmdldEtleXN5bSA9IGdldEtleXN5bTtcbiAgICBLZXlib2FyZFV0aWwua2V5c3ltRnJvbUtleUNvZGUgPSBrZXlzeW1Gcm9tS2V5Q29kZTtcbiAgICBLZXlib2FyZFV0aWwubm9uQ2hhcmFjdGVyS2V5ID0gbm9uQ2hhcmFjdGVyS2V5O1xuICAgIEtleWJvYXJkVXRpbC5zdWJzdGl0dXRlQ29kZXBvaW50ID0gc3Vic3RpdHV0ZUNvZGVwb2ludDtcbn0pKCk7XG5cbktleWJvYXJkVXRpbC5RRU1VS2V5RXZlbnREZWNvZGVyID0gZnVuY3Rpb24obW9kaWZpZXJTdGF0ZSwgbmV4dCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgZnVuY3Rpb24gc2VuZEFsbChldnRzKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZ0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgbmV4dChldnRzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBudW1QYWRDb2RlcyA9IFtcIk51bXBhZDBcIiwgXCJOdW1wYWQxXCIsIFwiTnVtcGFkMlwiLFxuICAgICAgICBcIk51bXBhZDNcIiwgXCJOdW1wYWQ0XCIsIFwiTnVtcGFkNVwiLCBcIk51bXBhZDZcIixcbiAgICAgICAgXCJOdW1wYWQ3XCIsIFwiTnVtcGFkOFwiLCBcIk51bXBhZDlcIiwgXCJOdW1wYWREZWNpbWFsXCJdO1xuXG4gICAgdmFyIG51bUxvY2tPbktleVN5bXMgPSB7XG4gICAgICAgIFwiTnVtcGFkMFwiOiAweGZmYjAsIFwiTnVtcGFkMVwiOiAweGZmYjEsIFwiTnVtcGFkMlwiOiAweGZmYjIsXG4gICAgICAgIFwiTnVtcGFkM1wiOiAweGZmYjMsIFwiTnVtcGFkNFwiOiAweGZmYjQsIFwiTnVtcGFkNVwiOiAweGZmYjUsXG4gICAgICAgIFwiTnVtcGFkNlwiOiAweGZmYjYsIFwiTnVtcGFkN1wiOiAweGZmYjcsIFwiTnVtcGFkOFwiOiAweGZmYjgsXG4gICAgICAgIFwiTnVtcGFkOVwiOiAweGZmYjksIFwiTnVtcGFkRGVjaW1hbFwiOiAweGZmYWNcbiAgICB9O1xuXG4gICAgdmFyIG51bUxvY2tPbktleUNvZGVzID0gWzk2LCA5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLFxuICAgICAgICAxMDMsIDEwNCwgMTA1LCAxMDgsIDExMF07XG5cbiAgICBmdW5jdGlvbiBpc051bVBhZE11bHRpS2V5KGV2dCkge1xuICAgICAgICByZXR1cm4gKG51bVBhZENvZGVzLmluZGV4T2YoZXZ0LmNvZGUpICE9PSAtMSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0TnVtUGFkS2V5U3ltKGV2dCkge1xuICAgICAgICBpZiAobnVtTG9ja09uS2V5Q29kZXMuaW5kZXhPZihldnQua2V5Q29kZSkgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVtTG9ja09uS2V5U3ltc1tldnQuY29kZV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJvY2VzcyhldnQsIHR5cGUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHt0eXBlOiB0eXBlfTtcbiAgICAgICAgcmVzdWx0LmNvZGUgPSBldnQuY29kZTtcbiAgICAgICAgcmVzdWx0LmtleXN5bSA9IDA7XG5cbiAgICAgICAgaWYgKGlzTnVtUGFkTXVsdGlLZXkoZXZ0KSkge1xuICAgICAgICAgICAgcmVzdWx0LmtleXN5bSA9IGdldE51bVBhZEtleVN5bShldnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGhhc01vZGlmaWVyID0gbW9kaWZpZXJTdGF0ZS5oYXNTaG9ydGN1dE1vZGlmaWVyKCkgfHwgISFtb2RpZmllclN0YXRlLmFjdGl2ZUNoYXJNb2RpZmllcigpO1xuICAgICAgICB2YXIgaXNTaGlmdCA9IGV2dC5rZXlDb2RlID09PSAweDEwIHx8IGV2dC5rZXkgPT09ICdTaGlmdCc7XG5cbiAgICAgICAgdmFyIHN1cHByZXNzID0gIWlzU2hpZnQgJiYgKHR5cGUgIT09ICdrZXlkb3duJyB8fCBtb2RpZmllclN0YXRlLmhhc1Nob3J0Y3V0TW9kaWZpZXIoKSB8fCAhIUtleWJvYXJkVXRpbC5ub25DaGFyYWN0ZXJLZXkoZXZ0KSk7XG5cbiAgICAgICAgbmV4dChyZXN1bHQpO1xuICAgICAgICByZXR1cm4gc3VwcHJlc3M7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGtleWRvd246IGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICAgICAgc2VuZEFsbChtb2RpZmllclN0YXRlLmtleWRvd24oZXZ0KSk7XG4gICAgICAgICAgICByZXR1cm4gcHJvY2VzcyhldnQsICdrZXlkb3duJyk7XG4gICAgICAgIH0sXG4gICAgICAgIGtleXByZXNzOiBmdW5jdGlvbihldnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgICAgICBrZXl1cDogZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgICAgICBzZW5kQWxsKG1vZGlmaWVyU3RhdGUua2V5dXAoZXZ0KSk7XG4gICAgICAgICAgICByZXR1cm4gcHJvY2VzcyhldnQsICdrZXl1cCcpO1xuICAgICAgICB9LFxuICAgICAgICBzeW5jTW9kaWZpZXJzOiBmdW5jdGlvbihldnQpIHtcbiAgICAgICAgICAgIHNlbmRBbGwobW9kaWZpZXJTdGF0ZS5zeW5jQW55KGV2dCkpO1xuICAgICAgICB9LFxuICAgICAgICByZWxlYXNlQWxsOiBmdW5jdGlvbigpIHsgbmV4dCh7dHlwZTogJ3JlbGVhc2VhbGwnfSk7IH1cbiAgICB9O1xufTtcblxuS2V5Ym9hcmRVdGlsLlRyYWNrUUVNVUtleVN0YXRlID0gZnVuY3Rpb24obmV4dCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIHZhciBzdGF0ZSA9IFtdO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgdmFyIGxhc3QgPSBzdGF0ZS5sZW5ndGggIT09IDAgPyBzdGF0ZVtzdGF0ZS5sZW5ndGgtMV0gOiBudWxsO1xuXG4gICAgICAgIHN3aXRjaCAoZXZ0LnR5cGUpIHtcbiAgICAgICAgY2FzZSAna2V5ZG93bic6XG5cbiAgICAgICAgICAgIGlmICghbGFzdCB8fCBsYXN0LmNvZGUgIT09IGV2dC5jb2RlKSB7XG4gICAgICAgICAgICAgICAgbGFzdCA9IHtjb2RlOiBldnQuY29kZX07XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUubGVuZ3RoID4gMCAmJiBzdGF0ZVtzdGF0ZS5sZW5ndGgtMV0uY29kZSA9PSAnQ29udHJvbExlZnQnKSB7XG4gICAgICAgICAgICAgICAgICAgICBpZiAoZXZ0LmNvZGUgIT09ICdBbHRSaWdodCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0KHtjb2RlOiAnQ29udHJvbExlZnQnLCB0eXBlOiAna2V5ZG93bicsIGtleXN5bTogMH0pO1xuICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RhdGUucHVzaChsYXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChldnQuY29kZSAhPT0gJ0NvbnRyb2xMZWZ0Jykge1xuICAgICAgICAgICAgICAgIG5leHQoZXZ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2tleXVwJzpcbiAgICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaWR4ID0gbnVsbDtcbiAgICAgICAgICAgIC8vIGRvIHdlIGhhdmUgYSBtYXRjaGluZyBrZXkgdHJhY2tlZCBhcyBiZWluZyBkb3duP1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgIT09IHN0YXRlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlW2ldLmNvZGUgPT09IGV2dC5jb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlkeCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGlmIHdlIGNvdWxkbid0IGZpbmQgYSBtYXRjaCAoaXQgaGFwcGVucyksIGFzc3VtZSBpdCB3YXMgdGhlIGxhc3Qga2V5IHByZXNzZWRcbiAgICAgICAgICAgIGlmIChpZHggPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZ0LmNvZGUgPT09ICdDb250cm9sTGVmdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZHggPSBzdGF0ZS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGF0ZS5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgIG5leHQoZXZ0KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyZWxlYXNlYWxsJzpcbiAgICAgICAgICAgIC8qIGpzaGludCBzaGFkb3c6IHRydWUgKi9cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBuZXh0KHtjb2RlOiBzdGF0ZVtpXS5jb2RlLCBrZXlzeW06IDAsIHR5cGU6ICdrZXl1cCd9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qIGpzaGludCBzaGFkb3c6IGZhbHNlICovXG4gICAgICAgICAgICBzdGF0ZSA9IFtdO1xuICAgICAgICB9XG4gICAgfTtcbn07XG5cbi8vIFRha2VzIGEgRE9NIGtleWJvYXJkIGV2ZW50IGFuZDpcbi8vIC0gZGV0ZXJtaW5lcyB3aGljaCBrZXlzeW0gaXQgcmVwcmVzZW50c1xuLy8gLSBkZXRlcm1pbmVzIGEga2V5SWQgIGlkZW50aWZ5aW5nIHRoZSBrZXkgdGhhdCB3YXMgcHJlc3NlZCAoY29ycmVzcG9uZGluZyB0byB0aGUga2V5L2tleUNvZGUgcHJvcGVydGllcyBvbiB0aGUgRE9NIGV2ZW50KVxuLy8gLSBzeW50aGVzaXplcyBldmVudHMgdG8gc3luY2hyb25pemUgbW9kaWZpZXIga2V5IHN0YXRlIGJldHdlZW4gd2hpY2ggbW9kaWZpZXJzIGFyZSBhY3R1YWxseSBkb3duLCBhbmQgd2hpY2ggd2UgdGhvdWdodCB3ZXJlIGRvd25cbi8vIC0gbWFya3MgZWFjaCBldmVudCB3aXRoIGFuICdlc2NhcGUnIHByb3BlcnR5IGlmIGEgbW9kaWZpZXIgd2FzIGRvd24gd2hpY2ggc2hvdWxkIGJlIFwiZXNjYXBlZFwiXG4vLyAtIGdlbmVyYXRlcyBhIFwic3RhbGxcIiBldmVudCBpbiBjYXNlcyB3aGVyZSBpdCBtaWdodCBiZSBuZWNlc3NhcnkgdG8gd2FpdCBhbmQgc2VlIGlmIGEga2V5cHJlc3MgZXZlbnQgZm9sbG93cyBhIGtleWRvd25cbi8vIFRoaXMgaW5mb3JtYXRpb24gaXMgY29sbGVjdGVkIGludG8gYW4gb2JqZWN0IHdoaWNoIGlzIHBhc3NlZCB0byB0aGUgbmV4dCgpIGZ1bmN0aW9uLiAob25lIGNhbGwgcGVyIGV2ZW50KVxuS2V5Ym9hcmRVdGlsLktleUV2ZW50RGVjb2RlciA9IGZ1bmN0aW9uKG1vZGlmaWVyU3RhdGUsIG5leHQpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICBmdW5jdGlvbiBzZW5kQWxsKGV2dHMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBuZXh0KGV2dHNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByb2Nlc3MoZXZ0LCB0eXBlKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSB7dHlwZTogdHlwZX07XG4gICAgICAgIHZhciBrZXlJZCA9IEtleWJvYXJkVXRpbC5nZXRLZXkoZXZ0KTtcbiAgICAgICAgaWYgKGtleUlkKSB7XG4gICAgICAgICAgICByZXN1bHQua2V5SWQgPSBrZXlJZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBrZXlzeW0gPSBLZXlib2FyZFV0aWwuZ2V0S2V5c3ltKGV2dCk7XG5cbiAgICAgICAgdmFyIGhhc01vZGlmaWVyID0gbW9kaWZpZXJTdGF0ZS5oYXNTaG9ydGN1dE1vZGlmaWVyKCkgfHwgISFtb2RpZmllclN0YXRlLmFjdGl2ZUNoYXJNb2RpZmllcigpO1xuICAgICAgICAvLyBJcyB0aGlzIGEgY2FzZSB3aGVyZSB3ZSBoYXZlIHRvIGRlY2lkZSBvbiB0aGUga2V5c3ltIHJpZ2h0IGF3YXksIHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIHRoZSBrZXlwcmVzcz9cbiAgICAgICAgLy8gXCJzcGVjaWFsXCIga2V5cyBsaWtlIGVudGVyLCB0YWIgb3IgYmFja3NwYWNlIGRvbid0IHNlbmQga2V5cHJlc3MgZXZlbnRzLFxuICAgICAgICAvLyBhbmQgc29tZSBicm93c2VycyBkb24ndCBzZW5kIGtleXByZXNzZXMgYXQgYWxsIGlmIGEgbW9kaWZpZXIgaXMgZG93blxuICAgICAgICBpZiAoa2V5c3ltICYmICh0eXBlICE9PSAna2V5ZG93bicgfHwgS2V5Ym9hcmRVdGlsLm5vbkNoYXJhY3RlcktleShldnQpIHx8IGhhc01vZGlmaWVyKSkge1xuICAgICAgICAgICAgcmVzdWx0LmtleXN5bSA9IGtleXN5bTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpc1NoaWZ0ID0gZXZ0LmtleUNvZGUgPT09IDB4MTAgfHwgZXZ0LmtleSA9PT0gJ1NoaWZ0JztcblxuICAgICAgICAvLyBTaG91bGQgd2UgcHJldmVudCB0aGUgYnJvd3NlciBmcm9tIGhhbmRsaW5nIHRoZSBldmVudD9cbiAgICAgICAgLy8gRG9pbmcgc28gb24gYSBrZXlkb3duIChpbiBtb3N0IGJyb3dzZXJzKSBwcmV2ZW50cyBrZXlwcmVzcyBmcm9tIGJlaW5nIGdlbmVyYXRlZFxuICAgICAgICAvLyBzbyBvbmx5IGRvIHRoYXQgaWYgd2UgaGF2ZSB0by5cbiAgICAgICAgdmFyIHN1cHByZXNzID0gIWlzU2hpZnQgJiYgKHR5cGUgIT09ICdrZXlkb3duJyB8fCBtb2RpZmllclN0YXRlLmhhc1Nob3J0Y3V0TW9kaWZpZXIoKSB8fCAhIUtleWJvYXJkVXRpbC5ub25DaGFyYWN0ZXJLZXkoZXZ0KSk7XG5cbiAgICAgICAgLy8gSWYgYSBjaGFyIG1vZGlmaWVyIGlzIGRvd24gb24gYSBrZXlkb3duLCB3ZSBuZWVkIHRvIGluc2VydCBhIHN0YWxsLFxuICAgICAgICAvLyBzbyBWZXJpZnlDaGFyTW9kaWZpZXIga25vd3MgdG8gd2FpdCBhbmQgc2VlIGlmIGEga2V5cHJlc3MgaXMgY29tbmlnXG4gICAgICAgIHZhciBzdGFsbCA9IHR5cGUgPT09ICdrZXlkb3duJyAmJiBtb2RpZmllclN0YXRlLmFjdGl2ZUNoYXJNb2RpZmllcigpICYmICFLZXlib2FyZFV0aWwubm9uQ2hhcmFjdGVyS2V5KGV2dCk7XG5cbiAgICAgICAgLy8gaWYgYSBjaGFyIG1vZGlmaWVyIGlzIHByZXNzZWQsIGdldCB0aGUga2V5cyBpdCBjb25zaXN0cyBvZiAob24gV2luZG93cywgQWx0R3IgaXMgZXF1aXZhbGVudCB0byBDdHJsK0FsdClcbiAgICAgICAgdmFyIGFjdGl2ZSA9IG1vZGlmaWVyU3RhdGUuYWN0aXZlQ2hhck1vZGlmaWVyKCk7XG5cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGNoYXIgbW9kaWZpZXIgZG93biwgYW5kIHdlJ3JlIGFibGUgdG8gZGV0ZXJtaW5lIGEga2V5c3ltIHJlbGlhYmx5XG4gICAgICAgIC8vIHRoZW4gKGEpIHdlIGtub3cgdG8gdHJlYXQgdGhlIG1vZGlmaWVyIGFzIGEgY2hhciBtb2RpZmllcixcbiAgICAgICAgLy8gYW5kIChiKSB3ZSdsbCBoYXZlIHRvIFwiZXNjYXBlXCIgdGhlIG1vZGlmaWVyIHRvIHVuZG8gdGhlIG1vZGlmaWVyIHdoZW4gc2VuZGluZyB0aGUgY2hhci5cbiAgICAgICAgaWYgKGFjdGl2ZSAmJiBrZXlzeW0pIHtcbiAgICAgICAgICAgIHZhciBpc0NoYXJNb2RpZmllciA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yICh2YXIgaSAgPSAwOyBpIDwgYWN0aXZlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVtpXSA9PT0ga2V5c3ltLmtleXN5bSkge1xuICAgICAgICAgICAgICAgICAgICBpc0NoYXJNb2RpZmllciA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdrZXlwcmVzcycgJiYgIWlzQ2hhck1vZGlmaWVyKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmVzY2FwZSA9IG1vZGlmaWVyU3RhdGUuYWN0aXZlQ2hhck1vZGlmaWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhbGwpIHtcbiAgICAgICAgICAgIC8vIGluc2VydCBhIGZha2UgXCJzdGFsbFwiIGV2ZW50XG4gICAgICAgICAgICBuZXh0KHt0eXBlOiAnc3RhbGwnfSk7XG4gICAgICAgIH1cbiAgICAgICAgbmV4dChyZXN1bHQpO1xuXG4gICAgICAgIHJldHVybiBzdXBwcmVzcztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBrZXlkb3duOiBmdW5jdGlvbihldnQpIHtcbiAgICAgICAgICAgIHNlbmRBbGwobW9kaWZpZXJTdGF0ZS5rZXlkb3duKGV2dCkpO1xuICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MoZXZ0LCAna2V5ZG93bicpO1xuICAgICAgICB9LFxuICAgICAgICBrZXlwcmVzczogZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvY2VzcyhldnQsICdrZXlwcmVzcycpO1xuICAgICAgICB9LFxuICAgICAgICBrZXl1cDogZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgICAgICBzZW5kQWxsKG1vZGlmaWVyU3RhdGUua2V5dXAoZXZ0KSk7XG4gICAgICAgICAgICByZXR1cm4gcHJvY2VzcyhldnQsICdrZXl1cCcpO1xuICAgICAgICB9LFxuICAgICAgICBzeW5jTW9kaWZpZXJzOiBmdW5jdGlvbihldnQpIHtcbiAgICAgICAgICAgIHNlbmRBbGwobW9kaWZpZXJTdGF0ZS5zeW5jQW55KGV2dCkpO1xuICAgICAgICB9LFxuICAgICAgICByZWxlYXNlQWxsOiBmdW5jdGlvbigpIHsgbmV4dCh7dHlwZTogJ3JlbGVhc2VhbGwnfSk7IH1cbiAgICB9O1xufTtcblxuLy8gQ29tYmluZXMga2V5ZG93biBhbmQga2V5cHJlc3MgZXZlbnRzIHdoZXJlIG5lY2Vzc2FyeSB0byBoYW5kbGUgY2hhciBtb2RpZmllcnMuXG4vLyBPbiBzb21lIE9TJ2VzLCBhIGNoYXIgbW9kaWZpZXIgaXMgc29tZXRpbWVzIHVzZWQgYXMgYSBzaG9ydGN1dCBtb2RpZmllci5cbi8vIEZvciBleGFtcGxlLCBvbiBXaW5kb3dzLCBBbHRHciBpcyBzeW5vbnltb3VzIHdpdGggQ3RybC1BbHQuIE9uIGEgRGFuaXNoIGtleWJvYXJkIGxheW91dCwgQWx0R3ItMiB5aWVsZHMgYSBALCBidXQgQ3RybC1BbHQtRCBkb2VzIG5vdGhpbmdcbi8vIHNvIHdoZW4gdXNlZCB3aXRoIHRoZSAnMicga2V5LCBDdHJsLUFsdCBjb3VudHMgYXMgYSBjaGFyIG1vZGlmaWVyIChhbmQgc2hvdWxkIGJlIGVzY2FwZWQpLCBidXQgd2hlbiB1c2VkIHdpdGggJ0QnLCBpdCBkb2VzIG5vdC5cbi8vIFRoZSBvbmx5IHdheSB3ZSBjYW4gZGlzdGluZ3Vpc2ggdGhlc2UgY2FzZXMgaXMgdG8gd2FpdCBhbmQgc2VlIGlmIGEga2V5cHJlc3MgZXZlbnQgYXJyaXZlc1xuLy8gV2hlbiB3ZSByZWNlaXZlIGEgXCJzdGFsbFwiIGV2ZW50LCB3YWl0IGEgZmV3IG1zIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBuZXh0IGtleWRvd24uIElmIGEga2V5cHJlc3MgaGFzIGFsc28gYXJyaXZlZCwgbWVyZ2UgdGhlIHR3b1xuS2V5Ym9hcmRVdGlsLlZlcmlmeUNoYXJNb2RpZmllciA9IGZ1bmN0aW9uKG5leHQpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICB2YXIgcXVldWUgPSBbXTtcbiAgICB2YXIgdGltZXIgPSBudWxsO1xuICAgIGZ1bmN0aW9uIHByb2Nlc3MoKSB7XG4gICAgICAgIGlmICh0aW1lcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRlbGF5UHJvY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICB0aW1lciA9IG51bGw7XG4gICAgICAgICAgICBwcm9jZXNzKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdmFyIGN1ciA9IHF1ZXVlWzBdO1xuICAgICAgICAgICAgcXVldWUgPSBxdWV1ZS5zcGxpY2UoMSk7XG4gICAgICAgICAgICBzd2l0Y2ggKGN1ci50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdzdGFsbCc6XG4gICAgICAgICAgICAgICAgLy8gaW5zZXJ0IGEgZGVsYXkgYmVmb3JlIHByb2Nlc3NpbmcgYXZhaWxhYmxlIGV2ZW50cy5cbiAgICAgICAgICAgICAgICAvKiBqc2hpbnQgbG9vcGZ1bmM6IHRydWUgKi9cbiAgICAgICAgICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoZGVsYXlQcm9jZXNzLCA1KTtcbiAgICAgICAgICAgICAgICAvKiBqc2hpbnQgbG9vcGZ1bmM6IGZhbHNlICovXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY2FzZSAna2V5ZG93bic6XG4gICAgICAgICAgICAgICAgLy8gaXMgdGhlIG5leHQgZWxlbWVudCBhIGtleXByZXNzPyBUaGVuIHdlIHNob3VsZCBtZXJnZSB0aGUgdHdvXG4gICAgICAgICAgICAgICAgaWYgKHF1ZXVlLmxlbmd0aCAhPT0gMCAmJiBxdWV1ZVswXS50eXBlID09PSAna2V5cHJlc3MnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggc2VuZHMga2V5cHJlc3MgZXZlbiB3aGVuIG5vIGNoYXIgaXMgZ2VuZXJhdGVkLlxuICAgICAgICAgICAgICAgICAgICAvLyBzbywgaWYga2V5cHJlc3Mga2V5c3ltIGlzIHRoZSBzYW1lIGFzIHdlJ2QgaGF2ZSBndWVzc2VkIGZyb20ga2V5ZG93bixcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG1vZGlmaWVyIGRpZG4ndCBoYXZlIGFueSBlZmZlY3QsIGFuZCBzaG91bGQgbm90IGJlIGVzY2FwZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlWzBdLmVzY2FwZSAmJiAoIWN1ci5rZXlzeW0gfHwgY3VyLmtleXN5bS5rZXlzeW0gIT09IHF1ZXVlWzBdLmtleXN5bS5rZXlzeW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXIuZXNjYXBlID0gcXVldWVbMF0uZXNjYXBlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGN1ci5rZXlzeW0gPSBxdWV1ZVswXS5rZXlzeW07XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlID0gcXVldWUuc3BsaWNlKDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gc3dhbGxvdyBzdGFsbCBldmVudHMsIGFuZCBwYXNzIGFsbCBvdGhlcnMgdG8gdGhlIG5leHQgc3RhZ2VcbiAgICAgICAgICAgIGlmIChjdXIudHlwZSAhPT0gJ3N0YWxsJykge1xuICAgICAgICAgICAgICAgIG5leHQoY3VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24oZXZ0KSB7XG4gICAgICAgIHF1ZXVlLnB1c2goZXZ0KTtcbiAgICAgICAgcHJvY2VzcygpO1xuICAgIH07XG59O1xuXG4vLyBLZWVwcyB0cmFjayBvZiB3aGljaCBrZXlzIHdlIChhbmQgdGhlIHNlcnZlcikgYmVsaWV2ZSBhcmUgZG93blxuLy8gV2hlbiBhIGtleXVwIGlzIHJlY2VpdmVkLCBtYXRjaCBpdCBhZ2FpbnN0IHRoaXMgbGlzdCwgdG8gZGV0ZXJtaW5lIHRoZSBjb3JyZXNwb25kaW5nIGtleXN5bShzKVxuLy8gaW4gc29tZSBjYXNlcywgYSBzaW5nbGUga2V5IG1heSBwcm9kdWNlIG11bHRpcGxlIGtleXN5bXMsIHNvIHRoZSBjb3JyZXNwb25kaW5nIGtleXVwIGV2ZW50IG11c3QgcmVsZWFzZSBhbGwgb2YgdGhlc2UgY2hhcnNcbi8vIGtleSByZXBlYXQgZXZlbnRzIHNob3VsZCBiZSBtZXJnZWQgaW50byBhIHNpbmdsZSBlbnRyeS5cbi8vIEJlY2F1c2Ugd2UgY2FuJ3QgYWx3YXlzIGlkZW50aWZ5IHdoaWNoIGVudHJ5IGEga2V5ZG93biBvciBrZXl1cCBldmVudCBjb3JyZXNwb25kcyB0bywgd2Ugc29tZXRpbWVzIGhhdmUgdG8gZ3Vlc3NcbktleWJvYXJkVXRpbC5UcmFja0tleVN0YXRlID0gZnVuY3Rpb24obmV4dCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIHZhciBzdGF0ZSA9IFtdO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChldnQpIHtcbiAgICAgICAgdmFyIGxhc3QgPSBzdGF0ZS5sZW5ndGggIT09IDAgPyBzdGF0ZVtzdGF0ZS5sZW5ndGgtMV0gOiBudWxsO1xuXG4gICAgICAgIHN3aXRjaCAoZXZ0LnR5cGUpIHtcbiAgICAgICAgY2FzZSAna2V5ZG93bic6XG4gICAgICAgICAgICAvLyBpbnNlcnQgYSBuZXcgZW50cnkgaWYgbGFzdCBzZWVuIGtleSB3YXMgZGlmZmVyZW50LlxuICAgICAgICAgICAgaWYgKCFsYXN0IHx8ICFldnQua2V5SWQgfHwgbGFzdC5rZXlJZCAhPT0gZXZ0LmtleUlkKSB7XG4gICAgICAgICAgICAgICAgbGFzdCA9IHtrZXlJZDogZXZ0LmtleUlkLCBrZXlzeW1zOiB7fX07XG4gICAgICAgICAgICAgICAgc3RhdGUucHVzaChsYXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChldnQua2V5c3ltKSB7XG4gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGxhc3QgZXZlbnQgY29udGFpbnMgdGhpcyBrZXlzeW0gKGEgc2luZ2xlIFwibG9naWNhbFwiIGtleWV2ZW50XG4gICAgICAgICAgICAgICAgLy8gY2FuIGNhdXNlIG11bHRpcGxlIGtleSBldmVudHMgdG8gYmUgc2VudCB0byB0aGUgVk5DIHNlcnZlcilcbiAgICAgICAgICAgICAgICBsYXN0LmtleXN5bXNbZXZ0LmtleXN5bS5rZXlzeW1dID0gZXZ0LmtleXN5bTtcbiAgICAgICAgICAgICAgICBsYXN0Lmlnbm9yZUtleVByZXNzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBuZXh0KGV2dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAna2V5cHJlc3MnOlxuICAgICAgICAgICAgaWYgKCFsYXN0KSB7XG4gICAgICAgICAgICAgICAgbGFzdCA9IHtrZXlJZDogZXZ0LmtleUlkLCBrZXlzeW1zOiB7fX07XG4gICAgICAgICAgICAgICAgc3RhdGUucHVzaChsYXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghZXZ0LmtleXN5bSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdrZXlwcmVzcyB3aXRoIG5vIGtleXN5bTonLCBldnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgZXhwZWN0IGEga2V5cHJlc3MsIGFuZCBhbHJlYWR5IHNlbnQgYSBrZXlkb3duIHRvIHRoZSBWTkMgc2VydmVyXG4gICAgICAgICAgICAvLyBiYXNlZCBvbiB0aGUga2V5ZG93biwgbWFrZSBzdXJlIHRvIHNraXAgdGhpcyBldmVudC5cbiAgICAgICAgICAgIGlmIChldnQua2V5c3ltICYmICFsYXN0Lmlnbm9yZUtleVByZXNzKSB7XG4gICAgICAgICAgICAgICAgbGFzdC5rZXlzeW1zW2V2dC5rZXlzeW0ua2V5c3ltXSA9IGV2dC5rZXlzeW07XG4gICAgICAgICAgICAgICAgZXZ0LnR5cGUgPSAna2V5ZG93bic7XG4gICAgICAgICAgICAgICAgbmV4dChldnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2tleXVwJzpcbiAgICAgICAgICAgIGlmIChzdGF0ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaWR4ID0gbnVsbDtcbiAgICAgICAgICAgIC8vIGRvIHdlIGhhdmUgYSBtYXRjaGluZyBrZXkgdHJhY2tlZCBhcyBiZWluZyBkb3duP1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgIT09IHN0YXRlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlW2ldLmtleUlkID09PSBldnQua2V5SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWR4ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgd2UgY291bGRuJ3QgZmluZCBhIG1hdGNoIChpdCBoYXBwZW5zKSwgYXNzdW1lIGl0IHdhcyB0aGUgbGFzdCBrZXkgcHJlc3NlZFxuICAgICAgICAgICAgaWYgKGlkeCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlkeCA9IHN0YXRlLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBpdGVtID0gc3RhdGUuc3BsaWNlKGlkeCwgMSlbMF07XG4gICAgICAgICAgICAvLyBmb3IgZWFjaCBrZXlzeW0gdHJhY2tlZCBieSB0aGlzIGtleSBlbnRyeSwgY2xvbmUgdGhlIGN1cnJlbnQgZXZlbnQgYW5kIG92ZXJyaWRlIHRoZSBrZXlzeW1cbiAgICAgICAgICAgIHZhciBjbG9uZSA9IChmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIENsb25lKCl7fVxuICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAob2JqKSB7IENsb25lLnByb3RvdHlwZT1vYmo7IHJldHVybiBuZXcgQ2xvbmUoKTsgfTtcbiAgICAgICAgICAgIH0oKSk7XG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gaXRlbS5rZXlzeW1zKSB7XG4gICAgICAgICAgICAgICAgdmFyIG91dCA9IGNsb25lKGV2dCk7XG4gICAgICAgICAgICAgICAgb3V0LmtleXN5bSA9IGl0ZW0ua2V5c3ltc1trZXldO1xuICAgICAgICAgICAgICAgIG5leHQob3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyZWxlYXNlYWxsJzpcbiAgICAgICAgICAgIC8qIGpzaGludCBzaGFkb3c6IHRydWUgKi9cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc3RhdGVbaV0ua2V5c3ltcykge1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5c3ltID0gc3RhdGVbaV0ua2V5c3ltc1trZXldO1xuICAgICAgICAgICAgICAgICAgICBuZXh0KHtrZXlJZDogMCwga2V5c3ltOiBrZXlzeW0sIHR5cGU6ICdrZXl1cCd9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiBqc2hpbnQgc2hhZG93OiBmYWxzZSAqL1xuICAgICAgICAgICAgc3RhdGUgPSBbXTtcbiAgICAgICAgfVxuICAgIH07XG59O1xuXG4vLyBIYW5kbGVzIFwiZXNjYXBpbmdcIiBvZiBtb2RpZmllcnM6IGlmIGEgY2hhciBtb2RpZmllciBpcyB1c2VkIHRvIHByb2R1Y2UgYSBrZXlzeW0gKHN1Y2ggYXMgQWx0R3ItMiB0byBnZW5lcmF0ZSBhbiBAKSxcbi8vIHRoZW4gdGhlIG1vZGlmaWVyIG11c3QgYmUgXCJ1bmRvbmVcIiBiZWZvcmUgc2VuZGluZyB0aGUgQCwgYW5kIFwicmVkb25lXCIgYWZ0ZXJ3YXJkcy5cbktleWJvYXJkVXRpbC5Fc2NhcGVNb2RpZmllcnMgPSBmdW5jdGlvbihuZXh0KSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICBpZiAoZXZ0LnR5cGUgIT09ICdrZXlkb3duJyB8fCBldnQuZXNjYXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5leHQoZXZ0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyB1bmRvIG1vZGlmaWVyc1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2dC5lc2NhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIG5leHQoe3R5cGU6ICdrZXl1cCcsIGtleUlkOiAwLCBrZXlzeW06IGtleXN5bXMubG9va3VwKGV2dC5lc2NhcGVbaV0pfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2VuZCB0aGUgY2hhcmFjdGVyIGV2ZW50XG4gICAgICAgIG5leHQoZXZ0KTtcbiAgICAgICAgLy8gcmVkbyBtb2RpZmllcnNcbiAgICAgICAgLyoganNoaW50IHNoYWRvdzogdHJ1ZSAqL1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2dC5lc2NhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIG5leHQoe3R5cGU6ICdrZXlkb3duJywga2V5SWQ6IDAsIGtleXN5bToga2V5c3ltcy5sb29rdXAoZXZ0LmVzY2FwZVtpXSl9KTtcbiAgICAgICAgfVxuICAgICAgICAvKiBqc2hpbnQgc2hhZG93OiBmYWxzZSAqL1xuICAgIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCBLZXlib2FyZFV0aWw7XG4iLCJ2YXIgWHRTY2FuY29kZSA9IHtcbiAgICBcIkVzY2FwZVwiOiAweDAwMDEsXG4gICAgXCJEaWdpdDFcIjogMHgwMDAyLFxuICAgIFwiRGlnaXQyXCI6IDB4MDAwMyxcbiAgICBcIkRpZ2l0M1wiOiAweDAwMDQsXG4gICAgXCJEaWdpdDRcIjogMHgwMDA1LFxuICAgIFwiRGlnaXQ1XCI6IDB4MDAwNixcbiAgICBcIkRpZ2l0NlwiOiAweDAwMDcsXG4gICAgXCJEaWdpdDdcIjogMHgwMDA4LFxuICAgIFwiRGlnaXQ4XCI6IDB4MDAwOSxcbiAgICBcIkRpZ2l0OVwiOiAweDAwMEEsXG4gICAgXCJEaWdpdDBcIjogMHgwMDBCLFxuICAgIFwiTWludXNcIjogMHgwMDBDLFxuICAgIFwiRXF1YWxcIjogMHgwMDBELFxuICAgIFwiQmFja3NwYWNlXCI6IDB4MDAwRSxcbiAgICBcIlRhYlwiOiAweDAwMEYsXG4gICAgXCJLZXlRXCI6IDB4MDAxMCxcbiAgICBcIktleVdcIjogMHgwMDExLFxuICAgIFwiS2V5RVwiOiAweDAwMTIsXG4gICAgXCJLZXlSXCI6IDB4MDAxMyxcbiAgICBcIktleVRcIjogMHgwMDE0LFxuICAgIFwiS2V5WVwiOiAweDAwMTUsXG4gICAgXCJLZXlVXCI6IDB4MDAxNixcbiAgICBcIktleUlcIjogMHgwMDE3LFxuICAgIFwiS2V5T1wiOiAweDAwMTgsXG4gICAgXCJLZXlQXCI6IDB4MDAxOSxcbiAgICBcIkJyYWNrZXRMZWZ0XCI6IDB4MDAxQSxcbiAgICBcIkJyYWNrZXRSaWdodFwiOiAweDAwMUIsXG4gICAgXCJFbnRlclwiOiAweDAwMUMsXG4gICAgXCJDb250cm9sTGVmdFwiOiAweDAwMUQsXG4gICAgXCJLZXlBXCI6IDB4MDAxRSxcbiAgICBcIktleVNcIjogMHgwMDFGLFxuICAgIFwiS2V5RFwiOiAweDAwMjAsXG4gICAgXCJLZXlGXCI6IDB4MDAyMSxcbiAgICBcIktleUdcIjogMHgwMDIyLFxuICAgIFwiS2V5SFwiOiAweDAwMjMsXG4gICAgXCJLZXlKXCI6IDB4MDAyNCxcbiAgICBcIktleUtcIjogMHgwMDI1LFxuICAgIFwiS2V5TFwiOiAweDAwMjYsXG4gICAgXCJTZW1pY29sb25cIjogMHgwMDI3LFxuICAgIFwiUXVvdGVcIjogMHgwMDI4LFxuICAgIFwiQmFja3F1b3RlXCI6IDB4MDAyOSxcbiAgICBcIlNoaWZ0TGVmdFwiOiAweDAwMkEsXG4gICAgXCJCYWNrc2xhc2hcIjogMHgwMDJCLFxuICAgIFwiS2V5WlwiOiAweDAwMkMsXG4gICAgXCJLZXlYXCI6IDB4MDAyRCxcbiAgICBcIktleUNcIjogMHgwMDJFLFxuICAgIFwiS2V5VlwiOiAweDAwMkYsXG4gICAgXCJLZXlCXCI6IDB4MDAzMCxcbiAgICBcIktleU5cIjogMHgwMDMxLFxuICAgIFwiS2V5TVwiOiAweDAwMzIsXG4gICAgXCJDb21tYVwiOiAweDAwMzMsXG4gICAgXCJQZXJpb2RcIjogMHgwMDM0LFxuICAgIFwiU2xhc2hcIjogMHgwMDM1LFxuICAgIFwiU2hpZnRSaWdodFwiOiAweDAwMzYsXG4gICAgXCJOdW1wYWRNdWx0aXBseVwiOiAweDAwMzcsXG4gICAgXCJBbHRMZWZ0XCI6IDB4MDAzOCxcbiAgICBcIlNwYWNlXCI6IDB4MDAzOSxcbiAgICBcIkNhcHNMb2NrXCI6IDB4MDAzQSxcbiAgICBcIkYxXCI6IDB4MDAzQixcbiAgICBcIkYyXCI6IDB4MDAzQyxcbiAgICBcIkYzXCI6IDB4MDAzRCxcbiAgICBcIkY0XCI6IDB4MDAzRSxcbiAgICBcIkY1XCI6IDB4MDAzRixcbiAgICBcIkY2XCI6IDB4MDA0MCxcbiAgICBcIkY3XCI6IDB4MDA0MSxcbiAgICBcIkY4XCI6IDB4MDA0MixcbiAgICBcIkY5XCI6IDB4MDA0MyxcbiAgICBcIkYxMFwiOiAweDAwNDQsXG4gICAgXCJQYXVzZVwiOiAweEUwNDUsXG4gICAgXCJTY3JvbGxMb2NrXCI6IDB4MDA0NixcbiAgICBcIk51bXBhZDdcIjogMHgwMDQ3LFxuICAgIFwiTnVtcGFkOFwiOiAweDAwNDgsXG4gICAgXCJOdW1wYWQ5XCI6IDB4MDA0OSxcbiAgICBcIk51bXBhZFN1YnRyYWN0XCI6IDB4MDA0QSxcbiAgICBcIk51bXBhZDRcIjogMHgwMDRCLFxuICAgIFwiTnVtcGFkNVwiOiAweDAwNEMsXG4gICAgXCJOdW1wYWQ2XCI6IDB4MDA0RCxcbiAgICBcIk51bXBhZEFkZFwiOiAweDAwNEUsXG4gICAgXCJOdW1wYWQxXCI6IDB4MDA0RixcbiAgICBcIk51bXBhZDJcIjogMHgwMDUwLFxuICAgIFwiTnVtcGFkM1wiOiAweDAwNTEsXG4gICAgXCJOdW1wYWQwXCI6IDB4MDA1MixcbiAgICBcIk51bXBhZERlY2ltYWxcIjogMHgwMDUzLFxuICAgIFwiSW50bEJhY2tzbGFzaFwiOiAweDAwNTYsXG4gICAgXCJGMTFcIjogMHgwMDU3LFxuICAgIFwiRjEyXCI6IDB4MDA1OCxcbiAgICBcIkludGxZZW5cIjogMHgwMDdELFxuICAgIFwiTWVkaWFUcmFja1ByZXZpb3VzXCI6IDB4RTAxMCxcbiAgICBcIk1lZGlhVHJhY2tOZXh0XCI6IDB4RTAxOSxcbiAgICBcIk51bXBhZEVudGVyXCI6IDB4RTAxQyxcbiAgICBcIkNvbnRyb2xSaWdodFwiOiAweEUwMUQsXG4gICAgXCJWb2x1bWVNdXRlXCI6IDB4RTAyMCxcbiAgICBcIk1lZGlhUGxheVBhdXNlXCI6IDB4RTAyMixcbiAgICBcIk1lZGlhU3RvcFwiOiAweEUwMjQsXG4gICAgXCJWb2x1bWVEb3duXCI6IDB4RTAyRSxcbiAgICBcIlZvbHVtZVVwXCI6IDB4RTAzMCxcbiAgICBcIkJyb3dzZXJIb21lXCI6IDB4RTAzMixcbiAgICBcIk51bXBhZERpdmlkZVwiOiAweEUwMzUsXG4gICAgXCJQcmludFNjcmVlblwiOiAweEUwMzcsXG4gICAgXCJBbHRSaWdodFwiOiAweEUwMzgsXG4gICAgXCJOdW1Mb2NrXCI6IDB4MDA0NSxcbiAgICBcIkhvbWVcIjogMHhFMDQ3LFxuICAgIFwiQXJyb3dVcFwiOiAweEUwNDgsXG4gICAgXCJQYWdlVXBcIjogMHhFMDQ5LFxuICAgIFwiQXJyb3dMZWZ0XCI6IDB4RTA0QixcbiAgICBcIkFycm93UmlnaHRcIjogMHhFMDRELFxuICAgIFwiRW5kXCI6IDB4RTA0RixcbiAgICBcIkFycm93RG93blwiOiAweEUwNTAsXG4gICAgXCJQYWdlRG93blwiOiAweEUwNTEsXG4gICAgXCJJbnNlcnRcIjogMHhFMDUyLFxuICAgIFwiRGVsZXRlXCI6IDB4RTA1MyxcbiAgICBcIk1ldGFMZWZ0XCI6IDB4RTA1QixcbiAgICBcIk1ldGFSaWdodFwiOiAweEUwNUMsXG4gICAgXCJPU0xlZnRcIjogMHhFMDVCLCAgLy8gT1NMZWZ0IGFuZCBPU1JpZ2h0IGFyZSBrZXB0IGZvciBjb21wYXRhYmlsaXR5IHNpbmNlXG4gICAgXCJPU1JpZ2h0XCI6IDB4RTA1QywgLy8gRmlyZWZveCBoYXZlbid0IHVwZGF0ZWQgdG8gTWV0YUxlZnQgYW5kIE1ldGFSaWdodCB5ZXRcbiAgICBcIkNvbnRleHRNZW51XCI6IDB4RTA1RCxcbiAgICBcIkJyb3dzZXJTZWFyY2hcIjogMHhFMDY1LFxuICAgIFwiQnJvd3NlckZhdm9yaXRlc1wiOiAweEUwNjYsXG4gICAgXCJCcm93c2VyUmVmcmVzaFwiOiAweEUwNjcsXG4gICAgXCJCcm93c2VyU3RvcFwiOiAweEUwNjgsXG4gICAgXCJCcm93c2VyRm9yd2FyZFwiOiAweEUwNjksXG4gICAgXCJCcm93c2VyQmFja1wiOiAweEUwNkEsXG4gICAgXCJOdW1wYWRDb21tYVwiOiAweDAwN0UsXG4gICAgXCJOdW1wYWRFcXVhbFwiOiAweDAwNTksXG4gICAgXCJGMTNcIjogMHgwMDY0LFxuICAgIFwiRjE0XCI6IDB4MDA2NSxcbiAgICBcIkYxNVwiOiAweDAwNjYsXG4gICAgXCJGMTZcIjogMHgwMDY3LFxuICAgIFwiRjE3XCI6IDB4MDA2OCxcbiAgICBcIkYxOFwiOiAweDAwNjksXG4gICAgXCJGMTlcIjogMHgwMDZBLFxuICAgIFwiRjIwXCI6IDB4MDA2QixcbiAgICBcIkYyMVwiOiAweDAwNkMsXG4gICAgXCJGMjJcIjogMHgwMDZELFxuICAgIFwiRjIzXCI6IDB4MDA2RSxcbiAgICBcIkYyNFwiOiAweDAwNzYsXG4gICAgXCJLYW5hTW9kZVwiOiAweDAwNzAsXG4gICAgXCJMYW5nMlwiOiAweDAwNzEsXG4gICAgXCJMYW5nMVwiOiAweDAwNzIsXG4gICAgXCJJbnRsUm9cIjogMHgwMDczLFxuICAgIFwiQ29udmVydFwiOiAweDAwNzksXG4gICAgXCJOb25Db252ZXJ0XCI6IDB4MDA3QixcbiAgICBcIkxhdW5jaEFwcDJcIjogMHhFMDIxLFxuICAgIFwiUG93ZXJcIjogMHhFMDVFLFxuICAgIFwiTGF1bmNoQXBwMVwiOiAweEUwNkIsXG4gICAgXCJMYXVuY2hNYWlsXCI6IDB4RTA2QyxcbiAgICBcIk1lZGlhU2VsZWN0XCI6IDB4RTA2RCxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFh0U2NhbmNvZGVcbiIsIi8qXG4gKiBub1ZOQzogSFRNTDUgVk5DIGNsaWVudFxuICogQ29weXJpZ2h0IChDKSAyMDEyIEpvZWwgTWFydGluXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTYgU2FtdWVsIE1hbm5laGVkIGZvciBDZW5kaW8gQUJcbiAqIExpY2Vuc2VkIHVuZGVyIE1QTCAyLjAgKHNlZSBMSUNFTlNFLnR4dClcbiAqXG4gKiBTZWUgUkVBRE1FLm1kIGZvciB1c2FnZSBhbmQgaW50ZWdyYXRpb24gaW5zdHJ1Y3Rpb25zLlxuICpcbiAqIFRJR0hUIGRlY29kZXIgcG9ydGlvbjpcbiAqIChjKSAyMDEyIE1pY2hhZWwgVGluZ2xvZiwgSm9lIEJhbGF6LCBMZXMgUGllY2ggKE1lcmN1cmkuY2EpXG4gKi9cblxuaW1wb3J0IFV0aWwgZnJvbSBcIi4vdXRpbFwiO1xuaW1wb3J0IERpc3BsYXkgZnJvbSBcIi4vZGlzcGxheVwiO1xuaW1wb3J0IHsgS2V5Ym9hcmQsIE1vdXNlIH0gZnJvbSBcIi4vaW5wdXQvZGV2aWNlc1wiXG5pbXBvcnQgV2Vic29jayBmcm9tIFwiLi93ZWJzb2NrXCJcbmltcG9ydCBCYXNlNjQgZnJvbSBcIi4vYmFzZTY0XCI7XG5pbXBvcnQgREVTIGZyb20gXCIuL2Rlc1wiO1xuaW1wb3J0IEtleVRhYmxlIGZyb20gXCIuL2lucHV0L2tleXN5bVwiO1xuaW1wb3J0IFh0U2NhbmNvZGUgZnJvbSBcIi4vaW5wdXQveHRzY2FuY29kZXNcIjtcbmltcG9ydCBJbmZsYXRvciBmcm9tIFwiLi9pbmZsYXRvci5tb2RcIjtcblxuLypqc2xpbnQgd2hpdGU6IGZhbHNlLCBicm93c2VyOiB0cnVlICovXG4vKmdsb2JhbCB3aW5kb3csIFV0aWwsIERpc3BsYXksIEtleWJvYXJkLCBNb3VzZSwgV2Vic29jaywgV2Vic29ja19uYXRpdmUsIEJhc2U2NCwgREVTLCBLZXlUYWJsZSwgSW5mbGF0b3IsIFh0U2NhbmNvZGUgKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gUkZCKGRlZmF1bHRzKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgaWYgKCFkZWZhdWx0cykge1xuICAgICAgICBkZWZhdWx0cyA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMuX3JmYl9ob3N0ID0gJyc7XG4gICAgdGhpcy5fcmZiX3BvcnQgPSA1OTAwO1xuICAgIHRoaXMuX3JmYl9wYXNzd29yZCA9ICcnO1xuICAgIHRoaXMuX3JmYl9wYXRoID0gJyc7XG5cbiAgICB0aGlzLl9yZmJfY29ubmVjdGlvbl9zdGF0ZSA9ICcnO1xuICAgIHRoaXMuX3JmYl9pbml0X3N0YXRlID0gJyc7XG4gICAgdGhpcy5fcmZiX3ZlcnNpb24gPSAwO1xuICAgIHRoaXMuX3JmYl9tYXhfdmVyc2lvbiA9IDMuODtcbiAgICB0aGlzLl9yZmJfYXV0aF9zY2hlbWUgPSAnJztcbiAgICB0aGlzLl9yZmJfZGlzY29ubmVjdF9yZWFzb24gPSBcIlwiO1xuXG4gICAgdGhpcy5fcmZiX3RpZ2h0dm5jID0gZmFsc2U7XG4gICAgdGhpcy5fcmZiX3h2cF92ZXIgPSAwO1xuXG4gICAgLy8gSW4gcHJlZmVyZW5jZSBvcmRlclxuICAgIHRoaXMuX2VuY29kaW5ncyA9IFtcbiAgICAgICAgWydDT1BZUkVDVCcsICAgICAgICAgICAgIDB4MDEgXSxcbiAgICAgICAgWydUSUdIVCcsICAgICAgICAgICAgICAgIDB4MDcgXSxcbiAgICAgICAgWydUSUdIVF9QTkcnLCAgICAgICAgICAgIC0yNjAgXSxcbiAgICAgICAgWydIRVhUSUxFJywgICAgICAgICAgICAgIDB4MDUgXSxcbiAgICAgICAgWydSUkUnLCAgICAgICAgICAgICAgICAgIDB4MDIgXSxcbiAgICAgICAgWydSQVcnLCAgICAgICAgICAgICAgICAgIDB4MDAgXSxcblxuICAgICAgICAvLyBQc3VlZG8tZW5jb2Rpbmcgc2V0dGluZ3NcblxuICAgICAgICAvL1snSlBFR19xdWFsaXR5X2xvJywgICAgIC0zMiBdLFxuICAgICAgICBbJ0pQRUdfcXVhbGl0eV9tZWQnLCAgICAgIC0yNiBdLFxuICAgICAgICAvL1snSlBFR19xdWFsaXR5X2hpJywgICAgIC0yMyBdLFxuICAgICAgICAvL1snY29tcHJlc3NfbG8nLCAgICAgICAgLTI1NSBdLFxuICAgICAgICBbJ2NvbXByZXNzX2hpJywgICAgICAgICAgLTI0NyBdLFxuXG4gICAgICAgIFsnRGVza3RvcFNpemUnLCAgICAgICAgICAtMjIzIF0sXG4gICAgICAgIFsnbGFzdF9yZWN0JywgICAgICAgICAgICAtMjI0IF0sXG4gICAgICAgIFsnQ3Vyc29yJywgICAgICAgICAgICAgICAtMjM5IF0sXG4gICAgICAgIFsnUUVNVUV4dGVuZGVkS2V5RXZlbnQnLCAtMjU4IF0sXG4gICAgICAgIFsnRXh0ZW5kZWREZXNrdG9wU2l6ZScsICAtMzA4IF0sXG4gICAgICAgIFsneHZwJywgICAgICAgICAgICAgICAgICAtMzA5IF0sXG4gICAgICAgIFsnRmVuY2UnLCAgICAgICAgICAgICAgICAtMzEyIF0sXG4gICAgICAgIFsnQ29udGludW91c1VwZGF0ZXMnLCAgICAtMzEzIF1cbiAgICBdO1xuXG4gICAgdGhpcy5fZW5jSGFuZGxlcnMgPSB7fTtcbiAgICB0aGlzLl9lbmNOYW1lcyA9IHt9O1xuICAgIHRoaXMuX2VuY1N0YXRzID0ge307XG5cbiAgICB0aGlzLl9zb2NrID0gbnVsbDsgICAgICAgICAgICAgIC8vIFdlYnNvY2sgb2JqZWN0XG4gICAgdGhpcy5fZGlzcGxheSA9IG51bGw7ICAgICAgICAgICAvLyBEaXNwbGF5IG9iamVjdFxuICAgIHRoaXMuX2ZsdXNoaW5nID0gZmFsc2U7ICAgICAgICAgLy8gRGlzcGxheSBmbHVzaGluZyBzdGF0ZVxuICAgIHRoaXMuX2tleWJvYXJkID0gbnVsbDsgICAgICAgICAgLy8gS2V5Ym9hcmQgaW5wdXQgaGFuZGxlciBvYmplY3RcbiAgICB0aGlzLl9tb3VzZSA9IG51bGw7ICAgICAgICAgICAgIC8vIE1vdXNlIGlucHV0IGhhbmRsZXIgb2JqZWN0XG4gICAgdGhpcy5fZGlzY29ublRpbWVyID0gbnVsbDsgICAgICAvLyBkaXNjb25uZWN0aW9uIHRpbWVyXG5cbiAgICB0aGlzLl9zdXBwb3J0c0ZlbmNlID0gZmFsc2U7XG5cbiAgICB0aGlzLl9zdXBwb3J0c0NvbnRpbnVvdXNVcGRhdGVzID0gZmFsc2U7XG4gICAgdGhpcy5fZW5hYmxlZENvbnRpbnVvdXNVcGRhdGVzID0gZmFsc2U7XG5cbiAgICAvLyBGcmFtZSBidWZmZXIgdXBkYXRlIHN0YXRlXG4gICAgdGhpcy5fRkJVID0ge1xuICAgICAgICByZWN0czogMCxcbiAgICAgICAgc3VicmVjdHM6IDAsICAgICAgICAgICAgLy8gUlJFXG4gICAgICAgIGxpbmVzOiAwLCAgICAgICAgICAgICAgIC8vIFJBV1xuICAgICAgICB0aWxlczogMCwgICAgICAgICAgICAgICAvLyBIRVhUSUxFXG4gICAgICAgIGJ5dGVzOiAwLFxuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwLFxuICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICBlbmNvZGluZzogMCxcbiAgICAgICAgc3ViZW5jb2Rpbmc6IC0xLFxuICAgICAgICBiYWNrZ3JvdW5kOiBudWxsLFxuICAgICAgICB6bGliOiBbXSAgICAgICAgICAgICAgICAvLyBUSUdIVCB6bGliIHN0cmVhbXNcbiAgICB9O1xuXG4gICAgdGhpcy5fZmJfQnBwID0gNDtcbiAgICB0aGlzLl9mYl9kZXB0aCA9IDM7XG4gICAgdGhpcy5fZmJfd2lkdGggPSAwO1xuICAgIHRoaXMuX2ZiX2hlaWdodCA9IDA7XG4gICAgdGhpcy5fZmJfbmFtZSA9IFwiXCI7XG5cbiAgICB0aGlzLl9kZXN0QnVmZiA9IG51bGw7XG4gICAgdGhpcy5fcGFsZXR0ZUJ1ZmYgPSBuZXcgVWludDhBcnJheSgxMDI0KTsgIC8vIDI1NiAqIDQgKG1heCBwYWxldHRlIHNpemUgKiBtYXggYnl0ZXMtcGVyLXBpeGVsKVxuXG4gICAgdGhpcy5fcnJlX2NodW5rX3N6ID0gMTAwO1xuXG4gICAgdGhpcy5fdGltaW5nID0ge1xuICAgICAgICBsYXN0X2ZidTogMCxcbiAgICAgICAgZmJ1X3RvdGFsOiAwLFxuICAgICAgICBmYnVfdG90YWxfY250OiAwLFxuICAgICAgICBmdWxsX2ZidV90b3RhbDogMCxcbiAgICAgICAgZnVsbF9mYnVfY250OiAwLFxuXG4gICAgICAgIGZidV9ydF9zdGFydDogMCxcbiAgICAgICAgZmJ1X3J0X3RvdGFsOiAwLFxuICAgICAgICBmYnVfcnRfY250OiAwLFxuICAgICAgICBwaXhlbHM6IDBcbiAgICB9O1xuXG4gICAgdGhpcy5fc3VwcG9ydHNTZXREZXNrdG9wU2l6ZSA9IGZhbHNlO1xuICAgIHRoaXMuX3NjcmVlbl9pZCA9IDA7XG4gICAgdGhpcy5fc2NyZWVuX2ZsYWdzID0gMDtcblxuICAgIC8vIE1vdXNlIHN0YXRlXG4gICAgdGhpcy5fbW91c2VfYnV0dG9uTWFzayA9IDA7XG4gICAgdGhpcy5fbW91c2VfYXJyID0gW107XG4gICAgdGhpcy5fdmlld3BvcnREcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMuX3ZpZXdwb3J0RHJhZ1BvcyA9IHt9O1xuICAgIHRoaXMuX3ZpZXdwb3J0SGFzTW92ZWQgPSBmYWxzZTtcblxuICAgIC8vIFFFTVUgRXh0ZW5kZWQgS2V5IEV2ZW50IHN1cHBvcnQgLSBkZWZhdWx0IHRvIGZhbHNlXG4gICAgdGhpcy5fcWVtdUV4dEtleUV2ZW50U3VwcG9ydGVkID0gZmFsc2U7XG5cbiAgICAvLyBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgb24gdXNlci1mYWNpbmcgcHJvcGVydGllc1xuICAgIFV0aWwuc2V0X2RlZmF1bHRzKHRoaXMsIGRlZmF1bHRzLCB7XG4gICAgICAgICd0YXJnZXQnOiAnbnVsbCcsICAgICAgICAgICAgICAgICAgICAgICAvLyBWTkMgZGlzcGxheSByZW5kZXJpbmcgQ2FudmFzIG9iamVjdFxuICAgICAgICAnZm9jdXNDb250YWluZXInOiBkb2N1bWVudCwgICAgICAgICAgICAgLy8gRE9NIGVsZW1lbnQgdGhhdCBjYXB0dXJlcyBrZXlib2FyZCBpbnB1dFxuICAgICAgICAnZW5jcnlwdCc6IGZhbHNlLCAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIFRMUy9TU0wvd3NzIGVuY3J5cHRpb25cbiAgICAgICAgJ3RydWVfY29sb3InOiB0cnVlLCAgICAgICAgICAgICAgICAgICAgIC8vIFJlcXVlc3QgdHJ1ZSBjb2xvciBwaXhlbCBkYXRhXG4gICAgICAgICdsb2NhbF9jdXJzb3InOiBmYWxzZSwgICAgICAgICAgICAgICAgICAvLyBSZXF1ZXN0IGxvY2FsbHkgcmVuZGVyZWQgY3Vyc29yXG4gICAgICAgICdzaGFyZWQnOiB0cnVlLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXF1ZXN0IHNoYXJlZCBtb2RlXG4gICAgICAgICd2aWV3X29ubHknOiBmYWxzZSwgICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIGNsaWVudCBtb3VzZS9rZXlib2FyZFxuICAgICAgICAneHZwX3Bhc3N3b3JkX3NlcCc6ICdAJywgICAgICAgICAgICAgICAgLy8gU2VwYXJhdG9yIGZvciBYVlAgcGFzc3dvcmQgZmllbGRzXG4gICAgICAgICdkaXNjb25uZWN0VGltZW91dCc6IDMsICAgICAgICAgICAgICAgICAvLyBUaW1lIChzKSB0byB3YWl0IGZvciBkaXNjb25uZWN0aW9uXG4gICAgICAgICd3c1Byb3RvY29scyc6IFsnYmluYXJ5J10sICAgICAgICAgICAgICAvLyBQcm90b2NvbHMgdG8gdXNlIGluIHRoZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICAgICAgICAncmVwZWF0ZXJJRCc6ICcnLCAgICAgICAgICAgICAgICAgICAgICAgLy8gW1VsdHJhVk5DXSBSZXBlYXRlcklEIHRvIGNvbm5lY3QgdG9cbiAgICAgICAgJ3ZpZXdwb3J0RHJhZyc6IGZhbHNlLCAgICAgICAgICAgICAgICAgIC8vIE1vdmUgdGhlIHZpZXdwb3J0IG9uIG1vdXNlIGRyYWdzXG5cbiAgICAgICAgLy8gQ2FsbGJhY2sgZnVuY3Rpb25zXG4gICAgICAgICdvblVwZGF0ZVN0YXRlJzogZnVuY3Rpb24gKCkgeyB9LCAgICAgICAvLyBvblVwZGF0ZVN0YXRlKHJmYiwgc3RhdGUsIG9sZHN0YXRlKTogY29ubmVjdGlvbiBzdGF0ZSBjaGFuZ2VcbiAgICAgICAgJ29uTm90aWZpY2F0aW9uJzogZnVuY3Rpb24gKCkgeyB9LCAgICAgIC8vIG9uTm90aWZpY2F0aW9uKHJmYiwgbXNnLCBsZXZlbCwgb3B0aW9ucyk6IG5vdGlmaWNhdGlvbiBmb3IgVUlcbiAgICAgICAgJ29uRGlzY29ubmVjdGVkJzogZnVuY3Rpb24gKCkgeyB9LCAgICAgIC8vIG9uRGlzY29ubmVjdGVkKHJmYiwgcmVhc29uKTogZGlzY29ubmVjdGlvbiBmaW5pc2hlZFxuICAgICAgICAnb25QYXNzd29yZFJlcXVpcmVkJzogZnVuY3Rpb24gKCkgeyB9LCAgLy8gb25QYXNzd29yZFJlcXVpcmVkKHJmYiwgbXNnKTogVk5DIHBhc3N3b3JkIGlzIHJlcXVpcmVkXG4gICAgICAgICdvbkNsaXBib2FyZCc6IGZ1bmN0aW9uICgpIHsgfSwgICAgICAgICAvLyBvbkNsaXBib2FyZChyZmIsIHRleHQpOiBSRkIgY2xpcGJvYXJkIGNvbnRlbnRzIHJlY2VpdmVkXG4gICAgICAgICdvbkJlbGwnOiBmdW5jdGlvbiAoKSB7IH0sICAgICAgICAgICAgICAvLyBvbkJlbGwocmZiKTogUkZCIEJlbGwgbWVzc2FnZSByZWNlaXZlZFxuICAgICAgICAnb25GQlVSZWNlaXZlJzogZnVuY3Rpb24gKCkgeyB9LCAgICAgICAgLy8gb25GQlVSZWNlaXZlKHJmYiwgZmJ1KTogUkZCIEZCVSByZWNlaXZlZCBidXQgbm90IHlldCBwcm9jZXNzZWRcbiAgICAgICAgJ29uRkJVQ29tcGxldGUnOiBmdW5jdGlvbiAoKSB7IH0sICAgICAgIC8vIG9uRkJVQ29tcGxldGUocmZiLCBmYnUpOiBSRkIgRkJVIHJlY2VpdmVkIGFuZCBwcm9jZXNzZWRcbiAgICAgICAgJ29uRkJSZXNpemUnOiBmdW5jdGlvbiAoKSB7IH0sICAgICAgICAgIC8vIG9uRkJSZXNpemUocmZiLCB3aWR0aCwgaGVpZ2h0KTogZnJhbWUgYnVmZmVyIHJlc2l6ZWRcbiAgICAgICAgJ29uRGVza3RvcE5hbWUnOiBmdW5jdGlvbiAoKSB7IH0sICAgICAgIC8vIG9uRGVza3RvcE5hbWUocmZiLCBuYW1lKTogZGVza3RvcCBuYW1lIHJlY2VpdmVkXG4gICAgICAgICdvblh2cEluaXQnOiBmdW5jdGlvbiAoKSB7IH0gICAgICAgICAgICAvLyBvblh2cEluaXQodmVyc2lvbik6IFhWUCBleHRlbnNpb25zIGFjdGl2ZSBmb3IgdGhpcyBjb25uZWN0aW9uXG4gICAgfSk7XG5cbiAgICAvLyBtYWluIHNldHVwXG4gICAgVXRpbC5EZWJ1ZyhcIj4+IFJGQi5jb25zdHJ1Y3RvclwiKTtcblxuICAgIC8vIHBvcHVsYXRlIGVuY0hhbmRsZXJzIHdpdGggYm91bmQgdmVyc2lvbnNcbiAgICBPYmplY3Qua2V5cyhSRkIuZW5jb2RpbmdIYW5kbGVycykuZm9yRWFjaChmdW5jdGlvbiAoZW5jTmFtZSkge1xuICAgICAgICB0aGlzLl9lbmNIYW5kbGVyc1tlbmNOYW1lXSA9IFJGQi5lbmNvZGluZ0hhbmRsZXJzW2VuY05hbWVdLmJpbmQodGhpcyk7XG4gICAgfS5iaW5kKHRoaXMpKTtcblxuICAgIC8vIENyZWF0ZSBsb29rdXAgdGFibGVzIGJhc2VkIG9uIGVuY29kaW5nIG51bWJlclxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fZW5jb2RpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuX2VuY0hhbmRsZXJzW3RoaXMuX2VuY29kaW5nc1tpXVsxXV0gPSB0aGlzLl9lbmNIYW5kbGVyc1t0aGlzLl9lbmNvZGluZ3NbaV1bMF1dO1xuICAgICAgICB0aGlzLl9lbmNOYW1lc1t0aGlzLl9lbmNvZGluZ3NbaV1bMV1dID0gdGhpcy5fZW5jb2RpbmdzW2ldWzBdO1xuICAgICAgICB0aGlzLl9lbmNTdGF0c1t0aGlzLl9lbmNvZGluZ3NbaV1bMV1dID0gWzAsIDBdO1xuICAgIH1cblxuICAgIC8vIE5COiBub3RoaW5nIHRoYXQgbmVlZHMgZXhwbGljaXQgdGVhcmRvd24gc2hvdWxkIGJlIGRvbmVcbiAgICAvLyBiZWZvcmUgdGhpcyBwb2ludCwgc2luY2UgdGhpcyBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uXG4gICAgdHJ5IHtcbiAgICAgICAgdGhpcy5fZGlzcGxheSA9IG5ldyBEaXNwbGF5KHt0YXJnZXQ6IHRoaXMuX3RhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkZsdXNoOiB0aGlzLl9vbkZsdXNoLmJpbmQodGhpcyl9KTtcbiAgICB9IGNhdGNoIChleGMpIHtcbiAgICAgICAgVXRpbC5FcnJvcihcIkRpc3BsYXkgZXhjZXB0aW9uOiBcIiArIGV4Yyk7XG4gICAgICAgIHRocm93IGV4YztcbiAgICB9XG5cbiAgICB0aGlzLl9rZXlib2FyZCA9IG5ldyBLZXlib2FyZCh7dGFyZ2V0OiB0aGlzLl9mb2N1c0NvbnRhaW5lcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25LZXlQcmVzczogdGhpcy5faGFuZGxlS2V5UHJlc3MuYmluZCh0aGlzKX0pO1xuXG4gICAgdGhpcy5fbW91c2UgPSBuZXcgTW91c2Uoe3RhcmdldDogdGhpcy5fdGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbk1vdXNlQnV0dG9uOiB0aGlzLl9oYW5kbGVNb3VzZUJ1dHRvbi5iaW5kKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbk1vdXNlTW92ZTogdGhpcy5faGFuZGxlTW91c2VNb3ZlLmJpbmQodGhpcyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeTogdGhpcy5fa2V5Ym9hcmQuc3luYy5iaW5kKHRoaXMuX2tleWJvYXJkKX0pO1xuXG4gICAgdGhpcy5fc29jayA9IG5ldyBXZWJzb2NrKCk7XG4gICAgdGhpcy5fc29jay5vbignbWVzc2FnZScsIHRoaXMuX2hhbmRsZV9tZXNzYWdlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3NvY2sub24oJ29wZW4nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICgodGhpcy5fcmZiX2Nvbm5lY3Rpb25fc3RhdGUgPT09ICdjb25uZWN0aW5nJykgJiZcbiAgICAgICAgICAgICh0aGlzLl9yZmJfaW5pdF9zdGF0ZSA9PT0gJycpKSB7XG4gICAgICAgICAgICB0aGlzLl9yZmJfaW5pdF9zdGF0ZSA9ICdQcm90b2NvbFZlcnNpb24nO1xuICAgICAgICAgICAgVXRpbC5EZWJ1ZyhcIlN0YXJ0aW5nIFZOQyBoYW5kc2hha2VcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9mYWlsKFwiVW5leHBlY3RlZCBzZXJ2ZXIgY29ubmVjdGlvblwiKTtcbiAgICAgICAgfVxuICAgIH0uYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fc29jay5vbignY2xvc2UnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBVdGlsLldhcm4oXCJXZWJTb2NrZXQgb24tY2xvc2UgZXZlbnRcIik7XG4gICAgICAgIHZhciBtc2cgPSBcIlwiO1xuICAgICAgICBpZiAoZS5jb2RlKSB7XG4gICAgICAgICAgICBtc2cgPSBcIiAoY29kZTogXCIgKyBlLmNvZGU7XG4gICAgICAgICAgICBpZiAoZS5yZWFzb24pIHtcbiAgICAgICAgICAgICAgICBtc2cgKz0gXCIsIHJlYXNvbjogXCIgKyBlLnJlYXNvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1zZyArPSBcIilcIjtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHRoaXMuX3JmYl9jb25uZWN0aW9uX3N0YXRlKSB7XG4gICAgICAgICAgICBjYXNlICdkaXNjb25uZWN0aW5nJzpcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY29ubmVjdGluZyc6XG4gICAgICAgICAgICAgICAgdGhpcy5fZmFpbCgnRmFpbGVkIHRvIGNvbm5lY3QgdG8gc2VydmVyJywgbXNnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2Nvbm5lY3RlZCc6XG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIGRpc2Nvbm5lY3RzIHRoYXQgd2VyZSBpbml0aWF0ZWQgc2VydmVyLXNpZGVcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RpbmcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGlzY29ubmVjdGVkJzpcbiAgICAgICAgICAgICAgICB0aGlzLl9mYWlsKFwiVW5leHBlY3RlZCBzZXJ2ZXIgZGlzY29ubmVjdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJBbHJlYWR5IGRpc2Nvbm5lY3RlZDogXCIgKyBtc2cpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aGlzLl9mYWlsKFwiVW5leHBlY3RlZCBzZXJ2ZXIgZGlzY29ubmVjdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJOb3QgaW4gYW55IHN0YXRlIHlldDogXCIgKyBtc2cpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvY2sub2ZmKCdjbG9zZScpO1xuICAgIH0uYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fc29jay5vbignZXJyb3InLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBVdGlsLldhcm4oXCJXZWJTb2NrZXQgb24tZXJyb3IgZXZlbnRcIik7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9pbml0X3ZhcnMoKTtcbiAgICB0aGlzLl9jbGVhbnVwKCk7XG5cbiAgICB2YXIgcm1vZGUgPSB0aGlzLl9kaXNwbGF5LmdldF9yZW5kZXJfbW9kZSgpO1xuICAgIFV0aWwuSW5mbyhcIlVzaW5nIG5hdGl2ZSBXZWJTb2NrZXRzLCByZW5kZXIgbW9kZTogXCIgKyBybW9kZSk7XG5cbiAgICBVdGlsLkRlYnVnKFwiPDwgUkZCLmNvbnN0cnVjdG9yXCIpO1xufTtcblxuKGZ1bmN0aW9uKCkge1xuICAgIFJGQi5wcm90b3R5cGUgPSB7XG4gICAgICAgIC8vIFB1YmxpYyBtZXRob2RzXG4gICAgICAgIGNvbm5lY3Q6IGZ1bmN0aW9uIChob3N0LCBwb3J0LCBwYXNzd29yZCwgcGF0aCkge1xuICAgICAgICAgICAgdGhpcy5fcmZiX2hvc3QgPSBob3N0O1xuICAgICAgICAgICAgdGhpcy5fcmZiX3BvcnQgPSBwb3J0O1xuICAgICAgICAgICAgdGhpcy5fcmZiX3Bhc3N3b3JkID0gKHBhc3N3b3JkICE9PSB1bmRlZmluZWQpID8gcGFzc3dvcmQgOiBcIlwiO1xuICAgICAgICAgICAgdGhpcy5fcmZiX3BhdGggPSAocGF0aCAhPT0gdW5kZWZpbmVkKSA/IHBhdGggOiBcIlwiO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3JmYl9ob3N0IHx8ICF0aGlzLl9yZmJfcG9ydCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKFxuICAgICAgICAgICAgICAgICAgICBVdGlsLkxvY2FsaXNhdGlvbi5nZXQoXCJNdXN0IHNldCBob3N0IGFuZCBwb3J0XCIpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fcmZiX2luaXRfc3RhdGUgPSAnJztcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNvbm5lY3Rpb25TdGF0ZSgnY29ubmVjdGluZycpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGlzY29ubmVjdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29ubmVjdGlvblN0YXRlKCdkaXNjb25uZWN0aW5nJyk7XG4gICAgICAgICAgICB0aGlzLl9zb2NrLm9mZignZXJyb3InKTtcbiAgICAgICAgICAgIHRoaXMuX3NvY2sub2ZmKCdtZXNzYWdlJyk7XG4gICAgICAgICAgICB0aGlzLl9zb2NrLm9mZignb3BlbicpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNlbmRQYXNzd29yZDogZnVuY3Rpb24gKHBhc3N3ZCkge1xuICAgICAgICAgICAgdGhpcy5fcmZiX3Bhc3N3b3JkID0gcGFzc3dkO1xuICAgICAgICAgICAgc2V0VGltZW91dCh0aGlzLl9pbml0X21zZy5iaW5kKHRoaXMpLCAwKTtcbiAgICAgICAgfSxcblxuICAgICAgICBzZW5kQ3RybEFsdERlbDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JmYl9jb25uZWN0aW9uX3N0YXRlICE9PSAnY29ubmVjdGVkJyB8fCB0aGlzLl92aWV3X29ubHkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgICAgICBVdGlsLkluZm8oXCJTZW5kaW5nIEN0cmwtQWx0LURlbFwiKTtcblxuICAgICAgICAgICAgUkZCLm1lc3NhZ2VzLmtleUV2ZW50KHRoaXMuX3NvY2ssIEtleVRhYmxlLlhLX0NvbnRyb2xfTCwgMSk7XG4gICAgICAgICAgICBSRkIubWVzc2FnZXMua2V5RXZlbnQodGhpcy5fc29jaywgS2V5VGFibGUuWEtfQWx0X0wsIDEpO1xuICAgICAgICAgICAgUkZCLm1lc3NhZ2VzLmtleUV2ZW50KHRoaXMuX3NvY2ssIEtleVRhYmxlLlhLX0RlbGV0ZSwgMSk7XG4gICAgICAgICAgICBSRkIubWVzc2FnZXMua2V5RXZlbnQodGhpcy5fc29jaywgS2V5VGFibGUuWEtfRGVsZXRlLCAwKTtcbiAgICAgICAgICAgIFJGQi5tZXNzYWdlcy5rZXlFdmVudCh0aGlzLl9zb2NrLCBLZXlUYWJsZS5YS19BbHRfTCwgMCk7XG4gICAgICAgICAgICBSRkIubWVzc2FnZXMua2V5RXZlbnQodGhpcy5fc29jaywgS2V5VGFibGUuWEtfQ29udHJvbF9MLCAwKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuXG4gICAgICAgIHh2cE9wOiBmdW5jdGlvbiAodmVyLCBvcCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JmYl94dnBfdmVyIDwgdmVyKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgVXRpbC5JbmZvKFwiU2VuZGluZyBYVlAgb3BlcmF0aW9uIFwiICsgb3AgKyBcIiAodmVyc2lvbiBcIiArIHZlciArIFwiKVwiKTtcbiAgICAgICAgICAgIHRoaXMuX3NvY2suc2VuZF9zdHJpbmcoXCJcXHhGQVxceDAwXCIgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKHZlcikgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKG9wKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICB4dnBTaHV0ZG93bjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMueHZwT3AoMSwgMik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgeHZwUmVib290OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy54dnBPcCgxLCAzKTtcbiAgICAgICAgfSxcblxuICAgICAgICB4dnBSZXNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMueHZwT3AoMSwgNCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gU2VuZCBhIGtleSBwcmVzcy4gSWYgJ2Rvd24nIGlzIG5vdCBzcGVjaWZpZWQgdGhlbiBzZW5kIGEgZG93biBrZXlcbiAgICAgICAgLy8gZm9sbG93ZWQgYnkgYW4gdXAga2V5LlxuICAgICAgICBzZW5kS2V5OiBmdW5jdGlvbiAoa2V5c3ltLCBkb3duKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmZiX2Nvbm5lY3Rpb25fc3RhdGUgIT09ICdjb25uZWN0ZWQnIHx8IHRoaXMuX3ZpZXdfb25seSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZG93biAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBVdGlsLkluZm8oXCJTZW5kaW5nIGtleXN5bSAoXCIgKyAoZG93biA/IFwiZG93blwiIDogXCJ1cFwiKSArIFwiKTogXCIgKyBrZXlzeW0pO1xuICAgICAgICAgICAgICAgIFJGQi5tZXNzYWdlcy5rZXlFdmVudCh0aGlzLl9zb2NrLCBrZXlzeW0sIGRvd24gPyAxIDogMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIFV0aWwuSW5mbyhcIlNlbmRpbmcga2V5c3ltIChkb3duICsgdXApOiBcIiArIGtleXN5bSk7XG4gICAgICAgICAgICAgICAgUkZCLm1lc3NhZ2VzLmtleUV2ZW50KHRoaXMuX3NvY2ssIGtleXN5bSwgMSk7XG4gICAgICAgICAgICAgICAgUkZCLm1lc3NhZ2VzLmtleUV2ZW50KHRoaXMuX3NvY2ssIGtleXN5bSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBjbGlwYm9hcmRQYXN0ZUZyb206IGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmZiX2Nvbm5lY3Rpb25fc3RhdGUgIT09ICdjb25uZWN0ZWQnKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgUkZCLm1lc3NhZ2VzLmNsaWVudEN1dFRleHQodGhpcy5fc29jaywgdGV4dCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gUmVxdWVzdHMgYSBjaGFuZ2Ugb2YgcmVtb3RlIGRlc2t0b3Agc2l6ZS4gVGhpcyBtZXNzYWdlIGlzIGFuIGV4dGVuc2lvblxuICAgICAgICAvLyBhbmQgbWF5IG9ubHkgYmUgc2VudCBpZiB3ZSBoYXZlIHJlY2VpdmVkIGFuIEV4dGVuZGVkRGVza3RvcFNpemUgbWVzc2FnZVxuICAgICAgICByZXF1ZXN0RGVza3RvcFNpemU6IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fcmZiX2Nvbm5lY3Rpb25fc3RhdGUgIT09ICdjb25uZWN0ZWQnIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5fdmlld19vbmx5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fc3VwcG9ydHNTZXREZXNrdG9wU2l6ZSkge1xuICAgICAgICAgICAgICAgIFJGQi5tZXNzYWdlcy5zZXREZXNrdG9wU2l6ZSh0aGlzLl9zb2NrLCB3aWR0aCwgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY3JlZW5faWQsIHRoaXMuX3NjcmVlbl9mbGFncyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc29jay5mbHVzaCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cblxuICAgICAgICAvLyBQcml2YXRlIG1ldGhvZHNcblxuICAgICAgICBfY29ubmVjdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgVXRpbC5EZWJ1ZyhcIj4+IFJGQi5jb25uZWN0XCIpO1xuICAgICAgICAgICAgdGhpcy5faW5pdF92YXJzKCk7XG5cbiAgICAgICAgICAgIHZhciB1cmk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIFVzaW5nU29ja2V0SU8gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgdXJpID0gJ2h0dHAnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB1cmkgPSB0aGlzLl9lbmNyeXB0ID8gJ3dzcycgOiAnd3MnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB1cmkgKz0gJzovLycgKyB0aGlzLl9yZmJfaG9zdCArICc6JyArIHRoaXMuX3JmYl9wb3J0ICsgJy8nICsgdGhpcy5fcmZiX3BhdGg7XG4gICAgICAgICAgICBVdGlsLkluZm8oXCJjb25uZWN0aW5nIHRvIFwiICsgdXJpKTtcblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBXZWJTb2NrZXQub25vcGVuIHRyYW5zaXRpb25zIHRvIHRoZSBSRkIgaW5pdCBzdGF0ZXNcbiAgICAgICAgICAgICAgICB0aGlzLl9zb2NrLm9wZW4odXJpLCB0aGlzLl93c1Byb3RvY29scyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUubmFtZSA9PT0gJ1N5bnRheEVycm9yJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mYWlsKFwiSW52YWxpZCBob3N0IG9yIHBvcnQgdmFsdWUgZ2l2ZW5cIiwgZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmFpbChcIkVycm9yIHdoaWxlIGNvbm5lY3RpbmdcIiwgZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBVdGlsLkRlYnVnKFwiPDwgUkZCLmNvbm5lY3RcIik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2Rpc2Nvbm5lY3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIFV0aWwuRGVidWcoXCI+PiBSRkIuZGlzY29ubmVjdFwiKTtcbiAgICAgICAgICAgIHRoaXMuX2NsZWFudXAoKTtcbiAgICAgICAgICAgIHRoaXMuX3NvY2suY2xvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX3ByaW50X3N0YXRzKCk7XG4gICAgICAgICAgICBVdGlsLkRlYnVnKFwiPDwgUkZCLmRpc2Nvbm5lY3RcIik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2luaXRfdmFyczogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gcmVzZXQgc3RhdGVcbiAgICAgICAgICAgIHRoaXMuX0ZCVS5yZWN0cyAgICAgICAgPSAwO1xuICAgICAgICAgICAgdGhpcy5fRkJVLnN1YnJlY3RzICAgICA9IDA7ICAvLyBSUkUgYW5kIEhFWFRJTEVcbiAgICAgICAgICAgIHRoaXMuX0ZCVS5saW5lcyAgICAgICAgPSAwOyAgLy8gUkFXXG4gICAgICAgICAgICB0aGlzLl9GQlUudGlsZXMgICAgICAgID0gMDsgIC8vIEhFWFRJTEVcbiAgICAgICAgICAgIHRoaXMuX0ZCVS56bGlicyAgICAgICAgPSBbXTsgLy8gVElHSFQgemxpYiBlbmNvZGVyc1xuICAgICAgICAgICAgdGhpcy5fbW91c2VfYnV0dG9uTWFzayA9IDA7XG4gICAgICAgICAgICB0aGlzLl9tb3VzZV9hcnIgICAgICAgID0gW107XG4gICAgICAgICAgICB0aGlzLl9yZmJfdGlnaHR2bmMgICAgID0gZmFsc2U7XG5cbiAgICAgICAgICAgIC8vIENsZWFyIHRoZSBwZXIgY29ubmVjdGlvbiBlbmNvZGluZyBzdGF0c1xuICAgICAgICAgICAgdmFyIGk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5fZW5jb2RpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZW5jU3RhdHNbdGhpcy5fZW5jb2RpbmdzW2ldWzFdXVswXSA9IDA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9GQlUuemxpYnNbaV0gPSBuZXcgSW5mbGF0b3IuSW5mbGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9wcmludF9zdGF0czogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgVXRpbC5JbmZvKFwiRW5jb2Rpbmcgc3RhdHMgZm9yIHRoaXMgY29ubmVjdGlvbjpcIik7XG4gICAgICAgICAgICB2YXIgaSwgcztcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9lbmNvZGluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBzID0gdGhpcy5fZW5jU3RhdHNbdGhpcy5fZW5jb2RpbmdzW2ldWzFdXTtcbiAgICAgICAgICAgICAgICBpZiAoc1swXSArIHNbMV0gPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIFV0aWwuSW5mbyhcIiAgICBcIiArIHRoaXMuX2VuY29kaW5nc1tpXVswXSArIFwiOiBcIiArIHNbMF0gKyBcIiByZWN0c1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFV0aWwuSW5mbyhcIkVuY29kaW5nIHN0YXRzIHNpbmNlIHBhZ2UgbG9hZDpcIik7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5fZW5jb2RpbmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcyA9IHRoaXMuX2VuY1N0YXRzW3RoaXMuX2VuY29kaW5nc1tpXVsxXV07XG4gICAgICAgICAgICAgICAgVXRpbC5JbmZvKFwiICAgIFwiICsgdGhpcy5fZW5jb2RpbmdzW2ldWzBdICsgXCI6IFwiICsgc1sxXSArIFwiIHJlY3RzXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9jbGVhbnVwOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZGlzcGxheSAmJiB0aGlzLl9kaXNwbGF5LmdldF9jb250ZXh0KCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3ZpZXdfb25seSkgeyB0aGlzLl9rZXlib2FyZC51bmdyYWIoKTsgfVxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fdmlld19vbmx5KSB7IHRoaXMuX21vdXNlLnVuZ3JhYigpOyB9XG4gICAgICAgICAgICAgICAgdGhpcy5fZGlzcGxheS5kZWZhdWx0Q3Vyc29yKCk7XG4gICAgICAgICAgICAgICAgaWYgKFV0aWwuZ2V0X2xvZ2dpbmcoKSAhPT0gJ2RlYnVnJykge1xuICAgICAgICAgICAgICAgICAgICAvLyBTaG93IG5vVk5DIGxvZ28gb24gbG9hZCBhbmQgd2hlbiBkaXNjb25uZWN0ZWQsIHVubGVzcyBpblxuICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBtb2RlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkuY2xlYXIoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLypcbiAgICAgICAgICogQ29ubmVjdGlvbiBzdGF0ZXM6XG4gICAgICAgICAqICAgY29ubmVjdGluZ1xuICAgICAgICAgKiAgIGNvbm5lY3RlZFxuICAgICAgICAgKiAgIGRpc2Nvbm5lY3RpbmdcbiAgICAgICAgICogICBkaXNjb25uZWN0ZWQgLSBwZXJtYW5lbnQgc3RhdGVcbiAgICAgICAgICovXG4gICAgICAgIF91cGRhdGVDb25uZWN0aW9uU3RhdGU6IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICAgICAgdmFyIG9sZHN0YXRlID0gdGhpcy5fcmZiX2Nvbm5lY3Rpb25fc3RhdGU7XG5cbiAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gb2xkc3RhdGUpIHtcbiAgICAgICAgICAgICAgICBVdGlsLkRlYnVnKFwiQWxyZWFkeSBpbiBzdGF0ZSAnXCIgKyBzdGF0ZSArIFwiJywgaWdub3JpbmdcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUaGUgJ2Rpc2Nvbm5lY3RlZCcgc3RhdGUgaXMgcGVybWFuZW50IGZvciBlYWNoIFJGQiBvYmplY3RcbiAgICAgICAgICAgIGlmIChvbGRzdGF0ZSA9PT0gJ2Rpc2Nvbm5lY3RlZCcpIHtcbiAgICAgICAgICAgICAgICBVdGlsLkVycm9yKFwiVHJpZWQgY2hhbmdpbmcgc3RhdGUgb2YgYSBkaXNjb25uZWN0ZWQgUkZCIG9iamVjdFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEVuc3VyZSBwcm9wZXIgdHJhbnNpdGlvbnMgYmVmb3JlIGRvaW5nIGFueXRoaW5nXG4gICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29ubmVjdGVkJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZHN0YXRlICE9PSAnY29ubmVjdGluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwuRXJyb3IoXCJCYWQgdHJhbnNpdGlvbiB0byBjb25uZWN0ZWQgc3RhdGUsIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJwcmV2aW91cyBjb25uZWN0aW9uIHN0YXRlOiBcIiArIG9sZHN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ2Rpc2Nvbm5lY3RlZCc6XG4gICAgICAgICAgICAgICAgICAgIGlmIChvbGRzdGF0ZSAhPT0gJ2Rpc2Nvbm5lY3RpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlsLkVycm9yKFwiQmFkIHRyYW5zaXRpb24gdG8gZGlzY29ubmVjdGVkIHN0YXRlLCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicHJldmlvdXMgY29ubmVjdGlvbiBzdGF0ZTogXCIgKyBvbGRzdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdjb25uZWN0aW5nJzpcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZHN0YXRlICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgVXRpbC5FcnJvcihcIkJhZCB0cmFuc2l0aW9uIHRvIGNvbm5lY3Rpbmcgc3RhdGUsIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJwcmV2aW91cyBjb25uZWN0aW9uIHN0YXRlOiBcIiArIG9sZHN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ2Rpc2Nvbm5lY3RpbmcnOlxuICAgICAgICAgICAgICAgICAgICBpZiAob2xkc3RhdGUgIT09ICdjb25uZWN0ZWQnICYmIG9sZHN0YXRlICE9PSAnY29ubmVjdGluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwuRXJyb3IoXCJCYWQgdHJhbnNpdGlvbiB0byBkaXNjb25uZWN0aW5nIHN0YXRlLCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicHJldmlvdXMgY29ubmVjdGlvbiBzdGF0ZTogXCIgKyBvbGRzdGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBVdGlsLkVycm9yKFwiVW5rbm93biBjb25uZWN0aW9uIHN0YXRlOiBcIiArIHN0YXRlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTdGF0ZSBjaGFuZ2UgYWN0aW9uc1xuXG4gICAgICAgICAgICB0aGlzLl9yZmJfY29ubmVjdGlvbl9zdGF0ZSA9IHN0YXRlO1xuICAgICAgICAgICAgdGhpcy5fb25VcGRhdGVTdGF0ZSh0aGlzLCBzdGF0ZSwgb2xkc3RhdGUpO1xuXG4gICAgICAgICAgICB2YXIgc21zZyA9IFwiTmV3IHN0YXRlICdcIiArIHN0YXRlICsgXCInLCB3YXMgJ1wiICsgb2xkc3RhdGUgKyBcIicuXCI7XG4gICAgICAgICAgICBVdGlsLkRlYnVnKHNtc2cpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fZGlzY29ublRpbWVyICYmIHN0YXRlICE9PSAnZGlzY29ubmVjdGluZycpIHtcbiAgICAgICAgICAgICAgICBVdGlsLkRlYnVnKFwiQ2xlYXJpbmcgZGlzY29ubmVjdCB0aW1lclwiKTtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fZGlzY29ublRpbWVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNjb25uVGltZXIgPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGRvbid0IGdldCBhIGRvdWJsZSBldmVudFxuICAgICAgICAgICAgICAgIHRoaXMuX3NvY2sub2ZmKCdjbG9zZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnZGlzY29ubmVjdGVkJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FsbCBvbkRpc2Nvbm5lY3RlZCBjYWxsYmFjayBhZnRlciBvblVwZGF0ZVN0YXRlIHNpbmNlXG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IGtub3cgaWYgdGhlIFVJIG9ubHkgZGlzcGxheXMgdGhlIGxhdGVzdCBtZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yZmJfZGlzY29ubmVjdF9yZWFzb24gIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uRGlzY29ubmVjdGVkKHRoaXMsIHRoaXMuX3JmYl9kaXNjb25uZWN0X3JlYXNvbik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBObyByZWFzb24gbWVhbnMgY2xlYW4gZGlzY29ubmVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25EaXNjb25uZWN0ZWQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdjb25uZWN0aW5nJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ2Rpc2Nvbm5lY3RpbmcnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNjb25uZWN0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzY29ublRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZmJfZGlzY29ubmVjdF9yZWFzb24gPSBcIkRpc2Nvbm5lY3QgdGltZW91dFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29ubmVjdGlvblN0YXRlKCdkaXNjb25uZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLCB0aGlzLl9kaXNjb25uZWN0VGltZW91dCAqIDEwMDApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKiBQcmludCBlcnJvcnMgYW5kIGRpc2Nvbm5lY3RcbiAgICAgICAgICpcbiAgICAgICAgICogVGhlIG9wdGlvbmFsIHBhcmFtZXRlciAnZGV0YWlscycgaXMgdXNlZCBmb3IgaW5mb3JtYXRpb24gdGhhdFxuICAgICAgICAgKiBzaG91bGQgYmUgbG9nZ2VkIGJ1dCBub3Qgc2VudCB0byB0aGUgdXNlciBpbnRlcmZhY2UuXG4gICAgICAgICAqL1xuICAgICAgICBfZmFpbDogZnVuY3Rpb24gKG1zZywgZGV0YWlscykge1xuICAgICAgICAgICAgdmFyIGZ1bGxtc2cgPSBtc2c7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGRldGFpbHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZnVsbG1zZyA9IG1zZyArIFwiIChcIiArIGRldGFpbHMgKyBcIilcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fcmZiX2Nvbm5lY3Rpb25fc3RhdGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkaXNjb25uZWN0aW5nJzpcbiAgICAgICAgICAgICAgICAgICAgVXRpbC5FcnJvcihcIkZhaWxlZCB3aGVuIGRpc2Nvbm5lY3Rpbmc6IFwiICsgZnVsbG1zZyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Nvbm5lY3RlZCc6XG4gICAgICAgICAgICAgICAgICAgIFV0aWwuRXJyb3IoXCJGYWlsZWQgd2hpbGUgY29ubmVjdGVkOiBcIiArIGZ1bGxtc2cpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdjb25uZWN0aW5nJzpcbiAgICAgICAgICAgICAgICAgICAgVXRpbC5FcnJvcihcIkZhaWxlZCB3aGVuIGNvbm5lY3Rpbmc6IFwiICsgZnVsbG1zZyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIFV0aWwuRXJyb3IoXCJSRkIgZmFpbHVyZTogXCIgKyBmdWxsbXNnKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9yZmJfZGlzY29ubmVjdF9yZWFzb24gPSBtc2c7IC8vVGhpcyBpcyBzZW50IHRvIHRoZSBVSVxuXG4gICAgICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIGRpc2Nvbm5lY3RlZCB3aXRob3V0IHdhaXRpbmcgZm9yIHNvY2tldCB0byBjbG9zZVxuICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29ubmVjdGlvblN0YXRlKCdkaXNjb25uZWN0aW5nJyk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDb25uZWN0aW9uU3RhdGUoJ2Rpc2Nvbm5lY3RlZCcpO1xuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLypcbiAgICAgICAgICogU2VuZCBhIG5vdGlmaWNhdGlvbiB0byB0aGUgVUkuIFZhbGlkIGxldmVscyBhcmU6XG4gICAgICAgICAqICAgJ25vcm1hbCd8J3dhcm4nfCdlcnJvcidcbiAgICAgICAgICpcbiAgICAgICAgICogICBOT1RFOiBPcHRpb25zIGNvdWxkIGJlIGFkZGVkIGluIHRoZSBmdXR1cmUuXG4gICAgICAgICAqICAgTk9URTogSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIHJlbWVtYmVyIHRoYXQgdGhlXG4gICAgICAgICAqICAgICAgICAgaW50ZXJmYWNlIGNvdWxkIGJlIG9ubHkgc2hvd2luZyB0aGUgbGF0ZXN0IG5vdGlmaWNhdGlvbi5cbiAgICAgICAgICovXG4gICAgICAgIF9ub3RpZmljYXRpb246IGZ1bmN0aW9uKG1zZywgbGV2ZWwsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdub3JtYWwnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3dhcm4nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgICAgICAgICAgICAgVXRpbC5EZWJ1ZyhcIk5vdGlmaWNhdGlvbltcIiArIGxldmVsICsgXCJdOlwiICsgbXNnKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgVXRpbC5FcnJvcihcIkludmFsaWQgbm90aWZpY2F0aW9uIGxldmVsOiBcIiArIGxldmVsKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uTm90aWZpY2F0aW9uKHRoaXMsIG1zZywgbGV2ZWwsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbk5vdGlmaWNhdGlvbih0aGlzLCBtc2csIGxldmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBfaGFuZGxlX21lc3NhZ2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRbGVuKCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBVdGlsLldhcm4oXCJoYW5kbGVfbWVzc2FnZSBjYWxsZWQgb24gYW4gZW1wdHkgcmVjZWl2ZSBxdWV1ZVwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fcmZiX2Nvbm5lY3Rpb25fc3RhdGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdkaXNjb25uZWN0ZWQnOlxuICAgICAgICAgICAgICAgICAgICBVdGlsLkVycm9yKFwiR290IGRhdGEgd2hpbGUgZGlzY29ubmVjdGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdjb25uZWN0ZWQnOlxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2ZsdXNoaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX25vcm1hbF9tc2coKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclFsZW4oKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2luaXRfbXNnKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9oYW5kbGVLZXlQcmVzczogZnVuY3Rpb24gKGtleWV2ZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdmlld19vbmx5KSB7IHJldHVybjsgfSAvLyBWaWV3IG9ubHksIHNraXAga2V5Ym9hcmQsIGV2ZW50c1xuXG4gICAgICAgICAgICB2YXIgZG93biA9IChrZXlldmVudC50eXBlID09ICdrZXlkb3duJyk7XG4gICAgICAgICAgICBpZiAodGhpcy5fcWVtdUV4dEtleUV2ZW50U3VwcG9ydGVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNjYW5jb2RlID0gWHRTY2FuY29kZVtrZXlldmVudC5jb2RlXTtcbiAgICAgICAgICAgICAgICBpZiAoc2NhbmNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleXN5bSA9IGtleWV2ZW50LmtleXN5bTtcbiAgICAgICAgICAgICAgICAgICAgUkZCLm1lc3NhZ2VzLlFFTVVFeHRlbmRlZEtleUV2ZW50KHRoaXMuX3NvY2ssIGtleXN5bSwgZG93biwgc2NhbmNvZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIFV0aWwuRXJyb3IoJ1VuYWJsZSB0byBmaW5kIGEgeHQgc2NhbmNvZGUgZm9yIGNvZGUgPSAnICsga2V5ZXZlbnQuY29kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBrZXlzeW0gPSBrZXlldmVudC5rZXlzeW0ua2V5c3ltO1xuICAgICAgICAgICAgICAgIFJGQi5tZXNzYWdlcy5rZXlFdmVudCh0aGlzLl9zb2NrLCBrZXlzeW0sIGRvd24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9oYW5kbGVNb3VzZUJ1dHRvbjogZnVuY3Rpb24gKHgsIHksIGRvd24sIGJtYXNrKSB7XG4gICAgICAgICAgICBpZiAoZG93bikge1xuICAgICAgICAgICAgICAgIHRoaXMuX21vdXNlX2J1dHRvbk1hc2sgfD0gYm1hc2s7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX21vdXNlX2J1dHRvbk1hc2sgXj0gYm1hc2s7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl92aWV3cG9ydERyYWcpIHtcbiAgICAgICAgICAgICAgICBpZiAoZG93biAmJiAhdGhpcy5fdmlld3BvcnREcmFnZ2luZykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92aWV3cG9ydERyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmlld3BvcnREcmFnUG9zID0geyd4JzogeCwgJ3knOiB5fTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHNlbmRpbmcgbW91c2UgZXZlbnRzXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl92aWV3cG9ydERyYWdnaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHZpZXdwb3J0IGRpZG4ndCBhY3R1YWxseSBtb3ZlLCB0aGVuIHRyZWF0IGFzIGEgbW91c2UgY2xpY2sgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCB0aGUgYnV0dG9uIGRvd24gZXZlbnQgaGVyZSwgYXMgdGhlIGJ1dHRvbiB1cCBldmVudCBpcyBzZW50IGF0IHRoZSBlbmQgb2YgdGhpcyBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3ZpZXdwb3J0SGFzTW92ZWQgJiYgIXRoaXMuX3ZpZXdfb25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgUkZCLm1lc3NhZ2VzLnBvaW50ZXJFdmVudCh0aGlzLl9zb2NrLCB0aGlzLl9kaXNwbGF5LmFic1goeCksIHRoaXMuX2Rpc3BsYXkuYWJzWSh5KSwgYm1hc2spO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdwb3J0SGFzTW92ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl92aWV3X29ubHkpIHsgcmV0dXJuOyB9IC8vIFZpZXcgb25seSwgc2tpcCBtb3VzZSBldmVudHNcblxuICAgICAgICAgICAgaWYgKHRoaXMuX3JmYl9jb25uZWN0aW9uX3N0YXRlICE9PSAnY29ubmVjdGVkJykgeyByZXR1cm47IH1cbiAgICAgICAgICAgIFJGQi5tZXNzYWdlcy5wb2ludGVyRXZlbnQodGhpcy5fc29jaywgdGhpcy5fZGlzcGxheS5hYnNYKHgpLCB0aGlzLl9kaXNwbGF5LmFic1koeSksIHRoaXMuX21vdXNlX2J1dHRvbk1hc2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9oYW5kbGVNb3VzZU1vdmU6IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdmlld3BvcnREcmFnZ2luZykge1xuICAgICAgICAgICAgICAgIHZhciBkZWx0YVggPSB0aGlzLl92aWV3cG9ydERyYWdQb3MueCAtIHg7XG4gICAgICAgICAgICAgICAgdmFyIGRlbHRhWSA9IHRoaXMuX3ZpZXdwb3J0RHJhZ1Bvcy55IC0geTtcblxuICAgICAgICAgICAgICAgIC8vIFRoZSBnb2FsIGlzIHRvIHRyaWdnZXIgb24gYSBjZXJ0YWluIHBoeXNpY2FsIHdpZHRoLCB0aGVcbiAgICAgICAgICAgICAgICAvLyBkZXZpY2VQaXhlbFJhdGlvIGJyaW5ncyB1cyBhIGJpdCBjbG9zZXIgYnV0IGlzIG5vdCBvcHRpbWFsLlxuICAgICAgICAgICAgICAgIHZhciBkcmFnVGhyZXNob2xkID0gMTAgKiAod2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdmlld3BvcnRIYXNNb3ZlZCB8fCAoTWF0aC5hYnMoZGVsdGFYKSA+IGRyYWdUaHJlc2hvbGQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5hYnMoZGVsdGFZKSA+IGRyYWdUaHJlc2hvbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdwb3J0SGFzTW92ZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdwb3J0RHJhZ1BvcyA9IHsneCc6IHgsICd5JzogeX07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkudmlld3BvcnRDaGFuZ2VQb3MoZGVsdGFYLCBkZWx0YVkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNraXAgc2VuZGluZyBtb3VzZSBldmVudHNcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl92aWV3X29ubHkpIHsgcmV0dXJuOyB9IC8vIFZpZXcgb25seSwgc2tpcCBtb3VzZSBldmVudHNcblxuICAgICAgICAgICAgaWYgKHRoaXMuX3JmYl9jb25uZWN0aW9uX3N0YXRlICE9PSAnY29ubmVjdGVkJykgeyByZXR1cm47IH1cbiAgICAgICAgICAgIFJGQi5tZXNzYWdlcy5wb2ludGVyRXZlbnQodGhpcy5fc29jaywgdGhpcy5fZGlzcGxheS5hYnNYKHgpLCB0aGlzLl9kaXNwbGF5LmFic1koeSksIHRoaXMuX21vdXNlX2J1dHRvbk1hc2spO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIE1lc3NhZ2UgSGFuZGxlcnNcblxuICAgICAgICBfbmVnb3RpYXRlX3Byb3RvY29sX3ZlcnNpb246IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRbGVuKCkgPCAxMikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKFwiRXJyb3Igd2hpbGUgbmVnb3RpYXRpbmcgd2l0aCBzZXJ2ZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkluY29tcGxldGUgcHJvdG9jb2wgdmVyc2lvblwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHN2ZXJzaW9uID0gdGhpcy5fc29jay5yUXNoaWZ0U3RyKDEyKS5zdWJzdHIoNCwgNyk7XG4gICAgICAgICAgICBVdGlsLkluZm8oXCJTZXJ2ZXIgUHJvdG9jb2xWZXJzaW9uOiBcIiArIHN2ZXJzaW9uKTtcbiAgICAgICAgICAgIHZhciBpc19yZXBlYXRlciA9IDA7XG4gICAgICAgICAgICBzd2l0Y2ggKHN2ZXJzaW9uKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBcIjAwMC4wMDBcIjogIC8vIFVsdHJhVk5DIHJlcGVhdGVyXG4gICAgICAgICAgICAgICAgICAgIGlzX3JlcGVhdGVyID0gMTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIjAwMy4wMDNcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwiMDAzLjAwNlwiOiAgLy8gVWx0cmFWTkNcbiAgICAgICAgICAgICAgICBjYXNlIFwiMDAzLjg4OVwiOiAgLy8gQXBwbGUgUmVtb3RlIERlc2t0b3BcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmZiX3ZlcnNpb24gPSAzLjM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCIwMDMuMDA3XCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JmYl92ZXJzaW9uID0gMy43O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiMDAzLjAwOFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgXCIwMDQuMDAwXCI6ICAvLyBJbnRlbCBBTVQgS1ZNXG4gICAgICAgICAgICAgICAgY2FzZSBcIjAwNC4wMDFcIjogIC8vIFJlYWxWTkMgNC42XG4gICAgICAgICAgICAgICAgY2FzZSBcIjAwNS4wMDBcIjogIC8vIFJlYWxWTkMgNS4zXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JmYl92ZXJzaW9uID0gMy44O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmFpbChcIlVuc3VwcG9ydGVkIHNlcnZlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkludmFsaWQgc2VydmVyIHZlcnNpb246IFwiICsgc3ZlcnNpb24pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNfcmVwZWF0ZXIpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVwZWF0ZXJJRCA9IHRoaXMuX3JlcGVhdGVySUQ7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHJlcGVhdGVySUQubGVuZ3RoIDwgMjUwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGVhdGVySUQgKz0gXCJcXDBcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fc29jay5zZW5kX3N0cmluZyhyZXBlYXRlcklEKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX3JmYl92ZXJzaW9uID4gdGhpcy5fcmZiX21heF92ZXJzaW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmZiX3ZlcnNpb24gPSB0aGlzLl9yZmJfbWF4X3ZlcnNpb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBjdmVyc2lvbiA9IFwiMDBcIiArIHBhcnNlSW50KHRoaXMuX3JmYl92ZXJzaW9uLCAxMCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuMDBcIiArICgodGhpcy5fcmZiX3ZlcnNpb24gKiAxMCkgJSAxMCk7XG4gICAgICAgICAgICB0aGlzLl9zb2NrLnNlbmRfc3RyaW5nKFwiUkZCIFwiICsgY3ZlcnNpb24gKyBcIlxcblwiKTtcbiAgICAgICAgICAgIFV0aWwuRGVidWcoJ1NlbnQgUHJvdG9jb2xWZXJzaW9uOiAnICsgY3ZlcnNpb24pO1xuXG4gICAgICAgICAgICB0aGlzLl9yZmJfaW5pdF9zdGF0ZSA9ICdTZWN1cml0eSc7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX25lZ290aWF0ZV9zZWN1cml0eTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JmYl92ZXJzaW9uID49IDMuNykge1xuICAgICAgICAgICAgICAgIC8vIFNlcnZlciBzZW5kcyBzdXBwb3J0ZWQgbGlzdCwgY2xpZW50IGRlY2lkZXNcbiAgICAgICAgICAgICAgICB2YXIgbnVtX3R5cGVzID0gdGhpcy5fc29jay5yUXNoaWZ0OCgpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdChcInNlY3VyaXR5IHR5cGVcIiwgbnVtX3R5cGVzLCAxKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgICAgICAgICAgICAgIGlmIChudW1fdHlwZXMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmxlbiA9IHRoaXMuX3NvY2suclFzaGlmdDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZWFzb24gPSB0aGlzLl9zb2NrLnJRc2hpZnRTdHIoc3RybGVuKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZhaWwoXCJFcnJvciB3aGlsZSBuZWdvdGlhdGluZyB3aXRoIHNlcnZlclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNlY3VyaXR5IGZhaWx1cmU6IFwiICsgcmVhc29uKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9yZmJfYXV0aF9zY2hlbWUgPSAwO1xuICAgICAgICAgICAgICAgIHZhciB0eXBlcyA9IHRoaXMuX3NvY2suclFzaGlmdEJ5dGVzKG51bV90eXBlcyk7XG4gICAgICAgICAgICAgICAgVXRpbC5EZWJ1ZyhcIlNlcnZlciBzZWN1cml0eSB0eXBlczogXCIgKyB0eXBlcyk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGVzW2ldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IC8vIE5vbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogLy8gVk5DIEF1dGhlbnRpY2F0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OiAvLyBUaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyMjogLy8gWFZQXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVzW2ldID4gdGhpcy5fcmZiX2F1dGhfc2NoZW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JmYl9hdXRoX3NjaGVtZSA9IHR5cGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcmZiX2F1dGhfc2NoZW1lID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKFwiVW5zdXBwb3J0ZWQgc2VydmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVW5zdXBwb3J0ZWQgc2VjdXJpdHkgdHlwZXM6IFwiICsgdHlwZXMpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suc2VuZChbdGhpcy5fcmZiX2F1dGhfc2NoZW1lXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFNlcnZlciBkZWNpZGVzXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwic2VjdXJpdHkgc2NoZW1lXCIsIDQpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3JmYl9hdXRoX3NjaGVtZSA9IHRoaXMuX3NvY2suclFzaGlmdDMyKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3JmYl9pbml0X3N0YXRlID0gJ0F1dGhlbnRpY2F0aW9uJztcbiAgICAgICAgICAgIFV0aWwuRGVidWcoJ0F1dGhlbnRpY2F0aW5nIHVzaW5nIHNjaGVtZTogJyArIHRoaXMuX3JmYl9hdXRoX3NjaGVtZSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbml0X21zZygpOyAvLyBqdW1wIHRvIGF1dGhlbnRpY2F0aW9uXG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb25cbiAgICAgICAgX25lZ290aWF0ZV94dnBfYXV0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHh2cF9zZXAgPSB0aGlzLl94dnBfcGFzc3dvcmRfc2VwO1xuICAgICAgICAgICAgdmFyIHh2cF9hdXRoID0gdGhpcy5fcmZiX3Bhc3N3b3JkLnNwbGl0KHh2cF9zZXApO1xuICAgICAgICAgICAgaWYgKHh2cF9hdXRoLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgICAgICAgICB2YXIgbXNnID0gJ1hWUCBjcmVkZW50aWFscyByZXF1aXJlZCAodXNlcicgKyB4dnBfc2VwICtcbiAgICAgICAgICAgICAgICAgICAgJ3RhcmdldCcgKyB4dnBfc2VwICsgJ3Bhc3N3b3JkKSAtLSBnb3Qgb25seSAnICsgdGhpcy5fcmZiX3Bhc3N3b3JkO1xuICAgICAgICAgICAgICAgIHRoaXMuX29uUGFzc3dvcmRSZXF1aXJlZCh0aGlzLCBtc2cpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHh2cF9hdXRoX3N0ciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoeHZwX2F1dGhbMF0ubGVuZ3RoKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZSh4dnBfYXV0aFsxXS5sZW5ndGgpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4dnBfYXV0aFswXSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHZwX2F1dGhbMV07XG4gICAgICAgICAgICB0aGlzLl9zb2NrLnNlbmRfc3RyaW5nKHh2cF9hdXRoX3N0cik7XG4gICAgICAgICAgICB0aGlzLl9yZmJfcGFzc3dvcmQgPSB4dnBfYXV0aC5zbGljZSgyKS5qb2luKHh2cF9zZXApO1xuICAgICAgICAgICAgdGhpcy5fcmZiX2F1dGhfc2NoZW1lID0gMjtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZWdvdGlhdGVfYXV0aGVudGljYXRpb24oKTtcbiAgICAgICAgfSxcblxuICAgICAgICBfbmVnb3RpYXRlX3N0ZF92bmNfYXV0aDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3JmYl9wYXNzd29yZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vblBhc3N3b3JkUmVxdWlyZWQodGhpcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJhdXRoIGNoYWxsZW5nZVwiLCAxNikpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgICAgICAgICAgIC8vIFRPRE8oZGlyZWN0eG1hbjEyKTogbWFrZSBnZW5ERVMgbm90IHJlcXVpcmUgYW4gQXJyYXlcbiAgICAgICAgICAgIHZhciBjaGFsbGVuZ2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9zb2NrLnJRc2hpZnRCeXRlcygxNikpO1xuICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gUkZCLmdlbkRFUyh0aGlzLl9yZmJfcGFzc3dvcmQsIGNoYWxsZW5nZSk7XG4gICAgICAgICAgICB0aGlzLl9zb2NrLnNlbmQocmVzcG9uc2UpO1xuICAgICAgICAgICAgdGhpcy5fcmZiX2luaXRfc3RhdGUgPSBcIlNlY3VyaXR5UmVzdWx0XCI7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBfbmVnb3RpYXRlX3RpZ2h0X3R1bm5lbHM6IGZ1bmN0aW9uIChudW1UdW5uZWxzKSB7XG4gICAgICAgICAgICB2YXIgY2xpZW50U3VwcG9ydGVkVHVubmVsVHlwZXMgPSB7XG4gICAgICAgICAgICAgICAgMDogeyB2ZW5kb3I6ICdUR0hUJywgc2lnbmF0dXJlOiAnTk9UVU5ORUwnIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB2YXIgc2VydmVyU3VwcG9ydGVkVHVubmVsVHlwZXMgPSB7fTtcbiAgICAgICAgICAgIC8vIHJlY2VpdmUgdHVubmVsIGNhcGFiaWxpdGllc1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1UdW5uZWxzOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgY2FwX2NvZGUgPSB0aGlzLl9zb2NrLnJRc2hpZnQzMigpO1xuICAgICAgICAgICAgICAgIHZhciBjYXBfdmVuZG9yID0gdGhpcy5fc29jay5yUXNoaWZ0U3RyKDQpO1xuICAgICAgICAgICAgICAgIHZhciBjYXBfc2lnbmF0dXJlID0gdGhpcy5fc29jay5yUXNoaWZ0U3RyKDgpO1xuICAgICAgICAgICAgICAgIHNlcnZlclN1cHBvcnRlZFR1bm5lbFR5cGVzW2NhcF9jb2RlXSA9IHsgdmVuZG9yOiBjYXBfdmVuZG9yLCBzaWduYXR1cmU6IGNhcF9zaWduYXR1cmUgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hvb3NlIHRoZSBub3R1bm5lbCB0eXBlXG4gICAgICAgICAgICBpZiAoc2VydmVyU3VwcG9ydGVkVHVubmVsVHlwZXNbMF0pIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VydmVyU3VwcG9ydGVkVHVubmVsVHlwZXNbMF0udmVuZG9yICE9IGNsaWVudFN1cHBvcnRlZFR1bm5lbFR5cGVzWzBdLnZlbmRvciB8fFxuICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJTdXBwb3J0ZWRUdW5uZWxUeXBlc1swXS5zaWduYXR1cmUgIT0gY2xpZW50U3VwcG9ydGVkVHVubmVsVHlwZXNbMF0uc2lnbmF0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKFwiVW5zdXBwb3J0ZWQgc2VydmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQ2xpZW50J3MgdHVubmVsIHR5cGUgaGFkIHRoZSBpbmNvcnJlY3QgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZlbmRvciBvciBzaWduYXR1cmVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suc2VuZChbMCwgMCwgMCwgMF0pOyAgLy8gdXNlIE5PVFVOTkVMXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyB3YWl0IHVudGlsIHdlIHJlY2VpdmUgdGhlIHN1YiBhdXRoIGNvdW50IHRvIGNvbnRpbnVlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKFwiVW5zdXBwb3J0ZWQgc2VydmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJTZXJ2ZXIgd2FudGVkIHR1bm5lbHMsIGJ1dCBkb2Vzbid0IHN1cHBvcnQgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidGhlIG5vdHVubmVsIHR5cGVcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgX25lZ290aWF0ZV90aWdodF9hdXRoOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3JmYl90aWdodHZuYykgeyAgLy8gZmlyc3QgcGFzcywgZG8gdGhlIHR1bm5lbCBuZWdvdGlhdGlvblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdChcIm51bSB0dW5uZWxzXCIsIDQpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgICAgIHZhciBudW1UdW5uZWxzID0gdGhpcy5fc29jay5yUXNoaWZ0MzIoKTtcbiAgICAgICAgICAgICAgICBpZiAobnVtVHVubmVscyA+IDAgJiYgdGhpcy5fc29jay5yUXdhaXQoXCJ0dW5uZWwgY2FwYWJpbGl0aWVzXCIsIDE2ICogbnVtVHVubmVscywgNCkpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9yZmJfdGlnaHR2bmMgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKG51bVR1bm5lbHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25lZ290aWF0ZV90aWdodF90dW5uZWxzKG51bVR1bm5lbHMpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyB3YWl0IHVudGlsIHdlIHJlY2VpdmUgdGhlIHN1YiBhdXRoIHRvIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBzZWNvbmQgcGFzcywgZG8gdGhlIHN1Yi1hdXRoIG5lZ290aWF0aW9uXG4gICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJzdWIgYXV0aCBjb3VudFwiLCA0KSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgICAgIHZhciBzdWJBdXRoQ291bnQgPSB0aGlzLl9zb2NrLnJRc2hpZnQzMigpO1xuICAgICAgICAgICAgaWYgKHN1YkF1dGhDb3VudCA9PT0gMCkgeyAgLy8gZW1wdHkgc3ViLWF1dGggbGlzdCByZWNlaXZlZCBtZWFucyAnbm8gYXV0aCcgc3VidHlwZSBzZWxlY3RlZFxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVN0YXRlKCdTZWN1cml0eVJlc3VsdCcpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJzdWIgYXV0aCBjYXBhYmlsaXRpZXNcIiwgMTYgKiBzdWJBdXRoQ291bnQsIDQpKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgICAgICB2YXIgY2xpZW50U3VwcG9ydGVkVHlwZXMgPSB7XG4gICAgICAgICAgICAgICAgJ1NURFZOT0FVVEhfXyc6IDEsXG4gICAgICAgICAgICAgICAgJ1NURFZWTkNBVVRIXyc6IDJcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHZhciBzZXJ2ZXJTdXBwb3J0ZWRUeXBlcyA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN1YkF1dGhDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGNhcE51bSA9IHRoaXMuX3NvY2suclFzaGlmdDMyKCk7XG4gICAgICAgICAgICAgICAgdmFyIGNhcGFiaWxpdGllcyA9IHRoaXMuX3NvY2suclFzaGlmdFN0cigxMik7XG4gICAgICAgICAgICAgICAgc2VydmVyU3VwcG9ydGVkVHlwZXMucHVzaChjYXBhYmlsaXRpZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciBhdXRoVHlwZSBpbiBjbGllbnRTdXBwb3J0ZWRUeXBlcykge1xuICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJTdXBwb3J0ZWRUeXBlcy5pbmRleE9mKGF1dGhUeXBlKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc29jay5zZW5kKFswLCAwLCAwLCBjbGllbnRTdXBwb3J0ZWRUeXBlc1thdXRoVHlwZV1dKTtcblxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGF1dGhUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdTVERWTk9BVVRIX18nOiAgLy8gbm8gYXV0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JmYl9pbml0X3N0YXRlID0gJ1NlY3VyaXR5UmVzdWx0JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1NURFZWTkNBVVRIXyc6IC8vIFZOQyBhdXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmZiX2F1dGhfc2NoZW1lID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW5pdF9tc2coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZhaWwoXCJVbnN1cHBvcnRlZCBzZXJ2ZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVuc3VwcG9ydGVkIHRpbnkgYXV0aCBzY2hlbWU6IFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKFwiVW5zdXBwb3J0ZWQgc2VydmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIk5vIHN1cHBvcnRlZCBzdWItYXV0aCB0eXBlcyFcIik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX25lZ290aWF0ZV9hdXRoZW50aWNhdGlvbjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLl9yZmJfYXV0aF9zY2hlbWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6ICAvLyBjb25uZWN0aW9uIGZhaWxlZFxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJhdXRoIHJlYXNvblwiLCA0KSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cmxlbiA9IHRoaXMuX3NvY2suclFzaGlmdDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZWFzb24gPSB0aGlzLl9zb2NrLnJRc2hpZnRTdHIoc3RybGVuKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZhaWwoXCJBdXRoZW50aWNhdGlvbiBmYWlsdXJlXCIsIHJlYXNvbik7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDE6ICAvLyBubyBhdXRoXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yZmJfdmVyc2lvbiA+PSAzLjgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JmYl9pbml0X3N0YXRlID0gJ1NlY3VyaXR5UmVzdWx0JztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JmYl9pbml0X3N0YXRlID0gJ0NsaWVudEluaXRpYWxpc2F0aW9uJztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRfbXNnKCk7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDIyOiAgLy8gWFZQIGF1dGhcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25lZ290aWF0ZV94dnBfYXV0aCgpO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAyOiAgLy8gVk5DIGF1dGhlbnRpY2F0aW9uXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZWdvdGlhdGVfc3RkX3ZuY19hdXRoKCk7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDE2OiAgLy8gVGlnaHRWTkMgU2VjdXJpdHkgVHlwZVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbmVnb3RpYXRlX3RpZ2h0X2F1dGgoKTtcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKFwiVW5zdXBwb3J0ZWQgc2VydmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVW5zdXBwb3J0ZWQgYXV0aCBzY2hlbWU6IFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmZiX2F1dGhfc2NoZW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBfaGFuZGxlX3NlY3VyaXR5X3Jlc3VsdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KCdWTkMgYXV0aCByZXNwb25zZSAnLCA0KSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fc29jay5yUXNoaWZ0MzIoKSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogIC8vIE9LXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JmYl9pbml0X3N0YXRlID0gJ0NsaWVudEluaXRpYWxpc2F0aW9uJztcbiAgICAgICAgICAgICAgICAgICAgVXRpbC5EZWJ1ZygnQXV0aGVudGljYXRpb24gT0snKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luaXRfbXNnKCk7XG4gICAgICAgICAgICAgICAgY2FzZSAxOiAgLy8gZmFpbGVkXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yZmJfdmVyc2lvbiA+PSAzLjgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsZW5ndGggPSB0aGlzLl9zb2NrLnJRc2hpZnQzMigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwiU2VjdXJpdHlSZXN1bHQgcmVhc29uXCIsIGxlbmd0aCwgOCkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVhc29uID0gdGhpcy5fc29jay5yUXNoaWZ0U3RyKGxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmFpbChcIkF1dGhlbnRpY2F0aW9uIGZhaWx1cmVcIiwgcmVhc29uKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKFwiQXV0aGVudGljYXRpb24gZmFpbHVyZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmFpbChcIlRvbyBtYW55IGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzXCIpO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKFwiVW5zdXBwb3J0ZWQgc2VydmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVW5rbm93biBTZWN1cml0eVJlc3VsdFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBfbmVnb3RpYXRlX3NlcnZlcl9pbml0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJzZXJ2ZXIgaW5pdGlhbGl6YXRpb25cIiwgMjQpKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgICAgICAvKiBTY3JlZW4gc2l6ZSAqL1xuICAgICAgICAgICAgdGhpcy5fZmJfd2lkdGggID0gdGhpcy5fc29jay5yUXNoaWZ0MTYoKTtcbiAgICAgICAgICAgIHRoaXMuX2ZiX2hlaWdodCA9IHRoaXMuX3NvY2suclFzaGlmdDE2KCk7XG4gICAgICAgICAgICB0aGlzLl9kZXN0QnVmZiA9IG5ldyBVaW50OEFycmF5KHRoaXMuX2ZiX3dpZHRoICogdGhpcy5fZmJfaGVpZ2h0ICogNCk7XG5cbiAgICAgICAgICAgIC8qIFBJWEVMX0ZPUk1BVCAqL1xuICAgICAgICAgICAgdmFyIGJwcCAgICAgICAgID0gdGhpcy5fc29jay5yUXNoaWZ0OCgpO1xuICAgICAgICAgICAgdmFyIGRlcHRoICAgICAgID0gdGhpcy5fc29jay5yUXNoaWZ0OCgpO1xuICAgICAgICAgICAgdmFyIGJpZ19lbmRpYW4gID0gdGhpcy5fc29jay5yUXNoaWZ0OCgpO1xuICAgICAgICAgICAgdmFyIHRydWVfY29sb3IgID0gdGhpcy5fc29jay5yUXNoaWZ0OCgpO1xuXG4gICAgICAgICAgICB2YXIgcmVkX21heCAgICAgPSB0aGlzLl9zb2NrLnJRc2hpZnQxNigpO1xuICAgICAgICAgICAgdmFyIGdyZWVuX21heCAgID0gdGhpcy5fc29jay5yUXNoaWZ0MTYoKTtcbiAgICAgICAgICAgIHZhciBibHVlX21heCAgICA9IHRoaXMuX3NvY2suclFzaGlmdDE2KCk7XG4gICAgICAgICAgICB2YXIgcmVkX3NoaWZ0ICAgPSB0aGlzLl9zb2NrLnJRc2hpZnQ4KCk7XG4gICAgICAgICAgICB2YXIgZ3JlZW5fc2hpZnQgPSB0aGlzLl9zb2NrLnJRc2hpZnQ4KCk7XG4gICAgICAgICAgICB2YXIgYmx1ZV9zaGlmdCAgPSB0aGlzLl9zb2NrLnJRc2hpZnQ4KCk7XG4gICAgICAgICAgICB0aGlzLl9zb2NrLnJRc2tpcEJ5dGVzKDMpOyAgLy8gcGFkZGluZ1xuXG4gICAgICAgICAgICAvLyBOQihkaXJlY3R4bWFuMTIpOiB3ZSBkb24ndCB3YW50IHRvIGNhbGwgYW55IGNhbGxiYWNrcyBvciBwcmludCBtZXNzYWdlcyB1bnRpbFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgKmFmdGVyKiB3ZSdyZSBwYXN0IHRoZSBwb2ludCB3aGVyZSB3ZSBjb3VsZCBiYWNrdHJhY2tcblxuICAgICAgICAgICAgLyogQ29ubmVjdGlvbiBuYW1lL3RpdGxlICovXG4gICAgICAgICAgICB2YXIgbmFtZV9sZW5ndGggPSB0aGlzLl9zb2NrLnJRc2hpZnQzMigpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KCdzZXJ2ZXIgaW5pdCBuYW1lJywgbmFtZV9sZW5ndGgsIDI0KSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgICAgIHRoaXMuX2ZiX25hbWUgPSBVdGlsLmRlY29kZVVURjgodGhpcy5fc29jay5yUXNoaWZ0U3RyKG5hbWVfbGVuZ3RoKSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9yZmJfdGlnaHR2bmMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoJ1RpZ2h0Vk5DIGV4dGVuZGVkIHNlcnZlciBpbml0IGhlYWRlcicsIDgsIDI0ICsgbmFtZV9sZW5ndGgpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgICAgIC8vIEluIFRpZ2h0Vk5DIG1vZGUsIFNlcnZlckluaXQgbWVzc2FnZSBpcyBleHRlbmRlZFxuICAgICAgICAgICAgICAgIHZhciBudW1TZXJ2ZXJNZXNzYWdlcyA9IHRoaXMuX3NvY2suclFzaGlmdDE2KCk7XG4gICAgICAgICAgICAgICAgdmFyIG51bUNsaWVudE1lc3NhZ2VzID0gdGhpcy5fc29jay5yUXNoaWZ0MTYoKTtcbiAgICAgICAgICAgICAgICB2YXIgbnVtRW5jb2RpbmdzID0gdGhpcy5fc29jay5yUXNoaWZ0MTYoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zb2NrLnJRc2tpcEJ5dGVzKDIpOyAgLy8gcGFkZGluZ1xuXG4gICAgICAgICAgICAgICAgdmFyIHRvdGFsTWVzc2FnZXNMZW5ndGggPSAobnVtU2VydmVyTWVzc2FnZXMgKyBudW1DbGllbnRNZXNzYWdlcyArIG51bUVuY29kaW5ncykgKiAxNjtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoJ1RpZ2h0Vk5DIGV4dGVuZGVkIHNlcnZlciBpbml0IGhlYWRlcicsIHRvdGFsTWVzc2FnZXNMZW5ndGgsIDMyICsgbmFtZV9sZW5ndGgpKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgd2l0aCB0aGUgY2FwYWJpbGl0eSBpbmZvcm1hdGlvbiB0aGF0IFRJR0hUIHNlbmRzLFxuICAgICAgICAgICAgICAgIC8vIHNvIHdlIGp1c3Qgc2tpcCB0aGUgYWxsIG9mIHRoaXMuXG5cbiAgICAgICAgICAgICAgICAvLyBUSUdIVCBzZXJ2ZXIgbWVzc2FnZSBjYXBhYmlsaXRpZXNcbiAgICAgICAgICAgICAgICB0aGlzLl9zb2NrLnJRc2tpcEJ5dGVzKDE2ICogbnVtU2VydmVyTWVzc2FnZXMpO1xuXG4gICAgICAgICAgICAgICAgLy8gVElHSFQgY2xpZW50IG1lc3NhZ2UgY2FwYWJpbGl0aWVzXG4gICAgICAgICAgICAgICAgdGhpcy5fc29jay5yUXNraXBCeXRlcygxNiAqIG51bUNsaWVudE1lc3NhZ2VzKTtcblxuICAgICAgICAgICAgICAgIC8vIFRJR0hUIGVuY29kaW5nIGNhcGFiaWxpdGllc1xuICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoMTYgKiBudW1FbmNvZGluZ3MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBOQihkaXJlY3R4bWFuMTIpOiB0aGVzZSBhcmUgZG93biBoZXJlIHNvIHRoYXQgd2UgZG9uJ3QgcnVuIHRoZW0gbXVsdGlwbGUgdGltZXNcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIGlmIHdlIGJhY2t0cmFja1xuICAgICAgICAgICAgVXRpbC5JbmZvKFwiU2NyZWVuOiBcIiArIHRoaXMuX2ZiX3dpZHRoICsgXCJ4XCIgKyB0aGlzLl9mYl9oZWlnaHQgK1xuICAgICAgICAgICAgICAgICAgICAgIFwiLCBicHA6IFwiICsgYnBwICsgXCIsIGRlcHRoOiBcIiArIGRlcHRoICtcbiAgICAgICAgICAgICAgICAgICAgICBcIiwgYmlnX2VuZGlhbjogXCIgKyBiaWdfZW5kaWFuICtcbiAgICAgICAgICAgICAgICAgICAgICBcIiwgdHJ1ZV9jb2xvcjogXCIgKyB0cnVlX2NvbG9yICtcbiAgICAgICAgICAgICAgICAgICAgICBcIiwgcmVkX21heDogXCIgKyByZWRfbWF4ICtcbiAgICAgICAgICAgICAgICAgICAgICBcIiwgZ3JlZW5fbWF4OiBcIiArIGdyZWVuX21heCArXG4gICAgICAgICAgICAgICAgICAgICAgXCIsIGJsdWVfbWF4OiBcIiArIGJsdWVfbWF4ICtcbiAgICAgICAgICAgICAgICAgICAgICBcIiwgcmVkX3NoaWZ0OiBcIiArIHJlZF9zaGlmdCArXG4gICAgICAgICAgICAgICAgICAgICAgXCIsIGdyZWVuX3NoaWZ0OiBcIiArIGdyZWVuX3NoaWZ0ICtcbiAgICAgICAgICAgICAgICAgICAgICBcIiwgYmx1ZV9zaGlmdDogXCIgKyBibHVlX3NoaWZ0KTtcblxuICAgICAgICAgICAgaWYgKGJpZ19lbmRpYW4gIT09IDApIHtcbiAgICAgICAgICAgICAgICBVdGlsLldhcm4oXCJTZXJ2ZXIgbmF0aXZlIGVuZGlhbiBpcyBub3QgbGl0dGxlIGVuZGlhblwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlZF9zaGlmdCAhPT0gMTYpIHtcbiAgICAgICAgICAgICAgICBVdGlsLldhcm4oXCJTZXJ2ZXIgbmF0aXZlIHJlZC1zaGlmdCBpcyBub3QgMTZcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChibHVlX3NoaWZ0ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgVXRpbC5XYXJuKFwiU2VydmVyIG5hdGl2ZSBibHVlLXNoaWZ0IGlzIG5vdCAwXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB3ZSdyZSBwYXN0IHRoZSBwb2ludCB3aGVyZSB3ZSBjb3VsZCBiYWNrdHJhY2ssIHNvIGl0J3Mgc2FmZSB0byBjYWxsIHRoaXNcbiAgICAgICAgICAgIHRoaXMuX29uRGVza3RvcE5hbWUodGhpcywgdGhpcy5fZmJfbmFtZSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl90cnVlX2NvbG9yICYmIHRoaXMuX2ZiX25hbWUgPT09IFwiSW50ZWwocikgQU1UIEtWTVwiKSB7XG4gICAgICAgICAgICAgICAgVXRpbC5XYXJuKFwiSW50ZWwgQU1UIEtWTSBvbmx5IHN1cHBvcnRzIDgvMTYgYml0IGRlcHRocy4gIERpc2FibGluZyB0cnVlIGNvbG9yXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RydWVfY29sb3IgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fZGlzcGxheS5zZXRfdHJ1ZV9jb2xvcih0aGlzLl90cnVlX2NvbG9yKTtcbiAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkucmVzaXplKHRoaXMuX2ZiX3dpZHRoLCB0aGlzLl9mYl9oZWlnaHQpO1xuICAgICAgICAgICAgdGhpcy5fb25GQlJlc2l6ZSh0aGlzLCB0aGlzLl9mYl93aWR0aCwgdGhpcy5fZmJfaGVpZ2h0KTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLl92aWV3X29ubHkpIHsgdGhpcy5fa2V5Ym9hcmQuZ3JhYigpOyB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuX3ZpZXdfb25seSkgeyB0aGlzLl9tb3VzZS5ncmFiKCk7IH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX3RydWVfY29sb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mYl9CcHAgPSA0O1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZiX2RlcHRoID0gMztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmJfQnBwID0gMTtcbiAgICAgICAgICAgICAgICB0aGlzLl9mYl9kZXB0aCA9IDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFJGQi5tZXNzYWdlcy5waXhlbEZvcm1hdCh0aGlzLl9zb2NrLCB0aGlzLl9mYl9CcHAsIHRoaXMuX2ZiX2RlcHRoLCB0aGlzLl90cnVlX2NvbG9yKTtcbiAgICAgICAgICAgIFJGQi5tZXNzYWdlcy5jbGllbnRFbmNvZGluZ3ModGhpcy5fc29jaywgdGhpcy5fZW5jb2RpbmdzLCB0aGlzLl9sb2NhbF9jdXJzb3IsIHRoaXMuX3RydWVfY29sb3IpO1xuICAgICAgICAgICAgUkZCLm1lc3NhZ2VzLmZiVXBkYXRlUmVxdWVzdHModGhpcy5fc29jaywgZmFsc2UsIHRoaXMuX2Rpc3BsYXkuZ2V0Q2xlYW5EaXJ0eVJlc2V0KCksIHRoaXMuX2ZiX3dpZHRoLCB0aGlzLl9mYl9oZWlnaHQpO1xuXG4gICAgICAgICAgICB0aGlzLl90aW1pbmcuZmJ1X3J0X3N0YXJ0ID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIHRoaXMuX3RpbWluZy5waXhlbHMgPSAwO1xuXG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDb25uZWN0aW9uU3RhdGUoJ2Nvbm5lY3RlZCcpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyogUkZCIHByb3RvY29sIGluaXRpYWxpemF0aW9uIHN0YXRlczpcbiAgICAgICAgICogICBQcm90b2NvbFZlcnNpb25cbiAgICAgICAgICogICBTZWN1cml0eVxuICAgICAgICAgKiAgIEF1dGhlbnRpY2F0aW9uXG4gICAgICAgICAqICAgU2VjdXJpdHlSZXN1bHRcbiAgICAgICAgICogICBDbGllbnRJbml0aWFsaXphdGlvbiAtIG5vdCB0cmlnZ2VyZWQgYnkgc2VydmVyIG1lc3NhZ2VcbiAgICAgICAgICogICBTZXJ2ZXJJbml0aWFsaXphdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgX2luaXRfbXNnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX3JmYl9pbml0X3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnUHJvdG9jb2xWZXJzaW9uJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25lZ290aWF0ZV9wcm90b2NvbF92ZXJzaW9uKCk7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdTZWN1cml0eSc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZWdvdGlhdGVfc2VjdXJpdHkoKTtcblxuICAgICAgICAgICAgICAgIGNhc2UgJ0F1dGhlbnRpY2F0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25lZ290aWF0ZV9hdXRoZW50aWNhdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnU2VjdXJpdHlSZXN1bHQnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlX3NlY3VyaXR5X3Jlc3VsdCgpO1xuXG4gICAgICAgICAgICAgICAgY2FzZSAnQ2xpZW50SW5pdGlhbGlzYXRpb24nOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb2NrLnNlbmQoW3RoaXMuX3NoYXJlZCA/IDEgOiAwXSk7IC8vIENsaWVudEluaXRpYWxpc2F0aW9uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JmYl9pbml0X3N0YXRlID0gJ1NlcnZlckluaXRpYWxpc2F0aW9uJztcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgICAgICBjYXNlICdTZXJ2ZXJJbml0aWFsaXNhdGlvbic6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZWdvdGlhdGVfc2VydmVyX2luaXQoKTtcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKFwiSW50ZXJuYWwgZXJyb3JcIiwgXCJVbmtub3duIGluaXQgc3RhdGU6IFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmZiX2luaXRfc3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9oYW5kbGVfc2V0X2NvbG91cl9tYXBfbXNnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBVdGlsLkRlYnVnKFwiU2V0Q29sb3JNYXBFbnRyaWVzXCIpO1xuICAgICAgICAgICAgdGhpcy5fc29jay5yUXNraXA4KCk7ICAvLyBQYWRkaW5nXG5cbiAgICAgICAgICAgIHZhciBmaXJzdF9jb2xvdXIgPSB0aGlzLl9zb2NrLnJRc2hpZnQxNigpO1xuICAgICAgICAgICAgdmFyIG51bV9jb2xvdXJzID0gdGhpcy5fc29jay5yUXNoaWZ0MTYoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdCgnU2V0Q29sb3JNYXBFbnRyaWVzJywgbnVtX2NvbG91cnMgKiA2LCA2KSkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgICAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBudW1fY29sb3VyczsgYysrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlZCA9IHBhcnNlSW50KHRoaXMuX3NvY2suclFzaGlmdDE2KCkgLyAyNTYsIDEwKTtcbiAgICAgICAgICAgICAgICB2YXIgZ3JlZW4gPSBwYXJzZUludCh0aGlzLl9zb2NrLnJRc2hpZnQxNigpIC8gMjU2LCAxMCk7XG4gICAgICAgICAgICAgICAgdmFyIGJsdWUgPSBwYXJzZUludCh0aGlzLl9zb2NrLnJRc2hpZnQxNigpIC8gMjU2LCAxMCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGlzcGxheS5zZXRfY29sb3VyTWFwKFtibHVlLCBncmVlbiwgcmVkXSwgZmlyc3RfY29sb3VyICsgYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBVdGlsLkRlYnVnKFwiY29sb3VyTWFwOiBcIiArIHRoaXMuX2Rpc3BsYXkuZ2V0X2NvbG91ck1hcCgpKTtcbiAgICAgICAgICAgIFV0aWwuSW5mbyhcIlJlZ2lzdGVyZWQgXCIgKyBudW1fY29sb3VycyArIFwiIGNvbG91ck1hcCBlbnRyaWVzXCIpO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBfaGFuZGxlX3NlcnZlcl9jdXRfdGV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgVXRpbC5EZWJ1ZyhcIlNlcnZlckN1dFRleHRcIik7XG4gICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJTZXJ2ZXJDdXRUZXh0IGhlYWRlclwiLCA3LCAxKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoMyk7ICAvLyBQYWRkaW5nXG4gICAgICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5fc29jay5yUXNoaWZ0MzIoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdChcIlNlcnZlckN1dFRleHRcIiwgbGVuZ3RoLCA4KSkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgICAgICAgICAgdmFyIHRleHQgPSB0aGlzLl9zb2NrLnJRc2hpZnRTdHIobGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMuX29uQ2xpcGJvYXJkKHRoaXMsIHRleHQpO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBfaGFuZGxlX3NlcnZlcl9mZW5jZV9tc2c6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwiU2VydmVyRmVuY2UgaGVhZGVyXCIsIDgsIDEpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgdGhpcy5fc29jay5yUXNraXBCeXRlcygzKTsgLy8gUGFkZGluZ1xuICAgICAgICAgICAgdmFyIGZsYWdzID0gdGhpcy5fc29jay5yUXNoaWZ0MzIoKTtcbiAgICAgICAgICAgIHZhciBsZW5ndGggPSB0aGlzLl9zb2NrLnJRc2hpZnQ4KCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdChcIlNlcnZlckZlbmNlIHBheWxvYWRcIiwgbGVuZ3RoLCA5KSkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgICAgICAgICAgaWYgKGxlbmd0aCA+IDY0KSB7XG4gICAgICAgICAgICAgICAgVXRpbC5XYXJuKFwiQmFkIHBheWxvYWQgbGVuZ3RoIChcIiArIGxlbmd0aCArIFwiKSBpbiBmZW5jZSByZXNwb25zZVwiKTtcbiAgICAgICAgICAgICAgICBsZW5ndGggPSA2NDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHBheWxvYWQgPSB0aGlzLl9zb2NrLnJRc2hpZnRTdHIobGVuZ3RoKTtcblxuICAgICAgICAgICAgdGhpcy5fc3VwcG9ydHNGZW5jZSA9IHRydWU7XG5cbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgKiBGZW5jZSBmbGFnc1xuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqICAoMTw8MCkgIC0gQmxvY2tCZWZvcmVcbiAgICAgICAgICAgICAqICAoMTw8MSkgIC0gQmxvY2tBZnRlclxuICAgICAgICAgICAgICogICgxPDwyKSAgLSBTeW5jTmV4dFxuICAgICAgICAgICAgICogICgxPDwzMSkgLSBSZXF1ZXN0XG4gICAgICAgICAgICAgKi9cblxuICAgICAgICAgICAgaWYgKCEoZmxhZ3MgJiAoMTw8MzEpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9mYWlsKFwiSW50ZXJuYWwgZXJyb3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVuZXhwZWN0ZWQgZmVuY2UgcmVzcG9uc2VcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZpbHRlciBvdXQgdW5zdXBwb3J0ZWQgZmxhZ3NcbiAgICAgICAgICAgIC8vIEZJWE1FOiBzdXBwb3J0IHN5bmNOZXh0XG4gICAgICAgICAgICBmbGFncyAmPSAoMTw8MCkgfCAoMTw8MSk7XG5cbiAgICAgICAgICAgIC8vIEJsb2NrQmVmb3JlIGFuZCBCbG9ja0FmdGVyIGFyZSBhdXRvbWF0aWNhbGx5IGhhbmRsZWQgYnlcbiAgICAgICAgICAgIC8vIHRoZSBmYWN0IHRoYXQgd2UgcHJvY2VzcyBlYWNoIGluY29taW5nIG1lc3NhZ2VcbiAgICAgICAgICAgIC8vIHN5bmNocm9udW9zbHkuXG4gICAgICAgICAgICBSRkIubWVzc2FnZXMuY2xpZW50RmVuY2UodGhpcy5fc29jaywgZmxhZ3MsIHBheWxvYWQpO1xuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBfaGFuZGxlX3h2cF9tc2c6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdChcIlhWUCB2ZXJzaW9uIGFuZCBtZXNzYWdlXCIsIDMsIDEpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgdGhpcy5fc29jay5yUXNraXA4KCk7ICAvLyBQYWRkaW5nXG4gICAgICAgICAgICB2YXIgeHZwX3ZlciA9IHRoaXMuX3NvY2suclFzaGlmdDgoKTtcbiAgICAgICAgICAgIHZhciB4dnBfbXNnID0gdGhpcy5fc29jay5yUXNoaWZ0OCgpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHh2cF9tc2cpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6ICAvLyBYVlBfRkFJTFxuICAgICAgICAgICAgICAgICAgICBVdGlsLkVycm9yKFwiT3BlcmF0aW9uIEZhaWxlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbm90aWZpY2F0aW9uKFwiWFZQIE9wZXJhdGlvbiBGYWlsZWRcIiwgJ2Vycm9yJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTogIC8vIFhWUF9JTklUXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JmYl94dnBfdmVyID0geHZwX3ZlcjtcbiAgICAgICAgICAgICAgICAgICAgVXRpbC5JbmZvKFwiWFZQIGV4dGVuc2lvbnMgZW5hYmxlZCAodmVyc2lvbiBcIiArIHRoaXMuX3JmYl94dnBfdmVyICsgXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblh2cEluaXQodGhpcy5fcmZiX3h2cF92ZXIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mYWlsKFwiVW5leHBlY3RlZCBzZXJ2ZXIgbWVzc2FnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSWxsZWdhbCBzZXJ2ZXIgWFZQIG1lc3NhZ2UgXCIgKyB4dnBfbXNnKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9ub3JtYWxfbXNnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbXNnX3R5cGU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9GQlUucmVjdHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgbXNnX3R5cGUgPSAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtc2dfdHlwZSA9IHRoaXMuX3NvY2suclFzaGlmdDgoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3dpdGNoIChtc2dfdHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgMDogIC8vIEZyYW1lYnVmZmVyVXBkYXRlXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXQgPSB0aGlzLl9mcmFtZWJ1ZmZlclVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBSRkIubWVzc2FnZXMuZmJVcGRhdGVSZXF1ZXN0cyh0aGlzLl9zb2NrLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5hYmxlZENvbnRpbnVvdXNVcGRhdGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzcGxheS5nZXRDbGVhbkRpcnR5UmVzZXQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZiX3dpZHRoLCB0aGlzLl9mYl9oZWlnaHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDE6ICAvLyBTZXRDb2xvck1hcEVudHJpZXNcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZV9zZXRfY29sb3VyX21hcF9tc2coKTtcblxuICAgICAgICAgICAgICAgIGNhc2UgMjogIC8vIEJlbGxcbiAgICAgICAgICAgICAgICAgICAgVXRpbC5EZWJ1ZyhcIkJlbGxcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQmVsbCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDM6ICAvLyBTZXJ2ZXJDdXRUZXh0XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVfc2VydmVyX2N1dF90ZXh0KCk7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDE1MDogLy8gRW5kT2ZDb250aW51b3VzVXBkYXRlc1xuICAgICAgICAgICAgICAgICAgICB2YXIgZmlyc3QgPSAhKHRoaXMuX3N1cHBvcnRzQ29udGludW91c1VwZGF0ZXMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdXBwb3J0c0NvbnRpbnVvdXNVcGRhdGVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5hYmxlZENvbnRpbnVvdXNVcGRhdGVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5hYmxlZENvbnRpbnVvdXNVcGRhdGVzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNvbnRpbnVvdXNVcGRhdGVzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlsLkluZm8oXCJFbmFibGluZyBjb250aW51b3VzIHVwZGF0ZXMuXCIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IFdlIG5lZWQgdG8gc2VuZCBhIGZyYW1lYnVmZmVydXBkYXRlcmVxdWVzdCBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhZGQgc3VwcG9ydCBmb3IgdHVybmluZyBvZmYgY29udGludW91cyB1cGRhdGVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDI0ODogLy8gU2VydmVyRmVuY2VcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZV9zZXJ2ZXJfZmVuY2VfbXNnKCk7XG5cbiAgICAgICAgICAgICAgICBjYXNlIDI1MDogIC8vIFhWUFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlX3h2cF9tc2coKTtcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZhaWwoXCJVbmV4cGVjdGVkIHNlcnZlciBtZXNzYWdlXCIsIFwiVHlwZTpcIiArIG1zZ190eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgVXRpbC5EZWJ1ZyhcInNvY2suclFzbGljZSgwLCAzMCk6IFwiICsgdGhpcy5fc29jay5yUXNsaWNlKDAsIDMwKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9vbkZsdXNoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZsdXNoaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBSZXN1bWUgcHJvY2Vzc2luZ1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclFsZW4oKSA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVfbWVzc2FnZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIF9mcmFtZWJ1ZmZlclVwZGF0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJldCA9IHRydWU7XG4gICAgICAgICAgICB2YXIgbm93O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fRkJVLnJlY3RzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwiRkJVIGhlYWRlclwiLCAzLCAxKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgICAgICAgICB0aGlzLl9zb2NrLnJRc2tpcDgoKTsgIC8vIFBhZGRpbmdcbiAgICAgICAgICAgICAgICB0aGlzLl9GQlUucmVjdHMgPSB0aGlzLl9zb2NrLnJRc2hpZnQxNigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGltaW5nLmN1cl9mYnUgPSAwO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl90aW1pbmcuZmJ1X3J0X3N0YXJ0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBub3cgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuICAgICAgICAgICAgICAgICAgICBVdGlsLkluZm8oXCJGaXJzdCBGQlUgbGF0ZW5jeTogXCIgKyAobm93IC0gdGhpcy5fdGltaW5nLmZidV9ydF9zdGFydCkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJldmlvdXMgZnJhbWUgaXMgZnVsbHkgcmVuZGVyZWQgZmlyc3RcbiAgICAgICAgICAgICAgICAvLyB0byBhdm9pZCBidWlsZGluZyB1cCBhbiBleGNlc3NpdmUgcXVldWVcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZGlzcGxheS5wZW5kaW5nKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmx1c2hpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5LmZsdXNoKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHdoaWxlICh0aGlzLl9GQlUucmVjdHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3JmYl9jb25uZWN0aW9uX3N0YXRlICE9PSAnY29ubmVjdGVkJykgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdChcIkZCVVwiLCB0aGlzLl9GQlUuYnl0ZXMpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9GQlUuYnl0ZXMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwicmVjdCBoZWFkZXJcIiwgMTIpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgICAgICAgICAvKiBOZXcgRnJhbWVidWZmZXJVcGRhdGUgKi9cblxuICAgICAgICAgICAgICAgICAgICB2YXIgaGRyID0gdGhpcy5fc29jay5yUXNoaWZ0Qnl0ZXMoMTIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9GQlUueCAgICAgICAgPSAoaGRyWzBdIDw8IDgpICsgaGRyWzFdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9GQlUueSAgICAgICAgPSAoaGRyWzJdIDw8IDgpICsgaGRyWzNdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9GQlUud2lkdGggICAgPSAoaGRyWzRdIDw8IDgpICsgaGRyWzVdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9GQlUuaGVpZ2h0ICAgPSAoaGRyWzZdIDw8IDgpICsgaGRyWzddO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9GQlUuZW5jb2RpbmcgPSBwYXJzZUludCgoaGRyWzhdIDw8IDI0KSArIChoZHJbOV0gPDwgMTYpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhkclsxMF0gPDwgOCkgKyBoZHJbMTFdLCAxMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25GQlVSZWNlaXZlKHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB7J3gnOiB0aGlzLl9GQlUueCwgJ3knOiB0aGlzLl9GQlUueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGgnOiB0aGlzLl9GQlUud2lkdGgsICdoZWlnaHQnOiB0aGlzLl9GQlUuaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICdlbmNvZGluZyc6IHRoaXMuX0ZCVS5lbmNvZGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAnZW5jb2RpbmdOYW1lJzogdGhpcy5fZW5jTmFtZXNbdGhpcy5fRkJVLmVuY29kaW5nXX0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZW5jTmFtZXNbdGhpcy5fRkJVLmVuY29kaW5nXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmFpbChcIlVuZXhwZWN0ZWQgc2VydmVyIG1lc3NhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVbnN1cHBvcnRlZCBlbmNvZGluZyBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5lbmNvZGluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl90aW1pbmcubGFzdF9mYnUgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpO1xuXG4gICAgICAgICAgICAgICAgcmV0ID0gdGhpcy5fZW5jSGFuZGxlcnNbdGhpcy5fRkJVLmVuY29kaW5nXSgpO1xuXG4gICAgICAgICAgICAgICAgbm93ID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90aW1pbmcuY3VyX2ZidSArPSAobm93IC0gdGhpcy5fdGltaW5nLmxhc3RfZmJ1KTtcblxuICAgICAgICAgICAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5jU3RhdHNbdGhpcy5fRkJVLmVuY29kaW5nXVswXSsrO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmNTdGF0c1t0aGlzLl9GQlUuZW5jb2RpbmddWzFdKys7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpbWluZy5waXhlbHMgKz0gdGhpcy5fRkJVLndpZHRoICogdGhpcy5fRkJVLmhlaWdodDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGltaW5nLnBpeGVscyA+PSAodGhpcy5fZmJfd2lkdGggKiB0aGlzLl9mYl9oZWlnaHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgodGhpcy5fRkJVLndpZHRoID09PSB0aGlzLl9mYl93aWR0aCAmJiB0aGlzLl9GQlUuaGVpZ2h0ID09PSB0aGlzLl9mYl9oZWlnaHQpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90aW1pbmcuZmJ1X3J0X3N0YXJ0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGltaW5nLmZ1bGxfZmJ1X3RvdGFsICs9IHRoaXMuX3RpbWluZy5jdXJfZmJ1O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGltaW5nLmZ1bGxfZmJ1X2NudCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgVXRpbC5JbmZvKFwiVGltaW5nIG9mIGZ1bGwgRkJVLCBjdXJyOiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGltaW5nLmN1cl9mYnUgKyBcIiwgdG90YWw6IFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90aW1pbmcuZnVsbF9mYnVfdG90YWwgKyBcIiwgY250OiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGltaW5nLmZ1bGxfZmJ1X2NudCArIFwiLCBhdmc6IFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5fdGltaW5nLmZ1bGxfZmJ1X3RvdGFsIC8gdGhpcy5fdGltaW5nLmZ1bGxfZmJ1X2NudCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RpbWluZy5mYnVfcnRfc3RhcnQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmJ1X3J0X2RpZmYgPSBub3cgLSB0aGlzLl90aW1pbmcuZmJ1X3J0X3N0YXJ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGltaW5nLmZidV9ydF90b3RhbCArPSBmYnVfcnRfZGlmZjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpbWluZy5mYnVfcnRfY250Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlsLkluZm8oXCJmdWxsIEZCVSByb3VuZC10cmlwLCBjdXI6IFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYnVfcnRfZGlmZiArIFwiLCB0b3RhbDogXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RpbWluZy5mYnVfcnRfdG90YWwgKyBcIiwgY250OiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGltaW5nLmZidV9ydF9jbnQgKyBcIiwgYXZnOiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3RpbWluZy5mYnVfcnRfdG90YWwgLyB0aGlzLl90aW1pbmcuZmJ1X3J0X2NudCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGltaW5nLmZidV9ydF9zdGFydCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIXJldCkgeyByZXR1cm4gcmV0OyB9ICAvLyBuZWVkIG1vcmUgZGF0YVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9vbkZCVUNvbXBsZXRlKHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIHsneCc6IHRoaXMuX0ZCVS54LCAneSc6IHRoaXMuX0ZCVS55LFxuICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJzogdGhpcy5fRkJVLndpZHRoLCAnaGVpZ2h0JzogdGhpcy5fRkJVLmhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICdlbmNvZGluZyc6IHRoaXMuX0ZCVS5lbmNvZGluZyxcbiAgICAgICAgICAgICAgICAgICAgICdlbmNvZGluZ05hbWUnOiB0aGlzLl9lbmNOYW1lc1t0aGlzLl9GQlUuZW5jb2RpbmddfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlOyAgLy8gV2UgZmluaXNoZWQgdGhpcyBGQlVcbiAgICAgICAgfSxcblxuICAgICAgICBfdXBkYXRlQ29udGludW91c1VwZGF0ZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLl9lbmFibGVkQ29udGludW91c1VwZGF0ZXMpIHsgcmV0dXJuOyB9XG5cbiAgICAgICAgICAgIFJGQi5tZXNzYWdlcy5lbmFibGVDb250aW51b3VzVXBkYXRlcyh0aGlzLl9zb2NrLCB0cnVlLCAwLCAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZiX3dpZHRoLCB0aGlzLl9mYl9oZWlnaHQpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIFV0aWwubWFrZV9wcm9wZXJ0aWVzKFJGQiwgW1xuICAgICAgICBbJ3RhcmdldCcsICd3bycsICdkb20nXSwgICAgICAgICAgICAgICAgLy8gVk5DIGRpc3BsYXkgcmVuZGVyaW5nIENhbnZhcyBvYmplY3RcbiAgICAgICAgWydmb2N1c0NvbnRhaW5lcicsICd3bycsICdkb20nXSwgICAgICAgIC8vIERPTSBlbGVtZW50IHRoYXQgY2FwdHVyZXMga2V5Ym9hcmQgaW5wdXRcbiAgICAgICAgWydlbmNyeXB0JywgJ3J3JywgJ2Jvb2wnXSwgICAgICAgICAgICAgIC8vIFVzZSBUTFMvU1NML3dzcyBlbmNyeXB0aW9uXG4gICAgICAgIFsndHJ1ZV9jb2xvcicsICdydycsICdib29sJ10sICAgICAgICAgICAvLyBSZXF1ZXN0IHRydWUgY29sb3IgcGl4ZWwgZGF0YVxuICAgICAgICBbJ2xvY2FsX2N1cnNvcicsICdydycsICdib29sJ10sICAgICAgICAgLy8gUmVxdWVzdCBsb2NhbGx5IHJlbmRlcmVkIGN1cnNvclxuICAgICAgICBbJ3NoYXJlZCcsICdydycsICdib29sJ10sICAgICAgICAgICAgICAgLy8gUmVxdWVzdCBzaGFyZWQgbW9kZVxuICAgICAgICBbJ3ZpZXdfb25seScsICdydycsICdib29sJ10sICAgICAgICAgICAgLy8gRGlzYWJsZSBjbGllbnQgbW91c2Uva2V5Ym9hcmRcbiAgICAgICAgWyd4dnBfcGFzc3dvcmRfc2VwJywgJ3J3JywgJ3N0ciddLCAgICAgIC8vIFNlcGFyYXRvciBmb3IgWFZQIHBhc3N3b3JkIGZpZWxkc1xuICAgICAgICBbJ2Rpc2Nvbm5lY3RUaW1lb3V0JywgJ3J3JywgJ2ludCddLCAgICAgLy8gVGltZSAocykgdG8gd2FpdCBmb3IgZGlzY29ubmVjdGlvblxuICAgICAgICBbJ3dzUHJvdG9jb2xzJywgJ3J3JywgJ2FyciddLCAgICAgICAgICAgLy8gUHJvdG9jb2xzIHRvIHVzZSBpbiB0aGUgV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICAgICAgWydyZXBlYXRlcklEJywgJ3J3JywgJ3N0ciddLCAgICAgICAgICAgIC8vIFtVbHRyYVZOQ10gUmVwZWF0ZXJJRCB0byBjb25uZWN0IHRvXG4gICAgICAgIFsndmlld3BvcnREcmFnJywgJ3J3JywgJ2Jvb2wnXSwgICAgICAgICAvLyBNb3ZlIHRoZSB2aWV3cG9ydCBvbiBtb3VzZSBkcmFnc1xuXG4gICAgICAgIC8vIENhbGxiYWNrIGZ1bmN0aW9uc1xuICAgICAgICBbJ29uVXBkYXRlU3RhdGUnLCAncncnLCAnZnVuYyddLCAgICAgICAgLy8gb25VcGRhdGVTdGF0ZShyZmIsIHN0YXRlLCBvbGRzdGF0ZSk6IGNvbm5lY3Rpb24gc3RhdGUgY2hhbmdlXG4gICAgICAgIFsnb25Ob3RpZmljYXRpb24nLCAncncnLCAnZnVuYyddLCAgICAgICAvLyBvbk5vdGlmaWNhdGlvbihyZmIsIG1zZywgbGV2ZWwsIG9wdGlvbnMpOiBub3RpZmljYXRpb24gZm9yIHRoZSBVSVxuICAgICAgICBbJ29uRGlzY29ubmVjdGVkJywgJ3J3JywgJ2Z1bmMnXSwgICAgICAgLy8gb25EaXNjb25uZWN0ZWQocmZiLCByZWFzb24pOiBkaXNjb25uZWN0aW9uIGZpbmlzaGVkXG4gICAgICAgIFsnb25QYXNzd29yZFJlcXVpcmVkJywgJ3J3JywgJ2Z1bmMnXSwgICAvLyBvblBhc3N3b3JkUmVxdWlyZWQocmZiLCBtc2cpOiBWTkMgcGFzc3dvcmQgaXMgcmVxdWlyZWRcbiAgICAgICAgWydvbkNsaXBib2FyZCcsICdydycsICdmdW5jJ10sICAgICAgICAgIC8vIG9uQ2xpcGJvYXJkKHJmYiwgdGV4dCk6IFJGQiBjbGlwYm9hcmQgY29udGVudHMgcmVjZWl2ZWRcbiAgICAgICAgWydvbkJlbGwnLCAncncnLCAnZnVuYyddLCAgICAgICAgICAgICAgIC8vIG9uQmVsbChyZmIpOiBSRkIgQmVsbCBtZXNzYWdlIHJlY2VpdmVkXG4gICAgICAgIFsnb25GQlVSZWNlaXZlJywgJ3J3JywgJ2Z1bmMnXSwgICAgICAgICAvLyBvbkZCVVJlY2VpdmUocmZiLCBmYnUpOiBSRkIgRkJVIHJlY2VpdmVkIGJ1dCBub3QgeWV0IHByb2Nlc3NlZFxuICAgICAgICBbJ29uRkJVQ29tcGxldGUnLCAncncnLCAnZnVuYyddLCAgICAgICAgLy8gb25GQlVDb21wbGV0ZShyZmIsIGZidSk6IFJGQiBGQlUgcmVjZWl2ZWQgYW5kIHByb2Nlc3NlZFxuICAgICAgICBbJ29uRkJSZXNpemUnLCAncncnLCAnZnVuYyddLCAgICAgICAgICAgLy8gb25GQlJlc2l6ZShyZmIsIHdpZHRoLCBoZWlnaHQpOiBmcmFtZSBidWZmZXIgcmVzaXplZFxuICAgICAgICBbJ29uRGVza3RvcE5hbWUnLCAncncnLCAnZnVuYyddLCAgICAgICAgLy8gb25EZXNrdG9wTmFtZShyZmIsIG5hbWUpOiBkZXNrdG9wIG5hbWUgcmVjZWl2ZWRcbiAgICAgICAgWydvblh2cEluaXQnLCAncncnLCAnZnVuYyddICAgICAgICAgICAgIC8vIG9uWHZwSW5pdCh2ZXJzaW9uKTogWFZQIGV4dGVuc2lvbnMgYWN0aXZlIGZvciB0aGlzIGNvbm5lY3Rpb25cbiAgICBdKTtcblxuICAgIFJGQi5wcm90b3R5cGUuc2V0X2xvY2FsX2N1cnNvciA9IGZ1bmN0aW9uIChjdXJzb3IpIHtcbiAgICAgICAgaWYgKCFjdXJzb3IgfHwgKGN1cnNvciBpbiB7JzAnOiAxLCAnbm8nOiAxLCAnZmFsc2UnOiAxfSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvY2FsX2N1cnNvciA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fZGlzcGxheS5kaXNhYmxlTG9jYWxDdXJzb3IoKTsgLy9Pbmx5IHNob3cgc2VydmVyLXNpZGUgY3Vyc29yXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fZGlzcGxheS5nZXRfY3Vyc29yX3VyaSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9jYWxfY3Vyc29yID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgVXRpbC5XYXJuKFwiQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGxvY2FsIGN1cnNvclwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5LmRpc2FibGVMb2NhbEN1cnNvcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIFJGQi5wcm90b3R5cGUuZ2V0X2Rpc3BsYXkgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9kaXNwbGF5OyB9O1xuICAgIFJGQi5wcm90b3R5cGUuZ2V0X2tleWJvYXJkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fa2V5Ym9hcmQ7IH07XG4gICAgUkZCLnByb3RvdHlwZS5nZXRfbW91c2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9tb3VzZTsgfTtcblxuICAgIC8vIENsYXNzIE1ldGhvZHNcbiAgICBSRkIubWVzc2FnZXMgPSB7XG4gICAgICAgIGtleUV2ZW50OiBmdW5jdGlvbiAoc29jaywga2V5c3ltLCBkb3duKSB7XG4gICAgICAgICAgICB2YXIgYnVmZiA9IHNvY2suX3NRO1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHNvY2suX3NRbGVuO1xuXG4gICAgICAgICAgICBidWZmW29mZnNldF0gPSA0OyAgLy8gbXNnLXR5cGVcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMV0gPSBkb3duO1xuXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDJdID0gMDtcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgM10gPSAwO1xuXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDRdID0gKGtleXN5bSA+PiAyNCk7XG4gICAgICAgICAgICBidWZmW29mZnNldCArIDVdID0gKGtleXN5bSA+PiAxNik7XG4gICAgICAgICAgICBidWZmW29mZnNldCArIDZdID0gKGtleXN5bSA+PiA4KTtcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgN10gPSBrZXlzeW07XG5cbiAgICAgICAgICAgIHNvY2suX3NRbGVuICs9IDg7XG4gICAgICAgICAgICBzb2NrLmZsdXNoKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgUUVNVUV4dGVuZGVkS2V5RXZlbnQ6IGZ1bmN0aW9uIChzb2NrLCBrZXlzeW0sIGRvd24sIGtleWNvZGUpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFJGQmtleWNvZGUoeHRfc2NhbmNvZGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgdXBwZXJCeXRlID0gKGtleWNvZGUgPj4gOCk7XG4gICAgICAgICAgICAgICAgdmFyIGxvd2VyQnl0ZSA9IChrZXljb2RlICYgMHgwMGZmKTtcbiAgICAgICAgICAgICAgICBpZiAodXBwZXJCeXRlID09PSAweGUwICYmIGxvd2VyQnl0ZSA8IDB4N2YpIHtcbiAgICAgICAgICAgICAgICAgICAgbG93ZXJCeXRlID0gbG93ZXJCeXRlIHwgMHg4MDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvd2VyQnl0ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHh0X3NjYW5jb2RlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgYnVmZiA9IHNvY2suX3NRO1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHNvY2suX3NRbGVuO1xuXG4gICAgICAgICAgICBidWZmW29mZnNldF0gPSAyNTU7IC8vIG1zZy10eXBlXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDFdID0gMDsgLy8gc3ViIG1zZy10eXBlXG5cbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMl0gPSAoZG93biA+PiA4KTtcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgM10gPSBkb3duO1xuXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDRdID0gKGtleXN5bSA+PiAyNCk7XG4gICAgICAgICAgICBidWZmW29mZnNldCArIDVdID0gKGtleXN5bSA+PiAxNik7XG4gICAgICAgICAgICBidWZmW29mZnNldCArIDZdID0gKGtleXN5bSA+PiA4KTtcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgN10gPSBrZXlzeW07XG5cbiAgICAgICAgICAgIHZhciBSRkJrZXljb2RlID0gZ2V0UkZCa2V5Y29kZShrZXljb2RlKTtcblxuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyA4XSA9IChSRkJrZXljb2RlID4+IDI0KTtcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgOV0gPSAoUkZCa2V5Y29kZSA+PiAxNik7XG4gICAgICAgICAgICBidWZmW29mZnNldCArIDEwXSA9IChSRkJrZXljb2RlID4+IDgpO1xuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAxMV0gPSBSRkJrZXljb2RlO1xuXG4gICAgICAgICAgICBzb2NrLl9zUWxlbiArPSAxMjtcbiAgICAgICAgICAgIHNvY2suZmx1c2goKTtcbiAgICAgICAgfSxcblxuICAgICAgICBwb2ludGVyRXZlbnQ6IGZ1bmN0aW9uIChzb2NrLCB4LCB5LCBtYXNrKSB7XG4gICAgICAgICAgICB2YXIgYnVmZiA9IHNvY2suX3NRO1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHNvY2suX3NRbGVuO1xuXG4gICAgICAgICAgICBidWZmW29mZnNldF0gPSA1OyAvLyBtc2ctdHlwZVxuXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDFdID0gbWFzaztcblxuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAyXSA9IHggPj4gODtcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgM10gPSB4O1xuXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDRdID0geSA+PiA4O1xuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyA1XSA9IHk7XG5cbiAgICAgICAgICAgIHNvY2suX3NRbGVuICs9IDY7XG4gICAgICAgICAgICBzb2NrLmZsdXNoKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gVE9ETyhkaXJlY3R4bWFuMTIpOiBtYWtlIHRoaXMgdW5pY29kZSBjb21wYXRpYmxlP1xuICAgICAgICBjbGllbnRDdXRUZXh0OiBmdW5jdGlvbiAoc29jaywgdGV4dCkge1xuICAgICAgICAgICAgdmFyIGJ1ZmYgPSBzb2NrLl9zUTtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSBzb2NrLl9zUWxlbjtcblxuICAgICAgICAgICAgYnVmZltvZmZzZXRdID0gNjsgLy8gbXNnLXR5cGVcblxuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAxXSA9IDA7IC8vIHBhZGRpbmdcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMl0gPSAwOyAvLyBwYWRkaW5nXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDNdID0gMDsgLy8gcGFkZGluZ1xuXG4gICAgICAgICAgICB2YXIgbiA9IHRleHQubGVuZ3RoO1xuXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDRdID0gbiA+PiAyNDtcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgNV0gPSBuID4+IDE2O1xuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyA2XSA9IG4gPj4gODtcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgN10gPSBuO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgOCArIGldID0gIHRleHQuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc29jay5fc1FsZW4gKz0gOCArIG47XG4gICAgICAgICAgICBzb2NrLmZsdXNoKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0RGVza3RvcFNpemU6IGZ1bmN0aW9uIChzb2NrLCB3aWR0aCwgaGVpZ2h0LCBpZCwgZmxhZ3MpIHtcbiAgICAgICAgICAgIHZhciBidWZmID0gc29jay5fc1E7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gc29jay5fc1FsZW47XG5cbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0XSA9IDI1MTsgICAgICAgICAgICAgIC8vIG1zZy10eXBlXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDFdID0gMDsgICAgICAgICAgICAvLyBwYWRkaW5nXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDJdID0gd2lkdGggPj4gODsgICAvLyB3aWR0aFxuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAzXSA9IHdpZHRoO1xuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyA0XSA9IGhlaWdodCA+PiA4OyAgLy8gaGVpZ2h0XG4gICAgICAgICAgICBidWZmW29mZnNldCArIDVdID0gaGVpZ2h0O1xuXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDZdID0gMTsgICAgICAgICAgICAvLyBudW1iZXItb2Ytc2NyZWVuc1xuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyA3XSA9IDA7ICAgICAgICAgICAgLy8gcGFkZGluZ1xuXG4gICAgICAgICAgICAvLyBzY3JlZW4gYXJyYXlcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgOF0gPSBpZCA+PiAyNDsgICAgIC8vIGlkXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDldID0gaWQgPj4gMTY7XG4gICAgICAgICAgICBidWZmW29mZnNldCArIDEwXSA9IGlkID4+IDg7XG4gICAgICAgICAgICBidWZmW29mZnNldCArIDExXSA9IGlkO1xuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAxMl0gPSAwOyAgICAgICAgICAgLy8geC1wb3NpdGlvblxuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAxM10gPSAwO1xuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAxNF0gPSAwOyAgICAgICAgICAgLy8geS1wb3NpdGlvblxuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAxNV0gPSAwO1xuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAxNl0gPSB3aWR0aCA+PiA4OyAgLy8gd2lkdGhcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMTddID0gd2lkdGg7XG4gICAgICAgICAgICBidWZmW29mZnNldCArIDE4XSA9IGhlaWdodCA+PiA4OyAvLyBoZWlnaHRcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMTldID0gaGVpZ2h0O1xuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAyMF0gPSBmbGFncyA+PiAyNDsgLy8gZmxhZ3NcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMjFdID0gZmxhZ3MgPj4gMTY7XG4gICAgICAgICAgICBidWZmW29mZnNldCArIDIyXSA9IGZsYWdzID4+IDg7XG4gICAgICAgICAgICBidWZmW29mZnNldCArIDIzXSA9IGZsYWdzO1xuXG4gICAgICAgICAgICBzb2NrLl9zUWxlbiArPSAyNDtcbiAgICAgICAgICAgIHNvY2suZmx1c2goKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjbGllbnRGZW5jZTogZnVuY3Rpb24gKHNvY2ssIGZsYWdzLCBwYXlsb2FkKSB7XG4gICAgICAgICAgICB2YXIgYnVmZiA9IHNvY2suX3NRO1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHNvY2suX3NRbGVuO1xuXG4gICAgICAgICAgICBidWZmW29mZnNldF0gPSAyNDg7IC8vIG1zZy10eXBlXG5cbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMV0gPSAwOyAvLyBwYWRkaW5nXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDJdID0gMDsgLy8gcGFkZGluZ1xuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAzXSA9IDA7IC8vIHBhZGRpbmdcblxuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyA0XSA9IGZsYWdzID4+IDI0OyAvLyBmbGFnc1xuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyA1XSA9IGZsYWdzID4+IDE2O1xuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyA2XSA9IGZsYWdzID4+IDg7XG4gICAgICAgICAgICBidWZmW29mZnNldCArIDddID0gZmxhZ3M7XG5cbiAgICAgICAgICAgIHZhciBuID0gcGF5bG9hZC5sZW5ndGg7XG5cbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgOF0gPSBuOyAvLyBsZW5ndGhcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBidWZmW29mZnNldCArIDkgKyBpXSA9IHBheWxvYWQuY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc29jay5fc1FsZW4gKz0gOSArIG47XG4gICAgICAgICAgICBzb2NrLmZsdXNoKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZW5hYmxlQ29udGludW91c1VwZGF0ZXM6IGZ1bmN0aW9uIChzb2NrLCBlbmFibGUsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgICAgIHZhciBidWZmID0gc29jay5fc1E7XG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gc29jay5fc1FsZW47XG5cbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0XSA9IDE1MDsgICAgICAgICAgICAgLy8gbXNnLXR5cGVcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMV0gPSBlbmFibGU7ICAgICAgLy8gZW5hYmxlLWZsYWdcblxuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAyXSA9IHggPj4gODsgICAgICAvLyB4XG4gICAgICAgICAgICBidWZmW29mZnNldCArIDNdID0geDtcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgNF0gPSB5ID4+IDg7ICAgICAgLy8geVxuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyA1XSA9IHk7XG4gICAgICAgICAgICBidWZmW29mZnNldCArIDZdID0gd2lkdGggPj4gODsgIC8vIHdpZHRoXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDddID0gd2lkdGg7XG4gICAgICAgICAgICBidWZmW29mZnNldCArIDhdID0gaGVpZ2h0ID4+IDg7IC8vIGhlaWdodFxuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyA5XSA9IGhlaWdodDtcblxuICAgICAgICAgICAgc29jay5fc1FsZW4gKz0gMTA7XG4gICAgICAgICAgICBzb2NrLmZsdXNoKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGl4ZWxGb3JtYXQ6IGZ1bmN0aW9uIChzb2NrLCBicHAsIGRlcHRoLCB0cnVlX2NvbG9yKSB7XG4gICAgICAgICAgICB2YXIgYnVmZiA9IHNvY2suX3NRO1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHNvY2suX3NRbGVuO1xuXG4gICAgICAgICAgICBidWZmW29mZnNldF0gPSAwOyAgLy8gbXNnLXR5cGVcblxuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAxXSA9IDA7IC8vIHBhZGRpbmdcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMl0gPSAwOyAvLyBwYWRkaW5nXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDNdID0gMDsgLy8gcGFkZGluZ1xuXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDRdID0gYnBwICogODsgICAgICAgICAgICAgLy8gYml0cy1wZXItcGl4ZWxcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgNV0gPSBkZXB0aCAqIDg7ICAgICAgICAgICAvLyBkZXB0aFxuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyA2XSA9IDA7ICAgICAgICAgICAgICAgICAgIC8vIGxpdHRsZS1lbmRpYW5cbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgN10gPSB0cnVlX2NvbG9yID8gMSA6IDA7ICAvLyB0cnVlLWNvbG9yXG5cbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgOF0gPSAwOyAgICAvLyByZWQtbWF4XG4gICAgICAgICAgICBidWZmW29mZnNldCArIDldID0gMjU1OyAgLy8gcmVkLW1heFxuXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDEwXSA9IDA7ICAgLy8gZ3JlZW4tbWF4XG4gICAgICAgICAgICBidWZmW29mZnNldCArIDExXSA9IDI1NTsgLy8gZ3JlZW4tbWF4XG5cbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMTJdID0gMDsgICAvLyBibHVlLW1heFxuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAxM10gPSAyNTU7IC8vIGJsdWUtbWF4XG5cbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMTRdID0gMTY7ICAvLyByZWQtc2hpZnRcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMTVdID0gODsgICAvLyBncmVlbi1zaGlmdFxuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAxNl0gPSAwOyAgIC8vIGJsdWUtc2hpZnRcblxuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAxN10gPSAwOyAgIC8vIHBhZGRpbmdcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMThdID0gMDsgICAvLyBwYWRkaW5nXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDE5XSA9IDA7ICAgLy8gcGFkZGluZ1xuXG4gICAgICAgICAgICBzb2NrLl9zUWxlbiArPSAyMDtcbiAgICAgICAgICAgIHNvY2suZmx1c2goKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjbGllbnRFbmNvZGluZ3M6IGZ1bmN0aW9uIChzb2NrLCBlbmNvZGluZ3MsIGxvY2FsX2N1cnNvciwgdHJ1ZV9jb2xvcikge1xuICAgICAgICAgICAgdmFyIGJ1ZmYgPSBzb2NrLl9zUTtcbiAgICAgICAgICAgIHZhciBvZmZzZXQgPSBzb2NrLl9zUWxlbjtcblxuICAgICAgICAgICAgYnVmZltvZmZzZXRdID0gMjsgLy8gbXNnLXR5cGVcbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0ICsgMV0gPSAwOyAvLyBwYWRkaW5nXG5cbiAgICAgICAgICAgIC8vIG9mZnNldCArIDIgYW5kIG9mZnNldCArIDMgYXJlIGVuY29kaW5nIGNvdW50XG5cbiAgICAgICAgICAgIHZhciBpLCBqID0gb2Zmc2V0ICsgNCwgY250ID0gMDtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlbmNvZGluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZW5jb2RpbmdzW2ldWzBdID09PSBcIkN1cnNvclwiICYmICFsb2NhbF9jdXJzb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgVXRpbC5EZWJ1ZyhcIlNraXBwaW5nIEN1cnNvciBwc2V1ZG8tZW5jb2RpbmdcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbmNvZGluZ3NbaV1bMF0gPT09IFwiVElHSFRcIiAmJiAhdHJ1ZV9jb2xvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyB3aGVuIHdlIGhhdmUgdGlnaHQrbm9uLXRydWUtY29sb3JcbiAgICAgICAgICAgICAgICAgICAgVXRpbC5XYXJuKFwiU2tpcHBpbmcgdGlnaHQgYXMgaXQgaXMgb25seSBzdXBwb3J0ZWQgd2l0aCB0cnVlIGNvbG9yXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbmMgPSBlbmNvZGluZ3NbaV1bMV07XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZbal0gPSBlbmMgPj4gMjQ7XG4gICAgICAgICAgICAgICAgICAgIGJ1ZmZbaiArIDFdID0gZW5jID4+IDE2O1xuICAgICAgICAgICAgICAgICAgICBidWZmW2ogKyAyXSA9IGVuYyA+PiA4O1xuICAgICAgICAgICAgICAgICAgICBidWZmW2ogKyAzXSA9IGVuYztcblxuICAgICAgICAgICAgICAgICAgICBqICs9IDQ7XG4gICAgICAgICAgICAgICAgICAgIGNudCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAyXSA9IGNudCA+PiA4O1xuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAzXSA9IGNudDtcblxuICAgICAgICAgICAgc29jay5fc1FsZW4gKz0gaiAtIG9mZnNldDtcbiAgICAgICAgICAgIHNvY2suZmx1c2goKTtcbiAgICAgICAgfSxcblxuICAgICAgICBmYlVwZGF0ZVJlcXVlc3RzOiBmdW5jdGlvbiAoc29jaywgb25seU5vbkluYywgY2xlYW5EaXJ0eSwgZmJfd2lkdGgsIGZiX2hlaWdodCkge1xuICAgICAgICAgICAgdmFyIG9mZnNldEluY3JlbWVudCA9IDA7XG5cbiAgICAgICAgICAgIHZhciBjYiA9IGNsZWFuRGlydHkuY2xlYW5Cb3g7XG4gICAgICAgICAgICB2YXIgdywgaDtcbiAgICAgICAgICAgIGlmICghb25seU5vbkluYyAmJiAoY2IudyA+IDAgJiYgY2IuaCA+IDApKSB7XG4gICAgICAgICAgICAgICAgdyA9IHR5cGVvZiBjYi53ID09PSBcInVuZGVmaW5lZFwiID8gZmJfd2lkdGggOiBjYi53O1xuICAgICAgICAgICAgICAgIGggPSB0eXBlb2YgY2IuaCA9PT0gXCJ1bmRlZmluZWRcIiA/IGZiX2hlaWdodCA6IGNiLmg7XG4gICAgICAgICAgICAgICAgLy8gUmVxdWVzdCBpbmNyZW1lbnRhbCBmb3IgY2xlYW4gYm94XG4gICAgICAgICAgICAgICAgUkZCLm1lc3NhZ2VzLmZiVXBkYXRlUmVxdWVzdChzb2NrLCAxLCBjYi54LCBjYi55LCB3LCBoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbGVhbkRpcnR5LmRpcnR5Qm94ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgZGIgPSBjbGVhbkRpcnR5LmRpcnR5Qm94ZXNbaV07XG4gICAgICAgICAgICAgICAgLy8gRm9yY2UgYWxsIChub24taW5jcmVtZW50YWwpIGZvciBkaXJ0eSBib3hcbiAgICAgICAgICAgICAgICB3ID0gdHlwZW9mIGRiLncgPT09IFwidW5kZWZpbmVkXCIgPyBmYl93aWR0aCA6IGRiLnc7XG4gICAgICAgICAgICAgICAgaCA9IHR5cGVvZiBkYi5oID09PSBcInVuZGVmaW5lZFwiID8gZmJfaGVpZ2h0IDogZGIuaDtcbiAgICAgICAgICAgICAgICBSRkIubWVzc2FnZXMuZmJVcGRhdGVSZXF1ZXN0KHNvY2ssIDAsIGRiLngsIGRiLnksIHcsIGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGZiVXBkYXRlUmVxdWVzdDogZnVuY3Rpb24gKHNvY2ssIGluY3JlbWVudGFsLCB4LCB5LCB3LCBoKSB7XG4gICAgICAgICAgICB2YXIgYnVmZiA9IHNvY2suX3NRO1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHNvY2suX3NRbGVuO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mKHgpID09PSBcInVuZGVmaW5lZFwiKSB7IHggPSAwOyB9XG4gICAgICAgICAgICBpZiAodHlwZW9mKHkpID09PSBcInVuZGVmaW5lZFwiKSB7IHkgPSAwOyB9XG5cbiAgICAgICAgICAgIGJ1ZmZbb2Zmc2V0XSA9IDM7ICAvLyBtc2ctdHlwZVxuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAxXSA9IGluY3JlbWVudGFsO1xuXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDJdID0gKHggPj4gOCkgJiAweEZGO1xuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyAzXSA9IHggJiAweEZGO1xuXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDRdID0gKHkgPj4gOCkgJiAweEZGO1xuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyA1XSA9IHkgJiAweEZGO1xuXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDZdID0gKHcgPj4gOCkgJiAweEZGO1xuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyA3XSA9IHcgJiAweEZGO1xuXG4gICAgICAgICAgICBidWZmW29mZnNldCArIDhdID0gKGggPj4gOCkgJiAweEZGO1xuICAgICAgICAgICAgYnVmZltvZmZzZXQgKyA5XSA9IGggJiAweEZGO1xuXG4gICAgICAgICAgICBzb2NrLl9zUWxlbiArPSAxMDtcbiAgICAgICAgICAgIHNvY2suZmx1c2goKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBSRkIuZ2VuREVTID0gZnVuY3Rpb24gKHBhc3N3b3JkLCBjaGFsbGVuZ2UpIHtcbiAgICAgICAgdmFyIHBhc3N3ZCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhc3N3b3JkLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBwYXNzd2QucHVzaChwYXNzd29yZC5jaGFyQ29kZUF0KGkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKG5ldyBERVMocGFzc3dkKSkuZW5jcnlwdChjaGFsbGVuZ2UpO1xuICAgIH07XG5cbiAgICBSRkIuZW5jb2RpbmdIYW5kbGVycyA9IHtcbiAgICAgICAgUkFXOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fRkJVLmxpbmVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fRkJVLmxpbmVzID0gdGhpcy5fRkJVLmhlaWdodDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzID0gdGhpcy5fRkJVLndpZHRoICogdGhpcy5fZmJfQnBwOyAgLy8gYXQgbGVhc3QgYSBsaW5lXG4gICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJSQVdcIiwgdGhpcy5fRkJVLmJ5dGVzKSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgICAgIHZhciBjdXJfeSA9IHRoaXMuX0ZCVS55ICsgKHRoaXMuX0ZCVS5oZWlnaHQgLSB0aGlzLl9GQlUubGluZXMpO1xuICAgICAgICAgICAgdmFyIGN1cnJfaGVpZ2h0ID0gTWF0aC5taW4odGhpcy5fRkJVLmxpbmVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcih0aGlzLl9zb2NrLnJRbGVuKCkgLyAodGhpcy5fRkJVLndpZHRoICogdGhpcy5fZmJfQnBwKSkpO1xuICAgICAgICAgICAgdGhpcy5fZGlzcGxheS5ibGl0SW1hZ2UodGhpcy5fRkJVLngsIGN1cl95LCB0aGlzLl9GQlUud2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyX2hlaWdodCwgdGhpcy5fc29jay5nZXRfclEoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suZ2V0X3JRaSgpKTtcbiAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXModGhpcy5fRkJVLndpZHRoICogY3Vycl9oZWlnaHQgKiB0aGlzLl9mYl9CcHApO1xuICAgICAgICAgICAgdGhpcy5fRkJVLmxpbmVzIC09IGN1cnJfaGVpZ2h0O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5fRkJVLmxpbmVzID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyA9IHRoaXMuX0ZCVS53aWR0aCAqIHRoaXMuX2ZiX0JwcDsgIC8vIEF0IGxlYXN0IGFub3RoZXIgbGluZVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9GQlUucmVjdHMtLTtcbiAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSAwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBDT1BZUkVDVDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzID0gNDtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdChcIkNPUFlSRUNUXCIsIDQpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgdGhpcy5fZGlzcGxheS5jb3B5SW1hZ2UodGhpcy5fc29jay5yUXNoaWZ0MTYoKSwgdGhpcy5fc29jay5yUXNoaWZ0MTYoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS54LCB0aGlzLl9GQlUueSwgdGhpcy5fRkJVLndpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmhlaWdodCk7XG5cbiAgICAgICAgICAgIHRoaXMuX0ZCVS5yZWN0cy0tO1xuICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzID0gMDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuXG4gICAgICAgIFJSRTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGNvbG9yO1xuICAgICAgICAgICAgaWYgKHRoaXMuX0ZCVS5zdWJyZWN0cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyA9IDQgKyB0aGlzLl9mYl9CcHA7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwiUlJFXCIsIDQgKyB0aGlzLl9mYl9CcHApKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5zdWJyZWN0cyA9IHRoaXMuX3NvY2suclFzaGlmdDMyKCk7XG4gICAgICAgICAgICAgICAgY29sb3IgPSB0aGlzLl9zb2NrLnJRc2hpZnRCeXRlcyh0aGlzLl9mYl9CcHApOyAgLy8gQmFja2dyb3VuZFxuICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkuZmlsbFJlY3QodGhpcy5fRkJVLngsIHRoaXMuX0ZCVS55LCB0aGlzLl9GQlUud2lkdGgsIHRoaXMuX0ZCVS5oZWlnaHQsIGNvbG9yKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2hpbGUgKHRoaXMuX0ZCVS5zdWJyZWN0cyA+IDAgJiYgdGhpcy5fc29jay5yUWxlbigpID49ICh0aGlzLl9mYl9CcHAgKyA4KSkge1xuICAgICAgICAgICAgICAgIGNvbG9yID0gdGhpcy5fc29jay5yUXNoaWZ0Qnl0ZXModGhpcy5fZmJfQnBwKTtcbiAgICAgICAgICAgICAgICB2YXIgeCA9IHRoaXMuX3NvY2suclFzaGlmdDE2KCk7XG4gICAgICAgICAgICAgICAgdmFyIHkgPSB0aGlzLl9zb2NrLnJRc2hpZnQxNigpO1xuICAgICAgICAgICAgICAgIHZhciB3aWR0aCA9IHRoaXMuX3NvY2suclFzaGlmdDE2KCk7XG4gICAgICAgICAgICAgICAgdmFyIGhlaWdodCA9IHRoaXMuX3NvY2suclFzaGlmdDE2KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGlzcGxheS5maWxsUmVjdCh0aGlzLl9GQlUueCArIHgsIHRoaXMuX0ZCVS55ICsgeSwgd2lkdGgsIGhlaWdodCwgY29sb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5zdWJyZWN0cy0tO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fRkJVLnN1YnJlY3RzID4gMCkge1xuICAgICAgICAgICAgICAgIHZhciBjaHVuayA9IE1hdGgubWluKHRoaXMuX3JyZV9jaHVua19zeiwgdGhpcy5fRkJVLnN1YnJlY3RzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSAodGhpcy5fZmJfQnBwICsgOCkgKiBjaHVuaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fRkJVLnJlY3RzLS07XG4gICAgICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzID0gMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgSEVYVElMRTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHJRID0gdGhpcy5fc29jay5nZXRfclEoKTtcbiAgICAgICAgICAgIHZhciByUWkgPSB0aGlzLl9zb2NrLmdldF9yUWkoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuX0ZCVS50aWxlcyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS50aWxlc194ID0gTWF0aC5jZWlsKHRoaXMuX0ZCVS53aWR0aCAvIDE2KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9GQlUudGlsZXNfeSA9IE1hdGguY2VpbCh0aGlzLl9GQlUuaGVpZ2h0IC8gMTYpO1xuICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS50b3RhbF90aWxlcyA9IHRoaXMuX0ZCVS50aWxlc194ICogdGhpcy5fRkJVLnRpbGVzX3k7XG4gICAgICAgICAgICAgICAgdGhpcy5fRkJVLnRpbGVzID0gdGhpcy5fRkJVLnRvdGFsX3RpbGVzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aGlsZSAodGhpcy5fRkJVLnRpbGVzID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyA9IDE7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwiSEVYVElMRSBzdWJlbmNvZGluZ1wiLCB0aGlzLl9GQlUuYnl0ZXMpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgICAgIHZhciBzdWJlbmNvZGluZyA9IHJRW3JRaV07ICAvLyBQZWVrXG4gICAgICAgICAgICAgICAgaWYgKHN1YmVuY29kaW5nID4gMzApIHsgIC8vIFJhd1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mYWlsKFwiVW5leHBlY3RlZCBzZXJ2ZXIgbWVzc2FnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSWxsZWdhbCBoZXh0aWxlIHN1YmVuY29kaW5nOiBcIiArIHN1YmVuY29kaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBzdWJyZWN0cyA9IDA7XG4gICAgICAgICAgICAgICAgdmFyIGN1cnJfdGlsZSA9IHRoaXMuX0ZCVS50b3RhbF90aWxlcyAtIHRoaXMuX0ZCVS50aWxlcztcbiAgICAgICAgICAgICAgICB2YXIgdGlsZV94ID0gY3Vycl90aWxlICUgdGhpcy5fRkJVLnRpbGVzX3g7XG4gICAgICAgICAgICAgICAgdmFyIHRpbGVfeSA9IE1hdGguZmxvb3IoY3Vycl90aWxlIC8gdGhpcy5fRkJVLnRpbGVzX3gpO1xuICAgICAgICAgICAgICAgIHZhciB4ID0gdGhpcy5fRkJVLnggKyB0aWxlX3ggKiAxNjtcbiAgICAgICAgICAgICAgICB2YXIgeSA9IHRoaXMuX0ZCVS55ICsgdGlsZV95ICogMTY7XG4gICAgICAgICAgICAgICAgdmFyIHcgPSBNYXRoLm1pbigxNiwgKHRoaXMuX0ZCVS54ICsgdGhpcy5fRkJVLndpZHRoKSAtIHgpO1xuICAgICAgICAgICAgICAgIHZhciBoID0gTWF0aC5taW4oMTYsICh0aGlzLl9GQlUueSArIHRoaXMuX0ZCVS5oZWlnaHQpIC0geSk7XG5cbiAgICAgICAgICAgICAgICAvLyBGaWd1cmUgb3V0IGhvdyBtdWNoIHdlIGFyZSBleHBlY3RpbmdcbiAgICAgICAgICAgICAgICBpZiAoc3ViZW5jb2RpbmcgJiAweDAxKSB7ICAvLyBSYXdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzICs9IHcgKiBoICogdGhpcy5fZmJfQnBwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdWJlbmNvZGluZyAmIDB4MDIpIHsgIC8vIEJhY2tncm91bmRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyArPSB0aGlzLl9mYl9CcHA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1YmVuY29kaW5nICYgMHgwNCkgeyAgLy8gRm9yZWdyb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzICs9IHRoaXMuX2ZiX0JwcDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoc3ViZW5jb2RpbmcgJiAweDA4KSB7ICAvLyBBbnlTdWJyZWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzKys7ICAvLyBTaW5jZSB3ZSBhcmVuJ3Qgc2hpZnRpbmcgaXQgb2ZmXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJoZXh0aWxlIHN1YnJlY3RzIGhlYWRlclwiLCB0aGlzLl9GQlUuYnl0ZXMpKSB7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3VicmVjdHMgPSByUVtyUWkgKyB0aGlzLl9GQlUuYnl0ZXMgLSAxXTsgIC8vIFBlZWtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJlbmNvZGluZyAmIDB4MTApIHsgIC8vIFN1YnJlY3RzQ29sb3VyZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgKz0gc3VicmVjdHMgKiAodGhpcy5fZmJfQnBwICsgMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyArPSBzdWJyZWN0cyAqIDI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJoZXh0aWxlXCIsIHRoaXMuX0ZCVS5ieXRlcykpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgICAgICAgICAgICAgICAvLyBXZSBrbm93IHRoZSBlbmNvZGluZyBhbmQgaGF2ZSBhIHdob2xlIHRpbGVcbiAgICAgICAgICAgICAgICB0aGlzLl9GQlUuc3ViZW5jb2RpbmcgPSByUVtyUWldO1xuICAgICAgICAgICAgICAgIHJRaSsrO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9GQlUuc3ViZW5jb2RpbmcgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX0ZCVS5sYXN0c3ViZW5jb2RpbmcgJiAweDAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZWlyZDogaWdub3JlIGJsYW5rcyBhcmUgUkFXXG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlsLkRlYnVnKFwiICAgICBJZ25vcmluZyBibGFuayBhZnRlciBSQVdcIik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5LmZpbGxSZWN0KHgsIHksIHcsIGgsIHRoaXMuX0ZCVS5iYWNrZ3JvdW5kKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fRkJVLnN1YmVuY29kaW5nICYgMHgwMSkgeyAgLy8gUmF3XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkuYmxpdEltYWdlKHgsIHksIHcsIGgsIHJRLCByUWkpO1xuICAgICAgICAgICAgICAgICAgICByUWkgKz0gdGhpcy5fRkJVLmJ5dGVzIC0gMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fRkJVLnN1YmVuY29kaW5nICYgMHgwMikgeyAgLy8gQmFja2dyb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2ZiX0JwcCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmJhY2tncm91bmQgPSByUVtyUWldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYl9CcHAgaXMgNFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5iYWNrZ3JvdW5kID0gW3JRW3JRaV0sIHJRW3JRaSArIDFdLCByUVtyUWkgKyAyXSwgclFbclFpICsgM11dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgclFpICs9IHRoaXMuX2ZiX0JwcDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fRkJVLnN1YmVuY29kaW5nICYgMHgwNCkgeyAgLy8gRm9yZWdyb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2ZiX0JwcCA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmZvcmVncm91bmQgPSByUVtyUWldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLl9mYl9CcHAgaXMgNFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5mb3JlZ3JvdW5kID0gW3JRW3JRaV0sIHJRW3JRaSArIDFdLCByUVtyUWkgKyAyXSwgclFbclFpICsgM11dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgclFpICs9IHRoaXMuX2ZiX0JwcDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkuc3RhcnRUaWxlKHgsIHksIHcsIGgsIHRoaXMuX0ZCVS5iYWNrZ3JvdW5kKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX0ZCVS5zdWJlbmNvZGluZyAmIDB4MDgpIHsgIC8vIEFueVN1YnJlY3RzXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJyZWN0cyA9IHJRW3JRaV07XG4gICAgICAgICAgICAgICAgICAgICAgICByUWkrKztcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCBzdWJyZWN0czsgcysrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9GQlUuc3ViZW5jb2RpbmcgJiAweDEwKSB7ICAvLyBTdWJyZWN0c0NvbG91cmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9mYl9CcHAgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gclFbclFpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIF9mYl9CcHAgaXMgNFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBbclFbclFpXSwgclFbclFpICsgMV0sIHJRW3JRaSArIDJdLCByUVtyUWkgKyAzXV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgclFpICs9IHRoaXMuX2ZiX0JwcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IHRoaXMuX0ZCVS5mb3JlZ3JvdW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeHkgPSByUVtyUWldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJRaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzeCA9ICh4eSA+PiA0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3kgPSAoeHkgJiAweDBmKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3aCA9IHJRW3JRaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgclFpKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN3ID0gKHdoID4+IDQpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2ggPSAod2ggJiAweDBmKSArIDE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5LnN1YlRpbGUoc3gsIHN5LCBzdywgc2gsIGNvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5LmZpbmlzaFRpbGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fc29jay5zZXRfclFpKHJRaSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fRkJVLmxhc3RzdWJlbmNvZGluZyA9IHRoaXMuX0ZCVS5zdWJlbmNvZGluZztcbiAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSAwO1xuICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS50aWxlcy0tO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5fRkJVLnRpbGVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fRkJVLnJlY3RzLS07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldFRpZ2h0Q0xlbmd0aDogZnVuY3Rpb24gKGFycikge1xuICAgICAgICAgICAgdmFyIGhlYWRlciA9IDEsIGRhdGEgPSAwO1xuICAgICAgICAgICAgZGF0YSArPSBhcnJbMF0gJiAweDdmO1xuICAgICAgICAgICAgaWYgKGFyclswXSAmIDB4ODApIHtcbiAgICAgICAgICAgICAgICBoZWFkZXIrKztcbiAgICAgICAgICAgICAgICBkYXRhICs9IChhcnJbMV0gJiAweDdmKSA8PCA3O1xuICAgICAgICAgICAgICAgIGlmIChhcnJbMV0gJiAweDgwKSB7XG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcisrO1xuICAgICAgICAgICAgICAgICAgICBkYXRhICs9IGFyclsyXSA8PCAxNDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW2hlYWRlciwgZGF0YV07XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGlzcGxheV90aWdodDogZnVuY3Rpb24gKGlzVGlnaHRQTkcpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9mYl9kZXB0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZhaWwoXCJJbnRlcm5hbCBlcnJvclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJUaWdodCBwcm90b2NvbCBoYW5kbGVyIG9ubHkgaW1wbGVtZW50cyBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBcInRydWUgY29sb3IgbW9kZVwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzID0gMTsgIC8vIGNvbXByZXNzaW9uLWNvbnRyb2wgYnl0ZVxuICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwiVElHSFQgY29tcHJlc3Npb24tY29udHJvbFwiLCB0aGlzLl9GQlUuYnl0ZXMpKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgICAgICB2YXIgY2hlY2tzdW0gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIHZhciBzdW0gPSAwO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBzdW0gKz0gZGF0YVtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1bSA+IDY1NTM2KSBzdW0gLT0gNjU1MzY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzdW07XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB2YXIgcmVzZXRTdHJlYW1zID0gMDtcbiAgICAgICAgICAgIHZhciBzdHJlYW1JZCA9IC0xO1xuICAgICAgICAgICAgdmFyIGRlY29tcHJlc3MgPSBmdW5jdGlvbiAoZGF0YSwgZXhwZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJlc2V0U3RyZWFtcyA+PiBpKSAmIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS56bGlic1tpXS5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgVXRpbC5JbmZvKFwiUmVzZXQgemxpYiBzdHJlYW0gXCIgKyBpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vdmFyIHVuY29tcHJlc3NlZCA9IHRoaXMuX0ZCVS56bGlic1tzdHJlYW1JZF0udW5jb21wcmVzcyhkYXRhLCAwKTtcbiAgICAgICAgICAgICAgICB2YXIgdW5jb21wcmVzc2VkID0gdGhpcy5fRkJVLnpsaWJzW3N0cmVhbUlkXS5pbmZsYXRlKGRhdGEsIHRydWUsIGV4cGVjdGVkKTtcbiAgICAgICAgICAgICAgICAvKmlmICh1bmNvbXByZXNzZWQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIFV0aWwuRXJyb3IoXCJJbnZhbGlkIGRhdGEgaW4gemxpYiBzdHJlYW1cIik7XG4gICAgICAgICAgICAgICAgfSovXG5cbiAgICAgICAgICAgICAgICAvL3JldHVybiB1bmNvbXByZXNzZWQuZGF0YTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5jb21wcmVzc2VkO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpO1xuXG4gICAgICAgICAgICB2YXIgaW5kZXhlZFRvUkdCWDJDb2xvciA9IGZ1bmN0aW9uIChkYXRhLCBwYWxldHRlLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgLy8gQ29udmVydCBpbmRleGVkIChwYWxldHRlIGJhc2VkKSBpbWFnZSBkYXRhIHRvIFJHQlxuICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlZHVjZSBudW1iZXIgb2YgY2FsY3VsYXRpb25zIGluc2lkZSBsb29wXG4gICAgICAgICAgICAgICAgdmFyIGRlc3QgPSB0aGlzLl9kZXN0QnVmZjtcbiAgICAgICAgICAgICAgICB2YXIgdyA9IE1hdGguZmxvb3IoKHdpZHRoICsgNykgLyA4KTtcbiAgICAgICAgICAgICAgICB2YXIgdzEgPSBNYXRoLmZsb29yKHdpZHRoIC8gOCk7XG5cbiAgICAgICAgICAgICAgICAvKmZvciAodmFyIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGIsIHgsIGRwLCBzcDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHlvZmZzZXQgPSB5ICogd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIHZhciB5Yml0b2Zmc2V0ID0geSAqIHc7XG4gICAgICAgICAgICAgICAgICAgIHZhciB4b2Zmc2V0LCB0YXJnZXRieXRlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzE7IHgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgeG9mZnNldCA9IHlvZmZzZXQgKyB4ICogODtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldGJ5dGUgPSBkYXRhW3liaXRvZmZzZXQgKyB4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYiA9IDc7IGIgPj0gMDsgYi0tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHAgPSAoeG9mZnNldCArIDcgLSBiKSAqIDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3AgPSAodGFyZ2V0Ynl0ZSA+PiBiICYgMSkgKiAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbZHBdID0gcGFsZXR0ZVtzcF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtkcCArIDFdID0gcGFsZXR0ZVtzcCArIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbZHAgKyAyXSA9IHBhbGV0dGVbc3AgKyAyXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHhvZmZzZXQgPSB5b2Zmc2V0ICsgeCAqIDg7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldGJ5dGUgPSBkYXRhW3liaXRvZmZzZXQgKyB4XTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChiID0gNzsgYiA+PSA4IC0gd2lkdGggJSA4OyBiLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRwID0gKHhvZmZzZXQgKyA3IC0gYikgKiAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3AgPSAodGFyZ2V0Ynl0ZSA+PiBiICYgMSkgKiAzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtkcF0gPSBwYWxldHRlW3NwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbZHAgKyAxXSA9IHBhbGV0dGVbc3AgKyAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbZHAgKyAyXSA9IHBhbGV0dGVbc3AgKyAyXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0qL1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYiwgeCwgZHAsIHNwO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzE7IHgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChiID0gNzsgYiA+PSAwOyBiLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcCA9ICh5ICogd2lkdGggKyB4ICogOCArIDcgLSBiKSAqIDQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3AgPSAoZGF0YVt5ICogdyArIHhdID4+IGIgJiAxKSAqIDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtkcF0gPSBwYWxldHRlW3NwXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2RwICsgMV0gPSBwYWxldHRlW3NwICsgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtkcCArIDJdID0gcGFsZXR0ZVtzcCArIDJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbZHAgKyAzXSA9IDI1NTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoYiA9IDc7IGIgPj0gOCAtIHdpZHRoICUgODsgYi0tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkcCA9ICh5ICogd2lkdGggKyB4ICogOCArIDcgLSBiKSAqIDQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBzcCA9IChkYXRhW3kgKiB3ICsgeF0gPj4gYiAmIDEpICogMztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbZHBdID0gcGFsZXR0ZVtzcF07XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2RwICsgMV0gPSBwYWxldHRlW3NwICsgMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2RwICsgMl0gPSBwYWxldHRlW3NwICsgMl07XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2RwICsgM10gPSAyNTU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGVzdDtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKTtcblxuICAgICAgICAgICAgdmFyIGluZGV4ZWRUb1JHQlggPSBmdW5jdGlvbiAoZGF0YSwgcGFsZXR0ZSwgd2lkdGgsIGhlaWdodCkge1xuICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgaW5kZXhlZCAocGFsZXR0ZSBiYXNlZCkgaW1hZ2UgZGF0YSB0byBSR0JcbiAgICAgICAgICAgICAgICB2YXIgZGVzdCA9IHRoaXMuX2Rlc3RCdWZmO1xuICAgICAgICAgICAgICAgIHZhciB0b3RhbCA9IHdpZHRoICogaGVpZ2h0ICogNDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IDA7IGkgPCB0b3RhbDsgaSArPSA0LCBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNwID0gZGF0YVtqXSAqIDM7XG4gICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBwYWxldHRlW3NwXTtcbiAgICAgICAgICAgICAgICAgICAgZGVzdFtpICsgMV0gPSBwYWxldHRlW3NwICsgMV07XG4gICAgICAgICAgICAgICAgICAgIGRlc3RbaSArIDJdID0gcGFsZXR0ZVtzcCArIDJdO1xuICAgICAgICAgICAgICAgICAgICBkZXN0W2kgKyAzXSA9IDI1NTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGVzdDtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKTtcblxuICAgICAgICAgICAgdmFyIHJRaSA9IHRoaXMuX3NvY2suZ2V0X3JRaSgpO1xuICAgICAgICAgICAgdmFyIHJRID0gdGhpcy5fc29jay5yUXdob2xlKCk7XG4gICAgICAgICAgICB2YXIgY21vZGUsIGRhdGE7XG4gICAgICAgICAgICB2YXIgY2xfaGVhZGVyLCBjbF9kYXRhO1xuXG4gICAgICAgICAgICB2YXIgaGFuZGxlUGFsZXR0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgbnVtQ29sb3JzID0gclFbclFpICsgMl0gKyAxO1xuICAgICAgICAgICAgICAgIHZhciBwYWxldHRlU2l6ZSA9IG51bUNvbG9ycyAqIHRoaXMuX2ZiX2RlcHRoO1xuICAgICAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyArPSBwYWxldHRlU2l6ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJUSUdIVCBwYWxldHRlIFwiICsgY21vZGUsIHRoaXMuX0ZCVS5ieXRlcykpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgICAgICAgICAgICAgICB2YXIgYnBwID0gKG51bUNvbG9ycyA8PSAyKSA/IDEgOiA4O1xuICAgICAgICAgICAgICAgIHZhciByb3dTaXplID0gTWF0aC5mbG9vcigodGhpcy5fRkJVLndpZHRoICogYnBwICsgNykgLyA4KTtcbiAgICAgICAgICAgICAgICB2YXIgcmF3ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgaWYgKHJvd1NpemUgKiB0aGlzLl9GQlUuaGVpZ2h0IDwgMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmF3ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY2xfaGVhZGVyID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY2xfZGF0YSA9IHJvd1NpemUgKiB0aGlzLl9GQlUuaGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICAvL2NsZW5ndGggPSBbMCwgcm93U2l6ZSAqIHRoaXMuX0ZCVS5oZWlnaHRdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJlZ2luIGlubGluZSBnZXRUaWdodENMZW5ndGggKHJldHVybmluZyB0d28taXRlbSBhcnJheXMgaXMgYmFkIGZvciBwZXJmb3JtYW5jZSB3aXRoIEdDKVxuICAgICAgICAgICAgICAgICAgICB2YXIgY2xfb2Zmc2V0ID0gclFpICsgMyArIHBhbGV0dGVTaXplO1xuICAgICAgICAgICAgICAgICAgICBjbF9oZWFkZXIgPSAxO1xuICAgICAgICAgICAgICAgICAgICBjbF9kYXRhID0gMDtcbiAgICAgICAgICAgICAgICAgICAgY2xfZGF0YSArPSByUVtjbF9vZmZzZXRdICYgMHg3ZjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJRW2NsX29mZnNldF0gJiAweDgwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbF9oZWFkZXIrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsX2RhdGEgKz0gKHJRW2NsX29mZnNldCArIDFdICYgMHg3ZikgPDwgNztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyUVtjbF9vZmZzZXQgKyAxXSAmIDB4ODApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9oZWFkZXIrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9kYXRhICs9IHJRW2NsX29mZnNldCArIDJdIDw8IDE0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGVuZCBpbmxpbmUgZ2V0VGlnaHRDTGVuZ3RoXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzICs9IGNsX2hlYWRlciArIGNsX2RhdGE7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwiVElHSFQgXCIgKyBjbW9kZSwgdGhpcy5fRkJVLmJ5dGVzKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgICAgICAgICAgICAgIC8vIFNoaWZ0IGN0bCwgZmlsdGVyIGlkLCBudW0gY29sb3JzLCBwYWxldHRlIGVudHJpZXMsIGFuZCBjbGVuZ3RoIG9mZlxuICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoMyk7XG4gICAgICAgICAgICAgICAgLy92YXIgcGFsZXR0ZSA9IHRoaXMuX3NvY2suclFzaGlmdEJ5dGVzKHBhbGV0dGVTaXplKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zb2NrLnJRc2hpZnRUbyh0aGlzLl9wYWxldHRlQnVmZiwgcGFsZXR0ZVNpemUpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoY2xfaGVhZGVyKTtcblxuICAgICAgICAgICAgICAgIGlmIChyYXcpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuX3NvY2suclFzaGlmdEJ5dGVzKGNsX2RhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZWNvbXByZXNzKHRoaXMuX3NvY2suclFzaGlmdEJ5dGVzKGNsX2RhdGEpLCByb3dTaXplICogdGhpcy5fRkJVLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ29udmVydCBpbmRleGVkIChwYWxldHRlIGJhc2VkKSBpbWFnZSBkYXRhIHRvIFJHQlxuICAgICAgICAgICAgICAgIHZhciByZ2J4O1xuICAgICAgICAgICAgICAgIGlmIChudW1Db2xvcnMgPT0gMikge1xuICAgICAgICAgICAgICAgICAgICByZ2J4ID0gaW5kZXhlZFRvUkdCWDJDb2xvcihkYXRhLCB0aGlzLl9wYWxldHRlQnVmZiwgdGhpcy5fRkJVLndpZHRoLCB0aGlzLl9GQlUuaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlzcGxheS5ibGl0UmdieEltYWdlKHRoaXMuX0ZCVS54LCB0aGlzLl9GQlUueSwgdGhpcy5fRkJVLndpZHRoLCB0aGlzLl9GQlUuaGVpZ2h0LCByZ2J4LCAwLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmdieCA9IGluZGV4ZWRUb1JHQlgoZGF0YSwgdGhpcy5fcGFsZXR0ZUJ1ZmYsIHRoaXMuX0ZCVS53aWR0aCwgdGhpcy5fRkJVLmhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkuYmxpdFJnYnhJbWFnZSh0aGlzLl9GQlUueCwgdGhpcy5fRkJVLnksIHRoaXMuX0ZCVS53aWR0aCwgdGhpcy5fRkJVLmhlaWdodCwgcmdieCwgMCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LmJpbmQodGhpcyk7XG5cbiAgICAgICAgICAgIHZhciBoYW5kbGVDb3B5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHZhciByYXcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB2YXIgdW5jb21wcmVzc2VkU2l6ZSA9IHRoaXMuX0ZCVS53aWR0aCAqIHRoaXMuX0ZCVS5oZWlnaHQgKiB0aGlzLl9mYl9kZXB0aDtcbiAgICAgICAgICAgICAgICBpZiAodW5jb21wcmVzc2VkU2l6ZSA8IDEyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJhdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNsX2hlYWRlciA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNsX2RhdGEgPSB1bmNvbXByZXNzZWRTaXplO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJlZ2luIGlubGluZSBnZXRUaWdodENMZW5ndGggKHJldHVybmluZyB0d28taXRlbSBhcnJheXMgaXMgZm9yIHBlZm9ybWFuY2Ugd2l0aCBHQylcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNsX29mZnNldCA9IHJRaSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGNsX2hlYWRlciA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNsX2RhdGEgPSAwO1xuICAgICAgICAgICAgICAgICAgICBjbF9kYXRhICs9IHJRW2NsX29mZnNldF0gJiAweDdmO1xuICAgICAgICAgICAgICAgICAgICBpZiAoclFbY2xfb2Zmc2V0XSAmIDB4ODApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsX2hlYWRlcisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xfZGF0YSArPSAoclFbY2xfb2Zmc2V0ICsgMV0gJiAweDdmKSA8PCA3O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJRW2NsX29mZnNldCArIDFdICYgMHg4MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2hlYWRlcisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2RhdGEgKz0gclFbY2xfb2Zmc2V0ICsgMl0gPDwgMTQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gZW5kIGlubGluZSBnZXRUaWdodENMZW5ndGhcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzID0gMSArIGNsX2hlYWRlciArIGNsX2RhdGE7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwiVElHSFQgXCIgKyBjbW9kZSwgdGhpcy5fRkJVLmJ5dGVzKSkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgICAgICAgICAgICAgIC8vIFNoaWZ0IGN0bCwgY2xlbmd0aCBvZmZcbiAgICAgICAgICAgICAgICB0aGlzLl9zb2NrLnJRc2hpZnRCeXRlcygxICsgY2xfaGVhZGVyKTtcblxuICAgICAgICAgICAgICAgIGlmIChyYXcpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuX3NvY2suclFzaGlmdEJ5dGVzKGNsX2RhdGEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZWNvbXByZXNzKHRoaXMuX3NvY2suclFzaGlmdEJ5dGVzKGNsX2RhdGEpLCB1bmNvbXByZXNzZWRTaXplKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5LmJsaXRSZ2JJbWFnZSh0aGlzLl9GQlUueCwgdGhpcy5fRkJVLnksIHRoaXMuX0ZCVS53aWR0aCwgdGhpcy5fRkJVLmhlaWdodCwgZGF0YSwgMCwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9LmJpbmQodGhpcyk7XG5cbiAgICAgICAgICAgIHZhciBjdGwgPSB0aGlzLl9zb2NrLnJRcGVlazgoKTtcblxuICAgICAgICAgICAgLy8gS2VlcCB0aWdodCByZXNldCBiaXRzXG4gICAgICAgICAgICByZXNldFN0cmVhbXMgPSBjdGwgJiAweEY7XG5cbiAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgZmlsdGVyXG4gICAgICAgICAgICBjdGwgPSBjdGwgPj4gNDtcbiAgICAgICAgICAgIHN0cmVhbUlkID0gY3RsICYgMHgzO1xuXG4gICAgICAgICAgICBpZiAoY3RsID09PSAweDA4KSAgICAgICBjbW9kZSA9IFwiZmlsbFwiO1xuICAgICAgICAgICAgZWxzZSBpZiAoY3RsID09PSAweDA5KSAgY21vZGUgPSBcImpwZWdcIjtcbiAgICAgICAgICAgIGVsc2UgaWYgKGN0bCA9PT0gMHgwQSkgIGNtb2RlID0gXCJwbmdcIjtcbiAgICAgICAgICAgIGVsc2UgaWYgKGN0bCAmIDB4MDQpICAgIGNtb2RlID0gXCJmaWx0ZXJcIjtcbiAgICAgICAgICAgIGVsc2UgaWYgKGN0bCA8IDB4MDQpICAgIGNtb2RlID0gXCJjb3B5XCI7XG4gICAgICAgICAgICBlbHNlIHJldHVybiB0aGlzLl9mYWlsKFwiVW5leHBlY3RlZCBzZXJ2ZXIgbWVzc2FnZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIklsbGVnYWwgdGlnaHQgY29tcHJlc3Npb24gcmVjZWl2ZWQsIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjdGw6IFwiICsgY3RsKTtcblxuICAgICAgICAgICAgaWYgKGlzVGlnaHRQTkcgJiYgKGNtb2RlID09PSBcImZpbHRlclwiIHx8IGNtb2RlID09PSBcImNvcHlcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmFpbChcIlVuZXhwZWN0ZWQgc2VydmVyIG1lc3NhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImZpbHRlci9jb3B5IHJlY2VpdmVkIGluIHRpZ2h0UE5HIG1vZGVcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAoY21vZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBmaWxsIHVzZSBmYl9kZXB0aCBiZWNhdXNlIFRQSVhFTHMgZHJvcCB0aGUgcGFkZGluZyBieXRlXG4gICAgICAgICAgICAgICAgY2FzZSBcImZpbGxcIjogIC8vIFRQSVhFTFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgKz0gdGhpcy5fZmJfZGVwdGg7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJqcGVnXCI6ICAvLyBtYXggY2xlbmd0aFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgKz0gMztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInBuZ1wiOiAgLy8gbWF4IGNsZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzICs9IDM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJmaWx0ZXJcIjogIC8vIGZpbHRlciBpZCArIG51bSBjb2xvcnMgaWYgcGFsZXR0ZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNvcHlcIjpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdChcIlRJR0hUIFwiICsgY21vZGUsIHRoaXMuX0ZCVS5ieXRlcykpIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgICAgICAgICAgIC8vIERldGVybWluZSBGQlUuYnl0ZXNcbiAgICAgICAgICAgIHN3aXRjaCAoY21vZGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwiZmlsbFwiOlxuICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGN0bCBieXRlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXkuZmlsbFJlY3QodGhpcy5fRkJVLngsIHRoaXMuX0ZCVS55LCB0aGlzLl9GQlUud2lkdGgsIHRoaXMuX0ZCVS5oZWlnaHQsIFtyUVtyUWkgKyAzXSwgclFbclFpICsgMl0sIHJRW3JRaSArIDFdXSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb2NrLnJRc2tpcEJ5dGVzKDQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwicG5nXCI6XG4gICAgICAgICAgICAgICAgY2FzZSBcImpwZWdcIjpcbiAgICAgICAgICAgICAgICAgICAgLy8gYmVnaW4gaW5saW5lIGdldFRpZ2h0Q0xlbmd0aCAocmV0dXJuaW5nIHR3by1pdGVtIGFycmF5cyBpcyBmb3IgcGVmb3JtYW5jZSB3aXRoIEdDKVxuICAgICAgICAgICAgICAgICAgICB2YXIgY2xfb2Zmc2V0ID0gclFpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgY2xfaGVhZGVyID0gMTtcbiAgICAgICAgICAgICAgICAgICAgY2xfZGF0YSA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNsX2RhdGEgKz0gclFbY2xfb2Zmc2V0XSAmIDB4N2Y7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyUVtjbF9vZmZzZXRdICYgMHg4MCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xfaGVhZGVyKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbF9kYXRhICs9IChyUVtjbF9vZmZzZXQgKyAxXSAmIDB4N2YpIDw8IDc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoclFbY2xfb2Zmc2V0ICsgMV0gJiAweDgwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfaGVhZGVyKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfZGF0YSArPSByUVtjbF9vZmZzZXQgKyAyXSA8PCAxNDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBlbmQgaW5saW5lIGdldFRpZ2h0Q0xlbmd0aFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSAxICsgY2xfaGVhZGVyICsgY2xfZGF0YTsgIC8vIGN0bCArIGNsZW5ndGggc2l6ZSArIGpwZWctZGF0YVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc29jay5yUXdhaXQoXCJUSUdIVCBcIiArIGNtb2RlLCB0aGlzLl9GQlUuYnl0ZXMpKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgZXZlcnl0aGluZywgcmVuZGVyIGl0XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoMSArIGNsX2hlYWRlcik7ICAvLyBzaGlmdCBvZmYgY2x0ICsgY29tcGFjdCBsZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuX3NvY2suclFzaGlmdEJ5dGVzKGNsX2RhdGEpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNwbGF5LmltYWdlUmVjdCh0aGlzLl9GQlUueCwgdGhpcy5fRkJVLnksIFwiaW1hZ2UvXCIgKyBjbW9kZSwgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJmaWx0ZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbHRlcklkID0gclFbclFpICsgMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJJZCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYW5kbGVQYWxldHRlKCkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgMCwgQ29weSBjb3VsZCBiZSB2YWxpZCBoZXJlLCBidXQgc2VydmVycyBkb24ndCBzZW5kIGl0IGFzIGFuIGV4cGxpY2l0IGZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsdGVyIDIsIEdyYWRpZW50IGlzIHZhbGlkIGJ1dCBub3QgdXNlIGlmIGpwZWcgaXMgZW5hYmxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmFpbChcIlVuZXhwZWN0ZWQgc2VydmVyIG1lc3NhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVbnN1cHBvcnRlZCB0aWdodCBzdWJlbmNvZGluZyByZWNlaXZlZCwgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImZpbHRlcjogXCIgKyBmaWx0ZXJJZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImNvcHlcIjpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYW5kbGVDb3B5KCkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIHRoaXMuX0ZCVS5ieXRlcyA9IDA7XG4gICAgICAgICAgICB0aGlzLl9GQlUucmVjdHMtLTtcblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgVElHSFQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2VuY0hhbmRsZXJzLmRpc3BsYXlfdGlnaHQoZmFsc2UpOyB9LFxuICAgICAgICBUSUdIVF9QTkc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2VuY0hhbmRsZXJzLmRpc3BsYXlfdGlnaHQodHJ1ZSk7IH0sXG5cbiAgICAgICAgbGFzdF9yZWN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9GQlUucmVjdHMgPSAwO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaGFuZGxlX0ZCX3Jlc2l6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5fZmJfd2lkdGggPSB0aGlzLl9GQlUud2lkdGg7XG4gICAgICAgICAgICB0aGlzLl9mYl9oZWlnaHQgPSB0aGlzLl9GQlUuaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5fZGVzdEJ1ZmYgPSBuZXcgVWludDhBcnJheSh0aGlzLl9mYl93aWR0aCAqIHRoaXMuX2ZiX2hlaWdodCAqIDQpO1xuICAgICAgICAgICAgdGhpcy5fZGlzcGxheS5yZXNpemUodGhpcy5fZmJfd2lkdGgsIHRoaXMuX2ZiX2hlaWdodCk7XG4gICAgICAgICAgICB0aGlzLl9vbkZCUmVzaXplKHRoaXMsIHRoaXMuX2ZiX3dpZHRoLCB0aGlzLl9mYl9oZWlnaHQpO1xuICAgICAgICAgICAgdGhpcy5fdGltaW5nLmZidV9ydF9zdGFydCA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICB0aGlzLl91cGRhdGVDb250aW51b3VzVXBkYXRlcygpO1xuXG4gICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSAwO1xuICAgICAgICAgICAgdGhpcy5fRkJVLnJlY3RzIC09IDE7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBFeHRlbmRlZERlc2t0b3BTaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSAxO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwiRXh0ZW5kZWREZXNrdG9wU2l6ZVwiLCB0aGlzLl9GQlUuYnl0ZXMpKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgICAgICB0aGlzLl9zdXBwb3J0c1NldERlc2t0b3BTaXplID0gdHJ1ZTtcbiAgICAgICAgICAgIHZhciBudW1iZXJfb2Zfc2NyZWVucyA9IHRoaXMuX3NvY2suclFwZWVrOCgpO1xuXG4gICAgICAgICAgICB0aGlzLl9GQlUuYnl0ZXMgPSA0ICsgKG51bWJlcl9vZl9zY3JlZW5zICogMTYpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3NvY2suclF3YWl0KFwiRXh0ZW5kZWREZXNrdG9wU2l6ZVwiLCB0aGlzLl9GQlUuYnl0ZXMpKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgICAgICB0aGlzLl9zb2NrLnJRc2tpcEJ5dGVzKDEpOyAgLy8gbnVtYmVyLW9mLXNjcmVlbnNcbiAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoMyk7ICAvLyBwYWRkaW5nXG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtYmVyX29mX3NjcmVlbnM7IGkgKz0gMSkge1xuICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIGlkIGFuZCBmbGFncyBvZiB0aGUgZmlyc3Qgc2NyZWVuXG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2NyZWVuX2lkID0gdGhpcy5fc29jay5yUXNoaWZ0Qnl0ZXMoNCk7ICAgIC8vIGlkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoMik7ICAgICAgICAgICAgICAgICAgICAgICAvLyB4LXBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoMik7ICAgICAgICAgICAgICAgICAgICAgICAvLyB5LXBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoMik7ICAgICAgICAgICAgICAgICAgICAgICAvLyB3aWR0aFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zb2NrLnJRc2tpcEJ5dGVzKDIpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gaGVpZ2h0XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NjcmVlbl9mbGFncyA9IHRoaXMuX3NvY2suclFzaGlmdEJ5dGVzKDQpOyAvLyBmbGFnc1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NvY2suclFza2lwQnl0ZXMoMTYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAqIFRoZSB4LXBvc2l0aW9uIGluZGljYXRlcyB0aGUgcmVhc29uIGZvciB0aGUgY2hhbmdlOlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqICAwIC0gc2VydmVyIHJlc2l6ZWQgb24gaXRzIG93blxuICAgICAgICAgICAgICogIDEgLSB0aGlzIGNsaWVudCByZXF1ZXN0ZWQgdGhlIHJlc2l6ZVxuICAgICAgICAgICAgICogIDIgLSBhbm90aGVyIGNsaWVudCByZXF1ZXN0ZWQgdGhlIHJlc2l6ZVxuICAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gaGFuZGxlIGVycm9ycyB3aGVuIHdlIHJlcXVlc3RlZCB0aGUgcmVzaXplLlxuICAgICAgICAgICAgaWYgKHRoaXMuX0ZCVS54ID09PSAxICYmIHRoaXMuX0ZCVS55ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1zZyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHktcG9zaXRpb24gaW5kaWNhdGVzIHRoZSBzdGF0dXMgY29kZSBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX0ZCVS55KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtc2cgPSBcIlJlc2l6ZSBpcyBhZG1pbmlzdHJhdGl2ZWx5IHByb2hpYml0ZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBtc2cgPSBcIk91dCBvZiByZXNvdXJjZXNcIjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBtc2cgPSBcIkludmFsaWQgc2NyZWVuIGxheW91dFwiO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBtc2cgPSBcIlVua25vd24gcmVhc29uXCI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZmljYXRpb24oXCJTZXJ2ZXIgZGlkIG5vdCBhY2NlcHQgdGhlIHJlc2l6ZSByZXF1ZXN0OiBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1zZywgJ25vcm1hbCcpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl9lbmNIYW5kbGVycy5oYW5kbGVfRkJfcmVzaXplKCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBEZXNrdG9wU2l6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5fZW5jSGFuZGxlcnMuaGFuZGxlX0ZCX3Jlc2l6ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgQ3Vyc29yOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBVdGlsLkRlYnVnKFwiPj4gc2V0X2N1cnNvclwiKTtcbiAgICAgICAgICAgIHZhciB4ID0gdGhpcy5fRkJVLng7ICAvLyBob3RzcG90LXhcbiAgICAgICAgICAgIHZhciB5ID0gdGhpcy5fRkJVLnk7ICAvLyBob3RzcG90LXlcbiAgICAgICAgICAgIHZhciB3ID0gdGhpcy5fRkJVLndpZHRoO1xuICAgICAgICAgICAgdmFyIGggPSB0aGlzLl9GQlUuaGVpZ2h0O1xuXG4gICAgICAgICAgICB2YXIgcGl4ZWxzbGVuZ3RoID0gdyAqIGggKiB0aGlzLl9mYl9CcHA7XG4gICAgICAgICAgICB2YXIgbWFza2xlbmd0aCA9IE1hdGguZmxvb3IoKHcgKyA3KSAvIDgpICogaDtcblxuICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzID0gcGl4ZWxzbGVuZ3RoICsgbWFza2xlbmd0aDtcbiAgICAgICAgICAgIGlmICh0aGlzLl9zb2NrLnJRd2FpdChcImN1cnNvciBlbmNvZGluZ1wiLCB0aGlzLl9GQlUuYnl0ZXMpKSB7IHJldHVybiBmYWxzZTsgfVxuXG4gICAgICAgICAgICB0aGlzLl9kaXNwbGF5LmNoYW5nZUN1cnNvcih0aGlzLl9zb2NrLnJRc2hpZnRCeXRlcyhwaXhlbHNsZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc29jay5yUXNoaWZ0Qnl0ZXMobWFza2xlbmd0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCB3LCBoKTtcblxuICAgICAgICAgICAgdGhpcy5fRkJVLmJ5dGVzID0gMDtcbiAgICAgICAgICAgIHRoaXMuX0ZCVS5yZWN0cy0tO1xuXG4gICAgICAgICAgICBVdGlsLkRlYnVnKFwiPDwgc2V0X2N1cnNvclwiKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuXG4gICAgICAgIFFFTVVFeHRlbmRlZEtleUV2ZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLl9GQlUucmVjdHMtLTtcblxuICAgICAgICAgICAgdmFyIGtleWJvYXJkRXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudChcImtleWJvYXJkRXZlbnRcIik7XG4gICAgICAgICAgICBpZiAoa2V5Ym9hcmRFdmVudC5jb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9xZW11RXh0S2V5RXZlbnRTdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX2tleWJvYXJkLnNldFFFTVVWTkNLZXlib2FyZEhhbmRsZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBKUEVHX3F1YWxpdHlfbG86IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIFV0aWwuRXJyb3IoXCJTZXJ2ZXIgc2VudCBqcGVnX3F1YWxpdHkgcHNldWRvLWVuY29kaW5nXCIpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXByZXNzX2xvOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBVdGlsLkVycm9yKFwiU2VydmVyIHNlbnQgY29tcHJlc3MgbGV2ZWwgcHNldWRvLWVuY29kaW5nXCIpO1xuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG4iLCIvKlxuICogbm9WTkM6IEhUTUw1IFZOQyBjbGllbnRcbiAqIENvcHlyaWdodCAoQykgMjAxMiBKb2VsIE1hcnRpblxuICogTGljZW5zZWQgdW5kZXIgTVBMIDIuMCAoc2VlIExJQ0VOU0UudHh0KVxuICpcbiAqIFNlZSBSRUFETUUubWQgZm9yIHVzYWdlIGFuZCBpbnRlZ3JhdGlvbiBpbnN0cnVjdGlvbnMuXG4gKi9cblxuLyoganNoaW50IHdoaXRlOiBmYWxzZSwgbm9uc3RhbmRhcmQ6IHRydWUgKi9cbi8qZ2xvYmFsIHdpbmRvdywgY29uc29sZSwgZG9jdW1lbnQsIG5hdmlnYXRvciwgQWN0aXZlWE9iamVjdCwgSU5DTFVERV9VUkkgKi9cblxudmFyIFV0aWwgPSB7fTtcblxuLypcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogTmFtZXNwYWNlZCBpbiBVdGlsXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG4vKlxuICogTG9nZ2luZy9kZWJ1ZyByb3V0aW5lc1xuICovXG5cblV0aWwuX2xvZ19sZXZlbCA9ICd3YXJuJztcblV0aWwuaW5pdF9sb2dnaW5nID0gZnVuY3Rpb24gKGxldmVsKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgbGV2ZWwgPSBVdGlsLl9sb2dfbGV2ZWw7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgVXRpbC5fbG9nX2xldmVsID0gbGV2ZWw7XG4gICAgfVxuXG4gICAgVXRpbC5EZWJ1ZyA9IFV0aWwuSW5mbyA9IFV0aWwuV2FybiA9IFV0aWwuRXJyb3IgPSBmdW5jdGlvbiAobXNnKSB7fTtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5jb25zb2xlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIC8qIGpzaGludCAtVzA4NiAqL1xuICAgICAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICAgICAgICBjYXNlICdkZWJ1Zyc6XG4gICAgICAgICAgICAgICAgVXRpbC5EZWJ1ZyA9IGZ1bmN0aW9uIChtc2cpIHsgY29uc29sZS5sb2cobXNnKTsgfTtcbiAgICAgICAgICAgIGNhc2UgJ2luZm8nOlxuICAgICAgICAgICAgICAgIFV0aWwuSW5mbyAgPSBmdW5jdGlvbiAobXNnKSB7IGNvbnNvbGUuaW5mbyhtc2cpOyB9O1xuICAgICAgICAgICAgY2FzZSAnd2Fybic6XG4gICAgICAgICAgICAgICAgVXRpbC5XYXJuICA9IGZ1bmN0aW9uIChtc2cpIHsgY29uc29sZS53YXJuKG1zZyk7IH07XG4gICAgICAgICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgICAgICAgICAgVXRpbC5FcnJvciA9IGZ1bmN0aW9uIChtc2cpIHsgY29uc29sZS5lcnJvcihtc2cpOyB9O1xuICAgICAgICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgbG9nZ2luZyB0eXBlICdcIiArIGxldmVsICsgXCInXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8qIGpzaGludCArVzA4NiAqL1xuICAgIH1cbn07XG5VdGlsLmdldF9sb2dnaW5nID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBVdGlsLl9sb2dfbGV2ZWw7XG59O1xuLy8gSW5pdGlhbGl6ZSBsb2dnaW5nIGxldmVsXG5VdGlsLmluaXRfbG9nZ2luZygpO1xuXG5VdGlsLm1ha2VfcHJvcGVydHkgPSBmdW5jdGlvbiAocHJvdG8sIG5hbWUsIG1vZGUsIHR5cGUpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciBnZXR0ZXI7XG4gICAgaWYgKHR5cGUgPT09ICdhcnInKSB7XG4gICAgICAgIGdldHRlciA9IGZ1bmN0aW9uIChpZHgpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWR4ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzWydfJyArIG5hbWVdW2lkeF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzWydfJyArIG5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGdldHRlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzWydfJyArIG5hbWVdO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBtYWtlX3NldHRlciA9IGZ1bmN0aW9uIChwcm9jZXNzX3ZhbCkge1xuICAgICAgICBpZiAocHJvY2Vzc192YWwpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsLCBpZHgpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGlkeCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1snXycgKyBuYW1lXVtpZHhdID0gcHJvY2Vzc192YWwodmFsKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzWydfJyArIG5hbWVdID0gcHJvY2Vzc192YWwodmFsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWwsIGlkeCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaWR4ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzWydfJyArIG5hbWVdW2lkeF0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1snXycgKyBuYW1lXSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciBzZXR0ZXI7XG4gICAgaWYgKHR5cGUgPT09ICdib29sJykge1xuICAgICAgICBzZXR0ZXIgPSBtYWtlX3NldHRlcihmdW5jdGlvbiAodmFsKSB7XG4gICAgICAgICAgICBpZiAoIXZhbCB8fCAodmFsIGluIHsnMCc6IDEsICdubyc6IDEsICdmYWxzZSc6IDF9KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2ludCcpIHtcbiAgICAgICAgc2V0dGVyID0gbWFrZV9zZXR0ZXIoZnVuY3Rpb24gKHZhbCkgeyByZXR1cm4gcGFyc2VJbnQodmFsLCAxMCk7IH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2Zsb2F0Jykge1xuICAgICAgICBzZXR0ZXIgPSBtYWtlX3NldHRlcihwYXJzZUZsb2F0KTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdzdHInKSB7XG4gICAgICAgIHNldHRlciA9IG1ha2Vfc2V0dGVyKFN0cmluZyk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnZnVuYycpIHtcbiAgICAgICAgc2V0dGVyID0gbWFrZV9zZXR0ZXIoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgaWYgKCF2YWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge307XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2FycicgfHwgdHlwZSA9PT0gJ2RvbScgfHwgdHlwZSA9PSAncmF3Jykge1xuICAgICAgICBzZXR0ZXIgPSBtYWtlX3NldHRlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBwcm9wZXJ0eSB0eXBlICcgKyB0eXBlKTsgIC8vIHNvbWUgc2FuaXR5IGNoZWNraW5nXG4gICAgfVxuXG4gICAgLy8gc2V0IHRoZSBnZXR0ZXJcbiAgICBpZiAodHlwZW9mIHByb3RvWydnZXRfJyArIG5hbWVdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBwcm90b1snZ2V0XycgKyBuYW1lXSA9IGdldHRlcjtcbiAgICB9XG5cbiAgICAvLyBzZXQgdGhlIHNldHRlciBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIHByb3RvWydzZXRfJyArIG5hbWVdID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAobW9kZSA9PT0gJ3J3Jykge1xuICAgICAgICAgICAgcHJvdG9bJ3NldF8nICsgbmFtZV0gPSBzZXR0ZXI7XG4gICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ3dvJykge1xuICAgICAgICAgICAgcHJvdG9bJ3NldF8nICsgbmFtZV0gPSBmdW5jdGlvbiAodmFsLCBpZHgpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRoaXNbJ18nICsgbmFtZV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihuYW1lICsgXCIgY2FuIG9ubHkgYmUgc2V0IG9uY2VcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNldHRlci5jYWxsKHRoaXMsIHZhbCwgaWR4KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBtYWtlIGEgc3BlY2lhbCBzZXR0ZXIgdGhhdCB3ZSBjYW4gdXNlIGluIHNldCBkZWZhdWx0c1xuICAgIHByb3RvWydfcmF3X3NldF8nICsgbmFtZV0gPSBmdW5jdGlvbiAodmFsLCBpZHgpIHtcbiAgICAgICAgc2V0dGVyLmNhbGwodGhpcywgdmFsLCBpZHgpO1xuICAgICAgICAvL2RlbGV0ZSB0aGlzWydfaW5pdF9zZXRfJyArIG5hbWVdOyAgLy8gcmVtb3ZlIGl0IGFmdGVyIHVzZVxuICAgIH07XG59O1xuXG5VdGlsLm1ha2VfcHJvcGVydGllcyA9IGZ1bmN0aW9uIChjb25zdHJ1Y3RvciwgYXJyKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgVXRpbC5tYWtlX3Byb3BlcnR5KGNvbnN0cnVjdG9yLnByb3RvdHlwZSwgYXJyW2ldWzBdLCBhcnJbaV1bMV0sIGFycltpXVsyXSk7XG4gICAgfVxufTtcblxuVXRpbC5zZXRfZGVmYXVsdHMgPSBmdW5jdGlvbiAob2JqLCBjb25mLCBkZWZhdWx0cykge1xuICAgIHZhciBkZWZhdWx0c19rZXlzID0gT2JqZWN0LmtleXMoZGVmYXVsdHMpO1xuICAgIHZhciBjb25mX2tleXMgPSBPYmplY3Qua2V5cyhjb25mKTtcbiAgICB2YXIga2V5c19vYmogPSB7fTtcbiAgICB2YXIgaTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgZGVmYXVsdHNfa2V5cy5sZW5ndGg7IGkrKykgeyBrZXlzX29ialtkZWZhdWx0c19rZXlzW2ldXSA9IDE7IH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgY29uZl9rZXlzLmxlbmd0aDsgaSsrKSB7IGtleXNfb2JqW2NvbmZfa2V5c1tpXV0gPSAxOyB9XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhrZXlzX29iaik7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc2V0dGVyID0gb2JqWydfcmF3X3NldF8nICsga2V5c1tpXV07XG4gICAgICAgIGlmICghc2V0dGVyKSB7XG4gICAgICAgICAgVXRpbC5XYXJuKCdJbnZhbGlkIHByb3BlcnR5ICcgKyBrZXlzW2ldKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChrZXlzW2ldIGluIGNvbmYpIHtcbiAgICAgICAgICAgIHNldHRlci5jYWxsKG9iaiwgY29uZltrZXlzW2ldXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXR0ZXIuY2FsbChvYmosIGRlZmF1bHRzW2tleXNbaV1dKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbi8qXG4gKiBEZWNvZGUgZnJvbSBVVEYtOFxuICovXG5VdGlsLmRlY29kZVVURjggPSBmdW5jdGlvbiAodXRmOHN0cmluZykge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKHV0ZjhzdHJpbmcpKTtcbn07XG5cblxuXG4vKlxuICogQ3Jvc3MtYnJvd3NlciByb3V0aW5lc1xuICovXG5cblV0aWwuZ2V0UG9zaXRpb24gPSBmdW5jdGlvbihvYmopIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICAvLyBOQihzcm9zcyk6IHRoZSBNb3ppbGxhIGRldmVsb3BlciByZWZlcmVuY2Ugc2VlbXMgdG8gaW5kaWNhdGUgdGhhdFxuICAgIC8vIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBpbmNsdWRlcyBib3JkZXIgYW5kIHBhZGRpbmcsIHNvIHRoZSBjYW52YXNcbiAgICAvLyBzdHlsZSBzaG91bGQgTk9UIGluY2x1ZGUgZWl0aGVyLlxuICAgIHZhciBvYmpQb3NpdGlvbiA9IG9iai5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4geyd4Jzogb2JqUG9zaXRpb24ubGVmdCArIHdpbmRvdy5wYWdlWE9mZnNldCwgJ3knOiBvYmpQb3NpdGlvbi50b3AgKyB3aW5kb3cucGFnZVlPZmZzZXQsXG4gICAgICAgICAgICAnd2lkdGgnOiBvYmpQb3NpdGlvbi53aWR0aCwgJ2hlaWdodCc6IG9ialBvc2l0aW9uLmhlaWdodH07XG59O1xuXG5VdGlsLmdldFBvaW50ZXJFdmVudCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIGV2dDtcbiAgICBldnQgPSAoZSA/IGUgOiB3aW5kb3cuZXZlbnQpO1xuICAgIGV2dCA9IChldnQuY2hhbmdlZFRvdWNoZXMgPyBldnQuY2hhbmdlZFRvdWNoZXNbMF0gOiBldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0KTtcbiAgICByZXR1cm4gZXZ0O1xufTtcblxuLy8gR2V0IG1vdXNlIGV2ZW50IHBvc2l0aW9uIGluIERPTSBlbGVtZW50XG5VdGlsLmdldEV2ZW50UG9zaXRpb24gPSBmdW5jdGlvbiAoZSwgb2JqLCBzY2FsZSkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIHZhciBldnQsIGRvY1gsIGRvY1ksIHBvcztcbiAgICBldnQgPSBVdGlsLmdldFBvaW50ZXJFdmVudChlKTtcbiAgICBpZiAoZXZ0LnBhZ2VYIHx8IGV2dC5wYWdlWSkge1xuICAgICAgICBkb2NYID0gZXZ0LnBhZ2VYO1xuICAgICAgICBkb2NZID0gZXZ0LnBhZ2VZO1xuICAgIH0gZWxzZSBpZiAoZXZ0LmNsaWVudFggfHwgZXZ0LmNsaWVudFkpIHtcbiAgICAgICAgZG9jWCA9IGV2dC5jbGllbnRYICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0ICtcbiAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0O1xuICAgICAgICBkb2NZID0gZXZ0LmNsaWVudFkgKyBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCArXG4gICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgIH1cbiAgICBwb3MgPSBVdGlsLmdldFBvc2l0aW9uKG9iaik7XG4gICAgaWYgKHR5cGVvZiBzY2FsZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBzY2FsZSA9IDE7XG4gICAgfVxuICAgIHZhciByZWFseCA9IGRvY1ggLSBwb3MueDtcbiAgICB2YXIgcmVhbHkgPSBkb2NZIC0gcG9zLnk7XG4gICAgdmFyIHggPSBNYXRoLm1heChNYXRoLm1pbihyZWFseCwgcG9zLndpZHRoIC0gMSksIDApO1xuICAgIHZhciB5ID0gTWF0aC5tYXgoTWF0aC5taW4ocmVhbHksIHBvcy5oZWlnaHQgLSAxKSwgMCk7XG4gICAgcmV0dXJuIHsneCc6IHggLyBzY2FsZSwgJ3knOiB5IC8gc2NhbGUsICdyZWFseCc6IHJlYWx4IC8gc2NhbGUsICdyZWFseSc6IHJlYWx5IC8gc2NhbGV9O1xufTtcblxuVXRpbC5zdG9wRXZlbnQgPSBmdW5jdGlvbiAoZSkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xufTtcblxuLy8gVG91Y2ggZGV0ZWN0aW9uXG5VdGlsLmlzVG91Y2hEZXZpY2UgPSAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB8fFxuICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdXJpZWQgZm9yIENocm9tZSBkZWJ1Z2dlclxuICAgICAgICAgICAgICAgICAgICAgKGRvY3VtZW50Lm9udG91Y2hzdGFydCAhPT0gdW5kZWZpbmVkKSB8fFxuICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZWQgZm9yIE1TIFN1cmZhY2VcbiAgICAgICAgICAgICAgICAgICAgIChuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwKSB8fFxuICAgICAgICAgICAgICAgICAgICAgKG5hdmlnYXRvci5tc01heFRvdWNoUG9pbnRzID4gMCk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGZ1bmN0aW9uIG9uRmlyc3RUb3VjaCgpIHtcbiAgICBVdGlsLmlzVG91Y2hEZXZpY2UgPSB0cnVlO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25GaXJzdFRvdWNoLCBmYWxzZSk7XG59LCBmYWxzZSk7XG5cblV0aWwuX2N1cnNvcl91cmlzX3N1cHBvcnRlZCA9IG51bGw7XG5cblV0aWwuYnJvd3NlclN1cHBvcnRzQ3Vyc29yVVJJcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoVXRpbC5fY3Vyc29yX3VyaXNfc3VwcG9ydGVkID09PSBudWxsKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgICAgICB0YXJnZXQuc3R5bGUuY3Vyc29yID0gJ3VybChcImRhdGE6aW1hZ2UveC1pY29uO2Jhc2U2NCxBQUFDQUFFQUNBZ0FBQUlBQWdBNEFRQUFGZ0FBQUNnQUFBQUlBQUFBRUFBQUFBRUFJQUFBQUFBQUVBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vQUFBQUFBQUFBQUFBQUFBQUFBQUFBQT09XCIpIDIgMiwgZGVmYXVsdCc7XG5cbiAgICAgICAgICAgIGlmICh0YXJnZXQuc3R5bGUuY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgVXRpbC5JbmZvKFwiRGF0YSBVUkkgc2NoZW1lIGN1cnNvciBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICAgICAgVXRpbC5fY3Vyc29yX3VyaXNfc3VwcG9ydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgVXRpbC5XYXJuKFwiRGF0YSBVUkkgc2NoZW1lIGN1cnNvciBub3Qgc3VwcG9ydGVkXCIpO1xuICAgICAgICAgICAgICAgIFV0aWwuX2N1cnNvcl91cmlzX3N1cHBvcnRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChleGMpIHtcbiAgICAgICAgICAgIFV0aWwuRXJyb3IoXCJEYXRhIFVSSSBzY2hlbWUgY3Vyc29yIHRlc3QgZXhjZXB0aW9uOiBcIiArIGV4Yyk7XG4gICAgICAgICAgICBVdGlsLl9jdXJzb3JfdXJpc19zdXBwb3J0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBVdGlsLl9jdXJzb3JfdXJpc19zdXBwb3J0ZWQ7XG59O1xuXG4vLyBTZXQgYnJvd3NlciBlbmdpbmUgdmVyc2lvbnMuIEJhc2VkIG9uIG1vb3Rvb2xzLlxuVXRpbC5GZWF0dXJlcyA9IHt4cGF0aDogISEoZG9jdW1lbnQuZXZhbHVhdGUpLCBhaXI6ICEhKHdpbmRvdy5ydW50aW1lKSwgcXVlcnk6ICEhKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IpfTtcblxuKGZ1bmN0aW9uICgpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICAvLyAncHJlc3RvJzogKGZ1bmN0aW9uICgpIHsgcmV0dXJuICghd2luZG93Lm9wZXJhKSA/IGZhbHNlIDogdHJ1ZTsgfSgpKSxcbiAgICB2YXIgZGV0ZWN0UHJlc3RvID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gISF3aW5kb3cub3BlcmE7XG4gICAgfTtcblxuICAgIC8vICd0cmlkZW50JzogKGZ1bmN0aW9uICgpIHsgcmV0dXJuICghd2luZG93LkFjdGl2ZVhPYmplY3QpID8gZmFsc2UgOiAoKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCkgPyAoKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwpID8gNiA6IDUpIDogNCk7XG4gICAgdmFyIGRldGVjdFRyaWRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICghd2luZG93LkFjdGl2ZVhPYmplY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh3aW5kb3cuWE1MSHR0cFJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwpID8gNiA6IDU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiA0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vICd3ZWJraXQnOiAoZnVuY3Rpb24gKCkgeyB0cnkgeyByZXR1cm4gKG5hdmlnYXRvci50YWludEVuYWJsZWQpID8gZmFsc2UgOiAoKFV0aWwuRmVhdHVyZXMueHBhdGgpID8gKChVdGlsLkZlYXR1cmVzLnF1ZXJ5KSA/IDUyNSA6IDQyMCkgOiA0MTkpOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9KCkpLFxuICAgIHZhciBkZXRlY3RJbml0aWFsV2Via2l0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKG5hdmlnYXRvci50YWludEVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChVdGlsLkZlYXR1cmVzLnhwYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoVXRpbC5GZWF0dXJlcy5xdWVyeSkgPyA1MjUgOiA0MjA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQxOTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgZGV0ZWN0QWN0dWFsV2Via2l0ID0gZnVuY3Rpb24gKGluaXRpYWxfdmVyKSB7XG4gICAgICAgIHZhciByZSA9IC9XZWJLaXRcXC8oWzAtOVxcLl0qKSAvO1xuICAgICAgICB2YXIgc3RyX3ZlciA9IChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKHJlKSB8fCBbJycsIGluaXRpYWxfdmVyXSlbMV07XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHN0cl92ZXIsIDEwKTtcbiAgICB9O1xuXG4gICAgLy8gJ2dlY2tvJzogKGZ1bmN0aW9uICgpIHsgcmV0dXJuICghZG9jdW1lbnQuZ2V0Qm94T2JqZWN0Rm9yICYmIHdpbmRvdy5tb3pJbm5lclNjcmVlblggPT0gbnVsbCkgPyBmYWxzZSA6ICgoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSkgPyAxOXNzTmFtZSkgPyAxOSA6IDE4IDogMTgpOyB9KCkpXG4gICAgdmFyIGRldGVjdEdlY2tvID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAvKiBqc2hpbnQgLVcwNDEgKi9cbiAgICAgICAgaWYgKCFkb2N1bWVudC5nZXRCb3hPYmplY3RGb3IgJiYgd2luZG93Lm1veklubmVyU2NyZWVuWCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpID8gMTkgOiAxODtcbiAgICAgICAgfVxuICAgICAgICAvKiBqc2hpbnQgK1cwNDEgKi9cbiAgICB9O1xuXG4gICAgVXRpbC5FbmdpbmUgPSB7XG4gICAgICAgIC8vIFZlcnNpb24gZGV0ZWN0aW9uIGJyZWFrIGluIE9wZXJhIDExLjYwIChlcnJvcnMgb24gYXJndW1lbnRzLmNhbGxlZS5jYWxsZXIgcmVmZXJlbmNlKVxuICAgICAgICAvLydwcmVzdG8nOiAoZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuICghd2luZG93Lm9wZXJhKSA/IGZhbHNlIDogKChhcmd1bWVudHMuY2FsbGVlLmNhbGxlcikgPyA5NjAgOiAoKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUpID8gOTUwIDogOTI1KSk7IH0oKSksXG4gICAgICAgICdwcmVzdG8nOiBkZXRlY3RQcmVzdG8oKSxcbiAgICAgICAgJ3RyaWRlbnQnOiBkZXRlY3RUcmlkZW50KCksXG4gICAgICAgICd3ZWJraXQnOiBkZXRlY3RJbml0aWFsV2Via2l0KCksXG4gICAgICAgICdnZWNrbyc6IGRldGVjdEdlY2tvKClcbiAgICB9O1xuXG4gICAgaWYgKFV0aWwuRW5naW5lLndlYmtpdCkge1xuICAgICAgICAvLyBFeHRyYWN0IGFjdHVhbCB3ZWJraXQgdmVyc2lvbiBpZiBhdmFpbGFibGVcbiAgICAgICAgVXRpbC5FbmdpbmUud2Via2l0ID0gZGV0ZWN0QWN0dWFsV2Via2l0KFV0aWwuRW5naW5lLndlYmtpdCk7XG4gICAgfVxufSkoKTtcblxuVXRpbC5GbGFzaCA9IChmdW5jdGlvbiAoKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG4gICAgdmFyIHYsIHZlcnNpb247XG4gICAgdHJ5IHtcbiAgICAgICAgdiA9IG5hdmlnYXRvci5wbHVnaW5zWydTaG9ja3dhdmUgRmxhc2gnXS5kZXNjcmlwdGlvbjtcbiAgICB9IGNhdGNoIChlcnIxKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2ID0gbmV3IEFjdGl2ZVhPYmplY3QoJ1Nob2Nrd2F2ZUZsYXNoLlNob2Nrd2F2ZUZsYXNoJykuR2V0VmFyaWFibGUoJyR2ZXJzaW9uJyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjIpIHtcbiAgICAgICAgICAgIHYgPSAnMCByMCc7XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmVyc2lvbiA9IHYubWF0Y2goL1xcZCsvZyk7XG4gICAgcmV0dXJuIHt2ZXJzaW9uOiBwYXJzZUludCh2ZXJzaW9uWzBdIHx8IDAgKyAnLicgKyB2ZXJzaW9uWzFdLCAxMCkgfHwgMCwgYnVpbGQ6IHBhcnNlSW50KHZlcnNpb25bMl0sIDEwKSB8fCAwfTtcbn0oKSk7XG5cblxuVXRpbC5Mb2NhbGlzYXRpb24gPSB7XG4gICAgZGVmYXVsdExhbmd1YWdlOiAnZW4tR0InLFxuXG4gICAgLypcbiAgICAgKiBOb3QgYWxsIGxhbmd1YWdlcyBoYXZlIGJlZW4gdHJhbnNsYXRlZFxuICAgICAqIFNvbWUgY291bnRyaWVzIHByZWZlciBhIGNlcnRhaW4gbGFuZ3VhZ2VcbiAgICAgKi9cbiAgICBzdXBwb3J0ZWRMYW5ndWFnZXM6IHtcbiAgICAgICAgJ2VuJzogICAgJ2VuLUdCJyxcbiAgICAgICAgJ2VuLUdCJzogJ2VuLUdCJyxcbiAgICAgICAgJ2VuLVVTJzogJ2VuLUdCJyxcbiAgICAgICAgJ25sJzogICAgJ25sLU5MJyxcbiAgICAgICAgJ25sLU5MJzogJ25sLU5MJyxcbiAgICAgICAgJ25sLUJFJzogJ25sLU5MJyxcbiAgICAgICAgJ2RlJzogICAgJ2RlLURFJyxcbiAgICAgICAgJ2RlLURFJzogJ2RlLURFJyxcbiAgICAgICAgJ3N2LVNFJzogJ3N2LVNFJyxcbiAgICAgICAgJ3N2JzogICAgJ3N2LVNFJyxcbiAgICAgICAgJ2VsJzogICAgJ2VsLUdSJyxcbiAgICAgICAgJ2VsLUdSJzogJ2VsLUdSJ1xuICAgIH0sXG5cbiAgICAvLyBHZXQgbGFuZ3VhZ2UgY29kZSBmcm9tIGJyb3dzZXIgYW5kIHZlcmlmeSBpdFxuICAgIGdldExhbmd1YWdlQ29kZTogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGFuZ3VhZ2VDb2RlID0gVXRpbC5Mb2NhbGlzYXRpb24uZ2V0VXNlclByZWZlcnJlZExhbmd1YWdlKCk7XG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsYW5ndWFnZUNvZGUubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICB2YXIgc3VwcG9ydGVkTGFuZ3VhZ2VDb2RlID0gVXRpbC5Mb2NhbGlzYXRpb24uZ2V0U3VwcG9ydGVkTGFuZ3VhZ2VDb2RlKGxhbmd1YWdlQ29kZVtpbmRleF0pO1xuICAgICAgICAgICAgaWYgKHN1cHBvcnRlZExhbmd1YWdlQ29kZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdXBwb3J0ZWRMYW5ndWFnZUNvZGU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gVXRpbC5Mb2NhbGlzYXRpb24uZGVmYXVsdExhbmd1YWdlO1xuICAgIH0sXG5cbiAgICAvKlxuICAgICogUmV0cmlldmUgdXNlciBwcmVmZXJyZWQgbGFuZ3VhZ2VzXG4gICAgKiBOYXZpZ2F0b3IubGFuZ3VhZ2VzIG9ubHkgYXZhaWxhYmxlIGluIENocm9tZSAoMzIrKSBhbmQgRmlyZUZveCAoMzIrKVxuICAgICogRmFsbCBiYWNrIHRvIG5hdmlnYXRvci5sYW5ndWFnZSBmb3Igb3RoZXIgYnJvd3NlcnNcbiAgICAqL1xuICAgIGdldFVzZXJQcmVmZXJyZWRMYW5ndWFnZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2VzID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdXNlckxhbmcgPSBuYXZpZ2F0b3IubGFuZ3VhZ2UgfHwgbmF2aWdhdG9yLnVzZXJMYW5ndWFnZTtcbiAgICAgICAgICAgIHJldHVybiBbdXNlckxhbmddO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qXG4gICAgKiBWZXJpZnkgaWYgbGFuZ3VhZ2Vjb2RlIGlzIHN1cHBvcnRlZFxuICAgICogUmV0dXJuIHRoZSBsYW5ndWFnZWNvZGUgb2YgdGhlIGxhbmd1YWdlIHRvIHVzZSBvciBudWxsIGlmIG5vdCBhdmFpbGFibGVcbiAgICAqL1xuICAgIGdldFN1cHBvcnRlZExhbmd1YWdlQ29kZTogZnVuY3Rpb24gKGxhbmd1YWdlQ29kZSkge1xuICAgICAgICB2YXIgc3VwcG9ydGVkTGFuZ3VhZ2VzID0gVXRpbC5Mb2NhbGlzYXRpb24uc3VwcG9ydGVkTGFuZ3VhZ2VzO1xuXG4gICAgICAgIGZvciAodmFyIGtleSBpbiBzdXBwb3J0ZWRMYW5ndWFnZXMpIHtcbiAgICAgICAgICAgIGlmIChzdXBwb3J0ZWRMYW5ndWFnZXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IGxhbmd1YWdlQ29kZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIHN1cHBvcnRlZCBsYW5ndWFnZSBvciBnb29kIGFsdGVybmF0aXZlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBwb3J0ZWRMYW5ndWFnZXNba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMYW5ndWFnZUNvZGUgbm90IHN1cHBvcnRlZFxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgLy8gUmV0cmlldmUgbG9jYWxpc2VkIHRleHRcbiAgICBnZXQ6IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICBpZiAodHlwZW9mIExhbmd1YWdlICE9PSAndW5kZWZpbmVkJyAmJiBMYW5ndWFnZVtpZF0pIHtcbiAgICAgICAgICAgIHJldHVybiBMYW5ndWFnZVtpZF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBVdGlsO1xuIiwiLypcbiAqIFdlYnNvY2s6IGhpZ2gtcGVyZm9ybWFuY2UgYmluYXJ5IFdlYlNvY2tldHNcbiAqIENvcHlyaWdodCAoQykgMjAxMiBKb2VsIE1hcnRpblxuICogTGljZW5zZWQgdW5kZXIgTVBMIDIuMCAoc2VlIExJQ0VOU0UudHh0KVxuICpcbiAqIFdlYnNvY2sgaXMgc2ltaWxhciB0byB0aGUgc3RhbmRhcmQgV2ViU29ja2V0IG9iamVjdCBidXQgV2Vic29ja1xuICogZW5hYmxlcyBjb21tdW5pY2F0aW9uIHdpdGggcmF3IFRDUCBzb2NrZXRzIChpLmUuIHRoZSBiaW5hcnkgc3RyZWFtKVxuICogdmlhIHdlYnNvY2tpZnkuIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IGJhc2U2NCBlbmNvZGluZyB0aGUgZGF0YVxuICogc3RyZWFtIGJldHdlZW4gV2Vic29jayBhbmQgd2Vic29ja2lmeS5cbiAqXG4gKiBXZWJzb2NrIGhhcyBidWlsdC1pbiByZWNlaXZlIHF1ZXVlIGJ1ZmZlcmluZzsgdGhlIG1lc3NhZ2UgZXZlbnRcbiAqIGRvZXMgbm90IGNvbnRhaW4gYWN0dWFsIGRhdGEgYnV0IGlzIHNpbXBseSBhIG5vdGlmaWNhdGlvbiB0aGF0XG4gKiB0aGVyZSBpcyBuZXcgZGF0YSBhdmFpbGFibGUuIFNldmVyYWwgclEqIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSB0b1xuICogcmVhZCBiaW5hcnkgZGF0YSBvZmYgb2YgdGhlIHJlY2VpdmUgcXVldWUuXG4gKi9cblxuaW1wb3J0IFV0aWwgZnJvbSBcIi4vdXRpbFwiO1xuaW1wb3J0IEJhc2U2NCBmcm9tIFwiLi9iYXNlNjRcIjtcblxuXG4vKmpzbGludCBicm93c2VyOiB0cnVlLCBiaXR3aXNlOiB0cnVlICovXG4vKmdsb2JhbCBVdGlsKi9cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gV2Vic29jaygpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHRoaXMuX3dlYnNvY2tldCA9IG51bGw7ICAvLyBXZWJTb2NrZXQgb2JqZWN0XG5cbiAgICB0aGlzLl9yUWkgPSAwOyAgICAgICAgICAgLy8gUmVjZWl2ZSBxdWV1ZSBpbmRleFxuICAgIHRoaXMuX3JRbGVuID0gMDsgICAgICAgICAvLyBOZXh0IHdyaXRlIHBvc2l0aW9uIGluIHRoZSByZWNlaXZlIHF1ZXVlXG4gICAgdGhpcy5fclFidWZmZXJTaXplID0gMTAyNCAqIDEwMjQgKiA0OyAvLyBSZWNlaXZlIHF1ZXVlIGJ1ZmZlciBzaXplICg0IE1pQilcbiAgICB0aGlzLl9yUW1heCA9IHRoaXMuX3JRYnVmZmVyU2l6ZSAvIDg7XG4gICAgLy8gY2FsbGVkIGluIGluaXQ6IHRoaXMuX3JRID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fclFidWZmZXJTaXplKTtcbiAgICB0aGlzLl9yUSA9IG51bGw7IC8vIFJlY2VpdmUgcXVldWVcblxuICAgIHRoaXMuX3NRYnVmZmVyU2l6ZSA9IDEwMjQgKiAxMDsgIC8vIDEwIEtpQlxuICAgIC8vIGNhbGxlZCBpbiBpbml0OiB0aGlzLl9zUSA9IG5ldyBVaW50OEFycmF5KHRoaXMuX3NRYnVmZmVyU2l6ZSk7XG4gICAgdGhpcy5fc1FsZW4gPSAwO1xuICAgIHRoaXMuX3NRID0gbnVsbDsgIC8vIFNlbmQgcXVldWVcblxuICAgIHRoaXMuX21vZGUgPSAnYmluYXJ5JzsgICAgLy8gQ3VycmVudCBXZWJTb2NrZXQgbW9kZTogJ2JpbmFyeScsICdiYXNlNjQnXG4gICAgdGhpcy5tYXhCdWZmZXJlZEFtb3VudCA9IDIwMDtcblxuICAgIHRoaXMuX2V2ZW50SGFuZGxlcnMgPSB7XG4gICAgICAgICdtZXNzYWdlJzogZnVuY3Rpb24gKCkge30sXG4gICAgICAgICdvcGVuJzogZnVuY3Rpb24gKCkge30sXG4gICAgICAgICdjbG9zZSc6IGZ1bmN0aW9uICgpIHt9LFxuICAgICAgICAnZXJyb3InOiBmdW5jdGlvbiAoKSB7fVxuICAgIH07XG59O1xuXG4oZnVuY3Rpb24gKCkge1xuICAgIFwidXNlIHN0cmljdFwiO1xuICAgIC8vIHRoaXMgaGFzIHBlcmZvcm1hbmNlIGlzc3VlcyBpbiBzb21lIHZlcnNpb25zIENocm9taXVtLCBhbmRcbiAgICAvLyBkb2Vzbid0IGdhaW4gYSB0cmVtZW5kb3VzIGFtb3VudCBvZiBwZXJmb3JtYW5jZSBpbmNyZWFzZSBpbiBGaXJlZm94XG4gICAgLy8gYXQgdGhlIG1vbWVudC4gIEl0IG1heSBiZSB2YWx1YWJsZSB0byB0dXJuIGl0IG9uIGluIHRoZSBmdXR1cmUuXG4gICAgdmFyIEVOQUJMRV9DT1BZV0lUSElOID0gZmFsc2U7XG5cbiAgICB2YXIgTUFYX1JRX0dST1dfU0laRSA9IDQwICogMTAyNCAqIDEwMjQ7ICAvLyA0MCBNaUJcblxuICAgIHZhciB0eXBlZEFycmF5VG9TdHJpbmcgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBUaGlzIGlzIG9ubHkgZm9yIFBoYW50b21KUywgd2hpY2ggZG9lc24ndCBsaWtlIGFwcGx5LWluZ1xuICAgICAgICAvLyB3aXRoIFR5cGVkIEFycmF5c1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KFsxLCAyLCAzXSk7XG4gICAgICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycik7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGEpIHsgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYSk7IH07XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgICAgICAgICAgICAgICAgbnVsbCwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0pKCk7XG5cbiAgICBXZWJzb2NrLnByb3RvdHlwZSA9IHtcbiAgICAgICAgLy8gR2V0dGVycyBhbmQgU2V0dGVyc1xuICAgICAgICBnZXRfc1E6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zUTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRfclE6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yUTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRfclFpOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fclFpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHNldF9yUWk6IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3JRaSA9IHZhbDtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBSZWNlaXZlIFF1ZXVlXG4gICAgICAgIHJRbGVuOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fclFsZW4gLSB0aGlzLl9yUWk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgclFwZWVrODogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JRW3RoaXMuX3JRaV07XG4gICAgICAgIH0sXG5cbiAgICAgICAgclFzaGlmdDg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yUVt0aGlzLl9yUWkrK107XG4gICAgICAgIH0sXG5cbiAgICAgICAgclFza2lwODogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5fclFpKys7XG4gICAgICAgIH0sXG5cbiAgICAgICAgclFza2lwQnl0ZXM6IGZ1bmN0aW9uIChudW0pIHtcbiAgICAgICAgICAgIHRoaXMuX3JRaSArPSBudW07XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gVE9ETyhkaXJlY3R4bWFuMTIpOiB0ZXN0IHBlcmZvcm1hbmNlIHdpdGggdGhlc2UgdnMgYSBEYXRhVmlld1xuICAgICAgICByUXNoaWZ0MTY6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5fclFbdGhpcy5fclFpKytdIDw8IDgpICtcbiAgICAgICAgICAgICAgICAgICB0aGlzLl9yUVt0aGlzLl9yUWkrK107XG4gICAgICAgIH0sXG5cbiAgICAgICAgclFzaGlmdDMyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuX3JRW3RoaXMuX3JRaSsrXSA8PCAyNCkgK1xuICAgICAgICAgICAgICAgICAgICh0aGlzLl9yUVt0aGlzLl9yUWkrK10gPDwgMTYpICtcbiAgICAgICAgICAgICAgICAgICAodGhpcy5fclFbdGhpcy5fclFpKytdIDw8IDgpICtcbiAgICAgICAgICAgICAgICAgICB0aGlzLl9yUVt0aGlzLl9yUWkrK107XG4gICAgICAgIH0sXG5cbiAgICAgICAgclFzaGlmdFN0cjogZnVuY3Rpb24gKGxlbikge1xuICAgICAgICAgICAgaWYgKHR5cGVvZihsZW4pID09PSAndW5kZWZpbmVkJykgeyBsZW4gPSB0aGlzLnJRbGVuKCk7IH1cbiAgICAgICAgICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSh0aGlzLl9yUS5idWZmZXIsIHRoaXMuX3JRaSwgbGVuKTtcbiAgICAgICAgICAgIHRoaXMuX3JRaSArPSBsZW47XG4gICAgICAgICAgICByZXR1cm4gdHlwZWRBcnJheVRvU3RyaW5nKGFycik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgclFzaGlmdEJ5dGVzOiBmdW5jdGlvbiAobGVuKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mKGxlbikgPT09ICd1bmRlZmluZWQnKSB7IGxlbiA9IHRoaXMuclFsZW4oKTsgfVxuICAgICAgICAgICAgdGhpcy5fclFpICs9IGxlbjtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0aGlzLl9yUS5idWZmZXIsIHRoaXMuX3JRaSAtIGxlbiwgbGVuKTtcbiAgICAgICAgfSxcblxuICAgICAgICByUXNoaWZ0VG86IGZ1bmN0aW9uICh0YXJnZXQsIGxlbikge1xuICAgICAgICAgICAgaWYgKGxlbiA9PT0gdW5kZWZpbmVkKSB7IGxlbiA9IHRoaXMuclFsZW4oKTsgfVxuICAgICAgICAgICAgLy8gVE9ETzogbWFrZSB0aGlzIGp1c3QgdXNlIHNldCB3aXRoIHZpZXdzIHdoZW4gdXNpbmcgYSBBcnJheUJ1ZmZlciB0byBzdG9yZSB0aGUgclFcbiAgICAgICAgICAgIHRhcmdldC5zZXQobmV3IFVpbnQ4QXJyYXkodGhpcy5fclEuYnVmZmVyLCB0aGlzLl9yUWksIGxlbikpO1xuICAgICAgICAgICAgdGhpcy5fclFpICs9IGxlbjtcbiAgICAgICAgfSxcblxuICAgICAgICByUXdob2xlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodGhpcy5fclEuYnVmZmVyLCAwLCB0aGlzLl9yUWxlbik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgclFzbGljZTogZnVuY3Rpb24gKHN0YXJ0LCBlbmQpIHtcbiAgICAgICAgICAgIGlmIChlbmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodGhpcy5fclEuYnVmZmVyLCB0aGlzLl9yUWkgKyBzdGFydCwgZW5kIC0gc3RhcnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodGhpcy5fclEuYnVmZmVyLCB0aGlzLl9yUWkgKyBzdGFydCwgdGhpcy5fclFsZW4gLSB0aGlzLl9yUWkgLSBzdGFydCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIG11c3Qgd2FpdCBmb3IgJ251bScgYnl0ZXMgKGRlZmF1bHQgdG8gRkJVLmJ5dGVzKVxuICAgICAgICAvLyB0byBiZSBhdmFpbGFibGUgaW4gdGhlIHJlY2VpdmUgcXVldWUuIFJldHVybiB0cnVlIGlmIHdlIG5lZWQgdG9cbiAgICAgICAgLy8gd2FpdCAoYW5kIHBvc3NpYmx5IHByaW50IGEgZGVidWcgbWVzc2FnZSksIG90aGVyd2lzZSBmYWxzZS5cbiAgICAgICAgclF3YWl0OiBmdW5jdGlvbiAobXNnLCBudW0sIGdvYmFjaykge1xuICAgICAgICAgICAgdmFyIHJRbGVuID0gdGhpcy5fclFsZW4gLSB0aGlzLl9yUWk7IC8vIFNraXAgclFsZW4oKSBmdW5jdGlvbiBjYWxsXG4gICAgICAgICAgICBpZiAoclFsZW4gPCBudW0pIHtcbiAgICAgICAgICAgICAgICBpZiAoZ29iYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yUWkgPCBnb2JhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJRd2FpdCBjYW5ub3QgYmFja3VwIFwiICsgZ29iYWNrICsgXCIgYnl0ZXNcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fclFpIC09IGdvYmFjaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIHRydWUgbWVhbnMgbmVlZCBtb3JlIGRhdGFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBTZW5kIFF1ZXVlXG5cbiAgICAgICAgZmx1c2g6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl93ZWJzb2NrZXQuYnVmZmVyZWRBbW91bnQgIT09IDApIHtcbiAgICAgICAgICAgICAgICBVdGlsLkRlYnVnKFwiYnVmZmVyZWRBbW91bnQ6IFwiICsgdGhpcy5fd2Vic29ja2V0LmJ1ZmZlcmVkQW1vdW50KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX3dlYnNvY2tldC5idWZmZXJlZEFtb3VudCA8IHRoaXMubWF4QnVmZmVyZWRBbW91bnQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc1FsZW4gPiAwICYmIHRoaXMuX3dlYnNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuT1BFTikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl93ZWJzb2NrZXQuc2VuZCh0aGlzLl9lbmNvZGVfbWVzc2FnZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc1FsZW4gPSAwO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBVdGlsLkluZm8oXCJEZWxheWluZyBzZW5kLCBidWZmZXJlZEFtb3VudDogXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fd2Vic29ja2V0LmJ1ZmZlcmVkQW1vdW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2VuZDogZnVuY3Rpb24gKGFycikge1xuICAgICAgICAgICAgdGhpcy5fc1Euc2V0KGFyciwgdGhpcy5fc1FsZW4pO1xuICAgICAgICAgICAgdGhpcy5fc1FsZW4gKz0gYXJyLmxlbmd0aDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZsdXNoKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2VuZF9zdHJpbmc6IGZ1bmN0aW9uIChzdHIpIHtcbiAgICAgICAgICAgIHRoaXMuc2VuZChzdHIuc3BsaXQoJycpLm1hcChmdW5jdGlvbiAoY2hyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNoci5jaGFyQ29kZUF0KDApO1xuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIEV2ZW50IEhhbmRsZXJzXG4gICAgICAgIG9mZjogZnVuY3Rpb24gKGV2dCkge1xuICAgICAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyc1tldnRdID0gZnVuY3Rpb24gKCkge307XG4gICAgICAgIH0sXG5cbiAgICAgICAgb246IGZ1bmN0aW9uIChldnQsIGhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcnNbZXZ0XSA9IGhhbmRsZXI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2FsbG9jYXRlX2J1ZmZlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuX3JRID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fclFidWZmZXJTaXplKTtcbiAgICAgICAgICAgIHRoaXMuX3NRID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fc1FidWZmZXJTaXplKTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbiAocHJvdG9jb2xzLCB3c19zY2hlbWEpIHtcbiAgICAgICAgICAgIHRoaXMuX2FsbG9jYXRlX2J1ZmZlcnMoKTtcbiAgICAgICAgICAgIHRoaXMuX3JRaSA9IDA7XG4gICAgICAgICAgICB0aGlzLl93ZWJzb2NrZXQgPSBudWxsO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBmb3IgZnVsbCB0eXBlZCBhcnJheSBzdXBwb3J0XG4gICAgICAgICAgICB2YXIgYnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICgoJ1VpbnQ4QXJyYXknIGluIHdpbmRvdykgJiZcbiAgICAgICAgICAgICAgICAgICAgKCdzZXQnIGluIFVpbnQ4QXJyYXkucHJvdG90eXBlKSkge1xuICAgICAgICAgICAgICAgIGJ0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGZ1bGwgYmluYXJ5IHR5cGUgc3VwcG9ydCBpbiBXZWJTb2NrZXRzXG4gICAgICAgICAgICAvLyBJbnNwaXJlZCBieTpcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2Rlcm5penIvTW9kZXJuaXpyL2lzc3Vlcy8zNzBcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb2Rlcm5penIvTW9kZXJuaXpyL2Jsb2IvbWFzdGVyL2ZlYXR1cmUtZGV0ZWN0cy93ZWJzb2NrZXRzL2JpbmFyeS5qc1xuICAgICAgICAgICAgdmFyIHdzYnQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKGJ0ICYmICgnYmluYXJ5VHlwZScgaW4gV2ViU29ja2V0LnByb3RvdHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgISEobmV3IFdlYlNvY2tldCh3c19zY2hlbWEgKyAnOi8vLicpLmJpbmFyeVR5cGUpKSkge1xuICAgICAgICAgICAgICAgICAgICBVdGlsLkluZm8oXCJEZXRlY3RlZCBiaW5hcnlUeXBlIHN1cHBvcnQgaW4gV2ViU29ja2V0c1wiKTtcbiAgICAgICAgICAgICAgICAgICAgd3NidCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXhjKSB7XG4gICAgICAgICAgICAgICAgLy8gSnVzdCBpZ25vcmUgZmFpbGVkIHRlc3QgbG9jYWxob3N0IGNvbm5lY3Rpb25cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRGVmYXVsdCBwcm90b2NvbHMgaWYgbm90IHNwZWNpZmllZFxuICAgICAgICAgICAgaWYgKHR5cGVvZihwcm90b2NvbHMpID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgcHJvdG9jb2xzID0gJ2JpbmFyeSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHByb3RvY29scykgJiYgcHJvdG9jb2xzLmluZGV4T2YoJ2JpbmFyeScpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBwcm90b2NvbHMgPSAnYmluYXJ5JztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF3c2J0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9WTkMgbm8gbG9uZ2VyIHN1cHBvcnRzIGJhc2U2NCBXZWJTb2NrZXRzLiAgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlBsZWFzZSB1c2UgYSBicm93c2VyIHdoaWNoIHN1cHBvcnRzIGJpbmFyeSBXZWJTb2NrZXRzLlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3RvY29scyAhPSAnYmluYXJ5Jykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vVk5DIG5vIGxvbmdlciBzdXBwb3J0cyBiYXNlNjQgV2ViU29ja2V0cy4gIFBsZWFzZSBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidXNlIHRoZSBiaW5hcnkgc3VicHJvdG9jb2wgaW5zdGVhZC5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBwcm90b2NvbHM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgb3BlbjogZnVuY3Rpb24gKHVyaSwgcHJvdG9jb2xzKSB7XG4gICAgICAgICAgICB2YXIgd3Nfc2NoZW1hID0gdXJpLm1hdGNoKC9eKFthLXpdKyk6XFwvXFwvLylbMV07XG4gICAgICAgICAgICBwcm90b2NvbHMgPSB0aGlzLmluaXQocHJvdG9jb2xzLCB3c19zY2hlbWEpO1xuXG4gICAgICAgICAgICB0aGlzLl93ZWJzb2NrZXQgPSBuZXcgV2ViU29ja2V0KHVyaSwgcHJvdG9jb2xzKTtcblxuICAgICAgICAgICAgaWYgKHByb3RvY29scy5pbmRleE9mKCdiaW5hcnknKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vic29ja2V0LmJpbmFyeVR5cGUgPSAnYXJyYXlidWZmZXInO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLl93ZWJzb2NrZXQub25tZXNzYWdlID0gdGhpcy5fcmVjdl9tZXNzYWdlLmJpbmQodGhpcyk7XG4gICAgICAgICAgICB0aGlzLl93ZWJzb2NrZXQub25vcGVuID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBVdGlsLkRlYnVnKCc+PiBXZWJTb2NrLm9ub3BlbicpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl93ZWJzb2NrZXQucHJvdG9jb2wpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZSA9IHRoaXMuX3dlYnNvY2tldC5wcm90b2NvbDtcbiAgICAgICAgICAgICAgICAgICAgVXRpbC5JbmZvKFwiU2VydmVyIGNob29zZSBzdWItcHJvdG9jb2w6IFwiICsgdGhpcy5fd2Vic29ja2V0LnByb3RvY29sKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2RlID0gJ2JpbmFyeSc7XG4gICAgICAgICAgICAgICAgICAgIFV0aWwuRXJyb3IoJ1NlcnZlciBzZWxlY3Qgbm8gc3ViLXByb3RvY29sITogJyArIHRoaXMuX3dlYnNvY2tldC5wcm90b2NvbCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX21vZGUgIT0gJ2JpbmFyeScpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm9WTkMgbm8gbG9uZ2VyIHN1cHBvcnRzIGJhc2U2NCBXZWJTb2NrZXRzLiAgUGxlYXNlIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidXNlIHRoZSBiaW5hcnkgc3VicHJvdG9jb2wgaW5zdGVhZC5cIik7XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXJzLm9wZW4oKTtcbiAgICAgICAgICAgICAgICBVdGlsLkRlYnVnKFwiPDwgV2ViU29jay5vbm9wZW5cIik7XG4gICAgICAgICAgICB9KS5iaW5kKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fd2Vic29ja2V0Lm9uY2xvc2UgPSAoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBVdGlsLkRlYnVnKFwiPj4gV2ViU29jay5vbmNsb3NlXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcnMuY2xvc2UoZSk7XG4gICAgICAgICAgICAgICAgVXRpbC5EZWJ1ZyhcIjw8IFdlYlNvY2sub25jbG9zZVwiKTtcbiAgICAgICAgICAgIH0pLmJpbmQodGhpcyk7XG4gICAgICAgICAgICB0aGlzLl93ZWJzb2NrZXQub25lcnJvciA9IChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIFV0aWwuRGVidWcoXCI+PiBXZWJTb2NrLm9uZXJyb3I6IFwiICsgZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVycy5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICBVdGlsLkRlYnVnKFwiPDwgV2ViU29jay5vbmVycm9yOiBcIiArIGUpO1xuICAgICAgICAgICAgfSkuYmluZCh0aGlzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjbG9zZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3dlYnNvY2tldCkge1xuICAgICAgICAgICAgICAgIGlmICgodGhpcy5fd2Vic29ja2V0LnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3dlYnNvY2tldC5yZWFkeVN0YXRlID09PSBXZWJTb2NrZXQuQ09OTkVDVElORykpIHtcbiAgICAgICAgICAgICAgICAgICAgVXRpbC5JbmZvKFwiQ2xvc2luZyBXZWJTb2NrZXQgY29ubmVjdGlvblwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fd2Vic29ja2V0LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vic29ja2V0Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7IHJldHVybjsgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvLyBwcml2YXRlIG1ldGhvZHNcbiAgICAgICAgX2VuY29kZV9tZXNzYWdlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBQdXQgaW4gYSBiaW5hcnkgYXJyYXlidWZmZXJcbiAgICAgICAgICAgIC8vIGFjY29yZGluZyB0byB0aGUgc3BlYywgeW91IGNhbiBzZW5kIEFycmF5QnVmZmVyVmlld3Mgd2l0aCB0aGUgc2VuZCBtZXRob2RcbiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0aGlzLl9zUS5idWZmZXIsIDAsIHRoaXMuX3NRbGVuKTtcbiAgICAgICAgfSxcblxuICAgICAgICBfZXhwYW5kX2NvbXBhY3RfclE6IGZ1bmN0aW9uIChtaW5fZml0KSB7XG4gICAgICAgICAgICB2YXIgcmVzaXplTmVlZGVkID0gbWluX2ZpdCB8fCB0aGlzLl9yUWxlbiAtIHRoaXMuX3JRaSA+IHRoaXMuX3JRYnVmZmVyU2l6ZSAvIDI7XG4gICAgICAgICAgICBpZiAocmVzaXplTmVlZGVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtaW5fZml0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgZG91YmxlIHRoZSBzaXplIGlmIHdlIG5lZWQgdG8gZG8gY29tcGFjdGlvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yUWJ1ZmZlclNpemUgKj0gMjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIG1ha2Ugc3VyZSB3ZSBzYXRpc3kgclFsZW4gLSByUWkgKyBtaW5fZml0IDwgclFidWZmZXJTaXplIC8gOFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yUWJ1ZmZlclNpemUgPSAodGhpcy5fclFsZW4gLSB0aGlzLl9yUWkgKyBtaW5fZml0KSAqIDg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIGdyb3cgdW5ib3VuZGVkbHlcbiAgICAgICAgICAgIGlmICh0aGlzLl9yUWJ1ZmZlclNpemUgPiBNQVhfUlFfR1JPV19TSVpFKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fclFidWZmZXJTaXplID0gTUFYX1JRX0dST1dfU0laRTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fclFidWZmZXJTaXplIC0gdGhpcy5fclFsZW4gLSB0aGlzLl9yUWkgPCBtaW5fZml0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oXCJSZWNlaXZlIFF1ZXVlIGJ1ZmZlciBleGNlZWRlZCBcIiArIE1BWF9SUV9HUk9XX1NJWkUgKyBcIiBieXRlcywgYW5kIHRoZSBuZXcgbWVzc2FnZSBjb3VsZCBub3QgZml0XCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJlc2l6ZU5lZWRlZCkge1xuICAgICAgICAgICAgICAgIHZhciBvbGRfclFidWZmZXIgPSB0aGlzLl9yUS5idWZmZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5fclFtYXggPSB0aGlzLl9yUWJ1ZmZlclNpemUgLyA4O1xuICAgICAgICAgICAgICAgIHRoaXMuX3JRID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5fclFidWZmZXJTaXplKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yUS5zZXQobmV3IFVpbnQ4QXJyYXkob2xkX3JRYnVmZmVyLCB0aGlzLl9yUWkpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKEVOQUJMRV9DT1BZV0lUSElOKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3JRLmNvcHlXaXRoaW4oMCwgdGhpcy5fclFpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yUS5zZXQobmV3IFVpbnQ4QXJyYXkodGhpcy5fclEuYnVmZmVyLCB0aGlzLl9yUWkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX3JRbGVuID0gdGhpcy5fclFsZW4gLSB0aGlzLl9yUWk7XG4gICAgICAgICAgICB0aGlzLl9yUWkgPSAwO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9kZWNvZGVfbWVzc2FnZTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIC8vIHB1c2ggYXJyYXlidWZmZXIgdmFsdWVzIG9udG8gdGhlIGVuZFxuICAgICAgICAgICAgdmFyIHU4ID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgICAgICBpZiAodTgubGVuZ3RoID4gdGhpcy5fclFidWZmZXJTaXplIC0gdGhpcy5fclFsZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9leHBhbmRfY29tcGFjdF9yUSh1OC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fclEuc2V0KHU4LCB0aGlzLl9yUWxlbik7XG4gICAgICAgICAgICB0aGlzLl9yUWxlbiArPSB1OC5sZW5ndGg7XG4gICAgICAgIH0sXG5cbiAgICAgICAgX3JlY3ZfbWVzc2FnZTogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZGVjb2RlX21lc3NhZ2UoZS5kYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5yUWxlbigpID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXJzLm1lc3NhZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGFjdCB0aGUgcmVjZWl2ZSBxdWV1ZVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fclFsZW4gPT0gdGhpcy5fclFpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yUWxlbiA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yUWkgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3JRbGVuID4gdGhpcy5fclFtYXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2V4cGFuZF9jb21wYWN0X3JRKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBVdGlsLkRlYnVnKFwiSWdub3JpbmcgZW1wdHkgbWVzc2FnZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChleGMpIHtcbiAgICAgICAgICAgICAgICB2YXIgZXhjZXB0aW9uX3N0ciA9IFwiXCI7XG4gICAgICAgICAgICAgICAgaWYgKGV4Yy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl9zdHIgKz0gXCJcXG4gICAgbmFtZTogXCIgKyBleGMubmFtZSArIFwiXFxuXCI7XG4gICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl9zdHIgKz0gXCIgICAgbWVzc2FnZTogXCIgKyBleGMubWVzc2FnZSArIFwiXFxuXCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBleGMuZGVzY3JpcHRpb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl9zdHIgKz0gXCIgICAgZGVzY3JpcHRpb246IFwiICsgZXhjLmRlc2NyaXB0aW9uICsgXCJcXG5cIjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4Yy5zdGFjayAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uX3N0ciArPSBleGMuc3RhY2s7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbl9zdHIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBVdGlsLkVycm9yKFwicmVjdl9tZXNzYWdlLCBjYXVnaHQgZXhjZXB0aW9uOiBcIiArIGV4Y2VwdGlvbl9zdHIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIFV0aWwuRXJyb3IoXCJyZWN2X21lc3NhZ2UsIGNhdWdodCBleGNlcHRpb246IFwiICsgZXhjKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV4Yy5uYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXJzLmVycm9yKGV4Yy5uYW1lICsgXCI6IFwiICsgZXhjLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcnMuZXJyb3IoZXhjKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoKSB7fTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vYXJyYXkvZnJvbVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvYXNzaWduXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwibW9kdWxlLmV4cG9ydHMgPSB7IFwiZGVmYXVsdFwiOiByZXF1aXJlKFwiY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9jcmVhdGVcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2VudHJpZXNcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L3NldC1wcm90b3R5cGUtb2ZcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L3ZhbHVlc1wiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIm1vZHVsZS5leHBvcnRzID0geyBcImRlZmF1bHRcIjogcmVxdWlyZShcImNvcmUtanMvbGlicmFyeS9mbi9zeW1ib2xcIiksIF9fZXNNb2R1bGU6IHRydWUgfTsiLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vc3ltYm9sL2l0ZXJhdG9yXCIpLCBfX2VzTW9kdWxlOiB0cnVlIH07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9hc3NpZ25cIik7XG5cbnZhciBfYXNzaWduMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Fzc2lnbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IF9hc3NpZ24yLmRlZmF1bHQgfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkge1xuICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3NldFByb3RvdHlwZU9mID0gcmVxdWlyZShcIi4uL2NvcmUtanMvb2JqZWN0L3NldC1wcm90b3R5cGUtb2ZcIik7XG5cbnZhciBfc2V0UHJvdG90eXBlT2YyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2V0UHJvdG90eXBlT2YpO1xuXG52YXIgX2NyZWF0ZSA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9jcmVhdGVcIik7XG5cbnZhciBfY3JlYXRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZSk7XG5cbnZhciBfdHlwZW9mMiA9IHJlcXVpcmUoXCIuLi9oZWxwZXJzL3R5cGVvZlwiKTtcblxudmFyIF90eXBlb2YzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdHlwZW9mMik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyAodHlwZW9mIHN1cGVyQ2xhc3MgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogKDAsIF90eXBlb2YzLmRlZmF1bHQpKHN1cGVyQ2xhc3MpKSk7XG4gIH1cblxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSAoMCwgX2NyZWF0ZTIuZGVmYXVsdCkoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgaWYgKHN1cGVyQ2xhc3MpIF9zZXRQcm90b3R5cGVPZjIuZGVmYXVsdCA/ICgwLCBfc2V0UHJvdG90eXBlT2YyLmRlZmF1bHQpKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAob2JqLCBrZXlzKSB7XG4gIHZhciB0YXJnZXQgPSB7fTtcblxuICBmb3IgKHZhciBpIGluIG9iaikge1xuICAgIGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7XG4gICAgdGFyZ2V0W2ldID0gb2JqW2ldO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn07IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdHlwZW9mMiA9IHJlcXVpcmUoXCIuLi9oZWxwZXJzL3R5cGVvZlwiKTtcblxudmFyIF90eXBlb2YzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdHlwZW9mMik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICgodHlwZW9mIGNhbGwgPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogKDAsIF90eXBlb2YzLmRlZmF1bHQpKGNhbGwpKSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9pdGVyYXRvciA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL3N5bWJvbC9pdGVyYXRvclwiKTtcblxudmFyIF9pdGVyYXRvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pdGVyYXRvcik7XG5cbnZhciBfc3ltYm9sID0gcmVxdWlyZShcIi4uL2NvcmUtanMvc3ltYm9sXCIpO1xuXG52YXIgX3N5bWJvbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zeW1ib2wpO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBfc3ltYm9sMi5kZWZhdWx0ID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIF9pdGVyYXRvcjIuZGVmYXVsdCA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIF9zeW1ib2wyLmRlZmF1bHQgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IF9zeW1ib2wyLmRlZmF1bHQgJiYgb2JqICE9PSBfc3ltYm9sMi5kZWZhdWx0LnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIF90eXBlb2YoX2l0ZXJhdG9yMi5kZWZhdWx0KSA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xufSA6IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgX3N5bWJvbDIuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gX3N5bWJvbDIuZGVmYXVsdCAmJiBvYmogIT09IF9zeW1ib2wyLmRlZmF1bHQucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgPyBcInVuZGVmaW5lZFwiIDogX3R5cGVvZihvYmopO1xufTsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LmFycmF5LmZyb20nKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLkFycmF5LmZyb207IiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LmFzc2lnbicpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmFzc2lnbjsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlJyk7XG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGNyZWF0ZShQLCBEKXtcbiAgcmV0dXJuICRPYmplY3QuY3JlYXRlKFAsIEQpO1xufTsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5vYmplY3QuZW50cmllcycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuT2JqZWN0LmVudHJpZXM7IiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LnNldC1wcm90b3R5cGUtb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9fY29yZScpLk9iamVjdC5zZXRQcm90b3R5cGVPZjsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5vYmplY3QudmFsdWVzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3QudmFsdWVzOyIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LnN5bWJvbCcpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczYub2JqZWN0LnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNy5zeW1ib2wub2JzZXJ2YWJsZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuU3ltYm9sOyIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX3drcy1leHQnKS5mKCdpdGVyYXRvcicpOyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZih0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKXsgLyogZW1wdHkgKi8gfTsiLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZighaXNPYmplY3QoaXQpKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGFuIG9iamVjdCEnKTtcbiAgcmV0dXJuIGl0O1xufTsiLCIvLyBmYWxzZSAtPiBBcnJheSNpbmRleE9mXG4vLyB0cnVlICAtPiBBcnJheSNpbmNsdWRlc1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIHRvTGVuZ3RoICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXG4gICwgdG9JbmRleCAgID0gcmVxdWlyZSgnLi9fdG8taW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oSVNfSU5DTFVERVMpe1xuICByZXR1cm4gZnVuY3Rpb24oJHRoaXMsIGVsLCBmcm9tSW5kZXgpe1xuICAgIHZhciBPICAgICAgPSB0b0lPYmplY3QoJHRoaXMpXG4gICAgICAsIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKVxuICAgICAgLCBpbmRleCAgPSB0b0luZGV4KGZyb21JbmRleCwgbGVuZ3RoKVxuICAgICAgLCB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgaWYoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpd2hpbGUobGVuZ3RoID4gaW5kZXgpe1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgaWYodmFsdWUgIT0gdmFsdWUpcmV0dXJuIHRydWU7XG4gICAgLy8gQXJyYXkjdG9JbmRleCBpZ25vcmVzIGhvbGVzLCBBcnJheSNpbmNsdWRlcyAtIG5vdFxuICAgIH0gZWxzZSBmb3IoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKWlmKElTX0lOQ0xVREVTIHx8IGluZGV4IGluIE8pe1xuICAgICAgaWYoT1tpbmRleF0gPT09IGVsKXJldHVybiBJU19JTkNMVURFUyB8fCBpbmRleCB8fCAwO1xuICAgIH0gcmV0dXJuICFJU19JTkNMVURFUyAmJiAtMTtcbiAgfTtcbn07IiwiLy8gZ2V0dGluZyB0YWcgZnJvbSAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKVxuICAsIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpXG4gIC8vIEVTMyB3cm9uZyBoZXJlXG4gICwgQVJHID0gY29mKGZ1bmN0aW9uKCl7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24oaXQsIGtleSl7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGl0W2tleV07XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgTywgVCwgQjtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyAnVW5kZWZpbmVkJyA6IGl0ID09PSBudWxsID8gJ051bGwnXG4gICAgLy8gQEB0b1N0cmluZ1RhZyBjYXNlXG4gICAgOiB0eXBlb2YgKFQgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRBRykpID09ICdzdHJpbmcnID8gVFxuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQVJHID8gY29mKE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKEIgPSBjb2YoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiBCO1xufTsiLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59OyIsInZhciBjb3JlID0gbW9kdWxlLmV4cG9ydHMgPSB7dmVyc2lvbjogJzIuNC4wJ307XG5pZih0eXBlb2YgX19lID09ICdudW1iZXInKV9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWYiLCIndXNlIHN0cmljdCc7XG52YXIgJGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCBjcmVhdGVEZXNjICAgICAgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqZWN0LCBpbmRleCwgdmFsdWUpe1xuICBpZihpbmRleCBpbiBvYmplY3QpJGRlZmluZVByb3BlcnR5LmYob2JqZWN0LCBpbmRleCwgY3JlYXRlRGVzYygwLCB2YWx1ZSkpO1xuICBlbHNlIG9iamVjdFtpbmRleF0gPSB2YWx1ZTtcbn07IiwiLy8gb3B0aW9uYWwgLyBzaW1wbGUgY29udGV4dCBiaW5kaW5nXG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihmbiwgdGhhdCwgbGVuZ3RoKXtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYodGhhdCA9PT0gdW5kZWZpbmVkKXJldHVybiBmbjtcbiAgc3dpdGNoKGxlbmd0aCl7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24oYSl7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uKGEsIGIpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbihhLCBiLCBjKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uKC8qIC4uLmFyZ3MgKi8pe1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTsiLCIvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKGl0ID09IHVuZGVmaW5lZCl0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgXCIgKyBpdCk7XG4gIHJldHVybiBpdDtcbn07IiwiLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiA3OyB9fSkuYSAhPSA3O1xufSk7IiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50XG4gIC8vIGluIG9sZCBJRSB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0J1xuICAsIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59OyIsIi8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gKFxuICAnY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mJ1xuKS5zcGxpdCgnLCcpOyIsIi8vIGFsbCBlbnVtZXJhYmxlIG9iamVjdCBrZXlzLCBpbmNsdWRlcyBzeW1ib2xzXG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJylcbiAgLCBnT1BTICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKVxuICAsIHBJRSAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgdmFyIHJlc3VsdCAgICAgPSBnZXRLZXlzKGl0KVxuICAgICwgZ2V0U3ltYm9scyA9IGdPUFMuZjtcbiAgaWYoZ2V0U3ltYm9scyl7XG4gICAgdmFyIHN5bWJvbHMgPSBnZXRTeW1ib2xzKGl0KVxuICAgICAgLCBpc0VudW0gID0gcElFLmZcbiAgICAgICwgaSAgICAgICA9IDBcbiAgICAgICwga2V5O1xuICAgIHdoaWxlKHN5bWJvbHMubGVuZ3RoID4gaSlpZihpc0VudW0uY2FsbChpdCwga2V5ID0gc3ltYm9sc1tpKytdKSlyZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59OyIsInZhciBnbG9iYWwgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGNvcmUgICAgICA9IHJlcXVpcmUoJy4vX2NvcmUnKVxuICAsIGN0eCAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgaGlkZSAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciAkZXhwb3J0ID0gZnVuY3Rpb24odHlwZSwgbmFtZSwgc291cmNlKXtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkZcbiAgICAsIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0LkdcbiAgICAsIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlNcbiAgICAsIElTX1BST1RPICA9IHR5cGUgJiAkZXhwb3J0LlBcbiAgICAsIElTX0JJTkQgICA9IHR5cGUgJiAkZXhwb3J0LkJcbiAgICAsIElTX1dSQVAgICA9IHR5cGUgJiAkZXhwb3J0LldcbiAgICAsIGV4cG9ydHMgICA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pXG4gICAgLCBleHBQcm90byAgPSBleHBvcnRzW1BST1RPVFlQRV1cbiAgICAsIHRhcmdldCAgICA9IElTX0dMT0JBTCA/IGdsb2JhbCA6IElTX1NUQVRJQyA/IGdsb2JhbFtuYW1lXSA6IChnbG9iYWxbbmFtZV0gfHwge30pW1BST1RPVFlQRV1cbiAgICAsIGtleSwgb3duLCBvdXQ7XG4gIGlmKElTX0dMT0JBTClzb3VyY2UgPSBuYW1lO1xuICBmb3Ioa2V5IGluIHNvdXJjZSl7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICBpZihvd24gJiYga2V5IGluIGV4cG9ydHMpY29udGludWU7XG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcbiAgICBvdXQgPSBvd24gPyB0YXJnZXRba2V5XSA6IHNvdXJjZVtrZXldO1xuICAgIC8vIHByZXZlbnQgZ2xvYmFsIHBvbGx1dGlvbiBmb3IgbmFtZXNwYWNlc1xuICAgIGV4cG9ydHNba2V5XSA9IElTX0dMT0JBTCAmJiB0eXBlb2YgdGFyZ2V0W2tleV0gIT0gJ2Z1bmN0aW9uJyA/IHNvdXJjZVtrZXldXG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICA6IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKVxuICAgIC8vIHdyYXAgZ2xvYmFsIGNvbnN0cnVjdG9ycyBmb3IgcHJldmVudCBjaGFuZ2UgdGhlbSBpbiBsaWJyYXJ5XG4gICAgOiBJU19XUkFQICYmIHRhcmdldFtrZXldID09IG91dCA/IChmdW5jdGlvbihDKXtcbiAgICAgIHZhciBGID0gZnVuY3Rpb24oYSwgYiwgYyl7XG4gICAgICAgIGlmKHRoaXMgaW5zdGFuY2VvZiBDKXtcbiAgICAgICAgICBzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgQztcbiAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBDKGEpO1xuICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEMoYSwgYik7XG4gICAgICAgICAgfSByZXR1cm4gbmV3IEMoYSwgYiwgYyk7XG4gICAgICAgIH0gcmV0dXJuIEMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgICBGW1BST1RPVFlQRV0gPSBDW1BST1RPVFlQRV07XG4gICAgICByZXR1cm4gRjtcbiAgICAvLyBtYWtlIHN0YXRpYyB2ZXJzaW9ucyBmb3IgcHJvdG90eXBlIG1ldGhvZHNcbiAgICB9KShvdXQpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG4gICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLm1ldGhvZHMuJU5BTUUlXG4gICAgaWYoSVNfUFJPVE8pe1xuICAgICAgKGV4cG9ydHMudmlydHVhbCB8fCAoZXhwb3J0cy52aXJ0dWFsID0ge30pKVtrZXldID0gb3V0O1xuICAgICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLnByb3RvdHlwZS4lTkFNRSVcbiAgICAgIGlmKHR5cGUgJiAkZXhwb3J0LlIgJiYgZXhwUHJvdG8gJiYgIWV4cFByb3RvW2tleV0paGlkZShleHBQcm90bywga2V5LCBvdXQpO1xuICAgIH1cbiAgfVxufTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgICAvLyBnbG9iYWxcbiRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgIC8vIGJpbmRcbiRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuJGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG4kZXhwb3J0LlIgPSAxMjg7IC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWAgXG5tb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2goZSl7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07IiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZiA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZih0eXBlb2YgX19nID09ICdudW1iZXInKV9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZiIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwga2V5KXtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59OyIsInZhciBkUCAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsiLCJtb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdkaXYnKSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcbn0pOyIsIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59OyIsIi8vIGNoZWNrIG9uIGRlZmF1bHQgQXJyYXkgaXRlcmF0b3JcbnZhciBJdGVyYXRvcnMgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCBJVEVSQVRPUiAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUl0gPT09IGl0KTtcbn07IiwiLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZyl7XG4gIHJldHVybiBjb2YoYXJnKSA9PSAnQXJyYXknO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07IiwiLy8gY2FsbCBzb21ldGhpbmcgb24gaXRlcmF0b3Igc3RlcCB3aXRoIHNhZmUgY2xvc2luZyBvbiBlcnJvclxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIGVudHJpZXMpe1xuICB0cnkge1xuICAgIHJldHVybiBlbnRyaWVzID8gZm4oYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2goZSl7XG4gICAgdmFyIHJldCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgICBpZihyZXQgIT09IHVuZGVmaW5lZClhbk9iamVjdChyZXQuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGU7XG4gIH1cbn07IiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNyZWF0ZSAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpXG4gICwgZGVzY3JpcHRvciAgICAgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJylcbiAgLCBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJylcbiAgLCBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faGlkZScpKEl0ZXJhdG9yUHJvdG90eXBlLCByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKSwgZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KXtcbiAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7bmV4dDogZGVzY3JpcHRvcigxLCBuZXh0KX0pO1xuICBzZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgTkFNRSArICcgSXRlcmF0b3InKTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xudmFyIExJQlJBUlkgICAgICAgID0gcmVxdWlyZSgnLi9fbGlicmFyeScpXG4gICwgJGV4cG9ydCAgICAgICAgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsIHJlZGVmaW5lICAgICAgID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKVxuICAsIGhpZGUgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgaGFzICAgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIEl0ZXJhdG9ycyAgICAgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCAkaXRlckNyZWF0ZSAgICA9IHJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJylcbiAgLCBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJylcbiAgLCBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKVxuICAsIElURVJBVE9SICAgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBCVUdHWSAgICAgICAgICA9ICEoW10ua2V5cyAmJiAnbmV4dCcgaW4gW10ua2V5cygpKSAvLyBTYWZhcmkgaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gICwgRkZfSVRFUkFUT1IgICAgPSAnQEBpdGVyYXRvcidcbiAgLCBLRVlTICAgICAgICAgICA9ICdrZXlzJ1xuICAsIFZBTFVFUyAgICAgICAgID0gJ3ZhbHVlcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oQmFzZSwgTkFNRSwgQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKXtcbiAgJGl0ZXJDcmVhdGUoQ29uc3RydWN0b3IsIE5BTUUsIG5leHQpO1xuICB2YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24oa2luZCl7XG4gICAgaWYoIUJVR0dZICYmIGtpbmQgaW4gcHJvdG8pcmV0dXJuIHByb3RvW2tpbmRdO1xuICAgIHN3aXRjaChraW5kKXtcbiAgICAgIGNhc2UgS0VZUzogcmV0dXJuIGZ1bmN0aW9uIGtleXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgICAgIGNhc2UgVkFMVUVTOiByZXR1cm4gZnVuY3Rpb24gdmFsdWVzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgfSByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICB9O1xuICB2YXIgVEFHICAgICAgICA9IE5BTUUgKyAnIEl0ZXJhdG9yJ1xuICAgICwgREVGX1ZBTFVFUyA9IERFRkFVTFQgPT0gVkFMVUVTXG4gICAgLCBWQUxVRVNfQlVHID0gZmFsc2VcbiAgICAsIHByb3RvICAgICAgPSBCYXNlLnByb3RvdHlwZVxuICAgICwgJG5hdGl2ZSAgICA9IHByb3RvW0lURVJBVE9SXSB8fCBwcm90b1tGRl9JVEVSQVRPUl0gfHwgREVGQVVMVCAmJiBwcm90b1tERUZBVUxUXVxuICAgICwgJGRlZmF1bHQgICA9ICRuYXRpdmUgfHwgZ2V0TWV0aG9kKERFRkFVTFQpXG4gICAgLCAkZW50cmllcyAgID0gREVGQVVMVCA/ICFERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoJ2VudHJpZXMnKSA6IHVuZGVmaW5lZFxuICAgICwgJGFueU5hdGl2ZSA9IE5BTUUgPT0gJ0FycmF5JyA/IHByb3RvLmVudHJpZXMgfHwgJG5hdGl2ZSA6ICRuYXRpdmVcbiAgICAsIG1ldGhvZHMsIGtleSwgSXRlcmF0b3JQcm90b3R5cGU7XG4gIC8vIEZpeCBuYXRpdmVcbiAgaWYoJGFueU5hdGl2ZSl7XG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZigkYW55TmF0aXZlLmNhbGwobmV3IEJhc2UpKTtcbiAgICBpZihJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSl7XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvclByb3RvdHlwZSwgVEFHLCB0cnVlKTtcbiAgICAgIC8vIGZpeCBmb3Igc29tZSBvbGQgZW5naW5lc1xuICAgICAgaWYoIUxJQlJBUlkgJiYgIWhhcyhJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IpKWhpZGUoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICB9XG4gIH1cbiAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICBpZihERUZfVkFMVUVTICYmICRuYXRpdmUgJiYgJG5hdGl2ZS5uYW1lICE9PSBWQUxVRVMpe1xuICAgIFZBTFVFU19CVUcgPSB0cnVlO1xuICAgICRkZWZhdWx0ID0gZnVuY3Rpb24gdmFsdWVzKCl7IHJldHVybiAkbmF0aXZlLmNhbGwodGhpcyk7IH07XG4gIH1cbiAgLy8gRGVmaW5lIGl0ZXJhdG9yXG4gIGlmKCghTElCUkFSWSB8fCBGT1JDRUQpICYmIChCVUdHWSB8fCBWQUxVRVNfQlVHIHx8ICFwcm90b1tJVEVSQVRPUl0pKXtcbiAgICBoaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgSXRlcmF0b3JzW05BTUVdID0gJGRlZmF1bHQ7XG4gIEl0ZXJhdG9yc1tUQUddICA9IHJldHVyblRoaXM7XG4gIGlmKERFRkFVTFQpe1xuICAgIG1ldGhvZHMgPSB7XG4gICAgICB2YWx1ZXM6ICBERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoVkFMVUVTKSxcbiAgICAgIGtleXM6ICAgIElTX1NFVCAgICAgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChLRVlTKSxcbiAgICAgIGVudHJpZXM6ICRlbnRyaWVzXG4gICAgfTtcbiAgICBpZihGT1JDRUQpZm9yKGtleSBpbiBtZXRob2RzKXtcbiAgICAgIGlmKCEoa2V5IGluIHByb3RvKSlyZWRlZmluZShwcm90bywga2V5LCBtZXRob2RzW2tleV0pO1xuICAgIH0gZWxzZSAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChCVUdHWSB8fCBWQUxVRVNfQlVHKSwgTkFNRSwgbWV0aG9kcyk7XG4gIH1cbiAgcmV0dXJuIG1ldGhvZHM7XG59OyIsInZhciBJVEVSQVRPUiAgICAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgcml0ZXIgPSBbN11bSVRFUkFUT1JdKCk7XG4gIHJpdGVyWydyZXR1cm4nXSA9IGZ1bmN0aW9uKCl7IFNBRkVfQ0xPU0lORyA9IHRydWU7IH07XG4gIEFycmF5LmZyb20ocml0ZXIsIGZ1bmN0aW9uKCl7IHRocm93IDI7IH0pO1xufSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGV4ZWMsIHNraXBDbG9zaW5nKXtcbiAgaWYoIXNraXBDbG9zaW5nICYmICFTQUZFX0NMT1NJTkcpcmV0dXJuIGZhbHNlO1xuICB2YXIgc2FmZSA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBhcnIgID0gWzddXG4gICAgICAsIGl0ZXIgPSBhcnJbSVRFUkFUT1JdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24oKXsgcmV0dXJuIHtkb25lOiBzYWZlID0gdHJ1ZX07IH07XG4gICAgYXJyW0lURVJBVE9SXSA9IGZ1bmN0aW9uKCl7IHJldHVybiBpdGVyOyB9O1xuICAgIGV4ZWMoYXJyKTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gc2FmZTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihkb25lLCB2YWx1ZSl7XG4gIHJldHVybiB7dmFsdWU6IHZhbHVlLCBkb25lOiAhIWRvbmV9O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHt9OyIsInZhciBnZXRLZXlzICAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpXG4gICwgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIGVsKXtcbiAgdmFyIE8gICAgICA9IHRvSU9iamVjdChvYmplY3QpXG4gICAgLCBrZXlzICAgPSBnZXRLZXlzKE8pXG4gICAgLCBsZW5ndGggPSBrZXlzLmxlbmd0aFxuICAgICwgaW5kZXggID0gMFxuICAgICwga2V5O1xuICB3aGlsZShsZW5ndGggPiBpbmRleClpZihPW2tleSA9IGtleXNbaW5kZXgrK11dID09PSBlbClyZXR1cm4ga2V5O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHRydWU7IiwidmFyIE1FVEEgICAgID0gcmVxdWlyZSgnLi9fdWlkJykoJ21ldGEnKVxuICAsIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBoYXMgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgc2V0RGVzYyAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mXG4gICwgaWQgICAgICAgPSAwO1xudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24oKXtcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIEZSRUVaRSA9ICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XG4gIHJldHVybiBpc0V4dGVuc2libGUoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKHt9KSk7XG59KTtcbnZhciBzZXRNZXRhID0gZnVuY3Rpb24oaXQpe1xuICBzZXREZXNjKGl0LCBNRVRBLCB7dmFsdWU6IHtcbiAgICBpOiAnTycgKyArK2lkLCAvLyBvYmplY3QgSURcbiAgICB3OiB7fSAgICAgICAgICAvLyB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9fSk7XG59O1xudmFyIGZhc3RLZXkgPSBmdW5jdGlvbihpdCwgY3JlYXRlKXtcbiAgLy8gcmV0dXJuIHByaW1pdGl2ZSB3aXRoIHByZWZpeFxuICBpZighaXNPYmplY3QoaXQpKXJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7XG4gIGlmKCFoYXMoaXQsIE1FVEEpKXtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmKCFpc0V4dGVuc2libGUoaXQpKXJldHVybiAnRic7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZighY3JlYXRlKXJldHVybiAnRSc7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIG9iamVjdCBJRFxuICB9IHJldHVybiBpdFtNRVRBXS5pO1xufTtcbnZhciBnZXRXZWFrID0gZnVuY3Rpb24oaXQsIGNyZWF0ZSl7XG4gIGlmKCFoYXMoaXQsIE1FVEEpKXtcbiAgICAvLyBjYW4ndCBzZXQgbWV0YWRhdGEgdG8gdW5jYXVnaHQgZnJvemVuIG9iamVjdFxuICAgIGlmKCFpc0V4dGVuc2libGUoaXQpKXJldHVybiB0cnVlO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYoIWNyZWF0ZSlyZXR1cm4gZmFsc2U7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIGhhc2ggd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSByZXR1cm4gaXRbTUVUQV0udztcbn07XG4vLyBhZGQgbWV0YWRhdGEgb24gZnJlZXplLWZhbWlseSBtZXRob2RzIGNhbGxpbmdcbnZhciBvbkZyZWV6ZSA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoRlJFRVpFICYmIG1ldGEuTkVFRCAmJiBpc0V4dGVuc2libGUoaXQpICYmICFoYXMoaXQsIE1FVEEpKXNldE1ldGEoaXQpO1xuICByZXR1cm4gaXQ7XG59O1xudmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgS0VZOiAgICAgIE1FVEEsXG4gIE5FRUQ6ICAgICBmYWxzZSxcbiAgZmFzdEtleTogIGZhc3RLZXksXG4gIGdldFdlYWs6ICBnZXRXZWFrLFxuICBvbkZyZWV6ZTogb25GcmVlemVcbn07IiwiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4yLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSwgLi4uKVxudmFyIGdldEtleXMgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKVxuICAsIGdPUFMgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKVxuICAsIHBJRSAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpXG4gICwgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsIElPYmplY3QgID0gcmVxdWlyZSgnLi9faW9iamVjdCcpXG4gICwgJGFzc2lnbiAgPSBPYmplY3QuYXNzaWduO1xuXG4vLyBzaG91bGQgd29yayB3aXRoIHN5bWJvbHMgYW5kIHNob3VsZCBoYXZlIGRldGVybWluaXN0aWMgcHJvcGVydHkgb3JkZXIgKFY4IGJ1Zylcbm1vZHVsZS5leHBvcnRzID0gISRhc3NpZ24gfHwgcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICB2YXIgQSA9IHt9XG4gICAgLCBCID0ge31cbiAgICAsIFMgPSBTeW1ib2woKVxuICAgICwgSyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdCc7XG4gIEFbU10gPSA3O1xuICBLLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uKGspeyBCW2tdID0gazsgfSk7XG4gIHJldHVybiAkYXNzaWduKHt9LCBBKVtTXSAhPSA3IHx8IE9iamVjdC5rZXlzKCRhc3NpZ24oe30sIEIpKS5qb2luKCcnKSAhPSBLO1xufSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIHZhciBUICAgICA9IHRvT2JqZWN0KHRhcmdldClcbiAgICAsIGFMZW4gID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgaW5kZXggPSAxXG4gICAgLCBnZXRTeW1ib2xzID0gZ09QUy5mXG4gICAgLCBpc0VudW0gICAgID0gcElFLmY7XG4gIHdoaWxlKGFMZW4gPiBpbmRleCl7XG4gICAgdmFyIFMgICAgICA9IElPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKVxuICAgICAgLCBrZXlzICAgPSBnZXRTeW1ib2xzID8gZ2V0S2V5cyhTKS5jb25jYXQoZ2V0U3ltYm9scyhTKSkgOiBnZXRLZXlzKFMpXG4gICAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgICAsIGogICAgICA9IDBcbiAgICAgICwga2V5O1xuICAgIHdoaWxlKGxlbmd0aCA+IGopaWYoaXNFbnVtLmNhbGwoUywga2V5ID0ga2V5c1tqKytdKSlUW2tleV0gPSBTW2tleV07XG4gIH0gcmV0dXJuIFQ7XG59IDogJGFzc2lnbjsiLCIvLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbnZhciBhbk9iamVjdCAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgZFBzICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHBzJylcbiAgLCBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKVxuICAsIElFX1BST1RPICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpXG4gICwgRW1wdHkgICAgICAgPSBmdW5jdGlvbigpeyAvKiBlbXB0eSAqLyB9XG4gICwgUFJPVE9UWVBFICAgPSAncHJvdG90eXBlJztcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbigpe1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gcmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdpZnJhbWUnKVxuICAgICwgaSAgICAgID0gZW51bUJ1Z0tleXMubGVuZ3RoXG4gICAgLCBsdCAgICAgPSAnPCdcbiAgICAsIGd0ICAgICA9ICc+J1xuICAgICwgaWZyYW1lRG9jdW1lbnQ7XG4gIGlmcmFtZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICByZXF1aXJlKCcuL19odG1sJykuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9ICdqYXZhc2NyaXB0Oic7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2NyaXB0LXVybFxuICAvLyBjcmVhdGVEaWN0ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuT2JqZWN0O1xuICAvLyBodG1sLnJlbW92ZUNoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyAnc2NyaXB0JyArIGd0ICsgJ2RvY3VtZW50LkY9T2JqZWN0JyArIGx0ICsgJy9zY3JpcHQnICsgZ3QpO1xuICBpZnJhbWVEb2N1bWVudC5jbG9zZSgpO1xuICBjcmVhdGVEaWN0ID0gaWZyYW1lRG9jdW1lbnQuRjtcbiAgd2hpbGUoaS0tKWRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuICByZXR1cm4gY3JlYXRlRGljdCgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKXtcbiAgdmFyIHJlc3VsdDtcbiAgaWYoTyAhPT0gbnVsbCl7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eTtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gbnVsbDtcbiAgICAvLyBhZGQgXCJfX3Byb3RvX19cIiBmb3IgT2JqZWN0LmdldFByb3RvdHlwZU9mIHBvbHlmaWxsXG4gICAgcmVzdWx0W0lFX1BST1RPXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBkUHMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgICAgICAgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKVxuICAsIHRvUHJpbWl0aXZlICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcbiAgLCBkUCAgICAgICAgICAgICA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpe1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYoSUU4X0RPTV9ERUZJTkUpdHJ5IHtcbiAgICByZXR1cm4gZFAoTywgUCwgQXR0cmlidXRlcyk7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgaWYoJ2dldCcgaW4gQXR0cmlidXRlcyB8fCAnc2V0JyBpbiBBdHRyaWJ1dGVzKXRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmKCd2YWx1ZScgaW4gQXR0cmlidXRlcylPW1BdID0gQXR0cmlidXRlcy52YWx1ZTtcbiAgcmV0dXJuIE87XG59OyIsInZhciBkUCAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKVxuICAsIGdldEtleXMgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKE8sIFByb3BlcnRpZXMpe1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgICA9IGdldEtleXMoUHJvcGVydGllcylcbiAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgLCBpID0gMFxuICAgICwgUDtcbiAgd2hpbGUobGVuZ3RoID4gaSlkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuICByZXR1cm4gTztcbn07IiwidmFyIHBJRSAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpXG4gICwgY3JlYXRlRGVzYyAgICAgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJylcbiAgLCB0b0lPYmplY3QgICAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIHRvUHJpbWl0aXZlICAgID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJylcbiAgLCBoYXMgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpXG4gICwgZ09QRCAgICAgICAgICAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZ09QRCA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKXtcbiAgTyA9IHRvSU9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBpZihJRThfRE9NX0RFRklORSl0cnkge1xuICAgIHJldHVybiBnT1BEKE8sIFApO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG4gIGlmKGhhcyhPLCBQKSlyZXR1cm4gY3JlYXRlRGVzYyghcElFLmYuY2FsbChPLCBQKSwgT1tQXSk7XG59OyIsIi8vIGZhbGxiYWNrIGZvciBJRTExIGJ1Z2d5IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHdpdGggaWZyYW1lIGFuZCB3aW5kb3dcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCBnT1BOICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmZcbiAgLCB0b1N0cmluZyAgPSB7fS50b1N0cmluZztcblxudmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uKGl0KXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ09QTihpdCk7XG4gIH0gY2F0Y2goZSl7XG4gICAgcmV0dXJuIHdpbmRvd05hbWVzLnNsaWNlKCk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzLmYgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KXtcbiAgcmV0dXJuIHdpbmRvd05hbWVzICYmIHRvU3RyaW5nLmNhbGwoaXQpID09ICdbb2JqZWN0IFdpbmRvd10nID8gZ2V0V2luZG93TmFtZXMoaXQpIDogZ09QTih0b0lPYmplY3QoaXQpKTtcbn07XG4iLCIvLyAxOS4xLjIuNyAvIDE1LjIuMy40IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG52YXIgJGtleXMgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJylcbiAgLCBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xuXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pe1xuICByZXR1cm4gJGtleXMoTywgaGlkZGVuS2V5cyk7XG59OyIsImV4cG9ydHMuZiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7IiwiLy8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciBoYXMgICAgICAgICA9IHJlcXVpcmUoJy4vX2hhcycpXG4gICwgdG9PYmplY3QgICAgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsIElFX1BST1RPICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpXG4gICwgT2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbihPKXtcbiAgTyA9IHRvT2JqZWN0KE8pO1xuICBpZihoYXMoTywgSUVfUFJPVE8pKXJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcil7XG4gICAgcmV0dXJuIE8uY29uc3RydWN0b3IucHJvdG90eXBlO1xuICB9IHJldHVybiBPIGluc3RhbmNlb2YgT2JqZWN0ID8gT2JqZWN0UHJvdG8gOiBudWxsO1xufTsiLCJ2YXIgaGFzICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCB0b0lPYmplY3QgICAgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCBhcnJheUluZGV4T2YgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKGZhbHNlKVxuICAsIElFX1BST1RPICAgICA9IHJlcXVpcmUoJy4vX3NoYXJlZC1rZXknKSgnSUVfUFJPVE8nKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihvYmplY3QsIG5hbWVzKXtcbiAgdmFyIE8gICAgICA9IHRvSU9iamVjdChvYmplY3QpXG4gICAgLCBpICAgICAgPSAwXG4gICAgLCByZXN1bHQgPSBbXVxuICAgICwga2V5O1xuICBmb3Ioa2V5IGluIE8paWYoa2V5ICE9IElFX1BST1RPKWhhcyhPLCBrZXkpICYmIHJlc3VsdC5wdXNoKGtleSk7XG4gIC8vIERvbid0IGVudW0gYnVnICYgaGlkZGVuIGtleXNcbiAgd2hpbGUobmFtZXMubGVuZ3RoID4gaSlpZihoYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpe1xuICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07IiwiLy8gMTkuMS4yLjE0IC8gMTUuMi4zLjE0IE9iamVjdC5rZXlzKE8pXG52YXIgJGtleXMgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cy1pbnRlcm5hbCcpXG4gICwgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuL19lbnVtLWJ1Zy1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKXtcbiAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07IiwiZXhwb3J0cy5mID0ge30ucHJvcGVydHlJc0VudW1lcmFibGU7IiwidmFyIGdldEtleXMgICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJylcbiAgLCB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCBpc0VudW0gICAgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJykuZjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXNFbnRyaWVzKXtcbiAgcmV0dXJuIGZ1bmN0aW9uKGl0KXtcbiAgICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KGl0KVxuICAgICAgLCBrZXlzICAgPSBnZXRLZXlzKE8pXG4gICAgICAsIGxlbmd0aCA9IGtleXMubGVuZ3RoXG4gICAgICAsIGkgICAgICA9IDBcbiAgICAgICwgcmVzdWx0ID0gW11cbiAgICAgICwga2V5O1xuICAgIHdoaWxlKGxlbmd0aCA+IGkpaWYoaXNFbnVtLmNhbGwoTywga2V5ID0ga2V5c1tpKytdKSl7XG4gICAgICByZXN1bHQucHVzaChpc0VudHJpZXMgPyBba2V5LCBPW2tleV1dIDogT1trZXldKTtcbiAgICB9IHJldHVybiByZXN1bHQ7XG4gIH07XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oYml0bWFwLCB2YWx1ZSl7XG4gIHJldHVybiB7XG4gICAgZW51bWVyYWJsZSAgOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZSAgICA6ICEoYml0bWFwICYgNCksXG4gICAgdmFsdWUgICAgICAgOiB2YWx1ZVxuICB9O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2hpZGUnKTsiLCIvLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgY2hlY2sgPSBmdW5jdGlvbihPLCBwcm90byl7XG4gIGFuT2JqZWN0KE8pO1xuICBpZighaXNPYmplY3QocHJvdG8pICYmIHByb3RvICE9PSBudWxsKXRocm93IFR5cGVFcnJvcihwcm90byArIFwiOiBjYW4ndCBzZXQgYXMgcHJvdG90eXBlIVwiKTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgc2V0OiBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgKCdfX3Byb3RvX18nIGluIHt9ID8gLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIGZ1bmN0aW9uKHRlc3QsIGJ1Z2d5LCBzZXQpe1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0ID0gcmVxdWlyZSgnLi9fY3R4JykoRnVuY3Rpb24uY2FsbCwgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQsIDIpO1xuICAgICAgICBzZXQodGVzdCwgW10pO1xuICAgICAgICBidWdneSA9ICEodGVzdCBpbnN0YW5jZW9mIEFycmF5KTtcbiAgICAgIH0gY2F0Y2goZSl7IGJ1Z2d5ID0gdHJ1ZTsgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKXtcbiAgICAgICAgY2hlY2soTywgcHJvdG8pO1xuICAgICAgICBpZihidWdneSlPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICBlbHNlIHNldChPLCBwcm90byk7XG4gICAgICAgIHJldHVybiBPO1xuICAgICAgfTtcbiAgICB9KHt9LCBmYWxzZSkgOiB1bmRlZmluZWQpLFxuICBjaGVjazogY2hlY2tcbn07IiwidmFyIGRlZiA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmZcbiAgLCBoYXMgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIFRBRyA9IHJlcXVpcmUoJy4vX3drcycpKCd0b1N0cmluZ1RhZycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCB0YWcsIHN0YXQpe1xuICBpZihpdCAmJiAhaGFzKGl0ID0gc3RhdCA/IGl0IDogaXQucHJvdG90eXBlLCBUQUcpKWRlZihpdCwgVEFHLCB7Y29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnfSk7XG59OyIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgna2V5cycpXG4gICwgdWlkICAgID0gcmVxdWlyZSgnLi9fdWlkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XG59OyIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIFNIQVJFRCA9ICdfX2NvcmUtanNfc2hhcmVkX18nXG4gICwgc3RvcmUgID0gZ2xvYmFsW1NIQVJFRF0gfHwgKGdsb2JhbFtTSEFSRURdID0ge30pO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gc3RvcmVba2V5XSB8fCAoc3RvcmVba2V5XSA9IHt9KTtcbn07IiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxuICAsIGRlZmluZWQgICA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKFRPX1NUUklORyl7XG4gIHJldHVybiBmdW5jdGlvbih0aGF0LCBwb3Mpe1xuICAgIHZhciBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpXG4gICAgICAsIGkgPSB0b0ludGVnZXIocG9zKVxuICAgICAgLCBsID0gcy5sZW5ndGhcbiAgICAgICwgYSwgYjtcbiAgICBpZihpIDwgMCB8fCBpID49IGwpcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07IiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxuICAsIG1heCAgICAgICA9IE1hdGgubWF4XG4gICwgbWluICAgICAgID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGluZGV4LCBsZW5ndGgpe1xuICBpbmRleCA9IHRvSW50ZWdlcihpbmRleCk7XG4gIHJldHVybiBpbmRleCA8IDAgPyBtYXgoaW5kZXggKyBsZW5ndGgsIDApIDogbWluKGluZGV4LCBsZW5ndGgpO1xufTsiLCIvLyA3LjEuNCBUb0ludGVnZXJcbnZhciBjZWlsICA9IE1hdGguY2VpbFxuICAsIGZsb29yID0gTWF0aC5mbG9vcjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTtcbn07IiwiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKVxuICAsIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTsiLCIvLyA3LjEuMTUgVG9MZW5ndGhcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBtaW4gICAgICAgPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXQgPiAwID8gbWluKHRvSW50ZWdlcihpdCksIDB4MWZmZmZmZmZmZmZmZmYpIDogMDsgLy8gcG93KDIsIDUzKSAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTsiLCIvLyA3LjEuMTMgVG9PYmplY3QoYXJndW1lbnQpXG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07IiwiLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgUyl7XG4gIGlmKCFpc09iamVjdChpdCkpcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICBpZih0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIGlmKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07IiwidmFyIGlkID0gMFxuICAsIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcbiAgcmV0dXJuICdTeW1ib2woJy5jb25jYXQoa2V5ID09PSB1bmRlZmluZWQgPyAnJyA6IGtleSwgJylfJywgKCsraWQgKyBweCkudG9TdHJpbmcoMzYpKTtcbn07IiwidmFyIGdsb2JhbCAgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjb3JlICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2NvcmUnKVxuICAsIExJQlJBUlkgICAgICAgID0gcmVxdWlyZSgnLi9fbGlicmFyeScpXG4gICwgd2tzRXh0ICAgICAgICAgPSByZXF1aXJlKCcuL193a3MtZXh0JylcbiAgLCBkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG5hbWUpe1xuICB2YXIgJFN5bWJvbCA9IGNvcmUuU3ltYm9sIHx8IChjb3JlLlN5bWJvbCA9IExJQlJBUlkgPyB7fSA6IGdsb2JhbC5TeW1ib2wgfHwge30pO1xuICBpZihuYW1lLmNoYXJBdCgwKSAhPSAnXycgJiYgIShuYW1lIGluICRTeW1ib2wpKWRlZmluZVByb3BlcnR5KCRTeW1ib2wsIG5hbWUsIHt2YWx1ZTogd2tzRXh0LmYobmFtZSl9KTtcbn07IiwiZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fd2tzJyk7IiwidmFyIHN0b3JlICAgICAgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnd2tzJylcbiAgLCB1aWQgICAgICAgID0gcmVxdWlyZSgnLi9fdWlkJylcbiAgLCBTeW1ib2wgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuU3ltYm9sXG4gICwgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihuYW1lKXtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9XG4gICAgVVNFX1NZTUJPTCAmJiBTeW1ib2xbbmFtZV0gfHwgKFVTRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG5cbiRleHBvcnRzLnN0b3JlID0gc3RvcmU7IiwidmFyIGNsYXNzb2YgICA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsIElURVJBVE9SICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2NvcmUnKS5nZXRJdGVyYXRvck1ldGhvZCA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoaXQgIT0gdW5kZWZpbmVkKXJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xudmFyIGN0eCAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCAkZXhwb3J0ICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgdG9PYmplY3QgICAgICAgPSByZXF1aXJlKCcuL190by1vYmplY3QnKVxuICAsIGNhbGwgICAgICAgICAgID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJylcbiAgLCBpc0FycmF5SXRlciAgICA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKVxuICAsIHRvTGVuZ3RoICAgICAgID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgLCBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2NyZWF0ZS1wcm9wZXJ0eScpXG4gICwgZ2V0SXRlckZuICAgICAgPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpKGZ1bmN0aW9uKGl0ZXIpeyBBcnJheS5mcm9tKGl0ZXIpOyB9KSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjIuMSBBcnJheS5mcm9tKGFycmF5TGlrZSwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gIGZyb206IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlLyosIG1hcGZuID0gdW5kZWZpbmVkLCB0aGlzQXJnID0gdW5kZWZpbmVkKi8pe1xuICAgIHZhciBPICAgICAgID0gdG9PYmplY3QoYXJyYXlMaWtlKVxuICAgICAgLCBDICAgICAgID0gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheVxuICAgICAgLCBhTGVuICAgID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICAgLCBtYXBmbiAgID0gYUxlbiA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWRcbiAgICAgICwgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWRcbiAgICAgICwgaW5kZXggICA9IDBcbiAgICAgICwgaXRlckZuICA9IGdldEl0ZXJGbihPKVxuICAgICAgLCBsZW5ndGgsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3I7XG4gICAgaWYobWFwcGluZyltYXBmbiA9IGN0eChtYXBmbiwgYUxlbiA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQsIDIpO1xuICAgIC8vIGlmIG9iamVjdCBpc24ndCBpdGVyYWJsZSBvciBpdCdzIGFycmF5IHdpdGggZGVmYXVsdCBpdGVyYXRvciAtIHVzZSBzaW1wbGUgY2FzZVxuICAgIGlmKGl0ZXJGbiAhPSB1bmRlZmluZWQgJiYgIShDID09IEFycmF5ICYmIGlzQXJyYXlJdGVyKGl0ZXJGbikpKXtcbiAgICAgIGZvcihpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKE8pLCByZXN1bHQgPSBuZXcgQzsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOyBpbmRleCsrKXtcbiAgICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IGNhbGwoaXRlcmF0b3IsIG1hcGZuLCBbc3RlcC52YWx1ZSwgaW5kZXhdLCB0cnVlKSA6IHN0ZXAudmFsdWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgICBmb3IocmVzdWx0ID0gbmV3IEMobGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4Kyspe1xuICAgICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBtYXBwaW5nID8gbWFwZm4oT1tpbmRleF0sIGluZGV4KSA6IE9baW5kZXhdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0Lmxlbmd0aCA9IGluZGV4O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKVxuICAsIHN0ZXAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19pdGVyLXN0ZXAnKVxuICAsIEl0ZXJhdG9ycyAgICAgICAgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKVxuICAsIHRvSU9iamVjdCAgICAgICAgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG5cbi8vIDIyLjEuMy40IEFycmF5LnByb3RvdHlwZS5lbnRyaWVzKClcbi8vIDIyLjEuMy4xMyBBcnJheS5wcm90b3R5cGUua2V5cygpXG4vLyAyMi4xLjMuMjkgQXJyYXkucHJvdG90eXBlLnZhbHVlcygpXG4vLyAyMi4xLjMuMzAgQXJyYXkucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKShBcnJheSwgJ0FycmF5JywgZnVuY3Rpb24oaXRlcmF0ZWQsIGtpbmQpe1xuICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gIHRoaXMuX2sgPSBraW5kOyAgICAgICAgICAgICAgICAvLyBraW5kXG4vLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uKCl7XG4gIHZhciBPICAgICA9IHRoaXMuX3RcbiAgICAsIGtpbmQgID0gdGhpcy5fa1xuICAgICwgaW5kZXggPSB0aGlzLl9pKys7XG4gIGlmKCFPIHx8IGluZGV4ID49IE8ubGVuZ3RoKXtcbiAgICB0aGlzLl90ID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBzdGVwKDEpO1xuICB9XG4gIGlmKGtpbmQgPT0gJ2tleXMnICApcmV0dXJuIHN0ZXAoMCwgaW5kZXgpO1xuICBpZihraW5kID09ICd2YWx1ZXMnKXJldHVybiBzdGVwKDAsIE9baW5kZXhdKTtcbiAgcmV0dXJuIHN0ZXAoMCwgW2luZGV4LCBPW2luZGV4XV0pO1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyUgKDkuNC40LjYsIDkuNC40LjcpXG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTsiLCIvLyAxOS4xLjMuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYsICdPYmplY3QnLCB7YXNzaWduOiByZXF1aXJlKCcuL19vYmplY3QtYXNzaWduJyl9KTsiLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4vLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge2NyZWF0ZTogcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpfSk7IiwiLy8gMTkuMS4zLjE5IE9iamVjdC5zZXRQcm90b3R5cGVPZihPLCBwcm90bylcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtzZXRQcm90b3R5cGVPZjogcmVxdWlyZSgnLi9fc2V0LXByb3RvJykuc2V0fSk7IiwiIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRhdCAgPSByZXF1aXJlKCcuL19zdHJpbmctYXQnKSh0cnVlKTtcblxuLy8gMjEuMS4zLjI3IFN0cmluZy5wcm90b3R5cGVbQEBpdGVyYXRvcl0oKVxucmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKShTdHJpbmcsICdTdHJpbmcnLCBmdW5jdGlvbihpdGVyYXRlZCl7XG4gIHRoaXMuX3QgPSBTdHJpbmcoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgIC8vIG5leHQgaW5kZXhcbi8vIDIxLjEuNS4yLjEgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uKCl7XG4gIHZhciBPICAgICA9IHRoaXMuX3RcbiAgICAsIGluZGV4ID0gdGhpcy5faVxuICAgICwgcG9pbnQ7XG4gIGlmKGluZGV4ID49IE8ubGVuZ3RoKXJldHVybiB7dmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZX07XG4gIHBvaW50ID0gJGF0KE8sIGluZGV4KTtcbiAgdGhpcy5faSArPSBwb2ludC5sZW5ndGg7XG4gIHJldHVybiB7dmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZX07XG59KTsiLCIndXNlIHN0cmljdCc7XG4vLyBFQ01BU2NyaXB0IDYgc3ltYm9scyBzaGltXG52YXIgZ2xvYmFsICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGhhcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBERVNDUklQVE9SUyAgICA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJylcbiAgLCAkZXhwb3J0ICAgICAgICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgcmVkZWZpbmUgICAgICAgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgTUVUQSAgICAgICAgICAgPSByZXF1aXJlKCcuL19tZXRhJykuS0VZXG4gICwgJGZhaWxzICAgICAgICAgPSByZXF1aXJlKCcuL19mYWlscycpXG4gICwgc2hhcmVkICAgICAgICAgPSByZXF1aXJlKCcuL19zaGFyZWQnKVxuICAsIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKVxuICAsIHVpZCAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fdWlkJylcbiAgLCB3a3MgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3drcycpXG4gICwgd2tzRXh0ICAgICAgICAgPSByZXF1aXJlKCcuL193a3MtZXh0JylcbiAgLCB3a3NEZWZpbmUgICAgICA9IHJlcXVpcmUoJy4vX3drcy1kZWZpbmUnKVxuICAsIGtleU9mICAgICAgICAgID0gcmVxdWlyZSgnLi9fa2V5b2YnKVxuICAsIGVudW1LZXlzICAgICAgID0gcmVxdWlyZSgnLi9fZW51bS1rZXlzJylcbiAgLCBpc0FycmF5ICAgICAgICA9IHJlcXVpcmUoJy4vX2lzLWFycmF5JylcbiAgLCBhbk9iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgdG9JT2JqZWN0ICAgICAgPSByZXF1aXJlKCcuL190by1pb2JqZWN0JylcbiAgLCB0b1ByaW1pdGl2ZSAgICA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpXG4gICwgY3JlYXRlRGVzYyAgICAgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJylcbiAgLCBfY3JlYXRlICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKVxuICAsIGdPUE5FeHQgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4tZXh0JylcbiAgLCAkR09QRCAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJylcbiAgLCAkRFAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgJGtleXMgICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpXG4gICwgZ09QRCAgICAgICAgICAgPSAkR09QRC5mXG4gICwgZFAgICAgICAgICAgICAgPSAkRFAuZlxuICAsIGdPUE4gICAgICAgICAgID0gZ09QTkV4dC5mXG4gICwgJFN5bWJvbCAgICAgICAgPSBnbG9iYWwuU3ltYm9sXG4gICwgJEpTT04gICAgICAgICAgPSBnbG9iYWwuSlNPTlxuICAsIF9zdHJpbmdpZnkgICAgID0gJEpTT04gJiYgJEpTT04uc3RyaW5naWZ5XG4gICwgUFJPVE9UWVBFICAgICAgPSAncHJvdG90eXBlJ1xuICAsIEhJRERFTiAgICAgICAgID0gd2tzKCdfaGlkZGVuJylcbiAgLCBUT19QUklNSVRJVkUgICA9IHdrcygndG9QcmltaXRpdmUnKVxuICAsIGlzRW51bSAgICAgICAgID0ge30ucHJvcGVydHlJc0VudW1lcmFibGVcbiAgLCBTeW1ib2xSZWdpc3RyeSA9IHNoYXJlZCgnc3ltYm9sLXJlZ2lzdHJ5JylcbiAgLCBBbGxTeW1ib2xzICAgICA9IHNoYXJlZCgnc3ltYm9scycpXG4gICwgT1BTeW1ib2xzICAgICAgPSBzaGFyZWQoJ29wLXN5bWJvbHMnKVxuICAsIE9iamVjdFByb3RvICAgID0gT2JqZWN0W1BST1RPVFlQRV1cbiAgLCBVU0VfTkFUSVZFICAgICA9IHR5cGVvZiAkU3ltYm9sID09ICdmdW5jdGlvbidcbiAgLCBRT2JqZWN0ICAgICAgICA9IGdsb2JhbC5RT2JqZWN0O1xuLy8gRG9uJ3QgdXNlIHNldHRlcnMgaW4gUXQgU2NyaXB0LCBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMTczXG52YXIgc2V0dGVyID0gIVFPYmplY3QgfHwgIVFPYmplY3RbUFJPVE9UWVBFXSB8fCAhUU9iamVjdFtQUk9UT1RZUEVdLmZpbmRDaGlsZDtcblxuLy8gZmFsbGJhY2sgZm9yIG9sZCBBbmRyb2lkLCBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9Njg3XG52YXIgc2V0U3ltYm9sRGVzYyA9IERFU0NSSVBUT1JTICYmICRmYWlscyhmdW5jdGlvbigpe1xuICByZXR1cm4gX2NyZWF0ZShkUCh7fSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbigpeyByZXR1cm4gZFAodGhpcywgJ2EnLCB7dmFsdWU6IDd9KS5hOyB9XG4gIH0pKS5hICE9IDc7XG59KSA/IGZ1bmN0aW9uKGl0LCBrZXksIEQpe1xuICB2YXIgcHJvdG9EZXNjID0gZ09QRChPYmplY3RQcm90bywga2V5KTtcbiAgaWYocHJvdG9EZXNjKWRlbGV0ZSBPYmplY3RQcm90b1trZXldO1xuICBkUChpdCwga2V5LCBEKTtcbiAgaWYocHJvdG9EZXNjICYmIGl0ICE9PSBPYmplY3RQcm90bylkUChPYmplY3RQcm90bywga2V5LCBwcm90b0Rlc2MpO1xufSA6IGRQO1xuXG52YXIgd3JhcCA9IGZ1bmN0aW9uKHRhZyl7XG4gIHZhciBzeW0gPSBBbGxTeW1ib2xzW3RhZ10gPSBfY3JlYXRlKCRTeW1ib2xbUFJPVE9UWVBFXSk7XG4gIHN5bS5fayA9IHRhZztcbiAgcmV0dXJuIHN5bTtcbn07XG5cbnZhciBpc1N5bWJvbCA9IFVTRV9OQVRJVkUgJiYgdHlwZW9mICRTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCcgPyBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCc7XG59IDogZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXQgaW5zdGFuY2VvZiAkU3ltYm9sO1xufTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIEQpe1xuICBpZihpdCA9PT0gT2JqZWN0UHJvdG8pJGRlZmluZVByb3BlcnR5KE9QU3ltYm9scywga2V5LCBEKTtcbiAgYW5PYmplY3QoaXQpO1xuICBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBhbk9iamVjdChEKTtcbiAgaWYoaGFzKEFsbFN5bWJvbHMsIGtleSkpe1xuICAgIGlmKCFELmVudW1lcmFibGUpe1xuICAgICAgaWYoIWhhcyhpdCwgSElEREVOKSlkUChpdCwgSElEREVOLCBjcmVhdGVEZXNjKDEsIHt9KSk7XG4gICAgICBpdFtISURERU5dW2tleV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZihoYXMoaXQsIEhJRERFTikgJiYgaXRbSElEREVOXVtrZXldKWl0W0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuICAgICAgRCA9IF9jcmVhdGUoRCwge2VudW1lcmFibGU6IGNyZWF0ZURlc2MoMCwgZmFsc2UpfSk7XG4gICAgfSByZXR1cm4gc2V0U3ltYm9sRGVzYyhpdCwga2V5LCBEKTtcbiAgfSByZXR1cm4gZFAoaXQsIGtleSwgRCk7XG59O1xudmFyICRkZWZpbmVQcm9wZXJ0aWVzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhpdCwgUCl7XG4gIGFuT2JqZWN0KGl0KTtcbiAgdmFyIGtleXMgPSBlbnVtS2V5cyhQID0gdG9JT2JqZWN0KFApKVxuICAgICwgaSAgICA9IDBcbiAgICAsIGwgPSBrZXlzLmxlbmd0aFxuICAgICwga2V5O1xuICB3aGlsZShsID4gaSkkZGVmaW5lUHJvcGVydHkoaXQsIGtleSA9IGtleXNbaSsrXSwgUFtrZXldKTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciAkY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKGl0LCBQKXtcbiAgcmV0dXJuIFAgPT09IHVuZGVmaW5lZCA/IF9jcmVhdGUoaXQpIDogJGRlZmluZVByb3BlcnRpZXMoX2NyZWF0ZShpdCksIFApO1xufTtcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShrZXkpe1xuICB2YXIgRSA9IGlzRW51bS5jYWxsKHRoaXMsIGtleSA9IHRvUHJpbWl0aXZlKGtleSwgdHJ1ZSkpO1xuICBpZih0aGlzID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSlyZXR1cm4gZmFsc2U7XG4gIHJldHVybiBFIHx8ICFoYXModGhpcywga2V5KSB8fCAhaGFzKEFsbFN5bWJvbHMsIGtleSkgfHwgaGFzKHRoaXMsIEhJRERFTikgJiYgdGhpc1tISURERU5dW2tleV0gPyBFIDogdHJ1ZTtcbn07XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KXtcbiAgaXQgID0gdG9JT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgaWYoaXQgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKXJldHVybjtcbiAgdmFyIEQgPSBnT1BEKGl0LCBrZXkpO1xuICBpZihEICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICEoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkpRC5lbnVtZXJhYmxlID0gdHJ1ZTtcbiAgcmV0dXJuIEQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eU5hbWVzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCl7XG4gIHZhciBuYW1lcyAgPSBnT1BOKHRvSU9iamVjdChpdCkpXG4gICAgLCByZXN1bHQgPSBbXVxuICAgICwgaSAgICAgID0gMFxuICAgICwga2V5O1xuICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKXtcbiAgICBpZighaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIGtleSAhPSBISURERU4gJiYga2V5ICE9IE1FVEEpcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KXtcbiAgdmFyIElTX09QICA9IGl0ID09PSBPYmplY3RQcm90b1xuICAgICwgbmFtZXMgID0gZ09QTihJU19PUCA/IE9QU3ltYm9scyA6IHRvSU9iamVjdChpdCkpXG4gICAgLCByZXN1bHQgPSBbXVxuICAgICwgaSAgICAgID0gMFxuICAgICwga2V5O1xuICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKXtcbiAgICBpZihoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYgKElTX09QID8gaGFzKE9iamVjdFByb3RvLCBrZXkpIDogdHJ1ZSkpcmVzdWx0LnB1c2goQWxsU3ltYm9sc1trZXldKTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gMTkuNC4xLjEgU3ltYm9sKFtkZXNjcmlwdGlvbl0pXG5pZighVVNFX05BVElWRSl7XG4gICRTeW1ib2wgPSBmdW5jdGlvbiBTeW1ib2woKXtcbiAgICBpZih0aGlzIGluc3RhbmNlb2YgJFN5bWJvbCl0aHJvdyBUeXBlRXJyb3IoJ1N5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciEnKTtcbiAgICB2YXIgdGFnID0gdWlkKGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgICB2YXIgJHNldCA9IGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAgIGlmKHRoaXMgPT09IE9iamVjdFByb3RvKSRzZXQuY2FsbChPUFN5bWJvbHMsIHZhbHVlKTtcbiAgICAgIGlmKGhhcyh0aGlzLCBISURERU4pICYmIGhhcyh0aGlzW0hJRERFTl0sIHRhZykpdGhpc1tISURERU5dW3RhZ10gPSBmYWxzZTtcbiAgICAgIHNldFN5bWJvbERlc2ModGhpcywgdGFnLCBjcmVhdGVEZXNjKDEsIHZhbHVlKSk7XG4gICAgfTtcbiAgICBpZihERVNDUklQVE9SUyAmJiBzZXR0ZXIpc2V0U3ltYm9sRGVzYyhPYmplY3RQcm90bywgdGFnLCB7Y29uZmlndXJhYmxlOiB0cnVlLCBzZXQ6ICRzZXR9KTtcbiAgICByZXR1cm4gd3JhcCh0YWcpO1xuICB9O1xuICByZWRlZmluZSgkU3ltYm9sW1BST1RPVFlQRV0sICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCl7XG4gICAgcmV0dXJuIHRoaXMuX2s7XG4gIH0pO1xuXG4gICRHT1BELmYgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICAkRFAuZiAgID0gJGRlZmluZVByb3BlcnR5O1xuICByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmYgPSBnT1BORXh0LmYgPSAkZ2V0T3duUHJvcGVydHlOYW1lcztcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpLmYgID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuICByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpLmYgPSAkZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4gIGlmKERFU0NSSVBUT1JTICYmICFyZXF1aXJlKCcuL19saWJyYXJ5Jykpe1xuICAgIHJlZGVmaW5lKE9iamVjdFByb3RvLCAncHJvcGVydHlJc0VudW1lcmFibGUnLCAkcHJvcGVydHlJc0VudW1lcmFibGUsIHRydWUpO1xuICB9XG5cbiAgd2tzRXh0LmYgPSBmdW5jdGlvbihuYW1lKXtcbiAgICByZXR1cm4gd3JhcCh3a3MobmFtZSkpO1xuICB9XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHtTeW1ib2w6ICRTeW1ib2x9KTtcblxuZm9yKHZhciBzeW1ib2xzID0gKFxuICAvLyAxOS40LjIuMiwgMTkuNC4yLjMsIDE5LjQuMi40LCAxOS40LjIuNiwgMTkuNC4yLjgsIDE5LjQuMi45LCAxOS40LjIuMTAsIDE5LjQuMi4xMSwgMTkuNC4yLjEyLCAxOS40LjIuMTMsIDE5LjQuMi4xNFxuICAnaGFzSW5zdGFuY2UsaXNDb25jYXRTcHJlYWRhYmxlLGl0ZXJhdG9yLG1hdGNoLHJlcGxhY2Usc2VhcmNoLHNwZWNpZXMsc3BsaXQsdG9QcmltaXRpdmUsdG9TdHJpbmdUYWcsdW5zY29wYWJsZXMnXG4pLnNwbGl0KCcsJyksIGkgPSAwOyBzeW1ib2xzLmxlbmd0aCA+IGk7ICl3a3Moc3ltYm9sc1tpKytdKTtcblxuZm9yKHZhciBzeW1ib2xzID0gJGtleXMod2tzLnN0b3JlKSwgaSA9IDA7IHN5bWJvbHMubGVuZ3RoID4gaTsgKXdrc0RlZmluZShzeW1ib2xzW2krK10pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCAnU3ltYm9sJywge1xuICAvLyAxOS40LjIuMSBTeW1ib2wuZm9yKGtleSlcbiAgJ2Zvcic6IGZ1bmN0aW9uKGtleSl7XG4gICAgcmV0dXJuIGhhcyhTeW1ib2xSZWdpc3RyeSwga2V5ICs9ICcnKVxuICAgICAgPyBTeW1ib2xSZWdpc3RyeVtrZXldXG4gICAgICA6IFN5bWJvbFJlZ2lzdHJ5W2tleV0gPSAkU3ltYm9sKGtleSk7XG4gIH0sXG4gIC8vIDE5LjQuMi41IFN5bWJvbC5rZXlGb3Ioc3ltKVxuICBrZXlGb3I6IGZ1bmN0aW9uIGtleUZvcihrZXkpe1xuICAgIGlmKGlzU3ltYm9sKGtleSkpcmV0dXJuIGtleU9mKFN5bWJvbFJlZ2lzdHJ5LCBrZXkpO1xuICAgIHRocm93IFR5cGVFcnJvcihrZXkgKyAnIGlzIG5vdCBhIHN5bWJvbCEnKTtcbiAgfSxcbiAgdXNlU2V0dGVyOiBmdW5jdGlvbigpeyBzZXR0ZXIgPSB0cnVlOyB9LFxuICB1c2VTaW1wbGU6IGZ1bmN0aW9uKCl7IHNldHRlciA9IGZhbHNlOyB9XG59KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgJ09iamVjdCcsIHtcbiAgLy8gMTkuMS4yLjIgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuICBjcmVhdGU6ICRjcmVhdGUsXG4gIC8vIDE5LjEuMi40IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LFxuICAvLyAxOS4xLjIuMyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKVxuICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcyxcbiAgLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIC8vIDE5LjEuMi43IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG4gIGdldE93blByb3BlcnR5TmFtZXM6ICRnZXRPd25Qcm9wZXJ0eU5hbWVzLFxuICAvLyAxOS4xLjIuOCBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKE8pXG4gIGdldE93blByb3BlcnR5U3ltYm9sczogJGdldE93blByb3BlcnR5U3ltYm9sc1xufSk7XG5cbi8vIDI0LjMuMiBKU09OLnN0cmluZ2lmeSh2YWx1ZSBbLCByZXBsYWNlciBbLCBzcGFjZV1dKVxuJEpTT04gJiYgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoIVVTRV9OQVRJVkUgfHwgJGZhaWxzKGZ1bmN0aW9uKCl7XG4gIHZhciBTID0gJFN5bWJvbCgpO1xuICAvLyBNUyBFZGdlIGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyB7fVxuICAvLyBXZWJLaXQgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIG51bGxcbiAgLy8gVjggdGhyb3dzIG9uIGJveGVkIHN5bWJvbHNcbiAgcmV0dXJuIF9zdHJpbmdpZnkoW1NdKSAhPSAnW251bGxdJyB8fCBfc3RyaW5naWZ5KHthOiBTfSkgIT0gJ3t9JyB8fCBfc3RyaW5naWZ5KE9iamVjdChTKSkgIT0gJ3t9Jztcbn0pKSwgJ0pTT04nLCB7XG4gIHN0cmluZ2lmeTogZnVuY3Rpb24gc3RyaW5naWZ5KGl0KXtcbiAgICBpZihpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSlyZXR1cm47IC8vIElFOCByZXR1cm5zIHN0cmluZyBvbiB1bmRlZmluZWRcbiAgICB2YXIgYXJncyA9IFtpdF1cbiAgICAgICwgaSAgICA9IDFcbiAgICAgICwgcmVwbGFjZXIsICRyZXBsYWNlcjtcbiAgICB3aGlsZShhcmd1bWVudHMubGVuZ3RoID4gaSlhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHJlcGxhY2VyID0gYXJnc1sxXTtcbiAgICBpZih0eXBlb2YgcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykkcmVwbGFjZXIgPSByZXBsYWNlcjtcbiAgICBpZigkcmVwbGFjZXIgfHwgIWlzQXJyYXkocmVwbGFjZXIpKXJlcGxhY2VyID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSl7XG4gICAgICBpZigkcmVwbGFjZXIpdmFsdWUgPSAkcmVwbGFjZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgIGlmKCFpc1N5bWJvbCh2YWx1ZSkpcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gICAgYXJnc1sxXSA9IHJlcGxhY2VyO1xuICAgIHJldHVybiBfc3RyaW5naWZ5LmFwcGx5KCRKU09OLCBhcmdzKTtcbiAgfVxufSk7XG5cbi8vIDE5LjQuMy40IFN5bWJvbC5wcm90b3R5cGVbQEB0b1ByaW1pdGl2ZV0oaGludClcbiRTeW1ib2xbUFJPVE9UWVBFXVtUT19QUklNSVRJVkVdIHx8IHJlcXVpcmUoJy4vX2hpZGUnKSgkU3ltYm9sW1BST1RPVFlQRV0sIFRPX1BSSU1JVElWRSwgJFN5bWJvbFtQUk9UT1RZUEVdLnZhbHVlT2YpO1xuLy8gMTkuNC4zLjUgU3ltYm9sLnByb3RvdHlwZVtAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoJFN5bWJvbCwgJ1N5bWJvbCcpO1xuLy8gMjAuMi4xLjkgTWF0aFtAQHRvU3RyaW5nVGFnXVxuc2V0VG9TdHJpbmdUYWcoTWF0aCwgJ01hdGgnLCB0cnVlKTtcbi8vIDI0LjMuMyBKU09OW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZyhnbG9iYWwuSlNPTiwgJ0pTT04nLCB0cnVlKTsiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1vYmplY3QtdmFsdWVzLWVudHJpZXNcbnZhciAkZXhwb3J0ICA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpXG4gICwgJGVudHJpZXMgPSByZXF1aXJlKCcuL19vYmplY3QtdG8tYXJyYXknKSh0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7XG4gIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoaXQpe1xuICAgIHJldHVybiAkZW50cmllcyhpdCk7XG4gIH1cbn0pOyIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC12YWx1ZXMtZW50cmllc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKVxuICAsICR2YWx1ZXMgPSByZXF1aXJlKCcuL19vYmplY3QtdG8tYXJyYXknKShmYWxzZSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge1xuICB2YWx1ZXM6IGZ1bmN0aW9uIHZhbHVlcyhpdCl7XG4gICAgcmV0dXJuICR2YWx1ZXMoaXQpO1xuICB9XG59KTsiLCJyZXF1aXJlKCcuL193a3MtZGVmaW5lJykoJ2FzeW5jSXRlcmF0b3InKTsiLCJyZXF1aXJlKCcuL193a3MtZGVmaW5lJykoJ29ic2VydmFibGUnKTsiLCJyZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpO1xudmFyIGdsb2JhbCAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGhpZGUgICAgICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCBJdGVyYXRvcnMgICAgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCBUT19TVFJJTkdfVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyk7XG5cbmZvcih2YXIgY29sbGVjdGlvbnMgPSBbJ05vZGVMaXN0JywgJ0RPTVRva2VuTGlzdCcsICdNZWRpYUxpc3QnLCAnU3R5bGVTaGVldExpc3QnLCAnQ1NTUnVsZUxpc3QnXSwgaSA9IDA7IGkgPCA1OyBpKyspe1xuICB2YXIgTkFNRSAgICAgICA9IGNvbGxlY3Rpb25zW2ldXG4gICAgLCBDb2xsZWN0aW9uID0gZ2xvYmFsW05BTUVdXG4gICAgLCBwcm90byAgICAgID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgaWYocHJvdG8gJiYgIXByb3RvW1RPX1NUUklOR19UQUddKWhpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICBJdGVyYXRvcnNbTkFNRV0gPSBJdGVyYXRvcnMuQXJyYXk7XG59IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodXJpKSB7XG4gICAgdmFyIG1pbWUgICA9IHVyaS5zcGxpdCgnLCcpWzBdLnNwbGl0KCc6JylbMV0uc3BsaXQoJzsnKVswXTtcbiAgICB2YXIgYnl0ZXMgID0gYXRvYih1cmkuc3BsaXQoJywnKVsxXSk7XG4gICAgdmFyIGxlbiAgICA9IGJ5dGVzLmxlbmd0aDtcbiAgICB2YXIgYnVmZmVyID0gbmV3IHdpbmRvdy5BcnJheUJ1ZmZlcihsZW4pO1xuICAgIHZhciBhcnIgICAgPSBuZXcgd2luZG93LlVpbnQ4QXJyYXkoYnVmZmVyKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgYXJyW2ldID0gYnl0ZXMuY2hhckNvZGVBdChpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEJsb2IoW2Fycl0sIHsgdHlwZTogbWltZSB9KTtcbn1cblxuLy8gSUUgPj0gMTAsIG1vc3QgbW9kZXJuIGJyb3dzZXJzXG4vLyBUaGUgQmxvYiB0eXBlIGNhbid0IGJlIHBvbHlmaWxsZWQsIHdoaWNoIGlzIHdoeSB0aGVyZSBhcmVuJ3QgYW55IHBvbHlmaWxscyBmb3IgVHlwZWRBcnJheXMgZm9yIG9sZGVyIElFJ3Ncbm1vZHVsZS5leHBvcnRzLnN1cHBvcnRlZCA9IChcbiAgICB0eXBlb2Ygd2luZG93LkhUTUxDYW52YXNFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiB3aW5kb3cuYXRvYiAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2Ygd2luZG93LkJsb2IgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIHdpbmRvdy5BcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2Ygd2luZG93LlVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnXG4pO1xuXG5tb2R1bGUuZXhwb3J0cy5pbml0ID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghbW9kdWxlLmV4cG9ydHMuc3VwcG9ydGVkKSByZXR1cm47XG4gICAgdmFyIENhbnZhc1Byb3RvdHlwZSA9IHdpbmRvdy5IVE1MQ2FudmFzRWxlbWVudC5wcm90b3R5cGU7XG4gICAgXG4gICAgaWYgKCFDYW52YXNQcm90b3R5cGUudG9CbG9iICYmIENhbnZhc1Byb3RvdHlwZS50b0RhdGFVUkwpIHtcbiAgICAgICAgQ2FudmFzUHJvdG90eXBlLnRvQmxvYiA9IGZ1bmN0aW9uIChjYWxsYmFjaywgdHlwZSwgcXVhbGl0eSkge1xuICAgICAgICAgICAgY2FsbGJhY2sobW9kdWxlLmV4cG9ydHModGhpcy50b0RhdGFVUkwodHlwZSwgcXVhbGl0eSkpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qIVxuICBDb3B5cmlnaHQgKGMpIDIwMTYgSmVkIFdhdHNvbi5cbiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChNSVQpLCBzZWVcbiAgaHR0cDovL2plZHdhdHNvbi5naXRodWIuaW8vY2xhc3NuYW1lc1xuKi9cbi8qIGdsb2JhbCBkZWZpbmUgKi9cblxuKGZ1bmN0aW9uICgpIHtcblx0J3VzZSBzdHJpY3QnO1xuXG5cdHZhciBoYXNPd24gPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuXHRmdW5jdGlvbiBjbGFzc05hbWVzICgpIHtcblx0XHR2YXIgY2xhc3NlcyA9IFtdO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBhcmcgPSBhcmd1bWVudHNbaV07XG5cdFx0XHRpZiAoIWFyZykgY29udGludWU7XG5cblx0XHRcdHZhciBhcmdUeXBlID0gdHlwZW9mIGFyZztcblxuXHRcdFx0aWYgKGFyZ1R5cGUgPT09ICdzdHJpbmcnIHx8IGFyZ1R5cGUgPT09ICdudW1iZXInKSB7XG5cdFx0XHRcdGNsYXNzZXMucHVzaChhcmcpO1xuXHRcdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcblx0XHRcdFx0Y2xhc3Nlcy5wdXNoKGNsYXNzTmFtZXMuYXBwbHkobnVsbCwgYXJnKSk7XG5cdFx0XHR9IGVsc2UgaWYgKGFyZ1R5cGUgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdGZvciAodmFyIGtleSBpbiBhcmcpIHtcblx0XHRcdFx0XHRpZiAoaGFzT3duLmNhbGwoYXJnLCBrZXkpICYmIGFyZ1trZXldKSB7XG5cdFx0XHRcdFx0XHRjbGFzc2VzLnB1c2goa2V5KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG5cdH1cblxuXHRpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGNsYXNzTmFtZXM7XG5cdH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZGVmaW5lLmFtZCA9PT0gJ29iamVjdCcgJiYgZGVmaW5lLmFtZCkge1xuXHRcdC8vIHJlZ2lzdGVyIGFzICdjbGFzc25hbWVzJywgY29uc2lzdGVudCB3aXRoIG5wbSBwYWNrYWdlIG5hbWVcblx0XHRkZWZpbmUoJ2NsYXNzbmFtZXMnLCBbXSwgZnVuY3Rpb24gKCkge1xuXHRcdFx0cmV0dXJuIGNsYXNzTmFtZXM7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0d2luZG93LmNsYXNzTmFtZXMgPSBjbGFzc05hbWVzO1xuXHR9XG59KCkpO1xuIiwiIWZ1bmN0aW9uKCkge1xuICB2YXIgZDMgPSB7XG4gICAgdmVyc2lvbjogXCIzLjUuMTdcIlxuICB9O1xuICB2YXIgZDNfYXJyYXlTbGljZSA9IFtdLnNsaWNlLCBkM19hcnJheSA9IGZ1bmN0aW9uKGxpc3QpIHtcbiAgICByZXR1cm4gZDNfYXJyYXlTbGljZS5jYWxsKGxpc3QpO1xuICB9O1xuICB2YXIgZDNfZG9jdW1lbnQgPSB0aGlzLmRvY3VtZW50O1xuICBmdW5jdGlvbiBkM19kb2N1bWVudEVsZW1lbnQobm9kZSkge1xuICAgIHJldHVybiBub2RlICYmIChub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZS5kb2N1bWVudCB8fCBub2RlKS5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cbiAgZnVuY3Rpb24gZDNfd2luZG93KG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZSAmJiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCBub2RlLmRvY3VtZW50ICYmIG5vZGUgfHwgbm9kZS5kZWZhdWx0Vmlldyk7XG4gIH1cbiAgaWYgKGQzX2RvY3VtZW50KSB7XG4gICAgdHJ5IHtcbiAgICAgIGQzX2FycmF5KGQzX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzKVswXS5ub2RlVHlwZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkM19hcnJheSA9IGZ1bmN0aW9uKGxpc3QpIHtcbiAgICAgICAgdmFyIGkgPSBsaXN0Lmxlbmd0aCwgYXJyYXkgPSBuZXcgQXJyYXkoaSk7XG4gICAgICAgIHdoaWxlIChpLS0pIGFycmF5W2ldID0gbGlzdFtpXTtcbiAgICAgICAgcmV0dXJuIGFycmF5O1xuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgaWYgKCFEYXRlLm5vdykgRGF0ZS5ub3cgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gK25ldyBEYXRlKCk7XG4gIH07XG4gIGlmIChkM19kb2N1bWVudCkge1xuICAgIHRyeSB7XG4gICAgICBkM19kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiRElWXCIpLnN0eWxlLnNldFByb3BlcnR5KFwib3BhY2l0eVwiLCAwLCBcIlwiKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdmFyIGQzX2VsZW1lbnRfcHJvdG90eXBlID0gdGhpcy5FbGVtZW50LnByb3RvdHlwZSwgZDNfZWxlbWVudF9zZXRBdHRyaWJ1dGUgPSBkM19lbGVtZW50X3Byb3RvdHlwZS5zZXRBdHRyaWJ1dGUsIGQzX2VsZW1lbnRfc2V0QXR0cmlidXRlTlMgPSBkM19lbGVtZW50X3Byb3RvdHlwZS5zZXRBdHRyaWJ1dGVOUywgZDNfc3R5bGVfcHJvdG90eXBlID0gdGhpcy5DU1NTdHlsZURlY2xhcmF0aW9uLnByb3RvdHlwZSwgZDNfc3R5bGVfc2V0UHJvcGVydHkgPSBkM19zdHlsZV9wcm90b3R5cGUuc2V0UHJvcGVydHk7XG4gICAgICBkM19lbGVtZW50X3Byb3RvdHlwZS5zZXRBdHRyaWJ1dGUgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgICBkM19lbGVtZW50X3NldEF0dHJpYnV0ZS5jYWxsKHRoaXMsIG5hbWUsIHZhbHVlICsgXCJcIik7XG4gICAgICB9O1xuICAgICAgZDNfZWxlbWVudF9wcm90b3R5cGUuc2V0QXR0cmlidXRlTlMgPSBmdW5jdGlvbihzcGFjZSwgbG9jYWwsIHZhbHVlKSB7XG4gICAgICAgIGQzX2VsZW1lbnRfc2V0QXR0cmlidXRlTlMuY2FsbCh0aGlzLCBzcGFjZSwgbG9jYWwsIHZhbHVlICsgXCJcIik7XG4gICAgICB9O1xuICAgICAgZDNfc3R5bGVfcHJvdG90eXBlLnNldFByb3BlcnR5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7XG4gICAgICAgIGQzX3N0eWxlX3NldFByb3BlcnR5LmNhbGwodGhpcywgbmFtZSwgdmFsdWUgKyBcIlwiLCBwcmlvcml0eSk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuICBkMy5hc2NlbmRpbmcgPSBkM19hc2NlbmRpbmc7XG4gIGZ1bmN0aW9uIGQzX2FzY2VuZGluZyhhLCBiKSB7XG4gICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOO1xuICB9XG4gIGQzLmRlc2NlbmRpbmcgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGIgPCBhID8gLTEgOiBiID4gYSA/IDEgOiBiID49IGEgPyAwIDogTmFOO1xuICB9O1xuICBkMy5taW4gPSBmdW5jdGlvbihhcnJheSwgZikge1xuICAgIHZhciBpID0gLTEsIG4gPSBhcnJheS5sZW5ndGgsIGEsIGI7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBhcnJheVtpXSkgIT0gbnVsbCAmJiBiID49IGIpIHtcbiAgICAgICAgYSA9IGI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsICYmIGEgPiBiKSBhID0gYjtcbiAgICB9IGVsc2Uge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSAhPSBudWxsICYmIGIgPj0gYikge1xuICAgICAgICBhID0gYjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpICE9IG51bGwgJiYgYSA+IGIpIGEgPSBiO1xuICAgIH1cbiAgICByZXR1cm4gYTtcbiAgfTtcbiAgZDMubWF4ID0gZnVuY3Rpb24oYXJyYXksIGYpIHtcbiAgICB2YXIgaSA9IC0xLCBuID0gYXJyYXkubGVuZ3RoLCBhLCBiO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKChiID0gYXJyYXlbaV0pICE9IG51bGwgJiYgYiA+PSBiKSB7XG4gICAgICAgIGEgPSBiO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBhcnJheVtpXSkgIT0gbnVsbCAmJiBiID4gYSkgYSA9IGI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkgIT0gbnVsbCAmJiBiID49IGIpIHtcbiAgICAgICAgYSA9IGI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGYuY2FsbChhcnJheSwgYXJyYXlbaV0sIGkpKSAhPSBudWxsICYmIGIgPiBhKSBhID0gYjtcbiAgICB9XG4gICAgcmV0dXJuIGE7XG4gIH07XG4gIGQzLmV4dGVudCA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7XG4gICAgdmFyIGkgPSAtMSwgbiA9IGFycmF5Lmxlbmd0aCwgYSwgYiwgYztcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsICYmIGIgPj0gYikge1xuICAgICAgICBhID0gYyA9IGI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgoYiA9IGFycmF5W2ldKSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChhID4gYikgYSA9IGI7XG4gICAgICAgIGlmIChjIDwgYikgYyA9IGI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkgIT0gbnVsbCAmJiBiID49IGIpIHtcbiAgICAgICAgYSA9IGMgPSBiO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKGIgPSBmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYSA+IGIpIGEgPSBiO1xuICAgICAgICBpZiAoYyA8IGIpIGMgPSBiO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gWyBhLCBjIF07XG4gIH07XG4gIGZ1bmN0aW9uIGQzX251bWJlcih4KSB7XG4gICAgcmV0dXJuIHggPT09IG51bGwgPyBOYU4gOiAreDtcbiAgfVxuICBmdW5jdGlvbiBkM19udW1lcmljKHgpIHtcbiAgICByZXR1cm4gIWlzTmFOKHgpO1xuICB9XG4gIGQzLnN1bSA9IGZ1bmN0aW9uKGFycmF5LCBmKSB7XG4gICAgdmFyIHMgPSAwLCBuID0gYXJyYXkubGVuZ3RoLCBhLCBpID0gLTE7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoZDNfbnVtZXJpYyhhID0gK2FycmF5W2ldKSkgcyArPSBhO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKGQzX251bWVyaWMoYSA9ICtmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkpIHMgKz0gYTtcbiAgICB9XG4gICAgcmV0dXJuIHM7XG4gIH07XG4gIGQzLm1lYW4gPSBmdW5jdGlvbihhcnJheSwgZikge1xuICAgIHZhciBzID0gMCwgbiA9IGFycmF5Lmxlbmd0aCwgYSwgaSA9IC0xLCBqID0gbjtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmIChkM19udW1lcmljKGEgPSBkM19udW1iZXIoYXJyYXlbaV0pKSkgcyArPSBhOyBlbHNlIC0tajtcbiAgICB9IGVsc2Uge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmIChkM19udW1lcmljKGEgPSBkM19udW1iZXIoZi5jYWxsKGFycmF5LCBhcnJheVtpXSwgaSkpKSkgcyArPSBhOyBlbHNlIC0tajtcbiAgICB9XG4gICAgaWYgKGopIHJldHVybiBzIC8gajtcbiAgfTtcbiAgZDMucXVhbnRpbGUgPSBmdW5jdGlvbih2YWx1ZXMsIHApIHtcbiAgICB2YXIgSCA9ICh2YWx1ZXMubGVuZ3RoIC0gMSkgKiBwICsgMSwgaCA9IE1hdGguZmxvb3IoSCksIHYgPSArdmFsdWVzW2ggLSAxXSwgZSA9IEggLSBoO1xuICAgIHJldHVybiBlID8gdiArIGUgKiAodmFsdWVzW2hdIC0gdikgOiB2O1xuICB9O1xuICBkMy5tZWRpYW4gPSBmdW5jdGlvbihhcnJheSwgZikge1xuICAgIHZhciBudW1iZXJzID0gW10sIG4gPSBhcnJheS5sZW5ndGgsIGEsIGkgPSAtMTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmIChkM19udW1lcmljKGEgPSBkM19udW1iZXIoYXJyYXlbaV0pKSkgbnVtYmVycy5wdXNoKGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKGQzX251bWVyaWMoYSA9IGQzX251bWJlcihmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkpKSBudW1iZXJzLnB1c2goYSk7XG4gICAgfVxuICAgIGlmIChudW1iZXJzLmxlbmd0aCkgcmV0dXJuIGQzLnF1YW50aWxlKG51bWJlcnMuc29ydChkM19hc2NlbmRpbmcpLCAuNSk7XG4gIH07XG4gIGQzLnZhcmlhbmNlID0gZnVuY3Rpb24oYXJyYXksIGYpIHtcbiAgICB2YXIgbiA9IGFycmF5Lmxlbmd0aCwgbSA9IDAsIGEsIGQsIHMgPSAwLCBpID0gLTEsIGogPSAwO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICBpZiAoZDNfbnVtZXJpYyhhID0gZDNfbnVtYmVyKGFycmF5W2ldKSkpIHtcbiAgICAgICAgICBkID0gYSAtIG07XG4gICAgICAgICAgbSArPSBkIC8gKytqO1xuICAgICAgICAgIHMgKz0gZCAqIChhIC0gbSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgaWYgKGQzX251bWVyaWMoYSA9IGQzX251bWJlcihmLmNhbGwoYXJyYXksIGFycmF5W2ldLCBpKSkpKSB7XG4gICAgICAgICAgZCA9IGEgLSBtO1xuICAgICAgICAgIG0gKz0gZCAvICsrajtcbiAgICAgICAgICBzICs9IGQgKiAoYSAtIG0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChqID4gMSkgcmV0dXJuIHMgLyAoaiAtIDEpO1xuICB9O1xuICBkMy5kZXZpYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdiA9IGQzLnZhcmlhbmNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHYgPyBNYXRoLnNxcnQodikgOiB2O1xuICB9O1xuICBmdW5jdGlvbiBkM19iaXNlY3Rvcihjb21wYXJlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IGZ1bmN0aW9uKGEsIHgsIGxvLCBoaSkge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIGxvID0gMDtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCA0KSBoaSA9IGEubGVuZ3RoO1xuICAgICAgICB3aGlsZSAobG8gPCBoaSkge1xuICAgICAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+PiAxO1xuICAgICAgICAgIGlmIChjb21wYXJlKGFbbWlkXSwgeCkgPCAwKSBsbyA9IG1pZCArIDE7IGVsc2UgaGkgPSBtaWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvO1xuICAgICAgfSxcbiAgICAgIHJpZ2h0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBsbyA9IDA7XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgNCkgaGkgPSBhLmxlbmd0aDtcbiAgICAgICAgd2hpbGUgKGxvIDwgaGkpIHtcbiAgICAgICAgICB2YXIgbWlkID0gbG8gKyBoaSA+Pj4gMTtcbiAgICAgICAgICBpZiAoY29tcGFyZShhW21pZF0sIHgpID4gMCkgaGkgPSBtaWQ7IGVsc2UgbG8gPSBtaWQgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsbztcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHZhciBkM19iaXNlY3QgPSBkM19iaXNlY3RvcihkM19hc2NlbmRpbmcpO1xuICBkMy5iaXNlY3RMZWZ0ID0gZDNfYmlzZWN0LmxlZnQ7XG4gIGQzLmJpc2VjdCA9IGQzLmJpc2VjdFJpZ2h0ID0gZDNfYmlzZWN0LnJpZ2h0O1xuICBkMy5iaXNlY3RvciA9IGZ1bmN0aW9uKGYpIHtcbiAgICByZXR1cm4gZDNfYmlzZWN0b3IoZi5sZW5ndGggPT09IDEgPyBmdW5jdGlvbihkLCB4KSB7XG4gICAgICByZXR1cm4gZDNfYXNjZW5kaW5nKGYoZCksIHgpO1xuICAgIH0gOiBmKTtcbiAgfTtcbiAgZDMuc2h1ZmZsZSA9IGZ1bmN0aW9uKGFycmF5LCBpMCwgaTEpIHtcbiAgICBpZiAoKG0gPSBhcmd1bWVudHMubGVuZ3RoKSA8IDMpIHtcbiAgICAgIGkxID0gYXJyYXkubGVuZ3RoO1xuICAgICAgaWYgKG0gPCAyKSBpMCA9IDA7XG4gICAgfVxuICAgIHZhciBtID0gaTEgLSBpMCwgdCwgaTtcbiAgICB3aGlsZSAobSkge1xuICAgICAgaSA9IE1hdGgucmFuZG9tKCkgKiBtLS0gfCAwO1xuICAgICAgdCA9IGFycmF5W20gKyBpMF0sIGFycmF5W20gKyBpMF0gPSBhcnJheVtpICsgaTBdLCBhcnJheVtpICsgaTBdID0gdDtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xuICB9O1xuICBkMy5wZXJtdXRlID0gZnVuY3Rpb24oYXJyYXksIGluZGV4ZXMpIHtcbiAgICB2YXIgaSA9IGluZGV4ZXMubGVuZ3RoLCBwZXJtdXRlcyA9IG5ldyBBcnJheShpKTtcbiAgICB3aGlsZSAoaS0tKSBwZXJtdXRlc1tpXSA9IGFycmF5W2luZGV4ZXNbaV1dO1xuICAgIHJldHVybiBwZXJtdXRlcztcbiAgfTtcbiAgZDMucGFpcnMgPSBmdW5jdGlvbihhcnJheSkge1xuICAgIHZhciBpID0gMCwgbiA9IGFycmF5Lmxlbmd0aCAtIDEsIHAwLCBwMSA9IGFycmF5WzBdLCBwYWlycyA9IG5ldyBBcnJheShuIDwgMCA/IDAgOiBuKTtcbiAgICB3aGlsZSAoaSA8IG4pIHBhaXJzW2ldID0gWyBwMCA9IHAxLCBwMSA9IGFycmF5WysraV0gXTtcbiAgICByZXR1cm4gcGFpcnM7XG4gIH07XG4gIGQzLnRyYW5zcG9zZSA9IGZ1bmN0aW9uKG1hdHJpeCkge1xuICAgIGlmICghKG4gPSBtYXRyaXgubGVuZ3RoKSkgcmV0dXJuIFtdO1xuICAgIGZvciAodmFyIGkgPSAtMSwgbSA9IGQzLm1pbihtYXRyaXgsIGQzX3RyYW5zcG9zZUxlbmd0aCksIHRyYW5zcG9zZSA9IG5ldyBBcnJheShtKTsgKytpIDwgbTsgKSB7XG4gICAgICBmb3IgKHZhciBqID0gLTEsIG4sIHJvdyA9IHRyYW5zcG9zZVtpXSA9IG5ldyBBcnJheShuKTsgKytqIDwgbjsgKSB7XG4gICAgICAgIHJvd1tqXSA9IG1hdHJpeFtqXVtpXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zcG9zZTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfdHJhbnNwb3NlTGVuZ3RoKGQpIHtcbiAgICByZXR1cm4gZC5sZW5ndGg7XG4gIH1cbiAgZDMuemlwID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzLnRyYW5zcG9zZShhcmd1bWVudHMpO1xuICB9O1xuICBkMy5rZXlzID0gZnVuY3Rpb24obWFwKSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gbWFwKSBrZXlzLnB1c2goa2V5KTtcbiAgICByZXR1cm4ga2V5cztcbiAgfTtcbiAgZDMudmFsdWVzID0gZnVuY3Rpb24obWFwKSB7XG4gICAgdmFyIHZhbHVlcyA9IFtdO1xuICAgIGZvciAodmFyIGtleSBpbiBtYXApIHZhbHVlcy5wdXNoKG1hcFtrZXldKTtcbiAgICByZXR1cm4gdmFsdWVzO1xuICB9O1xuICBkMy5lbnRyaWVzID0gZnVuY3Rpb24obWFwKSB7XG4gICAgdmFyIGVudHJpZXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gbWFwKSBlbnRyaWVzLnB1c2goe1xuICAgICAga2V5OiBrZXksXG4gICAgICB2YWx1ZTogbWFwW2tleV1cbiAgICB9KTtcbiAgICByZXR1cm4gZW50cmllcztcbiAgfTtcbiAgZDMubWVyZ2UgPSBmdW5jdGlvbihhcnJheXMpIHtcbiAgICB2YXIgbiA9IGFycmF5cy5sZW5ndGgsIG0sIGkgPSAtMSwgaiA9IDAsIG1lcmdlZCwgYXJyYXk7XG4gICAgd2hpbGUgKCsraSA8IG4pIGogKz0gYXJyYXlzW2ldLmxlbmd0aDtcbiAgICBtZXJnZWQgPSBuZXcgQXJyYXkoaik7XG4gICAgd2hpbGUgKC0tbiA+PSAwKSB7XG4gICAgICBhcnJheSA9IGFycmF5c1tuXTtcbiAgICAgIG0gPSBhcnJheS5sZW5ndGg7XG4gICAgICB3aGlsZSAoLS1tID49IDApIHtcbiAgICAgICAgbWVyZ2VkWy0tal0gPSBhcnJheVttXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfTtcbiAgdmFyIGFicyA9IE1hdGguYWJzO1xuICBkMy5yYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBzdGVwKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSB7XG4gICAgICBzdGVwID0gMTtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgICBzdG9wID0gc3RhcnQ7XG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKChzdG9wIC0gc3RhcnQpIC8gc3RlcCA9PT0gSW5maW5pdHkpIHRocm93IG5ldyBFcnJvcihcImluZmluaXRlIHJhbmdlXCIpO1xuICAgIHZhciByYW5nZSA9IFtdLCBrID0gZDNfcmFuZ2VfaW50ZWdlclNjYWxlKGFicyhzdGVwKSksIGkgPSAtMSwgajtcbiAgICBzdGFydCAqPSBrLCBzdG9wICo9IGssIHN0ZXAgKj0gaztcbiAgICBpZiAoc3RlcCA8IDApIHdoaWxlICgoaiA9IHN0YXJ0ICsgc3RlcCAqICsraSkgPiBzdG9wKSByYW5nZS5wdXNoKGogLyBrKTsgZWxzZSB3aGlsZSAoKGogPSBzdGFydCArIHN0ZXAgKiArK2kpIDwgc3RvcCkgcmFuZ2UucHVzaChqIC8gayk7XG4gICAgcmV0dXJuIHJhbmdlO1xuICB9O1xuICBmdW5jdGlvbiBkM19yYW5nZV9pbnRlZ2VyU2NhbGUoeCkge1xuICAgIHZhciBrID0gMTtcbiAgICB3aGlsZSAoeCAqIGsgJSAxKSBrICo9IDEwO1xuICAgIHJldHVybiBrO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2NsYXNzKGN0b3IsIHByb3BlcnRpZXMpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gcHJvcGVydGllcykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0b3IucHJvdG90eXBlLCBrZXksIHtcbiAgICAgICAgdmFsdWU6IHByb3BlcnRpZXNba2V5XSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBkMy5tYXAgPSBmdW5jdGlvbihvYmplY3QsIGYpIHtcbiAgICB2YXIgbWFwID0gbmV3IGQzX01hcCgpO1xuICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBkM19NYXApIHtcbiAgICAgIG9iamVjdC5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgICAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7XG4gICAgICB2YXIgaSA9IC0xLCBuID0gb2JqZWN0Lmxlbmd0aCwgbztcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSB3aGlsZSAoKytpIDwgbikgbWFwLnNldChpLCBvYmplY3RbaV0pOyBlbHNlIHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KGYuY2FsbChvYmplY3QsIG8gPSBvYmplY3RbaV0sIGkpLCBvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkgbWFwLnNldChrZXksIG9iamVjdFtrZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcDtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfTWFwKCkge1xuICAgIHRoaXMuXyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIH1cbiAgdmFyIGQzX21hcF9wcm90byA9IFwiX19wcm90b19fXCIsIGQzX21hcF96ZXJvID0gXCJcXHgwMFwiO1xuICBkM19jbGFzcyhkM19NYXAsIHtcbiAgICBoYXM6IGQzX21hcF9oYXMsXG4gICAgZ2V0OiBmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9bZDNfbWFwX2VzY2FwZShrZXkpXTtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX1tkM19tYXBfZXNjYXBlKGtleSldID0gdmFsdWU7XG4gICAgfSxcbiAgICByZW1vdmU6IGQzX21hcF9yZW1vdmUsXG4gICAga2V5czogZDNfbWFwX2tleXMsXG4gICAgdmFsdWVzOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl8pIHZhbHVlcy5wdXNoKHRoaXMuX1trZXldKTtcbiAgICAgIHJldHVybiB2YWx1ZXM7XG4gICAgfSxcbiAgICBlbnRyaWVzOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlbnRyaWVzID0gW107XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fKSBlbnRyaWVzLnB1c2goe1xuICAgICAgICBrZXk6IGQzX21hcF91bmVzY2FwZShrZXkpLFxuICAgICAgICB2YWx1ZTogdGhpcy5fW2tleV1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGVudHJpZXM7XG4gICAgfSxcbiAgICBzaXplOiBkM19tYXBfc2l6ZSxcbiAgICBlbXB0eTogZDNfbWFwX2VtcHR5LFxuICAgIGZvckVhY2g6IGZ1bmN0aW9uKGYpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl8pIGYuY2FsbCh0aGlzLCBkM19tYXBfdW5lc2NhcGUoa2V5KSwgdGhpcy5fW2tleV0pO1xuICAgIH1cbiAgfSk7XG4gIGZ1bmN0aW9uIGQzX21hcF9lc2NhcGUoa2V5KSB7XG4gICAgcmV0dXJuIChrZXkgKz0gXCJcIikgPT09IGQzX21hcF9wcm90byB8fCBrZXlbMF0gPT09IGQzX21hcF96ZXJvID8gZDNfbWFwX3plcm8gKyBrZXkgOiBrZXk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbWFwX3VuZXNjYXBlKGtleSkge1xuICAgIHJldHVybiAoa2V5ICs9IFwiXCIpWzBdID09PSBkM19tYXBfemVybyA/IGtleS5zbGljZSgxKSA6IGtleTtcbiAgfVxuICBmdW5jdGlvbiBkM19tYXBfaGFzKGtleSkge1xuICAgIHJldHVybiBkM19tYXBfZXNjYXBlKGtleSkgaW4gdGhpcy5fO1xuICB9XG4gIGZ1bmN0aW9uIGQzX21hcF9yZW1vdmUoa2V5KSB7XG4gICAgcmV0dXJuIChrZXkgPSBkM19tYXBfZXNjYXBlKGtleSkpIGluIHRoaXMuXyAmJiBkZWxldGUgdGhpcy5fW2tleV07XG4gIH1cbiAgZnVuY3Rpb24gZDNfbWFwX2tleXMoKSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fKSBrZXlzLnB1c2goZDNfbWFwX3VuZXNjYXBlKGtleSkpO1xuICAgIHJldHVybiBrZXlzO1xuICB9XG4gIGZ1bmN0aW9uIGQzX21hcF9zaXplKCkge1xuICAgIHZhciBzaXplID0gMDtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fKSArK3NpemU7XG4gICAgcmV0dXJuIHNpemU7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbWFwX2VtcHR5KCkge1xuICAgIGZvciAodmFyIGtleSBpbiB0aGlzLl8pIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBkMy5uZXN0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG5lc3QgPSB7fSwga2V5cyA9IFtdLCBzb3J0S2V5cyA9IFtdLCBzb3J0VmFsdWVzLCByb2xsdXA7XG4gICAgZnVuY3Rpb24gbWFwKG1hcFR5cGUsIGFycmF5LCBkZXB0aCkge1xuICAgICAgaWYgKGRlcHRoID49IGtleXMubGVuZ3RoKSByZXR1cm4gcm9sbHVwID8gcm9sbHVwLmNhbGwobmVzdCwgYXJyYXkpIDogc29ydFZhbHVlcyA/IGFycmF5LnNvcnQoc29ydFZhbHVlcykgOiBhcnJheTtcbiAgICAgIHZhciBpID0gLTEsIG4gPSBhcnJheS5sZW5ndGgsIGtleSA9IGtleXNbZGVwdGgrK10sIGtleVZhbHVlLCBvYmplY3QsIHNldHRlciwgdmFsdWVzQnlLZXkgPSBuZXcgZDNfTWFwKCksIHZhbHVlcztcbiAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgIGlmICh2YWx1ZXMgPSB2YWx1ZXNCeUtleS5nZXQoa2V5VmFsdWUgPSBrZXkob2JqZWN0ID0gYXJyYXlbaV0pKSkge1xuICAgICAgICAgIHZhbHVlcy5wdXNoKG9iamVjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWVzQnlLZXkuc2V0KGtleVZhbHVlLCBbIG9iamVjdCBdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1hcFR5cGUpIHtcbiAgICAgICAgb2JqZWN0ID0gbWFwVHlwZSgpO1xuICAgICAgICBzZXR0ZXIgPSBmdW5jdGlvbihrZXlWYWx1ZSwgdmFsdWVzKSB7XG4gICAgICAgICAgb2JqZWN0LnNldChrZXlWYWx1ZSwgbWFwKG1hcFR5cGUsIHZhbHVlcywgZGVwdGgpKTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9iamVjdCA9IHt9O1xuICAgICAgICBzZXR0ZXIgPSBmdW5jdGlvbihrZXlWYWx1ZSwgdmFsdWVzKSB7XG4gICAgICAgICAgb2JqZWN0W2tleVZhbHVlXSA9IG1hcChtYXBUeXBlLCB2YWx1ZXMsIGRlcHRoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHZhbHVlc0J5S2V5LmZvckVhY2goc2V0dGVyKTtcbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVudHJpZXMobWFwLCBkZXB0aCkge1xuICAgICAgaWYgKGRlcHRoID49IGtleXMubGVuZ3RoKSByZXR1cm4gbWFwO1xuICAgICAgdmFyIGFycmF5ID0gW10sIHNvcnRLZXkgPSBzb3J0S2V5c1tkZXB0aCsrXTtcbiAgICAgIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKGtleSwga2V5TWFwKSB7XG4gICAgICAgIGFycmF5LnB1c2goe1xuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIHZhbHVlczogZW50cmllcyhrZXlNYXAsIGRlcHRoKVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNvcnRLZXkgPyBhcnJheS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIHNvcnRLZXkoYS5rZXksIGIua2V5KTtcbiAgICAgIH0pIDogYXJyYXk7XG4gICAgfVxuICAgIG5lc3QubWFwID0gZnVuY3Rpb24oYXJyYXksIG1hcFR5cGUpIHtcbiAgICAgIHJldHVybiBtYXAobWFwVHlwZSwgYXJyYXksIDApO1xuICAgIH07XG4gICAgbmVzdC5lbnRyaWVzID0gZnVuY3Rpb24oYXJyYXkpIHtcbiAgICAgIHJldHVybiBlbnRyaWVzKG1hcChkMy5tYXAsIGFycmF5LCAwKSwgMCk7XG4gICAgfTtcbiAgICBuZXN0LmtleSA9IGZ1bmN0aW9uKGQpIHtcbiAgICAgIGtleXMucHVzaChkKTtcbiAgICAgIHJldHVybiBuZXN0O1xuICAgIH07XG4gICAgbmVzdC5zb3J0S2V5cyA9IGZ1bmN0aW9uKG9yZGVyKSB7XG4gICAgICBzb3J0S2V5c1trZXlzLmxlbmd0aCAtIDFdID0gb3JkZXI7XG4gICAgICByZXR1cm4gbmVzdDtcbiAgICB9O1xuICAgIG5lc3Quc29ydFZhbHVlcyA9IGZ1bmN0aW9uKG9yZGVyKSB7XG4gICAgICBzb3J0VmFsdWVzID0gb3JkZXI7XG4gICAgICByZXR1cm4gbmVzdDtcbiAgICB9O1xuICAgIG5lc3Qucm9sbHVwID0gZnVuY3Rpb24oZikge1xuICAgICAgcm9sbHVwID0gZjtcbiAgICAgIHJldHVybiBuZXN0O1xuICAgIH07XG4gICAgcmV0dXJuIG5lc3Q7XG4gIH07XG4gIGQzLnNldCA9IGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgdmFyIHNldCA9IG5ldyBkM19TZXQoKTtcbiAgICBpZiAoYXJyYXkpIGZvciAodmFyIGkgPSAwLCBuID0gYXJyYXkubGVuZ3RoOyBpIDwgbjsgKytpKSBzZXQuYWRkKGFycmF5W2ldKTtcbiAgICByZXR1cm4gc2V0O1xuICB9O1xuICBmdW5jdGlvbiBkM19TZXQoKSB7XG4gICAgdGhpcy5fID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuICBkM19jbGFzcyhkM19TZXQsIHtcbiAgICBoYXM6IGQzX21hcF9oYXMsXG4gICAgYWRkOiBmdW5jdGlvbihrZXkpIHtcbiAgICAgIHRoaXMuX1tkM19tYXBfZXNjYXBlKGtleSArPSBcIlwiKV0gPSB0cnVlO1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9LFxuICAgIHJlbW92ZTogZDNfbWFwX3JlbW92ZSxcbiAgICB2YWx1ZXM6IGQzX21hcF9rZXlzLFxuICAgIHNpemU6IGQzX21hcF9zaXplLFxuICAgIGVtcHR5OiBkM19tYXBfZW1wdHksXG4gICAgZm9yRWFjaDogZnVuY3Rpb24oZikge1xuICAgICAgZm9yICh2YXIga2V5IGluIHRoaXMuXykgZi5jYWxsKHRoaXMsIGQzX21hcF91bmVzY2FwZShrZXkpKTtcbiAgICB9XG4gIH0pO1xuICBkMy5iZWhhdmlvciA9IHt9O1xuICBmdW5jdGlvbiBkM19pZGVudGl0eShkKSB7XG4gICAgcmV0dXJuIGQ7XG4gIH1cbiAgZDMucmViaW5kID0gZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UpIHtcbiAgICB2YXIgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoLCBtZXRob2Q7XG4gICAgd2hpbGUgKCsraSA8IG4pIHRhcmdldFttZXRob2QgPSBhcmd1bWVudHNbaV1dID0gZDNfcmViaW5kKHRhcmdldCwgc291cmNlLCBzb3VyY2VbbWV0aG9kXSk7XG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfcmViaW5kKHRhcmdldCwgc291cmNlLCBtZXRob2QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgdmFsdWUgPSBtZXRob2QuYXBwbHkoc291cmNlLCBhcmd1bWVudHMpO1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBzb3VyY2UgPyB0YXJnZXQgOiB2YWx1ZTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGQzX3ZlbmRvclN5bWJvbChvYmplY3QsIG5hbWUpIHtcbiAgICBpZiAobmFtZSBpbiBvYmplY3QpIHJldHVybiBuYW1lO1xuICAgIG5hbWUgPSBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSgxKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbiA9IGQzX3ZlbmRvclByZWZpeGVzLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgdmFyIHByZWZpeE5hbWUgPSBkM192ZW5kb3JQcmVmaXhlc1tpXSArIG5hbWU7XG4gICAgICBpZiAocHJlZml4TmFtZSBpbiBvYmplY3QpIHJldHVybiBwcmVmaXhOYW1lO1xuICAgIH1cbiAgfVxuICB2YXIgZDNfdmVuZG9yUHJlZml4ZXMgPSBbIFwid2Via2l0XCIsIFwibXNcIiwgXCJtb3pcIiwgXCJNb3pcIiwgXCJvXCIsIFwiT1wiIF07XG4gIGZ1bmN0aW9uIGQzX25vb3AoKSB7fVxuICBkMy5kaXNwYXRjaCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBkaXNwYXRjaCA9IG5ldyBkM19kaXNwYXRjaCgpLCBpID0gLTEsIG4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHdoaWxlICgrK2kgPCBuKSBkaXNwYXRjaFthcmd1bWVudHNbaV1dID0gZDNfZGlzcGF0Y2hfZXZlbnQoZGlzcGF0Y2gpO1xuICAgIHJldHVybiBkaXNwYXRjaDtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfZGlzcGF0Y2goKSB7fVxuICBkM19kaXNwYXRjaC5wcm90b3R5cGUub24gPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICAgIHZhciBpID0gdHlwZS5pbmRleE9mKFwiLlwiKSwgbmFtZSA9IFwiXCI7XG4gICAgaWYgKGkgPj0gMCkge1xuICAgICAgbmFtZSA9IHR5cGUuc2xpY2UoaSArIDEpO1xuICAgICAgdHlwZSA9IHR5cGUuc2xpY2UoMCwgaSk7XG4gICAgfVxuICAgIGlmICh0eXBlKSByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIgPyB0aGlzW3R5cGVdLm9uKG5hbWUpIDogdGhpc1t0eXBlXS5vbihuYW1lLCBsaXN0ZW5lcik7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIGlmIChsaXN0ZW5lciA9PSBudWxsKSBmb3IgKHR5cGUgaW4gdGhpcykge1xuICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhpc1t0eXBlXS5vbihuYW1lLCBudWxsKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gZDNfZGlzcGF0Y2hfZXZlbnQoZGlzcGF0Y2gpIHtcbiAgICB2YXIgbGlzdGVuZXJzID0gW10sIGxpc3RlbmVyQnlOYW1lID0gbmV3IGQzX01hcCgpO1xuICAgIGZ1bmN0aW9uIGV2ZW50KCkge1xuICAgICAgdmFyIHogPSBsaXN0ZW5lcnMsIGkgPSAtMSwgbiA9IHoubGVuZ3RoLCBsO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGlmIChsID0geltpXS5vbikgbC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgcmV0dXJuIGRpc3BhdGNoO1xuICAgIH1cbiAgICBldmVudC5vbiA9IGZ1bmN0aW9uKG5hbWUsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgbCA9IGxpc3RlbmVyQnlOYW1lLmdldChuYW1lKSwgaTtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIGwgJiYgbC5vbjtcbiAgICAgIGlmIChsKSB7XG4gICAgICAgIGwub24gPSBudWxsO1xuICAgICAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoMCwgaSA9IGxpc3RlbmVycy5pbmRleE9mKGwpKS5jb25jYXQobGlzdGVuZXJzLnNsaWNlKGkgKyAxKSk7XG4gICAgICAgIGxpc3RlbmVyQnlOYW1lLnJlbW92ZShuYW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChsaXN0ZW5lcikgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXJCeU5hbWUuc2V0KG5hbWUsIHtcbiAgICAgICAgb246IGxpc3RlbmVyXG4gICAgICB9KSk7XG4gICAgICByZXR1cm4gZGlzcGF0Y2g7XG4gICAgfTtcbiAgICByZXR1cm4gZXZlbnQ7XG4gIH1cbiAgZDMuZXZlbnQgPSBudWxsO1xuICBmdW5jdGlvbiBkM19ldmVudFByZXZlbnREZWZhdWx0KCkge1xuICAgIGQzLmV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZXZlbnRTb3VyY2UoKSB7XG4gICAgdmFyIGUgPSBkMy5ldmVudCwgcztcbiAgICB3aGlsZSAocyA9IGUuc291cmNlRXZlbnQpIGUgPSBzO1xuICAgIHJldHVybiBlO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2V2ZW50RGlzcGF0Y2godGFyZ2V0KSB7XG4gICAgdmFyIGRpc3BhdGNoID0gbmV3IGQzX2Rpc3BhdGNoKCksIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgZGlzcGF0Y2hbYXJndW1lbnRzW2ldXSA9IGQzX2Rpc3BhdGNoX2V2ZW50KGRpc3BhdGNoKTtcbiAgICBkaXNwYXRjaC5vZiA9IGZ1bmN0aW9uKHRoaXosIGFyZ3VtZW50eikge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUxKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIGUwID0gZTEuc291cmNlRXZlbnQgPSBkMy5ldmVudDtcbiAgICAgICAgICBlMS50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICAgICAgZDMuZXZlbnQgPSBlMTtcbiAgICAgICAgICBkaXNwYXRjaFtlMS50eXBlXS5hcHBseSh0aGl6LCBhcmd1bWVudHopO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGQzLmV2ZW50ID0gZTA7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICByZXR1cm4gZGlzcGF0Y2g7XG4gIH1cbiAgZDMucmVxdW90ZSA9IGZ1bmN0aW9uKHMpIHtcbiAgICByZXR1cm4gcy5yZXBsYWNlKGQzX3JlcXVvdGVfcmUsIFwiXFxcXCQmXCIpO1xuICB9O1xuICB2YXIgZDNfcmVxdW90ZV9yZSA9IC9bXFxcXFxcXlxcJFxcKlxcK1xcP1xcfFxcW1xcXVxcKFxcKVxcLlxce1xcfV0vZztcbiAgdmFyIGQzX3N1YmNsYXNzID0ge30uX19wcm90b19fID8gZnVuY3Rpb24ob2JqZWN0LCBwcm90b3R5cGUpIHtcbiAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlO1xuICB9IDogZnVuY3Rpb24ob2JqZWN0LCBwcm90b3R5cGUpIHtcbiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBwcm90b3R5cGUpIG9iamVjdFtwcm9wZXJ0eV0gPSBwcm90b3R5cGVbcHJvcGVydHldO1xuICB9O1xuICBmdW5jdGlvbiBkM19zZWxlY3Rpb24oZ3JvdXBzKSB7XG4gICAgZDNfc3ViY2xhc3MoZ3JvdXBzLCBkM19zZWxlY3Rpb25Qcm90b3R5cGUpO1xuICAgIHJldHVybiBncm91cHM7XG4gIH1cbiAgdmFyIGQzX3NlbGVjdCA9IGZ1bmN0aW9uKHMsIG4pIHtcbiAgICByZXR1cm4gbi5xdWVyeVNlbGVjdG9yKHMpO1xuICB9LCBkM19zZWxlY3RBbGwgPSBmdW5jdGlvbihzLCBuKSB7XG4gICAgcmV0dXJuIG4ucXVlcnlTZWxlY3RvckFsbChzKTtcbiAgfSwgZDNfc2VsZWN0TWF0Y2hlcyA9IGZ1bmN0aW9uKG4sIHMpIHtcbiAgICB2YXIgZDNfc2VsZWN0TWF0Y2hlciA9IG4ubWF0Y2hlcyB8fCBuW2QzX3ZlbmRvclN5bWJvbChuLCBcIm1hdGNoZXNTZWxlY3RvclwiKV07XG4gICAgZDNfc2VsZWN0TWF0Y2hlcyA9IGZ1bmN0aW9uKG4sIHMpIHtcbiAgICAgIHJldHVybiBkM19zZWxlY3RNYXRjaGVyLmNhbGwobiwgcyk7XG4gICAgfTtcbiAgICByZXR1cm4gZDNfc2VsZWN0TWF0Y2hlcyhuLCBzKTtcbiAgfTtcbiAgaWYgKHR5cGVvZiBTaXp6bGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGQzX3NlbGVjdCA9IGZ1bmN0aW9uKHMsIG4pIHtcbiAgICAgIHJldHVybiBTaXp6bGUocywgbilbMF0gfHwgbnVsbDtcbiAgICB9O1xuICAgIGQzX3NlbGVjdEFsbCA9IFNpenpsZTtcbiAgICBkM19zZWxlY3RNYXRjaGVzID0gU2l6emxlLm1hdGNoZXNTZWxlY3RvcjtcbiAgfVxuICBkMy5zZWxlY3Rpb24gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDMuc2VsZWN0KGQzX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7XG4gIH07XG4gIHZhciBkM19zZWxlY3Rpb25Qcm90b3R5cGUgPSBkMy5zZWxlY3Rpb24ucHJvdG90eXBlID0gW107XG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbihzZWxlY3Rvcikge1xuICAgIHZhciBzdWJncm91cHMgPSBbXSwgc3ViZ3JvdXAsIHN1Ym5vZGUsIGdyb3VwLCBub2RlO1xuICAgIHNlbGVjdG9yID0gZDNfc2VsZWN0aW9uX3NlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB7XG4gICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTtcbiAgICAgIHN1Ymdyb3VwLnBhcmVudE5vZGUgPSAoZ3JvdXAgPSB0aGlzW2pdKS5wYXJlbnROb2RlO1xuICAgICAgZm9yICh2YXIgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOyApIHtcbiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICAgIHN1Ymdyb3VwLnB1c2goc3Vibm9kZSA9IHNlbGVjdG9yLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaikpO1xuICAgICAgICAgIGlmIChzdWJub2RlICYmIFwiX19kYXRhX19cIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWJncm91cC5wdXNoKG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkM19zZWxlY3Rpb24oc3ViZ3JvdXBzKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX3NlbGVjdG9yKHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiID8gc2VsZWN0b3IgOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBkM19zZWxlY3Qoc2VsZWN0b3IsIHRoaXMpO1xuICAgIH07XG4gIH1cbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLnNlbGVjdEFsbCA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7XG4gICAgdmFyIHN1Ymdyb3VwcyA9IFtdLCBzdWJncm91cCwgbm9kZTtcbiAgICBzZWxlY3RvciA9IGQzX3NlbGVjdGlvbl9zZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgZm9yICh2YXIgaiA9IC0xLCBtID0gdGhpcy5sZW5ndGg7ICsraiA8IG07ICkge1xuICAgICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47ICkge1xuICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBkM19hcnJheShzZWxlY3Rvci5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGopKSk7XG4gICAgICAgICAgc3ViZ3JvdXAucGFyZW50Tm9kZSA9IG5vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGQzX3NlbGVjdGlvbihzdWJncm91cHMpO1xuICB9O1xuICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fc2VsZWN0b3JBbGwoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgPyBzZWxlY3RvciA6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGQzX3NlbGVjdEFsbChzZWxlY3RvciwgdGhpcyk7XG4gICAgfTtcbiAgfVxuICB2YXIgZDNfbnNYaHRtbCA9IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiO1xuICB2YXIgZDNfbnNQcmVmaXggPSB7XG4gICAgc3ZnOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gICAgeGh0bWw6IGQzX25zWGh0bWwsXG4gICAgeGxpbms6IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFxuICAgIHhtbDogXCJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2VcIixcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zL1wiXG4gIH07XG4gIGQzLm5zID0ge1xuICAgIHByZWZpeDogZDNfbnNQcmVmaXgsXG4gICAgcXVhbGlmeTogZnVuY3Rpb24obmFtZSkge1xuICAgICAgdmFyIGkgPSBuYW1lLmluZGV4T2YoXCI6XCIpLCBwcmVmaXggPSBuYW1lO1xuICAgICAgaWYgKGkgPj0gMCAmJiAocHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKSkgIT09IFwieG1sbnNcIikgbmFtZSA9IG5hbWUuc2xpY2UoaSArIDEpO1xuICAgICAgcmV0dXJuIGQzX25zUHJlZml4Lmhhc093blByb3BlcnR5KHByZWZpeCkgPyB7XG4gICAgICAgIHNwYWNlOiBkM19uc1ByZWZpeFtwcmVmaXhdLFxuICAgICAgICBsb2NhbDogbmFtZVxuICAgICAgfSA6IG5hbWU7XG4gICAgfVxuICB9O1xuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuYXR0ciA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTtcbiAgICAgICAgbmFtZSA9IGQzLm5zLnF1YWxpZnkobmFtZSk7XG4gICAgICAgIHJldHVybiBuYW1lLmxvY2FsID8gbm9kZS5nZXRBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKSA6IG5vZGUuZ2V0QXR0cmlidXRlKG5hbWUpO1xuICAgICAgfVxuICAgICAgZm9yICh2YWx1ZSBpbiBuYW1lKSB0aGlzLmVhY2goZDNfc2VsZWN0aW9uX2F0dHIodmFsdWUsIG5hbWVbdmFsdWVdKSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZWFjaChkM19zZWxlY3Rpb25fYXR0cihuYW1lLCB2YWx1ZSkpO1xuICB9O1xuICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fYXR0cihuYW1lLCB2YWx1ZSkge1xuICAgIG5hbWUgPSBkMy5ucy5xdWFsaWZ5KG5hbWUpO1xuICAgIGZ1bmN0aW9uIGF0dHJOdWxsKCkge1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGF0dHJOdWxsTlMoKSB7XG4gICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhdHRyQ29uc3RhbnQoKSB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKCkge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsLCB2YWx1ZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGF0dHJGdW5jdGlvbigpIHtcbiAgICAgIHZhciB4ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIGlmICh4ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOyBlbHNlIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhdHRyRnVuY3Rpb25OUygpIHtcbiAgICAgIHZhciB4ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIGlmICh4ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCk7IGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsLCB4KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBuYW1lLmxvY2FsID8gYXR0ck51bGxOUyA6IGF0dHJOdWxsIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24gOiBuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQ7XG4gIH1cbiAgZnVuY3Rpb24gZDNfY29sbGFwc2Uocykge1xuICAgIHJldHVybiBzLnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKTtcbiAgfVxuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuY2xhc3NlZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKSwgbiA9IChuYW1lID0gZDNfc2VsZWN0aW9uX2NsYXNzZXMobmFtZSkpLmxlbmd0aCwgaSA9IC0xO1xuICAgICAgICBpZiAodmFsdWUgPSBub2RlLmNsYXNzTGlzdCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIXZhbHVlLmNvbnRhaW5zKG5hbWVbaV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpO1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWQzX3NlbGVjdGlvbl9jbGFzc2VkUmUobmFtZVtpXSkudGVzdCh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFsdWUgaW4gbmFtZSkgdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9jbGFzc2VkKHZhbHVlLCBuYW1lW3ZhbHVlXSkpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVhY2goZDNfc2VsZWN0aW9uX2NsYXNzZWQobmFtZSwgdmFsdWUpKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2NsYXNzZWRSZShuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoXCIoPzpefFxcXFxzKylcIiArIGQzLnJlcXVvdGUobmFtZSkgKyBcIig/OlxcXFxzK3wkKVwiLCBcImdcIik7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2NsYXNzZXMobmFtZSkge1xuICAgIHJldHVybiAobmFtZSArIFwiXCIpLnRyaW0oKS5zcGxpdCgvXnxcXHMrLyk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2NsYXNzZWQobmFtZSwgdmFsdWUpIHtcbiAgICBuYW1lID0gZDNfc2VsZWN0aW9uX2NsYXNzZXMobmFtZSkubWFwKGQzX3NlbGVjdGlvbl9jbGFzc2VkTmFtZSk7XG4gICAgdmFyIG4gPSBuYW1lLmxlbmd0aDtcbiAgICBmdW5jdGlvbiBjbGFzc2VkQ29uc3RhbnQoKSB7XG4gICAgICB2YXIgaSA9IC0xO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIG5hbWVbaV0odGhpcywgdmFsdWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaSA9IC0xLCB4ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBuYW1lW2ldKHRoaXMsIHgpO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBjbGFzc2VkRnVuY3Rpb24gOiBjbGFzc2VkQ29uc3RhbnQ7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2NsYXNzZWROYW1lKG5hbWUpIHtcbiAgICB2YXIgcmUgPSBkM19zZWxlY3Rpb25fY2xhc3NlZFJlKG5hbWUpO1xuICAgIHJldHVybiBmdW5jdGlvbihub2RlLCB2YWx1ZSkge1xuICAgICAgaWYgKGMgPSBub2RlLmNsYXNzTGlzdCkgcmV0dXJuIHZhbHVlID8gYy5hZGQobmFtZSkgOiBjLnJlbW92ZShuYW1lKTtcbiAgICAgIHZhciBjID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSB8fCBcIlwiO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIHJlLmxhc3RJbmRleCA9IDA7XG4gICAgICAgIGlmICghcmUudGVzdChjKSkgbm9kZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLCBkM19jb2xsYXBzZShjICsgXCIgXCIgKyBuYW1lKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsIGQzX2NvbGxhcHNlKGMucmVwbGFjZShyZSwgXCIgXCIpKSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuc3R5bGUgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHtcbiAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgaWYgKG4gPCAzKSB7XG4gICAgICBpZiAodHlwZW9mIG5hbWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKG4gPCAyKSB2YWx1ZSA9IFwiXCI7XG4gICAgICAgIGZvciAocHJpb3JpdHkgaW4gbmFtZSkgdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9zdHlsZShwcmlvcml0eSwgbmFtZVtwcmlvcml0eV0sIHZhbHVlKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgaWYgKG4gPCAyKSB7XG4gICAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7XG4gICAgICAgIHJldHVybiBkM193aW5kb3cobm9kZSkuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpO1xuICAgICAgfVxuICAgICAgcHJpb3JpdHkgPSBcIlwiO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9zdHlsZShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX3N0eWxlKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICAgIGZ1bmN0aW9uIHN0eWxlTnVsbCgpIHtcbiAgICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQoKSB7XG4gICAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24oKSB7XG4gICAgICB2YXIgeCA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBpZiAoeCA9PSBudWxsKSB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpOyBlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgeCwgcHJpb3JpdHkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHN0eWxlTnVsbCA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gc3R5bGVGdW5jdGlvbiA6IHN0eWxlQ29uc3RhbnQ7XG4gIH1cbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLnByb3BlcnR5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHRoaXMubm9kZSgpW25hbWVdO1xuICAgICAgZm9yICh2YWx1ZSBpbiBuYW1lKSB0aGlzLmVhY2goZDNfc2VsZWN0aW9uX3Byb3BlcnR5KHZhbHVlLCBuYW1lW3ZhbHVlXSkpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVhY2goZDNfc2VsZWN0aW9uX3Byb3BlcnR5KG5hbWUsIHZhbHVlKSk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9wcm9wZXJ0eShuYW1lLCB2YWx1ZSkge1xuICAgIGZ1bmN0aW9uIHByb3BlcnR5TnVsbCgpIHtcbiAgICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9wZXJ0eUNvbnN0YW50KCkge1xuICAgICAgdGhpc1tuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9wZXJ0eUZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHggPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgaWYgKHggPT0gbnVsbCkgZGVsZXRlIHRoaXNbbmFtZV07IGVsc2UgdGhpc1tuYW1lXSA9IHg7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gcHJvcGVydHlOdWxsIDogdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBwcm9wZXJ0eUZ1bmN0aW9uIDogcHJvcGVydHlDb25zdGFudDtcbiAgfVxuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUudGV4dCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLmVhY2godHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIHRoaXMudGV4dENvbnRlbnQgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgICB9IDogdmFsdWUgPT0gbnVsbCA/IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgfSA6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuICAgIH0pIDogdGhpcy5ub2RlKCkudGV4dENvbnRlbnQ7XG4gIH07XG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5odG1sID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMuZWFjaCh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyBcIlwiIDogdjtcbiAgICB9IDogdmFsdWUgPT0gbnVsbCA/IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5pbm5lckhUTUwgPSBcIlwiO1xuICAgIH0gOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7XG4gICAgfSkgOiB0aGlzLm5vZGUoKS5pbm5lckhUTUw7XG4gIH07XG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgbmFtZSA9IGQzX3NlbGVjdGlvbl9jcmVhdG9yKG5hbWUpO1xuICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmFwcGVuZENoaWxkKG5hbWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgfSk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9jcmVhdG9yKG5hbWUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoKSB7XG4gICAgICB2YXIgZG9jdW1lbnQgPSB0aGlzLm93bmVyRG9jdW1lbnQsIG5hbWVzcGFjZSA9IHRoaXMubmFtZXNwYWNlVVJJO1xuICAgICAgcmV0dXJuIG5hbWVzcGFjZSA9PT0gZDNfbnNYaHRtbCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJID09PSBkM19uc1hodG1sID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKSA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2UsIG5hbWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmVhdGVOUygpIHtcbiAgICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIG5hbWUgPT09IFwiZnVuY3Rpb25cIiA/IG5hbWUgOiAobmFtZSA9IGQzLm5zLnF1YWxpZnkobmFtZSkpLmxvY2FsID8gY3JlYXRlTlMgOiBjcmVhdGU7XG4gIH1cbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uKG5hbWUsIGJlZm9yZSkge1xuICAgIG5hbWUgPSBkM19zZWxlY3Rpb25fY3JlYXRvcihuYW1lKTtcbiAgICBiZWZvcmUgPSBkM19zZWxlY3Rpb25fc2VsZWN0b3IoYmVmb3JlKTtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobmFtZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBiZWZvcmUuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCBudWxsKTtcbiAgICB9KTtcbiAgfTtcbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmVhY2goZDNfc2VsZWN0aW9uUmVtb3ZlKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uUmVtb3ZlKCkge1xuICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpO1xuICB9XG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5kYXRhID0gZnVuY3Rpb24odmFsdWUsIGtleSkge1xuICAgIHZhciBpID0gLTEsIG4gPSB0aGlzLmxlbmd0aCwgZ3JvdXAsIG5vZGU7XG4gICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICB2YWx1ZSA9IG5ldyBBcnJheShuID0gKGdyb3VwID0gdGhpc1swXSkubGVuZ3RoKTtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgICB2YWx1ZVtpXSA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYmluZChncm91cCwgZ3JvdXBEYXRhKSB7XG4gICAgICB2YXIgaSwgbiA9IGdyb3VwLmxlbmd0aCwgbSA9IGdyb3VwRGF0YS5sZW5ndGgsIG4wID0gTWF0aC5taW4obiwgbSksIHVwZGF0ZU5vZGVzID0gbmV3IEFycmF5KG0pLCBlbnRlck5vZGVzID0gbmV3IEFycmF5KG0pLCBleGl0Tm9kZXMgPSBuZXcgQXJyYXkobiksIG5vZGUsIG5vZGVEYXRhO1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICB2YXIgbm9kZUJ5S2V5VmFsdWUgPSBuZXcgZDNfTWFwKCksIGtleVZhbHVlcyA9IG5ldyBBcnJheShuKSwga2V5VmFsdWU7XG4gICAgICAgIGZvciAoaSA9IC0xOyArK2kgPCBuOyApIHtcbiAgICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgICAgICBpZiAobm9kZUJ5S2V5VmFsdWUuaGFzKGtleVZhbHVlID0ga2V5LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSkpKSB7XG4gICAgICAgICAgICAgIGV4aXROb2Rlc1tpXSA9IG5vZGU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBub2RlQnlLZXlWYWx1ZS5zZXQoa2V5VmFsdWUsIG5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAga2V5VmFsdWVzW2ldID0ga2V5VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IC0xOyArK2kgPCBtOyApIHtcbiAgICAgICAgICBpZiAoIShub2RlID0gbm9kZUJ5S2V5VmFsdWUuZ2V0KGtleVZhbHVlID0ga2V5LmNhbGwoZ3JvdXBEYXRhLCBub2RlRGF0YSA9IGdyb3VwRGF0YVtpXSwgaSkpKSkge1xuICAgICAgICAgICAgZW50ZXJOb2Rlc1tpXSA9IGQzX3NlbGVjdGlvbl9kYXRhTm9kZShub2RlRGF0YSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChub2RlICE9PSB0cnVlKSB7XG4gICAgICAgICAgICB1cGRhdGVOb2Rlc1tpXSA9IG5vZGU7XG4gICAgICAgICAgICBub2RlLl9fZGF0YV9fID0gbm9kZURhdGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5vZGVCeUtleVZhbHVlLnNldChrZXlWYWx1ZSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChpID0gLTE7ICsraSA8IG47ICkge1xuICAgICAgICAgIGlmIChpIGluIGtleVZhbHVlcyAmJiBub2RlQnlLZXlWYWx1ZS5nZXQoa2V5VmFsdWVzW2ldKSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgZXhpdE5vZGVzW2ldID0gZ3JvdXBbaV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGkgPSAtMTsgKytpIDwgbjA7ICkge1xuICAgICAgICAgIG5vZGUgPSBncm91cFtpXTtcbiAgICAgICAgICBub2RlRGF0YSA9IGdyb3VwRGF0YVtpXTtcbiAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgbm9kZS5fX2RhdGFfXyA9IG5vZGVEYXRhO1xuICAgICAgICAgICAgdXBkYXRlTm9kZXNbaV0gPSBub2RlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbnRlck5vZGVzW2ldID0gZDNfc2VsZWN0aW9uX2RhdGFOb2RlKG5vZGVEYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7aSA8IG07ICsraSkge1xuICAgICAgICAgIGVudGVyTm9kZXNbaV0gPSBkM19zZWxlY3Rpb25fZGF0YU5vZGUoZ3JvdXBEYXRhW2ldKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKDtpIDwgbjsgKytpKSB7XG4gICAgICAgICAgZXhpdE5vZGVzW2ldID0gZ3JvdXBbaV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVudGVyTm9kZXMudXBkYXRlID0gdXBkYXRlTm9kZXM7XG4gICAgICBlbnRlck5vZGVzLnBhcmVudE5vZGUgPSB1cGRhdGVOb2Rlcy5wYXJlbnROb2RlID0gZXhpdE5vZGVzLnBhcmVudE5vZGUgPSBncm91cC5wYXJlbnROb2RlO1xuICAgICAgZW50ZXIucHVzaChlbnRlck5vZGVzKTtcbiAgICAgIHVwZGF0ZS5wdXNoKHVwZGF0ZU5vZGVzKTtcbiAgICAgIGV4aXQucHVzaChleGl0Tm9kZXMpO1xuICAgIH1cbiAgICB2YXIgZW50ZXIgPSBkM19zZWxlY3Rpb25fZW50ZXIoW10pLCB1cGRhdGUgPSBkM19zZWxlY3Rpb24oW10pLCBleGl0ID0gZDNfc2VsZWN0aW9uKFtdKTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgIGJpbmQoZ3JvdXAgPSB0aGlzW2ldLCB2YWx1ZS5jYWxsKGdyb3VwLCBncm91cC5wYXJlbnROb2RlLl9fZGF0YV9fLCBpKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgIGJpbmQoZ3JvdXAgPSB0aGlzW2ldLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHVwZGF0ZS5lbnRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGVudGVyO1xuICAgIH07XG4gICAgdXBkYXRlLmV4aXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleGl0O1xuICAgIH07XG4gICAgcmV0dXJuIHVwZGF0ZTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2RhdGFOb2RlKGRhdGEpIHtcbiAgICByZXR1cm4ge1xuICAgICAgX19kYXRhX186IGRhdGFcbiAgICB9O1xuICB9XG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5kYXR1bSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLnByb3BlcnR5KFwiX19kYXRhX19cIiwgdmFsdWUpIDogdGhpcy5wcm9wZXJ0eShcIl9fZGF0YV9fXCIpO1xuICB9O1xuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuZmlsdGVyID0gZnVuY3Rpb24oZmlsdGVyKSB7XG4gICAgdmFyIHN1Ymdyb3VwcyA9IFtdLCBzdWJncm91cCwgZ3JvdXAsIG5vZGU7XG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgIT09IFwiZnVuY3Rpb25cIikgZmlsdGVyID0gZDNfc2VsZWN0aW9uX2ZpbHRlcihmaWx0ZXIpO1xuICAgIGZvciAodmFyIGogPSAwLCBtID0gdGhpcy5sZW5ndGg7IGogPCBtOyBqKyspIHtcbiAgICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pO1xuICAgICAgc3ViZ3JvdXAucGFyZW50Tm9kZSA9IChncm91cCA9IHRoaXNbal0pLnBhcmVudE5vZGU7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgZmlsdGVyLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaikpIHtcbiAgICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkM19zZWxlY3Rpb24oc3ViZ3JvdXBzKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2ZpbHRlcihzZWxlY3Rvcikge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBkM19zZWxlY3RNYXRjaGVzKHRoaXMsIHNlbGVjdG9yKTtcbiAgICB9O1xuICB9XG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5vcmRlciA9IGZ1bmN0aW9uKCkge1xuICAgIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOyApIHtcbiAgICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IGdyb3VwLmxlbmd0aCAtIDEsIG5leHQgPSBncm91cFtpXSwgbm9kZTsgLS1pID49IDA7ICkge1xuICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7XG4gICAgICAgICAgaWYgKG5leHQgJiYgbmV4dCAhPT0gbm9kZS5uZXh0U2libGluZykgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTtcbiAgICAgICAgICBuZXh0ID0gbm9kZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLnNvcnQgPSBmdW5jdGlvbihjb21wYXJhdG9yKSB7XG4gICAgY29tcGFyYXRvciA9IGQzX3NlbGVjdGlvbl9zb3J0Q29tcGFyYXRvci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOyApIHRoaXNbal0uc29ydChjb21wYXJhdG9yKTtcbiAgICByZXR1cm4gdGhpcy5vcmRlcigpO1xuICB9O1xuICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fc29ydENvbXBhcmF0b3IoY29tcGFyYXRvcikge1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgY29tcGFyYXRvciA9IGQzX2FzY2VuZGluZztcbiAgICByZXR1cm4gZnVuY3Rpb24oYSwgYikge1xuICAgICAgcmV0dXJuIGEgJiYgYiA/IGNvbXBhcmF0b3IoYS5fX2RhdGFfXywgYi5fX2RhdGFfXykgOiAhYSAtICFiO1xuICAgIH07XG4gIH1cbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLmVhY2ggPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgIHJldHVybiBkM19zZWxlY3Rpb25fZWFjaCh0aGlzLCBmdW5jdGlvbihub2RlLCBpLCBqKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGopO1xuICAgIH0pO1xuICB9O1xuICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fZWFjaChncm91cHMsIGNhbGxiYWNrKSB7XG4gICAgZm9yICh2YXIgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgaisrKSB7XG4gICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgY2FsbGJhY2sobm9kZSwgaSwgaik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBncm91cHM7XG4gIH1cbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbihjYWxsYmFjaykge1xuICAgIHZhciBhcmdzID0gZDNfYXJyYXkoYXJndW1lbnRzKTtcbiAgICBjYWxsYmFjay5hcHBseShhcmdzWzBdID0gdGhpcywgYXJncyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAhdGhpcy5ub2RlKCk7XG4gIH07XG4gIGQzX3NlbGVjdGlvblByb3RvdHlwZS5ub2RlID0gZnVuY3Rpb24oKSB7XG4gICAgZm9yICh2YXIgaiA9IDAsIG0gPSB0aGlzLmxlbmd0aDsgaiA8IG07IGorKykge1xuICAgICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldO1xuICAgICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBuID0gMDtcbiAgICBkM19zZWxlY3Rpb25fZWFjaCh0aGlzLCBmdW5jdGlvbigpIHtcbiAgICAgICsrbjtcbiAgICB9KTtcbiAgICByZXR1cm4gbjtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX2VudGVyKHNlbGVjdGlvbikge1xuICAgIGQzX3N1YmNsYXNzKHNlbGVjdGlvbiwgZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlKTtcbiAgICByZXR1cm4gc2VsZWN0aW9uO1xuICB9XG4gIHZhciBkM19zZWxlY3Rpb25fZW50ZXJQcm90b3R5cGUgPSBbXTtcbiAgZDMuc2VsZWN0aW9uLmVudGVyID0gZDNfc2VsZWN0aW9uX2VudGVyO1xuICBkMy5zZWxlY3Rpb24uZW50ZXIucHJvdG90eXBlID0gZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlO1xuICBkM19zZWxlY3Rpb25fZW50ZXJQcm90b3R5cGUuYXBwZW5kID0gZDNfc2VsZWN0aW9uUHJvdG90eXBlLmFwcGVuZDtcbiAgZDNfc2VsZWN0aW9uX2VudGVyUHJvdG90eXBlLmVtcHR5ID0gZDNfc2VsZWN0aW9uUHJvdG90eXBlLmVtcHR5O1xuICBkM19zZWxlY3Rpb25fZW50ZXJQcm90b3R5cGUubm9kZSA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5ub2RlO1xuICBkM19zZWxlY3Rpb25fZW50ZXJQcm90b3R5cGUuY2FsbCA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5jYWxsO1xuICBkM19zZWxlY3Rpb25fZW50ZXJQcm90b3R5cGUuc2l6ZSA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5zaXplO1xuICBkM19zZWxlY3Rpb25fZW50ZXJQcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgICB2YXIgc3ViZ3JvdXBzID0gW10sIHN1Ymdyb3VwLCBzdWJub2RlLCB1cGdyb3VwLCBncm91cCwgbm9kZTtcbiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB7XG4gICAgICB1cGdyb3VwID0gKGdyb3VwID0gdGhpc1tqXSkudXBkYXRlO1xuICAgICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7XG4gICAgICBzdWJncm91cC5wYXJlbnROb2RlID0gZ3JvdXAucGFyZW50Tm9kZTtcbiAgICAgIGZvciAodmFyIGkgPSAtMSwgbiA9IGdyb3VwLmxlbmd0aDsgKytpIDwgbjsgKSB7XG4gICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgICBzdWJncm91cC5wdXNoKHVwZ3JvdXBbaV0gPSBzdWJub2RlID0gc2VsZWN0b3IuY2FsbChncm91cC5wYXJlbnROb2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKSk7XG4gICAgICAgICAgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3ViZ3JvdXAucHVzaChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZDNfc2VsZWN0aW9uKHN1Ymdyb3Vwcyk7XG4gIH07XG4gIGQzX3NlbGVjdGlvbl9lbnRlclByb3RvdHlwZS5pbnNlcnQgPSBmdW5jdGlvbihuYW1lLCBiZWZvcmUpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIGJlZm9yZSA9IGQzX3NlbGVjdGlvbl9lbnRlckluc2VydEJlZm9yZSh0aGlzKTtcbiAgICByZXR1cm4gZDNfc2VsZWN0aW9uUHJvdG90eXBlLmluc2VydC5jYWxsKHRoaXMsIG5hbWUsIGJlZm9yZSk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9lbnRlckluc2VydEJlZm9yZShlbnRlcikge1xuICAgIHZhciBpMCwgajA7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGQsIGksIGopIHtcbiAgICAgIHZhciBncm91cCA9IGVudGVyW2pdLnVwZGF0ZSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTtcbiAgICAgIGlmIChqICE9IGowKSBqMCA9IGosIGkwID0gMDtcbiAgICAgIGlmIChpID49IGkwKSBpMCA9IGkgKyAxO1xuICAgICAgd2hpbGUgKCEobm9kZSA9IGdyb3VwW2kwXSkgJiYgKytpMCA8IG4pIDtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH07XG4gIH1cbiAgZDMuc2VsZWN0ID0gZnVuY3Rpb24obm9kZSkge1xuICAgIHZhciBncm91cDtcbiAgICBpZiAodHlwZW9mIG5vZGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGdyb3VwID0gWyBkM19zZWxlY3Qobm9kZSwgZDNfZG9jdW1lbnQpIF07XG4gICAgICBncm91cC5wYXJlbnROb2RlID0gZDNfZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICBncm91cCA9IFsgbm9kZSBdO1xuICAgICAgZ3JvdXAucGFyZW50Tm9kZSA9IGQzX2RvY3VtZW50RWxlbWVudChub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIGQzX3NlbGVjdGlvbihbIGdyb3VwIF0pO1xuICB9O1xuICBkMy5zZWxlY3RBbGwgPSBmdW5jdGlvbihub2Rlcykge1xuICAgIHZhciBncm91cDtcbiAgICBpZiAodHlwZW9mIG5vZGVzID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBncm91cCA9IGQzX2FycmF5KGQzX3NlbGVjdEFsbChub2RlcywgZDNfZG9jdW1lbnQpKTtcbiAgICAgIGdyb3VwLnBhcmVudE5vZGUgPSBkM19kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyb3VwID0gZDNfYXJyYXkobm9kZXMpO1xuICAgICAgZ3JvdXAucGFyZW50Tm9kZSA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiBkM19zZWxlY3Rpb24oWyBncm91cCBdKTtcbiAgfTtcbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLm9uID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIsIGNhcHR1cmUpIHtcbiAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgaWYgKG4gPCAzKSB7XG4gICAgICBpZiAodHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKG4gPCAyKSBsaXN0ZW5lciA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNhcHR1cmUgaW4gdHlwZSkgdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9vbihjYXB0dXJlLCB0eXBlW2NhcHR1cmVdLCBsaXN0ZW5lcikpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmIChuIDwgMikgcmV0dXJuIChuID0gdGhpcy5ub2RlKClbXCJfX29uXCIgKyB0eXBlXSkgJiYgbi5fO1xuICAgICAgY2FwdHVyZSA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lYWNoKGQzX3NlbGVjdGlvbl9vbih0eXBlLCBsaXN0ZW5lciwgY2FwdHVyZSkpO1xuICB9O1xuICBmdW5jdGlvbiBkM19zZWxlY3Rpb25fb24odHlwZSwgbGlzdGVuZXIsIGNhcHR1cmUpIHtcbiAgICB2YXIgbmFtZSA9IFwiX19vblwiICsgdHlwZSwgaSA9IHR5cGUuaW5kZXhPZihcIi5cIiksIHdyYXAgPSBkM19zZWxlY3Rpb25fb25MaXN0ZW5lcjtcbiAgICBpZiAoaSA+IDApIHR5cGUgPSB0eXBlLnNsaWNlKDAsIGkpO1xuICAgIHZhciBmaWx0ZXIgPSBkM19zZWxlY3Rpb25fb25GaWx0ZXJzLmdldCh0eXBlKTtcbiAgICBpZiAoZmlsdGVyKSB0eXBlID0gZmlsdGVyLCB3cmFwID0gZDNfc2VsZWN0aW9uX29uRmlsdGVyO1xuICAgIGZ1bmN0aW9uIG9uUmVtb3ZlKCkge1xuICAgICAgdmFyIGwgPSB0aGlzW25hbWVdO1xuICAgICAgaWYgKGwpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGwsIGwuJCk7XG4gICAgICAgIGRlbGV0ZSB0aGlzW25hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBvbkFkZCgpIHtcbiAgICAgIHZhciBsID0gd3JhcChsaXN0ZW5lciwgZDNfYXJyYXkoYXJndW1lbnRzKSk7XG4gICAgICBvblJlbW92ZS5jYWxsKHRoaXMpO1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGUsIHRoaXNbbmFtZV0gPSBsLCBsLiQgPSBjYXB0dXJlKTtcbiAgICAgIGwuXyA9IGxpc3RlbmVyO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZW1vdmVBbGwoKSB7XG4gICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKFwiXl9fb24oW14uXSspXCIgKyBkMy5yZXF1b3RlKHR5cGUpICsgXCIkXCIpLCBtYXRjaDtcbiAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICBpZiAobWF0Y2ggPSBuYW1lLm1hdGNoKHJlKSkge1xuICAgICAgICAgIHZhciBsID0gdGhpc1tuYW1lXTtcbiAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobWF0Y2hbMV0sIGwsIGwuJCk7XG4gICAgICAgICAgZGVsZXRlIHRoaXNbbmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGkgPyBsaXN0ZW5lciA/IG9uQWRkIDogb25SZW1vdmUgOiBsaXN0ZW5lciA/IGQzX25vb3AgOiByZW1vdmVBbGw7XG4gIH1cbiAgdmFyIGQzX3NlbGVjdGlvbl9vbkZpbHRlcnMgPSBkMy5tYXAoe1xuICAgIG1vdXNlZW50ZXI6IFwibW91c2VvdmVyXCIsXG4gICAgbW91c2VsZWF2ZTogXCJtb3VzZW91dFwiXG4gIH0pO1xuICBpZiAoZDNfZG9jdW1lbnQpIHtcbiAgICBkM19zZWxlY3Rpb25fb25GaWx0ZXJzLmZvckVhY2goZnVuY3Rpb24oaykge1xuICAgICAgaWYgKFwib25cIiArIGsgaW4gZDNfZG9jdW1lbnQpIGQzX3NlbGVjdGlvbl9vbkZpbHRlcnMucmVtb3ZlKGspO1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9vbkxpc3RlbmVyKGxpc3RlbmVyLCBhcmd1bWVudHopIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oZSkge1xuICAgICAgdmFyIG8gPSBkMy5ldmVudDtcbiAgICAgIGQzLmV2ZW50ID0gZTtcbiAgICAgIGFyZ3VtZW50elswXSA9IHRoaXMuX19kYXRhX187XG4gICAgICB0cnkge1xuICAgICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHopO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZDMuZXZlbnQgPSBvO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZDNfc2VsZWN0aW9uX29uRmlsdGVyKGxpc3RlbmVyLCBhcmd1bWVudHopIHtcbiAgICB2YXIgbCA9IGQzX3NlbGVjdGlvbl9vbkxpc3RlbmVyKGxpc3RlbmVyLCBhcmd1bWVudHopO1xuICAgIHJldHVybiBmdW5jdGlvbihlKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gdGhpcywgcmVsYXRlZCA9IGUucmVsYXRlZFRhcmdldDtcbiAgICAgIGlmICghcmVsYXRlZCB8fCByZWxhdGVkICE9PSB0YXJnZXQgJiYgIShyZWxhdGVkLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRhcmdldCkgJiA4KSkge1xuICAgICAgICBsLmNhbGwodGFyZ2V0LCBlKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHZhciBkM19ldmVudF9kcmFnU2VsZWN0LCBkM19ldmVudF9kcmFnSWQgPSAwO1xuICBmdW5jdGlvbiBkM19ldmVudF9kcmFnU3VwcHJlc3Mobm9kZSkge1xuICAgIHZhciBuYW1lID0gXCIuZHJhZ3N1cHByZXNzLVwiICsgKytkM19ldmVudF9kcmFnSWQsIGNsaWNrID0gXCJjbGlja1wiICsgbmFtZSwgdyA9IGQzLnNlbGVjdChkM193aW5kb3cobm9kZSkpLm9uKFwidG91Y2htb3ZlXCIgKyBuYW1lLCBkM19ldmVudFByZXZlbnREZWZhdWx0KS5vbihcImRyYWdzdGFydFwiICsgbmFtZSwgZDNfZXZlbnRQcmV2ZW50RGVmYXVsdCkub24oXCJzZWxlY3RzdGFydFwiICsgbmFtZSwgZDNfZXZlbnRQcmV2ZW50RGVmYXVsdCk7XG4gICAgaWYgKGQzX2V2ZW50X2RyYWdTZWxlY3QgPT0gbnVsbCkge1xuICAgICAgZDNfZXZlbnRfZHJhZ1NlbGVjdCA9IFwib25zZWxlY3RzdGFydFwiIGluIG5vZGUgPyBmYWxzZSA6IGQzX3ZlbmRvclN5bWJvbChub2RlLnN0eWxlLCBcInVzZXJTZWxlY3RcIik7XG4gICAgfVxuICAgIGlmIChkM19ldmVudF9kcmFnU2VsZWN0KSB7XG4gICAgICB2YXIgc3R5bGUgPSBkM19kb2N1bWVudEVsZW1lbnQobm9kZSkuc3R5bGUsIHNlbGVjdCA9IHN0eWxlW2QzX2V2ZW50X2RyYWdTZWxlY3RdO1xuICAgICAgc3R5bGVbZDNfZXZlbnRfZHJhZ1NlbGVjdF0gPSBcIm5vbmVcIjtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHN1cHByZXNzQ2xpY2spIHtcbiAgICAgIHcub24obmFtZSwgbnVsbCk7XG4gICAgICBpZiAoZDNfZXZlbnRfZHJhZ1NlbGVjdCkgc3R5bGVbZDNfZXZlbnRfZHJhZ1NlbGVjdF0gPSBzZWxlY3Q7XG4gICAgICBpZiAoc3VwcHJlc3NDbGljaykge1xuICAgICAgICB2YXIgb2ZmID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdy5vbihjbGljaywgbnVsbCk7XG4gICAgICAgIH07XG4gICAgICAgIHcub24oY2xpY2ssIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGQzX2V2ZW50UHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBvZmYoKTtcbiAgICAgICAgfSwgdHJ1ZSk7XG4gICAgICAgIHNldFRpbWVvdXQob2ZmLCAwKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGQzLm1vdXNlID0gZnVuY3Rpb24oY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIGQzX21vdXNlUG9pbnQoY29udGFpbmVyLCBkM19ldmVudFNvdXJjZSgpKTtcbiAgfTtcbiAgdmFyIGQzX21vdXNlX2J1ZzQ0MDgzID0gdGhpcy5uYXZpZ2F0b3IgJiYgL1dlYktpdC8udGVzdCh0aGlzLm5hdmlnYXRvci51c2VyQWdlbnQpID8gLTEgOiAwO1xuICBmdW5jdGlvbiBkM19tb3VzZVBvaW50KGNvbnRhaW5lciwgZSkge1xuICAgIGlmIChlLmNoYW5nZWRUb3VjaGVzKSBlID0gZS5jaGFuZ2VkVG91Y2hlc1swXTtcbiAgICB2YXIgc3ZnID0gY29udGFpbmVyLm93bmVyU1ZHRWxlbWVudCB8fCBjb250YWluZXI7XG4gICAgaWYgKHN2Zy5jcmVhdGVTVkdQb2ludCkge1xuICAgICAgdmFyIHBvaW50ID0gc3ZnLmNyZWF0ZVNWR1BvaW50KCk7XG4gICAgICBpZiAoZDNfbW91c2VfYnVnNDQwODMgPCAwKSB7XG4gICAgICAgIHZhciB3aW5kb3cgPSBkM193aW5kb3coY29udGFpbmVyKTtcbiAgICAgICAgaWYgKHdpbmRvdy5zY3JvbGxYIHx8IHdpbmRvdy5zY3JvbGxZKSB7XG4gICAgICAgICAgc3ZnID0gZDMuc2VsZWN0KFwiYm9keVwiKS5hcHBlbmQoXCJzdmdcIikuc3R5bGUoe1xuICAgICAgICAgICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgIGxlZnQ6IDAsXG4gICAgICAgICAgICBtYXJnaW46IDAsXG4gICAgICAgICAgICBwYWRkaW5nOiAwLFxuICAgICAgICAgICAgYm9yZGVyOiBcIm5vbmVcIlxuICAgICAgICAgIH0sIFwiaW1wb3J0YW50XCIpO1xuICAgICAgICAgIHZhciBjdG0gPSBzdmdbMF1bMF0uZ2V0U2NyZWVuQ1RNKCk7XG4gICAgICAgICAgZDNfbW91c2VfYnVnNDQwODMgPSAhKGN0bS5mIHx8IGN0bS5lKTtcbiAgICAgICAgICBzdmcucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChkM19tb3VzZV9idWc0NDA4MykgcG9pbnQueCA9IGUucGFnZVgsIHBvaW50LnkgPSBlLnBhZ2VZOyBlbHNlIHBvaW50LnggPSBlLmNsaWVudFgsIFxuICAgICAgcG9pbnQueSA9IGUuY2xpZW50WTtcbiAgICAgIHBvaW50ID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKGNvbnRhaW5lci5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpO1xuICAgICAgcmV0dXJuIFsgcG9pbnQueCwgcG9pbnQueSBdO1xuICAgIH1cbiAgICB2YXIgcmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4gWyBlLmNsaWVudFggLSByZWN0LmxlZnQgLSBjb250YWluZXIuY2xpZW50TGVmdCwgZS5jbGllbnRZIC0gcmVjdC50b3AgLSBjb250YWluZXIuY2xpZW50VG9wIF07XG4gIH1cbiAgZDMudG91Y2ggPSBmdW5jdGlvbihjb250YWluZXIsIHRvdWNoZXMsIGlkZW50aWZpZXIpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIGlkZW50aWZpZXIgPSB0b3VjaGVzLCB0b3VjaGVzID0gZDNfZXZlbnRTb3VyY2UoKS5jaGFuZ2VkVG91Y2hlcztcbiAgICBpZiAodG91Y2hlcykgZm9yICh2YXIgaSA9IDAsIG4gPSB0b3VjaGVzLmxlbmd0aCwgdG91Y2g7IGkgPCBuOyArK2kpIHtcbiAgICAgIGlmICgodG91Y2ggPSB0b3VjaGVzW2ldKS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICAgIHJldHVybiBkM19tb3VzZVBvaW50KGNvbnRhaW5lciwgdG91Y2gpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgZDMuYmVoYXZpb3IuZHJhZyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBldmVudCA9IGQzX2V2ZW50RGlzcGF0Y2goZHJhZywgXCJkcmFnXCIsIFwiZHJhZ3N0YXJ0XCIsIFwiZHJhZ2VuZFwiKSwgb3JpZ2luID0gbnVsbCwgbW91c2Vkb3duID0gZHJhZ3N0YXJ0KGQzX25vb3AsIGQzLm1vdXNlLCBkM193aW5kb3csIFwibW91c2Vtb3ZlXCIsIFwibW91c2V1cFwiKSwgdG91Y2hzdGFydCA9IGRyYWdzdGFydChkM19iZWhhdmlvcl9kcmFnVG91Y2hJZCwgZDMudG91Y2gsIGQzX2lkZW50aXR5LCBcInRvdWNobW92ZVwiLCBcInRvdWNoZW5kXCIpO1xuICAgIGZ1bmN0aW9uIGRyYWcoKSB7XG4gICAgICB0aGlzLm9uKFwibW91c2Vkb3duLmRyYWdcIiwgbW91c2Vkb3duKS5vbihcInRvdWNoc3RhcnQuZHJhZ1wiLCB0b3VjaHN0YXJ0KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZHJhZ3N0YXJ0KGlkLCBwb3NpdGlvbiwgc3ViamVjdCwgbW92ZSwgZW5kKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB0aGF0ID0gdGhpcywgdGFyZ2V0ID0gZDMuZXZlbnQudGFyZ2V0LmNvcnJlc3BvbmRpbmdFbGVtZW50IHx8IGQzLmV2ZW50LnRhcmdldCwgcGFyZW50ID0gdGhhdC5wYXJlbnROb2RlLCBkaXNwYXRjaCA9IGV2ZW50Lm9mKHRoYXQsIGFyZ3VtZW50cyksIGRyYWdnZWQgPSAwLCBkcmFnSWQgPSBpZCgpLCBkcmFnTmFtZSA9IFwiLmRyYWdcIiArIChkcmFnSWQgPT0gbnVsbCA/IFwiXCIgOiBcIi1cIiArIGRyYWdJZCksIGRyYWdPZmZzZXQsIGRyYWdTdWJqZWN0ID0gZDMuc2VsZWN0KHN1YmplY3QodGFyZ2V0KSkub24obW92ZSArIGRyYWdOYW1lLCBtb3ZlZCkub24oZW5kICsgZHJhZ05hbWUsIGVuZGVkKSwgZHJhZ1Jlc3RvcmUgPSBkM19ldmVudF9kcmFnU3VwcHJlc3ModGFyZ2V0KSwgcG9zaXRpb24wID0gcG9zaXRpb24ocGFyZW50LCBkcmFnSWQpO1xuICAgICAgICBpZiAob3JpZ2luKSB7XG4gICAgICAgICAgZHJhZ09mZnNldCA9IG9yaWdpbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICAgICAgICAgIGRyYWdPZmZzZXQgPSBbIGRyYWdPZmZzZXQueCAtIHBvc2l0aW9uMFswXSwgZHJhZ09mZnNldC55IC0gcG9zaXRpb24wWzFdIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZHJhZ09mZnNldCA9IFsgMCwgMCBdO1xuICAgICAgICB9XG4gICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICB0eXBlOiBcImRyYWdzdGFydFwiXG4gICAgICAgIH0pO1xuICAgICAgICBmdW5jdGlvbiBtb3ZlZCgpIHtcbiAgICAgICAgICB2YXIgcG9zaXRpb24xID0gcG9zaXRpb24ocGFyZW50LCBkcmFnSWQpLCBkeCwgZHk7XG4gICAgICAgICAgaWYgKCFwb3NpdGlvbjEpIHJldHVybjtcbiAgICAgICAgICBkeCA9IHBvc2l0aW9uMVswXSAtIHBvc2l0aW9uMFswXTtcbiAgICAgICAgICBkeSA9IHBvc2l0aW9uMVsxXSAtIHBvc2l0aW9uMFsxXTtcbiAgICAgICAgICBkcmFnZ2VkIHw9IGR4IHwgZHk7XG4gICAgICAgICAgcG9zaXRpb24wID0gcG9zaXRpb24xO1xuICAgICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwiZHJhZ1wiLFxuICAgICAgICAgICAgeDogcG9zaXRpb24xWzBdICsgZHJhZ09mZnNldFswXSxcbiAgICAgICAgICAgIHk6IHBvc2l0aW9uMVsxXSArIGRyYWdPZmZzZXRbMV0sXG4gICAgICAgICAgICBkeDogZHgsXG4gICAgICAgICAgICBkeTogZHlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBlbmRlZCgpIHtcbiAgICAgICAgICBpZiAoIXBvc2l0aW9uKHBhcmVudCwgZHJhZ0lkKSkgcmV0dXJuO1xuICAgICAgICAgIGRyYWdTdWJqZWN0Lm9uKG1vdmUgKyBkcmFnTmFtZSwgbnVsbCkub24oZW5kICsgZHJhZ05hbWUsIG51bGwpO1xuICAgICAgICAgIGRyYWdSZXN0b3JlKGRyYWdnZWQpO1xuICAgICAgICAgIGRpc3BhdGNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwiZHJhZ2VuZFwiXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIGRyYWcub3JpZ2luID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3JpZ2luO1xuICAgICAgb3JpZ2luID0geDtcbiAgICAgIHJldHVybiBkcmFnO1xuICAgIH07XG4gICAgcmV0dXJuIGQzLnJlYmluZChkcmFnLCBldmVudCwgXCJvblwiKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfYmVoYXZpb3JfZHJhZ1RvdWNoSWQoKSB7XG4gICAgcmV0dXJuIGQzLmV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXI7XG4gIH1cbiAgZDMudG91Y2hlcyA9IGZ1bmN0aW9uKGNvbnRhaW5lciwgdG91Y2hlcykge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgdG91Y2hlcyA9IGQzX2V2ZW50U291cmNlKCkudG91Y2hlcztcbiAgICByZXR1cm4gdG91Y2hlcyA/IGQzX2FycmF5KHRvdWNoZXMpLm1hcChmdW5jdGlvbih0b3VjaCkge1xuICAgICAgdmFyIHBvaW50ID0gZDNfbW91c2VQb2ludChjb250YWluZXIsIHRvdWNoKTtcbiAgICAgIHBvaW50LmlkZW50aWZpZXIgPSB0b3VjaC5pZGVudGlmaWVyO1xuICAgICAgcmV0dXJuIHBvaW50O1xuICAgIH0pIDogW107XG4gIH07XG4gIHZhciDOtSA9IDFlLTYsIM61MiA9IM61ICogzrUsIM+AID0gTWF0aC5QSSwgz4QgPSAyICogz4AsIM+EzrUgPSDPhCAtIM61LCBoYWxmz4AgPSDPgCAvIDIsIGQzX3JhZGlhbnMgPSDPgCAvIDE4MCwgZDNfZGVncmVlcyA9IDE4MCAvIM+AO1xuICBmdW5jdGlvbiBkM19zZ24oeCkge1xuICAgIHJldHVybiB4ID4gMCA/IDEgOiB4IDwgMCA/IC0xIDogMDtcbiAgfVxuICBmdW5jdGlvbiBkM19jcm9zczJkKGEsIGIsIGMpIHtcbiAgICByZXR1cm4gKGJbMF0gLSBhWzBdKSAqIChjWzFdIC0gYVsxXSkgLSAoYlsxXSAtIGFbMV0pICogKGNbMF0gLSBhWzBdKTtcbiAgfVxuICBmdW5jdGlvbiBkM19hY29zKHgpIHtcbiAgICByZXR1cm4geCA+IDEgPyAwIDogeCA8IC0xID8gz4AgOiBNYXRoLmFjb3MoeCk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfYXNpbih4KSB7XG4gICAgcmV0dXJuIHggPiAxID8gaGFsZs+AIDogeCA8IC0xID8gLWhhbGbPgCA6IE1hdGguYXNpbih4KTtcbiAgfVxuICBmdW5jdGlvbiBkM19zaW5oKHgpIHtcbiAgICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpIC0gMSAvIHgpIC8gMjtcbiAgfVxuICBmdW5jdGlvbiBkM19jb3NoKHgpIHtcbiAgICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpICsgMSAvIHgpIC8gMjtcbiAgfVxuICBmdW5jdGlvbiBkM190YW5oKHgpIHtcbiAgICByZXR1cm4gKCh4ID0gTWF0aC5leHAoMiAqIHgpKSAtIDEpIC8gKHggKyAxKTtcbiAgfVxuICBmdW5jdGlvbiBkM19oYXZlcnNpbih4KSB7XG4gICAgcmV0dXJuICh4ID0gTWF0aC5zaW4oeCAvIDIpKSAqIHg7XG4gIH1cbiAgdmFyIM+BID0gTWF0aC5TUVJUMiwgz4EyID0gMiwgz4E0ID0gNDtcbiAgZDMuaW50ZXJwb2xhdGVab29tID0gZnVuY3Rpb24ocDAsIHAxKSB7XG4gICAgdmFyIHV4MCA9IHAwWzBdLCB1eTAgPSBwMFsxXSwgdzAgPSBwMFsyXSwgdXgxID0gcDFbMF0sIHV5MSA9IHAxWzFdLCB3MSA9IHAxWzJdLCBkeCA9IHV4MSAtIHV4MCwgZHkgPSB1eTEgLSB1eTAsIGQyID0gZHggKiBkeCArIGR5ICogZHksIGksIFM7XG4gICAgaWYgKGQyIDwgzrUyKSB7XG4gICAgICBTID0gTWF0aC5sb2codzEgLyB3MCkgLyDPgTtcbiAgICAgIGkgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgIHJldHVybiBbIHV4MCArIHQgKiBkeCwgdXkwICsgdCAqIGR5LCB3MCAqIE1hdGguZXhwKM+BICogdCAqIFMpIF07XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZDEgPSBNYXRoLnNxcnQoZDIpLCBiMCA9ICh3MSAqIHcxIC0gdzAgKiB3MCArIM+BNCAqIGQyKSAvICgyICogdzAgKiDPgTIgKiBkMSksIGIxID0gKHcxICogdzEgLSB3MCAqIHcwIC0gz4E0ICogZDIpIC8gKDIgKiB3MSAqIM+BMiAqIGQxKSwgcjAgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjAgKiBiMCArIDEpIC0gYjApLCByMSA9IE1hdGgubG9nKE1hdGguc3FydChiMSAqIGIxICsgMSkgLSBiMSk7XG4gICAgICBTID0gKHIxIC0gcjApIC8gz4E7XG4gICAgICBpID0gZnVuY3Rpb24odCkge1xuICAgICAgICB2YXIgcyA9IHQgKiBTLCBjb3NocjAgPSBkM19jb3NoKHIwKSwgdSA9IHcwIC8gKM+BMiAqIGQxKSAqIChjb3NocjAgKiBkM190YW5oKM+BICogcyArIHIwKSAtIGQzX3NpbmgocjApKTtcbiAgICAgICAgcmV0dXJuIFsgdXgwICsgdSAqIGR4LCB1eTAgKyB1ICogZHksIHcwICogY29zaHIwIC8gZDNfY29zaCjPgSAqIHMgKyByMCkgXTtcbiAgICAgIH07XG4gICAgfVxuICAgIGkuZHVyYXRpb24gPSBTICogMWUzO1xuICAgIHJldHVybiBpO1xuICB9O1xuICBkMy5iZWhhdmlvci56b29tID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZpZXcgPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMCxcbiAgICAgIGs6IDFcbiAgICB9LCB0cmFuc2xhdGUwLCBjZW50ZXIwLCBjZW50ZXIsIHNpemUgPSBbIDk2MCwgNTAwIF0sIHNjYWxlRXh0ZW50ID0gZDNfYmVoYXZpb3Jfem9vbUluZmluaXR5LCBkdXJhdGlvbiA9IDI1MCwgem9vbWluZyA9IDAsIG1vdXNlZG93biA9IFwibW91c2Vkb3duLnpvb21cIiwgbW91c2Vtb3ZlID0gXCJtb3VzZW1vdmUuem9vbVwiLCBtb3VzZXVwID0gXCJtb3VzZXVwLnpvb21cIiwgbW91c2V3aGVlbFRpbWVyLCB0b3VjaHN0YXJ0ID0gXCJ0b3VjaHN0YXJ0Lnpvb21cIiwgdG91Y2h0aW1lLCBldmVudCA9IGQzX2V2ZW50RGlzcGF0Y2goem9vbSwgXCJ6b29tc3RhcnRcIiwgXCJ6b29tXCIsIFwiem9vbWVuZFwiKSwgeDAsIHgxLCB5MCwgeTE7XG4gICAgaWYgKCFkM19iZWhhdmlvcl96b29tV2hlZWwpIHtcbiAgICAgIGQzX2JlaGF2aW9yX3pvb21XaGVlbCA9IFwib253aGVlbFwiIGluIGQzX2RvY3VtZW50ID8gKGQzX2JlaGF2aW9yX3pvb21EZWx0YSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gLWQzLmV2ZW50LmRlbHRhWSAqIChkMy5ldmVudC5kZWx0YU1vZGUgPyAxMjAgOiAxKTtcbiAgICAgIH0sIFwid2hlZWxcIikgOiBcIm9ubW91c2V3aGVlbFwiIGluIGQzX2RvY3VtZW50ID8gKGQzX2JlaGF2aW9yX3pvb21EZWx0YSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gZDMuZXZlbnQud2hlZWxEZWx0YTtcbiAgICAgIH0sIFwibW91c2V3aGVlbFwiKSA6IChkM19iZWhhdmlvcl96b29tRGVsdGEgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIC1kMy5ldmVudC5kZXRhaWw7XG4gICAgICB9LCBcIk1vek1vdXNlUGl4ZWxTY3JvbGxcIik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHpvb20oZykge1xuICAgICAgZy5vbihtb3VzZWRvd24sIG1vdXNlZG93bmVkKS5vbihkM19iZWhhdmlvcl96b29tV2hlZWwgKyBcIi56b29tXCIsIG1vdXNld2hlZWxlZCkub24oXCJkYmxjbGljay56b29tXCIsIGRibGNsaWNrZWQpLm9uKHRvdWNoc3RhcnQsIHRvdWNoc3RhcnRlZCk7XG4gICAgfVxuICAgIHpvb20uZXZlbnQgPSBmdW5jdGlvbihnKSB7XG4gICAgICBnLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBkaXNwYXRjaCA9IGV2ZW50Lm9mKHRoaXMsIGFyZ3VtZW50cyksIHZpZXcxID0gdmlldztcbiAgICAgICAgaWYgKGQzX3RyYW5zaXRpb25Jbmhlcml0SWQpIHtcbiAgICAgICAgICBkMy5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmVhY2goXCJzdGFydC56b29tXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmlldyA9IHRoaXMuX19jaGFydF9fIHx8IHtcbiAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgICAgazogMVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHpvb21zdGFydGVkKGRpc3BhdGNoKTtcbiAgICAgICAgICB9KS50d2VlbihcInpvb206em9vbVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBkeCA9IHNpemVbMF0sIGR5ID0gc2l6ZVsxXSwgY3ggPSBjZW50ZXIwID8gY2VudGVyMFswXSA6IGR4IC8gMiwgY3kgPSBjZW50ZXIwID8gY2VudGVyMFsxXSA6IGR5IC8gMiwgaSA9IGQzLmludGVycG9sYXRlWm9vbShbIChjeCAtIHZpZXcueCkgLyB2aWV3LmssIChjeSAtIHZpZXcueSkgLyB2aWV3LmssIGR4IC8gdmlldy5rIF0sIFsgKGN4IC0gdmlldzEueCkgLyB2aWV3MS5rLCAoY3kgLSB2aWV3MS55KSAvIHZpZXcxLmssIGR4IC8gdmlldzEuayBdKTtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgIHZhciBsID0gaSh0KSwgayA9IGR4IC8gbFsyXTtcbiAgICAgICAgICAgICAgdGhpcy5fX2NoYXJ0X18gPSB2aWV3ID0ge1xuICAgICAgICAgICAgICAgIHg6IGN4IC0gbFswXSAqIGssXG4gICAgICAgICAgICAgICAgeTogY3kgLSBsWzFdICogayxcbiAgICAgICAgICAgICAgICBrOiBrXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHpvb21lZChkaXNwYXRjaCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pLmVhY2goXCJpbnRlcnJ1cHQuem9vbVwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHpvb21lbmRlZChkaXNwYXRjaCk7XG4gICAgICAgICAgfSkuZWFjaChcImVuZC56b29tXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgem9vbWVuZGVkKGRpc3BhdGNoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9fY2hhcnRfXyA9IHZpZXc7XG4gICAgICAgICAgem9vbXN0YXJ0ZWQoZGlzcGF0Y2gpO1xuICAgICAgICAgIHpvb21lZChkaXNwYXRjaCk7XG4gICAgICAgICAgem9vbWVuZGVkKGRpc3BhdGNoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcbiAgICB6b29tLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgdmlldy54LCB2aWV3LnkgXTtcbiAgICAgIHZpZXcgPSB7XG4gICAgICAgIHg6ICtfWzBdLFxuICAgICAgICB5OiArX1sxXSxcbiAgICAgICAgazogdmlldy5rXG4gICAgICB9O1xuICAgICAgcmVzY2FsZSgpO1xuICAgICAgcmV0dXJuIHpvb207XG4gICAgfTtcbiAgICB6b29tLnNjYWxlID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdmlldy5rO1xuICAgICAgdmlldyA9IHtcbiAgICAgICAgeDogdmlldy54LFxuICAgICAgICB5OiB2aWV3LnksXG4gICAgICAgIGs6IG51bGxcbiAgICAgIH07XG4gICAgICBzY2FsZVRvKCtfKTtcbiAgICAgIHJlc2NhbGUoKTtcbiAgICAgIHJldHVybiB6b29tO1xuICAgIH07XG4gICAgem9vbS5zY2FsZUV4dGVudCA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNjYWxlRXh0ZW50O1xuICAgICAgc2NhbGVFeHRlbnQgPSBfID09IG51bGwgPyBkM19iZWhhdmlvcl96b29tSW5maW5pdHkgOiBbICtfWzBdLCArX1sxXSBdO1xuICAgICAgcmV0dXJuIHpvb207XG4gICAgfTtcbiAgICB6b29tLmNlbnRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNlbnRlcjtcbiAgICAgIGNlbnRlciA9IF8gJiYgWyArX1swXSwgK19bMV0gXTtcbiAgICAgIHJldHVybiB6b29tO1xuICAgIH07XG4gICAgem9vbS5zaXplID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2l6ZTtcbiAgICAgIHNpemUgPSBfICYmIFsgK19bMF0sICtfWzFdIF07XG4gICAgICByZXR1cm4gem9vbTtcbiAgICB9O1xuICAgIHpvb20uZHVyYXRpb24gPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkdXJhdGlvbjtcbiAgICAgIGR1cmF0aW9uID0gK187XG4gICAgICByZXR1cm4gem9vbTtcbiAgICB9O1xuICAgIHpvb20ueCA9IGZ1bmN0aW9uKHopIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHgxO1xuICAgICAgeDEgPSB6O1xuICAgICAgeDAgPSB6LmNvcHkoKTtcbiAgICAgIHZpZXcgPSB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDAsXG4gICAgICAgIGs6IDFcbiAgICAgIH07XG4gICAgICByZXR1cm4gem9vbTtcbiAgICB9O1xuICAgIHpvb20ueSA9IGZ1bmN0aW9uKHopIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHkxO1xuICAgICAgeTEgPSB6O1xuICAgICAgeTAgPSB6LmNvcHkoKTtcbiAgICAgIHZpZXcgPSB7XG4gICAgICAgIHg6IDAsXG4gICAgICAgIHk6IDAsXG4gICAgICAgIGs6IDFcbiAgICAgIH07XG4gICAgICByZXR1cm4gem9vbTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGxvY2F0aW9uKHApIHtcbiAgICAgIHJldHVybiBbIChwWzBdIC0gdmlldy54KSAvIHZpZXcuaywgKHBbMV0gLSB2aWV3LnkpIC8gdmlldy5rIF07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBvaW50KGwpIHtcbiAgICAgIHJldHVybiBbIGxbMF0gKiB2aWV3LmsgKyB2aWV3LngsIGxbMV0gKiB2aWV3LmsgKyB2aWV3LnkgXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2NhbGVUbyhzKSB7XG4gICAgICB2aWV3LmsgPSBNYXRoLm1heChzY2FsZUV4dGVudFswXSwgTWF0aC5taW4oc2NhbGVFeHRlbnRbMV0sIHMpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhbnNsYXRlVG8ocCwgbCkge1xuICAgICAgbCA9IHBvaW50KGwpO1xuICAgICAgdmlldy54ICs9IHBbMF0gLSBsWzBdO1xuICAgICAgdmlldy55ICs9IHBbMV0gLSBsWzFdO1xuICAgIH1cbiAgICBmdW5jdGlvbiB6b29tVG8odGhhdCwgcCwgbCwgaykge1xuICAgICAgdGhhdC5fX2NoYXJ0X18gPSB7XG4gICAgICAgIHg6IHZpZXcueCxcbiAgICAgICAgeTogdmlldy55LFxuICAgICAgICBrOiB2aWV3LmtcbiAgICAgIH07XG4gICAgICBzY2FsZVRvKE1hdGgucG93KDIsIGspKTtcbiAgICAgIHRyYW5zbGF0ZVRvKGNlbnRlcjAgPSBwLCBsKTtcbiAgICAgIHRoYXQgPSBkMy5zZWxlY3QodGhhdCk7XG4gICAgICBpZiAoZHVyYXRpb24gPiAwKSB0aGF0ID0gdGhhdC50cmFuc2l0aW9uKCkuZHVyYXRpb24oZHVyYXRpb24pO1xuICAgICAgdGhhdC5jYWxsKHpvb20uZXZlbnQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXNjYWxlKCkge1xuICAgICAgaWYgKHgxKSB4MS5kb21haW4oeDAucmFuZ2UoKS5tYXAoZnVuY3Rpb24oeCkge1xuICAgICAgICByZXR1cm4gKHggLSB2aWV3LngpIC8gdmlldy5rO1xuICAgICAgfSkubWFwKHgwLmludmVydCkpO1xuICAgICAgaWYgKHkxKSB5MS5kb21haW4oeTAucmFuZ2UoKS5tYXAoZnVuY3Rpb24oeSkge1xuICAgICAgICByZXR1cm4gKHkgLSB2aWV3LnkpIC8gdmlldy5rO1xuICAgICAgfSkubWFwKHkwLmludmVydCkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB6b29tc3RhcnRlZChkaXNwYXRjaCkge1xuICAgICAgaWYgKCF6b29taW5nKyspIGRpc3BhdGNoKHtcbiAgICAgICAgdHlwZTogXCJ6b29tc3RhcnRcIlxuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHpvb21lZChkaXNwYXRjaCkge1xuICAgICAgcmVzY2FsZSgpO1xuICAgICAgZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiBcInpvb21cIixcbiAgICAgICAgc2NhbGU6IHZpZXcuayxcbiAgICAgICAgdHJhbnNsYXRlOiBbIHZpZXcueCwgdmlldy55IF1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB6b29tZW5kZWQoZGlzcGF0Y2gpIHtcbiAgICAgIGlmICghLS16b29taW5nKSBkaXNwYXRjaCh7XG4gICAgICAgIHR5cGU6IFwiem9vbWVuZFwiXG4gICAgICB9KSwgY2VudGVyMCA9IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG1vdXNlZG93bmVkKCkge1xuICAgICAgdmFyIHRoYXQgPSB0aGlzLCBkaXNwYXRjaCA9IGV2ZW50Lm9mKHRoYXQsIGFyZ3VtZW50cyksIGRyYWdnZWQgPSAwLCBzdWJqZWN0ID0gZDMuc2VsZWN0KGQzX3dpbmRvdyh0aGF0KSkub24obW91c2Vtb3ZlLCBtb3ZlZCkub24obW91c2V1cCwgZW5kZWQpLCBsb2NhdGlvbjAgPSBsb2NhdGlvbihkMy5tb3VzZSh0aGF0KSksIGRyYWdSZXN0b3JlID0gZDNfZXZlbnRfZHJhZ1N1cHByZXNzKHRoYXQpO1xuICAgICAgZDNfc2VsZWN0aW9uX2ludGVycnVwdC5jYWxsKHRoYXQpO1xuICAgICAgem9vbXN0YXJ0ZWQoZGlzcGF0Y2gpO1xuICAgICAgZnVuY3Rpb24gbW92ZWQoKSB7XG4gICAgICAgIGRyYWdnZWQgPSAxO1xuICAgICAgICB0cmFuc2xhdGVUbyhkMy5tb3VzZSh0aGF0KSwgbG9jYXRpb24wKTtcbiAgICAgICAgem9vbWVkKGRpc3BhdGNoKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGVuZGVkKCkge1xuICAgICAgICBzdWJqZWN0Lm9uKG1vdXNlbW92ZSwgbnVsbCkub24obW91c2V1cCwgbnVsbCk7XG4gICAgICAgIGRyYWdSZXN0b3JlKGRyYWdnZWQpO1xuICAgICAgICB6b29tZW5kZWQoZGlzcGF0Y2gpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0b3VjaHN0YXJ0ZWQoKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXMsIGRpc3BhdGNoID0gZXZlbnQub2YodGhhdCwgYXJndW1lbnRzKSwgbG9jYXRpb25zMCA9IHt9LCBkaXN0YW5jZTAgPSAwLCBzY2FsZTAsIHpvb21OYW1lID0gXCIuem9vbS1cIiArIGQzLmV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXIsIHRvdWNobW92ZSA9IFwidG91Y2htb3ZlXCIgKyB6b29tTmFtZSwgdG91Y2hlbmQgPSBcInRvdWNoZW5kXCIgKyB6b29tTmFtZSwgdGFyZ2V0cyA9IFtdLCBzdWJqZWN0ID0gZDMuc2VsZWN0KHRoYXQpLCBkcmFnUmVzdG9yZSA9IGQzX2V2ZW50X2RyYWdTdXBwcmVzcyh0aGF0KTtcbiAgICAgIHN0YXJ0ZWQoKTtcbiAgICAgIHpvb21zdGFydGVkKGRpc3BhdGNoKTtcbiAgICAgIHN1YmplY3Qub24obW91c2Vkb3duLCBudWxsKS5vbih0b3VjaHN0YXJ0LCBzdGFydGVkKTtcbiAgICAgIGZ1bmN0aW9uIHJlbG9jYXRlKCkge1xuICAgICAgICB2YXIgdG91Y2hlcyA9IGQzLnRvdWNoZXModGhhdCk7XG4gICAgICAgIHNjYWxlMCA9IHZpZXcuaztcbiAgICAgICAgdG91Y2hlcy5mb3JFYWNoKGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICBpZiAodC5pZGVudGlmaWVyIGluIGxvY2F0aW9uczApIGxvY2F0aW9uczBbdC5pZGVudGlmaWVyXSA9IGxvY2F0aW9uKHQpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRvdWNoZXM7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBzdGFydGVkKCkge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gZDMuZXZlbnQudGFyZ2V0O1xuICAgICAgICBkMy5zZWxlY3QodGFyZ2V0KS5vbih0b3VjaG1vdmUsIG1vdmVkKS5vbih0b3VjaGVuZCwgZW5kZWQpO1xuICAgICAgICB0YXJnZXRzLnB1c2godGFyZ2V0KTtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBkMy5ldmVudC5jaGFuZ2VkVG91Y2hlcztcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBjaGFuZ2VkLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICAgIGxvY2F0aW9uczBbY2hhbmdlZFtpXS5pZGVudGlmaWVyXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHRvdWNoZXMgPSByZWxvY2F0ZSgpLCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAodG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBpZiAobm93IC0gdG91Y2h0aW1lIDwgNTAwKSB7XG4gICAgICAgICAgICB2YXIgcCA9IHRvdWNoZXNbMF07XG4gICAgICAgICAgICB6b29tVG8odGhhdCwgcCwgbG9jYXRpb25zMFtwLmlkZW50aWZpZXJdLCBNYXRoLmZsb29yKE1hdGgubG9nKHZpZXcuaykgLyBNYXRoLkxOMikgKyAxKTtcbiAgICAgICAgICAgIGQzX2V2ZW50UHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdG91Y2h0aW1lID0gbm93O1xuICAgICAgICB9IGVsc2UgaWYgKHRvdWNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHZhciBwID0gdG91Y2hlc1swXSwgcSA9IHRvdWNoZXNbMV0sIGR4ID0gcFswXSAtIHFbMF0sIGR5ID0gcFsxXSAtIHFbMV07XG4gICAgICAgICAgZGlzdGFuY2UwID0gZHggKiBkeCArIGR5ICogZHk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIG1vdmVkKCkge1xuICAgICAgICB2YXIgdG91Y2hlcyA9IGQzLnRvdWNoZXModGhhdCksIHAwLCBsMCwgcDEsIGwxO1xuICAgICAgICBkM19zZWxlY3Rpb25faW50ZXJydXB0LmNhbGwodGhhdCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdG91Y2hlcy5sZW5ndGg7IGkgPCBuOyArK2ksIGwxID0gbnVsbCkge1xuICAgICAgICAgIHAxID0gdG91Y2hlc1tpXTtcbiAgICAgICAgICBpZiAobDEgPSBsb2NhdGlvbnMwW3AxLmlkZW50aWZpZXJdKSB7XG4gICAgICAgICAgICBpZiAobDApIGJyZWFrO1xuICAgICAgICAgICAgcDAgPSBwMSwgbDAgPSBsMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGwxKSB7XG4gICAgICAgICAgdmFyIGRpc3RhbmNlMSA9IChkaXN0YW5jZTEgPSBwMVswXSAtIHAwWzBdKSAqIGRpc3RhbmNlMSArIChkaXN0YW5jZTEgPSBwMVsxXSAtIHAwWzFdKSAqIGRpc3RhbmNlMSwgc2NhbGUxID0gZGlzdGFuY2UwICYmIE1hdGguc3FydChkaXN0YW5jZTEgLyBkaXN0YW5jZTApO1xuICAgICAgICAgIHAwID0gWyAocDBbMF0gKyBwMVswXSkgLyAyLCAocDBbMV0gKyBwMVsxXSkgLyAyIF07XG4gICAgICAgICAgbDAgPSBbIChsMFswXSArIGwxWzBdKSAvIDIsIChsMFsxXSArIGwxWzFdKSAvIDIgXTtcbiAgICAgICAgICBzY2FsZVRvKHNjYWxlMSAqIHNjYWxlMCk7XG4gICAgICAgIH1cbiAgICAgICAgdG91Y2h0aW1lID0gbnVsbDtcbiAgICAgICAgdHJhbnNsYXRlVG8ocDAsIGwwKTtcbiAgICAgICAgem9vbWVkKGRpc3BhdGNoKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGVuZGVkKCkge1xuICAgICAgICBpZiAoZDMuZXZlbnQudG91Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgY2hhbmdlZCA9IGQzLmV2ZW50LmNoYW5nZWRUb3VjaGVzO1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gY2hhbmdlZC5sZW5ndGg7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBsb2NhdGlvbnMwW2NoYW5nZWRbaV0uaWRlbnRpZmllcl07XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAodmFyIGlkZW50aWZpZXIgaW4gbG9jYXRpb25zMCkge1xuICAgICAgICAgICAgcmV0dXJuIHZvaWQgcmVsb2NhdGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZDMuc2VsZWN0QWxsKHRhcmdldHMpLm9uKHpvb21OYW1lLCBudWxsKTtcbiAgICAgICAgc3ViamVjdC5vbihtb3VzZWRvd24sIG1vdXNlZG93bmVkKS5vbih0b3VjaHN0YXJ0LCB0b3VjaHN0YXJ0ZWQpO1xuICAgICAgICBkcmFnUmVzdG9yZSgpO1xuICAgICAgICB6b29tZW5kZWQoZGlzcGF0Y2gpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBtb3VzZXdoZWVsZWQoKSB7XG4gICAgICB2YXIgZGlzcGF0Y2ggPSBldmVudC5vZih0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgaWYgKG1vdXNld2hlZWxUaW1lcikgY2xlYXJUaW1lb3V0KG1vdXNld2hlZWxUaW1lcik7IGVsc2UgZDNfc2VsZWN0aW9uX2ludGVycnVwdC5jYWxsKHRoaXMpLCBcbiAgICAgIHRyYW5zbGF0ZTAgPSBsb2NhdGlvbihjZW50ZXIwID0gY2VudGVyIHx8IGQzLm1vdXNlKHRoaXMpKSwgem9vbXN0YXJ0ZWQoZGlzcGF0Y2gpO1xuICAgICAgbW91c2V3aGVlbFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgbW91c2V3aGVlbFRpbWVyID0gbnVsbDtcbiAgICAgICAgem9vbWVuZGVkKGRpc3BhdGNoKTtcbiAgICAgIH0sIDUwKTtcbiAgICAgIGQzX2V2ZW50UHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNjYWxlVG8oTWF0aC5wb3coMiwgZDNfYmVoYXZpb3Jfem9vbURlbHRhKCkgKiAuMDAyKSAqIHZpZXcuayk7XG4gICAgICB0cmFuc2xhdGVUbyhjZW50ZXIwLCB0cmFuc2xhdGUwKTtcbiAgICAgIHpvb21lZChkaXNwYXRjaCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRibGNsaWNrZWQoKSB7XG4gICAgICB2YXIgcCA9IGQzLm1vdXNlKHRoaXMpLCBrID0gTWF0aC5sb2codmlldy5rKSAvIE1hdGguTE4yO1xuICAgICAgem9vbVRvKHRoaXMsIHAsIGxvY2F0aW9uKHApLCBkMy5ldmVudC5zaGlmdEtleSA/IE1hdGguY2VpbChrKSAtIDEgOiBNYXRoLmZsb29yKGspICsgMSk7XG4gICAgfVxuICAgIHJldHVybiBkMy5yZWJpbmQoem9vbSwgZXZlbnQsIFwib25cIik7XG4gIH07XG4gIHZhciBkM19iZWhhdmlvcl96b29tSW5maW5pdHkgPSBbIDAsIEluZmluaXR5IF0sIGQzX2JlaGF2aW9yX3pvb21EZWx0YSwgZDNfYmVoYXZpb3Jfem9vbVdoZWVsO1xuICBkMy5jb2xvciA9IGQzX2NvbG9yO1xuICBmdW5jdGlvbiBkM19jb2xvcigpIHt9XG4gIGQzX2NvbG9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnJnYigpICsgXCJcIjtcbiAgfTtcbiAgZDMuaHNsID0gZDNfaHNsO1xuICBmdW5jdGlvbiBkM19oc2woaCwgcywgbCkge1xuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgZDNfaHNsID8gdm9pZCAodGhpcy5oID0gK2gsIHRoaXMucyA9ICtzLCB0aGlzLmwgPSArbCkgOiBhcmd1bWVudHMubGVuZ3RoIDwgMiA/IGggaW5zdGFuY2VvZiBkM19oc2wgPyBuZXcgZDNfaHNsKGguaCwgaC5zLCBoLmwpIDogZDNfcmdiX3BhcnNlKFwiXCIgKyBoLCBkM19yZ2JfaHNsLCBkM19oc2wpIDogbmV3IGQzX2hzbChoLCBzLCBsKTtcbiAgfVxuICB2YXIgZDNfaHNsUHJvdG90eXBlID0gZDNfaHNsLnByb3RvdHlwZSA9IG5ldyBkM19jb2xvcigpO1xuICBkM19oc2xQcm90b3R5cGUuYnJpZ2h0ZXIgPSBmdW5jdGlvbihrKSB7XG4gICAgayA9IE1hdGgucG93KC43LCBhcmd1bWVudHMubGVuZ3RoID8gayA6IDEpO1xuICAgIHJldHVybiBuZXcgZDNfaHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgLyBrKTtcbiAgfTtcbiAgZDNfaHNsUHJvdG90eXBlLmRhcmtlciA9IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gTWF0aC5wb3coLjcsIGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSk7XG4gICAgcmV0dXJuIG5ldyBkM19oc2wodGhpcy5oLCB0aGlzLnMsIGsgKiB0aGlzLmwpO1xuICB9O1xuICBkM19oc2xQcm90b3R5cGUucmdiID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzX2hzbF9yZ2IodGhpcy5oLCB0aGlzLnMsIHRoaXMubCk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2hzbF9yZ2IoaCwgcywgbCkge1xuICAgIHZhciBtMSwgbTI7XG4gICAgaCA9IGlzTmFOKGgpID8gMCA6IChoICU9IDM2MCkgPCAwID8gaCArIDM2MCA6IGg7XG4gICAgcyA9IGlzTmFOKHMpID8gMCA6IHMgPCAwID8gMCA6IHMgPiAxID8gMSA6IHM7XG4gICAgbCA9IGwgPCAwID8gMCA6IGwgPiAxID8gMSA6IGw7XG4gICAgbTIgPSBsIDw9IC41ID8gbCAqICgxICsgcykgOiBsICsgcyAtIGwgKiBzO1xuICAgIG0xID0gMiAqIGwgLSBtMjtcbiAgICBmdW5jdGlvbiB2KGgpIHtcbiAgICAgIGlmIChoID4gMzYwKSBoIC09IDM2MDsgZWxzZSBpZiAoaCA8IDApIGggKz0gMzYwO1xuICAgICAgaWYgKGggPCA2MCkgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogaCAvIDYwO1xuICAgICAgaWYgKGggPCAxODApIHJldHVybiBtMjtcbiAgICAgIGlmIChoIDwgMjQwKSByZXR1cm4gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MDtcbiAgICAgIHJldHVybiBtMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdnYoaCkge1xuICAgICAgcmV0dXJuIE1hdGgucm91bmQodihoKSAqIDI1NSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgZDNfcmdiKHZ2KGggKyAxMjApLCB2dihoKSwgdnYoaCAtIDEyMCkpO1xuICB9XG4gIGQzLmhjbCA9IGQzX2hjbDtcbiAgZnVuY3Rpb24gZDNfaGNsKGgsIGMsIGwpIHtcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGQzX2hjbCA/IHZvaWQgKHRoaXMuaCA9ICtoLCB0aGlzLmMgPSArYywgdGhpcy5sID0gK2wpIDogYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBoIGluc3RhbmNlb2YgZDNfaGNsID8gbmV3IGQzX2hjbChoLmgsIGguYywgaC5sKSA6IGggaW5zdGFuY2VvZiBkM19sYWIgPyBkM19sYWJfaGNsKGgubCwgaC5hLCBoLmIpIDogZDNfbGFiX2hjbCgoaCA9IGQzX3JnYl9sYWIoKGggPSBkMy5yZ2IoaCkpLnIsIGguZywgaC5iKSkubCwgaC5hLCBoLmIpIDogbmV3IGQzX2hjbChoLCBjLCBsKTtcbiAgfVxuICB2YXIgZDNfaGNsUHJvdG90eXBlID0gZDNfaGNsLnByb3RvdHlwZSA9IG5ldyBkM19jb2xvcigpO1xuICBkM19oY2xQcm90b3R5cGUuYnJpZ2h0ZXIgPSBmdW5jdGlvbihrKSB7XG4gICAgcmV0dXJuIG5ldyBkM19oY2wodGhpcy5oLCB0aGlzLmMsIE1hdGgubWluKDEwMCwgdGhpcy5sICsgZDNfbGFiX0sgKiAoYXJndW1lbnRzLmxlbmd0aCA/IGsgOiAxKSkpO1xuICB9O1xuICBkM19oY2xQcm90b3R5cGUuZGFya2VyID0gZnVuY3Rpb24oaykge1xuICAgIHJldHVybiBuZXcgZDNfaGNsKHRoaXMuaCwgdGhpcy5jLCBNYXRoLm1heCgwLCB0aGlzLmwgLSBkM19sYWJfSyAqIChhcmd1bWVudHMubGVuZ3RoID8gayA6IDEpKSk7XG4gIH07XG4gIGQzX2hjbFByb3RvdHlwZS5yZ2IgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDNfaGNsX2xhYih0aGlzLmgsIHRoaXMuYywgdGhpcy5sKS5yZ2IoKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfaGNsX2xhYihoLCBjLCBsKSB7XG4gICAgaWYgKGlzTmFOKGgpKSBoID0gMDtcbiAgICBpZiAoaXNOYU4oYykpIGMgPSAwO1xuICAgIHJldHVybiBuZXcgZDNfbGFiKGwsIE1hdGguY29zKGggKj0gZDNfcmFkaWFucykgKiBjLCBNYXRoLnNpbihoKSAqIGMpO1xuICB9XG4gIGQzLmxhYiA9IGQzX2xhYjtcbiAgZnVuY3Rpb24gZDNfbGFiKGwsIGEsIGIpIHtcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGQzX2xhYiA/IHZvaWQgKHRoaXMubCA9ICtsLCB0aGlzLmEgPSArYSwgdGhpcy5iID0gK2IpIDogYXJndW1lbnRzLmxlbmd0aCA8IDIgPyBsIGluc3RhbmNlb2YgZDNfbGFiID8gbmV3IGQzX2xhYihsLmwsIGwuYSwgbC5iKSA6IGwgaW5zdGFuY2VvZiBkM19oY2wgPyBkM19oY2xfbGFiKGwuaCwgbC5jLCBsLmwpIDogZDNfcmdiX2xhYigobCA9IGQzX3JnYihsKSkuciwgbC5nLCBsLmIpIDogbmV3IGQzX2xhYihsLCBhLCBiKTtcbiAgfVxuICB2YXIgZDNfbGFiX0sgPSAxODtcbiAgdmFyIGQzX2xhYl9YID0gLjk1MDQ3LCBkM19sYWJfWSA9IDEsIGQzX2xhYl9aID0gMS4wODg4MztcbiAgdmFyIGQzX2xhYlByb3RvdHlwZSA9IGQzX2xhYi5wcm90b3R5cGUgPSBuZXcgZDNfY29sb3IoKTtcbiAgZDNfbGFiUHJvdG90eXBlLmJyaWdodGVyID0gZnVuY3Rpb24oaykge1xuICAgIHJldHVybiBuZXcgZDNfbGFiKE1hdGgubWluKDEwMCwgdGhpcy5sICsgZDNfbGFiX0sgKiAoYXJndW1lbnRzLmxlbmd0aCA/IGsgOiAxKSksIHRoaXMuYSwgdGhpcy5iKTtcbiAgfTtcbiAgZDNfbGFiUHJvdG90eXBlLmRhcmtlciA9IGZ1bmN0aW9uKGspIHtcbiAgICByZXR1cm4gbmV3IGQzX2xhYihNYXRoLm1heCgwLCB0aGlzLmwgLSBkM19sYWJfSyAqIChhcmd1bWVudHMubGVuZ3RoID8gayA6IDEpKSwgdGhpcy5hLCB0aGlzLmIpO1xuICB9O1xuICBkM19sYWJQcm90b3R5cGUucmdiID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzX2xhYl9yZ2IodGhpcy5sLCB0aGlzLmEsIHRoaXMuYik7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2xhYl9yZ2IobCwgYSwgYikge1xuICAgIHZhciB5ID0gKGwgKyAxNikgLyAxMTYsIHggPSB5ICsgYSAvIDUwMCwgeiA9IHkgLSBiIC8gMjAwO1xuICAgIHggPSBkM19sYWJfeHl6KHgpICogZDNfbGFiX1g7XG4gICAgeSA9IGQzX2xhYl94eXooeSkgKiBkM19sYWJfWTtcbiAgICB6ID0gZDNfbGFiX3h5eih6KSAqIGQzX2xhYl9aO1xuICAgIHJldHVybiBuZXcgZDNfcmdiKGQzX3h5el9yZ2IoMy4yNDA0NTQyICogeCAtIDEuNTM3MTM4NSAqIHkgLSAuNDk4NTMxNCAqIHopLCBkM194eXpfcmdiKC0uOTY5MjY2ICogeCArIDEuODc2MDEwOCAqIHkgKyAuMDQxNTU2ICogeiksIGQzX3h5el9yZ2IoLjA1NTY0MzQgKiB4IC0gLjIwNDAyNTkgKiB5ICsgMS4wNTcyMjUyICogeikpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xhYl9oY2wobCwgYSwgYikge1xuICAgIHJldHVybiBsID4gMCA/IG5ldyBkM19oY2woTWF0aC5hdGFuMihiLCBhKSAqIGQzX2RlZ3JlZXMsIE1hdGguc3FydChhICogYSArIGIgKiBiKSwgbCkgOiBuZXcgZDNfaGNsKE5hTiwgTmFOLCBsKTtcbiAgfVxuICBmdW5jdGlvbiBkM19sYWJfeHl6KHgpIHtcbiAgICByZXR1cm4geCA+IC4yMDY4OTMwMzQgPyB4ICogeCAqIHggOiAoeCAtIDQgLyAyOSkgLyA3Ljc4NzAzNztcbiAgfVxuICBmdW5jdGlvbiBkM194eXpfbGFiKHgpIHtcbiAgICByZXR1cm4geCA+IC4wMDg4NTYgPyBNYXRoLnBvdyh4LCAxIC8gMykgOiA3Ljc4NzAzNyAqIHggKyA0IC8gMjk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfeHl6X3JnYihyKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoMjU1ICogKHIgPD0gLjAwMzA0ID8gMTIuOTIgKiByIDogMS4wNTUgKiBNYXRoLnBvdyhyLCAxIC8gMi40KSAtIC4wNTUpKTtcbiAgfVxuICBkMy5yZ2IgPSBkM19yZ2I7XG4gIGZ1bmN0aW9uIGQzX3JnYihyLCBnLCBiKSB7XG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBkM19yZ2IgPyB2b2lkICh0aGlzLnIgPSB+fnIsIHRoaXMuZyA9IH5+ZywgdGhpcy5iID0gfn5iKSA6IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gciBpbnN0YW5jZW9mIGQzX3JnYiA/IG5ldyBkM19yZ2Ioci5yLCByLmcsIHIuYikgOiBkM19yZ2JfcGFyc2UoXCJcIiArIHIsIGQzX3JnYiwgZDNfaHNsX3JnYikgOiBuZXcgZDNfcmdiKHIsIGcsIGIpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3JnYk51bWJlcih2YWx1ZSkge1xuICAgIHJldHVybiBuZXcgZDNfcmdiKHZhbHVlID4+IDE2LCB2YWx1ZSA+PiA4ICYgMjU1LCB2YWx1ZSAmIDI1NSk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfcmdiU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIGQzX3JnYk51bWJlcih2YWx1ZSkgKyBcIlwiO1xuICB9XG4gIHZhciBkM19yZ2JQcm90b3R5cGUgPSBkM19yZ2IucHJvdG90eXBlID0gbmV3IGQzX2NvbG9yKCk7XG4gIGQzX3JnYlByb3RvdHlwZS5icmlnaHRlciA9IGZ1bmN0aW9uKGspIHtcbiAgICBrID0gTWF0aC5wb3coLjcsIGFyZ3VtZW50cy5sZW5ndGggPyBrIDogMSk7XG4gICAgdmFyIHIgPSB0aGlzLnIsIGcgPSB0aGlzLmcsIGIgPSB0aGlzLmIsIGkgPSAzMDtcbiAgICBpZiAoIXIgJiYgIWcgJiYgIWIpIHJldHVybiBuZXcgZDNfcmdiKGksIGksIGkpO1xuICAgIGlmIChyICYmIHIgPCBpKSByID0gaTtcbiAgICBpZiAoZyAmJiBnIDwgaSkgZyA9IGk7XG4gICAgaWYgKGIgJiYgYiA8IGkpIGIgPSBpO1xuICAgIHJldHVybiBuZXcgZDNfcmdiKE1hdGgubWluKDI1NSwgciAvIGspLCBNYXRoLm1pbigyNTUsIGcgLyBrKSwgTWF0aC5taW4oMjU1LCBiIC8gaykpO1xuICB9O1xuICBkM19yZ2JQcm90b3R5cGUuZGFya2VyID0gZnVuY3Rpb24oaykge1xuICAgIGsgPSBNYXRoLnBvdyguNywgYXJndW1lbnRzLmxlbmd0aCA/IGsgOiAxKTtcbiAgICByZXR1cm4gbmV3IGQzX3JnYihrICogdGhpcy5yLCBrICogdGhpcy5nLCBrICogdGhpcy5iKTtcbiAgfTtcbiAgZDNfcmdiUHJvdG90eXBlLmhzbCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19yZ2JfaHNsKHRoaXMuciwgdGhpcy5nLCB0aGlzLmIpO1xuICB9O1xuICBkM19yZ2JQcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCIjXCIgKyBkM19yZ2JfaGV4KHRoaXMucikgKyBkM19yZ2JfaGV4KHRoaXMuZykgKyBkM19yZ2JfaGV4KHRoaXMuYik7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3JnYl9oZXgodikge1xuICAgIHJldHVybiB2IDwgMTYgPyBcIjBcIiArIE1hdGgubWF4KDAsIHYpLnRvU3RyaW5nKDE2KSA6IE1hdGgubWluKDI1NSwgdikudG9TdHJpbmcoMTYpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3JnYl9wYXJzZShmb3JtYXQsIHJnYiwgaHNsKSB7XG4gICAgdmFyIHIgPSAwLCBnID0gMCwgYiA9IDAsIG0xLCBtMiwgY29sb3I7XG4gICAgbTEgPSAvKFthLXpdKylcXCgoLiopXFwpLy5leGVjKGZvcm1hdCA9IGZvcm1hdC50b0xvd2VyQ2FzZSgpKTtcbiAgICBpZiAobTEpIHtcbiAgICAgIG0yID0gbTFbMl0uc3BsaXQoXCIsXCIpO1xuICAgICAgc3dpdGNoIChtMVsxXSkge1xuICAgICAgIGNhc2UgXCJoc2xcIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiBoc2wocGFyc2VGbG9hdChtMlswXSksIHBhcnNlRmxvYXQobTJbMV0pIC8gMTAwLCBwYXJzZUZsb2F0KG0yWzJdKSAvIDEwMCk7XG4gICAgICAgIH1cblxuICAgICAgIGNhc2UgXCJyZ2JcIjpcbiAgICAgICAge1xuICAgICAgICAgIHJldHVybiByZ2IoZDNfcmdiX3BhcnNlTnVtYmVyKG0yWzBdKSwgZDNfcmdiX3BhcnNlTnVtYmVyKG0yWzFdKSwgZDNfcmdiX3BhcnNlTnVtYmVyKG0yWzJdKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbG9yID0gZDNfcmdiX25hbWVzLmdldChmb3JtYXQpKSB7XG4gICAgICByZXR1cm4gcmdiKGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIpO1xuICAgIH1cbiAgICBpZiAoZm9ybWF0ICE9IG51bGwgJiYgZm9ybWF0LmNoYXJBdCgwKSA9PT0gXCIjXCIgJiYgIWlzTmFOKGNvbG9yID0gcGFyc2VJbnQoZm9ybWF0LnNsaWNlKDEpLCAxNikpKSB7XG4gICAgICBpZiAoZm9ybWF0Lmxlbmd0aCA9PT0gNCkge1xuICAgICAgICByID0gKGNvbG9yICYgMzg0MCkgPj4gNDtcbiAgICAgICAgciA9IHIgPj4gNCB8IHI7XG4gICAgICAgIGcgPSBjb2xvciAmIDI0MDtcbiAgICAgICAgZyA9IGcgPj4gNCB8IGc7XG4gICAgICAgIGIgPSBjb2xvciAmIDE1O1xuICAgICAgICBiID0gYiA8PCA0IHwgYjtcbiAgICAgIH0gZWxzZSBpZiAoZm9ybWF0Lmxlbmd0aCA9PT0gNykge1xuICAgICAgICByID0gKGNvbG9yICYgMTY3MTE2ODApID4+IDE2O1xuICAgICAgICBnID0gKGNvbG9yICYgNjUyODApID4+IDg7XG4gICAgICAgIGIgPSBjb2xvciAmIDI1NTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJnYihyLCBnLCBiKTtcbiAgfVxuICBmdW5jdGlvbiBkM19yZ2JfaHNsKHIsIGcsIGIpIHtcbiAgICB2YXIgbWluID0gTWF0aC5taW4ociAvPSAyNTUsIGcgLz0gMjU1LCBiIC89IDI1NSksIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLCBkID0gbWF4IC0gbWluLCBoLCBzLCBsID0gKG1heCArIG1pbikgLyAyO1xuICAgIGlmIChkKSB7XG4gICAgICBzID0gbCA8IC41ID8gZCAvIChtYXggKyBtaW4pIDogZCAvICgyIC0gbWF4IC0gbWluKTtcbiAgICAgIGlmIChyID09IG1heCkgaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApOyBlbHNlIGlmIChnID09IG1heCkgaCA9IChiIC0gcikgLyBkICsgMjsgZWxzZSBoID0gKHIgLSBnKSAvIGQgKyA0O1xuICAgICAgaCAqPSA2MDtcbiAgICB9IGVsc2Uge1xuICAgICAgaCA9IE5hTjtcbiAgICAgIHMgPSBsID4gMCAmJiBsIDwgMSA/IDAgOiBoO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IGQzX2hzbChoLCBzLCBsKTtcbiAgfVxuICBmdW5jdGlvbiBkM19yZ2JfbGFiKHIsIGcsIGIpIHtcbiAgICByID0gZDNfcmdiX3h5eihyKTtcbiAgICBnID0gZDNfcmdiX3h5eihnKTtcbiAgICBiID0gZDNfcmdiX3h5eihiKTtcbiAgICB2YXIgeCA9IGQzX3h5el9sYWIoKC40MTI0NTY0ICogciArIC4zNTc1NzYxICogZyArIC4xODA0Mzc1ICogYikgLyBkM19sYWJfWCksIHkgPSBkM194eXpfbGFiKCguMjEyNjcyOSAqIHIgKyAuNzE1MTUyMiAqIGcgKyAuMDcyMTc1ICogYikgLyBkM19sYWJfWSksIHogPSBkM194eXpfbGFiKCguMDE5MzMzOSAqIHIgKyAuMTE5MTkyICogZyArIC45NTAzMDQxICogYikgLyBkM19sYWJfWik7XG4gICAgcmV0dXJuIGQzX2xhYigxMTYgKiB5IC0gMTYsIDUwMCAqICh4IC0geSksIDIwMCAqICh5IC0geikpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3JnYl94eXoocikge1xuICAgIHJldHVybiAociAvPSAyNTUpIDw9IC4wNDA0NSA/IHIgLyAxMi45MiA6IE1hdGgucG93KChyICsgLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgfVxuICBmdW5jdGlvbiBkM19yZ2JfcGFyc2VOdW1iZXIoYykge1xuICAgIHZhciBmID0gcGFyc2VGbG9hdChjKTtcbiAgICByZXR1cm4gYy5jaGFyQXQoYy5sZW5ndGggLSAxKSA9PT0gXCIlXCIgPyBNYXRoLnJvdW5kKGYgKiAyLjU1KSA6IGY7XG4gIH1cbiAgdmFyIGQzX3JnYl9uYW1lcyA9IGQzLm1hcCh7XG4gICAgYWxpY2VibHVlOiAxNTc5MjM4MyxcbiAgICBhbnRpcXVld2hpdGU6IDE2NDQ0Mzc1LFxuICAgIGFxdWE6IDY1NTM1LFxuICAgIGFxdWFtYXJpbmU6IDgzODg1NjQsXG4gICAgYXp1cmU6IDE1Nzk0MTc1LFxuICAgIGJlaWdlOiAxNjExOTI2MCxcbiAgICBiaXNxdWU6IDE2NzcwMjQ0LFxuICAgIGJsYWNrOiAwLFxuICAgIGJsYW5jaGVkYWxtb25kOiAxNjc3MjA0NSxcbiAgICBibHVlOiAyNTUsXG4gICAgYmx1ZXZpb2xldDogOTA1NTIwMixcbiAgICBicm93bjogMTA4MjQyMzQsXG4gICAgYnVybHl3b29kOiAxNDU5NjIzMSxcbiAgICBjYWRldGJsdWU6IDYyNjY1MjgsXG4gICAgY2hhcnRyZXVzZTogODM4ODM1MixcbiAgICBjaG9jb2xhdGU6IDEzNzg5NDcwLFxuICAgIGNvcmFsOiAxNjc0NDI3MixcbiAgICBjb3JuZmxvd2VyYmx1ZTogNjU5MTk4MSxcbiAgICBjb3Juc2lsazogMTY3NzUzODgsXG4gICAgY3JpbXNvbjogMTQ0MjMxMDAsXG4gICAgY3lhbjogNjU1MzUsXG4gICAgZGFya2JsdWU6IDEzOSxcbiAgICBkYXJrY3lhbjogMzU3MjMsXG4gICAgZGFya2dvbGRlbnJvZDogMTIwOTI5MzksXG4gICAgZGFya2dyYXk6IDExMTE5MDE3LFxuICAgIGRhcmtncmVlbjogMjU2MDAsXG4gICAgZGFya2dyZXk6IDExMTE5MDE3LFxuICAgIGRhcmtraGFraTogMTI0MzMyNTksXG4gICAgZGFya21hZ2VudGE6IDkxMDk2NDMsXG4gICAgZGFya29saXZlZ3JlZW46IDU1OTc5OTksXG4gICAgZGFya29yYW5nZTogMTY3NDc1MjAsXG4gICAgZGFya29yY2hpZDogMTAwNDAwMTIsXG4gICAgZGFya3JlZDogOTEwOTUwNCxcbiAgICBkYXJrc2FsbW9uOiAxNTMwODQxMCxcbiAgICBkYXJrc2VhZ3JlZW46IDk0MTk5MTksXG4gICAgZGFya3NsYXRlYmx1ZTogNDczNDM0NyxcbiAgICBkYXJrc2xhdGVncmF5OiAzMTAwNDk1LFxuICAgIGRhcmtzbGF0ZWdyZXk6IDMxMDA0OTUsXG4gICAgZGFya3R1cnF1b2lzZTogNTI5NDUsXG4gICAgZGFya3Zpb2xldDogOTY5OTUzOSxcbiAgICBkZWVwcGluazogMTY3MTY5NDcsXG4gICAgZGVlcHNreWJsdWU6IDQ5MTUxLFxuICAgIGRpbWdyYXk6IDY5MDgyNjUsXG4gICAgZGltZ3JleTogNjkwODI2NSxcbiAgICBkb2RnZXJibHVlOiAyMDAzMTk5LFxuICAgIGZpcmVicmljazogMTE2NzQxNDYsXG4gICAgZmxvcmFsd2hpdGU6IDE2Nzc1OTIwLFxuICAgIGZvcmVzdGdyZWVuOiAyMjYzODQyLFxuICAgIGZ1Y2hzaWE6IDE2NzExOTM1LFxuICAgIGdhaW5zYm9ybzogMTQ0NzQ0NjAsXG4gICAgZ2hvc3R3aGl0ZTogMTYzMTY2NzEsXG4gICAgZ29sZDogMTY3NjY3MjAsXG4gICAgZ29sZGVucm9kOiAxNDMyOTEyMCxcbiAgICBncmF5OiA4NDIxNTA0LFxuICAgIGdyZWVuOiAzMjc2OCxcbiAgICBncmVlbnllbGxvdzogMTE0MDMwNTUsXG4gICAgZ3JleTogODQyMTUwNCxcbiAgICBob25leWRldzogMTU3OTQxNjAsXG4gICAgaG90cGluazogMTY3Mzg3NDAsXG4gICAgaW5kaWFucmVkOiAxMzQ1ODUyNCxcbiAgICBpbmRpZ286IDQ5MTUzMzAsXG4gICAgaXZvcnk6IDE2Nzc3MjAwLFxuICAgIGtoYWtpOiAxNTc4NzY2MCxcbiAgICBsYXZlbmRlcjogMTUxMzI0MTAsXG4gICAgbGF2ZW5kZXJibHVzaDogMTY3NzMzNjUsXG4gICAgbGF3bmdyZWVuOiA4MTkwOTc2LFxuICAgIGxlbW9uY2hpZmZvbjogMTY3NzU4ODUsXG4gICAgbGlnaHRibHVlOiAxMTM5MzI1NCxcbiAgICBsaWdodGNvcmFsOiAxNTc2MTUzNixcbiAgICBsaWdodGN5YW46IDE0NzQ1NTk5LFxuICAgIGxpZ2h0Z29sZGVucm9keWVsbG93OiAxNjQ0ODIxMCxcbiAgICBsaWdodGdyYXk6IDEzODgyMzIzLFxuICAgIGxpZ2h0Z3JlZW46IDk0OTgyNTYsXG4gICAgbGlnaHRncmV5OiAxMzg4MjMyMyxcbiAgICBsaWdodHBpbms6IDE2NzU4NDY1LFxuICAgIGxpZ2h0c2FsbW9uOiAxNjc1Mjc2MixcbiAgICBsaWdodHNlYWdyZWVuOiAyMTQyODkwLFxuICAgIGxpZ2h0c2t5Ymx1ZTogODkwMDM0NixcbiAgICBsaWdodHNsYXRlZ3JheTogNzgzMzc1MyxcbiAgICBsaWdodHNsYXRlZ3JleTogNzgzMzc1MyxcbiAgICBsaWdodHN0ZWVsYmx1ZTogMTE1ODQ3MzQsXG4gICAgbGlnaHR5ZWxsb3c6IDE2Nzc3MTg0LFxuICAgIGxpbWU6IDY1MjgwLFxuICAgIGxpbWVncmVlbjogMzMyOTMzMCxcbiAgICBsaW5lbjogMTY0NDU2NzAsXG4gICAgbWFnZW50YTogMTY3MTE5MzUsXG4gICAgbWFyb29uOiA4Mzg4NjA4LFxuICAgIG1lZGl1bWFxdWFtYXJpbmU6IDY3MzczMjIsXG4gICAgbWVkaXVtYmx1ZTogMjA1LFxuICAgIG1lZGl1bW9yY2hpZDogMTIyMTE2NjcsXG4gICAgbWVkaXVtcHVycGxlOiA5NjYyNjgzLFxuICAgIG1lZGl1bXNlYWdyZWVuOiAzOTc4MDk3LFxuICAgIG1lZGl1bXNsYXRlYmx1ZTogODA4Nzc5MCxcbiAgICBtZWRpdW1zcHJpbmdncmVlbjogNjQxNTQsXG4gICAgbWVkaXVtdHVycXVvaXNlOiA0NzcyMzAwLFxuICAgIG1lZGl1bXZpb2xldHJlZDogMTMwNDcxNzMsXG4gICAgbWlkbmlnaHRibHVlOiAxNjQ0OTEyLFxuICAgIG1pbnRjcmVhbTogMTYxMjE4NTAsXG4gICAgbWlzdHlyb3NlOiAxNjc3MDI3MyxcbiAgICBtb2NjYXNpbjogMTY3NzAyMjksXG4gICAgbmF2YWpvd2hpdGU6IDE2NzY4Njg1LFxuICAgIG5hdnk6IDEyOCxcbiAgICBvbGRsYWNlOiAxNjY0MzU1OCxcbiAgICBvbGl2ZTogODQyMTM3NixcbiAgICBvbGl2ZWRyYWI6IDcwNDg3MzksXG4gICAgb3JhbmdlOiAxNjc1MzkyMCxcbiAgICBvcmFuZ2VyZWQ6IDE2NzI5MzQ0LFxuICAgIG9yY2hpZDogMTQzMTU3MzQsXG4gICAgcGFsZWdvbGRlbnJvZDogMTU2NTcxMzAsXG4gICAgcGFsZWdyZWVuOiAxMDAyNTg4MCxcbiAgICBwYWxldHVycXVvaXNlOiAxMTUyOTk2NixcbiAgICBwYWxldmlvbGV0cmVkOiAxNDM4MTIwMyxcbiAgICBwYXBheWF3aGlwOiAxNjc3MzA3NyxcbiAgICBwZWFjaHB1ZmY6IDE2NzY3NjczLFxuICAgIHBlcnU6IDEzNDY4OTkxLFxuICAgIHBpbms6IDE2NzYxMDM1LFxuICAgIHBsdW06IDE0NTI0NjM3LFxuICAgIHBvd2RlcmJsdWU6IDExNTkxOTEwLFxuICAgIHB1cnBsZTogODM4ODczNixcbiAgICByZWJlY2NhcHVycGxlOiA2Njk3ODgxLFxuICAgIHJlZDogMTY3MTE2ODAsXG4gICAgcm9zeWJyb3duOiAxMjM1NzUxOSxcbiAgICByb3lhbGJsdWU6IDQyODY5NDUsXG4gICAgc2FkZGxlYnJvd246IDkxMjcxODcsXG4gICAgc2FsbW9uOiAxNjQxNjg4MixcbiAgICBzYW5keWJyb3duOiAxNjAzMjg2NCxcbiAgICBzZWFncmVlbjogMzA1MDMyNyxcbiAgICBzZWFzaGVsbDogMTY3NzQ2MzgsXG4gICAgc2llbm5hOiAxMDUwNjc5NyxcbiAgICBzaWx2ZXI6IDEyNjMyMjU2LFxuICAgIHNreWJsdWU6IDg5MDAzMzEsXG4gICAgc2xhdGVibHVlOiA2OTcwMDYxLFxuICAgIHNsYXRlZ3JheTogNzM3Mjk0NCxcbiAgICBzbGF0ZWdyZXk6IDczNzI5NDQsXG4gICAgc25vdzogMTY3NzU5MzAsXG4gICAgc3ByaW5nZ3JlZW46IDY1NDA3LFxuICAgIHN0ZWVsYmx1ZTogNDYyMDk4MCxcbiAgICB0YW46IDEzODA4NzgwLFxuICAgIHRlYWw6IDMyODk2LFxuICAgIHRoaXN0bGU6IDE0MjA0ODg4LFxuICAgIHRvbWF0bzogMTY3MzcwOTUsXG4gICAgdHVycXVvaXNlOiA0MjUxODU2LFxuICAgIHZpb2xldDogMTU2MzEwODYsXG4gICAgd2hlYXQ6IDE2MTEzMzMxLFxuICAgIHdoaXRlOiAxNjc3NzIxNSxcbiAgICB3aGl0ZXNtb2tlOiAxNjExOTI4NSxcbiAgICB5ZWxsb3c6IDE2Nzc2OTYwLFxuICAgIHllbGxvd2dyZWVuOiAxMDE0NTA3NFxuICB9KTtcbiAgZDNfcmdiX25hbWVzLmZvckVhY2goZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgIGQzX3JnYl9uYW1lcy5zZXQoa2V5LCBkM19yZ2JOdW1iZXIodmFsdWUpKTtcbiAgfSk7XG4gIGZ1bmN0aW9uIGQzX2Z1bmN0b3Iodikge1xuICAgIHJldHVybiB0eXBlb2YgdiA9PT0gXCJmdW5jdGlvblwiID8gdiA6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHY7XG4gICAgfTtcbiAgfVxuICBkMy5mdW5jdG9yID0gZDNfZnVuY3RvcjtcbiAgZDMueGhyID0gZDNfeGhyVHlwZShkM19pZGVudGl0eSk7XG4gIGZ1bmN0aW9uIGQzX3hoclR5cGUocmVzcG9uc2UpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odXJsLCBtaW1lVHlwZSwgY2FsbGJhY2spIHtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBtaW1lVHlwZSA9PT0gXCJmdW5jdGlvblwiKSBjYWxsYmFjayA9IG1pbWVUeXBlLCBcbiAgICAgIG1pbWVUeXBlID0gbnVsbDtcbiAgICAgIHJldHVybiBkM194aHIodXJsLCBtaW1lVHlwZSwgcmVzcG9uc2UsIGNhbGxiYWNrKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGQzX3hocih1cmwsIG1pbWVUeXBlLCByZXNwb25zZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgeGhyID0ge30sIGRpc3BhdGNoID0gZDMuZGlzcGF0Y2goXCJiZWZvcmVzZW5kXCIsIFwicHJvZ3Jlc3NcIiwgXCJsb2FkXCIsIFwiZXJyb3JcIiksIGhlYWRlcnMgPSB7fSwgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpLCByZXNwb25zZVR5cGUgPSBudWxsO1xuICAgIGlmICh0aGlzLlhEb21haW5SZXF1ZXN0ICYmICEoXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiByZXF1ZXN0KSAmJiAvXihodHRwKHMpPzopP1xcL1xcLy8udGVzdCh1cmwpKSByZXF1ZXN0ID0gbmV3IFhEb21haW5SZXF1ZXN0KCk7XG4gICAgXCJvbmxvYWRcIiBpbiByZXF1ZXN0ID8gcmVxdWVzdC5vbmxvYWQgPSByZXF1ZXN0Lm9uZXJyb3IgPSByZXNwb25kIDogcmVxdWVzdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlcXVlc3QucmVhZHlTdGF0ZSA+IDMgJiYgcmVzcG9uZCgpO1xuICAgIH07XG4gICAgZnVuY3Rpb24gcmVzcG9uZCgpIHtcbiAgICAgIHZhciBzdGF0dXMgPSByZXF1ZXN0LnN0YXR1cywgcmVzdWx0O1xuICAgICAgaWYgKCFzdGF0dXMgJiYgZDNfeGhySGFzUmVzcG9uc2UocmVxdWVzdCkgfHwgc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXN1bHQgPSByZXNwb25zZS5jYWxsKHhociwgcmVxdWVzdCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBkaXNwYXRjaC5lcnJvci5jYWxsKHhociwgZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRpc3BhdGNoLmxvYWQuY2FsbCh4aHIsIHJlc3VsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkaXNwYXRjaC5lcnJvci5jYWxsKHhociwgcmVxdWVzdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlcXVlc3Qub25wcm9ncmVzcyA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICB2YXIgbyA9IGQzLmV2ZW50O1xuICAgICAgZDMuZXZlbnQgPSBldmVudDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGRpc3BhdGNoLnByb2dyZXNzLmNhbGwoeGhyLCByZXF1ZXN0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGQzLmV2ZW50ID0gbztcbiAgICAgIH1cbiAgICB9O1xuICAgIHhoci5oZWFkZXIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgICAgbmFtZSA9IChuYW1lICsgXCJcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIGhlYWRlcnNbbmFtZV07XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgZGVsZXRlIGhlYWRlcnNbbmFtZV07IGVsc2UgaGVhZGVyc1tuYW1lXSA9IHZhbHVlICsgXCJcIjtcbiAgICAgIHJldHVybiB4aHI7XG4gICAgfTtcbiAgICB4aHIubWltZVR5cGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbWltZVR5cGU7XG4gICAgICBtaW1lVHlwZSA9IHZhbHVlID09IG51bGwgPyBudWxsIDogdmFsdWUgKyBcIlwiO1xuICAgICAgcmV0dXJuIHhocjtcbiAgICB9O1xuICAgIHhoci5yZXNwb25zZVR5cGUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmVzcG9uc2VUeXBlO1xuICAgICAgcmVzcG9uc2VUeXBlID0gdmFsdWU7XG4gICAgICByZXR1cm4geGhyO1xuICAgIH07XG4gICAgeGhyLnJlc3BvbnNlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJlc3BvbnNlID0gdmFsdWU7XG4gICAgICByZXR1cm4geGhyO1xuICAgIH07XG4gICAgWyBcImdldFwiLCBcInBvc3RcIiBdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICB4aHJbbWV0aG9kXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4geGhyLnNlbmQuYXBwbHkoeGhyLCBbIG1ldGhvZCBdLmNvbmNhdChkM19hcnJheShhcmd1bWVudHMpKSk7XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHhoci5zZW5kID0gZnVuY3Rpb24obWV0aG9kLCBkYXRhLCBjYWxsYmFjaykge1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgdHlwZW9mIGRhdGEgPT09IFwiZnVuY3Rpb25cIikgY2FsbGJhY2sgPSBkYXRhLCBkYXRhID0gbnVsbDtcbiAgICAgIHJlcXVlc3Qub3BlbihtZXRob2QsIHVybCwgdHJ1ZSk7XG4gICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCAmJiAhKFwiYWNjZXB0XCIgaW4gaGVhZGVycykpIGhlYWRlcnNbXCJhY2NlcHRcIl0gPSBtaW1lVHlwZSArIFwiLCovKlwiO1xuICAgICAgaWYgKHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcikgZm9yICh2YXIgbmFtZSBpbiBoZWFkZXJzKSByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIobmFtZSwgaGVhZGVyc1tuYW1lXSk7XG4gICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCAmJiByZXF1ZXN0Lm92ZXJyaWRlTWltZVR5cGUpIHJlcXVlc3Qub3ZlcnJpZGVNaW1lVHlwZShtaW1lVHlwZSk7XG4gICAgICBpZiAocmVzcG9uc2VUeXBlICE9IG51bGwpIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlO1xuICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHhoci5vbihcImVycm9yXCIsIGNhbGxiYWNrKS5vbihcImxvYWRcIiwgZnVuY3Rpb24ocmVxdWVzdCkge1xuICAgICAgICBjYWxsYmFjayhudWxsLCByZXF1ZXN0KTtcbiAgICAgIH0pO1xuICAgICAgZGlzcGF0Y2guYmVmb3Jlc2VuZC5jYWxsKHhociwgcmVxdWVzdCk7XG4gICAgICByZXF1ZXN0LnNlbmQoZGF0YSA9PSBudWxsID8gbnVsbCA6IGRhdGEpO1xuICAgICAgcmV0dXJuIHhocjtcbiAgICB9O1xuICAgIHhoci5hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVxdWVzdC5hYm9ydCgpO1xuICAgICAgcmV0dXJuIHhocjtcbiAgICB9O1xuICAgIGQzLnJlYmluZCh4aHIsIGRpc3BhdGNoLCBcIm9uXCIpO1xuICAgIHJldHVybiBjYWxsYmFjayA9PSBudWxsID8geGhyIDogeGhyLmdldChkM194aHJfZml4Q2FsbGJhY2soY2FsbGJhY2spKTtcbiAgfVxuICBmdW5jdGlvbiBkM194aHJfZml4Q2FsbGJhY2soY2FsbGJhY2spIHtcbiAgICByZXR1cm4gY2FsbGJhY2subGVuZ3RoID09PSAxID8gZnVuY3Rpb24oZXJyb3IsIHJlcXVlc3QpIHtcbiAgICAgIGNhbGxiYWNrKGVycm9yID09IG51bGwgPyByZXF1ZXN0IDogbnVsbCk7XG4gICAgfSA6IGNhbGxiYWNrO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3hockhhc1Jlc3BvbnNlKHJlcXVlc3QpIHtcbiAgICB2YXIgdHlwZSA9IHJlcXVlc3QucmVzcG9uc2VUeXBlO1xuICAgIHJldHVybiB0eXBlICYmIHR5cGUgIT09IFwidGV4dFwiID8gcmVxdWVzdC5yZXNwb25zZSA6IHJlcXVlc3QucmVzcG9uc2VUZXh0O1xuICB9XG4gIGQzLmRzdiA9IGZ1bmN0aW9uKGRlbGltaXRlciwgbWltZVR5cGUpIHtcbiAgICB2YXIgcmVGb3JtYXQgPSBuZXcgUmVnRXhwKCdbXCInICsgZGVsaW1pdGVyICsgXCJcXG5dXCIpLCBkZWxpbWl0ZXJDb2RlID0gZGVsaW1pdGVyLmNoYXJDb2RlQXQoMCk7XG4gICAgZnVuY3Rpb24gZHN2KHVybCwgcm93LCBjYWxsYmFjaykge1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBjYWxsYmFjayA9IHJvdywgcm93ID0gbnVsbDtcbiAgICAgIHZhciB4aHIgPSBkM194aHIodXJsLCBtaW1lVHlwZSwgcm93ID09IG51bGwgPyByZXNwb25zZSA6IHR5cGVkUmVzcG9uc2Uocm93KSwgY2FsbGJhY2spO1xuICAgICAgeGhyLnJvdyA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB4aHIucmVzcG9uc2UoKHJvdyA9IF8pID09IG51bGwgPyByZXNwb25zZSA6IHR5cGVkUmVzcG9uc2UoXykpIDogcm93O1xuICAgICAgfTtcbiAgICAgIHJldHVybiB4aHI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlc3BvbnNlKHJlcXVlc3QpIHtcbiAgICAgIHJldHVybiBkc3YucGFyc2UocmVxdWVzdC5yZXNwb25zZVRleHQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0eXBlZFJlc3BvbnNlKGYpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybiBkc3YucGFyc2UocmVxdWVzdC5yZXNwb25zZVRleHQsIGYpO1xuICAgICAgfTtcbiAgICB9XG4gICAgZHN2LnBhcnNlID0gZnVuY3Rpb24odGV4dCwgZikge1xuICAgICAgdmFyIG87XG4gICAgICByZXR1cm4gZHN2LnBhcnNlUm93cyh0ZXh0LCBmdW5jdGlvbihyb3csIGkpIHtcbiAgICAgICAgaWYgKG8pIHJldHVybiBvKHJvdywgaSAtIDEpO1xuICAgICAgICB2YXIgYSA9IG5ldyBGdW5jdGlvbihcImRcIiwgXCJyZXR1cm4ge1wiICsgcm93Lm1hcChmdW5jdGlvbihuYW1lLCBpKSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG5hbWUpICsgXCI6IGRbXCIgKyBpICsgXCJdXCI7XG4gICAgICAgIH0pLmpvaW4oXCIsXCIpICsgXCJ9XCIpO1xuICAgICAgICBvID0gZiA/IGZ1bmN0aW9uKHJvdywgaSkge1xuICAgICAgICAgIHJldHVybiBmKGEocm93KSwgaSk7XG4gICAgICAgIH0gOiBhO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBkc3YucGFyc2VSb3dzID0gZnVuY3Rpb24odGV4dCwgZikge1xuICAgICAgdmFyIEVPTCA9IHt9LCBFT0YgPSB7fSwgcm93cyA9IFtdLCBOID0gdGV4dC5sZW5ndGgsIEkgPSAwLCBuID0gMCwgdCwgZW9sO1xuICAgICAgZnVuY3Rpb24gdG9rZW4oKSB7XG4gICAgICAgIGlmIChJID49IE4pIHJldHVybiBFT0Y7XG4gICAgICAgIGlmIChlb2wpIHJldHVybiBlb2wgPSBmYWxzZSwgRU9MO1xuICAgICAgICB2YXIgaiA9IEk7XG4gICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaikgPT09IDM0KSB7XG4gICAgICAgICAgdmFyIGkgPSBqO1xuICAgICAgICAgIHdoaWxlIChpKysgPCBOKSB7XG4gICAgICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGkpID09PSAzNCkge1xuICAgICAgICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGkgKyAxKSAhPT0gMzQpIGJyZWFrO1xuICAgICAgICAgICAgICArK2k7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIEkgPSBpICsgMjtcbiAgICAgICAgICB2YXIgYyA9IHRleHQuY2hhckNvZGVBdChpICsgMSk7XG4gICAgICAgICAgaWYgKGMgPT09IDEzKSB7XG4gICAgICAgICAgICBlb2wgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChpICsgMikgPT09IDEwKSArK0k7XG4gICAgICAgICAgfSBlbHNlIGlmIChjID09PSAxMCkge1xuICAgICAgICAgICAgZW9sID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UoaiArIDEsIGkpLnJlcGxhY2UoL1wiXCIvZywgJ1wiJyk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKEkgPCBOKSB7XG4gICAgICAgICAgdmFyIGMgPSB0ZXh0LmNoYXJDb2RlQXQoSSsrKSwgayA9IDE7XG4gICAgICAgICAgaWYgKGMgPT09IDEwKSBlb2wgPSB0cnVlOyBlbHNlIGlmIChjID09PSAxMykge1xuICAgICAgICAgICAgZW9sID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoSSkgPT09IDEwKSArK0ksICsraztcbiAgICAgICAgICB9IGVsc2UgaWYgKGMgIT09IGRlbGltaXRlckNvZGUpIGNvbnRpbnVlO1xuICAgICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKGosIEkgLSBrKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlICgodCA9IHRva2VuKCkpICE9PSBFT0YpIHtcbiAgICAgICAgdmFyIGEgPSBbXTtcbiAgICAgICAgd2hpbGUgKHQgIT09IEVPTCAmJiB0ICE9PSBFT0YpIHtcbiAgICAgICAgICBhLnB1c2godCk7XG4gICAgICAgICAgdCA9IHRva2VuKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGYgJiYgKGEgPSBmKGEsIG4rKykpID09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICByb3dzLnB1c2goYSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcm93cztcbiAgICB9O1xuICAgIGRzdi5mb3JtYXQgPSBmdW5jdGlvbihyb3dzKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dzWzBdKSkgcmV0dXJuIGRzdi5mb3JtYXRSb3dzKHJvd3MpO1xuICAgICAgdmFyIGZpZWxkU2V0ID0gbmV3IGQzX1NldCgpLCBmaWVsZHMgPSBbXTtcbiAgICAgIHJvd3MuZm9yRWFjaChmdW5jdGlvbihyb3cpIHtcbiAgICAgICAgZm9yICh2YXIgZmllbGQgaW4gcm93KSB7XG4gICAgICAgICAgaWYgKCFmaWVsZFNldC5oYXMoZmllbGQpKSB7XG4gICAgICAgICAgICBmaWVsZHMucHVzaChmaWVsZFNldC5hZGQoZmllbGQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFsgZmllbGRzLm1hcChmb3JtYXRWYWx1ZSkuam9pbihkZWxpbWl0ZXIpIF0uY29uY2F0KHJvd3MubWFwKGZ1bmN0aW9uKHJvdykge1xuICAgICAgICByZXR1cm4gZmllbGRzLm1hcChmdW5jdGlvbihmaWVsZCkge1xuICAgICAgICAgIHJldHVybiBmb3JtYXRWYWx1ZShyb3dbZmllbGRdKTtcbiAgICAgICAgfSkuam9pbihkZWxpbWl0ZXIpO1xuICAgICAgfSkpLmpvaW4oXCJcXG5cIik7XG4gICAgfTtcbiAgICBkc3YuZm9ybWF0Um93cyA9IGZ1bmN0aW9uKHJvd3MpIHtcbiAgICAgIHJldHVybiByb3dzLm1hcChmb3JtYXRSb3cpLmpvaW4oXCJcXG5cIik7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBmb3JtYXRSb3cocm93KSB7XG4gICAgICByZXR1cm4gcm93Lm1hcChmb3JtYXRWYWx1ZSkuam9pbihkZWxpbWl0ZXIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmb3JtYXRWYWx1ZSh0ZXh0KSB7XG4gICAgICByZXR1cm4gcmVGb3JtYXQudGVzdCh0ZXh0KSA/ICdcIicgKyB0ZXh0LnJlcGxhY2UoL1xcXCIvZywgJ1wiXCInKSArICdcIicgOiB0ZXh0O1xuICAgIH1cbiAgICByZXR1cm4gZHN2O1xuICB9O1xuICBkMy5jc3YgPSBkMy5kc3YoXCIsXCIsIFwidGV4dC9jc3ZcIik7XG4gIGQzLnRzdiA9IGQzLmRzdihcIlx0XCIsIFwidGV4dC90YWItc2VwYXJhdGVkLXZhbHVlc1wiKTtcbiAgdmFyIGQzX3RpbWVyX3F1ZXVlSGVhZCwgZDNfdGltZXJfcXVldWVUYWlsLCBkM190aW1lcl9pbnRlcnZhbCwgZDNfdGltZXJfdGltZW91dCwgZDNfdGltZXJfZnJhbWUgPSB0aGlzW2QzX3ZlbmRvclN5bWJvbCh0aGlzLCBcInJlcXVlc3RBbmltYXRpb25GcmFtZVwiKV0gfHwgZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICBzZXRUaW1lb3V0KGNhbGxiYWNrLCAxNyk7XG4gIH07XG4gIGQzLnRpbWVyID0gZnVuY3Rpb24oKSB7XG4gICAgZDNfdGltZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfdGltZXIoY2FsbGJhY2ssIGRlbGF5LCB0aGVuKSB7XG4gICAgdmFyIG4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGlmIChuIDwgMikgZGVsYXkgPSAwO1xuICAgIGlmIChuIDwgMykgdGhlbiA9IERhdGUubm93KCk7XG4gICAgdmFyIHRpbWUgPSB0aGVuICsgZGVsYXksIHRpbWVyID0ge1xuICAgICAgYzogY2FsbGJhY2ssXG4gICAgICB0OiB0aW1lLFxuICAgICAgbjogbnVsbFxuICAgIH07XG4gICAgaWYgKGQzX3RpbWVyX3F1ZXVlVGFpbCkgZDNfdGltZXJfcXVldWVUYWlsLm4gPSB0aW1lcjsgZWxzZSBkM190aW1lcl9xdWV1ZUhlYWQgPSB0aW1lcjtcbiAgICBkM190aW1lcl9xdWV1ZVRhaWwgPSB0aW1lcjtcbiAgICBpZiAoIWQzX3RpbWVyX2ludGVydmFsKSB7XG4gICAgICBkM190aW1lcl90aW1lb3V0ID0gY2xlYXJUaW1lb3V0KGQzX3RpbWVyX3RpbWVvdXQpO1xuICAgICAgZDNfdGltZXJfaW50ZXJ2YWwgPSAxO1xuICAgICAgZDNfdGltZXJfZnJhbWUoZDNfdGltZXJfc3RlcCk7XG4gICAgfVxuICAgIHJldHVybiB0aW1lcjtcbiAgfVxuICBmdW5jdGlvbiBkM190aW1lcl9zdGVwKCkge1xuICAgIHZhciBub3cgPSBkM190aW1lcl9tYXJrKCksIGRlbGF5ID0gZDNfdGltZXJfc3dlZXAoKSAtIG5vdztcbiAgICBpZiAoZGVsYXkgPiAyNCkge1xuICAgICAgaWYgKGlzRmluaXRlKGRlbGF5KSkge1xuICAgICAgICBjbGVhclRpbWVvdXQoZDNfdGltZXJfdGltZW91dCk7XG4gICAgICAgIGQzX3RpbWVyX3RpbWVvdXQgPSBzZXRUaW1lb3V0KGQzX3RpbWVyX3N0ZXAsIGRlbGF5KTtcbiAgICAgIH1cbiAgICAgIGQzX3RpbWVyX2ludGVydmFsID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgZDNfdGltZXJfaW50ZXJ2YWwgPSAxO1xuICAgICAgZDNfdGltZXJfZnJhbWUoZDNfdGltZXJfc3RlcCk7XG4gICAgfVxuICB9XG4gIGQzLnRpbWVyLmZsdXNoID0gZnVuY3Rpb24oKSB7XG4gICAgZDNfdGltZXJfbWFyaygpO1xuICAgIGQzX3RpbWVyX3N3ZWVwKCk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3RpbWVyX21hcmsoKSB7XG4gICAgdmFyIG5vdyA9IERhdGUubm93KCksIHRpbWVyID0gZDNfdGltZXJfcXVldWVIZWFkO1xuICAgIHdoaWxlICh0aW1lcikge1xuICAgICAgaWYgKG5vdyA+PSB0aW1lci50ICYmIHRpbWVyLmMobm93IC0gdGltZXIudCkpIHRpbWVyLmMgPSBudWxsO1xuICAgICAgdGltZXIgPSB0aW1lci5uO1xuICAgIH1cbiAgICByZXR1cm4gbm93O1xuICB9XG4gIGZ1bmN0aW9uIGQzX3RpbWVyX3N3ZWVwKCkge1xuICAgIHZhciB0MCwgdDEgPSBkM190aW1lcl9xdWV1ZUhlYWQsIHRpbWUgPSBJbmZpbml0eTtcbiAgICB3aGlsZSAodDEpIHtcbiAgICAgIGlmICh0MS5jKSB7XG4gICAgICAgIGlmICh0MS50IDwgdGltZSkgdGltZSA9IHQxLnQ7XG4gICAgICAgIHQxID0gKHQwID0gdDEpLm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0MSA9IHQwID8gdDAubiA9IHQxLm4gOiBkM190aW1lcl9xdWV1ZUhlYWQgPSB0MS5uO1xuICAgICAgfVxuICAgIH1cbiAgICBkM190aW1lcl9xdWV1ZVRhaWwgPSB0MDtcbiAgICByZXR1cm4gdGltZTtcbiAgfVxuICBmdW5jdGlvbiBkM19mb3JtYXRfcHJlY2lzaW9uKHgsIHApIHtcbiAgICByZXR1cm4gcCAtICh4ID8gTWF0aC5jZWlsKE1hdGgubG9nKHgpIC8gTWF0aC5MTjEwKSA6IDEpO1xuICB9XG4gIGQzLnJvdW5kID0gZnVuY3Rpb24oeCwgbikge1xuICAgIHJldHVybiBuID8gTWF0aC5yb3VuZCh4ICogKG4gPSBNYXRoLnBvdygxMCwgbikpKSAvIG4gOiBNYXRoLnJvdW5kKHgpO1xuICB9O1xuICB2YXIgZDNfZm9ybWF0UHJlZml4ZXMgPSBbIFwieVwiLCBcInpcIiwgXCJhXCIsIFwiZlwiLCBcInBcIiwgXCJuXCIsIFwiwrVcIiwgXCJtXCIsIFwiXCIsIFwia1wiLCBcIk1cIiwgXCJHXCIsIFwiVFwiLCBcIlBcIiwgXCJFXCIsIFwiWlwiLCBcIllcIiBdLm1hcChkM19mb3JtYXRQcmVmaXgpO1xuICBkMy5mb3JtYXRQcmVmaXggPSBmdW5jdGlvbih2YWx1ZSwgcHJlY2lzaW9uKSB7XG4gICAgdmFyIGkgPSAwO1xuICAgIGlmICh2YWx1ZSA9ICt2YWx1ZSkge1xuICAgICAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgKj0gLTE7XG4gICAgICBpZiAocHJlY2lzaW9uKSB2YWx1ZSA9IGQzLnJvdW5kKHZhbHVlLCBkM19mb3JtYXRfcHJlY2lzaW9uKHZhbHVlLCBwcmVjaXNpb24pKTtcbiAgICAgIGkgPSAxICsgTWF0aC5mbG9vcigxZS0xMiArIE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4xMCk7XG4gICAgICBpID0gTWF0aC5tYXgoLTI0LCBNYXRoLm1pbigyNCwgTWF0aC5mbG9vcigoaSAtIDEpIC8gMykgKiAzKSk7XG4gICAgfVxuICAgIHJldHVybiBkM19mb3JtYXRQcmVmaXhlc1s4ICsgaSAvIDNdO1xuICB9O1xuICBmdW5jdGlvbiBkM19mb3JtYXRQcmVmaXgoZCwgaSkge1xuICAgIHZhciBrID0gTWF0aC5wb3coMTAsIGFicyg4IC0gaSkgKiAzKTtcbiAgICByZXR1cm4ge1xuICAgICAgc2NhbGU6IGkgPiA4ID8gZnVuY3Rpb24oZCkge1xuICAgICAgICByZXR1cm4gZCAvIGs7XG4gICAgICB9IDogZnVuY3Rpb24oZCkge1xuICAgICAgICByZXR1cm4gZCAqIGs7XG4gICAgICB9LFxuICAgICAgc3ltYm9sOiBkXG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkM19sb2NhbGVfbnVtYmVyRm9ybWF0KGxvY2FsZSkge1xuICAgIHZhciBsb2NhbGVfZGVjaW1hbCA9IGxvY2FsZS5kZWNpbWFsLCBsb2NhbGVfdGhvdXNhbmRzID0gbG9jYWxlLnRob3VzYW5kcywgbG9jYWxlX2dyb3VwaW5nID0gbG9jYWxlLmdyb3VwaW5nLCBsb2NhbGVfY3VycmVuY3kgPSBsb2NhbGUuY3VycmVuY3ksIGZvcm1hdEdyb3VwID0gbG9jYWxlX2dyb3VwaW5nICYmIGxvY2FsZV90aG91c2FuZHMgPyBmdW5jdGlvbih2YWx1ZSwgd2lkdGgpIHtcbiAgICAgIHZhciBpID0gdmFsdWUubGVuZ3RoLCB0ID0gW10sIGogPSAwLCBnID0gbG9jYWxlX2dyb3VwaW5nWzBdLCBsZW5ndGggPSAwO1xuICAgICAgd2hpbGUgKGkgPiAwICYmIGcgPiAwKSB7XG4gICAgICAgIGlmIChsZW5ndGggKyBnICsgMSA+IHdpZHRoKSBnID0gTWF0aC5tYXgoMSwgd2lkdGggLSBsZW5ndGgpO1xuICAgICAgICB0LnB1c2godmFsdWUuc3Vic3RyaW5nKGkgLT0gZywgaSArIGcpKTtcbiAgICAgICAgaWYgKChsZW5ndGggKz0gZyArIDEpID4gd2lkdGgpIGJyZWFrO1xuICAgICAgICBnID0gbG9jYWxlX2dyb3VwaW5nW2ogPSAoaiArIDEpICUgbG9jYWxlX2dyb3VwaW5nLmxlbmd0aF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdC5yZXZlcnNlKCkuam9pbihsb2NhbGVfdGhvdXNhbmRzKTtcbiAgICB9IDogZDNfaWRlbnRpdHk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHNwZWNpZmllcikge1xuICAgICAgdmFyIG1hdGNoID0gZDNfZm9ybWF0X3JlLmV4ZWMoc3BlY2lmaWVyKSwgZmlsbCA9IG1hdGNoWzFdIHx8IFwiIFwiLCBhbGlnbiA9IG1hdGNoWzJdIHx8IFwiPlwiLCBzaWduID0gbWF0Y2hbM10gfHwgXCItXCIsIHN5bWJvbCA9IG1hdGNoWzRdIHx8IFwiXCIsIHpmaWxsID0gbWF0Y2hbNV0sIHdpZHRoID0gK21hdGNoWzZdLCBjb21tYSA9IG1hdGNoWzddLCBwcmVjaXNpb24gPSBtYXRjaFs4XSwgdHlwZSA9IG1hdGNoWzldLCBzY2FsZSA9IDEsIHByZWZpeCA9IFwiXCIsIHN1ZmZpeCA9IFwiXCIsIGludGVnZXIgPSBmYWxzZSwgZXhwb25lbnQgPSB0cnVlO1xuICAgICAgaWYgKHByZWNpc2lvbikgcHJlY2lzaW9uID0gK3ByZWNpc2lvbi5zdWJzdHJpbmcoMSk7XG4gICAgICBpZiAoemZpbGwgfHwgZmlsbCA9PT0gXCIwXCIgJiYgYWxpZ24gPT09IFwiPVwiKSB7XG4gICAgICAgIHpmaWxsID0gZmlsbCA9IFwiMFwiO1xuICAgICAgICBhbGlnbiA9IFwiPVwiO1xuICAgICAgfVxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgY2FzZSBcIm5cIjpcbiAgICAgICAgY29tbWEgPSB0cnVlO1xuICAgICAgICB0eXBlID0gXCJnXCI7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICAgY2FzZSBcIiVcIjpcbiAgICAgICAgc2NhbGUgPSAxMDA7XG4gICAgICAgIHN1ZmZpeCA9IFwiJVwiO1xuICAgICAgICB0eXBlID0gXCJmXCI7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICAgY2FzZSBcInBcIjpcbiAgICAgICAgc2NhbGUgPSAxMDA7XG4gICAgICAgIHN1ZmZpeCA9IFwiJVwiO1xuICAgICAgICB0eXBlID0gXCJyXCI7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICAgY2FzZSBcImJcIjpcbiAgICAgICBjYXNlIFwib1wiOlxuICAgICAgIGNhc2UgXCJ4XCI6XG4gICAgICAgY2FzZSBcIlhcIjpcbiAgICAgICAgaWYgKHN5bWJvbCA9PT0gXCIjXCIpIHByZWZpeCA9IFwiMFwiICsgdHlwZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgY2FzZSBcImNcIjpcbiAgICAgICAgZXhwb25lbnQgPSBmYWxzZTtcblxuICAgICAgIGNhc2UgXCJkXCI6XG4gICAgICAgIGludGVnZXIgPSB0cnVlO1xuICAgICAgICBwcmVjaXNpb24gPSAwO1xuICAgICAgICBicmVhaztcblxuICAgICAgIGNhc2UgXCJzXCI6XG4gICAgICAgIHNjYWxlID0gLTE7XG4gICAgICAgIHR5cGUgPSBcInJcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc3ltYm9sID09PSBcIiRcIikgcHJlZml4ID0gbG9jYWxlX2N1cnJlbmN5WzBdLCBzdWZmaXggPSBsb2NhbGVfY3VycmVuY3lbMV07XG4gICAgICBpZiAodHlwZSA9PSBcInJcIiAmJiAhcHJlY2lzaW9uKSB0eXBlID0gXCJnXCI7XG4gICAgICBpZiAocHJlY2lzaW9uICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGUgPT0gXCJnXCIpIHByZWNpc2lvbiA9IE1hdGgubWF4KDEsIE1hdGgubWluKDIxLCBwcmVjaXNpb24pKTsgZWxzZSBpZiAodHlwZSA9PSBcImVcIiB8fCB0eXBlID09IFwiZlwiKSBwcmVjaXNpb24gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyMCwgcHJlY2lzaW9uKSk7XG4gICAgICB9XG4gICAgICB0eXBlID0gZDNfZm9ybWF0X3R5cGVzLmdldCh0eXBlKSB8fCBkM19mb3JtYXRfdHlwZURlZmF1bHQ7XG4gICAgICB2YXIgemNvbW1hID0gemZpbGwgJiYgY29tbWE7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgdmFyIGZ1bGxTdWZmaXggPSBzdWZmaXg7XG4gICAgICAgIGlmIChpbnRlZ2VyICYmIHZhbHVlICUgMSkgcmV0dXJuIFwiXCI7XG4gICAgICAgIHZhciBuZWdhdGl2ZSA9IHZhbHVlIDwgMCB8fCB2YWx1ZSA9PT0gMCAmJiAxIC8gdmFsdWUgPCAwID8gKHZhbHVlID0gLXZhbHVlLCBcIi1cIikgOiBzaWduID09PSBcIi1cIiA/IFwiXCIgOiBzaWduO1xuICAgICAgICBpZiAoc2NhbGUgPCAwKSB7XG4gICAgICAgICAgdmFyIHVuaXQgPSBkMy5mb3JtYXRQcmVmaXgodmFsdWUsIHByZWNpc2lvbik7XG4gICAgICAgICAgdmFsdWUgPSB1bml0LnNjYWxlKHZhbHVlKTtcbiAgICAgICAgICBmdWxsU3VmZml4ID0gdW5pdC5zeW1ib2wgKyBzdWZmaXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgKj0gc2NhbGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB0eXBlKHZhbHVlLCBwcmVjaXNpb24pO1xuICAgICAgICB2YXIgaSA9IHZhbHVlLmxhc3RJbmRleE9mKFwiLlwiKSwgYmVmb3JlLCBhZnRlcjtcbiAgICAgICAgaWYgKGkgPCAwKSB7XG4gICAgICAgICAgdmFyIGogPSBleHBvbmVudCA/IHZhbHVlLmxhc3RJbmRleE9mKFwiZVwiKSA6IC0xO1xuICAgICAgICAgIGlmIChqIDwgMCkgYmVmb3JlID0gdmFsdWUsIGFmdGVyID0gXCJcIjsgZWxzZSBiZWZvcmUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgaiksIGFmdGVyID0gdmFsdWUuc3Vic3RyaW5nKGopO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJlZm9yZSA9IHZhbHVlLnN1YnN0cmluZygwLCBpKTtcbiAgICAgICAgICBhZnRlciA9IGxvY2FsZV9kZWNpbWFsICsgdmFsdWUuc3Vic3RyaW5nKGkgKyAxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXpmaWxsICYmIGNvbW1hKSBiZWZvcmUgPSBmb3JtYXRHcm91cChiZWZvcmUsIEluZmluaXR5KTtcbiAgICAgICAgdmFyIGxlbmd0aCA9IHByZWZpeC5sZW5ndGggKyBiZWZvcmUubGVuZ3RoICsgYWZ0ZXIubGVuZ3RoICsgKHpjb21tYSA/IDAgOiBuZWdhdGl2ZS5sZW5ndGgpLCBwYWRkaW5nID0gbGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkobGVuZ3RoID0gd2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwpIDogXCJcIjtcbiAgICAgICAgaWYgKHpjb21tYSkgYmVmb3JlID0gZm9ybWF0R3JvdXAocGFkZGluZyArIGJlZm9yZSwgcGFkZGluZy5sZW5ndGggPyB3aWR0aCAtIGFmdGVyLmxlbmd0aCA6IEluZmluaXR5KTtcbiAgICAgICAgbmVnYXRpdmUgKz0gcHJlZml4O1xuICAgICAgICB2YWx1ZSA9IGJlZm9yZSArIGFmdGVyO1xuICAgICAgICByZXR1cm4gKGFsaWduID09PSBcIjxcIiA/IG5lZ2F0aXZlICsgdmFsdWUgKyBwYWRkaW5nIDogYWxpZ24gPT09IFwiPlwiID8gcGFkZGluZyArIG5lZ2F0aXZlICsgdmFsdWUgOiBhbGlnbiA9PT0gXCJeXCIgPyBwYWRkaW5nLnN1YnN0cmluZygwLCBsZW5ndGggPj49IDEpICsgbmVnYXRpdmUgKyB2YWx1ZSArIHBhZGRpbmcuc3Vic3RyaW5nKGxlbmd0aCkgOiBuZWdhdGl2ZSArICh6Y29tbWEgPyB2YWx1ZSA6IHBhZGRpbmcgKyB2YWx1ZSkpICsgZnVsbFN1ZmZpeDtcbiAgICAgIH07XG4gICAgfTtcbiAgfVxuICB2YXIgZDNfZm9ybWF0X3JlID0gLyg/OihbXntdKT8oWzw+PV5dKSk/KFsrXFwtIF0pPyhbJCNdKT8oMCk/KFxcZCspPygsKT8oXFwuLT9cXGQrKT8oW2EteiVdKT8vaTtcbiAgdmFyIGQzX2Zvcm1hdF90eXBlcyA9IGQzLm1hcCh7XG4gICAgYjogZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIHgudG9TdHJpbmcoMik7XG4gICAgfSxcbiAgICBjOiBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSh4KTtcbiAgICB9LFxuICAgIG86IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiB4LnRvU3RyaW5nKDgpO1xuICAgIH0sXG4gICAgeDogZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIHgudG9TdHJpbmcoMTYpO1xuICAgIH0sXG4gICAgWDogZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIHgudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gICAgfSxcbiAgICBnOiBmdW5jdGlvbih4LCBwKSB7XG4gICAgICByZXR1cm4geC50b1ByZWNpc2lvbihwKTtcbiAgICB9LFxuICAgIGU6IGZ1bmN0aW9uKHgsIHApIHtcbiAgICAgIHJldHVybiB4LnRvRXhwb25lbnRpYWwocCk7XG4gICAgfSxcbiAgICBmOiBmdW5jdGlvbih4LCBwKSB7XG4gICAgICByZXR1cm4geC50b0ZpeGVkKHApO1xuICAgIH0sXG4gICAgcjogZnVuY3Rpb24oeCwgcCkge1xuICAgICAgcmV0dXJuICh4ID0gZDMucm91bmQoeCwgZDNfZm9ybWF0X3ByZWNpc2lvbih4LCBwKSkpLnRvRml4ZWQoTWF0aC5tYXgoMCwgTWF0aC5taW4oMjAsIGQzX2Zvcm1hdF9wcmVjaXNpb24oeCAqICgxICsgMWUtMTUpLCBwKSkpKTtcbiAgICB9XG4gIH0pO1xuICBmdW5jdGlvbiBkM19mb3JtYXRfdHlwZURlZmF1bHQoeCkge1xuICAgIHJldHVybiB4ICsgXCJcIjtcbiAgfVxuICB2YXIgZDNfdGltZSA9IGQzLnRpbWUgPSB7fSwgZDNfZGF0ZSA9IERhdGU7XG4gIGZ1bmN0aW9uIGQzX2RhdGVfdXRjKCkge1xuICAgIHRoaXMuXyA9IG5ldyBEYXRlKGFyZ3VtZW50cy5sZW5ndGggPiAxID8gRGF0ZS5VVEMuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGFyZ3VtZW50c1swXSk7XG4gIH1cbiAgZDNfZGF0ZV91dGMucHJvdG90eXBlID0ge1xuICAgIGdldERhdGU6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuXy5nZXRVVENEYXRlKCk7XG4gICAgfSxcbiAgICBnZXREYXk6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuXy5nZXRVVENEYXkoKTtcbiAgICB9LFxuICAgIGdldEZ1bGxZZWFyOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl8uZ2V0VVRDRnVsbFllYXIoKTtcbiAgICB9LFxuICAgIGdldEhvdXJzOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl8uZ2V0VVRDSG91cnMoKTtcbiAgICB9LFxuICAgIGdldE1pbGxpc2Vjb25kczogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fLmdldFVUQ01pbGxpc2Vjb25kcygpO1xuICAgIH0sXG4gICAgZ2V0TWludXRlczogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fLmdldFVUQ01pbnV0ZXMoKTtcbiAgICB9LFxuICAgIGdldE1vbnRoOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl8uZ2V0VVRDTW9udGgoKTtcbiAgICB9LFxuICAgIGdldFNlY29uZHM6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuXy5nZXRVVENTZWNvbmRzKCk7XG4gICAgfSxcbiAgICBnZXRUaW1lOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl8uZ2V0VGltZSgpO1xuICAgIH0sXG4gICAgZ2V0VGltZXpvbmVPZmZzZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSxcbiAgICB2YWx1ZU9mOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl8udmFsdWVPZigpO1xuICAgIH0sXG4gICAgc2V0RGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENEYXRlLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHNldERheTogZnVuY3Rpb24oKSB7XG4gICAgICBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENEYXkuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgc2V0RnVsbFllYXI6IGZ1bmN0aW9uKCkge1xuICAgICAgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDRnVsbFllYXIuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgc2V0SG91cnM6IGZ1bmN0aW9uKCkge1xuICAgICAgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDSG91cnMuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgc2V0TWlsbGlzZWNvbmRzOiBmdW5jdGlvbigpIHtcbiAgICAgIGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ01pbGxpc2Vjb25kcy5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBzZXRNaW51dGVzOiBmdW5jdGlvbigpIHtcbiAgICAgIGQzX3RpbWVfcHJvdG90eXBlLnNldFVUQ01pbnV0ZXMuYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgc2V0TW9udGg6IGZ1bmN0aW9uKCkge1xuICAgICAgZDNfdGltZV9wcm90b3R5cGUuc2V0VVRDTW9udGguYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgc2V0U2Vjb25kczogZnVuY3Rpb24oKSB7XG4gICAgICBkM190aW1lX3Byb3RvdHlwZS5zZXRVVENTZWNvbmRzLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHNldFRpbWU6IGZ1bmN0aW9uKCkge1xuICAgICAgZDNfdGltZV9wcm90b3R5cGUuc2V0VGltZS5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9O1xuICB2YXIgZDNfdGltZV9wcm90b3R5cGUgPSBEYXRlLnByb3RvdHlwZTtcbiAgZnVuY3Rpb24gZDNfdGltZV9pbnRlcnZhbChsb2NhbCwgc3RlcCwgbnVtYmVyKSB7XG4gICAgZnVuY3Rpb24gcm91bmQoZGF0ZSkge1xuICAgICAgdmFyIGQwID0gbG9jYWwoZGF0ZSksIGQxID0gb2Zmc2V0KGQwLCAxKTtcbiAgICAgIHJldHVybiBkYXRlIC0gZDAgPCBkMSAtIGRhdGUgPyBkMCA6IGQxO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjZWlsKGRhdGUpIHtcbiAgICAgIHN0ZXAoZGF0ZSA9IGxvY2FsKG5ldyBkM19kYXRlKGRhdGUgLSAxKSksIDEpO1xuICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG9mZnNldChkYXRlLCBrKSB7XG4gICAgICBzdGVwKGRhdGUgPSBuZXcgZDNfZGF0ZSgrZGF0ZSksIGspO1xuICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJhbmdlKHQwLCB0MSwgZHQpIHtcbiAgICAgIHZhciB0aW1lID0gY2VpbCh0MCksIHRpbWVzID0gW107XG4gICAgICBpZiAoZHQgPiAxKSB7XG4gICAgICAgIHdoaWxlICh0aW1lIDwgdDEpIHtcbiAgICAgICAgICBpZiAoIShudW1iZXIodGltZSkgJSBkdCkpIHRpbWVzLnB1c2gobmV3IERhdGUoK3RpbWUpKTtcbiAgICAgICAgICBzdGVwKHRpbWUsIDEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aGlsZSAodGltZSA8IHQxKSB0aW1lcy5wdXNoKG5ldyBEYXRlKCt0aW1lKSksIHN0ZXAodGltZSwgMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGltZXM7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJhbmdlX3V0Yyh0MCwgdDEsIGR0KSB7XG4gICAgICB0cnkge1xuICAgICAgICBkM19kYXRlID0gZDNfZGF0ZV91dGM7XG4gICAgICAgIHZhciB1dGMgPSBuZXcgZDNfZGF0ZV91dGMoKTtcbiAgICAgICAgdXRjLl8gPSB0MDtcbiAgICAgICAgcmV0dXJuIHJhbmdlKHV0YywgdDEsIGR0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGQzX2RhdGUgPSBEYXRlO1xuICAgICAgfVxuICAgIH1cbiAgICBsb2NhbC5mbG9vciA9IGxvY2FsO1xuICAgIGxvY2FsLnJvdW5kID0gcm91bmQ7XG4gICAgbG9jYWwuY2VpbCA9IGNlaWw7XG4gICAgbG9jYWwub2Zmc2V0ID0gb2Zmc2V0O1xuICAgIGxvY2FsLnJhbmdlID0gcmFuZ2U7XG4gICAgdmFyIHV0YyA9IGxvY2FsLnV0YyA9IGQzX3RpbWVfaW50ZXJ2YWxfdXRjKGxvY2FsKTtcbiAgICB1dGMuZmxvb3IgPSB1dGM7XG4gICAgdXRjLnJvdW5kID0gZDNfdGltZV9pbnRlcnZhbF91dGMocm91bmQpO1xuICAgIHV0Yy5jZWlsID0gZDNfdGltZV9pbnRlcnZhbF91dGMoY2VpbCk7XG4gICAgdXRjLm9mZnNldCA9IGQzX3RpbWVfaW50ZXJ2YWxfdXRjKG9mZnNldCk7XG4gICAgdXRjLnJhbmdlID0gcmFuZ2VfdXRjO1xuICAgIHJldHVybiBsb2NhbDtcbiAgfVxuICBmdW5jdGlvbiBkM190aW1lX2ludGVydmFsX3V0YyhtZXRob2QpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oZGF0ZSwgaykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZDNfZGF0ZSA9IGQzX2RhdGVfdXRjO1xuICAgICAgICB2YXIgdXRjID0gbmV3IGQzX2RhdGVfdXRjKCk7XG4gICAgICAgIHV0Yy5fID0gZGF0ZTtcbiAgICAgICAgcmV0dXJuIG1ldGhvZCh1dGMsIGspLl87XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBkM19kYXRlID0gRGF0ZTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGQzX3RpbWUueWVhciA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICAgIGRhdGUgPSBkM190aW1lLmRheShkYXRlKTtcbiAgICBkYXRlLnNldE1vbnRoKDAsIDEpO1xuICAgIHJldHVybiBkYXRlO1xuICB9LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHtcbiAgICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIG9mZnNldCk7XG4gIH0sIGZ1bmN0aW9uKGRhdGUpIHtcbiAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICB9KTtcbiAgZDNfdGltZS55ZWFycyA9IGQzX3RpbWUueWVhci5yYW5nZTtcbiAgZDNfdGltZS55ZWFycy51dGMgPSBkM190aW1lLnllYXIudXRjLnJhbmdlO1xuICBkM190aW1lLmRheSA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICAgIHZhciBkYXkgPSBuZXcgZDNfZGF0ZSgyZTMsIDApO1xuICAgIGRheS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpO1xuICAgIHJldHVybiBkYXk7XG4gIH0sIGZ1bmN0aW9uKGRhdGUsIG9mZnNldCkge1xuICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIG9mZnNldCk7XG4gIH0sIGZ1bmN0aW9uKGRhdGUpIHtcbiAgICByZXR1cm4gZGF0ZS5nZXREYXRlKCkgLSAxO1xuICB9KTtcbiAgZDNfdGltZS5kYXlzID0gZDNfdGltZS5kYXkucmFuZ2U7XG4gIGQzX3RpbWUuZGF5cy51dGMgPSBkM190aW1lLmRheS51dGMucmFuZ2U7XG4gIGQzX3RpbWUuZGF5T2ZZZWFyID0gZnVuY3Rpb24oZGF0ZSkge1xuICAgIHZhciB5ZWFyID0gZDNfdGltZS55ZWFyKGRhdGUpO1xuICAgIHJldHVybiBNYXRoLmZsb29yKChkYXRlIC0geWVhciAtIChkYXRlLmdldFRpbWV6b25lT2Zmc2V0KCkgLSB5ZWFyLmdldFRpbWV6b25lT2Zmc2V0KCkpICogNmU0KSAvIDg2NGU1KTtcbiAgfTtcbiAgWyBcInN1bmRheVwiLCBcIm1vbmRheVwiLCBcInR1ZXNkYXlcIiwgXCJ3ZWRuZXNkYXlcIiwgXCJ0aHVyc2RheVwiLCBcImZyaWRheVwiLCBcInNhdHVyZGF5XCIgXS5mb3JFYWNoKGZ1bmN0aW9uKGRheSwgaSkge1xuICAgIGkgPSA3IC0gaTtcbiAgICB2YXIgaW50ZXJ2YWwgPSBkM190aW1lW2RheV0gPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgICAgIChkYXRlID0gZDNfdGltZS5kYXkoZGF0ZSkpLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgLSAoZGF0ZS5nZXREYXkoKSArIGkpICUgNyk7XG4gICAgICByZXR1cm4gZGF0ZTtcbiAgICB9LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHtcbiAgICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIE1hdGguZmxvb3Iob2Zmc2V0KSAqIDcpO1xuICAgIH0sIGZ1bmN0aW9uKGRhdGUpIHtcbiAgICAgIHZhciBkYXkgPSBkM190aW1lLnllYXIoZGF0ZSkuZ2V0RGF5KCk7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcigoZDNfdGltZS5kYXlPZlllYXIoZGF0ZSkgKyAoZGF5ICsgaSkgJSA3KSAvIDcpIC0gKGRheSAhPT0gaSk7XG4gICAgfSk7XG4gICAgZDNfdGltZVtkYXkgKyBcInNcIl0gPSBpbnRlcnZhbC5yYW5nZTtcbiAgICBkM190aW1lW2RheSArIFwic1wiXS51dGMgPSBpbnRlcnZhbC51dGMucmFuZ2U7XG4gICAgZDNfdGltZVtkYXkgKyBcIk9mWWVhclwiXSA9IGZ1bmN0aW9uKGRhdGUpIHtcbiAgICAgIHZhciBkYXkgPSBkM190aW1lLnllYXIoZGF0ZSkuZ2V0RGF5KCk7XG4gICAgICByZXR1cm4gTWF0aC5mbG9vcigoZDNfdGltZS5kYXlPZlllYXIoZGF0ZSkgKyAoZGF5ICsgaSkgJSA3KSAvIDcpO1xuICAgIH07XG4gIH0pO1xuICBkM190aW1lLndlZWsgPSBkM190aW1lLnN1bmRheTtcbiAgZDNfdGltZS53ZWVrcyA9IGQzX3RpbWUuc3VuZGF5LnJhbmdlO1xuICBkM190aW1lLndlZWtzLnV0YyA9IGQzX3RpbWUuc3VuZGF5LnV0Yy5yYW5nZTtcbiAgZDNfdGltZS53ZWVrT2ZZZWFyID0gZDNfdGltZS5zdW5kYXlPZlllYXI7XG4gIGZ1bmN0aW9uIGQzX2xvY2FsZV90aW1lRm9ybWF0KGxvY2FsZSkge1xuICAgIHZhciBsb2NhbGVfZGF0ZVRpbWUgPSBsb2NhbGUuZGF0ZVRpbWUsIGxvY2FsZV9kYXRlID0gbG9jYWxlLmRhdGUsIGxvY2FsZV90aW1lID0gbG9jYWxlLnRpbWUsIGxvY2FsZV9wZXJpb2RzID0gbG9jYWxlLnBlcmlvZHMsIGxvY2FsZV9kYXlzID0gbG9jYWxlLmRheXMsIGxvY2FsZV9zaG9ydERheXMgPSBsb2NhbGUuc2hvcnREYXlzLCBsb2NhbGVfbW9udGhzID0gbG9jYWxlLm1vbnRocywgbG9jYWxlX3Nob3J0TW9udGhzID0gbG9jYWxlLnNob3J0TW9udGhzO1xuICAgIGZ1bmN0aW9uIGQzX3RpbWVfZm9ybWF0KHRlbXBsYXRlKSB7XG4gICAgICB2YXIgbiA9IHRlbXBsYXRlLmxlbmd0aDtcbiAgICAgIGZ1bmN0aW9uIGZvcm1hdChkYXRlKSB7XG4gICAgICAgIHZhciBzdHJpbmcgPSBbXSwgaSA9IC0xLCBqID0gMCwgYywgcCwgZjtcbiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgICBpZiAodGVtcGxhdGUuY2hhckNvZGVBdChpKSA9PT0gMzcpIHtcbiAgICAgICAgICAgIHN0cmluZy5wdXNoKHRlbXBsYXRlLnNsaWNlKGosIGkpKTtcbiAgICAgICAgICAgIGlmICgocCA9IGQzX3RpbWVfZm9ybWF0UGFkc1tjID0gdGVtcGxhdGUuY2hhckF0KCsraSldKSAhPSBudWxsKSBjID0gdGVtcGxhdGUuY2hhckF0KCsraSk7XG4gICAgICAgICAgICBpZiAoZiA9IGQzX3RpbWVfZm9ybWF0c1tjXSkgYyA9IGYoZGF0ZSwgcCA9PSBudWxsID8gYyA9PT0gXCJlXCIgPyBcIiBcIiA6IFwiMFwiIDogcCk7XG4gICAgICAgICAgICBzdHJpbmcucHVzaChjKTtcbiAgICAgICAgICAgIGogPSBpICsgMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RyaW5nLnB1c2godGVtcGxhdGUuc2xpY2UoaiwgaSkpO1xuICAgICAgICByZXR1cm4gc3RyaW5nLmpvaW4oXCJcIik7XG4gICAgICB9XG4gICAgICBmb3JtYXQucGFyc2UgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAgICAgdmFyIGQgPSB7XG4gICAgICAgICAgeTogMTkwMCxcbiAgICAgICAgICBtOiAwLFxuICAgICAgICAgIGQ6IDEsXG4gICAgICAgICAgSDogMCxcbiAgICAgICAgICBNOiAwLFxuICAgICAgICAgIFM6IDAsXG4gICAgICAgICAgTDogMCxcbiAgICAgICAgICBaOiBudWxsXG4gICAgICAgIH0sIGkgPSBkM190aW1lX3BhcnNlKGQsIHRlbXBsYXRlLCBzdHJpbmcsIDApO1xuICAgICAgICBpZiAoaSAhPSBzdHJpbmcubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKFwicFwiIGluIGQpIGQuSCA9IGQuSCAlIDEyICsgZC5wICogMTI7XG4gICAgICAgIHZhciBsb2NhbFogPSBkLlogIT0gbnVsbCAmJiBkM19kYXRlICE9PSBkM19kYXRlX3V0YywgZGF0ZSA9IG5ldyAobG9jYWxaID8gZDNfZGF0ZV91dGMgOiBkM19kYXRlKSgpO1xuICAgICAgICBpZiAoXCJqXCIgaW4gZCkgZGF0ZS5zZXRGdWxsWWVhcihkLnksIDAsIGQuaik7IGVsc2UgaWYgKFwiV1wiIGluIGQgfHwgXCJVXCIgaW4gZCkge1xuICAgICAgICAgIGlmICghKFwid1wiIGluIGQpKSBkLncgPSBcIldcIiBpbiBkID8gMSA6IDA7XG4gICAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcihkLnksIDAsIDEpO1xuICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIoZC55LCAwLCBcIldcIiBpbiBkID8gKGQudyArIDYpICUgNyArIGQuVyAqIDcgLSAoZGF0ZS5nZXREYXkoKSArIDUpICUgNyA6IGQudyArIGQuVSAqIDcgLSAoZGF0ZS5nZXREYXkoKSArIDYpICUgNyk7XG4gICAgICAgIH0gZWxzZSBkYXRlLnNldEZ1bGxZZWFyKGQueSwgZC5tLCBkLmQpO1xuICAgICAgICBkYXRlLnNldEhvdXJzKGQuSCArIChkLlogLyAxMDAgfCAwKSwgZC5NICsgZC5aICUgMTAwLCBkLlMsIGQuTCk7XG4gICAgICAgIHJldHVybiBsb2NhbFogPyBkYXRlLl8gOiBkYXRlO1xuICAgICAgfTtcbiAgICAgIGZvcm1hdC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICB9XG4gICAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZShkYXRlLCB0ZW1wbGF0ZSwgc3RyaW5nLCBqKSB7XG4gICAgICB2YXIgYywgcCwgdCwgaSA9IDAsIG4gPSB0ZW1wbGF0ZS5sZW5ndGgsIG0gPSBzdHJpbmcubGVuZ3RoO1xuICAgICAgd2hpbGUgKGkgPCBuKSB7XG4gICAgICAgIGlmIChqID49IG0pIHJldHVybiAtMTtcbiAgICAgICAgYyA9IHRlbXBsYXRlLmNoYXJDb2RlQXQoaSsrKTtcbiAgICAgICAgaWYgKGMgPT09IDM3KSB7XG4gICAgICAgICAgdCA9IHRlbXBsYXRlLmNoYXJBdChpKyspO1xuICAgICAgICAgIHAgPSBkM190aW1lX3BhcnNlcnNbdCBpbiBkM190aW1lX2Zvcm1hdFBhZHMgPyB0ZW1wbGF0ZS5jaGFyQXQoaSsrKSA6IHRdO1xuICAgICAgICAgIGlmICghcCB8fCAoaiA9IHAoZGF0ZSwgc3RyaW5nLCBqKSkgPCAwKSByZXR1cm4gLTE7XG4gICAgICAgIH0gZWxzZSBpZiAoYyAhPSBzdHJpbmcuY2hhckNvZGVBdChqKyspKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gajtcbiAgICB9XG4gICAgZDNfdGltZV9mb3JtYXQudXRjID0gZnVuY3Rpb24odGVtcGxhdGUpIHtcbiAgICAgIHZhciBsb2NhbCA9IGQzX3RpbWVfZm9ybWF0KHRlbXBsYXRlKTtcbiAgICAgIGZ1bmN0aW9uIGZvcm1hdChkYXRlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZDNfZGF0ZSA9IGQzX2RhdGVfdXRjO1xuICAgICAgICAgIHZhciB1dGMgPSBuZXcgZDNfZGF0ZSgpO1xuICAgICAgICAgIHV0Yy5fID0gZGF0ZTtcbiAgICAgICAgICByZXR1cm4gbG9jYWwodXRjKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBkM19kYXRlID0gRGF0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9ybWF0LnBhcnNlID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZDNfZGF0ZSA9IGQzX2RhdGVfdXRjO1xuICAgICAgICAgIHZhciBkYXRlID0gbG9jYWwucGFyc2Uoc3RyaW5nKTtcbiAgICAgICAgICByZXR1cm4gZGF0ZSAmJiBkYXRlLl87XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgZDNfZGF0ZSA9IERhdGU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBmb3JtYXQudG9TdHJpbmcgPSBsb2NhbC50b1N0cmluZztcbiAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgfTtcbiAgICBkM190aW1lX2Zvcm1hdC5tdWx0aSA9IGQzX3RpbWVfZm9ybWF0LnV0Yy5tdWx0aSA9IGQzX3RpbWVfZm9ybWF0TXVsdGk7XG4gICAgdmFyIGQzX3RpbWVfcGVyaW9kTG9va3VwID0gZDMubWFwKCksIGQzX3RpbWVfZGF5UmUgPSBkM190aW1lX2Zvcm1hdFJlKGxvY2FsZV9kYXlzKSwgZDNfdGltZV9kYXlMb29rdXAgPSBkM190aW1lX2Zvcm1hdExvb2t1cChsb2NhbGVfZGF5cyksIGQzX3RpbWVfZGF5QWJicmV2UmUgPSBkM190aW1lX2Zvcm1hdFJlKGxvY2FsZV9zaG9ydERheXMpLCBkM190aW1lX2RheUFiYnJldkxvb2t1cCA9IGQzX3RpbWVfZm9ybWF0TG9va3VwKGxvY2FsZV9zaG9ydERheXMpLCBkM190aW1lX21vbnRoUmUgPSBkM190aW1lX2Zvcm1hdFJlKGxvY2FsZV9tb250aHMpLCBkM190aW1lX21vbnRoTG9va3VwID0gZDNfdGltZV9mb3JtYXRMb29rdXAobG9jYWxlX21vbnRocyksIGQzX3RpbWVfbW9udGhBYmJyZXZSZSA9IGQzX3RpbWVfZm9ybWF0UmUobG9jYWxlX3Nob3J0TW9udGhzKSwgZDNfdGltZV9tb250aEFiYnJldkxvb2t1cCA9IGQzX3RpbWVfZm9ybWF0TG9va3VwKGxvY2FsZV9zaG9ydE1vbnRocyk7XG4gICAgbG9jYWxlX3BlcmlvZHMuZm9yRWFjaChmdW5jdGlvbihwLCBpKSB7XG4gICAgICBkM190aW1lX3BlcmlvZExvb2t1cC5zZXQocC50b0xvd2VyQ2FzZSgpLCBpKTtcbiAgICB9KTtcbiAgICB2YXIgZDNfdGltZV9mb3JtYXRzID0ge1xuICAgICAgYTogZnVuY3Rpb24oZCkge1xuICAgICAgICByZXR1cm4gbG9jYWxlX3Nob3J0RGF5c1tkLmdldERheSgpXTtcbiAgICAgIH0sXG4gICAgICBBOiBmdW5jdGlvbihkKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGVfZGF5c1tkLmdldERheSgpXTtcbiAgICAgIH0sXG4gICAgICBiOiBmdW5jdGlvbihkKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGVfc2hvcnRNb250aHNbZC5nZXRNb250aCgpXTtcbiAgICAgIH0sXG4gICAgICBCOiBmdW5jdGlvbihkKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGVfbW9udGhzW2QuZ2V0TW9udGgoKV07XG4gICAgICB9LFxuICAgICAgYzogZDNfdGltZV9mb3JtYXQobG9jYWxlX2RhdGVUaW1lKSxcbiAgICAgIGQ6IGZ1bmN0aW9uKGQsIHApIHtcbiAgICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQuZ2V0RGF0ZSgpLCBwLCAyKTtcbiAgICAgIH0sXG4gICAgICBlOiBmdW5jdGlvbihkLCBwKSB7XG4gICAgICAgIHJldHVybiBkM190aW1lX2Zvcm1hdFBhZChkLmdldERhdGUoKSwgcCwgMik7XG4gICAgICB9LFxuICAgICAgSDogZnVuY3Rpb24oZCwgcCkge1xuICAgICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZC5nZXRIb3VycygpLCBwLCAyKTtcbiAgICAgIH0sXG4gICAgICBJOiBmdW5jdGlvbihkLCBwKSB7XG4gICAgICAgIHJldHVybiBkM190aW1lX2Zvcm1hdFBhZChkLmdldEhvdXJzKCkgJSAxMiB8fCAxMiwgcCwgMik7XG4gICAgICB9LFxuICAgICAgajogZnVuY3Rpb24oZCwgcCkge1xuICAgICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoMSArIGQzX3RpbWUuZGF5T2ZZZWFyKGQpLCBwLCAzKTtcbiAgICAgIH0sXG4gICAgICBMOiBmdW5jdGlvbihkLCBwKSB7XG4gICAgICAgIHJldHVybiBkM190aW1lX2Zvcm1hdFBhZChkLmdldE1pbGxpc2Vjb25kcygpLCBwLCAzKTtcbiAgICAgIH0sXG4gICAgICBtOiBmdW5jdGlvbihkLCBwKSB7XG4gICAgICAgIHJldHVybiBkM190aW1lX2Zvcm1hdFBhZChkLmdldE1vbnRoKCkgKyAxLCBwLCAyKTtcbiAgICAgIH0sXG4gICAgICBNOiBmdW5jdGlvbihkLCBwKSB7XG4gICAgICAgIHJldHVybiBkM190aW1lX2Zvcm1hdFBhZChkLmdldE1pbnV0ZXMoKSwgcCwgMik7XG4gICAgICB9LFxuICAgICAgcDogZnVuY3Rpb24oZCkge1xuICAgICAgICByZXR1cm4gbG9jYWxlX3BlcmlvZHNbKyhkLmdldEhvdXJzKCkgPj0gMTIpXTtcbiAgICAgIH0sXG4gICAgICBTOiBmdW5jdGlvbihkLCBwKSB7XG4gICAgICAgIHJldHVybiBkM190aW1lX2Zvcm1hdFBhZChkLmdldFNlY29uZHMoKSwgcCwgMik7XG4gICAgICB9LFxuICAgICAgVTogZnVuY3Rpb24oZCwgcCkge1xuICAgICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZDNfdGltZS5zdW5kYXlPZlllYXIoZCksIHAsIDIpO1xuICAgICAgfSxcbiAgICAgIHc6IGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgcmV0dXJuIGQuZ2V0RGF5KCk7XG4gICAgICB9LFxuICAgICAgVzogZnVuY3Rpb24oZCwgcCkge1xuICAgICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZDNfdGltZS5tb25kYXlPZlllYXIoZCksIHAsIDIpO1xuICAgICAgfSxcbiAgICAgIHg6IGQzX3RpbWVfZm9ybWF0KGxvY2FsZV9kYXRlKSxcbiAgICAgIFg6IGQzX3RpbWVfZm9ybWF0KGxvY2FsZV90aW1lKSxcbiAgICAgIHk6IGZ1bmN0aW9uKGQsIHApIHtcbiAgICAgICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0UGFkKGQuZ2V0RnVsbFllYXIoKSAlIDEwMCwgcCwgMik7XG4gICAgICB9LFxuICAgICAgWTogZnVuY3Rpb24oZCwgcCkge1xuICAgICAgICByZXR1cm4gZDNfdGltZV9mb3JtYXRQYWQoZC5nZXRGdWxsWWVhcigpICUgMWU0LCBwLCA0KTtcbiAgICAgIH0sXG4gICAgICBaOiBkM190aW1lX3pvbmUsXG4gICAgICBcIiVcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBcIiVcIjtcbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBkM190aW1lX3BhcnNlcnMgPSB7XG4gICAgICBhOiBkM190aW1lX3BhcnNlV2Vla2RheUFiYnJldixcbiAgICAgIEE6IGQzX3RpbWVfcGFyc2VXZWVrZGF5LFxuICAgICAgYjogZDNfdGltZV9wYXJzZU1vbnRoQWJicmV2LFxuICAgICAgQjogZDNfdGltZV9wYXJzZU1vbnRoLFxuICAgICAgYzogZDNfdGltZV9wYXJzZUxvY2FsZUZ1bGwsXG4gICAgICBkOiBkM190aW1lX3BhcnNlRGF5LFxuICAgICAgZTogZDNfdGltZV9wYXJzZURheSxcbiAgICAgIEg6IGQzX3RpbWVfcGFyc2VIb3VyMjQsXG4gICAgICBJOiBkM190aW1lX3BhcnNlSG91cjI0LFxuICAgICAgajogZDNfdGltZV9wYXJzZURheU9mWWVhcixcbiAgICAgIEw6IGQzX3RpbWVfcGFyc2VNaWxsaXNlY29uZHMsXG4gICAgICBtOiBkM190aW1lX3BhcnNlTW9udGhOdW1iZXIsXG4gICAgICBNOiBkM190aW1lX3BhcnNlTWludXRlcyxcbiAgICAgIHA6IGQzX3RpbWVfcGFyc2VBbVBtLFxuICAgICAgUzogZDNfdGltZV9wYXJzZVNlY29uZHMsXG4gICAgICBVOiBkM190aW1lX3BhcnNlV2Vla051bWJlclN1bmRheSxcbiAgICAgIHc6IGQzX3RpbWVfcGFyc2VXZWVrZGF5TnVtYmVyLFxuICAgICAgVzogZDNfdGltZV9wYXJzZVdlZWtOdW1iZXJNb25kYXksXG4gICAgICB4OiBkM190aW1lX3BhcnNlTG9jYWxlRGF0ZSxcbiAgICAgIFg6IGQzX3RpbWVfcGFyc2VMb2NhbGVUaW1lLFxuICAgICAgeTogZDNfdGltZV9wYXJzZVllYXIsXG4gICAgICBZOiBkM190aW1lX3BhcnNlRnVsbFllYXIsXG4gICAgICBaOiBkM190aW1lX3BhcnNlWm9uZSxcbiAgICAgIFwiJVwiOiBkM190aW1lX3BhcnNlTGl0ZXJhbFBlcmNlbnRcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VXZWVrZGF5QWJicmV2KGRhdGUsIHN0cmluZywgaSkge1xuICAgICAgZDNfdGltZV9kYXlBYmJyZXZSZS5sYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIG4gPSBkM190aW1lX2RheUFiYnJldlJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTtcbiAgICAgIHJldHVybiBuID8gKGRhdGUudyA9IGQzX3RpbWVfZGF5QWJicmV2TG9va3VwLmdldChuWzBdLnRvTG93ZXJDYXNlKCkpLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VXZWVrZGF5KGRhdGUsIHN0cmluZywgaSkge1xuICAgICAgZDNfdGltZV9kYXlSZS5sYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIG4gPSBkM190aW1lX2RheVJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTtcbiAgICAgIHJldHVybiBuID8gKGRhdGUudyA9IGQzX3RpbWVfZGF5TG9va3VwLmdldChuWzBdLnRvTG93ZXJDYXNlKCkpLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VNb250aEFiYnJldihkYXRlLCBzdHJpbmcsIGkpIHtcbiAgICAgIGQzX3RpbWVfbW9udGhBYmJyZXZSZS5sYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIG4gPSBkM190aW1lX21vbnRoQWJicmV2UmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpO1xuICAgICAgcmV0dXJuIG4gPyAoZGF0ZS5tID0gZDNfdGltZV9tb250aEFiYnJldkxvb2t1cC5nZXQoblswXS50b0xvd2VyQ2FzZSgpKSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkM190aW1lX3BhcnNlTW9udGgoZGF0ZSwgc3RyaW5nLCBpKSB7XG4gICAgICBkM190aW1lX21vbnRoUmUubGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciBuID0gZDNfdGltZV9tb250aFJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTtcbiAgICAgIHJldHVybiBuID8gKGRhdGUubSA9IGQzX3RpbWVfbW9udGhMb29rdXAuZ2V0KG5bMF0udG9Mb3dlckNhc2UoKSksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZUxvY2FsZUZ1bGwoZGF0ZSwgc3RyaW5nLCBpKSB7XG4gICAgICByZXR1cm4gZDNfdGltZV9wYXJzZShkYXRlLCBkM190aW1lX2Zvcm1hdHMuYy50b1N0cmluZygpLCBzdHJpbmcsIGkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkM190aW1lX3BhcnNlTG9jYWxlRGF0ZShkYXRlLCBzdHJpbmcsIGkpIHtcbiAgICAgIHJldHVybiBkM190aW1lX3BhcnNlKGRhdGUsIGQzX3RpbWVfZm9ybWF0cy54LnRvU3RyaW5nKCksIHN0cmluZywgaSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VMb2NhbGVUaW1lKGRhdGUsIHN0cmluZywgaSkge1xuICAgICAgcmV0dXJuIGQzX3RpbWVfcGFyc2UoZGF0ZSwgZDNfdGltZV9mb3JtYXRzLlgudG9TdHJpbmcoKSwgc3RyaW5nLCBpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZUFtUG0oZGF0ZSwgc3RyaW5nLCBpKSB7XG4gICAgICB2YXIgbiA9IGQzX3RpbWVfcGVyaW9kTG9va3VwLmdldChzdHJpbmcuc2xpY2UoaSwgaSArPSAyKS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIHJldHVybiBuID09IG51bGwgPyAtMSA6IChkYXRlLnAgPSBuLCBpKTtcbiAgICB9XG4gICAgcmV0dXJuIGQzX3RpbWVfZm9ybWF0O1xuICB9XG4gIHZhciBkM190aW1lX2Zvcm1hdFBhZHMgPSB7XG4gICAgXCItXCI6IFwiXCIsXG4gICAgXzogXCIgXCIsXG4gICAgXCIwXCI6IFwiMFwiXG4gIH0sIGQzX3RpbWVfbnVtYmVyUmUgPSAvXlxccypcXGQrLywgZDNfdGltZV9wZXJjZW50UmUgPSAvXiUvO1xuICBmdW5jdGlvbiBkM190aW1lX2Zvcm1hdFBhZCh2YWx1ZSwgZmlsbCwgd2lkdGgpIHtcbiAgICB2YXIgc2lnbiA9IHZhbHVlIDwgMCA/IFwiLVwiIDogXCJcIiwgc3RyaW5nID0gKHNpZ24gPyAtdmFsdWUgOiB2YWx1ZSkgKyBcIlwiLCBsZW5ndGggPSBzdHJpbmcubGVuZ3RoO1xuICAgIHJldHVybiBzaWduICsgKGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSArIHN0cmluZyA6IHN0cmluZyk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdGltZV9mb3JtYXRSZShuYW1lcykge1xuICAgIHJldHVybiBuZXcgUmVnRXhwKFwiXig/OlwiICsgbmFtZXMubWFwKGQzLnJlcXVvdGUpLmpvaW4oXCJ8XCIpICsgXCIpXCIsIFwiaVwiKTtcbiAgfVxuICBmdW5jdGlvbiBkM190aW1lX2Zvcm1hdExvb2t1cChuYW1lcykge1xuICAgIHZhciBtYXAgPSBuZXcgZDNfTWFwKCksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbikgbWFwLnNldChuYW1lc1tpXS50b0xvd2VyQ2FzZSgpLCBpKTtcbiAgICByZXR1cm4gbWFwO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VXZWVrZGF5TnVtYmVyKGRhdGUsIHN0cmluZywgaSkge1xuICAgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDtcbiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDEpKTtcbiAgICByZXR1cm4gbiA/IChkYXRlLncgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VXZWVrTnVtYmVyU3VuZGF5KGRhdGUsIHN0cmluZywgaSkge1xuICAgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDtcbiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpO1xuICAgIHJldHVybiBuID8gKGRhdGUuVSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZVdlZWtOdW1iZXJNb25kYXkoZGF0ZSwgc3RyaW5nLCBpKSB7XG4gICAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwO1xuICAgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpKSk7XG4gICAgcmV0dXJuIG4gPyAoZGF0ZS5XID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbiAgfVxuICBmdW5jdGlvbiBkM190aW1lX3BhcnNlRnVsbFllYXIoZGF0ZSwgc3RyaW5nLCBpKSB7XG4gICAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwO1xuICAgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgNCkpO1xuICAgIHJldHVybiBuID8gKGRhdGUueSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZVllYXIoZGF0ZSwgc3RyaW5nLCBpKSB7XG4gICAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwO1xuICAgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpO1xuICAgIHJldHVybiBuID8gKGRhdGUueSA9IGQzX3RpbWVfZXhwYW5kWWVhcigrblswXSksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbiAgfVxuICBmdW5jdGlvbiBkM190aW1lX3BhcnNlWm9uZShkYXRlLCBzdHJpbmcsIGkpIHtcbiAgICByZXR1cm4gL15bKy1dXFxkezR9JC8udGVzdChzdHJpbmcgPSBzdHJpbmcuc2xpY2UoaSwgaSArIDUpKSA/IChkYXRlLlogPSAtc3RyaW5nLCBcbiAgICBpICsgNSkgOiAtMTtcbiAgfVxuICBmdW5jdGlvbiBkM190aW1lX2V4cGFuZFllYXIoZCkge1xuICAgIHJldHVybiBkICsgKGQgPiA2OCA/IDE5MDAgOiAyZTMpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VNb250aE51bWJlcihkYXRlLCBzdHJpbmcsIGkpIHtcbiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7XG4gICAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7XG4gICAgcmV0dXJuIG4gPyAoZGF0ZS5tID0gblswXSAtIDEsIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbiAgfVxuICBmdW5jdGlvbiBkM190aW1lX3BhcnNlRGF5KGRhdGUsIHN0cmluZywgaSkge1xuICAgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDtcbiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTtcbiAgICByZXR1cm4gbiA/IChkYXRlLmQgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3RpbWVfcGFyc2VEYXlPZlllYXIoZGF0ZSwgc3RyaW5nLCBpKSB7XG4gICAgZDNfdGltZV9udW1iZXJSZS5sYXN0SW5kZXggPSAwO1xuICAgIHZhciBuID0gZDNfdGltZV9udW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMykpO1xuICAgIHJldHVybiBuID8gKGRhdGUuaiA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdGltZV9wYXJzZUhvdXIyNChkYXRlLCBzdHJpbmcsIGkpIHtcbiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7XG4gICAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7XG4gICAgcmV0dXJuIG4gPyAoZGF0ZS5IID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbiAgfVxuICBmdW5jdGlvbiBkM190aW1lX3BhcnNlTWludXRlcyhkYXRlLCBzdHJpbmcsIGkpIHtcbiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7XG4gICAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7XG4gICAgcmV0dXJuIG4gPyAoZGF0ZS5NID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbiAgfVxuICBmdW5jdGlvbiBkM190aW1lX3BhcnNlU2Vjb25kcyhkYXRlLCBzdHJpbmcsIGkpIHtcbiAgICBkM190aW1lX251bWJlclJlLmxhc3RJbmRleCA9IDA7XG4gICAgdmFyIG4gPSBkM190aW1lX251bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7XG4gICAgcmV0dXJuIG4gPyAoZGF0ZS5TID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTtcbiAgfVxuICBmdW5jdGlvbiBkM190aW1lX3BhcnNlTWlsbGlzZWNvbmRzKGRhdGUsIHN0cmluZywgaSkge1xuICAgIGQzX3RpbWVfbnVtYmVyUmUubGFzdEluZGV4ID0gMDtcbiAgICB2YXIgbiA9IGQzX3RpbWVfbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDMpKTtcbiAgICByZXR1cm4gbiA/IChkYXRlLkwgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3RpbWVfem9uZShkKSB7XG4gICAgdmFyIHogPSBkLmdldFRpbWV6b25lT2Zmc2V0KCksIHpzID0geiA+IDAgPyBcIi1cIiA6IFwiK1wiLCB6aCA9IGFicyh6KSAvIDYwIHwgMCwgem0gPSBhYnMoeikgJSA2MDtcbiAgICByZXR1cm4genMgKyBkM190aW1lX2Zvcm1hdFBhZCh6aCwgXCIwXCIsIDIpICsgZDNfdGltZV9mb3JtYXRQYWQoem0sIFwiMFwiLCAyKTtcbiAgfVxuICBmdW5jdGlvbiBkM190aW1lX3BhcnNlTGl0ZXJhbFBlcmNlbnQoZGF0ZSwgc3RyaW5nLCBpKSB7XG4gICAgZDNfdGltZV9wZXJjZW50UmUubGFzdEluZGV4ID0gMDtcbiAgICB2YXIgbiA9IGQzX3RpbWVfcGVyY2VudFJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAxKSk7XG4gICAgcmV0dXJuIG4gPyBpICsgblswXS5sZW5ndGggOiAtMTtcbiAgfVxuICBmdW5jdGlvbiBkM190aW1lX2Zvcm1hdE11bHRpKGZvcm1hdHMpIHtcbiAgICB2YXIgbiA9IGZvcm1hdHMubGVuZ3RoLCBpID0gLTE7XG4gICAgd2hpbGUgKCsraSA8IG4pIGZvcm1hdHNbaV1bMF0gPSB0aGlzKGZvcm1hdHNbaV1bMF0pO1xuICAgIHJldHVybiBmdW5jdGlvbihkYXRlKSB7XG4gICAgICB2YXIgaSA9IDAsIGYgPSBmb3JtYXRzW2ldO1xuICAgICAgd2hpbGUgKCFmWzFdKGRhdGUpKSBmID0gZm9ybWF0c1srK2ldO1xuICAgICAgcmV0dXJuIGZbMF0oZGF0ZSk7XG4gICAgfTtcbiAgfVxuICBkMy5sb2NhbGUgPSBmdW5jdGlvbihsb2NhbGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbnVtYmVyRm9ybWF0OiBkM19sb2NhbGVfbnVtYmVyRm9ybWF0KGxvY2FsZSksXG4gICAgICB0aW1lRm9ybWF0OiBkM19sb2NhbGVfdGltZUZvcm1hdChsb2NhbGUpXG4gICAgfTtcbiAgfTtcbiAgdmFyIGQzX2xvY2FsZV9lblVTID0gZDMubG9jYWxlKHtcbiAgICBkZWNpbWFsOiBcIi5cIixcbiAgICB0aG91c2FuZHM6IFwiLFwiLFxuICAgIGdyb3VwaW5nOiBbIDMgXSxcbiAgICBjdXJyZW5jeTogWyBcIiRcIiwgXCJcIiBdLFxuICAgIGRhdGVUaW1lOiBcIiVhICViICVlICVYICVZXCIsXG4gICAgZGF0ZTogXCIlbS8lZC8lWVwiLFxuICAgIHRpbWU6IFwiJUg6JU06JVNcIixcbiAgICBwZXJpb2RzOiBbIFwiQU1cIiwgXCJQTVwiIF0sXG4gICAgZGF5czogWyBcIlN1bmRheVwiLCBcIk1vbmRheVwiLCBcIlR1ZXNkYXlcIiwgXCJXZWRuZXNkYXlcIiwgXCJUaHVyc2RheVwiLCBcIkZyaWRheVwiLCBcIlNhdHVyZGF5XCIgXSxcbiAgICBzaG9ydERheXM6IFsgXCJTdW5cIiwgXCJNb25cIiwgXCJUdWVcIiwgXCJXZWRcIiwgXCJUaHVcIiwgXCJGcmlcIiwgXCJTYXRcIiBdLFxuICAgIG1vbnRoczogWyBcIkphbnVhcnlcIiwgXCJGZWJydWFyeVwiLCBcIk1hcmNoXCIsIFwiQXByaWxcIiwgXCJNYXlcIiwgXCJKdW5lXCIsIFwiSnVseVwiLCBcIkF1Z3VzdFwiLCBcIlNlcHRlbWJlclwiLCBcIk9jdG9iZXJcIiwgXCJOb3ZlbWJlclwiLCBcIkRlY2VtYmVyXCIgXSxcbiAgICBzaG9ydE1vbnRoczogWyBcIkphblwiLCBcIkZlYlwiLCBcIk1hclwiLCBcIkFwclwiLCBcIk1heVwiLCBcIkp1blwiLCBcIkp1bFwiLCBcIkF1Z1wiLCBcIlNlcFwiLCBcIk9jdFwiLCBcIk5vdlwiLCBcIkRlY1wiIF1cbiAgfSk7XG4gIGQzLmZvcm1hdCA9IGQzX2xvY2FsZV9lblVTLm51bWJlckZvcm1hdDtcbiAgZDMuZ2VvID0ge307XG4gIGZ1bmN0aW9uIGQzX2FkZGVyKCkge31cbiAgZDNfYWRkZXIucHJvdG90eXBlID0ge1xuICAgIHM6IDAsXG4gICAgdDogMCxcbiAgICBhZGQ6IGZ1bmN0aW9uKHkpIHtcbiAgICAgIGQzX2FkZGVyU3VtKHksIHRoaXMudCwgZDNfYWRkZXJUZW1wKTtcbiAgICAgIGQzX2FkZGVyU3VtKGQzX2FkZGVyVGVtcC5zLCB0aGlzLnMsIHRoaXMpO1xuICAgICAgaWYgKHRoaXMucykgdGhpcy50ICs9IGQzX2FkZGVyVGVtcC50OyBlbHNlIHRoaXMucyA9IGQzX2FkZGVyVGVtcC50O1xuICAgIH0sXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5zID0gdGhpcy50ID0gMDtcbiAgICB9LFxuICAgIHZhbHVlT2Y6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMucztcbiAgICB9XG4gIH07XG4gIHZhciBkM19hZGRlclRlbXAgPSBuZXcgZDNfYWRkZXIoKTtcbiAgZnVuY3Rpb24gZDNfYWRkZXJTdW0oYSwgYiwgbykge1xuICAgIHZhciB4ID0gby5zID0gYSArIGIsIGJ2ID0geCAtIGEsIGF2ID0geCAtIGJ2O1xuICAgIG8udCA9IGEgLSBhdiArIChiIC0gYnYpO1xuICB9XG4gIGQzLmdlby5zdHJlYW0gPSBmdW5jdGlvbihvYmplY3QsIGxpc3RlbmVyKSB7XG4gICAgaWYgKG9iamVjdCAmJiBkM19nZW9fc3RyZWFtT2JqZWN0VHlwZS5oYXNPd25Qcm9wZXJ0eShvYmplY3QudHlwZSkpIHtcbiAgICAgIGQzX2dlb19zdHJlYW1PYmplY3RUeXBlW29iamVjdC50eXBlXShvYmplY3QsIGxpc3RlbmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZDNfZ2VvX3N0cmVhbUdlb21ldHJ5KG9iamVjdCwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gZDNfZ2VvX3N0cmVhbUdlb21ldHJ5KGdlb21ldHJ5LCBsaXN0ZW5lcikge1xuICAgIGlmIChnZW9tZXRyeSAmJiBkM19nZW9fc3RyZWFtR2VvbWV0cnlUeXBlLmhhc093blByb3BlcnR5KGdlb21ldHJ5LnR5cGUpKSB7XG4gICAgICBkM19nZW9fc3RyZWFtR2VvbWV0cnlUeXBlW2dlb21ldHJ5LnR5cGVdKGdlb21ldHJ5LCBsaXN0ZW5lcik7XG4gICAgfVxuICB9XG4gIHZhciBkM19nZW9fc3RyZWFtT2JqZWN0VHlwZSA9IHtcbiAgICBGZWF0dXJlOiBmdW5jdGlvbihmZWF0dXJlLCBsaXN0ZW5lcikge1xuICAgICAgZDNfZ2VvX3N0cmVhbUdlb21ldHJ5KGZlYXR1cmUuZ2VvbWV0cnksIGxpc3RlbmVyKTtcbiAgICB9LFxuICAgIEZlYXR1cmVDb2xsZWN0aW9uOiBmdW5jdGlvbihvYmplY3QsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgZmVhdHVyZXMgPSBvYmplY3QuZmVhdHVyZXMsIGkgPSAtMSwgbiA9IGZlYXR1cmVzLmxlbmd0aDtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBkM19nZW9fc3RyZWFtR2VvbWV0cnkoZmVhdHVyZXNbaV0uZ2VvbWV0cnksIGxpc3RlbmVyKTtcbiAgICB9XG4gIH07XG4gIHZhciBkM19nZW9fc3RyZWFtR2VvbWV0cnlUeXBlID0ge1xuICAgIFNwaGVyZTogZnVuY3Rpb24ob2JqZWN0LCBsaXN0ZW5lcikge1xuICAgICAgbGlzdGVuZXIuc3BoZXJlKCk7XG4gICAgfSxcbiAgICBQb2ludDogZnVuY3Rpb24ob2JqZWN0LCBsaXN0ZW5lcikge1xuICAgICAgb2JqZWN0ID0gb2JqZWN0LmNvb3JkaW5hdGVzO1xuICAgICAgbGlzdGVuZXIucG9pbnQob2JqZWN0WzBdLCBvYmplY3RbMV0sIG9iamVjdFsyXSk7XG4gICAgfSxcbiAgICBNdWx0aVBvaW50OiBmdW5jdGlvbihvYmplY3QsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgY29vcmRpbmF0ZXMgPSBvYmplY3QuY29vcmRpbmF0ZXMsIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBvYmplY3QgPSBjb29yZGluYXRlc1tpXSwgbGlzdGVuZXIucG9pbnQob2JqZWN0WzBdLCBvYmplY3RbMV0sIG9iamVjdFsyXSk7XG4gICAgfSxcbiAgICBMaW5lU3RyaW5nOiBmdW5jdGlvbihvYmplY3QsIGxpc3RlbmVyKSB7XG4gICAgICBkM19nZW9fc3RyZWFtTGluZShvYmplY3QuY29vcmRpbmF0ZXMsIGxpc3RlbmVyLCAwKTtcbiAgICB9LFxuICAgIE11bHRpTGluZVN0cmluZzogZnVuY3Rpb24ob2JqZWN0LCBsaXN0ZW5lcikge1xuICAgICAgdmFyIGNvb3JkaW5hdGVzID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7XG4gICAgICB3aGlsZSAoKytpIDwgbikgZDNfZ2VvX3N0cmVhbUxpbmUoY29vcmRpbmF0ZXNbaV0sIGxpc3RlbmVyLCAwKTtcbiAgICB9LFxuICAgIFBvbHlnb246IGZ1bmN0aW9uKG9iamVjdCwgbGlzdGVuZXIpIHtcbiAgICAgIGQzX2dlb19zdHJlYW1Qb2x5Z29uKG9iamVjdC5jb29yZGluYXRlcywgbGlzdGVuZXIpO1xuICAgIH0sXG4gICAgTXVsdGlQb2x5Z29uOiBmdW5jdGlvbihvYmplY3QsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgY29vcmRpbmF0ZXMgPSBvYmplY3QuY29vcmRpbmF0ZXMsIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBkM19nZW9fc3RyZWFtUG9seWdvbihjb29yZGluYXRlc1tpXSwgbGlzdGVuZXIpO1xuICAgIH0sXG4gICAgR2VvbWV0cnlDb2xsZWN0aW9uOiBmdW5jdGlvbihvYmplY3QsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgZ2VvbWV0cmllcyA9IG9iamVjdC5nZW9tZXRyaWVzLCBpID0gLTEsIG4gPSBnZW9tZXRyaWVzLmxlbmd0aDtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBkM19nZW9fc3RyZWFtR2VvbWV0cnkoZ2VvbWV0cmllc1tpXSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gZDNfZ2VvX3N0cmVhbUxpbmUoY29vcmRpbmF0ZXMsIGxpc3RlbmVyLCBjbG9zZWQpIHtcbiAgICB2YXIgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoIC0gY2xvc2VkLCBjb29yZGluYXRlO1xuICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpO1xuICAgIHdoaWxlICgrK2kgPCBuKSBjb29yZGluYXRlID0gY29vcmRpbmF0ZXNbaV0sIGxpc3RlbmVyLnBvaW50KGNvb3JkaW5hdGVbMF0sIGNvb3JkaW5hdGVbMV0sIGNvb3JkaW5hdGVbMl0pO1xuICAgIGxpc3RlbmVyLmxpbmVFbmQoKTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fc3RyZWFtUG9seWdvbihjb29yZGluYXRlcywgbGlzdGVuZXIpIHtcbiAgICB2YXIgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoO1xuICAgIGxpc3RlbmVyLnBvbHlnb25TdGFydCgpO1xuICAgIHdoaWxlICgrK2kgPCBuKSBkM19nZW9fc3RyZWFtTGluZShjb29yZGluYXRlc1tpXSwgbGlzdGVuZXIsIDEpO1xuICAgIGxpc3RlbmVyLnBvbHlnb25FbmQoKTtcbiAgfVxuICBkMy5nZW8uYXJlYSA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIGQzX2dlb19hcmVhU3VtID0gMDtcbiAgICBkMy5nZW8uc3RyZWFtKG9iamVjdCwgZDNfZ2VvX2FyZWEpO1xuICAgIHJldHVybiBkM19nZW9fYXJlYVN1bTtcbiAgfTtcbiAgdmFyIGQzX2dlb19hcmVhU3VtLCBkM19nZW9fYXJlYVJpbmdTdW0gPSBuZXcgZDNfYWRkZXIoKTtcbiAgdmFyIGQzX2dlb19hcmVhID0ge1xuICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7XG4gICAgICBkM19nZW9fYXJlYVN1bSArPSA0ICogz4A7XG4gICAgfSxcbiAgICBwb2ludDogZDNfbm9vcCxcbiAgICBsaW5lU3RhcnQ6IGQzX25vb3AsXG4gICAgbGluZUVuZDogZDNfbm9vcCxcbiAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgZDNfZ2VvX2FyZWFSaW5nU3VtLnJlc2V0KCk7XG4gICAgICBkM19nZW9fYXJlYS5saW5lU3RhcnQgPSBkM19nZW9fYXJlYVJpbmdTdGFydDtcbiAgICB9LFxuICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGFyZWEgPSAyICogZDNfZ2VvX2FyZWFSaW5nU3VtO1xuICAgICAgZDNfZ2VvX2FyZWFTdW0gKz0gYXJlYSA8IDAgPyA0ICogz4AgKyBhcmVhIDogYXJlYTtcbiAgICAgIGQzX2dlb19hcmVhLmxpbmVTdGFydCA9IGQzX2dlb19hcmVhLmxpbmVFbmQgPSBkM19nZW9fYXJlYS5wb2ludCA9IGQzX25vb3A7XG4gICAgfVxuICB9O1xuICBmdW5jdGlvbiBkM19nZW9fYXJlYVJpbmdTdGFydCgpIHtcbiAgICB2YXIgzrswMCwgz4YwMCwgzrswLCBjb3PPhjAsIHNpbs+GMDtcbiAgICBkM19nZW9fYXJlYS5wb2ludCA9IGZ1bmN0aW9uKM67LCDPhikge1xuICAgICAgZDNfZ2VvX2FyZWEucG9pbnQgPSBuZXh0UG9pbnQ7XG4gICAgICDOuzAgPSAozrswMCA9IM67KSAqIGQzX3JhZGlhbnMsIGNvc8+GMCA9IE1hdGguY29zKM+GID0gKM+GMDAgPSDPhikgKiBkM19yYWRpYW5zIC8gMiArIM+AIC8gNCksIFxuICAgICAgc2luz4YwID0gTWF0aC5zaW4oz4YpO1xuICAgIH07XG4gICAgZnVuY3Rpb24gbmV4dFBvaW50KM67LCDPhikge1xuICAgICAgzrsgKj0gZDNfcmFkaWFucztcbiAgICAgIM+GID0gz4YgKiBkM19yYWRpYW5zIC8gMiArIM+AIC8gNDtcbiAgICAgIHZhciBkzrsgPSDOuyAtIM67MCwgc2TOuyA9IGTOuyA+PSAwID8gMSA6IC0xLCBhZM67ID0gc2TOuyAqIGTOuywgY29zz4YgPSBNYXRoLmNvcyjPhiksIHNpbs+GID0gTWF0aC5zaW4oz4YpLCBrID0gc2luz4YwICogc2luz4YsIHUgPSBjb3PPhjAgKiBjb3PPhiArIGsgKiBNYXRoLmNvcyhhZM67KSwgdiA9IGsgKiBzZM67ICogTWF0aC5zaW4oYWTOuyk7XG4gICAgICBkM19nZW9fYXJlYVJpbmdTdW0uYWRkKE1hdGguYXRhbjIodiwgdSkpO1xuICAgICAgzrswID0gzrssIGNvc8+GMCA9IGNvc8+GLCBzaW7PhjAgPSBzaW7PhjtcbiAgICB9XG4gICAgZDNfZ2VvX2FyZWEubGluZUVuZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgbmV4dFBvaW50KM67MDAsIM+GMDApO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2NhcnRlc2lhbihzcGhlcmljYWwpIHtcbiAgICB2YXIgzrsgPSBzcGhlcmljYWxbMF0sIM+GID0gc3BoZXJpY2FsWzFdLCBjb3PPhiA9IE1hdGguY29zKM+GKTtcbiAgICByZXR1cm4gWyBjb3PPhiAqIE1hdGguY29zKM67KSwgY29zz4YgKiBNYXRoLnNpbijOuyksIE1hdGguc2luKM+GKSBdO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19jYXJ0ZXNpYW5Eb3QoYSwgYikge1xuICAgIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl07XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2NhcnRlc2lhbkNyb3NzKGEsIGIpIHtcbiAgICByZXR1cm4gWyBhWzFdICogYlsyXSAtIGFbMl0gKiBiWzFdLCBhWzJdICogYlswXSAtIGFbMF0gKiBiWzJdLCBhWzBdICogYlsxXSAtIGFbMV0gKiBiWzBdIF07XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2NhcnRlc2lhbkFkZChhLCBiKSB7XG4gICAgYVswXSArPSBiWzBdO1xuICAgIGFbMV0gKz0gYlsxXTtcbiAgICBhWzJdICs9IGJbMl07XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2NhcnRlc2lhblNjYWxlKHZlY3Rvciwgaykge1xuICAgIHJldHVybiBbIHZlY3RvclswXSAqIGssIHZlY3RvclsxXSAqIGssIHZlY3RvclsyXSAqIGsgXTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fY2FydGVzaWFuTm9ybWFsaXplKGQpIHtcbiAgICB2YXIgbCA9IE1hdGguc3FydChkWzBdICogZFswXSArIGRbMV0gKiBkWzFdICsgZFsyXSAqIGRbMl0pO1xuICAgIGRbMF0gLz0gbDtcbiAgICBkWzFdIC89IGw7XG4gICAgZFsyXSAvPSBsO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19zcGhlcmljYWwoY2FydGVzaWFuKSB7XG4gICAgcmV0dXJuIFsgTWF0aC5hdGFuMihjYXJ0ZXNpYW5bMV0sIGNhcnRlc2lhblswXSksIGQzX2FzaW4oY2FydGVzaWFuWzJdKSBdO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19zcGhlcmljYWxFcXVhbChhLCBiKSB7XG4gICAgcmV0dXJuIGFicyhhWzBdIC0gYlswXSkgPCDOtSAmJiBhYnMoYVsxXSAtIGJbMV0pIDwgzrU7XG4gIH1cbiAgZDMuZ2VvLmJvdW5kcyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciDOuzAsIM+GMCwgzrsxLCDPhjEsIM67XywgzrtfXywgz4ZfXywgcDAsIGTOu1N1bSwgcmFuZ2VzLCByYW5nZTtcbiAgICB2YXIgYm91bmQgPSB7XG4gICAgICBwb2ludDogcG9pbnQsXG4gICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCxcbiAgICAgIGxpbmVFbmQ6IGxpbmVFbmQsXG4gICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBib3VuZC5wb2ludCA9IHJpbmdQb2ludDtcbiAgICAgICAgYm91bmQubGluZVN0YXJ0ID0gcmluZ1N0YXJ0O1xuICAgICAgICBib3VuZC5saW5lRW5kID0gcmluZ0VuZDtcbiAgICAgICAgZM67U3VtID0gMDtcbiAgICAgICAgZDNfZ2VvX2FyZWEucG9seWdvblN0YXJ0KCk7XG4gICAgICB9LFxuICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIGQzX2dlb19hcmVhLnBvbHlnb25FbmQoKTtcbiAgICAgICAgYm91bmQucG9pbnQgPSBwb2ludDtcbiAgICAgICAgYm91bmQubGluZVN0YXJ0ID0gbGluZVN0YXJ0O1xuICAgICAgICBib3VuZC5saW5lRW5kID0gbGluZUVuZDtcbiAgICAgICAgaWYgKGQzX2dlb19hcmVhUmluZ1N1bSA8IDApIM67MCA9IC0ozrsxID0gMTgwKSwgz4YwID0gLSjPhjEgPSA5MCk7IGVsc2UgaWYgKGTOu1N1bSA+IM61KSDPhjEgPSA5MDsgZWxzZSBpZiAoZM67U3VtIDwgLc61KSDPhjAgPSAtOTA7XG4gICAgICAgIHJhbmdlWzBdID0gzrswLCByYW5nZVsxXSA9IM67MTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIHBvaW50KM67LCDPhikge1xuICAgICAgcmFuZ2VzLnB1c2gocmFuZ2UgPSBbIM67MCA9IM67LCDOuzEgPSDOuyBdKTtcbiAgICAgIGlmICjPhiA8IM+GMCkgz4YwID0gz4Y7XG4gICAgICBpZiAoz4YgPiDPhjEpIM+GMSA9IM+GO1xuICAgIH1cbiAgICBmdW5jdGlvbiBsaW5lUG9pbnQozrssIM+GKSB7XG4gICAgICB2YXIgcCA9IGQzX2dlb19jYXJ0ZXNpYW4oWyDOuyAqIGQzX3JhZGlhbnMsIM+GICogZDNfcmFkaWFucyBdKTtcbiAgICAgIGlmIChwMCkge1xuICAgICAgICB2YXIgbm9ybWFsID0gZDNfZ2VvX2NhcnRlc2lhbkNyb3NzKHAwLCBwKSwgZXF1YXRvcmlhbCA9IFsgbm9ybWFsWzFdLCAtbm9ybWFsWzBdLCAwIF0sIGluZmxlY3Rpb24gPSBkM19nZW9fY2FydGVzaWFuQ3Jvc3MoZXF1YXRvcmlhbCwgbm9ybWFsKTtcbiAgICAgICAgZDNfZ2VvX2NhcnRlc2lhbk5vcm1hbGl6ZShpbmZsZWN0aW9uKTtcbiAgICAgICAgaW5mbGVjdGlvbiA9IGQzX2dlb19zcGhlcmljYWwoaW5mbGVjdGlvbik7XG4gICAgICAgIHZhciBkzrsgPSDOuyAtIM67XywgcyA9IGTOuyA+IDAgPyAxIDogLTEsIM67aSA9IGluZmxlY3Rpb25bMF0gKiBkM19kZWdyZWVzICogcywgYW50aW1lcmlkaWFuID0gYWJzKGTOuykgPiAxODA7XG4gICAgICAgIGlmIChhbnRpbWVyaWRpYW4gXiAocyAqIM67XyA8IM67aSAmJiDOu2kgPCBzICogzrspKSB7XG4gICAgICAgICAgdmFyIM+GaSA9IGluZmxlY3Rpb25bMV0gKiBkM19kZWdyZWVzO1xuICAgICAgICAgIGlmICjPhmkgPiDPhjEpIM+GMSA9IM+GaTtcbiAgICAgICAgfSBlbHNlIGlmICjOu2kgPSAozrtpICsgMzYwKSAlIDM2MCAtIDE4MCwgYW50aW1lcmlkaWFuIF4gKHMgKiDOu18gPCDOu2kgJiYgzrtpIDwgcyAqIM67KSkge1xuICAgICAgICAgIHZhciDPhmkgPSAtaW5mbGVjdGlvblsxXSAqIGQzX2RlZ3JlZXM7XG4gICAgICAgICAgaWYgKM+GaSA8IM+GMCkgz4YwID0gz4ZpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICjPhiA8IM+GMCkgz4YwID0gz4Y7XG4gICAgICAgICAgaWYgKM+GID4gz4YxKSDPhjEgPSDPhjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW50aW1lcmlkaWFuKSB7XG4gICAgICAgICAgaWYgKM67IDwgzrtfKSB7XG4gICAgICAgICAgICBpZiAoYW5nbGUozrswLCDOuykgPiBhbmdsZSjOuzAsIM67MSkpIM67MSA9IM67O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoYW5nbGUozrssIM67MSkgPiBhbmdsZSjOuzAsIM67MSkpIM67MCA9IM67O1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAozrsxID49IM67MCkge1xuICAgICAgICAgICAgaWYgKM67IDwgzrswKSDOuzAgPSDOuztcbiAgICAgICAgICAgIGlmICjOuyA+IM67MSkgzrsxID0gzrs7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICjOuyA+IM67Xykge1xuICAgICAgICAgICAgICBpZiAoYW5nbGUozrswLCDOuykgPiBhbmdsZSjOuzAsIM67MSkpIM67MSA9IM67O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKGFuZ2xlKM67LCDOuzEpID4gYW5nbGUozrswLCDOuzEpKSDOuzAgPSDOuztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBvaW50KM67LCDPhik7XG4gICAgICB9XG4gICAgICBwMCA9IHAsIM67XyA9IM67O1xuICAgIH1cbiAgICBmdW5jdGlvbiBsaW5lU3RhcnQoKSB7XG4gICAgICBib3VuZC5wb2ludCA9IGxpbmVQb2ludDtcbiAgICB9XG4gICAgZnVuY3Rpb24gbGluZUVuZCgpIHtcbiAgICAgIHJhbmdlWzBdID0gzrswLCByYW5nZVsxXSA9IM67MTtcbiAgICAgIGJvdW5kLnBvaW50ID0gcG9pbnQ7XG4gICAgICBwMCA9IG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJpbmdQb2ludCjOuywgz4YpIHtcbiAgICAgIGlmIChwMCkge1xuICAgICAgICB2YXIgZM67ID0gzrsgLSDOu187XG4gICAgICAgIGTOu1N1bSArPSBhYnMoZM67KSA+IDE4MCA/IGTOuyArIChkzrsgPiAwID8gMzYwIDogLTM2MCkgOiBkzrs7XG4gICAgICB9IGVsc2UgzrtfXyA9IM67LCDPhl9fID0gz4Y7XG4gICAgICBkM19nZW9fYXJlYS5wb2ludCjOuywgz4YpO1xuICAgICAgbGluZVBvaW50KM67LCDPhik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJpbmdTdGFydCgpIHtcbiAgICAgIGQzX2dlb19hcmVhLmxpbmVTdGFydCgpO1xuICAgIH1cbiAgICBmdW5jdGlvbiByaW5nRW5kKCkge1xuICAgICAgcmluZ1BvaW50KM67X18sIM+GX18pO1xuICAgICAgZDNfZ2VvX2FyZWEubGluZUVuZCgpO1xuICAgICAgaWYgKGFicyhkzrtTdW0pID4gzrUpIM67MCA9IC0ozrsxID0gMTgwKTtcbiAgICAgIHJhbmdlWzBdID0gzrswLCByYW5nZVsxXSA9IM67MTtcbiAgICAgIHAwID0gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gYW5nbGUozrswLCDOuzEpIHtcbiAgICAgIHJldHVybiAozrsxIC09IM67MCkgPCAwID8gzrsxICsgMzYwIDogzrsxO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21wYXJlUmFuZ2VzKGEsIGIpIHtcbiAgICAgIHJldHVybiBhWzBdIC0gYlswXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2l0aGluUmFuZ2UoeCwgcmFuZ2UpIHtcbiAgICAgIHJldHVybiByYW5nZVswXSA8PSByYW5nZVsxXSA/IHJhbmdlWzBdIDw9IHggJiYgeCA8PSByYW5nZVsxXSA6IHggPCByYW5nZVswXSB8fCByYW5nZVsxXSA8IHg7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbihmZWF0dXJlKSB7XG4gICAgICDPhjEgPSDOuzEgPSAtKM67MCA9IM+GMCA9IEluZmluaXR5KTtcbiAgICAgIHJhbmdlcyA9IFtdO1xuICAgICAgZDMuZ2VvLnN0cmVhbShmZWF0dXJlLCBib3VuZCk7XG4gICAgICB2YXIgbiA9IHJhbmdlcy5sZW5ndGg7XG4gICAgICBpZiAobikge1xuICAgICAgICByYW5nZXMuc29ydChjb21wYXJlUmFuZ2VzKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDEsIGEgPSByYW5nZXNbMF0sIGIsIG1lcmdlZCA9IFsgYSBdOyBpIDwgbjsgKytpKSB7XG4gICAgICAgICAgYiA9IHJhbmdlc1tpXTtcbiAgICAgICAgICBpZiAod2l0aGluUmFuZ2UoYlswXSwgYSkgfHwgd2l0aGluUmFuZ2UoYlsxXSwgYSkpIHtcbiAgICAgICAgICAgIGlmIChhbmdsZShhWzBdLCBiWzFdKSA+IGFuZ2xlKGFbMF0sIGFbMV0pKSBhWzFdID0gYlsxXTtcbiAgICAgICAgICAgIGlmIChhbmdsZShiWzBdLCBhWzFdKSA+IGFuZ2xlKGFbMF0sIGFbMV0pKSBhWzBdID0gYlswXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWVyZ2VkLnB1c2goYSA9IGIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgYmVzdCA9IC1JbmZpbml0eSwgZM67O1xuICAgICAgICBmb3IgKHZhciBuID0gbWVyZ2VkLmxlbmd0aCAtIDEsIGkgPSAwLCBhID0gbWVyZ2VkW25dLCBiOyBpIDw9IG47IGEgPSBiLCArK2kpIHtcbiAgICAgICAgICBiID0gbWVyZ2VkW2ldO1xuICAgICAgICAgIGlmICgoZM67ID0gYW5nbGUoYVsxXSwgYlswXSkpID4gYmVzdCkgYmVzdCA9IGTOuywgzrswID0gYlswXSwgzrsxID0gYVsxXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmFuZ2VzID0gcmFuZ2UgPSBudWxsO1xuICAgICAgcmV0dXJuIM67MCA9PT0gSW5maW5pdHkgfHwgz4YwID09PSBJbmZpbml0eSA/IFsgWyBOYU4sIE5hTiBdLCBbIE5hTiwgTmFOIF0gXSA6IFsgWyDOuzAsIM+GMCBdLCBbIM67MSwgz4YxIF0gXTtcbiAgICB9O1xuICB9KCk7XG4gIGQzLmdlby5jZW50cm9pZCA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIGQzX2dlb19jZW50cm9pZFcwID0gZDNfZ2VvX2NlbnRyb2lkVzEgPSBkM19nZW9fY2VudHJvaWRYMCA9IGQzX2dlb19jZW50cm9pZFkwID0gZDNfZ2VvX2NlbnRyb2lkWjAgPSBkM19nZW9fY2VudHJvaWRYMSA9IGQzX2dlb19jZW50cm9pZFkxID0gZDNfZ2VvX2NlbnRyb2lkWjEgPSBkM19nZW9fY2VudHJvaWRYMiA9IGQzX2dlb19jZW50cm9pZFkyID0gZDNfZ2VvX2NlbnRyb2lkWjIgPSAwO1xuICAgIGQzLmdlby5zdHJlYW0ob2JqZWN0LCBkM19nZW9fY2VudHJvaWQpO1xuICAgIHZhciB4ID0gZDNfZ2VvX2NlbnRyb2lkWDIsIHkgPSBkM19nZW9fY2VudHJvaWRZMiwgeiA9IGQzX2dlb19jZW50cm9pZFoyLCBtID0geCAqIHggKyB5ICogeSArIHogKiB6O1xuICAgIGlmIChtIDwgzrUyKSB7XG4gICAgICB4ID0gZDNfZ2VvX2NlbnRyb2lkWDEsIHkgPSBkM19nZW9fY2VudHJvaWRZMSwgeiA9IGQzX2dlb19jZW50cm9pZFoxO1xuICAgICAgaWYgKGQzX2dlb19jZW50cm9pZFcxIDwgzrUpIHggPSBkM19nZW9fY2VudHJvaWRYMCwgeSA9IGQzX2dlb19jZW50cm9pZFkwLCB6ID0gZDNfZ2VvX2NlbnRyb2lkWjA7XG4gICAgICBtID0geCAqIHggKyB5ICogeSArIHogKiB6O1xuICAgICAgaWYgKG0gPCDOtTIpIHJldHVybiBbIE5hTiwgTmFOIF07XG4gICAgfVxuICAgIHJldHVybiBbIE1hdGguYXRhbjIoeSwgeCkgKiBkM19kZWdyZWVzLCBkM19hc2luKHogLyBNYXRoLnNxcnQobSkpICogZDNfZGVncmVlcyBdO1xuICB9O1xuICB2YXIgZDNfZ2VvX2NlbnRyb2lkVzAsIGQzX2dlb19jZW50cm9pZFcxLCBkM19nZW9fY2VudHJvaWRYMCwgZDNfZ2VvX2NlbnRyb2lkWTAsIGQzX2dlb19jZW50cm9pZFowLCBkM19nZW9fY2VudHJvaWRYMSwgZDNfZ2VvX2NlbnRyb2lkWTEsIGQzX2dlb19jZW50cm9pZFoxLCBkM19nZW9fY2VudHJvaWRYMiwgZDNfZ2VvX2NlbnRyb2lkWTIsIGQzX2dlb19jZW50cm9pZFoyO1xuICB2YXIgZDNfZ2VvX2NlbnRyb2lkID0ge1xuICAgIHNwaGVyZTogZDNfbm9vcCxcbiAgICBwb2ludDogZDNfZ2VvX2NlbnRyb2lkUG9pbnQsXG4gICAgbGluZVN0YXJ0OiBkM19nZW9fY2VudHJvaWRMaW5lU3RhcnQsXG4gICAgbGluZUVuZDogZDNfZ2VvX2NlbnRyb2lkTGluZUVuZCxcbiAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkLmxpbmVTdGFydCA9IGQzX2dlb19jZW50cm9pZFJpbmdTdGFydDtcbiAgICB9LFxuICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkLmxpbmVTdGFydCA9IGQzX2dlb19jZW50cm9pZExpbmVTdGFydDtcbiAgICB9XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2dlb19jZW50cm9pZFBvaW50KM67LCDPhikge1xuICAgIM67ICo9IGQzX3JhZGlhbnM7XG4gICAgdmFyIGNvc8+GID0gTWF0aC5jb3Moz4YgKj0gZDNfcmFkaWFucyk7XG4gICAgZDNfZ2VvX2NlbnRyb2lkUG9pbnRYWVooY29zz4YgKiBNYXRoLmNvcyjOuyksIGNvc8+GICogTWF0aC5zaW4ozrspLCBNYXRoLnNpbijPhikpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19jZW50cm9pZFBvaW50WFlaKHgsIHksIHopIHtcbiAgICArK2QzX2dlb19jZW50cm9pZFcwO1xuICAgIGQzX2dlb19jZW50cm9pZFgwICs9ICh4IC0gZDNfZ2VvX2NlbnRyb2lkWDApIC8gZDNfZ2VvX2NlbnRyb2lkVzA7XG4gICAgZDNfZ2VvX2NlbnRyb2lkWTAgKz0gKHkgLSBkM19nZW9fY2VudHJvaWRZMCkgLyBkM19nZW9fY2VudHJvaWRXMDtcbiAgICBkM19nZW9fY2VudHJvaWRaMCArPSAoeiAtIGQzX2dlb19jZW50cm9pZFowKSAvIGQzX2dlb19jZW50cm9pZFcwO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19jZW50cm9pZExpbmVTdGFydCgpIHtcbiAgICB2YXIgeDAsIHkwLCB6MDtcbiAgICBkM19nZW9fY2VudHJvaWQucG9pbnQgPSBmdW5jdGlvbijOuywgz4YpIHtcbiAgICAgIM67ICo9IGQzX3JhZGlhbnM7XG4gICAgICB2YXIgY29zz4YgPSBNYXRoLmNvcyjPhiAqPSBkM19yYWRpYW5zKTtcbiAgICAgIHgwID0gY29zz4YgKiBNYXRoLmNvcyjOuyk7XG4gICAgICB5MCA9IGNvc8+GICogTWF0aC5zaW4ozrspO1xuICAgICAgejAgPSBNYXRoLnNpbijPhik7XG4gICAgICBkM19nZW9fY2VudHJvaWQucG9pbnQgPSBuZXh0UG9pbnQ7XG4gICAgICBkM19nZW9fY2VudHJvaWRQb2ludFhZWih4MCwgeTAsIHowKTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIG5leHRQb2ludCjOuywgz4YpIHtcbiAgICAgIM67ICo9IGQzX3JhZGlhbnM7XG4gICAgICB2YXIgY29zz4YgPSBNYXRoLmNvcyjPhiAqPSBkM19yYWRpYW5zKSwgeCA9IGNvc8+GICogTWF0aC5jb3MozrspLCB5ID0gY29zz4YgKiBNYXRoLnNpbijOuyksIHogPSBNYXRoLnNpbijPhiksIHcgPSBNYXRoLmF0YW4yKE1hdGguc3FydCgodyA9IHkwICogeiAtIHowICogeSkgKiB3ICsgKHcgPSB6MCAqIHggLSB4MCAqIHopICogdyArICh3ID0geDAgKiB5IC0geTAgKiB4KSAqIHcpLCB4MCAqIHggKyB5MCAqIHkgKyB6MCAqIHopO1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkVzEgKz0gdztcbiAgICAgIGQzX2dlb19jZW50cm9pZFgxICs9IHcgKiAoeDAgKyAoeDAgPSB4KSk7XG4gICAgICBkM19nZW9fY2VudHJvaWRZMSArPSB3ICogKHkwICsgKHkwID0geSkpO1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkWjEgKz0gdyAqICh6MCArICh6MCA9IHopKTtcbiAgICAgIGQzX2dlb19jZW50cm9pZFBvaW50WFlaKHgwLCB5MCwgejApO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fY2VudHJvaWRMaW5lRW5kKCkge1xuICAgIGQzX2dlb19jZW50cm9pZC5wb2ludCA9IGQzX2dlb19jZW50cm9pZFBvaW50O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19jZW50cm9pZFJpbmdTdGFydCgpIHtcbiAgICB2YXIgzrswMCwgz4YwMCwgeDAsIHkwLCB6MDtcbiAgICBkM19nZW9fY2VudHJvaWQucG9pbnQgPSBmdW5jdGlvbijOuywgz4YpIHtcbiAgICAgIM67MDAgPSDOuywgz4YwMCA9IM+GO1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkLnBvaW50ID0gbmV4dFBvaW50O1xuICAgICAgzrsgKj0gZDNfcmFkaWFucztcbiAgICAgIHZhciBjb3PPhiA9IE1hdGguY29zKM+GICo9IGQzX3JhZGlhbnMpO1xuICAgICAgeDAgPSBjb3PPhiAqIE1hdGguY29zKM67KTtcbiAgICAgIHkwID0gY29zz4YgKiBNYXRoLnNpbijOuyk7XG4gICAgICB6MCA9IE1hdGguc2luKM+GKTtcbiAgICAgIGQzX2dlb19jZW50cm9pZFBvaW50WFlaKHgwLCB5MCwgejApO1xuICAgIH07XG4gICAgZDNfZ2VvX2NlbnRyb2lkLmxpbmVFbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIG5leHRQb2ludCjOuzAwLCDPhjAwKTtcbiAgICAgIGQzX2dlb19jZW50cm9pZC5saW5lRW5kID0gZDNfZ2VvX2NlbnRyb2lkTGluZUVuZDtcbiAgICAgIGQzX2dlb19jZW50cm9pZC5wb2ludCA9IGQzX2dlb19jZW50cm9pZFBvaW50O1xuICAgIH07XG4gICAgZnVuY3Rpb24gbmV4dFBvaW50KM67LCDPhikge1xuICAgICAgzrsgKj0gZDNfcmFkaWFucztcbiAgICAgIHZhciBjb3PPhiA9IE1hdGguY29zKM+GICo9IGQzX3JhZGlhbnMpLCB4ID0gY29zz4YgKiBNYXRoLmNvcyjOuyksIHkgPSBjb3PPhiAqIE1hdGguc2luKM67KSwgeiA9IE1hdGguc2luKM+GKSwgY3ggPSB5MCAqIHogLSB6MCAqIHksIGN5ID0gejAgKiB4IC0geDAgKiB6LCBjeiA9IHgwICogeSAtIHkwICogeCwgbSA9IE1hdGguc3FydChjeCAqIGN4ICsgY3kgKiBjeSArIGN6ICogY3opLCB1ID0geDAgKiB4ICsgeTAgKiB5ICsgejAgKiB6LCB2ID0gbSAmJiAtZDNfYWNvcyh1KSAvIG0sIHcgPSBNYXRoLmF0YW4yKG0sIHUpO1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkWDIgKz0gdiAqIGN4O1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkWTIgKz0gdiAqIGN5O1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkWjIgKz0gdiAqIGN6O1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkVzEgKz0gdztcbiAgICAgIGQzX2dlb19jZW50cm9pZFgxICs9IHcgKiAoeDAgKyAoeDAgPSB4KSk7XG4gICAgICBkM19nZW9fY2VudHJvaWRZMSArPSB3ICogKHkwICsgKHkwID0geSkpO1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkWjEgKz0gdyAqICh6MCArICh6MCA9IHopKTtcbiAgICAgIGQzX2dlb19jZW50cm9pZFBvaW50WFlaKHgwLCB5MCwgejApO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fY29tcG9zZShhLCBiKSB7XG4gICAgZnVuY3Rpb24gY29tcG9zZSh4LCB5KSB7XG4gICAgICByZXR1cm4geCA9IGEoeCwgeSksIGIoeFswXSwgeFsxXSk7XG4gICAgfVxuICAgIGlmIChhLmludmVydCAmJiBiLmludmVydCkgY29tcG9zZS5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgICByZXR1cm4geCA9IGIuaW52ZXJ0KHgsIHkpLCB4ICYmIGEuaW52ZXJ0KHhbMF0sIHhbMV0pO1xuICAgIH07XG4gICAgcmV0dXJuIGNvbXBvc2U7XG4gIH1cbiAgZnVuY3Rpb24gZDNfdHJ1ZSgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fY2xpcFBvbHlnb24oc2VnbWVudHMsIGNvbXBhcmUsIGNsaXBTdGFydEluc2lkZSwgaW50ZXJwb2xhdGUsIGxpc3RlbmVyKSB7XG4gICAgdmFyIHN1YmplY3QgPSBbXSwgY2xpcCA9IFtdO1xuICAgIHNlZ21lbnRzLmZvckVhY2goZnVuY3Rpb24oc2VnbWVudCkge1xuICAgICAgaWYgKChuID0gc2VnbWVudC5sZW5ndGggLSAxKSA8PSAwKSByZXR1cm47XG4gICAgICB2YXIgbiwgcDAgPSBzZWdtZW50WzBdLCBwMSA9IHNlZ21lbnRbbl07XG4gICAgICBpZiAoZDNfZ2VvX3NwaGVyaWNhbEVxdWFsKHAwLCBwMSkpIHtcbiAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSBsaXN0ZW5lci5wb2ludCgocDAgPSBzZWdtZW50W2ldKVswXSwgcDBbMV0pO1xuICAgICAgICBsaXN0ZW5lci5saW5lRW5kKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHZhciBhID0gbmV3IGQzX2dlb19jbGlwUG9seWdvbkludGVyc2VjdGlvbihwMCwgc2VnbWVudCwgbnVsbCwgdHJ1ZSksIGIgPSBuZXcgZDNfZ2VvX2NsaXBQb2x5Z29uSW50ZXJzZWN0aW9uKHAwLCBudWxsLCBhLCBmYWxzZSk7XG4gICAgICBhLm8gPSBiO1xuICAgICAgc3ViamVjdC5wdXNoKGEpO1xuICAgICAgY2xpcC5wdXNoKGIpO1xuICAgICAgYSA9IG5ldyBkM19nZW9fY2xpcFBvbHlnb25JbnRlcnNlY3Rpb24ocDEsIHNlZ21lbnQsIG51bGwsIGZhbHNlKTtcbiAgICAgIGIgPSBuZXcgZDNfZ2VvX2NsaXBQb2x5Z29uSW50ZXJzZWN0aW9uKHAxLCBudWxsLCBhLCB0cnVlKTtcbiAgICAgIGEubyA9IGI7XG4gICAgICBzdWJqZWN0LnB1c2goYSk7XG4gICAgICBjbGlwLnB1c2goYik7XG4gICAgfSk7XG4gICAgY2xpcC5zb3J0KGNvbXBhcmUpO1xuICAgIGQzX2dlb19jbGlwUG9seWdvbkxpbmtDaXJjdWxhcihzdWJqZWN0KTtcbiAgICBkM19nZW9fY2xpcFBvbHlnb25MaW5rQ2lyY3VsYXIoY2xpcCk7XG4gICAgaWYgKCFzdWJqZWN0Lmxlbmd0aCkgcmV0dXJuO1xuICAgIGZvciAodmFyIGkgPSAwLCBlbnRyeSA9IGNsaXBTdGFydEluc2lkZSwgbiA9IGNsaXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7XG4gICAgICBjbGlwW2ldLmUgPSBlbnRyeSA9ICFlbnRyeTtcbiAgICB9XG4gICAgdmFyIHN0YXJ0ID0gc3ViamVjdFswXSwgcG9pbnRzLCBwb2ludDtcbiAgICB3aGlsZSAoMSkge1xuICAgICAgdmFyIGN1cnJlbnQgPSBzdGFydCwgaXNTdWJqZWN0ID0gdHJ1ZTtcbiAgICAgIHdoaWxlIChjdXJyZW50LnYpIGlmICgoY3VycmVudCA9IGN1cnJlbnQubikgPT09IHN0YXJ0KSByZXR1cm47XG4gICAgICBwb2ludHMgPSBjdXJyZW50Lno7XG4gICAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTtcbiAgICAgIGRvIHtcbiAgICAgICAgY3VycmVudC52ID0gY3VycmVudC5vLnYgPSB0cnVlO1xuICAgICAgICBpZiAoY3VycmVudC5lKSB7XG4gICAgICAgICAgaWYgKGlzU3ViamVjdCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBwb2ludHMubGVuZ3RoOyBpIDwgbjsgKytpKSBsaXN0ZW5lci5wb2ludCgocG9pbnQgPSBwb2ludHNbaV0pWzBdLCBwb2ludFsxXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGludGVycG9sYXRlKGN1cnJlbnQueCwgY3VycmVudC5uLngsIDEsIGxpc3RlbmVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoaXNTdWJqZWN0KSB7XG4gICAgICAgICAgICBwb2ludHMgPSBjdXJyZW50LnAuejtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBwb2ludHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIGxpc3RlbmVyLnBvaW50KChwb2ludCA9IHBvaW50c1tpXSlbMF0sIHBvaW50WzFdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW50ZXJwb2xhdGUoY3VycmVudC54LCBjdXJyZW50LnAueCwgLTEsIGxpc3RlbmVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucDtcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50ID0gY3VycmVudC5vO1xuICAgICAgICBwb2ludHMgPSBjdXJyZW50Lno7XG4gICAgICAgIGlzU3ViamVjdCA9ICFpc1N1YmplY3Q7XG4gICAgICB9IHdoaWxlICghY3VycmVudC52KTtcbiAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBQb2x5Z29uTGlua0NpcmN1bGFyKGFycmF5KSB7XG4gICAgaWYgKCEobiA9IGFycmF5Lmxlbmd0aCkpIHJldHVybjtcbiAgICB2YXIgbiwgaSA9IDAsIGEgPSBhcnJheVswXSwgYjtcbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgYS5uID0gYiA9IGFycmF5W2ldO1xuICAgICAgYi5wID0gYTtcbiAgICAgIGEgPSBiO1xuICAgIH1cbiAgICBhLm4gPSBiID0gYXJyYXlbMF07XG4gICAgYi5wID0gYTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fY2xpcFBvbHlnb25JbnRlcnNlY3Rpb24ocG9pbnQsIHBvaW50cywgb3RoZXIsIGVudHJ5KSB7XG4gICAgdGhpcy54ID0gcG9pbnQ7XG4gICAgdGhpcy56ID0gcG9pbnRzO1xuICAgIHRoaXMubyA9IG90aGVyO1xuICAgIHRoaXMuZSA9IGVudHJ5O1xuICAgIHRoaXMudiA9IGZhbHNlO1xuICAgIHRoaXMubiA9IHRoaXMucCA9IG51bGw7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXAocG9pbnRWaXNpYmxlLCBjbGlwTGluZSwgaW50ZXJwb2xhdGUsIGNsaXBTdGFydCkge1xuICAgIHJldHVybiBmdW5jdGlvbihyb3RhdGUsIGxpc3RlbmVyKSB7XG4gICAgICB2YXIgbGluZSA9IGNsaXBMaW5lKGxpc3RlbmVyKSwgcm90YXRlZENsaXBTdGFydCA9IHJvdGF0ZS5pbnZlcnQoY2xpcFN0YXJ0WzBdLCBjbGlwU3RhcnRbMV0pO1xuICAgICAgdmFyIGNsaXAgPSB7XG4gICAgICAgIHBvaW50OiBwb2ludCxcbiAgICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsXG4gICAgICAgIGxpbmVFbmQ6IGxpbmVFbmQsXG4gICAgICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgY2xpcC5wb2ludCA9IHBvaW50UmluZztcbiAgICAgICAgICBjbGlwLmxpbmVTdGFydCA9IHJpbmdTdGFydDtcbiAgICAgICAgICBjbGlwLmxpbmVFbmQgPSByaW5nRW5kO1xuICAgICAgICAgIHNlZ21lbnRzID0gW107XG4gICAgICAgICAgcG9seWdvbiA9IFtdO1xuICAgICAgICB9LFxuICAgICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBjbGlwLnBvaW50ID0gcG9pbnQ7XG4gICAgICAgICAgY2xpcC5saW5lU3RhcnQgPSBsaW5lU3RhcnQ7XG4gICAgICAgICAgY2xpcC5saW5lRW5kID0gbGluZUVuZDtcbiAgICAgICAgICBzZWdtZW50cyA9IGQzLm1lcmdlKHNlZ21lbnRzKTtcbiAgICAgICAgICB2YXIgY2xpcFN0YXJ0SW5zaWRlID0gZDNfZ2VvX3BvaW50SW5Qb2x5Z29uKHJvdGF0ZWRDbGlwU3RhcnQsIHBvbHlnb24pO1xuICAgICAgICAgIGlmIChzZWdtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICghcG9seWdvblN0YXJ0ZWQpIGxpc3RlbmVyLnBvbHlnb25TdGFydCgpLCBwb2x5Z29uU3RhcnRlZCA9IHRydWU7XG4gICAgICAgICAgICBkM19nZW9fY2xpcFBvbHlnb24oc2VnbWVudHMsIGQzX2dlb19jbGlwU29ydCwgY2xpcFN0YXJ0SW5zaWRlLCBpbnRlcnBvbGF0ZSwgbGlzdGVuZXIpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2xpcFN0YXJ0SW5zaWRlKSB7XG4gICAgICAgICAgICBpZiAoIXBvbHlnb25TdGFydGVkKSBsaXN0ZW5lci5wb2x5Z29uU3RhcnQoKSwgcG9seWdvblN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7XG4gICAgICAgICAgICBpbnRlcnBvbGF0ZShudWxsLCBudWxsLCAxLCBsaXN0ZW5lcik7XG4gICAgICAgICAgICBsaXN0ZW5lci5saW5lRW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChwb2x5Z29uU3RhcnRlZCkgbGlzdGVuZXIucG9seWdvbkVuZCgpLCBwb2x5Z29uU3RhcnRlZCA9IGZhbHNlO1xuICAgICAgICAgIHNlZ21lbnRzID0gcG9seWdvbiA9IG51bGw7XG4gICAgICAgIH0sXG4gICAgICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgbGlzdGVuZXIucG9seWdvblN0YXJ0KCk7XG4gICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7XG4gICAgICAgICAgaW50ZXJwb2xhdGUobnVsbCwgbnVsbCwgMSwgbGlzdGVuZXIpO1xuICAgICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTtcbiAgICAgICAgICBsaXN0ZW5lci5wb2x5Z29uRW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBwb2ludCjOuywgz4YpIHtcbiAgICAgICAgdmFyIHBvaW50ID0gcm90YXRlKM67LCDPhik7XG4gICAgICAgIGlmIChwb2ludFZpc2libGUozrsgPSBwb2ludFswXSwgz4YgPSBwb2ludFsxXSkpIGxpc3RlbmVyLnBvaW50KM67LCDPhik7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBwb2ludExpbmUozrssIM+GKSB7XG4gICAgICAgIHZhciBwb2ludCA9IHJvdGF0ZSjOuywgz4YpO1xuICAgICAgICBsaW5lLnBvaW50KHBvaW50WzBdLCBwb2ludFsxXSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBsaW5lU3RhcnQoKSB7XG4gICAgICAgIGNsaXAucG9pbnQgPSBwb2ludExpbmU7XG4gICAgICAgIGxpbmUubGluZVN0YXJ0KCk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBsaW5lRW5kKCkge1xuICAgICAgICBjbGlwLnBvaW50ID0gcG9pbnQ7XG4gICAgICAgIGxpbmUubGluZUVuZCgpO1xuICAgICAgfVxuICAgICAgdmFyIHNlZ21lbnRzO1xuICAgICAgdmFyIGJ1ZmZlciA9IGQzX2dlb19jbGlwQnVmZmVyTGlzdGVuZXIoKSwgcmluZ0xpc3RlbmVyID0gY2xpcExpbmUoYnVmZmVyKSwgcG9seWdvblN0YXJ0ZWQgPSBmYWxzZSwgcG9seWdvbiwgcmluZztcbiAgICAgIGZ1bmN0aW9uIHBvaW50UmluZyjOuywgz4YpIHtcbiAgICAgICAgcmluZy5wdXNoKFsgzrssIM+GIF0pO1xuICAgICAgICB2YXIgcG9pbnQgPSByb3RhdGUozrssIM+GKTtcbiAgICAgICAgcmluZ0xpc3RlbmVyLnBvaW50KHBvaW50WzBdLCBwb2ludFsxXSk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiByaW5nU3RhcnQoKSB7XG4gICAgICAgIHJpbmdMaXN0ZW5lci5saW5lU3RhcnQoKTtcbiAgICAgICAgcmluZyA9IFtdO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcmluZ0VuZCgpIHtcbiAgICAgICAgcG9pbnRSaW5nKHJpbmdbMF1bMF0sIHJpbmdbMF1bMV0pO1xuICAgICAgICByaW5nTGlzdGVuZXIubGluZUVuZCgpO1xuICAgICAgICB2YXIgY2xlYW4gPSByaW5nTGlzdGVuZXIuY2xlYW4oKSwgcmluZ1NlZ21lbnRzID0gYnVmZmVyLmJ1ZmZlcigpLCBzZWdtZW50LCBuID0gcmluZ1NlZ21lbnRzLmxlbmd0aDtcbiAgICAgICAgcmluZy5wb3AoKTtcbiAgICAgICAgcG9seWdvbi5wdXNoKHJpbmcpO1xuICAgICAgICByaW5nID0gbnVsbDtcbiAgICAgICAgaWYgKCFuKSByZXR1cm47XG4gICAgICAgIGlmIChjbGVhbiAmIDEpIHtcbiAgICAgICAgICBzZWdtZW50ID0gcmluZ1NlZ21lbnRzWzBdO1xuICAgICAgICAgIHZhciBuID0gc2VnbWVudC5sZW5ndGggLSAxLCBpID0gLTEsIHBvaW50O1xuICAgICAgICAgIGlmIChuID4gMCkge1xuICAgICAgICAgICAgaWYgKCFwb2x5Z29uU3RhcnRlZCkgbGlzdGVuZXIucG9seWdvblN0YXJ0KCksIHBvbHlnb25TdGFydGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpO1xuICAgICAgICAgICAgd2hpbGUgKCsraSA8IG4pIGxpc3RlbmVyLnBvaW50KChwb2ludCA9IHNlZ21lbnRbaV0pWzBdLCBwb2ludFsxXSk7XG4gICAgICAgICAgICBsaXN0ZW5lci5saW5lRW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobiA+IDEgJiYgY2xlYW4gJiAyKSByaW5nU2VnbWVudHMucHVzaChyaW5nU2VnbWVudHMucG9wKCkuY29uY2F0KHJpbmdTZWdtZW50cy5zaGlmdCgpKSk7XG4gICAgICAgIHNlZ21lbnRzLnB1c2gocmluZ1NlZ21lbnRzLmZpbHRlcihkM19nZW9fY2xpcFNlZ21lbnRMZW5ndGgxKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xpcDtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19jbGlwU2VnbWVudExlbmd0aDEoc2VnbWVudCkge1xuICAgIHJldHVybiBzZWdtZW50Lmxlbmd0aCA+IDE7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBCdWZmZXJMaXN0ZW5lcigpIHtcbiAgICB2YXIgbGluZXMgPSBbXSwgbGluZTtcbiAgICByZXR1cm4ge1xuICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgbGluZXMucHVzaChsaW5lID0gW10pO1xuICAgICAgfSxcbiAgICAgIHBvaW50OiBmdW5jdGlvbijOuywgz4YpIHtcbiAgICAgICAgbGluZS5wdXNoKFsgzrssIM+GIF0pO1xuICAgICAgfSxcbiAgICAgIGxpbmVFbmQ6IGQzX25vb3AsXG4gICAgICBidWZmZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYnVmZmVyID0gbGluZXM7XG4gICAgICAgIGxpbmVzID0gW107XG4gICAgICAgIGxpbmUgPSBudWxsO1xuICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgfSxcbiAgICAgIHJlam9pbjogZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggPiAxKSBsaW5lcy5wdXNoKGxpbmVzLnBvcCgpLmNvbmNhdChsaW5lcy5zaGlmdCgpKSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fY2xpcFNvcnQoYSwgYikge1xuICAgIHJldHVybiAoKGEgPSBhLngpWzBdIDwgMCA/IGFbMV0gLSBoYWxmz4AgLSDOtSA6IGhhbGbPgCAtIGFbMV0pIC0gKChiID0gYi54KVswXSA8IDAgPyBiWzFdIC0gaGFsZs+AIC0gzrUgOiBoYWxmz4AgLSBiWzFdKTtcbiAgfVxuICB2YXIgZDNfZ2VvX2NsaXBBbnRpbWVyaWRpYW4gPSBkM19nZW9fY2xpcChkM190cnVlLCBkM19nZW9fY2xpcEFudGltZXJpZGlhbkxpbmUsIGQzX2dlb19jbGlwQW50aW1lcmlkaWFuSW50ZXJwb2xhdGUsIFsgLc+ALCAtz4AgLyAyIF0pO1xuICBmdW5jdGlvbiBkM19nZW9fY2xpcEFudGltZXJpZGlhbkxpbmUobGlzdGVuZXIpIHtcbiAgICB2YXIgzrswID0gTmFOLCDPhjAgPSBOYU4sIHPOuzAgPSBOYU4sIGNsZWFuO1xuICAgIHJldHVybiB7XG4gICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTtcbiAgICAgICAgY2xlYW4gPSAxO1xuICAgICAgfSxcbiAgICAgIHBvaW50OiBmdW5jdGlvbijOuzEsIM+GMSkge1xuICAgICAgICB2YXIgc867MSA9IM67MSA+IDAgPyDPgCA6IC3PgCwgZM67ID0gYWJzKM67MSAtIM67MCk7XG4gICAgICAgIGlmIChhYnMoZM67IC0gz4ApIDwgzrUpIHtcbiAgICAgICAgICBsaXN0ZW5lci5wb2ludCjOuzAsIM+GMCA9ICjPhjAgKyDPhjEpIC8gMiA+IDAgPyBoYWxmz4AgOiAtaGFsZs+AKTtcbiAgICAgICAgICBsaXN0ZW5lci5wb2ludChzzrswLCDPhjApO1xuICAgICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTtcbiAgICAgICAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTtcbiAgICAgICAgICBsaXN0ZW5lci5wb2ludChzzrsxLCDPhjApO1xuICAgICAgICAgIGxpc3RlbmVyLnBvaW50KM67MSwgz4YwKTtcbiAgICAgICAgICBjbGVhbiA9IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoc867MCAhPT0gc867MSAmJiBkzrsgPj0gz4ApIHtcbiAgICAgICAgICBpZiAoYWJzKM67MCAtIHPOuzApIDwgzrUpIM67MCAtPSBzzrswICogzrU7XG4gICAgICAgICAgaWYgKGFicyjOuzEgLSBzzrsxKSA8IM61KSDOuzEgLT0gc867MSAqIM61O1xuICAgICAgICAgIM+GMCA9IGQzX2dlb19jbGlwQW50aW1lcmlkaWFuSW50ZXJzZWN0KM67MCwgz4YwLCDOuzEsIM+GMSk7XG4gICAgICAgICAgbGlzdGVuZXIucG9pbnQoc867MCwgz4YwKTtcbiAgICAgICAgICBsaXN0ZW5lci5saW5lRW5kKCk7XG4gICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7XG4gICAgICAgICAgbGlzdGVuZXIucG9pbnQoc867MSwgz4YwKTtcbiAgICAgICAgICBjbGVhbiA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgbGlzdGVuZXIucG9pbnQozrswID0gzrsxLCDPhjAgPSDPhjEpO1xuICAgICAgICBzzrswID0gc867MTtcbiAgICAgIH0sXG4gICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHtcbiAgICAgICAgbGlzdGVuZXIubGluZUVuZCgpO1xuICAgICAgICDOuzAgPSDPhjAgPSBOYU47XG4gICAgICB9LFxuICAgICAgY2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gMiAtIGNsZWFuO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBBbnRpbWVyaWRpYW5JbnRlcnNlY3QozrswLCDPhjAsIM67MSwgz4YxKSB7XG4gICAgdmFyIGNvc8+GMCwgY29zz4YxLCBzaW7OuzBfzrsxID0gTWF0aC5zaW4ozrswIC0gzrsxKTtcbiAgICByZXR1cm4gYWJzKHNpbs67MF/OuzEpID4gzrUgPyBNYXRoLmF0YW4oKE1hdGguc2luKM+GMCkgKiAoY29zz4YxID0gTWF0aC5jb3Moz4YxKSkgKiBNYXRoLnNpbijOuzEpIC0gTWF0aC5zaW4oz4YxKSAqIChjb3PPhjAgPSBNYXRoLmNvcyjPhjApKSAqIE1hdGguc2luKM67MCkpIC8gKGNvc8+GMCAqIGNvc8+GMSAqIHNpbs67MF/OuzEpKSA6ICjPhjAgKyDPhjEpIC8gMjtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fY2xpcEFudGltZXJpZGlhbkludGVycG9sYXRlKGZyb20sIHRvLCBkaXJlY3Rpb24sIGxpc3RlbmVyKSB7XG4gICAgdmFyIM+GO1xuICAgIGlmIChmcm9tID09IG51bGwpIHtcbiAgICAgIM+GID0gZGlyZWN0aW9uICogaGFsZs+AO1xuICAgICAgbGlzdGVuZXIucG9pbnQoLc+ALCDPhik7XG4gICAgICBsaXN0ZW5lci5wb2ludCgwLCDPhik7XG4gICAgICBsaXN0ZW5lci5wb2ludCjPgCwgz4YpO1xuICAgICAgbGlzdGVuZXIucG9pbnQoz4AsIDApO1xuICAgICAgbGlzdGVuZXIucG9pbnQoz4AsIC3Phik7XG4gICAgICBsaXN0ZW5lci5wb2ludCgwLCAtz4YpO1xuICAgICAgbGlzdGVuZXIucG9pbnQoLc+ALCAtz4YpO1xuICAgICAgbGlzdGVuZXIucG9pbnQoLc+ALCAwKTtcbiAgICAgIGxpc3RlbmVyLnBvaW50KC3PgCwgz4YpO1xuICAgIH0gZWxzZSBpZiAoYWJzKGZyb21bMF0gLSB0b1swXSkgPiDOtSkge1xuICAgICAgdmFyIHMgPSBmcm9tWzBdIDwgdG9bMF0gPyDPgCA6IC3PgDtcbiAgICAgIM+GID0gZGlyZWN0aW9uICogcyAvIDI7XG4gICAgICBsaXN0ZW5lci5wb2ludCgtcywgz4YpO1xuICAgICAgbGlzdGVuZXIucG9pbnQoMCwgz4YpO1xuICAgICAgbGlzdGVuZXIucG9pbnQocywgz4YpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0ZW5lci5wb2ludCh0b1swXSwgdG9bMV0pO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fcG9pbnRJblBvbHlnb24ocG9pbnQsIHBvbHlnb24pIHtcbiAgICB2YXIgbWVyaWRpYW4gPSBwb2ludFswXSwgcGFyYWxsZWwgPSBwb2ludFsxXSwgbWVyaWRpYW5Ob3JtYWwgPSBbIE1hdGguc2luKG1lcmlkaWFuKSwgLU1hdGguY29zKG1lcmlkaWFuKSwgMCBdLCBwb2xhckFuZ2xlID0gMCwgd2luZGluZyA9IDA7XG4gICAgZDNfZ2VvX2FyZWFSaW5nU3VtLnJlc2V0KCk7XG4gICAgZm9yICh2YXIgaSA9IDAsIG4gPSBwb2x5Z29uLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgdmFyIHJpbmcgPSBwb2x5Z29uW2ldLCBtID0gcmluZy5sZW5ndGg7XG4gICAgICBpZiAoIW0pIGNvbnRpbnVlO1xuICAgICAgdmFyIHBvaW50MCA9IHJpbmdbMF0sIM67MCA9IHBvaW50MFswXSwgz4YwID0gcG9pbnQwWzFdIC8gMiArIM+AIC8gNCwgc2luz4YwID0gTWF0aC5zaW4oz4YwKSwgY29zz4YwID0gTWF0aC5jb3Moz4YwKSwgaiA9IDE7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBpZiAoaiA9PT0gbSkgaiA9IDA7XG4gICAgICAgIHBvaW50ID0gcmluZ1tqXTtcbiAgICAgICAgdmFyIM67ID0gcG9pbnRbMF0sIM+GID0gcG9pbnRbMV0gLyAyICsgz4AgLyA0LCBzaW7PhiA9IE1hdGguc2luKM+GKSwgY29zz4YgPSBNYXRoLmNvcyjPhiksIGTOuyA9IM67IC0gzrswLCBzZM67ID0gZM67ID49IDAgPyAxIDogLTEsIGFkzrsgPSBzZM67ICogZM67LCBhbnRpbWVyaWRpYW4gPSBhZM67ID4gz4AsIGsgPSBzaW7PhjAgKiBzaW7PhjtcbiAgICAgICAgZDNfZ2VvX2FyZWFSaW5nU3VtLmFkZChNYXRoLmF0YW4yKGsgKiBzZM67ICogTWF0aC5zaW4oYWTOuyksIGNvc8+GMCAqIGNvc8+GICsgayAqIE1hdGguY29zKGFkzrspKSk7XG4gICAgICAgIHBvbGFyQW5nbGUgKz0gYW50aW1lcmlkaWFuID8gZM67ICsgc2TOuyAqIM+EIDogZM67O1xuICAgICAgICBpZiAoYW50aW1lcmlkaWFuIF4gzrswID49IG1lcmlkaWFuIF4gzrsgPj0gbWVyaWRpYW4pIHtcbiAgICAgICAgICB2YXIgYXJjID0gZDNfZ2VvX2NhcnRlc2lhbkNyb3NzKGQzX2dlb19jYXJ0ZXNpYW4ocG9pbnQwKSwgZDNfZ2VvX2NhcnRlc2lhbihwb2ludCkpO1xuICAgICAgICAgIGQzX2dlb19jYXJ0ZXNpYW5Ob3JtYWxpemUoYXJjKTtcbiAgICAgICAgICB2YXIgaW50ZXJzZWN0aW9uID0gZDNfZ2VvX2NhcnRlc2lhbkNyb3NzKG1lcmlkaWFuTm9ybWFsLCBhcmMpO1xuICAgICAgICAgIGQzX2dlb19jYXJ0ZXNpYW5Ob3JtYWxpemUoaW50ZXJzZWN0aW9uKTtcbiAgICAgICAgICB2YXIgz4ZhcmMgPSAoYW50aW1lcmlkaWFuIF4gZM67ID49IDAgPyAtMSA6IDEpICogZDNfYXNpbihpbnRlcnNlY3Rpb25bMl0pO1xuICAgICAgICAgIGlmIChwYXJhbGxlbCA+IM+GYXJjIHx8IHBhcmFsbGVsID09PSDPhmFyYyAmJiAoYXJjWzBdIHx8IGFyY1sxXSkpIHtcbiAgICAgICAgICAgIHdpbmRpbmcgKz0gYW50aW1lcmlkaWFuIF4gZM67ID49IDAgPyAxIDogLTE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghaisrKSBicmVhaztcbiAgICAgICAgzrswID0gzrssIHNpbs+GMCA9IHNpbs+GLCBjb3PPhjAgPSBjb3PPhiwgcG9pbnQwID0gcG9pbnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAocG9sYXJBbmdsZSA8IC3OtSB8fCBwb2xhckFuZ2xlIDwgzrUgJiYgZDNfZ2VvX2FyZWFSaW5nU3VtIDwgLc61KSBeIHdpbmRpbmcgJiAxO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19jbGlwQ2lyY2xlKHJhZGl1cykge1xuICAgIHZhciBjciA9IE1hdGguY29zKHJhZGl1cyksIHNtYWxsUmFkaXVzID0gY3IgPiAwLCBub3RIZW1pc3BoZXJlID0gYWJzKGNyKSA+IM61LCBpbnRlcnBvbGF0ZSA9IGQzX2dlb19jaXJjbGVJbnRlcnBvbGF0ZShyYWRpdXMsIDYgKiBkM19yYWRpYW5zKTtcbiAgICByZXR1cm4gZDNfZ2VvX2NsaXAodmlzaWJsZSwgY2xpcExpbmUsIGludGVycG9sYXRlLCBzbWFsbFJhZGl1cyA/IFsgMCwgLXJhZGl1cyBdIDogWyAtz4AsIHJhZGl1cyAtIM+AIF0pO1xuICAgIGZ1bmN0aW9uIHZpc2libGUozrssIM+GKSB7XG4gICAgICByZXR1cm4gTWF0aC5jb3MozrspICogTWF0aC5jb3Moz4YpID4gY3I7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNsaXBMaW5lKGxpc3RlbmVyKSB7XG4gICAgICB2YXIgcG9pbnQwLCBjMCwgdjAsIHYwMCwgY2xlYW47XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHYwMCA9IHYwID0gZmFsc2U7XG4gICAgICAgICAgY2xlYW4gPSAxO1xuICAgICAgICB9LFxuICAgICAgICBwb2ludDogZnVuY3Rpb24ozrssIM+GKSB7XG4gICAgICAgICAgdmFyIHBvaW50MSA9IFsgzrssIM+GIF0sIHBvaW50MiwgdiA9IHZpc2libGUozrssIM+GKSwgYyA9IHNtYWxsUmFkaXVzID8gdiA/IDAgOiBjb2RlKM67LCDPhikgOiB2ID8gY29kZSjOuyArICjOuyA8IDAgPyDPgCA6IC3PgCksIM+GKSA6IDA7XG4gICAgICAgICAgaWYgKCFwb2ludDAgJiYgKHYwMCA9IHYwID0gdikpIGxpc3RlbmVyLmxpbmVTdGFydCgpO1xuICAgICAgICAgIGlmICh2ICE9PSB2MCkge1xuICAgICAgICAgICAgcG9pbnQyID0gaW50ZXJzZWN0KHBvaW50MCwgcG9pbnQxKTtcbiAgICAgICAgICAgIGlmIChkM19nZW9fc3BoZXJpY2FsRXF1YWwocG9pbnQwLCBwb2ludDIpIHx8IGQzX2dlb19zcGhlcmljYWxFcXVhbChwb2ludDEsIHBvaW50MikpIHtcbiAgICAgICAgICAgICAgcG9pbnQxWzBdICs9IM61O1xuICAgICAgICAgICAgICBwb2ludDFbMV0gKz0gzrU7XG4gICAgICAgICAgICAgIHYgPSB2aXNpYmxlKHBvaW50MVswXSwgcG9pbnQxWzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHYgIT09IHYwKSB7XG4gICAgICAgICAgICBjbGVhbiA9IDA7XG4gICAgICAgICAgICBpZiAodikge1xuICAgICAgICAgICAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTtcbiAgICAgICAgICAgICAgcG9pbnQyID0gaW50ZXJzZWN0KHBvaW50MSwgcG9pbnQwKTtcbiAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQocG9pbnQyWzBdLCBwb2ludDJbMV0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcG9pbnQyID0gaW50ZXJzZWN0KHBvaW50MCwgcG9pbnQxKTtcbiAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQocG9pbnQyWzBdLCBwb2ludDJbMV0pO1xuICAgICAgICAgICAgICBsaXN0ZW5lci5saW5lRW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb2ludDAgPSBwb2ludDI7XG4gICAgICAgICAgfSBlbHNlIGlmIChub3RIZW1pc3BoZXJlICYmIHBvaW50MCAmJiBzbWFsbFJhZGl1cyBeIHYpIHtcbiAgICAgICAgICAgIHZhciB0O1xuICAgICAgICAgICAgaWYgKCEoYyAmIGMwKSAmJiAodCA9IGludGVyc2VjdChwb2ludDEsIHBvaW50MCwgdHJ1ZSkpKSB7XG4gICAgICAgICAgICAgIGNsZWFuID0gMDtcbiAgICAgICAgICAgICAgaWYgKHNtYWxsUmFkaXVzKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQodFswXVswXSwgdFswXVsxXSk7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQodFsxXVswXSwgdFsxXVsxXSk7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIubGluZUVuZCgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHRbMV1bMF0sIHRbMV1bMV0pO1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVFbmQoKTtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lci5wb2ludCh0WzBdWzBdLCB0WzBdWzFdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodiAmJiAoIXBvaW50MCB8fCAhZDNfZ2VvX3NwaGVyaWNhbEVxdWFsKHBvaW50MCwgcG9pbnQxKSkpIHtcbiAgICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHBvaW50MVswXSwgcG9pbnQxWzFdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcG9pbnQwID0gcG9pbnQxLCB2MCA9IHYsIGMwID0gYztcbiAgICAgICAgfSxcbiAgICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYgKHYwKSBsaXN0ZW5lci5saW5lRW5kKCk7XG4gICAgICAgICAgcG9pbnQwID0gbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgY2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBjbGVhbiB8ICh2MDAgJiYgdjApIDw8IDE7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGludGVyc2VjdChhLCBiLCB0d28pIHtcbiAgICAgIHZhciBwYSA9IGQzX2dlb19jYXJ0ZXNpYW4oYSksIHBiID0gZDNfZ2VvX2NhcnRlc2lhbihiKTtcbiAgICAgIHZhciBuMSA9IFsgMSwgMCwgMCBdLCBuMiA9IGQzX2dlb19jYXJ0ZXNpYW5Dcm9zcyhwYSwgcGIpLCBuMm4yID0gZDNfZ2VvX2NhcnRlc2lhbkRvdChuMiwgbjIpLCBuMW4yID0gbjJbMF0sIGRldGVybWluYW50ID0gbjJuMiAtIG4xbjIgKiBuMW4yO1xuICAgICAgaWYgKCFkZXRlcm1pbmFudCkgcmV0dXJuICF0d28gJiYgYTtcbiAgICAgIHZhciBjMSA9IGNyICogbjJuMiAvIGRldGVybWluYW50LCBjMiA9IC1jciAqIG4xbjIgLyBkZXRlcm1pbmFudCwgbjF4bjIgPSBkM19nZW9fY2FydGVzaWFuQ3Jvc3MobjEsIG4yKSwgQSA9IGQzX2dlb19jYXJ0ZXNpYW5TY2FsZShuMSwgYzEpLCBCID0gZDNfZ2VvX2NhcnRlc2lhblNjYWxlKG4yLCBjMik7XG4gICAgICBkM19nZW9fY2FydGVzaWFuQWRkKEEsIEIpO1xuICAgICAgdmFyIHUgPSBuMXhuMiwgdyA9IGQzX2dlb19jYXJ0ZXNpYW5Eb3QoQSwgdSksIHV1ID0gZDNfZ2VvX2NhcnRlc2lhbkRvdCh1LCB1KSwgdDIgPSB3ICogdyAtIHV1ICogKGQzX2dlb19jYXJ0ZXNpYW5Eb3QoQSwgQSkgLSAxKTtcbiAgICAgIGlmICh0MiA8IDApIHJldHVybjtcbiAgICAgIHZhciB0ID0gTWF0aC5zcXJ0KHQyKSwgcSA9IGQzX2dlb19jYXJ0ZXNpYW5TY2FsZSh1LCAoLXcgLSB0KSAvIHV1KTtcbiAgICAgIGQzX2dlb19jYXJ0ZXNpYW5BZGQocSwgQSk7XG4gICAgICBxID0gZDNfZ2VvX3NwaGVyaWNhbChxKTtcbiAgICAgIGlmICghdHdvKSByZXR1cm4gcTtcbiAgICAgIHZhciDOuzAgPSBhWzBdLCDOuzEgPSBiWzBdLCDPhjAgPSBhWzFdLCDPhjEgPSBiWzFdLCB6O1xuICAgICAgaWYgKM67MSA8IM67MCkgeiA9IM67MCwgzrswID0gzrsxLCDOuzEgPSB6O1xuICAgICAgdmFyIM60zrsgPSDOuzEgLSDOuzAsIHBvbGFyID0gYWJzKM60zrsgLSDPgCkgPCDOtSwgbWVyaWRpYW4gPSBwb2xhciB8fCDOtM67IDwgzrU7XG4gICAgICBpZiAoIXBvbGFyICYmIM+GMSA8IM+GMCkgeiA9IM+GMCwgz4YwID0gz4YxLCDPhjEgPSB6O1xuICAgICAgaWYgKG1lcmlkaWFuID8gcG9sYXIgPyDPhjAgKyDPhjEgPiAwIF4gcVsxXSA8IChhYnMocVswXSAtIM67MCkgPCDOtSA/IM+GMCA6IM+GMSkgOiDPhjAgPD0gcVsxXSAmJiBxWzFdIDw9IM+GMSA6IM60zrsgPiDPgCBeICjOuzAgPD0gcVswXSAmJiBxWzBdIDw9IM67MSkpIHtcbiAgICAgICAgdmFyIHExID0gZDNfZ2VvX2NhcnRlc2lhblNjYWxlKHUsICgtdyArIHQpIC8gdXUpO1xuICAgICAgICBkM19nZW9fY2FydGVzaWFuQWRkKHExLCBBKTtcbiAgICAgICAgcmV0dXJuIFsgcSwgZDNfZ2VvX3NwaGVyaWNhbChxMSkgXTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gY29kZSjOuywgz4YpIHtcbiAgICAgIHZhciByID0gc21hbGxSYWRpdXMgPyByYWRpdXMgOiDPgCAtIHJhZGl1cywgY29kZSA9IDA7XG4gICAgICBpZiAozrsgPCAtcikgY29kZSB8PSAxOyBlbHNlIGlmICjOuyA+IHIpIGNvZGUgfD0gMjtcbiAgICAgIGlmICjPhiA8IC1yKSBjb2RlIHw9IDQ7IGVsc2UgaWYgKM+GID4gcikgY29kZSB8PSA4O1xuICAgICAgcmV0dXJuIGNvZGU7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb21fY2xpcExpbmUoeDAsIHkwLCB4MSwgeTEpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24obGluZSkge1xuICAgICAgdmFyIGEgPSBsaW5lLmEsIGIgPSBsaW5lLmIsIGF4ID0gYS54LCBheSA9IGEueSwgYnggPSBiLngsIGJ5ID0gYi55LCB0MCA9IDAsIHQxID0gMSwgZHggPSBieCAtIGF4LCBkeSA9IGJ5IC0gYXksIHI7XG4gICAgICByID0geDAgLSBheDtcbiAgICAgIGlmICghZHggJiYgciA+IDApIHJldHVybjtcbiAgICAgIHIgLz0gZHg7XG4gICAgICBpZiAoZHggPCAwKSB7XG4gICAgICAgIGlmIChyIDwgdDApIHJldHVybjtcbiAgICAgICAgaWYgKHIgPCB0MSkgdDEgPSByO1xuICAgICAgfSBlbHNlIGlmIChkeCA+IDApIHtcbiAgICAgICAgaWYgKHIgPiB0MSkgcmV0dXJuO1xuICAgICAgICBpZiAociA+IHQwKSB0MCA9IHI7XG4gICAgICB9XG4gICAgICByID0geDEgLSBheDtcbiAgICAgIGlmICghZHggJiYgciA8IDApIHJldHVybjtcbiAgICAgIHIgLz0gZHg7XG4gICAgICBpZiAoZHggPCAwKSB7XG4gICAgICAgIGlmIChyID4gdDEpIHJldHVybjtcbiAgICAgICAgaWYgKHIgPiB0MCkgdDAgPSByO1xuICAgICAgfSBlbHNlIGlmIChkeCA+IDApIHtcbiAgICAgICAgaWYgKHIgPCB0MCkgcmV0dXJuO1xuICAgICAgICBpZiAociA8IHQxKSB0MSA9IHI7XG4gICAgICB9XG4gICAgICByID0geTAgLSBheTtcbiAgICAgIGlmICghZHkgJiYgciA+IDApIHJldHVybjtcbiAgICAgIHIgLz0gZHk7XG4gICAgICBpZiAoZHkgPCAwKSB7XG4gICAgICAgIGlmIChyIDwgdDApIHJldHVybjtcbiAgICAgICAgaWYgKHIgPCB0MSkgdDEgPSByO1xuICAgICAgfSBlbHNlIGlmIChkeSA+IDApIHtcbiAgICAgICAgaWYgKHIgPiB0MSkgcmV0dXJuO1xuICAgICAgICBpZiAociA+IHQwKSB0MCA9IHI7XG4gICAgICB9XG4gICAgICByID0geTEgLSBheTtcbiAgICAgIGlmICghZHkgJiYgciA8IDApIHJldHVybjtcbiAgICAgIHIgLz0gZHk7XG4gICAgICBpZiAoZHkgPCAwKSB7XG4gICAgICAgIGlmIChyID4gdDEpIHJldHVybjtcbiAgICAgICAgaWYgKHIgPiB0MCkgdDAgPSByO1xuICAgICAgfSBlbHNlIGlmIChkeSA+IDApIHtcbiAgICAgICAgaWYgKHIgPCB0MCkgcmV0dXJuO1xuICAgICAgICBpZiAociA8IHQxKSB0MSA9IHI7XG4gICAgICB9XG4gICAgICBpZiAodDAgPiAwKSBsaW5lLmEgPSB7XG4gICAgICAgIHg6IGF4ICsgdDAgKiBkeCxcbiAgICAgICAgeTogYXkgKyB0MCAqIGR5XG4gICAgICB9O1xuICAgICAgaWYgKHQxIDwgMSkgbGluZS5iID0ge1xuICAgICAgICB4OiBheCArIHQxICogZHgsXG4gICAgICAgIHk6IGF5ICsgdDEgKiBkeVxuICAgICAgfTtcbiAgICAgIHJldHVybiBsaW5lO1xuICAgIH07XG4gIH1cbiAgdmFyIGQzX2dlb19jbGlwRXh0ZW50TUFYID0gMWU5O1xuICBkMy5nZW8uY2xpcEV4dGVudCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB4MCwgeTAsIHgxLCB5MSwgc3RyZWFtLCBjbGlwLCBjbGlwRXh0ZW50ID0ge1xuICAgICAgc3RyZWFtOiBmdW5jdGlvbihvdXRwdXQpIHtcbiAgICAgICAgaWYgKHN0cmVhbSkgc3RyZWFtLnZhbGlkID0gZmFsc2U7XG4gICAgICAgIHN0cmVhbSA9IGNsaXAob3V0cHV0KTtcbiAgICAgICAgc3RyZWFtLnZhbGlkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHN0cmVhbTtcbiAgICAgIH0sXG4gICAgICBleHRlbnQ6IGZ1bmN0aW9uKF8pIHtcbiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gWyBbIHgwLCB5MCBdLCBbIHgxLCB5MSBdIF07XG4gICAgICAgIGNsaXAgPSBkM19nZW9fY2xpcEV4dGVudCh4MCA9ICtfWzBdWzBdLCB5MCA9ICtfWzBdWzFdLCB4MSA9ICtfWzFdWzBdLCB5MSA9ICtfWzFdWzFdKTtcbiAgICAgICAgaWYgKHN0cmVhbSkgc3RyZWFtLnZhbGlkID0gZmFsc2UsIHN0cmVhbSA9IG51bGw7XG4gICAgICAgIHJldHVybiBjbGlwRXh0ZW50O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGNsaXBFeHRlbnQuZXh0ZW50KFsgWyAwLCAwIF0sIFsgOTYwLCA1MDAgXSBdKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfZ2VvX2NsaXBFeHRlbnQoeDAsIHkwLCB4MSwgeTEpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24obGlzdGVuZXIpIHtcbiAgICAgIHZhciBsaXN0ZW5lcl8gPSBsaXN0ZW5lciwgYnVmZmVyTGlzdGVuZXIgPSBkM19nZW9fY2xpcEJ1ZmZlckxpc3RlbmVyKCksIGNsaXBMaW5lID0gZDNfZ2VvbV9jbGlwTGluZSh4MCwgeTAsIHgxLCB5MSksIHNlZ21lbnRzLCBwb2x5Z29uLCByaW5nO1xuICAgICAgdmFyIGNsaXAgPSB7XG4gICAgICAgIHBvaW50OiBwb2ludCxcbiAgICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsXG4gICAgICAgIGxpbmVFbmQ6IGxpbmVFbmQsXG4gICAgICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgbGlzdGVuZXIgPSBidWZmZXJMaXN0ZW5lcjtcbiAgICAgICAgICBzZWdtZW50cyA9IFtdO1xuICAgICAgICAgIHBvbHlnb24gPSBbXTtcbiAgICAgICAgICBjbGVhbiA9IHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGxpc3RlbmVyID0gbGlzdGVuZXJfO1xuICAgICAgICAgIHNlZ21lbnRzID0gZDMubWVyZ2Uoc2VnbWVudHMpO1xuICAgICAgICAgIHZhciBjbGlwU3RhcnRJbnNpZGUgPSBpbnNpZGVQb2x5Z29uKFsgeDAsIHkxIF0pLCBpbnNpZGUgPSBjbGVhbiAmJiBjbGlwU3RhcnRJbnNpZGUsIHZpc2libGUgPSBzZWdtZW50cy5sZW5ndGg7XG4gICAgICAgICAgaWYgKGluc2lkZSB8fCB2aXNpYmxlKSB7XG4gICAgICAgICAgICBsaXN0ZW5lci5wb2x5Z29uU3RhcnQoKTtcbiAgICAgICAgICAgIGlmIChpbnNpZGUpIHtcbiAgICAgICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7XG4gICAgICAgICAgICAgIGludGVycG9sYXRlKG51bGwsIG51bGwsIDEsIGxpc3RlbmVyKTtcbiAgICAgICAgICAgICAgbGlzdGVuZXIubGluZUVuZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZpc2libGUpIHtcbiAgICAgICAgICAgICAgZDNfZ2VvX2NsaXBQb2x5Z29uKHNlZ21lbnRzLCBjb21wYXJlLCBjbGlwU3RhcnRJbnNpZGUsIGludGVycG9sYXRlLCBsaXN0ZW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsaXN0ZW5lci5wb2x5Z29uRW5kKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlZ21lbnRzID0gcG9seWdvbiA9IHJpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gaW5zaWRlUG9seWdvbihwKSB7XG4gICAgICAgIHZhciB3biA9IDAsIG4gPSBwb2x5Z29uLmxlbmd0aCwgeSA9IHBbMV07XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDEsIHYgPSBwb2x5Z29uW2ldLCBtID0gdi5sZW5ndGgsIGEgPSB2WzBdLCBiOyBqIDwgbTsgKytqKSB7XG4gICAgICAgICAgICBiID0gdltqXTtcbiAgICAgICAgICAgIGlmIChhWzFdIDw9IHkpIHtcbiAgICAgICAgICAgICAgaWYgKGJbMV0gPiB5ICYmIGQzX2Nyb3NzMmQoYSwgYiwgcCkgPiAwKSArK3duO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKGJbMV0gPD0geSAmJiBkM19jcm9zczJkKGEsIGIsIHApIDwgMCkgLS13bjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGEgPSBiO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd24gIT09IDA7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZShmcm9tLCB0bywgZGlyZWN0aW9uLCBsaXN0ZW5lcikge1xuICAgICAgICB2YXIgYSA9IDAsIGExID0gMDtcbiAgICAgICAgaWYgKGZyb20gPT0gbnVsbCB8fCAoYSA9IGNvcm5lcihmcm9tLCBkaXJlY3Rpb24pKSAhPT0gKGExID0gY29ybmVyKHRvLCBkaXJlY3Rpb24pKSB8fCBjb21wYXJlUG9pbnRzKGZyb20sIHRvKSA8IDAgXiBkaXJlY3Rpb24gPiAwKSB7XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQoYSA9PT0gMCB8fCBhID09PSAzID8geDAgOiB4MSwgYSA+IDEgPyB5MSA6IHkwKTtcbiAgICAgICAgICB9IHdoaWxlICgoYSA9IChhICsgZGlyZWN0aW9uICsgNCkgJSA0KSAhPT0gYTEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxpc3RlbmVyLnBvaW50KHRvWzBdLCB0b1sxXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHBvaW50VmlzaWJsZSh4LCB5KSB7XG4gICAgICAgIHJldHVybiB4MCA8PSB4ICYmIHggPD0geDEgJiYgeTAgPD0geSAmJiB5IDw9IHkxO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcG9pbnQoeCwgeSkge1xuICAgICAgICBpZiAocG9pbnRWaXNpYmxlKHgsIHkpKSBsaXN0ZW5lci5wb2ludCh4LCB5KTtcbiAgICAgIH1cbiAgICAgIHZhciB4X18sIHlfXywgdl9fLCB4XywgeV8sIHZfLCBmaXJzdCwgY2xlYW47XG4gICAgICBmdW5jdGlvbiBsaW5lU3RhcnQoKSB7XG4gICAgICAgIGNsaXAucG9pbnQgPSBsaW5lUG9pbnQ7XG4gICAgICAgIGlmIChwb2x5Z29uKSBwb2x5Z29uLnB1c2gocmluZyA9IFtdKTtcbiAgICAgICAgZmlyc3QgPSB0cnVlO1xuICAgICAgICB2XyA9IGZhbHNlO1xuICAgICAgICB4XyA9IHlfID0gTmFOO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gbGluZUVuZCgpIHtcbiAgICAgICAgaWYgKHNlZ21lbnRzKSB7XG4gICAgICAgICAgbGluZVBvaW50KHhfXywgeV9fKTtcbiAgICAgICAgICBpZiAodl9fICYmIHZfKSBidWZmZXJMaXN0ZW5lci5yZWpvaW4oKTtcbiAgICAgICAgICBzZWdtZW50cy5wdXNoKGJ1ZmZlckxpc3RlbmVyLmJ1ZmZlcigpKTtcbiAgICAgICAgfVxuICAgICAgICBjbGlwLnBvaW50ID0gcG9pbnQ7XG4gICAgICAgIGlmICh2XykgbGlzdGVuZXIubGluZUVuZCgpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gbGluZVBvaW50KHgsIHkpIHtcbiAgICAgICAgeCA9IE1hdGgubWF4KC1kM19nZW9fY2xpcEV4dGVudE1BWCwgTWF0aC5taW4oZDNfZ2VvX2NsaXBFeHRlbnRNQVgsIHgpKTtcbiAgICAgICAgeSA9IE1hdGgubWF4KC1kM19nZW9fY2xpcEV4dGVudE1BWCwgTWF0aC5taW4oZDNfZ2VvX2NsaXBFeHRlbnRNQVgsIHkpKTtcbiAgICAgICAgdmFyIHYgPSBwb2ludFZpc2libGUoeCwgeSk7XG4gICAgICAgIGlmIChwb2x5Z29uKSByaW5nLnB1c2goWyB4LCB5IF0pO1xuICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICB4X18gPSB4LCB5X18gPSB5LCB2X18gPSB2O1xuICAgICAgICAgIGZpcnN0ID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHYpIHtcbiAgICAgICAgICAgIGxpc3RlbmVyLmxpbmVTdGFydCgpO1xuICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQoeCwgeSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh2ICYmIHZfKSBsaXN0ZW5lci5wb2ludCh4LCB5KTsgZWxzZSB7XG4gICAgICAgICAgICB2YXIgbCA9IHtcbiAgICAgICAgICAgICAgYToge1xuICAgICAgICAgICAgICAgIHg6IHhfLFxuICAgICAgICAgICAgICAgIHk6IHlfXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGI6IHtcbiAgICAgICAgICAgICAgICB4OiB4LFxuICAgICAgICAgICAgICAgIHk6IHlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChjbGlwTGluZShsKSkge1xuICAgICAgICAgICAgICBpZiAoIXZfKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIubGluZVN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQobC5hLngsIGwuYS55KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsaXN0ZW5lci5wb2ludChsLmIueCwgbC5iLnkpO1xuICAgICAgICAgICAgICBpZiAoIXYpIGxpc3RlbmVyLmxpbmVFbmQoKTtcbiAgICAgICAgICAgICAgY2xlYW4gPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodikge1xuICAgICAgICAgICAgICBsaXN0ZW5lci5saW5lU3RhcnQoKTtcbiAgICAgICAgICAgICAgbGlzdGVuZXIucG9pbnQoeCwgeSk7XG4gICAgICAgICAgICAgIGNsZWFuID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHhfID0geCwgeV8gPSB5LCB2XyA9IHY7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xpcDtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGNvcm5lcihwLCBkaXJlY3Rpb24pIHtcbiAgICAgIHJldHVybiBhYnMocFswXSAtIHgwKSA8IM61ID8gZGlyZWN0aW9uID4gMCA/IDAgOiAzIDogYWJzKHBbMF0gLSB4MSkgPCDOtSA/IGRpcmVjdGlvbiA+IDAgPyAyIDogMSA6IGFicyhwWzFdIC0geTApIDwgzrUgPyBkaXJlY3Rpb24gPiAwID8gMSA6IDAgOiBkaXJlY3Rpb24gPiAwID8gMyA6IDI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXBhcmUoYSwgYikge1xuICAgICAgcmV0dXJuIGNvbXBhcmVQb2ludHMoYS54LCBiLngpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjb21wYXJlUG9pbnRzKGEsIGIpIHtcbiAgICAgIHZhciBjYSA9IGNvcm5lcihhLCAxKSwgY2IgPSBjb3JuZXIoYiwgMSk7XG4gICAgICByZXR1cm4gY2EgIT09IGNiID8gY2EgLSBjYiA6IGNhID09PSAwID8gYlsxXSAtIGFbMV0gOiBjYSA9PT0gMSA/IGFbMF0gLSBiWzBdIDogY2EgPT09IDIgPyBhWzFdIC0gYlsxXSA6IGJbMF0gLSBhWzBdO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fY29uaWMocHJvamVjdEF0KSB7XG4gICAgdmFyIM+GMCA9IDAsIM+GMSA9IM+AIC8gMywgbSA9IGQzX2dlb19wcm9qZWN0aW9uTXV0YXRvcihwcm9qZWN0QXQpLCBwID0gbSjPhjAsIM+GMSk7XG4gICAgcC5wYXJhbGxlbHMgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbIM+GMCAvIM+AICogMTgwLCDPhjEgLyDPgCAqIDE4MCBdO1xuICAgICAgcmV0dXJuIG0oz4YwID0gX1swXSAqIM+AIC8gMTgwLCDPhjEgPSBfWzFdICogz4AgLyAxODApO1xuICAgIH07XG4gICAgcmV0dXJuIHA7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2NvbmljRXF1YWxBcmVhKM+GMCwgz4YxKSB7XG4gICAgdmFyIHNpbs+GMCA9IE1hdGguc2luKM+GMCksIG4gPSAoc2luz4YwICsgTWF0aC5zaW4oz4YxKSkgLyAyLCBDID0gMSArIHNpbs+GMCAqICgyICogbiAtIHNpbs+GMCksIM+BMCA9IE1hdGguc3FydChDKSAvIG47XG4gICAgZnVuY3Rpb24gZm9yd2FyZCjOuywgz4YpIHtcbiAgICAgIHZhciDPgSA9IE1hdGguc3FydChDIC0gMiAqIG4gKiBNYXRoLnNpbijPhikpIC8gbjtcbiAgICAgIHJldHVybiBbIM+BICogTWF0aC5zaW4ozrsgKj0gbiksIM+BMCAtIM+BICogTWF0aC5jb3MozrspIF07XG4gICAgfVxuICAgIGZvcndhcmQuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkge1xuICAgICAgdmFyIM+BMF95ID0gz4EwIC0geTtcbiAgICAgIHJldHVybiBbIE1hdGguYXRhbjIoeCwgz4EwX3kpIC8gbiwgZDNfYXNpbigoQyAtICh4ICogeCArIM+BMF95ICogz4EwX3kpICogbiAqIG4pIC8gKDIgKiBuKSkgXTtcbiAgICB9O1xuICAgIHJldHVybiBmb3J3YXJkO1xuICB9XG4gIChkMy5nZW8uY29uaWNFcXVhbEFyZWEgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDNfZ2VvX2NvbmljKGQzX2dlb19jb25pY0VxdWFsQXJlYSk7XG4gIH0pLnJhdyA9IGQzX2dlb19jb25pY0VxdWFsQXJlYTtcbiAgZDMuZ2VvLmFsYmVycyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkMy5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWyA5NiwgMCBdKS5jZW50ZXIoWyAtLjYsIDM4LjcgXSkucGFyYWxsZWxzKFsgMjkuNSwgNDUuNSBdKS5zY2FsZSgxMDcwKTtcbiAgfTtcbiAgZDMuZ2VvLmFsYmVyc1VzYSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBsb3dlcjQ4ID0gZDMuZ2VvLmFsYmVycygpO1xuICAgIHZhciBhbGFza2EgPSBkMy5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWyAxNTQsIDAgXSkuY2VudGVyKFsgLTIsIDU4LjUgXSkucGFyYWxsZWxzKFsgNTUsIDY1IF0pO1xuICAgIHZhciBoYXdhaWkgPSBkMy5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWyAxNTcsIDAgXSkuY2VudGVyKFsgLTMsIDE5LjkgXSkucGFyYWxsZWxzKFsgOCwgMTggXSk7XG4gICAgdmFyIHBvaW50LCBwb2ludFN0cmVhbSA9IHtcbiAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgICAgIHBvaW50ID0gWyB4LCB5IF07XG4gICAgICB9XG4gICAgfSwgbG93ZXI0OFBvaW50LCBhbGFza2FQb2ludCwgaGF3YWlpUG9pbnQ7XG4gICAgZnVuY3Rpb24gYWxiZXJzVXNhKGNvb3JkaW5hdGVzKSB7XG4gICAgICB2YXIgeCA9IGNvb3JkaW5hdGVzWzBdLCB5ID0gY29vcmRpbmF0ZXNbMV07XG4gICAgICBwb2ludCA9IG51bGw7XG4gICAgICAobG93ZXI0OFBvaW50KHgsIHkpLCBwb2ludCkgfHwgKGFsYXNrYVBvaW50KHgsIHkpLCBwb2ludCkgfHwgaGF3YWlpUG9pbnQoeCwgeSk7XG4gICAgICByZXR1cm4gcG9pbnQ7XG4gICAgfVxuICAgIGFsYmVyc1VzYS5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykge1xuICAgICAgdmFyIGsgPSBsb3dlcjQ4LnNjYWxlKCksIHQgPSBsb3dlcjQ4LnRyYW5zbGF0ZSgpLCB4ID0gKGNvb3JkaW5hdGVzWzBdIC0gdFswXSkgLyBrLCB5ID0gKGNvb3JkaW5hdGVzWzFdIC0gdFsxXSkgLyBrO1xuICAgICAgcmV0dXJuICh5ID49IC4xMiAmJiB5IDwgLjIzNCAmJiB4ID49IC0uNDI1ICYmIHggPCAtLjIxNCA/IGFsYXNrYSA6IHkgPj0gLjE2NiAmJiB5IDwgLjIzNCAmJiB4ID49IC0uMjE0ICYmIHggPCAtLjExNSA/IGhhd2FpaSA6IGxvd2VyNDgpLmludmVydChjb29yZGluYXRlcyk7XG4gICAgfTtcbiAgICBhbGJlcnNVc2Euc3RyZWFtID0gZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICB2YXIgbG93ZXI0OFN0cmVhbSA9IGxvd2VyNDguc3RyZWFtKHN0cmVhbSksIGFsYXNrYVN0cmVhbSA9IGFsYXNrYS5zdHJlYW0oc3RyZWFtKSwgaGF3YWlpU3RyZWFtID0gaGF3YWlpLnN0cmVhbShzdHJlYW0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgICAgICBsb3dlcjQ4U3RyZWFtLnBvaW50KHgsIHkpO1xuICAgICAgICAgIGFsYXNrYVN0cmVhbS5wb2ludCh4LCB5KTtcbiAgICAgICAgICBoYXdhaWlTdHJlYW0ucG9pbnQoeCwgeSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgbG93ZXI0OFN0cmVhbS5zcGhlcmUoKTtcbiAgICAgICAgICBhbGFza2FTdHJlYW0uc3BoZXJlKCk7XG4gICAgICAgICAgaGF3YWlpU3RyZWFtLnNwaGVyZSgpO1xuICAgICAgICB9LFxuICAgICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGxvd2VyNDhTdHJlYW0ubGluZVN0YXJ0KCk7XG4gICAgICAgICAgYWxhc2thU3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgICAgIGhhd2FpaVN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgbG93ZXI0OFN0cmVhbS5saW5lRW5kKCk7XG4gICAgICAgICAgYWxhc2thU3RyZWFtLmxpbmVFbmQoKTtcbiAgICAgICAgICBoYXdhaWlTdHJlYW0ubGluZUVuZCgpO1xuICAgICAgICB9LFxuICAgICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGxvd2VyNDhTdHJlYW0ucG9seWdvblN0YXJ0KCk7XG4gICAgICAgICAgYWxhc2thU3RyZWFtLnBvbHlnb25TdGFydCgpO1xuICAgICAgICAgIGhhd2FpaVN0cmVhbS5wb2x5Z29uU3RhcnQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgbG93ZXI0OFN0cmVhbS5wb2x5Z29uRW5kKCk7XG4gICAgICAgICAgYWxhc2thU3RyZWFtLnBvbHlnb25FbmQoKTtcbiAgICAgICAgICBoYXdhaWlTdHJlYW0ucG9seWdvbkVuZCgpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgYWxiZXJzVXNhLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxvd2VyNDgucHJlY2lzaW9uKCk7XG4gICAgICBsb3dlcjQ4LnByZWNpc2lvbihfKTtcbiAgICAgIGFsYXNrYS5wcmVjaXNpb24oXyk7XG4gICAgICBoYXdhaWkucHJlY2lzaW9uKF8pO1xuICAgICAgcmV0dXJuIGFsYmVyc1VzYTtcbiAgICB9O1xuICAgIGFsYmVyc1VzYS5zY2FsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxvd2VyNDguc2NhbGUoKTtcbiAgICAgIGxvd2VyNDguc2NhbGUoXyk7XG4gICAgICBhbGFza2Euc2NhbGUoXyAqIC4zNSk7XG4gICAgICBoYXdhaWkuc2NhbGUoXyk7XG4gICAgICByZXR1cm4gYWxiZXJzVXNhLnRyYW5zbGF0ZShsb3dlcjQ4LnRyYW5zbGF0ZSgpKTtcbiAgICB9O1xuICAgIGFsYmVyc1VzYS50cmFuc2xhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsb3dlcjQ4LnRyYW5zbGF0ZSgpO1xuICAgICAgdmFyIGsgPSBsb3dlcjQ4LnNjYWxlKCksIHggPSArX1swXSwgeSA9ICtfWzFdO1xuICAgICAgbG93ZXI0OFBvaW50ID0gbG93ZXI0OC50cmFuc2xhdGUoXykuY2xpcEV4dGVudChbIFsgeCAtIC40NTUgKiBrLCB5IC0gLjIzOCAqIGsgXSwgWyB4ICsgLjQ1NSAqIGssIHkgKyAuMjM4ICogayBdIF0pLnN0cmVhbShwb2ludFN0cmVhbSkucG9pbnQ7XG4gICAgICBhbGFza2FQb2ludCA9IGFsYXNrYS50cmFuc2xhdGUoWyB4IC0gLjMwNyAqIGssIHkgKyAuMjAxICogayBdKS5jbGlwRXh0ZW50KFsgWyB4IC0gLjQyNSAqIGsgKyDOtSwgeSArIC4xMiAqIGsgKyDOtSBdLCBbIHggLSAuMjE0ICogayAtIM61LCB5ICsgLjIzNCAqIGsgLSDOtSBdIF0pLnN0cmVhbShwb2ludFN0cmVhbSkucG9pbnQ7XG4gICAgICBoYXdhaWlQb2ludCA9IGhhd2FpaS50cmFuc2xhdGUoWyB4IC0gLjIwNSAqIGssIHkgKyAuMjEyICogayBdKS5jbGlwRXh0ZW50KFsgWyB4IC0gLjIxNCAqIGsgKyDOtSwgeSArIC4xNjYgKiBrICsgzrUgXSwgWyB4IC0gLjExNSAqIGsgLSDOtSwgeSArIC4yMzQgKiBrIC0gzrUgXSBdKS5zdHJlYW0ocG9pbnRTdHJlYW0pLnBvaW50O1xuICAgICAgcmV0dXJuIGFsYmVyc1VzYTtcbiAgICB9O1xuICAgIHJldHVybiBhbGJlcnNVc2Euc2NhbGUoMTA3MCk7XG4gIH07XG4gIHZhciBkM19nZW9fcGF0aEFyZWFTdW0sIGQzX2dlb19wYXRoQXJlYVBvbHlnb24sIGQzX2dlb19wYXRoQXJlYSA9IHtcbiAgICBwb2ludDogZDNfbm9vcCxcbiAgICBsaW5lU3RhcnQ6IGQzX25vb3AsXG4gICAgbGluZUVuZDogZDNfbm9vcCxcbiAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgZDNfZ2VvX3BhdGhBcmVhUG9seWdvbiA9IDA7XG4gICAgICBkM19nZW9fcGF0aEFyZWEubGluZVN0YXJ0ID0gZDNfZ2VvX3BhdGhBcmVhUmluZ1N0YXJ0O1xuICAgIH0sXG4gICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7XG4gICAgICBkM19nZW9fcGF0aEFyZWEubGluZVN0YXJ0ID0gZDNfZ2VvX3BhdGhBcmVhLmxpbmVFbmQgPSBkM19nZW9fcGF0aEFyZWEucG9pbnQgPSBkM19ub29wO1xuICAgICAgZDNfZ2VvX3BhdGhBcmVhU3VtICs9IGFicyhkM19nZW9fcGF0aEFyZWFQb2x5Z29uIC8gMik7XG4gICAgfVxuICB9O1xuICBmdW5jdGlvbiBkM19nZW9fcGF0aEFyZWFSaW5nU3RhcnQoKSB7XG4gICAgdmFyIHgwMCwgeTAwLCB4MCwgeTA7XG4gICAgZDNfZ2VvX3BhdGhBcmVhLnBvaW50ID0gZnVuY3Rpb24oeCwgeSkge1xuICAgICAgZDNfZ2VvX3BhdGhBcmVhLnBvaW50ID0gbmV4dFBvaW50O1xuICAgICAgeDAwID0geDAgPSB4LCB5MDAgPSB5MCA9IHk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBuZXh0UG9pbnQoeCwgeSkge1xuICAgICAgZDNfZ2VvX3BhdGhBcmVhUG9seWdvbiArPSB5MCAqIHggLSB4MCAqIHk7XG4gICAgICB4MCA9IHgsIHkwID0geTtcbiAgICB9XG4gICAgZDNfZ2VvX3BhdGhBcmVhLmxpbmVFbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIG5leHRQb2ludCh4MDAsIHkwMCk7XG4gICAgfTtcbiAgfVxuICB2YXIgZDNfZ2VvX3BhdGhCb3VuZHNYMCwgZDNfZ2VvX3BhdGhCb3VuZHNZMCwgZDNfZ2VvX3BhdGhCb3VuZHNYMSwgZDNfZ2VvX3BhdGhCb3VuZHNZMTtcbiAgdmFyIGQzX2dlb19wYXRoQm91bmRzID0ge1xuICAgIHBvaW50OiBkM19nZW9fcGF0aEJvdW5kc1BvaW50LFxuICAgIGxpbmVTdGFydDogZDNfbm9vcCxcbiAgICBsaW5lRW5kOiBkM19ub29wLFxuICAgIHBvbHlnb25TdGFydDogZDNfbm9vcCxcbiAgICBwb2x5Z29uRW5kOiBkM19ub29wXG4gIH07XG4gIGZ1bmN0aW9uIGQzX2dlb19wYXRoQm91bmRzUG9pbnQoeCwgeSkge1xuICAgIGlmICh4IDwgZDNfZ2VvX3BhdGhCb3VuZHNYMCkgZDNfZ2VvX3BhdGhCb3VuZHNYMCA9IHg7XG4gICAgaWYgKHggPiBkM19nZW9fcGF0aEJvdW5kc1gxKSBkM19nZW9fcGF0aEJvdW5kc1gxID0geDtcbiAgICBpZiAoeSA8IGQzX2dlb19wYXRoQm91bmRzWTApIGQzX2dlb19wYXRoQm91bmRzWTAgPSB5O1xuICAgIGlmICh5ID4gZDNfZ2VvX3BhdGhCb3VuZHNZMSkgZDNfZ2VvX3BhdGhCb3VuZHNZMSA9IHk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX3BhdGhCdWZmZXIoKSB7XG4gICAgdmFyIHBvaW50Q2lyY2xlID0gZDNfZ2VvX3BhdGhCdWZmZXJDaXJjbGUoNC41KSwgYnVmZmVyID0gW107XG4gICAgdmFyIHN0cmVhbSA9IHtcbiAgICAgIHBvaW50OiBwb2ludCxcbiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHN0cmVhbS5wb2ludCA9IHBvaW50TGluZVN0YXJ0O1xuICAgICAgfSxcbiAgICAgIGxpbmVFbmQ6IGxpbmVFbmQsXG4gICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBzdHJlYW0ubGluZUVuZCA9IGxpbmVFbmRQb2x5Z29uO1xuICAgICAgfSxcbiAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBzdHJlYW0ubGluZUVuZCA9IGxpbmVFbmQ7XG4gICAgICAgIHN0cmVhbS5wb2ludCA9IHBvaW50O1xuICAgICAgfSxcbiAgICAgIHBvaW50UmFkaXVzOiBmdW5jdGlvbihfKSB7XG4gICAgICAgIHBvaW50Q2lyY2xlID0gZDNfZ2VvX3BhdGhCdWZmZXJDaXJjbGUoXyk7XG4gICAgICAgIHJldHVybiBzdHJlYW07XG4gICAgICB9LFxuICAgICAgcmVzdWx0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgICB2YXIgcmVzdWx0ID0gYnVmZmVyLmpvaW4oXCJcIik7XG4gICAgICAgICAgYnVmZmVyID0gW107XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgZnVuY3Rpb24gcG9pbnQoeCwgeSkge1xuICAgICAgYnVmZmVyLnB1c2goXCJNXCIsIHgsIFwiLFwiLCB5LCBwb2ludENpcmNsZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBvaW50TGluZVN0YXJ0KHgsIHkpIHtcbiAgICAgIGJ1ZmZlci5wdXNoKFwiTVwiLCB4LCBcIixcIiwgeSk7XG4gICAgICBzdHJlYW0ucG9pbnQgPSBwb2ludExpbmU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBvaW50TGluZSh4LCB5KSB7XG4gICAgICBidWZmZXIucHVzaChcIkxcIiwgeCwgXCIsXCIsIHkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBsaW5lRW5kKCkge1xuICAgICAgc3RyZWFtLnBvaW50ID0gcG9pbnQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxpbmVFbmRQb2x5Z29uKCkge1xuICAgICAgYnVmZmVyLnB1c2goXCJaXCIpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyZWFtO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19wYXRoQnVmZmVyQ2lyY2xlKHJhZGl1cykge1xuICAgIHJldHVybiBcIm0wLFwiICsgcmFkaXVzICsgXCJhXCIgKyByYWRpdXMgKyBcIixcIiArIHJhZGl1cyArIFwiIDAgMSwxIDAsXCIgKyAtMiAqIHJhZGl1cyArIFwiYVwiICsgcmFkaXVzICsgXCIsXCIgKyByYWRpdXMgKyBcIiAwIDEsMSAwLFwiICsgMiAqIHJhZGl1cyArIFwielwiO1xuICB9XG4gIHZhciBkM19nZW9fcGF0aENlbnRyb2lkID0ge1xuICAgIHBvaW50OiBkM19nZW9fcGF0aENlbnRyb2lkUG9pbnQsXG4gICAgbGluZVN0YXJ0OiBkM19nZW9fcGF0aENlbnRyb2lkTGluZVN0YXJ0LFxuICAgIGxpbmVFbmQ6IGQzX2dlb19wYXRoQ2VudHJvaWRMaW5lRW5kLFxuICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICBkM19nZW9fcGF0aENlbnRyb2lkLmxpbmVTdGFydCA9IGQzX2dlb19wYXRoQ2VudHJvaWRSaW5nU3RhcnQ7XG4gICAgfSxcbiAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHtcbiAgICAgIGQzX2dlb19wYXRoQ2VudHJvaWQucG9pbnQgPSBkM19nZW9fcGF0aENlbnRyb2lkUG9pbnQ7XG4gICAgICBkM19nZW9fcGF0aENlbnRyb2lkLmxpbmVTdGFydCA9IGQzX2dlb19wYXRoQ2VudHJvaWRMaW5lU3RhcnQ7XG4gICAgICBkM19nZW9fcGF0aENlbnRyb2lkLmxpbmVFbmQgPSBkM19nZW9fcGF0aENlbnRyb2lkTGluZUVuZDtcbiAgICB9XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2dlb19wYXRoQ2VudHJvaWRQb2ludCh4LCB5KSB7XG4gICAgZDNfZ2VvX2NlbnRyb2lkWDAgKz0geDtcbiAgICBkM19nZW9fY2VudHJvaWRZMCArPSB5O1xuICAgICsrZDNfZ2VvX2NlbnRyb2lkWjA7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX3BhdGhDZW50cm9pZExpbmVTdGFydCgpIHtcbiAgICB2YXIgeDAsIHkwO1xuICAgIGQzX2dlb19wYXRoQ2VudHJvaWQucG9pbnQgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgICBkM19nZW9fcGF0aENlbnRyb2lkLnBvaW50ID0gbmV4dFBvaW50O1xuICAgICAgZDNfZ2VvX3BhdGhDZW50cm9pZFBvaW50KHgwID0geCwgeTAgPSB5KTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIG5leHRQb2ludCh4LCB5KSB7XG4gICAgICB2YXIgZHggPSB4IC0geDAsIGR5ID0geSAtIHkwLCB6ID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcbiAgICAgIGQzX2dlb19jZW50cm9pZFgxICs9IHogKiAoeDAgKyB4KSAvIDI7XG4gICAgICBkM19nZW9fY2VudHJvaWRZMSArPSB6ICogKHkwICsgeSkgLyAyO1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkWjEgKz0gejtcbiAgICAgIGQzX2dlb19wYXRoQ2VudHJvaWRQb2ludCh4MCA9IHgsIHkwID0geSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19wYXRoQ2VudHJvaWRMaW5lRW5kKCkge1xuICAgIGQzX2dlb19wYXRoQ2VudHJvaWQucG9pbnQgPSBkM19nZW9fcGF0aENlbnRyb2lkUG9pbnQ7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX3BhdGhDZW50cm9pZFJpbmdTdGFydCgpIHtcbiAgICB2YXIgeDAwLCB5MDAsIHgwLCB5MDtcbiAgICBkM19nZW9fcGF0aENlbnRyb2lkLnBvaW50ID0gZnVuY3Rpb24oeCwgeSkge1xuICAgICAgZDNfZ2VvX3BhdGhDZW50cm9pZC5wb2ludCA9IG5leHRQb2ludDtcbiAgICAgIGQzX2dlb19wYXRoQ2VudHJvaWRQb2ludCh4MDAgPSB4MCA9IHgsIHkwMCA9IHkwID0geSk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBuZXh0UG9pbnQoeCwgeSkge1xuICAgICAgdmFyIGR4ID0geCAtIHgwLCBkeSA9IHkgLSB5MCwgeiA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgICBkM19nZW9fY2VudHJvaWRYMSArPSB6ICogKHgwICsgeCkgLyAyO1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkWTEgKz0geiAqICh5MCArIHkpIC8gMjtcbiAgICAgIGQzX2dlb19jZW50cm9pZFoxICs9IHo7XG4gICAgICB6ID0geTAgKiB4IC0geDAgKiB5O1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkWDIgKz0geiAqICh4MCArIHgpO1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkWTIgKz0geiAqICh5MCArIHkpO1xuICAgICAgZDNfZ2VvX2NlbnRyb2lkWjIgKz0geiAqIDM7XG4gICAgICBkM19nZW9fcGF0aENlbnRyb2lkUG9pbnQoeDAgPSB4LCB5MCA9IHkpO1xuICAgIH1cbiAgICBkM19nZW9fcGF0aENlbnRyb2lkLmxpbmVFbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIG5leHRQb2ludCh4MDAsIHkwMCk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fcGF0aENvbnRleHQoY29udGV4dCkge1xuICAgIHZhciBwb2ludFJhZGl1cyA9IDQuNTtcbiAgICB2YXIgc3RyZWFtID0ge1xuICAgICAgcG9pbnQ6IHBvaW50LFxuICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgc3RyZWFtLnBvaW50ID0gcG9pbnRMaW5lU3RhcnQ7XG4gICAgICB9LFxuICAgICAgbGluZUVuZDogbGluZUVuZCxcbiAgICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHN0cmVhbS5saW5lRW5kID0gbGluZUVuZFBvbHlnb247XG4gICAgICB9LFxuICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHN0cmVhbS5saW5lRW5kID0gbGluZUVuZDtcbiAgICAgICAgc3RyZWFtLnBvaW50ID0gcG9pbnQ7XG4gICAgICB9LFxuICAgICAgcG9pbnRSYWRpdXM6IGZ1bmN0aW9uKF8pIHtcbiAgICAgICAgcG9pbnRSYWRpdXMgPSBfO1xuICAgICAgICByZXR1cm4gc3RyZWFtO1xuICAgICAgfSxcbiAgICAgIHJlc3VsdDogZDNfbm9vcFxuICAgIH07XG4gICAgZnVuY3Rpb24gcG9pbnQoeCwgeSkge1xuICAgICAgY29udGV4dC5tb3ZlVG8oeCArIHBvaW50UmFkaXVzLCB5KTtcbiAgICAgIGNvbnRleHQuYXJjKHgsIHksIHBvaW50UmFkaXVzLCAwLCDPhCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBvaW50TGluZVN0YXJ0KHgsIHkpIHtcbiAgICAgIGNvbnRleHQubW92ZVRvKHgsIHkpO1xuICAgICAgc3RyZWFtLnBvaW50ID0gcG9pbnRMaW5lO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb2ludExpbmUoeCwgeSkge1xuICAgICAgY29udGV4dC5saW5lVG8oeCwgeSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxpbmVFbmQoKSB7XG4gICAgICBzdHJlYW0ucG9pbnQgPSBwb2ludDtcbiAgICB9XG4gICAgZnVuY3Rpb24gbGluZUVuZFBvbHlnb24oKSB7XG4gICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RyZWFtO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19yZXNhbXBsZShwcm9qZWN0KSB7XG4gICAgdmFyIM60MiA9IC41LCBjb3NNaW5EaXN0YW5jZSA9IE1hdGguY29zKDMwICogZDNfcmFkaWFucyksIG1heERlcHRoID0gMTY7XG4gICAgZnVuY3Rpb24gcmVzYW1wbGUoc3RyZWFtKSB7XG4gICAgICByZXR1cm4gKG1heERlcHRoID8gcmVzYW1wbGVSZWN1cnNpdmUgOiByZXNhbXBsZU5vbmUpKHN0cmVhbSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlc2FtcGxlTm9uZShzdHJlYW0pIHtcbiAgICAgIHJldHVybiBkM19nZW9fdHJhbnNmb3JtUG9pbnQoc3RyZWFtLCBmdW5jdGlvbih4LCB5KSB7XG4gICAgICAgIHggPSBwcm9qZWN0KHgsIHkpO1xuICAgICAgICBzdHJlYW0ucG9pbnQoeFswXSwgeFsxXSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzYW1wbGVSZWN1cnNpdmUoc3RyZWFtKSB7XG4gICAgICB2YXIgzrswMCwgz4YwMCwgeDAwLCB5MDAsIGEwMCwgYjAwLCBjMDAsIM67MCwgeDAsIHkwLCBhMCwgYjAsIGMwO1xuICAgICAgdmFyIHJlc2FtcGxlID0ge1xuICAgICAgICBwb2ludDogcG9pbnQsXG4gICAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LFxuICAgICAgICBsaW5lRW5kOiBsaW5lRW5kLFxuICAgICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHN0cmVhbS5wb2x5Z29uU3RhcnQoKTtcbiAgICAgICAgICByZXNhbXBsZS5saW5lU3RhcnQgPSByaW5nU3RhcnQ7XG4gICAgICAgIH0sXG4gICAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHN0cmVhbS5wb2x5Z29uRW5kKCk7XG4gICAgICAgICAgcmVzYW1wbGUubGluZVN0YXJ0ID0gbGluZVN0YXJ0O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gcG9pbnQoeCwgeSkge1xuICAgICAgICB4ID0gcHJvamVjdCh4LCB5KTtcbiAgICAgICAgc3RyZWFtLnBvaW50KHhbMF0sIHhbMV0pO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkge1xuICAgICAgICB4MCA9IE5hTjtcbiAgICAgICAgcmVzYW1wbGUucG9pbnQgPSBsaW5lUG9pbnQ7XG4gICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGxpbmVQb2ludCjOuywgz4YpIHtcbiAgICAgICAgdmFyIGMgPSBkM19nZW9fY2FydGVzaWFuKFsgzrssIM+GIF0pLCBwID0gcHJvamVjdCjOuywgz4YpO1xuICAgICAgICByZXNhbXBsZUxpbmVUbyh4MCwgeTAsIM67MCwgYTAsIGIwLCBjMCwgeDAgPSBwWzBdLCB5MCA9IHBbMV0sIM67MCA9IM67LCBhMCA9IGNbMF0sIGIwID0gY1sxXSwgYzAgPSBjWzJdLCBtYXhEZXB0aCwgc3RyZWFtKTtcbiAgICAgICAgc3RyZWFtLnBvaW50KHgwLCB5MCk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBsaW5lRW5kKCkge1xuICAgICAgICByZXNhbXBsZS5wb2ludCA9IHBvaW50O1xuICAgICAgICBzdHJlYW0ubGluZUVuZCgpO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcmluZ1N0YXJ0KCkge1xuICAgICAgICBsaW5lU3RhcnQoKTtcbiAgICAgICAgcmVzYW1wbGUucG9pbnQgPSByaW5nUG9pbnQ7XG4gICAgICAgIHJlc2FtcGxlLmxpbmVFbmQgPSByaW5nRW5kO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcmluZ1BvaW50KM67LCDPhikge1xuICAgICAgICBsaW5lUG9pbnQozrswMCA9IM67LCDPhjAwID0gz4YpLCB4MDAgPSB4MCwgeTAwID0geTAsIGEwMCA9IGEwLCBiMDAgPSBiMCwgYzAwID0gYzA7XG4gICAgICAgIHJlc2FtcGxlLnBvaW50ID0gbGluZVBvaW50O1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gcmluZ0VuZCgpIHtcbiAgICAgICAgcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCDOuzAsIGEwLCBiMCwgYzAsIHgwMCwgeTAwLCDOuzAwLCBhMDAsIGIwMCwgYzAwLCBtYXhEZXB0aCwgc3RyZWFtKTtcbiAgICAgICAgcmVzYW1wbGUubGluZUVuZCA9IGxpbmVFbmQ7XG4gICAgICAgIGxpbmVFbmQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNhbXBsZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCDOuzAsIGEwLCBiMCwgYzAsIHgxLCB5MSwgzrsxLCBhMSwgYjEsIGMxLCBkZXB0aCwgc3RyZWFtKSB7XG4gICAgICB2YXIgZHggPSB4MSAtIHgwLCBkeSA9IHkxIC0geTAsIGQyID0gZHggKiBkeCArIGR5ICogZHk7XG4gICAgICBpZiAoZDIgPiA0ICogzrQyICYmIGRlcHRoLS0pIHtcbiAgICAgICAgdmFyIGEgPSBhMCArIGExLCBiID0gYjAgKyBiMSwgYyA9IGMwICsgYzEsIG0gPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYiArIGMgKiBjKSwgz4YyID0gTWF0aC5hc2luKGMgLz0gbSksIM67MiA9IGFicyhhYnMoYykgLSAxKSA8IM61IHx8IGFicyjOuzAgLSDOuzEpIDwgzrUgPyAozrswICsgzrsxKSAvIDIgOiBNYXRoLmF0YW4yKGIsIGEpLCBwID0gcHJvamVjdCjOuzIsIM+GMiksIHgyID0gcFswXSwgeTIgPSBwWzFdLCBkeDIgPSB4MiAtIHgwLCBkeTIgPSB5MiAtIHkwLCBkeiA9IGR5ICogZHgyIC0gZHggKiBkeTI7XG4gICAgICAgIGlmIChkeiAqIGR6IC8gZDIgPiDOtDIgfHwgYWJzKChkeCAqIGR4MiArIGR5ICogZHkyKSAvIGQyIC0gLjUpID4gLjMgfHwgYTAgKiBhMSArIGIwICogYjEgKyBjMCAqIGMxIDwgY29zTWluRGlzdGFuY2UpIHtcbiAgICAgICAgICByZXNhbXBsZUxpbmVUbyh4MCwgeTAsIM67MCwgYTAsIGIwLCBjMCwgeDIsIHkyLCDOuzIsIGEgLz0gbSwgYiAvPSBtLCBjLCBkZXB0aCwgc3RyZWFtKTtcbiAgICAgICAgICBzdHJlYW0ucG9pbnQoeDIsIHkyKTtcbiAgICAgICAgICByZXNhbXBsZUxpbmVUbyh4MiwgeTIsIM67MiwgYSwgYiwgYywgeDEsIHkxLCDOuzEsIGExLCBiMSwgYzEsIGRlcHRoLCBzdHJlYW0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJlc2FtcGxlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIE1hdGguc3FydCjOtDIpO1xuICAgICAgbWF4RGVwdGggPSAozrQyID0gXyAqIF8pID4gMCAmJiAxNjtcbiAgICAgIHJldHVybiByZXNhbXBsZTtcbiAgICB9O1xuICAgIHJldHVybiByZXNhbXBsZTtcbiAgfVxuICBkMy5nZW8ucGF0aCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwb2ludFJhZGl1cyA9IDQuNSwgcHJvamVjdGlvbiwgY29udGV4dCwgcHJvamVjdFN0cmVhbSwgY29udGV4dFN0cmVhbSwgY2FjaGVTdHJlYW07XG4gICAgZnVuY3Rpb24gcGF0aChvYmplY3QpIHtcbiAgICAgIGlmIChvYmplY3QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwb2ludFJhZGl1cyA9PT0gXCJmdW5jdGlvblwiKSBjb250ZXh0U3RyZWFtLnBvaW50UmFkaXVzKCtwb2ludFJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgICAgICAgaWYgKCFjYWNoZVN0cmVhbSB8fCAhY2FjaGVTdHJlYW0udmFsaWQpIGNhY2hlU3RyZWFtID0gcHJvamVjdFN0cmVhbShjb250ZXh0U3RyZWFtKTtcbiAgICAgICAgZDMuZ2VvLnN0cmVhbShvYmplY3QsIGNhY2hlU3RyZWFtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250ZXh0U3RyZWFtLnJlc3VsdCgpO1xuICAgIH1cbiAgICBwYXRoLmFyZWEgPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICAgIGQzX2dlb19wYXRoQXJlYVN1bSA9IDA7XG4gICAgICBkMy5nZW8uc3RyZWFtKG9iamVjdCwgcHJvamVjdFN0cmVhbShkM19nZW9fcGF0aEFyZWEpKTtcbiAgICAgIHJldHVybiBkM19nZW9fcGF0aEFyZWFTdW07XG4gICAgfTtcbiAgICBwYXRoLmNlbnRyb2lkID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICBkM19nZW9fY2VudHJvaWRYMCA9IGQzX2dlb19jZW50cm9pZFkwID0gZDNfZ2VvX2NlbnRyb2lkWjAgPSBkM19nZW9fY2VudHJvaWRYMSA9IGQzX2dlb19jZW50cm9pZFkxID0gZDNfZ2VvX2NlbnRyb2lkWjEgPSBkM19nZW9fY2VudHJvaWRYMiA9IGQzX2dlb19jZW50cm9pZFkyID0gZDNfZ2VvX2NlbnRyb2lkWjIgPSAwO1xuICAgICAgZDMuZ2VvLnN0cmVhbShvYmplY3QsIHByb2plY3RTdHJlYW0oZDNfZ2VvX3BhdGhDZW50cm9pZCkpO1xuICAgICAgcmV0dXJuIGQzX2dlb19jZW50cm9pZFoyID8gWyBkM19nZW9fY2VudHJvaWRYMiAvIGQzX2dlb19jZW50cm9pZFoyLCBkM19nZW9fY2VudHJvaWRZMiAvIGQzX2dlb19jZW50cm9pZFoyIF0gOiBkM19nZW9fY2VudHJvaWRaMSA/IFsgZDNfZ2VvX2NlbnRyb2lkWDEgLyBkM19nZW9fY2VudHJvaWRaMSwgZDNfZ2VvX2NlbnRyb2lkWTEgLyBkM19nZW9fY2VudHJvaWRaMSBdIDogZDNfZ2VvX2NlbnRyb2lkWjAgPyBbIGQzX2dlb19jZW50cm9pZFgwIC8gZDNfZ2VvX2NlbnRyb2lkWjAsIGQzX2dlb19jZW50cm9pZFkwIC8gZDNfZ2VvX2NlbnRyb2lkWjAgXSA6IFsgTmFOLCBOYU4gXTtcbiAgICB9O1xuICAgIHBhdGguYm91bmRzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgICBkM19nZW9fcGF0aEJvdW5kc1gxID0gZDNfZ2VvX3BhdGhCb3VuZHNZMSA9IC0oZDNfZ2VvX3BhdGhCb3VuZHNYMCA9IGQzX2dlb19wYXRoQm91bmRzWTAgPSBJbmZpbml0eSk7XG4gICAgICBkMy5nZW8uc3RyZWFtKG9iamVjdCwgcHJvamVjdFN0cmVhbShkM19nZW9fcGF0aEJvdW5kcykpO1xuICAgICAgcmV0dXJuIFsgWyBkM19nZW9fcGF0aEJvdW5kc1gwLCBkM19nZW9fcGF0aEJvdW5kc1kwIF0sIFsgZDNfZ2VvX3BhdGhCb3VuZHNYMSwgZDNfZ2VvX3BhdGhCb3VuZHNZMSBdIF07XG4gICAgfTtcbiAgICBwYXRoLnByb2plY3Rpb24gPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwcm9qZWN0aW9uO1xuICAgICAgcHJvamVjdFN0cmVhbSA9IChwcm9qZWN0aW9uID0gXykgPyBfLnN0cmVhbSB8fCBkM19nZW9fcGF0aFByb2plY3RTdHJlYW0oXykgOiBkM19pZGVudGl0eTtcbiAgICAgIHJldHVybiByZXNldCgpO1xuICAgIH07XG4gICAgcGF0aC5jb250ZXh0ID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY29udGV4dDtcbiAgICAgIGNvbnRleHRTdHJlYW0gPSAoY29udGV4dCA9IF8pID09IG51bGwgPyBuZXcgZDNfZ2VvX3BhdGhCdWZmZXIoKSA6IG5ldyBkM19nZW9fcGF0aENvbnRleHQoXyk7XG4gICAgICBpZiAodHlwZW9mIHBvaW50UmFkaXVzICE9PSBcImZ1bmN0aW9uXCIpIGNvbnRleHRTdHJlYW0ucG9pbnRSYWRpdXMocG9pbnRSYWRpdXMpO1xuICAgICAgcmV0dXJuIHJlc2V0KCk7XG4gICAgfTtcbiAgICBwYXRoLnBvaW50UmFkaXVzID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcG9pbnRSYWRpdXM7XG4gICAgICBwb2ludFJhZGl1cyA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogKGNvbnRleHRTdHJlYW0ucG9pbnRSYWRpdXMoK18pLCArXyk7XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgICAgY2FjaGVTdHJlYW0gPSBudWxsO1xuICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuICAgIHJldHVybiBwYXRoLnByb2plY3Rpb24oZDMuZ2VvLmFsYmVyc1VzYSgpKS5jb250ZXh0KG51bGwpO1xuICB9O1xuICBmdW5jdGlvbiBkM19nZW9fcGF0aFByb2plY3RTdHJlYW0ocHJvamVjdCkge1xuICAgIHZhciByZXNhbXBsZSA9IGQzX2dlb19yZXNhbXBsZShmdW5jdGlvbih4LCB5KSB7XG4gICAgICByZXR1cm4gcHJvamVjdChbIHggKiBkM19kZWdyZWVzLCB5ICogZDNfZGVncmVlcyBdKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtKSB7XG4gICAgICByZXR1cm4gZDNfZ2VvX3Byb2plY3Rpb25SYWRpYW5zKHJlc2FtcGxlKHN0cmVhbSkpO1xuICAgIH07XG4gIH1cbiAgZDMuZ2VvLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKG1ldGhvZHMpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RyZWFtOiBmdW5jdGlvbihzdHJlYW0pIHtcbiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBkM19nZW9fdHJhbnNmb3JtKHN0cmVhbSk7XG4gICAgICAgIGZvciAodmFyIGsgaW4gbWV0aG9kcykgdHJhbnNmb3JtW2tdID0gbWV0aG9kc1trXTtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuICBmdW5jdGlvbiBkM19nZW9fdHJhbnNmb3JtKHN0cmVhbSkge1xuICAgIHRoaXMuc3RyZWFtID0gc3RyZWFtO1xuICB9XG4gIGQzX2dlb190cmFuc2Zvcm0ucHJvdG90eXBlID0ge1xuICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7XG4gICAgICB0aGlzLnN0cmVhbS5wb2ludCh4LCB5KTtcbiAgICB9LFxuICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLnN0cmVhbS5zcGhlcmUoKTtcbiAgICB9LFxuICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLnN0cmVhbS5saW5lU3RhcnQoKTtcbiAgICB9LFxuICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5zdHJlYW0ubGluZUVuZCgpO1xuICAgIH0sXG4gICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpO1xuICAgIH0sXG4gICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCk7XG4gICAgfVxuICB9O1xuICBmdW5jdGlvbiBkM19nZW9fdHJhbnNmb3JtUG9pbnQoc3RyZWFtLCBwb2ludCkge1xuICAgIHJldHVybiB7XG4gICAgICBwb2ludDogcG9pbnQsXG4gICAgICBzcGhlcmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICBzdHJlYW0uc3BoZXJlKCk7XG4gICAgICB9LFxuICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpO1xuICAgICAgfSxcbiAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBzdHJlYW0ubGluZUVuZCgpO1xuICAgICAgfSxcbiAgICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHN0cmVhbS5wb2x5Z29uU3RhcnQoKTtcbiAgICAgIH0sXG4gICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHtcbiAgICAgICAgc3RyZWFtLnBvbHlnb25FbmQoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGQzLmdlby5wcm9qZWN0aW9uID0gZDNfZ2VvX3Byb2plY3Rpb247XG4gIGQzLmdlby5wcm9qZWN0aW9uTXV0YXRvciA9IGQzX2dlb19wcm9qZWN0aW9uTXV0YXRvcjtcbiAgZnVuY3Rpb24gZDNfZ2VvX3Byb2plY3Rpb24ocHJvamVjdCkge1xuICAgIHJldHVybiBkM19nZW9fcHJvamVjdGlvbk11dGF0b3IoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcHJvamVjdDtcbiAgICB9KSgpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19wcm9qZWN0aW9uTXV0YXRvcihwcm9qZWN0QXQpIHtcbiAgICB2YXIgcHJvamVjdCwgcm90YXRlLCBwcm9qZWN0Um90YXRlLCBwcm9qZWN0UmVzYW1wbGUgPSBkM19nZW9fcmVzYW1wbGUoZnVuY3Rpb24oeCwgeSkge1xuICAgICAgeCA9IHByb2plY3QoeCwgeSk7XG4gICAgICByZXR1cm4gWyB4WzBdICogayArIM60eCwgzrR5IC0geFsxXSAqIGsgXTtcbiAgICB9KSwgayA9IDE1MCwgeCA9IDQ4MCwgeSA9IDI1MCwgzrsgPSAwLCDPhiA9IDAsIM60zrsgPSAwLCDOtM+GID0gMCwgzrTOsyA9IDAsIM60eCwgzrR5LCBwcmVjbGlwID0gZDNfZ2VvX2NsaXBBbnRpbWVyaWRpYW4sIHBvc3RjbGlwID0gZDNfaWRlbnRpdHksIGNsaXBBbmdsZSA9IG51bGwsIGNsaXBFeHRlbnQgPSBudWxsLCBzdHJlYW07XG4gICAgZnVuY3Rpb24gcHJvamVjdGlvbihwb2ludCkge1xuICAgICAgcG9pbnQgPSBwcm9qZWN0Um90YXRlKHBvaW50WzBdICogZDNfcmFkaWFucywgcG9pbnRbMV0gKiBkM19yYWRpYW5zKTtcbiAgICAgIHJldHVybiBbIHBvaW50WzBdICogayArIM60eCwgzrR5IC0gcG9pbnRbMV0gKiBrIF07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGludmVydChwb2ludCkge1xuICAgICAgcG9pbnQgPSBwcm9qZWN0Um90YXRlLmludmVydCgocG9pbnRbMF0gLSDOtHgpIC8gaywgKM60eSAtIHBvaW50WzFdKSAvIGspO1xuICAgICAgcmV0dXJuIHBvaW50ICYmIFsgcG9pbnRbMF0gKiBkM19kZWdyZWVzLCBwb2ludFsxXSAqIGQzX2RlZ3JlZXMgXTtcbiAgICB9XG4gICAgcHJvamVjdGlvbi5zdHJlYW0gPSBmdW5jdGlvbihvdXRwdXQpIHtcbiAgICAgIGlmIChzdHJlYW0pIHN0cmVhbS52YWxpZCA9IGZhbHNlO1xuICAgICAgc3RyZWFtID0gZDNfZ2VvX3Byb2plY3Rpb25SYWRpYW5zKHByZWNsaXAocm90YXRlLCBwcm9qZWN0UmVzYW1wbGUocG9zdGNsaXAob3V0cHV0KSkpKTtcbiAgICAgIHN0cmVhbS52YWxpZCA9IHRydWU7XG4gICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH07XG4gICAgcHJvamVjdGlvbi5jbGlwQW5nbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjbGlwQW5nbGU7XG4gICAgICBwcmVjbGlwID0gXyA9PSBudWxsID8gKGNsaXBBbmdsZSA9IF8sIGQzX2dlb19jbGlwQW50aW1lcmlkaWFuKSA6IGQzX2dlb19jbGlwQ2lyY2xlKChjbGlwQW5nbGUgPSArXykgKiBkM19yYWRpYW5zKTtcbiAgICAgIHJldHVybiBpbnZhbGlkYXRlKCk7XG4gICAgfTtcbiAgICBwcm9qZWN0aW9uLmNsaXBFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjbGlwRXh0ZW50O1xuICAgICAgY2xpcEV4dGVudCA9IF87XG4gICAgICBwb3N0Y2xpcCA9IF8gPyBkM19nZW9fY2xpcEV4dGVudChfWzBdWzBdLCBfWzBdWzFdLCBfWzFdWzBdLCBfWzFdWzFdKSA6IGQzX2lkZW50aXR5O1xuICAgICAgcmV0dXJuIGludmFsaWRhdGUoKTtcbiAgICB9O1xuICAgIHByb2plY3Rpb24uc2NhbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBrO1xuICAgICAgayA9ICtfO1xuICAgICAgcmV0dXJuIHJlc2V0KCk7XG4gICAgfTtcbiAgICBwcm9qZWN0aW9uLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgeCwgeSBdO1xuICAgICAgeCA9ICtfWzBdO1xuICAgICAgeSA9ICtfWzFdO1xuICAgICAgcmV0dXJuIHJlc2V0KCk7XG4gICAgfTtcbiAgICBwcm9qZWN0aW9uLmNlbnRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgzrsgKiBkM19kZWdyZWVzLCDPhiAqIGQzX2RlZ3JlZXMgXTtcbiAgICAgIM67ID0gX1swXSAlIDM2MCAqIGQzX3JhZGlhbnM7XG4gICAgICDPhiA9IF9bMV0gJSAzNjAgKiBkM19yYWRpYW5zO1xuICAgICAgcmV0dXJuIHJlc2V0KCk7XG4gICAgfTtcbiAgICBwcm9qZWN0aW9uLnJvdGF0ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgzrTOuyAqIGQzX2RlZ3JlZXMsIM60z4YgKiBkM19kZWdyZWVzLCDOtM6zICogZDNfZGVncmVlcyBdO1xuICAgICAgzrTOuyA9IF9bMF0gJSAzNjAgKiBkM19yYWRpYW5zO1xuICAgICAgzrTPhiA9IF9bMV0gJSAzNjAgKiBkM19yYWRpYW5zO1xuICAgICAgzrTOsyA9IF8ubGVuZ3RoID4gMiA/IF9bMl0gJSAzNjAgKiBkM19yYWRpYW5zIDogMDtcbiAgICAgIHJldHVybiByZXNldCgpO1xuICAgIH07XG4gICAgZDMucmViaW5kKHByb2plY3Rpb24sIHByb2plY3RSZXNhbXBsZSwgXCJwcmVjaXNpb25cIik7XG4gICAgZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICBwcm9qZWN0Um90YXRlID0gZDNfZ2VvX2NvbXBvc2Uocm90YXRlID0gZDNfZ2VvX3JvdGF0aW9uKM60zrssIM60z4YsIM60zrMpLCBwcm9qZWN0KTtcbiAgICAgIHZhciBjZW50ZXIgPSBwcm9qZWN0KM67LCDPhik7XG4gICAgICDOtHggPSB4IC0gY2VudGVyWzBdICogaztcbiAgICAgIM60eSA9IHkgKyBjZW50ZXJbMV0gKiBrO1xuICAgICAgcmV0dXJuIGludmFsaWRhdGUoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaW52YWxpZGF0ZSgpIHtcbiAgICAgIGlmIChzdHJlYW0pIHN0cmVhbS52YWxpZCA9IGZhbHNlLCBzdHJlYW0gPSBudWxsO1xuICAgICAgcmV0dXJuIHByb2plY3Rpb247XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHByb2plY3QgPSBwcm9qZWN0QXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIHByb2plY3Rpb24uaW52ZXJ0ID0gcHJvamVjdC5pbnZlcnQgJiYgaW52ZXJ0O1xuICAgICAgcmV0dXJuIHJlc2V0KCk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fcHJvamVjdGlvblJhZGlhbnMoc3RyZWFtKSB7XG4gICAgcmV0dXJuIGQzX2dlb190cmFuc2Zvcm1Qb2ludChzdHJlYW0sIGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgIHN0cmVhbS5wb2ludCh4ICogZDNfcmFkaWFucywgeSAqIGQzX3JhZGlhbnMpO1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19lcXVpcmVjdGFuZ3VsYXIozrssIM+GKSB7XG4gICAgcmV0dXJuIFsgzrssIM+GIF07XG4gIH1cbiAgKGQzLmdlby5lcXVpcmVjdGFuZ3VsYXIgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDNfZ2VvX3Byb2plY3Rpb24oZDNfZ2VvX2VxdWlyZWN0YW5ndWxhcik7XG4gIH0pLnJhdyA9IGQzX2dlb19lcXVpcmVjdGFuZ3VsYXIuaW52ZXJ0ID0gZDNfZ2VvX2VxdWlyZWN0YW5ndWxhcjtcbiAgZDMuZ2VvLnJvdGF0aW9uID0gZnVuY3Rpb24ocm90YXRlKSB7XG4gICAgcm90YXRlID0gZDNfZ2VvX3JvdGF0aW9uKHJvdGF0ZVswXSAlIDM2MCAqIGQzX3JhZGlhbnMsIHJvdGF0ZVsxXSAqIGQzX3JhZGlhbnMsIHJvdGF0ZS5sZW5ndGggPiAyID8gcm90YXRlWzJdICogZDNfcmFkaWFucyA6IDApO1xuICAgIGZ1bmN0aW9uIGZvcndhcmQoY29vcmRpbmF0ZXMpIHtcbiAgICAgIGNvb3JkaW5hdGVzID0gcm90YXRlKGNvb3JkaW5hdGVzWzBdICogZDNfcmFkaWFucywgY29vcmRpbmF0ZXNbMV0gKiBkM19yYWRpYW5zKTtcbiAgICAgIHJldHVybiBjb29yZGluYXRlc1swXSAqPSBkM19kZWdyZWVzLCBjb29yZGluYXRlc1sxXSAqPSBkM19kZWdyZWVzLCBjb29yZGluYXRlcztcbiAgICB9XG4gICAgZm9yd2FyZC5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykge1xuICAgICAgY29vcmRpbmF0ZXMgPSByb3RhdGUuaW52ZXJ0KGNvb3JkaW5hdGVzWzBdICogZDNfcmFkaWFucywgY29vcmRpbmF0ZXNbMV0gKiBkM19yYWRpYW5zKTtcbiAgICAgIHJldHVybiBjb29yZGluYXRlc1swXSAqPSBkM19kZWdyZWVzLCBjb29yZGluYXRlc1sxXSAqPSBkM19kZWdyZWVzLCBjb29yZGluYXRlcztcbiAgICB9O1xuICAgIHJldHVybiBmb3J3YXJkO1xuICB9O1xuICBmdW5jdGlvbiBkM19nZW9faWRlbnRpdHlSb3RhdGlvbijOuywgz4YpIHtcbiAgICByZXR1cm4gWyDOuyA+IM+AID8gzrsgLSDPhCA6IM67IDwgLc+AID8gzrsgKyDPhCA6IM67LCDPhiBdO1xuICB9XG4gIGQzX2dlb19pZGVudGl0eVJvdGF0aW9uLmludmVydCA9IGQzX2dlb19lcXVpcmVjdGFuZ3VsYXI7XG4gIGZ1bmN0aW9uIGQzX2dlb19yb3RhdGlvbijOtM67LCDOtM+GLCDOtM6zKSB7XG4gICAgcmV0dXJuIM60zrsgPyDOtM+GIHx8IM60zrMgPyBkM19nZW9fY29tcG9zZShkM19nZW9fcm90YXRpb27OuyjOtM67KSwgZDNfZ2VvX3JvdGF0aW9uz4bOsyjOtM+GLCDOtM6zKSkgOiBkM19nZW9fcm90YXRpb27OuyjOtM67KSA6IM60z4YgfHwgzrTOsyA/IGQzX2dlb19yb3RhdGlvbs+GzrMozrTPhiwgzrTOsykgOiBkM19nZW9faWRlbnRpdHlSb3RhdGlvbjtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fZm9yd2FyZFJvdGF0aW9uzrsozrTOuykge1xuICAgIHJldHVybiBmdW5jdGlvbijOuywgz4YpIHtcbiAgICAgIHJldHVybiDOuyArPSDOtM67LCBbIM67ID4gz4AgPyDOuyAtIM+EIDogzrsgPCAtz4AgPyDOuyArIM+EIDogzrssIM+GIF07XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fcm90YXRpb27OuyjOtM67KSB7XG4gICAgdmFyIHJvdGF0aW9uID0gZDNfZ2VvX2ZvcndhcmRSb3RhdGlvbs67KM60zrspO1xuICAgIHJvdGF0aW9uLmludmVydCA9IGQzX2dlb19mb3J3YXJkUm90YXRpb27OuygtzrTOuyk7XG4gICAgcmV0dXJuIHJvdGF0aW9uO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb19yb3RhdGlvbs+GzrMozrTPhiwgzrTOsykge1xuICAgIHZhciBjb3POtM+GID0gTWF0aC5jb3MozrTPhiksIHNpbs60z4YgPSBNYXRoLnNpbijOtM+GKSwgY29zzrTOsyA9IE1hdGguY29zKM60zrMpLCBzaW7OtM6zID0gTWF0aC5zaW4ozrTOsyk7XG4gICAgZnVuY3Rpb24gcm90YXRpb24ozrssIM+GKSB7XG4gICAgICB2YXIgY29zz4YgPSBNYXRoLmNvcyjPhiksIHggPSBNYXRoLmNvcyjOuykgKiBjb3PPhiwgeSA9IE1hdGguc2luKM67KSAqIGNvc8+GLCB6ID0gTWF0aC5zaW4oz4YpLCBrID0geiAqIGNvc860z4YgKyB4ICogc2luzrTPhjtcbiAgICAgIHJldHVybiBbIE1hdGguYXRhbjIoeSAqIGNvc860zrMgLSBrICogc2luzrTOsywgeCAqIGNvc860z4YgLSB6ICogc2luzrTPhiksIGQzX2FzaW4oayAqIGNvc860zrMgKyB5ICogc2luzrTOsykgXTtcbiAgICB9XG4gICAgcm90YXRpb24uaW52ZXJ0ID0gZnVuY3Rpb24ozrssIM+GKSB7XG4gICAgICB2YXIgY29zz4YgPSBNYXRoLmNvcyjPhiksIHggPSBNYXRoLmNvcyjOuykgKiBjb3PPhiwgeSA9IE1hdGguc2luKM67KSAqIGNvc8+GLCB6ID0gTWF0aC5zaW4oz4YpLCBrID0geiAqIGNvc860zrMgLSB5ICogc2luzrTOsztcbiAgICAgIHJldHVybiBbIE1hdGguYXRhbjIoeSAqIGNvc860zrMgKyB6ICogc2luzrTOsywgeCAqIGNvc860z4YgKyBrICogc2luzrTPhiksIGQzX2FzaW4oayAqIGNvc860z4YgLSB4ICogc2luzrTPhikgXTtcbiAgICB9O1xuICAgIHJldHVybiByb3RhdGlvbjtcbiAgfVxuICBkMy5nZW8uY2lyY2xlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG9yaWdpbiA9IFsgMCwgMCBdLCBhbmdsZSwgcHJlY2lzaW9uID0gNiwgaW50ZXJwb2xhdGU7XG4gICAgZnVuY3Rpb24gY2lyY2xlKCkge1xuICAgICAgdmFyIGNlbnRlciA9IHR5cGVvZiBvcmlnaW4gPT09IFwiZnVuY3Rpb25cIiA/IG9yaWdpbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogb3JpZ2luLCByb3RhdGUgPSBkM19nZW9fcm90YXRpb24oLWNlbnRlclswXSAqIGQzX3JhZGlhbnMsIC1jZW50ZXJbMV0gKiBkM19yYWRpYW5zLCAwKS5pbnZlcnQsIHJpbmcgPSBbXTtcbiAgICAgIGludGVycG9sYXRlKG51bGwsIG51bGwsIDEsIHtcbiAgICAgICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgICAgICByaW5nLnB1c2goeCA9IHJvdGF0ZSh4LCB5KSk7XG4gICAgICAgICAgeFswXSAqPSBkM19kZWdyZWVzLCB4WzFdICo9IGQzX2RlZ3JlZXM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJQb2x5Z29uXCIsXG4gICAgICAgIGNvb3JkaW5hdGVzOiBbIHJpbmcgXVxuICAgICAgfTtcbiAgICB9XG4gICAgY2lyY2xlLm9yaWdpbiA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG9yaWdpbjtcbiAgICAgIG9yaWdpbiA9IHg7XG4gICAgICByZXR1cm4gY2lyY2xlO1xuICAgIH07XG4gICAgY2lyY2xlLmFuZ2xlID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gYW5nbGU7XG4gICAgICBpbnRlcnBvbGF0ZSA9IGQzX2dlb19jaXJjbGVJbnRlcnBvbGF0ZSgoYW5nbGUgPSAreCkgKiBkM19yYWRpYW5zLCBwcmVjaXNpb24gKiBkM19yYWRpYW5zKTtcbiAgICAgIHJldHVybiBjaXJjbGU7XG4gICAgfTtcbiAgICBjaXJjbGUucHJlY2lzaW9uID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcHJlY2lzaW9uO1xuICAgICAgaW50ZXJwb2xhdGUgPSBkM19nZW9fY2lyY2xlSW50ZXJwb2xhdGUoYW5nbGUgKiBkM19yYWRpYW5zLCAocHJlY2lzaW9uID0gK18pICogZDNfcmFkaWFucyk7XG4gICAgICByZXR1cm4gY2lyY2xlO1xuICAgIH07XG4gICAgcmV0dXJuIGNpcmNsZS5hbmdsZSg5MCk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2dlb19jaXJjbGVJbnRlcnBvbGF0ZShyYWRpdXMsIHByZWNpc2lvbikge1xuICAgIHZhciBjciA9IE1hdGguY29zKHJhZGl1cyksIHNyID0gTWF0aC5zaW4ocmFkaXVzKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oZnJvbSwgdG8sIGRpcmVjdGlvbiwgbGlzdGVuZXIpIHtcbiAgICAgIHZhciBzdGVwID0gZGlyZWN0aW9uICogcHJlY2lzaW9uO1xuICAgICAgaWYgKGZyb20gIT0gbnVsbCkge1xuICAgICAgICBmcm9tID0gZDNfZ2VvX2NpcmNsZUFuZ2xlKGNyLCBmcm9tKTtcbiAgICAgICAgdG8gPSBkM19nZW9fY2lyY2xlQW5nbGUoY3IsIHRvKTtcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA+IDAgPyBmcm9tIDwgdG8gOiBmcm9tID4gdG8pIGZyb20gKz0gZGlyZWN0aW9uICogz4Q7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcm9tID0gcmFkaXVzICsgZGlyZWN0aW9uICogz4Q7XG4gICAgICAgIHRvID0gcmFkaXVzIC0gLjUgKiBzdGVwO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgcG9pbnQsIHQgPSBmcm9tOyBkaXJlY3Rpb24gPiAwID8gdCA+IHRvIDogdCA8IHRvOyB0IC09IHN0ZXApIHtcbiAgICAgICAgbGlzdGVuZXIucG9pbnQoKHBvaW50ID0gZDNfZ2VvX3NwaGVyaWNhbChbIGNyLCAtc3IgKiBNYXRoLmNvcyh0KSwgLXNyICogTWF0aC5zaW4odCkgXSkpWzBdLCBwb2ludFsxXSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9fY2lyY2xlQW5nbGUoY3IsIHBvaW50KSB7XG4gICAgdmFyIGEgPSBkM19nZW9fY2FydGVzaWFuKHBvaW50KTtcbiAgICBhWzBdIC09IGNyO1xuICAgIGQzX2dlb19jYXJ0ZXNpYW5Ob3JtYWxpemUoYSk7XG4gICAgdmFyIGFuZ2xlID0gZDNfYWNvcygtYVsxXSk7XG4gICAgcmV0dXJuICgoLWFbMl0gPCAwID8gLWFuZ2xlIDogYW5nbGUpICsgMiAqIE1hdGguUEkgLSDOtSkgJSAoMiAqIE1hdGguUEkpO1xuICB9XG4gIGQzLmdlby5kaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgzpTOuyA9IChiWzBdIC0gYVswXSkgKiBkM19yYWRpYW5zLCDPhjAgPSBhWzFdICogZDNfcmFkaWFucywgz4YxID0gYlsxXSAqIGQzX3JhZGlhbnMsIHNpbs6UzrsgPSBNYXRoLnNpbijOlM67KSwgY29zzpTOuyA9IE1hdGguY29zKM6UzrspLCBzaW7PhjAgPSBNYXRoLnNpbijPhjApLCBjb3PPhjAgPSBNYXRoLmNvcyjPhjApLCBzaW7PhjEgPSBNYXRoLnNpbijPhjEpLCBjb3PPhjEgPSBNYXRoLmNvcyjPhjEpLCB0O1xuICAgIHJldHVybiBNYXRoLmF0YW4yKE1hdGguc3FydCgodCA9IGNvc8+GMSAqIHNpbs6UzrspICogdCArICh0ID0gY29zz4YwICogc2luz4YxIC0gc2luz4YwICogY29zz4YxICogY29zzpTOuykgKiB0KSwgc2luz4YwICogc2luz4YxICsgY29zz4YwICogY29zz4YxICogY29zzpTOuyk7XG4gIH07XG4gIGQzLmdlby5ncmF0aWN1bGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgeDEsIHgwLCBYMSwgWDAsIHkxLCB5MCwgWTEsIFkwLCBkeCA9IDEwLCBkeSA9IGR4LCBEWCA9IDkwLCBEWSA9IDM2MCwgeCwgeSwgWCwgWSwgcHJlY2lzaW9uID0gMi41O1xuICAgIGZ1bmN0aW9uIGdyYXRpY3VsZSgpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiTXVsdGlMaW5lU3RyaW5nXCIsXG4gICAgICAgIGNvb3JkaW5hdGVzOiBsaW5lcygpXG4gICAgICB9O1xuICAgIH1cbiAgICBmdW5jdGlvbiBsaW5lcygpIHtcbiAgICAgIHJldHVybiBkMy5yYW5nZShNYXRoLmNlaWwoWDAgLyBEWCkgKiBEWCwgWDEsIERYKS5tYXAoWCkuY29uY2F0KGQzLnJhbmdlKE1hdGguY2VpbChZMCAvIERZKSAqIERZLCBZMSwgRFkpLm1hcChZKSkuY29uY2F0KGQzLnJhbmdlKE1hdGguY2VpbCh4MCAvIGR4KSAqIGR4LCB4MSwgZHgpLmZpbHRlcihmdW5jdGlvbih4KSB7XG4gICAgICAgIHJldHVybiBhYnMoeCAlIERYKSA+IM61O1xuICAgICAgfSkubWFwKHgpKS5jb25jYXQoZDMucmFuZ2UoTWF0aC5jZWlsKHkwIC8gZHkpICogZHksIHkxLCBkeSkuZmlsdGVyKGZ1bmN0aW9uKHkpIHtcbiAgICAgICAgcmV0dXJuIGFicyh5ICUgRFkpID4gzrU7XG4gICAgICB9KS5tYXAoeSkpO1xuICAgIH1cbiAgICBncmF0aWN1bGUubGluZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBsaW5lcygpLm1hcChmdW5jdGlvbihjb29yZGluYXRlcykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IFwiTGluZVN0cmluZ1wiLFxuICAgICAgICAgIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlc1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBncmF0aWN1bGUub3V0bGluZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogXCJQb2x5Z29uXCIsXG4gICAgICAgIGNvb3JkaW5hdGVzOiBbIFgoWDApLmNvbmNhdChZKFkxKS5zbGljZSgxKSwgWChYMSkucmV2ZXJzZSgpLnNsaWNlKDEpLCBZKFkwKS5yZXZlcnNlKCkuc2xpY2UoMSkpIF1cbiAgICAgIH07XG4gICAgfTtcbiAgICBncmF0aWN1bGUuZXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZ3JhdGljdWxlLm1pbm9yRXh0ZW50KCk7XG4gICAgICByZXR1cm4gZ3JhdGljdWxlLm1ham9yRXh0ZW50KF8pLm1pbm9yRXh0ZW50KF8pO1xuICAgIH07XG4gICAgZ3JhdGljdWxlLm1ham9yRXh0ZW50ID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gWyBbIFgwLCBZMCBdLCBbIFgxLCBZMSBdIF07XG4gICAgICBYMCA9ICtfWzBdWzBdLCBYMSA9ICtfWzFdWzBdO1xuICAgICAgWTAgPSArX1swXVsxXSwgWTEgPSArX1sxXVsxXTtcbiAgICAgIGlmIChYMCA+IFgxKSBfID0gWDAsIFgwID0gWDEsIFgxID0gXztcbiAgICAgIGlmIChZMCA+IFkxKSBfID0gWTAsIFkwID0gWTEsIFkxID0gXztcbiAgICAgIHJldHVybiBncmF0aWN1bGUucHJlY2lzaW9uKHByZWNpc2lvbik7XG4gICAgfTtcbiAgICBncmF0aWN1bGUubWlub3JFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbIFsgeDAsIHkwIF0sIFsgeDEsIHkxIF0gXTtcbiAgICAgIHgwID0gK19bMF1bMF0sIHgxID0gK19bMV1bMF07XG4gICAgICB5MCA9ICtfWzBdWzFdLCB5MSA9ICtfWzFdWzFdO1xuICAgICAgaWYgKHgwID4geDEpIF8gPSB4MCwgeDAgPSB4MSwgeDEgPSBfO1xuICAgICAgaWYgKHkwID4geTEpIF8gPSB5MCwgeTAgPSB5MSwgeTEgPSBfO1xuICAgICAgcmV0dXJuIGdyYXRpY3VsZS5wcmVjaXNpb24ocHJlY2lzaW9uKTtcbiAgICB9O1xuICAgIGdyYXRpY3VsZS5zdGVwID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZ3JhdGljdWxlLm1pbm9yU3RlcCgpO1xuICAgICAgcmV0dXJuIGdyYXRpY3VsZS5tYWpvclN0ZXAoXykubWlub3JTdGVwKF8pO1xuICAgIH07XG4gICAgZ3JhdGljdWxlLm1ham9yU3RlcCA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgRFgsIERZIF07XG4gICAgICBEWCA9ICtfWzBdLCBEWSA9ICtfWzFdO1xuICAgICAgcmV0dXJuIGdyYXRpY3VsZTtcbiAgICB9O1xuICAgIGdyYXRpY3VsZS5taW5vclN0ZXAgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbIGR4LCBkeSBdO1xuICAgICAgZHggPSArX1swXSwgZHkgPSArX1sxXTtcbiAgICAgIHJldHVybiBncmF0aWN1bGU7XG4gICAgfTtcbiAgICBncmF0aWN1bGUucHJlY2lzaW9uID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcHJlY2lzaW9uO1xuICAgICAgcHJlY2lzaW9uID0gK187XG4gICAgICB4ID0gZDNfZ2VvX2dyYXRpY3VsZVgoeTAsIHkxLCA5MCk7XG4gICAgICB5ID0gZDNfZ2VvX2dyYXRpY3VsZVkoeDAsIHgxLCBwcmVjaXNpb24pO1xuICAgICAgWCA9IGQzX2dlb19ncmF0aWN1bGVYKFkwLCBZMSwgOTApO1xuICAgICAgWSA9IGQzX2dlb19ncmF0aWN1bGVZKFgwLCBYMSwgcHJlY2lzaW9uKTtcbiAgICAgIHJldHVybiBncmF0aWN1bGU7XG4gICAgfTtcbiAgICByZXR1cm4gZ3JhdGljdWxlLm1ham9yRXh0ZW50KFsgWyAtMTgwLCAtOTAgKyDOtSBdLCBbIDE4MCwgOTAgLSDOtSBdIF0pLm1pbm9yRXh0ZW50KFsgWyAtMTgwLCAtODAgLSDOtSBdLCBbIDE4MCwgODAgKyDOtSBdIF0pO1xuICB9O1xuICBmdW5jdGlvbiBkM19nZW9fZ3JhdGljdWxlWCh5MCwgeTEsIGR5KSB7XG4gICAgdmFyIHkgPSBkMy5yYW5nZSh5MCwgeTEgLSDOtSwgZHkpLmNvbmNhdCh5MSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiB5Lm1hcChmdW5jdGlvbih5KSB7XG4gICAgICAgIHJldHVybiBbIHgsIHkgXTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2dyYXRpY3VsZVkoeDAsIHgxLCBkeCkge1xuICAgIHZhciB4ID0gZDMucmFuZ2UoeDAsIHgxIC0gzrUsIGR4KS5jb25jYXQoeDEpO1xuICAgIHJldHVybiBmdW5jdGlvbih5KSB7XG4gICAgICByZXR1cm4geC5tYXAoZnVuY3Rpb24oeCkge1xuICAgICAgICByZXR1cm4gWyB4LCB5IF07XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGQzX3NvdXJjZShkKSB7XG4gICAgcmV0dXJuIGQuc291cmNlO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3RhcmdldChkKSB7XG4gICAgcmV0dXJuIGQudGFyZ2V0O1xuICB9XG4gIGQzLmdlby5ncmVhdEFyYyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzb3VyY2UgPSBkM19zb3VyY2UsIHNvdXJjZV8sIHRhcmdldCA9IGQzX3RhcmdldCwgdGFyZ2V0XztcbiAgICBmdW5jdGlvbiBncmVhdEFyYygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiTGluZVN0cmluZ1wiLFxuICAgICAgICBjb29yZGluYXRlczogWyBzb3VyY2VfIHx8IHNvdXJjZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0YXJnZXRfIHx8IHRhcmdldC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIF1cbiAgICAgIH07XG4gICAgfVxuICAgIGdyZWF0QXJjLmRpc3RhbmNlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZDMuZ2VvLmRpc3RhbmNlKHNvdXJjZV8gfHwgc291cmNlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRhcmdldF8gfHwgdGFyZ2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICAgIH07XG4gICAgZ3JlYXRBcmMuc291cmNlID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc291cmNlO1xuICAgICAgc291cmNlID0gXywgc291cmNlXyA9IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBudWxsIDogXztcbiAgICAgIHJldHVybiBncmVhdEFyYztcbiAgICB9O1xuICAgIGdyZWF0QXJjLnRhcmdldCA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRhcmdldDtcbiAgICAgIHRhcmdldCA9IF8sIHRhcmdldF8gPSB0eXBlb2YgXyA9PT0gXCJmdW5jdGlvblwiID8gbnVsbCA6IF87XG4gICAgICByZXR1cm4gZ3JlYXRBcmM7XG4gICAgfTtcbiAgICBncmVhdEFyYy5wcmVjaXNpb24gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gZ3JlYXRBcmMgOiAwO1xuICAgIH07XG4gICAgcmV0dXJuIGdyZWF0QXJjO1xuICB9O1xuICBkMy5nZW8uaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihzb3VyY2UsIHRhcmdldCkge1xuICAgIHJldHVybiBkM19nZW9faW50ZXJwb2xhdGUoc291cmNlWzBdICogZDNfcmFkaWFucywgc291cmNlWzFdICogZDNfcmFkaWFucywgdGFyZ2V0WzBdICogZDNfcmFkaWFucywgdGFyZ2V0WzFdICogZDNfcmFkaWFucyk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2dlb19pbnRlcnBvbGF0ZSh4MCwgeTAsIHgxLCB5MSkge1xuICAgIHZhciBjeTAgPSBNYXRoLmNvcyh5MCksIHN5MCA9IE1hdGguc2luKHkwKSwgY3kxID0gTWF0aC5jb3MoeTEpLCBzeTEgPSBNYXRoLnNpbih5MSksIGt4MCA9IGN5MCAqIE1hdGguY29zKHgwKSwga3kwID0gY3kwICogTWF0aC5zaW4oeDApLCBreDEgPSBjeTEgKiBNYXRoLmNvcyh4MSksIGt5MSA9IGN5MSAqIE1hdGguc2luKHgxKSwgZCA9IDIgKiBNYXRoLmFzaW4oTWF0aC5zcXJ0KGQzX2hhdmVyc2luKHkxIC0geTApICsgY3kwICogY3kxICogZDNfaGF2ZXJzaW4oeDEgLSB4MCkpKSwgayA9IDEgLyBNYXRoLnNpbihkKTtcbiAgICB2YXIgaW50ZXJwb2xhdGUgPSBkID8gZnVuY3Rpb24odCkge1xuICAgICAgdmFyIEIgPSBNYXRoLnNpbih0ICo9IGQpICogaywgQSA9IE1hdGguc2luKGQgLSB0KSAqIGssIHggPSBBICoga3gwICsgQiAqIGt4MSwgeSA9IEEgKiBreTAgKyBCICoga3kxLCB6ID0gQSAqIHN5MCArIEIgKiBzeTE7XG4gICAgICByZXR1cm4gWyBNYXRoLmF0YW4yKHksIHgpICogZDNfZGVncmVlcywgTWF0aC5hdGFuMih6LCBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSkpICogZDNfZGVncmVlcyBdO1xuICAgIH0gOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBbIHgwICogZDNfZGVncmVlcywgeTAgKiBkM19kZWdyZWVzIF07XG4gICAgfTtcbiAgICBpbnRlcnBvbGF0ZS5kaXN0YW5jZSA9IGQ7XG4gICAgcmV0dXJuIGludGVycG9sYXRlO1xuICB9XG4gIGQzLmdlby5sZW5ndGggPSBmdW5jdGlvbihvYmplY3QpIHtcbiAgICBkM19nZW9fbGVuZ3RoU3VtID0gMDtcbiAgICBkMy5nZW8uc3RyZWFtKG9iamVjdCwgZDNfZ2VvX2xlbmd0aCk7XG4gICAgcmV0dXJuIGQzX2dlb19sZW5ndGhTdW07XG4gIH07XG4gIHZhciBkM19nZW9fbGVuZ3RoU3VtO1xuICB2YXIgZDNfZ2VvX2xlbmd0aCA9IHtcbiAgICBzcGhlcmU6IGQzX25vb3AsXG4gICAgcG9pbnQ6IGQzX25vb3AsXG4gICAgbGluZVN0YXJ0OiBkM19nZW9fbGVuZ3RoTGluZVN0YXJ0LFxuICAgIGxpbmVFbmQ6IGQzX25vb3AsXG4gICAgcG9seWdvblN0YXJ0OiBkM19ub29wLFxuICAgIHBvbHlnb25FbmQ6IGQzX25vb3BcbiAgfTtcbiAgZnVuY3Rpb24gZDNfZ2VvX2xlbmd0aExpbmVTdGFydCgpIHtcbiAgICB2YXIgzrswLCBzaW7PhjAsIGNvc8+GMDtcbiAgICBkM19nZW9fbGVuZ3RoLnBvaW50ID0gZnVuY3Rpb24ozrssIM+GKSB7XG4gICAgICDOuzAgPSDOuyAqIGQzX3JhZGlhbnMsIHNpbs+GMCA9IE1hdGguc2luKM+GICo9IGQzX3JhZGlhbnMpLCBjb3PPhjAgPSBNYXRoLmNvcyjPhik7XG4gICAgICBkM19nZW9fbGVuZ3RoLnBvaW50ID0gbmV4dFBvaW50O1xuICAgIH07XG4gICAgZDNfZ2VvX2xlbmd0aC5saW5lRW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICBkM19nZW9fbGVuZ3RoLnBvaW50ID0gZDNfZ2VvX2xlbmd0aC5saW5lRW5kID0gZDNfbm9vcDtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIG5leHRQb2ludCjOuywgz4YpIHtcbiAgICAgIHZhciBzaW7PhiA9IE1hdGguc2luKM+GICo9IGQzX3JhZGlhbnMpLCBjb3PPhiA9IE1hdGguY29zKM+GKSwgdCA9IGFicygozrsgKj0gZDNfcmFkaWFucykgLSDOuzApLCBjb3POlM67ID0gTWF0aC5jb3ModCk7XG4gICAgICBkM19nZW9fbGVuZ3RoU3VtICs9IE1hdGguYXRhbjIoTWF0aC5zcXJ0KCh0ID0gY29zz4YgKiBNYXRoLnNpbih0KSkgKiB0ICsgKHQgPSBjb3PPhjAgKiBzaW7PhiAtIHNpbs+GMCAqIGNvc8+GICogY29zzpTOuykgKiB0KSwgc2luz4YwICogc2luz4YgKyBjb3PPhjAgKiBjb3PPhiAqIGNvc86UzrspO1xuICAgICAgzrswID0gzrssIHNpbs+GMCA9IHNpbs+GLCBjb3PPhjAgPSBjb3PPhjtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvX2F6aW11dGhhbChzY2FsZSwgYW5nbGUpIHtcbiAgICBmdW5jdGlvbiBhemltdXRoYWwozrssIM+GKSB7XG4gICAgICB2YXIgY29zzrsgPSBNYXRoLmNvcyjOuyksIGNvc8+GID0gTWF0aC5jb3Moz4YpLCBrID0gc2NhbGUoY29zzrsgKiBjb3PPhik7XG4gICAgICByZXR1cm4gWyBrICogY29zz4YgKiBNYXRoLnNpbijOuyksIGsgKiBNYXRoLnNpbijPhikgXTtcbiAgICB9XG4gICAgYXppbXV0aGFsLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICAgIHZhciDPgSA9IE1hdGguc3FydCh4ICogeCArIHkgKiB5KSwgYyA9IGFuZ2xlKM+BKSwgc2luYyA9IE1hdGguc2luKGMpLCBjb3NjID0gTWF0aC5jb3MoYyk7XG4gICAgICByZXR1cm4gWyBNYXRoLmF0YW4yKHggKiBzaW5jLCDPgSAqIGNvc2MpLCBNYXRoLmFzaW4oz4EgJiYgeSAqIHNpbmMgLyDPgSkgXTtcbiAgICB9O1xuICAgIHJldHVybiBhemltdXRoYWw7XG4gIH1cbiAgdmFyIGQzX2dlb19hemltdXRoYWxFcXVhbEFyZWEgPSBkM19nZW9fYXppbXV0aGFsKGZ1bmN0aW9uKGNvc867Y29zz4YpIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KDIgLyAoMSArIGNvc867Y29zz4YpKTtcbiAgfSwgZnVuY3Rpb24oz4EpIHtcbiAgICByZXR1cm4gMiAqIE1hdGguYXNpbijPgSAvIDIpO1xuICB9KTtcbiAgKGQzLmdlby5hemltdXRoYWxFcXVhbEFyZWEgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDNfZ2VvX3Byb2plY3Rpb24oZDNfZ2VvX2F6aW11dGhhbEVxdWFsQXJlYSk7XG4gIH0pLnJhdyA9IGQzX2dlb19hemltdXRoYWxFcXVhbEFyZWE7XG4gIHZhciBkM19nZW9fYXppbXV0aGFsRXF1aWRpc3RhbnQgPSBkM19nZW9fYXppbXV0aGFsKGZ1bmN0aW9uKGNvc867Y29zz4YpIHtcbiAgICB2YXIgYyA9IE1hdGguYWNvcyhjb3POu2Nvc8+GKTtcbiAgICByZXR1cm4gYyAmJiBjIC8gTWF0aC5zaW4oYyk7XG4gIH0sIGQzX2lkZW50aXR5KTtcbiAgKGQzLmdlby5hemltdXRoYWxFcXVpZGlzdGFudCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19nZW9fcHJvamVjdGlvbihkM19nZW9fYXppbXV0aGFsRXF1aWRpc3RhbnQpO1xuICB9KS5yYXcgPSBkM19nZW9fYXppbXV0aGFsRXF1aWRpc3RhbnQ7XG4gIGZ1bmN0aW9uIGQzX2dlb19jb25pY0NvbmZvcm1hbCjPhjAsIM+GMSkge1xuICAgIHZhciBjb3PPhjAgPSBNYXRoLmNvcyjPhjApLCB0ID0gZnVuY3Rpb24oz4YpIHtcbiAgICAgIHJldHVybiBNYXRoLnRhbijPgCAvIDQgKyDPhiAvIDIpO1xuICAgIH0sIG4gPSDPhjAgPT09IM+GMSA/IE1hdGguc2luKM+GMCkgOiBNYXRoLmxvZyhjb3PPhjAgLyBNYXRoLmNvcyjPhjEpKSAvIE1hdGgubG9nKHQoz4YxKSAvIHQoz4YwKSksIEYgPSBjb3PPhjAgKiBNYXRoLnBvdyh0KM+GMCksIG4pIC8gbjtcbiAgICBpZiAoIW4pIHJldHVybiBkM19nZW9fbWVyY2F0b3I7XG4gICAgZnVuY3Rpb24gZm9yd2FyZCjOuywgz4YpIHtcbiAgICAgIGlmIChGID4gMCkge1xuICAgICAgICBpZiAoz4YgPCAtaGFsZs+AICsgzrUpIM+GID0gLWhhbGbPgCArIM61O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKM+GID4gaGFsZs+AIC0gzrUpIM+GID0gaGFsZs+AIC0gzrU7XG4gICAgICB9XG4gICAgICB2YXIgz4EgPSBGIC8gTWF0aC5wb3codCjPhiksIG4pO1xuICAgICAgcmV0dXJuIFsgz4EgKiBNYXRoLnNpbihuICogzrspLCBGIC0gz4EgKiBNYXRoLmNvcyhuICogzrspIF07XG4gICAgfVxuICAgIGZvcndhcmQuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkge1xuICAgICAgdmFyIM+BMF95ID0gRiAtIHksIM+BID0gZDNfc2duKG4pICogTWF0aC5zcXJ0KHggKiB4ICsgz4EwX3kgKiDPgTBfeSk7XG4gICAgICByZXR1cm4gWyBNYXRoLmF0YW4yKHgsIM+BMF95KSAvIG4sIDIgKiBNYXRoLmF0YW4oTWF0aC5wb3coRiAvIM+BLCAxIC8gbikpIC0gaGFsZs+AIF07XG4gICAgfTtcbiAgICByZXR1cm4gZm9yd2FyZDtcbiAgfVxuICAoZDMuZ2VvLmNvbmljQ29uZm9ybWFsID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzX2dlb19jb25pYyhkM19nZW9fY29uaWNDb25mb3JtYWwpO1xuICB9KS5yYXcgPSBkM19nZW9fY29uaWNDb25mb3JtYWw7XG4gIGZ1bmN0aW9uIGQzX2dlb19jb25pY0VxdWlkaXN0YW50KM+GMCwgz4YxKSB7XG4gICAgdmFyIGNvc8+GMCA9IE1hdGguY29zKM+GMCksIG4gPSDPhjAgPT09IM+GMSA/IE1hdGguc2luKM+GMCkgOiAoY29zz4YwIC0gTWF0aC5jb3Moz4YxKSkgLyAoz4YxIC0gz4YwKSwgRyA9IGNvc8+GMCAvIG4gKyDPhjA7XG4gICAgaWYgKGFicyhuKSA8IM61KSByZXR1cm4gZDNfZ2VvX2VxdWlyZWN0YW5ndWxhcjtcbiAgICBmdW5jdGlvbiBmb3J3YXJkKM67LCDPhikge1xuICAgICAgdmFyIM+BID0gRyAtIM+GO1xuICAgICAgcmV0dXJuIFsgz4EgKiBNYXRoLnNpbihuICogzrspLCBHIC0gz4EgKiBNYXRoLmNvcyhuICogzrspIF07XG4gICAgfVxuICAgIGZvcndhcmQuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkge1xuICAgICAgdmFyIM+BMF95ID0gRyAtIHk7XG4gICAgICByZXR1cm4gWyBNYXRoLmF0YW4yKHgsIM+BMF95KSAvIG4sIEcgLSBkM19zZ24obikgKiBNYXRoLnNxcnQoeCAqIHggKyDPgTBfeSAqIM+BMF95KSBdO1xuICAgIH07XG4gICAgcmV0dXJuIGZvcndhcmQ7XG4gIH1cbiAgKGQzLmdlby5jb25pY0VxdWlkaXN0YW50ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzX2dlb19jb25pYyhkM19nZW9fY29uaWNFcXVpZGlzdGFudCk7XG4gIH0pLnJhdyA9IGQzX2dlb19jb25pY0VxdWlkaXN0YW50O1xuICB2YXIgZDNfZ2VvX2dub21vbmljID0gZDNfZ2VvX2F6aW11dGhhbChmdW5jdGlvbihjb3POu2Nvc8+GKSB7XG4gICAgcmV0dXJuIDEgLyBjb3POu2Nvc8+GO1xuICB9LCBNYXRoLmF0YW4pO1xuICAoZDMuZ2VvLmdub21vbmljID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzX2dlb19wcm9qZWN0aW9uKGQzX2dlb19nbm9tb25pYyk7XG4gIH0pLnJhdyA9IGQzX2dlb19nbm9tb25pYztcbiAgZnVuY3Rpb24gZDNfZ2VvX21lcmNhdG9yKM67LCDPhikge1xuICAgIHJldHVybiBbIM67LCBNYXRoLmxvZyhNYXRoLnRhbijPgCAvIDQgKyDPhiAvIDIpKSBdO1xuICB9XG4gIGQzX2dlb19tZXJjYXRvci5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgcmV0dXJuIFsgeCwgMiAqIE1hdGguYXRhbihNYXRoLmV4cCh5KSkgLSBoYWxmz4AgXTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfZ2VvX21lcmNhdG9yUHJvamVjdGlvbihwcm9qZWN0KSB7XG4gICAgdmFyIG0gPSBkM19nZW9fcHJvamVjdGlvbihwcm9qZWN0KSwgc2NhbGUgPSBtLnNjYWxlLCB0cmFuc2xhdGUgPSBtLnRyYW5zbGF0ZSwgY2xpcEV4dGVudCA9IG0uY2xpcEV4dGVudCwgY2xpcEF1dG87XG4gICAgbS5zY2FsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHYgPSBzY2FsZS5hcHBseShtLCBhcmd1bWVudHMpO1xuICAgICAgcmV0dXJuIHYgPT09IG0gPyBjbGlwQXV0byA/IG0uY2xpcEV4dGVudChudWxsKSA6IG0gOiB2O1xuICAgIH07XG4gICAgbS50cmFuc2xhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB2ID0gdHJhbnNsYXRlLmFwcGx5KG0sIGFyZ3VtZW50cyk7XG4gICAgICByZXR1cm4gdiA9PT0gbSA/IGNsaXBBdXRvID8gbS5jbGlwRXh0ZW50KG51bGwpIDogbSA6IHY7XG4gICAgfTtcbiAgICBtLmNsaXBFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgICB2YXIgdiA9IGNsaXBFeHRlbnQuYXBwbHkobSwgYXJndW1lbnRzKTtcbiAgICAgIGlmICh2ID09PSBtKSB7XG4gICAgICAgIGlmIChjbGlwQXV0byA9IF8gPT0gbnVsbCkge1xuICAgICAgICAgIHZhciBrID0gz4AgKiBzY2FsZSgpLCB0ID0gdHJhbnNsYXRlKCk7XG4gICAgICAgICAgY2xpcEV4dGVudChbIFsgdFswXSAtIGssIHRbMV0gLSBrIF0sIFsgdFswXSArIGssIHRbMV0gKyBrIF0gXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2xpcEF1dG8pIHtcbiAgICAgICAgdiA9IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gdjtcbiAgICB9O1xuICAgIHJldHVybiBtLmNsaXBFeHRlbnQobnVsbCk7XG4gIH1cbiAgKGQzLmdlby5tZXJjYXRvciA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19nZW9fbWVyY2F0b3JQcm9qZWN0aW9uKGQzX2dlb19tZXJjYXRvcik7XG4gIH0pLnJhdyA9IGQzX2dlb19tZXJjYXRvcjtcbiAgdmFyIGQzX2dlb19vcnRob2dyYXBoaWMgPSBkM19nZW9fYXppbXV0aGFsKGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAxO1xuICB9LCBNYXRoLmFzaW4pO1xuICAoZDMuZ2VvLm9ydGhvZ3JhcGhpYyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19nZW9fcHJvamVjdGlvbihkM19nZW9fb3J0aG9ncmFwaGljKTtcbiAgfSkucmF3ID0gZDNfZ2VvX29ydGhvZ3JhcGhpYztcbiAgdmFyIGQzX2dlb19zdGVyZW9ncmFwaGljID0gZDNfZ2VvX2F6aW11dGhhbChmdW5jdGlvbihjb3POu2Nvc8+GKSB7XG4gICAgcmV0dXJuIDEgLyAoMSArIGNvc867Y29zz4YpO1xuICB9LCBmdW5jdGlvbijPgSkge1xuICAgIHJldHVybiAyICogTWF0aC5hdGFuKM+BKTtcbiAgfSk7XG4gIChkMy5nZW8uc3RlcmVvZ3JhcGhpYyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19nZW9fcHJvamVjdGlvbihkM19nZW9fc3RlcmVvZ3JhcGhpYyk7XG4gIH0pLnJhdyA9IGQzX2dlb19zdGVyZW9ncmFwaGljO1xuICBmdW5jdGlvbiBkM19nZW9fdHJhbnN2ZXJzZU1lcmNhdG9yKM67LCDPhikge1xuICAgIHJldHVybiBbIE1hdGgubG9nKE1hdGgudGFuKM+AIC8gNCArIM+GIC8gMikpLCAtzrsgXTtcbiAgfVxuICBkM19nZW9fdHJhbnN2ZXJzZU1lcmNhdG9yLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgICByZXR1cm4gWyAteSwgMiAqIE1hdGguYXRhbihNYXRoLmV4cCh4KSkgLSBoYWxmz4AgXTtcbiAgfTtcbiAgKGQzLmdlby50cmFuc3ZlcnNlTWVyY2F0b3IgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcHJvamVjdGlvbiA9IGQzX2dlb19tZXJjYXRvclByb2plY3Rpb24oZDNfZ2VvX3RyYW5zdmVyc2VNZXJjYXRvciksIGNlbnRlciA9IHByb2plY3Rpb24uY2VudGVyLCByb3RhdGUgPSBwcm9qZWN0aW9uLnJvdGF0ZTtcbiAgICBwcm9qZWN0aW9uLmNlbnRlciA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBfID8gY2VudGVyKFsgLV9bMV0sIF9bMF0gXSkgOiAoXyA9IGNlbnRlcigpLCBbIF9bMV0sIC1fWzBdIF0pO1xuICAgIH07XG4gICAgcHJvamVjdGlvbi5yb3RhdGUgPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gXyA/IHJvdGF0ZShbIF9bMF0sIF9bMV0sIF8ubGVuZ3RoID4gMiA/IF9bMl0gKyA5MCA6IDkwIF0pIDogKF8gPSByb3RhdGUoKSwgXG4gICAgICBbIF9bMF0sIF9bMV0sIF9bMl0gLSA5MCBdKTtcbiAgICB9O1xuICAgIHJldHVybiByb3RhdGUoWyAwLCAwLCA5MCBdKTtcbiAgfSkucmF3ID0gZDNfZ2VvX3RyYW5zdmVyc2VNZXJjYXRvcjtcbiAgZDMuZ2VvbSA9IHt9O1xuICBmdW5jdGlvbiBkM19nZW9tX3BvaW50WChkKSB7XG4gICAgcmV0dXJuIGRbMF07XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV9wb2ludFkoZCkge1xuICAgIHJldHVybiBkWzFdO1xuICB9XG4gIGQzLmdlb20uaHVsbCA9IGZ1bmN0aW9uKHZlcnRpY2VzKSB7XG4gICAgdmFyIHggPSBkM19nZW9tX3BvaW50WCwgeSA9IGQzX2dlb21fcG9pbnRZO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gaHVsbCh2ZXJ0aWNlcyk7XG4gICAgZnVuY3Rpb24gaHVsbChkYXRhKSB7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPCAzKSByZXR1cm4gW107XG4gICAgICB2YXIgZnggPSBkM19mdW5jdG9yKHgpLCBmeSA9IGQzX2Z1bmN0b3IoeSksIGksIG4gPSBkYXRhLmxlbmd0aCwgcG9pbnRzID0gW10sIGZsaXBwZWRQb2ludHMgPSBbXTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgcG9pbnRzLnB1c2goWyArZnguY2FsbCh0aGlzLCBkYXRhW2ldLCBpKSwgK2Z5LmNhbGwodGhpcywgZGF0YVtpXSwgaSksIGkgXSk7XG4gICAgICB9XG4gICAgICBwb2ludHMuc29ydChkM19nZW9tX2h1bGxPcmRlcik7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSBmbGlwcGVkUG9pbnRzLnB1c2goWyBwb2ludHNbaV1bMF0sIC1wb2ludHNbaV1bMV0gXSk7XG4gICAgICB2YXIgdXBwZXIgPSBkM19nZW9tX2h1bGxVcHBlcihwb2ludHMpLCBsb3dlciA9IGQzX2dlb21faHVsbFVwcGVyKGZsaXBwZWRQb2ludHMpO1xuICAgICAgdmFyIHNraXBMZWZ0ID0gbG93ZXJbMF0gPT09IHVwcGVyWzBdLCBza2lwUmlnaHQgPSBsb3dlcltsb3dlci5sZW5ndGggLSAxXSA9PT0gdXBwZXJbdXBwZXIubGVuZ3RoIC0gMV0sIHBvbHlnb24gPSBbXTtcbiAgICAgIGZvciAoaSA9IHVwcGVyLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSBwb2x5Z29uLnB1c2goZGF0YVtwb2ludHNbdXBwZXJbaV1dWzJdXSk7XG4gICAgICBmb3IgKGkgPSArc2tpcExlZnQ7IGkgPCBsb3dlci5sZW5ndGggLSBza2lwUmlnaHQ7ICsraSkgcG9seWdvbi5wdXNoKGRhdGFbcG9pbnRzW2xvd2VyW2ldXVsyXV0pO1xuICAgICAgcmV0dXJuIHBvbHlnb247XG4gICAgfVxuICAgIGh1bGwueCA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSBfLCBodWxsKSA6IHg7XG4gICAgfTtcbiAgICBodWxsLnkgPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gXywgaHVsbCkgOiB5O1xuICAgIH07XG4gICAgcmV0dXJuIGh1bGw7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2dlb21faHVsbFVwcGVyKHBvaW50cykge1xuICAgIHZhciBuID0gcG9pbnRzLmxlbmd0aCwgaHVsbCA9IFsgMCwgMSBdLCBocyA9IDI7XG4gICAgZm9yICh2YXIgaSA9IDI7IGkgPCBuOyBpKyspIHtcbiAgICAgIHdoaWxlIChocyA+IDEgJiYgZDNfY3Jvc3MyZChwb2ludHNbaHVsbFtocyAtIDJdXSwgcG9pbnRzW2h1bGxbaHMgLSAxXV0sIHBvaW50c1tpXSkgPD0gMCkgLS1ocztcbiAgICAgIGh1bGxbaHMrK10gPSBpO1xuICAgIH1cbiAgICByZXR1cm4gaHVsbC5zbGljZSgwLCBocyk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV9odWxsT3JkZXIoYSwgYikge1xuICAgIHJldHVybiBhWzBdIC0gYlswXSB8fCBhWzFdIC0gYlsxXTtcbiAgfVxuICBkMy5nZW9tLnBvbHlnb24gPSBmdW5jdGlvbihjb29yZGluYXRlcykge1xuICAgIGQzX3N1YmNsYXNzKGNvb3JkaW5hdGVzLCBkM19nZW9tX3BvbHlnb25Qcm90b3R5cGUpO1xuICAgIHJldHVybiBjb29yZGluYXRlcztcbiAgfTtcbiAgdmFyIGQzX2dlb21fcG9seWdvblByb3RvdHlwZSA9IGQzLmdlb20ucG9seWdvbi5wcm90b3R5cGUgPSBbXTtcbiAgZDNfZ2VvbV9wb2x5Z29uUHJvdG90eXBlLmFyZWEgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaSA9IC0xLCBuID0gdGhpcy5sZW5ndGgsIGEsIGIgPSB0aGlzW24gLSAxXSwgYXJlYSA9IDA7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGEgPSBiO1xuICAgICAgYiA9IHRoaXNbaV07XG4gICAgICBhcmVhICs9IGFbMV0gKiBiWzBdIC0gYVswXSAqIGJbMV07XG4gICAgfVxuICAgIHJldHVybiBhcmVhICogLjU7XG4gIH07XG4gIGQzX2dlb21fcG9seWdvblByb3RvdHlwZS5jZW50cm9pZCA9IGZ1bmN0aW9uKGspIHtcbiAgICB2YXIgaSA9IC0xLCBuID0gdGhpcy5sZW5ndGgsIHggPSAwLCB5ID0gMCwgYSwgYiA9IHRoaXNbbiAtIDFdLCBjO1xuICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgayA9IC0xIC8gKDYgKiB0aGlzLmFyZWEoKSk7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGEgPSBiO1xuICAgICAgYiA9IHRoaXNbaV07XG4gICAgICBjID0gYVswXSAqIGJbMV0gLSBiWzBdICogYVsxXTtcbiAgICAgIHggKz0gKGFbMF0gKyBiWzBdKSAqIGM7XG4gICAgICB5ICs9IChhWzFdICsgYlsxXSkgKiBjO1xuICAgIH1cbiAgICByZXR1cm4gWyB4ICogaywgeSAqIGsgXTtcbiAgfTtcbiAgZDNfZ2VvbV9wb2x5Z29uUHJvdG90eXBlLmNsaXAgPSBmdW5jdGlvbihzdWJqZWN0KSB7XG4gICAgdmFyIGlucHV0LCBjbG9zZWQgPSBkM19nZW9tX3BvbHlnb25DbG9zZWQoc3ViamVjdCksIGkgPSAtMSwgbiA9IHRoaXMubGVuZ3RoIC0gZDNfZ2VvbV9wb2x5Z29uQ2xvc2VkKHRoaXMpLCBqLCBtLCBhID0gdGhpc1tuIC0gMV0sIGIsIGMsIGQ7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIGlucHV0ID0gc3ViamVjdC5zbGljZSgpO1xuICAgICAgc3ViamVjdC5sZW5ndGggPSAwO1xuICAgICAgYiA9IHRoaXNbaV07XG4gICAgICBjID0gaW5wdXRbKG0gPSBpbnB1dC5sZW5ndGggLSBjbG9zZWQpIC0gMV07XG4gICAgICBqID0gLTE7XG4gICAgICB3aGlsZSAoKytqIDwgbSkge1xuICAgICAgICBkID0gaW5wdXRbal07XG4gICAgICAgIGlmIChkM19nZW9tX3BvbHlnb25JbnNpZGUoZCwgYSwgYikpIHtcbiAgICAgICAgICBpZiAoIWQzX2dlb21fcG9seWdvbkluc2lkZShjLCBhLCBiKSkge1xuICAgICAgICAgICAgc3ViamVjdC5wdXNoKGQzX2dlb21fcG9seWdvbkludGVyc2VjdChjLCBkLCBhLCBiKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN1YmplY3QucHVzaChkKTtcbiAgICAgICAgfSBlbHNlIGlmIChkM19nZW9tX3BvbHlnb25JbnNpZGUoYywgYSwgYikpIHtcbiAgICAgICAgICBzdWJqZWN0LnB1c2goZDNfZ2VvbV9wb2x5Z29uSW50ZXJzZWN0KGMsIGQsIGEsIGIpKTtcbiAgICAgICAgfVxuICAgICAgICBjID0gZDtcbiAgICAgIH1cbiAgICAgIGlmIChjbG9zZWQpIHN1YmplY3QucHVzaChzdWJqZWN0WzBdKTtcbiAgICAgIGEgPSBiO1xuICAgIH1cbiAgICByZXR1cm4gc3ViamVjdDtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfZ2VvbV9wb2x5Z29uSW5zaWRlKHAsIGEsIGIpIHtcbiAgICByZXR1cm4gKGJbMF0gLSBhWzBdKSAqIChwWzFdIC0gYVsxXSkgPCAoYlsxXSAtIGFbMV0pICogKHBbMF0gLSBhWzBdKTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3BvbHlnb25JbnRlcnNlY3QoYywgZCwgYSwgYikge1xuICAgIHZhciB4MSA9IGNbMF0sIHgzID0gYVswXSwgeDIxID0gZFswXSAtIHgxLCB4NDMgPSBiWzBdIC0geDMsIHkxID0gY1sxXSwgeTMgPSBhWzFdLCB5MjEgPSBkWzFdIC0geTEsIHk0MyA9IGJbMV0gLSB5MywgdWEgPSAoeDQzICogKHkxIC0geTMpIC0geTQzICogKHgxIC0geDMpKSAvICh5NDMgKiB4MjEgLSB4NDMgKiB5MjEpO1xuICAgIHJldHVybiBbIHgxICsgdWEgKiB4MjEsIHkxICsgdWEgKiB5MjEgXTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3BvbHlnb25DbG9zZWQoY29vcmRpbmF0ZXMpIHtcbiAgICB2YXIgYSA9IGNvb3JkaW5hdGVzWzBdLCBiID0gY29vcmRpbmF0ZXNbY29vcmRpbmF0ZXMubGVuZ3RoIC0gMV07XG4gICAgcmV0dXJuICEoYVswXSAtIGJbMF0gfHwgYVsxXSAtIGJbMV0pO1xuICB9XG4gIHZhciBkM19nZW9tX3Zvcm9ub2lFZGdlcywgZDNfZ2VvbV92b3Jvbm9pQ2VsbHMsIGQzX2dlb21fdm9yb25vaUJlYWNoZXMsIGQzX2dlb21fdm9yb25vaUJlYWNoUG9vbCA9IFtdLCBkM19nZW9tX3Zvcm9ub2lGaXJzdENpcmNsZSwgZDNfZ2VvbV92b3Jvbm9pQ2lyY2xlcywgZDNfZ2VvbV92b3Jvbm9pQ2lyY2xlUG9vbCA9IFtdO1xuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lCZWFjaCgpIHtcbiAgICBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja05vZGUodGhpcyk7XG4gICAgdGhpcy5lZGdlID0gdGhpcy5zaXRlID0gdGhpcy5jaXJjbGUgPSBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaUNyZWF0ZUJlYWNoKHNpdGUpIHtcbiAgICB2YXIgYmVhY2ggPSBkM19nZW9tX3Zvcm9ub2lCZWFjaFBvb2wucG9wKCkgfHwgbmV3IGQzX2dlb21fdm9yb25vaUJlYWNoKCk7XG4gICAgYmVhY2guc2l0ZSA9IHNpdGU7XG4gICAgcmV0dXJuIGJlYWNoO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaURldGFjaEJlYWNoKGJlYWNoKSB7XG4gICAgZDNfZ2VvbV92b3Jvbm9pRGV0YWNoQ2lyY2xlKGJlYWNoKTtcbiAgICBkM19nZW9tX3Zvcm9ub2lCZWFjaGVzLnJlbW92ZShiZWFjaCk7XG4gICAgZDNfZ2VvbV92b3Jvbm9pQmVhY2hQb29sLnB1c2goYmVhY2gpO1xuICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrTm9kZShiZWFjaCk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pUmVtb3ZlQmVhY2goYmVhY2gpIHtcbiAgICB2YXIgY2lyY2xlID0gYmVhY2guY2lyY2xlLCB4ID0gY2lyY2xlLngsIHkgPSBjaXJjbGUuY3ksIHZlcnRleCA9IHtcbiAgICAgIHg6IHgsXG4gICAgICB5OiB5XG4gICAgfSwgcHJldmlvdXMgPSBiZWFjaC5QLCBuZXh0ID0gYmVhY2guTiwgZGlzYXBwZWFyaW5nID0gWyBiZWFjaCBdO1xuICAgIGQzX2dlb21fdm9yb25vaURldGFjaEJlYWNoKGJlYWNoKTtcbiAgICB2YXIgbEFyYyA9IHByZXZpb3VzO1xuICAgIHdoaWxlIChsQXJjLmNpcmNsZSAmJiBhYnMoeCAtIGxBcmMuY2lyY2xlLngpIDwgzrUgJiYgYWJzKHkgLSBsQXJjLmNpcmNsZS5jeSkgPCDOtSkge1xuICAgICAgcHJldmlvdXMgPSBsQXJjLlA7XG4gICAgICBkaXNhcHBlYXJpbmcudW5zaGlmdChsQXJjKTtcbiAgICAgIGQzX2dlb21fdm9yb25vaURldGFjaEJlYWNoKGxBcmMpO1xuICAgICAgbEFyYyA9IHByZXZpb3VzO1xuICAgIH1cbiAgICBkaXNhcHBlYXJpbmcudW5zaGlmdChsQXJjKTtcbiAgICBkM19nZW9tX3Zvcm9ub2lEZXRhY2hDaXJjbGUobEFyYyk7XG4gICAgdmFyIHJBcmMgPSBuZXh0O1xuICAgIHdoaWxlIChyQXJjLmNpcmNsZSAmJiBhYnMoeCAtIHJBcmMuY2lyY2xlLngpIDwgzrUgJiYgYWJzKHkgLSByQXJjLmNpcmNsZS5jeSkgPCDOtSkge1xuICAgICAgbmV4dCA9IHJBcmMuTjtcbiAgICAgIGRpc2FwcGVhcmluZy5wdXNoKHJBcmMpO1xuICAgICAgZDNfZ2VvbV92b3Jvbm9pRGV0YWNoQmVhY2gockFyYyk7XG4gICAgICByQXJjID0gbmV4dDtcbiAgICB9XG4gICAgZGlzYXBwZWFyaW5nLnB1c2gockFyYyk7XG4gICAgZDNfZ2VvbV92b3Jvbm9pRGV0YWNoQ2lyY2xlKHJBcmMpO1xuICAgIHZhciBuQXJjcyA9IGRpc2FwcGVhcmluZy5sZW5ndGgsIGlBcmM7XG4gICAgZm9yIChpQXJjID0gMTsgaUFyYyA8IG5BcmNzOyArK2lBcmMpIHtcbiAgICAgIHJBcmMgPSBkaXNhcHBlYXJpbmdbaUFyY107XG4gICAgICBsQXJjID0gZGlzYXBwZWFyaW5nW2lBcmMgLSAxXTtcbiAgICAgIGQzX2dlb21fdm9yb25vaVNldEVkZ2VFbmQockFyYy5lZGdlLCBsQXJjLnNpdGUsIHJBcmMuc2l0ZSwgdmVydGV4KTtcbiAgICB9XG4gICAgbEFyYyA9IGRpc2FwcGVhcmluZ1swXTtcbiAgICByQXJjID0gZGlzYXBwZWFyaW5nW25BcmNzIC0gMV07XG4gICAgckFyYy5lZGdlID0gZDNfZ2VvbV92b3Jvbm9pQ3JlYXRlRWRnZShsQXJjLnNpdGUsIHJBcmMuc2l0ZSwgbnVsbCwgdmVydGV4KTtcbiAgICBkM19nZW9tX3Zvcm9ub2lBdHRhY2hDaXJjbGUobEFyYyk7XG4gICAgZDNfZ2VvbV92b3Jvbm9pQXR0YWNoQ2lyY2xlKHJBcmMpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaUFkZEJlYWNoKHNpdGUpIHtcbiAgICB2YXIgeCA9IHNpdGUueCwgZGlyZWN0cml4ID0gc2l0ZS55LCBsQXJjLCByQXJjLCBkeGwsIGR4ciwgbm9kZSA9IGQzX2dlb21fdm9yb25vaUJlYWNoZXMuXztcbiAgICB3aGlsZSAobm9kZSkge1xuICAgICAgZHhsID0gZDNfZ2VvbV92b3Jvbm9pTGVmdEJyZWFrUG9pbnQobm9kZSwgZGlyZWN0cml4KSAtIHg7XG4gICAgICBpZiAoZHhsID4gzrUpIG5vZGUgPSBub2RlLkw7IGVsc2Uge1xuICAgICAgICBkeHIgPSB4IC0gZDNfZ2VvbV92b3Jvbm9pUmlnaHRCcmVha1BvaW50KG5vZGUsIGRpcmVjdHJpeCk7XG4gICAgICAgIGlmIChkeHIgPiDOtSkge1xuICAgICAgICAgIGlmICghbm9kZS5SKSB7XG4gICAgICAgICAgICBsQXJjID0gbm9kZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBub2RlID0gbm9kZS5SO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChkeGwgPiAtzrUpIHtcbiAgICAgICAgICAgIGxBcmMgPSBub2RlLlA7XG4gICAgICAgICAgICByQXJjID0gbm9kZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGR4ciA+IC3OtSkge1xuICAgICAgICAgICAgbEFyYyA9IG5vZGU7XG4gICAgICAgICAgICByQXJjID0gbm9kZS5OO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsQXJjID0gckFyYyA9IG5vZGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHZhciBuZXdBcmMgPSBkM19nZW9tX3Zvcm9ub2lDcmVhdGVCZWFjaChzaXRlKTtcbiAgICBkM19nZW9tX3Zvcm9ub2lCZWFjaGVzLmluc2VydChsQXJjLCBuZXdBcmMpO1xuICAgIGlmICghbEFyYyAmJiAhckFyYykgcmV0dXJuO1xuICAgIGlmIChsQXJjID09PSByQXJjKSB7XG4gICAgICBkM19nZW9tX3Zvcm9ub2lEZXRhY2hDaXJjbGUobEFyYyk7XG4gICAgICByQXJjID0gZDNfZ2VvbV92b3Jvbm9pQ3JlYXRlQmVhY2gobEFyYy5zaXRlKTtcbiAgICAgIGQzX2dlb21fdm9yb25vaUJlYWNoZXMuaW5zZXJ0KG5ld0FyYywgckFyYyk7XG4gICAgICBuZXdBcmMuZWRnZSA9IHJBcmMuZWRnZSA9IGQzX2dlb21fdm9yb25vaUNyZWF0ZUVkZ2UobEFyYy5zaXRlLCBuZXdBcmMuc2l0ZSk7XG4gICAgICBkM19nZW9tX3Zvcm9ub2lBdHRhY2hDaXJjbGUobEFyYyk7XG4gICAgICBkM19nZW9tX3Zvcm9ub2lBdHRhY2hDaXJjbGUockFyYyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghckFyYykge1xuICAgICAgbmV3QXJjLmVkZ2UgPSBkM19nZW9tX3Zvcm9ub2lDcmVhdGVFZGdlKGxBcmMuc2l0ZSwgbmV3QXJjLnNpdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkM19nZW9tX3Zvcm9ub2lEZXRhY2hDaXJjbGUobEFyYyk7XG4gICAgZDNfZ2VvbV92b3Jvbm9pRGV0YWNoQ2lyY2xlKHJBcmMpO1xuICAgIHZhciBsU2l0ZSA9IGxBcmMuc2l0ZSwgYXggPSBsU2l0ZS54LCBheSA9IGxTaXRlLnksIGJ4ID0gc2l0ZS54IC0gYXgsIGJ5ID0gc2l0ZS55IC0gYXksIHJTaXRlID0gckFyYy5zaXRlLCBjeCA9IHJTaXRlLnggLSBheCwgY3kgPSByU2l0ZS55IC0gYXksIGQgPSAyICogKGJ4ICogY3kgLSBieSAqIGN4KSwgaGIgPSBieCAqIGJ4ICsgYnkgKiBieSwgaGMgPSBjeCAqIGN4ICsgY3kgKiBjeSwgdmVydGV4ID0ge1xuICAgICAgeDogKGN5ICogaGIgLSBieSAqIGhjKSAvIGQgKyBheCxcbiAgICAgIHk6IChieCAqIGhjIC0gY3ggKiBoYikgLyBkICsgYXlcbiAgICB9O1xuICAgIGQzX2dlb21fdm9yb25vaVNldEVkZ2VFbmQockFyYy5lZGdlLCBsU2l0ZSwgclNpdGUsIHZlcnRleCk7XG4gICAgbmV3QXJjLmVkZ2UgPSBkM19nZW9tX3Zvcm9ub2lDcmVhdGVFZGdlKGxTaXRlLCBzaXRlLCBudWxsLCB2ZXJ0ZXgpO1xuICAgIHJBcmMuZWRnZSA9IGQzX2dlb21fdm9yb25vaUNyZWF0ZUVkZ2Uoc2l0ZSwgclNpdGUsIG51bGwsIHZlcnRleCk7XG4gICAgZDNfZ2VvbV92b3Jvbm9pQXR0YWNoQ2lyY2xlKGxBcmMpO1xuICAgIGQzX2dlb21fdm9yb25vaUF0dGFjaENpcmNsZShyQXJjKTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lMZWZ0QnJlYWtQb2ludChhcmMsIGRpcmVjdHJpeCkge1xuICAgIHZhciBzaXRlID0gYXJjLnNpdGUsIHJmb2N4ID0gc2l0ZS54LCByZm9jeSA9IHNpdGUueSwgcGJ5MiA9IHJmb2N5IC0gZGlyZWN0cml4O1xuICAgIGlmICghcGJ5MikgcmV0dXJuIHJmb2N4O1xuICAgIHZhciBsQXJjID0gYXJjLlA7XG4gICAgaWYgKCFsQXJjKSByZXR1cm4gLUluZmluaXR5O1xuICAgIHNpdGUgPSBsQXJjLnNpdGU7XG4gICAgdmFyIGxmb2N4ID0gc2l0ZS54LCBsZm9jeSA9IHNpdGUueSwgcGxieTIgPSBsZm9jeSAtIGRpcmVjdHJpeDtcbiAgICBpZiAoIXBsYnkyKSByZXR1cm4gbGZvY3g7XG4gICAgdmFyIGhsID0gbGZvY3ggLSByZm9jeCwgYWJ5MiA9IDEgLyBwYnkyIC0gMSAvIHBsYnkyLCBiID0gaGwgLyBwbGJ5MjtcbiAgICBpZiAoYWJ5MikgcmV0dXJuICgtYiArIE1hdGguc3FydChiICogYiAtIDIgKiBhYnkyICogKGhsICogaGwgLyAoLTIgKiBwbGJ5MikgLSBsZm9jeSArIHBsYnkyIC8gMiArIHJmb2N5IC0gcGJ5MiAvIDIpKSkgLyBhYnkyICsgcmZvY3g7XG4gICAgcmV0dXJuIChyZm9jeCArIGxmb2N4KSAvIDI7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pUmlnaHRCcmVha1BvaW50KGFyYywgZGlyZWN0cml4KSB7XG4gICAgdmFyIHJBcmMgPSBhcmMuTjtcbiAgICBpZiAockFyYykgcmV0dXJuIGQzX2dlb21fdm9yb25vaUxlZnRCcmVha1BvaW50KHJBcmMsIGRpcmVjdHJpeCk7XG4gICAgdmFyIHNpdGUgPSBhcmMuc2l0ZTtcbiAgICByZXR1cm4gc2l0ZS55ID09PSBkaXJlY3RyaXggPyBzaXRlLnggOiBJbmZpbml0eTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lDZWxsKHNpdGUpIHtcbiAgICB0aGlzLnNpdGUgPSBzaXRlO1xuICAgIHRoaXMuZWRnZXMgPSBbXTtcbiAgfVxuICBkM19nZW9tX3Zvcm9ub2lDZWxsLnByb3RvdHlwZS5wcmVwYXJlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGhhbGZFZGdlcyA9IHRoaXMuZWRnZXMsIGlIYWxmRWRnZSA9IGhhbGZFZGdlcy5sZW5ndGgsIGVkZ2U7XG4gICAgd2hpbGUgKGlIYWxmRWRnZS0tKSB7XG4gICAgICBlZGdlID0gaGFsZkVkZ2VzW2lIYWxmRWRnZV0uZWRnZTtcbiAgICAgIGlmICghZWRnZS5iIHx8ICFlZGdlLmEpIGhhbGZFZGdlcy5zcGxpY2UoaUhhbGZFZGdlLCAxKTtcbiAgICB9XG4gICAgaGFsZkVkZ2VzLnNvcnQoZDNfZ2VvbV92b3Jvbm9pSGFsZkVkZ2VPcmRlcik7XG4gICAgcmV0dXJuIGhhbGZFZGdlcy5sZW5ndGg7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaUNsb3NlQ2VsbHMoZXh0ZW50KSB7XG4gICAgdmFyIHgwID0gZXh0ZW50WzBdWzBdLCB4MSA9IGV4dGVudFsxXVswXSwgeTAgPSBleHRlbnRbMF1bMV0sIHkxID0gZXh0ZW50WzFdWzFdLCB4MiwgeTIsIHgzLCB5MywgY2VsbHMgPSBkM19nZW9tX3Zvcm9ub2lDZWxscywgaUNlbGwgPSBjZWxscy5sZW5ndGgsIGNlbGwsIGlIYWxmRWRnZSwgaGFsZkVkZ2VzLCBuSGFsZkVkZ2VzLCBzdGFydCwgZW5kO1xuICAgIHdoaWxlIChpQ2VsbC0tKSB7XG4gICAgICBjZWxsID0gY2VsbHNbaUNlbGxdO1xuICAgICAgaWYgKCFjZWxsIHx8ICFjZWxsLnByZXBhcmUoKSkgY29udGludWU7XG4gICAgICBoYWxmRWRnZXMgPSBjZWxsLmVkZ2VzO1xuICAgICAgbkhhbGZFZGdlcyA9IGhhbGZFZGdlcy5sZW5ndGg7XG4gICAgICBpSGFsZkVkZ2UgPSAwO1xuICAgICAgd2hpbGUgKGlIYWxmRWRnZSA8IG5IYWxmRWRnZXMpIHtcbiAgICAgICAgZW5kID0gaGFsZkVkZ2VzW2lIYWxmRWRnZV0uZW5kKCksIHgzID0gZW5kLngsIHkzID0gZW5kLnk7XG4gICAgICAgIHN0YXJ0ID0gaGFsZkVkZ2VzWysraUhhbGZFZGdlICUgbkhhbGZFZGdlc10uc3RhcnQoKSwgeDIgPSBzdGFydC54LCB5MiA9IHN0YXJ0Lnk7XG4gICAgICAgIGlmIChhYnMoeDMgLSB4MikgPiDOtSB8fCBhYnMoeTMgLSB5MikgPiDOtSkge1xuICAgICAgICAgIGhhbGZFZGdlcy5zcGxpY2UoaUhhbGZFZGdlLCAwLCBuZXcgZDNfZ2VvbV92b3Jvbm9pSGFsZkVkZ2UoZDNfZ2VvbV92b3Jvbm9pQ3JlYXRlQm9yZGVyRWRnZShjZWxsLnNpdGUsIGVuZCwgYWJzKHgzIC0geDApIDwgzrUgJiYgeTEgLSB5MyA+IM61ID8ge1xuICAgICAgICAgICAgeDogeDAsXG4gICAgICAgICAgICB5OiBhYnMoeDIgLSB4MCkgPCDOtSA/IHkyIDogeTFcbiAgICAgICAgICB9IDogYWJzKHkzIC0geTEpIDwgzrUgJiYgeDEgLSB4MyA+IM61ID8ge1xuICAgICAgICAgICAgeDogYWJzKHkyIC0geTEpIDwgzrUgPyB4MiA6IHgxLFxuICAgICAgICAgICAgeTogeTFcbiAgICAgICAgICB9IDogYWJzKHgzIC0geDEpIDwgzrUgJiYgeTMgLSB5MCA+IM61ID8ge1xuICAgICAgICAgICAgeDogeDEsXG4gICAgICAgICAgICB5OiBhYnMoeDIgLSB4MSkgPCDOtSA/IHkyIDogeTBcbiAgICAgICAgICB9IDogYWJzKHkzIC0geTApIDwgzrUgJiYgeDMgLSB4MCA+IM61ID8ge1xuICAgICAgICAgICAgeDogYWJzKHkyIC0geTApIDwgzrUgPyB4MiA6IHgwLFxuICAgICAgICAgICAgeTogeTBcbiAgICAgICAgICB9IDogbnVsbCksIGNlbGwuc2l0ZSwgbnVsbCkpO1xuICAgICAgICAgICsrbkhhbGZFZGdlcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lIYWxmRWRnZU9yZGVyKGEsIGIpIHtcbiAgICByZXR1cm4gYi5hbmdsZSAtIGEuYW5nbGU7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pQ2lyY2xlKCkge1xuICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrTm9kZSh0aGlzKTtcbiAgICB0aGlzLnggPSB0aGlzLnkgPSB0aGlzLmFyYyA9IHRoaXMuc2l0ZSA9IHRoaXMuY3kgPSBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaUF0dGFjaENpcmNsZShhcmMpIHtcbiAgICB2YXIgbEFyYyA9IGFyYy5QLCByQXJjID0gYXJjLk47XG4gICAgaWYgKCFsQXJjIHx8ICFyQXJjKSByZXR1cm47XG4gICAgdmFyIGxTaXRlID0gbEFyYy5zaXRlLCBjU2l0ZSA9IGFyYy5zaXRlLCByU2l0ZSA9IHJBcmMuc2l0ZTtcbiAgICBpZiAobFNpdGUgPT09IHJTaXRlKSByZXR1cm47XG4gICAgdmFyIGJ4ID0gY1NpdGUueCwgYnkgPSBjU2l0ZS55LCBheCA9IGxTaXRlLnggLSBieCwgYXkgPSBsU2l0ZS55IC0gYnksIGN4ID0gclNpdGUueCAtIGJ4LCBjeSA9IHJTaXRlLnkgLSBieTtcbiAgICB2YXIgZCA9IDIgKiAoYXggKiBjeSAtIGF5ICogY3gpO1xuICAgIGlmIChkID49IC3OtTIpIHJldHVybjtcbiAgICB2YXIgaGEgPSBheCAqIGF4ICsgYXkgKiBheSwgaGMgPSBjeCAqIGN4ICsgY3kgKiBjeSwgeCA9IChjeSAqIGhhIC0gYXkgKiBoYykgLyBkLCB5ID0gKGF4ICogaGMgLSBjeCAqIGhhKSAvIGQsIGN5ID0geSArIGJ5O1xuICAgIHZhciBjaXJjbGUgPSBkM19nZW9tX3Zvcm9ub2lDaXJjbGVQb29sLnBvcCgpIHx8IG5ldyBkM19nZW9tX3Zvcm9ub2lDaXJjbGUoKTtcbiAgICBjaXJjbGUuYXJjID0gYXJjO1xuICAgIGNpcmNsZS5zaXRlID0gY1NpdGU7XG4gICAgY2lyY2xlLnggPSB4ICsgYng7XG4gICAgY2lyY2xlLnkgPSBjeSArIE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbiAgICBjaXJjbGUuY3kgPSBjeTtcbiAgICBhcmMuY2lyY2xlID0gY2lyY2xlO1xuICAgIHZhciBiZWZvcmUgPSBudWxsLCBub2RlID0gZDNfZ2VvbV92b3Jvbm9pQ2lyY2xlcy5fO1xuICAgIHdoaWxlIChub2RlKSB7XG4gICAgICBpZiAoY2lyY2xlLnkgPCBub2RlLnkgfHwgY2lyY2xlLnkgPT09IG5vZGUueSAmJiBjaXJjbGUueCA8PSBub2RlLngpIHtcbiAgICAgICAgaWYgKG5vZGUuTCkgbm9kZSA9IG5vZGUuTDsgZWxzZSB7XG4gICAgICAgICAgYmVmb3JlID0gbm9kZS5QO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAobm9kZS5SKSBub2RlID0gbm9kZS5SOyBlbHNlIHtcbiAgICAgICAgICBiZWZvcmUgPSBub2RlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGQzX2dlb21fdm9yb25vaUNpcmNsZXMuaW5zZXJ0KGJlZm9yZSwgY2lyY2xlKTtcbiAgICBpZiAoIWJlZm9yZSkgZDNfZ2VvbV92b3Jvbm9pRmlyc3RDaXJjbGUgPSBjaXJjbGU7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pRGV0YWNoQ2lyY2xlKGFyYykge1xuICAgIHZhciBjaXJjbGUgPSBhcmMuY2lyY2xlO1xuICAgIGlmIChjaXJjbGUpIHtcbiAgICAgIGlmICghY2lyY2xlLlApIGQzX2dlb21fdm9yb25vaUZpcnN0Q2lyY2xlID0gY2lyY2xlLk47XG4gICAgICBkM19nZW9tX3Zvcm9ub2lDaXJjbGVzLnJlbW92ZShjaXJjbGUpO1xuICAgICAgZDNfZ2VvbV92b3Jvbm9pQ2lyY2xlUG9vbC5wdXNoKGNpcmNsZSk7XG4gICAgICBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja05vZGUoY2lyY2xlKTtcbiAgICAgIGFyYy5jaXJjbGUgPSBudWxsO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lDbGlwRWRnZXMoZXh0ZW50KSB7XG4gICAgdmFyIGVkZ2VzID0gZDNfZ2VvbV92b3Jvbm9pRWRnZXMsIGNsaXAgPSBkM19nZW9tX2NsaXBMaW5lKGV4dGVudFswXVswXSwgZXh0ZW50WzBdWzFdLCBleHRlbnRbMV1bMF0sIGV4dGVudFsxXVsxXSksIGkgPSBlZGdlcy5sZW5ndGgsIGU7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgZSA9IGVkZ2VzW2ldO1xuICAgICAgaWYgKCFkM19nZW9tX3Zvcm9ub2lDb25uZWN0RWRnZShlLCBleHRlbnQpIHx8ICFjbGlwKGUpIHx8IGFicyhlLmEueCAtIGUuYi54KSA8IM61ICYmIGFicyhlLmEueSAtIGUuYi55KSA8IM61KSB7XG4gICAgICAgIGUuYSA9IGUuYiA9IG51bGw7XG4gICAgICAgIGVkZ2VzLnNwbGljZShpLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pQ29ubmVjdEVkZ2UoZWRnZSwgZXh0ZW50KSB7XG4gICAgdmFyIHZiID0gZWRnZS5iO1xuICAgIGlmICh2YikgcmV0dXJuIHRydWU7XG4gICAgdmFyIHZhID0gZWRnZS5hLCB4MCA9IGV4dGVudFswXVswXSwgeDEgPSBleHRlbnRbMV1bMF0sIHkwID0gZXh0ZW50WzBdWzFdLCB5MSA9IGV4dGVudFsxXVsxXSwgbFNpdGUgPSBlZGdlLmwsIHJTaXRlID0gZWRnZS5yLCBseCA9IGxTaXRlLngsIGx5ID0gbFNpdGUueSwgcnggPSByU2l0ZS54LCByeSA9IHJTaXRlLnksIGZ4ID0gKGx4ICsgcngpIC8gMiwgZnkgPSAobHkgKyByeSkgLyAyLCBmbSwgZmI7XG4gICAgaWYgKHJ5ID09PSBseSkge1xuICAgICAgaWYgKGZ4IDwgeDAgfHwgZnggPj0geDEpIHJldHVybjtcbiAgICAgIGlmIChseCA+IHJ4KSB7XG4gICAgICAgIGlmICghdmEpIHZhID0ge1xuICAgICAgICAgIHg6IGZ4LFxuICAgICAgICAgIHk6IHkwXG4gICAgICAgIH07IGVsc2UgaWYgKHZhLnkgPj0geTEpIHJldHVybjtcbiAgICAgICAgdmIgPSB7XG4gICAgICAgICAgeDogZngsXG4gICAgICAgICAgeTogeTFcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghdmEpIHZhID0ge1xuICAgICAgICAgIHg6IGZ4LFxuICAgICAgICAgIHk6IHkxXG4gICAgICAgIH07IGVsc2UgaWYgKHZhLnkgPCB5MCkgcmV0dXJuO1xuICAgICAgICB2YiA9IHtcbiAgICAgICAgICB4OiBmeCxcbiAgICAgICAgICB5OiB5MFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmbSA9IChseCAtIHJ4KSAvIChyeSAtIGx5KTtcbiAgICAgIGZiID0gZnkgLSBmbSAqIGZ4O1xuICAgICAgaWYgKGZtIDwgLTEgfHwgZm0gPiAxKSB7XG4gICAgICAgIGlmIChseCA+IHJ4KSB7XG4gICAgICAgICAgaWYgKCF2YSkgdmEgPSB7XG4gICAgICAgICAgICB4OiAoeTAgLSBmYikgLyBmbSxcbiAgICAgICAgICAgIHk6IHkwXG4gICAgICAgICAgfTsgZWxzZSBpZiAodmEueSA+PSB5MSkgcmV0dXJuO1xuICAgICAgICAgIHZiID0ge1xuICAgICAgICAgICAgeDogKHkxIC0gZmIpIC8gZm0sXG4gICAgICAgICAgICB5OiB5MVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCF2YSkgdmEgPSB7XG4gICAgICAgICAgICB4OiAoeTEgLSBmYikgLyBmbSxcbiAgICAgICAgICAgIHk6IHkxXG4gICAgICAgICAgfTsgZWxzZSBpZiAodmEueSA8IHkwKSByZXR1cm47XG4gICAgICAgICAgdmIgPSB7XG4gICAgICAgICAgICB4OiAoeTAgLSBmYikgLyBmbSxcbiAgICAgICAgICAgIHk6IHkwXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGx5IDwgcnkpIHtcbiAgICAgICAgICBpZiAoIXZhKSB2YSA9IHtcbiAgICAgICAgICAgIHg6IHgwLFxuICAgICAgICAgICAgeTogZm0gKiB4MCArIGZiXG4gICAgICAgICAgfTsgZWxzZSBpZiAodmEueCA+PSB4MSkgcmV0dXJuO1xuICAgICAgICAgIHZiID0ge1xuICAgICAgICAgICAgeDogeDEsXG4gICAgICAgICAgICB5OiBmbSAqIHgxICsgZmJcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICghdmEpIHZhID0ge1xuICAgICAgICAgICAgeDogeDEsXG4gICAgICAgICAgICB5OiBmbSAqIHgxICsgZmJcbiAgICAgICAgICB9OyBlbHNlIGlmICh2YS54IDwgeDApIHJldHVybjtcbiAgICAgICAgICB2YiA9IHtcbiAgICAgICAgICAgIHg6IHgwLFxuICAgICAgICAgICAgeTogZm0gKiB4MCArIGZiXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlZGdlLmEgPSB2YTtcbiAgICBlZGdlLmIgPSB2YjtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lFZGdlKGxTaXRlLCByU2l0ZSkge1xuICAgIHRoaXMubCA9IGxTaXRlO1xuICAgIHRoaXMuciA9IHJTaXRlO1xuICAgIHRoaXMuYSA9IHRoaXMuYiA9IG51bGw7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pQ3JlYXRlRWRnZShsU2l0ZSwgclNpdGUsIHZhLCB2Yikge1xuICAgIHZhciBlZGdlID0gbmV3IGQzX2dlb21fdm9yb25vaUVkZ2UobFNpdGUsIHJTaXRlKTtcbiAgICBkM19nZW9tX3Zvcm9ub2lFZGdlcy5wdXNoKGVkZ2UpO1xuICAgIGlmICh2YSkgZDNfZ2VvbV92b3Jvbm9pU2V0RWRnZUVuZChlZGdlLCBsU2l0ZSwgclNpdGUsIHZhKTtcbiAgICBpZiAodmIpIGQzX2dlb21fdm9yb25vaVNldEVkZ2VFbmQoZWRnZSwgclNpdGUsIGxTaXRlLCB2Yik7XG4gICAgZDNfZ2VvbV92b3Jvbm9pQ2VsbHNbbFNpdGUuaV0uZWRnZXMucHVzaChuZXcgZDNfZ2VvbV92b3Jvbm9pSGFsZkVkZ2UoZWRnZSwgbFNpdGUsIHJTaXRlKSk7XG4gICAgZDNfZ2VvbV92b3Jvbm9pQ2VsbHNbclNpdGUuaV0uZWRnZXMucHVzaChuZXcgZDNfZ2VvbV92b3Jvbm9pSGFsZkVkZ2UoZWRnZSwgclNpdGUsIGxTaXRlKSk7XG4gICAgcmV0dXJuIGVkZ2U7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pQ3JlYXRlQm9yZGVyRWRnZShsU2l0ZSwgdmEsIHZiKSB7XG4gICAgdmFyIGVkZ2UgPSBuZXcgZDNfZ2VvbV92b3Jvbm9pRWRnZShsU2l0ZSwgbnVsbCk7XG4gICAgZWRnZS5hID0gdmE7XG4gICAgZWRnZS5iID0gdmI7XG4gICAgZDNfZ2VvbV92b3Jvbm9pRWRnZXMucHVzaChlZGdlKTtcbiAgICByZXR1cm4gZWRnZTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lTZXRFZGdlRW5kKGVkZ2UsIGxTaXRlLCByU2l0ZSwgdmVydGV4KSB7XG4gICAgaWYgKCFlZGdlLmEgJiYgIWVkZ2UuYikge1xuICAgICAgZWRnZS5hID0gdmVydGV4O1xuICAgICAgZWRnZS5sID0gbFNpdGU7XG4gICAgICBlZGdlLnIgPSByU2l0ZTtcbiAgICB9IGVsc2UgaWYgKGVkZ2UubCA9PT0gclNpdGUpIHtcbiAgICAgIGVkZ2UuYiA9IHZlcnRleDtcbiAgICB9IGVsc2Uge1xuICAgICAgZWRnZS5hID0gdmVydGV4O1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lIYWxmRWRnZShlZGdlLCBsU2l0ZSwgclNpdGUpIHtcbiAgICB2YXIgdmEgPSBlZGdlLmEsIHZiID0gZWRnZS5iO1xuICAgIHRoaXMuZWRnZSA9IGVkZ2U7XG4gICAgdGhpcy5zaXRlID0gbFNpdGU7XG4gICAgdGhpcy5hbmdsZSA9IHJTaXRlID8gTWF0aC5hdGFuMihyU2l0ZS55IC0gbFNpdGUueSwgclNpdGUueCAtIGxTaXRlLngpIDogZWRnZS5sID09PSBsU2l0ZSA/IE1hdGguYXRhbjIodmIueCAtIHZhLngsIHZhLnkgLSB2Yi55KSA6IE1hdGguYXRhbjIodmEueCAtIHZiLngsIHZiLnkgLSB2YS55KTtcbiAgfVxuICBkM19nZW9tX3Zvcm9ub2lIYWxmRWRnZS5wcm90b3R5cGUgPSB7XG4gICAgc3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWRnZS5sID09PSB0aGlzLnNpdGUgPyB0aGlzLmVkZ2UuYSA6IHRoaXMuZWRnZS5iO1xuICAgIH0sXG4gICAgZW5kOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmVkZ2UubCA9PT0gdGhpcy5zaXRlID8gdGhpcy5lZGdlLmIgOiB0aGlzLmVkZ2UuYTtcbiAgICB9XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrVHJlZSgpIHtcbiAgICB0aGlzLl8gPSBudWxsO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrTm9kZShub2RlKSB7XG4gICAgbm9kZS5VID0gbm9kZS5DID0gbm9kZS5MID0gbm9kZS5SID0gbm9kZS5QID0gbm9kZS5OID0gbnVsbDtcbiAgfVxuICBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja1RyZWUucHJvdG90eXBlID0ge1xuICAgIGluc2VydDogZnVuY3Rpb24oYWZ0ZXIsIG5vZGUpIHtcbiAgICAgIHZhciBwYXJlbnQsIGdyYW5kcGEsIHVuY2xlO1xuICAgICAgaWYgKGFmdGVyKSB7XG4gICAgICAgIG5vZGUuUCA9IGFmdGVyO1xuICAgICAgICBub2RlLk4gPSBhZnRlci5OO1xuICAgICAgICBpZiAoYWZ0ZXIuTikgYWZ0ZXIuTi5QID0gbm9kZTtcbiAgICAgICAgYWZ0ZXIuTiA9IG5vZGU7XG4gICAgICAgIGlmIChhZnRlci5SKSB7XG4gICAgICAgICAgYWZ0ZXIgPSBhZnRlci5SO1xuICAgICAgICAgIHdoaWxlIChhZnRlci5MKSBhZnRlciA9IGFmdGVyLkw7XG4gICAgICAgICAgYWZ0ZXIuTCA9IG5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWZ0ZXIuUiA9IG5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgcGFyZW50ID0gYWZ0ZXI7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuXykge1xuICAgICAgICBhZnRlciA9IGQzX2dlb21fdm9yb25vaVJlZEJsYWNrRmlyc3QodGhpcy5fKTtcbiAgICAgICAgbm9kZS5QID0gbnVsbDtcbiAgICAgICAgbm9kZS5OID0gYWZ0ZXI7XG4gICAgICAgIGFmdGVyLlAgPSBhZnRlci5MID0gbm9kZTtcbiAgICAgICAgcGFyZW50ID0gYWZ0ZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub2RlLlAgPSBub2RlLk4gPSBudWxsO1xuICAgICAgICB0aGlzLl8gPSBub2RlO1xuICAgICAgICBwYXJlbnQgPSBudWxsO1xuICAgICAgfVxuICAgICAgbm9kZS5MID0gbm9kZS5SID0gbnVsbDtcbiAgICAgIG5vZGUuVSA9IHBhcmVudDtcbiAgICAgIG5vZGUuQyA9IHRydWU7XG4gICAgICBhZnRlciA9IG5vZGU7XG4gICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5DKSB7XG4gICAgICAgIGdyYW5kcGEgPSBwYXJlbnQuVTtcbiAgICAgICAgaWYgKHBhcmVudCA9PT0gZ3JhbmRwYS5MKSB7XG4gICAgICAgICAgdW5jbGUgPSBncmFuZHBhLlI7XG4gICAgICAgICAgaWYgKHVuY2xlICYmIHVuY2xlLkMpIHtcbiAgICAgICAgICAgIHBhcmVudC5DID0gdW5jbGUuQyA9IGZhbHNlO1xuICAgICAgICAgICAgZ3JhbmRwYS5DID0gdHJ1ZTtcbiAgICAgICAgICAgIGFmdGVyID0gZ3JhbmRwYTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGFmdGVyID09PSBwYXJlbnQuUikge1xuICAgICAgICAgICAgICBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja1JvdGF0ZUxlZnQodGhpcywgcGFyZW50KTtcbiAgICAgICAgICAgICAgYWZ0ZXIgPSBwYXJlbnQ7XG4gICAgICAgICAgICAgIHBhcmVudCA9IGFmdGVyLlU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnQuQyA9IGZhbHNlO1xuICAgICAgICAgICAgZ3JhbmRwYS5DID0gdHJ1ZTtcbiAgICAgICAgICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgZ3JhbmRwYSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuY2xlID0gZ3JhbmRwYS5MO1xuICAgICAgICAgIGlmICh1bmNsZSAmJiB1bmNsZS5DKSB7XG4gICAgICAgICAgICBwYXJlbnQuQyA9IHVuY2xlLkMgPSBmYWxzZTtcbiAgICAgICAgICAgIGdyYW5kcGEuQyA9IHRydWU7XG4gICAgICAgICAgICBhZnRlciA9IGdyYW5kcGE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChhZnRlciA9PT0gcGFyZW50LkwpIHtcbiAgICAgICAgICAgICAgZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tSb3RhdGVSaWdodCh0aGlzLCBwYXJlbnQpO1xuICAgICAgICAgICAgICBhZnRlciA9IHBhcmVudDtcbiAgICAgICAgICAgICAgcGFyZW50ID0gYWZ0ZXIuVTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBhcmVudC5DID0gZmFsc2U7XG4gICAgICAgICAgICBncmFuZHBhLkMgPSB0cnVlO1xuICAgICAgICAgICAgZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tSb3RhdGVMZWZ0KHRoaXMsIGdyYW5kcGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwYXJlbnQgPSBhZnRlci5VO1xuICAgICAgfVxuICAgICAgdGhpcy5fLkMgPSBmYWxzZTtcbiAgICB9LFxuICAgIHJlbW92ZTogZnVuY3Rpb24obm9kZSkge1xuICAgICAgaWYgKG5vZGUuTikgbm9kZS5OLlAgPSBub2RlLlA7XG4gICAgICBpZiAobm9kZS5QKSBub2RlLlAuTiA9IG5vZGUuTjtcbiAgICAgIG5vZGUuTiA9IG5vZGUuUCA9IG51bGw7XG4gICAgICB2YXIgcGFyZW50ID0gbm9kZS5VLCBzaWJsaW5nLCBsZWZ0ID0gbm9kZS5MLCByaWdodCA9IG5vZGUuUiwgbmV4dCwgcmVkO1xuICAgICAgaWYgKCFsZWZ0KSBuZXh0ID0gcmlnaHQ7IGVsc2UgaWYgKCFyaWdodCkgbmV4dCA9IGxlZnQ7IGVsc2UgbmV4dCA9IGQzX2dlb21fdm9yb25vaVJlZEJsYWNrRmlyc3QocmlnaHQpO1xuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICBpZiAocGFyZW50LkwgPT09IG5vZGUpIHBhcmVudC5MID0gbmV4dDsgZWxzZSBwYXJlbnQuUiA9IG5leHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl8gPSBuZXh0O1xuICAgICAgfVxuICAgICAgaWYgKGxlZnQgJiYgcmlnaHQpIHtcbiAgICAgICAgcmVkID0gbmV4dC5DO1xuICAgICAgICBuZXh0LkMgPSBub2RlLkM7XG4gICAgICAgIG5leHQuTCA9IGxlZnQ7XG4gICAgICAgIGxlZnQuVSA9IG5leHQ7XG4gICAgICAgIGlmIChuZXh0ICE9PSByaWdodCkge1xuICAgICAgICAgIHBhcmVudCA9IG5leHQuVTtcbiAgICAgICAgICBuZXh0LlUgPSBub2RlLlU7XG4gICAgICAgICAgbm9kZSA9IG5leHQuUjtcbiAgICAgICAgICBwYXJlbnQuTCA9IG5vZGU7XG4gICAgICAgICAgbmV4dC5SID0gcmlnaHQ7XG4gICAgICAgICAgcmlnaHQuVSA9IG5leHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV4dC5VID0gcGFyZW50O1xuICAgICAgICAgIHBhcmVudCA9IG5leHQ7XG4gICAgICAgICAgbm9kZSA9IG5leHQuUjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVkID0gbm9kZS5DO1xuICAgICAgICBub2RlID0gbmV4dDtcbiAgICAgIH1cbiAgICAgIGlmIChub2RlKSBub2RlLlUgPSBwYXJlbnQ7XG4gICAgICBpZiAocmVkKSByZXR1cm47XG4gICAgICBpZiAobm9kZSAmJiBub2RlLkMpIHtcbiAgICAgICAgbm9kZS5DID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG5vZGUgPT09IHRoaXMuXykgYnJlYWs7XG4gICAgICAgIGlmIChub2RlID09PSBwYXJlbnQuTCkge1xuICAgICAgICAgIHNpYmxpbmcgPSBwYXJlbnQuUjtcbiAgICAgICAgICBpZiAoc2libGluZy5DKSB7XG4gICAgICAgICAgICBzaWJsaW5nLkMgPSBmYWxzZTtcbiAgICAgICAgICAgIHBhcmVudC5DID0gdHJ1ZTtcbiAgICAgICAgICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlTGVmdCh0aGlzLCBwYXJlbnQpO1xuICAgICAgICAgICAgc2libGluZyA9IHBhcmVudC5SO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc2libGluZy5MICYmIHNpYmxpbmcuTC5DIHx8IHNpYmxpbmcuUiAmJiBzaWJsaW5nLlIuQykge1xuICAgICAgICAgICAgaWYgKCFzaWJsaW5nLlIgfHwgIXNpYmxpbmcuUi5DKSB7XG4gICAgICAgICAgICAgIHNpYmxpbmcuTC5DID0gZmFsc2U7XG4gICAgICAgICAgICAgIHNpYmxpbmcuQyA9IHRydWU7XG4gICAgICAgICAgICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgc2libGluZyk7XG4gICAgICAgICAgICAgIHNpYmxpbmcgPSBwYXJlbnQuUjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNpYmxpbmcuQyA9IHBhcmVudC5DO1xuICAgICAgICAgICAgcGFyZW50LkMgPSBzaWJsaW5nLlIuQyA9IGZhbHNlO1xuICAgICAgICAgICAgZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tSb3RhdGVMZWZ0KHRoaXMsIHBhcmVudCk7XG4gICAgICAgICAgICBub2RlID0gdGhpcy5fO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNpYmxpbmcgPSBwYXJlbnQuTDtcbiAgICAgICAgICBpZiAoc2libGluZy5DKSB7XG4gICAgICAgICAgICBzaWJsaW5nLkMgPSBmYWxzZTtcbiAgICAgICAgICAgIHBhcmVudC5DID0gdHJ1ZTtcbiAgICAgICAgICAgIGQzX2dlb21fdm9yb25vaVJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgcGFyZW50KTtcbiAgICAgICAgICAgIHNpYmxpbmcgPSBwYXJlbnQuTDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNpYmxpbmcuTCAmJiBzaWJsaW5nLkwuQyB8fCBzaWJsaW5nLlIgJiYgc2libGluZy5SLkMpIHtcbiAgICAgICAgICAgIGlmICghc2libGluZy5MIHx8ICFzaWJsaW5nLkwuQykge1xuICAgICAgICAgICAgICBzaWJsaW5nLlIuQyA9IGZhbHNlO1xuICAgICAgICAgICAgICBzaWJsaW5nLkMgPSB0cnVlO1xuICAgICAgICAgICAgICBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja1JvdGF0ZUxlZnQodGhpcywgc2libGluZyk7XG4gICAgICAgICAgICAgIHNpYmxpbmcgPSBwYXJlbnQuTDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNpYmxpbmcuQyA9IHBhcmVudC5DO1xuICAgICAgICAgICAgcGFyZW50LkMgPSBzaWJsaW5nLkwuQyA9IGZhbHNlO1xuICAgICAgICAgICAgZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tSb3RhdGVSaWdodCh0aGlzLCBwYXJlbnQpO1xuICAgICAgICAgICAgbm9kZSA9IHRoaXMuXztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzaWJsaW5nLkMgPSB0cnVlO1xuICAgICAgICBub2RlID0gcGFyZW50O1xuICAgICAgICBwYXJlbnQgPSBwYXJlbnQuVTtcbiAgICAgIH0gd2hpbGUgKCFub2RlLkMpO1xuICAgICAgaWYgKG5vZGUpIG5vZGUuQyA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tSb3RhdGVMZWZ0KHRyZWUsIG5vZGUpIHtcbiAgICB2YXIgcCA9IG5vZGUsIHEgPSBub2RlLlIsIHBhcmVudCA9IHAuVTtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBpZiAocGFyZW50LkwgPT09IHApIHBhcmVudC5MID0gcTsgZWxzZSBwYXJlbnQuUiA9IHE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyZWUuXyA9IHE7XG4gICAgfVxuICAgIHEuVSA9IHBhcmVudDtcbiAgICBwLlUgPSBxO1xuICAgIHAuUiA9IHEuTDtcbiAgICBpZiAocC5SKSBwLlIuVSA9IHA7XG4gICAgcS5MID0gcDtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja1JvdGF0ZVJpZ2h0KHRyZWUsIG5vZGUpIHtcbiAgICB2YXIgcCA9IG5vZGUsIHEgPSBub2RlLkwsIHBhcmVudCA9IHAuVTtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBpZiAocGFyZW50LkwgPT09IHApIHBhcmVudC5MID0gcTsgZWxzZSBwYXJlbnQuUiA9IHE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyZWUuXyA9IHE7XG4gICAgfVxuICAgIHEuVSA9IHBhcmVudDtcbiAgICBwLlUgPSBxO1xuICAgIHAuTCA9IHEuUjtcbiAgICBpZiAocC5MKSBwLkwuVSA9IHA7XG4gICAgcS5SID0gcDtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lSZWRCbGFja0ZpcnN0KG5vZGUpIHtcbiAgICB3aGlsZSAobm9kZS5MKSBub2RlID0gbm9kZS5MO1xuICAgIHJldHVybiBub2RlO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb21fdm9yb25vaShzaXRlcywgYmJveCkge1xuICAgIHZhciBzaXRlID0gc2l0ZXMuc29ydChkM19nZW9tX3Zvcm9ub2lWZXJ0ZXhPcmRlcikucG9wKCksIHgwLCB5MCwgY2lyY2xlO1xuICAgIGQzX2dlb21fdm9yb25vaUVkZ2VzID0gW107XG4gICAgZDNfZ2VvbV92b3Jvbm9pQ2VsbHMgPSBuZXcgQXJyYXkoc2l0ZXMubGVuZ3RoKTtcbiAgICBkM19nZW9tX3Zvcm9ub2lCZWFjaGVzID0gbmV3IGQzX2dlb21fdm9yb25vaVJlZEJsYWNrVHJlZSgpO1xuICAgIGQzX2dlb21fdm9yb25vaUNpcmNsZXMgPSBuZXcgZDNfZ2VvbV92b3Jvbm9pUmVkQmxhY2tUcmVlKCk7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNpcmNsZSA9IGQzX2dlb21fdm9yb25vaUZpcnN0Q2lyY2xlO1xuICAgICAgaWYgKHNpdGUgJiYgKCFjaXJjbGUgfHwgc2l0ZS55IDwgY2lyY2xlLnkgfHwgc2l0ZS55ID09PSBjaXJjbGUueSAmJiBzaXRlLnggPCBjaXJjbGUueCkpIHtcbiAgICAgICAgaWYgKHNpdGUueCAhPT0geDAgfHwgc2l0ZS55ICE9PSB5MCkge1xuICAgICAgICAgIGQzX2dlb21fdm9yb25vaUNlbGxzW3NpdGUuaV0gPSBuZXcgZDNfZ2VvbV92b3Jvbm9pQ2VsbChzaXRlKTtcbiAgICAgICAgICBkM19nZW9tX3Zvcm9ub2lBZGRCZWFjaChzaXRlKTtcbiAgICAgICAgICB4MCA9IHNpdGUueCwgeTAgPSBzaXRlLnk7XG4gICAgICAgIH1cbiAgICAgICAgc2l0ZSA9IHNpdGVzLnBvcCgpO1xuICAgICAgfSBlbHNlIGlmIChjaXJjbGUpIHtcbiAgICAgICAgZDNfZ2VvbV92b3Jvbm9pUmVtb3ZlQmVhY2goY2lyY2xlLmFyYyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGJib3gpIGQzX2dlb21fdm9yb25vaUNsaXBFZGdlcyhiYm94KSwgZDNfZ2VvbV92b3Jvbm9pQ2xvc2VDZWxscyhiYm94KTtcbiAgICB2YXIgZGlhZ3JhbSA9IHtcbiAgICAgIGNlbGxzOiBkM19nZW9tX3Zvcm9ub2lDZWxscyxcbiAgICAgIGVkZ2VzOiBkM19nZW9tX3Zvcm9ub2lFZGdlc1xuICAgIH07XG4gICAgZDNfZ2VvbV92b3Jvbm9pQmVhY2hlcyA9IGQzX2dlb21fdm9yb25vaUNpcmNsZXMgPSBkM19nZW9tX3Zvcm9ub2lFZGdlcyA9IGQzX2dlb21fdm9yb25vaUNlbGxzID0gbnVsbDtcbiAgICByZXR1cm4gZGlhZ3JhbTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3Zvcm9ub2lWZXJ0ZXhPcmRlcihhLCBiKSB7XG4gICAgcmV0dXJuIGIueSAtIGEueSB8fCBiLnggLSBhLng7XG4gIH1cbiAgZDMuZ2VvbS52b3Jvbm9pID0gZnVuY3Rpb24ocG9pbnRzKSB7XG4gICAgdmFyIHggPSBkM19nZW9tX3BvaW50WCwgeSA9IGQzX2dlb21fcG9pbnRZLCBmeCA9IHgsIGZ5ID0geSwgY2xpcEV4dGVudCA9IGQzX2dlb21fdm9yb25vaUNsaXBFeHRlbnQ7XG4gICAgaWYgKHBvaW50cykgcmV0dXJuIHZvcm9ub2kocG9pbnRzKTtcbiAgICBmdW5jdGlvbiB2b3Jvbm9pKGRhdGEpIHtcbiAgICAgIHZhciBwb2x5Z29ucyA9IG5ldyBBcnJheShkYXRhLmxlbmd0aCksIHgwID0gY2xpcEV4dGVudFswXVswXSwgeTAgPSBjbGlwRXh0ZW50WzBdWzFdLCB4MSA9IGNsaXBFeHRlbnRbMV1bMF0sIHkxID0gY2xpcEV4dGVudFsxXVsxXTtcbiAgICAgIGQzX2dlb21fdm9yb25vaShzaXRlcyhkYXRhKSwgY2xpcEV4dGVudCkuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihjZWxsLCBpKSB7XG4gICAgICAgIHZhciBlZGdlcyA9IGNlbGwuZWRnZXMsIHNpdGUgPSBjZWxsLnNpdGUsIHBvbHlnb24gPSBwb2x5Z29uc1tpXSA9IGVkZ2VzLmxlbmd0aCA/IGVkZ2VzLm1hcChmdW5jdGlvbihlKSB7XG4gICAgICAgICAgdmFyIHMgPSBlLnN0YXJ0KCk7XG4gICAgICAgICAgcmV0dXJuIFsgcy54LCBzLnkgXTtcbiAgICAgICAgfSkgOiBzaXRlLnggPj0geDAgJiYgc2l0ZS54IDw9IHgxICYmIHNpdGUueSA+PSB5MCAmJiBzaXRlLnkgPD0geTEgPyBbIFsgeDAsIHkxIF0sIFsgeDEsIHkxIF0sIFsgeDEsIHkwIF0sIFsgeDAsIHkwIF0gXSA6IFtdO1xuICAgICAgICBwb2x5Z29uLnBvaW50ID0gZGF0YVtpXTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHBvbHlnb25zO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzaXRlcyhkYXRhKSB7XG4gICAgICByZXR1cm4gZGF0YS5tYXAoZnVuY3Rpb24oZCwgaSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHg6IE1hdGgucm91bmQoZngoZCwgaSkgLyDOtSkgKiDOtSxcbiAgICAgICAgICB5OiBNYXRoLnJvdW5kKGZ5KGQsIGkpIC8gzrUpICogzrUsXG4gICAgICAgICAgaTogaVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICAgIHZvcm9ub2kubGlua3MgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgICByZXR1cm4gZDNfZ2VvbV92b3Jvbm9pKHNpdGVzKGRhdGEpKS5lZGdlcy5maWx0ZXIoZnVuY3Rpb24oZWRnZSkge1xuICAgICAgICByZXR1cm4gZWRnZS5sICYmIGVkZ2UucjtcbiAgICAgIH0pLm1hcChmdW5jdGlvbihlZGdlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc291cmNlOiBkYXRhW2VkZ2UubC5pXSxcbiAgICAgICAgICB0YXJnZXQ6IGRhdGFbZWRnZS5yLmldXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHZvcm9ub2kudHJpYW5nbGVzID0gZnVuY3Rpb24oZGF0YSkge1xuICAgICAgdmFyIHRyaWFuZ2xlcyA9IFtdO1xuICAgICAgZDNfZ2VvbV92b3Jvbm9pKHNpdGVzKGRhdGEpKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGNlbGwsIGkpIHtcbiAgICAgICAgdmFyIHNpdGUgPSBjZWxsLnNpdGUsIGVkZ2VzID0gY2VsbC5lZGdlcy5zb3J0KGQzX2dlb21fdm9yb25vaUhhbGZFZGdlT3JkZXIpLCBqID0gLTEsIG0gPSBlZGdlcy5sZW5ndGgsIGUwLCBzMCwgZTEgPSBlZGdlc1ttIC0gMV0uZWRnZSwgczEgPSBlMS5sID09PSBzaXRlID8gZTEuciA6IGUxLmw7XG4gICAgICAgIHdoaWxlICgrK2ogPCBtKSB7XG4gICAgICAgICAgZTAgPSBlMTtcbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgIGUxID0gZWRnZXNbal0uZWRnZTtcbiAgICAgICAgICBzMSA9IGUxLmwgPT09IHNpdGUgPyBlMS5yIDogZTEubDtcbiAgICAgICAgICBpZiAoaSA8IHMwLmkgJiYgaSA8IHMxLmkgJiYgZDNfZ2VvbV92b3Jvbm9pVHJpYW5nbGVBcmVhKHNpdGUsIHMwLCBzMSkgPCAwKSB7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChbIGRhdGFbaV0sIGRhdGFbczAuaV0sIGRhdGFbczEuaV0gXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cmlhbmdsZXM7XG4gICAgfTtcbiAgICB2b3Jvbm9pLnggPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmeCA9IGQzX2Z1bmN0b3IoeCA9IF8pLCB2b3Jvbm9pKSA6IHg7XG4gICAgfTtcbiAgICB2b3Jvbm9pLnkgPSBmdW5jdGlvbihfKSB7XG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmeSA9IGQzX2Z1bmN0b3IoeSA9IF8pLCB2b3Jvbm9pKSA6IHk7XG4gICAgfTtcbiAgICB2b3Jvbm9pLmNsaXBFeHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjbGlwRXh0ZW50ID09PSBkM19nZW9tX3Zvcm9ub2lDbGlwRXh0ZW50ID8gbnVsbCA6IGNsaXBFeHRlbnQ7XG4gICAgICBjbGlwRXh0ZW50ID0gXyA9PSBudWxsID8gZDNfZ2VvbV92b3Jvbm9pQ2xpcEV4dGVudCA6IF87XG4gICAgICByZXR1cm4gdm9yb25vaTtcbiAgICB9O1xuICAgIHZvcm9ub2kuc2l6ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNsaXBFeHRlbnQgPT09IGQzX2dlb21fdm9yb25vaUNsaXBFeHRlbnQgPyBudWxsIDogY2xpcEV4dGVudCAmJiBjbGlwRXh0ZW50WzFdO1xuICAgICAgcmV0dXJuIHZvcm9ub2kuY2xpcEV4dGVudChfICYmIFsgWyAwLCAwIF0sIF8gXSk7XG4gICAgfTtcbiAgICByZXR1cm4gdm9yb25vaTtcbiAgfTtcbiAgdmFyIGQzX2dlb21fdm9yb25vaUNsaXBFeHRlbnQgPSBbIFsgLTFlNiwgLTFlNiBdLCBbIDFlNiwgMWU2IF0gXTtcbiAgZnVuY3Rpb24gZDNfZ2VvbV92b3Jvbm9pVHJpYW5nbGVBcmVhKGEsIGIsIGMpIHtcbiAgICByZXR1cm4gKGEueCAtIGMueCkgKiAoYi55IC0gYS55KSAtIChhLnggLSBiLngpICogKGMueSAtIGEueSk7XG4gIH1cbiAgZDMuZ2VvbS5kZWxhdW5heSA9IGZ1bmN0aW9uKHZlcnRpY2VzKSB7XG4gICAgcmV0dXJuIGQzLmdlb20udm9yb25vaSgpLnRyaWFuZ2xlcyh2ZXJ0aWNlcyk7XG4gIH07XG4gIGQzLmdlb20ucXVhZHRyZWUgPSBmdW5jdGlvbihwb2ludHMsIHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgdmFyIHggPSBkM19nZW9tX3BvaW50WCwgeSA9IGQzX2dlb21fcG9pbnRZLCBjb21wYXQ7XG4gICAgaWYgKGNvbXBhdCA9IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIHggPSBkM19nZW9tX3F1YWR0cmVlQ29tcGF0WDtcbiAgICAgIHkgPSBkM19nZW9tX3F1YWR0cmVlQ29tcGF0WTtcbiAgICAgIGlmIChjb21wYXQgPT09IDMpIHtcbiAgICAgICAgeTIgPSB5MTtcbiAgICAgICAgeDIgPSB4MTtcbiAgICAgICAgeTEgPSB4MSA9IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gcXVhZHRyZWUocG9pbnRzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcXVhZHRyZWUoZGF0YSkge1xuICAgICAgdmFyIGQsIGZ4ID0gZDNfZnVuY3Rvcih4KSwgZnkgPSBkM19mdW5jdG9yKHkpLCB4cywgeXMsIGksIG4sIHgxXywgeTFfLCB4Ml8sIHkyXztcbiAgICAgIGlmICh4MSAhPSBudWxsKSB7XG4gICAgICAgIHgxXyA9IHgxLCB5MV8gPSB5MSwgeDJfID0geDIsIHkyXyA9IHkyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgeDJfID0geTJfID0gLSh4MV8gPSB5MV8gPSBJbmZpbml0eSk7XG4gICAgICAgIHhzID0gW10sIHlzID0gW107XG4gICAgICAgIG4gPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgaWYgKGNvbXBhdCkgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICAgIGQgPSBkYXRhW2ldO1xuICAgICAgICAgIGlmIChkLnggPCB4MV8pIHgxXyA9IGQueDtcbiAgICAgICAgICBpZiAoZC55IDwgeTFfKSB5MV8gPSBkLnk7XG4gICAgICAgICAgaWYgKGQueCA+IHgyXykgeDJfID0gZC54O1xuICAgICAgICAgIGlmIChkLnkgPiB5Ml8pIHkyXyA9IGQueTtcbiAgICAgICAgICB4cy5wdXNoKGQueCk7XG4gICAgICAgICAgeXMucHVzaChkLnkpO1xuICAgICAgICB9IGVsc2UgZm9yIChpID0gMDsgaSA8IG47ICsraSkge1xuICAgICAgICAgIHZhciB4XyA9ICtmeChkID0gZGF0YVtpXSwgaSksIHlfID0gK2Z5KGQsIGkpO1xuICAgICAgICAgIGlmICh4XyA8IHgxXykgeDFfID0geF87XG4gICAgICAgICAgaWYgKHlfIDwgeTFfKSB5MV8gPSB5XztcbiAgICAgICAgICBpZiAoeF8gPiB4Ml8pIHgyXyA9IHhfO1xuICAgICAgICAgIGlmICh5XyA+IHkyXykgeTJfID0geV87XG4gICAgICAgICAgeHMucHVzaCh4Xyk7XG4gICAgICAgICAgeXMucHVzaCh5Xyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBkeCA9IHgyXyAtIHgxXywgZHkgPSB5Ml8gLSB5MV87XG4gICAgICBpZiAoZHggPiBkeSkgeTJfID0geTFfICsgZHg7IGVsc2UgeDJfID0geDFfICsgZHk7XG4gICAgICBmdW5jdGlvbiBpbnNlcnQobiwgZCwgeCwgeSwgeDEsIHkxLCB4MiwgeTIpIHtcbiAgICAgICAgaWYgKGlzTmFOKHgpIHx8IGlzTmFOKHkpKSByZXR1cm47XG4gICAgICAgIGlmIChuLmxlYWYpIHtcbiAgICAgICAgICB2YXIgbnggPSBuLngsIG55ID0gbi55O1xuICAgICAgICAgIGlmIChueCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoYWJzKG54IC0geCkgKyBhYnMobnkgLSB5KSA8IC4wMSkge1xuICAgICAgICAgICAgICBpbnNlcnRDaGlsZChuLCBkLCB4LCB5LCB4MSwgeTEsIHgyLCB5Mik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgblBvaW50ID0gbi5wb2ludDtcbiAgICAgICAgICAgICAgbi54ID0gbi55ID0gbi5wb2ludCA9IG51bGw7XG4gICAgICAgICAgICAgIGluc2VydENoaWxkKG4sIG5Qb2ludCwgbngsIG55LCB4MSwgeTEsIHgyLCB5Mik7XG4gICAgICAgICAgICAgIGluc2VydENoaWxkKG4sIGQsIHgsIHksIHgxLCB5MSwgeDIsIHkyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbi54ID0geCwgbi55ID0geSwgbi5wb2ludCA9IGQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGluc2VydENoaWxkKG4sIGQsIHgsIHksIHgxLCB5MSwgeDIsIHkyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZnVuY3Rpb24gaW5zZXJ0Q2hpbGQobiwgZCwgeCwgeSwgeDEsIHkxLCB4MiwgeTIpIHtcbiAgICAgICAgdmFyIHhtID0gKHgxICsgeDIpICogLjUsIHltID0gKHkxICsgeTIpICogLjUsIHJpZ2h0ID0geCA+PSB4bSwgYmVsb3cgPSB5ID49IHltLCBpID0gYmVsb3cgPDwgMSB8IHJpZ2h0O1xuICAgICAgICBuLmxlYWYgPSBmYWxzZTtcbiAgICAgICAgbiA9IG4ubm9kZXNbaV0gfHwgKG4ubm9kZXNbaV0gPSBkM19nZW9tX3F1YWR0cmVlTm9kZSgpKTtcbiAgICAgICAgaWYgKHJpZ2h0KSB4MSA9IHhtOyBlbHNlIHgyID0geG07XG4gICAgICAgIGlmIChiZWxvdykgeTEgPSB5bTsgZWxzZSB5MiA9IHltO1xuICAgICAgICBpbnNlcnQobiwgZCwgeCwgeSwgeDEsIHkxLCB4MiwgeTIpO1xuICAgICAgfVxuICAgICAgdmFyIHJvb3QgPSBkM19nZW9tX3F1YWR0cmVlTm9kZSgpO1xuICAgICAgcm9vdC5hZGQgPSBmdW5jdGlvbihkKSB7XG4gICAgICAgIGluc2VydChyb290LCBkLCArZngoZCwgKytpKSwgK2Z5KGQsIGkpLCB4MV8sIHkxXywgeDJfLCB5Ml8pO1xuICAgICAgfTtcbiAgICAgIHJvb3QudmlzaXQgPSBmdW5jdGlvbihmKSB7XG4gICAgICAgIGQzX2dlb21fcXVhZHRyZWVWaXNpdChmLCByb290LCB4MV8sIHkxXywgeDJfLCB5Ml8pO1xuICAgICAgfTtcbiAgICAgIHJvb3QuZmluZCA9IGZ1bmN0aW9uKHBvaW50KSB7XG4gICAgICAgIHJldHVybiBkM19nZW9tX3F1YWR0cmVlRmluZChyb290LCBwb2ludFswXSwgcG9pbnRbMV0sIHgxXywgeTFfLCB4Ml8sIHkyXyk7XG4gICAgICB9O1xuICAgICAgaSA9IC0xO1xuICAgICAgaWYgKHgxID09IG51bGwpIHtcbiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgICBpbnNlcnQocm9vdCwgZGF0YVtpXSwgeHNbaV0sIHlzW2ldLCB4MV8sIHkxXywgeDJfLCB5Ml8pO1xuICAgICAgICB9XG4gICAgICAgIC0taTtcbiAgICAgIH0gZWxzZSBkYXRhLmZvckVhY2gocm9vdC5hZGQpO1xuICAgICAgeHMgPSB5cyA9IGRhdGEgPSBkID0gbnVsbDtcbiAgICAgIHJldHVybiByb290O1xuICAgIH1cbiAgICBxdWFkdHJlZS54ID0gZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCA9IF8sIHF1YWR0cmVlKSA6IHg7XG4gICAgfTtcbiAgICBxdWFkdHJlZS55ID0gZnVuY3Rpb24oXykge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9IF8sIHF1YWR0cmVlKSA6IHk7XG4gICAgfTtcbiAgICBxdWFkdHJlZS5leHRlbnQgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4MSA9PSBudWxsID8gbnVsbCA6IFsgWyB4MSwgeTEgXSwgWyB4MiwgeTIgXSBdO1xuICAgICAgaWYgKF8gPT0gbnVsbCkgeDEgPSB5MSA9IHgyID0geTIgPSBudWxsOyBlbHNlIHgxID0gK19bMF1bMF0sIHkxID0gK19bMF1bMV0sIHgyID0gK19bMV1bMF0sIFxuICAgICAgeTIgPSArX1sxXVsxXTtcbiAgICAgIHJldHVybiBxdWFkdHJlZTtcbiAgICB9O1xuICAgIHF1YWR0cmVlLnNpemUgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4MSA9PSBudWxsID8gbnVsbCA6IFsgeDIgLSB4MSwgeTIgLSB5MSBdO1xuICAgICAgaWYgKF8gPT0gbnVsbCkgeDEgPSB5MSA9IHgyID0geTIgPSBudWxsOyBlbHNlIHgxID0geTEgPSAwLCB4MiA9ICtfWzBdLCB5MiA9ICtfWzFdO1xuICAgICAgcmV0dXJuIHF1YWR0cmVlO1xuICAgIH07XG4gICAgcmV0dXJuIHF1YWR0cmVlO1xuICB9O1xuICBmdW5jdGlvbiBkM19nZW9tX3F1YWR0cmVlQ29tcGF0WChkKSB7XG4gICAgcmV0dXJuIGQueDtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3F1YWR0cmVlQ29tcGF0WShkKSB7XG4gICAgcmV0dXJuIGQueTtcbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3F1YWR0cmVlTm9kZSgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGVhZjogdHJ1ZSxcbiAgICAgIG5vZGVzOiBbXSxcbiAgICAgIHBvaW50OiBudWxsLFxuICAgICAgeDogbnVsbCxcbiAgICAgIHk6IG51bGxcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2dlb21fcXVhZHRyZWVWaXNpdChmLCBub2RlLCB4MSwgeTEsIHgyLCB5Mikge1xuICAgIGlmICghZihub2RlLCB4MSwgeTEsIHgyLCB5MikpIHtcbiAgICAgIHZhciBzeCA9ICh4MSArIHgyKSAqIC41LCBzeSA9ICh5MSArIHkyKSAqIC41LCBjaGlsZHJlbiA9IG5vZGUubm9kZXM7XG4gICAgICBpZiAoY2hpbGRyZW5bMF0pIGQzX2dlb21fcXVhZHRyZWVWaXNpdChmLCBjaGlsZHJlblswXSwgeDEsIHkxLCBzeCwgc3kpO1xuICAgICAgaWYgKGNoaWxkcmVuWzFdKSBkM19nZW9tX3F1YWR0cmVlVmlzaXQoZiwgY2hpbGRyZW5bMV0sIHN4LCB5MSwgeDIsIHN5KTtcbiAgICAgIGlmIChjaGlsZHJlblsyXSkgZDNfZ2VvbV9xdWFkdHJlZVZpc2l0KGYsIGNoaWxkcmVuWzJdLCB4MSwgc3ksIHN4LCB5Mik7XG4gICAgICBpZiAoY2hpbGRyZW5bM10pIGQzX2dlb21fcXVhZHRyZWVWaXNpdChmLCBjaGlsZHJlblszXSwgc3gsIHN5LCB4MiwgeTIpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBkM19nZW9tX3F1YWR0cmVlRmluZChyb290LCB4LCB5LCB4MCwgeTAsIHgzLCB5Mykge1xuICAgIHZhciBtaW5EaXN0YW5jZTIgPSBJbmZpbml0eSwgY2xvc2VzdFBvaW50O1xuICAgIChmdW5jdGlvbiBmaW5kKG5vZGUsIHgxLCB5MSwgeDIsIHkyKSB7XG4gICAgICBpZiAoeDEgPiB4MyB8fCB5MSA+IHkzIHx8IHgyIDwgeDAgfHwgeTIgPCB5MCkgcmV0dXJuO1xuICAgICAgaWYgKHBvaW50ID0gbm9kZS5wb2ludCkge1xuICAgICAgICB2YXIgcG9pbnQsIGR4ID0geCAtIG5vZGUueCwgZHkgPSB5IC0gbm9kZS55LCBkaXN0YW5jZTIgPSBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgICAgICAgaWYgKGRpc3RhbmNlMiA8IG1pbkRpc3RhbmNlMikge1xuICAgICAgICAgIHZhciBkaXN0YW5jZSA9IE1hdGguc3FydChtaW5EaXN0YW5jZTIgPSBkaXN0YW5jZTIpO1xuICAgICAgICAgIHgwID0geCAtIGRpc3RhbmNlLCB5MCA9IHkgLSBkaXN0YW5jZTtcbiAgICAgICAgICB4MyA9IHggKyBkaXN0YW5jZSwgeTMgPSB5ICsgZGlzdGFuY2U7XG4gICAgICAgICAgY2xvc2VzdFBvaW50ID0gcG9pbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUubm9kZXMsIHhtID0gKHgxICsgeDIpICogLjUsIHltID0gKHkxICsgeTIpICogLjUsIHJpZ2h0ID0geCA+PSB4bSwgYmVsb3cgPSB5ID49IHltO1xuICAgICAgZm9yICh2YXIgaSA9IGJlbG93IDw8IDEgfCByaWdodCwgaiA9IGkgKyA0OyBpIDwgajsgKytpKSB7XG4gICAgICAgIGlmIChub2RlID0gY2hpbGRyZW5baSAmIDNdKSBzd2l0Y2ggKGkgJiAzKSB7XG4gICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgZmluZChub2RlLCB4MSwgeTEsIHhtLCB5bSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBmaW5kKG5vZGUsIHhtLCB5MSwgeDIsIHltKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGZpbmQobm9kZSwgeDEsIHltLCB4bSwgeTIpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgZmluZChub2RlLCB4bSwgeW0sIHgyLCB5Mik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KShyb290LCB4MCwgeTAsIHgzLCB5Myk7XG4gICAgcmV0dXJuIGNsb3Nlc3RQb2ludDtcbiAgfVxuICBkMy5pbnRlcnBvbGF0ZVJnYiA9IGQzX2ludGVycG9sYXRlUmdiO1xuICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZVJnYihhLCBiKSB7XG4gICAgYSA9IGQzLnJnYihhKTtcbiAgICBiID0gZDMucmdiKGIpO1xuICAgIHZhciBhciA9IGEuciwgYWcgPSBhLmcsIGFiID0gYS5iLCBiciA9IGIuciAtIGFyLCBiZyA9IGIuZyAtIGFnLCBiYiA9IGIuYiAtIGFiO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICByZXR1cm4gXCIjXCIgKyBkM19yZ2JfaGV4KE1hdGgucm91bmQoYXIgKyBiciAqIHQpKSArIGQzX3JnYl9oZXgoTWF0aC5yb3VuZChhZyArIGJnICogdCkpICsgZDNfcmdiX2hleChNYXRoLnJvdW5kKGFiICsgYmIgKiB0KSk7XG4gICAgfTtcbiAgfVxuICBkMy5pbnRlcnBvbGF0ZU9iamVjdCA9IGQzX2ludGVycG9sYXRlT2JqZWN0O1xuICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZU9iamVjdChhLCBiKSB7XG4gICAgdmFyIGkgPSB7fSwgYyA9IHt9LCBrO1xuICAgIGZvciAoayBpbiBhKSB7XG4gICAgICBpZiAoayBpbiBiKSB7XG4gICAgICAgIGlba10gPSBkM19pbnRlcnBvbGF0ZShhW2tdLCBiW2tdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNba10gPSBhW2tdO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGsgaW4gYikge1xuICAgICAgaWYgKCEoayBpbiBhKSkge1xuICAgICAgICBjW2tdID0gYltrXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIGZvciAoayBpbiBpKSBjW2tdID0gaVtrXSh0KTtcbiAgICAgIHJldHVybiBjO1xuICAgIH07XG4gIH1cbiAgZDMuaW50ZXJwb2xhdGVOdW1iZXIgPSBkM19pbnRlcnBvbGF0ZU51bWJlcjtcbiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVOdW1iZXIoYSwgYikge1xuICAgIGEgPSArYSwgYiA9ICtiO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDtcbiAgICB9O1xuICB9XG4gIGQzLmludGVycG9sYXRlU3RyaW5nID0gZDNfaW50ZXJwb2xhdGVTdHJpbmc7XG4gIGZ1bmN0aW9uIGQzX2ludGVycG9sYXRlU3RyaW5nKGEsIGIpIHtcbiAgICB2YXIgYmkgPSBkM19pbnRlcnBvbGF0ZV9udW1iZXJBLmxhc3RJbmRleCA9IGQzX2ludGVycG9sYXRlX251bWJlckIubGFzdEluZGV4ID0gMCwgYW0sIGJtLCBicywgaSA9IC0xLCBzID0gW10sIHEgPSBbXTtcbiAgICBhID0gYSArIFwiXCIsIGIgPSBiICsgXCJcIjtcbiAgICB3aGlsZSAoKGFtID0gZDNfaW50ZXJwb2xhdGVfbnVtYmVyQS5leGVjKGEpKSAmJiAoYm0gPSBkM19pbnRlcnBvbGF0ZV9udW1iZXJCLmV4ZWMoYikpKSB7XG4gICAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHtcbiAgICAgICAgYnMgPSBiLnNsaWNlKGJpLCBicyk7XG4gICAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyBlbHNlIHNbKytpXSA9IGJzO1xuICAgICAgfVxuICAgICAgaWYgKChhbSA9IGFtWzBdKSA9PT0gKGJtID0gYm1bMF0pKSB7XG4gICAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJtOyBlbHNlIHNbKytpXSA9IGJtO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc1srK2ldID0gbnVsbDtcbiAgICAgICAgcS5wdXNoKHtcbiAgICAgICAgICBpOiBpLFxuICAgICAgICAgIHg6IGQzX2ludGVycG9sYXRlTnVtYmVyKGFtLCBibSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBiaSA9IGQzX2ludGVycG9sYXRlX251bWJlckIubGFzdEluZGV4O1xuICAgIH1cbiAgICBpZiAoYmkgPCBiLmxlbmd0aCkge1xuICAgICAgYnMgPSBiLnNsaWNlKGJpKTtcbiAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyBlbHNlIHNbKytpXSA9IGJzO1xuICAgIH1cbiAgICByZXR1cm4gcy5sZW5ndGggPCAyID8gcVswXSA/IChiID0gcVswXS54LCBmdW5jdGlvbih0KSB7XG4gICAgICByZXR1cm4gYih0KSArIFwiXCI7XG4gICAgfSkgOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBiO1xuICAgIH0gOiAoYiA9IHEubGVuZ3RoLCBmdW5jdGlvbih0KSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbzsgaSA8IGI7ICsraSkgc1sobyA9IHFbaV0pLmldID0gby54KHQpO1xuICAgICAgcmV0dXJuIHMuam9pbihcIlwiKTtcbiAgICB9KTtcbiAgfVxuICB2YXIgZDNfaW50ZXJwb2xhdGVfbnVtYmVyQSA9IC9bLStdPyg/OlxcZCtcXC4/XFxkKnxcXC4/XFxkKykoPzpbZUVdWy0rXT9cXGQrKT8vZywgZDNfaW50ZXJwb2xhdGVfbnVtYmVyQiA9IG5ldyBSZWdFeHAoZDNfaW50ZXJwb2xhdGVfbnVtYmVyQS5zb3VyY2UsIFwiZ1wiKTtcbiAgZDMuaW50ZXJwb2xhdGUgPSBkM19pbnRlcnBvbGF0ZTtcbiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGUoYSwgYikge1xuICAgIHZhciBpID0gZDMuaW50ZXJwb2xhdG9ycy5sZW5ndGgsIGY7XG4gICAgd2hpbGUgKC0taSA+PSAwICYmICEoZiA9IGQzLmludGVycG9sYXRvcnNbaV0oYSwgYikpKSA7XG4gICAgcmV0dXJuIGY7XG4gIH1cbiAgZDMuaW50ZXJwb2xhdG9ycyA9IFsgZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciB0ID0gdHlwZW9mIGI7XG4gICAgcmV0dXJuICh0ID09PSBcInN0cmluZ1wiID8gZDNfcmdiX25hbWVzLmhhcyhiLnRvTG93ZXJDYXNlKCkpIHx8IC9eKCN8cmdiXFwofGhzbFxcKCkvaS50ZXN0KGIpID8gZDNfaW50ZXJwb2xhdGVSZ2IgOiBkM19pbnRlcnBvbGF0ZVN0cmluZyA6IGIgaW5zdGFuY2VvZiBkM19jb2xvciA/IGQzX2ludGVycG9sYXRlUmdiIDogQXJyYXkuaXNBcnJheShiKSA/IGQzX2ludGVycG9sYXRlQXJyYXkgOiB0ID09PSBcIm9iamVjdFwiICYmIGlzTmFOKGIpID8gZDNfaW50ZXJwb2xhdGVPYmplY3QgOiBkM19pbnRlcnBvbGF0ZU51bWJlcikoYSwgYik7XG4gIH0gXTtcbiAgZDMuaW50ZXJwb2xhdGVBcnJheSA9IGQzX2ludGVycG9sYXRlQXJyYXk7XG4gIGZ1bmN0aW9uIGQzX2ludGVycG9sYXRlQXJyYXkoYSwgYikge1xuICAgIHZhciB4ID0gW10sIGMgPSBbXSwgbmEgPSBhLmxlbmd0aCwgbmIgPSBiLmxlbmd0aCwgbjAgPSBNYXRoLm1pbihhLmxlbmd0aCwgYi5sZW5ndGgpLCBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBuMDsgKytpKSB4LnB1c2goZDNfaW50ZXJwb2xhdGUoYVtpXSwgYltpXSkpO1xuICAgIGZvciAoO2kgPCBuYTsgKytpKSBjW2ldID0gYVtpXTtcbiAgICBmb3IgKDtpIDwgbmI7ICsraSkgY1tpXSA9IGJbaV07XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBuMDsgKytpKSBjW2ldID0geFtpXSh0KTtcbiAgICAgIHJldHVybiBjO1xuICAgIH07XG4gIH1cbiAgdmFyIGQzX2Vhc2VfZGVmYXVsdCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19pZGVudGl0eTtcbiAgfTtcbiAgdmFyIGQzX2Vhc2UgPSBkMy5tYXAoe1xuICAgIGxpbmVhcjogZDNfZWFzZV9kZWZhdWx0LFxuICAgIHBvbHk6IGQzX2Vhc2VfcG9seSxcbiAgICBxdWFkOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBkM19lYXNlX3F1YWQ7XG4gICAgfSxcbiAgICBjdWJpYzogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZDNfZWFzZV9jdWJpYztcbiAgICB9LFxuICAgIHNpbjogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZDNfZWFzZV9zaW47XG4gICAgfSxcbiAgICBleHA6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGQzX2Vhc2VfZXhwO1xuICAgIH0sXG4gICAgY2lyY2xlOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBkM19lYXNlX2NpcmNsZTtcbiAgICB9LFxuICAgIGVsYXN0aWM6IGQzX2Vhc2VfZWxhc3RpYyxcbiAgICBiYWNrOiBkM19lYXNlX2JhY2ssXG4gICAgYm91bmNlOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBkM19lYXNlX2JvdW5jZTtcbiAgICB9XG4gIH0pO1xuICB2YXIgZDNfZWFzZV9tb2RlID0gZDMubWFwKHtcbiAgICBcImluXCI6IGQzX2lkZW50aXR5LFxuICAgIG91dDogZDNfZWFzZV9yZXZlcnNlLFxuICAgIFwiaW4tb3V0XCI6IGQzX2Vhc2VfcmVmbGVjdCxcbiAgICBcIm91dC1pblwiOiBmdW5jdGlvbihmKSB7XG4gICAgICByZXR1cm4gZDNfZWFzZV9yZWZsZWN0KGQzX2Vhc2VfcmV2ZXJzZShmKSk7XG4gICAgfVxuICB9KTtcbiAgZDMuZWFzZSA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgaSA9IG5hbWUuaW5kZXhPZihcIi1cIiksIHQgPSBpID49IDAgPyBuYW1lLnNsaWNlKDAsIGkpIDogbmFtZSwgbSA9IGkgPj0gMCA/IG5hbWUuc2xpY2UoaSArIDEpIDogXCJpblwiO1xuICAgIHQgPSBkM19lYXNlLmdldCh0KSB8fCBkM19lYXNlX2RlZmF1bHQ7XG4gICAgbSA9IGQzX2Vhc2VfbW9kZS5nZXQobSkgfHwgZDNfaWRlbnRpdHk7XG4gICAgcmV0dXJuIGQzX2Vhc2VfY2xhbXAobSh0LmFwcGx5KG51bGwsIGQzX2FycmF5U2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKSkpO1xuICB9O1xuICBmdW5jdGlvbiBkM19lYXNlX2NsYW1wKGYpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgcmV0dXJuIHQgPD0gMCA/IDAgOiB0ID49IDEgPyAxIDogZih0KTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2Vhc2VfcmV2ZXJzZShmKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHtcbiAgICAgIHJldHVybiAxIC0gZigxIC0gdCk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkM19lYXNlX3JlZmxlY3QoZikge1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICByZXR1cm4gLjUgKiAodCA8IC41ID8gZigyICogdCkgOiAyIC0gZigyIC0gMiAqIHQpKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2Vhc2VfcXVhZCh0KSB7XG4gICAgcmV0dXJuIHQgKiB0O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2Vhc2VfY3ViaWModCkge1xuICAgIHJldHVybiB0ICogdCAqIHQ7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZWFzZV9jdWJpY0luT3V0KHQpIHtcbiAgICBpZiAodCA8PSAwKSByZXR1cm4gMDtcbiAgICBpZiAodCA+PSAxKSByZXR1cm4gMTtcbiAgICB2YXIgdDIgPSB0ICogdCwgdDMgPSB0MiAqIHQ7XG4gICAgcmV0dXJuIDQgKiAodCA8IC41ID8gdDMgOiAzICogKHQgLSB0MikgKyB0MyAtIC43NSk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZWFzZV9wb2x5KGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgcmV0dXJuIE1hdGgucG93KHQsIGUpO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZDNfZWFzZV9zaW4odCkge1xuICAgIHJldHVybiAxIC0gTWF0aC5jb3ModCAqIGhhbGbPgCk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfZWFzZV9leHAodCkge1xuICAgIHJldHVybiBNYXRoLnBvdygyLCAxMCAqICh0IC0gMSkpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2Vhc2VfY2lyY2xlKHQpIHtcbiAgICByZXR1cm4gMSAtIE1hdGguc3FydCgxIC0gdCAqIHQpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2Vhc2VfZWxhc3RpYyhhLCBwKSB7XG4gICAgdmFyIHM7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSBwID0gLjQ1O1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSBzID0gcCAvIM+EICogTWF0aC5hc2luKDEgLyBhKTsgZWxzZSBhID0gMSwgcyA9IHAgLyA0O1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICByZXR1cm4gMSArIGEgKiBNYXRoLnBvdygyLCAtMTAgKiB0KSAqIE1hdGguc2luKCh0IC0gcykgKiDPhCAvIHApO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZDNfZWFzZV9iYWNrKHMpIHtcbiAgICBpZiAoIXMpIHMgPSAxLjcwMTU4O1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICByZXR1cm4gdCAqIHQgKiAoKHMgKyAxKSAqIHQgLSBzKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2Vhc2VfYm91bmNlKHQpIHtcbiAgICByZXR1cm4gdCA8IDEgLyAyLjc1ID8gNy41NjI1ICogdCAqIHQgOiB0IDwgMiAvIDIuNzUgPyA3LjU2MjUgKiAodCAtPSAxLjUgLyAyLjc1KSAqIHQgKyAuNzUgOiB0IDwgMi41IC8gMi43NSA/IDcuNTYyNSAqICh0IC09IDIuMjUgLyAyLjc1KSAqIHQgKyAuOTM3NSA6IDcuNTYyNSAqICh0IC09IDIuNjI1IC8gMi43NSkgKiB0ICsgLjk4NDM3NTtcbiAgfVxuICBkMy5pbnRlcnBvbGF0ZUhjbCA9IGQzX2ludGVycG9sYXRlSGNsO1xuICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZUhjbChhLCBiKSB7XG4gICAgYSA9IGQzLmhjbChhKTtcbiAgICBiID0gZDMuaGNsKGIpO1xuICAgIHZhciBhaCA9IGEuaCwgYWMgPSBhLmMsIGFsID0gYS5sLCBiaCA9IGIuaCAtIGFoLCBiYyA9IGIuYyAtIGFjLCBibCA9IGIubCAtIGFsO1xuICAgIGlmIChpc05hTihiYykpIGJjID0gMCwgYWMgPSBpc05hTihhYykgPyBiLmMgOiBhYztcbiAgICBpZiAoaXNOYU4oYmgpKSBiaCA9IDAsIGFoID0gaXNOYU4oYWgpID8gYi5oIDogYWg7IGVsc2UgaWYgKGJoID4gMTgwKSBiaCAtPSAzNjA7IGVsc2UgaWYgKGJoIDwgLTE4MCkgYmggKz0gMzYwO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICByZXR1cm4gZDNfaGNsX2xhYihhaCArIGJoICogdCwgYWMgKyBiYyAqIHQsIGFsICsgYmwgKiB0KSArIFwiXCI7XG4gICAgfTtcbiAgfVxuICBkMy5pbnRlcnBvbGF0ZUhzbCA9IGQzX2ludGVycG9sYXRlSHNsO1xuICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZUhzbChhLCBiKSB7XG4gICAgYSA9IGQzLmhzbChhKTtcbiAgICBiID0gZDMuaHNsKGIpO1xuICAgIHZhciBhaCA9IGEuaCwgYXMgPSBhLnMsIGFsID0gYS5sLCBiaCA9IGIuaCAtIGFoLCBicyA9IGIucyAtIGFzLCBibCA9IGIubCAtIGFsO1xuICAgIGlmIChpc05hTihicykpIGJzID0gMCwgYXMgPSBpc05hTihhcykgPyBiLnMgOiBhcztcbiAgICBpZiAoaXNOYU4oYmgpKSBiaCA9IDAsIGFoID0gaXNOYU4oYWgpID8gYi5oIDogYWg7IGVsc2UgaWYgKGJoID4gMTgwKSBiaCAtPSAzNjA7IGVsc2UgaWYgKGJoIDwgLTE4MCkgYmggKz0gMzYwO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICByZXR1cm4gZDNfaHNsX3JnYihhaCArIGJoICogdCwgYXMgKyBicyAqIHQsIGFsICsgYmwgKiB0KSArIFwiXCI7XG4gICAgfTtcbiAgfVxuICBkMy5pbnRlcnBvbGF0ZUxhYiA9IGQzX2ludGVycG9sYXRlTGFiO1xuICBmdW5jdGlvbiBkM19pbnRlcnBvbGF0ZUxhYihhLCBiKSB7XG4gICAgYSA9IGQzLmxhYihhKTtcbiAgICBiID0gZDMubGFiKGIpO1xuICAgIHZhciBhbCA9IGEubCwgYWEgPSBhLmEsIGFiID0gYS5iLCBibCA9IGIubCAtIGFsLCBiYSA9IGIuYSAtIGFhLCBiYiA9IGIuYiAtIGFiO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICByZXR1cm4gZDNfbGFiX3JnYihhbCArIGJsICogdCwgYWEgKyBiYSAqIHQsIGFiICsgYmIgKiB0KSArIFwiXCI7XG4gICAgfTtcbiAgfVxuICBkMy5pbnRlcnBvbGF0ZVJvdW5kID0gZDNfaW50ZXJwb2xhdGVSb3VuZDtcbiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVSb3VuZChhLCBiKSB7XG4gICAgYiAtPSBhO1xuICAgIHJldHVybiBmdW5jdGlvbih0KSB7XG4gICAgICByZXR1cm4gTWF0aC5yb3VuZChhICsgYiAqIHQpO1xuICAgIH07XG4gIH1cbiAgZDMudHJhbnNmb3JtID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgdmFyIGcgPSBkM19kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZDMubnMucHJlZml4LnN2ZywgXCJnXCIpO1xuICAgIHJldHVybiAoZDMudHJhbnNmb3JtID0gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICBpZiAoc3RyaW5nICE9IG51bGwpIHtcbiAgICAgICAgZy5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgc3RyaW5nKTtcbiAgICAgICAgdmFyIHQgPSBnLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IGQzX3RyYW5zZm9ybSh0ID8gdC5tYXRyaXggOiBkM190cmFuc2Zvcm1JZGVudGl0eSk7XG4gICAgfSkoc3RyaW5nKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfdHJhbnNmb3JtKG0pIHtcbiAgICB2YXIgcjAgPSBbIG0uYSwgbS5iIF0sIHIxID0gWyBtLmMsIG0uZCBdLCBreCA9IGQzX3RyYW5zZm9ybU5vcm1hbGl6ZShyMCksIGt6ID0gZDNfdHJhbnNmb3JtRG90KHIwLCByMSksIGt5ID0gZDNfdHJhbnNmb3JtTm9ybWFsaXplKGQzX3RyYW5zZm9ybUNvbWJpbmUocjEsIHIwLCAta3opKSB8fCAwO1xuICAgIGlmIChyMFswXSAqIHIxWzFdIDwgcjFbMF0gKiByMFsxXSkge1xuICAgICAgcjBbMF0gKj0gLTE7XG4gICAgICByMFsxXSAqPSAtMTtcbiAgICAgIGt4ICo9IC0xO1xuICAgICAga3ogKj0gLTE7XG4gICAgfVxuICAgIHRoaXMucm90YXRlID0gKGt4ID8gTWF0aC5hdGFuMihyMFsxXSwgcjBbMF0pIDogTWF0aC5hdGFuMigtcjFbMF0sIHIxWzFdKSkgKiBkM19kZWdyZWVzO1xuICAgIHRoaXMudHJhbnNsYXRlID0gWyBtLmUsIG0uZiBdO1xuICAgIHRoaXMuc2NhbGUgPSBbIGt4LCBreSBdO1xuICAgIHRoaXMuc2tldyA9IGt5ID8gTWF0aC5hdGFuMihreiwga3kpICogZDNfZGVncmVlcyA6IDA7XG4gIH1cbiAgZDNfdHJhbnNmb3JtLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcInRyYW5zbGF0ZShcIiArIHRoaXMudHJhbnNsYXRlICsgXCIpcm90YXRlKFwiICsgdGhpcy5yb3RhdGUgKyBcIilza2V3WChcIiArIHRoaXMuc2tldyArIFwiKXNjYWxlKFwiICsgdGhpcy5zY2FsZSArIFwiKVwiO1xuICB9O1xuICBmdW5jdGlvbiBkM190cmFuc2Zvcm1Eb3QoYSwgYikge1xuICAgIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3RyYW5zZm9ybU5vcm1hbGl6ZShhKSB7XG4gICAgdmFyIGsgPSBNYXRoLnNxcnQoZDNfdHJhbnNmb3JtRG90KGEsIGEpKTtcbiAgICBpZiAoaykge1xuICAgICAgYVswXSAvPSBrO1xuICAgICAgYVsxXSAvPSBrO1xuICAgIH1cbiAgICByZXR1cm4gaztcbiAgfVxuICBmdW5jdGlvbiBkM190cmFuc2Zvcm1Db21iaW5lKGEsIGIsIGspIHtcbiAgICBhWzBdICs9IGsgKiBiWzBdO1xuICAgIGFbMV0gKz0gayAqIGJbMV07XG4gICAgcmV0dXJuIGE7XG4gIH1cbiAgdmFyIGQzX3RyYW5zZm9ybUlkZW50aXR5ID0ge1xuICAgIGE6IDEsXG4gICAgYjogMCxcbiAgICBjOiAwLFxuICAgIGQ6IDEsXG4gICAgZTogMCxcbiAgICBmOiAwXG4gIH07XG4gIGQzLmludGVycG9sYXRlVHJhbnNmb3JtID0gZDNfaW50ZXJwb2xhdGVUcmFuc2Zvcm07XG4gIGZ1bmN0aW9uIGQzX2ludGVycG9sYXRlVHJhbnNmb3JtUG9wKHMpIHtcbiAgICByZXR1cm4gcy5sZW5ndGggPyBzLnBvcCgpICsgXCIsXCIgOiBcIlwiO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2ludGVycG9sYXRlVHJhbnNsYXRlKHRhLCB0YiwgcywgcSkge1xuICAgIGlmICh0YVswXSAhPT0gdGJbMF0gfHwgdGFbMV0gIT09IHRiWzFdKSB7XG4gICAgICB2YXIgaSA9IHMucHVzaChcInRyYW5zbGF0ZShcIiwgbnVsbCwgXCIsXCIsIG51bGwsIFwiKVwiKTtcbiAgICAgIHEucHVzaCh7XG4gICAgICAgIGk6IGkgLSA0LFxuICAgICAgICB4OiBkM19pbnRlcnBvbGF0ZU51bWJlcih0YVswXSwgdGJbMF0pXG4gICAgICB9LCB7XG4gICAgICAgIGk6IGkgLSAyLFxuICAgICAgICB4OiBkM19pbnRlcnBvbGF0ZU51bWJlcih0YVsxXSwgdGJbMV0pXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRiWzBdIHx8IHRiWzFdKSB7XG4gICAgICBzLnB1c2goXCJ0cmFuc2xhdGUoXCIgKyB0YiArIFwiKVwiKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZDNfaW50ZXJwb2xhdGVSb3RhdGUocmEsIHJiLCBzLCBxKSB7XG4gICAgaWYgKHJhICE9PSByYikge1xuICAgICAgaWYgKHJhIC0gcmIgPiAxODApIHJiICs9IDM2MDsgZWxzZSBpZiAocmIgLSByYSA+IDE4MCkgcmEgKz0gMzYwO1xuICAgICAgcS5wdXNoKHtcbiAgICAgICAgaTogcy5wdXNoKGQzX2ludGVycG9sYXRlVHJhbnNmb3JtUG9wKHMpICsgXCJyb3RhdGUoXCIsIG51bGwsIFwiKVwiKSAtIDIsXG4gICAgICAgIHg6IGQzX2ludGVycG9sYXRlTnVtYmVyKHJhLCByYilcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocmIpIHtcbiAgICAgIHMucHVzaChkM19pbnRlcnBvbGF0ZVRyYW5zZm9ybVBvcChzKSArIFwicm90YXRlKFwiICsgcmIgKyBcIilcIik7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGQzX2ludGVycG9sYXRlU2tldyh3YSwgd2IsIHMsIHEpIHtcbiAgICBpZiAod2EgIT09IHdiKSB7XG4gICAgICBxLnB1c2goe1xuICAgICAgICBpOiBzLnB1c2goZDNfaW50ZXJwb2xhdGVUcmFuc2Zvcm1Qb3AocykgKyBcInNrZXdYKFwiLCBudWxsLCBcIilcIikgLSAyLFxuICAgICAgICB4OiBkM19pbnRlcnBvbGF0ZU51bWJlcih3YSwgd2IpXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHdiKSB7XG4gICAgICBzLnB1c2goZDNfaW50ZXJwb2xhdGVUcmFuc2Zvcm1Qb3AocykgKyBcInNrZXdYKFwiICsgd2IgKyBcIilcIik7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGQzX2ludGVycG9sYXRlU2NhbGUoa2EsIGtiLCBzLCBxKSB7XG4gICAgaWYgKGthWzBdICE9PSBrYlswXSB8fCBrYVsxXSAhPT0ga2JbMV0pIHtcbiAgICAgIHZhciBpID0gcy5wdXNoKGQzX2ludGVycG9sYXRlVHJhbnNmb3JtUG9wKHMpICsgXCJzY2FsZShcIiwgbnVsbCwgXCIsXCIsIG51bGwsIFwiKVwiKTtcbiAgICAgIHEucHVzaCh7XG4gICAgICAgIGk6IGkgLSA0LFxuICAgICAgICB4OiBkM19pbnRlcnBvbGF0ZU51bWJlcihrYVswXSwga2JbMF0pXG4gICAgICB9LCB7XG4gICAgICAgIGk6IGkgLSAyLFxuICAgICAgICB4OiBkM19pbnRlcnBvbGF0ZU51bWJlcihrYVsxXSwga2JbMV0pXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGtiWzBdICE9PSAxIHx8IGtiWzFdICE9PSAxKSB7XG4gICAgICBzLnB1c2goZDNfaW50ZXJwb2xhdGVUcmFuc2Zvcm1Qb3AocykgKyBcInNjYWxlKFwiICsga2IgKyBcIilcIik7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIGQzX2ludGVycG9sYXRlVHJhbnNmb3JtKGEsIGIpIHtcbiAgICB2YXIgcyA9IFtdLCBxID0gW107XG4gICAgYSA9IGQzLnRyYW5zZm9ybShhKSwgYiA9IGQzLnRyYW5zZm9ybShiKTtcbiAgICBkM19pbnRlcnBvbGF0ZVRyYW5zbGF0ZShhLnRyYW5zbGF0ZSwgYi50cmFuc2xhdGUsIHMsIHEpO1xuICAgIGQzX2ludGVycG9sYXRlUm90YXRlKGEucm90YXRlLCBiLnJvdGF0ZSwgcywgcSk7XG4gICAgZDNfaW50ZXJwb2xhdGVTa2V3KGEuc2tldywgYi5za2V3LCBzLCBxKTtcbiAgICBkM19pbnRlcnBvbGF0ZVNjYWxlKGEuc2NhbGUsIGIuc2NhbGUsIHMsIHEpO1xuICAgIGEgPSBiID0gbnVsbDtcbiAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgdmFyIGkgPSAtMSwgbiA9IHEubGVuZ3RoLCBvO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTtcbiAgICAgIHJldHVybiBzLmpvaW4oXCJcIik7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBkM191bmludGVycG9sYXRlTnVtYmVyKGEsIGIpIHtcbiAgICBiID0gKGIgLT0gYSA9ICthKSB8fCAxIC8gYjtcbiAgICByZXR1cm4gZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuICh4IC0gYSkgLyBiO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZDNfdW5pbnRlcnBvbGF0ZUNsYW1wKGEsIGIpIHtcbiAgICBiID0gKGIgLT0gYSA9ICthKSB8fCAxIC8gYjtcbiAgICByZXR1cm4gZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKDEsICh4IC0gYSkgLyBiKSk7XG4gICAgfTtcbiAgfVxuICBkMy5sYXlvdXQgPSB7fTtcbiAgZDMubGF5b3V0LmJ1bmRsZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBmdW5jdGlvbihsaW5rcykge1xuICAgICAgdmFyIHBhdGhzID0gW10sIGkgPSAtMSwgbiA9IGxpbmtzLmxlbmd0aDtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSBwYXRocy5wdXNoKGQzX2xheW91dF9idW5kbGVQYXRoKGxpbmtzW2ldKSk7XG4gICAgICByZXR1cm4gcGF0aHM7XG4gICAgfTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfbGF5b3V0X2J1bmRsZVBhdGgobGluaykge1xuICAgIHZhciBzdGFydCA9IGxpbmsuc291cmNlLCBlbmQgPSBsaW5rLnRhcmdldCwgbGNhID0gZDNfbGF5b3V0X2J1bmRsZUxlYXN0Q29tbW9uQW5jZXN0b3Ioc3RhcnQsIGVuZCksIHBvaW50cyA9IFsgc3RhcnQgXTtcbiAgICB3aGlsZSAoc3RhcnQgIT09IGxjYSkge1xuICAgICAgc3RhcnQgPSBzdGFydC5wYXJlbnQ7XG4gICAgICBwb2ludHMucHVzaChzdGFydCk7XG4gICAgfVxuICAgIHZhciBrID0gcG9pbnRzLmxlbmd0aDtcbiAgICB3aGlsZSAoZW5kICE9PSBsY2EpIHtcbiAgICAgIHBvaW50cy5zcGxpY2UoaywgMCwgZW5kKTtcbiAgICAgIGVuZCA9IGVuZC5wYXJlbnQ7XG4gICAgfVxuICAgIHJldHVybiBwb2ludHM7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X2J1bmRsZUFuY2VzdG9ycyhub2RlKSB7XG4gICAgdmFyIGFuY2VzdG9ycyA9IFtdLCBwYXJlbnQgPSBub2RlLnBhcmVudDtcbiAgICB3aGlsZSAocGFyZW50ICE9IG51bGwpIHtcbiAgICAgIGFuY2VzdG9ycy5wdXNoKG5vZGUpO1xuICAgICAgbm9kZSA9IHBhcmVudDtcbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XG4gICAgfVxuICAgIGFuY2VzdG9ycy5wdXNoKG5vZGUpO1xuICAgIHJldHVybiBhbmNlc3RvcnM7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X2J1bmRsZUxlYXN0Q29tbW9uQW5jZXN0b3IoYSwgYikge1xuICAgIGlmIChhID09PSBiKSByZXR1cm4gYTtcbiAgICB2YXIgYU5vZGVzID0gZDNfbGF5b3V0X2J1bmRsZUFuY2VzdG9ycyhhKSwgYk5vZGVzID0gZDNfbGF5b3V0X2J1bmRsZUFuY2VzdG9ycyhiKSwgYU5vZGUgPSBhTm9kZXMucG9wKCksIGJOb2RlID0gYk5vZGVzLnBvcCgpLCBzaGFyZWROb2RlID0gbnVsbDtcbiAgICB3aGlsZSAoYU5vZGUgPT09IGJOb2RlKSB7XG4gICAgICBzaGFyZWROb2RlID0gYU5vZGU7XG4gICAgICBhTm9kZSA9IGFOb2Rlcy5wb3AoKTtcbiAgICAgIGJOb2RlID0gYk5vZGVzLnBvcCgpO1xuICAgIH1cbiAgICByZXR1cm4gc2hhcmVkTm9kZTtcbiAgfVxuICBkMy5sYXlvdXQuY2hvcmQgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgY2hvcmQgPSB7fSwgY2hvcmRzLCBncm91cHMsIG1hdHJpeCwgbiwgcGFkZGluZyA9IDAsIHNvcnRHcm91cHMsIHNvcnRTdWJncm91cHMsIHNvcnRDaG9yZHM7XG4gICAgZnVuY3Rpb24gcmVsYXlvdXQoKSB7XG4gICAgICB2YXIgc3ViZ3JvdXBzID0ge30sIGdyb3VwU3VtcyA9IFtdLCBncm91cEluZGV4ID0gZDMucmFuZ2UobiksIHN1Ymdyb3VwSW5kZXggPSBbXSwgaywgeCwgeDAsIGksIGo7XG4gICAgICBjaG9yZHMgPSBbXTtcbiAgICAgIGdyb3VwcyA9IFtdO1xuICAgICAgayA9IDAsIGkgPSAtMTtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgIHggPSAwLCBqID0gLTE7XG4gICAgICAgIHdoaWxlICgrK2ogPCBuKSB7XG4gICAgICAgICAgeCArPSBtYXRyaXhbaV1bal07XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXBTdW1zLnB1c2goeCk7XG4gICAgICAgIHN1Ymdyb3VwSW5kZXgucHVzaChkMy5yYW5nZShuKSk7XG4gICAgICAgIGsgKz0geDtcbiAgICAgIH1cbiAgICAgIGlmIChzb3J0R3JvdXBzKSB7XG4gICAgICAgIGdyb3VwSW5kZXguc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgICAgcmV0dXJuIHNvcnRHcm91cHMoZ3JvdXBTdW1zW2FdLCBncm91cFN1bXNbYl0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChzb3J0U3ViZ3JvdXBzKSB7XG4gICAgICAgIHN1Ymdyb3VwSW5kZXguZm9yRWFjaChmdW5jdGlvbihkLCBpKSB7XG4gICAgICAgICAgZC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3J0U3ViZ3JvdXBzKG1hdHJpeFtpXVthXSwgbWF0cml4W2ldW2JdKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBrID0gKM+EIC0gcGFkZGluZyAqIG4pIC8gaztcbiAgICAgIHggPSAwLCBpID0gLTE7XG4gICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICB4MCA9IHgsIGogPSAtMTtcbiAgICAgICAgd2hpbGUgKCsraiA8IG4pIHtcbiAgICAgICAgICB2YXIgZGkgPSBncm91cEluZGV4W2ldLCBkaiA9IHN1Ymdyb3VwSW5kZXhbZGldW2pdLCB2ID0gbWF0cml4W2RpXVtkal0sIGEwID0geCwgYTEgPSB4ICs9IHYgKiBrO1xuICAgICAgICAgIHN1Ymdyb3Vwc1tkaSArIFwiLVwiICsgZGpdID0ge1xuICAgICAgICAgICAgaW5kZXg6IGRpLFxuICAgICAgICAgICAgc3ViaW5kZXg6IGRqLFxuICAgICAgICAgICAgc3RhcnRBbmdsZTogYTAsXG4gICAgICAgICAgICBlbmRBbmdsZTogYTEsXG4gICAgICAgICAgICB2YWx1ZTogdlxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZ3JvdXBzW2RpXSA9IHtcbiAgICAgICAgICBpbmRleDogZGksXG4gICAgICAgICAgc3RhcnRBbmdsZTogeDAsXG4gICAgICAgICAgZW5kQW5nbGU6IHgsXG4gICAgICAgICAgdmFsdWU6IGdyb3VwU3Vtc1tkaV1cbiAgICAgICAgfTtcbiAgICAgICAgeCArPSBwYWRkaW5nO1xuICAgICAgfVxuICAgICAgaSA9IC0xO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgaiA9IGkgLSAxO1xuICAgICAgICB3aGlsZSAoKytqIDwgbikge1xuICAgICAgICAgIHZhciBzb3VyY2UgPSBzdWJncm91cHNbaSArIFwiLVwiICsgal0sIHRhcmdldCA9IHN1Ymdyb3Vwc1tqICsgXCItXCIgKyBpXTtcbiAgICAgICAgICBpZiAoc291cmNlLnZhbHVlIHx8IHRhcmdldC52YWx1ZSkge1xuICAgICAgICAgICAgY2hvcmRzLnB1c2goc291cmNlLnZhbHVlIDwgdGFyZ2V0LnZhbHVlID8ge1xuICAgICAgICAgICAgICBzb3VyY2U6IHRhcmdldCxcbiAgICAgICAgICAgICAgdGFyZ2V0OiBzb3VyY2VcbiAgICAgICAgICAgIH0gOiB7XG4gICAgICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgICAgICB0YXJnZXQ6IHRhcmdldFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc29ydENob3JkcykgcmVzb3J0KCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlc29ydCgpIHtcbiAgICAgIGNob3Jkcy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIHNvcnRDaG9yZHMoKGEuc291cmNlLnZhbHVlICsgYS50YXJnZXQudmFsdWUpIC8gMiwgKGIuc291cmNlLnZhbHVlICsgYi50YXJnZXQudmFsdWUpIC8gMik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgY2hvcmQubWF0cml4ID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbWF0cml4O1xuICAgICAgbiA9IChtYXRyaXggPSB4KSAmJiBtYXRyaXgubGVuZ3RoO1xuICAgICAgY2hvcmRzID0gZ3JvdXBzID0gbnVsbDtcbiAgICAgIHJldHVybiBjaG9yZDtcbiAgICB9O1xuICAgIGNob3JkLnBhZGRpbmcgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwYWRkaW5nO1xuICAgICAgcGFkZGluZyA9IHg7XG4gICAgICBjaG9yZHMgPSBncm91cHMgPSBudWxsO1xuICAgICAgcmV0dXJuIGNob3JkO1xuICAgIH07XG4gICAgY2hvcmQuc29ydEdyb3VwcyA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvcnRHcm91cHM7XG4gICAgICBzb3J0R3JvdXBzID0geDtcbiAgICAgIGNob3JkcyA9IGdyb3VwcyA9IG51bGw7XG4gICAgICByZXR1cm4gY2hvcmQ7XG4gICAgfTtcbiAgICBjaG9yZC5zb3J0U3ViZ3JvdXBzID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc29ydFN1Ymdyb3VwcztcbiAgICAgIHNvcnRTdWJncm91cHMgPSB4O1xuICAgICAgY2hvcmRzID0gbnVsbDtcbiAgICAgIHJldHVybiBjaG9yZDtcbiAgICB9O1xuICAgIGNob3JkLnNvcnRDaG9yZHMgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3J0Q2hvcmRzO1xuICAgICAgc29ydENob3JkcyA9IHg7XG4gICAgICBpZiAoY2hvcmRzKSByZXNvcnQoKTtcbiAgICAgIHJldHVybiBjaG9yZDtcbiAgICB9O1xuICAgIGNob3JkLmNob3JkcyA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFjaG9yZHMpIHJlbGF5b3V0KCk7XG4gICAgICByZXR1cm4gY2hvcmRzO1xuICAgIH07XG4gICAgY2hvcmQuZ3JvdXBzID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIWdyb3VwcykgcmVsYXlvdXQoKTtcbiAgICAgIHJldHVybiBncm91cHM7XG4gICAgfTtcbiAgICByZXR1cm4gY2hvcmQ7XG4gIH07XG4gIGQzLmxheW91dC5mb3JjZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBmb3JjZSA9IHt9LCBldmVudCA9IGQzLmRpc3BhdGNoKFwic3RhcnRcIiwgXCJ0aWNrXCIsIFwiZW5kXCIpLCB0aW1lciwgc2l6ZSA9IFsgMSwgMSBdLCBkcmFnLCBhbHBoYSwgZnJpY3Rpb24gPSAuOSwgbGlua0Rpc3RhbmNlID0gZDNfbGF5b3V0X2ZvcmNlTGlua0Rpc3RhbmNlLCBsaW5rU3RyZW5ndGggPSBkM19sYXlvdXRfZm9yY2VMaW5rU3RyZW5ndGgsIGNoYXJnZSA9IC0zMCwgY2hhcmdlRGlzdGFuY2UyID0gZDNfbGF5b3V0X2ZvcmNlQ2hhcmdlRGlzdGFuY2UyLCBncmF2aXR5ID0gLjEsIHRoZXRhMiA9IC42NCwgbm9kZXMgPSBbXSwgbGlua3MgPSBbXSwgZGlzdGFuY2VzLCBzdHJlbmd0aHMsIGNoYXJnZXM7XG4gICAgZnVuY3Rpb24gcmVwdWxzZShub2RlKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24ocXVhZCwgeDEsIF8sIHgyKSB7XG4gICAgICAgIGlmIChxdWFkLnBvaW50ICE9PSBub2RlKSB7XG4gICAgICAgICAgdmFyIGR4ID0gcXVhZC5jeCAtIG5vZGUueCwgZHkgPSBxdWFkLmN5IC0gbm9kZS55LCBkdyA9IHgyIC0geDEsIGRuID0gZHggKiBkeCArIGR5ICogZHk7XG4gICAgICAgICAgaWYgKGR3ICogZHcgLyB0aGV0YTIgPCBkbikge1xuICAgICAgICAgICAgaWYgKGRuIDwgY2hhcmdlRGlzdGFuY2UyKSB7XG4gICAgICAgICAgICAgIHZhciBrID0gcXVhZC5jaGFyZ2UgLyBkbjtcbiAgICAgICAgICAgICAgbm9kZS5weCAtPSBkeCAqIGs7XG4gICAgICAgICAgICAgIG5vZGUucHkgLT0gZHkgKiBrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChxdWFkLnBvaW50ICYmIGRuICYmIGRuIDwgY2hhcmdlRGlzdGFuY2UyKSB7XG4gICAgICAgICAgICB2YXIgayA9IHF1YWQucG9pbnRDaGFyZ2UgLyBkbjtcbiAgICAgICAgICAgIG5vZGUucHggLT0gZHggKiBrO1xuICAgICAgICAgICAgbm9kZS5weSAtPSBkeSAqIGs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhcXVhZC5jaGFyZ2U7XG4gICAgICB9O1xuICAgIH1cbiAgICBmb3JjZS50aWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoKGFscGhhICo9IC45OSkgPCAuMDA1KSB7XG4gICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgICAgZXZlbnQuZW5kKHtcbiAgICAgICAgICB0eXBlOiBcImVuZFwiLFxuICAgICAgICAgIGFscGhhOiBhbHBoYSA9IDBcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdmFyIG4gPSBub2Rlcy5sZW5ndGgsIG0gPSBsaW5rcy5sZW5ndGgsIHEsIGksIG8sIHMsIHQsIGwsIGssIHgsIHk7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSB7XG4gICAgICAgIG8gPSBsaW5rc1tpXTtcbiAgICAgICAgcyA9IG8uc291cmNlO1xuICAgICAgICB0ID0gby50YXJnZXQ7XG4gICAgICAgIHggPSB0LnggLSBzLng7XG4gICAgICAgIHkgPSB0LnkgLSBzLnk7XG4gICAgICAgIGlmIChsID0geCAqIHggKyB5ICogeSkge1xuICAgICAgICAgIGwgPSBhbHBoYSAqIHN0cmVuZ3Roc1tpXSAqICgobCA9IE1hdGguc3FydChsKSkgLSBkaXN0YW5jZXNbaV0pIC8gbDtcbiAgICAgICAgICB4ICo9IGw7XG4gICAgICAgICAgeSAqPSBsO1xuICAgICAgICAgIHQueCAtPSB4ICogKGsgPSBzLndlaWdodCArIHQud2VpZ2h0ID8gcy53ZWlnaHQgLyAocy53ZWlnaHQgKyB0LndlaWdodCkgOiAuNSk7XG4gICAgICAgICAgdC55IC09IHkgKiBrO1xuICAgICAgICAgIHMueCArPSB4ICogKGsgPSAxIC0gayk7XG4gICAgICAgICAgcy55ICs9IHkgKiBrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoayA9IGFscGhhICogZ3Jhdml0eSkge1xuICAgICAgICB4ID0gc2l6ZVswXSAvIDI7XG4gICAgICAgIHkgPSBzaXplWzFdIC8gMjtcbiAgICAgICAgaSA9IC0xO1xuICAgICAgICBpZiAoaykgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgICBvID0gbm9kZXNbaV07XG4gICAgICAgICAgby54ICs9ICh4IC0gby54KSAqIGs7XG4gICAgICAgICAgby55ICs9ICh5IC0gby55KSAqIGs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjaGFyZ2UpIHtcbiAgICAgICAgZDNfbGF5b3V0X2ZvcmNlQWNjdW11bGF0ZShxID0gZDMuZ2VvbS5xdWFkdHJlZShub2RlcyksIGFscGhhLCBjaGFyZ2VzKTtcbiAgICAgICAgaSA9IC0xO1xuICAgICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICAgIGlmICghKG8gPSBub2Rlc1tpXSkuZml4ZWQpIHtcbiAgICAgICAgICAgIHEudmlzaXQocmVwdWxzZShvKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpID0gLTE7XG4gICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICBvID0gbm9kZXNbaV07XG4gICAgICAgIGlmIChvLmZpeGVkKSB7XG4gICAgICAgICAgby54ID0gby5weDtcbiAgICAgICAgICBvLnkgPSBvLnB5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG8ueCAtPSAoby5weCAtIChvLnB4ID0gby54KSkgKiBmcmljdGlvbjtcbiAgICAgICAgICBvLnkgLT0gKG8ucHkgLSAoby5weSA9IG8ueSkpICogZnJpY3Rpb247XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGV2ZW50LnRpY2soe1xuICAgICAgICB0eXBlOiBcInRpY2tcIixcbiAgICAgICAgYWxwaGE6IGFscGhhXG4gICAgICB9KTtcbiAgICB9O1xuICAgIGZvcmNlLm5vZGVzID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbm9kZXM7XG4gICAgICBub2RlcyA9IHg7XG4gICAgICByZXR1cm4gZm9yY2U7XG4gICAgfTtcbiAgICBmb3JjZS5saW5rcyA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxpbmtzO1xuICAgICAgbGlua3MgPSB4O1xuICAgICAgcmV0dXJuIGZvcmNlO1xuICAgIH07XG4gICAgZm9yY2Uuc2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7XG4gICAgICBzaXplID0geDtcbiAgICAgIHJldHVybiBmb3JjZTtcbiAgICB9O1xuICAgIGZvcmNlLmxpbmtEaXN0YW5jZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxpbmtEaXN0YW5jZTtcbiAgICAgIGxpbmtEaXN0YW5jZSA9IHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4IDogK3g7XG4gICAgICByZXR1cm4gZm9yY2U7XG4gICAgfTtcbiAgICBmb3JjZS5kaXN0YW5jZSA9IGZvcmNlLmxpbmtEaXN0YW5jZTtcbiAgICBmb3JjZS5saW5rU3RyZW5ndGggPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsaW5rU3RyZW5ndGg7XG4gICAgICBsaW5rU3RyZW5ndGggPSB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geCA6ICt4O1xuICAgICAgcmV0dXJuIGZvcmNlO1xuICAgIH07XG4gICAgZm9yY2UuZnJpY3Rpb24gPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBmcmljdGlvbjtcbiAgICAgIGZyaWN0aW9uID0gK3g7XG4gICAgICByZXR1cm4gZm9yY2U7XG4gICAgfTtcbiAgICBmb3JjZS5jaGFyZ2UgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjaGFyZ2U7XG4gICAgICBjaGFyZ2UgPSB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geCA6ICt4O1xuICAgICAgcmV0dXJuIGZvcmNlO1xuICAgIH07XG4gICAgZm9yY2UuY2hhcmdlRGlzdGFuY2UgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBNYXRoLnNxcnQoY2hhcmdlRGlzdGFuY2UyKTtcbiAgICAgIGNoYXJnZURpc3RhbmNlMiA9IHggKiB4O1xuICAgICAgcmV0dXJuIGZvcmNlO1xuICAgIH07XG4gICAgZm9yY2UuZ3Jhdml0eSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGdyYXZpdHk7XG4gICAgICBncmF2aXR5ID0gK3g7XG4gICAgICByZXR1cm4gZm9yY2U7XG4gICAgfTtcbiAgICBmb3JjZS50aGV0YSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIE1hdGguc3FydCh0aGV0YTIpO1xuICAgICAgdGhldGEyID0geCAqIHg7XG4gICAgICByZXR1cm4gZm9yY2U7XG4gICAgfTtcbiAgICBmb3JjZS5hbHBoYSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGFscGhhO1xuICAgICAgeCA9ICt4O1xuICAgICAgaWYgKGFscGhhKSB7XG4gICAgICAgIGlmICh4ID4gMCkge1xuICAgICAgICAgIGFscGhhID0geDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aW1lci5jID0gbnVsbCwgdGltZXIudCA9IE5hTiwgdGltZXIgPSBudWxsO1xuICAgICAgICAgIGV2ZW50LmVuZCh7XG4gICAgICAgICAgICB0eXBlOiBcImVuZFwiLFxuICAgICAgICAgICAgYWxwaGE6IGFscGhhID0gMFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHggPiAwKSB7XG4gICAgICAgIGV2ZW50LnN0YXJ0KHtcbiAgICAgICAgICB0eXBlOiBcInN0YXJ0XCIsXG4gICAgICAgICAgYWxwaGE6IGFscGhhID0geFxuICAgICAgICB9KTtcbiAgICAgICAgdGltZXIgPSBkM190aW1lcihmb3JjZS50aWNrKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmb3JjZTtcbiAgICB9O1xuICAgIGZvcmNlLnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aCwgbSA9IGxpbmtzLmxlbmd0aCwgdyA9IHNpemVbMF0sIGggPSBzaXplWzFdLCBuZWlnaGJvcnMsIG87XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICAgIChvID0gbm9kZXNbaV0pLmluZGV4ID0gaTtcbiAgICAgICAgby53ZWlnaHQgPSAwO1xuICAgICAgfVxuICAgICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkge1xuICAgICAgICBvID0gbGlua3NbaV07XG4gICAgICAgIGlmICh0eXBlb2Ygby5zb3VyY2UgPT0gXCJudW1iZXJcIikgby5zb3VyY2UgPSBub2Rlc1tvLnNvdXJjZV07XG4gICAgICAgIGlmICh0eXBlb2Ygby50YXJnZXQgPT0gXCJudW1iZXJcIikgby50YXJnZXQgPSBub2Rlc1tvLnRhcmdldF07XG4gICAgICAgICsrby5zb3VyY2Uud2VpZ2h0O1xuICAgICAgICArK28udGFyZ2V0LndlaWdodDtcbiAgICAgIH1cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgbyA9IG5vZGVzW2ldO1xuICAgICAgICBpZiAoaXNOYU4oby54KSkgby54ID0gcG9zaXRpb24oXCJ4XCIsIHcpO1xuICAgICAgICBpZiAoaXNOYU4oby55KSkgby55ID0gcG9zaXRpb24oXCJ5XCIsIGgpO1xuICAgICAgICBpZiAoaXNOYU4oby5weCkpIG8ucHggPSBvLng7XG4gICAgICAgIGlmIChpc05hTihvLnB5KSkgby5weSA9IG8ueTtcbiAgICAgIH1cbiAgICAgIGRpc3RhbmNlcyA9IFtdO1xuICAgICAgaWYgKHR5cGVvZiBsaW5rRGlzdGFuY2UgPT09IFwiZnVuY3Rpb25cIikgZm9yIChpID0gMDsgaSA8IG07ICsraSkgZGlzdGFuY2VzW2ldID0gK2xpbmtEaXN0YW5jZS5jYWxsKHRoaXMsIGxpbmtzW2ldLCBpKTsgZWxzZSBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSBkaXN0YW5jZXNbaV0gPSBsaW5rRGlzdGFuY2U7XG4gICAgICBzdHJlbmd0aHMgPSBbXTtcbiAgICAgIGlmICh0eXBlb2YgbGlua1N0cmVuZ3RoID09PSBcImZ1bmN0aW9uXCIpIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHN0cmVuZ3Roc1tpXSA9ICtsaW5rU3RyZW5ndGguY2FsbCh0aGlzLCBsaW5rc1tpXSwgaSk7IGVsc2UgZm9yIChpID0gMDsgaSA8IG07ICsraSkgc3RyZW5ndGhzW2ldID0gbGlua1N0cmVuZ3RoO1xuICAgICAgY2hhcmdlcyA9IFtdO1xuICAgICAgaWYgKHR5cGVvZiBjaGFyZ2UgPT09IFwiZnVuY3Rpb25cIikgZm9yIChpID0gMDsgaSA8IG47ICsraSkgY2hhcmdlc1tpXSA9ICtjaGFyZ2UuY2FsbCh0aGlzLCBub2Rlc1tpXSwgaSk7IGVsc2UgZm9yIChpID0gMDsgaSA8IG47ICsraSkgY2hhcmdlc1tpXSA9IGNoYXJnZTtcbiAgICAgIGZ1bmN0aW9uIHBvc2l0aW9uKGRpbWVuc2lvbiwgc2l6ZSkge1xuICAgICAgICBpZiAoIW5laWdoYm9ycykge1xuICAgICAgICAgIG5laWdoYm9ycyA9IG5ldyBBcnJheShuKTtcbiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgKytqKSB7XG4gICAgICAgICAgICBuZWlnaGJvcnNbal0gPSBbXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikge1xuICAgICAgICAgICAgdmFyIG8gPSBsaW5rc1tqXTtcbiAgICAgICAgICAgIG5laWdoYm9yc1tvLnNvdXJjZS5pbmRleF0ucHVzaChvLnRhcmdldCk7XG4gICAgICAgICAgICBuZWlnaGJvcnNbby50YXJnZXQuaW5kZXhdLnB1c2goby5zb3VyY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgY2FuZGlkYXRlcyA9IG5laWdoYm9yc1tpXSwgaiA9IC0xLCBsID0gY2FuZGlkYXRlcy5sZW5ndGgsIHg7XG4gICAgICAgIHdoaWxlICgrK2ogPCBsKSBpZiAoIWlzTmFOKHggPSBjYW5kaWRhdGVzW2pdW2RpbWVuc2lvbl0pKSByZXR1cm4geDtcbiAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgKiBzaXplO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZvcmNlLnJlc3VtZSgpO1xuICAgIH07XG4gICAgZm9yY2UucmVzdW1lID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZm9yY2UuYWxwaGEoLjEpO1xuICAgIH07XG4gICAgZm9yY2Uuc3RvcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZvcmNlLmFscGhhKDApO1xuICAgIH07XG4gICAgZm9yY2UuZHJhZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFkcmFnKSBkcmFnID0gZDMuYmVoYXZpb3IuZHJhZygpLm9yaWdpbihkM19pZGVudGl0eSkub24oXCJkcmFnc3RhcnQuZm9yY2VcIiwgZDNfbGF5b3V0X2ZvcmNlRHJhZ3N0YXJ0KS5vbihcImRyYWcuZm9yY2VcIiwgZHJhZ21vdmUpLm9uKFwiZHJhZ2VuZC5mb3JjZVwiLCBkM19sYXlvdXRfZm9yY2VEcmFnZW5kKTtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRyYWc7XG4gICAgICB0aGlzLm9uKFwibW91c2VvdmVyLmZvcmNlXCIsIGQzX2xheW91dF9mb3JjZU1vdXNlb3Zlcikub24oXCJtb3VzZW91dC5mb3JjZVwiLCBkM19sYXlvdXRfZm9yY2VNb3VzZW91dCkuY2FsbChkcmFnKTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGRyYWdtb3ZlKGQpIHtcbiAgICAgIGQucHggPSBkMy5ldmVudC54LCBkLnB5ID0gZDMuZXZlbnQueTtcbiAgICAgIGZvcmNlLnJlc3VtZSgpO1xuICAgIH1cbiAgICByZXR1cm4gZDMucmViaW5kKGZvcmNlLCBldmVudCwgXCJvblwiKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfbGF5b3V0X2ZvcmNlRHJhZ3N0YXJ0KGQpIHtcbiAgICBkLmZpeGVkIHw9IDI7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X2ZvcmNlRHJhZ2VuZChkKSB7XG4gICAgZC5maXhlZCAmPSB+NjtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfZm9yY2VNb3VzZW92ZXIoZCkge1xuICAgIGQuZml4ZWQgfD0gNDtcbiAgICBkLnB4ID0gZC54LCBkLnB5ID0gZC55O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9mb3JjZU1vdXNlb3V0KGQpIHtcbiAgICBkLmZpeGVkICY9IH40O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9mb3JjZUFjY3VtdWxhdGUocXVhZCwgYWxwaGEsIGNoYXJnZXMpIHtcbiAgICB2YXIgY3ggPSAwLCBjeSA9IDA7XG4gICAgcXVhZC5jaGFyZ2UgPSAwO1xuICAgIGlmICghcXVhZC5sZWFmKSB7XG4gICAgICB2YXIgbm9kZXMgPSBxdWFkLm5vZGVzLCBuID0gbm9kZXMubGVuZ3RoLCBpID0gLTEsIGM7XG4gICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICBjID0gbm9kZXNbaV07XG4gICAgICAgIGlmIChjID09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICBkM19sYXlvdXRfZm9yY2VBY2N1bXVsYXRlKGMsIGFscGhhLCBjaGFyZ2VzKTtcbiAgICAgICAgcXVhZC5jaGFyZ2UgKz0gYy5jaGFyZ2U7XG4gICAgICAgIGN4ICs9IGMuY2hhcmdlICogYy5jeDtcbiAgICAgICAgY3kgKz0gYy5jaGFyZ2UgKiBjLmN5O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocXVhZC5wb2ludCkge1xuICAgICAgaWYgKCFxdWFkLmxlYWYpIHtcbiAgICAgICAgcXVhZC5wb2ludC54ICs9IE1hdGgucmFuZG9tKCkgLSAuNTtcbiAgICAgICAgcXVhZC5wb2ludC55ICs9IE1hdGgucmFuZG9tKCkgLSAuNTtcbiAgICAgIH1cbiAgICAgIHZhciBrID0gYWxwaGEgKiBjaGFyZ2VzW3F1YWQucG9pbnQuaW5kZXhdO1xuICAgICAgcXVhZC5jaGFyZ2UgKz0gcXVhZC5wb2ludENoYXJnZSA9IGs7XG4gICAgICBjeCArPSBrICogcXVhZC5wb2ludC54O1xuICAgICAgY3kgKz0gayAqIHF1YWQucG9pbnQueTtcbiAgICB9XG4gICAgcXVhZC5jeCA9IGN4IC8gcXVhZC5jaGFyZ2U7XG4gICAgcXVhZC5jeSA9IGN5IC8gcXVhZC5jaGFyZ2U7XG4gIH1cbiAgdmFyIGQzX2xheW91dF9mb3JjZUxpbmtEaXN0YW5jZSA9IDIwLCBkM19sYXlvdXRfZm9yY2VMaW5rU3RyZW5ndGggPSAxLCBkM19sYXlvdXRfZm9yY2VDaGFyZ2VEaXN0YW5jZTIgPSBJbmZpbml0eTtcbiAgZDMubGF5b3V0LmhpZXJhcmNoeSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzb3J0ID0gZDNfbGF5b3V0X2hpZXJhcmNoeVNvcnQsIGNoaWxkcmVuID0gZDNfbGF5b3V0X2hpZXJhcmNoeUNoaWxkcmVuLCB2YWx1ZSA9IGQzX2xheW91dF9oaWVyYXJjaHlWYWx1ZTtcbiAgICBmdW5jdGlvbiBoaWVyYXJjaHkocm9vdCkge1xuICAgICAgdmFyIHN0YWNrID0gWyByb290IF0sIG5vZGVzID0gW10sIG5vZGU7XG4gICAgICByb290LmRlcHRoID0gMDtcbiAgICAgIHdoaWxlICgobm9kZSA9IHN0YWNrLnBvcCgpKSAhPSBudWxsKSB7XG4gICAgICAgIG5vZGVzLnB1c2gobm9kZSk7XG4gICAgICAgIGlmICgoY2hpbGRzID0gY2hpbGRyZW4uY2FsbChoaWVyYXJjaHksIG5vZGUsIG5vZGUuZGVwdGgpKSAmJiAobiA9IGNoaWxkcy5sZW5ndGgpKSB7XG4gICAgICAgICAgdmFyIG4sIGNoaWxkcywgY2hpbGQ7XG4gICAgICAgICAgd2hpbGUgKC0tbiA+PSAwKSB7XG4gICAgICAgICAgICBzdGFjay5wdXNoKGNoaWxkID0gY2hpbGRzW25dKTtcbiAgICAgICAgICAgIGNoaWxkLnBhcmVudCA9IG5vZGU7XG4gICAgICAgICAgICBjaGlsZC5kZXB0aCA9IG5vZGUuZGVwdGggKyAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmFsdWUpIG5vZGUudmFsdWUgPSAwO1xuICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBjaGlsZHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHZhbHVlKSBub2RlLnZhbHVlID0gK3ZhbHVlLmNhbGwoaGllcmFyY2h5LCBub2RlLCBub2RlLmRlcHRoKSB8fCAwO1xuICAgICAgICAgIGRlbGV0ZSBub2RlLmNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRBZnRlcihyb290LCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHZhciBjaGlsZHMsIHBhcmVudDtcbiAgICAgICAgaWYgKHNvcnQgJiYgKGNoaWxkcyA9IG5vZGUuY2hpbGRyZW4pKSBjaGlsZHMuc29ydChzb3J0KTtcbiAgICAgICAgaWYgKHZhbHVlICYmIChwYXJlbnQgPSBub2RlLnBhcmVudCkpIHBhcmVudC52YWx1ZSArPSBub2RlLnZhbHVlO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbm9kZXM7XG4gICAgfVxuICAgIGhpZXJhcmNoeS5zb3J0ID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc29ydDtcbiAgICAgIHNvcnQgPSB4O1xuICAgICAgcmV0dXJuIGhpZXJhcmNoeTtcbiAgICB9O1xuICAgIGhpZXJhcmNoeS5jaGlsZHJlbiA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNoaWxkcmVuO1xuICAgICAgY2hpbGRyZW4gPSB4O1xuICAgICAgcmV0dXJuIGhpZXJhcmNoeTtcbiAgICB9O1xuICAgIGhpZXJhcmNoeS52YWx1ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHZhbHVlO1xuICAgICAgdmFsdWUgPSB4O1xuICAgICAgcmV0dXJuIGhpZXJhcmNoeTtcbiAgICB9O1xuICAgIGhpZXJhcmNoeS5yZXZhbHVlID0gZnVuY3Rpb24ocm9vdCkge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEJlZm9yZShyb290LCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIG5vZGUudmFsdWUgPSAwO1xuICAgICAgICB9KTtcbiAgICAgICAgZDNfbGF5b3V0X2hpZXJhcmNoeVZpc2l0QWZ0ZXIocm9vdCwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIHZhciBwYXJlbnQ7XG4gICAgICAgICAgaWYgKCFub2RlLmNoaWxkcmVuKSBub2RlLnZhbHVlID0gK3ZhbHVlLmNhbGwoaGllcmFyY2h5LCBub2RlLCBub2RlLmRlcHRoKSB8fCAwO1xuICAgICAgICAgIGlmIChwYXJlbnQgPSBub2RlLnBhcmVudCkgcGFyZW50LnZhbHVlICs9IG5vZGUudmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJvb3Q7XG4gICAgfTtcbiAgICByZXR1cm4gaGllcmFyY2h5O1xuICB9O1xuICBmdW5jdGlvbiBkM19sYXlvdXRfaGllcmFyY2h5UmViaW5kKG9iamVjdCwgaGllcmFyY2h5KSB7XG4gICAgZDMucmViaW5kKG9iamVjdCwgaGllcmFyY2h5LCBcInNvcnRcIiwgXCJjaGlsZHJlblwiLCBcInZhbHVlXCIpO1xuICAgIG9iamVjdC5ub2RlcyA9IG9iamVjdDtcbiAgICBvYmplY3QubGlua3MgPSBkM19sYXlvdXRfaGllcmFyY2h5TGlua3M7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRCZWZvcmUobm9kZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgbm9kZXMgPSBbIG5vZGUgXTtcbiAgICB3aGlsZSAoKG5vZGUgPSBub2Rlcy5wb3AoKSkgIT0gbnVsbCkge1xuICAgICAgY2FsbGJhY2sobm9kZSk7XG4gICAgICBpZiAoKGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbikgJiYgKG4gPSBjaGlsZHJlbi5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBuLCBjaGlsZHJlbjtcbiAgICAgICAgd2hpbGUgKC0tbiA+PSAwKSBub2Rlcy5wdXNoKGNoaWxkcmVuW25dKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X2hpZXJhcmNoeVZpc2l0QWZ0ZXIobm9kZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgbm9kZXMgPSBbIG5vZGUgXSwgbm9kZXMyID0gW107XG4gICAgd2hpbGUgKChub2RlID0gbm9kZXMucG9wKCkpICE9IG51bGwpIHtcbiAgICAgIG5vZGVzMi5wdXNoKG5vZGUpO1xuICAgICAgaWYgKChjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4pICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuLCBjaGlsZHJlbjtcbiAgICAgICAgd2hpbGUgKCsraSA8IG4pIG5vZGVzLnB1c2goY2hpbGRyZW5baV0pO1xuICAgICAgfVxuICAgIH1cbiAgICB3aGlsZSAoKG5vZGUgPSBub2RlczIucG9wKCkpICE9IG51bGwpIHtcbiAgICAgIGNhbGxiYWNrKG5vZGUpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfaGllcmFyY2h5Q2hpbGRyZW4oZCkge1xuICAgIHJldHVybiBkLmNoaWxkcmVuO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9oaWVyYXJjaHlWYWx1ZShkKSB7XG4gICAgcmV0dXJuIGQudmFsdWU7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X2hpZXJhcmNoeVNvcnQoYSwgYikge1xuICAgIHJldHVybiBiLnZhbHVlIC0gYS52YWx1ZTtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfaGllcmFyY2h5TGlua3Mobm9kZXMpIHtcbiAgICByZXR1cm4gZDMubWVyZ2Uobm9kZXMubWFwKGZ1bmN0aW9uKHBhcmVudCkge1xuICAgICAgcmV0dXJuIChwYXJlbnQuY2hpbGRyZW4gfHwgW10pLm1hcChmdW5jdGlvbihjaGlsZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNvdXJjZTogcGFyZW50LFxuICAgICAgICAgIHRhcmdldDogY2hpbGRcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0pKTtcbiAgfVxuICBkMy5sYXlvdXQucGFydGl0aW9uID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGhpZXJhcmNoeSA9IGQzLmxheW91dC5oaWVyYXJjaHkoKSwgc2l6ZSA9IFsgMSwgMSBdO1xuICAgIGZ1bmN0aW9uIHBvc2l0aW9uKG5vZGUsIHgsIGR4LCBkeSkge1xuICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICAgIG5vZGUueCA9IHg7XG4gICAgICBub2RlLnkgPSBub2RlLmRlcHRoICogZHk7XG4gICAgICBub2RlLmR4ID0gZHg7XG4gICAgICBub2RlLmR5ID0gZHk7XG4gICAgICBpZiAoY2hpbGRyZW4gJiYgKG4gPSBjaGlsZHJlbi5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG4sIGMsIGQ7XG4gICAgICAgIGR4ID0gbm9kZS52YWx1ZSA/IGR4IC8gbm9kZS52YWx1ZSA6IDA7XG4gICAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgICAgcG9zaXRpb24oYyA9IGNoaWxkcmVuW2ldLCB4LCBkID0gYy52YWx1ZSAqIGR4LCBkeSk7XG4gICAgICAgICAgeCArPSBkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlcHRoKG5vZGUpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sIGQgPSAwO1xuICAgICAgaWYgKGNoaWxkcmVuICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSkge1xuICAgICAgICB2YXIgaSA9IC0xLCBuO1xuICAgICAgICB3aGlsZSAoKytpIDwgbikgZCA9IE1hdGgubWF4KGQsIGRlcHRoKGNoaWxkcmVuW2ldKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gMSArIGQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBhcnRpdGlvbihkLCBpKSB7XG4gICAgICB2YXIgbm9kZXMgPSBoaWVyYXJjaHkuY2FsbCh0aGlzLCBkLCBpKTtcbiAgICAgIHBvc2l0aW9uKG5vZGVzWzBdLCAwLCBzaXplWzBdLCBzaXplWzFdIC8gZGVwdGgobm9kZXNbMF0pKTtcbiAgICAgIHJldHVybiBub2RlcztcbiAgICB9XG4gICAgcGFydGl0aW9uLnNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplO1xuICAgICAgc2l6ZSA9IHg7XG4gICAgICByZXR1cm4gcGFydGl0aW9uO1xuICAgIH07XG4gICAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQocGFydGl0aW9uLCBoaWVyYXJjaHkpO1xuICB9O1xuICBkMy5sYXlvdXQucGllID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHZhbHVlID0gTnVtYmVyLCBzb3J0ID0gZDNfbGF5b3V0X3BpZVNvcnRCeVZhbHVlLCBzdGFydEFuZ2xlID0gMCwgZW5kQW5nbGUgPSDPhCwgcGFkQW5nbGUgPSAwO1xuICAgIGZ1bmN0aW9uIHBpZShkYXRhKSB7XG4gICAgICB2YXIgbiA9IGRhdGEubGVuZ3RoLCB2YWx1ZXMgPSBkYXRhLm1hcChmdW5jdGlvbihkLCBpKSB7XG4gICAgICAgIHJldHVybiArdmFsdWUuY2FsbChwaWUsIGQsIGkpO1xuICAgICAgfSksIGEgPSArKHR5cGVvZiBzdGFydEFuZ2xlID09PSBcImZ1bmN0aW9uXCIgPyBzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBzdGFydEFuZ2xlKSwgZGEgPSAodHlwZW9mIGVuZEFuZ2xlID09PSBcImZ1bmN0aW9uXCIgPyBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogZW5kQW5nbGUpIC0gYSwgcCA9IE1hdGgubWluKE1hdGguYWJzKGRhKSAvIG4sICsodHlwZW9mIHBhZEFuZ2xlID09PSBcImZ1bmN0aW9uXCIgPyBwYWRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogcGFkQW5nbGUpKSwgcGEgPSBwICogKGRhIDwgMCA/IC0xIDogMSksIHN1bSA9IGQzLnN1bSh2YWx1ZXMpLCBrID0gc3VtID8gKGRhIC0gbiAqIHBhKSAvIHN1bSA6IDAsIGluZGV4ID0gZDMucmFuZ2UobiksIGFyY3MgPSBbXSwgdjtcbiAgICAgIGlmIChzb3J0ICE9IG51bGwpIGluZGV4LnNvcnQoc29ydCA9PT0gZDNfbGF5b3V0X3BpZVNvcnRCeVZhbHVlID8gZnVuY3Rpb24oaSwgaikge1xuICAgICAgICByZXR1cm4gdmFsdWVzW2pdIC0gdmFsdWVzW2ldO1xuICAgICAgfSA6IGZ1bmN0aW9uKGksIGopIHtcbiAgICAgICAgcmV0dXJuIHNvcnQoZGF0YVtpXSwgZGF0YVtqXSk7XG4gICAgICB9KTtcbiAgICAgIGluZGV4LmZvckVhY2goZnVuY3Rpb24oaSkge1xuICAgICAgICBhcmNzW2ldID0ge1xuICAgICAgICAgIGRhdGE6IGRhdGFbaV0sXG4gICAgICAgICAgdmFsdWU6IHYgPSB2YWx1ZXNbaV0sXG4gICAgICAgICAgc3RhcnRBbmdsZTogYSxcbiAgICAgICAgICBlbmRBbmdsZTogYSArPSB2ICogayArIHBhLFxuICAgICAgICAgIHBhZEFuZ2xlOiBwXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBhcmNzO1xuICAgIH1cbiAgICBwaWUudmFsdWUgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB2YWx1ZTtcbiAgICAgIHZhbHVlID0gXztcbiAgICAgIHJldHVybiBwaWU7XG4gICAgfTtcbiAgICBwaWUuc29ydCA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvcnQ7XG4gICAgICBzb3J0ID0gXztcbiAgICAgIHJldHVybiBwaWU7XG4gICAgfTtcbiAgICBwaWUuc3RhcnRBbmdsZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHN0YXJ0QW5nbGU7XG4gICAgICBzdGFydEFuZ2xlID0gXztcbiAgICAgIHJldHVybiBwaWU7XG4gICAgfTtcbiAgICBwaWUuZW5kQW5nbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBlbmRBbmdsZTtcbiAgICAgIGVuZEFuZ2xlID0gXztcbiAgICAgIHJldHVybiBwaWU7XG4gICAgfTtcbiAgICBwaWUucGFkQW5nbGUgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwYWRBbmdsZTtcbiAgICAgIHBhZEFuZ2xlID0gXztcbiAgICAgIHJldHVybiBwaWU7XG4gICAgfTtcbiAgICByZXR1cm4gcGllO1xuICB9O1xuICB2YXIgZDNfbGF5b3V0X3BpZVNvcnRCeVZhbHVlID0ge307XG4gIGQzLmxheW91dC5zdGFjayA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB2YWx1ZXMgPSBkM19pZGVudGl0eSwgb3JkZXIgPSBkM19sYXlvdXRfc3RhY2tPcmRlckRlZmF1bHQsIG9mZnNldCA9IGQzX2xheW91dF9zdGFja09mZnNldFplcm8sIG91dCA9IGQzX2xheW91dF9zdGFja091dCwgeCA9IGQzX2xheW91dF9zdGFja1gsIHkgPSBkM19sYXlvdXRfc3RhY2tZO1xuICAgIGZ1bmN0aW9uIHN0YWNrKGRhdGEsIGluZGV4KSB7XG4gICAgICBpZiAoIShuID0gZGF0YS5sZW5ndGgpKSByZXR1cm4gZGF0YTtcbiAgICAgIHZhciBzZXJpZXMgPSBkYXRhLm1hcChmdW5jdGlvbihkLCBpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXMuY2FsbChzdGFjaywgZCwgaSk7XG4gICAgICB9KTtcbiAgICAgIHZhciBwb2ludHMgPSBzZXJpZXMubWFwKGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgcmV0dXJuIGQubWFwKGZ1bmN0aW9uKHYsIGkpIHtcbiAgICAgICAgICByZXR1cm4gWyB4LmNhbGwoc3RhY2ssIHYsIGkpLCB5LmNhbGwoc3RhY2ssIHYsIGkpIF07XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICB2YXIgb3JkZXJzID0gb3JkZXIuY2FsbChzdGFjaywgcG9pbnRzLCBpbmRleCk7XG4gICAgICBzZXJpZXMgPSBkMy5wZXJtdXRlKHNlcmllcywgb3JkZXJzKTtcbiAgICAgIHBvaW50cyA9IGQzLnBlcm11dGUocG9pbnRzLCBvcmRlcnMpO1xuICAgICAgdmFyIG9mZnNldHMgPSBvZmZzZXQuY2FsbChzdGFjaywgcG9pbnRzLCBpbmRleCk7XG4gICAgICB2YXIgbSA9IHNlcmllc1swXS5sZW5ndGgsIG4sIGksIGosIG87XG4gICAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7XG4gICAgICAgIG91dC5jYWxsKHN0YWNrLCBzZXJpZXNbMF1bal0sIG8gPSBvZmZzZXRzW2pdLCBwb2ludHNbMF1bal1bMV0pO1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbjsgKytpKSB7XG4gICAgICAgICAgb3V0LmNhbGwoc3RhY2ssIHNlcmllc1tpXVtqXSwgbyArPSBwb2ludHNbaSAtIDFdW2pdWzFdLCBwb2ludHNbaV1bal1bMV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgc3RhY2sudmFsdWVzID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdmFsdWVzO1xuICAgICAgdmFsdWVzID0geDtcbiAgICAgIHJldHVybiBzdGFjaztcbiAgICB9O1xuICAgIHN0YWNrLm9yZGVyID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb3JkZXI7XG4gICAgICBvcmRlciA9IHR5cGVvZiB4ID09PSBcImZ1bmN0aW9uXCIgPyB4IDogZDNfbGF5b3V0X3N0YWNrT3JkZXJzLmdldCh4KSB8fCBkM19sYXlvdXRfc3RhY2tPcmRlckRlZmF1bHQ7XG4gICAgICByZXR1cm4gc3RhY2s7XG4gICAgfTtcbiAgICBzdGFjay5vZmZzZXQgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvZmZzZXQ7XG4gICAgICBvZmZzZXQgPSB0eXBlb2YgeCA9PT0gXCJmdW5jdGlvblwiID8geCA6IGQzX2xheW91dF9zdGFja09mZnNldHMuZ2V0KHgpIHx8IGQzX2xheW91dF9zdGFja09mZnNldFplcm87XG4gICAgICByZXR1cm4gc3RhY2s7XG4gICAgfTtcbiAgICBzdGFjay54ID0gZnVuY3Rpb24oeikge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDtcbiAgICAgIHggPSB6O1xuICAgICAgcmV0dXJuIHN0YWNrO1xuICAgIH07XG4gICAgc3RhY2sueSA9IGZ1bmN0aW9uKHopIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHk7XG4gICAgICB5ID0gejtcbiAgICAgIHJldHVybiBzdGFjaztcbiAgICB9O1xuICAgIHN0YWNrLm91dCA9IGZ1bmN0aW9uKHopIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG91dDtcbiAgICAgIG91dCA9IHo7XG4gICAgICByZXR1cm4gc3RhY2s7XG4gICAgfTtcbiAgICByZXR1cm4gc3RhY2s7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9zdGFja1goZCkge1xuICAgIHJldHVybiBkLng7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrWShkKSB7XG4gICAgcmV0dXJuIGQueTtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tPdXQoZCwgeTAsIHkpIHtcbiAgICBkLnkwID0geTA7XG4gICAgZC55ID0geTtcbiAgfVxuICB2YXIgZDNfbGF5b3V0X3N0YWNrT3JkZXJzID0gZDMubWFwKHtcbiAgICBcImluc2lkZS1vdXRcIjogZnVuY3Rpb24oZGF0YSkge1xuICAgICAgdmFyIG4gPSBkYXRhLmxlbmd0aCwgaSwgaiwgbWF4ID0gZGF0YS5tYXAoZDNfbGF5b3V0X3N0YWNrTWF4SW5kZXgpLCBzdW1zID0gZGF0YS5tYXAoZDNfbGF5b3V0X3N0YWNrUmVkdWNlU3VtKSwgaW5kZXggPSBkMy5yYW5nZShuKS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIG1heFthXSAtIG1heFtiXTtcbiAgICAgIH0pLCB0b3AgPSAwLCBib3R0b20gPSAwLCB0b3BzID0gW10sIGJvdHRvbXMgPSBbXTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICAgICAgaiA9IGluZGV4W2ldO1xuICAgICAgICBpZiAodG9wIDwgYm90dG9tKSB7XG4gICAgICAgICAgdG9wICs9IHN1bXNbal07XG4gICAgICAgICAgdG9wcy5wdXNoKGopO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJvdHRvbSArPSBzdW1zW2pdO1xuICAgICAgICAgIGJvdHRvbXMucHVzaChqKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGJvdHRvbXMucmV2ZXJzZSgpLmNvbmNhdCh0b3BzKTtcbiAgICB9LFxuICAgIHJldmVyc2U6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgIHJldHVybiBkMy5yYW5nZShkYXRhLmxlbmd0aCkucmV2ZXJzZSgpO1xuICAgIH0sXG4gICAgXCJkZWZhdWx0XCI6IGQzX2xheW91dF9zdGFja09yZGVyRGVmYXVsdFxuICB9KTtcbiAgdmFyIGQzX2xheW91dF9zdGFja09mZnNldHMgPSBkMy5tYXAoe1xuICAgIHNpbGhvdWV0dGU6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgIHZhciBuID0gZGF0YS5sZW5ndGgsIG0gPSBkYXRhWzBdLmxlbmd0aCwgc3VtcyA9IFtdLCBtYXggPSAwLCBpLCBqLCBvLCB5MCA9IFtdO1xuICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikge1xuICAgICAgICBmb3IgKGkgPSAwLCBvID0gMDsgaSA8IG47IGkrKykgbyArPSBkYXRhW2ldW2pdWzFdO1xuICAgICAgICBpZiAobyA+IG1heCkgbWF4ID0gbztcbiAgICAgICAgc3Vtcy5wdXNoKG8pO1xuICAgICAgfVxuICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikge1xuICAgICAgICB5MFtqXSA9IChtYXggLSBzdW1zW2pdKSAvIDI7XG4gICAgICB9XG4gICAgICByZXR1cm4geTA7XG4gICAgfSxcbiAgICB3aWdnbGU6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgIHZhciBuID0gZGF0YS5sZW5ndGgsIHggPSBkYXRhWzBdLCBtID0geC5sZW5ndGgsIGksIGosIGssIHMxLCBzMiwgczMsIGR4LCBvLCBvMCwgeTAgPSBbXTtcbiAgICAgIHkwWzBdID0gbyA9IG8wID0gMDtcbiAgICAgIGZvciAoaiA9IDE7IGogPCBtOyArK2opIHtcbiAgICAgICAgZm9yIChpID0gMCwgczEgPSAwOyBpIDwgbjsgKytpKSBzMSArPSBkYXRhW2ldW2pdWzFdO1xuICAgICAgICBmb3IgKGkgPSAwLCBzMiA9IDAsIGR4ID0geFtqXVswXSAtIHhbaiAtIDFdWzBdOyBpIDwgbjsgKytpKSB7XG4gICAgICAgICAgZm9yIChrID0gMCwgczMgPSAoZGF0YVtpXVtqXVsxXSAtIGRhdGFbaV1baiAtIDFdWzFdKSAvICgyICogZHgpOyBrIDwgaTsgKytrKSB7XG4gICAgICAgICAgICBzMyArPSAoZGF0YVtrXVtqXVsxXSAtIGRhdGFba11baiAtIDFdWzFdKSAvIGR4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBzMiArPSBzMyAqIGRhdGFbaV1bal1bMV07XG4gICAgICAgIH1cbiAgICAgICAgeTBbal0gPSBvIC09IHMxID8gczIgLyBzMSAqIGR4IDogMDtcbiAgICAgICAgaWYgKG8gPCBvMCkgbzAgPSBvO1xuICAgICAgfVxuICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgeTBbal0gLT0gbzA7XG4gICAgICByZXR1cm4geTA7XG4gICAgfSxcbiAgICBleHBhbmQ6IGZ1bmN0aW9uKGRhdGEpIHtcbiAgICAgIHZhciBuID0gZGF0YS5sZW5ndGgsIG0gPSBkYXRhWzBdLmxlbmd0aCwgayA9IDEgLyBuLCBpLCBqLCBvLCB5MCA9IFtdO1xuICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikge1xuICAgICAgICBmb3IgKGkgPSAwLCBvID0gMDsgaSA8IG47IGkrKykgbyArPSBkYXRhW2ldW2pdWzFdO1xuICAgICAgICBpZiAobykgZm9yIChpID0gMDsgaSA8IG47IGkrKykgZGF0YVtpXVtqXVsxXSAvPSBvOyBlbHNlIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIGRhdGFbaV1bal1bMV0gPSBrO1xuICAgICAgfVxuICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgeTBbal0gPSAwO1xuICAgICAgcmV0dXJuIHkwO1xuICAgIH0sXG4gICAgemVybzogZDNfbGF5b3V0X3N0YWNrT2Zmc2V0WmVyb1xuICB9KTtcbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrT3JkZXJEZWZhdWx0KGRhdGEpIHtcbiAgICByZXR1cm4gZDMucmFuZ2UoZGF0YS5sZW5ndGgpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9zdGFja09mZnNldFplcm8oZGF0YSkge1xuICAgIHZhciBqID0gLTEsIG0gPSBkYXRhWzBdLmxlbmd0aCwgeTAgPSBbXTtcbiAgICB3aGlsZSAoKytqIDwgbSkgeTBbal0gPSAwO1xuICAgIHJldHVybiB5MDtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tNYXhJbmRleChhcnJheSkge1xuICAgIHZhciBpID0gMSwgaiA9IDAsIHYgPSBhcnJheVswXVsxXSwgaywgbiA9IGFycmF5Lmxlbmd0aDtcbiAgICBmb3IgKDtpIDwgbjsgKytpKSB7XG4gICAgICBpZiAoKGsgPSBhcnJheVtpXVsxXSkgPiB2KSB7XG4gICAgICAgIGogPSBpO1xuICAgICAgICB2ID0gaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGo7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3N0YWNrUmVkdWNlU3VtKGQpIHtcbiAgICByZXR1cm4gZC5yZWR1Y2UoZDNfbGF5b3V0X3N0YWNrU3VtLCAwKTtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfc3RhY2tTdW0ocCwgZCkge1xuICAgIHJldHVybiBwICsgZFsxXTtcbiAgfVxuICBkMy5sYXlvdXQuaGlzdG9ncmFtID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGZyZXF1ZW5jeSA9IHRydWUsIHZhbHVlciA9IE51bWJlciwgcmFuZ2VyID0gZDNfbGF5b3V0X2hpc3RvZ3JhbVJhbmdlLCBiaW5uZXIgPSBkM19sYXlvdXRfaGlzdG9ncmFtQmluU3R1cmdlcztcbiAgICBmdW5jdGlvbiBoaXN0b2dyYW0oZGF0YSwgaSkge1xuICAgICAgdmFyIGJpbnMgPSBbXSwgdmFsdWVzID0gZGF0YS5tYXAodmFsdWVyLCB0aGlzKSwgcmFuZ2UgPSByYW5nZXIuY2FsbCh0aGlzLCB2YWx1ZXMsIGkpLCB0aHJlc2hvbGRzID0gYmlubmVyLmNhbGwodGhpcywgcmFuZ2UsIHZhbHVlcywgaSksIGJpbiwgaSA9IC0xLCBuID0gdmFsdWVzLmxlbmd0aCwgbSA9IHRocmVzaG9sZHMubGVuZ3RoIC0gMSwgayA9IGZyZXF1ZW5jeSA/IDEgOiAxIC8gbiwgeDtcbiAgICAgIHdoaWxlICgrK2kgPCBtKSB7XG4gICAgICAgIGJpbiA9IGJpbnNbaV0gPSBbXTtcbiAgICAgICAgYmluLmR4ID0gdGhyZXNob2xkc1tpICsgMV0gLSAoYmluLnggPSB0aHJlc2hvbGRzW2ldKTtcbiAgICAgICAgYmluLnkgPSAwO1xuICAgICAgfVxuICAgICAgaWYgKG0gPiAwKSB7XG4gICAgICAgIGkgPSAtMTtcbiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgICB4ID0gdmFsdWVzW2ldO1xuICAgICAgICAgIGlmICh4ID49IHJhbmdlWzBdICYmIHggPD0gcmFuZ2VbMV0pIHtcbiAgICAgICAgICAgIGJpbiA9IGJpbnNbZDMuYmlzZWN0KHRocmVzaG9sZHMsIHgsIDEsIG0pIC0gMV07XG4gICAgICAgICAgICBiaW4ueSArPSBrO1xuICAgICAgICAgICAgYmluLnB1c2goZGF0YVtpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYmlucztcbiAgICB9XG4gICAgaGlzdG9ncmFtLnZhbHVlID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdmFsdWVyO1xuICAgICAgdmFsdWVyID0geDtcbiAgICAgIHJldHVybiBoaXN0b2dyYW07XG4gICAgfTtcbiAgICBoaXN0b2dyYW0ucmFuZ2UgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYW5nZXI7XG4gICAgICByYW5nZXIgPSBkM19mdW5jdG9yKHgpO1xuICAgICAgcmV0dXJuIGhpc3RvZ3JhbTtcbiAgICB9O1xuICAgIGhpc3RvZ3JhbS5iaW5zID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gYmlubmVyO1xuICAgICAgYmlubmVyID0gdHlwZW9mIHggPT09IFwibnVtYmVyXCIgPyBmdW5jdGlvbihyYW5nZSkge1xuICAgICAgICByZXR1cm4gZDNfbGF5b3V0X2hpc3RvZ3JhbUJpbkZpeGVkKHJhbmdlLCB4KTtcbiAgICAgIH0gOiBkM19mdW5jdG9yKHgpO1xuICAgICAgcmV0dXJuIGhpc3RvZ3JhbTtcbiAgICB9O1xuICAgIGhpc3RvZ3JhbS5mcmVxdWVuY3kgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBmcmVxdWVuY3k7XG4gICAgICBmcmVxdWVuY3kgPSAhIXg7XG4gICAgICByZXR1cm4gaGlzdG9ncmFtO1xuICAgIH07XG4gICAgcmV0dXJuIGhpc3RvZ3JhbTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfbGF5b3V0X2hpc3RvZ3JhbUJpblN0dXJnZXMocmFuZ2UsIHZhbHVlcykge1xuICAgIHJldHVybiBkM19sYXlvdXRfaGlzdG9ncmFtQmluRml4ZWQocmFuZ2UsIE1hdGguY2VpbChNYXRoLmxvZyh2YWx1ZXMubGVuZ3RoKSAvIE1hdGguTE4yICsgMSkpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9oaXN0b2dyYW1CaW5GaXhlZChyYW5nZSwgbikge1xuICAgIHZhciB4ID0gLTEsIGIgPSArcmFuZ2VbMF0sIG0gPSAocmFuZ2VbMV0gLSBiKSAvIG4sIGYgPSBbXTtcbiAgICB3aGlsZSAoKyt4IDw9IG4pIGZbeF0gPSBtICogeCArIGI7XG4gICAgcmV0dXJuIGY7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X2hpc3RvZ3JhbVJhbmdlKHZhbHVlcykge1xuICAgIHJldHVybiBbIGQzLm1pbih2YWx1ZXMpLCBkMy5tYXgodmFsdWVzKSBdO1xuICB9XG4gIGQzLmxheW91dC5wYWNrID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGhpZXJhcmNoeSA9IGQzLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KGQzX2xheW91dF9wYWNrU29ydCksIHBhZGRpbmcgPSAwLCBzaXplID0gWyAxLCAxIF0sIHJhZGl1cztcbiAgICBmdW5jdGlvbiBwYWNrKGQsIGkpIHtcbiAgICAgIHZhciBub2RlcyA9IGhpZXJhcmNoeS5jYWxsKHRoaXMsIGQsIGkpLCByb290ID0gbm9kZXNbMF0sIHcgPSBzaXplWzBdLCBoID0gc2l6ZVsxXSwgciA9IHJhZGl1cyA9PSBudWxsID8gTWF0aC5zcXJ0IDogdHlwZW9mIHJhZGl1cyA9PT0gXCJmdW5jdGlvblwiID8gcmFkaXVzIDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiByYWRpdXM7XG4gICAgICB9O1xuICAgICAgcm9vdC54ID0gcm9vdC55ID0gMDtcbiAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEFmdGVyKHJvb3QsIGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgZC5yID0gK3IoZC52YWx1ZSk7XG4gICAgICB9KTtcbiAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEFmdGVyKHJvb3QsIGQzX2xheW91dF9wYWNrU2libGluZ3MpO1xuICAgICAgaWYgKHBhZGRpbmcpIHtcbiAgICAgICAgdmFyIGRyID0gcGFkZGluZyAqIChyYWRpdXMgPyAxIDogTWF0aC5tYXgoMiAqIHJvb3QuciAvIHcsIDIgKiByb290LnIgLyBoKSkgLyAyO1xuICAgICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRBZnRlcihyb290LCBmdW5jdGlvbihkKSB7XG4gICAgICAgICAgZC5yICs9IGRyO1xuICAgICAgICB9KTtcbiAgICAgICAgZDNfbGF5b3V0X2hpZXJhcmNoeVZpc2l0QWZ0ZXIocm9vdCwgZDNfbGF5b3V0X3BhY2tTaWJsaW5ncyk7XG4gICAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEFmdGVyKHJvb3QsIGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgICBkLnIgLT0gZHI7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZDNfbGF5b3V0X3BhY2tUcmFuc2Zvcm0ocm9vdCwgdyAvIDIsIGggLyAyLCByYWRpdXMgPyAxIDogMSAvIE1hdGgubWF4KDIgKiByb290LnIgLyB3LCAyICogcm9vdC5yIC8gaCkpO1xuICAgICAgcmV0dXJuIG5vZGVzO1xuICAgIH1cbiAgICBwYWNrLnNpemUgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzaXplO1xuICAgICAgc2l6ZSA9IF87XG4gICAgICByZXR1cm4gcGFjaztcbiAgICB9O1xuICAgIHBhY2sucmFkaXVzID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFkaXVzO1xuICAgICAgcmFkaXVzID0gXyA9PSBudWxsIHx8IHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIgPyBfIDogK187XG4gICAgICByZXR1cm4gcGFjaztcbiAgICB9O1xuICAgIHBhY2sucGFkZGluZyA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHBhZGRpbmc7XG4gICAgICBwYWRkaW5nID0gK187XG4gICAgICByZXR1cm4gcGFjaztcbiAgICB9O1xuICAgIHJldHVybiBkM19sYXlvdXRfaGllcmFyY2h5UmViaW5kKHBhY2ssIGhpZXJhcmNoeSk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9wYWNrU29ydChhLCBiKSB7XG4gICAgcmV0dXJuIGEudmFsdWUgLSBiLnZhbHVlO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9wYWNrSW5zZXJ0KGEsIGIpIHtcbiAgICB2YXIgYyA9IGEuX3BhY2tfbmV4dDtcbiAgICBhLl9wYWNrX25leHQgPSBiO1xuICAgIGIuX3BhY2tfcHJldiA9IGE7XG4gICAgYi5fcGFja19uZXh0ID0gYztcbiAgICBjLl9wYWNrX3ByZXYgPSBiO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9wYWNrU3BsaWNlKGEsIGIpIHtcbiAgICBhLl9wYWNrX25leHQgPSBiO1xuICAgIGIuX3BhY2tfcHJldiA9IGE7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tJbnRlcnNlY3RzKGEsIGIpIHtcbiAgICB2YXIgZHggPSBiLnggLSBhLngsIGR5ID0gYi55IC0gYS55LCBkciA9IGEuciArIGIucjtcbiAgICByZXR1cm4gLjk5OSAqIGRyICogZHIgPiBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfcGFja1NpYmxpbmdzKG5vZGUpIHtcbiAgICBpZiAoIShub2RlcyA9IG5vZGUuY2hpbGRyZW4pIHx8ICEobiA9IG5vZGVzLmxlbmd0aCkpIHJldHVybjtcbiAgICB2YXIgbm9kZXMsIHhNaW4gPSBJbmZpbml0eSwgeE1heCA9IC1JbmZpbml0eSwgeU1pbiA9IEluZmluaXR5LCB5TWF4ID0gLUluZmluaXR5LCBhLCBiLCBjLCBpLCBqLCBrLCBuO1xuICAgIGZ1bmN0aW9uIGJvdW5kKG5vZGUpIHtcbiAgICAgIHhNaW4gPSBNYXRoLm1pbihub2RlLnggLSBub2RlLnIsIHhNaW4pO1xuICAgICAgeE1heCA9IE1hdGgubWF4KG5vZGUueCArIG5vZGUuciwgeE1heCk7XG4gICAgICB5TWluID0gTWF0aC5taW4obm9kZS55IC0gbm9kZS5yLCB5TWluKTtcbiAgICAgIHlNYXggPSBNYXRoLm1heChub2RlLnkgKyBub2RlLnIsIHlNYXgpO1xuICAgIH1cbiAgICBub2Rlcy5mb3JFYWNoKGQzX2xheW91dF9wYWNrTGluayk7XG4gICAgYSA9IG5vZGVzWzBdO1xuICAgIGEueCA9IC1hLnI7XG4gICAgYS55ID0gMDtcbiAgICBib3VuZChhKTtcbiAgICBpZiAobiA+IDEpIHtcbiAgICAgIGIgPSBub2Rlc1sxXTtcbiAgICAgIGIueCA9IGIucjtcbiAgICAgIGIueSA9IDA7XG4gICAgICBib3VuZChiKTtcbiAgICAgIGlmIChuID4gMikge1xuICAgICAgICBjID0gbm9kZXNbMl07XG4gICAgICAgIGQzX2xheW91dF9wYWNrUGxhY2UoYSwgYiwgYyk7XG4gICAgICAgIGJvdW5kKGMpO1xuICAgICAgICBkM19sYXlvdXRfcGFja0luc2VydChhLCBjKTtcbiAgICAgICAgYS5fcGFja19wcmV2ID0gYztcbiAgICAgICAgZDNfbGF5b3V0X3BhY2tJbnNlcnQoYywgYik7XG4gICAgICAgIGIgPSBhLl9wYWNrX25leHQ7XG4gICAgICAgIGZvciAoaSA9IDM7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBkM19sYXlvdXRfcGFja1BsYWNlKGEsIGIsIGMgPSBub2Rlc1tpXSk7XG4gICAgICAgICAgdmFyIGlzZWN0ID0gMCwgczEgPSAxLCBzMiA9IDE7XG4gICAgICAgICAgZm9yIChqID0gYi5fcGFja19uZXh0OyBqICE9PSBiOyBqID0gai5fcGFja19uZXh0LCBzMSsrKSB7XG4gICAgICAgICAgICBpZiAoZDNfbGF5b3V0X3BhY2tJbnRlcnNlY3RzKGosIGMpKSB7XG4gICAgICAgICAgICAgIGlzZWN0ID0gMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc2VjdCA9PSAxKSB7XG4gICAgICAgICAgICBmb3IgKGsgPSBhLl9wYWNrX3ByZXY7IGsgIT09IGouX3BhY2tfcHJldjsgayA9IGsuX3BhY2tfcHJldiwgczIrKykge1xuICAgICAgICAgICAgICBpZiAoZDNfbGF5b3V0X3BhY2tJbnRlcnNlY3RzKGssIGMpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzZWN0KSB7XG4gICAgICAgICAgICBpZiAoczEgPCBzMiB8fCBzMSA9PSBzMiAmJiBiLnIgPCBhLnIpIGQzX2xheW91dF9wYWNrU3BsaWNlKGEsIGIgPSBqKTsgZWxzZSBkM19sYXlvdXRfcGFja1NwbGljZShhID0gaywgYik7XG4gICAgICAgICAgICBpLS07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGQzX2xheW91dF9wYWNrSW5zZXJ0KGEsIGMpO1xuICAgICAgICAgICAgYiA9IGM7XG4gICAgICAgICAgICBib3VuZChjKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGN4ID0gKHhNaW4gKyB4TWF4KSAvIDIsIGN5ID0gKHlNaW4gKyB5TWF4KSAvIDIsIGNyID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICBjID0gbm9kZXNbaV07XG4gICAgICBjLnggLT0gY3g7XG4gICAgICBjLnkgLT0gY3k7XG4gICAgICBjciA9IE1hdGgubWF4KGNyLCBjLnIgKyBNYXRoLnNxcnQoYy54ICogYy54ICsgYy55ICogYy55KSk7XG4gICAgfVxuICAgIG5vZGUuciA9IGNyO1xuICAgIG5vZGVzLmZvckVhY2goZDNfbGF5b3V0X3BhY2tVbmxpbmspO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9wYWNrTGluayhub2RlKSB7XG4gICAgbm9kZS5fcGFja19uZXh0ID0gbm9kZS5fcGFja19wcmV2ID0gbm9kZTtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfcGFja1VubGluayhub2RlKSB7XG4gICAgZGVsZXRlIG5vZGUuX3BhY2tfbmV4dDtcbiAgICBkZWxldGUgbm9kZS5fcGFja19wcmV2O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9wYWNrVHJhbnNmb3JtKG5vZGUsIHgsIHksIGspIHtcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgIG5vZGUueCA9IHggKz0gayAqIG5vZGUueDtcbiAgICBub2RlLnkgPSB5ICs9IGsgKiBub2RlLnk7XG4gICAgbm9kZS5yICo9IGs7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICB2YXIgaSA9IC0xLCBuID0gY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgd2hpbGUgKCsraSA8IG4pIGQzX2xheW91dF9wYWNrVHJhbnNmb3JtKGNoaWxkcmVuW2ldLCB4LCB5LCBrKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3BhY2tQbGFjZShhLCBiLCBjKSB7XG4gICAgdmFyIGRiID0gYS5yICsgYy5yLCBkeCA9IGIueCAtIGEueCwgZHkgPSBiLnkgLSBhLnk7XG4gICAgaWYgKGRiICYmIChkeCB8fCBkeSkpIHtcbiAgICAgIHZhciBkYSA9IGIuciArIGMuciwgZGMgPSBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgICAgIGRhICo9IGRhO1xuICAgICAgZGIgKj0gZGI7XG4gICAgICB2YXIgeCA9IC41ICsgKGRiIC0gZGEpIC8gKDIgKiBkYyksIHkgPSBNYXRoLnNxcnQoTWF0aC5tYXgoMCwgMiAqIGRhICogKGRiICsgZGMpIC0gKGRiIC09IGRjKSAqIGRiIC0gZGEgKiBkYSkpIC8gKDIgKiBkYyk7XG4gICAgICBjLnggPSBhLnggKyB4ICogZHggKyB5ICogZHk7XG4gICAgICBjLnkgPSBhLnkgKyB4ICogZHkgLSB5ICogZHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGMueCA9IGEueCArIGRiO1xuICAgICAgYy55ID0gYS55O1xuICAgIH1cbiAgfVxuICBkMy5sYXlvdXQudHJlZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBoaWVyYXJjaHkgPSBkMy5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSwgc2VwYXJhdGlvbiA9IGQzX2xheW91dF90cmVlU2VwYXJhdGlvbiwgc2l6ZSA9IFsgMSwgMSBdLCBub2RlU2l6ZSA9IG51bGw7XG4gICAgZnVuY3Rpb24gdHJlZShkLCBpKSB7XG4gICAgICB2YXIgbm9kZXMgPSBoaWVyYXJjaHkuY2FsbCh0aGlzLCBkLCBpKSwgcm9vdDAgPSBub2Rlc1swXSwgcm9vdDEgPSB3cmFwVHJlZShyb290MCk7XG4gICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRBZnRlcihyb290MSwgZmlyc3RXYWxrKSwgcm9vdDEucGFyZW50Lm0gPSAtcm9vdDEuejtcbiAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEJlZm9yZShyb290MSwgc2Vjb25kV2Fsayk7XG4gICAgICBpZiAobm9kZVNpemUpIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEJlZm9yZShyb290MCwgc2l6ZU5vZGUpOyBlbHNlIHtcbiAgICAgICAgdmFyIGxlZnQgPSByb290MCwgcmlnaHQgPSByb290MCwgYm90dG9tID0gcm9vdDA7XG4gICAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEJlZm9yZShyb290MCwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICAgIGlmIChub2RlLnggPCBsZWZ0LngpIGxlZnQgPSBub2RlO1xuICAgICAgICAgIGlmIChub2RlLnggPiByaWdodC54KSByaWdodCA9IG5vZGU7XG4gICAgICAgICAgaWYgKG5vZGUuZGVwdGggPiBib3R0b20uZGVwdGgpIGJvdHRvbSA9IG5vZGU7XG4gICAgICAgIH0pO1xuICAgICAgICB2YXIgdHggPSBzZXBhcmF0aW9uKGxlZnQsIHJpZ2h0KSAvIDIgLSBsZWZ0LngsIGt4ID0gc2l6ZVswXSAvIChyaWdodC54ICsgc2VwYXJhdGlvbihyaWdodCwgbGVmdCkgLyAyICsgdHgpLCBreSA9IHNpemVbMV0gLyAoYm90dG9tLmRlcHRoIHx8IDEpO1xuICAgICAgICBkM19sYXlvdXRfaGllcmFyY2h5VmlzaXRCZWZvcmUocm9vdDAsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgICBub2RlLnggPSAobm9kZS54ICsgdHgpICoga3g7XG4gICAgICAgICAgbm9kZS55ID0gbm9kZS5kZXB0aCAqIGt5O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBub2RlcztcbiAgICB9XG4gICAgZnVuY3Rpb24gd3JhcFRyZWUocm9vdDApIHtcbiAgICAgIHZhciByb290MSA9IHtcbiAgICAgICAgQTogbnVsbCxcbiAgICAgICAgY2hpbGRyZW46IFsgcm9vdDAgXVxuICAgICAgfSwgcXVldWUgPSBbIHJvb3QxIF0sIG5vZGUxO1xuICAgICAgd2hpbGUgKChub2RlMSA9IHF1ZXVlLnBvcCgpKSAhPSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIGNoaWxkcmVuID0gbm9kZTEuY2hpbGRyZW4sIGNoaWxkLCBpID0gMCwgbiA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IG47ICsraSkge1xuICAgICAgICAgIHF1ZXVlLnB1c2goKGNoaWxkcmVuW2ldID0gY2hpbGQgPSB7XG4gICAgICAgICAgICBfOiBjaGlsZHJlbltpXSxcbiAgICAgICAgICAgIHBhcmVudDogbm9kZTEsXG4gICAgICAgICAgICBjaGlsZHJlbjogKGNoaWxkID0gY2hpbGRyZW5baV0uY2hpbGRyZW4pICYmIGNoaWxkLnNsaWNlKCkgfHwgW10sXG4gICAgICAgICAgICBBOiBudWxsLFxuICAgICAgICAgICAgYTogbnVsbCxcbiAgICAgICAgICAgIHo6IDAsXG4gICAgICAgICAgICBtOiAwLFxuICAgICAgICAgICAgYzogMCxcbiAgICAgICAgICAgIHM6IDAsXG4gICAgICAgICAgICB0OiBudWxsLFxuICAgICAgICAgICAgaTogaVxuICAgICAgICAgIH0pLmEgPSBjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByb290MS5jaGlsZHJlblswXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZmlyc3RXYWxrKHYpIHtcbiAgICAgIHZhciBjaGlsZHJlbiA9IHYuY2hpbGRyZW4sIHNpYmxpbmdzID0gdi5wYXJlbnQuY2hpbGRyZW4sIHcgPSB2LmkgPyBzaWJsaW5nc1t2LmkgLSAxXSA6IG51bGw7XG4gICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgIGQzX2xheW91dF90cmVlU2hpZnQodik7XG4gICAgICAgIHZhciBtaWRwb2ludCA9IChjaGlsZHJlblswXS56ICsgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV0ueikgLyAyO1xuICAgICAgICBpZiAodykge1xuICAgICAgICAgIHYueiA9IHcueiArIHNlcGFyYXRpb24odi5fLCB3Ll8pO1xuICAgICAgICAgIHYubSA9IHYueiAtIG1pZHBvaW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHYueiA9IG1pZHBvaW50O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHcpIHtcbiAgICAgICAgdi56ID0gdy56ICsgc2VwYXJhdGlvbih2Ll8sIHcuXyk7XG4gICAgICB9XG4gICAgICB2LnBhcmVudC5BID0gYXBwb3J0aW9uKHYsIHcsIHYucGFyZW50LkEgfHwgc2libGluZ3NbMF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzZWNvbmRXYWxrKHYpIHtcbiAgICAgIHYuXy54ID0gdi56ICsgdi5wYXJlbnQubTtcbiAgICAgIHYubSArPSB2LnBhcmVudC5tO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhcHBvcnRpb24odiwgdywgYW5jZXN0b3IpIHtcbiAgICAgIGlmICh3KSB7XG4gICAgICAgIHZhciB2aXAgPSB2LCB2b3AgPSB2LCB2aW0gPSB3LCB2b20gPSB2aXAucGFyZW50LmNoaWxkcmVuWzBdLCBzaXAgPSB2aXAubSwgc29wID0gdm9wLm0sIHNpbSA9IHZpbS5tLCBzb20gPSB2b20ubSwgc2hpZnQ7XG4gICAgICAgIHdoaWxlICh2aW0gPSBkM19sYXlvdXRfdHJlZVJpZ2h0KHZpbSksIHZpcCA9IGQzX2xheW91dF90cmVlTGVmdCh2aXApLCB2aW0gJiYgdmlwKSB7XG4gICAgICAgICAgdm9tID0gZDNfbGF5b3V0X3RyZWVMZWZ0KHZvbSk7XG4gICAgICAgICAgdm9wID0gZDNfbGF5b3V0X3RyZWVSaWdodCh2b3ApO1xuICAgICAgICAgIHZvcC5hID0gdjtcbiAgICAgICAgICBzaGlmdCA9IHZpbS56ICsgc2ltIC0gdmlwLnogLSBzaXAgKyBzZXBhcmF0aW9uKHZpbS5fLCB2aXAuXyk7XG4gICAgICAgICAgaWYgKHNoaWZ0ID4gMCkge1xuICAgICAgICAgICAgZDNfbGF5b3V0X3RyZWVNb3ZlKGQzX2xheW91dF90cmVlQW5jZXN0b3IodmltLCB2LCBhbmNlc3RvciksIHYsIHNoaWZ0KTtcbiAgICAgICAgICAgIHNpcCArPSBzaGlmdDtcbiAgICAgICAgICAgIHNvcCArPSBzaGlmdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2ltICs9IHZpbS5tO1xuICAgICAgICAgIHNpcCArPSB2aXAubTtcbiAgICAgICAgICBzb20gKz0gdm9tLm07XG4gICAgICAgICAgc29wICs9IHZvcC5tO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2aW0gJiYgIWQzX2xheW91dF90cmVlUmlnaHQodm9wKSkge1xuICAgICAgICAgIHZvcC50ID0gdmltO1xuICAgICAgICAgIHZvcC5tICs9IHNpbSAtIHNvcDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlwICYmICFkM19sYXlvdXRfdHJlZUxlZnQodm9tKSkge1xuICAgICAgICAgIHZvbS50ID0gdmlwO1xuICAgICAgICAgIHZvbS5tICs9IHNpcCAtIHNvbTtcbiAgICAgICAgICBhbmNlc3RvciA9IHY7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBhbmNlc3RvcjtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2l6ZU5vZGUobm9kZSkge1xuICAgICAgbm9kZS54ICo9IHNpemVbMF07XG4gICAgICBub2RlLnkgPSBub2RlLmRlcHRoICogc2l6ZVsxXTtcbiAgICB9XG4gICAgdHJlZS5zZXBhcmF0aW9uID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2VwYXJhdGlvbjtcbiAgICAgIHNlcGFyYXRpb24gPSB4O1xuICAgICAgcmV0dXJuIHRyZWU7XG4gICAgfTtcbiAgICB0cmVlLnNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBub2RlU2l6ZSA/IG51bGwgOiBzaXplO1xuICAgICAgbm9kZVNpemUgPSAoc2l6ZSA9IHgpID09IG51bGwgPyBzaXplTm9kZSA6IG51bGw7XG4gICAgICByZXR1cm4gdHJlZTtcbiAgICB9O1xuICAgIHRyZWUubm9kZVNpemUgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBub2RlU2l6ZSA/IHNpemUgOiBudWxsO1xuICAgICAgbm9kZVNpemUgPSAoc2l6ZSA9IHgpID09IG51bGwgPyBudWxsIDogc2l6ZU5vZGU7XG4gICAgICByZXR1cm4gdHJlZTtcbiAgICB9O1xuICAgIHJldHVybiBkM19sYXlvdXRfaGllcmFyY2h5UmViaW5kKHRyZWUsIGhpZXJhcmNoeSk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX2xheW91dF90cmVlU2VwYXJhdGlvbihhLCBiKSB7XG4gICAgcmV0dXJuIGEucGFyZW50ID09IGIucGFyZW50ID8gMSA6IDI7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVMZWZ0KHYpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuO1xuICAgIHJldHVybiBjaGlsZHJlbi5sZW5ndGggPyBjaGlsZHJlblswXSA6IHYudDtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfdHJlZVJpZ2h0KHYpIHtcbiAgICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuLCBuO1xuICAgIHJldHVybiAobiA9IGNoaWxkcmVuLmxlbmd0aCkgPyBjaGlsZHJlbltuIC0gMV0gOiB2LnQ7XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVNb3ZlKHdtLCB3cCwgc2hpZnQpIHtcbiAgICB2YXIgY2hhbmdlID0gc2hpZnQgLyAod3AuaSAtIHdtLmkpO1xuICAgIHdwLmMgLT0gY2hhbmdlO1xuICAgIHdwLnMgKz0gc2hpZnQ7XG4gICAgd20uYyArPSBjaGFuZ2U7XG4gICAgd3AueiArPSBzaGlmdDtcbiAgICB3cC5tICs9IHNoaWZ0O1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF90cmVlU2hpZnQodikge1xuICAgIHZhciBzaGlmdCA9IDAsIGNoYW5nZSA9IDAsIGNoaWxkcmVuID0gdi5jaGlsZHJlbiwgaSA9IGNoaWxkcmVuLmxlbmd0aCwgdztcbiAgICB3aGlsZSAoLS1pID49IDApIHtcbiAgICAgIHcgPSBjaGlsZHJlbltpXTtcbiAgICAgIHcueiArPSBzaGlmdDtcbiAgICAgIHcubSArPSBzaGlmdDtcbiAgICAgIHNoaWZ0ICs9IHcucyArIChjaGFuZ2UgKz0gdy5jKTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVBbmNlc3Rvcih2aW0sIHYsIGFuY2VzdG9yKSB7XG4gICAgcmV0dXJuIHZpbS5hLnBhcmVudCA9PT0gdi5wYXJlbnQgPyB2aW0uYSA6IGFuY2VzdG9yO1xuICB9XG4gIGQzLmxheW91dC5jbHVzdGVyID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGhpZXJhcmNoeSA9IGQzLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KG51bGwpLnZhbHVlKG51bGwpLCBzZXBhcmF0aW9uID0gZDNfbGF5b3V0X3RyZWVTZXBhcmF0aW9uLCBzaXplID0gWyAxLCAxIF0sIG5vZGVTaXplID0gZmFsc2U7XG4gICAgZnVuY3Rpb24gY2x1c3RlcihkLCBpKSB7XG4gICAgICB2YXIgbm9kZXMgPSBoaWVyYXJjaHkuY2FsbCh0aGlzLCBkLCBpKSwgcm9vdCA9IG5vZGVzWzBdLCBwcmV2aW91c05vZGUsIHggPSAwO1xuICAgICAgZDNfbGF5b3V0X2hpZXJhcmNoeVZpc2l0QWZ0ZXIocm9vdCwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgICAgICBpZiAoY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgbm9kZS54ID0gZDNfbGF5b3V0X2NsdXN0ZXJYKGNoaWxkcmVuKTtcbiAgICAgICAgICBub2RlLnkgPSBkM19sYXlvdXRfY2x1c3RlclkoY2hpbGRyZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGUueCA9IHByZXZpb3VzTm9kZSA/IHggKz0gc2VwYXJhdGlvbihub2RlLCBwcmV2aW91c05vZGUpIDogMDtcbiAgICAgICAgICBub2RlLnkgPSAwO1xuICAgICAgICAgIHByZXZpb3VzTm9kZSA9IG5vZGU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdmFyIGxlZnQgPSBkM19sYXlvdXRfY2x1c3RlckxlZnQocm9vdCksIHJpZ2h0ID0gZDNfbGF5b3V0X2NsdXN0ZXJSaWdodChyb290KSwgeDAgPSBsZWZ0LnggLSBzZXBhcmF0aW9uKGxlZnQsIHJpZ2h0KSAvIDIsIHgxID0gcmlnaHQueCArIHNlcGFyYXRpb24ocmlnaHQsIGxlZnQpIC8gMjtcbiAgICAgIGQzX2xheW91dF9oaWVyYXJjaHlWaXNpdEFmdGVyKHJvb3QsIG5vZGVTaXplID8gZnVuY3Rpb24obm9kZSkge1xuICAgICAgICBub2RlLnggPSAobm9kZS54IC0gcm9vdC54KSAqIHNpemVbMF07XG4gICAgICAgIG5vZGUueSA9IChyb290LnkgLSBub2RlLnkpICogc2l6ZVsxXTtcbiAgICAgIH0gOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIG5vZGUueCA9IChub2RlLnggLSB4MCkgLyAoeDEgLSB4MCkgKiBzaXplWzBdO1xuICAgICAgICBub2RlLnkgPSAoMSAtIChyb290LnkgPyBub2RlLnkgLyByb290LnkgOiAxKSkgKiBzaXplWzFdO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gbm9kZXM7XG4gICAgfVxuICAgIGNsdXN0ZXIuc2VwYXJhdGlvbiA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNlcGFyYXRpb247XG4gICAgICBzZXBhcmF0aW9uID0geDtcbiAgICAgIHJldHVybiBjbHVzdGVyO1xuICAgIH07XG4gICAgY2x1c3Rlci5zaXplID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbm9kZVNpemUgPyBudWxsIDogc2l6ZTtcbiAgICAgIG5vZGVTaXplID0gKHNpemUgPSB4KSA9PSBudWxsO1xuICAgICAgcmV0dXJuIGNsdXN0ZXI7XG4gICAgfTtcbiAgICBjbHVzdGVyLm5vZGVTaXplID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbm9kZVNpemUgPyBzaXplIDogbnVsbDtcbiAgICAgIG5vZGVTaXplID0gKHNpemUgPSB4KSAhPSBudWxsO1xuICAgICAgcmV0dXJuIGNsdXN0ZXI7XG4gICAgfTtcbiAgICByZXR1cm4gZDNfbGF5b3V0X2hpZXJhcmNoeVJlYmluZChjbHVzdGVyLCBoaWVyYXJjaHkpO1xuICB9O1xuICBmdW5jdGlvbiBkM19sYXlvdXRfY2x1c3RlclkoY2hpbGRyZW4pIHtcbiAgICByZXR1cm4gMSArIGQzLm1heChjaGlsZHJlbiwgZnVuY3Rpb24oY2hpbGQpIHtcbiAgICAgIHJldHVybiBjaGlsZC55O1xuICAgIH0pO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9jbHVzdGVyWChjaGlsZHJlbikge1xuICAgIHJldHVybiBjaGlsZHJlbi5yZWR1Y2UoZnVuY3Rpb24oeCwgY2hpbGQpIHtcbiAgICAgIHJldHVybiB4ICsgY2hpbGQueDtcbiAgICB9LCAwKSAvIGNoaWxkcmVuLmxlbmd0aDtcbiAgfVxuICBmdW5jdGlvbiBkM19sYXlvdXRfY2x1c3RlckxlZnQobm9kZSkge1xuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47XG4gICAgcmV0dXJuIGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA/IGQzX2xheW91dF9jbHVzdGVyTGVmdChjaGlsZHJlblswXSkgOiBub2RlO1xuICB9XG4gIGZ1bmN0aW9uIGQzX2xheW91dF9jbHVzdGVyUmlnaHQobm9kZSkge1xuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sIG47XG4gICAgcmV0dXJuIGNoaWxkcmVuICYmIChuID0gY2hpbGRyZW4ubGVuZ3RoKSA/IGQzX2xheW91dF9jbHVzdGVyUmlnaHQoY2hpbGRyZW5bbiAtIDFdKSA6IG5vZGU7XG4gIH1cbiAgZDMubGF5b3V0LnRyZWVtYXAgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgaGllcmFyY2h5ID0gZDMubGF5b3V0LmhpZXJhcmNoeSgpLCByb3VuZCA9IE1hdGgucm91bmQsIHNpemUgPSBbIDEsIDEgXSwgcGFkZGluZyA9IG51bGwsIHBhZCA9IGQzX2xheW91dF90cmVlbWFwUGFkTnVsbCwgc3RpY2t5ID0gZmFsc2UsIHN0aWNraWVzLCBtb2RlID0gXCJzcXVhcmlmeVwiLCByYXRpbyA9IC41ICogKDEgKyBNYXRoLnNxcnQoNSkpO1xuICAgIGZ1bmN0aW9uIHNjYWxlKGNoaWxkcmVuLCBrKSB7XG4gICAgICB2YXIgaSA9IC0xLCBuID0gY2hpbGRyZW4ubGVuZ3RoLCBjaGlsZCwgYXJlYTtcbiAgICAgIHdoaWxlICgrK2kgPCBuKSB7XG4gICAgICAgIGFyZWEgPSAoY2hpbGQgPSBjaGlsZHJlbltpXSkudmFsdWUgKiAoayA8IDAgPyAwIDogayk7XG4gICAgICAgIGNoaWxkLmFyZWEgPSBpc05hTihhcmVhKSB8fCBhcmVhIDw9IDAgPyAwIDogYXJlYTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gc3F1YXJpZnkobm9kZSkge1xuICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgdmFyIHJlY3QgPSBwYWQobm9kZSksIHJvdyA9IFtdLCByZW1haW5pbmcgPSBjaGlsZHJlbi5zbGljZSgpLCBjaGlsZCwgYmVzdCA9IEluZmluaXR5LCBzY29yZSwgdSA9IG1vZGUgPT09IFwic2xpY2VcIiA/IHJlY3QuZHggOiBtb2RlID09PSBcImRpY2VcIiA/IHJlY3QuZHkgOiBtb2RlID09PSBcInNsaWNlLWRpY2VcIiA/IG5vZGUuZGVwdGggJiAxID8gcmVjdC5keSA6IHJlY3QuZHggOiBNYXRoLm1pbihyZWN0LmR4LCByZWN0LmR5KSwgbjtcbiAgICAgICAgc2NhbGUocmVtYWluaW5nLCByZWN0LmR4ICogcmVjdC5keSAvIG5vZGUudmFsdWUpO1xuICAgICAgICByb3cuYXJlYSA9IDA7XG4gICAgICAgIHdoaWxlICgobiA9IHJlbWFpbmluZy5sZW5ndGgpID4gMCkge1xuICAgICAgICAgIHJvdy5wdXNoKGNoaWxkID0gcmVtYWluaW5nW24gLSAxXSk7XG4gICAgICAgICAgcm93LmFyZWEgKz0gY2hpbGQuYXJlYTtcbiAgICAgICAgICBpZiAobW9kZSAhPT0gXCJzcXVhcmlmeVwiIHx8IChzY29yZSA9IHdvcnN0KHJvdywgdSkpIDw9IGJlc3QpIHtcbiAgICAgICAgICAgIHJlbWFpbmluZy5wb3AoKTtcbiAgICAgICAgICAgIGJlc3QgPSBzY29yZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm93LmFyZWEgLT0gcm93LnBvcCgpLmFyZWE7XG4gICAgICAgICAgICBwb3NpdGlvbihyb3csIHUsIHJlY3QsIGZhbHNlKTtcbiAgICAgICAgICAgIHUgPSBNYXRoLm1pbihyZWN0LmR4LCByZWN0LmR5KTtcbiAgICAgICAgICAgIHJvdy5sZW5ndGggPSByb3cuYXJlYSA9IDA7XG4gICAgICAgICAgICBiZXN0ID0gSW5maW5pdHk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyb3cubGVuZ3RoKSB7XG4gICAgICAgICAgcG9zaXRpb24ocm93LCB1LCByZWN0LCB0cnVlKTtcbiAgICAgICAgICByb3cubGVuZ3RoID0gcm93LmFyZWEgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuLmZvckVhY2goc3F1YXJpZnkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzdGlja2lmeShub2RlKSB7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuO1xuICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICB2YXIgcmVjdCA9IHBhZChub2RlKSwgcmVtYWluaW5nID0gY2hpbGRyZW4uc2xpY2UoKSwgY2hpbGQsIHJvdyA9IFtdO1xuICAgICAgICBzY2FsZShyZW1haW5pbmcsIHJlY3QuZHggKiByZWN0LmR5IC8gbm9kZS52YWx1ZSk7XG4gICAgICAgIHJvdy5hcmVhID0gMDtcbiAgICAgICAgd2hpbGUgKGNoaWxkID0gcmVtYWluaW5nLnBvcCgpKSB7XG4gICAgICAgICAgcm93LnB1c2goY2hpbGQpO1xuICAgICAgICAgIHJvdy5hcmVhICs9IGNoaWxkLmFyZWE7XG4gICAgICAgICAgaWYgKGNoaWxkLnogIT0gbnVsbCkge1xuICAgICAgICAgICAgcG9zaXRpb24ocm93LCBjaGlsZC56ID8gcmVjdC5keCA6IHJlY3QuZHksIHJlY3QsICFyZW1haW5pbmcubGVuZ3RoKTtcbiAgICAgICAgICAgIHJvdy5sZW5ndGggPSByb3cuYXJlYSA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNoaWxkcmVuLmZvckVhY2goc3RpY2tpZnkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB3b3JzdChyb3csIHUpIHtcbiAgICAgIHZhciBzID0gcm93LmFyZWEsIHIsIHJtYXggPSAwLCBybWluID0gSW5maW5pdHksIGkgPSAtMSwgbiA9IHJvdy5sZW5ndGg7XG4gICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICBpZiAoIShyID0gcm93W2ldLmFyZWEpKSBjb250aW51ZTtcbiAgICAgICAgaWYgKHIgPCBybWluKSBybWluID0gcjtcbiAgICAgICAgaWYgKHIgPiBybWF4KSBybWF4ID0gcjtcbiAgICAgIH1cbiAgICAgIHMgKj0gcztcbiAgICAgIHUgKj0gdTtcbiAgICAgIHJldHVybiBzID8gTWF0aC5tYXgodSAqIHJtYXggKiByYXRpbyAvIHMsIHMgLyAodSAqIHJtaW4gKiByYXRpbykpIDogSW5maW5pdHk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHBvc2l0aW9uKHJvdywgdSwgcmVjdCwgZmx1c2gpIHtcbiAgICAgIHZhciBpID0gLTEsIG4gPSByb3cubGVuZ3RoLCB4ID0gcmVjdC54LCB5ID0gcmVjdC55LCB2ID0gdSA/IHJvdW5kKHJvdy5hcmVhIC8gdSkgOiAwLCBvO1xuICAgICAgaWYgKHUgPT0gcmVjdC5keCkge1xuICAgICAgICBpZiAoZmx1c2ggfHwgdiA+IHJlY3QuZHkpIHYgPSByZWN0LmR5O1xuICAgICAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgICAgIG8gPSByb3dbaV07XG4gICAgICAgICAgby54ID0geDtcbiAgICAgICAgICBvLnkgPSB5O1xuICAgICAgICAgIG8uZHkgPSB2O1xuICAgICAgICAgIHggKz0gby5keCA9IE1hdGgubWluKHJlY3QueCArIHJlY3QuZHggLSB4LCB2ID8gcm91bmQoby5hcmVhIC8gdikgOiAwKTtcbiAgICAgICAgfVxuICAgICAgICBvLnogPSB0cnVlO1xuICAgICAgICBvLmR4ICs9IHJlY3QueCArIHJlY3QuZHggLSB4O1xuICAgICAgICByZWN0LnkgKz0gdjtcbiAgICAgICAgcmVjdC5keSAtPSB2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZsdXNoIHx8IHYgPiByZWN0LmR4KSB2ID0gcmVjdC5keDtcbiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgICBvID0gcm93W2ldO1xuICAgICAgICAgIG8ueCA9IHg7XG4gICAgICAgICAgby55ID0geTtcbiAgICAgICAgICBvLmR4ID0gdjtcbiAgICAgICAgICB5ICs9IG8uZHkgPSBNYXRoLm1pbihyZWN0LnkgKyByZWN0LmR5IC0geSwgdiA/IHJvdW5kKG8uYXJlYSAvIHYpIDogMCk7XG4gICAgICAgIH1cbiAgICAgICAgby56ID0gZmFsc2U7XG4gICAgICAgIG8uZHkgKz0gcmVjdC55ICsgcmVjdC5keSAtIHk7XG4gICAgICAgIHJlY3QueCArPSB2O1xuICAgICAgICByZWN0LmR4IC09IHY7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyZWVtYXAoZCkge1xuICAgICAgdmFyIG5vZGVzID0gc3RpY2tpZXMgfHwgaGllcmFyY2h5KGQpLCByb290ID0gbm9kZXNbMF07XG4gICAgICByb290LnggPSByb290LnkgPSAwO1xuICAgICAgaWYgKHJvb3QudmFsdWUpIHJvb3QuZHggPSBzaXplWzBdLCByb290LmR5ID0gc2l6ZVsxXTsgZWxzZSByb290LmR4ID0gcm9vdC5keSA9IDA7XG4gICAgICBpZiAoc3RpY2tpZXMpIGhpZXJhcmNoeS5yZXZhbHVlKHJvb3QpO1xuICAgICAgc2NhbGUoWyByb290IF0sIHJvb3QuZHggKiByb290LmR5IC8gcm9vdC52YWx1ZSk7XG4gICAgICAoc3RpY2tpZXMgPyBzdGlja2lmeSA6IHNxdWFyaWZ5KShyb290KTtcbiAgICAgIGlmIChzdGlja3kpIHN0aWNraWVzID0gbm9kZXM7XG4gICAgICByZXR1cm4gbm9kZXM7XG4gICAgfVxuICAgIHRyZWVtYXAuc2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNpemU7XG4gICAgICBzaXplID0geDtcbiAgICAgIHJldHVybiB0cmVlbWFwO1xuICAgIH07XG4gICAgdHJlZW1hcC5wYWRkaW5nID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcGFkZGluZztcbiAgICAgIGZ1bmN0aW9uIHBhZEZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgICAgdmFyIHAgPSB4LmNhbGwodHJlZW1hcCwgbm9kZSwgbm9kZS5kZXB0aCk7XG4gICAgICAgIHJldHVybiBwID09IG51bGwgPyBkM19sYXlvdXRfdHJlZW1hcFBhZE51bGwobm9kZSkgOiBkM19sYXlvdXRfdHJlZW1hcFBhZChub2RlLCB0eXBlb2YgcCA9PT0gXCJudW1iZXJcIiA/IFsgcCwgcCwgcCwgcCBdIDogcCk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBwYWRDb25zdGFudChub2RlKSB7XG4gICAgICAgIHJldHVybiBkM19sYXlvdXRfdHJlZW1hcFBhZChub2RlLCB4KTtcbiAgICAgIH1cbiAgICAgIHZhciB0eXBlO1xuICAgICAgcGFkID0gKHBhZGRpbmcgPSB4KSA9PSBudWxsID8gZDNfbGF5b3V0X3RyZWVtYXBQYWROdWxsIDogKHR5cGUgPSB0eXBlb2YgeCkgPT09IFwiZnVuY3Rpb25cIiA/IHBhZEZ1bmN0aW9uIDogdHlwZSA9PT0gXCJudW1iZXJcIiA/ICh4ID0gWyB4LCB4LCB4LCB4IF0sIFxuICAgICAgcGFkQ29uc3RhbnQpIDogcGFkQ29uc3RhbnQ7XG4gICAgICByZXR1cm4gdHJlZW1hcDtcbiAgICB9O1xuICAgIHRyZWVtYXAucm91bmQgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByb3VuZCAhPSBOdW1iZXI7XG4gICAgICByb3VuZCA9IHggPyBNYXRoLnJvdW5kIDogTnVtYmVyO1xuICAgICAgcmV0dXJuIHRyZWVtYXA7XG4gICAgfTtcbiAgICB0cmVlbWFwLnN0aWNreSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHN0aWNreTtcbiAgICAgIHN0aWNreSA9IHg7XG4gICAgICBzdGlja2llcyA9IG51bGw7XG4gICAgICByZXR1cm4gdHJlZW1hcDtcbiAgICB9O1xuICAgIHRyZWVtYXAucmF0aW8gPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYXRpbztcbiAgICAgIHJhdGlvID0geDtcbiAgICAgIHJldHVybiB0cmVlbWFwO1xuICAgIH07XG4gICAgdHJlZW1hcC5tb2RlID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbW9kZTtcbiAgICAgIG1vZGUgPSB4ICsgXCJcIjtcbiAgICAgIHJldHVybiB0cmVlbWFwO1xuICAgIH07XG4gICAgcmV0dXJuIGQzX2xheW91dF9oaWVyYXJjaHlSZWJpbmQodHJlZW1hcCwgaGllcmFyY2h5KTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVtYXBQYWROdWxsKG5vZGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDogbm9kZS54LFxuICAgICAgeTogbm9kZS55LFxuICAgICAgZHg6IG5vZGUuZHgsXG4gICAgICBkeTogbm9kZS5keVxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZDNfbGF5b3V0X3RyZWVtYXBQYWQobm9kZSwgcGFkZGluZykge1xuICAgIHZhciB4ID0gbm9kZS54ICsgcGFkZGluZ1szXSwgeSA9IG5vZGUueSArIHBhZGRpbmdbMF0sIGR4ID0gbm9kZS5keCAtIHBhZGRpbmdbMV0gLSBwYWRkaW5nWzNdLCBkeSA9IG5vZGUuZHkgLSBwYWRkaW5nWzBdIC0gcGFkZGluZ1syXTtcbiAgICBpZiAoZHggPCAwKSB7XG4gICAgICB4ICs9IGR4IC8gMjtcbiAgICAgIGR4ID0gMDtcbiAgICB9XG4gICAgaWYgKGR5IDwgMCkge1xuICAgICAgeSArPSBkeSAvIDI7XG4gICAgICBkeSA9IDA7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB4OiB4LFxuICAgICAgeTogeSxcbiAgICAgIGR4OiBkeCxcbiAgICAgIGR5OiBkeVxuICAgIH07XG4gIH1cbiAgZDMucmFuZG9tID0ge1xuICAgIG5vcm1hbDogZnVuY3Rpb24owrUsIM+DKSB7XG4gICAgICB2YXIgbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICBpZiAobiA8IDIpIM+DID0gMTtcbiAgICAgIGlmIChuIDwgMSkgwrUgPSAwO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgeCwgeSwgcjtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIHggPSBNYXRoLnJhbmRvbSgpICogMiAtIDE7XG4gICAgICAgICAgeSA9IE1hdGgucmFuZG9tKCkgKiAyIC0gMTtcbiAgICAgICAgICByID0geCAqIHggKyB5ICogeTtcbiAgICAgICAgfSB3aGlsZSAoIXIgfHwgciA+IDEpO1xuICAgICAgICByZXR1cm4gwrUgKyDPgyAqIHggKiBNYXRoLnNxcnQoLTIgKiBNYXRoLmxvZyhyKSAvIHIpO1xuICAgICAgfTtcbiAgICB9LFxuICAgIGxvZ05vcm1hbDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgcmFuZG9tID0gZDMucmFuZG9tLm5vcm1hbC5hcHBseShkMywgYXJndW1lbnRzKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZXhwKHJhbmRvbSgpKTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBiYXRlczogZnVuY3Rpb24obSkge1xuICAgICAgdmFyIHJhbmRvbSA9IGQzLnJhbmRvbS5pcndpbkhhbGwobSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiByYW5kb20oKSAvIG07XG4gICAgICB9O1xuICAgIH0sXG4gICAgaXJ3aW5IYWxsOiBmdW5jdGlvbihtKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgIGZvciAodmFyIHMgPSAwLCBqID0gMDsgaiA8IG07IGorKykgcyArPSBNYXRoLnJhbmRvbSgpO1xuICAgICAgICByZXR1cm4gcztcbiAgICAgIH07XG4gICAgfVxuICB9O1xuICBkMy5zY2FsZSA9IHt9O1xuICBmdW5jdGlvbiBkM19zY2FsZUV4dGVudChkb21haW4pIHtcbiAgICB2YXIgc3RhcnQgPSBkb21haW5bMF0sIHN0b3AgPSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiBzdGFydCA8IHN0b3AgPyBbIHN0YXJ0LCBzdG9wIF0gOiBbIHN0b3AsIHN0YXJ0IF07XG4gIH1cbiAgZnVuY3Rpb24gZDNfc2NhbGVSYW5nZShzY2FsZSkge1xuICAgIHJldHVybiBzY2FsZS5yYW5nZUV4dGVudCA/IHNjYWxlLnJhbmdlRXh0ZW50KCkgOiBkM19zY2FsZUV4dGVudChzY2FsZS5yYW5nZSgpKTtcbiAgfVxuICBmdW5jdGlvbiBkM19zY2FsZV9iaWxpbmVhcihkb21haW4sIHJhbmdlLCB1bmludGVycG9sYXRlLCBpbnRlcnBvbGF0ZSkge1xuICAgIHZhciB1ID0gdW5pbnRlcnBvbGF0ZShkb21haW5bMF0sIGRvbWFpblsxXSksIGkgPSBpbnRlcnBvbGF0ZShyYW5nZVswXSwgcmFuZ2VbMV0pO1xuICAgIHJldHVybiBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gaSh1KHgpKTtcbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGQzX3NjYWxlX25pY2UoZG9tYWluLCBuaWNlKSB7XG4gICAgdmFyIGkwID0gMCwgaTEgPSBkb21haW4ubGVuZ3RoIC0gMSwgeDAgPSBkb21haW5baTBdLCB4MSA9IGRvbWFpbltpMV0sIGR4O1xuICAgIGlmICh4MSA8IHgwKSB7XG4gICAgICBkeCA9IGkwLCBpMCA9IGkxLCBpMSA9IGR4O1xuICAgICAgZHggPSB4MCwgeDAgPSB4MSwgeDEgPSBkeDtcbiAgICB9XG4gICAgZG9tYWluW2kwXSA9IG5pY2UuZmxvb3IoeDApO1xuICAgIGRvbWFpbltpMV0gPSBuaWNlLmNlaWwoeDEpO1xuICAgIHJldHVybiBkb21haW47XG4gIH1cbiAgZnVuY3Rpb24gZDNfc2NhbGVfbmljZVN0ZXAoc3RlcCkge1xuICAgIHJldHVybiBzdGVwID8ge1xuICAgICAgZmxvb3I6IGZ1bmN0aW9uKHgpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoeCAvIHN0ZXApICogc3RlcDtcbiAgICAgIH0sXG4gICAgICBjZWlsOiBmdW5jdGlvbih4KSB7XG4gICAgICAgIHJldHVybiBNYXRoLmNlaWwoeCAvIHN0ZXApICogc3RlcDtcbiAgICAgIH1cbiAgICB9IDogZDNfc2NhbGVfbmljZUlkZW50aXR5O1xuICB9XG4gIHZhciBkM19zY2FsZV9uaWNlSWRlbnRpdHkgPSB7XG4gICAgZmxvb3I6IGQzX2lkZW50aXR5LFxuICAgIGNlaWw6IGQzX2lkZW50aXR5XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3NjYWxlX3BvbHlsaW5lYXIoZG9tYWluLCByYW5nZSwgdW5pbnRlcnBvbGF0ZSwgaW50ZXJwb2xhdGUpIHtcbiAgICB2YXIgdSA9IFtdLCBpID0gW10sIGogPSAwLCBrID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UubGVuZ3RoKSAtIDE7XG4gICAgaWYgKGRvbWFpbltrXSA8IGRvbWFpblswXSkge1xuICAgICAgZG9tYWluID0gZG9tYWluLnNsaWNlKCkucmV2ZXJzZSgpO1xuICAgICAgcmFuZ2UgPSByYW5nZS5zbGljZSgpLnJldmVyc2UoKTtcbiAgICB9XG4gICAgd2hpbGUgKCsraiA8PSBrKSB7XG4gICAgICB1LnB1c2godW5pbnRlcnBvbGF0ZShkb21haW5baiAtIDFdLCBkb21haW5bal0pKTtcbiAgICAgIGkucHVzaChpbnRlcnBvbGF0ZShyYW5nZVtqIC0gMV0sIHJhbmdlW2pdKSk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbih4KSB7XG4gICAgICB2YXIgaiA9IGQzLmJpc2VjdChkb21haW4sIHgsIDEsIGspIC0gMTtcbiAgICAgIHJldHVybiBpW2pdKHVbal0oeCkpO1xuICAgIH07XG4gIH1cbiAgZDMuc2NhbGUubGluZWFyID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhcihbIDAsIDEgXSwgWyAwLCAxIF0sIGQzX2ludGVycG9sYXRlLCBmYWxzZSk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3NjYWxlX2xpbmVhcihkb21haW4sIHJhbmdlLCBpbnRlcnBvbGF0ZSwgY2xhbXApIHtcbiAgICB2YXIgb3V0cHV0LCBpbnB1dDtcbiAgICBmdW5jdGlvbiByZXNjYWxlKCkge1xuICAgICAgdmFyIGxpbmVhciA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCkgPiAyID8gZDNfc2NhbGVfcG9seWxpbmVhciA6IGQzX3NjYWxlX2JpbGluZWFyLCB1bmludGVycG9sYXRlID0gY2xhbXAgPyBkM191bmludGVycG9sYXRlQ2xhbXAgOiBkM191bmludGVycG9sYXRlTnVtYmVyO1xuICAgICAgb3V0cHV0ID0gbGluZWFyKGRvbWFpbiwgcmFuZ2UsIHVuaW50ZXJwb2xhdGUsIGludGVycG9sYXRlKTtcbiAgICAgIGlucHV0ID0gbGluZWFyKHJhbmdlLCBkb21haW4sIHVuaW50ZXJwb2xhdGUsIGQzX2ludGVycG9sYXRlKTtcbiAgICAgIHJldHVybiBzY2FsZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2NhbGUoeCkge1xuICAgICAgcmV0dXJuIG91dHB1dCh4KTtcbiAgICB9XG4gICAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeSkge1xuICAgICAgcmV0dXJuIGlucHV0KHkpO1xuICAgIH07XG4gICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluO1xuICAgICAgZG9tYWluID0geC5tYXAoTnVtYmVyKTtcbiAgICAgIHJldHVybiByZXNjYWxlKCk7XG4gICAgfTtcbiAgICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhbmdlO1xuICAgICAgcmFuZ2UgPSB4O1xuICAgICAgcmV0dXJuIHJlc2NhbGUoKTtcbiAgICB9O1xuICAgIHNjYWxlLnJhbmdlUm91bmQgPSBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gc2NhbGUucmFuZ2UoeCkuaW50ZXJwb2xhdGUoZDNfaW50ZXJwb2xhdGVSb3VuZCk7XG4gICAgfTtcbiAgICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNsYW1wO1xuICAgICAgY2xhbXAgPSB4O1xuICAgICAgcmV0dXJuIHJlc2NhbGUoKTtcbiAgICB9O1xuICAgIHNjYWxlLmludGVycG9sYXRlID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gaW50ZXJwb2xhdGU7XG4gICAgICBpbnRlcnBvbGF0ZSA9IHg7XG4gICAgICByZXR1cm4gcmVzY2FsZSgpO1xuICAgIH07XG4gICAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihtKSB7XG4gICAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja3MoZG9tYWluLCBtKTtcbiAgICB9O1xuICAgIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihtLCBmb3JtYXQpIHtcbiAgICAgIHJldHVybiBkM19zY2FsZV9saW5lYXJUaWNrRm9ybWF0KGRvbWFpbiwgbSwgZm9ybWF0KTtcbiAgICB9O1xuICAgIHNjYWxlLm5pY2UgPSBmdW5jdGlvbihtKSB7XG4gICAgICBkM19zY2FsZV9saW5lYXJOaWNlKGRvbWFpbiwgbSk7XG4gICAgICByZXR1cm4gcmVzY2FsZSgpO1xuICAgIH07XG4gICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhcihkb21haW4sIHJhbmdlLCBpbnRlcnBvbGF0ZSwgY2xhbXApO1xuICAgIH07XG4gICAgcmV0dXJuIHJlc2NhbGUoKTtcbiAgfVxuICBmdW5jdGlvbiBkM19zY2FsZV9saW5lYXJSZWJpbmQoc2NhbGUsIGxpbmVhcikge1xuICAgIHJldHVybiBkMy5yZWJpbmQoc2NhbGUsIGxpbmVhciwgXCJyYW5nZVwiLCBcInJhbmdlUm91bmRcIiwgXCJpbnRlcnBvbGF0ZVwiLCBcImNsYW1wXCIpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3NjYWxlX2xpbmVhck5pY2UoZG9tYWluLCBtKSB7XG4gICAgZDNfc2NhbGVfbmljZShkb21haW4sIGQzX3NjYWxlX25pY2VTdGVwKGQzX3NjYWxlX2xpbmVhclRpY2tSYW5nZShkb21haW4sIG0pWzJdKSk7XG4gICAgZDNfc2NhbGVfbmljZShkb21haW4sIGQzX3NjYWxlX25pY2VTdGVwKGQzX3NjYWxlX2xpbmVhclRpY2tSYW5nZShkb21haW4sIG0pWzJdKSk7XG4gICAgcmV0dXJuIGRvbWFpbjtcbiAgfVxuICBmdW5jdGlvbiBkM19zY2FsZV9saW5lYXJUaWNrUmFuZ2UoZG9tYWluLCBtKSB7XG4gICAgaWYgKG0gPT0gbnVsbCkgbSA9IDEwO1xuICAgIHZhciBleHRlbnQgPSBkM19zY2FsZUV4dGVudChkb21haW4pLCBzcGFuID0gZXh0ZW50WzFdIC0gZXh0ZW50WzBdLCBzdGVwID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoTWF0aC5sb2coc3BhbiAvIG0pIC8gTWF0aC5MTjEwKSksIGVyciA9IG0gLyBzcGFuICogc3RlcDtcbiAgICBpZiAoZXJyIDw9IC4xNSkgc3RlcCAqPSAxMDsgZWxzZSBpZiAoZXJyIDw9IC4zNSkgc3RlcCAqPSA1OyBlbHNlIGlmIChlcnIgPD0gLjc1KSBzdGVwICo9IDI7XG4gICAgZXh0ZW50WzBdID0gTWF0aC5jZWlsKGV4dGVudFswXSAvIHN0ZXApICogc3RlcDtcbiAgICBleHRlbnRbMV0gPSBNYXRoLmZsb29yKGV4dGVudFsxXSAvIHN0ZXApICogc3RlcCArIHN0ZXAgKiAuNTtcbiAgICBleHRlbnRbMl0gPSBzdGVwO1xuICAgIHJldHVybiBleHRlbnQ7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyVGlja3MoZG9tYWluLCBtKSB7XG4gICAgcmV0dXJuIGQzLnJhbmdlLmFwcGx5KGQzLCBkM19zY2FsZV9saW5lYXJUaWNrUmFuZ2UoZG9tYWluLCBtKSk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc2NhbGVfbGluZWFyVGlja0Zvcm1hdChkb21haW4sIG0sIGZvcm1hdCkge1xuICAgIHZhciByYW5nZSA9IGQzX3NjYWxlX2xpbmVhclRpY2tSYW5nZShkb21haW4sIG0pO1xuICAgIGlmIChmb3JtYXQpIHtcbiAgICAgIHZhciBtYXRjaCA9IGQzX2Zvcm1hdF9yZS5leGVjKGZvcm1hdCk7XG4gICAgICBtYXRjaC5zaGlmdCgpO1xuICAgICAgaWYgKG1hdGNoWzhdID09PSBcInNcIikge1xuICAgICAgICB2YXIgcHJlZml4ID0gZDMuZm9ybWF0UHJlZml4KE1hdGgubWF4KGFicyhyYW5nZVswXSksIGFicyhyYW5nZVsxXSkpKTtcbiAgICAgICAgaWYgKCFtYXRjaFs3XSkgbWF0Y2hbN10gPSBcIi5cIiArIGQzX3NjYWxlX2xpbmVhclByZWNpc2lvbihwcmVmaXguc2NhbGUocmFuZ2VbMl0pKTtcbiAgICAgICAgbWF0Y2hbOF0gPSBcImZcIjtcbiAgICAgICAgZm9ybWF0ID0gZDMuZm9ybWF0KG1hdGNoLmpvaW4oXCJcIikpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24oZCkge1xuICAgICAgICAgIHJldHVybiBmb3JtYXQocHJlZml4LnNjYWxlKGQpKSArIHByZWZpeC5zeW1ib2w7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoIW1hdGNoWzddKSBtYXRjaFs3XSA9IFwiLlwiICsgZDNfc2NhbGVfbGluZWFyRm9ybWF0UHJlY2lzaW9uKG1hdGNoWzhdLCByYW5nZSk7XG4gICAgICBmb3JtYXQgPSBtYXRjaC5qb2luKFwiXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JtYXQgPSBcIiwuXCIgKyBkM19zY2FsZV9saW5lYXJQcmVjaXNpb24ocmFuZ2VbMl0pICsgXCJmXCI7XG4gICAgfVxuICAgIHJldHVybiBkMy5mb3JtYXQoZm9ybWF0KTtcbiAgfVxuICB2YXIgZDNfc2NhbGVfbGluZWFyRm9ybWF0U2lnbmlmaWNhbnQgPSB7XG4gICAgczogMSxcbiAgICBnOiAxLFxuICAgIHA6IDEsXG4gICAgcjogMSxcbiAgICBlOiAxXG4gIH07XG4gIGZ1bmN0aW9uIGQzX3NjYWxlX2xpbmVhclByZWNpc2lvbih2YWx1ZSkge1xuICAgIHJldHVybiAtTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMTAgKyAuMDEpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3NjYWxlX2xpbmVhckZvcm1hdFByZWNpc2lvbih0eXBlLCByYW5nZSkge1xuICAgIHZhciBwID0gZDNfc2NhbGVfbGluZWFyUHJlY2lzaW9uKHJhbmdlWzJdKTtcbiAgICByZXR1cm4gdHlwZSBpbiBkM19zY2FsZV9saW5lYXJGb3JtYXRTaWduaWZpY2FudCA/IE1hdGguYWJzKHAgLSBkM19zY2FsZV9saW5lYXJQcmVjaXNpb24oTWF0aC5tYXgoYWJzKHJhbmdlWzBdKSwgYWJzKHJhbmdlWzFdKSkpKSArICsodHlwZSAhPT0gXCJlXCIpIDogcCAtICh0eXBlID09PSBcIiVcIikgKiAyO1xuICB9XG4gIGQzLnNjYWxlLmxvZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19zY2FsZV9sb2coZDMuc2NhbGUubGluZWFyKCkuZG9tYWluKFsgMCwgMSBdKSwgMTAsIHRydWUsIFsgMSwgMTAgXSk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3NjYWxlX2xvZyhsaW5lYXIsIGJhc2UsIHBvc2l0aXZlLCBkb21haW4pIHtcbiAgICBmdW5jdGlvbiBsb2coeCkge1xuICAgICAgcmV0dXJuIChwb3NpdGl2ZSA/IE1hdGgubG9nKHggPCAwID8gMCA6IHgpIDogLU1hdGgubG9nKHggPiAwID8gMCA6IC14KSkgLyBNYXRoLmxvZyhiYXNlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcG93KHgpIHtcbiAgICAgIHJldHVybiBwb3NpdGl2ZSA/IE1hdGgucG93KGJhc2UsIHgpIDogLU1hdGgucG93KGJhc2UsIC14KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc2NhbGUoeCkge1xuICAgICAgcmV0dXJuIGxpbmVhcihsb2coeCkpO1xuICAgIH1cbiAgICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4gcG93KGxpbmVhci5pbnZlcnQoeCkpO1xuICAgIH07XG4gICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluO1xuICAgICAgcG9zaXRpdmUgPSB4WzBdID49IDA7XG4gICAgICBsaW5lYXIuZG9tYWluKChkb21haW4gPSB4Lm1hcChOdW1iZXIpKS5tYXAobG9nKSk7XG4gICAgICByZXR1cm4gc2NhbGU7XG4gICAgfTtcbiAgICBzY2FsZS5iYXNlID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gYmFzZTtcbiAgICAgIGJhc2UgPSArXztcbiAgICAgIGxpbmVhci5kb21haW4oZG9tYWluLm1hcChsb2cpKTtcbiAgICAgIHJldHVybiBzY2FsZTtcbiAgICB9O1xuICAgIHNjYWxlLm5pY2UgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBuaWNlZCA9IGQzX3NjYWxlX25pY2UoZG9tYWluLm1hcChsb2cpLCBwb3NpdGl2ZSA/IE1hdGggOiBkM19zY2FsZV9sb2dOaWNlTmVnYXRpdmUpO1xuICAgICAgbGluZWFyLmRvbWFpbihuaWNlZCk7XG4gICAgICBkb21haW4gPSBuaWNlZC5tYXAocG93KTtcbiAgICAgIHJldHVybiBzY2FsZTtcbiAgICB9O1xuICAgIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZXh0ZW50ID0gZDNfc2NhbGVFeHRlbnQoZG9tYWluKSwgdGlja3MgPSBbXSwgdSA9IGV4dGVudFswXSwgdiA9IGV4dGVudFsxXSwgaSA9IE1hdGguZmxvb3IobG9nKHUpKSwgaiA9IE1hdGguY2VpbChsb2codikpLCBuID0gYmFzZSAlIDEgPyAyIDogYmFzZTtcbiAgICAgIGlmIChpc0Zpbml0ZShqIC0gaSkpIHtcbiAgICAgICAgaWYgKHBvc2l0aXZlKSB7XG4gICAgICAgICAgZm9yICg7aSA8IGo7IGkrKykgZm9yICh2YXIgayA9IDE7IGsgPCBuOyBrKyspIHRpY2tzLnB1c2gocG93KGkpICogayk7XG4gICAgICAgICAgdGlja3MucHVzaChwb3coaSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRpY2tzLnB1c2gocG93KGkpKTtcbiAgICAgICAgICBmb3IgKDtpKysgPCBqOyApIGZvciAodmFyIGsgPSBuIC0gMTsgayA+IDA7IGstLSkgdGlja3MucHVzaChwb3coaSkgKiBrKTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyB0aWNrc1tpXSA8IHU7IGkrKykge31cbiAgICAgICAgZm9yIChqID0gdGlja3MubGVuZ3RoOyB0aWNrc1tqIC0gMV0gPiB2OyBqLS0pIHt9XG4gICAgICAgIHRpY2tzID0gdGlja3Muc2xpY2UoaSwgaik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGlja3M7XG4gICAgfTtcbiAgICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24obiwgZm9ybWF0KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkM19zY2FsZV9sb2dGb3JtYXQ7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIGZvcm1hdCA9IGQzX3NjYWxlX2xvZ0Zvcm1hdDsgZWxzZSBpZiAodHlwZW9mIGZvcm1hdCAhPT0gXCJmdW5jdGlvblwiKSBmb3JtYXQgPSBkMy5mb3JtYXQoZm9ybWF0KTtcbiAgICAgIHZhciBrID0gTWF0aC5tYXgoMSwgYmFzZSAqIG4gLyBzY2FsZS50aWNrcygpLmxlbmd0aCk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oZCkge1xuICAgICAgICB2YXIgaSA9IGQgLyBwb3coTWF0aC5yb3VuZChsb2coZCkpKTtcbiAgICAgICAgaWYgKGkgKiBiYXNlIDwgYmFzZSAtIC41KSBpICo9IGJhc2U7XG4gICAgICAgIHJldHVybiBpIDw9IGsgPyBmb3JtYXQoZCkgOiBcIlwiO1xuICAgICAgfTtcbiAgICB9O1xuICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBkM19zY2FsZV9sb2cobGluZWFyLmNvcHkoKSwgYmFzZSwgcG9zaXRpdmUsIGRvbWFpbik7XG4gICAgfTtcbiAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyUmViaW5kKHNjYWxlLCBsaW5lYXIpO1xuICB9XG4gIHZhciBkM19zY2FsZV9sb2dGb3JtYXQgPSBkMy5mb3JtYXQoXCIuMGVcIiksIGQzX3NjYWxlX2xvZ05pY2VOZWdhdGl2ZSA9IHtcbiAgICBmbG9vcjogZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIC1NYXRoLmNlaWwoLXgpO1xuICAgIH0sXG4gICAgY2VpbDogZnVuY3Rpb24oeCkge1xuICAgICAgcmV0dXJuIC1NYXRoLmZsb29yKC14KTtcbiAgICB9XG4gIH07XG4gIGQzLnNjYWxlLnBvdyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19zY2FsZV9wb3coZDMuc2NhbGUubGluZWFyKCksIDEsIFsgMCwgMSBdKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc2NhbGVfcG93KGxpbmVhciwgZXhwb25lbnQsIGRvbWFpbikge1xuICAgIHZhciBwb3dwID0gZDNfc2NhbGVfcG93UG93KGV4cG9uZW50KSwgcG93YiA9IGQzX3NjYWxlX3Bvd1BvdygxIC8gZXhwb25lbnQpO1xuICAgIGZ1bmN0aW9uIHNjYWxlKHgpIHtcbiAgICAgIHJldHVybiBsaW5lYXIocG93cCh4KSk7XG4gICAgfVxuICAgIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiBwb3diKGxpbmVhci5pbnZlcnQoeCkpO1xuICAgIH07XG4gICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluO1xuICAgICAgbGluZWFyLmRvbWFpbigoZG9tYWluID0geC5tYXAoTnVtYmVyKSkubWFwKHBvd3ApKTtcbiAgICAgIHJldHVybiBzY2FsZTtcbiAgICB9O1xuICAgIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24obSkge1xuICAgICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclRpY2tzKGRvbWFpbiwgbSk7XG4gICAgfTtcbiAgICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24obSwgZm9ybWF0KSB7XG4gICAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja0Zvcm1hdChkb21haW4sIG0sIGZvcm1hdCk7XG4gICAgfTtcbiAgICBzY2FsZS5uaWNlID0gZnVuY3Rpb24obSkge1xuICAgICAgcmV0dXJuIHNjYWxlLmRvbWFpbihkM19zY2FsZV9saW5lYXJOaWNlKGRvbWFpbiwgbSkpO1xuICAgIH07XG4gICAgc2NhbGUuZXhwb25lbnQgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBleHBvbmVudDtcbiAgICAgIHBvd3AgPSBkM19zY2FsZV9wb3dQb3coZXhwb25lbnQgPSB4KTtcbiAgICAgIHBvd2IgPSBkM19zY2FsZV9wb3dQb3coMSAvIGV4cG9uZW50KTtcbiAgICAgIGxpbmVhci5kb21haW4oZG9tYWluLm1hcChwb3dwKSk7XG4gICAgICByZXR1cm4gc2NhbGU7XG4gICAgfTtcbiAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZDNfc2NhbGVfcG93KGxpbmVhci5jb3B5KCksIGV4cG9uZW50LCBkb21haW4pO1xuICAgIH07XG4gICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclJlYmluZChzY2FsZSwgbGluZWFyKTtcbiAgfVxuICBmdW5jdGlvbiBkM19zY2FsZV9wb3dQb3coZSkge1xuICAgIHJldHVybiBmdW5jdGlvbih4KSB7XG4gICAgICByZXR1cm4geCA8IDAgPyAtTWF0aC5wb3coLXgsIGUpIDogTWF0aC5wb3coeCwgZSk7XG4gICAgfTtcbiAgfVxuICBkMy5zY2FsZS5zcXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzLnNjYWxlLnBvdygpLmV4cG9uZW50KC41KTtcbiAgfTtcbiAgZDMuc2NhbGUub3JkaW5hbCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19zY2FsZV9vcmRpbmFsKFtdLCB7XG4gICAgICB0OiBcInJhbmdlXCIsXG4gICAgICBhOiBbIFtdIF1cbiAgICB9KTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc2NhbGVfb3JkaW5hbChkb21haW4sIHJhbmdlcikge1xuICAgIHZhciBpbmRleCwgcmFuZ2UsIHJhbmdlQmFuZDtcbiAgICBmdW5jdGlvbiBzY2FsZSh4KSB7XG4gICAgICByZXR1cm4gcmFuZ2VbKChpbmRleC5nZXQoeCkgfHwgKHJhbmdlci50ID09PSBcInJhbmdlXCIgPyBpbmRleC5zZXQoeCwgZG9tYWluLnB1c2goeCkpIDogTmFOKSkgLSAxKSAlIHJhbmdlLmxlbmd0aF07XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0ZXBzKHN0YXJ0LCBzdGVwKSB7XG4gICAgICByZXR1cm4gZDMucmFuZ2UoZG9tYWluLmxlbmd0aCkubWFwKGZ1bmN0aW9uKGkpIHtcbiAgICAgICAgcmV0dXJuIHN0YXJ0ICsgc3RlcCAqIGk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluO1xuICAgICAgZG9tYWluID0gW107XG4gICAgICBpbmRleCA9IG5ldyBkM19NYXAoKTtcbiAgICAgIHZhciBpID0gLTEsIG4gPSB4Lmxlbmd0aCwgeGk7XG4gICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpbmRleC5oYXMoeGkgPSB4W2ldKSkgaW5kZXguc2V0KHhpLCBkb21haW4ucHVzaCh4aSkpO1xuICAgICAgcmV0dXJuIHNjYWxlW3Jhbmdlci50XS5hcHBseShzY2FsZSwgcmFuZ2VyLmEpO1xuICAgIH07XG4gICAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYW5nZTtcbiAgICAgIHJhbmdlID0geDtcbiAgICAgIHJhbmdlQmFuZCA9IDA7XG4gICAgICByYW5nZXIgPSB7XG4gICAgICAgIHQ6IFwicmFuZ2VcIixcbiAgICAgICAgYTogYXJndW1lbnRzXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH07XG4gICAgc2NhbGUucmFuZ2VQb2ludHMgPSBmdW5jdGlvbih4LCBwYWRkaW5nKSB7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHBhZGRpbmcgPSAwO1xuICAgICAgdmFyIHN0YXJ0ID0geFswXSwgc3RvcCA9IHhbMV0sIHN0ZXAgPSBkb21haW4ubGVuZ3RoIDwgMiA/IChzdGFydCA9IChzdGFydCArIHN0b3ApIC8gMiwgXG4gICAgICAwKSA6IChzdG9wIC0gc3RhcnQpIC8gKGRvbWFpbi5sZW5ndGggLSAxICsgcGFkZGluZyk7XG4gICAgICByYW5nZSA9IHN0ZXBzKHN0YXJ0ICsgc3RlcCAqIHBhZGRpbmcgLyAyLCBzdGVwKTtcbiAgICAgIHJhbmdlQmFuZCA9IDA7XG4gICAgICByYW5nZXIgPSB7XG4gICAgICAgIHQ6IFwicmFuZ2VQb2ludHNcIixcbiAgICAgICAgYTogYXJndW1lbnRzXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH07XG4gICAgc2NhbGUucmFuZ2VSb3VuZFBvaW50cyA9IGZ1bmN0aW9uKHgsIHBhZGRpbmcpIHtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcGFkZGluZyA9IDA7XG4gICAgICB2YXIgc3RhcnQgPSB4WzBdLCBzdG9wID0geFsxXSwgc3RlcCA9IGRvbWFpbi5sZW5ndGggPCAyID8gKHN0YXJ0ID0gc3RvcCA9IE1hdGgucm91bmQoKHN0YXJ0ICsgc3RvcCkgLyAyKSwgXG4gICAgICAwKSA6IChzdG9wIC0gc3RhcnQpIC8gKGRvbWFpbi5sZW5ndGggLSAxICsgcGFkZGluZykgfCAwO1xuICAgICAgcmFuZ2UgPSBzdGVwcyhzdGFydCArIE1hdGgucm91bmQoc3RlcCAqIHBhZGRpbmcgLyAyICsgKHN0b3AgLSBzdGFydCAtIChkb21haW4ubGVuZ3RoIC0gMSArIHBhZGRpbmcpICogc3RlcCkgLyAyKSwgc3RlcCk7XG4gICAgICByYW5nZUJhbmQgPSAwO1xuICAgICAgcmFuZ2VyID0ge1xuICAgICAgICB0OiBcInJhbmdlUm91bmRQb2ludHNcIixcbiAgICAgICAgYTogYXJndW1lbnRzXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH07XG4gICAgc2NhbGUucmFuZ2VCYW5kcyA9IGZ1bmN0aW9uKHgsIHBhZGRpbmcsIG91dGVyUGFkZGluZykge1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSBwYWRkaW5nID0gMDtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgb3V0ZXJQYWRkaW5nID0gcGFkZGluZztcbiAgICAgIHZhciByZXZlcnNlID0geFsxXSA8IHhbMF0sIHN0YXJ0ID0geFtyZXZlcnNlIC0gMF0sIHN0b3AgPSB4WzEgLSByZXZlcnNlXSwgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gKGRvbWFpbi5sZW5ndGggLSBwYWRkaW5nICsgMiAqIG91dGVyUGFkZGluZyk7XG4gICAgICByYW5nZSA9IHN0ZXBzKHN0YXJ0ICsgc3RlcCAqIG91dGVyUGFkZGluZywgc3RlcCk7XG4gICAgICBpZiAocmV2ZXJzZSkgcmFuZ2UucmV2ZXJzZSgpO1xuICAgICAgcmFuZ2VCYW5kID0gc3RlcCAqICgxIC0gcGFkZGluZyk7XG4gICAgICByYW5nZXIgPSB7XG4gICAgICAgIHQ6IFwicmFuZ2VCYW5kc1wiLFxuICAgICAgICBhOiBhcmd1bWVudHNcbiAgICAgIH07XG4gICAgICByZXR1cm4gc2NhbGU7XG4gICAgfTtcbiAgICBzY2FsZS5yYW5nZVJvdW5kQmFuZHMgPSBmdW5jdGlvbih4LCBwYWRkaW5nLCBvdXRlclBhZGRpbmcpIHtcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcGFkZGluZyA9IDA7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIG91dGVyUGFkZGluZyA9IHBhZGRpbmc7XG4gICAgICB2YXIgcmV2ZXJzZSA9IHhbMV0gPCB4WzBdLCBzdGFydCA9IHhbcmV2ZXJzZSAtIDBdLCBzdG9wID0geFsxIC0gcmV2ZXJzZV0sIHN0ZXAgPSBNYXRoLmZsb29yKChzdG9wIC0gc3RhcnQpIC8gKGRvbWFpbi5sZW5ndGggLSBwYWRkaW5nICsgMiAqIG91dGVyUGFkZGluZykpO1xuICAgICAgcmFuZ2UgPSBzdGVwcyhzdGFydCArIE1hdGgucm91bmQoKHN0b3AgLSBzdGFydCAtIChkb21haW4ubGVuZ3RoIC0gcGFkZGluZykgKiBzdGVwKSAvIDIpLCBzdGVwKTtcbiAgICAgIGlmIChyZXZlcnNlKSByYW5nZS5yZXZlcnNlKCk7XG4gICAgICByYW5nZUJhbmQgPSBNYXRoLnJvdW5kKHN0ZXAgKiAoMSAtIHBhZGRpbmcpKTtcbiAgICAgIHJhbmdlciA9IHtcbiAgICAgICAgdDogXCJyYW5nZVJvdW5kQmFuZHNcIixcbiAgICAgICAgYTogYXJndW1lbnRzXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH07XG4gICAgc2NhbGUucmFuZ2VCYW5kID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcmFuZ2VCYW5kO1xuICAgIH07XG4gICAgc2NhbGUucmFuZ2VFeHRlbnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBkM19zY2FsZUV4dGVudChyYW5nZXIuYVswXSk7XG4gICAgfTtcbiAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZDNfc2NhbGVfb3JkaW5hbChkb21haW4sIHJhbmdlcik7XG4gICAgfTtcbiAgICByZXR1cm4gc2NhbGUuZG9tYWluKGRvbWFpbik7XG4gIH1cbiAgZDMuc2NhbGUuY2F0ZWdvcnkxMCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoZDNfY2F0ZWdvcnkxMCk7XG4gIH07XG4gIGQzLnNjYWxlLmNhdGVnb3J5MjAgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDMuc2NhbGUub3JkaW5hbCgpLnJhbmdlKGQzX2NhdGVnb3J5MjApO1xuICB9O1xuICBkMy5zY2FsZS5jYXRlZ29yeTIwYiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoZDNfY2F0ZWdvcnkyMGIpO1xuICB9O1xuICBkMy5zY2FsZS5jYXRlZ29yeTIwYyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoZDNfY2F0ZWdvcnkyMGMpO1xuICB9O1xuICB2YXIgZDNfY2F0ZWdvcnkxMCA9IFsgMjA2MjI2MCwgMTY3NDQyMDYsIDI5MjQ1ODgsIDE0MDM0NzI4LCA5NzI1ODg1LCA5MTk3MTMxLCAxNDkwNzMzMCwgODM1NTcxMSwgMTIzNjkxODYsIDE1NTYxNzUgXS5tYXAoZDNfcmdiU3RyaW5nKTtcbiAgdmFyIGQzX2NhdGVnb3J5MjAgPSBbIDIwNjIyNjAsIDExNDU0NDQwLCAxNjc0NDIwNiwgMTY3NTk2NzIsIDI5MjQ1ODgsIDEwMDE4Njk4LCAxNDAzNDcyOCwgMTY3NTA3NDIsIDk3MjU4ODUsIDEyOTU1ODYxLCA5MTk3MTMxLCAxMjg4NTE0MCwgMTQ5MDczMzAsIDE2MjM0MTk0LCA4MzU1NzExLCAxMzA5MjgwNywgMTIzNjkxODYsIDE0NDA4NTg5LCAxNTU2MTc1LCAxMDQxMDcyNSBdLm1hcChkM19yZ2JTdHJpbmcpO1xuICB2YXIgZDNfY2F0ZWdvcnkyMGIgPSBbIDM3NTA3NzcsIDUzOTU2MTksIDcwNDA3MTksIDEwMjY0Mjg2LCA2NTE5MDk3LCA5MjE2NTk0LCAxMTkxNTExNSwgMTM1NTY2MzYsIDkyMDI5OTMsIDEyNDI2ODA5LCAxNTE4NjUxNCwgMTUxOTA5MzIsIDg2NjYxNjksIDExMzU2NDkwLCAxNDA0OTY0MywgMTUxNzczNzIsIDgwNzc2ODMsIDEwODM0MzI0LCAxMzUyODUwOSwgMTQ1ODk2NTQgXS5tYXAoZDNfcmdiU3RyaW5nKTtcbiAgdmFyIGQzX2NhdGVnb3J5MjBjID0gWyAzMjQ0NzMzLCA3MDU3MTEwLCAxMDQwNjYyNSwgMTMwMzI0MzEsIDE1MDk1MDUzLCAxNjYxNjc2NCwgMTY2MjUyNTksIDE2NjM0MDE4LCAzMjUzMDc2LCA3NjUyNDcwLCAxMDYwNzAwMywgMTMxMDE1MDQsIDc2OTUyODEsIDEwMzk0MzEyLCAxMjM2OTM3MiwgMTQzNDI4OTEsIDY1MTM1MDcsIDk4Njg5NTAsIDEyNDM0ODc3LCAxNDI3NzA4MSBdLm1hcChkM19yZ2JTdHJpbmcpO1xuICBkMy5zY2FsZS5xdWFudGlsZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM19zY2FsZV9xdWFudGlsZShbXSwgW10pO1xuICB9O1xuICBmdW5jdGlvbiBkM19zY2FsZV9xdWFudGlsZShkb21haW4sIHJhbmdlKSB7XG4gICAgdmFyIHRocmVzaG9sZHM7XG4gICAgZnVuY3Rpb24gcmVzY2FsZSgpIHtcbiAgICAgIHZhciBrID0gMCwgcSA9IHJhbmdlLmxlbmd0aDtcbiAgICAgIHRocmVzaG9sZHMgPSBbXTtcbiAgICAgIHdoaWxlICgrK2sgPCBxKSB0aHJlc2hvbGRzW2sgLSAxXSA9IGQzLnF1YW50aWxlKGRvbWFpbiwgayAvIHEpO1xuICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzY2FsZSh4KSB7XG4gICAgICBpZiAoIWlzTmFOKHggPSAreCkpIHJldHVybiByYW5nZVtkMy5iaXNlY3QodGhyZXNob2xkcywgeCldO1xuICAgIH1cbiAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW47XG4gICAgICBkb21haW4gPSB4Lm1hcChkM19udW1iZXIpLmZpbHRlcihkM19udW1lcmljKS5zb3J0KGQzX2FzY2VuZGluZyk7XG4gICAgICByZXR1cm4gcmVzY2FsZSgpO1xuICAgIH07XG4gICAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYW5nZTtcbiAgICAgIHJhbmdlID0geDtcbiAgICAgIHJldHVybiByZXNjYWxlKCk7XG4gICAgfTtcbiAgICBzY2FsZS5xdWFudGlsZXMgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aHJlc2hvbGRzO1xuICAgIH07XG4gICAgc2NhbGUuaW52ZXJ0RXh0ZW50ID0gZnVuY3Rpb24oeSkge1xuICAgICAgeSA9IHJhbmdlLmluZGV4T2YoeSk7XG4gICAgICByZXR1cm4geSA8IDAgPyBbIE5hTiwgTmFOIF0gOiBbIHkgPiAwID8gdGhyZXNob2xkc1t5IC0gMV0gOiBkb21haW5bMF0sIHkgPCB0aHJlc2hvbGRzLmxlbmd0aCA/IHRocmVzaG9sZHNbeV0gOiBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdIF07XG4gICAgfTtcbiAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZDNfc2NhbGVfcXVhbnRpbGUoZG9tYWluLCByYW5nZSk7XG4gICAgfTtcbiAgICByZXR1cm4gcmVzY2FsZSgpO1xuICB9XG4gIGQzLnNjYWxlLnF1YW50aXplID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzX3NjYWxlX3F1YW50aXplKDAsIDEsIFsgMCwgMSBdKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc2NhbGVfcXVhbnRpemUoeDAsIHgxLCByYW5nZSkge1xuICAgIHZhciBreCwgaTtcbiAgICBmdW5jdGlvbiBzY2FsZSh4KSB7XG4gICAgICByZXR1cm4gcmFuZ2VbTWF0aC5tYXgoMCwgTWF0aC5taW4oaSwgTWF0aC5mbG9vcihreCAqICh4IC0geDApKSkpXTtcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVzY2FsZSgpIHtcbiAgICAgIGt4ID0gcmFuZ2UubGVuZ3RoIC8gKHgxIC0geDApO1xuICAgICAgaSA9IHJhbmdlLmxlbmd0aCAtIDE7XG4gICAgICByZXR1cm4gc2NhbGU7XG4gICAgfVxuICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFsgeDAsIHgxIF07XG4gICAgICB4MCA9ICt4WzBdO1xuICAgICAgeDEgPSAreFt4Lmxlbmd0aCAtIDFdO1xuICAgICAgcmV0dXJuIHJlc2NhbGUoKTtcbiAgICB9O1xuICAgIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcmFuZ2U7XG4gICAgICByYW5nZSA9IHg7XG4gICAgICByZXR1cm4gcmVzY2FsZSgpO1xuICAgIH07XG4gICAgc2NhbGUuaW52ZXJ0RXh0ZW50ID0gZnVuY3Rpb24oeSkge1xuICAgICAgeSA9IHJhbmdlLmluZGV4T2YoeSk7XG4gICAgICB5ID0geSA8IDAgPyBOYU4gOiB5IC8ga3ggKyB4MDtcbiAgICAgIHJldHVybiBbIHksIHkgKyAxIC8ga3ggXTtcbiAgICB9O1xuICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBkM19zY2FsZV9xdWFudGl6ZSh4MCwgeDEsIHJhbmdlKTtcbiAgICB9O1xuICAgIHJldHVybiByZXNjYWxlKCk7XG4gIH1cbiAgZDMuc2NhbGUudGhyZXNob2xkID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzX3NjYWxlX3RocmVzaG9sZChbIC41IF0sIFsgMCwgMSBdKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc2NhbGVfdGhyZXNob2xkKGRvbWFpbiwgcmFuZ2UpIHtcbiAgICBmdW5jdGlvbiBzY2FsZSh4KSB7XG4gICAgICBpZiAoeCA8PSB4KSByZXR1cm4gcmFuZ2VbZDMuYmlzZWN0KGRvbWFpbiwgeCldO1xuICAgIH1cbiAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW47XG4gICAgICBkb21haW4gPSBfO1xuICAgICAgcmV0dXJuIHNjYWxlO1xuICAgIH07XG4gICAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYW5nZTtcbiAgICAgIHJhbmdlID0gXztcbiAgICAgIHJldHVybiBzY2FsZTtcbiAgICB9O1xuICAgIHNjYWxlLmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHtcbiAgICAgIHkgPSByYW5nZS5pbmRleE9mKHkpO1xuICAgICAgcmV0dXJuIFsgZG9tYWluW3kgLSAxXSwgZG9tYWluW3ldIF07XG4gICAgfTtcbiAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZDNfc2NhbGVfdGhyZXNob2xkKGRvbWFpbiwgcmFuZ2UpO1xuICAgIH07XG4gICAgcmV0dXJuIHNjYWxlO1xuICB9XG4gIGQzLnNjYWxlLmlkZW50aXR5ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzX3NjYWxlX2lkZW50aXR5KFsgMCwgMSBdKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc2NhbGVfaWRlbnRpdHkoZG9tYWluKSB7XG4gICAgZnVuY3Rpb24gaWRlbnRpdHkoeCkge1xuICAgICAgcmV0dXJuICt4O1xuICAgIH1cbiAgICBpZGVudGl0eS5pbnZlcnQgPSBpZGVudGl0eTtcbiAgICBpZGVudGl0eS5kb21haW4gPSBpZGVudGl0eS5yYW5nZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbjtcbiAgICAgIGRvbWFpbiA9IHgubWFwKGlkZW50aXR5KTtcbiAgICAgIHJldHVybiBpZGVudGl0eTtcbiAgICB9O1xuICAgIGlkZW50aXR5LnRpY2tzID0gZnVuY3Rpb24obSkge1xuICAgICAgcmV0dXJuIGQzX3NjYWxlX2xpbmVhclRpY2tzKGRvbWFpbiwgbSk7XG4gICAgfTtcbiAgICBpZGVudGl0eS50aWNrRm9ybWF0ID0gZnVuY3Rpb24obSwgZm9ybWF0KSB7XG4gICAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyVGlja0Zvcm1hdChkb21haW4sIG0sIGZvcm1hdCk7XG4gICAgfTtcbiAgICBpZGVudGl0eS5jb3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZDNfc2NhbGVfaWRlbnRpdHkoZG9tYWluKTtcbiAgICB9O1xuICAgIHJldHVybiBpZGVudGl0eTtcbiAgfVxuICBkMy5zdmcgPSB7fTtcbiAgZnVuY3Rpb24gZDNfemVybygpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBkMy5zdmcuYXJjID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGlubmVyUmFkaXVzID0gZDNfc3ZnX2FyY0lubmVyUmFkaXVzLCBvdXRlclJhZGl1cyA9IGQzX3N2Z19hcmNPdXRlclJhZGl1cywgY29ybmVyUmFkaXVzID0gZDNfemVybywgcGFkUmFkaXVzID0gZDNfc3ZnX2FyY0F1dG8sIHN0YXJ0QW5nbGUgPSBkM19zdmdfYXJjU3RhcnRBbmdsZSwgZW5kQW5nbGUgPSBkM19zdmdfYXJjRW5kQW5nbGUsIHBhZEFuZ2xlID0gZDNfc3ZnX2FyY1BhZEFuZ2xlO1xuICAgIGZ1bmN0aW9uIGFyYygpIHtcbiAgICAgIHZhciByMCA9IE1hdGgubWF4KDAsICtpbm5lclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSwgcjEgPSBNYXRoLm1heCgwLCArb3V0ZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSksIGEwID0gc3RhcnRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIC0gaGFsZs+ALCBhMSA9IGVuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLSBoYWxmz4AsIGRhID0gTWF0aC5hYnMoYTEgLSBhMCksIGN3ID0gYTAgPiBhMSA/IDAgOiAxO1xuICAgICAgaWYgKHIxIDwgcjApIHJjID0gcjEsIHIxID0gcjAsIHIwID0gcmM7XG4gICAgICBpZiAoZGEgPj0gz4TOtSkgcmV0dXJuIGNpcmNsZVNlZ21lbnQocjEsIGN3KSArIChyMCA/IGNpcmNsZVNlZ21lbnQocjAsIDEgLSBjdykgOiBcIlwiKSArIFwiWlwiO1xuICAgICAgdmFyIHJjLCBjciwgcnAsIGFwLCBwMCA9IDAsIHAxID0gMCwgeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzLCBwYXRoID0gW107XG4gICAgICBpZiAoYXAgPSAoK3BhZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgMCkgLyAyKSB7XG4gICAgICAgIHJwID0gcGFkUmFkaXVzID09PSBkM19zdmdfYXJjQXV0byA/IE1hdGguc3FydChyMCAqIHIwICsgcjEgKiByMSkgOiArcGFkUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGlmICghY3cpIHAxICo9IC0xO1xuICAgICAgICBpZiAocjEpIHAxID0gZDNfYXNpbihycCAvIHIxICogTWF0aC5zaW4oYXApKTtcbiAgICAgICAgaWYgKHIwKSBwMCA9IGQzX2FzaW4ocnAgLyByMCAqIE1hdGguc2luKGFwKSk7XG4gICAgICB9XG4gICAgICBpZiAocjEpIHtcbiAgICAgICAgeDAgPSByMSAqIE1hdGguY29zKGEwICsgcDEpO1xuICAgICAgICB5MCA9IHIxICogTWF0aC5zaW4oYTAgKyBwMSk7XG4gICAgICAgIHgxID0gcjEgKiBNYXRoLmNvcyhhMSAtIHAxKTtcbiAgICAgICAgeTEgPSByMSAqIE1hdGguc2luKGExIC0gcDEpO1xuICAgICAgICB2YXIgbDEgPSBNYXRoLmFicyhhMSAtIGEwIC0gMiAqIHAxKSA8PSDPgCA/IDAgOiAxO1xuICAgICAgICBpZiAocDEgJiYgZDNfc3ZnX2FyY1N3ZWVwKHgwLCB5MCwgeDEsIHkxKSA9PT0gY3cgXiBsMSkge1xuICAgICAgICAgIHZhciBoMSA9IChhMCArIGExKSAvIDI7XG4gICAgICAgICAgeDAgPSByMSAqIE1hdGguY29zKGgxKTtcbiAgICAgICAgICB5MCA9IHIxICogTWF0aC5zaW4oaDEpO1xuICAgICAgICAgIHgxID0geTEgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4MCA9IHkwID0gMDtcbiAgICAgIH1cbiAgICAgIGlmIChyMCkge1xuICAgICAgICB4MiA9IHIwICogTWF0aC5jb3MoYTEgLSBwMCk7XG4gICAgICAgIHkyID0gcjAgKiBNYXRoLnNpbihhMSAtIHAwKTtcbiAgICAgICAgeDMgPSByMCAqIE1hdGguY29zKGEwICsgcDApO1xuICAgICAgICB5MyA9IHIwICogTWF0aC5zaW4oYTAgKyBwMCk7XG4gICAgICAgIHZhciBsMCA9IE1hdGguYWJzKGEwIC0gYTEgKyAyICogcDApIDw9IM+AID8gMCA6IDE7XG4gICAgICAgIGlmIChwMCAmJiBkM19zdmdfYXJjU3dlZXAoeDIsIHkyLCB4MywgeTMpID09PSAxIC0gY3cgXiBsMCkge1xuICAgICAgICAgIHZhciBoMCA9IChhMCArIGExKSAvIDI7XG4gICAgICAgICAgeDIgPSByMCAqIE1hdGguY29zKGgwKTtcbiAgICAgICAgICB5MiA9IHIwICogTWF0aC5zaW4oaDApO1xuICAgICAgICAgIHgzID0geTMgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4MiA9IHkyID0gMDtcbiAgICAgIH1cbiAgICAgIGlmIChkYSA+IM61ICYmIChyYyA9IE1hdGgubWluKE1hdGguYWJzKHIxIC0gcjApIC8gMiwgK2Nvcm5lclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSkgPiAuMDAxKSB7XG4gICAgICAgIGNyID0gcjAgPCByMSBeIGN3ID8gMCA6IDE7XG4gICAgICAgIHZhciByYzEgPSByYywgcmMwID0gcmM7XG4gICAgICAgIGlmIChkYSA8IM+AKSB7XG4gICAgICAgICAgdmFyIG9jID0geDMgPT0gbnVsbCA/IFsgeDIsIHkyIF0gOiB4MSA9PSBudWxsID8gWyB4MCwgeTAgXSA6IGQzX2dlb21fcG9seWdvbkludGVyc2VjdChbIHgwLCB5MCBdLCBbIHgzLCB5MyBdLCBbIHgxLCB5MSBdLCBbIHgyLCB5MiBdKSwgYXggPSB4MCAtIG9jWzBdLCBheSA9IHkwIC0gb2NbMV0sIGJ4ID0geDEgLSBvY1swXSwgYnkgPSB5MSAtIG9jWzFdLCBrYyA9IDEgLyBNYXRoLnNpbihNYXRoLmFjb3MoKGF4ICogYnggKyBheSAqIGJ5KSAvIChNYXRoLnNxcnQoYXggKiBheCArIGF5ICogYXkpICogTWF0aC5zcXJ0KGJ4ICogYnggKyBieSAqIGJ5KSkpIC8gMiksIGxjID0gTWF0aC5zcXJ0KG9jWzBdICogb2NbMF0gKyBvY1sxXSAqIG9jWzFdKTtcbiAgICAgICAgICByYzAgPSBNYXRoLm1pbihyYywgKHIwIC0gbGMpIC8gKGtjIC0gMSkpO1xuICAgICAgICAgIHJjMSA9IE1hdGgubWluKHJjLCAocjEgLSBsYykgLyAoa2MgKyAxKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHgxICE9IG51bGwpIHtcbiAgICAgICAgICB2YXIgdDMwID0gZDNfc3ZnX2FyY0Nvcm5lclRhbmdlbnRzKHgzID09IG51bGwgPyBbIHgyLCB5MiBdIDogWyB4MywgeTMgXSwgWyB4MCwgeTAgXSwgcjEsIHJjMSwgY3cpLCB0MTIgPSBkM19zdmdfYXJjQ29ybmVyVGFuZ2VudHMoWyB4MSwgeTEgXSwgWyB4MiwgeTIgXSwgcjEsIHJjMSwgY3cpO1xuICAgICAgICAgIGlmIChyYyA9PT0gcmMxKSB7XG4gICAgICAgICAgICBwYXRoLnB1c2goXCJNXCIsIHQzMFswXSwgXCJBXCIsIHJjMSwgXCIsXCIsIHJjMSwgXCIgMCAwLFwiLCBjciwgXCIgXCIsIHQzMFsxXSwgXCJBXCIsIHIxLCBcIixcIiwgcjEsIFwiIDAgXCIsIDEgLSBjdyBeIGQzX3N2Z19hcmNTd2VlcCh0MzBbMV1bMF0sIHQzMFsxXVsxXSwgdDEyWzFdWzBdLCB0MTJbMV1bMV0pLCBcIixcIiwgY3csIFwiIFwiLCB0MTJbMV0sIFwiQVwiLCByYzEsIFwiLFwiLCByYzEsIFwiIDAgMCxcIiwgY3IsIFwiIFwiLCB0MTJbMF0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXRoLnB1c2goXCJNXCIsIHQzMFswXSwgXCJBXCIsIHJjMSwgXCIsXCIsIHJjMSwgXCIgMCAxLFwiLCBjciwgXCIgXCIsIHQxMlswXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhdGgucHVzaChcIk1cIiwgeDAsIFwiLFwiLCB5MCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHgzICE9IG51bGwpIHtcbiAgICAgICAgICB2YXIgdDAzID0gZDNfc3ZnX2FyY0Nvcm5lclRhbmdlbnRzKFsgeDAsIHkwIF0sIFsgeDMsIHkzIF0sIHIwLCAtcmMwLCBjdyksIHQyMSA9IGQzX3N2Z19hcmNDb3JuZXJUYW5nZW50cyhbIHgyLCB5MiBdLCB4MSA9PSBudWxsID8gWyB4MCwgeTAgXSA6IFsgeDEsIHkxIF0sIHIwLCAtcmMwLCBjdyk7XG4gICAgICAgICAgaWYgKHJjID09PSByYzApIHtcbiAgICAgICAgICAgIHBhdGgucHVzaChcIkxcIiwgdDIxWzBdLCBcIkFcIiwgcmMwLCBcIixcIiwgcmMwLCBcIiAwIDAsXCIsIGNyLCBcIiBcIiwgdDIxWzFdLCBcIkFcIiwgcjAsIFwiLFwiLCByMCwgXCIgMCBcIiwgY3cgXiBkM19zdmdfYXJjU3dlZXAodDIxWzFdWzBdLCB0MjFbMV1bMV0sIHQwM1sxXVswXSwgdDAzWzFdWzFdKSwgXCIsXCIsIDEgLSBjdywgXCIgXCIsIHQwM1sxXSwgXCJBXCIsIHJjMCwgXCIsXCIsIHJjMCwgXCIgMCAwLFwiLCBjciwgXCIgXCIsIHQwM1swXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhdGgucHVzaChcIkxcIiwgdDIxWzBdLCBcIkFcIiwgcmMwLCBcIixcIiwgcmMwLCBcIiAwIDAsXCIsIGNyLCBcIiBcIiwgdDAzWzBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGF0aC5wdXNoKFwiTFwiLCB4MiwgXCIsXCIsIHkyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF0aC5wdXNoKFwiTVwiLCB4MCwgXCIsXCIsIHkwKTtcbiAgICAgICAgaWYgKHgxICE9IG51bGwpIHBhdGgucHVzaChcIkFcIiwgcjEsIFwiLFwiLCByMSwgXCIgMCBcIiwgbDEsIFwiLFwiLCBjdywgXCIgXCIsIHgxLCBcIixcIiwgeTEpO1xuICAgICAgICBwYXRoLnB1c2goXCJMXCIsIHgyLCBcIixcIiwgeTIpO1xuICAgICAgICBpZiAoeDMgIT0gbnVsbCkgcGF0aC5wdXNoKFwiQVwiLCByMCwgXCIsXCIsIHIwLCBcIiAwIFwiLCBsMCwgXCIsXCIsIDEgLSBjdywgXCIgXCIsIHgzLCBcIixcIiwgeTMpO1xuICAgICAgfVxuICAgICAgcGF0aC5wdXNoKFwiWlwiKTtcbiAgICAgIHJldHVybiBwYXRoLmpvaW4oXCJcIik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNpcmNsZVNlZ21lbnQocjEsIGN3KSB7XG4gICAgICByZXR1cm4gXCJNMCxcIiArIHIxICsgXCJBXCIgKyByMSArIFwiLFwiICsgcjEgKyBcIiAwIDEsXCIgKyBjdyArIFwiIDAsXCIgKyAtcjEgKyBcIkFcIiArIHIxICsgXCIsXCIgKyByMSArIFwiIDAgMSxcIiArIGN3ICsgXCIgMCxcIiArIHIxO1xuICAgIH1cbiAgICBhcmMuaW5uZXJSYWRpdXMgPSBmdW5jdGlvbih2KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBpbm5lclJhZGl1cztcbiAgICAgIGlubmVyUmFkaXVzID0gZDNfZnVuY3Rvcih2KTtcbiAgICAgIHJldHVybiBhcmM7XG4gICAgfTtcbiAgICBhcmMub3V0ZXJSYWRpdXMgPSBmdW5jdGlvbih2KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvdXRlclJhZGl1cztcbiAgICAgIG91dGVyUmFkaXVzID0gZDNfZnVuY3Rvcih2KTtcbiAgICAgIHJldHVybiBhcmM7XG4gICAgfTtcbiAgICBhcmMuY29ybmVyUmFkaXVzID0gZnVuY3Rpb24odikge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY29ybmVyUmFkaXVzO1xuICAgICAgY29ybmVyUmFkaXVzID0gZDNfZnVuY3Rvcih2KTtcbiAgICAgIHJldHVybiBhcmM7XG4gICAgfTtcbiAgICBhcmMucGFkUmFkaXVzID0gZnVuY3Rpb24odikge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcGFkUmFkaXVzO1xuICAgICAgcGFkUmFkaXVzID0gdiA9PSBkM19zdmdfYXJjQXV0byA/IGQzX3N2Z19hcmNBdXRvIDogZDNfZnVuY3Rvcih2KTtcbiAgICAgIHJldHVybiBhcmM7XG4gICAgfTtcbiAgICBhcmMuc3RhcnRBbmdsZSA9IGZ1bmN0aW9uKHYpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHN0YXJ0QW5nbGU7XG4gICAgICBzdGFydEFuZ2xlID0gZDNfZnVuY3Rvcih2KTtcbiAgICAgIHJldHVybiBhcmM7XG4gICAgfTtcbiAgICBhcmMuZW5kQW5nbGUgPSBmdW5jdGlvbih2KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBlbmRBbmdsZTtcbiAgICAgIGVuZEFuZ2xlID0gZDNfZnVuY3Rvcih2KTtcbiAgICAgIHJldHVybiBhcmM7XG4gICAgfTtcbiAgICBhcmMucGFkQW5nbGUgPSBmdW5jdGlvbih2KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwYWRBbmdsZTtcbiAgICAgIHBhZEFuZ2xlID0gZDNfZnVuY3Rvcih2KTtcbiAgICAgIHJldHVybiBhcmM7XG4gICAgfTtcbiAgICBhcmMuY2VudHJvaWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciByID0gKCtpbm5lclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgK291dGVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIC8gMiwgYSA9ICgrc3RhcnRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpICsgK2VuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIC8gMiAtIGhhbGbPgDtcbiAgICAgIHJldHVybiBbIE1hdGguY29zKGEpICogciwgTWF0aC5zaW4oYSkgKiByIF07XG4gICAgfTtcbiAgICByZXR1cm4gYXJjO1xuICB9O1xuICB2YXIgZDNfc3ZnX2FyY0F1dG8gPSBcImF1dG9cIjtcbiAgZnVuY3Rpb24gZDNfc3ZnX2FyY0lubmVyUmFkaXVzKGQpIHtcbiAgICByZXR1cm4gZC5pbm5lclJhZGl1cztcbiAgfVxuICBmdW5jdGlvbiBkM19zdmdfYXJjT3V0ZXJSYWRpdXMoZCkge1xuICAgIHJldHVybiBkLm91dGVyUmFkaXVzO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19hcmNTdGFydEFuZ2xlKGQpIHtcbiAgICByZXR1cm4gZC5zdGFydEFuZ2xlO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19hcmNFbmRBbmdsZShkKSB7XG4gICAgcmV0dXJuIGQuZW5kQW5nbGU7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc3ZnX2FyY1BhZEFuZ2xlKGQpIHtcbiAgICByZXR1cm4gZCAmJiBkLnBhZEFuZ2xlO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19hcmNTd2VlcCh4MCwgeTAsIHgxLCB5MSkge1xuICAgIHJldHVybiAoeDAgLSB4MSkgKiB5MCAtICh5MCAtIHkxKSAqIHgwID4gMCA/IDAgOiAxO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19hcmNDb3JuZXJUYW5nZW50cyhwMCwgcDEsIHIxLCByYywgY3cpIHtcbiAgICB2YXIgeDAxID0gcDBbMF0gLSBwMVswXSwgeTAxID0gcDBbMV0gLSBwMVsxXSwgbG8gPSAoY3cgPyByYyA6IC1yYykgLyBNYXRoLnNxcnQoeDAxICogeDAxICsgeTAxICogeTAxKSwgb3ggPSBsbyAqIHkwMSwgb3kgPSAtbG8gKiB4MDEsIHgxID0gcDBbMF0gKyBveCwgeTEgPSBwMFsxXSArIG95LCB4MiA9IHAxWzBdICsgb3gsIHkyID0gcDFbMV0gKyBveSwgeDMgPSAoeDEgKyB4MikgLyAyLCB5MyA9ICh5MSArIHkyKSAvIDIsIGR4ID0geDIgLSB4MSwgZHkgPSB5MiAtIHkxLCBkMiA9IGR4ICogZHggKyBkeSAqIGR5LCByID0gcjEgLSByYywgRCA9IHgxICogeTIgLSB4MiAqIHkxLCBkID0gKGR5IDwgMCA/IC0xIDogMSkgKiBNYXRoLnNxcnQoTWF0aC5tYXgoMCwgciAqIHIgKiBkMiAtIEQgKiBEKSksIGN4MCA9IChEICogZHkgLSBkeCAqIGQpIC8gZDIsIGN5MCA9ICgtRCAqIGR4IC0gZHkgKiBkKSAvIGQyLCBjeDEgPSAoRCAqIGR5ICsgZHggKiBkKSAvIGQyLCBjeTEgPSAoLUQgKiBkeCArIGR5ICogZCkgLyBkMiwgZHgwID0gY3gwIC0geDMsIGR5MCA9IGN5MCAtIHkzLCBkeDEgPSBjeDEgLSB4MywgZHkxID0gY3kxIC0geTM7XG4gICAgaWYgKGR4MCAqIGR4MCArIGR5MCAqIGR5MCA+IGR4MSAqIGR4MSArIGR5MSAqIGR5MSkgY3gwID0gY3gxLCBjeTAgPSBjeTE7XG4gICAgcmV0dXJuIFsgWyBjeDAgLSBveCwgY3kwIC0gb3kgXSwgWyBjeDAgKiByMSAvIHIsIGN5MCAqIHIxIC8gciBdIF07XG4gIH1cbiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmUocHJvamVjdGlvbikge1xuICAgIHZhciB4ID0gZDNfZ2VvbV9wb2ludFgsIHkgPSBkM19nZW9tX3BvaW50WSwgZGVmaW5lZCA9IGQzX3RydWUsIGludGVycG9sYXRlID0gZDNfc3ZnX2xpbmVMaW5lYXIsIGludGVycG9sYXRlS2V5ID0gaW50ZXJwb2xhdGUua2V5LCB0ZW5zaW9uID0gLjc7XG4gICAgZnVuY3Rpb24gbGluZShkYXRhKSB7XG4gICAgICB2YXIgc2VnbWVudHMgPSBbXSwgcG9pbnRzID0gW10sIGkgPSAtMSwgbiA9IGRhdGEubGVuZ3RoLCBkLCBmeCA9IGQzX2Z1bmN0b3IoeCksIGZ5ID0gZDNfZnVuY3Rvcih5KTtcbiAgICAgIGZ1bmN0aW9uIHNlZ21lbnQoKSB7XG4gICAgICAgIHNlZ21lbnRzLnB1c2goXCJNXCIsIGludGVycG9sYXRlKHByb2plY3Rpb24ocG9pbnRzKSwgdGVuc2lvbikpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgaWYgKGRlZmluZWQuY2FsbCh0aGlzLCBkID0gZGF0YVtpXSwgaSkpIHtcbiAgICAgICAgICBwb2ludHMucHVzaChbICtmeC5jYWxsKHRoaXMsIGQsIGkpLCArZnkuY2FsbCh0aGlzLCBkLCBpKSBdKTtcbiAgICAgICAgfSBlbHNlIGlmIChwb2ludHMubGVuZ3RoKSB7XG4gICAgICAgICAgc2VnbWVudCgpO1xuICAgICAgICAgIHBvaW50cyA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocG9pbnRzLmxlbmd0aCkgc2VnbWVudCgpO1xuICAgICAgcmV0dXJuIHNlZ21lbnRzLmxlbmd0aCA/IHNlZ21lbnRzLmpvaW4oXCJcIikgOiBudWxsO1xuICAgIH1cbiAgICBsaW5lLnggPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4O1xuICAgICAgeCA9IF87XG4gICAgICByZXR1cm4gbGluZTtcbiAgICB9O1xuICAgIGxpbmUueSA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHk7XG4gICAgICB5ID0gXztcbiAgICAgIHJldHVybiBsaW5lO1xuICAgIH07XG4gICAgbGluZS5kZWZpbmVkID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZGVmaW5lZDtcbiAgICAgIGRlZmluZWQgPSBfO1xuICAgICAgcmV0dXJuIGxpbmU7XG4gICAgfTtcbiAgICBsaW5lLmludGVycG9sYXRlID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gaW50ZXJwb2xhdGVLZXk7XG4gICAgICBpZiAodHlwZW9mIF8gPT09IFwiZnVuY3Rpb25cIikgaW50ZXJwb2xhdGVLZXkgPSBpbnRlcnBvbGF0ZSA9IF87IGVsc2UgaW50ZXJwb2xhdGVLZXkgPSAoaW50ZXJwb2xhdGUgPSBkM19zdmdfbGluZUludGVycG9sYXRvcnMuZ2V0KF8pIHx8IGQzX3N2Z19saW5lTGluZWFyKS5rZXk7XG4gICAgICByZXR1cm4gbGluZTtcbiAgICB9O1xuICAgIGxpbmUudGVuc2lvbiA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRlbnNpb247XG4gICAgICB0ZW5zaW9uID0gXztcbiAgICAgIHJldHVybiBsaW5lO1xuICAgIH07XG4gICAgcmV0dXJuIGxpbmU7XG4gIH1cbiAgZDMuc3ZnLmxpbmUgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDNfc3ZnX2xpbmUoZDNfaWRlbnRpdHkpO1xuICB9O1xuICB2YXIgZDNfc3ZnX2xpbmVJbnRlcnBvbGF0b3JzID0gZDMubWFwKHtcbiAgICBsaW5lYXI6IGQzX3N2Z19saW5lTGluZWFyLFxuICAgIFwibGluZWFyLWNsb3NlZFwiOiBkM19zdmdfbGluZUxpbmVhckNsb3NlZCxcbiAgICBzdGVwOiBkM19zdmdfbGluZVN0ZXAsXG4gICAgXCJzdGVwLWJlZm9yZVwiOiBkM19zdmdfbGluZVN0ZXBCZWZvcmUsXG4gICAgXCJzdGVwLWFmdGVyXCI6IGQzX3N2Z19saW5lU3RlcEFmdGVyLFxuICAgIGJhc2lzOiBkM19zdmdfbGluZUJhc2lzLFxuICAgIFwiYmFzaXMtb3BlblwiOiBkM19zdmdfbGluZUJhc2lzT3BlbixcbiAgICBcImJhc2lzLWNsb3NlZFwiOiBkM19zdmdfbGluZUJhc2lzQ2xvc2VkLFxuICAgIGJ1bmRsZTogZDNfc3ZnX2xpbmVCdW5kbGUsXG4gICAgY2FyZGluYWw6IGQzX3N2Z19saW5lQ2FyZGluYWwsXG4gICAgXCJjYXJkaW5hbC1vcGVuXCI6IGQzX3N2Z19saW5lQ2FyZGluYWxPcGVuLFxuICAgIFwiY2FyZGluYWwtY2xvc2VkXCI6IGQzX3N2Z19saW5lQ2FyZGluYWxDbG9zZWQsXG4gICAgbW9ub3RvbmU6IGQzX3N2Z19saW5lTW9ub3RvbmVcbiAgfSk7XG4gIGQzX3N2Z19saW5lSW50ZXJwb2xhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICB2YWx1ZS5rZXkgPSBrZXk7XG4gICAgdmFsdWUuY2xvc2VkID0gLy1jbG9zZWQkLy50ZXN0KGtleSk7XG4gIH0pO1xuICBmdW5jdGlvbiBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpIHtcbiAgICByZXR1cm4gcG9pbnRzLmxlbmd0aCA+IDEgPyBwb2ludHMuam9pbihcIkxcIikgOiBwb2ludHMgKyBcIlpcIjtcbiAgfVxuICBmdW5jdGlvbiBkM19zdmdfbGluZUxpbmVhckNsb3NlZChwb2ludHMpIHtcbiAgICByZXR1cm4gcG9pbnRzLmpvaW4oXCJMXCIpICsgXCJaXCI7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVTdGVwKHBvaW50cykge1xuICAgIHZhciBpID0gMCwgbiA9IHBvaW50cy5sZW5ndGgsIHAgPSBwb2ludHNbMF0sIHBhdGggPSBbIHBbMF0sIFwiLFwiLCBwWzFdIF07XG4gICAgd2hpbGUgKCsraSA8IG4pIHBhdGgucHVzaChcIkhcIiwgKHBbMF0gKyAocCA9IHBvaW50c1tpXSlbMF0pIC8gMiwgXCJWXCIsIHBbMV0pO1xuICAgIGlmIChuID4gMSkgcGF0aC5wdXNoKFwiSFwiLCBwWzBdKTtcbiAgICByZXR1cm4gcGF0aC5qb2luKFwiXCIpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lU3RlcEJlZm9yZShwb2ludHMpIHtcbiAgICB2YXIgaSA9IDAsIG4gPSBwb2ludHMubGVuZ3RoLCBwID0gcG9pbnRzWzBdLCBwYXRoID0gWyBwWzBdLCBcIixcIiwgcFsxXSBdO1xuICAgIHdoaWxlICgrK2kgPCBuKSBwYXRoLnB1c2goXCJWXCIsIChwID0gcG9pbnRzW2ldKVsxXSwgXCJIXCIsIHBbMF0pO1xuICAgIHJldHVybiBwYXRoLmpvaW4oXCJcIik7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVTdGVwQWZ0ZXIocG9pbnRzKSB7XG4gICAgdmFyIGkgPSAwLCBuID0gcG9pbnRzLmxlbmd0aCwgcCA9IHBvaW50c1swXSwgcGF0aCA9IFsgcFswXSwgXCIsXCIsIHBbMV0gXTtcbiAgICB3aGlsZSAoKytpIDwgbikgcGF0aC5wdXNoKFwiSFwiLCAocCA9IHBvaW50c1tpXSlbMF0sIFwiVlwiLCBwWzFdKTtcbiAgICByZXR1cm4gcGF0aC5qb2luKFwiXCIpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lQ2FyZGluYWxPcGVuKHBvaW50cywgdGVuc2lvbikge1xuICAgIHJldHVybiBwb2ludHMubGVuZ3RoIDwgNCA/IGQzX3N2Z19saW5lTGluZWFyKHBvaW50cykgOiBwb2ludHNbMV0gKyBkM19zdmdfbGluZUhlcm1pdGUocG9pbnRzLnNsaWNlKDEsIC0xKSwgZDNfc3ZnX2xpbmVDYXJkaW5hbFRhbmdlbnRzKHBvaW50cywgdGVuc2lvbikpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lQ2FyZGluYWxDbG9zZWQocG9pbnRzLCB0ZW5zaW9uKSB7XG4gICAgcmV0dXJuIHBvaW50cy5sZW5ndGggPCAzID8gZDNfc3ZnX2xpbmVMaW5lYXJDbG9zZWQocG9pbnRzKSA6IHBvaW50c1swXSArIGQzX3N2Z19saW5lSGVybWl0ZSgocG9pbnRzLnB1c2gocG9pbnRzWzBdKSwgXG4gICAgcG9pbnRzKSwgZDNfc3ZnX2xpbmVDYXJkaW5hbFRhbmdlbnRzKFsgcG9pbnRzW3BvaW50cy5sZW5ndGggLSAyXSBdLmNvbmNhdChwb2ludHMsIFsgcG9pbnRzWzFdIF0pLCB0ZW5zaW9uKSk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVDYXJkaW5hbChwb2ludHMsIHRlbnNpb24pIHtcbiAgICByZXR1cm4gcG9pbnRzLmxlbmd0aCA8IDMgPyBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpIDogcG9pbnRzWzBdICsgZDNfc3ZnX2xpbmVIZXJtaXRlKHBvaW50cywgZDNfc3ZnX2xpbmVDYXJkaW5hbFRhbmdlbnRzKHBvaW50cywgdGVuc2lvbikpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lSGVybWl0ZShwb2ludHMsIHRhbmdlbnRzKSB7XG4gICAgaWYgKHRhbmdlbnRzLmxlbmd0aCA8IDEgfHwgcG9pbnRzLmxlbmd0aCAhPSB0YW5nZW50cy5sZW5ndGggJiYgcG9pbnRzLmxlbmd0aCAhPSB0YW5nZW50cy5sZW5ndGggKyAyKSB7XG4gICAgICByZXR1cm4gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKTtcbiAgICB9XG4gICAgdmFyIHF1YWQgPSBwb2ludHMubGVuZ3RoICE9IHRhbmdlbnRzLmxlbmd0aCwgcGF0aCA9IFwiXCIsIHAwID0gcG9pbnRzWzBdLCBwID0gcG9pbnRzWzFdLCB0MCA9IHRhbmdlbnRzWzBdLCB0ID0gdDAsIHBpID0gMTtcbiAgICBpZiAocXVhZCkge1xuICAgICAgcGF0aCArPSBcIlFcIiArIChwWzBdIC0gdDBbMF0gKiAyIC8gMykgKyBcIixcIiArIChwWzFdIC0gdDBbMV0gKiAyIC8gMykgKyBcIixcIiArIHBbMF0gKyBcIixcIiArIHBbMV07XG4gICAgICBwMCA9IHBvaW50c1sxXTtcbiAgICAgIHBpID0gMjtcbiAgICB9XG4gICAgaWYgKHRhbmdlbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHQgPSB0YW5nZW50c1sxXTtcbiAgICAgIHAgPSBwb2ludHNbcGldO1xuICAgICAgcGkrKztcbiAgICAgIHBhdGggKz0gXCJDXCIgKyAocDBbMF0gKyB0MFswXSkgKyBcIixcIiArIChwMFsxXSArIHQwWzFdKSArIFwiLFwiICsgKHBbMF0gLSB0WzBdKSArIFwiLFwiICsgKHBbMV0gLSB0WzFdKSArIFwiLFwiICsgcFswXSArIFwiLFwiICsgcFsxXTtcbiAgICAgIGZvciAodmFyIGkgPSAyOyBpIDwgdGFuZ2VudHMubGVuZ3RoOyBpKyssIHBpKyspIHtcbiAgICAgICAgcCA9IHBvaW50c1twaV07XG4gICAgICAgIHQgPSB0YW5nZW50c1tpXTtcbiAgICAgICAgcGF0aCArPSBcIlNcIiArIChwWzBdIC0gdFswXSkgKyBcIixcIiArIChwWzFdIC0gdFsxXSkgKyBcIixcIiArIHBbMF0gKyBcIixcIiArIHBbMV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChxdWFkKSB7XG4gICAgICB2YXIgbHAgPSBwb2ludHNbcGldO1xuICAgICAgcGF0aCArPSBcIlFcIiArIChwWzBdICsgdFswXSAqIDIgLyAzKSArIFwiLFwiICsgKHBbMV0gKyB0WzFdICogMiAvIDMpICsgXCIsXCIgKyBscFswXSArIFwiLFwiICsgbHBbMV07XG4gICAgfVxuICAgIHJldHVybiBwYXRoO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lQ2FyZGluYWxUYW5nZW50cyhwb2ludHMsIHRlbnNpb24pIHtcbiAgICB2YXIgdGFuZ2VudHMgPSBbXSwgYSA9ICgxIC0gdGVuc2lvbikgLyAyLCBwMCwgcDEgPSBwb2ludHNbMF0sIHAyID0gcG9pbnRzWzFdLCBpID0gMSwgbiA9IHBvaW50cy5sZW5ndGg7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIHAwID0gcDE7XG4gICAgICBwMSA9IHAyO1xuICAgICAgcDIgPSBwb2ludHNbaV07XG4gICAgICB0YW5nZW50cy5wdXNoKFsgYSAqIChwMlswXSAtIHAwWzBdKSwgYSAqIChwMlsxXSAtIHAwWzFdKSBdKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhbmdlbnRzO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lQmFzaXMocG9pbnRzKSB7XG4gICAgaWYgKHBvaW50cy5sZW5ndGggPCAzKSByZXR1cm4gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKTtcbiAgICB2YXIgaSA9IDEsIG4gPSBwb2ludHMubGVuZ3RoLCBwaSA9IHBvaW50c1swXSwgeDAgPSBwaVswXSwgeTAgPSBwaVsxXSwgcHggPSBbIHgwLCB4MCwgeDAsIChwaSA9IHBvaW50c1sxXSlbMF0gXSwgcHkgPSBbIHkwLCB5MCwgeTAsIHBpWzFdIF0sIHBhdGggPSBbIHgwLCBcIixcIiwgeTAsIFwiTFwiLCBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMsIHB4KSwgXCIsXCIsIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMywgcHkpIF07XG4gICAgcG9pbnRzLnB1c2gocG9pbnRzW24gLSAxXSk7XG4gICAgd2hpbGUgKCsraSA8PSBuKSB7XG4gICAgICBwaSA9IHBvaW50c1tpXTtcbiAgICAgIHB4LnNoaWZ0KCk7XG4gICAgICBweC5wdXNoKHBpWzBdKTtcbiAgICAgIHB5LnNoaWZ0KCk7XG4gICAgICBweS5wdXNoKHBpWzFdKTtcbiAgICAgIGQzX3N2Z19saW5lQmFzaXNCZXppZXIocGF0aCwgcHgsIHB5KTtcbiAgICB9XG4gICAgcG9pbnRzLnBvcCgpO1xuICAgIHBhdGgucHVzaChcIkxcIiwgcGkpO1xuICAgIHJldHVybiBwYXRoLmpvaW4oXCJcIik7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVCYXNpc09wZW4ocG9pbnRzKSB7XG4gICAgaWYgKHBvaW50cy5sZW5ndGggPCA0KSByZXR1cm4gZDNfc3ZnX2xpbmVMaW5lYXIocG9pbnRzKTtcbiAgICB2YXIgcGF0aCA9IFtdLCBpID0gLTEsIG4gPSBwb2ludHMubGVuZ3RoLCBwaSwgcHggPSBbIDAgXSwgcHkgPSBbIDAgXTtcbiAgICB3aGlsZSAoKytpIDwgMykge1xuICAgICAgcGkgPSBwb2ludHNbaV07XG4gICAgICBweC5wdXNoKHBpWzBdKTtcbiAgICAgIHB5LnB1c2gocGlbMV0pO1xuICAgIH1cbiAgICBwYXRoLnB1c2goZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCBweCkgKyBcIixcIiArIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMywgcHkpKTtcbiAgICAtLWk7XG4gICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgIHBpID0gcG9pbnRzW2ldO1xuICAgICAgcHguc2hpZnQoKTtcbiAgICAgIHB4LnB1c2gocGlbMF0pO1xuICAgICAgcHkuc2hpZnQoKTtcbiAgICAgIHB5LnB1c2gocGlbMV0pO1xuICAgICAgZDNfc3ZnX2xpbmVCYXNpc0JlemllcihwYXRoLCBweCwgcHkpO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aC5qb2luKFwiXCIpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lQmFzaXNDbG9zZWQocG9pbnRzKSB7XG4gICAgdmFyIHBhdGgsIGkgPSAtMSwgbiA9IHBvaW50cy5sZW5ndGgsIG0gPSBuICsgNCwgcGksIHB4ID0gW10sIHB5ID0gW107XG4gICAgd2hpbGUgKCsraSA8IDQpIHtcbiAgICAgIHBpID0gcG9pbnRzW2kgJSBuXTtcbiAgICAgIHB4LnB1c2gocGlbMF0pO1xuICAgICAgcHkucHVzaChwaVsxXSk7XG4gICAgfVxuICAgIHBhdGggPSBbIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMywgcHgpLCBcIixcIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCBweSkgXTtcbiAgICAtLWk7XG4gICAgd2hpbGUgKCsraSA8IG0pIHtcbiAgICAgIHBpID0gcG9pbnRzW2kgJSBuXTtcbiAgICAgIHB4LnNoaWZ0KCk7XG4gICAgICBweC5wdXNoKHBpWzBdKTtcbiAgICAgIHB5LnNoaWZ0KCk7XG4gICAgICBweS5wdXNoKHBpWzFdKTtcbiAgICAgIGQzX3N2Z19saW5lQmFzaXNCZXppZXIocGF0aCwgcHgsIHB5KTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguam9pbihcIlwiKTtcbiAgfVxuICBmdW5jdGlvbiBkM19zdmdfbGluZUJ1bmRsZShwb2ludHMsIHRlbnNpb24pIHtcbiAgICB2YXIgbiA9IHBvaW50cy5sZW5ndGggLSAxO1xuICAgIGlmIChuKSB7XG4gICAgICB2YXIgeDAgPSBwb2ludHNbMF1bMF0sIHkwID0gcG9pbnRzWzBdWzFdLCBkeCA9IHBvaW50c1tuXVswXSAtIHgwLCBkeSA9IHBvaW50c1tuXVsxXSAtIHkwLCBpID0gLTEsIHAsIHQ7XG4gICAgICB3aGlsZSAoKytpIDw9IG4pIHtcbiAgICAgICAgcCA9IHBvaW50c1tpXTtcbiAgICAgICAgdCA9IGkgLyBuO1xuICAgICAgICBwWzBdID0gdGVuc2lvbiAqIHBbMF0gKyAoMSAtIHRlbnNpb24pICogKHgwICsgdCAqIGR4KTtcbiAgICAgICAgcFsxXSA9IHRlbnNpb24gKiBwWzFdICsgKDEgLSB0ZW5zaW9uKSAqICh5MCArIHQgKiBkeSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkM19zdmdfbGluZUJhc2lzKHBvaW50cyk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVEb3Q0KGEsIGIpIHtcbiAgICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdICsgYVszXSAqIGJbM107XG4gIH1cbiAgdmFyIGQzX3N2Z19saW5lQmFzaXNCZXppZXIxID0gWyAwLCAyIC8gMywgMSAvIDMsIDAgXSwgZDNfc3ZnX2xpbmVCYXNpc0JlemllcjIgPSBbIDAsIDEgLyAzLCAyIC8gMywgMCBdLCBkM19zdmdfbGluZUJhc2lzQmV6aWVyMyA9IFsgMCwgMSAvIDYsIDIgLyAzLCAxIC8gNiBdO1xuICBmdW5jdGlvbiBkM19zdmdfbGluZUJhc2lzQmV6aWVyKHBhdGgsIHgsIHkpIHtcbiAgICBwYXRoLnB1c2goXCJDXCIsIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMSwgeCksIFwiLFwiLCBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjEsIHkpLCBcIixcIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIyLCB4KSwgXCIsXCIsIGQzX3N2Z19saW5lRG90NChkM19zdmdfbGluZUJhc2lzQmV6aWVyMiwgeSksIFwiLFwiLCBkM19zdmdfbGluZURvdDQoZDNfc3ZnX2xpbmVCYXNpc0JlemllcjMsIHgpLCBcIixcIiwgZDNfc3ZnX2xpbmVEb3Q0KGQzX3N2Z19saW5lQmFzaXNCZXppZXIzLCB5KSk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVTbG9wZShwMCwgcDEpIHtcbiAgICByZXR1cm4gKHAxWzFdIC0gcDBbMV0pIC8gKHAxWzBdIC0gcDBbMF0pO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lRmluaXRlRGlmZmVyZW5jZXMocG9pbnRzKSB7XG4gICAgdmFyIGkgPSAwLCBqID0gcG9pbnRzLmxlbmd0aCAtIDEsIG0gPSBbXSwgcDAgPSBwb2ludHNbMF0sIHAxID0gcG9pbnRzWzFdLCBkID0gbVswXSA9IGQzX3N2Z19saW5lU2xvcGUocDAsIHAxKTtcbiAgICB3aGlsZSAoKytpIDwgaikge1xuICAgICAgbVtpXSA9IChkICsgKGQgPSBkM19zdmdfbGluZVNsb3BlKHAwID0gcDEsIHAxID0gcG9pbnRzW2kgKyAxXSkpKSAvIDI7XG4gICAgfVxuICAgIG1baV0gPSBkO1xuICAgIHJldHVybiBtO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lTW9ub3RvbmVUYW5nZW50cyhwb2ludHMpIHtcbiAgICB2YXIgdGFuZ2VudHMgPSBbXSwgZCwgYSwgYiwgcywgbSA9IGQzX3N2Z19saW5lRmluaXRlRGlmZmVyZW5jZXMocG9pbnRzKSwgaSA9IC0xLCBqID0gcG9pbnRzLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKCsraSA8IGopIHtcbiAgICAgIGQgPSBkM19zdmdfbGluZVNsb3BlKHBvaW50c1tpXSwgcG9pbnRzW2kgKyAxXSk7XG4gICAgICBpZiAoYWJzKGQpIDwgzrUpIHtcbiAgICAgICAgbVtpXSA9IG1baSArIDFdID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGEgPSBtW2ldIC8gZDtcbiAgICAgICAgYiA9IG1baSArIDFdIC8gZDtcbiAgICAgICAgcyA9IGEgKiBhICsgYiAqIGI7XG4gICAgICAgIGlmIChzID4gOSkge1xuICAgICAgICAgIHMgPSBkICogMyAvIE1hdGguc3FydChzKTtcbiAgICAgICAgICBtW2ldID0gcyAqIGE7XG4gICAgICAgICAgbVtpICsgMV0gPSBzICogYjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpID0gLTE7XG4gICAgd2hpbGUgKCsraSA8PSBqKSB7XG4gICAgICBzID0gKHBvaW50c1tNYXRoLm1pbihqLCBpICsgMSldWzBdIC0gcG9pbnRzW01hdGgubWF4KDAsIGkgLSAxKV1bMF0pIC8gKDYgKiAoMSArIG1baV0gKiBtW2ldKSk7XG4gICAgICB0YW5nZW50cy5wdXNoKFsgcyB8fCAwLCBtW2ldICogcyB8fCAwIF0pO1xuICAgIH1cbiAgICByZXR1cm4gdGFuZ2VudHM7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc3ZnX2xpbmVNb25vdG9uZShwb2ludHMpIHtcbiAgICByZXR1cm4gcG9pbnRzLmxlbmd0aCA8IDMgPyBkM19zdmdfbGluZUxpbmVhcihwb2ludHMpIDogcG9pbnRzWzBdICsgZDNfc3ZnX2xpbmVIZXJtaXRlKHBvaW50cywgZDNfc3ZnX2xpbmVNb25vdG9uZVRhbmdlbnRzKHBvaW50cykpO1xuICB9XG4gIGQzLnN2Zy5saW5lLnJhZGlhbCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBsaW5lID0gZDNfc3ZnX2xpbmUoZDNfc3ZnX2xpbmVSYWRpYWwpO1xuICAgIGxpbmUucmFkaXVzID0gbGluZS54LCBkZWxldGUgbGluZS54O1xuICAgIGxpbmUuYW5nbGUgPSBsaW5lLnksIGRlbGV0ZSBsaW5lLnk7XG4gICAgcmV0dXJuIGxpbmU7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3N2Z19saW5lUmFkaWFsKHBvaW50cykge1xuICAgIHZhciBwb2ludCwgaSA9IC0xLCBuID0gcG9pbnRzLmxlbmd0aCwgciwgYTtcbiAgICB3aGlsZSAoKytpIDwgbikge1xuICAgICAgcG9pbnQgPSBwb2ludHNbaV07XG4gICAgICByID0gcG9pbnRbMF07XG4gICAgICBhID0gcG9pbnRbMV0gLSBoYWxmz4A7XG4gICAgICBwb2ludFswXSA9IHIgKiBNYXRoLmNvcyhhKTtcbiAgICAgIHBvaW50WzFdID0gciAqIE1hdGguc2luKGEpO1xuICAgIH1cbiAgICByZXR1cm4gcG9pbnRzO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3N2Z19hcmVhKHByb2plY3Rpb24pIHtcbiAgICB2YXIgeDAgPSBkM19nZW9tX3BvaW50WCwgeDEgPSBkM19nZW9tX3BvaW50WCwgeTAgPSAwLCB5MSA9IGQzX2dlb21fcG9pbnRZLCBkZWZpbmVkID0gZDNfdHJ1ZSwgaW50ZXJwb2xhdGUgPSBkM19zdmdfbGluZUxpbmVhciwgaW50ZXJwb2xhdGVLZXkgPSBpbnRlcnBvbGF0ZS5rZXksIGludGVycG9sYXRlUmV2ZXJzZSA9IGludGVycG9sYXRlLCBMID0gXCJMXCIsIHRlbnNpb24gPSAuNztcbiAgICBmdW5jdGlvbiBhcmVhKGRhdGEpIHtcbiAgICAgIHZhciBzZWdtZW50cyA9IFtdLCBwb2ludHMwID0gW10sIHBvaW50czEgPSBbXSwgaSA9IC0xLCBuID0gZGF0YS5sZW5ndGgsIGQsIGZ4MCA9IGQzX2Z1bmN0b3IoeDApLCBmeTAgPSBkM19mdW5jdG9yKHkwKSwgZngxID0geDAgPT09IHgxID8gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgICAgfSA6IGQzX2Z1bmN0b3IoeDEpLCBmeTEgPSB5MCA9PT0geTEgPyBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHk7XG4gICAgICB9IDogZDNfZnVuY3Rvcih5MSksIHgsIHk7XG4gICAgICBmdW5jdGlvbiBzZWdtZW50KCkge1xuICAgICAgICBzZWdtZW50cy5wdXNoKFwiTVwiLCBpbnRlcnBvbGF0ZShwcm9qZWN0aW9uKHBvaW50czEpLCB0ZW5zaW9uKSwgTCwgaW50ZXJwb2xhdGVSZXZlcnNlKHByb2plY3Rpb24ocG9pbnRzMC5yZXZlcnNlKCkpLCB0ZW5zaW9uKSwgXCJaXCIpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKCsraSA8IG4pIHtcbiAgICAgICAgaWYgKGRlZmluZWQuY2FsbCh0aGlzLCBkID0gZGF0YVtpXSwgaSkpIHtcbiAgICAgICAgICBwb2ludHMwLnB1c2goWyB4ID0gK2Z4MC5jYWxsKHRoaXMsIGQsIGkpLCB5ID0gK2Z5MC5jYWxsKHRoaXMsIGQsIGkpIF0pO1xuICAgICAgICAgIHBvaW50czEucHVzaChbICtmeDEuY2FsbCh0aGlzLCBkLCBpKSwgK2Z5MS5jYWxsKHRoaXMsIGQsIGkpIF0pO1xuICAgICAgICB9IGVsc2UgaWYgKHBvaW50czAubGVuZ3RoKSB7XG4gICAgICAgICAgc2VnbWVudCgpO1xuICAgICAgICAgIHBvaW50czAgPSBbXTtcbiAgICAgICAgICBwb2ludHMxID0gW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwb2ludHMwLmxlbmd0aCkgc2VnbWVudCgpO1xuICAgICAgcmV0dXJuIHNlZ21lbnRzLmxlbmd0aCA/IHNlZ21lbnRzLmpvaW4oXCJcIikgOiBudWxsO1xuICAgIH1cbiAgICBhcmVhLnggPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4MTtcbiAgICAgIHgwID0geDEgPSBfO1xuICAgICAgcmV0dXJuIGFyZWE7XG4gICAgfTtcbiAgICBhcmVhLngwID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geDA7XG4gICAgICB4MCA9IF87XG4gICAgICByZXR1cm4gYXJlYTtcbiAgICB9O1xuICAgIGFyZWEueDEgPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4MTtcbiAgICAgIHgxID0gXztcbiAgICAgIHJldHVybiBhcmVhO1xuICAgIH07XG4gICAgYXJlYS55ID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTE7XG4gICAgICB5MCA9IHkxID0gXztcbiAgICAgIHJldHVybiBhcmVhO1xuICAgIH07XG4gICAgYXJlYS55MCA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHkwO1xuICAgICAgeTAgPSBfO1xuICAgICAgcmV0dXJuIGFyZWE7XG4gICAgfTtcbiAgICBhcmVhLnkxID0gZnVuY3Rpb24oXykge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTE7XG4gICAgICB5MSA9IF87XG4gICAgICByZXR1cm4gYXJlYTtcbiAgICB9O1xuICAgIGFyZWEuZGVmaW5lZCA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRlZmluZWQ7XG4gICAgICBkZWZpbmVkID0gXztcbiAgICAgIHJldHVybiBhcmVhO1xuICAgIH07XG4gICAgYXJlYS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGludGVycG9sYXRlS2V5O1xuICAgICAgaWYgKHR5cGVvZiBfID09PSBcImZ1bmN0aW9uXCIpIGludGVycG9sYXRlS2V5ID0gaW50ZXJwb2xhdGUgPSBfOyBlbHNlIGludGVycG9sYXRlS2V5ID0gKGludGVycG9sYXRlID0gZDNfc3ZnX2xpbmVJbnRlcnBvbGF0b3JzLmdldChfKSB8fCBkM19zdmdfbGluZUxpbmVhcikua2V5O1xuICAgICAgaW50ZXJwb2xhdGVSZXZlcnNlID0gaW50ZXJwb2xhdGUucmV2ZXJzZSB8fCBpbnRlcnBvbGF0ZTtcbiAgICAgIEwgPSBpbnRlcnBvbGF0ZS5jbG9zZWQgPyBcIk1cIiA6IFwiTFwiO1xuICAgICAgcmV0dXJuIGFyZWE7XG4gICAgfTtcbiAgICBhcmVhLnRlbnNpb24gPSBmdW5jdGlvbihfKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0ZW5zaW9uO1xuICAgICAgdGVuc2lvbiA9IF87XG4gICAgICByZXR1cm4gYXJlYTtcbiAgICB9O1xuICAgIHJldHVybiBhcmVhO1xuICB9XG4gIGQzX3N2Z19saW5lU3RlcEJlZm9yZS5yZXZlcnNlID0gZDNfc3ZnX2xpbmVTdGVwQWZ0ZXI7XG4gIGQzX3N2Z19saW5lU3RlcEFmdGVyLnJldmVyc2UgPSBkM19zdmdfbGluZVN0ZXBCZWZvcmU7XG4gIGQzLnN2Zy5hcmVhID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGQzX3N2Z19hcmVhKGQzX2lkZW50aXR5KTtcbiAgfTtcbiAgZDMuc3ZnLmFyZWEucmFkaWFsID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGFyZWEgPSBkM19zdmdfYXJlYShkM19zdmdfbGluZVJhZGlhbCk7XG4gICAgYXJlYS5yYWRpdXMgPSBhcmVhLngsIGRlbGV0ZSBhcmVhLng7XG4gICAgYXJlYS5pbm5lclJhZGl1cyA9IGFyZWEueDAsIGRlbGV0ZSBhcmVhLngwO1xuICAgIGFyZWEub3V0ZXJSYWRpdXMgPSBhcmVhLngxLCBkZWxldGUgYXJlYS54MTtcbiAgICBhcmVhLmFuZ2xlID0gYXJlYS55LCBkZWxldGUgYXJlYS55O1xuICAgIGFyZWEuc3RhcnRBbmdsZSA9IGFyZWEueTAsIGRlbGV0ZSBhcmVhLnkwO1xuICAgIGFyZWEuZW5kQW5nbGUgPSBhcmVhLnkxLCBkZWxldGUgYXJlYS55MTtcbiAgICByZXR1cm4gYXJlYTtcbiAgfTtcbiAgZDMuc3ZnLmNob3JkID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHNvdXJjZSA9IGQzX3NvdXJjZSwgdGFyZ2V0ID0gZDNfdGFyZ2V0LCByYWRpdXMgPSBkM19zdmdfY2hvcmRSYWRpdXMsIHN0YXJ0QW5nbGUgPSBkM19zdmdfYXJjU3RhcnRBbmdsZSwgZW5kQW5nbGUgPSBkM19zdmdfYXJjRW5kQW5nbGU7XG4gICAgZnVuY3Rpb24gY2hvcmQoZCwgaSkge1xuICAgICAgdmFyIHMgPSBzdWJncm91cCh0aGlzLCBzb3VyY2UsIGQsIGkpLCB0ID0gc3ViZ3JvdXAodGhpcywgdGFyZ2V0LCBkLCBpKTtcbiAgICAgIHJldHVybiBcIk1cIiArIHMucDAgKyBhcmMocy5yLCBzLnAxLCBzLmExIC0gcy5hMCkgKyAoZXF1YWxzKHMsIHQpID8gY3VydmUocy5yLCBzLnAxLCBzLnIsIHMucDApIDogY3VydmUocy5yLCBzLnAxLCB0LnIsIHQucDApICsgYXJjKHQuciwgdC5wMSwgdC5hMSAtIHQuYTApICsgY3VydmUodC5yLCB0LnAxLCBzLnIsIHMucDApKSArIFwiWlwiO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzdWJncm91cChzZWxmLCBmLCBkLCBpKSB7XG4gICAgICB2YXIgc3ViZ3JvdXAgPSBmLmNhbGwoc2VsZiwgZCwgaSksIHIgPSByYWRpdXMuY2FsbChzZWxmLCBzdWJncm91cCwgaSksIGEwID0gc3RhcnRBbmdsZS5jYWxsKHNlbGYsIHN1Ymdyb3VwLCBpKSAtIGhhbGbPgCwgYTEgPSBlbmRBbmdsZS5jYWxsKHNlbGYsIHN1Ymdyb3VwLCBpKSAtIGhhbGbPgDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHI6IHIsXG4gICAgICAgIGEwOiBhMCxcbiAgICAgICAgYTE6IGExLFxuICAgICAgICBwMDogWyByICogTWF0aC5jb3MoYTApLCByICogTWF0aC5zaW4oYTApIF0sXG4gICAgICAgIHAxOiBbIHIgKiBNYXRoLmNvcyhhMSksIHIgKiBNYXRoLnNpbihhMSkgXVxuICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZXF1YWxzKGEsIGIpIHtcbiAgICAgIHJldHVybiBhLmEwID09IGIuYTAgJiYgYS5hMSA9PSBiLmExO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhcmMociwgcCwgYSkge1xuICAgICAgcmV0dXJuIFwiQVwiICsgciArIFwiLFwiICsgciArIFwiIDAgXCIgKyArKGEgPiDPgCkgKyBcIiwxIFwiICsgcDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY3VydmUocjAsIHAwLCByMSwgcDEpIHtcbiAgICAgIHJldHVybiBcIlEgMCwwIFwiICsgcDE7XG4gICAgfVxuICAgIGNob3JkLnJhZGl1cyA9IGZ1bmN0aW9uKHYpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJhZGl1cztcbiAgICAgIHJhZGl1cyA9IGQzX2Z1bmN0b3Iodik7XG4gICAgICByZXR1cm4gY2hvcmQ7XG4gICAgfTtcbiAgICBjaG9yZC5zb3VyY2UgPSBmdW5jdGlvbih2KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzb3VyY2U7XG4gICAgICBzb3VyY2UgPSBkM19mdW5jdG9yKHYpO1xuICAgICAgcmV0dXJuIGNob3JkO1xuICAgIH07XG4gICAgY2hvcmQudGFyZ2V0ID0gZnVuY3Rpb24odikge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGFyZ2V0O1xuICAgICAgdGFyZ2V0ID0gZDNfZnVuY3Rvcih2KTtcbiAgICAgIHJldHVybiBjaG9yZDtcbiAgICB9O1xuICAgIGNob3JkLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbih2KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzdGFydEFuZ2xlO1xuICAgICAgc3RhcnRBbmdsZSA9IGQzX2Z1bmN0b3Iodik7XG4gICAgICByZXR1cm4gY2hvcmQ7XG4gICAgfTtcbiAgICBjaG9yZC5lbmRBbmdsZSA9IGZ1bmN0aW9uKHYpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGVuZEFuZ2xlO1xuICAgICAgZW5kQW5nbGUgPSBkM19mdW5jdG9yKHYpO1xuICAgICAgcmV0dXJuIGNob3JkO1xuICAgIH07XG4gICAgcmV0dXJuIGNob3JkO1xuICB9O1xuICBmdW5jdGlvbiBkM19zdmdfY2hvcmRSYWRpdXMoZCkge1xuICAgIHJldHVybiBkLnJhZGl1cztcbiAgfVxuICBkMy5zdmcuZGlhZ29uYWwgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgc291cmNlID0gZDNfc291cmNlLCB0YXJnZXQgPSBkM190YXJnZXQsIHByb2plY3Rpb24gPSBkM19zdmdfZGlhZ29uYWxQcm9qZWN0aW9uO1xuICAgIGZ1bmN0aW9uIGRpYWdvbmFsKGQsIGkpIHtcbiAgICAgIHZhciBwMCA9IHNvdXJjZS5jYWxsKHRoaXMsIGQsIGkpLCBwMyA9IHRhcmdldC5jYWxsKHRoaXMsIGQsIGkpLCBtID0gKHAwLnkgKyBwMy55KSAvIDIsIHAgPSBbIHAwLCB7XG4gICAgICAgIHg6IHAwLngsXG4gICAgICAgIHk6IG1cbiAgICAgIH0sIHtcbiAgICAgICAgeDogcDMueCxcbiAgICAgICAgeTogbVxuICAgICAgfSwgcDMgXTtcbiAgICAgIHAgPSBwLm1hcChwcm9qZWN0aW9uKTtcbiAgICAgIHJldHVybiBcIk1cIiArIHBbMF0gKyBcIkNcIiArIHBbMV0gKyBcIiBcIiArIHBbMl0gKyBcIiBcIiArIHBbM107XG4gICAgfVxuICAgIGRpYWdvbmFsLnNvdXJjZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHNvdXJjZTtcbiAgICAgIHNvdXJjZSA9IGQzX2Z1bmN0b3IoeCk7XG4gICAgICByZXR1cm4gZGlhZ29uYWw7XG4gICAgfTtcbiAgICBkaWFnb25hbC50YXJnZXQgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0YXJnZXQ7XG4gICAgICB0YXJnZXQgPSBkM19mdW5jdG9yKHgpO1xuICAgICAgcmV0dXJuIGRpYWdvbmFsO1xuICAgIH07XG4gICAgZGlhZ29uYWwucHJvamVjdGlvbiA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHByb2plY3Rpb247XG4gICAgICBwcm9qZWN0aW9uID0geDtcbiAgICAgIHJldHVybiBkaWFnb25hbDtcbiAgICB9O1xuICAgIHJldHVybiBkaWFnb25hbDtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc3ZnX2RpYWdvbmFsUHJvamVjdGlvbihkKSB7XG4gICAgcmV0dXJuIFsgZC54LCBkLnkgXTtcbiAgfVxuICBkMy5zdmcuZGlhZ29uYWwucmFkaWFsID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRpYWdvbmFsID0gZDMuc3ZnLmRpYWdvbmFsKCksIHByb2plY3Rpb24gPSBkM19zdmdfZGlhZ29uYWxQcm9qZWN0aW9uLCBwcm9qZWN0aW9uXyA9IGRpYWdvbmFsLnByb2plY3Rpb247XG4gICAgZGlhZ29uYWwucHJvamVjdGlvbiA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gcHJvamVjdGlvbl8oZDNfc3ZnX2RpYWdvbmFsUmFkaWFsUHJvamVjdGlvbihwcm9qZWN0aW9uID0geCkpIDogcHJvamVjdGlvbjtcbiAgICB9O1xuICAgIHJldHVybiBkaWFnb25hbDtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfc3ZnX2RpYWdvbmFsUmFkaWFsUHJvamVjdGlvbihwcm9qZWN0aW9uKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGQgPSBwcm9qZWN0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHIgPSBkWzBdLCBhID0gZFsxXSAtIGhhbGbPgDtcbiAgICAgIHJldHVybiBbIHIgKiBNYXRoLmNvcyhhKSwgciAqIE1hdGguc2luKGEpIF07XG4gICAgfTtcbiAgfVxuICBkMy5zdmcuc3ltYm9sID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHR5cGUgPSBkM19zdmdfc3ltYm9sVHlwZSwgc2l6ZSA9IGQzX3N2Z19zeW1ib2xTaXplO1xuICAgIGZ1bmN0aW9uIHN5bWJvbChkLCBpKSB7XG4gICAgICByZXR1cm4gKGQzX3N2Z19zeW1ib2xzLmdldCh0eXBlLmNhbGwodGhpcywgZCwgaSkpIHx8IGQzX3N2Z19zeW1ib2xDaXJjbGUpKHNpemUuY2FsbCh0aGlzLCBkLCBpKSk7XG4gICAgfVxuICAgIHN5bWJvbC50eXBlID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdHlwZTtcbiAgICAgIHR5cGUgPSBkM19mdW5jdG9yKHgpO1xuICAgICAgcmV0dXJuIHN5bWJvbDtcbiAgICB9O1xuICAgIHN5bWJvbC5zaXplID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gc2l6ZTtcbiAgICAgIHNpemUgPSBkM19mdW5jdG9yKHgpO1xuICAgICAgcmV0dXJuIHN5bWJvbDtcbiAgICB9O1xuICAgIHJldHVybiBzeW1ib2w7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3N2Z19zeW1ib2xTaXplKCkge1xuICAgIHJldHVybiA2NDtcbiAgfVxuICBmdW5jdGlvbiBkM19zdmdfc3ltYm9sVHlwZSgpIHtcbiAgICByZXR1cm4gXCJjaXJjbGVcIjtcbiAgfVxuICBmdW5jdGlvbiBkM19zdmdfc3ltYm9sQ2lyY2xlKHNpemUpIHtcbiAgICB2YXIgciA9IE1hdGguc3FydChzaXplIC8gz4ApO1xuICAgIHJldHVybiBcIk0wLFwiICsgciArIFwiQVwiICsgciArIFwiLFwiICsgciArIFwiIDAgMSwxIDAsXCIgKyAtciArIFwiQVwiICsgciArIFwiLFwiICsgciArIFwiIDAgMSwxIDAsXCIgKyByICsgXCJaXCI7XG4gIH1cbiAgdmFyIGQzX3N2Z19zeW1ib2xzID0gZDMubWFwKHtcbiAgICBjaXJjbGU6IGQzX3N2Z19zeW1ib2xDaXJjbGUsXG4gICAgY3Jvc3M6IGZ1bmN0aW9uKHNpemUpIHtcbiAgICAgIHZhciByID0gTWF0aC5zcXJ0KHNpemUgLyA1KSAvIDI7XG4gICAgICByZXR1cm4gXCJNXCIgKyAtMyAqIHIgKyBcIixcIiArIC1yICsgXCJIXCIgKyAtciArIFwiVlwiICsgLTMgKiByICsgXCJIXCIgKyByICsgXCJWXCIgKyAtciArIFwiSFwiICsgMyAqIHIgKyBcIlZcIiArIHIgKyBcIkhcIiArIHIgKyBcIlZcIiArIDMgKiByICsgXCJIXCIgKyAtciArIFwiVlwiICsgciArIFwiSFwiICsgLTMgKiByICsgXCJaXCI7XG4gICAgfSxcbiAgICBkaWFtb25kOiBmdW5jdGlvbihzaXplKSB7XG4gICAgICB2YXIgcnkgPSBNYXRoLnNxcnQoc2l6ZSAvICgyICogZDNfc3ZnX3N5bWJvbFRhbjMwKSksIHJ4ID0gcnkgKiBkM19zdmdfc3ltYm9sVGFuMzA7XG4gICAgICByZXR1cm4gXCJNMCxcIiArIC1yeSArIFwiTFwiICsgcnggKyBcIiwwXCIgKyBcIiAwLFwiICsgcnkgKyBcIiBcIiArIC1yeCArIFwiLDBcIiArIFwiWlwiO1xuICAgIH0sXG4gICAgc3F1YXJlOiBmdW5jdGlvbihzaXplKSB7XG4gICAgICB2YXIgciA9IE1hdGguc3FydChzaXplKSAvIDI7XG4gICAgICByZXR1cm4gXCJNXCIgKyAtciArIFwiLFwiICsgLXIgKyBcIkxcIiArIHIgKyBcIixcIiArIC1yICsgXCIgXCIgKyByICsgXCIsXCIgKyByICsgXCIgXCIgKyAtciArIFwiLFwiICsgciArIFwiWlwiO1xuICAgIH0sXG4gICAgXCJ0cmlhbmdsZS1kb3duXCI6IGZ1bmN0aW9uKHNpemUpIHtcbiAgICAgIHZhciByeCA9IE1hdGguc3FydChzaXplIC8gZDNfc3ZnX3N5bWJvbFNxcnQzKSwgcnkgPSByeCAqIGQzX3N2Z19zeW1ib2xTcXJ0MyAvIDI7XG4gICAgICByZXR1cm4gXCJNMCxcIiArIHJ5ICsgXCJMXCIgKyByeCArIFwiLFwiICsgLXJ5ICsgXCIgXCIgKyAtcnggKyBcIixcIiArIC1yeSArIFwiWlwiO1xuICAgIH0sXG4gICAgXCJ0cmlhbmdsZS11cFwiOiBmdW5jdGlvbihzaXplKSB7XG4gICAgICB2YXIgcnggPSBNYXRoLnNxcnQoc2l6ZSAvIGQzX3N2Z19zeW1ib2xTcXJ0MyksIHJ5ID0gcnggKiBkM19zdmdfc3ltYm9sU3FydDMgLyAyO1xuICAgICAgcmV0dXJuIFwiTTAsXCIgKyAtcnkgKyBcIkxcIiArIHJ4ICsgXCIsXCIgKyByeSArIFwiIFwiICsgLXJ4ICsgXCIsXCIgKyByeSArIFwiWlwiO1xuICAgIH1cbiAgfSk7XG4gIGQzLnN2Zy5zeW1ib2xUeXBlcyA9IGQzX3N2Z19zeW1ib2xzLmtleXMoKTtcbiAgdmFyIGQzX3N2Z19zeW1ib2xTcXJ0MyA9IE1hdGguc3FydCgzKSwgZDNfc3ZnX3N5bWJvbFRhbjMwID0gTWF0aC50YW4oMzAgKiBkM19yYWRpYW5zKTtcbiAgZDNfc2VsZWN0aW9uUHJvdG90eXBlLnRyYW5zaXRpb24gPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIGlkID0gZDNfdHJhbnNpdGlvbkluaGVyaXRJZCB8fCArK2QzX3RyYW5zaXRpb25JZCwgbnMgPSBkM190cmFuc2l0aW9uTmFtZXNwYWNlKG5hbWUpLCBzdWJncm91cHMgPSBbXSwgc3ViZ3JvdXAsIG5vZGUsIHRyYW5zaXRpb24gPSBkM190cmFuc2l0aW9uSW5oZXJpdCB8fCB7XG4gICAgICB0aW1lOiBEYXRlLm5vdygpLFxuICAgICAgZWFzZTogZDNfZWFzZV9jdWJpY0luT3V0LFxuICAgICAgZGVsYXk6IDAsXG4gICAgICBkdXJhdGlvbjogMjUwXG4gICAgfTtcbiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB7XG4gICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTtcbiAgICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IC0xLCBuID0gZ3JvdXAubGVuZ3RoOyArK2kgPCBuOyApIHtcbiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgZDNfdHJhbnNpdGlvbk5vZGUobm9kZSwgaSwgbnMsIGlkLCB0cmFuc2l0aW9uKTtcbiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGQzX3RyYW5zaXRpb24oc3ViZ3JvdXBzLCBucywgaWQpO1xuICB9O1xuICBkM19zZWxlY3Rpb25Qcm90b3R5cGUuaW50ZXJydXB0ID0gZnVuY3Rpb24obmFtZSkge1xuICAgIHJldHVybiB0aGlzLmVhY2gobmFtZSA9PSBudWxsID8gZDNfc2VsZWN0aW9uX2ludGVycnVwdCA6IGQzX3NlbGVjdGlvbl9pbnRlcnJ1cHROUyhkM190cmFuc2l0aW9uTmFtZXNwYWNlKG5hbWUpKSk7XG4gIH07XG4gIHZhciBkM19zZWxlY3Rpb25faW50ZXJydXB0ID0gZDNfc2VsZWN0aW9uX2ludGVycnVwdE5TKGQzX3RyYW5zaXRpb25OYW1lc3BhY2UoKSk7XG4gIGZ1bmN0aW9uIGQzX3NlbGVjdGlvbl9pbnRlcnJ1cHROUyhucykge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBsb2NrLCBhY3RpdmVJZCwgYWN0aXZlO1xuICAgICAgaWYgKChsb2NrID0gdGhpc1tuc10pICYmIChhY3RpdmUgPSBsb2NrW2FjdGl2ZUlkID0gbG9jay5hY3RpdmVdKSkge1xuICAgICAgICBhY3RpdmUudGltZXIuYyA9IG51bGw7XG4gICAgICAgIGFjdGl2ZS50aW1lci50ID0gTmFOO1xuICAgICAgICBpZiAoLS1sb2NrLmNvdW50KSBkZWxldGUgbG9ja1thY3RpdmVJZF07IGVsc2UgZGVsZXRlIHRoaXNbbnNdO1xuICAgICAgICBsb2NrLmFjdGl2ZSArPSAuNTtcbiAgICAgICAgYWN0aXZlLmV2ZW50ICYmIGFjdGl2ZS5ldmVudC5pbnRlcnJ1cHQuY2FsbCh0aGlzLCB0aGlzLl9fZGF0YV9fLCBhY3RpdmUuaW5kZXgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gZDNfdHJhbnNpdGlvbihncm91cHMsIG5zLCBpZCkge1xuICAgIGQzX3N1YmNsYXNzKGdyb3VwcywgZDNfdHJhbnNpdGlvblByb3RvdHlwZSk7XG4gICAgZ3JvdXBzLm5hbWVzcGFjZSA9IG5zO1xuICAgIGdyb3Vwcy5pZCA9IGlkO1xuICAgIHJldHVybiBncm91cHM7XG4gIH1cbiAgdmFyIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUgPSBbXSwgZDNfdHJhbnNpdGlvbklkID0gMCwgZDNfdHJhbnNpdGlvbkluaGVyaXRJZCwgZDNfdHJhbnNpdGlvbkluaGVyaXQ7XG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuY2FsbCA9IGQzX3NlbGVjdGlvblByb3RvdHlwZS5jYWxsO1xuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLmVtcHR5ID0gZDNfc2VsZWN0aW9uUHJvdG90eXBlLmVtcHR5O1xuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLm5vZGUgPSBkM19zZWxlY3Rpb25Qcm90b3R5cGUubm9kZTtcbiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS5zaXplID0gZDNfc2VsZWN0aW9uUHJvdG90eXBlLnNpemU7XG4gIGQzLnRyYW5zaXRpb24gPSBmdW5jdGlvbihzZWxlY3Rpb24sIG5hbWUpIHtcbiAgICByZXR1cm4gc2VsZWN0aW9uICYmIHNlbGVjdGlvbi50cmFuc2l0aW9uID8gZDNfdHJhbnNpdGlvbkluaGVyaXRJZCA/IHNlbGVjdGlvbi50cmFuc2l0aW9uKG5hbWUpIDogc2VsZWN0aW9uIDogZDMuc2VsZWN0aW9uKCkudHJhbnNpdGlvbihzZWxlY3Rpb24pO1xuICB9O1xuICBkMy50cmFuc2l0aW9uLnByb3RvdHlwZSA9IGQzX3RyYW5zaXRpb25Qcm90b3R5cGU7XG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuc2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgICB2YXIgaWQgPSB0aGlzLmlkLCBucyA9IHRoaXMubmFtZXNwYWNlLCBzdWJncm91cHMgPSBbXSwgc3ViZ3JvdXAsIHN1Ym5vZGUsIG5vZGU7XG4gICAgc2VsZWN0b3IgPSBkM19zZWxlY3Rpb25fc2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgIGZvciAodmFyIGogPSAtMSwgbSA9IHRoaXMubGVuZ3RoOyArK2ogPCBtOyApIHtcbiAgICAgIHN1Ymdyb3Vwcy5wdXNoKHN1Ymdyb3VwID0gW10pO1xuICAgICAgZm9yICh2YXIgZ3JvdXAgPSB0aGlzW2pdLCBpID0gLTEsIG4gPSBncm91cC5sZW5ndGg7ICsraSA8IG47ICkge1xuICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3Rvci5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGopKSkge1xuICAgICAgICAgIGlmIChcIl9fZGF0YV9fXCIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187XG4gICAgICAgICAgZDNfdHJhbnNpdGlvbk5vZGUoc3Vibm9kZSwgaSwgbnMsIGlkLCBub2RlW25zXVtpZF0pO1xuICAgICAgICAgIHN1Ymdyb3VwLnB1c2goc3Vibm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3ViZ3JvdXAucHVzaChudWxsKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZDNfdHJhbnNpdGlvbihzdWJncm91cHMsIG5zLCBpZCk7XG4gIH07XG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuc2VsZWN0QWxsID0gZnVuY3Rpb24oc2VsZWN0b3IpIHtcbiAgICB2YXIgaWQgPSB0aGlzLmlkLCBucyA9IHRoaXMubmFtZXNwYWNlLCBzdWJncm91cHMgPSBbXSwgc3ViZ3JvdXAsIHN1Ym5vZGVzLCBub2RlLCBzdWJub2RlLCB0cmFuc2l0aW9uO1xuICAgIHNlbGVjdG9yID0gZDNfc2VsZWN0aW9uX3NlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICBmb3IgKHZhciBqID0gLTEsIG0gPSB0aGlzLmxlbmd0aDsgKytqIDwgbTsgKSB7XG4gICAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAtMSwgbiA9IGdyb3VwLmxlbmd0aDsgKytpIDwgbjsgKSB7XG4gICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHtcbiAgICAgICAgICB0cmFuc2l0aW9uID0gbm9kZVtuc11baWRdO1xuICAgICAgICAgIHN1Ym5vZGVzID0gc2VsZWN0b3IuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKTtcbiAgICAgICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTtcbiAgICAgICAgICBmb3IgKHZhciBrID0gLTEsIG8gPSBzdWJub2Rlcy5sZW5ndGg7ICsrayA8IG87ICkge1xuICAgICAgICAgICAgaWYgKHN1Ym5vZGUgPSBzdWJub2Rlc1trXSkgZDNfdHJhbnNpdGlvbk5vZGUoc3Vibm9kZSwgaywgbnMsIGlkLCB0cmFuc2l0aW9uKTtcbiAgICAgICAgICAgIHN1Ymdyb3VwLnB1c2goc3Vibm9kZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkM190cmFuc2l0aW9uKHN1Ymdyb3VwcywgbnMsIGlkKTtcbiAgfTtcbiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS5maWx0ZXIgPSBmdW5jdGlvbihmaWx0ZXIpIHtcbiAgICB2YXIgc3ViZ3JvdXBzID0gW10sIHN1Ymdyb3VwLCBncm91cCwgbm9kZTtcbiAgICBpZiAodHlwZW9mIGZpbHRlciAhPT0gXCJmdW5jdGlvblwiKSBmaWx0ZXIgPSBkM19zZWxlY3Rpb25fZmlsdGVyKGZpbHRlcik7XG4gICAgZm9yICh2YXIgaiA9IDAsIG0gPSB0aGlzLmxlbmd0aDsgaiA8IG07IGorKykge1xuICAgICAgc3ViZ3JvdXBzLnB1c2goc3ViZ3JvdXAgPSBbXSk7XG4gICAgICBmb3IgKHZhciBncm91cCA9IHRoaXNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBmaWx0ZXIuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKSkge1xuICAgICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGQzX3RyYW5zaXRpb24oc3ViZ3JvdXBzLCB0aGlzLm5hbWVzcGFjZSwgdGhpcy5pZCk7XG4gIH07XG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUudHdlZW4gPSBmdW5jdGlvbihuYW1lLCB0d2Vlbikge1xuICAgIHZhciBpZCA9IHRoaXMuaWQsIG5zID0gdGhpcy5uYW1lc3BhY2U7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gdGhpcy5ub2RlKClbbnNdW2lkXS50d2Vlbi5nZXQobmFtZSk7XG4gICAgcmV0dXJuIGQzX3NlbGVjdGlvbl9lYWNoKHRoaXMsIHR3ZWVuID09IG51bGwgPyBmdW5jdGlvbihub2RlKSB7XG4gICAgICBub2RlW25zXVtpZF0udHdlZW4ucmVtb3ZlKG5hbWUpO1xuICAgIH0gOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICBub2RlW25zXVtpZF0udHdlZW4uc2V0KG5hbWUsIHR3ZWVuKTtcbiAgICB9KTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfdHJhbnNpdGlvbl90d2Vlbihncm91cHMsIG5hbWUsIHZhbHVlLCB0d2Vlbikge1xuICAgIHZhciBpZCA9IGdyb3Vwcy5pZCwgbnMgPSBncm91cHMubmFtZXNwYWNlO1xuICAgIHJldHVybiBkM19zZWxlY3Rpb25fZWFjaChncm91cHMsIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gZnVuY3Rpb24obm9kZSwgaSwgaikge1xuICAgICAgbm9kZVtuc11baWRdLnR3ZWVuLnNldChuYW1lLCB0d2Vlbih2YWx1ZS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGopKSk7XG4gICAgfSA6ICh2YWx1ZSA9IHR3ZWVuKHZhbHVlKSwgZnVuY3Rpb24obm9kZSkge1xuICAgICAgbm9kZVtuc11baWRdLnR3ZWVuLnNldChuYW1lLCB2YWx1ZSk7XG4gICAgfSkpO1xuICB9XG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuYXR0ciA9IGZ1bmN0aW9uKG5hbWVOUywgdmFsdWUpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIGZvciAodmFsdWUgaW4gbmFtZU5TKSB0aGlzLmF0dHIodmFsdWUsIG5hbWVOU1t2YWx1ZV0pO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHZhciBpbnRlcnBvbGF0ZSA9IG5hbWVOUyA9PSBcInRyYW5zZm9ybVwiID8gZDNfaW50ZXJwb2xhdGVUcmFuc2Zvcm0gOiBkM19pbnRlcnBvbGF0ZSwgbmFtZSA9IGQzLm5zLnF1YWxpZnkobmFtZU5TKTtcbiAgICBmdW5jdGlvbiBhdHRyTnVsbCgpIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhdHRyTnVsbE5TKCkge1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYXR0clR3ZWVuKGIpIHtcbiAgICAgIHJldHVybiBiID09IG51bGwgPyBhdHRyTnVsbCA6IChiICs9IFwiXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYSA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpLCBpO1xuICAgICAgICByZXR1cm4gYSAhPT0gYiAmJiAoaSA9IGludGVycG9sYXRlKGEsIGIpLCBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgaSh0KSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGF0dHJUd2Vlbk5TKGIpIHtcbiAgICAgIHJldHVybiBiID09IG51bGwgPyBhdHRyTnVsbE5TIDogKGIgKz0gXCJcIiwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsKSwgaTtcbiAgICAgICAgcmV0dXJuIGEgIT09IGIgJiYgKGkgPSBpbnRlcnBvbGF0ZShhLCBiKSwgZnVuY3Rpb24odCkge1xuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlTlMobmFtZS5zcGFjZSwgbmFtZS5sb2NhbCwgaSh0KSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBkM190cmFuc2l0aW9uX3R3ZWVuKHRoaXMsIFwiYXR0ci5cIiArIG5hbWVOUywgdmFsdWUsIG5hbWUubG9jYWwgPyBhdHRyVHdlZW5OUyA6IGF0dHJUd2Vlbik7XG4gIH07XG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuYXR0clR3ZWVuID0gZnVuY3Rpb24obmFtZU5TLCB0d2Vlbikge1xuICAgIHZhciBuYW1lID0gZDMubnMucXVhbGlmeShuYW1lTlMpO1xuICAgIGZ1bmN0aW9uIGF0dHJUd2VlbihkLCBpKSB7XG4gICAgICB2YXIgZiA9IHR3ZWVuLmNhbGwodGhpcywgZCwgaSwgdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSkpO1xuICAgICAgcmV0dXJuIGYgJiYgZnVuY3Rpb24odCkge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBmKHQpKTtcbiAgICAgIH07XG4gICAgfVxuICAgIGZ1bmN0aW9uIGF0dHJUd2Vlbk5TKGQsIGkpIHtcbiAgICAgIHZhciBmID0gdHdlZW4uY2FsbCh0aGlzLCBkLCBpLCB0aGlzLmdldEF0dHJpYnV0ZU5TKG5hbWUuc3BhY2UsIG5hbWUubG9jYWwpKTtcbiAgICAgIHJldHVybiBmICYmIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhuYW1lLnNwYWNlLCBuYW1lLmxvY2FsLCBmKHQpKTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnR3ZWVuKFwiYXR0ci5cIiArIG5hbWVOUywgbmFtZS5sb2NhbCA/IGF0dHJUd2Vlbk5TIDogYXR0clR3ZWVuKTtcbiAgfTtcbiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS5zdHlsZSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkge1xuICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBpZiAobiA8IDMpIHtcbiAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAobiA8IDIpIHZhbHVlID0gXCJcIjtcbiAgICAgICAgZm9yIChwcmlvcml0eSBpbiBuYW1lKSB0aGlzLnN0eWxlKHByaW9yaXR5LCBuYW1lW3ByaW9yaXR5XSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHByaW9yaXR5ID0gXCJcIjtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3R5bGVOdWxsKCkge1xuICAgICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gc3R5bGVTdHJpbmcoYikge1xuICAgICAgcmV0dXJuIGIgPT0gbnVsbCA/IHN0eWxlTnVsbCA6IChiICs9IFwiXCIsIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYSA9IGQzX3dpbmRvdyh0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSksIGk7XG4gICAgICAgIHJldHVybiBhICE9PSBiICYmIChpID0gZDNfaW50ZXJwb2xhdGUoYSwgYiksIGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIGkodCksIHByaW9yaXR5KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGQzX3RyYW5zaXRpb25fdHdlZW4odGhpcywgXCJzdHlsZS5cIiArIG5hbWUsIHZhbHVlLCBzdHlsZVN0cmluZyk7XG4gIH07XG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuc3R5bGVUd2VlbiA9IGZ1bmN0aW9uKG5hbWUsIHR3ZWVuLCBwcmlvcml0eSkge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgcHJpb3JpdHkgPSBcIlwiO1xuICAgIGZ1bmN0aW9uIHN0eWxlVHdlZW4oZCwgaSkge1xuICAgICAgdmFyIGYgPSB0d2Vlbi5jYWxsKHRoaXMsIGQsIGksIGQzX3dpbmRvdyh0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSkpO1xuICAgICAgcmV0dXJuIGYgJiYgZnVuY3Rpb24odCkge1xuICAgICAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIGYodCksIHByaW9yaXR5KTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnR3ZWVuKFwic3R5bGUuXCIgKyBuYW1lLCBzdHlsZVR3ZWVuKTtcbiAgfTtcbiAgZDNfdHJhbnNpdGlvblByb3RvdHlwZS50ZXh0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gZDNfdHJhbnNpdGlvbl90d2Vlbih0aGlzLCBcInRleHRcIiwgdmFsdWUsIGQzX3RyYW5zaXRpb25fdGV4dCk7XG4gIH07XG4gIGZ1bmN0aW9uIGQzX3RyYW5zaXRpb25fdGV4dChiKSB7XG4gICAgaWYgKGIgPT0gbnVsbCkgYiA9IFwiXCI7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy50ZXh0Q29udGVudCA9IGI7XG4gICAgfTtcbiAgfVxuICBkM190cmFuc2l0aW9uUHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBucyA9IHRoaXMubmFtZXNwYWNlO1xuICAgIHJldHVybiB0aGlzLmVhY2goXCJlbmQudHJhbnNpdGlvblwiLCBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBwO1xuICAgICAgaWYgKHRoaXNbbnNdLmNvdW50IDwgMiAmJiAocCA9IHRoaXMucGFyZW50Tm9kZSkpIHAucmVtb3ZlQ2hpbGQodGhpcyk7XG4gICAgfSk7XG4gIH07XG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuZWFzZSA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgdmFyIGlkID0gdGhpcy5pZCwgbnMgPSB0aGlzLm5hbWVzcGFjZTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHJldHVybiB0aGlzLm5vZGUoKVtuc11baWRdLmVhc2U7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB2YWx1ZSA9IGQzLmVhc2UuYXBwbHkoZDMsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIGQzX3NlbGVjdGlvbl9lYWNoKHRoaXMsIGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIG5vZGVbbnNdW2lkXS5lYXNlID0gdmFsdWU7XG4gICAgfSk7XG4gIH07XG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuZGVsYXkgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciBpZCA9IHRoaXMuaWQsIG5zID0gdGhpcy5uYW1lc3BhY2U7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gdGhpcy5ub2RlKClbbnNdW2lkXS5kZWxheTtcbiAgICByZXR1cm4gZDNfc2VsZWN0aW9uX2VhY2godGhpcywgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBmdW5jdGlvbihub2RlLCBpLCBqKSB7XG4gICAgICBub2RlW25zXVtpZF0uZGVsYXkgPSArdmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBqKTtcbiAgICB9IDogKHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICBub2RlW25zXVtpZF0uZGVsYXkgPSB2YWx1ZTtcbiAgICB9KSk7XG4gIH07XG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuZHVyYXRpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHZhciBpZCA9IHRoaXMuaWQsIG5zID0gdGhpcy5uYW1lc3BhY2U7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gdGhpcy5ub2RlKClbbnNdW2lkXS5kdXJhdGlvbjtcbiAgICByZXR1cm4gZDNfc2VsZWN0aW9uX2VhY2godGhpcywgdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCIgPyBmdW5jdGlvbihub2RlLCBpLCBqKSB7XG4gICAgICBub2RlW25zXVtpZF0uZHVyYXRpb24gPSBNYXRoLm1heCgxLCB2YWx1ZS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGopKTtcbiAgICB9IDogKHZhbHVlID0gTWF0aC5tYXgoMSwgdmFsdWUpLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICBub2RlW25zXVtpZF0uZHVyYXRpb24gPSB2YWx1ZTtcbiAgICB9KSk7XG4gIH07XG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUuZWFjaCA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgdmFyIGlkID0gdGhpcy5pZCwgbnMgPSB0aGlzLm5hbWVzcGFjZTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIHZhciBpbmhlcml0ID0gZDNfdHJhbnNpdGlvbkluaGVyaXQsIGluaGVyaXRJZCA9IGQzX3RyYW5zaXRpb25Jbmhlcml0SWQ7XG4gICAgICB0cnkge1xuICAgICAgICBkM190cmFuc2l0aW9uSW5oZXJpdElkID0gaWQ7XG4gICAgICAgIGQzX3NlbGVjdGlvbl9lYWNoKHRoaXMsIGZ1bmN0aW9uKG5vZGUsIGksIGopIHtcbiAgICAgICAgICBkM190cmFuc2l0aW9uSW5oZXJpdCA9IG5vZGVbbnNdW2lkXTtcbiAgICAgICAgICB0eXBlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgaik7XG4gICAgICAgIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZDNfdHJhbnNpdGlvbkluaGVyaXQgPSBpbmhlcml0O1xuICAgICAgICBkM190cmFuc2l0aW9uSW5oZXJpdElkID0gaW5oZXJpdElkO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkM19zZWxlY3Rpb25fZWFjaCh0aGlzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgIHZhciB0cmFuc2l0aW9uID0gbm9kZVtuc11baWRdO1xuICAgICAgICAodHJhbnNpdGlvbi5ldmVudCB8fCAodHJhbnNpdGlvbi5ldmVudCA9IGQzLmRpc3BhdGNoKFwic3RhcnRcIiwgXCJlbmRcIiwgXCJpbnRlcnJ1cHRcIikpKS5vbih0eXBlLCBsaXN0ZW5lcik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIGQzX3RyYW5zaXRpb25Qcm90b3R5cGUudHJhbnNpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBpZDAgPSB0aGlzLmlkLCBpZDEgPSArK2QzX3RyYW5zaXRpb25JZCwgbnMgPSB0aGlzLm5hbWVzcGFjZSwgc3ViZ3JvdXBzID0gW10sIHN1Ymdyb3VwLCBncm91cCwgbm9kZSwgdHJhbnNpdGlvbjtcbiAgICBmb3IgKHZhciBqID0gMCwgbSA9IHRoaXMubGVuZ3RoOyBqIDwgbTsgaisrKSB7XG4gICAgICBzdWJncm91cHMucHVzaChzdWJncm91cCA9IFtdKTtcbiAgICAgIGZvciAodmFyIGdyb3VwID0gdGhpc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkge1xuICAgICAgICAgIHRyYW5zaXRpb24gPSBub2RlW25zXVtpZDBdO1xuICAgICAgICAgIGQzX3RyYW5zaXRpb25Ob2RlKG5vZGUsIGksIG5zLCBpZDEsIHtcbiAgICAgICAgICAgIHRpbWU6IHRyYW5zaXRpb24udGltZSxcbiAgICAgICAgICAgIGVhc2U6IHRyYW5zaXRpb24uZWFzZSxcbiAgICAgICAgICAgIGRlbGF5OiB0cmFuc2l0aW9uLmRlbGF5ICsgdHJhbnNpdGlvbi5kdXJhdGlvbixcbiAgICAgICAgICAgIGR1cmF0aW9uOiB0cmFuc2l0aW9uLmR1cmF0aW9uXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGQzX3RyYW5zaXRpb24oc3ViZ3JvdXBzLCBucywgaWQxKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfdHJhbnNpdGlvbk5hbWVzcGFjZShuYW1lKSB7XG4gICAgcmV0dXJuIG5hbWUgPT0gbnVsbCA/IFwiX190cmFuc2l0aW9uX19cIiA6IFwiX190cmFuc2l0aW9uX1wiICsgbmFtZSArIFwiX19cIjtcbiAgfVxuICBmdW5jdGlvbiBkM190cmFuc2l0aW9uTm9kZShub2RlLCBpLCBucywgaWQsIGluaGVyaXQpIHtcbiAgICB2YXIgbG9jayA9IG5vZGVbbnNdIHx8IChub2RlW25zXSA9IHtcbiAgICAgIGFjdGl2ZTogMCxcbiAgICAgIGNvdW50OiAwXG4gICAgfSksIHRyYW5zaXRpb24gPSBsb2NrW2lkXSwgdGltZSwgdGltZXIsIGR1cmF0aW9uLCBlYXNlLCB0d2VlbnM7XG4gICAgZnVuY3Rpb24gc2NoZWR1bGUoZWxhcHNlZCkge1xuICAgICAgdmFyIGRlbGF5ID0gdHJhbnNpdGlvbi5kZWxheTtcbiAgICAgIHRpbWVyLnQgPSBkZWxheSArIHRpbWU7XG4gICAgICBpZiAoZGVsYXkgPD0gZWxhcHNlZCkgcmV0dXJuIHN0YXJ0KGVsYXBzZWQgLSBkZWxheSk7XG4gICAgICB0aW1lci5jID0gc3RhcnQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0YXJ0KGVsYXBzZWQpIHtcbiAgICAgIHZhciBhY3RpdmVJZCA9IGxvY2suYWN0aXZlLCBhY3RpdmUgPSBsb2NrW2FjdGl2ZUlkXTtcbiAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgYWN0aXZlLnRpbWVyLmMgPSBudWxsO1xuICAgICAgICBhY3RpdmUudGltZXIudCA9IE5hTjtcbiAgICAgICAgLS1sb2NrLmNvdW50O1xuICAgICAgICBkZWxldGUgbG9ja1thY3RpdmVJZF07XG4gICAgICAgIGFjdGl2ZS5ldmVudCAmJiBhY3RpdmUuZXZlbnQuaW50ZXJydXB0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgYWN0aXZlLmluZGV4KTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGNhbmNlbElkIGluIGxvY2spIHtcbiAgICAgICAgaWYgKCtjYW5jZWxJZCA8IGlkKSB7XG4gICAgICAgICAgdmFyIGNhbmNlbCA9IGxvY2tbY2FuY2VsSWRdO1xuICAgICAgICAgIGNhbmNlbC50aW1lci5jID0gbnVsbDtcbiAgICAgICAgICBjYW5jZWwudGltZXIudCA9IE5hTjtcbiAgICAgICAgICAtLWxvY2suY291bnQ7XG4gICAgICAgICAgZGVsZXRlIGxvY2tbY2FuY2VsSWRdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aW1lci5jID0gdGljaztcbiAgICAgIGQzX3RpbWVyKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGltZXIuYyAmJiB0aWNrKGVsYXBzZWQgfHwgMSkpIHtcbiAgICAgICAgICB0aW1lci5jID0gbnVsbDtcbiAgICAgICAgICB0aW1lci50ID0gTmFOO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgfSwgMCwgdGltZSk7XG4gICAgICBsb2NrLmFjdGl2ZSA9IGlkO1xuICAgICAgdHJhbnNpdGlvbi5ldmVudCAmJiB0cmFuc2l0aW9uLmV2ZW50LnN0YXJ0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSk7XG4gICAgICB0d2VlbnMgPSBbXTtcbiAgICAgIHRyYW5zaXRpb24udHdlZW4uZm9yRWFjaChmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9IHZhbHVlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSkpIHtcbiAgICAgICAgICB0d2VlbnMucHVzaCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgZWFzZSA9IHRyYW5zaXRpb24uZWFzZTtcbiAgICAgIGR1cmF0aW9uID0gdHJhbnNpdGlvbi5kdXJhdGlvbjtcbiAgICB9XG4gICAgZnVuY3Rpb24gdGljayhlbGFwc2VkKSB7XG4gICAgICB2YXIgdCA9IGVsYXBzZWQgLyBkdXJhdGlvbiwgZSA9IGVhc2UodCksIG4gPSB0d2VlbnMubGVuZ3RoO1xuICAgICAgd2hpbGUgKG4gPiAwKSB7XG4gICAgICAgIHR3ZWVuc1stLW5dLmNhbGwobm9kZSwgZSk7XG4gICAgICB9XG4gICAgICBpZiAodCA+PSAxKSB7XG4gICAgICAgIHRyYW5zaXRpb24uZXZlbnQgJiYgdHJhbnNpdGlvbi5ldmVudC5lbmQuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpKTtcbiAgICAgICAgaWYgKC0tbG9jay5jb3VudCkgZGVsZXRlIGxvY2tbaWRdOyBlbHNlIGRlbGV0ZSBub2RlW25zXTtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdHJhbnNpdGlvbikge1xuICAgICAgdGltZSA9IGluaGVyaXQudGltZTtcbiAgICAgIHRpbWVyID0gZDNfdGltZXIoc2NoZWR1bGUsIDAsIHRpbWUpO1xuICAgICAgdHJhbnNpdGlvbiA9IGxvY2tbaWRdID0ge1xuICAgICAgICB0d2VlbjogbmV3IGQzX01hcCgpLFxuICAgICAgICB0aW1lOiB0aW1lLFxuICAgICAgICB0aW1lcjogdGltZXIsXG4gICAgICAgIGRlbGF5OiBpbmhlcml0LmRlbGF5LFxuICAgICAgICBkdXJhdGlvbjogaW5oZXJpdC5kdXJhdGlvbixcbiAgICAgICAgZWFzZTogaW5oZXJpdC5lYXNlLFxuICAgICAgICBpbmRleDogaVxuICAgICAgfTtcbiAgICAgIGluaGVyaXQgPSBudWxsO1xuICAgICAgKytsb2NrLmNvdW50O1xuICAgIH1cbiAgfVxuICBkMy5zdmcuYXhpcyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBzY2FsZSA9IGQzLnNjYWxlLmxpbmVhcigpLCBvcmllbnQgPSBkM19zdmdfYXhpc0RlZmF1bHRPcmllbnQsIGlubmVyVGlja1NpemUgPSA2LCBvdXRlclRpY2tTaXplID0gNiwgdGlja1BhZGRpbmcgPSAzLCB0aWNrQXJndW1lbnRzXyA9IFsgMTAgXSwgdGlja1ZhbHVlcyA9IG51bGwsIHRpY2tGb3JtYXRfO1xuICAgIGZ1bmN0aW9uIGF4aXMoZykge1xuICAgICAgZy5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZyA9IGQzLnNlbGVjdCh0aGlzKTtcbiAgICAgICAgdmFyIHNjYWxlMCA9IHRoaXMuX19jaGFydF9fIHx8IHNjYWxlLCBzY2FsZTEgPSB0aGlzLl9fY2hhcnRfXyA9IHNjYWxlLmNvcHkoKTtcbiAgICAgICAgdmFyIHRpY2tzID0gdGlja1ZhbHVlcyA9PSBudWxsID8gc2NhbGUxLnRpY2tzID8gc2NhbGUxLnRpY2tzLmFwcGx5KHNjYWxlMSwgdGlja0FyZ3VtZW50c18pIDogc2NhbGUxLmRvbWFpbigpIDogdGlja1ZhbHVlcywgdGlja0Zvcm1hdCA9IHRpY2tGb3JtYXRfID09IG51bGwgPyBzY2FsZTEudGlja0Zvcm1hdCA/IHNjYWxlMS50aWNrRm9ybWF0LmFwcGx5KHNjYWxlMSwgdGlja0FyZ3VtZW50c18pIDogZDNfaWRlbnRpdHkgOiB0aWNrRm9ybWF0XywgdGljayA9IGcuc2VsZWN0QWxsKFwiLnRpY2tcIikuZGF0YSh0aWNrcywgc2NhbGUxKSwgdGlja0VudGVyID0gdGljay5lbnRlcigpLmluc2VydChcImdcIiwgXCIuZG9tYWluXCIpLmF0dHIoXCJjbGFzc1wiLCBcInRpY2tcIikuc3R5bGUoXCJvcGFjaXR5XCIsIM61KSwgdGlja0V4aXQgPSBkMy50cmFuc2l0aW9uKHRpY2suZXhpdCgpKS5zdHlsZShcIm9wYWNpdHlcIiwgzrUpLnJlbW92ZSgpLCB0aWNrVXBkYXRlID0gZDMudHJhbnNpdGlvbih0aWNrLm9yZGVyKCkpLnN0eWxlKFwib3BhY2l0eVwiLCAxKSwgdGlja1NwYWNpbmcgPSBNYXRoLm1heChpbm5lclRpY2tTaXplLCAwKSArIHRpY2tQYWRkaW5nLCB0aWNrVHJhbnNmb3JtO1xuICAgICAgICB2YXIgcmFuZ2UgPSBkM19zY2FsZVJhbmdlKHNjYWxlMSksIHBhdGggPSBnLnNlbGVjdEFsbChcIi5kb21haW5cIikuZGF0YShbIDAgXSksIHBhdGhVcGRhdGUgPSAocGF0aC5lbnRlcigpLmFwcGVuZChcInBhdGhcIikuYXR0cihcImNsYXNzXCIsIFwiZG9tYWluXCIpLCBcbiAgICAgICAgZDMudHJhbnNpdGlvbihwYXRoKSk7XG4gICAgICAgIHRpY2tFbnRlci5hcHBlbmQoXCJsaW5lXCIpO1xuICAgICAgICB0aWNrRW50ZXIuYXBwZW5kKFwidGV4dFwiKTtcbiAgICAgICAgdmFyIGxpbmVFbnRlciA9IHRpY2tFbnRlci5zZWxlY3QoXCJsaW5lXCIpLCBsaW5lVXBkYXRlID0gdGlja1VwZGF0ZS5zZWxlY3QoXCJsaW5lXCIpLCB0ZXh0ID0gdGljay5zZWxlY3QoXCJ0ZXh0XCIpLnRleHQodGlja0Zvcm1hdCksIHRleHRFbnRlciA9IHRpY2tFbnRlci5zZWxlY3QoXCJ0ZXh0XCIpLCB0ZXh0VXBkYXRlID0gdGlja1VwZGF0ZS5zZWxlY3QoXCJ0ZXh0XCIpLCBzaWduID0gb3JpZW50ID09PSBcInRvcFwiIHx8IG9yaWVudCA9PT0gXCJsZWZ0XCIgPyAtMSA6IDEsIHgxLCB4MiwgeTEsIHkyO1xuICAgICAgICBpZiAob3JpZW50ID09PSBcImJvdHRvbVwiIHx8IG9yaWVudCA9PT0gXCJ0b3BcIikge1xuICAgICAgICAgIHRpY2tUcmFuc2Zvcm0gPSBkM19zdmdfYXhpc1gsIHgxID0gXCJ4XCIsIHkxID0gXCJ5XCIsIHgyID0gXCJ4MlwiLCB5MiA9IFwieTJcIjtcbiAgICAgICAgICB0ZXh0LmF0dHIoXCJkeVwiLCBzaWduIDwgMCA/IFwiMGVtXCIgOiBcIi43MWVtXCIpLnN0eWxlKFwidGV4dC1hbmNob3JcIiwgXCJtaWRkbGVcIik7XG4gICAgICAgICAgcGF0aFVwZGF0ZS5hdHRyKFwiZFwiLCBcIk1cIiArIHJhbmdlWzBdICsgXCIsXCIgKyBzaWduICogb3V0ZXJUaWNrU2l6ZSArIFwiVjBIXCIgKyByYW5nZVsxXSArIFwiVlwiICsgc2lnbiAqIG91dGVyVGlja1NpemUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRpY2tUcmFuc2Zvcm0gPSBkM19zdmdfYXhpc1ksIHgxID0gXCJ5XCIsIHkxID0gXCJ4XCIsIHgyID0gXCJ5MlwiLCB5MiA9IFwieDJcIjtcbiAgICAgICAgICB0ZXh0LmF0dHIoXCJkeVwiLCBcIi4zMmVtXCIpLnN0eWxlKFwidGV4dC1hbmNob3JcIiwgc2lnbiA8IDAgPyBcImVuZFwiIDogXCJzdGFydFwiKTtcbiAgICAgICAgICBwYXRoVXBkYXRlLmF0dHIoXCJkXCIsIFwiTVwiICsgc2lnbiAqIG91dGVyVGlja1NpemUgKyBcIixcIiArIHJhbmdlWzBdICsgXCJIMFZcIiArIHJhbmdlWzFdICsgXCJIXCIgKyBzaWduICogb3V0ZXJUaWNrU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGluZUVudGVyLmF0dHIoeTIsIHNpZ24gKiBpbm5lclRpY2tTaXplKTtcbiAgICAgICAgdGV4dEVudGVyLmF0dHIoeTEsIHNpZ24gKiB0aWNrU3BhY2luZyk7XG4gICAgICAgIGxpbmVVcGRhdGUuYXR0cih4MiwgMCkuYXR0cih5Miwgc2lnbiAqIGlubmVyVGlja1NpemUpO1xuICAgICAgICB0ZXh0VXBkYXRlLmF0dHIoeDEsIDApLmF0dHIoeTEsIHNpZ24gKiB0aWNrU3BhY2luZyk7XG4gICAgICAgIGlmIChzY2FsZTEucmFuZ2VCYW5kKSB7XG4gICAgICAgICAgdmFyIHggPSBzY2FsZTEsIGR4ID0geC5yYW5nZUJhbmQoKSAvIDI7XG4gICAgICAgICAgc2NhbGUwID0gc2NhbGUxID0gZnVuY3Rpb24oZCkge1xuICAgICAgICAgICAgcmV0dXJuIHgoZCkgKyBkeDtcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKHNjYWxlMC5yYW5nZUJhbmQpIHtcbiAgICAgICAgICBzY2FsZTAgPSBzY2FsZTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGlja0V4aXQuY2FsbCh0aWNrVHJhbnNmb3JtLCBzY2FsZTEsIHNjYWxlMCk7XG4gICAgICAgIH1cbiAgICAgICAgdGlja0VudGVyLmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUwLCBzY2FsZTEpO1xuICAgICAgICB0aWNrVXBkYXRlLmNhbGwodGlja1RyYW5zZm9ybSwgc2NhbGUxLCBzY2FsZTEpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGF4aXMuc2NhbGUgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBzY2FsZTtcbiAgICAgIHNjYWxlID0geDtcbiAgICAgIHJldHVybiBheGlzO1xuICAgIH07XG4gICAgYXhpcy5vcmllbnQgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvcmllbnQ7XG4gICAgICBvcmllbnQgPSB4IGluIGQzX3N2Z19heGlzT3JpZW50cyA/IHggKyBcIlwiIDogZDNfc3ZnX2F4aXNEZWZhdWx0T3JpZW50O1xuICAgICAgcmV0dXJuIGF4aXM7XG4gICAgfTtcbiAgICBheGlzLnRpY2tzID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aWNrQXJndW1lbnRzXztcbiAgICAgIHRpY2tBcmd1bWVudHNfID0gZDNfYXJyYXkoYXJndW1lbnRzKTtcbiAgICAgIHJldHVybiBheGlzO1xuICAgIH07XG4gICAgYXhpcy50aWNrVmFsdWVzID0gZnVuY3Rpb24oeCkge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gdGlja1ZhbHVlcztcbiAgICAgIHRpY2tWYWx1ZXMgPSB4O1xuICAgICAgcmV0dXJuIGF4aXM7XG4gICAgfTtcbiAgICBheGlzLnRpY2tGb3JtYXQgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aWNrRm9ybWF0XztcbiAgICAgIHRpY2tGb3JtYXRfID0geDtcbiAgICAgIHJldHVybiBheGlzO1xuICAgIH07XG4gICAgYXhpcy50aWNrU2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHZhciBuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIGlmICghbikgcmV0dXJuIGlubmVyVGlja1NpemU7XG4gICAgICBpbm5lclRpY2tTaXplID0gK3g7XG4gICAgICBvdXRlclRpY2tTaXplID0gK2FyZ3VtZW50c1tuIC0gMV07XG4gICAgICByZXR1cm4gYXhpcztcbiAgICB9O1xuICAgIGF4aXMuaW5uZXJUaWNrU2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGlubmVyVGlja1NpemU7XG4gICAgICBpbm5lclRpY2tTaXplID0gK3g7XG4gICAgICByZXR1cm4gYXhpcztcbiAgICB9O1xuICAgIGF4aXMub3V0ZXJUaWNrU2l6ZSA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG91dGVyVGlja1NpemU7XG4gICAgICBvdXRlclRpY2tTaXplID0gK3g7XG4gICAgICByZXR1cm4gYXhpcztcbiAgICB9O1xuICAgIGF4aXMudGlja1BhZGRpbmcgPSBmdW5jdGlvbih4KSB7XG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB0aWNrUGFkZGluZztcbiAgICAgIHRpY2tQYWRkaW5nID0gK3g7XG4gICAgICByZXR1cm4gYXhpcztcbiAgICB9O1xuICAgIGF4aXMudGlja1N1YmRpdmlkZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggJiYgYXhpcztcbiAgICB9O1xuICAgIHJldHVybiBheGlzO1xuICB9O1xuICB2YXIgZDNfc3ZnX2F4aXNEZWZhdWx0T3JpZW50ID0gXCJib3R0b21cIiwgZDNfc3ZnX2F4aXNPcmllbnRzID0ge1xuICAgIHRvcDogMSxcbiAgICByaWdodDogMSxcbiAgICBib3R0b206IDEsXG4gICAgbGVmdDogMVxuICB9O1xuICBmdW5jdGlvbiBkM19zdmdfYXhpc1goc2VsZWN0aW9uLCB4MCwgeDEpIHtcbiAgICBzZWxlY3Rpb24uYXR0cihcInRyYW5zZm9ybVwiLCBmdW5jdGlvbihkKSB7XG4gICAgICB2YXIgdjAgPSB4MChkKTtcbiAgICAgIHJldHVybiBcInRyYW5zbGF0ZShcIiArIChpc0Zpbml0ZSh2MCkgPyB2MCA6IHgxKGQpKSArIFwiLDApXCI7XG4gICAgfSk7XG4gIH1cbiAgZnVuY3Rpb24gZDNfc3ZnX2F4aXNZKHNlbGVjdGlvbiwgeTAsIHkxKSB7XG4gICAgc2VsZWN0aW9uLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgZnVuY3Rpb24oZCkge1xuICAgICAgdmFyIHYwID0geTAoZCk7XG4gICAgICByZXR1cm4gXCJ0cmFuc2xhdGUoMCxcIiArIChpc0Zpbml0ZSh2MCkgPyB2MCA6IHkxKGQpKSArIFwiKVwiO1xuICAgIH0pO1xuICB9XG4gIGQzLnN2Zy5icnVzaCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBldmVudCA9IGQzX2V2ZW50RGlzcGF0Y2goYnJ1c2gsIFwiYnJ1c2hzdGFydFwiLCBcImJydXNoXCIsIFwiYnJ1c2hlbmRcIiksIHggPSBudWxsLCB5ID0gbnVsbCwgeEV4dGVudCA9IFsgMCwgMCBdLCB5RXh0ZW50ID0gWyAwLCAwIF0sIHhFeHRlbnREb21haW4sIHlFeHRlbnREb21haW4sIHhDbGFtcCA9IHRydWUsIHlDbGFtcCA9IHRydWUsIHJlc2l6ZXMgPSBkM19zdmdfYnJ1c2hSZXNpemVzWzBdO1xuICAgIGZ1bmN0aW9uIGJydXNoKGcpIHtcbiAgICAgIGcuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGcgPSBkMy5zZWxlY3QodGhpcykuc3R5bGUoXCJwb2ludGVyLWV2ZW50c1wiLCBcImFsbFwiKS5zdHlsZShcIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvclwiLCBcInJnYmEoMCwwLDAsMClcIikub24oXCJtb3VzZWRvd24uYnJ1c2hcIiwgYnJ1c2hzdGFydCkub24oXCJ0b3VjaHN0YXJ0LmJydXNoXCIsIGJydXNoc3RhcnQpO1xuICAgICAgICB2YXIgYmFja2dyb3VuZCA9IGcuc2VsZWN0QWxsKFwiLmJhY2tncm91bmRcIikuZGF0YShbIDAgXSk7XG4gICAgICAgIGJhY2tncm91bmQuZW50ZXIoKS5hcHBlbmQoXCJyZWN0XCIpLmF0dHIoXCJjbGFzc1wiLCBcImJhY2tncm91bmRcIikuc3R5bGUoXCJ2aXNpYmlsaXR5XCIsIFwiaGlkZGVuXCIpLnN0eWxlKFwiY3Vyc29yXCIsIFwiY3Jvc3NoYWlyXCIpO1xuICAgICAgICBnLnNlbGVjdEFsbChcIi5leHRlbnRcIikuZGF0YShbIDAgXSkuZW50ZXIoKS5hcHBlbmQoXCJyZWN0XCIpLmF0dHIoXCJjbGFzc1wiLCBcImV4dGVudFwiKS5zdHlsZShcImN1cnNvclwiLCBcIm1vdmVcIik7XG4gICAgICAgIHZhciByZXNpemUgPSBnLnNlbGVjdEFsbChcIi5yZXNpemVcIikuZGF0YShyZXNpemVzLCBkM19pZGVudGl0eSk7XG4gICAgICAgIHJlc2l6ZS5leGl0KCkucmVtb3ZlKCk7XG4gICAgICAgIHJlc2l6ZS5lbnRlcigpLmFwcGVuZChcImdcIikuYXR0cihcImNsYXNzXCIsIGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgICByZXR1cm4gXCJyZXNpemUgXCIgKyBkO1xuICAgICAgICB9KS5zdHlsZShcImN1cnNvclwiLCBmdW5jdGlvbihkKSB7XG4gICAgICAgICAgcmV0dXJuIGQzX3N2Z19icnVzaEN1cnNvcltkXTtcbiAgICAgICAgfSkuYXBwZW5kKFwicmVjdFwiKS5hdHRyKFwieFwiLCBmdW5jdGlvbihkKSB7XG4gICAgICAgICAgcmV0dXJuIC9bZXddJC8udGVzdChkKSA/IC0zIDogbnVsbDtcbiAgICAgICAgfSkuYXR0cihcInlcIiwgZnVuY3Rpb24oZCkge1xuICAgICAgICAgIHJldHVybiAvXltuc10vLnRlc3QoZCkgPyAtMyA6IG51bGw7XG4gICAgICAgIH0pLmF0dHIoXCJ3aWR0aFwiLCA2KS5hdHRyKFwiaGVpZ2h0XCIsIDYpLnN0eWxlKFwidmlzaWJpbGl0eVwiLCBcImhpZGRlblwiKTtcbiAgICAgICAgcmVzaXplLnN0eWxlKFwiZGlzcGxheVwiLCBicnVzaC5lbXB0eSgpID8gXCJub25lXCIgOiBudWxsKTtcbiAgICAgICAgdmFyIGdVcGRhdGUgPSBkMy50cmFuc2l0aW9uKGcpLCBiYWNrZ3JvdW5kVXBkYXRlID0gZDMudHJhbnNpdGlvbihiYWNrZ3JvdW5kKSwgcmFuZ2U7XG4gICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgcmFuZ2UgPSBkM19zY2FsZVJhbmdlKHgpO1xuICAgICAgICAgIGJhY2tncm91bmRVcGRhdGUuYXR0cihcInhcIiwgcmFuZ2VbMF0pLmF0dHIoXCJ3aWR0aFwiLCByYW5nZVsxXSAtIHJhbmdlWzBdKTtcbiAgICAgICAgICByZWRyYXdYKGdVcGRhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh5KSB7XG4gICAgICAgICAgcmFuZ2UgPSBkM19zY2FsZVJhbmdlKHkpO1xuICAgICAgICAgIGJhY2tncm91bmRVcGRhdGUuYXR0cihcInlcIiwgcmFuZ2VbMF0pLmF0dHIoXCJoZWlnaHRcIiwgcmFuZ2VbMV0gLSByYW5nZVswXSk7XG4gICAgICAgICAgcmVkcmF3WShnVXBkYXRlKTtcbiAgICAgICAgfVxuICAgICAgICByZWRyYXcoZ1VwZGF0ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgYnJ1c2guZXZlbnQgPSBmdW5jdGlvbihnKSB7XG4gICAgICBnLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBldmVudF8gPSBldmVudC5vZih0aGlzLCBhcmd1bWVudHMpLCBleHRlbnQxID0ge1xuICAgICAgICAgIHg6IHhFeHRlbnQsXG4gICAgICAgICAgeTogeUV4dGVudCxcbiAgICAgICAgICBpOiB4RXh0ZW50RG9tYWluLFxuICAgICAgICAgIGo6IHlFeHRlbnREb21haW5cbiAgICAgICAgfSwgZXh0ZW50MCA9IHRoaXMuX19jaGFydF9fIHx8IGV4dGVudDE7XG4gICAgICAgIHRoaXMuX19jaGFydF9fID0gZXh0ZW50MTtcbiAgICAgICAgaWYgKGQzX3RyYW5zaXRpb25Jbmhlcml0SWQpIHtcbiAgICAgICAgICBkMy5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmVhY2goXCJzdGFydC5icnVzaFwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHhFeHRlbnREb21haW4gPSBleHRlbnQwLmk7XG4gICAgICAgICAgICB5RXh0ZW50RG9tYWluID0gZXh0ZW50MC5qO1xuICAgICAgICAgICAgeEV4dGVudCA9IGV4dGVudDAueDtcbiAgICAgICAgICAgIHlFeHRlbnQgPSBleHRlbnQwLnk7XG4gICAgICAgICAgICBldmVudF8oe1xuICAgICAgICAgICAgICB0eXBlOiBcImJydXNoc3RhcnRcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkudHdlZW4oXCJicnVzaDpicnVzaFwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciB4aSA9IGQzX2ludGVycG9sYXRlQXJyYXkoeEV4dGVudCwgZXh0ZW50MS54KSwgeWkgPSBkM19pbnRlcnBvbGF0ZUFycmF5KHlFeHRlbnQsIGV4dGVudDEueSk7XG4gICAgICAgICAgICB4RXh0ZW50RG9tYWluID0geUV4dGVudERvbWFpbiA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICB4RXh0ZW50ID0gZXh0ZW50MS54ID0geGkodCk7XG4gICAgICAgICAgICAgIHlFeHRlbnQgPSBleHRlbnQxLnkgPSB5aSh0KTtcbiAgICAgICAgICAgICAgZXZlbnRfKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImJydXNoXCIsXG4gICAgICAgICAgICAgICAgbW9kZTogXCJyZXNpemVcIlxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSkuZWFjaChcImVuZC5icnVzaFwiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHhFeHRlbnREb21haW4gPSBleHRlbnQxLmk7XG4gICAgICAgICAgICB5RXh0ZW50RG9tYWluID0gZXh0ZW50MS5qO1xuICAgICAgICAgICAgZXZlbnRfKHtcbiAgICAgICAgICAgICAgdHlwZTogXCJicnVzaFwiLFxuICAgICAgICAgICAgICBtb2RlOiBcInJlc2l6ZVwiXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGV2ZW50Xyh7XG4gICAgICAgICAgICAgIHR5cGU6IFwiYnJ1c2hlbmRcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXZlbnRfKHtcbiAgICAgICAgICAgIHR5cGU6IFwiYnJ1c2hzdGFydFwiXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZXZlbnRfKHtcbiAgICAgICAgICAgIHR5cGU6IFwiYnJ1c2hcIixcbiAgICAgICAgICAgIG1vZGU6IFwicmVzaXplXCJcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBldmVudF8oe1xuICAgICAgICAgICAgdHlwZTogXCJicnVzaGVuZFwiXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG4gICAgZnVuY3Rpb24gcmVkcmF3KGcpIHtcbiAgICAgIGcuc2VsZWN0QWxsKFwiLnJlc2l6ZVwiKS5hdHRyKFwidHJhbnNmb3JtXCIsIGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgcmV0dXJuIFwidHJhbnNsYXRlKFwiICsgeEV4dGVudFsrL2UkLy50ZXN0KGQpXSArIFwiLFwiICsgeUV4dGVudFsrL15zLy50ZXN0KGQpXSArIFwiKVwiO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlZHJhd1goZykge1xuICAgICAgZy5zZWxlY3QoXCIuZXh0ZW50XCIpLmF0dHIoXCJ4XCIsIHhFeHRlbnRbMF0pO1xuICAgICAgZy5zZWxlY3RBbGwoXCIuZXh0ZW50LC5uPnJlY3QsLnM+cmVjdFwiKS5hdHRyKFwid2lkdGhcIiwgeEV4dGVudFsxXSAtIHhFeHRlbnRbMF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiByZWRyYXdZKGcpIHtcbiAgICAgIGcuc2VsZWN0KFwiLmV4dGVudFwiKS5hdHRyKFwieVwiLCB5RXh0ZW50WzBdKTtcbiAgICAgIGcuc2VsZWN0QWxsKFwiLmV4dGVudCwuZT5yZWN0LC53PnJlY3RcIikuYXR0cihcImhlaWdodFwiLCB5RXh0ZW50WzFdIC0geUV4dGVudFswXSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGJydXNoc3RhcnQoKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gdGhpcywgZXZlbnRUYXJnZXQgPSBkMy5zZWxlY3QoZDMuZXZlbnQudGFyZ2V0KSwgZXZlbnRfID0gZXZlbnQub2YodGFyZ2V0LCBhcmd1bWVudHMpLCBnID0gZDMuc2VsZWN0KHRhcmdldCksIHJlc2l6aW5nID0gZXZlbnRUYXJnZXQuZGF0dW0oKSwgcmVzaXppbmdYID0gIS9eKG58cykkLy50ZXN0KHJlc2l6aW5nKSAmJiB4LCByZXNpemluZ1kgPSAhL14oZXx3KSQvLnRlc3QocmVzaXppbmcpICYmIHksIGRyYWdnaW5nID0gZXZlbnRUYXJnZXQuY2xhc3NlZChcImV4dGVudFwiKSwgZHJhZ1Jlc3RvcmUgPSBkM19ldmVudF9kcmFnU3VwcHJlc3ModGFyZ2V0KSwgY2VudGVyLCBvcmlnaW4gPSBkMy5tb3VzZSh0YXJnZXQpLCBvZmZzZXQ7XG4gICAgICB2YXIgdyA9IGQzLnNlbGVjdChkM193aW5kb3codGFyZ2V0KSkub24oXCJrZXlkb3duLmJydXNoXCIsIGtleWRvd24pLm9uKFwia2V5dXAuYnJ1c2hcIiwga2V5dXApO1xuICAgICAgaWYgKGQzLmV2ZW50LmNoYW5nZWRUb3VjaGVzKSB7XG4gICAgICAgIHcub24oXCJ0b3VjaG1vdmUuYnJ1c2hcIiwgYnJ1c2htb3ZlKS5vbihcInRvdWNoZW5kLmJydXNoXCIsIGJydXNoZW5kKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHcub24oXCJtb3VzZW1vdmUuYnJ1c2hcIiwgYnJ1c2htb3ZlKS5vbihcIm1vdXNldXAuYnJ1c2hcIiwgYnJ1c2hlbmQpO1xuICAgICAgfVxuICAgICAgZy5pbnRlcnJ1cHQoKS5zZWxlY3RBbGwoXCIqXCIpLmludGVycnVwdCgpO1xuICAgICAgaWYgKGRyYWdnaW5nKSB7XG4gICAgICAgIG9yaWdpblswXSA9IHhFeHRlbnRbMF0gLSBvcmlnaW5bMF07XG4gICAgICAgIG9yaWdpblsxXSA9IHlFeHRlbnRbMF0gLSBvcmlnaW5bMV07XG4gICAgICB9IGVsc2UgaWYgKHJlc2l6aW5nKSB7XG4gICAgICAgIHZhciBleCA9ICsvdyQvLnRlc3QocmVzaXppbmcpLCBleSA9ICsvXm4vLnRlc3QocmVzaXppbmcpO1xuICAgICAgICBvZmZzZXQgPSBbIHhFeHRlbnRbMSAtIGV4XSAtIG9yaWdpblswXSwgeUV4dGVudFsxIC0gZXldIC0gb3JpZ2luWzFdIF07XG4gICAgICAgIG9yaWdpblswXSA9IHhFeHRlbnRbZXhdO1xuICAgICAgICBvcmlnaW5bMV0gPSB5RXh0ZW50W2V5XTtcbiAgICAgIH0gZWxzZSBpZiAoZDMuZXZlbnQuYWx0S2V5KSBjZW50ZXIgPSBvcmlnaW4uc2xpY2UoKTtcbiAgICAgIGcuc3R5bGUoXCJwb2ludGVyLWV2ZW50c1wiLCBcIm5vbmVcIikuc2VsZWN0QWxsKFwiLnJlc2l6ZVwiKS5zdHlsZShcImRpc3BsYXlcIiwgbnVsbCk7XG4gICAgICBkMy5zZWxlY3QoXCJib2R5XCIpLnN0eWxlKFwiY3Vyc29yXCIsIGV2ZW50VGFyZ2V0LnN0eWxlKFwiY3Vyc29yXCIpKTtcbiAgICAgIGV2ZW50Xyh7XG4gICAgICAgIHR5cGU6IFwiYnJ1c2hzdGFydFwiXG4gICAgICB9KTtcbiAgICAgIGJydXNobW92ZSgpO1xuICAgICAgZnVuY3Rpb24ga2V5ZG93bigpIHtcbiAgICAgICAgaWYgKGQzLmV2ZW50LmtleUNvZGUgPT0gMzIpIHtcbiAgICAgICAgICBpZiAoIWRyYWdnaW5nKSB7XG4gICAgICAgICAgICBjZW50ZXIgPSBudWxsO1xuICAgICAgICAgICAgb3JpZ2luWzBdIC09IHhFeHRlbnRbMV07XG4gICAgICAgICAgICBvcmlnaW5bMV0gLT0geUV4dGVudFsxXTtcbiAgICAgICAgICAgIGRyYWdnaW5nID0gMjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZDNfZXZlbnRQcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBrZXl1cCgpIHtcbiAgICAgICAgaWYgKGQzLmV2ZW50LmtleUNvZGUgPT0gMzIgJiYgZHJhZ2dpbmcgPT0gMikge1xuICAgICAgICAgIG9yaWdpblswXSArPSB4RXh0ZW50WzFdO1xuICAgICAgICAgIG9yaWdpblsxXSArPSB5RXh0ZW50WzFdO1xuICAgICAgICAgIGRyYWdnaW5nID0gMDtcbiAgICAgICAgICBkM19ldmVudFByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGJydXNobW92ZSgpIHtcbiAgICAgICAgdmFyIHBvaW50ID0gZDMubW91c2UodGFyZ2V0KSwgbW92ZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKG9mZnNldCkge1xuICAgICAgICAgIHBvaW50WzBdICs9IG9mZnNldFswXTtcbiAgICAgICAgICBwb2ludFsxXSArPSBvZmZzZXRbMV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkcmFnZ2luZykge1xuICAgICAgICAgIGlmIChkMy5ldmVudC5hbHRLZXkpIHtcbiAgICAgICAgICAgIGlmICghY2VudGVyKSBjZW50ZXIgPSBbICh4RXh0ZW50WzBdICsgeEV4dGVudFsxXSkgLyAyLCAoeUV4dGVudFswXSArIHlFeHRlbnRbMV0pIC8gMiBdO1xuICAgICAgICAgICAgb3JpZ2luWzBdID0geEV4dGVudFsrKHBvaW50WzBdIDwgY2VudGVyWzBdKV07XG4gICAgICAgICAgICBvcmlnaW5bMV0gPSB5RXh0ZW50WysocG9pbnRbMV0gPCBjZW50ZXJbMV0pXTtcbiAgICAgICAgICB9IGVsc2UgY2VudGVyID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzaXppbmdYICYmIG1vdmUxKHBvaW50LCB4LCAwKSkge1xuICAgICAgICAgIHJlZHJhd1goZyk7XG4gICAgICAgICAgbW92ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNpemluZ1kgJiYgbW92ZTEocG9pbnQsIHksIDEpKSB7XG4gICAgICAgICAgcmVkcmF3WShnKTtcbiAgICAgICAgICBtb3ZlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vdmVkKSB7XG4gICAgICAgICAgcmVkcmF3KGcpO1xuICAgICAgICAgIGV2ZW50Xyh7XG4gICAgICAgICAgICB0eXBlOiBcImJydXNoXCIsXG4gICAgICAgICAgICBtb2RlOiBkcmFnZ2luZyA/IFwibW92ZVwiIDogXCJyZXNpemVcIlxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBtb3ZlMShwb2ludCwgc2NhbGUsIGkpIHtcbiAgICAgICAgdmFyIHJhbmdlID0gZDNfc2NhbGVSYW5nZShzY2FsZSksIHIwID0gcmFuZ2VbMF0sIHIxID0gcmFuZ2VbMV0sIHBvc2l0aW9uID0gb3JpZ2luW2ldLCBleHRlbnQgPSBpID8geUV4dGVudCA6IHhFeHRlbnQsIHNpemUgPSBleHRlbnRbMV0gLSBleHRlbnRbMF0sIG1pbiwgbWF4O1xuICAgICAgICBpZiAoZHJhZ2dpbmcpIHtcbiAgICAgICAgICByMCAtPSBwb3NpdGlvbjtcbiAgICAgICAgICByMSAtPSBzaXplICsgcG9zaXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbWluID0gKGkgPyB5Q2xhbXAgOiB4Q2xhbXApID8gTWF0aC5tYXgocjAsIE1hdGgubWluKHIxLCBwb2ludFtpXSkpIDogcG9pbnRbaV07XG4gICAgICAgIGlmIChkcmFnZ2luZykge1xuICAgICAgICAgIG1heCA9IChtaW4gKz0gcG9zaXRpb24pICsgc2l6ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY2VudGVyKSBwb3NpdGlvbiA9IE1hdGgubWF4KHIwLCBNYXRoLm1pbihyMSwgMiAqIGNlbnRlcltpXSAtIG1pbikpO1xuICAgICAgICAgIGlmIChwb3NpdGlvbiA8IG1pbikge1xuICAgICAgICAgICAgbWF4ID0gbWluO1xuICAgICAgICAgICAgbWluID0gcG9zaXRpb247XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1heCA9IHBvc2l0aW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0ZW50WzBdICE9IG1pbiB8fCBleHRlbnRbMV0gIT0gbWF4KSB7XG4gICAgICAgICAgaWYgKGkpIHlFeHRlbnREb21haW4gPSBudWxsOyBlbHNlIHhFeHRlbnREb21haW4gPSBudWxsO1xuICAgICAgICAgIGV4dGVudFswXSA9IG1pbjtcbiAgICAgICAgICBleHRlbnRbMV0gPSBtYXg7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGJydXNoZW5kKCkge1xuICAgICAgICBicnVzaG1vdmUoKTtcbiAgICAgICAgZy5zdHlsZShcInBvaW50ZXItZXZlbnRzXCIsIFwiYWxsXCIpLnNlbGVjdEFsbChcIi5yZXNpemVcIikuc3R5bGUoXCJkaXNwbGF5XCIsIGJydXNoLmVtcHR5KCkgPyBcIm5vbmVcIiA6IG51bGwpO1xuICAgICAgICBkMy5zZWxlY3QoXCJib2R5XCIpLnN0eWxlKFwiY3Vyc29yXCIsIG51bGwpO1xuICAgICAgICB3Lm9uKFwibW91c2Vtb3ZlLmJydXNoXCIsIG51bGwpLm9uKFwibW91c2V1cC5icnVzaFwiLCBudWxsKS5vbihcInRvdWNobW92ZS5icnVzaFwiLCBudWxsKS5vbihcInRvdWNoZW5kLmJydXNoXCIsIG51bGwpLm9uKFwia2V5ZG93bi5icnVzaFwiLCBudWxsKS5vbihcImtleXVwLmJydXNoXCIsIG51bGwpO1xuICAgICAgICBkcmFnUmVzdG9yZSgpO1xuICAgICAgICBldmVudF8oe1xuICAgICAgICAgIHR5cGU6IFwiYnJ1c2hlbmRcIlxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgYnJ1c2gueCA9IGZ1bmN0aW9uKHopIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHg7XG4gICAgICB4ID0gejtcbiAgICAgIHJlc2l6ZXMgPSBkM19zdmdfYnJ1c2hSZXNpemVzWyF4IDw8IDEgfCAheV07XG4gICAgICByZXR1cm4gYnJ1c2g7XG4gICAgfTtcbiAgICBicnVzaC55ID0gZnVuY3Rpb24oeikge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTtcbiAgICAgIHkgPSB6O1xuICAgICAgcmVzaXplcyA9IGQzX3N2Z19icnVzaFJlc2l6ZXNbIXggPDwgMSB8ICF5XTtcbiAgICAgIHJldHVybiBicnVzaDtcbiAgICB9O1xuICAgIGJydXNoLmNsYW1wID0gZnVuY3Rpb24oeikge1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geCAmJiB5ID8gWyB4Q2xhbXAsIHlDbGFtcCBdIDogeCA/IHhDbGFtcCA6IHkgPyB5Q2xhbXAgOiBudWxsO1xuICAgICAgaWYgKHggJiYgeSkgeENsYW1wID0gISF6WzBdLCB5Q2xhbXAgPSAhIXpbMV07IGVsc2UgaWYgKHgpIHhDbGFtcCA9ICEhejsgZWxzZSBpZiAoeSkgeUNsYW1wID0gISF6O1xuICAgICAgcmV0dXJuIGJydXNoO1xuICAgIH07XG4gICAgYnJ1c2guZXh0ZW50ID0gZnVuY3Rpb24oeikge1xuICAgICAgdmFyIHgwLCB4MSwgeTAsIHkxLCB0O1xuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIGlmICh4KSB7XG4gICAgICAgICAgaWYgKHhFeHRlbnREb21haW4pIHtcbiAgICAgICAgICAgIHgwID0geEV4dGVudERvbWFpblswXSwgeDEgPSB4RXh0ZW50RG9tYWluWzFdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB4MCA9IHhFeHRlbnRbMF0sIHgxID0geEV4dGVudFsxXTtcbiAgICAgICAgICAgIGlmICh4LmludmVydCkgeDAgPSB4LmludmVydCh4MCksIHgxID0geC5pbnZlcnQoeDEpO1xuICAgICAgICAgICAgaWYgKHgxIDwgeDApIHQgPSB4MCwgeDAgPSB4MSwgeDEgPSB0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoeSkge1xuICAgICAgICAgIGlmICh5RXh0ZW50RG9tYWluKSB7XG4gICAgICAgICAgICB5MCA9IHlFeHRlbnREb21haW5bMF0sIHkxID0geUV4dGVudERvbWFpblsxXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgeTAgPSB5RXh0ZW50WzBdLCB5MSA9IHlFeHRlbnRbMV07XG4gICAgICAgICAgICBpZiAoeS5pbnZlcnQpIHkwID0geS5pbnZlcnQoeTApLCB5MSA9IHkuaW52ZXJ0KHkxKTtcbiAgICAgICAgICAgIGlmICh5MSA8IHkwKSB0ID0geTAsIHkwID0geTEsIHkxID0gdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHggJiYgeSA/IFsgWyB4MCwgeTAgXSwgWyB4MSwgeTEgXSBdIDogeCA/IFsgeDAsIHgxIF0gOiB5ICYmIFsgeTAsIHkxIF07XG4gICAgICB9XG4gICAgICBpZiAoeCkge1xuICAgICAgICB4MCA9IHpbMF0sIHgxID0gelsxXTtcbiAgICAgICAgaWYgKHkpIHgwID0geDBbMF0sIHgxID0geDFbMF07XG4gICAgICAgIHhFeHRlbnREb21haW4gPSBbIHgwLCB4MSBdO1xuICAgICAgICBpZiAoeC5pbnZlcnQpIHgwID0geCh4MCksIHgxID0geCh4MSk7XG4gICAgICAgIGlmICh4MSA8IHgwKSB0ID0geDAsIHgwID0geDEsIHgxID0gdDtcbiAgICAgICAgaWYgKHgwICE9IHhFeHRlbnRbMF0gfHwgeDEgIT0geEV4dGVudFsxXSkgeEV4dGVudCA9IFsgeDAsIHgxIF07XG4gICAgICB9XG4gICAgICBpZiAoeSkge1xuICAgICAgICB5MCA9IHpbMF0sIHkxID0gelsxXTtcbiAgICAgICAgaWYgKHgpIHkwID0geTBbMV0sIHkxID0geTFbMV07XG4gICAgICAgIHlFeHRlbnREb21haW4gPSBbIHkwLCB5MSBdO1xuICAgICAgICBpZiAoeS5pbnZlcnQpIHkwID0geSh5MCksIHkxID0geSh5MSk7XG4gICAgICAgIGlmICh5MSA8IHkwKSB0ID0geTAsIHkwID0geTEsIHkxID0gdDtcbiAgICAgICAgaWYgKHkwICE9IHlFeHRlbnRbMF0gfHwgeTEgIT0geUV4dGVudFsxXSkgeUV4dGVudCA9IFsgeTAsIHkxIF07XG4gICAgICB9XG4gICAgICByZXR1cm4gYnJ1c2g7XG4gICAgfTtcbiAgICBicnVzaC5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKCFicnVzaC5lbXB0eSgpKSB7XG4gICAgICAgIHhFeHRlbnQgPSBbIDAsIDAgXSwgeUV4dGVudCA9IFsgMCwgMCBdO1xuICAgICAgICB4RXh0ZW50RG9tYWluID0geUV4dGVudERvbWFpbiA9IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gYnJ1c2g7XG4gICAgfTtcbiAgICBicnVzaC5lbXB0eSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuICEheCAmJiB4RXh0ZW50WzBdID09IHhFeHRlbnRbMV0gfHwgISF5ICYmIHlFeHRlbnRbMF0gPT0geUV4dGVudFsxXTtcbiAgICB9O1xuICAgIHJldHVybiBkMy5yZWJpbmQoYnJ1c2gsIGV2ZW50LCBcIm9uXCIpO1xuICB9O1xuICB2YXIgZDNfc3ZnX2JydXNoQ3Vyc29yID0ge1xuICAgIG46IFwibnMtcmVzaXplXCIsXG4gICAgZTogXCJldy1yZXNpemVcIixcbiAgICBzOiBcIm5zLXJlc2l6ZVwiLFxuICAgIHc6IFwiZXctcmVzaXplXCIsXG4gICAgbnc6IFwibndzZS1yZXNpemVcIixcbiAgICBuZTogXCJuZXN3LXJlc2l6ZVwiLFxuICAgIHNlOiBcIm53c2UtcmVzaXplXCIsXG4gICAgc3c6IFwibmVzdy1yZXNpemVcIlxuICB9O1xuICB2YXIgZDNfc3ZnX2JydXNoUmVzaXplcyA9IFsgWyBcIm5cIiwgXCJlXCIsIFwic1wiLCBcIndcIiwgXCJud1wiLCBcIm5lXCIsIFwic2VcIiwgXCJzd1wiIF0sIFsgXCJlXCIsIFwid1wiIF0sIFsgXCJuXCIsIFwic1wiIF0sIFtdIF07XG4gIHZhciBkM190aW1lX2Zvcm1hdCA9IGQzX3RpbWUuZm9ybWF0ID0gZDNfbG9jYWxlX2VuVVMudGltZUZvcm1hdDtcbiAgdmFyIGQzX3RpbWVfZm9ybWF0VXRjID0gZDNfdGltZV9mb3JtYXQudXRjO1xuICB2YXIgZDNfdGltZV9mb3JtYXRJc28gPSBkM190aW1lX2Zvcm1hdFV0YyhcIiVZLSVtLSVkVCVIOiVNOiVTLiVMWlwiKTtcbiAgZDNfdGltZV9mb3JtYXQuaXNvID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgJiYgK25ldyBEYXRlKFwiMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaXCIpID8gZDNfdGltZV9mb3JtYXRJc29OYXRpdmUgOiBkM190aW1lX2Zvcm1hdElzbztcbiAgZnVuY3Rpb24gZDNfdGltZV9mb3JtYXRJc29OYXRpdmUoZGF0ZSkge1xuICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKCk7XG4gIH1cbiAgZDNfdGltZV9mb3JtYXRJc29OYXRpdmUucGFyc2UgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHN0cmluZyk7XG4gICAgcmV0dXJuIGlzTmFOKGRhdGUpID8gbnVsbCA6IGRhdGU7XG4gIH07XG4gIGQzX3RpbWVfZm9ybWF0SXNvTmF0aXZlLnRvU3RyaW5nID0gZDNfdGltZV9mb3JtYXRJc28udG9TdHJpbmc7XG4gIGQzX3RpbWUuc2Vjb25kID0gZDNfdGltZV9pbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XG4gICAgcmV0dXJuIG5ldyBkM19kYXRlKE1hdGguZmxvb3IoZGF0ZSAvIDFlMykgKiAxZTMpO1xuICB9LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHtcbiAgICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyBNYXRoLmZsb29yKG9mZnNldCkgKiAxZTMpO1xuICB9LCBmdW5jdGlvbihkYXRlKSB7XG4gICAgcmV0dXJuIGRhdGUuZ2V0U2Vjb25kcygpO1xuICB9KTtcbiAgZDNfdGltZS5zZWNvbmRzID0gZDNfdGltZS5zZWNvbmQucmFuZ2U7XG4gIGQzX3RpbWUuc2Vjb25kcy51dGMgPSBkM190aW1lLnNlY29uZC51dGMucmFuZ2U7XG4gIGQzX3RpbWUubWludXRlID0gZDNfdGltZV9pbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7XG4gICAgcmV0dXJuIG5ldyBkM19kYXRlKE1hdGguZmxvb3IoZGF0ZSAvIDZlNCkgKiA2ZTQpO1xuICB9LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHtcbiAgICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyBNYXRoLmZsb29yKG9mZnNldCkgKiA2ZTQpO1xuICB9LCBmdW5jdGlvbihkYXRlKSB7XG4gICAgcmV0dXJuIGRhdGUuZ2V0TWludXRlcygpO1xuICB9KTtcbiAgZDNfdGltZS5taW51dGVzID0gZDNfdGltZS5taW51dGUucmFuZ2U7XG4gIGQzX3RpbWUubWludXRlcy51dGMgPSBkM190aW1lLm1pbnV0ZS51dGMucmFuZ2U7XG4gIGQzX3RpbWUuaG91ciA9IGQzX3RpbWVfaW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkge1xuICAgIHZhciB0aW1lem9uZSA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAvIDYwO1xuICAgIHJldHVybiBuZXcgZDNfZGF0ZSgoTWF0aC5mbG9vcihkYXRlIC8gMzZlNSAtIHRpbWV6b25lKSArIHRpbWV6b25lKSAqIDM2ZTUpO1xuICB9LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHtcbiAgICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyBNYXRoLmZsb29yKG9mZnNldCkgKiAzNmU1KTtcbiAgfSwgZnVuY3Rpb24oZGF0ZSkge1xuICAgIHJldHVybiBkYXRlLmdldEhvdXJzKCk7XG4gIH0pO1xuICBkM190aW1lLmhvdXJzID0gZDNfdGltZS5ob3VyLnJhbmdlO1xuICBkM190aW1lLmhvdXJzLnV0YyA9IGQzX3RpbWUuaG91ci51dGMucmFuZ2U7XG4gIGQzX3RpbWUubW9udGggPSBkM190aW1lX2ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHtcbiAgICBkYXRlID0gZDNfdGltZS5kYXkoZGF0ZSk7XG4gICAgZGF0ZS5zZXREYXRlKDEpO1xuICAgIHJldHVybiBkYXRlO1xuICB9LCBmdW5jdGlvbihkYXRlLCBvZmZzZXQpIHtcbiAgICBkYXRlLnNldE1vbnRoKGRhdGUuZ2V0TW9udGgoKSArIG9mZnNldCk7XG4gIH0sIGZ1bmN0aW9uKGRhdGUpIHtcbiAgICByZXR1cm4gZGF0ZS5nZXRNb250aCgpO1xuICB9KTtcbiAgZDNfdGltZS5tb250aHMgPSBkM190aW1lLm1vbnRoLnJhbmdlO1xuICBkM190aW1lLm1vbnRocy51dGMgPSBkM190aW1lLm1vbnRoLnV0Yy5yYW5nZTtcbiAgZnVuY3Rpb24gZDNfdGltZV9zY2FsZShsaW5lYXIsIG1ldGhvZHMsIGZvcm1hdCkge1xuICAgIGZ1bmN0aW9uIHNjYWxlKHgpIHtcbiAgICAgIHJldHVybiBsaW5lYXIoeCk7XG4gICAgfVxuICAgIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIHJldHVybiBkM190aW1lX3NjYWxlRGF0ZShsaW5lYXIuaW52ZXJ0KHgpKTtcbiAgICB9O1xuICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKHgpIHtcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxpbmVhci5kb21haW4oKS5tYXAoZDNfdGltZV9zY2FsZURhdGUpO1xuICAgICAgbGluZWFyLmRvbWFpbih4KTtcbiAgICAgIHJldHVybiBzY2FsZTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIHRpY2tNZXRob2QoZXh0ZW50LCBjb3VudCkge1xuICAgICAgdmFyIHNwYW4gPSBleHRlbnRbMV0gLSBleHRlbnRbMF0sIHRhcmdldCA9IHNwYW4gLyBjb3VudCwgaSA9IGQzLmJpc2VjdChkM190aW1lX3NjYWxlU3RlcHMsIHRhcmdldCk7XG4gICAgICByZXR1cm4gaSA9PSBkM190aW1lX3NjYWxlU3RlcHMubGVuZ3RoID8gWyBtZXRob2RzLnllYXIsIGQzX3NjYWxlX2xpbmVhclRpY2tSYW5nZShleHRlbnQubWFwKGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgcmV0dXJuIGQgLyAzMTUzNmU2O1xuICAgICAgfSksIGNvdW50KVsyXSBdIDogIWkgPyBbIGQzX3RpbWVfc2NhbGVNaWxsaXNlY29uZHMsIGQzX3NjYWxlX2xpbmVhclRpY2tSYW5nZShleHRlbnQsIGNvdW50KVsyXSBdIDogbWV0aG9kc1t0YXJnZXQgLyBkM190aW1lX3NjYWxlU3RlcHNbaSAtIDFdIDwgZDNfdGltZV9zY2FsZVN0ZXBzW2ldIC8gdGFyZ2V0ID8gaSAtIDEgOiBpXTtcbiAgICB9XG4gICAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKGludGVydmFsLCBza2lwKSB7XG4gICAgICB2YXIgZG9tYWluID0gc2NhbGUuZG9tYWluKCksIGV4dGVudCA9IGQzX3NjYWxlRXh0ZW50KGRvbWFpbiksIG1ldGhvZCA9IGludGVydmFsID09IG51bGwgPyB0aWNrTWV0aG9kKGV4dGVudCwgMTApIDogdHlwZW9mIGludGVydmFsID09PSBcIm51bWJlclwiICYmIHRpY2tNZXRob2QoZXh0ZW50LCBpbnRlcnZhbCk7XG4gICAgICBpZiAobWV0aG9kKSBpbnRlcnZhbCA9IG1ldGhvZFswXSwgc2tpcCA9IG1ldGhvZFsxXTtcbiAgICAgIGZ1bmN0aW9uIHNraXBwZWQoZGF0ZSkge1xuICAgICAgICByZXR1cm4gIWlzTmFOKGRhdGUpICYmICFpbnRlcnZhbC5yYW5nZShkYXRlLCBkM190aW1lX3NjYWxlRGF0ZSgrZGF0ZSArIDEpLCBza2lwKS5sZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2NhbGUuZG9tYWluKGQzX3NjYWxlX25pY2UoZG9tYWluLCBza2lwID4gMSA/IHtcbiAgICAgICAgZmxvb3I6IGZ1bmN0aW9uKGRhdGUpIHtcbiAgICAgICAgICB3aGlsZSAoc2tpcHBlZChkYXRlID0gaW50ZXJ2YWwuZmxvb3IoZGF0ZSkpKSBkYXRlID0gZDNfdGltZV9zY2FsZURhdGUoZGF0ZSAtIDEpO1xuICAgICAgICAgIHJldHVybiBkYXRlO1xuICAgICAgICB9LFxuICAgICAgICBjZWlsOiBmdW5jdGlvbihkYXRlKSB7XG4gICAgICAgICAgd2hpbGUgKHNraXBwZWQoZGF0ZSA9IGludGVydmFsLmNlaWwoZGF0ZSkpKSBkYXRlID0gZDNfdGltZV9zY2FsZURhdGUoK2RhdGUgKyAxKTtcbiAgICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICAgICAgfVxuICAgICAgfSA6IGludGVydmFsKSk7XG4gICAgfTtcbiAgICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKGludGVydmFsLCBza2lwKSB7XG4gICAgICB2YXIgZXh0ZW50ID0gZDNfc2NhbGVFeHRlbnQoc2NhbGUuZG9tYWluKCkpLCBtZXRob2QgPSBpbnRlcnZhbCA9PSBudWxsID8gdGlja01ldGhvZChleHRlbnQsIDEwKSA6IHR5cGVvZiBpbnRlcnZhbCA9PT0gXCJudW1iZXJcIiA/IHRpY2tNZXRob2QoZXh0ZW50LCBpbnRlcnZhbCkgOiAhaW50ZXJ2YWwucmFuZ2UgJiYgWyB7XG4gICAgICAgIHJhbmdlOiBpbnRlcnZhbFxuICAgICAgfSwgc2tpcCBdO1xuICAgICAgaWYgKG1ldGhvZCkgaW50ZXJ2YWwgPSBtZXRob2RbMF0sIHNraXAgPSBtZXRob2RbMV07XG4gICAgICByZXR1cm4gaW50ZXJ2YWwucmFuZ2UoZXh0ZW50WzBdLCBkM190aW1lX3NjYWxlRGF0ZSgrZXh0ZW50WzFdICsgMSksIHNraXAgPCAxID8gMSA6IHNraXApO1xuICAgIH07XG4gICAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICB9O1xuICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBkM190aW1lX3NjYWxlKGxpbmVhci5jb3B5KCksIG1ldGhvZHMsIGZvcm1hdCk7XG4gICAgfTtcbiAgICByZXR1cm4gZDNfc2NhbGVfbGluZWFyUmViaW5kKHNjYWxlLCBsaW5lYXIpO1xuICB9XG4gIGZ1bmN0aW9uIGQzX3RpbWVfc2NhbGVEYXRlKHQpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodCk7XG4gIH1cbiAgdmFyIGQzX3RpbWVfc2NhbGVTdGVwcyA9IFsgMWUzLCA1ZTMsIDE1ZTMsIDNlNCwgNmU0LCAzZTUsIDllNSwgMThlNSwgMzZlNSwgMTA4ZTUsIDIxNmU1LCA0MzJlNSwgODY0ZTUsIDE3MjhlNSwgNjA0OGU1LCAyNTkyZTYsIDc3NzZlNiwgMzE1MzZlNiBdO1xuICB2YXIgZDNfdGltZV9zY2FsZUxvY2FsTWV0aG9kcyA9IFsgWyBkM190aW1lLnNlY29uZCwgMSBdLCBbIGQzX3RpbWUuc2Vjb25kLCA1IF0sIFsgZDNfdGltZS5zZWNvbmQsIDE1IF0sIFsgZDNfdGltZS5zZWNvbmQsIDMwIF0sIFsgZDNfdGltZS5taW51dGUsIDEgXSwgWyBkM190aW1lLm1pbnV0ZSwgNSBdLCBbIGQzX3RpbWUubWludXRlLCAxNSBdLCBbIGQzX3RpbWUubWludXRlLCAzMCBdLCBbIGQzX3RpbWUuaG91ciwgMSBdLCBbIGQzX3RpbWUuaG91ciwgMyBdLCBbIGQzX3RpbWUuaG91ciwgNiBdLCBbIGQzX3RpbWUuaG91ciwgMTIgXSwgWyBkM190aW1lLmRheSwgMSBdLCBbIGQzX3RpbWUuZGF5LCAyIF0sIFsgZDNfdGltZS53ZWVrLCAxIF0sIFsgZDNfdGltZS5tb250aCwgMSBdLCBbIGQzX3RpbWUubW9udGgsIDMgXSwgWyBkM190aW1lLnllYXIsIDEgXSBdO1xuICB2YXIgZDNfdGltZV9zY2FsZUxvY2FsRm9ybWF0ID0gZDNfdGltZV9mb3JtYXQubXVsdGkoWyBbIFwiLiVMXCIsIGZ1bmN0aW9uKGQpIHtcbiAgICByZXR1cm4gZC5nZXRNaWxsaXNlY29uZHMoKTtcbiAgfSBdLCBbIFwiOiVTXCIsIGZ1bmN0aW9uKGQpIHtcbiAgICByZXR1cm4gZC5nZXRTZWNvbmRzKCk7XG4gIH0gXSwgWyBcIiVJOiVNXCIsIGZ1bmN0aW9uKGQpIHtcbiAgICByZXR1cm4gZC5nZXRNaW51dGVzKCk7XG4gIH0gXSwgWyBcIiVJICVwXCIsIGZ1bmN0aW9uKGQpIHtcbiAgICByZXR1cm4gZC5nZXRIb3VycygpO1xuICB9IF0sIFsgXCIlYSAlZFwiLCBmdW5jdGlvbihkKSB7XG4gICAgcmV0dXJuIGQuZ2V0RGF5KCkgJiYgZC5nZXREYXRlKCkgIT0gMTtcbiAgfSBdLCBbIFwiJWIgJWRcIiwgZnVuY3Rpb24oZCkge1xuICAgIHJldHVybiBkLmdldERhdGUoKSAhPSAxO1xuICB9IF0sIFsgXCIlQlwiLCBmdW5jdGlvbihkKSB7XG4gICAgcmV0dXJuIGQuZ2V0TW9udGgoKTtcbiAgfSBdLCBbIFwiJVlcIiwgZDNfdHJ1ZSBdIF0pO1xuICB2YXIgZDNfdGltZV9zY2FsZU1pbGxpc2Vjb25kcyA9IHtcbiAgICByYW5nZTogZnVuY3Rpb24oc3RhcnQsIHN0b3AsIHN0ZXApIHtcbiAgICAgIHJldHVybiBkMy5yYW5nZShNYXRoLmNlaWwoc3RhcnQgLyBzdGVwKSAqIHN0ZXAsICtzdG9wLCBzdGVwKS5tYXAoZDNfdGltZV9zY2FsZURhdGUpO1xuICAgIH0sXG4gICAgZmxvb3I6IGQzX2lkZW50aXR5LFxuICAgIGNlaWw6IGQzX2lkZW50aXR5XG4gIH07XG4gIGQzX3RpbWVfc2NhbGVMb2NhbE1ldGhvZHMueWVhciA9IGQzX3RpbWUueWVhcjtcbiAgZDNfdGltZS5zY2FsZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBkM190aW1lX3NjYWxlKGQzLnNjYWxlLmxpbmVhcigpLCBkM190aW1lX3NjYWxlTG9jYWxNZXRob2RzLCBkM190aW1lX3NjYWxlTG9jYWxGb3JtYXQpO1xuICB9O1xuICB2YXIgZDNfdGltZV9zY2FsZVV0Y01ldGhvZHMgPSBkM190aW1lX3NjYWxlTG9jYWxNZXRob2RzLm1hcChmdW5jdGlvbihtKSB7XG4gICAgcmV0dXJuIFsgbVswXS51dGMsIG1bMV0gXTtcbiAgfSk7XG4gIHZhciBkM190aW1lX3NjYWxlVXRjRm9ybWF0ID0gZDNfdGltZV9mb3JtYXRVdGMubXVsdGkoWyBbIFwiLiVMXCIsIGZ1bmN0aW9uKGQpIHtcbiAgICByZXR1cm4gZC5nZXRVVENNaWxsaXNlY29uZHMoKTtcbiAgfSBdLCBbIFwiOiVTXCIsIGZ1bmN0aW9uKGQpIHtcbiAgICByZXR1cm4gZC5nZXRVVENTZWNvbmRzKCk7XG4gIH0gXSwgWyBcIiVJOiVNXCIsIGZ1bmN0aW9uKGQpIHtcbiAgICByZXR1cm4gZC5nZXRVVENNaW51dGVzKCk7XG4gIH0gXSwgWyBcIiVJICVwXCIsIGZ1bmN0aW9uKGQpIHtcbiAgICByZXR1cm4gZC5nZXRVVENIb3VycygpO1xuICB9IF0sIFsgXCIlYSAlZFwiLCBmdW5jdGlvbihkKSB7XG4gICAgcmV0dXJuIGQuZ2V0VVRDRGF5KCkgJiYgZC5nZXRVVENEYXRlKCkgIT0gMTtcbiAgfSBdLCBbIFwiJWIgJWRcIiwgZnVuY3Rpb24oZCkge1xuICAgIHJldHVybiBkLmdldFVUQ0RhdGUoKSAhPSAxO1xuICB9IF0sIFsgXCIlQlwiLCBmdW5jdGlvbihkKSB7XG4gICAgcmV0dXJuIGQuZ2V0VVRDTW9udGgoKTtcbiAgfSBdLCBbIFwiJVlcIiwgZDNfdHJ1ZSBdIF0pO1xuICBkM190aW1lX3NjYWxlVXRjTWV0aG9kcy55ZWFyID0gZDNfdGltZS55ZWFyLnV0YztcbiAgZDNfdGltZS5zY2FsZS51dGMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZDNfdGltZV9zY2FsZShkMy5zY2FsZS5saW5lYXIoKSwgZDNfdGltZV9zY2FsZVV0Y01ldGhvZHMsIGQzX3RpbWVfc2NhbGVVdGNGb3JtYXQpO1xuICB9O1xuICBkMy50ZXh0ID0gZDNfeGhyVHlwZShmdW5jdGlvbihyZXF1ZXN0KSB7XG4gICAgcmV0dXJuIHJlcXVlc3QucmVzcG9uc2VUZXh0O1xuICB9KTtcbiAgZDMuanNvbiA9IGZ1bmN0aW9uKHVybCwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gZDNfeGhyKHVybCwgXCJhcHBsaWNhdGlvbi9qc29uXCIsIGQzX2pzb24sIGNhbGxiYWNrKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfanNvbihyZXF1ZXN0KSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UocmVxdWVzdC5yZXNwb25zZVRleHQpO1xuICB9XG4gIGQzLmh0bWwgPSBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGQzX3hocih1cmwsIFwidGV4dC9odG1sXCIsIGQzX2h0bWwsIGNhbGxiYWNrKTtcbiAgfTtcbiAgZnVuY3Rpb24gZDNfaHRtbChyZXF1ZXN0KSB7XG4gICAgdmFyIHJhbmdlID0gZDNfZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZWxlY3ROb2RlKGQzX2RvY3VtZW50LmJvZHkpO1xuICAgIHJldHVybiByYW5nZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQocmVxdWVzdC5yZXNwb25zZVRleHQpO1xuICB9XG4gIGQzLnhtbCA9IGQzX3hoclR5cGUoZnVuY3Rpb24ocmVxdWVzdCkge1xuICAgIHJldHVybiByZXF1ZXN0LnJlc3BvbnNlWE1MO1xuICB9KTtcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB0aGlzLmQzID0gZDMsIGRlZmluZShkMyk7IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiYgbW9kdWxlLmV4cG9ydHMpIG1vZHVsZS5leHBvcnRzID0gZDM7IGVsc2UgdGhpcy5kMyA9IGQzO1xufSgpOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGFjdGl2ZUVsZW1lbnQ7XG5cbnZhciBfb3duZXJEb2N1bWVudCA9IHJlcXVpcmUoJy4vb3duZXJEb2N1bWVudCcpO1xuXG52YXIgX293bmVyRG9jdW1lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb3duZXJEb2N1bWVudCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIGFjdGl2ZUVsZW1lbnQoKSB7XG4gIHZhciBkb2MgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICgwLCBfb3duZXJEb2N1bWVudDIuZGVmYXVsdCkoKTtcblxuICB0cnkge1xuICAgIHJldHVybiBkb2MuYWN0aXZlRWxlbWVudDtcbiAgfSBjYXRjaCAoZSkgey8qIGllIHRocm93cyBpZiBubyBhY3RpdmUgZWxlbWVudCAqL31cbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGFkZENsYXNzO1xuXG52YXIgX2hhc0NsYXNzID0gcmVxdWlyZSgnLi9oYXNDbGFzcycpO1xuXG52YXIgX2hhc0NsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2hhc0NsYXNzKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gYWRkQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKSB7XG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdCkgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7ZWxzZSBpZiAoISgwLCBfaGFzQ2xhc3MyLmRlZmF1bHQpKGVsZW1lbnQpKSBlbGVtZW50LmNsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lICsgJyAnICsgY2xhc3NOYW1lO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBoYXNDbGFzcztcbmZ1bmN0aW9uIGhhc0NsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkge1xuICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHJldHVybiAhIWNsYXNzTmFtZSAmJiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpO2Vsc2UgcmV0dXJuIChcIiBcIiArIGVsZW1lbnQuY2xhc3NOYW1lICsgXCIgXCIpLmluZGV4T2YoXCIgXCIgKyBjbGFzc05hbWUgKyBcIiBcIikgIT09IC0xO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmhhc0NsYXNzID0gZXhwb3J0cy5yZW1vdmVDbGFzcyA9IGV4cG9ydHMuYWRkQ2xhc3MgPSB1bmRlZmluZWQ7XG5cbnZhciBfYWRkQ2xhc3MgPSByZXF1aXJlKCcuL2FkZENsYXNzJyk7XG5cbnZhciBfYWRkQ2xhc3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYWRkQ2xhc3MpO1xuXG52YXIgX3JlbW92ZUNsYXNzID0gcmVxdWlyZSgnLi9yZW1vdmVDbGFzcycpO1xuXG52YXIgX3JlbW92ZUNsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlbW92ZUNsYXNzKTtcblxudmFyIF9oYXNDbGFzcyA9IHJlcXVpcmUoJy4vaGFzQ2xhc3MnKTtcblxudmFyIF9oYXNDbGFzczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oYXNDbGFzcyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMuYWRkQ2xhc3MgPSBfYWRkQ2xhc3MyLmRlZmF1bHQ7XG5leHBvcnRzLnJlbW92ZUNsYXNzID0gX3JlbW92ZUNsYXNzMi5kZWZhdWx0O1xuZXhwb3J0cy5oYXNDbGFzcyA9IF9oYXNDbGFzczIuZGVmYXVsdDtcbmV4cG9ydHMuZGVmYXVsdCA9IHsgYWRkQ2xhc3M6IF9hZGRDbGFzczIuZGVmYXVsdCwgcmVtb3ZlQ2xhc3M6IF9yZW1vdmVDbGFzczIuZGVmYXVsdCwgaGFzQ2xhc3M6IF9oYXNDbGFzczIuZGVmYXVsdCB9OyIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiByZW1vdmVDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpIHtcbiAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0KSBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTtlbHNlIGVsZW1lbnQuY2xhc3NOYW1lID0gZWxlbWVudC5jbGFzc05hbWUucmVwbGFjZShuZXcgUmVnRXhwKCcoXnxcXFxccyknICsgY2xhc3NOYW1lICsgJyg/OlxcXFxzfCQpJywgJ2cnKSwgJyQxJykucmVwbGFjZSgvXFxzKy9nLCAnICcpLnJlcGxhY2UoL15cXHMqfFxccyokL2csICcnKTtcbn07IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZmlsdGVyRXZlbnRzO1xuXG52YXIgX2NvbnRhaW5zID0gcmVxdWlyZSgnLi4vcXVlcnkvY29udGFpbnMnKTtcblxudmFyIF9jb250YWluczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb250YWlucyk7XG5cbnZhciBfcXVlcnlTZWxlY3RvckFsbCA9IHJlcXVpcmUoJy4uL3F1ZXJ5L3F1ZXJ5U2VsZWN0b3JBbGwnKTtcblxudmFyIF9xdWVyeVNlbGVjdG9yQWxsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3F1ZXJ5U2VsZWN0b3JBbGwpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBmaWx0ZXJFdmVudHMoc2VsZWN0b3IsIGhhbmRsZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZpbHRlckhhbmRsZXIoZSkge1xuICAgIHZhciB0b3AgPSBlLmN1cnJlbnRUYXJnZXQsXG4gICAgICAgIHRhcmdldCA9IGUudGFyZ2V0LFxuICAgICAgICBtYXRjaGVzID0gKDAsIF9xdWVyeVNlbGVjdG9yQWxsMi5kZWZhdWx0KSh0b3AsIHNlbGVjdG9yKTtcblxuICAgIGlmIChtYXRjaGVzLnNvbWUoZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICByZXR1cm4gKDAsIF9jb250YWluczIuZGVmYXVsdCkobWF0Y2gsIHRhcmdldCk7XG4gICAgfSkpIGhhbmRsZXIuY2FsbCh0aGlzLCBlKTtcbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMubGlzdGVuID0gZXhwb3J0cy5maWx0ZXIgPSBleHBvcnRzLm9mZiA9IGV4cG9ydHMub24gPSB1bmRlZmluZWQ7XG5cbnZhciBfb24gPSByZXF1aXJlKCcuL29uJyk7XG5cbnZhciBfb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb24pO1xuXG52YXIgX29mZiA9IHJlcXVpcmUoJy4vb2ZmJyk7XG5cbnZhciBfb2ZmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29mZik7XG5cbnZhciBfZmlsdGVyID0gcmVxdWlyZSgnLi9maWx0ZXInKTtcblxudmFyIF9maWx0ZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZmlsdGVyKTtcblxudmFyIF9saXN0ZW4gPSByZXF1aXJlKCcuL2xpc3RlbicpO1xuXG52YXIgX2xpc3RlbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9saXN0ZW4pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLm9uID0gX29uMi5kZWZhdWx0O1xuZXhwb3J0cy5vZmYgPSBfb2ZmMi5kZWZhdWx0O1xuZXhwb3J0cy5maWx0ZXIgPSBfZmlsdGVyMi5kZWZhdWx0O1xuZXhwb3J0cy5saXN0ZW4gPSBfbGlzdGVuMi5kZWZhdWx0O1xuZXhwb3J0cy5kZWZhdWx0ID0geyBvbjogX29uMi5kZWZhdWx0LCBvZmY6IF9vZmYyLmRlZmF1bHQsIGZpbHRlcjogX2ZpbHRlcjIuZGVmYXVsdCwgbGlzdGVuOiBfbGlzdGVuMi5kZWZhdWx0IH07IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2luRE9NID0gcmVxdWlyZSgnLi4vdXRpbC9pbkRPTScpO1xuXG52YXIgX2luRE9NMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luRE9NKTtcblxudmFyIF9vbiA9IHJlcXVpcmUoJy4vb24nKTtcblxudmFyIF9vbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vbik7XG5cbnZhciBfb2ZmID0gcmVxdWlyZSgnLi9vZmYnKTtcblxudmFyIF9vZmYyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2ZmKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIGxpc3RlbiA9IGZ1bmN0aW9uIGxpc3RlbigpIHt9O1xuXG5pZiAoX2luRE9NMi5kZWZhdWx0KSB7XG4gIGxpc3RlbiA9IGZ1bmN0aW9uIGxpc3Rlbihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIsIGNhcHR1cmUpIHtcbiAgICAoMCwgX29uMi5kZWZhdWx0KShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIsIGNhcHR1cmUpO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAoMCwgX29mZjIuZGVmYXVsdCkobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyLCBjYXB0dXJlKTtcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnRzLmRlZmF1bHQgPSBsaXN0ZW47XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfaW5ET00gPSByZXF1aXJlKCcuLi91dGlsL2luRE9NJyk7XG5cbnZhciBfaW5ET00yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5ET00pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgb2ZmID0gZnVuY3Rpb24gb2ZmKCkge307XG5pZiAoX2luRE9NMi5kZWZhdWx0KSB7XG4gIG9mZiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikgcmV0dXJuIGZ1bmN0aW9uIChub2RlLCBldmVudE5hbWUsIGhhbmRsZXIsIGNhcHR1cmUpIHtcbiAgICAgIHJldHVybiBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyLCBjYXB0dXJlIHx8IGZhbHNlKTtcbiAgICB9O2Vsc2UgaWYgKGRvY3VtZW50LmF0dGFjaEV2ZW50KSByZXR1cm4gZnVuY3Rpb24gKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcikge1xuICAgICAgcmV0dXJuIG5vZGUuZGV0YWNoRXZlbnQoJ29uJyArIGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgfTtcbiAgfSgpO1xufVxuXG5leHBvcnRzLmRlZmF1bHQgPSBvZmY7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfaW5ET00gPSByZXF1aXJlKCcuLi91dGlsL2luRE9NJyk7XG5cbnZhciBfaW5ET00yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5ET00pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgb24gPSBmdW5jdGlvbiBvbigpIHt9O1xuaWYgKF9pbkRPTTIuZGVmYXVsdCkge1xuICBvbiA9IGZ1bmN0aW9uICgpIHtcblxuICAgIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSByZXR1cm4gZnVuY3Rpb24gKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlciwgY2FwdHVyZSkge1xuICAgICAgcmV0dXJuIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIsIGNhcHR1cmUgfHwgZmFsc2UpO1xuICAgIH07ZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHJldHVybiBmdW5jdGlvbiAobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSB7XG4gICAgICByZXR1cm4gbm9kZS5hdHRhY2hFdmVudCgnb24nICsgZXZlbnROYW1lLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnQ7XG4gICAgICAgIGUudGFyZ2V0ID0gZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50O1xuICAgICAgICBlLmN1cnJlbnRUYXJnZXQgPSBub2RlO1xuICAgICAgICBoYW5kbGVyLmNhbGwobm9kZSwgZSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9KCk7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IG9uO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBvd25lckRvY3VtZW50O1xuZnVuY3Rpb24gb3duZXJEb2N1bWVudChub2RlKSB7XG4gIHJldHVybiBub2RlICYmIG5vZGUub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudDtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2luRE9NID0gcmVxdWlyZSgnLi4vdXRpbC9pbkRPTScpO1xuXG52YXIgX2luRE9NMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luRE9NKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5kZWZhdWx0ID0gZnVuY3Rpb24gKCkge1xuICAvLyBIVE1MIERPTSBhbmQgU1ZHIERPTSBtYXkgaGF2ZSBkaWZmZXJlbnQgc3VwcG9ydCBsZXZlbHMsXG4gIC8vIHNvIHdlIG5lZWQgdG8gY2hlY2sgb24gY29udGV4dCBpbnN0ZWFkIG9mIGEgZG9jdW1lbnQgcm9vdCBlbGVtZW50LlxuICByZXR1cm4gX2luRE9NMi5kZWZhdWx0ID8gZnVuY3Rpb24gKGNvbnRleHQsIG5vZGUpIHtcbiAgICBpZiAoY29udGV4dC5jb250YWlucykge1xuICAgICAgcmV0dXJuIGNvbnRleHQuY29udGFpbnMobm9kZSk7XG4gICAgfSBlbHNlIGlmIChjb250ZXh0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSB7XG4gICAgICByZXR1cm4gY29udGV4dCA9PT0gbm9kZSB8fCAhIShjb250ZXh0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5vZGUpICYgMTYpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsbGJhY2soY29udGV4dCwgbm9kZSk7XG4gICAgfVxuICB9IDogZmFsbGJhY2s7XG59KCk7XG5cbmZ1bmN0aW9uIGZhbGxiYWNrKGNvbnRleHQsIG5vZGUpIHtcbiAgaWYgKG5vZGUpIGRvIHtcbiAgICBpZiAobm9kZSA9PT0gY29udGV4dCkgcmV0dXJuIHRydWU7XG4gIH0gd2hpbGUgKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpO1xuXG4gIHJldHVybiBmYWxzZTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZ2V0V2luZG93O1xuZnVuY3Rpb24gZ2V0V2luZG93KG5vZGUpIHtcbiAgcmV0dXJuIG5vZGUgPT09IG5vZGUud2luZG93ID8gbm9kZSA6IG5vZGUubm9kZVR5cGUgPT09IDkgPyBub2RlLmRlZmF1bHRWaWV3IHx8IG5vZGUucGFyZW50V2luZG93IDogZmFsc2U7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IG9mZnNldDtcblxudmFyIF9jb250YWlucyA9IHJlcXVpcmUoJy4vY29udGFpbnMnKTtcblxudmFyIF9jb250YWluczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb250YWlucyk7XG5cbnZhciBfaXNXaW5kb3cgPSByZXF1aXJlKCcuL2lzV2luZG93Jyk7XG5cbnZhciBfaXNXaW5kb3cyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNXaW5kb3cpO1xuXG52YXIgX293bmVyRG9jdW1lbnQgPSByZXF1aXJlKCcuLi9vd25lckRvY3VtZW50Jyk7XG5cbnZhciBfb3duZXJEb2N1bWVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vd25lckRvY3VtZW50KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gb2Zmc2V0KG5vZGUpIHtcbiAgdmFyIGRvYyA9ICgwLCBfb3duZXJEb2N1bWVudDIuZGVmYXVsdCkobm9kZSksXG4gICAgICB3aW4gPSAoMCwgX2lzV2luZG93Mi5kZWZhdWx0KShkb2MpLFxuICAgICAgZG9jRWxlbSA9IGRvYyAmJiBkb2MuZG9jdW1lbnRFbGVtZW50LFxuICAgICAgYm94ID0geyB0b3A6IDAsIGxlZnQ6IDAsIGhlaWdodDogMCwgd2lkdGg6IDAgfTtcblxuICBpZiAoIWRvYykgcmV0dXJuO1xuXG4gIC8vIE1ha2Ugc3VyZSBpdCdzIG5vdCBhIGRpc2Nvbm5lY3RlZCBET00gbm9kZVxuICBpZiAoISgwLCBfY29udGFpbnMyLmRlZmF1bHQpKGRvY0VsZW0sIG5vZGUpKSByZXR1cm4gYm94O1xuXG4gIGlmIChub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAhPT0gdW5kZWZpbmVkKSBib3ggPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gIC8vIElFOCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZG9lc24ndCBzdXBwb3J0IHdpZHRoICYgaGVpZ2h0XG4gIGJveCA9IHtcbiAgICB0b3A6IGJveC50b3AgKyAod2luLnBhZ2VZT2Zmc2V0IHx8IGRvY0VsZW0uc2Nyb2xsVG9wKSAtIChkb2NFbGVtLmNsaWVudFRvcCB8fCAwKSxcbiAgICBsZWZ0OiBib3gubGVmdCArICh3aW4ucGFnZVhPZmZzZXQgfHwgZG9jRWxlbS5zY3JvbGxMZWZ0KSAtIChkb2NFbGVtLmNsaWVudExlZnQgfHwgMCksXG4gICAgd2lkdGg6IChib3gud2lkdGggPT0gbnVsbCA/IG5vZGUub2Zmc2V0V2lkdGggOiBib3gud2lkdGgpIHx8IDAsXG4gICAgaGVpZ2h0OiAoYm94LmhlaWdodCA9PSBudWxsID8gbm9kZS5vZmZzZXRIZWlnaHQgOiBib3guaGVpZ2h0KSB8fCAwXG4gIH07XG5cbiAgcmV0dXJuIGJveDtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IG9mZnNldFBhcmVudDtcblxudmFyIF9vd25lckRvY3VtZW50ID0gcmVxdWlyZSgnLi4vb3duZXJEb2N1bWVudCcpO1xuXG52YXIgX293bmVyRG9jdW1lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb3duZXJEb2N1bWVudCk7XG5cbnZhciBfc3R5bGUgPSByZXF1aXJlKCcuLi9zdHlsZScpO1xuXG52YXIgX3N0eWxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3N0eWxlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gbm9kZU5hbWUobm9kZSkge1xuICByZXR1cm4gbm9kZS5ub2RlTmFtZSAmJiBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG59XG5cbmZ1bmN0aW9uIG9mZnNldFBhcmVudChub2RlKSB7XG4gIHZhciBkb2MgPSAoMCwgX293bmVyRG9jdW1lbnQyLmRlZmF1bHQpKG5vZGUpLFxuICAgICAgb2Zmc2V0UGFyZW50ID0gbm9kZSAmJiBub2RlLm9mZnNldFBhcmVudDtcblxuICB3aGlsZSAob2Zmc2V0UGFyZW50ICYmIG5vZGVOYW1lKG5vZGUpICE9PSAnaHRtbCcgJiYgKDAsIF9zdHlsZTIuZGVmYXVsdCkob2Zmc2V0UGFyZW50LCAncG9zaXRpb24nKSA9PT0gJ3N0YXRpYycpIHtcbiAgICBvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50O1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2MuZG9jdW1lbnRFbGVtZW50O1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5leHBvcnRzLmRlZmF1bHQgPSBwb3NpdGlvbjtcblxudmFyIF9vZmZzZXQgPSByZXF1aXJlKCcuL29mZnNldCcpO1xuXG52YXIgX29mZnNldDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vZmZzZXQpO1xuXG52YXIgX29mZnNldFBhcmVudCA9IHJlcXVpcmUoJy4vb2Zmc2V0UGFyZW50Jyk7XG5cbnZhciBfb2Zmc2V0UGFyZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29mZnNldFBhcmVudCk7XG5cbnZhciBfc2Nyb2xsVG9wID0gcmVxdWlyZSgnLi9zY3JvbGxUb3AnKTtcblxudmFyIF9zY3JvbGxUb3AyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2Nyb2xsVG9wKTtcblxudmFyIF9zY3JvbGxMZWZ0ID0gcmVxdWlyZSgnLi9zY3JvbGxMZWZ0Jyk7XG5cbnZhciBfc2Nyb2xsTGVmdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zY3JvbGxMZWZ0KTtcblxudmFyIF9zdHlsZSA9IHJlcXVpcmUoJy4uL3N0eWxlJyk7XG5cbnZhciBfc3R5bGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3R5bGUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBub2RlTmFtZShub2RlKSB7XG4gIHJldHVybiBub2RlLm5vZGVOYW1lICYmIG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbn1cblxuZnVuY3Rpb24gcG9zaXRpb24obm9kZSwgb2Zmc2V0UGFyZW50KSB7XG4gIHZhciBwYXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9LFxuICAgICAgb2Zmc2V0O1xuXG4gIC8vIEZpeGVkIGVsZW1lbnRzIGFyZSBvZmZzZXQgZnJvbSB3aW5kb3cgKHBhcmVudE9mZnNldCA9IHt0b3A6MCwgbGVmdDogMH0sXG4gIC8vIGJlY2F1c2UgaXQgaXMgaXRzIG9ubHkgb2Zmc2V0IHBhcmVudFxuICBpZiAoKDAsIF9zdHlsZTIuZGVmYXVsdCkobm9kZSwgJ3Bvc2l0aW9uJykgPT09ICdmaXhlZCcpIHtcbiAgICBvZmZzZXQgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB9IGVsc2Uge1xuICAgIG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudCB8fCAoMCwgX29mZnNldFBhcmVudDIuZGVmYXVsdCkobm9kZSk7XG4gICAgb2Zmc2V0ID0gKDAsIF9vZmZzZXQyLmRlZmF1bHQpKG5vZGUpO1xuXG4gICAgaWYgKG5vZGVOYW1lKG9mZnNldFBhcmVudCkgIT09ICdodG1sJykgcGFyZW50T2Zmc2V0ID0gKDAsIF9vZmZzZXQyLmRlZmF1bHQpKG9mZnNldFBhcmVudCk7XG5cbiAgICBwYXJlbnRPZmZzZXQudG9wICs9IHBhcnNlSW50KCgwLCBfc3R5bGUyLmRlZmF1bHQpKG9mZnNldFBhcmVudCwgJ2JvcmRlclRvcFdpZHRoJyksIDEwKSAtICgwLCBfc2Nyb2xsVG9wMi5kZWZhdWx0KShvZmZzZXRQYXJlbnQpIHx8IDA7XG4gICAgcGFyZW50T2Zmc2V0LmxlZnQgKz0gcGFyc2VJbnQoKDAsIF9zdHlsZTIuZGVmYXVsdCkob2Zmc2V0UGFyZW50LCAnYm9yZGVyTGVmdFdpZHRoJyksIDEwKSAtICgwLCBfc2Nyb2xsTGVmdDIuZGVmYXVsdCkob2Zmc2V0UGFyZW50KSB8fCAwO1xuICB9XG5cbiAgLy8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIG5vZGUgbWFyZ2luc1xuICByZXR1cm4gX2V4dGVuZHMoe30sIG9mZnNldCwge1xuICAgIHRvcDogb2Zmc2V0LnRvcCAtIHBhcmVudE9mZnNldC50b3AgLSAocGFyc2VJbnQoKDAsIF9zdHlsZTIuZGVmYXVsdCkobm9kZSwgJ21hcmdpblRvcCcpLCAxMCkgfHwgMCksXG4gICAgbGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdCAtIChwYXJzZUludCgoMCwgX3N0eWxlMi5kZWZhdWx0KShub2RlLCAnbWFyZ2luTGVmdCcpLCAxMCkgfHwgMClcbiAgfSk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBxc2E7XG4vLyBaZXB0by5qc1xuLy8gKGMpIDIwMTAtMjAxNSBUaG9tYXMgRnVjaHNcbi8vIFplcHRvLmpzIG1heSBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxudmFyIHNpbXBsZVNlbGVjdG9yUkUgPSAvXltcXHctXSokLztcbnZhciB0b0FycmF5ID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuY2FsbChGdW5jdGlvbi5wcm90b3R5cGUuY2FsbCwgW10uc2xpY2UpO1xuXG5mdW5jdGlvbiBxc2EoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgdmFyIG1heWJlSUQgPSBzZWxlY3RvclswXSA9PT0gJyMnLFxuICAgICAgbWF5YmVDbGFzcyA9IHNlbGVjdG9yWzBdID09PSAnLicsXG4gICAgICBuYW1lT25seSA9IG1heWJlSUQgfHwgbWF5YmVDbGFzcyA/IHNlbGVjdG9yLnNsaWNlKDEpIDogc2VsZWN0b3IsXG4gICAgICBpc1NpbXBsZSA9IHNpbXBsZVNlbGVjdG9yUkUudGVzdChuYW1lT25seSksXG4gICAgICBmb3VuZDtcblxuICBpZiAoaXNTaW1wbGUpIHtcbiAgICBpZiAobWF5YmVJRCkge1xuICAgICAgZWxlbWVudCA9IGVsZW1lbnQuZ2V0RWxlbWVudEJ5SWQgPyBlbGVtZW50IDogZG9jdW1lbnQ7XG4gICAgICByZXR1cm4gKGZvdW5kID0gZWxlbWVudC5nZXRFbGVtZW50QnlJZChuYW1lT25seSkpID8gW2ZvdW5kXSA6IFtdO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgbWF5YmVDbGFzcykgcmV0dXJuIHRvQXJyYXkoZWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKG5hbWVPbmx5KSk7XG5cbiAgICByZXR1cm4gdG9BcnJheShlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKHNlbGVjdG9yKSk7XG4gIH1cblxuICByZXR1cm4gdG9BcnJheShlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHNjcm9sbFRvcDtcblxudmFyIF9pc1dpbmRvdyA9IHJlcXVpcmUoJy4vaXNXaW5kb3cnKTtcblxudmFyIF9pc1dpbmRvdzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pc1dpbmRvdyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIHNjcm9sbFRvcChub2RlLCB2YWwpIHtcbiAgdmFyIHdpbiA9ICgwLCBfaXNXaW5kb3cyLmRlZmF1bHQpKG5vZGUpO1xuXG4gIGlmICh2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHdpbiA/ICdwYWdlWE9mZnNldCcgaW4gd2luID8gd2luLnBhZ2VYT2Zmc2V0IDogd2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0IDogbm9kZS5zY3JvbGxMZWZ0O1xuXG4gIGlmICh3aW4pIHdpbi5zY3JvbGxUbyh2YWwsICdwYWdlWU9mZnNldCcgaW4gd2luID8gd2luLnBhZ2VZT2Zmc2V0IDogd2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3ApO2Vsc2Ugbm9kZS5zY3JvbGxMZWZ0ID0gdmFsO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gc2Nyb2xsVG9wO1xuXG52YXIgX2lzV2luZG93ID0gcmVxdWlyZSgnLi9pc1dpbmRvdycpO1xuXG52YXIgX2lzV2luZG93MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2lzV2luZG93KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gc2Nyb2xsVG9wKG5vZGUsIHZhbCkge1xuICB2YXIgd2luID0gKDAsIF9pc1dpbmRvdzIuZGVmYXVsdCkobm9kZSk7XG5cbiAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gd2luID8gJ3BhZ2VZT2Zmc2V0JyBpbiB3aW4gPyB3aW4ucGFnZVlPZmZzZXQgOiB3aW4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA6IG5vZGUuc2Nyb2xsVG9wO1xuXG4gIGlmICh3aW4pIHdpbi5zY3JvbGxUbygncGFnZVhPZmZzZXQnIGluIHdpbiA/IHdpbi5wYWdlWE9mZnNldCA6IHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCwgdmFsKTtlbHNlIG5vZGUuc2Nyb2xsVG9wID0gdmFsO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gX2dldENvbXB1dGVkU3R5bGU7XG5cbnZhciBfY2FtZWxpemVTdHlsZSA9IHJlcXVpcmUoJy4uL3V0aWwvY2FtZWxpemVTdHlsZScpO1xuXG52YXIgX2NhbWVsaXplU3R5bGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2FtZWxpemVTdHlsZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBycG9zaXRpb24gPSAvXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87XG52YXIgcm51bW5vbnB4ID0gL14oWystXT8oPzpcXGQqXFwufClcXGQrKD86W2VFXVsrLV0/XFxkK3wpKSg/IXB4KVthLXolXSskL2k7XG5cbmZ1bmN0aW9uIF9nZXRDb21wdXRlZFN0eWxlKG5vZGUpIHtcbiAgaWYgKCFub2RlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdObyBFbGVtZW50IHBhc3NlZCB0byBgZ2V0Q29tcHV0ZWRTdHlsZSgpYCcpO1xuICB2YXIgZG9jID0gbm9kZS5vd25lckRvY3VtZW50O1xuXG4gIHJldHVybiAnZGVmYXVsdFZpZXcnIGluIGRvYyA/IGRvYy5kZWZhdWx0Vmlldy5vcGVuZXIgPyBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKSA6IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpIDoge1xuICAgIC8vaWUgOCBcIm1hZ2ljXCIgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvYmxvYi8xLjExLXN0YWJsZS9zcmMvY3NzL2N1ckNTUy5qcyNMNzJcbiAgICBnZXRQcm9wZXJ0eVZhbHVlOiBmdW5jdGlvbiBnZXRQcm9wZXJ0eVZhbHVlKHByb3ApIHtcbiAgICAgIHZhciBzdHlsZSA9IG5vZGUuc3R5bGU7XG5cbiAgICAgIHByb3AgPSAoMCwgX2NhbWVsaXplU3R5bGUyLmRlZmF1bHQpKHByb3ApO1xuXG4gICAgICBpZiAocHJvcCA9PSAnZmxvYXQnKSBwcm9wID0gJ3N0eWxlRmxvYXQnO1xuXG4gICAgICB2YXIgY3VycmVudCA9IG5vZGUuY3VycmVudFN0eWxlW3Byb3BdIHx8IG51bGw7XG5cbiAgICAgIGlmIChjdXJyZW50ID09IG51bGwgJiYgc3R5bGUgJiYgc3R5bGVbcHJvcF0pIGN1cnJlbnQgPSBzdHlsZVtwcm9wXTtcblxuICAgICAgaWYgKHJudW1ub25weC50ZXN0KGN1cnJlbnQpICYmICFycG9zaXRpb24udGVzdChwcm9wKSkge1xuICAgICAgICAvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzXG4gICAgICAgIHZhciBsZWZ0ID0gc3R5bGUubGVmdDtcbiAgICAgICAgdmFyIHJ1blN0eWxlID0gbm9kZS5ydW50aW1lU3R5bGU7XG4gICAgICAgIHZhciByc0xlZnQgPSBydW5TdHlsZSAmJiBydW5TdHlsZS5sZWZ0O1xuXG4gICAgICAgIC8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXRcbiAgICAgICAgaWYgKHJzTGVmdCkgcnVuU3R5bGUubGVmdCA9IG5vZGUuY3VycmVudFN0eWxlLmxlZnQ7XG5cbiAgICAgICAgc3R5bGUubGVmdCA9IHByb3AgPT09ICdmb250U2l6ZScgPyAnMWVtJyA6IGN1cnJlbnQ7XG4gICAgICAgIGN1cnJlbnQgPSBzdHlsZS5waXhlbExlZnQgKyAncHgnO1xuXG4gICAgICAgIC8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXNcbiAgICAgICAgc3R5bGUubGVmdCA9IGxlZnQ7XG4gICAgICAgIGlmIChyc0xlZnQpIHJ1blN0eWxlLmxlZnQgPSByc0xlZnQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHN0eWxlO1xuXG52YXIgX2NhbWVsaXplU3R5bGUgPSByZXF1aXJlKCcuLi91dGlsL2NhbWVsaXplU3R5bGUnKTtcblxudmFyIF9jYW1lbGl6ZVN0eWxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NhbWVsaXplU3R5bGUpO1xuXG52YXIgX2h5cGhlbmF0ZVN0eWxlID0gcmVxdWlyZSgnLi4vdXRpbC9oeXBoZW5hdGVTdHlsZScpO1xuXG52YXIgX2h5cGhlbmF0ZVN0eWxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2h5cGhlbmF0ZVN0eWxlKTtcblxudmFyIF9nZXRDb21wdXRlZFN0eWxlMiA9IHJlcXVpcmUoJy4vZ2V0Q29tcHV0ZWRTdHlsZScpO1xuXG52YXIgX2dldENvbXB1dGVkU3R5bGUzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0Q29tcHV0ZWRTdHlsZTIpO1xuXG52YXIgX3JlbW92ZVN0eWxlID0gcmVxdWlyZSgnLi9yZW1vdmVTdHlsZScpO1xuXG52YXIgX3JlbW92ZVN0eWxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlbW92ZVN0eWxlKTtcblxudmFyIF9wcm9wZXJ0aWVzID0gcmVxdWlyZSgnLi4vdHJhbnNpdGlvbi9wcm9wZXJ0aWVzJyk7XG5cbnZhciBfaXNUcmFuc2Zvcm0gPSByZXF1aXJlKCcuLi90cmFuc2l0aW9uL2lzVHJhbnNmb3JtJyk7XG5cbnZhciBfaXNUcmFuc2Zvcm0yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNUcmFuc2Zvcm0pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBzdHlsZShub2RlLCBwcm9wZXJ0eSwgdmFsdWUpIHtcbiAgdmFyIGNzcyA9ICcnO1xuICB2YXIgdHJhbnNmb3JtcyA9ICcnO1xuICB2YXIgcHJvcHMgPSBwcm9wZXJ0eTtcblxuICBpZiAodHlwZW9mIHByb3BlcnR5ID09PSAnc3RyaW5nJykge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbm9kZS5zdHlsZVsoMCwgX2NhbWVsaXplU3R5bGUyLmRlZmF1bHQpKHByb3BlcnR5KV0gfHwgKDAsIF9nZXRDb21wdXRlZFN0eWxlMy5kZWZhdWx0KShub2RlKS5nZXRQcm9wZXJ0eVZhbHVlKCgwLCBfaHlwaGVuYXRlU3R5bGUyLmRlZmF1bHQpKHByb3BlcnR5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIChwcm9wcyA9IHt9KVtwcm9wZXJ0eV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIHZhbHVlID0gcHJvcHNba2V5XTtcbiAgICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSB7XG4gICAgICAoMCwgX3JlbW92ZVN0eWxlMi5kZWZhdWx0KShub2RlLCAoMCwgX2h5cGhlbmF0ZVN0eWxlMi5kZWZhdWx0KShrZXkpKTtcbiAgICB9IGVsc2UgaWYgKCgwLCBfaXNUcmFuc2Zvcm0yLmRlZmF1bHQpKGtleSkpIHtcbiAgICAgIHRyYW5zZm9ybXMgKz0ga2V5ICsgJygnICsgdmFsdWUgKyAnKSAnO1xuICAgIH0gZWxzZSB7XG4gICAgICBjc3MgKz0gKDAsIF9oeXBoZW5hdGVTdHlsZTIuZGVmYXVsdCkoa2V5KSArICc6ICcgKyB2YWx1ZSArICc7JztcbiAgICB9XG4gIH0pO1xuXG4gIGlmICh0cmFuc2Zvcm1zKSB7XG4gICAgY3NzICs9IF9wcm9wZXJ0aWVzLnRyYW5zZm9ybSArICc6ICcgKyB0cmFuc2Zvcm1zICsgJzsnO1xuICB9XG5cbiAgbm9kZS5zdHlsZS5jc3NUZXh0ICs9ICc7JyArIGNzcztcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHJlbW92ZVN0eWxlO1xuZnVuY3Rpb24gcmVtb3ZlU3R5bGUobm9kZSwga2V5KSB7XG4gIHJldHVybiAncmVtb3ZlUHJvcGVydHknIGluIG5vZGUuc3R5bGUgPyBub2RlLnN0eWxlLnJlbW92ZVByb3BlcnR5KGtleSkgOiBub2RlLnN0eWxlLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBpc1RyYW5zZm9ybTtcbnZhciBzdXBwb3J0ZWRUcmFuc2Zvcm1zID0gL14oKHRyYW5zbGF0ZXxyb3RhdGV8c2NhbGUpKFh8WXxafDNkKT98bWF0cml4KDNkKT98cGVyc3BlY3RpdmV8c2tldyhYfFkpPykkL2k7XG5cbmZ1bmN0aW9uIGlzVHJhbnNmb3JtKHByb3BlcnR5KSB7XG4gIHJldHVybiAhIShwcm9wZXJ0eSAmJiBzdXBwb3J0ZWRUcmFuc2Zvcm1zLnRlc3QocHJvcGVydHkpKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5hbmltYXRpb25FbmQgPSBleHBvcnRzLmFuaW1hdGlvbkRlbGF5ID0gZXhwb3J0cy5hbmltYXRpb25UaW1pbmcgPSBleHBvcnRzLmFuaW1hdGlvbkR1cmF0aW9uID0gZXhwb3J0cy5hbmltYXRpb25OYW1lID0gZXhwb3J0cy50cmFuc2l0aW9uRW5kID0gZXhwb3J0cy50cmFuc2l0aW9uRHVyYXRpb24gPSBleHBvcnRzLnRyYW5zaXRpb25EZWxheSA9IGV4cG9ydHMudHJhbnNpdGlvblRpbWluZyA9IGV4cG9ydHMudHJhbnNpdGlvblByb3BlcnR5ID0gZXhwb3J0cy50cmFuc2Zvcm0gPSB1bmRlZmluZWQ7XG5cbnZhciBfaW5ET00gPSByZXF1aXJlKCcuLi91dGlsL2luRE9NJyk7XG5cbnZhciBfaW5ET00yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5ET00pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgdHJhbnNmb3JtID0gJ3RyYW5zZm9ybSc7XG52YXIgcHJlZml4ID0gdm9pZCAwLFxuICAgIHRyYW5zaXRpb25FbmQgPSB2b2lkIDAsXG4gICAgYW5pbWF0aW9uRW5kID0gdm9pZCAwO1xudmFyIHRyYW5zaXRpb25Qcm9wZXJ0eSA9IHZvaWQgMCxcbiAgICB0cmFuc2l0aW9uRHVyYXRpb24gPSB2b2lkIDAsXG4gICAgdHJhbnNpdGlvblRpbWluZyA9IHZvaWQgMCxcbiAgICB0cmFuc2l0aW9uRGVsYXkgPSB2b2lkIDA7XG52YXIgYW5pbWF0aW9uTmFtZSA9IHZvaWQgMCxcbiAgICBhbmltYXRpb25EdXJhdGlvbiA9IHZvaWQgMCxcbiAgICBhbmltYXRpb25UaW1pbmcgPSB2b2lkIDAsXG4gICAgYW5pbWF0aW9uRGVsYXkgPSB2b2lkIDA7XG5cbmlmIChfaW5ET00yLmRlZmF1bHQpIHtcbiAgdmFyIF9nZXRUcmFuc2l0aW9uUHJvcGVydCA9IGdldFRyYW5zaXRpb25Qcm9wZXJ0aWVzKCk7XG5cbiAgcHJlZml4ID0gX2dldFRyYW5zaXRpb25Qcm9wZXJ0LnByZWZpeDtcbiAgZXhwb3J0cy50cmFuc2l0aW9uRW5kID0gdHJhbnNpdGlvbkVuZCA9IF9nZXRUcmFuc2l0aW9uUHJvcGVydC50cmFuc2l0aW9uRW5kO1xuICBleHBvcnRzLmFuaW1hdGlvbkVuZCA9IGFuaW1hdGlvbkVuZCA9IF9nZXRUcmFuc2l0aW9uUHJvcGVydC5hbmltYXRpb25FbmQ7XG5cblxuICBleHBvcnRzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybSA9IHByZWZpeCArICctJyArIHRyYW5zZm9ybTtcbiAgZXhwb3J0cy50cmFuc2l0aW9uUHJvcGVydHkgPSB0cmFuc2l0aW9uUHJvcGVydHkgPSBwcmVmaXggKyAnLXRyYW5zaXRpb24tcHJvcGVydHknO1xuICBleHBvcnRzLnRyYW5zaXRpb25EdXJhdGlvbiA9IHRyYW5zaXRpb25EdXJhdGlvbiA9IHByZWZpeCArICctdHJhbnNpdGlvbi1kdXJhdGlvbic7XG4gIGV4cG9ydHMudHJhbnNpdGlvbkRlbGF5ID0gdHJhbnNpdGlvbkRlbGF5ID0gcHJlZml4ICsgJy10cmFuc2l0aW9uLWRlbGF5JztcbiAgZXhwb3J0cy50cmFuc2l0aW9uVGltaW5nID0gdHJhbnNpdGlvblRpbWluZyA9IHByZWZpeCArICctdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nO1xuXG4gIGV4cG9ydHMuYW5pbWF0aW9uTmFtZSA9IGFuaW1hdGlvbk5hbWUgPSBwcmVmaXggKyAnLWFuaW1hdGlvbi1uYW1lJztcbiAgZXhwb3J0cy5hbmltYXRpb25EdXJhdGlvbiA9IGFuaW1hdGlvbkR1cmF0aW9uID0gcHJlZml4ICsgJy1hbmltYXRpb24tZHVyYXRpb24nO1xuICBleHBvcnRzLmFuaW1hdGlvblRpbWluZyA9IGFuaW1hdGlvblRpbWluZyA9IHByZWZpeCArICctYW5pbWF0aW9uLWRlbGF5JztcbiAgZXhwb3J0cy5hbmltYXRpb25EZWxheSA9IGFuaW1hdGlvbkRlbGF5ID0gcHJlZml4ICsgJy1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uJztcbn1cblxuZXhwb3J0cy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG5leHBvcnRzLnRyYW5zaXRpb25Qcm9wZXJ0eSA9IHRyYW5zaXRpb25Qcm9wZXJ0eTtcbmV4cG9ydHMudHJhbnNpdGlvblRpbWluZyA9IHRyYW5zaXRpb25UaW1pbmc7XG5leHBvcnRzLnRyYW5zaXRpb25EZWxheSA9IHRyYW5zaXRpb25EZWxheTtcbmV4cG9ydHMudHJhbnNpdGlvbkR1cmF0aW9uID0gdHJhbnNpdGlvbkR1cmF0aW9uO1xuZXhwb3J0cy50cmFuc2l0aW9uRW5kID0gdHJhbnNpdGlvbkVuZDtcbmV4cG9ydHMuYW5pbWF0aW9uTmFtZSA9IGFuaW1hdGlvbk5hbWU7XG5leHBvcnRzLmFuaW1hdGlvbkR1cmF0aW9uID0gYW5pbWF0aW9uRHVyYXRpb247XG5leHBvcnRzLmFuaW1hdGlvblRpbWluZyA9IGFuaW1hdGlvblRpbWluZztcbmV4cG9ydHMuYW5pbWF0aW9uRGVsYXkgPSBhbmltYXRpb25EZWxheTtcbmV4cG9ydHMuYW5pbWF0aW9uRW5kID0gYW5pbWF0aW9uRW5kO1xuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICB0cmFuc2Zvcm06IHRyYW5zZm9ybSxcbiAgZW5kOiB0cmFuc2l0aW9uRW5kLFxuICBwcm9wZXJ0eTogdHJhbnNpdGlvblByb3BlcnR5LFxuICB0aW1pbmc6IHRyYW5zaXRpb25UaW1pbmcsXG4gIGRlbGF5OiB0cmFuc2l0aW9uRGVsYXksXG4gIGR1cmF0aW9uOiB0cmFuc2l0aW9uRHVyYXRpb25cbn07XG5cblxuZnVuY3Rpb24gZ2V0VHJhbnNpdGlvblByb3BlcnRpZXMoKSB7XG4gIHZhciBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLnN0eWxlO1xuXG4gIHZhciB2ZW5kb3JNYXAgPSB7XG4gICAgTzogZnVuY3Rpb24gTyhlKSB7XG4gICAgICByZXR1cm4gJ28nICsgZS50b0xvd2VyQ2FzZSgpO1xuICAgIH0sXG4gICAgTW96OiBmdW5jdGlvbiBNb3ooZSkge1xuICAgICAgcmV0dXJuIGUudG9Mb3dlckNhc2UoKTtcbiAgICB9LFxuICAgIFdlYmtpdDogZnVuY3Rpb24gV2Via2l0KGUpIHtcbiAgICAgIHJldHVybiAnd2Via2l0JyArIGU7XG4gICAgfSxcbiAgICBtczogZnVuY3Rpb24gbXMoZSkge1xuICAgICAgcmV0dXJuICdNUycgKyBlO1xuICAgIH1cbiAgfTtcblxuICB2YXIgdmVuZG9ycyA9IE9iamVjdC5rZXlzKHZlbmRvck1hcCk7XG5cbiAgdmFyIHRyYW5zaXRpb25FbmQgPSB2b2lkIDAsXG4gICAgICBhbmltYXRpb25FbmQgPSB2b2lkIDA7XG4gIHZhciBwcmVmaXggPSAnJztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHZlbmRvcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdmVuZG9yID0gdmVuZG9yc1tpXTtcblxuICAgIGlmICh2ZW5kb3IgKyAnVHJhbnNpdGlvblByb3BlcnR5JyBpbiBzdHlsZSkge1xuICAgICAgcHJlZml4ID0gJy0nICsgdmVuZG9yLnRvTG93ZXJDYXNlKCk7XG4gICAgICB0cmFuc2l0aW9uRW5kID0gdmVuZG9yTWFwW3ZlbmRvcl0oJ1RyYW5zaXRpb25FbmQnKTtcbiAgICAgIGFuaW1hdGlvbkVuZCA9IHZlbmRvck1hcFt2ZW5kb3JdKCdBbmltYXRpb25FbmQnKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmICghdHJhbnNpdGlvbkVuZCAmJiAndHJhbnNpdGlvblByb3BlcnR5JyBpbiBzdHlsZSkgdHJhbnNpdGlvbkVuZCA9ICd0cmFuc2l0aW9uZW5kJztcblxuICBpZiAoIWFuaW1hdGlvbkVuZCAmJiAnYW5pbWF0aW9uTmFtZScgaW4gc3R5bGUpIGFuaW1hdGlvbkVuZCA9ICdhbmltYXRpb25lbmQnO1xuXG4gIHN0eWxlID0gbnVsbDtcblxuICByZXR1cm4geyBhbmltYXRpb25FbmQ6IGFuaW1hdGlvbkVuZCwgdHJhbnNpdGlvbkVuZDogdHJhbnNpdGlvbkVuZCwgcHJlZml4OiBwcmVmaXggfTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGNhbWVsaXplO1xudmFyIHJIeXBoZW4gPSAvLSguKS9nO1xuXG5mdW5jdGlvbiBjYW1lbGl6ZShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJIeXBoZW4sIGZ1bmN0aW9uIChfLCBjaHIpIHtcbiAgICByZXR1cm4gY2hyLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzW1wiZGVmYXVsdFwiXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBjYW1lbGl6ZVN0eWxlTmFtZTtcblxudmFyIF9jYW1lbGl6ZSA9IHJlcXVpcmUoJy4vY2FtZWxpemUnKTtcblxudmFyIF9jYW1lbGl6ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jYW1lbGl6ZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBtc1BhdHRlcm4gPSAvXi1tcy0vOyAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKiBDb3B5cmlnaHQgMjAxNC0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2Jsb2IvMmFlYjhhMmE2YmViMDA2MTdhNDIxN2Y3ZjgyODQ5MjRmYTJhZDgxOS9zcmMvdmVuZG9yL2NvcmUvY2FtZWxpemVTdHlsZU5hbWUuanNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmZ1bmN0aW9uIGNhbWVsaXplU3R5bGVOYW1lKHN0cmluZykge1xuICByZXR1cm4gKDAsIF9jYW1lbGl6ZTIuZGVmYXVsdCkoc3RyaW5nLnJlcGxhY2UobXNQYXR0ZXJuLCAnbXMtJykpO1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gaHlwaGVuYXRlO1xuXG52YXIgclVwcGVyID0gLyhbQS1aXSkvZztcblxuZnVuY3Rpb24gaHlwaGVuYXRlKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoclVwcGVyLCAnLSQxJykudG9Mb3dlckNhc2UoKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGh5cGhlbmF0ZVN0eWxlTmFtZTtcblxudmFyIF9oeXBoZW5hdGUgPSByZXF1aXJlKCcuL2h5cGhlbmF0ZScpO1xuXG52YXIgX2h5cGhlbmF0ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9oeXBoZW5hdGUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgbXNQYXR0ZXJuID0gL15tcy0vOyAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAqIENvcHlyaWdodCAyMDEzLTIwMTQsIEZhY2Vib29rLCBJbmMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2Jsb2IvMmFlYjhhMmE2YmViMDA2MTdhNDIxN2Y3ZjgyODQ5MjRmYTJhZDgxOS9zcmMvdmVuZG9yL2NvcmUvaHlwaGVuYXRlU3R5bGVOYW1lLmpzXG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuZnVuY3Rpb24gaHlwaGVuYXRlU3R5bGVOYW1lKHN0cmluZykge1xuICByZXR1cm4gKDAsIF9oeXBoZW5hdGUyLmRlZmF1bHQpKHN0cmluZykucmVwbGFjZShtc1BhdHRlcm4sICctbXMtJyk7XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAocmVjYWxjKSB7XG4gIGlmICghc2l6ZSB8fCByZWNhbGMpIHtcbiAgICBpZiAoX2luRE9NMi5kZWZhdWx0KSB7XG4gICAgICB2YXIgc2Nyb2xsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIHNjcm9sbERpdi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICBzY3JvbGxEaXYuc3R5bGUudG9wID0gJy05OTk5cHgnO1xuICAgICAgc2Nyb2xsRGl2LnN0eWxlLndpZHRoID0gJzUwcHgnO1xuICAgICAgc2Nyb2xsRGl2LnN0eWxlLmhlaWdodCA9ICc1MHB4JztcbiAgICAgIHNjcm9sbERpdi5zdHlsZS5vdmVyZmxvdyA9ICdzY3JvbGwnO1xuXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcm9sbERpdik7XG4gICAgICBzaXplID0gc2Nyb2xsRGl2Lm9mZnNldFdpZHRoIC0gc2Nyb2xsRGl2LmNsaWVudFdpZHRoO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChzY3JvbGxEaXYpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzaXplO1xufTtcblxudmFyIF9pbkRPTSA9IHJlcXVpcmUoJy4vaW5ET00nKTtcblxudmFyIF9pbkRPTTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbkRPTSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBzaXplID0gdm9pZCAwO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuZnVuY3Rpb24gRXZlbnRFbWl0dGVyKCkge1xuICB0aGlzLl9ldmVudHMgPSB0aGlzLl9ldmVudHMgfHwge307XG4gIHRoaXMuX21heExpc3RlbmVycyA9IHRoaXMuX21heExpc3RlbmVycyB8fCB1bmRlZmluZWQ7XG59XG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcblxuLy8gQmFja3dhcmRzLWNvbXBhdCB3aXRoIG5vZGUgMC4xMC54XG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9ldmVudHMgPSB1bmRlZmluZWQ7XG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnMgPSB1bmRlZmluZWQ7XG5cbi8vIEJ5IGRlZmF1bHQgRXZlbnRFbWl0dGVycyB3aWxsIHByaW50IGEgd2FybmluZyBpZiBtb3JlIHRoYW4gMTAgbGlzdGVuZXJzIGFyZVxuLy8gYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaCBoZWxwcyBmaW5kaW5nIG1lbW9yeSBsZWFrcy5cbkV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XG5cbi8vIE9idmlvdXNseSBub3QgYWxsIEVtaXR0ZXJzIHNob3VsZCBiZSBsaW1pdGVkIHRvIDEwLiBUaGlzIGZ1bmN0aW9uIGFsbG93c1xuLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uKG4pIHtcbiAgaWYgKCFpc051bWJlcihuKSB8fCBuIDwgMCB8fCBpc05hTihuKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ24gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlcicpO1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSBuO1xuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIGVyLCBoYW5kbGVyLCBsZW4sIGFyZ3MsIGksIGxpc3RlbmVycztcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcblxuICAvLyBJZiB0aGVyZSBpcyBubyAnZXJyb3InIGV2ZW50IGxpc3RlbmVyIHRoZW4gdGhyb3cuXG4gIGlmICh0eXBlID09PSAnZXJyb3InKSB7XG4gICAgaWYgKCF0aGlzLl9ldmVudHMuZXJyb3IgfHxcbiAgICAgICAgKGlzT2JqZWN0KHRoaXMuX2V2ZW50cy5lcnJvcikgJiYgIXRoaXMuX2V2ZW50cy5lcnJvci5sZW5ndGgpKSB7XG4gICAgICBlciA9IGFyZ3VtZW50c1sxXTtcbiAgICAgIGlmIChlciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IGVyOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQXQgbGVhc3QgZ2l2ZSBzb21lIGtpbmQgb2YgY29udGV4dCB0byB0aGUgdXNlclxuICAgICAgICB2YXIgZXJyID0gbmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgXCJlcnJvclwiIGV2ZW50LiAoJyArIGVyICsgJyknKTtcbiAgICAgICAgZXJyLmNvbnRleHQgPSBlcjtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgaWYgKGlzVW5kZWZpbmVkKGhhbmRsZXIpKVxuICAgIHJldHVybiBmYWxzZTtcblxuICBpZiAoaXNGdW5jdGlvbihoYW5kbGVyKSkge1xuICAgIHN3aXRjaCAoYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgLy8gZmFzdCBjYXNlc1xuICAgICAgY2FzZSAxOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gc2xvd2VyXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgICAgaGFuZGxlci5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QoaGFuZGxlcikpIHtcbiAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICBsaXN0ZW5lcnMgPSBoYW5kbGVyLnNsaWNlKCk7XG4gICAgbGVuID0gbGlzdGVuZXJzLmxlbmd0aDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXG4gICAgICBsaXN0ZW5lcnNbaV0uYXBwbHkodGhpcywgYXJncyk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PT0gXCJuZXdMaXN0ZW5lclwiISBCZWZvcmVcbiAgLy8gYWRkaW5nIGl0IHRvIHRoZSBsaXN0ZW5lcnMsIGZpcnN0IGVtaXQgXCJuZXdMaXN0ZW5lclwiLlxuICBpZiAodGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyKVxuICAgIHRoaXMuZW1pdCgnbmV3TGlzdGVuZXInLCB0eXBlLFxuICAgICAgICAgICAgICBpc0Z1bmN0aW9uKGxpc3RlbmVyLmxpc3RlbmVyKSA/XG4gICAgICAgICAgICAgIGxpc3RlbmVyLmxpc3RlbmVyIDogbGlzdGVuZXIpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IGxpc3RlbmVyO1xuICBlbHNlIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgZ290IGFuIGFycmF5LCBqdXN0IGFwcGVuZC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XG4gIGVsc2VcbiAgICAvLyBBZGRpbmcgdGhlIHNlY29uZCBlbGVtZW50LCBuZWVkIHRvIGNoYW5nZSB0byBhcnJheS5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBbdGhpcy5fZXZlbnRzW3R5cGVdLCBsaXN0ZW5lcl07XG5cbiAgLy8gQ2hlY2sgZm9yIGxpc3RlbmVyIGxlYWtcbiAgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkgJiYgIXRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQpIHtcbiAgICBpZiAoIWlzVW5kZWZpbmVkKHRoaXMuX21heExpc3RlbmVycykpIHtcbiAgICAgIG0gPSB0aGlzLl9tYXhMaXN0ZW5lcnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSBFdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycztcbiAgICB9XG5cbiAgICBpZiAobSAmJiBtID4gMCAmJiB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoID4gbSkge1xuICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCA9IHRydWU7XG4gICAgICBjb25zb2xlLmVycm9yKCcobm9kZSkgd2FybmluZzogcG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSAnICtcbiAgICAgICAgICAgICAgICAgICAgJ2xlYWsgZGV0ZWN0ZWQuICVkIGxpc3RlbmVycyBhZGRlZC4gJyArXG4gICAgICAgICAgICAgICAgICAgICdVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC4nLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNbdHlwZV0ubGVuZ3RoKTtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZS50cmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIGluIElFIDEwXG4gICAgICAgIGNvbnNvbGUudHJhY2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub24gPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyO1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgdmFyIGZpcmVkID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZygpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGcpO1xuXG4gICAgaWYgKCFmaXJlZCkge1xuICAgICAgZmlyZWQgPSB0cnVlO1xuICAgICAgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICBnLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gIHRoaXMub24odHlwZSwgZyk7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vLyBlbWl0cyBhICdyZW1vdmVMaXN0ZW5lcicgZXZlbnQgaWZmIHRoZSBsaXN0ZW5lciB3YXMgcmVtb3ZlZFxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBsaXN0LCBwb3NpdGlvbiwgbGVuZ3RoLCBpO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIGxpc3QgPSB0aGlzLl9ldmVudHNbdHlwZV07XG4gIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICBwb3NpdGlvbiA9IC0xO1xuXG4gIGlmIChsaXN0ID09PSBsaXN0ZW5lciB8fFxuICAgICAgKGlzRnVuY3Rpb24obGlzdC5saXN0ZW5lcikgJiYgbGlzdC5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcblxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGxpc3QpKSB7XG4gICAgZm9yIChpID0gbGVuZ3RoOyBpLS0gPiAwOykge1xuICAgICAgaWYgKGxpc3RbaV0gPT09IGxpc3RlbmVyIHx8XG4gICAgICAgICAgKGxpc3RbaV0ubGlzdGVuZXIgJiYgbGlzdFtpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpKSB7XG4gICAgICAgIHBvc2l0aW9uID0gaTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBvc2l0aW9uIDwgMClcbiAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKGxpc3QubGVuZ3RoID09PSAxKSB7XG4gICAgICBsaXN0Lmxlbmd0aCA9IDA7XG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0LnNwbGljZShwb3NpdGlvbiwgMSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIga2V5LCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgLy8gbm90IGxpc3RlbmluZyBmb3IgcmVtb3ZlTGlzdGVuZXIsIG5vIG5lZWQgdG8gZW1pdFxuICBpZiAoIXRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcikge1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgZWxzZSBpZiAodGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGVtaXQgcmVtb3ZlTGlzdGVuZXIgZm9yIGFsbCBsaXN0ZW5lcnMgb24gYWxsIGV2ZW50c1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGZvciAoa2V5IGluIHRoaXMuX2V2ZW50cykge1xuICAgICAgaWYgKGtleSA9PT0gJ3JlbW92ZUxpc3RlbmVyJykgY29udGludWU7XG4gICAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhrZXkpO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygncmVtb3ZlTGlzdGVuZXInKTtcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNGdW5jdGlvbihsaXN0ZW5lcnMpKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnMpO1xuICB9IGVsc2UgaWYgKGxpc3RlbmVycykge1xuICAgIC8vIExJRk8gb3JkZXJcbiAgICB3aGlsZSAobGlzdGVuZXJzLmxlbmd0aClcbiAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzW2xpc3RlbmVycy5sZW5ndGggLSAxXSk7XG4gIH1cbiAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgcmV0O1xuICBpZiAoIXRoaXMuX2V2ZW50cyB8fCAhdGhpcy5fZXZlbnRzW3R5cGVdKVxuICAgIHJldCA9IFtdO1xuICBlbHNlIGlmIChpc0Z1bmN0aW9uKHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgcmV0ID0gW3RoaXMuX2V2ZW50c1t0eXBlXV07XG4gIGVsc2VcbiAgICByZXQgPSB0aGlzLl9ldmVudHNbdHlwZV0uc2xpY2UoKTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgaWYgKHRoaXMuX2V2ZW50cykge1xuICAgIHZhciBldmxpc3RlbmVyID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gICAgaWYgKGlzRnVuY3Rpb24oZXZsaXN0ZW5lcikpXG4gICAgICByZXR1cm4gMTtcbiAgICBlbHNlIGlmIChldmxpc3RlbmVyKVxuICAgICAgcmV0dXJuIGV2bGlzdGVuZXIubGVuZ3RoO1xuICB9XG4gIHJldHVybiAwO1xufTtcblxuRXZlbnRFbWl0dGVyLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7XG4gIHJldHVybiBlbWl0dGVyLmxpc3RlbmVyQ291bnQodHlwZSk7XG59O1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxudmFyIGZiZW1pdHRlciA9IHtcbiAgRXZlbnRFbWl0dGVyOiByZXF1aXJlKCcuL2xpYi9CYXNlRXZlbnRFbWl0dGVyJyksXG4gIEVtaXR0ZXJTdWJzY3JpcHRpb24gOiByZXF1aXJlKCcuL2xpYi9FbWl0dGVyU3Vic2NyaXB0aW9uJylcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZmJlbWl0dGVyO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBCYXNlRXZlbnRFbWl0dGVyXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbnZhciBFbWl0dGVyU3Vic2NyaXB0aW9uID0gcmVxdWlyZSgnLi9FbWl0dGVyU3Vic2NyaXB0aW9uJyk7XG52YXIgRXZlbnRTdWJzY3JpcHRpb25WZW5kb3IgPSByZXF1aXJlKCcuL0V2ZW50U3Vic2NyaXB0aW9uVmVuZG9yJyk7XG5cbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlGdW5jdGlvbicpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIEBjbGFzcyBCYXNlRXZlbnRFbWl0dGVyXG4gKiBAZGVzY3JpcHRpb25cbiAqIEFuIEV2ZW50RW1pdHRlciBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgYSBzZXQgb2YgbGlzdGVuZXJzIGFuZCBwdWJsaXNoaW5nXG4gKiBldmVudHMgdG8gdGhlbSB3aGVuIGl0IGlzIHRvbGQgdGhhdCBzdWNoIGV2ZW50cyBoYXBwZW5lZC4gSW4gYWRkaXRpb24gdG8gdGhlXG4gKiBkYXRhIGZvciB0aGUgZ2l2ZW4gZXZlbnQgaXQgYWxzbyBzZW5kcyBhIGV2ZW50IGNvbnRyb2wgb2JqZWN0IHdoaWNoIGFsbG93c1xuICogdGhlIGxpc3RlbmVycy9oYW5kbGVycyB0byBwcmV2ZW50IHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZSBnaXZlbiBldmVudC5cbiAqXG4gKiBUaGUgZW1pdHRlciBpcyBkZXNpZ25lZCB0byBiZSBnZW5lcmljIGVub3VnaCB0byBzdXBwb3J0IGFsbCB0aGUgZGlmZmVyZW50XG4gKiBjb250ZXh0cyBpbiB3aGljaCBvbmUgbWlnaHQgd2FudCB0byBlbWl0IGV2ZW50cy4gSXQgaXMgYSBzaW1wbGUgbXVsdGljYXN0XG4gKiBtZWNoYW5pc20gb24gdG9wIG9mIHdoaWNoIGV4dHJhIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIGNvbXBvc2VkLiBGb3IgZXhhbXBsZSwgYVxuICogbW9yZSBhZHZhbmNlZCBlbWl0dGVyIG1heSB1c2UgYW4gRXZlbnRIb2xkZXIgYW5kIEV2ZW50RmFjdG9yeS5cbiAqL1xuXG52YXIgQmFzZUV2ZW50RW1pdHRlciA9IChmdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBAY29uc3RydWN0b3JcbiAgICovXG5cbiAgZnVuY3Rpb24gQmFzZUV2ZW50RW1pdHRlcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQmFzZUV2ZW50RW1pdHRlcik7XG5cbiAgICB0aGlzLl9zdWJzY3JpYmVyID0gbmV3IEV2ZW50U3Vic2NyaXB0aW9uVmVuZG9yKCk7XG4gICAgdGhpcy5fY3VycmVudFN1YnNjcmlwdGlvbiA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGxpc3RlbmVyIHRvIGJlIGludm9rZWQgd2hlbiBldmVudHMgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGFyZVxuICAgKiBlbWl0dGVkLiBBbiBvcHRpb25hbCBjYWxsaW5nIGNvbnRleHQgbWF5IGJlIHByb3ZpZGVkLiBUaGUgZGF0YSBhcmd1bWVudHNcbiAgICogZW1pdHRlZCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gICAqXG4gICAqIFRPRE86IEFubm90YXRlIHRoZSBsaXN0ZW5lciBhcmcncyB0eXBlLiBUaGlzIGlzIHRyaWNreSBiZWNhdXNlIGxpc3RlbmVyc1xuICAgKiAgICAgICBjYW4gYmUgaW52b2tlZCB3aXRoIHZhcmFyZ3MuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgLSBOYW1lIG9mIHRoZSBldmVudCB0byBsaXN0ZW4gdG9cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXIgLSBGdW5jdGlvbiB0byBpbnZva2Ugd2hlbiB0aGUgc3BlY2lmaWVkIGV2ZW50IGlzXG4gICAqICAgZW1pdHRlZFxuICAgKiBAcGFyYW0geyp9IGNvbnRleHQgLSBPcHRpb25hbCBjb250ZXh0IG9iamVjdCB0byB1c2Ugd2hlbiBpbnZva2luZyB0aGVcbiAgICogICBsaXN0ZW5lclxuICAgKi9cblxuICBCYXNlRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uIGFkZExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gdGhpcy5fc3Vic2NyaWJlci5hZGRTdWJzY3JpcHRpb24oZXZlbnRUeXBlLCBuZXcgRW1pdHRlclN1YnNjcmlwdGlvbih0aGlzLl9zdWJzY3JpYmVyLCBsaXN0ZW5lciwgY29udGV4dCkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBTaW1pbGFyIHRvIGFkZExpc3RlbmVyLCBleGNlcHQgdGhhdCB0aGUgbGlzdGVuZXIgaXMgcmVtb3ZlZCBhZnRlciBpdCBpc1xuICAgKiBpbnZva2VkIG9uY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgLSBOYW1lIG9mIHRoZSBldmVudCB0byBsaXN0ZW4gdG9cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gbGlzdGVuZXIgLSBGdW5jdGlvbiB0byBpbnZva2Ugb25seSBvbmNlIHdoZW4gdGhlXG4gICAqICAgc3BlY2lmaWVkIGV2ZW50IGlzIGVtaXR0ZWRcbiAgICogQHBhcmFtIHsqfSBjb250ZXh0IC0gT3B0aW9uYWwgY29udGV4dCBvYmplY3QgdG8gdXNlIHdoZW4gaW52b2tpbmcgdGhlXG4gICAqICAgbGlzdGVuZXJcbiAgICovXG5cbiAgQmFzZUV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UoZXZlbnRUeXBlLCBsaXN0ZW5lciwgY29udGV4dCkge1xuICAgIHZhciBlbWl0dGVyID0gdGhpcztcbiAgICByZXR1cm4gdGhpcy5hZGRMaXN0ZW5lcihldmVudFR5cGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGVtaXR0ZXIucmVtb3ZlQ3VycmVudExpc3RlbmVyKCk7XG4gICAgICBsaXN0ZW5lci5hcHBseShjb250ZXh0LCBhcmd1bWVudHMpO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGFsbCBvZiB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMsIGluY2x1ZGluZyB0aG9zZSByZWdpc3RlcmVkIGFzXG4gICAqIGxpc3RlbmVyIG1hcHMuXG4gICAqXG4gICAqIEBwYXJhbSB7P3N0cmluZ30gZXZlbnRUeXBlIC0gT3B0aW9uYWwgbmFtZSBvZiB0aGUgZXZlbnQgd2hvc2UgcmVnaXN0ZXJlZFxuICAgKiAgIGxpc3RlbmVycyB0byByZW1vdmVcbiAgICovXG5cbiAgQmFzZUV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVtb3ZlQWxsTGlzdGVuZXJzKGV2ZW50VHlwZSkge1xuICAgIHRoaXMuX3N1YnNjcmliZXIucmVtb3ZlQWxsU3Vic2NyaXB0aW9ucyhldmVudFR5cGUpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhbiBBUEkgdGhhdCBjYW4gYmUgY2FsbGVkIGR1cmluZyBhbiBldmVudGluZyBjeWNsZSB0byByZW1vdmUgdGhlXG4gICAqIGxhc3QgbGlzdGVuZXIgdGhhdCB3YXMgaW52b2tlZC4gVGhpcyBhbGxvd3MgYSBkZXZlbG9wZXIgdG8gcHJvdmlkZSBhbiBldmVudFxuICAgKiBvYmplY3QgdGhhdCBjYW4gcmVtb3ZlIHRoZSBsaXN0ZW5lciAob3IgbGlzdGVuZXIgbWFwKSBkdXJpbmcgdGhlXG4gICAqIGludm9jYXRpb24uXG4gICAqXG4gICAqIElmIGl0IGlzIGNhbGxlZCB3aGVuIG5vdCBpbnNpZGUgb2YgYW4gZW1pdHRpbmcgY3ljbGUgaXQgd2lsbCB0aHJvdy5cbiAgICpcbiAgICogQHRocm93cyB7RXJyb3J9IFdoZW4gY2FsbGVkIG5vdCBkdXJpbmcgYW4gZXZlbnRpbmcgY3ljbGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogICB2YXIgc3Vic2NyaXB0aW9uID0gZW1pdHRlci5hZGRMaXN0ZW5lck1hcCh7XG4gICAqICAgICBzb21lRXZlbnQ6IGZ1bmN0aW9uKGRhdGEsIGV2ZW50KSB7XG4gICAqICAgICAgIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgKiAgICAgICBlbWl0dGVyLnJlbW92ZUN1cnJlbnRMaXN0ZW5lcigpO1xuICAgKiAgICAgfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiAgIGVtaXR0ZXIuZW1pdCgnc29tZUV2ZW50JywgJ2FiYycpOyAvLyBsb2dzICdhYmMnXG4gICAqICAgZW1pdHRlci5lbWl0KCdzb21lRXZlbnQnLCAnZGVmJyk7IC8vIGRvZXMgbm90IGxvZyBhbnl0aGluZ1xuICAgKi9cblxuICBCYXNlRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVDdXJyZW50TGlzdGVuZXIgPSBmdW5jdGlvbiByZW1vdmVDdXJyZW50TGlzdGVuZXIoKSB7XG4gICAgISEhdGhpcy5fY3VycmVudFN1YnNjcmlwdGlvbiA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdOb3QgaW4gYW4gZW1pdHRpbmcgY3ljbGU7IHRoZXJlIGlzIG5vIGN1cnJlbnQgc3Vic2NyaXB0aW9uJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuX3N1YnNjcmliZXIucmVtb3ZlU3Vic2NyaXB0aW9uKHRoaXMuX2N1cnJlbnRTdWJzY3JpcHRpb24pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGxpc3RlbmVycyB0aGF0IGFyZSBjdXJyZW50bHkgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuXG4gICAqIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRUeXBlIC0gTmFtZSBvZiB0aGUgZXZlbnQgdG8gcXVlcnlcbiAgICogQHJldHVybiB7YXJyYXl9XG4gICAqL1xuXG4gIEJhc2VFdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uIGxpc3RlbmVycyhldmVudFR5cGUpIC8qIFRPRE86IEFycmF5PEV2ZW50U3Vic2NyaXB0aW9uPiAqL3tcbiAgICB2YXIgc3Vic2NyaXB0aW9ucyA9IHRoaXMuX3N1YnNjcmliZXIuZ2V0U3Vic2NyaXB0aW9uc0ZvclR5cGUoZXZlbnRUeXBlKTtcbiAgICByZXR1cm4gc3Vic2NyaXB0aW9ucyA/IHN1YnNjcmlwdGlvbnMuZmlsdGVyKGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlKS5tYXAoZnVuY3Rpb24gKHN1YnNjcmlwdGlvbikge1xuICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbi5saXN0ZW5lcjtcbiAgICB9KSA6IFtdO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFbWl0cyBhbiBldmVudCBvZiB0aGUgZ2l2ZW4gdHlwZSB3aXRoIHRoZSBnaXZlbiBkYXRhLiBBbGwgaGFuZGxlcnMgb2YgdGhhdFxuICAgKiBwYXJ0aWN1bGFyIHR5cGUgd2lsbCBiZSBub3RpZmllZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50VHlwZSAtIE5hbWUgb2YgdGhlIGV2ZW50IHRvIGVtaXRcbiAgICogQHBhcmFtIHsqfSBBcmJpdHJhcnkgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byBlYWNoIHJlZ2lzdGVyZWQgbGlzdGVuZXJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogICBlbWl0dGVyLmFkZExpc3RlbmVyKCdzb21lRXZlbnQnLCBmdW5jdGlvbihtZXNzYWdlKSB7XG4gICAqICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbiAgICogICB9KTtcbiAgICpcbiAgICogICBlbWl0dGVyLmVtaXQoJ3NvbWVFdmVudCcsICdhYmMnKTsgLy8gbG9ncyAnYWJjJ1xuICAgKi9cblxuICBCYXNlRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdChldmVudFR5cGUpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9ucyA9IHRoaXMuX3N1YnNjcmliZXIuZ2V0U3Vic2NyaXB0aW9uc0ZvclR5cGUoZXZlbnRUeXBlKTtcbiAgICBpZiAoc3Vic2NyaXB0aW9ucykge1xuICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhzdWJzY3JpcHRpb25zKTtcbiAgICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCBrZXlzLmxlbmd0aDsgaWkrKykge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1tpaV07XG4gICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSBzdWJzY3JpcHRpb25zW2tleV07XG4gICAgICAgIC8vIFRoZSBzdWJzY3JpcHRpb24gbWF5IGhhdmUgYmVlbiByZW1vdmVkIGR1cmluZyB0aGlzIGV2ZW50IGxvb3AuXG4gICAgICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50U3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uO1xuICAgICAgICAgIHRoaXMuX19lbWl0VG9TdWJzY3JpcHRpb24uYXBwbHkodGhpcywgW3N1YnNjcmlwdGlvbl0uY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5fY3VycmVudFN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhIGhvb2sgdG8gb3ZlcnJpZGUgaG93IHRoZSBlbWl0dGVyIGVtaXRzIGFuIGV2ZW50IHRvIGEgc3BlY2lmaWNcbiAgICogc3Vic2NyaXB0aW9uLiBUaGlzIGFsbG93cyB5b3UgdG8gc2V0IHVwIGxvZ2dpbmcgYW5kIGVycm9yIGJvdW5kYXJpZXNcbiAgICogc3BlY2lmaWMgdG8geW91ciBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtFbWl0dGVyU3Vic2NyaXB0aW9ufSBzdWJzY3JpcHRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50VHlwZVxuICAgKiBAcGFyYW0geyp9IEFyYml0cmFyeSBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIGVhY2ggcmVnaXN0ZXJlZCBsaXN0ZW5lclxuICAgKi9cblxuICBCYXNlRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fX2VtaXRUb1N1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uIF9fZW1pdFRvU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbiwgZXZlbnRUeXBlKSB7XG4gICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpO1xuICAgIHN1YnNjcmlwdGlvbi5saXN0ZW5lci5hcHBseShzdWJzY3JpcHRpb24uY29udGV4dCwgYXJncyk7XG4gIH07XG5cbiAgcmV0dXJuIEJhc2VFdmVudEVtaXR0ZXI7XG59KSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEJhc2VFdmVudEVtaXR0ZXI7IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICogXG4gKiBAcHJvdmlkZXNNb2R1bGUgRW1pdHRlclN1YnNjcmlwdGlvblxuICogQHR5cGVjaGVja3NcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgRXZlbnRTdWJzY3JpcHRpb24gPSByZXF1aXJlKCcuL0V2ZW50U3Vic2NyaXB0aW9uJyk7XG5cbi8qKlxuICogRW1pdHRlclN1YnNjcmlwdGlvbiByZXByZXNlbnRzIGEgc3Vic2NyaXB0aW9uIHdpdGggbGlzdGVuZXIgYW5kIGNvbnRleHQgZGF0YS5cbiAqL1xuXG52YXIgRW1pdHRlclN1YnNjcmlwdGlvbiA9IChmdW5jdGlvbiAoX0V2ZW50U3Vic2NyaXB0aW9uKSB7XG4gIF9pbmhlcml0cyhFbWl0dGVyU3Vic2NyaXB0aW9uLCBfRXZlbnRTdWJzY3JpcHRpb24pO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50U3Vic2NyaXB0aW9uVmVuZG9yfSBzdWJzY3JpYmVyIC0gVGhlIHN1YnNjcmliZXIgdGhhdCBjb250cm9sc1xuICAgKiAgIHRoaXMgc3Vic2NyaXB0aW9uXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyIC0gRnVuY3Rpb24gdG8gaW52b2tlIHdoZW4gdGhlIHNwZWNpZmllZCBldmVudCBpc1xuICAgKiAgIGVtaXR0ZWRcbiAgICogQHBhcmFtIHsqfSBjb250ZXh0IC0gT3B0aW9uYWwgY29udGV4dCBvYmplY3QgdG8gdXNlIHdoZW4gaW52b2tpbmcgdGhlXG4gICAqICAgbGlzdGVuZXJcbiAgICovXG5cbiAgZnVuY3Rpb24gRW1pdHRlclN1YnNjcmlwdGlvbihzdWJzY3JpYmVyLCBsaXN0ZW5lciwgY29udGV4dCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBFbWl0dGVyU3Vic2NyaXB0aW9uKTtcblxuICAgIF9FdmVudFN1YnNjcmlwdGlvbi5jYWxsKHRoaXMsIHN1YnNjcmliZXIpO1xuICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB9XG5cbiAgcmV0dXJuIEVtaXR0ZXJTdWJzY3JpcHRpb247XG59KShFdmVudFN1YnNjcmlwdGlvbik7XG5cbm1vZHVsZS5leHBvcnRzID0gRW1pdHRlclN1YnNjcmlwdGlvbjsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIEV2ZW50U3Vic2NyaXB0aW9uXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBFdmVudFN1YnNjcmlwdGlvbiByZXByZXNlbnRzIGEgc3Vic2NyaXB0aW9uIHRvIGEgcGFydGljdWxhciBldmVudC4gSXQgY2FuXG4gKiByZW1vdmUgaXRzIG93biBzdWJzY3JpcHRpb24uXG4gKi9cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbnZhciBFdmVudFN1YnNjcmlwdGlvbiA9IChmdW5jdGlvbiAoKSB7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRTdWJzY3JpcHRpb25WZW5kb3J9IHN1YnNjcmliZXIgdGhlIHN1YnNjcmliZXIgdGhhdCBjb250cm9sc1xuICAgKiAgIHRoaXMgc3Vic2NyaXB0aW9uLlxuICAgKi9cblxuICBmdW5jdGlvbiBFdmVudFN1YnNjcmlwdGlvbihzdWJzY3JpYmVyKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEV2ZW50U3Vic2NyaXB0aW9uKTtcblxuICAgIHRoaXMuc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGlzIHN1YnNjcmlwdGlvbiBmcm9tIHRoZSBzdWJzY3JpYmVyIHRoYXQgY29udHJvbHMgaXQuXG4gICAqL1xuXG4gIEV2ZW50U3Vic2NyaXB0aW9uLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgaWYgKHRoaXMuc3Vic2NyaWJlcikge1xuICAgICAgdGhpcy5zdWJzY3JpYmVyLnJlbW92ZVN1YnNjcmlwdGlvbih0aGlzKTtcbiAgICAgIHRoaXMuc3Vic2NyaWJlciA9IG51bGw7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBFdmVudFN1YnNjcmlwdGlvbjtcbn0pKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRTdWJzY3JpcHRpb247IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICogXG4gKiBAcHJvdmlkZXNNb2R1bGUgRXZlbnRTdWJzY3JpcHRpb25WZW5kb3JcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIEV2ZW50U3Vic2NyaXB0aW9uVmVuZG9yIHN0b3JlcyBhIHNldCBvZiBFdmVudFN1YnNjcmlwdGlvbnMgdGhhdCBhcmVcbiAqIHN1YnNjcmliZWQgdG8gYSBwYXJ0aWN1bGFyIGV2ZW50IHR5cGUuXG4gKi9cblxudmFyIEV2ZW50U3Vic2NyaXB0aW9uVmVuZG9yID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRXZlbnRTdWJzY3JpcHRpb25WZW5kb3IoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEV2ZW50U3Vic2NyaXB0aW9uVmVuZG9yKTtcblxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnNGb3JUeXBlID0ge307XG4gICAgdGhpcy5fY3VycmVudFN1YnNjcmlwdGlvbiA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHN1YnNjcmlwdGlvbiBrZXllZCBieSBhbiBldmVudCB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRUeXBlXG4gICAqIEBwYXJhbSB7RXZlbnRTdWJzY3JpcHRpb259IHN1YnNjcmlwdGlvblxuICAgKi9cblxuICBFdmVudFN1YnNjcmlwdGlvblZlbmRvci5wcm90b3R5cGUuYWRkU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gYWRkU3Vic2NyaXB0aW9uKGV2ZW50VHlwZSwgc3Vic2NyaXB0aW9uKSB7XG4gICAgIShzdWJzY3JpcHRpb24uc3Vic2NyaWJlciA9PT0gdGhpcykgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVGhlIHN1YnNjcmliZXIgb2YgdGhlIHN1YnNjcmlwdGlvbiBpcyBpbmNvcnJlY3RseSBzZXQuJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdW5kZWZpbmVkO1xuICAgIGlmICghdGhpcy5fc3Vic2NyaXB0aW9uc0ZvclR5cGVbZXZlbnRUeXBlXSkge1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uc0ZvclR5cGVbZXZlbnRUeXBlXSA9IFtdO1xuICAgIH1cbiAgICB2YXIga2V5ID0gdGhpcy5fc3Vic2NyaXB0aW9uc0ZvclR5cGVbZXZlbnRUeXBlXS5sZW5ndGg7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uc0ZvclR5cGVbZXZlbnRUeXBlXS5wdXNoKHN1YnNjcmlwdGlvbik7XG4gICAgc3Vic2NyaXB0aW9uLmV2ZW50VHlwZSA9IGV2ZW50VHlwZTtcbiAgICBzdWJzY3JpcHRpb24ua2V5ID0ga2V5O1xuICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBidWxrIHNldCBvZiB0aGUgc3Vic2NyaXB0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHs/c3RyaW5nfSBldmVudFR5cGUgLSBPcHRpb25hbCBuYW1lIG9mIHRoZSBldmVudCB0eXBlIHdob3NlXG4gICAqICAgcmVnaXN0ZXJlZCBzdXBzY3JpcHRpb25zIHRvIHJlbW92ZSwgaWYgbnVsbCByZW1vdmUgYWxsIHN1YnNjcmlwdGlvbnMuXG4gICAqL1xuXG4gIEV2ZW50U3Vic2NyaXB0aW9uVmVuZG9yLnByb3RvdHlwZS5yZW1vdmVBbGxTdWJzY3JpcHRpb25zID0gZnVuY3Rpb24gcmVtb3ZlQWxsU3Vic2NyaXB0aW9ucyhldmVudFR5cGUpIHtcbiAgICBpZiAoZXZlbnRUeXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnNGb3JUeXBlID0ge307XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9zdWJzY3JpcHRpb25zRm9yVHlwZVtldmVudFR5cGVdO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlcyBhIHNwZWNpZmljIHN1YnNjcmlwdGlvbi4gSW5zdGVhZCBvZiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIGNhbGxcbiAgICogYHN1YnNjcmlwdGlvbi5yZW1vdmUoKWAgZGlyZWN0bHkuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzdWJzY3JpcHRpb25cbiAgICovXG5cbiAgRXZlbnRTdWJzY3JpcHRpb25WZW5kb3IucHJvdG90eXBlLnJlbW92ZVN1YnNjcmlwdGlvbiA9IGZ1bmN0aW9uIHJlbW92ZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgICB2YXIgZXZlbnRUeXBlID0gc3Vic2NyaXB0aW9uLmV2ZW50VHlwZTtcbiAgICB2YXIga2V5ID0gc3Vic2NyaXB0aW9uLmtleTtcblxuICAgIHZhciBzdWJzY3JpcHRpb25zRm9yVHlwZSA9IHRoaXMuX3N1YnNjcmlwdGlvbnNGb3JUeXBlW2V2ZW50VHlwZV07XG4gICAgaWYgKHN1YnNjcmlwdGlvbnNGb3JUeXBlKSB7XG4gICAgICBkZWxldGUgc3Vic2NyaXB0aW9uc0ZvclR5cGVba2V5XTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHN1YnNjcmlwdGlvbnMgdGhhdCBhcmUgY3VycmVudGx5IHJlZ2lzdGVyZWQgZm9yIHRoZVxuICAgKiBnaXZlbiBldmVudCB0eXBlLlxuICAgKlxuICAgKiBOb3RlOiBUaGlzIGFycmF5IGNhbiBiZSBwb3RlbnRpYWxseSBzcGFyc2UgYXMgc3Vic2NyaXB0aW9ucyBhcmUgZGVsZXRlZFxuICAgKiBmcm9tIGl0IHdoZW4gdGhleSBhcmUgcmVtb3ZlZC5cbiAgICpcbiAgICogVE9ETzogVGhpcyByZXR1cm5zIGEgbnVsbGFibGUgYXJyYXkuIHdhdD9cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50VHlwZVxuICAgKiBAcmV0dXJuIHs/YXJyYXl9XG4gICAqL1xuXG4gIEV2ZW50U3Vic2NyaXB0aW9uVmVuZG9yLnByb3RvdHlwZS5nZXRTdWJzY3JpcHRpb25zRm9yVHlwZSA9IGZ1bmN0aW9uIGdldFN1YnNjcmlwdGlvbnNGb3JUeXBlKGV2ZW50VHlwZSkge1xuICAgIHJldHVybiB0aGlzLl9zdWJzY3JpcHRpb25zRm9yVHlwZVtldmVudFR5cGVdO1xuICB9O1xuXG4gIHJldHVybiBFdmVudFN1YnNjcmlwdGlvblZlbmRvcjtcbn0pKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRTdWJzY3JpcHRpb25WZW5kb3I7IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCcuL2VtcHR5RnVuY3Rpb24nKTtcblxuLyoqXG4gKiBVcHN0cmVhbSB2ZXJzaW9uIG9mIGV2ZW50IGxpc3RlbmVyLiBEb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudCBzcGVjaWZpY1xuICogbmF0dXJlIG9mIHBsYXRmb3JtLlxuICovXG52YXIgRXZlbnRMaXN0ZW5lciA9IHtcbiAgLyoqXG4gICAqIExpc3RlbiB0byBET00gZXZlbnRzIGR1cmluZyB0aGUgYnViYmxlIHBoYXNlLlxuICAgKlxuICAgKiBAcGFyYW0ge0RPTUV2ZW50VGFyZ2V0fSB0YXJnZXQgRE9NIGVsZW1lbnQgdG8gcmVnaXN0ZXIgbGlzdGVuZXIgb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFR5cGUgRXZlbnQgdHlwZSwgZS5nLiAnY2xpY2snIG9yICdtb3VzZW92ZXInLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybiB7b2JqZWN0fSBPYmplY3Qgd2l0aCBhIGByZW1vdmVgIG1ldGhvZC5cbiAgICovXG4gIGxpc3RlbjogZnVuY3Rpb24gbGlzdGVuKHRhcmdldCwgZXZlbnRUeXBlLCBjYWxsYmFjaykge1xuICAgIGlmICh0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBjYWxsYmFjaywgZmFsc2UpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBjYWxsYmFjaywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodGFyZ2V0LmF0dGFjaEV2ZW50KSB7XG4gICAgICB0YXJnZXQuYXR0YWNoRXZlbnQoJ29uJyArIGV2ZW50VHlwZSwgY2FsbGJhY2spO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUoKSB7XG4gICAgICAgICAgdGFyZ2V0LmRldGFjaEV2ZW50KCdvbicgKyBldmVudFR5cGUsIGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIExpc3RlbiB0byBET00gZXZlbnRzIGR1cmluZyB0aGUgY2FwdHVyZSBwaGFzZS5cbiAgICpcbiAgICogQHBhcmFtIHtET01FdmVudFRhcmdldH0gdGFyZ2V0IERPTSBlbGVtZW50IHRvIHJlZ2lzdGVyIGxpc3RlbmVyIG9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRUeXBlIEV2ZW50IHR5cGUsIGUuZy4gJ2NsaWNrJyBvciAnbW91c2VvdmVyJy5cbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm4ge29iamVjdH0gT2JqZWN0IHdpdGggYSBgcmVtb3ZlYCBtZXRob2QuXG4gICAqL1xuICBjYXB0dXJlOiBmdW5jdGlvbiBjYXB0dXJlKHRhcmdldCwgZXZlbnRUeXBlLCBjYWxsYmFjaykge1xuICAgIGlmICh0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBjYWxsYmFjaywgdHJ1ZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGNhbGxiYWNrLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0F0dGVtcHRlZCB0byBsaXN0ZW4gdG8gZXZlbnRzIGR1cmluZyB0aGUgY2FwdHVyZSBwaGFzZSBvbiBhICcgKyAnYnJvd3NlciB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIGNhcHR1cmUgcGhhc2UuIFlvdXIgYXBwbGljYXRpb24gJyArICd3aWxsIG5vdCByZWNlaXZlIHNvbWUgZXZlbnRzLicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVtb3ZlOiBlbXB0eUZ1bmN0aW9uXG4gICAgICB9O1xuICAgIH1cbiAgfSxcblxuICByZWdpc3RlckRlZmF1bHQ6IGZ1bmN0aW9uIHJlZ2lzdGVyRGVmYXVsdCgpIHt9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50TGlzdGVuZXI7IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBjYW5Vc2VET00gPSAhISh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZG9jdW1lbnQgJiYgd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG4vKipcbiAqIFNpbXBsZSwgbGlnaHR3ZWlnaHQgbW9kdWxlIGFzc2lzdGluZyB3aXRoIHRoZSBkZXRlY3Rpb24gYW5kIGNvbnRleHQgb2ZcbiAqIFdvcmtlci4gSGVscHMgYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIGFuZCBhbGxvd3MgY29kZSB0byByZWFzb24gYWJvdXRcbiAqIHdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIGluIGEgV29ya2VyLCBldmVuIGlmIHRoZXkgbmV2ZXIgaW5jbHVkZSB0aGUgbWFpblxuICogYFJlYWN0V29ya2VyYCBkZXBlbmRlbmN5LlxuICovXG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSB7XG5cbiAgY2FuVXNlRE9NOiBjYW5Vc2VET00sXG5cbiAgY2FuVXNlV29ya2VyczogdHlwZW9mIFdvcmtlciAhPT0gJ3VuZGVmaW5lZCcsXG5cbiAgY2FuVXNlRXZlbnRMaXN0ZW5lcnM6IGNhblVzZURPTSAmJiAhISh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciB8fCB3aW5kb3cuYXR0YWNoRXZlbnQpLFxuXG4gIGNhblVzZVZpZXdwb3J0OiBjYW5Vc2VET00gJiYgISF3aW5kb3cuc2NyZWVuLFxuXG4gIGlzSW5Xb3JrZXI6ICFjYW5Vc2VET00gLy8gRm9yIG5vdywgdGhpcyBpcyB0cnVlIC0gbWlnaHQgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRXhlY3V0aW9uRW52aXJvbm1lbnQ7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbnZhciBfaHlwaGVuUGF0dGVybiA9IC8tKC4pL2c7XG5cbi8qKlxuICogQ2FtZWxjYXNlcyBhIGh5cGhlbmF0ZWQgc3RyaW5nLCBmb3IgZXhhbXBsZTpcbiAqXG4gKiAgID4gY2FtZWxpemUoJ2JhY2tncm91bmQtY29sb3InKVxuICogICA8IFwiYmFja2dyb3VuZENvbG9yXCJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGNhbWVsaXplKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nLnJlcGxhY2UoX2h5cGhlblBhdHRlcm4sIGZ1bmN0aW9uIChfLCBjaGFyYWN0ZXIpIHtcbiAgICByZXR1cm4gY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNhbWVsaXplOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGNhbWVsaXplID0gcmVxdWlyZSgnLi9jYW1lbGl6ZScpO1xuXG52YXIgbXNQYXR0ZXJuID0gL14tbXMtLztcblxuLyoqXG4gKiBDYW1lbGNhc2VzIGEgaHlwaGVuYXRlZCBDU1MgcHJvcGVydHkgbmFtZSwgZm9yIGV4YW1wbGU6XG4gKlxuICogICA+IGNhbWVsaXplU3R5bGVOYW1lKCdiYWNrZ3JvdW5kLWNvbG9yJylcbiAqICAgPCBcImJhY2tncm91bmRDb2xvclwiXG4gKiAgID4gY2FtZWxpemVTdHlsZU5hbWUoJy1tb3otdHJhbnNpdGlvbicpXG4gKiAgIDwgXCJNb3pUcmFuc2l0aW9uXCJcbiAqICAgPiBjYW1lbGl6ZVN0eWxlTmFtZSgnLW1zLXRyYW5zaXRpb24nKVxuICogICA8IFwibXNUcmFuc2l0aW9uXCJcbiAqXG4gKiBBcyBBbmRpIFNtaXRoIHN1Z2dlc3RzXG4gKiAoaHR0cDovL3d3dy5hbmRpc21pdGguY29tL2Jsb2cvMjAxMi8wMi9tb2Rlcm5penItcHJlZml4ZWQvKSwgYW4gYC1tc2AgcHJlZml4XG4gKiBpcyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGBtc2AuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBjYW1lbGl6ZVN0eWxlTmFtZShzdHJpbmcpIHtcbiAgcmV0dXJuIGNhbWVsaXplKHN0cmluZy5yZXBsYWNlKG1zUGF0dGVybiwgJ21zLScpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjYW1lbGl6ZVN0eWxlTmFtZTsiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG52YXIgaXNUZXh0Tm9kZSA9IHJlcXVpcmUoJy4vaXNUZXh0Tm9kZScpO1xuXG4vKmVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi9cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiBET00gbm9kZSBjb250YWlucyBvciBpcyBhbm90aGVyIERPTSBub2RlLlxuICovXG5mdW5jdGlvbiBjb250YWluc05vZGUob3V0ZXJOb2RlLCBpbm5lck5vZGUpIHtcbiAgaWYgKCFvdXRlck5vZGUgfHwgIWlubmVyTm9kZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChvdXRlck5vZGUgPT09IGlubmVyTm9kZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGlzVGV4dE5vZGUob3V0ZXJOb2RlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIGlmIChpc1RleHROb2RlKGlubmVyTm9kZSkpIHtcbiAgICByZXR1cm4gY29udGFpbnNOb2RlKG91dGVyTm9kZSwgaW5uZXJOb2RlLnBhcmVudE5vZGUpO1xuICB9IGVsc2UgaWYgKCdjb250YWlucycgaW4gb3V0ZXJOb2RlKSB7XG4gICAgcmV0dXJuIG91dGVyTm9kZS5jb250YWlucyhpbm5lck5vZGUpO1xuICB9IGVsc2UgaWYgKG91dGVyTm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgIHJldHVybiAhIShvdXRlck5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaW5uZXJOb2RlKSAmIDE2KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjb250YWluc05vZGU7IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqL1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnLi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBDb252ZXJ0IGFycmF5LWxpa2Ugb2JqZWN0cyB0byBhcnJheXMuXG4gKlxuICogVGhpcyBBUEkgYXNzdW1lcyB0aGUgY2FsbGVyIGtub3dzIHRoZSBjb250ZW50cyBvZiB0aGUgZGF0YSB0eXBlLiBGb3IgbGVzc1xuICogd2VsbCBkZWZpbmVkIGlucHV0cyB1c2UgY3JlYXRlQXJyYXlGcm9tTWl4ZWQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb258ZmlsZWxpc3R9IG9ialxuICogQHJldHVybiB7YXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHRvQXJyYXkob2JqKSB7XG4gIHZhciBsZW5ndGggPSBvYmoubGVuZ3RoO1xuXG4gIC8vIFNvbWUgYnJvd3NlcnMgYnVpbHRpbiBvYmplY3RzIGNhbiByZXBvcnQgdHlwZW9mICdmdW5jdGlvbicgKGUuZy4gTm9kZUxpc3RcbiAgLy8gaW4gb2xkIHZlcnNpb25zIG9mIFNhZmFyaSkuXG4gICEoIUFycmF5LmlzQXJyYXkob2JqKSAmJiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICd0b0FycmF5OiBBcnJheS1saWtlIG9iamVjdCBleHBlY3RlZCcpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcblxuICAhKHR5cGVvZiBsZW5ndGggPT09ICdudW1iZXInKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndG9BcnJheTogT2JqZWN0IG5lZWRzIGEgbGVuZ3RoIHByb3BlcnR5JykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuXG4gICEobGVuZ3RoID09PSAwIHx8IGxlbmd0aCAtIDEgaW4gb2JqKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAndG9BcnJheTogT2JqZWN0IHNob3VsZCBoYXZlIGtleXMgZm9yIGluZGljZXMnKSA6IGludmFyaWFudChmYWxzZSkgOiB2b2lkIDA7XG5cbiAgISh0eXBlb2Ygb2JqLmNhbGxlZSAhPT0gJ2Z1bmN0aW9uJykgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3RvQXJyYXk6IE9iamVjdCBjYW5cXCd0IGJlIGBhcmd1bWVudHNgLiBVc2UgcmVzdCBwYXJhbXMgJyArICcoZnVuY3Rpb24oLi4uYXJncykge30pIG9yIEFycmF5LmZyb20oKSBpbnN0ZWFkLicpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcblxuICAvLyBPbGQgSUUgZG9lc24ndCBnaXZlIGNvbGxlY3Rpb25zIGFjY2VzcyB0byBoYXNPd25Qcm9wZXJ0eS4gQXNzdW1lIGlucHV0c1xuICAvLyB3aXRob3V0IG1ldGhvZCB3aWxsIHRocm93IGR1cmluZyB0aGUgc2xpY2UgY2FsbCBhbmQgc2tpcCBzdHJhaWdodCB0byB0aGVcbiAgLy8gZmFsbGJhY2suXG4gIGlmIChvYmouaGFzT3duUHJvcGVydHkpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG9iaik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSUUgPCA5IGRvZXMgbm90IHN1cHBvcnQgQXJyYXkjc2xpY2Ugb24gY29sbGVjdGlvbnMgb2JqZWN0c1xuICAgIH1cbiAgfVxuXG4gIC8vIEZhbGwgYmFjayB0byBjb3B5aW5nIGtleSBieSBrZXkuIFRoaXMgYXNzdW1lcyBhbGwga2V5cyBoYXZlIGEgdmFsdWUsXG4gIC8vIHNvIHdpbGwgbm90IHByZXNlcnZlIHNwYXJzZWx5IHBvcHVsYXRlZCBpbnB1dHMuXG4gIHZhciByZXQgPSBBcnJheShsZW5ndGgpO1xuICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgbGVuZ3RoOyBpaSsrKSB7XG4gICAgcmV0W2lpXSA9IG9ialtpaV07XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBQZXJmb3JtIGEgaGV1cmlzdGljIHRlc3QgdG8gZGV0ZXJtaW5lIGlmIGFuIG9iamVjdCBpcyBcImFycmF5LWxpa2VcIi5cbiAqXG4gKiAgIEEgbW9uayBhc2tlZCBKb3NodSwgYSBaZW4gbWFzdGVyLCBcIkhhcyBhIGRvZyBCdWRkaGEgbmF0dXJlP1wiXG4gKiAgIEpvc2h1IHJlcGxpZWQ6IFwiTXUuXCJcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgaXRzIGFyZ3VtZW50IGhhcyBcImFycmF5IG5hdHVyZVwiOiBpdCByZXR1cm5zXG4gKiB0cnVlIGlmIHRoZSBhcmd1bWVudCBpcyBhbiBhY3R1YWwgYXJyYXksIGFuIGBhcmd1bWVudHMnIG9iamVjdCwgb3IgYW5cbiAqIEhUTUxDb2xsZWN0aW9uIChlLmcuIG5vZGUuY2hpbGROb2RlcyBvciBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCkpLlxuICpcbiAqIEl0IHdpbGwgcmV0dXJuIGZhbHNlIGZvciBvdGhlciBhcnJheS1saWtlIG9iamVjdHMgbGlrZSBGaWxlbGlzdC5cbiAqXG4gKiBAcGFyYW0geyp9IG9ialxuICogQHJldHVybiB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaGFzQXJyYXlOYXR1cmUob2JqKSB7XG4gIHJldHVybiAoXG4gICAgLy8gbm90IG51bGwvZmFsc2VcbiAgICAhIW9iaiAmJiAoXG4gICAgLy8gYXJyYXlzIGFyZSBvYmplY3RzLCBOb2RlTGlzdHMgYXJlIGZ1bmN0aW9ucyBpbiBTYWZhcmlcbiAgICB0eXBlb2Ygb2JqID09ICdvYmplY3QnIHx8IHR5cGVvZiBvYmogPT0gJ2Z1bmN0aW9uJykgJiZcbiAgICAvLyBxdWFja3MgbGlrZSBhbiBhcnJheVxuICAgICdsZW5ndGgnIGluIG9iaiAmJlxuICAgIC8vIG5vdCB3aW5kb3dcbiAgICAhKCdzZXRJbnRlcnZhbCcgaW4gb2JqKSAmJlxuICAgIC8vIG5vIERPTSBub2RlIHNob3VsZCBiZSBjb25zaWRlcmVkIGFuIGFycmF5LWxpa2VcbiAgICAvLyBhICdzZWxlY3QnIGVsZW1lbnQgaGFzICdsZW5ndGgnIGFuZCAnaXRlbScgcHJvcGVydGllcyBvbiBJRThcbiAgICB0eXBlb2Ygb2JqLm5vZGVUeXBlICE9ICdudW1iZXInICYmIChcbiAgICAvLyBhIHJlYWwgYXJyYXlcbiAgICBBcnJheS5pc0FycmF5KG9iaikgfHxcbiAgICAvLyBhcmd1bWVudHNcbiAgICAnY2FsbGVlJyBpbiBvYmogfHxcbiAgICAvLyBIVE1MQ29sbGVjdGlvbi9Ob2RlTGlzdFxuICAgICdpdGVtJyBpbiBvYmopXG4gICk7XG59XG5cbi8qKlxuICogRW5zdXJlIHRoYXQgdGhlIGFyZ3VtZW50IGlzIGFuIGFycmF5IGJ5IHdyYXBwaW5nIGl0IGluIGFuIGFycmF5IGlmIGl0IGlzIG5vdC5cbiAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoZSBhcmd1bWVudCBpZiBpdCBpcyBhbHJlYWR5IGFuIGFycmF5LlxuICpcbiAqIFRoaXMgaXMgbW9zdGx5IHVzZWZ1bCBpZGlvbWF0aWNhbGx5OlxuICpcbiAqICAgdmFyIGNyZWF0ZUFycmF5RnJvbU1peGVkID0gcmVxdWlyZSgnY3JlYXRlQXJyYXlGcm9tTWl4ZWQnKTtcbiAqXG4gKiAgIGZ1bmN0aW9uIHRha2VzT25lT3JNb3JlVGhpbmdzKHRoaW5ncykge1xuICogICAgIHRoaW5ncyA9IGNyZWF0ZUFycmF5RnJvbU1peGVkKHRoaW5ncyk7XG4gKiAgICAgLi4uXG4gKiAgIH1cbiAqXG4gKiBUaGlzIGFsbG93cyB5b3UgdG8gdHJlYXQgYHRoaW5ncycgYXMgYW4gYXJyYXksIGJ1dCBhY2NlcHQgc2NhbGFycyBpbiB0aGUgQVBJLlxuICpcbiAqIElmIHlvdSBuZWVkIHRvIGNvbnZlcnQgYW4gYXJyYXktbGlrZSBvYmplY3QsIGxpa2UgYGFyZ3VtZW50c2AsIGludG8gYW4gYXJyYXlcbiAqIHVzZSB0b0FycmF5IGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHsqfSBvYmpcbiAqIEByZXR1cm4ge2FycmF5fVxuICovXG5mdW5jdGlvbiBjcmVhdGVBcnJheUZyb21NaXhlZChvYmopIHtcbiAgaWYgKCFoYXNBcnJheU5hdHVyZShvYmopKSB7XG4gICAgcmV0dXJuIFtvYmpdO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBvYmouc2xpY2UoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdG9BcnJheShvYmopO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlQXJyYXlGcm9tTWl4ZWQ7IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqL1xuXG4vKmVzbGludC1kaXNhYmxlIGZiLXd3dy91bnNhZmUtaHRtbCovXG5cbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJy4vRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcblxudmFyIGNyZWF0ZUFycmF5RnJvbU1peGVkID0gcmVxdWlyZSgnLi9jcmVhdGVBcnJheUZyb21NaXhlZCcpO1xudmFyIGdldE1hcmt1cFdyYXAgPSByZXF1aXJlKCcuL2dldE1hcmt1cFdyYXAnKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCcuL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIER1bW15IGNvbnRhaW5lciB1c2VkIHRvIHJlbmRlciBhbGwgbWFya3VwLlxuICovXG52YXIgZHVtbXlOb2RlID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykgOiBudWxsO1xuXG4vKipcbiAqIFBhdHRlcm4gdXNlZCBieSBgZ2V0Tm9kZU5hbWVgLlxuICovXG52YXIgbm9kZU5hbWVQYXR0ZXJuID0gL15cXHMqPChcXHcrKS87XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIGBub2RlTmFtZWAgb2YgdGhlIGZpcnN0IGVsZW1lbnQgaW4gYSBzdHJpbmcgb2YgbWFya3VwLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgU3RyaW5nIG9mIG1hcmt1cC5cbiAqIEByZXR1cm4gez9zdHJpbmd9IE5vZGUgbmFtZSBvZiB0aGUgc3VwcGxpZWQgbWFya3VwLlxuICovXG5mdW5jdGlvbiBnZXROb2RlTmFtZShtYXJrdXApIHtcbiAgdmFyIG5vZGVOYW1lTWF0Y2ggPSBtYXJrdXAubWF0Y2gobm9kZU5hbWVQYXR0ZXJuKTtcbiAgcmV0dXJuIG5vZGVOYW1lTWF0Y2ggJiYgbm9kZU5hbWVNYXRjaFsxXS50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbm9kZXMgcmVuZGVyZWQgZnJvbSB0aGUgc3VwcGxpZWQgbWFya3VwLiBUaGVcbiAqIG9wdGlvbmFsbHkgc3VwcGxpZWQgYGhhbmRsZVNjcmlwdGAgZnVuY3Rpb24gd2lsbCBiZSBpbnZva2VkIG9uY2UgZm9yIGVhY2hcbiAqIDxzY3JpcHQ+IGVsZW1lbnQgdGhhdCBpcyByZW5kZXJlZC4gSWYgbm8gYGhhbmRsZVNjcmlwdGAgZnVuY3Rpb24gaXMgc3VwcGxpZWQsXG4gKiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIGFueSA8c2NyaXB0PiBlbGVtZW50cyBhcmUgcmVuZGVyZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1hcmt1cCBBIHN0cmluZyBvZiB2YWxpZCBIVE1MIG1hcmt1cC5cbiAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBoYW5kbGVTY3JpcHQgSW52b2tlZCBvbmNlIGZvciBlYWNoIHJlbmRlcmVkIDxzY3JpcHQ+LlxuICogQHJldHVybiB7YXJyYXk8RE9NRWxlbWVudHxET01UZXh0Tm9kZT59IEFuIGFycmF5IG9mIHJlbmRlcmVkIG5vZGVzLlxuICovXG5mdW5jdGlvbiBjcmVhdGVOb2Rlc0Zyb21NYXJrdXAobWFya3VwLCBoYW5kbGVTY3JpcHQpIHtcbiAgdmFyIG5vZGUgPSBkdW1teU5vZGU7XG4gICEhIWR1bW15Tm9kZSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnY3JlYXRlTm9kZXNGcm9tTWFya3VwIGR1bW15IG5vdCBpbml0aWFsaXplZCcpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgdmFyIG5vZGVOYW1lID0gZ2V0Tm9kZU5hbWUobWFya3VwKTtcblxuICB2YXIgd3JhcCA9IG5vZGVOYW1lICYmIGdldE1hcmt1cFdyYXAobm9kZU5hbWUpO1xuICBpZiAod3JhcCkge1xuICAgIG5vZGUuaW5uZXJIVE1MID0gd3JhcFsxXSArIG1hcmt1cCArIHdyYXBbMl07XG5cbiAgICB2YXIgd3JhcERlcHRoID0gd3JhcFswXTtcbiAgICB3aGlsZSAod3JhcERlcHRoLS0pIHtcbiAgICAgIG5vZGUgPSBub2RlLmxhc3RDaGlsZDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbm9kZS5pbm5lckhUTUwgPSBtYXJrdXA7XG4gIH1cblxuICB2YXIgc2NyaXB0cyA9IG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpO1xuICBpZiAoc2NyaXB0cy5sZW5ndGgpIHtcbiAgICAhaGFuZGxlU2NyaXB0ID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdjcmVhdGVOb2Rlc0Zyb21NYXJrdXAoLi4uKTogVW5leHBlY3RlZCA8c2NyaXB0PiBlbGVtZW50IHJlbmRlcmVkLicpIDogaW52YXJpYW50KGZhbHNlKSA6IHZvaWQgMDtcbiAgICBjcmVhdGVBcnJheUZyb21NaXhlZChzY3JpcHRzKS5mb3JFYWNoKGhhbmRsZVNjcmlwdCk7XG4gIH1cblxuICB2YXIgbm9kZXMgPSBBcnJheS5mcm9tKG5vZGUuY2hpbGROb2Rlcyk7XG4gIHdoaWxlIChub2RlLmxhc3RDaGlsZCkge1xuICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5sYXN0Q2hpbGQpO1xuICB9XG4gIHJldHVybiBub2Rlcztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVOb2Rlc0Zyb21NYXJrdXA7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG5mdW5jdGlvbiBtYWtlRW1wdHlGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYXJnO1xuICB9O1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyBhbmQgZGlzY2FyZHMgaW5wdXRzOyBpdCBoYXMgbm8gc2lkZSBlZmZlY3RzLiBUaGlzIGlzXG4gKiBwcmltYXJpbHkgdXNlZnVsIGlkaW9tYXRpY2FsbHkgZm9yIG92ZXJyaWRhYmxlIGZ1bmN0aW9uIGVuZHBvaW50cyB3aGljaFxuICogYWx3YXlzIG5lZWQgdG8gYmUgY2FsbGFibGUsIHNpbmNlIEpTIGxhY2tzIGEgbnVsbC1jYWxsIGlkaW9tIGFsYSBDb2NvYS5cbiAqL1xudmFyIGVtcHR5RnVuY3Rpb24gPSBmdW5jdGlvbiBlbXB0eUZ1bmN0aW9uKCkge307XG5cbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnMgPSBtYWtlRW1wdHlGdW5jdGlvbjtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNGYWxzZSA9IG1ha2VFbXB0eUZ1bmN0aW9uKGZhbHNlKTtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlID0gbWFrZUVtcHR5RnVuY3Rpb24odHJ1ZSk7XG5lbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbCA9IG1ha2VFbXB0eUZ1bmN0aW9uKG51bGwpO1xuZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RoaXMgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzO1xufTtcbmVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNBcmd1bWVudCA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgcmV0dXJuIGFyZztcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZW1wdHlGdW5jdGlvbjsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGVtcHR5T2JqZWN0ID0ge307XG5cbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICBPYmplY3QuZnJlZXplKGVtcHR5T2JqZWN0KTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlbXB0eU9iamVjdDsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGUgaW5wdXQvdGV4dGFyZWEgdG8gZm9jdXNcbiAqL1xuXG5mdW5jdGlvbiBmb2N1c05vZGUobm9kZSkge1xuICAvLyBJRTggY2FuIHRocm93IFwiQ2FuJ3QgbW92ZSBmb2N1cyB0byB0aGUgY29udHJvbCBiZWNhdXNlIGl0IGlzIGludmlzaWJsZSxcbiAgLy8gbm90IGVuYWJsZWQsIG9yIG9mIGEgdHlwZSB0aGF0IGRvZXMgbm90IGFjY2VwdCB0aGUgZm9jdXMuXCIgZm9yIGFsbCBraW5kcyBvZlxuICAvLyByZWFzb25zIHRoYXQgYXJlIHRvbyBleHBlbnNpdmUgYW5kIGZyYWdpbGUgdG8gdGVzdC5cbiAgdHJ5IHtcbiAgICBub2RlLmZvY3VzKCk7XG4gIH0gY2F0Y2ggKGUpIHt9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZm9jdXNOb2RlOyIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgZmItd3d3L3R5cGVvZi11bmRlZmluZWQgKi9cblxuLyoqXG4gKiBTYW1lIGFzIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYnV0IHdyYXBzIGluIGEgdHJ5LWNhdGNoIGJsb2NrLiBJbiBJRSBpdCBpc1xuICogbm90IHNhZmUgdG8gY2FsbCBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGlmIHRoZXJlIGlzIG5vdGhpbmcgZm9jdXNlZC5cbiAqXG4gKiBUaGUgYWN0aXZlRWxlbWVudCB3aWxsIGJlIG51bGwgb25seSBpZiB0aGUgZG9jdW1lbnQgb3IgZG9jdW1lbnQgYm9keSBpcyBub3RcbiAqIHlldCBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7P0RPTURvY3VtZW50fSBkb2MgRGVmYXVsdHMgdG8gY3VycmVudCBkb2N1bWVudC5cbiAqIEByZXR1cm4gez9ET01FbGVtZW50fVxuICovXG5mdW5jdGlvbiBnZXRBY3RpdmVFbGVtZW50KGRvYykgLyo/RE9NRWxlbWVudCove1xuICBkb2MgPSBkb2MgfHwgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudCA6IHVuZGVmaW5lZCk7XG4gIGlmICh0eXBlb2YgZG9jID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRvYy5hY3RpdmVFbGVtZW50IHx8IGRvYy5ib2R5O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGRvYy5ib2R5O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0QWN0aXZlRWxlbWVudDsiLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuLyplc2xpbnQtZGlzYWJsZSBmYi13d3cvdW5zYWZlLWh0bWwgKi9cblxudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnLi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnLi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBEdW1teSBjb250YWluZXIgdXNlZCB0byBkZXRlY3Qgd2hpY2ggd3JhcHMgYXJlIG5lY2Vzc2FyeS5cbiAqL1xudmFyIGR1bW15Tm9kZSA9IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpIDogbnVsbDtcblxuLyoqXG4gKiBTb21lIGJyb3dzZXJzIGNhbm5vdCB1c2UgYGlubmVySFRNTGAgdG8gcmVuZGVyIGNlcnRhaW4gZWxlbWVudHMgc3RhbmRhbG9uZSxcbiAqIHNvIHdlIHdyYXAgdGhlbSwgcmVuZGVyIHRoZSB3cmFwcGVkIG5vZGVzLCB0aGVuIGV4dHJhY3QgdGhlIGRlc2lyZWQgbm9kZS5cbiAqXG4gKiBJbiBJRTgsIGNlcnRhaW4gZWxlbWVudHMgY2Fubm90IHJlbmRlciBhbG9uZSwgc28gd3JhcCBhbGwgZWxlbWVudHMgKCcqJykuXG4gKi9cblxudmFyIHNob3VsZFdyYXAgPSB7fTtcblxudmFyIHNlbGVjdFdyYXAgPSBbMSwgJzxzZWxlY3QgbXVsdGlwbGU9XCJ0cnVlXCI+JywgJzwvc2VsZWN0PiddO1xudmFyIHRhYmxlV3JhcCA9IFsxLCAnPHRhYmxlPicsICc8L3RhYmxlPiddO1xudmFyIHRyV3JhcCA9IFszLCAnPHRhYmxlPjx0Ym9keT48dHI+JywgJzwvdHI+PC90Ym9keT48L3RhYmxlPiddO1xuXG52YXIgc3ZnV3JhcCA9IFsxLCAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+JywgJzwvc3ZnPiddO1xuXG52YXIgbWFya3VwV3JhcCA9IHtcbiAgJyonOiBbMSwgJz88ZGl2PicsICc8L2Rpdj4nXSxcblxuICAnYXJlYSc6IFsxLCAnPG1hcD4nLCAnPC9tYXA+J10sXG4gICdjb2wnOiBbMiwgJzx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+JywgJzwvY29sZ3JvdXA+PC90YWJsZT4nXSxcbiAgJ2xlZ2VuZCc6IFsxLCAnPGZpZWxkc2V0PicsICc8L2ZpZWxkc2V0PiddLFxuICAncGFyYW0nOiBbMSwgJzxvYmplY3Q+JywgJzwvb2JqZWN0PiddLFxuICAndHInOiBbMiwgJzx0YWJsZT48dGJvZHk+JywgJzwvdGJvZHk+PC90YWJsZT4nXSxcblxuICAnb3B0Z3JvdXAnOiBzZWxlY3RXcmFwLFxuICAnb3B0aW9uJzogc2VsZWN0V3JhcCxcblxuICAnY2FwdGlvbic6IHRhYmxlV3JhcCxcbiAgJ2NvbGdyb3VwJzogdGFibGVXcmFwLFxuICAndGJvZHknOiB0YWJsZVdyYXAsXG4gICd0Zm9vdCc6IHRhYmxlV3JhcCxcbiAgJ3RoZWFkJzogdGFibGVXcmFwLFxuXG4gICd0ZCc6IHRyV3JhcCxcbiAgJ3RoJzogdHJXcmFwXG59O1xuXG4vLyBJbml0aWFsaXplIHRoZSBTVkcgZWxlbWVudHMgc2luY2Ugd2Uga25vdyB0aGV5J2xsIGFsd2F5cyBuZWVkIHRvIGJlIHdyYXBwZWRcbi8vIGNvbnNpc3RlbnRseS4gSWYgdGhleSBhcmUgY3JlYXRlZCBpbnNpZGUgYSA8ZGl2PiB0aGV5IHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW5cbi8vIHRoZSB3cm9uZyBuYW1lc3BhY2UgKGFuZCB3aWxsIG5vdCBkaXNwbGF5KS5cbnZhciBzdmdFbGVtZW50cyA9IFsnY2lyY2xlJywgJ2NsaXBQYXRoJywgJ2RlZnMnLCAnZWxsaXBzZScsICdnJywgJ2ltYWdlJywgJ2xpbmUnLCAnbGluZWFyR3JhZGllbnQnLCAnbWFzaycsICdwYXRoJywgJ3BhdHRlcm4nLCAncG9seWdvbicsICdwb2x5bGluZScsICdyYWRpYWxHcmFkaWVudCcsICdyZWN0JywgJ3N0b3AnLCAndGV4dCcsICd0c3BhbiddO1xuc3ZnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobm9kZU5hbWUpIHtcbiAgbWFya3VwV3JhcFtub2RlTmFtZV0gPSBzdmdXcmFwO1xuICBzaG91bGRXcmFwW25vZGVOYW1lXSA9IHRydWU7XG59KTtcblxuLyoqXG4gKiBHZXRzIHRoZSBtYXJrdXAgd3JhcCBjb25maWd1cmF0aW9uIGZvciB0aGUgc3VwcGxpZWQgYG5vZGVOYW1lYC5cbiAqXG4gKiBOT1RFOiBUaGlzIGxhemlseSBkZXRlY3RzIHdoaWNoIHdyYXBzIGFyZSBuZWNlc3NhcnkgZm9yIHRoZSBjdXJyZW50IGJyb3dzZXIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5vZGVOYW1lIExvd2VyY2FzZSBgbm9kZU5hbWVgLlxuICogQHJldHVybiB7P2FycmF5fSBNYXJrdXAgd3JhcCBjb25maWd1cmF0aW9uLCBpZiBhcHBsaWNhYmxlLlxuICovXG5mdW5jdGlvbiBnZXRNYXJrdXBXcmFwKG5vZGVOYW1lKSB7XG4gICEhIWR1bW15Tm9kZSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnTWFya3VwIHdyYXBwaW5nIG5vZGUgbm90IGluaXRpYWxpemVkJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdm9pZCAwO1xuICBpZiAoIW1hcmt1cFdyYXAuaGFzT3duUHJvcGVydHkobm9kZU5hbWUpKSB7XG4gICAgbm9kZU5hbWUgPSAnKic7XG4gIH1cbiAgaWYgKCFzaG91bGRXcmFwLmhhc093blByb3BlcnR5KG5vZGVOYW1lKSkge1xuICAgIGlmIChub2RlTmFtZSA9PT0gJyonKSB7XG4gICAgICBkdW1teU5vZGUuaW5uZXJIVE1MID0gJzxsaW5rIC8+JztcbiAgICB9IGVsc2Uge1xuICAgICAgZHVtbXlOb2RlLmlubmVySFRNTCA9ICc8JyArIG5vZGVOYW1lICsgJz48LycgKyBub2RlTmFtZSArICc+JztcbiAgICB9XG4gICAgc2hvdWxkV3JhcFtub2RlTmFtZV0gPSAhZHVtbXlOb2RlLmZpcnN0Q2hpbGQ7XG4gIH1cbiAgcmV0dXJuIHNob3VsZFdyYXBbbm9kZU5hbWVdID8gbWFya3VwV3JhcFtub2RlTmFtZV0gOiBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE1hcmt1cFdyYXA7IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEdldHMgdGhlIHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgc3VwcGxpZWQgZWxlbWVudCBvciB3aW5kb3cuXG4gKlxuICogVGhlIHJldHVybiB2YWx1ZXMgYXJlIHVuYm91bmRlZCwgdW5saWtlIGBnZXRTY3JvbGxQb3NpdGlvbmAuIFRoaXMgbWVhbnMgdGhleVxuICogbWF5IGJlIG5lZ2F0aXZlIG9yIGV4Y2VlZCB0aGUgZWxlbWVudCBib3VuZGFyaWVzICh3aGljaCBpcyBwb3NzaWJsZSB1c2luZ1xuICogaW5lcnRpYWwgc2Nyb2xsaW5nKS5cbiAqXG4gKiBAcGFyYW0ge0RPTVdpbmRvd3xET01FbGVtZW50fSBzY3JvbGxhYmxlXG4gKiBAcmV0dXJuIHtvYmplY3R9IE1hcCB3aXRoIGB4YCBhbmQgYHlgIGtleXMuXG4gKi9cblxuZnVuY3Rpb24gZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb24oc2Nyb2xsYWJsZSkge1xuICBpZiAoc2Nyb2xsYWJsZS5XaW5kb3cgJiYgc2Nyb2xsYWJsZSBpbnN0YW5jZW9mIHNjcm9sbGFibGUuV2luZG93KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHNjcm9sbGFibGUucGFnZVhPZmZzZXQgfHwgc2Nyb2xsYWJsZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCxcbiAgICAgIHk6IHNjcm9sbGFibGUucGFnZVlPZmZzZXQgfHwgc2Nyb2xsYWJsZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHg6IHNjcm9sbGFibGUuc2Nyb2xsTGVmdCxcbiAgICB5OiBzY3JvbGxhYmxlLnNjcm9sbFRvcFxuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFVuYm91bmRlZFNjcm9sbFBvc2l0aW9uOyIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxudmFyIF91cHBlcmNhc2VQYXR0ZXJuID0gLyhbQS1aXSkvZztcblxuLyoqXG4gKiBIeXBoZW5hdGVzIGEgY2FtZWxjYXNlZCBzdHJpbmcsIGZvciBleGFtcGxlOlxuICpcbiAqICAgPiBoeXBoZW5hdGUoJ2JhY2tncm91bmRDb2xvcicpXG4gKiAgIDwgXCJiYWNrZ3JvdW5kLWNvbG9yXCJcbiAqXG4gKiBGb3IgQ1NTIHN0eWxlIG5hbWVzLCB1c2UgYGh5cGhlbmF0ZVN0eWxlTmFtZWAgaW5zdGVhZCB3aGljaCB3b3JrcyBwcm9wZXJseVxuICogd2l0aCBhbGwgdmVuZG9yIHByZWZpeGVzLCBpbmNsdWRpbmcgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGh5cGhlbmF0ZShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKF91cHBlcmNhc2VQYXR0ZXJuLCAnLSQxJykudG9Mb3dlckNhc2UoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoeXBoZW5hdGU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaHlwaGVuYXRlID0gcmVxdWlyZSgnLi9oeXBoZW5hdGUnKTtcblxudmFyIG1zUGF0dGVybiA9IC9ebXMtLztcblxuLyoqXG4gKiBIeXBoZW5hdGVzIGEgY2FtZWxjYXNlZCBDU1MgcHJvcGVydHkgbmFtZSwgZm9yIGV4YW1wbGU6XG4gKlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnYmFja2dyb3VuZENvbG9yJylcbiAqICAgPCBcImJhY2tncm91bmQtY29sb3JcIlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnTW96VHJhbnNpdGlvbicpXG4gKiAgIDwgXCItbW96LXRyYW5zaXRpb25cIlxuICogICA+IGh5cGhlbmF0ZVN0eWxlTmFtZSgnbXNUcmFuc2l0aW9uJylcbiAqICAgPCBcIi1tcy10cmFuc2l0aW9uXCJcbiAqXG4gKiBBcyBNb2Rlcm5penIgc3VnZ2VzdHMgKGh0dHA6Ly9tb2Rlcm5penIuY29tL2RvY3MvI3ByZWZpeGVkKSwgYW4gYG1zYCBwcmVmaXhcbiAqIGlzIGNvbnZlcnRlZCB0byBgLW1zLWAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBoeXBoZW5hdGVTdHlsZU5hbWUoc3RyaW5nKSB7XG4gIHJldHVybiBoeXBoZW5hdGUoc3RyaW5nKS5yZXBsYWNlKG1zUGF0dGVybiwgJy1tcy0nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBoeXBoZW5hdGVTdHlsZU5hbWU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLlxuICpcbiAqIFByb3ZpZGUgc3ByaW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzXG4gKiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdlcmVcbiAqIGV4cGVjdGluZy5cbiAqXG4gKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudFxuICogd2lsbCByZW1haW4gdG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLlxuICovXG5cbnZhciB2YWxpZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uIHZhbGlkYXRlRm9ybWF0KGZvcm1hdCkge307XG5cbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YWxpZGF0ZUZvcm1hdCA9IGZ1bmN0aW9uIHZhbGlkYXRlRm9ybWF0KGZvcm1hdCkge1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhcmlhbnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gaW52YXJpYW50KGNvbmRpdGlvbiwgZm9ybWF0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIHZhbGlkYXRlRm9ybWF0KGZvcm1hdCk7XG5cbiAgaWYgKCFjb25kaXRpb24pIHtcbiAgICB2YXIgZXJyb3I7XG4gICAgaWYgKGZvcm1hdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcignTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgJyArICdmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgYXJncyA9IFthLCBiLCBjLCBkLCBlLCBmXTtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICBlcnJvciA9IG5ldyBFcnJvcihmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgIH0pKTtcbiAgICAgIGVycm9yLm5hbWUgPSAnSW52YXJpYW50IFZpb2xhdGlvbic7XG4gICAgfVxuXG4gICAgZXJyb3IuZnJhbWVzVG9Qb3AgPSAxOyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IGludmFyaWFudCdzIG93biBmcmFtZVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaW52YXJpYW50OyIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0geyp9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNoZWNrLlxuICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBvciBub3QgdGhlIG9iamVjdCBpcyBhIERPTSBub2RlLlxuICovXG5mdW5jdGlvbiBpc05vZGUob2JqZWN0KSB7XG4gIHZhciBkb2MgPSBvYmplY3QgPyBvYmplY3Qub3duZXJEb2N1bWVudCB8fCBvYmplY3QgOiBkb2N1bWVudDtcbiAgdmFyIGRlZmF1bHRWaWV3ID0gZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdztcbiAgcmV0dXJuICEhKG9iamVjdCAmJiAodHlwZW9mIGRlZmF1bHRWaWV3Lk5vZGUgPT09ICdmdW5jdGlvbicgPyBvYmplY3QgaW5zdGFuY2VvZiBkZWZhdWx0Vmlldy5Ob2RlIDogdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9iamVjdC5ub2RlVHlwZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIG9iamVjdC5ub2RlTmFtZSA9PT0gJ3N0cmluZycpKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc05vZGU7IiwiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqL1xuXG52YXIgaXNOb2RlID0gcmVxdWlyZSgnLi9pc05vZGUnKTtcblxuLyoqXG4gKiBAcGFyYW0geyp9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNoZWNrLlxuICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBvciBub3QgdGhlIG9iamVjdCBpcyBhIERPTSB0ZXh0IG5vZGUuXG4gKi9cbmZ1bmN0aW9uIGlzVGV4dE5vZGUob2JqZWN0KSB7XG4gIHJldHVybiBpc05vZGUob2JqZWN0KSAmJiBvYmplY3Qubm9kZVR5cGUgPT0gMztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1RleHROb2RlOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqIEB0eXBlY2hlY2tzIHN0YXRpYy1vbmx5XG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1lbW9pemVzIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgb25lIHN0cmluZyBhcmd1bWVudC5cbiAqL1xuXG5mdW5jdGlvbiBtZW1vaXplU3RyaW5nT25seShjYWxsYmFjaykge1xuICB2YXIgY2FjaGUgPSB7fTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChzdHJpbmcpIHtcbiAgICBpZiAoIWNhY2hlLmhhc093blByb3BlcnR5KHN0cmluZykpIHtcbiAgICAgIGNhY2hlW3N0cmluZ10gPSBjYWxsYmFjay5jYWxsKHRoaXMsIHN0cmluZyk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZVtzdHJpbmddO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG1lbW9pemVTdHJpbmdPbmx5OyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAdHlwZWNoZWNrc1xuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnLi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xuXG52YXIgcGVyZm9ybWFuY2U7XG5cbmlmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00pIHtcbiAgcGVyZm9ybWFuY2UgPSB3aW5kb3cucGVyZm9ybWFuY2UgfHwgd2luZG93Lm1zUGVyZm9ybWFuY2UgfHwgd2luZG93LndlYmtpdFBlcmZvcm1hbmNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBlcmZvcm1hbmNlIHx8IHt9OyIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEB0eXBlY2hlY2tzXG4gKi9cblxudmFyIHBlcmZvcm1hbmNlID0gcmVxdWlyZSgnLi9wZXJmb3JtYW5jZScpO1xuXG52YXIgcGVyZm9ybWFuY2VOb3c7XG5cbi8qKlxuICogRGV0ZWN0IGlmIHdlIGNhbiB1c2UgYHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKWAgYW5kIGdyYWNlZnVsbHkgZmFsbGJhY2sgdG9cbiAqIGBEYXRlLm5vdygpYCBpZiBpdCBkb2Vzbid0IGV4aXN0LiBXZSBuZWVkIHRvIHN1cHBvcnQgRmlyZWZveCA8IDE1IGZvciBub3dcbiAqIGJlY2F1c2Ugb2YgRmFjZWJvb2sncyB0ZXN0aW5nIGluZnJhc3RydWN0dXJlLlxuICovXG5pZiAocGVyZm9ybWFuY2Uubm93KSB7XG4gIHBlcmZvcm1hbmNlTm93ID0gZnVuY3Rpb24gcGVyZm9ybWFuY2VOb3coKSB7XG4gICAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xuICB9O1xufSBlbHNlIHtcbiAgcGVyZm9ybWFuY2VOb3cgPSBmdW5jdGlvbiBwZXJmb3JtYW5jZU5vdygpIHtcbiAgICByZXR1cm4gRGF0ZS5ub3coKTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwZXJmb3JtYW5jZU5vdzsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHR5cGVjaGVja3NcbiAqIFxuICovXG5cbi8qZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBpbmxpbmVkIE9iamVjdC5pcyBwb2x5ZmlsbCB0byBhdm9pZCByZXF1aXJpbmcgY29uc3VtZXJzIHNoaXAgdGhlaXIgb3duXG4gKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAqL1xuZnVuY3Rpb24gaXMoeCwgeSkge1xuICAvLyBTYW1lVmFsdWUgYWxnb3JpdGhtXG4gIGlmICh4ID09PSB5KSB7XG4gICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgLy8gU3RlcHMgNi5iLTYuZTogKzAgIT0gLTBcbiAgICAvLyBBZGRlZCB0aGUgbm9uemVybyB5IGNoZWNrIHRvIG1ha2UgRmxvdyBoYXBweSwgYnV0IGl0IGlzIHJlZHVuZGFudFxuICAgIHJldHVybiB4ICE9PSAwIHx8IHkgIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICB9IGVsc2Uge1xuICAgIC8vIFN0ZXAgNi5hOiBOYU4gPT0gTmFOXG4gICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgfVxufVxuXG4vKipcbiAqIFBlcmZvcm1zIGVxdWFsaXR5IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGtleXMgb24gYW4gb2JqZWN0IGFuZCByZXR1cm5pbmcgZmFsc2VcbiAqIHdoZW4gYW55IGtleSBoYXMgdmFsdWVzIHdoaWNoIGFyZSBub3Qgc3RyaWN0bHkgZXF1YWwgYmV0d2VlbiB0aGUgYXJndW1lbnRzLlxuICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHZhbHVlcyBvZiBhbGwga2V5cyBhcmUgc3RyaWN0bHkgZXF1YWwuXG4gKi9cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChpcyhvYmpBLCBvYmpCKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIFRlc3QgZm9yIEEncyBrZXlzIGRpZmZlcmVudCBmcm9tIEIuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5c0EubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWhhc093blByb3BlcnR5LmNhbGwob2JqQiwga2V5c0FbaV0pIHx8ICFpcyhvYmpBW2tleXNBW2ldXSwgb2JqQltrZXlzQVtpXV0pKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hhbGxvd0VxdWFsOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9lbXB0eUZ1bmN0aW9uJyk7XG5cbi8qKlxuICogU2ltaWxhciB0byBpbnZhcmlhbnQgYnV0IG9ubHkgbG9ncyBhIHdhcm5pbmcgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgbWV0LlxuICogVGhpcyBjYW4gYmUgdXNlZCB0byBsb2cgaXNzdWVzIGluIGRldmVsb3BtZW50IGVudmlyb25tZW50cyBpbiBjcml0aWNhbFxuICogcGF0aHMuIFJlbW92aW5nIHRoZSBsb2dnaW5nIGNvZGUgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzIHdpbGwga2VlcCB0aGVcbiAqIHNhbWUgbG9naWMgYW5kIGZvbGxvdyB0aGUgc2FtZSBjb2RlIHBhdGhzLlxuICovXG5cbnZhciB3YXJuaW5nID0gZW1wdHlGdW5jdGlvbjtcblxuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByaW50V2FybmluZyA9IGZ1bmN0aW9uIHByaW50V2FybmluZyhmb3JtYXQpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICAgIHZhciBtZXNzYWdlID0gJ1dhcm5pbmc6ICcgKyBmb3JtYXQucmVwbGFjZSgvJXMvZywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gYXJnc1thcmdJbmRleCsrXTtcbiAgICAgIH0pO1xuICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gLS0tIFdlbGNvbWUgdG8gZGVidWdnaW5nIFJlYWN0IC0tLVxuICAgICAgICAvLyBUaGlzIGVycm9yIHdhcyB0aHJvd24gYXMgYSBjb252ZW5pZW5jZSBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoaXMgc3RhY2tcbiAgICAgICAgLy8gdG8gZmluZCB0aGUgY2FsbHNpdGUgdGhhdCBjYXVzZWQgdGhpcyB3YXJuaW5nIHRvIGZpcmUuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHt9XG4gICAgfTtcblxuICAgIHdhcm5pbmcgPSBmdW5jdGlvbiB3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0KSB7XG4gICAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdgd2FybmluZyhjb25kaXRpb24sIGZvcm1hdCwgLi4uYXJncylgIHJlcXVpcmVzIGEgd2FybmluZyAnICsgJ21lc3NhZ2UgYXJndW1lbnQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZvcm1hdC5pbmRleE9mKCdGYWlsZWQgQ29tcG9zaXRlIHByb3BUeXBlOiAnKSA9PT0gMCkge1xuICAgICAgICByZXR1cm47IC8vIElnbm9yZSBDb21wb3NpdGVDb21wb25lbnQgcHJvcHR5cGUgY2hlY2suXG4gICAgICB9XG5cbiAgICAgIGlmICghY29uZGl0aW9uKSB7XG4gICAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yID4gMiA/IF9sZW4yIC0gMiA6IDApLCBfa2V5MiA9IDI7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgICBhcmdzW19rZXkyIC0gMl0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpbnRXYXJuaW5nLmFwcGx5KHVuZGVmaW5lZCwgW2Zvcm1hdF0uY29uY2F0KGFyZ3MpKTtcbiAgICAgIH1cbiAgICB9O1xuICB9KSgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdhcm5pbmc7IiwiLyogRmlsZVNhdmVyLmpzXG4gKiBBIHNhdmVBcygpIEZpbGVTYXZlciBpbXBsZW1lbnRhdGlvbi5cbiAqIDEuMS4yMDE1MDcxNlxuICpcbiAqIEJ5IEVsaSBHcmV5LCBodHRwOi8vZWxpZ3JleS5jb21cbiAqIExpY2Vuc2U6IFgxMS9NSVRcbiAqICAgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbGlncmV5L0ZpbGVTYXZlci5qcy9ibG9iL21hc3Rlci9MSUNFTlNFLm1kXG4gKi9cblxuLypnbG9iYWwgc2VsZiAqL1xuLypqc2xpbnQgYml0d2lzZTogdHJ1ZSwgaW5kZW50OiA0LCBsYXhicmVhazogdHJ1ZSwgbGF4Y29tbWE6IHRydWUsIHNtYXJ0dGFiczogdHJ1ZSwgcGx1c3BsdXM6IHRydWUgKi9cblxuLyohIEBzb3VyY2UgaHR0cDovL3B1cmwuZWxpZ3JleS5jb20vZ2l0aHViL0ZpbGVTYXZlci5qcy9ibG9iL21hc3Rlci9GaWxlU2F2ZXIuanMgKi9cblxudmFyIHNhdmVBcyA9IHNhdmVBcyB8fCAoZnVuY3Rpb24odmlldykge1xuXHRcInVzZSBzdHJpY3RcIjtcblx0Ly8gSUUgPDEwIGlzIGV4cGxpY2l0bHkgdW5zdXBwb3J0ZWRcblx0aWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgL01TSUUgWzEtOV1cXC4vLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyXG5cdFx0ICBkb2MgPSB2aWV3LmRvY3VtZW50XG5cdFx0ICAvLyBvbmx5IGdldCBVUkwgd2hlbiBuZWNlc3NhcnkgaW4gY2FzZSBCbG9iLmpzIGhhc24ndCBvdmVycmlkZGVuIGl0IHlldFxuXHRcdCwgZ2V0X1VSTCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHZpZXcuVVJMIHx8IHZpZXcud2Via2l0VVJMIHx8IHZpZXc7XG5cdFx0fVxuXHRcdCwgc2F2ZV9saW5rID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIiwgXCJhXCIpXG5cdFx0LCBjYW5fdXNlX3NhdmVfbGluayA9IFwiZG93bmxvYWRcIiBpbiBzYXZlX2xpbmtcblx0XHQsIGNsaWNrID0gZnVuY3Rpb24obm9kZSkge1xuXHRcdFx0dmFyIGV2ZW50ID0gbmV3IE1vdXNlRXZlbnQoXCJjbGlja1wiKTtcblx0XHRcdG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cdFx0fVxuXHRcdCwgd2Via2l0X3JlcV9mcyA9IHZpZXcud2Via2l0UmVxdWVzdEZpbGVTeXN0ZW1cblx0XHQsIHJlcV9mcyA9IHZpZXcucmVxdWVzdEZpbGVTeXN0ZW0gfHwgd2Via2l0X3JlcV9mcyB8fCB2aWV3Lm1velJlcXVlc3RGaWxlU3lzdGVtXG5cdFx0LCB0aHJvd19vdXRzaWRlID0gZnVuY3Rpb24oZXgpIHtcblx0XHRcdCh2aWV3LnNldEltbWVkaWF0ZSB8fCB2aWV3LnNldFRpbWVvdXQpKGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR0aHJvdyBleDtcblx0XHRcdH0sIDApO1xuXHRcdH1cblx0XHQsIGZvcmNlX3NhdmVhYmxlX3R5cGUgPSBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiXG5cdFx0LCBmc19taW5fc2l6ZSA9IDBcblx0XHQvLyBTZWUgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM3NTI5NyNjNyBhbmRcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vZWxpZ3JleS9GaWxlU2F2ZXIuanMvY29tbWl0LzQ4NTkzMGEjY29tbWl0Y29tbWVudC04NzY4MDQ3XG5cdFx0Ly8gZm9yIHRoZSByZWFzb25pbmcgYmVoaW5kIHRoZSB0aW1lb3V0IGFuZCByZXZvY2F0aW9uIGZsb3dcblx0XHQsIGFyYml0cmFyeV9yZXZva2VfdGltZW91dCA9IDUwMCAvLyBpbiBtc1xuXHRcdCwgcmV2b2tlID0gZnVuY3Rpb24oZmlsZSkge1xuXHRcdFx0dmFyIHJldm9rZXIgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiBmaWxlID09PSBcInN0cmluZ1wiKSB7IC8vIGZpbGUgaXMgYW4gb2JqZWN0IFVSTFxuXHRcdFx0XHRcdGdldF9VUkwoKS5yZXZva2VPYmplY3RVUkwoZmlsZSk7XG5cdFx0XHRcdH0gZWxzZSB7IC8vIGZpbGUgaXMgYSBGaWxlXG5cdFx0XHRcdFx0ZmlsZS5yZW1vdmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHRcdGlmICh2aWV3LmNocm9tZSkge1xuXHRcdFx0XHRyZXZva2VyKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZXRUaW1lb3V0KHJldm9rZXIsIGFyYml0cmFyeV9yZXZva2VfdGltZW91dCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdCwgZGlzcGF0Y2ggPSBmdW5jdGlvbihmaWxlc2F2ZXIsIGV2ZW50X3R5cGVzLCBldmVudCkge1xuXHRcdFx0ZXZlbnRfdHlwZXMgPSBbXS5jb25jYXQoZXZlbnRfdHlwZXMpO1xuXHRcdFx0dmFyIGkgPSBldmVudF90eXBlcy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoaS0tKSB7XG5cdFx0XHRcdHZhciBsaXN0ZW5lciA9IGZpbGVzYXZlcltcIm9uXCIgKyBldmVudF90eXBlc1tpXV07XG5cdFx0XHRcdGlmICh0eXBlb2YgbGlzdGVuZXIgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRsaXN0ZW5lci5jYWxsKGZpbGVzYXZlciwgZXZlbnQgfHwgZmlsZXNhdmVyKTtcblx0XHRcdFx0XHR9IGNhdGNoIChleCkge1xuXHRcdFx0XHRcdFx0dGhyb3dfb3V0c2lkZShleCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdCwgYXV0b19ib20gPSBmdW5jdGlvbihibG9iKSB7XG5cdFx0XHQvLyBwcmVwZW5kIEJPTSBmb3IgVVRGLTggWE1MIGFuZCB0ZXh0LyogdHlwZXMgKGluY2x1ZGluZyBIVE1MKVxuXHRcdFx0aWYgKC9eXFxzKig/OnRleHRcXC9cXFMqfGFwcGxpY2F0aW9uXFwveG1sfFxcUypcXC9cXFMqXFwreG1sKVxccyo7LipjaGFyc2V0XFxzKj1cXHMqdXRmLTgvaS50ZXN0KGJsb2IudHlwZSkpIHtcblx0XHRcdFx0cmV0dXJuIG5ldyBCbG9iKFtcIlxcdWZlZmZcIiwgYmxvYl0sIHt0eXBlOiBibG9iLnR5cGV9KTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBibG9iO1xuXHRcdH1cblx0XHQsIEZpbGVTYXZlciA9IGZ1bmN0aW9uKGJsb2IsIG5hbWUsIG5vX2F1dG9fYm9tKSB7XG5cdFx0XHRpZiAoIW5vX2F1dG9fYm9tKSB7XG5cdFx0XHRcdGJsb2IgPSBhdXRvX2JvbShibG9iKTtcblx0XHRcdH1cblx0XHRcdC8vIEZpcnN0IHRyeSBhLmRvd25sb2FkLCB0aGVuIHdlYiBmaWxlc3lzdGVtLCB0aGVuIG9iamVjdCBVUkxzXG5cdFx0XHR2YXJcblx0XHRcdFx0ICBmaWxlc2F2ZXIgPSB0aGlzXG5cdFx0XHRcdCwgdHlwZSA9IGJsb2IudHlwZVxuXHRcdFx0XHQsIGJsb2JfY2hhbmdlZCA9IGZhbHNlXG5cdFx0XHRcdCwgb2JqZWN0X3VybFxuXHRcdFx0XHQsIHRhcmdldF92aWV3XG5cdFx0XHRcdCwgZGlzcGF0Y2hfYWxsID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0ZGlzcGF0Y2goZmlsZXNhdmVyLCBcIndyaXRlc3RhcnQgcHJvZ3Jlc3Mgd3JpdGUgd3JpdGVlbmRcIi5zcGxpdChcIiBcIikpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIG9uIGFueSBmaWxlc3lzIGVycm9ycyByZXZlcnQgdG8gc2F2aW5nIHdpdGggb2JqZWN0IFVSTHNcblx0XHRcdFx0LCBmc19lcnJvciA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdC8vIGRvbid0IGNyZWF0ZSBtb3JlIG9iamVjdCBVUkxzIHRoYW4gbmVlZGVkXG5cdFx0XHRcdFx0aWYgKGJsb2JfY2hhbmdlZCB8fCAhb2JqZWN0X3VybCkge1xuXHRcdFx0XHRcdFx0b2JqZWN0X3VybCA9IGdldF9VUkwoKS5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICh0YXJnZXRfdmlldykge1xuXHRcdFx0XHRcdFx0dGFyZ2V0X3ZpZXcubG9jYXRpb24uaHJlZiA9IG9iamVjdF91cmw7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHZhciBuZXdfdGFiID0gdmlldy5vcGVuKG9iamVjdF91cmwsIFwiX2JsYW5rXCIpO1xuXHRcdFx0XHRcdFx0aWYgKG5ld190YWIgPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBzYWZhcmkgIT09IFwidW5kZWZpbmVkXCIpIHtcblx0XHRcdFx0XHRcdFx0Ly9BcHBsZSBkbyBub3QgYWxsb3cgd2luZG93Lm9wZW4sIHNlZSBodHRwOi8vYml0Lmx5LzFrWmZmUklcblx0XHRcdFx0XHRcdFx0dmlldy5sb2NhdGlvbi5ocmVmID0gb2JqZWN0X3VybFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRmaWxlc2F2ZXIucmVhZHlTdGF0ZSA9IGZpbGVzYXZlci5ET05FO1xuXHRcdFx0XHRcdGRpc3BhdGNoX2FsbCgpO1xuXHRcdFx0XHRcdHJldm9rZShvYmplY3RfdXJsKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQsIGFib3J0YWJsZSA9IGZ1bmN0aW9uKGZ1bmMpIHtcblx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRpZiAoZmlsZXNhdmVyLnJlYWR5U3RhdGUgIT09IGZpbGVzYXZlci5ET05FKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0XHQsIGNyZWF0ZV9pZl9ub3RfZm91bmQgPSB7Y3JlYXRlOiB0cnVlLCBleGNsdXNpdmU6IGZhbHNlfVxuXHRcdFx0XHQsIHNsaWNlXG5cdFx0XHQ7XG5cdFx0XHRmaWxlc2F2ZXIucmVhZHlTdGF0ZSA9IGZpbGVzYXZlci5JTklUO1xuXHRcdFx0aWYgKCFuYW1lKSB7XG5cdFx0XHRcdG5hbWUgPSBcImRvd25sb2FkXCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAoY2FuX3VzZV9zYXZlX2xpbmspIHtcblx0XHRcdFx0b2JqZWN0X3VybCA9IGdldF9VUkwoKS5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cdFx0XHRcdHNhdmVfbGluay5ocmVmID0gb2JqZWN0X3VybDtcblx0XHRcdFx0c2F2ZV9saW5rLmRvd25sb2FkID0gbmFtZTtcblx0XHRcdFx0c2V0VGltZW91dChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRjbGljayhzYXZlX2xpbmspO1xuXHRcdFx0XHRcdGRpc3BhdGNoX2FsbCgpO1xuXHRcdFx0XHRcdHJldm9rZShvYmplY3RfdXJsKTtcblx0XHRcdFx0XHRmaWxlc2F2ZXIucmVhZHlTdGF0ZSA9IGZpbGVzYXZlci5ET05FO1xuXHRcdFx0XHR9KTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Ly8gT2JqZWN0IGFuZCB3ZWIgZmlsZXN5c3RlbSBVUkxzIGhhdmUgYSBwcm9ibGVtIHNhdmluZyBpbiBHb29nbGUgQ2hyb21lIHdoZW5cblx0XHRcdC8vIHZpZXdlZCBpbiBhIHRhYiwgc28gSSBmb3JjZSBzYXZlIHdpdGggYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXG5cdFx0XHQvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD05MTE1OFxuXHRcdFx0Ly8gVXBkYXRlOiBHb29nbGUgZXJyYW50bHkgY2xvc2VkIDkxMTU4LCBJIHN1Ym1pdHRlZCBpdCBhZ2Fpbjpcblx0XHRcdC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zODk2NDJcblx0XHRcdGlmICh2aWV3LmNocm9tZSAmJiB0eXBlICYmIHR5cGUgIT09IGZvcmNlX3NhdmVhYmxlX3R5cGUpIHtcblx0XHRcdFx0c2xpY2UgPSBibG9iLnNsaWNlIHx8IGJsb2Iud2Via2l0U2xpY2U7XG5cdFx0XHRcdGJsb2IgPSBzbGljZS5jYWxsKGJsb2IsIDAsIGJsb2Iuc2l6ZSwgZm9yY2Vfc2F2ZWFibGVfdHlwZSk7XG5cdFx0XHRcdGJsb2JfY2hhbmdlZCA9IHRydWU7XG5cdFx0XHR9XG5cdFx0XHQvLyBTaW5jZSBJIGNhbid0IGJlIHN1cmUgdGhhdCB0aGUgZ3Vlc3NlZCBtZWRpYSB0eXBlIHdpbGwgdHJpZ2dlciBhIGRvd25sb2FkXG5cdFx0XHQvLyBpbiBXZWJLaXQsIEkgYXBwZW5kIC5kb3dubG9hZCB0byB0aGUgZmlsZW5hbWUuXG5cdFx0XHQvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjU0NDBcblx0XHRcdGlmICh3ZWJraXRfcmVxX2ZzICYmIG5hbWUgIT09IFwiZG93bmxvYWRcIikge1xuXHRcdFx0XHRuYW1lICs9IFwiLmRvd25sb2FkXCI7XG5cdFx0XHR9XG5cdFx0XHRpZiAodHlwZSA9PT0gZm9yY2Vfc2F2ZWFibGVfdHlwZSB8fCB3ZWJraXRfcmVxX2ZzKSB7XG5cdFx0XHRcdHRhcmdldF92aWV3ID0gdmlldztcblx0XHRcdH1cblx0XHRcdGlmICghcmVxX2ZzKSB7XG5cdFx0XHRcdGZzX2Vycm9yKCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGZzX21pbl9zaXplICs9IGJsb2Iuc2l6ZTtcblx0XHRcdHJlcV9mcyh2aWV3LlRFTVBPUkFSWSwgZnNfbWluX3NpemUsIGFib3J0YWJsZShmdW5jdGlvbihmcykge1xuXHRcdFx0XHRmcy5yb290LmdldERpcmVjdG9yeShcInNhdmVkXCIsIGNyZWF0ZV9pZl9ub3RfZm91bmQsIGFib3J0YWJsZShmdW5jdGlvbihkaXIpIHtcblx0XHRcdFx0XHR2YXIgc2F2ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0ZGlyLmdldEZpbGUobmFtZSwgY3JlYXRlX2lmX25vdF9mb3VuZCwgYWJvcnRhYmxlKGZ1bmN0aW9uKGZpbGUpIHtcblx0XHRcdFx0XHRcdFx0ZmlsZS5jcmVhdGVXcml0ZXIoYWJvcnRhYmxlKGZ1bmN0aW9uKHdyaXRlcikge1xuXHRcdFx0XHRcdFx0XHRcdHdyaXRlci5vbndyaXRlZW5kID0gZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHRhcmdldF92aWV3LmxvY2F0aW9uLmhyZWYgPSBmaWxlLnRvVVJMKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRmaWxlc2F2ZXIucmVhZHlTdGF0ZSA9IGZpbGVzYXZlci5ET05FO1xuXHRcdFx0XHRcdFx0XHRcdFx0ZGlzcGF0Y2goZmlsZXNhdmVyLCBcIndyaXRlZW5kXCIsIGV2ZW50KTtcblx0XHRcdFx0XHRcdFx0XHRcdHJldm9rZShmaWxlKTtcblx0XHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0XHRcdHdyaXRlci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgZXJyb3IgPSB3cml0ZXIuZXJyb3I7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoZXJyb3IuY29kZSAhPT0gZXJyb3IuQUJPUlRfRVJSKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZzX2Vycm9yKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0XHRcIndyaXRlc3RhcnQgcHJvZ3Jlc3Mgd3JpdGUgYWJvcnRcIi5zcGxpdChcIiBcIikuZm9yRWFjaChmdW5jdGlvbihldmVudCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0d3JpdGVyW1wib25cIiArIGV2ZW50XSA9IGZpbGVzYXZlcltcIm9uXCIgKyBldmVudF07XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0d3JpdGVyLndyaXRlKGJsb2IpO1xuXHRcdFx0XHRcdFx0XHRcdGZpbGVzYXZlci5hYm9ydCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0d3JpdGVyLmFib3J0KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRmaWxlc2F2ZXIucmVhZHlTdGF0ZSA9IGZpbGVzYXZlci5ET05FO1xuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0ZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuV1JJVElORztcblx0XHRcdFx0XHRcdFx0fSksIGZzX2Vycm9yKTtcblx0XHRcdFx0XHRcdH0pLCBmc19lcnJvcik7XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRkaXIuZ2V0RmlsZShuYW1lLCB7Y3JlYXRlOiBmYWxzZX0sIGFib3J0YWJsZShmdW5jdGlvbihmaWxlKSB7XG5cdFx0XHRcdFx0XHQvLyBkZWxldGUgZmlsZSBpZiBpdCBhbHJlYWR5IGV4aXN0c1xuXHRcdFx0XHRcdFx0ZmlsZS5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdHNhdmUoKTtcblx0XHRcdFx0XHR9KSwgYWJvcnRhYmxlKGZ1bmN0aW9uKGV4KSB7XG5cdFx0XHRcdFx0XHRpZiAoZXguY29kZSA9PT0gZXguTk9UX0ZPVU5EX0VSUikge1xuXHRcdFx0XHRcdFx0XHRzYXZlKCk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRmc19lcnJvcigpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pKTtcblx0XHRcdFx0fSksIGZzX2Vycm9yKTtcblx0XHRcdH0pLCBmc19lcnJvcik7XG5cdFx0fVxuXHRcdCwgRlNfcHJvdG8gPSBGaWxlU2F2ZXIucHJvdG90eXBlXG5cdFx0LCBzYXZlQXMgPSBmdW5jdGlvbihibG9iLCBuYW1lLCBub19hdXRvX2JvbSkge1xuXHRcdFx0cmV0dXJuIG5ldyBGaWxlU2F2ZXIoYmxvYiwgbmFtZSwgbm9fYXV0b19ib20pO1xuXHRcdH1cblx0O1xuXHQvLyBJRSAxMCsgKG5hdGl2ZSBzYXZlQXMpXG5cdGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSBcInVuZGVmaW5lZFwiICYmIG5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKSB7XG5cdFx0cmV0dXJuIGZ1bmN0aW9uKGJsb2IsIG5hbWUsIG5vX2F1dG9fYm9tKSB7XG5cdFx0XHRpZiAoIW5vX2F1dG9fYm9tKSB7XG5cdFx0XHRcdGJsb2IgPSBhdXRvX2JvbShibG9iKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBuYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYihibG9iLCBuYW1lIHx8IFwiZG93bmxvYWRcIik7XG5cdFx0fTtcblx0fVxuXG5cdEZTX3Byb3RvLmFib3J0ID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGZpbGVzYXZlciA9IHRoaXM7XG5cdFx0ZmlsZXNhdmVyLnJlYWR5U3RhdGUgPSBmaWxlc2F2ZXIuRE9ORTtcblx0XHRkaXNwYXRjaChmaWxlc2F2ZXIsIFwiYWJvcnRcIik7XG5cdH07XG5cdEZTX3Byb3RvLnJlYWR5U3RhdGUgPSBGU19wcm90by5JTklUID0gMDtcblx0RlNfcHJvdG8uV1JJVElORyA9IDE7XG5cdEZTX3Byb3RvLkRPTkUgPSAyO1xuXG5cdEZTX3Byb3RvLmVycm9yID1cblx0RlNfcHJvdG8ub253cml0ZXN0YXJ0ID1cblx0RlNfcHJvdG8ub25wcm9ncmVzcyA9XG5cdEZTX3Byb3RvLm9ud3JpdGUgPVxuXHRGU19wcm90by5vbmFib3J0ID1cblx0RlNfcHJvdG8ub25lcnJvciA9XG5cdEZTX3Byb3RvLm9ud3JpdGVlbmQgPVxuXHRcdG51bGw7XG5cblx0cmV0dXJuIHNhdmVBcztcbn0oXG5cdCAgIHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiICYmIHNlbGZcblx0fHwgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3dcblx0fHwgdGhpcy5jb250ZW50XG4pKTtcbi8vIGBzZWxmYCBpcyB1bmRlZmluZWQgaW4gRmlyZWZveCBmb3IgQW5kcm9pZCBjb250ZW50IHNjcmlwdCBjb250ZXh0XG4vLyB3aGlsZSBgdGhpc2AgaXMgbnNJQ29udGVudEZyYW1lTWVzc2FnZU1hbmFnZXJcbi8vIHdpdGggYW4gYXR0cmlidXRlIGBjb250ZW50YCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB3aW5kb3dcblxuaWYgKHR5cGVvZiBtb2R1bGUgIT09IFwidW5kZWZpbmVkXCIgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgbW9kdWxlLmV4cG9ydHMuc2F2ZUFzID0gc2F2ZUFzO1xufSBlbHNlIGlmICgodHlwZW9mIGRlZmluZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkZWZpbmUgIT09IG51bGwpICYmIChkZWZpbmUuYW1kICE9IG51bGwpKSB7XG4gIGRlZmluZShbXSwgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHNhdmVBcztcbiAgfSk7XG59XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMuRGlzcGF0Y2hlciA9IHJlcXVpcmUoJy4vbGliL0Rpc3BhdGNoZXInKTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgRGlzcGF0Y2hlclxuICogXG4gKiBAcHJldmVudE11bmdlXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG52YXIgX3ByZWZpeCA9ICdJRF8nO1xuXG4vKipcbiAqIERpc3BhdGNoZXIgaXMgdXNlZCB0byBicm9hZGNhc3QgcGF5bG9hZHMgdG8gcmVnaXN0ZXJlZCBjYWxsYmFja3MuIFRoaXMgaXNcbiAqIGRpZmZlcmVudCBmcm9tIGdlbmVyaWMgcHViLXN1YiBzeXN0ZW1zIGluIHR3byB3YXlzOlxuICpcbiAqICAgMSkgQ2FsbGJhY2tzIGFyZSBub3Qgc3Vic2NyaWJlZCB0byBwYXJ0aWN1bGFyIGV2ZW50cy4gRXZlcnkgcGF5bG9hZCBpc1xuICogICAgICBkaXNwYXRjaGVkIHRvIGV2ZXJ5IHJlZ2lzdGVyZWQgY2FsbGJhY2suXG4gKiAgIDIpIENhbGxiYWNrcyBjYW4gYmUgZGVmZXJyZWQgaW4gd2hvbGUgb3IgcGFydCB1bnRpbCBvdGhlciBjYWxsYmFja3MgaGF2ZVxuICogICAgICBiZWVuIGV4ZWN1dGVkLlxuICpcbiAqIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGlzIGh5cG90aGV0aWNhbCBmbGlnaHQgZGVzdGluYXRpb24gZm9ybSwgd2hpY2hcbiAqIHNlbGVjdHMgYSBkZWZhdWx0IGNpdHkgd2hlbiBhIGNvdW50cnkgaXMgc2VsZWN0ZWQ6XG4gKlxuICogICB2YXIgZmxpZ2h0RGlzcGF0Y2hlciA9IG5ldyBEaXNwYXRjaGVyKCk7XG4gKlxuICogICAvLyBLZWVwcyB0cmFjayBvZiB3aGljaCBjb3VudHJ5IGlzIHNlbGVjdGVkXG4gKiAgIHZhciBDb3VudHJ5U3RvcmUgPSB7Y291bnRyeTogbnVsbH07XG4gKlxuICogICAvLyBLZWVwcyB0cmFjayBvZiB3aGljaCBjaXR5IGlzIHNlbGVjdGVkXG4gKiAgIHZhciBDaXR5U3RvcmUgPSB7Y2l0eTogbnVsbH07XG4gKlxuICogICAvLyBLZWVwcyB0cmFjayBvZiB0aGUgYmFzZSBmbGlnaHQgcHJpY2Ugb2YgdGhlIHNlbGVjdGVkIGNpdHlcbiAqICAgdmFyIEZsaWdodFByaWNlU3RvcmUgPSB7cHJpY2U6IG51bGx9XG4gKlxuICogV2hlbiBhIHVzZXIgY2hhbmdlcyB0aGUgc2VsZWN0ZWQgY2l0eSwgd2UgZGlzcGF0Y2ggdGhlIHBheWxvYWQ6XG4gKlxuICogICBmbGlnaHREaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAqICAgICBhY3Rpb25UeXBlOiAnY2l0eS11cGRhdGUnLFxuICogICAgIHNlbGVjdGVkQ2l0eTogJ3BhcmlzJ1xuICogICB9KTtcbiAqXG4gKiBUaGlzIHBheWxvYWQgaXMgZGlnZXN0ZWQgYnkgYENpdHlTdG9yZWA6XG4gKlxuICogICBmbGlnaHREaXNwYXRjaGVyLnJlZ2lzdGVyKGZ1bmN0aW9uKHBheWxvYWQpIHtcbiAqICAgICBpZiAocGF5bG9hZC5hY3Rpb25UeXBlID09PSAnY2l0eS11cGRhdGUnKSB7XG4gKiAgICAgICBDaXR5U3RvcmUuY2l0eSA9IHBheWxvYWQuc2VsZWN0ZWRDaXR5O1xuICogICAgIH1cbiAqICAgfSk7XG4gKlxuICogV2hlbiB0aGUgdXNlciBzZWxlY3RzIGEgY291bnRyeSwgd2UgZGlzcGF0Y2ggdGhlIHBheWxvYWQ6XG4gKlxuICogICBmbGlnaHREaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAqICAgICBhY3Rpb25UeXBlOiAnY291bnRyeS11cGRhdGUnLFxuICogICAgIHNlbGVjdGVkQ291bnRyeTogJ2F1c3RyYWxpYSdcbiAqICAgfSk7XG4gKlxuICogVGhpcyBwYXlsb2FkIGlzIGRpZ2VzdGVkIGJ5IGJvdGggc3RvcmVzOlxuICpcbiAqICAgQ291bnRyeVN0b3JlLmRpc3BhdGNoVG9rZW4gPSBmbGlnaHREaXNwYXRjaGVyLnJlZ2lzdGVyKGZ1bmN0aW9uKHBheWxvYWQpIHtcbiAqICAgICBpZiAocGF5bG9hZC5hY3Rpb25UeXBlID09PSAnY291bnRyeS11cGRhdGUnKSB7XG4gKiAgICAgICBDb3VudHJ5U3RvcmUuY291bnRyeSA9IHBheWxvYWQuc2VsZWN0ZWRDb3VudHJ5O1xuICogICAgIH1cbiAqICAgfSk7XG4gKlxuICogV2hlbiB0aGUgY2FsbGJhY2sgdG8gdXBkYXRlIGBDb3VudHJ5U3RvcmVgIGlzIHJlZ2lzdGVyZWQsIHdlIHNhdmUgYSByZWZlcmVuY2VcbiAqIHRvIHRoZSByZXR1cm5lZCB0b2tlbi4gVXNpbmcgdGhpcyB0b2tlbiB3aXRoIGB3YWl0Rm9yKClgLCB3ZSBjYW4gZ3VhcmFudGVlXG4gKiB0aGF0IGBDb3VudHJ5U3RvcmVgIGlzIHVwZGF0ZWQgYmVmb3JlIHRoZSBjYWxsYmFjayB0aGF0IHVwZGF0ZXMgYENpdHlTdG9yZWBcbiAqIG5lZWRzIHRvIHF1ZXJ5IGl0cyBkYXRhLlxuICpcbiAqICAgQ2l0eVN0b3JlLmRpc3BhdGNoVG9rZW4gPSBmbGlnaHREaXNwYXRjaGVyLnJlZ2lzdGVyKGZ1bmN0aW9uKHBheWxvYWQpIHtcbiAqICAgICBpZiAocGF5bG9hZC5hY3Rpb25UeXBlID09PSAnY291bnRyeS11cGRhdGUnKSB7XG4gKiAgICAgICAvLyBgQ291bnRyeVN0b3JlLmNvdW50cnlgIG1heSBub3QgYmUgdXBkYXRlZC5cbiAqICAgICAgIGZsaWdodERpc3BhdGNoZXIud2FpdEZvcihbQ291bnRyeVN0b3JlLmRpc3BhdGNoVG9rZW5dKTtcbiAqICAgICAgIC8vIGBDb3VudHJ5U3RvcmUuY291bnRyeWAgaXMgbm93IGd1YXJhbnRlZWQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiAgICAgICAvLyBTZWxlY3QgdGhlIGRlZmF1bHQgY2l0eSBmb3IgdGhlIG5ldyBjb3VudHJ5XG4gKiAgICAgICBDaXR5U3RvcmUuY2l0eSA9IGdldERlZmF1bHRDaXR5Rm9yQ291bnRyeShDb3VudHJ5U3RvcmUuY291bnRyeSk7XG4gKiAgICAgfVxuICogICB9KTtcbiAqXG4gKiBUaGUgdXNhZ2Ugb2YgYHdhaXRGb3IoKWAgY2FuIGJlIGNoYWluZWQsIGZvciBleGFtcGxlOlxuICpcbiAqICAgRmxpZ2h0UHJpY2VTdG9yZS5kaXNwYXRjaFRva2VuID1cbiAqICAgICBmbGlnaHREaXNwYXRjaGVyLnJlZ2lzdGVyKGZ1bmN0aW9uKHBheWxvYWQpIHtcbiAqICAgICAgIHN3aXRjaCAocGF5bG9hZC5hY3Rpb25UeXBlKSB7XG4gKiAgICAgICAgIGNhc2UgJ2NvdW50cnktdXBkYXRlJzpcbiAqICAgICAgICAgY2FzZSAnY2l0eS11cGRhdGUnOlxuICogICAgICAgICAgIGZsaWdodERpc3BhdGNoZXIud2FpdEZvcihbQ2l0eVN0b3JlLmRpc3BhdGNoVG9rZW5dKTtcbiAqICAgICAgICAgICBGbGlnaHRQcmljZVN0b3JlLnByaWNlID1cbiAqICAgICAgICAgICAgIGdldEZsaWdodFByaWNlU3RvcmUoQ291bnRyeVN0b3JlLmNvdW50cnksIENpdHlTdG9yZS5jaXR5KTtcbiAqICAgICAgICAgICBicmVhaztcbiAqICAgICB9XG4gKiAgIH0pO1xuICpcbiAqIFRoZSBgY291bnRyeS11cGRhdGVgIHBheWxvYWQgd2lsbCBiZSBndWFyYW50ZWVkIHRvIGludm9rZSB0aGUgc3RvcmVzJ1xuICogcmVnaXN0ZXJlZCBjYWxsYmFja3MgaW4gb3JkZXI6IGBDb3VudHJ5U3RvcmVgLCBgQ2l0eVN0b3JlYCwgdGhlblxuICogYEZsaWdodFByaWNlU3RvcmVgLlxuICovXG5cbnZhciBEaXNwYXRjaGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRGlzcGF0Y2hlcigpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRGlzcGF0Y2hlcik7XG5cbiAgICB0aGlzLl9jYWxsYmFja3MgPSB7fTtcbiAgICB0aGlzLl9pc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gICAgdGhpcy5faXNIYW5kbGVkID0ge307XG4gICAgdGhpcy5faXNQZW5kaW5nID0ge307XG4gICAgdGhpcy5fbGFzdElEID0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdpdGggZXZlcnkgZGlzcGF0Y2hlZCBwYXlsb2FkLiBSZXR1cm5zXG4gICAqIGEgdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGB3YWl0Rm9yKClgLlxuICAgKi9cblxuICBEaXNwYXRjaGVyLnByb3RvdHlwZS5yZWdpc3RlciA9IGZ1bmN0aW9uIHJlZ2lzdGVyKGNhbGxiYWNrKSB7XG4gICAgdmFyIGlkID0gX3ByZWZpeCArIHRoaXMuX2xhc3RJRCsrO1xuICAgIHRoaXMuX2NhbGxiYWNrc1tpZF0gPSBjYWxsYmFjaztcbiAgICByZXR1cm4gaWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjYWxsYmFjayBiYXNlZCBvbiBpdHMgdG9rZW4uXG4gICAqL1xuXG4gIERpc3BhdGNoZXIucHJvdG90eXBlLnVucmVnaXN0ZXIgPSBmdW5jdGlvbiB1bnJlZ2lzdGVyKGlkKSB7XG4gICAgIXRoaXMuX2NhbGxiYWNrc1tpZF0gPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRGlzcGF0Y2hlci51bnJlZ2lzdGVyKC4uLik6IGAlc2AgZG9lcyBub3QgbWFwIHRvIGEgcmVnaXN0ZXJlZCBjYWxsYmFjay4nLCBpZCkgOiBpbnZhcmlhbnQoZmFsc2UpIDogdW5kZWZpbmVkO1xuICAgIGRlbGV0ZSB0aGlzLl9jYWxsYmFja3NbaWRdO1xuICB9O1xuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgdGhlIGNhbGxiYWNrcyBzcGVjaWZpZWQgdG8gYmUgaW52b2tlZCBiZWZvcmUgY29udGludWluZyBleGVjdXRpb25cbiAgICogb2YgdGhlIGN1cnJlbnQgY2FsbGJhY2suIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgYSBjYWxsYmFjayBpblxuICAgKiByZXNwb25zZSB0byBhIGRpc3BhdGNoZWQgcGF5bG9hZC5cbiAgICovXG5cbiAgRGlzcGF0Y2hlci5wcm90b3R5cGUud2FpdEZvciA9IGZ1bmN0aW9uIHdhaXRGb3IoaWRzKSB7XG4gICAgIXRoaXMuX2lzRGlzcGF0Y2hpbmcgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRGlzcGF0Y2hlci53YWl0Rm9yKC4uLik6IE11c3QgYmUgaW52b2tlZCB3aGlsZSBkaXNwYXRjaGluZy4nKSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG4gICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGlkcy5sZW5ndGg7IGlpKyspIHtcbiAgICAgIHZhciBpZCA9IGlkc1tpaV07XG4gICAgICBpZiAodGhpcy5faXNQZW5kaW5nW2lkXSkge1xuICAgICAgICAhdGhpcy5faXNIYW5kbGVkW2lkXSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdEaXNwYXRjaGVyLndhaXRGb3IoLi4uKTogQ2lyY3VsYXIgZGVwZW5kZW5jeSBkZXRlY3RlZCB3aGlsZSAnICsgJ3dhaXRpbmcgZm9yIGAlc2AuJywgaWQpIDogaW52YXJpYW50KGZhbHNlKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAhdGhpcy5fY2FsbGJhY2tzW2lkXSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdEaXNwYXRjaGVyLndhaXRGb3IoLi4uKTogYCVzYCBkb2VzIG5vdCBtYXAgdG8gYSByZWdpc3RlcmVkIGNhbGxiYWNrLicsIGlkKSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9pbnZva2VDYWxsYmFjayhpZCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGEgcGF5bG9hZCB0byBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3MuXG4gICAqL1xuXG4gIERpc3BhdGNoZXIucHJvdG90eXBlLmRpc3BhdGNoID0gZnVuY3Rpb24gZGlzcGF0Y2gocGF5bG9hZCkge1xuICAgICEhdGhpcy5faXNEaXNwYXRjaGluZyA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdEaXNwYXRjaC5kaXNwYXRjaCguLi4pOiBDYW5ub3QgZGlzcGF0Y2ggaW4gdGhlIG1pZGRsZSBvZiBhIGRpc3BhdGNoLicpIDogaW52YXJpYW50KGZhbHNlKSA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zdGFydERpc3BhdGNoaW5nKHBheWxvYWQpO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKHZhciBpZCBpbiB0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzUGVuZGluZ1tpZF0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pbnZva2VDYWxsYmFjayhpZCk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX3N0b3BEaXNwYXRjaGluZygpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogSXMgdGhpcyBEaXNwYXRjaGVyIGN1cnJlbnRseSBkaXNwYXRjaGluZy5cbiAgICovXG5cbiAgRGlzcGF0Y2hlci5wcm90b3R5cGUuaXNEaXNwYXRjaGluZyA9IGZ1bmN0aW9uIGlzRGlzcGF0Y2hpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRGlzcGF0Y2hpbmc7XG4gIH07XG5cbiAgLyoqXG4gICAqIENhbGwgdGhlIGNhbGxiYWNrIHN0b3JlZCB3aXRoIHRoZSBnaXZlbiBpZC4gQWxzbyBkbyBzb21lIGludGVybmFsXG4gICAqIGJvb2trZWVwaW5nLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cbiAgRGlzcGF0Y2hlci5wcm90b3R5cGUuX2ludm9rZUNhbGxiYWNrID0gZnVuY3Rpb24gX2ludm9rZUNhbGxiYWNrKGlkKSB7XG4gICAgdGhpcy5faXNQZW5kaW5nW2lkXSA9IHRydWU7XG4gICAgdGhpcy5fY2FsbGJhY2tzW2lkXSh0aGlzLl9wZW5kaW5nUGF5bG9hZCk7XG4gICAgdGhpcy5faXNIYW5kbGVkW2lkXSA9IHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCB1cCBib29ra2VlcGluZyBuZWVkZWQgd2hlbiBkaXNwYXRjaGluZy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuXG4gIERpc3BhdGNoZXIucHJvdG90eXBlLl9zdGFydERpc3BhdGNoaW5nID0gZnVuY3Rpb24gX3N0YXJ0RGlzcGF0Y2hpbmcocGF5bG9hZCkge1xuICAgIGZvciAodmFyIGlkIGluIHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgdGhpcy5faXNQZW5kaW5nW2lkXSA9IGZhbHNlO1xuICAgICAgdGhpcy5faXNIYW5kbGVkW2lkXSA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLl9wZW5kaW5nUGF5bG9hZCA9IHBheWxvYWQ7XG4gICAgdGhpcy5faXNEaXNwYXRjaGluZyA9IHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIENsZWFyIGJvb2trZWVwaW5nIHVzZWQgZm9yIGRpc3BhdGNoaW5nLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cbiAgRGlzcGF0Y2hlci5wcm90b3R5cGUuX3N0b3BEaXNwYXRjaGluZyA9IGZ1bmN0aW9uIF9zdG9wRGlzcGF0Y2hpbmcoKSB7XG4gICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdQYXlsb2FkO1xuICAgIHRoaXMuX2lzRGlzcGF0Y2hpbmcgPSBmYWxzZTtcbiAgfTtcblxuICByZXR1cm4gRGlzcGF0Y2hlcjtcbn0pKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gRGlzcGF0Y2hlcjsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIEZsdXhDb250YWluZXJcbiAqIFxuICovXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgRmx1eFN0b3JlR3JvdXAgPSByZXF1aXJlKCcuL0ZsdXhTdG9yZUdyb3VwJyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciBzaGFsbG93RXF1YWwgPSByZXF1aXJlKCdmYmpzL2xpYi9zaGFsbG93RXF1YWwnKTtcblxudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgcHVyZTogdHJ1ZSxcbiAgd2l0aFByb3BzOiBmYWxzZVxufTtcblxuLyoqXG4gKiBBIEZsdXhDb250YWluZXIgaXMgdXNlZCB0byBzdWJzY3JpYmUgYSByZWFjdCBjb21wb25lbnQgdG8gbXVsdGlwbGUgc3RvcmVzLlxuICogVGhlIHN0b3JlcyB0aGF0IGFyZSB1c2VkIG11c3QgYmUgcmV0dXJuZWQgZnJvbSBhIHN0YXRpYyBgZ2V0U3RvcmVzKClgIG1ldGhvZC5cbiAqXG4gKiBUaGUgY29tcG9uZW50IHJlY2VpdmVzIGluZm9ybWF0aW9uIGZyb20gdGhlIHN0b3JlcyB2aWEgc3RhdGUuIFRoZSBzdGF0ZVxuICogaXMgZ2VuZXJhdGVkIHVzaW5nIGEgc3RhdGljIGBjYWxjdWxhdGVTdGF0ZSgpYCBtZXRob2QgdGhhdCBlYWNoIGNvbnRhaW5lclxuICogbXVzdCBpbXBsZW1lbnQuIEEgc2ltcGxlIGNvbnRhaW5lciBtYXkgbG9vayBsaWtlOlxuICovXG5mdW5jdGlvbiBjcmVhdGUoQmFzZSwgb3B0aW9ucykge1xuICBlbmZvcmNlSW50ZXJmYWNlKEJhc2UpO1xuXG4gIC8vIENvbnN0cnVjdCB0aGUgb3B0aW9ucyB1c2luZyBkZWZhdWx0LCBvdmVycmlkZSB3aXRoIHVzZXIgdmFsdWVzIGFzIG5lY2Vzc2FyeVxuICB2YXIgcmVhbE9wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgREVGQVVMVF9PUFRJT05TLCBvcHRpb25zIHx8IHt9KTtcblxuICB2YXIgRmx1eENvbnRhaW5lckNsYXNzID0gKGZ1bmN0aW9uIChfQmFzZSkge1xuICAgIF9pbmhlcml0cyhGbHV4Q29udGFpbmVyQ2xhc3MsIF9CYXNlKTtcblxuICAgIGZ1bmN0aW9uIEZsdXhDb250YWluZXJDbGFzcyhwcm9wcykge1xuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZsdXhDb250YWluZXJDbGFzcyk7XG5cbiAgICAgIF9CYXNlLmNhbGwodGhpcywgcHJvcHMpO1xuICAgICAgdGhpcy5zdGF0ZSA9IHJlYWxPcHRpb25zLndpdGhQcm9wcyA/IEJhc2UuY2FsY3VsYXRlU3RhdGUobnVsbCwgcHJvcHMpIDogQmFzZS5jYWxjdWxhdGVTdGF0ZShudWxsLCB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIC8vIE1ha2Ugc3VyZSB3ZSBvdmVycmlkZSBzaG91bGRDb21wb25lbnRVcGRhdGUgb25seSBpZiB0aGUgcHVyZSBvcHRpb24gaXNcbiAgICAvLyBzcGVjaWZpZWQuIFdlIGNhbid0IG92ZXJyaWRlIHRoaXMgYWJvdmUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIG92ZXJyaWRlXG4gICAgLy8gdGhlIGRlZmF1bHQgYmVoYXZpb3Igb24gYWNjaWRlbnQuIFN1cGVyIHdvcmtzIHdlaXJkIHdpdGggcmVhY3QgRVM2IGNsYXNzZXNcbiAgICAvLyByaWdodCBub3dcblxuICAgIEZsdXhDb250YWluZXJDbGFzcy5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmIChfQmFzZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQpIHtcbiAgICAgICAgX0Jhc2UucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50LmNhbGwodGhpcyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzdG9yZXMgPSBCYXNlLmdldFN0b3JlcygpO1xuXG4gICAgICAvLyBUaGlzIHRyYWNrcyB3aGVuIGFueSBzdG9yZSBoYXMgY2hhbmdlZCBhbmQgd2UgbWF5IG5lZWQgdG8gdXBkYXRlLlxuICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgIHZhciBzZXRDaGFuZ2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFRoaXMgYWRkcyBzdWJzY3JpcHRpb25zIHRvIHN0b3Jlcy4gV2hlbiBhIHN0b3JlIGNoYW5nZXMgYWxsIHdlIGRvIGlzXG4gICAgICAvLyBzZXQgY2hhbmdlZCB0byB0cnVlLlxuICAgICAgdGhpcy5fZmx1eENvbnRhaW5lclN1YnNjcmlwdGlvbnMgPSBzdG9yZXMubWFwKGZ1bmN0aW9uIChzdG9yZSkge1xuICAgICAgICByZXR1cm4gc3RvcmUuYWRkTGlzdGVuZXIoc2V0Q2hhbmdlZCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gVGhpcyBjYWxsYmFjayBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGRpc3BhdGNoIG9mIHRoZSByZWxldmFudCBzdG9yZXMuIElmXG4gICAgICAvLyBhbnkgaGF2ZSByZXBvcnRlZCBhIGNoYW5nZSB3ZSB1cGRhdGUgdGhlIHN0YXRlLCB0aGVuIHJlc2V0IGNoYW5nZWQuXG4gICAgICB2YXIgY2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgX3RoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlYWxPcHRpb25zLndpdGhQcm9wcyA/IEJhc2UuY2FsY3VsYXRlU3RhdGUocHJldlN0YXRlLCBfdGhpcy5wcm9wcykgOiBCYXNlLmNhbGN1bGF0ZVN0YXRlKHByZXZTdGF0ZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICB9O1xuICAgICAgdGhpcy5fZmx1eENvbnRhaW5lclN0b3JlR3JvdXAgPSBuZXcgRmx1eFN0b3JlR3JvdXAoc3RvcmVzLCBjYWxsYmFjayk7XG4gICAgfTtcblxuICAgIEZsdXhDb250YWluZXJDbGFzcy5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IGZ1bmN0aW9uIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobmV4dFByb3BzLCBuZXh0Q29udGV4dCkge1xuICAgICAgaWYgKF9CYXNlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKSB7XG4gICAgICAgIF9CYXNlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzLmNhbGwodGhpcywgbmV4dFByb3BzLCBuZXh0Q29udGV4dCk7XG4gICAgICB9XG5cbiAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGVsc2UgaWYgdGhlIGNvbnRhaW5lciBpcyBub3QgY29uZmlndXJlZCB0byB1c2UgcHJvcHNcbiAgICAgIGlmICghcmVhbE9wdGlvbnMud2l0aFByb3BzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgaXQncyBwdXJlIHdlIGNhbiBwb3RlbnRpYWxseSBvcHRpbWl6ZSBvdXQgdGhlIGNhbGN1bGF0ZSBzdGF0ZVxuICAgICAgaWYgKHJlYWxPcHRpb25zLnB1cmUgJiYgc2hhbGxvd0VxdWFsKHRoaXMucHJvcHMsIG5leHRQcm9wcykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBGaW5hbGx5IHVwZGF0ZSB0aGUgc3RhdGUgdXNpbmcgdGhlIG5ldyBwcm9wc1xuICAgICAgdGhpcy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIHJldHVybiBCYXNlLmNhbGN1bGF0ZVN0YXRlKHByZXZTdGF0ZSwgbmV4dFByb3BzKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBGbHV4Q29udGFpbmVyQ2xhc3MucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICBpZiAoX0Jhc2UucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50KSB7XG4gICAgICAgIF9CYXNlLnByb3RvdHlwZS5jb21wb25lbnRXaWxsVW5tb3VudC5jYWxsKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9mbHV4Q29udGFpbmVyU3RvcmVHcm91cC5yZWxlYXNlKCk7XG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSB0aGlzLl9mbHV4Q29udGFpbmVyU3Vic2NyaXB0aW9ucywgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvciksIF9pID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICAgICAgdmFyIF9yZWY7XG5cbiAgICAgICAgaWYgKF9pc0FycmF5KSB7XG4gICAgICAgICAgaWYgKF9pID49IF9pdGVyYXRvci5sZW5ndGgpIGJyZWFrO1xuICAgICAgICAgIF9yZWYgPSBfaXRlcmF0b3JbX2krK107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX2kgPSBfaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGlmIChfaS5kb25lKSBicmVhaztcbiAgICAgICAgICBfcmVmID0gX2kudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3Vic2NyaXB0aW9uID0gX3JlZjtcblxuICAgICAgICBzdWJzY3JpcHRpb24ucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9mbHV4Q29udGFpbmVyU3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIH07XG5cbiAgICByZXR1cm4gRmx1eENvbnRhaW5lckNsYXNzO1xuICB9KShCYXNlKTtcblxuICB2YXIgY29udGFpbmVyID0gcmVhbE9wdGlvbnMucHVyZSA/IGNyZWF0ZVB1cmVDb250YWluZXIoRmx1eENvbnRhaW5lckNsYXNzKSA6IEZsdXhDb250YWluZXJDbGFzcztcblxuICAvLyBVcGRhdGUgdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciBiZWZvcmUgcmV0dXJuaW5nXG4gIHZhciBjb21wb25lbnROYW1lID0gQmFzZS5kaXNwbGF5TmFtZSB8fCBCYXNlLm5hbWU7XG4gIGNvbnRhaW5lci5kaXNwbGF5TmFtZSA9ICdGbHV4Q29udGFpbmVyKCcgKyBjb21wb25lbnROYW1lICsgJyknO1xuXG4gIHJldHVybiBjb250YWluZXI7XG59XG5cbi8vIFRPRE86IHR5cGVjaGVjayB0aGlzIGJldHRlclxuZnVuY3Rpb24gY3JlYXRlUHVyZUNvbnRhaW5lcihGbHV4Q29udGFpbmVyQmFzZSkge1xuICB2YXIgUHVyZUZsdXhDb250YWluZXJDbGFzcyA9IChmdW5jdGlvbiAoX0ZsdXhDb250YWluZXJCYXNlKSB7XG4gICAgX2luaGVyaXRzKFB1cmVGbHV4Q29udGFpbmVyQ2xhc3MsIF9GbHV4Q29udGFpbmVyQmFzZSk7XG5cbiAgICBmdW5jdGlvbiBQdXJlRmx1eENvbnRhaW5lckNsYXNzKCkge1xuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFB1cmVGbHV4Q29udGFpbmVyQ2xhc3MpO1xuXG4gICAgICBfRmx1eENvbnRhaW5lckJhc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBQdXJlRmx1eENvbnRhaW5lckNsYXNzLnByb3RvdHlwZS5zaG91bGRDb21wb25lbnRVcGRhdGUgPSBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUobmV4dFByb3BzLCBuZXh0U3RhdGUpIHtcbiAgICAgIHJldHVybiAhc2hhbGxvd0VxdWFsKHRoaXMucHJvcHMsIG5leHRQcm9wcykgfHwgIXNoYWxsb3dFcXVhbCh0aGlzLnN0YXRlLCBuZXh0U3RhdGUpO1xuICAgIH07XG5cbiAgICByZXR1cm4gUHVyZUZsdXhDb250YWluZXJDbGFzcztcbiAgfSkoRmx1eENvbnRhaW5lckJhc2UpO1xuXG4gIHJldHVybiBQdXJlRmx1eENvbnRhaW5lckNsYXNzO1xufVxuXG5mdW5jdGlvbiBlbmZvcmNlSW50ZXJmYWNlKG8pIHtcbiAgIW8uZ2V0U3RvcmVzID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0NvbXBvbmVudHMgdGhhdCB1c2UgRmx1eENvbnRhaW5lciBtdXN0IGltcGxlbWVudCBgc3RhdGljIGdldFN0b3JlcygpYCcpIDogaW52YXJpYW50KGZhbHNlKSA6IHVuZGVmaW5lZDtcbiAgIW8uY2FsY3VsYXRlU3RhdGUgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnQ29tcG9uZW50cyB0aGF0IHVzZSBGbHV4Q29udGFpbmVyIG11c3QgaW1wbGVtZW50IGBzdGF0aWMgY2FsY3VsYXRlU3RhdGUoKWAnKSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0geyBjcmVhdGU6IGNyZWF0ZSB9OyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgRmx1eE1hcFN0b3JlXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSAnZnVuY3Rpb24nICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAnICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgRmx1eFJlZHVjZVN0b3JlID0gcmVxdWlyZSgnLi9GbHV4UmVkdWNlU3RvcmUnKTtcbnZhciBJbW11dGFibGUgPSByZXF1aXJlKCdpbW11dGFibGUnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIFRoaXMgaXMgYSBzaW1wbGUgc3RvcmUuIEl0IGFsbG93cyBjYWNoaW5nIGtleSB2YWx1ZSBwYWlycy4gQW4gaW1wbGVtZW50YXRpb25cbiAqIG9mIGEgc3RvcmUgdXNpbmcgdGhpcyBtaWdodCBsb29rIGxpa2U6XG4gKlxuICogICBjbGFzcyBGb29TdG9yZSBleHRlbmRzIEZsdXhNYXBTdG9yZSB7XG4gKiAgICAgcmVkdWNlKHN0YXRlLCBhY3Rpb24pIHtcbiAqICAgICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAqICAgICAgICAgY2FzZSAnZm9vJzpcbiAqICAgICAgICAgICByZXR1cm4gc3RhdGUuc2V0KGFjdGlvbi5pZCwgYWN0aW9uLmZvbyk7XG4gKiAgICAgICAgIGNhc2UgJ2Jhcic6XG4gKiAgICAgICAgICAgcmV0dXJuIHN0YXRlLmRlbGV0ZShhY3Rpb24uaWQpO1xuICogICAgICAgICBkZWZhdWx0OlxuICogICAgICAgICAgIHJldHVybiBzdGF0ZTtcbiAqICAgICAgIH1cbiAqICAgICB9XG4gKiAgIH1cbiAqXG4gKi9cblxudmFyIEZsdXhNYXBTdG9yZSA9IChmdW5jdGlvbiAoX0ZsdXhSZWR1Y2VTdG9yZSkge1xuICBfaW5oZXJpdHMoRmx1eE1hcFN0b3JlLCBfRmx1eFJlZHVjZVN0b3JlKTtcblxuICBmdW5jdGlvbiBGbHV4TWFwU3RvcmUoKSB7XG4gICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIEZsdXhNYXBTdG9yZSk7XG5cbiAgICBfRmx1eFJlZHVjZVN0b3JlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBGbHV4TWFwU3RvcmUucHJvdG90eXBlLmdldEluaXRpYWxTdGF0ZSA9IGZ1bmN0aW9uIGdldEluaXRpYWxTdGF0ZSgpIHtcbiAgICByZXR1cm4gSW1tdXRhYmxlLk1hcCgpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBY2Nlc3MgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBrZXkuIHRocm93cyBhbiBlcnJvciBpZiB0aGUga2V5IGRvZXMgbm90XG4gICAqIGV4aXN0IGluIHRoZSBjYWNoZS5cbiAgICovXG5cbiAgRmx1eE1hcFN0b3JlLnByb3RvdHlwZS5hdCA9IGZ1bmN0aW9uIGF0KGtleSkge1xuICAgICF0aGlzLmhhcyhrZXkpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkIHN0b3JlIHRvIGhhdmUga2V5ICVzJywga2V5KSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KGtleSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBjYWNoZSBoYXMgYSBwYXJ0aWN1bGFyIGtleVxuICAgKi9cblxuICBGbHV4TWFwU3RvcmUucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIGhhcyhrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGF0ZSgpLmhhcyhrZXkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIHZhbHVlIG9mIGEgcGFydGljdWxhciBrZXkuIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSBrZXkgZG9lcyBub3RcbiAgICogZXhpc3QgaW4gdGhlIGNhY2hlLlxuICAgKi9cblxuICBGbHV4TWFwU3RvcmUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGF0ZSgpLmdldChrZXkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXRzIGFuIGFycmF5IG9mIGtleXMgYW5kIHB1dHMgdGhlIHZhbHVlcyBpbiBhIG1hcCBpZiB0aGV5IGV4aXN0LCBpdCBhbGxvd3NcbiAgICogcHJvdmlkaW5nIGEgcHJldmlvdXMgcmVzdWx0IHRvIHVwZGF0ZSBpbnN0ZWFkIG9mIGdlbmVyYXRpbmcgYSBuZXcgbWFwLlxuICAgKlxuICAgKiBQcm92aWRpbmcgYSBwcmV2aW91cyByZXN1bHQgYWxsb3dzIHRoZSBwb3NzaWJpbGl0eSBvZiBrZWVwaW5nIHRoZSBzYW1lXG4gICAqIHJlZmVyZW5jZSBpZiB0aGUga2V5cyBkaWQgbm90IGNoYW5nZS5cbiAgICovXG5cbiAgRmx1eE1hcFN0b3JlLnByb3RvdHlwZS5nZXRBbGwgPSBmdW5jdGlvbiBnZXRBbGwoa2V5cywgcHJldikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgbmV3S2V5cyA9IEltbXV0YWJsZS5TZXQoa2V5cyk7XG4gICAgdmFyIHN0YXJ0ID0gcHJldiB8fCBJbW11dGFibGUuTWFwKCk7XG4gICAgcmV0dXJuIHN0YXJ0LndpdGhNdXRhdGlvbnMoZnVuY3Rpb24gKG1hcCkge1xuICAgICAgLy8gcmVtb3ZlIGFueSBvbGQga2V5cyB0aGF0IGFyZSBub3QgaW4gbmV3IGtleXMgb3IgYXJlIG5vIGxvbmdlciBpblxuICAgICAgLy8gdGhlIGNhY2hlXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IgPSBzdGFydCwgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvciksIF9pID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICAgICAgdmFyIF9yZWY7XG5cbiAgICAgICAgaWYgKF9pc0FycmF5KSB7XG4gICAgICAgICAgaWYgKF9pID49IF9pdGVyYXRvci5sZW5ndGgpIGJyZWFrO1xuICAgICAgICAgIF9yZWYgPSBfaXRlcmF0b3JbX2krK107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgX2kgPSBfaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGlmIChfaS5kb25lKSBicmVhaztcbiAgICAgICAgICBfcmVmID0gX2kudmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZW50cnkgPSBfcmVmO1xuICAgICAgICB2YXIgb2xkS2V5ID0gZW50cnlbMF07XG5cbiAgICAgICAgaWYgKCFuZXdLZXlzLmhhcyhvbGRLZXkpIHx8ICFfdGhpcy5oYXMob2xkS2V5KSkge1xuICAgICAgICAgIG1hcFsnZGVsZXRlJ10ob2xkS2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyB0aGVuIGFkZCBhbGwgb2YgdGhlIG5ldyBrZXlzIHRoYXQgZXhpc3QgaW4gdGhlIGNhY2hlXG4gICAgICBmb3IgKHZhciBfaXRlcmF0b3IyID0gbmV3S2V5cywgX2lzQXJyYXkyID0gQXJyYXkuaXNBcnJheShfaXRlcmF0b3IyKSwgX2kyID0gMCwgX2l0ZXJhdG9yMiA9IF9pc0FycmF5MiA/IF9pdGVyYXRvcjIgOiBfaXRlcmF0b3IyW1N5bWJvbC5pdGVyYXRvcl0oKTs7KSB7XG4gICAgICAgIHZhciBfcmVmMjtcblxuICAgICAgICBpZiAoX2lzQXJyYXkyKSB7XG4gICAgICAgICAgaWYgKF9pMiA+PSBfaXRlcmF0b3IyLmxlbmd0aCkgYnJlYWs7XG4gICAgICAgICAgX3JlZjIgPSBfaXRlcmF0b3IyW19pMisrXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfaTIgPSBfaXRlcmF0b3IyLm5leHQoKTtcbiAgICAgICAgICBpZiAoX2kyLmRvbmUpIGJyZWFrO1xuICAgICAgICAgIF9yZWYyID0gX2kyLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGtleSA9IF9yZWYyO1xuXG4gICAgICAgIGlmIChfdGhpcy5oYXMoa2V5KSkge1xuICAgICAgICAgIG1hcC5zZXQoa2V5LCBfdGhpcy5hdChrZXkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBGbHV4TWFwU3RvcmU7XG59KShGbHV4UmVkdWNlU3RvcmUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZsdXhNYXBTdG9yZTsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIEZsdXhNaXhpbkxlZ2FjeVxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRmx1eFN0b3JlR3JvdXAgPSByZXF1aXJlKCcuL0ZsdXhTdG9yZUdyb3VwJyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBgRmx1eENvbnRhaW5lcmAgc2hvdWxkIGJlIHByZWZlcnJlZCBvdmVyIHRoaXMgbWl4aW4sIGJ1dCBpdCByZXF1aXJlcyB1c2luZ1xuICogcmVhY3Qgd2l0aCBjbGFzc2VzLiBTbyB0aGlzIG1peGluIGlzIHByb3ZpZGVkIHdoZXJlIGl0IGlzIG5vdCB5ZXQgcG9zc2libGVcbiAqIHRvIGNvbnZlcnQgYSBjb250YWluZXIgdG8gYmUgYSBjbGFzcy5cbiAqXG4gKiBUaGlzIG1peGluIHNob3VsZCBiZSB1c2VkIGZvciBSZWFjdCBjb21wb25lbnRzIHRoYXQgaGF2ZSBzdGF0ZSBiYXNlZCBwdXJlbHlcbiAqIG9uIHN0b3Jlcy4gYHRoaXMucHJvcHNgIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBpbnNpZGUgb2YgYGNhbGN1bGF0ZVN0YXRlKClgLlxuICpcbiAqIFRoaXMgbWl4aW4gd2lsbCBvbmx5IGBzZXRTdGF0ZWAgbm90IHJlcGxhY2UgaXQsIHNvIHlvdSBzaG91bGQgYWx3YXlzIHJldHVyblxuICogZXZlcnkga2V5IGluIHlvdXIgc3RhdGUgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4gQ29uc2lkZXIgdGhpczpcbiAqXG4gKiAgIHZhciBGb28gPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gKiAgICAgbWl4aW5zOiBbXG4gKiAgICAgICBGbHV4TWl4aW5MZWdhY3koW0Zvb1N0b3JlXSlcbiAqICAgICBdLFxuICpcbiAqICAgICBzdGF0aWNzOiB7XG4gKiAgICAgICBjYWxjdWxhdGVTdGF0ZShwcmV2U3RhdGUpIHtcbiAqICAgICAgICAgaWYgKCFwcmV2U3RhdGUpIHtcbiAqICAgICAgICAgICByZXR1cm4ge1xuICogICAgICAgICAgICAgZm9vOiBGb29TdG9yZS5nZXRGb28oKSxcbiAqICAgICAgICAgICB9O1xuICogICAgICAgICB9XG4gKlxuICogICAgICAgICByZXR1cm4ge1xuICogICAgICAgICAgIGJhcjogRm9vU3RvcmUuZ2V0QmFyKCksXG4gKiAgICAgICAgIH07XG4gKiAgICAgICB9XG4gKiAgICAgfSxcbiAqICAgfSk7XG4gKlxuICogT24gdGhlIHNlY29uZCBjYWxjdWxhdGVTdGF0ZSB3aGVuIHByZXZTdGF0ZSBpcyBub3QgbnVsbCwgdGhlIHN0YXRlIHdpbGwgYmVcbiAqIHVwZGF0ZWQgdG8gY29udGFpbiB0aGUgcHJldmlvdXMgZm9vIEFORCB0aGUgYmFyIHRoYXQgd2FzIGp1c3QgcmV0dXJuZWQuIE9ubHlcbiAqIHJldHVybmluZyBiYXIgd2lsbCBub3QgZGVsZXRlIGZvby5cbiAqXG4gKi9cbmZ1bmN0aW9uIEZsdXhNaXhpbkxlZ2FjeShzdG9yZXMpIHtcbiAgcmV0dXJuIHtcbiAgICBnZXRJbml0aWFsU3RhdGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIGVuZm9yY2VJbnRlcmZhY2UodGhpcyk7XG4gICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5jYWxjdWxhdGVTdGF0ZShudWxsKTtcbiAgICB9LFxuXG4gICAgY29tcG9uZW50RGlkTW91bnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIC8vIFRoaXMgdHJhY2tzIHdoZW4gYW55IHN0b3JlIGhhcyBjaGFuZ2VkIGFuZCB3ZSBtYXkgbmVlZCB0byB1cGRhdGUuXG4gICAgICB2YXIgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgdmFyIHNldENoYW5nZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgfTtcblxuICAgICAgLy8gVGhpcyBhZGRzIHN1YnNjcmlwdGlvbnMgdG8gc3RvcmVzLiBXaGVuIGEgc3RvcmUgY2hhbmdlcyBhbGwgd2UgZG8gaXNcbiAgICAgIC8vIHNldCBjaGFuZ2VkIHRvIHRydWUuXG4gICAgICB0aGlzLl9mbHV4TWl4aW5TdWJzY3JpcHRpb25zID0gc3RvcmVzLm1hcChmdW5jdGlvbiAoc3RvcmUpIHtcbiAgICAgICAgcmV0dXJuIHN0b3JlLmFkZExpc3RlbmVyKHNldENoYW5nZWQpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIGFmdGVyIHRoZSBkaXNwYXRjaCBvZiB0aGUgcmVsZXZhbnQgc3RvcmVzLiBJZlxuICAgICAgLy8gYW55IGhhdmUgcmVwb3J0ZWQgYSBjaGFuZ2Ugd2UgdXBkYXRlIHRoZSBzdGF0ZSwgdGhlbiByZXNldCBjaGFuZ2VkLlxuICAgICAgdmFyIGNhbGxiYWNrID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgIF90aGlzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpcy5jb25zdHJ1Y3Rvci5jYWxjdWxhdGVTdGF0ZShfdGhpcy5zdGF0ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgfTtcbiAgICAgIHRoaXMuX2ZsdXhNaXhpblN0b3JlR3JvdXAgPSBuZXcgRmx1eFN0b3JlR3JvdXAoc3RvcmVzLCBjYWxsYmFjayk7XG4gICAgfSxcblxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50OiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLl9mbHV4TWl4aW5TdG9yZUdyb3VwLnJlbGVhc2UoKTtcbiAgICAgIGZvciAodmFyIF9pdGVyYXRvciA9IHRoaXMuX2ZsdXhNaXhpblN1YnNjcmlwdGlvbnMsIF9pc0FycmF5ID0gQXJyYXkuaXNBcnJheShfaXRlcmF0b3IpLCBfaSA9IDAsIF9pdGVyYXRvciA9IF9pc0FycmF5ID8gX2l0ZXJhdG9yIDogX2l0ZXJhdG9yW1N5bWJvbC5pdGVyYXRvcl0oKTs7KSB7XG4gICAgICAgIHZhciBfcmVmO1xuXG4gICAgICAgIGlmIChfaXNBcnJheSkge1xuICAgICAgICAgIGlmIChfaSA+PSBfaXRlcmF0b3IubGVuZ3RoKSBicmVhaztcbiAgICAgICAgICBfcmVmID0gX2l0ZXJhdG9yW19pKytdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF9pID0gX2l0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBpZiAoX2kuZG9uZSkgYnJlYWs7XG4gICAgICAgICAgX3JlZiA9IF9pLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IF9yZWY7XG5cbiAgICAgICAgc3Vic2NyaXB0aW9uLnJlbW92ZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZmx1eE1peGluU3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gZW5mb3JjZUludGVyZmFjZShvKSB7XG4gICFvLmNvbnN0cnVjdG9yLmNhbGN1bGF0ZVN0YXRlID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0NvbXBvbmVudHMgdGhhdCB1c2UgRmx1eE1peGluTGVnYWN5IG11c3QgaW1wbGVtZW50ICcgKyAnYGNhbGN1bGF0ZVN0YXRlKClgIG9uIHRoZSBzdGF0aWNzIG9iamVjdCcpIDogaW52YXJpYW50KGZhbHNlKSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBGbHV4TWl4aW5MZWdhY3k7IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIEBwcm92aWRlc01vZHVsZSBGbHV4UmVkdWNlU3RvcmVcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKTsgfSB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICdmdW5jdGlvbicgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICcgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciBGbHV4U3RvcmUgPSByZXF1aXJlKCcuL0ZsdXhTdG9yZScpO1xuXG52YXIgYWJzdHJhY3RNZXRob2QgPSByZXF1aXJlKCcuL2Fic3RyYWN0TWV0aG9kJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbnZhciBGbHV4UmVkdWNlU3RvcmUgPSAoZnVuY3Rpb24gKF9GbHV4U3RvcmUpIHtcbiAgX2luaGVyaXRzKEZsdXhSZWR1Y2VTdG9yZSwgX0ZsdXhTdG9yZSk7XG5cbiAgZnVuY3Rpb24gRmx1eFJlZHVjZVN0b3JlKGRpc3BhdGNoZXIpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRmx1eFJlZHVjZVN0b3JlKTtcblxuICAgIF9GbHV4U3RvcmUuY2FsbCh0aGlzLCBkaXNwYXRjaGVyKTtcbiAgICB0aGlzLl9zdGF0ZSA9IHRoaXMuZ2V0SW5pdGlhbFN0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0dGVyIHRoYXQgZXhwb3NlcyB0aGUgZW50aXJlIHN0YXRlIG9mIHRoaXMgc3RvcmUuIElmIHlvdXIgc3RhdGUgaXMgbm90XG4gICAqIGltbXV0YWJsZSB5b3Ugc2hvdWxkIG92ZXJyaWRlIHRoaXMgYW5kIG5vdCBleHBvc2UgX3N0YXRlIGRpcmVjdGx5LlxuICAgKi9cblxuICBGbHV4UmVkdWNlU3RvcmUucHJvdG90eXBlLmdldFN0YXRlID0gZnVuY3Rpb24gZ2V0U3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIHRoZSBpbml0aWFsIHN0YXRlIGZvciB0aGlzIHN0b3JlLiBUaGlzIGlzIGNhbGxlZCBvbmNlIGR1cmluZ1xuICAgKiBjb25zdHJ1Y3Rpb24gb2YgdGhlIHN0b3JlLlxuICAgKi9cblxuICBGbHV4UmVkdWNlU3RvcmUucHJvdG90eXBlLmdldEluaXRpYWxTdGF0ZSA9IGZ1bmN0aW9uIGdldEluaXRpYWxTdGF0ZSgpIHtcbiAgICByZXR1cm4gYWJzdHJhY3RNZXRob2QoJ0ZsdXhSZWR1Y2VTdG9yZScsICdnZXRJbml0aWFsU3RhdGUnKTtcbiAgfTtcblxuICAvKipcbiAgICogVXNlZCB0byByZWR1Y2UgYSBzdHJlYW0gb2YgYWN0aW9ucyBjb21pbmcgZnJvbSB0aGUgZGlzcGF0Y2hlciBpbnRvIGFcbiAgICogc2luZ2xlIHN0YXRlIG9iamVjdFxuICAgKi9cblxuICBGbHV4UmVkdWNlU3RvcmUucHJvdG90eXBlLnJlZHVjZSA9IGZ1bmN0aW9uIHJlZHVjZShzdGF0ZSwgYWN0aW9uKSB7XG4gICAgcmV0dXJuIGFic3RyYWN0TWV0aG9kKCdGbHV4UmVkdWNlU3RvcmUnLCAncmVkdWNlJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0d28gdmVyc2lvbnMgb2Ygc3RhdGUgYXJlIHRoZSBzYW1lLiBZb3UgZG8gbm90IG5lZWQgdG8gb3ZlcnJpZGVcbiAgICogdGhpcyBpZiB5b3VyIHN0YXRlIGlzIGltbXV0YWJsZS5cbiAgICovXG5cbiAgRmx1eFJlZHVjZVN0b3JlLnByb3RvdHlwZS5hcmVFcXVhbCA9IGZ1bmN0aW9uIGFyZUVxdWFsKG9uZSwgdHdvKSB7XG4gICAgcmV0dXJuIG9uZSA9PT0gdHdvO1xuICB9O1xuXG4gIC8qKlxuICAgKiBVc2UgcmVkdWNlIGFuZCB0cmFjayBfc3RhdGUgaW5zdGVhZCBvZiB1c2luZyBfX29uRGlzcGF0Y2hcbiAgICovXG5cbiAgRmx1eFJlZHVjZVN0b3JlLnByb3RvdHlwZS5fX2ludm9rZU9uRGlzcGF0Y2ggPSBmdW5jdGlvbiBfX2ludm9rZU9uRGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgdGhpcy5fX2NoYW5nZWQgPSBmYWxzZTtcblxuICAgIC8vIHJlZHVjZSB0aGUgc3RyZWFtIG9mIGluY29taW5nIGFjdGlvbnMgdG8gc3RhdGUsIHVwZGF0ZSB3aGVuIG5lY2Vzc2FyeVxuICAgIHZhciBzdGFydGluZ1N0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgdmFyIGVuZGluZ1N0YXRlID0gdGhpcy5yZWR1Y2Uoc3RhcnRpbmdTdGF0ZSwgYWN0aW9uKTtcblxuICAgIC8vIFRoaXMgbWVhbnMgeW91ciBlbmRpbmcgc3RhdGUgc2hvdWxkIG5ldmVyIGJlIHVuZGVmaW5lZFxuICAgICEoZW5kaW5nU3RhdGUgIT09IHVuZGVmaW5lZCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMgcmV0dXJuZWQgdW5kZWZpbmVkIGZyb20gcmVkdWNlKC4uLiksIGRpZCB5b3UgZm9yZ2V0IHRvIHJldHVybiAnICsgJ3N0YXRlIGluIHRoZSBkZWZhdWx0IGNhc2U/ICh1c2UgbnVsbCBpZiB0aGlzIHdhcyBpbnRlbnRpb25hbCknLCB0aGlzLmNvbnN0cnVjdG9yLm5hbWUpIDogaW52YXJpYW50KGZhbHNlKSA6IHVuZGVmaW5lZDtcblxuICAgIGlmICghdGhpcy5hcmVFcXVhbChzdGFydGluZ1N0YXRlLCBlbmRpbmdTdGF0ZSkpIHtcbiAgICAgIHRoaXMuX3N0YXRlID0gZW5kaW5nU3RhdGU7XG5cbiAgICAgIC8vIGBfX2VtaXRDaGFuZ2UoKWAgc2V0cyBgdGhpcy5fX2NoYW5nZWRgIHRvIHRydWUgYW5kIHRoZW4gdGhlIGFjdHVhbFxuICAgICAgLy8gY2hhbmdlIHdpbGwgYmUgZmlyZWQgZnJvbSB0aGUgZW1pdHRlciBhdCB0aGUgZW5kIG9mIHRoZSBkaXNwYXRjaCwgdGhpc1xuICAgICAgLy8gaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gc3VwcG9ydCBtZXRob2RzIGxpa2UgYGhhc0NoYW5nZWQoKWBcbiAgICAgIHRoaXMuX19lbWl0Q2hhbmdlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX19jaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9fZW1pdHRlci5lbWl0KHRoaXMuX19jaGFuZ2VFdmVudCk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBGbHV4UmVkdWNlU3RvcmU7XG59KShGbHV4U3RvcmUpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZsdXhSZWR1Y2VTdG9yZTsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIEZsdXhTdG9yZVxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbicpOyB9IH1cblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnZmJlbWl0dGVyJyk7XG5cbnZhciBFdmVudEVtaXR0ZXIgPSBfcmVxdWlyZS5FdmVudEVtaXR0ZXI7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIHNob3VsZCBiZSBleHRlbmRlZCBieSB0aGUgc3RvcmVzIGluIHlvdXIgYXBwbGljYXRpb24sIGxpa2Ugc286XG4gKlxuICogdmFyIEZsdXhTdG9yZSA9IHJlcXVpcmUoJ0ZsdXhTdG9yZScpO1xuICogdmFyIE15RGlzcGF0Y2hlciA9IHJlcXVpcmUoJ015RGlzcGF0Y2hlcicpO1xuICpcbiAqIHZhciBfZm9vO1xuICpcbiAqIGNsYXNzIE15U3RvcmUgZXh0ZW5kcyBGbHV4U3RvcmUge1xuICpcbiAqICAgZ2V0Rm9vKCkge1xuICogICAgIHJldHVybiBfZm9vO1xuICogICB9XG4gKlxuICogICBfX29uRGlzcGF0Y2ggPSBmdW5jdGlvbihhY3Rpb24pIHtcbiAqICAgICBzd2l0Y2goYWN0aW9uLnR5cGUpIHtcbiAqXG4gKiAgICAgICBjYXNlICdhbi1hY3Rpb24nOlxuICogICAgICAgICBjaGFuZ2VTdGF0ZShhY3Rpb24uc29tZURhdGEpO1xuICogICAgICAgICB0aGlzLl9fZW1pdENoYW5nZSgpO1xuICogICAgICAgICBicmVhaztcbiAqXG4gKiAgICAgICBjYXNlICdhbm90aGVyLWFjdGlvbic6XG4gKiAgICAgICAgIGNoYW5nZVN0YXRlQW5vdGhlcldheShhY3Rpb24ub3RoZXJEYXRhKTtcbiAqICAgICAgICAgdGhpcy5fX2VtaXRDaGFuZ2UoKTtcbiAqICAgICAgICAgYnJlYWs7XG4gKlxuICogICAgICAgZGVmYXVsdDpcbiAqICAgICAgICAgLy8gbm8gb3BcbiAqICAgICB9XG4gKiAgIH1cbiAqXG4gKiB9XG4gKlxuICogbW9kdWxlLmV4cG9ydHMgPSBuZXcgTXlTdG9yZShNeURpc3BhdGNoZXIpO1xuICovXG5cbnZhciBGbHV4U3RvcmUgPSAoZnVuY3Rpb24gKCkge1xuXG4gIC8qKlxuICAgKiBAcHVibGljXG4gICAqIEBwYXJhbSB7RGlzcGF0Y2hlcn0gZGlzcGF0Y2hlclxuICAgKi9cblxuICBmdW5jdGlvbiBGbHV4U3RvcmUoZGlzcGF0Y2hlcikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRmx1eFN0b3JlKTtcblxuICAgIHRoaXMuX19jbGFzc05hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgICB0aGlzLl9fY2hhbmdlZCA9IGZhbHNlO1xuICAgIHRoaXMuX19jaGFuZ2VFdmVudCA9ICdjaGFuZ2UnO1xuICAgIHRoaXMuX19kaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjtcbiAgICB0aGlzLl9fZW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLl9kaXNwYXRjaFRva2VuID0gZGlzcGF0Y2hlci5yZWdpc3RlcihmdW5jdGlvbiAocGF5bG9hZCkge1xuICAgICAgX3RoaXMuX19pbnZva2VPbkRpc3BhdGNoKHBheWxvYWQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwdWJsaWNcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAgICogQHJldHVybiB7b2JqZWN0fSBFbWl0dGVyU3Vic2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgd2l0aFxuICAgKiAgIFN1YnNjcmlwdGlvbnNIYW5kbGVyIG9yIGRpcmVjdGx5IHVzZWQgdG8gcmVsZWFzZSB0aGUgc3Vic2NyaXB0aW9uLlxuICAgKi9cblxuICBGbHV4U3RvcmUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24gYWRkTGlzdGVuZXIoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5fX2VtaXR0ZXIuYWRkTGlzdGVuZXIodGhpcy5fX2NoYW5nZUV2ZW50LCBjYWxsYmFjayk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBwdWJsaWNcbiAgICogQHJldHVybiB7RGlzcGF0Y2hlcn0gVGhlIGRpc3BhdGNoZXIgdGhhdCB0aGlzIHN0b3JlIGlzIHJlZ2lzdGVyZWQgd2l0aC5cbiAgICovXG5cbiAgRmx1eFN0b3JlLnByb3RvdHlwZS5nZXREaXNwYXRjaGVyID0gZnVuY3Rpb24gZ2V0RGlzcGF0Y2hlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fX2Rpc3BhdGNoZXI7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBwdWJsaWNcbiAgICogQHJldHVybiB7c3RyaW5nfSBBIHN0cmluZyB0aGUgZGlzcGF0Y2hlciB1c2VzIHRvIGlkZW50aWZ5IGVhY2ggc3RvcmUnc1xuICAgKiAgIHJlZ2lzdGVyZWQgY2FsbGJhY2suIFRoaXMgaXMgdXNlZCB3aXRoIHRoZSBkaXNwYXRjaGVyJ3Mgd2FpdEZvciBtZXRob2RcbiAgICogICB0byBkZWNsYXJhdGl2ZWx5IGRlcGVuZCBvbiBvdGhlciBzdG9yZXMgdXBkYXRpbmcgdGhlbXNlbHZlcyBmaXJzdC5cbiAgICovXG5cbiAgRmx1eFN0b3JlLnByb3RvdHlwZS5nZXREaXNwYXRjaFRva2VuID0gZnVuY3Rpb24gZ2V0RGlzcGF0Y2hUb2tlbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hUb2tlbjtcbiAgfTtcblxuICAvKipcbiAgICogQHB1YmxpY1xuICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBzdG9yZSBoYXMgY2hhbmdlZCBkdXJpbmcgdGhlIG1vc3QgcmVjZW50XG4gICAqICAgZGlzcGF0Y2guXG4gICAqL1xuXG4gIEZsdXhTdG9yZS5wcm90b3R5cGUuaGFzQ2hhbmdlZCA9IGZ1bmN0aW9uIGhhc0NoYW5nZWQoKSB7XG4gICAgIXRoaXMuX19kaXNwYXRjaGVyLmlzRGlzcGF0Y2hpbmcoKSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICclcy5oYXNDaGFuZ2VkKCk6IE11c3QgYmUgaW52b2tlZCB3aGlsZSBkaXNwYXRjaGluZy4nLCB0aGlzLl9fY2xhc3NOYW1lKSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuX19jaGFuZ2VkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEVtaXQgYW4gZXZlbnQgbm90aWZ5aW5nIGxpc3RlbmVycyB0aGF0IHRoZSBzdGF0ZSBvZiB0aGUgc3RvcmUgaGFzIGNoYW5nZWQuXG4gICAqL1xuXG4gIEZsdXhTdG9yZS5wcm90b3R5cGUuX19lbWl0Q2hhbmdlID0gZnVuY3Rpb24gX19lbWl0Q2hhbmdlKCkge1xuICAgICF0aGlzLl9fZGlzcGF0Y2hlci5pc0Rpc3BhdGNoaW5nKCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMuX19lbWl0Q2hhbmdlKCk6IE11c3QgYmUgaW52b2tlZCB3aGlsZSBkaXNwYXRjaGluZy4nLCB0aGlzLl9fY2xhc3NOYW1lKSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5fX2NoYW5nZWQgPSB0cnVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBlbmNhcHN1bGF0ZXMgYWxsIGxvZ2ljIGZvciBpbnZva2luZyBfX29uRGlzcGF0Y2guIEl0IHNob3VsZFxuICAgKiBiZSB1c2VkIGZvciB0aGluZ3MgbGlrZSBjYXRjaGluZyBjaGFuZ2VzIGFuZCBlbWl0dGluZyB0aGVtIGFmdGVyIHRoZVxuICAgKiBzdWJjbGFzcyBoYXMgaGFuZGxlZCBhIHBheWxvYWQuXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQHBhcmFtIHtvYmplY3R9IHBheWxvYWQgVGhlIGRhdGEgZGlzcGF0Y2hlZCBieSB0aGUgZGlzcGF0Y2hlciwgZGVzY3JpYmluZ1xuICAgKiAgIHNvbWV0aGluZyB0aGF0IGhhcyBoYXBwZW5lZCBpbiB0aGUgcmVhbCB3b3JsZDogdGhlIHVzZXIgY2xpY2tlZCwgdGhlXG4gICAqICAgc2VydmVyIHJlc3BvbmRlZCwgdGltZSBwYXNzZWQsIGV0Yy5cbiAgICovXG5cbiAgRmx1eFN0b3JlLnByb3RvdHlwZS5fX2ludm9rZU9uRGlzcGF0Y2ggPSBmdW5jdGlvbiBfX2ludm9rZU9uRGlzcGF0Y2gocGF5bG9hZCkge1xuICAgIHRoaXMuX19jaGFuZ2VkID0gZmFsc2U7XG4gICAgdGhpcy5fX29uRGlzcGF0Y2gocGF5bG9hZCk7XG4gICAgaWYgKHRoaXMuX19jaGFuZ2VkKSB7XG4gICAgICB0aGlzLl9fZW1pdHRlci5lbWl0KHRoaXMuX19jaGFuZ2VFdmVudCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZGlzcGF0Y2hlciBkdXJpbmdcbiAgICogaW5zdGFudGlhdGlvbi4gU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBUaGlzIGNhbGxiYWNrIGlzIHRoZVxuICAgKiBvbmx5IHdheSB0aGUgc3RvcmUgcmVjZWl2ZXMgbmV3IGRhdGEuXG4gICAqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQG92ZXJyaWRlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXlsb2FkIFRoZSBkYXRhIGRpc3BhdGNoZWQgYnkgdGhlIGRpc3BhdGNoZXIsIGRlc2NyaWJpbmdcbiAgICogICBzb21ldGhpbmcgdGhhdCBoYXMgaGFwcGVuZWQgaW4gdGhlIHJlYWwgd29ybGQ6IHRoZSB1c2VyIGNsaWNrZWQsIHRoZVxuICAgKiAgIHNlcnZlciByZXNwb25kZWQsIHRpbWUgcGFzc2VkLCBldGMuXG4gICAqL1xuXG4gIEZsdXhTdG9yZS5wcm90b3R5cGUuX19vbkRpc3BhdGNoID0gZnVuY3Rpb24gX19vbkRpc3BhdGNoKHBheWxvYWQpIHtcbiAgICAhZmFsc2UgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMgaGFzIG5vdCBvdmVycmlkZGVuIEZsdXhTdG9yZS5fX29uRGlzcGF0Y2goKSwgd2hpY2ggaXMgcmVxdWlyZWQnLCB0aGlzLl9fY2xhc3NOYW1lKSA6IGludmFyaWFudChmYWxzZSkgOiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgcmV0dXJuIEZsdXhTdG9yZTtcbn0pKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gRmx1eFN0b3JlO1xuXG4vLyBwcml2YXRlXG5cbi8vIHByb3RlY3RlZCwgYXZhaWxhYmxlIHRvIHN1YmNsYXNzZXMiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIEZsdXhTdG9yZUdyb3VwXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uJyk7IH0gfVxuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogRmx1eFN0b3JlR3JvdXAgYWxsb3dzIHlvdSB0byBleGVjdXRlIGEgY2FsbGJhY2sgb24gZXZlcnkgZGlzcGF0Y2ggYWZ0ZXJcbiAqIHdhaXRpbmcgZm9yIGVhY2ggb2YgdGhlIGdpdmVuIHN0b3Jlcy5cbiAqL1xuXG52YXIgRmx1eFN0b3JlR3JvdXAgPSAoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGbHV4U3RvcmVHcm91cChzdG9yZXMsIGNhbGxiYWNrKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBGbHV4U3RvcmVHcm91cCk7XG5cbiAgICB0aGlzLl9kaXNwYXRjaGVyID0gX2dldFVuaWZvcm1EaXNwYXRjaGVyKHN0b3Jlcyk7XG5cbiAgICAvLyBwcmVjb21wdXRlIHN0b3JlIHRva2Vuc1xuICAgIHZhciBzdG9yZVRva2VucyA9IHN0b3Jlcy5tYXAoZnVuY3Rpb24gKHN0b3JlKSB7XG4gICAgICByZXR1cm4gc3RvcmUuZ2V0RGlzcGF0Y2hUb2tlbigpO1xuICAgIH0pO1xuXG4gICAgLy8gcmVnaXN0ZXIgd2l0aCB0aGUgZGlzcGF0Y2hlclxuICAgIHRoaXMuX2Rpc3BhdGNoVG9rZW4gPSB0aGlzLl9kaXNwYXRjaGVyLnJlZ2lzdGVyKGZ1bmN0aW9uIChwYXlsb2FkKSB7XG4gICAgICBfdGhpcy5fZGlzcGF0Y2hlci53YWl0Rm9yKHN0b3JlVG9rZW5zKTtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBGbHV4U3RvcmVHcm91cC5wcm90b3R5cGUucmVsZWFzZSA9IGZ1bmN0aW9uIHJlbGVhc2UoKSB7XG4gICAgdGhpcy5fZGlzcGF0Y2hlci51bnJlZ2lzdGVyKHRoaXMuX2Rpc3BhdGNoVG9rZW4pO1xuICB9O1xuXG4gIHJldHVybiBGbHV4U3RvcmVHcm91cDtcbn0pKCk7XG5cbmZ1bmN0aW9uIF9nZXRVbmlmb3JtRGlzcGF0Y2hlcihzdG9yZXMpIHtcbiAgIShzdG9yZXMgJiYgc3RvcmVzLmxlbmd0aCkgPyBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnTXVzdCBwcm92aWRlIGF0IGxlYXN0IG9uZSBzdG9yZSB0byBGbHV4U3RvcmVHcm91cCcpIDogaW52YXJpYW50KGZhbHNlKSA6IHVuZGVmaW5lZDtcbiAgdmFyIGRpc3BhdGNoZXIgPSBzdG9yZXNbMF0uZ2V0RGlzcGF0Y2hlcigpO1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGZvciAodmFyIF9pdGVyYXRvciA9IHN0b3JlcywgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5KF9pdGVyYXRvciksIF9pID0gMCwgX2l0ZXJhdG9yID0gX2lzQXJyYXkgPyBfaXRlcmF0b3IgOiBfaXRlcmF0b3JbU3ltYm9sLml0ZXJhdG9yXSgpOzspIHtcbiAgICAgIHZhciBfcmVmO1xuXG4gICAgICBpZiAoX2lzQXJyYXkpIHtcbiAgICAgICAgaWYgKF9pID49IF9pdGVyYXRvci5sZW5ndGgpIGJyZWFrO1xuICAgICAgICBfcmVmID0gX2l0ZXJhdG9yW19pKytdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX2kgPSBfaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICBpZiAoX2kuZG9uZSkgYnJlYWs7XG4gICAgICAgIF9yZWYgPSBfaS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0b3JlID0gX3JlZjtcblxuICAgICAgIShzdG9yZS5nZXREaXNwYXRjaGVyKCkgPT09IGRpc3BhdGNoZXIpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0FsbCBzdG9yZXMgaW4gYSBGbHV4U3RvcmVHcm91cCBtdXN0IHVzZSB0aGUgc2FtZSBkaXNwYXRjaGVyJykgOiBpbnZhcmlhbnQoZmFsc2UpIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGlzcGF0Y2hlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBGbHV4U3RvcmVHcm91cDsiLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogQHByb3ZpZGVzTW9kdWxlIGFic3RyYWN0TWV0aG9kXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuZnVuY3Rpb24gYWJzdHJhY3RNZXRob2QoY2xhc3NOYW1lLCBtZXRob2ROYW1lKSB7XG4gICFmYWxzZSA/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdTdWJjbGFzc2VzIG9mICVzIG11c3Qgb3ZlcnJpZGUgJXMoKSB3aXRoIHRoZWlyIG93biBpbXBsZW1lbnRhdGlvbi4nLCBjbGFzc05hbWUsIG1ldGhvZE5hbWUpIDogaW52YXJpYW50KGZhbHNlKSA6IHVuZGVmaW5lZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhYnN0cmFjdE1ldGhvZDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLTIwMTUsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgaW52YXJpYW50XG4gKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qKlxuICogVXNlIGludmFyaWFudCgpIHRvIGFzc2VydCBzdGF0ZSB3aGljaCB5b3VyIHByb2dyYW0gYXNzdW1lcyB0byBiZSB0cnVlLlxuICpcbiAqIFByb3ZpZGUgc3ByaW50Zi1zdHlsZSBmb3JtYXQgKG9ubHkgJXMgaXMgc3VwcG9ydGVkKSBhbmQgYXJndW1lbnRzXG4gKiB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgYnJva2UgYW5kIHdoYXQgeW91IHdlcmVcbiAqIGV4cGVjdGluZy5cbiAqXG4gKiBUaGUgaW52YXJpYW50IG1lc3NhZ2Ugd2lsbCBiZSBzdHJpcHBlZCBpbiBwcm9kdWN0aW9uLCBidXQgdGhlIGludmFyaWFudFxuICogd2lsbCByZW1haW4gdG8gZW5zdXJlIGxvZ2ljIGRvZXMgbm90IGRpZmZlciBpbiBwcm9kdWN0aW9uLlxuICovXG5cbnZhciBpbnZhcmlhbnQgPSBmdW5jdGlvbiAoY29uZGl0aW9uLCBmb3JtYXQsIGEsIGIsIGMsIGQsIGUsIGYpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YXJpYW50IHJlcXVpcmVzIGFuIGVycm9yIG1lc3NhZ2UgYXJndW1lbnQnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHZhciBlcnJvcjtcbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKCdNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCAnICsgJ2ZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBhcmdzID0gW2EsIGIsIGMsIGQsIGUsIGZdO1xuICAgICAgdmFyIGFyZ0luZGV4ID0gMDtcbiAgICAgIGVycm9yID0gbmV3IEVycm9yKCdJbnZhcmlhbnQgVmlvbGF0aW9uOiAnICsgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgZXJyb3IuZnJhbWVzVG9Qb3AgPSAxOyAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IGludmFyaWFudCdzIG93biBmcmFtZVxuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGludmFyaWFudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLTIwMTUsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBAcHJvdmlkZXNNb2R1bGUgc2hhbGxvd0VxdWFsXG4gKiBAdHlwZWNoZWNrc1xuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vKipcbiAqIFBlcmZvcm1zIGVxdWFsaXR5IGJ5IGl0ZXJhdGluZyB0aHJvdWdoIGtleXMgb24gYW4gb2JqZWN0IGFuZCByZXR1cm5pbmcgZmFsc2VcbiAqIHdoZW4gYW55IGtleSBoYXMgdmFsdWVzIHdoaWNoIGFyZSBub3Qgc3RyaWN0bHkgZXF1YWwgYmV0d2VlbiB0aGUgYXJndW1lbnRzLlxuICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIHZhbHVlcyBvZiBhbGwga2V5cyBhcmUgc3RyaWN0bHkgZXF1YWwuXG4gKi9cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChvYmpBID09PSBvYmpCKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAodHlwZW9mIG9iakEgIT09ICdvYmplY3QnIHx8IG9iakEgPT09IG51bGwgfHwgdHlwZW9mIG9iakIgIT09ICdvYmplY3QnIHx8IG9iakIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIga2V5c0EgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgdmFyIGtleXNCID0gT2JqZWN0LmtleXMob2JqQik7XG5cbiAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gVGVzdCBmb3IgQSdzIGtleXMgZGlmZmVyZW50IGZyb20gQi5cbiAgdmFyIGJIYXNPd25Qcm9wZXJ0eSA9IGhhc093blByb3BlcnR5LmJpbmQob2JqQik7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5c0EubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWJIYXNPd25Qcm9wZXJ0eShrZXlzQVtpXSkgfHwgb2JqQVtrZXlzQVtpXV0gIT09IG9iakJba2V5c0FbaV1dKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hhbGxvd0VxdWFsOyIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG5tb2R1bGUuZXhwb3J0cy5Db250YWluZXIgPSByZXF1aXJlKCcuL2xpYi9GbHV4Q29udGFpbmVyJyk7XG5tb2R1bGUuZXhwb3J0cy5NYXBTdG9yZSA9IHJlcXVpcmUoJy4vbGliL0ZsdXhNYXBTdG9yZScpO1xubW9kdWxlLmV4cG9ydHMuTWl4aW4gPSByZXF1aXJlKCcuL2xpYi9GbHV4TWl4aW5MZWdhY3knKTtcbm1vZHVsZS5leHBvcnRzLlJlZHVjZVN0b3JlID0gcmVxdWlyZSgnLi9saWIvRmx1eFJlZHVjZVN0b3JlJyk7XG5tb2R1bGUuZXhwb3J0cy5TdG9yZSA9IHJlcXVpcmUoJy4vbGliL0ZsdXhTdG9yZScpO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNSwgWWFob28hIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUkVBQ1RfU1RBVElDUyA9IHtcbiAgICBjaGlsZENvbnRleHRUeXBlczogdHJ1ZSxcbiAgICBjb250ZXh0VHlwZXM6IHRydWUsXG4gICAgZGVmYXVsdFByb3BzOiB0cnVlLFxuICAgIGRpc3BsYXlOYW1lOiB0cnVlLFxuICAgIGdldERlZmF1bHRQcm9wczogdHJ1ZSxcbiAgICBtaXhpbnM6IHRydWUsXG4gICAgcHJvcFR5cGVzOiB0cnVlLFxuICAgIHR5cGU6IHRydWVcbn07XG5cbnZhciBLTk9XTl9TVEFUSUNTID0ge1xuICAgIG5hbWU6IHRydWUsXG4gICAgbGVuZ3RoOiB0cnVlLFxuICAgIHByb3RvdHlwZTogdHJ1ZSxcbiAgICBjYWxsZXI6IHRydWUsXG4gICAgYXJndW1lbnRzOiB0cnVlLFxuICAgIGFyaXR5OiB0cnVlXG59O1xuXG52YXIgaXNHZXRPd25Qcm9wZXJ0eVN5bWJvbHNBdmFpbGFibGUgPSB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gJ2Z1bmN0aW9uJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBob2lzdE5vblJlYWN0U3RhdGljcyh0YXJnZXRDb21wb25lbnQsIHNvdXJjZUNvbXBvbmVudCwgY3VzdG9tU3RhdGljcykge1xuICAgIGlmICh0eXBlb2Ygc291cmNlQ29tcG9uZW50ICE9PSAnc3RyaW5nJykgeyAvLyBkb24ndCBob2lzdCBvdmVyIHN0cmluZyAoaHRtbCkgY29tcG9uZW50c1xuICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZUNvbXBvbmVudCk7XG5cbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGlzR2V0T3duUHJvcGVydHlTeW1ib2xzQXZhaWxhYmxlKSB7XG4gICAgICAgICAgICBrZXlzID0ga2V5cy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2VDb21wb25lbnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKCFSRUFDVF9TVEFUSUNTW2tleXNbaV1dICYmICFLTk9XTl9TVEFUSUNTW2tleXNbaV1dICYmICghY3VzdG9tU3RhdGljcyB8fCAhY3VzdG9tU3RhdGljc1trZXlzW2ldXSkpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRDb21wb25lbnRba2V5c1tpXV0gPSBzb3VyY2VDb21wb25lbnRba2V5c1tpXV07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXRDb21wb25lbnQ7XG59O1xuIiwiXG4oZnVuY3Rpb24oKSB7XG5cbiAgLy8gQmFzZWxpbmUgc2V0dXBcbiAgLy8gLS0tLS0tLS0tLS0tLS1cblxuICAvLyBFc3RhYmxpc2ggdGhlIHJvb3Qgb2JqZWN0LCBgd2luZG93YCBpbiB0aGUgYnJvd3Nlciwgb3IgYGdsb2JhbGAgb24gdGhlIHNlcnZlci5cbiAgdmFyIHJvb3QgPSB0aGlzO1xuXG4gIC8vIFNhdmUgdGhlIHByZXZpb3VzIHZhbHVlIG9mIHRoZSBgaHVtYW5pemVgIHZhcmlhYmxlLlxuICB2YXIgcHJldmlvdXNIdW1hbml6ZSA9IHJvb3QuaHVtYW5pemU7XG5cbiAgdmFyIGh1bWFuaXplID0ge307XG5cbiAgaWYgKHR5cGVvZiBleHBvcnRzICE9PSAndW5kZWZpbmVkJykge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gaHVtYW5pemU7XG4gICAgfVxuICAgIGV4cG9ydHMuaHVtYW5pemUgPSBodW1hbml6ZTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgICBkZWZpbmUoJ2h1bWFuaXplJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBodW1hbml6ZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByb290Lmh1bWFuaXplID0gaHVtYW5pemU7XG4gIH1cblxuICBodW1hbml6ZS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgcm9vdC5odW1hbml6ZSA9IHByZXZpb3VzSHVtYW5pemU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgaHVtYW5pemUucGFkID0gZnVuY3Rpb24oc3RyLCBjb3VudCwgcGFkQ2hhciwgdHlwZSkge1xuICAgIHN0ciArPSAnJztcbiAgICBpZiAoIXBhZENoYXIpIHtcbiAgICAgIHBhZENoYXIgPSAnICc7XG4gICAgfSBlbHNlIGlmIChwYWRDaGFyLmxlbmd0aCA+IDEpIHtcbiAgICAgIHBhZENoYXIgPSBwYWRDaGFyLmNoYXJBdCgwKTtcbiAgICB9XG4gICAgdHlwZSA9ICh0eXBlID09PSB1bmRlZmluZWQpID8gJ2xlZnQnIDogJ3JpZ2h0JztcblxuICAgIGlmICh0eXBlID09PSAncmlnaHQnKSB7XG4gICAgICB3aGlsZSAoc3RyLmxlbmd0aCA8IGNvdW50KSB7XG4gICAgICAgIHN0ciA9IHN0ciArIHBhZENoYXI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRlZmF1bHQgdG8gbGVmdFxuICAgICAgd2hpbGUgKHN0ci5sZW5ndGggPCBjb3VudCkge1xuICAgICAgICBzdHIgPSBwYWRDaGFyICsgc3RyO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdHI7XG4gIH07XG5cbiAgLy8gZ2V0cyBjdXJyZW50IHVuaXggdGltZVxuICBodW1hbml6ZS50aW1lID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMDtcbiAgfTtcblxuICAvKipcbiAgICogUEhQLWluc3BpcmVkIGRhdGVcbiAgICovXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8qICBqYW4gIGZlYiAgbWFyICBhcHIgIG1heSAganVuICBqdWwgIGF1ZyAgc2VwICBvY3QgIG5vdiAgZGVjICovXG4gIHZhciBkYXlUYWJsZUNvbW1vbiA9IFsgMCwgICAwLCAgMzEsICA1OSwgIDkwLCAxMjAsIDE1MSwgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNCBdO1xuICB2YXIgZGF5VGFibGVMZWFwICAgPSBbIDAsICAgMCwgIDMxLCAgNjAsICA5MSwgMTIxLCAxNTIsIDE4MiwgMjEzLCAyNDQsIDI3NCwgMzA1LCAzMzUgXTtcbiAgLy8gdmFyIG10YWJsZV9jb21tb25bMTNdID0geyAgMCwgIDMxLCAgMjgsICAzMSwgIDMwLCAgMzEsICAzMCwgIDMxLCAgMzEsICAzMCwgIDMxLCAgMzAsICAzMSB9O1xuICAvLyBzdGF0aWMgaW50IG1sX3RhYmxlX2xlYXBbMTNdICAgPSB7ICAwLCAgMzEsICAyOSwgIDMxLCAgMzAsICAzMSwgIDMwLCAgMzEsICAzMSwgIDMwLCAgMzEsICAzMCwgIDMxIH07XG5cblxuICBodW1hbml6ZS5kYXRlID0gZnVuY3Rpb24oZm9ybWF0LCB0aW1lc3RhbXApIHtcbiAgICB2YXIganNkYXRlID0gKCh0aW1lc3RhbXAgPT09IHVuZGVmaW5lZCkgPyBuZXcgRGF0ZSgpIDogLy8gTm90IHByb3ZpZGVkXG4gICAgICAgICAgICAgICAgICAodGltZXN0YW1wIGluc3RhbmNlb2YgRGF0ZSkgPyBuZXcgRGF0ZSh0aW1lc3RhbXApIDogLy8gSlMgRGF0ZSgpXG4gICAgICAgICAgICAgICAgICBuZXcgRGF0ZSh0aW1lc3RhbXAgKiAxMDAwKSAvLyBVTklYIHRpbWVzdGFtcCAoYXV0by1jb252ZXJ0IHRvIGludClcbiAgICAgICAgICAgICAgICAgKTtcblxuICAgIHZhciBmb3JtYXRDaHIgPSAvXFxcXD8oW2Etel0pL2dpO1xuICAgIHZhciBmb3JtYXRDaHJDYiA9IGZ1bmN0aW9uICh0LCBzKSB7XG4gICAgICByZXR1cm4gZlt0XSA/IGZbdF0oKSA6IHM7XG4gICAgfTtcblxuICAgIHZhciBzaG9ydERheVR4dCA9IFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXTtcbiAgICB2YXIgbW9udGhUeHQgPSBbJ0phbnVhcnknLCAnRmVicnVhcnknLCAnTWFyY2gnLCAnQXByaWwnLCAnTWF5JywgJ0p1bmUnLCAnSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInXTtcblxuICAgIHZhciBmID0ge1xuICAgICAgLyogRGF5ICovXG4gICAgICAvLyBEYXkgb2YgbW9udGggdy9sZWFkaW5nIDA7IDAxLi4zMVxuICAgICAgZDogZnVuY3Rpb24gKCkgeyByZXR1cm4gaHVtYW5pemUucGFkKGYuaigpLCAyLCAnMCcpOyB9LFxuXG4gICAgICAvLyBTaG9ydGhhbmQgZGF5IG5hbWU7IE1vbi4uU3VuXG4gICAgICBEOiBmdW5jdGlvbiAoKSB7IHJldHVybiBmLmwoKS5zbGljZSgwLCAzKTsgfSxcblxuICAgICAgLy8gRGF5IG9mIG1vbnRoOyAxLi4zMVxuICAgICAgajogZnVuY3Rpb24gKCkgeyByZXR1cm4ganNkYXRlLmdldERhdGUoKTsgfSxcblxuICAgICAgLy8gRnVsbCBkYXkgbmFtZTsgTW9uZGF5Li5TdW5kYXlcbiAgICAgIGw6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNob3J0RGF5VHh0W2YudygpXTsgfSxcblxuICAgICAgLy8gSVNPLTg2MDEgZGF5IG9mIHdlZWs7IDFbTW9uXS4uN1tTdW5dXG4gICAgICBOOiBmdW5jdGlvbiAoKSB7IHJldHVybiBmLncoKSB8fCA3OyB9LFxuXG4gICAgICAvLyBPcmRpbmFsIHN1ZmZpeCBmb3IgZGF5IG9mIG1vbnRoOyBzdCwgbmQsIHJkLCB0aFxuICAgICAgUzogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaiA9IGYuaigpO1xuICAgICAgICByZXR1cm4gaiA+IDQgJiYgaiA8IDIxID8gJ3RoJyA6IHsxOiAnc3QnLCAyOiAnbmQnLCAzOiAncmQnfVtqICUgMTBdIHx8ICd0aCc7XG4gICAgICB9LFxuXG4gICAgICAvLyBEYXkgb2Ygd2VlazsgMFtTdW5dLi42W1NhdF1cbiAgICAgIHc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGpzZGF0ZS5nZXREYXkoKTsgfSxcblxuICAgICAgLy8gRGF5IG9mIHllYXI7IDAuLjM2NVxuICAgICAgejogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gKGYuTCgpID8gZGF5VGFibGVMZWFwW2YubigpXSA6IGRheVRhYmxlQ29tbW9uW2YubigpXSkgKyBmLmooKSAtIDE7XG4gICAgICB9LFxuXG4gICAgICAvKiBXZWVrICovXG4gICAgICAvLyBJU08tODYwMSB3ZWVrIG51bWJlclxuICAgICAgVzogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBkYXlzIGJldHdlZW4gbWlkd2VlayBvZiB0aGlzIHdlZWsgYW5kIGphbiA0XG4gICAgICAgIC8vIChmLnooKSAtIGYuTigpICsgMSArIDMuNSkgLSAzXG4gICAgICAgIHZhciBtaWRXZWVrRGF5c0Zyb21KYW40ID0gZi56KCkgLSBmLk4oKSArIDEuNTtcbiAgICAgICAgLy8gMSArIG51bWJlciBvZiB3ZWVrcyArIHJvdW5kZWQgd2Vla1xuICAgICAgICByZXR1cm4gaHVtYW5pemUucGFkKDEgKyBNYXRoLmZsb29yKE1hdGguYWJzKG1pZFdlZWtEYXlzRnJvbUphbjQpIC8gNykgKyAobWlkV2Vla0RheXNGcm9tSmFuNCAlIDcgPiAzLjUgPyAxIDogMCksIDIsICcwJyk7XG4gICAgICB9LFxuXG4gICAgICAvKiBNb250aCAqL1xuICAgICAgLy8gRnVsbCBtb250aCBuYW1lOyBKYW51YXJ5Li5EZWNlbWJlclxuICAgICAgRjogZnVuY3Rpb24gKCkgeyByZXR1cm4gbW9udGhUeHRbanNkYXRlLmdldE1vbnRoKCldOyB9LFxuXG4gICAgICAvLyBNb250aCB3L2xlYWRpbmcgMDsgMDEuLjEyXG4gICAgICBtOiBmdW5jdGlvbiAoKSB7IHJldHVybiBodW1hbml6ZS5wYWQoZi5uKCksIDIsICcwJyk7IH0sXG5cbiAgICAgIC8vIFNob3J0aGFuZCBtb250aCBuYW1lOyBKYW4uLkRlY1xuICAgICAgTTogZnVuY3Rpb24gKCkgeyByZXR1cm4gZi5GKCkuc2xpY2UoMCwgMyk7IH0sXG5cbiAgICAgIC8vIE1vbnRoOyAxLi4xMlxuICAgICAgbjogZnVuY3Rpb24gKCkgeyByZXR1cm4ganNkYXRlLmdldE1vbnRoKCkgKyAxOyB9LFxuXG4gICAgICAvLyBEYXlzIGluIG1vbnRoOyAyOC4uMzFcbiAgICAgIHQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIChuZXcgRGF0ZShmLlkoKSwgZi5uKCksIDApKS5nZXREYXRlKCk7IH0sXG5cbiAgICAgIC8qIFllYXIgKi9cbiAgICAgIC8vIElzIGxlYXAgeWVhcj87IDAgb3IgMVxuICAgICAgTDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IERhdGUoZi5ZKCksIDEsIDI5KS5nZXRNb250aCgpID09PSAxID8gMSA6IDA7IH0sXG5cbiAgICAgIC8vIElTTy04NjAxIHllYXJcbiAgICAgIG86IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIG4gPSBmLm4oKTtcbiAgICAgICAgdmFyIFcgPSBmLlcoKTtcbiAgICAgICAgcmV0dXJuIGYuWSgpICsgKG4gPT09IDEyICYmIFcgPCA5ID8gLTEgOiBuID09PSAxICYmIFcgPiA5KTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIEZ1bGwgeWVhcjsgZS5nLiAxOTgwLi4yMDEwXG4gICAgICBZOiBmdW5jdGlvbiAoKSB7IHJldHVybiBqc2RhdGUuZ2V0RnVsbFllYXIoKTsgfSxcblxuICAgICAgLy8gTGFzdCB0d28gZGlnaXRzIG9mIHllYXI7IDAwLi45OVxuICAgICAgeTogZnVuY3Rpb24gKCkgeyByZXR1cm4gKFN0cmluZyhmLlkoKSkpLnNsaWNlKC0yKTsgfSxcblxuICAgICAgLyogVGltZSAqL1xuICAgICAgLy8gYW0gb3IgcG1cbiAgICAgIGE6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGpzZGF0ZS5nZXRIb3VycygpID4gMTEgPyAncG0nIDogJ2FtJzsgfSxcblxuICAgICAgLy8gQU0gb3IgUE1cbiAgICAgIEE6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGYuYSgpLnRvVXBwZXJDYXNlKCk7IH0sXG5cbiAgICAgIC8vIFN3YXRjaCBJbnRlcm5ldCB0aW1lOyAwMDAuLjk5OVxuICAgICAgQjogZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgdW5peFRpbWUgPSBqc2RhdGUuZ2V0VGltZSgpIC8gMTAwMDtcbiAgICAgICAgdmFyIHNlY29uZHNQYXNzZWRUb2RheSA9IHVuaXhUaW1lICUgODY0MDAgKyAzNjAwOyAvLyBzaW5jZSBpdCdzIGJhc2VkIG9mZiBvZiBVVEMrMVxuICAgICAgICBpZiAoc2Vjb25kc1Bhc3NlZFRvZGF5IDwgMCkgeyBzZWNvbmRzUGFzc2VkVG9kYXkgKz0gODY0MDA7IH1cbiAgICAgICAgdmFyIGJlYXRzID0gKChzZWNvbmRzUGFzc2VkVG9kYXkpIC8gODYuNCkgJSAxMDAwO1xuICAgICAgICBpZiAodW5peFRpbWUgPCAwKSB7XG4gICAgICAgICAgcmV0dXJuIE1hdGguY2VpbChiZWF0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoYmVhdHMpO1xuICAgICAgfSxcblxuICAgICAgLy8gMTItSG91cnM7IDEuLjEyXG4gICAgICBnOiBmdW5jdGlvbiAoKSB7IHJldHVybiBmLkcoKSAlIDEyIHx8IDEyOyB9LFxuXG4gICAgICAvLyAyNC1Ib3VyczsgMC4uMjNcbiAgICAgIEc6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGpzZGF0ZS5nZXRIb3VycygpOyB9LFxuXG4gICAgICAvLyAxMi1Ib3VycyB3L2xlYWRpbmcgMDsgMDEuLjEyXG4gICAgICBoOiBmdW5jdGlvbiAoKSB7IHJldHVybiBodW1hbml6ZS5wYWQoZi5nKCksIDIsICcwJyk7IH0sXG5cbiAgICAgIC8vIDI0LUhvdXJzIHcvbGVhZGluZyAwOyAwMC4uMjNcbiAgICAgIEg6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGh1bWFuaXplLnBhZChmLkcoKSwgMiwgJzAnKTsgfSxcblxuICAgICAgLy8gTWludXRlcyB3L2xlYWRpbmcgMDsgMDAuLjU5XG4gICAgICBpOiBmdW5jdGlvbiAoKSB7IHJldHVybiBodW1hbml6ZS5wYWQoanNkYXRlLmdldE1pbnV0ZXMoKSwgMiwgJzAnKTsgfSxcblxuICAgICAgLy8gU2Vjb25kcyB3L2xlYWRpbmcgMDsgMDAuLjU5XG4gICAgICBzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBodW1hbml6ZS5wYWQoanNkYXRlLmdldFNlY29uZHMoKSwgMiwgJzAnKTsgfSxcblxuICAgICAgLy8gTWljcm9zZWNvbmRzOyAwMDAwMDAtOTk5MDAwXG4gICAgICB1OiBmdW5jdGlvbiAoKSB7IHJldHVybiBodW1hbml6ZS5wYWQoanNkYXRlLmdldE1pbGxpc2Vjb25kcygpICogMTAwMCwgNiwgJzAnKTsgfSxcblxuICAgICAgLy8gV2hldGhlciBvciBub3QgdGhlIGRhdGUgaXMgaW4gZGF5bGlnaHQgc2F2aW5ncyB0aW1lXG4gICAgICAvKlxuICAgICAgSTogZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBDb21wYXJlcyBKYW4gMSBtaW51cyBKYW4gMSBVVEMgdG8gSnVsIDEgbWludXMgSnVsIDEgVVRDLlxuICAgICAgICAvLyBJZiB0aGV5IGFyZSBub3QgZXF1YWwsIHRoZW4gRFNUIGlzIG9ic2VydmVkLlxuICAgICAgICB2YXIgWSA9IGYuWSgpO1xuICAgICAgICByZXR1cm4gMCArICgobmV3IERhdGUoWSwgMCkgLSBEYXRlLlVUQyhZLCAwKSkgIT09IChuZXcgRGF0ZShZLCA2KSAtIERhdGUuVVRDKFksIDYpKSk7XG4gICAgICB9LFxuICAgICAgKi9cblxuICAgICAgLy8gRGlmZmVyZW5jZSB0byBHTVQgaW4gaG91ciBmb3JtYXQ7IGUuZy4gKzAyMDBcbiAgICAgIE86IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHR6byA9IGpzZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuICAgICAgICB2YXIgdHpvTnVtID0gTWF0aC5hYnModHpvKTtcbiAgICAgICAgcmV0dXJuICh0em8gPiAwID8gJy0nIDogJysnKSArIGh1bWFuaXplLnBhZChNYXRoLmZsb29yKHR6b051bSAvIDYwKSAqIDEwMCArIHR6b051bSAlIDYwLCA0LCAnMCcpO1xuICAgICAgfSxcblxuICAgICAgLy8gRGlmZmVyZW5jZSB0byBHTVQgdy9jb2xvbjsgZS5nLiArMDI6MDBcbiAgICAgIFA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIE8gPSBmLk8oKTtcbiAgICAgICAgcmV0dXJuIChPLnN1YnN0cigwLCAzKSArICc6JyArIE8uc3Vic3RyKDMsIDIpKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIFRpbWV6b25lIG9mZnNldCBpbiBzZWNvbmRzICgtNDMyMDAuLjUwNDAwKVxuICAgICAgWjogZnVuY3Rpb24gKCkgeyByZXR1cm4gLWpzZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpICogNjA7IH0sXG5cbiAgICAgIC8vIEZ1bGwgRGF0ZS9UaW1lLCBJU08tODYwMSBkYXRlXG4gICAgICBjOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnWS1tLWRcXFxcVEg6aTpzUCcucmVwbGFjZShmb3JtYXRDaHIsIGZvcm1hdENockNiKTsgfSxcblxuICAgICAgLy8gUkZDIDI4MjJcbiAgICAgIHI6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdELCBkIE0gWSBIOmk6cyBPJy5yZXBsYWNlKGZvcm1hdENociwgZm9ybWF0Q2hyQ2IpOyB9LFxuXG4gICAgICAvLyBTZWNvbmRzIHNpbmNlIFVOSVggZXBvY2hcbiAgICAgIFU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGpzZGF0ZS5nZXRUaW1lKCkgLyAxMDAwIHx8IDA7IH1cbiAgICB9OyAgICBcblxuICAgIHJldHVybiBmb3JtYXQucmVwbGFjZShmb3JtYXRDaHIsIGZvcm1hdENockNiKTtcbiAgfTtcblxuXG4gIC8qKlxuICAgKiBmb3JtYXQgbnVtYmVyIGJ5IGFkZGluZyB0aG91c2FuZHMgc2VwYXJhdGVycyBhbmQgc2lnbmlmaWNhbnQgZGlnaXRzIHdoaWxlIHJvdW5kaW5nXG4gICAqL1xuICBodW1hbml6ZS5udW1iZXJGb3JtYXQgPSBmdW5jdGlvbihudW1iZXIsIGRlY2ltYWxzLCBkZWNQb2ludCwgdGhvdXNhbmRzU2VwKSB7XG4gICAgZGVjaW1hbHMgPSBpc05hTihkZWNpbWFscykgPyAyIDogTWF0aC5hYnMoZGVjaW1hbHMpO1xuICAgIGRlY1BvaW50ID0gKGRlY1BvaW50ID09PSB1bmRlZmluZWQpID8gJy4nIDogZGVjUG9pbnQ7XG4gICAgdGhvdXNhbmRzU2VwID0gKHRob3VzYW5kc1NlcCA9PT0gdW5kZWZpbmVkKSA/ICcsJyA6IHRob3VzYW5kc1NlcDtcblxuICAgIHZhciBzaWduID0gbnVtYmVyIDwgMCA/ICctJyA6ICcnO1xuICAgIG51bWJlciA9IE1hdGguYWJzKCtudW1iZXIgfHwgMCk7XG5cbiAgICB2YXIgaW50UGFydCA9IHBhcnNlSW50KG51bWJlci50b0ZpeGVkKGRlY2ltYWxzKSwgMTApICsgJyc7XG4gICAgdmFyIGogPSBpbnRQYXJ0Lmxlbmd0aCA+IDMgPyBpbnRQYXJ0Lmxlbmd0aCAlIDMgOiAwO1xuXG4gICAgcmV0dXJuIHNpZ24gKyAoaiA/IGludFBhcnQuc3Vic3RyKDAsIGopICsgdGhvdXNhbmRzU2VwIDogJycpICsgaW50UGFydC5zdWJzdHIoaikucmVwbGFjZSgvKFxcZHszfSkoPz1cXGQpL2csICckMScgKyB0aG91c2FuZHNTZXApICsgKGRlY2ltYWxzID8gZGVjUG9pbnQgKyBNYXRoLmFicyhudW1iZXIgLSBpbnRQYXJ0KS50b0ZpeGVkKGRlY2ltYWxzKS5zbGljZSgyKSA6ICcnKTtcbiAgfTtcblxuXG4gIC8qKlxuICAgKiBGb3IgZGF0ZXMgdGhhdCBhcmUgdGhlIGN1cnJlbnQgZGF5IG9yIHdpdGhpbiBvbmUgZGF5LCByZXR1cm4gJ3RvZGF5JywgJ3RvbW9ycm93JyBvciAneWVzdGVyZGF5JywgYXMgYXBwcm9wcmlhdGUuXG4gICAqIE90aGVyd2lzZSwgZm9ybWF0IHRoZSBkYXRlIHVzaW5nIHRoZSBwYXNzZWQgaW4gZm9ybWF0IHN0cmluZy5cbiAgICpcbiAgICogRXhhbXBsZXMgKHdoZW4gJ3RvZGF5JyBpcyAxNyBGZWIgMjAwNyk6XG4gICAqIDE2IEZlYiAyMDA3IGJlY29tZXMgeWVzdGVyZGF5LlxuICAgKiAxNyBGZWIgMjAwNyBiZWNvbWVzIHRvZGF5LlxuICAgKiAxOCBGZWIgMjAwNyBiZWNvbWVzIHRvbW9ycm93LlxuICAgKiBBbnkgb3RoZXIgZGF5IGlzIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gZ2l2ZW4gYXJndW1lbnQgb3IgdGhlIERBVEVfRk9STUFUIHNldHRpbmcgaWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4uXG4gICAqL1xuICBodW1hbml6ZS5uYXR1cmFsRGF5ID0gZnVuY3Rpb24odGltZXN0YW1wLCBmb3JtYXQpIHtcbiAgICB0aW1lc3RhbXAgPSAodGltZXN0YW1wID09PSB1bmRlZmluZWQpID8gaHVtYW5pemUudGltZSgpIDogdGltZXN0YW1wO1xuICAgIGZvcm1hdCA9IChmb3JtYXQgPT09IHVuZGVmaW5lZCkgPyAnWS1tLWQnIDogZm9ybWF0O1xuXG4gICAgdmFyIG9uZURheSA9IDg2NDAwO1xuICAgIHZhciBkID0gbmV3IERhdGUoKTtcbiAgICB2YXIgdG9kYXkgPSAobmV3IERhdGUoZC5nZXRGdWxsWWVhcigpLCBkLmdldE1vbnRoKCksIGQuZ2V0RGF0ZSgpKSkuZ2V0VGltZSgpIC8gMTAwMDtcblxuICAgIGlmICh0aW1lc3RhbXAgPCB0b2RheSAmJiB0aW1lc3RhbXAgPj0gdG9kYXkgLSBvbmVEYXkpIHtcbiAgICAgIHJldHVybiAneWVzdGVyZGF5JztcbiAgICB9IGVsc2UgaWYgKHRpbWVzdGFtcCA+PSB0b2RheSAmJiB0aW1lc3RhbXAgPCB0b2RheSArIG9uZURheSkge1xuICAgICAgcmV0dXJuICd0b2RheSc7XG4gICAgfSBlbHNlIGlmICh0aW1lc3RhbXAgPj0gdG9kYXkgKyBvbmVEYXkgJiYgdGltZXN0YW1wIDwgdG9kYXkgKyAyICogb25lRGF5KSB7XG4gICAgICByZXR1cm4gJ3RvbW9ycm93JztcbiAgICB9XG5cbiAgICByZXR1cm4gaHVtYW5pemUuZGF0ZShmb3JtYXQsIHRpbWVzdGFtcCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIHJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGhvdyBtYW55IHNlY29uZHMsIG1pbnV0ZXMgb3IgaG91cnMgYWdvIGl0IHdhcyBvciB3aWxsIGJlIGluIHRoZSBmdXR1cmVcbiAgICogV2lsbCBhbHdheXMgcmV0dXJuIGEgcmVsYXRpdmUgdGltZSwgbW9zdCBncmFudWxhciBvZiBzZWNvbmRzIHRvIGxlYXN0IGdyYW51bGFyIG9mIHllYXJzLiBTZWUgdW5pdCB0ZXN0cyBmb3IgbW9yZSBkZXRhaWxzXG4gICAqL1xuICBodW1hbml6ZS5yZWxhdGl2ZVRpbWUgPSBmdW5jdGlvbih0aW1lc3RhbXApIHtcbiAgICB0aW1lc3RhbXAgPSAodGltZXN0YW1wID09PSB1bmRlZmluZWQpID8gaHVtYW5pemUudGltZSgpIDogdGltZXN0YW1wO1xuXG4gICAgdmFyIGN1cnJUaW1lID0gaHVtYW5pemUudGltZSgpO1xuICAgIHZhciB0aW1lRGlmZiA9IGN1cnJUaW1lIC0gdGltZXN0YW1wO1xuXG4gICAgLy8gd2l0aGluIDIgc2Vjb25kc1xuICAgIGlmICh0aW1lRGlmZiA8IDIgJiYgdGltZURpZmYgPiAtMikge1xuICAgICAgcmV0dXJuICh0aW1lRGlmZiA+PSAwID8gJ2p1c3QgJyA6ICcnKSArICdub3cnO1xuICAgIH1cblxuICAgIC8vIHdpdGhpbiBhIG1pbnV0ZVxuICAgIGlmICh0aW1lRGlmZiA8IDYwICYmIHRpbWVEaWZmID4gLTYwKSB7XG4gICAgICByZXR1cm4gKHRpbWVEaWZmID49IDAgPyBNYXRoLmZsb29yKHRpbWVEaWZmKSArICcgc2Vjb25kcyBhZ28nIDogJ2luICcgKyBNYXRoLmZsb29yKC10aW1lRGlmZikgKyAnIHNlY29uZHMnKTtcbiAgICB9XG5cbiAgICAvLyB3aXRoaW4gMiBtaW51dGVzXG4gICAgaWYgKHRpbWVEaWZmIDwgMTIwICYmIHRpbWVEaWZmID4gLTEyMCkge1xuICAgICAgcmV0dXJuICh0aW1lRGlmZiA+PSAwID8gJ2Fib3V0IGEgbWludXRlIGFnbycgOiAnaW4gYWJvdXQgYSBtaW51dGUnKTtcbiAgICB9XG5cbiAgICAvLyB3aXRoaW4gYW4gaG91clxuICAgIGlmICh0aW1lRGlmZiA8IDM2MDAgJiYgdGltZURpZmYgPiAtMzYwMCkge1xuICAgICAgcmV0dXJuICh0aW1lRGlmZiA+PSAwID8gTWF0aC5mbG9vcih0aW1lRGlmZiAvIDYwKSArICcgbWludXRlcyBhZ28nIDogJ2luICcgKyBNYXRoLmZsb29yKC10aW1lRGlmZiAvIDYwKSArICcgbWludXRlcycpO1xuICAgIH1cblxuICAgIC8vIHdpdGhpbiAyIGhvdXJzXG4gICAgaWYgKHRpbWVEaWZmIDwgNzIwMCAmJiB0aW1lRGlmZiA+IC03MjAwKSB7XG4gICAgICByZXR1cm4gKHRpbWVEaWZmID49IDAgPyAnYWJvdXQgYW4gaG91ciBhZ28nIDogJ2luIGFib3V0IGFuIGhvdXInKTtcbiAgICB9XG5cbiAgICAvLyB3aXRoaW4gMjQgaG91cnNcbiAgICBpZiAodGltZURpZmYgPCA4NjQwMCAmJiB0aW1lRGlmZiA+IC04NjQwMCkge1xuICAgICAgcmV0dXJuICh0aW1lRGlmZiA+PSAwID8gTWF0aC5mbG9vcih0aW1lRGlmZiAvIDM2MDApICsgJyBob3VycyBhZ28nIDogJ2luICcgKyBNYXRoLmZsb29yKC10aW1lRGlmZiAvIDM2MDApICsgJyBob3VycycpO1xuICAgIH1cblxuICAgIC8vIHdpdGhpbiAyIGRheXNcbiAgICB2YXIgZGF5czIgPSAyICogODY0MDA7XG4gICAgaWYgKHRpbWVEaWZmIDwgZGF5czIgJiYgdGltZURpZmYgPiAtZGF5czIpIHtcbiAgICAgIHJldHVybiAodGltZURpZmYgPj0gMCA/ICcxIGRheSBhZ28nIDogJ2luIDEgZGF5Jyk7XG4gICAgfVxuXG4gICAgLy8gd2l0aGluIDI5IGRheXNcbiAgICB2YXIgZGF5czI5ID0gMjkgKiA4NjQwMDtcbiAgICBpZiAodGltZURpZmYgPCBkYXlzMjkgJiYgdGltZURpZmYgPiAtZGF5czI5KSB7XG4gICAgICByZXR1cm4gKHRpbWVEaWZmID49IDAgPyBNYXRoLmZsb29yKHRpbWVEaWZmIC8gODY0MDApICsgJyBkYXlzIGFnbycgOiAnaW4gJyArIE1hdGguZmxvb3IoLXRpbWVEaWZmIC8gODY0MDApICsgJyBkYXlzJyk7XG4gICAgfVxuXG4gICAgLy8gd2l0aGluIDYwIGRheXNcbiAgICB2YXIgZGF5czYwID0gNjAgKiA4NjQwMDtcbiAgICBpZiAodGltZURpZmYgPCBkYXlzNjAgJiYgdGltZURpZmYgPiAtZGF5czYwKSB7XG4gICAgICByZXR1cm4gKHRpbWVEaWZmID49IDAgPyAnYWJvdXQgYSBtb250aCBhZ28nIDogJ2luIGFib3V0IGEgbW9udGgnKTtcbiAgICB9XG5cbiAgICB2YXIgY3VyclRpbWVZZWFycyA9IHBhcnNlSW50KGh1bWFuaXplLmRhdGUoJ1knLCBjdXJyVGltZSksIDEwKTtcbiAgICB2YXIgdGltZXN0YW1wWWVhcnMgPSBwYXJzZUludChodW1hbml6ZS5kYXRlKCdZJywgdGltZXN0YW1wKSwgMTApO1xuICAgIHZhciBjdXJyVGltZU1vbnRocyA9IGN1cnJUaW1lWWVhcnMgKiAxMiArIHBhcnNlSW50KGh1bWFuaXplLmRhdGUoJ24nLCBjdXJyVGltZSksIDEwKTtcbiAgICB2YXIgdGltZXN0YW1wTW9udGhzID0gdGltZXN0YW1wWWVhcnMgKiAxMiArIHBhcnNlSW50KGh1bWFuaXplLmRhdGUoJ24nLCB0aW1lc3RhbXApLCAxMCk7XG5cbiAgICAvLyB3aXRoaW4gYSB5ZWFyXG4gICAgdmFyIG1vbnRoRGlmZiA9IGN1cnJUaW1lTW9udGhzIC0gdGltZXN0YW1wTW9udGhzO1xuICAgIGlmIChtb250aERpZmYgPCAxMiAmJiBtb250aERpZmYgPiAtMTIpIHtcbiAgICAgIHJldHVybiAobW9udGhEaWZmID49IDAgPyBtb250aERpZmYgKyAnIG1vbnRocyBhZ28nIDogJ2luICcgKyAoLW1vbnRoRGlmZikgKyAnIG1vbnRocycpO1xuICAgIH1cblxuICAgIHZhciB5ZWFyRGlmZiA9IGN1cnJUaW1lWWVhcnMgLSB0aW1lc3RhbXBZZWFycztcbiAgICBpZiAoeWVhckRpZmYgPCAyICYmIHllYXJEaWZmID4gLTIpIHtcbiAgICAgIHJldHVybiAoeWVhckRpZmYgPj0gMCA/ICdhIHllYXIgYWdvJyA6ICdpbiBhIHllYXInKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKHllYXJEaWZmID49IDAgPyB5ZWFyRGlmZiArICcgeWVhcnMgYWdvJyA6ICdpbiAnICsgKC15ZWFyRGlmZikgKyAnIHllYXJzJyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGFuIGludGVnZXIgdG8gaXRzIG9yZGluYWwgYXMgYSBzdHJpbmcuXG4gICAqXG4gICAqIDEgYmVjb21lcyAxc3RcbiAgICogMiBiZWNvbWVzIDJuZFxuICAgKiAzIGJlY29tZXMgM3JkIGV0Y1xuICAgKi9cbiAgaHVtYW5pemUub3JkaW5hbCA9IGZ1bmN0aW9uKG51bWJlcikge1xuICAgIG51bWJlciA9IHBhcnNlSW50KG51bWJlciwgMTApO1xuICAgIG51bWJlciA9IGlzTmFOKG51bWJlcikgPyAwIDogbnVtYmVyO1xuICAgIHZhciBzaWduID0gbnVtYmVyIDwgMCA/ICctJyA6ICcnO1xuICAgIG51bWJlciA9IE1hdGguYWJzKG51bWJlcik7XG4gICAgdmFyIHRlbnMgPSBudW1iZXIgJSAxMDA7XG5cbiAgICByZXR1cm4gc2lnbiArIG51bWJlciArICh0ZW5zID4gNCAmJiB0ZW5zIDwgMjEgPyAndGgnIDogezE6ICdzdCcsIDI6ICduZCcsIDM6ICdyZCd9W251bWJlciAlIDEwXSB8fCAndGgnKTtcbiAgfTtcblxuICAvKipcbiAgICogRm9ybWF0cyB0aGUgdmFsdWUgbGlrZSBhICdodW1hbi1yZWFkYWJsZScgZmlsZSBzaXplIChpLmUuICcxMyBLQicsICc0LjEgTUInLCAnMTAyIGJ5dGVzJywgZXRjKS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGU6XG4gICAqIElmIHZhbHVlIGlzIDEyMzQ1Njc4OSwgdGhlIG91dHB1dCB3b3VsZCBiZSAxMTcuNyBNQi5cbiAgICovXG4gIGh1bWFuaXplLmZpbGVzaXplID0gZnVuY3Rpb24oZmlsZXNpemUsIGtpbG8sIGRlY2ltYWxzLCBkZWNQb2ludCwgdGhvdXNhbmRzU2VwLCBzdWZmaXhTZXApIHtcbiAgICBraWxvID0gKGtpbG8gPT09IHVuZGVmaW5lZCkgPyAxMDI0IDoga2lsbztcbiAgICBpZiAoZmlsZXNpemUgPD0gMCkgeyByZXR1cm4gJzAgYnl0ZXMnOyB9XG4gICAgaWYgKGZpbGVzaXplIDwga2lsbyAmJiBkZWNpbWFscyA9PT0gdW5kZWZpbmVkKSB7IGRlY2ltYWxzID0gMDsgfVxuICAgIGlmIChzdWZmaXhTZXAgPT09IHVuZGVmaW5lZCkgeyBzdWZmaXhTZXAgPSAnICc7IH1cbiAgICByZXR1cm4gaHVtYW5pemUuaW50d29yZChmaWxlc2l6ZSwgWydieXRlcycsICdLQicsICdNQicsICdHQicsICdUQicsICdQQiddLCBraWxvLCBkZWNpbWFscywgZGVjUG9pbnQsIHRob3VzYW5kc1NlcCwgc3VmZml4U2VwKTtcbiAgfTtcblxuICAvKipcbiAgICogRm9ybWF0cyB0aGUgdmFsdWUgbGlrZSBhICdodW1hbi1yZWFkYWJsZScgbnVtYmVyIChpLmUuICcxMyBLJywgJzQuMSBNJywgJzEwMicsIGV0YykuXG4gICAqXG4gICAqIEZvciBleGFtcGxlOlxuICAgKiBJZiB2YWx1ZSBpcyAxMjM0NTY3ODksIHRoZSBvdXRwdXQgd291bGQgYmUgMTE3LjcgTS5cbiAgICovXG4gIGh1bWFuaXplLmludHdvcmQgPSBmdW5jdGlvbihudW1iZXIsIHVuaXRzLCBraWxvLCBkZWNpbWFscywgZGVjUG9pbnQsIHRob3VzYW5kc1NlcCwgc3VmZml4U2VwKSB7XG4gICAgdmFyIGh1bWFuaXplZCwgdW5pdDtcblxuICAgIHVuaXRzID0gdW5pdHMgfHwgWycnLCAnSycsICdNJywgJ0InLCAnVCddLFxuICAgIHVuaXQgPSB1bml0cy5sZW5ndGggLSAxLFxuICAgIGtpbG8gPSBraWxvIHx8IDEwMDAsXG4gICAgZGVjaW1hbHMgPSBpc05hTihkZWNpbWFscykgPyAyIDogTWF0aC5hYnMoZGVjaW1hbHMpLFxuICAgIGRlY1BvaW50ID0gZGVjUG9pbnQgfHwgJy4nLFxuICAgIHRob3VzYW5kc1NlcCA9IHRob3VzYW5kc1NlcCB8fCAnLCcsXG4gICAgc3VmZml4U2VwID0gc3VmZml4U2VwIHx8ICcnO1xuXG4gICAgZm9yICh2YXIgaT0wOyBpIDwgdW5pdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChudW1iZXIgPCBNYXRoLnBvdyhraWxvLCBpKzEpKSB7XG4gICAgICAgIHVuaXQgPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaHVtYW5pemVkID0gbnVtYmVyIC8gTWF0aC5wb3coa2lsbywgdW5pdCk7XG5cbiAgICB2YXIgc3VmZml4ID0gdW5pdHNbdW5pdF0gPyBzdWZmaXhTZXAgKyB1bml0c1t1bml0XSA6ICcnO1xuICAgIHJldHVybiBodW1hbml6ZS5udW1iZXJGb3JtYXQoaHVtYW5pemVkLCBkZWNpbWFscywgZGVjUG9pbnQsIHRob3VzYW5kc1NlcCkgKyBzdWZmaXg7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGxpbmUgYnJlYWtzIGluIHBsYWluIHRleHQgd2l0aCBhcHByb3ByaWF0ZSBIVE1MXG4gICAqIEEgc2luZ2xlIG5ld2xpbmUgYmVjb21lcyBhbiBIVE1MIGxpbmUgYnJlYWsgKDxiciAvPikgYW5kIGEgbmV3IGxpbmUgZm9sbG93ZWQgYnkgYSBibGFuayBsaW5lIGJlY29tZXMgYSBwYXJhZ3JhcGggYnJlYWsgKDwvcD4pLlxuICAgKiBcbiAgICogRm9yIGV4YW1wbGU6XG4gICAqIElmIHZhbHVlIGlzIEpvZWxcXG5pcyBhXFxuXFxuc2x1ZywgdGhlIG91dHB1dCB3aWxsIGJlIDxwPkpvZWw8YnIgLz5pcyBhPC9wPjxwPnNsdWc8L3A+XG4gICAqL1xuICBodW1hbml6ZS5saW5lYnJlYWtzID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgLy8gcmVtb3ZlIGJlZ2lubmluZyBhbmQgZW5kaW5nIG5ld2xpbmVzXG4gICAgc3RyID0gc3RyLnJlcGxhY2UoL14oW1xcbnxcXHJdKikvLCAnJyk7XG4gICAgc3RyID0gc3RyLnJlcGxhY2UoLyhbXFxufFxccl0qKSQvLCAnJyk7XG5cbiAgICAvLyBub3JtYWxpemUgYWxsIHRvIFxcblxuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC8oXFxyXFxufFxcbnxcXHIpL2csIFwiXFxuXCIpO1xuXG4gICAgLy8gYW55IGNvbnNlY3V0aXZlIG5ldyBsaW5lcyBtb3JlIHRoYW4gMiBnZXRzIHR1cm5lZCBpbnRvIHAgdGFnc1xuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC8oXFxuezIsfSkvZywgJzwvcD48cD4nKTtcblxuICAgIC8vIGFueSB0aGF0IGFyZSBzaW5nbGV0b25zIGdldCB0dXJuZWQgaW50byBiclxuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXG4vZywgJzxiciAvPicpO1xuICAgIHJldHVybiAnPHA+JyArIHN0ciArICc8L3A+JztcbiAgfTtcblxuICAvKipcbiAgICogQ29udmVydHMgYWxsIG5ld2xpbmVzIGluIGEgcGllY2Ugb2YgcGxhaW4gdGV4dCB0byBIVE1MIGxpbmUgYnJlYWtzICg8YnIgLz4pLlxuICAgKi9cbiAgaHVtYW5pemUubmwyYnIgPSBmdW5jdGlvbihzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyhcXHJcXG58XFxufFxccikvZywgJzxiciAvPicpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUcnVuY2F0ZXMgYSBzdHJpbmcgaWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY2hhcmFjdGVycy5cbiAgICogVHJ1bmNhdGVkIHN0cmluZ3Mgd2lsbCBlbmQgd2l0aCBhIHRyYW5zbGF0YWJsZSBlbGxpcHNpcyBzZXF1ZW5jZSAoJ+KApicpLlxuICAgKi9cbiAgaHVtYW5pemUudHJ1bmNhdGVjaGFycyA9IGZ1bmN0aW9uKHN0cmluZywgbGVuZ3RoKSB7XG4gICAgaWYgKHN0cmluZy5sZW5ndGggPD0gbGVuZ3RoKSB7IHJldHVybiBzdHJpbmc7IH1cbiAgICByZXR1cm4gc3RyaW5nLnN1YnN0cigwLCBsZW5ndGgpICsgJ+KApic7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRydW5jYXRlcyBhIHN0cmluZyBhZnRlciBhIGNlcnRhaW4gbnVtYmVyIG9mIHdvcmRzLlxuICAgKiBOZXdsaW5lcyB3aXRoaW4gdGhlIHN0cmluZyB3aWxsIGJlIHJlbW92ZWQuXG4gICAqL1xuICBodW1hbml6ZS50cnVuY2F0ZXdvcmRzID0gZnVuY3Rpb24oc3RyaW5nLCBudW1Xb3Jkcykge1xuICAgIHZhciB3b3JkcyA9IHN0cmluZy5zcGxpdCgnICcpO1xuICAgIGlmICh3b3Jkcy5sZW5ndGggPCBudW1Xb3JkcykgeyByZXR1cm4gc3RyaW5nOyB9XG4gICAgcmV0dXJuIHdvcmRzLnNsaWNlKDAsIG51bVdvcmRzKS5qb2luKCcgJykgKyAn4oCmJztcbiAgfTtcblxufSkuY2FsbCh0aGlzKTtcbiIsIi8qKlxuICogIENvcHlyaWdodCAoYykgMjAxNC0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgKGdsb2JhbC5JbW11dGFibGUgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCBmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0Jzt2YXIgU0xJQ0UkMCA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxuICBmdW5jdGlvbiBjcmVhdGVDbGFzcyhjdG9yLCBzdXBlckNsYXNzKSB7XG4gICAgaWYgKHN1cGVyQ2xhc3MpIHtcbiAgICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIEl0ZXJhYmxlKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaXNJdGVyYWJsZSh2YWx1ZSkgPyB2YWx1ZSA6IFNlcSh2YWx1ZSk7XG4gICAgfVxuXG5cbiAgY3JlYXRlQ2xhc3MoS2V5ZWRJdGVyYWJsZSwgSXRlcmFibGUpO1xuICAgIGZ1bmN0aW9uIEtleWVkSXRlcmFibGUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0tleWVkKHZhbHVlKSA/IHZhbHVlIDogS2V5ZWRTZXEodmFsdWUpO1xuICAgIH1cblxuXG4gIGNyZWF0ZUNsYXNzKEluZGV4ZWRJdGVyYWJsZSwgSXRlcmFibGUpO1xuICAgIGZ1bmN0aW9uIEluZGV4ZWRJdGVyYWJsZSh2YWx1ZSkge1xuICAgICAgcmV0dXJuIGlzSW5kZXhlZCh2YWx1ZSkgPyB2YWx1ZSA6IEluZGV4ZWRTZXEodmFsdWUpO1xuICAgIH1cblxuXG4gIGNyZWF0ZUNsYXNzKFNldEl0ZXJhYmxlLCBJdGVyYWJsZSk7XG4gICAgZnVuY3Rpb24gU2V0SXRlcmFibGUodmFsdWUpIHtcbiAgICAgIHJldHVybiBpc0l0ZXJhYmxlKHZhbHVlKSAmJiAhaXNBc3NvY2lhdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IFNldFNlcSh2YWx1ZSk7XG4gICAgfVxuXG5cblxuICBmdW5jdGlvbiBpc0l0ZXJhYmxlKG1heWJlSXRlcmFibGUpIHtcbiAgICByZXR1cm4gISEobWF5YmVJdGVyYWJsZSAmJiBtYXliZUl0ZXJhYmxlW0lTX0lURVJBQkxFX1NFTlRJTkVMXSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0tleWVkKG1heWJlS2V5ZWQpIHtcbiAgICByZXR1cm4gISEobWF5YmVLZXllZCAmJiBtYXliZUtleWVkW0lTX0tFWUVEX1NFTlRJTkVMXSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0luZGV4ZWQobWF5YmVJbmRleGVkKSB7XG4gICAgcmV0dXJuICEhKG1heWJlSW5kZXhlZCAmJiBtYXliZUluZGV4ZWRbSVNfSU5ERVhFRF9TRU5USU5FTF0pO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNBc3NvY2lhdGl2ZShtYXliZUFzc29jaWF0aXZlKSB7XG4gICAgcmV0dXJuIGlzS2V5ZWQobWF5YmVBc3NvY2lhdGl2ZSkgfHwgaXNJbmRleGVkKG1heWJlQXNzb2NpYXRpdmUpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNPcmRlcmVkKG1heWJlT3JkZXJlZCkge1xuICAgIHJldHVybiAhIShtYXliZU9yZGVyZWQgJiYgbWF5YmVPcmRlcmVkW0lTX09SREVSRURfU0VOVElORUxdKTtcbiAgfVxuXG4gIEl0ZXJhYmxlLmlzSXRlcmFibGUgPSBpc0l0ZXJhYmxlO1xuICBJdGVyYWJsZS5pc0tleWVkID0gaXNLZXllZDtcbiAgSXRlcmFibGUuaXNJbmRleGVkID0gaXNJbmRleGVkO1xuICBJdGVyYWJsZS5pc0Fzc29jaWF0aXZlID0gaXNBc3NvY2lhdGl2ZTtcbiAgSXRlcmFibGUuaXNPcmRlcmVkID0gaXNPcmRlcmVkO1xuXG4gIEl0ZXJhYmxlLktleWVkID0gS2V5ZWRJdGVyYWJsZTtcbiAgSXRlcmFibGUuSW5kZXhlZCA9IEluZGV4ZWRJdGVyYWJsZTtcbiAgSXRlcmFibGUuU2V0ID0gU2V0SXRlcmFibGU7XG5cblxuICB2YXIgSVNfSVRFUkFCTEVfU0VOVElORUwgPSAnQEBfX0lNTVVUQUJMRV9JVEVSQUJMRV9fQEAnO1xuICB2YXIgSVNfS0VZRURfU0VOVElORUwgPSAnQEBfX0lNTVVUQUJMRV9LRVlFRF9fQEAnO1xuICB2YXIgSVNfSU5ERVhFRF9TRU5USU5FTCA9ICdAQF9fSU1NVVRBQkxFX0lOREVYRURfX0BAJztcbiAgdmFyIElTX09SREVSRURfU0VOVElORUwgPSAnQEBfX0lNTVVUQUJMRV9PUkRFUkVEX19AQCc7XG5cbiAgLy8gVXNlZCBmb3Igc2V0dGluZyBwcm90b3R5cGUgbWV0aG9kcyB0aGF0IElFOCBjaG9rZXMgb24uXG4gIHZhciBERUxFVEUgPSAnZGVsZXRlJztcblxuICAvLyBDb25zdGFudHMgZGVzY3JpYmluZyB0aGUgc2l6ZSBvZiB0cmllIG5vZGVzLlxuICB2YXIgU0hJRlQgPSA1OyAvLyBSZXN1bHRlZCBpbiBiZXN0IHBlcmZvcm1hbmNlIGFmdGVyIF9fX19fXz9cbiAgdmFyIFNJWkUgPSAxIDw8IFNISUZUO1xuICB2YXIgTUFTSyA9IFNJWkUgLSAxO1xuXG4gIC8vIEEgY29uc2lzdGVudCBzaGFyZWQgdmFsdWUgcmVwcmVzZW50aW5nIFwibm90IHNldFwiIHdoaWNoIGVxdWFscyBub3RoaW5nIG90aGVyXG4gIC8vIHRoYW4gaXRzZWxmLCBhbmQgbm90aGluZyB0aGF0IGNvdWxkIGJlIHByb3ZpZGVkIGV4dGVybmFsbHkuXG4gIHZhciBOT1RfU0VUID0ge307XG5cbiAgLy8gQm9vbGVhbiByZWZlcmVuY2VzLCBSb3VnaCBlcXVpdmFsZW50IG9mIGBib29sICZgLlxuICB2YXIgQ0hBTkdFX0xFTkdUSCA9IHsgdmFsdWU6IGZhbHNlIH07XG4gIHZhciBESURfQUxURVIgPSB7IHZhbHVlOiBmYWxzZSB9O1xuXG4gIGZ1bmN0aW9uIE1ha2VSZWYocmVmKSB7XG4gICAgcmVmLnZhbHVlID0gZmFsc2U7XG4gICAgcmV0dXJuIHJlZjtcbiAgfVxuXG4gIGZ1bmN0aW9uIFNldFJlZihyZWYpIHtcbiAgICByZWYgJiYgKHJlZi52YWx1ZSA9IHRydWUpO1xuICB9XG5cbiAgLy8gQSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgdmFsdWUgcmVwcmVzZW50aW5nIGFuIFwib3duZXJcIiBmb3IgdHJhbnNpZW50IHdyaXRlc1xuICAvLyB0byB0cmllcy4gVGhlIHJldHVybiB2YWx1ZSB3aWxsIG9ubHkgZXZlciBlcXVhbCBpdHNlbGYsIGFuZCB3aWxsIG5vdCBlcXVhbFxuICAvLyB0aGUgcmV0dXJuIG9mIGFueSBzdWJzZXF1ZW50IGNhbGwgb2YgdGhpcyBmdW5jdGlvbi5cbiAgZnVuY3Rpb24gT3duZXJJRCgpIHt9XG5cbiAgLy8gaHR0cDovL2pzcGVyZi5jb20vY29weS1hcnJheS1pbmxpbmVcbiAgZnVuY3Rpb24gYXJyQ29weShhcnIsIG9mZnNldCkge1xuICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuICAgIHZhciBsZW4gPSBNYXRoLm1heCgwLCBhcnIubGVuZ3RoIC0gb2Zmc2V0KTtcbiAgICB2YXIgbmV3QXJyID0gbmV3IEFycmF5KGxlbik7XG4gICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGxlbjsgaWkrKykge1xuICAgICAgbmV3QXJyW2lpXSA9IGFycltpaSArIG9mZnNldF07XG4gICAgfVxuICAgIHJldHVybiBuZXdBcnI7XG4gIH1cblxuICBmdW5jdGlvbiBlbnN1cmVTaXplKGl0ZXIpIHtcbiAgICBpZiAoaXRlci5zaXplID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGl0ZXIuc2l6ZSA9IGl0ZXIuX19pdGVyYXRlKHJldHVyblRydWUpO1xuICAgIH1cbiAgICByZXR1cm4gaXRlci5zaXplO1xuICB9XG5cbiAgZnVuY3Rpb24gd3JhcEluZGV4KGl0ZXIsIGluZGV4KSB7XG4gICAgLy8gVGhpcyBpbXBsZW1lbnRzIFwiaXMgYXJyYXkgaW5kZXhcIiB3aGljaCB0aGUgRUNNQVN0cmluZyBzcGVjIGRlZmluZXMgYXM6XG4gICAgLy9cbiAgICAvLyAgICAgQSBTdHJpbmcgcHJvcGVydHkgbmFtZSBQIGlzIGFuIGFycmF5IGluZGV4IGlmIGFuZCBvbmx5IGlmXG4gICAgLy8gICAgIFRvU3RyaW5nKFRvVWludDMyKFApKSBpcyBlcXVhbCB0byBQIGFuZCBUb1VpbnQzMihQKSBpcyBub3QgZXF1YWxcbiAgICAvLyAgICAgdG8gMl4zMuKIkjEuXG4gICAgLy9cbiAgICAvLyBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtYXJyYXktZXhvdGljLW9iamVjdHNcbiAgICBpZiAodHlwZW9mIGluZGV4ICE9PSAnbnVtYmVyJykge1xuICAgICAgdmFyIHVpbnQzMkluZGV4ID0gaW5kZXggPj4+IDA7IC8vIE4gPj4+IDAgaXMgc2hvcnRoYW5kIGZvciBUb1VpbnQzMlxuICAgICAgaWYgKCcnICsgdWludDMySW5kZXggIT09IGluZGV4IHx8IHVpbnQzMkluZGV4ID09PSA0Mjk0OTY3Mjk1KSB7XG4gICAgICAgIHJldHVybiBOYU47XG4gICAgICB9XG4gICAgICBpbmRleCA9IHVpbnQzMkluZGV4O1xuICAgIH1cbiAgICByZXR1cm4gaW5kZXggPCAwID8gZW5zdXJlU2l6ZShpdGVyKSArIGluZGV4IDogaW5kZXg7XG4gIH1cblxuICBmdW5jdGlvbiByZXR1cm5UcnVlKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZnVuY3Rpb24gd2hvbGVTbGljZShiZWdpbiwgZW5kLCBzaXplKSB7XG4gICAgcmV0dXJuIChiZWdpbiA9PT0gMCB8fCAoc2l6ZSAhPT0gdW5kZWZpbmVkICYmIGJlZ2luIDw9IC1zaXplKSkgJiZcbiAgICAgIChlbmQgPT09IHVuZGVmaW5lZCB8fCAoc2l6ZSAhPT0gdW5kZWZpbmVkICYmIGVuZCA+PSBzaXplKSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNvbHZlQmVnaW4oYmVnaW4sIHNpemUpIHtcbiAgICByZXR1cm4gcmVzb2x2ZUluZGV4KGJlZ2luLCBzaXplLCAwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc29sdmVFbmQoZW5kLCBzaXplKSB7XG4gICAgcmV0dXJuIHJlc29sdmVJbmRleChlbmQsIHNpemUsIHNpemUpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzb2x2ZUluZGV4KGluZGV4LCBzaXplLCBkZWZhdWx0SW5kZXgpIHtcbiAgICByZXR1cm4gaW5kZXggPT09IHVuZGVmaW5lZCA/XG4gICAgICBkZWZhdWx0SW5kZXggOlxuICAgICAgaW5kZXggPCAwID9cbiAgICAgICAgTWF0aC5tYXgoMCwgc2l6ZSArIGluZGV4KSA6XG4gICAgICAgIHNpemUgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgaW5kZXggOlxuICAgICAgICAgIE1hdGgubWluKHNpemUsIGluZGV4KTtcbiAgfVxuXG4gIC8qIGdsb2JhbCBTeW1ib2wgKi9cblxuICB2YXIgSVRFUkFURV9LRVlTID0gMDtcbiAgdmFyIElURVJBVEVfVkFMVUVTID0gMTtcbiAgdmFyIElURVJBVEVfRU5UUklFUyA9IDI7XG5cbiAgdmFyIFJFQUxfSVRFUkFUT1JfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3I7XG4gIHZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJztcblxuICB2YXIgSVRFUkFUT1JfU1lNQk9MID0gUkVBTF9JVEVSQVRPUl9TWU1CT0wgfHwgRkFVWF9JVEVSQVRPUl9TWU1CT0w7XG5cblxuICBmdW5jdGlvbiBJdGVyYXRvcihuZXh0KSB7XG4gICAgICB0aGlzLm5leHQgPSBuZXh0O1xuICAgIH1cblxuICAgIEl0ZXJhdG9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuICdbSXRlcmF0b3JdJztcbiAgICB9O1xuXG5cbiAgSXRlcmF0b3IuS0VZUyA9IElURVJBVEVfS0VZUztcbiAgSXRlcmF0b3IuVkFMVUVTID0gSVRFUkFURV9WQUxVRVM7XG4gIEl0ZXJhdG9yLkVOVFJJRVMgPSBJVEVSQVRFX0VOVFJJRVM7XG5cbiAgSXRlcmF0b3IucHJvdG90eXBlLmluc3BlY3QgPVxuICBJdGVyYXRvci5wcm90b3R5cGUudG9Tb3VyY2UgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLnRvU3RyaW5nKCk7IH1cbiAgSXRlcmF0b3IucHJvdG90eXBlW0lURVJBVE9SX1NZTUJPTF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cblxuICBmdW5jdGlvbiBpdGVyYXRvclZhbHVlKHR5cGUsIGssIHYsIGl0ZXJhdG9yUmVzdWx0KSB7XG4gICAgdmFyIHZhbHVlID0gdHlwZSA9PT0gMCA/IGsgOiB0eXBlID09PSAxID8gdiA6IFtrLCB2XTtcbiAgICBpdGVyYXRvclJlc3VsdCA/IChpdGVyYXRvclJlc3VsdC52YWx1ZSA9IHZhbHVlKSA6IChpdGVyYXRvclJlc3VsdCA9IHtcbiAgICAgIHZhbHVlOiB2YWx1ZSwgZG9uZTogZmFsc2VcbiAgICB9KTtcbiAgICByZXR1cm4gaXRlcmF0b3JSZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBpdGVyYXRvckRvbmUoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzSXRlcmF0b3IobWF5YmVJdGVyYWJsZSkge1xuICAgIHJldHVybiAhIWdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0l0ZXJhdG9yKG1heWJlSXRlcmF0b3IpIHtcbiAgICByZXR1cm4gbWF5YmVJdGVyYXRvciAmJiB0eXBlb2YgbWF5YmVJdGVyYXRvci5uZXh0ID09PSAnZnVuY3Rpb24nO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SXRlcmF0b3IoaXRlcmFibGUpIHtcbiAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4oaXRlcmFibGUpO1xuICAgIHJldHVybiBpdGVyYXRvckZuICYmIGl0ZXJhdG9yRm4uY2FsbChpdGVyYWJsZSk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRJdGVyYXRvckZuKGl0ZXJhYmxlKSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBpdGVyYWJsZSAmJiAoXG4gICAgICAoUkVBTF9JVEVSQVRPUl9TWU1CT0wgJiYgaXRlcmFibGVbUkVBTF9JVEVSQVRPUl9TWU1CT0xdKSB8fFxuICAgICAgaXRlcmFibGVbRkFVWF9JVEVSQVRPUl9TWU1CT0xdXG4gICAgKTtcbiAgICBpZiAodHlwZW9mIGl0ZXJhdG9yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBpdGVyYXRvckZuO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5sZW5ndGggPT09ICdudW1iZXInO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoU2VxLCBJdGVyYWJsZSk7XG4gICAgZnVuY3Rpb24gU2VxKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/IGVtcHR5U2VxdWVuY2UoKSA6XG4gICAgICAgIGlzSXRlcmFibGUodmFsdWUpID8gdmFsdWUudG9TZXEoKSA6IHNlcUZyb21WYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgU2VxLm9mID0gZnVuY3Rpb24oLyouLi52YWx1ZXMqLykge1xuICAgICAgcmV0dXJuIFNlcShhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBTZXEucHJvdG90eXBlLnRvU2VxID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgU2VxLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX190b1N0cmluZygnU2VxIHsnLCAnfScpO1xuICAgIH07XG5cbiAgICBTZXEucHJvdG90eXBlLmNhY2hlUmVzdWx0ID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIXRoaXMuX2NhY2hlICYmIHRoaXMuX19pdGVyYXRlVW5jYWNoZWQpIHtcbiAgICAgICAgdGhpcy5fY2FjaGUgPSB0aGlzLmVudHJ5U2VxKCkudG9BcnJheSgpO1xuICAgICAgICB0aGlzLnNpemUgPSB0aGlzLl9jYWNoZS5sZW5ndGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgLy8gYWJzdHJhY3QgX19pdGVyYXRlVW5jYWNoZWQoZm4sIHJldmVyc2UpXG5cbiAgICBTZXEucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7XG4gICAgICByZXR1cm4gc2VxSXRlcmF0ZSh0aGlzLCBmbiwgcmV2ZXJzZSwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIC8vIGFic3RyYWN0IF9faXRlcmF0b3JVbmNhY2hlZCh0eXBlLCByZXZlcnNlKVxuXG4gICAgU2VxLnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgICAgcmV0dXJuIHNlcUl0ZXJhdG9yKHRoaXMsIHR5cGUsIHJldmVyc2UsIHRydWUpO1xuICAgIH07XG5cblxuXG4gIGNyZWF0ZUNsYXNzKEtleWVkU2VxLCBTZXEpO1xuICAgIGZ1bmN0aW9uIEtleWVkU2VxKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/XG4gICAgICAgIGVtcHR5U2VxdWVuY2UoKS50b0tleWVkU2VxKCkgOlxuICAgICAgICBpc0l0ZXJhYmxlKHZhbHVlKSA/XG4gICAgICAgICAgKGlzS2V5ZWQodmFsdWUpID8gdmFsdWUudG9TZXEoKSA6IHZhbHVlLmZyb21FbnRyeVNlcSgpKSA6XG4gICAgICAgICAga2V5ZWRTZXFGcm9tVmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIEtleWVkU2VxLnByb3RvdHlwZS50b0tleWVkU2VxID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5cblxuICBjcmVhdGVDbGFzcyhJbmRleGVkU2VxLCBTZXEpO1xuICAgIGZ1bmN0aW9uIEluZGV4ZWRTZXEodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gZW1wdHlTZXF1ZW5jZSgpIDpcbiAgICAgICAgIWlzSXRlcmFibGUodmFsdWUpID8gaW5kZXhlZFNlcUZyb21WYWx1ZSh2YWx1ZSkgOlxuICAgICAgICBpc0tleWVkKHZhbHVlKSA/IHZhbHVlLmVudHJ5U2VxKCkgOiB2YWx1ZS50b0luZGV4ZWRTZXEoKTtcbiAgICB9XG5cbiAgICBJbmRleGVkU2VxLm9mID0gZnVuY3Rpb24oLyouLi52YWx1ZXMqLykge1xuICAgICAgcmV0dXJuIEluZGV4ZWRTZXEoYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgSW5kZXhlZFNlcS5wcm90b3R5cGUudG9JbmRleGVkU2VxID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG4gICAgSW5kZXhlZFNlcS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fdG9TdHJpbmcoJ1NlcSBbJywgJ10nKTtcbiAgICB9O1xuXG4gICAgSW5kZXhlZFNlcS5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHtcbiAgICAgIHJldHVybiBzZXFJdGVyYXRlKHRoaXMsIGZuLCByZXZlcnNlLCBmYWxzZSk7XG4gICAgfTtcblxuICAgIEluZGV4ZWRTZXEucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgICByZXR1cm4gc2VxSXRlcmF0b3IodGhpcywgdHlwZSwgcmV2ZXJzZSwgZmFsc2UpO1xuICAgIH07XG5cblxuXG4gIGNyZWF0ZUNsYXNzKFNldFNlcSwgU2VxKTtcbiAgICBmdW5jdGlvbiBTZXRTZXEodmFsdWUpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgPyBlbXB0eVNlcXVlbmNlKCkgOlxuICAgICAgICAhaXNJdGVyYWJsZSh2YWx1ZSkgPyBpbmRleGVkU2VxRnJvbVZhbHVlKHZhbHVlKSA6XG4gICAgICAgIGlzS2V5ZWQodmFsdWUpID8gdmFsdWUuZW50cnlTZXEoKSA6IHZhbHVlXG4gICAgICApLnRvU2V0U2VxKCk7XG4gICAgfVxuXG4gICAgU2V0U2VxLm9mID0gZnVuY3Rpb24oLyouLi52YWx1ZXMqLykge1xuICAgICAgcmV0dXJuIFNldFNlcShhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBTZXRTZXEucHJvdG90eXBlLnRvU2V0U2VxID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuXG5cblxuICBTZXEuaXNTZXEgPSBpc1NlcTtcbiAgU2VxLktleWVkID0gS2V5ZWRTZXE7XG4gIFNlcS5TZXQgPSBTZXRTZXE7XG4gIFNlcS5JbmRleGVkID0gSW5kZXhlZFNlcTtcblxuICB2YXIgSVNfU0VRX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfU0VRX19AQCc7XG5cbiAgU2VxLnByb3RvdHlwZVtJU19TRVFfU0VOVElORUxdID0gdHJ1ZTtcblxuXG5cbiAgY3JlYXRlQ2xhc3MoQXJyYXlTZXEsIEluZGV4ZWRTZXEpO1xuICAgIGZ1bmN0aW9uIEFycmF5U2VxKGFycmF5KSB7XG4gICAgICB0aGlzLl9hcnJheSA9IGFycmF5O1xuICAgICAgdGhpcy5zaXplID0gYXJyYXkubGVuZ3RoO1xuICAgIH1cblxuICAgIEFycmF5U2VxLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihpbmRleCwgbm90U2V0VmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhcyhpbmRleCkgPyB0aGlzLl9hcnJheVt3cmFwSW5kZXgodGhpcywgaW5kZXgpXSA6IG5vdFNldFZhbHVlO1xuICAgIH07XG5cbiAgICBBcnJheVNlcS5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHtcbiAgICAgIHZhciBhcnJheSA9IHRoaXMuX2FycmF5O1xuICAgICAgdmFyIG1heEluZGV4ID0gYXJyYXkubGVuZ3RoIC0gMTtcbiAgICAgIGZvciAodmFyIGlpID0gMDsgaWkgPD0gbWF4SW5kZXg7IGlpKyspIHtcbiAgICAgICAgaWYgKGZuKGFycmF5W3JldmVyc2UgPyBtYXhJbmRleCAtIGlpIDogaWldLCBpaSwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGlpICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGlpO1xuICAgIH07XG5cbiAgICBBcnJheVNlcS5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uKHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIHZhciBhcnJheSA9IHRoaXMuX2FycmF5O1xuICAgICAgdmFyIG1heEluZGV4ID0gYXJyYXkubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBpaSA9IDA7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkgXG4gICAgICAgIHtyZXR1cm4gaWkgPiBtYXhJbmRleCA/XG4gICAgICAgICAgaXRlcmF0b3JEb25lKCkgOlxuICAgICAgICAgIGl0ZXJhdG9yVmFsdWUodHlwZSwgaWksIGFycmF5W3JldmVyc2UgPyBtYXhJbmRleCAtIGlpKysgOiBpaSsrXSl9XG4gICAgICApO1xuICAgIH07XG5cblxuXG4gIGNyZWF0ZUNsYXNzKE9iamVjdFNlcSwgS2V5ZWRTZXEpO1xuICAgIGZ1bmN0aW9uIE9iamVjdFNlcShvYmplY3QpIHtcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcbiAgICAgIHRoaXMuX29iamVjdCA9IG9iamVjdDtcbiAgICAgIHRoaXMuX2tleXMgPSBrZXlzO1xuICAgICAgdGhpcy5zaXplID0ga2V5cy5sZW5ndGg7XG4gICAgfVxuXG4gICAgT2JqZWN0U2VxLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihrZXksIG5vdFNldFZhbHVlKSB7XG4gICAgICBpZiAobm90U2V0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhdGhpcy5oYXMoa2V5KSkge1xuICAgICAgICByZXR1cm4gbm90U2V0VmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fb2JqZWN0W2tleV07XG4gICAgfTtcblxuICAgIE9iamVjdFNlcS5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5fb2JqZWN0Lmhhc093blByb3BlcnR5KGtleSk7XG4gICAgfTtcblxuICAgIE9iamVjdFNlcS5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHtcbiAgICAgIHZhciBvYmplY3QgPSB0aGlzLl9vYmplY3Q7XG4gICAgICB2YXIga2V5cyA9IHRoaXMuX2tleXM7XG4gICAgICB2YXIgbWF4SW5kZXggPSBrZXlzLmxlbmd0aCAtIDE7XG4gICAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDw9IG1heEluZGV4OyBpaSsrKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzW3JldmVyc2UgPyBtYXhJbmRleCAtIGlpIDogaWldO1xuICAgICAgICBpZiAoZm4ob2JqZWN0W2tleV0sIGtleSwgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGlpICsgMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGlpO1xuICAgIH07XG5cbiAgICBPYmplY3RTZXEucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgICB2YXIgb2JqZWN0ID0gdGhpcy5fb2JqZWN0O1xuICAgICAgdmFyIGtleXMgPSB0aGlzLl9rZXlzO1xuICAgICAgdmFyIG1heEluZGV4ID0ga2V5cy5sZW5ndGggLSAxO1xuICAgICAgdmFyIGlpID0gMDtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24oKSAge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1tyZXZlcnNlID8gbWF4SW5kZXggLSBpaSA6IGlpXTtcbiAgICAgICAgcmV0dXJuIGlpKysgPiBtYXhJbmRleCA/XG4gICAgICAgICAgaXRlcmF0b3JEb25lKCkgOlxuICAgICAgICAgIGl0ZXJhdG9yVmFsdWUodHlwZSwga2V5LCBvYmplY3Rba2V5XSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gIE9iamVjdFNlcS5wcm90b3R5cGVbSVNfT1JERVJFRF9TRU5USU5FTF0gPSB0cnVlO1xuXG5cbiAgY3JlYXRlQ2xhc3MoSXRlcmFibGVTZXEsIEluZGV4ZWRTZXEpO1xuICAgIGZ1bmN0aW9uIEl0ZXJhYmxlU2VxKGl0ZXJhYmxlKSB7XG4gICAgICB0aGlzLl9pdGVyYWJsZSA9IGl0ZXJhYmxlO1xuICAgICAgdGhpcy5zaXplID0gaXRlcmFibGUubGVuZ3RoIHx8IGl0ZXJhYmxlLnNpemU7XG4gICAgfVxuXG4gICAgSXRlcmFibGVTZXEucHJvdG90eXBlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHtcbiAgICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRlKGZuLCByZXZlcnNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBpdGVyYWJsZSA9IHRoaXMuX2l0ZXJhYmxlO1xuICAgICAgdmFyIGl0ZXJhdG9yID0gZ2V0SXRlcmF0b3IoaXRlcmFibGUpO1xuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgaWYgKGlzSXRlcmF0b3IoaXRlcmF0b3IpKSB7XG4gICAgICAgIHZhciBzdGVwO1xuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgaWYgKGZuKHN0ZXAudmFsdWUsIGl0ZXJhdGlvbnMrKywgdGhpcykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpdGVyYXRpb25zO1xuICAgIH07XG5cbiAgICBJdGVyYWJsZVNlcS5wcm90b3R5cGUuX19pdGVyYXRvclVuY2FjaGVkID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgICAgaWYgKHJldmVyc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgICAgfVxuICAgICAgdmFyIGl0ZXJhYmxlID0gdGhpcy5faXRlcmFibGU7XG4gICAgICB2YXIgaXRlcmF0b3IgPSBnZXRJdGVyYXRvcihpdGVyYWJsZSk7XG4gICAgICBpZiAoIWlzSXRlcmF0b3IoaXRlcmF0b3IpKSB7XG4gICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoaXRlcmF0b3JEb25lKTtcbiAgICAgIH1cbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24oKSAge1xuICAgICAgICB2YXIgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIHN0ZXAuZG9uZSA/IHN0ZXAgOiBpdGVyYXRvclZhbHVlKHR5cGUsIGl0ZXJhdGlvbnMrKywgc3RlcC52YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG5cblxuICBjcmVhdGVDbGFzcyhJdGVyYXRvclNlcSwgSW5kZXhlZFNlcSk7XG4gICAgZnVuY3Rpb24gSXRlcmF0b3JTZXEoaXRlcmF0b3IpIHtcbiAgICAgIHRoaXMuX2l0ZXJhdG9yID0gaXRlcmF0b3I7XG4gICAgICB0aGlzLl9pdGVyYXRvckNhY2hlID0gW107XG4gICAgfVxuXG4gICAgSXRlcmF0b3JTZXEucHJvdG90eXBlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHtcbiAgICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRlKGZuLCByZXZlcnNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBpdGVyYXRvciA9IHRoaXMuX2l0ZXJhdG9yO1xuICAgICAgdmFyIGNhY2hlID0gdGhpcy5faXRlcmF0b3JDYWNoZTtcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHdoaWxlIChpdGVyYXRpb25zIDwgY2FjaGUubGVuZ3RoKSB7XG4gICAgICAgIGlmIChmbihjYWNoZVtpdGVyYXRpb25zXSwgaXRlcmF0aW9ucysrLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0aW9ucztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIHN0ZXA7XG4gICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgIHZhciB2YWwgPSBzdGVwLnZhbHVlO1xuICAgICAgICBjYWNoZVtpdGVyYXRpb25zXSA9IHZhbDtcbiAgICAgICAgaWYgKGZuKHZhbCwgaXRlcmF0aW9ucysrLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gICAgfTtcblxuICAgIEl0ZXJhdG9yU2VxLnByb3RvdHlwZS5fX2l0ZXJhdG9yVW5jYWNoZWQgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gICAgICB9XG4gICAgICB2YXIgaXRlcmF0b3IgPSB0aGlzLl9pdGVyYXRvcjtcbiAgICAgIHZhciBjYWNoZSA9IHRoaXMuX2l0ZXJhdG9yQ2FjaGU7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkgIHtcbiAgICAgICAgaWYgKGl0ZXJhdGlvbnMgPj0gY2FjaGUubGVuZ3RoKSB7XG4gICAgICAgICAgdmFyIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgaWYgKHN0ZXAuZG9uZSkge1xuICAgICAgICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhY2hlW2l0ZXJhdGlvbnNdID0gc3RlcC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zLCBjYWNoZVtpdGVyYXRpb25zKytdKTtcbiAgICAgIH0pO1xuICAgIH07XG5cblxuXG5cbiAgLy8gIyBwcmFnbWEgSGVscGVyIGZ1bmN0aW9uc1xuXG4gIGZ1bmN0aW9uIGlzU2VxKG1heWJlU2VxKSB7XG4gICAgcmV0dXJuICEhKG1heWJlU2VxICYmIG1heWJlU2VxW0lTX1NFUV9TRU5USU5FTF0pO1xuICB9XG5cbiAgdmFyIEVNUFRZX1NFUTtcblxuICBmdW5jdGlvbiBlbXB0eVNlcXVlbmNlKCkge1xuICAgIHJldHVybiBFTVBUWV9TRVEgfHwgKEVNUFRZX1NFUSA9IG5ldyBBcnJheVNlcShbXSkpO1xuICB9XG5cbiAgZnVuY3Rpb24ga2V5ZWRTZXFGcm9tVmFsdWUodmFsdWUpIHtcbiAgICB2YXIgc2VxID1cbiAgICAgIEFycmF5LmlzQXJyYXkodmFsdWUpID8gbmV3IEFycmF5U2VxKHZhbHVlKS5mcm9tRW50cnlTZXEoKSA6XG4gICAgICBpc0l0ZXJhdG9yKHZhbHVlKSA/IG5ldyBJdGVyYXRvclNlcSh2YWx1ZSkuZnJvbUVudHJ5U2VxKCkgOlxuICAgICAgaGFzSXRlcmF0b3IodmFsdWUpID8gbmV3IEl0ZXJhYmxlU2VxKHZhbHVlKS5mcm9tRW50cnlTZXEoKSA6XG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gbmV3IE9iamVjdFNlcSh2YWx1ZSkgOlxuICAgICAgdW5kZWZpbmVkO1xuICAgIGlmICghc2VxKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnRXhwZWN0ZWQgQXJyYXkgb3IgaXRlcmFibGUgb2JqZWN0IG9mIFtrLCB2XSBlbnRyaWVzLCAnK1xuICAgICAgICAnb3Iga2V5ZWQgb2JqZWN0OiAnICsgdmFsdWVcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBzZXE7XG4gIH1cblxuICBmdW5jdGlvbiBpbmRleGVkU2VxRnJvbVZhbHVlKHZhbHVlKSB7XG4gICAgdmFyIHNlcSA9IG1heWJlSW5kZXhlZFNlcUZyb21WYWx1ZSh2YWx1ZSk7XG4gICAgaWYgKCFzZXEpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdFeHBlY3RlZCBBcnJheSBvciBpdGVyYWJsZSBvYmplY3Qgb2YgdmFsdWVzOiAnICsgdmFsdWVcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBzZXE7XG4gIH1cblxuICBmdW5jdGlvbiBzZXFGcm9tVmFsdWUodmFsdWUpIHtcbiAgICB2YXIgc2VxID0gbWF5YmVJbmRleGVkU2VxRnJvbVZhbHVlKHZhbHVlKSB8fFxuICAgICAgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgbmV3IE9iamVjdFNlcSh2YWx1ZSkpO1xuICAgIGlmICghc2VxKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnRXhwZWN0ZWQgQXJyYXkgb3IgaXRlcmFibGUgb2JqZWN0IG9mIHZhbHVlcywgb3Iga2V5ZWQgb2JqZWN0OiAnICsgdmFsdWVcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBzZXE7XG4gIH1cblxuICBmdW5jdGlvbiBtYXliZUluZGV4ZWRTZXFGcm9tVmFsdWUodmFsdWUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgaXNBcnJheUxpa2UodmFsdWUpID8gbmV3IEFycmF5U2VxKHZhbHVlKSA6XG4gICAgICBpc0l0ZXJhdG9yKHZhbHVlKSA/IG5ldyBJdGVyYXRvclNlcSh2YWx1ZSkgOlxuICAgICAgaGFzSXRlcmF0b3IodmFsdWUpID8gbmV3IEl0ZXJhYmxlU2VxKHZhbHVlKSA6XG4gICAgICB1bmRlZmluZWRcbiAgICApO1xuICB9XG5cbiAgZnVuY3Rpb24gc2VxSXRlcmF0ZShzZXEsIGZuLCByZXZlcnNlLCB1c2VLZXlzKSB7XG4gICAgdmFyIGNhY2hlID0gc2VxLl9jYWNoZTtcbiAgICBpZiAoY2FjaGUpIHtcbiAgICAgIHZhciBtYXhJbmRleCA9IGNhY2hlLmxlbmd0aCAtIDE7XG4gICAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDw9IG1heEluZGV4OyBpaSsrKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IGNhY2hlW3JldmVyc2UgPyBtYXhJbmRleCAtIGlpIDogaWldO1xuICAgICAgICBpZiAoZm4oZW50cnlbMV0sIHVzZUtleXMgPyBlbnRyeVswXSA6IGlpLCBzZXEpID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBpaSArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpaTtcbiAgICB9XG4gICAgcmV0dXJuIHNlcS5fX2l0ZXJhdGVVbmNhY2hlZChmbiwgcmV2ZXJzZSk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXFJdGVyYXRvcihzZXEsIHR5cGUsIHJldmVyc2UsIHVzZUtleXMpIHtcbiAgICB2YXIgY2FjaGUgPSBzZXEuX2NhY2hlO1xuICAgIGlmIChjYWNoZSkge1xuICAgICAgdmFyIG1heEluZGV4ID0gY2FjaGUubGVuZ3RoIC0gMTtcbiAgICAgIHZhciBpaSA9IDA7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkgIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gY2FjaGVbcmV2ZXJzZSA/IG1heEluZGV4IC0gaWkgOiBpaV07XG4gICAgICAgIHJldHVybiBpaSsrID4gbWF4SW5kZXggP1xuICAgICAgICAgIGl0ZXJhdG9yRG9uZSgpIDpcbiAgICAgICAgICBpdGVyYXRvclZhbHVlKHR5cGUsIHVzZUtleXMgPyBlbnRyeVswXSA6IGlpIC0gMSwgZW50cnlbMV0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBzZXEuX19pdGVyYXRvclVuY2FjaGVkKHR5cGUsIHJldmVyc2UpO1xuICB9XG5cbiAgZnVuY3Rpb24gZnJvbUpTKGpzb24sIGNvbnZlcnRlcikge1xuICAgIHJldHVybiBjb252ZXJ0ZXIgP1xuICAgICAgZnJvbUpTV2l0aChjb252ZXJ0ZXIsIGpzb24sICcnLCB7Jyc6IGpzb259KSA6XG4gICAgICBmcm9tSlNEZWZhdWx0KGpzb24pO1xuICB9XG5cbiAgZnVuY3Rpb24gZnJvbUpTV2l0aChjb252ZXJ0ZXIsIGpzb24sIGtleSwgcGFyZW50SlNPTikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24pKSB7XG4gICAgICByZXR1cm4gY29udmVydGVyLmNhbGwocGFyZW50SlNPTiwga2V5LCBJbmRleGVkU2VxKGpzb24pLm1hcChmdW5jdGlvbih2LCBrKSAge3JldHVybiBmcm9tSlNXaXRoKGNvbnZlcnRlciwgdiwgaywganNvbil9KSk7XG4gICAgfVxuICAgIGlmIChpc1BsYWluT2JqKGpzb24pKSB7XG4gICAgICByZXR1cm4gY29udmVydGVyLmNhbGwocGFyZW50SlNPTiwga2V5LCBLZXllZFNlcShqc29uKS5tYXAoZnVuY3Rpb24odiwgaykgIHtyZXR1cm4gZnJvbUpTV2l0aChjb252ZXJ0ZXIsIHYsIGssIGpzb24pfSkpO1xuICAgIH1cbiAgICByZXR1cm4ganNvbjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZyb21KU0RlZmF1bHQoanNvbikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24pKSB7XG4gICAgICByZXR1cm4gSW5kZXhlZFNlcShqc29uKS5tYXAoZnJvbUpTRGVmYXVsdCkudG9MaXN0KCk7XG4gICAgfVxuICAgIGlmIChpc1BsYWluT2JqKGpzb24pKSB7XG4gICAgICByZXR1cm4gS2V5ZWRTZXEoanNvbikubWFwKGZyb21KU0RlZmF1bHQpLnRvTWFwKCk7XG4gICAgfVxuICAgIHJldHVybiBqc29uO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNQbGFpbk9iaih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiAodmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdCB8fCB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBleHRlbnNpb24gb2YgdGhlIFwic2FtZS12YWx1ZVwiIGFsZ29yaXRobSBhcyBbZGVzY3JpYmVkIGZvciB1c2UgYnkgRVM2IE1hcFxuICAgKiBhbmQgU2V0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9NYXAjS2V5X2VxdWFsaXR5KVxuICAgKlxuICAgKiBOYU4gaXMgY29uc2lkZXJlZCB0aGUgc2FtZSBhcyBOYU4sIGhvd2V2ZXIgLTAgYW5kIDAgYXJlIGNvbnNpZGVyZWQgdGhlIHNhbWVcbiAgICogdmFsdWUsIHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBhbGdvcml0aG0gZGVzY3JpYmVkIGJ5XG4gICAqIFtgT2JqZWN0LmlzYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2lzKS5cbiAgICpcbiAgICogVGhpcyBpcyBleHRlbmRlZCBmdXJ0aGVyIHRvIGFsbG93IE9iamVjdHMgdG8gZGVzY3JpYmUgdGhlIHZhbHVlcyB0aGV5XG4gICAqIHJlcHJlc2VudCwgYnkgd2F5IG9mIGB2YWx1ZU9mYCBvciBgZXF1YWxzYCAoYW5kIGBoYXNoQ29kZWApLlxuICAgKlxuICAgKiBOb3RlOiBiZWNhdXNlIG9mIHRoaXMgZXh0ZW5zaW9uLCB0aGUga2V5IGVxdWFsaXR5IG9mIEltbXV0YWJsZS5NYXAgYW5kIHRoZVxuICAgKiB2YWx1ZSBlcXVhbGl0eSBvZiBJbW11dGFibGUuU2V0IHdpbGwgZGlmZmVyIGZyb20gRVM2IE1hcCBhbmQgU2V0LlxuICAgKlxuICAgKiAjIyMgRGVmaW5pbmcgY3VzdG9tIHZhbHVlc1xuICAgKlxuICAgKiBUaGUgZWFzaWVzdCB3YXkgdG8gZGVzY3JpYmUgdGhlIHZhbHVlIGFuIG9iamVjdCByZXByZXNlbnRzIGlzIGJ5IGltcGxlbWVudGluZ1xuICAgKiBgdmFsdWVPZmAuIEZvciBleGFtcGxlLCBgRGF0ZWAgcmVwcmVzZW50cyBhIHZhbHVlIGJ5IHJldHVybmluZyBhIHVuaXhcbiAgICogdGltZXN0YW1wIGZvciBgdmFsdWVPZmA6XG4gICAqXG4gICAqICAgICB2YXIgZGF0ZTEgPSBuZXcgRGF0ZSgxMjM0NTY3ODkwMDAwKTsgLy8gRnJpIEZlYiAxMyAyMDA5IC4uLlxuICAgKiAgICAgdmFyIGRhdGUyID0gbmV3IERhdGUoMTIzNDU2Nzg5MDAwMCk7XG4gICAqICAgICBkYXRlMS52YWx1ZU9mKCk7IC8vIDEyMzQ1Njc4OTAwMDBcbiAgICogICAgIGFzc2VydCggZGF0ZTEgIT09IGRhdGUyICk7XG4gICAqICAgICBhc3NlcnQoIEltbXV0YWJsZS5pcyggZGF0ZTEsIGRhdGUyICkgKTtcbiAgICpcbiAgICogTm90ZTogb3ZlcnJpZGluZyBgdmFsdWVPZmAgbWF5IGhhdmUgb3RoZXIgaW1wbGljYXRpb25zIGlmIHlvdSB1c2UgdGhpcyBvYmplY3RcbiAgICogd2hlcmUgSmF2YVNjcmlwdCBleHBlY3RzIGEgcHJpbWl0aXZlLCBzdWNoIGFzIGltcGxpY2l0IHN0cmluZyBjb2VyY2lvbi5cbiAgICpcbiAgICogRm9yIG1vcmUgY29tcGxleCB0eXBlcywgZXNwZWNpYWxseSBjb2xsZWN0aW9ucywgaW1wbGVtZW50aW5nIGB2YWx1ZU9mYCBtYXlcbiAgICogbm90IGJlIHBlcmZvcm1hbnQuIEFuIGFsdGVybmF0aXZlIGlzIHRvIGltcGxlbWVudCBgZXF1YWxzYCBhbmQgYGhhc2hDb2RlYC5cbiAgICpcbiAgICogYGVxdWFsc2AgdGFrZXMgYW5vdGhlciBvYmplY3QsIHByZXN1bWFibHkgb2Ygc2ltaWxhciB0eXBlLCBhbmQgcmV0dXJucyB0cnVlXG4gICAqIGlmIHRoZSBpdCBpcyBlcXVhbC4gRXF1YWxpdHkgaXMgc3ltbWV0cmljYWwsIHNvIHRoZSBzYW1lIHJlc3VsdCBzaG91bGQgYmVcbiAgICogcmV0dXJuZWQgaWYgdGhpcyBhbmQgdGhlIGFyZ3VtZW50IGFyZSBmbGlwcGVkLlxuICAgKlxuICAgKiAgICAgYXNzZXJ0KCBhLmVxdWFscyhiKSA9PT0gYi5lcXVhbHMoYSkgKTtcbiAgICpcbiAgICogYGhhc2hDb2RlYCByZXR1cm5zIGEgMzJiaXQgaW50ZWdlciBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBvYmplY3Qgd2hpY2ggd2lsbFxuICAgKiBiZSB1c2VkIHRvIGRldGVybWluZSBob3cgdG8gc3RvcmUgdGhlIHZhbHVlIG9iamVjdCBpbiBhIE1hcCBvciBTZXQuIFlvdSBtdXN0XG4gICAqIHByb3ZpZGUgYm90aCBvciBuZWl0aGVyIG1ldGhvZHMsIG9uZSBtdXN0IG5vdCBleGlzdCB3aXRob3V0IHRoZSBvdGhlci5cbiAgICpcbiAgICogQWxzbywgYW4gaW1wb3J0YW50IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZXNlIG1ldGhvZHMgbXVzdCBiZSB1cGhlbGQ6IGlmIHR3b1xuICAgKiB2YWx1ZXMgYXJlIGVxdWFsLCB0aGV5ICptdXN0KiByZXR1cm4gdGhlIHNhbWUgaGFzaENvZGUuIElmIHRoZSB2YWx1ZXMgYXJlIG5vdFxuICAgKiBlcXVhbCwgdGhleSBtaWdodCBoYXZlIHRoZSBzYW1lIGhhc2hDb2RlOyB0aGlzIGlzIGNhbGxlZCBhIGhhc2ggY29sbGlzaW9uLFxuICAgKiBhbmQgd2hpbGUgdW5kZXNpcmFibGUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGl0IGlzIGFjY2VwdGFibGUuXG4gICAqXG4gICAqICAgICBpZiAoYS5lcXVhbHMoYikpIHtcbiAgICogICAgICAgYXNzZXJ0KCBhLmhhc2hDb2RlKCkgPT09IGIuaGFzaENvZGUoKSApO1xuICAgKiAgICAgfVxuICAgKlxuICAgKiBBbGwgSW1tdXRhYmxlIGNvbGxlY3Rpb25zIGltcGxlbWVudCBgZXF1YWxzYCBhbmQgYGhhc2hDb2RlYC5cbiAgICpcbiAgICovXG4gIGZ1bmN0aW9uIGlzKHZhbHVlQSwgdmFsdWVCKSB7XG4gICAgaWYgKHZhbHVlQSA9PT0gdmFsdWVCIHx8ICh2YWx1ZUEgIT09IHZhbHVlQSAmJiB2YWx1ZUIgIT09IHZhbHVlQikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXZhbHVlQSB8fCAhdmFsdWVCKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWVBLnZhbHVlT2YgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIHZhbHVlQi52YWx1ZU9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YWx1ZUEgPSB2YWx1ZUEudmFsdWVPZigpO1xuICAgICAgdmFsdWVCID0gdmFsdWVCLnZhbHVlT2YoKTtcbiAgICAgIGlmICh2YWx1ZUEgPT09IHZhbHVlQiB8fCAodmFsdWVBICE9PSB2YWx1ZUEgJiYgdmFsdWVCICE9PSB2YWx1ZUIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKCF2YWx1ZUEgfHwgIXZhbHVlQikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWVBLmVxdWFscyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICB0eXBlb2YgdmFsdWVCLmVxdWFscyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgICB2YWx1ZUEuZXF1YWxzKHZhbHVlQikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBkZWVwRXF1YWwoYSwgYikge1xuICAgIGlmIChhID09PSBiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAhaXNJdGVyYWJsZShiKSB8fFxuICAgICAgYS5zaXplICE9PSB1bmRlZmluZWQgJiYgYi5zaXplICE9PSB1bmRlZmluZWQgJiYgYS5zaXplICE9PSBiLnNpemUgfHxcbiAgICAgIGEuX19oYXNoICE9PSB1bmRlZmluZWQgJiYgYi5fX2hhc2ggIT09IHVuZGVmaW5lZCAmJiBhLl9faGFzaCAhPT0gYi5fX2hhc2ggfHxcbiAgICAgIGlzS2V5ZWQoYSkgIT09IGlzS2V5ZWQoYikgfHxcbiAgICAgIGlzSW5kZXhlZChhKSAhPT0gaXNJbmRleGVkKGIpIHx8XG4gICAgICBpc09yZGVyZWQoYSkgIT09IGlzT3JkZXJlZChiKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChhLnNpemUgPT09IDAgJiYgYi5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB2YXIgbm90QXNzb2NpYXRpdmUgPSAhaXNBc3NvY2lhdGl2ZShhKTtcblxuICAgIGlmIChpc09yZGVyZWQoYSkpIHtcbiAgICAgIHZhciBlbnRyaWVzID0gYS5lbnRyaWVzKCk7XG4gICAgICByZXR1cm4gYi5ldmVyeShmdW5jdGlvbih2LCBrKSAge1xuICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzLm5leHQoKS52YWx1ZTtcbiAgICAgICAgcmV0dXJuIGVudHJ5ICYmIGlzKGVudHJ5WzFdLCB2KSAmJiAobm90QXNzb2NpYXRpdmUgfHwgaXMoZW50cnlbMF0sIGspKTtcbiAgICAgIH0pICYmIGVudHJpZXMubmV4dCgpLmRvbmU7XG4gICAgfVxuXG4gICAgdmFyIGZsaXBwZWQgPSBmYWxzZTtcblxuICAgIGlmIChhLnNpemUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGIuc2l6ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgYS5jYWNoZVJlc3VsdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGEuY2FjaGVSZXN1bHQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmxpcHBlZCA9IHRydWU7XG4gICAgICAgIHZhciBfID0gYTtcbiAgICAgICAgYSA9IGI7XG4gICAgICAgIGIgPSBfO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBhbGxFcXVhbCA9IHRydWU7XG4gICAgdmFyIGJTaXplID0gYi5fX2l0ZXJhdGUoZnVuY3Rpb24odiwgaykgIHtcbiAgICAgIGlmIChub3RBc3NvY2lhdGl2ZSA/ICFhLmhhcyh2KSA6XG4gICAgICAgICAgZmxpcHBlZCA/ICFpcyh2LCBhLmdldChrLCBOT1RfU0VUKSkgOiAhaXMoYS5nZXQoaywgTk9UX1NFVCksIHYpKSB7XG4gICAgICAgIGFsbEVxdWFsID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBhbGxFcXVhbCAmJiBhLnNpemUgPT09IGJTaXplO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoUmVwZWF0LCBJbmRleGVkU2VxKTtcblxuICAgIGZ1bmN0aW9uIFJlcGVhdCh2YWx1ZSwgdGltZXMpIHtcbiAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZXBlYXQpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVwZWF0KHZhbHVlLCB0aW1lcyk7XG4gICAgICB9XG4gICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5zaXplID0gdGltZXMgPT09IHVuZGVmaW5lZCA/IEluZmluaXR5IDogTWF0aC5tYXgoMCwgdGltZXMpO1xuICAgICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICBpZiAoRU1QVFlfUkVQRUFUKSB7XG4gICAgICAgICAgcmV0dXJuIEVNUFRZX1JFUEVBVDtcbiAgICAgICAgfVxuICAgICAgICBFTVBUWV9SRVBFQVQgPSB0aGlzO1xuICAgICAgfVxuICAgIH1cblxuICAgIFJlcGVhdC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuICdSZXBlYXQgW10nO1xuICAgICAgfVxuICAgICAgcmV0dXJuICdSZXBlYXQgWyAnICsgdGhpcy5fdmFsdWUgKyAnICcgKyB0aGlzLnNpemUgKyAnIHRpbWVzIF0nO1xuICAgIH07XG5cbiAgICBSZXBlYXQucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGluZGV4LCBub3RTZXRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzKGluZGV4KSA/IHRoaXMuX3ZhbHVlIDogbm90U2V0VmFsdWU7XG4gICAgfTtcblxuICAgIFJlcGVhdC5wcm90b3R5cGUuaW5jbHVkZXMgPSBmdW5jdGlvbihzZWFyY2hWYWx1ZSkge1xuICAgICAgcmV0dXJuIGlzKHRoaXMuX3ZhbHVlLCBzZWFyY2hWYWx1ZSk7XG4gICAgfTtcblxuICAgIFJlcGVhdC5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbihiZWdpbiwgZW5kKSB7XG4gICAgICB2YXIgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgIHJldHVybiB3aG9sZVNsaWNlKGJlZ2luLCBlbmQsIHNpemUpID8gdGhpcyA6XG4gICAgICAgIG5ldyBSZXBlYXQodGhpcy5fdmFsdWUsIHJlc29sdmVFbmQoZW5kLCBzaXplKSAtIHJlc29sdmVCZWdpbihiZWdpbiwgc2l6ZSkpO1xuICAgIH07XG5cbiAgICBSZXBlYXQucHJvdG90eXBlLnJldmVyc2UgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG5cbiAgICBSZXBlYXQucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbihzZWFyY2hWYWx1ZSkge1xuICAgICAgaWYgKGlzKHRoaXMuX3ZhbHVlLCBzZWFyY2hWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gLTE7XG4gICAgfTtcblxuICAgIFJlcGVhdC5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbihzZWFyY2hWYWx1ZSkge1xuICAgICAgaWYgKGlzKHRoaXMuX3ZhbHVlLCBzZWFyY2hWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2l6ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiAtMTtcbiAgICB9O1xuXG4gICAgUmVwZWF0LnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge1xuICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IHRoaXMuc2l6ZTsgaWkrKykge1xuICAgICAgICBpZiAoZm4odGhpcy5fdmFsdWUsIGlpLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gaWkgKyAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaWk7XG4gICAgfTtcblxuICAgIFJlcGVhdC5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uKHR5cGUsIHJldmVyc2UpIHt2YXIgdGhpcyQwID0gdGhpcztcbiAgICAgIHZhciBpaSA9IDA7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkgXG4gICAgICAgIHtyZXR1cm4gaWkgPCB0aGlzJDAuc2l6ZSA/IGl0ZXJhdG9yVmFsdWUodHlwZSwgaWkrKywgdGhpcyQwLl92YWx1ZSkgOiBpdGVyYXRvckRvbmUoKX1cbiAgICAgICk7XG4gICAgfTtcblxuICAgIFJlcGVhdC5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24ob3RoZXIpIHtcbiAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIFJlcGVhdCA/XG4gICAgICAgIGlzKHRoaXMuX3ZhbHVlLCBvdGhlci5fdmFsdWUpIDpcbiAgICAgICAgZGVlcEVxdWFsKG90aGVyKTtcbiAgICB9O1xuXG5cbiAgdmFyIEVNUFRZX1JFUEVBVDtcblxuICBmdW5jdGlvbiBpbnZhcmlhbnQoY29uZGl0aW9uLCBlcnJvcikge1xuICAgIGlmICghY29uZGl0aW9uKSB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoUmFuZ2UsIEluZGV4ZWRTZXEpO1xuXG4gICAgZnVuY3Rpb24gUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCkge1xuICAgICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJhbmdlKSkge1xuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXApO1xuICAgICAgfVxuICAgICAgaW52YXJpYW50KHN0ZXAgIT09IDAsICdDYW5ub3Qgc3RlcCBhIFJhbmdlIGJ5IDAnKTtcbiAgICAgIHN0YXJ0ID0gc3RhcnQgfHwgMDtcbiAgICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBlbmQgPSBJbmZpbml0eTtcbiAgICAgIH1cbiAgICAgIHN0ZXAgPSBzdGVwID09PSB1bmRlZmluZWQgPyAxIDogTWF0aC5hYnMoc3RlcCk7XG4gICAgICBpZiAoZW5kIDwgc3RhcnQpIHtcbiAgICAgICAgc3RlcCA9IC1zdGVwO1xuICAgICAgfVxuICAgICAgdGhpcy5fc3RhcnQgPSBzdGFydDtcbiAgICAgIHRoaXMuX2VuZCA9IGVuZDtcbiAgICAgIHRoaXMuX3N0ZXAgPSBzdGVwO1xuICAgICAgdGhpcy5zaXplID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChlbmQgLSBzdGFydCkgLyBzdGVwIC0gMSkgKyAxKTtcbiAgICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgICAgaWYgKEVNUFRZX1JBTkdFKSB7XG4gICAgICAgICAgcmV0dXJuIEVNUFRZX1JBTkdFO1xuICAgICAgICB9XG4gICAgICAgIEVNUFRZX1JBTkdFID0gdGhpcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBSYW5nZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuICdSYW5nZSBbXSc7XG4gICAgICB9XG4gICAgICByZXR1cm4gJ1JhbmdlIFsgJyArXG4gICAgICAgIHRoaXMuX3N0YXJ0ICsgJy4uLicgKyB0aGlzLl9lbmQgK1xuICAgICAgICAodGhpcy5fc3RlcCAhPT0gMSA/ICcgYnkgJyArIHRoaXMuX3N0ZXAgOiAnJykgK1xuICAgICAgJyBdJztcbiAgICB9O1xuXG4gICAgUmFuZ2UucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGluZGV4LCBub3RTZXRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzKGluZGV4KSA/XG4gICAgICAgIHRoaXMuX3N0YXJ0ICsgd3JhcEluZGV4KHRoaXMsIGluZGV4KSAqIHRoaXMuX3N0ZXAgOlxuICAgICAgICBub3RTZXRWYWx1ZTtcbiAgICB9O1xuXG4gICAgUmFuZ2UucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24oc2VhcmNoVmFsdWUpIHtcbiAgICAgIHZhciBwb3NzaWJsZUluZGV4ID0gKHNlYXJjaFZhbHVlIC0gdGhpcy5fc3RhcnQpIC8gdGhpcy5fc3RlcDtcbiAgICAgIHJldHVybiBwb3NzaWJsZUluZGV4ID49IDAgJiZcbiAgICAgICAgcG9zc2libGVJbmRleCA8IHRoaXMuc2l6ZSAmJlxuICAgICAgICBwb3NzaWJsZUluZGV4ID09PSBNYXRoLmZsb29yKHBvc3NpYmxlSW5kZXgpO1xuICAgIH07XG5cbiAgICBSYW5nZS5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbihiZWdpbiwgZW5kKSB7XG4gICAgICBpZiAod2hvbGVTbGljZShiZWdpbiwgZW5kLCB0aGlzLnNpemUpKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgYmVnaW4gPSByZXNvbHZlQmVnaW4oYmVnaW4sIHRoaXMuc2l6ZSk7XG4gICAgICBlbmQgPSByZXNvbHZlRW5kKGVuZCwgdGhpcy5zaXplKTtcbiAgICAgIGlmIChlbmQgPD0gYmVnaW4pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSgwLCAwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmFuZ2UodGhpcy5nZXQoYmVnaW4sIHRoaXMuX2VuZCksIHRoaXMuZ2V0KGVuZCwgdGhpcy5fZW5kKSwgdGhpcy5fc3RlcCk7XG4gICAgfTtcblxuICAgIFJhbmdlLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24oc2VhcmNoVmFsdWUpIHtcbiAgICAgIHZhciBvZmZzZXRWYWx1ZSA9IHNlYXJjaFZhbHVlIC0gdGhpcy5fc3RhcnQ7XG4gICAgICBpZiAob2Zmc2V0VmFsdWUgJSB0aGlzLl9zdGVwID09PSAwKSB7XG4gICAgICAgIHZhciBpbmRleCA9IG9mZnNldFZhbHVlIC8gdGhpcy5fc3RlcDtcbiAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnNpemUpIHtcbiAgICAgICAgICByZXR1cm4gaW5kZXhcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH07XG5cbiAgICBSYW5nZS5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbihzZWFyY2hWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW5kZXhPZihzZWFyY2hWYWx1ZSk7XG4gICAgfTtcblxuICAgIFJhbmdlLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge1xuICAgICAgdmFyIG1heEluZGV4ID0gdGhpcy5zaXplIC0gMTtcbiAgICAgIHZhciBzdGVwID0gdGhpcy5fc3RlcDtcbiAgICAgIHZhciB2YWx1ZSA9IHJldmVyc2UgPyB0aGlzLl9zdGFydCArIG1heEluZGV4ICogc3RlcCA6IHRoaXMuX3N0YXJ0O1xuICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8PSBtYXhJbmRleDsgaWkrKykge1xuICAgICAgICBpZiAoZm4odmFsdWUsIGlpLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gaWkgKyAxO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlICs9IHJldmVyc2UgPyAtc3RlcCA6IHN0ZXA7XG4gICAgICB9XG4gICAgICByZXR1cm4gaWk7XG4gICAgfTtcblxuICAgIFJhbmdlLnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgICAgdmFyIG1heEluZGV4ID0gdGhpcy5zaXplIC0gMTtcbiAgICAgIHZhciBzdGVwID0gdGhpcy5fc3RlcDtcbiAgICAgIHZhciB2YWx1ZSA9IHJldmVyc2UgPyB0aGlzLl9zdGFydCArIG1heEluZGV4ICogc3RlcCA6IHRoaXMuX3N0YXJ0O1xuICAgICAgdmFyIGlpID0gMDtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24oKSAge1xuICAgICAgICB2YXIgdiA9IHZhbHVlO1xuICAgICAgICB2YWx1ZSArPSByZXZlcnNlID8gLXN0ZXAgOiBzdGVwO1xuICAgICAgICByZXR1cm4gaWkgPiBtYXhJbmRleCA/IGl0ZXJhdG9yRG9uZSgpIDogaXRlcmF0b3JWYWx1ZSh0eXBlLCBpaSsrLCB2KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBSYW5nZS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24ob3RoZXIpIHtcbiAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIFJhbmdlID9cbiAgICAgICAgdGhpcy5fc3RhcnQgPT09IG90aGVyLl9zdGFydCAmJlxuICAgICAgICB0aGlzLl9lbmQgPT09IG90aGVyLl9lbmQgJiZcbiAgICAgICAgdGhpcy5fc3RlcCA9PT0gb3RoZXIuX3N0ZXAgOlxuICAgICAgICBkZWVwRXF1YWwodGhpcywgb3RoZXIpO1xuICAgIH07XG5cblxuICB2YXIgRU1QVFlfUkFOR0U7XG5cbiAgY3JlYXRlQ2xhc3MoQ29sbGVjdGlvbiwgSXRlcmFibGUpO1xuICAgIGZ1bmN0aW9uIENvbGxlY3Rpb24oKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ0Fic3RyYWN0Jyk7XG4gICAgfVxuXG5cbiAgY3JlYXRlQ2xhc3MoS2V5ZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uKTtmdW5jdGlvbiBLZXllZENvbGxlY3Rpb24oKSB7fVxuXG4gIGNyZWF0ZUNsYXNzKEluZGV4ZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uKTtmdW5jdGlvbiBJbmRleGVkQ29sbGVjdGlvbigpIHt9XG5cbiAgY3JlYXRlQ2xhc3MoU2V0Q29sbGVjdGlvbiwgQ29sbGVjdGlvbik7ZnVuY3Rpb24gU2V0Q29sbGVjdGlvbigpIHt9XG5cblxuICBDb2xsZWN0aW9uLktleWVkID0gS2V5ZWRDb2xsZWN0aW9uO1xuICBDb2xsZWN0aW9uLkluZGV4ZWQgPSBJbmRleGVkQ29sbGVjdGlvbjtcbiAgQ29sbGVjdGlvbi5TZXQgPSBTZXRDb2xsZWN0aW9uO1xuXG4gIHZhciBpbXVsID1cbiAgICB0eXBlb2YgTWF0aC5pbXVsID09PSAnZnVuY3Rpb24nICYmIE1hdGguaW11bCgweGZmZmZmZmZmLCAyKSA9PT0gLTIgP1xuICAgIE1hdGguaW11bCA6XG4gICAgZnVuY3Rpb24gaW11bChhLCBiKSB7XG4gICAgICBhID0gYSB8IDA7IC8vIGludFxuICAgICAgYiA9IGIgfCAwOyAvLyBpbnRcbiAgICAgIHZhciBjID0gYSAmIDB4ZmZmZjtcbiAgICAgIHZhciBkID0gYiAmIDB4ZmZmZjtcbiAgICAgIC8vIFNoaWZ0IGJ5IDAgZml4ZXMgdGhlIHNpZ24gb24gdGhlIGhpZ2ggcGFydC5cbiAgICAgIHJldHVybiAoYyAqIGQpICsgKCgoKGEgPj4+IDE2KSAqIGQgKyBjICogKGIgPj4+IDE2KSkgPDwgMTYpID4+PiAwKSB8IDA7IC8vIGludFxuICAgIH07XG5cbiAgLy8gdjggaGFzIGFuIG9wdGltaXphdGlvbiBmb3Igc3RvcmluZyAzMS1iaXQgc2lnbmVkIG51bWJlcnMuXG4gIC8vIFZhbHVlcyB3aGljaCBoYXZlIGVpdGhlciAwMCBvciAxMSBhcyB0aGUgaGlnaCBvcmRlciBiaXRzIHF1YWxpZnkuXG4gIC8vIFRoaXMgZnVuY3Rpb24gZHJvcHMgdGhlIGhpZ2hlc3Qgb3JkZXIgYml0IGluIGEgc2lnbmVkIG51bWJlciwgbWFpbnRhaW5pbmdcbiAgLy8gdGhlIHNpZ24gYml0LlxuICBmdW5jdGlvbiBzbWkoaTMyKSB7XG4gICAgcmV0dXJuICgoaTMyID4+PiAxKSAmIDB4NDAwMDAwMDApIHwgKGkzMiAmIDB4QkZGRkZGRkYpO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzaChvKSB7XG4gICAgaWYgKG8gPT09IGZhbHNlIHx8IG8gPT09IG51bGwgfHwgbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvLnZhbHVlT2YgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG8gPSBvLnZhbHVlT2YoKTtcbiAgICAgIGlmIChvID09PSBmYWxzZSB8fCBvID09PSBudWxsIHx8IG8gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG8gPT09IHRydWUpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICB2YXIgdHlwZSA9IHR5cGVvZiBvO1xuICAgIGlmICh0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKG8gIT09IG8gfHwgbyA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICB2YXIgaCA9IG8gfCAwO1xuICAgICAgaWYgKGggIT09IG8pIHtcbiAgICAgICAgaCBePSBvICogMHhGRkZGRkZGRjtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChvID4gMHhGRkZGRkZGRikge1xuICAgICAgICBvIC89IDB4RkZGRkZGRkY7XG4gICAgICAgIGggXj0gbztcbiAgICAgIH1cbiAgICAgIHJldHVybiBzbWkoaCk7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG8ubGVuZ3RoID4gU1RSSU5HX0hBU0hfQ0FDSEVfTUlOX1NUUkxFTiA/IGNhY2hlZEhhc2hTdHJpbmcobykgOiBoYXNoU3RyaW5nKG8pO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG8uaGFzaENvZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBvLmhhc2hDb2RlKCk7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGhhc2hKU09iaihvKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvLnRvU3RyaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaGFzaFN0cmluZyhvLnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZhbHVlIHR5cGUgJyArIHR5cGUgKyAnIGNhbm5vdCBiZSBoYXNoZWQuJyk7XG4gIH1cblxuICBmdW5jdGlvbiBjYWNoZWRIYXNoU3RyaW5nKHN0cmluZykge1xuICAgIHZhciBoYXNoID0gc3RyaW5nSGFzaENhY2hlW3N0cmluZ107XG4gICAgaWYgKGhhc2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzaCA9IGhhc2hTdHJpbmcoc3RyaW5nKTtcbiAgICAgIGlmIChTVFJJTkdfSEFTSF9DQUNIRV9TSVpFID09PSBTVFJJTkdfSEFTSF9DQUNIRV9NQVhfU0laRSkge1xuICAgICAgICBTVFJJTkdfSEFTSF9DQUNIRV9TSVpFID0gMDtcbiAgICAgICAgc3RyaW5nSGFzaENhY2hlID0ge307XG4gICAgICB9XG4gICAgICBTVFJJTkdfSEFTSF9DQUNIRV9TSVpFKys7XG4gICAgICBzdHJpbmdIYXNoQ2FjaGVbc3RyaW5nXSA9IGhhc2g7XG4gICAgfVxuICAgIHJldHVybiBoYXNoO1xuICB9XG5cbiAgLy8gaHR0cDovL2pzcGVyZi5jb20vaGFzaGluZy1zdHJpbmdzXG4gIGZ1bmN0aW9uIGhhc2hTdHJpbmcoc3RyaW5nKSB7XG4gICAgLy8gVGhpcyBpcyB0aGUgaGFzaCBmcm9tIEpWTVxuICAgIC8vIFRoZSBoYXNoIGNvZGUgZm9yIGEgc3RyaW5nIGlzIGNvbXB1dGVkIGFzXG4gICAgLy8gc1swXSAqIDMxIF4gKG4gLSAxKSArIHNbMV0gKiAzMSBeIChuIC0gMikgKyAuLi4gKyBzW24gLSAxXSxcbiAgICAvLyB3aGVyZSBzW2ldIGlzIHRoZSBpdGggY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcgYW5kIG4gaXMgdGhlIGxlbmd0aCBvZlxuICAgIC8vIHRoZSBzdHJpbmcuIFdlIFwibW9kXCIgdGhlIHJlc3VsdCB0byBtYWtlIGl0IGJldHdlZW4gMCAoaW5jbHVzaXZlKSBhbmQgMl4zMVxuICAgIC8vIChleGNsdXNpdmUpIGJ5IGRyb3BwaW5nIGhpZ2ggYml0cy5cbiAgICB2YXIgaGFzaCA9IDA7XG4gICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IHN0cmluZy5sZW5ndGg7IGlpKyspIHtcbiAgICAgIGhhc2ggPSAzMSAqIGhhc2ggKyBzdHJpbmcuY2hhckNvZGVBdChpaSkgfCAwO1xuICAgIH1cbiAgICByZXR1cm4gc21pKGhhc2gpO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzaEpTT2JqKG9iaikge1xuICAgIHZhciBoYXNoO1xuICAgIGlmICh1c2luZ1dlYWtNYXApIHtcbiAgICAgIGhhc2ggPSB3ZWFrTWFwLmdldChvYmopO1xuICAgICAgaWYgKGhhc2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gaGFzaDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBoYXNoID0gb2JqW1VJRF9IQVNIX0tFWV07XG4gICAgaWYgKGhhc2ggIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGhhc2g7XG4gICAgfVxuXG4gICAgaWYgKCFjYW5EZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgaGFzaCA9IG9iai5wcm9wZXJ0eUlzRW51bWVyYWJsZSAmJiBvYmoucHJvcGVydHlJc0VudW1lcmFibGVbVUlEX0hBU0hfS0VZXTtcbiAgICAgIGlmIChoYXNoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGhhc2g7XG4gICAgICB9XG5cbiAgICAgIGhhc2ggPSBnZXRJRU5vZGVIYXNoKG9iaik7XG4gICAgICBpZiAoaGFzaCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBoYXNoO1xuICAgICAgfVxuICAgIH1cblxuICAgIGhhc2ggPSArK29iakhhc2hVSUQ7XG4gICAgaWYgKG9iakhhc2hVSUQgJiAweDQwMDAwMDAwKSB7XG4gICAgICBvYmpIYXNoVUlEID0gMDtcbiAgICB9XG5cbiAgICBpZiAodXNpbmdXZWFrTWFwKSB7XG4gICAgICB3ZWFrTWFwLnNldChvYmosIGhhc2gpO1xuICAgIH0gZWxzZSBpZiAoaXNFeHRlbnNpYmxlICE9PSB1bmRlZmluZWQgJiYgaXNFeHRlbnNpYmxlKG9iaikgPT09IGZhbHNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vbi1leHRlbnNpYmxlIG9iamVjdHMgYXJlIG5vdCBhbGxvd2VkIGFzIGtleXMuJyk7XG4gICAgfSBlbHNlIGlmIChjYW5EZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgVUlEX0hBU0hfS0VZLCB7XG4gICAgICAgICdlbnVtZXJhYmxlJzogZmFsc2UsXG4gICAgICAgICdjb25maWd1cmFibGUnOiBmYWxzZSxcbiAgICAgICAgJ3dyaXRhYmxlJzogZmFsc2UsXG4gICAgICAgICd2YWx1ZSc6IGhhc2hcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAob2JqLnByb3BlcnR5SXNFbnVtZXJhYmxlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgIG9iai5wcm9wZXJ0eUlzRW51bWVyYWJsZSA9PT0gb2JqLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSkge1xuICAgICAgLy8gU2luY2Ugd2UgY2FuJ3QgZGVmaW5lIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgb24gdGhlIG9iamVjdFxuICAgICAgLy8gd2UnbGwgaGlqYWNrIG9uZSBvZiB0aGUgbGVzcy11c2VkIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMgdG9cbiAgICAgIC8vIHNhdmUgb3VyIGhhc2ggb24gaXQuIFNpbmNlIHRoaXMgaXMgYSBmdW5jdGlvbiBpdCB3aWxsIG5vdCBzaG93IHVwIGluXG4gICAgICAvLyBgSlNPTi5zdHJpbmdpZnlgIHdoaWNoIGlzIHdoYXQgd2Ugd2FudC5cbiAgICAgIG9iai5wcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgICBvYmoucHJvcGVydHlJc0VudW1lcmFibGVbVUlEX0hBU0hfS0VZXSA9IGhhc2g7XG4gICAgfSBlbHNlIGlmIChvYmoubm9kZVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBjb3VsZG4ndCBnZXQgdGhlIElFIGB1bmlxdWVJRGAgdG8gdXNlIGFzIGEgaGFzaFxuICAgICAgLy8gYW5kIHdlIGNvdWxkbid0IHVzZSBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IHRvIGV4cGxvaXQgdGhlXG4gICAgICAvLyBkb250RW51bSBidWcgc28gd2Ugc2ltcGx5IGFkZCB0aGUgYFVJRF9IQVNIX0tFWWAgb24gdGhlIG5vZGVcbiAgICAgIC8vIGl0c2VsZi5cbiAgICAgIG9ialtVSURfSEFTSF9LRVldID0gaGFzaDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gc2V0IGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHkgb24gb2JqZWN0LicpO1xuICAgIH1cblxuICAgIHJldHVybiBoYXNoO1xuICB9XG5cbiAgLy8gR2V0IHJlZmVyZW5jZXMgdG8gRVM1IG9iamVjdCBtZXRob2RzLlxuICB2YXIgaXNFeHRlbnNpYmxlID0gT2JqZWN0LmlzRXh0ZW5zaWJsZTtcblxuICAvLyBUcnVlIGlmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSB3b3JrcyBhcyBleHBlY3RlZC4gSUU4IGZhaWxzIHRoaXMgdGVzdC5cbiAgdmFyIGNhbkRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkge1xuICAgIHRyeSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdAJywge30pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSgpKTtcblxuICAvLyBJRSBoYXMgYSBgdW5pcXVlSURgIHByb3BlcnR5IG9uIERPTSBub2Rlcy4gV2UgY2FuIGNvbnN0cnVjdCB0aGUgaGFzaCBmcm9tIGl0XG4gIC8vIGFuZCBhdm9pZCBtZW1vcnkgbGVha3MgZnJvbSB0aGUgSUUgY2xvbmVOb2RlIGJ1Zy5cbiAgZnVuY3Rpb24gZ2V0SUVOb2RlSGFzaChub2RlKSB7XG4gICAgaWYgKG5vZGUgJiYgbm9kZS5ub2RlVHlwZSA+IDApIHtcbiAgICAgIHN3aXRjaCAobm9kZS5ub2RlVHlwZSkge1xuICAgICAgICBjYXNlIDE6IC8vIEVsZW1lbnRcbiAgICAgICAgICByZXR1cm4gbm9kZS51bmlxdWVJRDtcbiAgICAgICAgY2FzZSA5OiAvLyBEb2N1bWVudFxuICAgICAgICAgIHJldHVybiBub2RlLmRvY3VtZW50RWxlbWVudCAmJiBub2RlLmRvY3VtZW50RWxlbWVudC51bmlxdWVJRDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBJZiBwb3NzaWJsZSwgdXNlIGEgV2Vha01hcC5cbiAgdmFyIHVzaW5nV2Vha01hcCA9IHR5cGVvZiBXZWFrTWFwID09PSAnZnVuY3Rpb24nO1xuICB2YXIgd2Vha01hcDtcbiAgaWYgKHVzaW5nV2Vha01hcCkge1xuICAgIHdlYWtNYXAgPSBuZXcgV2Vha01hcCgpO1xuICB9XG5cbiAgdmFyIG9iakhhc2hVSUQgPSAwO1xuXG4gIHZhciBVSURfSEFTSF9LRVkgPSAnX19pbW11dGFibGVoYXNoX18nO1xuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIFVJRF9IQVNIX0tFWSA9IFN5bWJvbChVSURfSEFTSF9LRVkpO1xuICB9XG5cbiAgdmFyIFNUUklOR19IQVNIX0NBQ0hFX01JTl9TVFJMRU4gPSAxNjtcbiAgdmFyIFNUUklOR19IQVNIX0NBQ0hFX01BWF9TSVpFID0gMjU1O1xuICB2YXIgU1RSSU5HX0hBU0hfQ0FDSEVfU0laRSA9IDA7XG4gIHZhciBzdHJpbmdIYXNoQ2FjaGUgPSB7fTtcblxuICBmdW5jdGlvbiBhc3NlcnROb3RJbmZpbml0ZShzaXplKSB7XG4gICAgaW52YXJpYW50KFxuICAgICAgc2l6ZSAhPT0gSW5maW5pdHksXG4gICAgICAnQ2Fubm90IHBlcmZvcm0gdGhpcyBhY3Rpb24gd2l0aCBhbiBpbmZpbml0ZSBzaXplLidcbiAgICApO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoTWFwLCBLZXllZENvbGxlY3Rpb24pO1xuXG4gICAgLy8gQHByYWdtYSBDb25zdHJ1Y3Rpb25cblxuICAgIGZ1bmN0aW9uIE1hcCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgPyBlbXB0eU1hcCgpIDpcbiAgICAgICAgaXNNYXAodmFsdWUpICYmICFpc09yZGVyZWQodmFsdWUpID8gdmFsdWUgOlxuICAgICAgICBlbXB0eU1hcCgpLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24obWFwICkge1xuICAgICAgICAgIHZhciBpdGVyID0gS2V5ZWRJdGVyYWJsZSh2YWx1ZSk7XG4gICAgICAgICAgYXNzZXJ0Tm90SW5maW5pdGUoaXRlci5zaXplKTtcbiAgICAgICAgICBpdGVyLmZvckVhY2goZnVuY3Rpb24odiwgaykgIHtyZXR1cm4gbWFwLnNldChrLCB2KX0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBNYXAub2YgPSBmdW5jdGlvbigpIHt2YXIga2V5VmFsdWVzID0gU0xJQ0UkMC5jYWxsKGFyZ3VtZW50cywgMCk7XG4gICAgICByZXR1cm4gZW1wdHlNYXAoKS53aXRoTXV0YXRpb25zKGZ1bmN0aW9uKG1hcCApIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlWYWx1ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICBpZiAoaSArIDEgPj0ga2V5VmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHZhbHVlIGZvciBrZXk6ICcgKyBrZXlWYWx1ZXNbaV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXAuc2V0KGtleVZhbHVlc1tpXSwga2V5VmFsdWVzW2kgKyAxXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBNYXAucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCdNYXAgeycsICd9Jyk7XG4gICAgfTtcblxuICAgIC8vIEBwcmFnbWEgQWNjZXNzXG5cbiAgICBNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGssIG5vdFNldFZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcm9vdCA/XG4gICAgICAgIHRoaXMuX3Jvb3QuZ2V0KDAsIHVuZGVmaW5lZCwgaywgbm90U2V0VmFsdWUpIDpcbiAgICAgICAgbm90U2V0VmFsdWU7XG4gICAgfTtcblxuICAgIC8vIEBwcmFnbWEgTW9kaWZpY2F0aW9uXG5cbiAgICBNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKGssIHYpIHtcbiAgICAgIHJldHVybiB1cGRhdGVNYXAodGhpcywgaywgdik7XG4gICAgfTtcblxuICAgIE1hcC5wcm90b3R5cGUuc2V0SW4gPSBmdW5jdGlvbihrZXlQYXRoLCB2KSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVJbihrZXlQYXRoLCBOT1RfU0VULCBmdW5jdGlvbigpICB7cmV0dXJuIHZ9KTtcbiAgICB9O1xuXG4gICAgTWFwLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbihrKSB7XG4gICAgICByZXR1cm4gdXBkYXRlTWFwKHRoaXMsIGssIE5PVF9TRVQpO1xuICAgIH07XG5cbiAgICBNYXAucHJvdG90eXBlLmRlbGV0ZUluID0gZnVuY3Rpb24oa2V5UGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlSW4oa2V5UGF0aCwgZnVuY3Rpb24oKSAge3JldHVybiBOT1RfU0VUfSk7XG4gICAgfTtcblxuICAgIE1hcC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oaywgbm90U2V0VmFsdWUsIHVwZGF0ZXIpIHtcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID9cbiAgICAgICAgayh0aGlzKSA6XG4gICAgICAgIHRoaXMudXBkYXRlSW4oW2tdLCBub3RTZXRWYWx1ZSwgdXBkYXRlcik7XG4gICAgfTtcblxuICAgIE1hcC5wcm90b3R5cGUudXBkYXRlSW4gPSBmdW5jdGlvbihrZXlQYXRoLCBub3RTZXRWYWx1ZSwgdXBkYXRlcikge1xuICAgICAgaWYgKCF1cGRhdGVyKSB7XG4gICAgICAgIHVwZGF0ZXIgPSBub3RTZXRWYWx1ZTtcbiAgICAgICAgbm90U2V0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICB2YXIgdXBkYXRlZFZhbHVlID0gdXBkYXRlSW5EZWVwTWFwKFxuICAgICAgICB0aGlzLFxuICAgICAgICBmb3JjZUl0ZXJhdG9yKGtleVBhdGgpLFxuICAgICAgICBub3RTZXRWYWx1ZSxcbiAgICAgICAgdXBkYXRlclxuICAgICAgKTtcbiAgICAgIHJldHVybiB1cGRhdGVkVmFsdWUgPT09IE5PVF9TRVQgPyB1bmRlZmluZWQgOiB1cGRhdGVkVmFsdWU7XG4gICAgfTtcblxuICAgIE1hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICh0aGlzLnNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fX293bmVySUQpIHtcbiAgICAgICAgdGhpcy5zaXplID0gMDtcbiAgICAgICAgdGhpcy5fcm9vdCA9IG51bGw7XG4gICAgICAgIHRoaXMuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9fYWx0ZXJlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVtcHR5TWFwKCk7XG4gICAgfTtcblxuICAgIC8vIEBwcmFnbWEgQ29tcG9zaXRpb25cblxuICAgIE1hcC5wcm90b3R5cGUubWVyZ2UgPSBmdW5jdGlvbigvKi4uLml0ZXJzKi8pIHtcbiAgICAgIHJldHVybiBtZXJnZUludG9NYXBXaXRoKHRoaXMsIHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgTWFwLnByb3RvdHlwZS5tZXJnZVdpdGggPSBmdW5jdGlvbihtZXJnZXIpIHt2YXIgaXRlcnMgPSBTTElDRSQwLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgIHJldHVybiBtZXJnZUludG9NYXBXaXRoKHRoaXMsIG1lcmdlciwgaXRlcnMpO1xuICAgIH07XG5cbiAgICBNYXAucHJvdG90eXBlLm1lcmdlSW4gPSBmdW5jdGlvbihrZXlQYXRoKSB7dmFyIGl0ZXJzID0gU0xJQ0UkMC5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVJbihcbiAgICAgICAga2V5UGF0aCxcbiAgICAgICAgZW1wdHlNYXAoKSxcbiAgICAgICAgZnVuY3Rpb24obSApIHtyZXR1cm4gdHlwZW9mIG0ubWVyZ2UgPT09ICdmdW5jdGlvbicgP1xuICAgICAgICAgIG0ubWVyZ2UuYXBwbHkobSwgaXRlcnMpIDpcbiAgICAgICAgICBpdGVyc1tpdGVycy5sZW5ndGggLSAxXX1cbiAgICAgICk7XG4gICAgfTtcblxuICAgIE1hcC5wcm90b3R5cGUubWVyZ2VEZWVwID0gZnVuY3Rpb24oLyouLi5pdGVycyovKSB7XG4gICAgICByZXR1cm4gbWVyZ2VJbnRvTWFwV2l0aCh0aGlzLCBkZWVwTWVyZ2VyLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBNYXAucHJvdG90eXBlLm1lcmdlRGVlcFdpdGggPSBmdW5jdGlvbihtZXJnZXIpIHt2YXIgaXRlcnMgPSBTTElDRSQwLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgIHJldHVybiBtZXJnZUludG9NYXBXaXRoKHRoaXMsIGRlZXBNZXJnZXJXaXRoKG1lcmdlciksIGl0ZXJzKTtcbiAgICB9O1xuXG4gICAgTWFwLnByb3RvdHlwZS5tZXJnZURlZXBJbiA9IGZ1bmN0aW9uKGtleVBhdGgpIHt2YXIgaXRlcnMgPSBTTElDRSQwLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUluKFxuICAgICAgICBrZXlQYXRoLFxuICAgICAgICBlbXB0eU1hcCgpLFxuICAgICAgICBmdW5jdGlvbihtICkge3JldHVybiB0eXBlb2YgbS5tZXJnZURlZXAgPT09ICdmdW5jdGlvbicgP1xuICAgICAgICAgIG0ubWVyZ2VEZWVwLmFwcGx5KG0sIGl0ZXJzKSA6XG4gICAgICAgICAgaXRlcnNbaXRlcnMubGVuZ3RoIC0gMV19XG4gICAgICApO1xuICAgIH07XG5cbiAgICBNYXAucHJvdG90eXBlLnNvcnQgPSBmdW5jdGlvbihjb21wYXJhdG9yKSB7XG4gICAgICAvLyBMYXRlIGJpbmRpbmdcbiAgICAgIHJldHVybiBPcmRlcmVkTWFwKHNvcnRGYWN0b3J5KHRoaXMsIGNvbXBhcmF0b3IpKTtcbiAgICB9O1xuXG4gICAgTWFwLnByb3RvdHlwZS5zb3J0QnkgPSBmdW5jdGlvbihtYXBwZXIsIGNvbXBhcmF0b3IpIHtcbiAgICAgIC8vIExhdGUgYmluZGluZ1xuICAgICAgcmV0dXJuIE9yZGVyZWRNYXAoc29ydEZhY3RvcnkodGhpcywgY29tcGFyYXRvciwgbWFwcGVyKSk7XG4gICAgfTtcblxuICAgIC8vIEBwcmFnbWEgTXV0YWJpbGl0eVxuXG4gICAgTWFwLnByb3RvdHlwZS53aXRoTXV0YXRpb25zID0gZnVuY3Rpb24oZm4pIHtcbiAgICAgIHZhciBtdXRhYmxlID0gdGhpcy5hc011dGFibGUoKTtcbiAgICAgIGZuKG11dGFibGUpO1xuICAgICAgcmV0dXJuIG11dGFibGUud2FzQWx0ZXJlZCgpID8gbXV0YWJsZS5fX2Vuc3VyZU93bmVyKHRoaXMuX19vd25lcklEKSA6IHRoaXM7XG4gICAgfTtcblxuICAgIE1hcC5wcm90b3R5cGUuYXNNdXRhYmxlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX293bmVySUQgPyB0aGlzIDogdGhpcy5fX2Vuc3VyZU93bmVyKG5ldyBPd25lcklEKCkpO1xuICAgIH07XG5cbiAgICBNYXAucHJvdG90eXBlLmFzSW1tdXRhYmxlID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2Vuc3VyZU93bmVyKCk7XG4gICAgfTtcblxuICAgIE1hcC5wcm90b3R5cGUud2FzQWx0ZXJlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX19hbHRlcmVkO1xuICAgIH07XG5cbiAgICBNYXAucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgICByZXR1cm4gbmV3IE1hcEl0ZXJhdG9yKHRoaXMsIHR5cGUsIHJldmVyc2UpO1xuICAgIH07XG5cbiAgICBNYXAucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7dmFyIHRoaXMkMCA9IHRoaXM7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICB0aGlzLl9yb290ICYmIHRoaXMuX3Jvb3QuaXRlcmF0ZShmdW5jdGlvbihlbnRyeSApIHtcbiAgICAgICAgaXRlcmF0aW9ucysrO1xuICAgICAgICByZXR1cm4gZm4oZW50cnlbMV0sIGVudHJ5WzBdLCB0aGlzJDApO1xuICAgICAgfSwgcmV2ZXJzZSk7XG4gICAgICByZXR1cm4gaXRlcmF0aW9ucztcbiAgICB9O1xuXG4gICAgTWFwLnByb3RvdHlwZS5fX2Vuc3VyZU93bmVyID0gZnVuY3Rpb24ob3duZXJJRCkge1xuICAgICAgaWYgKG93bmVySUQgPT09IHRoaXMuX19vd25lcklEKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgaWYgKCFvd25lcklEKSB7XG4gICAgICAgIHRoaXMuX19vd25lcklEID0gb3duZXJJRDtcbiAgICAgICAgdGhpcy5fX2FsdGVyZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWFrZU1hcCh0aGlzLnNpemUsIHRoaXMuX3Jvb3QsIG93bmVySUQsIHRoaXMuX19oYXNoKTtcbiAgICB9O1xuXG5cbiAgZnVuY3Rpb24gaXNNYXAobWF5YmVNYXApIHtcbiAgICByZXR1cm4gISEobWF5YmVNYXAgJiYgbWF5YmVNYXBbSVNfTUFQX1NFTlRJTkVMXSk7XG4gIH1cblxuICBNYXAuaXNNYXAgPSBpc01hcDtcblxuICB2YXIgSVNfTUFQX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfTUFQX19AQCc7XG5cbiAgdmFyIE1hcFByb3RvdHlwZSA9IE1hcC5wcm90b3R5cGU7XG4gIE1hcFByb3RvdHlwZVtJU19NQVBfU0VOVElORUxdID0gdHJ1ZTtcbiAgTWFwUHJvdG90eXBlW0RFTEVURV0gPSBNYXBQcm90b3R5cGUucmVtb3ZlO1xuICBNYXBQcm90b3R5cGUucmVtb3ZlSW4gPSBNYXBQcm90b3R5cGUuZGVsZXRlSW47XG5cblxuICAvLyAjcHJhZ21hIFRyaWUgTm9kZXNcblxuXG5cbiAgICBmdW5jdGlvbiBBcnJheU1hcE5vZGUob3duZXJJRCwgZW50cmllcykge1xuICAgICAgdGhpcy5vd25lcklEID0gb3duZXJJRDtcbiAgICAgIHRoaXMuZW50cmllcyA9IGVudHJpZXM7XG4gICAgfVxuXG4gICAgQXJyYXlNYXBOb2RlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihzaGlmdCwga2V5SGFzaCwga2V5LCBub3RTZXRWYWx1ZSkge1xuICAgICAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG4gICAgICBmb3IgKHZhciBpaSA9IDAsIGxlbiA9IGVudHJpZXMubGVuZ3RoOyBpaSA8IGxlbjsgaWkrKykge1xuICAgICAgICBpZiAoaXMoa2V5LCBlbnRyaWVzW2lpXVswXSkpIHtcbiAgICAgICAgICByZXR1cm4gZW50cmllc1tpaV1bMV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBub3RTZXRWYWx1ZTtcbiAgICB9O1xuXG4gICAgQXJyYXlNYXBOb2RlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbihvd25lcklELCBzaGlmdCwga2V5SGFzaCwga2V5LCB2YWx1ZSwgZGlkQ2hhbmdlU2l6ZSwgZGlkQWx0ZXIpIHtcbiAgICAgIHZhciByZW1vdmVkID0gdmFsdWUgPT09IE5PVF9TRVQ7XG5cbiAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuICAgICAgdmFyIGlkeCA9IDA7XG4gICAgICBmb3IgKHZhciBsZW4gPSBlbnRyaWVzLmxlbmd0aDsgaWR4IDwgbGVuOyBpZHgrKykge1xuICAgICAgICBpZiAoaXMoa2V5LCBlbnRyaWVzW2lkeF1bMF0pKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBleGlzdHMgPSBpZHggPCBsZW47XG5cbiAgICAgIGlmIChleGlzdHMgPyBlbnRyaWVzW2lkeF1bMV0gPT09IHZhbHVlIDogcmVtb3ZlZCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgU2V0UmVmKGRpZEFsdGVyKTtcbiAgICAgIChyZW1vdmVkIHx8ICFleGlzdHMpICYmIFNldFJlZihkaWRDaGFuZ2VTaXplKTtcblxuICAgICAgaWYgKHJlbW92ZWQgJiYgZW50cmllcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuOyAvLyB1bmRlZmluZWRcbiAgICAgIH1cblxuICAgICAgaWYgKCFleGlzdHMgJiYgIXJlbW92ZWQgJiYgZW50cmllcy5sZW5ndGggPj0gTUFYX0FSUkFZX01BUF9TSVpFKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVOb2Rlcyhvd25lcklELCBlbnRyaWVzLCBrZXksIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGlzRWRpdGFibGUgPSBvd25lcklEICYmIG93bmVySUQgPT09IHRoaXMub3duZXJJRDtcbiAgICAgIHZhciBuZXdFbnRyaWVzID0gaXNFZGl0YWJsZSA/IGVudHJpZXMgOiBhcnJDb3B5KGVudHJpZXMpO1xuXG4gICAgICBpZiAoZXhpc3RzKSB7XG4gICAgICAgIGlmIChyZW1vdmVkKSB7XG4gICAgICAgICAgaWR4ID09PSBsZW4gLSAxID8gbmV3RW50cmllcy5wb3AoKSA6IChuZXdFbnRyaWVzW2lkeF0gPSBuZXdFbnRyaWVzLnBvcCgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdFbnRyaWVzW2lkeF0gPSBba2V5LCB2YWx1ZV07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld0VudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNFZGl0YWJsZSkge1xuICAgICAgICB0aGlzLmVudHJpZXMgPSBuZXdFbnRyaWVzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBBcnJheU1hcE5vZGUob3duZXJJRCwgbmV3RW50cmllcyk7XG4gICAgfTtcblxuXG5cblxuICAgIGZ1bmN0aW9uIEJpdG1hcEluZGV4ZWROb2RlKG93bmVySUQsIGJpdG1hcCwgbm9kZXMpIHtcbiAgICAgIHRoaXMub3duZXJJRCA9IG93bmVySUQ7XG4gICAgICB0aGlzLmJpdG1hcCA9IGJpdG1hcDtcbiAgICAgIHRoaXMubm9kZXMgPSBub2RlcztcbiAgICB9XG5cbiAgICBCaXRtYXBJbmRleGVkTm9kZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oc2hpZnQsIGtleUhhc2gsIGtleSwgbm90U2V0VmFsdWUpIHtcbiAgICAgIGlmIChrZXlIYXNoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAga2V5SGFzaCA9IGhhc2goa2V5KTtcbiAgICAgIH1cbiAgICAgIHZhciBiaXQgPSAoMSA8PCAoKHNoaWZ0ID09PSAwID8ga2V5SGFzaCA6IGtleUhhc2ggPj4+IHNoaWZ0KSAmIE1BU0spKTtcbiAgICAgIHZhciBiaXRtYXAgPSB0aGlzLmJpdG1hcDtcbiAgICAgIHJldHVybiAoYml0bWFwICYgYml0KSA9PT0gMCA/IG5vdFNldFZhbHVlIDpcbiAgICAgICAgdGhpcy5ub2Rlc1twb3BDb3VudChiaXRtYXAgJiAoYml0IC0gMSkpXS5nZXQoc2hpZnQgKyBTSElGVCwga2V5SGFzaCwga2V5LCBub3RTZXRWYWx1ZSk7XG4gICAgfTtcblxuICAgIEJpdG1hcEluZGV4ZWROb2RlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbihvd25lcklELCBzaGlmdCwga2V5SGFzaCwga2V5LCB2YWx1ZSwgZGlkQ2hhbmdlU2l6ZSwgZGlkQWx0ZXIpIHtcbiAgICAgIGlmIChrZXlIYXNoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAga2V5SGFzaCA9IGhhc2goa2V5KTtcbiAgICAgIH1cbiAgICAgIHZhciBrZXlIYXNoRnJhZyA9IChzaGlmdCA9PT0gMCA/IGtleUhhc2ggOiBrZXlIYXNoID4+PiBzaGlmdCkgJiBNQVNLO1xuICAgICAgdmFyIGJpdCA9IDEgPDwga2V5SGFzaEZyYWc7XG4gICAgICB2YXIgYml0bWFwID0gdGhpcy5iaXRtYXA7XG4gICAgICB2YXIgZXhpc3RzID0gKGJpdG1hcCAmIGJpdCkgIT09IDA7XG5cbiAgICAgIGlmICghZXhpc3RzICYmIHZhbHVlID09PSBOT1RfU0VUKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICB2YXIgaWR4ID0gcG9wQ291bnQoYml0bWFwICYgKGJpdCAtIDEpKTtcbiAgICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXM7XG4gICAgICB2YXIgbm9kZSA9IGV4aXN0cyA/IG5vZGVzW2lkeF0gOiB1bmRlZmluZWQ7XG4gICAgICB2YXIgbmV3Tm9kZSA9IHVwZGF0ZU5vZGUobm9kZSwgb3duZXJJRCwgc2hpZnQgKyBTSElGVCwga2V5SGFzaCwga2V5LCB2YWx1ZSwgZGlkQ2hhbmdlU2l6ZSwgZGlkQWx0ZXIpO1xuXG4gICAgICBpZiAobmV3Tm9kZSA9PT0gbm9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgaWYgKCFleGlzdHMgJiYgbmV3Tm9kZSAmJiBub2Rlcy5sZW5ndGggPj0gTUFYX0JJVE1BUF9JTkRFWEVEX1NJWkUpIHtcbiAgICAgICAgcmV0dXJuIGV4cGFuZE5vZGVzKG93bmVySUQsIG5vZGVzLCBiaXRtYXAsIGtleUhhc2hGcmFnLCBuZXdOb2RlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV4aXN0cyAmJiAhbmV3Tm9kZSAmJiBub2Rlcy5sZW5ndGggPT09IDIgJiYgaXNMZWFmTm9kZShub2Rlc1tpZHggXiAxXSkpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVzW2lkeCBeIDFdO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhpc3RzICYmIG5ld05vZGUgJiYgbm9kZXMubGVuZ3RoID09PSAxICYmIGlzTGVhZk5vZGUobmV3Tm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIG5ld05vZGU7XG4gICAgICB9XG5cbiAgICAgIHZhciBpc0VkaXRhYmxlID0gb3duZXJJRCAmJiBvd25lcklEID09PSB0aGlzLm93bmVySUQ7XG4gICAgICB2YXIgbmV3Qml0bWFwID0gZXhpc3RzID8gbmV3Tm9kZSA/IGJpdG1hcCA6IGJpdG1hcCBeIGJpdCA6IGJpdG1hcCB8IGJpdDtcbiAgICAgIHZhciBuZXdOb2RlcyA9IGV4aXN0cyA/IG5ld05vZGUgP1xuICAgICAgICBzZXRJbihub2RlcywgaWR4LCBuZXdOb2RlLCBpc0VkaXRhYmxlKSA6XG4gICAgICAgIHNwbGljZU91dChub2RlcywgaWR4LCBpc0VkaXRhYmxlKSA6XG4gICAgICAgIHNwbGljZUluKG5vZGVzLCBpZHgsIG5ld05vZGUsIGlzRWRpdGFibGUpO1xuXG4gICAgICBpZiAoaXNFZGl0YWJsZSkge1xuICAgICAgICB0aGlzLmJpdG1hcCA9IG5ld0JpdG1hcDtcbiAgICAgICAgdGhpcy5ub2RlcyA9IG5ld05vZGVzO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5ldyBCaXRtYXBJbmRleGVkTm9kZShvd25lcklELCBuZXdCaXRtYXAsIG5ld05vZGVzKTtcbiAgICB9O1xuXG5cblxuXG4gICAgZnVuY3Rpb24gSGFzaEFycmF5TWFwTm9kZShvd25lcklELCBjb3VudCwgbm9kZXMpIHtcbiAgICAgIHRoaXMub3duZXJJRCA9IG93bmVySUQ7XG4gICAgICB0aGlzLmNvdW50ID0gY291bnQ7XG4gICAgICB0aGlzLm5vZGVzID0gbm9kZXM7XG4gICAgfVxuXG4gICAgSGFzaEFycmF5TWFwTm9kZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oc2hpZnQsIGtleUhhc2gsIGtleSwgbm90U2V0VmFsdWUpIHtcbiAgICAgIGlmIChrZXlIYXNoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAga2V5SGFzaCA9IGhhc2goa2V5KTtcbiAgICAgIH1cbiAgICAgIHZhciBpZHggPSAoc2hpZnQgPT09IDAgPyBrZXlIYXNoIDoga2V5SGFzaCA+Pj4gc2hpZnQpICYgTUFTSztcbiAgICAgIHZhciBub2RlID0gdGhpcy5ub2Rlc1tpZHhdO1xuICAgICAgcmV0dXJuIG5vZGUgPyBub2RlLmdldChzaGlmdCArIFNISUZULCBrZXlIYXNoLCBrZXksIG5vdFNldFZhbHVlKSA6IG5vdFNldFZhbHVlO1xuICAgIH07XG5cbiAgICBIYXNoQXJyYXlNYXBOb2RlLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbihvd25lcklELCBzaGlmdCwga2V5SGFzaCwga2V5LCB2YWx1ZSwgZGlkQ2hhbmdlU2l6ZSwgZGlkQWx0ZXIpIHtcbiAgICAgIGlmIChrZXlIYXNoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAga2V5SGFzaCA9IGhhc2goa2V5KTtcbiAgICAgIH1cbiAgICAgIHZhciBpZHggPSAoc2hpZnQgPT09IDAgPyBrZXlIYXNoIDoga2V5SGFzaCA+Pj4gc2hpZnQpICYgTUFTSztcbiAgICAgIHZhciByZW1vdmVkID0gdmFsdWUgPT09IE5PVF9TRVQ7XG4gICAgICB2YXIgbm9kZXMgPSB0aGlzLm5vZGVzO1xuICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpZHhdO1xuXG4gICAgICBpZiAocmVtb3ZlZCAmJiAhbm9kZSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdmFyIG5ld05vZGUgPSB1cGRhdGVOb2RlKG5vZGUsIG93bmVySUQsIHNoaWZ0ICsgU0hJRlQsIGtleUhhc2gsIGtleSwgdmFsdWUsIGRpZENoYW5nZVNpemUsIGRpZEFsdGVyKTtcbiAgICAgIGlmIChuZXdOb2RlID09PSBub2RlKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3Q291bnQgPSB0aGlzLmNvdW50O1xuICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgIG5ld0NvdW50Kys7XG4gICAgICB9IGVsc2UgaWYgKCFuZXdOb2RlKSB7XG4gICAgICAgIG5ld0NvdW50LS07XG4gICAgICAgIGlmIChuZXdDb3VudCA8IE1JTl9IQVNIX0FSUkFZX01BUF9TSVpFKSB7XG4gICAgICAgICAgcmV0dXJuIHBhY2tOb2Rlcyhvd25lcklELCBub2RlcywgbmV3Q291bnQsIGlkeCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGlzRWRpdGFibGUgPSBvd25lcklEICYmIG93bmVySUQgPT09IHRoaXMub3duZXJJRDtcbiAgICAgIHZhciBuZXdOb2RlcyA9IHNldEluKG5vZGVzLCBpZHgsIG5ld05vZGUsIGlzRWRpdGFibGUpO1xuXG4gICAgICBpZiAoaXNFZGl0YWJsZSkge1xuICAgICAgICB0aGlzLmNvdW50ID0gbmV3Q291bnQ7XG4gICAgICAgIHRoaXMubm9kZXMgPSBuZXdOb2RlcztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgSGFzaEFycmF5TWFwTm9kZShvd25lcklELCBuZXdDb3VudCwgbmV3Tm9kZXMpO1xuICAgIH07XG5cblxuXG5cbiAgICBmdW5jdGlvbiBIYXNoQ29sbGlzaW9uTm9kZShvd25lcklELCBrZXlIYXNoLCBlbnRyaWVzKSB7XG4gICAgICB0aGlzLm93bmVySUQgPSBvd25lcklEO1xuICAgICAgdGhpcy5rZXlIYXNoID0ga2V5SGFzaDtcbiAgICAgIHRoaXMuZW50cmllcyA9IGVudHJpZXM7XG4gICAgfVxuXG4gICAgSGFzaENvbGxpc2lvbk5vZGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKHNoaWZ0LCBrZXlIYXNoLCBrZXksIG5vdFNldFZhbHVlKSB7XG4gICAgICB2YXIgZW50cmllcyA9IHRoaXMuZW50cmllcztcbiAgICAgIGZvciAodmFyIGlpID0gMCwgbGVuID0gZW50cmllcy5sZW5ndGg7IGlpIDwgbGVuOyBpaSsrKSB7XG4gICAgICAgIGlmIChpcyhrZXksIGVudHJpZXNbaWldWzBdKSkge1xuICAgICAgICAgIHJldHVybiBlbnRyaWVzW2lpXVsxXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5vdFNldFZhbHVlO1xuICAgIH07XG5cbiAgICBIYXNoQ29sbGlzaW9uTm9kZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24ob3duZXJJRCwgc2hpZnQsIGtleUhhc2gsIGtleSwgdmFsdWUsIGRpZENoYW5nZVNpemUsIGRpZEFsdGVyKSB7XG4gICAgICBpZiAoa2V5SGFzaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGtleUhhc2ggPSBoYXNoKGtleSk7XG4gICAgICB9XG5cbiAgICAgIHZhciByZW1vdmVkID0gdmFsdWUgPT09IE5PVF9TRVQ7XG5cbiAgICAgIGlmIChrZXlIYXNoICE9PSB0aGlzLmtleUhhc2gpIHtcbiAgICAgICAgaWYgKHJlbW92ZWQpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBTZXRSZWYoZGlkQWx0ZXIpO1xuICAgICAgICBTZXRSZWYoZGlkQ2hhbmdlU2l6ZSk7XG4gICAgICAgIHJldHVybiBtZXJnZUludG9Ob2RlKHRoaXMsIG93bmVySUQsIHNoaWZ0LCBrZXlIYXNoLCBba2V5LCB2YWx1ZV0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgZW50cmllcyA9IHRoaXMuZW50cmllcztcbiAgICAgIHZhciBpZHggPSAwO1xuICAgICAgZm9yICh2YXIgbGVuID0gZW50cmllcy5sZW5ndGg7IGlkeCA8IGxlbjsgaWR4KyspIHtcbiAgICAgICAgaWYgKGlzKGtleSwgZW50cmllc1tpZHhdWzBdKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgZXhpc3RzID0gaWR4IDwgbGVuO1xuXG4gICAgICBpZiAoZXhpc3RzID8gZW50cmllc1tpZHhdWzFdID09PSB2YWx1ZSA6IHJlbW92ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG5cbiAgICAgIFNldFJlZihkaWRBbHRlcik7XG4gICAgICAocmVtb3ZlZCB8fCAhZXhpc3RzKSAmJiBTZXRSZWYoZGlkQ2hhbmdlU2l6ZSk7XG5cbiAgICAgIGlmIChyZW1vdmVkICYmIGxlbiA9PT0gMikge1xuICAgICAgICByZXR1cm4gbmV3IFZhbHVlTm9kZShvd25lcklELCB0aGlzLmtleUhhc2gsIGVudHJpZXNbaWR4IF4gMV0pO1xuICAgICAgfVxuXG4gICAgICB2YXIgaXNFZGl0YWJsZSA9IG93bmVySUQgJiYgb3duZXJJRCA9PT0gdGhpcy5vd25lcklEO1xuICAgICAgdmFyIG5ld0VudHJpZXMgPSBpc0VkaXRhYmxlID8gZW50cmllcyA6IGFyckNvcHkoZW50cmllcyk7XG5cbiAgICAgIGlmIChleGlzdHMpIHtcbiAgICAgICAgaWYgKHJlbW92ZWQpIHtcbiAgICAgICAgICBpZHggPT09IGxlbiAtIDEgPyBuZXdFbnRyaWVzLnBvcCgpIDogKG5ld0VudHJpZXNbaWR4XSA9IG5ld0VudHJpZXMucG9wKCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0VudHJpZXNbaWR4XSA9IFtrZXksIHZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3RW50cmllcy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0VkaXRhYmxlKSB7XG4gICAgICAgIHRoaXMuZW50cmllcyA9IG5ld0VudHJpZXM7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IEhhc2hDb2xsaXNpb25Ob2RlKG93bmVySUQsIHRoaXMua2V5SGFzaCwgbmV3RW50cmllcyk7XG4gICAgfTtcblxuXG5cblxuICAgIGZ1bmN0aW9uIFZhbHVlTm9kZShvd25lcklELCBrZXlIYXNoLCBlbnRyeSkge1xuICAgICAgdGhpcy5vd25lcklEID0gb3duZXJJRDtcbiAgICAgIHRoaXMua2V5SGFzaCA9IGtleUhhc2g7XG4gICAgICB0aGlzLmVudHJ5ID0gZW50cnk7XG4gICAgfVxuXG4gICAgVmFsdWVOb2RlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihzaGlmdCwga2V5SGFzaCwga2V5LCBub3RTZXRWYWx1ZSkge1xuICAgICAgcmV0dXJuIGlzKGtleSwgdGhpcy5lbnRyeVswXSkgPyB0aGlzLmVudHJ5WzFdIDogbm90U2V0VmFsdWU7XG4gICAgfTtcblxuICAgIFZhbHVlTm9kZS5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24ob3duZXJJRCwgc2hpZnQsIGtleUhhc2gsIGtleSwgdmFsdWUsIGRpZENoYW5nZVNpemUsIGRpZEFsdGVyKSB7XG4gICAgICB2YXIgcmVtb3ZlZCA9IHZhbHVlID09PSBOT1RfU0VUO1xuICAgICAgdmFyIGtleU1hdGNoID0gaXMoa2V5LCB0aGlzLmVudHJ5WzBdKTtcbiAgICAgIGlmIChrZXlNYXRjaCA/IHZhbHVlID09PSB0aGlzLmVudHJ5WzFdIDogcmVtb3ZlZCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgU2V0UmVmKGRpZEFsdGVyKTtcblxuICAgICAgaWYgKHJlbW92ZWQpIHtcbiAgICAgICAgU2V0UmVmKGRpZENoYW5nZVNpemUpO1xuICAgICAgICByZXR1cm47IC8vIHVuZGVmaW5lZFxuICAgICAgfVxuXG4gICAgICBpZiAoa2V5TWF0Y2gpIHtcbiAgICAgICAgaWYgKG93bmVySUQgJiYgb3duZXJJRCA9PT0gdGhpcy5vd25lcklEKSB7XG4gICAgICAgICAgdGhpcy5lbnRyeVsxXSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgVmFsdWVOb2RlKG93bmVySUQsIHRoaXMua2V5SGFzaCwgW2tleSwgdmFsdWVdKTtcbiAgICAgIH1cblxuICAgICAgU2V0UmVmKGRpZENoYW5nZVNpemUpO1xuICAgICAgcmV0dXJuIG1lcmdlSW50b05vZGUodGhpcywgb3duZXJJRCwgc2hpZnQsIGhhc2goa2V5KSwgW2tleSwgdmFsdWVdKTtcbiAgICB9O1xuXG5cblxuICAvLyAjcHJhZ21hIEl0ZXJhdG9yc1xuXG4gIEFycmF5TWFwTm9kZS5wcm90b3R5cGUuaXRlcmF0ZSA9XG4gIEhhc2hDb2xsaXNpb25Ob2RlLnByb3RvdHlwZS5pdGVyYXRlID0gZnVuY3Rpb24gKGZuLCByZXZlcnNlKSB7XG4gICAgdmFyIGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG4gICAgZm9yICh2YXIgaWkgPSAwLCBtYXhJbmRleCA9IGVudHJpZXMubGVuZ3RoIC0gMTsgaWkgPD0gbWF4SW5kZXg7IGlpKyspIHtcbiAgICAgIGlmIChmbihlbnRyaWVzW3JldmVyc2UgPyBtYXhJbmRleCAtIGlpIDogaWldKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEJpdG1hcEluZGV4ZWROb2RlLnByb3RvdHlwZS5pdGVyYXRlID1cbiAgSGFzaEFycmF5TWFwTm9kZS5wcm90b3R5cGUuaXRlcmF0ZSA9IGZ1bmN0aW9uIChmbiwgcmV2ZXJzZSkge1xuICAgIHZhciBub2RlcyA9IHRoaXMubm9kZXM7XG4gICAgZm9yICh2YXIgaWkgPSAwLCBtYXhJbmRleCA9IG5vZGVzLmxlbmd0aCAtIDE7IGlpIDw9IG1heEluZGV4OyBpaSsrKSB7XG4gICAgICB2YXIgbm9kZSA9IG5vZGVzW3JldmVyc2UgPyBtYXhJbmRleCAtIGlpIDogaWldO1xuICAgICAgaWYgKG5vZGUgJiYgbm9kZS5pdGVyYXRlKGZuLCByZXZlcnNlKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIFZhbHVlTm9kZS5wcm90b3R5cGUuaXRlcmF0ZSA9IGZ1bmN0aW9uIChmbiwgcmV2ZXJzZSkge1xuICAgIHJldHVybiBmbih0aGlzLmVudHJ5KTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKE1hcEl0ZXJhdG9yLCBJdGVyYXRvcik7XG5cbiAgICBmdW5jdGlvbiBNYXBJdGVyYXRvcihtYXAsIHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICAgICAgdGhpcy5fcmV2ZXJzZSA9IHJldmVyc2U7XG4gICAgICB0aGlzLl9zdGFjayA9IG1hcC5fcm9vdCAmJiBtYXBJdGVyYXRvckZyYW1lKG1hcC5fcm9vdCk7XG4gICAgfVxuXG4gICAgTWFwSXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciB0eXBlID0gdGhpcy5fdHlwZTtcbiAgICAgIHZhciBzdGFjayA9IHRoaXMuX3N0YWNrO1xuICAgICAgd2hpbGUgKHN0YWNrKSB7XG4gICAgICAgIHZhciBub2RlID0gc3RhY2subm9kZTtcbiAgICAgICAgdmFyIGluZGV4ID0gc3RhY2suaW5kZXgrKztcbiAgICAgICAgdmFyIG1heEluZGV4O1xuICAgICAgICBpZiAobm9kZS5lbnRyeSkge1xuICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcEl0ZXJhdG9yVmFsdWUodHlwZSwgbm9kZS5lbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZW50cmllcykge1xuICAgICAgICAgIG1heEluZGV4ID0gbm9kZS5lbnRyaWVzLmxlbmd0aCAtIDE7XG4gICAgICAgICAgaWYgKGluZGV4IDw9IG1heEluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gbWFwSXRlcmF0b3JWYWx1ZSh0eXBlLCBub2RlLmVudHJpZXNbdGhpcy5fcmV2ZXJzZSA/IG1heEluZGV4IC0gaW5kZXggOiBpbmRleF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtYXhJbmRleCA9IG5vZGUubm9kZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICBpZiAoaW5kZXggPD0gbWF4SW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBzdWJOb2RlID0gbm9kZS5ub2Rlc1t0aGlzLl9yZXZlcnNlID8gbWF4SW5kZXggLSBpbmRleCA6IGluZGV4XTtcbiAgICAgICAgICAgIGlmIChzdWJOb2RlKSB7XG4gICAgICAgICAgICAgIGlmIChzdWJOb2RlLmVudHJ5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1hcEl0ZXJhdG9yVmFsdWUodHlwZSwgc3ViTm9kZS5lbnRyeSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3RhY2sgPSB0aGlzLl9zdGFjayA9IG1hcEl0ZXJhdG9yRnJhbWUoc3ViTm9kZSwgc3RhY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0YWNrID0gdGhpcy5fc3RhY2sgPSB0aGlzLl9zdGFjay5fX3ByZXY7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlcmF0b3JEb25lKCk7XG4gICAgfTtcblxuXG4gIGZ1bmN0aW9uIG1hcEl0ZXJhdG9yVmFsdWUodHlwZSwgZW50cnkpIHtcbiAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCBlbnRyeVswXSwgZW50cnlbMV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gbWFwSXRlcmF0b3JGcmFtZShub2RlLCBwcmV2KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vZGU6IG5vZGUsXG4gICAgICBpbmRleDogMCxcbiAgICAgIF9fcHJldjogcHJldlxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBtYWtlTWFwKHNpemUsIHJvb3QsIG93bmVySUQsIGhhc2gpIHtcbiAgICB2YXIgbWFwID0gT2JqZWN0LmNyZWF0ZShNYXBQcm90b3R5cGUpO1xuICAgIG1hcC5zaXplID0gc2l6ZTtcbiAgICBtYXAuX3Jvb3QgPSByb290O1xuICAgIG1hcC5fX293bmVySUQgPSBvd25lcklEO1xuICAgIG1hcC5fX2hhc2ggPSBoYXNoO1xuICAgIG1hcC5fX2FsdGVyZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgdmFyIEVNUFRZX01BUDtcbiAgZnVuY3Rpb24gZW1wdHlNYXAoKSB7XG4gICAgcmV0dXJuIEVNUFRZX01BUCB8fCAoRU1QVFlfTUFQID0gbWFrZU1hcCgwKSk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVNYXAobWFwLCBrLCB2KSB7XG4gICAgdmFyIG5ld1Jvb3Q7XG4gICAgdmFyIG5ld1NpemU7XG4gICAgaWYgKCFtYXAuX3Jvb3QpIHtcbiAgICAgIGlmICh2ID09PSBOT1RfU0VUKSB7XG4gICAgICAgIHJldHVybiBtYXA7XG4gICAgICB9XG4gICAgICBuZXdTaXplID0gMTtcbiAgICAgIG5ld1Jvb3QgPSBuZXcgQXJyYXlNYXBOb2RlKG1hcC5fX293bmVySUQsIFtbaywgdl1dKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGRpZENoYW5nZVNpemUgPSBNYWtlUmVmKENIQU5HRV9MRU5HVEgpO1xuICAgICAgdmFyIGRpZEFsdGVyID0gTWFrZVJlZihESURfQUxURVIpO1xuICAgICAgbmV3Um9vdCA9IHVwZGF0ZU5vZGUobWFwLl9yb290LCBtYXAuX19vd25lcklELCAwLCB1bmRlZmluZWQsIGssIHYsIGRpZENoYW5nZVNpemUsIGRpZEFsdGVyKTtcbiAgICAgIGlmICghZGlkQWx0ZXIudmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgIH1cbiAgICAgIG5ld1NpemUgPSBtYXAuc2l6ZSArIChkaWRDaGFuZ2VTaXplLnZhbHVlID8gdiA9PT0gTk9UX1NFVCA/IC0xIDogMSA6IDApO1xuICAgIH1cbiAgICBpZiAobWFwLl9fb3duZXJJRCkge1xuICAgICAgbWFwLnNpemUgPSBuZXdTaXplO1xuICAgICAgbWFwLl9yb290ID0gbmV3Um9vdDtcbiAgICAgIG1hcC5fX2hhc2ggPSB1bmRlZmluZWQ7XG4gICAgICBtYXAuX19hbHRlcmVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBtYXA7XG4gICAgfVxuICAgIHJldHVybiBuZXdSb290ID8gbWFrZU1hcChuZXdTaXplLCBuZXdSb290KSA6IGVtcHR5TWFwKCk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVOb2RlKG5vZGUsIG93bmVySUQsIHNoaWZ0LCBrZXlIYXNoLCBrZXksIHZhbHVlLCBkaWRDaGFuZ2VTaXplLCBkaWRBbHRlcikge1xuICAgIGlmICghbm9kZSkge1xuICAgICAgaWYgKHZhbHVlID09PSBOT1RfU0VUKSB7XG4gICAgICAgIHJldHVybiBub2RlO1xuICAgICAgfVxuICAgICAgU2V0UmVmKGRpZEFsdGVyKTtcbiAgICAgIFNldFJlZihkaWRDaGFuZ2VTaXplKTtcbiAgICAgIHJldHVybiBuZXcgVmFsdWVOb2RlKG93bmVySUQsIGtleUhhc2gsIFtrZXksIHZhbHVlXSk7XG4gICAgfVxuICAgIHJldHVybiBub2RlLnVwZGF0ZShvd25lcklELCBzaGlmdCwga2V5SGFzaCwga2V5LCB2YWx1ZSwgZGlkQ2hhbmdlU2l6ZSwgZGlkQWx0ZXIpO1xuICB9XG5cbiAgZnVuY3Rpb24gaXNMZWFmTm9kZShub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuY29uc3RydWN0b3IgPT09IFZhbHVlTm9kZSB8fCBub2RlLmNvbnN0cnVjdG9yID09PSBIYXNoQ29sbGlzaW9uTm9kZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlSW50b05vZGUobm9kZSwgb3duZXJJRCwgc2hpZnQsIGtleUhhc2gsIGVudHJ5KSB7XG4gICAgaWYgKG5vZGUua2V5SGFzaCA9PT0ga2V5SGFzaCkge1xuICAgICAgcmV0dXJuIG5ldyBIYXNoQ29sbGlzaW9uTm9kZShvd25lcklELCBrZXlIYXNoLCBbbm9kZS5lbnRyeSwgZW50cnldKTtcbiAgICB9XG5cbiAgICB2YXIgaWR4MSA9IChzaGlmdCA9PT0gMCA/IG5vZGUua2V5SGFzaCA6IG5vZGUua2V5SGFzaCA+Pj4gc2hpZnQpICYgTUFTSztcbiAgICB2YXIgaWR4MiA9IChzaGlmdCA9PT0gMCA/IGtleUhhc2ggOiBrZXlIYXNoID4+PiBzaGlmdCkgJiBNQVNLO1xuXG4gICAgdmFyIG5ld05vZGU7XG4gICAgdmFyIG5vZGVzID0gaWR4MSA9PT0gaWR4MiA/XG4gICAgICBbbWVyZ2VJbnRvTm9kZShub2RlLCBvd25lcklELCBzaGlmdCArIFNISUZULCBrZXlIYXNoLCBlbnRyeSldIDpcbiAgICAgICgobmV3Tm9kZSA9IG5ldyBWYWx1ZU5vZGUob3duZXJJRCwga2V5SGFzaCwgZW50cnkpKSwgaWR4MSA8IGlkeDIgPyBbbm9kZSwgbmV3Tm9kZV0gOiBbbmV3Tm9kZSwgbm9kZV0pO1xuXG4gICAgcmV0dXJuIG5ldyBCaXRtYXBJbmRleGVkTm9kZShvd25lcklELCAoMSA8PCBpZHgxKSB8ICgxIDw8IGlkeDIpLCBub2Rlcyk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVOb2Rlcyhvd25lcklELCBlbnRyaWVzLCBrZXksIHZhbHVlKSB7XG4gICAgaWYgKCFvd25lcklEKSB7XG4gICAgICBvd25lcklEID0gbmV3IE93bmVySUQoKTtcbiAgICB9XG4gICAgdmFyIG5vZGUgPSBuZXcgVmFsdWVOb2RlKG93bmVySUQsIGhhc2goa2V5KSwgW2tleSwgdmFsdWVdKTtcbiAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgZW50cmllcy5sZW5ndGg7IGlpKyspIHtcbiAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaWldO1xuICAgICAgbm9kZSA9IG5vZGUudXBkYXRlKG93bmVySUQsIDAsIHVuZGVmaW5lZCwgZW50cnlbMF0sIGVudHJ5WzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBmdW5jdGlvbiBwYWNrTm9kZXMob3duZXJJRCwgbm9kZXMsIGNvdW50LCBleGNsdWRpbmcpIHtcbiAgICB2YXIgYml0bWFwID0gMDtcbiAgICB2YXIgcGFja2VkSUkgPSAwO1xuICAgIHZhciBwYWNrZWROb2RlcyA9IG5ldyBBcnJheShjb3VudCk7XG4gICAgZm9yICh2YXIgaWkgPSAwLCBiaXQgPSAxLCBsZW4gPSBub2Rlcy5sZW5ndGg7IGlpIDwgbGVuOyBpaSsrLCBiaXQgPDw9IDEpIHtcbiAgICAgIHZhciBub2RlID0gbm9kZXNbaWldO1xuICAgICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCAmJiBpaSAhPT0gZXhjbHVkaW5nKSB7XG4gICAgICAgIGJpdG1hcCB8PSBiaXQ7XG4gICAgICAgIHBhY2tlZE5vZGVzW3BhY2tlZElJKytdID0gbm9kZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBCaXRtYXBJbmRleGVkTm9kZShvd25lcklELCBiaXRtYXAsIHBhY2tlZE5vZGVzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4cGFuZE5vZGVzKG93bmVySUQsIG5vZGVzLCBiaXRtYXAsIGluY2x1ZGluZywgbm9kZSkge1xuICAgIHZhciBjb3VudCA9IDA7XG4gICAgdmFyIGV4cGFuZGVkTm9kZXMgPSBuZXcgQXJyYXkoU0laRSk7XG4gICAgZm9yICh2YXIgaWkgPSAwOyBiaXRtYXAgIT09IDA7IGlpKyssIGJpdG1hcCA+Pj49IDEpIHtcbiAgICAgIGV4cGFuZGVkTm9kZXNbaWldID0gYml0bWFwICYgMSA/IG5vZGVzW2NvdW50KytdIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBleHBhbmRlZE5vZGVzW2luY2x1ZGluZ10gPSBub2RlO1xuICAgIHJldHVybiBuZXcgSGFzaEFycmF5TWFwTm9kZShvd25lcklELCBjb3VudCArIDEsIGV4cGFuZGVkTm9kZXMpO1xuICB9XG5cbiAgZnVuY3Rpb24gbWVyZ2VJbnRvTWFwV2l0aChtYXAsIG1lcmdlciwgaXRlcmFibGVzKSB7XG4gICAgdmFyIGl0ZXJzID0gW107XG4gICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGl0ZXJhYmxlcy5sZW5ndGg7IGlpKyspIHtcbiAgICAgIHZhciB2YWx1ZSA9IGl0ZXJhYmxlc1tpaV07XG4gICAgICB2YXIgaXRlciA9IEtleWVkSXRlcmFibGUodmFsdWUpO1xuICAgICAgaWYgKCFpc0l0ZXJhYmxlKHZhbHVlKSkge1xuICAgICAgICBpdGVyID0gaXRlci5tYXAoZnVuY3Rpb24odiApIHtyZXR1cm4gZnJvbUpTKHYpfSk7XG4gICAgICB9XG4gICAgICBpdGVycy5wdXNoKGl0ZXIpO1xuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VJbnRvQ29sbGVjdGlvbldpdGgobWFwLCBtZXJnZXIsIGl0ZXJzKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlZXBNZXJnZXIoZXhpc3RpbmcsIHZhbHVlLCBrZXkpIHtcbiAgICByZXR1cm4gZXhpc3RpbmcgJiYgZXhpc3RpbmcubWVyZ2VEZWVwICYmIGlzSXRlcmFibGUodmFsdWUpID9cbiAgICAgIGV4aXN0aW5nLm1lcmdlRGVlcCh2YWx1ZSkgOlxuICAgICAgaXMoZXhpc3RpbmcsIHZhbHVlKSA/IGV4aXN0aW5nIDogdmFsdWU7XG4gIH1cblxuICBmdW5jdGlvbiBkZWVwTWVyZ2VyV2l0aChtZXJnZXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oZXhpc3RpbmcsIHZhbHVlLCBrZXkpICB7XG4gICAgICBpZiAoZXhpc3RpbmcgJiYgZXhpc3RpbmcubWVyZ2VEZWVwV2l0aCAmJiBpc0l0ZXJhYmxlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gZXhpc3RpbmcubWVyZ2VEZWVwV2l0aChtZXJnZXIsIHZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHZhciBuZXh0VmFsdWUgPSBtZXJnZXIoZXhpc3RpbmcsIHZhbHVlLCBrZXkpO1xuICAgICAgcmV0dXJuIGlzKGV4aXN0aW5nLCBuZXh0VmFsdWUpID8gZXhpc3RpbmcgOiBuZXh0VmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1lcmdlSW50b0NvbGxlY3Rpb25XaXRoKGNvbGxlY3Rpb24sIG1lcmdlciwgaXRlcnMpIHtcbiAgICBpdGVycyA9IGl0ZXJzLmZpbHRlcihmdW5jdGlvbih4ICkge3JldHVybiB4LnNpemUgIT09IDB9KTtcbiAgICBpZiAoaXRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9XG4gICAgaWYgKGNvbGxlY3Rpb24uc2l6ZSA9PT0gMCAmJiAhY29sbGVjdGlvbi5fX293bmVySUQgJiYgaXRlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gY29sbGVjdGlvbi5jb25zdHJ1Y3RvcihpdGVyc1swXSk7XG4gICAgfVxuICAgIHJldHVybiBjb2xsZWN0aW9uLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24oY29sbGVjdGlvbiApIHtcbiAgICAgIHZhciBtZXJnZUludG9NYXAgPSBtZXJnZXIgP1xuICAgICAgICBmdW5jdGlvbih2YWx1ZSwga2V5KSAge1xuICAgICAgICAgIGNvbGxlY3Rpb24udXBkYXRlKGtleSwgTk9UX1NFVCwgZnVuY3Rpb24oZXhpc3RpbmcgKVxuICAgICAgICAgICAge3JldHVybiBleGlzdGluZyA9PT0gTk9UX1NFVCA/IHZhbHVlIDogbWVyZ2VyKGV4aXN0aW5nLCB2YWx1ZSwga2V5KX1cbiAgICAgICAgICApO1xuICAgICAgICB9IDpcbiAgICAgICAgZnVuY3Rpb24odmFsdWUsIGtleSkgIHtcbiAgICAgICAgICBjb2xsZWN0aW9uLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGl0ZXJzLmxlbmd0aDsgaWkrKykge1xuICAgICAgICBpdGVyc1tpaV0uZm9yRWFjaChtZXJnZUludG9NYXApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlSW5EZWVwTWFwKGV4aXN0aW5nLCBrZXlQYXRoSXRlciwgbm90U2V0VmFsdWUsIHVwZGF0ZXIpIHtcbiAgICB2YXIgaXNOb3RTZXQgPSBleGlzdGluZyA9PT0gTk9UX1NFVDtcbiAgICB2YXIgc3RlcCA9IGtleVBhdGhJdGVyLm5leHQoKTtcbiAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICB2YXIgZXhpc3RpbmdWYWx1ZSA9IGlzTm90U2V0ID8gbm90U2V0VmFsdWUgOiBleGlzdGluZztcbiAgICAgIHZhciBuZXdWYWx1ZSA9IHVwZGF0ZXIoZXhpc3RpbmdWYWx1ZSk7XG4gICAgICByZXR1cm4gbmV3VmFsdWUgPT09IGV4aXN0aW5nVmFsdWUgPyBleGlzdGluZyA6IG5ld1ZhbHVlO1xuICAgIH1cbiAgICBpbnZhcmlhbnQoXG4gICAgICBpc05vdFNldCB8fCAoZXhpc3RpbmcgJiYgZXhpc3Rpbmcuc2V0KSxcbiAgICAgICdpbnZhbGlkIGtleVBhdGgnXG4gICAgKTtcbiAgICB2YXIga2V5ID0gc3RlcC52YWx1ZTtcbiAgICB2YXIgbmV4dEV4aXN0aW5nID0gaXNOb3RTZXQgPyBOT1RfU0VUIDogZXhpc3RpbmcuZ2V0KGtleSwgTk9UX1NFVCk7XG4gICAgdmFyIG5leHRVcGRhdGVkID0gdXBkYXRlSW5EZWVwTWFwKFxuICAgICAgbmV4dEV4aXN0aW5nLFxuICAgICAga2V5UGF0aEl0ZXIsXG4gICAgICBub3RTZXRWYWx1ZSxcbiAgICAgIHVwZGF0ZXJcbiAgICApO1xuICAgIHJldHVybiBuZXh0VXBkYXRlZCA9PT0gbmV4dEV4aXN0aW5nID8gZXhpc3RpbmcgOlxuICAgICAgbmV4dFVwZGF0ZWQgPT09IE5PVF9TRVQgPyBleGlzdGluZy5yZW1vdmUoa2V5KSA6XG4gICAgICAoaXNOb3RTZXQgPyBlbXB0eU1hcCgpIDogZXhpc3RpbmcpLnNldChrZXksIG5leHRVcGRhdGVkKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBvcENvdW50KHgpIHtcbiAgICB4ID0geCAtICgoeCA+PiAxKSAmIDB4NTU1NTU1NTUpO1xuICAgIHggPSAoeCAmIDB4MzMzMzMzMzMpICsgKCh4ID4+IDIpICYgMHgzMzMzMzMzMyk7XG4gICAgeCA9ICh4ICsgKHggPj4gNCkpICYgMHgwZjBmMGYwZjtcbiAgICB4ID0geCArICh4ID4+IDgpO1xuICAgIHggPSB4ICsgKHggPj4gMTYpO1xuICAgIHJldHVybiB4ICYgMHg3ZjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldEluKGFycmF5LCBpZHgsIHZhbCwgY2FuRWRpdCkge1xuICAgIHZhciBuZXdBcnJheSA9IGNhbkVkaXQgPyBhcnJheSA6IGFyckNvcHkoYXJyYXkpO1xuICAgIG5ld0FycmF5W2lkeF0gPSB2YWw7XG4gICAgcmV0dXJuIG5ld0FycmF5O1xuICB9XG5cbiAgZnVuY3Rpb24gc3BsaWNlSW4oYXJyYXksIGlkeCwgdmFsLCBjYW5FZGl0KSB7XG4gICAgdmFyIG5ld0xlbiA9IGFycmF5Lmxlbmd0aCArIDE7XG4gICAgaWYgKGNhbkVkaXQgJiYgaWR4ICsgMSA9PT0gbmV3TGVuKSB7XG4gICAgICBhcnJheVtpZHhdID0gdmFsO1xuICAgICAgcmV0dXJuIGFycmF5O1xuICAgIH1cbiAgICB2YXIgbmV3QXJyYXkgPSBuZXcgQXJyYXkobmV3TGVuKTtcbiAgICB2YXIgYWZ0ZXIgPSAwO1xuICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCBuZXdMZW47IGlpKyspIHtcbiAgICAgIGlmIChpaSA9PT0gaWR4KSB7XG4gICAgICAgIG5ld0FycmF5W2lpXSA9IHZhbDtcbiAgICAgICAgYWZ0ZXIgPSAtMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld0FycmF5W2lpXSA9IGFycmF5W2lpICsgYWZ0ZXJdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3QXJyYXk7XG4gIH1cblxuICBmdW5jdGlvbiBzcGxpY2VPdXQoYXJyYXksIGlkeCwgY2FuRWRpdCkge1xuICAgIHZhciBuZXdMZW4gPSBhcnJheS5sZW5ndGggLSAxO1xuICAgIGlmIChjYW5FZGl0ICYmIGlkeCA9PT0gbmV3TGVuKSB7XG4gICAgICBhcnJheS5wb3AoKTtcbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9XG4gICAgdmFyIG5ld0FycmF5ID0gbmV3IEFycmF5KG5ld0xlbik7XG4gICAgdmFyIGFmdGVyID0gMDtcbiAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgbmV3TGVuOyBpaSsrKSB7XG4gICAgICBpZiAoaWkgPT09IGlkeCkge1xuICAgICAgICBhZnRlciA9IDE7XG4gICAgICB9XG4gICAgICBuZXdBcnJheVtpaV0gPSBhcnJheVtpaSArIGFmdGVyXTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0FycmF5O1xuICB9XG5cbiAgdmFyIE1BWF9BUlJBWV9NQVBfU0laRSA9IFNJWkUgLyA0O1xuICB2YXIgTUFYX0JJVE1BUF9JTkRFWEVEX1NJWkUgPSBTSVpFIC8gMjtcbiAgdmFyIE1JTl9IQVNIX0FSUkFZX01BUF9TSVpFID0gU0laRSAvIDQ7XG5cbiAgY3JlYXRlQ2xhc3MoTGlzdCwgSW5kZXhlZENvbGxlY3Rpb24pO1xuXG4gICAgLy8gQHByYWdtYSBDb25zdHJ1Y3Rpb25cblxuICAgIGZ1bmN0aW9uIExpc3QodmFsdWUpIHtcbiAgICAgIHZhciBlbXB0eSA9IGVtcHR5TGlzdCgpO1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGVtcHR5O1xuICAgICAgfVxuICAgICAgaWYgKGlzTGlzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdmFyIGl0ZXIgPSBJbmRleGVkSXRlcmFibGUodmFsdWUpO1xuICAgICAgdmFyIHNpemUgPSBpdGVyLnNpemU7XG4gICAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZW1wdHk7XG4gICAgICB9XG4gICAgICBhc3NlcnROb3RJbmZpbml0ZShzaXplKTtcbiAgICAgIGlmIChzaXplID4gMCAmJiBzaXplIDwgU0laRSkge1xuICAgICAgICByZXR1cm4gbWFrZUxpc3QoMCwgc2l6ZSwgU0hJRlQsIG51bGwsIG5ldyBWTm9kZShpdGVyLnRvQXJyYXkoKSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVtcHR5LndpdGhNdXRhdGlvbnMoZnVuY3Rpb24obGlzdCApIHtcbiAgICAgICAgbGlzdC5zZXRTaXplKHNpemUpO1xuICAgICAgICBpdGVyLmZvckVhY2goZnVuY3Rpb24odiwgaSkgIHtyZXR1cm4gbGlzdC5zZXQoaSwgdil9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIExpc3Qub2YgPSBmdW5jdGlvbigvKi4uLnZhbHVlcyovKSB7XG4gICAgICByZXR1cm4gdGhpcyhhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBMaXN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX190b1N0cmluZygnTGlzdCBbJywgJ10nKTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBBY2Nlc3NcblxuICAgIExpc3QucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGluZGV4LCBub3RTZXRWYWx1ZSkge1xuICAgICAgaW5kZXggPSB3cmFwSW5kZXgodGhpcywgaW5kZXgpO1xuICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnNpemUpIHtcbiAgICAgICAgaW5kZXggKz0gdGhpcy5fb3JpZ2luO1xuICAgICAgICB2YXIgbm9kZSA9IGxpc3ROb2RlRm9yKHRoaXMsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIG5vZGUgJiYgbm9kZS5hcnJheVtpbmRleCAmIE1BU0tdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vdFNldFZhbHVlO1xuICAgIH07XG5cbiAgICAvLyBAcHJhZ21hIE1vZGlmaWNhdGlvblxuXG4gICAgTGlzdC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oaW5kZXgsIHZhbHVlKSB7XG4gICAgICByZXR1cm4gdXBkYXRlTGlzdCh0aGlzLCBpbmRleCwgdmFsdWUpO1xuICAgIH07XG5cbiAgICBMaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbihpbmRleCkge1xuICAgICAgcmV0dXJuICF0aGlzLmhhcyhpbmRleCkgPyB0aGlzIDpcbiAgICAgICAgaW5kZXggPT09IDAgPyB0aGlzLnNoaWZ0KCkgOlxuICAgICAgICBpbmRleCA9PT0gdGhpcy5zaXplIC0gMSA/IHRoaXMucG9wKCkgOlxuICAgICAgICB0aGlzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfTtcblxuICAgIExpc3QucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uKGluZGV4LCB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3BsaWNlKGluZGV4LCAwLCB2YWx1ZSk7XG4gICAgfTtcblxuICAgIExpc3QucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX19vd25lcklEKSB7XG4gICAgICAgIHRoaXMuc2l6ZSA9IHRoaXMuX29yaWdpbiA9IHRoaXMuX2NhcGFjaXR5ID0gMDtcbiAgICAgICAgdGhpcy5fbGV2ZWwgPSBTSElGVDtcbiAgICAgICAgdGhpcy5fcm9vdCA9IHRoaXMuX3RhaWwgPSBudWxsO1xuICAgICAgICB0aGlzLl9faGFzaCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fX2FsdGVyZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbXB0eUxpc3QoKTtcbiAgICB9O1xuXG4gICAgTGlzdC5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uKC8qLi4udmFsdWVzKi8pIHtcbiAgICAgIHZhciB2YWx1ZXMgPSBhcmd1bWVudHM7XG4gICAgICB2YXIgb2xkU2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgIHJldHVybiB0aGlzLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24obGlzdCApIHtcbiAgICAgICAgc2V0TGlzdEJvdW5kcyhsaXN0LCAwLCBvbGRTaXplICsgdmFsdWVzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCB2YWx1ZXMubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgICAgbGlzdC5zZXQob2xkU2l6ZSArIGlpLCB2YWx1ZXNbaWldKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIExpc3QucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHNldExpc3RCb3VuZHModGhpcywgMCwgLTEpO1xuICAgIH07XG5cbiAgICBMaXN0LnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24oLyouLi52YWx1ZXMqLykge1xuICAgICAgdmFyIHZhbHVlcyA9IGFyZ3VtZW50cztcbiAgICAgIHJldHVybiB0aGlzLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24obGlzdCApIHtcbiAgICAgICAgc2V0TGlzdEJvdW5kcyhsaXN0LCAtdmFsdWVzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIGlpID0gMDsgaWkgPCB2YWx1ZXMubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgICAgbGlzdC5zZXQoaWksIHZhbHVlc1tpaV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgTGlzdC5wcm90b3R5cGUuc2hpZnQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBzZXRMaXN0Qm91bmRzKHRoaXMsIDEpO1xuICAgIH07XG5cbiAgICAvLyBAcHJhZ21hIENvbXBvc2l0aW9uXG5cbiAgICBMaXN0LnByb3RvdHlwZS5tZXJnZSA9IGZ1bmN0aW9uKC8qLi4uaXRlcnMqLykge1xuICAgICAgcmV0dXJuIG1lcmdlSW50b0xpc3RXaXRoKHRoaXMsIHVuZGVmaW5lZCwgYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgTGlzdC5wcm90b3R5cGUubWVyZ2VXaXRoID0gZnVuY3Rpb24obWVyZ2VyKSB7dmFyIGl0ZXJzID0gU0xJQ0UkMC5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICByZXR1cm4gbWVyZ2VJbnRvTGlzdFdpdGgodGhpcywgbWVyZ2VyLCBpdGVycyk7XG4gICAgfTtcblxuICAgIExpc3QucHJvdG90eXBlLm1lcmdlRGVlcCA9IGZ1bmN0aW9uKC8qLi4uaXRlcnMqLykge1xuICAgICAgcmV0dXJuIG1lcmdlSW50b0xpc3RXaXRoKHRoaXMsIGRlZXBNZXJnZXIsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIExpc3QucHJvdG90eXBlLm1lcmdlRGVlcFdpdGggPSBmdW5jdGlvbihtZXJnZXIpIHt2YXIgaXRlcnMgPSBTTElDRSQwLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgIHJldHVybiBtZXJnZUludG9MaXN0V2l0aCh0aGlzLCBkZWVwTWVyZ2VyV2l0aChtZXJnZXIpLCBpdGVycyk7XG4gICAgfTtcblxuICAgIExpc3QucHJvdG90eXBlLnNldFNpemUgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgICByZXR1cm4gc2V0TGlzdEJvdW5kcyh0aGlzLCAwLCBzaXplKTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBJdGVyYXRpb25cblxuICAgIExpc3QucHJvdG90eXBlLnNsaWNlID0gZnVuY3Rpb24oYmVnaW4sIGVuZCkge1xuICAgICAgdmFyIHNpemUgPSB0aGlzLnNpemU7XG4gICAgICBpZiAod2hvbGVTbGljZShiZWdpbiwgZW5kLCBzaXplKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZXRMaXN0Qm91bmRzKFxuICAgICAgICB0aGlzLFxuICAgICAgICByZXNvbHZlQmVnaW4oYmVnaW4sIHNpemUpLFxuICAgICAgICByZXNvbHZlRW5kKGVuZCwgc2l6ZSlcbiAgICAgICk7XG4gICAgfTtcblxuICAgIExpc3QucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgdmFyIHZhbHVlcyA9IGl0ZXJhdGVMaXN0KHRoaXMsIHJldmVyc2UpO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbigpICB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHZhbHVlcygpO1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IERPTkUgP1xuICAgICAgICAgIGl0ZXJhdG9yRG9uZSgpIDpcbiAgICAgICAgICBpdGVyYXRvclZhbHVlKHR5cGUsIGluZGV4KyssIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBMaXN0LnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge1xuICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgIHZhciB2YWx1ZXMgPSBpdGVyYXRlTGlzdCh0aGlzLCByZXZlcnNlKTtcbiAgICAgIHZhciB2YWx1ZTtcbiAgICAgIHdoaWxlICgodmFsdWUgPSB2YWx1ZXMoKSkgIT09IERPTkUpIHtcbiAgICAgICAgaWYgKGZuKHZhbHVlLCBpbmRleCsrLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH07XG5cbiAgICBMaXN0LnByb3RvdHlwZS5fX2Vuc3VyZU93bmVyID0gZnVuY3Rpb24ob3duZXJJRCkge1xuICAgICAgaWYgKG93bmVySUQgPT09IHRoaXMuX19vd25lcklEKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgaWYgKCFvd25lcklEKSB7XG4gICAgICAgIHRoaXMuX19vd25lcklEID0gb3duZXJJRDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWFrZUxpc3QodGhpcy5fb3JpZ2luLCB0aGlzLl9jYXBhY2l0eSwgdGhpcy5fbGV2ZWwsIHRoaXMuX3Jvb3QsIHRoaXMuX3RhaWwsIG93bmVySUQsIHRoaXMuX19oYXNoKTtcbiAgICB9O1xuXG5cbiAgZnVuY3Rpb24gaXNMaXN0KG1heWJlTGlzdCkge1xuICAgIHJldHVybiAhIShtYXliZUxpc3QgJiYgbWF5YmVMaXN0W0lTX0xJU1RfU0VOVElORUxdKTtcbiAgfVxuXG4gIExpc3QuaXNMaXN0ID0gaXNMaXN0O1xuXG4gIHZhciBJU19MSVNUX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfTElTVF9fQEAnO1xuXG4gIHZhciBMaXN0UHJvdG90eXBlID0gTGlzdC5wcm90b3R5cGU7XG4gIExpc3RQcm90b3R5cGVbSVNfTElTVF9TRU5USU5FTF0gPSB0cnVlO1xuICBMaXN0UHJvdG90eXBlW0RFTEVURV0gPSBMaXN0UHJvdG90eXBlLnJlbW92ZTtcbiAgTGlzdFByb3RvdHlwZS5zZXRJbiA9IE1hcFByb3RvdHlwZS5zZXRJbjtcbiAgTGlzdFByb3RvdHlwZS5kZWxldGVJbiA9XG4gIExpc3RQcm90b3R5cGUucmVtb3ZlSW4gPSBNYXBQcm90b3R5cGUucmVtb3ZlSW47XG4gIExpc3RQcm90b3R5cGUudXBkYXRlID0gTWFwUHJvdG90eXBlLnVwZGF0ZTtcbiAgTGlzdFByb3RvdHlwZS51cGRhdGVJbiA9IE1hcFByb3RvdHlwZS51cGRhdGVJbjtcbiAgTGlzdFByb3RvdHlwZS5tZXJnZUluID0gTWFwUHJvdG90eXBlLm1lcmdlSW47XG4gIExpc3RQcm90b3R5cGUubWVyZ2VEZWVwSW4gPSBNYXBQcm90b3R5cGUubWVyZ2VEZWVwSW47XG4gIExpc3RQcm90b3R5cGUud2l0aE11dGF0aW9ucyA9IE1hcFByb3RvdHlwZS53aXRoTXV0YXRpb25zO1xuICBMaXN0UHJvdG90eXBlLmFzTXV0YWJsZSA9IE1hcFByb3RvdHlwZS5hc011dGFibGU7XG4gIExpc3RQcm90b3R5cGUuYXNJbW11dGFibGUgPSBNYXBQcm90b3R5cGUuYXNJbW11dGFibGU7XG4gIExpc3RQcm90b3R5cGUud2FzQWx0ZXJlZCA9IE1hcFByb3RvdHlwZS53YXNBbHRlcmVkO1xuXG5cblxuICAgIGZ1bmN0aW9uIFZOb2RlKGFycmF5LCBvd25lcklEKSB7XG4gICAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG4gICAgICB0aGlzLm93bmVySUQgPSBvd25lcklEO1xuICAgIH1cblxuICAgIC8vIFRPRE86IHNlZW1zIGxpa2UgdGhlc2UgbWV0aG9kcyBhcmUgdmVyeSBzaW1pbGFyXG5cbiAgICBWTm9kZS5wcm90b3R5cGUucmVtb3ZlQmVmb3JlID0gZnVuY3Rpb24ob3duZXJJRCwgbGV2ZWwsIGluZGV4KSB7XG4gICAgICBpZiAoaW5kZXggPT09IGxldmVsID8gMSA8PCBsZXZlbCA6IDAgfHwgdGhpcy5hcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB2YXIgb3JpZ2luSW5kZXggPSAoaW5kZXggPj4+IGxldmVsKSAmIE1BU0s7XG4gICAgICBpZiAob3JpZ2luSW5kZXggPj0gdGhpcy5hcnJheS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWTm9kZShbXSwgb3duZXJJRCk7XG4gICAgICB9XG4gICAgICB2YXIgcmVtb3ZpbmdGaXJzdCA9IG9yaWdpbkluZGV4ID09PSAwO1xuICAgICAgdmFyIG5ld0NoaWxkO1xuICAgICAgaWYgKGxldmVsID4gMCkge1xuICAgICAgICB2YXIgb2xkQ2hpbGQgPSB0aGlzLmFycmF5W29yaWdpbkluZGV4XTtcbiAgICAgICAgbmV3Q2hpbGQgPSBvbGRDaGlsZCAmJiBvbGRDaGlsZC5yZW1vdmVCZWZvcmUob3duZXJJRCwgbGV2ZWwgLSBTSElGVCwgaW5kZXgpO1xuICAgICAgICBpZiAobmV3Q2hpbGQgPT09IG9sZENoaWxkICYmIHJlbW92aW5nRmlyc3QpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlbW92aW5nRmlyc3QgJiYgIW5ld0NoaWxkKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgdmFyIGVkaXRhYmxlID0gZWRpdGFibGVWTm9kZSh0aGlzLCBvd25lcklEKTtcbiAgICAgIGlmICghcmVtb3ZpbmdGaXJzdCkge1xuICAgICAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgb3JpZ2luSW5kZXg7IGlpKyspIHtcbiAgICAgICAgICBlZGl0YWJsZS5hcnJheVtpaV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChuZXdDaGlsZCkge1xuICAgICAgICBlZGl0YWJsZS5hcnJheVtvcmlnaW5JbmRleF0gPSBuZXdDaGlsZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlZGl0YWJsZTtcbiAgICB9O1xuXG4gICAgVk5vZGUucHJvdG90eXBlLnJlbW92ZUFmdGVyID0gZnVuY3Rpb24ob3duZXJJRCwgbGV2ZWwsIGluZGV4KSB7XG4gICAgICBpZiAoaW5kZXggPT09IChsZXZlbCA/IDEgPDwgbGV2ZWwgOiAwKSB8fCB0aGlzLmFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHZhciBzaXplSW5kZXggPSAoKGluZGV4IC0gMSkgPj4+IGxldmVsKSAmIE1BU0s7XG4gICAgICBpZiAoc2l6ZUluZGV4ID49IHRoaXMuYXJyYXkubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmV3Q2hpbGQ7XG4gICAgICBpZiAobGV2ZWwgPiAwKSB7XG4gICAgICAgIHZhciBvbGRDaGlsZCA9IHRoaXMuYXJyYXlbc2l6ZUluZGV4XTtcbiAgICAgICAgbmV3Q2hpbGQgPSBvbGRDaGlsZCAmJiBvbGRDaGlsZC5yZW1vdmVBZnRlcihvd25lcklELCBsZXZlbCAtIFNISUZULCBpbmRleCk7XG4gICAgICAgIGlmIChuZXdDaGlsZCA9PT0gb2xkQ2hpbGQgJiYgc2l6ZUluZGV4ID09PSB0aGlzLmFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgZWRpdGFibGUgPSBlZGl0YWJsZVZOb2RlKHRoaXMsIG93bmVySUQpO1xuICAgICAgZWRpdGFibGUuYXJyYXkuc3BsaWNlKHNpemVJbmRleCArIDEpO1xuICAgICAgaWYgKG5ld0NoaWxkKSB7XG4gICAgICAgIGVkaXRhYmxlLmFycmF5W3NpemVJbmRleF0gPSBuZXdDaGlsZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlZGl0YWJsZTtcbiAgICB9O1xuXG5cblxuICB2YXIgRE9ORSA9IHt9O1xuXG4gIGZ1bmN0aW9uIGl0ZXJhdGVMaXN0KGxpc3QsIHJldmVyc2UpIHtcbiAgICB2YXIgbGVmdCA9IGxpc3QuX29yaWdpbjtcbiAgICB2YXIgcmlnaHQgPSBsaXN0Ll9jYXBhY2l0eTtcbiAgICB2YXIgdGFpbFBvcyA9IGdldFRhaWxPZmZzZXQocmlnaHQpO1xuICAgIHZhciB0YWlsID0gbGlzdC5fdGFpbDtcblxuICAgIHJldHVybiBpdGVyYXRlTm9kZU9yTGVhZihsaXN0Ll9yb290LCBsaXN0Ll9sZXZlbCwgMCk7XG5cbiAgICBmdW5jdGlvbiBpdGVyYXRlTm9kZU9yTGVhZihub2RlLCBsZXZlbCwgb2Zmc2V0KSB7XG4gICAgICByZXR1cm4gbGV2ZWwgPT09IDAgP1xuICAgICAgICBpdGVyYXRlTGVhZihub2RlLCBvZmZzZXQpIDpcbiAgICAgICAgaXRlcmF0ZU5vZGUobm9kZSwgbGV2ZWwsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXRlcmF0ZUxlYWYobm9kZSwgb2Zmc2V0KSB7XG4gICAgICB2YXIgYXJyYXkgPSBvZmZzZXQgPT09IHRhaWxQb3MgPyB0YWlsICYmIHRhaWwuYXJyYXkgOiBub2RlICYmIG5vZGUuYXJyYXk7XG4gICAgICB2YXIgZnJvbSA9IG9mZnNldCA+IGxlZnQgPyAwIDogbGVmdCAtIG9mZnNldDtcbiAgICAgIHZhciB0byA9IHJpZ2h0IC0gb2Zmc2V0O1xuICAgICAgaWYgKHRvID4gU0laRSkge1xuICAgICAgICB0byA9IFNJWkU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZnVuY3Rpb24oKSAge1xuICAgICAgICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAgICAgICByZXR1cm4gRE9ORTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaWR4ID0gcmV2ZXJzZSA/IC0tdG8gOiBmcm9tKys7XG4gICAgICAgIHJldHVybiBhcnJheSAmJiBhcnJheVtpZHhdO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpdGVyYXRlTm9kZShub2RlLCBsZXZlbCwgb2Zmc2V0KSB7XG4gICAgICB2YXIgdmFsdWVzO1xuICAgICAgdmFyIGFycmF5ID0gbm9kZSAmJiBub2RlLmFycmF5O1xuICAgICAgdmFyIGZyb20gPSBvZmZzZXQgPiBsZWZ0ID8gMCA6IChsZWZ0IC0gb2Zmc2V0KSA+PiBsZXZlbDtcbiAgICAgIHZhciB0byA9ICgocmlnaHQgLSBvZmZzZXQpID4+IGxldmVsKSArIDE7XG4gICAgICBpZiAodG8gPiBTSVpFKSB7XG4gICAgICAgIHRvID0gU0laRTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmdW5jdGlvbigpICB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBpZiAodmFsdWVzKSB7XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZXMoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gRE9ORSkge1xuICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YWx1ZXMgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZnJvbSA9PT0gdG8pIHtcbiAgICAgICAgICAgIHJldHVybiBET05FO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgaWR4ID0gcmV2ZXJzZSA/IC0tdG8gOiBmcm9tKys7XG4gICAgICAgICAgdmFsdWVzID0gaXRlcmF0ZU5vZGVPckxlYWYoXG4gICAgICAgICAgICBhcnJheSAmJiBhcnJheVtpZHhdLCBsZXZlbCAtIFNISUZULCBvZmZzZXQgKyAoaWR4IDw8IGxldmVsKVxuICAgICAgICAgICk7XG4gICAgICAgIH0gd2hpbGUgKHRydWUpO1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtYWtlTGlzdChvcmlnaW4sIGNhcGFjaXR5LCBsZXZlbCwgcm9vdCwgdGFpbCwgb3duZXJJRCwgaGFzaCkge1xuICAgIHZhciBsaXN0ID0gT2JqZWN0LmNyZWF0ZShMaXN0UHJvdG90eXBlKTtcbiAgICBsaXN0LnNpemUgPSBjYXBhY2l0eSAtIG9yaWdpbjtcbiAgICBsaXN0Ll9vcmlnaW4gPSBvcmlnaW47XG4gICAgbGlzdC5fY2FwYWNpdHkgPSBjYXBhY2l0eTtcbiAgICBsaXN0Ll9sZXZlbCA9IGxldmVsO1xuICAgIGxpc3QuX3Jvb3QgPSByb290O1xuICAgIGxpc3QuX3RhaWwgPSB0YWlsO1xuICAgIGxpc3QuX19vd25lcklEID0gb3duZXJJRDtcbiAgICBsaXN0Ll9faGFzaCA9IGhhc2g7XG4gICAgbGlzdC5fX2FsdGVyZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIHZhciBFTVBUWV9MSVNUO1xuICBmdW5jdGlvbiBlbXB0eUxpc3QoKSB7XG4gICAgcmV0dXJuIEVNUFRZX0xJU1QgfHwgKEVNUFRZX0xJU1QgPSBtYWtlTGlzdCgwLCAwLCBTSElGVCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlTGlzdChsaXN0LCBpbmRleCwgdmFsdWUpIHtcbiAgICBpbmRleCA9IHdyYXBJbmRleChsaXN0LCBpbmRleCk7XG5cbiAgICBpZiAoaW5kZXggIT09IGluZGV4KSB7XG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPj0gbGlzdC5zaXplIHx8IGluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuIGxpc3Qud2l0aE11dGF0aW9ucyhmdW5jdGlvbihsaXN0ICkge1xuICAgICAgICBpbmRleCA8IDAgP1xuICAgICAgICAgIHNldExpc3RCb3VuZHMobGlzdCwgaW5kZXgpLnNldCgwLCB2YWx1ZSkgOlxuICAgICAgICAgIHNldExpc3RCb3VuZHMobGlzdCwgMCwgaW5kZXggKyAxKS5zZXQoaW5kZXgsIHZhbHVlKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaW5kZXggKz0gbGlzdC5fb3JpZ2luO1xuXG4gICAgdmFyIG5ld1RhaWwgPSBsaXN0Ll90YWlsO1xuICAgIHZhciBuZXdSb290ID0gbGlzdC5fcm9vdDtcbiAgICB2YXIgZGlkQWx0ZXIgPSBNYWtlUmVmKERJRF9BTFRFUik7XG4gICAgaWYgKGluZGV4ID49IGdldFRhaWxPZmZzZXQobGlzdC5fY2FwYWNpdHkpKSB7XG4gICAgICBuZXdUYWlsID0gdXBkYXRlVk5vZGUobmV3VGFpbCwgbGlzdC5fX293bmVySUQsIDAsIGluZGV4LCB2YWx1ZSwgZGlkQWx0ZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdSb290ID0gdXBkYXRlVk5vZGUobmV3Um9vdCwgbGlzdC5fX293bmVySUQsIGxpc3QuX2xldmVsLCBpbmRleCwgdmFsdWUsIGRpZEFsdGVyKTtcbiAgICB9XG5cbiAgICBpZiAoIWRpZEFsdGVyLnZhbHVlKSB7XG4gICAgICByZXR1cm4gbGlzdDtcbiAgICB9XG5cbiAgICBpZiAobGlzdC5fX293bmVySUQpIHtcbiAgICAgIGxpc3QuX3Jvb3QgPSBuZXdSb290O1xuICAgICAgbGlzdC5fdGFpbCA9IG5ld1RhaWw7XG4gICAgICBsaXN0Ll9faGFzaCA9IHVuZGVmaW5lZDtcbiAgICAgIGxpc3QuX19hbHRlcmVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cbiAgICByZXR1cm4gbWFrZUxpc3QobGlzdC5fb3JpZ2luLCBsaXN0Ll9jYXBhY2l0eSwgbGlzdC5fbGV2ZWwsIG5ld1Jvb3QsIG5ld1RhaWwpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlVk5vZGUobm9kZSwgb3duZXJJRCwgbGV2ZWwsIGluZGV4LCB2YWx1ZSwgZGlkQWx0ZXIpIHtcbiAgICB2YXIgaWR4ID0gKGluZGV4ID4+PiBsZXZlbCkgJiBNQVNLO1xuICAgIHZhciBub2RlSGFzID0gbm9kZSAmJiBpZHggPCBub2RlLmFycmF5Lmxlbmd0aDtcbiAgICBpZiAoIW5vZGVIYXMgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgdmFyIG5ld05vZGU7XG5cbiAgICBpZiAobGV2ZWwgPiAwKSB7XG4gICAgICB2YXIgbG93ZXJOb2RlID0gbm9kZSAmJiBub2RlLmFycmF5W2lkeF07XG4gICAgICB2YXIgbmV3TG93ZXJOb2RlID0gdXBkYXRlVk5vZGUobG93ZXJOb2RlLCBvd25lcklELCBsZXZlbCAtIFNISUZULCBpbmRleCwgdmFsdWUsIGRpZEFsdGVyKTtcbiAgICAgIGlmIChuZXdMb3dlck5vZGUgPT09IGxvd2VyTm9kZSkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cbiAgICAgIG5ld05vZGUgPSBlZGl0YWJsZVZOb2RlKG5vZGUsIG93bmVySUQpO1xuICAgICAgbmV3Tm9kZS5hcnJheVtpZHhdID0gbmV3TG93ZXJOb2RlO1xuICAgICAgcmV0dXJuIG5ld05vZGU7XG4gICAgfVxuXG4gICAgaWYgKG5vZGVIYXMgJiYgbm9kZS5hcnJheVtpZHhdID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuXG4gICAgU2V0UmVmKGRpZEFsdGVyKTtcblxuICAgIG5ld05vZGUgPSBlZGl0YWJsZVZOb2RlKG5vZGUsIG93bmVySUQpO1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGlkeCA9PT0gbmV3Tm9kZS5hcnJheS5sZW5ndGggLSAxKSB7XG4gICAgICBuZXdOb2RlLmFycmF5LnBvcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdOb2RlLmFycmF5W2lkeF0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld05vZGU7XG4gIH1cblxuICBmdW5jdGlvbiBlZGl0YWJsZVZOb2RlKG5vZGUsIG93bmVySUQpIHtcbiAgICBpZiAob3duZXJJRCAmJiBub2RlICYmIG93bmVySUQgPT09IG5vZGUub3duZXJJRCkge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVk5vZGUobm9kZSA/IG5vZGUuYXJyYXkuc2xpY2UoKSA6IFtdLCBvd25lcklEKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpc3ROb2RlRm9yKGxpc3QsIHJhd0luZGV4KSB7XG4gICAgaWYgKHJhd0luZGV4ID49IGdldFRhaWxPZmZzZXQobGlzdC5fY2FwYWNpdHkpKSB7XG4gICAgICByZXR1cm4gbGlzdC5fdGFpbDtcbiAgICB9XG4gICAgaWYgKHJhd0luZGV4IDwgMSA8PCAobGlzdC5fbGV2ZWwgKyBTSElGVCkpIHtcbiAgICAgIHZhciBub2RlID0gbGlzdC5fcm9vdDtcbiAgICAgIHZhciBsZXZlbCA9IGxpc3QuX2xldmVsO1xuICAgICAgd2hpbGUgKG5vZGUgJiYgbGV2ZWwgPiAwKSB7XG4gICAgICAgIG5vZGUgPSBub2RlLmFycmF5WyhyYXdJbmRleCA+Pj4gbGV2ZWwpICYgTUFTS107XG4gICAgICAgIGxldmVsIC09IFNISUZUO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2V0TGlzdEJvdW5kcyhsaXN0LCBiZWdpbiwgZW5kKSB7XG4gICAgLy8gU2FuaXRpemUgYmVnaW4gJiBlbmQgdXNpbmcgdGhpcyBzaG9ydGhhbmQgZm9yIFRvSW50MzIoYXJndW1lbnQpXG4gICAgLy8gaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC8jc2VjLXRvaW50MzJcbiAgICBpZiAoYmVnaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgYmVnaW4gPSBiZWdpbiB8IDA7XG4gICAgfVxuICAgIGlmIChlbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW5kID0gZW5kIHwgMDtcbiAgICB9XG4gICAgdmFyIG93bmVyID0gbGlzdC5fX293bmVySUQgfHwgbmV3IE93bmVySUQoKTtcbiAgICB2YXIgb2xkT3JpZ2luID0gbGlzdC5fb3JpZ2luO1xuICAgIHZhciBvbGRDYXBhY2l0eSA9IGxpc3QuX2NhcGFjaXR5O1xuICAgIHZhciBuZXdPcmlnaW4gPSBvbGRPcmlnaW4gKyBiZWdpbjtcbiAgICB2YXIgbmV3Q2FwYWNpdHkgPSBlbmQgPT09IHVuZGVmaW5lZCA/IG9sZENhcGFjaXR5IDogZW5kIDwgMCA/IG9sZENhcGFjaXR5ICsgZW5kIDogb2xkT3JpZ2luICsgZW5kO1xuICAgIGlmIChuZXdPcmlnaW4gPT09IG9sZE9yaWdpbiAmJiBuZXdDYXBhY2l0eSA9PT0gb2xkQ2FwYWNpdHkpIHtcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgZ29pbmcgdG8gZW5kIGFmdGVyIGl0IHN0YXJ0cywgaXQncyBlbXB0eS5cbiAgICBpZiAobmV3T3JpZ2luID49IG5ld0NhcGFjaXR5KSB7XG4gICAgICByZXR1cm4gbGlzdC5jbGVhcigpO1xuICAgIH1cblxuICAgIHZhciBuZXdMZXZlbCA9IGxpc3QuX2xldmVsO1xuICAgIHZhciBuZXdSb290ID0gbGlzdC5fcm9vdDtcblxuICAgIC8vIE5ldyBvcmlnaW4gbWlnaHQgbmVlZCBjcmVhdGluZyBhIGhpZ2hlciByb290LlxuICAgIHZhciBvZmZzZXRTaGlmdCA9IDA7XG4gICAgd2hpbGUgKG5ld09yaWdpbiArIG9mZnNldFNoaWZ0IDwgMCkge1xuICAgICAgbmV3Um9vdCA9IG5ldyBWTm9kZShuZXdSb290ICYmIG5ld1Jvb3QuYXJyYXkubGVuZ3RoID8gW3VuZGVmaW5lZCwgbmV3Um9vdF0gOiBbXSwgb3duZXIpO1xuICAgICAgbmV3TGV2ZWwgKz0gU0hJRlQ7XG4gICAgICBvZmZzZXRTaGlmdCArPSAxIDw8IG5ld0xldmVsO1xuICAgIH1cbiAgICBpZiAob2Zmc2V0U2hpZnQpIHtcbiAgICAgIG5ld09yaWdpbiArPSBvZmZzZXRTaGlmdDtcbiAgICAgIG9sZE9yaWdpbiArPSBvZmZzZXRTaGlmdDtcbiAgICAgIG5ld0NhcGFjaXR5ICs9IG9mZnNldFNoaWZ0O1xuICAgICAgb2xkQ2FwYWNpdHkgKz0gb2Zmc2V0U2hpZnQ7XG4gICAgfVxuXG4gICAgdmFyIG9sZFRhaWxPZmZzZXQgPSBnZXRUYWlsT2Zmc2V0KG9sZENhcGFjaXR5KTtcbiAgICB2YXIgbmV3VGFpbE9mZnNldCA9IGdldFRhaWxPZmZzZXQobmV3Q2FwYWNpdHkpO1xuXG4gICAgLy8gTmV3IHNpemUgbWlnaHQgbmVlZCBjcmVhdGluZyBhIGhpZ2hlciByb290LlxuICAgIHdoaWxlIChuZXdUYWlsT2Zmc2V0ID49IDEgPDwgKG5ld0xldmVsICsgU0hJRlQpKSB7XG4gICAgICBuZXdSb290ID0gbmV3IFZOb2RlKG5ld1Jvb3QgJiYgbmV3Um9vdC5hcnJheS5sZW5ndGggPyBbbmV3Um9vdF0gOiBbXSwgb3duZXIpO1xuICAgICAgbmV3TGV2ZWwgKz0gU0hJRlQ7XG4gICAgfVxuXG4gICAgLy8gTG9jYXRlIG9yIGNyZWF0ZSB0aGUgbmV3IHRhaWwuXG4gICAgdmFyIG9sZFRhaWwgPSBsaXN0Ll90YWlsO1xuICAgIHZhciBuZXdUYWlsID0gbmV3VGFpbE9mZnNldCA8IG9sZFRhaWxPZmZzZXQgP1xuICAgICAgbGlzdE5vZGVGb3IobGlzdCwgbmV3Q2FwYWNpdHkgLSAxKSA6XG4gICAgICBuZXdUYWlsT2Zmc2V0ID4gb2xkVGFpbE9mZnNldCA/IG5ldyBWTm9kZShbXSwgb3duZXIpIDogb2xkVGFpbDtcblxuICAgIC8vIE1lcmdlIFRhaWwgaW50byB0cmVlLlxuICAgIGlmIChvbGRUYWlsICYmIG5ld1RhaWxPZmZzZXQgPiBvbGRUYWlsT2Zmc2V0ICYmIG5ld09yaWdpbiA8IG9sZENhcGFjaXR5ICYmIG9sZFRhaWwuYXJyYXkubGVuZ3RoKSB7XG4gICAgICBuZXdSb290ID0gZWRpdGFibGVWTm9kZShuZXdSb290LCBvd25lcik7XG4gICAgICB2YXIgbm9kZSA9IG5ld1Jvb3Q7XG4gICAgICBmb3IgKHZhciBsZXZlbCA9IG5ld0xldmVsOyBsZXZlbCA+IFNISUZUOyBsZXZlbCAtPSBTSElGVCkge1xuICAgICAgICB2YXIgaWR4ID0gKG9sZFRhaWxPZmZzZXQgPj4+IGxldmVsKSAmIE1BU0s7XG4gICAgICAgIG5vZGUgPSBub2RlLmFycmF5W2lkeF0gPSBlZGl0YWJsZVZOb2RlKG5vZGUuYXJyYXlbaWR4XSwgb3duZXIpO1xuICAgICAgfVxuICAgICAgbm9kZS5hcnJheVsob2xkVGFpbE9mZnNldCA+Pj4gU0hJRlQpICYgTUFTS10gPSBvbGRUYWlsO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBzaXplIGhhcyBiZWVuIHJlZHVjZWQsIHRoZXJlJ3MgYSBjaGFuY2UgdGhlIHRhaWwgbmVlZHMgdG8gYmUgdHJpbW1lZC5cbiAgICBpZiAobmV3Q2FwYWNpdHkgPCBvbGRDYXBhY2l0eSkge1xuICAgICAgbmV3VGFpbCA9IG5ld1RhaWwgJiYgbmV3VGFpbC5yZW1vdmVBZnRlcihvd25lciwgMCwgbmV3Q2FwYWNpdHkpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBuZXcgb3JpZ2luIGlzIHdpdGhpbiB0aGUgdGFpbCwgdGhlbiB3ZSBkbyBub3QgbmVlZCBhIHJvb3QuXG4gICAgaWYgKG5ld09yaWdpbiA+PSBuZXdUYWlsT2Zmc2V0KSB7XG4gICAgICBuZXdPcmlnaW4gLT0gbmV3VGFpbE9mZnNldDtcbiAgICAgIG5ld0NhcGFjaXR5IC09IG5ld1RhaWxPZmZzZXQ7XG4gICAgICBuZXdMZXZlbCA9IFNISUZUO1xuICAgICAgbmV3Um9vdCA9IG51bGw7XG4gICAgICBuZXdUYWlsID0gbmV3VGFpbCAmJiBuZXdUYWlsLnJlbW92ZUJlZm9yZShvd25lciwgMCwgbmV3T3JpZ2luKTtcblxuICAgIC8vIE90aGVyd2lzZSwgaWYgdGhlIHJvb3QgaGFzIGJlZW4gdHJpbW1lZCwgZ2FyYmFnZSBjb2xsZWN0LlxuICAgIH0gZWxzZSBpZiAobmV3T3JpZ2luID4gb2xkT3JpZ2luIHx8IG5ld1RhaWxPZmZzZXQgPCBvbGRUYWlsT2Zmc2V0KSB7XG4gICAgICBvZmZzZXRTaGlmdCA9IDA7XG5cbiAgICAgIC8vIElkZW50aWZ5IHRoZSBuZXcgdG9wIHJvb3Qgbm9kZSBvZiB0aGUgc3VidHJlZSBvZiB0aGUgb2xkIHJvb3QuXG4gICAgICB3aGlsZSAobmV3Um9vdCkge1xuICAgICAgICB2YXIgYmVnaW5JbmRleCA9IChuZXdPcmlnaW4gPj4+IG5ld0xldmVsKSAmIE1BU0s7XG4gICAgICAgIGlmIChiZWdpbkluZGV4ICE9PSAobmV3VGFpbE9mZnNldCA+Pj4gbmV3TGV2ZWwpICYgTUFTSykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChiZWdpbkluZGV4KSB7XG4gICAgICAgICAgb2Zmc2V0U2hpZnQgKz0gKDEgPDwgbmV3TGV2ZWwpICogYmVnaW5JbmRleDtcbiAgICAgICAgfVxuICAgICAgICBuZXdMZXZlbCAtPSBTSElGVDtcbiAgICAgICAgbmV3Um9vdCA9IG5ld1Jvb3QuYXJyYXlbYmVnaW5JbmRleF07XG4gICAgICB9XG5cbiAgICAgIC8vIFRyaW0gdGhlIG5ldyBzaWRlcyBvZiB0aGUgbmV3IHJvb3QuXG4gICAgICBpZiAobmV3Um9vdCAmJiBuZXdPcmlnaW4gPiBvbGRPcmlnaW4pIHtcbiAgICAgICAgbmV3Um9vdCA9IG5ld1Jvb3QucmVtb3ZlQmVmb3JlKG93bmVyLCBuZXdMZXZlbCwgbmV3T3JpZ2luIC0gb2Zmc2V0U2hpZnQpO1xuICAgICAgfVxuICAgICAgaWYgKG5ld1Jvb3QgJiYgbmV3VGFpbE9mZnNldCA8IG9sZFRhaWxPZmZzZXQpIHtcbiAgICAgICAgbmV3Um9vdCA9IG5ld1Jvb3QucmVtb3ZlQWZ0ZXIob3duZXIsIG5ld0xldmVsLCBuZXdUYWlsT2Zmc2V0IC0gb2Zmc2V0U2hpZnQpO1xuICAgICAgfVxuICAgICAgaWYgKG9mZnNldFNoaWZ0KSB7XG4gICAgICAgIG5ld09yaWdpbiAtPSBvZmZzZXRTaGlmdDtcbiAgICAgICAgbmV3Q2FwYWNpdHkgLT0gb2Zmc2V0U2hpZnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGxpc3QuX19vd25lcklEKSB7XG4gICAgICBsaXN0LnNpemUgPSBuZXdDYXBhY2l0eSAtIG5ld09yaWdpbjtcbiAgICAgIGxpc3QuX29yaWdpbiA9IG5ld09yaWdpbjtcbiAgICAgIGxpc3QuX2NhcGFjaXR5ID0gbmV3Q2FwYWNpdHk7XG4gICAgICBsaXN0Ll9sZXZlbCA9IG5ld0xldmVsO1xuICAgICAgbGlzdC5fcm9vdCA9IG5ld1Jvb3Q7XG4gICAgICBsaXN0Ll90YWlsID0gbmV3VGFpbDtcbiAgICAgIGxpc3QuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgICAgbGlzdC5fX2FsdGVyZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuICAgIHJldHVybiBtYWtlTGlzdChuZXdPcmlnaW4sIG5ld0NhcGFjaXR5LCBuZXdMZXZlbCwgbmV3Um9vdCwgbmV3VGFpbCk7XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZUludG9MaXN0V2l0aChsaXN0LCBtZXJnZXIsIGl0ZXJhYmxlcykge1xuICAgIHZhciBpdGVycyA9IFtdO1xuICAgIHZhciBtYXhTaXplID0gMDtcbiAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgaXRlcmFibGVzLmxlbmd0aDsgaWkrKykge1xuICAgICAgdmFyIHZhbHVlID0gaXRlcmFibGVzW2lpXTtcbiAgICAgIHZhciBpdGVyID0gSW5kZXhlZEl0ZXJhYmxlKHZhbHVlKTtcbiAgICAgIGlmIChpdGVyLnNpemUgPiBtYXhTaXplKSB7XG4gICAgICAgIG1heFNpemUgPSBpdGVyLnNpemU7XG4gICAgICB9XG4gICAgICBpZiAoIWlzSXRlcmFibGUodmFsdWUpKSB7XG4gICAgICAgIGl0ZXIgPSBpdGVyLm1hcChmdW5jdGlvbih2ICkge3JldHVybiBmcm9tSlModil9KTtcbiAgICAgIH1cbiAgICAgIGl0ZXJzLnB1c2goaXRlcik7XG4gICAgfVxuICAgIGlmIChtYXhTaXplID4gbGlzdC5zaXplKSB7XG4gICAgICBsaXN0ID0gbGlzdC5zZXRTaXplKG1heFNpemUpO1xuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VJbnRvQ29sbGVjdGlvbldpdGgobGlzdCwgbWVyZ2VyLCBpdGVycyk7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRUYWlsT2Zmc2V0KHNpemUpIHtcbiAgICByZXR1cm4gc2l6ZSA8IFNJWkUgPyAwIDogKCgoc2l6ZSAtIDEpID4+PiBTSElGVCkgPDwgU0hJRlQpO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoT3JkZXJlZE1hcCwgTWFwKTtcblxuICAgIC8vIEBwcmFnbWEgQ29uc3RydWN0aW9uXG5cbiAgICBmdW5jdGlvbiBPcmRlcmVkTWFwKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/IGVtcHR5T3JkZXJlZE1hcCgpIDpcbiAgICAgICAgaXNPcmRlcmVkTWFwKHZhbHVlKSA/IHZhbHVlIDpcbiAgICAgICAgZW1wdHlPcmRlcmVkTWFwKCkud2l0aE11dGF0aW9ucyhmdW5jdGlvbihtYXAgKSB7XG4gICAgICAgICAgdmFyIGl0ZXIgPSBLZXllZEl0ZXJhYmxlKHZhbHVlKTtcbiAgICAgICAgICBhc3NlcnROb3RJbmZpbml0ZShpdGVyLnNpemUpO1xuICAgICAgICAgIGl0ZXIuZm9yRWFjaChmdW5jdGlvbih2LCBrKSAge3JldHVybiBtYXAuc2V0KGssIHYpfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIE9yZGVyZWRNYXAub2YgPSBmdW5jdGlvbigvKi4uLnZhbHVlcyovKSB7XG4gICAgICByZXR1cm4gdGhpcyhhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBPcmRlcmVkTWFwLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX190b1N0cmluZygnT3JkZXJlZE1hcCB7JywgJ30nKTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBBY2Nlc3NcblxuICAgIE9yZGVyZWRNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGssIG5vdFNldFZhbHVlKSB7XG4gICAgICB2YXIgaW5kZXggPSB0aGlzLl9tYXAuZ2V0KGspO1xuICAgICAgcmV0dXJuIGluZGV4ICE9PSB1bmRlZmluZWQgPyB0aGlzLl9saXN0LmdldChpbmRleClbMV0gOiBub3RTZXRWYWx1ZTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBNb2RpZmljYXRpb25cblxuICAgIE9yZGVyZWRNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5zaXplID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX19vd25lcklEKSB7XG4gICAgICAgIHRoaXMuc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9saXN0LmNsZWFyKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVtcHR5T3JkZXJlZE1hcCgpO1xuICAgIH07XG5cbiAgICBPcmRlcmVkTWFwLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihrLCB2KSB7XG4gICAgICByZXR1cm4gdXBkYXRlT3JkZXJlZE1hcCh0aGlzLCBrLCB2KTtcbiAgICB9O1xuXG4gICAgT3JkZXJlZE1hcC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oaykge1xuICAgICAgcmV0dXJuIHVwZGF0ZU9yZGVyZWRNYXAodGhpcywgaywgTk9UX1NFVCk7XG4gICAgfTtcblxuICAgIE9yZGVyZWRNYXAucHJvdG90eXBlLndhc0FsdGVyZWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXAud2FzQWx0ZXJlZCgpIHx8IHRoaXMuX2xpc3Qud2FzQWx0ZXJlZCgpO1xuICAgIH07XG5cbiAgICBPcmRlcmVkTWFwLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge3ZhciB0aGlzJDAgPSB0aGlzO1xuICAgICAgcmV0dXJuIHRoaXMuX2xpc3QuX19pdGVyYXRlKFxuICAgICAgICBmdW5jdGlvbihlbnRyeSApIHtyZXR1cm4gZW50cnkgJiYgZm4oZW50cnlbMV0sIGVudHJ5WzBdLCB0aGlzJDApfSxcbiAgICAgICAgcmV2ZXJzZVxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgT3JkZXJlZE1hcC5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uKHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLl9saXN0LmZyb21FbnRyeVNlcSgpLl9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gICAgfTtcblxuICAgIE9yZGVyZWRNYXAucHJvdG90eXBlLl9fZW5zdXJlT3duZXIgPSBmdW5jdGlvbihvd25lcklEKSB7XG4gICAgICBpZiAob3duZXJJRCA9PT0gdGhpcy5fX293bmVySUQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB2YXIgbmV3TWFwID0gdGhpcy5fbWFwLl9fZW5zdXJlT3duZXIob3duZXJJRCk7XG4gICAgICB2YXIgbmV3TGlzdCA9IHRoaXMuX2xpc3QuX19lbnN1cmVPd25lcihvd25lcklEKTtcbiAgICAgIGlmICghb3duZXJJRCkge1xuICAgICAgICB0aGlzLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ld01hcDtcbiAgICAgICAgdGhpcy5fbGlzdCA9IG5ld0xpc3Q7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ha2VPcmRlcmVkTWFwKG5ld01hcCwgbmV3TGlzdCwgb3duZXJJRCwgdGhpcy5fX2hhc2gpO1xuICAgIH07XG5cblxuICBmdW5jdGlvbiBpc09yZGVyZWRNYXAobWF5YmVPcmRlcmVkTWFwKSB7XG4gICAgcmV0dXJuIGlzTWFwKG1heWJlT3JkZXJlZE1hcCkgJiYgaXNPcmRlcmVkKG1heWJlT3JkZXJlZE1hcCk7XG4gIH1cblxuICBPcmRlcmVkTWFwLmlzT3JkZXJlZE1hcCA9IGlzT3JkZXJlZE1hcDtcblxuICBPcmRlcmVkTWFwLnByb3RvdHlwZVtJU19PUkRFUkVEX1NFTlRJTkVMXSA9IHRydWU7XG4gIE9yZGVyZWRNYXAucHJvdG90eXBlW0RFTEVURV0gPSBPcmRlcmVkTWFwLnByb3RvdHlwZS5yZW1vdmU7XG5cblxuXG4gIGZ1bmN0aW9uIG1ha2VPcmRlcmVkTWFwKG1hcCwgbGlzdCwgb3duZXJJRCwgaGFzaCkge1xuICAgIHZhciBvbWFwID0gT2JqZWN0LmNyZWF0ZShPcmRlcmVkTWFwLnByb3RvdHlwZSk7XG4gICAgb21hcC5zaXplID0gbWFwID8gbWFwLnNpemUgOiAwO1xuICAgIG9tYXAuX21hcCA9IG1hcDtcbiAgICBvbWFwLl9saXN0ID0gbGlzdDtcbiAgICBvbWFwLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgb21hcC5fX2hhc2ggPSBoYXNoO1xuICAgIHJldHVybiBvbWFwO1xuICB9XG5cbiAgdmFyIEVNUFRZX09SREVSRURfTUFQO1xuICBmdW5jdGlvbiBlbXB0eU9yZGVyZWRNYXAoKSB7XG4gICAgcmV0dXJuIEVNUFRZX09SREVSRURfTUFQIHx8IChFTVBUWV9PUkRFUkVEX01BUCA9IG1ha2VPcmRlcmVkTWFwKGVtcHR5TWFwKCksIGVtcHR5TGlzdCgpKSk7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVPcmRlcmVkTWFwKG9tYXAsIGssIHYpIHtcbiAgICB2YXIgbWFwID0gb21hcC5fbWFwO1xuICAgIHZhciBsaXN0ID0gb21hcC5fbGlzdDtcbiAgICB2YXIgaSA9IG1hcC5nZXQoayk7XG4gICAgdmFyIGhhcyA9IGkgIT09IHVuZGVmaW5lZDtcbiAgICB2YXIgbmV3TWFwO1xuICAgIHZhciBuZXdMaXN0O1xuICAgIGlmICh2ID09PSBOT1RfU0VUKSB7IC8vIHJlbW92ZWRcbiAgICAgIGlmICghaGFzKSB7XG4gICAgICAgIHJldHVybiBvbWFwO1xuICAgICAgfVxuICAgICAgaWYgKGxpc3Quc2l6ZSA+PSBTSVpFICYmIGxpc3Quc2l6ZSA+PSBtYXAuc2l6ZSAqIDIpIHtcbiAgICAgICAgbmV3TGlzdCA9IGxpc3QuZmlsdGVyKGZ1bmN0aW9uKGVudHJ5LCBpZHgpICB7cmV0dXJuIGVudHJ5ICE9PSB1bmRlZmluZWQgJiYgaSAhPT0gaWR4fSk7XG4gICAgICAgIG5ld01hcCA9IG5ld0xpc3QudG9LZXllZFNlcSgpLm1hcChmdW5jdGlvbihlbnRyeSApIHtyZXR1cm4gZW50cnlbMF19KS5mbGlwKCkudG9NYXAoKTtcbiAgICAgICAgaWYgKG9tYXAuX19vd25lcklEKSB7XG4gICAgICAgICAgbmV3TWFwLl9fb3duZXJJRCA9IG5ld0xpc3QuX19vd25lcklEID0gb21hcC5fX293bmVySUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld01hcCA9IG1hcC5yZW1vdmUoayk7XG4gICAgICAgIG5ld0xpc3QgPSBpID09PSBsaXN0LnNpemUgLSAxID8gbGlzdC5wb3AoKSA6IGxpc3Quc2V0KGksIHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChoYXMpIHtcbiAgICAgICAgaWYgKHYgPT09IGxpc3QuZ2V0KGkpWzFdKSB7XG4gICAgICAgICAgcmV0dXJuIG9tYXA7XG4gICAgICAgIH1cbiAgICAgICAgbmV3TWFwID0gbWFwO1xuICAgICAgICBuZXdMaXN0ID0gbGlzdC5zZXQoaSwgW2ssIHZdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld01hcCA9IG1hcC5zZXQoaywgbGlzdC5zaXplKTtcbiAgICAgICAgbmV3TGlzdCA9IGxpc3Quc2V0KGxpc3Quc2l6ZSwgW2ssIHZdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG9tYXAuX19vd25lcklEKSB7XG4gICAgICBvbWFwLnNpemUgPSBuZXdNYXAuc2l6ZTtcbiAgICAgIG9tYXAuX21hcCA9IG5ld01hcDtcbiAgICAgIG9tYXAuX2xpc3QgPSBuZXdMaXN0O1xuICAgICAgb21hcC5fX2hhc2ggPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gb21hcDtcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VPcmRlcmVkTWFwKG5ld01hcCwgbmV3TGlzdCk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhUb0tleWVkU2VxdWVuY2UsIEtleWVkU2VxKTtcbiAgICBmdW5jdGlvbiBUb0tleWVkU2VxdWVuY2UoaW5kZXhlZCwgdXNlS2V5cykge1xuICAgICAgdGhpcy5faXRlciA9IGluZGV4ZWQ7XG4gICAgICB0aGlzLl91c2VLZXlzID0gdXNlS2V5cztcbiAgICAgIHRoaXMuc2l6ZSA9IGluZGV4ZWQuc2l6ZTtcbiAgICB9XG5cbiAgICBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGtleSwgbm90U2V0VmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pdGVyLmdldChrZXksIG5vdFNldFZhbHVlKTtcbiAgICB9O1xuXG4gICAgVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pdGVyLmhhcyhrZXkpO1xuICAgIH07XG5cbiAgICBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLnZhbHVlU2VxID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5faXRlci52YWx1ZVNlcSgpO1xuICAgIH07XG5cbiAgICBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLnJldmVyc2UgPSBmdW5jdGlvbigpIHt2YXIgdGhpcyQwID0gdGhpcztcbiAgICAgIHZhciByZXZlcnNlZFNlcXVlbmNlID0gcmV2ZXJzZUZhY3RvcnkodGhpcywgdHJ1ZSk7XG4gICAgICBpZiAoIXRoaXMuX3VzZUtleXMpIHtcbiAgICAgICAgcmV2ZXJzZWRTZXF1ZW5jZS52YWx1ZVNlcSA9IGZ1bmN0aW9uKCkgIHtyZXR1cm4gdGhpcyQwLl9pdGVyLnRvU2VxKCkucmV2ZXJzZSgpfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXZlcnNlZFNlcXVlbmNlO1xuICAgIH07XG5cbiAgICBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLm1hcCA9IGZ1bmN0aW9uKG1hcHBlciwgY29udGV4dCkge3ZhciB0aGlzJDAgPSB0aGlzO1xuICAgICAgdmFyIG1hcHBlZFNlcXVlbmNlID0gbWFwRmFjdG9yeSh0aGlzLCBtYXBwZXIsIGNvbnRleHQpO1xuICAgICAgaWYgKCF0aGlzLl91c2VLZXlzKSB7XG4gICAgICAgIG1hcHBlZFNlcXVlbmNlLnZhbHVlU2VxID0gZnVuY3Rpb24oKSAge3JldHVybiB0aGlzJDAuX2l0ZXIudG9TZXEoKS5tYXAobWFwcGVyLCBjb250ZXh0KX07XG4gICAgICB9XG4gICAgICByZXR1cm4gbWFwcGVkU2VxdWVuY2U7XG4gICAgfTtcblxuICAgIFRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHt2YXIgdGhpcyQwID0gdGhpcztcbiAgICAgIHZhciBpaTtcbiAgICAgIHJldHVybiB0aGlzLl9pdGVyLl9faXRlcmF0ZShcbiAgICAgICAgdGhpcy5fdXNlS2V5cyA/XG4gICAgICAgICAgZnVuY3Rpb24odiwgaykgIHtyZXR1cm4gZm4odiwgaywgdGhpcyQwKX0gOlxuICAgICAgICAgICgoaWkgPSByZXZlcnNlID8gcmVzb2x2ZVNpemUodGhpcykgOiAwKSxcbiAgICAgICAgICAgIGZ1bmN0aW9uKHYgKSB7cmV0dXJuIGZuKHYsIHJldmVyc2UgPyAtLWlpIDogaWkrKywgdGhpcyQwKX0pLFxuICAgICAgICByZXZlcnNlXG4gICAgICApO1xuICAgIH07XG5cbiAgICBUb0tleWVkU2VxdWVuY2UucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgICBpZiAodGhpcy5fdXNlS2V5cykge1xuICAgICAgICByZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgICAgfVxuICAgICAgdmFyIGl0ZXJhdG9yID0gdGhpcy5faXRlci5fX2l0ZXJhdG9yKElURVJBVEVfVkFMVUVTLCByZXZlcnNlKTtcbiAgICAgIHZhciBpaSA9IHJldmVyc2UgPyByZXNvbHZlU2l6ZSh0aGlzKSA6IDA7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkgIHtcbiAgICAgICAgdmFyIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIHJldHVybiBzdGVwLmRvbmUgPyBzdGVwIDpcbiAgICAgICAgICBpdGVyYXRvclZhbHVlKHR5cGUsIHJldmVyc2UgPyAtLWlpIDogaWkrKywgc3RlcC52YWx1ZSwgc3RlcCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gIFRvS2V5ZWRTZXF1ZW5jZS5wcm90b3R5cGVbSVNfT1JERVJFRF9TRU5USU5FTF0gPSB0cnVlO1xuXG5cbiAgY3JlYXRlQ2xhc3MoVG9JbmRleGVkU2VxdWVuY2UsIEluZGV4ZWRTZXEpO1xuICAgIGZ1bmN0aW9uIFRvSW5kZXhlZFNlcXVlbmNlKGl0ZXIpIHtcbiAgICAgIHRoaXMuX2l0ZXIgPSBpdGVyO1xuICAgICAgdGhpcy5zaXplID0gaXRlci5zaXplO1xuICAgIH1cblxuICAgIFRvSW5kZXhlZFNlcXVlbmNlLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5faXRlci5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgfTtcblxuICAgIFRvSW5kZXhlZFNlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge3ZhciB0aGlzJDAgPSB0aGlzO1xuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgcmV0dXJuIHRoaXMuX2l0ZXIuX19pdGVyYXRlKGZ1bmN0aW9uKHYgKSB7cmV0dXJuIGZuKHYsIGl0ZXJhdGlvbnMrKywgdGhpcyQwKX0sIHJldmVyc2UpO1xuICAgIH07XG5cbiAgICBUb0luZGV4ZWRTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uKHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIHZhciBpdGVyYXRvciA9IHRoaXMuX2l0ZXIuX19pdGVyYXRvcihJVEVSQVRFX1ZBTFVFUywgcmV2ZXJzZSk7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkgIHtcbiAgICAgICAgdmFyIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgIHJldHVybiBzdGVwLmRvbmUgPyBzdGVwIDpcbiAgICAgICAgICBpdGVyYXRvclZhbHVlKHR5cGUsIGl0ZXJhdGlvbnMrKywgc3RlcC52YWx1ZSwgc3RlcClcbiAgICAgIH0pO1xuICAgIH07XG5cblxuXG4gIGNyZWF0ZUNsYXNzKFRvU2V0U2VxdWVuY2UsIFNldFNlcSk7XG4gICAgZnVuY3Rpb24gVG9TZXRTZXF1ZW5jZShpdGVyKSB7XG4gICAgICB0aGlzLl9pdGVyID0gaXRlcjtcbiAgICAgIHRoaXMuc2l6ZSA9IGl0ZXIuc2l6ZTtcbiAgICB9XG5cbiAgICBUb1NldFNlcXVlbmNlLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pdGVyLmluY2x1ZGVzKGtleSk7XG4gICAgfTtcblxuICAgIFRvU2V0U2VxdWVuY2UucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7dmFyIHRoaXMkMCA9IHRoaXM7XG4gICAgICByZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdGUoZnVuY3Rpb24odiApIHtyZXR1cm4gZm4odiwgdiwgdGhpcyQwKX0sIHJldmVyc2UpO1xuICAgIH07XG5cbiAgICBUb1NldFNlcXVlbmNlLnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yID0gdGhpcy5faXRlci5fX2l0ZXJhdG9yKElURVJBVEVfVkFMVUVTLCByZXZlcnNlKTtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24oKSAge1xuICAgICAgICB2YXIgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgcmV0dXJuIHN0ZXAuZG9uZSA/IHN0ZXAgOlxuICAgICAgICAgIGl0ZXJhdG9yVmFsdWUodHlwZSwgc3RlcC52YWx1ZSwgc3RlcC52YWx1ZSwgc3RlcCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG5cblxuICBjcmVhdGVDbGFzcyhGcm9tRW50cmllc1NlcXVlbmNlLCBLZXllZFNlcSk7XG4gICAgZnVuY3Rpb24gRnJvbUVudHJpZXNTZXF1ZW5jZShlbnRyaWVzKSB7XG4gICAgICB0aGlzLl9pdGVyID0gZW50cmllcztcbiAgICAgIHRoaXMuc2l6ZSA9IGVudHJpZXMuc2l6ZTtcbiAgICB9XG5cbiAgICBGcm9tRW50cmllc1NlcXVlbmNlLnByb3RvdHlwZS5lbnRyeVNlcSA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2l0ZXIudG9TZXEoKTtcbiAgICB9O1xuXG4gICAgRnJvbUVudHJpZXNTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRlID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHt2YXIgdGhpcyQwID0gdGhpcztcbiAgICAgIHJldHVybiB0aGlzLl9pdGVyLl9faXRlcmF0ZShmdW5jdGlvbihlbnRyeSApIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgZW50cnkgZXhpc3RzIGZpcnN0IHNvIGFycmF5IGFjY2VzcyBkb2Vzbid0IHRocm93IGZvciBob2xlc1xuICAgICAgICAvLyBpbiB0aGUgcGFyZW50IGl0ZXJhdGlvbi5cbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgdmFsaWRhdGVFbnRyeShlbnRyeSk7XG4gICAgICAgICAgdmFyIGluZGV4ZWRJdGVyYWJsZSA9IGlzSXRlcmFibGUoZW50cnkpO1xuICAgICAgICAgIHJldHVybiBmbihcbiAgICAgICAgICAgIGluZGV4ZWRJdGVyYWJsZSA/IGVudHJ5LmdldCgxKSA6IGVudHJ5WzFdLFxuICAgICAgICAgICAgaW5kZXhlZEl0ZXJhYmxlID8gZW50cnkuZ2V0KDApIDogZW50cnlbMF0sXG4gICAgICAgICAgICB0aGlzJDBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LCByZXZlcnNlKTtcbiAgICB9O1xuXG4gICAgRnJvbUVudHJpZXNTZXF1ZW5jZS5wcm90b3R5cGUuX19pdGVyYXRvciA9IGZ1bmN0aW9uKHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIHZhciBpdGVyYXRvciA9IHRoaXMuX2l0ZXIuX19pdGVyYXRvcihJVEVSQVRFX1ZBTFVFUywgcmV2ZXJzZSk7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkgIHtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICB2YXIgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICAvLyBDaGVjayBpZiBlbnRyeSBleGlzdHMgZmlyc3Qgc28gYXJyYXkgYWNjZXNzIGRvZXNuJ3QgdGhyb3cgZm9yIGhvbGVzXG4gICAgICAgICAgLy8gaW4gdGhlIHBhcmVudCBpdGVyYXRpb24uXG4gICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICAgIHZhciBpbmRleGVkSXRlcmFibGUgPSBpc0l0ZXJhYmxlKGVudHJ5KTtcbiAgICAgICAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKFxuICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICBpbmRleGVkSXRlcmFibGUgPyBlbnRyeS5nZXQoMCkgOiBlbnRyeVswXSxcbiAgICAgICAgICAgICAgaW5kZXhlZEl0ZXJhYmxlID8gZW50cnkuZ2V0KDEpIDogZW50cnlbMV0sXG4gICAgICAgICAgICAgIHN0ZXBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG5cbiAgVG9JbmRleGVkU2VxdWVuY2UucHJvdG90eXBlLmNhY2hlUmVzdWx0ID1cbiAgVG9LZXllZFNlcXVlbmNlLnByb3RvdHlwZS5jYWNoZVJlc3VsdCA9XG4gIFRvU2V0U2VxdWVuY2UucHJvdG90eXBlLmNhY2hlUmVzdWx0ID1cbiAgRnJvbUVudHJpZXNTZXF1ZW5jZS5wcm90b3R5cGUuY2FjaGVSZXN1bHQgPVxuICAgIGNhY2hlUmVzdWx0VGhyb3VnaDtcblxuXG4gIGZ1bmN0aW9uIGZsaXBGYWN0b3J5KGl0ZXJhYmxlKSB7XG4gICAgdmFyIGZsaXBTZXF1ZW5jZSA9IG1ha2VTZXF1ZW5jZShpdGVyYWJsZSk7XG4gICAgZmxpcFNlcXVlbmNlLl9pdGVyID0gaXRlcmFibGU7XG4gICAgZmxpcFNlcXVlbmNlLnNpemUgPSBpdGVyYWJsZS5zaXplO1xuICAgIGZsaXBTZXF1ZW5jZS5mbGlwID0gZnVuY3Rpb24oKSAge3JldHVybiBpdGVyYWJsZX07XG4gICAgZmxpcFNlcXVlbmNlLnJldmVyc2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcmV2ZXJzZWRTZXF1ZW5jZSA9IGl0ZXJhYmxlLnJldmVyc2UuYXBwbHkodGhpcyk7IC8vIHN1cGVyLnJldmVyc2UoKVxuICAgICAgcmV2ZXJzZWRTZXF1ZW5jZS5mbGlwID0gZnVuY3Rpb24oKSAge3JldHVybiBpdGVyYWJsZS5yZXZlcnNlKCl9O1xuICAgICAgcmV0dXJuIHJldmVyc2VkU2VxdWVuY2U7XG4gICAgfTtcbiAgICBmbGlwU2VxdWVuY2UuaGFzID0gZnVuY3Rpb24oa2V5ICkge3JldHVybiBpdGVyYWJsZS5pbmNsdWRlcyhrZXkpfTtcbiAgICBmbGlwU2VxdWVuY2UuaW5jbHVkZXMgPSBmdW5jdGlvbihrZXkgKSB7cmV0dXJuIGl0ZXJhYmxlLmhhcyhrZXkpfTtcbiAgICBmbGlwU2VxdWVuY2UuY2FjaGVSZXN1bHQgPSBjYWNoZVJlc3VsdFRocm91Z2g7XG4gICAgZmxpcFNlcXVlbmNlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24gKGZuLCByZXZlcnNlKSB7dmFyIHRoaXMkMCA9IHRoaXM7XG4gICAgICByZXR1cm4gaXRlcmFibGUuX19pdGVyYXRlKGZ1bmN0aW9uKHYsIGspICB7cmV0dXJuIGZuKGssIHYsIHRoaXMkMCkgIT09IGZhbHNlfSwgcmV2ZXJzZSk7XG4gICAgfVxuICAgIGZsaXBTZXF1ZW5jZS5fX2l0ZXJhdG9yVW5jYWNoZWQgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgICBpZiAodHlwZSA9PT0gSVRFUkFURV9FTlRSSUVTKSB7XG4gICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhYmxlLl9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24oKSAge1xuICAgICAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGlmICghc3RlcC5kb25lKSB7XG4gICAgICAgICAgICB2YXIgayA9IHN0ZXAudmFsdWVbMF07XG4gICAgICAgICAgICBzdGVwLnZhbHVlWzBdID0gc3RlcC52YWx1ZVsxXTtcbiAgICAgICAgICAgIHN0ZXAudmFsdWVbMV0gPSBrO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlcmFibGUuX19pdGVyYXRvcihcbiAgICAgICAgdHlwZSA9PT0gSVRFUkFURV9WQUxVRVMgPyBJVEVSQVRFX0tFWVMgOiBJVEVSQVRFX1ZBTFVFUyxcbiAgICAgICAgcmV2ZXJzZVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGZsaXBTZXF1ZW5jZTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gbWFwRmFjdG9yeShpdGVyYWJsZSwgbWFwcGVyLCBjb250ZXh0KSB7XG4gICAgdmFyIG1hcHBlZFNlcXVlbmNlID0gbWFrZVNlcXVlbmNlKGl0ZXJhYmxlKTtcbiAgICBtYXBwZWRTZXF1ZW5jZS5zaXplID0gaXRlcmFibGUuc2l6ZTtcbiAgICBtYXBwZWRTZXF1ZW5jZS5oYXMgPSBmdW5jdGlvbihrZXkgKSB7cmV0dXJuIGl0ZXJhYmxlLmhhcyhrZXkpfTtcbiAgICBtYXBwZWRTZXF1ZW5jZS5nZXQgPSBmdW5jdGlvbihrZXksIG5vdFNldFZhbHVlKSAge1xuICAgICAgdmFyIHYgPSBpdGVyYWJsZS5nZXQoa2V5LCBOT1RfU0VUKTtcbiAgICAgIHJldHVybiB2ID09PSBOT1RfU0VUID9cbiAgICAgICAgbm90U2V0VmFsdWUgOlxuICAgICAgICBtYXBwZXIuY2FsbChjb250ZXh0LCB2LCBrZXksIGl0ZXJhYmxlKTtcbiAgICB9O1xuICAgIG1hcHBlZFNlcXVlbmNlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24gKGZuLCByZXZlcnNlKSB7dmFyIHRoaXMkMCA9IHRoaXM7XG4gICAgICByZXR1cm4gaXRlcmFibGUuX19pdGVyYXRlKFxuICAgICAgICBmdW5jdGlvbih2LCBrLCBjKSAge3JldHVybiBmbihtYXBwZXIuY2FsbChjb250ZXh0LCB2LCBrLCBjKSwgaywgdGhpcyQwKSAhPT0gZmFsc2V9LFxuICAgICAgICByZXZlcnNlXG4gICAgICApO1xuICAgIH1cbiAgICBtYXBwZWRTZXF1ZW5jZS5fX2l0ZXJhdG9yVW5jYWNoZWQgPSBmdW5jdGlvbiAodHlwZSwgcmV2ZXJzZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmFibGUuX19pdGVyYXRvcihJVEVSQVRFX0VOVFJJRVMsIHJldmVyc2UpO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbigpICB7XG4gICAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgdmFyIGtleSA9IGVudHJ5WzBdO1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZShcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgICBtYXBwZXIuY2FsbChjb250ZXh0LCBlbnRyeVsxXSwga2V5LCBpdGVyYWJsZSksXG4gICAgICAgICAgc3RlcFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBtYXBwZWRTZXF1ZW5jZTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gcmV2ZXJzZUZhY3RvcnkoaXRlcmFibGUsIHVzZUtleXMpIHtcbiAgICB2YXIgcmV2ZXJzZWRTZXF1ZW5jZSA9IG1ha2VTZXF1ZW5jZShpdGVyYWJsZSk7XG4gICAgcmV2ZXJzZWRTZXF1ZW5jZS5faXRlciA9IGl0ZXJhYmxlO1xuICAgIHJldmVyc2VkU2VxdWVuY2Uuc2l6ZSA9IGl0ZXJhYmxlLnNpemU7XG4gICAgcmV2ZXJzZWRTZXF1ZW5jZS5yZXZlcnNlID0gZnVuY3Rpb24oKSAge3JldHVybiBpdGVyYWJsZX07XG4gICAgaWYgKGl0ZXJhYmxlLmZsaXApIHtcbiAgICAgIHJldmVyc2VkU2VxdWVuY2UuZmxpcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGZsaXBTZXF1ZW5jZSA9IGZsaXBGYWN0b3J5KGl0ZXJhYmxlKTtcbiAgICAgICAgZmxpcFNlcXVlbmNlLnJldmVyc2UgPSBmdW5jdGlvbigpICB7cmV0dXJuIGl0ZXJhYmxlLmZsaXAoKX07XG4gICAgICAgIHJldHVybiBmbGlwU2VxdWVuY2U7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXZlcnNlZFNlcXVlbmNlLmdldCA9IGZ1bmN0aW9uKGtleSwgbm90U2V0VmFsdWUpIFxuICAgICAge3JldHVybiBpdGVyYWJsZS5nZXQodXNlS2V5cyA/IGtleSA6IC0xIC0ga2V5LCBub3RTZXRWYWx1ZSl9O1xuICAgIHJldmVyc2VkU2VxdWVuY2UuaGFzID0gZnVuY3Rpb24oa2V5IClcbiAgICAgIHtyZXR1cm4gaXRlcmFibGUuaGFzKHVzZUtleXMgPyBrZXkgOiAtMSAtIGtleSl9O1xuICAgIHJldmVyc2VkU2VxdWVuY2UuaW5jbHVkZXMgPSBmdW5jdGlvbih2YWx1ZSApIHtyZXR1cm4gaXRlcmFibGUuaW5jbHVkZXModmFsdWUpfTtcbiAgICByZXZlcnNlZFNlcXVlbmNlLmNhY2hlUmVzdWx0ID0gY2FjaGVSZXN1bHRUaHJvdWdoO1xuICAgIHJldmVyc2VkU2VxdWVuY2UuX19pdGVyYXRlID0gZnVuY3Rpb24gKGZuLCByZXZlcnNlKSB7dmFyIHRoaXMkMCA9IHRoaXM7XG4gICAgICByZXR1cm4gaXRlcmFibGUuX19pdGVyYXRlKGZ1bmN0aW9uKHYsIGspICB7cmV0dXJuIGZuKHYsIGssIHRoaXMkMCl9LCAhcmV2ZXJzZSk7XG4gICAgfTtcbiAgICByZXZlcnNlZFNlcXVlbmNlLl9faXRlcmF0b3IgPVxuICAgICAgZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkgIHtyZXR1cm4gaXRlcmFibGUuX19pdGVyYXRvcih0eXBlLCAhcmV2ZXJzZSl9O1xuICAgIHJldHVybiByZXZlcnNlZFNlcXVlbmNlO1xuICB9XG5cblxuICBmdW5jdGlvbiBmaWx0ZXJGYWN0b3J5KGl0ZXJhYmxlLCBwcmVkaWNhdGUsIGNvbnRleHQsIHVzZUtleXMpIHtcbiAgICB2YXIgZmlsdGVyU2VxdWVuY2UgPSBtYWtlU2VxdWVuY2UoaXRlcmFibGUpO1xuICAgIGlmICh1c2VLZXlzKSB7XG4gICAgICBmaWx0ZXJTZXF1ZW5jZS5oYXMgPSBmdW5jdGlvbihrZXkgKSB7XG4gICAgICAgIHZhciB2ID0gaXRlcmFibGUuZ2V0KGtleSwgTk9UX1NFVCk7XG4gICAgICAgIHJldHVybiB2ICE9PSBOT1RfU0VUICYmICEhcHJlZGljYXRlLmNhbGwoY29udGV4dCwgdiwga2V5LCBpdGVyYWJsZSk7XG4gICAgICB9O1xuICAgICAgZmlsdGVyU2VxdWVuY2UuZ2V0ID0gZnVuY3Rpb24oa2V5LCBub3RTZXRWYWx1ZSkgIHtcbiAgICAgICAgdmFyIHYgPSBpdGVyYWJsZS5nZXQoa2V5LCBOT1RfU0VUKTtcbiAgICAgICAgcmV0dXJuIHYgIT09IE5PVF9TRVQgJiYgcHJlZGljYXRlLmNhbGwoY29udGV4dCwgdiwga2V5LCBpdGVyYWJsZSkgP1xuICAgICAgICAgIHYgOiBub3RTZXRWYWx1ZTtcbiAgICAgIH07XG4gICAgfVxuICAgIGZpbHRlclNlcXVlbmNlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24gKGZuLCByZXZlcnNlKSB7dmFyIHRoaXMkMCA9IHRoaXM7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICBpdGVyYWJsZS5fX2l0ZXJhdGUoZnVuY3Rpb24odiwgaywgYykgIHtcbiAgICAgICAgaWYgKHByZWRpY2F0ZS5jYWxsKGNvbnRleHQsIHYsIGssIGMpKSB7XG4gICAgICAgICAgaXRlcmF0aW9ucysrO1xuICAgICAgICAgIHJldHVybiBmbih2LCB1c2VLZXlzID8gayA6IGl0ZXJhdGlvbnMgLSAxLCB0aGlzJDApO1xuICAgICAgICB9XG4gICAgICB9LCByZXZlcnNlKTtcbiAgICAgIHJldHVybiBpdGVyYXRpb25zO1xuICAgIH07XG4gICAgZmlsdGVyU2VxdWVuY2UuX19pdGVyYXRvclVuY2FjaGVkID0gZnVuY3Rpb24gKHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhYmxlLl9faXRlcmF0b3IoSVRFUkFURV9FTlRSSUVTLCByZXZlcnNlKTtcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24oKSAge1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgIHZhciBrZXkgPSBlbnRyeVswXTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBlbnRyeVsxXTtcbiAgICAgICAgICBpZiAocHJlZGljYXRlLmNhbGwoY29udGV4dCwgdmFsdWUsIGtleSwgaXRlcmFibGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCB1c2VLZXlzID8ga2V5IDogaXRlcmF0aW9ucysrLCB2YWx1ZSwgc3RlcCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbHRlclNlcXVlbmNlO1xuICB9XG5cblxuICBmdW5jdGlvbiBjb3VudEJ5RmFjdG9yeShpdGVyYWJsZSwgZ3JvdXBlciwgY29udGV4dCkge1xuICAgIHZhciBncm91cHMgPSBNYXAoKS5hc011dGFibGUoKTtcbiAgICBpdGVyYWJsZS5fX2l0ZXJhdGUoZnVuY3Rpb24odiwgaykgIHtcbiAgICAgIGdyb3Vwcy51cGRhdGUoXG4gICAgICAgIGdyb3VwZXIuY2FsbChjb250ZXh0LCB2LCBrLCBpdGVyYWJsZSksXG4gICAgICAgIDAsXG4gICAgICAgIGZ1bmN0aW9uKGEgKSB7cmV0dXJuIGEgKyAxfVxuICAgICAgKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZ3JvdXBzLmFzSW1tdXRhYmxlKCk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGdyb3VwQnlGYWN0b3J5KGl0ZXJhYmxlLCBncm91cGVyLCBjb250ZXh0KSB7XG4gICAgdmFyIGlzS2V5ZWRJdGVyID0gaXNLZXllZChpdGVyYWJsZSk7XG4gICAgdmFyIGdyb3VwcyA9IChpc09yZGVyZWQoaXRlcmFibGUpID8gT3JkZXJlZE1hcCgpIDogTWFwKCkpLmFzTXV0YWJsZSgpO1xuICAgIGl0ZXJhYmxlLl9faXRlcmF0ZShmdW5jdGlvbih2LCBrKSAge1xuICAgICAgZ3JvdXBzLnVwZGF0ZShcbiAgICAgICAgZ3JvdXBlci5jYWxsKGNvbnRleHQsIHYsIGssIGl0ZXJhYmxlKSxcbiAgICAgICAgZnVuY3Rpb24oYSApIHtyZXR1cm4gKGEgPSBhIHx8IFtdLCBhLnB1c2goaXNLZXllZEl0ZXIgPyBbaywgdl0gOiB2KSwgYSl9XG4gICAgICApO1xuICAgIH0pO1xuICAgIHZhciBjb2VyY2UgPSBpdGVyYWJsZUNsYXNzKGl0ZXJhYmxlKTtcbiAgICByZXR1cm4gZ3JvdXBzLm1hcChmdW5jdGlvbihhcnIgKSB7cmV0dXJuIHJlaWZ5KGl0ZXJhYmxlLCBjb2VyY2UoYXJyKSl9KTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gc2xpY2VGYWN0b3J5KGl0ZXJhYmxlLCBiZWdpbiwgZW5kLCB1c2VLZXlzKSB7XG4gICAgdmFyIG9yaWdpbmFsU2l6ZSA9IGl0ZXJhYmxlLnNpemU7XG5cbiAgICAvLyBTYW5pdGl6ZSBiZWdpbiAmIGVuZCB1c2luZyB0aGlzIHNob3J0aGFuZCBmb3IgVG9JbnQzMihhcmd1bWVudClcbiAgICAvLyBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtdG9pbnQzMlxuICAgIGlmIChiZWdpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBiZWdpbiA9IGJlZ2luIHwgMDtcbiAgICB9XG4gICAgaWYgKGVuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoZW5kID09PSBJbmZpbml0eSkge1xuICAgICAgICBlbmQgPSBvcmlnaW5hbFNpemU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmQgPSBlbmQgfCAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh3aG9sZVNsaWNlKGJlZ2luLCBlbmQsIG9yaWdpbmFsU2l6ZSkpIHtcbiAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICB9XG5cbiAgICB2YXIgcmVzb2x2ZWRCZWdpbiA9IHJlc29sdmVCZWdpbihiZWdpbiwgb3JpZ2luYWxTaXplKTtcbiAgICB2YXIgcmVzb2x2ZWRFbmQgPSByZXNvbHZlRW5kKGVuZCwgb3JpZ2luYWxTaXplKTtcblxuICAgIC8vIGJlZ2luIG9yIGVuZCB3aWxsIGJlIE5hTiBpZiB0aGV5IHdlcmUgcHJvdmlkZWQgYXMgbmVnYXRpdmUgbnVtYmVycyBhbmRcbiAgICAvLyB0aGlzIGl0ZXJhYmxlJ3Mgc2l6ZSBpcyB1bmtub3duLiBJbiB0aGF0IGNhc2UsIGNhY2hlIGZpcnN0IHNvIHRoZXJlIGlzXG4gICAgLy8gYSBrbm93biBzaXplIGFuZCB0aGVzZSBkbyBub3QgcmVzb2x2ZSB0byBOYU4uXG4gICAgaWYgKHJlc29sdmVkQmVnaW4gIT09IHJlc29sdmVkQmVnaW4gfHwgcmVzb2x2ZWRFbmQgIT09IHJlc29sdmVkRW5kKSB7XG4gICAgICByZXR1cm4gc2xpY2VGYWN0b3J5KGl0ZXJhYmxlLnRvU2VxKCkuY2FjaGVSZXN1bHQoKSwgYmVnaW4sIGVuZCwgdXNlS2V5cyk7XG4gICAgfVxuXG4gICAgLy8gTm90ZTogcmVzb2x2ZWRFbmQgaXMgdW5kZWZpbmVkIHdoZW4gdGhlIG9yaWdpbmFsIHNlcXVlbmNlJ3MgbGVuZ3RoIGlzXG4gICAgLy8gdW5rbm93biBhbmQgdGhpcyBzbGljZSBkaWQgbm90IHN1cHBseSBhbiBlbmQgYW5kIHNob3VsZCBjb250YWluIGFsbFxuICAgIC8vIGVsZW1lbnRzIGFmdGVyIHJlc29sdmVkQmVnaW4uXG4gICAgLy8gSW4gdGhhdCBjYXNlLCByZXNvbHZlZFNpemUgd2lsbCBiZSBOYU4gYW5kIHNsaWNlU2l6ZSB3aWxsIHJlbWFpbiB1bmRlZmluZWQuXG4gICAgdmFyIHJlc29sdmVkU2l6ZSA9IHJlc29sdmVkRW5kIC0gcmVzb2x2ZWRCZWdpbjtcbiAgICB2YXIgc2xpY2VTaXplO1xuICAgIGlmIChyZXNvbHZlZFNpemUgPT09IHJlc29sdmVkU2l6ZSkge1xuICAgICAgc2xpY2VTaXplID0gcmVzb2x2ZWRTaXplIDwgMCA/IDAgOiByZXNvbHZlZFNpemU7XG4gICAgfVxuXG4gICAgdmFyIHNsaWNlU2VxID0gbWFrZVNlcXVlbmNlKGl0ZXJhYmxlKTtcblxuICAgIC8vIElmIGl0ZXJhYmxlLnNpemUgaXMgdW5kZWZpbmVkLCB0aGUgc2l6ZSBvZiB0aGUgcmVhbGl6ZWQgc2xpY2VTZXEgaXNcbiAgICAvLyB1bmtub3duIGF0IHRoaXMgcG9pbnQgdW5sZXNzIHRoZSBudW1iZXIgb2YgaXRlbXMgdG8gc2xpY2UgaXMgMFxuICAgIHNsaWNlU2VxLnNpemUgPSBzbGljZVNpemUgPT09IDAgPyBzbGljZVNpemUgOiBpdGVyYWJsZS5zaXplICYmIHNsaWNlU2l6ZSB8fCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIXVzZUtleXMgJiYgaXNTZXEoaXRlcmFibGUpICYmIHNsaWNlU2l6ZSA+PSAwKSB7XG4gICAgICBzbGljZVNlcS5nZXQgPSBmdW5jdGlvbiAoaW5kZXgsIG5vdFNldFZhbHVlKSB7XG4gICAgICAgIGluZGV4ID0gd3JhcEluZGV4KHRoaXMsIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgJiYgaW5kZXggPCBzbGljZVNpemUgP1xuICAgICAgICAgIGl0ZXJhYmxlLmdldChpbmRleCArIHJlc29sdmVkQmVnaW4sIG5vdFNldFZhbHVlKSA6XG4gICAgICAgICAgbm90U2V0VmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2xpY2VTZXEuX19pdGVyYXRlVW5jYWNoZWQgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge3ZhciB0aGlzJDAgPSB0aGlzO1xuICAgICAgaWYgKHNsaWNlU2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRlKGZuLCByZXZlcnNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBza2lwcGVkID0gMDtcbiAgICAgIHZhciBpc1NraXBwaW5nID0gdHJ1ZTtcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIGl0ZXJhYmxlLl9faXRlcmF0ZShmdW5jdGlvbih2LCBrKSAge1xuICAgICAgICBpZiAoIShpc1NraXBwaW5nICYmIChpc1NraXBwaW5nID0gc2tpcHBlZCsrIDwgcmVzb2x2ZWRCZWdpbikpKSB7XG4gICAgICAgICAgaXRlcmF0aW9ucysrO1xuICAgICAgICAgIHJldHVybiBmbih2LCB1c2VLZXlzID8gayA6IGl0ZXJhdGlvbnMgLSAxLCB0aGlzJDApICE9PSBmYWxzZSAmJlxuICAgICAgICAgICAgICAgICBpdGVyYXRpb25zICE9PSBzbGljZVNpemU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gICAgfTtcblxuICAgIHNsaWNlU2VxLl9faXRlcmF0b3JVbmNhY2hlZCA9IGZ1bmN0aW9uKHR5cGUsIHJldmVyc2UpIHtcbiAgICAgIGlmIChzbGljZVNpemUgIT09IDAgJiYgcmV2ZXJzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gICAgICB9XG4gICAgICAvLyBEb24ndCBib3RoZXIgaW5zdGFudGlhdGluZyBwYXJlbnQgaXRlcmF0b3IgaWYgdGFraW5nIDAuXG4gICAgICB2YXIgaXRlcmF0b3IgPSBzbGljZVNpemUgIT09IDAgJiYgaXRlcmFibGUuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICAgIHZhciBza2lwcGVkID0gMDtcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24oKSAge1xuICAgICAgICB3aGlsZSAoc2tpcHBlZCsrIDwgcmVzb2x2ZWRCZWdpbikge1xuICAgICAgICAgIGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKytpdGVyYXRpb25zID4gc2xpY2VTaXplKSB7XG4gICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yRG9uZSgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICBpZiAodXNlS2V5cyB8fCB0eXBlID09PSBJVEVSQVRFX1ZBTFVFUykge1xuICAgICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IElURVJBVEVfS0VZUykge1xuICAgICAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKHR5cGUsIGl0ZXJhdGlvbnMgLSAxLCB1bmRlZmluZWQsIHN0ZXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKHR5cGUsIGl0ZXJhdGlvbnMgLSAxLCBzdGVwLnZhbHVlWzFdLCBzdGVwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNsaWNlU2VxO1xuICB9XG5cblxuICBmdW5jdGlvbiB0YWtlV2hpbGVGYWN0b3J5KGl0ZXJhYmxlLCBwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgdGFrZVNlcXVlbmNlID0gbWFrZVNlcXVlbmNlKGl0ZXJhYmxlKTtcbiAgICB0YWtlU2VxdWVuY2UuX19pdGVyYXRlVW5jYWNoZWQgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge3ZhciB0aGlzJDAgPSB0aGlzO1xuICAgICAgaWYgKHJldmVyc2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVSZXN1bHQoKS5fX2l0ZXJhdGUoZm4sIHJldmVyc2UpO1xuICAgICAgfVxuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgaXRlcmFibGUuX19pdGVyYXRlKGZ1bmN0aW9uKHYsIGssIGMpIFxuICAgICAgICB7cmV0dXJuIHByZWRpY2F0ZS5jYWxsKGNvbnRleHQsIHYsIGssIGMpICYmICsraXRlcmF0aW9ucyAmJiBmbih2LCBrLCB0aGlzJDApfVxuICAgICAgKTtcbiAgICAgIHJldHVybiBpdGVyYXRpb25zO1xuICAgIH07XG4gICAgdGFrZVNlcXVlbmNlLl9faXRlcmF0b3JVbmNhY2hlZCA9IGZ1bmN0aW9uKHR5cGUsIHJldmVyc2UpIHt2YXIgdGhpcyQwID0gdGhpcztcbiAgICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhYmxlLl9faXRlcmF0b3IoSVRFUkFURV9FTlRSSUVTLCByZXZlcnNlKTtcbiAgICAgIHZhciBpdGVyYXRpbmcgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbigpICB7XG4gICAgICAgIGlmICghaXRlcmF0aW5nKSB7XG4gICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yRG9uZSgpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICAgICAgcmV0dXJuIHN0ZXA7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgdmFyIGsgPSBlbnRyeVswXTtcbiAgICAgICAgdmFyIHYgPSBlbnRyeVsxXTtcbiAgICAgICAgaWYgKCFwcmVkaWNhdGUuY2FsbChjb250ZXh0LCB2LCBrLCB0aGlzJDApKSB7XG4gICAgICAgICAgaXRlcmF0aW5nID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yRG9uZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0eXBlID09PSBJVEVSQVRFX0VOVFJJRVMgPyBzdGVwIDpcbiAgICAgICAgICBpdGVyYXRvclZhbHVlKHR5cGUsIGssIHYsIHN0ZXApO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gdGFrZVNlcXVlbmNlO1xuICB9XG5cblxuICBmdW5jdGlvbiBza2lwV2hpbGVGYWN0b3J5KGl0ZXJhYmxlLCBwcmVkaWNhdGUsIGNvbnRleHQsIHVzZUtleXMpIHtcbiAgICB2YXIgc2tpcFNlcXVlbmNlID0gbWFrZVNlcXVlbmNlKGl0ZXJhYmxlKTtcbiAgICBza2lwU2VxdWVuY2UuX19pdGVyYXRlVW5jYWNoZWQgPSBmdW5jdGlvbiAoZm4sIHJldmVyc2UpIHt2YXIgdGhpcyQwID0gdGhpcztcbiAgICAgIGlmIChyZXZlcnNlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlUmVzdWx0KCkuX19pdGVyYXRlKGZuLCByZXZlcnNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBpc1NraXBwaW5nID0gdHJ1ZTtcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIGl0ZXJhYmxlLl9faXRlcmF0ZShmdW5jdGlvbih2LCBrLCBjKSAge1xuICAgICAgICBpZiAoIShpc1NraXBwaW5nICYmIChpc1NraXBwaW5nID0gcHJlZGljYXRlLmNhbGwoY29udGV4dCwgdiwgaywgYykpKSkge1xuICAgICAgICAgIGl0ZXJhdGlvbnMrKztcbiAgICAgICAgICByZXR1cm4gZm4odiwgdXNlS2V5cyA/IGsgOiBpdGVyYXRpb25zIC0gMSwgdGhpcyQwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gaXRlcmF0aW9ucztcbiAgICB9O1xuICAgIHNraXBTZXF1ZW5jZS5fX2l0ZXJhdG9yVW5jYWNoZWQgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7dmFyIHRoaXMkMCA9IHRoaXM7XG4gICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSk7XG4gICAgICB9XG4gICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYWJsZS5fX2l0ZXJhdG9yKElURVJBVEVfRU5UUklFUywgcmV2ZXJzZSk7XG4gICAgICB2YXIgc2tpcHBpbmcgPSB0cnVlO1xuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcihmdW5jdGlvbigpICB7XG4gICAgICAgIHZhciBzdGVwLCBrLCB2O1xuICAgICAgICBkbyB7XG4gICAgICAgICAgc3RlcCA9IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBpZiAoc3RlcC5kb25lKSB7XG4gICAgICAgICAgICBpZiAodXNlS2V5cyB8fCB0eXBlID09PSBJVEVSQVRFX1ZBTFVFUykge1xuICAgICAgICAgICAgICByZXR1cm4gc3RlcDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gSVRFUkFURV9LRVlTKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKHR5cGUsIGl0ZXJhdGlvbnMrKywgdW5kZWZpbmVkLCBzdGVwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvclZhbHVlKHR5cGUsIGl0ZXJhdGlvbnMrKywgc3RlcC52YWx1ZVsxXSwgc3RlcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBlbnRyeSA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgayA9IGVudHJ5WzBdO1xuICAgICAgICAgIHYgPSBlbnRyeVsxXTtcbiAgICAgICAgICBza2lwcGluZyAmJiAoc2tpcHBpbmcgPSBwcmVkaWNhdGUuY2FsbChjb250ZXh0LCB2LCBrLCB0aGlzJDApKTtcbiAgICAgICAgfSB3aGlsZSAoc2tpcHBpbmcpO1xuICAgICAgICByZXR1cm4gdHlwZSA9PT0gSVRFUkFURV9FTlRSSUVTID8gc3RlcCA6XG4gICAgICAgICAgaXRlcmF0b3JWYWx1ZSh0eXBlLCBrLCB2LCBzdGVwKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIHNraXBTZXF1ZW5jZTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gY29uY2F0RmFjdG9yeShpdGVyYWJsZSwgdmFsdWVzKSB7XG4gICAgdmFyIGlzS2V5ZWRJdGVyYWJsZSA9IGlzS2V5ZWQoaXRlcmFibGUpO1xuICAgIHZhciBpdGVycyA9IFtpdGVyYWJsZV0uY29uY2F0KHZhbHVlcykubWFwKGZ1bmN0aW9uKHYgKSB7XG4gICAgICBpZiAoIWlzSXRlcmFibGUodikpIHtcbiAgICAgICAgdiA9IGlzS2V5ZWRJdGVyYWJsZSA/XG4gICAgICAgICAga2V5ZWRTZXFGcm9tVmFsdWUodikgOlxuICAgICAgICAgIGluZGV4ZWRTZXFGcm9tVmFsdWUoQXJyYXkuaXNBcnJheSh2KSA/IHYgOiBbdl0pO1xuICAgICAgfSBlbHNlIGlmIChpc0tleWVkSXRlcmFibGUpIHtcbiAgICAgICAgdiA9IEtleWVkSXRlcmFibGUodik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdjtcbiAgICB9KS5maWx0ZXIoZnVuY3Rpb24odiApIHtyZXR1cm4gdi5zaXplICE9PSAwfSk7XG5cbiAgICBpZiAoaXRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gaXRlcmFibGU7XG4gICAgfVxuXG4gICAgaWYgKGl0ZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIHNpbmdsZXRvbiA9IGl0ZXJzWzBdO1xuICAgICAgaWYgKHNpbmdsZXRvbiA9PT0gaXRlcmFibGUgfHxcbiAgICAgICAgICBpc0tleWVkSXRlcmFibGUgJiYgaXNLZXllZChzaW5nbGV0b24pIHx8XG4gICAgICAgICAgaXNJbmRleGVkKGl0ZXJhYmxlKSAmJiBpc0luZGV4ZWQoc2luZ2xldG9uKSkge1xuICAgICAgICByZXR1cm4gc2luZ2xldG9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjb25jYXRTZXEgPSBuZXcgQXJyYXlTZXEoaXRlcnMpO1xuICAgIGlmIChpc0tleWVkSXRlcmFibGUpIHtcbiAgICAgIGNvbmNhdFNlcSA9IGNvbmNhdFNlcS50b0tleWVkU2VxKCk7XG4gICAgfSBlbHNlIGlmICghaXNJbmRleGVkKGl0ZXJhYmxlKSkge1xuICAgICAgY29uY2F0U2VxID0gY29uY2F0U2VxLnRvU2V0U2VxKCk7XG4gICAgfVxuICAgIGNvbmNhdFNlcSA9IGNvbmNhdFNlcS5mbGF0dGVuKHRydWUpO1xuICAgIGNvbmNhdFNlcS5zaXplID0gaXRlcnMucmVkdWNlKFxuICAgICAgZnVuY3Rpb24oc3VtLCBzZXEpICB7XG4gICAgICAgIGlmIChzdW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHZhciBzaXplID0gc2VxLnNpemU7XG4gICAgICAgICAgaWYgKHNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1bSArIHNpemU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgMFxuICAgICk7XG4gICAgcmV0dXJuIGNvbmNhdFNlcTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gZmxhdHRlbkZhY3RvcnkoaXRlcmFibGUsIGRlcHRoLCB1c2VLZXlzKSB7XG4gICAgdmFyIGZsYXRTZXF1ZW5jZSA9IG1ha2VTZXF1ZW5jZShpdGVyYWJsZSk7XG4gICAgZmxhdFNlcXVlbmNlLl9faXRlcmF0ZVVuY2FjaGVkID0gZnVuY3Rpb24oZm4sIHJldmVyc2UpIHtcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHZhciBzdG9wcGVkID0gZmFsc2U7XG4gICAgICBmdW5jdGlvbiBmbGF0RGVlcChpdGVyLCBjdXJyZW50RGVwdGgpIHt2YXIgdGhpcyQwID0gdGhpcztcbiAgICAgICAgaXRlci5fX2l0ZXJhdGUoZnVuY3Rpb24odiwgaykgIHtcbiAgICAgICAgICBpZiAoKCFkZXB0aCB8fCBjdXJyZW50RGVwdGggPCBkZXB0aCkgJiYgaXNJdGVyYWJsZSh2KSkge1xuICAgICAgICAgICAgZmxhdERlZXAodiwgY3VycmVudERlcHRoICsgMSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChmbih2LCB1c2VLZXlzID8gayA6IGl0ZXJhdGlvbnMrKywgdGhpcyQwKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gIXN0b3BwZWQ7XG4gICAgICAgIH0sIHJldmVyc2UpO1xuICAgICAgfVxuICAgICAgZmxhdERlZXAoaXRlcmFibGUsIDApO1xuICAgICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gICAgfVxuICAgIGZsYXRTZXF1ZW5jZS5fX2l0ZXJhdG9yVW5jYWNoZWQgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgICB2YXIgaXRlcmF0b3IgPSBpdGVyYWJsZS5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgICAgdmFyIHN0YWNrID0gW107XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkgIHtcbiAgICAgICAgd2hpbGUgKGl0ZXJhdG9yKSB7XG4gICAgICAgICAgdmFyIHN0ZXAgPSBpdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgaWYgKHN0ZXAuZG9uZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGl0ZXJhdG9yID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHYgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgIGlmICh0eXBlID09PSBJVEVSQVRFX0VOVFJJRVMpIHtcbiAgICAgICAgICAgIHYgPSB2WzFdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoKCFkZXB0aCB8fCBzdGFjay5sZW5ndGggPCBkZXB0aCkgJiYgaXNJdGVyYWJsZSh2KSkge1xuICAgICAgICAgICAgc3RhY2sucHVzaChpdGVyYXRvcik7XG4gICAgICAgICAgICBpdGVyYXRvciA9IHYuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHVzZUtleXMgPyBzdGVwIDogaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zKyssIHYsIHN0ZXApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlcmF0b3JEb25lKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZsYXRTZXF1ZW5jZTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gZmxhdE1hcEZhY3RvcnkoaXRlcmFibGUsIG1hcHBlciwgY29udGV4dCkge1xuICAgIHZhciBjb2VyY2UgPSBpdGVyYWJsZUNsYXNzKGl0ZXJhYmxlKTtcbiAgICByZXR1cm4gaXRlcmFibGUudG9TZXEoKS5tYXAoXG4gICAgICBmdW5jdGlvbih2LCBrKSAge3JldHVybiBjb2VyY2UobWFwcGVyLmNhbGwoY29udGV4dCwgdiwgaywgaXRlcmFibGUpKX1cbiAgICApLmZsYXR0ZW4odHJ1ZSk7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIGludGVycG9zZUZhY3RvcnkoaXRlcmFibGUsIHNlcGFyYXRvcikge1xuICAgIHZhciBpbnRlcnBvc2VkU2VxdWVuY2UgPSBtYWtlU2VxdWVuY2UoaXRlcmFibGUpO1xuICAgIGludGVycG9zZWRTZXF1ZW5jZS5zaXplID0gaXRlcmFibGUuc2l6ZSAmJiBpdGVyYWJsZS5zaXplICogMiAtMTtcbiAgICBpbnRlcnBvc2VkU2VxdWVuY2UuX19pdGVyYXRlVW5jYWNoZWQgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge3ZhciB0aGlzJDAgPSB0aGlzO1xuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgaXRlcmFibGUuX19pdGVyYXRlKGZ1bmN0aW9uKHYsIGspIFxuICAgICAgICB7cmV0dXJuICghaXRlcmF0aW9ucyB8fCBmbihzZXBhcmF0b3IsIGl0ZXJhdGlvbnMrKywgdGhpcyQwKSAhPT0gZmFsc2UpICYmXG4gICAgICAgIGZuKHYsIGl0ZXJhdGlvbnMrKywgdGhpcyQwKSAhPT0gZmFsc2V9LFxuICAgICAgICByZXZlcnNlXG4gICAgICApO1xuICAgICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gICAgfTtcbiAgICBpbnRlcnBvc2VkU2VxdWVuY2UuX19pdGVyYXRvclVuY2FjaGVkID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmFibGUuX19pdGVyYXRvcihJVEVSQVRFX1ZBTFVFUywgcmV2ZXJzZSk7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICB2YXIgc3RlcDtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24oKSAge1xuICAgICAgICBpZiAoIXN0ZXAgfHwgaXRlcmF0aW9ucyAlIDIpIHtcbiAgICAgICAgICBzdGVwID0gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGlmIChzdGVwLmRvbmUpIHtcbiAgICAgICAgICAgIHJldHVybiBzdGVwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlcmF0aW9ucyAlIDIgP1xuICAgICAgICAgIGl0ZXJhdG9yVmFsdWUodHlwZSwgaXRlcmF0aW9ucysrLCBzZXBhcmF0b3IpIDpcbiAgICAgICAgICBpdGVyYXRvclZhbHVlKHR5cGUsIGl0ZXJhdGlvbnMrKywgc3RlcC52YWx1ZSwgc3RlcCk7XG4gICAgICB9KTtcbiAgICB9O1xuICAgIHJldHVybiBpbnRlcnBvc2VkU2VxdWVuY2U7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIHNvcnRGYWN0b3J5KGl0ZXJhYmxlLCBjb21wYXJhdG9yLCBtYXBwZXIpIHtcbiAgICBpZiAoIWNvbXBhcmF0b3IpIHtcbiAgICAgIGNvbXBhcmF0b3IgPSBkZWZhdWx0Q29tcGFyYXRvcjtcbiAgICB9XG4gICAgdmFyIGlzS2V5ZWRJdGVyYWJsZSA9IGlzS2V5ZWQoaXRlcmFibGUpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGVudHJpZXMgPSBpdGVyYWJsZS50b1NlcSgpLm1hcChcbiAgICAgIGZ1bmN0aW9uKHYsIGspICB7cmV0dXJuIFtrLCB2LCBpbmRleCsrLCBtYXBwZXIgPyBtYXBwZXIodiwgaywgaXRlcmFibGUpIDogdl19XG4gICAgKS50b0FycmF5KCk7XG4gICAgZW50cmllcy5zb3J0KGZ1bmN0aW9uKGEsIGIpICB7cmV0dXJuIGNvbXBhcmF0b3IoYVszXSwgYlszXSkgfHwgYVsyXSAtIGJbMl19KS5mb3JFYWNoKFxuICAgICAgaXNLZXllZEl0ZXJhYmxlID9cbiAgICAgIGZ1bmN0aW9uKHYsIGkpICB7IGVudHJpZXNbaV0ubGVuZ3RoID0gMjsgfSA6XG4gICAgICBmdW5jdGlvbih2LCBpKSAgeyBlbnRyaWVzW2ldID0gdlsxXTsgfVxuICAgICk7XG4gICAgcmV0dXJuIGlzS2V5ZWRJdGVyYWJsZSA/IEtleWVkU2VxKGVudHJpZXMpIDpcbiAgICAgIGlzSW5kZXhlZChpdGVyYWJsZSkgPyBJbmRleGVkU2VxKGVudHJpZXMpIDpcbiAgICAgIFNldFNlcShlbnRyaWVzKTtcbiAgfVxuXG5cbiAgZnVuY3Rpb24gbWF4RmFjdG9yeShpdGVyYWJsZSwgY29tcGFyYXRvciwgbWFwcGVyKSB7XG4gICAgaWYgKCFjb21wYXJhdG9yKSB7XG4gICAgICBjb21wYXJhdG9yID0gZGVmYXVsdENvbXBhcmF0b3I7XG4gICAgfVxuICAgIGlmIChtYXBwZXIpIHtcbiAgICAgIHZhciBlbnRyeSA9IGl0ZXJhYmxlLnRvU2VxKClcbiAgICAgICAgLm1hcChmdW5jdGlvbih2LCBrKSAge3JldHVybiBbdiwgbWFwcGVyKHYsIGssIGl0ZXJhYmxlKV19KVxuICAgICAgICAucmVkdWNlKGZ1bmN0aW9uKGEsIGIpICB7cmV0dXJuIG1heENvbXBhcmUoY29tcGFyYXRvciwgYVsxXSwgYlsxXSkgPyBiIDogYX0pO1xuICAgICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5WzBdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaXRlcmFibGUucmVkdWNlKGZ1bmN0aW9uKGEsIGIpICB7cmV0dXJuIG1heENvbXBhcmUoY29tcGFyYXRvciwgYSwgYikgPyBiIDogYX0pO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1heENvbXBhcmUoY29tcGFyYXRvciwgYSwgYikge1xuICAgIHZhciBjb21wID0gY29tcGFyYXRvcihiLCBhKTtcbiAgICAvLyBiIGlzIGNvbnNpZGVyZWQgdGhlIG5ldyBtYXggaWYgdGhlIGNvbXBhcmF0b3IgZGVjbGFyZXMgdGhlbSBlcXVhbCwgYnV0XG4gICAgLy8gdGhleSBhcmUgbm90IGVxdWFsIGFuZCBiIGlzIGluIGZhY3QgYSBudWxsaXNoIHZhbHVlLlxuICAgIHJldHVybiAoY29tcCA9PT0gMCAmJiBiICE9PSBhICYmIChiID09PSB1bmRlZmluZWQgfHwgYiA9PT0gbnVsbCB8fCBiICE9PSBiKSkgfHwgY29tcCA+IDA7XG4gIH1cblxuXG4gIGZ1bmN0aW9uIHppcFdpdGhGYWN0b3J5KGtleUl0ZXIsIHppcHBlciwgaXRlcnMpIHtcbiAgICB2YXIgemlwU2VxdWVuY2UgPSBtYWtlU2VxdWVuY2Uoa2V5SXRlcik7XG4gICAgemlwU2VxdWVuY2Uuc2l6ZSA9IG5ldyBBcnJheVNlcShpdGVycykubWFwKGZ1bmN0aW9uKGkgKSB7cmV0dXJuIGkuc2l6ZX0pLm1pbigpO1xuICAgIC8vIE5vdGU6IHRoaXMgYSBnZW5lcmljIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgX19pdGVyYXRlIGluIHRlcm1zIG9mXG4gICAgLy8gX19pdGVyYXRvciB3aGljaCBtYXkgYmUgbW9yZSBnZW5lcmljYWxseSB1c2VmdWwgaW4gdGhlIGZ1dHVyZS5cbiAgICB6aXBTZXF1ZW5jZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge1xuICAgICAgLyogZ2VuZXJpYzpcbiAgICAgIHZhciBpdGVyYXRvciA9IHRoaXMuX19pdGVyYXRvcihJVEVSQVRFX0VOVFJJRVMsIHJldmVyc2UpO1xuICAgICAgdmFyIHN0ZXA7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgIGl0ZXJhdGlvbnMrKztcbiAgICAgICAgaWYgKGZuKHN0ZXAudmFsdWVbMV0sIHN0ZXAudmFsdWVbMF0sIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlcmF0aW9ucztcbiAgICAgICovXG4gICAgICAvLyBpbmRleGVkOlxuICAgICAgdmFyIGl0ZXJhdG9yID0gdGhpcy5fX2l0ZXJhdG9yKElURVJBVEVfVkFMVUVTLCByZXZlcnNlKTtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgdmFyIGl0ZXJhdGlvbnMgPSAwO1xuICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICBpZiAoZm4oc3RlcC52YWx1ZSwgaXRlcmF0aW9ucysrLCB0aGlzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZXJhdGlvbnM7XG4gICAgfTtcbiAgICB6aXBTZXF1ZW5jZS5fX2l0ZXJhdG9yVW5jYWNoZWQgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgICB2YXIgaXRlcmF0b3JzID0gaXRlcnMubWFwKGZ1bmN0aW9uKGkgKVxuICAgICAgICB7cmV0dXJuIChpID0gSXRlcmFibGUoaSksIGdldEl0ZXJhdG9yKHJldmVyc2UgPyBpLnJldmVyc2UoKSA6IGkpKX1cbiAgICAgICk7XG4gICAgICB2YXIgaXRlcmF0aW9ucyA9IDA7XG4gICAgICB2YXIgaXNEb25lID0gZmFsc2U7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yKGZ1bmN0aW9uKCkgIHtcbiAgICAgICAgdmFyIHN0ZXBzO1xuICAgICAgICBpZiAoIWlzRG9uZSkge1xuICAgICAgICAgIHN0ZXBzID0gaXRlcmF0b3JzLm1hcChmdW5jdGlvbihpICkge3JldHVybiBpLm5leHQoKX0pO1xuICAgICAgICAgIGlzRG9uZSA9IHN0ZXBzLnNvbWUoZnVuY3Rpb24ocyApIHtyZXR1cm4gcy5kb25lfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRG9uZSkge1xuICAgICAgICAgIHJldHVybiBpdGVyYXRvckRvbmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZShcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIGl0ZXJhdGlvbnMrKyxcbiAgICAgICAgICB6aXBwZXIuYXBwbHkobnVsbCwgc3RlcHMubWFwKGZ1bmN0aW9uKHMgKSB7cmV0dXJuIHMudmFsdWV9KSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIHppcFNlcXVlbmNlXG4gIH1cblxuXG4gIC8vICNwcmFnbWEgSGVscGVyIEZ1bmN0aW9uc1xuXG4gIGZ1bmN0aW9uIHJlaWZ5KGl0ZXIsIHNlcSkge1xuICAgIHJldHVybiBpc1NlcShpdGVyKSA/IHNlcSA6IGl0ZXIuY29uc3RydWN0b3Ioc2VxKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHZhbGlkYXRlRW50cnkoZW50cnkpIHtcbiAgICBpZiAoZW50cnkgIT09IE9iamVjdChlbnRyeSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFtLLCBWXSB0dXBsZTogJyArIGVudHJ5KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZXNvbHZlU2l6ZShpdGVyKSB7XG4gICAgYXNzZXJ0Tm90SW5maW5pdGUoaXRlci5zaXplKTtcbiAgICByZXR1cm4gZW5zdXJlU2l6ZShpdGVyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGl0ZXJhYmxlQ2xhc3MoaXRlcmFibGUpIHtcbiAgICByZXR1cm4gaXNLZXllZChpdGVyYWJsZSkgPyBLZXllZEl0ZXJhYmxlIDpcbiAgICAgIGlzSW5kZXhlZChpdGVyYWJsZSkgPyBJbmRleGVkSXRlcmFibGUgOlxuICAgICAgU2V0SXRlcmFibGU7XG4gIH1cblxuICBmdW5jdGlvbiBtYWtlU2VxdWVuY2UoaXRlcmFibGUpIHtcbiAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShcbiAgICAgIChcbiAgICAgICAgaXNLZXllZChpdGVyYWJsZSkgPyBLZXllZFNlcSA6XG4gICAgICAgIGlzSW5kZXhlZChpdGVyYWJsZSkgPyBJbmRleGVkU2VxIDpcbiAgICAgICAgU2V0U2VxXG4gICAgICApLnByb3RvdHlwZVxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBjYWNoZVJlc3VsdFRocm91Z2goKSB7XG4gICAgaWYgKHRoaXMuX2l0ZXIuY2FjaGVSZXN1bHQpIHtcbiAgICAgIHRoaXMuX2l0ZXIuY2FjaGVSZXN1bHQoKTtcbiAgICAgIHRoaXMuc2l6ZSA9IHRoaXMuX2l0ZXIuc2l6ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gU2VxLnByb3RvdHlwZS5jYWNoZVJlc3VsdC5jYWxsKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlZmF1bHRDb21wYXJhdG9yKGEsIGIpIHtcbiAgICByZXR1cm4gYSA+IGIgPyAxIDogYSA8IGIgPyAtMSA6IDA7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JjZUl0ZXJhdG9yKGtleVBhdGgpIHtcbiAgICB2YXIgaXRlciA9IGdldEl0ZXJhdG9yKGtleVBhdGgpO1xuICAgIGlmICghaXRlcikge1xuICAgICAgLy8gQXJyYXkgbWlnaHQgbm90IGJlIGl0ZXJhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQsIHNvIHdlIG5lZWQgYSBmYWxsYmFja1xuICAgICAgLy8gdG8gb3VyIHdyYXBwZWQgdHlwZS5cbiAgICAgIGlmICghaXNBcnJheUxpa2Uoa2V5UGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgaXRlcmFibGUgb3IgYXJyYXktbGlrZTogJyArIGtleVBhdGgpO1xuICAgICAgfVxuICAgICAgaXRlciA9IGdldEl0ZXJhdG9yKEl0ZXJhYmxlKGtleVBhdGgpKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZXI7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhSZWNvcmQsIEtleWVkQ29sbGVjdGlvbik7XG5cbiAgICBmdW5jdGlvbiBSZWNvcmQoZGVmYXVsdFZhbHVlcywgbmFtZSkge1xuICAgICAgdmFyIGhhc0luaXRpYWxpemVkO1xuXG4gICAgICB2YXIgUmVjb3JkVHlwZSA9IGZ1bmN0aW9uIFJlY29yZCh2YWx1ZXMpIHtcbiAgICAgICAgaWYgKHZhbHVlcyBpbnN0YW5jZW9mIFJlY29yZFR5cGUpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBSZWNvcmRUeXBlKSkge1xuICAgICAgICAgIHJldHVybiBuZXcgUmVjb3JkVHlwZSh2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaGFzSW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICBoYXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhkZWZhdWx0VmFsdWVzKTtcbiAgICAgICAgICBzZXRQcm9wcyhSZWNvcmRUeXBlUHJvdG90eXBlLCBrZXlzKTtcbiAgICAgICAgICBSZWNvcmRUeXBlUHJvdG90eXBlLnNpemUgPSBrZXlzLmxlbmd0aDtcbiAgICAgICAgICBSZWNvcmRUeXBlUHJvdG90eXBlLl9uYW1lID0gbmFtZTtcbiAgICAgICAgICBSZWNvcmRUeXBlUHJvdG90eXBlLl9rZXlzID0ga2V5cztcbiAgICAgICAgICBSZWNvcmRUeXBlUHJvdG90eXBlLl9kZWZhdWx0VmFsdWVzID0gZGVmYXVsdFZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAgPSBNYXAodmFsdWVzKTtcbiAgICAgIH07XG5cbiAgICAgIHZhciBSZWNvcmRUeXBlUHJvdG90eXBlID0gUmVjb3JkVHlwZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFJlY29yZFByb3RvdHlwZSk7XG4gICAgICBSZWNvcmRUeXBlUHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmVjb3JkVHlwZTtcblxuICAgICAgcmV0dXJuIFJlY29yZFR5cGU7XG4gICAgfVxuXG4gICAgUmVjb3JkLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX190b1N0cmluZyhyZWNvcmROYW1lKHRoaXMpICsgJyB7JywgJ30nKTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBBY2Nlc3NcblxuICAgIFJlY29yZC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24oaykge1xuICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRWYWx1ZXMuaGFzT3duUHJvcGVydHkoayk7XG4gICAgfTtcblxuICAgIFJlY29yZC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oaywgbm90U2V0VmFsdWUpIHtcbiAgICAgIGlmICghdGhpcy5oYXMoaykpIHtcbiAgICAgICAgcmV0dXJuIG5vdFNldFZhbHVlO1xuICAgICAgfVxuICAgICAgdmFyIGRlZmF1bHRWYWwgPSB0aGlzLl9kZWZhdWx0VmFsdWVzW2tdO1xuICAgICAgcmV0dXJuIHRoaXMuX21hcCA/IHRoaXMuX21hcC5nZXQoaywgZGVmYXVsdFZhbCkgOiBkZWZhdWx0VmFsO1xuICAgIH07XG5cbiAgICAvLyBAcHJhZ21hIE1vZGlmaWNhdGlvblxuXG4gICAgUmVjb3JkLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuX19vd25lcklEKSB7XG4gICAgICAgIHRoaXMuX21hcCAmJiB0aGlzLl9tYXAuY2xlYXIoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB2YXIgUmVjb3JkVHlwZSA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICByZXR1cm4gUmVjb3JkVHlwZS5fZW1wdHkgfHwgKFJlY29yZFR5cGUuX2VtcHR5ID0gbWFrZVJlY29yZCh0aGlzLCBlbXB0eU1hcCgpKSk7XG4gICAgfTtcblxuICAgIFJlY29yZC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oaywgdikge1xuICAgICAgaWYgKCF0aGlzLmhhcyhrKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzZXQgdW5rbm93biBrZXkgXCInICsgayArICdcIiBvbiAnICsgcmVjb3JkTmFtZSh0aGlzKSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fbWFwICYmICF0aGlzLl9tYXAuaGFzKGspKSB7XG4gICAgICAgIHZhciBkZWZhdWx0VmFsID0gdGhpcy5fZGVmYXVsdFZhbHVlc1trXTtcbiAgICAgICAgaWYgKHYgPT09IGRlZmF1bHRWYWwpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIG5ld01hcCA9IHRoaXMuX21hcCAmJiB0aGlzLl9tYXAuc2V0KGssIHYpO1xuICAgICAgaWYgKHRoaXMuX19vd25lcklEIHx8IG5ld01hcCA9PT0gdGhpcy5fbWFwKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ha2VSZWNvcmQodGhpcywgbmV3TWFwKTtcbiAgICB9O1xuXG4gICAgUmVjb3JkLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbihrKSB7XG4gICAgICBpZiAoIXRoaXMuaGFzKGspKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgdmFyIG5ld01hcCA9IHRoaXMuX21hcCAmJiB0aGlzLl9tYXAucmVtb3ZlKGspO1xuICAgICAgaWYgKHRoaXMuX19vd25lcklEIHx8IG5ld01hcCA9PT0gdGhpcy5fbWFwKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ha2VSZWNvcmQodGhpcywgbmV3TWFwKTtcbiAgICB9O1xuXG4gICAgUmVjb3JkLnByb3RvdHlwZS53YXNBbHRlcmVkID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwLndhc0FsdGVyZWQoKTtcbiAgICB9O1xuXG4gICAgUmVjb3JkLnByb3RvdHlwZS5fX2l0ZXJhdG9yID0gZnVuY3Rpb24odHlwZSwgcmV2ZXJzZSkge3ZhciB0aGlzJDAgPSB0aGlzO1xuICAgICAgcmV0dXJuIEtleWVkSXRlcmFibGUodGhpcy5fZGVmYXVsdFZhbHVlcykubWFwKGZ1bmN0aW9uKF8sIGspICB7cmV0dXJuIHRoaXMkMC5nZXQoayl9KS5fX2l0ZXJhdG9yKHR5cGUsIHJldmVyc2UpO1xuICAgIH07XG5cbiAgICBSZWNvcmQucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7dmFyIHRoaXMkMCA9IHRoaXM7XG4gICAgICByZXR1cm4gS2V5ZWRJdGVyYWJsZSh0aGlzLl9kZWZhdWx0VmFsdWVzKS5tYXAoZnVuY3Rpb24oXywgaykgIHtyZXR1cm4gdGhpcyQwLmdldChrKX0pLl9faXRlcmF0ZShmbiwgcmV2ZXJzZSk7XG4gICAgfTtcblxuICAgIFJlY29yZC5wcm90b3R5cGUuX19lbnN1cmVPd25lciA9IGZ1bmN0aW9uKG93bmVySUQpIHtcbiAgICAgIGlmIChvd25lcklEID09PSB0aGlzLl9fb3duZXJJRCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHZhciBuZXdNYXAgPSB0aGlzLl9tYXAgJiYgdGhpcy5fbWFwLl9fZW5zdXJlT3duZXIob3duZXJJRCk7XG4gICAgICBpZiAoIW93bmVySUQpIHtcbiAgICAgICAgdGhpcy5fX293bmVySUQgPSBvd25lcklEO1xuICAgICAgICB0aGlzLl9tYXAgPSBuZXdNYXA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ha2VSZWNvcmQodGhpcywgbmV3TWFwLCBvd25lcklEKTtcbiAgICB9O1xuXG5cbiAgdmFyIFJlY29yZFByb3RvdHlwZSA9IFJlY29yZC5wcm90b3R5cGU7XG4gIFJlY29yZFByb3RvdHlwZVtERUxFVEVdID0gUmVjb3JkUHJvdG90eXBlLnJlbW92ZTtcbiAgUmVjb3JkUHJvdG90eXBlLmRlbGV0ZUluID1cbiAgUmVjb3JkUHJvdG90eXBlLnJlbW92ZUluID0gTWFwUHJvdG90eXBlLnJlbW92ZUluO1xuICBSZWNvcmRQcm90b3R5cGUubWVyZ2UgPSBNYXBQcm90b3R5cGUubWVyZ2U7XG4gIFJlY29yZFByb3RvdHlwZS5tZXJnZVdpdGggPSBNYXBQcm90b3R5cGUubWVyZ2VXaXRoO1xuICBSZWNvcmRQcm90b3R5cGUubWVyZ2VJbiA9IE1hcFByb3RvdHlwZS5tZXJnZUluO1xuICBSZWNvcmRQcm90b3R5cGUubWVyZ2VEZWVwID0gTWFwUHJvdG90eXBlLm1lcmdlRGVlcDtcbiAgUmVjb3JkUHJvdG90eXBlLm1lcmdlRGVlcFdpdGggPSBNYXBQcm90b3R5cGUubWVyZ2VEZWVwV2l0aDtcbiAgUmVjb3JkUHJvdG90eXBlLm1lcmdlRGVlcEluID0gTWFwUHJvdG90eXBlLm1lcmdlRGVlcEluO1xuICBSZWNvcmRQcm90b3R5cGUuc2V0SW4gPSBNYXBQcm90b3R5cGUuc2V0SW47XG4gIFJlY29yZFByb3RvdHlwZS51cGRhdGUgPSBNYXBQcm90b3R5cGUudXBkYXRlO1xuICBSZWNvcmRQcm90b3R5cGUudXBkYXRlSW4gPSBNYXBQcm90b3R5cGUudXBkYXRlSW47XG4gIFJlY29yZFByb3RvdHlwZS53aXRoTXV0YXRpb25zID0gTWFwUHJvdG90eXBlLndpdGhNdXRhdGlvbnM7XG4gIFJlY29yZFByb3RvdHlwZS5hc011dGFibGUgPSBNYXBQcm90b3R5cGUuYXNNdXRhYmxlO1xuICBSZWNvcmRQcm90b3R5cGUuYXNJbW11dGFibGUgPSBNYXBQcm90b3R5cGUuYXNJbW11dGFibGU7XG5cblxuICBmdW5jdGlvbiBtYWtlUmVjb3JkKGxpa2VSZWNvcmQsIG1hcCwgb3duZXJJRCkge1xuICAgIHZhciByZWNvcmQgPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihsaWtlUmVjb3JkKSk7XG4gICAgcmVjb3JkLl9tYXAgPSBtYXA7XG4gICAgcmVjb3JkLl9fb3duZXJJRCA9IG93bmVySUQ7XG4gICAgcmV0dXJuIHJlY29yZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlY29yZE5hbWUocmVjb3JkKSB7XG4gICAgcmV0dXJuIHJlY29yZC5fbmFtZSB8fCByZWNvcmQuY29uc3RydWN0b3IubmFtZSB8fCAnUmVjb3JkJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFByb3BzKHByb3RvdHlwZSwgbmFtZXMpIHtcbiAgICB0cnkge1xuICAgICAgbmFtZXMuZm9yRWFjaChzZXRQcm9wLmJpbmQodW5kZWZpbmVkLCBwcm90b3R5cGUpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gT2JqZWN0LmRlZmluZVByb3BlcnR5IGZhaWxlZC4gUHJvYmFibHkgSUU4LlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFByb3AocHJvdG90eXBlLCBuYW1lKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvdHlwZSwgbmFtZSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KG5hbWUpO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgaW52YXJpYW50KHRoaXMuX19vd25lcklELCAnQ2Fubm90IHNldCBvbiBhbiBpbW11dGFibGUgcmVjb3JkLicpO1xuICAgICAgICB0aGlzLnNldChuYW1lLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhTZXQsIFNldENvbGxlY3Rpb24pO1xuXG4gICAgLy8gQHByYWdtYSBDb25zdHJ1Y3Rpb25cblxuICAgIGZ1bmN0aW9uIFNldCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgPyBlbXB0eVNldCgpIDpcbiAgICAgICAgaXNTZXQodmFsdWUpICYmICFpc09yZGVyZWQodmFsdWUpID8gdmFsdWUgOlxuICAgICAgICBlbXB0eVNldCgpLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24oc2V0ICkge1xuICAgICAgICAgIHZhciBpdGVyID0gU2V0SXRlcmFibGUodmFsdWUpO1xuICAgICAgICAgIGFzc2VydE5vdEluZmluaXRlKGl0ZXIuc2l6ZSk7XG4gICAgICAgICAgaXRlci5mb3JFYWNoKGZ1bmN0aW9uKHYgKSB7cmV0dXJuIHNldC5hZGQodil9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgU2V0Lm9mID0gZnVuY3Rpb24oLyouLi52YWx1ZXMqLykge1xuICAgICAgcmV0dXJuIHRoaXMoYXJndW1lbnRzKTtcbiAgICB9O1xuXG4gICAgU2V0LmZyb21LZXlzID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzKEtleWVkSXRlcmFibGUodmFsdWUpLmtleVNlcSgpKTtcbiAgICB9O1xuXG4gICAgU2V0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX190b1N0cmluZygnU2V0IHsnLCAnfScpO1xuICAgIH07XG5cbiAgICAvLyBAcHJhZ21hIEFjY2Vzc1xuXG4gICAgU2V0LnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcC5oYXModmFsdWUpO1xuICAgIH07XG5cbiAgICAvLyBAcHJhZ21hIE1vZGlmaWNhdGlvblxuXG4gICAgU2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHVwZGF0ZVNldCh0aGlzLCB0aGlzLl9tYXAuc2V0KHZhbHVlLCB0cnVlKSk7XG4gICAgfTtcblxuICAgIFNldC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB1cGRhdGVTZXQodGhpcywgdGhpcy5fbWFwLnJlbW92ZSh2YWx1ZSkpO1xuICAgIH07XG5cbiAgICBTZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdXBkYXRlU2V0KHRoaXMsIHRoaXMuX21hcC5jbGVhcigpKTtcbiAgICB9O1xuXG4gICAgLy8gQHByYWdtYSBDb21wb3NpdGlvblxuXG4gICAgU2V0LnByb3RvdHlwZS51bmlvbiA9IGZ1bmN0aW9uKCkge3ZhciBpdGVycyA9IFNMSUNFJDAuY2FsbChhcmd1bWVudHMsIDApO1xuICAgICAgaXRlcnMgPSBpdGVycy5maWx0ZXIoZnVuY3Rpb24oeCApIHtyZXR1cm4geC5zaXplICE9PSAwfSk7XG4gICAgICBpZiAoaXRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCAmJiAhdGhpcy5fX293bmVySUQgJiYgaXRlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKGl0ZXJzWzBdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24oc2V0ICkge1xuICAgICAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgaXRlcnMubGVuZ3RoOyBpaSsrKSB7XG4gICAgICAgICAgU2V0SXRlcmFibGUoaXRlcnNbaWldKS5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlICkge3JldHVybiBzZXQuYWRkKHZhbHVlKX0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgU2V0LnByb3RvdHlwZS5pbnRlcnNlY3QgPSBmdW5jdGlvbigpIHt2YXIgaXRlcnMgPSBTTElDRSQwLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgICAgIGlmIChpdGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICBpdGVycyA9IGl0ZXJzLm1hcChmdW5jdGlvbihpdGVyICkge3JldHVybiBTZXRJdGVyYWJsZShpdGVyKX0pO1xuICAgICAgdmFyIG9yaWdpbmFsU2V0ID0gdGhpcztcbiAgICAgIHJldHVybiB0aGlzLndpdGhNdXRhdGlvbnMoZnVuY3Rpb24oc2V0ICkge1xuICAgICAgICBvcmlnaW5hbFNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlICkge1xuICAgICAgICAgIGlmICghaXRlcnMuZXZlcnkoZnVuY3Rpb24oaXRlciApIHtyZXR1cm4gaXRlci5pbmNsdWRlcyh2YWx1ZSl9KSkge1xuICAgICAgICAgICAgc2V0LnJlbW92ZSh2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBTZXQucHJvdG90eXBlLnN1YnRyYWN0ID0gZnVuY3Rpb24oKSB7dmFyIGl0ZXJzID0gU0xJQ0UkMC5jYWxsKGFyZ3VtZW50cywgMCk7XG4gICAgICBpZiAoaXRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgaXRlcnMgPSBpdGVycy5tYXAoZnVuY3Rpb24oaXRlciApIHtyZXR1cm4gU2V0SXRlcmFibGUoaXRlcil9KTtcbiAgICAgIHZhciBvcmlnaW5hbFNldCA9IHRoaXM7XG4gICAgICByZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKGZ1bmN0aW9uKHNldCApIHtcbiAgICAgICAgb3JpZ2luYWxTZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSApIHtcbiAgICAgICAgICBpZiAoaXRlcnMuc29tZShmdW5jdGlvbihpdGVyICkge3JldHVybiBpdGVyLmluY2x1ZGVzKHZhbHVlKX0pKSB7XG4gICAgICAgICAgICBzZXQucmVtb3ZlKHZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIFNldC5wcm90b3R5cGUubWVyZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnVuaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIFNldC5wcm90b3R5cGUubWVyZ2VXaXRoID0gZnVuY3Rpb24obWVyZ2VyKSB7dmFyIGl0ZXJzID0gU0xJQ0UkMC5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICByZXR1cm4gdGhpcy51bmlvbi5hcHBseSh0aGlzLCBpdGVycyk7XG4gICAgfTtcblxuICAgIFNldC5wcm90b3R5cGUuc29ydCA9IGZ1bmN0aW9uKGNvbXBhcmF0b3IpIHtcbiAgICAgIC8vIExhdGUgYmluZGluZ1xuICAgICAgcmV0dXJuIE9yZGVyZWRTZXQoc29ydEZhY3RvcnkodGhpcywgY29tcGFyYXRvcikpO1xuICAgIH07XG5cbiAgICBTZXQucHJvdG90eXBlLnNvcnRCeSA9IGZ1bmN0aW9uKG1hcHBlciwgY29tcGFyYXRvcikge1xuICAgICAgLy8gTGF0ZSBiaW5kaW5nXG4gICAgICByZXR1cm4gT3JkZXJlZFNldChzb3J0RmFjdG9yeSh0aGlzLCBjb21wYXJhdG9yLCBtYXBwZXIpKTtcbiAgICB9O1xuXG4gICAgU2V0LnByb3RvdHlwZS53YXNBbHRlcmVkID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwLndhc0FsdGVyZWQoKTtcbiAgICB9O1xuXG4gICAgU2V0LnByb3RvdHlwZS5fX2l0ZXJhdGUgPSBmdW5jdGlvbihmbiwgcmV2ZXJzZSkge3ZhciB0aGlzJDAgPSB0aGlzO1xuICAgICAgcmV0dXJuIHRoaXMuX21hcC5fX2l0ZXJhdGUoZnVuY3Rpb24oXywgaykgIHtyZXR1cm4gZm4oaywgaywgdGhpcyQwKX0sIHJldmVyc2UpO1xuICAgIH07XG5cbiAgICBTZXQucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbWFwLm1hcChmdW5jdGlvbihfLCBrKSAge3JldHVybiBrfSkuX19pdGVyYXRvcih0eXBlLCByZXZlcnNlKTtcbiAgICB9O1xuXG4gICAgU2V0LnByb3RvdHlwZS5fX2Vuc3VyZU93bmVyID0gZnVuY3Rpb24ob3duZXJJRCkge1xuICAgICAgaWYgKG93bmVySUQgPT09IHRoaXMuX19vd25lcklEKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgdmFyIG5ld01hcCA9IHRoaXMuX21hcC5fX2Vuc3VyZU93bmVyKG93bmVySUQpO1xuICAgICAgaWYgKCFvd25lcklEKSB7XG4gICAgICAgIHRoaXMuX19vd25lcklEID0gb3duZXJJRDtcbiAgICAgICAgdGhpcy5fbWFwID0gbmV3TWFwO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLl9fbWFrZShuZXdNYXAsIG93bmVySUQpO1xuICAgIH07XG5cblxuICBmdW5jdGlvbiBpc1NldChtYXliZVNldCkge1xuICAgIHJldHVybiAhIShtYXliZVNldCAmJiBtYXliZVNldFtJU19TRVRfU0VOVElORUxdKTtcbiAgfVxuXG4gIFNldC5pc1NldCA9IGlzU2V0O1xuXG4gIHZhciBJU19TRVRfU0VOVElORUwgPSAnQEBfX0lNTVVUQUJMRV9TRVRfX0BAJztcblxuICB2YXIgU2V0UHJvdG90eXBlID0gU2V0LnByb3RvdHlwZTtcbiAgU2V0UHJvdG90eXBlW0lTX1NFVF9TRU5USU5FTF0gPSB0cnVlO1xuICBTZXRQcm90b3R5cGVbREVMRVRFXSA9IFNldFByb3RvdHlwZS5yZW1vdmU7XG4gIFNldFByb3RvdHlwZS5tZXJnZURlZXAgPSBTZXRQcm90b3R5cGUubWVyZ2U7XG4gIFNldFByb3RvdHlwZS5tZXJnZURlZXBXaXRoID0gU2V0UHJvdG90eXBlLm1lcmdlV2l0aDtcbiAgU2V0UHJvdG90eXBlLndpdGhNdXRhdGlvbnMgPSBNYXBQcm90b3R5cGUud2l0aE11dGF0aW9ucztcbiAgU2V0UHJvdG90eXBlLmFzTXV0YWJsZSA9IE1hcFByb3RvdHlwZS5hc011dGFibGU7XG4gIFNldFByb3RvdHlwZS5hc0ltbXV0YWJsZSA9IE1hcFByb3RvdHlwZS5hc0ltbXV0YWJsZTtcblxuICBTZXRQcm90b3R5cGUuX19lbXB0eSA9IGVtcHR5U2V0O1xuICBTZXRQcm90b3R5cGUuX19tYWtlID0gbWFrZVNldDtcblxuICBmdW5jdGlvbiB1cGRhdGVTZXQoc2V0LCBuZXdNYXApIHtcbiAgICBpZiAoc2V0Ll9fb3duZXJJRCkge1xuICAgICAgc2V0LnNpemUgPSBuZXdNYXAuc2l6ZTtcbiAgICAgIHNldC5fbWFwID0gbmV3TWFwO1xuICAgICAgcmV0dXJuIHNldDtcbiAgICB9XG4gICAgcmV0dXJuIG5ld01hcCA9PT0gc2V0Ll9tYXAgPyBzZXQgOlxuICAgICAgbmV3TWFwLnNpemUgPT09IDAgPyBzZXQuX19lbXB0eSgpIDpcbiAgICAgIHNldC5fX21ha2UobmV3TWFwKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG1ha2VTZXQobWFwLCBvd25lcklEKSB7XG4gICAgdmFyIHNldCA9IE9iamVjdC5jcmVhdGUoU2V0UHJvdG90eXBlKTtcbiAgICBzZXQuc2l6ZSA9IG1hcCA/IG1hcC5zaXplIDogMDtcbiAgICBzZXQuX21hcCA9IG1hcDtcbiAgICBzZXQuX19vd25lcklEID0gb3duZXJJRDtcbiAgICByZXR1cm4gc2V0O1xuICB9XG5cbiAgdmFyIEVNUFRZX1NFVDtcbiAgZnVuY3Rpb24gZW1wdHlTZXQoKSB7XG4gICAgcmV0dXJuIEVNUFRZX1NFVCB8fCAoRU1QVFlfU0VUID0gbWFrZVNldChlbXB0eU1hcCgpKSk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhPcmRlcmVkU2V0LCBTZXQpO1xuXG4gICAgLy8gQHByYWdtYSBDb25zdHJ1Y3Rpb25cblxuICAgIGZ1bmN0aW9uIE9yZGVyZWRTZXQodmFsdWUpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gZW1wdHlPcmRlcmVkU2V0KCkgOlxuICAgICAgICBpc09yZGVyZWRTZXQodmFsdWUpID8gdmFsdWUgOlxuICAgICAgICBlbXB0eU9yZGVyZWRTZXQoKS53aXRoTXV0YXRpb25zKGZ1bmN0aW9uKHNldCApIHtcbiAgICAgICAgICB2YXIgaXRlciA9IFNldEl0ZXJhYmxlKHZhbHVlKTtcbiAgICAgICAgICBhc3NlcnROb3RJbmZpbml0ZShpdGVyLnNpemUpO1xuICAgICAgICAgIGl0ZXIuZm9yRWFjaChmdW5jdGlvbih2ICkge3JldHVybiBzZXQuYWRkKHYpfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIE9yZGVyZWRTZXQub2YgPSBmdW5jdGlvbigvKi4uLnZhbHVlcyovKSB7XG4gICAgICByZXR1cm4gdGhpcyhhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBPcmRlcmVkU2V0LmZyb21LZXlzID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzKEtleWVkSXRlcmFibGUodmFsdWUpLmtleVNlcSgpKTtcbiAgICB9O1xuXG4gICAgT3JkZXJlZFNldC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fdG9TdHJpbmcoJ09yZGVyZWRTZXQgeycsICd9Jyk7XG4gICAgfTtcblxuXG4gIGZ1bmN0aW9uIGlzT3JkZXJlZFNldChtYXliZU9yZGVyZWRTZXQpIHtcbiAgICByZXR1cm4gaXNTZXQobWF5YmVPcmRlcmVkU2V0KSAmJiBpc09yZGVyZWQobWF5YmVPcmRlcmVkU2V0KTtcbiAgfVxuXG4gIE9yZGVyZWRTZXQuaXNPcmRlcmVkU2V0ID0gaXNPcmRlcmVkU2V0O1xuXG4gIHZhciBPcmRlcmVkU2V0UHJvdG90eXBlID0gT3JkZXJlZFNldC5wcm90b3R5cGU7XG4gIE9yZGVyZWRTZXRQcm90b3R5cGVbSVNfT1JERVJFRF9TRU5USU5FTF0gPSB0cnVlO1xuXG4gIE9yZGVyZWRTZXRQcm90b3R5cGUuX19lbXB0eSA9IGVtcHR5T3JkZXJlZFNldDtcbiAgT3JkZXJlZFNldFByb3RvdHlwZS5fX21ha2UgPSBtYWtlT3JkZXJlZFNldDtcblxuICBmdW5jdGlvbiBtYWtlT3JkZXJlZFNldChtYXAsIG93bmVySUQpIHtcbiAgICB2YXIgc2V0ID0gT2JqZWN0LmNyZWF0ZShPcmRlcmVkU2V0UHJvdG90eXBlKTtcbiAgICBzZXQuc2l6ZSA9IG1hcCA/IG1hcC5zaXplIDogMDtcbiAgICBzZXQuX21hcCA9IG1hcDtcbiAgICBzZXQuX19vd25lcklEID0gb3duZXJJRDtcbiAgICByZXR1cm4gc2V0O1xuICB9XG5cbiAgdmFyIEVNUFRZX09SREVSRURfU0VUO1xuICBmdW5jdGlvbiBlbXB0eU9yZGVyZWRTZXQoKSB7XG4gICAgcmV0dXJuIEVNUFRZX09SREVSRURfU0VUIHx8IChFTVBUWV9PUkRFUkVEX1NFVCA9IG1ha2VPcmRlcmVkU2V0KGVtcHR5T3JkZXJlZE1hcCgpKSk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhTdGFjaywgSW5kZXhlZENvbGxlY3Rpb24pO1xuXG4gICAgLy8gQHByYWdtYSBDb25zdHJ1Y3Rpb25cblxuICAgIGZ1bmN0aW9uIFN0YWNrKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCA/IGVtcHR5U3RhY2soKSA6XG4gICAgICAgIGlzU3RhY2sodmFsdWUpID8gdmFsdWUgOlxuICAgICAgICBlbXB0eVN0YWNrKCkudW5zaGlmdEFsbCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgU3RhY2sub2YgPSBmdW5jdGlvbigvKi4uLnZhbHVlcyovKSB7XG4gICAgICByZXR1cm4gdGhpcyhhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBTdGFjay5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9fdG9TdHJpbmcoJ1N0YWNrIFsnLCAnXScpO1xuICAgIH07XG5cbiAgICAvLyBAcHJhZ21hIEFjY2Vzc1xuXG4gICAgU3RhY2sucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKGluZGV4LCBub3RTZXRWYWx1ZSkge1xuICAgICAgdmFyIGhlYWQgPSB0aGlzLl9oZWFkO1xuICAgICAgaW5kZXggPSB3cmFwSW5kZXgodGhpcywgaW5kZXgpO1xuICAgICAgd2hpbGUgKGhlYWQgJiYgaW5kZXgtLSkge1xuICAgICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhlYWQgPyBoZWFkLnZhbHVlIDogbm90U2V0VmFsdWU7XG4gICAgfTtcblxuICAgIFN0YWNrLnByb3RvdHlwZS5wZWVrID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5faGVhZCAmJiB0aGlzLl9oZWFkLnZhbHVlO1xuICAgIH07XG5cbiAgICAvLyBAcHJhZ21hIE1vZGlmaWNhdGlvblxuXG4gICAgU3RhY2sucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbigvKi4uLnZhbHVlcyovKSB7XG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHZhciBuZXdTaXplID0gdGhpcy5zaXplICsgYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgIHZhciBoZWFkID0gdGhpcy5faGVhZDtcbiAgICAgIGZvciAodmFyIGlpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGlpID49IDA7IGlpLS0pIHtcbiAgICAgICAgaGVhZCA9IHtcbiAgICAgICAgICB2YWx1ZTogYXJndW1lbnRzW2lpXSxcbiAgICAgICAgICBuZXh0OiBoZWFkXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fX293bmVySUQpIHtcbiAgICAgICAgdGhpcy5zaXplID0gbmV3U2l6ZTtcbiAgICAgICAgdGhpcy5faGVhZCA9IGhlYWQ7XG4gICAgICAgIHRoaXMuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9fYWx0ZXJlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ha2VTdGFjayhuZXdTaXplLCBoZWFkKTtcbiAgICB9O1xuXG4gICAgU3RhY2sucHJvdG90eXBlLnB1c2hBbGwgPSBmdW5jdGlvbihpdGVyKSB7XG4gICAgICBpdGVyID0gSW5kZXhlZEl0ZXJhYmxlKGl0ZXIpO1xuICAgICAgaWYgKGl0ZXIuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGFzc2VydE5vdEluZmluaXRlKGl0ZXIuc2l6ZSk7XG4gICAgICB2YXIgbmV3U2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgIHZhciBoZWFkID0gdGhpcy5faGVhZDtcbiAgICAgIGl0ZXIucmV2ZXJzZSgpLmZvckVhY2goZnVuY3Rpb24odmFsdWUgKSB7XG4gICAgICAgIG5ld1NpemUrKztcbiAgICAgICAgaGVhZCA9IHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgbmV4dDogaGVhZFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5fX293bmVySUQpIHtcbiAgICAgICAgdGhpcy5zaXplID0gbmV3U2l6ZTtcbiAgICAgICAgdGhpcy5faGVhZCA9IGhlYWQ7XG4gICAgICAgIHRoaXMuX19oYXNoID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9fYWx0ZXJlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1ha2VTdGFjayhuZXdTaXplLCBoZWFkKTtcbiAgICB9O1xuXG4gICAgU3RhY2sucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2xpY2UoMSk7XG4gICAgfTtcblxuICAgIFN0YWNrLnByb3RvdHlwZS51bnNoaWZ0ID0gZnVuY3Rpb24oLyouLi52YWx1ZXMqLykge1xuICAgICAgcmV0dXJuIHRoaXMucHVzaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBTdGFjay5wcm90b3R5cGUudW5zaGlmdEFsbCA9IGZ1bmN0aW9uKGl0ZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnB1c2hBbGwoaXRlcik7XG4gICAgfTtcblxuICAgIFN0YWNrLnByb3RvdHlwZS5zaGlmdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMucG9wLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcblxuICAgIFN0YWNrLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9fb3duZXJJRCkge1xuICAgICAgICB0aGlzLnNpemUgPSAwO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9faGFzaCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fX2FsdGVyZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbXB0eVN0YWNrKCk7XG4gICAgfTtcblxuICAgIFN0YWNrLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uKGJlZ2luLCBlbmQpIHtcbiAgICAgIGlmICh3aG9sZVNsaWNlKGJlZ2luLCBlbmQsIHRoaXMuc2l6ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICB2YXIgcmVzb2x2ZWRCZWdpbiA9IHJlc29sdmVCZWdpbihiZWdpbiwgdGhpcy5zaXplKTtcbiAgICAgIHZhciByZXNvbHZlZEVuZCA9IHJlc29sdmVFbmQoZW5kLCB0aGlzLnNpemUpO1xuICAgICAgaWYgKHJlc29sdmVkRW5kICE9PSB0aGlzLnNpemUpIHtcbiAgICAgICAgLy8gc3VwZXIuc2xpY2UoYmVnaW4sIGVuZCk7XG4gICAgICAgIHJldHVybiBJbmRleGVkQ29sbGVjdGlvbi5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLCBiZWdpbiwgZW5kKTtcbiAgICAgIH1cbiAgICAgIHZhciBuZXdTaXplID0gdGhpcy5zaXplIC0gcmVzb2x2ZWRCZWdpbjtcbiAgICAgIHZhciBoZWFkID0gdGhpcy5faGVhZDtcbiAgICAgIHdoaWxlIChyZXNvbHZlZEJlZ2luLS0pIHtcbiAgICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLl9fb3duZXJJRCkge1xuICAgICAgICB0aGlzLnNpemUgPSBuZXdTaXplO1xuICAgICAgICB0aGlzLl9oZWFkID0gaGVhZDtcbiAgICAgICAgdGhpcy5fX2hhc2ggPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX19hbHRlcmVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWFrZVN0YWNrKG5ld1NpemUsIGhlYWQpO1xuICAgIH07XG5cbiAgICAvLyBAcHJhZ21hIE11dGFiaWxpdHlcblxuICAgIFN0YWNrLnByb3RvdHlwZS5fX2Vuc3VyZU93bmVyID0gZnVuY3Rpb24ob3duZXJJRCkge1xuICAgICAgaWYgKG93bmVySUQgPT09IHRoaXMuX19vd25lcklEKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuICAgICAgaWYgKCFvd25lcklEKSB7XG4gICAgICAgIHRoaXMuX19vd25lcklEID0gb3duZXJJRDtcbiAgICAgICAgdGhpcy5fX2FsdGVyZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWFrZVN0YWNrKHRoaXMuc2l6ZSwgdGhpcy5faGVhZCwgb3duZXJJRCwgdGhpcy5fX2hhc2gpO1xuICAgIH07XG5cbiAgICAvLyBAcHJhZ21hIEl0ZXJhdGlvblxuXG4gICAgU3RhY2sucHJvdG90eXBlLl9faXRlcmF0ZSA9IGZ1bmN0aW9uKGZuLCByZXZlcnNlKSB7XG4gICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKCkuX19pdGVyYXRlKGZuKTtcbiAgICAgIH1cbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHZhciBub2RlID0gdGhpcy5faGVhZDtcbiAgICAgIHdoaWxlIChub2RlKSB7XG4gICAgICAgIGlmIChmbihub2RlLnZhbHVlLCBpdGVyYXRpb25zKyssIHRoaXMpID09PSBmYWxzZSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUgPSBub2RlLm5leHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaXRlcmF0aW9ucztcbiAgICB9O1xuXG4gICAgU3RhY2sucHJvdG90eXBlLl9faXRlcmF0b3IgPSBmdW5jdGlvbih0eXBlLCByZXZlcnNlKSB7XG4gICAgICBpZiAocmV2ZXJzZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKCkuX19pdGVyYXRvcih0eXBlKTtcbiAgICAgIH1cbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHZhciBub2RlID0gdGhpcy5faGVhZDtcbiAgICAgIHJldHVybiBuZXcgSXRlcmF0b3IoZnVuY3Rpb24oKSAge1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgIHZhciB2YWx1ZSA9IG5vZGUudmFsdWU7XG4gICAgICAgICAgbm9kZSA9IG5vZGUubmV4dDtcbiAgICAgICAgICByZXR1cm4gaXRlcmF0b3JWYWx1ZSh0eXBlLCBpdGVyYXRpb25zKyssIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlcmF0b3JEb25lKCk7XG4gICAgICB9KTtcbiAgICB9O1xuXG5cbiAgZnVuY3Rpb24gaXNTdGFjayhtYXliZVN0YWNrKSB7XG4gICAgcmV0dXJuICEhKG1heWJlU3RhY2sgJiYgbWF5YmVTdGFja1tJU19TVEFDS19TRU5USU5FTF0pO1xuICB9XG5cbiAgU3RhY2suaXNTdGFjayA9IGlzU3RhY2s7XG5cbiAgdmFyIElTX1NUQUNLX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfU1RBQ0tfX0BAJztcblxuICB2YXIgU3RhY2tQcm90b3R5cGUgPSBTdGFjay5wcm90b3R5cGU7XG4gIFN0YWNrUHJvdG90eXBlW0lTX1NUQUNLX1NFTlRJTkVMXSA9IHRydWU7XG4gIFN0YWNrUHJvdG90eXBlLndpdGhNdXRhdGlvbnMgPSBNYXBQcm90b3R5cGUud2l0aE11dGF0aW9ucztcbiAgU3RhY2tQcm90b3R5cGUuYXNNdXRhYmxlID0gTWFwUHJvdG90eXBlLmFzTXV0YWJsZTtcbiAgU3RhY2tQcm90b3R5cGUuYXNJbW11dGFibGUgPSBNYXBQcm90b3R5cGUuYXNJbW11dGFibGU7XG4gIFN0YWNrUHJvdG90eXBlLndhc0FsdGVyZWQgPSBNYXBQcm90b3R5cGUud2FzQWx0ZXJlZDtcblxuXG4gIGZ1bmN0aW9uIG1ha2VTdGFjayhzaXplLCBoZWFkLCBvd25lcklELCBoYXNoKSB7XG4gICAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUoU3RhY2tQcm90b3R5cGUpO1xuICAgIG1hcC5zaXplID0gc2l6ZTtcbiAgICBtYXAuX2hlYWQgPSBoZWFkO1xuICAgIG1hcC5fX293bmVySUQgPSBvd25lcklEO1xuICAgIG1hcC5fX2hhc2ggPSBoYXNoO1xuICAgIG1hcC5fX2FsdGVyZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgdmFyIEVNUFRZX1NUQUNLO1xuICBmdW5jdGlvbiBlbXB0eVN0YWNrKCkge1xuICAgIHJldHVybiBFTVBUWV9TVEFDSyB8fCAoRU1QVFlfU1RBQ0sgPSBtYWtlU3RhY2soMCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnRyaWJ1dGVzIGFkZGl0aW9uYWwgbWV0aG9kcyB0byBhIGNvbnN0cnVjdG9yXG4gICAqL1xuICBmdW5jdGlvbiBtaXhpbihjdG9yLCBtZXRob2RzKSB7XG4gICAgdmFyIGtleUNvcGllciA9IGZ1bmN0aW9uKGtleSApIHsgY3Rvci5wcm90b3R5cGVba2V5XSA9IG1ldGhvZHNba2V5XTsgfTtcbiAgICBPYmplY3Qua2V5cyhtZXRob2RzKS5mb3JFYWNoKGtleUNvcGllcik7XG4gICAgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJlxuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhtZXRob2RzKS5mb3JFYWNoKGtleUNvcGllcik7XG4gICAgcmV0dXJuIGN0b3I7XG4gIH1cblxuICBJdGVyYWJsZS5JdGVyYXRvciA9IEl0ZXJhdG9yO1xuXG4gIG1peGluKEl0ZXJhYmxlLCB7XG5cbiAgICAvLyAjIyMgQ29udmVyc2lvbiB0byBvdGhlciB0eXBlc1xuXG4gICAgdG9BcnJheTogZnVuY3Rpb24oKSB7XG4gICAgICBhc3NlcnROb3RJbmZpbml0ZSh0aGlzLnNpemUpO1xuICAgICAgdmFyIGFycmF5ID0gbmV3IEFycmF5KHRoaXMuc2l6ZSB8fCAwKTtcbiAgICAgIHRoaXMudmFsdWVTZXEoKS5fX2l0ZXJhdGUoZnVuY3Rpb24odiwgaSkgIHsgYXJyYXlbaV0gPSB2OyB9KTtcbiAgICAgIHJldHVybiBhcnJheTtcbiAgICB9LFxuXG4gICAgdG9JbmRleGVkU2VxOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBuZXcgVG9JbmRleGVkU2VxdWVuY2UodGhpcyk7XG4gICAgfSxcblxuICAgIHRvSlM6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9TZXEoKS5tYXAoXG4gICAgICAgIGZ1bmN0aW9uKHZhbHVlICkge3JldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUudG9KUyA9PT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnRvSlMoKSA6IHZhbHVlfVxuICAgICAgKS5fX3RvSlMoKTtcbiAgICB9LFxuXG4gICAgdG9KU09OOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvU2VxKCkubWFwKFxuICAgICAgICBmdW5jdGlvbih2YWx1ZSApIHtyZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnRvSlNPTigpIDogdmFsdWV9XG4gICAgICApLl9fdG9KUygpO1xuICAgIH0sXG5cbiAgICB0b0tleWVkU2VxOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBuZXcgVG9LZXllZFNlcXVlbmNlKHRoaXMsIHRydWUpO1xuICAgIH0sXG5cbiAgICB0b01hcDogZnVuY3Rpb24oKSB7XG4gICAgICAvLyBVc2UgTGF0ZSBCaW5kaW5nIGhlcmUgdG8gc29sdmUgdGhlIGNpcmN1bGFyIGRlcGVuZGVuY3kuXG4gICAgICByZXR1cm4gTWFwKHRoaXMudG9LZXllZFNlcSgpKTtcbiAgICB9LFxuXG4gICAgdG9PYmplY3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgYXNzZXJ0Tm90SW5maW5pdGUodGhpcy5zaXplKTtcbiAgICAgIHZhciBvYmplY3QgPSB7fTtcbiAgICAgIHRoaXMuX19pdGVyYXRlKGZ1bmN0aW9uKHYsIGspICB7IG9iamVjdFtrXSA9IHY7IH0pO1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9LFxuXG4gICAgdG9PcmRlcmVkTWFwOiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIFVzZSBMYXRlIEJpbmRpbmcgaGVyZSB0byBzb2x2ZSB0aGUgY2lyY3VsYXIgZGVwZW5kZW5jeS5cbiAgICAgIHJldHVybiBPcmRlcmVkTWFwKHRoaXMudG9LZXllZFNlcSgpKTtcbiAgICB9LFxuXG4gICAgdG9PcmRlcmVkU2V0OiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIFVzZSBMYXRlIEJpbmRpbmcgaGVyZSB0byBzb2x2ZSB0aGUgY2lyY3VsYXIgZGVwZW5kZW5jeS5cbiAgICAgIHJldHVybiBPcmRlcmVkU2V0KGlzS2V5ZWQodGhpcykgPyB0aGlzLnZhbHVlU2VxKCkgOiB0aGlzKTtcbiAgICB9LFxuXG4gICAgdG9TZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgLy8gVXNlIExhdGUgQmluZGluZyBoZXJlIHRvIHNvbHZlIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5LlxuICAgICAgcmV0dXJuIFNldChpc0tleWVkKHRoaXMpID8gdGhpcy52YWx1ZVNlcSgpIDogdGhpcyk7XG4gICAgfSxcblxuICAgIHRvU2V0U2VxOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBuZXcgVG9TZXRTZXF1ZW5jZSh0aGlzKTtcbiAgICB9LFxuXG4gICAgdG9TZXE6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGlzSW5kZXhlZCh0aGlzKSA/IHRoaXMudG9JbmRleGVkU2VxKCkgOlxuICAgICAgICBpc0tleWVkKHRoaXMpID8gdGhpcy50b0tleWVkU2VxKCkgOlxuICAgICAgICB0aGlzLnRvU2V0U2VxKCk7XG4gICAgfSxcblxuICAgIHRvU3RhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgLy8gVXNlIExhdGUgQmluZGluZyBoZXJlIHRvIHNvbHZlIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5LlxuICAgICAgcmV0dXJuIFN0YWNrKGlzS2V5ZWQodGhpcykgPyB0aGlzLnZhbHVlU2VxKCkgOiB0aGlzKTtcbiAgICB9LFxuXG4gICAgdG9MaXN0OiBmdW5jdGlvbigpIHtcbiAgICAgIC8vIFVzZSBMYXRlIEJpbmRpbmcgaGVyZSB0byBzb2x2ZSB0aGUgY2lyY3VsYXIgZGVwZW5kZW5jeS5cbiAgICAgIHJldHVybiBMaXN0KGlzS2V5ZWQodGhpcykgPyB0aGlzLnZhbHVlU2VxKCkgOiB0aGlzKTtcbiAgICB9LFxuXG5cbiAgICAvLyAjIyMgQ29tbW9uIEphdmFTY3JpcHQgbWV0aG9kcyBhbmQgcHJvcGVydGllc1xuXG4gICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuICdbSXRlcmFibGVdJztcbiAgICB9LFxuXG4gICAgX190b1N0cmluZzogZnVuY3Rpb24oaGVhZCwgdGFpbCkge1xuICAgICAgaWYgKHRoaXMuc2l6ZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gaGVhZCArIHRhaWw7XG4gICAgICB9XG4gICAgICByZXR1cm4gaGVhZCArICcgJyArIHRoaXMudG9TZXEoKS5tYXAodGhpcy5fX3RvU3RyaW5nTWFwcGVyKS5qb2luKCcsICcpICsgJyAnICsgdGFpbDtcbiAgICB9LFxuXG5cbiAgICAvLyAjIyMgRVM2IENvbGxlY3Rpb24gbWV0aG9kcyAoRVM2IEFycmF5IGFuZCBNYXApXG5cbiAgICBjb25jYXQ6IGZ1bmN0aW9uKCkge3ZhciB2YWx1ZXMgPSBTTElDRSQwLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCBjb25jYXRGYWN0b3J5KHRoaXMsIHZhbHVlcykpO1xuICAgIH0sXG5cbiAgICBpbmNsdWRlczogZnVuY3Rpb24oc2VhcmNoVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNvbWUoZnVuY3Rpb24odmFsdWUgKSB7cmV0dXJuIGlzKHZhbHVlLCBzZWFyY2hWYWx1ZSl9KTtcbiAgICB9LFxuXG4gICAgZW50cmllczogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2l0ZXJhdG9yKElURVJBVEVfRU5UUklFUyk7XG4gICAgfSxcblxuICAgIGV2ZXJ5OiBmdW5jdGlvbihwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICAgIGFzc2VydE5vdEluZmluaXRlKHRoaXMuc2l6ZSk7XG4gICAgICB2YXIgcmV0dXJuVmFsdWUgPSB0cnVlO1xuICAgICAgdGhpcy5fX2l0ZXJhdGUoZnVuY3Rpb24odiwgaywgYykgIHtcbiAgICAgICAgaWYgKCFwcmVkaWNhdGUuY2FsbChjb250ZXh0LCB2LCBrLCBjKSkge1xuICAgICAgICAgIHJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9LFxuXG4gICAgZmlsdGVyOiBmdW5jdGlvbihwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCBmaWx0ZXJGYWN0b3J5KHRoaXMsIHByZWRpY2F0ZSwgY29udGV4dCwgdHJ1ZSkpO1xuICAgIH0sXG5cbiAgICBmaW5kOiBmdW5jdGlvbihwcmVkaWNhdGUsIGNvbnRleHQsIG5vdFNldFZhbHVlKSB7XG4gICAgICB2YXIgZW50cnkgPSB0aGlzLmZpbmRFbnRyeShwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIGVudHJ5ID8gZW50cnlbMV0gOiBub3RTZXRWYWx1ZTtcbiAgICB9LFxuXG4gICAgZm9yRWFjaDogZnVuY3Rpb24oc2lkZUVmZmVjdCwgY29udGV4dCkge1xuICAgICAgYXNzZXJ0Tm90SW5maW5pdGUodGhpcy5zaXplKTtcbiAgICAgIHJldHVybiB0aGlzLl9faXRlcmF0ZShjb250ZXh0ID8gc2lkZUVmZmVjdC5iaW5kKGNvbnRleHQpIDogc2lkZUVmZmVjdCk7XG4gICAgfSxcblxuICAgIGpvaW46IGZ1bmN0aW9uKHNlcGFyYXRvcikge1xuICAgICAgYXNzZXJ0Tm90SW5maW5pdGUodGhpcy5zaXplKTtcbiAgICAgIHNlcGFyYXRvciA9IHNlcGFyYXRvciAhPT0gdW5kZWZpbmVkID8gJycgKyBzZXBhcmF0b3IgOiAnLCc7XG4gICAgICB2YXIgam9pbmVkID0gJyc7XG4gICAgICB2YXIgaXNGaXJzdCA9IHRydWU7XG4gICAgICB0aGlzLl9faXRlcmF0ZShmdW5jdGlvbih2ICkge1xuICAgICAgICBpc0ZpcnN0ID8gKGlzRmlyc3QgPSBmYWxzZSkgOiAoam9pbmVkICs9IHNlcGFyYXRvcik7XG4gICAgICAgIGpvaW5lZCArPSB2ICE9PSBudWxsICYmIHYgIT09IHVuZGVmaW5lZCA/IHYudG9TdHJpbmcoKSA6ICcnO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gam9pbmVkO1xuICAgIH0sXG5cbiAgICBrZXlzOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9faXRlcmF0b3IoSVRFUkFURV9LRVlTKTtcbiAgICB9LFxuXG4gICAgbWFwOiBmdW5jdGlvbihtYXBwZXIsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCBtYXBGYWN0b3J5KHRoaXMsIG1hcHBlciwgY29udGV4dCkpO1xuICAgIH0sXG5cbiAgICByZWR1Y2U6IGZ1bmN0aW9uKHJlZHVjZXIsIGluaXRpYWxSZWR1Y3Rpb24sIGNvbnRleHQpIHtcbiAgICAgIGFzc2VydE5vdEluZmluaXRlKHRoaXMuc2l6ZSk7XG4gICAgICB2YXIgcmVkdWN0aW9uO1xuICAgICAgdmFyIHVzZUZpcnN0O1xuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgICAgIHVzZUZpcnN0ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlZHVjdGlvbiA9IGluaXRpYWxSZWR1Y3Rpb247XG4gICAgICB9XG4gICAgICB0aGlzLl9faXRlcmF0ZShmdW5jdGlvbih2LCBrLCBjKSAge1xuICAgICAgICBpZiAodXNlRmlyc3QpIHtcbiAgICAgICAgICB1c2VGaXJzdCA9IGZhbHNlO1xuICAgICAgICAgIHJlZHVjdGlvbiA9IHY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVkdWN0aW9uID0gcmVkdWNlci5jYWxsKGNvbnRleHQsIHJlZHVjdGlvbiwgdiwgaywgYyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlZHVjdGlvbjtcbiAgICB9LFxuXG4gICAgcmVkdWNlUmlnaHQ6IGZ1bmN0aW9uKHJlZHVjZXIsIGluaXRpYWxSZWR1Y3Rpb24sIGNvbnRleHQpIHtcbiAgICAgIHZhciByZXZlcnNlZCA9IHRoaXMudG9LZXllZFNlcSgpLnJldmVyc2UoKTtcbiAgICAgIHJldHVybiByZXZlcnNlZC5yZWR1Y2UuYXBwbHkocmV2ZXJzZWQsIGFyZ3VtZW50cyk7XG4gICAgfSxcblxuICAgIHJldmVyc2U6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHJldmVyc2VGYWN0b3J5KHRoaXMsIHRydWUpKTtcbiAgICB9LFxuXG4gICAgc2xpY2U6IGZ1bmN0aW9uKGJlZ2luLCBlbmQpIHtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCBzbGljZUZhY3RvcnkodGhpcywgYmVnaW4sIGVuZCwgdHJ1ZSkpO1xuICAgIH0sXG5cbiAgICBzb21lOiBmdW5jdGlvbihwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiAhdGhpcy5ldmVyeShub3QocHJlZGljYXRlKSwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIHNvcnQ6IGZ1bmN0aW9uKGNvbXBhcmF0b3IpIHtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCBzb3J0RmFjdG9yeSh0aGlzLCBjb21wYXJhdG9yKSk7XG4gICAgfSxcblxuICAgIHZhbHVlczogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fX2l0ZXJhdG9yKElURVJBVEVfVkFMVUVTKTtcbiAgICB9LFxuXG5cbiAgICAvLyAjIyMgTW9yZSBzZXF1ZW50aWFsIG1ldGhvZHNcblxuICAgIGJ1dExhc3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2xpY2UoMCwgLTEpO1xuICAgIH0sXG5cbiAgICBpc0VtcHR5OiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnNpemUgIT09IHVuZGVmaW5lZCA/IHRoaXMuc2l6ZSA9PT0gMCA6ICF0aGlzLnNvbWUoZnVuY3Rpb24oKSAge3JldHVybiB0cnVlfSk7XG4gICAgfSxcblxuICAgIGNvdW50OiBmdW5jdGlvbihwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiBlbnN1cmVTaXplKFxuICAgICAgICBwcmVkaWNhdGUgPyB0aGlzLnRvU2VxKCkuZmlsdGVyKHByZWRpY2F0ZSwgY29udGV4dCkgOiB0aGlzXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjb3VudEJ5OiBmdW5jdGlvbihncm91cGVyLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gY291bnRCeUZhY3RvcnkodGhpcywgZ3JvdXBlciwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIGVxdWFsczogZnVuY3Rpb24ob3RoZXIpIHtcbiAgICAgIHJldHVybiBkZWVwRXF1YWwodGhpcywgb3RoZXIpO1xuICAgIH0sXG5cbiAgICBlbnRyeVNlcTogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaXRlcmFibGUgPSB0aGlzO1xuICAgICAgaWYgKGl0ZXJhYmxlLl9jYWNoZSkge1xuICAgICAgICAvLyBXZSBjYWNoZSBhcyBhbiBlbnRyaWVzIGFycmF5LCBzbyB3ZSBjYW4ganVzdCByZXR1cm4gdGhlIGNhY2hlIVxuICAgICAgICByZXR1cm4gbmV3IEFycmF5U2VxKGl0ZXJhYmxlLl9jYWNoZSk7XG4gICAgICB9XG4gICAgICB2YXIgZW50cmllc1NlcXVlbmNlID0gaXRlcmFibGUudG9TZXEoKS5tYXAoZW50cnlNYXBwZXIpLnRvSW5kZXhlZFNlcSgpO1xuICAgICAgZW50cmllc1NlcXVlbmNlLmZyb21FbnRyeVNlcSA9IGZ1bmN0aW9uKCkgIHtyZXR1cm4gaXRlcmFibGUudG9TZXEoKX07XG4gICAgICByZXR1cm4gZW50cmllc1NlcXVlbmNlO1xuICAgIH0sXG5cbiAgICBmaWx0ZXJOb3Q6IGZ1bmN0aW9uKHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyKG5vdChwcmVkaWNhdGUpLCBjb250ZXh0KTtcbiAgICB9LFxuXG4gICAgZmluZEVudHJ5OiBmdW5jdGlvbihwcmVkaWNhdGUsIGNvbnRleHQsIG5vdFNldFZhbHVlKSB7XG4gICAgICB2YXIgZm91bmQgPSBub3RTZXRWYWx1ZTtcbiAgICAgIHRoaXMuX19pdGVyYXRlKGZ1bmN0aW9uKHYsIGssIGMpICB7XG4gICAgICAgIGlmIChwcmVkaWNhdGUuY2FsbChjb250ZXh0LCB2LCBrLCBjKSkge1xuICAgICAgICAgIGZvdW5kID0gW2ssIHZdO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZm91bmQ7XG4gICAgfSxcblxuICAgIGZpbmRLZXk6IGZ1bmN0aW9uKHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgICAgdmFyIGVudHJ5ID0gdGhpcy5maW5kRW50cnkocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeVswXTtcbiAgICB9LFxuXG4gICAgZmluZExhc3Q6IGZ1bmN0aW9uKHByZWRpY2F0ZSwgY29udGV4dCwgbm90U2V0VmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvS2V5ZWRTZXEoKS5yZXZlcnNlKCkuZmluZChwcmVkaWNhdGUsIGNvbnRleHQsIG5vdFNldFZhbHVlKTtcbiAgICB9LFxuXG4gICAgZmluZExhc3RFbnRyeTogZnVuY3Rpb24ocHJlZGljYXRlLCBjb250ZXh0LCBub3RTZXRWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMudG9LZXllZFNlcSgpLnJldmVyc2UoKS5maW5kRW50cnkocHJlZGljYXRlLCBjb250ZXh0LCBub3RTZXRWYWx1ZSk7XG4gICAgfSxcblxuICAgIGZpbmRMYXN0S2V5OiBmdW5jdGlvbihwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvS2V5ZWRTZXEoKS5yZXZlcnNlKCkuZmluZEtleShwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgIH0sXG5cbiAgICBmaXJzdDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5maW5kKHJldHVyblRydWUpO1xuICAgIH0sXG5cbiAgICBmbGF0TWFwOiBmdW5jdGlvbihtYXBwZXIsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCBmbGF0TWFwRmFjdG9yeSh0aGlzLCBtYXBwZXIsIGNvbnRleHQpKTtcbiAgICB9LFxuXG4gICAgZmxhdHRlbjogZnVuY3Rpb24oZGVwdGgpIHtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCBmbGF0dGVuRmFjdG9yeSh0aGlzLCBkZXB0aCwgdHJ1ZSkpO1xuICAgIH0sXG5cbiAgICBmcm9tRW50cnlTZXE6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG5ldyBGcm9tRW50cmllc1NlcXVlbmNlKHRoaXMpO1xuICAgIH0sXG5cbiAgICBnZXQ6IGZ1bmN0aW9uKHNlYXJjaEtleSwgbm90U2V0VmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmZpbmQoZnVuY3Rpb24oXywga2V5KSAge3JldHVybiBpcyhrZXksIHNlYXJjaEtleSl9LCB1bmRlZmluZWQsIG5vdFNldFZhbHVlKTtcbiAgICB9LFxuXG4gICAgZ2V0SW46IGZ1bmN0aW9uKHNlYXJjaEtleVBhdGgsIG5vdFNldFZhbHVlKSB7XG4gICAgICB2YXIgbmVzdGVkID0gdGhpcztcbiAgICAgIC8vIE5vdGU6IGluIGFuIEVTNiBlbnZpcm9ubWVudCwgd2Ugd291bGQgcHJlZmVyOlxuICAgICAgLy8gZm9yICh2YXIga2V5IG9mIHNlYXJjaEtleVBhdGgpIHtcbiAgICAgIHZhciBpdGVyID0gZm9yY2VJdGVyYXRvcihzZWFyY2hLZXlQYXRoKTtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXIubmV4dCgpKS5kb25lKSB7XG4gICAgICAgIHZhciBrZXkgPSBzdGVwLnZhbHVlO1xuICAgICAgICBuZXN0ZWQgPSBuZXN0ZWQgJiYgbmVzdGVkLmdldCA/IG5lc3RlZC5nZXQoa2V5LCBOT1RfU0VUKSA6IE5PVF9TRVQ7XG4gICAgICAgIGlmIChuZXN0ZWQgPT09IE5PVF9TRVQpIHtcbiAgICAgICAgICByZXR1cm4gbm90U2V0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXN0ZWQ7XG4gICAgfSxcblxuICAgIGdyb3VwQnk6IGZ1bmN0aW9uKGdyb3VwZXIsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiBncm91cEJ5RmFjdG9yeSh0aGlzLCBncm91cGVyLCBjb250ZXh0KTtcbiAgICB9LFxuXG4gICAgaGFzOiBmdW5jdGlvbihzZWFyY2hLZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldChzZWFyY2hLZXksIE5PVF9TRVQpICE9PSBOT1RfU0VUO1xuICAgIH0sXG5cbiAgICBoYXNJbjogZnVuY3Rpb24oc2VhcmNoS2V5UGF0aCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0SW4oc2VhcmNoS2V5UGF0aCwgTk9UX1NFVCkgIT09IE5PVF9TRVQ7XG4gICAgfSxcblxuICAgIGlzU3Vic2V0OiBmdW5jdGlvbihpdGVyKSB7XG4gICAgICBpdGVyID0gdHlwZW9mIGl0ZXIuaW5jbHVkZXMgPT09ICdmdW5jdGlvbicgPyBpdGVyIDogSXRlcmFibGUoaXRlcik7XG4gICAgICByZXR1cm4gdGhpcy5ldmVyeShmdW5jdGlvbih2YWx1ZSApIHtyZXR1cm4gaXRlci5pbmNsdWRlcyh2YWx1ZSl9KTtcbiAgICB9LFxuXG4gICAgaXNTdXBlcnNldDogZnVuY3Rpb24oaXRlcikge1xuICAgICAgaXRlciA9IHR5cGVvZiBpdGVyLmlzU3Vic2V0ID09PSAnZnVuY3Rpb24nID8gaXRlciA6IEl0ZXJhYmxlKGl0ZXIpO1xuICAgICAgcmV0dXJuIGl0ZXIuaXNTdWJzZXQodGhpcyk7XG4gICAgfSxcblxuICAgIGtleU9mOiBmdW5jdGlvbihzZWFyY2hWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmluZEtleShmdW5jdGlvbih2YWx1ZSApIHtyZXR1cm4gaXModmFsdWUsIHNlYXJjaFZhbHVlKX0pO1xuICAgIH0sXG5cbiAgICBrZXlTZXE6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9TZXEoKS5tYXAoa2V5TWFwcGVyKS50b0luZGV4ZWRTZXEoKTtcbiAgICB9LFxuXG4gICAgbGFzdDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy50b1NlcSgpLnJldmVyc2UoKS5maXJzdCgpO1xuICAgIH0sXG5cbiAgICBsYXN0S2V5T2Y6IGZ1bmN0aW9uKHNlYXJjaFZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy50b0tleWVkU2VxKCkucmV2ZXJzZSgpLmtleU9mKHNlYXJjaFZhbHVlKTtcbiAgICB9LFxuXG4gICAgbWF4OiBmdW5jdGlvbihjb21wYXJhdG9yKSB7XG4gICAgICByZXR1cm4gbWF4RmFjdG9yeSh0aGlzLCBjb21wYXJhdG9yKTtcbiAgICB9LFxuXG4gICAgbWF4Qnk6IGZ1bmN0aW9uKG1hcHBlciwgY29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIG1heEZhY3RvcnkodGhpcywgY29tcGFyYXRvciwgbWFwcGVyKTtcbiAgICB9LFxuXG4gICAgbWluOiBmdW5jdGlvbihjb21wYXJhdG9yKSB7XG4gICAgICByZXR1cm4gbWF4RmFjdG9yeSh0aGlzLCBjb21wYXJhdG9yID8gbmVnKGNvbXBhcmF0b3IpIDogZGVmYXVsdE5lZ0NvbXBhcmF0b3IpO1xuICAgIH0sXG5cbiAgICBtaW5CeTogZnVuY3Rpb24obWFwcGVyLCBjb21wYXJhdG9yKSB7XG4gICAgICByZXR1cm4gbWF4RmFjdG9yeSh0aGlzLCBjb21wYXJhdG9yID8gbmVnKGNvbXBhcmF0b3IpIDogZGVmYXVsdE5lZ0NvbXBhcmF0b3IsIG1hcHBlcik7XG4gICAgfSxcblxuICAgIHJlc3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2xpY2UoMSk7XG4gICAgfSxcblxuICAgIHNraXA6IGZ1bmN0aW9uKGFtb3VudCkge1xuICAgICAgcmV0dXJuIHRoaXMuc2xpY2UoTWF0aC5tYXgoMCwgYW1vdW50KSk7XG4gICAgfSxcblxuICAgIHNraXBMYXN0OiBmdW5jdGlvbihhbW91bnQpIHtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCB0aGlzLnRvU2VxKCkucmV2ZXJzZSgpLnNraXAoYW1vdW50KS5yZXZlcnNlKCkpO1xuICAgIH0sXG5cbiAgICBza2lwV2hpbGU6IGZ1bmN0aW9uKHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHNraXBXaGlsZUZhY3RvcnkodGhpcywgcHJlZGljYXRlLCBjb250ZXh0LCB0cnVlKSk7XG4gICAgfSxcblxuICAgIHNraXBVbnRpbDogZnVuY3Rpb24ocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gdGhpcy5za2lwV2hpbGUobm90KHByZWRpY2F0ZSksIGNvbnRleHQpO1xuICAgIH0sXG5cbiAgICBzb3J0Qnk6IGZ1bmN0aW9uKG1hcHBlciwgY29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHNvcnRGYWN0b3J5KHRoaXMsIGNvbXBhcmF0b3IsIG1hcHBlcikpO1xuICAgIH0sXG5cbiAgICB0YWtlOiBmdW5jdGlvbihhbW91bnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnNsaWNlKDAsIE1hdGgubWF4KDAsIGFtb3VudCkpO1xuICAgIH0sXG5cbiAgICB0YWtlTGFzdDogZnVuY3Rpb24oYW1vdW50KSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgdGhpcy50b1NlcSgpLnJldmVyc2UoKS50YWtlKGFtb3VudCkucmV2ZXJzZSgpKTtcbiAgICB9LFxuXG4gICAgdGFrZVdoaWxlOiBmdW5jdGlvbihwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCB0YWtlV2hpbGVGYWN0b3J5KHRoaXMsIHByZWRpY2F0ZSwgY29udGV4dCkpO1xuICAgIH0sXG5cbiAgICB0YWtlVW50aWw6IGZ1bmN0aW9uKHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgICAgcmV0dXJuIHRoaXMudGFrZVdoaWxlKG5vdChwcmVkaWNhdGUpLCBjb250ZXh0KTtcbiAgICB9LFxuXG4gICAgdmFsdWVTZXE6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9JbmRleGVkU2VxKCk7XG4gICAgfSxcblxuXG4gICAgLy8gIyMjIEhhc2hhYmxlIE9iamVjdFxuXG4gICAgaGFzaENvZGU6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX19oYXNoIHx8ICh0aGlzLl9faGFzaCA9IGhhc2hJdGVyYWJsZSh0aGlzKSk7XG4gICAgfVxuXG5cbiAgICAvLyAjIyMgSW50ZXJuYWxcblxuICAgIC8vIGFic3RyYWN0IF9faXRlcmF0ZShmbiwgcmV2ZXJzZSlcblxuICAgIC8vIGFic3RyYWN0IF9faXRlcmF0b3IodHlwZSwgcmV2ZXJzZSlcbiAgfSk7XG5cbiAgLy8gdmFyIElTX0lURVJBQkxFX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfSVRFUkFCTEVfX0BAJztcbiAgLy8gdmFyIElTX0tFWUVEX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfS0VZRURfX0BAJztcbiAgLy8gdmFyIElTX0lOREVYRURfU0VOVElORUwgPSAnQEBfX0lNTVVUQUJMRV9JTkRFWEVEX19AQCc7XG4gIC8vIHZhciBJU19PUkRFUkVEX1NFTlRJTkVMID0gJ0BAX19JTU1VVEFCTEVfT1JERVJFRF9fQEAnO1xuXG4gIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTtcbiAgSXRlcmFibGVQcm90b3R5cGVbSVNfSVRFUkFCTEVfU0VOVElORUxdID0gdHJ1ZTtcbiAgSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JfU1lNQk9MXSA9IEl0ZXJhYmxlUHJvdG90eXBlLnZhbHVlcztcbiAgSXRlcmFibGVQcm90b3R5cGUuX190b0pTID0gSXRlcmFibGVQcm90b3R5cGUudG9BcnJheTtcbiAgSXRlcmFibGVQcm90b3R5cGUuX190b1N0cmluZ01hcHBlciA9IHF1b3RlU3RyaW5nO1xuICBJdGVyYWJsZVByb3RvdHlwZS5pbnNwZWN0ID1cbiAgSXRlcmFibGVQcm90b3R5cGUudG9Tb3VyY2UgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMudG9TdHJpbmcoKTsgfTtcbiAgSXRlcmFibGVQcm90b3R5cGUuY2hhaW4gPSBJdGVyYWJsZVByb3RvdHlwZS5mbGF0TWFwO1xuICBJdGVyYWJsZVByb3RvdHlwZS5jb250YWlucyA9IEl0ZXJhYmxlUHJvdG90eXBlLmluY2x1ZGVzO1xuXG4gIG1peGluKEtleWVkSXRlcmFibGUsIHtcblxuICAgIC8vICMjIyBNb3JlIHNlcXVlbnRpYWwgbWV0aG9kc1xuXG4gICAgZmxpcDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgZmxpcEZhY3RvcnkodGhpcykpO1xuICAgIH0sXG5cbiAgICBtYXBFbnRyaWVzOiBmdW5jdGlvbihtYXBwZXIsIGNvbnRleHQpIHt2YXIgdGhpcyQwID0gdGhpcztcbiAgICAgIHZhciBpdGVyYXRpb25zID0gMDtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLFxuICAgICAgICB0aGlzLnRvU2VxKCkubWFwKFxuICAgICAgICAgIGZ1bmN0aW9uKHYsIGspICB7cmV0dXJuIG1hcHBlci5jYWxsKGNvbnRleHQsIFtrLCB2XSwgaXRlcmF0aW9ucysrLCB0aGlzJDApfVxuICAgICAgICApLmZyb21FbnRyeVNlcSgpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBtYXBLZXlzOiBmdW5jdGlvbihtYXBwZXIsIGNvbnRleHQpIHt2YXIgdGhpcyQwID0gdGhpcztcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLFxuICAgICAgICB0aGlzLnRvU2VxKCkuZmxpcCgpLm1hcChcbiAgICAgICAgICBmdW5jdGlvbihrLCB2KSAge3JldHVybiBtYXBwZXIuY2FsbChjb250ZXh0LCBrLCB2LCB0aGlzJDApfVxuICAgICAgICApLmZsaXAoKVxuICAgICAgKTtcbiAgICB9XG5cbiAgfSk7XG5cbiAgdmFyIEtleWVkSXRlcmFibGVQcm90b3R5cGUgPSBLZXllZEl0ZXJhYmxlLnByb3RvdHlwZTtcbiAgS2V5ZWRJdGVyYWJsZVByb3RvdHlwZVtJU19LRVlFRF9TRU5USU5FTF0gPSB0cnVlO1xuICBLZXllZEl0ZXJhYmxlUHJvdG90eXBlW0lURVJBVE9SX1NZTUJPTF0gPSBJdGVyYWJsZVByb3RvdHlwZS5lbnRyaWVzO1xuICBLZXllZEl0ZXJhYmxlUHJvdG90eXBlLl9fdG9KUyA9IEl0ZXJhYmxlUHJvdG90eXBlLnRvT2JqZWN0O1xuICBLZXllZEl0ZXJhYmxlUHJvdG90eXBlLl9fdG9TdHJpbmdNYXBwZXIgPSBmdW5jdGlvbih2LCBrKSAge3JldHVybiBKU09OLnN0cmluZ2lmeShrKSArICc6ICcgKyBxdW90ZVN0cmluZyh2KX07XG5cblxuXG4gIG1peGluKEluZGV4ZWRJdGVyYWJsZSwge1xuXG4gICAgLy8gIyMjIENvbnZlcnNpb24gdG8gb3RoZXIgdHlwZXNcblxuICAgIHRvS2V5ZWRTZXE6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIG5ldyBUb0tleWVkU2VxdWVuY2UodGhpcywgZmFsc2UpO1xuICAgIH0sXG5cblxuICAgIC8vICMjIyBFUzYgQ29sbGVjdGlvbiBtZXRob2RzIChFUzYgQXJyYXkgYW5kIE1hcClcblxuICAgIGZpbHRlcjogZnVuY3Rpb24ocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgZmlsdGVyRmFjdG9yeSh0aGlzLCBwcmVkaWNhdGUsIGNvbnRleHQsIGZhbHNlKSk7XG4gICAgfSxcblxuICAgIGZpbmRJbmRleDogZnVuY3Rpb24ocHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgICB2YXIgZW50cnkgPSB0aGlzLmZpbmRFbnRyeShwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIGVudHJ5ID8gZW50cnlbMF0gOiAtMTtcbiAgICB9LFxuXG4gICAgaW5kZXhPZjogZnVuY3Rpb24oc2VhcmNoVmFsdWUpIHtcbiAgICAgIHZhciBrZXkgPSB0aGlzLmtleU9mKHNlYXJjaFZhbHVlKTtcbiAgICAgIHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/IC0xIDoga2V5O1xuICAgIH0sXG5cbiAgICBsYXN0SW5kZXhPZjogZnVuY3Rpb24oc2VhcmNoVmFsdWUpIHtcbiAgICAgIHZhciBrZXkgPSB0aGlzLmxhc3RLZXlPZihzZWFyY2hWYWx1ZSk7XG4gICAgICByZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgPyAtMSA6IGtleTtcbiAgICB9LFxuXG4gICAgcmV2ZXJzZTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgcmV2ZXJzZUZhY3RvcnkodGhpcywgZmFsc2UpKTtcbiAgICB9LFxuXG4gICAgc2xpY2U6IGZ1bmN0aW9uKGJlZ2luLCBlbmQpIHtcbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCBzbGljZUZhY3RvcnkodGhpcywgYmVnaW4sIGVuZCwgZmFsc2UpKTtcbiAgICB9LFxuXG4gICAgc3BsaWNlOiBmdW5jdGlvbihpbmRleCwgcmVtb3ZlTnVtIC8qLCAuLi52YWx1ZXMqLykge1xuICAgICAgdmFyIG51bUFyZ3MgPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgcmVtb3ZlTnVtID0gTWF0aC5tYXgocmVtb3ZlTnVtIHwgMCwgMCk7XG4gICAgICBpZiAobnVtQXJncyA9PT0gMCB8fCAobnVtQXJncyA9PT0gMiAmJiAhcmVtb3ZlTnVtKSkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICAgIC8vIElmIGluZGV4IGlzIG5lZ2F0aXZlLCBpdCBzaG91bGQgcmVzb2x2ZSByZWxhdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGVcbiAgICAgIC8vIGNvbGxlY3Rpb24uIEhvd2V2ZXIgc2l6ZSBtYXkgYmUgZXhwZW5zaXZlIHRvIGNvbXB1dGUgaWYgbm90IGNhY2hlZCwgc29cbiAgICAgIC8vIG9ubHkgY2FsbCBjb3VudCgpIGlmIHRoZSBudW1iZXIgaXMgaW4gZmFjdCBuZWdhdGl2ZS5cbiAgICAgIGluZGV4ID0gcmVzb2x2ZUJlZ2luKGluZGV4LCBpbmRleCA8IDAgPyB0aGlzLmNvdW50KCkgOiB0aGlzLnNpemUpO1xuICAgICAgdmFyIHNwbGljZWQgPSB0aGlzLnNsaWNlKDAsIGluZGV4KTtcbiAgICAgIHJldHVybiByZWlmeShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgbnVtQXJncyA9PT0gMSA/XG4gICAgICAgICAgc3BsaWNlZCA6XG4gICAgICAgICAgc3BsaWNlZC5jb25jYXQoYXJyQ29weShhcmd1bWVudHMsIDIpLCB0aGlzLnNsaWNlKGluZGV4ICsgcmVtb3ZlTnVtKSlcbiAgICAgICk7XG4gICAgfSxcblxuXG4gICAgLy8gIyMjIE1vcmUgY29sbGVjdGlvbiBtZXRob2RzXG5cbiAgICBmaW5kTGFzdEluZGV4OiBmdW5jdGlvbihwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICAgIHZhciBlbnRyeSA9IHRoaXMuZmluZExhc3RFbnRyeShwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIGVudHJ5ID8gZW50cnlbMF0gOiAtMTtcbiAgICB9LFxuXG4gICAgZmlyc3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0KDApO1xuICAgIH0sXG5cbiAgICBmbGF0dGVuOiBmdW5jdGlvbihkZXB0aCkge1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIGZsYXR0ZW5GYWN0b3J5KHRoaXMsIGRlcHRoLCBmYWxzZSkpO1xuICAgIH0sXG5cbiAgICBnZXQ6IGZ1bmN0aW9uKGluZGV4LCBub3RTZXRWYWx1ZSkge1xuICAgICAgaW5kZXggPSB3cmFwSW5kZXgodGhpcywgaW5kZXgpO1xuICAgICAgcmV0dXJuIChpbmRleCA8IDAgfHwgKHRoaXMuc2l6ZSA9PT0gSW5maW5pdHkgfHxcbiAgICAgICAgICAodGhpcy5zaXplICE9PSB1bmRlZmluZWQgJiYgaW5kZXggPiB0aGlzLnNpemUpKSkgP1xuICAgICAgICBub3RTZXRWYWx1ZSA6XG4gICAgICAgIHRoaXMuZmluZChmdW5jdGlvbihfLCBrZXkpICB7cmV0dXJuIGtleSA9PT0gaW5kZXh9LCB1bmRlZmluZWQsIG5vdFNldFZhbHVlKTtcbiAgICB9LFxuXG4gICAgaGFzOiBmdW5jdGlvbihpbmRleCkge1xuICAgICAgaW5kZXggPSB3cmFwSW5kZXgodGhpcywgaW5kZXgpO1xuICAgICAgcmV0dXJuIGluZGV4ID49IDAgJiYgKHRoaXMuc2l6ZSAhPT0gdW5kZWZpbmVkID9cbiAgICAgICAgdGhpcy5zaXplID09PSBJbmZpbml0eSB8fCBpbmRleCA8IHRoaXMuc2l6ZSA6XG4gICAgICAgIHRoaXMuaW5kZXhPZihpbmRleCkgIT09IC0xXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBpbnRlcnBvc2U6IGZ1bmN0aW9uKHNlcGFyYXRvcikge1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIGludGVycG9zZUZhY3RvcnkodGhpcywgc2VwYXJhdG9yKSk7XG4gICAgfSxcblxuICAgIGludGVybGVhdmU6IGZ1bmN0aW9uKC8qLi4uaXRlcmFibGVzKi8pIHtcbiAgICAgIHZhciBpdGVyYWJsZXMgPSBbdGhpc10uY29uY2F0KGFyckNvcHkoYXJndW1lbnRzKSk7XG4gICAgICB2YXIgemlwcGVkID0gemlwV2l0aEZhY3RvcnkodGhpcy50b1NlcSgpLCBJbmRleGVkU2VxLm9mLCBpdGVyYWJsZXMpO1xuICAgICAgdmFyIGludGVybGVhdmVkID0gemlwcGVkLmZsYXR0ZW4odHJ1ZSk7XG4gICAgICBpZiAoemlwcGVkLnNpemUpIHtcbiAgICAgICAgaW50ZXJsZWF2ZWQuc2l6ZSA9IHppcHBlZC5zaXplICogaXRlcmFibGVzLmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWlmeSh0aGlzLCBpbnRlcmxlYXZlZCk7XG4gICAgfSxcblxuICAgIGtleVNlcTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gUmFuZ2UoMCwgdGhpcy5zaXplKTtcbiAgICB9LFxuXG4gICAgbGFzdDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXQoLTEpO1xuICAgIH0sXG5cbiAgICBza2lwV2hpbGU6IGZ1bmN0aW9uKHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHNraXBXaGlsZUZhY3RvcnkodGhpcywgcHJlZGljYXRlLCBjb250ZXh0LCBmYWxzZSkpO1xuICAgIH0sXG5cbiAgICB6aXA6IGZ1bmN0aW9uKC8qLCAuLi5pdGVyYWJsZXMgKi8pIHtcbiAgICAgIHZhciBpdGVyYWJsZXMgPSBbdGhpc10uY29uY2F0KGFyckNvcHkoYXJndW1lbnRzKSk7XG4gICAgICByZXR1cm4gcmVpZnkodGhpcywgemlwV2l0aEZhY3RvcnkodGhpcywgZGVmYXVsdFppcHBlciwgaXRlcmFibGVzKSk7XG4gICAgfSxcblxuICAgIHppcFdpdGg6IGZ1bmN0aW9uKHppcHBlci8qLCAuLi5pdGVyYWJsZXMgKi8pIHtcbiAgICAgIHZhciBpdGVyYWJsZXMgPSBhcnJDb3B5KGFyZ3VtZW50cyk7XG4gICAgICBpdGVyYWJsZXNbMF0gPSB0aGlzO1xuICAgICAgcmV0dXJuIHJlaWZ5KHRoaXMsIHppcFdpdGhGYWN0b3J5KHRoaXMsIHppcHBlciwgaXRlcmFibGVzKSk7XG4gICAgfVxuXG4gIH0pO1xuXG4gIEluZGV4ZWRJdGVyYWJsZS5wcm90b3R5cGVbSVNfSU5ERVhFRF9TRU5USU5FTF0gPSB0cnVlO1xuICBJbmRleGVkSXRlcmFibGUucHJvdG90eXBlW0lTX09SREVSRURfU0VOVElORUxdID0gdHJ1ZTtcblxuXG5cbiAgbWl4aW4oU2V0SXRlcmFibGUsIHtcblxuICAgIC8vICMjIyBFUzYgQ29sbGVjdGlvbiBtZXRob2RzIChFUzYgQXJyYXkgYW5kIE1hcClcblxuICAgIGdldDogZnVuY3Rpb24odmFsdWUsIG5vdFNldFZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXModmFsdWUpID8gdmFsdWUgOiBub3RTZXRWYWx1ZTtcbiAgICB9LFxuXG4gICAgaW5jbHVkZXM6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5oYXModmFsdWUpO1xuICAgIH0sXG5cblxuICAgIC8vICMjIyBNb3JlIHNlcXVlbnRpYWwgbWV0aG9kc1xuXG4gICAga2V5U2VxOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlU2VxKCk7XG4gICAgfVxuXG4gIH0pO1xuXG4gIFNldEl0ZXJhYmxlLnByb3RvdHlwZS5oYXMgPSBJdGVyYWJsZVByb3RvdHlwZS5pbmNsdWRlcztcbiAgU2V0SXRlcmFibGUucHJvdG90eXBlLmNvbnRhaW5zID0gU2V0SXRlcmFibGUucHJvdG90eXBlLmluY2x1ZGVzO1xuXG5cbiAgLy8gTWl4aW4gc3ViY2xhc3Nlc1xuXG4gIG1peGluKEtleWVkU2VxLCBLZXllZEl0ZXJhYmxlLnByb3RvdHlwZSk7XG4gIG1peGluKEluZGV4ZWRTZXEsIEluZGV4ZWRJdGVyYWJsZS5wcm90b3R5cGUpO1xuICBtaXhpbihTZXRTZXEsIFNldEl0ZXJhYmxlLnByb3RvdHlwZSk7XG5cbiAgbWl4aW4oS2V5ZWRDb2xsZWN0aW9uLCBLZXllZEl0ZXJhYmxlLnByb3RvdHlwZSk7XG4gIG1peGluKEluZGV4ZWRDb2xsZWN0aW9uLCBJbmRleGVkSXRlcmFibGUucHJvdG90eXBlKTtcbiAgbWl4aW4oU2V0Q29sbGVjdGlvbiwgU2V0SXRlcmFibGUucHJvdG90eXBlKTtcblxuXG4gIC8vICNwcmFnbWEgSGVscGVyIGZ1bmN0aW9uc1xuXG4gIGZ1bmN0aW9uIGtleU1hcHBlcih2LCBrKSB7XG4gICAgcmV0dXJuIGs7XG4gIH1cblxuICBmdW5jdGlvbiBlbnRyeU1hcHBlcih2LCBrKSB7XG4gICAgcmV0dXJuIFtrLCB2XTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5vdChwcmVkaWNhdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gIXByZWRpY2F0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG5lZyhwcmVkaWNhdGUpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gLXByZWRpY2F0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHF1b3RlU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgOiBTdHJpbmcodmFsdWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVmYXVsdFppcHBlcigpIHtcbiAgICByZXR1cm4gYXJyQ29weShhcmd1bWVudHMpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVmYXVsdE5lZ0NvbXBhcmF0b3IoYSwgYikge1xuICAgIHJldHVybiBhIDwgYiA/IDEgOiBhID4gYiA/IC0xIDogMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhc2hJdGVyYWJsZShpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZS5zaXplID09PSBJbmZpbml0eSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHZhciBvcmRlcmVkID0gaXNPcmRlcmVkKGl0ZXJhYmxlKTtcbiAgICB2YXIga2V5ZWQgPSBpc0tleWVkKGl0ZXJhYmxlKTtcbiAgICB2YXIgaCA9IG9yZGVyZWQgPyAxIDogMDtcbiAgICB2YXIgc2l6ZSA9IGl0ZXJhYmxlLl9faXRlcmF0ZShcbiAgICAgIGtleWVkID9cbiAgICAgICAgb3JkZXJlZCA/XG4gICAgICAgICAgZnVuY3Rpb24odiwgaykgIHsgaCA9IDMxICogaCArIGhhc2hNZXJnZShoYXNoKHYpLCBoYXNoKGspKSB8IDA7IH0gOlxuICAgICAgICAgIGZ1bmN0aW9uKHYsIGspICB7IGggPSBoICsgaGFzaE1lcmdlKGhhc2godiksIGhhc2goaykpIHwgMDsgfSA6XG4gICAgICAgIG9yZGVyZWQgP1xuICAgICAgICAgIGZ1bmN0aW9uKHYgKSB7IGggPSAzMSAqIGggKyBoYXNoKHYpIHwgMDsgfSA6XG4gICAgICAgICAgZnVuY3Rpb24odiApIHsgaCA9IGggKyBoYXNoKHYpIHwgMDsgfVxuICAgICk7XG4gICAgcmV0dXJuIG11cm11ckhhc2hPZlNpemUoc2l6ZSwgaCk7XG4gIH1cblxuICBmdW5jdGlvbiBtdXJtdXJIYXNoT2ZTaXplKHNpemUsIGgpIHtcbiAgICBoID0gaW11bChoLCAweENDOUUyRDUxKTtcbiAgICBoID0gaW11bChoIDw8IDE1IHwgaCA+Pj4gLTE1LCAweDFCODczNTkzKTtcbiAgICBoID0gaW11bChoIDw8IDEzIHwgaCA+Pj4gLTEzLCA1KTtcbiAgICBoID0gKGggKyAweEU2NTQ2QjY0IHwgMCkgXiBzaXplO1xuICAgIGggPSBpbXVsKGggXiBoID4+PiAxNiwgMHg4NUVCQ0E2Qik7XG4gICAgaCA9IGltdWwoaCBeIGggPj4+IDEzLCAweEMyQjJBRTM1KTtcbiAgICBoID0gc21pKGggXiBoID4+PiAxNik7XG4gICAgcmV0dXJuIGg7XG4gIH1cblxuICBmdW5jdGlvbiBoYXNoTWVyZ2UoYSwgYikge1xuICAgIHJldHVybiBhIF4gYiArIDB4OUUzNzc5QjkgKyAoYSA8PCA2KSArIChhID4+IDIpIHwgMDsgLy8gaW50XG4gIH1cblxuICB2YXIgSW1tdXRhYmxlID0ge1xuXG4gICAgSXRlcmFibGU6IEl0ZXJhYmxlLFxuXG4gICAgU2VxOiBTZXEsXG4gICAgQ29sbGVjdGlvbjogQ29sbGVjdGlvbixcbiAgICBNYXA6IE1hcCxcbiAgICBPcmRlcmVkTWFwOiBPcmRlcmVkTWFwLFxuICAgIExpc3Q6IExpc3QsXG4gICAgU3RhY2s6IFN0YWNrLFxuICAgIFNldDogU2V0LFxuICAgIE9yZGVyZWRTZXQ6IE9yZGVyZWRTZXQsXG5cbiAgICBSZWNvcmQ6IFJlY29yZCxcbiAgICBSYW5nZTogUmFuZ2UsXG4gICAgUmVwZWF0OiBSZXBlYXQsXG5cbiAgICBpczogaXMsXG4gICAgZnJvbUpTOiBmcm9tSlNcblxuICB9O1xuXG4gIHJldHVybiBJbW11dGFibGU7XG5cbn0pKTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL21lbW9pemVyJylbJ2RlZmF1bHQnXTtcbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IGV4cG9ydHM7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qXG5Db3B5cmlnaHQgKGMpIDIwMTQsIFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5Db3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG5TZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuKi9cblxuLyoganNsaW50IGVzbmV4dDogdHJ1ZSAqL1xuXG4vLyBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE1vemlsbGEgRGV2ZWxvcGVyIE5ldHdvcms6XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9GdW5jdGlvbi9iaW5kI1BvbHlmaWxsXG5cbnZhciBiaW5kID0gRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgfHwgZnVuY3Rpb24gKG9UaGlzKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBjbG9zZXN0IHRoaW5nIHBvc3NpYmxlIHRvIHRoZSBFQ01BU2NyaXB0IDVcbiAgICAgIC8vIGludGVybmFsIElzQ2FsbGFibGUgZnVuY3Rpb25cbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Z1bmN0aW9uLnByb3RvdHlwZS5iaW5kIC0gd2hhdCBpcyB0cnlpbmcgdG8gYmUgYm91bmQgaXMgbm90IGNhbGxhYmxlJyk7XG4gICAgfVxuXG4gICAgdmFyIGFBcmdzICAgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLFxuICAgICAgICBmVG9CaW5kID0gdGhpcyxcbiAgICAgICAgZk5PUCAgICA9IGZ1bmN0aW9uKCkge30sXG4gICAgICAgIGZCb3VuZCAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gZlRvQmluZC5hcHBseSh0aGlzIGluc3RhbmNlb2YgZk5PUFxuICAgICAgICAgICAgICAgICA/IHRoaXNcbiAgICAgICAgICAgICAgICAgOiBvVGhpcyxcbiAgICAgICAgICAgICAgICAgYUFyZ3MuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpKTtcbiAgICAgICAgfTtcblxuICAgIGlmICh0aGlzLnByb3RvdHlwZSkge1xuICAgICAgLy8gbmF0aXZlIGZ1bmN0aW9ucyBkb24ndCBoYXZlIGEgcHJvdG90eXBlXG4gICAgICBmTk9QLnByb3RvdHlwZSA9IHRoaXMucHJvdG90eXBlO1xuICAgIH1cbiAgICBmQm91bmQucHJvdG90eXBlID0gbmV3IGZOT1AoKTtcblxuICAgIHJldHVybiBmQm91bmQ7XG59O1xuXG4vLyBQdXJwb3NlbHkgdXNpbmcgdGhlIHNhbWUgaW1wbGVtZW50YXRpb24gYXMgdGhlIEludGwuanMgYEludGxgIHBvbHlmaWxsLlxuLy8gQ29weXJpZ2h0IDIwMTMgQW5keSBFYXJuc2hhdywgTUlUIExpY2Vuc2VcblxudmFyIGhvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciByZWFsRGVmaW5lUHJvcCA9IChmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHsgcmV0dXJuICEhT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHt9KTsgfVxuICAgIGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfVxufSkoKTtcblxudmFyIGVzMyA9ICFyZWFsRGVmaW5lUHJvcCAmJiAhT2JqZWN0LnByb3RvdHlwZS5fX2RlZmluZUdldHRlcl9fO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSByZWFsRGVmaW5lUHJvcCA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6XG4gICAgICAgIGZ1bmN0aW9uIChvYmosIG5hbWUsIGRlc2MpIHtcblxuICAgIGlmICgnZ2V0JyBpbiBkZXNjICYmIG9iai5fX2RlZmluZUdldHRlcl9fKSB7XG4gICAgICAgIG9iai5fX2RlZmluZUdldHRlcl9fKG5hbWUsIGRlc2MuZ2V0KTtcbiAgICB9IGVsc2UgaWYgKCFob3AuY2FsbChvYmosIG5hbWUpIHx8ICd2YWx1ZScgaW4gZGVzYykge1xuICAgICAgICBvYmpbbmFtZV0gPSBkZXNjLnZhbHVlO1xuICAgIH1cbn07XG5cbnZhciBvYmpDcmVhdGUgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIChwcm90bywgcHJvcHMpIHtcbiAgICB2YXIgb2JqLCBrO1xuXG4gICAgZnVuY3Rpb24gRigpIHt9XG4gICAgRi5wcm90b3R5cGUgPSBwcm90bztcbiAgICBvYmogPSBuZXcgRigpO1xuXG4gICAgZm9yIChrIGluIHByb3BzKSB7XG4gICAgICAgIGlmIChob3AuY2FsbChwcm9wcywgaykpIHtcbiAgICAgICAgICAgIGRlZmluZVByb3BlcnR5KG9iaiwgaywgcHJvcHNba10pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbmV4cG9ydHMuYmluZCA9IGJpbmQsIGV4cG9ydHMuZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eSwgZXhwb3J0cy5vYmpDcmVhdGUgPSBvYmpDcmVhdGU7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVzNS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBzcmMkZXM1JCQgPSByZXF1aXJlKFwiLi9lczVcIik7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGNyZWF0ZUZvcm1hdENhY2hlO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBjcmVhdGVGb3JtYXRDYWNoZShGb3JtYXRDb25zdHJ1Y3Rvcikge1xuICAgIHZhciBjYWNoZSA9IHNyYyRlczUkJC5vYmpDcmVhdGUobnVsbCk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgYXJncyAgICA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgICAgIHZhciBjYWNoZUlkID0gZ2V0Q2FjaGVJZChhcmdzKTtcbiAgICAgICAgdmFyIGZvcm1hdCAgPSBjYWNoZUlkICYmIGNhY2hlW2NhY2hlSWRdO1xuXG4gICAgICAgIGlmICghZm9ybWF0KSB7XG4gICAgICAgICAgICBmb3JtYXQgPSBuZXcgKHNyYyRlczUkJC5iaW5kLmFwcGx5KEZvcm1hdENvbnN0cnVjdG9yLCBbbnVsbF0uY29uY2F0KGFyZ3MpKSkoKTtcblxuICAgICAgICAgICAgaWYgKGNhY2hlSWQpIHtcbiAgICAgICAgICAgICAgICBjYWNoZVtjYWNoZUlkXSA9IGZvcm1hdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgfTtcbn1cblxuLy8gLS0gVXRpbGl0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gZ2V0Q2FjaGVJZChpbnB1dHMpIHtcbiAgICAvLyBXaGVuIEpTT04gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgcnVudGltZSwgd2Ugd2lsbCBub3QgY3JlYXRlIGEgY2FjaGUgaWQuXG4gICAgaWYgKHR5cGVvZiBKU09OID09PSAndW5kZWZpbmVkJykgeyByZXR1cm47IH1cblxuICAgIHZhciBjYWNoZUlkID0gW107XG5cbiAgICB2YXIgaSwgbGVuLCBpbnB1dDtcblxuICAgIGZvciAoaSA9IDAsIGxlbiA9IGlucHV0cy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICBpbnB1dCA9IGlucHV0c1tpXTtcblxuICAgICAgICBpZiAoaW5wdXQgJiYgdHlwZW9mIGlucHV0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgY2FjaGVJZC5wdXNoKG9yZGVyZWRQcm9wcyhpbnB1dCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVJZC5wdXNoKGlucHV0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShjYWNoZUlkKTtcbn1cblxuZnVuY3Rpb24gb3JkZXJlZFByb3BzKG9iaikge1xuICAgIHZhciBwcm9wcyA9IFtdLFxuICAgICAgICBrZXlzICA9IFtdO1xuXG4gICAgdmFyIGtleSwgaSwgbGVuLCBwcm9wO1xuXG4gICAgZm9yIChrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgb3JkZXJlZEtleXMgPSBrZXlzLnNvcnQoKTtcblxuICAgIGZvciAoaSA9IDAsIGxlbiA9IG9yZGVyZWRLZXlzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIGtleSAgPSBvcmRlcmVkS2V5c1tpXTtcbiAgICAgICAgcHJvcCA9IHt9O1xuXG4gICAgICAgIHByb3Bba2V5XSA9IG9ialtrZXldO1xuICAgICAgICBwcm9wc1tpXSAgPSBwcm9wO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9wcztcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWVtb2l6ZXIuanMubWFwIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9wYXJzZXInKVsnZGVmYXVsdCddO1xuZXhwb3J0c1snZGVmYXVsdCddID0gZXhwb3J0cztcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IChmdW5jdGlvbigpIHtcbiAgLypcbiAgICogR2VuZXJhdGVkIGJ5IFBFRy5qcyAwLjguMC5cbiAgICpcbiAgICogaHR0cDovL3BlZ2pzLm1hamRhLmN6L1xuICAgKi9cblxuICBmdW5jdGlvbiBwZWckc3ViY2xhc3MoY2hpbGQsIHBhcmVudCkge1xuICAgIGZ1bmN0aW9uIGN0b3IoKSB7IHRoaXMuY29uc3RydWN0b3IgPSBjaGlsZDsgfVxuICAgIGN0b3IucHJvdG90eXBlID0gcGFyZW50LnByb3RvdHlwZTtcbiAgICBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpO1xuICB9XG5cbiAgZnVuY3Rpb24gU3ludGF4RXJyb3IobWVzc2FnZSwgZXhwZWN0ZWQsIGZvdW5kLCBvZmZzZXQsIGxpbmUsIGNvbHVtbikge1xuICAgIHRoaXMubWVzc2FnZSAgPSBtZXNzYWdlO1xuICAgIHRoaXMuZXhwZWN0ZWQgPSBleHBlY3RlZDtcbiAgICB0aGlzLmZvdW5kICAgID0gZm91bmQ7XG4gICAgdGhpcy5vZmZzZXQgICA9IG9mZnNldDtcbiAgICB0aGlzLmxpbmUgICAgID0gbGluZTtcbiAgICB0aGlzLmNvbHVtbiAgID0gY29sdW1uO1xuXG4gICAgdGhpcy5uYW1lICAgICA9IFwiU3ludGF4RXJyb3JcIjtcbiAgfVxuXG4gIHBlZyRzdWJjbGFzcyhTeW50YXhFcnJvciwgRXJyb3IpO1xuXG4gIGZ1bmN0aW9uIHBhcnNlKGlucHV0KSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHt9LFxuXG4gICAgICAgIHBlZyRGQUlMRUQgPSB7fSxcblxuICAgICAgICBwZWckc3RhcnRSdWxlRnVuY3Rpb25zID0geyBzdGFydDogcGVnJHBhcnNlc3RhcnQgfSxcbiAgICAgICAgcGVnJHN0YXJ0UnVsZUZ1bmN0aW9uICA9IHBlZyRwYXJzZXN0YXJ0LFxuXG4gICAgICAgIHBlZyRjMCA9IFtdLFxuICAgICAgICBwZWckYzEgPSBmdW5jdGlvbihlbGVtZW50cykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgICAgOiAnbWVzc2FnZUZvcm1hdFBhdHRlcm4nLFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50czogZWxlbWVudHNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgcGVnJGMyID0gcGVnJEZBSUxFRCxcbiAgICAgICAgcGVnJGMzID0gZnVuY3Rpb24odGV4dCkge1xuICAgICAgICAgICAgICAgIHZhciBzdHJpbmcgPSAnJyxcbiAgICAgICAgICAgICAgICAgICAgaSwgaiwgb3V0ZXJMZW4sIGlubmVyLCBpbm5lckxlbjtcblxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIG91dGVyTGVuID0gdGV4dC5sZW5ndGg7IGkgPCBvdXRlckxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlubmVyID0gdGV4dFtpXTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwLCBpbm5lckxlbiA9IGlubmVyLmxlbmd0aDsgaiA8IGlubmVyTGVuOyBqICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBpbm5lcltqXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgICAgICAgICB9LFxuICAgICAgICBwZWckYzQgPSBmdW5jdGlvbihtZXNzYWdlVGV4dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgOiAnbWVzc2FnZVRleHRFbGVtZW50JyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1lc3NhZ2VUZXh0XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIHBlZyRjNSA9IC9eW14gXFx0XFxuXFxyLC4rPXt9I10vLFxuICAgICAgICBwZWckYzYgPSB7IHR5cGU6IFwiY2xhc3NcIiwgdmFsdWU6IFwiW14gXFxcXHRcXFxcblxcXFxyLC4rPXt9I11cIiwgZGVzY3JpcHRpb246IFwiW14gXFxcXHRcXFxcblxcXFxyLC4rPXt9I11cIiB9LFxuICAgICAgICBwZWckYzcgPSBcIntcIixcbiAgICAgICAgcGVnJGM4ID0geyB0eXBlOiBcImxpdGVyYWxcIiwgdmFsdWU6IFwie1wiLCBkZXNjcmlwdGlvbjogXCJcXFwie1xcXCJcIiB9LFxuICAgICAgICBwZWckYzkgPSBudWxsLFxuICAgICAgICBwZWckYzEwID0gXCIsXCIsXG4gICAgICAgIHBlZyRjMTEgPSB7IHR5cGU6IFwibGl0ZXJhbFwiLCB2YWx1ZTogXCIsXCIsIGRlc2NyaXB0aW9uOiBcIlxcXCIsXFxcIlwiIH0sXG4gICAgICAgIHBlZyRjMTIgPSBcIn1cIixcbiAgICAgICAgcGVnJGMxMyA9IHsgdHlwZTogXCJsaXRlcmFsXCIsIHZhbHVlOiBcIn1cIiwgZGVzY3JpcHRpb246IFwiXFxcIn1cXFwiXCIgfSxcbiAgICAgICAgcGVnJGMxNCA9IGZ1bmN0aW9uKGlkLCBmb3JtYXQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlICA6ICdhcmd1bWVudEVsZW1lbnQnLFxuICAgICAgICAgICAgICAgICAgICBpZCAgICA6IGlkLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IGZvcm1hdCAmJiBmb3JtYXRbMl1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgcGVnJGMxNSA9IFwibnVtYmVyXCIsXG4gICAgICAgIHBlZyRjMTYgPSB7IHR5cGU6IFwibGl0ZXJhbFwiLCB2YWx1ZTogXCJudW1iZXJcIiwgZGVzY3JpcHRpb246IFwiXFxcIm51bWJlclxcXCJcIiB9LFxuICAgICAgICBwZWckYzE3ID0gXCJkYXRlXCIsXG4gICAgICAgIHBlZyRjMTggPSB7IHR5cGU6IFwibGl0ZXJhbFwiLCB2YWx1ZTogXCJkYXRlXCIsIGRlc2NyaXB0aW9uOiBcIlxcXCJkYXRlXFxcIlwiIH0sXG4gICAgICAgIHBlZyRjMTkgPSBcInRpbWVcIixcbiAgICAgICAgcGVnJGMyMCA9IHsgdHlwZTogXCJsaXRlcmFsXCIsIHZhbHVlOiBcInRpbWVcIiwgZGVzY3JpcHRpb246IFwiXFxcInRpbWVcXFwiXCIgfSxcbiAgICAgICAgcGVnJGMyMSA9IGZ1bmN0aW9uKHR5cGUsIHN0eWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSA6IHR5cGUgKyAnRm9ybWF0JyxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHN0eWxlICYmIHN0eWxlWzJdXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIHBlZyRjMjIgPSBcInBsdXJhbFwiLFxuICAgICAgICBwZWckYzIzID0geyB0eXBlOiBcImxpdGVyYWxcIiwgdmFsdWU6IFwicGx1cmFsXCIsIGRlc2NyaXB0aW9uOiBcIlxcXCJwbHVyYWxcXFwiXCIgfSxcbiAgICAgICAgcGVnJGMyNCA9IGZ1bmN0aW9uKHBsdXJhbFN0eWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSAgIDogcGx1cmFsU3R5bGUudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgb3JkaW5hbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA6IHBsdXJhbFN0eWxlLm9mZnNldCB8fCAwLFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBwbHVyYWxTdHlsZS5vcHRpb25zXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIHBlZyRjMjUgPSBcInNlbGVjdG9yZGluYWxcIixcbiAgICAgICAgcGVnJGMyNiA9IHsgdHlwZTogXCJsaXRlcmFsXCIsIHZhbHVlOiBcInNlbGVjdG9yZGluYWxcIiwgZGVzY3JpcHRpb246IFwiXFxcInNlbGVjdG9yZGluYWxcXFwiXCIgfSxcbiAgICAgICAgcGVnJGMyNyA9IGZ1bmN0aW9uKHBsdXJhbFN0eWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSAgIDogcGx1cmFsU3R5bGUudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgb3JkaW5hbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IDogcGx1cmFsU3R5bGUub2Zmc2V0IHx8IDAsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHBsdXJhbFN0eWxlLm9wdGlvbnNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICBwZWckYzI4ID0gXCJzZWxlY3RcIixcbiAgICAgICAgcGVnJGMyOSA9IHsgdHlwZTogXCJsaXRlcmFsXCIsIHZhbHVlOiBcInNlbGVjdFwiLCBkZXNjcmlwdGlvbjogXCJcXFwic2VsZWN0XFxcIlwiIH0sXG4gICAgICAgIHBlZyRjMzAgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZSAgIDogJ3NlbGVjdEZvcm1hdCcsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgcGVnJGMzMSA9IFwiPVwiLFxuICAgICAgICBwZWckYzMyID0geyB0eXBlOiBcImxpdGVyYWxcIiwgdmFsdWU6IFwiPVwiLCBkZXNjcmlwdGlvbjogXCJcXFwiPVxcXCJcIiB9LFxuICAgICAgICBwZWckYzMzID0gZnVuY3Rpb24oc2VsZWN0b3IsIHBhdHRlcm4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlICAgIDogJ29wdGlvbmFsRm9ybWF0UGF0dGVybicsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgICA6IHBhdHRlcm5cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgcGVnJGMzNCA9IFwib2Zmc2V0OlwiLFxuICAgICAgICBwZWckYzM1ID0geyB0eXBlOiBcImxpdGVyYWxcIiwgdmFsdWU6IFwib2Zmc2V0OlwiLCBkZXNjcmlwdGlvbjogXCJcXFwib2Zmc2V0OlxcXCJcIiB9LFxuICAgICAgICBwZWckYzM2ID0gZnVuY3Rpb24obnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIHBlZyRjMzcgPSBmdW5jdGlvbihvZmZzZXQsIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlICAgOiAncGx1cmFsRm9ybWF0JyxcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IDogb2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIHBlZyRjMzggPSB7IHR5cGU6IFwib3RoZXJcIiwgZGVzY3JpcHRpb246IFwid2hpdGVzcGFjZVwiIH0sXG4gICAgICAgIHBlZyRjMzkgPSAvXlsgXFx0XFxuXFxyXS8sXG4gICAgICAgIHBlZyRjNDAgPSB7IHR5cGU6IFwiY2xhc3NcIiwgdmFsdWU6IFwiWyBcXFxcdFxcXFxuXFxcXHJdXCIsIGRlc2NyaXB0aW9uOiBcIlsgXFxcXHRcXFxcblxcXFxyXVwiIH0sXG4gICAgICAgIHBlZyRjNDEgPSB7IHR5cGU6IFwib3RoZXJcIiwgZGVzY3JpcHRpb246IFwib3B0aW9uYWxXaGl0ZXNwYWNlXCIgfSxcbiAgICAgICAgcGVnJGM0MiA9IC9eWzAtOV0vLFxuICAgICAgICBwZWckYzQzID0geyB0eXBlOiBcImNsYXNzXCIsIHZhbHVlOiBcIlswLTldXCIsIGRlc2NyaXB0aW9uOiBcIlswLTldXCIgfSxcbiAgICAgICAgcGVnJGM0NCA9IC9eWzAtOWEtZl0vaSxcbiAgICAgICAgcGVnJGM0NSA9IHsgdHlwZTogXCJjbGFzc1wiLCB2YWx1ZTogXCJbMC05YS1mXWlcIiwgZGVzY3JpcHRpb246IFwiWzAtOWEtZl1pXCIgfSxcbiAgICAgICAgcGVnJGM0NiA9IFwiMFwiLFxuICAgICAgICBwZWckYzQ3ID0geyB0eXBlOiBcImxpdGVyYWxcIiwgdmFsdWU6IFwiMFwiLCBkZXNjcmlwdGlvbjogXCJcXFwiMFxcXCJcIiB9LFxuICAgICAgICBwZWckYzQ4ID0gL15bMS05XS8sXG4gICAgICAgIHBlZyRjNDkgPSB7IHR5cGU6IFwiY2xhc3NcIiwgdmFsdWU6IFwiWzEtOV1cIiwgZGVzY3JpcHRpb246IFwiWzEtOV1cIiB9LFxuICAgICAgICBwZWckYzUwID0gZnVuY3Rpb24oZGlnaXRzKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoZGlnaXRzLCAxMCk7XG4gICAgICAgIH0sXG4gICAgICAgIHBlZyRjNTEgPSAvXltee31cXFxcXFwwLVxceDFGfyBcXHRcXG5cXHJdLyxcbiAgICAgICAgcGVnJGM1MiA9IHsgdHlwZTogXCJjbGFzc1wiLCB2YWx1ZTogXCJbXnt9XFxcXFxcXFxcXFxcMC1cXFxceDFGfyBcXFxcdFxcXFxuXFxcXHJdXCIsIGRlc2NyaXB0aW9uOiBcIltee31cXFxcXFxcXFxcXFwwLVxcXFx4MUZ/IFxcXFx0XFxcXG5cXFxccl1cIiB9LFxuICAgICAgICBwZWckYzUzID0gXCJcXFxcXFxcXFwiLFxuICAgICAgICBwZWckYzU0ID0geyB0eXBlOiBcImxpdGVyYWxcIiwgdmFsdWU6IFwiXFxcXFxcXFxcIiwgZGVzY3JpcHRpb246IFwiXFxcIlxcXFxcXFxcXFxcXFxcXFxcXFwiXCIgfSxcbiAgICAgICAgcGVnJGM1NSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gJ1xcXFwnOyB9LFxuICAgICAgICBwZWckYzU2ID0gXCJcXFxcI1wiLFxuICAgICAgICBwZWckYzU3ID0geyB0eXBlOiBcImxpdGVyYWxcIiwgdmFsdWU6IFwiXFxcXCNcIiwgZGVzY3JpcHRpb246IFwiXFxcIlxcXFxcXFxcI1xcXCJcIiB9LFxuICAgICAgICBwZWckYzU4ID0gZnVuY3Rpb24oKSB7IHJldHVybiAnXFxcXCMnOyB9LFxuICAgICAgICBwZWckYzU5ID0gXCJcXFxce1wiLFxuICAgICAgICBwZWckYzYwID0geyB0eXBlOiBcImxpdGVyYWxcIiwgdmFsdWU6IFwiXFxcXHtcIiwgZGVzY3JpcHRpb246IFwiXFxcIlxcXFxcXFxce1xcXCJcIiB9LFxuICAgICAgICBwZWckYzYxID0gZnVuY3Rpb24oKSB7IHJldHVybiAnXFx1MDA3Qic7IH0sXG4gICAgICAgIHBlZyRjNjIgPSBcIlxcXFx9XCIsXG4gICAgICAgIHBlZyRjNjMgPSB7IHR5cGU6IFwibGl0ZXJhbFwiLCB2YWx1ZTogXCJcXFxcfVwiLCBkZXNjcmlwdGlvbjogXCJcXFwiXFxcXFxcXFx9XFxcIlwiIH0sXG4gICAgICAgIHBlZyRjNjQgPSBmdW5jdGlvbigpIHsgcmV0dXJuICdcXHUwMDdEJzsgfSxcbiAgICAgICAgcGVnJGM2NSA9IFwiXFxcXHVcIixcbiAgICAgICAgcGVnJGM2NiA9IHsgdHlwZTogXCJsaXRlcmFsXCIsIHZhbHVlOiBcIlxcXFx1XCIsIGRlc2NyaXB0aW9uOiBcIlxcXCJcXFxcXFxcXHVcXFwiXCIgfSxcbiAgICAgICAgcGVnJGM2NyA9IGZ1bmN0aW9uKGRpZ2l0cykge1xuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGRpZ2l0cywgMTYpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIHBlZyRjNjggPSBmdW5jdGlvbihjaGFycykgeyByZXR1cm4gY2hhcnMuam9pbignJyk7IH0sXG5cbiAgICAgICAgcGVnJGN1cnJQb3MgICAgICAgICAgPSAwLFxuICAgICAgICBwZWckcmVwb3J0ZWRQb3MgICAgICA9IDAsXG4gICAgICAgIHBlZyRjYWNoZWRQb3MgICAgICAgID0gMCxcbiAgICAgICAgcGVnJGNhY2hlZFBvc0RldGFpbHMgPSB7IGxpbmU6IDEsIGNvbHVtbjogMSwgc2VlbkNSOiBmYWxzZSB9LFxuICAgICAgICBwZWckbWF4RmFpbFBvcyAgICAgICA9IDAsXG4gICAgICAgIHBlZyRtYXhGYWlsRXhwZWN0ZWQgID0gW10sXG4gICAgICAgIHBlZyRzaWxlbnRGYWlscyAgICAgID0gMCxcblxuICAgICAgICBwZWckcmVzdWx0O1xuXG4gICAgaWYgKFwic3RhcnRSdWxlXCIgaW4gb3B0aW9ucykge1xuICAgICAgaWYgKCEob3B0aW9ucy5zdGFydFJ1bGUgaW4gcGVnJHN0YXJ0UnVsZUZ1bmN0aW9ucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3Qgc3RhcnQgcGFyc2luZyBmcm9tIHJ1bGUgXFxcIlwiICsgb3B0aW9ucy5zdGFydFJ1bGUgKyBcIlxcXCIuXCIpO1xuICAgICAgfVxuXG4gICAgICBwZWckc3RhcnRSdWxlRnVuY3Rpb24gPSBwZWckc3RhcnRSdWxlRnVuY3Rpb25zW29wdGlvbnMuc3RhcnRSdWxlXTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0ZXh0KCkge1xuICAgICAgcmV0dXJuIGlucHV0LnN1YnN0cmluZyhwZWckcmVwb3J0ZWRQb3MsIHBlZyRjdXJyUG9zKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvZmZzZXQoKSB7XG4gICAgICByZXR1cm4gcGVnJHJlcG9ydGVkUG9zO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpbmUoKSB7XG4gICAgICByZXR1cm4gcGVnJGNvbXB1dGVQb3NEZXRhaWxzKHBlZyRyZXBvcnRlZFBvcykubGluZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjb2x1bW4oKSB7XG4gICAgICByZXR1cm4gcGVnJGNvbXB1dGVQb3NEZXRhaWxzKHBlZyRyZXBvcnRlZFBvcykuY29sdW1uO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4cGVjdGVkKGRlc2NyaXB0aW9uKSB7XG4gICAgICB0aHJvdyBwZWckYnVpbGRFeGNlcHRpb24oXG4gICAgICAgIG51bGwsXG4gICAgICAgIFt7IHR5cGU6IFwib3RoZXJcIiwgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uIH1dLFxuICAgICAgICBwZWckcmVwb3J0ZWRQb3NcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZXJyb3IobWVzc2FnZSkge1xuICAgICAgdGhyb3cgcGVnJGJ1aWxkRXhjZXB0aW9uKG1lc3NhZ2UsIG51bGwsIHBlZyRyZXBvcnRlZFBvcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJGNvbXB1dGVQb3NEZXRhaWxzKHBvcykge1xuICAgICAgZnVuY3Rpb24gYWR2YW5jZShkZXRhaWxzLCBzdGFydFBvcywgZW5kUG9zKSB7XG4gICAgICAgIHZhciBwLCBjaDtcblxuICAgICAgICBmb3IgKHAgPSBzdGFydFBvczsgcCA8IGVuZFBvczsgcCsrKSB7XG4gICAgICAgICAgY2ggPSBpbnB1dC5jaGFyQXQocCk7XG4gICAgICAgICAgaWYgKGNoID09PSBcIlxcblwiKSB7XG4gICAgICAgICAgICBpZiAoIWRldGFpbHMuc2VlbkNSKSB7IGRldGFpbHMubGluZSsrOyB9XG4gICAgICAgICAgICBkZXRhaWxzLmNvbHVtbiA9IDE7XG4gICAgICAgICAgICBkZXRhaWxzLnNlZW5DUiA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT09IFwiXFxyXCIgfHwgY2ggPT09IFwiXFx1MjAyOFwiIHx8IGNoID09PSBcIlxcdTIwMjlcIikge1xuICAgICAgICAgICAgZGV0YWlscy5saW5lKys7XG4gICAgICAgICAgICBkZXRhaWxzLmNvbHVtbiA9IDE7XG4gICAgICAgICAgICBkZXRhaWxzLnNlZW5DUiA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRldGFpbHMuY29sdW1uKys7XG4gICAgICAgICAgICBkZXRhaWxzLnNlZW5DUiA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocGVnJGNhY2hlZFBvcyAhPT0gcG9zKSB7XG4gICAgICAgIGlmIChwZWckY2FjaGVkUG9zID4gcG9zKSB7XG4gICAgICAgICAgcGVnJGNhY2hlZFBvcyA9IDA7XG4gICAgICAgICAgcGVnJGNhY2hlZFBvc0RldGFpbHMgPSB7IGxpbmU6IDEsIGNvbHVtbjogMSwgc2VlbkNSOiBmYWxzZSB9O1xuICAgICAgICB9XG4gICAgICAgIGFkdmFuY2UocGVnJGNhY2hlZFBvc0RldGFpbHMsIHBlZyRjYWNoZWRQb3MsIHBvcyk7XG4gICAgICAgIHBlZyRjYWNoZWRQb3MgPSBwb3M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwZWckY2FjaGVkUG9zRGV0YWlscztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckZmFpbChleHBlY3RlZCkge1xuICAgICAgaWYgKHBlZyRjdXJyUG9zIDwgcGVnJG1heEZhaWxQb3MpIHsgcmV0dXJuOyB9XG5cbiAgICAgIGlmIChwZWckY3VyclBvcyA+IHBlZyRtYXhGYWlsUG9zKSB7XG4gICAgICAgIHBlZyRtYXhGYWlsUG9zID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHBlZyRtYXhGYWlsRXhwZWN0ZWQgPSBbXTtcbiAgICAgIH1cblxuICAgICAgcGVnJG1heEZhaWxFeHBlY3RlZC5wdXNoKGV4cGVjdGVkKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckYnVpbGRFeGNlcHRpb24obWVzc2FnZSwgZXhwZWN0ZWQsIHBvcykge1xuICAgICAgZnVuY3Rpb24gY2xlYW51cEV4cGVjdGVkKGV4cGVjdGVkKSB7XG4gICAgICAgIHZhciBpID0gMTtcblxuICAgICAgICBleHBlY3RlZC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgICBpZiAoYS5kZXNjcmlwdGlvbiA8IGIuZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGEuZGVzY3JpcHRpb24gPiBiLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB3aGlsZSAoaSA8IGV4cGVjdGVkLmxlbmd0aCkge1xuICAgICAgICAgIGlmIChleHBlY3RlZFtpIC0gMV0gPT09IGV4cGVjdGVkW2ldKSB7XG4gICAgICAgICAgICBleHBlY3RlZC5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gYnVpbGRNZXNzYWdlKGV4cGVjdGVkLCBmb3VuZCkge1xuICAgICAgICBmdW5jdGlvbiBzdHJpbmdFc2NhcGUocykge1xuICAgICAgICAgIGZ1bmN0aW9uIGhleChjaCkgeyByZXR1cm4gY2guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTsgfVxuXG4gICAgICAgICAgcmV0dXJuIHNcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcL2csICAgJ1xcXFxcXFxcJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cIi9nLCAgICAnXFxcXFwiJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXHgwOC9nLCAnXFxcXGInKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcdC9nLCAgICdcXFxcdCcpXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxuL2csICAgJ1xcXFxuJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXGYvZywgICAnXFxcXGYnKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcci9nLCAgICdcXFxccicpXG4gICAgICAgICAgICAucmVwbGFjZSgvW1xceDAwLVxceDA3XFx4MEJcXHgwRVxceDBGXS9nLCBmdW5jdGlvbihjaCkgeyByZXR1cm4gJ1xcXFx4MCcgKyBoZXgoY2gpOyB9KVxuICAgICAgICAgICAgLnJlcGxhY2UoL1tcXHgxMC1cXHgxRlxceDgwLVxceEZGXS9nLCAgICBmdW5jdGlvbihjaCkgeyByZXR1cm4gJ1xcXFx4JyAgKyBoZXgoY2gpOyB9KVxuICAgICAgICAgICAgLnJlcGxhY2UoL1tcXHUwMTgwLVxcdTBGRkZdL2csICAgICAgICAgZnVuY3Rpb24oY2gpIHsgcmV0dXJuICdcXFxcdTAnICsgaGV4KGNoKTsgfSlcbiAgICAgICAgICAgIC5yZXBsYWNlKC9bXFx1MTA4MC1cXHVGRkZGXS9nLCAgICAgICAgIGZ1bmN0aW9uKGNoKSB7IHJldHVybiAnXFxcXHUnICArIGhleChjaCk7IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGV4cGVjdGVkRGVzY3MgPSBuZXcgQXJyYXkoZXhwZWN0ZWQubGVuZ3RoKSxcbiAgICAgICAgICAgIGV4cGVjdGVkRGVzYywgZm91bmREZXNjLCBpO1xuXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGV4cGVjdGVkRGVzY3NbaV0gPSBleHBlY3RlZFtpXS5kZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGV4cGVjdGVkRGVzYyA9IGV4cGVjdGVkLmxlbmd0aCA+IDFcbiAgICAgICAgICA/IGV4cGVjdGVkRGVzY3Muc2xpY2UoMCwgLTEpLmpvaW4oXCIsIFwiKVxuICAgICAgICAgICAgICArIFwiIG9yIFwiXG4gICAgICAgICAgICAgICsgZXhwZWN0ZWREZXNjc1tleHBlY3RlZC5sZW5ndGggLSAxXVxuICAgICAgICAgIDogZXhwZWN0ZWREZXNjc1swXTtcblxuICAgICAgICBmb3VuZERlc2MgPSBmb3VuZCA/IFwiXFxcIlwiICsgc3RyaW5nRXNjYXBlKGZvdW5kKSArIFwiXFxcIlwiIDogXCJlbmQgb2YgaW5wdXRcIjtcblxuICAgICAgICByZXR1cm4gXCJFeHBlY3RlZCBcIiArIGV4cGVjdGVkRGVzYyArIFwiIGJ1dCBcIiArIGZvdW5kRGVzYyArIFwiIGZvdW5kLlwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgcG9zRGV0YWlscyA9IHBlZyRjb21wdXRlUG9zRGV0YWlscyhwb3MpLFxuICAgICAgICAgIGZvdW5kICAgICAgPSBwb3MgPCBpbnB1dC5sZW5ndGggPyBpbnB1dC5jaGFyQXQocG9zKSA6IG51bGw7XG5cbiAgICAgIGlmIChleHBlY3RlZCAhPT0gbnVsbCkge1xuICAgICAgICBjbGVhbnVwRXhwZWN0ZWQoZXhwZWN0ZWQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFN5bnRheEVycm9yKFxuICAgICAgICBtZXNzYWdlICE9PSBudWxsID8gbWVzc2FnZSA6IGJ1aWxkTWVzc2FnZShleHBlY3RlZCwgZm91bmQpLFxuICAgICAgICBleHBlY3RlZCxcbiAgICAgICAgZm91bmQsXG4gICAgICAgIHBvcyxcbiAgICAgICAgcG9zRGV0YWlscy5saW5lLFxuICAgICAgICBwb3NEZXRhaWxzLmNvbHVtblxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VzdGFydCgpIHtcbiAgICAgIHZhciBzMDtcblxuICAgICAgczAgPSBwZWckcGFyc2VtZXNzYWdlRm9ybWF0UGF0dGVybigpO1xuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlbWVzc2FnZUZvcm1hdFBhdHRlcm4oKSB7XG4gICAgICB2YXIgczAsIHMxLCBzMjtcblxuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIHMxID0gW107XG4gICAgICBzMiA9IHBlZyRwYXJzZW1lc3NhZ2VGb3JtYXRFbGVtZW50KCk7XG4gICAgICB3aGlsZSAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczEucHVzaChzMik7XG4gICAgICAgIHMyID0gcGVnJHBhcnNlbWVzc2FnZUZvcm1hdEVsZW1lbnQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckcmVwb3J0ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzEoczEpO1xuICAgICAgfVxuICAgICAgczAgPSBzMTtcblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZW1lc3NhZ2VGb3JtYXRFbGVtZW50KCkge1xuICAgICAgdmFyIHMwO1xuXG4gICAgICBzMCA9IHBlZyRwYXJzZW1lc3NhZ2VUZXh0RWxlbWVudCgpO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJHBhcnNlYXJndW1lbnRFbGVtZW50KCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VtZXNzYWdlVGV4dCgpIHtcbiAgICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1O1xuXG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgczEgPSBbXTtcbiAgICAgIHMyID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMyA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzNCA9IHBlZyRwYXJzZWNoYXJzKCk7XG4gICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM1ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczMgPSBbczMsIHM0LCBzNV07XG4gICAgICAgICAgICBzMiA9IHMzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMyO1xuICAgICAgICAgICAgczIgPSBwZWckYzI7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczI7XG4gICAgICAgICAgczIgPSBwZWckYzI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczI7XG4gICAgICAgIHMyID0gcGVnJGMyO1xuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHdoaWxlIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMxLnB1c2goczIpO1xuICAgICAgICAgIHMyID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgczMgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNCA9IHBlZyRwYXJzZWNoYXJzKCk7XG4gICAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczUgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHMzID0gW3MzLCBzNCwgczVdO1xuICAgICAgICAgICAgICAgIHMyID0gczM7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMjtcbiAgICAgICAgICAgICAgICBzMiA9IHBlZyRjMjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMjtcbiAgICAgICAgICAgICAgczIgPSBwZWckYzI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczI7XG4gICAgICAgICAgICBzMiA9IHBlZyRjMjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJGMyO1xuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRyZXBvcnRlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjMyhzMSk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIHMxID0gcGVnJHBhcnNld3MoKTtcbiAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczEgPSBpbnB1dC5zdWJzdHJpbmcoczAsIHBlZyRjdXJyUG9zKTtcbiAgICAgICAgfVxuICAgICAgICBzMCA9IHMxO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlbWVzc2FnZVRleHRFbGVtZW50KCkge1xuICAgICAgdmFyIHMwLCBzMTtcblxuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIHMxID0gcGVnJHBhcnNlbWVzc2FnZVRleHQoKTtcbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckcmVwb3J0ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzQoczEpO1xuICAgICAgfVxuICAgICAgczAgPSBzMTtcblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZWFyZ3VtZW50KCkge1xuICAgICAgdmFyIHMwLCBzMSwgczI7XG5cbiAgICAgIHMwID0gcGVnJHBhcnNlbnVtYmVyKCk7XG4gICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgczEgPSBbXTtcbiAgICAgICAgaWYgKHBlZyRjNS50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgICAgczIgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM2KTsgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHdoaWxlIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczEucHVzaChzMik7XG4gICAgICAgICAgICBpZiAocGVnJGM1LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgICAgICAgczIgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNik7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczEgPSBwZWckYzI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczEgPSBpbnB1dC5zdWJzdHJpbmcoczAsIHBlZyRjdXJyUG9zKTtcbiAgICAgICAgfVxuICAgICAgICBzMCA9IHMxO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlYXJndW1lbnRFbGVtZW50KCkge1xuICAgICAgdmFyIHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNywgczg7XG5cbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDEyMykge1xuICAgICAgICBzMSA9IHBlZyRjNztcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzgpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMzID0gcGVnJHBhcnNlYXJndW1lbnQoKTtcbiAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM1ID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDQpIHtcbiAgICAgICAgICAgICAgICBzNiA9IHBlZyRjMTA7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzNiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzExKTsgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgczggPSBwZWckcGFyc2VlbGVtZW50Rm9ybWF0KCk7XG4gICAgICAgICAgICAgICAgICBpZiAoczggIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgczYgPSBbczYsIHM3LCBzOF07XG4gICAgICAgICAgICAgICAgICAgIHM1ID0gczY7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHM1O1xuICAgICAgICAgICAgICAgICAgICBzNSA9IHBlZyRjMjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzNTtcbiAgICAgICAgICAgICAgICAgIHM1ID0gcGVnJGMyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHM1O1xuICAgICAgICAgICAgICAgIHM1ID0gcGVnJGMyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzNSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM1ID0gcGVnJGM5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAxMjUpIHtcbiAgICAgICAgICAgICAgICAgICAgczcgPSBwZWckYzEyO1xuICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgczcgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTMpOyB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJHJlcG9ydGVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgIHMxID0gcGVnJGMxNChzMywgczUpO1xuICAgICAgICAgICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VlbGVtZW50Rm9ybWF0KCkge1xuICAgICAgdmFyIHMwO1xuXG4gICAgICBzMCA9IHBlZyRwYXJzZXNpbXBsZUZvcm1hdCgpO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJHBhcnNlcGx1cmFsRm9ybWF0KCk7XG4gICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMwID0gcGVnJHBhcnNlc2VsZWN0T3JkaW5hbEZvcm1hdCgpO1xuICAgICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczAgPSBwZWckcGFyc2VzZWxlY3RGb3JtYXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZXNpbXBsZUZvcm1hdCgpIHtcbiAgICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNjtcblxuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDYpID09PSBwZWckYzE1KSB7XG4gICAgICAgIHMxID0gcGVnJGMxNTtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gNjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE2KTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDQpID09PSBwZWckYzE3KSB7XG4gICAgICAgICAgczEgPSBwZWckYzE3O1xuICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxOCk7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoczEgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA0KSA9PT0gcGVnJGMxOSkge1xuICAgICAgICAgICAgczEgPSBwZWckYzE5O1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gNDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzIwKTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMyA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDQpIHtcbiAgICAgICAgICAgIHM0ID0gcGVnJGMxMDtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMSk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNSA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNiA9IHBlZyRwYXJzZWNoYXJzKCk7XG4gICAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM0ID0gW3M0LCBzNSwgczZdO1xuICAgICAgICAgICAgICAgIHMzID0gczQ7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgICBzMyA9IHBlZyRjMjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgczMgPSBwZWckYzI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICBzMyA9IHBlZyRjMjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMzID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzMyA9IHBlZyRjOTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBwZWckcmVwb3J0ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgIHMxID0gcGVnJGMyMShzMSwgczMpO1xuICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZXBsdXJhbEZvcm1hdCgpIHtcbiAgICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1O1xuXG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LnN1YnN0cihwZWckY3VyclBvcywgNikgPT09IHBlZyRjMjIpIHtcbiAgICAgICAgczEgPSBwZWckYzIyO1xuICAgICAgICBwZWckY3VyclBvcyArPSA2O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMjMpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDQpIHtcbiAgICAgICAgICAgIHMzID0gcGVnJGMxMDtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMSk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNSA9IHBlZyRwYXJzZXBsdXJhbFN0eWxlKCk7XG4gICAgICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHBlZyRyZXBvcnRlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMxID0gcGVnJGMyNChzNSk7XG4gICAgICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZXNlbGVjdE9yZGluYWxGb3JtYXQoKSB7XG4gICAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0LCBzNTtcblxuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDEzKSA9PT0gcGVnJGMyNSkge1xuICAgICAgICBzMSA9IHBlZyRjMjU7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDEzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMjYpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDQpIHtcbiAgICAgICAgICAgIHMzID0gcGVnJGMxMDtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMSk7IH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNSA9IHBlZyRwYXJzZXBsdXJhbFN0eWxlKCk7XG4gICAgICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHBlZyRyZXBvcnRlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMxID0gcGVnJGMyNyhzNSk7XG4gICAgICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZXNlbGVjdEZvcm1hdCgpIHtcbiAgICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNjtcblxuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDYpID09PSBwZWckYzI4KSB7XG4gICAgICAgIHMxID0gcGVnJGMyODtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gNjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzI5KTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ0KSB7XG4gICAgICAgICAgICBzMyA9IHBlZyRjMTA7XG4gICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTEpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczUgPSBbXTtcbiAgICAgICAgICAgICAgczYgPSBwZWckcGFyc2VvcHRpb25hbEZvcm1hdFBhdHRlcm4oKTtcbiAgICAgICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICBzNS5wdXNoKHM2KTtcbiAgICAgICAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlb3B0aW9uYWxGb3JtYXRQYXR0ZXJuKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHM1ID0gcGVnJGMyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHBlZyRyZXBvcnRlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMxID0gcGVnJGMzMChzNSk7XG4gICAgICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZXNlbGVjdG9yKCkge1xuICAgICAgdmFyIHMwLCBzMSwgczIsIHMzO1xuXG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgczEgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNjEpIHtcbiAgICAgICAgczIgPSBwZWckYzMxO1xuICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMzIpOyB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2VudW1iZXIoKTtcbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczIgPSBbczIsIHMzXTtcbiAgICAgICAgICBzMSA9IHMyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczE7XG4gICAgICAgICAgczEgPSBwZWckYzI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczE7XG4gICAgICAgIHMxID0gcGVnJGMyO1xuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMxID0gaW5wdXQuc3Vic3RyaW5nKHMwLCBwZWckY3VyclBvcyk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJHBhcnNlY2hhcnMoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZW9wdGlvbmFsRm9ybWF0UGF0dGVybigpIHtcbiAgICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1LCBzNiwgczcsIHM4O1xuXG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgczEgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIgPSBwZWckcGFyc2VzZWxlY3RvcigpO1xuICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMyA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMTIzKSB7XG4gICAgICAgICAgICAgIHM0ID0gcGVnJGM3O1xuICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjOCk7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzNSA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgczYgPSBwZWckcGFyc2VtZXNzYWdlRm9ybWF0UGF0dGVybigpO1xuICAgICAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgczcgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAxMjUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzOCA9IHBlZyRjMTI7XG4gICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBzOCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEzKTsgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzOCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgIHBlZyRyZXBvcnRlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgIHMxID0gcGVnJGMzMyhzMiwgczYpO1xuICAgICAgICAgICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VvZmZzZXQoKSB7XG4gICAgICB2YXIgczAsIHMxLCBzMiwgczM7XG5cbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA3KSA9PT0gcGVnJGMzNCkge1xuICAgICAgICBzMSA9IHBlZyRjMzQ7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMzNSk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczMgPSBwZWckcGFyc2VudW1iZXIoKTtcbiAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHBlZyRyZXBvcnRlZFBvcyA9IHMwO1xuICAgICAgICAgICAgczEgPSBwZWckYzM2KHMzKTtcbiAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VwbHVyYWxTdHlsZSgpIHtcbiAgICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQ7XG5cbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMSA9IHBlZyRwYXJzZW9mZnNldCgpO1xuICAgICAgaWYgKHMxID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMxID0gcGVnJGM5O1xuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gcGVnJHBhcnNlXygpO1xuICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMyA9IFtdO1xuICAgICAgICAgIHM0ID0gcGVnJHBhcnNlb3B0aW9uYWxGb3JtYXRQYXR0ZXJuKCk7XG4gICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICB3aGlsZSAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczMucHVzaChzNCk7XG4gICAgICAgICAgICAgIHM0ID0gcGVnJHBhcnNlb3B0aW9uYWxGb3JtYXRQYXR0ZXJuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMzID0gcGVnJGMyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHBlZyRyZXBvcnRlZFBvcyA9IHMwO1xuICAgICAgICAgICAgczEgPSBwZWckYzM3KHMxLCBzMyk7XG4gICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckYzI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNld3MoKSB7XG4gICAgICB2YXIgczAsIHMxO1xuXG4gICAgICBwZWckc2lsZW50RmFpbHMrKztcbiAgICAgIHMwID0gW107XG4gICAgICBpZiAocGVnJGMzOS50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQwKTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHdoaWxlIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMwLnB1c2goczEpO1xuICAgICAgICAgIGlmIChwZWckYzM5LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgICAgIHMxID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM0MCk7IH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgfVxuICAgICAgcGVnJHNpbGVudEZhaWxzLS07XG4gICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMzgpOyB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VfKCkge1xuICAgICAgdmFyIHMwLCBzMSwgczI7XG5cbiAgICAgIHBlZyRzaWxlbnRGYWlscysrO1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIHMxID0gW107XG4gICAgICBzMiA9IHBlZyRwYXJzZXdzKCk7XG4gICAgICB3aGlsZSAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczEucHVzaChzMik7XG4gICAgICAgIHMyID0gcGVnJHBhcnNld3MoKTtcbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMSA9IGlucHV0LnN1YnN0cmluZyhzMCwgcGVnJGN1cnJQb3MpO1xuICAgICAgfVxuICAgICAgczAgPSBzMTtcbiAgICAgIHBlZyRzaWxlbnRGYWlscy0tO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQxKTsgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlZGlnaXQoKSB7XG4gICAgICB2YXIgczA7XG5cbiAgICAgIGlmIChwZWckYzQyLnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgczAgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNDMpOyB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwZWckcGFyc2VoZXhEaWdpdCgpIHtcbiAgICAgIHZhciBzMDtcblxuICAgICAgaWYgKHBlZyRjNDQudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICBzMCA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM0NSk7IH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZW51bWJlcigpIHtcbiAgICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1O1xuXG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0OCkge1xuICAgICAgICBzMSA9IHBlZyRjNDY7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM0Nyk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMSA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzMiA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBpZiAocGVnJGM0OC50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgICAgczMgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM0OSk7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNCA9IFtdO1xuICAgICAgICAgIHM1ID0gcGVnJHBhcnNlZGlnaXQoKTtcbiAgICAgICAgICB3aGlsZSAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM0LnB1c2goczUpO1xuICAgICAgICAgICAgczUgPSBwZWckcGFyc2VkaWdpdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHMzID0gW3MzLCBzNF07XG4gICAgICAgICAgICBzMiA9IHMzO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMyO1xuICAgICAgICAgICAgczIgPSBwZWckYzI7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczI7XG4gICAgICAgICAgczIgPSBwZWckYzI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczIgPSBpbnB1dC5zdWJzdHJpbmcoczEsIHBlZyRjdXJyUG9zKTtcbiAgICAgICAgfVxuICAgICAgICBzMSA9IHMyO1xuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRyZXBvcnRlZFBvcyA9IHMwO1xuICAgICAgICBzMSA9IHBlZyRjNTAoczEpO1xuICAgICAgfVxuICAgICAgczAgPSBzMTtcblxuICAgICAgcmV0dXJuIHMwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBlZyRwYXJzZWNoYXIoKSB7XG4gICAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3O1xuXG4gICAgICBpZiAocGVnJGM1MS50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgIHMwID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzUyKTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzUzKSB7XG4gICAgICAgICAgczEgPSBwZWckYzUzO1xuICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM1NCk7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckcmVwb3J0ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjNTUoKTtcbiAgICAgICAgfVxuICAgICAgICBzMCA9IHMxO1xuICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzU2KSB7XG4gICAgICAgICAgICBzMSA9IHBlZyRjNTY7XG4gICAgICAgICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNTcpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHJlcG9ydGVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjNTgoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGM1OSkge1xuICAgICAgICAgICAgICBzMSA9IHBlZyRjNTk7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM2MCk7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBwZWckcmVwb3J0ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczEgPSBwZWckYzYxKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzYyKSB7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckYzYyO1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM2Myk7IH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBwZWckcmVwb3J0ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMSA9IHBlZyRjNjQoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzY1KSB7XG4gICAgICAgICAgICAgICAgICBzMSA9IHBlZyRjNjU7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNjYpOyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgczIgPSBwZWckY3VyclBvcztcbiAgICAgICAgICAgICAgICAgIHMzID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgICAgICAgICBzNCA9IHBlZyRwYXJzZWhleERpZ2l0KCk7XG4gICAgICAgICAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgczUgPSBwZWckcGFyc2VoZXhEaWdpdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzNiA9IHBlZyRwYXJzZWhleERpZ2l0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHM2ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzNyA9IHBlZyRwYXJzZWhleERpZ2l0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgczQgPSBbczQsIHM1LCBzNiwgczddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzMyA9IHM0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgczMgPSBwZWckYzI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczM7XG4gICAgICAgICAgICAgICAgICAgICAgICBzMyA9IHBlZyRjMjtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgICAgICAgICBzMyA9IHBlZyRjMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMztcbiAgICAgICAgICAgICAgICAgICAgczMgPSBwZWckYzI7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgczMgPSBpbnB1dC5zdWJzdHJpbmcoczIsIHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHMyID0gczM7XG4gICAgICAgICAgICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJHJlcG9ydGVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgIHMxID0gcGVnJGM2NyhzMik7XG4gICAgICAgICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICBzMCA9IHBlZyRjMjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgIHMwID0gcGVnJGMyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGVnJHBhcnNlY2hhcnMoKSB7XG4gICAgICB2YXIgczAsIHMxLCBzMjtcblxuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIHMxID0gW107XG4gICAgICBzMiA9IHBlZyRwYXJzZWNoYXIoKTtcbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICB3aGlsZSAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMS5wdXNoKHMyKTtcbiAgICAgICAgICBzMiA9IHBlZyRwYXJzZWNoYXIoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczEgPSBwZWckYzI7XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHJlcG9ydGVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGM2OChzMSk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuXG4gICAgICByZXR1cm4gczA7XG4gICAgfVxuXG4gICAgcGVnJHJlc3VsdCA9IHBlZyRzdGFydFJ1bGVGdW5jdGlvbigpO1xuXG4gICAgaWYgKHBlZyRyZXN1bHQgIT09IHBlZyRGQUlMRUQgJiYgcGVnJGN1cnJQb3MgPT09IGlucHV0Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHBlZyRyZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwZWckcmVzdWx0ICE9PSBwZWckRkFJTEVEICYmIHBlZyRjdXJyUG9zIDwgaW5wdXQubGVuZ3RoKSB7XG4gICAgICAgIHBlZyRmYWlsKHsgdHlwZTogXCJlbmRcIiwgZGVzY3JpcHRpb246IFwiZW5kIG9mIGlucHV0XCIgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IHBlZyRidWlsZEV4Y2VwdGlvbihudWxsLCBwZWckbWF4RmFpbEV4cGVjdGVkLCBwZWckbWF4RmFpbFBvcyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBTeW50YXhFcnJvcjogU3ludGF4RXJyb3IsXG4gICAgcGFyc2U6ICAgICAgIHBhcnNlXG4gIH07XG59KSgpO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1wYXJzZXIuanMubWFwIiwiLyoganNoaW50IG5vZGU6dHJ1ZSAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBJbnRsTWVzc2FnZUZvcm1hdCA9IHJlcXVpcmUoJy4vbGliL21haW4nKVsnZGVmYXVsdCddO1xuXG4vLyBBZGQgYWxsIGxvY2FsZSBkYXRhIHRvIGBJbnRsTWVzc2FnZUZvcm1hdGAuIFRoaXMgbW9kdWxlIHdpbGwgYmUgaWdub3JlZCB3aGVuXG4vLyBidW5kbGluZyBmb3IgdGhlIGJyb3dzZXIgd2l0aCBCcm93c2VyaWZ5L1dlYnBhY2suXG5yZXF1aXJlKCcuL2xpYi9sb2NhbGVzJyk7XG5cbi8vIFJlLWV4cG9ydCBgSW50bE1lc3NhZ2VGb3JtYXRgIGFzIHRoZSBDb21tb25KUyBkZWZhdWx0IGV4cG9ydHMgd2l0aCBhbGwgdGhlXG4vLyBsb2NhbGUgZGF0YSByZWdpc3RlcmVkLCBhbmQgd2l0aCBFbmdsaXNoIHNldCBhcyB0aGUgZGVmYXVsdCBsb2NhbGUuIERlZmluZVxuLy8gdGhlIGBkZWZhdWx0YCBwcm9wIGZvciB1c2Ugd2l0aCBvdGhlciBjb21waWxlZCBFUzYgTW9kdWxlcy5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IEludGxNZXNzYWdlRm9ybWF0O1xuZXhwb3J0c1snZGVmYXVsdCddID0gZXhwb3J0cztcbiIsIi8qXG5Db3B5cmlnaHQgKGMpIDIwMTQsIFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5Db3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG5TZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuKi9cblxuLyoganNsaW50IGVzbmV4dDogdHJ1ZSAqL1xuXG5cInVzZSBzdHJpY3RcIjtcbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gQ29tcGlsZXI7XG5cbmZ1bmN0aW9uIENvbXBpbGVyKGxvY2FsZXMsIGZvcm1hdHMsIHBsdXJhbEZuKSB7XG4gICAgdGhpcy5sb2NhbGVzICA9IGxvY2FsZXM7XG4gICAgdGhpcy5mb3JtYXRzICA9IGZvcm1hdHM7XG4gICAgdGhpcy5wbHVyYWxGbiA9IHBsdXJhbEZuO1xufVxuXG5Db21waWxlci5wcm90b3R5cGUuY29tcGlsZSA9IGZ1bmN0aW9uIChhc3QpIHtcbiAgICB0aGlzLnBsdXJhbFN0YWNrICAgICAgICA9IFtdO1xuICAgIHRoaXMuY3VycmVudFBsdXJhbCAgICAgID0gbnVsbDtcbiAgICB0aGlzLnBsdXJhbE51bWJlckZvcm1hdCA9IG51bGw7XG5cbiAgICByZXR1cm4gdGhpcy5jb21waWxlTWVzc2FnZShhc3QpO1xufTtcblxuQ29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGVNZXNzYWdlID0gZnVuY3Rpb24gKGFzdCkge1xuICAgIGlmICghKGFzdCAmJiBhc3QudHlwZSA9PT0gJ21lc3NhZ2VGb3JtYXRQYXR0ZXJuJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXNzYWdlIEFTVCBpcyBub3Qgb2YgdHlwZTogXCJtZXNzYWdlRm9ybWF0UGF0dGVyblwiJyk7XG4gICAgfVxuXG4gICAgdmFyIGVsZW1lbnRzID0gYXN0LmVsZW1lbnRzLFxuICAgICAgICBwYXR0ZXJuICA9IFtdO1xuXG4gICAgdmFyIGksIGxlbiwgZWxlbWVudDtcblxuICAgIGZvciAoaSA9IDAsIGxlbiA9IGVsZW1lbnRzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50c1tpXTtcblxuICAgICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZVRleHRFbGVtZW50JzpcbiAgICAgICAgICAgICAgICBwYXR0ZXJuLnB1c2godGhpcy5jb21waWxlTWVzc2FnZVRleHQoZWxlbWVudCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdhcmd1bWVudEVsZW1lbnQnOlxuICAgICAgICAgICAgICAgIHBhdHRlcm4ucHVzaCh0aGlzLmNvbXBpbGVBcmd1bWVudChlbGVtZW50KSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXNzYWdlIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIHR5cGUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXR0ZXJuO1xufTtcblxuQ29tcGlsZXIucHJvdG90eXBlLmNvbXBpbGVNZXNzYWdlVGV4dCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgLy8gV2hlbiB0aGlzIGBlbGVtZW50YCBpcyBwYXJ0IG9mIHBsdXJhbCBzdWItcGF0dGVybiBhbmQgaXRzIHZhbHVlIGNvbnRhaW5zXG4gICAgLy8gYW4gdW5lc2NhcGVkICcjJywgdXNlIGEgYFBsdXJhbE9mZnNldFN0cmluZ2AgaGVscGVyIHRvIHByb3Blcmx5IG91dHB1dFxuICAgIC8vIHRoZSBudW1iZXIgd2l0aCB0aGUgY29ycmVjdCBvZmZzZXQgaW4gdGhlIHN0cmluZy5cbiAgICBpZiAodGhpcy5jdXJyZW50UGx1cmFsICYmIC8oXnxbXlxcXFxdKSMvZy50ZXN0KGVsZW1lbnQudmFsdWUpKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIGNhY2hlIGEgTnVtYmVyRm9ybWF0IGluc3RhbmNlIHRoYXQgY2FuIGJlIHJldXNlZCBmb3IgYW55XG4gICAgICAgIC8vIFBsdXJhbE9mZnNldFN0cmluZyBpbnN0YW5jZSBpbiB0aGlzIG1lc3NhZ2UuXG4gICAgICAgIGlmICghdGhpcy5wbHVyYWxOdW1iZXJGb3JtYXQpIHtcbiAgICAgICAgICAgIHRoaXMucGx1cmFsTnVtYmVyRm9ybWF0ID0gbmV3IEludGwuTnVtYmVyRm9ybWF0KHRoaXMubG9jYWxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFBsdXJhbE9mZnNldFN0cmluZyhcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRQbHVyYWwuaWQsXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50UGx1cmFsLmZvcm1hdC5vZmZzZXQsXG4gICAgICAgICAgICAgICAgdGhpcy5wbHVyYWxOdW1iZXJGb3JtYXQsXG4gICAgICAgICAgICAgICAgZWxlbWVudC52YWx1ZSk7XG4gICAgfVxuXG4gICAgLy8gVW5lc2NhcGUgdGhlIGVzY2FwZWQgJyMncyBpbiB0aGUgbWVzc2FnZSB0ZXh0LlxuICAgIHJldHVybiBlbGVtZW50LnZhbHVlLnJlcGxhY2UoL1xcXFwjL2csICcjJyk7XG59O1xuXG5Db21waWxlci5wcm90b3R5cGUuY29tcGlsZUFyZ3VtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICB2YXIgZm9ybWF0ID0gZWxlbWVudC5mb3JtYXQ7XG5cbiAgICBpZiAoIWZvcm1hdCkge1xuICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0Zvcm1hdChlbGVtZW50LmlkKTtcbiAgICB9XG5cbiAgICB2YXIgZm9ybWF0cyAgPSB0aGlzLmZvcm1hdHMsXG4gICAgICAgIGxvY2FsZXMgID0gdGhpcy5sb2NhbGVzLFxuICAgICAgICBwbHVyYWxGbiA9IHRoaXMucGx1cmFsRm4sXG4gICAgICAgIG9wdGlvbnM7XG5cbiAgICBzd2l0Y2ggKGZvcm1hdC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ251bWJlckZvcm1hdCc6XG4gICAgICAgICAgICBvcHRpb25zID0gZm9ybWF0cy5udW1iZXJbZm9ybWF0LnN0eWxlXTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWQgICAgOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgIGZvcm1hdDogbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY2FsZXMsIG9wdGlvbnMpLmZvcm1hdFxuICAgICAgICAgICAgfTtcblxuICAgICAgICBjYXNlICdkYXRlRm9ybWF0JzpcbiAgICAgICAgICAgIG9wdGlvbnMgPSBmb3JtYXRzLmRhdGVbZm9ybWF0LnN0eWxlXTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaWQgICAgOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgIGZvcm1hdDogbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlcywgb3B0aW9ucykuZm9ybWF0XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIGNhc2UgJ3RpbWVGb3JtYXQnOlxuICAgICAgICAgICAgb3B0aW9ucyA9IGZvcm1hdHMudGltZVtmb3JtYXQuc3R5bGVdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpZCAgICA6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgZm9ybWF0OiBuZXcgSW50bC5EYXRlVGltZUZvcm1hdChsb2NhbGVzLCBvcHRpb25zKS5mb3JtYXRcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgY2FzZSAncGx1cmFsRm9ybWF0JzpcbiAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLmNvbXBpbGVPcHRpb25zKGVsZW1lbnQpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQbHVyYWxGb3JtYXQoXG4gICAgICAgICAgICAgICAgZWxlbWVudC5pZCwgZm9ybWF0Lm9yZGluYWwsIGZvcm1hdC5vZmZzZXQsIG9wdGlvbnMsIHBsdXJhbEZuXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGNhc2UgJ3NlbGVjdEZvcm1hdCc6XG4gICAgICAgICAgICBvcHRpb25zID0gdGhpcy5jb21waWxlT3B0aW9ucyhlbGVtZW50KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0Rm9ybWF0KGVsZW1lbnQuaWQsIG9wdGlvbnMpO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2UgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgZm9ybWF0IHR5cGUnKTtcbiAgICB9XG59O1xuXG5Db21waWxlci5wcm90b3R5cGUuY29tcGlsZU9wdGlvbnMgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIHZhciBmb3JtYXQgICAgICA9IGVsZW1lbnQuZm9ybWF0LFxuICAgICAgICBvcHRpb25zICAgICA9IGZvcm1hdC5vcHRpb25zLFxuICAgICAgICBvcHRpb25zSGFzaCA9IHt9O1xuXG4gICAgLy8gU2F2ZSB0aGUgY3VycmVudCBwbHVyYWwgZWxlbWVudCwgaWYgYW55LCB0aGVuIHNldCBpdCB0byBhIG5ldyB2YWx1ZSB3aGVuXG4gICAgLy8gY29tcGlsaW5nIHRoZSBvcHRpb25zIHN1Yi1wYXR0ZXJucy4gVGhpcyBjb25mb3JtcyB0aGUgc3BlYydzIGFsZ29yaXRobVxuICAgIC8vIGZvciBoYW5kbGluZyBgXCIjXCJgIHN5bnRheCBpbiBtZXNzYWdlIHRleHQuXG4gICAgdGhpcy5wbHVyYWxTdGFjay5wdXNoKHRoaXMuY3VycmVudFBsdXJhbCk7XG4gICAgdGhpcy5jdXJyZW50UGx1cmFsID0gZm9ybWF0LnR5cGUgPT09ICdwbHVyYWxGb3JtYXQnID8gZWxlbWVudCA6IG51bGw7XG5cbiAgICB2YXIgaSwgbGVuLCBvcHRpb247XG5cbiAgICBmb3IgKGkgPSAwLCBsZW4gPSBvcHRpb25zLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIG9wdGlvbiA9IG9wdGlvbnNbaV07XG5cbiAgICAgICAgLy8gQ29tcGlsZSB0aGUgc3ViLXBhdHRlcm4gYW5kIHNhdmUgaXQgdW5kZXIgdGhlIG9wdGlvbnMncyBzZWxlY3Rvci5cbiAgICAgICAgb3B0aW9uc0hhc2hbb3B0aW9uLnNlbGVjdG9yXSA9IHRoaXMuY29tcGlsZU1lc3NhZ2Uob3B0aW9uLnZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBQb3AgdGhlIHBsdXJhbCBzdGFjayB0byBwdXQgYmFjayB0aGUgb3JpZ2luYWwgY3VycmVudCBwbHVyYWwgdmFsdWUuXG4gICAgdGhpcy5jdXJyZW50UGx1cmFsID0gdGhpcy5wbHVyYWxTdGFjay5wb3AoKTtcblxuICAgIHJldHVybiBvcHRpb25zSGFzaDtcbn07XG5cbi8vIC0tIENvbXBpbGVyIEhlbHBlciBDbGFzc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIFN0cmluZ0Zvcm1hdChpZCkge1xuICAgIHRoaXMuaWQgPSBpZDtcbn1cblxuU3RyaW5nRm9ybWF0LnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogU3RyaW5nKHZhbHVlKTtcbn07XG5cbmZ1bmN0aW9uIFBsdXJhbEZvcm1hdChpZCwgdXNlT3JkaW5hbCwgb2Zmc2V0LCBvcHRpb25zLCBwbHVyYWxGbikge1xuICAgIHRoaXMuaWQgICAgICAgICA9IGlkO1xuICAgIHRoaXMudXNlT3JkaW5hbCA9IHVzZU9yZGluYWw7XG4gICAgdGhpcy5vZmZzZXQgICAgID0gb2Zmc2V0O1xuICAgIHRoaXMub3B0aW9ucyAgICA9IG9wdGlvbnM7XG4gICAgdGhpcy5wbHVyYWxGbiAgID0gcGx1cmFsRm47XG59XG5cblBsdXJhbEZvcm1hdC5wcm90b3R5cGUuZ2V0T3B0aW9uID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICB2YXIgb3B0aW9uID0gb3B0aW9uc1snPScgKyB2YWx1ZV0gfHxcbiAgICAgICAgICAgIG9wdGlvbnNbdGhpcy5wbHVyYWxGbih2YWx1ZSAtIHRoaXMub2Zmc2V0LCB0aGlzLnVzZU9yZGluYWwpXTtcblxuICAgIHJldHVybiBvcHRpb24gfHwgb3B0aW9ucy5vdGhlcjtcbn07XG5cbmZ1bmN0aW9uIFBsdXJhbE9mZnNldFN0cmluZyhpZCwgb2Zmc2V0LCBudW1iZXJGb3JtYXQsIHN0cmluZykge1xuICAgIHRoaXMuaWQgICAgICAgICAgID0gaWQ7XG4gICAgdGhpcy5vZmZzZXQgICAgICAgPSBvZmZzZXQ7XG4gICAgdGhpcy5udW1iZXJGb3JtYXQgPSBudW1iZXJGb3JtYXQ7XG4gICAgdGhpcy5zdHJpbmcgICAgICAgPSBzdHJpbmc7XG59XG5cblBsdXJhbE9mZnNldFN0cmluZy5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgdmFyIG51bWJlciA9IHRoaXMubnVtYmVyRm9ybWF0LmZvcm1hdCh2YWx1ZSAtIHRoaXMub2Zmc2V0KTtcblxuICAgIHJldHVybiB0aGlzLnN0cmluZ1xuICAgICAgICAgICAgLnJlcGxhY2UoLyhefFteXFxcXF0pIy9nLCAnJDEnICsgbnVtYmVyKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFwjL2csICcjJyk7XG59O1xuXG5mdW5jdGlvbiBTZWxlY3RGb3JtYXQoaWQsIG9wdGlvbnMpIHtcbiAgICB0aGlzLmlkICAgICAgPSBpZDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xufVxuXG5TZWxlY3RGb3JtYXQucHJvdG90eXBlLmdldE9wdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgIHJldHVybiBvcHRpb25zW3ZhbHVlXSB8fCBvcHRpb25zLm90aGVyO1xufTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29tcGlsZXIuanMubWFwIiwiLypcbkNvcHlyaWdodCAoYykgMjAxNCwgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkNvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cblNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4qL1xuXG4vKiBqc2xpbnQgZXNuZXh0OiB0cnVlICovXG5cblwidXNlIHN0cmljdFwiO1xudmFyIHNyYyR1dGlscyQkID0gcmVxdWlyZShcIi4vdXRpbHNcIiksIHNyYyRlczUkJCA9IHJlcXVpcmUoXCIuL2VzNVwiKSwgc3JjJGNvbXBpbGVyJCQgPSByZXF1aXJlKFwiLi9jb21waWxlclwiKSwgaW50bCRtZXNzYWdlZm9ybWF0JHBhcnNlciQkID0gcmVxdWlyZShcImludGwtbWVzc2FnZWZvcm1hdC1wYXJzZXJcIik7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IE1lc3NhZ2VGb3JtYXQ7XG5cbi8vIC0tIE1lc3NhZ2VGb3JtYXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gTWVzc2FnZUZvcm1hdChtZXNzYWdlLCBsb2NhbGVzLCBmb3JtYXRzKSB7XG4gICAgLy8gUGFyc2Ugc3RyaW5nIG1lc3NhZ2VzIGludG8gYW4gQVNULlxuICAgIHZhciBhc3QgPSB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgICAgTWVzc2FnZUZvcm1hdC5fX3BhcnNlKG1lc3NhZ2UpIDogbWVzc2FnZTtcblxuICAgIGlmICghKGFzdCAmJiBhc3QudHlwZSA9PT0gJ21lc3NhZ2VGb3JtYXRQYXR0ZXJuJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQSBtZXNzYWdlIG11c3QgYmUgcHJvdmlkZWQgYXMgYSBTdHJpbmcgb3IgQVNULicpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZXMgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBgZm9ybWF0c2AgbWVyZ2VkIHdpdGggdGhlIGRlZmF1bHRcbiAgICAvLyBmb3JtYXRzLlxuICAgIGZvcm1hdHMgPSB0aGlzLl9tZXJnZUZvcm1hdHMoTWVzc2FnZUZvcm1hdC5mb3JtYXRzLCBmb3JtYXRzKTtcblxuICAgIC8vIERlZmluZWQgZmlyc3QgYmVjYXVzZSBpdCdzIHVzZWQgdG8gYnVpbGQgdGhlIGZvcm1hdCBwYXR0ZXJuLlxuICAgIHNyYyRlczUkJC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX2xvY2FsZScsICB7dmFsdWU6IHRoaXMuX3Jlc29sdmVMb2NhbGUobG9jYWxlcyl9KTtcblxuICAgIC8vIENvbXBpbGUgdGhlIGBhc3RgIHRvIGEgcGF0dGVybiB0aGF0IGlzIGhpZ2hseSBvcHRpbWl6ZWQgZm9yIHJlcGVhdGVkXG4gICAgLy8gYGZvcm1hdCgpYCBpbnZvY2F0aW9ucy4gKipOb3RlOioqIFRoaXMgcGFzc2VzIHRoZSBgbG9jYWxlc2Agc2V0IHByb3ZpZGVkXG4gICAgLy8gdG8gdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQgb2YganVzdCB0aGUgcmVzb2x2ZWQgbG9jYWxlLlxuICAgIHZhciBwbHVyYWxGbiA9IHRoaXMuX2ZpbmRQbHVyYWxSdWxlRnVuY3Rpb24odGhpcy5fbG9jYWxlKTtcbiAgICB2YXIgcGF0dGVybiAgPSB0aGlzLl9jb21waWxlUGF0dGVybihhc3QsIGxvY2FsZXMsIGZvcm1hdHMsIHBsdXJhbEZuKTtcblxuICAgIC8vIFwiQmluZFwiIGBmb3JtYXQoKWAgbWV0aG9kIHRvIGB0aGlzYCBzbyBpdCBjYW4gYmUgcGFzc2VkIGJ5IHJlZmVyZW5jZSBsaWtlXG4gICAgLy8gdGhlIG90aGVyIGBJbnRsYCBBUElzLlxuICAgIHZhciBtZXNzYWdlRm9ybWF0ID0gdGhpcztcbiAgICB0aGlzLmZvcm1hdCA9IGZ1bmN0aW9uICh2YWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VGb3JtYXQuX2Zvcm1hdChwYXR0ZXJuLCB2YWx1ZXMpO1xuICAgIH07XG59XG5cbi8vIERlZmF1bHQgZm9ybWF0IG9wdGlvbnMgdXNlZCBhcyB0aGUgcHJvdG90eXBlIG9mIHRoZSBgZm9ybWF0c2AgcHJvdmlkZWQgdG8gdGhlXG4vLyBjb25zdHJ1Y3Rvci4gVGhlc2UgYXJlIHVzZWQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGludGVybmFsIEludGwuTnVtYmVyRm9ybWF0XG4vLyBhbmQgSW50bC5EYXRlVGltZUZvcm1hdCBpbnN0YW5jZXMuXG5zcmMkZXM1JCQuZGVmaW5lUHJvcGVydHkoTWVzc2FnZUZvcm1hdCwgJ2Zvcm1hdHMnLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcblxuICAgIHZhbHVlOiB7XG4gICAgICAgIG51bWJlcjoge1xuICAgICAgICAgICAgJ2N1cnJlbmN5Jzoge1xuICAgICAgICAgICAgICAgIHN0eWxlOiAnY3VycmVuY3knXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAncGVyY2VudCc6IHtcbiAgICAgICAgICAgICAgICBzdHlsZTogJ3BlcmNlbnQnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgJ3Nob3J0Jzoge1xuICAgICAgICAgICAgICAgIG1vbnRoOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgZGF5ICA6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICB5ZWFyIDogJzItZGlnaXQnXG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAnbWVkaXVtJzoge1xuICAgICAgICAgICAgICAgIG1vbnRoOiAnc2hvcnQnLFxuICAgICAgICAgICAgICAgIGRheSAgOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgeWVhciA6ICdudW1lcmljJ1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgJ2xvbmcnOiB7XG4gICAgICAgICAgICAgICAgbW9udGg6ICdsb25nJyxcbiAgICAgICAgICAgICAgICBkYXkgIDogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIHllYXIgOiAnbnVtZXJpYydcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICdmdWxsJzoge1xuICAgICAgICAgICAgICAgIHdlZWtkYXk6ICdsb25nJyxcbiAgICAgICAgICAgICAgICBtb250aCAgOiAnbG9uZycsXG4gICAgICAgICAgICAgICAgZGF5ICAgIDogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIHllYXIgICA6ICdudW1lcmljJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIHRpbWU6IHtcbiAgICAgICAgICAgICdzaG9ydCc6IHtcbiAgICAgICAgICAgICAgICBob3VyICA6ICdudW1lcmljJyxcbiAgICAgICAgICAgICAgICBtaW51dGU6ICdudW1lcmljJ1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgJ21lZGl1bSc6ICB7XG4gICAgICAgICAgICAgICAgaG91ciAgOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgbWludXRlOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgc2Vjb25kOiAnbnVtZXJpYydcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICdsb25nJzoge1xuICAgICAgICAgICAgICAgIGhvdXIgICAgICAgIDogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIG1pbnV0ZSAgICAgIDogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIHNlY29uZCAgICAgIDogJ251bWVyaWMnLFxuICAgICAgICAgICAgICAgIHRpbWVab25lTmFtZTogJ3Nob3J0J1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgJ2Z1bGwnOiB7XG4gICAgICAgICAgICAgICAgaG91ciAgICAgICAgOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgbWludXRlICAgICAgOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgc2Vjb25kICAgICAgOiAnbnVtZXJpYycsXG4gICAgICAgICAgICAgICAgdGltZVpvbmVOYW1lOiAnc2hvcnQnXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuLy8gRGVmaW5lIGludGVybmFsIHByaXZhdGUgcHJvcGVydGllcyBmb3IgZGVhbGluZyB3aXRoIGxvY2FsZSBkYXRhLlxuc3JjJGVzNSQkLmRlZmluZVByb3BlcnR5KE1lc3NhZ2VGb3JtYXQsICdfX2xvY2FsZURhdGFfXycsIHt2YWx1ZTogc3JjJGVzNSQkLm9iakNyZWF0ZShudWxsKX0pO1xuc3JjJGVzNSQkLmRlZmluZVByb3BlcnR5KE1lc3NhZ2VGb3JtYXQsICdfX2FkZExvY2FsZURhdGEnLCB7dmFsdWU6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgaWYgKCEoZGF0YSAmJiBkYXRhLmxvY2FsZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0xvY2FsZSBkYXRhIHByb3ZpZGVkIHRvIEludGxNZXNzYWdlRm9ybWF0IGlzIG1pc3NpbmcgYSAnICtcbiAgICAgICAgICAgICdgbG9jYWxlYCBwcm9wZXJ0eSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBNZXNzYWdlRm9ybWF0Ll9fbG9jYWxlRGF0YV9fW2RhdGEubG9jYWxlLnRvTG93ZXJDYXNlKCldID0gZGF0YTtcbn19KTtcblxuLy8gRGVmaW5lcyBgX19wYXJzZSgpYCBzdGF0aWMgbWV0aG9kIGFzIGFuIGV4cG9zZWQgcHJpdmF0ZS5cbnNyYyRlczUkJC5kZWZpbmVQcm9wZXJ0eShNZXNzYWdlRm9ybWF0LCAnX19wYXJzZScsIHt2YWx1ZTogaW50bCRtZXNzYWdlZm9ybWF0JHBhcnNlciQkW1wiZGVmYXVsdFwiXS5wYXJzZX0pO1xuXG4vLyBEZWZpbmUgcHVibGljIGBkZWZhdWx0TG9jYWxlYCBwcm9wZXJ0eSB3aGljaCBkZWZhdWx0cyB0byBFbmdsaXNoLCBidXQgY2FuIGJlXG4vLyBzZXQgYnkgdGhlIGRldmVsb3Blci5cbnNyYyRlczUkJC5kZWZpbmVQcm9wZXJ0eShNZXNzYWdlRm9ybWF0LCAnZGVmYXVsdExvY2FsZScsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlICA6IHRydWUsXG4gICAgdmFsdWUgICAgIDogdW5kZWZpbmVkXG59KTtcblxuTWVzc2FnZUZvcm1hdC5wcm90b3R5cGUucmVzb2x2ZWRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIFRPRE86IFByb3ZpZGUgYW55dGhpbmcgZWxzZT9cbiAgICByZXR1cm4ge1xuICAgICAgICBsb2NhbGU6IHRoaXMuX2xvY2FsZVxuICAgIH07XG59O1xuXG5NZXNzYWdlRm9ybWF0LnByb3RvdHlwZS5fY29tcGlsZVBhdHRlcm4gPSBmdW5jdGlvbiAoYXN0LCBsb2NhbGVzLCBmb3JtYXRzLCBwbHVyYWxGbikge1xuICAgIHZhciBjb21waWxlciA9IG5ldyBzcmMkY29tcGlsZXIkJFtcImRlZmF1bHRcIl0obG9jYWxlcywgZm9ybWF0cywgcGx1cmFsRm4pO1xuICAgIHJldHVybiBjb21waWxlci5jb21waWxlKGFzdCk7XG59O1xuXG5NZXNzYWdlRm9ybWF0LnByb3RvdHlwZS5fZmluZFBsdXJhbFJ1bGVGdW5jdGlvbiA9IGZ1bmN0aW9uIChsb2NhbGUpIHtcbiAgICB2YXIgbG9jYWxlRGF0YSA9IE1lc3NhZ2VGb3JtYXQuX19sb2NhbGVEYXRhX187XG4gICAgdmFyIGRhdGEgICAgICAgPSBsb2NhbGVEYXRhW2xvY2FsZS50b0xvd2VyQ2FzZSgpXTtcblxuICAgIC8vIFRoZSBsb2NhbGUgZGF0YSBpcyBkZS1kdXBsaWNhdGVkLCBzbyB3ZSBoYXZlIHRvIHRyYXZlcnNlIHRoZSBsb2NhbGUnc1xuICAgIC8vIGhpZXJhcmNoeSB1bnRpbCB3ZSBmaW5kIGEgYHBsdXJhbFJ1bGVGdW5jdGlvbmAgdG8gcmV0dXJuLlxuICAgIHdoaWxlIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLnBsdXJhbFJ1bGVGdW5jdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGEucGx1cmFsUnVsZUZ1bmN0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgZGF0YSA9IGRhdGEucGFyZW50TG9jYWxlICYmIGxvY2FsZURhdGFbZGF0YS5wYXJlbnRMb2NhbGUudG9Mb3dlckNhc2UoKV07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnTG9jYWxlIGRhdGEgYWRkZWQgdG8gSW50bE1lc3NhZ2VGb3JtYXQgaXMgbWlzc2luZyBhICcgK1xuICAgICAgICAnYHBsdXJhbFJ1bGVGdW5jdGlvbmAgZm9yIDonICsgbG9jYWxlXG4gICAgKTtcbn07XG5cbk1lc3NhZ2VGb3JtYXQucHJvdG90eXBlLl9mb3JtYXQgPSBmdW5jdGlvbiAocGF0dGVybiwgdmFsdWVzKSB7XG4gICAgdmFyIHJlc3VsdCA9ICcnLFxuICAgICAgICBpLCBsZW4sIHBhcnQsIGlkLCB2YWx1ZTtcblxuICAgIGZvciAoaSA9IDAsIGxlbiA9IHBhdHRlcm4ubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgcGFydCA9IHBhdHRlcm5baV07XG5cbiAgICAgICAgLy8gRXhpc3QgZWFybHkgZm9yIHN0cmluZyBwYXJ0cy5cbiAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmVzdWx0ICs9IHBhcnQ7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlkID0gcGFydC5pZDtcblxuICAgICAgICAvLyBFbmZvcmNlIHRoYXQgYWxsIHJlcXVpcmVkIHZhbHVlcyBhcmUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci5cbiAgICAgICAgaWYgKCEodmFsdWVzICYmIHNyYyR1dGlscyQkLmhvcC5jYWxsKHZhbHVlcywgaWQpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIHZhbHVlIG11c3QgYmUgcHJvdmlkZWQgZm9yOiAnICsgaWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFsdWUgPSB2YWx1ZXNbaWRdO1xuXG4gICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZvcm1hdCBwbHVyYWwgYW5kIHNlbGVjdCBwYXJ0cycgb3B0aW9uIOKAlCB3aGljaCBjYW4gYmUgYVxuICAgICAgICAvLyBuZXN0ZWQgcGF0dGVybiBzdHJ1Y3R1cmUuIFRoZSBjaG9vc2luZyBvZiB0aGUgb3B0aW9uIHRvIHVzZSBpc1xuICAgICAgICAvLyBhYnN0cmFjdGVkLWJ5IGFuZCBkZWxlZ2F0ZWQtdG8gdGhlIHBhcnQgaGVscGVyIG9iamVjdC5cbiAgICAgICAgaWYgKHBhcnQub3B0aW9ucykge1xuICAgICAgICAgICAgcmVzdWx0ICs9IHRoaXMuX2Zvcm1hdChwYXJ0LmdldE9wdGlvbih2YWx1ZSksIHZhbHVlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gcGFydC5mb3JtYXQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbk1lc3NhZ2VGb3JtYXQucHJvdG90eXBlLl9tZXJnZUZvcm1hdHMgPSBmdW5jdGlvbiAoZGVmYXVsdHMsIGZvcm1hdHMpIHtcbiAgICB2YXIgbWVyZ2VkRm9ybWF0cyA9IHt9LFxuICAgICAgICB0eXBlLCBtZXJnZWRUeXBlO1xuXG4gICAgZm9yICh0eXBlIGluIGRlZmF1bHRzKSB7XG4gICAgICAgIGlmICghc3JjJHV0aWxzJCQuaG9wLmNhbGwoZGVmYXVsdHMsIHR5cGUpKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgbWVyZ2VkRm9ybWF0c1t0eXBlXSA9IG1lcmdlZFR5cGUgPSBzcmMkZXM1JCQub2JqQ3JlYXRlKGRlZmF1bHRzW3R5cGVdKTtcblxuICAgICAgICBpZiAoZm9ybWF0cyAmJiBzcmMkdXRpbHMkJC5ob3AuY2FsbChmb3JtYXRzLCB0eXBlKSkge1xuICAgICAgICAgICAgc3JjJHV0aWxzJCQuZXh0ZW5kKG1lcmdlZFR5cGUsIGZvcm1hdHNbdHlwZV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZEZvcm1hdHM7XG59O1xuXG5NZXNzYWdlRm9ybWF0LnByb3RvdHlwZS5fcmVzb2x2ZUxvY2FsZSA9IGZ1bmN0aW9uIChsb2NhbGVzKSB7XG4gICAgaWYgKHR5cGVvZiBsb2NhbGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICBsb2NhbGVzID0gW2xvY2FsZXNdO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGFycmF5IHNvIHdlIGNhbiBwdXNoIG9uIHRoZSBkZWZhdWx0IGxvY2FsZS5cbiAgICBsb2NhbGVzID0gKGxvY2FsZXMgfHwgW10pLmNvbmNhdChNZXNzYWdlRm9ybWF0LmRlZmF1bHRMb2NhbGUpO1xuXG4gICAgdmFyIGxvY2FsZURhdGEgPSBNZXNzYWdlRm9ybWF0Ll9fbG9jYWxlRGF0YV9fO1xuICAgIHZhciBpLCBsZW4sIGxvY2FsZVBhcnRzLCBkYXRhO1xuXG4gICAgLy8gVXNpbmcgdGhlIHNldCBvZiBsb2NhbGVzICsgdGhlIGRlZmF1bHQgbG9jYWxlLCB3ZSBsb29rIGZvciB0aGUgZmlyc3Qgb25lXG4gICAgLy8gd2hpY2ggdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkLiBXaGVuIGRhdGEgZG9lcyBub3QgZXhpc3QgZm9yIGEgbG9jYWxlLCB3ZVxuICAgIC8vIHRyYXZlcnNlIGl0cyBhbmNlc3RvcnMgdG8gZmluZCBzb21ldGhpbmcgdGhhdCdzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoaW5cbiAgICAvLyBpdHMgaGllcmFyY2h5IG9mIGxvY2FsZXMuIFNpbmNlIHdlIGxhY2sgdGhlIHByb3BlciBgcGFyZW50TG9jYWxlYCBkYXRhXG4gICAgLy8gaGVyZSwgd2UgbXVzdCB0YWtlIGEgbmFpdmUgYXBwcm9hY2ggdG8gdHJhdmVyc2FsLlxuICAgIGZvciAoaSA9IDAsIGxlbiA9IGxvY2FsZXMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgbG9jYWxlUGFydHMgPSBsb2NhbGVzW2ldLnRvTG93ZXJDYXNlKCkuc3BsaXQoJy0nKTtcblxuICAgICAgICB3aGlsZSAobG9jYWxlUGFydHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBkYXRhID0gbG9jYWxlRGF0YVtsb2NhbGVQYXJ0cy5qb2luKCctJyldO1xuICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG5vcm1hbGl6ZWQgbG9jYWxlIHN0cmluZzsgZS5nLiwgd2UgcmV0dXJuIFwiZW4tVVNcIixcbiAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIFwiZW4tdXNcIi5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5sb2NhbGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxvY2FsZVBhcnRzLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGUgPSBsb2NhbGVzLnBvcCgpO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ05vIGxvY2FsZSBkYXRhIGhhcyBiZWVuIGFkZGVkIHRvIEludGxNZXNzYWdlRm9ybWF0IGZvcjogJyArXG4gICAgICAgIGxvY2FsZXMuam9pbignLCAnKSArICcsIG9yIHRoZSBkZWZhdWx0IGxvY2FsZTogJyArIGRlZmF1bHRMb2NhbGVcbiAgICApO1xufTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29yZS5qcy5tYXAiLCIvLyBHRU5FUkFURUQgRklMRVxuXCJ1c2Ugc3RyaWN0XCI7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IHtcImxvY2FsZVwiOlwiZW5cIixcInBsdXJhbFJ1bGVGdW5jdGlvblwiOmZ1bmN0aW9uIChuLG9yZCl7dmFyIHM9U3RyaW5nKG4pLnNwbGl0KFwiLlwiKSx2MD0hc1sxXSx0MD1OdW1iZXIoc1swXSk9PW4sbjEwPXQwJiZzWzBdLnNsaWNlKC0xKSxuMTAwPXQwJiZzWzBdLnNsaWNlKC0yKTtpZihvcmQpcmV0dXJuIG4xMD09MSYmbjEwMCE9MTE/XCJvbmVcIjpuMTA9PTImJm4xMDAhPTEyP1widHdvXCI6bjEwPT0zJiZuMTAwIT0xMz9cImZld1wiOlwib3RoZXJcIjtyZXR1cm4gbj09MSYmdjA/XCJvbmVcIjpcIm90aGVyXCJ9fTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZW4uanMubWFwIiwiLypcbkNvcHlyaWdodCAoYykgMjAxNCwgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkNvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cblNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4qL1xuXG4vKiBqc2xpbnQgZXNuZXh0OiB0cnVlICovXG5cblwidXNlIHN0cmljdFwiO1xudmFyIHNyYyR1dGlscyQkID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5cbi8vIFB1cnBvc2VseSB1c2luZyB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBhcyB0aGUgSW50bC5qcyBgSW50bGAgcG9seWZpbGwuXG4vLyBDb3B5cmlnaHQgMjAxMyBBbmR5IEVhcm5zaGF3LCBNSVQgTGljZW5zZVxuXG52YXIgcmVhbERlZmluZVByb3AgPSAoZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7IHJldHVybiAhIU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7fSk7IH1cbiAgICBjYXRjaCAoZSkgeyByZXR1cm4gZmFsc2U7IH1cbn0pKCk7XG5cbnZhciBlczMgPSAhcmVhbERlZmluZVByb3AgJiYgIU9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXztcblxudmFyIGRlZmluZVByb3BlcnR5ID0gcmVhbERlZmluZVByb3AgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOlxuICAgICAgICBmdW5jdGlvbiAob2JqLCBuYW1lLCBkZXNjKSB7XG5cbiAgICBpZiAoJ2dldCcgaW4gZGVzYyAmJiBvYmouX19kZWZpbmVHZXR0ZXJfXykge1xuICAgICAgICBvYmouX19kZWZpbmVHZXR0ZXJfXyhuYW1lLCBkZXNjLmdldCk7XG4gICAgfSBlbHNlIGlmICghc3JjJHV0aWxzJCQuaG9wLmNhbGwob2JqLCBuYW1lKSB8fCAndmFsdWUnIGluIGRlc2MpIHtcbiAgICAgICAgb2JqW25hbWVdID0gZGVzYy52YWx1ZTtcbiAgICB9XG59O1xuXG52YXIgb2JqQ3JlYXRlID0gT2JqZWN0LmNyZWF0ZSB8fCBmdW5jdGlvbiAocHJvdG8sIHByb3BzKSB7XG4gICAgdmFyIG9iaiwgaztcblxuICAgIGZ1bmN0aW9uIEYoKSB7fVxuICAgIEYucHJvdG90eXBlID0gcHJvdG87XG4gICAgb2JqID0gbmV3IEYoKTtcblxuICAgIGZvciAoayBpbiBwcm9wcykge1xuICAgICAgICBpZiAoc3JjJHV0aWxzJCQuaG9wLmNhbGwocHJvcHMsIGspKSB7XG4gICAgICAgICAgICBkZWZpbmVQcm9wZXJ0eShvYmosIGssIHByb3BzW2tdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuZXhwb3J0cy5kZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5LCBleHBvcnRzLm9iakNyZWF0ZSA9IG9iakNyZWF0ZTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXM1LmpzLm1hcCIsIi8qIGpzbGludCBlc25leHQ6IHRydWUgKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG52YXIgc3JjJGNvcmUkJCA9IHJlcXVpcmUoXCIuL2NvcmVcIiksIHNyYyRlbiQkID0gcmVxdWlyZShcIi4vZW5cIik7XG5cbnNyYyRjb3JlJCRbXCJkZWZhdWx0XCJdLl9fYWRkTG9jYWxlRGF0YShzcmMkZW4kJFtcImRlZmF1bHRcIl0pO1xuc3JjJGNvcmUkJFtcImRlZmF1bHRcIl0uZGVmYXVsdExvY2FsZSA9ICdlbic7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gc3JjJGNvcmUkJFtcImRlZmF1bHRcIl07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1haW4uanMubWFwIiwiLypcbkNvcHlyaWdodCAoYykgMjAxNCwgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkNvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cblNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4qL1xuXG4vKiBqc2xpbnQgZXNuZXh0OiB0cnVlICovXG5cblwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5leHRlbmQgPSBleHRlbmQ7XG52YXIgaG9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gZXh0ZW5kKG9iaikge1xuICAgIHZhciBzb3VyY2VzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSxcbiAgICAgICAgaSwgbGVuLCBzb3VyY2UsIGtleTtcblxuICAgIGZvciAoaSA9IDAsIGxlbiA9IHNvdXJjZXMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgc291cmNlID0gc291cmNlc1tpXTtcbiAgICAgICAgaWYgKCFzb3VyY2UpIHsgY29udGludWU7IH1cblxuICAgICAgICBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmIChob3AuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICAgICAgICBvYmpba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn1cbmV4cG9ydHMuaG9wID0gaG9wO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLCIvKiBqc2hpbnQgbm9kZTp0cnVlICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEludGxSZWxhdGl2ZUZvcm1hdCA9IHJlcXVpcmUoJy4vbGliL21haW4nKVsnZGVmYXVsdCddO1xuXG4vLyBBZGQgYWxsIGxvY2FsZSBkYXRhIHRvIGBJbnRsUmVsYXRpdmVGb3JtYXRgLiBUaGlzIG1vZHVsZSB3aWxsIGJlIGlnbm9yZWQgd2hlblxuLy8gYnVuZGxpbmcgZm9yIHRoZSBicm93c2VyIHdpdGggQnJvd3NlcmlmeS9XZWJwYWNrLlxucmVxdWlyZSgnLi9saWIvbG9jYWxlcycpO1xuXG4vLyBSZS1leHBvcnQgYEludGxSZWxhdGl2ZUZvcm1hdGAgYXMgdGhlIENvbW1vbkpTIGRlZmF1bHQgZXhwb3J0cyB3aXRoIGFsbCB0aGVcbi8vIGxvY2FsZSBkYXRhIHJlZ2lzdGVyZWQsIGFuZCB3aXRoIEVuZ2xpc2ggc2V0IGFzIHRoZSBkZWZhdWx0IGxvY2FsZS4gRGVmaW5lXG4vLyB0aGUgYGRlZmF1bHRgIHByb3AgZm9yIHVzZSB3aXRoIG90aGVyIGNvbXBpbGVkIEVTNiBNb2R1bGVzLlxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gSW50bFJlbGF0aXZlRm9ybWF0O1xuZXhwb3J0c1snZGVmYXVsdCddID0gZXhwb3J0cztcbiIsIi8qXG5Db3B5cmlnaHQgKGMpIDIwMTQsIFlhaG9vISBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5Db3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG5TZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuKi9cblxuLyoganNsaW50IGVzbmV4dDogdHJ1ZSAqL1xuXG5cInVzZSBzdHJpY3RcIjtcbnZhciBpbnRsJG1lc3NhZ2Vmb3JtYXQkJCA9IHJlcXVpcmUoXCJpbnRsLW1lc3NhZ2Vmb3JtYXRcIiksIHNyYyRkaWZmJCQgPSByZXF1aXJlKFwiLi9kaWZmXCIpLCBzcmMkZXM1JCQgPSByZXF1aXJlKFwiLi9lczVcIik7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IFJlbGF0aXZlRm9ybWF0O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG52YXIgRklFTERTID0gWydzZWNvbmQnLCAnbWludXRlJywgJ2hvdXInLCAnZGF5JywgJ21vbnRoJywgJ3llYXInXTtcbnZhciBTVFlMRVMgPSBbJ2Jlc3QgZml0JywgJ251bWVyaWMnXTtcblxuLy8gLS0gUmVsYXRpdmVGb3JtYXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gUmVsYXRpdmVGb3JtYXQobG9jYWxlcywgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgLy8gTWFrZSBhIGNvcHkgb2YgYGxvY2FsZXNgIGlmIGl0J3MgYW4gYXJyYXksIHNvIHRoYXQgaXQgZG9lc24ndCBjaGFuZ2VcbiAgICAvLyBzaW5jZSBpdCdzIHVzZWQgbGF6aWx5LlxuICAgIGlmIChzcmMkZXM1JCQuaXNBcnJheShsb2NhbGVzKSkge1xuICAgICAgICBsb2NhbGVzID0gbG9jYWxlcy5jb25jYXQoKTtcbiAgICB9XG5cbiAgICBzcmMkZXM1JCQuZGVmaW5lUHJvcGVydHkodGhpcywgJ19sb2NhbGUnLCB7dmFsdWU6IHRoaXMuX3Jlc29sdmVMb2NhbGUobG9jYWxlcyl9KTtcbiAgICBzcmMkZXM1JCQuZGVmaW5lUHJvcGVydHkodGhpcywgJ19vcHRpb25zJywge3ZhbHVlOiB7XG4gICAgICAgIHN0eWxlOiB0aGlzLl9yZXNvbHZlU3R5bGUob3B0aW9ucy5zdHlsZSksXG4gICAgICAgIHVuaXRzOiB0aGlzLl9pc1ZhbGlkVW5pdHMob3B0aW9ucy51bml0cykgJiYgb3B0aW9ucy51bml0c1xuICAgIH19KTtcblxuICAgIHNyYyRlczUkJC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX2xvY2FsZXMnLCB7dmFsdWU6IGxvY2FsZXN9KTtcbiAgICBzcmMkZXM1JCQuZGVmaW5lUHJvcGVydHkodGhpcywgJ19maWVsZHMnLCB7dmFsdWU6IHRoaXMuX2ZpbmRGaWVsZHModGhpcy5fbG9jYWxlKX0pO1xuICAgIHNyYyRlczUkJC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnX21lc3NhZ2VzJywge3ZhbHVlOiBzcmMkZXM1JCQub2JqQ3JlYXRlKG51bGwpfSk7XG5cbiAgICAvLyBcIkJpbmRcIiBgZm9ybWF0KClgIG1ldGhvZCB0byBgdGhpc2Agc28gaXQgY2FuIGJlIHBhc3NlZCBieSByZWZlcmVuY2UgbGlrZVxuICAgIC8vIHRoZSBvdGhlciBgSW50bGAgQVBJcy5cbiAgICB2YXIgcmVsYXRpdmVGb3JtYXQgPSB0aGlzO1xuICAgIHRoaXMuZm9ybWF0ID0gZnVuY3Rpb24gZm9ybWF0KGRhdGUsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHJlbGF0aXZlRm9ybWF0Ll9mb3JtYXQoZGF0ZSwgb3B0aW9ucyk7XG4gICAgfTtcbn1cblxuLy8gRGVmaW5lIGludGVybmFsIHByaXZhdGUgcHJvcGVydGllcyBmb3IgZGVhbGluZyB3aXRoIGxvY2FsZSBkYXRhLlxuc3JjJGVzNSQkLmRlZmluZVByb3BlcnR5KFJlbGF0aXZlRm9ybWF0LCAnX19sb2NhbGVEYXRhX18nLCB7dmFsdWU6IHNyYyRlczUkJC5vYmpDcmVhdGUobnVsbCl9KTtcbnNyYyRlczUkJC5kZWZpbmVQcm9wZXJ0eShSZWxhdGl2ZUZvcm1hdCwgJ19fYWRkTG9jYWxlRGF0YScsIHt2YWx1ZTogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBpZiAoIShkYXRhICYmIGRhdGEubG9jYWxlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnTG9jYWxlIGRhdGEgcHJvdmlkZWQgdG8gSW50bFJlbGF0aXZlRm9ybWF0IGlzIG1pc3NpbmcgYSAnICtcbiAgICAgICAgICAgICdgbG9jYWxlYCBwcm9wZXJ0eSB2YWx1ZSdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBSZWxhdGl2ZUZvcm1hdC5fX2xvY2FsZURhdGFfX1tkYXRhLmxvY2FsZS50b0xvd2VyQ2FzZSgpXSA9IGRhdGE7XG5cbiAgICAvLyBBZGQgZGF0YSB0byBJbnRsTWVzc2FnZUZvcm1hdC5cbiAgICBpbnRsJG1lc3NhZ2Vmb3JtYXQkJFtcImRlZmF1bHRcIl0uX19hZGRMb2NhbGVEYXRhKGRhdGEpO1xufX0pO1xuXG4vLyBEZWZpbmUgcHVibGljIGBkZWZhdWx0TG9jYWxlYCBwcm9wZXJ0eSB3aGljaCBjYW4gYmUgc2V0IGJ5IHRoZSBkZXZlbG9wZXIsIG9yXG4vLyBpdCB3aWxsIGJlIHNldCB3aGVuIHRoZSBmaXJzdCBSZWxhdGl2ZUZvcm1hdCBpbnN0YW5jZSBpcyBjcmVhdGVkIGJ5XG4vLyBsZXZlcmFnaW5nIHRoZSByZXNvbHZlZCBsb2NhbGUgZnJvbSBgSW50bGAuXG5zcmMkZXM1JCQuZGVmaW5lUHJvcGVydHkoUmVsYXRpdmVGb3JtYXQsICdkZWZhdWx0TG9jYWxlJywge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgd3JpdGFibGUgIDogdHJ1ZSxcbiAgICB2YWx1ZSAgICAgOiB1bmRlZmluZWRcbn0pO1xuXG4vLyBEZWZpbmUgcHVibGljIGB0aHJlc2hvbGRzYCBwcm9wZXJ0eSB3aGljaCBjYW4gYmUgc2V0IGJ5IHRoZSBkZXZlbG9wZXIsIGFuZFxuLy8gZGVmYXVsdHMgdG8gcmVsYXRpdmUgdGltZSB0aHJlc2hvbGRzIGZyb20gbW9tZW50LmpzLlxuc3JjJGVzNSQkLmRlZmluZVByb3BlcnR5KFJlbGF0aXZlRm9ybWF0LCAndGhyZXNob2xkcycsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuXG4gICAgdmFsdWU6IHtcbiAgICAgICAgc2Vjb25kOiA0NSwgIC8vIHNlY29uZHMgdG8gbWludXRlXG4gICAgICAgIG1pbnV0ZTogNDUsICAvLyBtaW51dGVzIHRvIGhvdXJcbiAgICAgICAgaG91ciAgOiAyMiwgIC8vIGhvdXJzIHRvIGRheVxuICAgICAgICBkYXkgICA6IDI2LCAgLy8gZGF5cyB0byBtb250aFxuICAgICAgICBtb250aCA6IDExICAgLy8gbW9udGhzIHRvIHllYXJcbiAgICB9XG59KTtcblxuUmVsYXRpdmVGb3JtYXQucHJvdG90eXBlLnJlc29sdmVkT3B0aW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBsb2NhbGU6IHRoaXMuX2xvY2FsZSxcbiAgICAgICAgc3R5bGUgOiB0aGlzLl9vcHRpb25zLnN0eWxlLFxuICAgICAgICB1bml0cyA6IHRoaXMuX29wdGlvbnMudW5pdHNcbiAgICB9O1xufTtcblxuUmVsYXRpdmVGb3JtYXQucHJvdG90eXBlLl9jb21waWxlTWVzc2FnZSA9IGZ1bmN0aW9uICh1bml0cykge1xuICAgIC8vIGB0aGlzLl9sb2NhbGVzYCBpcyB0aGUgb3JpZ2luYWwgc2V0IG9mIGxvY2FsZXMgdGhlIHVzZXIgc3BlY2lmaWVkIHRvIHRoZVxuICAgIC8vIGNvbnN0cnVjdG9yLCB3aGlsZSBgdGhpcy5fbG9jYWxlYCBpcyB0aGUgcmVzb2x2ZWQgcm9vdCBsb2NhbGUuXG4gICAgdmFyIGxvY2FsZXMgICAgICAgID0gdGhpcy5fbG9jYWxlcztcbiAgICB2YXIgcmVzb2x2ZWRMb2NhbGUgPSB0aGlzLl9sb2NhbGU7XG5cbiAgICB2YXIgZmllbGQgICAgICAgID0gdGhpcy5fZmllbGRzW3VuaXRzXTtcbiAgICB2YXIgcmVsYXRpdmVUaW1lID0gZmllbGQucmVsYXRpdmVUaW1lO1xuICAgIHZhciBmdXR1cmUgICAgICAgPSAnJztcbiAgICB2YXIgcGFzdCAgICAgICAgID0gJyc7XG4gICAgdmFyIGk7XG5cbiAgICBmb3IgKGkgaW4gcmVsYXRpdmVUaW1lLmZ1dHVyZSkge1xuICAgICAgICBpZiAocmVsYXRpdmVUaW1lLmZ1dHVyZS5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgZnV0dXJlICs9ICcgJyArIGkgKyAnIHsnICtcbiAgICAgICAgICAgICAgICByZWxhdGl2ZVRpbWUuZnV0dXJlW2ldLnJlcGxhY2UoJ3swfScsICcjJykgKyAnfSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGkgaW4gcmVsYXRpdmVUaW1lLnBhc3QpIHtcbiAgICAgICAgaWYgKHJlbGF0aXZlVGltZS5wYXN0Lmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICBwYXN0ICs9ICcgJyArIGkgKyAnIHsnICtcbiAgICAgICAgICAgICAgICByZWxhdGl2ZVRpbWUucGFzdFtpXS5yZXBsYWNlKCd7MH0nLCAnIycpICsgJ30nO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIG1lc3NhZ2UgPSAne3doZW4sIHNlbGVjdCwgZnV0dXJlIHt7MCwgcGx1cmFsLCAnICsgZnV0dXJlICsgJ319JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFzdCB7ezAsIHBsdXJhbCwgJyArIHBhc3QgKyAnfX19JztcblxuICAgIC8vIENyZWF0ZSB0aGUgc3ludGhldGljIEludGxNZXNzYWdlRm9ybWF0IGluc3RhbmNlIHVzaW5nIHRoZSBvcmlnaW5hbFxuICAgIC8vIGxvY2FsZXMgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIHdoZW4gY29uc3RydWN0aW5nIHRoZSB0aGUgcGFyZW50XG4gICAgLy8gSW50bFJlbGF0aXZlRm9ybWF0IGluc3RhbmNlLlxuICAgIHJldHVybiBuZXcgaW50bCRtZXNzYWdlZm9ybWF0JCRbXCJkZWZhdWx0XCJdKG1lc3NhZ2UsIGxvY2FsZXMpO1xufTtcblxuUmVsYXRpdmVGb3JtYXQucHJvdG90eXBlLl9nZXRNZXNzYWdlID0gZnVuY3Rpb24gKHVuaXRzKSB7XG4gICAgdmFyIG1lc3NhZ2VzID0gdGhpcy5fbWVzc2FnZXM7XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgc3ludGhldGljIG1lc3NhZ2UgYmFzZWQgb24gdGhlIGxvY2FsZSBkYXRhIGZyb20gQ0xEUi5cbiAgICBpZiAoIW1lc3NhZ2VzW3VuaXRzXSkge1xuICAgICAgICBtZXNzYWdlc1t1bml0c10gPSB0aGlzLl9jb21waWxlTWVzc2FnZSh1bml0cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1lc3NhZ2VzW3VuaXRzXTtcbn07XG5cblJlbGF0aXZlRm9ybWF0LnByb3RvdHlwZS5fZ2V0UmVsYXRpdmVVbml0cyA9IGZ1bmN0aW9uIChkaWZmLCB1bml0cykge1xuICAgIHZhciBmaWVsZCA9IHRoaXMuX2ZpZWxkc1t1bml0c107XG5cbiAgICBpZiAoZmllbGQucmVsYXRpdmUpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLnJlbGF0aXZlW2RpZmZdO1xuICAgIH1cbn07XG5cblJlbGF0aXZlRm9ybWF0LnByb3RvdHlwZS5fZmluZEZpZWxkcyA9IGZ1bmN0aW9uIChsb2NhbGUpIHtcbiAgICB2YXIgbG9jYWxlRGF0YSA9IFJlbGF0aXZlRm9ybWF0Ll9fbG9jYWxlRGF0YV9fO1xuICAgIHZhciBkYXRhICAgICAgID0gbG9jYWxlRGF0YVtsb2NhbGUudG9Mb3dlckNhc2UoKV07XG5cbiAgICAvLyBUaGUgbG9jYWxlIGRhdGEgaXMgZGUtZHVwbGljYXRlZCwgc28gd2UgaGF2ZSB0byB0cmF2ZXJzZSB0aGUgbG9jYWxlJ3NcbiAgICAvLyBoaWVyYXJjaHkgdW50aWwgd2UgZmluZCBgZmllbGRzYCB0byByZXR1cm4uXG4gICAgd2hpbGUgKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGEuZmllbGRzKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5maWVsZHM7XG4gICAgICAgIH1cblxuICAgICAgICBkYXRhID0gZGF0YS5wYXJlbnRMb2NhbGUgJiYgbG9jYWxlRGF0YVtkYXRhLnBhcmVudExvY2FsZS50b0xvd2VyQ2FzZSgpXTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdMb2NhbGUgZGF0YSBhZGRlZCB0byBJbnRsUmVsYXRpdmVGb3JtYXQgaXMgbWlzc2luZyBgZmllbGRzYCBmb3IgOicgK1xuICAgICAgICBsb2NhbGVcbiAgICApO1xufTtcblxuUmVsYXRpdmVGb3JtYXQucHJvdG90eXBlLl9mb3JtYXQgPSBmdW5jdGlvbiAoZGF0ZSwgb3B0aW9ucykge1xuICAgIHZhciBub3cgPSBvcHRpb25zICYmIG9wdGlvbnMubm93ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm5vdyA6IHNyYyRlczUkJC5kYXRlTm93KCk7XG5cbiAgICBpZiAoZGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRhdGUgPSBub3c7XG4gICAgfVxuXG4gICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBgZGF0ZWAgYW5kIG9wdGlvbmFsIGBub3dgIHZhbHVlcyBhcmUgdmFsaWQsIGFuZCB0aHJvdyBhXG4gICAgLy8gc2ltaWxhciBlcnJvciB0byB3aGF0IGBJbnRsLkRhdGVUaW1lRm9ybWF0I2Zvcm1hdCgpYCB3b3VsZCB0aHJvdy5cbiAgICBpZiAoIWlzRmluaXRlKG5vdykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgICAgICAnVGhlIGBub3dgIG9wdGlvbiBwcm92aWRlZCB0byBJbnRsUmVsYXRpdmVGb3JtYXQjZm9ybWF0KCkgaXMgbm90ICcgK1xuICAgICAgICAgICAgJ2luIHZhbGlkIHJhbmdlLidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzRmluaXRlKGRhdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFxuICAgICAgICAgICAgJ1RoZSBkYXRlIHZhbHVlIHByb3ZpZGVkIHRvIEludGxSZWxhdGl2ZUZvcm1hdCNmb3JtYXQoKSBpcyBub3QgJyArXG4gICAgICAgICAgICAnaW4gdmFsaWQgcmFuZ2UuJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHZhciBkaWZmUmVwb3J0ICA9IHNyYyRkaWZmJCRbXCJkZWZhdWx0XCJdKG5vdywgZGF0ZSk7XG4gICAgdmFyIHVuaXRzICAgICAgID0gdGhpcy5fb3B0aW9ucy51bml0cyB8fCB0aGlzLl9zZWxlY3RVbml0cyhkaWZmUmVwb3J0KTtcbiAgICB2YXIgZGlmZkluVW5pdHMgPSBkaWZmUmVwb3J0W3VuaXRzXTtcblxuICAgIGlmICh0aGlzLl9vcHRpb25zLnN0eWxlICE9PSAnbnVtZXJpYycpIHtcbiAgICAgICAgdmFyIHJlbGF0aXZlVW5pdHMgPSB0aGlzLl9nZXRSZWxhdGl2ZVVuaXRzKGRpZmZJblVuaXRzLCB1bml0cyk7XG4gICAgICAgIGlmIChyZWxhdGl2ZVVuaXRzKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVsYXRpdmVVbml0cztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9nZXRNZXNzYWdlKHVuaXRzKS5mb3JtYXQoe1xuICAgICAgICAnMCcgOiBNYXRoLmFicyhkaWZmSW5Vbml0cyksXG4gICAgICAgIHdoZW46IGRpZmZJblVuaXRzIDwgMCA/ICdwYXN0JyA6ICdmdXR1cmUnXG4gICAgfSk7XG59O1xuXG5SZWxhdGl2ZUZvcm1hdC5wcm90b3R5cGUuX2lzVmFsaWRVbml0cyA9IGZ1bmN0aW9uICh1bml0cykge1xuICAgIGlmICghdW5pdHMgfHwgc3JjJGVzNSQkLmFyckluZGV4T2YuY2FsbChGSUVMRFMsIHVuaXRzKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdW5pdHMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhciBzdWdnZXN0aW9uID0gL3MkLy50ZXN0KHVuaXRzKSAmJiB1bml0cy5zdWJzdHIoMCwgdW5pdHMubGVuZ3RoIC0gMSk7XG4gICAgICAgIGlmIChzdWdnZXN0aW9uICYmIHNyYyRlczUkJC5hcnJJbmRleE9mLmNhbGwoRklFTERTLCBzdWdnZXN0aW9uKSA+PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgJ1wiJyArIHVuaXRzICsgJ1wiIGlzIG5vdCBhIHZhbGlkIEludGxSZWxhdGl2ZUZvcm1hdCBgdW5pdHNgICcgK1xuICAgICAgICAgICAgICAgICd2YWx1ZSwgZGlkIHlvdSBtZWFuOiAnICsgc3VnZ2VzdGlvblxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1wiJyArIHVuaXRzICsgJ1wiIGlzIG5vdCBhIHZhbGlkIEludGxSZWxhdGl2ZUZvcm1hdCBgdW5pdHNgIHZhbHVlLCBpdCAnICtcbiAgICAgICAgJ211c3QgYmUgb25lIG9mOiBcIicgKyBGSUVMRFMuam9pbignXCIsIFwiJykgKyAnXCInXG4gICAgKTtcbn07XG5cblJlbGF0aXZlRm9ybWF0LnByb3RvdHlwZS5fcmVzb2x2ZUxvY2FsZSA9IGZ1bmN0aW9uIChsb2NhbGVzKSB7XG4gICAgaWYgKHR5cGVvZiBsb2NhbGVzID09PSAnc3RyaW5nJykge1xuICAgICAgICBsb2NhbGVzID0gW2xvY2FsZXNdO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGFycmF5IHNvIHdlIGNhbiBwdXNoIG9uIHRoZSBkZWZhdWx0IGxvY2FsZS5cbiAgICBsb2NhbGVzID0gKGxvY2FsZXMgfHwgW10pLmNvbmNhdChSZWxhdGl2ZUZvcm1hdC5kZWZhdWx0TG9jYWxlKTtcblxuICAgIHZhciBsb2NhbGVEYXRhID0gUmVsYXRpdmVGb3JtYXQuX19sb2NhbGVEYXRhX187XG4gICAgdmFyIGksIGxlbiwgbG9jYWxlUGFydHMsIGRhdGE7XG5cbiAgICAvLyBVc2luZyB0aGUgc2V0IG9mIGxvY2FsZXMgKyB0aGUgZGVmYXVsdCBsb2NhbGUsIHdlIGxvb2sgZm9yIHRoZSBmaXJzdCBvbmVcbiAgICAvLyB3aGljaCB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQuIFdoZW4gZGF0YSBkb2VzIG5vdCBleGlzdCBmb3IgYSBsb2NhbGUsIHdlXG4gICAgLy8gdHJhdmVyc2UgaXRzIGFuY2VzdG9ycyB0byBmaW5kIHNvbWV0aGluZyB0aGF0J3MgYmVlbiByZWdpc3RlcmVkIHdpdGhpblxuICAgIC8vIGl0cyBoaWVyYXJjaHkgb2YgbG9jYWxlcy4gU2luY2Ugd2UgbGFjayB0aGUgcHJvcGVyIGBwYXJlbnRMb2NhbGVgIGRhdGFcbiAgICAvLyBoZXJlLCB3ZSBtdXN0IHRha2UgYSBuYWl2ZSBhcHByb2FjaCB0byB0cmF2ZXJzYWwuXG4gICAgZm9yIChpID0gMCwgbGVuID0gbG9jYWxlcy5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICBsb2NhbGVQYXJ0cyA9IGxvY2FsZXNbaV0udG9Mb3dlckNhc2UoKS5zcGxpdCgnLScpO1xuXG4gICAgICAgIHdoaWxlIChsb2NhbGVQYXJ0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGEgPSBsb2NhbGVEYXRhW2xvY2FsZVBhcnRzLmpvaW4oJy0nKV07XG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgbm9ybWFsaXplZCBsb2NhbGUgc3RyaW5nOyBlLmcuLCB3ZSByZXR1cm4gXCJlbi1VU1wiLFxuICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgXCJlbi11c1wiLlxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLmxvY2FsZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbG9jYWxlUGFydHMucG9wKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZSA9IGxvY2FsZXMucG9wKCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnTm8gbG9jYWxlIGRhdGEgaGFzIGJlZW4gYWRkZWQgdG8gSW50bFJlbGF0aXZlRm9ybWF0IGZvcjogJyArXG4gICAgICAgIGxvY2FsZXMuam9pbignLCAnKSArICcsIG9yIHRoZSBkZWZhdWx0IGxvY2FsZTogJyArIGRlZmF1bHRMb2NhbGVcbiAgICApO1xufTtcblxuUmVsYXRpdmVGb3JtYXQucHJvdG90eXBlLl9yZXNvbHZlU3R5bGUgPSBmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICAvLyBEZWZhdWx0IHRvIFwiYmVzdCBmaXRcIiBzdHlsZS5cbiAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgIHJldHVybiBTVFlMRVNbMF07XG4gICAgfVxuXG4gICAgaWYgKHNyYyRlczUkJC5hcnJJbmRleE9mLmNhbGwoU1RZTEVTLCBzdHlsZSkgPj0gMCkge1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnXCInICsgc3R5bGUgKyAnXCIgaXMgbm90IGEgdmFsaWQgSW50bFJlbGF0aXZlRm9ybWF0IGBzdHlsZWAgdmFsdWUsIGl0ICcgK1xuICAgICAgICAnbXVzdCBiZSBvbmUgb2Y6IFwiJyArIFNUWUxFUy5qb2luKCdcIiwgXCInKSArICdcIidcbiAgICApO1xufTtcblxuUmVsYXRpdmVGb3JtYXQucHJvdG90eXBlLl9zZWxlY3RVbml0cyA9IGZ1bmN0aW9uIChkaWZmUmVwb3J0KSB7XG4gICAgdmFyIGksIGwsIHVuaXRzO1xuXG4gICAgZm9yIChpID0gMCwgbCA9IEZJRUxEUy5sZW5ndGg7IGkgPCBsOyBpICs9IDEpIHtcbiAgICAgICAgdW5pdHMgPSBGSUVMRFNbaV07XG5cbiAgICAgICAgaWYgKE1hdGguYWJzKGRpZmZSZXBvcnRbdW5pdHNdKSA8IFJlbGF0aXZlRm9ybWF0LnRocmVzaG9sZHNbdW5pdHNdKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bml0cztcbn07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvcmUuanMubWFwIiwiLypcbkNvcHlyaWdodCAoYykgMjAxNCwgWWFob28hIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbkNvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cblNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4qL1xuXG4vKiBqc2xpbnQgZXNuZXh0OiB0cnVlICovXG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgcm91bmQgPSBNYXRoLnJvdW5kO1xuXG5mdW5jdGlvbiBkYXlzVG9ZZWFycyhkYXlzKSB7XG4gICAgLy8gNDAwIHllYXJzIGhhdmUgMTQ2MDk3IGRheXMgKHRha2luZyBpbnRvIGFjY291bnQgbGVhcCB5ZWFyIHJ1bGVzKVxuICAgIHJldHVybiBkYXlzICogNDAwIC8gMTQ2MDk3O1xufVxuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICAgIC8vIENvbnZlcnQgdG8gbXMgdGltZXN0YW1wcy5cbiAgICBmcm9tID0gK2Zyb207XG4gICAgdG8gICA9ICt0bztcblxuICAgIHZhciBtaWxsaXNlY29uZCA9IHJvdW5kKHRvIC0gZnJvbSksXG4gICAgICAgIHNlY29uZCAgICAgID0gcm91bmQobWlsbGlzZWNvbmQgLyAxMDAwKSxcbiAgICAgICAgbWludXRlICAgICAgPSByb3VuZChzZWNvbmQgLyA2MCksXG4gICAgICAgIGhvdXIgICAgICAgID0gcm91bmQobWludXRlIC8gNjApLFxuICAgICAgICBkYXkgICAgICAgICA9IHJvdW5kKGhvdXIgLyAyNCksXG4gICAgICAgIHdlZWsgICAgICAgID0gcm91bmQoZGF5IC8gNyk7XG5cbiAgICB2YXIgcmF3WWVhcnMgPSBkYXlzVG9ZZWFycyhkYXkpLFxuICAgICAgICBtb250aCAgICA9IHJvdW5kKHJhd1llYXJzICogMTIpLFxuICAgICAgICB5ZWFyICAgICA9IHJvdW5kKHJhd1llYXJzKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIG1pbGxpc2Vjb25kOiBtaWxsaXNlY29uZCxcbiAgICAgICAgc2Vjb25kICAgICA6IHNlY29uZCxcbiAgICAgICAgbWludXRlICAgICA6IG1pbnV0ZSxcbiAgICAgICAgaG91ciAgICAgICA6IGhvdXIsXG4gICAgICAgIGRheSAgICAgICAgOiBkYXksXG4gICAgICAgIHdlZWsgICAgICAgOiB3ZWVrLFxuICAgICAgICBtb250aCAgICAgIDogbW9udGgsXG4gICAgICAgIHllYXIgICAgICAgOiB5ZWFyXG4gICAgfTtcbn07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRpZmYuanMubWFwIiwiLy8gR0VORVJBVEVEIEZJTEVcblwidXNlIHN0cmljdFwiO1xuZXhwb3J0c1tcImRlZmF1bHRcIl0gPSB7XCJsb2NhbGVcIjpcImVuXCIsXCJwbHVyYWxSdWxlRnVuY3Rpb25cIjpmdW5jdGlvbiAobixvcmQpe3ZhciBzPVN0cmluZyhuKS5zcGxpdChcIi5cIiksdjA9IXNbMV0sdDA9TnVtYmVyKHNbMF0pPT1uLG4xMD10MCYmc1swXS5zbGljZSgtMSksbjEwMD10MCYmc1swXS5zbGljZSgtMik7aWYob3JkKXJldHVybiBuMTA9PTEmJm4xMDAhPTExP1wib25lXCI6bjEwPT0yJiZuMTAwIT0xMj9cInR3b1wiOm4xMD09MyYmbjEwMCE9MTM/XCJmZXdcIjpcIm90aGVyXCI7cmV0dXJuIG49PTEmJnYwP1wib25lXCI6XCJvdGhlclwifSxcImZpZWxkc1wiOntcInllYXJcIjp7XCJkaXNwbGF5TmFtZVwiOlwieWVhclwiLFwicmVsYXRpdmVcIjp7XCIwXCI6XCJ0aGlzIHllYXJcIixcIjFcIjpcIm5leHQgeWVhclwiLFwiLTFcIjpcImxhc3QgeWVhclwifSxcInJlbGF0aXZlVGltZVwiOntcImZ1dHVyZVwiOntcIm9uZVwiOlwiaW4gezB9IHllYXJcIixcIm90aGVyXCI6XCJpbiB7MH0geWVhcnNcIn0sXCJwYXN0XCI6e1wib25lXCI6XCJ7MH0geWVhciBhZ29cIixcIm90aGVyXCI6XCJ7MH0geWVhcnMgYWdvXCJ9fX0sXCJtb250aFwiOntcImRpc3BsYXlOYW1lXCI6XCJtb250aFwiLFwicmVsYXRpdmVcIjp7XCIwXCI6XCJ0aGlzIG1vbnRoXCIsXCIxXCI6XCJuZXh0IG1vbnRoXCIsXCItMVwiOlwibGFzdCBtb250aFwifSxcInJlbGF0aXZlVGltZVwiOntcImZ1dHVyZVwiOntcIm9uZVwiOlwiaW4gezB9IG1vbnRoXCIsXCJvdGhlclwiOlwiaW4gezB9IG1vbnRoc1wifSxcInBhc3RcIjp7XCJvbmVcIjpcInswfSBtb250aCBhZ29cIixcIm90aGVyXCI6XCJ7MH0gbW9udGhzIGFnb1wifX19LFwiZGF5XCI6e1wiZGlzcGxheU5hbWVcIjpcImRheVwiLFwicmVsYXRpdmVcIjp7XCIwXCI6XCJ0b2RheVwiLFwiMVwiOlwidG9tb3Jyb3dcIixcIi0xXCI6XCJ5ZXN0ZXJkYXlcIn0sXCJyZWxhdGl2ZVRpbWVcIjp7XCJmdXR1cmVcIjp7XCJvbmVcIjpcImluIHswfSBkYXlcIixcIm90aGVyXCI6XCJpbiB7MH0gZGF5c1wifSxcInBhc3RcIjp7XCJvbmVcIjpcInswfSBkYXkgYWdvXCIsXCJvdGhlclwiOlwiezB9IGRheXMgYWdvXCJ9fX0sXCJob3VyXCI6e1wiZGlzcGxheU5hbWVcIjpcImhvdXJcIixcInJlbGF0aXZlVGltZVwiOntcImZ1dHVyZVwiOntcIm9uZVwiOlwiaW4gezB9IGhvdXJcIixcIm90aGVyXCI6XCJpbiB7MH0gaG91cnNcIn0sXCJwYXN0XCI6e1wib25lXCI6XCJ7MH0gaG91ciBhZ29cIixcIm90aGVyXCI6XCJ7MH0gaG91cnMgYWdvXCJ9fX0sXCJtaW51dGVcIjp7XCJkaXNwbGF5TmFtZVwiOlwibWludXRlXCIsXCJyZWxhdGl2ZVRpbWVcIjp7XCJmdXR1cmVcIjp7XCJvbmVcIjpcImluIHswfSBtaW51dGVcIixcIm90aGVyXCI6XCJpbiB7MH0gbWludXRlc1wifSxcInBhc3RcIjp7XCJvbmVcIjpcInswfSBtaW51dGUgYWdvXCIsXCJvdGhlclwiOlwiezB9IG1pbnV0ZXMgYWdvXCJ9fX0sXCJzZWNvbmRcIjp7XCJkaXNwbGF5TmFtZVwiOlwic2Vjb25kXCIsXCJyZWxhdGl2ZVwiOntcIjBcIjpcIm5vd1wifSxcInJlbGF0aXZlVGltZVwiOntcImZ1dHVyZVwiOntcIm9uZVwiOlwiaW4gezB9IHNlY29uZFwiLFwib3RoZXJcIjpcImluIHswfSBzZWNvbmRzXCJ9LFwicGFzdFwiOntcIm9uZVwiOlwiezB9IHNlY29uZCBhZ29cIixcIm90aGVyXCI6XCJ7MH0gc2Vjb25kcyBhZ29cIn19fX19O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1lbi5qcy5tYXAiLCIvKlxuQ29weXJpZ2h0IChjKSAyMDE0LCBZYWhvbyEgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLlxuU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiovXG5cbi8qIGpzbGludCBlc25leHQ6IHRydWUgKi9cblxuXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIFB1cnBvc2VseSB1c2luZyB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBhcyB0aGUgSW50bC5qcyBgSW50bGAgcG9seWZpbGwuXG4vLyBDb3B5cmlnaHQgMjAxMyBBbmR5IEVhcm5zaGF3LCBNSVQgTGljZW5zZVxuXG52YXIgaG9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbnZhciByZWFsRGVmaW5lUHJvcCA9IChmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHsgcmV0dXJuICEhT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHt9KTsgfVxuICAgIGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfVxufSkoKTtcblxudmFyIGVzMyA9ICFyZWFsRGVmaW5lUHJvcCAmJiAhT2JqZWN0LnByb3RvdHlwZS5fX2RlZmluZUdldHRlcl9fO1xuXG52YXIgZGVmaW5lUHJvcGVydHkgPSByZWFsRGVmaW5lUHJvcCA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSA6XG4gICAgICAgIGZ1bmN0aW9uIChvYmosIG5hbWUsIGRlc2MpIHtcblxuICAgIGlmICgnZ2V0JyBpbiBkZXNjICYmIG9iai5fX2RlZmluZUdldHRlcl9fKSB7XG4gICAgICAgIG9iai5fX2RlZmluZUdldHRlcl9fKG5hbWUsIGRlc2MuZ2V0KTtcbiAgICB9IGVsc2UgaWYgKCFob3AuY2FsbChvYmosIG5hbWUpIHx8ICd2YWx1ZScgaW4gZGVzYykge1xuICAgICAgICBvYmpbbmFtZV0gPSBkZXNjLnZhbHVlO1xuICAgIH1cbn07XG5cbnZhciBvYmpDcmVhdGUgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIChwcm90bywgcHJvcHMpIHtcbiAgICB2YXIgb2JqLCBrO1xuXG4gICAgZnVuY3Rpb24gRigpIHt9XG4gICAgRi5wcm90b3R5cGUgPSBwcm90bztcbiAgICBvYmogPSBuZXcgRigpO1xuXG4gICAgZm9yIChrIGluIHByb3BzKSB7XG4gICAgICAgIGlmIChob3AuY2FsbChwcm9wcywgaykpIHtcbiAgICAgICAgICAgIGRlZmluZVByb3BlcnR5KG9iaiwgaywgcHJvcHNba10pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBhcnJJbmRleE9mID0gQXJyYXkucHJvdG90eXBlLmluZGV4T2YgfHwgZnVuY3Rpb24gKHNlYXJjaCwgZnJvbUluZGV4KSB7XG4gICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi9cbiAgICB2YXIgYXJyID0gdGhpcztcbiAgICBpZiAoIWFyci5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSBmcm9tSW5kZXggfHwgMCwgbWF4ID0gYXJyLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICAgIGlmIChhcnJbaV0gPT09IHNlYXJjaCkge1xuICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiB0b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuXG52YXIgZGF0ZU5vdyA9IERhdGUubm93IHx8IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG59O1xuZXhwb3J0cy5kZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5LCBleHBvcnRzLm9iakNyZWF0ZSA9IG9iakNyZWF0ZSwgZXhwb3J0cy5hcnJJbmRleE9mID0gYXJySW5kZXhPZiwgZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheSwgZXhwb3J0cy5kYXRlTm93ID0gZGF0ZU5vdztcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXM1LmpzLm1hcCIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtMjAxNSwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVc2UgaW52YXJpYW50KCkgdG8gYXNzZXJ0IHN0YXRlIHdoaWNoIHlvdXIgcHJvZ3JhbSBhc3N1bWVzIHRvIGJlIHRydWUuXG4gKlxuICogUHJvdmlkZSBzcHJpbnRmLXN0eWxlIGZvcm1hdCAob25seSAlcyBpcyBzdXBwb3J0ZWQpIGFuZCBhcmd1bWVudHNcbiAqIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBicm9rZSBhbmQgd2hhdCB5b3Ugd2VyZVxuICogZXhwZWN0aW5nLlxuICpcbiAqIFRoZSBpbnZhcmlhbnQgbWVzc2FnZSB3aWxsIGJlIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24sIGJ1dCB0aGUgaW52YXJpYW50XG4gKiB3aWxsIHJlbWFpbiB0byBlbnN1cmUgbG9naWMgZG9lcyBub3QgZGlmZmVyIGluIHByb2R1Y3Rpb24uXG4gKi9cblxudmFyIGludmFyaWFudCA9IGZ1bmN0aW9uKGNvbmRpdGlvbiwgZm9ybWF0LCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhcmlhbnQgcmVxdWlyZXMgYW4gZXJyb3IgbWVzc2FnZSBhcmd1bWVudCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29uZGl0aW9uKSB7XG4gICAgdmFyIGVycm9yO1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgICdNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCAnICtcbiAgICAgICAgJ2ZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuJ1xuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFyZ3MgPSBbYSwgYiwgYywgZCwgZSwgZl07XG4gICAgICB2YXIgYXJnSW5kZXggPSAwO1xuICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoXG4gICAgICAgIGZvcm1hdC5yZXBsYWNlKC8lcy9nLCBmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3NbYXJnSW5kZXgrK107IH0pXG4gICAgICApO1xuICAgICAgZXJyb3IubmFtZSA9ICdJbnZhcmlhbnQgVmlvbGF0aW9uJztcbiAgICB9XG5cbiAgICBlcnJvci5mcmFtZXNUb1BvcCA9IDE7IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgaW52YXJpYW50J3Mgb3duIGZyYW1lXG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaW52YXJpYW50O1xuIiwiLy8gU291cmNlOiBodHRwOi8vanNmaWRkbGUubmV0L3ZXeDhWL1xuLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81NjAzMTk1L2Z1bGwtbGlzdC1vZi1qYXZhc2NyaXB0LWtleWNvZGVzXG5cbi8qKlxuICogQ29uZW5pZW5jZSBtZXRob2QgcmV0dXJucyBjb3JyZXNwb25kaW5nIHZhbHVlIGZvciBnaXZlbiBrZXlOYW1lIG9yIGtleUNvZGUuXG4gKlxuICogQHBhcmFtIHtNaXhlZH0ga2V5Q29kZSB7TnVtYmVyfSBvciBrZXlOYW1lIHtTdHJpbmd9XG4gKiBAcmV0dXJuIHtNaXhlZH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oc2VhcmNoSW5wdXQpIHtcbiAgLy8gS2V5Ym9hcmQgRXZlbnRzXG4gIGlmIChzZWFyY2hJbnB1dCAmJiAnb2JqZWN0JyA9PT0gdHlwZW9mIHNlYXJjaElucHV0KSB7XG4gICAgdmFyIGhhc0tleUNvZGUgPSBzZWFyY2hJbnB1dC53aGljaCB8fCBzZWFyY2hJbnB1dC5rZXlDb2RlIHx8IHNlYXJjaElucHV0LmNoYXJDb2RlXG4gICAgaWYgKGhhc0tleUNvZGUpIHNlYXJjaElucHV0ID0gaGFzS2V5Q29kZVxuICB9XG5cbiAgLy8gTnVtYmVyc1xuICBpZiAoJ251bWJlcicgPT09IHR5cGVvZiBzZWFyY2hJbnB1dCkgcmV0dXJuIG5hbWVzW3NlYXJjaElucHV0XVxuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSAoY2FzdCB0byBzdHJpbmcpXG4gIHZhciBzZWFyY2ggPSBTdHJpbmcoc2VhcmNoSW5wdXQpXG5cbiAgLy8gY2hlY2sgY29kZXNcbiAgdmFyIGZvdW5kTmFtZWRLZXkgPSBjb2Rlc1tzZWFyY2gudG9Mb3dlckNhc2UoKV1cbiAgaWYgKGZvdW5kTmFtZWRLZXkpIHJldHVybiBmb3VuZE5hbWVkS2V5XG5cbiAgLy8gY2hlY2sgYWxpYXNlc1xuICB2YXIgZm91bmROYW1lZEtleSA9IGFsaWFzZXNbc2VhcmNoLnRvTG93ZXJDYXNlKCldXG4gIGlmIChmb3VuZE5hbWVkS2V5KSByZXR1cm4gZm91bmROYW1lZEtleVxuXG4gIC8vIHdlaXJkIGNoYXJhY3Rlcj9cbiAgaWYgKHNlYXJjaC5sZW5ndGggPT09IDEpIHJldHVybiBzZWFyY2guY2hhckNvZGVBdCgwKVxuXG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuLyoqXG4gKiBHZXQgYnkgbmFtZVxuICpcbiAqICAgZXhwb3J0cy5jb2RlWydlbnRlciddIC8vID0+IDEzXG4gKi9cblxudmFyIGNvZGVzID0gZXhwb3J0cy5jb2RlID0gZXhwb3J0cy5jb2RlcyA9IHtcbiAgJ2JhY2tzcGFjZSc6IDgsXG4gICd0YWInOiA5LFxuICAnZW50ZXInOiAxMyxcbiAgJ3NoaWZ0JzogMTYsXG4gICdjdHJsJzogMTcsXG4gICdhbHQnOiAxOCxcbiAgJ3BhdXNlL2JyZWFrJzogMTksXG4gICdjYXBzIGxvY2snOiAyMCxcbiAgJ2VzYyc6IDI3LFxuICAnc3BhY2UnOiAzMixcbiAgJ3BhZ2UgdXAnOiAzMyxcbiAgJ3BhZ2UgZG93bic6IDM0LFxuICAnZW5kJzogMzUsXG4gICdob21lJzogMzYsXG4gICdsZWZ0JzogMzcsXG4gICd1cCc6IDM4LFxuICAncmlnaHQnOiAzOSxcbiAgJ2Rvd24nOiA0MCxcbiAgJ2luc2VydCc6IDQ1LFxuICAnZGVsZXRlJzogNDYsXG4gICdjb21tYW5kJzogOTEsXG4gICdsZWZ0IGNvbW1hbmQnOiA5MSxcbiAgJ3JpZ2h0IGNvbW1hbmQnOiA5MyxcbiAgJ251bXBhZCAqJzogMTA2LFxuICAnbnVtcGFkICsnOiAxMDcsXG4gICdudW1wYWQgLSc6IDEwOSxcbiAgJ251bXBhZCAuJzogMTEwLFxuICAnbnVtcGFkIC8nOiAxMTEsXG4gICdudW0gbG9jayc6IDE0NCxcbiAgJ3Njcm9sbCBsb2NrJzogMTQ1LFxuICAnbXkgY29tcHV0ZXInOiAxODIsXG4gICdteSBjYWxjdWxhdG9yJzogMTgzLFxuICAnOyc6IDE4NixcbiAgJz0nOiAxODcsXG4gICcsJzogMTg4LFxuICAnLSc6IDE4OSxcbiAgJy4nOiAxOTAsXG4gICcvJzogMTkxLFxuICAnYCc6IDE5MixcbiAgJ1snOiAyMTksXG4gICdcXFxcJzogMjIwLFxuICAnXSc6IDIyMSxcbiAgXCInXCI6IDIyMlxufVxuXG4vLyBIZWxwZXIgYWxpYXNlc1xuXG52YXIgYWxpYXNlcyA9IGV4cG9ydHMuYWxpYXNlcyA9IHtcbiAgJ3dpbmRvd3MnOiA5MSxcbiAgJ+KHpyc6IDE2LFxuICAn4oylJzogMTgsXG4gICfijIMnOiAxNyxcbiAgJ+KMmCc6IDkxLFxuICAnY3RsJzogMTcsXG4gICdjb250cm9sJzogMTcsXG4gICdvcHRpb24nOiAxOCxcbiAgJ3BhdXNlJzogMTksXG4gICdicmVhayc6IDE5LFxuICAnY2Fwcyc6IDIwLFxuICAncmV0dXJuJzogMTMsXG4gICdlc2NhcGUnOiAyNyxcbiAgJ3NwYyc6IDMyLFxuICAncGd1cCc6IDMzLFxuICAncGdkbic6IDM0LFxuICAnaW5zJzogNDUsXG4gICdkZWwnOiA0NixcbiAgJ2NtZCc6IDkxXG59XG5cblxuLyohXG4gKiBQcm9ncmFtYXRpY2FsbHkgYWRkIHRoZSBmb2xsb3dpbmdcbiAqL1xuXG4vLyBsb3dlciBjYXNlIGNoYXJzXG5mb3IgKGkgPSA5NzsgaSA8IDEyMzsgaSsrKSBjb2Rlc1tTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGkgLSAzMlxuXG4vLyBudW1iZXJzXG5mb3IgKHZhciBpID0gNDg7IGkgPCA1ODsgaSsrKSBjb2Rlc1tpIC0gNDhdID0gaVxuXG4vLyBmdW5jdGlvbiBrZXlzXG5mb3IgKGkgPSAxOyBpIDwgMTM7IGkrKykgY29kZXNbJ2YnK2ldID0gaSArIDExMVxuXG4vLyBudW1wYWQga2V5c1xuZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIGNvZGVzWydudW1wYWQgJytpXSA9IGkgKyA5NlxuXG4vKipcbiAqIEdldCBieSBjb2RlXG4gKlxuICogICBleHBvcnRzLm5hbWVbMTNdIC8vID0+ICdFbnRlcidcbiAqL1xuXG52YXIgbmFtZXMgPSBleHBvcnRzLm5hbWVzID0gZXhwb3J0cy50aXRsZSA9IHt9IC8vIHRpdGxlIGZvciBiYWNrd2FyZCBjb21wYXRcblxuLy8gQ3JlYXRlIHJldmVyc2UgbWFwcGluZ1xuZm9yIChpIGluIGNvZGVzKSBuYW1lc1tjb2Rlc1tpXV0gPSBpXG5cbi8vIEFkZCBhbGlhc2VzXG5mb3IgKHZhciBhbGlhcyBpbiBhbGlhc2VzKSB7XG4gIGNvZGVzW2FsaWFzXSA9IGFsaWFzZXNbYWxpYXNdXG59XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGdldFJhd1RhZyA9IHJlcXVpcmUoJy4vX2dldFJhd1RhZycpLFxuICAgIG9iamVjdFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fb2JqZWN0VG9TdHJpbmcnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXSc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgfVxuICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgOiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldFRhZztcbiIsIi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnJlZUdsb2JhbDtcbiIsInZhciBvdmVyQXJnID0gcmVxdWlyZSgnLi9fb3ZlckFyZycpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBnZXRQcm90b3R5cGUgPSBvdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZXRQcm90b3R5cGU7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWcpLFxuICAgICAgdGFnID0gdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuXG4gIHRyeSB7XG4gICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdW5kZWZpbmVkO1xuICAgIHZhciB1bm1hc2tlZCA9IHRydWU7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdmFyIHJlc3VsdCA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICBpZiAodW5tYXNrZWQpIHtcbiAgICBpZiAoaXNPd24pIHtcbiAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHRhZztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRSYXdUYWc7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvYmplY3RUb1N0cmluZztcbiIsIi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG92ZXJBcmc7XG4iLCJ2YXIgZnJlZUdsb2JhbCA9IHJlcXVpcmUoJy4vX2ZyZWVHbG9iYWwnKTtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJvb3Q7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdExpa2U7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBnZXRQcm90b3R5cGUgPSByZXF1aXJlKCcuL19nZXRQcm90b3R5cGUnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0VGFnID0gJ1tvYmplY3QgT2JqZWN0XSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGUsXG4gICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovXG52YXIgZnVuY1RvU3RyaW5nID0gZnVuY1Byb3RvLnRvU3RyaW5nO1xuXG4vKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi9cbnZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5O1xuXG4vKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovXG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIHRoYXQgaXMsIGFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZVxuICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC44LjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGZ1bmN0aW9uIEZvbygpIHtcbiAqICAgdGhpcy5hID0gMTtcbiAqIH1cbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QobmV3IEZvbyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoeyAneCc6IDAsICd5JzogMCB9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzUGxhaW5PYmplY3QoT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8IGJhc2VHZXRUYWcodmFsdWUpICE9IG9iamVjdFRhZykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpO1xuICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgQ3RvciA9IGhhc093blByb3BlcnR5LmNhbGwocHJvdG8sICdjb25zdHJ1Y3RvcicpICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gdHlwZW9mIEN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBDdG9yIGluc3RhbmNlb2YgQ3RvciAmJlxuICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09IG9iamVjdEN0b3JTdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNQbGFpbk9iamVjdDtcbiIsIi8vIFRISVMgRklMRSBJUyBHRU5FUkFURUQgLSBETyBOT1QgRURJVCFcbi8qIW1vYmlsZS1kZXRlY3QgdjEuMy42IDIwMTctMDQtMDUqL1xuLypnbG9iYWwgbW9kdWxlOmZhbHNlLCBkZWZpbmU6ZmFsc2UqL1xuLypqc2hpbnQgbGF0ZWRlZjpmYWxzZSovXG4vKiFAbGljZW5zZSBDb3B5cmlnaHQgMjAxMywgSGVpbnJpY2ggR29lYmwsIExpY2Vuc2U6IE1JVCwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9oZ29lYmwvbW9iaWxlLWRldGVjdC5qcyovXG4oZnVuY3Rpb24gKGRlZmluZSwgdW5kZWZpbmVkKSB7XG5kZWZpbmUoZnVuY3Rpb24gKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBpbXBsID0ge307XG5cbiAgICBpbXBsLm1vYmlsZURldGVjdFJ1bGVzID0ge1xuICAgIFwicGhvbmVzXCI6IHtcbiAgICAgICAgXCJpUGhvbmVcIjogXCJcXFxcYmlQaG9uZVxcXFxifFxcXFxiaVBvZFxcXFxiXCIsXG4gICAgICAgIFwiQmxhY2tCZXJyeVwiOiBcIkJsYWNrQmVycnl8XFxcXGJCQjEwXFxcXGJ8cmltWzAtOV0rXCIsXG4gICAgICAgIFwiSFRDXCI6IFwiSFRDfEhUQy4qKFNlbnNhdGlvbnxFdm98VmlzaW9ufEV4cGxvcmVyfDY4MDB8ODEwMHw4OTAwfEE3MjcyfFM1MTBlfEMxMTBlfExlZ2VuZHxEZXNpcmV8VDgyODIpfEFQWDUxNUNLVHxRdGVrOTA5MHxBUEE5MjkyS1R8SERfbWluaXxTZW5zYXRpb24uKlo3MTBlfFBHODYxMDB8WjcxNWV8RGVzaXJlLiooQTgxODF8SEQpfEFEUjYyMDB8QURSNjQwMEx8QURSNjQyNXwwMDFIVHxJbnNwaXJlIDRHfEFuZHJvaWQuKlxcXFxiRVZPXFxcXGJ8VC1Nb2JpbGUgRzF8WjUyMG1cIixcbiAgICAgICAgXCJOZXh1c1wiOiBcIk5leHVzIE9uZXxOZXh1cyBTfEdhbGF4eS4qTmV4dXN8QW5kcm9pZC4qTmV4dXMuKk1vYmlsZXxOZXh1cyA0fE5leHVzIDV8TmV4dXMgNlwiLFxuICAgICAgICBcIkRlbGxcIjogXCJEZWxsLipTdHJlYWt8RGVsbC4qQWVyb3xEZWxsLipWZW51ZXxERUxMLipWZW51ZSBQcm98RGVsbCBGbGFzaHxEZWxsIFNtb2tlfERlbGwgTWluaSAzaVh8WENEMjh8WENEMzV8XFxcXGIwMDFETFxcXFxifFxcXFxiMTAxRExcXFxcYnxcXFxcYkdTMDFcXFxcYlwiLFxuICAgICAgICBcIk1vdG9yb2xhXCI6IFwiTW90b3JvbGF8RFJPSURYfERST0lEIEJJT05JQ3xcXFxcYkRyb2lkXFxcXGIuKkJ1aWxkfEFuZHJvaWQuKlhvb218SFJJMzl8TU9ULXxBMTI2MHxBMTY4MHxBNTU1fEE4NTN8QTg1NXxBOTUzfEE5NTV8QTk1NnxNb3Rvcm9sYS4qRUxFQ1RSSUZZfE1vdG9yb2xhLippMXxpODY3fGk5NDB8TUIyMDB8TUIzMDB8TUI1MDF8TUI1MDJ8TUI1MDh8TUI1MTF8TUI1MjB8TUI1MjV8TUI1MjZ8TUI2MTF8TUI2MTJ8TUI2MzJ8TUI4MTB8TUI4NTV8TUI4NjB8TUI4NjF8TUI4NjV8TUI4NzB8TUU1MDF8TUU1MDJ8TUU1MTF8TUU1MjV8TUU2MDB8TUU2MzJ8TUU3MjJ8TUU4MTF8TUU4NjB8TUU4NjN8TUU4NjV8TVQ2MjB8TVQ3MTB8TVQ3MTZ8TVQ3MjB8TVQ4MTB8TVQ4NzB8TVQ5MTd8TW90b3JvbGEuKlRJVEFOSVVNfFdYNDM1fFdYNDQ1fFhUMzAwfFhUMzAxfFhUMzExfFhUMzE2fFhUMzE3fFhUMzE5fFhUMzIwfFhUMzkwfFhUNTAyfFhUNTMwfFhUNTMxfFhUNTMyfFhUNTM1fFhUNjAzfFhUNjEwfFhUNjExfFhUNjE1fFhUNjgxfFhUNzAxfFhUNzAyfFhUNzExfFhUNzIwfFhUODAwfFhUODA2fFhUODYwfFhUODYyfFhUODc1fFhUODgyfFhUODgzfFhUODk0fFhUOTAxfFhUOTA3fFhUOTA5fFhUOTEwfFhUOTEyfFhUOTI4fFhUOTI2fFhUOTE1fFhUOTE5fFhUOTI1fFhUMTAyMXxcXFxcYk1vdG8gRVxcXFxiXCIsXG4gICAgICAgIFwiU2Ftc3VuZ1wiOiBcIlxcXFxiU2Ftc3VuZ1xcXFxifFNNLUc5MjUwfEdULTE5MzAwfFNHSC1JMzM3fEJHVC1TNTIzMHxHVC1CMjEwMHxHVC1CMjcwMHxHVC1CMjcxMHxHVC1CMzIxMHxHVC1CMzMxMHxHVC1CMzQxMHxHVC1CMzczMHxHVC1CMzc0MHxHVC1CNTUxMHxHVC1CNTUxMnxHVC1CNTcyMnxHVC1CNjUyMHxHVC1CNzMwMHxHVC1CNzMyMHxHVC1CNzMzMHxHVC1CNzM1MHxHVC1CNzUxMHxHVC1CNzcyMnxHVC1CNzgwMHxHVC1DMzAxMHxHVC1DMzAxMXxHVC1DMzA2MHxHVC1DMzIwMHxHVC1DMzIxMnxHVC1DMzIxMkl8R1QtQzMyNjJ8R1QtQzMyMjJ8R1QtQzMzMDB8R1QtQzMzMDBLfEdULUMzMzAzfEdULUMzMzAzS3xHVC1DMzMxMHxHVC1DMzMyMnxHVC1DMzMzMHxHVC1DMzM1MHxHVC1DMzUwMHxHVC1DMzUxMHxHVC1DMzUzMHxHVC1DMzYzMHxHVC1DMzc4MHxHVC1DNTAxMHxHVC1DNTIxMnxHVC1DNjYyMHxHVC1DNjYyNXxHVC1DNjcxMnxHVC1FMTA1MHxHVC1FMTA3MHxHVC1FMTA3NXxHVC1FMTA4MHxHVC1FMTA4MXxHVC1FMTA4NXxHVC1FMTA4N3xHVC1FMTEwMHxHVC1FMTEwN3xHVC1FMTExMHxHVC1FMTEyMHxHVC1FMTEyNXxHVC1FMTEzMHxHVC1FMTE2MHxHVC1FMTE3MHxHVC1FMTE3NXxHVC1FMTE4MHxHVC1FMTE4MnxHVC1FMTIwMHxHVC1FMTIxMHxHVC1FMTIyNXxHVC1FMTIzMHxHVC1FMTM5MHxHVC1FMjEwMHxHVC1FMjEyMHxHVC1FMjEyMXxHVC1FMjE1MnxHVC1FMjIyMHxHVC1FMjIyMnxHVC1FMjIzMHxHVC1FMjIzMnxHVC1FMjI1MHxHVC1FMjM3MHxHVC1FMjU1MHxHVC1FMjY1MnxHVC1FMzIxMHxHVC1FMzIxM3xHVC1JNTUwMHxHVC1JNTUwM3xHVC1JNTcwMHxHVC1JNTgwMHxHVC1JNTgwMXxHVC1JNjQxMHxHVC1JNjQyMHxHVC1JNzExMHxHVC1JNzQxMHxHVC1JNzUwMHxHVC1JODAwMHxHVC1JODE1MHxHVC1JODE2MHxHVC1JODE5MHxHVC1JODMyMHxHVC1JODMzMHxHVC1JODM1MHxHVC1JODUzMHxHVC1JODcwMHxHVC1JODcwM3xHVC1JODkxMHxHVC1JOTAwMHxHVC1JOTAwMXxHVC1JOTAwM3xHVC1JOTAxMHxHVC1JOTAyMHxHVC1JOTAyM3xHVC1JOTA3MHxHVC1JOTA4MnxHVC1JOTEwMHxHVC1JOTEwM3xHVC1JOTIyMHxHVC1JOTI1MHxHVC1JOTMwMHxHVC1JOTMwNXxHVC1JOTUwMHxHVC1JOTUwNXxHVC1NMzUxMHxHVC1NNTY1MHxHVC1NNzUwMHxHVC1NNzYwMHxHVC1NNzYwM3xHVC1NODgwMHxHVC1NODkxMHxHVC1ONzAwMHxHVC1TMzExMHxHVC1TMzMxMHxHVC1TMzM1MHxHVC1TMzM1M3xHVC1TMzM3MHxHVC1TMzY1MHxHVC1TMzY1M3xHVC1TMzc3MHxHVC1TMzg1MHxHVC1TNTIxMHxHVC1TNTIyMHxHVC1TNTIyOXxHVC1TNTIzMHxHVC1TNTIzM3xHVC1TNTI1MHxHVC1TNTI1M3xHVC1TNTI2MHxHVC1TNTI2M3xHVC1TNTI3MHxHVC1TNTMwMHxHVC1TNTMzMHxHVC1TNTM1MHxHVC1TNTM2MHxHVC1TNTM2M3xHVC1TNTM2OXxHVC1TNTM4MHxHVC1TNTM4MER8R1QtUzU1NjB8R1QtUzU1NzB8R1QtUzU2MDB8R1QtUzU2MDN8R1QtUzU2MTB8R1QtUzU2MjB8R1QtUzU2NjB8R1QtUzU2NzB8R1QtUzU2OTB8R1QtUzU3NTB8R1QtUzU3ODB8R1QtUzU4MzB8R1QtUzU4Mzl8R1QtUzYxMDJ8R1QtUzY1MDB8R1QtUzcwNzB8R1QtUzcyMDB8R1QtUzcyMjB8R1QtUzcyMzB8R1QtUzcyMzN8R1QtUzcyNTB8R1QtUzc1MDB8R1QtUzc1MzB8R1QtUzc1NTB8R1QtUzc1NjJ8R1QtUzc3MTB8R1QtUzgwMDB8R1QtUzgwMDN8R1QtUzg1MDB8R1QtUzg1MzB8R1QtUzg2MDB8U0NILUEzMTB8U0NILUE1MzB8U0NILUE1NzB8U0NILUE2MTB8U0NILUE2MzB8U0NILUE2NTB8U0NILUE3OTB8U0NILUE3OTV8U0NILUE4NTB8U0NILUE4NzB8U0NILUE4OTB8U0NILUE5MzB8U0NILUE5NTB8U0NILUE5NzB8U0NILUE5OTB8U0NILUkxMDB8U0NILUkxMTB8U0NILUk0MDB8U0NILUk0MDV8U0NILUk1MDB8U0NILUk1MTB8U0NILUk1MTV8U0NILUk2MDB8U0NILUk3MzB8U0NILUk3NjB8U0NILUk3NzB8U0NILUk4MzB8U0NILUk5MTB8U0NILUk5MjB8U0NILUk5NTl8U0NILUxDMTF8U0NILU4xNTB8U0NILU4zMDB8U0NILVIxMDB8U0NILVIzMDB8U0NILVIzNTF8U0NILVI0MDB8U0NILVI0MTB8U0NILVQzMDB8U0NILVUzMTB8U0NILVUzMjB8U0NILVUzNTB8U0NILVUzNjB8U0NILVUzNjV8U0NILVUzNzB8U0NILVUzODB8U0NILVU0MTB8U0NILVU0MzB8U0NILVU0NTB8U0NILVU0NjB8U0NILVU0NzB8U0NILVU0OTB8U0NILVU1NDB8U0NILVU1NTB8U0NILVU2MjB8U0NILVU2NDB8U0NILVU2NTB8U0NILVU2NjB8U0NILVU3MDB8U0NILVU3NDB8U0NILVU3NTB8U0NILVU4MTB8U0NILVU4MjB8U0NILVU5MDB8U0NILVU5NDB8U0NILVU5NjB8U0NTLTI2VUN8U0dILUExMDd8U0dILUExMTd8U0dILUExMjd8U0dILUExMzd8U0dILUExNTd8U0dILUExNjd8U0dILUExNzd8U0dILUExODd8U0dILUExOTd8U0dILUEyMjd8U0dILUEyMzd8U0dILUEyNTd8U0dILUE0Mzd8U0dILUE1MTd8U0dILUE1OTd8U0dILUE2Mzd8U0dILUE2NTd8U0dILUE2Njd8U0dILUE2ODd8U0dILUE2OTd8U0dILUE3MDd8U0dILUE3MTd8U0dILUE3Mjd8U0dILUE3Mzd8U0dILUE3NDd8U0dILUE3Njd8U0dILUE3Nzd8U0dILUE3OTd8U0dILUE4MTd8U0dILUE4Mjd8U0dILUE4Mzd8U0dILUE4NDd8U0dILUE4Njd8U0dILUE4Nzd8U0dILUE4ODd8U0dILUE4OTd8U0dILUE5Mjd8U0dILUIxMDB8U0dILUIxMzB8U0dILUIyMDB8U0dILUIyMjB8U0dILUMxMDB8U0dILUMxMTB8U0dILUMxMjB8U0dILUMxMzB8U0dILUMxNDB8U0dILUMxNjB8U0dILUMxNzB8U0dILUMxODB8U0dILUMyMDB8U0dILUMyMDd8U0dILUMyMTB8U0dILUMyMjV8U0dILUMyMzB8U0dILUM0MTd8U0dILUM0NTB8U0dILUQzMDd8U0dILUQzNDd8U0dILUQzNTd8U0dILUQ0MDd8U0dILUQ0MTV8U0dILUQ3ODB8U0dILUQ4MDd8U0dILUQ5ODB8U0dILUUxMDV8U0dILUUyMDB8U0dILUUzMTV8U0dILUUzMTZ8U0dILUUzMTd8U0dILUUzMzV8U0dILUU1OTB8U0dILUU2MzV8U0dILUU3MTV8U0dILUU4OTB8U0dILUYzMDB8U0dILUY0ODB8U0dILUkyMDB8U0dILUkzMDB8U0dILUkzMjB8U0dILUk1NTB8U0dILUk1Nzd8U0dILUk2MDB8U0dILUk2MDd8U0dILUk2MTd8U0dILUk2Mjd8U0dILUk2Mzd8U0dILUk2Nzd8U0dILUk3MDB8U0dILUk3MTd8U0dILUk3Mjd8U0dILWk3NDdNfFNHSC1JNzc3fFNHSC1JNzgwfFNHSC1JODI3fFNHSC1JODQ3fFNHSC1JODU3fFNHSC1JODk2fFNHSC1JODk3fFNHSC1JOTAwfFNHSC1JOTA3fFNHSC1JOTE3fFNHSC1JOTI3fFNHSC1JOTM3fFNHSC1JOTk3fFNHSC1KMTUwfFNHSC1KMjAwfFNHSC1MMTcwfFNHSC1MNzAwfFNHSC1NMTEwfFNHSC1NMTUwfFNHSC1NMjAwfFNHSC1OMTA1fFNHSC1ONTAwfFNHSC1ONjAwfFNHSC1ONjIwfFNHSC1ONjI1fFNHSC1ONzAwfFNHSC1ONzEwfFNHSC1QMTA3fFNHSC1QMjA3fFNHSC1QMzAwfFNHSC1QMzEwfFNHSC1QNTIwfFNHSC1QNzM1fFNHSC1QNzc3fFNHSC1RMTA1fFNHSC1SMjEwfFNHSC1SMjIwfFNHSC1SMjI1fFNHSC1TMTA1fFNHSC1TMzA3fFNHSC1UMTA5fFNHSC1UMTE5fFNHSC1UMTM5fFNHSC1UMjA5fFNHSC1UMjE5fFNHSC1UMjI5fFNHSC1UMjM5fFNHSC1UMjQ5fFNHSC1UMjU5fFNHSC1UMzA5fFNHSC1UMzE5fFNHSC1UMzI5fFNHSC1UMzM5fFNHSC1UMzQ5fFNHSC1UMzU5fFNHSC1UMzY5fFNHSC1UMzc5fFNHSC1UNDA5fFNHSC1UNDI5fFNHSC1UNDM5fFNHSC1UNDU5fFNHSC1UNDY5fFNHSC1UNDc5fFNHSC1UNDk5fFNHSC1UNTA5fFNHSC1UNTE5fFNHSC1UNTM5fFNHSC1UNTU5fFNHSC1UNTg5fFNHSC1UNjA5fFNHSC1UNjE5fFNHSC1UNjI5fFNHSC1UNjM5fFNHSC1UNjU5fFNHSC1UNjY5fFNHSC1UNjc5fFNHSC1UNzA5fFNHSC1UNzE5fFNHSC1UNzI5fFNHSC1UNzM5fFNHSC1UNzQ2fFNHSC1UNzQ5fFNHSC1UNzU5fFNHSC1UNzY5fFNHSC1UODA5fFNHSC1UODE5fFNHSC1UODM5fFNHSC1UOTE5fFNHSC1UOTI5fFNHSC1UOTM5fFNHSC1UOTU5fFNHSC1UOTg5fFNHSC1VMTAwfFNHSC1VMjAwfFNHSC1VODAwfFNHSC1WMjA1fFNHSC1WMjA2fFNHSC1YMTAwfFNHSC1YMTA1fFNHSC1YMTIwfFNHSC1YMTQwfFNHSC1YNDI2fFNHSC1YNDI3fFNHSC1YNDc1fFNHSC1YNDk1fFNHSC1YNDk3fFNHSC1YNTA3fFNHSC1YNjAwfFNHSC1YNjEwfFNHSC1YNjIwfFNHSC1YNjMwfFNHSC1YNzAwfFNHSC1YODIwfFNHSC1YODkwfFNHSC1aMTMwfFNHSC1aMTUwfFNHSC1aMTcwfFNHSC1aWDEwfFNHSC1aWDIwfFNIVy1NMTEwfFNQSC1BMTIwfFNQSC1BNDAwfFNQSC1BNDIwfFNQSC1BNDYwfFNQSC1BNTAwfFNQSC1BNTYwfFNQSC1BNjAwfFNQSC1BNjIwfFNQSC1BNjYwfFNQSC1BNzAwfFNQSC1BNzQwfFNQSC1BNzYwfFNQSC1BNzkwfFNQSC1BODAwfFNQSC1BODIwfFNQSC1BODQwfFNQSC1BODgwfFNQSC1BOTAwfFNQSC1BOTQwfFNQSC1BOTYwfFNQSC1ENjAwfFNQSC1ENzAwfFNQSC1ENzEwfFNQSC1ENzIwfFNQSC1JMzAwfFNQSC1JMzI1fFNQSC1JMzMwfFNQSC1JMzUwfFNQSC1JNTAwfFNQSC1JNjAwfFNQSC1JNzAwfFNQSC1MNzAwfFNQSC1NMTAwfFNQSC1NMjIwfFNQSC1NMjQwfFNQSC1NMzAwfFNQSC1NMzA1fFNQSC1NMzIwfFNQSC1NMzMwfFNQSC1NMzUwfFNQSC1NMzYwfFNQSC1NMzcwfFNQSC1NMzgwfFNQSC1NNTEwfFNQSC1NNTQwfFNQSC1NNTUwfFNQSC1NNTYwfFNQSC1NNTcwfFNQSC1NNTgwfFNQSC1NNjEwfFNQSC1NNjIwfFNQSC1NNjMwfFNQSC1NODAwfFNQSC1NODEwfFNQSC1NODUwfFNQSC1NOTAwfFNQSC1NOTEwfFNQSC1NOTIwfFNQSC1NOTMwfFNQSC1OMTAwfFNQSC1OMjAwfFNQSC1OMjQwfFNQSC1OMzAwfFNQSC1ONDAwfFNQSC1aNDAwfFNXQy1FMTAwfFNDSC1pOTA5fEdULU43MTAwfEdULU43MTA1fFNDSC1JNTM1fFNNLU45MDBBfFNHSC1JMzE3fFNHSC1UOTk5THxHVC1TNTM2MEJ8R1QtSTgyNjJ8R1QtUzY4MDJ8R1QtUzYzMTJ8R1QtUzYzMTB8R1QtUzUzMTJ8R1QtUzUzMTB8R1QtSTkxMDV8R1QtSTg1MTB8R1QtUzY3OTBOfFNNLUc3MTA1fFNNLU45MDA1fEdULVM1MzAxfEdULUk5Mjk1fEdULUk5MTk1fFNNLUMxMDF8R1QtUzczOTJ8R1QtUzc1NjB8R1QtQjc2MTB8R1QtSTU1MTB8R1QtUzc1ODJ8R1QtUzc1MzBFfEdULUk4NzUwfFNNLUc5MDA2VnxTTS1HOTAwOFZ8U00tRzkwMDlEfFNNLUc5MDBBfFNNLUc5MDBEfFNNLUc5MDBGfFNNLUc5MDBIfFNNLUc5MDBJfFNNLUc5MDBKfFNNLUc5MDBLfFNNLUc5MDBMfFNNLUc5MDBNfFNNLUc5MDBQfFNNLUc5MDBSNHxTTS1HOTAwU3xTTS1HOTAwVHxTTS1HOTAwVnxTTS1HOTAwVzh8U0hWLUUxNjBLfFNDSC1QNzA5fFNDSC1QNzI5fFNNLVQyNTU4fEdULUk5MjA1fFNNLUc5MzUwfFNNLUoxMjBGfFNNLUc5MjBGfFNNLUc5MjBWfFNNLUc5MzBGfFNNLU45MTBDXCIsXG4gICAgICAgIFwiTEdcIjogXCJcXFxcYkxHXFxcXGI7fExHWy0gXT8oQzgwMHxDOTAwfEU0MDB8RTYxMHxFOTAwfEUtOTAwfEYxNjB8RjE4MEt8RjE4MEx8RjE4MFN8NzMwfDg1NXxMMTYwfExTNzQwfExTODQwfExTOTcwfExVNjIwMHxNUzY5MHxNUzY5NXxNUzc3MHxNUzg0MHxNUzg3MHxNUzkxMHxQNTAwfFA3MDB8UDcwNXxWTTY5NnxBUzY4MHxBUzY5NXxBWDg0MHxDNzI5fEU5NzB8R1M1MDV8MjcyfEMzOTV8RTczOUJLfEU5NjB8TDU1Q3xMNzVDfExTNjk2fExTODYwfFA3NjlCS3xQMzUwfFA1MDB8UDUwOXxQODcwfFVOMjcyfFVTNzMwfFZTODQwfFZTOTUwfExOMjcyfExONTEwfExTNjcwfExTODU1fExXNjkwfE1OMjcwfE1ONTEwfFA1MDl8UDc2OXxQOTMwfFVOMjAwfFVOMjcwfFVONTEwfFVONjEwfFVTNjcwfFVTNzQwfFVTNzYwfFVYMjY1fFVYODQwfFZOMjcxfFZONTMwfFZTNjYwfFZTNzAwfFZTNzQwfFZTNzUwfFZTOTEwfFZTOTIwfFZTOTMwfFZYOTIwMHxWWDExMDAwfEFYODQwQXxMVzc3MHxQNTA2fFA5MjV8UDk5OXxFNjEyfEQ5NTV8RDgwMnxNUzMyMylcIixcbiAgICAgICAgXCJTb255XCI6IFwiU29ueVNUfFNvbnlMVHxTb255RXJpY3Nzb258U29ueUVyaWNzc29uTFQxNWl2fExUMThpfEUxMGl8TFQyOGh8TFQyNnd8U29ueUVyaWNzc29uTVQyN2l8QzUzMDN8QzY5MDJ8QzY5MDN8QzY5MDZ8QzY5NDN8RDI1MzNcIixcbiAgICAgICAgXCJBc3VzXCI6IFwiQXN1cy4qR2FsYXh5fFBhZEZvbmUuKk1vYmlsZVwiLFxuICAgICAgICBcIk5va2lhTHVtaWFcIjogXCJMdW1pYSBbMC05XXszLDR9XCIsXG4gICAgICAgIFwiTWljcm9tYXhcIjogXCJNaWNyb21heC4qXFxcXGIoQTIxMHxBOTJ8QTg4fEE3MnxBMTExfEExMTBRfEExMTV8QTExNnxBMTEwfEE5MFN8QTI2fEE1MXxBMzV8QTU0fEEyNXxBMjd8QTg5fEE2OHxBNjV8QTU3fEE5MClcXFxcYlwiLFxuICAgICAgICBcIlBhbG1cIjogXCJQYWxtU291cmNlfFBhbG1cIixcbiAgICAgICAgXCJWZXJ0dVwiOiBcIlZlcnR1fFZlcnR1LipMdGR8VmVydHUuKkFzY2VudHxWZXJ0dS4qQXl4dGF8VmVydHUuKkNvbnN0ZWxsYXRpb24oRnxRdWVzdCk/fFZlcnR1LipNb25pa2F8VmVydHUuKlNpZ25hdHVyZVwiLFxuICAgICAgICBcIlBhbnRlY2hcIjogXCJQQU5URUNIfElNLUE4NTBTfElNLUE4NDBTfElNLUE4MzBMfElNLUE4MzBLfElNLUE4MzBTfElNLUE4MjBMfElNLUE4MTBLfElNLUE4MTBTfElNLUE4MDBTfElNLVQxMDBLfElNLUE3MjVMfElNLUE3ODBMfElNLUE3NzVDfElNLUE3NzBLfElNLUE3NjBTfElNLUE3NTBLfElNLUE3NDBTfElNLUE3MzBTfElNLUE3MjBMfElNLUE3MTBLfElNLUE2OTBMfElNLUE2OTBTfElNLUE2NTBTfElNLUE2MzBLfElNLUE2MDBTfFZFR0EgUFRMMjF8UFQwMDN8UDgwMTB8QURSOTEwTHxQNjAzMHxQNjAyMHxQOTA3MHxQNDEwMHxQOTA2MHxQNTAwMHxDRE04OTkyfFRYVDgwNDV8QURSODk5NXxJUzExUFR8UDIwMzB8UDYwMTB8UDgwMDB8UFQwMDJ8SVMwNnxDRE04OTk5fFA5MDUwfFBUMDAxfFRYVDgwNDB8UDIwMjB8UDkwMjB8UDIwMDB8UDcwNDB8UDcwMDB8Qzc5MFwiLFxuICAgICAgICBcIkZseVwiOiBcIklRMjMwfElRNDQ0fElRNDUwfElRNDQwfElRNDQyfElRNDQxfElRMjQ1fElRMjU2fElRMjM2fElRMjU1fElRMjM1fElRMjQ1fElRMjc1fElRMjQwfElRMjg1fElRMjgwfElRMjcwfElRMjYwfElRMjUwXCIsXG4gICAgICAgIFwiV2lrb1wiOiBcIktJVEUgNEd8SElHSFdBWXxHRVRBV0FZfFNUQUlSV0FZfERBUktTSURFfERBUktGVUxMfERBUktOSUdIVHxEQVJLTU9PTnxTTElERXxXQVggNEd8UkFJTkJPV3xCTE9PTXxTVU5TRVR8R09BKD8hbm5hKXxMRU5OWXxCQVJSWXxJR0dZfE9aWll8Q0lOSyBGSVZFfENJTksgUEVBWHxDSU5LIFBFQVggMnxDSU5LIFNMSU18Q0lOSyBTTElNIDJ8Q0lOSyArfENJTksgS0lOR3xDSU5LIFBFQVh8Q0lOSyBTTElNfFNVQkxJTVwiLFxuICAgICAgICBcImlNb2JpbGVcIjogXCJpLW1vYmlsZSAoSVF8aS1TVFlMRXxpZGVhfFpBQXxIaXR6KVwiLFxuICAgICAgICBcIlNpbVZhbGxleVwiOiBcIlxcXFxiKFNQLTgwfFhULTkzMHxTWC0zNDB8WFQtOTMwfFNYLTMxMHxTUC0zNjB8U1A2MHxTUFQtODAwfFNQLTEyMHxTUFQtODAwfFNQLTE0MHxTUFgtNXxTUFgtOHxTUC0xMDB8U1BYLTh8U1BYLTEyKVxcXFxiXCIsXG4gICAgICAgIFwiV29sZmdhbmdcIjogXCJBVC1CMjREfEFULUFTNTBIRHxBVC1BUzQwV3xBVC1BUzU1SER8QVQtQVM0NXEyfEFULUIyNkR8QVQtQVM1MFFcIixcbiAgICAgICAgXCJBbGNhdGVsXCI6IFwiQWxjYXRlbFwiLFxuICAgICAgICBcIk5pbnRlbmRvXCI6IFwiTmludGVuZG8gM0RTXCIsXG4gICAgICAgIFwiQW1vaVwiOiBcIkFtb2lcIixcbiAgICAgICAgXCJJTlFcIjogXCJJTlFcIixcbiAgICAgICAgXCJHZW5lcmljUGhvbmVcIjogXCJUYXBhdGFsa3xQREE7fFNBR0VNfFxcXFxibW1wXFxcXGJ8cG9ja2V0fFxcXFxicHNwXFxcXGJ8c3ltYmlhbnxTbWFydHBob25lfHNtYXJ0Zm9ufHRyZW98dXAuYnJvd3Nlcnx1cC5saW5rfHZvZGFmb25lfFxcXFxid2FwXFxcXGJ8bm9raWF8U2VyaWVzNDB8U2VyaWVzNjB8UzYwfFNvbnlFcmljc3NvbnxOOTAwfE1BVUkuKldBUC4qQnJvd3NlclwiXG4gICAgfSxcbiAgICBcInRhYmxldHNcIjoge1xuICAgICAgICBcImlQYWRcIjogXCJpUGFkfGlQYWQuKk1vYmlsZVwiLFxuICAgICAgICBcIk5leHVzVGFibGV0XCI6IFwiQW5kcm9pZC4qTmV4dXNbXFxcXHNdKyg3fDl8MTApXCIsXG4gICAgICAgIFwiU2Ftc3VuZ1RhYmxldFwiOiBcIlNBTVNVTkcuKlRhYmxldHxHYWxheHkuKlRhYnxTQy0wMUN8R1QtUDEwMDB8R1QtUDEwMDN8R1QtUDEwMTB8R1QtUDMxMDV8R1QtUDYyMTB8R1QtUDY4MDB8R1QtUDY4MTB8R1QtUDcxMDB8R1QtUDczMDB8R1QtUDczMTB8R1QtUDc1MDB8R1QtUDc1MTB8U0NILUk4MDB8U0NILUk4MTV8U0NILUk5MDV8U0dILUk5NTd8U0dILUk5ODd8U0dILVQ4NDl8U0dILVQ4NTl8U0dILVQ4Njl8U1BILVAxMDB8R1QtUDMxMDB8R1QtUDMxMDh8R1QtUDMxMTB8R1QtUDUxMDB8R1QtUDUxMTB8R1QtUDYyMDB8R1QtUDczMjB8R1QtUDc1MTF8R1QtTjgwMDB8R1QtUDg1MTB8U0dILUk0OTd8U1BILVA1MDB8U0dILVQ3Nzl8U0NILUk3MDV8U0NILUk5MTV8R1QtTjgwMTN8R1QtUDMxMTN8R1QtUDUxMTN8R1QtUDgxMTB8R1QtTjgwMTB8R1QtTjgwMDV8R1QtTjgwMjB8R1QtUDEwMTN8R1QtUDYyMDF8R1QtUDc1MDF8R1QtTjUxMDB8R1QtTjUxMDV8R1QtTjUxMTB8U0hWLUUxNDBLfFNIVi1FMTQwTHxTSFYtRTE0MFN8U0hWLUUxNTBTfFNIVi1FMjMwS3xTSFYtRTIzMEx8U0hWLUUyMzBTfFNIVy1NMTgwS3xTSFctTTE4MEx8U0hXLU0xODBTfFNIVy1NMTgwV3xTSFctTTMwMFd8U0hXLU0zMDVXfFNIVy1NMzgwS3xTSFctTTM4MFN8U0hXLU0zODBXfFNIVy1NNDMwV3xTSFctTTQ4MEt8U0hXLU00ODBTfFNIVy1NNDgwV3xTSFctTTQ4NVd8U0hXLU00ODZXfFNIVy1NNTAwV3xHVC1JOTIyOHxTQ0gtUDczOXxTQ0gtSTkyNXxHVC1JOTIwMHxHVC1QNTIwMHxHVC1QNTIxMHxHVC1QNTIxMFh8U00tVDMxMXxTTS1UMzEwfFNNLVQzMTBYfFNNLVQyMTB8U00tVDIxMFJ8U00tVDIxMXxTTS1QNjAwfFNNLVA2MDF8U00tUDYwNXxTTS1QOTAwfFNNLVA5MDF8U00tVDIxN3xTTS1UMjE3QXxTTS1UMjE3U3xTTS1QNjAwMHxTTS1UMzEwMHxTR0gtSTQ2N3xYRTUwMHxTTS1UMTEwfEdULVA1MjIwfEdULUk5MjAwWHxHVC1ONTExMFh8R1QtTjUxMjB8U00tUDkwNXxTTS1UMTExfFNNLVQyMTA1fFNNLVQzMTV8U00tVDMyMHxTTS1UMzIwWHxTTS1UMzIxfFNNLVQ1MjB8U00tVDUyNXxTTS1UNTMwTlV8U00tVDIzME5VfFNNLVQzMzBOVXxTTS1UOTAwfFhFNTAwVDFDfFNNLVA2MDVWfFNNLVA5MDVWfFNNLVQzMzdWfFNNLVQ1MzdWfFNNLVQ3MDdWfFNNLVQ4MDdWfFNNLVA2MDBYfFNNLVA5MDBYfFNNLVQyMTBYfFNNLVQyMzB8U00tVDIzMFh8U00tVDMyNXxHVC1QNzUwM3xTTS1UNTMxfFNNLVQzMzB8U00tVDUzMHxTTS1UNzA1fFNNLVQ3MDVDfFNNLVQ1MzV8U00tVDMzMXxTTS1UODAwfFNNLVQ3MDB8U00tVDUzN3xTTS1UODA3fFNNLVA5MDdBfFNNLVQzMzdBfFNNLVQ1MzdBfFNNLVQ3MDdBfFNNLVQ4MDdBfFNNLVQyMzd8U00tVDgwN1B8U00tUDYwN1R8U00tVDIxN1R8U00tVDMzN1R8U00tVDgwN1R8U00tVDExNk5RfFNNLVA1NTB8U00tVDM1MHxTTS1UNTUwfFNNLVQ5MDAwfFNNLVA5MDAwfFNNLVQ3MDVZfFNNLVQ4MDV8R1QtUDMxMTN8U00tVDcxMHxTTS1UODEwfFNNLVQ4MTV8U00tVDM2MHxTTS1UNTMzfFNNLVQxMTN8U00tVDMzNXxTTS1UNzE1fFNNLVQ1NjB8U00tVDY3MHxTTS1UNjc3fFNNLVQzNzd8U00tVDU2N3xTTS1UMzU3VHxTTS1UNTU1fFNNLVQ1NjF8U00tVDcxM3xTTS1UNzE5fFNNLVQ4MTN8U00tVDgxOXxTTS1UNTgwfFNNLVQzNTVZfFNNLVQyODB8U00tVDgxN0F8U00tVDgyMHxTTS1XNzAwfFNNLVA1ODB8U00tVDU4N1wiLFxuICAgICAgICBcIktpbmRsZVwiOiBcIktpbmRsZXxTaWxrLipBY2NlbGVyYXRlZHxBbmRyb2lkLipcXFxcYihLRk9UfEtGVFR8S0ZKV0l8S0ZKV0F8S0ZPVEV8S0ZTT1dJfEtGVEhXSXxLRlRIV0F8S0ZBUFdJfEtGQVBXQXxXRkpXQUV8S0ZTQVdBfEtGU0FXSXxLRkFTV0l8S0ZBUldJfEtGRk9XSXxLRkdJV0l8S0ZNRVdJKVxcXFxifEFuZHJvaWQuKlNpbGtcXC9bMC05Ll0rIGxpa2UgQ2hyb21lXFwvWzAtOS5dKyAoPyFNb2JpbGUpXCIsXG4gICAgICAgIFwiU3VyZmFjZVRhYmxldFwiOiBcIldpbmRvd3MgTlQgWzAtOS5dKzsgQVJNOy4qKFRhYmxldHxBUk1CSlMpXCIsXG4gICAgICAgIFwiSFBUYWJsZXRcIjogXCJIUCBTbGF0ZSAoN3w4fDEwKXxIUCBFbGl0ZVBhZCA5MDB8aHAtdGFibGV0fEVsaXRlQm9vay4qVG91Y2h8SFAgOHxTbGF0ZSAyMXxIUCBTbGF0ZUJvb2sgMTBcIixcbiAgICAgICAgXCJBc3VzVGFibGV0XCI6IFwiXi4qUGFkRm9uZSgoPyFNb2JpbGUpLikqJHxUcmFuc2Zvcm1lcnxURjEwMXxURjEwMUd8VEYzMDBUfFRGMzAwVEd8VEYzMDBUTHxURjcwMFR8VEY3MDBLTHxURjcwMVR8VEY4MTBDfE1FMTcxfE1FMzAxVHxNRTMwMkN8TUUzNzFNR3xNRTM3MFR8TUUzNzJNR3xNRTE3MlZ8TUUxNzNYfE1FNDAwQ3xTbGlkZXIgU0wxMDF8XFxcXGJLMDBGXFxcXGJ8XFxcXGJLMDBDXFxcXGJ8XFxcXGJLMDBFXFxcXGJ8XFxcXGJLMDBMXFxcXGJ8VFgyMDFMQXxNRTE3NkN8TUUxMDJBfFxcXFxiTTgwVEFcXFxcYnxNRTM3MkNMfE1FNTYwQ0d8TUUzNzJDR3xNRTMwMktMfCBLMDEwIHwgSzAxMSB8IEswMTcgfCBLMDFFIHxNRTU3MkN8TUUxMDNLfE1FMTcwQ3xNRTE3MUN8XFxcXGJNRTcwQ1xcXFxifE1FNTgxQ3xNRTU4MUNMfE1FODUxMEN8TUUxODFDfFAwMVl8UE8xTUF8UDAxWlwiLFxuICAgICAgICBcIkJsYWNrQmVycnlUYWJsZXRcIjogXCJQbGF5Qm9va3xSSU0gVGFibGV0XCIsXG4gICAgICAgIFwiSFRDdGFibGV0XCI6IFwiSFRDX0ZseWVyX1A1MTJ8SFRDIEZseWVyfEhUQyBKZXRzdHJlYW18SFRDLVA3MTVhfEhUQyBFVk8gVmlldyA0R3xQRzQxMjAwfFBHMDk0MTBcIixcbiAgICAgICAgXCJNb3Rvcm9sYVRhYmxldFwiOiBcInhvb218c2hvbGVzdHxNWjYxNXxNWjYwNXxNWjUwNXxNWjYwMXxNWjYwMnxNWjYwM3xNWjYwNHxNWjYwNnxNWjYwN3xNWjYwOHxNWjYwOXxNWjYxNXxNWjYxNnxNWjYxN1wiLFxuICAgICAgICBcIk5vb2tUYWJsZXRcIjogXCJBbmRyb2lkLipOb29rfE5vb2tDb2xvcnxub29rIGJyb3dzZXJ8Qk5SVjIwMHxCTlJWMjAwQXxCTlRWMjUwfEJOVFYyNTBBfEJOVFY0MDB8Qk5UVjYwMHxMb2dpY1BEIFpvb20yXCIsXG4gICAgICAgIFwiQWNlclRhYmxldFwiOiBcIkFuZHJvaWQuKjsgXFxcXGIoQTEwMHxBMTAxfEExMTB8QTIwMHxBMjEwfEEyMTF8QTUwMHxBNTAxfEE1MTB8QTUxMXxBNzAwfEE3MDF8VzUwMHxXNTAwUHxXNTAxfFc1MDFQfFc1MTB8VzUxMXxXNzAwfEcxMDB8RzEwMFd8QjEtQTcxfEIxLTcxMHxCMS03MTF8QTEtODEwfEExLTgxMXxBMS04MzApXFxcXGJ8VzMtODEwfFxcXFxiQTMtQTEwXFxcXGJ8XFxcXGJBMy1BMTFcXFxcYnxcXFxcYkEzLUEyMFxcXFxifFxcXFxiQTMtQTMwXCIsXG4gICAgICAgIFwiVG9zaGliYVRhYmxldFwiOiBcIkFuZHJvaWQuKihBVDEwMHxBVDEwNXxBVDIwMHxBVDIwNXxBVDI3MHxBVDI3NXxBVDMwMHxBVDMwNXxBVDFTNXxBVDUwMHxBVDU3MHxBVDcwMHxBVDgzMCl8VE9TSElCQS4qRk9MSU9cIixcbiAgICAgICAgXCJMR1RhYmxldFwiOiBcIlxcXFxiTC0wNkN8TEctVjkwOXxMRy1WOTAwfExHLVY3MDB8TEctVjUxMHxMRy1WNTAwfExHLVY0MTB8TEctVjQwMHxMRy1WSzgxMFxcXFxiXCIsXG4gICAgICAgIFwiRnVqaXRzdVRhYmxldFwiOiBcIkFuZHJvaWQuKlxcXFxiKEYtMDFEfEYtMDJGfEYtMDVFfEYtMTBEfE01MzJ8UTU3MilcXFxcYlwiLFxuICAgICAgICBcIlByZXN0aWdpb1RhYmxldFwiOiBcIlBNUDMxNzBCfFBNUDMyNzBCfFBNUDM0NzBCfFBNUDcxNzBCfFBNUDMzNzBCfFBNUDM1NzBDfFBNUDU4NzBDfFBNUDM2NzBCfFBNUDU1NzBDfFBNUDU3NzBEfFBNUDM5NzBCfFBNUDM4NzBDfFBNUDU1ODBDfFBNUDU4ODBEfFBNUDU3ODBEfFBNUDU1ODhDfFBNUDcyODBDfFBNUDcyODBDM0d8UE1QNzI4MHxQTVA3ODgwRHxQTVA1NTk3RHxQTVA1NTk3fFBNUDcxMDBEfFBFUjM0NjR8UEVSMzI3NHxQRVIzNTc0fFBFUjM4ODR8UEVSNTI3NHxQRVI1NDc0fFBNUDUwOTdDUFJPfFBNUDUwOTd8UE1QNzM4MER8UE1QNTI5N0N8UE1QNTI5N0NfUVVBRHxQTVA4MTJFfFBNUDgxMkUzR3xQTVA4MTJGfFBNUDgxMEV8UE1QODgwVER8UE1UMzAxN3xQTVQzMDM3fFBNVDMwNDd8UE1UMzA1N3xQTVQ3MDA4fFBNVDU4ODd8UE1UNTAwMXxQTVQ1MDAyXCIsXG4gICAgICAgIFwiTGVub3ZvVGFibGV0XCI6IFwiTGVub3ZvIFRBQnxJZGVhKFRhYnxQYWQpKCBBMXxBMTB8IEsxfCl8VGhpbmtQYWQoWyBdKyk/VGFibGV0fFlUMy1YOTBMfFlUMy1YOTBGfFlUMy1YOTBYfExlbm92by4qKFMyMTA5fFMyMTEwfFM1MDAwfFM2MDAwfEszMDExfEEzMDAwfEEzNTAwfEExMDAwfEEyMTA3fEEyMTA5fEExMTA3fEE1NTAwfEE3NjAwfEI2MDAwfEI4MDAwfEI4MDgwKSgtfCkoRkx8RnxIVnxIfClcIixcbiAgICAgICAgXCJEZWxsVGFibGV0XCI6IFwiVmVudWUgMTF8VmVudWUgOHxWZW51ZSA3fERlbGwgU3RyZWFrIDEwfERlbGwgU3RyZWFrIDdcIixcbiAgICAgICAgXCJZYXJ2aWtUYWJsZXRcIjogXCJBbmRyb2lkLipcXFxcYihUQUIyMTB8VEFCMjExfFRBQjIyNHxUQUIyNTB8VEFCMjYwfFRBQjI2NHxUQUIzMTB8VEFCMzYwfFRBQjM2NHxUQUI0MTB8VEFCNDExfFRBQjQyMHxUQUI0MjR8VEFCNDUwfFRBQjQ2MHxUQUI0NjF8VEFCNDY0fFRBQjQ2NXxUQUI0Njd8VEFCNDY4fFRBQjA3LTEwMHxUQUIwNy0xMDF8VEFCMDctMTUwfFRBQjA3LTE1MXxUQUIwNy0xNTJ8VEFCMDctMjAwfFRBQjA3LTIwMS0zR3xUQUIwNy0yMTB8VEFCMDctMjExfFRBQjA3LTIxMnxUQUIwNy0yMTR8VEFCMDctMjIwfFRBQjA3LTQwMHxUQUIwNy00ODV8VEFCMDgtMTUwfFRBQjA4LTIwMHxUQUIwOC0yMDEtM0d8VEFCMDgtMjAxLTMwfFRBQjA5LTEwMHxUQUIwOS0yMTF8VEFCMDktNDEwfFRBQjEwLTE1MHxUQUIxMC0yMDF8VEFCMTAtMjExfFRBQjEwLTQwMHxUQUIxMC00MTB8VEFCMTMtMjAxfFRBQjI3NEVVS3xUQUIyNzVFVUt8VEFCMzc0RVVLfFRBQjQ2MkVVS3xUQUI0NzRFVUt8VEFCOS0yMDApXFxcXGJcIixcbiAgICAgICAgXCJNZWRpb25UYWJsZXRcIjogXCJBbmRyb2lkLipcXFxcYk9ZT1xcXFxifExJRkUuKihQOTIxMnxQOTUxNHxQOTUxNnxTOTUxMil8TElGRVRBQlwiLFxuICAgICAgICBcIkFybm92YVRhYmxldFwiOiBcIjk3RzR8QU4xMEcyfEFON2JHM3xBTjdmRzN8QU44RzN8QU44Y0czfEFON0czfEFOOUczfEFON2RHM3xBTjdkRzNTVHxBTjdkRzNDaGlsZFBhZHxBTjEwYkczfEFOMTBiRzNEVHxBTjlHMlwiLFxuICAgICAgICBcIkludGVuc29UYWJsZXRcIjogXCJJTk04MDAyS1B8SU5NMTAxMEZQfElOTTgwNU5EfEludGVuc28gVGFifFRBQjEwMDRcIixcbiAgICAgICAgXCJJUlVUYWJsZXRcIjogXCJNNzAycHJvXCIsXG4gICAgICAgIFwiTWVnYWZvblRhYmxldFwiOiBcIk1lZ2FGb24gVjl8XFxcXGJaVEUgVjlcXFxcYnxBbmRyb2lkLipcXFxcYk1UN0FcXFxcYlwiLFxuICAgICAgICBcIkVib2RhVGFibGV0XCI6IFwiRS1Cb2RhIChTdXByZW1lfEltcHJlc3NwZWVkfEl6enljb21tfEVzc2VudGlhbClcIixcbiAgICAgICAgXCJBbGxWaWV3VGFibGV0XCI6IFwiQWxsdmlldy4qKFZpdmF8QWxsZHJvfENpdHl8U3BlZWR8QWxsIFRWfEZyZW56eXxRdWFzYXJ8U2hpbmV8VFgxfEFYMXxBWDIpXCIsXG4gICAgICAgIFwiQXJjaG9zVGFibGV0XCI6IFwiXFxcXGIoMTAxRzl8ODBHOXxBMTAxSVQpXFxcXGJ8UWlsaXZlIDk3UnxBcmNob3M1fFxcXFxiQVJDSE9TICg3MHw3OXw4MHw5MHw5N3wxMDF8RkFNSUxZUEFEfCkoYnxjfCkoRzEwfCBDb2JhbHR8IFRJVEFOSVVNKEhEfCl8IFhlbm9ufCBOZW9ufFhTS3wgMnwgWFMgMnwgUExBVElOVU18IENBUkJPTnxHQU1FUEFEKVxcXFxiXCIsXG4gICAgICAgIFwiQWlub2xUYWJsZXRcIjogXCJOT1ZPN3xOT1ZPOHxOT1ZPMTB8Tm92bzdBdXJvcmF8Tm92bzdCYXNpY3xOT1ZPN1BBTEFESU58bm92bzktU3BhcmtcIixcbiAgICAgICAgXCJOb2tpYUx1bWlhVGFibGV0XCI6IFwiTHVtaWEgMjUyMFwiLFxuICAgICAgICBcIlNvbnlUYWJsZXRcIjogXCJTb255LipUYWJsZXR8WHBlcmlhIFRhYmxldHxTb255IFRhYmxldCBTfFNPLTAzRXxTR1BUMTJ8U0dQVDEzfFNHUFQxMTR8U0dQVDEyMXxTR1BUMTIyfFNHUFQxMjN8U0dQVDExMXxTR1BUMTEyfFNHUFQxMTN8U0dQVDEzMXxTR1BUMTMyfFNHUFQxMzN8U0dQVDIxMXxTR1BUMjEyfFNHUFQyMTN8U0dQMzExfFNHUDMxMnxTR1AzMjF8RUJSRDExMDF8RUJSRDExMDJ8RUJSRDEyMDF8U0dQMzUxfFNHUDM0MXxTR1A1MTF8U0dQNTEyfFNHUDUyMXxTR1A1NDF8U0dQNTUxfFNHUDYyMXxTR1A2MTJ8U09UMzFcIixcbiAgICAgICAgXCJQaGlsaXBzVGFibGV0XCI6IFwiXFxcXGIoUEkyMDEwfFBJMzAwMHxQSTMxMDB8UEkzMTA1fFBJMzExMHxQSTMyMDV8UEkzMjEwfFBJMzkwMHxQSTQwMTB8UEk3MDAwfFBJNzEwMClcXFxcYlwiLFxuICAgICAgICBcIkN1YmVUYWJsZXRcIjogXCJBbmRyb2lkLiooSzhHVHxVOUdUfFUxMEdUfFUxNkdUfFUxN0dUfFUxOEdUfFUxOUdUfFUyMEdUfFUyM0dUfFUzMEdUKXxDVUJFIFU4R1RcIixcbiAgICAgICAgXCJDb2J5VGFibGV0XCI6IFwiTUlEMTA0MnxNSUQxMDQ1fE1JRDExMjV8TUlEMTEyNnxNSUQ3MDEyfE1JRDcwMTR8TUlENzAxNXxNSUQ3MDM0fE1JRDcwMzV8TUlENzAzNnxNSUQ3MDQyfE1JRDcwNDh8TUlENzEyN3xNSUQ4MDQyfE1JRDgwNDh8TUlEODEyN3xNSUQ5MDQyfE1JRDk3NDB8TUlEOTc0MnxNSUQ3MDIyfE1JRDcwMTBcIixcbiAgICAgICAgXCJNSURUYWJsZXRcIjogXCJNOTcwMXxNOTAwMHxNOTEwMHxNODA2fE0xMDUyfE04MDZ8VDcwM3xNSUQ3MDF8TUlENzEzfE1JRDcxMHxNSUQ3Mjd8TUlENzYwfE1JRDgzMHxNSUQ3Mjh8TUlEOTMzfE1JRDEyNXxNSUQ4MTB8TUlENzMyfE1JRDEyMHxNSUQ5MzB8TUlEODAwfE1JRDczMXxNSUQ5MDB8TUlEMTAwfE1JRDgyMHxNSUQ3MzV8TUlEOTgwfE1JRDEzMHxNSUQ4MzN8TUlENzM3fE1JRDk2MHxNSUQxMzV8TUlEODYwfE1JRDczNnxNSUQxNDB8TUlEOTMwfE1JRDgzNXxNSUQ3MzN8TUlENFgxMFwiLFxuICAgICAgICBcIk1TSVRhYmxldFwiOiBcIk1TSSBcXFxcYihQcmltbyA3M0t8UHJpbW8gNzNMfFByaW1vIDgxTHxQcmltbyA3N3xQcmltbyA5M3xQcmltbyA3NXxQcmltbyA3NnxQcmltbyA3M3xQcmltbyA4MXxQcmltbyA5MXxQcmltbyA5MHxFbmpveSA3MXxFbmpveSA3fEVuam95IDEwKVxcXFxiXCIsXG4gICAgICAgIFwiU01pVFRhYmxldFwiOiBcIkFuZHJvaWQuKihcXFxcYk1JRFxcXFxifE1JRC01NjB8TVRWLVQxMjAwfE1UVi1QTkQ1MzF8TVRWLVAxMTAxfE1UVi1QTkQ1MzApXCIsXG4gICAgICAgIFwiUm9ja0NoaXBUYWJsZXRcIjogXCJBbmRyb2lkLiooUksyODE4fFJLMjgwOEF8UksyOTE4fFJLMzA2Nil8UksyNzM4fFJLMjgwOEFcIixcbiAgICAgICAgXCJGbHlUYWJsZXRcIjogXCJJUTMxMHxGbHkgVmlzaW9uXCIsXG4gICAgICAgIFwiYnFUYWJsZXRcIjogXCJBbmRyb2lkLiooYnEpPy4qKEVsY2Fub3xDdXJpZXxFZGlzb258TWF4d2VsbHxLZXBsZXJ8UGFzY2FsfFRlc2xhfEh5cGF0aWF8UGxhdG9ufE5ld3RvbnxMaXZpbmdzdG9uZXxDZXJ2YW50ZXN8QXZhbnR8QXF1YXJpcyBbRXxNXTEwKXxNYXh3ZWxsLipMaXRlfE1heHdlbGwuKlBsdXNcIixcbiAgICAgICAgXCJIdWF3ZWlUYWJsZXRcIjogXCJNZWRpYVBhZHxNZWRpYVBhZCA3IFlvdXRofElERU9TIFM3fFM3LTIwMWN8UzctMjAydXxTNy0xMDF8UzctMTAzfFM3LTEwNHxTNy0xMDV8UzctMTA2fFM3LTIwMXxTNy1TbGltXCIsXG4gICAgICAgIFwiTmVjVGFibGV0XCI6IFwiXFxcXGJOLTA2RHxcXFxcYk4tMDhEXCIsXG4gICAgICAgIFwiUGFudGVjaFRhYmxldFwiOiBcIlBhbnRlY2guKlA0MTAwXCIsXG4gICAgICAgIFwiQnJvbmNob1RhYmxldFwiOiBcIkJyb25jaG8uKihONzAxfE43MDh8TjgwMnxhNzEwKVwiLFxuICAgICAgICBcIlZlcnN1c1RhYmxldFwiOiBcIlRPVUNIUEFELipbNzg5MTBdfFxcXFxiVE9VQ0hUQUJcXFxcYlwiLFxuICAgICAgICBcIlp5bmNUYWJsZXRcIjogXCJ6MTAwMHxaOTkgMkd8ejk5fHo5MzB8ejk5OXx6OTkwfHo5MDl8WjkxOXx6OTAwXCIsXG4gICAgICAgIFwiUG9zaXRpdm9UYWJsZXRcIjogXCJUQjA3U1RBfFRCMTBTVEF8VEIwN0ZUQXxUQjEwRlRBXCIsXG4gICAgICAgIFwiTmFiaVRhYmxldFwiOiBcIkFuZHJvaWQuKlxcXFxiTmFiaVwiLFxuICAgICAgICBcIktvYm9UYWJsZXRcIjogXCJLb2JvIFRvdWNofFxcXFxiSzA4MFxcXFxifFxcXFxiVm94XFxcXGIgQnVpbGR8XFxcXGJBcmNcXFxcYiBCdWlsZFwiLFxuICAgICAgICBcIkRhbmV3VGFibGV0XCI6IFwiRFNsaWRlLipcXFxcYig3MDB8NzAxUnw3MDJ8NzAzUnw3MDR8ODAyfDk3MHw5NzF8OTcyfDk3M3w5NzR8MTAxMHwxMDEyKVxcXFxiXCIsXG4gICAgICAgIFwiVGV4ZXRUYWJsZXRcIjogXCJOYXZpUGFkfFRCLTc3MkF8VE0tNzA0NXxUTS03MDU1fFRNLTk3NTB8VE0tNzAxNnxUTS03MDI0fFRNLTcwMjZ8VE0tNzA0MXxUTS03MDQzfFRNLTcwNDd8VE0tODA0MXxUTS05NzQxfFRNLTk3NDd8VE0tOTc0OHxUTS05NzUxfFRNLTcwMjJ8VE0tNzAyMXxUTS03MDIwfFRNLTcwMTF8VE0tNzAxMHxUTS03MDIzfFRNLTcwMjV8VE0tNzAzN1d8VE0tNzAzOFd8VE0tNzAyN1d8VE0tOTcyMHxUTS05NzI1fFRNLTk3MzdXfFRNLTEwMjB8VE0tOTczOFd8VE0tOTc0MHxUTS05NzQzV3xUQi04MDdBfFRCLTc3MUF8VEItNzI3QXxUQi03MjVBfFRCLTcxOUF8VEItODIzQXxUQi04MDVBfFRCLTcyM0F8VEItNzE1QXxUQi03MDdBfFRCLTcwNUF8VEItNzA5QXxUQi03MTFBfFRCLTg5MEhEfFRCLTg4MEhEfFRCLTc5MEhEfFRCLTc4MEhEfFRCLTc3MEhEfFRCLTcyMUhEfFRCLTcxMEhEfFRCLTQzNEhEfFRCLTg2MEhEfFRCLTg0MEhEfFRCLTc2MEhEfFRCLTc1MEhEfFRCLTc0MEhEfFRCLTczMEhEfFRCLTcyMkhEfFRCLTcyMEhEfFRCLTcwMEhEfFRCLTUwMEhEfFRCLTQ3MEhEfFRCLTQzMUhEfFRCLTQzMEhEfFRCLTUwNnxUQi01MDR8VEItNDQ2fFRCLTQzNnxUQi00MTZ8VEItMTQ2U0V8VEItMTI2U0VcIixcbiAgICAgICAgXCJQbGF5c3RhdGlvblRhYmxldFwiOiBcIlBsYXlzdGF0aW9uLiooUG9ydGFibGV8Vml0YSlcIixcbiAgICAgICAgXCJUcmVrc3RvclRhYmxldFwiOiBcIlNUMTA0MTYtMXxWVDEwNDE2LTF8U1Q3MDQwOC0xfFNUNzAyeHgtMXxTVDcwMnh4LTJ8U1Q4MDIwOHxTVDk3MjE2fFNUNzAxMDQtMnxWVDEwNDE2LTJ8U1QxMDIxNi0yQXxTdXJmVGFiXCIsXG4gICAgICAgIFwiUHlsZUF1ZGlvVGFibGV0XCI6IFwiXFxcXGIoUFRCTDEwQ0VVfFBUQkwxMEN8UFRCTDcyQkN8UFRCTDcyQkNFVXxQVEJMN0NFVXxQVEJMN0N8UFRCTDkyQkN8UFRCTDkyQkNFVXxQVEJMOUNFVXxQVEJMOUNVS3xQVEJMOUMpXFxcXGJcIixcbiAgICAgICAgXCJBZHZhblRhYmxldFwiOiBcIkFuZHJvaWQuKiBcXFxcYihFM0F8VDNYfFQ1Q3xUNUJ8VDNFfFQzQ3xUM0J8VDFKfFQxRnxUMkF8VDFIfFQxaXxFMUN8VDEtRXxUNS1BfFQ0fEUxLUJ8VDJDaXxUMS1CfFQxLUR8TzEtQXxFMS1BfFQxLUF8VDNBfFQ0aSlcXFxcYiBcIixcbiAgICAgICAgXCJEYW55VGVjaFRhYmxldFwiOiBcIkdlbml1cyBUYWIgRzN8R2VuaXVzIFRhYiBTMnxHZW5pdXMgVGFiIFEzfEdlbml1cyBUYWIgRzR8R2VuaXVzIFRhYiBRNHxHZW5pdXMgVGFiIEctSUl8R2VuaXVzIFRBQiBHSUl8R2VuaXVzIFRBQiBHSUlJfEdlbml1cyBUYWIgUzFcIixcbiAgICAgICAgXCJHYWxhcGFkVGFibGV0XCI6IFwiQW5kcm9pZC4qXFxcXGJHMVxcXFxiXCIsXG4gICAgICAgIFwiTWljcm9tYXhUYWJsZXRcIjogXCJGdW5ib29rfE1pY3JvbWF4LipcXFxcYihQMjUwfFA1NjB8UDM2MHxQMzYyfFA2MDB8UDMwMHxQMzUwfFA1MDB8UDI3NSlcXFxcYlwiLFxuICAgICAgICBcIkthcmJvbm5UYWJsZXRcIjogXCJBbmRyb2lkLipcXFxcYihBMzl8QTM3fEEzNHxTVDh8U1QxMHxTVDd8U21hcnQgVGFiM3xTbWFydCBUYWIyKVxcXFxiXCIsXG4gICAgICAgIFwiQWxsRmluZVRhYmxldFwiOiBcIkZpbmU3IEdlbml1c3xGaW5lNyBTaGluZXxGaW5lNyBBaXJ8RmluZTggU3R5bGV8RmluZTkgTW9yZXxGaW5lMTAgSm95fEZpbmUxMSBXaWRlXCIsXG4gICAgICAgIFwiUFJPU0NBTlRhYmxldFwiOiBcIlxcXFxiKFBFTTYzfFBMVDEwMjNHfFBMVDEwNDF8UExUMTA0NHxQTFQxMDQ0R3xQTFQxMDkxfFBMVDQzMTF8UExUNDMxMVBMfFBMVDQzMTV8UExUNzAzMHxQTFQ3MDMzfFBMVDcwMzNEfFBMVDcwMzV8UExUNzAzNUR8UExUNzA0NEt8UExUNzA0NUt8UExUNzA0NUtCfFBMVDcwNzFLR3xQTFQ3MDcyfFBMVDcyMjNHfFBMVDcyMjVHfFBMVDc3NzdHfFBMVDc4MTBLfFBMVDc4NDlHfFBMVDc4NTFHfFBMVDc4NTJHfFBMVDgwMTV8UExUODAzMXxQTFQ4MDM0fFBMVDgwMzZ8UExUODA4MEt8UExUODA4MnxQTFQ4MDg4fFBMVDgyMjNHfFBMVDgyMzRHfFBMVDgyMzVHfFBMVDg4MTZLfFBMVDkwMTF8UExUOTA0NUt8UExUOTIzM0d8UExUOTczNXxQTFQ5NzYwR3xQTFQ5NzcwRylcXFxcYlwiLFxuICAgICAgICBcIllPTkVTVGFibGV0XCI6IFwiQlExMDc4fEJDMTAwM3xCQzEwNzd8Uks5NzAyfEJDOTczMHxCQzkwMDF8SVQ5MDAxfEJDNzAwOHxCQzcwMTB8QkM3MDh8QkM3Mjh8QkM3MDEyfEJDNzAzMHxCQzcwMjd8QkM3MDI2XCIsXG4gICAgICAgIFwiQ2hhbmdKaWFUYWJsZXRcIjogXCJUUEM3MTAyfFRQQzcxMDN8VFBDNzEwNXxUUEM3MTA2fFRQQzcxMDd8VFBDNzIwMXxUUEM3MjAzfFRQQzcyMDV8VFBDNzIxMHxUUEM3NzA4fFRQQzc3MDl8VFBDNzcxMnxUUEM3MTEwfFRQQzgxMDF8VFBDODEwM3xUUEM4MTA1fFRQQzgxMDZ8VFBDODIwM3xUUEM4MjA1fFRQQzg1MDN8VFBDOTEwNnxUUEM5NzAxfFRQQzk3MTAxfFRQQzk3MTAzfFRQQzk3MTA1fFRQQzk3MTA2fFRQQzk3MTExfFRQQzk3MTEzfFRQQzk3MjAzfFRQQzk3NjAzfFRQQzk3ODA5fFRQQzk3MjA1fFRQQzEwMTAxfFRQQzEwMTAzfFRQQzEwMTA2fFRQQzEwMTExfFRQQzEwMjAzfFRQQzEwMjA1fFRQQzEwNTAzXCIsXG4gICAgICAgIFwiR1VUYWJsZXRcIjogXCJUWC1BMTMwMXxUWC1NOTAwMnxRNzAyfGtmMDI2XCIsXG4gICAgICAgIFwiUG9pbnRPZlZpZXdUYWJsZXRcIjogXCJUQUItUDUwNnxUQUItbmF2aS03LTNHLU18VEFCLVA1MTd8VEFCLVAtNTI3fFRBQi1QNzAxfFRBQi1QNzAzfFRBQi1QNzIxfFRBQi1QNzMxTnxUQUItUDc0MXxUQUItUDgyNXxUQUItUDkwNXxUQUItUDkyNXxUQUItUFI5NDV8VEFCLVBMMTAxNXxUQUItUDEwMjV8VEFCLVBJMTA0NXxUQUItUDEzMjV8VEFCLVBST1RBQlswLTldK3xUQUItUFJPVEFCMjV8VEFCLVBST1RBQjI2fFRBQi1QUk9UQUIyN3xUQUItUFJPVEFCMjZYTHxUQUItUFJPVEFCMi1JUFM5fFRBQi1QUk9UQUIzMC1JUFM5fFRBQi1QUk9UQUIyNVhYTHxUQUItUFJPVEFCMjYtSVBTMTB8VEFCLVBST1RBQjMwLUlQUzEwXCIsXG4gICAgICAgIFwiT3Zlcm1heFRhYmxldFwiOiBcIk9WLShTdGVlbENvcmV8TmV3QmFzZXxCYXNlY29yZXxCYXNlb25lfEV4ZWxsZW58UXVhdHRvcnxFZHVUYWJ8U29sdXRpb258QUNUSU9OfEJhc2ljVGFifFRlZGR5VGFifE1hZ2ljVGFifFN0cmVhbXxUQi0wOHxUQi0wOSlcIixcbiAgICAgICAgXCJIQ0xUYWJsZXRcIjogXCJIQ0wuKlRhYmxldHxDb25uZWN0LTNHLTIuMHxDb25uZWN0LTJHLTIuMHxNRSBUYWJsZXQgVTF8TUUgVGFibGV0IFUyfE1FIFRhYmxldCBHMXxNRSBUYWJsZXQgWDF8TUUgVGFibGV0IFkyfE1FIFRhYmxldCBTeW5jXCIsXG4gICAgICAgIFwiRFBTVGFibGV0XCI6IFwiRFBTIERyZWFtIDl8RFBTIER1YWwgN1wiLFxuICAgICAgICBcIlZpc3R1cmVUYWJsZXRcIjogXCJWOTcgSER8aTc1IDNHfFZpc3R1cmUgVjQoIEhEKT98VmlzdHVyZSBWNSggSEQpP3xWaXN0dXJlIFYxMFwiLFxuICAgICAgICBcIkNyZXN0YVRhYmxldFwiOiBcIkNUUCgtKT84MTB8Q1RQKC0pPzgxOHxDVFAoLSk/ODI4fENUUCgtKT84Mzh8Q1RQKC0pPzg4OHxDVFAoLSk/OTc4fENUUCgtKT85ODB8Q1RQKC0pPzk4N3xDVFAoLSk/OTg4fENUUCgtKT85ODlcIixcbiAgICAgICAgXCJNZWRpYXRla1RhYmxldFwiOiBcIlxcXFxiTVQ4MTI1fE1UODM4OXxNVDgxMzV8TVQ4Mzc3XFxcXGJcIixcbiAgICAgICAgXCJDb25jb3JkZVRhYmxldFwiOiBcIkNvbmNvcmRlKFsgXSspP1RhYnxDb25Db3JkZSBSZWFkTWFuXCIsXG4gICAgICAgIFwiR29DbGV2ZXJUYWJsZXRcIjogXCJHT0NMRVZFUiBUQUJ8QTdHT0NMRVZFUnxNMTA0MnxNNzg0MXxNNzQyfFIxMDQyQkt8UjEwNDF8VEFCIEE5NzV8VEFCIEE3ODQyfFRBQiBBNzQxfFRBQiBBNzQxTHxUQUIgTTcyM0d8VEFCIE03MjF8VEFCIEExMDIxfFRBQiBJOTIxfFRBQiBSNzIxfFRBQiBJNzIwfFRBQiBUNzZ8VEFCIFI3MHxUQUIgUjc2LjJ8VEFCIFIxMDZ8VEFCIFI4My4yfFRBQiBNODEzR3xUQUIgSTcyMXxHQ1RBNzIyfFRBQiBJNzB8VEFCIEk3MXxUQUIgUzczfFRBQiBSNzN8VEFCIFI3NHxUQUIgUjkzfFRBQiBSNzV8VEFCIFI3Ni4xfFRBQiBBNzN8VEFCIEE5M3xUQUIgQTkzLjJ8VEFCIFQ3MnxUQUIgUjgzfFRBQiBSOTc0fFRBQiBSOTczfFRBQiBBMTAxfFRBQiBBMTAzfFRBQiBBMTA0fFRBQiBBMTA0LjJ8UjEwNUJLfE03MTNHfEE5NzJCS3xUQUIgQTk3MXxUQUIgUjk3NC4yfFRBQiBSMTA0fFRBQiBSODMuM3xUQUIgQTEwNDJcIixcbiAgICAgICAgXCJNb2RlY29tVGFibGV0XCI6IFwiRnJlZVRBQiA5MDAwfEZyZWVUQUIgNy40fEZyZWVUQUIgNzAwNHxGcmVlVEFCIDc4MDB8RnJlZVRBQiAyMDk2fEZyZWVUQUIgNy41fEZyZWVUQUIgMTAxNHxGcmVlVEFCIDEwMDEgfEZyZWVUQUIgODAwMXxGcmVlVEFCIDk3MDZ8RnJlZVRBQiA5NzAyfEZyZWVUQUIgNzAwM3xGcmVlVEFCIDcwMDJ8RnJlZVRBQiAxMDAyfEZyZWVUQUIgNzgwMXxGcmVlVEFCIDEzMzF8RnJlZVRBQiAxMDA0fEZyZWVUQUIgODAwMnxGcmVlVEFCIDgwMTR8RnJlZVRBQiA5NzA0fEZyZWVUQUIgMTAwM1wiLFxuICAgICAgICBcIlZvbmlub1RhYmxldFwiOiBcIlxcXFxiKEFyZ3VzWyBfXT9TfERpYW1vbmRbIF9dPzc5SER8RW1lcmFsZFsgX10/NzhFfEx1bmFbIF9dPzcwQ3xPbnl4WyBfXT9TfE9ueXhbIF9dP1p8T3JpblsgX10/SER8T3JpblsgX10/U3xPdGlzWyBfXT9TfFNwZWVkU3RhclsgX10/U3xNYWduZXRbIF9dP005fFByaW11c1sgX10/OTRbIF9dPzNHfFByaW11c1sgX10/OTRIRHxQcmltdXNbIF9dP1FTfEFuZHJvaWQuKlxcXFxiUThcXFxcYnxTaXJpdXNbIF9dP0VWT1sgX10/UVN8U2lyaXVzWyBfXT9RU3xTcGlyaXRbIF9dP1MpXFxcXGJcIixcbiAgICAgICAgXCJFQ1NUYWJsZXRcIjogXCJWMDdPVDJ8VE0xMDVBfFMxME9UMXxUUjEwQ1MxXCIsXG4gICAgICAgIFwiU3RvcmV4VGFibGV0XCI6IFwiZVplZVtfJ10/KFRhYnxHbylbMC05XSt8VGFiTEM3fExvb25leSBUdW5lcyBUYWJcIixcbiAgICAgICAgXCJWb2RhZm9uZVRhYmxldFwiOiBcIlNtYXJ0VGFiKFsgXSspP1swLTldK3xTbWFydFRhYklJMTB8U21hcnRUYWJJSTd8VkYtMTQ5N1wiLFxuICAgICAgICBcIkVzc2VudGllbEJUYWJsZXRcIjogXCJTbWFydFsgJ10/VEFCWyBdKz9bMC05XSt8RmFtaWx5WyAnXT9UQUIyXCIsXG4gICAgICAgIFwiUm9zc01vb3JUYWJsZXRcIjogXCJSTS03OTB8Uk0tOTk3fFJNRC04NzhHfFJNRC05NzRSfFJNVC03MDVBfFJNVC03MDF8Uk1FLTYwMXxSTVQtNTAxfFJNVC03MTFcIixcbiAgICAgICAgXCJpTW9iaWxlVGFibGV0XCI6IFwiaS1tb2JpbGUgaS1ub3RlXCIsXG4gICAgICAgIFwiVG9saW5vVGFibGV0XCI6IFwidG9saW5vIHRhYiBbMC05Ll0rfHRvbGlubyBzaGluZVwiLFxuICAgICAgICBcIkF1ZGlvU29uaWNUYWJsZXRcIjogXCJcXFxcYkMtMjJRfFQ3LVFDfFQtMTdCfFQtMTdQXFxcXGJcIixcbiAgICAgICAgXCJBTVBFVGFibGV0XCI6IFwiQW5kcm9pZC4qIEE3OCBcIixcbiAgICAgICAgXCJTa2tUYWJsZXRcIjogXCJBbmRyb2lkLiogKFNLWVBBRHxQSE9FTklYfENZQ0xPUFMpXCIsXG4gICAgICAgIFwiVGVjbm9UYWJsZXRcIjogXCJURUNOTyBQOVwiLFxuICAgICAgICBcIkpYRFRhYmxldFwiOiBcIkFuZHJvaWQuKiBcXFxcYihGMzAwMHxBMzMwMHxKWEQ1MDAwfEpYRDMwMDB8SlhEMjAwMHxKWEQzMDBCfEpYRDMwMHxTNTgwMHxTNzgwMHxTNjAyYnxTNTExMGJ8UzczMDB8UzUzMDB8UzYwMnxTNjAzfFM1MTAwfFM1MTEwfFM2MDF8UzcxMDBhfFAzMDAwRnxQMzAwMHN8UDEwMXxQMjAwc3xQMTAwMG18UDIwMG18UDkxMDB8UDEwMDBzfFM2NjAwYnxTOTA4fFAxMDAwfFAzMDB8UzE4fFM2NjAwfFM5MTAwKVxcXFxiXCIsXG4gICAgICAgIFwiaUpveVRhYmxldFwiOiBcIlRhYmxldCAoU3Bpcml0IDd8RXNzZW50aWF8R2FsYXRlYXxGdXNpb258T25peCA3fExhbmRhfFRpdGFufFNjb29ieXxEZW94fFN0ZWxsYXxUaGVtaXN8QXJnb258VW5pcXVlIDd8U3lnbnVzfEhleGVufEZpbml0eSA3fENyZWFtfENyZWFtIFgyfEphZGV8TmVvbiA3fE5lcm9uIDd8S2FuZHl8U2NhcGV8U2FwaHlyIDd8UmViZWx8QmlveHxSZWJlbHxSZWJlbCA4R0J8TXlzdHxEcmFjbyA3fE15c3R8VGFiNy0wMDR8TXlzdHxUYWRlbyBKb25lc3xUYWJsZXQgQm9pbmd8QXJyb3d8RHJhY28gRHVhbCBDYW18QXVyaXh8TWludHxBbWl0eXxSZXZvbHV0aW9ufEZpbml0eSA5fE5lb24gOXxUOXd8QW1pdHkgNEdCIER1YWwgQ2FtfFN0b25lIDRHQnxTdG9uZSA4R0J8QW5kcm9tZWRhfFNpbGtlbnxYMnxBbmRyb21lZGEgSUl8SGFsbGV5fEZsYW1lfFNhcGh5ciA5LDd8VG91Y2ggOHxQbGFuZXR8VHJpdG9ufFVuaXF1ZSAxMHxIZXhlbiAxMHxNZW1waGlzIDRHQnxNZW1waGlzIDhHQnxPbml4IDEwKVwiLFxuICAgICAgICBcIkZYMlRhYmxldFwiOiBcIkZYMiBQQUQ3fEZYMiBQQUQxMFwiLFxuICAgICAgICBcIlhvcm9UYWJsZXRcIjogXCJLaWRzUEFEIDcwMXxQQURbIF0/NzEyfFBBRFsgXT83MTR8UEFEWyBdPzcxNnxQQURbIF0/NzE3fFBBRFsgXT83MTh8UEFEWyBdPzcyMHxQQURbIF0/NzIxfFBBRFsgXT83MjJ8UEFEWyBdPzc5MHxQQURbIF0/NzkyfFBBRFsgXT85MDB8UEFEWyBdPzk3MTVEfFBBRFsgXT85NzE2RFJ8UEFEWyBdPzk3MThEUnxQQURbIF0/OTcxOVFSfFBBRFsgXT85NzIwUVJ8VGVsZVBBRDEwMzB8VGVsZXBhZDEwMzJ8VGVsZVBBRDczMHxUZWxlUEFENzMxfFRlbGVQQUQ3MzJ8VGVsZVBBRDczNVF8VGVsZVBBRDgzMHxUZWxlUEFEOTczMHxUZWxlUEFENzk1fE1lZ2FQQUQgMTMzMXxNZWdhUEFEIDE4NTF8TWVnYVBBRCAyMTUxXCIsXG4gICAgICAgIFwiVmlld3NvbmljVGFibGV0XCI6IFwiVmlld1BhZCAxMHBpfFZpZXdQYWQgMTBlfFZpZXdQYWQgMTBzfFZpZXdQYWQgRTcyfFZpZXdQYWQ3fFZpZXdQYWQgRTEwMHxWaWV3UGFkIDdlfFZpZXdTb25pYyBWQjczM3xWQjEwMGFcIixcbiAgICAgICAgXCJPZHlzVGFibGV0XCI6IFwiTE9PWHxYRU5PMTB8T0RZU1sgLV0oU3BhY2V8RVZPfFhwcmVzc3xOT09OKXxcXFxcYlhFTElPXFxcXGJ8WGVsaW8xMFByb3xYRUxJTzdQSE9ORVRBQnxYRUxJTzEwRVhUUkVNRXxYRUxJT1BUMnxORU9fUVVBRDEwXCIsXG4gICAgICAgIFwiQ2FwdGl2YVRhYmxldFwiOiBcIkNBUFRJVkEgUEFEXCIsXG4gICAgICAgIFwiSWNvbmJpdFRhYmxldFwiOiBcIk5ldFRBQnxOVC0zNzAyfE5ULTM3MDJTfE5ULTM3MDJTfE5ULTM2MDNQfE5ULTM2MDNQfE5ULTA3MDRTfE5ULTA3MDRTfE5ULTM4MDVDfE5ULTM4MDVDfE5ULTA4MDZDfE5ULTA4MDZDfE5ULTA5MDlUfE5ULTA5MDlUfE5ULTA5MDdTfE5ULTA5MDdTfE5ULTA5MDJTfE5ULTA5MDJTXCIsXG4gICAgICAgIFwiVGVjbGFzdFRhYmxldFwiOiBcIlQ5OCA0R3xcXFxcYlA4MFxcXFxifFxcXFxiWDkwSERcXFxcYnxYOTggQWlyfFg5OCBBaXIgM0d8XFxcXGJYODlcXFxcYnxQODAgM0d8XFxcXGJYODBoXFxcXGJ8UDk4IEFpcnxcXFxcYlg4OUhEXFxcXGJ8UDk4IDNHfFxcXFxiUDkwSERcXFxcYnxQODkgM0d8WDk4IDNHfFxcXFxiUDcwaFxcXFxifFA3OUhEIDNHfEcxOGQgM0d8XFxcXGJQNzlIRFxcXFxifFxcXFxiUDg5c1xcXFxifFxcXFxiQTg4XFxcXGJ8XFxcXGJQMTBIRFxcXFxifFxcXFxiUDE5SERcXFxcYnxHMTggM0d8XFxcXGJQNzhIRFxcXFxifFxcXFxiQTc4XFxcXGJ8XFxcXGJQNzVcXFxcYnxHMTdzIDNHfEcxN2ggM0d8XFxcXGJQODV0XFxcXGJ8XFxcXGJQOTBcXFxcYnxcXFxcYlAxMVxcXFxifFxcXFxiUDk4dFxcXFxifFxcXFxiUDk4SERcXFxcYnxcXFxcYkcxOGRcXFxcYnxcXFxcYlA4NXNcXFxcYnxcXFxcYlAxMUhEXFxcXGJ8XFxcXGJQODhzXFxcXGJ8XFxcXGJBODBIRFxcXFxifFxcXFxiQTgwc2VcXFxcYnxcXFxcYkExMGhcXFxcYnxcXFxcYlA4OVxcXFxifFxcXFxiUDc4c1xcXFxifFxcXFxiRzE4XFxcXGJ8XFxcXGJQODVcXFxcYnxcXFxcYkE3MGhcXFxcYnxcXFxcYkE3MFxcXFxifFxcXFxiRzE3XFxcXGJ8XFxcXGJQMThcXFxcYnxcXFxcYkE4MHNcXFxcYnxcXFxcYkExMXNcXFxcYnxcXFxcYlA4OEhEXFxcXGJ8XFxcXGJBODBoXFxcXGJ8XFxcXGJQNzZzXFxcXGJ8XFxcXGJQNzZoXFxcXGJ8XFxcXGJQOThcXFxcYnxcXFxcYkExMEhEXFxcXGJ8XFxcXGJQNzhcXFxcYnxcXFxcYlA4OFxcXFxifFxcXFxiQTExXFxcXGJ8XFxcXGJBMTB0XFxcXGJ8XFxcXGJQNzZhXFxcXGJ8XFxcXGJQNzZ0XFxcXGJ8XFxcXGJQNzZlXFxcXGJ8XFxcXGJQODVIRFxcXFxifFxcXFxiUDg1YVxcXFxifFxcXFxiUDg2XFxcXGJ8XFxcXGJQNzVIRFxcXFxifFxcXFxiUDc2dlxcXFxifFxcXFxiQTEyXFxcXGJ8XFxcXGJQNzVhXFxcXGJ8XFxcXGJBMTVcXFxcYnxcXFxcYlA3NlRpXFxcXGJ8XFxcXGJQODFIRFxcXFxifFxcXFxiQTEwXFxcXGJ8XFxcXGJUNzYwVkVcXFxcYnxcXFxcYlQ3MjBIRFxcXFxifFxcXFxiUDc2XFxcXGJ8XFxcXGJQNzNcXFxcYnxcXFxcYlA3MVxcXFxifFxcXFxiUDcyXFxcXGJ8XFxcXGJUNzIwU0VcXFxcYnxcXFxcYkM1MjBUaVxcXFxifFxcXFxiVDc2MFxcXFxifFxcXFxiVDcyMFZFXFxcXGJ8VDcyMC0zR0V8VDcyMC1XaUZpXCIsXG4gICAgICAgIFwiT25kYVRhYmxldFwiOiBcIlxcXFxiKFY5NzVpfFZpMzB8Vlg1MzB8VjcwMXxWaTYwfFY3MDFzfFZpNTB8VjgwMXN8VjcxOXxWeDYxMHd8Vlg2MTBXfFY4MTlpfFZpMTB8Vlg1ODBXfFZpMTB8VjcxMXN8VjgxM3xWODExfFY4MjB3fFY4MjB8VmkyMHxWNzExfFZJMzBXfFY3MTJ8Vjg5MXd8Vjk3MnxWODE5d3xWODIwd3xWaTYwfFY4MjB3fFY3MTF8VjgxM3N8VjgwMXxWODE5fFY5NzVzfFY4MDF8VjgxOXxWODE5fFY4MTh8VjgxMXxWNzEyfFY5NzVtfFYxMDF3fFY5NjF3fFY4MTJ8VjgxOHxWOTcxfFY5NzFzfFY5MTl8Vjk4OXxWMTE2d3xWMTAyd3xWOTczfFZpNDApXFxcXGJbXFxcXHNdK1wiLFxuICAgICAgICBcIkpheXRlY2hUYWJsZXRcIjogXCJUUEMtUEE3NjJcIixcbiAgICAgICAgXCJCbGF1cHVua3RUYWJsZXRcIjogXCJFbmRlYXZvdXIgODAwTkd8RW5kZWF2b3VyIDEwMTBcIixcbiAgICAgICAgXCJEaWdtYVRhYmxldFwiOiBcIlxcXFxiKGlEeDEwfGlEeDl8aUR4OHxpRHg3fGlEeEQ3fGlEeEQ4fGlEc1E4fGlEc1E3fGlEc1E4fGlEc0QxMHxpRG5EN3wzVFM4MDRIfGlEc1ExMXxpRGo3fGlEczEwKVxcXFxiXCIsXG4gICAgICAgIFwiRXZvbGlvVGFibGV0XCI6IFwiQVJJQV9NaW5pX3dpZml8QXJpYVsgX11NaW5pfEV2b2xpbyBYMTB8RXZvbGlvIFg3fEV2b2xpbyBYOHxcXFxcYkV2b3RhYlxcXFxifFxcXFxiTmV1cmFcXFxcYlwiLFxuICAgICAgICBcIkxhdmFUYWJsZXRcIjogXCJRUEFEIEU3MDR8XFxcXGJJdm9yeVNcXFxcYnxFLVRBQiBJVk9SWXxcXFxcYkUtVEFCXFxcXGJcIixcbiAgICAgICAgXCJBb2NUYWJsZXRcIjogXCJNVzA4MTF8TVcwODEyfE1XMDkyMnxNVEs4MzgyfE1XMTAzMXxNVzA4MzF8TVcwODIxfE1XMDkzMXxNVzA3MTJcIixcbiAgICAgICAgXCJNcG1hblRhYmxldFwiOiBcIk1QMTEgT0NUQXxNUDEwIE9DVEF8TVBRQzExMTR8TVBRQzEwMDR8TVBRQzk5NHxNUFFDOTc0fE1QUUM5NzN8TVBRQzgwNHxNUFFDNzg0fE1QUUM3ODB8XFxcXGJNUEc3XFxcXGJ8TVBEQ0c3NXxNUERDRzcxfE1QREMxMDA2fE1QMTAxREN8TVBEQzkwMDB8TVBEQzkwNXxNUERDNzA2SER8TVBEQzcwNnxNUERDNzA1fE1QREMxMTB8TVBEQzEwMHxNUERDOTl8TVBEQzk3fE1QREM4OHxNUERDOHxNUERDNzd8TVA3MDl8TUlENzAxfE1JRDcxMXxNSUQxNzB8TVBEQzcwM3xNUFFDMTAxMFwiLFxuICAgICAgICBcIkNlbGtvblRhYmxldFwiOiBcIkNUNjk1fENUODg4fENUW1xcXFxzXT85MTB8Q1Q3IFRhYnxDVDkgVGFifENUMyBUYWJ8Q1QyIFRhYnxDVDEgVGFifEM4MjB8QzcyMHxcXFxcYkNULTFcXFxcYlwiLFxuICAgICAgICBcIldvbGRlclRhYmxldFwiOiBcIm1pVGFiIFxcXFxiKERJQU1PTkR8U1BBQ0V8QlJPT0tMWU58TkVPfEZMWXxNQU5IQVRUQU58RlVOS3xFVk9MVVRJT058U0tZfEdPQ0FSfElST058R0VOSVVTfFBPUHxNSU5UfEVQU0lMT058QlJPQURXQVl8SlVNUHxIT1B8TEVHRU5EfE5FVyBBR0V8TElORXxBRFZBTkNFfEZFRUx8Rk9MTE9XfExJS0V8TElOS3xMSVZFfFRISU5LfEZSRUVET018Q0hJQ0FHT3xDTEVWRUxBTkR8QkFMVElNT1JFLUdIfElPV0F8Qk9TVE9OfFNFQVRUTEV8UEhPRU5JWHxEQUxMQVN8SU4gMTAxfE1hc3RlckNoZWYpXFxcXGJcIixcbiAgICAgICAgXCJNaVRhYmxldFwiOiBcIlxcXFxiTUkgUEFEXFxcXGJ8XFxcXGJITSBOT1RFIDFXXFxcXGJcIixcbiAgICAgICAgXCJOaWJpcnVUYWJsZXRcIjogXCJOaWJpcnUgTTF8TmliaXJ1IEp1cGl0ZXIgT25lXCIsXG4gICAgICAgIFwiTmV4b1RhYmxldFwiOiBcIk5FWE8gTk9WQXxORVhPIDEwfE5FWE8gQVZJT3xORVhPIEZSRUV8TkVYTyBHT3xORVhPIEVWT3xORVhPIDNHfE5FWE8gU01BUlR8TkVYTyBLSURET3xORVhPIE1PQklcIixcbiAgICAgICAgXCJMZWFkZXJUYWJsZXRcIjogXCJUQkxUMTBRfFRCTFQxMEl8VEJMLTEwV0RLQnxUQkwtMTBXREtCTzIwMTN8VEJMLVcyMzBWMnxUQkwtVzQ1MHxUQkwtVzUwMHxTVjU3MnxUQkxUN0l8VEJBLUFDNy04R3xUQkxUNzl8VEJMLThXMTZ8VEJMLTEwVzMyfFRCTC0xMFdLQnxUQkwtVzEwMFwiLFxuICAgICAgICBcIlViaXNsYXRlVGFibGV0XCI6IFwiVWJpU2xhdGVbXFxcXHNdPzdDXCIsXG4gICAgICAgIFwiUG9ja2V0Qm9va1RhYmxldFwiOiBcIlBvY2tldGJvb2tcIixcbiAgICAgICAgXCJLb2Nhc29UYWJsZXRcIjogXCJcXFxcYihUQi0xMjA3KVxcXFxiXCIsXG4gICAgICAgIFwiSGlzZW5zZVRhYmxldFwiOiBcIlxcXFxiKEY1MjgxfEUyMzcxKVxcXFxiXCIsXG4gICAgICAgIFwiSHVkbFwiOiBcIkh1ZGwgSFQ3UzN8SHVkbCAyXCIsXG4gICAgICAgIFwiVGVsc3RyYVRhYmxldFwiOiBcIlQtSHViMlwiLFxuICAgICAgICBcIkdlbmVyaWNUYWJsZXRcIjogXCJBbmRyb2lkLipcXFxcYjk3RFxcXFxifFRhYmxldCg/IS4qUEMpfEJOVFYyNTBBfE1JRC1XQ0RNQXxMb2dpY1BEIFpvb20yfFxcXFxiQTdFQlxcXFxifENhdE5vdmE4fEExXzA3fENUNzA0fENUMTAwMnxcXFxcYk03MjFcXFxcYnxyazMwc2RrfFxcXFxiRVZPVEFCXFxcXGJ8TTc1OEF8RVQ5MDR8QUxVTUlVTTEwfFNtYXJ0ZnJlbiBUYWJ8RW5kZWF2b3VyIDEwMTB8VGFibGV0LVBDLTR8VGFnaSBUYWJ8XFxcXGJNNnByb1xcXFxifENUMTAyMFd8YXJjIDEwSER8XFxcXGJUUDc1MFxcXFxiXCJcbiAgICB9LFxuICAgIFwib3NzXCI6IHtcbiAgICAgICAgXCJBbmRyb2lkT1NcIjogXCJBbmRyb2lkXCIsXG4gICAgICAgIFwiQmxhY2tCZXJyeU9TXCI6IFwiYmxhY2tiZXJyeXxcXFxcYkJCMTBcXFxcYnxyaW0gdGFibGV0IG9zXCIsXG4gICAgICAgIFwiUGFsbU9TXCI6IFwiUGFsbU9TfGF2YW50Z298YmxhemVyfGVsYWluZXxoaXB0b3B8cGFsbXxwbHVja2VyfHhpaW5vXCIsXG4gICAgICAgIFwiU3ltYmlhbk9TXCI6IFwiU3ltYmlhbnxTeW1iT1N8U2VyaWVzNjB8U2VyaWVzNDB8U1lCLVswLTldK3xcXFxcYlM2MFxcXFxiXCIsXG4gICAgICAgIFwiV2luZG93c01vYmlsZU9TXCI6IFwiV2luZG93cyBDRS4qKFBQQ3xTbWFydHBob25lfE1vYmlsZXxbMC05XXszfXhbMC05XXszfSl8V2luZG93IE1vYmlsZXxXaW5kb3dzIFBob25lIFswLTkuXSt8V0NFO1wiLFxuICAgICAgICBcIldpbmRvd3NQaG9uZU9TXCI6IFwiV2luZG93cyBQaG9uZSAxMC4wfFdpbmRvd3MgUGhvbmUgOC4xfFdpbmRvd3MgUGhvbmUgOC4wfFdpbmRvd3MgUGhvbmUgT1N8WEJMV1A3fFp1bmVXUDd8V2luZG93cyBOVCA2LlsyM107IEFSTTtcIixcbiAgICAgICAgXCJpT1NcIjogXCJcXFxcYmlQaG9uZS4qTW9iaWxlfFxcXFxiaVBvZHxcXFxcYmlQYWRcIixcbiAgICAgICAgXCJNZWVHb09TXCI6IFwiTWVlR29cIixcbiAgICAgICAgXCJNYWVtb09TXCI6IFwiTWFlbW9cIixcbiAgICAgICAgXCJKYXZhT1NcIjogXCJKMk1FXFwvfFxcXFxiTUlEUFxcXFxifFxcXFxiQ0xEQ1xcXFxiXCIsXG4gICAgICAgIFwid2ViT1NcIjogXCJ3ZWJPU3xocHdPU1wiLFxuICAgICAgICBcImJhZGFPU1wiOiBcIlxcXFxiQmFkYVxcXFxiXCIsXG4gICAgICAgIFwiQlJFV09TXCI6IFwiQlJFV1wiXG4gICAgfSxcbiAgICBcInVhc1wiOiB7XG4gICAgICAgIFwiQ2hyb21lXCI6IFwiXFxcXGJDck1vXFxcXGJ8Q3JpT1N8QW5kcm9pZC4qQ2hyb21lXFwvWy4wLTldKiAoTW9iaWxlKT9cIixcbiAgICAgICAgXCJEb2xmaW5cIjogXCJcXFxcYkRvbGZpblxcXFxiXCIsXG4gICAgICAgIFwiT3BlcmFcIjogXCJPcGVyYS4qTWluaXxPcGVyYS4qTW9iaXxBbmRyb2lkLipPcGVyYXxNb2JpbGUuKk9QUlxcL1swLTkuXSt8Q29hc3RcXC9bMC05Ll0rXCIsXG4gICAgICAgIFwiU2t5ZmlyZVwiOiBcIlNreWZpcmVcIixcbiAgICAgICAgXCJFZGdlXCI6IFwiTW9iaWxlIFNhZmFyaVxcL1suMC05XSogRWRnZVwiLFxuICAgICAgICBcIklFXCI6IFwiSUVNb2JpbGV8TVNJRU1vYmlsZVwiLFxuICAgICAgICBcIkZpcmVmb3hcIjogXCJmZW5uZWN8ZmlyZWZveC4qbWFlbW98KE1vYmlsZXxUYWJsZXQpLipGaXJlZm94fEZpcmVmb3guKk1vYmlsZXxGeGlPU1wiLFxuICAgICAgICBcIkJvbHRcIjogXCJib2x0XCIsXG4gICAgICAgIFwiVGVhU2hhcmtcIjogXCJ0ZWFzaGFya1wiLFxuICAgICAgICBcIkJsYXplclwiOiBcIkJsYXplclwiLFxuICAgICAgICBcIlNhZmFyaVwiOiBcIlZlcnNpb24uKk1vYmlsZS4qU2FmYXJpfFNhZmFyaS4qTW9iaWxlfE1vYmlsZVNhZmFyaVwiLFxuICAgICAgICBcIlVDQnJvd3NlclwiOiBcIlVDLipCcm93c2VyfFVDV0VCXCIsXG4gICAgICAgIFwiYmFpZHVib3hhcHBcIjogXCJiYWlkdWJveGFwcFwiLFxuICAgICAgICBcImJhaWR1YnJvd3NlclwiOiBcImJhaWR1YnJvd3NlclwiLFxuICAgICAgICBcIkRpaWdvQnJvd3NlclwiOiBcIkRpaWdvQnJvd3NlclwiLFxuICAgICAgICBcIlB1ZmZpblwiOiBcIlB1ZmZpblwiLFxuICAgICAgICBcIk1lcmN1cnlcIjogXCJcXFxcYk1lcmN1cnlcXFxcYlwiLFxuICAgICAgICBcIk9iaWdvQnJvd3NlclwiOiBcIk9iaWdvXCIsXG4gICAgICAgIFwiTmV0RnJvbnRcIjogXCJORi1Ccm93c2VyXCIsXG4gICAgICAgIFwiR2VuZXJpY0Jyb3dzZXJcIjogXCJOb2tpYUJyb3dzZXJ8T3ZpQnJvd3NlcnxPbmVCcm93c2VyfFR3b25reUJlYW1Ccm93c2VyfFNFTUMuKkJyb3dzZXJ8Rmx5Rmxvd3xNaW5pbW98TmV0RnJvbnR8Tm92YXJyYS1WaXNpb258TVFRQnJvd3NlcnxNaWNyb01lc3NlbmdlclwiLFxuICAgICAgICBcIlBhbGVNb29uXCI6IFwiQW5kcm9pZC4qUGFsZU1vb258TW9iaWxlLipQYWxlTW9vblwiXG4gICAgfSxcbiAgICBcInByb3BzXCI6IHtcbiAgICAgICAgXCJNb2JpbGVcIjogXCJNb2JpbGVcXC9bVkVSXVwiLFxuICAgICAgICBcIkJ1aWxkXCI6IFwiQnVpbGRcXC9bVkVSXVwiLFxuICAgICAgICBcIlZlcnNpb25cIjogXCJWZXJzaW9uXFwvW1ZFUl1cIixcbiAgICAgICAgXCJWZW5kb3JJRFwiOiBcIlZlbmRvcklEXFwvW1ZFUl1cIixcbiAgICAgICAgXCJpUGFkXCI6IFwiaVBhZC4qQ1BVW2EteiBdK1tWRVJdXCIsXG4gICAgICAgIFwiaVBob25lXCI6IFwiaVBob25lLipDUFVbYS16IF0rW1ZFUl1cIixcbiAgICAgICAgXCJpUG9kXCI6IFwiaVBvZC4qQ1BVW2EteiBdK1tWRVJdXCIsXG4gICAgICAgIFwiS2luZGxlXCI6IFwiS2luZGxlXFwvW1ZFUl1cIixcbiAgICAgICAgXCJDaHJvbWVcIjogW1xuICAgICAgICAgICAgXCJDaHJvbWVcXC9bVkVSXVwiLFxuICAgICAgICAgICAgXCJDcmlPU1xcL1tWRVJdXCIsXG4gICAgICAgICAgICBcIkNyTW9cXC9bVkVSXVwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiQ29hc3RcIjogW1xuICAgICAgICAgICAgXCJDb2FzdFxcL1tWRVJdXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJEb2xmaW5cIjogXCJEb2xmaW5cXC9bVkVSXVwiLFxuICAgICAgICBcIkZpcmVmb3hcIjogW1xuICAgICAgICAgICAgXCJGaXJlZm94XFwvW1ZFUl1cIixcbiAgICAgICAgICAgIFwiRnhpT1NcXC9bVkVSXVwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiRmVubmVjXCI6IFwiRmVubmVjXFwvW1ZFUl1cIixcbiAgICAgICAgXCJFZGdlXCI6IFwiRWRnZVxcL1tWRVJdXCIsXG4gICAgICAgIFwiSUVcIjogW1xuICAgICAgICAgICAgXCJJRU1vYmlsZVxcL1tWRVJdO1wiLFxuICAgICAgICAgICAgXCJJRU1vYmlsZSBbVkVSXVwiLFxuICAgICAgICAgICAgXCJNU0lFIFtWRVJdO1wiLFxuICAgICAgICAgICAgXCJUcmlkZW50XFwvWzAtOS5dKzsuKnJ2OltWRVJdXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJOZXRGcm9udFwiOiBcIk5ldEZyb250XFwvW1ZFUl1cIixcbiAgICAgICAgXCJOb2tpYUJyb3dzZXJcIjogXCJOb2tpYUJyb3dzZXJcXC9bVkVSXVwiLFxuICAgICAgICBcIk9wZXJhXCI6IFtcbiAgICAgICAgICAgIFwiIE9QUlxcL1tWRVJdXCIsXG4gICAgICAgICAgICBcIk9wZXJhIE1pbmlcXC9bVkVSXVwiLFxuICAgICAgICAgICAgXCJWZXJzaW9uXFwvW1ZFUl1cIlxuICAgICAgICBdLFxuICAgICAgICBcIk9wZXJhIE1pbmlcIjogXCJPcGVyYSBNaW5pXFwvW1ZFUl1cIixcbiAgICAgICAgXCJPcGVyYSBNb2JpXCI6IFwiVmVyc2lvblxcL1tWRVJdXCIsXG4gICAgICAgIFwiVUMgQnJvd3NlclwiOiBcIlVDIEJyb3dzZXJbVkVSXVwiLFxuICAgICAgICBcIk1RUUJyb3dzZXJcIjogXCJNUVFCcm93c2VyXFwvW1ZFUl1cIixcbiAgICAgICAgXCJNaWNyb01lc3NlbmdlclwiOiBcIk1pY3JvTWVzc2VuZ2VyXFwvW1ZFUl1cIixcbiAgICAgICAgXCJiYWlkdWJveGFwcFwiOiBcImJhaWR1Ym94YXBwXFwvW1ZFUl1cIixcbiAgICAgICAgXCJiYWlkdWJyb3dzZXJcIjogXCJiYWlkdWJyb3dzZXJcXC9bVkVSXVwiLFxuICAgICAgICBcIlNhbXN1bmdCcm93c2VyXCI6IFwiU2Ftc3VuZ0Jyb3dzZXJcXC9bVkVSXVwiLFxuICAgICAgICBcIklyb25cIjogXCJJcm9uXFwvW1ZFUl1cIixcbiAgICAgICAgXCJTYWZhcmlcIjogW1xuICAgICAgICAgICAgXCJWZXJzaW9uXFwvW1ZFUl1cIixcbiAgICAgICAgICAgIFwiU2FmYXJpXFwvW1ZFUl1cIlxuICAgICAgICBdLFxuICAgICAgICBcIlNreWZpcmVcIjogXCJTa3lmaXJlXFwvW1ZFUl1cIixcbiAgICAgICAgXCJUaXplblwiOiBcIlRpemVuXFwvW1ZFUl1cIixcbiAgICAgICAgXCJXZWJraXRcIjogXCJ3ZWJraXRbIFxcL11bVkVSXVwiLFxuICAgICAgICBcIlBhbGVNb29uXCI6IFwiUGFsZU1vb25cXC9bVkVSXVwiLFxuICAgICAgICBcIkdlY2tvXCI6IFwiR2Vja29cXC9bVkVSXVwiLFxuICAgICAgICBcIlRyaWRlbnRcIjogXCJUcmlkZW50XFwvW1ZFUl1cIixcbiAgICAgICAgXCJQcmVzdG9cIjogXCJQcmVzdG9cXC9bVkVSXVwiLFxuICAgICAgICBcIkdvYW5uYVwiOiBcIkdvYW5uYVxcL1tWRVJdXCIsXG4gICAgICAgIFwiaU9TXCI6IFwiIFxcXFxiaT9PU1xcXFxiIFtWRVJdWyA7XXsxfVwiLFxuICAgICAgICBcIkFuZHJvaWRcIjogXCJBbmRyb2lkIFtWRVJdXCIsXG4gICAgICAgIFwiQmxhY2tCZXJyeVwiOiBbXG4gICAgICAgICAgICBcIkJsYWNrQmVycnlbXFxcXHddK1xcL1tWRVJdXCIsXG4gICAgICAgICAgICBcIkJsYWNrQmVycnkuKlZlcnNpb25cXC9bVkVSXVwiLFxuICAgICAgICAgICAgXCJWZXJzaW9uXFwvW1ZFUl1cIlxuICAgICAgICBdLFxuICAgICAgICBcIkJSRVdcIjogXCJCUkVXIFtWRVJdXCIsXG4gICAgICAgIFwiSmF2YVwiOiBcIkphdmFcXC9bVkVSXVwiLFxuICAgICAgICBcIldpbmRvd3MgUGhvbmUgT1NcIjogW1xuICAgICAgICAgICAgXCJXaW5kb3dzIFBob25lIE9TIFtWRVJdXCIsXG4gICAgICAgICAgICBcIldpbmRvd3MgUGhvbmUgW1ZFUl1cIlxuICAgICAgICBdLFxuICAgICAgICBcIldpbmRvd3MgUGhvbmVcIjogXCJXaW5kb3dzIFBob25lIFtWRVJdXCIsXG4gICAgICAgIFwiV2luZG93cyBDRVwiOiBcIldpbmRvd3MgQ0VcXC9bVkVSXVwiLFxuICAgICAgICBcIldpbmRvd3MgTlRcIjogXCJXaW5kb3dzIE5UIFtWRVJdXCIsXG4gICAgICAgIFwiU3ltYmlhblwiOiBbXG4gICAgICAgICAgICBcIlN5bWJpYW5PU1xcL1tWRVJdXCIsXG4gICAgICAgICAgICBcIlN5bWJpYW5cXC9bVkVSXVwiXG4gICAgICAgIF0sXG4gICAgICAgIFwid2ViT1NcIjogW1xuICAgICAgICAgICAgXCJ3ZWJPU1xcL1tWRVJdXCIsXG4gICAgICAgICAgICBcImhwd09TXFwvW1ZFUl07XCJcbiAgICAgICAgXVxuICAgIH0sXG4gICAgXCJ1dGlsc1wiOiB7XG4gICAgICAgIFwiQm90XCI6IFwiR29vZ2xlYm90fGZhY2Vib29rZXh0ZXJuYWxoaXR8QWRzQm90LUdvb2dsZXxHb29nbGUgS2V5d29yZCBTdWdnZXN0aW9ufEZhY2Vib3R8WWFuZGV4Qm90fFlhbmRleE1vYmlsZUJvdHxiaW5nYm90fGlhX2FyY2hpdmVyfEFocmVmc0JvdHxFem9vbXN8R1NMRmJvdHxXQlNlYXJjaEJvdHxUd2l0dGVyYm90fFR3ZWV0bWVtZUJvdHxUd2lrbGV8UGFwZXJMaUJvdHxXb3Rib3h8VW53aW5kRmV0Y2hvcnxFeGFib3R8TUoxMmJvdHxZYW5kZXhJbWFnZXN8VHVybml0aW5Cb3R8UGluZ2RvbVwiLFxuICAgICAgICBcIk1vYmlsZUJvdFwiOiBcIkdvb2dsZWJvdC1Nb2JpbGV8QWRzQm90LUdvb2dsZS1Nb2JpbGV8WWFob29TZWVrZXJcXC9NMUExLVIyRDJcIixcbiAgICAgICAgXCJEZXNrdG9wTW9kZVwiOiBcIldQRGVza3RvcFwiLFxuICAgICAgICBcIlRWXCI6IFwiU29ueURUVnxIYmJUVlwiLFxuICAgICAgICBcIldlYktpdFwiOiBcIih3ZWJraXQpWyBcXC9dKFtcXFxcdy5dKylcIixcbiAgICAgICAgXCJDb25zb2xlXCI6IFwiXFxcXGIoTmludGVuZG98TmludGVuZG8gV2lpVXxOaW50ZW5kbyAzRFN8UExBWVNUQVRJT058WGJveClcXFxcYlwiLFxuICAgICAgICBcIldhdGNoXCI6IFwiU00tVjcwMFwiXG4gICAgfVxufTtcblxuICAgIC8vIGZvbGxvd2luZyBwYXR0ZXJucyBjb21lIGZyb20gaHR0cDovL2RldGVjdG1vYmlsZWJyb3dzZXJzLmNvbS9cbiAgICBpbXBsLmRldGVjdE1vYmlsZUJyb3dzZXJzID0ge1xuICAgICAgICBmdWxsUGF0dGVybjogLyhhbmRyb2lkfGJiXFxkK3xtZWVnbykuK21vYmlsZXxhdmFudGdvfGJhZGFcXC98YmxhY2tiZXJyeXxibGF6ZXJ8Y29tcGFsfGVsYWluZXxmZW5uZWN8aGlwdG9wfGllbW9iaWxlfGlwKGhvbmV8b2QpfGlyaXN8a2luZGxlfGxnZSB8bWFlbW98bWlkcHxtbXB8bW9iaWxlLitmaXJlZm94fG5ldGZyb250fG9wZXJhIG0ob2J8aW4paXxwYWxtKCBvcyk/fHBob25lfHAoaXhpfHJlKVxcL3xwbHVja2VyfHBvY2tldHxwc3B8c2VyaWVzKDR8NikwfHN5bWJpYW58dHJlb3x1cFxcLihicm93c2VyfGxpbmspfHZvZGFmb25lfHdhcHx3aW5kb3dzIGNlfHhkYXx4aWluby9pLFxuICAgICAgICBzaG9ydFBhdHRlcm46IC8xMjA3fDYzMTB8NjU5MHwzZ3NvfDR0aHB8NTBbMS02XWl8Nzcwc3w4MDJzfGEgd2F8YWJhY3xhYyhlcnxvb3xzXFwtKXxhaShrb3xybil8YWwoYXZ8Y2F8Y28pfGFtb2l8YW4oZXh8bnl8eXcpfGFwdHV8YXIoY2h8Z28pfGFzKHRlfHVzKXxhdHR3fGF1KGRpfFxcLW18ciB8cyApfGF2YW58YmUoY2t8bGx8bnEpfGJpKGxifHJkKXxibChhY3xheil8YnIoZXx2KXd8YnVtYnxid1xcLShufHUpfGM1NVxcL3xjYXBpfGNjd2F8Y2RtXFwtfGNlbGx8Y2h0bXxjbGRjfGNtZFxcLXxjbyhtcHxuZCl8Y3Jhd3xkYShpdHxsbHxuZyl8ZGJ0ZXxkY1xcLXN8ZGV2aXxkaWNhfGRtb2J8ZG8oY3xwKW98ZHMoMTJ8XFwtZCl8ZWwoNDl8YWkpfGVtKGwyfHVsKXxlcihpY3xrMCl8ZXNsOHxleihbNC03XTB8b3N8d2F8emUpfGZldGN8Zmx5KFxcLXxfKXxnMSB1fGc1NjB8Z2VuZXxnZlxcLTV8Z1xcLW1vfGdvKFxcLnd8b2QpfGdyKGFkfHVuKXxoYWllfGhjaXR8aGRcXC0obXxwfHQpfGhlaVxcLXxoaShwdHx0YSl8aHAoIGl8aXApfGhzXFwtY3xodChjKFxcLXwgfF98YXxnfHB8c3x0KXx0cCl8aHUoYXd8dGMpfGlcXC0oMjB8Z298bWEpfGkyMzB8aWFjKCB8XFwtfFxcLyl8aWJyb3xpZGVhfGlnMDF8aWtvbXxpbTFrfGlubm98aXBhcXxpcmlzfGphKHR8dilhfGpicm98amVtdXxqaWdzfGtkZGl8a2VqaXxrZ3QoIHxcXC8pfGtsb258a3B0IHxrd2NcXC18a3lvKGN8ayl8bGUobm98eGkpfGxnKCBnfFxcLyhrfGx8dSl8NTB8NTR8XFwtW2Etd10pfGxpYnd8bHlueHxtMVxcLXd8bTNnYXxtNTBcXC98bWEodGV8dWl8eG8pfG1jKDAxfDIxfGNhKXxtXFwtY3J8bWUocmN8cmkpfG1pKG84fG9hfHRzKXxtbWVmfG1vKDAxfDAyfGJpfGRlfGRvfHQoXFwtfCB8b3x2KXx6eil8bXQoNTB8cDF8diApfG13YnB8bXl3YXxuMTBbMC0yXXxuMjBbMi0zXXxuMzAoMHwyKXxuNTAoMHwyfDUpfG43KDAoMHwxKXwxMCl8bmUoKGN8bSlcXC18b258dGZ8d2Z8d2d8d3QpfG5vayg2fGkpfG56cGh8bzJpbXxvcCh0aXx3dil8b3Jhbnxvd2cxfHA4MDB8cGFuKGF8ZHx0KXxwZHhnfHBnKDEzfFxcLShbMS04XXxjKSl8cGhpbHxwaXJlfHBsKGF5fHVjKXxwblxcLTJ8cG8oY2t8cnR8c2UpfHByb3h8cHNpb3xwdFxcLWd8cWFcXC1hfHFjKDA3fDEyfDIxfDMyfDYwfFxcLVsyLTddfGlcXC0pfHF0ZWt8cjM4MHxyNjAwfHJha3N8cmltOXxybyh2ZXx6byl8czU1XFwvfHNhKGdlfG1hfG1tfG1zfG55fHZhKXxzYygwMXxoXFwtfG9vfHBcXC0pfHNka1xcL3xzZShjKFxcLXwwfDEpfDQ3fG1jfG5kfHJpKXxzZ2hcXC18c2hhcnxzaWUoXFwtfG0pfHNrXFwtMHxzbCg0NXxpZCl8c20oYWx8YXJ8YjN8aXR8dDUpfHNvKGZ0fG55KXxzcCgwMXxoXFwtfHZcXC18diApfHN5KDAxfG1iKXx0MigxOHw1MCl8dDYoMDB8MTB8MTgpfHRhKGd0fGxrKXx0Y2xcXC18dGRnXFwtfHRlbChpfG0pfHRpbVxcLXx0XFwtbW98dG8ocGx8c2gpfHRzKDcwfG1cXC18bTN8bTUpfHR4XFwtOXx1cChcXC5ifGcxfHNpKXx1dHN0fHY0MDB8djc1MHx2ZXJpfHZpKHJnfHRlKXx2ayg0MHw1WzAtM118XFwtdil8dm00MHx2b2RhfHZ1bGN8dngoNTJ8NTN8NjB8NjF8NzB8ODB8ODF8ODN8ODV8OTgpfHczYyhcXC18ICl8d2ViY3x3aGl0fHdpKGcgfG5jfG53KXx3bWxifHdvbnV8eDcwMHx5YXNcXC18eW91cnx6ZXRvfHp0ZVxcLS9pLFxuICAgICAgICB0YWJsZXRQYXR0ZXJuOiAvYW5kcm9pZHxpcGFkfHBsYXlib29rfHNpbGsvaVxuICAgIH07XG5cbiAgICB2YXIgaGFzT3duUHJvcCA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksXG4gICAgICAgIGlzQXJyYXk7XG5cbiAgICBpbXBsLkZBTExCQUNLX1BIT05FID0gJ1Vua25vd25QaG9uZSc7XG4gICAgaW1wbC5GQUxMQkFDS19UQUJMRVQgPSAnVW5rbm93blRhYmxldCc7XG4gICAgaW1wbC5GQUxMQkFDS19NT0JJTEUgPSAnVW5rbm93bk1vYmlsZSc7XG5cbiAgICBpc0FycmF5ID0gKCdpc0FycmF5JyBpbiBBcnJheSkgP1xuICAgICAgICBBcnJheS5pc0FycmF5IDogZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBBcnJheV0nOyB9O1xuXG4gICAgZnVuY3Rpb24gZXF1YWxJQyhhLCBiKSB7XG4gICAgICAgIHJldHVybiBhICE9IG51bGwgJiYgYiAhPSBudWxsICYmIGEudG9Mb3dlckNhc2UoKSA9PT0gYi50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbnRhaW5zSUMoYXJyYXksIHZhbHVlKSB7XG4gICAgICAgIHZhciB2YWx1ZUxDLCBpLCBsZW4gPSBhcnJheS5sZW5ndGg7XG4gICAgICAgIGlmICghbGVuIHx8ICF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlTEMgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZUxDID09PSBhcnJheVtpXS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbnZlcnRQcm9wc1RvUmVnRXhwKG9iamVjdCkge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgICBpZiAoaGFzT3duUHJvcC5jYWxsKG9iamVjdCwga2V5KSkge1xuICAgICAgICAgICAgICAgIG9iamVjdFtrZXldID0gbmV3IFJlZ0V4cChvYmplY3Rba2V5XSwgJ2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIChmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICB2YXIga2V5LCB2YWx1ZXMsIHZhbHVlLCBpLCBsZW4sIHZlclBvcywgbW9iaWxlRGV0ZWN0UnVsZXMgPSBpbXBsLm1vYmlsZURldGVjdFJ1bGVzO1xuICAgICAgICBmb3IgKGtleSBpbiBtb2JpbGVEZXRlY3RSdWxlcy5wcm9wcykge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AuY2FsbChtb2JpbGVEZXRlY3RSdWxlcy5wcm9wcywga2V5KSkge1xuICAgICAgICAgICAgICAgIHZhbHVlcyA9IG1vYmlsZURldGVjdFJ1bGVzLnByb3BzW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKCFpc0FycmF5KHZhbHVlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gW3ZhbHVlc107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxlbiA9IHZhbHVlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzW2ldO1xuICAgICAgICAgICAgICAgICAgICB2ZXJQb3MgPSB2YWx1ZS5pbmRleE9mKCdbVkVSXScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmVyUG9zID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIHZlclBvcykgKyAnKFtcXFxcdy5fXFxcXCtdKyknICsgdmFsdWUuc3Vic3RyaW5nKHZlclBvcyArIDUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IG5ldyBSZWdFeHAodmFsdWUsICdpJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1vYmlsZURldGVjdFJ1bGVzLnByb3BzW2tleV0gPSB2YWx1ZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udmVydFByb3BzVG9SZWdFeHAobW9iaWxlRGV0ZWN0UnVsZXMub3NzKTtcbiAgICAgICAgY29udmVydFByb3BzVG9SZWdFeHAobW9iaWxlRGV0ZWN0UnVsZXMucGhvbmVzKTtcbiAgICAgICAgY29udmVydFByb3BzVG9SZWdFeHAobW9iaWxlRGV0ZWN0UnVsZXMudGFibGV0cyk7XG4gICAgICAgIGNvbnZlcnRQcm9wc1RvUmVnRXhwKG1vYmlsZURldGVjdFJ1bGVzLnVhcyk7XG4gICAgICAgIGNvbnZlcnRQcm9wc1RvUmVnRXhwKG1vYmlsZURldGVjdFJ1bGVzLnV0aWxzKTtcblxuICAgICAgICAvLyBjb3B5IHNvbWUgcGF0dGVybnMgdG8gb3NzMCB3aGljaCBhcmUgdGVzdGVkIGZpcnN0IChzZWUgaXNzdWUjMTUpXG4gICAgICAgIG1vYmlsZURldGVjdFJ1bGVzLm9zczAgPSB7XG4gICAgICAgICAgICBXaW5kb3dzUGhvbmVPUzogbW9iaWxlRGV0ZWN0UnVsZXMub3NzLldpbmRvd3NQaG9uZU9TLFxuICAgICAgICAgICAgV2luZG93c01vYmlsZU9TOiBtb2JpbGVEZXRlY3RSdWxlcy5vc3MuV2luZG93c01vYmlsZU9TXG4gICAgICAgIH07XG4gICAgfSgpKTtcblxuICAgIC8qKlxuICAgICAqIFRlc3QgdXNlckFnZW50IHN0cmluZyBhZ2FpbnN0IGEgc2V0IG9mIHJ1bGVzIGFuZCBmaW5kIHRoZSBmaXJzdCBtYXRjaGVkIGtleS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gcnVsZXMgKGtleSBpcyBTdHJpbmcsIHZhbHVlIGlzIFJlZ0V4cClcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXNlckFnZW50IHRoZSBuYXZpZ2F0b3IudXNlckFnZW50IChvciBIVFRQLUhlYWRlciAnVXNlci1BZ2VudCcpLlxuICAgICAqIEByZXR1cm5zIHtTdHJpbmd8bnVsbH0gdGhlIG1hdGNoZWQga2V5IGlmIGZvdW5kLCBvdGhlcndpc2UgPHR0Pm51bGw8L3R0PlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgaW1wbC5maW5kTWF0Y2ggPSBmdW5jdGlvbihydWxlcywgdXNlckFnZW50KSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBydWxlcykge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AuY2FsbChydWxlcywga2V5KSkge1xuICAgICAgICAgICAgICAgIGlmIChydWxlc1trZXldLnRlc3QodXNlckFnZW50KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVGVzdCB1c2VyQWdlbnQgc3RyaW5nIGFnYWluc3QgYSBzZXQgb2YgcnVsZXMgYW5kIHJldHVybiBhbiBhcnJheSBvZiBtYXRjaGVkIGtleXMuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHJ1bGVzIChrZXkgaXMgU3RyaW5nLCB2YWx1ZSBpcyBSZWdFeHApXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVzZXJBZ2VudCB0aGUgbmF2aWdhdG9yLnVzZXJBZ2VudCAob3IgSFRUUC1IZWFkZXIgJ1VzZXItQWdlbnQnKS5cbiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IGFuIGFycmF5IG9mIG1hdGNoZWQga2V5cywgbWF5IGJlIGVtcHR5IHdoZW4gdGhlcmUgaXMgbm8gbWF0Y2gsIGJ1dCBub3QgPHR0Pm51bGw8L3R0PlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgaW1wbC5maW5kTWF0Y2hlcyA9IGZ1bmN0aW9uKHJ1bGVzLCB1c2VyQWdlbnQpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gcnVsZXMpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wLmNhbGwocnVsZXMsIGtleSkpIHtcbiAgICAgICAgICAgICAgICBpZiAocnVsZXNba2V5XS50ZXN0KHVzZXJBZ2VudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhlIHZlcnNpb24gb2YgdGhlIGdpdmVuIHByb3BlcnR5IGluIHRoZSBVc2VyLUFnZW50LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5TmFtZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1c2VyQWdlbnRcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IHZlcnNpb24gb3IgPHR0Pm51bGw8L3R0PiBpZiB2ZXJzaW9uIG5vdCBmb3VuZFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgaW1wbC5nZXRWZXJzaW9uU3RyID0gZnVuY3Rpb24gKHByb3BlcnR5TmFtZSwgdXNlckFnZW50KSB7XG4gICAgICAgIHZhciBwcm9wcyA9IGltcGwubW9iaWxlRGV0ZWN0UnVsZXMucHJvcHMsIHBhdHRlcm5zLCBpLCBsZW4sIG1hdGNoO1xuICAgICAgICBpZiAoaGFzT3duUHJvcC5jYWxsKHByb3BzLCBwcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgICAgICBwYXR0ZXJucyA9IHByb3BzW3Byb3BlcnR5TmFtZV07XG4gICAgICAgICAgICBsZW4gPSBwYXR0ZXJucy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgICAgICAgICAgICBtYXRjaCA9IHBhdHRlcm5zW2ldLmV4ZWModXNlckFnZW50KTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2ggIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhlIHZlcnNpb24gb2YgdGhlIGdpdmVuIHByb3BlcnR5IGluIHRoZSBVc2VyLUFnZW50LlxuICAgICAqIFdpbGwgcmV0dXJuIGEgZmxvYXQgbnVtYmVyLiAoZWcuIDJfMCB3aWxsIHJldHVybiAyLjAsIDQuMy4xIHdpbGwgcmV0dXJuIDQuMzEpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHlOYW1lXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVzZXJBZ2VudFxuICAgICAqIEByZXR1cm4ge051bWJlcn0gdmVyc2lvbiBvciA8dHQ+TmFOPC90dD4gaWYgdmVyc2lvbiBub3QgZm91bmRcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGltcGwuZ2V0VmVyc2lvbiA9IGZ1bmN0aW9uIChwcm9wZXJ0eU5hbWUsIHVzZXJBZ2VudCkge1xuICAgICAgICB2YXIgdmVyc2lvbiA9IGltcGwuZ2V0VmVyc2lvblN0cihwcm9wZXJ0eU5hbWUsIHVzZXJBZ2VudCk7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uID8gaW1wbC5wcmVwYXJlVmVyc2lvbk5vKHZlcnNpb24pIDogTmFOO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlIHRoZSB2ZXJzaW9uIG51bWJlci5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB2ZXJzaW9uXG4gICAgICogQHJldHVybiB7TnVtYmVyfSB0aGUgdmVyc2lvbiBudW1iZXIgYXMgYSBmbG9hdGluZyBudW1iZXJcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIGltcGwucHJlcGFyZVZlcnNpb25ObyA9IGZ1bmN0aW9uICh2ZXJzaW9uKSB7XG4gICAgICAgIHZhciBudW1iZXJzO1xuXG4gICAgICAgIG51bWJlcnMgPSB2ZXJzaW9uLnNwbGl0KC9bYS16Ll8gXFwvXFwtXS9pKTtcbiAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB2ZXJzaW9uID0gbnVtYmVyc1swXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnVtYmVycy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2ZXJzaW9uID0gbnVtYmVyc1swXSArICcuJztcbiAgICAgICAgICAgIG51bWJlcnMuc2hpZnQoKTtcbiAgICAgICAgICAgIHZlcnNpb24gKz0gbnVtYmVycy5qb2luKCcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTnVtYmVyKHZlcnNpb24pO1xuICAgIH07XG5cbiAgICBpbXBsLmlzTW9iaWxlRmFsbGJhY2sgPSBmdW5jdGlvbiAodXNlckFnZW50KSB7XG4gICAgICAgIHJldHVybiBpbXBsLmRldGVjdE1vYmlsZUJyb3dzZXJzLmZ1bGxQYXR0ZXJuLnRlc3QodXNlckFnZW50KSB8fFxuICAgICAgICAgICAgaW1wbC5kZXRlY3RNb2JpbGVCcm93c2Vycy5zaG9ydFBhdHRlcm4udGVzdCh1c2VyQWdlbnQuc3Vic3RyKDAsNCkpO1xuICAgIH07XG5cbiAgICBpbXBsLmlzVGFibGV0RmFsbGJhY2sgPSBmdW5jdGlvbiAodXNlckFnZW50KSB7XG4gICAgICAgIHJldHVybiBpbXBsLmRldGVjdE1vYmlsZUJyb3dzZXJzLnRhYmxldFBhdHRlcm4udGVzdCh1c2VyQWdlbnQpO1xuICAgIH07XG5cbiAgICBpbXBsLnByZXBhcmVEZXRlY3Rpb25DYWNoZSA9IGZ1bmN0aW9uIChjYWNoZSwgdXNlckFnZW50LCBtYXhQaG9uZVdpZHRoKSB7XG4gICAgICAgIGlmIChjYWNoZS5tb2JpbGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwaG9uZSwgdGFibGV0LCBwaG9uZVNpemVkO1xuXG4gICAgICAgIC8vIGZpcnN0IGNoZWNrIGZvciBzdHJvbmdlciB0YWJsZXQgcnVsZXMsIHRoZW4gcGhvbmUgKHNlZSBpc3N1ZSM1KVxuICAgICAgICB0YWJsZXQgPSBpbXBsLmZpbmRNYXRjaChpbXBsLm1vYmlsZURldGVjdFJ1bGVzLnRhYmxldHMsIHVzZXJBZ2VudCk7XG4gICAgICAgIGlmICh0YWJsZXQpIHtcbiAgICAgICAgICAgIGNhY2hlLm1vYmlsZSA9IGNhY2hlLnRhYmxldCA9IHRhYmxldDtcbiAgICAgICAgICAgIGNhY2hlLnBob25lID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybjsgLy8gdW5hbWJpZ3VvdXNseSBpZGVudGlmaWVkIGFzIHRhYmxldFxuICAgICAgICB9XG5cbiAgICAgICAgcGhvbmUgPSBpbXBsLmZpbmRNYXRjaChpbXBsLm1vYmlsZURldGVjdFJ1bGVzLnBob25lcywgdXNlckFnZW50KTtcbiAgICAgICAgaWYgKHBob25lKSB7XG4gICAgICAgICAgICBjYWNoZS5tb2JpbGUgPSBjYWNoZS5waG9uZSA9IHBob25lO1xuICAgICAgICAgICAgY2FjaGUudGFibGV0ID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybjsgLy8gdW5hbWJpZ3VvdXNseSBpZGVudGlmaWVkIGFzIHBob25lXG4gICAgICAgIH1cblxuICAgICAgICAvLyBvdXIgcnVsZXMgaGF2ZW4ndCBmb3VuZCBhIG1hdGNoIC0+IHRyeSBtb3JlIGdlbmVyYWwgZmFsbGJhY2sgcnVsZXNcbiAgICAgICAgaWYgKGltcGwuaXNNb2JpbGVGYWxsYmFjayh1c2VyQWdlbnQpKSB7XG4gICAgICAgICAgICBwaG9uZVNpemVkID0gTW9iaWxlRGV0ZWN0LmlzUGhvbmVTaXplZChtYXhQaG9uZVdpZHRoKTtcbiAgICAgICAgICAgIGlmIChwaG9uZVNpemVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjYWNoZS5tb2JpbGUgPSBpbXBsLkZBTExCQUNLX01PQklMRTtcbiAgICAgICAgICAgICAgICBjYWNoZS50YWJsZXQgPSBjYWNoZS5waG9uZSA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBob25lU2l6ZWQpIHtcbiAgICAgICAgICAgICAgICBjYWNoZS5tb2JpbGUgPSBjYWNoZS5waG9uZSA9IGltcGwuRkFMTEJBQ0tfUEhPTkU7XG4gICAgICAgICAgICAgICAgY2FjaGUudGFibGV0ID0gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FjaGUubW9iaWxlID0gY2FjaGUudGFibGV0ID0gaW1wbC5GQUxMQkFDS19UQUJMRVQ7XG4gICAgICAgICAgICAgICAgY2FjaGUucGhvbmUgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGltcGwuaXNUYWJsZXRGYWxsYmFjayh1c2VyQWdlbnQpKSB7XG4gICAgICAgICAgICBjYWNoZS5tb2JpbGUgPSBjYWNoZS50YWJsZXQgPSBpbXBsLkZBTExCQUNLX1RBQkxFVDtcbiAgICAgICAgICAgIGNhY2hlLnBob25lID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG5vdCBtb2JpbGUgYXQgYWxsIVxuICAgICAgICAgICAgY2FjaGUubW9iaWxlID0gY2FjaGUudGFibGV0ID0gY2FjaGUucGhvbmUgPSBudWxsO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8vIHQgaXMgYSByZWZlcmVuY2UgdG8gYSBNb2JpbGVEZXRlY3QgaW5zdGFuY2VcbiAgICBpbXBsLm1vYmlsZUdyYWRlID0gZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgLy8gaW1wbCBub3RlOlxuICAgICAgICAvLyBUbyBrZWVwIGluIHN5bmMgdy8gTW9iaWxlX0RldGVjdC5waHAgZWFzaWx5LCB0aGUgZm9sbG93aW5nIGNvZGUgaXMgdGlnaHRseSBhbGlnbmVkIHRvIHRoZSBQSFAgdmVyc2lvbi5cbiAgICAgICAgLy8gV2hlbiBjaGFuZ2VzIGFyZSBtYWRlIGluIE1vYmlsZV9EZXRlY3QucGhwLCBjb3B5IHRoaXMgbWV0aG9kIGFuZCByZXBsYWNlOlxuICAgICAgICAvLyAgICAgJHRoaXMtPiAvIHQuXG4gICAgICAgIC8vICAgICBzZWxmOjpNT0JJTEVfR1JBREVfKC4pIC8gJyQxJ1xuICAgICAgICAvLyAgICAgLCBzZWxmOjpWRVJTSU9OX1RZUEVfRkxPQVQgLyAobm90aGluZylcbiAgICAgICAgLy8gICAgIGlzSU9TKCkgLyBvcygnaU9TJylcbiAgICAgICAgLy8gICAgIFtyZWddIC8gKG5vdGhpbmcpICAgPC0tIGpzZGVsaXZyIGNvbXBsYWluaW5nIGFib3V0IHVuZXNjYXBlZCB1bmljb2RlIGNoYXJhY3RlciBVKzAwQUVcbiAgICAgICAgdmFyICRpc01vYmlsZSA9IHQubW9iaWxlKCkgIT09IG51bGw7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgLy8gQXBwbGUgaU9TIDMuMi01LjEgLSBUZXN0ZWQgb24gdGhlIG9yaWdpbmFsIGlQYWQgKDQuMyAvIDUuMCksIGlQYWQgMiAoNC4zKSwgaVBhZCAzICg1LjEpLCBvcmlnaW5hbCBpUGhvbmUgKDMuMSksIGlQaG9uZSAzICgzLjIpLCAzR1MgKDQuMyksIDQgKDQuMyAvIDUuMCksIGFuZCA0UyAoNS4xKVxuICAgICAgICAgICAgdC5vcygnaU9TJykgJiYgdC52ZXJzaW9uKCdpUGFkJyk+PTQuMyB8fFxuICAgICAgICAgICAgdC5vcygnaU9TJykgJiYgdC52ZXJzaW9uKCdpUGhvbmUnKT49My4xIHx8XG4gICAgICAgICAgICB0Lm9zKCdpT1MnKSAmJiB0LnZlcnNpb24oJ2lQb2QnKT49My4xIHx8XG5cbiAgICAgICAgICAgIC8vIEFuZHJvaWQgMi4xLTIuMyAtIFRlc3RlZCBvbiB0aGUgSFRDIEluY3JlZGlibGUgKDIuMiksIG9yaWdpbmFsIERyb2lkICgyLjIpLCBIVEMgQXJpYSAoMi4xKSwgR29vZ2xlIE5leHVzIFMgKDIuMykuIEZ1bmN0aW9uYWwgb24gMS41ICYgMS42IGJ1dCBwZXJmb3JtYW5jZSBtYXkgYmUgc2x1Z2dpc2gsIHRlc3RlZCBvbiBHb29nbGUgRzEgKDEuNSlcbiAgICAgICAgICAgIC8vIEFuZHJvaWQgMy4xIChIb25leWNvbWIpICAtIFRlc3RlZCBvbiB0aGUgU2Ftc3VuZyBHYWxheHkgVGFiIDEwLjEgYW5kIE1vdG9yb2xhIFhPT01cbiAgICAgICAgICAgIC8vIEFuZHJvaWQgNC4wIChJQ1MpICAtIFRlc3RlZCBvbiBhIEdhbGF4eSBOZXh1cy4gTm90ZTogdHJhbnNpdGlvbiBwZXJmb3JtYW5jZSBjYW4gYmUgcG9vciBvbiB1cGdyYWRlZCBkZXZpY2VzXG4gICAgICAgICAgICAvLyBBbmRyb2lkIDQuMSAoSmVsbHkgQmVhbikgIC0gVGVzdGVkIG9uIGEgR2FsYXh5IE5leHVzIGFuZCBHYWxheHkgN1xuICAgICAgICAgICAgKCB0LnZlcnNpb24oJ0FuZHJvaWQnKT4yLjEgJiYgdC5pcygnV2Via2l0JykgKSB8fFxuXG4gICAgICAgICAgICAvLyBXaW5kb3dzIFBob25lIDctNy41IC0gVGVzdGVkIG9uIHRoZSBIVEMgU3Vycm91bmQgKDcuMCkgSFRDIFRyb3BoeSAoNy41KSwgTEctRTkwMCAoNy41KSwgTm9raWEgTHVtaWEgODAwXG4gICAgICAgICAgICB0LnZlcnNpb24oJ1dpbmRvd3MgUGhvbmUgT1MnKT49Ny4wIHx8XG5cbiAgICAgICAgICAgIC8vIEJsYWNrYmVycnkgNyAtIFRlc3RlZCBvbiBCbGFja0JlcnJ5IFRvcmNoIDk4MTBcbiAgICAgICAgICAgIC8vIEJsYWNrYmVycnkgNi4wIC0gVGVzdGVkIG9uIHRoZSBUb3JjaCA5ODAwIGFuZCBTdHlsZSA5NjcwXG4gICAgICAgICAgICB0LmlzKCdCbGFja0JlcnJ5JykgJiYgdC52ZXJzaW9uKCdCbGFja0JlcnJ5Jyk+PTYuMCB8fFxuICAgICAgICAgICAgLy8gQmxhY2tiZXJyeSBQbGF5Ym9vayAoMS4wLTIuMCkgLSBUZXN0ZWQgb24gUGxheUJvb2tcbiAgICAgICAgICAgIHQubWF0Y2goJ1BsYXlib29rLipUYWJsZXQnKSB8fFxuXG4gICAgICAgICAgICAvLyBQYWxtIFdlYk9TICgxLjQtMi4wKSAtIFRlc3RlZCBvbiB0aGUgUGFsbSBQaXhpICgxLjQpLCBQcmUgKDEuNCksIFByZSAyICgyLjApXG4gICAgICAgICAgICAoIHQudmVyc2lvbignd2ViT1MnKT49MS40ICYmIHQubWF0Y2goJ1BhbG18UHJlfFBpeGknKSApIHx8XG4gICAgICAgICAgICAvLyBQYWxtIFdlYk9TIDMuMCAgLSBUZXN0ZWQgb24gSFAgVG91Y2hQYWRcbiAgICAgICAgICAgIHQubWF0Y2goJ2hwLipUb3VjaFBhZCcpIHx8XG5cbiAgICAgICAgICAgIC8vIEZpcmVmb3ggTW9iaWxlICgxMiBCZXRhKSAtIFRlc3RlZCBvbiBBbmRyb2lkIDIuMyBkZXZpY2VcbiAgICAgICAgICAgICggdC5pcygnRmlyZWZveCcpICYmIHQudmVyc2lvbignRmlyZWZveCcpPj0xMiApIHx8XG5cbiAgICAgICAgICAgIC8vIENocm9tZSBmb3IgQW5kcm9pZCAtIFRlc3RlZCBvbiBBbmRyb2lkIDQuMCwgNC4xIGRldmljZVxuICAgICAgICAgICAgKCB0LmlzKCdDaHJvbWUnKSAmJiB0LmlzKCdBbmRyb2lkT1MnKSAmJiB0LnZlcnNpb24oJ0FuZHJvaWQnKT49NC4wICkgfHxcblxuICAgICAgICAgICAgLy8gU2t5ZmlyZSA0LjEgLSBUZXN0ZWQgb24gQW5kcm9pZCAyLjMgZGV2aWNlXG4gICAgICAgICAgICAoIHQuaXMoJ1NreWZpcmUnKSAmJiB0LnZlcnNpb24oJ1NreWZpcmUnKT49NC4xICYmIHQuaXMoJ0FuZHJvaWRPUycpICYmIHQudmVyc2lvbignQW5kcm9pZCcpPj0yLjMgKSB8fFxuXG4gICAgICAgICAgICAvLyBPcGVyYSBNb2JpbGUgMTEuNS0xMjogVGVzdGVkIG9uIEFuZHJvaWQgMi4zXG4gICAgICAgICAgICAoIHQuaXMoJ09wZXJhJykgJiYgdC52ZXJzaW9uKCdPcGVyYSBNb2JpJyk+MTEgJiYgdC5pcygnQW5kcm9pZE9TJykgKSB8fFxuXG4gICAgICAgICAgICAvLyBNZWVnbyAxLjIgLSBUZXN0ZWQgb24gTm9raWEgOTUwIGFuZCBOOVxuICAgICAgICAgICAgdC5pcygnTWVlR29PUycpIHx8XG5cbiAgICAgICAgICAgIC8vIFRpemVuIChwcmUtcmVsZWFzZSkgLSBUZXN0ZWQgb24gZWFybHkgaGFyZHdhcmVcbiAgICAgICAgICAgIHQuaXMoJ1RpemVuJykgfHxcblxuICAgICAgICAgICAgLy8gU2Ftc3VuZyBCYWRhIDIuMCAtIFRlc3RlZCBvbiBhIFNhbXN1bmcgV2F2ZSAzLCBEb2xwaGluIGJyb3dzZXJcbiAgICAgICAgICAgIC8vIEB0b2RvOiBtb3JlIHRlc3RzIGhlcmUhXG4gICAgICAgICAgICB0LmlzKCdEb2xmaW4nKSAmJiB0LnZlcnNpb24oJ0JhZGEnKT49Mi4wIHx8XG5cbiAgICAgICAgICAgIC8vIFVDIEJyb3dzZXIgLSBUZXN0ZWQgb24gQW5kcm9pZCAyLjMgZGV2aWNlXG4gICAgICAgICAgICAoICh0LmlzKCdVQyBCcm93c2VyJykgfHwgdC5pcygnRG9sZmluJykpICYmIHQudmVyc2lvbignQW5kcm9pZCcpPj0yLjMgKSB8fFxuXG4gICAgICAgICAgICAvLyBLaW5kbGUgMyBhbmQgRmlyZSAgLSBUZXN0ZWQgb24gdGhlIGJ1aWx0LWluIFdlYktpdCBicm93c2VyIGZvciBlYWNoXG4gICAgICAgICAgICAoIHQubWF0Y2goJ0tpbmRsZSBGaXJlJykgfHxcbiAgICAgICAgICAgICAgICB0LmlzKCdLaW5kbGUnKSAmJiB0LnZlcnNpb24oJ0tpbmRsZScpPj0zLjAgKSB8fFxuXG4gICAgICAgICAgICAvLyBOb29rIENvbG9yIDEuNC4xIC0gVGVzdGVkIG9uIG9yaWdpbmFsIE5vb2sgQ29sb3IsIG5vdCBOb29rIFRhYmxldFxuICAgICAgICAgICAgdC5pcygnQW5kcm9pZE9TJykgJiYgdC5pcygnTm9va1RhYmxldCcpIHx8XG5cbiAgICAgICAgICAgIC8vIENocm9tZSBEZXNrdG9wIDExLTIxIC0gVGVzdGVkIG9uIE9TIFggMTAuNyBhbmQgV2luZG93cyA3XG4gICAgICAgICAgICB0LnZlcnNpb24oJ0Nocm9tZScpPj0xMSAmJiAhJGlzTW9iaWxlIHx8XG5cbiAgICAgICAgICAgIC8vIFNhZmFyaSBEZXNrdG9wIDQtNSAtIFRlc3RlZCBvbiBPUyBYIDEwLjcgYW5kIFdpbmRvd3MgN1xuICAgICAgICAgICAgdC52ZXJzaW9uKCdTYWZhcmknKT49NS4wICYmICEkaXNNb2JpbGUgfHxcblxuICAgICAgICAgICAgLy8gRmlyZWZveCBEZXNrdG9wIDQtMTMgLSBUZXN0ZWQgb24gT1MgWCAxMC43IGFuZCBXaW5kb3dzIDdcbiAgICAgICAgICAgIHQudmVyc2lvbignRmlyZWZveCcpPj00LjAgJiYgISRpc01vYmlsZSB8fFxuXG4gICAgICAgICAgICAvLyBJbnRlcm5ldCBFeHBsb3JlciA3LTkgLSBUZXN0ZWQgb24gV2luZG93cyBYUCwgVmlzdGEgYW5kIDdcbiAgICAgICAgICAgIHQudmVyc2lvbignTVNJRScpPj03LjAgJiYgISRpc01vYmlsZSB8fFxuXG4gICAgICAgICAgICAvLyBPcGVyYSBEZXNrdG9wIDEwLTEyIC0gVGVzdGVkIG9uIE9TIFggMTAuNyBhbmQgV2luZG93cyA3XG4gICAgICAgICAgICAvLyBAcmVmZXJlbmNlOiBodHRwOi8vbXkub3BlcmEuY29tL2NvbW11bml0eS9vcGVud2ViL2lkb3BlcmEvXG4gICAgICAgICAgICB0LnZlcnNpb24oJ09wZXJhJyk+PTEwICYmICEkaXNNb2JpbGVcblxuICAgICAgICAgICAgKXtcbiAgICAgICAgICAgIHJldHVybiAnQSc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0Lm9zKCdpT1MnKSAmJiB0LnZlcnNpb24oJ2lQYWQnKTw0LjMgfHxcbiAgICAgICAgICAgIHQub3MoJ2lPUycpICYmIHQudmVyc2lvbignaVBob25lJyk8My4xIHx8XG4gICAgICAgICAgICB0Lm9zKCdpT1MnKSAmJiB0LnZlcnNpb24oJ2lQb2QnKTwzLjEgfHxcblxuICAgICAgICAgICAgLy8gQmxhY2tiZXJyeSA1LjA6IFRlc3RlZCBvbiB0aGUgU3Rvcm0gMiA5NTUwLCBCb2xkIDk3NzBcbiAgICAgICAgICAgIHQuaXMoJ0JsYWNrYmVycnknKSAmJiB0LnZlcnNpb24oJ0JsYWNrQmVycnknKT49NSAmJiB0LnZlcnNpb24oJ0JsYWNrQmVycnknKTw2IHx8XG5cbiAgICAgICAgICAgIC8vT3BlcmEgTWluaSAoNS4wLTYuNSkgLSBUZXN0ZWQgb24gaU9TIDMuMi80LjMgYW5kIEFuZHJvaWQgMi4zXG4gICAgICAgICAgICAoIHQudmVyc2lvbignT3BlcmEgTWluaScpPj01LjAgJiYgdC52ZXJzaW9uKCdPcGVyYSBNaW5pJyk8PTYuNSAmJlxuICAgICAgICAgICAgICAgICh0LnZlcnNpb24oJ0FuZHJvaWQnKT49Mi4zIHx8IHQuaXMoJ2lPUycpKSApIHx8XG5cbiAgICAgICAgICAgIC8vIE5va2lhIFN5bWJpYW5eMyAtIFRlc3RlZCBvbiBOb2tpYSBOOCAoU3ltYmlhbl4zKSwgQzcgKFN5bWJpYW5eMyksIGFsc28gd29ya3Mgb24gTjk3IChTeW1iaWFuXjEpXG4gICAgICAgICAgICB0Lm1hdGNoKCdOb2tpYU44fE5va2lhQzd8Tjk3LipTZXJpZXM2MHxTeW1iaWFuLzMnKSB8fFxuXG4gICAgICAgICAgICAvLyBAdG9kbzogcmVwb3J0IHRoaXMgKHRlc3RlZCBvbiBOb2tpYSBONzEpXG4gICAgICAgICAgICB0LnZlcnNpb24oJ09wZXJhIE1vYmknKT49MTEgJiYgdC5pcygnU3ltYmlhbk9TJylcbiAgICAgICAgICAgICl7XG4gICAgICAgICAgICByZXR1cm4gJ0InO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAvLyBCbGFja2JlcnJ5IDQueCAtIFRlc3RlZCBvbiB0aGUgQ3VydmUgODMzMFxuICAgICAgICAgICAgdC52ZXJzaW9uKCdCbGFja0JlcnJ5Jyk8NS4wIHx8XG4gICAgICAgICAgICAvLyBXaW5kb3dzIE1vYmlsZSAtIFRlc3RlZCBvbiB0aGUgSFRDIExlbyAoV2luTW8gNS4yKVxuICAgICAgICAgICAgdC5tYXRjaCgnTVNJRU1vYmlsZXxXaW5kb3dzIENFLipNb2JpbGUnKSB8fCB0LnZlcnNpb24oJ1dpbmRvd3MgTW9iaWxlJyk8PTUuMlxuXG4gICAgICAgICAgICApe1xuICAgICAgICAgICAgcmV0dXJuICdDJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vQWxsIG9sZGVyIHNtYXJ0cGhvbmUgcGxhdGZvcm1zIGFuZCBmZWF0dXJlcGhvbmVzIC0gQW55IGRldmljZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBtZWRpYSBxdWVyaWVzXG4gICAgICAgIC8vd2lsbCByZWNlaXZlIHRoZSBiYXNpYywgQyBncmFkZSBleHBlcmllbmNlLlxuICAgICAgICByZXR1cm4gJ0MnO1xuICAgIH07XG5cbiAgICBpbXBsLmRldGVjdE9TID0gZnVuY3Rpb24gKHVhKSB7XG4gICAgICAgIHJldHVybiBpbXBsLmZpbmRNYXRjaChpbXBsLm1vYmlsZURldGVjdFJ1bGVzLm9zczAsIHVhKSB8fFxuICAgICAgICAgICAgaW1wbC5maW5kTWF0Y2goaW1wbC5tb2JpbGVEZXRlY3RSdWxlcy5vc3MsIHVhKTtcbiAgICB9O1xuXG4gICAgaW1wbC5nZXREZXZpY2VTbWFsbGVyU2lkZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5zY3JlZW4ud2lkdGggPCB3aW5kb3cuc2NyZWVuLmhlaWdodCA/XG4gICAgICAgICAgICB3aW5kb3cuc2NyZWVuLndpZHRoIDpcbiAgICAgICAgICAgIHdpbmRvdy5zY3JlZW4uaGVpZ2h0O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RvciBmb3IgTW9iaWxlRGV0ZWN0IG9iamVjdC5cbiAgICAgKiA8YnI+XG4gICAgICogU3VjaCBhbiBvYmplY3Qgd2lsbCBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBnaXZlbiB1c2VyLWFnZW50IHN0cmluZyBhbmQgY2FjaGUgbW9zdCBvZiB0aGUgZGV0ZWN0IHF1ZXJpZXMuPGJyPlxuICAgICAqIDxkaXYgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAjZDllZGY3OyBib3JkZXI6IDFweCBzb2xpZCAjYmNlOGYxOyBjb2xvcjogIzNhODdhZDsgcGFkZGluZzogMTRweDsgYm9yZGVyLXJhZGl1czogMnB4OyBtYXJnaW4tdG9wOiAyMHB4XCI+XG4gICAgICogICAgIDxzdHJvbmc+RmluZCBpbmZvcm1hdGlvbiBob3cgdG8gZG93bmxvYWQgYW5kIGluc3RhbGw6PC9zdHJvbmc+XG4gICAgICogICAgIDxhIGhyZWY9XCJodHRwczovL2dpdGh1Yi5jb20vaGdvZWJsL21vYmlsZS1kZXRlY3QuanMvXCI+Z2l0aHViLmNvbS9oZ29lYmwvbW9iaWxlLWRldGVjdC5qcy88L2E+XG4gICAgICogPC9kaXY+XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSA8cHJlPlxuICAgICAqICAgICB2YXIgbWQgPSBuZXcgTW9iaWxlRGV0ZWN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICAgKiAgICAgaWYgKG1kLm1vYmlsZSgpKSB7XG4gICAgICogICAgICAgICBsb2NhdGlvbi5ocmVmID0gKG1kLm1vYmlsZUdyYWRlKCkgPT09ICdBJykgPyAnL21vYmlsZS8nIDogJy9seW54Lyc7XG4gICAgICogICAgIH1cbiAgICAgKiA8L3ByZT5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyQWdlbnQgdHlwaWNhbGx5IHRha2VuIGZyb20gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQgb3IgaHR0cF9oZWFkZXJbJ1VzZXItQWdlbnQnXVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4UGhvbmVXaWR0aD02MDBdIDxzdHJvbmc+b25seSBmb3IgYnJvd3NlcnM8L3N0cm9uZz4gc3BlY2lmeSBhIHZhbHVlIGZvciB0aGUgbWF4aW11bVxuICAgICAqICAgICAgICB3aWR0aCBvZiBzbWFsbGVzdCBkZXZpY2Ugc2lkZSAoaW4gbG9naWNhbCBcIkNTU1wiIHBpeGVscykgdW50aWwgYSBkZXZpY2UgZGV0ZWN0ZWQgYXMgbW9iaWxlIHdpbGwgYmUgaGFuZGxlZFxuICAgICAqICAgICAgICBhcyBwaG9uZS5cbiAgICAgKiAgICAgICAgVGhpcyBpcyBvbmx5IHVzZWQgaW4gY2FzZXMgd2hlcmUgdGhlIGRldmljZSBjYW5ub3QgYmUgY2xhc3NpZmllZCBhcyBwaG9uZSBvciB0YWJsZXQuPGJyPlxuICAgICAqICAgICAgICBTZWUgPGEgaHJlZj1cImh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vZ3VpZGUvcHJhY3RpY2VzL3NjcmVlbnNfc3VwcG9ydC5odG1sXCI+RGVjbGFyaW5nIFRhYmxldCBMYXlvdXRzXG4gICAgICogICAgICAgIGZvciBBbmRyb2lkPC9hPi48YnI+XG4gICAgICogICAgICAgIElmIHlvdSBwcm92aWRlIGEgdmFsdWUgPCAwLCB0aGVuIHRoaXMgXCJmdXp6eVwiIGNoZWNrIGlzIGRpc2FibGVkLlxuICAgICAqIEBjb25zdHJ1Y3RvclxuICAgICAqIEBnbG9iYWxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBNb2JpbGVEZXRlY3QodXNlckFnZW50LCBtYXhQaG9uZVdpZHRoKSB7XG4gICAgICAgIHRoaXMudWEgPSB1c2VyQWdlbnQgfHwgJyc7XG4gICAgICAgIHRoaXMuX2NhY2hlID0ge307XG4gICAgICAgIC8vNjAwZHAgaXMgdHlwaWNhbCA3XCIgdGFibGV0IG1pbmltdW0gd2lkdGhcbiAgICAgICAgdGhpcy5tYXhQaG9uZVdpZHRoID0gbWF4UGhvbmVXaWR0aCB8fCA2MDA7XG4gICAgfVxuXG4gICAgTW9iaWxlRGV0ZWN0LnByb3RvdHlwZSA9IHtcbiAgICAgICAgY29uc3RydWN0b3I6IE1vYmlsZURldGVjdCxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGUgZGV0ZWN0ZWQgcGhvbmUgb3IgdGFibGV0IHR5cGUgb3IgPHR0Pm51bGw8L3R0PiBpZiBpdCBpcyBub3QgYSBtb2JpbGUgZGV2aWNlLlxuICAgICAgICAgKiA8YnI+XG4gICAgICAgICAqIEZvciBhIGxpc3Qgb2YgcG9zc2libGUgcmV0dXJuIHZhbHVlcyBzZWUge0BsaW5rIE1vYmlsZURldGVjdCNwaG9uZX0gYW5kIHtAbGluayBNb2JpbGVEZXRlY3QjdGFibGV0fS48YnI+XG4gICAgICAgICAqIDxicj5cbiAgICAgICAgICogSWYgdGhlIGRldmljZSBpcyBub3QgZGV0ZWN0ZWQgYnkgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZnJvbSBNb2JpbGUtRGV0ZWN0LCBhIHRlc3QgaXMgbWFkZSBhZ2FpbnN0XG4gICAgICAgICAqIHRoZSBwYXR0ZXJucyBvZiA8YSBocmVmPVwiaHR0cDovL2RldGVjdG1vYmlsZWJyb3dzZXJzLmNvbS9cIj5kZXRlY3Rtb2JpbGVicm93c2Vycy5jb208L2E+LiBJZiB0aGlzIHRlc3RcbiAgICAgICAgICogaXMgcG9zaXRpdmUsIGEgdmFsdWUgb2YgPGNvZGU+VW5rbm93blBob25lPC9jb2RlPiwgPGNvZGU+VW5rbm93blRhYmxldDwvY29kZT4gb3JcbiAgICAgICAgICogPGNvZGU+VW5rbm93bk1vYmlsZTwvY29kZT4gaXMgcmV0dXJuZWQuPGJyPlxuICAgICAgICAgKiBXaGVuIHVzZWQgaW4gYnJvd3NlciwgdGhlIGRlY2lzaW9uIHdoZXRoZXIgcGhvbmUgb3IgdGFibGV0IGlzIG1hZGUgYmFzZWQgb24gPGNvZGU+c2NyZWVuLndpZHRoL2hlaWdodDwvY29kZT4uPGJyPlxuICAgICAgICAgKiA8YnI+XG4gICAgICAgICAqIFdoZW4gdXNlZCBzZXJ2ZXItc2lkZSAobm9kZS5qcyksIHRoZXJlIGlzIG5vIHdheSB0byB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gPGNvZGU+VW5rbm93blRhYmxldDwvY29kZT5cbiAgICAgICAgICogYW5kIDxjb2RlPlVua25vd25Nb2JpbGU8L2NvZGU+LCBzbyB5b3Ugd2lsbCBnZXQgPGNvZGU+VW5rbm93bk1vYmlsZTwvY29kZT4gaGVyZS48YnI+XG4gICAgICAgICAqIEJlIGF3YXJlIHRoYXQgc2luY2UgdjEuMC4wIGluIHRoaXMgc3BlY2lhbCBjYXNlIHlvdSB3aWxsIGdldCA8Y29kZT5Vbmtub3duTW9iaWxlPC9jb2RlPiBvbmx5IGZvcjpcbiAgICAgICAgICoge0BsaW5rIE1vYmlsZURldGVjdCNtb2JpbGV9LCBub3QgZm9yIHtAbGluayBNb2JpbGVEZXRlY3QjcGhvbmV9IGFuZCB7QGxpbmsgTW9iaWxlRGV0ZWN0I3RhYmxldH0uXG4gICAgICAgICAqIEluIHZlcnNpb25zIGJlZm9yZSB2MS4wLjAgYWxsIDMgbWV0aG9kcyByZXR1cm5lZCA8Y29kZT5Vbmtub3duTW9iaWxlPC9jb2RlPiB3aGljaCB3YXMgdGVkaW91cyB0byB1c2UuXG4gICAgICAgICAqIDxicj5cbiAgICAgICAgICogSW4gbW9zdCBjYXNlcyB5b3Ugd2lsbCB1c2UgdGhlIHJldHVybiB2YWx1ZSBqdXN0IGFzIGEgYm9vbGVhbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gdGhlIGtleSBmb3IgdGhlIHBob25lIGZhbWlseSBvciB0YWJsZXQgZmFtaWx5LCBlLmcuIFwiTmV4dXNcIi5cbiAgICAgICAgICogQGZ1bmN0aW9uIE1vYmlsZURldGVjdCNtb2JpbGVcbiAgICAgICAgICovXG4gICAgICAgIG1vYmlsZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaW1wbC5wcmVwYXJlRGV0ZWN0aW9uQ2FjaGUodGhpcy5fY2FjaGUsIHRoaXMudWEsIHRoaXMubWF4UGhvbmVXaWR0aCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGUubW9iaWxlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBkZXRlY3RlZCBwaG9uZSB0eXBlL2ZhbWlseSBzdHJpbmcgb3IgPHR0Pm51bGw8L3R0Pi5cbiAgICAgICAgICogPGJyPlxuICAgICAgICAgKiBUaGUgcmV0dXJuZWQgdGFibGV0IChmYW1pbHkgb3IgcHJvZHVjZXIpIGlzIG9uZSBvZiBmb2xsb3dpbmcga2V5czo8YnI+XG4gICAgICAgICAqIDxicj48dHQ+aVBob25lLCBCbGFja0JlcnJ5LCBIVEMsIE5leHVzLCBEZWxsLCBNb3Rvcm9sYSwgU2Ftc3VuZywgTEcsIFNvbnksIEFzdXMsXG4gICAgICAgICAqIE5va2lhTHVtaWEsIE1pY3JvbWF4LCBQYWxtLCBWZXJ0dSwgUGFudGVjaCwgRmx5LCBXaWtvLCBpTW9iaWxlLCBTaW1WYWxsZXksXG4gICAgICAgICAqIFdvbGZnYW5nLCBBbGNhdGVsLCBOaW50ZW5kbywgQW1vaSwgSU5RLCBHZW5lcmljUGhvbmU8L3R0Pjxicj5cbiAgICAgICAgICogPGJyPlxuICAgICAgICAgKiBJZiB0aGUgZGV2aWNlIGlzIG5vdCBkZXRlY3RlZCBieSB0aGUgcmVndWxhciBleHByZXNzaW9ucyBmcm9tIE1vYmlsZS1EZXRlY3QsIGEgdGVzdCBpcyBtYWRlIGFnYWluc3RcbiAgICAgICAgICogdGhlIHBhdHRlcm5zIG9mIDxhIGhyZWY9XCJodHRwOi8vZGV0ZWN0bW9iaWxlYnJvd3NlcnMuY29tL1wiPmRldGVjdG1vYmlsZWJyb3dzZXJzLmNvbTwvYT4uIElmIHRoaXMgdGVzdFxuICAgICAgICAgKiBpcyBwb3NpdGl2ZSwgYSB2YWx1ZSBvZiA8Y29kZT5Vbmtub3duUGhvbmU8L2NvZGU+IG9yIDxjb2RlPlVua25vd25Nb2JpbGU8L2NvZGU+IGlzIHJldHVybmVkLjxicj5cbiAgICAgICAgICogV2hlbiB1c2VkIGluIGJyb3dzZXIsIHRoZSBkZWNpc2lvbiB3aGV0aGVyIHBob25lIG9yIHRhYmxldCBpcyBtYWRlIGJhc2VkIG9uIDxjb2RlPnNjcmVlbi53aWR0aC9oZWlnaHQ8L2NvZGU+Ljxicj5cbiAgICAgICAgICogPGJyPlxuICAgICAgICAgKiBXaGVuIHVzZWQgc2VydmVyLXNpZGUgKG5vZGUuanMpLCB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDxjb2RlPlVua25vd25UYWJsZXQ8L2NvZGU+XG4gICAgICAgICAqIGFuZCA8Y29kZT5Vbmtub3duTW9iaWxlPC9jb2RlPiwgc28geW91IHdpbGwgZ2V0IDxjb2RlPm51bGw8L2NvZGU+IGhlcmUsIHdoaWxlIHtAbGluayBNb2JpbGVEZXRlY3QjbW9iaWxlfVxuICAgICAgICAgKiB3aWxsIHJldHVybiA8Y29kZT5Vbmtub3duTW9iaWxlPC9jb2RlPi48YnI+XG4gICAgICAgICAqIEJlIGF3YXJlIHRoYXQgc2luY2UgdjEuMC4wIGluIHRoaXMgc3BlY2lhbCBjYXNlIHlvdSB3aWxsIGdldCA8Y29kZT5Vbmtub3duTW9iaWxlPC9jb2RlPiBvbmx5IGZvcjpcbiAgICAgICAgICoge0BsaW5rIE1vYmlsZURldGVjdCNtb2JpbGV9LCBub3QgZm9yIHtAbGluayBNb2JpbGVEZXRlY3QjcGhvbmV9IGFuZCB7QGxpbmsgTW9iaWxlRGV0ZWN0I3RhYmxldH0uXG4gICAgICAgICAqIEluIHZlcnNpb25zIGJlZm9yZSB2MS4wLjAgYWxsIDMgbWV0aG9kcyByZXR1cm5lZCA8Y29kZT5Vbmtub3duTW9iaWxlPC9jb2RlPiB3aGljaCB3YXMgdGVkaW91cyB0byB1c2UuXG4gICAgICAgICAqIDxicj5cbiAgICAgICAgICogSW4gbW9zdCBjYXNlcyB5b3Ugd2lsbCB1c2UgdGhlIHJldHVybiB2YWx1ZSBqdXN0IGFzIGEgYm9vbGVhbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge1N0cmluZ30gdGhlIGtleSBvZiB0aGUgcGhvbmUgZmFtaWx5IG9yIHByb2R1Y2VyLCBlLmcuIFwiaVBob25lXCJcbiAgICAgICAgICogQGZ1bmN0aW9uIE1vYmlsZURldGVjdCNwaG9uZVxuICAgICAgICAgKi9cbiAgICAgICAgcGhvbmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGltcGwucHJlcGFyZURldGVjdGlvbkNhY2hlKHRoaXMuX2NhY2hlLCB0aGlzLnVhLCB0aGlzLm1heFBob25lV2lkdGgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlLnBob25lO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBkZXRlY3RlZCB0YWJsZXQgdHlwZS9mYW1pbHkgc3RyaW5nIG9yIDx0dD5udWxsPC90dD4uXG4gICAgICAgICAqIDxicj5cbiAgICAgICAgICogVGhlIHJldHVybmVkIHRhYmxldCAoZmFtaWx5IG9yIHByb2R1Y2VyKSBpcyBvbmUgb2YgZm9sbG93aW5nIGtleXM6PGJyPlxuICAgICAgICAgKiA8YnI+PHR0PmlQYWQsIE5leHVzVGFibGV0LCBTYW1zdW5nVGFibGV0LCBLaW5kbGUsIFN1cmZhY2VUYWJsZXQsIEhQVGFibGV0LCBBc3VzVGFibGV0LFxuICAgICAgICAgKiBCbGFja0JlcnJ5VGFibGV0LCBIVEN0YWJsZXQsIE1vdG9yb2xhVGFibGV0LCBOb29rVGFibGV0LCBBY2VyVGFibGV0LFxuICAgICAgICAgKiBUb3NoaWJhVGFibGV0LCBMR1RhYmxldCwgRnVqaXRzdVRhYmxldCwgUHJlc3RpZ2lvVGFibGV0LCBMZW5vdm9UYWJsZXQsXG4gICAgICAgICAqIERlbGxUYWJsZXQsIFlhcnZpa1RhYmxldCwgTWVkaW9uVGFibGV0LCBBcm5vdmFUYWJsZXQsIEludGVuc29UYWJsZXQsIElSVVRhYmxldCxcbiAgICAgICAgICogTWVnYWZvblRhYmxldCwgRWJvZGFUYWJsZXQsIEFsbFZpZXdUYWJsZXQsIEFyY2hvc1RhYmxldCwgQWlub2xUYWJsZXQsXG4gICAgICAgICAqIE5va2lhTHVtaWFUYWJsZXQsIFNvbnlUYWJsZXQsIFBoaWxpcHNUYWJsZXQsIEN1YmVUYWJsZXQsIENvYnlUYWJsZXQsIE1JRFRhYmxldCxcbiAgICAgICAgICogTVNJVGFibGV0LCBTTWlUVGFibGV0LCBSb2NrQ2hpcFRhYmxldCwgRmx5VGFibGV0LCBicVRhYmxldCwgSHVhd2VpVGFibGV0LFxuICAgICAgICAgKiBOZWNUYWJsZXQsIFBhbnRlY2hUYWJsZXQsIEJyb25jaG9UYWJsZXQsIFZlcnN1c1RhYmxldCwgWnluY1RhYmxldCxcbiAgICAgICAgICogUG9zaXRpdm9UYWJsZXQsIE5hYmlUYWJsZXQsIEtvYm9UYWJsZXQsIERhbmV3VGFibGV0LCBUZXhldFRhYmxldCxcbiAgICAgICAgICogUGxheXN0YXRpb25UYWJsZXQsIFRyZWtzdG9yVGFibGV0LCBQeWxlQXVkaW9UYWJsZXQsIEFkdmFuVGFibGV0LFxuICAgICAgICAgKiBEYW55VGVjaFRhYmxldCwgR2FsYXBhZFRhYmxldCwgTWljcm9tYXhUYWJsZXQsIEthcmJvbm5UYWJsZXQsIEFsbEZpbmVUYWJsZXQsXG4gICAgICAgICAqIFBST1NDQU5UYWJsZXQsIFlPTkVTVGFibGV0LCBDaGFuZ0ppYVRhYmxldCwgR1VUYWJsZXQsIFBvaW50T2ZWaWV3VGFibGV0LFxuICAgICAgICAgKiBPdmVybWF4VGFibGV0LCBIQ0xUYWJsZXQsIERQU1RhYmxldCwgVmlzdHVyZVRhYmxldCwgQ3Jlc3RhVGFibGV0LFxuICAgICAgICAgKiBNZWRpYXRla1RhYmxldCwgQ29uY29yZGVUYWJsZXQsIEdvQ2xldmVyVGFibGV0LCBNb2RlY29tVGFibGV0LCBWb25pbm9UYWJsZXQsXG4gICAgICAgICAqIEVDU1RhYmxldCwgU3RvcmV4VGFibGV0LCBWb2RhZm9uZVRhYmxldCwgRXNzZW50aWVsQlRhYmxldCwgUm9zc01vb3JUYWJsZXQsXG4gICAgICAgICAqIGlNb2JpbGVUYWJsZXQsIFRvbGlub1RhYmxldCwgQXVkaW9Tb25pY1RhYmxldCwgQU1QRVRhYmxldCwgU2trVGFibGV0LFxuICAgICAgICAgKiBUZWNub1RhYmxldCwgSlhEVGFibGV0LCBpSm95VGFibGV0LCBGWDJUYWJsZXQsIFhvcm9UYWJsZXQsIFZpZXdzb25pY1RhYmxldCxcbiAgICAgICAgICogT2R5c1RhYmxldCwgQ2FwdGl2YVRhYmxldCwgSWNvbmJpdFRhYmxldCwgVGVjbGFzdFRhYmxldCwgT25kYVRhYmxldCxcbiAgICAgICAgICogSmF5dGVjaFRhYmxldCwgQmxhdXB1bmt0VGFibGV0LCBEaWdtYVRhYmxldCwgRXZvbGlvVGFibGV0LCBMYXZhVGFibGV0LFxuICAgICAgICAgKiBBb2NUYWJsZXQsIE1wbWFuVGFibGV0LCBDZWxrb25UYWJsZXQsIFdvbGRlclRhYmxldCwgTWlUYWJsZXQsIE5pYmlydVRhYmxldCxcbiAgICAgICAgICogTmV4b1RhYmxldCwgTGVhZGVyVGFibGV0LCBVYmlzbGF0ZVRhYmxldCwgUG9ja2V0Qm9va1RhYmxldCwgS29jYXNvVGFibGV0LFxuICAgICAgICAgKiBIaXNlbnNlVGFibGV0LCBIdWRsLCBUZWxzdHJhVGFibGV0LCBHZW5lcmljVGFibGV0PC90dD48YnI+XG4gICAgICAgICAqIDxicj5cbiAgICAgICAgICogSWYgdGhlIGRldmljZSBpcyBub3QgZGV0ZWN0ZWQgYnkgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZnJvbSBNb2JpbGUtRGV0ZWN0LCBhIHRlc3QgaXMgbWFkZSBhZ2FpbnN0XG4gICAgICAgICAqIHRoZSBwYXR0ZXJucyBvZiA8YSBocmVmPVwiaHR0cDovL2RldGVjdG1vYmlsZWJyb3dzZXJzLmNvbS9cIj5kZXRlY3Rtb2JpbGVicm93c2Vycy5jb208L2E+LiBJZiB0aGlzIHRlc3RcbiAgICAgICAgICogaXMgcG9zaXRpdmUsIGEgdmFsdWUgb2YgPGNvZGU+VW5rbm93blRhYmxldDwvY29kZT4gb3IgPGNvZGU+VW5rbm93bk1vYmlsZTwvY29kZT4gaXMgcmV0dXJuZWQuPGJyPlxuICAgICAgICAgKiBXaGVuIHVzZWQgaW4gYnJvd3NlciwgdGhlIGRlY2lzaW9uIHdoZXRoZXIgcGhvbmUgb3IgdGFibGV0IGlzIG1hZGUgYmFzZWQgb24gPGNvZGU+c2NyZWVuLndpZHRoL2hlaWdodDwvY29kZT4uPGJyPlxuICAgICAgICAgKiA8YnI+XG4gICAgICAgICAqIFdoZW4gdXNlZCBzZXJ2ZXItc2lkZSAobm9kZS5qcyksIHRoZXJlIGlzIG5vIHdheSB0byB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gPGNvZGU+VW5rbm93blRhYmxldDwvY29kZT5cbiAgICAgICAgICogYW5kIDxjb2RlPlVua25vd25Nb2JpbGU8L2NvZGU+LCBzbyB5b3Ugd2lsbCBnZXQgPGNvZGU+bnVsbDwvY29kZT4gaGVyZSwgd2hpbGUge0BsaW5rIE1vYmlsZURldGVjdCNtb2JpbGV9XG4gICAgICAgICAqIHdpbGwgcmV0dXJuIDxjb2RlPlVua25vd25Nb2JpbGU8L2NvZGU+Ljxicj5cbiAgICAgICAgICogQmUgYXdhcmUgdGhhdCBzaW5jZSB2MS4wLjAgaW4gdGhpcyBzcGVjaWFsIGNhc2UgeW91IHdpbGwgZ2V0IDxjb2RlPlVua25vd25Nb2JpbGU8L2NvZGU+IG9ubHkgZm9yOlxuICAgICAgICAgKiB7QGxpbmsgTW9iaWxlRGV0ZWN0I21vYmlsZX0sIG5vdCBmb3Ige0BsaW5rIE1vYmlsZURldGVjdCNwaG9uZX0gYW5kIHtAbGluayBNb2JpbGVEZXRlY3QjdGFibGV0fS5cbiAgICAgICAgICogSW4gdmVyc2lvbnMgYmVmb3JlIHYxLjAuMCBhbGwgMyBtZXRob2RzIHJldHVybmVkIDxjb2RlPlVua25vd25Nb2JpbGU8L2NvZGU+IHdoaWNoIHdhcyB0ZWRpb3VzIHRvIHVzZS5cbiAgICAgICAgICogPGJyPlxuICAgICAgICAgKiBJbiBtb3N0IGNhc2VzIHlvdSB3aWxsIHVzZSB0aGUgcmV0dXJuIHZhbHVlIGp1c3QgYXMgYSBib29sZWFuLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUga2V5IG9mIHRoZSB0YWJsZXQgZmFtaWx5IG9yIHByb2R1Y2VyLCBlLmcuIFwiU2Ftc3VuZ1RhYmxldFwiXG4gICAgICAgICAqIEBmdW5jdGlvbiBNb2JpbGVEZXRlY3QjdGFibGV0XG4gICAgICAgICAqL1xuICAgICAgICB0YWJsZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGltcGwucHJlcGFyZURldGVjdGlvbkNhY2hlKHRoaXMuX2NhY2hlLCB0aGlzLnVhLCB0aGlzLm1heFBob25lV2lkdGgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlLnRhYmxldDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB0aGUgKGZpcnN0KSBkZXRlY3RlZCB1c2VyLWFnZW50IHN0cmluZyBvciA8dHQ+bnVsbDwvdHQ+LlxuICAgICAgICAgKiA8YnI+XG4gICAgICAgICAqIFRoZSByZXR1cm5lZCB1c2VyLWFnZW50IGlzIG9uZSBvZiBmb2xsb3dpbmcga2V5czo8YnI+XG4gICAgICAgICAqIDxicj48dHQ+Q2hyb21lLCBEb2xmaW4sIE9wZXJhLCBTa3lmaXJlLCBFZGdlLCBJRSwgRmlyZWZveCwgQm9sdCwgVGVhU2hhcmssIEJsYXplcixcbiAgICAgICAgICogU2FmYXJpLCBVQ0Jyb3dzZXIsIGJhaWR1Ym94YXBwLCBiYWlkdWJyb3dzZXIsIERpaWdvQnJvd3NlciwgUHVmZmluLCBNZXJjdXJ5LFxuICAgICAgICAgKiBPYmlnb0Jyb3dzZXIsIE5ldEZyb250LCBHZW5lcmljQnJvd3NlciwgUGFsZU1vb248L3R0Pjxicj5cbiAgICAgICAgICogPGJyPlxuICAgICAgICAgKiBJbiBtb3N0IGNhc2VzIGNhbGxpbmcge0BsaW5rIE1vYmlsZURldGVjdCN1c2VyQWdlbnR9IHdpbGwgYmUgc3VmZmljaWVudC4gQnV0IHRoZXJlIGFyZSByYXJlXG4gICAgICAgICAqIGNhc2VzIHdoZXJlIGEgbW9iaWxlIGRldmljZSBwcmV0ZW5kcyB0byBiZSBtb3JlIHRoYW4gb25lIHBhcnRpY3VsYXIgYnJvd3Nlci4gWW91IGNhbiBnZXQgdGhlXG4gICAgICAgICAqIGxpc3Qgb2YgYWxsIG1hdGNoZXMgd2l0aCB7QGxpbmsgTW9iaWxlRGV0ZWN0I3VzZXJBZ2VudHN9IG9yIGNoZWNrIGZvciBhIHBhcnRpY3VsYXIgdmFsdWUgYnlcbiAgICAgICAgICogcHJvdmlkaW5nIG9uZSBvZiB0aGUgZGVmaW5lZCBrZXlzIGFzIGZpcnN0IGFyZ3VtZW50IHRvIHtAbGluayBNb2JpbGVEZXRlY3QjaXN9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUga2V5IGZvciB0aGUgZGV0ZWN0ZWQgdXNlci1hZ2VudCBvciA8dHQ+bnVsbDwvdHQ+XG4gICAgICAgICAqIEBmdW5jdGlvbiBNb2JpbGVEZXRlY3QjdXNlckFnZW50XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyQWdlbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWNoZS51c2VyQWdlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlLnVzZXJBZ2VudCA9IGltcGwuZmluZE1hdGNoKGltcGwubW9iaWxlRGV0ZWN0UnVsZXMudWFzLCB0aGlzLnVhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZS51c2VyQWdlbnQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYWxsIGRldGVjdGVkIHVzZXItYWdlbnQgc3RyaW5ncy5cbiAgICAgICAgICogPGJyPlxuICAgICAgICAgKiBUaGUgYXJyYXkgaXMgZW1wdHkgb3IgY29udGFpbnMgb25lIG9yIG1vcmUgb2YgZm9sbG93aW5nIGtleXM6PGJyPlxuICAgICAgICAgKiA8YnI+PHR0PkNocm9tZSwgRG9sZmluLCBPcGVyYSwgU2t5ZmlyZSwgRWRnZSwgSUUsIEZpcmVmb3gsIEJvbHQsIFRlYVNoYXJrLCBCbGF6ZXIsXG4gICAgICAgICAqIFNhZmFyaSwgVUNCcm93c2VyLCBiYWlkdWJveGFwcCwgYmFpZHVicm93c2VyLCBEaWlnb0Jyb3dzZXIsIFB1ZmZpbiwgTWVyY3VyeSxcbiAgICAgICAgICogT2JpZ29Ccm93c2VyLCBOZXRGcm9udCwgR2VuZXJpY0Jyb3dzZXIsIFBhbGVNb29uPC90dD48YnI+XG4gICAgICAgICAqIDxicj5cbiAgICAgICAgICogSW4gbW9zdCBjYXNlcyBjYWxsaW5nIHtAbGluayBNb2JpbGVEZXRlY3QjdXNlckFnZW50fSB3aWxsIGJlIHN1ZmZpY2llbnQuIEJ1dCB0aGVyZSBhcmUgcmFyZVxuICAgICAgICAgKiBjYXNlcyB3aGVyZSBhIG1vYmlsZSBkZXZpY2UgcHJldGVuZHMgdG8gYmUgbW9yZSB0aGFuIG9uZSBwYXJ0aWN1bGFyIGJyb3dzZXIuIFlvdSBjYW4gZ2V0IHRoZVxuICAgICAgICAgKiBsaXN0IG9mIGFsbCBtYXRjaGVzIHdpdGgge0BsaW5rIE1vYmlsZURldGVjdCN1c2VyQWdlbnRzfSBvciBjaGVjayBmb3IgYSBwYXJ0aWN1bGFyIHZhbHVlIGJ5XG4gICAgICAgICAqIHByb3ZpZGluZyBvbmUgb2YgdGhlIGRlZmluZWQga2V5cyBhcyBmaXJzdCBhcmd1bWVudCB0byB7QGxpbmsgTW9iaWxlRGV0ZWN0I2lzfS5cbiAgICAgICAgICpcbiAgICAgICAgICogQHJldHVybnMge0FycmF5fSB0aGUgYXJyYXkgb2YgZGV0ZWN0ZWQgdXNlci1hZ2VudCBrZXlzIG9yIDx0dD5bXTwvdHQ+XG4gICAgICAgICAqIEBmdW5jdGlvbiBNb2JpbGVEZXRlY3QjdXNlckFnZW50c1xuICAgICAgICAgKi9cbiAgICAgICAgdXNlckFnZW50czogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlLnVzZXJBZ2VudHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlLnVzZXJBZ2VudHMgPSBpbXBsLmZpbmRNYXRjaGVzKGltcGwubW9iaWxlRGV0ZWN0UnVsZXMudWFzLCB0aGlzLnVhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZS51c2VyQWdlbnRzO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBkZXRlY3RlZCBvcGVyYXRpbmcgc3lzdGVtIHN0cmluZyBvciA8dHQ+bnVsbDwvdHQ+LlxuICAgICAgICAgKiA8YnI+XG4gICAgICAgICAqIFRoZSBvcGVyYXRpbmcgc3lzdGVtIGlzIG9uZSBvZiBmb2xsb3dpbmcga2V5czo8YnI+XG4gICAgICAgICAqIDxicj48dHQ+QW5kcm9pZE9TLCBCbGFja0JlcnJ5T1MsIFBhbG1PUywgU3ltYmlhbk9TLCBXaW5kb3dzTW9iaWxlT1MsIFdpbmRvd3NQaG9uZU9TLFxuICAgICAgICAgKiBpT1MsIE1lZUdvT1MsIE1hZW1vT1MsIEphdmFPUywgd2ViT1MsIGJhZGFPUywgQlJFV09TPC90dD48YnI+XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IHRoZSBrZXkgZm9yIHRoZSBkZXRlY3RlZCBvcGVyYXRpbmcgc3lzdGVtLlxuICAgICAgICAgKiBAZnVuY3Rpb24gTW9iaWxlRGV0ZWN0I29zXG4gICAgICAgICAqL1xuICAgICAgICBvczogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NhY2hlLm9zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZS5vcyA9IGltcGwuZGV0ZWN0T1ModGhpcy51YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGUub3M7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCB0aGUgdmVyc2lvbiAoYXMgTnVtYmVyKSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkgaW4gdGhlIFVzZXItQWdlbnQuXG4gICAgICAgICAqIDxicj5cbiAgICAgICAgICogV2lsbCByZXR1cm4gYSBmbG9hdCBudW1iZXIuIChlZy4gMl8wIHdpbGwgcmV0dXJuIDIuMCwgNC4zLjEgd2lsbCByZXR1cm4gNC4zMSlcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGtleSBhIGtleSBkZWZpbmluZyBhIHRoaW5nIHdoaWNoIGhhcyBhIHZlcnNpb24uPGJyPlxuICAgICAgICAgKiAgICAgICAgWW91IGNhbiB1c2Ugb25lIG9mIGZvbGxvd2luZyBrZXlzOjxicj5cbiAgICAgICAgICogPGJyPjx0dD5Nb2JpbGUsIEJ1aWxkLCBWZXJzaW9uLCBWZW5kb3JJRCwgaVBhZCwgaVBob25lLCBpUG9kLCBLaW5kbGUsIENocm9tZSwgQ29hc3QsXG4gICAgICAgICAqIERvbGZpbiwgRmlyZWZveCwgRmVubmVjLCBFZGdlLCBJRSwgTmV0RnJvbnQsIE5va2lhQnJvd3NlciwgT3BlcmEsIE9wZXJhIE1pbmksXG4gICAgICAgICAqIE9wZXJhIE1vYmksIFVDIEJyb3dzZXIsIE1RUUJyb3dzZXIsIE1pY3JvTWVzc2VuZ2VyLCBiYWlkdWJveGFwcCwgYmFpZHVicm93c2VyLFxuICAgICAgICAgKiBTYW1zdW5nQnJvd3NlciwgSXJvbiwgU2FmYXJpLCBTa3lmaXJlLCBUaXplbiwgV2Via2l0LCBQYWxlTW9vbiwgR2Vja28sIFRyaWRlbnQsXG4gICAgICAgICAqIFByZXN0bywgR29hbm5hLCBpT1MsIEFuZHJvaWQsIEJsYWNrQmVycnksIEJSRVcsIEphdmEsIFdpbmRvd3MgUGhvbmUgT1MsIFdpbmRvd3NcbiAgICAgICAgICogUGhvbmUsIFdpbmRvd3MgQ0UsIFdpbmRvd3MgTlQsIFN5bWJpYW4sIHdlYk9TPC90dD48YnI+XG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoZSB2ZXJzaW9uIGFzIGZsb2F0IG9yIDx0dD5OYU48L3R0PiBpZiBVc2VyLUFnZW50IGRvZXNuJ3QgY29udGFpbiB0aGlzIHZlcnNpb24uXG4gICAgICAgICAqICAgICAgICAgIEJlIGNhcmVmdWwgd2hlbiBjb21wYXJpbmcgdGhpcyB2YWx1ZSB3aXRoICc9PScgb3BlcmF0b3IhXG4gICAgICAgICAqIEBmdW5jdGlvbiBNb2JpbGVEZXRlY3QjdmVyc2lvblxuICAgICAgICAgKi9cbiAgICAgICAgdmVyc2lvbjogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGltcGwuZ2V0VmVyc2lvbihrZXksIHRoaXMudWEpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgdGhlIHZlcnNpb24gKGFzIFN0cmluZykgb2YgdGhlIGdpdmVuIHByb3BlcnR5IGluIHRoZSBVc2VyLUFnZW50LlxuICAgICAgICAgKiA8YnI+XG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgYSBrZXkgZGVmaW5pbmcgYSB0aGluZyB3aGljaCBoYXMgYSB2ZXJzaW9uLjxicj5cbiAgICAgICAgICogICAgICAgIFlvdSBjYW4gdXNlIG9uZSBvZiBmb2xsb3dpbmcga2V5czo8YnI+XG4gICAgICAgICAqIDxicj48dHQ+TW9iaWxlLCBCdWlsZCwgVmVyc2lvbiwgVmVuZG9ySUQsIGlQYWQsIGlQaG9uZSwgaVBvZCwgS2luZGxlLCBDaHJvbWUsIENvYXN0LFxuICAgICAgICAgKiBEb2xmaW4sIEZpcmVmb3gsIEZlbm5lYywgRWRnZSwgSUUsIE5ldEZyb250LCBOb2tpYUJyb3dzZXIsIE9wZXJhLCBPcGVyYSBNaW5pLFxuICAgICAgICAgKiBPcGVyYSBNb2JpLCBVQyBCcm93c2VyLCBNUVFCcm93c2VyLCBNaWNyb01lc3NlbmdlciwgYmFpZHVib3hhcHAsIGJhaWR1YnJvd3NlcixcbiAgICAgICAgICogU2Ftc3VuZ0Jyb3dzZXIsIElyb24sIFNhZmFyaSwgU2t5ZmlyZSwgVGl6ZW4sIFdlYmtpdCwgUGFsZU1vb24sIEdlY2tvLCBUcmlkZW50LFxuICAgICAgICAgKiBQcmVzdG8sIEdvYW5uYSwgaU9TLCBBbmRyb2lkLCBCbGFja0JlcnJ5LCBCUkVXLCBKYXZhLCBXaW5kb3dzIFBob25lIE9TLCBXaW5kb3dzXG4gICAgICAgICAqIFBob25lLCBXaW5kb3dzIENFLCBXaW5kb3dzIE5ULCBTeW1iaWFuLCB3ZWJPUzwvdHQ+PGJyPlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSB0aGUgXCJyYXdcIiB2ZXJzaW9uIGFzIFN0cmluZyBvciA8dHQ+bnVsbDwvdHQ+IGlmIFVzZXItQWdlbnQgZG9lc24ndCBjb250YWluIHRoaXMgdmVyc2lvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogQGZ1bmN0aW9uIE1vYmlsZURldGVjdCN2ZXJzaW9uU3RyXG4gICAgICAgICAqL1xuICAgICAgICB2ZXJzaW9uU3RyOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm4gaW1wbC5nZXRWZXJzaW9uU3RyKGtleSwgdGhpcy51YSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdsb2JhbCB0ZXN0IGtleSBhZ2FpbnN0IHVzZXJBZ2VudCwgb3MsIHBob25lLCB0YWJsZXQgYW5kIHNvbWUgb3RoZXIgcHJvcGVydGllcyBvZiB1c2VyQWdlbnQgc3RyaW5nLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBrZXkgKGNhc2UtaW5zZW5zaXRpdmUpIG9mIGEgdXNlckFnZW50LCBhbiBvcGVyYXRpbmcgc3lzdGVtLCBwaG9uZSBvclxuICAgICAgICAgKiAgICAgICAgdGFibGV0IGZhbWlseS48YnI+XG4gICAgICAgICAqICAgICAgICBGb3IgYSBjb21wbGV0ZSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcywgc2VlIHtAbGluayBNb2JpbGVEZXRlY3QjdXNlckFnZW50fSxcbiAgICAgICAgICogICAgICAgIHtAbGluayBNb2JpbGVEZXRlY3Qjb3N9LCB7QGxpbmsgTW9iaWxlRGV0ZWN0I3Bob25lfSwge0BsaW5rIE1vYmlsZURldGVjdCN0YWJsZXR9Ljxicj5cbiAgICAgICAgICogICAgICAgIEFkZGl0aW9uYWxseSB5b3UgaGF2ZSBmb2xsb3dpbmcga2V5czo8YnI+XG4gICAgICAgICAqIDxicj48dHQ+Qm90LCBNb2JpbGVCb3QsIERlc2t0b3BNb2RlLCBUViwgV2ViS2l0LCBDb25zb2xlLCBXYXRjaDwvdHQ+PGJyPlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gPHR0PnRydWU8L3R0PiB3aGVuIHRoZSBnaXZlbiBrZXkgaXMgb25lIG9mIHRoZSBkZWZpbmVkIGtleXMgb2YgdXNlckFnZW50LCBvcywgcGhvbmUsXG4gICAgICAgICAqICAgICAgICAgICAgICAgICAgICB0YWJsZXQgb3Igb25lIG9mIHRoZSBsaXN0ZWQgYWRkaXRpb25hbCBrZXlzLCBvdGhlcndpc2UgPHR0PmZhbHNlPC90dD5cbiAgICAgICAgICogQGZ1bmN0aW9uIE1vYmlsZURldGVjdCNpc1xuICAgICAgICAgKi9cbiAgICAgICAgaXM6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250YWluc0lDKHRoaXMudXNlckFnZW50cygpLCBrZXkpIHx8XG4gICAgICAgICAgICAgICAgICAgZXF1YWxJQyhrZXksIHRoaXMub3MoKSkgfHxcbiAgICAgICAgICAgICAgICAgICBlcXVhbElDKGtleSwgdGhpcy5waG9uZSgpKSB8fFxuICAgICAgICAgICAgICAgICAgIGVxdWFsSUMoa2V5LCB0aGlzLnRhYmxldCgpKSB8fFxuICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zSUMoaW1wbC5maW5kTWF0Y2hlcyhpbXBsLm1vYmlsZURldGVjdFJ1bGVzLnV0aWxzLCB0aGlzLnVhKSwga2V5KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogRG8gYSBxdWljayB0ZXN0IGFnYWluc3QgbmF2aWdhdG9yOjp1c2VyQWdlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gcGF0dGVybiB0aGUgcGF0dGVybiwgZWl0aGVyIGFzIFN0cmluZyBvciBSZWdFeHBcbiAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAoYSBzdHJpbmcgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBjYXNlLWluc2Vuc2l0aXZlIFJlZ0V4cCkuXG4gICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSA8dHQ+dHJ1ZTwvdHQ+IHdoZW4gdGhlIHBhdHRlcm4gbWF0Y2hlcywgb3RoZXJ3aXNlIDx0dD5mYWxzZTwvdHQ+XG4gICAgICAgICAqIEBmdW5jdGlvbiBNb2JpbGVEZXRlY3QjbWF0Y2hcbiAgICAgICAgICovXG4gICAgICAgIG1hdGNoOiBmdW5jdGlvbiAocGF0dGVybikge1xuICAgICAgICAgICAgaWYgKCEocGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cCkpIHtcbiAgICAgICAgICAgICAgICBwYXR0ZXJuID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdCh0aGlzLnVhKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIG1vYmlsZSBkZXZpY2UgY2FuIGJlIGNvbnNpZGVyZWQgYXMgcGhvbmUgcmVnYXJkaW5nIDxjb2RlPnNjcmVlbi53aWR0aDwvY29kZT4uXG4gICAgICAgICAqIDxicj5cbiAgICAgICAgICogT2J2aW91c2x5IHRoaXMgbWV0aG9kIG1ha2VzIHNlbnNlIGluIGJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgKG5vdCBmb3IgTm9kZS5qcykhXG4gICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4UGhvbmVXaWR0aF0gdGhlIG1heGltdW0gbG9naWNhbCBwaXhlbHMgKGFrYS4gQ1NTLXBpeGVscykgdG8gYmUgY29uc2lkZXJlZCBhcyBwaG9uZS48YnI+XG4gICAgICAgICAqICAgICAgICBUaGUgYXJndW1lbnQgaXMgb3B0aW9uYWwgYW5kIGlmIG5vdCBwcmVzZW50IG9yIGZhbHN5LCB0aGUgdmFsdWUgb2YgdGhlIGNvbnN0cnVjdG9yIGlzIHRha2VuLlxuICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbnx1bmRlZmluZWR9IDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gaWYgc2NyZWVuIHNpemUgd2Fzbid0IGRldGVjdGFibGUsIGVsc2UgPGNvZGU+dHJ1ZTwvY29kZT5cbiAgICAgICAgICogICAgICAgICAgd2hlbiBzY3JlZW4ud2lkdGggaXMgbGVzcyBvciBlcXVhbCB0byBtYXhQaG9uZVdpZHRoLCBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+Ljxicj5cbiAgICAgICAgICogICAgICAgICAgV2lsbCBhbHdheXMgcmV0dXJuIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gc2VydmVyLXNpZGUuXG4gICAgICAgICAqL1xuICAgICAgICBpc1Bob25lU2l6ZWQ6IGZ1bmN0aW9uIChtYXhQaG9uZVdpZHRoKSB7XG4gICAgICAgICAgICByZXR1cm4gTW9iaWxlRGV0ZWN0LmlzUGhvbmVTaXplZChtYXhQaG9uZVdpZHRoIHx8IHRoaXMubWF4UGhvbmVXaWR0aCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdGhlIG1vYmlsZSBncmFkZSAoJ0EnLCAnQicsICdDJykuXG4gICAgICAgICAqXG4gICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IG9uZSBvZiB0aGUgbW9iaWxlIGdyYWRlcyAoJ0EnLCAnQicsICdDJykuXG4gICAgICAgICAqIEBmdW5jdGlvbiBNb2JpbGVEZXRlY3QjbW9iaWxlR3JhZGVcbiAgICAgICAgICovXG4gICAgICAgIG1vYmlsZUdyYWRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2FjaGUuZ3JhZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlLmdyYWRlID0gaW1wbC5tb2JpbGVHcmFkZSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZS5ncmFkZTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBlbnZpcm9ubWVudC1kZXBlbmRlbnRcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnNjcmVlbikge1xuICAgICAgICBNb2JpbGVEZXRlY3QuaXNQaG9uZVNpemVkID0gZnVuY3Rpb24gKG1heFBob25lV2lkdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXhQaG9uZVdpZHRoIDwgMCA/IHVuZGVmaW5lZCA6IGltcGwuZ2V0RGV2aWNlU21hbGxlclNpZGUoKSA8PSBtYXhQaG9uZVdpZHRoO1xuICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIE1vYmlsZURldGVjdC5pc1Bob25lU2l6ZWQgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICB9XG5cbiAgICAvLyBzaG91bGQgbm90IGJlIHJlcGxhY2VkIGJ5IGEgY29tcGxldGVseSBuZXcgb2JqZWN0IC0ganVzdCBvdmVyd3JpdGUgZXhpc3RpbmcgbWV0aG9kc1xuICAgIE1vYmlsZURldGVjdC5faW1wbCA9IGltcGw7XG4gICAgXG4gICAgTW9iaWxlRGV0ZWN0LnZlcnNpb24gPSAnMS4zLjYgMjAxNy0wNC0wNSc7XG5cbiAgICByZXR1cm4gTW9iaWxlRGV0ZWN0O1xufSk7IC8vIGVuZCBvZiBjYWxsIG9mIGRlZmluZSgpXG59KSgoZnVuY3Rpb24gKHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGZhY3RvcnkpIHsgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7IH07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZmFjdG9yeSkgeyB3aW5kb3cuTW9iaWxlRGV0ZWN0ID0gZmFjdG9yeSgpOyB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHBsZWFzZSBmaWxlIGEgYnVnIGlmIHlvdSBnZXQgdGhpcyBlcnJvciFcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGVudmlyb25tZW50Jyk7XG4gICAgfVxufSkoKSk7IiwiLypcbm9iamVjdC1hc3NpZ25cbihjKSBTaW5kcmUgU29yaHVzXG5AbGljZW5zZSBNSVRcbiovXG5cbid1c2Ugc3RyaWN0Jztcbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcbnZhciBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgcHJvcElzRW51bWVyYWJsZSA9IE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7XG5cbmZ1bmN0aW9uIHRvT2JqZWN0KHZhbCkge1xuXHRpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmFzc2lnbiBjYW5ub3QgYmUgY2FsbGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWQnKTtcblx0fVxuXG5cdHJldHVybiBPYmplY3QodmFsKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkVXNlTmF0aXZlKCkge1xuXHR0cnkge1xuXHRcdGlmICghT2JqZWN0LmFzc2lnbikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIERldGVjdCBidWdneSBwcm9wZXJ0eSBlbnVtZXJhdGlvbiBvcmRlciBpbiBvbGRlciBWOCB2ZXJzaW9ucy5cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTQxMThcblx0XHR2YXIgdGVzdDEgPSBuZXcgU3RyaW5nKCdhYmMnKTsgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3LXdyYXBwZXJzXG5cdFx0dGVzdDFbNV0gPSAnZGUnO1xuXHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0ZXN0MSlbMF0gPT09ICc1Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDIgPSB7fTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIHtcblx0XHRcdHRlc3QyWydfJyArIFN0cmluZy5mcm9tQ2hhckNvZGUoaSldID0gaTtcblx0XHR9XG5cdFx0dmFyIG9yZGVyMiA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QyKS5tYXAoZnVuY3Rpb24gKG4pIHtcblx0XHRcdHJldHVybiB0ZXN0MltuXTtcblx0XHR9KTtcblx0XHRpZiAob3JkZXIyLmpvaW4oJycpICE9PSAnMDEyMzQ1Njc4OScpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMDU2XG5cdFx0dmFyIHRlc3QzID0ge307XG5cdFx0J2FiY2RlZmdoaWprbG1ub3BxcnN0Jy5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAobGV0dGVyKSB7XG5cdFx0XHR0ZXN0M1tsZXR0ZXJdID0gbGV0dGVyO1xuXHRcdH0pO1xuXHRcdGlmIChPYmplY3Qua2V5cyhPYmplY3QuYXNzaWduKHt9LCB0ZXN0MykpLmpvaW4oJycpICE9PVxuXHRcdFx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gY2F0Y2ggKGVycikge1xuXHRcdC8vIFdlIGRvbid0IGV4cGVjdCBhbnkgb2YgdGhlIGFib3ZlIHRvIHRocm93LCBidXQgYmV0dGVyIHRvIGJlIHNhZmUuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gc2hvdWxkVXNlTmF0aXZlKCkgPyBPYmplY3QuYXNzaWduIDogZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG5cdHZhciBmcm9tO1xuXHR2YXIgdG8gPSB0b09iamVjdCh0YXJnZXQpO1xuXHR2YXIgc3ltYm9scztcblxuXHRmb3IgKHZhciBzID0gMTsgcyA8IGFyZ3VtZW50cy5sZW5ndGg7IHMrKykge1xuXHRcdGZyb20gPSBPYmplY3QoYXJndW1lbnRzW3NdKTtcblxuXHRcdGZvciAodmFyIGtleSBpbiBmcm9tKSB7XG5cdFx0XHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChmcm9tLCBrZXkpKSB7XG5cdFx0XHRcdHRvW2tleV0gPSBmcm9tW2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGdldE93blByb3BlcnR5U3ltYm9scykge1xuXHRcdFx0c3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9scyhmcm9tKTtcblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgc3ltYm9scy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocHJvcElzRW51bWVyYWJsZS5jYWxsKGZyb20sIHN5bWJvbHNbaV0pKSB7XG5cdFx0XHRcdFx0dG9bc3ltYm9sc1tpXV0gPSBmcm9tW3N5bWJvbHNbaV1dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHRvO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgVFlQRURfT0sgPSAgKHR5cGVvZiBVaW50OEFycmF5ICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIFVpbnQxNkFycmF5ICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgICAgICAgICAodHlwZW9mIEludDMyQXJyYXkgIT09ICd1bmRlZmluZWQnKTtcblxuXG5leHBvcnRzLmFzc2lnbiA9IGZ1bmN0aW9uIChvYmogLypmcm9tMSwgZnJvbTIsIGZyb20zLCAuLi4qLykge1xuICB2YXIgc291cmNlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gIHdoaWxlIChzb3VyY2VzLmxlbmd0aCkge1xuICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzLnNoaWZ0KCk7XG4gICAgaWYgKCFzb3VyY2UpIHsgY29udGludWU7IH1cblxuICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzb3VyY2UgKyAnbXVzdCBiZSBub24tb2JqZWN0Jyk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgcCBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocCkpIHtcbiAgICAgICAgb2JqW3BdID0gc291cmNlW3BdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG5cbi8vIHJlZHVjZSBidWZmZXIgc2l6ZSwgYXZvaWRpbmcgbWVtIGNvcHlcbmV4cG9ydHMuc2hyaW5rQnVmID0gZnVuY3Rpb24gKGJ1Ziwgc2l6ZSkge1xuICBpZiAoYnVmLmxlbmd0aCA9PT0gc2l6ZSkgeyByZXR1cm4gYnVmOyB9XG4gIGlmIChidWYuc3ViYXJyYXkpIHsgcmV0dXJuIGJ1Zi5zdWJhcnJheSgwLCBzaXplKTsgfVxuICBidWYubGVuZ3RoID0gc2l6ZTtcbiAgcmV0dXJuIGJ1Zjtcbn07XG5cblxudmFyIGZuVHlwZWQgPSB7XG4gIGFycmF5U2V0OiBmdW5jdGlvbiAoZGVzdCwgc3JjLCBzcmNfb2ZmcywgbGVuLCBkZXN0X29mZnMpIHtcbiAgICBpZiAoc3JjLnN1YmFycmF5ICYmIGRlc3Quc3ViYXJyYXkpIHtcbiAgICAgIGRlc3Quc2V0KHNyYy5zdWJhcnJheShzcmNfb2Zmcywgc3JjX29mZnMgKyBsZW4pLCBkZXN0X29mZnMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBGYWxsYmFjayB0byBvcmRpbmFyeSBhcnJheVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTtcbiAgICB9XG4gIH0sXG4gIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS5cbiAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24gKGNodW5rcykge1xuICAgIHZhciBpLCBsLCBsZW4sIHBvcywgY2h1bmssIHJlc3VsdDtcblxuICAgIC8vIGNhbGN1bGF0ZSBkYXRhIGxlbmd0aFxuICAgIGxlbiA9IDA7XG4gICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGxlbiArPSBjaHVua3NbaV0ubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIGpvaW4gY2h1bmtzXG4gICAgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkobGVuKTtcbiAgICBwb3MgPSAwO1xuICAgIGZvciAoaSA9IDAsIGwgPSBjaHVua3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBjaHVuayA9IGNodW5rc1tpXTtcbiAgICAgIHJlc3VsdC5zZXQoY2h1bmssIHBvcyk7XG4gICAgICBwb3MgKz0gY2h1bmsubGVuZ3RoO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5cbnZhciBmblVudHlwZWQgPSB7XG4gIGFycmF5U2V0OiBmdW5jdGlvbiAoZGVzdCwgc3JjLCBzcmNfb2ZmcywgbGVuLCBkZXN0X29mZnMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBkZXN0W2Rlc3Rfb2ZmcyArIGldID0gc3JjW3NyY19vZmZzICsgaV07XG4gICAgfVxuICB9LFxuICAvLyBKb2luIGFycmF5IG9mIGNodW5rcyB0byBzaW5nbGUgYXJyYXkuXG4gIGZsYXR0ZW5DaHVua3M6IGZ1bmN0aW9uIChjaHVua3MpIHtcbiAgICByZXR1cm4gW10uY29uY2F0LmFwcGx5KFtdLCBjaHVua3MpO1xuICB9XG59O1xuXG5cbi8vIEVuYWJsZS9EaXNhYmxlIHR5cGVkIGFycmF5cyB1c2UsIGZvciB0ZXN0aW5nXG4vL1xuZXhwb3J0cy5zZXRUeXBlZCA9IGZ1bmN0aW9uIChvbikge1xuICBpZiAob24pIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gVWludDhBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjE2ID0gVWludDE2QXJyYXk7XG4gICAgZXhwb3J0cy5CdWYzMiA9IEludDMyQXJyYXk7XG4gICAgZXhwb3J0cy5hc3NpZ24oZXhwb3J0cywgZm5UeXBlZCk7XG4gIH0gZWxzZSB7XG4gICAgZXhwb3J0cy5CdWY4ICA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gQXJyYXk7XG4gICAgZXhwb3J0cy5hc3NpZ24oZXhwb3J0cywgZm5VbnR5cGVkKTtcbiAgfVxufTtcblxuZXhwb3J0cy5zZXRUeXBlZChUWVBFRF9PSyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIE5vdGU6IGFkbGVyMzIgdGFrZXMgMTIlIGZvciBsZXZlbCAwIGFuZCAyJSBmb3IgbGV2ZWwgNi5cbi8vIEl0IGRvZXNuJ3Qgd29ydGggdG8gbWFrZSBhZGRpdGlvbmFsIG9wdGltaXphdGlvbmEgYXMgaW4gb3JpZ2luYWwuXG4vLyBTbWFsbCBzaXplIGlzIHByZWZlcmFibGUuXG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuZnVuY3Rpb24gYWRsZXIzMihhZGxlciwgYnVmLCBsZW4sIHBvcykge1xuICB2YXIgczEgPSAoYWRsZXIgJiAweGZmZmYpIHwwLFxuICAgICAgczIgPSAoKGFkbGVyID4+PiAxNikgJiAweGZmZmYpIHwwLFxuICAgICAgbiA9IDA7XG5cbiAgd2hpbGUgKGxlbiAhPT0gMCkge1xuICAgIC8vIFNldCBsaW1pdCB+IHR3aWNlIGxlc3MgdGhhbiA1NTUyLCB0byBrZWVwXG4gICAgLy8gczIgaW4gMzEtYml0cywgYmVjYXVzZSB3ZSBmb3JjZSBzaWduZWQgaW50cy5cbiAgICAvLyBpbiBvdGhlciBjYXNlICU9IHdpbGwgZmFpbC5cbiAgICBuID0gbGVuID4gMjAwMCA/IDIwMDAgOiBsZW47XG4gICAgbGVuIC09IG47XG5cbiAgICBkbyB7XG4gICAgICBzMSA9IChzMSArIGJ1Zltwb3MrK10pIHwwO1xuICAgICAgczIgPSAoczIgKyBzMSkgfDA7XG4gICAgfSB3aGlsZSAoLS1uKTtcblxuICAgIHMxICU9IDY1NTIxO1xuICAgIHMyICU9IDY1NTIxO1xuICB9XG5cbiAgcmV0dXJuIChzMSB8IChzMiA8PCAxNikpIHwwO1xufVxuXG5cbm1vZHVsZS5leHBvcnRzID0gYWRsZXIzMjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gTm90ZTogd2UgY2FuJ3QgZ2V0IHNpZ25pZmljYW50IHNwZWVkIGJvb3N0IGhlcmUuXG4vLyBTbyB3cml0ZSBjb2RlIHRvIG1pbmltaXplIHNpemUgLSBubyBwcmVnZW5lcmF0ZWQgdGFibGVzXG4vLyBhbmQgYXJyYXkgdG9vbHMgZGVwZW5kZW5jaWVzLlxuXG4vLyAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXJcbi8vIChDKSAyMDE0LTIwMTcgVml0YWx5IFB1enJpbiBhbmQgQW5kcmV5IFR1cGl0c2luXG4vL1xuLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWRcbi8vIHdhcnJhbnR5LiBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlc1xuLy8gYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSxcbi8vIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXRcbi8vIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczpcbi8vXG4vLyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdFxuLy8gICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZVxuLy8gICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmVcbi8vICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC5cbi8vIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlXG4vLyAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS5cbi8vIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uXG5cbi8vIFVzZSBvcmRpbmFyeSBhcnJheSwgc2luY2UgdW50eXBlZCBtYWtlcyBubyBib29zdCBoZXJlXG5mdW5jdGlvbiBtYWtlVGFibGUoKSB7XG4gIHZhciBjLCB0YWJsZSA9IFtdO1xuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgMjU2OyBuKyspIHtcbiAgICBjID0gbjtcbiAgICBmb3IgKHZhciBrID0gMDsgayA8IDg7IGsrKykge1xuICAgICAgYyA9ICgoYyAmIDEpID8gKDB4RURCODgzMjAgXiAoYyA+Pj4gMSkpIDogKGMgPj4+IDEpKTtcbiAgICB9XG4gICAgdGFibGVbbl0gPSBjO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlO1xufVxuXG4vLyBDcmVhdGUgdGFibGUgb24gbG9hZC4gSnVzdCAyNTUgc2lnbmVkIGxvbmdzLiBOb3QgYSBwcm9ibGVtLlxudmFyIGNyY1RhYmxlID0gbWFrZVRhYmxlKCk7XG5cblxuZnVuY3Rpb24gY3JjMzIoY3JjLCBidWYsIGxlbiwgcG9zKSB7XG4gIHZhciB0ID0gY3JjVGFibGUsXG4gICAgICBlbmQgPSBwb3MgKyBsZW47XG5cbiAgY3JjIF49IC0xO1xuXG4gIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKykge1xuICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdFsoY3JjIF4gYnVmW2ldKSAmIDB4RkZdO1xuICB9XG5cbiAgcmV0dXJuIChjcmMgXiAoLTEpKTsgLy8gPj4+IDA7XG59XG5cblxubW9kdWxlLmV4cG9ydHMgPSBjcmMzMjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG4vLyBTZWUgc3RhdGUgZGVmcyBmcm9tIGluZmxhdGUuanNcbnZhciBCQUQgPSAzMDsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyIFRZUEUgPSAxMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciB0eXBlIGJpdHMsIGluY2x1ZGluZyBsYXN0LWZsYWcgYml0ICovXG5cbi8qXG4gICBEZWNvZGUgbGl0ZXJhbCwgbGVuZ3RoLCBhbmQgZGlzdGFuY2UgY29kZXMgYW5kIHdyaXRlIG91dCB0aGUgcmVzdWx0aW5nXG4gICBsaXRlcmFsIGFuZCBtYXRjaCBieXRlcyB1bnRpbCBlaXRoZXIgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgaXNcbiAgIGF2YWlsYWJsZSwgYW4gZW5kLW9mLWJsb2NrIGlzIGVuY291bnRlcmVkLCBvciBhIGRhdGEgZXJyb3IgaXMgZW5jb3VudGVyZWQuXG4gICBXaGVuIGxhcmdlIGVub3VnaCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIHN1cHBsaWVkIHRvIGluZmxhdGUoKSwgZm9yXG4gICBleGFtcGxlLCBhIDE2SyBpbnB1dCBidWZmZXIgYW5kIGEgNjRLIG91dHB1dCBidWZmZXIsIG1vcmUgdGhhbiA5NSUgb2YgdGhlXG4gICBpbmZsYXRlIGV4ZWN1dGlvbiB0aW1lIGlzIHNwZW50IGluIHRoaXMgcm91dGluZS5cblxuICAgRW50cnkgYXNzdW1wdGlvbnM6XG5cbiAgICAgICAgc3RhdGUubW9kZSA9PT0gTEVOXG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPj0gNlxuICAgICAgICBzdHJtLmF2YWlsX291dCA+PSAyNThcbiAgICAgICAgc3RhcnQgPj0gc3RybS5hdmFpbF9vdXRcbiAgICAgICAgc3RhdGUuYml0cyA8IDhcblxuICAgT24gcmV0dXJuLCBzdGF0ZS5tb2RlIGlzIG9uZSBvZjpcblxuICAgICAgICBMRU4gLS0gcmFuIG91dCBvZiBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIGVub3VnaCBhdmFpbGFibGUgaW5wdXRcbiAgICAgICAgVFlQRSAtLSByZWFjaGVkIGVuZCBvZiBibG9jayBjb2RlLCBpbmZsYXRlKCkgdG8gaW50ZXJwcmV0IG5leHQgYmxvY2tcbiAgICAgICAgQkFEIC0tIGVycm9yIGluIGJsb2NrIGRhdGFcblxuICAgTm90ZXM6XG5cbiAgICAtIFRoZSBtYXhpbXVtIGlucHV0IGJpdHMgdXNlZCBieSBhIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIDE1IGJpdHMgZm9yIHRoZVxuICAgICAgbGVuZ3RoIGNvZGUsIDUgYml0cyBmb3IgdGhlIGxlbmd0aCBleHRyYSwgMTUgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGNvZGUsXG4gICAgICBhbmQgMTMgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGV4dHJhLiAgVGhpcyB0b3RhbHMgNDggYml0cywgb3Igc2l4IGJ5dGVzLlxuICAgICAgVGhlcmVmb3JlIGlmIHN0cm0uYXZhaWxfaW4gPj0gNiwgdGhlbiB0aGVyZSBpcyBlbm91Z2ggaW5wdXQgdG8gYXZvaWRcbiAgICAgIGNoZWNraW5nIGZvciBhdmFpbGFibGUgaW5wdXQgd2hpbGUgZGVjb2RpbmcuXG5cbiAgICAtIFRoZSBtYXhpbXVtIGJ5dGVzIHRoYXQgYSBzaW5nbGUgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgY2FuIG91dHB1dCBpcyAyNThcbiAgICAgIGJ5dGVzLCB3aGljaCBpcyB0aGUgbWF4aW11bSBsZW5ndGggdGhhdCBjYW4gYmUgY29kZWQuICBpbmZsYXRlX2Zhc3QoKVxuICAgICAgcmVxdWlyZXMgc3RybS5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yXG4gICAgICBvdXRwdXQgc3BhY2UuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXJ0KSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIF9pbjsgICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uaW5wdXQgKi9cbiAgdmFyIGxhc3Q7ICAgICAgICAgICAgICAgICAgIC8qIGhhdmUgZW5vdWdoIGlucHV0IHdoaWxlIGluIDwgbGFzdCAqL1xuICB2YXIgX291dDsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5vdXRwdXQgKi9cbiAgdmFyIGJlZzsgICAgICAgICAgICAgICAgICAgIC8qIGluZmxhdGUoKSdzIGluaXRpYWwgc3RybS5vdXRwdXQgKi9cbiAgdmFyIGVuZDsgICAgICAgICAgICAgICAgICAgIC8qIHdoaWxlIG91dCA8IGVuZCwgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSAqL1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgdmFyIGRtYXg7ICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gZGlzdGFuY2UgZnJvbSB6bGliIGhlYWRlciAqL1xuLy8jZW5kaWZcbiAgdmFyIHdzaXplOyAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqL1xuICB2YXIgd2hhdmU7ICAgICAgICAgICAgICAgICAgLyogdmFsaWQgYnl0ZXMgaW4gdGhlIHdpbmRvdyAqL1xuICB2YXIgd25leHQ7ICAgICAgICAgICAgICAgICAgLyogd2luZG93IHdyaXRlIGluZGV4ICovXG4gIC8vIFVzZSBgc193aW5kb3dgIGluc3RlYWQgYHdpbmRvd2AsIGF2b2lkIGNvbmZsaWN0IHdpdGggaW5zdHJ1bWVudGF0aW9uIHRvb2xzXG4gIHZhciBzX3dpbmRvdzsgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIHdzaXplICE9IDAgKi9cbiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uaG9sZCAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5iaXRzICovXG4gIHZhciBsY29kZTsgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmxlbmNvZGUgKi9cbiAgdmFyIGRjb2RlOyAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uZGlzdGNvZGUgKi9cbiAgdmFyIGxtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGxlbmd0aCBjb2RlcyAqL1xuICB2YXIgZG1hc2s7ICAgICAgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgZGlzdGFuY2UgY29kZXMgKi9cbiAgdmFyIGhlcmU7ICAgICAgICAgICAgICAgICAgIC8qIHJldHJpZXZlZCB0YWJsZSBlbnRyeSAqL1xuICB2YXIgb3A7ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBiaXRzLCBvcGVyYXRpb24sIGV4dHJhIGJpdHMsIG9yICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgd2luZG93IHBvc2l0aW9uLCB3aW5kb3cgYnl0ZXMgdG8gY29weSAqL1xuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoLCB1bnVzZWQgYnl0ZXMgKi9cbiAgdmFyIGRpc3Q7ICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGRpc3RhbmNlICovXG4gIHZhciBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGZyb20gKi9cbiAgdmFyIGZyb21fc291cmNlO1xuXG5cbiAgdmFyIGlucHV0LCBvdXRwdXQ7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcblxuICAvKiBjb3B5IHN0YXRlIHRvIGxvY2FsIHZhcmlhYmxlcyAqL1xuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIC8vaGVyZSA9IHN0YXRlLmhlcmU7XG4gIF9pbiA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBsYXN0ID0gX2luICsgKHN0cm0uYXZhaWxfaW4gLSA1KTtcbiAgX291dCA9IHN0cm0ubmV4dF9vdXQ7XG4gIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICBiZWcgPSBfb3V0IC0gKHN0YXJ0IC0gc3RybS5hdmFpbF9vdXQpO1xuICBlbmQgPSBfb3V0ICsgKHN0cm0uYXZhaWxfb3V0IC0gMjU3KTtcbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gIGRtYXggPSBzdGF0ZS5kbWF4O1xuLy8jZW5kaWZcbiAgd3NpemUgPSBzdGF0ZS53c2l6ZTtcbiAgd2hhdmUgPSBzdGF0ZS53aGF2ZTtcbiAgd25leHQgPSBzdGF0ZS53bmV4dDtcbiAgc193aW5kb3cgPSBzdGF0ZS53aW5kb3c7XG4gIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICBiaXRzID0gc3RhdGUuYml0cztcbiAgbGNvZGUgPSBzdGF0ZS5sZW5jb2RlO1xuICBkY29kZSA9IHN0YXRlLmRpc3Rjb2RlO1xuICBsbWFzayA9ICgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMTtcbiAgZG1hc2sgPSAoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxO1xuXG5cbiAgLyogZGVjb2RlIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2VzIHVudGlsIGVuZC1vZi1ibG9jayBvciBub3QgZW5vdWdoXG4gICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovXG5cbiAgdG9wOlxuICBkbyB7XG4gICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgIGJpdHMgKz0gODtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgfVxuXG4gICAgaGVyZSA9IGxjb2RlW2hvbGQgJiBsbWFza107XG5cbiAgICBkb2xlbjpcbiAgICBmb3IgKDs7KSB7IC8vIEdvdG8gZW11bGF0aW9uXG4gICAgICBvcCA9IGhlcmUgPj4+IDI0LypoZXJlLmJpdHMqLztcbiAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgIGJpdHMgLT0gb3A7XG4gICAgICBvcCA9IChoZXJlID4+PiAxNikgJiAweGZmLypoZXJlLm9wKi87XG4gICAgICBpZiAob3AgPT09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgKi9cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgb3V0cHV0W19vdXQrK10gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBiYXNlICovXG4gICAgICAgIGxlbiA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovXG4gICAgICAgIGlmIChvcCkge1xuICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxlbiArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XFxuXCIsIGxlbikpO1xuICAgICAgICBpZiAoYml0cyA8IDE1KSB7XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgaGVyZSA9IGRjb2RlW2hvbGQgJiBkbWFza107XG5cbiAgICAgICAgZG9kaXN0OlxuICAgICAgICBmb3IgKDs7KSB7IC8vIGdvdG8gZW11bGF0aW9uXG4gICAgICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuXG4gICAgICAgICAgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFzZSAqL1xuICAgICAgICAgICAgZGlzdCA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovXG4gICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXN0ICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgICAgICAgaWYgKGRpc3QgPiBkbWF4KSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIGRpc3QpKTtcbiAgICAgICAgICAgIG9wID0gX291dCAtIGJlZzsgICAgICAgICAgICAgICAgLyogbWF4IGRpc3RhbmNlIGluIG91dHB1dCAqL1xuICAgICAgICAgICAgaWYgKGRpc3QgPiBvcCkgeyAgICAgICAgICAgICAgICAvKiBzZWUgaWYgY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBvcCA9IGRpc3QgLSBvcDsgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBpZiAob3AgPiB3aGF2ZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgICAgIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcbi8vI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUlxuLy8gICAgICAgICAgICAgICAgaWYgKGxlbiA8PSBvcCAtIHdoYXZlKSB7XG4vLyAgICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IDA7XG4vLyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTtcbi8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wO1xuLy8gICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgbGVuIC09IG9wIC0gd2hhdmU7XG4vLyAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gMDtcbi8vICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3AgPiB3aGF2ZSk7XG4vLyAgICAgICAgICAgICAgICBpZiAob3AgPT09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0O1xuLy8gICAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbi8vICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW4pO1xuLy8gICAgICAgICAgICAgICAgICBjb250aW51ZSB0b3A7XG4vLyAgICAgICAgICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZyb20gPSAwOyAvLyB3aW5kb3cgaW5kZXhcbiAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBzX3dpbmRvdztcbiAgICAgICAgICAgICAgaWYgKHduZXh0ID09PSAwKSB7ICAgICAgICAgICAvKiB2ZXJ5IGNvbW1vbiBjYXNlICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSAtIG9wO1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAod25leHQgPCBvcCkgeyAgICAgIC8qIHdyYXAgYXJvdW5kIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgKyB3bmV4dCAtIG9wO1xuICAgICAgICAgICAgICAgIG9wIC09IHduZXh0O1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSBlbmQgb2Ygd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IDA7XG4gICAgICAgICAgICAgICAgICBpZiAod25leHQgPCBsZW4pIHsgIC8qIHNvbWUgZnJvbSBzdGFydCBvZiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgICAgb3AgPSB3bmV4dDtcbiAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgICAgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBjb250aWd1b3VzIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd25leHQgLSBvcDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHdoaWxlIChsZW4gPiAyKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgbGVuIC09IDM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgICAgICAgICAgLyogY29weSBkaXJlY3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0gbGVuZ3RoIGlzIHRocmVlICovXG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgbGVuIC09IDM7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiA+IDIpO1xuICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgIC8qIDJuZCBsZXZlbCBkaXN0YW5jZSBjb2RlICovXG4gICAgICAgICAgICBoZXJlID0gZGNvZGVbKGhlcmUgJiAweGZmZmYpLypoZXJlLnZhbCovICsgKGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkpXTtcbiAgICAgICAgICAgIGNvbnRpbnVlIGRvZGlzdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhazsgLy8gbmVlZCB0byBlbXVsYXRlIGdvdG8gdmlhIFwiY29udGludWVcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsgICAgICAgICAgICAgIC8qIDJuZCBsZXZlbCBsZW5ndGggY29kZSAqL1xuICAgICAgICBoZXJlID0gbGNvZGVbKGhlcmUgJiAweGZmZmYpLypoZXJlLnZhbCovICsgKGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkpXTtcbiAgICAgICAgY29udGludWUgZG9sZW47XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChvcCAmIDMyKSB7ICAgICAgICAgICAgICAgICAgICAgLyogZW5kLW9mLWJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXFxuXCIpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrIHRvcDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhayB0b3A7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrOyAvLyBuZWVkIHRvIGVtdWxhdGUgZ290byB2aWEgXCJjb250aW51ZVwiXG4gICAgfVxuICB9IHdoaWxlIChfaW4gPCBsYXN0ICYmIF9vdXQgPCBlbmQpO1xuXG4gIC8qIHJldHVybiB1bnVzZWQgYnl0ZXMgKG9uIGVudHJ5LCBiaXRzIDwgOCwgc28gaW4gd29uJ3QgZ28gdG9vIGZhciBiYWNrKSAqL1xuICBsZW4gPSBiaXRzID4+IDM7XG4gIF9pbiAtPSBsZW47XG4gIGJpdHMgLT0gbGVuIDw8IDM7XG4gIGhvbGQgJj0gKDEgPDwgYml0cykgLSAxO1xuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovXG4gIHN0cm0ubmV4dF9pbiA9IF9pbjtcbiAgc3RybS5uZXh0X291dCA9IF9vdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSAoX2luIDwgbGFzdCA/IDUgKyAobGFzdCAtIF9pbikgOiA1IC0gKF9pbiAtIGxhc3QpKTtcbiAgc3RybS5hdmFpbF9vdXQgPSAoX291dCA8IGVuZCA/IDI1NyArIChlbmQgLSBfb3V0KSA6IDI1NyAtIChfb3V0IC0gZW5kKSk7XG4gIHN0YXRlLmhvbGQgPSBob2xkO1xuICBzdGF0ZS5iaXRzID0gYml0cztcbiAgcmV0dXJuO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyXG4vLyAoQykgMjAxNC0yMDE3IFZpdGFseSBQdXpyaW4gYW5kIEFuZHJleSBUdXBpdHNpblxuLy9cbi8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkXG4vLyB3YXJyYW50eS4gSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXNcbi8vIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsXG4vLyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0XG4vLyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6XG4vL1xuLy8gMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3Rcbi8vICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmVcbi8vICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlXG4vLyAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuXG4vLyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZVxuLy8gICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuXG4vLyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLlxuXG52YXIgdXRpbHMgICAgICAgICA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIGFkbGVyMzIgICAgICAgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcbnZhciBjcmMzMiAgICAgICAgID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIGluZmxhdGVfZmFzdCAgPSByZXF1aXJlKCcuL2luZmZhc3QnKTtcbnZhciBpbmZsYXRlX3RhYmxlID0gcmVxdWlyZSgnLi9pbmZ0cmVlcycpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuLy92YXIgWl9OT19GTFVTSCAgICAgID0gMDtcbi8vdmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7XG4vL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xuLy92YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG52YXIgWl9UUkVFUyAgICAgICAgID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG52YXIgWl9ORUVEX0RJQ1QgICAgID0gMjtcbi8vdmFyIFpfRVJSTk8gICAgICAgICA9IC0xO1xudmFyIFpfU1RSRUFNX0VSUk9SICA9IC0yO1xudmFyIFpfREFUQV9FUlJPUiAgICA9IC0zO1xudmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQgID0gODtcblxuXG4vKiBTVEFURVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgICAgSEVBRCA9IDE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1hZ2ljIGhlYWRlciAqL1xudmFyICAgIEZMQUdTID0gMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtZXRob2QgYW5kIGZsYWdzIChnemlwKSAqL1xudmFyICAgIFRJTUUgPSAzOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtb2RpZmljYXRpb24gdGltZSAoZ3ppcCkgKi9cbnZhciAgICBPUyA9IDQ7ICAgICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgZmxhZ3MgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKGd6aXApICovXG52YXIgICAgRVhMRU4gPSA1OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBFWFRSQSA9IDY7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgYnl0ZXMgKGd6aXApICovXG52YXIgICAgTkFNRSA9IDc7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBmaWxlIG5hbWUgKGd6aXApICovXG52YXIgICAgQ09NTUVOVCA9IDg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBjb21tZW50IChnemlwKSAqL1xudmFyICAgIEhDUkMgPSA5OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBoZWFkZXIgY3JjIChnemlwKSAqL1xudmFyICAgIERJQ1RJRCA9IDEwOyAgICAvKiBpOiB3YWl0aW5nIGZvciBkaWN0aW9uYXJ5IGNoZWNrIHZhbHVlICovXG52YXIgICAgRElDVCA9IDExOyAgICAgIC8qIHdhaXRpbmcgZm9yIGluZmxhdGVTZXREaWN0aW9uYXJ5KCkgY2FsbCAqL1xudmFyICAgICAgICBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xudmFyICAgICAgICBUWVBFRE8gPSAxMzsgICAgLyogaTogc2FtZSwgYnV0IHNraXAgY2hlY2sgdG8gZXhpdCBpbmZsYXRlIG9uIG5ldyBibG9jayAqL1xudmFyICAgICAgICBTVE9SRUQgPSAxNDsgICAgLyogaTogd2FpdGluZyBmb3Igc3RvcmVkIHNpemUgKGxlbmd0aCBhbmQgY29tcGxlbWVudCkgKi9cbnZhciAgICAgICAgQ09QWV8gPSAxNTsgICAgIC8qIGkvbzogc2FtZSBhcyBDT1BZIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgIENPUFkgPSAxNjsgICAgICAvKiBpL286IHdhaXRpbmcgZm9yIGlucHV0IG9yIG91dHB1dCB0byBjb3B5IHN0b3JlZCBibG9jayAqL1xudmFyICAgICAgICBUQUJMRSA9IDE3OyAgICAgLyogaTogd2FpdGluZyBmb3IgZHluYW1pYyBibG9jayB0YWJsZSBsZW5ndGhzICovXG52YXIgICAgICAgIExFTkxFTlMgPSAxODsgICAvKiBpOiB3YWl0aW5nIGZvciBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgQ09ERUxFTlMgPSAxOTsgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqL1xudmFyICAgICAgICAgICAgTEVOXyA9IDIwOyAgICAgIC8qIGk6IHNhbWUgYXMgTEVOIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgICAgICBMRU4gPSAyMTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdC9lb2IgY29kZSAqL1xudmFyICAgICAgICAgICAgTEVORVhUID0gMjI7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aCBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBESVNUID0gMjM7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgY29kZSAqL1xudmFyICAgICAgICAgICAgRElTVEVYVCA9IDI0OyAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGV4dHJhIGJpdHMgKi9cbnZhciAgICAgICAgICAgIE1BVENIID0gMjU7ICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gY29weSBzdHJpbmcgKi9cbnZhciAgICAgICAgICAgIExJVCA9IDI2OyAgICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gd3JpdGUgbGl0ZXJhbCAqL1xudmFyICAgIENIRUNLID0gMjc7ICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgY2hlY2sgdmFsdWUgKi9cbnZhciAgICBMRU5HVEggPSAyODsgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBET05FID0gMjk7ICAgICAgLyogZmluaXNoZWQgY2hlY2ssIGRvbmUgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBCQUQgPSAzMDsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIE1FTSA9IDMxOyAgICAgICAvKiBnb3QgYW4gaW5mbGF0ZSgpIG1lbW9yeSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIFNZTkMgPSAzMjsgICAgICAvKiBsb29raW5nIGZvciBzeW5jaHJvbml6YXRpb24gYnl0ZXMgdG8gcmVzdGFydCBpbmZsYXRlKCkgKi9cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG5cbnZhciBFTk9VR0hfTEVOUyA9IDg1MjtcbnZhciBFTk9VR0hfRElTVFMgPSA1OTI7XG4vL3ZhciBFTk9VR0ggPSAgKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xudmFyIERFRl9XQklUUyA9IE1BWF9XQklUUztcblxuXG5mdW5jdGlvbiB6c3dhcDMyKHEpIHtcbiAgcmV0dXJuICAoKChxID4+PiAyNCkgJiAweGZmKSArXG4gICAgICAgICAgKChxID4+PiA4KSAmIDB4ZmYwMCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYwMCkgPDwgOCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYpIDw8IDI0KSk7XG59XG5cblxuZnVuY3Rpb24gSW5mbGF0ZVN0YXRlKCkge1xuICB0aGlzLm1vZGUgPSAwOyAgICAgICAgICAgICAvKiBjdXJyZW50IGluZmxhdGUgbW9kZSAqL1xuICB0aGlzLmxhc3QgPSBmYWxzZTsgICAgICAgICAgLyogdHJ1ZSBpZiBwcm9jZXNzaW5nIGxhc3QgYmxvY2sgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5oYXZlZGljdCA9IGZhbHNlOyAgICAgIC8qIHRydWUgaWYgZGljdGlvbmFyeSBwcm92aWRlZCAqL1xuICB0aGlzLmZsYWdzID0gMDsgICAgICAgICAgICAgLyogZ3ppcCBoZWFkZXIgbWV0aG9kIGFuZCBmbGFncyAoMCBpZiB6bGliKSAqL1xuICB0aGlzLmRtYXggPSAwOyAgICAgICAgICAgICAgLyogemxpYiBoZWFkZXIgbWF4IGRpc3RhbmNlIChJTkZMQVRFX1NUUklDVCkgKi9cbiAgdGhpcy5jaGVjayA9IDA7ICAgICAgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIGNoZWNrIHZhbHVlICovXG4gIHRoaXMudG90YWwgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBvdXRwdXQgY291bnQgKi9cbiAgLy8gVE9ETzogbWF5IGJlIHt9XG4gIHRoaXMuaGVhZCA9IG51bGw7ICAgICAgICAgICAvKiB3aGVyZSB0byBzYXZlIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uICovXG5cbiAgLyogc2xpZGluZyB3aW5kb3cgKi9cbiAgdGhpcy53Yml0cyA9IDA7ICAgICAgICAgICAgIC8qIGxvZyBiYXNlIDIgb2YgcmVxdWVzdGVkIHdpbmRvdyBzaXplICovXG4gIHRoaXMud3NpemUgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdGhpcy53aGF2ZSA9IDA7ICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdGhpcy53bmV4dCA9IDA7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICB0aGlzLndpbmRvdyA9IG51bGw7ICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi9cblxuICAvKiBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5ob2xkID0gMDsgICAgICAgICAgICAgIC8qIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqL1xuICB0aGlzLmJpdHMgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gXCJpblwiICovXG5cbiAgLyogZm9yIHN0cmluZyBhbmQgc3RvcmVkIGJsb2NrIGNvcHlpbmcgKi9cbiAgdGhpcy5sZW5ndGggPSAwOyAgICAgICAgICAgIC8qIGxpdGVyYWwgb3IgbGVuZ3RoIG9mIGRhdGEgdG8gY29weSAqL1xuICB0aGlzLm9mZnNldCA9IDA7ICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayB0byBjb3B5IHN0cmluZyBmcm9tICovXG5cbiAgLyogZm9yIHRhYmxlIGFuZCBjb2RlIGRlY29kaW5nICovXG4gIHRoaXMuZXh0cmEgPSAwOyAgICAgICAgICAgICAvKiBleHRyYSBiaXRzIG5lZWRlZCAqL1xuXG4gIC8qIGZpeGVkIGFuZCBkeW5hbWljIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuY29kZSA9IG51bGw7ICAgICAgICAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBsZW5ndGgvbGl0ZXJhbCBjb2RlcyAqL1xuICB0aGlzLmRpc3Rjb2RlID0gbnVsbDsgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKi9cbiAgdGhpcy5sZW5iaXRzID0gMDsgICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGxlbmNvZGUgKi9cbiAgdGhpcy5kaXN0Yml0cyA9IDA7ICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGRpc3Rjb2RlICovXG5cbiAgLyogZHluYW1pYyB0YWJsZSBidWlsZGluZyAqL1xuICB0aGlzLm5jb2RlID0gMDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqL1xuICB0aGlzLm5sZW4gPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5uZGlzdCA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5oYXZlID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aHMgaW4gbGVuc1tdICovXG4gIHRoaXMubmV4dCA9IG51bGw7ICAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiBjb2Rlc1tdICovXG5cbiAgdGhpcy5sZW5zID0gbmV3IHV0aWxzLkJ1ZjE2KDMyMCk7IC8qIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy53b3JrID0gbmV3IHV0aWxzLkJ1ZjE2KDI4OCk7IC8qIHdvcmsgYXJlYSBmb3IgY29kZSB0YWJsZSBidWlsZGluZyAqL1xuXG4gIC8qXG4gICBiZWNhdXNlIHdlIGRvbid0IGhhdmUgcG9pbnRlcnMgaW4ganMsIHdlIHVzZSBsZW5jb2RlIGFuZCBkaXN0Y29kZSBkaXJlY3RseVxuICAgYXMgYnVmZmVycyBzbyB3ZSBkb24ndCBuZWVkIGNvZGVzXG4gICovXG4gIC8vdGhpcy5jb2RlcyA9IG5ldyB1dGlscy5CdWYzMihFTk9VR0gpOyAgICAgICAvKiBzcGFjZSBmb3IgY29kZSB0YWJsZXMgKi9cbiAgdGhpcy5sZW5keW4gPSBudWxsOyAgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLmRpc3RkeW4gPSBudWxsOyAgICAgICAgICAgICAvKiBkeW5hbWljIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAoSlMgc3BlY2lmaWMpICovXG4gIHRoaXMuc2FuZSA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGlmIGZhbHNlLCBhbGxvdyBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgKi9cbiAgdGhpcy5iYWNrID0gMDsgICAgICAgICAgICAgICAgICAgLyogYml0cyBiYWNrIG9mIGxhc3QgdW5wcm9jZXNzZWQgbGVuZ3RoL2xpdCAqL1xuICB0aGlzLndhcyA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsIGxlbmd0aCBvZiBtYXRjaCAqL1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSBzdGF0ZS50b3RhbCA9IDA7XG4gIHN0cm0ubXNnID0gJyc7IC8qWl9OVUxMKi9cbiAgaWYgKHN0YXRlLndyYXApIHsgICAgICAgLyogdG8gc3VwcG9ydCBpbGwtY29uY2VpdmVkIEphdmEgdGVzdCBzdWl0ZSAqL1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS53cmFwICYgMTtcbiAgfVxuICBzdGF0ZS5tb2RlID0gSEVBRDtcbiAgc3RhdGUubGFzdCA9IDA7XG4gIHN0YXRlLmhhdmVkaWN0ID0gMDtcbiAgc3RhdGUuZG1heCA9IDMyNzY4O1xuICBzdGF0ZS5oZWFkID0gbnVsbC8qWl9OVUxMKi87XG4gIHN0YXRlLmhvbGQgPSAwO1xuICBzdGF0ZS5iaXRzID0gMDtcbiAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5sZW5keW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0xFTlMpO1xuICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0RJU1RTKTtcblxuICBzdGF0ZS5zYW5lID0gMTtcbiAgc3RhdGUuYmFjayA9IC0xO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IHJlc2V0XFxuXCIpKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RhdGUud3NpemUgPSAwO1xuICBzdGF0ZS53aGF2ZSA9IDA7XG4gIHN0YXRlLnduZXh0ID0gMDtcbiAgcmV0dXJuIGluZmxhdGVSZXNldEtlZXAoc3RybSk7XG5cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKSB7XG4gIHZhciB3cmFwO1xuICB2YXIgc3RhdGU7XG5cbiAgLyogZ2V0IHRoZSBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBleHRyYWN0IHdyYXAgcmVxdWVzdCBmcm9tIHdpbmRvd0JpdHMgcGFyYW1ldGVyICovXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkge1xuICAgIHdyYXAgPSAwO1xuICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0cztcbiAgfVxuICBlbHNlIHtcbiAgICB3cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxO1xuICAgIGlmICh3aW5kb3dCaXRzIDwgNDgpIHtcbiAgICAgIHdpbmRvd0JpdHMgJj0gMTU7XG4gICAgfVxuICB9XG5cbiAgLyogc2V0IG51bWJlciBvZiB3aW5kb3cgYml0cywgZnJlZSB3aW5kb3cgaWYgZGlmZmVyZW50ICovXG4gIGlmICh3aW5kb3dCaXRzICYmICh3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIGlmIChzdGF0ZS53aW5kb3cgIT09IG51bGwgJiYgc3RhdGUud2JpdHMgIT09IHdpbmRvd0JpdHMpIHtcbiAgICBzdGF0ZS53aW5kb3cgPSBudWxsO1xuICB9XG5cbiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXNldCB0aGUgcmVzdCBvZiBpdCAqL1xuICBzdGF0ZS53cmFwID0gd3JhcDtcbiAgc3RhdGUud2JpdHMgPSB3aW5kb3dCaXRzO1xuICByZXR1cm4gaW5mbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgcmV0O1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICAvL3N0cm0ubXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi9cblxuICBzdGF0ZSA9IG5ldyBJbmZsYXRlU3RhdGUoKTtcblxuICAvL2lmIChzdGF0ZSA9PT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogYWxsb2NhdGVkXFxuXCIpKTtcbiAgc3RybS5zdGF0ZSA9IHN0YXRlO1xuICBzdGF0ZS53aW5kb3cgPSBudWxsLypaX05VTEwqLztcbiAgcmV0ID0gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKTtcbiAgaWYgKHJldCAhPT0gWl9PSykge1xuICAgIHN0cm0uc3RhdGUgPSBudWxsLypaX05VTEwqLztcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdChzdHJtKSB7XG4gIHJldHVybiBpbmZsYXRlSW5pdDIoc3RybSwgREVGX1dCSVRTKTtcbn1cblxuXG4vKlxuIFJldHVybiBzdGF0ZSB3aXRoIGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGFuZCBpbmRleCBzaXplcyBzZXQgdG9cbiBmaXhlZCBjb2RlIGRlY29kaW5nLiAgTm9ybWFsbHkgdGhpcyByZXR1cm5zIGZpeGVkIHRhYmxlcyBmcm9tIGluZmZpeGVkLmguXG4gSWYgQlVJTERGSVhFRCBpcyBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhpcyByb3V0aW5lIGJ1aWxkcyB0aGUgdGFibGVzIHRoZVxuIGZpcnN0IHRpbWUgaXQncyBjYWxsZWQsIGFuZCByZXR1cm5zIHRob3NlIHRhYmxlcyB0aGUgZmlyc3QgdGltZSBhbmRcbiB0aGVyZWFmdGVyLiAgVGhpcyByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBjb2RlIGJ5IGFib3V0IDJLIGJ5dGVzLCBpblxuIGV4Y2hhbmdlIGZvciBhIGxpdHRsZSBleGVjdXRpb24gdGltZS4gIEhvd2V2ZXIsIEJVSUxERklYRUQgc2hvdWxkIG5vdCBiZVxuIHVzZWQgZm9yIHRocmVhZGVkIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIHJld3JpdGluZyBvZiB0aGUgdGFibGVzIGFuZCB2aXJnaW5cbiBtYXkgbm90IGJlIHRocmVhZC1zYWZlLlxuICovXG52YXIgdmlyZ2luID0gdHJ1ZTtcblxudmFyIGxlbmZpeCwgZGlzdGZpeDsgLy8gV2UgaGF2ZSBubyBwb2ludGVycyBpbiBKUywgc28ga2VlcCB0YWJsZXMgc2VwYXJhdGVcblxuZnVuY3Rpb24gZml4ZWR0YWJsZXMoc3RhdGUpIHtcbiAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi9cbiAgaWYgKHZpcmdpbikge1xuICAgIHZhciBzeW07XG5cbiAgICBsZW5maXggPSBuZXcgdXRpbHMuQnVmMzIoNTEyKTtcbiAgICBkaXN0Zml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDMyKTtcblxuICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMTQ0KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuICAgIHdoaWxlIChzeW0gPCAyNTYpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA5OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4MCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDc7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjg4KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuXG4gICAgaW5mbGF0ZV90YWJsZShMRU5TLCAgc3RhdGUubGVucywgMCwgMjg4LCBsZW5maXgsICAgMCwgc3RhdGUud29yaywgeyBiaXRzOiA5IH0pO1xuXG4gICAgLyogZGlzdGFuY2UgdGFibGUgKi9cbiAgICBzeW0gPSAwO1xuICAgIHdoaWxlIChzeW0gPCAzMikgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDU7IH1cblxuICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLmxlbnMsIDAsIDMyLCAgIGRpc3RmaXgsIDAsIHN0YXRlLndvcmssIHsgYml0czogNSB9KTtcblxuICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovXG4gICAgdmlyZ2luID0gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5sZW5jb2RlID0gbGVuZml4O1xuICBzdGF0ZS5sZW5iaXRzID0gOTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBkaXN0Zml4O1xuICBzdGF0ZS5kaXN0Yml0cyA9IDU7XG59XG5cblxuLypcbiBVcGRhdGUgdGhlIHdpbmRvdyB3aXRoIHRoZSBsYXN0IHdzaXplIChub3JtYWxseSAzMkspIGJ5dGVzIHdyaXR0ZW4gYmVmb3JlXG4gcmV0dXJuaW5nLiAgSWYgd2luZG93IGRvZXMgbm90IGV4aXN0IHlldCwgY3JlYXRlIGl0LiAgVGhpcyBpcyBvbmx5IGNhbGxlZFxuIHdoZW4gYSB3aW5kb3cgaXMgYWxyZWFkeSBpbiB1c2UsIG9yIHdoZW4gb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gZHVyaW5nIHRoaXNcbiBpbmZsYXRlIGNhbGwsIGJ1dCB0aGUgZW5kIG9mIHRoZSBkZWZsYXRlIHN0cmVhbSBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXQuXG4gSXQgaXMgYWxzbyBjYWxsZWQgdG8gY3JlYXRlIGEgd2luZG93IGZvciBkaWN0aW9uYXJ5IGRhdGEgd2hlbiBhIGRpY3Rpb25hcnlcbiBpcyBsb2FkZWQuXG5cbiBQcm92aWRpbmcgb3V0cHV0IGJ1ZmZlcnMgbGFyZ2VyIHRoYW4gMzJLIHRvIGluZmxhdGUoKSBzaG91bGQgcHJvdmlkZSBhIHNwZWVkXG4gYWR2YW50YWdlLCBzaW5jZSBvbmx5IHRoZSBsYXN0IDMySyBvZiBvdXRwdXQgaXMgY29waWVkIHRvIHRoZSBzbGlkaW5nIHdpbmRvd1xuIHVwb24gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLCBhbmQgc2luY2UgYWxsIGRpc3RhbmNlcyBhZnRlciB0aGUgZmlyc3QgMzJLIG9mXG4gb3V0cHV0IHdpbGwgZmFsbCBpbiB0aGUgb3V0cHV0IGRhdGEsIG1ha2luZyBtYXRjaCBjb3BpZXMgc2ltcGxlciBhbmQgZmFzdGVyLlxuIFRoZSBhZHZhbnRhZ2UgbWF5IGJlIGRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yJ3MgZGF0YSBjYWNoZXMuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZXdpbmRvdyhzdHJtLCBzcmMsIGVuZCwgY29weSkge1xuICB2YXIgZGlzdDtcbiAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBpZiBpdCBoYXNuJ3QgYmVlbiBkb25lIGFscmVhZHksIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgd2luZG93ICovXG4gIGlmIChzdGF0ZS53aW5kb3cgPT09IG51bGwpIHtcbiAgICBzdGF0ZS53c2l6ZSA9IDEgPDwgc3RhdGUud2JpdHM7XG4gICAgc3RhdGUud25leHQgPSAwO1xuICAgIHN0YXRlLndoYXZlID0gMDtcblxuICAgIHN0YXRlLndpbmRvdyA9IG5ldyB1dGlscy5CdWY4KHN0YXRlLndzaXplKTtcbiAgfVxuXG4gIC8qIGNvcHkgc3RhdGUtPndzaXplIG9yIGxlc3Mgb3V0cHV0IGJ5dGVzIGludG8gdGhlIGNpcmN1bGFyIHdpbmRvdyAqL1xuICBpZiAoY29weSA+PSBzdGF0ZS53c2l6ZSkge1xuICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBzdGF0ZS53c2l6ZSwgc3RhdGUud3NpemUsIDApO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IHN0YXRlLndzaXplO1xuICB9XG4gIGVsc2Uge1xuICAgIGRpc3QgPSBzdGF0ZS53c2l6ZSAtIHN0YXRlLnduZXh0O1xuICAgIGlmIChkaXN0ID4gY29weSkge1xuICAgICAgZGlzdCA9IGNvcHk7XG4gICAgfVxuICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93ICsgc3RhdGUtPnduZXh0LCBlbmQgLSBjb3B5LCBkaXN0KTtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gY29weSwgZGlzdCwgc3RhdGUud25leHQpO1xuICAgIGNvcHkgLT0gZGlzdDtcbiAgICBpZiAoY29weSkge1xuICAgICAgLy96bWVtY3B5KHN0YXRlLT53aW5kb3csIGVuZCAtIGNvcHksIGNvcHkpO1xuICAgICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGNvcHksIDApO1xuICAgICAgc3RhdGUud25leHQgPSBjb3B5O1xuICAgICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzdGF0ZS53bmV4dCArPSBkaXN0O1xuICAgICAgaWYgKHN0YXRlLnduZXh0ID09PSBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53bmV4dCA9IDA7IH1cbiAgICAgIGlmIChzdGF0ZS53aGF2ZSA8IHN0YXRlLndzaXplKSB7IHN0YXRlLndoYXZlICs9IGRpc3Q7IH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIHN0YXRlO1xuICB2YXIgaW5wdXQsIG91dHB1dDsgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGJ1ZmZlcnNcbiAgdmFyIG5leHQ7ICAgICAgICAgICAgICAgICAgIC8qIG5leHQgaW5wdXQgSU5ERVggKi9cbiAgdmFyIHB1dDsgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgb3V0cHV0IElOREVYICovXG4gIHZhciBoYXZlLCBsZWZ0OyAgICAgICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgaG9sZDsgICAgICAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovXG4gIHZhciBfaW4sIF9vdXQ7ICAgICAgICAgICAgICAvKiBzYXZlIHN0YXJ0aW5nIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovXG4gIHZhciBjb3B5OyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGZyb207ICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggYnl0ZXMgZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG4gIHZhciBoZXJlID0gMDsgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovXG4gIHZhciBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsOyAvLyBwYWtlZCBcImhlcmVcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICAvL3ZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBwYXJlbnQgdGFibGUgZW50cnkgKi9cbiAgdmFyIGxhc3RfYml0cywgbGFzdF9vcCwgbGFzdF92YWw7IC8vIHBha2VkIFwibGFzdFwiIGRlbm9ybWFsaXplZCAoSlMgc3BlY2lmaWMpXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovXG4gIHZhciByZXQ7ICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gY29kZSAqL1xuICB2YXIgaGJ1ZiA9IG5ldyB1dGlscy5CdWY4KDQpOyAgICAvKiBidWZmZXIgZm9yIGd6aXAgaGVhZGVyIGNyYyBjYWxjdWxhdGlvbiAqL1xuICB2YXIgb3B0cztcblxuICB2YXIgbjsgLy8gdGVtcG9yYXJ5IHZhciBmb3IgTkVFRF9CSVRTXG5cbiAgdmFyIG9yZGVyID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovXG4gICAgWyAxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1IF07XG5cblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgfHwgIXN0cm0ub3V0cHV0IHx8XG4gICAgICAoIXN0cm0uaW5wdXQgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7IHN0YXRlLm1vZGUgPSBUWVBFRE87IH0gICAgLyogc2tpcCBjaGVjayAqL1xuXG5cbiAgLy8tLS0gTE9BRCgpIC0tLVxuICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIC8vLS0tXG5cbiAgX2luID0gaGF2ZTtcbiAgX291dCA9IGxlZnQ7XG4gIHJldCA9IFpfT0s7XG5cbiAgaW5mX2xlYXZlOiAvLyBnb3RvIGVtdWxhdGlvblxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChzdGF0ZS5tb2RlKSB7XG4gICAgY2FzZSBIRUFEOlxuICAgICAgaWYgKHN0YXRlLndyYXAgPT09IDApIHtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEVETztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLz09PSBORUVEQklUUygxNik7XG4gICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoKHN0YXRlLndyYXAgJiAyKSAmJiBob2xkID09PSAweDhiMWYpIHsgIC8qIGd6aXAgaGVhZGVyICovXG4gICAgICAgIHN0YXRlLmNoZWNrID0gMC8qY3JjMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAvLz09PS8vXG5cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBGTEFHUztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5mbGFncyA9IDA7ICAgICAgICAgICAvKiBleHBlY3QgemxpYiBoZWFkZXIgKi9cbiAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCEoc3RhdGUud3JhcCAmIDEpIHx8ICAgLyogY2hlY2sgaWYgemxpYiBoZWFkZXIgYWxsb3dlZCAqL1xuICAgICAgICAoKChob2xkICYgMHhmZikvKkJJVFMoOCkqLyA8PCA4KSArIChob2xkID4+IDgpKSAlIDMxKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBoZWFkZXIgY2hlY2snO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmICgoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gIT09IFpfREVGTEFURUQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNDtcbiAgICAgIGJpdHMgLT0gNDtcbiAgICAgIC8vLS0tLy9cbiAgICAgIGxlbiA9IChob2xkICYgMHgwZikvKkJJVFMoNCkqLyArIDg7XG4gICAgICBpZiAoc3RhdGUud2JpdHMgPT09IDApIHtcbiAgICAgICAgc3RhdGUud2JpdHMgPSBsZW47XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChsZW4gPiBzdGF0ZS53Yml0cykge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHdpbmRvdyBzaXplJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5kbWF4ID0gMSA8PCBsZW47XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgemxpYiBoZWFkZXIgb2tcXG5cIikpO1xuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgc3RhdGUubW9kZSA9IGhvbGQgJiAweDIwMCA/IERJQ1RJRCA6IFRZUEU7XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRkxBR1M6XG4gICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5mbGFncyA9IGhvbGQ7XG4gICAgICBpZiAoKHN0YXRlLmZsYWdzICYgMHhmZikgIT09IFpfREVGTEFURUQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4ZTAwMCkge1xuICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGhlYWRlciBmbGFncyBzZXQnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgIHN0YXRlLmhlYWQudGV4dCA9ICgoaG9sZCA+PiA4KSAmIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5tb2RlID0gVElNRTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIFRJTUU6XG4gICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLnRpbWUgPSBob2xkO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgIC8vPT09IENSQzQoc3RhdGUuY2hlY2ssIGhvbGQpXG4gICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgIGhidWZbMl0gPSAoaG9sZCA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgaGJ1ZlszXSA9IChob2xkID4+PiAyNCkgJiAweGZmO1xuICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCA0LCAwKTtcbiAgICAgICAgLy89PT1cbiAgICAgIH1cbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IE9TO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgT1M6XG4gICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLnhmbGFncyA9IChob2xkICYgMHhmZik7XG4gICAgICAgIHN0YXRlLmhlYWQub3MgPSAoaG9sZCA+PiA4KTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgIH1cbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IEVYTEVOO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRVhMRU46XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA0MDApIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IGhvbGQ7XG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9sZW4gPSBob2xkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBudWxsLypaX05VTEwqLztcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBFWFRSQTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIEVYVFJBOlxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgeyBjb3B5ID0gaGF2ZTsgfVxuICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgICBsZW4gPSBzdGF0ZS5oZWFkLmV4dHJhX2xlbiAtIHN0YXRlLmxlbmd0aDtcbiAgICAgICAgICAgIGlmICghc3RhdGUuaGVhZC5leHRyYSkge1xuICAgICAgICAgICAgICAvLyBVc2UgdW50eXBlZCBhcnJheSBmb3IgbW9yZSBjb252ZW5pZW5kIHByb2Nlc3NpbmcgbGF0ZXJcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSA9IG5ldyBBcnJheShzdGF0ZS5oZWFkLmV4dHJhX2xlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1dGlscy5hcnJheVNldChcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSxcbiAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICAgIC8vIGV4dHJhIGZpZWxkIGlzIGxpbWl0ZWQgdG8gNjU1MzYgYnl0ZXNcbiAgICAgICAgICAgICAgLy8gLSBubyBuZWVkIGZvciBhZGRpdGlvbmFsIHNpemUgY2hlY2tcbiAgICAgICAgICAgICAgY29weSxcbiAgICAgICAgICAgICAgLypsZW4gKyBjb3B5ID4gc3RhdGUuaGVhZC5leHRyYV9tYXggLSBsZW4gPyBzdGF0ZS5oZWFkLmV4dHJhX21heCA6IGNvcHksKi9cbiAgICAgICAgICAgICAgbGVuXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy96bWVtY3B5KHN0YXRlLmhlYWQuZXh0cmEgKyBsZW4sIG5leHQsXG4gICAgICAgICAgICAvLyAgICAgICAgbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4ID9cbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhX21heCAtIGxlbiA6IGNvcHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUubGVuZ3RoKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgfVxuICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBOQU1FO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTkFNRTpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDgwMCkge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgY29weSA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAvLyBUT0RPOiAyIG9yIDEgYnl0ZXM/XG4gICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5uYW1lX21heCovKSkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5uYW1lICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG5cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLm5hbWUgPSBudWxsO1xuICAgICAgfVxuICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBDT01NRU5UO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgQ09NTUVOVDpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MTAwMCkge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgY29weSA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBsZW4gPSBpbnB1dFtuZXh0ICsgY29weSsrXTtcbiAgICAgICAgICAvKiB1c2UgY29uc3RhbnQgbGltaXQgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeSAqL1xuICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbiAmJlxuICAgICAgICAgICAgICAoc3RhdGUubGVuZ3RoIDwgNjU1MzYgLypzdGF0ZS5oZWFkLmNvbW1fbWF4Ki8pKSB7XG4gICAgICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTtcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgPSBudWxsO1xuICAgICAgfVxuICAgICAgc3RhdGUubW9kZSA9IEhDUkM7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBIQ1JDOlxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlLmNoZWNrICYgMHhmZmZmKSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2hlYWRlciBjcmMgbWlzbWF0Y2gnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmhjcmMgPSAoKHN0YXRlLmZsYWdzID4+IDkpICYgMSk7XG4gICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAwO1xuICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIERJQ1RJRDpcbiAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGhhdmUtLTtcbiAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgIGJpdHMgKz0gODtcbiAgICAgIH1cbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IHpzd2FwMzIoaG9sZCk7XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBESUNUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRElDVDpcbiAgICAgIGlmIChzdGF0ZS5oYXZlZGljdCA9PT0gMCkge1xuICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgLy8tLS1cbiAgICAgICAgcmV0dXJuIFpfTkVFRF9ESUNUO1xuICAgICAgfVxuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBUWVBFOlxuICAgICAgaWYgKGZsdXNoID09PSBaX0JMT0NLIHx8IGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgVFlQRURPOlxuICAgICAgaWYgKHN0YXRlLmxhc3QpIHtcbiAgICAgICAgLy8tLS0gQllURUJJVFMoKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gYml0cyAmIDc7XG4gICAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUubW9kZSA9IENIRUNLO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vPT09IE5FRURCSVRTKDMpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5sYXN0ID0gKGhvbGQgJiAweDAxKS8qQklUUygxKSovO1xuICAgICAgLy8tLS0gRFJPUEJJVFMoMSkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSAxO1xuICAgICAgYml0cyAtPSAxO1xuICAgICAgLy8tLS0vL1xuXG4gICAgICBzd2l0Y2ggKChob2xkICYgMHgwMykvKkJJVFMoMikqLykge1xuICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBTVE9SRUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi9cbiAgICAgICAgZml4ZWR0YWJsZXMoc3RhdGUpO1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBmaXhlZCBjb2RlcyBibG9jayVzXFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fOyAgICAgICAgICAgICAvKiBkZWNvZGUgY29kZXMgKi9cbiAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICBiaXRzIC09IDI7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZHluYW1pYyBjb2RlcyBibG9jayVzXFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUQUJMRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYmxvY2sgdHlwZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICBiaXRzIC09IDI7XG4gICAgICAvLy0tLS8vXG4gICAgICBicmVhaztcbiAgICBjYXNlIFNUT1JFRDpcbiAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy8gLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqL1xuICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgYml0cyAtPSBiaXRzICYgNztcbiAgICAgIC8vLS0tLy9cbiAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGhhdmUtLTtcbiAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgIGJpdHMgKz0gODtcbiAgICAgIH1cbiAgICAgIC8vPT09Ly9cbiAgICAgIGlmICgoaG9sZCAmIDB4ZmZmZikgIT09ICgoaG9sZCA+Pj4gMTYpIF4gMHhmZmZmKSkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5sZW5ndGggPSBob2xkICYgMHhmZmZmO1xuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBzdG9yZWQgbGVuZ3RoICV1XFxuXCIsXG4gICAgICAvLyAgICAgICAgc3RhdGUubGVuZ3RoKSk7XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBDT1BZXztcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPUFlfOlxuICAgICAgc3RhdGUubW9kZSA9IENPUFk7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBDT1BZOlxuICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIGlmIChjb3B5KSB7XG4gICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgeyBjb3B5ID0gaGF2ZTsgfVxuICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbiAgICAgICAgaWYgKGNvcHkgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8vLS0tIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsgLS0tXG4gICAgICAgIHV0aWxzLmFycmF5U2V0KG91dHB1dCwgaW5wdXQsIG5leHQsIGNvcHksIHB1dCk7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgICAgcHV0ICs9IGNvcHk7XG4gICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgc3RvcmVkIGVuZFxcblwiKSk7XG4gICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgVEFCTEU6XG4gICAgICAvLz09PSBORUVEQklUUygxNCk7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDE0KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5ubGVuID0gKGhvbGQgJiAweDFmKS8qQklUUyg1KSovICsgMjU3O1xuICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgYml0cyAtPSA1O1xuICAgICAgLy8tLS0vL1xuICAgICAgc3RhdGUubmRpc3QgPSAoaG9sZCAmIDB4MWYpLypCSVRTKDUpKi8gKyAxO1xuICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgYml0cyAtPSA1O1xuICAgICAgLy8tLS0vL1xuICAgICAgc3RhdGUubmNvZGUgPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA0O1xuICAgICAgLy8tLS0gRFJPUEJJVFMoNCkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSA0O1xuICAgICAgYml0cyAtPSA0O1xuICAgICAgLy8tLS0vL1xuLy8jaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5EXG4gICAgICBpZiAoc3RhdGUubmxlbiA+IDI4NiB8fCBzdGF0ZS5uZGlzdCA+IDMwKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3RvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4vLyNlbmRpZlxuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xcblwiKSk7XG4gICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBMRU5MRU5TO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVOTEVOUzpcbiAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmNvZGUpIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMyk7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgMykge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5sZW5zW29yZGVyW3N0YXRlLmhhdmUrK11dID0gKGhvbGQgJiAweDA3KTsvL0JJVFMoMyk7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSAzO1xuICAgICAgICBiaXRzIC09IDM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgIH1cbiAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgMTkpIHtcbiAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IDA7XG4gICAgICB9XG4gICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgLy9zdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gICAgICAvL3N0YXRlLmxlbmNvZGUgPSBzdGF0ZS5uZXh0O1xuICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluO1xuICAgICAgc3RhdGUubGVuYml0cyA9IDc7XG5cbiAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTtcbiAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoQ09ERVMsIHN0YXRlLmxlbnMsIDAsIDE5LCBzdGF0ZS5sZW5jb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgIHN0YXRlLmxlbmJpdHMgPSBvcHRzLmJpdHM7XG5cbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIGNvZGUgbGVuZ3RocyBva1xcblwiKSk7XG4gICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBDT0RFTEVOUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPREVMRU5TOlxuICAgICAgd2hpbGUgKHN0YXRlLmhhdmUgPCBzdGF0ZS5ubGVuICsgc3RhdGUubmRpc3QpIHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUubGVuYml0cykgLSAxKV07LypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlcmVfdmFsIDwgMTYpIHtcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gaGVyZV92YWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKGhlcmVfdmFsID09PSAxNikge1xuICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgMik7XG4gICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMjtcbiAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgPT09IDApIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGVuID0gc3RhdGUubGVuc1tzdGF0ZS5oYXZlIC0gMV07XG4gICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwMyk7Ly9CSVRTKDIpO1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChoZXJlX3ZhbCA9PT0gMTcpIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDMpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDM7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSAzO1xuICAgICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDcpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDc7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICBjb3B5ID0gMTEgKyAoaG9sZCAmIDB4N2YpOy8vQklUUyg3KTtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDcpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gNztcbiAgICAgICAgICAgIGJpdHMgLT0gNztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmhhdmUgKyBjb3B5ID4gc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0JztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgd2hpbGUgKGNvcHktLSkge1xuICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gbGVuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovXG4gICAgICBpZiAoc3RhdGUubW9kZSA9PT0gQkFEKSB7IGJyZWFrOyB9XG5cbiAgICAgIC8qIGNoZWNrIGZvciBlbmQtb2YtYmxvY2sgY29kZSAoYmV0dGVyIGhhdmUgb25lKSAqL1xuICAgICAgaWYgKHN0YXRlLmxlbnNbMjU2XSA9PT0gMCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2snO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0c1xuICAgICAgICAgdmFsdWVzIGhlcmUgKDkgYW5kIDYpIHdpdGhvdXQgcmVhZGluZyB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaFxuICAgICAgICAgY29uY2VybmluZyB0aGUgRU5PVUdIIGNvbnN0YW50cywgd2hpY2ggZGVwZW5kIG9uIHRob3NlIHZhbHVlcyAqL1xuICAgICAgc3RhdGUubGVuYml0cyA9IDk7XG5cbiAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTtcbiAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUubGVucywgMCwgc3RhdGUubmxlbiwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgLy8gc3RhdGUubmV4dF9pbmRleCA9IG9wdHMudGFibGVfaW5kZXg7XG4gICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuICAgICAgLy8gc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHN0YXRlLmRpc3RiaXRzID0gNjtcbiAgICAgIC8vc3RhdGUuZGlzdGNvZGUuY29weShzdGF0ZS5jb2Rlcyk7XG4gICAgICAvLyBTd2l0Y2ggdG8gdXNlIGR5bmFtaWMgdGFibGVcbiAgICAgIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUuZGlzdGR5bjtcbiAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmRpc3RiaXRzIH07XG4gICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCBzdGF0ZS5ubGVuLCBzdGF0ZS5uZGlzdCwgc3RhdGUuZGlzdGNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgc3RhdGUuZGlzdGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAvLyBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZXMgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCAnaW5mbGF0ZTogICAgICAgY29kZXMgb2tcXG4nKSk7XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOXztcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTl86XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVOOlxuICAgICAgaWYgKGhhdmUgPj0gNiAmJiBsZWZ0ID49IDI1OCkge1xuICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgLy8tLS1cbiAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIF9vdXQpO1xuICAgICAgICAvLy0tLSBMT0FEKCkgLS0tXG4gICAgICAgIHB1dCA9IHN0cm0ubmV4dF9vdXQ7XG4gICAgICAgIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICAgICAgICBsZWZ0ID0gc3RybS5hdmFpbF9vdXQ7XG4gICAgICAgIG5leHQgPSBzdHJtLm5leHRfaW47XG4gICAgICAgIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgICAgICAgaGF2ZSA9IHN0cm0uYXZhaWxfaW47XG4gICAgICAgIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICAgICAgICBiaXRzID0gc3RhdGUuYml0cztcbiAgICAgICAgLy8tLS1cblxuICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkge1xuICAgICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLmJhY2sgPSAwO1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOyAgLypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgIGlmIChoZXJlX2JpdHMgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgIH1cbiAgICAgIGlmIChoZXJlX29wICYmIChoZXJlX29wICYgMHhmMCkgPT09IDApIHtcbiAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzO1xuICAgICAgICBsYXN0X29wID0gaGVyZV9vcDtcbiAgICAgICAgbGFzdF92YWwgPSBoZXJlX3ZhbDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAvLy0tLS8vXG4gICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgIHN0YXRlLmxlbmd0aCA9IGhlcmVfdmFsO1xuICAgICAgaWYgKGhlcmVfb3AgPT09IDApIHtcbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExJVDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmIDMyKSB7XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXFxuXCIpKTtcbiAgICAgICAgc3RhdGUuYmFjayA9IC0xO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmIDY0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZXh0cmEgPSBoZXJlX29wICYgMTU7XG4gICAgICBzdGF0ZS5tb2RlID0gTEVORVhUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVORVhUOlxuICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKHN0YXRlLmV4dHJhKTtcbiAgICAgICAgbiA9IHN0YXRlLmV4dHJhO1xuICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubGVuZ3RoICs9IGhvbGQgJiAoKDEgPDwgc3RhdGUuZXh0cmEpIC0gMSkvKkJJVFMoc3RhdGUuZXh0cmEpKi87XG4gICAgICAgIC8vLS0tIERST1BCSVRTKHN0YXRlLmV4dHJhKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7XG4gICAgICAgIGJpdHMgLT0gc3RhdGUuZXh0cmE7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBzdGF0ZS5leHRyYTtcbiAgICAgIH1cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XFxuXCIsIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgc3RhdGUud2FzID0gc3RhdGUubGVuZ3RoO1xuICAgICAgc3RhdGUubW9kZSA9IERJU1Q7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBESVNUOlxuICAgICAgZm9yICg7Oykge1xuICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxKV07LypCSVRTKHN0YXRlLmRpc3RiaXRzKSovXG4gICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICBpZiAoKGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgIH1cbiAgICAgIGlmICgoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbbGFzdF92YWwgK1xuICAgICAgICAgICAgICAgICAgKChob2xkICYgKCgxIDw8IChsYXN0X2JpdHMgKyBsYXN0X29wKSkgLSAxKSkvKkJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkqLyA+PiBsYXN0X2JpdHMpXTtcbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKChsYXN0X2JpdHMgKyBoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMobGFzdC5iaXRzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzO1xuICAgICAgICBiaXRzIC09IGxhc3RfYml0cztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IGxhc3RfYml0cztcbiAgICAgIH1cbiAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgIC8vLS0tLy9cbiAgICAgIHN0YXRlLmJhY2sgKz0gaGVyZV9iaXRzO1xuICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLm9mZnNldCA9IGhlcmVfdmFsO1xuICAgICAgc3RhdGUuZXh0cmEgPSAoaGVyZV9vcCkgJiAxNTtcbiAgICAgIHN0YXRlLm1vZGUgPSBESVNURVhUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRElTVEVYVDpcbiAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm9mZnNldCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICB9XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgaWYgKHN0YXRlLm9mZnNldCA+IHN0YXRlLmRtYXgpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIHN0YXRlLm9mZnNldCkpO1xuICAgICAgc3RhdGUubW9kZSA9IE1BVENIO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTUFUQ0g6XG4gICAgICBpZiAobGVmdCA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIGNvcHkgPSBfb3V0IC0gbGVmdDtcbiAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBjb3B5KSB7ICAgICAgICAgLyogY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICBjb3B5ID0gc3RhdGUub2Zmc2V0IC0gY29weTtcbiAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53aGF2ZSkge1xuICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcbi8vI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUlxuLy8gICAgICAgICAgVHJhY2UoKHN0ZGVyciwgXCJpbmZsYXRlLmMgdG9vIGZhclxcblwiKSk7XG4vLyAgICAgICAgICBjb3B5IC09IHN0YXRlLndoYXZlO1xuLy8gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS5sZW5ndGgpIHsgY29weSA9IHN0YXRlLmxlbmd0aDsgfVxuLy8gICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4vLyAgICAgICAgICBsZWZ0IC09IGNvcHk7XG4vLyAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbi8vICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgb3V0cHV0W3B1dCsrXSA9IDA7XG4vLyAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpO1xuLy8gICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4vLyAgICAgICAgICBicmVhaztcbi8vI2VuZGlmXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53bmV4dCkge1xuICAgICAgICAgIGNvcHkgLT0gc3RhdGUud25leHQ7XG4gICAgICAgICAgZnJvbSA9IHN0YXRlLndzaXplIC0gY29weTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBmcm9tID0gc3RhdGUud25leHQgLSBjb3B5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbiAgICAgICAgZnJvbV9zb3VyY2UgPSBzdGF0ZS53aW5kb3c7XG4gICAgICB9XG4gICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGZyb20gb3V0cHV0ICovXG4gICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICBmcm9tID0gcHV0IC0gc3RhdGUub2Zmc2V0O1xuICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgIGRvIHtcbiAgICAgICAgb3V0cHV0W3B1dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICB9IHdoaWxlICgtLWNvcHkpO1xuICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIExJVDpcbiAgICAgIGlmIChsZWZ0ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgb3V0cHV0W3B1dCsrXSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIGxlZnQtLTtcbiAgICAgIHN0YXRlLm1vZGUgPSBMRU47XG4gICAgICBicmVhaztcbiAgICBjYXNlIENIRUNLOlxuICAgICAgaWYgKHN0YXRlLndyYXApIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIC8vIFVzZSAnfCcgaW5zZGVhZCBvZiAnKycgdG8gbWFrZSBzdXJlIHRoYXQgcmVzdWx0IGlzIHNpZ25lZFxuICAgICAgICAgIGhvbGQgfD0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIF9vdXQgLT0gbGVmdDtcbiAgICAgICAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgICAgICAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgICAgICAgaWYgKF9vdXQpIHtcbiAgICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPVxuICAgICAgICAgICAgICAvKlVQREFURShzdGF0ZS5jaGVjaywgcHV0IC0gX291dCwgX291dCk7Ki9cbiAgICAgICAgICAgICAgKHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgcHV0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpKTtcblxuICAgICAgICB9XG4gICAgICAgIF9vdXQgPSBsZWZ0O1xuICAgICAgICAvLyBOQjogY3JjMzIgc3RvcmVkIGFzIHNpZ25lZCAzMi1iaXQgaW50LCB6c3dhcDMyIHJldHVybnMgc2lnbmVkIHRvb1xuICAgICAgICBpZiAoKHN0YXRlLmZsYWdzID8gaG9sZCA6IHpzd2FwMzIoaG9sZCkpICE9PSBzdGF0ZS5jaGVjaykge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBkYXRhIGNoZWNrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgY2hlY2sgbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBMRU5HVEg7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBMRU5HVEg6XG4gICAgICBpZiAoc3RhdGUud3JhcCAmJiBzdGF0ZS5mbGFncykge1xuICAgICAgICAvLz09PSBORUVEQklUUygzMik7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS50b3RhbCAmIDB4ZmZmZmZmZmYpKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGxlbmd0aCBjaGVjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGxlbmd0aCBtYXRjaGVzIHRyYWlsZXJcXG5cIikpO1xuICAgICAgfVxuICAgICAgc3RhdGUubW9kZSA9IERPTkU7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBET05FOlxuICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EO1xuICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgIGNhc2UgQkFEOlxuICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SO1xuICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgIGNhc2UgTUVNOlxuICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAgIGNhc2UgU1lOQzpcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICAgIH1cbiAgfVxuXG4gIC8vIGluZl9sZWF2ZSA8LSBoZXJlIGlzIHJlYWwgcGxhY2UgZm9yIFwiZ290byBpbmZfbGVhdmVcIiwgZW11bGF0ZWQgdmlhIFwiYnJlYWsgaW5mX2xlYXZlXCJcblxuICAvKlxuICAgICBSZXR1cm4gZnJvbSBpbmZsYXRlKCksIHVwZGF0aW5nIHRoZSB0b3RhbCBjb3VudHMgYW5kIHRoZSBjaGVjayB2YWx1ZS5cbiAgICAgSWYgdGhlcmUgd2FzIG5vIHByb2dyZXNzIGR1cmluZyB0aGUgaW5mbGF0ZSgpIGNhbGwsIHJldHVybiBhIGJ1ZmZlclxuICAgICBlcnJvci4gIENhbGwgdXBkYXRld2luZG93KCkgdG8gY3JlYXRlIGFuZC9vciB1cGRhdGUgdGhlIHdpbmRvdyBzdGF0ZS5cbiAgICAgTm90ZTogYSBtZW1vcnkgZXJyb3IgZnJvbSBpbmZsYXRlKCkgaXMgbm9uLXJlY292ZXJhYmxlLlxuICAgKi9cblxuICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gIHN0YXRlLmhvbGQgPSBob2xkO1xuICBzdGF0ZS5iaXRzID0gYml0cztcbiAgLy8tLS1cblxuICBpZiAoc3RhdGUud3NpemUgfHwgKF9vdXQgIT09IHN0cm0uYXZhaWxfb3V0ICYmIHN0YXRlLm1vZGUgPCBCQUQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA8IENIRUNLIHx8IGZsdXNoICE9PSBaX0ZJTklTSCkpKSB7XG4gICAgaWYgKHVwZGF0ZXdpbmRvdyhzdHJtLCBzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCwgX291dCAtIHN0cm0uYXZhaWxfb3V0KSkge1xuICAgICAgc3RhdGUubW9kZSA9IE1FTTtcbiAgICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgICB9XG4gIH1cbiAgX2luIC09IHN0cm0uYXZhaWxfaW47XG4gIF9vdXQgLT0gc3RybS5hdmFpbF9vdXQ7XG4gIHN0cm0udG90YWxfaW4gKz0gX2luO1xuICBzdHJtLnRvdGFsX291dCArPSBfb3V0O1xuICBzdGF0ZS50b3RhbCArPSBfb3V0O1xuICBpZiAoc3RhdGUud3JhcCAmJiBfb3V0KSB7XG4gICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gLypVUERBVEUoc3RhdGUuY2hlY2ssIHN0cm0ubmV4dF9vdXQgLSBfb3V0LCBfb3V0KTsqL1xuICAgICAgKHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkpO1xuICB9XG4gIHN0cm0uZGF0YV90eXBlID0gc3RhdGUuYml0cyArIChzdGF0ZS5sYXN0ID8gNjQgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlID09PSBUWVBFID8gMTI4IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA9PT0gTEVOXyB8fCBzdGF0ZS5tb2RlID09PSBDT1BZXyA/IDI1NiA6IDApO1xuICBpZiAoKChfaW4gPT09IDAgJiYgX291dCA9PT0gMCkgfHwgZmx1c2ggPT09IFpfRklOSVNIKSAmJiByZXQgPT09IFpfT0spIHtcbiAgICByZXQgPSBaX0JVRl9FUlJPUjtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlRW5kKHN0cm0pIHtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgLyp8fCBzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTAqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS53aW5kb3cpIHtcbiAgICBzdGF0ZS53aW5kb3cgPSBudWxsO1xuICB9XG4gIHN0cm0uc3RhdGUgPSBudWxsO1xuICByZXR1cm4gWl9PSztcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUdldEhlYWRlcihzdHJtLCBoZWFkKSB7XG4gIHZhciBzdGF0ZTtcblxuICAvKiBjaGVjayBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgaWYgKChzdGF0ZS53cmFwICYgMikgPT09IDApIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG5cbiAgLyogc2F2ZSBoZWFkZXIgc3RydWN0dXJlICovXG4gIHN0YXRlLmhlYWQgPSBoZWFkO1xuICBoZWFkLmRvbmUgPSBmYWxzZTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnkpIHtcbiAgdmFyIGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDtcblxuICB2YXIgc3RhdGU7XG4gIHZhciBkaWN0aWQ7XG4gIHZhciByZXQ7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIC8qID09IFpfTlVMTCAqLyB8fCAhc3RybS5zdGF0ZSAvKiA9PSBaX05VTEwgKi8pIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICBpZiAoc3RhdGUud3JhcCAhPT0gMCAmJiBzdGF0ZS5tb2RlICE9PSBESUNUKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgLyogY2hlY2sgZm9yIGNvcnJlY3QgZGljdGlvbmFyeSBpZGVudGlmaWVyICovXG4gIGlmIChzdGF0ZS5tb2RlID09PSBESUNUKSB7XG4gICAgZGljdGlkID0gMTsgLyogYWRsZXIzMigwLCBudWxsLCAwKSovXG4gICAgLyogZGljdGlkID0gYWRsZXIzMihkaWN0aWQsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOyAqL1xuICAgIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCAwKTtcbiAgICBpZiAoZGljdGlkICE9PSBzdGF0ZS5jaGVjaykge1xuICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjtcbiAgICB9XG4gIH1cbiAgLyogY29weSBkaWN0aW9uYXJ5IHRvIHdpbmRvdyB1c2luZyB1cGRhdGV3aW5kb3coKSwgd2hpY2ggd2lsbCBhbWVuZCB0aGVcbiAgIGV4aXN0aW5nIGRpY3Rpb25hcnkgaWYgYXBwcm9wcmlhdGUgKi9cbiAgcmV0ID0gdXBkYXRld2luZG93KHN0cm0sIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIGRpY3RMZW5ndGgpO1xuICBpZiAocmV0KSB7XG4gICAgc3RhdGUubW9kZSA9IE1FTTtcbiAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gIH1cbiAgc3RhdGUuaGF2ZWRpY3QgPSAxO1xuICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGRpY3Rpb25hcnkgc2V0XFxuXCIpKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmV4cG9ydHMuaW5mbGF0ZVJlc2V0ID0gaW5mbGF0ZVJlc2V0O1xuZXhwb3J0cy5pbmZsYXRlUmVzZXQyID0gaW5mbGF0ZVJlc2V0MjtcbmV4cG9ydHMuaW5mbGF0ZVJlc2V0S2VlcCA9IGluZmxhdGVSZXNldEtlZXA7XG5leHBvcnRzLmluZmxhdGVJbml0ID0gaW5mbGF0ZUluaXQ7XG5leHBvcnRzLmluZmxhdGVJbml0MiA9IGluZmxhdGVJbml0MjtcbmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7XG5leHBvcnRzLmluZmxhdGVFbmQgPSBpbmZsYXRlRW5kO1xuZXhwb3J0cy5pbmZsYXRlR2V0SGVhZGVyID0gaW5mbGF0ZUdldEhlYWRlcjtcbmV4cG9ydHMuaW5mbGF0ZVNldERpY3Rpb25hcnkgPSBpbmZsYXRlU2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZUluZm8gPSAncGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSc7XG5cbi8qIE5vdCBpbXBsZW1lbnRlZFxuZXhwb3J0cy5pbmZsYXRlQ29weSA9IGluZmxhdGVDb3B5O1xuZXhwb3J0cy5pbmZsYXRlR2V0RGljdGlvbmFyeSA9IGluZmxhdGVHZXREaWN0aW9uYXJ5O1xuZXhwb3J0cy5pbmZsYXRlTWFyayA9IGluZmxhdGVNYXJrO1xuZXhwb3J0cy5pbmZsYXRlUHJpbWUgPSBpbmZsYXRlUHJpbWU7XG5leHBvcnRzLmluZmxhdGVTeW5jID0gaW5mbGF0ZVN5bmM7XG5leHBvcnRzLmluZmxhdGVTeW5jUG9pbnQgPSBpbmZsYXRlU3luY1BvaW50O1xuZXhwb3J0cy5pbmZsYXRlVW5kZXJtaW5lID0gaW5mbGF0ZVVuZGVybWluZTtcbiovXG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG5cbnZhciBNQVhCSVRTID0gMTU7XG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBDT0RFUyA9IDA7XG52YXIgTEVOUyA9IDE7XG52YXIgRElTVFMgPSAyO1xuXG52YXIgbGJhc2UgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBiYXNlICovXG4gIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywgMTksIDIzLCAyNywgMzEsXG4gIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsIDEzMSwgMTYzLCAxOTUsIDIyNywgMjU4LCAwLCAwXG5dO1xuXG52YXIgbGV4dCA9IFsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGV4dHJhICovXG4gIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LFxuICAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAxNiwgNzIsIDc4XG5dO1xuXG52YXIgZGJhc2UgPSBbIC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGJhc2UgKi9cbiAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLFxuICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsXG4gIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1NzcsIDAsIDBcbl07XG5cbnZhciBkZXh0ID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMSwgMjEsIDIyLCAyMixcbiAgMjMsIDIzLCAyNCwgMjQsIDI1LCAyNSwgMjYsIDI2LCAyNywgMjcsXG4gIDI4LCAyOCwgMjksIDI5LCA2NCwgNjRcbl07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV90YWJsZSh0eXBlLCBsZW5zLCBsZW5zX2luZGV4LCBjb2RlcywgdGFibGUsIHRhYmxlX2luZGV4LCB3b3JrLCBvcHRzKVxue1xuICB2YXIgYml0cyA9IG9wdHMuYml0cztcbiAgICAgIC8vaGVyZSA9IG9wdHMuaGVyZTsgLyogdGFibGUgZW50cnkgZm9yIGR1cGxpY2F0aW9uICovXG5cbiAgdmFyIGxlbiA9IDA7ICAgICAgICAgICAgICAgLyogYSBjb2RlJ3MgbGVuZ3RoIGluIGJpdHMgKi9cbiAgdmFyIHN5bSA9IDA7ICAgICAgICAgICAgICAgLyogaW5kZXggb2YgY29kZSBzeW1ib2xzICovXG4gIHZhciBtaW4gPSAwLCBtYXggPSAwOyAgICAgICAgICAvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvZGUgbGVuZ3RocyAqL1xuICB2YXIgcm9vdCA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3Igcm9vdCB0YWJsZSAqL1xuICB2YXIgY3VyciA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgY3VycmVudCB0YWJsZSAqL1xuICB2YXIgZHJvcCA9IDA7ICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMgdG8gZHJvcCBmb3Igc3ViLXRhYmxlICovXG4gIHZhciBsZWZ0ID0gMDsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHByZWZpeCBjb2RlcyBhdmFpbGFibGUgKi9cbiAgdmFyIHVzZWQgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBlbnRyaWVzIGluIHRhYmxlIHVzZWQgKi9cbiAgdmFyIGh1ZmYgPSAwOyAgICAgICAgICAgICAgLyogSHVmZm1hbiBjb2RlICovXG4gIHZhciBpbmNyOyAgICAgICAgICAgICAgLyogZm9yIGluY3JlbWVudGluZyBjb2RlLCBpbmRleCAqL1xuICB2YXIgZmlsbDsgICAgICAgICAgICAgIC8qIGluZGV4IGZvciByZXBsaWNhdGluZyBlbnRyaWVzICovXG4gIHZhciBsb3c7ICAgICAgICAgICAgICAgLyogbG93IGJpdHMgZm9yIGN1cnJlbnQgcm9vdCBlbnRyeSAqL1xuICB2YXIgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGxvdyByb290IGJpdHMgKi9cbiAgdmFyIG5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlICovXG4gIHZhciBiYXNlID0gbnVsbDsgICAgIC8qIGJhc2UgdmFsdWUgdGFibGUgdG8gdXNlICovXG4gIHZhciBiYXNlX2luZGV4ID0gMDtcbi8vICB2YXIgc2hvZXh0cmE7ICAgIC8qIGV4dHJhIGJpdHMgdGFibGUgdG8gdXNlICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYmFzZSBhbmQgZXh0cmEgZm9yIHN5bWJvbCA+IGVuZCAqL1xuICB2YXIgY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAvKiBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi9cbiAgdmFyIG9mZnMgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAgLyogb2Zmc2V0cyBpbiB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi9cbiAgdmFyIGV4dHJhID0gbnVsbDtcbiAgdmFyIGV4dHJhX2luZGV4ID0gMDtcblxuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDtcblxuICAvKlxuICAgUHJvY2VzcyBhIHNldCBvZiBjb2RlIGxlbmd0aHMgdG8gY3JlYXRlIGEgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4gIFRoZVxuICAgY29kZSBsZW5ndGhzIGFyZSBsZW5zWzAuLmNvZGVzLTFdLiAgRWFjaCBsZW5ndGggY29ycmVzcG9uZHMgdG8gdGhlXG4gICBzeW1ib2xzIDAuLmNvZGVzLTEuICBUaGUgSHVmZm1hbiBjb2RlIGlzIGdlbmVyYXRlZCBieSBmaXJzdCBzb3J0aW5nIHRoZVxuICAgc3ltYm9scyBieSBsZW5ndGggZnJvbSBzaG9ydCB0byBsb25nLCBhbmQgcmV0YWluaW5nIHRoZSBzeW1ib2wgb3JkZXJcbiAgIGZvciBjb2RlcyB3aXRoIGVxdWFsIGxlbmd0aHMuICBUaGVuIHRoZSBjb2RlIHN0YXJ0cyB3aXRoIGFsbCB6ZXJvIGJpdHNcbiAgIGZvciB0aGUgZmlyc3QgY29kZSBvZiB0aGUgc2hvcnRlc3QgbGVuZ3RoLCBhbmQgdGhlIGNvZGVzIGFyZSBpbnRlZ2VyXG4gICBpbmNyZW1lbnRzIGZvciB0aGUgc2FtZSBsZW5ndGgsIGFuZCB6ZXJvcyBhcmUgYXBwZW5kZWQgYXMgdGhlIGxlbmd0aFxuICAgaW5jcmVhc2VzLiAgRm9yIHRoZSBkZWZsYXRlIGZvcm1hdCwgdGhlc2UgYml0cyBhcmUgc3RvcmVkIGJhY2t3YXJkc1xuICAgZnJvbSB0aGVpciBtb3JlIG5hdHVyYWwgaW50ZWdlciBpbmNyZW1lbnQgb3JkZXJpbmcsIGFuZCBzbyB3aGVuIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzIGFyZSBidWlsdCBpbiB0aGUgbGFyZ2UgbG9vcCBiZWxvdywgdGhlIGludGVnZXIgY29kZXNcbiAgIGFyZSBpbmNyZW1lbnRlZCBiYWNrd2FyZHMuXG5cbiAgIFRoaXMgcm91dGluZSBhc3N1bWVzLCBidXQgZG9lcyBub3QgY2hlY2ssIHRoYXQgYWxsIG9mIHRoZSBlbnRyaWVzIGluXG4gICBsZW5zW10gYXJlIGluIHRoZSByYW5nZSAwLi5NQVhCSVRTLiAgVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGlzLlxuICAgMS4uTUFYQklUUyBpcyBpbnRlcnByZXRlZCBhcyB0aGF0IGNvZGUgbGVuZ3RoLiAgemVybyBtZWFucyB0aGF0IHRoYXRcbiAgIHN5bWJvbCBkb2VzIG5vdCBvY2N1ciBpbiB0aGlzIGNvZGUuXG5cbiAgIFRoZSBjb2RlcyBhcmUgc29ydGVkIGJ5IGNvbXB1dGluZyBhIGNvdW50IG9mIGNvZGVzIGZvciBlYWNoIGxlbmd0aCxcbiAgIGNyZWF0aW5nIGZyb20gdGhhdCBhIHRhYmxlIG9mIHN0YXJ0aW5nIGluZGljZXMgZm9yIGVhY2ggbGVuZ3RoIGluIHRoZVxuICAgc29ydGVkIHRhYmxlLCBhbmQgdGhlbiBlbnRlcmluZyB0aGUgc3ltYm9scyBpbiBvcmRlciBpbiB0aGUgc29ydGVkXG4gICB0YWJsZS4gIFRoZSBzb3J0ZWQgdGFibGUgaXMgd29ya1tdLCB3aXRoIHRoYXQgc3BhY2UgYmVpbmcgcHJvdmlkZWQgYnlcbiAgIHRoZSBjYWxsZXIuXG5cbiAgIFRoZSBsZW5ndGggY291bnRzIGFyZSB1c2VkIGZvciBvdGhlciBwdXJwb3NlcyBhcyB3ZWxsLCBpLmUuIGZpbmRpbmdcbiAgIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCBjb2RlcywgZGV0ZXJtaW5pbmcgaWYgdGhlcmUgYXJlIGFueVxuICAgY29kZXMgYXQgYWxsLCBjaGVja2luZyBmb3IgYSB2YWxpZCBzZXQgb2YgbGVuZ3RocywgYW5kIGxvb2tpbmcgYWhlYWRcbiAgIGF0IGxlbmd0aCBjb3VudHMgdG8gZGV0ZXJtaW5lIHN1Yi10YWJsZSBzaXplcyB3aGVuIGJ1aWxkaW5nIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzLlxuICAgKi9cblxuICAvKiBhY2N1bXVsYXRlIGxlbmd0aHMgZm9yIGNvZGVzIChhc3N1bWVzIGxlbnNbXSBhbGwgaW4gMC4uTUFYQklUUykgKi9cbiAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBjb3VudFtsZW5dID0gMDtcbiAgfVxuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGNvdW50W2xlbnNbbGVuc19pbmRleCArIHN5bV1dKys7XG4gIH1cblxuICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqL1xuICByb290ID0gYml0cztcbiAgZm9yIChtYXggPSBNQVhCSVRTOyBtYXggPj0gMTsgbWF4LS0pIHtcbiAgICBpZiAoY291bnRbbWF4XSAhPT0gMCkgeyBicmVhazsgfVxuICB9XG4gIGlmIChyb290ID4gbWF4KSB7XG4gICAgcm9vdCA9IG1heDtcbiAgfVxuICBpZiAobWF4ID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogbm8gc3ltYm9scyB0byBjb2RlIGF0IGFsbCAqL1xuICAgIC8vdGFibGUub3Bbb3B0cy50YWJsZV9pbmRleF0gPSA2NDsgIC8vaGVyZS5vcCA9ICh2YXIgY2hhcik2NDsgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqL1xuICAgIC8vdGFibGUuYml0c1tvcHRzLnRhYmxlX2luZGV4XSA9IDE7ICAgLy9oZXJlLmJpdHMgPSAodmFyIGNoYXIpMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDsgICAvL2hlcmUudmFsID0gKHZhciBzaG9ydCkwO1xuICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gKDEgPDwgMjQpIHwgKDY0IDw8IDE2KSB8IDA7XG5cblxuICAgIC8vdGFibGUub3Bbb3B0cy50YWJsZV9pbmRleF0gPSA2NDtcbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxO1xuICAgIC8vdGFibGUudmFsW29wdHMudGFibGVfaW5kZXgrK10gPSAwO1xuICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gKDEgPDwgMjQpIHwgKDY0IDw8IDE2KSB8IDA7XG5cbiAgICBvcHRzLmJpdHMgPSAxO1xuICAgIHJldHVybiAwOyAgICAgLyogbm8gc3ltYm9scywgYnV0IHdhaXQgZm9yIGRlY29kaW5nIHRvIHJlcG9ydCBlcnJvciAqL1xuICB9XG4gIGZvciAobWluID0gMTsgbWluIDwgbWF4OyBtaW4rKykge1xuICAgIGlmIChjb3VudFttaW5dICE9PSAwKSB7IGJyZWFrOyB9XG4gIH1cbiAgaWYgKHJvb3QgPCBtaW4pIHtcbiAgICByb290ID0gbWluO1xuICB9XG5cbiAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovXG4gIGxlZnQgPSAxO1xuICBmb3IgKGxlbiA9IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykge1xuICAgIGxlZnQgPDw9IDE7XG4gICAgbGVmdCAtPSBjb3VudFtsZW5dO1xuICAgIGlmIChsZWZ0IDwgMCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gICAgICAgIC8qIG92ZXItc3Vic2NyaWJlZCAqL1xuICB9XG4gIGlmIChsZWZ0ID4gMCAmJiAodHlwZSA9PT0gQ09ERVMgfHwgbWF4ICE9PSAxKSkge1xuICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgLyogaW5jb21wbGV0ZSBzZXQgKi9cbiAgfVxuXG4gIC8qIGdlbmVyYXRlIG9mZnNldHMgaW50byBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoIGZvciBzb3J0aW5nICovXG4gIG9mZnNbMV0gPSAwO1xuICBmb3IgKGxlbiA9IDE7IGxlbiA8IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgb2Zmc1tsZW4gKyAxXSA9IG9mZnNbbGVuXSArIGNvdW50W2xlbl07XG4gIH1cblxuICAvKiBzb3J0IHN5bWJvbHMgYnkgbGVuZ3RoLCBieSBzeW1ib2wgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoICovXG4gIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKSB7XG4gICAgaWYgKGxlbnNbbGVuc19pbmRleCArIHN5bV0gIT09IDApIHtcbiAgICAgIHdvcmtbb2Zmc1tsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrXSA9IHN5bTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgQ3JlYXRlIGFuZCBmaWxsIGluIGRlY29kaW5nIHRhYmxlcy4gIEluIHRoaXMgbG9vcCwgdGhlIHRhYmxlIGJlaW5nXG4gICBmaWxsZWQgaXMgYXQgbmV4dCBhbmQgaGFzIGN1cnIgaW5kZXggYml0cy4gIFRoZSBjb2RlIGJlaW5nIHVzZWQgaXMgaHVmZlxuICAgd2l0aCBsZW5ndGggbGVuLiAgVGhhdCBjb2RlIGlzIGNvbnZlcnRlZCB0byBhbiBpbmRleCBieSBkcm9wcGluZyBkcm9wXG4gICBiaXRzIG9mZiBvZiB0aGUgYm90dG9tLiAgRm9yIGNvZGVzIHdoZXJlIGxlbiBpcyBsZXNzIHRoYW4gZHJvcCArIGN1cnIsXG4gICB0aG9zZSB0b3AgZHJvcCArIGN1cnIgLSBsZW4gYml0cyBhcmUgaW5jcmVtZW50ZWQgdGhyb3VnaCBhbGwgdmFsdWVzIHRvXG4gICBmaWxsIHRoZSB0YWJsZSB3aXRoIHJlcGxpY2F0ZWQgZW50cmllcy5cblxuICAgcm9vdCBpcyB0aGUgbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHRoZSByb290IHRhYmxlLiAgV2hlbiBsZW4gZXhjZWVkc1xuICAgcm9vdCwgc3ViLXRhYmxlcyBhcmUgY3JlYXRlZCBwb2ludGVkIHRvIGJ5IHRoZSByb290IGVudHJ5IHdpdGggYW4gaW5kZXhcbiAgIG9mIHRoZSBsb3cgcm9vdCBiaXRzIG9mIGh1ZmYuICBUaGlzIGlzIHNhdmVkIGluIGxvdyB0byBjaGVjayBmb3Igd2hlbiBhXG4gICBuZXcgc3ViLXRhYmxlIHNob3VsZCBiZSBzdGFydGVkLiAgZHJvcCBpcyB6ZXJvIHdoZW4gdGhlIHJvb3QgdGFibGUgaXNcbiAgIGJlaW5nIGZpbGxlZCwgYW5kIGRyb3AgaXMgcm9vdCB3aGVuIHN1Yi10YWJsZXMgYXJlIGJlaW5nIGZpbGxlZC5cblxuICAgV2hlbiBhIG5ldyBzdWItdGFibGUgaXMgbmVlZGVkLCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9vayBhaGVhZCBpbiB0aGVcbiAgIGNvZGUgbGVuZ3RocyB0byBkZXRlcm1pbmUgd2hhdCBzaXplIHN1Yi10YWJsZSBpcyBuZWVkZWQuICBUaGUgbGVuZ3RoXG4gICBjb3VudHMgYXJlIHVzZWQgZm9yIHRoaXMsIGFuZCBzbyBjb3VudFtdIGlzIGRlY3JlbWVudGVkIGFzIGNvZGVzIGFyZVxuICAgZW50ZXJlZCBpbiB0aGUgdGFibGVzLlxuXG4gICB1c2VkIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHRoZVxuICAgcHJvdmlkZWQgKnRhYmxlIHNwYWNlLiAgSXQgaXMgY2hlY2tlZCBmb3IgTEVOUyBhbmQgRElTVCB0YWJsZXMgYWdhaW5zdFxuICAgdGhlIGNvbnN0YW50cyBFTk9VR0hfTEVOUyBhbmQgRU5PVUdIX0RJU1RTIHRvIGd1YXJkIGFnYWluc3QgY2hhbmdlcyBpblxuICAgdGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplIGNvbnN0YW50cy4gIFNlZSB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaFxuICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbiAgIHN5bSBpbmNyZW1lbnRzIHRocm91Z2ggYWxsIHN5bWJvbHMsIGFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW5cbiAgIGFsbCBjb2RlcyBvZiBsZW5ndGggbWF4LCBpLmUuIGFsbCBjb2RlcywgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIFRoaXNcbiAgIHJvdXRpbmUgcGVybWl0cyBpbmNvbXBsZXRlIGNvZGVzLCBzbyBhbm90aGVyIGxvb3AgYWZ0ZXIgdGhpcyBvbmUgZmlsbHNcbiAgIGluIHRoZSByZXN0IG9mIHRoZSBkZWNvZGluZyB0YWJsZXMgd2l0aCBpbnZhbGlkIGNvZGUgbWFya2Vycy5cbiAgICovXG5cbiAgLyogc2V0IHVwIGZvciBjb2RlIHR5cGUgKi9cbiAgLy8gcG9vciBtYW4gb3B0aW1pemF0aW9uIC0gdXNlIGlmLWVsc2UgaW5zdGVhZCBvZiBzd2l0Y2gsXG4gIC8vIHRvIGF2b2lkIGRlb3B0cyBpbiBvbGQgdjhcbiAgaWYgKHR5cGUgPT09IENPREVTKSB7XG4gICAgYmFzZSA9IGV4dHJhID0gd29yazsgICAgLyogZHVtbXkgdmFsdWUtLW5vdCB1c2VkICovXG4gICAgZW5kID0gMTk7XG5cbiAgfSBlbHNlIGlmICh0eXBlID09PSBMRU5TKSB7XG4gICAgYmFzZSA9IGxiYXNlO1xuICAgIGJhc2VfaW5kZXggLT0gMjU3O1xuICAgIGV4dHJhID0gbGV4dDtcbiAgICBleHRyYV9pbmRleCAtPSAyNTc7XG4gICAgZW5kID0gMjU2O1xuXG4gIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBESVNUUyAqL1xuICAgIGJhc2UgPSBkYmFzZTtcbiAgICBleHRyYSA9IGRleHQ7XG4gICAgZW5kID0gLTE7XG4gIH1cblxuICAvKiBpbml0aWFsaXplIG9wdHMgZm9yIGxvb3AgKi9cbiAgaHVmZiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgKi9cbiAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovXG4gIGxlbiA9IG1pbjsgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIGxlbmd0aCAqL1xuICBuZXh0ID0gdGFibGVfaW5kZXg7ICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIHRvIGZpbGwgaW4gKi9cbiAgY3VyciA9IHJvb3Q7ICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgaW5kZXggYml0cyAqL1xuICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqL1xuICBsb3cgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogdHJpZ2dlciBuZXcgc3ViLXRhYmxlIHdoZW4gbGVuID4gcm9vdCAqL1xuICB1c2VkID0gMSA8PCByb290OyAgICAgICAgICAvKiB1c2Ugcm9vdCB0YWJsZSBlbnRyaWVzICovXG4gIG1hc2sgPSB1c2VkIC0gMTsgICAgICAgICAgICAvKiBtYXNrIGZvciBjb21wYXJpbmcgbG93ICovXG5cbiAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovXG4gIGlmICgodHlwZSA9PT0gTEVOUyAmJiB1c2VkID4gRU5PVUdIX0xFTlMpIHx8XG4gICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICAvKiBwcm9jZXNzIGFsbCBjb2RlcyBhbmQgbWFrZSB0YWJsZSBlbnRyaWVzICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBjcmVhdGUgdGFibGUgZW50cnkgKi9cbiAgICBoZXJlX2JpdHMgPSBsZW4gLSBkcm9wO1xuICAgIGlmICh3b3JrW3N5bV0gPCBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSAwO1xuICAgICAgaGVyZV92YWwgPSB3b3JrW3N5bV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHdvcmtbc3ltXSA+IGVuZCkge1xuICAgICAgaGVyZV9vcCA9IGV4dHJhW2V4dHJhX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICAgIGhlcmVfdmFsID0gYmFzZVtiYXNlX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBoZXJlX29wID0gMzIgKyA2NDsgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgKi9cbiAgICAgIGhlcmVfdmFsID0gMDtcbiAgICB9XG5cbiAgICAvKiByZXBsaWNhdGUgZm9yIHRob3NlIGluZGljZXMgd2l0aCBsb3cgbGVuIGJpdHMgZXF1YWwgdG8gaHVmZiAqL1xuICAgIGluY3IgPSAxIDw8IChsZW4gLSBkcm9wKTtcbiAgICBmaWxsID0gMSA8PCBjdXJyO1xuICAgIG1pbiA9IGZpbGw7ICAgICAgICAgICAgICAgICAvKiBzYXZlIG9mZnNldCB0byBuZXh0IHRhYmxlICovXG4gICAgZG8ge1xuICAgICAgZmlsbCAtPSBpbmNyO1xuICAgICAgdGFibGVbbmV4dCArIChodWZmID4+IGRyb3ApICsgZmlsbF0gPSAoaGVyZV9iaXRzIDw8IDI0KSB8IChoZXJlX29wIDw8IDE2KSB8IGhlcmVfdmFsIHwwO1xuICAgIH0gd2hpbGUgKGZpbGwgIT09IDApO1xuXG4gICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgbGVuLWJpdCBjb2RlIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gMSk7XG4gICAgd2hpbGUgKGh1ZmYgJiBpbmNyKSB7XG4gICAgICBpbmNyID4+PSAxO1xuICAgIH1cbiAgICBpZiAoaW5jciAhPT0gMCkge1xuICAgICAgaHVmZiAmPSBpbmNyIC0gMTtcbiAgICAgIGh1ZmYgKz0gaW5jcjtcbiAgICB9IGVsc2Uge1xuICAgICAgaHVmZiA9IDA7XG4gICAgfVxuXG4gICAgLyogZ28gdG8gbmV4dCBzeW1ib2wsIHVwZGF0ZSBjb3VudCwgbGVuICovXG4gICAgc3ltKys7XG4gICAgaWYgKC0tY291bnRbbGVuXSA9PT0gMCkge1xuICAgICAgaWYgKGxlbiA9PT0gbWF4KSB7IGJyZWFrOyB9XG4gICAgICBsZW4gPSBsZW5zW2xlbnNfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgIH1cblxuICAgIC8qIGNyZWF0ZSBuZXcgc3ViLXRhYmxlIGlmIG5lZWRlZCAqL1xuICAgIGlmIChsZW4gPiByb290ICYmIChodWZmICYgbWFzaykgIT09IGxvdykge1xuICAgICAgLyogaWYgZmlyc3QgdGltZSwgdHJhbnNpdGlvbiB0byBzdWItdGFibGVzICovXG4gICAgICBpZiAoZHJvcCA9PT0gMCkge1xuICAgICAgICBkcm9wID0gcm9vdDtcbiAgICAgIH1cblxuICAgICAgLyogaW5jcmVtZW50IHBhc3QgbGFzdCB0YWJsZSAqL1xuICAgICAgbmV4dCArPSBtaW47ICAgICAgICAgICAgLyogaGVyZSBtaW4gaXMgMSA8PCBjdXJyICovXG5cbiAgICAgIC8qIGRldGVybWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqL1xuICAgICAgY3VyciA9IGxlbiAtIGRyb3A7XG4gICAgICBsZWZ0ID0gMSA8PCBjdXJyO1xuICAgICAgd2hpbGUgKGN1cnIgKyBkcm9wIDwgbWF4KSB7XG4gICAgICAgIGxlZnQgLT0gY291bnRbY3VyciArIGRyb3BdO1xuICAgICAgICBpZiAobGVmdCA8PSAwKSB7IGJyZWFrOyB9XG4gICAgICAgIGN1cnIrKztcbiAgICAgICAgbGVmdCA8PD0gMTtcbiAgICAgIH1cblxuICAgICAgLyogY2hlY2sgZm9yIGVub3VnaCBzcGFjZSAqL1xuICAgICAgdXNlZCArPSAxIDw8IGN1cnI7XG4gICAgICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fFxuICAgICAgICAodHlwZSA9PT0gRElTVFMgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUykpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIC8qIHBvaW50IGVudHJ5IGluIHJvb3QgdGFibGUgdG8gc3ViLXRhYmxlICovXG4gICAgICBsb3cgPSBodWZmICYgbWFzaztcbiAgICAgIC8qdGFibGUub3BbbG93XSA9IGN1cnI7XG4gICAgICB0YWJsZS5iaXRzW2xvd10gPSByb290O1xuICAgICAgdGFibGUudmFsW2xvd10gPSBuZXh0IC0gb3B0cy50YWJsZV9pbmRleDsqL1xuICAgICAgdGFibGVbbG93XSA9IChyb290IDw8IDI0KSB8IChjdXJyIDw8IDE2KSB8IChuZXh0IC0gdGFibGVfaW5kZXgpIHwwO1xuICAgIH1cbiAgfVxuXG4gIC8qIGZpbGwgaW4gcmVtYWluaW5nIHRhYmxlIGVudHJ5IGlmIGNvZGUgaXMgaW5jb21wbGV0ZSAoZ3VhcmFudGVlZCB0byBoYXZlXG4gICBhdCBtb3N0IG9uZSByZW1haW5pbmcgZW50cnksIHNpbmNlIGlmIHRoZSBjb2RlIGlzIGluY29tcGxldGUsIHRoZVxuICAgbWF4aW11bSBjb2RlIGxlbmd0aCB0aGF0IHdhcyBhbGxvd2VkIHRvIGdldCB0aGlzIGZhciBpcyBvbmUgYml0KSAqL1xuICBpZiAoaHVmZiAhPT0gMCkge1xuICAgIC8vdGFibGUub3BbbmV4dCArIGh1ZmZdID0gNjQ7ICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqL1xuICAgIC8vdGFibGUuYml0c1tuZXh0ICsgaHVmZl0gPSBsZW4gLSBkcm9wO1xuICAgIC8vdGFibGUudmFsW25leHQgKyBodWZmXSA9IDA7XG4gICAgdGFibGVbbmV4dCArIGh1ZmZdID0gKChsZW4gLSBkcm9wKSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwwO1xuICB9XG5cbiAgLyogc2V0IHJldHVybiBwYXJhbWV0ZXJzICovXG4gIC8vb3B0cy50YWJsZV9pbmRleCArPSB1c2VkO1xuICBvcHRzLmJpdHMgPSByb290O1xuICByZXR1cm4gMDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIChDKSAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlclxuLy8gKEMpIDIwMTQtMjAxNyBWaXRhbHkgUHV6cmluIGFuZCBBbmRyZXkgVHVwaXRzaW5cbi8vXG4vLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZFxuLy8gd2FycmFudHkuIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzXG4vLyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLFxuLy8gaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdFxuLy8gZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOlxuLy9cbi8vIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90XG4vLyAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlXG4vLyAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZVxuLy8gICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLlxuLy8gMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmVcbi8vICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLlxuLy8gMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi5cblxuZnVuY3Rpb24gWlN0cmVhbSgpIHtcbiAgLyogbmV4dCBpbnB1dCBieXRlICovXG4gIHRoaXMuaW5wdXQgPSBudWxsOyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG4gIHRoaXMubmV4dF9pbiA9IDA7XG4gIC8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgaW5wdXQgKi9cbiAgdGhpcy5hdmFpbF9pbiA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqL1xuICB0aGlzLnRvdGFsX2luID0gMDtcbiAgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovXG4gIHRoaXMub3V0cHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfb3V0ID0gMDtcbiAgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgb3V0cHV0ICovXG4gIHRoaXMuYXZhaWxfb3V0ID0gMDtcbiAgLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9vdXQgPSAwO1xuICAvKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKi9cbiAgdGhpcy5tc2cgPSAnJy8qWl9OVUxMKi87XG4gIC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqL1xuICB0aGlzLnN0YXRlID0gbnVsbDtcbiAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBiaW5hcnkgb3IgdGV4dCAqL1xuICB0aGlzLmRhdGFfdHlwZSA9IDIvKlpfVU5LTk9XTiovO1xuICAvKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqL1xuICB0aGlzLmFkbGVyID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBaU3RyZWFtO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbi8vIHJlc29sdmVzIC4gYW5kIC4uIGVsZW1lbnRzIGluIGEgcGF0aCBhcnJheSB3aXRoIGRpcmVjdG9yeSBuYW1lcyB0aGVyZVxuLy8gbXVzdCBiZSBubyBzbGFzaGVzLCBlbXB0eSBlbGVtZW50cywgb3IgZGV2aWNlIG5hbWVzIChjOlxcKSBpbiB0aGUgYXJyYXlcbi8vIChzbyBhbHNvIG5vIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNsYXNoZXMgLSBpdCBkb2VzIG5vdCBkaXN0aW5ndWlzaFxuLy8gcmVsYXRpdmUgYW5kIGFic29sdXRlIHBhdGhzKVxuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXkocGFydHMsIGFsbG93QWJvdmVSb290KSB7XG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIHZhciB1cCA9IDA7XG4gIGZvciAodmFyIGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHZhciBsYXN0ID0gcGFydHNbaV07XG4gICAgaWYgKGxhc3QgPT09ICcuJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgIH0gZWxzZSBpZiAobGFzdCA9PT0gJy4uJykge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICB1cC0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBwYXRoIGlzIGFsbG93ZWQgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIHJlc3RvcmUgbGVhZGluZyAuLnNcbiAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgZm9yICg7IHVwLS07IHVwKSB7XG4gICAgICBwYXJ0cy51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJ0cztcbn1cblxuLy8gU3BsaXQgYSBmaWxlbmFtZSBpbnRvIFtyb290LCBkaXIsIGJhc2VuYW1lLCBleHRdLCB1bml4IHZlcnNpb25cbi8vICdyb290JyBpcyBqdXN0IGEgc2xhc2gsIG9yIG5vdGhpbmcuXG52YXIgc3BsaXRQYXRoUmUgPVxuICAgIC9eKFxcLz98KShbXFxzXFxTXSo/KSgoPzpcXC57MSwyfXxbXlxcL10rP3wpKFxcLlteLlxcL10qfCkpKD86W1xcL10qKSQvO1xudmFyIHNwbGl0UGF0aCA9IGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gIHJldHVybiBzcGxpdFBhdGhSZS5leGVjKGZpbGVuYW1lKS5zbGljZSgxKTtcbn07XG5cbi8vIHBhdGgucmVzb2x2ZShbZnJvbSAuLi5dLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzb2x2ZWRQYXRoID0gJycsXG4gICAgICByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XG5cbiAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHtcbiAgICB2YXIgcGF0aCA9IChpID49IDApID8gYXJndW1lbnRzW2ldIDogcHJvY2Vzcy5jd2QoKTtcblxuICAgIC8vIFNraXAgZW1wdHkgYW5kIGludmFsaWQgZW50cmllc1xuICAgIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLnJlc29sdmUgbXVzdCBiZSBzdHJpbmdzJyk7XG4gICAgfSBlbHNlIGlmICghcGF0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmVzb2x2ZWRQYXRoID0gcGF0aCArICcvJyArIHJlc29sdmVkUGF0aDtcbiAgICByZXNvbHZlZEFic29sdXRlID0gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbiAgfVxuXG4gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLCBidXRcbiAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KGZpbHRlcihyZXNvbHZlZFBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhcmVzb2x2ZWRBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIHJldHVybiAoKHJlc29sdmVkQWJzb2x1dGUgPyAnLycgOiAnJykgKyByZXNvbHZlZFBhdGgpIHx8ICcuJztcbn07XG5cbi8vIHBhdGgubm9ybWFsaXplKHBhdGgpXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIGlzQWJzb2x1dGUgPSBleHBvcnRzLmlzQWJzb2x1dGUocGF0aCksXG4gICAgICB0cmFpbGluZ1NsYXNoID0gc3Vic3RyKHBhdGgsIC0xKSA9PT0gJy8nO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICBwYXRoID0gbm9ybWFsaXplQXJyYXkoZmlsdGVyKHBhdGguc3BsaXQoJy8nKSwgZnVuY3Rpb24ocCkge1xuICAgIHJldHVybiAhIXA7XG4gIH0pLCAhaXNBYnNvbHV0ZSkuam9pbignLycpO1xuXG4gIGlmICghcGF0aCAmJiAhaXNBYnNvbHV0ZSkge1xuICAgIHBhdGggPSAnLic7XG4gIH1cbiAgaWYgKHBhdGggJiYgdHJhaWxpbmdTbGFzaCkge1xuICAgIHBhdGggKz0gJy8nO1xuICB9XG5cbiAgcmV0dXJuIChpc0Fic29sdXRlID8gJy8nIDogJycpICsgcGF0aDtcbn07XG5cbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMuaXNBYnNvbHV0ZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XG59O1xuXG4vLyBwb3NpeCB2ZXJzaW9uXG5leHBvcnRzLmpvaW4gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHBhdGhzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcbiAgcmV0dXJuIGV4cG9ydHMubm9ybWFsaXplKGZpbHRlcihwYXRocywgZnVuY3Rpb24ocCwgaW5kZXgpIHtcbiAgICBpZiAodHlwZW9mIHAgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgdG8gcGF0aC5qb2luIG11c3QgYmUgc3RyaW5ncycpO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSkuam9pbignLycpKTtcbn07XG5cblxuLy8gcGF0aC5yZWxhdGl2ZShmcm9tLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbmV4cG9ydHMucmVsYXRpdmUgPSBmdW5jdGlvbihmcm9tLCB0bykge1xuICBmcm9tID0gZXhwb3J0cy5yZXNvbHZlKGZyb20pLnN1YnN0cigxKTtcbiAgdG8gPSBleHBvcnRzLnJlc29sdmUodG8pLnN1YnN0cigxKTtcblxuICBmdW5jdGlvbiB0cmltKGFycikge1xuICAgIHZhciBzdGFydCA9IDA7XG4gICAgZm9yICg7IHN0YXJ0IDwgYXJyLmxlbmd0aDsgc3RhcnQrKykge1xuICAgICAgaWYgKGFycltzdGFydF0gIT09ICcnKSBicmVhaztcbiAgICB9XG5cbiAgICB2YXIgZW5kID0gYXJyLmxlbmd0aCAtIDE7XG4gICAgZm9yICg7IGVuZCA+PSAwOyBlbmQtLSkge1xuICAgICAgaWYgKGFycltlbmRdICE9PSAnJykgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSByZXR1cm4gW107XG4gICAgcmV0dXJuIGFyci5zbGljZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTtcbiAgfVxuXG4gIHZhciBmcm9tUGFydHMgPSB0cmltKGZyb20uc3BsaXQoJy8nKSk7XG4gIHZhciB0b1BhcnRzID0gdHJpbSh0by5zcGxpdCgnLycpKTtcblxuICB2YXIgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpO1xuICB2YXIgc2FtZVBhcnRzTGVuZ3RoID0gbGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZyb21QYXJ0c1tpXSAhPT0gdG9QYXJ0c1tpXSkge1xuICAgICAgc2FtZVBhcnRzTGVuZ3RoID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHZhciBvdXRwdXRQYXJ0cyA9IFtdO1xuICBmb3IgKHZhciBpID0gc2FtZVBhcnRzTGVuZ3RoOyBpIDwgZnJvbVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0UGFydHMucHVzaCgnLi4nKTtcbiAgfVxuXG4gIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7XG5cbiAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJy8nKTtcbn07XG5cbmV4cG9ydHMuc2VwID0gJy8nO1xuZXhwb3J0cy5kZWxpbWl0ZXIgPSAnOic7XG5cbmV4cG9ydHMuZGlybmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcbiAgdmFyIHJlc3VsdCA9IHNwbGl0UGF0aChwYXRoKSxcbiAgICAgIHJvb3QgPSByZXN1bHRbMF0sXG4gICAgICBkaXIgPSByZXN1bHRbMV07XG5cbiAgaWYgKCFyb290ICYmICFkaXIpIHtcbiAgICAvLyBObyBkaXJuYW1lIHdoYXRzb2V2ZXJcbiAgICByZXR1cm4gJy4nO1xuICB9XG5cbiAgaWYgKGRpcikge1xuICAgIC8vIEl0IGhhcyBhIGRpcm5hbWUsIHN0cmlwIHRyYWlsaW5nIHNsYXNoXG4gICAgZGlyID0gZGlyLnN1YnN0cigwLCBkaXIubGVuZ3RoIC0gMSk7XG4gIH1cblxuICByZXR1cm4gcm9vdCArIGRpcjtcbn07XG5cblxuZXhwb3J0cy5iYXNlbmFtZSA9IGZ1bmN0aW9uKHBhdGgsIGV4dCkge1xuICB2YXIgZiA9IHNwbGl0UGF0aChwYXRoKVsyXTtcbiAgLy8gVE9ETzogbWFrZSB0aGlzIGNvbXBhcmlzb24gY2FzZS1pbnNlbnNpdGl2ZSBvbiB3aW5kb3dzP1xuICBpZiAoZXh0ICYmIGYuc3Vic3RyKC0xICogZXh0Lmxlbmd0aCkgPT09IGV4dCkge1xuICAgIGYgPSBmLnN1YnN0cigwLCBmLmxlbmd0aCAtIGV4dC5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBmO1xufTtcblxuXG5leHBvcnRzLmV4dG5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XG4gIHJldHVybiBzcGxpdFBhdGgocGF0aClbM107XG59O1xuXG5mdW5jdGlvbiBmaWx0ZXIgKHhzLCBmKSB7XG4gICAgaWYgKHhzLmZpbHRlcikgcmV0dXJuIHhzLmZpbHRlcihmKTtcbiAgICB2YXIgcmVzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoZih4c1tpXSwgaSwgeHMpKSByZXMucHVzaCh4c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG5cbi8vIFN0cmluZy5wcm90b3R5cGUuc3Vic3RyIC0gbmVnYXRpdmUgaW5kZXggZG9uJ3Qgd29yayBpbiBJRThcbnZhciBzdWJzdHIgPSAnYWInLnN1YnN0cigtMSkgPT09ICdiJ1xuICAgID8gZnVuY3Rpb24gKHN0ciwgc3RhcnQsIGxlbikgeyByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKSB9XG4gICAgOiBmdW5jdGlvbiAoc3RyLCBzdGFydCwgbGVuKSB7XG4gICAgICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gc3RyLmxlbmd0aCArIHN0YXJ0O1xuICAgICAgICByZXR1cm4gc3RyLnN1YnN0cihzdGFydCwgbGVuKTtcbiAgICB9XG47XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpc1dpbmRvd3MgPSBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInO1xuXG4vLyBSZWdleCB0byBzcGxpdCBhIHdpbmRvd3MgcGF0aCBpbnRvIHRocmVlIHBhcnRzOiBbKiwgZGV2aWNlLCBzbGFzaCxcbi8vIHRhaWxdIHdpbmRvd3Mtb25seVxudmFyIHNwbGl0RGV2aWNlUmUgPVxuICAgIC9eKFthLXpBLVpdOnxbXFxcXFxcL117Mn1bXlxcXFxcXC9dK1tcXFxcXFwvXStbXlxcXFxcXC9dKyk/KFtcXFxcXFwvXSk/KFtcXHNcXFNdKj8pJC87XG5cbi8vIFJlZ2V4IHRvIHNwbGl0IHRoZSB0YWlsIHBhcnQgb2YgdGhlIGFib3ZlIGludG8gWyosIGRpciwgYmFzZW5hbWUsIGV4dF1cbnZhciBzcGxpdFRhaWxSZSA9XG4gICAgL14oW1xcc1xcU10qPykoKD86XFwuezEsMn18W15cXFxcXFwvXSs/fCkoXFwuW14uXFwvXFxcXF0qfCkpKD86W1xcXFxcXC9dKikkLztcblxudmFyIHdpbjMyID0ge307XG5cbi8vIEZ1bmN0aW9uIHRvIHNwbGl0IGEgZmlsZW5hbWUgaW50byBbcm9vdCwgZGlyLCBiYXNlbmFtZSwgZXh0XVxuZnVuY3Rpb24gd2luMzJTcGxpdFBhdGgoZmlsZW5hbWUpIHtcbiAgLy8gU2VwYXJhdGUgZGV2aWNlK3NsYXNoIGZyb20gdGFpbFxuICB2YXIgcmVzdWx0ID0gc3BsaXREZXZpY2VSZS5leGVjKGZpbGVuYW1lKSxcbiAgICAgIGRldmljZSA9IChyZXN1bHRbMV0gfHwgJycpICsgKHJlc3VsdFsyXSB8fCAnJyksXG4gICAgICB0YWlsID0gcmVzdWx0WzNdIHx8ICcnO1xuICAvLyBTcGxpdCB0aGUgdGFpbCBpbnRvIGRpciwgYmFzZW5hbWUgYW5kIGV4dGVuc2lvblxuICB2YXIgcmVzdWx0MiA9IHNwbGl0VGFpbFJlLmV4ZWModGFpbCksXG4gICAgICBkaXIgPSByZXN1bHQyWzFdLFxuICAgICAgYmFzZW5hbWUgPSByZXN1bHQyWzJdLFxuICAgICAgZXh0ID0gcmVzdWx0MlszXTtcbiAgcmV0dXJuIFtkZXZpY2UsIGRpciwgYmFzZW5hbWUsIGV4dF07XG59XG5cbndpbjMyLnBhcnNlID0gZnVuY3Rpb24ocGF0aFN0cmluZykge1xuICBpZiAodHlwZW9mIHBhdGhTdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgXCJQYXJhbWV0ZXIgJ3BhdGhTdHJpbmcnIG11c3QgYmUgYSBzdHJpbmcsIG5vdCBcIiArIHR5cGVvZiBwYXRoU3RyaW5nXG4gICAgKTtcbiAgfVxuICB2YXIgYWxsUGFydHMgPSB3aW4zMlNwbGl0UGF0aChwYXRoU3RyaW5nKTtcbiAgaWYgKCFhbGxQYXJ0cyB8fCBhbGxQYXJ0cy5sZW5ndGggIT09IDQpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBwYXRoICdcIiArIHBhdGhTdHJpbmcgKyBcIidcIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByb290OiBhbGxQYXJ0c1swXSxcbiAgICBkaXI6IGFsbFBhcnRzWzBdICsgYWxsUGFydHNbMV0uc2xpY2UoMCwgLTEpLFxuICAgIGJhc2U6IGFsbFBhcnRzWzJdLFxuICAgIGV4dDogYWxsUGFydHNbM10sXG4gICAgbmFtZTogYWxsUGFydHNbMl0uc2xpY2UoMCwgYWxsUGFydHNbMl0ubGVuZ3RoIC0gYWxsUGFydHNbM10ubGVuZ3RoKVxuICB9O1xufTtcblxuXG5cbi8vIFNwbGl0IGEgZmlsZW5hbWUgaW50byBbcm9vdCwgZGlyLCBiYXNlbmFtZSwgZXh0XSwgdW5peCB2ZXJzaW9uXG4vLyAncm9vdCcgaXMganVzdCBhIHNsYXNoLCBvciBub3RoaW5nLlxudmFyIHNwbGl0UGF0aFJlID1cbiAgICAvXihcXC8/fCkoW1xcc1xcU10qPykoKD86XFwuezEsMn18W15cXC9dKz98KShcXC5bXi5cXC9dKnwpKSg/OltcXC9dKikkLztcbnZhciBwb3NpeCA9IHt9O1xuXG5cbmZ1bmN0aW9uIHBvc2l4U3BsaXRQYXRoKGZpbGVuYW1lKSB7XG4gIHJldHVybiBzcGxpdFBhdGhSZS5leGVjKGZpbGVuYW1lKS5zbGljZSgxKTtcbn1cblxuXG5wb3NpeC5wYXJzZSA9IGZ1bmN0aW9uKHBhdGhTdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBwYXRoU3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIFwiUGFyYW1ldGVyICdwYXRoU3RyaW5nJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgXCIgKyB0eXBlb2YgcGF0aFN0cmluZ1xuICAgICk7XG4gIH1cbiAgdmFyIGFsbFBhcnRzID0gcG9zaXhTcGxpdFBhdGgocGF0aFN0cmluZyk7XG4gIGlmICghYWxsUGFydHMgfHwgYWxsUGFydHMubGVuZ3RoICE9PSA0KSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgcGF0aCAnXCIgKyBwYXRoU3RyaW5nICsgXCInXCIpO1xuICB9XG4gIGFsbFBhcnRzWzFdID0gYWxsUGFydHNbMV0gfHwgJyc7XG4gIGFsbFBhcnRzWzJdID0gYWxsUGFydHNbMl0gfHwgJyc7XG4gIGFsbFBhcnRzWzNdID0gYWxsUGFydHNbM10gfHwgJyc7XG5cbiAgcmV0dXJuIHtcbiAgICByb290OiBhbGxQYXJ0c1swXSxcbiAgICBkaXI6IGFsbFBhcnRzWzBdICsgYWxsUGFydHNbMV0uc2xpY2UoMCwgLTEpLFxuICAgIGJhc2U6IGFsbFBhcnRzWzJdLFxuICAgIGV4dDogYWxsUGFydHNbM10sXG4gICAgbmFtZTogYWxsUGFydHNbMl0uc2xpY2UoMCwgYWxsUGFydHNbMl0ubGVuZ3RoIC0gYWxsUGFydHNbM10ubGVuZ3RoKVxuICB9O1xufTtcblxuXG5pZiAoaXNXaW5kb3dzKVxuICBtb2R1bGUuZXhwb3J0cyA9IHdpbjMyLnBhcnNlO1xuZWxzZSAvKiBwb3NpeCAqL1xuICBtb2R1bGUuZXhwb3J0cyA9IHBvc2l4LnBhcnNlO1xuXG5tb2R1bGUuZXhwb3J0cy5wb3NpeCA9IHBvc2l4LnBhcnNlO1xubW9kdWxlLmV4cG9ydHMud2luMzIgPSB3aW4zMi5wYXJzZTtcbiIsIi8vIHNoaW0gZm9yIHVzaW5nIHByb2Nlc3MgaW4gYnJvd3NlclxudmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXG4vLyBjYWNoZWQgZnJvbSB3aGF0ZXZlciBnbG9iYWwgaXMgcHJlc2VudCBzbyB0aGF0IHRlc3QgcnVubmVycyB0aGF0IHN0dWIgaXRcbi8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuLy8gd3JhcHBlZCBpbiBzdHJpY3QgbW9kZSBjb2RlIHdoaWNoIGRvZXNuJ3QgZGVmaW5lIGFueSBnbG9iYWxzLiAgSXQncyBpbnNpZGUgYVxuLy8gZnVuY3Rpb24gYmVjYXVzZSB0cnkvY2F0Y2hlcyBkZW9wdGltaXplIGluIGNlcnRhaW4gZW5naW5lcy5cblxudmFyIGNhY2hlZFNldFRpbWVvdXQ7XG52YXIgY2FjaGVkQ2xlYXJUaW1lb3V0O1xuXG5mdW5jdGlvbiBkZWZhdWx0U2V0VGltb3V0KCkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuZnVuY3Rpb24gZGVmYXVsdENsZWFyVGltZW91dCAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbihmdW5jdGlvbiAoKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG4gICAgfVxufSAoKSlcbmZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG4gICAgaWYgKGNhY2hlZFNldFRpbWVvdXQgPT09IHNldFRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIC8vIGlmIHNldFRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfSBjYXRjaChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbChudWxsLCBmdW4sIDApO1xuICAgICAgICB9IGNhdGNoKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwodGhpcywgZnVuLCAwKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59XG5mdW5jdGlvbiBydW5DbGVhclRpbWVvdXQobWFya2VyKSB7XG4gICAgaWYgKGNhY2hlZENsZWFyVGltZW91dCA9PT0gY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZENsZWFyVGltZW91dCA9PT0gZGVmYXVsdENsZWFyVGltZW91dCB8fCAhY2FjaGVkQ2xlYXJUaW1lb3V0KSAmJiBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0ICB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKG51bGwsIG1hcmtlcik7XG4gICAgICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3IuXG4gICAgICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIEkuRS4gaGF2ZSBkaWZmZXJlbnQgcnVsZXMgZm9yIGNsZWFyVGltZW91dCB2cyBzZXRUaW1lb3V0XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cbn1cbnZhciBxdWV1ZSA9IFtdO1xudmFyIGRyYWluaW5nID0gZmFsc2U7XG52YXIgY3VycmVudFF1ZXVlO1xudmFyIHF1ZXVlSW5kZXggPSAtMTtcblxuZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuICAgIGlmICghZHJhaW5pbmcgfHwgIWN1cnJlbnRRdWV1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgaWYgKGN1cnJlbnRRdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgfVxuICAgIGlmIChxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgZHJhaW5RdWV1ZSgpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcbiAgICBpZiAoZHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdGltZW91dCA9IHJ1blRpbWVvdXQoY2xlYW5VcE5leHRUaWNrKTtcbiAgICBkcmFpbmluZyA9IHRydWU7XG5cbiAgICB2YXIgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIHdoaWxlKGxlbikge1xuICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcbiAgICAgICAgcXVldWUgPSBbXTtcbiAgICAgICAgd2hpbGUgKCsrcXVldWVJbmRleCA8IGxlbikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRRdWV1ZVtxdWV1ZUluZGV4XS5ydW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBxdWV1ZUluZGV4ID0gLTE7XG4gICAgICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB9XG4gICAgY3VycmVudFF1ZXVlID0gbnVsbDtcbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcbn1cblxucHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcbiAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBhcmdzW2kgLSAxXSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5wdXNoKG5ldyBJdGVtKGZ1biwgYXJncykpO1xuICAgIGlmIChxdWV1ZS5sZW5ndGggPT09IDEgJiYgIWRyYWluaW5nKSB7XG4gICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG4gICAgfVxufTtcblxuLy8gdjggbGlrZXMgcHJlZGljdGlibGUgb2JqZWN0c1xuZnVuY3Rpb24gSXRlbShmdW4sIGFycmF5KSB7XG4gICAgdGhpcy5mdW4gPSBmdW47XG4gICAgdGhpcy5hcnJheSA9IGFycmF5O1xufVxuSXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZnVuLmFwcGx5KG51bGwsIHRoaXMuYXJyYXkpO1xufTtcbnByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5wcm9jZXNzLmJyb3dzZXIgPSB0cnVlO1xucHJvY2Vzcy5lbnYgPSB7fTtcbnByb2Nlc3MuYXJndiA9IFtdO1xucHJvY2Vzcy52ZXJzaW9uID0gJyc7IC8vIGVtcHR5IHN0cmluZyB0byBhdm9pZCByZWdleHAgaXNzdWVzXG5wcm9jZXNzLnZlcnNpb25zID0ge307XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5wcm9jZXNzLm9uID0gbm9vcDtcbnByb2Nlc3MuYWRkTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5vbmNlID0gbm9vcDtcbnByb2Nlc3Mub2ZmID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBub29wO1xucHJvY2Vzcy5lbWl0ID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucHJlcGVuZE9uY2VMaXN0ZW5lciA9IG5vb3A7XG5cbnByb2Nlc3MubGlzdGVuZXJzID0gZnVuY3Rpb24gKG5hbWUpIHsgcmV0dXJuIFtdIH1cblxucHJvY2Vzcy5iaW5kaW5nID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xuXG5wcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xucHJvY2Vzcy5jaGRpciA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcbnByb2Nlc3MudW1hc2sgPSBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH07XG4iLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG4gIHZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuICB2YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL2xpYi9SZWFjdFByb3BUeXBlc1NlY3JldCcpO1xuICB2YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG59XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIHZhbHVlcyBtYXRjaCB3aXRoIHRoZSB0eXBlIHNwZWNzLlxuICogRXJyb3IgbWVzc2FnZXMgYXJlIG1lbW9yaXplZCBhbmQgd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2YgbmFtZSB0byBhIFJlYWN0UHJvcFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgUnVudGltZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHR5cGUtY2hlY2tlZFxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIGUuZy4gXCJwcm9wXCIsIFwiY29udGV4dFwiLCBcImNoaWxkIGNvbnRleHRcIlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbXBvbmVudE5hbWUgTmFtZSBvZiB0aGUgY29tcG9uZW50IGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7P0Z1bmN0aW9ufSBnZXRTdGFjayBSZXR1cm5zIHRoZSBjb21wb25lbnQgc3RhY2suXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja1Byb3BUeXBlcyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGdldFN0YWNrKSB7XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICAgIGlmICh0eXBlU3BlY3MuaGFzT3duUHJvcGVydHkodHlwZVNwZWNOYW1lKSkge1xuICAgICAgICB2YXIgZXJyb3I7XG4gICAgICAgIC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgICAgLy8gQWZ0ZXIgdGhlc2UgaGF2ZSBiZWVuIGNsZWFuZWQgdXAsIHdlJ2xsIGxldCB0aGVtIHRocm93LlxuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAgIC8vIGJlaGF2aW9yIGFzIHdpdGhvdXQgdGhpcyBzdGF0ZW1lbnQgZXhjZXB0IHdpdGggYSBiZXR0ZXIgbWVzc2FnZS5cbiAgICAgICAgICBpbnZhcmlhbnQodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdID09PSAnZnVuY3Rpb24nLCAnJXM6ICVzIHR5cGUgYCVzYCBpcyBpbnZhbGlkOyBpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSAnICsgJ1JlYWN0LlByb3BUeXBlcy4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIGxvY2F0aW9uLCB0eXBlU3BlY05hbWUpO1xuICAgICAgICAgIGVycm9yID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgZXJyb3IgPSBleDtcbiAgICAgICAgfVxuICAgICAgICB3YXJuaW5nKCFlcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIEVycm9yLCAnJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBsb2NhdGlvbiwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IpO1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiAhKGVycm9yLm1lc3NhZ2UgaW4gbG9nZ2VkVHlwZUZhaWx1cmVzKSkge1xuICAgICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgICAgbG9nZ2VkVHlwZUZhaWx1cmVzW2Vycm9yLm1lc3NhZ2VdID0gdHJ1ZTtcblxuICAgICAgICAgIHZhciBzdGFjayA9IGdldFN0YWNrID8gZ2V0U3RhY2soKSA6ICcnO1xuXG4gICAgICAgICAgd2FybmluZyhmYWxzZSwgJ0ZhaWxlZCAlcyB0eXBlOiAlcyVzJywgbG9jYXRpb24sIGVycm9yLm1lc3NhZ2UsIHN0YWNrICE9IG51bGwgPyBzdGFjayA6ICcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNoZWNrUHJvcFR5cGVzO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyBSZWFjdCAxNS41IHJlZmVyZW5jZXMgdGhpcyBtb2R1bGUsIGFuZCBhc3N1bWVzIFByb3BUeXBlcyBhcmUgc3RpbGwgY2FsbGFibGUgaW4gcHJvZHVjdGlvbi5cbi8vIFRoZXJlZm9yZSB3ZSByZS1leHBvcnQgZGV2ZWxvcG1lbnQtb25seSB2ZXJzaW9uIHdpdGggYWxsIHRoZSBQcm9wVHlwZXMgY2hlY2tzIGhlcmUuXG4vLyBIb3dldmVyIGlmIG9uZSBpcyBtaWdyYXRpbmcgdG8gdGhlIGBwcm9wLXR5cGVzYCBucG0gbGlicmFyeSwgdGhleSB3aWxsIGdvIHRocm91Z2ggdGhlXG4vLyBgaW5kZXguanNgIGVudHJ5IHBvaW50LCBhbmQgaXQgd2lsbCBicmFuY2ggZGVwZW5kaW5nIG9uIHRoZSBlbnZpcm9ubWVudC5cbnZhciBmYWN0b3J5ID0gcmVxdWlyZSgnLi9mYWN0b3J5V2l0aFR5cGVDaGVja2VycycpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpc1ZhbGlkRWxlbWVudCkge1xuICAvLyBJdCBpcyBzdGlsbCBhbGxvd2VkIGluIDE1LjUuXG4gIHZhciB0aHJvd09uRGlyZWN0QWNjZXNzID0gZmFsc2U7XG4gIHJldHVybiBmYWN0b3J5KGlzVmFsaWRFbGVtZW50LCB0aHJvd09uRGlyZWN0QWNjZXNzKTtcbn07XG4iLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlGdW5jdGlvbicpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gcmVxdWlyZSgnLi9saWIvUmVhY3RQcm9wVHlwZXNTZWNyZXQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcbiAgZnVuY3Rpb24gc2hpbShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgIGlmIChzZWNyZXQgPT09IFJlYWN0UHJvcFR5cGVzU2VjcmV0KSB7XG4gICAgICAvLyBJdCBpcyBzdGlsbCBzYWZlIHdoZW4gY2FsbGVkIGZyb20gUmVhY3QuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGludmFyaWFudChcbiAgICAgIGZhbHNlLFxuICAgICAgJ0NhbGxpbmcgUHJvcFR5cGVzIHZhbGlkYXRvcnMgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgJ1VzZSBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKSB0byBjYWxsIHRoZW0uICcgK1xuICAgICAgJ1JlYWQgbW9yZSBhdCBodHRwOi8vZmIubWUvdXNlLWNoZWNrLXByb3AtdHlwZXMnXG4gICAgKTtcbiAgfTtcbiAgc2hpbS5pc1JlcXVpcmVkID0gc2hpbTtcbiAgZnVuY3Rpb24gZ2V0U2hpbSgpIHtcbiAgICByZXR1cm4gc2hpbTtcbiAgfTtcbiAgLy8gSW1wb3J0YW50IVxuICAvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggcHJvZHVjdGlvbiB2ZXJzaW9uIGluIGAuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzLmpzYC5cbiAgdmFyIFJlYWN0UHJvcFR5cGVzID0ge1xuICAgIGFycmF5OiBzaGltLFxuICAgIGJvb2w6IHNoaW0sXG4gICAgZnVuYzogc2hpbSxcbiAgICBudW1iZXI6IHNoaW0sXG4gICAgb2JqZWN0OiBzaGltLFxuICAgIHN0cmluZzogc2hpbSxcbiAgICBzeW1ib2w6IHNoaW0sXG5cbiAgICBhbnk6IHNoaW0sXG4gICAgYXJyYXlPZjogZ2V0U2hpbSxcbiAgICBlbGVtZW50OiBzaGltLFxuICAgIGluc3RhbmNlT2Y6IGdldFNoaW0sXG4gICAgbm9kZTogc2hpbSxcbiAgICBvYmplY3RPZjogZ2V0U2hpbSxcbiAgICBvbmVPZjogZ2V0U2hpbSxcbiAgICBvbmVPZlR5cGU6IGdldFNoaW0sXG4gICAgc2hhcGU6IGdldFNoaW1cbiAgfTtcblxuICBSZWFjdFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcyA9IGVtcHR5RnVuY3Rpb247XG4gIFJlYWN0UHJvcFR5cGVzLlByb3BUeXBlcyA9IFJlYWN0UHJvcFR5cGVzO1xuXG4gIHJldHVybiBSZWFjdFByb3BUeXBlcztcbn07XG4iLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlGdW5jdGlvbicpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBSZWFjdFByb3BUeXBlc1NlY3JldCA9IHJlcXVpcmUoJy4vbGliL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG52YXIgY2hlY2tQcm9wVHlwZXMgPSByZXF1aXJlKCcuL2NoZWNrUHJvcFR5cGVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXNWYWxpZEVsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpIHtcbiAgLyogZ2xvYmFsIFN5bWJvbCAqL1xuICB2YXIgSVRFUkFUT1JfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wuaXRlcmF0b3I7XG4gIHZhciBGQVVYX0lURVJBVE9SX1NZTUJPTCA9ICdAQGl0ZXJhdG9yJzsgLy8gQmVmb3JlIFN5bWJvbCBzcGVjLlxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBpdGVyYXRvciBtZXRob2QgZnVuY3Rpb24gY29udGFpbmVkIG9uIHRoZSBpdGVyYWJsZSBvYmplY3QuXG4gICAqXG4gICAqIEJlIHN1cmUgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBpdGVyYWJsZSBhcyBjb250ZXh0OlxuICAgKlxuICAgKiAgICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKG15SXRlcmFibGUpO1xuICAgKiAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICogICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKG15SXRlcmFibGUpO1xuICAgKiAgICAgICAuLi5cbiAgICogICAgIH1cbiAgICpcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBtYXliZUl0ZXJhYmxlXG4gICAqIEByZXR1cm4gez9mdW5jdGlvbn1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEl0ZXJhdG9yRm4obWF5YmVJdGVyYWJsZSkge1xuICAgIHZhciBpdGVyYXRvckZuID0gbWF5YmVJdGVyYWJsZSAmJiAoSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXSk7XG4gICAgaWYgKHR5cGVvZiBpdGVyYXRvckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaXRlcmF0b3JGbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBtZXRob2RzIHRoYXQgYWxsb3cgZGVjbGFyYXRpb24gYW5kIHZhbGlkYXRpb24gb2YgcHJvcHMgdGhhdCBhcmVcbiAgICogc3VwcGxpZWQgdG8gUmVhY3QgY29tcG9uZW50cy4gRXhhbXBsZSB1c2FnZTpcbiAgICpcbiAgICogICB2YXIgUHJvcHMgPSByZXF1aXJlKCdSZWFjdFByb3BUeXBlcycpO1xuICAgKiAgIHZhciBNeUFydGljbGUgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG4gICAqICAgICBwcm9wVHlwZXM6IHtcbiAgICogICAgICAgLy8gQW4gb3B0aW9uYWwgc3RyaW5nIHByb3AgbmFtZWQgXCJkZXNjcmlwdGlvblwiLlxuICAgKiAgICAgICBkZXNjcmlwdGlvbjogUHJvcHMuc3RyaW5nLFxuICAgKlxuICAgKiAgICAgICAvLyBBIHJlcXVpcmVkIGVudW0gcHJvcCBuYW1lZCBcImNhdGVnb3J5XCIuXG4gICAqICAgICAgIGNhdGVnb3J5OiBQcm9wcy5vbmVPZihbJ05ld3MnLCdQaG90b3MnXSkuaXNSZXF1aXJlZCxcbiAgICpcbiAgICogICAgICAgLy8gQSBwcm9wIG5hbWVkIFwiZGlhbG9nXCIgdGhhdCByZXF1aXJlcyBhbiBpbnN0YW5jZSBvZiBEaWFsb2cuXG4gICAqICAgICAgIGRpYWxvZzogUHJvcHMuaW5zdGFuY2VPZihEaWFsb2cpLmlzUmVxdWlyZWRcbiAgICogICAgIH0sXG4gICAqICAgICByZW5kZXI6IGZ1bmN0aW9uKCkgeyAuLi4gfVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiBBIG1vcmUgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgaG93IHRoZXNlIG1ldGhvZHMgYXJlIHVzZWQ6XG4gICAqXG4gICAqICAgdHlwZSA6PSBhcnJheXxib29sfGZ1bmN8b2JqZWN0fG51bWJlcnxzdHJpbmd8b25lT2YoWy4uLl0pfGluc3RhbmNlT2YoLi4uKVxuICAgKiAgIGRlY2wgOj0gUmVhY3RQcm9wVHlwZXMue3R5cGV9KC5pc1JlcXVpcmVkKT9cbiAgICpcbiAgICogRWFjaCBhbmQgZXZlcnkgZGVjbGFyYXRpb24gcHJvZHVjZXMgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZS4gVGhpc1xuICAgKiBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9ucy4gRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqICB2YXIgTXlMaW5rID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuICAgKiAgICBwcm9wVHlwZXM6IHtcbiAgICogICAgICAvLyBBbiBvcHRpb25hbCBzdHJpbmcgb3IgVVJJIHByb3AgbmFtZWQgXCJocmVmXCIuXG4gICAqICAgICAgaHJlZjogZnVuY3Rpb24ocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lKSB7XG4gICAqICAgICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgKiAgICAgICAgaWYgKHByb3BWYWx1ZSAhPSBudWxsICYmIHR5cGVvZiBwcm9wVmFsdWUgIT09ICdzdHJpbmcnICYmXG4gICAqICAgICAgICAgICAgIShwcm9wVmFsdWUgaW5zdGFuY2VvZiBVUkkpKSB7XG4gICAqICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoXG4gICAqICAgICAgICAgICAgJ0V4cGVjdGVkIGEgc3RyaW5nIG9yIGFuIFVSSSBmb3IgJyArIHByb3BOYW1lICsgJyBpbiAnICtcbiAgICogICAgICAgICAgICBjb21wb25lbnROYW1lXG4gICAqICAgICAgICAgICk7XG4gICAqICAgICAgICB9XG4gICAqICAgICAgfVxuICAgKiAgICB9LFxuICAgKiAgICByZW5kZXI6IGZ1bmN0aW9uKCkgey4uLn1cbiAgICogIH0pO1xuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cbiAgdmFyIEFOT05ZTU9VUyA9ICc8PGFub255bW91cz4+JztcblxuICAvLyBJbXBvcnRhbnQhXG4gIC8vIEtlZXAgdGhpcyBsaXN0IGluIHN5bmMgd2l0aCBwcm9kdWN0aW9uIHZlcnNpb24gaW4gYC4vZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zLmpzYC5cbiAgdmFyIFJlYWN0UHJvcFR5cGVzID0ge1xuICAgIGFycmF5OiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYXJyYXknKSxcbiAgICBib29sOiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcignYm9vbGVhbicpLFxuICAgIGZ1bmM6IGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyKCdmdW5jdGlvbicpLFxuICAgIG51bWJlcjogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ251bWJlcicpLFxuICAgIG9iamVjdDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ29iamVjdCcpLFxuICAgIHN0cmluZzogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N0cmluZycpLFxuICAgIHN5bWJvbDogY3JlYXRlUHJpbWl0aXZlVHlwZUNoZWNrZXIoJ3N5bWJvbCcpLFxuXG4gICAgYW55OiBjcmVhdGVBbnlUeXBlQ2hlY2tlcigpLFxuICAgIGFycmF5T2Y6IGNyZWF0ZUFycmF5T2ZUeXBlQ2hlY2tlcixcbiAgICBlbGVtZW50OiBjcmVhdGVFbGVtZW50VHlwZUNoZWNrZXIoKSxcbiAgICBpbnN0YW5jZU9mOiBjcmVhdGVJbnN0YW5jZVR5cGVDaGVja2VyLFxuICAgIG5vZGU6IGNyZWF0ZU5vZGVDaGVja2VyKCksXG4gICAgb2JqZWN0T2Y6IGNyZWF0ZU9iamVjdE9mVHlwZUNoZWNrZXIsXG4gICAgb25lT2Y6IGNyZWF0ZUVudW1UeXBlQ2hlY2tlcixcbiAgICBvbmVPZlR5cGU6IGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIsXG4gICAgc2hhcGU6IGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXJcbiAgfTtcblxuICAvKipcbiAgICogaW5saW5lZCBPYmplY3QuaXMgcG9seWZpbGwgdG8gYXZvaWQgcmVxdWlyaW5nIGNvbnN1bWVycyBzaGlwIHRoZWlyIG93blxuICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvaXNcbiAgICovXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tc2VsZi1jb21wYXJlKi9cbiAgZnVuY3Rpb24gaXMoeCwgeSkge1xuICAgIC8vIFNhbWVWYWx1ZSBhbGdvcml0aG1cbiAgICBpZiAoeCA9PT0geSkge1xuICAgICAgLy8gU3RlcHMgMS01LCA3LTEwXG4gICAgICAvLyBTdGVwcyA2LmItNi5lOiArMCAhPSAtMFxuICAgICAgcmV0dXJuIHggIT09IDAgfHwgMSAvIHggPT09IDEgLyB5O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTdGVwIDYuYTogTmFOID09IE5hTlxuICAgICAgcmV0dXJuIHggIT09IHggJiYgeSAhPT0geTtcbiAgICB9XG4gIH1cbiAgLyplc2xpbnQtZW5hYmxlIG5vLXNlbGYtY29tcGFyZSovXG5cbiAgLyoqXG4gICAqIFdlIHVzZSBhbiBFcnJvci1saWtlIG9iamVjdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhcyBwZW9wbGUgbWF5IGNhbGxcbiAgICogUHJvcFR5cGVzIGRpcmVjdGx5IGFuZCBpbnNwZWN0IHRoZWlyIG91dHB1dC4gSG93ZXZlciwgd2UgZG9uJ3QgdXNlIHJlYWxcbiAgICogRXJyb3JzIGFueW1vcmUuIFdlIGRvbid0IGluc3BlY3QgdGhlaXIgc3RhY2sgYW55d2F5LCBhbmQgY3JlYXRpbmcgdGhlbVxuICAgKiBpcyBwcm9oaWJpdGl2ZWx5IGV4cGVuc2l2ZSBpZiB0aGV5IGFyZSBjcmVhdGVkIHRvbyBvZnRlbiwgc3VjaCBhcyB3aGF0XG4gICAqIGhhcHBlbnMgaW4gb25lT2ZUeXBlKCkgZm9yIGFueSB0eXBlIGJlZm9yZSB0aGUgb25lIHRoYXQgbWF0Y2hlZC5cbiAgICovXG4gIGZ1bmN0aW9uIFByb3BUeXBlRXJyb3IobWVzc2FnZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5zdGFjayA9ICcnO1xuICB9XG4gIC8vIE1ha2UgYGluc3RhbmNlb2YgRXJyb3JgIHN0aWxsIHdvcmsgZm9yIHJldHVybmVkIGVycm9ycy5cbiAgUHJvcFR5cGVFcnJvci5wcm90b3R5cGUgPSBFcnJvci5wcm90b3R5cGU7XG5cbiAgZnVuY3Rpb24gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpIHtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBtYW51YWxQcm9wVHlwZUNhbGxDYWNoZSA9IHt9O1xuICAgICAgdmFyIG1hbnVhbFByb3BUeXBlV2FybmluZ0NvdW50ID0gMDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tUeXBlKGlzUmVxdWlyZWQsIHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgc2VjcmV0KSB7XG4gICAgICBjb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZSB8fCBBTk9OWU1PVVM7XG4gICAgICBwcm9wRnVsbE5hbWUgPSBwcm9wRnVsbE5hbWUgfHwgcHJvcE5hbWU7XG5cbiAgICAgIGlmIChzZWNyZXQgIT09IFJlYWN0UHJvcFR5cGVzU2VjcmV0KSB7XG4gICAgICAgIGlmICh0aHJvd09uRGlyZWN0QWNjZXNzKSB7XG4gICAgICAgICAgLy8gTmV3IGJlaGF2aW9yIG9ubHkgZm9yIHVzZXJzIG9mIGBwcm9wLXR5cGVzYCBwYWNrYWdlXG4gICAgICAgICAgaW52YXJpYW50KFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAnQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gJyArXG4gICAgICAgICAgICAnVXNlIGBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKWAgdG8gY2FsbCB0aGVtLiAnICtcbiAgICAgICAgICAgICdSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzJ1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gT2xkIGJlaGF2aW9yIGZvciBwZW9wbGUgdXNpbmcgUmVhY3QuUHJvcFR5cGVzXG4gICAgICAgICAgdmFyIGNhY2hlS2V5ID0gY29tcG9uZW50TmFtZSArICc6JyArIHByb3BOYW1lO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFtYW51YWxQcm9wVHlwZUNhbGxDYWNoZVtjYWNoZUtleV0gJiZcbiAgICAgICAgICAgIC8vIEF2b2lkIHNwYW1taW5nIHRoZSBjb25zb2xlIGJlY2F1c2UgdGhleSBhcmUgb2Z0ZW4gbm90IGFjdGlvbmFibGUgZXhjZXB0IGZvciBsaWIgYXV0aG9yc1xuICAgICAgICAgICAgbWFudWFsUHJvcFR5cGVXYXJuaW5nQ291bnQgPCAzXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB3YXJuaW5nKFxuICAgICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgJ1lvdSBhcmUgbWFudWFsbHkgY2FsbGluZyBhIFJlYWN0LlByb3BUeXBlcyB2YWxpZGF0aW9uICcgK1xuICAgICAgICAgICAgICAnZnVuY3Rpb24gZm9yIHRoZSBgJXNgIHByb3Agb24gYCVzYC4gVGhpcyBpcyBkZXByZWNhdGVkICcgK1xuICAgICAgICAgICAgICAnYW5kIHdpbGwgdGhyb3cgaW4gdGhlIHN0YW5kYWxvbmUgYHByb3AtdHlwZXNgIHBhY2thZ2UuICcgK1xuICAgICAgICAgICAgICAnWW91IG1heSBiZSBzZWVpbmcgdGhpcyB3YXJuaW5nIGR1ZSB0byBhIHRoaXJkLXBhcnR5IFByb3BUeXBlcyAnICtcbiAgICAgICAgICAgICAgJ2xpYnJhcnkuIFNlZSBodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmctZG9udC1jYWxsLXByb3B0eXBlcyAnICsgJ2ZvciBkZXRhaWxzLicsXG4gICAgICAgICAgICAgIHByb3BGdWxsTmFtZSxcbiAgICAgICAgICAgICAgY29tcG9uZW50TmFtZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1hbnVhbFByb3BUeXBlQ2FsbENhY2hlW2NhY2hlS2V5XSA9IHRydWU7XG4gICAgICAgICAgICBtYW51YWxQcm9wVHlwZVdhcm5pbmdDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChpc1JlcXVpcmVkKSB7XG4gICAgICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdUaGUgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIGlzIG1hcmtlZCBhcyByZXF1aXJlZCAnICsgKCdpbiBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgYnV0IGl0cyB2YWx1ZSBpcyBgbnVsbGAuJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1RoZSAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2AgaXMgbWFya2VkIGFzIHJlcXVpcmVkIGluICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBidXQgaXRzIHZhbHVlIGlzIGB1bmRlZmluZWRgLicpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBjaGFpbmVkQ2hlY2tUeXBlID0gY2hlY2tUeXBlLmJpbmQobnVsbCwgZmFsc2UpO1xuICAgIGNoYWluZWRDaGVja1R5cGUuaXNSZXF1aXJlZCA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIHRydWUpO1xuXG4gICAgcmV0dXJuIGNoYWluZWRDaGVja1R5cGU7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVQcmltaXRpdmVUeXBlQ2hlY2tlcihleHBlY3RlZFR5cGUpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUsIHNlY3JldCkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgICAvLyBgcHJvcFZhbHVlYCBiZWluZyBpbnN0YW5jZSBvZiwgc2F5LCBkYXRlL3JlZ2V4cCwgcGFzcyB0aGUgJ29iamVjdCdcbiAgICAgICAgLy8gY2hlY2ssIGJ1dCB3ZSBjYW4gb2ZmZXIgYSBtb3JlIHByZWNpc2UgZXJyb3IgbWVzc2FnZSBoZXJlIHJhdGhlciB0aGFuXG4gICAgICAgIC8vICdvZiB0eXBlIGBvYmplY3RgJy5cbiAgICAgICAgdmFyIHByZWNpc2VUeXBlID0gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcmVjaXNlVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCAnKSArICgnYCcgKyBleHBlY3RlZFR5cGUgKyAnYC4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUFueVR5cGVDaGVja2VyKCkge1xuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcihlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbCk7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVBcnJheU9mVHlwZUNoZWNrZXIodHlwZUNoZWNrZXIpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGlmICh0eXBlb2YgdHlwZUNoZWNrZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdQcm9wZXJ0eSBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIGNvbXBvbmVudCBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgYXJyYXlPZi4nKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBhcnJheS4nKSk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGksIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUgKyAnWycgKyBpICsgJ10nLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRUeXBlQ2hlY2tlcigpIHtcbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICBpZiAoIWlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgdmFyIHByb3BUeXBlID0gZ2V0UHJvcFR5cGUocHJvcFZhbHVlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB0eXBlICcgKyAoJ2AnICsgcHJvcFR5cGUgKyAnYCBzdXBwbGllZCB0byBgJyArIGNvbXBvbmVudE5hbWUgKyAnYCwgZXhwZWN0ZWQgYSBzaW5nbGUgUmVhY3RFbGVtZW50LicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VUeXBlQ2hlY2tlcihleHBlY3RlZENsYXNzKSB7XG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICBpZiAoIShwcm9wc1twcm9wTmFtZV0gaW5zdGFuY2VvZiBleHBlY3RlZENsYXNzKSkge1xuICAgICAgICB2YXIgZXhwZWN0ZWRDbGFzc05hbWUgPSBleHBlY3RlZENsYXNzLm5hbWUgfHwgQU5PTllNT1VTO1xuICAgICAgICB2YXIgYWN0dWFsQ2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKHByb3BzW3Byb3BOYW1lXSk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSAnICsgKCdgJyArIGFjdHVhbENsYXNzTmFtZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCAnKSArICgnaW5zdGFuY2Ugb2YgYCcgKyBleHBlY3RlZENsYXNzTmFtZSArICdgLicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlRW51bVR5cGVDaGVja2VyKGV4cGVjdGVkVmFsdWVzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGV4cGVjdGVkVmFsdWVzKSkge1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZiwgZXhwZWN0ZWQgYW4gaW5zdGFuY2Ugb2YgYXJyYXkuJykgOiB2b2lkIDA7XG4gICAgICByZXR1cm4gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc051bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gICAgICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHBlY3RlZFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoaXMocHJvcFZhbHVlLCBleHBlY3RlZFZhbHVlc1tpXSkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgdmFsdWVzU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoZXhwZWN0ZWRWYWx1ZXMpO1xuICAgICAgcmV0dXJuIG5ldyBQcm9wVHlwZUVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB2YWx1ZSBgJyArIHByb3BWYWx1ZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBvbmUgb2YgJyArIHZhbHVlc1N0cmluZyArICcuJykpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY3JlYXRlT2JqZWN0T2ZUeXBlQ2hlY2tlcih0eXBlQ2hlY2tlcikge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlQ2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ1Byb3BlcnR5IGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgY29tcG9uZW50IGAnICsgY29tcG9uZW50TmFtZSArICdgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBvYmplY3RPZi4nKTtcbiAgICAgIH1cbiAgICAgIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gICAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgICAgaWYgKHByb3BUeXBlICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgJyArICgnYCcgKyBwcm9wVHlwZSArICdgIHN1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBvYmplY3QuJykpO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIga2V5IGluIHByb3BWYWx1ZSkge1xuICAgICAgICBpZiAocHJvcFZhbHVlLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICB2YXIgZXJyb3IgPSB0eXBlQ2hlY2tlcihwcm9wVmFsdWUsIGtleSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSArICcuJyArIGtleSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpO1xuICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVVuaW9uVHlwZUNoZWNrZXIoYXJyYXlPZlR5cGVDaGVja2Vycykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShhcnJheU9mVHlwZUNoZWNrZXJzKSkge1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LicpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNOdWxsO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoZWNrZXIgPSBhcnJheU9mVHlwZUNoZWNrZXJzW2ldO1xuICAgICAgaWYgKHR5cGVvZiBjaGVja2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdhcm5pbmcoXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgJ0ludmFsaWQgYXJndW1lbnQgc3VwcGxpZCB0byBvbmVPZlR5cGUuIEV4cGVjdGVkIGFuIGFycmF5IG9mIGNoZWNrIGZ1bmN0aW9ucywgYnV0ICcgK1xuICAgICAgICAgICdyZWNlaXZlZCAlcyBhdCBpbmRleCAlcy4nLFxuICAgICAgICAgIGdldFBvc3RmaXhGb3JUeXBlV2FybmluZyhjaGVja2VyKSxcbiAgICAgICAgICBpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXlPZlR5cGVDaGVja2Vycy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgY2hlY2tlciA9IGFycmF5T2ZUeXBlQ2hlY2tlcnNbaV07XG4gICAgICAgIGlmIChjaGVja2VyKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSwgUmVhY3RQcm9wVHlwZXNTZWNyZXQpID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLicpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZU5vZGVDaGVja2VyKCkge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgaWYgKCFpc05vZGUocHJvcHNbcHJvcE5hbWVdKSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb3BUeXBlRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIHN1cHBsaWVkIHRvICcgKyAoJ2AnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIFJlYWN0Tm9kZS4nKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGNyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKHZhbGlkYXRlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZVNoYXBlVHlwZUNoZWNrZXIoc2hhcGVUeXBlcykge1xuICAgIGZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BOYW1lXTtcbiAgICAgIHZhciBwcm9wVHlwZSA9IGdldFByb3BUeXBlKHByb3BWYWx1ZSk7XG4gICAgICBpZiAocHJvcFR5cGUgIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvcFR5cGVFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBgJyArIHByb3BUeXBlICsgJ2AgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGBvYmplY3RgLicpKTtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGtleSBpbiBzaGFwZVR5cGVzKSB7XG4gICAgICAgIHZhciBjaGVja2VyID0gc2hhcGVUeXBlc1trZXldO1xuICAgICAgICBpZiAoIWNoZWNrZXIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZXJyb3IgPSBjaGVja2VyKHByb3BWYWx1ZSwga2V5LCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lICsgJy4nICsga2V5LCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcih2YWxpZGF0ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc05vZGUocHJvcFZhbHVlKSB7XG4gICAgc3dpdGNoICh0eXBlb2YgcHJvcFZhbHVlKSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIHJldHVybiAhcHJvcFZhbHVlO1xuICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHJvcFZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBwcm9wVmFsdWUuZXZlcnkoaXNOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcFZhbHVlID09PSBudWxsIHx8IGlzVmFsaWRFbGVtZW50KHByb3BWYWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihwcm9wVmFsdWUpO1xuICAgICAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChwcm9wVmFsdWUpO1xuICAgICAgICAgIHZhciBzdGVwO1xuICAgICAgICAgIGlmIChpdGVyYXRvckZuICE9PSBwcm9wVmFsdWUuZW50cmllcykge1xuICAgICAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgICAgICBpZiAoIWlzTm9kZShzdGVwLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJdGVyYXRvciB3aWxsIHByb3ZpZGUgZW50cnkgW2ssdl0gdHVwbGVzIHJhdGhlciB0aGFuIHZhbHVlcy5cbiAgICAgICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05vZGUoZW50cnlbMV0pKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzU3ltYm9sKHByb3BUeXBlLCBwcm9wVmFsdWUpIHtcbiAgICAvLyBOYXRpdmUgU3ltYm9sLlxuICAgIGlmIChwcm9wVHlwZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ10gPT09ICdTeW1ib2wnXG4gICAgaWYgKHByb3BWYWx1ZVsnQEB0b1N0cmluZ1RhZyddID09PSAnU3ltYm9sJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgZm9yIG5vbi1zcGVjIGNvbXBsaWFudCBTeW1ib2xzIHdoaWNoIGFyZSBwb2x5ZmlsbGVkLlxuICAgIGlmICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIHByb3BWYWx1ZSBpbnN0YW5jZW9mIFN5bWJvbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gRXF1aXZhbGVudCBvZiBgdHlwZW9mYCBidXQgd2l0aCBzcGVjaWFsIGhhbmRsaW5nIGZvciBhcnJheSBhbmQgcmVnZXhwLlxuICBmdW5jdGlvbiBnZXRQcm9wVHlwZShwcm9wVmFsdWUpIHtcbiAgICB2YXIgcHJvcFR5cGUgPSB0eXBlb2YgcHJvcFZhbHVlO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHByb3BWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnYXJyYXknO1xuICAgIH1cbiAgICBpZiAocHJvcFZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICAvLyBPbGQgd2Via2l0cyAoYXQgbGVhc3QgdW50aWwgQW5kcm9pZCA0LjApIHJldHVybiAnZnVuY3Rpb24nIHJhdGhlciB0aGFuXG4gICAgICAvLyAnb2JqZWN0JyBmb3IgdHlwZW9mIGEgUmVnRXhwLiBXZSdsbCBub3JtYWxpemUgdGhpcyBoZXJlIHNvIHRoYXQgL2JsYS9cbiAgICAgIC8vIHBhc3NlcyBQcm9wVHlwZXMub2JqZWN0LlxuICAgICAgcmV0dXJuICdvYmplY3QnO1xuICAgIH1cbiAgICBpZiAoaXNTeW1ib2wocHJvcFR5cGUsIHByb3BWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnc3ltYm9sJztcbiAgICB9XG4gICAgcmV0dXJuIHByb3BUeXBlO1xuICB9XG5cbiAgLy8gVGhpcyBoYW5kbGVzIG1vcmUgdHlwZXMgdGhhbiBgZ2V0UHJvcFR5cGVgLiBPbmx5IHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICAvLyBTZWUgYGNyZWF0ZVByaW1pdGl2ZVR5cGVDaGVja2VyYC5cbiAgZnVuY3Rpb24gZ2V0UHJlY2lzZVR5cGUocHJvcFZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHByb3BWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnICsgcHJvcFZhbHVlO1xuICAgIH1cbiAgICB2YXIgcHJvcFR5cGUgPSBnZXRQcm9wVHlwZShwcm9wVmFsdWUpO1xuICAgIGlmIChwcm9wVHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChwcm9wVmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIHJldHVybiAnZGF0ZSc7XG4gICAgICB9IGVsc2UgaWYgKHByb3BWYWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgICByZXR1cm4gJ3JlZ2V4cCc7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wVHlwZTtcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpcyBwb3N0Zml4ZWQgdG8gYSB3YXJuaW5nIGFib3V0IGFuIGludmFsaWQgdHlwZS5cbiAgLy8gRm9yIGV4YW1wbGUsIFwidW5kZWZpbmVkXCIgb3IgXCJvZiB0eXBlIGFycmF5XCJcbiAgZnVuY3Rpb24gZ2V0UG9zdGZpeEZvclR5cGVXYXJuaW5nKHZhbHVlKSB7XG4gICAgdmFyIHR5cGUgPSBnZXRQcmVjaXNlVHlwZSh2YWx1ZSk7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdhcnJheSc6XG4gICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICByZXR1cm4gJ2FuICcgKyB0eXBlO1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgIGNhc2UgJ3JlZ2V4cCc6XG4gICAgICAgIHJldHVybiAnYSAnICsgdHlwZTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0eXBlO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJldHVybnMgY2xhc3MgbmFtZSBvZiB0aGUgb2JqZWN0LCBpZiBhbnkuXG4gIGZ1bmN0aW9uIGdldENsYXNzTmFtZShwcm9wVmFsdWUpIHtcbiAgICBpZiAoIXByb3BWYWx1ZS5jb25zdHJ1Y3RvciB8fCAhcHJvcFZhbHVlLmNvbnN0cnVjdG9yLm5hbWUpIHtcbiAgICAgIHJldHVybiBBTk9OWU1PVVM7XG4gICAgfVxuICAgIHJldHVybiBwcm9wVmFsdWUuY29uc3RydWN0b3IubmFtZTtcbiAgfVxuXG4gIFJlYWN0UHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzID0gY2hlY2tQcm9wVHlwZXM7XG4gIFJlYWN0UHJvcFR5cGVzLlByb3BUeXBlcyA9IFJlYWN0UHJvcFR5cGVzO1xuXG4gIHJldHVybiBSZWFjdFByb3BUeXBlcztcbn07XG4iLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9ICh0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmXG4gICAgU3ltYm9sLmZvciAmJlxuICAgIFN5bWJvbC5mb3IoJ3JlYWN0LmVsZW1lbnQnKSkgfHxcbiAgICAweGVhYzc7XG5cbiAgdmFyIGlzVmFsaWRFbGVtZW50ID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnICYmXG4gICAgICBvYmplY3QgIT09IG51bGwgJiZcbiAgICAgIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xuICB9O1xuXG4gIC8vIEJ5IGV4cGxpY2l0bHkgdXNpbmcgYHByb3AtdHlwZXNgIHlvdSBhcmUgb3B0aW5nIGludG8gbmV3IGRldmVsb3BtZW50IGJlaGF2aW9yLlxuICAvLyBodHRwOi8vZmIubWUvcHJvcC10eXBlcy1pbi1wcm9kXG4gIHZhciB0aHJvd09uRGlyZWN0QWNjZXNzID0gdHJ1ZTtcbiAgbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2ZhY3RvcnlXaXRoVHlwZUNoZWNrZXJzJykoaXNWYWxpZEVsZW1lbnQsIHRocm93T25EaXJlY3RBY2Nlc3MpO1xufSBlbHNlIHtcbiAgLy8gQnkgZXhwbGljaXRseSB1c2luZyBgcHJvcC10eXBlc2AgeW91IGFyZSBvcHRpbmcgaW50byBuZXcgcHJvZHVjdGlvbiBiZWhhdmlvci5cbiAgLy8gaHR0cDovL2ZiLm1lL3Byb3AtdHlwZXMtaW4tcHJvZFxuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vZmFjdG9yeVdpdGhUaHJvd2luZ1NoaW1zJykoKTtcbn1cbiIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVzU2VjcmV0ID0gJ1NFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEJztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFByb3BUeXBlc1NlY3JldDtcbiIsIi8qISBodHRwczovL210aHMuYmUvcHVueWNvZGUgdjEuNC4xIGJ5IEBtYXRoaWFzICovXG47KGZ1bmN0aW9uKHJvb3QpIHtcblxuXHQvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGVzICovXG5cdHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHMgJiZcblx0XHQhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzO1xuXHR2YXIgZnJlZU1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmXG5cdFx0IW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7XG5cdHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWw7XG5cdGlmIChcblx0XHRmcmVlR2xvYmFsLmdsb2JhbCA9PT0gZnJlZUdsb2JhbCB8fFxuXHRcdGZyZWVHbG9iYWwud2luZG93ID09PSBmcmVlR2xvYmFsIHx8XG5cdFx0ZnJlZUdsb2JhbC5zZWxmID09PSBmcmVlR2xvYmFsXG5cdCkge1xuXHRcdHJvb3QgPSBmcmVlR2xvYmFsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBgcHVueWNvZGVgIG9iamVjdC5cblx0ICogQG5hbWUgcHVueWNvZGVcblx0ICogQHR5cGUgT2JqZWN0XG5cdCAqL1xuXHR2YXIgcHVueWNvZGUsXG5cblx0LyoqIEhpZ2hlc3QgcG9zaXRpdmUgc2lnbmVkIDMyLWJpdCBmbG9hdCB2YWx1ZSAqL1xuXHRtYXhJbnQgPSAyMTQ3NDgzNjQ3LCAvLyBha2EuIDB4N0ZGRkZGRkYgb3IgMl4zMS0xXG5cblx0LyoqIEJvb3RzdHJpbmcgcGFyYW1ldGVycyAqL1xuXHRiYXNlID0gMzYsXG5cdHRNaW4gPSAxLFxuXHR0TWF4ID0gMjYsXG5cdHNrZXcgPSAzOCxcblx0ZGFtcCA9IDcwMCxcblx0aW5pdGlhbEJpYXMgPSA3Mixcblx0aW5pdGlhbE4gPSAxMjgsIC8vIDB4ODBcblx0ZGVsaW1pdGVyID0gJy0nLCAvLyAnXFx4MkQnXG5cblx0LyoqIFJlZ3VsYXIgZXhwcmVzc2lvbnMgKi9cblx0cmVnZXhQdW55Y29kZSA9IC9eeG4tLS8sXG5cdHJlZ2V4Tm9uQVNDSUkgPSAvW15cXHgyMC1cXHg3RV0vLCAvLyB1bnByaW50YWJsZSBBU0NJSSBjaGFycyArIG5vbi1BU0NJSSBjaGFyc1xuXHRyZWdleFNlcGFyYXRvcnMgPSAvW1xceDJFXFx1MzAwMlxcdUZGMEVcXHVGRjYxXS9nLCAvLyBSRkMgMzQ5MCBzZXBhcmF0b3JzXG5cblx0LyoqIEVycm9yIG1lc3NhZ2VzICovXG5cdGVycm9ycyA9IHtcblx0XHQnb3ZlcmZsb3cnOiAnT3ZlcmZsb3c6IGlucHV0IG5lZWRzIHdpZGVyIGludGVnZXJzIHRvIHByb2Nlc3MnLFxuXHRcdCdub3QtYmFzaWMnOiAnSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KScsXG5cdFx0J2ludmFsaWQtaW5wdXQnOiAnSW52YWxpZCBpbnB1dCdcblx0fSxcblxuXHQvKiogQ29udmVuaWVuY2Ugc2hvcnRjdXRzICovXG5cdGJhc2VNaW51c1RNaW4gPSBiYXNlIC0gdE1pbixcblx0Zmxvb3IgPSBNYXRoLmZsb29yLFxuXHRzdHJpbmdGcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLFxuXG5cdC8qKiBUZW1wb3JhcnkgdmFyaWFibGUgKi9cblx0a2V5O1xuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdC8qKlxuXHQgKiBBIGdlbmVyaWMgZXJyb3IgdXRpbGl0eSBmdW5jdGlvbi5cblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIGVycm9yIHR5cGUuXG5cdCAqIEByZXR1cm5zIHtFcnJvcn0gVGhyb3dzIGEgYFJhbmdlRXJyb3JgIHdpdGggdGhlIGFwcGxpY2FibGUgZXJyb3IgbWVzc2FnZS5cblx0ICovXG5cdGZ1bmN0aW9uIGVycm9yKHR5cGUpIHtcblx0XHR0aHJvdyBuZXcgUmFuZ2VFcnJvcihlcnJvcnNbdHlwZV0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgZ2VuZXJpYyBgQXJyYXkjbWFwYCB1dGlsaXR5IGZ1bmN0aW9uLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnkgYXJyYXlcblx0ICogaXRlbS5cblx0ICogQHJldHVybnMge0FycmF5fSBBIG5ldyBhcnJheSBvZiB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuXHQgKi9cblx0ZnVuY3Rpb24gbWFwKGFycmF5LCBmbikge1xuXHRcdHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cdFx0dmFyIHJlc3VsdCA9IFtdO1xuXHRcdHdoaWxlIChsZW5ndGgtLSkge1xuXHRcdFx0cmVzdWx0W2xlbmd0aF0gPSBmbihhcnJheVtsZW5ndGhdKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBBIHNpbXBsZSBgQXJyYXkjbWFwYC1saWtlIHdyYXBwZXIgdG8gd29yayB3aXRoIGRvbWFpbiBuYW1lIHN0cmluZ3Mgb3IgZW1haWxcblx0ICogYWRkcmVzc2VzLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gZG9tYWluIFRoZSBkb21haW4gbmFtZSBvciBlbWFpbCBhZGRyZXNzLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBmb3IgZXZlcnlcblx0ICogY2hhcmFjdGVyLlxuXHQgKiBAcmV0dXJucyB7QXJyYXl9IEEgbmV3IHN0cmluZyBvZiBjaGFyYWN0ZXJzIHJldHVybmVkIGJ5IHRoZSBjYWxsYmFja1xuXHQgKiBmdW5jdGlvbi5cblx0ICovXG5cdGZ1bmN0aW9uIG1hcERvbWFpbihzdHJpbmcsIGZuKSB7XG5cdFx0dmFyIHBhcnRzID0gc3RyaW5nLnNwbGl0KCdAJyk7XG5cdFx0dmFyIHJlc3VsdCA9ICcnO1xuXHRcdGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7XG5cdFx0XHQvLyBJbiBlbWFpbCBhZGRyZXNzZXMsIG9ubHkgdGhlIGRvbWFpbiBuYW1lIHNob3VsZCBiZSBwdW55Y29kZWQuIExlYXZlXG5cdFx0XHQvLyB0aGUgbG9jYWwgcGFydCAoaS5lLiBldmVyeXRoaW5nIHVwIHRvIGBAYCkgaW50YWN0LlxuXHRcdFx0cmVzdWx0ID0gcGFydHNbMF0gKyAnQCc7XG5cdFx0XHRzdHJpbmcgPSBwYXJ0c1sxXTtcblx0XHR9XG5cdFx0Ly8gQXZvaWQgYHNwbGl0KHJlZ2V4KWAgZm9yIElFOCBjb21wYXRpYmlsaXR5LiBTZWUgIzE3LlxuXHRcdHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHJlZ2V4U2VwYXJhdG9ycywgJ1xceDJFJyk7XG5cdFx0dmFyIGxhYmVscyA9IHN0cmluZy5zcGxpdCgnLicpO1xuXHRcdHZhciBlbmNvZGVkID0gbWFwKGxhYmVscywgZm4pLmpvaW4oJy4nKTtcblx0XHRyZXR1cm4gcmVzdWx0ICsgZW5jb2RlZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWVyaWMgY29kZSBwb2ludHMgb2YgZWFjaCBVbmljb2RlXG5cdCAqIGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLiBXaGlsZSBKYXZhU2NyaXB0IHVzZXMgVUNTLTIgaW50ZXJuYWxseSxcblx0ICogdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnZlcnQgYSBwYWlyIG9mIHN1cnJvZ2F0ZSBoYWx2ZXMgKGVhY2ggb2Ygd2hpY2hcblx0ICogVUNTLTIgZXhwb3NlcyBhcyBzZXBhcmF0ZSBjaGFyYWN0ZXJzKSBpbnRvIGEgc2luZ2xlIGNvZGUgcG9pbnQsXG5cdCAqIG1hdGNoaW5nIFVURi0xNi5cblx0ICogQHNlZSBgcHVueWNvZGUudWNzMi5lbmNvZGVgXG5cdCAqIEBzZWUgPGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9qYXZhc2NyaXB0LWVuY29kaW5nPlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGUudWNzMlxuXHQgKiBAbmFtZSBkZWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IHN0cmluZyBUaGUgVW5pY29kZSBpbnB1dCBzdHJpbmcgKFVDUy0yKS5cblx0ICogQHJldHVybnMge0FycmF5fSBUaGUgbmV3IGFycmF5IG9mIGNvZGUgcG9pbnRzLlxuXHQgKi9cblx0ZnVuY3Rpb24gdWNzMmRlY29kZShzdHJpbmcpIHtcblx0XHR2YXIgb3V0cHV0ID0gW10sXG5cdFx0ICAgIGNvdW50ZXIgPSAwLFxuXHRcdCAgICBsZW5ndGggPSBzdHJpbmcubGVuZ3RoLFxuXHRcdCAgICB2YWx1ZSxcblx0XHQgICAgZXh0cmE7XG5cdFx0d2hpbGUgKGNvdW50ZXIgPCBsZW5ndGgpIHtcblx0XHRcdHZhbHVlID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRcdGlmICh2YWx1ZSA+PSAweEQ4MDAgJiYgdmFsdWUgPD0gMHhEQkZGICYmIGNvdW50ZXIgPCBsZW5ndGgpIHtcblx0XHRcdFx0Ly8gaGlnaCBzdXJyb2dhdGUsIGFuZCB0aGVyZSBpcyBhIG5leHQgY2hhcmFjdGVyXG5cdFx0XHRcdGV4dHJhID0gc3RyaW5nLmNoYXJDb2RlQXQoY291bnRlcisrKTtcblx0XHRcdFx0aWYgKChleHRyYSAmIDB4RkMwMCkgPT0gMHhEQzAwKSB7IC8vIGxvdyBzdXJyb2dhdGVcblx0XHRcdFx0XHRvdXRwdXQucHVzaCgoKHZhbHVlICYgMHgzRkYpIDw8IDEwKSArIChleHRyYSAmIDB4M0ZGKSArIDB4MTAwMDApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIHVubWF0Y2hlZCBzdXJyb2dhdGU7IG9ubHkgYXBwZW5kIHRoaXMgY29kZSB1bml0LCBpbiBjYXNlIHRoZSBuZXh0XG5cdFx0XHRcdFx0Ly8gY29kZSB1bml0IGlzIHRoZSBoaWdoIHN1cnJvZ2F0ZSBvZiBhIHN1cnJvZ2F0ZSBwYWlyXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2godmFsdWUpO1xuXHRcdFx0XHRcdGNvdW50ZXItLTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3V0cHV0LnB1c2godmFsdWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gb3V0cHV0O1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBzdHJpbmcgYmFzZWQgb24gYW4gYXJyYXkgb2YgbnVtZXJpYyBjb2RlIHBvaW50cy5cblx0ICogQHNlZSBgcHVueWNvZGUudWNzMi5kZWNvZGVgXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZS51Y3MyXG5cdCAqIEBuYW1lIGVuY29kZVxuXHQgKiBAcGFyYW0ge0FycmF5fSBjb2RlUG9pbnRzIFRoZSBhcnJheSBvZiBudW1lcmljIGNvZGUgcG9pbnRzLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgbmV3IFVuaWNvZGUgc3RyaW5nIChVQ1MtMikuXG5cdCAqL1xuXHRmdW5jdGlvbiB1Y3MyZW5jb2RlKGFycmF5KSB7XG5cdFx0cmV0dXJuIG1hcChhcnJheSwgZnVuY3Rpb24odmFsdWUpIHtcblx0XHRcdHZhciBvdXRwdXQgPSAnJztcblx0XHRcdGlmICh2YWx1ZSA+IDB4RkZGRikge1xuXHRcdFx0XHR2YWx1ZSAtPSAweDEwMDAwO1xuXHRcdFx0XHRvdXRwdXQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKHZhbHVlID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKTtcblx0XHRcdFx0dmFsdWUgPSAweERDMDAgfCB2YWx1ZSAmIDB4M0ZGO1xuXHRcdFx0fVxuXHRcdFx0b3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSk7XG5cdFx0XHRyZXR1cm4gb3V0cHV0O1xuXHRcdH0pLmpvaW4oJycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgYmFzaWMgY29kZSBwb2ludCBpbnRvIGEgZGlnaXQvaW50ZWdlci5cblx0ICogQHNlZSBgZGlnaXRUb0Jhc2ljKClgXG5cdCAqIEBwcml2YXRlXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlUG9pbnQgVGhlIGJhc2ljIG51bWVyaWMgY29kZSBwb2ludCB2YWx1ZS5cblx0ICogQHJldHVybnMge051bWJlcn0gVGhlIG51bWVyaWMgdmFsdWUgb2YgYSBiYXNpYyBjb2RlIHBvaW50IChmb3IgdXNlIGluXG5cdCAqIHJlcHJlc2VudGluZyBpbnRlZ2VycykgaW4gdGhlIHJhbmdlIGAwYCB0byBgYmFzZSAtIDFgLCBvciBgYmFzZWAgaWZcblx0ICogdGhlIGNvZGUgcG9pbnQgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsdWUuXG5cdCAqL1xuXHRmdW5jdGlvbiBiYXNpY1RvRGlnaXQoY29kZVBvaW50KSB7XG5cdFx0aWYgKGNvZGVQb2ludCAtIDQ4IDwgMTApIHtcblx0XHRcdHJldHVybiBjb2RlUG9pbnQgLSAyMjtcblx0XHR9XG5cdFx0aWYgKGNvZGVQb2ludCAtIDY1IDwgMjYpIHtcblx0XHRcdHJldHVybiBjb2RlUG9pbnQgLSA2NTtcblx0XHR9XG5cdFx0aWYgKGNvZGVQb2ludCAtIDk3IDwgMjYpIHtcblx0XHRcdHJldHVybiBjb2RlUG9pbnQgLSA5Nztcblx0XHR9XG5cdFx0cmV0dXJuIGJhc2U7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBkaWdpdC9pbnRlZ2VyIGludG8gYSBiYXNpYyBjb2RlIHBvaW50LlxuXHQgKiBAc2VlIGBiYXNpY1RvRGlnaXQoKWBcblx0ICogQHByaXZhdGVcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGRpZ2l0IFRoZSBudW1lcmljIHZhbHVlIG9mIGEgYmFzaWMgY29kZSBwb2ludC5cblx0ICogQHJldHVybnMge051bWJlcn0gVGhlIGJhc2ljIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgKHdoZW4gdXNlZCBmb3Jcblx0ICogcmVwcmVzZW50aW5nIGludGVnZXJzKSBpcyBgZGlnaXRgLCB3aGljaCBuZWVkcyB0byBiZSBpbiB0aGUgcmFuZ2Vcblx0ICogYDBgIHRvIGBiYXNlIC0gMWAuIElmIGBmbGFnYCBpcyBub24temVybywgdGhlIHVwcGVyY2FzZSBmb3JtIGlzXG5cdCAqIHVzZWQ7IGVsc2UsIHRoZSBsb3dlcmNhc2UgZm9ybSBpcyB1c2VkLiBUaGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkXG5cdCAqIGlmIGBmbGFnYCBpcyBub24temVybyBhbmQgYGRpZ2l0YCBoYXMgbm8gdXBwZXJjYXNlIGZvcm0uXG5cdCAqL1xuXHRmdW5jdGlvbiBkaWdpdFRvQmFzaWMoZGlnaXQsIGZsYWcpIHtcblx0XHQvLyAgMC4uMjUgbWFwIHRvIEFTQ0lJIGEuLnogb3IgQS4uWlxuXHRcdC8vIDI2Li4zNSBtYXAgdG8gQVNDSUkgMC4uOVxuXHRcdHJldHVybiBkaWdpdCArIDIyICsgNzUgKiAoZGlnaXQgPCAyNikgLSAoKGZsYWcgIT0gMCkgPDwgNSk7XG5cdH1cblxuXHQvKipcblx0ICogQmlhcyBhZGFwdGF0aW9uIGZ1bmN0aW9uIGFzIHBlciBzZWN0aW9uIDMuNCBvZiBSRkMgMzQ5Mi5cblx0ICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM0OTIjc2VjdGlvbi0zLjRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdGZ1bmN0aW9uIGFkYXB0KGRlbHRhLCBudW1Qb2ludHMsIGZpcnN0VGltZSkge1xuXHRcdHZhciBrID0gMDtcblx0XHRkZWx0YSA9IGZpcnN0VGltZSA/IGZsb29yKGRlbHRhIC8gZGFtcCkgOiBkZWx0YSA+PiAxO1xuXHRcdGRlbHRhICs9IGZsb29yKGRlbHRhIC8gbnVtUG9pbnRzKTtcblx0XHRmb3IgKC8qIG5vIGluaXRpYWxpemF0aW9uICovOyBkZWx0YSA+IGJhc2VNaW51c1RNaW4gKiB0TWF4ID4+IDE7IGsgKz0gYmFzZSkge1xuXHRcdFx0ZGVsdGEgPSBmbG9vcihkZWx0YSAvIGJhc2VNaW51c1RNaW4pO1xuXHRcdH1cblx0XHRyZXR1cm4gZmxvb3IoayArIChiYXNlTWludXNUTWluICsgMSkgKiBkZWx0YSAvIChkZWx0YSArIHNrZXcpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFB1bnljb2RlIHN0cmluZyBvZiBBU0NJSS1vbmx5IHN5bWJvbHMgdG8gYSBzdHJpbmcgb2YgVW5pY29kZVxuXHQgKiBzeW1ib2xzLlxuXHQgKiBAbWVtYmVyT2YgcHVueWNvZGVcblx0ICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IFRoZSBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgcmVzdWx0aW5nIHN0cmluZyBvZiBVbmljb2RlIHN5bWJvbHMuXG5cdCAqL1xuXHRmdW5jdGlvbiBkZWNvZGUoaW5wdXQpIHtcblx0XHQvLyBEb24ndCB1c2UgVUNTLTJcblx0XHR2YXIgb3V0cHV0ID0gW10sXG5cdFx0ICAgIGlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLFxuXHRcdCAgICBvdXQsXG5cdFx0ICAgIGkgPSAwLFxuXHRcdCAgICBuID0gaW5pdGlhbE4sXG5cdFx0ICAgIGJpYXMgPSBpbml0aWFsQmlhcyxcblx0XHQgICAgYmFzaWMsXG5cdFx0ICAgIGosXG5cdFx0ICAgIGluZGV4LFxuXHRcdCAgICBvbGRpLFxuXHRcdCAgICB3LFxuXHRcdCAgICBrLFxuXHRcdCAgICBkaWdpdCxcblx0XHQgICAgdCxcblx0XHQgICAgLyoqIENhY2hlZCBjYWxjdWxhdGlvbiByZXN1bHRzICovXG5cdFx0ICAgIGJhc2VNaW51c1Q7XG5cblx0XHQvLyBIYW5kbGUgdGhlIGJhc2ljIGNvZGUgcG9pbnRzOiBsZXQgYGJhc2ljYCBiZSB0aGUgbnVtYmVyIG9mIGlucHV0IGNvZGVcblx0XHQvLyBwb2ludHMgYmVmb3JlIHRoZSBsYXN0IGRlbGltaXRlciwgb3IgYDBgIGlmIHRoZXJlIGlzIG5vbmUsIHRoZW4gY29weVxuXHRcdC8vIHRoZSBmaXJzdCBiYXNpYyBjb2RlIHBvaW50cyB0byB0aGUgb3V0cHV0LlxuXG5cdFx0YmFzaWMgPSBpbnB1dC5sYXN0SW5kZXhPZihkZWxpbWl0ZXIpO1xuXHRcdGlmIChiYXNpYyA8IDApIHtcblx0XHRcdGJhc2ljID0gMDtcblx0XHR9XG5cblx0XHRmb3IgKGogPSAwOyBqIDwgYmFzaWM7ICsraikge1xuXHRcdFx0Ly8gaWYgaXQncyBub3QgYSBiYXNpYyBjb2RlIHBvaW50XG5cdFx0XHRpZiAoaW5wdXQuY2hhckNvZGVBdChqKSA+PSAweDgwKSB7XG5cdFx0XHRcdGVycm9yKCdub3QtYmFzaWMnKTtcblx0XHRcdH1cblx0XHRcdG91dHB1dC5wdXNoKGlucHV0LmNoYXJDb2RlQXQoaikpO1xuXHRcdH1cblxuXHRcdC8vIE1haW4gZGVjb2RpbmcgbG9vcDogc3RhcnQganVzdCBhZnRlciB0aGUgbGFzdCBkZWxpbWl0ZXIgaWYgYW55IGJhc2ljIGNvZGVcblx0XHQvLyBwb2ludHMgd2VyZSBjb3BpZWQ7IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb3RoZXJ3aXNlLlxuXG5cdFx0Zm9yIChpbmRleCA9IGJhc2ljID4gMCA/IGJhc2ljICsgMSA6IDA7IGluZGV4IDwgaW5wdXRMZW5ndGg7IC8qIG5vIGZpbmFsIGV4cHJlc3Npb24gKi8pIHtcblxuXHRcdFx0Ly8gYGluZGV4YCBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgY2hhcmFjdGVyIHRvIGJlIGNvbnN1bWVkLlxuXHRcdFx0Ly8gRGVjb2RlIGEgZ2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIgaW50byBgZGVsdGFgLFxuXHRcdFx0Ly8gd2hpY2ggZ2V0cyBhZGRlZCB0byBgaWAuIFRoZSBvdmVyZmxvdyBjaGVja2luZyBpcyBlYXNpZXJcblx0XHRcdC8vIGlmIHdlIGluY3JlYXNlIGBpYCBhcyB3ZSBnbywgdGhlbiBzdWJ0cmFjdCBvZmYgaXRzIHN0YXJ0aW5nXG5cdFx0XHQvLyB2YWx1ZSBhdCB0aGUgZW5kIHRvIG9idGFpbiBgZGVsdGFgLlxuXHRcdFx0Zm9yIChvbGRpID0gaSwgdyA9IDEsIGsgPSBiYXNlOyAvKiBubyBjb25kaXRpb24gKi87IGsgKz0gYmFzZSkge1xuXG5cdFx0XHRcdGlmIChpbmRleCA+PSBpbnB1dExlbmd0aCkge1xuXHRcdFx0XHRcdGVycm9yKCdpbnZhbGlkLWlucHV0Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkaWdpdCA9IGJhc2ljVG9EaWdpdChpbnB1dC5jaGFyQ29kZUF0KGluZGV4KyspKTtcblxuXHRcdFx0XHRpZiAoZGlnaXQgPj0gYmFzZSB8fCBkaWdpdCA+IGZsb29yKChtYXhJbnQgLSBpKSAvIHcpKSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpICs9IGRpZ2l0ICogdztcblx0XHRcdFx0dCA9IGsgPD0gYmlhcyA/IHRNaW4gOiAoayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcyk7XG5cblx0XHRcdFx0aWYgKGRpZ2l0IDwgdCkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YmFzZU1pbnVzVCA9IGJhc2UgLSB0O1xuXHRcdFx0XHRpZiAodyA+IGZsb29yKG1heEludCAvIGJhc2VNaW51c1QpKSB7XG5cdFx0XHRcdFx0ZXJyb3IoJ292ZXJmbG93Jyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR3ICo9IGJhc2VNaW51c1Q7XG5cblx0XHRcdH1cblxuXHRcdFx0b3V0ID0gb3V0cHV0Lmxlbmd0aCArIDE7XG5cdFx0XHRiaWFzID0gYWRhcHQoaSAtIG9sZGksIG91dCwgb2xkaSA9PSAwKTtcblxuXHRcdFx0Ly8gYGlgIHdhcyBzdXBwb3NlZCB0byB3cmFwIGFyb3VuZCBmcm9tIGBvdXRgIHRvIGAwYCxcblx0XHRcdC8vIGluY3JlbWVudGluZyBgbmAgZWFjaCB0aW1lLCBzbyB3ZSdsbCBmaXggdGhhdCBub3c6XG5cdFx0XHRpZiAoZmxvb3IoaSAvIG91dCkgPiBtYXhJbnQgLSBuKSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXG5cdFx0XHRuICs9IGZsb29yKGkgLyBvdXQpO1xuXHRcdFx0aSAlPSBvdXQ7XG5cblx0XHRcdC8vIEluc2VydCBgbmAgYXQgcG9zaXRpb24gYGlgIG9mIHRoZSBvdXRwdXRcblx0XHRcdG91dHB1dC5zcGxpY2UoaSsrLCAwLCBuKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB1Y3MyZW5jb2RlKG91dHB1dCk7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSBzdHJpbmcgb2YgVW5pY29kZSBzeW1ib2xzIChlLmcuIGEgZG9tYWluIG5hbWUgbGFiZWwpIHRvIGFcblx0ICogUHVueWNvZGUgc3RyaW5nIG9mIEFTQ0lJLW9ubHkgc3ltYm9scy5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgc3RyaW5nIG9mIFVuaWNvZGUgc3ltYm9scy5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIHJlc3VsdGluZyBQdW55Y29kZSBzdHJpbmcgb2YgQVNDSUktb25seSBzeW1ib2xzLlxuXHQgKi9cblx0ZnVuY3Rpb24gZW5jb2RlKGlucHV0KSB7XG5cdFx0dmFyIG4sXG5cdFx0ICAgIGRlbHRhLFxuXHRcdCAgICBoYW5kbGVkQ1BDb3VudCxcblx0XHQgICAgYmFzaWNMZW5ndGgsXG5cdFx0ICAgIGJpYXMsXG5cdFx0ICAgIGosXG5cdFx0ICAgIG0sXG5cdFx0ICAgIHEsXG5cdFx0ICAgIGssXG5cdFx0ICAgIHQsXG5cdFx0ICAgIGN1cnJlbnRWYWx1ZSxcblx0XHQgICAgb3V0cHV0ID0gW10sXG5cdFx0ICAgIC8qKiBgaW5wdXRMZW5ndGhgIHdpbGwgaG9sZCB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIGluIGBpbnB1dGAuICovXG5cdFx0ICAgIGlucHV0TGVuZ3RoLFxuXHRcdCAgICAvKiogQ2FjaGVkIGNhbGN1bGF0aW9uIHJlc3VsdHMgKi9cblx0XHQgICAgaGFuZGxlZENQQ291bnRQbHVzT25lLFxuXHRcdCAgICBiYXNlTWludXNULFxuXHRcdCAgICBxTWludXNUO1xuXG5cdFx0Ly8gQ29udmVydCB0aGUgaW5wdXQgaW4gVUNTLTIgdG8gVW5pY29kZVxuXHRcdGlucHV0ID0gdWNzMmRlY29kZShpbnB1dCk7XG5cblx0XHQvLyBDYWNoZSB0aGUgbGVuZ3RoXG5cdFx0aW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGg7XG5cblx0XHQvLyBJbml0aWFsaXplIHRoZSBzdGF0ZVxuXHRcdG4gPSBpbml0aWFsTjtcblx0XHRkZWx0YSA9IDA7XG5cdFx0YmlhcyA9IGluaXRpYWxCaWFzO1xuXG5cdFx0Ly8gSGFuZGxlIHRoZSBiYXNpYyBjb2RlIHBvaW50c1xuXHRcdGZvciAoaiA9IDA7IGogPCBpbnB1dExlbmd0aDsgKytqKSB7XG5cdFx0XHRjdXJyZW50VmFsdWUgPSBpbnB1dFtqXTtcblx0XHRcdGlmIChjdXJyZW50VmFsdWUgPCAweDgwKSB7XG5cdFx0XHRcdG91dHB1dC5wdXNoKHN0cmluZ0Zyb21DaGFyQ29kZShjdXJyZW50VmFsdWUpKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRoYW5kbGVkQ1BDb3VudCA9IGJhc2ljTGVuZ3RoID0gb3V0cHV0Lmxlbmd0aDtcblxuXHRcdC8vIGBoYW5kbGVkQ1BDb3VudGAgaXMgdGhlIG51bWJlciBvZiBjb2RlIHBvaW50cyB0aGF0IGhhdmUgYmVlbiBoYW5kbGVkO1xuXHRcdC8vIGBiYXNpY0xlbmd0aGAgaXMgdGhlIG51bWJlciBvZiBiYXNpYyBjb2RlIHBvaW50cy5cblxuXHRcdC8vIEZpbmlzaCB0aGUgYmFzaWMgc3RyaW5nIC0gaWYgaXQgaXMgbm90IGVtcHR5IC0gd2l0aCBhIGRlbGltaXRlclxuXHRcdGlmIChiYXNpY0xlbmd0aCkge1xuXHRcdFx0b3V0cHV0LnB1c2goZGVsaW1pdGVyKTtcblx0XHR9XG5cblx0XHQvLyBNYWluIGVuY29kaW5nIGxvb3A6XG5cdFx0d2hpbGUgKGhhbmRsZWRDUENvdW50IDwgaW5wdXRMZW5ndGgpIHtcblxuXHRcdFx0Ly8gQWxsIG5vbi1iYXNpYyBjb2RlIHBvaW50cyA8IG4gaGF2ZSBiZWVuIGhhbmRsZWQgYWxyZWFkeS4gRmluZCB0aGUgbmV4dFxuXHRcdFx0Ly8gbGFyZ2VyIG9uZTpcblx0XHRcdGZvciAobSA9IG1heEludCwgaiA9IDA7IGogPCBpbnB1dExlbmd0aDsgKytqKSB7XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IGlucHV0W2pdO1xuXHRcdFx0XHRpZiAoY3VycmVudFZhbHVlID49IG4gJiYgY3VycmVudFZhbHVlIDwgbSkge1xuXHRcdFx0XHRcdG0gPSBjdXJyZW50VmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gSW5jcmVhc2UgYGRlbHRhYCBlbm91Z2ggdG8gYWR2YW5jZSB0aGUgZGVjb2RlcidzIDxuLGk+IHN0YXRlIHRvIDxtLDA+LFxuXHRcdFx0Ly8gYnV0IGd1YXJkIGFnYWluc3Qgb3ZlcmZsb3dcblx0XHRcdGhhbmRsZWRDUENvdW50UGx1c09uZSA9IGhhbmRsZWRDUENvdW50ICsgMTtcblx0XHRcdGlmIChtIC0gbiA+IGZsb29yKChtYXhJbnQgLSBkZWx0YSkgLyBoYW5kbGVkQ1BDb3VudFBsdXNPbmUpKSB7XG5cdFx0XHRcdGVycm9yKCdvdmVyZmxvdycpO1xuXHRcdFx0fVxuXG5cdFx0XHRkZWx0YSArPSAobSAtIG4pICogaGFuZGxlZENQQ291bnRQbHVzT25lO1xuXHRcdFx0biA9IG07XG5cblx0XHRcdGZvciAoaiA9IDA7IGogPCBpbnB1dExlbmd0aDsgKytqKSB7XG5cdFx0XHRcdGN1cnJlbnRWYWx1ZSA9IGlucHV0W2pdO1xuXG5cdFx0XHRcdGlmIChjdXJyZW50VmFsdWUgPCBuICYmICsrZGVsdGEgPiBtYXhJbnQpIHtcblx0XHRcdFx0XHRlcnJvcignb3ZlcmZsb3cnKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChjdXJyZW50VmFsdWUgPT0gbikge1xuXHRcdFx0XHRcdC8vIFJlcHJlc2VudCBkZWx0YSBhcyBhIGdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyXG5cdFx0XHRcdFx0Zm9yIChxID0gZGVsdGEsIGsgPSBiYXNlOyAvKiBubyBjb25kaXRpb24gKi87IGsgKz0gYmFzZSkge1xuXHRcdFx0XHRcdFx0dCA9IGsgPD0gYmlhcyA/IHRNaW4gOiAoayA+PSBiaWFzICsgdE1heCA/IHRNYXggOiBrIC0gYmlhcyk7XG5cdFx0XHRcdFx0XHRpZiAocSA8IHQpIHtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRxTWludXNUID0gcSAtIHQ7XG5cdFx0XHRcdFx0XHRiYXNlTWludXNUID0gYmFzZSAtIHQ7XG5cdFx0XHRcdFx0XHRvdXRwdXQucHVzaChcblx0XHRcdFx0XHRcdFx0c3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyh0ICsgcU1pbnVzVCAlIGJhc2VNaW51c1QsIDApKVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdHEgPSBmbG9vcihxTWludXNUIC8gYmFzZU1pbnVzVCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0b3V0cHV0LnB1c2goc3RyaW5nRnJvbUNoYXJDb2RlKGRpZ2l0VG9CYXNpYyhxLCAwKSkpO1xuXHRcdFx0XHRcdGJpYXMgPSBhZGFwdChkZWx0YSwgaGFuZGxlZENQQ291bnRQbHVzT25lLCBoYW5kbGVkQ1BDb3VudCA9PSBiYXNpY0xlbmd0aCk7XG5cdFx0XHRcdFx0ZGVsdGEgPSAwO1xuXHRcdFx0XHRcdCsraGFuZGxlZENQQ291bnQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0KytkZWx0YTtcblx0XHRcdCsrbjtcblxuXHRcdH1cblx0XHRyZXR1cm4gb3V0cHV0LmpvaW4oJycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgUHVueWNvZGUgc3RyaW5nIHJlcHJlc2VudGluZyBhIGRvbWFpbiBuYW1lIG9yIGFuIGVtYWlsIGFkZHJlc3Ncblx0ICogdG8gVW5pY29kZS4gT25seSB0aGUgUHVueWNvZGVkIHBhcnRzIG9mIHRoZSBpbnB1dCB3aWxsIGJlIGNvbnZlcnRlZCwgaS5lLlxuXHQgKiBpdCBkb2Vzbid0IG1hdHRlciBpZiB5b3UgY2FsbCBpdCBvbiBhIHN0cmluZyB0aGF0IGhhcyBhbHJlYWR5IGJlZW5cblx0ICogY29udmVydGVkIHRvIFVuaWNvZGUuXG5cdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHQgKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgVGhlIFB1bnljb2RlZCBkb21haW4gbmFtZSBvciBlbWFpbCBhZGRyZXNzIHRvXG5cdCAqIGNvbnZlcnQgdG8gVW5pY29kZS5cblx0ICogQHJldHVybnMge1N0cmluZ30gVGhlIFVuaWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIFB1bnljb2RlXG5cdCAqIHN0cmluZy5cblx0ICovXG5cdGZ1bmN0aW9uIHRvVW5pY29kZShpbnB1dCkge1xuXHRcdHJldHVybiBtYXBEb21haW4oaW5wdXQsIGZ1bmN0aW9uKHN0cmluZykge1xuXHRcdFx0cmV0dXJuIHJlZ2V4UHVueWNvZGUudGVzdChzdHJpbmcpXG5cdFx0XHRcdD8gZGVjb2RlKHN0cmluZy5zbGljZSg0KS50b0xvd2VyQ2FzZSgpKVxuXHRcdFx0XHQ6IHN0cmluZztcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFVuaWNvZGUgc3RyaW5nIHJlcHJlc2VudGluZyBhIGRvbWFpbiBuYW1lIG9yIGFuIGVtYWlsIGFkZHJlc3MgdG9cblx0ICogUHVueWNvZGUuIE9ubHkgdGhlIG5vbi1BU0NJSSBwYXJ0cyBvZiB0aGUgZG9tYWluIG5hbWUgd2lsbCBiZSBjb252ZXJ0ZWQsXG5cdCAqIGkuZS4gaXQgZG9lc24ndCBtYXR0ZXIgaWYgeW91IGNhbGwgaXQgd2l0aCBhIGRvbWFpbiB0aGF0J3MgYWxyZWFkeSBpblxuXHQgKiBBU0NJSS5cblx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBUaGUgZG9tYWluIG5hbWUgb3IgZW1haWwgYWRkcmVzcyB0byBjb252ZXJ0LCBhcyBhXG5cdCAqIFVuaWNvZGUgc3RyaW5nLlxuXHQgKiBAcmV0dXJucyB7U3RyaW5nfSBUaGUgUHVueWNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGRvbWFpbiBuYW1lIG9yXG5cdCAqIGVtYWlsIGFkZHJlc3MuXG5cdCAqL1xuXHRmdW5jdGlvbiB0b0FTQ0lJKGlucHV0KSB7XG5cdFx0cmV0dXJuIG1hcERvbWFpbihpbnB1dCwgZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0XHRyZXR1cm4gcmVnZXhOb25BU0NJSS50ZXN0KHN0cmluZylcblx0XHRcdFx0PyAneG4tLScgKyBlbmNvZGUoc3RyaW5nKVxuXHRcdFx0XHQ6IHN0cmluZztcblx0XHR9KTtcblx0fVxuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdC8qKiBEZWZpbmUgdGhlIHB1YmxpYyBBUEkgKi9cblx0cHVueWNvZGUgPSB7XG5cdFx0LyoqXG5cdFx0ICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IFB1bnljb2RlLmpzIHZlcnNpb24gbnVtYmVyLlxuXHRcdCAqIEBtZW1iZXJPZiBwdW55Y29kZVxuXHRcdCAqIEB0eXBlIFN0cmluZ1xuXHRcdCAqL1xuXHRcdCd2ZXJzaW9uJzogJzEuNC4xJyxcblx0XHQvKipcblx0XHQgKiBBbiBvYmplY3Qgb2YgbWV0aG9kcyB0byBjb252ZXJ0IGZyb20gSmF2YVNjcmlwdCdzIGludGVybmFsIGNoYXJhY3RlclxuXHRcdCAqIHJlcHJlc2VudGF0aW9uIChVQ1MtMikgdG8gVW5pY29kZSBjb2RlIHBvaW50cywgYW5kIGJhY2suXG5cdFx0ICogQHNlZSA8aHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtZW5jb2Rpbmc+XG5cdFx0ICogQG1lbWJlck9mIHB1bnljb2RlXG5cdFx0ICogQHR5cGUgT2JqZWN0XG5cdFx0ICovXG5cdFx0J3VjczInOiB7XG5cdFx0XHQnZGVjb2RlJzogdWNzMmRlY29kZSxcblx0XHRcdCdlbmNvZGUnOiB1Y3MyZW5jb2RlXG5cdFx0fSxcblx0XHQnZGVjb2RlJzogZGVjb2RlLFxuXHRcdCdlbmNvZGUnOiBlbmNvZGUsXG5cdFx0J3RvQVNDSUknOiB0b0FTQ0lJLFxuXHRcdCd0b1VuaWNvZGUnOiB0b1VuaWNvZGVcblx0fTtcblxuXHQvKiogRXhwb3NlIGBwdW55Y29kZWAgKi9cblx0Ly8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3Igc3BlY2lmaWMgY29uZGl0aW9uIHBhdHRlcm5zXG5cdC8vIGxpa2UgdGhlIGZvbGxvd2luZzpcblx0aWYgKFxuXHRcdHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdHR5cGVvZiBkZWZpbmUuYW1kID09ICdvYmplY3QnICYmXG5cdFx0ZGVmaW5lLmFtZFxuXHQpIHtcblx0XHRkZWZpbmUoJ3B1bnljb2RlJywgZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gcHVueWNvZGU7XG5cdFx0fSk7XG5cdH0gZWxzZSBpZiAoZnJlZUV4cG9ydHMgJiYgZnJlZU1vZHVsZSkge1xuXHRcdGlmIChtb2R1bGUuZXhwb3J0cyA9PSBmcmVlRXhwb3J0cykge1xuXHRcdFx0Ly8gaW4gTm9kZS5qcywgaW8uanMsIG9yIFJpbmdvSlMgdjAuOC4wK1xuXHRcdFx0ZnJlZU1vZHVsZS5leHBvcnRzID0gcHVueWNvZGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIGluIE5hcndoYWwgb3IgUmluZ29KUyB2MC43LjAtXG5cdFx0XHRmb3IgKGtleSBpbiBwdW55Y29kZSkge1xuXHRcdFx0XHRwdW55Y29kZS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIChmcmVlRXhwb3J0c1trZXldID0gcHVueWNvZGVba2V5XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2Uge1xuXHRcdC8vIGluIFJoaW5vIG9yIGEgd2ViIGJyb3dzZXJcblx0XHRyb290LnB1bnljb2RlID0gcHVueWNvZGU7XG5cdH1cblxufSh0aGlzKSk7XG4iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyBJZiBvYmouaGFzT3duUHJvcGVydHkgaGFzIGJlZW4gb3ZlcnJpZGRlbiwgdGhlbiBjYWxsaW5nXG4vLyBvYmouaGFzT3duUHJvcGVydHkocHJvcCkgd2lsbCBicmVhay5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2pveWVudC9ub2RlL2lzc3Vlcy8xNzA3XG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHFzLCBzZXAsIGVxLCBvcHRpb25zKSB7XG4gIHNlcCA9IHNlcCB8fCAnJic7XG4gIGVxID0gZXEgfHwgJz0nO1xuICB2YXIgb2JqID0ge307XG5cbiAgaWYgKHR5cGVvZiBxcyAhPT0gJ3N0cmluZycgfHwgcXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHZhciByZWdleHAgPSAvXFwrL2c7XG4gIHFzID0gcXMuc3BsaXQoc2VwKTtcblxuICB2YXIgbWF4S2V5cyA9IDEwMDA7XG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLm1heEtleXMgPT09ICdudW1iZXInKSB7XG4gICAgbWF4S2V5cyA9IG9wdGlvbnMubWF4S2V5cztcbiAgfVxuXG4gIHZhciBsZW4gPSBxcy5sZW5ndGg7XG4gIC8vIG1heEtleXMgPD0gMCBtZWFucyB0aGF0IHdlIHNob3VsZCBub3QgbGltaXQga2V5cyBjb3VudFxuICBpZiAobWF4S2V5cyA+IDAgJiYgbGVuID4gbWF4S2V5cykge1xuICAgIGxlbiA9IG1heEtleXM7XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgdmFyIHggPSBxc1tpXS5yZXBsYWNlKHJlZ2V4cCwgJyUyMCcpLFxuICAgICAgICBpZHggPSB4LmluZGV4T2YoZXEpLFxuICAgICAgICBrc3RyLCB2c3RyLCBrLCB2O1xuXG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICBrc3RyID0geC5zdWJzdHIoMCwgaWR4KTtcbiAgICAgIHZzdHIgPSB4LnN1YnN0cihpZHggKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAga3N0ciA9IHg7XG4gICAgICB2c3RyID0gJyc7XG4gICAgfVxuXG4gICAgayA9IGRlY29kZVVSSUNvbXBvbmVudChrc3RyKTtcbiAgICB2ID0gZGVjb2RlVVJJQ29tcG9uZW50KHZzdHIpO1xuXG4gICAgaWYgKCFoYXNPd25Qcm9wZXJ0eShvYmosIGspKSB7XG4gICAgICBvYmpba10gPSB2O1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvYmpba10pKSB7XG4gICAgICBvYmpba10ucHVzaCh2KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqW2tdID0gW29ialtrXSwgdl07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoeHMpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4cykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHN0cmluZ2lmeVByaW1pdGl2ZSA9IGZ1bmN0aW9uKHYpIHtcbiAgc3dpdGNoICh0eXBlb2Ygdikge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICByZXR1cm4gdjtcblxuICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgcmV0dXJuIHYgPyAndHJ1ZScgOiAnZmFsc2UnO1xuXG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiBpc0Zpbml0ZSh2KSA/IHYgOiAnJztcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJyc7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24ob2JqLCBzZXAsIGVxLCBuYW1lKSB7XG4gIHNlcCA9IHNlcCB8fCAnJic7XG4gIGVxID0gZXEgfHwgJz0nO1xuICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgb2JqID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIG1hcChvYmplY3RLZXlzKG9iaiksIGZ1bmN0aW9uKGspIHtcbiAgICAgIHZhciBrcyA9IGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUoaykpICsgZXE7XG4gICAgICBpZiAoaXNBcnJheShvYmpba10pKSB7XG4gICAgICAgIHJldHVybiBtYXAob2JqW2tdLCBmdW5jdGlvbih2KSB7XG4gICAgICAgICAgcmV0dXJuIGtzICsgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZSh2KSk7XG4gICAgICAgIH0pLmpvaW4oc2VwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBrcyArIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUob2JqW2tdKSk7XG4gICAgICB9XG4gICAgfSkuam9pbihzZXApO1xuXG4gIH1cblxuICBpZiAoIW5hbWUpIHJldHVybiAnJztcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUobmFtZSkpICsgZXEgK1xuICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KHN0cmluZ2lmeVByaW1pdGl2ZShvYmopKTtcbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoeHMpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4cykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuXG5mdW5jdGlvbiBtYXAgKHhzLCBmKSB7XG4gIGlmICh4cy5tYXApIHJldHVybiB4cy5tYXAoZik7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB4cy5sZW5ndGg7IGkrKykge1xuICAgIHJlcy5wdXNoKGYoeHNbaV0sIGkpKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIHJlcyA9IFtdO1xuICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHJlcy5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuZGVjb2RlID0gZXhwb3J0cy5wYXJzZSA9IHJlcXVpcmUoJy4vZGVjb2RlJyk7XG5leHBvcnRzLmVuY29kZSA9IGV4cG9ydHMuc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9lbmNvZGUnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX1BhbmVsR3JvdXAgPSByZXF1aXJlKCcuL1BhbmVsR3JvdXAnKTtcblxudmFyIF9QYW5lbEdyb3VwMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1BhbmVsR3JvdXApO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBBY2NvcmRpb24gPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShBY2NvcmRpb24sIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEFjY29yZGlvbigpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBBY2NvcmRpb24pO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBBY2NvcmRpb24ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBfUGFuZWxHcm91cDJbJ2RlZmF1bHQnXSxcbiAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIHRoaXMucHJvcHMsIHsgYWNjb3JkaW9uOiB0cnVlIH0pLFxuICAgICAgdGhpcy5wcm9wcy5jaGlsZHJlblxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIEFjY29yZGlvbjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IEFjY29yZGlvbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF92YWx1ZXMgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L3ZhbHVlcycpO1xuXG52YXIgX3ZhbHVlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF92YWx1ZXMpO1xuXG52YXIgX2V4dGVuZHMzID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzNCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMzKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG52YXIgX1N0eWxlQ29uZmlnID0gcmVxdWlyZSgnLi91dGlscy9TdHlsZUNvbmZpZycpO1xuXG52YXIgX0Nsb3NlQnV0dG9uID0gcmVxdWlyZSgnLi9DbG9zZUJ1dHRvbicpO1xuXG52YXIgX0Nsb3NlQnV0dG9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Nsb3NlQnV0dG9uKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBvbkRpc21pc3M6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgY2xvc2VMYWJlbDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmdcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNsb3NlTGFiZWw6ICdDbG9zZSBhbGVydCdcbn07XG5cbnZhciBBbGVydCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKEFsZXJ0LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBBbGVydCgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBBbGVydCk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIEFsZXJ0LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9leHRlbmRzMjtcblxuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBvbkRpc21pc3MgPSBfcHJvcHMub25EaXNtaXNzLFxuICAgICAgICBjbG9zZUxhYmVsID0gX3Byb3BzLmNsb3NlTGFiZWwsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydvbkRpc21pc3MnLCAnY2xvc2VMYWJlbCcsICdjbGFzc05hbWUnLCAnY2hpbGRyZW4nXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGRpc21pc3NhYmxlID0gISFvbkRpc21pc3M7XG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKSwgKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdkaXNtaXNzYWJsZScpXSA9IGRpc21pc3NhYmxlLCBfZXh0ZW5kczIpKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICdkaXYnLFxuICAgICAgKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICAgIHJvbGU6ICdhbGVydCcsXG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgICB9KSxcbiAgICAgIGRpc21pc3NhYmxlICYmIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9DbG9zZUJ1dHRvbjJbJ2RlZmF1bHQnXSwge1xuICAgICAgICBvbkNsaWNrOiBvbkRpc21pc3MsXG4gICAgICAgIGxhYmVsOiBjbG9zZUxhYmVsXG4gICAgICB9KSxcbiAgICAgIGNoaWxkcmVuXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gQWxlcnQ7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5BbGVydC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5BbGVydC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNTdHlsZXMpKCgwLCBfdmFsdWVzMlsnZGVmYXVsdCddKShfU3R5bGVDb25maWcuU3RhdGUpLCBfU3R5bGVDb25maWcuU3RhdGUuSU5GTywgKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnYWxlcnQnLCBBbGVydCkpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbi8vIFRPRE86IGBwdWxsUmlnaHRgIGRvZXNuJ3QgYmVsb25nIGhlcmUuIFRoZXJlJ3Mgbm8gc3BlY2lhbCBoYW5kbGluZyBoZXJlLlxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBwdWxsUmlnaHQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbFxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgcHVsbFJpZ2h0OiBmYWxzZVxufTtcblxudmFyIEJhZGdlID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoQmFkZ2UsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEJhZGdlKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIEJhZGdlKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgQmFkZ2UucHJvdG90eXBlLmhhc0NvbnRlbnQgPSBmdW5jdGlvbiBoYXNDb250ZW50KGNoaWxkcmVuKSB7XG4gICAgdmFyIHJlc3VsdCA9IGZhbHNlO1xuXG4gICAgX3JlYWN0MlsnZGVmYXVsdCddLkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChjaGlsZCB8fCBjaGlsZCA9PT0gMCkge1xuICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBCYWRnZS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBwdWxsUmlnaHQgPSBfcHJvcHMucHVsbFJpZ2h0LFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsncHVsbFJpZ2h0JywgJ2NsYXNzTmFtZScsICdjaGlsZHJlbiddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpLCB7XG4gICAgICAncHVsbC1yaWdodCc6IHB1bGxSaWdodCxcblxuICAgICAgLy8gSGFjayBmb3IgY29sbGFwc2luZyBvbiBJRTguXG4gICAgICBoaWRkZW46ICF0aGlzLmhhc0NvbnRlbnQoY2hpbGRyZW4pXG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnc3BhbicsXG4gICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICAgIH0pLFxuICAgICAgY2hpbGRyZW5cbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBCYWRnZTtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbkJhZGdlLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkJhZGdlLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnYmFkZ2UnLCBCYWRnZSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9CcmVhZGNydW1iSXRlbSA9IHJlcXVpcmUoJy4vQnJlYWRjcnVtYkl0ZW0nKTtcblxudmFyIF9CcmVhZGNydW1iSXRlbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9CcmVhZGNydW1iSXRlbSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIEJyZWFkY3J1bWIgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShCcmVhZGNydW1iLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBCcmVhZGNydW1iKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIEJyZWFkY3J1bWIpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBCcmVhZGNydW1iLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdvbCcsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgcm9sZTogJ25hdmlnYXRpb24nLFxuICAgICAgJ2FyaWEtbGFiZWwnOiAnYnJlYWRjcnVtYnMnLFxuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIEJyZWFkY3J1bWI7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5CcmVhZGNydW1iLkl0ZW0gPSBfQnJlYWRjcnVtYkl0ZW0yWydkZWZhdWx0J107XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2JyZWFkY3J1bWInLCBCcmVhZGNydW1iKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9TYWZlQW5jaG9yID0gcmVxdWlyZSgnLi9TYWZlQW5jaG9yJyk7XG5cbnZhciBfU2FmZUFuY2hvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TYWZlQW5jaG9yKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogSWYgc2V0IHRvIHRydWUsIHJlbmRlcnMgYHNwYW5gIGluc3RlYWQgb2YgYGFgXG4gICAqL1xuICBhY3RpdmU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgLyoqXG4gICAqIGBocmVmYCBhdHRyaWJ1dGUgZm9yIHRoZSBpbm5lciBgYWAgZWxlbWVudFxuICAgKi9cbiAgaHJlZjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gIC8qKlxuICAgKiBgdGl0bGVgIGF0dHJpYnV0ZSBmb3IgdGhlIGlubmVyIGBhYCBlbGVtZW50XG4gICAqL1xuICB0aXRsZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ub2RlLFxuICAvKipcbiAgICogYHRhcmdldGAgYXR0cmlidXRlIGZvciB0aGUgaW5uZXIgYGFgIGVsZW1lbnRcbiAgICovXG4gIHRhcmdldDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmdcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGFjdGl2ZTogZmFsc2Vcbn07XG5cbnZhciBCcmVhZGNydW1iSXRlbSA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKEJyZWFkY3J1bWJJdGVtLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBCcmVhZGNydW1iSXRlbSgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBCcmVhZGNydW1iSXRlbSk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIEJyZWFkY3J1bWJJdGVtLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGFjdGl2ZSA9IF9wcm9wcy5hY3RpdmUsXG4gICAgICAgIGhyZWYgPSBfcHJvcHMuaHJlZixcbiAgICAgICAgdGl0bGUgPSBfcHJvcHMudGl0bGUsXG4gICAgICAgIHRhcmdldCA9IF9wcm9wcy50YXJnZXQsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2FjdGl2ZScsICdocmVmJywgJ3RpdGxlJywgJ3RhcmdldCcsICdjbGFzc05hbWUnXSk7XG5cbiAgICAvLyBEb24ndCB0cnkgdG8gcmVuZGVyIHRoZXNlIHByb3BzIG9uIG5vbi1hY3RpdmUgPHNwYW4+LlxuXG4gICAgdmFyIGxpbmtQcm9wcyA9IHsgaHJlZjogaHJlZiwgdGl0bGU6IHRpdGxlLCB0YXJnZXQ6IHRhcmdldCB9O1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2xpJyxcbiAgICAgIHsgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgeyBhY3RpdmU6IGFjdGl2ZSB9KSB9LFxuICAgICAgYWN0aXZlID8gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCBwcm9wcykgOiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfU2FmZUFuY2hvcjJbJ2RlZmF1bHQnXSwgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgcHJvcHMsIGxpbmtQcm9wcykpXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gQnJlYWRjcnVtYkl0ZW07XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5CcmVhZGNydW1iSXRlbS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5CcmVhZGNydW1iSXRlbS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IEJyZWFkY3J1bWJJdGVtO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3ZhbHVlcyA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvdmFsdWVzJyk7XG5cbnZhciBfdmFsdWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3ZhbHVlcyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9leHRlbmRzMyA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfZWxlbWVudFR5cGUgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxudmFyIF9TdHlsZUNvbmZpZyA9IHJlcXVpcmUoJy4vdXRpbHMvU3R5bGVDb25maWcnKTtcblxudmFyIF9TYWZlQW5jaG9yID0gcmVxdWlyZSgnLi9TYWZlQW5jaG9yJyk7XG5cbnZhciBfU2FmZUFuY2hvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TYWZlQW5jaG9yKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBhY3RpdmU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgZGlzYWJsZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgYmxvY2s6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgb25DbGljazogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICBjb21wb25lbnRDbGFzczogX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddLFxuICBocmVmOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcbiAgLyoqXG4gICAqIERlZmluZXMgSFRNTCBidXR0b24gdHlwZSBhdHRyaWJ1dGVcbiAgICogQGRlZmF1bHRWYWx1ZSAnYnV0dG9uJ1xuICAgKi9cbiAgdHlwZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZihbJ2J1dHRvbicsICdyZXNldCcsICdzdWJtaXQnXSlcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGFjdGl2ZTogZmFsc2UsXG4gIGJsb2NrOiBmYWxzZSxcbiAgZGlzYWJsZWQ6IGZhbHNlXG59O1xuXG52YXIgQnV0dG9uID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoQnV0dG9uLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBCdXR0b24oKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgQnV0dG9uKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgQnV0dG9uLnByb3RvdHlwZS5yZW5kZXJBbmNob3IgPSBmdW5jdGlvbiByZW5kZXJBbmNob3IoZWxlbWVudFByb3BzLCBjbGFzc05hbWUpIHtcbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX1NhZmVBbmNob3IyWydkZWZhdWx0J10sICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgZWxlbWVudFByb3BzLmRpc2FibGVkICYmICdkaXNhYmxlZCcpXG4gICAgfSkpO1xuICB9O1xuXG4gIEJ1dHRvbi5wcm90b3R5cGUucmVuZGVyQnV0dG9uID0gZnVuY3Rpb24gcmVuZGVyQnV0dG9uKF9yZWYsIGNsYXNzTmFtZSkge1xuICAgIHZhciBjb21wb25lbnRDbGFzcyA9IF9yZWYuY29tcG9uZW50Q2xhc3MsXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9yZWYsIFsnY29tcG9uZW50Q2xhc3MnXSk7XG5cbiAgICB2YXIgQ29tcG9uZW50ID0gY29tcG9uZW50Q2xhc3MgfHwgJ2J1dHRvbic7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIHR5cGU6IGVsZW1lbnRQcm9wcy50eXBlIHx8ICdidXR0b24nLFxuICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgICB9KSk7XG4gIH07XG5cbiAgQnV0dG9uLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9leHRlbmRzMjtcblxuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY3RpdmUgPSBfcHJvcHMuYWN0aXZlLFxuICAgICAgICBibG9jayA9IF9wcm9wcy5ibG9jayxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnYWN0aXZlJywgJ2Jsb2NrJywgJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoe30sICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpLCAoX2V4dGVuZHMyID0ge1xuICAgICAgYWN0aXZlOiBhY3RpdmVcbiAgICB9LCBfZXh0ZW5kczJbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdibG9jaycpXSA9IGJsb2NrLCBfZXh0ZW5kczIpKTtcbiAgICB2YXIgZnVsbENsYXNzTmFtZSA9ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKTtcblxuICAgIGlmIChlbGVtZW50UHJvcHMuaHJlZikge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyQW5jaG9yKGVsZW1lbnRQcm9wcywgZnVsbENsYXNzTmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucmVuZGVyQnV0dG9uKGVsZW1lbnRQcm9wcywgZnVsbENsYXNzTmFtZSk7XG4gIH07XG5cbiAgcmV0dXJuIEJ1dHRvbjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbkJ1dHRvbi5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5CdXR0b24uZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdidG4nLCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzU2l6ZXMpKFtfU3R5bGVDb25maWcuU2l6ZS5MQVJHRSwgX1N0eWxlQ29uZmlnLlNpemUuU01BTEwsIF9TdHlsZUNvbmZpZy5TaXplLlhTTUFMTF0sICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNTdHlsZXMpKFtdLmNvbmNhdCgoMCwgX3ZhbHVlczJbJ2RlZmF1bHQnXSkoX1N0eWxlQ29uZmlnLlN0YXRlKSwgW19TdHlsZUNvbmZpZy5TdHlsZS5ERUZBVUxULCBfU3R5bGVDb25maWcuU3R5bGUuUFJJTUFSWSwgX1N0eWxlQ29uZmlnLlN0eWxlLkxJTktdKSwgX1N0eWxlQ29uZmlnLlN0eWxlLkRFRkFVTFQsIEJ1dHRvbikpKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMyA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9hbGwgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9hbGwnKTtcblxudmFyIF9hbGwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYWxsKTtcblxudmFyIF9CdXR0b24gPSByZXF1aXJlKCcuL0J1dHRvbicpO1xuXG52YXIgX0J1dHRvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9CdXR0b24pO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIHZlcnRpY2FsOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIGp1c3RpZmllZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IGJsb2NrIGJ1dHRvbnM7IG9ubHkgdXNlZnVsIHdoZW4gdXNlZCB3aXRoIHRoZSBcInZlcnRpY2FsXCIgcHJvcC5cbiAgICogQHR5cGUge2Jvb2x9XG4gICAqL1xuICBibG9jazogKDAsIF9hbGwyWydkZWZhdWx0J10pKF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgYmxvY2sgPSBfcmVmLmJsb2NrLFxuICAgICAgICB2ZXJ0aWNhbCA9IF9yZWYudmVydGljYWw7XG4gICAgcmV0dXJuIGJsb2NrICYmICF2ZXJ0aWNhbCA/IG5ldyBFcnJvcignYGJsb2NrYCByZXF1aXJlcyBgdmVydGljYWxgIHRvIGJlIHNldCB0byBoYXZlIGFueSBlZmZlY3QnKSA6IG51bGw7XG4gIH0pXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBibG9jazogZmFsc2UsXG4gIGp1c3RpZmllZDogZmFsc2UsXG4gIHZlcnRpY2FsOiBmYWxzZVxufTtcblxudmFyIEJ1dHRvbkdyb3VwID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoQnV0dG9uR3JvdXAsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEJ1dHRvbkdyb3VwKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIEJ1dHRvbkdyb3VwKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgQnV0dG9uR3JvdXAucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX2V4dGVuZHMyO1xuXG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGJsb2NrID0gX3Byb3BzLmJsb2NrLFxuICAgICAgICBqdXN0aWZpZWQgPSBfcHJvcHMuanVzdGlmaWVkLFxuICAgICAgICB2ZXJ0aWNhbCA9IF9wcm9wcy52ZXJ0aWNhbCxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnYmxvY2snLCAnanVzdGlmaWVkJywgJ3ZlcnRpY2FsJywgJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoe30sICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpLCAoX2V4dGVuZHMyID0ge30sIF9leHRlbmRzMlsoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcyldID0gIXZlcnRpY2FsLCBfZXh0ZW5kczJbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICd2ZXJ0aWNhbCcpXSA9IHZlcnRpY2FsLCBfZXh0ZW5kczJbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdqdXN0aWZpZWQnKV0gPSBqdXN0aWZpZWQsIF9leHRlbmRzMlsoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoX0J1dHRvbjJbJ2RlZmF1bHQnXS5kZWZhdWx0UHJvcHMsICdibG9jaycpXSA9IGJsb2NrLCBfZXh0ZW5kczIpKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnZGl2JywgKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gQnV0dG9uR3JvdXA7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5CdXR0b25Hcm91cC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5CdXR0b25Hcm91cC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2J0bi1ncm91cCcsIEJ1dHRvbkdyb3VwKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX0J1dHRvbiA9IHJlcXVpcmUoJy4vQnV0dG9uJyk7XG5cbnZhciBfQnV0dG9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0J1dHRvbik7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIEJ1dHRvblRvb2xiYXIgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShCdXR0b25Ub29sYmFyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBCdXR0b25Ub29sYmFyKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIEJ1dHRvblRvb2xiYXIpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBCdXR0b25Ub29sYmFyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdkaXYnLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIHJvbGU6ICd0b29sYmFyJyxcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBCdXR0b25Ub29sYmFyO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnYnRuLXRvb2xiYXInLCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzU2l6ZXMpKF9CdXR0b24yWydkZWZhdWx0J10uU0laRVMsIEJ1dHRvblRvb2xiYXIpKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9DYXJvdXNlbENhcHRpb24gPSByZXF1aXJlKCcuL0Nhcm91c2VsQ2FwdGlvbicpO1xuXG52YXIgX0Nhcm91c2VsQ2FwdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9DYXJvdXNlbENhcHRpb24pO1xuXG52YXIgX0Nhcm91c2VsSXRlbSA9IHJlcXVpcmUoJy4vQ2Fyb3VzZWxJdGVtJyk7XG5cbnZhciBfQ2Fyb3VzZWxJdGVtMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Nhcm91c2VsSXRlbSk7XG5cbnZhciBfR2x5cGhpY29uID0gcmVxdWlyZSgnLi9HbHlwaGljb24nKTtcblxudmFyIF9HbHlwaGljb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfR2x5cGhpY29uKTtcblxudmFyIF9TYWZlQW5jaG9yID0gcmVxdWlyZSgnLi9TYWZlQW5jaG9yJyk7XG5cbnZhciBfU2FmZUFuY2hvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TYWZlQW5jaG9yKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxudmFyIF9WYWxpZENvbXBvbmVudENoaWxkcmVuID0gcmVxdWlyZSgnLi91dGlscy9WYWxpZENvbXBvbmVudENoaWxkcmVuJyk7XG5cbnZhciBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9WYWxpZENvbXBvbmVudENoaWxkcmVuKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG4vLyBUT0RPOiBgc2xpZGVgIHNob3VsZCBiZSBgYW5pbWF0ZWAuXG5cbi8vIFRPRE86IFVzZSB1bmNvbnRyb2xsYWJsZS5cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgc2xpZGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgaW5kaWNhdG9yczogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBpbnRlcnZhbDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsXG4gIGNvbnRyb2xzOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIHBhdXNlT25Ib3ZlcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICB3cmFwOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCB3aGVuIHRoZSBhY3RpdmUgaXRlbSBjaGFuZ2VzLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAoZXZlbnRLZXk6IGFueSkgPT4gYW55IHwgKGV2ZW50S2V5OiBhbnksIGV2ZW50OiBPYmplY3QpID0+IGFueVxuICAgKiBgYGBcbiAgICpcbiAgICogSWYgdGhpcyBjYWxsYmFjayB0YWtlcyB0d28gb3IgbW9yZSBhcmd1bWVudHMsIHRoZSBzZWNvbmQgYXJndW1lbnQgd2lsbFxuICAgKiBiZSBhIHBlcnNpc3RlZCBldmVudCBvYmplY3Qgd2l0aCBgZGlyZWN0aW9uYCBzZXQgdG8gdGhlIGRpcmVjdGlvbiBvZiB0aGVcbiAgICogdHJhbnNpdGlvbi5cbiAgICovXG4gIG9uU2VsZWN0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIG9uU2xpZGVFbmQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgYWN0aXZlSW5kZXg6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICBkZWZhdWx0QWN0aXZlSW5kZXg6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICBkaXJlY3Rpb246IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2YoWydwcmV2JywgJ25leHQnXSksXG4gIHByZXZJY29uOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm5vZGUsXG4gIC8qKlxuICAgKiBMYWJlbCBzaG93biB0byBzY3JlZW4gcmVhZGVycyBvbmx5LCBjYW4gYmUgdXNlZCB0byBzaG93IHRoZSBwcmV2aW91cyBlbGVtZW50XG4gICAqIGluIHRoZSBjYXJvdXNlbC5cbiAgICogU2V0IHRvIG51bGwgdG8gZGVhY3RpdmF0ZS5cbiAgICovXG4gIHByZXZMYWJlbDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gIG5leHRJY29uOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm5vZGUsXG4gIC8qKlxuICAgKiBMYWJlbCBzaG93biB0byBzY3JlZW4gcmVhZGVycyBvbmx5LCBjYW4gYmUgdXNlZCB0byBzaG93IHRoZSBuZXh0IGVsZW1lbnRcbiAgICogaW4gdGhlIGNhcm91c2VsLlxuICAgKiBTZXQgdG8gbnVsbCB0byBkZWFjdGl2YXRlLlxuICAgKi9cbiAgbmV4dExhYmVsOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZ1xufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgc2xpZGU6IHRydWUsXG4gIGludGVydmFsOiA1MDAwLFxuICBwYXVzZU9uSG92ZXI6IHRydWUsXG4gIHdyYXA6IHRydWUsXG4gIGluZGljYXRvcnM6IHRydWUsXG4gIGNvbnRyb2xzOiB0cnVlLFxuICBwcmV2SWNvbjogX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX0dseXBoaWNvbjJbJ2RlZmF1bHQnXSwgeyBnbHlwaDogJ2NoZXZyb24tbGVmdCcgfSksXG4gIHByZXZMYWJlbDogJ1ByZXZpb3VzJyxcbiAgbmV4dEljb246IF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9HbHlwaGljb24yWydkZWZhdWx0J10sIHsgZ2x5cGg6ICdjaGV2cm9uLXJpZ2h0JyB9KSxcbiAgbmV4dExhYmVsOiAnTmV4dCdcbn07XG5cbnZhciBDYXJvdXNlbCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKENhcm91c2VsLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBDYXJvdXNlbChwcm9wcywgY29udGV4dCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIENhcm91c2VsKTtcblxuICAgIHZhciBfdGhpcyA9ICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICBfdGhpcy5oYW5kbGVNb3VzZU92ZXIgPSBfdGhpcy5oYW5kbGVNb3VzZU92ZXIuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaGFuZGxlTW91c2VPdXQgPSBfdGhpcy5oYW5kbGVNb3VzZU91dC5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5oYW5kbGVQcmV2ID0gX3RoaXMuaGFuZGxlUHJldi5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5oYW5kbGVOZXh0ID0gX3RoaXMuaGFuZGxlTmV4dC5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5oYW5kbGVJdGVtQW5pbWF0ZU91dEVuZCA9IF90aGlzLmhhbmRsZUl0ZW1BbmltYXRlT3V0RW5kLmJpbmQoX3RoaXMpO1xuXG4gICAgdmFyIGRlZmF1bHRBY3RpdmVJbmRleCA9IHByb3BzLmRlZmF1bHRBY3RpdmVJbmRleDtcblxuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBhY3RpdmVJbmRleDogZGVmYXVsdEFjdGl2ZUluZGV4ICE9IG51bGwgPyBkZWZhdWx0QWN0aXZlSW5kZXggOiAwLFxuICAgICAgcHJldmlvdXNBY3RpdmVJbmRleDogbnVsbCxcbiAgICAgIGRpcmVjdGlvbjogbnVsbFxuICAgIH07XG5cbiAgICBfdGhpcy5pc1VubW91bnRlZCA9IGZhbHNlO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIENhcm91c2VsLnByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICB2YXIgYWN0aXZlSW5kZXggPSB0aGlzLmdldEFjdGl2ZUluZGV4KCk7XG5cbiAgICBpZiAobmV4dFByb3BzLmFjdGl2ZUluZGV4ICE9IG51bGwgJiYgbmV4dFByb3BzLmFjdGl2ZUluZGV4ICE9PSBhY3RpdmVJbmRleCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG5cbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBwcmV2aW91c0FjdGl2ZUluZGV4OiBhY3RpdmVJbmRleCxcbiAgICAgICAgZGlyZWN0aW9uOiBuZXh0UHJvcHMuZGlyZWN0aW9uICE9IG51bGwgPyBuZXh0UHJvcHMuZGlyZWN0aW9uIDogdGhpcy5nZXREaXJlY3Rpb24oYWN0aXZlSW5kZXgsIG5leHRQcm9wcy5hY3RpdmVJbmRleClcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBDYXJvdXNlbC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICB0aGlzLndhaXRGb3JOZXh0KCk7XG4gIH07XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgdGhpcy5pc1VubW91bnRlZCA9IHRydWU7XG4gIH07XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLmhhbmRsZU1vdXNlT3ZlciA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlT3ZlcigpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5wYXVzZU9uSG92ZXIpIHtcbiAgICAgIHRoaXMucGF1c2UoKTtcbiAgICB9XG4gIH07XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLmhhbmRsZU1vdXNlT3V0ID0gZnVuY3Rpb24gaGFuZGxlTW91c2VPdXQoKSB7XG4gICAgaWYgKHRoaXMuaXNQYXVzZWQpIHtcbiAgICAgIHRoaXMucGxheSgpO1xuICAgIH1cbiAgfTtcblxuICBDYXJvdXNlbC5wcm90b3R5cGUuaGFuZGxlUHJldiA9IGZ1bmN0aW9uIGhhbmRsZVByZXYoZSkge1xuICAgIHZhciBpbmRleCA9IHRoaXMuZ2V0QWN0aXZlSW5kZXgoKSAtIDE7XG5cbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICBpZiAoIXRoaXMucHJvcHMud3JhcCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpbmRleCA9IF9WYWxpZENvbXBvbmVudENoaWxkcmVuMlsnZGVmYXVsdCddLmNvdW50KHRoaXMucHJvcHMuY2hpbGRyZW4pIC0gMTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdChpbmRleCwgZSwgJ3ByZXYnKTtcbiAgfTtcblxuICBDYXJvdXNlbC5wcm90b3R5cGUuaGFuZGxlTmV4dCA9IGZ1bmN0aW9uIGhhbmRsZU5leHQoZSkge1xuICAgIHZhciBpbmRleCA9IHRoaXMuZ2V0QWN0aXZlSW5kZXgoKSArIDE7XG4gICAgdmFyIGNvdW50ID0gX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yWydkZWZhdWx0J10uY291bnQodGhpcy5wcm9wcy5jaGlsZHJlbik7XG5cbiAgICBpZiAoaW5kZXggPiBjb3VudCAtIDEpIHtcbiAgICAgIGlmICghdGhpcy5wcm9wcy53cmFwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGluZGV4ID0gMDtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdChpbmRleCwgZSwgJ25leHQnKTtcbiAgfTtcblxuICBDYXJvdXNlbC5wcm90b3R5cGUuaGFuZGxlSXRlbUFuaW1hdGVPdXRFbmQgPSBmdW5jdGlvbiBoYW5kbGVJdGVtQW5pbWF0ZU91dEVuZCgpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgcHJldmlvdXNBY3RpdmVJbmRleDogbnVsbCxcbiAgICAgIGRpcmVjdGlvbjogbnVsbFxuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzMi53YWl0Rm9yTmV4dCgpO1xuXG4gICAgICBpZiAoX3RoaXMyLnByb3BzLm9uU2xpZGVFbmQpIHtcbiAgICAgICAgX3RoaXMyLnByb3BzLm9uU2xpZGVFbmQoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBDYXJvdXNlbC5wcm90b3R5cGUuZ2V0QWN0aXZlSW5kZXggPSBmdW5jdGlvbiBnZXRBY3RpdmVJbmRleCgpIHtcbiAgICB2YXIgYWN0aXZlSW5kZXhQcm9wID0gdGhpcy5wcm9wcy5hY3RpdmVJbmRleDtcbiAgICByZXR1cm4gYWN0aXZlSW5kZXhQcm9wICE9IG51bGwgPyBhY3RpdmVJbmRleFByb3AgOiB0aGlzLnN0YXRlLmFjdGl2ZUluZGV4O1xuICB9O1xuXG4gIENhcm91c2VsLnByb3RvdHlwZS5nZXREaXJlY3Rpb24gPSBmdW5jdGlvbiBnZXREaXJlY3Rpb24ocHJldkluZGV4LCBpbmRleCkge1xuICAgIGlmIChwcmV2SW5kZXggPT09IGluZGV4KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJldkluZGV4ID4gaW5kZXggPyAncHJldicgOiAnbmV4dCc7XG4gIH07XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLnNlbGVjdCA9IGZ1bmN0aW9uIHNlbGVjdChpbmRleCwgZSwgZGlyZWN0aW9uKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG5cbiAgICAvLyBUT0RPOiBJcyB0aGlzIG5lY2Vzc2FyeT8gU2VlbXMgbGlrZSB0aGUgb25seSByaXNrIGlzIGlmIHRoZSBjb21wb25lbnRcbiAgICAvLyB1bm1vdW50cyB3aGlsZSBoYW5kbGVJdGVtQW5pbWF0ZU91dEVuZCBmaXJlcy5cbiAgICBpZiAodGhpcy5pc1VubW91bnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBwcmV2aW91c0FjdGl2ZUluZGV4ID0gdGhpcy5wcm9wcy5zbGlkZSA/IHRoaXMuZ2V0QWN0aXZlSW5kZXgoKSA6IG51bGw7XG4gICAgZGlyZWN0aW9uID0gZGlyZWN0aW9uIHx8IHRoaXMuZ2V0RGlyZWN0aW9uKHByZXZpb3VzQWN0aXZlSW5kZXgsIGluZGV4KTtcblxuICAgIHZhciBvblNlbGVjdCA9IHRoaXMucHJvcHMub25TZWxlY3Q7XG5cblxuICAgIGlmIChvblNlbGVjdCkge1xuICAgICAgaWYgKG9uU2VsZWN0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gUmVhY3QgU3ludGhldGljRXZlbnRzIGFyZSBwb29sZWQsIHNvIHdlIG5lZWQgdG8gcmVtb3ZlIHRoaXMgZXZlbnRcbiAgICAgICAgLy8gZnJvbSB0aGUgcG9vbCB0byBhZGQgYSBjdXN0b20gcHJvcGVydHkuIFRvIGF2b2lkIHVubmVjZXNzYXJpbHlcbiAgICAgICAgLy8gcmVtb3Zpbmcgb2JqZWN0cyBmcm9tIHRoZSBwb29sLCBvbmx5IGRvIHRoaXMgd2hlbiB0aGUgbGlzdGVuZXJcbiAgICAgICAgLy8gYWN0dWFsbHkgd2FudHMgdGhlIGV2ZW50LlxuICAgICAgICBpZiAoZSkge1xuICAgICAgICAgIGUucGVyc2lzdCgpO1xuICAgICAgICAgIGUuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGUgPSB7IGRpcmVjdGlvbjogZGlyZWN0aW9uIH07XG4gICAgICAgIH1cblxuICAgICAgICBvblNlbGVjdChpbmRleCwgZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvblNlbGVjdChpbmRleCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMuYWN0aXZlSW5kZXggPT0gbnVsbCAmJiBpbmRleCAhPT0gcHJldmlvdXNBY3RpdmVJbmRleCkge1xuICAgICAgaWYgKHRoaXMuc3RhdGUucHJldmlvdXNBY3RpdmVJbmRleCAhPSBudWxsKSB7XG4gICAgICAgIC8vIElmIGN1cnJlbnRseSBhbmltYXRpbmcgZG9uJ3QgYWN0aXZhdGUgdGhlIG5ldyBpbmRleC5cbiAgICAgICAgLy8gVE9ETzogbG9vayBpbnRvIHF1ZXVlaW5nIHRoaXMgY2FuY2VsZWQgY2FsbCBhbmRcbiAgICAgICAgLy8gYW5pbWF0aW5nIGFmdGVyIHRoZSBjdXJyZW50IGFuaW1hdGlvbiBoYXMgZW5kZWQuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGFjdGl2ZUluZGV4OiBpbmRleCxcbiAgICAgICAgcHJldmlvdXNBY3RpdmVJbmRleDogcHJldmlvdXNBY3RpdmVJbmRleCxcbiAgICAgICAgZGlyZWN0aW9uOiBkaXJlY3Rpb25cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBDYXJvdXNlbC5wcm90b3R5cGUud2FpdEZvck5leHQgPSBmdW5jdGlvbiB3YWl0Rm9yTmV4dCgpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgc2xpZGUgPSBfcHJvcHMuc2xpZGUsXG4gICAgICAgIGludGVydmFsID0gX3Byb3BzLmludGVydmFsLFxuICAgICAgICBhY3RpdmVJbmRleFByb3AgPSBfcHJvcHMuYWN0aXZlSW5kZXg7XG5cblxuICAgIGlmICghdGhpcy5pc1BhdXNlZCAmJiBzbGlkZSAmJiBpbnRlcnZhbCAmJiBhY3RpdmVJbmRleFByb3AgPT0gbnVsbCkge1xuICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCh0aGlzLmhhbmRsZU5leHQsIGludGVydmFsKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gVGhpcyBtaWdodCBiZSBhIHB1YmxpYyBBUEkuXG5cblxuICBDYXJvdXNlbC5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiBwYXVzZSgpIHtcbiAgICB0aGlzLmlzUGF1c2VkID0gdHJ1ZTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgfTtcblxuICAvLyBUaGlzIG1pZ2h0IGJlIGEgcHVibGljIEFQSS5cblxuXG4gIENhcm91c2VsLnByb3RvdHlwZS5wbGF5ID0gZnVuY3Rpb24gcGxheSgpIHtcbiAgICB0aGlzLmlzUGF1c2VkID0gZmFsc2U7XG4gICAgdGhpcy53YWl0Rm9yTmV4dCgpO1xuICB9O1xuXG4gIENhcm91c2VsLnByb3RvdHlwZS5yZW5kZXJJbmRpY2F0b3JzID0gZnVuY3Rpb24gcmVuZGVySW5kaWNhdG9ycyhjaGlsZHJlbiwgYWN0aXZlSW5kZXgsIGJzUHJvcHMpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIHZhciBpbmRpY2F0b3JzID0gW107XG5cbiAgICBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjJbJ2RlZmF1bHQnXS5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQsIGluZGV4KSB7XG4gICAgICBpbmRpY2F0b3JzLnB1c2goX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ2xpJywge1xuICAgICAgICBrZXk6IGluZGV4LFxuICAgICAgICBjbGFzc05hbWU6IGluZGV4ID09PSBhY3RpdmVJbmRleCA/ICdhY3RpdmUnIDogbnVsbCxcbiAgICAgICAgb25DbGljazogZnVuY3Rpb24gb25DbGljayhlKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMy5zZWxlY3QoaW5kZXgsIGUpO1xuICAgICAgICB9XG4gICAgICB9KSxcblxuICAgICAgLy8gRm9yY2Ugd2hpdGVzcGFjZSBiZXR3ZWVuIGluZGljYXRvciBlbGVtZW50cy4gQm9vdHN0cmFwIHJlcXVpcmVzXG4gICAgICAvLyB0aGlzIGZvciBjb3JyZWN0IHNwYWNpbmcgb2YgZWxlbWVudHMuXG4gICAgICAnICcpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ29sJyxcbiAgICAgIHsgY2xhc3NOYW1lOiAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ2luZGljYXRvcnMnKSB9LFxuICAgICAgaW5kaWNhdG9yc1xuICAgICk7XG4gIH07XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLnJlbmRlckNvbnRyb2xzID0gZnVuY3Rpb24gcmVuZGVyQ29udHJvbHMocHJvcGVydGllcykge1xuICAgIHZhciB3cmFwID0gcHJvcGVydGllcy53cmFwLFxuICAgICAgICBjaGlsZHJlbiA9IHByb3BlcnRpZXMuY2hpbGRyZW4sXG4gICAgICAgIGFjdGl2ZUluZGV4ID0gcHJvcGVydGllcy5hY3RpdmVJbmRleCxcbiAgICAgICAgcHJldkljb24gPSBwcm9wZXJ0aWVzLnByZXZJY29uLFxuICAgICAgICBuZXh0SWNvbiA9IHByb3BlcnRpZXMubmV4dEljb24sXG4gICAgICAgIGJzUHJvcHMgPSBwcm9wZXJ0aWVzLmJzUHJvcHMsXG4gICAgICAgIHByZXZMYWJlbCA9IHByb3BlcnRpZXMucHJldkxhYmVsLFxuICAgICAgICBuZXh0TGFiZWwgPSBwcm9wZXJ0aWVzLm5leHRMYWJlbDtcblxuICAgIHZhciBjb250cm9sQ2xhc3NOYW1lID0gKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdjb250cm9sJyk7XG4gICAgdmFyIGNvdW50ID0gX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yWydkZWZhdWx0J10uY291bnQoY2hpbGRyZW4pO1xuXG4gICAgcmV0dXJuIFsod3JhcCB8fCBhY3RpdmVJbmRleCAhPT0gMCkgJiYgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBfU2FmZUFuY2hvcjJbJ2RlZmF1bHQnXSxcbiAgICAgIHtcbiAgICAgICAga2V5OiAncHJldicsXG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjb250cm9sQ2xhc3NOYW1lLCAnbGVmdCcpLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZVByZXZcbiAgICAgIH0sXG4gICAgICBwcmV2SWNvbixcbiAgICAgIHByZXZMYWJlbCAmJiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ3NwYW4nLFxuICAgICAgICB7IGNsYXNzTmFtZTogJ3NyLW9ubHknIH0sXG4gICAgICAgIHByZXZMYWJlbFxuICAgICAgKVxuICAgICksICh3cmFwIHx8IGFjdGl2ZUluZGV4ICE9PSBjb3VudCAtIDEpICYmIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgX1NhZmVBbmNob3IyWydkZWZhdWx0J10sXG4gICAgICB7XG4gICAgICAgIGtleTogJ25leHQnLFxuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY29udHJvbENsYXNzTmFtZSwgJ3JpZ2h0JyksXG4gICAgICAgIG9uQ2xpY2s6IHRoaXMuaGFuZGxlTmV4dFxuICAgICAgfSxcbiAgICAgIG5leHRJY29uLFxuICAgICAgbmV4dExhYmVsICYmIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnc3BhbicsXG4gICAgICAgIHsgY2xhc3NOYW1lOiAnc3Itb25seScgfSxcbiAgICAgICAgbmV4dExhYmVsXG4gICAgICApXG4gICAgKV07XG4gIH07XG5cbiAgQ2Fyb3VzZWwucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIHZhciBfcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgc2xpZGUgPSBfcHJvcHMyLnNsaWRlLFxuICAgICAgICBpbmRpY2F0b3JzID0gX3Byb3BzMi5pbmRpY2F0b3JzLFxuICAgICAgICBjb250cm9scyA9IF9wcm9wczIuY29udHJvbHMsXG4gICAgICAgIHdyYXAgPSBfcHJvcHMyLndyYXAsXG4gICAgICAgIHByZXZJY29uID0gX3Byb3BzMi5wcmV2SWNvbixcbiAgICAgICAgcHJldkxhYmVsID0gX3Byb3BzMi5wcmV2TGFiZWwsXG4gICAgICAgIG5leHRJY29uID0gX3Byb3BzMi5uZXh0SWNvbixcbiAgICAgICAgbmV4dExhYmVsID0gX3Byb3BzMi5uZXh0TGFiZWwsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wczIuY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wczIuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzMiwgWydzbGlkZScsICdpbmRpY2F0b3JzJywgJ2NvbnRyb2xzJywgJ3dyYXAnLCAncHJldkljb24nLCAncHJldkxhYmVsJywgJ25leHRJY29uJywgJ25leHRMYWJlbCcsICdjbGFzc05hbWUnLCAnY2hpbGRyZW4nXSk7XG4gICAgdmFyIF9zdGF0ZSA9IHRoaXMuc3RhdGUsXG4gICAgICAgIHByZXZpb3VzQWN0aXZlSW5kZXggPSBfc3RhdGUucHJldmlvdXNBY3RpdmVJbmRleCxcbiAgICAgICAgZGlyZWN0aW9uID0gX3N0YXRlLmRpcmVjdGlvbjtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzQW5kT21pdCA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzQW5kT21pdCkocHJvcHMsIFsnaW50ZXJ2YWwnLCAncGF1c2VPbkhvdmVyJywgJ29uU2VsZWN0JywgJ29uU2xpZGVFbmQnLCAnYWN0aXZlSW5kZXgnLCAvLyBBY2Nlc3NlZCB2aWEgdGhpcy5nZXRBY3RpdmVJbmRleCgpLlxuICAgICdkZWZhdWx0QWN0aXZlSW5kZXgnLCAnZGlyZWN0aW9uJ10pLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc0FuZE9taXRbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNBbmRPbWl0WzFdO1xuXG4gICAgdmFyIGFjdGl2ZUluZGV4ID0gdGhpcy5nZXRBY3RpdmVJbmRleCgpO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKSwge1xuICAgICAgc2xpZGU6IHNsaWRlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnZGl2JyxcbiAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKSxcbiAgICAgICAgb25Nb3VzZU92ZXI6IHRoaXMuaGFuZGxlTW91c2VPdmVyLFxuICAgICAgICBvbk1vdXNlT3V0OiB0aGlzLmhhbmRsZU1vdXNlT3V0XG4gICAgICB9KSxcbiAgICAgIGluZGljYXRvcnMgJiYgdGhpcy5yZW5kZXJJbmRpY2F0b3JzKGNoaWxkcmVuLCBhY3RpdmVJbmRleCwgYnNQcm9wcyksXG4gICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHsgY2xhc3NOYW1lOiAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ2lubmVyJykgfSxcbiAgICAgICAgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yWydkZWZhdWx0J10ubWFwKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQsIGluZGV4KSB7XG4gICAgICAgICAgdmFyIGFjdGl2ZSA9IGluZGV4ID09PSBhY3RpdmVJbmRleDtcbiAgICAgICAgICB2YXIgcHJldmlvdXNBY3RpdmUgPSBzbGlkZSAmJiBpbmRleCA9PT0gcHJldmlvdXNBY3RpdmVJbmRleDtcblxuICAgICAgICAgIHJldHVybiAoMCwgX3JlYWN0LmNsb25lRWxlbWVudCkoY2hpbGQsIHtcbiAgICAgICAgICAgIGFjdGl2ZTogYWN0aXZlLFxuICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgICAgYW5pbWF0ZU91dDogcHJldmlvdXNBY3RpdmUsXG4gICAgICAgICAgICBhbmltYXRlSW46IGFjdGl2ZSAmJiBwcmV2aW91c0FjdGl2ZUluZGV4ICE9IG51bGwgJiYgc2xpZGUsXG4gICAgICAgICAgICBkaXJlY3Rpb246IGRpcmVjdGlvbixcbiAgICAgICAgICAgIG9uQW5pbWF0ZU91dEVuZDogcHJldmlvdXNBY3RpdmUgPyBfdGhpczQuaGFuZGxlSXRlbUFuaW1hdGVPdXRFbmQgOiBudWxsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICApLFxuICAgICAgY29udHJvbHMgJiYgdGhpcy5yZW5kZXJDb250cm9scyh7XG4gICAgICAgIHdyYXA6IHdyYXAsXG4gICAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbixcbiAgICAgICAgYWN0aXZlSW5kZXg6IGFjdGl2ZUluZGV4LFxuICAgICAgICBwcmV2SWNvbjogcHJldkljb24sXG4gICAgICAgIHByZXZMYWJlbDogcHJldkxhYmVsLFxuICAgICAgICBuZXh0SWNvbjogbmV4dEljb24sXG4gICAgICAgIG5leHRMYWJlbDogbmV4dExhYmVsLFxuICAgICAgICBic1Byb3BzOiBic1Byb3BzXG4gICAgICB9KVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIENhcm91c2VsO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuQ2Fyb3VzZWwucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuQ2Fyb3VzZWwuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5DYXJvdXNlbC5DYXB0aW9uID0gX0Nhcm91c2VsQ2FwdGlvbjJbJ2RlZmF1bHQnXTtcbkNhcm91c2VsLkl0ZW0gPSBfQ2Fyb3VzZWxJdGVtMlsnZGVmYXVsdCddO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdjYXJvdXNlbCcsIENhcm91c2VsKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX2VsZW1lbnRUeXBlID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvZWxlbWVudFR5cGUnKTtcblxudmFyIF9lbGVtZW50VHlwZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbGVtZW50VHlwZSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6IF9lbGVtZW50VHlwZTJbJ2RlZmF1bHQnXVxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6ICdkaXYnXG59O1xuXG52YXIgQ2Fyb3VzZWxDYXB0aW9uID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoQ2Fyb3VzZWxDYXB0aW9uLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBDYXJvdXNlbENhcHRpb24oKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgQ2Fyb3VzZWxDYXB0aW9uKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgQ2Fyb3VzZWxDYXB0aW9uLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIENvbXBvbmVudCA9IF9wcm9wcy5jb21wb25lbnRDbGFzcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY29tcG9uZW50Q2xhc3MnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBDYXJvdXNlbENhcHRpb247XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5DYXJvdXNlbENhcHRpb24ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuQ2Fyb3VzZWxDYXB0aW9uLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnY2Fyb3VzZWwtY2FwdGlvbicsIENhcm91c2VsQ2FwdGlvbik7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfcmVhY3REb20gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcblxudmFyIF9yZWFjdERvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdERvbSk7XG5cbnZhciBfVHJhbnNpdGlvbkV2ZW50cyA9IHJlcXVpcmUoJy4vdXRpbHMvVHJhbnNpdGlvbkV2ZW50cycpO1xuXG52YXIgX1RyYW5zaXRpb25FdmVudHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVHJhbnNpdGlvbkV2ZW50cyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuLy8gVE9ETzogVGhpcyBzaG91bGQgdXNlIGEgdGltZW91dCBpbnN0ZWFkIG9mIFRyYW5zaXRpb25FdmVudHMsIG9yIGVsc2UganVzdFxuLy8gbm90IHdhaXQgdW50aWwgdHJhbnNpdGlvbiBlbmQgdG8gdHJpZ2dlciBjb250aW51aW5nIGFuaW1hdGlvbnMuXG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGRpcmVjdGlvbjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZihbJ3ByZXYnLCAnbmV4dCddKSxcbiAgb25BbmltYXRlT3V0RW5kOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIGFjdGl2ZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBhbmltYXRlSW46IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgYW5pbWF0ZU91dDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBpbmRleDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXJcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGFjdGl2ZTogZmFsc2UsXG4gIGFuaW1hdGVJbjogZmFsc2UsXG4gIGFuaW1hdGVPdXQ6IGZhbHNlXG59O1xuXG52YXIgQ2Fyb3VzZWxJdGVtID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoQ2Fyb3VzZWxJdGVtLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBDYXJvdXNlbEl0ZW0ocHJvcHMsIGNvbnRleHQpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBDYXJvdXNlbEl0ZW0pO1xuXG4gICAgdmFyIF90aGlzID0gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgIF90aGlzLmhhbmRsZUFuaW1hdGVPdXRFbmQgPSBfdGhpcy5oYW5kbGVBbmltYXRlT3V0RW5kLmJpbmQoX3RoaXMpO1xuXG4gICAgX3RoaXMuc3RhdGUgPSB7XG4gICAgICBkaXJlY3Rpb246IG51bGxcbiAgICB9O1xuXG4gICAgX3RoaXMuaXNVbm1vdW50ZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBDYXJvdXNlbEl0ZW0ucHJvdG90eXBlLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgIGlmICh0aGlzLnByb3BzLmFjdGl2ZSAhPT0gbmV4dFByb3BzLmFjdGl2ZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGRpcmVjdGlvbjogbnVsbCB9KTtcbiAgICB9XG4gIH07XG5cbiAgQ2Fyb3VzZWxJdGVtLnByb3RvdHlwZS5jb21wb25lbnREaWRVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgYWN0aXZlID0gdGhpcy5wcm9wcy5hY3RpdmU7XG5cbiAgICB2YXIgcHJldkFjdGl2ZSA9IHByZXZQcm9wcy5hY3RpdmU7XG5cbiAgICBpZiAoIWFjdGl2ZSAmJiBwcmV2QWN0aXZlKSB7XG4gICAgICBfVHJhbnNpdGlvbkV2ZW50czJbJ2RlZmF1bHQnXS5hZGRFbmRFdmVudExpc3RlbmVyKF9yZWFjdERvbTJbJ2RlZmF1bHQnXS5maW5kRE9NTm9kZSh0aGlzKSwgdGhpcy5oYW5kbGVBbmltYXRlT3V0RW5kKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aXZlICE9PSBwcmV2QWN0aXZlKSB7XG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5zdGFydEFuaW1hdGlvbigpO1xuICAgICAgfSwgMjApO1xuICAgIH1cbiAgfTtcblxuICBDYXJvdXNlbEl0ZW0ucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5pc1VubW91bnRlZCA9IHRydWU7XG4gIH07XG5cbiAgQ2Fyb3VzZWxJdGVtLnByb3RvdHlwZS5oYW5kbGVBbmltYXRlT3V0RW5kID0gZnVuY3Rpb24gaGFuZGxlQW5pbWF0ZU91dEVuZCgpIHtcbiAgICBpZiAodGhpcy5pc1VubW91bnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLm9uQW5pbWF0ZU91dEVuZCkge1xuICAgICAgdGhpcy5wcm9wcy5vbkFuaW1hdGVPdXRFbmQodGhpcy5wcm9wcy5pbmRleCk7XG4gICAgfVxuICB9O1xuXG4gIENhcm91c2VsSXRlbS5wcm90b3R5cGUuc3RhcnRBbmltYXRpb24gPSBmdW5jdGlvbiBzdGFydEFuaW1hdGlvbigpIHtcbiAgICBpZiAodGhpcy5pc1VubW91bnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgZGlyZWN0aW9uOiB0aGlzLnByb3BzLmRpcmVjdGlvbiA9PT0gJ3ByZXYnID8gJ3JpZ2h0JyA6ICdsZWZ0J1xuICAgIH0pO1xuICB9O1xuXG4gIENhcm91c2VsSXRlbS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBkaXJlY3Rpb24gPSBfcHJvcHMuZGlyZWN0aW9uLFxuICAgICAgICBhY3RpdmUgPSBfcHJvcHMuYWN0aXZlLFxuICAgICAgICBhbmltYXRlSW4gPSBfcHJvcHMuYW5pbWF0ZUluLFxuICAgICAgICBhbmltYXRlT3V0ID0gX3Byb3BzLmFuaW1hdGVPdXQsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2RpcmVjdGlvbicsICdhY3RpdmUnLCAnYW5pbWF0ZUluJywgJ2FuaW1hdGVPdXQnLCAnY2xhc3NOYW1lJ10pO1xuXG5cbiAgICBkZWxldGUgcHJvcHMub25BbmltYXRlT3V0RW5kO1xuICAgIGRlbGV0ZSBwcm9wcy5pbmRleDtcblxuICAgIHZhciBjbGFzc2VzID0ge1xuICAgICAgaXRlbTogdHJ1ZSxcbiAgICAgIGFjdGl2ZTogYWN0aXZlICYmICFhbmltYXRlSW4gfHwgYW5pbWF0ZU91dFxuICAgIH07XG4gICAgaWYgKGRpcmVjdGlvbiAmJiBhY3RpdmUgJiYgYW5pbWF0ZUluKSB7XG4gICAgICBjbGFzc2VzW2RpcmVjdGlvbl0gPSB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdGF0ZS5kaXJlY3Rpb24gJiYgKGFuaW1hdGVJbiB8fCBhbmltYXRlT3V0KSkge1xuICAgICAgY2xhc3Nlc1t0aGlzLnN0YXRlLmRpcmVjdGlvbl0gPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnZGl2JywgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgcHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBDYXJvdXNlbEl0ZW07XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5DYXJvdXNlbEl0ZW0ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuQ2Fyb3VzZWxJdGVtLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gQ2Fyb3VzZWxJdGVtO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX3dhcm5pbmcgPSByZXF1aXJlKCd3YXJuaW5nJyk7XG5cbnZhciBfd2FybmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93YXJuaW5nKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBpbmxpbmU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgZGlzYWJsZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgLyoqXG4gICAqIE9ubHkgdmFsaWQgaWYgYGlubGluZWAgaXMgbm90IHNldC5cbiAgICovXG4gIHZhbGlkYXRpb25TdGF0ZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZihbJ3N1Y2Nlc3MnLCAnd2FybmluZycsICdlcnJvcicsIG51bGxdKSxcbiAgLyoqXG4gICAqIEF0dGFjaGVzIGEgcmVmIHRvIHRoZSBgPGlucHV0PmAgZWxlbWVudC4gT25seSBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgaGVyZS5cbiAgICpcbiAgICogYGBganNcbiAgICogPENoZWNrYm94IGlucHV0UmVmPXtyZWYgPT4geyB0aGlzLmlucHV0ID0gcmVmOyB9fSAvPlxuICAgKiBgYGBcbiAgICovXG4gIGlucHV0UmVmOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmNcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGlubGluZTogZmFsc2UsXG4gIGRpc2FibGVkOiBmYWxzZVxufTtcblxudmFyIENoZWNrYm94ID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoQ2hlY2tib3gsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIENoZWNrYm94KCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIENoZWNrYm94KTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgQ2hlY2tib3gucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgaW5saW5lID0gX3Byb3BzLmlubGluZSxcbiAgICAgICAgZGlzYWJsZWQgPSBfcHJvcHMuZGlzYWJsZWQsXG4gICAgICAgIHZhbGlkYXRpb25TdGF0ZSA9IF9wcm9wcy52YWxpZGF0aW9uU3RhdGUsXG4gICAgICAgIGlucHV0UmVmID0gX3Byb3BzLmlucHV0UmVmLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBzdHlsZSA9IF9wcm9wcy5zdHlsZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2lubGluZScsICdkaXNhYmxlZCcsICd2YWxpZGF0aW9uU3RhdGUnLCAnaW5wdXRSZWYnLCAnY2xhc3NOYW1lJywgJ3N0eWxlJywgJ2NoaWxkcmVuJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBpbnB1dCA9IF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdpbnB1dCcsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgcmVmOiBpbnB1dFJlZixcbiAgICAgIHR5cGU6ICdjaGVja2JveCcsXG4gICAgICBkaXNhYmxlZDogZGlzYWJsZWRcbiAgICB9KSk7XG5cbiAgICBpZiAoaW5saW5lKSB7XG4gICAgICB2YXIgX2NsYXNzZXMyO1xuXG4gICAgICB2YXIgX2NsYXNzZXMgPSAoX2NsYXNzZXMyID0ge30sIF9jbGFzc2VzMlsoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ2lubGluZScpXSA9IHRydWUsIF9jbGFzc2VzMi5kaXNhYmxlZCA9IGRpc2FibGVkLCBfY2xhc3NlczIpO1xuXG4gICAgICAvLyBVc2UgYSB3YXJuaW5nIGhlcmUgaW5zdGVhZCBvZiBpbiBwcm9wVHlwZXMgdG8gZ2V0IGJldHRlci1sb29raW5nXG4gICAgICAvLyBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbi5cbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyAoMCwgX3dhcm5pbmcyWydkZWZhdWx0J10pKCF2YWxpZGF0aW9uU3RhdGUsICdgdmFsaWRhdGlvblN0YXRlYCBpcyBpZ25vcmVkIG9uIGA8Q2hlY2tib3ggaW5saW5lPmAuIFRvIGRpc3BsYXkgJyArICd2YWxpZGF0aW9uIHN0YXRlIG9uIGFuIGlubGluZSBjaGVja2JveCwgc2V0IGB2YWxpZGF0aW9uU3RhdGVgIG9uIGEgJyArICdwYXJlbnQgYDxGb3JtR3JvdXA+YCBvciBvdGhlciBlbGVtZW50IGluc3RlYWQuJykgOiB2b2lkIDA7XG5cbiAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2xhYmVsJyxcbiAgICAgICAgeyBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBfY2xhc3NlcyksIHN0eWxlOiBzdHlsZSB9LFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgY2hpbGRyZW5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKSwge1xuICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkXG4gICAgfSk7XG4gICAgaWYgKHZhbGlkYXRpb25TdGF0ZSkge1xuICAgICAgY2xhc3Nlc1snaGFzLScgKyB2YWxpZGF0aW9uU3RhdGVdID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnZGl2JyxcbiAgICAgIHsgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcyksIHN0eWxlOiBzdHlsZSB9LFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdsYWJlbCcsXG4gICAgICAgIG51bGwsXG4gICAgICAgIGlucHV0LFxuICAgICAgICBjaGlsZHJlblxuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIENoZWNrYm94O1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuQ2hlY2tib3gucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuQ2hlY2tib3guZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdjaGVja2JveCcsIENoZWNrYm94KTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG52YXIgX2NhcGl0YWxpemUgPSByZXF1aXJlKCcuL3V0aWxzL2NhcGl0YWxpemUnKTtcblxudmFyIF9jYXBpdGFsaXplMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NhcGl0YWxpemUpO1xuXG52YXIgX1N0eWxlQ29uZmlnID0gcmVxdWlyZSgnLi91dGlscy9TdHlsZUNvbmZpZycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiBfZWxlbWVudFR5cGUyWydkZWZhdWx0J10sXG5cbiAgLyoqXG4gICAqIEFwcGx5IGNsZWFyZml4XG4gICAqXG4gICAqIG9uIEV4dHJhIHNtYWxsIGRldmljZXMgUGhvbmVzXG4gICAqXG4gICAqIGFkZHMgY2xhc3MgYHZpc2libGUteHMtYmxvY2tgXG4gICAqL1xuICB2aXNpYmxlWHNCbG9jazogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICAvKipcbiAgICogQXBwbHkgY2xlYXJmaXhcbiAgICpcbiAgICogb24gU21hbGwgZGV2aWNlcyBUYWJsZXRzXG4gICAqXG4gICAqIGFkZHMgY2xhc3MgYHZpc2libGUtc20tYmxvY2tgXG4gICAqL1xuICB2aXNpYmxlU21CbG9jazogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICAvKipcbiAgICogQXBwbHkgY2xlYXJmaXhcbiAgICpcbiAgICogb24gTWVkaXVtIGRldmljZXMgRGVza3RvcHNcbiAgICpcbiAgICogYWRkcyBjbGFzcyBgdmlzaWJsZS1tZC1ibG9ja2BcbiAgICovXG4gIHZpc2libGVNZEJsb2NrOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIC8qKlxuICAgKiBBcHBseSBjbGVhcmZpeFxuICAgKlxuICAgKiBvbiBMYXJnZSBkZXZpY2VzIERlc2t0b3BzXG4gICAqXG4gICAqIGFkZHMgY2xhc3MgYHZpc2libGUtbGctYmxvY2tgXG4gICAqL1xuICB2aXNpYmxlTGdCbG9jazogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjb21wb25lbnRDbGFzczogJ2Rpdidcbn07XG5cbnZhciBDbGVhcmZpeCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKENsZWFyZml4LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBDbGVhcmZpeCgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBDbGVhcmZpeCk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIENsZWFyZml4LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIENvbXBvbmVudCA9IF9wcm9wcy5jb21wb25lbnRDbGFzcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY29tcG9uZW50Q2xhc3MnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG5cbiAgICBfU3R5bGVDb25maWcuREVWSUNFX1NJWkVTLmZvckVhY2goZnVuY3Rpb24gKHNpemUpIHtcbiAgICAgIHZhciBwcm9wTmFtZSA9ICd2aXNpYmxlJyArICgwLCBfY2FwaXRhbGl6ZTJbJ2RlZmF1bHQnXSkoc2l6ZSkgKyAnQmxvY2snO1xuICAgICAgaWYgKGVsZW1lbnRQcm9wc1twcm9wTmFtZV0pIHtcbiAgICAgICAgY2xhc3Nlc1sndmlzaWJsZS0nICsgc2l6ZSArICctYmxvY2snXSA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGRlbGV0ZSBlbGVtZW50UHJvcHNbcHJvcE5hbWVdO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gQ2xlYXJmaXg7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5DbGVhcmZpeC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5DbGVhcmZpeC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2NsZWFyZml4JywgQ2xlYXJmaXgpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgUHJvcFR5cGVzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX3Byb3BUeXBlcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBlbHNlIHsgdmFyIG5ld09iaiA9IHt9OyBpZiAob2JqICE9IG51bGwpIHsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IG5ld09ialsnZGVmYXVsdCddID0gb2JqOyByZXR1cm4gbmV3T2JqOyB9IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBsYWJlbDogUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBvbkNsaWNrOiBQcm9wVHlwZXMuZnVuY1xufTtcblxudmFyIENsb3NlQnV0dG9uID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoQ2xvc2VCdXR0b24sIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIENsb3NlQnV0dG9uKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIENsb3NlQnV0dG9uKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgQ2xvc2VCdXR0b24ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgbGFiZWwgPSBfcHJvcHMubGFiZWwsXG4gICAgICAgIG9uQ2xpY2sgPSBfcHJvcHMub25DbGljaztcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICdidXR0b24nLFxuICAgICAge1xuICAgICAgICB0eXBlOiAnYnV0dG9uJyxcbiAgICAgICAgY2xhc3NOYW1lOiAnY2xvc2UnLFxuICAgICAgICBvbkNsaWNrOiBvbkNsaWNrXG4gICAgICB9LFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdzcGFuJyxcbiAgICAgICAgeyAnYXJpYS1oaWRkZW4nOiAndHJ1ZScgfSxcbiAgICAgICAgJ1xceEQ3J1xuICAgICAgKSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnc3BhbicsXG4gICAgICAgIHsgY2xhc3NOYW1lOiAnc3Itb25seScgfSxcbiAgICAgICAgbGFiZWxcbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBDbG9zZUJ1dHRvbjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbkNsb3NlQnV0dG9uLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gQ2xvc2VCdXR0b247XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfZWxlbWVudFR5cGUgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxudmFyIF9TdHlsZUNvbmZpZyA9IHJlcXVpcmUoJy4vdXRpbHMvU3R5bGVDb25maWcnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBjb21wb25lbnRDbGFzczogX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddLFxuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgeW91IHdpc2ggdG8gc3BhblxuICAgKlxuICAgKiBmb3IgRXh0cmEgc21hbGwgZGV2aWNlcyBQaG9uZXMgKDw3NjhweClcbiAgICpcbiAgICogY2xhc3MtcHJlZml4IGBjb2wteHMtYFxuICAgKi9cbiAgeHM6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBjb2x1bW5zIHlvdSB3aXNoIHRvIHNwYW5cbiAgICpcbiAgICogZm9yIFNtYWxsIGRldmljZXMgVGFibGV0cyAo4omlNzY4cHgpXG4gICAqXG4gICAqIGNsYXNzLXByZWZpeCBgY29sLXNtLWBcbiAgICovXG4gIHNtOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcixcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgY29sdW1ucyB5b3Ugd2lzaCB0byBzcGFuXG4gICAqXG4gICAqIGZvciBNZWRpdW0gZGV2aWNlcyBEZXNrdG9wcyAo4omlOTkycHgpXG4gICAqXG4gICAqIGNsYXNzLXByZWZpeCBgY29sLW1kLWBcbiAgICovXG4gIG1kOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcixcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgY29sdW1ucyB5b3Ugd2lzaCB0byBzcGFuXG4gICAqXG4gICAqIGZvciBMYXJnZSBkZXZpY2VzIERlc2t0b3BzICjiiaUxMjAwcHgpXG4gICAqXG4gICAqIGNsYXNzLXByZWZpeCBgY29sLWxnLWBcbiAgICovXG4gIGxnOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcixcbiAgLyoqXG4gICAqIEhpZGUgY29sdW1uXG4gICAqXG4gICAqIG9uIEV4dHJhIHNtYWxsIGRldmljZXMgUGhvbmVzXG4gICAqXG4gICAqIGFkZHMgY2xhc3MgYGhpZGRlbi14c2BcbiAgICovXG4gIHhzSGlkZGVuOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIC8qKlxuICAgKiBIaWRlIGNvbHVtblxuICAgKlxuICAgKiBvbiBTbWFsbCBkZXZpY2VzIFRhYmxldHNcbiAgICpcbiAgICogYWRkcyBjbGFzcyBgaGlkZGVuLXNtYFxuICAgKi9cbiAgc21IaWRkZW46IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgLyoqXG4gICAqIEhpZGUgY29sdW1uXG4gICAqXG4gICAqIG9uIE1lZGl1bSBkZXZpY2VzIERlc2t0b3BzXG4gICAqXG4gICAqIGFkZHMgY2xhc3MgYGhpZGRlbi1tZGBcbiAgICovXG4gIG1kSGlkZGVuOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIC8qKlxuICAgKiBIaWRlIGNvbHVtblxuICAgKlxuICAgKiBvbiBMYXJnZSBkZXZpY2VzIERlc2t0b3BzXG4gICAqXG4gICAqIGFkZHMgY2xhc3MgYGhpZGRlbi1sZ2BcbiAgICovXG4gIGxnSGlkZGVuOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIC8qKlxuICAgKiBNb3ZlIGNvbHVtbnMgdG8gdGhlIHJpZ2h0XG4gICAqXG4gICAqIGZvciBFeHRyYSBzbWFsbCBkZXZpY2VzIFBob25lc1xuICAgKlxuICAgKiBjbGFzcy1wcmVmaXggYGNvbC14cy1vZmZzZXQtYFxuICAgKi9cbiAgeHNPZmZzZXQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICAvKipcbiAgICogTW92ZSBjb2x1bW5zIHRvIHRoZSByaWdodFxuICAgKlxuICAgKiBmb3IgU21hbGwgZGV2aWNlcyBUYWJsZXRzXG4gICAqXG4gICAqIGNsYXNzLXByZWZpeCBgY29sLXNtLW9mZnNldC1gXG4gICAqL1xuICBzbU9mZnNldDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsXG4gIC8qKlxuICAgKiBNb3ZlIGNvbHVtbnMgdG8gdGhlIHJpZ2h0XG4gICAqXG4gICAqIGZvciBNZWRpdW0gZGV2aWNlcyBEZXNrdG9wc1xuICAgKlxuICAgKiBjbGFzcy1wcmVmaXggYGNvbC1tZC1vZmZzZXQtYFxuICAgKi9cbiAgbWRPZmZzZXQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICAvKipcbiAgICogTW92ZSBjb2x1bW5zIHRvIHRoZSByaWdodFxuICAgKlxuICAgKiBmb3IgTGFyZ2UgZGV2aWNlcyBEZXNrdG9wc1xuICAgKlxuICAgKiBjbGFzcy1wcmVmaXggYGNvbC1sZy1vZmZzZXQtYFxuICAgKi9cbiAgbGdPZmZzZXQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBvcmRlciBvZiBncmlkIGNvbHVtbnMgdG8gdGhlIHJpZ2h0XG4gICAqXG4gICAqIGZvciBFeHRyYSBzbWFsbCBkZXZpY2VzIFBob25lc1xuICAgKlxuICAgKiBjbGFzcy1wcmVmaXggYGNvbC14cy1wdXNoLWBcbiAgICovXG4gIHhzUHVzaDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIG9yZGVyIG9mIGdyaWQgY29sdW1ucyB0byB0aGUgcmlnaHRcbiAgICpcbiAgICogZm9yIFNtYWxsIGRldmljZXMgVGFibGV0c1xuICAgKlxuICAgKiBjbGFzcy1wcmVmaXggYGNvbC1zbS1wdXNoLWBcbiAgICovXG4gIHNtUHVzaDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIG9yZGVyIG9mIGdyaWQgY29sdW1ucyB0byB0aGUgcmlnaHRcbiAgICpcbiAgICogZm9yIE1lZGl1bSBkZXZpY2VzIERlc2t0b3BzXG4gICAqXG4gICAqIGNsYXNzLXByZWZpeCBgY29sLW1kLXB1c2gtYFxuICAgKi9cbiAgbWRQdXNoOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcixcbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgb3JkZXIgb2YgZ3JpZCBjb2x1bW5zIHRvIHRoZSByaWdodFxuICAgKlxuICAgKiBmb3IgTGFyZ2UgZGV2aWNlcyBEZXNrdG9wc1xuICAgKlxuICAgKiBjbGFzcy1wcmVmaXggYGNvbC1sZy1wdXNoLWBcbiAgICovXG4gIGxnUHVzaDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIG9yZGVyIG9mIGdyaWQgY29sdW1ucyB0byB0aGUgbGVmdFxuICAgKlxuICAgKiBmb3IgRXh0cmEgc21hbGwgZGV2aWNlcyBQaG9uZXNcbiAgICpcbiAgICogY2xhc3MtcHJlZml4IGBjb2wteHMtcHVsbC1gXG4gICAqL1xuICB4c1B1bGw6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBvcmRlciBvZiBncmlkIGNvbHVtbnMgdG8gdGhlIGxlZnRcbiAgICpcbiAgICogZm9yIFNtYWxsIGRldmljZXMgVGFibGV0c1xuICAgKlxuICAgKiBjbGFzcy1wcmVmaXggYGNvbC1zbS1wdWxsLWBcbiAgICovXG4gIHNtUHVsbDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIG9yZGVyIG9mIGdyaWQgY29sdW1ucyB0byB0aGUgbGVmdFxuICAgKlxuICAgKiBmb3IgTWVkaXVtIGRldmljZXMgRGVza3RvcHNcbiAgICpcbiAgICogY2xhc3MtcHJlZml4IGBjb2wtbWQtcHVsbC1gXG4gICAqL1xuICBtZFB1bGw6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICAvKipcbiAgICogQ2hhbmdlIHRoZSBvcmRlciBvZiBncmlkIGNvbHVtbnMgdG8gdGhlIGxlZnRcbiAgICpcbiAgICogZm9yIExhcmdlIGRldmljZXMgRGVza3RvcHNcbiAgICpcbiAgICogY2xhc3MtcHJlZml4IGBjb2wtbGctcHVsbC1gXG4gICAqL1xuICBsZ1B1bGw6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjb21wb25lbnRDbGFzczogJ2Rpdidcbn07XG5cbnZhciBDb2wgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShDb2wsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIENvbCgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBDb2wpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBDb2wucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgQ29tcG9uZW50ID0gX3Byb3BzLmNvbXBvbmVudENsYXNzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjb21wb25lbnRDbGFzcycsICdjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSBbXTtcblxuICAgIF9TdHlsZUNvbmZpZy5ERVZJQ0VfU0laRVMuZm9yRWFjaChmdW5jdGlvbiAoc2l6ZSkge1xuICAgICAgZnVuY3Rpb24gcG9wUHJvcChwcm9wU3VmZml4LCBtb2RpZmllcikge1xuICAgICAgICB2YXIgcHJvcE5hbWUgPSAnJyArIHNpemUgKyBwcm9wU3VmZml4O1xuICAgICAgICB2YXIgcHJvcFZhbHVlID0gZWxlbWVudFByb3BzW3Byb3BOYW1lXTtcblxuICAgICAgICBpZiAocHJvcFZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2goKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICcnICsgc2l6ZSArIG1vZGlmaWVyICsgJy0nICsgcHJvcFZhbHVlKSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgZWxlbWVudFByb3BzW3Byb3BOYW1lXTtcbiAgICAgIH1cblxuICAgICAgcG9wUHJvcCgnJywgJycpO1xuICAgICAgcG9wUHJvcCgnT2Zmc2V0JywgJy1vZmZzZXQnKTtcbiAgICAgIHBvcFByb3AoJ1B1c2gnLCAnLXB1c2gnKTtcbiAgICAgIHBvcFByb3AoJ1B1bGwnLCAnLXB1bGwnKTtcblxuICAgICAgdmFyIGhpZGRlblByb3BOYW1lID0gc2l6ZSArICdIaWRkZW4nO1xuICAgICAgaWYgKGVsZW1lbnRQcm9wc1toaWRkZW5Qcm9wTmFtZV0pIHtcbiAgICAgICAgY2xhc3Nlcy5wdXNoKCdoaWRkZW4tJyArIHNpemUpO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGVsZW1lbnRQcm9wc1toaWRkZW5Qcm9wTmFtZV07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBDb2w7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5Db2wucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuQ29sLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnY29sJywgQ29sKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9zdHlsZSA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL3N0eWxlJyk7XG5cbnZhciBfc3R5bGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3R5bGUpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX1RyYW5zaXRpb24gPSByZXF1aXJlKCdyZWFjdC1vdmVybGF5cy9saWIvVHJhbnNpdGlvbicpO1xuXG52YXIgX1RyYW5zaXRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVHJhbnNpdGlvbik7XG5cbnZhciBfY2FwaXRhbGl6ZSA9IHJlcXVpcmUoJy4vdXRpbHMvY2FwaXRhbGl6ZScpO1xuXG52YXIgX2NhcGl0YWxpemUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2FwaXRhbGl6ZSk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmVkRnVuY3Rpb24nKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgTUFSR0lOUyA9IHtcbiAgaGVpZ2h0OiBbJ21hcmdpblRvcCcsICdtYXJnaW5Cb3R0b20nXSxcbiAgd2lkdGg6IFsnbWFyZ2luTGVmdCcsICdtYXJnaW5SaWdodCddXG59O1xuXG4vLyByZWFkaW5nIGEgZGltZW5zaW9uIHByb3Agd2lsbCBjYXVzZSB0aGUgYnJvd3NlciB0byByZWNhbGN1bGF0ZSxcbi8vIHdoaWNoIHdpbGwgbGV0IG91ciBhbmltYXRpb25zIHdvcmtcbmZ1bmN0aW9uIHRyaWdnZXJCcm93c2VyUmVmbG93KG5vZGUpIHtcbiAgbm9kZS5vZmZzZXRIZWlnaHQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG59XG5cbmZ1bmN0aW9uIGdldERpbWVuc2lvblZhbHVlKGRpbWVuc2lvbiwgZWxlbSkge1xuICB2YXIgdmFsdWUgPSBlbGVtWydvZmZzZXQnICsgKDAsIF9jYXBpdGFsaXplMlsnZGVmYXVsdCddKShkaW1lbnNpb24pXTtcbiAgdmFyIG1hcmdpbnMgPSBNQVJHSU5TW2RpbWVuc2lvbl07XG5cbiAgcmV0dXJuIHZhbHVlICsgcGFyc2VJbnQoKDAsIF9zdHlsZTJbJ2RlZmF1bHQnXSkoZWxlbSwgbWFyZ2luc1swXSksIDEwKSArIHBhcnNlSW50KCgwLCBfc3R5bGUyWydkZWZhdWx0J10pKGVsZW0sIG1hcmdpbnNbMV0pLCAxMCk7XG59XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBTaG93IHRoZSBjb21wb25lbnQ7IHRyaWdnZXJzIHRoZSBleHBhbmQgb3IgY29sbGFwc2UgYW5pbWF0aW9uXG4gICAqL1xuICAnaW4nOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIFdhaXQgdW50aWwgdGhlIGZpcnN0IFwiZW50ZXJcIiB0cmFuc2l0aW9uIHRvIG1vdW50IHRoZSBjb21wb25lbnQgKGFkZCBpdCB0byB0aGUgRE9NKVxuICAgKi9cbiAgbW91bnRPbkVudGVyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIFVubW91bnQgdGhlIGNvbXBvbmVudCAocmVtb3ZlIGl0IGZyb20gdGhlIERPTSkgd2hlbiBpdCBpcyBjb2xsYXBzZWRcbiAgICovXG4gIHVubW91bnRPbkV4aXQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogUnVuIHRoZSBleHBhbmQgYW5pbWF0aW9uIHdoZW4gdGhlIGNvbXBvbmVudCBtb3VudHMsIGlmIGl0IGlzIGluaXRpYWxseVxuICAgKiBzaG93blxuICAgKi9cbiAgdHJhbnNpdGlvbkFwcGVhcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBEdXJhdGlvbiBvZiB0aGUgY29sbGFwc2UgYW5pbWF0aW9uIGluIG1pbGxpc2Vjb25kcywgdG8gZW5zdXJlIHRoYXRcbiAgICogZmluaXNoaW5nIGNhbGxiYWNrcyBhcmUgZmlyZWQgZXZlbiBpZiB0aGUgb3JpZ2luYWwgYnJvd3NlciB0cmFuc2l0aW9uIGVuZFxuICAgKiBldmVudHMgYXJlIGNhbmNlbGVkXG4gICAqL1xuICB0aW1lb3V0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcixcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgZXhwYW5kc1xuICAgKi9cbiAgb25FbnRlcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIGNvbXBvbmVudCBzdGFydHMgdG8gZXhwYW5kXG4gICAqL1xuICBvbkVudGVyaW5nOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBleHBhbmRlZFxuICAgKi9cbiAgb25FbnRlcmVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBjb2xsYXBzZXNcbiAgICovXG4gIG9uRXhpdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIGNvbXBvbmVudCBzdGFydHMgdG8gY29sbGFwc2VcbiAgICovXG4gIG9uRXhpdGluZzogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgY29sbGFwc2VkXG4gICAqL1xuICBvbkV4aXRlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuXG4gIC8qKlxuICAgKiBUaGUgZGltZW5zaW9uIHVzZWQgd2hlbiBjb2xsYXBzaW5nLCBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGVcbiAgICogZGltZW5zaW9uXG4gICAqXG4gICAqIF9Ob3RlOiBCb290c3RyYXAgb25seSBwYXJ0aWFsbHkgc3VwcG9ydHMgJ3dpZHRoJyFcbiAgICogWW91IHdpbGwgbmVlZCB0byBzdXBwbHkgeW91ciBvd24gQ1NTIGFuaW1hdGlvbiBmb3IgdGhlIGAud2lkdGhgIENTUyBjbGFzcy5fXG4gICAqL1xuICBkaW1lbnNpb246IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2ZUeXBlKFtfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mKFsnaGVpZ2h0JywgJ3dpZHRoJ10pLCBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmNdKSxcblxuICAvKipcbiAgICogRnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBoZWlnaHQgb3Igd2lkdGggb2YgdGhlIGFuaW1hdGluZyBET00gbm9kZVxuICAgKlxuICAgKiBBbGxvd3MgZm9yIHByb3ZpZGluZyBzb21lIGN1c3RvbSBsb2dpYyBmb3IgaG93IG11Y2ggdGhlIENvbGxhcHNlIGNvbXBvbmVudFxuICAgKiBzaG91bGQgYW5pbWF0ZSBpbiBpdHMgc3BlY2lmaWVkIGRpbWVuc2lvbi4gQ2FsbGVkIHdpdGggdGhlIGN1cnJlbnRcbiAgICogZGltZW5zaW9uIHByb3AgdmFsdWUgYW5kIHRoZSBET00gbm9kZS5cbiAgICovXG4gIGdldERpbWVuc2lvblZhbHVlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLyoqXG4gICAqIEFSSUEgcm9sZSBvZiBjb2xsYXBzaWJsZSBlbGVtZW50XG4gICAqL1xuICByb2xlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZ1xufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgJ2luJzogZmFsc2UsXG4gIHRpbWVvdXQ6IDMwMCxcbiAgbW91bnRPbkVudGVyOiBmYWxzZSxcbiAgdW5tb3VudE9uRXhpdDogZmFsc2UsXG4gIHRyYW5zaXRpb25BcHBlYXI6IGZhbHNlLFxuXG4gIGRpbWVuc2lvbjogJ2hlaWdodCcsXG4gIGdldERpbWVuc2lvblZhbHVlOiBnZXREaW1lbnNpb25WYWx1ZVxufTtcblxudmFyIENvbGxhcHNlID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoQ29sbGFwc2UsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIENvbGxhcHNlKHByb3BzLCBjb250ZXh0KSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgQ29sbGFwc2UpO1xuXG4gICAgdmFyIF90aGlzID0gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgIF90aGlzLmhhbmRsZUVudGVyID0gX3RoaXMuaGFuZGxlRW50ZXIuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaGFuZGxlRW50ZXJpbmcgPSBfdGhpcy5oYW5kbGVFbnRlcmluZy5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5oYW5kbGVFbnRlcmVkID0gX3RoaXMuaGFuZGxlRW50ZXJlZC5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5oYW5kbGVFeGl0ID0gX3RoaXMuaGFuZGxlRXhpdC5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5oYW5kbGVFeGl0aW5nID0gX3RoaXMuaGFuZGxlRXhpdGluZy5iaW5kKF90aGlzKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICAvKiAtLSBFeHBhbmRpbmcgLS0gKi9cblxuXG4gIENvbGxhcHNlLnByb3RvdHlwZS5oYW5kbGVFbnRlciA9IGZ1bmN0aW9uIGhhbmRsZUVudGVyKGVsZW0pIHtcbiAgICB2YXIgZGltZW5zaW9uID0gdGhpcy5fZGltZW5zaW9uKCk7XG4gICAgZWxlbS5zdHlsZVtkaW1lbnNpb25dID0gJzAnO1xuICB9O1xuXG4gIENvbGxhcHNlLnByb3RvdHlwZS5oYW5kbGVFbnRlcmluZyA9IGZ1bmN0aW9uIGhhbmRsZUVudGVyaW5nKGVsZW0pIHtcbiAgICB2YXIgZGltZW5zaW9uID0gdGhpcy5fZGltZW5zaW9uKCk7XG4gICAgZWxlbS5zdHlsZVtkaW1lbnNpb25dID0gdGhpcy5fZ2V0U2Nyb2xsRGltZW5zaW9uVmFsdWUoZWxlbSwgZGltZW5zaW9uKTtcbiAgfTtcblxuICBDb2xsYXBzZS5wcm90b3R5cGUuaGFuZGxlRW50ZXJlZCA9IGZ1bmN0aW9uIGhhbmRsZUVudGVyZWQoZWxlbSkge1xuICAgIHZhciBkaW1lbnNpb24gPSB0aGlzLl9kaW1lbnNpb24oKTtcbiAgICBlbGVtLnN0eWxlW2RpbWVuc2lvbl0gPSBudWxsO1xuICB9O1xuXG4gIC8qIC0tIENvbGxhcHNpbmcgLS0gKi9cblxuXG4gIENvbGxhcHNlLnByb3RvdHlwZS5oYW5kbGVFeGl0ID0gZnVuY3Rpb24gaGFuZGxlRXhpdChlbGVtKSB7XG4gICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuX2RpbWVuc2lvbigpO1xuICAgIGVsZW0uc3R5bGVbZGltZW5zaW9uXSA9IHRoaXMucHJvcHMuZ2V0RGltZW5zaW9uVmFsdWUoZGltZW5zaW9uLCBlbGVtKSArICdweCc7XG4gICAgdHJpZ2dlckJyb3dzZXJSZWZsb3coZWxlbSk7XG4gIH07XG5cbiAgQ29sbGFwc2UucHJvdG90eXBlLmhhbmRsZUV4aXRpbmcgPSBmdW5jdGlvbiBoYW5kbGVFeGl0aW5nKGVsZW0pIHtcbiAgICB2YXIgZGltZW5zaW9uID0gdGhpcy5fZGltZW5zaW9uKCk7XG4gICAgZWxlbS5zdHlsZVtkaW1lbnNpb25dID0gJzAnO1xuICB9O1xuXG4gIENvbGxhcHNlLnByb3RvdHlwZS5fZGltZW5zaW9uID0gZnVuY3Rpb24gX2RpbWVuc2lvbigpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMucHJvcHMuZGltZW5zaW9uID09PSAnZnVuY3Rpb24nID8gdGhpcy5wcm9wcy5kaW1lbnNpb24oKSA6IHRoaXMucHJvcHMuZGltZW5zaW9uO1xuICB9O1xuXG4gIC8vIGZvciB0ZXN0aW5nXG5cblxuICBDb2xsYXBzZS5wcm90b3R5cGUuX2dldFNjcm9sbERpbWVuc2lvblZhbHVlID0gZnVuY3Rpb24gX2dldFNjcm9sbERpbWVuc2lvblZhbHVlKGVsZW0sIGRpbWVuc2lvbikge1xuICAgIHJldHVybiBlbGVtWydzY3JvbGwnICsgKDAsIF9jYXBpdGFsaXplMlsnZGVmYXVsdCddKShkaW1lbnNpb24pXSArICdweCc7XG4gIH07XG5cbiAgQ29sbGFwc2UucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgb25FbnRlciA9IF9wcm9wcy5vbkVudGVyLFxuICAgICAgICBvbkVudGVyaW5nID0gX3Byb3BzLm9uRW50ZXJpbmcsXG4gICAgICAgIG9uRW50ZXJlZCA9IF9wcm9wcy5vbkVudGVyZWQsXG4gICAgICAgIG9uRXhpdCA9IF9wcm9wcy5vbkV4aXQsXG4gICAgICAgIG9uRXhpdGluZyA9IF9wcm9wcy5vbkV4aXRpbmcsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ29uRW50ZXInLCAnb25FbnRlcmluZycsICdvbkVudGVyZWQnLCAnb25FeGl0JywgJ29uRXhpdGluZycsICdjbGFzc05hbWUnXSk7XG5cblxuICAgIGRlbGV0ZSBwcm9wcy5kaW1lbnNpb247XG4gICAgZGVsZXRlIHByb3BzLmdldERpbWVuc2lvblZhbHVlO1xuXG4gICAgdmFyIGhhbmRsZUVudGVyID0gKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKHRoaXMuaGFuZGxlRW50ZXIsIG9uRW50ZXIpO1xuICAgIHZhciBoYW5kbGVFbnRlcmluZyA9ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKSh0aGlzLmhhbmRsZUVudGVyaW5nLCBvbkVudGVyaW5nKTtcbiAgICB2YXIgaGFuZGxlRW50ZXJlZCA9ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKSh0aGlzLmhhbmRsZUVudGVyZWQsIG9uRW50ZXJlZCk7XG4gICAgdmFyIGhhbmRsZUV4aXQgPSAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkodGhpcy5oYW5kbGVFeGl0LCBvbkV4aXQpO1xuICAgIHZhciBoYW5kbGVFeGl0aW5nID0gKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKHRoaXMuaGFuZGxlRXhpdGluZywgb25FeGl0aW5nKTtcblxuICAgIHZhciBjbGFzc2VzID0ge1xuICAgICAgd2lkdGg6IHRoaXMuX2RpbWVuc2lvbigpID09PSAnd2lkdGgnXG4gICAgfTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfVHJhbnNpdGlvbjJbJ2RlZmF1bHQnXSwgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgcHJvcHMsIHtcbiAgICAgICdhcmlhLWV4cGFuZGVkJzogcHJvcHMucm9sZSA/IHByb3BzWydpbiddIDogbnVsbCxcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpLFxuICAgICAgZXhpdGVkQ2xhc3NOYW1lOiAnY29sbGFwc2UnLFxuICAgICAgZXhpdGluZ0NsYXNzTmFtZTogJ2NvbGxhcHNpbmcnLFxuICAgICAgZW50ZXJlZENsYXNzTmFtZTogJ2NvbGxhcHNlIGluJyxcbiAgICAgIGVudGVyaW5nQ2xhc3NOYW1lOiAnY29sbGFwc2luZycsXG4gICAgICBvbkVudGVyOiBoYW5kbGVFbnRlcixcbiAgICAgIG9uRW50ZXJpbmc6IGhhbmRsZUVudGVyaW5nLFxuICAgICAgb25FbnRlcmVkOiBoYW5kbGVFbnRlcmVkLFxuICAgICAgb25FeGl0OiBoYW5kbGVFeGl0LFxuICAgICAgb25FeGl0aW5nOiBoYW5kbGVFeGl0aW5nXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBDb2xsYXBzZTtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbkNvbGxhcHNlLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkNvbGxhcHNlLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gQ29sbGFwc2U7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfd2FybmluZyA9IHJlcXVpcmUoJ3dhcm5pbmcnKTtcblxudmFyIF93YXJuaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3dhcm5pbmcpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBVc2VzIGBjb250cm9sSWRgIGZyb20gYDxGb3JtR3JvdXA+YCBpZiBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQuXG4gICAqL1xuICBodG1sRm9yOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcbiAgc3JPbmx5OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2xcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIHNyT25seTogZmFsc2Vcbn07XG5cbnZhciBjb250ZXh0VHlwZXMgPSB7XG4gICRic19mb3JtR3JvdXA6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub2JqZWN0XG59O1xuXG52YXIgQ29udHJvbExhYmVsID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoQ29udHJvbExhYmVsLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBDb250cm9sTGFiZWwoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgQ29udHJvbExhYmVsKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgQ29udHJvbExhYmVsLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIGZvcm1Hcm91cCA9IHRoaXMuY29udGV4dC4kYnNfZm9ybUdyb3VwO1xuICAgIHZhciBjb250cm9sSWQgPSBmb3JtR3JvdXAgJiYgZm9ybUdyb3VwLmNvbnRyb2xJZDtcblxuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBfcHJvcHMkaHRtbEZvciA9IF9wcm9wcy5odG1sRm9yLFxuICAgICAgICBodG1sRm9yID0gX3Byb3BzJGh0bWxGb3IgPT09IHVuZGVmaW5lZCA/IGNvbnRyb2xJZCA6IF9wcm9wcyRodG1sRm9yLFxuICAgICAgICBzck9ubHkgPSBfcHJvcHMuc3JPbmx5LFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydodG1sRm9yJywgJ3NyT25seScsICdjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/ICgwLCBfd2FybmluZzJbJ2RlZmF1bHQnXSkoY29udHJvbElkID09IG51bGwgfHwgaHRtbEZvciA9PT0gY29udHJvbElkLCAnYGNvbnRyb2xJZGAgaXMgaWdub3JlZCBvbiBgPENvbnRyb2xMYWJlbD5gIHdoZW4gYGh0bWxGb3JgIGlzIHNwZWNpZmllZC4nKSA6IHZvaWQgMDtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyksIHtcbiAgICAgICdzci1vbmx5Jzogc3JPbmx5XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJywgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBodG1sRm9yOiBodG1sRm9yLFxuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIENvbnRyb2xMYWJlbDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbkNvbnRyb2xMYWJlbC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5Db250cm9sTGFiZWwuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuQ29udHJvbExhYmVsLmNvbnRleHRUeXBlcyA9IGNvbnRleHRUeXBlcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnY29udHJvbC1sYWJlbCcsIENvbnRyb2xMYWJlbCk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfYWN0aXZlRWxlbWVudCA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL2FjdGl2ZUVsZW1lbnQnKTtcblxudmFyIF9hY3RpdmVFbGVtZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FjdGl2ZUVsZW1lbnQpO1xuXG52YXIgX2NvbnRhaW5zID0gcmVxdWlyZSgnZG9tLWhlbHBlcnMvcXVlcnkvY29udGFpbnMnKTtcblxudmFyIF9jb250YWluczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb250YWlucyk7XG5cbnZhciBfa2V5Y29kZSA9IHJlcXVpcmUoJ2tleWNvZGUnKTtcblxudmFyIF9rZXljb2RlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2tleWNvZGUpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX3JlYWN0RG9tID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5cbnZhciBfcmVhY3REb20yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3REb20pO1xuXG52YXIgX2FsbCA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2FsbCcpO1xuXG52YXIgX2FsbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hbGwpO1xuXG52YXIgX2VsZW1lbnRUeXBlID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvZWxlbWVudFR5cGUnKTtcblxudmFyIF9lbGVtZW50VHlwZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbGVtZW50VHlwZSk7XG5cbnZhciBfaXNSZXF1aXJlZEZvckExMXkgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9pc1JlcXVpcmVkRm9yQTExeScpO1xuXG52YXIgX2lzUmVxdWlyZWRGb3JBMTF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2lzUmVxdWlyZWRGb3JBMTF5KTtcblxudmFyIF91bmNvbnRyb2xsYWJsZSA9IHJlcXVpcmUoJ3VuY29udHJvbGxhYmxlJyk7XG5cbnZhciBfdW5jb250cm9sbGFibGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdW5jb250cm9sbGFibGUpO1xuXG52YXIgX3dhcm5pbmcgPSByZXF1aXJlKCd3YXJuaW5nJyk7XG5cbnZhciBfd2FybmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93YXJuaW5nKTtcblxudmFyIF9CdXR0b25Hcm91cCA9IHJlcXVpcmUoJy4vQnV0dG9uR3JvdXAnKTtcblxudmFyIF9CdXR0b25Hcm91cDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9CdXR0b25Hcm91cCk7XG5cbnZhciBfRHJvcGRvd25NZW51ID0gcmVxdWlyZSgnLi9Ecm9wZG93bk1lbnUnKTtcblxudmFyIF9Ecm9wZG93bk1lbnUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRHJvcGRvd25NZW51KTtcblxudmFyIF9Ecm9wZG93blRvZ2dsZSA9IHJlcXVpcmUoJy4vRHJvcGRvd25Ub2dnbGUnKTtcblxudmFyIF9Ecm9wZG93blRvZ2dsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ecm9wZG93blRvZ2dsZSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmVkRnVuY3Rpb24nKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKTtcblxudmFyIF9Qcm9wVHlwZXMgPSByZXF1aXJlKCcuL3V0aWxzL1Byb3BUeXBlcycpO1xuXG52YXIgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4gPSByZXF1aXJlKCcuL3V0aWxzL1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4nKTtcblxudmFyIF9WYWxpZENvbXBvbmVudENoaWxkcmVuMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBUT0dHTEVfUk9MRSA9IF9Ecm9wZG93blRvZ2dsZTJbJ2RlZmF1bHQnXS5kZWZhdWx0UHJvcHMuYnNSb2xlO1xudmFyIE1FTlVfUk9MRSA9IF9Ecm9wZG93bk1lbnUyWydkZWZhdWx0J10uZGVmYXVsdFByb3BzLmJzUm9sZTtcblxudmFyIHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIFRoZSBtZW51IHdpbGwgb3BlbiBhYm92ZSB0aGUgZHJvcGRvd24gYnV0dG9uLCBpbnN0ZWFkIG9mIGJlbG93IGl0LlxuICAgKi9cbiAgZHJvcHVwOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIEFuIGh0bWwgaWQgYXR0cmlidXRlLCBuZWNlc3NhcnkgZm9yIGFzc2lzdGl2ZSB0ZWNobm9sb2dpZXMsIHN1Y2ggYXMgc2NyZWVuIHJlYWRlcnMuXG4gICAqIEB0eXBlIHtzdHJpbmd8bnVtYmVyfVxuICAgKiBAcmVxdWlyZWRcbiAgICovXG4gIGlkOiAoMCwgX2lzUmVxdWlyZWRGb3JBMTF5MlsnZGVmYXVsdCddKShfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mVHlwZShbX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsIF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyXSkpLFxuXG4gIGNvbXBvbmVudENsYXNzOiBfZWxlbWVudFR5cGUyWydkZWZhdWx0J10sXG5cbiAgLyoqXG4gICAqIFRoZSBjaGlsZHJlbiBvZiBhIERyb3Bkb3duIG1heSBiZSBhIGA8RHJvcGRvd24uVG9nZ2xlPmAgb3IgYSBgPERyb3Bkb3duLk1lbnU+YC5cbiAgICogQHR5cGUge25vZGV9XG4gICAqL1xuICBjaGlsZHJlbjogKDAsIF9hbGwyWydkZWZhdWx0J10pKCgwLCBfUHJvcFR5cGVzLnJlcXVpcmVkUm9sZXMpKFRPR0dMRV9ST0xFLCBNRU5VX1JPTEUpLCAoMCwgX1Byb3BUeXBlcy5leGNsdXNpdmVSb2xlcykoTUVOVV9ST0xFKSksXG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IGNvbXBvbmVudCBpcyBkaXNhYmxlZC5cbiAgICovXG4gIGRpc2FibGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIEFsaWduIHRoZSBtZW51IHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSBEcm9wZG93biB0b2dnbGVcbiAgICovXG4gIHB1bGxSaWdodDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgRHJvcGRvd24gaXMgdmlzaWJsZS5cbiAgICpcbiAgICogQGNvbnRyb2xsYWJsZSBvblRvZ2dsZVxuICAgKi9cbiAgb3BlbjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZpcmVkIHdoZW4gdGhlIERyb3Bkb3duIHdpc2hlcyB0byBjaGFuZ2UgdmlzaWJpbGl0eS4gQ2FsbGVkIHdpdGggdGhlIHJlcXVlc3RlZFxuICAgKiBgb3BlbmAgdmFsdWUsIHRoZSBET00gZXZlbnQsIGFuZCB0aGUgc291cmNlIHRoYXQgZmlyZWQgaXQ6IGAnY2xpY2snYCxgJ2tleWRvd24nYCxgJ3Jvb3RDbG9zZSdgLCBvciBgJ3NlbGVjdCdgLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBmdW5jdGlvbihCb29sZWFuIGlzT3BlbiwgT2JqZWN0IGV2ZW50LCB7IFN0cmluZyBzb3VyY2UgfSkge31cbiAgICogYGBgXG4gICAqIEBjb250cm9sbGFibGUgb3BlblxuICAgKi9cbiAgb25Ub2dnbGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBmaXJlZCB3aGVuIGEgbWVudSBpdGVtIGlzIHNlbGVjdGVkLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAoZXZlbnRLZXk6IGFueSwgZXZlbnQ6IE9iamVjdCkgPT4gYW55XG4gICAqIGBgYFxuICAgKi9cbiAgb25TZWxlY3Q6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogSWYgYCdtZW51aXRlbSdgLCBjYXVzZXMgdGhlIGRyb3Bkb3duIHRvIGJlaGF2ZSBsaWtlIGEgbWVudSBpdGVtIHJhdGhlciB0aGFuXG4gICAqIGEgbWVudSBidXR0b24uXG4gICAqL1xuICByb2xlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcblxuICAvKipcbiAgICogV2hpY2ggZXZlbnQgd2hlbiBmaXJlZCBvdXRzaWRlIHRoZSBjb21wb25lbnQgd2lsbCBjYXVzZSBpdCB0byBiZSBjbG9zZWRcbiAgICovXG4gIHJvb3RDbG9zZUV2ZW50OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mKFsnY2xpY2snLCAnbW91c2Vkb3duJ10pLFxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25Nb3VzZUVudGVyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25Nb3VzZUxlYXZlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmNcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiBfQnV0dG9uR3JvdXAyWydkZWZhdWx0J11cbn07XG5cbnZhciBEcm9wZG93biA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKERyb3Bkb3duLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBEcm9wZG93bihwcm9wcywgY29udGV4dCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIERyb3Bkb3duKTtcblxuICAgIHZhciBfdGhpcyA9ICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICBfdGhpcy5oYW5kbGVDbGljayA9IF90aGlzLmhhbmRsZUNsaWNrLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmhhbmRsZUtleURvd24gPSBfdGhpcy5oYW5kbGVLZXlEb3duLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmhhbmRsZUNsb3NlID0gX3RoaXMuaGFuZGxlQ2xvc2UuYmluZChfdGhpcyk7XG5cbiAgICBfdGhpcy5fZm9jdXNJbkRyb3Bkb3duID0gZmFsc2U7XG4gICAgX3RoaXMubGFzdE9wZW5FdmVudFR5cGUgPSBudWxsO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIERyb3Bkb3duLnByb3RvdHlwZS5jb21wb25lbnREaWRNb3VudCA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHRoaXMuZm9jdXNOZXh0T25PcGVuKCk7XG4gIH07XG5cbiAgRHJvcGRvd24ucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVXBkYXRlKG5leHRQcm9wcykge1xuICAgIGlmICghbmV4dFByb3BzLm9wZW4gJiYgdGhpcy5wcm9wcy5vcGVuKSB7XG4gICAgICB0aGlzLl9mb2N1c0luRHJvcGRvd24gPSAoMCwgX2NvbnRhaW5zMlsnZGVmYXVsdCddKShfcmVhY3REb20yWydkZWZhdWx0J10uZmluZERPTU5vZGUodGhpcy5tZW51KSwgKDAsIF9hY3RpdmVFbGVtZW50MlsnZGVmYXVsdCddKShkb2N1bWVudCkpO1xuICAgIH1cbiAgfTtcblxuICBEcm9wZG93bi5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgIHZhciBvcGVuID0gdGhpcy5wcm9wcy5vcGVuO1xuXG4gICAgdmFyIHByZXZPcGVuID0gcHJldlByb3BzLm9wZW47XG5cbiAgICBpZiAob3BlbiAmJiAhcHJldk9wZW4pIHtcbiAgICAgIHRoaXMuZm9jdXNOZXh0T25PcGVuKCk7XG4gICAgfVxuXG4gICAgaWYgKCFvcGVuICYmIHByZXZPcGVuKSB7XG4gICAgICAvLyBpZiBmb2N1cyBoYXNuJ3QgYWxyZWFkeSBtb3ZlZCBmcm9tIHRoZSBtZW51IGxldHMgcmV0dXJuIGl0XG4gICAgICAvLyB0byB0aGUgdG9nZ2xlXG4gICAgICBpZiAodGhpcy5fZm9jdXNJbkRyb3Bkb3duKSB7XG4gICAgICAgIHRoaXMuX2ZvY3VzSW5Ecm9wZG93biA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIERyb3Bkb3duLnByb3RvdHlwZS5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50KSB7XG4gICAgaWYgKHRoaXMucHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnRvZ2dsZU9wZW4oZXZlbnQsIHsgc291cmNlOiAnY2xpY2snIH0pO1xuICB9O1xuXG4gIERyb3Bkb3duLnByb3RvdHlwZS5oYW5kbGVLZXlEb3duID0gZnVuY3Rpb24gaGFuZGxlS2V5RG93bihldmVudCkge1xuICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICBjYXNlIF9rZXljb2RlMlsnZGVmYXVsdCddLmNvZGVzLmRvd246XG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5vcGVuKSB7XG4gICAgICAgICAgdGhpcy50b2dnbGVPcGVuKGV2ZW50LCB7IHNvdXJjZTogJ2tleWRvd24nIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubWVudS5mb2N1c05leHQpIHtcbiAgICAgICAgICB0aGlzLm1lbnUuZm9jdXNOZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIF9rZXljb2RlMlsnZGVmYXVsdCddLmNvZGVzLmVzYzpcbiAgICAgIGNhc2UgX2tleWNvZGUyWydkZWZhdWx0J10uY29kZXMudGFiOlxuICAgICAgICB0aGlzLmhhbmRsZUNsb3NlKGV2ZW50LCB7IHNvdXJjZTogJ2tleWRvd24nIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9O1xuXG4gIERyb3Bkb3duLnByb3RvdHlwZS50b2dnbGVPcGVuID0gZnVuY3Rpb24gdG9nZ2xlT3BlbihldmVudCwgZXZlbnREZXRhaWxzKSB7XG4gICAgdmFyIG9wZW4gPSAhdGhpcy5wcm9wcy5vcGVuO1xuXG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIHRoaXMubGFzdE9wZW5FdmVudFR5cGUgPSBldmVudERldGFpbHMuc291cmNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3BzLm9uVG9nZ2xlKSB7XG4gICAgICB0aGlzLnByb3BzLm9uVG9nZ2xlKG9wZW4sIGV2ZW50LCBldmVudERldGFpbHMpO1xuICAgIH1cbiAgfTtcblxuICBEcm9wZG93bi5wcm90b3R5cGUuaGFuZGxlQ2xvc2UgPSBmdW5jdGlvbiBoYW5kbGVDbG9zZShldmVudCwgZXZlbnREZXRhaWxzKSB7XG4gICAgaWYgKCF0aGlzLnByb3BzLm9wZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnRvZ2dsZU9wZW4oZXZlbnQsIGV2ZW50RGV0YWlscyk7XG4gIH07XG5cbiAgRHJvcGRvd24ucHJvdG90eXBlLmZvY3VzTmV4dE9uT3BlbiA9IGZ1bmN0aW9uIGZvY3VzTmV4dE9uT3BlbigpIHtcbiAgICB2YXIgbWVudSA9IHRoaXMubWVudTtcblxuICAgIGlmICghbWVudS5mb2N1c05leHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sYXN0T3BlbkV2ZW50VHlwZSA9PT0gJ2tleWRvd24nIHx8IHRoaXMucHJvcHMucm9sZSA9PT0gJ21lbnVpdGVtJykge1xuICAgICAgbWVudS5mb2N1c05leHQoKTtcbiAgICB9XG4gIH07XG5cbiAgRHJvcGRvd24ucHJvdG90eXBlLmZvY3VzID0gZnVuY3Rpb24gZm9jdXMoKSB7XG4gICAgdmFyIHRvZ2dsZSA9IF9yZWFjdERvbTJbJ2RlZmF1bHQnXS5maW5kRE9NTm9kZSh0aGlzLnRvZ2dsZSk7XG5cbiAgICBpZiAodG9nZ2xlICYmIHRvZ2dsZS5mb2N1cykge1xuICAgICAgdG9nZ2xlLmZvY3VzKCk7XG4gICAgfVxuICB9O1xuXG4gIERyb3Bkb3duLnByb3RvdHlwZS5yZW5kZXJUb2dnbGUgPSBmdW5jdGlvbiByZW5kZXJUb2dnbGUoY2hpbGQsIHByb3BzKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgcmVmID0gZnVuY3Rpb24gcmVmKGMpIHtcbiAgICAgIF90aGlzMi50b2dnbGUgPSBjO1xuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIGNoaWxkLnJlZiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyAoMCwgX3dhcm5pbmcyWydkZWZhdWx0J10pKGZhbHNlLCAnU3RyaW5nIHJlZnMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gYDxEcm9wZG93bi5Ub2dnbGU+YCBjb21wb25lbnRzLiAnICsgJ1RvIGFwcGx5IGEgcmVmIHRvIHRoZSBjb21wb25lbnQgdXNlIHRoZSBjYWxsYmFjayBzaWduYXR1cmU6XFxuXFxuICcgKyAnaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy9tb3JlLWFib3V0LXJlZnMuaHRtbCN0aGUtcmVmLWNhbGxiYWNrLWF0dHJpYnV0ZScpIDogdm9pZCAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWYgPSAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkoY2hpbGQucmVmLCByZWYpO1xuICAgIH1cblxuICAgIHJldHVybiAoMCwgX3JlYWN0LmNsb25lRWxlbWVudCkoY2hpbGQsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIHByb3BzLCB7XG4gICAgICByZWY6IHJlZixcbiAgICAgIGJzQ2xhc3M6ICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShwcm9wcywgJ3RvZ2dsZScpLFxuICAgICAgb25DbGljazogKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKGNoaWxkLnByb3BzLm9uQ2xpY2ssIHRoaXMuaGFuZGxlQ2xpY2spLFxuICAgICAgb25LZXlEb3duOiAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkoY2hpbGQucHJvcHMub25LZXlEb3duLCB0aGlzLmhhbmRsZUtleURvd24pXG4gICAgfSkpO1xuICB9O1xuXG4gIERyb3Bkb3duLnByb3RvdHlwZS5yZW5kZXJNZW51ID0gZnVuY3Rpb24gcmVuZGVyTWVudShjaGlsZCwgX3JlZikge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdmFyIGlkID0gX3JlZi5pZCxcbiAgICAgICAgb25TZWxlY3QgPSBfcmVmLm9uU2VsZWN0LFxuICAgICAgICByb290Q2xvc2VFdmVudCA9IF9yZWYucm9vdENsb3NlRXZlbnQsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3JlZiwgWydpZCcsICdvblNlbGVjdCcsICdyb290Q2xvc2VFdmVudCddKTtcblxuICAgIHZhciByZWYgPSBmdW5jdGlvbiByZWYoYykge1xuICAgICAgX3RoaXMzLm1lbnUgPSBjO1xuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIGNoaWxkLnJlZiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyAoMCwgX3dhcm5pbmcyWydkZWZhdWx0J10pKGZhbHNlLCAnU3RyaW5nIHJlZnMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gYDxEcm9wZG93bi5NZW51PmAgY29tcG9uZW50cy4gJyArICdUbyBhcHBseSBhIHJlZiB0byB0aGUgY29tcG9uZW50IHVzZSB0aGUgY2FsbGJhY2sgc2lnbmF0dXJlOlxcblxcbiAnICsgJ2h0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvbW9yZS1hYm91dC1yZWZzLmh0bWwjdGhlLXJlZi1jYWxsYmFjay1hdHRyaWJ1dGUnKSA6IHZvaWQgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVmID0gKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKGNoaWxkLnJlZiwgcmVmKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGNoaWxkLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBwcm9wcywge1xuICAgICAgcmVmOiByZWYsXG4gICAgICBsYWJlbGxlZEJ5OiBpZCxcbiAgICAgIGJzQ2xhc3M6ICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShwcm9wcywgJ21lbnUnKSxcbiAgICAgIG9uQ2xvc2U6ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKShjaGlsZC5wcm9wcy5vbkNsb3NlLCB0aGlzLmhhbmRsZUNsb3NlKSxcbiAgICAgIG9uU2VsZWN0OiAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkoY2hpbGQucHJvcHMub25TZWxlY3QsIG9uU2VsZWN0LCBmdW5jdGlvbiAoa2V5LCBldmVudCkge1xuICAgICAgICByZXR1cm4gX3RoaXMzLmhhbmRsZUNsb3NlKGV2ZW50LCB7IHNvdXJjZTogJ3NlbGVjdCcgfSk7XG4gICAgICB9KSxcbiAgICAgIHJvb3RDbG9zZUV2ZW50OiByb290Q2xvc2VFdmVudFxuICAgIH0pKTtcbiAgfTtcblxuICBEcm9wZG93bi5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfY2xhc3NlcyxcbiAgICAgICAgX3RoaXM0ID0gdGhpcztcblxuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBDb21wb25lbnQgPSBfcHJvcHMuY29tcG9uZW50Q2xhc3MsXG4gICAgICAgIGlkID0gX3Byb3BzLmlkLFxuICAgICAgICBkcm9wdXAgPSBfcHJvcHMuZHJvcHVwLFxuICAgICAgICBkaXNhYmxlZCA9IF9wcm9wcy5kaXNhYmxlZCxcbiAgICAgICAgcHVsbFJpZ2h0ID0gX3Byb3BzLnB1bGxSaWdodCxcbiAgICAgICAgb3BlbiA9IF9wcm9wcy5vcGVuLFxuICAgICAgICBvblNlbGVjdCA9IF9wcm9wcy5vblNlbGVjdCxcbiAgICAgICAgcm9sZSA9IF9wcm9wcy5yb2xlLFxuICAgICAgICBic0NsYXNzID0gX3Byb3BzLmJzQ2xhc3MsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHJvb3RDbG9zZUV2ZW50ID0gX3Byb3BzLnJvb3RDbG9zZUV2ZW50LFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY29tcG9uZW50Q2xhc3MnLCAnaWQnLCAnZHJvcHVwJywgJ2Rpc2FibGVkJywgJ3B1bGxSaWdodCcsICdvcGVuJywgJ29uU2VsZWN0JywgJ3JvbGUnLCAnYnNDbGFzcycsICdjbGFzc05hbWUnLCAncm9vdENsb3NlRXZlbnQnLCAnY2hpbGRyZW4nXSk7XG5cblxuICAgIGRlbGV0ZSBwcm9wcy5vblRvZ2dsZTtcblxuICAgIHZhciBjbGFzc2VzID0gKF9jbGFzc2VzID0ge30sIF9jbGFzc2VzW2JzQ2xhc3NdID0gdHJ1ZSwgX2NsYXNzZXMub3BlbiA9IG9wZW4sIF9jbGFzc2VzLmRpc2FibGVkID0gZGlzYWJsZWQsIF9jbGFzc2VzKTtcblxuICAgIGlmIChkcm9wdXApIHtcbiAgICAgIGNsYXNzZXNbYnNDbGFzc10gPSBmYWxzZTtcbiAgICAgIGNsYXNzZXMuZHJvcHVwID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGludGVudGlvbmFsbHkgZm9yd2FyZHMgYnNTaXplIGFuZCBic1N0eWxlIChpZiBzZXQpIHRvIHRoZVxuICAgIC8vIHVuZGVybHlpbmcgY29tcG9uZW50LCB0byBhbGxvdyBpdCB0byByZW5kZXIgc2l6ZSBhbmQgc3R5bGUgdmFyaWFudHMuXG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBDb21wb25lbnQsXG4gICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBwcm9wcywge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgICAgfSksXG4gICAgICBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjJbJ2RlZmF1bHQnXS5tYXAoY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBzd2l0Y2ggKGNoaWxkLnByb3BzLmJzUm9sZSkge1xuICAgICAgICAgIGNhc2UgVE9HR0xFX1JPTEU6XG4gICAgICAgICAgICByZXR1cm4gX3RoaXM0LnJlbmRlclRvZ2dsZShjaGlsZCwge1xuICAgICAgICAgICAgICBpZDogaWQsIGRpc2FibGVkOiBkaXNhYmxlZCwgb3Blbjogb3Blbiwgcm9sZTogcm9sZSwgYnNDbGFzczogYnNDbGFzc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgY2FzZSBNRU5VX1JPTEU6XG4gICAgICAgICAgICByZXR1cm4gX3RoaXM0LnJlbmRlck1lbnUoY2hpbGQsIHtcbiAgICAgICAgICAgICAgaWQ6IGlkLCBvcGVuOiBvcGVuLCBwdWxsUmlnaHQ6IHB1bGxSaWdodCwgYnNDbGFzczogYnNDbGFzcywgb25TZWxlY3Q6IG9uU2VsZWN0LCByb290Q2xvc2VFdmVudDogcm9vdENsb3NlRXZlbnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gY2hpbGQ7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gRHJvcGRvd247XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5Ecm9wZG93bi5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5Ecm9wZG93bi5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbigwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2Ryb3Bkb3duJywgRHJvcGRvd24pO1xuXG52YXIgVW5jb250cm9sbGVkRHJvcGRvd24gPSAoMCwgX3VuY29udHJvbGxhYmxlMlsnZGVmYXVsdCddKShEcm9wZG93biwgeyBvcGVuOiAnb25Ub2dnbGUnIH0pO1xuXG5VbmNvbnRyb2xsZWREcm9wZG93bi5Ub2dnbGUgPSBfRHJvcGRvd25Ub2dnbGUyWydkZWZhdWx0J107XG5VbmNvbnRyb2xsZWREcm9wZG93bi5NZW51ID0gX0Ryb3Bkb3duTWVudTJbJ2RlZmF1bHQnXTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gVW5jb250cm9sbGVkRHJvcGRvd247XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9Ecm9wZG93biA9IHJlcXVpcmUoJy4vRHJvcGRvd24nKTtcblxudmFyIF9Ecm9wZG93bjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ecm9wZG93bik7XG5cbnZhciBfc3BsaXRDb21wb25lbnRQcm9wczIgPSByZXF1aXJlKCcuL3V0aWxzL3NwbGl0Q29tcG9uZW50UHJvcHMnKTtcblxudmFyIF9zcGxpdENvbXBvbmVudFByb3BzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NwbGl0Q29tcG9uZW50UHJvcHMyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgX0Ryb3Bkb3duMlsnZGVmYXVsdCddLnByb3BUeXBlcywge1xuXG4gIC8vIFRvZ2dsZSBwcm9wcy5cbiAgYnNTdHlsZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gIGJzU2l6ZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gIHRpdGxlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm5vZGUuaXNSZXF1aXJlZCxcbiAgbm9DYXJldDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8vIE92ZXJyaWRlIGdlbmVyYXRlZCBkb2NzIGZyb20gPERyb3Bkb3duPi5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjaGlsZHJlbjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ub2RlXG59KTtcblxudmFyIERyb3Bkb3duQnV0dG9uID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoRHJvcGRvd25CdXR0b24sIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIERyb3Bkb3duQnV0dG9uKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIERyb3Bkb3duQnV0dG9uKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgRHJvcGRvd25CdXR0b24ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYnNTaXplID0gX3Byb3BzLmJzU2l6ZSxcbiAgICAgICAgYnNTdHlsZSA9IF9wcm9wcy5ic1N0eWxlLFxuICAgICAgICB0aXRsZSA9IF9wcm9wcy50aXRsZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2JzU2l6ZScsICdic1N0eWxlJywgJ3RpdGxlJywgJ2NoaWxkcmVuJ10pO1xuXG4gICAgdmFyIF9zcGxpdENvbXBvbmVudFByb3BzID0gKDAsIF9zcGxpdENvbXBvbmVudFByb3BzM1snZGVmYXVsdCddKShwcm9wcywgX0Ryb3Bkb3duMlsnZGVmYXVsdCddLkNvbnRyb2xsZWRDb21wb25lbnQpLFxuICAgICAgICBkcm9wZG93blByb3BzID0gX3NwbGl0Q29tcG9uZW50UHJvcHNbMF0sXG4gICAgICAgIHRvZ2dsZVByb3BzID0gX3NwbGl0Q29tcG9uZW50UHJvcHNbMV07XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBfRHJvcGRvd24yWydkZWZhdWx0J10sXG4gICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBkcm9wZG93blByb3BzLCB7XG4gICAgICAgIGJzU2l6ZTogYnNTaXplLFxuICAgICAgICBic1N0eWxlOiBic1N0eWxlXG4gICAgICB9KSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICBfRHJvcGRvd24yWydkZWZhdWx0J10uVG9nZ2xlLFxuICAgICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCB0b2dnbGVQcm9wcywge1xuICAgICAgICAgIGJzU2l6ZTogYnNTaXplLFxuICAgICAgICAgIGJzU3R5bGU6IGJzU3R5bGVcbiAgICAgICAgfSksXG4gICAgICAgIHRpdGxlXG4gICAgICApLFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIF9Ecm9wZG93bjJbJ2RlZmF1bHQnXS5NZW51LFxuICAgICAgICBudWxsLFxuICAgICAgICBjaGlsZHJlblxuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIERyb3Bkb3duQnV0dG9uO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuRHJvcGRvd25CdXR0b24ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBEcm9wZG93bkJ1dHRvbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMyA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9mcm9tID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9jb3JlLWpzL2FycmF5L2Zyb20nKTtcblxudmFyIF9mcm9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Zyb20pO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX2tleWNvZGUgPSByZXF1aXJlKCdrZXljb2RlJyk7XG5cbnZhciBfa2V5Y29kZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9rZXljb2RlKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9yZWFjdERvbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuXG52YXIgX3JlYWN0RG9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0RG9tKTtcblxudmFyIF9Sb290Q2xvc2VXcmFwcGVyID0gcmVxdWlyZSgncmVhY3Qtb3ZlcmxheXMvbGliL1Jvb3RDbG9zZVdyYXBwZXInKTtcblxudmFyIF9Sb290Q2xvc2VXcmFwcGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1Jvb3RDbG9zZVdyYXBwZXIpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbiA9IHJlcXVpcmUoJy4vdXRpbHMvY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluZWRGdW5jdGlvbik7XG5cbnZhciBfVmFsaWRDb21wb25lbnRDaGlsZHJlbiA9IHJlcXVpcmUoJy4vdXRpbHMvVmFsaWRDb21wb25lbnRDaGlsZHJlbicpO1xuXG52YXIgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVmFsaWRDb21wb25lbnRDaGlsZHJlbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgb3BlbjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBwdWxsUmlnaHQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgb25DbG9zZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICBsYWJlbGxlZEJ5OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mVHlwZShbX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsIF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyXSksXG4gIG9uU2VsZWN0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIHJvb3RDbG9zZUV2ZW50OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mKFsnY2xpY2snLCAnbW91c2Vkb3duJ10pXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBic1JvbGU6ICdtZW51JyxcbiAgcHVsbFJpZ2h0OiBmYWxzZVxufTtcblxudmFyIERyb3Bkb3duTWVudSA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKERyb3Bkb3duTWVudSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gRHJvcGRvd25NZW51KHByb3BzKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgRHJvcGRvd25NZW51KTtcblxuICAgIHZhciBfdGhpcyA9ICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzKSk7XG5cbiAgICBfdGhpcy5oYW5kbGVSb290Q2xvc2UgPSBfdGhpcy5oYW5kbGVSb290Q2xvc2UuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaGFuZGxlS2V5RG93biA9IF90aGlzLmhhbmRsZUtleURvd24uYmluZChfdGhpcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgRHJvcGRvd25NZW51LnByb3RvdHlwZS5oYW5kbGVSb290Q2xvc2UgPSBmdW5jdGlvbiBoYW5kbGVSb290Q2xvc2UoZXZlbnQpIHtcbiAgICB0aGlzLnByb3BzLm9uQ2xvc2UoZXZlbnQsIHsgc291cmNlOiAncm9vdENsb3NlJyB9KTtcbiAgfTtcblxuICBEcm9wZG93bk1lbnUucHJvdG90eXBlLmhhbmRsZUtleURvd24gPSBmdW5jdGlvbiBoYW5kbGVLZXlEb3duKGV2ZW50KSB7XG4gICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XG4gICAgICBjYXNlIF9rZXljb2RlMlsnZGVmYXVsdCddLmNvZGVzLmRvd246XG4gICAgICAgIHRoaXMuZm9jdXNOZXh0KCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBfa2V5Y29kZTJbJ2RlZmF1bHQnXS5jb2Rlcy51cDpcbiAgICAgICAgdGhpcy5mb2N1c1ByZXZpb3VzKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBfa2V5Y29kZTJbJ2RlZmF1bHQnXS5jb2Rlcy5lc2M6XG4gICAgICBjYXNlIF9rZXljb2RlMlsnZGVmYXVsdCddLmNvZGVzLnRhYjpcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNsb3NlKGV2ZW50LCB7IHNvdXJjZTogJ2tleWRvd24nIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9O1xuXG4gIERyb3Bkb3duTWVudS5wcm90b3R5cGUuZ2V0SXRlbXNBbmRBY3RpdmVJbmRleCA9IGZ1bmN0aW9uIGdldEl0ZW1zQW5kQWN0aXZlSW5kZXgoKSB7XG4gICAgdmFyIGl0ZW1zID0gdGhpcy5nZXRGb2N1c2FibGVNZW51SXRlbXMoKTtcbiAgICB2YXIgYWN0aXZlSW5kZXggPSBpdGVtcy5pbmRleE9mKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIHsgaXRlbXM6IGl0ZW1zLCBhY3RpdmVJbmRleDogYWN0aXZlSW5kZXggfTtcbiAgfTtcblxuICBEcm9wZG93bk1lbnUucHJvdG90eXBlLmdldEZvY3VzYWJsZU1lbnVJdGVtcyA9IGZ1bmN0aW9uIGdldEZvY3VzYWJsZU1lbnVJdGVtcygpIHtcbiAgICB2YXIgbm9kZSA9IF9yZWFjdERvbTJbJ2RlZmF1bHQnXS5maW5kRE9NTm9kZSh0aGlzKTtcbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKDAsIF9mcm9tMlsnZGVmYXVsdCddKShub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ1t0YWJJbmRleD1cIi0xXCJdJykpO1xuICB9O1xuXG4gIERyb3Bkb3duTWVudS5wcm90b3R5cGUuZm9jdXNOZXh0ID0gZnVuY3Rpb24gZm9jdXNOZXh0KCkge1xuICAgIHZhciBfZ2V0SXRlbXNBbmRBY3RpdmVJbmQgPSB0aGlzLmdldEl0ZW1zQW5kQWN0aXZlSW5kZXgoKSxcbiAgICAgICAgaXRlbXMgPSBfZ2V0SXRlbXNBbmRBY3RpdmVJbmQuaXRlbXMsXG4gICAgICAgIGFjdGl2ZUluZGV4ID0gX2dldEl0ZW1zQW5kQWN0aXZlSW5kLmFjdGl2ZUluZGV4O1xuXG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBuZXh0SW5kZXggPSBhY3RpdmVJbmRleCA9PT0gaXRlbXMubGVuZ3RoIC0gMSA/IDAgOiBhY3RpdmVJbmRleCArIDE7XG4gICAgaXRlbXNbbmV4dEluZGV4XS5mb2N1cygpO1xuICB9O1xuXG4gIERyb3Bkb3duTWVudS5wcm90b3R5cGUuZm9jdXNQcmV2aW91cyA9IGZ1bmN0aW9uIGZvY3VzUHJldmlvdXMoKSB7XG4gICAgdmFyIF9nZXRJdGVtc0FuZEFjdGl2ZUluZDIgPSB0aGlzLmdldEl0ZW1zQW5kQWN0aXZlSW5kZXgoKSxcbiAgICAgICAgaXRlbXMgPSBfZ2V0SXRlbXNBbmRBY3RpdmVJbmQyLml0ZW1zLFxuICAgICAgICBhY3RpdmVJbmRleCA9IF9nZXRJdGVtc0FuZEFjdGl2ZUluZDIuYWN0aXZlSW5kZXg7XG5cbiAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHByZXZJbmRleCA9IGFjdGl2ZUluZGV4ID09PSAwID8gaXRlbXMubGVuZ3RoIC0gMSA6IGFjdGl2ZUluZGV4IC0gMTtcbiAgICBpdGVtc1twcmV2SW5kZXhdLmZvY3VzKCk7XG4gIH07XG5cbiAgRHJvcGRvd25NZW51LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9leHRlbmRzMixcbiAgICAgICAgX3RoaXMyID0gdGhpcztcblxuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBvcGVuID0gX3Byb3BzLm9wZW4sXG4gICAgICAgIHB1bGxSaWdodCA9IF9wcm9wcy5wdWxsUmlnaHQsXG4gICAgICAgIGxhYmVsbGVkQnkgPSBfcHJvcHMubGFiZWxsZWRCeSxcbiAgICAgICAgb25TZWxlY3QgPSBfcHJvcHMub25TZWxlY3QsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHJvb3RDbG9zZUV2ZW50ID0gX3Byb3BzLnJvb3RDbG9zZUV2ZW50LFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnb3BlbicsICdwdWxsUmlnaHQnLCAnbGFiZWxsZWRCeScsICdvblNlbGVjdCcsICdjbGFzc05hbWUnLCAncm9vdENsb3NlRXZlbnQnLCAnY2hpbGRyZW4nXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wc0FuZE9taXQgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wc0FuZE9taXQpKHByb3BzLCBbJ29uQ2xvc2UnXSksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzQW5kT21pdFswXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc0FuZE9taXRbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoe30sICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpLCAoX2V4dGVuZHMyID0ge30sIF9leHRlbmRzMlsoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ3JpZ2h0JyldID0gcHVsbFJpZ2h0LCBfZXh0ZW5kczIpKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgIF9Sb290Q2xvc2VXcmFwcGVyMlsnZGVmYXVsdCddLFxuICAgICAge1xuICAgICAgICBkaXNhYmxlZDogIW9wZW4sXG4gICAgICAgIG9uUm9vdENsb3NlOiB0aGlzLmhhbmRsZVJvb3RDbG9zZSxcbiAgICAgICAgZXZlbnQ6IHJvb3RDbG9zZUV2ZW50XG4gICAgICB9LFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICd1bCcsXG4gICAgICAgICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgICAgIHJvbGU6ICdtZW51JyxcbiAgICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKSxcbiAgICAgICAgICAnYXJpYS1sYWJlbGxlZGJ5JzogbGFiZWxsZWRCeVxuICAgICAgICB9KSxcbiAgICAgICAgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yWydkZWZhdWx0J10ubWFwKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNsb25lRWxlbWVudChjaGlsZCwge1xuICAgICAgICAgICAgb25LZXlEb3duOiAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkoY2hpbGQucHJvcHMub25LZXlEb3duLCBfdGhpczIuaGFuZGxlS2V5RG93biksXG4gICAgICAgICAgICBvblNlbGVjdDogKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKGNoaWxkLnByb3BzLm9uU2VsZWN0LCBvblNlbGVjdClcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBEcm9wZG93bk1lbnU7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5Ecm9wZG93bk1lbnUucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuRHJvcGRvd25NZW51LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnZHJvcGRvd24tbWVudScsIERyb3Bkb3duTWVudSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfQnV0dG9uID0gcmVxdWlyZSgnLi9CdXR0b24nKTtcblxudmFyIF9CdXR0b24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQnV0dG9uKTtcblxudmFyIF9TYWZlQW5jaG9yID0gcmVxdWlyZSgnLi9TYWZlQW5jaG9yJyk7XG5cbnZhciBfU2FmZUFuY2hvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TYWZlQW5jaG9yKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBub0NhcmV0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIG9wZW46IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgdGl0bGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICB1c2VBbmNob3I6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbFxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgb3BlbjogZmFsc2UsXG4gIHVzZUFuY2hvcjogZmFsc2UsXG4gIGJzUm9sZTogJ3RvZ2dsZSdcbn07XG5cbnZhciBEcm9wZG93blRvZ2dsZSA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKERyb3Bkb3duVG9nZ2xlLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBEcm9wZG93blRvZ2dsZSgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBEcm9wZG93blRvZ2dsZSk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIERyb3Bkb3duVG9nZ2xlLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIG5vQ2FyZXQgPSBfcHJvcHMubm9DYXJldCxcbiAgICAgICAgb3BlbiA9IF9wcm9wcy5vcGVuLFxuICAgICAgICB1c2VBbmNob3IgPSBfcHJvcHMudXNlQW5jaG9yLFxuICAgICAgICBic0NsYXNzID0gX3Byb3BzLmJzQ2xhc3MsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydub0NhcmV0JywgJ29wZW4nLCAndXNlQW5jaG9yJywgJ2JzQ2xhc3MnLCAnY2xhc3NOYW1lJywgJ2NoaWxkcmVuJ10pO1xuXG5cbiAgICBkZWxldGUgcHJvcHMuYnNSb2xlO1xuXG4gICAgdmFyIENvbXBvbmVudCA9IHVzZUFuY2hvciA/IF9TYWZlQW5jaG9yMlsnZGVmYXVsdCddIDogX0J1dHRvbjJbJ2RlZmF1bHQnXTtcbiAgICB2YXIgdXNlQ2FyZXQgPSAhbm9DYXJldDtcblxuICAgIC8vIFRoaXMgaW50ZW50aW9uYWxseSBmb3J3YXJkcyBic1NpemUgYW5kIGJzU3R5bGUgKGlmIHNldCkgdG8gdGhlXG4gICAgLy8gdW5kZXJseWluZyBjb21wb25lbnQsIHRvIGFsbG93IGl0IHRvIHJlbmRlciBzaXplIGFuZCBzdHlsZSB2YXJpYW50cy5cblxuICAgIC8vIEZJWE1FOiBTaG91bGQgdGhpcyByZWFsbHkgZmFsbCBiYWNrIHRvIGB0aXRsZWAgYXMgY2hpbGRyZW4/XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBDb21wb25lbnQsXG4gICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBwcm9wcywge1xuICAgICAgICByb2xlOiAnYnV0dG9uJyxcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgYnNDbGFzcyksXG4gICAgICAgICdhcmlhLWhhc3BvcHVwJzogdHJ1ZSxcbiAgICAgICAgJ2FyaWEtZXhwYW5kZWQnOiBvcGVuXG4gICAgICB9KSxcbiAgICAgIGNoaWxkcmVuIHx8IHByb3BzLnRpdGxlLFxuICAgICAgdXNlQ2FyZXQgJiYgJyAnLFxuICAgICAgdXNlQ2FyZXQgJiYgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ2NhcmV0JyB9KVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIERyb3Bkb3duVG9nZ2xlO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuRHJvcGRvd25Ub2dnbGUucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuRHJvcGRvd25Ub2dnbGUuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdkcm9wZG93bi10b2dnbGUnLCBEcm9wZG93blRvZ2dsZSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX1RyYW5zaXRpb24gPSByZXF1aXJlKCdyZWFjdC1vdmVybGF5cy9saWIvVHJhbnNpdGlvbicpO1xuXG52YXIgX1RyYW5zaXRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVHJhbnNpdGlvbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIFNob3cgdGhlIGNvbXBvbmVudDsgdHJpZ2dlcnMgdGhlIGZhZGUgaW4gb3IgZmFkZSBvdXQgYW5pbWF0aW9uXG4gICAqL1xuICAnaW4nOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIFdhaXQgdW50aWwgdGhlIGZpcnN0IFwiZW50ZXJcIiB0cmFuc2l0aW9uIHRvIG1vdW50IHRoZSBjb21wb25lbnQgKGFkZCBpdCB0byB0aGUgRE9NKVxuICAgKi9cbiAgbW91bnRPbkVudGVyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIFVubW91bnQgdGhlIGNvbXBvbmVudCAocmVtb3ZlIGl0IGZyb20gdGhlIERPTSkgd2hlbiBpdCBpcyBmYWRlZCBvdXRcbiAgICovXG4gIHVubW91bnRPbkV4aXQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogUnVuIHRoZSBmYWRlIGluIGFuaW1hdGlvbiB3aGVuIHRoZSBjb21wb25lbnQgbW91bnRzLCBpZiBpdCBpcyBpbml0aWFsbHlcbiAgICogc2hvd25cbiAgICovXG4gIHRyYW5zaXRpb25BcHBlYXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogRHVyYXRpb24gb2YgdGhlIGZhZGUgYW5pbWF0aW9uIGluIG1pbGxpc2Vjb25kcywgdG8gZW5zdXJlIHRoYXQgZmluaXNoaW5nXG4gICAqIGNhbGxiYWNrcyBhcmUgZmlyZWQgZXZlbiBpZiB0aGUgb3JpZ2luYWwgYnJvd3NlciB0cmFuc2l0aW9uIGVuZCBldmVudHMgYXJlXG4gICAqIGNhbmNlbGVkXG4gICAqL1xuICB0aW1lb3V0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcixcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgZmFkZXMgaW5cbiAgICovXG4gIG9uRW50ZXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBjb21wb25lbnQgc3RhcnRzIHRvIGZhZGUgaW5cbiAgICovXG4gIG9uRW50ZXJpbmc6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBoYXMgY29tcG9uZW50IGZhZGVkIGluXG4gICAqL1xuICBvbkVudGVyZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGZhZGVzIG91dFxuICAgKi9cbiAgb25FeGl0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgY29tcG9uZW50IHN0YXJ0cyB0byBmYWRlIG91dFxuICAgKi9cbiAgb25FeGl0aW5nOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBmYWRlZCBvdXRcbiAgICovXG4gIG9uRXhpdGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmNcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gICdpbic6IGZhbHNlLFxuICB0aW1lb3V0OiAzMDAsXG4gIG1vdW50T25FbnRlcjogZmFsc2UsXG4gIHVubW91bnRPbkV4aXQ6IGZhbHNlLFxuICB0cmFuc2l0aW9uQXBwZWFyOiBmYWxzZVxufTtcblxudmFyIEZhZGUgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShGYWRlLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBGYWRlKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIEZhZGUpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBGYWRlLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9UcmFuc2l0aW9uMlsnZGVmYXVsdCddLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCB0aGlzLnByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkodGhpcy5wcm9wcy5jbGFzc05hbWUsICdmYWRlJyksXG4gICAgICBlbnRlcmVkQ2xhc3NOYW1lOiAnaW4nLFxuICAgICAgZW50ZXJpbmdDbGFzc05hbWU6ICdpbidcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIEZhZGU7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5GYWRlLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkZhZGUuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBGYWRlO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2VsZW1lbnRUeXBlID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvZWxlbWVudFR5cGUnKTtcblxudmFyIF9lbGVtZW50VHlwZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbGVtZW50VHlwZSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgaG9yaXpvbnRhbDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBpbmxpbmU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgY29tcG9uZW50Q2xhc3M6IF9lbGVtZW50VHlwZTJbJ2RlZmF1bHQnXVxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgaG9yaXpvbnRhbDogZmFsc2UsXG4gIGlubGluZTogZmFsc2UsXG4gIGNvbXBvbmVudENsYXNzOiAnZm9ybSdcbn07XG5cbnZhciBGb3JtID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoRm9ybSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gRm9ybSgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBGb3JtKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgRm9ybS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBob3Jpem9udGFsID0gX3Byb3BzLmhvcml6b250YWwsXG4gICAgICAgIGlubGluZSA9IF9wcm9wcy5pbmxpbmUsXG4gICAgICAgIENvbXBvbmVudCA9IF9wcm9wcy5jb21wb25lbnRDbGFzcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnaG9yaXpvbnRhbCcsICdpbmxpbmUnLCAnY29tcG9uZW50Q2xhc3MnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gW107XG4gICAgaWYgKGhvcml6b250YWwpIHtcbiAgICAgIGNsYXNzZXMucHVzaCgoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ2hvcml6b250YWwnKSk7XG4gICAgfVxuICAgIGlmIChpbmxpbmUpIHtcbiAgICAgIGNsYXNzZXMucHVzaCgoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ2lubGluZScpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBGb3JtO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuRm9ybS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5Gb3JtLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnZm9ybScsIEZvcm0pO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2VsZW1lbnRUeXBlID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvZWxlbWVudFR5cGUnKTtcblxudmFyIF9lbGVtZW50VHlwZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbGVtZW50VHlwZSk7XG5cbnZhciBfd2FybmluZyA9IHJlcXVpcmUoJ3dhcm5pbmcnKTtcblxudmFyIF93YXJuaW5nMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3dhcm5pbmcpO1xuXG52YXIgX0Zvcm1Db250cm9sRmVlZGJhY2sgPSByZXF1aXJlKCcuL0Zvcm1Db250cm9sRmVlZGJhY2snKTtcblxudmFyIF9Gb3JtQ29udHJvbEZlZWRiYWNrMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Zvcm1Db250cm9sRmVlZGJhY2spO1xuXG52YXIgX0Zvcm1Db250cm9sU3RhdGljID0gcmVxdWlyZSgnLi9Gb3JtQ29udHJvbFN0YXRpYycpO1xuXG52YXIgX0Zvcm1Db250cm9sU3RhdGljMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Zvcm1Db250cm9sU3RhdGljKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxudmFyIF9TdHlsZUNvbmZpZyA9IHJlcXVpcmUoJy4vdXRpbHMvU3R5bGVDb25maWcnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBjb21wb25lbnRDbGFzczogX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddLFxuICAvKipcbiAgICogT25seSByZWxldmFudCBpZiBgY29tcG9uZW50Q2xhc3NgIGlzIGAnaW5wdXQnYC5cbiAgICovXG4gIHR5cGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICAvKipcbiAgICogVXNlcyBgY29udHJvbElkYCBmcm9tIGA8Rm9ybUdyb3VwPmAgaWYgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkLlxuICAgKi9cbiAgaWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICAvKipcbiAgICogQXR0YWNoZXMgYSByZWYgdG8gdGhlIGA8aW5wdXQ+YCBlbGVtZW50LiBPbmx5IGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBoZXJlLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiA8Rm9ybUNvbnRyb2wgaW5wdXRSZWY9e3JlZiA9PiB7IHRoaXMuaW5wdXQgPSByZWY7IH19IC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaW5wdXRSZWY6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuY1xufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6ICdpbnB1dCdcbn07XG5cbnZhciBjb250ZXh0VHlwZXMgPSB7XG4gICRic19mb3JtR3JvdXA6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub2JqZWN0XG59O1xuXG52YXIgRm9ybUNvbnRyb2wgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShGb3JtQ29udHJvbCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gRm9ybUNvbnRyb2woKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgRm9ybUNvbnRyb2wpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBGb3JtQ29udHJvbC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBmb3JtR3JvdXAgPSB0aGlzLmNvbnRleHQuJGJzX2Zvcm1Hcm91cDtcbiAgICB2YXIgY29udHJvbElkID0gZm9ybUdyb3VwICYmIGZvcm1Hcm91cC5jb250cm9sSWQ7XG5cbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgQ29tcG9uZW50ID0gX3Byb3BzLmNvbXBvbmVudENsYXNzLFxuICAgICAgICB0eXBlID0gX3Byb3BzLnR5cGUsXG4gICAgICAgIF9wcm9wcyRpZCA9IF9wcm9wcy5pZCxcbiAgICAgICAgaWQgPSBfcHJvcHMkaWQgPT09IHVuZGVmaW5lZCA/IGNvbnRyb2xJZCA6IF9wcm9wcyRpZCxcbiAgICAgICAgaW5wdXRSZWYgPSBfcHJvcHMuaW5wdXRSZWYsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGJzU2l6ZSA9IF9wcm9wcy5ic1NpemUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NvbXBvbmVudENsYXNzJywgJ3R5cGUnLCAnaWQnLCAnaW5wdXRSZWYnLCAnY2xhc3NOYW1lJywgJ2JzU2l6ZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gKDAsIF93YXJuaW5nMlsnZGVmYXVsdCddKShjb250cm9sSWQgPT0gbnVsbCB8fCBpZCA9PT0gY29udHJvbElkLCAnYGNvbnRyb2xJZGAgaXMgaWdub3JlZCBvbiBgPEZvcm1Db250cm9sPmAgd2hlbiBgaWRgIGlzIHNwZWNpZmllZC4nKSA6IHZvaWQgMDtcblxuICAgIC8vIGlucHV0W3R5cGU9XCJmaWxlXCJdIHNob3VsZCBub3QgaGF2ZSAuZm9ybS1jb250cm9sLlxuICAgIHZhciBjbGFzc2VzID0gdm9pZCAwO1xuICAgIGlmICh0eXBlICE9PSAnZmlsZScpIHtcbiAgICAgIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcbiAgICB9XG5cbiAgICAvLyBJZiB1c2VyIHByb3ZpZGVzIGEgc2l6ZSwgbWFrZSBzdXJlIHRvIGFwcGVuZCBpdCB0byBjbGFzc2VzIGFzIGlucHV0LVxuICAgIC8vIGUuZy4gaWYgYnNTaXplIGlzIHNtYWxsLCBpdCB3aWxsIGFwcGVuZCBpbnB1dC1zbVxuICAgIGlmIChic1NpemUpIHtcbiAgICAgIHZhciBzaXplID0gX1N0eWxlQ29uZmlnLlNJWkVfTUFQW2JzU2l6ZV0gfHwgYnNTaXplO1xuICAgICAgY2xhc3Nlc1soMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoeyBic0NsYXNzOiAnaW5wdXQnIH0sIHNpemUpXSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgaWQ6IGlkLFxuICAgICAgcmVmOiBpbnB1dFJlZixcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBGb3JtQ29udHJvbDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbkZvcm1Db250cm9sLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkZvcm1Db250cm9sLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbkZvcm1Db250cm9sLmNvbnRleHRUeXBlcyA9IGNvbnRleHRUeXBlcztcblxuRm9ybUNvbnRyb2wuRmVlZGJhY2sgPSBfRm9ybUNvbnRyb2xGZWVkYmFjazJbJ2RlZmF1bHQnXTtcbkZvcm1Db250cm9sLlN0YXRpYyA9IF9Gb3JtQ29udHJvbFN0YXRpYzJbJ2RlZmF1bHQnXTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnZm9ybS1jb250cm9sJywgKDAsIF9ib290c3RyYXBVdGlscy5ic1NpemVzKShbX1N0eWxlQ29uZmlnLlNpemUuU01BTEwsIF9TdHlsZUNvbmZpZy5TaXplLkxBUkdFXSwgRm9ybUNvbnRyb2wpKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9HbHlwaGljb24gPSByZXF1aXJlKCcuL0dseXBoaWNvbicpO1xuXG52YXIgX0dseXBoaWNvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9HbHlwaGljb24pO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGJzUm9sZTogJ2ZlZWRiYWNrJ1xufTtcblxudmFyIGNvbnRleHRUeXBlcyA9IHtcbiAgJGJzX2Zvcm1Hcm91cDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vYmplY3Rcbn07XG5cbnZhciBGb3JtQ29udHJvbEZlZWRiYWNrID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoRm9ybUNvbnRyb2xGZWVkYmFjaywgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gRm9ybUNvbnRyb2xGZWVkYmFjaygpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBGb3JtQ29udHJvbEZlZWRiYWNrKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgRm9ybUNvbnRyb2xGZWVkYmFjay5wcm90b3R5cGUuZ2V0R2x5cGggPSBmdW5jdGlvbiBnZXRHbHlwaCh2YWxpZGF0aW9uU3RhdGUpIHtcbiAgICBzd2l0Y2ggKHZhbGlkYXRpb25TdGF0ZSkge1xuICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgIHJldHVybiAnb2snO1xuICAgICAgY2FzZSAnd2FybmluZyc6XG4gICAgICAgIHJldHVybiAnd2FybmluZy1zaWduJztcbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgcmV0dXJuICdyZW1vdmUnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9O1xuXG4gIEZvcm1Db250cm9sRmVlZGJhY2sucHJvdG90eXBlLnJlbmRlckRlZmF1bHRGZWVkYmFjayA9IGZ1bmN0aW9uIHJlbmRlckRlZmF1bHRGZWVkYmFjayhmb3JtR3JvdXAsIGNsYXNzTmFtZSwgY2xhc3NlcywgZWxlbWVudFByb3BzKSB7XG4gICAgdmFyIGdseXBoID0gdGhpcy5nZXRHbHlwaChmb3JtR3JvdXAgJiYgZm9ybUdyb3VwLnZhbGlkYXRpb25TdGF0ZSk7XG4gICAgaWYgKCFnbHlwaCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9HbHlwaGljb24yWydkZWZhdWx0J10sICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgZ2x5cGg6IGdseXBoLFxuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG4gIH07XG5cbiAgRm9ybUNvbnRyb2xGZWVkYmFjay5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY2xhc3NOYW1lJywgJ2NoaWxkcmVuJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG5cbiAgICBpZiAoIWNoaWxkcmVuKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJEZWZhdWx0RmVlZGJhY2sodGhpcy5jb250ZXh0LiRic19mb3JtR3JvdXAsIGNsYXNzTmFtZSwgY2xhc3NlcywgZWxlbWVudFByb3BzKTtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGQgPSBfcmVhY3QyWydkZWZhdWx0J10uQ2hpbGRyZW4ub25seShjaGlsZHJlbik7XG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jbG9uZUVsZW1lbnQoY2hpbGQsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNoaWxkLnByb3BzLmNsYXNzTmFtZSwgY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gRm9ybUNvbnRyb2xGZWVkYmFjaztcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbkZvcm1Db250cm9sRmVlZGJhY2suZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuRm9ybUNvbnRyb2xGZWVkYmFjay5jb250ZXh0VHlwZXMgPSBjb250ZXh0VHlwZXM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2Zvcm0tY29udHJvbC1mZWVkYmFjaycsIEZvcm1Db250cm9sRmVlZGJhY2spO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfZWxlbWVudFR5cGUgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBjb21wb25lbnRDbGFzczogX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjb21wb25lbnRDbGFzczogJ3AnXG59O1xuXG52YXIgRm9ybUNvbnRyb2xTdGF0aWMgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShGb3JtQ29udHJvbFN0YXRpYywgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gRm9ybUNvbnRyb2xTdGF0aWMoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgRm9ybUNvbnRyb2xTdGF0aWMpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBGb3JtQ29udHJvbFN0YXRpYy5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBDb21wb25lbnQgPSBfcHJvcHMuY29tcG9uZW50Q2xhc3MsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NvbXBvbmVudENsYXNzJywgJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gRm9ybUNvbnRyb2xTdGF0aWM7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5Gb3JtQ29udHJvbFN0YXRpYy5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5Gb3JtQ29udHJvbFN0YXRpYy5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2Zvcm0tY29udHJvbC1zdGF0aWMnLCBGb3JtQ29udHJvbFN0YXRpYyk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbnZhciBfU3R5bGVDb25maWcgPSByZXF1aXJlKCcuL3V0aWxzL1N0eWxlQ29uZmlnJyk7XG5cbnZhciBfVmFsaWRDb21wb25lbnRDaGlsZHJlbiA9IHJlcXVpcmUoJy4vdXRpbHMvVmFsaWRDb21wb25lbnRDaGlsZHJlbicpO1xuXG52YXIgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVmFsaWRDb21wb25lbnRDaGlsZHJlbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIFNldHMgYGlkYCBvbiBgPEZvcm1Db250cm9sPmAgYW5kIGBodG1sRm9yYCBvbiBgPEZvcm1Hcm91cC5MYWJlbD5gLlxuICAgKi9cbiAgY29udHJvbElkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcbiAgdmFsaWRhdGlvblN0YXRlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mKFsnc3VjY2VzcycsICd3YXJuaW5nJywgJ2Vycm9yJywgbnVsbF0pXG59O1xuXG52YXIgY2hpbGRDb250ZXh0VHlwZXMgPSB7XG4gICRic19mb3JtR3JvdXA6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub2JqZWN0LmlzUmVxdWlyZWRcbn07XG5cbnZhciBGb3JtR3JvdXAgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShGb3JtR3JvdXAsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEZvcm1Hcm91cCgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBGb3JtR3JvdXApO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBGb3JtR3JvdXAucHJvdG90eXBlLmdldENoaWxkQ29udGV4dCA9IGZ1bmN0aW9uIGdldENoaWxkQ29udGV4dCgpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY29udHJvbElkID0gX3Byb3BzLmNvbnRyb2xJZCxcbiAgICAgICAgdmFsaWRhdGlvblN0YXRlID0gX3Byb3BzLnZhbGlkYXRpb25TdGF0ZTtcblxuXG4gICAgcmV0dXJuIHtcbiAgICAgICRic19mb3JtR3JvdXA6IHtcbiAgICAgICAgY29udHJvbElkOiBjb250cm9sSWQsXG4gICAgICAgIHZhbGlkYXRpb25TdGF0ZTogdmFsaWRhdGlvblN0YXRlXG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBGb3JtR3JvdXAucHJvdG90eXBlLmhhc0ZlZWRiYWNrID0gZnVuY3Rpb24gaGFzRmVlZGJhY2soY2hpbGRyZW4pIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHJldHVybiBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjJbJ2RlZmF1bHQnXS5zb21lKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIHJldHVybiBjaGlsZC5wcm9wcy5ic1JvbGUgPT09ICdmZWVkYmFjaycgfHwgY2hpbGQucHJvcHMuY2hpbGRyZW4gJiYgX3RoaXMyLmhhc0ZlZWRiYWNrKGNoaWxkLnByb3BzLmNoaWxkcmVuKTtcbiAgICB9KTtcbiAgfTtcblxuICBGb3JtR3JvdXAucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIHZhbGlkYXRpb25TdGF0ZSA9IF9wcm9wczIudmFsaWRhdGlvblN0YXRlLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMyLmNsYXNzTmFtZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMyLmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wczIsIFsndmFsaWRhdGlvblN0YXRlJywgJ2NsYXNzTmFtZScsICdjaGlsZHJlbiddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzQW5kT21pdCA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzQW5kT21pdCkocHJvcHMsIFsnY29udHJvbElkJ10pLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc0FuZE9taXRbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNBbmRPbWl0WzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKSwge1xuICAgICAgJ2hhcy1mZWVkYmFjayc6IHRoaXMuaGFzRmVlZGJhY2soY2hpbGRyZW4pXG4gICAgfSk7XG4gICAgaWYgKHZhbGlkYXRpb25TdGF0ZSkge1xuICAgICAgY2xhc3Nlc1snaGFzLScgKyB2YWxpZGF0aW9uU3RhdGVdID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnZGl2JyxcbiAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgICAgfSksXG4gICAgICBjaGlsZHJlblxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIEZvcm1Hcm91cDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbkZvcm1Hcm91cC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5Gb3JtR3JvdXAuY2hpbGRDb250ZXh0VHlwZXMgPSBjaGlsZENvbnRleHRUeXBlcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnZm9ybS1ncm91cCcsICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNTaXplcykoW19TdHlsZUNvbmZpZy5TaXplLkxBUkdFLCBfU3R5bGVDb25maWcuU2l6ZS5TTUFMTF0sIEZvcm1Hcm91cCkpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMzID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzNCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMzKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBBbiBpY29uIG5hbWUgd2l0aG91dCBcImdseXBoaWNvbi1cIiBwcmVmaXguIFNlZSBlLmcuIGh0dHA6Ly9nZXRib290c3RyYXAuY29tL2NvbXBvbmVudHMvI2dseXBoaWNvbnNcbiAgICovXG4gIGdseXBoOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZy5pc1JlcXVpcmVkXG59O1xuXG52YXIgR2x5cGhpY29uID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoR2x5cGhpY29uLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBHbHlwaGljb24oKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgR2x5cGhpY29uKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgR2x5cGhpY29uLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9leHRlbmRzMjtcblxuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBnbHlwaCA9IF9wcm9wcy5nbHlwaCxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnZ2x5cGgnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyksIChfZXh0ZW5kczIgPSB7fSwgX2V4dGVuZHMyWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCBnbHlwaCldID0gdHJ1ZSwgX2V4dGVuZHMyKSk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBHbHlwaGljb247XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5HbHlwaGljb24ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdnbHlwaGljb24nLCBHbHlwaGljb24pO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2VsZW1lbnRUeXBlID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvZWxlbWVudFR5cGUnKTtcblxudmFyIF9lbGVtZW50VHlwZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbGVtZW50VHlwZSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIFR1cm4gYW55IGZpeGVkLXdpZHRoIGdyaWQgbGF5b3V0IGludG8gYSBmdWxsLXdpZHRoIGxheW91dCBieSB0aGlzIHByb3BlcnR5LlxuICAgKlxuICAgKiBBZGRzIGBjb250YWluZXItZmx1aWRgIGNsYXNzLlxuICAgKi9cbiAgZmx1aWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgLyoqXG4gICAqIFlvdSBjYW4gdXNlIGEgY3VzdG9tIGVsZW1lbnQgZm9yIHRoaXMgY29tcG9uZW50XG4gICAqL1xuICBjb21wb25lbnRDbGFzczogX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjb21wb25lbnRDbGFzczogJ2RpdicsXG4gIGZsdWlkOiBmYWxzZVxufTtcblxudmFyIEdyaWQgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShHcmlkLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBHcmlkKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIEdyaWQpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBHcmlkLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGZsdWlkID0gX3Byb3BzLmZsdWlkLFxuICAgICAgICBDb21wb25lbnQgPSBfcHJvcHMuY29tcG9uZW50Q2xhc3MsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2ZsdWlkJywgJ2NvbXBvbmVudENsYXNzJywgJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCBmbHVpZCAmJiAnZmx1aWQnKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChDb21wb25lbnQsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIEdyaWQ7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5HcmlkLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkdyaWQuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdjb250YWluZXInLCBHcmlkKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBIZWxwQmxvY2sgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShIZWxwQmxvY2ssIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIEhlbHBCbG9jaygpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBIZWxwQmxvY2spO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBIZWxwQmxvY2sucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBIZWxwQmxvY2s7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdoZWxwLWJsb2NrJywgSGVscEJsb2NrKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogU2V0cyBpbWFnZSBhcyByZXNwb25zaXZlIGltYWdlXG4gICAqL1xuICByZXNwb25zaXZlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIFNldHMgaW1hZ2Ugc2hhcGUgYXMgcm91bmRlZFxuICAgKi9cbiAgcm91bmRlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBTZXRzIGltYWdlIHNoYXBlIGFzIGNpcmNsZVxuICAgKi9cbiAgY2lyY2xlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIFNldHMgaW1hZ2Ugc2hhcGUgYXMgdGh1bWJuYWlsXG4gICAqL1xuICB0aHVtYm5haWw6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbFxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgcmVzcG9uc2l2ZTogZmFsc2UsXG4gIHJvdW5kZWQ6IGZhbHNlLFxuICBjaXJjbGU6IGZhbHNlLFxuICB0aHVtYm5haWw6IGZhbHNlXG59O1xuXG52YXIgSW1hZ2UgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShJbWFnZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gSW1hZ2UoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgSW1hZ2UpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBJbWFnZS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfY2xhc3NlcztcblxuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICByZXNwb25zaXZlID0gX3Byb3BzLnJlc3BvbnNpdmUsXG4gICAgICAgIHJvdW5kZWQgPSBfcHJvcHMucm91bmRlZCxcbiAgICAgICAgY2lyY2xlID0gX3Byb3BzLmNpcmNsZSxcbiAgICAgICAgdGh1bWJuYWlsID0gX3Byb3BzLnRodW1ibmFpbCxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsncmVzcG9uc2l2ZScsICdyb3VuZGVkJywgJ2NpcmNsZScsICd0aHVtYm5haWwnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKF9jbGFzc2VzID0ge30sIF9jbGFzc2VzWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAncmVzcG9uc2l2ZScpXSA9IHJlc3BvbnNpdmUsIF9jbGFzc2VzWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAncm91bmRlZCcpXSA9IHJvdW5kZWQsIF9jbGFzc2VzWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnY2lyY2xlJyldID0gY2lyY2xlLCBfY2xhc3Nlc1soMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ3RodW1ibmFpbCcpXSA9IHRodW1ibmFpbCwgX2NsYXNzZXMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdpbWcnLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBJbWFnZTtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbkltYWdlLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkltYWdlLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnaW1nJywgSW1hZ2UpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfSW5wdXRHcm91cEFkZG9uID0gcmVxdWlyZSgnLi9JbnB1dEdyb3VwQWRkb24nKTtcblxudmFyIF9JbnB1dEdyb3VwQWRkb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfSW5wdXRHcm91cEFkZG9uKTtcblxudmFyIF9JbnB1dEdyb3VwQnV0dG9uID0gcmVxdWlyZSgnLi9JbnB1dEdyb3VwQnV0dG9uJyk7XG5cbnZhciBfSW5wdXRHcm91cEJ1dHRvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9JbnB1dEdyb3VwQnV0dG9uKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxudmFyIF9TdHlsZUNvbmZpZyA9IHJlcXVpcmUoJy4vdXRpbHMvU3R5bGVDb25maWcnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgSW5wdXRHcm91cCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKElucHV0R3JvdXAsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIElucHV0R3JvdXAoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgSW5wdXRHcm91cCk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIElucHV0R3JvdXAucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBJbnB1dEdyb3VwO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuSW5wdXRHcm91cC5BZGRvbiA9IF9JbnB1dEdyb3VwQWRkb24yWydkZWZhdWx0J107XG5JbnB1dEdyb3VwLkJ1dHRvbiA9IF9JbnB1dEdyb3VwQnV0dG9uMlsnZGVmYXVsdCddO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdpbnB1dC1ncm91cCcsICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNTaXplcykoW19TdHlsZUNvbmZpZy5TaXplLkxBUkdFLCBfU3R5bGVDb25maWcuU2l6ZS5TTUFMTF0sIElucHV0R3JvdXApKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBJbnB1dEdyb3VwQWRkb24gPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShJbnB1dEdyb3VwQWRkb24sIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIElucHV0R3JvdXBBZGRvbigpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBJbnB1dEdyb3VwQWRkb24pO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBJbnB1dEdyb3VwQWRkb24ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBJbnB1dEdyb3VwQWRkb247XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdpbnB1dC1ncm91cC1hZGRvbicsIElucHV0R3JvdXBBZGRvbik7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgSW5wdXRHcm91cEJ1dHRvbiA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKElucHV0R3JvdXBCdXR0b24sIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIElucHV0R3JvdXBCdXR0b24oKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgSW5wdXRHcm91cEJ1dHRvbik7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIElucHV0R3JvdXBCdXR0b24ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBJbnB1dEdyb3VwQnV0dG9uO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnaW5wdXQtZ3JvdXAtYnRuJywgSW5wdXRHcm91cEJ1dHRvbik7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiBfZWxlbWVudFR5cGUyWydkZWZhdWx0J11cbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiAnZGl2J1xufTtcblxudmFyIEp1bWJvdHJvbiA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKEp1bWJvdHJvbiwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gSnVtYm90cm9uKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIEp1bWJvdHJvbik7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIEp1bWJvdHJvbi5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBDb21wb25lbnQgPSBfcHJvcHMuY29tcG9uZW50Q2xhc3MsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NvbXBvbmVudENsYXNzJywgJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gSnVtYm90cm9uO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuSnVtYm90cm9uLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbkp1bWJvdHJvbi5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2p1bWJvdHJvbicsIEp1bWJvdHJvbik7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfdmFsdWVzID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC92YWx1ZXMnKTtcblxudmFyIF92YWx1ZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdmFsdWVzKTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG52YXIgX1N0eWxlQ29uZmlnID0gcmVxdWlyZSgnLi91dGlscy9TdHlsZUNvbmZpZycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBMYWJlbCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKExhYmVsLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBMYWJlbCgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBMYWJlbCk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIExhYmVsLnByb3RvdHlwZS5oYXNDb250ZW50ID0gZnVuY3Rpb24gaGFzQ29udGVudChjaGlsZHJlbikge1xuICAgIHZhciByZXN1bHQgPSBmYWxzZTtcblxuICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hpbGQgfHwgY2hpbGQgPT09IDApIHtcbiAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgTGFiZWwucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NsYXNzTmFtZScsICdjaGlsZHJlbiddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpLCB7XG5cbiAgICAgIC8vIEhhY2sgZm9yIGNvbGxhcHNpbmcgb24gSUU4LlxuICAgICAgaGlkZGVuOiAhdGhpcy5oYXNDb250ZW50KGNoaWxkcmVuKVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ3NwYW4nLFxuICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgICB9KSxcbiAgICAgIGNoaWxkcmVuXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gTGFiZWw7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdsYWJlbCcsICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNTdHlsZXMpKFtdLmNvbmNhdCgoMCwgX3ZhbHVlczJbJ2RlZmF1bHQnXSkoX1N0eWxlQ29uZmlnLlN0YXRlKSwgW19TdHlsZUNvbmZpZy5TdHlsZS5ERUZBVUxULCBfU3R5bGVDb25maWcuU3R5bGUuUFJJTUFSWV0pLCBfU3R5bGVDb25maWcuU3R5bGUuREVGQVVMVCwgTGFiZWwpKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX2VsZW1lbnRUeXBlID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvZWxlbWVudFR5cGUnKTtcblxudmFyIF9lbGVtZW50VHlwZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbGVtZW50VHlwZSk7XG5cbnZhciBfTGlzdEdyb3VwSXRlbSA9IHJlcXVpcmUoJy4vTGlzdEdyb3VwSXRlbScpO1xuXG52YXIgX0xpc3RHcm91cEl0ZW0yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTGlzdEdyb3VwSXRlbSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbnZhciBfVmFsaWRDb21wb25lbnRDaGlsZHJlbiA9IHJlcXVpcmUoJy4vdXRpbHMvVmFsaWRDb21wb25lbnRDaGlsZHJlbicpO1xuXG52YXIgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVmFsaWRDb21wb25lbnRDaGlsZHJlbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIFlvdSBjYW4gdXNlIGEgY3VzdG9tIGVsZW1lbnQgdHlwZSBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAqXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBgJ2xpJ2AgaWYgZXZlcnkgY2hpbGQgaXMgYVxuICAgKiBub24tYWN0aW9uYWJsZSBgPExpc3RHcm91cEl0ZW0+YCwgYW5kIGAnZGl2J2Agb3RoZXJ3aXNlLlxuICAgKi9cbiAgY29tcG9uZW50Q2xhc3M6IF9lbGVtZW50VHlwZTJbJ2RlZmF1bHQnXVxufTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdENvbXBvbmVudChjaGlsZHJlbikge1xuICBpZiAoIWNoaWxkcmVuKSB7XG4gICAgLy8gRklYTUU6IFRoaXMgaXMgdGhlIG9sZCBiZWhhdmlvci4gSXMgdGhpcyByaWdodD9cbiAgICByZXR1cm4gJ2Rpdic7XG4gIH1cblxuICBpZiAoX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yWydkZWZhdWx0J10uc29tZShjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgcmV0dXJuIGNoaWxkLnR5cGUgIT09IF9MaXN0R3JvdXBJdGVtMlsnZGVmYXVsdCddIHx8IGNoaWxkLnByb3BzLmhyZWYgfHwgY2hpbGQucHJvcHMub25DbGljaztcbiAgfSkpIHtcbiAgICByZXR1cm4gJ2Rpdic7XG4gIH1cblxuICByZXR1cm4gJ3VsJztcbn1cblxudmFyIExpc3RHcm91cCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKExpc3RHcm91cCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTGlzdEdyb3VwKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIExpc3RHcm91cCk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIExpc3RHcm91cC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgX3Byb3BzJGNvbXBvbmVudENsYXNzID0gX3Byb3BzLmNvbXBvbmVudENsYXNzLFxuICAgICAgICBDb21wb25lbnQgPSBfcHJvcHMkY29tcG9uZW50Q2xhc3MgPT09IHVuZGVmaW5lZCA/IGdldERlZmF1bHRDb21wb25lbnQoY2hpbGRyZW4pIDogX3Byb3BzJGNvbXBvbmVudENsYXNzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjaGlsZHJlbicsICdjb21wb25lbnRDbGFzcycsICdjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcblxuICAgIHZhciB1c2VMaXN0SXRlbSA9IENvbXBvbmVudCA9PT0gJ3VsJyAmJiBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjJbJ2RlZmF1bHQnXS5ldmVyeShjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICByZXR1cm4gY2hpbGQudHlwZSA9PT0gX0xpc3RHcm91cEl0ZW0yWydkZWZhdWx0J107XG4gICAgfSk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBDb21wb25lbnQsXG4gICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICAgIH0pLFxuICAgICAgdXNlTGlzdEl0ZW0gPyBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjJbJ2RlZmF1bHQnXS5tYXAoY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGNoaWxkLCB7IGxpc3RJdGVtOiB0cnVlIH0pO1xuICAgICAgfSkgOiBjaGlsZHJlblxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIExpc3RHcm91cDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbkxpc3RHcm91cC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2xpc3QtZ3JvdXAnLCBMaXN0R3JvdXApO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3ZhbHVlcyA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvdmFsdWVzJyk7XG5cbnZhciBfdmFsdWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3ZhbHVlcyk7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbnZhciBfU3R5bGVDb25maWcgPSByZXF1aXJlKCcuL3V0aWxzL1N0eWxlQ29uZmlnJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgYWN0aXZlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmFueSxcbiAgZGlzYWJsZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYW55LFxuICBoZWFkZXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubm9kZSxcbiAgbGlzdEl0ZW06IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgb25DbGljazogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICBocmVmOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcbiAgdHlwZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmdcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGxpc3RJdGVtOiBmYWxzZVxufTtcblxudmFyIExpc3RHcm91cEl0ZW0gPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShMaXN0R3JvdXBJdGVtLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBMaXN0R3JvdXBJdGVtKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIExpc3RHcm91cEl0ZW0pO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBMaXN0R3JvdXBJdGVtLnByb3RvdHlwZS5yZW5kZXJIZWFkZXIgPSBmdW5jdGlvbiByZW5kZXJIZWFkZXIoaGVhZGVyLCBoZWFkaW5nQ2xhc3NOYW1lKSB7XG4gICAgaWYgKF9yZWFjdDJbJ2RlZmF1bHQnXS5pc1ZhbGlkRWxlbWVudChoZWFkZXIpKSB7XG4gICAgICByZXR1cm4gKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGhlYWRlciwge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoaGVhZGVyLnByb3BzLmNsYXNzTmFtZSwgaGVhZGluZ0NsYXNzTmFtZSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICdoNCcsXG4gICAgICB7IGNsYXNzTmFtZTogaGVhZGluZ0NsYXNzTmFtZSB9LFxuICAgICAgaGVhZGVyXG4gICAgKTtcbiAgfTtcblxuICBMaXN0R3JvdXBJdGVtLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGFjdGl2ZSA9IF9wcm9wcy5hY3RpdmUsXG4gICAgICAgIGRpc2FibGVkID0gX3Byb3BzLmRpc2FibGVkLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBoZWFkZXIgPSBfcHJvcHMuaGVhZGVyLFxuICAgICAgICBsaXN0SXRlbSA9IF9wcm9wcy5saXN0SXRlbSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2FjdGl2ZScsICdkaXNhYmxlZCcsICdjbGFzc05hbWUnLCAnaGVhZGVyJywgJ2xpc3RJdGVtJywgJ2NoaWxkcmVuJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyksIHtcbiAgICAgIGFjdGl2ZTogYWN0aXZlLFxuICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkXG4gICAgfSk7XG5cbiAgICB2YXIgQ29tcG9uZW50ID0gdm9pZCAwO1xuXG4gICAgaWYgKGVsZW1lbnRQcm9wcy5ocmVmKSB7XG4gICAgICBDb21wb25lbnQgPSAnYSc7XG4gICAgfSBlbHNlIGlmIChlbGVtZW50UHJvcHMub25DbGljaykge1xuICAgICAgQ29tcG9uZW50ID0gJ2J1dHRvbic7XG4gICAgICBlbGVtZW50UHJvcHMudHlwZSA9IGVsZW1lbnRQcm9wcy50eXBlIHx8ICdidXR0b24nO1xuICAgIH0gZWxzZSBpZiAobGlzdEl0ZW0pIHtcbiAgICAgIENvbXBvbmVudCA9ICdsaSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIENvbXBvbmVudCA9ICdzcGFuJztcbiAgICB9XG5cbiAgICBlbGVtZW50UHJvcHMuY2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpO1xuXG4gICAgLy8gVE9ETzogRGVwcmVjYXRlIGBoZWFkZXJgIHByb3AuXG4gICAgaWYgKGhlYWRlcikge1xuICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICBDb21wb25lbnQsXG4gICAgICAgIGVsZW1lbnRQcm9wcyxcbiAgICAgICAgdGhpcy5yZW5kZXJIZWFkZXIoaGVhZGVyLCAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ2hlYWRpbmcnKSksXG4gICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICdwJyxcbiAgICAgICAgICB7IGNsYXNzTmFtZTogKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICd0ZXh0JykgfSxcbiAgICAgICAgICBjaGlsZHJlblxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgIENvbXBvbmVudCxcbiAgICAgIGVsZW1lbnRQcm9wcyxcbiAgICAgIGNoaWxkcmVuXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gTGlzdEdyb3VwSXRlbTtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbkxpc3RHcm91cEl0ZW0ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuTGlzdEdyb3VwSXRlbS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2xpc3QtZ3JvdXAtaXRlbScsICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNTdHlsZXMpKCgwLCBfdmFsdWVzMlsnZGVmYXVsdCddKShfU3R5bGVDb25maWcuU3RhdGUpLCBMaXN0R3JvdXBJdGVtKSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX01lZGlhQm9keSA9IHJlcXVpcmUoJy4vTWVkaWFCb2R5Jyk7XG5cbnZhciBfTWVkaWFCb2R5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01lZGlhQm9keSk7XG5cbnZhciBfTWVkaWFIZWFkaW5nID0gcmVxdWlyZSgnLi9NZWRpYUhlYWRpbmcnKTtcblxudmFyIF9NZWRpYUhlYWRpbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTWVkaWFIZWFkaW5nKTtcblxudmFyIF9NZWRpYUxlZnQgPSByZXF1aXJlKCcuL01lZGlhTGVmdCcpO1xuXG52YXIgX01lZGlhTGVmdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9NZWRpYUxlZnQpO1xuXG52YXIgX01lZGlhTGlzdCA9IHJlcXVpcmUoJy4vTWVkaWFMaXN0Jyk7XG5cbnZhciBfTWVkaWFMaXN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01lZGlhTGlzdCk7XG5cbnZhciBfTWVkaWFMaXN0SXRlbSA9IHJlcXVpcmUoJy4vTWVkaWFMaXN0SXRlbScpO1xuXG52YXIgX01lZGlhTGlzdEl0ZW0yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTWVkaWFMaXN0SXRlbSk7XG5cbnZhciBfTWVkaWFSaWdodCA9IHJlcXVpcmUoJy4vTWVkaWFSaWdodCcpO1xuXG52YXIgX01lZGlhUmlnaHQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTWVkaWFSaWdodCk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6IF9lbGVtZW50VHlwZTJbJ2RlZmF1bHQnXVxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6ICdkaXYnXG59O1xuXG52YXIgTWVkaWEgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShNZWRpYSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTWVkaWEoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgTWVkaWEpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBNZWRpYS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBDb21wb25lbnQgPSBfcHJvcHMuY29tcG9uZW50Q2xhc3MsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NvbXBvbmVudENsYXNzJywgJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gTWVkaWE7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5NZWRpYS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5NZWRpYS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbk1lZGlhLkhlYWRpbmcgPSBfTWVkaWFIZWFkaW5nMlsnZGVmYXVsdCddO1xuTWVkaWEuQm9keSA9IF9NZWRpYUJvZHkyWydkZWZhdWx0J107XG5NZWRpYS5MZWZ0ID0gX01lZGlhTGVmdDJbJ2RlZmF1bHQnXTtcbk1lZGlhLlJpZ2h0ID0gX01lZGlhUmlnaHQyWydkZWZhdWx0J107XG5NZWRpYS5MaXN0ID0gX01lZGlhTGlzdDJbJ2RlZmF1bHQnXTtcbk1lZGlhLkxpc3RJdGVtID0gX01lZGlhTGlzdEl0ZW0yWydkZWZhdWx0J107XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ21lZGlhJywgTWVkaWEpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfZWxlbWVudFR5cGUgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBjb21wb25lbnRDbGFzczogX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjb21wb25lbnRDbGFzczogJ2Rpdidcbn07XG5cbnZhciBNZWRpYUJvZHkgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShNZWRpYUJvZHksIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE1lZGlhQm9keSgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBNZWRpYUJvZHkpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBNZWRpYUJvZHkucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgQ29tcG9uZW50ID0gX3Byb3BzLmNvbXBvbmVudENsYXNzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjb21wb25lbnRDbGFzcycsICdjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChDb21wb25lbnQsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIE1lZGlhQm9keTtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbk1lZGlhQm9keS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5NZWRpYUJvZHkuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdtZWRpYS1ib2R5JywgTWVkaWFCb2R5KTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX2VsZW1lbnRUeXBlID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvZWxlbWVudFR5cGUnKTtcblxudmFyIF9lbGVtZW50VHlwZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbGVtZW50VHlwZSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6IF9lbGVtZW50VHlwZTJbJ2RlZmF1bHQnXVxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6ICdoNCdcbn07XG5cbnZhciBNZWRpYUhlYWRpbmcgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShNZWRpYUhlYWRpbmcsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE1lZGlhSGVhZGluZygpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBNZWRpYUhlYWRpbmcpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBNZWRpYUhlYWRpbmcucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgQ29tcG9uZW50ID0gX3Byb3BzLmNvbXBvbmVudENsYXNzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjb21wb25lbnRDbGFzcycsICdjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChDb21wb25lbnQsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIE1lZGlhSGVhZGluZztcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbk1lZGlhSGVhZGluZy5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5NZWRpYUhlYWRpbmcuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdtZWRpYS1oZWFkaW5nJywgTWVkaWFIZWFkaW5nKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9NZWRpYSA9IHJlcXVpcmUoJy4vTWVkaWEnKTtcblxudmFyIF9NZWRpYTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9NZWRpYSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIEFsaWduIHRoZSBtZWRpYSB0byB0aGUgdG9wLCBtaWRkbGUsIG9yIGJvdHRvbSBvZiB0aGUgbWVkaWEgb2JqZWN0LlxuICAgKi9cbiAgYWxpZ246IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2YoWyd0b3AnLCAnbWlkZGxlJywgJ2JvdHRvbSddKVxufTtcblxudmFyIE1lZGlhTGVmdCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKE1lZGlhTGVmdCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTWVkaWFMZWZ0KCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIE1lZGlhTGVmdCk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIE1lZGlhTGVmdC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhbGlnbiA9IF9wcm9wcy5hbGlnbixcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnYWxpZ24nLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG5cbiAgICBpZiAoYWxpZ24pIHtcbiAgICAgIC8vIFRoZSBjbGFzcyBpcyBlLmcuIGBtZWRpYS10b3BgLCBub3QgYG1lZGlhLWxlZnQtdG9wYC5cbiAgICAgIGNsYXNzZXNbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKF9NZWRpYTJbJ2RlZmF1bHQnXS5kZWZhdWx0UHJvcHMsIGFsaWduKV0gPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnZGl2JywgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gTWVkaWFMZWZ0O1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuTWVkaWFMZWZ0LnByb3BUeXBlcyA9IHByb3BUeXBlcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgnbWVkaWEtbGVmdCcsIE1lZGlhTGVmdCk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgTWVkaWFMaXN0ID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoTWVkaWFMaXN0LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBNZWRpYUxpc3QoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgTWVkaWFMaXN0KTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgTWVkaWFMaXN0LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCd1bCcsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIE1lZGlhTGlzdDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ21lZGlhLWxpc3QnLCBNZWRpYUxpc3QpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIE1lZGlhTGlzdEl0ZW0gPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShNZWRpYUxpc3RJdGVtLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBNZWRpYUxpc3RJdGVtKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIE1lZGlhTGlzdEl0ZW0pO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBNZWRpYUxpc3RJdGVtLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdsaScsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIE1lZGlhTGlzdEl0ZW07XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdtZWRpYScsIE1lZGlhTGlzdEl0ZW0pO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX01lZGlhID0gcmVxdWlyZSgnLi9NZWRpYScpO1xuXG52YXIgX01lZGlhMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01lZGlhKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQWxpZ24gdGhlIG1lZGlhIHRvIHRoZSB0b3AsIG1pZGRsZSwgb3IgYm90dG9tIG9mIHRoZSBtZWRpYSBvYmplY3QuXG4gICAqL1xuICBhbGlnbjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZihbJ3RvcCcsICdtaWRkbGUnLCAnYm90dG9tJ10pXG59O1xuXG52YXIgTWVkaWFSaWdodCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKE1lZGlhUmlnaHQsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE1lZGlhUmlnaHQoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgTWVkaWFSaWdodCk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIE1lZGlhUmlnaHQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYWxpZ24gPSBfcHJvcHMuYWxpZ24sXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2FsaWduJywgJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgaWYgKGFsaWduKSB7XG4gICAgICAvLyBUaGUgY2xhc3MgaXMgZS5nLiBgbWVkaWEtdG9wYCwgbm90IGBtZWRpYS1yaWdodC10b3BgLlxuICAgICAgY2xhc3Nlc1soMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoX01lZGlhMlsnZGVmYXVsdCddLmRlZmF1bHRQcm9wcywgYWxpZ24pXSA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdkaXYnLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBNZWRpYVJpZ2h0O1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuTWVkaWFSaWdodC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ21lZGlhLXJpZ2h0JywgTWVkaWFSaWdodCk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfYWxsID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvYWxsJyk7XG5cbnZhciBfYWxsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FsbCk7XG5cbnZhciBfU2FmZUFuY2hvciA9IHJlcXVpcmUoJy4vU2FmZUFuY2hvcicpO1xuXG52YXIgX1NhZmVBbmNob3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU2FmZUFuY2hvcik7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmVkRnVuY3Rpb24nKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogSGlnaGxpZ2h0IHRoZSBtZW51IGl0ZW0gYXMgYWN0aXZlLlxuICAgKi9cbiAgYWN0aXZlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIERpc2FibGUgdGhlIG1lbnUgaXRlbSwgbWFraW5nIGl0IHVuc2VsZWN0YWJsZS5cbiAgICovXG4gIGRpc2FibGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIFN0eWxlcyB0aGUgbWVudSBpdGVtIGFzIGEgaG9yaXpvbnRhbCBydWxlLCBwcm92aWRpbmcgdmlzdWFsIHNlcGFyYXRpb24gYmV0d2VlblxuICAgKiBncm91cHMgb2YgbWVudSBpdGVtcy5cbiAgICovXG4gIGRpdmlkZXI6ICgwLCBfYWxsMlsnZGVmYXVsdCddKShfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsIGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIGRpdmlkZXIgPSBfcmVmLmRpdmlkZXIsXG4gICAgICAgIGNoaWxkcmVuID0gX3JlZi5jaGlsZHJlbjtcbiAgICByZXR1cm4gZGl2aWRlciAmJiBjaGlsZHJlbiA/IG5ldyBFcnJvcignQ2hpbGRyZW4gd2lsbCBub3QgYmUgcmVuZGVyZWQgZm9yIGRpdmlkZXJzJykgOiBudWxsO1xuICB9KSxcblxuICAvKipcbiAgICogVmFsdWUgcGFzc2VkIHRvIHRoZSBgb25TZWxlY3RgIGhhbmRsZXIsIHVzZWZ1bCBmb3IgaWRlbnRpZnlpbmcgdGhlIHNlbGVjdGVkIG1lbnUgaXRlbS5cbiAgICovXG4gIGV2ZW50S2V5OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmFueSxcblxuICAvKipcbiAgICogU3R5bGVzIHRoZSBtZW51IGl0ZW0gYXMgYSBoZWFkZXIgbGFiZWwsIHVzZWZ1bCBmb3IgZGVzY3JpYmluZyBhIGdyb3VwIG9mIG1lbnUgaXRlbXMuXG4gICAqL1xuICBoZWFkZXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogSFRNTCBgaHJlZmAgYXR0cmlidXRlIGNvcnJlc3BvbmRpbmcgdG8gYGEuaHJlZmAuXG4gICAqL1xuICBocmVmOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgd2hlbiB0aGUgbWVudSBpdGVtIGlzIGNsaWNrZWQuXG4gICAqL1xuICBvbkNsaWNrOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIHdoZW4gdGhlIG1lbnUgaXRlbSBpcyBzZWxlY3RlZC5cbiAgICpcbiAgICogYGBganNcbiAgICogKGV2ZW50S2V5OiBhbnksIGV2ZW50OiBPYmplY3QpID0+IGFueVxuICAgKiBgYGBcbiAgICovXG4gIG9uU2VsZWN0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmNcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGRpdmlkZXI6IGZhbHNlLFxuICBkaXNhYmxlZDogZmFsc2UsXG4gIGhlYWRlcjogZmFsc2Vcbn07XG5cbnZhciBNZW51SXRlbSA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKE1lbnVJdGVtLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBNZW51SXRlbShwcm9wcywgY29udGV4dCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIE1lbnVJdGVtKTtcblxuICAgIHZhciBfdGhpcyA9ICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICBfdGhpcy5oYW5kbGVDbGljayA9IF90aGlzLmhhbmRsZUNsaWNrLmJpbmQoX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIE1lbnVJdGVtLnByb3RvdHlwZS5oYW5kbGVDbGljayA9IGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGV2ZW50KSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGhyZWYgPSBfcHJvcHMuaHJlZixcbiAgICAgICAgZGlzYWJsZWQgPSBfcHJvcHMuZGlzYWJsZWQsXG4gICAgICAgIG9uU2VsZWN0ID0gX3Byb3BzLm9uU2VsZWN0LFxuICAgICAgICBldmVudEtleSA9IF9wcm9wcy5ldmVudEtleTtcblxuXG4gICAgaWYgKCFocmVmIHx8IGRpc2FibGVkKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmIChkaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvblNlbGVjdCkge1xuICAgICAgb25TZWxlY3QoZXZlbnRLZXksIGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgTWVudUl0ZW0ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIGFjdGl2ZSA9IF9wcm9wczIuYWN0aXZlLFxuICAgICAgICBkaXNhYmxlZCA9IF9wcm9wczIuZGlzYWJsZWQsXG4gICAgICAgIGRpdmlkZXIgPSBfcHJvcHMyLmRpdmlkZXIsXG4gICAgICAgIGhlYWRlciA9IF9wcm9wczIuaGVhZGVyLFxuICAgICAgICBvbkNsaWNrID0gX3Byb3BzMi5vbkNsaWNrLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMyLmNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGUgPSBfcHJvcHMyLnN0eWxlLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wczIsIFsnYWN0aXZlJywgJ2Rpc2FibGVkJywgJ2RpdmlkZXInLCAnaGVhZGVyJywgJ29uQ2xpY2snLCAnY2xhc3NOYW1lJywgJ3N0eWxlJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHNBbmRPbWl0ID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHNBbmRPbWl0KShwcm9wcywgWydldmVudEtleScsICdvblNlbGVjdCddKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNBbmRPbWl0WzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzQW5kT21pdFsxXTtcblxuICAgIGlmIChkaXZpZGVyKSB7XG4gICAgICAvLyBGb3JjaWJseSBibGFuayBvdXQgdGhlIGNoaWxkcmVuOyBzZXBhcmF0b3JzIHNob3VsZG4ndCByZW5kZXIgYW55LlxuICAgICAgZWxlbWVudFByb3BzLmNoaWxkcmVuID0gdW5kZWZpbmVkO1xuXG4gICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ2xpJywgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICAgIHJvbGU6ICdzZXBhcmF0b3InLFxuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCAnZGl2aWRlcicpLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBpZiAoaGVhZGVyKSB7XG4gICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ2xpJywgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICAgIHJvbGU6ICdoZWFkaW5nJyxcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdoZWFkZXInKSksXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICdsaScsXG4gICAgICB7XG4gICAgICAgIHJvbGU6ICdwcmVzZW50YXRpb24nLFxuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCB7IGFjdGl2ZTogYWN0aXZlLCBkaXNhYmxlZDogZGlzYWJsZWQgfSksXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9TYWZlQW5jaG9yMlsnZGVmYXVsdCddLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgICAgcm9sZTogJ21lbnVpdGVtJyxcbiAgICAgICAgdGFiSW5kZXg6ICctMScsXG4gICAgICAgIG9uQ2xpY2s6ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKShvbkNsaWNrLCB0aGlzLmhhbmRsZUNsaWNrKVxuICAgICAgfSkpXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gTWVudUl0ZW07XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5NZW51SXRlbS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5NZW51SXRlbS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ2Ryb3Bkb3duJywgTWVudUl0ZW0pO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX2V2ZW50cyA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL2V2ZW50cycpO1xuXG52YXIgX2V2ZW50czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9ldmVudHMpO1xuXG52YXIgX293bmVyRG9jdW1lbnQgPSByZXF1aXJlKCdkb20taGVscGVycy9vd25lckRvY3VtZW50Jyk7XG5cbnZhciBfb3duZXJEb2N1bWVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vd25lckRvY3VtZW50KTtcblxudmFyIF9pbkRPTSA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL3V0aWwvaW5ET00nKTtcblxudmFyIF9pbkRPTTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbkRPTSk7XG5cbnZhciBfc2Nyb2xsYmFyU2l6ZSA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL3V0aWwvc2Nyb2xsYmFyU2l6ZScpO1xuXG52YXIgX3Njcm9sbGJhclNpemUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2Nyb2xsYmFyU2l6ZSk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfcmVhY3REb20gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcblxudmFyIF9yZWFjdERvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdERvbSk7XG5cbnZhciBfTW9kYWwgPSByZXF1aXJlKCdyZWFjdC1vdmVybGF5cy9saWIvTW9kYWwnKTtcblxudmFyIF9Nb2RhbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Nb2RhbCk7XG5cbnZhciBfaXNPdmVyZmxvd2luZyA9IHJlcXVpcmUoJ3JlYWN0LW92ZXJsYXlzL2xpYi91dGlscy9pc092ZXJmbG93aW5nJyk7XG5cbnZhciBfaXNPdmVyZmxvd2luZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pc092ZXJmbG93aW5nKTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX0ZhZGUgPSByZXF1aXJlKCcuL0ZhZGUnKTtcblxudmFyIF9GYWRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0ZhZGUpO1xuXG52YXIgX01vZGFsQm9keSA9IHJlcXVpcmUoJy4vTW9kYWxCb2R5Jyk7XG5cbnZhciBfTW9kYWxCb2R5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01vZGFsQm9keSk7XG5cbnZhciBfTW9kYWxEaWFsb2cgPSByZXF1aXJlKCcuL01vZGFsRGlhbG9nJyk7XG5cbnZhciBfTW9kYWxEaWFsb2cyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTW9kYWxEaWFsb2cpO1xuXG52YXIgX01vZGFsRm9vdGVyID0gcmVxdWlyZSgnLi9Nb2RhbEZvb3RlcicpO1xuXG52YXIgX01vZGFsRm9vdGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01vZGFsRm9vdGVyKTtcblxudmFyIF9Nb2RhbEhlYWRlciA9IHJlcXVpcmUoJy4vTW9kYWxIZWFkZXInKTtcblxudmFyIF9Nb2RhbEhlYWRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Nb2RhbEhlYWRlcik7XG5cbnZhciBfTW9kYWxUaXRsZSA9IHJlcXVpcmUoJy4vTW9kYWxUaXRsZScpO1xuXG52YXIgX01vZGFsVGl0bGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTW9kYWxUaXRsZSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmVkRnVuY3Rpb24nKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKTtcblxudmFyIF9zcGxpdENvbXBvbmVudFByb3BzMiA9IHJlcXVpcmUoJy4vdXRpbHMvc3BsaXRDb21wb25lbnRQcm9wcycpO1xuXG52YXIgX3NwbGl0Q29tcG9uZW50UHJvcHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3BsaXRDb21wb25lbnRQcm9wczIpO1xuXG52YXIgX1N0eWxlQ29uZmlnID0gcmVxdWlyZSgnLi91dGlscy9TdHlsZUNvbmZpZycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBfTW9kYWwyWydkZWZhdWx0J10ucHJvcFR5cGVzLCBfTW9kYWxEaWFsb2cyWydkZWZhdWx0J10ucHJvcFR5cGVzLCB7XG5cbiAgLyoqXG4gICAqIEluY2x1ZGUgYSBiYWNrZHJvcCBjb21wb25lbnQuIFNwZWNpZnkgJ3N0YXRpYycgZm9yIGEgYmFja2Ryb3AgdGhhdCBkb2Vzbid0XG4gICAqIHRyaWdnZXIgYW4gXCJvbkhpZGVcIiB3aGVuIGNsaWNrZWQuXG4gICAqL1xuICBiYWNrZHJvcDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZihbJ3N0YXRpYycsIHRydWUsIGZhbHNlXSksXG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBtb2RhbCB3aGVuIGVzY2FwZSBrZXkgaXMgcHJlc3NlZFxuICAgKi9cbiAga2V5Ym9hcmQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogT3BlbiBhbmQgY2xvc2UgdGhlIE1vZGFsIHdpdGggYSBzbGlkZSBhbmQgZmFkZSBhbmltYXRpb24uXG4gICAqL1xuICBhbmltYXRpb246IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogQSBDb21wb25lbnQgdHlwZSB0aGF0IHByb3ZpZGVzIHRoZSBtb2RhbCBjb250ZW50IE1hcmt1cC4gVGhpcyBpcyBhIHVzZWZ1bFxuICAgKiBwcm9wIHdoZW4geW91IHdhbnQgdG8gdXNlIHlvdXIgb3duIHN0eWxlcyBhbmQgbWFya3VwIHRvIGNyZWF0ZSBhIGN1c3RvbVxuICAgKiBtb2RhbCBjb21wb25lbnQuXG4gICAqL1xuICBkaWFsb2dDb21wb25lbnRDbGFzczogX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddLFxuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCBUaGUgbW9kYWwgd2lsbCBhdXRvbWF0aWNhbGx5IHNoaWZ0IGZvY3VzIHRvIGl0c2VsZiB3aGVuIGl0XG4gICAqIG9wZW5zLCBhbmQgcmVwbGFjZSBpdCB0byB0aGUgbGFzdCBmb2N1c2VkIGVsZW1lbnQgd2hlbiBpdCBjbG9zZXMuXG4gICAqIEdlbmVyYWxseSB0aGlzIHNob3VsZCBuZXZlciBiZSBzZXQgdG8gZmFsc2UgYXMgaXQgbWFrZXMgdGhlIE1vZGFsIGxlc3NcbiAgICogYWNjZXNzaWJsZSB0byBhc3Npc3RpdmUgdGVjaG5vbG9naWVzLCBsaWtlIHNjcmVlbi1yZWFkZXJzLlxuICAgKi9cbiAgYXV0b0ZvY3VzOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgIFRoZSBtb2RhbCB3aWxsIHByZXZlbnQgZm9jdXMgZnJvbSBsZWF2aW5nIHRoZSBNb2RhbCB3aGlsZVxuICAgKiBvcGVuLiBDb25zaWRlciBsZWF2aW5nIHRoZSBkZWZhdWx0IHZhbHVlIGhlcmUsIGFzIGl0IGlzIG5lY2Vzc2FyeSB0byBtYWtlXG4gICAqIHRoZSBNb2RhbCB3b3JrIHdlbGwgd2l0aCBhc3Npc3RpdmUgdGVjaG5vbG9naWVzLCBzdWNoIGFzIHNjcmVlbiByZWFkZXJzLlxuICAgKi9cbiAgZW5mb3JjZUZvY3VzOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgIFRoZSBtb2RhbCB3aWxsIHJlc3RvcmUgZm9jdXMgdG8gcHJldmlvdXNseSBmb2N1c2VkIGVsZW1lbnQgb25jZVxuICAgKiBtb2RhbCBpcyBoaWRkZW5cbiAgICovXG4gIHJlc3RvcmVGb2N1czogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCBUaGUgbW9kYWwgd2lsbCBzaG93IGl0c2VsZi5cbiAgICovXG4gIHNob3c6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBmaXJlZCB3aGVuIHRoZSBoZWFkZXIgY2xvc2VCdXR0b24gb3Igbm9uLXN0YXRpYyBiYWNrZHJvcCBpc1xuICAgKiBjbGlja2VkLiBSZXF1aXJlZCBpZiBlaXRoZXIgYXJlIHNwZWNpZmllZC5cbiAgICovXG4gIG9uSGlkZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBiZWZvcmUgdGhlIE1vZGFsIHRyYW5zaXRpb25zIGluXG4gICAqL1xuICBvbkVudGVyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFzIHRoZSBNb2RhbCBiZWdpbnMgdG8gdHJhbnNpdGlvbiBpblxuICAgKi9cbiAgb25FbnRlcmluZzogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgTW9kYWwgZmluaXNoZXMgdHJhbnNpdGlvbmluZyBpblxuICAgKi9cbiAgb25FbnRlcmVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIHJpZ2h0IGJlZm9yZSB0aGUgTW9kYWwgdHJhbnNpdGlvbnMgb3V0XG4gICAqL1xuICBvbkV4aXQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYXMgdGhlIE1vZGFsIGJlZ2lucyB0byB0cmFuc2l0aW9uIG91dFxuICAgKi9cbiAgb25FeGl0aW5nOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBNb2RhbCBmaW5pc2hlcyB0cmFuc2l0aW9uaW5nIG91dFxuICAgKi9cbiAgb25FeGl0ZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnRhaW5lcjogX01vZGFsMlsnZGVmYXVsdCddLnByb3BUeXBlcy5jb250YWluZXJcbn0pO1xuXG52YXIgZGVmYXVsdFByb3BzID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgX01vZGFsMlsnZGVmYXVsdCddLmRlZmF1bHRQcm9wcywge1xuICBhbmltYXRpb246IHRydWUsXG4gIGRpYWxvZ0NvbXBvbmVudENsYXNzOiBfTW9kYWxEaWFsb2cyWydkZWZhdWx0J11cbn0pO1xuXG52YXIgY2hpbGRDb250ZXh0VHlwZXMgPSB7XG4gICRic19tb2RhbDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zaGFwZSh7XG4gICAgb25IaWRlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmNcbiAgfSlcbn07XG5cbnZhciBNb2RhbCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKE1vZGFsLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBNb2RhbChwcm9wcywgY29udGV4dCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIE1vZGFsKTtcblxuICAgIHZhciBfdGhpcyA9ICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICBfdGhpcy5oYW5kbGVFbnRlcmluZyA9IF90aGlzLmhhbmRsZUVudGVyaW5nLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmhhbmRsZUV4aXRlZCA9IF90aGlzLmhhbmRsZUV4aXRlZC5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5oYW5kbGVXaW5kb3dSZXNpemUgPSBfdGhpcy5oYW5kbGVXaW5kb3dSZXNpemUuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaGFuZGxlRGlhbG9nQ2xpY2sgPSBfdGhpcy5oYW5kbGVEaWFsb2dDbGljay5iaW5kKF90aGlzKTtcblxuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgc3R5bGU6IHt9XG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBNb2RhbC5wcm90b3R5cGUuZ2V0Q2hpbGRDb250ZXh0ID0gZnVuY3Rpb24gZ2V0Q2hpbGRDb250ZXh0KCkge1xuICAgIHJldHVybiB7XG4gICAgICAkYnNfbW9kYWw6IHtcbiAgICAgICAgb25IaWRlOiB0aGlzLnByb3BzLm9uSGlkZVxuICAgICAgfVxuICAgIH07XG4gIH07XG5cbiAgTW9kYWwucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgLy8gQ2xlYW4gdXAgdGhlIGxpc3RlbmVyIGlmIHdlIG5lZWQgdG8uXG4gICAgdGhpcy5oYW5kbGVFeGl0ZWQoKTtcbiAgfTtcblxuICBNb2RhbC5wcm90b3R5cGUuaGFuZGxlRW50ZXJpbmcgPSBmdW5jdGlvbiBoYW5kbGVFbnRlcmluZygpIHtcbiAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgd29yayBldmVuIHdoZW4gYW5pbWF0aW9uIGlzIGRpc2FibGVkLlxuICAgIF9ldmVudHMyWydkZWZhdWx0J10ub24od2luZG93LCAncmVzaXplJywgdGhpcy5oYW5kbGVXaW5kb3dSZXNpemUpO1xuICAgIHRoaXMudXBkYXRlU3R5bGUoKTtcbiAgfTtcblxuICBNb2RhbC5wcm90b3R5cGUuaGFuZGxlRXhpdGVkID0gZnVuY3Rpb24gaGFuZGxlRXhpdGVkKCkge1xuICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCB3b3JrIGV2ZW4gd2hlbiBhbmltYXRpb24gaXMgZGlzYWJsZWQuXG4gICAgX2V2ZW50czJbJ2RlZmF1bHQnXS5vZmYod2luZG93LCAncmVzaXplJywgdGhpcy5oYW5kbGVXaW5kb3dSZXNpemUpO1xuICB9O1xuXG4gIE1vZGFsLnByb3RvdHlwZS5oYW5kbGVXaW5kb3dSZXNpemUgPSBmdW5jdGlvbiBoYW5kbGVXaW5kb3dSZXNpemUoKSB7XG4gICAgdGhpcy51cGRhdGVTdHlsZSgpO1xuICB9O1xuXG4gIE1vZGFsLnByb3RvdHlwZS5oYW5kbGVEaWFsb2dDbGljayA9IGZ1bmN0aW9uIGhhbmRsZURpYWxvZ0NsaWNrKGUpIHtcbiAgICBpZiAoZS50YXJnZXQgIT09IGUuY3VycmVudFRhcmdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJvcHMub25IaWRlKCk7XG4gIH07XG5cbiAgTW9kYWwucHJvdG90eXBlLnVwZGF0ZVN0eWxlID0gZnVuY3Rpb24gdXBkYXRlU3R5bGUoKSB7XG4gICAgaWYgKCFfaW5ET00yWydkZWZhdWx0J10pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZGlhbG9nTm9kZSA9IHRoaXMuX21vZGFsLmdldERpYWxvZ0VsZW1lbnQoKTtcbiAgICB2YXIgZGlhbG9nSGVpZ2h0ID0gZGlhbG9nTm9kZS5zY3JvbGxIZWlnaHQ7XG5cbiAgICB2YXIgZG9jdW1lbnQgPSAoMCwgX293bmVyRG9jdW1lbnQyWydkZWZhdWx0J10pKGRpYWxvZ05vZGUpO1xuICAgIHZhciBib2R5SXNPdmVyZmxvd2luZyA9ICgwLCBfaXNPdmVyZmxvd2luZzJbJ2RlZmF1bHQnXSkoX3JlYWN0RG9tMlsnZGVmYXVsdCddLmZpbmRET01Ob2RlKHRoaXMucHJvcHMuY29udGFpbmVyIHx8IGRvY3VtZW50LmJvZHkpKTtcbiAgICB2YXIgbW9kYWxJc092ZXJmbG93aW5nID0gZGlhbG9nSGVpZ2h0ID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgcGFkZGluZ1JpZ2h0OiBib2R5SXNPdmVyZmxvd2luZyAmJiAhbW9kYWxJc092ZXJmbG93aW5nID8gKDAsIF9zY3JvbGxiYXJTaXplMlsnZGVmYXVsdCddKSgpIDogdW5kZWZpbmVkLFxuICAgICAgICBwYWRkaW5nTGVmdDogIWJvZHlJc092ZXJmbG93aW5nICYmIG1vZGFsSXNPdmVyZmxvd2luZyA/ICgwLCBfc2Nyb2xsYmFyU2l6ZTJbJ2RlZmF1bHQnXSkoKSA6IHVuZGVmaW5lZFxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIE1vZGFsLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYmFja2Ryb3AgPSBfcHJvcHMuYmFja2Ryb3AsXG4gICAgICAgIGFuaW1hdGlvbiA9IF9wcm9wcy5hbmltYXRpb24sXG4gICAgICAgIHNob3cgPSBfcHJvcHMuc2hvdyxcbiAgICAgICAgRGlhbG9nID0gX3Byb3BzLmRpYWxvZ0NvbXBvbmVudENsYXNzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBzdHlsZSA9IF9wcm9wcy5zdHlsZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIG9uRW50ZXJpbmcgPSBfcHJvcHMub25FbnRlcmluZyxcbiAgICAgICAgb25FeGl0ZWQgPSBfcHJvcHMub25FeGl0ZWQsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2JhY2tkcm9wJywgJ2FuaW1hdGlvbicsICdzaG93JywgJ2RpYWxvZ0NvbXBvbmVudENsYXNzJywgJ2NsYXNzTmFtZScsICdzdHlsZScsICdjaGlsZHJlbicsICdvbkVudGVyaW5nJywgJ29uRXhpdGVkJ10pO1xuXG4gICAgdmFyIF9zcGxpdENvbXBvbmVudFByb3BzID0gKDAsIF9zcGxpdENvbXBvbmVudFByb3BzM1snZGVmYXVsdCddKShwcm9wcywgX01vZGFsMlsnZGVmYXVsdCddKSxcbiAgICAgICAgYmFzZU1vZGFsUHJvcHMgPSBfc3BsaXRDb21wb25lbnRQcm9wc1swXSxcbiAgICAgICAgZGlhbG9nUHJvcHMgPSBfc3BsaXRDb21wb25lbnRQcm9wc1sxXTtcblxuICAgIHZhciBpbkNsYXNzTmFtZSA9IHNob3cgJiYgIWFuaW1hdGlvbiAmJiAnaW4nO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgX01vZGFsMlsnZGVmYXVsdCddLFxuICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgYmFzZU1vZGFsUHJvcHMsIHtcbiAgICAgICAgcmVmOiBmdW5jdGlvbiByZWYoYykge1xuICAgICAgICAgIF90aGlzMi5fbW9kYWwgPSBjO1xuICAgICAgICB9LFxuICAgICAgICBzaG93OiBzaG93LFxuICAgICAgICBvbkVudGVyaW5nOiAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkob25FbnRlcmluZywgdGhpcy5oYW5kbGVFbnRlcmluZyksXG4gICAgICAgIG9uRXhpdGVkOiAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkob25FeGl0ZWQsIHRoaXMuaGFuZGxlRXhpdGVkKSxcbiAgICAgICAgYmFja2Ryb3A6IGJhY2tkcm9wLFxuICAgICAgICBiYWNrZHJvcENsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKSgoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkocHJvcHMsICdiYWNrZHJvcCcpLCBpbkNsYXNzTmFtZSksXG4gICAgICAgIGNvbnRhaW5lckNsYXNzTmFtZTogKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKHByb3BzLCAnb3BlbicpLFxuICAgICAgICB0cmFuc2l0aW9uOiBhbmltYXRpb24gPyBfRmFkZTJbJ2RlZmF1bHQnXSA6IHVuZGVmaW5lZCxcbiAgICAgICAgZGlhbG9nVHJhbnNpdGlvblRpbWVvdXQ6IE1vZGFsLlRSQU5TSVRJT05fRFVSQVRJT04sXG4gICAgICAgIGJhY2tkcm9wVHJhbnNpdGlvblRpbWVvdXQ6IE1vZGFsLkJBQ0tEUk9QX1RSQU5TSVRJT05fRFVSQVRJT05cbiAgICAgIH0pLFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIERpYWxvZyxcbiAgICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZGlhbG9nUHJvcHMsIHtcbiAgICAgICAgICBzdHlsZTogKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgdGhpcy5zdGF0ZS5zdHlsZSwgc3R5bGUpLFxuICAgICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGluQ2xhc3NOYW1lKSxcbiAgICAgICAgICBvbkNsaWNrOiBiYWNrZHJvcCA9PT0gdHJ1ZSA/IHRoaXMuaGFuZGxlRGlhbG9nQ2xpY2sgOiBudWxsXG4gICAgICAgIH0pLFxuICAgICAgICBjaGlsZHJlblxuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIE1vZGFsO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuTW9kYWwucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuTW9kYWwuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuTW9kYWwuY2hpbGRDb250ZXh0VHlwZXMgPSBjaGlsZENvbnRleHRUeXBlcztcblxuTW9kYWwuQm9keSA9IF9Nb2RhbEJvZHkyWydkZWZhdWx0J107XG5Nb2RhbC5IZWFkZXIgPSBfTW9kYWxIZWFkZXIyWydkZWZhdWx0J107XG5Nb2RhbC5UaXRsZSA9IF9Nb2RhbFRpdGxlMlsnZGVmYXVsdCddO1xuTW9kYWwuRm9vdGVyID0gX01vZGFsRm9vdGVyMlsnZGVmYXVsdCddO1xuXG5Nb2RhbC5EaWFsb2cgPSBfTW9kYWxEaWFsb2cyWydkZWZhdWx0J107XG5cbk1vZGFsLlRSQU5TSVRJT05fRFVSQVRJT04gPSAzMDA7XG5Nb2RhbC5CQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OID0gMTUwO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdtb2RhbCcsICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNTaXplcykoW19TdHlsZUNvbmZpZy5TaXplLkxBUkdFLCBfU3R5bGVDb25maWcuU2l6ZS5TTUFMTF0sIE1vZGFsKSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiBfZWxlbWVudFR5cGUyWydkZWZhdWx0J11cbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiAnZGl2J1xufTtcblxudmFyIE1vZGFsQm9keSA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKE1vZGFsQm9keSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTW9kYWxCb2R5KCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIE1vZGFsQm9keSk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIE1vZGFsQm9keS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBDb21wb25lbnQgPSBfcHJvcHMuY29tcG9uZW50Q2xhc3MsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NvbXBvbmVudENsYXNzJywgJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KENvbXBvbmVudCwgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gTW9kYWxCb2R5O1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuTW9kYWxCb2R5LnByb3BUeXBlcyA9IHByb3BUeXBlcztcbk1vZGFsQm9keS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ21vZGFsLWJvZHknLCBNb2RhbEJvZHkpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMzID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzNCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMzKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG52YXIgX1N0eWxlQ29uZmlnID0gcmVxdWlyZSgnLi91dGlscy9TdHlsZUNvbmZpZycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBBIGNzcyBjbGFzcyB0byBhcHBseSB0byB0aGUgTW9kYWwgZGlhbG9nIERPTSBub2RlLlxuICAgKi9cbiAgZGlhbG9nQ2xhc3NOYW1lOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZ1xufTtcblxudmFyIE1vZGFsRGlhbG9nID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoTW9kYWxEaWFsb2csIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE1vZGFsRGlhbG9nKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIE1vZGFsRGlhbG9nKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgTW9kYWxEaWFsb2cucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX2V4dGVuZHMyO1xuXG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGRpYWxvZ0NsYXNzTmFtZSA9IF9wcm9wcy5kaWFsb2dDbGFzc05hbWUsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHN0eWxlID0gX3Byb3BzLnN0eWxlLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnZGlhbG9nQ2xhc3NOYW1lJywgJ2NsYXNzTmFtZScsICdzdHlsZScsICdjaGlsZHJlbiddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgYnNDbGFzc05hbWUgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcyk7XG5cbiAgICB2YXIgbW9kYWxTdHlsZSA9ICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoeyBkaXNwbGF5OiAnYmxvY2snIH0sIHN0eWxlKTtcblxuICAgIHZhciBkaWFsb2dDbGFzc2VzID0gKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyksIChfZXh0ZW5kczIgPSB7fSwgX2V4dGVuZHMyW2JzQ2xhc3NOYW1lXSA9IGZhbHNlLCBfZXh0ZW5kczJbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdkaWFsb2cnKV0gPSB0cnVlLCBfZXh0ZW5kczIpKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICdkaXYnLFxuICAgICAgKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICAgIHRhYkluZGV4OiAnLTEnLFxuICAgICAgICByb2xlOiAnZGlhbG9nJyxcbiAgICAgICAgc3R5bGU6IG1vZGFsU3R5bGUsXG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGJzQ2xhc3NOYW1lKVxuICAgICAgfSksXG4gICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHsgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGRpYWxvZ0NsYXNzTmFtZSwgZGlhbG9nQ2xhc3NlcykgfSxcbiAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgJ2RpdicsXG4gICAgICAgICAgeyBjbGFzc05hbWU6ICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnY29udGVudCcpLCByb2xlOiAnZG9jdW1lbnQnIH0sXG4gICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIE1vZGFsRGlhbG9nO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuTW9kYWxEaWFsb2cucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdtb2RhbCcsICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNTaXplcykoW19TdHlsZUNvbmZpZy5TaXplLkxBUkdFLCBfU3R5bGVDb25maWcuU2l6ZS5TTUFMTF0sIE1vZGFsRGlhbG9nKSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiBfZWxlbWVudFR5cGUyWydkZWZhdWx0J11cbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiAnZGl2J1xufTtcblxudmFyIE1vZGFsRm9vdGVyID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoTW9kYWxGb290ZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE1vZGFsRm9vdGVyKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIE1vZGFsRm9vdGVyKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgTW9kYWxGb290ZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgQ29tcG9uZW50ID0gX3Byb3BzLmNvbXBvbmVudENsYXNzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjb21wb25lbnRDbGFzcycsICdjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChDb21wb25lbnQsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIE1vZGFsRm9vdGVyO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuTW9kYWxGb290ZXIucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuTW9kYWxGb290ZXIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdtb2RhbC1mb290ZXInLCBNb2RhbEZvb3Rlcik7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmVkRnVuY3Rpb24nKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKTtcblxudmFyIF9DbG9zZUJ1dHRvbiA9IHJlcXVpcmUoJy4vQ2xvc2VCdXR0b24nKTtcblxudmFyIF9DbG9zZUJ1dHRvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9DbG9zZUJ1dHRvbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuLy8gVE9ETzogYGFyaWEtbGFiZWxgIHNob3VsZCBiZSBgY2xvc2VMYWJlbGAuXG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBQcm92aWRlcyBhbiBhY2Nlc3NpYmxlIGxhYmVsIGZvciB0aGUgY2xvc2VcbiAgICogYnV0dG9uLiBJdCBpcyB1c2VkIGZvciBBc3Npc3RpdmUgVGVjaG5vbG9neSB3aGVuIHRoZSBsYWJlbCB0ZXh0IGlzIG5vdFxuICAgKiByZWFkYWJsZS5cbiAgICovXG4gIGNsb3NlTGFiZWw6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIENvbXBvbmVudCBzaG91bGQgY29udGFpbiBhIGNsb3NlIGJ1dHRvblxuICAgKi9cbiAgY2xvc2VCdXR0b246IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogQSBDYWxsYmFjayBmaXJlZCB3aGVuIHRoZSBjbG9zZSBidXR0b24gaXMgY2xpY2tlZC4gSWYgdXNlZCBkaXJlY3RseSBpbnNpZGVcbiAgICogYSBNb2RhbCBjb21wb25lbnQsIHRoZSBvbkhpZGUgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHByb3BhZ2F0ZWQgdXAgdG8gdGhlXG4gICAqIHBhcmVudCBNb2RhbCBgb25IaWRlYC5cbiAgICovXG4gIG9uSGlkZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjbG9zZUxhYmVsOiAnQ2xvc2UnLFxuICBjbG9zZUJ1dHRvbjogZmFsc2Vcbn07XG5cbnZhciBjb250ZXh0VHlwZXMgPSB7XG4gICRic19tb2RhbDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zaGFwZSh7XG4gICAgb25IaWRlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmNcbiAgfSlcbn07XG5cbnZhciBNb2RhbEhlYWRlciA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKE1vZGFsSGVhZGVyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBNb2RhbEhlYWRlcigpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBNb2RhbEhlYWRlcik7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIE1vZGFsSGVhZGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNsb3NlTGFiZWwgPSBfcHJvcHMuY2xvc2VMYWJlbCxcbiAgICAgICAgY2xvc2VCdXR0b24gPSBfcHJvcHMuY2xvc2VCdXR0b24sXG4gICAgICAgIG9uSGlkZSA9IF9wcm9wcy5vbkhpZGUsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjbG9zZUxhYmVsJywgJ2Nsb3NlQnV0dG9uJywgJ29uSGlkZScsICdjbGFzc05hbWUnLCAnY2hpbGRyZW4nXSk7XG5cblxuICAgIHZhciBtb2RhbCA9IHRoaXMuY29udGV4dC4kYnNfbW9kYWw7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICdkaXYnLFxuICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgICB9KSxcbiAgICAgIGNsb3NlQnV0dG9uICYmIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9DbG9zZUJ1dHRvbjJbJ2RlZmF1bHQnXSwge1xuICAgICAgICBsYWJlbDogY2xvc2VMYWJlbCxcbiAgICAgICAgb25DbGljazogKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKG1vZGFsICYmIG1vZGFsLm9uSGlkZSwgb25IaWRlKVxuICAgICAgfSksXG4gICAgICBjaGlsZHJlblxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIE1vZGFsSGVhZGVyO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuTW9kYWxIZWFkZXIucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuTW9kYWxIZWFkZXIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuTW9kYWxIZWFkZXIuY29udGV4dFR5cGVzID0gY29udGV4dFR5cGVzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdtb2RhbC1oZWFkZXInLCBNb2RhbEhlYWRlcik7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiBfZWxlbWVudFR5cGUyWydkZWZhdWx0J11cbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiAnaDQnXG59O1xuXG52YXIgTW9kYWxUaXRsZSA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKE1vZGFsVGl0bGUsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE1vZGFsVGl0bGUoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgTW9kYWxUaXRsZSk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIE1vZGFsVGl0bGUucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgQ29tcG9uZW50ID0gX3Byb3BzLmNvbXBvbmVudENsYXNzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjb21wb25lbnRDbGFzcycsICdjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChDb21wb25lbnQsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG4gIH07XG5cbiAgcmV0dXJuIE1vZGFsVGl0bGU7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5Nb2RhbFRpdGxlLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbk1vZGFsVGl0bGUuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdtb2RhbC10aXRsZScsIE1vZGFsVGl0bGUpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMzID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzNCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMzKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX2tleWNvZGUgPSByZXF1aXJlKCdrZXljb2RlJyk7XG5cbnZhciBfa2V5Y29kZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9rZXljb2RlKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9yZWFjdERvbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuXG52YXIgX3JlYWN0RG9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0RG9tKTtcblxudmFyIF9hbGwgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9hbGwnKTtcblxudmFyIF9hbGwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYWxsKTtcblxudmFyIF93YXJuaW5nID0gcmVxdWlyZSgnd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmVkRnVuY3Rpb24nKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKTtcblxudmFyIF9WYWxpZENvbXBvbmVudENoaWxkcmVuID0gcmVxdWlyZSgnLi91dGlscy9WYWxpZENvbXBvbmVudENoaWxkcmVuJyk7XG5cbnZhciBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9WYWxpZENvbXBvbmVudENoaWxkcmVuKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG4vLyBUT0RPOiBTaG91bGQgd2UgZXhwb3NlIGA8TmF2SXRlbT5gIGFzIGA8TmF2Lkl0ZW0+YD9cblxuLy8gVE9ETzogVGhpcyBgYnNTdHlsZWAgaXMgdmVyeSB1bmxpa2UgdGhlIG90aGVycy4gU2hvdWxkIHdlIHJlbmFtZSBpdD9cblxuLy8gVE9ETzogYHB1bGxSaWdodGAgYW5kIGBwdWxsTGVmdGAgZG9uJ3QgcmVuZGVyIHJpZ2h0IG91dHNpZGUgb2YgYG5hdmJhcmAuXG4vLyBDb25zaWRlciByZW5hbWluZyBvciByZXBsYWNpbmcgdGhlbS5cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIE1hcmtzIHRoZSBOYXZJdGVtIHdpdGggYSBtYXRjaGluZyBgZXZlbnRLZXlgIGFzIGFjdGl2ZS4gSGFzIGFcbiAgICogaGlnaGVyIHByZWNlZGVuY2Ugb3ZlciBgYWN0aXZlSHJlZmAuXG4gICAqL1xuICBhY3RpdmVLZXk6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYW55LFxuXG4gIC8qKlxuICAgKiBNYXJrcyB0aGUgY2hpbGQgTmF2SXRlbSB3aXRoIGEgbWF0Y2hpbmcgYGhyZWZgIHByb3AgYXMgYWN0aXZlLlxuICAgKi9cbiAgYWN0aXZlSHJlZjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIE5hdkl0ZW1zIGFyZSBiZSBwb3NpdGlvbmVkIHZlcnRpY2FsbHkuXG4gICAqL1xuICBzdGFja2VkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAganVzdGlmaWVkOiAoMCwgX2FsbDJbJ2RlZmF1bHQnXSkoX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLCBmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBqdXN0aWZpZWQgPSBfcmVmLmp1c3RpZmllZCxcbiAgICAgICAgbmF2YmFyID0gX3JlZi5uYXZiYXI7XG4gICAgcmV0dXJuIGp1c3RpZmllZCAmJiBuYXZiYXIgPyBFcnJvcignanVzdGlmaWVkIG5hdmJhciBgTmF2YHMgYXJlIG5vdCBzdXBwb3J0ZWQnKSA6IG51bGw7XG4gIH0pLFxuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZpcmVkIHdoZW4gYSBOYXZJdGVtIGlzIHNlbGVjdGVkLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBmdW5jdGlvbiAoXG4gICAqIFx0QW55IGV2ZW50S2V5LFxuICAgKiBcdFN5bnRoZXRpY0V2ZW50IGV2ZW50P1xuICAgKiApXG4gICAqIGBgYFxuICAgKi9cbiAgb25TZWxlY3Q6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogQVJJQSByb2xlIGZvciB0aGUgTmF2LCBpbiB0aGUgY29udGV4dCBvZiBhIFRhYkNvbnRhaW5lciwgdGhlIGRlZmF1bHQgd2lsbFxuICAgKiBiZSBzZXQgdG8gXCJ0YWJsaXN0XCIsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgTmF2IHdoZW4gc2V0IGV4cGxpY2l0bHkuXG4gICAqXG4gICAqIFdoZW4gdGhlIHJvbGUgaXMgc2V0IHRvIFwidGFibGlzdFwiIE5hdkl0ZW0gZm9jdXMgaXMgbWFuYWdlZCBhY2NvcmRpbmcgdG9cbiAgICogdGhlIEFSSUEgYXV0aG9yaW5nIHByYWN0aWNlcyBmb3IgdGFiczpcbiAgICogaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTMvV0Qtd2FpLWFyaWEtcHJhY3RpY2VzLTIwMTMwMzA3LyN0YWJwYW5lbFxuICAgKi9cbiAgcm9sZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIEFwcGx5IHN0eWxpbmcgYW4gYWxpZ25tZW50IGZvciB1c2UgaW4gYSBOYXZiYXIuIFRoaXMgcHJvcCB3aWxsIGJlIHNldFxuICAgKiBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIE5hdiBpcyB1c2VkIGluc2lkZSBhIE5hdmJhci5cbiAgICovXG4gIG5hdmJhcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBGbG9hdCB0aGUgTmF2IHRvIHRoZSByaWdodC4gV2hlbiBgbmF2YmFyYCBpcyBgdHJ1ZWAgdGhlIGFwcHJvcHJpYXRlXG4gICAqIGNvbnRleHR1YWwgY2xhc3NlcyBhcmUgYWRkZWQgYXMgd2VsbC5cbiAgICovXG4gIHB1bGxSaWdodDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBGbG9hdCB0aGUgTmF2IHRvIHRoZSBsZWZ0LiBXaGVuIGBuYXZiYXJgIGlzIGB0cnVlYCB0aGUgYXBwcm9wcmlhdGVcbiAgICogY29udGV4dHVhbCBjbGFzc2VzIGFyZSBhZGRlZCBhcyB3ZWxsLlxuICAgKi9cbiAgcHVsbExlZnQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbFxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAganVzdGlmaWVkOiBmYWxzZSxcbiAgcHVsbFJpZ2h0OiBmYWxzZSxcbiAgcHVsbExlZnQ6IGZhbHNlLFxuICBzdGFja2VkOiBmYWxzZVxufTtcblxudmFyIGNvbnRleHRUeXBlcyA9IHtcbiAgJGJzX25hdmJhcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zaGFwZSh7XG4gICAgYnNDbGFzczogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gICAgb25TZWxlY3Q6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuY1xuICB9KSxcblxuICAkYnNfdGFiQ29udGFpbmVyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnNoYXBlKHtcbiAgICBhY3RpdmVLZXk6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYW55LFxuICAgIG9uU2VsZWN0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBnZXRUYWJJZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLmlzUmVxdWlyZWQsXG4gICAgZ2V0UGFuZUlkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMuaXNSZXF1aXJlZFxuICB9KVxufTtcblxudmFyIE5hdiA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKE5hdiwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTmF2KCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIE5hdik7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIE5hdi5wcm90b3R5cGUuY29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgaWYgKCF0aGlzLl9uZWVkc1JlZm9jdXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9uZWVkc1JlZm9jdXMgPSBmYWxzZTtcblxuICAgIHZhciBjaGlsZHJlbiA9IHRoaXMucHJvcHMuY2hpbGRyZW47XG5cbiAgICB2YXIgX2dldEFjdGl2ZVByb3BzID0gdGhpcy5nZXRBY3RpdmVQcm9wcygpLFxuICAgICAgICBhY3RpdmVLZXkgPSBfZ2V0QWN0aXZlUHJvcHMuYWN0aXZlS2V5LFxuICAgICAgICBhY3RpdmVIcmVmID0gX2dldEFjdGl2ZVByb3BzLmFjdGl2ZUhyZWY7XG5cbiAgICB2YXIgYWN0aXZlQ2hpbGQgPSBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjJbJ2RlZmF1bHQnXS5maW5kKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIHJldHVybiBfdGhpczIuaXNBY3RpdmUoY2hpbGQsIGFjdGl2ZUtleSwgYWN0aXZlSHJlZik7XG4gICAgfSk7XG5cbiAgICB2YXIgY2hpbGRyZW5BcnJheSA9IF9WYWxpZENvbXBvbmVudENoaWxkcmVuMlsnZGVmYXVsdCddLnRvQXJyYXkoY2hpbGRyZW4pO1xuICAgIHZhciBhY3RpdmVDaGlsZEluZGV4ID0gY2hpbGRyZW5BcnJheS5pbmRleE9mKGFjdGl2ZUNoaWxkKTtcblxuICAgIHZhciBjaGlsZE5vZGVzID0gX3JlYWN0RG9tMlsnZGVmYXVsdCddLmZpbmRET01Ob2RlKHRoaXMpLmNoaWxkcmVuO1xuICAgIHZhciBhY3RpdmVOb2RlID0gY2hpbGROb2RlcyAmJiBjaGlsZE5vZGVzW2FjdGl2ZUNoaWxkSW5kZXhdO1xuXG4gICAgaWYgKCFhY3RpdmVOb2RlIHx8ICFhY3RpdmVOb2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhY3RpdmVOb2RlLmZpcnN0Q2hpbGQuZm9jdXMoKTtcbiAgfTtcblxuICBOYXYucHJvdG90eXBlLmhhbmRsZVRhYktleURvd24gPSBmdW5jdGlvbiBoYW5kbGVUYWJLZXlEb3duKG9uU2VsZWN0LCBldmVudCkge1xuICAgIHZhciBuZXh0QWN0aXZlQ2hpbGQgPSB2b2lkIDA7XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgIGNhc2UgX2tleWNvZGUyWydkZWZhdWx0J10uY29kZXMubGVmdDpcbiAgICAgIGNhc2UgX2tleWNvZGUyWydkZWZhdWx0J10uY29kZXMudXA6XG4gICAgICAgIG5leHRBY3RpdmVDaGlsZCA9IHRoaXMuZ2V0TmV4dEFjdGl2ZUNoaWxkKC0xKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIF9rZXljb2RlMlsnZGVmYXVsdCddLmNvZGVzLnJpZ2h0OlxuICAgICAgY2FzZSBfa2V5Y29kZTJbJ2RlZmF1bHQnXS5jb2Rlcy5kb3duOlxuICAgICAgICBuZXh0QWN0aXZlQ2hpbGQgPSB0aGlzLmdldE5leHRBY3RpdmVDaGlsZCgxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBJdCB3YXMgYSBkaWZmZXJlbnQga2V5OyBkb24ndCBoYW5kbGUgdGhpcyBrZXlwcmVzcy5cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAob25TZWxlY3QgJiYgbmV4dEFjdGl2ZUNoaWxkICYmIG5leHRBY3RpdmVDaGlsZC5wcm9wcy5ldmVudEtleSAhPSBudWxsKSB7XG4gICAgICBvblNlbGVjdChuZXh0QWN0aXZlQ2hpbGQucHJvcHMuZXZlbnRLZXkpO1xuICAgIH1cblxuICAgIHRoaXMuX25lZWRzUmVmb2N1cyA9IHRydWU7XG4gIH07XG5cbiAgTmF2LnByb3RvdHlwZS5nZXROZXh0QWN0aXZlQ2hpbGQgPSBmdW5jdGlvbiBnZXROZXh0QWN0aXZlQ2hpbGQob2Zmc2V0KSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLnByb3BzLmNoaWxkcmVuO1xuXG4gICAgdmFyIHZhbGlkQ2hpbGRyZW4gPSBjaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICByZXR1cm4gY2hpbGQucHJvcHMuZXZlbnRLZXkgIT0gbnVsbCAmJiAhY2hpbGQucHJvcHMuZGlzYWJsZWQ7XG4gICAgfSk7XG5cbiAgICB2YXIgX2dldEFjdGl2ZVByb3BzMiA9IHRoaXMuZ2V0QWN0aXZlUHJvcHMoKSxcbiAgICAgICAgYWN0aXZlS2V5ID0gX2dldEFjdGl2ZVByb3BzMi5hY3RpdmVLZXksXG4gICAgICAgIGFjdGl2ZUhyZWYgPSBfZ2V0QWN0aXZlUHJvcHMyLmFjdGl2ZUhyZWY7XG5cbiAgICB2YXIgYWN0aXZlQ2hpbGQgPSBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjJbJ2RlZmF1bHQnXS5maW5kKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIHJldHVybiBfdGhpczMuaXNBY3RpdmUoY2hpbGQsIGFjdGl2ZUtleSwgYWN0aXZlSHJlZik7XG4gICAgfSk7XG5cbiAgICAvLyBUaGlzIGFzc3VtZXMgdGhlIGFjdGl2ZSBjaGlsZCBpcyBub3QgZGlzYWJsZWQuXG4gICAgdmFyIGFjdGl2ZUNoaWxkSW5kZXggPSB2YWxpZENoaWxkcmVuLmluZGV4T2YoYWN0aXZlQ2hpbGQpO1xuICAgIGlmIChhY3RpdmVDaGlsZEluZGV4ID09PSAtMSkge1xuICAgICAgLy8gU29tZXRoaW5nIGhhcyBnb25lIHdyb25nLiBTZWxlY3QgdGhlIGZpcnN0IHZhbGlkIGNoaWxkIHdlIGNhbiBmaW5kLlxuICAgICAgcmV0dXJuIHZhbGlkQ2hpbGRyZW5bMF07XG4gICAgfVxuXG4gICAgdmFyIG5leHRJbmRleCA9IGFjdGl2ZUNoaWxkSW5kZXggKyBvZmZzZXQ7XG4gICAgdmFyIG51bVZhbGlkQ2hpbGRyZW4gPSB2YWxpZENoaWxkcmVuLmxlbmd0aDtcblxuICAgIGlmIChuZXh0SW5kZXggPj0gbnVtVmFsaWRDaGlsZHJlbikge1xuICAgICAgbmV4dEluZGV4ID0gMDtcbiAgICB9IGVsc2UgaWYgKG5leHRJbmRleCA8IDApIHtcbiAgICAgIG5leHRJbmRleCA9IG51bVZhbGlkQ2hpbGRyZW4gLSAxO1xuICAgIH1cblxuICAgIHJldHVybiB2YWxpZENoaWxkcmVuW25leHRJbmRleF07XG4gIH07XG5cbiAgTmF2LnByb3RvdHlwZS5nZXRBY3RpdmVQcm9wcyA9IGZ1bmN0aW9uIGdldEFjdGl2ZVByb3BzKCkge1xuICAgIHZhciB0YWJDb250YWluZXIgPSB0aGlzLmNvbnRleHQuJGJzX3RhYkNvbnRhaW5lcjtcblxuICAgIGlmICh0YWJDb250YWluZXIpIHtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyAoMCwgX3dhcm5pbmcyWydkZWZhdWx0J10pKHRoaXMucHJvcHMuYWN0aXZlS2V5ID09IG51bGwgJiYgIXRoaXMucHJvcHMuYWN0aXZlSHJlZiwgJ1NwZWNpZnlpbmcgYSBgPE5hdj5gIGBhY3RpdmVLZXlgIG9yIGBhY3RpdmVIcmVmYCBpbiB0aGUgY29udGV4dCBvZiAnICsgJ2EgYDxUYWJDb250YWluZXI+YCBpcyBub3Qgc3VwcG9ydGVkLiBJbnN0ZWFkIHVzZSBgPFRhYkNvbnRhaW5lciAnICsgKCdhY3RpdmVLZXk9eycgKyB0aGlzLnByb3BzLmFjdGl2ZUtleSArICd9IC8+YC4nKSkgOiB2b2lkIDA7XG5cbiAgICAgIHJldHVybiB0YWJDb250YWluZXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucHJvcHM7XG4gIH07XG5cbiAgTmF2LnByb3RvdHlwZS5pc0FjdGl2ZSA9IGZ1bmN0aW9uIGlzQWN0aXZlKF9yZWYyLCBhY3RpdmVLZXksIGFjdGl2ZUhyZWYpIHtcbiAgICB2YXIgcHJvcHMgPSBfcmVmMi5wcm9wcztcblxuICAgIGlmIChwcm9wcy5hY3RpdmUgfHwgYWN0aXZlS2V5ICE9IG51bGwgJiYgcHJvcHMuZXZlbnRLZXkgPT09IGFjdGl2ZUtleSB8fCBhY3RpdmVIcmVmICYmIHByb3BzLmhyZWYgPT09IGFjdGl2ZUhyZWYpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9wcy5hY3RpdmU7XG4gIH07XG5cbiAgTmF2LnByb3RvdHlwZS5nZXRUYWJQcm9wcyA9IGZ1bmN0aW9uIGdldFRhYlByb3BzKGNoaWxkLCB0YWJDb250YWluZXIsIG5hdlJvbGUsIGFjdGl2ZSwgb25TZWxlY3QpIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIGlmICghdGFiQ29udGFpbmVyICYmIG5hdlJvbGUgIT09ICd0YWJsaXN0Jykge1xuICAgICAgLy8gTm8gdGFiIHByb3BzIGhlcmUuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgX2NoaWxkJHByb3BzID0gY2hpbGQucHJvcHMsXG4gICAgICAgIGlkID0gX2NoaWxkJHByb3BzLmlkLFxuICAgICAgICBjb250cm9scyA9IF9jaGlsZCRwcm9wc1snYXJpYS1jb250cm9scyddLFxuICAgICAgICBldmVudEtleSA9IF9jaGlsZCRwcm9wcy5ldmVudEtleSxcbiAgICAgICAgcm9sZSA9IF9jaGlsZCRwcm9wcy5yb2xlLFxuICAgICAgICBvbktleURvd24gPSBfY2hpbGQkcHJvcHMub25LZXlEb3duLFxuICAgICAgICB0YWJJbmRleCA9IF9jaGlsZCRwcm9wcy50YWJJbmRleDtcblxuXG4gICAgaWYgKHRhYkNvbnRhaW5lcikge1xuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/ICgwLCBfd2FybmluZzJbJ2RlZmF1bHQnXSkoIWlkICYmICFjb250cm9scywgJ0luIHRoZSBjb250ZXh0IG9mIGEgYDxUYWJDb250YWluZXI+YCwgYDxOYXZJdGVtPmBzIGFyZSBnaXZlbiAnICsgJ2dlbmVyYXRlZCBgaWRgIGFuZCBgYXJpYS1jb250cm9sc2AgYXR0cmlidXRlcyBmb3IgdGhlIHNha2Ugb2YgJyArICdwcm9wZXIgY29tcG9uZW50IGFjY2Vzc2liaWxpdHkuIEFueSBwcm92aWRlZCBvbmVzIHdpbGwgYmUgaWdub3JlZC4gJyArICdUbyBjb250cm9sIHRoZXNlIGF0dHJpYnV0ZXMgZGlyZWN0bHksIHByb3ZpZGUgYSBgZ2VuZXJhdGVDaGlsZElkYCAnICsgJ3Byb3AgdG8gdGhlIHBhcmVudCBgPFRhYkNvbnRhaW5lcj5gLicpIDogdm9pZCAwO1xuXG4gICAgICBpZCA9IHRhYkNvbnRhaW5lci5nZXRUYWJJZChldmVudEtleSk7XG4gICAgICBjb250cm9scyA9IHRhYkNvbnRhaW5lci5nZXRQYW5lSWQoZXZlbnRLZXkpO1xuICAgIH1cblxuICAgIGlmIChuYXZSb2xlID09PSAndGFibGlzdCcpIHtcbiAgICAgIHJvbGUgPSByb2xlIHx8ICd0YWInO1xuICAgICAgb25LZXlEb3duID0gKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICByZXR1cm4gX3RoaXM0LmhhbmRsZVRhYktleURvd24ob25TZWxlY3QsIGV2ZW50KTtcbiAgICAgIH0sIG9uS2V5RG93bik7XG4gICAgICB0YWJJbmRleCA9IGFjdGl2ZSA/IHRhYkluZGV4IDogLTE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBpZCxcbiAgICAgIHJvbGU6IHJvbGUsXG4gICAgICBvbktleURvd246IG9uS2V5RG93bixcbiAgICAgICdhcmlhLWNvbnRyb2xzJzogY29udHJvbHMsXG4gICAgICB0YWJJbmRleDogdGFiSW5kZXhcbiAgICB9O1xuICB9O1xuXG4gIE5hdi5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfZXh0ZW5kczIsXG4gICAgICAgIF90aGlzNSA9IHRoaXM7XG5cbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgc3RhY2tlZCA9IF9wcm9wcy5zdGFja2VkLFxuICAgICAgICBqdXN0aWZpZWQgPSBfcHJvcHMuanVzdGlmaWVkLFxuICAgICAgICBvblNlbGVjdCA9IF9wcm9wcy5vblNlbGVjdCxcbiAgICAgICAgcHJvcHNSb2xlID0gX3Byb3BzLnJvbGUsXG4gICAgICAgIHByb3BzTmF2YmFyID0gX3Byb3BzLm5hdmJhcixcbiAgICAgICAgcHVsbFJpZ2h0ID0gX3Byb3BzLnB1bGxSaWdodCxcbiAgICAgICAgcHVsbExlZnQgPSBfcHJvcHMucHVsbExlZnQsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydzdGFja2VkJywgJ2p1c3RpZmllZCcsICdvblNlbGVjdCcsICdyb2xlJywgJ25hdmJhcicsICdwdWxsUmlnaHQnLCAncHVsbExlZnQnLCAnY2xhc3NOYW1lJywgJ2NoaWxkcmVuJ10pO1xuXG5cbiAgICB2YXIgdGFiQ29udGFpbmVyID0gdGhpcy5jb250ZXh0LiRic190YWJDb250YWluZXI7XG4gICAgdmFyIHJvbGUgPSBwcm9wc1JvbGUgfHwgKHRhYkNvbnRhaW5lciA/ICd0YWJsaXN0JyA6IG51bGwpO1xuXG4gICAgdmFyIF9nZXRBY3RpdmVQcm9wczMgPSB0aGlzLmdldEFjdGl2ZVByb3BzKCksXG4gICAgICAgIGFjdGl2ZUtleSA9IF9nZXRBY3RpdmVQcm9wczMuYWN0aXZlS2V5LFxuICAgICAgICBhY3RpdmVIcmVmID0gX2dldEFjdGl2ZVByb3BzMy5hY3RpdmVIcmVmO1xuXG4gICAgZGVsZXRlIHByb3BzLmFjdGl2ZUtleTsgLy8gQWNjZXNzZWQgdmlhIHRoaXMuZ2V0QWN0aXZlUHJvcHMoKS5cbiAgICBkZWxldGUgcHJvcHMuYWN0aXZlSHJlZjsgLy8gQWNjZXNzZWQgdmlhIHRoaXMuZ2V0QWN0aXZlUHJvcHMoKS5cblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoe30sICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpLCAoX2V4dGVuZHMyID0ge30sIF9leHRlbmRzMlsoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ3N0YWNrZWQnKV0gPSBzdGFja2VkLCBfZXh0ZW5kczJbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdqdXN0aWZpZWQnKV0gPSBqdXN0aWZpZWQsIF9leHRlbmRzMikpO1xuXG4gICAgdmFyIG5hdmJhciA9IHByb3BzTmF2YmFyICE9IG51bGwgPyBwcm9wc05hdmJhciA6IHRoaXMuY29udGV4dC4kYnNfbmF2YmFyO1xuICAgIHZhciBwdWxsTGVmdENsYXNzTmFtZSA9IHZvaWQgMDtcbiAgICB2YXIgcHVsbFJpZ2h0Q2xhc3NOYW1lID0gdm9pZCAwO1xuXG4gICAgaWYgKG5hdmJhcikge1xuICAgICAgdmFyIG5hdmJhclByb3BzID0gdGhpcy5jb250ZXh0LiRic19uYXZiYXIgfHwgeyBic0NsYXNzOiAnbmF2YmFyJyB9O1xuXG4gICAgICBjbGFzc2VzWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShuYXZiYXJQcm9wcywgJ25hdicpXSA9IHRydWU7XG5cbiAgICAgIHB1bGxSaWdodENsYXNzTmFtZSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShuYXZiYXJQcm9wcywgJ3JpZ2h0Jyk7XG4gICAgICBwdWxsTGVmdENsYXNzTmFtZSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShuYXZiYXJQcm9wcywgJ2xlZnQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHVsbFJpZ2h0Q2xhc3NOYW1lID0gJ3B1bGwtcmlnaHQnO1xuICAgICAgcHVsbExlZnRDbGFzc05hbWUgPSAncHVsbC1sZWZ0JztcbiAgICB9XG5cbiAgICBjbGFzc2VzW3B1bGxSaWdodENsYXNzTmFtZV0gPSBwdWxsUmlnaHQ7XG4gICAgY2xhc3Nlc1twdWxsTGVmdENsYXNzTmFtZV0gPSBwdWxsTGVmdDtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICd1bCcsXG4gICAgICAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgICAgcm9sZTogcm9sZSxcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICAgIH0pLFxuICAgICAgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yWydkZWZhdWx0J10ubWFwKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgdmFyIGFjdGl2ZSA9IF90aGlzNS5pc0FjdGl2ZShjaGlsZCwgYWN0aXZlS2V5LCBhY3RpdmVIcmVmKTtcbiAgICAgICAgdmFyIGNoaWxkT25TZWxlY3QgPSAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkoY2hpbGQucHJvcHMub25TZWxlY3QsIG9uU2VsZWN0LCBuYXZiYXIgJiYgbmF2YmFyLm9uU2VsZWN0LCB0YWJDb250YWluZXIgJiYgdGFiQ29udGFpbmVyLm9uU2VsZWN0KTtcblxuICAgICAgICByZXR1cm4gKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGNoaWxkLCAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCBfdGhpczUuZ2V0VGFiUHJvcHMoY2hpbGQsIHRhYkNvbnRhaW5lciwgcm9sZSwgYWN0aXZlLCBjaGlsZE9uU2VsZWN0KSwge1xuICAgICAgICAgIGFjdGl2ZTogYWN0aXZlLFxuICAgICAgICAgIGFjdGl2ZUtleTogYWN0aXZlS2V5LFxuICAgICAgICAgIGFjdGl2ZUhyZWY6IGFjdGl2ZUhyZWYsXG4gICAgICAgICAgb25TZWxlY3Q6IGNoaWxkT25TZWxlY3RcbiAgICAgICAgfSkpO1xuICAgICAgfSlcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBOYXY7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5OYXYucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuTmF2LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbk5hdi5jb250ZXh0VHlwZXMgPSBjb250ZXh0VHlwZXM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ25hdicsICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNTdHlsZXMpKFsndGFicycsICdwaWxscyddLCBOYXYpKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9Ecm9wZG93biA9IHJlcXVpcmUoJy4vRHJvcGRvd24nKTtcblxudmFyIF9Ecm9wZG93bjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ecm9wZG93bik7XG5cbnZhciBfc3BsaXRDb21wb25lbnRQcm9wczIgPSByZXF1aXJlKCcuL3V0aWxzL3NwbGl0Q29tcG9uZW50UHJvcHMnKTtcblxudmFyIF9zcGxpdENvbXBvbmVudFByb3BzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NwbGl0Q29tcG9uZW50UHJvcHMyKTtcblxudmFyIF9WYWxpZENvbXBvbmVudENoaWxkcmVuID0gcmVxdWlyZSgnLi91dGlscy9WYWxpZENvbXBvbmVudENoaWxkcmVuJyk7XG5cbnZhciBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9WYWxpZENvbXBvbmVudENoaWxkcmVuKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgX0Ryb3Bkb3duMlsnZGVmYXVsdCddLnByb3BUeXBlcywge1xuXG4gIC8vIFRvZ2dsZSBwcm9wcy5cbiAgdGl0bGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubm9kZS5pc1JlcXVpcmVkLFxuICBub0NhcmV0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIGFjdGl2ZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8vIE92ZXJyaWRlIGdlbmVyYXRlZCBkb2NzIGZyb20gPERyb3Bkb3duPi5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjaGlsZHJlbjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ub2RlXG59KTtcblxudmFyIE5hdkRyb3Bkb3duID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoTmF2RHJvcGRvd24sIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE5hdkRyb3Bkb3duKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIE5hdkRyb3Bkb3duKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgTmF2RHJvcGRvd24ucHJvdG90eXBlLmlzQWN0aXZlID0gZnVuY3Rpb24gaXNBY3RpdmUoX3JlZiwgYWN0aXZlS2V5LCBhY3RpdmVIcmVmKSB7XG4gICAgdmFyIHByb3BzID0gX3JlZi5wcm9wcztcblxuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgaWYgKHByb3BzLmFjdGl2ZSB8fCBhY3RpdmVLZXkgIT0gbnVsbCAmJiBwcm9wcy5ldmVudEtleSA9PT0gYWN0aXZlS2V5IHx8IGFjdGl2ZUhyZWYgJiYgcHJvcHMuaHJlZiA9PT0gYWN0aXZlSHJlZikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKF9WYWxpZENvbXBvbmVudENoaWxkcmVuMlsnZGVmYXVsdCddLnNvbWUocHJvcHMuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgcmV0dXJuIF90aGlzMi5pc0FjdGl2ZShjaGlsZCwgYWN0aXZlS2V5LCBhY3RpdmVIcmVmKTtcbiAgICB9KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BzLmFjdGl2ZTtcbiAgfTtcblxuICBOYXZEcm9wZG93bi5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIHRpdGxlID0gX3Byb3BzLnRpdGxlLFxuICAgICAgICBhY3RpdmVLZXkgPSBfcHJvcHMuYWN0aXZlS2V5LFxuICAgICAgICBhY3RpdmVIcmVmID0gX3Byb3BzLmFjdGl2ZUhyZWYsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHN0eWxlID0gX3Byb3BzLnN0eWxlLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsndGl0bGUnLCAnYWN0aXZlS2V5JywgJ2FjdGl2ZUhyZWYnLCAnY2xhc3NOYW1lJywgJ3N0eWxlJywgJ2NoaWxkcmVuJ10pO1xuXG5cbiAgICB2YXIgYWN0aXZlID0gdGhpcy5pc0FjdGl2ZSh0aGlzLCBhY3RpdmVLZXksIGFjdGl2ZUhyZWYpO1xuICAgIGRlbGV0ZSBwcm9wcy5hY3RpdmU7IC8vIEFjY2Vzc2VkIHZpYSB0aGlzLmlzQWN0aXZlKCkuXG4gICAgZGVsZXRlIHByb3BzLmV2ZW50S2V5OyAvLyBBY2Nlc3NlZCB2aWEgdGhpcy5pc0FjdGl2ZSgpLlxuXG4gICAgdmFyIF9zcGxpdENvbXBvbmVudFByb3BzID0gKDAsIF9zcGxpdENvbXBvbmVudFByb3BzM1snZGVmYXVsdCddKShwcm9wcywgX0Ryb3Bkb3duMlsnZGVmYXVsdCddLkNvbnRyb2xsZWRDb21wb25lbnQpLFxuICAgICAgICBkcm9wZG93blByb3BzID0gX3NwbGl0Q29tcG9uZW50UHJvcHNbMF0sXG4gICAgICAgIHRvZ2dsZVByb3BzID0gX3NwbGl0Q29tcG9uZW50UHJvcHNbMV07XG5cbiAgICAvLyBVbmxpa2UgZm9yIHRoZSBvdGhlciBkcm9wZG93bnMsIHN0eWxpbmcgbmVlZHMgdG8gZ28gdG8gdGhlIGA8RHJvcGRvd24+YFxuICAgIC8vIHJhdGhlciB0aGFuIHRoZSBgPERyb3Bkb3duLlRvZ2dsZT5gLlxuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgX0Ryb3Bkb3duMlsnZGVmYXVsdCddLFxuICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZHJvcGRvd25Qcm9wcywge1xuICAgICAgICBjb21wb25lbnRDbGFzczogJ2xpJyxcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgeyBhY3RpdmU6IGFjdGl2ZSB9KSxcbiAgICAgICAgc3R5bGU6IHN0eWxlXG4gICAgICB9KSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICBfRHJvcGRvd24yWydkZWZhdWx0J10uVG9nZ2xlLFxuICAgICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCB0b2dnbGVQcm9wcywgeyB1c2VBbmNob3I6IHRydWUgfSksXG4gICAgICAgIHRpdGxlXG4gICAgICApLFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIF9Ecm9wZG93bjJbJ2RlZmF1bHQnXS5NZW51LFxuICAgICAgICBudWxsLFxuICAgICAgICBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjJbJ2RlZmF1bHQnXS5tYXAoY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY2xvbmVFbGVtZW50KGNoaWxkLCB7XG4gICAgICAgICAgICBhY3RpdmU6IF90aGlzMy5pc0FjdGl2ZShjaGlsZCwgYWN0aXZlS2V5LCBhY3RpdmVIcmVmKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIE5hdkRyb3Bkb3duO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuTmF2RHJvcGRvd24ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBOYXZEcm9wZG93bjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9TYWZlQW5jaG9yID0gcmVxdWlyZSgnLi9TYWZlQW5jaG9yJyk7XG5cbnZhciBfU2FmZUFuY2hvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TYWZlQW5jaG9yKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24gPSByZXF1aXJlKCcuL3V0aWxzL2NyZWF0ZUNoYWluZWRGdW5jdGlvbicpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGFjdGl2ZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBkaXNhYmxlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICByb2xlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcbiAgaHJlZjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gIG9uQ2xpY2s6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgb25TZWxlY3Q6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgZXZlbnRLZXk6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYW55XG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBhY3RpdmU6IGZhbHNlLFxuICBkaXNhYmxlZDogZmFsc2Vcbn07XG5cbnZhciBOYXZJdGVtID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoTmF2SXRlbSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTmF2SXRlbShwcm9wcywgY29udGV4dCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIE5hdkl0ZW0pO1xuXG4gICAgdmFyIF90aGlzID0gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgIF90aGlzLmhhbmRsZUNsaWNrID0gX3RoaXMuaGFuZGxlQ2xpY2suYmluZChfdGhpcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgTmF2SXRlbS5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhlKSB7XG4gICAgaWYgKHRoaXMucHJvcHMub25TZWxlY3QpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKCF0aGlzLnByb3BzLmRpc2FibGVkKSB7XG4gICAgICAgIHRoaXMucHJvcHMub25TZWxlY3QodGhpcy5wcm9wcy5ldmVudEtleSwgZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIE5hdkl0ZW0ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYWN0aXZlID0gX3Byb3BzLmFjdGl2ZSxcbiAgICAgICAgZGlzYWJsZWQgPSBfcHJvcHMuZGlzYWJsZWQsXG4gICAgICAgIG9uQ2xpY2sgPSBfcHJvcHMub25DbGljayxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGUgPSBfcHJvcHMuc3R5bGUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2FjdGl2ZScsICdkaXNhYmxlZCcsICdvbkNsaWNrJywgJ2NsYXNzTmFtZScsICdzdHlsZSddKTtcblxuXG4gICAgZGVsZXRlIHByb3BzLm9uU2VsZWN0O1xuICAgIGRlbGV0ZSBwcm9wcy5ldmVudEtleTtcblxuICAgIC8vIFRoZXNlIGFyZSBpbmplY3RlZCBkb3duIGJ5IGA8TmF2PmAgZm9yIGJ1aWxkaW5nIGA8U3ViTmF2PmBzLlxuICAgIGRlbGV0ZSBwcm9wcy5hY3RpdmVLZXk7XG4gICAgZGVsZXRlIHByb3BzLmFjdGl2ZUhyZWY7XG5cbiAgICBpZiAoIXByb3BzLnJvbGUpIHtcbiAgICAgIGlmIChwcm9wcy5ocmVmID09PSAnIycpIHtcbiAgICAgICAgcHJvcHMucm9sZSA9ICdidXR0b24nO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcHMucm9sZSA9PT0gJ3RhYicpIHtcbiAgICAgIHByb3BzWydhcmlhLXNlbGVjdGVkJ10gPSBhY3RpdmU7XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2xpJyxcbiAgICAgIHtcbiAgICAgICAgcm9sZTogJ3ByZXNlbnRhdGlvbicsXG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIHsgYWN0aXZlOiBhY3RpdmUsIGRpc2FibGVkOiBkaXNhYmxlZCB9KSxcbiAgICAgICAgc3R5bGU6IHN0eWxlXG4gICAgICB9LFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX1NhZmVBbmNob3IyWydkZWZhdWx0J10sICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIHByb3BzLCB7XG4gICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgb25DbGljazogKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKG9uQ2xpY2ssIHRoaXMuaGFuZGxlQ2xpY2spXG4gICAgICB9KSlcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBOYXZJdGVtO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuTmF2SXRlbS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5OYXZJdGVtLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gTmF2SXRlbTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMyA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX3VuY29udHJvbGxhYmxlID0gcmVxdWlyZSgndW5jb250cm9sbGFibGUnKTtcblxudmFyIF91bmNvbnRyb2xsYWJsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF91bmNvbnRyb2xsYWJsZSk7XG5cbnZhciBfR3JpZCA9IHJlcXVpcmUoJy4vR3JpZCcpO1xuXG52YXIgX0dyaWQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfR3JpZCk7XG5cbnZhciBfTmF2YmFyQnJhbmQgPSByZXF1aXJlKCcuL05hdmJhckJyYW5kJyk7XG5cbnZhciBfTmF2YmFyQnJhbmQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTmF2YmFyQnJhbmQpO1xuXG52YXIgX05hdmJhckNvbGxhcHNlID0gcmVxdWlyZSgnLi9OYXZiYXJDb2xsYXBzZScpO1xuXG52YXIgX05hdmJhckNvbGxhcHNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05hdmJhckNvbGxhcHNlKTtcblxudmFyIF9OYXZiYXJIZWFkZXIgPSByZXF1aXJlKCcuL05hdmJhckhlYWRlcicpO1xuXG52YXIgX05hdmJhckhlYWRlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9OYXZiYXJIZWFkZXIpO1xuXG52YXIgX05hdmJhclRvZ2dsZSA9IHJlcXVpcmUoJy4vTmF2YmFyVG9nZ2xlJyk7XG5cbnZhciBfTmF2YmFyVG9nZ2xlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05hdmJhclRvZ2dsZSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbnZhciBfU3R5bGVDb25maWcgPSByZXF1aXJlKCcuL3V0aWxzL1N0eWxlQ29uZmlnJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmVkRnVuY3Rpb24nKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQ3JlYXRlIGEgZml4ZWQgbmF2YmFyIGFsb25nIHRoZSB0b3Agb2YgdGhlIHNjcmVlbiwgdGhhdCBzY3JvbGxzIHdpdGggdGhlXG4gICAqIHBhZ2VcbiAgICovXG4gIGZpeGVkVG9wOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBmaXhlZCBuYXZiYXIgYWxvbmcgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLCB0aGF0IHNjcm9sbHMgd2l0aFxuICAgKiB0aGUgcGFnZVxuICAgKi9cbiAgZml4ZWRCb3R0b206IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgLyoqXG4gICAqIENyZWF0ZSBhIGZ1bGwtd2lkdGggbmF2YmFyIHRoYXQgc2Nyb2xscyBhd2F5IHdpdGggdGhlIHBhZ2VcbiAgICovXG4gIHN0YXRpY1RvcDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICAvKipcbiAgICogQW4gYWx0ZXJuYXRpdmUgZGFyayB2aXN1YWwgc3R5bGUgZm9yIHRoZSBOYXZiYXJcbiAgICovXG4gIGludmVyc2U6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgLyoqXG4gICAqIEFsbG93IHRoZSBOYXZiYXIgdG8gZmx1aWRseSBhZGp1c3QgdG8gdGhlIHBhZ2Ugb3IgY29udGFpbmVyIHdpZHRoLCBpbnN0ZWFkXG4gICAqIG9mIGF0IHRoZSBwcmVkZWZpbmVkIHNjcmVlbiBicmVha3BvaW50c1xuICAgKi9cbiAgZmx1aWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogU2V0IGEgY3VzdG9tIGVsZW1lbnQgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKi9cbiAgY29tcG9uZW50Q2xhc3M6IF9lbGVtZW50VHlwZTJbJ2RlZmF1bHQnXSxcbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZmlyZWQgd2hlbiB0aGUgYDxOYXZiYXI+YCBib2R5IGNvbGxhcHNlcyBvciBleHBhbmRzLiBGaXJlZCB3aGVuXG4gICAqIGEgYDxOYXZiYXIuVG9nZ2xlPmAgaXMgY2xpY2tlZCBhbmQgY2FsbGVkIHdpdGggdGhlIG5ldyBgbmF2RXhwYW5kZWRgXG4gICAqIGJvb2xlYW4gdmFsdWUuXG4gICAqXG4gICAqIEBjb250cm9sbGFibGUgbmF2RXhwYW5kZWRcbiAgICovXG4gIG9uVG9nZ2xlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZpcmVkIHdoZW4gYSBkZXNjZW5kYW50IG9mIGEgY2hpbGQgYDxOYXY+YCBpcyBzZWxlY3RlZC4gU2hvdWxkXG4gICAqIGJlIHVzZWQgdG8gZXhlY3V0ZSBjb21wbGV4IGNsb3Npbmcgb3Igb3RoZXIgbWlzY2VsbGFuZW91cyBhY3Rpb25zIGRlc2lyZWRcbiAgICogYWZ0ZXIgc2VsZWN0aW5nIGEgZGVzY2VuZGFudCBvZiBgPE5hdj5gLiBEb2VzIG5vdGhpbmcgaWYgbm8gYDxOYXY+YCBvciBgPE5hdj5gXG4gICAqIGRlc2NlbmRhbnRzIGV4aXN0LiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdpdGggYW4gZXZlbnRLZXksIHdoaWNoIGlzIGFcbiAgICogcHJvcCBmcm9tIHRoZSBzZWxlY3RlZCBgPE5hdj5gIGRlc2NlbmRhbnQsIGFuZCBhbiBldmVudC5cbiAgICpcbiAgICogYGBganNcbiAgICogZnVuY3Rpb24gKFxuICAgKiBcdEFueSBldmVudEtleSxcbiAgICogXHRTeW50aGV0aWNFdmVudCBldmVudD9cbiAgICogKVxuICAgKiBgYGBcbiAgICpcbiAgICogRm9yIGJhc2ljIGNsb3NpbmcgYmVoYXZpb3IgYWZ0ZXIgYWxsIGA8TmF2PmAgZGVzY2VuZGFudCBvblNlbGVjdCBldmVudHMgaW5cbiAgICogbW9iaWxlIHZpZXdwb3J0cywgdHJ5IHVzaW5nIGNvbGxhcHNlT25TZWxlY3QuXG4gICAqXG4gICAqIE5vdGU6IElmIHlvdSBhcmUgbWFudWFsbHkgY2xvc2luZyB0aGUgbmF2YmFyIHVzaW5nIHRoaXMgYE9uU2VsZWN0YCBwcm9wLFxuICAgKiBlbnN1cmUgdGhhdCB5b3UgYXJlIHNldHRpbmcgYGV4cGFuZGVkYCB0byBmYWxzZSBhbmQgbm90ICp0b2dnbGluZyogYmV0d2VlblxuICAgKiB0cnVlIGFuZCBmYWxzZS5cbiAgICovXG4gIG9uU2VsZWN0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIC8qKlxuICAgKiBTZXRzIGBleHBhbmRlZGAgdG8gYGZhbHNlYCBhZnRlciB0aGUgb25TZWxlY3QgZXZlbnQgb2YgYSBkZXNjZW5kYW50IG9mIGFcbiAgICogY2hpbGQgYDxOYXY+YC4gRG9lcyBub3RoaW5nIGlmIG5vIGA8TmF2PmAgb3IgYDxOYXY+YCBkZXNjZW5kYW50cyBleGlzdC5cbiAgICpcbiAgICogVGhlIG9uU2VsZWN0IGNhbGxiYWNrIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgZm9yIG1vcmUgY29tcGxleCBvcGVyYXRpb25zXG4gICAqIHRoYXQgbmVlZCB0byBiZSBleGVjdXRlZCBhZnRlciB0aGUgYHNlbGVjdGAgZXZlbnQgb2YgYDxOYXY+YCBkZXNjZW5kYW50cy5cbiAgICovXG4gIGNvbGxhcHNlT25TZWxlY3Q6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgLyoqXG4gICAqIEV4cGxpY2l0bHkgc2V0IHRoZSB2aXNpYmxpdHkgb2YgdGhlIG5hdmJhciBib2R5XG4gICAqXG4gICAqIEBjb250cm9sbGFibGUgb25Ub2dnbGVcbiAgICovXG4gIGV4cGFuZGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgcm9sZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmdcbn07IC8vIFRPRE86IFJlbW92ZSB0aGlzIHByYWdtYSBvbmNlIHdlIHVwZ3JhZGUgZXNsaW50LWNvbmZpZy1haXJibmIuXG4vKiBlc2xpbnQtZGlzYWJsZSByZWFjdC9uby1tdWx0aS1jb21wICovXG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiAnbmF2JyxcbiAgZml4ZWRUb3A6IGZhbHNlLFxuICBmaXhlZEJvdHRvbTogZmFsc2UsXG4gIHN0YXRpY1RvcDogZmFsc2UsXG4gIGludmVyc2U6IGZhbHNlLFxuICBmbHVpZDogZmFsc2UsXG4gIGNvbGxhcHNlT25TZWxlY3Q6IGZhbHNlXG59O1xuXG52YXIgY2hpbGRDb250ZXh0VHlwZXMgPSB7XG4gICRic19uYXZiYXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc2hhcGUoe1xuICAgIGJzQ2xhc3M6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICAgIGV4cGFuZGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gICAgb25Ub2dnbGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYy5pc1JlcXVpcmVkLFxuICAgIG9uU2VsZWN0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmNcbiAgfSlcbn07XG5cbnZhciBOYXZiYXIgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShOYXZiYXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE5hdmJhcihwcm9wcywgY29udGV4dCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIE5hdmJhcik7XG5cbiAgICB2YXIgX3RoaXMgPSAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgX3RoaXMuaGFuZGxlVG9nZ2xlID0gX3RoaXMuaGFuZGxlVG9nZ2xlLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmhhbmRsZUNvbGxhcHNlID0gX3RoaXMuaGFuZGxlQ29sbGFwc2UuYmluZChfdGhpcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgTmF2YmFyLnByb3RvdHlwZS5nZXRDaGlsZENvbnRleHQgPSBmdW5jdGlvbiBnZXRDaGlsZENvbnRleHQoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGJzQ2xhc3MgPSBfcHJvcHMuYnNDbGFzcyxcbiAgICAgICAgZXhwYW5kZWQgPSBfcHJvcHMuZXhwYW5kZWQsXG4gICAgICAgIG9uU2VsZWN0ID0gX3Byb3BzLm9uU2VsZWN0LFxuICAgICAgICBjb2xsYXBzZU9uU2VsZWN0ID0gX3Byb3BzLmNvbGxhcHNlT25TZWxlY3Q7XG5cblxuICAgIHJldHVybiB7XG4gICAgICAkYnNfbmF2YmFyOiB7XG4gICAgICAgIGJzQ2xhc3M6IGJzQ2xhc3MsXG4gICAgICAgIGV4cGFuZGVkOiBleHBhbmRlZCxcbiAgICAgICAgb25Ub2dnbGU6IHRoaXMuaGFuZGxlVG9nZ2xlLFxuICAgICAgICBvblNlbGVjdDogKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKG9uU2VsZWN0LCBjb2xsYXBzZU9uU2VsZWN0ID8gdGhpcy5oYW5kbGVDb2xsYXBzZSA6IG51bGwpXG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBOYXZiYXIucHJvdG90eXBlLmhhbmRsZUNvbGxhcHNlID0gZnVuY3Rpb24gaGFuZGxlQ29sbGFwc2UoKSB7XG4gICAgdmFyIF9wcm9wczIgPSB0aGlzLnByb3BzLFxuICAgICAgICBvblRvZ2dsZSA9IF9wcm9wczIub25Ub2dnbGUsXG4gICAgICAgIGV4cGFuZGVkID0gX3Byb3BzMi5leHBhbmRlZDtcblxuXG4gICAgaWYgKGV4cGFuZGVkKSB7XG4gICAgICBvblRvZ2dsZShmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIE5hdmJhci5wcm90b3R5cGUuaGFuZGxlVG9nZ2xlID0gZnVuY3Rpb24gaGFuZGxlVG9nZ2xlKCkge1xuICAgIHZhciBfcHJvcHMzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgb25Ub2dnbGUgPSBfcHJvcHMzLm9uVG9nZ2xlLFxuICAgICAgICBleHBhbmRlZCA9IF9wcm9wczMuZXhwYW5kZWQ7XG5cblxuICAgIG9uVG9nZ2xlKCFleHBhbmRlZCk7XG4gIH07XG5cbiAgTmF2YmFyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9leHRlbmRzMjtcblxuICAgIHZhciBfcHJvcHM0ID0gdGhpcy5wcm9wcyxcbiAgICAgICAgQ29tcG9uZW50ID0gX3Byb3BzNC5jb21wb25lbnRDbGFzcyxcbiAgICAgICAgZml4ZWRUb3AgPSBfcHJvcHM0LmZpeGVkVG9wLFxuICAgICAgICBmaXhlZEJvdHRvbSA9IF9wcm9wczQuZml4ZWRCb3R0b20sXG4gICAgICAgIHN0YXRpY1RvcCA9IF9wcm9wczQuc3RhdGljVG9wLFxuICAgICAgICBpbnZlcnNlID0gX3Byb3BzNC5pbnZlcnNlLFxuICAgICAgICBmbHVpZCA9IF9wcm9wczQuZmx1aWQsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wczQuY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wczQuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzNCwgWydjb21wb25lbnRDbGFzcycsICdmaXhlZFRvcCcsICdmaXhlZEJvdHRvbScsICdzdGF0aWNUb3AnLCAnaW52ZXJzZScsICdmbHVpZCcsICdjbGFzc05hbWUnLCAnY2hpbGRyZW4nXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wc0FuZE9taXQgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wc0FuZE9taXQpKHByb3BzLCBbJ2V4cGFuZGVkJywgJ29uVG9nZ2xlJywgJ29uU2VsZWN0JywgJ2NvbGxhcHNlT25TZWxlY3QnXSksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzQW5kT21pdFswXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc0FuZE9taXRbMV07XG5cbiAgICAvLyB3aWxsIHJlc3VsdCBpbiBzb21lIGZhbHNlIHBvc2l0aXZlcyBidXQgdGhhdCBzZWVtcyBiZXR0ZXJcbiAgICAvLyB0aGFuIGZhbHNlIG5lZ2F0aXZlcy4gc3RyaWN0IGB1bmRlZmluZWRgIGNoZWNrIGFsbG93cyBleHBsaWNpdFxuICAgIC8vIFwibnVsbGluZ1wiIG9mIHRoZSByb2xlIGlmIHRoZSB1c2VyIHJlYWxseSBkb2Vzbid0IHdhbnQgb25lXG5cblxuICAgIGlmIChlbGVtZW50UHJvcHMucm9sZSA9PT0gdW5kZWZpbmVkICYmIENvbXBvbmVudCAhPT0gJ25hdicpIHtcbiAgICAgIGVsZW1lbnRQcm9wcy5yb2xlID0gJ25hdmlnYXRpb24nO1xuICAgIH1cblxuICAgIGlmIChpbnZlcnNlKSB7XG4gICAgICBic1Byb3BzLmJzU3R5bGUgPSBfU3R5bGVDb25maWcuU3R5bGUuSU5WRVJTRTtcbiAgICB9XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoe30sICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpLCAoX2V4dGVuZHMyID0ge30sIF9leHRlbmRzMlsoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ2ZpeGVkLXRvcCcpXSA9IGZpeGVkVG9wLCBfZXh0ZW5kczJbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdmaXhlZC1ib3R0b20nKV0gPSBmaXhlZEJvdHRvbSwgX2V4dGVuZHMyWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnc3RhdGljLXRvcCcpXSA9IHN0YXRpY1RvcCwgX2V4dGVuZHMyKSk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBDb21wb25lbnQsXG4gICAgICAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICAgIH0pLFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIF9HcmlkMlsnZGVmYXVsdCddLFxuICAgICAgICB7IGZsdWlkOiBmbHVpZCB9LFxuICAgICAgICBjaGlsZHJlblxuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIE5hdmJhcjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbk5hdmJhci5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5OYXZiYXIuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuTmF2YmFyLmNoaWxkQ29udGV4dFR5cGVzID0gY2hpbGRDb250ZXh0VHlwZXM7XG5cbigwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ25hdmJhcicsIE5hdmJhcik7XG5cbnZhciBVbmNvbnRyb2xsYWJsZU5hdmJhciA9ICgwLCBfdW5jb250cm9sbGFibGUyWydkZWZhdWx0J10pKE5hdmJhciwgeyBleHBhbmRlZDogJ29uVG9nZ2xlJyB9KTtcblxuZnVuY3Rpb24gY3JlYXRlU2ltcGxlV3JhcHBlcih0YWcsIHN1ZmZpeCwgZGlzcGxheU5hbWUpIHtcbiAgdmFyIFdyYXBwZXIgPSBmdW5jdGlvbiBXcmFwcGVyKF9yZWYsIF9yZWYyKSB7XG4gICAgdmFyIF9yZWYyJCRic19uYXZiYXIgPSBfcmVmMi4kYnNfbmF2YmFyLFxuICAgICAgICBuYXZiYXJQcm9wcyA9IF9yZWYyJCRic19uYXZiYXIgPT09IHVuZGVmaW5lZCA/IHsgYnNDbGFzczogJ25hdmJhcicgfSA6IF9yZWYyJCRic19uYXZiYXI7XG4gICAgdmFyIENvbXBvbmVudCA9IF9yZWYuY29tcG9uZW50Q2xhc3MsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9yZWYuY2xhc3NOYW1lLFxuICAgICAgICBwdWxsUmlnaHQgPSBfcmVmLnB1bGxSaWdodCxcbiAgICAgICAgcHVsbExlZnQgPSBfcmVmLnB1bGxMZWZ0LFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9yZWYsIFsnY29tcG9uZW50Q2xhc3MnLCAnY2xhc3NOYW1lJywgJ3B1bGxSaWdodCcsICdwdWxsTGVmdCddKTtcbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCBwcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKG5hdmJhclByb3BzLCBzdWZmaXgpLCBwdWxsUmlnaHQgJiYgKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKG5hdmJhclByb3BzLCAncmlnaHQnKSwgcHVsbExlZnQgJiYgKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKG5hdmJhclByb3BzLCAnbGVmdCcpKVxuICAgIH0pKTtcbiAgfTtcblxuICBXcmFwcGVyLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG5cbiAgV3JhcHBlci5wcm9wVHlwZXMgPSB7XG4gICAgY29tcG9uZW50Q2xhc3M6IF9lbGVtZW50VHlwZTJbJ2RlZmF1bHQnXSxcbiAgICBwdWxsUmlnaHQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgICBwdWxsTGVmdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sXG4gIH07XG5cbiAgV3JhcHBlci5kZWZhdWx0UHJvcHMgPSB7XG4gICAgY29tcG9uZW50Q2xhc3M6IHRhZyxcbiAgICBwdWxsUmlnaHQ6IGZhbHNlLFxuICAgIHB1bGxMZWZ0OiBmYWxzZVxuICB9O1xuXG4gIFdyYXBwZXIuY29udGV4dFR5cGVzID0ge1xuICAgICRic19uYXZiYXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc2hhcGUoe1xuICAgICAgYnNDbGFzczogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmdcbiAgICB9KVxuICB9O1xuXG4gIHJldHVybiBXcmFwcGVyO1xufVxuXG5VbmNvbnRyb2xsYWJsZU5hdmJhci5CcmFuZCA9IF9OYXZiYXJCcmFuZDJbJ2RlZmF1bHQnXTtcblVuY29udHJvbGxhYmxlTmF2YmFyLkhlYWRlciA9IF9OYXZiYXJIZWFkZXIyWydkZWZhdWx0J107XG5VbmNvbnRyb2xsYWJsZU5hdmJhci5Ub2dnbGUgPSBfTmF2YmFyVG9nZ2xlMlsnZGVmYXVsdCddO1xuVW5jb250cm9sbGFibGVOYXZiYXIuQ29sbGFwc2UgPSBfTmF2YmFyQ29sbGFwc2UyWydkZWZhdWx0J107XG5cblVuY29udHJvbGxhYmxlTmF2YmFyLkZvcm0gPSBjcmVhdGVTaW1wbGVXcmFwcGVyKCdkaXYnLCAnZm9ybScsICdOYXZiYXJGb3JtJyk7XG5VbmNvbnRyb2xsYWJsZU5hdmJhci5UZXh0ID0gY3JlYXRlU2ltcGxlV3JhcHBlcigncCcsICd0ZXh0JywgJ05hdmJhclRleHQnKTtcblVuY29udHJvbGxhYmxlTmF2YmFyLkxpbmsgPSBjcmVhdGVTaW1wbGVXcmFwcGVyKCdhJywgJ2xpbmsnLCAnTmF2YmFyTGluaycpO1xuXG4vLyBTZXQgYnNTdHlsZXMgaGVyZSBzbyB0aGV5IGNhbiBiZSBvdmVycmlkZGVuLlxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic1N0eWxlcykoW19TdHlsZUNvbmZpZy5TdHlsZS5ERUZBVUxULCBfU3R5bGVDb25maWcuU3R5bGUuSU5WRVJTRV0sIF9TdHlsZUNvbmZpZy5TdHlsZS5ERUZBVUxULCBVbmNvbnRyb2xsYWJsZU5hdmJhcik7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIGNvbnRleHRUeXBlcyA9IHtcbiAgJGJzX25hdmJhcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zaGFwZSh7XG4gICAgYnNDbGFzczogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmdcbiAgfSlcbn07XG5cbnZhciBOYXZiYXJCcmFuZCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKE5hdmJhckJyYW5kLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBOYXZiYXJCcmFuZCgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBOYXZiYXJCcmFuZCk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIE5hdmJhckJyYW5kLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjbGFzc05hbWUnLCAnY2hpbGRyZW4nXSk7XG5cbiAgICB2YXIgbmF2YmFyUHJvcHMgPSB0aGlzLmNvbnRleHQuJGJzX25hdmJhciB8fCB7IGJzQ2xhc3M6ICduYXZiYXInIH07XG5cbiAgICB2YXIgYnNDbGFzc05hbWUgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkobmF2YmFyUHJvcHMsICdicmFuZCcpO1xuXG4gICAgaWYgKF9yZWFjdDJbJ2RlZmF1bHQnXS5pc1ZhbGlkRWxlbWVudChjaGlsZHJlbikpIHtcbiAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY2xvbmVFbGVtZW50KGNoaWxkcmVuLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjaGlsZHJlbi5wcm9wcy5jbGFzc05hbWUsIGNsYXNzTmFtZSwgYnNDbGFzc05hbWUpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnc3BhbicsXG4gICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBwcm9wcywgeyBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBic0NsYXNzTmFtZSkgfSksXG4gICAgICBjaGlsZHJlblxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIE5hdmJhckJyYW5kO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuTmF2YmFyQnJhbmQuY29udGV4dFR5cGVzID0gY29udGV4dFR5cGVzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBOYXZiYXJCcmFuZDtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX0NvbGxhcHNlID0gcmVxdWlyZSgnLi9Db2xsYXBzZScpO1xuXG52YXIgX0NvbGxhcHNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NvbGxhcHNlKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgY29udGV4dFR5cGVzID0ge1xuICAkYnNfbmF2YmFyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnNoYXBlKHtcbiAgICBic0NsYXNzOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcbiAgICBleHBhbmRlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sXG4gIH0pXG59O1xuXG52YXIgTmF2YmFyQ29sbGFwc2UgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShOYXZiYXJDb2xsYXBzZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gTmF2YmFyQ29sbGFwc2UoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgTmF2YmFyQ29sbGFwc2UpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBOYXZiYXJDb2xsYXBzZS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY2hpbGRyZW4nXSk7XG5cbiAgICB2YXIgbmF2YmFyUHJvcHMgPSB0aGlzLmNvbnRleHQuJGJzX25hdmJhciB8fCB7IGJzQ2xhc3M6ICduYXZiYXInIH07XG5cbiAgICB2YXIgYnNDbGFzc05hbWUgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkobmF2YmFyUHJvcHMsICdjb2xsYXBzZScpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgX0NvbGxhcHNlMlsnZGVmYXVsdCddLFxuICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7ICdpbic6IG5hdmJhclByb3BzLmV4cGFuZGVkIH0sIHByb3BzKSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgeyBjbGFzc05hbWU6IGJzQ2xhc3NOYW1lIH0sXG4gICAgICAgIGNoaWxkcmVuXG4gICAgICApXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gTmF2YmFyQ29sbGFwc2U7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5OYXZiYXJDb2xsYXBzZS5jb250ZXh0VHlwZXMgPSBjb250ZXh0VHlwZXM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IE5hdmJhckNvbGxhcHNlO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBjb250ZXh0VHlwZXMgPSB7XG4gICRic19uYXZiYXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc2hhcGUoe1xuICAgIGJzQ2xhc3M6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nXG4gIH0pXG59O1xuXG52YXIgTmF2YmFySGVhZGVyID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoTmF2YmFySGVhZGVyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBOYXZiYXJIZWFkZXIoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgTmF2YmFySGVhZGVyKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgTmF2YmFySGVhZGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NsYXNzTmFtZSddKTtcblxuICAgIHZhciBuYXZiYXJQcm9wcyA9IHRoaXMuY29udGV4dC4kYnNfbmF2YmFyIHx8IHsgYnNDbGFzczogJ25hdmJhcicgfTtcblxuICAgIHZhciBic0NsYXNzTmFtZSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShuYXZiYXJQcm9wcywgJ2hlYWRlcicpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdkaXYnLCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBwcm9wcywgeyBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBic0NsYXNzTmFtZSkgfSkpO1xuICB9O1xuXG4gIHJldHVybiBOYXZiYXJIZWFkZXI7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5OYXZiYXJIZWFkZXIuY29udGV4dFR5cGVzID0gY29udGV4dFR5cGVzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBOYXZiYXJIZWFkZXI7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmVkRnVuY3Rpb24nKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBvbkNsaWNrOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIC8qKlxuICAgKiBUaGUgdG9nZ2xlIGNvbnRlbnQsIGlmIGxlZnQgZW1wdHkgaXQgd2lsbCByZW5kZXIgdGhlIGRlZmF1bHQgdG9nZ2xlIChzZWVuIGFib3ZlKS5cbiAgICovXG4gIGNoaWxkcmVuOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm5vZGVcbn07XG5cbnZhciBjb250ZXh0VHlwZXMgPSB7XG4gICRic19uYXZiYXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc2hhcGUoe1xuICAgIGJzQ2xhc3M6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICAgIGV4cGFuZGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gICAgb25Ub2dnbGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYy5pc1JlcXVpcmVkXG4gIH0pXG59O1xuXG52YXIgTmF2YmFyVG9nZ2xlID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoTmF2YmFyVG9nZ2xlLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBOYXZiYXJUb2dnbGUoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgTmF2YmFyVG9nZ2xlKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgTmF2YmFyVG9nZ2xlLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIG9uQ2xpY2sgPSBfcHJvcHMub25DbGljayxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ29uQ2xpY2snLCAnY2xhc3NOYW1lJywgJ2NoaWxkcmVuJ10pO1xuXG4gICAgdmFyIG5hdmJhclByb3BzID0gdGhpcy5jb250ZXh0LiRic19uYXZiYXIgfHwgeyBic0NsYXNzOiAnbmF2YmFyJyB9O1xuXG4gICAgdmFyIGJ1dHRvblByb3BzID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7XG4gICAgICB0eXBlOiAnYnV0dG9uJ1xuICAgIH0sIHByb3BzLCB7XG4gICAgICBvbkNsaWNrOiAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkob25DbGljaywgbmF2YmFyUHJvcHMub25Ub2dnbGUpLFxuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKG5hdmJhclByb3BzLCAndG9nZ2xlJyksICFuYXZiYXJQcm9wcy5leHBhbmRlZCAmJiAnY29sbGFwc2VkJylcbiAgICB9KTtcblxuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnYnV0dG9uJyxcbiAgICAgICAgYnV0dG9uUHJvcHMsXG4gICAgICAgIGNoaWxkcmVuXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICdidXR0b24nLFxuICAgICAgYnV0dG9uUHJvcHMsXG4gICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ3NwYW4nLFxuICAgICAgICB7IGNsYXNzTmFtZTogJ3NyLW9ubHknIH0sXG4gICAgICAgICdUb2dnbGUgbmF2aWdhdGlvbidcbiAgICAgICksXG4gICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnc3BhbicsIHsgY2xhc3NOYW1lOiAnaWNvbi1iYXInIH0pLFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nLCB7IGNsYXNzTmFtZTogJ2ljb24tYmFyJyB9KSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdzcGFuJywgeyBjbGFzc05hbWU6ICdpY29uLWJhcicgfSlcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBOYXZiYXJUb2dnbGU7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5OYXZiYXJUb2dnbGUucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuTmF2YmFyVG9nZ2xlLmNvbnRleHRUeXBlcyA9IGNvbnRleHRUeXBlcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gTmF2YmFyVG9nZ2xlO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX092ZXJsYXkgPSByZXF1aXJlKCdyZWFjdC1vdmVybGF5cy9saWIvT3ZlcmxheScpO1xuXG52YXIgX092ZXJsYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfT3ZlcmxheSk7XG5cbnZhciBfZWxlbWVudFR5cGUgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9lbGVtZW50VHlwZScpO1xuXG52YXIgX2VsZW1lbnRUeXBlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VsZW1lbnRUeXBlKTtcblxudmFyIF9GYWRlID0gcmVxdWlyZSgnLi9GYWRlJyk7XG5cbnZhciBfRmFkZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9GYWRlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgX092ZXJsYXkyWydkZWZhdWx0J10ucHJvcFR5cGVzLCB7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgT3ZlcmxheVxuICAgKi9cbiAgc2hvdzogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICAvKipcbiAgICogU3BlY2lmeSB3aGV0aGVyIHRoZSBvdmVybGF5IHNob3VsZCB0cmlnZ2VyIG9uSGlkZSB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvdXRzaWRlIHRoZSBvdmVybGF5XG4gICAqL1xuICByb290Q2xvc2U6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgaW52b2tlZCBieSB0aGUgb3ZlcmxheSB3aGVuIGl0IHdpc2hlcyB0byBiZSBoaWRkZW4uIFJlcXVpcmVkIGlmXG4gICAqIGByb290Q2xvc2VgIGlzIHNwZWNpZmllZC5cbiAgICovXG4gIG9uSGlkZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuXG4gIC8qKlxuICAgKiBVc2UgYW5pbWF0aW9uXG4gICAqL1xuICBhbmltYXRpb246IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2ZUeXBlKFtfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsIF9lbGVtZW50VHlwZTJbJ2RlZmF1bHQnXV0pLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBiZWZvcmUgdGhlIE92ZXJsYXkgdHJhbnNpdGlvbnMgaW5cbiAgICovXG4gIG9uRW50ZXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYXMgdGhlIE92ZXJsYXkgYmVnaW5zIHRvIHRyYW5zaXRpb24gaW5cbiAgICovXG4gIG9uRW50ZXJpbmc6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIE92ZXJsYXkgZmluaXNoZXMgdHJhbnNpdGlvbmluZyBpblxuICAgKi9cbiAgb25FbnRlcmVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIHJpZ2h0IGJlZm9yZSB0aGUgT3ZlcmxheSB0cmFuc2l0aW9ucyBvdXRcbiAgICovXG4gIG9uRXhpdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhcyB0aGUgT3ZlcmxheSBiZWdpbnMgdG8gdHJhbnNpdGlvbiBvdXRcbiAgICovXG4gIG9uRXhpdGluZzogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgT3ZlcmxheSBmaW5pc2hlcyB0cmFuc2l0aW9uaW5nIG91dFxuICAgKi9cbiAgb25FeGl0ZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogU2V0cyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBPdmVybGF5LlxuICAgKi9cbiAgcGxhY2VtZW50OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mKFsndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J10pXG59KTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgYW5pbWF0aW9uOiBfRmFkZTJbJ2RlZmF1bHQnXSxcbiAgcm9vdENsb3NlOiBmYWxzZSxcbiAgc2hvdzogZmFsc2UsXG4gIHBsYWNlbWVudDogJ3JpZ2h0J1xufTtcblxudmFyIE92ZXJsYXkgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShPdmVybGF5LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBPdmVybGF5KCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIE92ZXJsYXkpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBPdmVybGF5LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGFuaW1hdGlvbiA9IF9wcm9wcy5hbmltYXRpb24sXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydhbmltYXRpb24nLCAnY2hpbGRyZW4nXSk7XG5cblxuICAgIHZhciB0cmFuc2l0aW9uID0gYW5pbWF0aW9uID09PSB0cnVlID8gX0ZhZGUyWydkZWZhdWx0J10gOiBhbmltYXRpb24gfHwgbnVsbDtcblxuICAgIHZhciBjaGlsZCA9IHZvaWQgMDtcblxuICAgIGlmICghdHJhbnNpdGlvbikge1xuICAgICAgY2hpbGQgPSAoMCwgX3JlYWN0LmNsb25lRWxlbWVudCkoY2hpbGRyZW4sIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNoaWxkcmVuLnByb3BzLmNsYXNzTmFtZSwgJ2luJylcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGlsZCA9IGNoaWxkcmVuO1xuICAgIH1cblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgIF9PdmVybGF5MlsnZGVmYXVsdCddLFxuICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgcHJvcHMsIHtcbiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNpdGlvblxuICAgICAgfSksXG4gICAgICBjaGlsZFxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIE92ZXJsYXk7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5PdmVybGF5LnByb3BUeXBlcyA9IHByb3BUeXBlcztcbk92ZXJsYXkuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBPdmVybGF5O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfY29udGFpbnMgPSByZXF1aXJlKCdkb20taGVscGVycy9xdWVyeS9jb250YWlucycpO1xuXG52YXIgX2NvbnRhaW5zMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbnRhaW5zKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9yZWFjdERvbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuXG52YXIgX3JlYWN0RG9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0RG9tKTtcblxudmFyIF93YXJuaW5nID0gcmVxdWlyZSgnd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbnZhciBfT3ZlcmxheSA9IHJlcXVpcmUoJy4vT3ZlcmxheScpO1xuXG52YXIgX092ZXJsYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfT3ZlcmxheSk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmVkRnVuY3Rpb24nKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG4vKipcbiAqIENoZWNrIGlmIHZhbHVlIG9uZSBpcyBpbnNpZGUgb3IgZXF1YWwgdG8gdGhlIG9mIHZhbHVlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG9uZVxuICogQHBhcmFtIHtzdHJpbmd8YXJyYXl9IG9mXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNPbmVPZihvbmUsIG9mKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG9mKSkge1xuICAgIHJldHVybiBvZi5pbmRleE9mKG9uZSkgPj0gMDtcbiAgfVxuICByZXR1cm4gb25lID09PSBvZjtcbn1cblxudmFyIHRyaWdnZXJUeXBlID0gX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZihbJ2NsaWNrJywgJ2hvdmVyJywgJ2ZvY3VzJ10pO1xuXG52YXIgcHJvcFR5cGVzID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgX092ZXJsYXkyWydkZWZhdWx0J10ucHJvcFR5cGVzLCB7XG5cbiAgLyoqXG4gICogU3BlY2lmeSB3aGljaCBhY3Rpb24gb3IgYWN0aW9ucyB0cmlnZ2VyIE92ZXJsYXkgdmlzaWJpbGl0eVxuICAqL1xuICB0cmlnZ2VyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mVHlwZShbdHJpZ2dlclR5cGUsIF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYXJyYXlPZih0cmlnZ2VyVHlwZSldKSxcblxuICAvKipcbiAgICogQSBtaWxsaXNlY29uZCBkZWxheSBhbW91bnQgdG8gc2hvdyBhbmQgaGlkZSB0aGUgT3ZlcmxheSBvbmNlIHRyaWdnZXJlZFxuICAgKi9cbiAgZGVsYXk6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICAvKipcbiAgICogQSBtaWxsaXNlY29uZCBkZWxheSBhbW91bnQgYmVmb3JlIHNob3dpbmcgdGhlIE92ZXJsYXkgb25jZSB0cmlnZ2VyZWQuXG4gICAqL1xuICBkZWxheVNob3c6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICAvKipcbiAgICogQSBtaWxsaXNlY29uZCBkZWxheSBhbW91bnQgYmVmb3JlIGhpZGluZyB0aGUgT3ZlcmxheSBvbmNlIHRyaWdnZXJlZC5cbiAgICovXG4gIGRlbGF5SGlkZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsXG5cbiAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIGJlIGBkZWZhdWx0U2hvd2AuXG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCB2aXNpYmlsaXR5IHN0YXRlIG9mIHRoZSBPdmVybGF5LiBGb3IgbW9yZSBudWFuY2VkIHZpc2liaWxpdHlcbiAgICogY29udHJvbCwgY29uc2lkZXIgdXNpbmcgdGhlIE92ZXJsYXkgY29tcG9uZW50IGRpcmVjdGx5LlxuICAgKi9cbiAgZGVmYXVsdE92ZXJsYXlTaG93bjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBBbiBlbGVtZW50IG9yIHRleHQgdG8gb3ZlcmxheSBuZXh0IHRvIHRoZSB0YXJnZXQuXG4gICAqL1xuICBvdmVybGF5OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm5vZGUuaXNSZXF1aXJlZCxcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG9uQmx1cjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG9uQ2xpY2s6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBvbkZvY3VzOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25Nb3VzZU91dDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG9uTW91c2VPdmVyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLy8gT3ZlcnJpZGRlbiBwcm9wcyBmcm9tIGA8T3ZlcmxheT5gLlxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRhcmdldDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZihbbnVsbF0pLFxuICAvKipcbiAgKiBAcHJpdmF0ZVxuICAqL1xuICBvbkhpZGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2YoW251bGxdKSxcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzaG93OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mKFtudWxsXSlcbn0pO1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBkZWZhdWx0T3ZlcmxheVNob3duOiBmYWxzZSxcbiAgdHJpZ2dlcjogWydob3ZlcicsICdmb2N1cyddXG59O1xuXG52YXIgT3ZlcmxheVRyaWdnZXIgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShPdmVybGF5VHJpZ2dlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gT3ZlcmxheVRyaWdnZXIocHJvcHMsIGNvbnRleHQpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBPdmVybGF5VHJpZ2dlcik7XG5cbiAgICB2YXIgX3RoaXMgPSAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgX3RoaXMuaGFuZGxlVG9nZ2xlID0gX3RoaXMuaGFuZGxlVG9nZ2xlLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmhhbmRsZURlbGF5ZWRTaG93ID0gX3RoaXMuaGFuZGxlRGVsYXllZFNob3cuYmluZChfdGhpcyk7XG4gICAgX3RoaXMuaGFuZGxlRGVsYXllZEhpZGUgPSBfdGhpcy5oYW5kbGVEZWxheWVkSGlkZS5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5oYW5kbGVIaWRlID0gX3RoaXMuaGFuZGxlSGlkZS5iaW5kKF90aGlzKTtcblxuICAgIF90aGlzLmhhbmRsZU1vdXNlT3ZlciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICByZXR1cm4gX3RoaXMuaGFuZGxlTW91c2VPdmVyT3V0KF90aGlzLmhhbmRsZURlbGF5ZWRTaG93LCBlKTtcbiAgICB9O1xuICAgIF90aGlzLmhhbmRsZU1vdXNlT3V0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHJldHVybiBfdGhpcy5oYW5kbGVNb3VzZU92ZXJPdXQoX3RoaXMuaGFuZGxlRGVsYXllZEhpZGUsIGUpO1xuICAgIH07XG5cbiAgICBfdGhpcy5fbW91bnROb2RlID0gbnVsbDtcblxuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgc2hvdzogcHJvcHMuZGVmYXVsdE92ZXJsYXlTaG93blxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgT3ZlcmxheVRyaWdnZXIucHJvdG90eXBlLmNvbXBvbmVudERpZE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdGhpcy5fbW91bnROb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5yZW5kZXJPdmVybGF5KCk7XG4gIH07XG5cbiAgT3ZlcmxheVRyaWdnZXIucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICB0aGlzLnJlbmRlck92ZXJsYXkoKTtcbiAgfTtcblxuICBPdmVybGF5VHJpZ2dlci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICBfcmVhY3REb20yWydkZWZhdWx0J10udW5tb3VudENvbXBvbmVudEF0Tm9kZSh0aGlzLl9tb3VudE5vZGUpO1xuICAgIHRoaXMuX21vdW50Tm9kZSA9IG51bGw7XG5cbiAgICBjbGVhclRpbWVvdXQodGhpcy5faG92ZXJTaG93RGVsYXkpO1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl9ob3ZlckhpZGVEZWxheSk7XG4gIH07XG5cbiAgT3ZlcmxheVRyaWdnZXIucHJvdG90eXBlLmhhbmRsZVRvZ2dsZSA9IGZ1bmN0aW9uIGhhbmRsZVRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5zaG93KSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93KCk7XG4gICAgfVxuICB9O1xuXG4gIE92ZXJsYXlUcmlnZ2VyLnByb3RvdHlwZS5oYW5kbGVEZWxheWVkU2hvdyA9IGZ1bmN0aW9uIGhhbmRsZURlbGF5ZWRTaG93KCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMuX2hvdmVySGlkZURlbGF5ICE9IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9ob3ZlckhpZGVEZWxheSk7XG4gICAgICB0aGlzLl9ob3ZlckhpZGVEZWxheSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUuc2hvdyB8fCB0aGlzLl9ob3ZlclNob3dEZWxheSAhPSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGRlbGF5ID0gdGhpcy5wcm9wcy5kZWxheVNob3cgIT0gbnVsbCA/IHRoaXMucHJvcHMuZGVsYXlTaG93IDogdGhpcy5wcm9wcy5kZWxheTtcblxuICAgIGlmICghZGVsYXkpIHtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2hvdmVyU2hvd0RlbGF5ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpczIuX2hvdmVyU2hvd0RlbGF5ID0gbnVsbDtcbiAgICAgIF90aGlzMi5zaG93KCk7XG4gICAgfSwgZGVsYXkpO1xuICB9O1xuXG4gIE92ZXJsYXlUcmlnZ2VyLnByb3RvdHlwZS5oYW5kbGVEZWxheWVkSGlkZSA9IGZ1bmN0aW9uIGhhbmRsZURlbGF5ZWRIaWRlKCkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgaWYgKHRoaXMuX2hvdmVyU2hvd0RlbGF5ICE9IG51bGwpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9ob3ZlclNob3dEZWxheSk7XG4gICAgICB0aGlzLl9ob3ZlclNob3dEZWxheSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnN0YXRlLnNob3cgfHwgdGhpcy5faG92ZXJIaWRlRGVsYXkgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBkZWxheSA9IHRoaXMucHJvcHMuZGVsYXlIaWRlICE9IG51bGwgPyB0aGlzLnByb3BzLmRlbGF5SGlkZSA6IHRoaXMucHJvcHMuZGVsYXk7XG5cbiAgICBpZiAoIWRlbGF5KSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9ob3ZlckhpZGVEZWxheSA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMzLl9ob3ZlckhpZGVEZWxheSA9IG51bGw7XG4gICAgICBfdGhpczMuaGlkZSgpO1xuICAgIH0sIGRlbGF5KTtcbiAgfTtcblxuICAvLyBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgbW91c2VFbnRlciBhbmQgbW91c2VMZWF2ZS5cbiAgLy8gUmVhY3QncyBidWlsdCB2ZXJzaW9uIGlzIGJyb2tlbjogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy80MjUxXG4gIC8vIGZvciBjYXNlcyB3aGVuIHRoZSB0cmlnZ2VyIGlzIGRpc2FibGVkIGFuZCBtb3VzZU91dC9PdmVyIGNhbiBjYXVzZSBmbGlja2VyXG4gIC8vIG1vdmluZyBmcm9tIG9uZSBjaGlsZCBlbGVtZW50IHRvIGFub3RoZXIuXG5cblxuICBPdmVybGF5VHJpZ2dlci5wcm90b3R5cGUuaGFuZGxlTW91c2VPdmVyT3V0ID0gZnVuY3Rpb24gaGFuZGxlTW91c2VPdmVyT3V0KGhhbmRsZXIsIGUpIHtcbiAgICB2YXIgdGFyZ2V0ID0gZS5jdXJyZW50VGFyZ2V0O1xuICAgIHZhciByZWxhdGVkID0gZS5yZWxhdGVkVGFyZ2V0IHx8IGUubmF0aXZlRXZlbnQudG9FbGVtZW50O1xuXG4gICAgaWYgKCFyZWxhdGVkIHx8IHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhKDAsIF9jb250YWluczJbJ2RlZmF1bHQnXSkodGFyZ2V0LCByZWxhdGVkKSkge1xuICAgICAgaGFuZGxlcihlKTtcbiAgICB9XG4gIH07XG5cbiAgT3ZlcmxheVRyaWdnZXIucHJvdG90eXBlLmhhbmRsZUhpZGUgPSBmdW5jdGlvbiBoYW5kbGVIaWRlKCkge1xuICAgIHRoaXMuaGlkZSgpO1xuICB9O1xuXG4gIE92ZXJsYXlUcmlnZ2VyLnByb3RvdHlwZS5zaG93ID0gZnVuY3Rpb24gc2hvdygpIHtcbiAgICB0aGlzLnNldFN0YXRlKHsgc2hvdzogdHJ1ZSB9KTtcbiAgfTtcblxuICBPdmVybGF5VHJpZ2dlci5wcm90b3R5cGUuaGlkZSA9IGZ1bmN0aW9uIGhpZGUoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IHNob3c6IGZhbHNlIH0pO1xuICB9O1xuXG4gIE92ZXJsYXlUcmlnZ2VyLnByb3RvdHlwZS5tYWtlT3ZlcmxheSA9IGZ1bmN0aW9uIG1ha2VPdmVybGF5KG92ZXJsYXksIHByb3BzKSB7XG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgX092ZXJsYXkyWydkZWZhdWx0J10sXG4gICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBwcm9wcywge1xuICAgICAgICBzaG93OiB0aGlzLnN0YXRlLnNob3csXG4gICAgICAgIG9uSGlkZTogdGhpcy5oYW5kbGVIaWRlLFxuICAgICAgICB0YXJnZXQ6IHRoaXNcbiAgICAgIH0pLFxuICAgICAgb3ZlcmxheVxuICAgICk7XG4gIH07XG5cbiAgT3ZlcmxheVRyaWdnZXIucHJvdG90eXBlLnJlbmRlck92ZXJsYXkgPSBmdW5jdGlvbiByZW5kZXJPdmVybGF5KCkge1xuICAgIF9yZWFjdERvbTJbJ2RlZmF1bHQnXS51bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcih0aGlzLCB0aGlzLl9vdmVybGF5LCB0aGlzLl9tb3VudE5vZGUpO1xuICB9O1xuXG4gIE92ZXJsYXlUcmlnZ2VyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIHRyaWdnZXIgPSBfcHJvcHMudHJpZ2dlcixcbiAgICAgICAgb3ZlcmxheSA9IF9wcm9wcy5vdmVybGF5LFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgb25CbHVyID0gX3Byb3BzLm9uQmx1cixcbiAgICAgICAgb25DbGljayA9IF9wcm9wcy5vbkNsaWNrLFxuICAgICAgICBvbkZvY3VzID0gX3Byb3BzLm9uRm9jdXMsXG4gICAgICAgIG9uTW91c2VPdXQgPSBfcHJvcHMub25Nb3VzZU91dCxcbiAgICAgICAgb25Nb3VzZU92ZXIgPSBfcHJvcHMub25Nb3VzZU92ZXIsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ3RyaWdnZXInLCAnb3ZlcmxheScsICdjaGlsZHJlbicsICdvbkJsdXInLCAnb25DbGljaycsICdvbkZvY3VzJywgJ29uTW91c2VPdXQnLCAnb25Nb3VzZU92ZXInXSk7XG5cblxuICAgIGRlbGV0ZSBwcm9wcy5kZWxheTtcbiAgICBkZWxldGUgcHJvcHMuZGVsYXlTaG93O1xuICAgIGRlbGV0ZSBwcm9wcy5kZWxheUhpZGU7XG4gICAgZGVsZXRlIHByb3BzLmRlZmF1bHRPdmVybGF5U2hvd247XG5cbiAgICB2YXIgY2hpbGQgPSBfcmVhY3QyWydkZWZhdWx0J10uQ2hpbGRyZW4ub25seShjaGlsZHJlbik7XG4gICAgdmFyIGNoaWxkUHJvcHMgPSBjaGlsZC5wcm9wcztcbiAgICB2YXIgdHJpZ2dlclByb3BzID0ge307XG5cbiAgICBpZiAodGhpcy5zdGF0ZS5zaG93KSB7XG4gICAgICB0cmlnZ2VyUHJvcHNbJ2FyaWEtZGVzY3JpYmVkYnknXSA9IG92ZXJsYXkucHJvcHMuaWQ7XG4gICAgfVxuXG4gICAgLy8gRklYTUU6IFRoZSBsb2dpYyBoZXJlIGZvciBwYXNzaW5nIHRocm91Z2ggaGFuZGxlcnMgb24gdGhpcyBjb21wb25lbnQgaXNcbiAgICAvLyBpbmNvbnNpc3RlbnQuIFdlIHNob3VsZG4ndCBiZSBwYXNzaW5nIGFueSBvZiB0aGVzZSBwcm9wcyB0aHJvdWdoLlxuXG4gICAgdHJpZ2dlclByb3BzLm9uQ2xpY2sgPSAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkoY2hpbGRQcm9wcy5vbkNsaWNrLCBvbkNsaWNrKTtcblxuICAgIGlmIChpc09uZU9mKCdjbGljaycsIHRyaWdnZXIpKSB7XG4gICAgICB0cmlnZ2VyUHJvcHMub25DbGljayA9ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKSh0cmlnZ2VyUHJvcHMub25DbGljaywgdGhpcy5oYW5kbGVUb2dnbGUpO1xuICAgIH1cblxuICAgIGlmIChpc09uZU9mKCdob3ZlcicsIHRyaWdnZXIpKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gKDAsIF93YXJuaW5nMlsnZGVmYXVsdCddKSghKHRyaWdnZXIgPT09ICdob3ZlcicpLCAnW3JlYWN0LWJvb3RzdHJhcF0gU3BlY2lmeWluZyBvbmx5IHRoZSBgXCJob3ZlclwiYCB0cmlnZ2VyIGxpbWl0cyB0aGUgJyArICd2aXNpYmlsaXR5IG9mIHRoZSBvdmVybGF5IHRvIGp1c3QgbW91c2UgdXNlcnMuIENvbnNpZGVyIGFsc28gJyArICdpbmNsdWRpbmcgdGhlIGBcImZvY3VzXCJgIHRyaWdnZXIgc28gdGhhdCB0b3VjaCBhbmQga2V5Ym9hcmQgb25seSAnICsgJ3VzZXJzIGNhbiBzZWUgdGhlIG92ZXJsYXkgYXMgd2VsbC4nKSA6IHZvaWQgMDtcblxuICAgICAgdHJpZ2dlclByb3BzLm9uTW91c2VPdmVyID0gKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKGNoaWxkUHJvcHMub25Nb3VzZU92ZXIsIG9uTW91c2VPdmVyLCB0aGlzLmhhbmRsZU1vdXNlT3Zlcik7XG4gICAgICB0cmlnZ2VyUHJvcHMub25Nb3VzZU91dCA9ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKShjaGlsZFByb3BzLm9uTW91c2VPdXQsIG9uTW91c2VPdXQsIHRoaXMuaGFuZGxlTW91c2VPdXQpO1xuICAgIH1cblxuICAgIGlmIChpc09uZU9mKCdmb2N1cycsIHRyaWdnZXIpKSB7XG4gICAgICB0cmlnZ2VyUHJvcHMub25Gb2N1cyA9ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKShjaGlsZFByb3BzLm9uRm9jdXMsIG9uRm9jdXMsIHRoaXMuaGFuZGxlRGVsYXllZFNob3cpO1xuICAgICAgdHJpZ2dlclByb3BzLm9uQmx1ciA9ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKShjaGlsZFByb3BzLm9uQmx1ciwgb25CbHVyLCB0aGlzLmhhbmRsZURlbGF5ZWRIaWRlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9vdmVybGF5ID0gdGhpcy5tYWtlT3ZlcmxheShvdmVybGF5LCBwcm9wcyk7XG5cbiAgICByZXR1cm4gKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGNoaWxkLCB0cmlnZ2VyUHJvcHMpO1xuICB9O1xuXG4gIHJldHVybiBPdmVybGF5VHJpZ2dlcjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbk92ZXJsYXlUcmlnZ2VyLnByb3BUeXBlcyA9IHByb3BUeXBlcztcbk92ZXJsYXlUcmlnZ2VyLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gT3ZlcmxheVRyaWdnZXI7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgUGFnZUhlYWRlciA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKFBhZ2VIZWFkZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFBhZ2VIZWFkZXIoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgUGFnZUhlYWRlcik7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIFBhZ2VIZWFkZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2NsYXNzTmFtZScsICdjaGlsZHJlbiddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHMpKHByb3BzKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNbMV07XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2RpdicsXG4gICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICAgIH0pLFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdoMScsXG4gICAgICAgIG51bGwsXG4gICAgICAgIGNoaWxkcmVuXG4gICAgICApXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gUGFnZUhlYWRlcjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ3BhZ2UtaGVhZGVyJywgUGFnZUhlYWRlcik7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfUGFnZXJJdGVtID0gcmVxdWlyZSgnLi9QYWdlckl0ZW0nKTtcblxudmFyIF9QYWdlckl0ZW0yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUGFnZXJJdGVtKTtcblxudmFyIF9kZXByZWNhdGlvbldhcm5pbmcgPSByZXF1aXJlKCcuL3V0aWxzL2RlcHJlY2F0aW9uV2FybmluZycpO1xuXG52YXIgX2RlcHJlY2F0aW9uV2FybmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZXByZWNhdGlvbldhcm5pbmcpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IF9kZXByZWNhdGlvbldhcm5pbmcyWydkZWZhdWx0J10ud3JhcHBlcihfUGFnZXJJdGVtMlsnZGVmYXVsdCddLCAnYDxQYWdlSXRlbT5gJywgJ2A8UGFnZXIuSXRlbT5gJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfUGFnZXJJdGVtID0gcmVxdWlyZSgnLi9QYWdlckl0ZW0nKTtcblxudmFyIF9QYWdlckl0ZW0yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUGFnZXJJdGVtKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24gPSByZXF1aXJlKCcuL3V0aWxzL2NyZWF0ZUNoYWluZWRGdW5jdGlvbicpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24pO1xuXG52YXIgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4gPSByZXF1aXJlKCcuL3V0aWxzL1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4nKTtcblxudmFyIF9WYWxpZENvbXBvbmVudENoaWxkcmVuMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIG9uU2VsZWN0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmNcbn07XG5cbnZhciBQYWdlciA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKFBhZ2VyLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBQYWdlcigpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBQYWdlcik7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIFBhZ2VyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIG9uU2VsZWN0ID0gX3Byb3BzLm9uU2VsZWN0LFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnb25TZWxlY3QnLCAnY2xhc3NOYW1lJywgJ2NoaWxkcmVuJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAndWwnLFxuICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgICB9KSxcbiAgICAgIF9WYWxpZENvbXBvbmVudENoaWxkcmVuMlsnZGVmYXVsdCddLm1hcChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiAoMCwgX3JlYWN0LmNsb25lRWxlbWVudCkoY2hpbGQsIHtcbiAgICAgICAgICBvblNlbGVjdDogKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKGNoaWxkLnByb3BzLm9uU2VsZWN0LCBvblNlbGVjdClcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFBhZ2VyO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuUGFnZXIucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuXG5QYWdlci5JdGVtID0gX1BhZ2VySXRlbTJbJ2RlZmF1bHQnXTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgncGFnZXInLCBQYWdlcik7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfU2FmZUFuY2hvciA9IHJlcXVpcmUoJy4vU2FmZUFuY2hvcicpO1xuXG52YXIgX1NhZmVBbmNob3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU2FmZUFuY2hvcik7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmVkRnVuY3Rpb24nKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBkaXNhYmxlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBwcmV2aW91czogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBuZXh0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIG9uQ2xpY2s6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgb25TZWxlY3Q6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgZXZlbnRLZXk6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYW55XG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBkaXNhYmxlZDogZmFsc2UsXG4gIHByZXZpb3VzOiBmYWxzZSxcbiAgbmV4dDogZmFsc2Vcbn07XG5cbnZhciBQYWdlckl0ZW0gPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShQYWdlckl0ZW0sIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFBhZ2VySXRlbShwcm9wcywgY29udGV4dCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIFBhZ2VySXRlbSk7XG5cbiAgICB2YXIgX3RoaXMgPSAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgX3RoaXMuaGFuZGxlU2VsZWN0ID0gX3RoaXMuaGFuZGxlU2VsZWN0LmJpbmQoX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFBhZ2VySXRlbS5wcm90b3R5cGUuaGFuZGxlU2VsZWN0ID0gZnVuY3Rpb24gaGFuZGxlU2VsZWN0KGUpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgZGlzYWJsZWQgPSBfcHJvcHMuZGlzYWJsZWQsXG4gICAgICAgIG9uU2VsZWN0ID0gX3Byb3BzLm9uU2VsZWN0LFxuICAgICAgICBldmVudEtleSA9IF9wcm9wcy5ldmVudEtleTtcblxuXG4gICAgaWYgKG9uU2VsZWN0IHx8IGRpc2FibGVkKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKG9uU2VsZWN0KSB7XG4gICAgICBvblNlbGVjdChldmVudEtleSwgZSk7XG4gICAgfVxuICB9O1xuXG4gIFBhZ2VySXRlbS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgZGlzYWJsZWQgPSBfcHJvcHMyLmRpc2FibGVkLFxuICAgICAgICBwcmV2aW91cyA9IF9wcm9wczIucHJldmlvdXMsXG4gICAgICAgIG5leHQgPSBfcHJvcHMyLm5leHQsXG4gICAgICAgIG9uQ2xpY2sgPSBfcHJvcHMyLm9uQ2xpY2ssXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wczIuY2xhc3NOYW1lLFxuICAgICAgICBzdHlsZSA9IF9wcm9wczIuc3R5bGUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzMiwgWydkaXNhYmxlZCcsICdwcmV2aW91cycsICduZXh0JywgJ29uQ2xpY2snLCAnY2xhc3NOYW1lJywgJ3N0eWxlJ10pO1xuXG5cbiAgICBkZWxldGUgcHJvcHMub25TZWxlY3Q7XG4gICAgZGVsZXRlIHByb3BzLmV2ZW50S2V5O1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2xpJyxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgeyBkaXNhYmxlZDogZGlzYWJsZWQsIHByZXZpb3VzOiBwcmV2aW91cywgbmV4dDogbmV4dCB9KSxcbiAgICAgICAgc3R5bGU6IHN0eWxlXG4gICAgICB9LFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX1NhZmVBbmNob3IyWydkZWZhdWx0J10sICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIHByb3BzLCB7XG4gICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgb25DbGljazogKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKG9uQ2xpY2ssIHRoaXMuaGFuZGxlU2VsZWN0KVxuICAgICAgfSkpXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gUGFnZXJJdGVtO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuUGFnZXJJdGVtLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblBhZ2VySXRlbS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IFBhZ2VySXRlbTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX1BhZ2luYXRpb25CdXR0b24gPSByZXF1aXJlKCcuL1BhZ2luYXRpb25CdXR0b24nKTtcblxudmFyIF9QYWdpbmF0aW9uQnV0dG9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1BhZ2luYXRpb25CdXR0b24pO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGFjdGl2ZVBhZ2U6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuICBpdGVtczogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsXG4gIG1heEJ1dHRvbnM6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLFxuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgd2lsbCBkaXNwbGF5IHRoZSBmaXJzdCBhbmQgdGhlIGxhc3QgYnV0dG9uIHBhZ2Ugd2hlblxuICAgKiBkaXNwbGF5aW5nIGVsbGlwc2lzLlxuICAgKi9cbiAgYm91bmRhcnlMaW5rczogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgd2lsbCBkaXNwbGF5IHRoZSBkZWZhdWx0IG5vZGUgdmFsdWUgKCcmaGVsbGlwOycpLlxuICAgKiBPdGhlcndpc2UsIHdpbGwgZGlzcGxheSBwcm92aWRlZCBub2RlICh3aGVuIHNwZWNpZmllZCkuXG4gICAqL1xuICBlbGxpcHNpczogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZlR5cGUoW19wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCwgX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ub2RlXSksXG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCB3aWxsIGRpc3BsYXkgdGhlIGRlZmF1bHQgbm9kZSB2YWx1ZSAoJyZsYXF1bzsnKS5cbiAgICogT3RoZXJ3aXNlLCB3aWxsIGRpc3BsYXkgcHJvdmlkZWQgbm9kZSAod2hlbiBzcGVjaWZpZWQpLlxuICAgKi9cbiAgZmlyc3Q6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2ZUeXBlKFtfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsIF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubm9kZV0pLFxuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgd2lsbCBkaXNwbGF5IHRoZSBkZWZhdWx0IG5vZGUgdmFsdWUgKCcmcmFxdW87JykuXG4gICAqIE90aGVyd2lzZSwgd2lsbCBkaXNwbGF5IHByb3ZpZGVkIG5vZGUgKHdoZW4gc3BlY2lmaWVkKS5cbiAgICovXG4gIGxhc3Q6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2ZUeXBlKFtfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsIF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubm9kZV0pLFxuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgd2lsbCBkaXNwbGF5IHRoZSBkZWZhdWx0IG5vZGUgdmFsdWUgKCcmbHNhcXVvOycpLlxuICAgKiBPdGhlcndpc2UsIHdpbGwgZGlzcGxheSBwcm92aWRlZCBub2RlICh3aGVuIHNwZWNpZmllZCkuXG4gICAqL1xuICBwcmV2OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mVHlwZShbX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLCBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm5vZGVdKSxcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHdpbGwgZGlzcGxheSB0aGUgZGVmYXVsdCBub2RlIHZhbHVlICgnJnJzYXF1bzsnKS5cbiAgICogT3RoZXJ3aXNlLCB3aWxsIGRpc3BsYXkgcHJvdmlkZWQgbm9kZSAod2hlbiBzcGVjaWZpZWQpLlxuICAgKi9cbiAgbmV4dDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZlR5cGUoW19wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCwgX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ub2RlXSksXG5cbiAgb25TZWxlY3Q6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogWW91IGNhbiB1c2UgYSBjdXN0b20gZWxlbWVudCBmb3IgdGhlIGJ1dHRvbnNcbiAgICovXG4gIGJ1dHRvbkNvbXBvbmVudENsYXNzOiBfZWxlbWVudFR5cGUyWydkZWZhdWx0J11cbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGFjdGl2ZVBhZ2U6IDEsXG4gIGl0ZW1zOiAxLFxuICBtYXhCdXR0b25zOiAwLFxuICBmaXJzdDogZmFsc2UsXG4gIGxhc3Q6IGZhbHNlLFxuICBwcmV2OiBmYWxzZSxcbiAgbmV4dDogZmFsc2UsXG4gIGVsbGlwc2lzOiB0cnVlLFxuICBib3VuZGFyeUxpbmtzOiBmYWxzZVxufTtcblxudmFyIFBhZ2luYXRpb24gPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShQYWdpbmF0aW9uLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBQYWdpbmF0aW9uKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIFBhZ2luYXRpb24pO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBQYWdpbmF0aW9uLnByb3RvdHlwZS5yZW5kZXJQYWdlQnV0dG9ucyA9IGZ1bmN0aW9uIHJlbmRlclBhZ2VCdXR0b25zKGFjdGl2ZVBhZ2UsIGl0ZW1zLCBtYXhCdXR0b25zLCBib3VuZGFyeUxpbmtzLCBlbGxpcHNpcywgYnV0dG9uUHJvcHMpIHtcbiAgICB2YXIgcGFnZUJ1dHRvbnMgPSBbXTtcblxuICAgIHZhciBzdGFydFBhZ2UgPSB2b2lkIDA7XG4gICAgdmFyIGVuZFBhZ2UgPSB2b2lkIDA7XG5cbiAgICBpZiAobWF4QnV0dG9ucyAmJiBtYXhCdXR0b25zIDwgaXRlbXMpIHtcbiAgICAgIHN0YXJ0UGFnZSA9IE1hdGgubWF4KE1hdGgubWluKGFjdGl2ZVBhZ2UgLSBNYXRoLmZsb29yKG1heEJ1dHRvbnMgLyAyLCAxMCksIGl0ZW1zIC0gbWF4QnV0dG9ucyArIDEpLCAxKTtcbiAgICAgIGVuZFBhZ2UgPSBzdGFydFBhZ2UgKyBtYXhCdXR0b25zIC0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhcnRQYWdlID0gMTtcbiAgICAgIGVuZFBhZ2UgPSBpdGVtcztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBwYWdlID0gc3RhcnRQYWdlOyBwYWdlIDw9IGVuZFBhZ2U7ICsrcGFnZSkge1xuICAgICAgcGFnZUJ1dHRvbnMucHVzaChfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgX1BhZ2luYXRpb25CdXR0b24yWydkZWZhdWx0J10sXG4gICAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGJ1dHRvblByb3BzLCB7XG4gICAgICAgICAga2V5OiBwYWdlLFxuICAgICAgICAgIGV2ZW50S2V5OiBwYWdlLFxuICAgICAgICAgIGFjdGl2ZTogcGFnZSA9PT0gYWN0aXZlUGFnZVxuICAgICAgICB9KSxcbiAgICAgICAgcGFnZVxuICAgICAgKSk7XG4gICAgfVxuXG4gICAgaWYgKGVsbGlwc2lzICYmIGJvdW5kYXJ5TGlua3MgJiYgc3RhcnRQYWdlID4gMSkge1xuICAgICAgaWYgKHN0YXJ0UGFnZSA+IDIpIHtcbiAgICAgICAgcGFnZUJ1dHRvbnMudW5zaGlmdChfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICBfUGFnaW5hdGlvbkJ1dHRvbjJbJ2RlZmF1bHQnXSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6ICdlbGxpcHNpc0ZpcnN0JyxcbiAgICAgICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICAgICAgY29tcG9uZW50Q2xhc3M6IGJ1dHRvblByb3BzLmNvbXBvbmVudENsYXNzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICdzcGFuJyxcbiAgICAgICAgICAgIHsgJ2FyaWEtbGFiZWwnOiAnTW9yZScgfSxcbiAgICAgICAgICAgIGVsbGlwc2lzID09PSB0cnVlID8gJ1xcdTIwMjYnIDogZWxsaXBzaXNcbiAgICAgICAgICApXG4gICAgICAgICkpO1xuICAgICAgfVxuXG4gICAgICBwYWdlQnV0dG9ucy51bnNoaWZ0KF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICBfUGFnaW5hdGlvbkJ1dHRvbjJbJ2RlZmF1bHQnXSxcbiAgICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgYnV0dG9uUHJvcHMsIHtcbiAgICAgICAgICBrZXk6IDEsXG4gICAgICAgICAgZXZlbnRLZXk6IDEsXG4gICAgICAgICAgYWN0aXZlOiBmYWxzZVxuICAgICAgICB9KSxcbiAgICAgICAgJzEnXG4gICAgICApKTtcbiAgICB9XG5cbiAgICBpZiAoZWxsaXBzaXMgJiYgZW5kUGFnZSA8IGl0ZW1zKSB7XG4gICAgICBpZiAoIWJvdW5kYXJ5TGlua3MgfHwgZW5kUGFnZSA8IGl0ZW1zIC0gMSkge1xuICAgICAgICBwYWdlQnV0dG9ucy5wdXNoKF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgIF9QYWdpbmF0aW9uQnV0dG9uMlsnZGVmYXVsdCddLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGtleTogJ2VsbGlwc2lzJyxcbiAgICAgICAgICAgIGRpc2FibGVkOiB0cnVlLFxuICAgICAgICAgICAgY29tcG9uZW50Q2xhc3M6IGJ1dHRvblByb3BzLmNvbXBvbmVudENsYXNzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICdzcGFuJyxcbiAgICAgICAgICAgIHsgJ2FyaWEtbGFiZWwnOiAnTW9yZScgfSxcbiAgICAgICAgICAgIGVsbGlwc2lzID09PSB0cnVlID8gJ1xcdTIwMjYnIDogZWxsaXBzaXNcbiAgICAgICAgICApXG4gICAgICAgICkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYm91bmRhcnlMaW5rcykge1xuICAgICAgICBwYWdlQnV0dG9ucy5wdXNoKF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgIF9QYWdpbmF0aW9uQnV0dG9uMlsnZGVmYXVsdCddLFxuICAgICAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGJ1dHRvblByb3BzLCB7XG4gICAgICAgICAgICBrZXk6IGl0ZW1zLFxuICAgICAgICAgICAgZXZlbnRLZXk6IGl0ZW1zLFxuICAgICAgICAgICAgYWN0aXZlOiBmYWxzZVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGl0ZW1zXG4gICAgICAgICkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYWdlQnV0dG9ucztcbiAgfTtcblxuICBQYWdpbmF0aW9uLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGFjdGl2ZVBhZ2UgPSBfcHJvcHMuYWN0aXZlUGFnZSxcbiAgICAgICAgaXRlbXMgPSBfcHJvcHMuaXRlbXMsXG4gICAgICAgIG1heEJ1dHRvbnMgPSBfcHJvcHMubWF4QnV0dG9ucyxcbiAgICAgICAgYm91bmRhcnlMaW5rcyA9IF9wcm9wcy5ib3VuZGFyeUxpbmtzLFxuICAgICAgICBlbGxpcHNpcyA9IF9wcm9wcy5lbGxpcHNpcyxcbiAgICAgICAgZmlyc3QgPSBfcHJvcHMuZmlyc3QsXG4gICAgICAgIGxhc3QgPSBfcHJvcHMubGFzdCxcbiAgICAgICAgcHJldiA9IF9wcm9wcy5wcmV2LFxuICAgICAgICBuZXh0ID0gX3Byb3BzLm5leHQsXG4gICAgICAgIG9uU2VsZWN0ID0gX3Byb3BzLm9uU2VsZWN0LFxuICAgICAgICBidXR0b25Db21wb25lbnRDbGFzcyA9IF9wcm9wcy5idXR0b25Db21wb25lbnRDbGFzcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnYWN0aXZlUGFnZScsICdpdGVtcycsICdtYXhCdXR0b25zJywgJ2JvdW5kYXJ5TGlua3MnLCAnZWxsaXBzaXMnLCAnZmlyc3QnLCAnbGFzdCcsICdwcmV2JywgJ25leHQnLCAnb25TZWxlY3QnLCAnYnV0dG9uQ29tcG9uZW50Q2xhc3MnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG5cbiAgICB2YXIgYnV0dG9uUHJvcHMgPSB7XG4gICAgICBvblNlbGVjdDogb25TZWxlY3QsXG4gICAgICBjb21wb25lbnRDbGFzczogYnV0dG9uQ29tcG9uZW50Q2xhc3NcbiAgICB9O1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ3VsJyxcbiAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgICAgfSksXG4gICAgICBmaXJzdCAmJiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgX1BhZ2luYXRpb25CdXR0b24yWydkZWZhdWx0J10sXG4gICAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGJ1dHRvblByb3BzLCB7XG4gICAgICAgICAgZXZlbnRLZXk6IDEsXG4gICAgICAgICAgZGlzYWJsZWQ6IGFjdGl2ZVBhZ2UgPT09IDFcbiAgICAgICAgfSksXG4gICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICdzcGFuJyxcbiAgICAgICAgICB7ICdhcmlhLWxhYmVsJzogJ0ZpcnN0JyB9LFxuICAgICAgICAgIGZpcnN0ID09PSB0cnVlID8gJ1xceEFCJyA6IGZpcnN0XG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBwcmV2ICYmIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICBfUGFnaW5hdGlvbkJ1dHRvbjJbJ2RlZmF1bHQnXSxcbiAgICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgYnV0dG9uUHJvcHMsIHtcbiAgICAgICAgICBldmVudEtleTogYWN0aXZlUGFnZSAtIDEsXG4gICAgICAgICAgZGlzYWJsZWQ6IGFjdGl2ZVBhZ2UgPT09IDFcbiAgICAgICAgfSksXG4gICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICdzcGFuJyxcbiAgICAgICAgICB7ICdhcmlhLWxhYmVsJzogJ1ByZXZpb3VzJyB9LFxuICAgICAgICAgIHByZXYgPT09IHRydWUgPyAnXFx1MjAzOScgOiBwcmV2XG4gICAgICAgIClcbiAgICAgICksXG4gICAgICB0aGlzLnJlbmRlclBhZ2VCdXR0b25zKGFjdGl2ZVBhZ2UsIGl0ZW1zLCBtYXhCdXR0b25zLCBib3VuZGFyeUxpbmtzLCBlbGxpcHNpcywgYnV0dG9uUHJvcHMpLFxuICAgICAgbmV4dCAmJiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgX1BhZ2luYXRpb25CdXR0b24yWydkZWZhdWx0J10sXG4gICAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGJ1dHRvblByb3BzLCB7XG4gICAgICAgICAgZXZlbnRLZXk6IGFjdGl2ZVBhZ2UgKyAxLFxuICAgICAgICAgIGRpc2FibGVkOiBhY3RpdmVQYWdlID49IGl0ZW1zXG4gICAgICAgIH0pLFxuICAgICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAnc3BhbicsXG4gICAgICAgICAgeyAnYXJpYS1sYWJlbCc6ICdOZXh0JyB9LFxuICAgICAgICAgIG5leHQgPT09IHRydWUgPyAnXFx1MjAzQScgOiBuZXh0XG4gICAgICAgIClcbiAgICAgICksXG4gICAgICBsYXN0ICYmIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICBfUGFnaW5hdGlvbkJ1dHRvbjJbJ2RlZmF1bHQnXSxcbiAgICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgYnV0dG9uUHJvcHMsIHtcbiAgICAgICAgICBldmVudEtleTogaXRlbXMsXG4gICAgICAgICAgZGlzYWJsZWQ6IGFjdGl2ZVBhZ2UgPj0gaXRlbXNcbiAgICAgICAgfSksXG4gICAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICdzcGFuJyxcbiAgICAgICAgICB7ICdhcmlhLWxhYmVsJzogJ0xhc3QnIH0sXG4gICAgICAgICAgbGFzdCA9PT0gdHJ1ZSA/ICdcXHhCQicgOiBsYXN0XG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBQYWdpbmF0aW9uO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuUGFnaW5hdGlvbi5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5QYWdpbmF0aW9uLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgncGFnaW5hdGlvbicsIFBhZ2luYXRpb24pO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2VsZW1lbnRUeXBlID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvZWxlbWVudFR5cGUnKTtcblxudmFyIF9lbGVtZW50VHlwZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbGVtZW50VHlwZSk7XG5cbnZhciBfU2FmZUFuY2hvciA9IHJlcXVpcmUoJy4vU2FmZUFuY2hvcicpO1xuXG52YXIgX1NhZmVBbmNob3IyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU2FmZUFuY2hvcik7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmVkRnVuY3Rpb24nKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG4vLyBUT0RPOiBUaGlzIHNob3VsZCBiZSBgPFBhZ2luYXRpb24uSXRlbT5gLlxuXG4vLyBUT0RPOiBUaGlzIHNob3VsZCB1c2UgYGNvbXBvbmVudENsYXNzYCBsaWtlIG90aGVyIGNvbXBvbmVudHMuXG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiBfZWxlbWVudFR5cGUyWydkZWZhdWx0J10sXG4gIGNsYXNzTmFtZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gIGV2ZW50S2V5OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmFueSxcbiAgb25TZWxlY3Q6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgZGlzYWJsZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgYWN0aXZlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIG9uQ2xpY2s6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuY1xufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6IF9TYWZlQW5jaG9yMlsnZGVmYXVsdCddLFxuICBhY3RpdmU6IGZhbHNlLFxuICBkaXNhYmxlZDogZmFsc2Vcbn07XG5cbnZhciBQYWdpbmF0aW9uQnV0dG9uID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoUGFnaW5hdGlvbkJ1dHRvbiwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUGFnaW5hdGlvbkJ1dHRvbihwcm9wcywgY29udGV4dCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIFBhZ2luYXRpb25CdXR0b24pO1xuXG4gICAgdmFyIF90aGlzID0gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgIF90aGlzLmhhbmRsZUNsaWNrID0gX3RoaXMuaGFuZGxlQ2xpY2suYmluZChfdGhpcyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgUGFnaW5hdGlvbkJ1dHRvbi5wcm90b3R5cGUuaGFuZGxlQ2xpY2sgPSBmdW5jdGlvbiBoYW5kbGVDbGljayhldmVudCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBkaXNhYmxlZCA9IF9wcm9wcy5kaXNhYmxlZCxcbiAgICAgICAgb25TZWxlY3QgPSBfcHJvcHMub25TZWxlY3QsXG4gICAgICAgIGV2ZW50S2V5ID0gX3Byb3BzLmV2ZW50S2V5O1xuXG5cbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob25TZWxlY3QpIHtcbiAgICAgIG9uU2VsZWN0KGV2ZW50S2V5LCBldmVudCk7XG4gICAgfVxuICB9O1xuXG4gIFBhZ2luYXRpb25CdXR0b24ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIENvbXBvbmVudCA9IF9wcm9wczIuY29tcG9uZW50Q2xhc3MsXG4gICAgICAgIGFjdGl2ZSA9IF9wcm9wczIuYWN0aXZlLFxuICAgICAgICBkaXNhYmxlZCA9IF9wcm9wczIuZGlzYWJsZWQsXG4gICAgICAgIG9uQ2xpY2sgPSBfcHJvcHMyLm9uQ2xpY2ssXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wczIuY2xhc3NOYW1lLFxuICAgICAgICBzdHlsZSA9IF9wcm9wczIuc3R5bGUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzMiwgWydjb21wb25lbnRDbGFzcycsICdhY3RpdmUnLCAnZGlzYWJsZWQnLCAnb25DbGljaycsICdjbGFzc05hbWUnLCAnc3R5bGUnXSk7XG5cblxuICAgIGlmIChDb21wb25lbnQgPT09IF9TYWZlQW5jaG9yMlsnZGVmYXVsdCddKSB7XG4gICAgICAvLyBBc3N1bWUgdGhhdCBjdXN0b20gY29tcG9uZW50cyB3YW50IGBldmVudEtleWAuXG4gICAgICBkZWxldGUgcHJvcHMuZXZlbnRLZXk7XG4gICAgfVxuXG4gICAgZGVsZXRlIHByb3BzLm9uU2VsZWN0O1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2xpJyxcbiAgICAgIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgeyBhY3RpdmU6IGFjdGl2ZSwgZGlzYWJsZWQ6IGRpc2FibGVkIH0pLFxuICAgICAgICBzdHlsZTogc3R5bGVcbiAgICAgIH0sXG4gICAgICBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChDb21wb25lbnQsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIHByb3BzLCB7XG4gICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZCxcbiAgICAgICAgb25DbGljazogKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKG9uQ2xpY2ssIHRoaXMuaGFuZGxlQ2xpY2spXG4gICAgICB9KSlcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBQYWdpbmF0aW9uQnV0dG9uO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuUGFnaW5hdGlvbkJ1dHRvbi5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5QYWdpbmF0aW9uQnV0dG9uLmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gUGFnaW5hdGlvbkJ1dHRvbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF92YWx1ZXMgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L3ZhbHVlcycpO1xuXG52YXIgX3ZhbHVlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF92YWx1ZXMpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfZXh0ZW5kczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX0NvbGxhcHNlID0gcmVxdWlyZSgnLi9Db2xsYXBzZScpO1xuXG52YXIgX0NvbGxhcHNlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NvbGxhcHNlKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxudmFyIF9TdHlsZUNvbmZpZyA9IHJlcXVpcmUoJy4vdXRpbHMvU3R5bGVDb25maWcnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG4vLyBUT0RPOiBVc2UgdW5jb250cm9sbGFibGUuXG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGNvbGxhcHNpYmxlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIG9uU2VsZWN0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIGhlYWRlcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ub2RlLFxuICBpZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZlR5cGUoW19wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLCBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcl0pLFxuICBmb290ZXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubm9kZSxcbiAgZGVmYXVsdEV4cGFuZGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIGV4cGFuZGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIGV2ZW50S2V5OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmFueSxcbiAgaGVhZGVyUm9sZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gIHBhbmVsUm9sZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG5cbiAgLy8gRnJvbSBDb2xsYXBzZS5cbiAgb25FbnRlcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICBvbkVudGVyaW5nOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIG9uRW50ZXJlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICBvbkV4aXQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgb25FeGl0aW5nOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIG9uRXhpdGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmNcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGRlZmF1bHRFeHBhbmRlZDogZmFsc2Vcbn07XG5cbnZhciBQYW5lbCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKFBhbmVsLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBQYW5lbChwcm9wcywgY29udGV4dCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIFBhbmVsKTtcblxuICAgIHZhciBfdGhpcyA9ICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICBfdGhpcy5oYW5kbGVDbGlja1RpdGxlID0gX3RoaXMuaGFuZGxlQ2xpY2tUaXRsZS5iaW5kKF90aGlzKTtcblxuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgZXhwYW5kZWQ6IF90aGlzLnByb3BzLmRlZmF1bHRFeHBhbmRlZFxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgUGFuZWwucHJvdG90eXBlLmhhbmRsZUNsaWNrVGl0bGUgPSBmdW5jdGlvbiBoYW5kbGVDbGlja1RpdGxlKGUpIHtcbiAgICAvLyBGSVhNRTogV2hhdCB0aGUgaGVjaz8gVGhpcyBBUEkgaXMgaG9ycmlibGUuIFRoaXMgbmVlZHMgdG8gZ28gYXdheSFcbiAgICBlLnBlcnNpc3QoKTtcbiAgICBlLnNlbGVjdGVkID0gdHJ1ZTtcblxuICAgIGlmICh0aGlzLnByb3BzLm9uU2VsZWN0KSB7XG4gICAgICB0aGlzLnByb3BzLm9uU2VsZWN0KHRoaXMucHJvcHMuZXZlbnRLZXksIGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKGUuc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBleHBhbmRlZDogIXRoaXMuc3RhdGUuZXhwYW5kZWQgfSk7XG4gICAgfVxuICB9O1xuXG4gIFBhbmVsLnByb3RvdHlwZS5yZW5kZXJIZWFkZXIgPSBmdW5jdGlvbiByZW5kZXJIZWFkZXIoY29sbGFwc2libGUsIGhlYWRlciwgaWQsIHJvbGUsIGV4cGFuZGVkLCBic1Byb3BzKSB7XG4gICAgdmFyIHRpdGxlQ2xhc3NOYW1lID0gKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICd0aXRsZScpO1xuXG4gICAgaWYgKCFjb2xsYXBzaWJsZSkge1xuICAgICAgaWYgKCFfcmVhY3QyWydkZWZhdWx0J10uaXNWYWxpZEVsZW1lbnQoaGVhZGVyKSkge1xuICAgICAgICByZXR1cm4gaGVhZGVyO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGhlYWRlciwge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoaGVhZGVyLnByb3BzLmNsYXNzTmFtZSwgdGl0bGVDbGFzc05hbWUpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoIV9yZWFjdDJbJ2RlZmF1bHQnXS5pc1ZhbGlkRWxlbWVudChoZWFkZXIpKSB7XG4gICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdoNCcsXG4gICAgICAgIHsgcm9sZTogJ3ByZXNlbnRhdGlvbicsIGNsYXNzTmFtZTogdGl0bGVDbGFzc05hbWUgfSxcbiAgICAgICAgdGhpcy5yZW5kZXJBbmNob3IoaGVhZGVyLCBpZCwgcm9sZSwgZXhwYW5kZWQpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiAoMCwgX3JlYWN0LmNsb25lRWxlbWVudCkoaGVhZGVyLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoaGVhZGVyLnByb3BzLmNsYXNzTmFtZSwgdGl0bGVDbGFzc05hbWUpLFxuICAgICAgY2hpbGRyZW46IHRoaXMucmVuZGVyQW5jaG9yKGhlYWRlci5wcm9wcy5jaGlsZHJlbiwgaWQsIHJvbGUsIGV4cGFuZGVkKVxuICAgIH0pO1xuICB9O1xuXG4gIFBhbmVsLnByb3RvdHlwZS5yZW5kZXJBbmNob3IgPSBmdW5jdGlvbiByZW5kZXJBbmNob3IoaGVhZGVyLCBpZCwgcm9sZSwgZXhwYW5kZWQpIHtcbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnYScsXG4gICAgICB7XG4gICAgICAgIHJvbGU6IHJvbGUsXG4gICAgICAgIGhyZWY6IGlkICYmICcjJyArIGlkLFxuICAgICAgICBvbkNsaWNrOiB0aGlzLmhhbmRsZUNsaWNrVGl0bGUsXG4gICAgICAgICdhcmlhLWNvbnRyb2xzJzogaWQsXG4gICAgICAgICdhcmlhLWV4cGFuZGVkJzogZXhwYW5kZWQsXG4gICAgICAgICdhcmlhLXNlbGVjdGVkJzogZXhwYW5kZWQsXG4gICAgICAgIGNsYXNzTmFtZTogZXhwYW5kZWQgPyBudWxsIDogJ2NvbGxhcHNlZCdcbiAgICAgIH0sXG4gICAgICBoZWFkZXJcbiAgICApO1xuICB9O1xuXG4gIFBhbmVsLnByb3RvdHlwZS5yZW5kZXJDb2xsYXBzaWJsZUJvZHkgPSBmdW5jdGlvbiByZW5kZXJDb2xsYXBzaWJsZUJvZHkoaWQsIGV4cGFuZGVkLCByb2xlLCBjaGlsZHJlbiwgYnNQcm9wcywgYW5pbWF0aW9uSG9va3MpIHtcbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBfQ29sbGFwc2UyWydkZWZhdWx0J10sXG4gICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHsgJ2luJzogZXhwYW5kZWQgfSwgYW5pbWF0aW9uSG9va3MpLFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgIHJvbGU6IHJvbGUsXG4gICAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ2NvbGxhcHNlJyksXG4gICAgICAgICAgJ2FyaWEtaGlkZGVuJzogIWV4cGFuZGVkXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMucmVuZGVyQm9keShjaGlsZHJlbiwgYnNQcm9wcylcbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIFBhbmVsLnByb3RvdHlwZS5yZW5kZXJCb2R5ID0gZnVuY3Rpb24gcmVuZGVyQm9keShyYXdDaGlsZHJlbiwgYnNQcm9wcykge1xuICAgIHZhciBjaGlsZHJlbiA9IFtdO1xuICAgIHZhciBib2R5Q2hpbGRyZW4gPSBbXTtcblxuICAgIHZhciBib2R5Q2xhc3NOYW1lID0gKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdib2R5Jyk7XG5cbiAgICBmdW5jdGlvbiBtYXliZUFkZEJvZHkoKSB7XG4gICAgICBpZiAoIWJvZHlDaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBEZXJpdmUgdGhlIGtleSBmcm9tIHRoZSBpbmRleCBoZXJlLCBzaW5jZSB3ZSBuZWVkIHRvIG1ha2Ugb25lIHVwLlxuICAgICAgY2hpbGRyZW4ucHVzaChfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHsga2V5OiBjaGlsZHJlbi5sZW5ndGgsIGNsYXNzTmFtZTogYm9keUNsYXNzTmFtZSB9LFxuICAgICAgICBib2R5Q2hpbGRyZW5cbiAgICAgICkpO1xuXG4gICAgICBib2R5Q2hpbGRyZW4gPSBbXTtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHRvIGFycmF5IHNvIHdlIGNhbiByZS11c2Uga2V5cy5cbiAgICBfcmVhY3QyWydkZWZhdWx0J10uQ2hpbGRyZW4udG9BcnJheShyYXdDaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgIGlmIChfcmVhY3QyWydkZWZhdWx0J10uaXNWYWxpZEVsZW1lbnQoY2hpbGQpICYmIGNoaWxkLnByb3BzLmZpbGwpIHtcbiAgICAgICAgbWF5YmVBZGRCb2R5KCk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBjaGlsZCdzIHVua25vd24gYGZpbGxgIHByb3AuXG4gICAgICAgIGNoaWxkcmVuLnB1c2goKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGNoaWxkLCB7IGZpbGw6IHVuZGVmaW5lZCB9KSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBib2R5Q2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgfSk7XG5cbiAgICBtYXliZUFkZEJvZHkoKTtcblxuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfTtcblxuICBQYW5lbC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjb2xsYXBzaWJsZSA9IF9wcm9wcy5jb2xsYXBzaWJsZSxcbiAgICAgICAgaGVhZGVyID0gX3Byb3BzLmhlYWRlcixcbiAgICAgICAgaWQgPSBfcHJvcHMuaWQsXG4gICAgICAgIGZvb3RlciA9IF9wcm9wcy5mb290ZXIsXG4gICAgICAgIHByb3BzRXhwYW5kZWQgPSBfcHJvcHMuZXhwYW5kZWQsXG4gICAgICAgIGhlYWRlclJvbGUgPSBfcHJvcHMuaGVhZGVyUm9sZSxcbiAgICAgICAgcGFuZWxSb2xlID0gX3Byb3BzLnBhbmVsUm9sZSxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIG9uRW50ZXIgPSBfcHJvcHMub25FbnRlcixcbiAgICAgICAgb25FbnRlcmluZyA9IF9wcm9wcy5vbkVudGVyaW5nLFxuICAgICAgICBvbkVudGVyZWQgPSBfcHJvcHMub25FbnRlcmVkLFxuICAgICAgICBvbkV4aXQgPSBfcHJvcHMub25FeGl0LFxuICAgICAgICBvbkV4aXRpbmcgPSBfcHJvcHMub25FeGl0aW5nLFxuICAgICAgICBvbkV4aXRlZCA9IF9wcm9wcy5vbkV4aXRlZCxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY29sbGFwc2libGUnLCAnaGVhZGVyJywgJ2lkJywgJ2Zvb3RlcicsICdleHBhbmRlZCcsICdoZWFkZXJSb2xlJywgJ3BhbmVsUm9sZScsICdjbGFzc05hbWUnLCAnY2hpbGRyZW4nLCAnb25FbnRlcicsICdvbkVudGVyaW5nJywgJ29uRW50ZXJlZCcsICdvbkV4aXQnLCAnb25FeGl0aW5nJywgJ29uRXhpdGVkJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHNBbmRPbWl0ID0gKDAsIF9ib290c3RyYXBVdGlscy5zcGxpdEJzUHJvcHNBbmRPbWl0KShwcm9wcywgWydkZWZhdWx0RXhwYW5kZWQnLCAnZXZlbnRLZXknLCAnb25TZWxlY3QnXSksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzQW5kT21pdFswXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc0FuZE9taXRbMV07XG5cbiAgICB2YXIgZXhwYW5kZWQgPSBwcm9wc0V4cGFuZGVkICE9IG51bGwgPyBwcm9wc0V4cGFuZGVkIDogdGhpcy5zdGF0ZS5leHBhbmRlZDtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnZGl2JyxcbiAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKSxcbiAgICAgICAgaWQ6IGNvbGxhcHNpYmxlID8gbnVsbCA6IGlkXG4gICAgICB9KSxcbiAgICAgIGhlYWRlciAmJiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHsgY2xhc3NOYW1lOiAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ2hlYWRpbmcnKSB9LFxuICAgICAgICB0aGlzLnJlbmRlckhlYWRlcihjb2xsYXBzaWJsZSwgaGVhZGVyLCBpZCwgaGVhZGVyUm9sZSwgZXhwYW5kZWQsIGJzUHJvcHMpXG4gICAgICApLFxuICAgICAgY29sbGFwc2libGUgPyB0aGlzLnJlbmRlckNvbGxhcHNpYmxlQm9keShpZCwgZXhwYW5kZWQsIHBhbmVsUm9sZSwgY2hpbGRyZW4sIGJzUHJvcHMsIHsgb25FbnRlcjogb25FbnRlciwgb25FbnRlcmluZzogb25FbnRlcmluZywgb25FbnRlcmVkOiBvbkVudGVyZWQsIG9uRXhpdDogb25FeGl0LCBvbkV4aXRpbmc6IG9uRXhpdGluZywgb25FeGl0ZWQ6IG9uRXhpdGVkIH0pIDogdGhpcy5yZW5kZXJCb2R5KGNoaWxkcmVuLCBic1Byb3BzKSxcbiAgICAgIGZvb3RlciAmJiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2RpdicsXG4gICAgICAgIHsgY2xhc3NOYW1lOiAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ2Zvb3RlcicpIH0sXG4gICAgICAgIGZvb3RlclxuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFBhbmVsO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuUGFuZWwucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuUGFuZWwuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdwYW5lbCcsICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNTdHlsZXMpKFtdLmNvbmNhdCgoMCwgX3ZhbHVlczJbJ2RlZmF1bHQnXSkoX1N0eWxlQ29uZmlnLlN0YXRlKSwgW19TdHlsZUNvbmZpZy5TdHlsZS5ERUZBVUxULCBfU3R5bGVDb25maWcuU3R5bGUuUFJJTUFSWV0pLCBfU3R5bGVDb25maWcuU3R5bGUuREVGQVVMVCwgUGFuZWwpKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9hc3NpZ24nKTtcblxudmFyIF9hc3NpZ24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXNzaWduKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbiA9IHJlcXVpcmUoJy4vdXRpbHMvY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluZWRGdW5jdGlvbik7XG5cbnZhciBfVmFsaWRDb21wb25lbnRDaGlsZHJlbiA9IHJlcXVpcmUoJy4vdXRpbHMvVmFsaWRDb21wb25lbnRDaGlsZHJlbicpO1xuXG52YXIgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVmFsaWRDb21wb25lbnRDaGlsZHJlbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgYWNjb3JkaW9uOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIGFjdGl2ZUtleTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5hbnksXG4gIGRlZmF1bHRBY3RpdmVLZXk6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYW55LFxuICBvblNlbGVjdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuICByb2xlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZ1xufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgYWNjb3JkaW9uOiBmYWxzZVxufTtcblxuLy8gVE9ETzogVXNlIHVuY29udHJvbGxhYmxlLlxuXG52YXIgUGFuZWxHcm91cCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKFBhbmVsR3JvdXAsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFBhbmVsR3JvdXAocHJvcHMsIGNvbnRleHQpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBQYW5lbEdyb3VwKTtcblxuICAgIHZhciBfdGhpcyA9ICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICBfdGhpcy5oYW5kbGVTZWxlY3QgPSBfdGhpcy5oYW5kbGVTZWxlY3QuYmluZChfdGhpcyk7XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGFjdGl2ZUtleTogcHJvcHMuZGVmYXVsdEFjdGl2ZUtleVxuICAgIH07XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgUGFuZWxHcm91cC5wcm90b3R5cGUuaGFuZGxlU2VsZWN0ID0gZnVuY3Rpb24gaGFuZGxlU2VsZWN0KGtleSwgZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmICh0aGlzLnByb3BzLm9uU2VsZWN0KSB7XG4gICAgICB0aGlzLnByb3BzLm9uU2VsZWN0KGtleSwgZSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUuYWN0aXZlS2V5ID09PSBrZXkpIHtcbiAgICAgIGtleSA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7IGFjdGl2ZUtleToga2V5IH0pO1xuICB9O1xuXG4gIFBhbmVsR3JvdXAucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBhY2NvcmRpb24gPSBfcHJvcHMuYWNjb3JkaW9uLFxuICAgICAgICBwcm9wc0FjdGl2ZUtleSA9IF9wcm9wcy5hY3RpdmVLZXksXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydhY2NvcmRpb24nLCAnYWN0aXZlS2V5JywgJ2NsYXNzTmFtZScsICdjaGlsZHJlbiddKTtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzQW5kT21pdCA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzQW5kT21pdCkocHJvcHMsIFsnZGVmYXVsdEFjdGl2ZUtleScsICdvblNlbGVjdCddKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNBbmRPbWl0WzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzQW5kT21pdFsxXTtcblxuICAgIHZhciBhY3RpdmVLZXkgPSB2b2lkIDA7XG4gICAgaWYgKGFjY29yZGlvbikge1xuICAgICAgYWN0aXZlS2V5ID0gcHJvcHNBY3RpdmVLZXkgIT0gbnVsbCA/IHByb3BzQWN0aXZlS2V5IDogdGhpcy5zdGF0ZS5hY3RpdmVLZXk7XG4gICAgICBlbGVtZW50UHJvcHMucm9sZSA9IGVsZW1lbnRQcm9wcy5yb2xlIHx8ICd0YWJsaXN0JztcbiAgICB9XG5cbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2RpdicsXG4gICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICAgIH0pLFxuICAgICAgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yWydkZWZhdWx0J10ubWFwKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgdmFyIGNoaWxkUHJvcHMgPSB7XG4gICAgICAgICAgYnNTdHlsZTogY2hpbGQucHJvcHMuYnNTdHlsZSB8fCBic1Byb3BzLmJzU3R5bGVcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoYWNjb3JkaW9uKSB7XG4gICAgICAgICAgKDAsIF9hc3NpZ24yWydkZWZhdWx0J10pKGNoaWxkUHJvcHMsIHtcbiAgICAgICAgICAgIGhlYWRlclJvbGU6ICd0YWInLFxuICAgICAgICAgICAgcGFuZWxSb2xlOiAndGFicGFuZWwnLFxuICAgICAgICAgICAgY29sbGFwc2libGU6IHRydWUsXG4gICAgICAgICAgICBleHBhbmRlZDogY2hpbGQucHJvcHMuZXZlbnRLZXkgPT09IGFjdGl2ZUtleSxcbiAgICAgICAgICAgIG9uU2VsZWN0OiAoMCwgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjJbJ2RlZmF1bHQnXSkoX3RoaXMyLmhhbmRsZVNlbGVjdCwgY2hpbGQucHJvcHMub25TZWxlY3QpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKDAsIF9yZWFjdC5jbG9uZUVsZW1lbnQpKGNoaWxkLCBjaGlsZFByb3BzKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gUGFuZWxHcm91cDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cblBhbmVsR3JvdXAucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuUGFuZWxHcm91cC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ3BhbmVsLWdyb3VwJywgUGFuZWxHcm91cCk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczMgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHM0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczMpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfaXNSZXF1aXJlZEZvckExMXkgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9pc1JlcXVpcmVkRm9yQTExeScpO1xuXG52YXIgX2lzUmVxdWlyZWRGb3JBMTF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2lzUmVxdWlyZWRGb3JBMTF5KTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQW4gaHRtbCBpZCBhdHRyaWJ1dGUsIG5lY2Vzc2FyeSBmb3IgYWNjZXNzaWJpbGl0eVxuICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgKiBAcmVxdWlyZWRcbiAgICovXG4gIGlkOiAoMCwgX2lzUmVxdWlyZWRGb3JBMTF5MlsnZGVmYXVsdCddKShfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mVHlwZShbX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsIF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyXSkpLFxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkaXJlY3Rpb24gdGhlIFBvcG92ZXIgaXMgcG9zaXRpb25lZCB0b3dhcmRzLlxuICAgKi9cbiAgcGxhY2VtZW50OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mKFsndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J10pLFxuXG4gIC8qKlxuICAgKiBUaGUgXCJ0b3BcIiBwb3NpdGlvbiB2YWx1ZSBmb3IgdGhlIFBvcG92ZXIuXG4gICAqL1xuICBwb3NpdGlvblRvcDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZlR5cGUoW19wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLCBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZ10pLFxuICAvKipcbiAgICogVGhlIFwibGVmdFwiIHBvc2l0aW9uIHZhbHVlIGZvciB0aGUgUG9wb3Zlci5cbiAgICovXG4gIHBvc2l0aW9uTGVmdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZlR5cGUoW19wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLCBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZ10pLFxuXG4gIC8qKlxuICAgKiBUaGUgXCJ0b3BcIiBwb3NpdGlvbiB2YWx1ZSBmb3IgdGhlIFBvcG92ZXIgYXJyb3cuXG4gICAqL1xuICBhcnJvd09mZnNldFRvcDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZlR5cGUoW19wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLCBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZ10pLFxuICAvKipcbiAgICogVGhlIFwibGVmdFwiIHBvc2l0aW9uIHZhbHVlIGZvciB0aGUgUG9wb3ZlciBhcnJvdy5cbiAgICovXG4gIGFycm93T2Zmc2V0TGVmdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZlR5cGUoW19wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyLCBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZ10pLFxuXG4gIC8qKlxuICAgKiBUaXRsZSBjb250ZW50XG4gICAqL1xuICB0aXRsZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ub2RlXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBwbGFjZW1lbnQ6ICdyaWdodCdcbn07XG5cbnZhciBQb3BvdmVyID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoUG9wb3ZlciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUG9wb3ZlcigpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBQb3BvdmVyKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgUG9wb3Zlci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgcGxhY2VtZW50ID0gX3Byb3BzLnBsYWNlbWVudCxcbiAgICAgICAgcG9zaXRpb25Ub3AgPSBfcHJvcHMucG9zaXRpb25Ub3AsXG4gICAgICAgIHBvc2l0aW9uTGVmdCA9IF9wcm9wcy5wb3NpdGlvbkxlZnQsXG4gICAgICAgIGFycm93T2Zmc2V0VG9wID0gX3Byb3BzLmFycm93T2Zmc2V0VG9wLFxuICAgICAgICBhcnJvd09mZnNldExlZnQgPSBfcHJvcHMuYXJyb3dPZmZzZXRMZWZ0LFxuICAgICAgICB0aXRsZSA9IF9wcm9wcy50aXRsZSxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGUgPSBfcHJvcHMuc3R5bGUsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydwbGFjZW1lbnQnLCAncG9zaXRpb25Ub3AnLCAncG9zaXRpb25MZWZ0JywgJ2Fycm93T2Zmc2V0VG9wJywgJ2Fycm93T2Zmc2V0TGVmdCcsICd0aXRsZScsICdjbGFzc05hbWUnLCAnc3R5bGUnLCAnY2hpbGRyZW4nXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKSwgKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJbcGxhY2VtZW50XSA9IHRydWUsIF9leHRlbmRzMikpO1xuXG4gICAgdmFyIG91dGVyU3R5bGUgPSAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHtcbiAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICB0b3A6IHBvc2l0aW9uVG9wLFxuICAgICAgbGVmdDogcG9zaXRpb25MZWZ0XG4gICAgfSwgc3R5bGUpO1xuXG4gICAgdmFyIGFycm93U3R5bGUgPSB7XG4gICAgICB0b3A6IGFycm93T2Zmc2V0VG9wLFxuICAgICAgbGVmdDogYXJyb3dPZmZzZXRMZWZ0XG4gICAgfTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICdkaXYnLFxuICAgICAgKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICAgIHJvbGU6ICd0b29sdGlwJyxcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcyksXG4gICAgICAgIHN0eWxlOiBvdXRlclN0eWxlXG4gICAgICB9KSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdkaXYnLCB7IGNsYXNzTmFtZTogJ2Fycm93Jywgc3R5bGU6IGFycm93U3R5bGUgfSksXG4gICAgICB0aXRsZSAmJiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2gzJyxcbiAgICAgICAgeyBjbGFzc05hbWU6ICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAndGl0bGUnKSB9LFxuICAgICAgICB0aXRsZVxuICAgICAgKSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgeyBjbGFzc05hbWU6ICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnY29udGVudCcpIH0sXG4gICAgICAgIGNoaWxkcmVuXG4gICAgICApXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gUG9wb3Zlcjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cblBvcG92ZXIucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuUG9wb3Zlci5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ3BvcG92ZXInLCBQb3BvdmVyKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF92YWx1ZXMgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L3ZhbHVlcycpO1xuXG52YXIgX3ZhbHVlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF92YWx1ZXMpO1xuXG52YXIgX2V4dGVuZHMzID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzNCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMzKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG52YXIgX1N0eWxlQ29uZmlnID0gcmVxdWlyZSgnLi91dGlscy9TdHlsZUNvbmZpZycpO1xuXG52YXIgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4gPSByZXF1aXJlKCcuL3V0aWxzL1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4nKTtcblxudmFyIF9WYWxpZENvbXBvbmVudENoaWxkcmVuMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4pO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBST1VORF9QUkVDSVNJT04gPSAxMDAwO1xuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgY2hpbGRyZW4sIGlmIGFueSwgYXJlIGluc3RhbmNlcyBvZiBgPFByb2dyZXNzQmFyPmAuXG4gKi9cbmZ1bmN0aW9uIG9ubHlQcm9ncmVzc0Jhcihwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAgdmFyIGNoaWxkcmVuID0gcHJvcHNbcHJvcE5hbWVdO1xuICBpZiAoIWNoaWxkcmVuKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgZXJyb3IgPSBudWxsO1xuXG4gIF9yZWFjdDJbJ2RlZmF1bHQnXS5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2hpbGQudHlwZSA9PT0gUHJvZ3Jlc3NCYXIpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmVcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY2hpbGRJZGVudGlmaWVyID0gX3JlYWN0MlsnZGVmYXVsdCddLmlzVmFsaWRFbGVtZW50KGNoaWxkKSA/IGNoaWxkLnR5cGUuZGlzcGxheU5hbWUgfHwgY2hpbGQudHlwZS5uYW1lIHx8IGNoaWxkLnR5cGUgOiBjaGlsZDtcbiAgICBlcnJvciA9IG5ldyBFcnJvcignQ2hpbGRyZW4gb2YgJyArIGNvbXBvbmVudE5hbWUgKyAnIGNhbiBjb250YWluIG9ubHkgUHJvZ3Jlc3NCYXIgJyArICgnY29tcG9uZW50cy4gRm91bmQgJyArIGNoaWxkSWRlbnRpZmllciArICcuJykpO1xuICB9KTtcblxuICByZXR1cm4gZXJyb3I7XG59XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIG1pbjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsXG4gIG5vdzogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsXG4gIG1heDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsXG4gIGxhYmVsOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm5vZGUsXG4gIHNyT25seTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBzdHJpcGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gIGFjdGl2ZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBjaGlsZHJlbjogb25seVByb2dyZXNzQmFyLFxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaXNDaGlsZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBtaW46IDAsXG4gIG1heDogMTAwLFxuICBhY3RpdmU6IGZhbHNlLFxuICBpc0NoaWxkOiBmYWxzZSxcbiAgc3JPbmx5OiBmYWxzZSxcbiAgc3RyaXBlZDogZmFsc2Vcbn07XG5cbmZ1bmN0aW9uIGdldFBlcmNlbnRhZ2Uobm93LCBtaW4sIG1heCkge1xuICB2YXIgcGVyY2VudGFnZSA9IChub3cgLSBtaW4pIC8gKG1heCAtIG1pbikgKiAxMDA7XG4gIHJldHVybiBNYXRoLnJvdW5kKHBlcmNlbnRhZ2UgKiBST1VORF9QUkVDSVNJT04pIC8gUk9VTkRfUFJFQ0lTSU9OO1xufVxuXG52YXIgUHJvZ3Jlc3NCYXIgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShQcm9ncmVzc0JhciwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUHJvZ3Jlc3NCYXIoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgUHJvZ3Jlc3NCYXIpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBQcm9ncmVzc0Jhci5wcm90b3R5cGUucmVuZGVyUHJvZ3Jlc3NCYXIgPSBmdW5jdGlvbiByZW5kZXJQcm9ncmVzc0JhcihfcmVmKSB7XG4gICAgdmFyIF9leHRlbmRzMjtcblxuICAgIHZhciBtaW4gPSBfcmVmLm1pbixcbiAgICAgICAgbm93ID0gX3JlZi5ub3csXG4gICAgICAgIG1heCA9IF9yZWYubWF4LFxuICAgICAgICBsYWJlbCA9IF9yZWYubGFiZWwsXG4gICAgICAgIHNyT25seSA9IF9yZWYuc3JPbmx5LFxuICAgICAgICBzdHJpcGVkID0gX3JlZi5zdHJpcGVkLFxuICAgICAgICBhY3RpdmUgPSBfcmVmLmFjdGl2ZSxcbiAgICAgICAgY2xhc3NOYW1lID0gX3JlZi5jbGFzc05hbWUsXG4gICAgICAgIHN0eWxlID0gX3JlZi5zdHlsZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcmVmLCBbJ21pbicsICdub3cnLCAnbWF4JywgJ2xhYmVsJywgJ3NyT25seScsICdzdHJpcGVkJywgJ2FjdGl2ZScsICdjbGFzc05hbWUnLCAnc3R5bGUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKSwgKF9leHRlbmRzMiA9IHtcbiAgICAgIGFjdGl2ZTogYWN0aXZlXG4gICAgfSwgX2V4dGVuZHMyWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnc3RyaXBlZCcpXSA9IGFjdGl2ZSB8fCBzdHJpcGVkLCBfZXh0ZW5kczIpKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICdkaXYnLFxuICAgICAgKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICAgIHJvbGU6ICdwcm9ncmVzc2JhcicsXG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpLFxuICAgICAgICBzdHlsZTogKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7IHdpZHRoOiBnZXRQZXJjZW50YWdlKG5vdywgbWluLCBtYXgpICsgJyUnIH0sIHN0eWxlKSxcbiAgICAgICAgJ2FyaWEtdmFsdWVub3cnOiBub3csXG4gICAgICAgICdhcmlhLXZhbHVlbWluJzogbWluLFxuICAgICAgICAnYXJpYS12YWx1ZW1heCc6IG1heFxuICAgICAgfSksXG4gICAgICBzck9ubHkgPyBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ3NwYW4nLFxuICAgICAgICB7IGNsYXNzTmFtZTogJ3NyLW9ubHknIH0sXG4gICAgICAgIGxhYmVsXG4gICAgICApIDogbGFiZWxcbiAgICApO1xuICB9O1xuXG4gIFByb2dyZXNzQmFyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGlzQ2hpbGQgPSBfcHJvcHMuaXNDaGlsZCxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnaXNDaGlsZCddKTtcblxuXG4gICAgaWYgKGlzQ2hpbGQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclByb2dyZXNzQmFyKHByb3BzKTtcbiAgICB9XG5cbiAgICB2YXIgbWluID0gcHJvcHMubWluLFxuICAgICAgICBub3cgPSBwcm9wcy5ub3csXG4gICAgICAgIG1heCA9IHByb3BzLm1heCxcbiAgICAgICAgbGFiZWwgPSBwcm9wcy5sYWJlbCxcbiAgICAgICAgc3JPbmx5ID0gcHJvcHMuc3JPbmx5LFxuICAgICAgICBzdHJpcGVkID0gcHJvcHMuc3RyaXBlZCxcbiAgICAgICAgYWN0aXZlID0gcHJvcHMuYWN0aXZlLFxuICAgICAgICBic0NsYXNzID0gcHJvcHMuYnNDbGFzcyxcbiAgICAgICAgYnNTdHlsZSA9IHByb3BzLmJzU3R5bGUsXG4gICAgICAgIGNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbixcbiAgICAgICAgd3JhcHBlclByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkocHJvcHMsIFsnbWluJywgJ25vdycsICdtYXgnLCAnbGFiZWwnLCAnc3JPbmx5JywgJ3N0cmlwZWQnLCAnYWN0aXZlJywgJ2JzQ2xhc3MnLCAnYnNTdHlsZScsICdjbGFzc05hbWUnLCAnY2hpbGRyZW4nXSk7XG5cblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICdkaXYnLFxuICAgICAgKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgd3JhcHBlclByb3BzLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsICdwcm9ncmVzcycpXG4gICAgICB9KSxcbiAgICAgIGNoaWxkcmVuID8gX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yWydkZWZhdWx0J10ubWFwKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuICgwLCBfcmVhY3QuY2xvbmVFbGVtZW50KShjaGlsZCwgeyBpc0NoaWxkOiB0cnVlIH0pO1xuICAgICAgfSkgOiB0aGlzLnJlbmRlclByb2dyZXNzQmFyKHtcbiAgICAgICAgbWluOiBtaW4sIG5vdzogbm93LCBtYXg6IG1heCwgbGFiZWw6IGxhYmVsLCBzck9ubHk6IHNyT25seSwgc3RyaXBlZDogc3RyaXBlZCwgYWN0aXZlOiBhY3RpdmUsIGJzQ2xhc3M6IGJzQ2xhc3MsIGJzU3R5bGU6IGJzU3R5bGVcbiAgICAgIH0pXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gUHJvZ3Jlc3NCYXI7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5Qcm9ncmVzc0Jhci5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5Qcm9ncmVzc0Jhci5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ3Byb2dyZXNzLWJhcicsICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNTdHlsZXMpKCgwLCBfdmFsdWVzMlsnZGVmYXVsdCddKShfU3R5bGVDb25maWcuU3RhdGUpLCBQcm9ncmVzc0JhcikpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfY2xhc3NuYW1lcyA9IHJlcXVpcmUoJ2NsYXNzbmFtZXMnKTtcblxudmFyIF9jbGFzc25hbWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzbmFtZXMpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX3dhcm5pbmcgPSByZXF1aXJlKCd3YXJuaW5nJyk7XG5cbnZhciBfd2FybmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93YXJuaW5nKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBpbmxpbmU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgZGlzYWJsZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgLyoqXG4gICAqIE9ubHkgdmFsaWQgaWYgYGlubGluZWAgaXMgbm90IHNldC5cbiAgICovXG4gIHZhbGlkYXRpb25TdGF0ZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZihbJ3N1Y2Nlc3MnLCAnd2FybmluZycsICdlcnJvcicsIG51bGxdKSxcbiAgLyoqXG4gICAqIEF0dGFjaGVzIGEgcmVmIHRvIHRoZSBgPGlucHV0PmAgZWxlbWVudC4gT25seSBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgaGVyZS5cbiAgICpcbiAgICogYGBganNcbiAgICogPFJhZGlvIGlucHV0UmVmPXtyZWYgPT4geyB0aGlzLmlucHV0ID0gcmVmOyB9fSAvPlxuICAgKiBgYGBcbiAgICovXG4gIGlucHV0UmVmOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmNcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGlubGluZTogZmFsc2UsXG4gIGRpc2FibGVkOiBmYWxzZVxufTtcblxudmFyIFJhZGlvID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoUmFkaW8sIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFJhZGlvKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIFJhZGlvKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgUmFkaW8ucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgaW5saW5lID0gX3Byb3BzLmlubGluZSxcbiAgICAgICAgZGlzYWJsZWQgPSBfcHJvcHMuZGlzYWJsZWQsXG4gICAgICAgIHZhbGlkYXRpb25TdGF0ZSA9IF9wcm9wcy52YWxpZGF0aW9uU3RhdGUsXG4gICAgICAgIGlucHV0UmVmID0gX3Byb3BzLmlucHV0UmVmLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBzdHlsZSA9IF9wcm9wcy5zdHlsZSxcbiAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW4sXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzLCBbJ2lubGluZScsICdkaXNhYmxlZCcsICd2YWxpZGF0aW9uU3RhdGUnLCAnaW5wdXRSZWYnLCAnY2xhc3NOYW1lJywgJ3N0eWxlJywgJ2NoaWxkcmVuJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBpbnB1dCA9IF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdpbnB1dCcsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgcmVmOiBpbnB1dFJlZixcbiAgICAgIHR5cGU6ICdyYWRpbycsXG4gICAgICBkaXNhYmxlZDogZGlzYWJsZWRcbiAgICB9KSk7XG5cbiAgICBpZiAoaW5saW5lKSB7XG4gICAgICB2YXIgX2NsYXNzZXMyO1xuXG4gICAgICB2YXIgX2NsYXNzZXMgPSAoX2NsYXNzZXMyID0ge30sIF9jbGFzc2VzMlsoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ2lubGluZScpXSA9IHRydWUsIF9jbGFzc2VzMi5kaXNhYmxlZCA9IGRpc2FibGVkLCBfY2xhc3NlczIpO1xuXG4gICAgICAvLyBVc2UgYSB3YXJuaW5nIGhlcmUgaW5zdGVhZCBvZiBpbiBwcm9wVHlwZXMgdG8gZ2V0IGJldHRlci1sb29raW5nXG4gICAgICAvLyBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbi5cbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyAoMCwgX3dhcm5pbmcyWydkZWZhdWx0J10pKCF2YWxpZGF0aW9uU3RhdGUsICdgdmFsaWRhdGlvblN0YXRlYCBpcyBpZ25vcmVkIG9uIGA8UmFkaW8gaW5saW5lPmAuIFRvIGRpc3BsYXkgJyArICd2YWxpZGF0aW9uIHN0YXRlIG9uIGFuIGlubGluZSByYWRpbywgc2V0IGB2YWxpZGF0aW9uU3RhdGVgIG9uIGEgJyArICdwYXJlbnQgYDxGb3JtR3JvdXA+YCBvciBvdGhlciBlbGVtZW50IGluc3RlYWQuJykgOiB2b2lkIDA7XG5cbiAgICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgICAgJ2xhYmVsJyxcbiAgICAgICAgeyBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBfY2xhc3NlcyksIHN0eWxlOiBzdHlsZSB9LFxuICAgICAgICBpbnB1dCxcbiAgICAgICAgY2hpbGRyZW5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKSwge1xuICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkXG4gICAgfSk7XG4gICAgaWYgKHZhbGlkYXRpb25TdGF0ZSkge1xuICAgICAgY2xhc3Nlc1snaGFzLScgKyB2YWxpZGF0aW9uU3RhdGVdID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnZGl2JyxcbiAgICAgIHsgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcyksIHN0eWxlOiBzdHlsZSB9LFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdsYWJlbCcsXG4gICAgICAgIG51bGwsXG4gICAgICAgIGlucHV0LFxuICAgICAgICBjaGlsZHJlblxuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFJhZGlvO1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuUmFkaW8ucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuUmFkaW8uZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdyYWRpbycsIFJhZGlvKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMyA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF93YXJuaW5nID0gcmVxdWlyZSgnd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuLy8gVE9ETzogVGhpcyBzaG91bGQgcHJvYmFibHkgdGFrZSBhIHNpbmdsZSBgYXNwZWN0UmF0aW9gIHByb3AuXG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBUaGlzIGNvbXBvbmVudCByZXF1aXJlcyBhIHNpbmdsZSBjaGlsZCBlbGVtZW50XG4gICAqL1xuICBjaGlsZHJlbjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5lbGVtZW50LmlzUmVxdWlyZWQsXG4gIC8qKlxuICAgKiAxNmJ5OSBhc3BlY3QgcmF0aW9cbiAgICovXG4gIGExNmJ5OTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICAvKipcbiAgICogNGJ5MyBhc3BlY3QgcmF0aW9cbiAgICovXG4gIGE0YnkzOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2xcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGExNmJ5OTogZmFsc2UsXG4gIGE0YnkzOiBmYWxzZVxufTtcblxudmFyIFJlc3BvbnNpdmVFbWJlZCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKFJlc3BvbnNpdmVFbWJlZCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUmVzcG9uc2l2ZUVtYmVkKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIFJlc3BvbnNpdmVFbWJlZCk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIFJlc3BvbnNpdmVFbWJlZC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYTE2Ynk5ID0gX3Byb3BzLmExNmJ5OSxcbiAgICAgICAgYTRieTMgPSBfcHJvcHMuYTRieTMsXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydhMTZieTknLCAnYTRieTMnLCAnY2xhc3NOYW1lJywgJ2NoaWxkcmVuJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyAoMCwgX3dhcm5pbmcyWydkZWZhdWx0J10pKGExNmJ5OSB8fCBhNGJ5MywgJ0VpdGhlciBgYTE2Ynk5YCBvciBgYTRieTNgIG11c3QgYmUgc2V0LicpIDogdm9pZCAwO1xuICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicgPyAoMCwgX3dhcm5pbmcyWydkZWZhdWx0J10pKCEoYTE2Ynk5ICYmIGE0YnkzKSwgJ09ubHkgb25lIG9mIGBhMTZieTlgIG9yIGBhNGJ5M2AgY2FuIGJlIHNldC4nKSA6IHZvaWQgMDtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9leHRlbmRzNFsnZGVmYXVsdCddKSh7fSwgKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyksIChfZXh0ZW5kczIgPSB7fSwgX2V4dGVuZHMyWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnMTZieTknKV0gPSBhMTZieTksIF9leHRlbmRzMlsoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJzRieTMnKV0gPSBhNGJ5MywgX2V4dGVuZHMyKSk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAnZGl2JyxcbiAgICAgIHsgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzZXMpIH0sXG4gICAgICAoMCwgX3JlYWN0LmNsb25lRWxlbWVudCkoY2hpbGRyZW4sICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ2l0ZW0nKSlcbiAgICAgIH0pKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFJlc3BvbnNpdmVFbWJlZDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cblJlc3BvbnNpdmVFbWJlZC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5SZXNwb25zaXZlRW1iZWQuZGVmYXVsdFByb3BzID0gZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCdlbWJlZC1yZXNwb25zaXZlJywgUmVzcG9uc2l2ZUVtYmVkKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX2VsZW1lbnRUeXBlID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvZWxlbWVudFR5cGUnKTtcblxudmFyIF9lbGVtZW50VHlwZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbGVtZW50VHlwZSk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6IF9lbGVtZW50VHlwZTJbJ2RlZmF1bHQnXVxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgY29tcG9uZW50Q2xhc3M6ICdkaXYnXG59O1xuXG52YXIgUm93ID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoUm93LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBSb3coKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgUm93KTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgUm93LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIENvbXBvbmVudCA9IF9wcm9wcy5jb21wb25lbnRDbGFzcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnY29tcG9uZW50Q2xhc3MnLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgdmFyIF9zcGxpdEJzUHJvcHMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wcykocHJvcHMpLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc1swXSxcbiAgICAgICAgZWxlbWVudFByb3BzID0gX3NwbGl0QnNQcm9wc1sxXTtcblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyk7XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBSb3c7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5Sb3cucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuUm93LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF9ib290c3RyYXBVdGlscy5ic0NsYXNzKSgncm93JywgUm93KTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX2VsZW1lbnRUeXBlID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvZWxlbWVudFR5cGUnKTtcblxudmFyIF9lbGVtZW50VHlwZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9lbGVtZW50VHlwZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgaHJlZjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gIG9uQ2xpY2s6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcbiAgZGlzYWJsZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgcm9sZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gIHRhYkluZGV4OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mVHlwZShbX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXIsIF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nXSksXG4gIC8qKlxuICAgKiB0aGlzIGlzIHNvcnQgb2Ygc2lsbHkgYnV0IG5lZWRlZCBmb3IgQnV0dG9uXG4gICAqL1xuICBjb21wb25lbnRDbGFzczogX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBjb21wb25lbnRDbGFzczogJ2EnXG59O1xuXG5mdW5jdGlvbiBpc1RyaXZpYWxIcmVmKGhyZWYpIHtcbiAgcmV0dXJuICFocmVmIHx8IGhyZWYudHJpbSgpID09PSAnIyc7XG59XG5cbi8qKlxuICogVGhlcmUgYXJlIHNpdHVhdGlvbnMgZHVlIHRvIGJyb3dzZXIgcXVpcmtzIG9yIEJvb3RzdHJhcCBDU1Mgd2hlcmVcbiAqIGFuIGFuY2hvciB0YWcgaXMgbmVlZGVkLCB3aGVuIHNlbWFudGljYWxseSBhIGJ1dHRvbiB0YWcgaXMgdGhlXG4gKiBiZXR0ZXIgY2hvaWNlLiBTYWZlQW5jaG9yIGVuc3VyZXMgdGhhdCB3aGVuIGFuIGFuY2hvciBpcyB1c2VkIGxpa2UgYVxuICogYnV0dG9uIGl0cyBhY2Nlc3NpYmxlLiBJdCBhbHNvIGVtdWxhdGVzIGlucHV0IGBkaXNhYmxlZGAgYmVoYXZpb3IgZm9yXG4gKiBsaW5rcywgd2hpY2ggaXMgdXN1YWxseSBkZXNpcmFibGUgZm9yIEJ1dHRvbnMsIE5hdkl0ZW1zLCBNZW51SXRlbXMsIGV0Yy5cbiAqL1xuXG52YXIgU2FmZUFuY2hvciA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKFNhZmVBbmNob3IsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFNhZmVBbmNob3IocHJvcHMsIGNvbnRleHQpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBTYWZlQW5jaG9yKTtcblxuICAgIHZhciBfdGhpcyA9ICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICBfdGhpcy5oYW5kbGVDbGljayA9IF90aGlzLmhhbmRsZUNsaWNrLmJpbmQoX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFNhZmVBbmNob3IucHJvdG90eXBlLmhhbmRsZUNsaWNrID0gZnVuY3Rpb24gaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgZGlzYWJsZWQgPSBfcHJvcHMuZGlzYWJsZWQsXG4gICAgICAgIGhyZWYgPSBfcHJvcHMuaHJlZixcbiAgICAgICAgb25DbGljayA9IF9wcm9wcy5vbkNsaWNrO1xuXG5cbiAgICBpZiAoZGlzYWJsZWQgfHwgaXNUcml2aWFsSHJlZihocmVmKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChvbkNsaWNrKSB7XG4gICAgICBvbkNsaWNrKGV2ZW50KTtcbiAgICB9XG4gIH07XG5cbiAgU2FmZUFuY2hvci5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgQ29tcG9uZW50ID0gX3Byb3BzMi5jb21wb25lbnRDbGFzcyxcbiAgICAgICAgZGlzYWJsZWQgPSBfcHJvcHMyLmRpc2FibGVkLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wczIsIFsnY29tcG9uZW50Q2xhc3MnLCAnZGlzYWJsZWQnXSk7XG5cblxuICAgIGlmIChpc1RyaXZpYWxIcmVmKHByb3BzLmhyZWYpKSB7XG4gICAgICBwcm9wcy5yb2xlID0gcHJvcHMucm9sZSB8fCAnYnV0dG9uJztcbiAgICAgIC8vIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIGEgaHJlZiBhdHRyaWJ1dGUgb24gdGhlIG5vZGVcbiAgICAgIC8vIG90aGVyd2lzZSwgdGhlIGN1cnNvciBpbmNvcnJlY3RseSBzdHlsZWQgKGV4Y2VwdCB3aXRoIHJvbGU9J2J1dHRvbicpXG4gICAgICBwcm9wcy5ocmVmID0gcHJvcHMuaHJlZiB8fCAnIyc7XG4gICAgfVxuXG4gICAgaWYgKGRpc2FibGVkKSB7XG4gICAgICBwcm9wcy50YWJJbmRleCA9IC0xO1xuICAgICAgcHJvcHMuc3R5bGUgPSAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHsgcG9pbnRlckV2ZW50czogJ25vbmUnIH0sIHByb3BzLnN0eWxlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBwcm9wcywge1xuICAgICAgb25DbGljazogdGhpcy5oYW5kbGVDbGlja1xuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gU2FmZUFuY2hvcjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cblNhZmVBbmNob3IucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuU2FmZUFuY2hvci5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IFNhZmVBbmNob3I7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9CdXR0b24gPSByZXF1aXJlKCcuL0J1dHRvbicpO1xuXG52YXIgX0J1dHRvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9CdXR0b24pO1xuXG52YXIgX0Ryb3Bkb3duID0gcmVxdWlyZSgnLi9Ecm9wZG93bicpO1xuXG52YXIgX0Ryb3Bkb3duMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Ryb3Bkb3duKTtcblxudmFyIF9TcGxpdFRvZ2dsZSA9IHJlcXVpcmUoJy4vU3BsaXRUb2dnbGUnKTtcblxudmFyIF9TcGxpdFRvZ2dsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TcGxpdFRvZ2dsZSk7XG5cbnZhciBfc3BsaXRDb21wb25lbnRQcm9wczIgPSByZXF1aXJlKCcuL3V0aWxzL3NwbGl0Q29tcG9uZW50UHJvcHMnKTtcblxudmFyIF9zcGxpdENvbXBvbmVudFByb3BzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NwbGl0Q29tcG9uZW50UHJvcHMyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgX0Ryb3Bkb3duMlsnZGVmYXVsdCddLnByb3BUeXBlcywge1xuXG4gIC8vIFRvZ2dsZSBwcm9wcy5cbiAgYnNTdHlsZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gIGJzU2l6ZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gIGhyZWY6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICBvbkNsaWNrOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gIC8qKlxuICAgKiBUaGUgY29udGVudCBvZiB0aGUgc3BsaXQgYnV0dG9uLlxuICAgKi9cbiAgdGl0bGU6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubm9kZS5pc1JlcXVpcmVkLFxuICAvKipcbiAgICogQWNjZXNzaWJsZSBsYWJlbCBmb3IgdGhlIHRvZ2dsZTsgdGhlIHZhbHVlIG9mIGB0aXRsZWAgaWYgbm90IHNwZWNpZmllZC5cbiAgICovXG4gIHRvZ2dsZUxhYmVsOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcblxuICAvLyBPdmVycmlkZSBnZW5lcmF0ZWQgZG9jcyBmcm9tIDxEcm9wZG93bj4uXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2hpbGRyZW46IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubm9kZVxufSk7XG5cbnZhciBTcGxpdEJ1dHRvbiA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKFNwbGl0QnV0dG9uLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBTcGxpdEJ1dHRvbigpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBTcGxpdEJ1dHRvbik7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIFNwbGl0QnV0dG9uLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIGJzU2l6ZSA9IF9wcm9wcy5ic1NpemUsXG4gICAgICAgIGJzU3R5bGUgPSBfcHJvcHMuYnNTdHlsZSxcbiAgICAgICAgdGl0bGUgPSBfcHJvcHMudGl0bGUsXG4gICAgICAgIHRvZ2dsZUxhYmVsID0gX3Byb3BzLnRvZ2dsZUxhYmVsLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnYnNTaXplJywgJ2JzU3R5bGUnLCAndGl0bGUnLCAndG9nZ2xlTGFiZWwnLCAnY2hpbGRyZW4nXSk7XG5cbiAgICB2YXIgX3NwbGl0Q29tcG9uZW50UHJvcHMgPSAoMCwgX3NwbGl0Q29tcG9uZW50UHJvcHMzWydkZWZhdWx0J10pKHByb3BzLCBfRHJvcGRvd24yWydkZWZhdWx0J10uQ29udHJvbGxlZENvbXBvbmVudCksXG4gICAgICAgIGRyb3Bkb3duUHJvcHMgPSBfc3BsaXRDb21wb25lbnRQcm9wc1swXSxcbiAgICAgICAgYnV0dG9uUHJvcHMgPSBfc3BsaXRDb21wb25lbnRQcm9wc1sxXTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChcbiAgICAgIF9Ecm9wZG93bjJbJ2RlZmF1bHQnXSxcbiAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGRyb3Bkb3duUHJvcHMsIHtcbiAgICAgICAgYnNTaXplOiBic1NpemUsXG4gICAgICAgIGJzU3R5bGU6IGJzU3R5bGVcbiAgICAgIH0pLFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIF9CdXR0b24yWydkZWZhdWx0J10sXG4gICAgICAgICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGJ1dHRvblByb3BzLCB7XG4gICAgICAgICAgZGlzYWJsZWQ6IHByb3BzLmRpc2FibGVkLFxuICAgICAgICAgIGJzU2l6ZTogYnNTaXplLFxuICAgICAgICAgIGJzU3R5bGU6IGJzU3R5bGVcbiAgICAgICAgfSksXG4gICAgICAgIHRpdGxlXG4gICAgICApLFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoX1NwbGl0VG9nZ2xlMlsnZGVmYXVsdCddLCB7XG4gICAgICAgICdhcmlhLWxhYmVsJzogdG9nZ2xlTGFiZWwgfHwgdGl0bGUsXG4gICAgICAgIGJzU2l6ZTogYnNTaXplLFxuICAgICAgICBic1N0eWxlOiBic1N0eWxlXG4gICAgICB9KSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICBfRHJvcGRvd24yWydkZWZhdWx0J10uTWVudSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgY2hpbGRyZW5cbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIHJldHVybiBTcGxpdEJ1dHRvbjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cblNwbGl0QnV0dG9uLnByb3BUeXBlcyA9IHByb3BUeXBlcztcblxuU3BsaXRCdXR0b24uVG9nZ2xlID0gX1NwbGl0VG9nZ2xlMlsnZGVmYXVsdCddO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBTcGxpdEJ1dHRvbjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX0Ryb3Bkb3duVG9nZ2xlID0gcmVxdWlyZSgnLi9Ecm9wZG93blRvZ2dsZScpO1xuXG52YXIgX0Ryb3Bkb3duVG9nZ2xlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Ryb3Bkb3duVG9nZ2xlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgU3BsaXRUb2dnbGUgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShTcGxpdFRvZ2dsZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gU3BsaXRUb2dnbGUoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgU3BsaXRUb2dnbGUpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBTcGxpdFRvZ2dsZS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChfRHJvcGRvd25Ub2dnbGUyWydkZWZhdWx0J10sICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIHRoaXMucHJvcHMsIHtcbiAgICAgIHVzZUFuY2hvcjogZmFsc2UsXG4gICAgICBub0NhcmV0OiBmYWxzZVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gU3BsaXRUb2dnbGU7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5TcGxpdFRvZ2dsZS5kZWZhdWx0UHJvcHMgPSBfRHJvcGRvd25Ub2dnbGUyWydkZWZhdWx0J10uZGVmYXVsdFByb3BzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBTcGxpdFRvZ2dsZTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9UYWJDb250YWluZXIgPSByZXF1aXJlKCcuL1RhYkNvbnRhaW5lcicpO1xuXG52YXIgX1RhYkNvbnRhaW5lcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UYWJDb250YWluZXIpO1xuXG52YXIgX1RhYkNvbnRlbnQgPSByZXF1aXJlKCcuL1RhYkNvbnRlbnQnKTtcblxudmFyIF9UYWJDb250ZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RhYkNvbnRlbnQpO1xuXG52YXIgX1RhYlBhbmUgPSByZXF1aXJlKCcuL1RhYlBhbmUnKTtcblxudmFyIF9UYWJQYW5lMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RhYlBhbmUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBfVGFiUGFuZTJbJ2RlZmF1bHQnXS5wcm9wVHlwZXMsIHtcblxuICBkaXNhYmxlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuXG4gIHRpdGxlOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm5vZGUsXG5cbiAgLyoqXG4gICAqIHRhYkNsYXNzTmFtZSBpcyB1c2VkIGFzIGNsYXNzTmFtZSBmb3IgdGhlIGFzc29jaWF0ZWQgTmF2SXRlbVxuICAgKi9cbiAgdGFiQ2xhc3NOYW1lOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZ1xufSk7XG5cbnZhciBUYWIgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShUYWIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFRhYigpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBUYWIpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBUYWIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgcHJvcHMgPSAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCB0aGlzLnByb3BzKTtcblxuICAgIC8vIFRoZXNlIHByb3BzIGFyZSBmb3IgdGhlIHBhcmVudCBgPFRhYnM+YCByYXRoZXIgdGhhbiB0aGUgYDxUYWJQYW5lPmAuXG4gICAgZGVsZXRlIHByb3BzLnRpdGxlO1xuICAgIGRlbGV0ZSBwcm9wcy5kaXNhYmxlZDtcbiAgICBkZWxldGUgcHJvcHMudGFiQ2xhc3NOYW1lO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KF9UYWJQYW5lMlsnZGVmYXVsdCddLCBwcm9wcyk7XG4gIH07XG5cbiAgcmV0dXJuIFRhYjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cblRhYi5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5cblRhYi5Db250YWluZXIgPSBfVGFiQ29udGFpbmVyMlsnZGVmYXVsdCddO1xuVGFiLkNvbnRlbnQgPSBfVGFiQ29udGVudDJbJ2RlZmF1bHQnXTtcblRhYi5QYW5lID0gX1RhYlBhbmUyWydkZWZhdWx0J107XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IFRhYjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfdW5jb250cm9sbGFibGUgPSByZXF1aXJlKCd1bmNvbnRyb2xsYWJsZScpO1xuXG52YXIgX3VuY29udHJvbGxhYmxlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3VuY29udHJvbGxhYmxlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgVEFCID0gJ3RhYic7XG52YXIgUEFORSA9ICdwYW5lJztcblxudmFyIGlkUHJvcFR5cGUgPSBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mVHlwZShbX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsIF9wcm9wVHlwZXMyWydkZWZhdWx0J10ubnVtYmVyXSk7XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBIVE1MIGlkIGF0dHJpYnV0ZSwgcmVxdWlyZWQgaWYgbm8gYGdlbmVyYXRlQ2hpbGRJZGAgcHJvcFxuICAgKiBpcyBzcGVjaWZpZWQuXG4gICAqL1xuICBpZDogZnVuY3Rpb24gaWQocHJvcHMpIHtcbiAgICB2YXIgZXJyb3IgPSBudWxsO1xuXG4gICAgaWYgKCFwcm9wcy5nZW5lcmF0ZUNoaWxkSWQpIHtcbiAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgIH1cblxuICAgICAgZXJyb3IgPSBpZFByb3BUeXBlLmFwcGx5KHVuZGVmaW5lZCwgW3Byb3BzXS5jb25jYXQoYXJncykpO1xuXG4gICAgICBpZiAoIWVycm9yICYmICFwcm9wcy5pZCkge1xuICAgICAgICBlcnJvciA9IG5ldyBFcnJvcignSW4gb3JkZXIgdG8gcHJvcGVybHkgaW5pdGlhbGl6ZSBUYWJzIGluIGEgd2F5IHRoYXQgaXMgYWNjZXNzaWJsZSAnICsgJ3RvIGFzc2lzdGl2ZSB0ZWNobm9sb2dpZXMgKHN1Y2ggYXMgc2NyZWVuIHJlYWRlcnMpIGFuIGBpZGAgb3IgYSAnICsgJ2BnZW5lcmF0ZUNoaWxkSWRgIHByb3AgdG8gVGFiQ29udGFpbmVyIGlzIHJlcXVpcmVkJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9yO1xuICB9LFxuXG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBgZXZlbnRLZXlgIGFuZCBgdHlwZWAgYW5kIHJldHVybnMgYSB1bmlxdWUgaWQgZm9yXG4gICAqIGNoaWxkIHRhYiBgPE5hdkl0ZW0+YHMgYW5kIGA8VGFiUGFuZT5gcy4gVGhlIGZ1bmN0aW9uIF9tdXN0XyBiZSBhIHB1cmVcbiAgICogZnVuY3Rpb24sIG1lYW5pbmcgaXQgc2hvdWxkIGFsd2F5cyByZXR1cm4gdGhlIF9zYW1lXyBpZCBmb3IgdGhlIHNhbWUgc2V0XG4gICAqIG9mIGlucHV0cy4gVGhlIGRlZmF1bHQgdmFsdWUgcmVxdWlyZXMgdGhhdCBhbiBgaWRgIHRvIGJlIHNldCBmb3IgdGhlXG4gICAqIGA8VGFiQ29udGFpbmVyPmAuXG4gICAqXG4gICAqIFRoZSBgdHlwZWAgYXJndW1lbnQgd2lsbCBlaXRoZXIgYmUgYFwidGFiXCJgIG9yIGBcInBhbmVcImAuXG4gICAqXG4gICAqIEBkZWZhdWx0VmFsdWUgKGV2ZW50S2V5LCB0eXBlKSA9PiBgJHt0aGlzLnByb3BzLmlkfS0ke3R5cGV9LSR7a2V5fWBcbiAgICovXG4gIGdlbmVyYXRlQ2hpbGRJZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZpcmVkIHdoZW4gYSB0YWIgaXMgc2VsZWN0ZWQuXG4gICAqXG4gICAqIEBjb250cm9sbGFibGUgYWN0aXZlS2V5XG4gICAqL1xuICBvblNlbGVjdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuXG4gIC8qKlxuICAgKiBUaGUgYGV2ZW50S2V5YCBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSB0YWIuXG4gICAqXG4gICAqIEBjb250cm9sbGFibGUgb25TZWxlY3RcbiAgICovXG4gIGFjdGl2ZUtleTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5hbnlcbn07XG5cbnZhciBjaGlsZENvbnRleHRUeXBlcyA9IHtcbiAgJGJzX3RhYkNvbnRhaW5lcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zaGFwZSh7XG4gICAgYWN0aXZlS2V5OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmFueSxcbiAgICBvblNlbGVjdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLmlzUmVxdWlyZWQsXG4gICAgZ2V0VGFiSWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYy5pc1JlcXVpcmVkLFxuICAgIGdldFBhbmVJZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLmlzUmVxdWlyZWRcbiAgfSlcbn07XG5cbnZhciBUYWJDb250YWluZXIgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShUYWJDb250YWluZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFRhYkNvbnRhaW5lcigpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBUYWJDb250YWluZXIpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBUYWJDb250YWluZXIucHJvdG90eXBlLmdldENoaWxkQ29udGV4dCA9IGZ1bmN0aW9uIGdldENoaWxkQ29udGV4dCgpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYWN0aXZlS2V5ID0gX3Byb3BzLmFjdGl2ZUtleSxcbiAgICAgICAgb25TZWxlY3QgPSBfcHJvcHMub25TZWxlY3QsXG4gICAgICAgIGdlbmVyYXRlQ2hpbGRJZCA9IF9wcm9wcy5nZW5lcmF0ZUNoaWxkSWQsXG4gICAgICAgIGlkID0gX3Byb3BzLmlkO1xuXG5cbiAgICB2YXIgZ2V0SWQgPSBnZW5lcmF0ZUNoaWxkSWQgfHwgZnVuY3Rpb24gKGtleSwgdHlwZSkge1xuICAgICAgcmV0dXJuIGlkID8gaWQgKyAnLScgKyB0eXBlICsgJy0nICsga2V5IDogbnVsbDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICRic190YWJDb250YWluZXI6IHtcbiAgICAgICAgYWN0aXZlS2V5OiBhY3RpdmVLZXksXG4gICAgICAgIG9uU2VsZWN0OiBvblNlbGVjdCxcbiAgICAgICAgZ2V0VGFiSWQ6IGZ1bmN0aW9uIGdldFRhYklkKGtleSkge1xuICAgICAgICAgIHJldHVybiBnZXRJZChrZXksIFRBQik7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFBhbmVJZDogZnVuY3Rpb24gZ2V0UGFuZUlkKGtleSkge1xuICAgICAgICAgIHJldHVybiBnZXRJZChrZXksIFBBTkUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBUYWJDb250YWluZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzMiA9IHRoaXMucHJvcHMsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzMi5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMyLCBbJ2NoaWxkcmVuJ10pO1xuXG5cbiAgICBkZWxldGUgcHJvcHMuZ2VuZXJhdGVDaGlsZElkO1xuICAgIGRlbGV0ZSBwcm9wcy5vblNlbGVjdDtcbiAgICBkZWxldGUgcHJvcHMuYWN0aXZlS2V5O1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jbG9uZUVsZW1lbnQoX3JlYWN0MlsnZGVmYXVsdCddLkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pLCBwcm9wcyk7XG4gIH07XG5cbiAgcmV0dXJuIFRhYkNvbnRhaW5lcjtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cblRhYkNvbnRhaW5lci5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5UYWJDb250YWluZXIuY2hpbGRDb250ZXh0VHlwZXMgPSBjaGlsZENvbnRleHRUeXBlcztcblxuZXhwb3J0c1snZGVmYXVsdCddID0gKDAsIF91bmNvbnRyb2xsYWJsZTJbJ2RlZmF1bHQnXSkoVGFiQ29udGFpbmVyLCB7IGFjdGl2ZUtleTogJ29uU2VsZWN0JyB9KTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiBfZWxlbWVudFR5cGUyWydkZWZhdWx0J10sXG5cbiAgLyoqXG4gICAqIFNldHMgYSBkZWZhdWx0IGFuaW1hdGlvbiBzdHJhdGVneSBmb3IgYWxsIGNoaWxkcmVuIGA8VGFiUGFuZT5gcy4gVXNlXG4gICAqIGBmYWxzZWAgdG8gZGlzYWJsZSwgYHRydWVgIHRvIGVuYWJsZSB0aGUgZGVmYXVsdCBgPEZhZGU+YCBhbmltYXRpb24gb3IgYW55XG4gICAqIGA8VHJhbnNpdGlvbj5gIGNvbXBvbmVudC5cbiAgICovXG4gIGFuaW1hdGlvbjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZlR5cGUoW19wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCwgX2VsZW1lbnRUeXBlMlsnZGVmYXVsdCddXSksXG5cbiAgLyoqXG4gICAqIFdhaXQgdW50aWwgdGhlIGZpcnN0IFwiZW50ZXJcIiB0cmFuc2l0aW9uIHRvIG1vdW50IHRhYnMgKGFkZCB0aGVtIHRvIHRoZSBET00pXG4gICAqL1xuICBtb3VudE9uRW50ZXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogVW5tb3VudCB0YWJzIChyZW1vdmUgaXQgZnJvbSB0aGUgRE9NKSB3aGVuIHRoZXkgYXJlIG5vIGxvbmdlciB2aXNpYmxlXG4gICAqL1xuICB1bm1vdW50T25FeGl0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2xcbn07XG5cbnZhciBkZWZhdWx0UHJvcHMgPSB7XG4gIGNvbXBvbmVudENsYXNzOiAnZGl2JyxcbiAgYW5pbWF0aW9uOiB0cnVlLFxuICBtb3VudE9uRW50ZXI6IGZhbHNlLFxuICB1bm1vdW50T25FeGl0OiBmYWxzZVxufTtcblxudmFyIGNvbnRleHRUeXBlcyA9IHtcbiAgJGJzX3RhYkNvbnRhaW5lcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zaGFwZSh7XG4gICAgYWN0aXZlS2V5OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmFueVxuICB9KVxufTtcblxudmFyIGNoaWxkQ29udGV4dFR5cGVzID0ge1xuICAkYnNfdGFiQ29udGVudDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zaGFwZSh7XG4gICAgYnNDbGFzczogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG4gICAgYW5pbWF0aW9uOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mVHlwZShbX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLCBfZWxlbWVudFR5cGUyWydkZWZhdWx0J11dKSxcbiAgICBhY3RpdmVLZXk6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYW55LFxuICAgIG1vdW50T25FbnRlcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICAgIHVubW91bnRPbkV4aXQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgICBvblBhbmVFbnRlcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLmlzUmVxdWlyZWQsXG4gICAgb25QYW5lRXhpdGVkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBleGl0aW5nOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wuaXNSZXF1aXJlZFxuICB9KVxufTtcblxudmFyIFRhYkNvbnRlbnQgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShUYWJDb250ZW50LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBUYWJDb250ZW50KHByb3BzLCBjb250ZXh0KSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgVGFiQ29udGVudCk7XG5cbiAgICB2YXIgX3RoaXMgPSAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgX3RoaXMuaGFuZGxlUGFuZUVudGVyID0gX3RoaXMuaGFuZGxlUGFuZUVudGVyLmJpbmQoX3RoaXMpO1xuICAgIF90aGlzLmhhbmRsZVBhbmVFeGl0ZWQgPSBfdGhpcy5oYW5kbGVQYW5lRXhpdGVkLmJpbmQoX3RoaXMpO1xuXG4gICAgLy8gQWN0aXZlIGVudHJpZXMgaW4gc3RhdGUgd2lsbCBiZSBgbnVsbGAgdW5sZXNzIGBhbmltYXRpb25gIGlzIHNldC4gTmVlZFxuICAgIC8vIHRvIHRyYWNrIGFjdGl2ZSBjaGlsZCBpbiBjYXNlIGtleXMgc3dhcCBhbmQgdGhlIGFjdGl2ZSBjaGlsZCBjaGFuZ2VzXG4gICAgLy8gYnV0IHRoZSBhY3RpdmUga2V5IGRvZXMgbm90LlxuICAgIF90aGlzLnN0YXRlID0ge1xuICAgICAgYWN0aXZlS2V5OiBudWxsLFxuICAgICAgYWN0aXZlQ2hpbGQ6IG51bGxcbiAgICB9O1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFRhYkNvbnRlbnQucHJvdG90eXBlLmdldENoaWxkQ29udGV4dCA9IGZ1bmN0aW9uIGdldENoaWxkQ29udGV4dCgpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgYnNDbGFzcyA9IF9wcm9wcy5ic0NsYXNzLFxuICAgICAgICBhbmltYXRpb24gPSBfcHJvcHMuYW5pbWF0aW9uLFxuICAgICAgICBtb3VudE9uRW50ZXIgPSBfcHJvcHMubW91bnRPbkVudGVyLFxuICAgICAgICB1bm1vdW50T25FeGl0ID0gX3Byb3BzLnVubW91bnRPbkV4aXQ7XG5cblxuICAgIHZhciBzdGF0ZUFjdGl2ZUtleSA9IHRoaXMuc3RhdGUuYWN0aXZlS2V5O1xuICAgIHZhciBjb250YWluZXJBY3RpdmVLZXkgPSB0aGlzLmdldENvbnRhaW5lckFjdGl2ZUtleSgpO1xuXG4gICAgdmFyIGFjdGl2ZUtleSA9IHN0YXRlQWN0aXZlS2V5ICE9IG51bGwgPyBzdGF0ZUFjdGl2ZUtleSA6IGNvbnRhaW5lckFjdGl2ZUtleTtcbiAgICB2YXIgZXhpdGluZyA9IHN0YXRlQWN0aXZlS2V5ICE9IG51bGwgJiYgc3RhdGVBY3RpdmVLZXkgIT09IGNvbnRhaW5lckFjdGl2ZUtleTtcblxuICAgIHJldHVybiB7XG4gICAgICAkYnNfdGFiQ29udGVudDoge1xuICAgICAgICBic0NsYXNzOiBic0NsYXNzLFxuICAgICAgICBhbmltYXRpb246IGFuaW1hdGlvbixcbiAgICAgICAgYWN0aXZlS2V5OiBhY3RpdmVLZXksXG4gICAgICAgIG1vdW50T25FbnRlcjogbW91bnRPbkVudGVyLFxuICAgICAgICB1bm1vdW50T25FeGl0OiB1bm1vdW50T25FeGl0LFxuICAgICAgICBvblBhbmVFbnRlcjogdGhpcy5oYW5kbGVQYW5lRW50ZXIsXG4gICAgICAgIG9uUGFuZUV4aXRlZDogdGhpcy5oYW5kbGVQYW5lRXhpdGVkLFxuICAgICAgICBleGl0aW5nOiBleGl0aW5nXG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBUYWJDb250ZW50LnByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICBpZiAoIW5leHRQcm9wcy5hbmltYXRpb24gJiYgdGhpcy5zdGF0ZS5hY3RpdmVDaGlsZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGFjdGl2ZUtleTogbnVsbCwgYWN0aXZlQ2hpbGQ6IG51bGwgfSk7XG4gICAgfVxuICB9O1xuXG4gIFRhYkNvbnRlbnQucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgdGhpcy5pc1VubW91bnRlZCA9IHRydWU7XG4gIH07XG5cbiAgVGFiQ29udGVudC5wcm90b3R5cGUuaGFuZGxlUGFuZUVudGVyID0gZnVuY3Rpb24gaGFuZGxlUGFuZUVudGVyKGNoaWxkLCBjaGlsZEtleSkge1xuICAgIGlmICghdGhpcy5wcm9wcy5hbmltYXRpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyBjaGlsZCBzaG91bGQgYmUgdHJhbnNpdGlvbmluZyBvdXQuXG4gICAgaWYgKGNoaWxkS2V5ICE9PSB0aGlzLmdldENvbnRhaW5lckFjdGl2ZUtleSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBhY3RpdmVLZXk6IGNoaWxkS2V5LFxuICAgICAgYWN0aXZlQ2hpbGQ6IGNoaWxkXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBUYWJDb250ZW50LnByb3RvdHlwZS5oYW5kbGVQYW5lRXhpdGVkID0gZnVuY3Rpb24gaGFuZGxlUGFuZUV4aXRlZChjaGlsZCkge1xuICAgIC8vIFRoaXMgbWlnaHQgaGFwcGVuIGFzIGV2ZXJ5dGhpbmcgaXMgdW5tb3VudGluZy5cbiAgICBpZiAodGhpcy5pc1VubW91bnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciBhY3RpdmVDaGlsZCA9IF9yZWYuYWN0aXZlQ2hpbGQ7XG5cbiAgICAgIGlmIChhY3RpdmVDaGlsZCAhPT0gY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjdGl2ZUtleTogbnVsbCxcbiAgICAgICAgYWN0aXZlQ2hpbGQ6IG51bGxcbiAgICAgIH07XG4gICAgfSk7XG4gIH07XG5cbiAgVGFiQ29udGVudC5wcm90b3R5cGUuZ2V0Q29udGFpbmVyQWN0aXZlS2V5ID0gZnVuY3Rpb24gZ2V0Q29udGFpbmVyQWN0aXZlS2V5KCkge1xuICAgIHZhciB0YWJDb250YWluZXIgPSB0aGlzLmNvbnRleHQuJGJzX3RhYkNvbnRhaW5lcjtcbiAgICByZXR1cm4gdGFiQ29udGFpbmVyICYmIHRhYkNvbnRhaW5lci5hY3RpdmVLZXk7XG4gIH07XG5cbiAgVGFiQ29udGVudC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMyID0gdGhpcy5wcm9wcyxcbiAgICAgICAgQ29tcG9uZW50ID0gX3Byb3BzMi5jb21wb25lbnRDbGFzcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzMi5jbGFzc05hbWUsXG4gICAgICAgIHByb3BzID0gKDAsIF9vYmplY3RXaXRob3V0UHJvcGVydGllczNbJ2RlZmF1bHQnXSkoX3Byb3BzMiwgWydjb21wb25lbnRDbGFzcycsICdjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wc0FuZE9taXQgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLnNwbGl0QnNQcm9wc0FuZE9taXQpKHByb3BzLCBbJ2FuaW1hdGlvbicsICdtb3VudE9uRW50ZXInLCAndW5tb3VudE9uRXhpdCddKSxcbiAgICAgICAgYnNQcm9wcyA9IF9zcGxpdEJzUHJvcHNBbmRPbWl0WzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzQW5kT21pdFsxXTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudChDb21wb25lbnQsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdjb250ZW50JykpXG4gICAgfSkpO1xuICB9O1xuXG4gIHJldHVybiBUYWJDb250ZW50O1xufShfcmVhY3QyWydkZWZhdWx0J10uQ29tcG9uZW50KTtcblxuVGFiQ29udGVudC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5UYWJDb250ZW50LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcblRhYkNvbnRlbnQuY29udGV4dFR5cGVzID0gY29udGV4dFR5cGVzO1xuVGFiQ29udGVudC5jaGlsZENvbnRleHRUeXBlcyA9IGNoaWxkQ29udGV4dFR5cGVzO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzQ2xhc3MpKCd0YWInLCBUYWJDb250ZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX3dhcm5pbmcgPSByZXF1aXJlKCd3YXJuaW5nJyk7XG5cbnZhciBfd2FybmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93YXJuaW5nKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxudmFyIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24gPSByZXF1aXJlKCcuL3V0aWxzL2NyZWF0ZUNoYWluZWRGdW5jdGlvbicpO1xuXG52YXIgX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24pO1xuXG52YXIgX0ZhZGUgPSByZXF1aXJlKCcuL0ZhZGUnKTtcblxudmFyIF9GYWRlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0ZhZGUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBwcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBVbmlxdWVseSBpZGVudGlmeSB0aGUgYDxUYWJQYW5lPmAgYW1vbmcgaXRzIHNpYmxpbmdzLlxuICAgKi9cbiAgZXZlbnRLZXk6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYW55LFxuXG4gIC8qKlxuICAgKiBVc2UgYW5pbWF0aW9uIHdoZW4gc2hvd2luZyBvciBoaWRpbmcgYDxUYWJQYW5lPmBzLiBVc2UgYGZhbHNlYCB0byBkaXNhYmxlLFxuICAgKiBgdHJ1ZWAgdG8gZW5hYmxlIHRoZSBkZWZhdWx0IGA8RmFkZT5gIGFuaW1hdGlvbiBvciBhbnkgYDxUcmFuc2l0aW9uPmBcbiAgICogY29tcG9uZW50LlxuICAgKi9cbiAgYW5pbWF0aW9uOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mVHlwZShbX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLCBfZWxlbWVudFR5cGUyWydkZWZhdWx0J11dKSxcblxuICAvKiogQHByaXZhdGUgKiovXG4gIGlkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcblxuICAvKiogQHByaXZhdGUgKiovXG4gICdhcmlhLWxhYmVsbGVkYnknOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcblxuICAvKipcbiAgICogSWYgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkIGFuZCByZW5kZXJlZCBpbiB0aGUgY29udGV4dCBvZiBhXG4gICAqIGA8VGFiQ29udGVudD5gLCB0aGUgYGJzQ2xhc3NgIG9mIHRoZSBgPFRhYkNvbnRlbnQ+YCBzdWZmaXhlZCBieSBgLXBhbmVgLlxuICAgKiBJZiBvdGhlcndpc2Ugbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkLCBgdGFiLXBhbmVgLlxuICAgKi9cbiAgYnNDbGFzczogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIFRyYW5zaXRpb24gb25FbnRlciBjYWxsYmFjayB3aGVuIGFuaW1hdGlvbiBpcyBub3QgYGZhbHNlYFxuICAgKi9cbiAgb25FbnRlcjogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuXG4gIC8qKlxuICAgKiBUcmFuc2l0aW9uIG9uRW50ZXJpbmcgY2FsbGJhY2sgd2hlbiBhbmltYXRpb24gaXMgbm90IGBmYWxzZWBcbiAgICovXG4gIG9uRW50ZXJpbmc6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogVHJhbnNpdGlvbiBvbkVudGVyZWQgY2FsbGJhY2sgd2hlbiBhbmltYXRpb24gaXMgbm90IGBmYWxzZWBcbiAgICovXG4gIG9uRW50ZXJlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuXG4gIC8qKlxuICAgKiBUcmFuc2l0aW9uIG9uRXhpdCBjYWxsYmFjayB3aGVuIGFuaW1hdGlvbiBpcyBub3QgYGZhbHNlYFxuICAgKi9cbiAgb25FeGl0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG5cbiAgLyoqXG4gICAqIFRyYW5zaXRpb24gb25FeGl0aW5nIGNhbGxiYWNrIHdoZW4gYW5pbWF0aW9uIGlzIG5vdCBgZmFsc2VgXG4gICAqL1xuICBvbkV4aXRpbmc6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogVHJhbnNpdGlvbiBvbkV4aXRlZCBjYWxsYmFjayB3aGVuIGFuaW1hdGlvbiBpcyBub3QgYGZhbHNlYFxuICAgKi9cbiAgb25FeGl0ZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYyxcblxuICAvKipcbiAgICogV2FpdCB1bnRpbCB0aGUgZmlyc3QgXCJlbnRlclwiIHRyYW5zaXRpb24gdG8gbW91bnQgdGhlIHRhYiAoYWRkIGl0IHRvIHRoZSBET00pXG4gICAqL1xuICBtb3VudE9uRW50ZXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcblxuICAvKipcbiAgICogVW5tb3VudCB0aGUgdGFiIChyZW1vdmUgaXQgZnJvbSB0aGUgRE9NKSB3aGVuIGl0IGlzIG5vIGxvbmdlciB2aXNpYmxlXG4gICAqL1xuICB1bm1vdW50T25FeGl0OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2xcbn07XG5cbnZhciBjb250ZXh0VHlwZXMgPSB7XG4gICRic190YWJDb250YWluZXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc2hhcGUoe1xuICAgIGdldFRhYklkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMsXG4gICAgZ2V0UGFuZUlkOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmNcbiAgfSksXG4gICRic190YWJDb250ZW50OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnNoYXBlKHtcbiAgICBic0NsYXNzOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZyxcbiAgICBhbmltYXRpb246IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2ZUeXBlKFtfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsIF9lbGVtZW50VHlwZTJbJ2RlZmF1bHQnXV0pLFxuICAgIGFjdGl2ZUtleTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5hbnksXG4gICAgbW91bnRPbkVudGVyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG4gICAgdW5tb3VudE9uRXhpdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICAgIG9uUGFuZUVudGVyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmZ1bmMuaXNSZXF1aXJlZCxcbiAgICBvblBhbmVFeGl0ZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uZnVuYy5pc1JlcXVpcmVkLFxuICAgIGV4aXRpbmc6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbC5pc1JlcXVpcmVkXG4gIH0pXG59O1xuXG4vKipcbiAqIFdlIG92ZXJyaWRlIHRoZSBgPFRhYkNvbnRhaW5lcj5gIGNvbnRleHQgc28gYDxOYXY+YHMgaW4gYDxUYWJQYW5lPmBzIGRvbid0XG4gKiBjb25mbGljdCB3aXRoIHRoZSB0b3AgbGV2ZWwgb25lLlxuICovXG52YXIgY2hpbGRDb250ZXh0VHlwZXMgPSB7XG4gICRic190YWJDb250YWluZXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2YoW251bGxdKVxufTtcblxudmFyIFRhYlBhbmUgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShUYWJQYW5lLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBUYWJQYW5lKHByb3BzLCBjb250ZXh0KSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgVGFiUGFuZSk7XG5cbiAgICB2YXIgX3RoaXMgPSAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgX3RoaXMuaGFuZGxlRW50ZXIgPSBfdGhpcy5oYW5kbGVFbnRlci5iaW5kKF90aGlzKTtcbiAgICBfdGhpcy5oYW5kbGVFeGl0ZWQgPSBfdGhpcy5oYW5kbGVFeGl0ZWQuYmluZChfdGhpcyk7XG5cbiAgICBfdGhpc1snaW4nXSA9IGZhbHNlO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIFRhYlBhbmUucHJvdG90eXBlLmdldENoaWxkQ29udGV4dCA9IGZ1bmN0aW9uIGdldENoaWxkQ29udGV4dCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJGJzX3RhYkNvbnRhaW5lcjogbnVsbFxuICAgIH07XG4gIH07XG5cbiAgVGFiUGFuZS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICBpZiAodGhpcy5zaG91bGRCZUluKCkpIHtcbiAgICAgIC8vIEluIGxpZXUgb2YgdGhlIGFjdGlvbiBldmVudCBmaXJpbmcuXG4gICAgICB0aGlzLmhhbmRsZUVudGVyKCk7XG4gICAgfVxuICB9O1xuXG4gIFRhYlBhbmUucHJvdG90eXBlLmNvbXBvbmVudERpZFVwZGF0ZSA9IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICBpZiAodGhpc1snaW4nXSkge1xuICAgICAgaWYgKCF0aGlzLnNob3VsZEJlSW4oKSkge1xuICAgICAgICAvLyBXZSBzaG91bGRuJ3QgYmUgYWN0aXZlIGFueSBtb3JlLiBOb3RpZnkgdGhlIHBhcmVudC5cbiAgICAgICAgdGhpcy5oYW5kbGVFeGl0ZWQoKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuc2hvdWxkQmVJbigpKSB7XG4gICAgICAvLyBXZSBhcmUgdGhlIGFjdGl2ZSBjaGlsZC4gTm90aWZ5IHRoZSBwYXJlbnQuXG4gICAgICB0aGlzLmhhbmRsZUVudGVyKCk7XG4gICAgfVxuICB9O1xuXG4gIFRhYlBhbmUucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgaWYgKHRoaXNbJ2luJ10pIHtcbiAgICAgIC8vIEluIGxpZXUgb2YgdGhlIGFjdGlvbiBldmVudCBmaXJpbmcuXG4gICAgICB0aGlzLmhhbmRsZUV4aXRlZCgpO1xuICAgIH1cbiAgfTtcblxuICBUYWJQYW5lLnByb3RvdHlwZS5oYW5kbGVFbnRlciA9IGZ1bmN0aW9uIGhhbmRsZUVudGVyKCkge1xuICAgIHZhciB0YWJDb250ZW50ID0gdGhpcy5jb250ZXh0LiRic190YWJDb250ZW50O1xuICAgIGlmICghdGFiQ29udGVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXNbJ2luJ10gPSB0YWJDb250ZW50Lm9uUGFuZUVudGVyKHRoaXMsIHRoaXMucHJvcHMuZXZlbnRLZXkpO1xuICB9O1xuXG4gIFRhYlBhbmUucHJvdG90eXBlLmhhbmRsZUV4aXRlZCA9IGZ1bmN0aW9uIGhhbmRsZUV4aXRlZCgpIHtcbiAgICB2YXIgdGFiQ29udGVudCA9IHRoaXMuY29udGV4dC4kYnNfdGFiQ29udGVudDtcbiAgICBpZiAoIXRhYkNvbnRlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0YWJDb250ZW50Lm9uUGFuZUV4aXRlZCh0aGlzKTtcbiAgICB0aGlzWydpbiddID0gZmFsc2U7XG4gIH07XG5cbiAgVGFiUGFuZS5wcm90b3R5cGUuZ2V0QW5pbWF0aW9uID0gZnVuY3Rpb24gZ2V0QW5pbWF0aW9uKCkge1xuICAgIGlmICh0aGlzLnByb3BzLmFuaW1hdGlvbiAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5hbmltYXRpb247XG4gICAgfVxuXG4gICAgdmFyIHRhYkNvbnRlbnQgPSB0aGlzLmNvbnRleHQuJGJzX3RhYkNvbnRlbnQ7XG4gICAgcmV0dXJuIHRhYkNvbnRlbnQgJiYgdGFiQ29udGVudC5hbmltYXRpb247XG4gIH07XG5cbiAgVGFiUGFuZS5wcm90b3R5cGUuaXNBY3RpdmUgPSBmdW5jdGlvbiBpc0FjdGl2ZSgpIHtcbiAgICB2YXIgdGFiQ29udGVudCA9IHRoaXMuY29udGV4dC4kYnNfdGFiQ29udGVudDtcbiAgICB2YXIgYWN0aXZlS2V5ID0gdGFiQ29udGVudCAmJiB0YWJDb250ZW50LmFjdGl2ZUtleTtcblxuICAgIHJldHVybiB0aGlzLnByb3BzLmV2ZW50S2V5ID09PSBhY3RpdmVLZXk7XG4gIH07XG5cbiAgVGFiUGFuZS5wcm90b3R5cGUuc2hvdWxkQmVJbiA9IGZ1bmN0aW9uIHNob3VsZEJlSW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QW5pbWF0aW9uKCkgJiYgdGhpcy5pc0FjdGl2ZSgpO1xuICB9O1xuXG4gIFRhYlBhbmUucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgZXZlbnRLZXkgPSBfcHJvcHMuZXZlbnRLZXksXG4gICAgICAgIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWUsXG4gICAgICAgIG9uRW50ZXIgPSBfcHJvcHMub25FbnRlcixcbiAgICAgICAgb25FbnRlcmluZyA9IF9wcm9wcy5vbkVudGVyaW5nLFxuICAgICAgICBvbkVudGVyZWQgPSBfcHJvcHMub25FbnRlcmVkLFxuICAgICAgICBvbkV4aXQgPSBfcHJvcHMub25FeGl0LFxuICAgICAgICBvbkV4aXRpbmcgPSBfcHJvcHMub25FeGl0aW5nLFxuICAgICAgICBvbkV4aXRlZCA9IF9wcm9wcy5vbkV4aXRlZCxcbiAgICAgICAgcHJvcHNNb3VudE9uRW50ZXIgPSBfcHJvcHMubW91bnRPbkVudGVyLFxuICAgICAgICBwcm9wc1VubW91bnRPbkV4aXQgPSBfcHJvcHMudW5tb3VudE9uRXhpdCxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnZXZlbnRLZXknLCAnY2xhc3NOYW1lJywgJ29uRW50ZXInLCAnb25FbnRlcmluZycsICdvbkVudGVyZWQnLCAnb25FeGl0JywgJ29uRXhpdGluZycsICdvbkV4aXRlZCcsICdtb3VudE9uRW50ZXInLCAndW5tb3VudE9uRXhpdCddKTtcbiAgICB2YXIgX2NvbnRleHQgPSB0aGlzLmNvbnRleHQsXG4gICAgICAgIHRhYkNvbnRlbnQgPSBfY29udGV4dC4kYnNfdGFiQ29udGVudCxcbiAgICAgICAgdGFiQ29udGFpbmVyID0gX2NvbnRleHQuJGJzX3RhYkNvbnRhaW5lcjtcblxuICAgIHZhciBfc3BsaXRCc1Byb3BzQW5kT21pdCA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzQW5kT21pdCkocHJvcHMsIFsnYW5pbWF0aW9uJ10pLFxuICAgICAgICBic1Byb3BzID0gX3NwbGl0QnNQcm9wc0FuZE9taXRbMF0sXG4gICAgICAgIGVsZW1lbnRQcm9wcyA9IF9zcGxpdEJzUHJvcHNBbmRPbWl0WzFdO1xuXG4gICAgdmFyIGFjdGl2ZSA9IHRoaXMuaXNBY3RpdmUoKTtcbiAgICB2YXIgYW5pbWF0aW9uID0gdGhpcy5nZXRBbmltYXRpb24oKTtcblxuICAgIHZhciBtb3VudE9uRW50ZXIgPSBwcm9wc01vdW50T25FbnRlciAhPSBudWxsID8gcHJvcHNNb3VudE9uRW50ZXIgOiB0YWJDb250ZW50ICYmIHRhYkNvbnRlbnQubW91bnRPbkVudGVyO1xuICAgIHZhciB1bm1vdW50T25FeGl0ID0gcHJvcHNVbm1vdW50T25FeGl0ICE9IG51bGwgPyBwcm9wc1VubW91bnRPbkV4aXQgOiB0YWJDb250ZW50ICYmIHRhYkNvbnRlbnQudW5tb3VudE9uRXhpdDtcblxuICAgIGlmICghYWN0aXZlICYmICFhbmltYXRpb24gJiYgdW5tb3VudE9uRXhpdCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIFRyYW5zaXRpb24gPSBhbmltYXRpb24gPT09IHRydWUgPyBfRmFkZTJbJ2RlZmF1bHQnXSA6IGFuaW1hdGlvbiB8fCBudWxsO1xuXG4gICAgaWYgKHRhYkNvbnRlbnQpIHtcbiAgICAgIGJzUHJvcHMuYnNDbGFzcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KSh0YWJDb250ZW50LCAncGFuZScpO1xuICAgIH1cblxuICAgIHZhciBjbGFzc2VzID0gKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgKDAsIF9ib290c3RyYXBVdGlscy5nZXRDbGFzc1NldCkoYnNQcm9wcyksIHtcbiAgICAgIGFjdGl2ZTogYWN0aXZlXG4gICAgfSk7XG5cbiAgICBpZiAodGFiQ29udGFpbmVyKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gKDAsIF93YXJuaW5nMlsnZGVmYXVsdCddKSghZWxlbWVudFByb3BzLmlkICYmICFlbGVtZW50UHJvcHNbJ2FyaWEtbGFiZWxsZWRieSddLCAnSW4gdGhlIGNvbnRleHQgb2YgYSBgPFRhYkNvbnRhaW5lcj5gLCBgPFRhYlBhbmVzPmAgYXJlIGdpdmVuICcgKyAnZ2VuZXJhdGVkIGBpZGAgYW5kIGBhcmlhLWxhYmVsbGVkYnlgIGF0dHJpYnV0ZXMgZm9yIHRoZSBzYWtlIG9mICcgKyAncHJvcGVyIGNvbXBvbmVudCBhY2Nlc3NpYmlsaXR5LiBBbnkgcHJvdmlkZWQgb25lcyB3aWxsIGJlIGlnbm9yZWQuICcgKyAnVG8gY29udHJvbCB0aGVzZSBhdHRyaWJ1dGVzIGRpcmVjdGx5IHByb3ZpZGUgYSBgZ2VuZXJhdGVDaGlsZElkYCAnICsgJ3Byb3AgdG8gdGhlIHBhcmVudCBgPFRhYkNvbnRhaW5lcj5gLicpIDogdm9pZCAwO1xuXG4gICAgICBlbGVtZW50UHJvcHMuaWQgPSB0YWJDb250YWluZXIuZ2V0UGFuZUlkKGV2ZW50S2V5KTtcbiAgICAgIGVsZW1lbnRQcm9wc1snYXJpYS1sYWJlbGxlZGJ5J10gPSB0YWJDb250YWluZXIuZ2V0VGFiSWQoZXZlbnRLZXkpO1xuICAgIH1cblxuICAgIHZhciBwYW5lID0gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ2RpdicsICgwLCBfZXh0ZW5kczNbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgcm9sZTogJ3RhYnBhbmVsJyxcbiAgICAgICdhcmlhLWhpZGRlbic6ICFhY3RpdmUsXG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcblxuICAgIGlmIChUcmFuc2l0aW9uKSB7XG4gICAgICB2YXIgZXhpdGluZyA9IHRhYkNvbnRlbnQgJiYgdGFiQ29udGVudC5leGl0aW5nO1xuXG4gICAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgIFRyYW5zaXRpb24sXG4gICAgICAgIHtcbiAgICAgICAgICAnaW4nOiBhY3RpdmUgJiYgIWV4aXRpbmcsXG4gICAgICAgICAgb25FbnRlcjogKDAsIF9jcmVhdGVDaGFpbmVkRnVuY3Rpb24yWydkZWZhdWx0J10pKHRoaXMuaGFuZGxlRW50ZXIsIG9uRW50ZXIpLFxuICAgICAgICAgIG9uRW50ZXJpbmc6IG9uRW50ZXJpbmcsXG4gICAgICAgICAgb25FbnRlcmVkOiBvbkVudGVyZWQsXG4gICAgICAgICAgb25FeGl0OiBvbkV4aXQsXG4gICAgICAgICAgb25FeGl0aW5nOiBvbkV4aXRpbmcsXG4gICAgICAgICAgb25FeGl0ZWQ6ICgwLCBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMlsnZGVmYXVsdCddKSh0aGlzLmhhbmRsZUV4aXRlZCwgb25FeGl0ZWQpLFxuICAgICAgICAgIG1vdW50T25FbnRlcjogbW91bnRPbkVudGVyLFxuICAgICAgICAgIHVubW91bnRPbkV4aXQ6IHVubW91bnRPbkV4aXRcbiAgICAgICAgfSxcbiAgICAgICAgcGFuZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFuZTtcbiAgfTtcblxuICByZXR1cm4gVGFiUGFuZTtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cblRhYlBhbmUucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuVGFiUGFuZS5jb250ZXh0VHlwZXMgPSBjb250ZXh0VHlwZXM7XG5UYWJQYW5lLmNoaWxkQ29udGV4dFR5cGVzID0gY2hpbGRDb250ZXh0VHlwZXM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ3RhYi1wYW5lJywgVGFiUGFuZSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczMgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHM0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczMpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzL2Jvb3RzdHJhcFV0aWxzJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgc3RyaXBlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBib3JkZXJlZDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sLFxuICBjb25kZW5zZWQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgaG92ZXI6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uYm9vbCxcbiAgcmVzcG9uc2l2ZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBib3JkZXJlZDogZmFsc2UsXG4gIGNvbmRlbnNlZDogZmFsc2UsXG4gIGhvdmVyOiBmYWxzZSxcbiAgcmVzcG9uc2l2ZTogZmFsc2UsXG4gIHN0cmlwZWQ6IGZhbHNlXG59O1xuXG52YXIgVGFibGUgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICAoMCwgX2luaGVyaXRzM1snZGVmYXVsdCddKShUYWJsZSwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gVGFibGUoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgVGFibGUpO1xuICAgIHJldHVybiAoMCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zWydkZWZhdWx0J10pKHRoaXMsIF9SZWFjdCRDb21wb25lbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBUYWJsZS5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfZXh0ZW5kczI7XG5cbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgc3RyaXBlZCA9IF9wcm9wcy5zdHJpcGVkLFxuICAgICAgICBib3JkZXJlZCA9IF9wcm9wcy5ib3JkZXJlZCxcbiAgICAgICAgY29uZGVuc2VkID0gX3Byb3BzLmNvbmRlbnNlZCxcbiAgICAgICAgaG92ZXIgPSBfcHJvcHMuaG92ZXIsXG4gICAgICAgIHJlc3BvbnNpdmUgPSBfcHJvcHMucmVzcG9uc2l2ZSxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnc3RyaXBlZCcsICdib3JkZXJlZCcsICdjb25kZW5zZWQnLCAnaG92ZXInLCAncmVzcG9uc2l2ZScsICdjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKSwgKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdzdHJpcGVkJyldID0gc3RyaXBlZCwgX2V4dGVuZHMyWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnYm9yZGVyZWQnKV0gPSBib3JkZXJlZCwgX2V4dGVuZHMyWygwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAnY29uZGVuc2VkJyldID0gY29uZGVuc2VkLCBfZXh0ZW5kczJbKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdob3ZlcicpXSA9IGhvdmVyLCBfZXh0ZW5kczIpKTtcblxuICAgIHZhciB0YWJsZSA9IF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCd0YWJsZScsICgwLCBfZXh0ZW5kczRbJ2RlZmF1bHQnXSkoe30sIGVsZW1lbnRQcm9wcywge1xuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyWydkZWZhdWx0J10pKGNsYXNzTmFtZSwgY2xhc3NlcylcbiAgICB9KSk7XG5cbiAgICBpZiAocmVzcG9uc2l2ZSkge1xuICAgICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgeyBjbGFzc05hbWU6ICgwLCBfYm9vdHN0cmFwVXRpbHMucHJlZml4KShic1Byb3BzLCAncmVzcG9uc2l2ZScpIH0sXG4gICAgICAgIHRhYmxlXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0YWJsZTtcbiAgfTtcblxuICByZXR1cm4gVGFibGU7XG59KF9yZWFjdDJbJ2RlZmF1bHQnXS5Db21wb25lbnQpO1xuXG5UYWJsZS5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5UYWJsZS5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ3RhYmxlJywgVGFibGUpO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXMnKTtcblxudmFyIF9vYmplY3RXaXRob3V0UHJvcGVydGllczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vYmplY3RXaXRob3V0UHJvcGVydGllczIpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfaXNSZXF1aXJlZEZvckExMXkgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9pc1JlcXVpcmVkRm9yQTExeScpO1xuXG52YXIgX2lzUmVxdWlyZWRGb3JBMTF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2lzUmVxdWlyZWRGb3JBMTF5KTtcblxudmFyIF91bmNvbnRyb2xsYWJsZSA9IHJlcXVpcmUoJ3VuY29udHJvbGxhYmxlJyk7XG5cbnZhciBfdW5jb250cm9sbGFibGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdW5jb250cm9sbGFibGUpO1xuXG52YXIgX05hdiA9IHJlcXVpcmUoJy4vTmF2Jyk7XG5cbnZhciBfTmF2MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05hdik7XG5cbnZhciBfTmF2SXRlbSA9IHJlcXVpcmUoJy4vTmF2SXRlbScpO1xuXG52YXIgX05hdkl0ZW0yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTmF2SXRlbSk7XG5cbnZhciBfVGFiQ29udGFpbmVyID0gcmVxdWlyZSgnLi9UYWJDb250YWluZXInKTtcblxudmFyIF9UYWJDb250YWluZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVGFiQ29udGFpbmVyKTtcblxudmFyIF9UYWJDb250ZW50ID0gcmVxdWlyZSgnLi9UYWJDb250ZW50Jyk7XG5cbnZhciBfVGFiQ29udGVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UYWJDb250ZW50KTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxudmFyIF9WYWxpZENvbXBvbmVudENoaWxkcmVuID0gcmVxdWlyZSgnLi91dGlscy9WYWxpZENvbXBvbmVudENoaWxkcmVuJyk7XG5cbnZhciBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9WYWxpZENvbXBvbmVudENoaWxkcmVuKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgVGFiQ29udGFpbmVyID0gX1RhYkNvbnRhaW5lcjJbJ2RlZmF1bHQnXS5Db250cm9sbGVkQ29tcG9uZW50O1xuXG52YXIgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogTWFyayB0aGUgVGFiIHdpdGggYSBtYXRjaGluZyBgZXZlbnRLZXlgIGFzIGFjdGl2ZS5cbiAgICpcbiAgICogQGNvbnRyb2xsYWJsZSBvblNlbGVjdFxuICAgKi9cbiAgYWN0aXZlS2V5OiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmFueSxcblxuICAvKipcbiAgICogTmF2aWdhdGlvbiBzdHlsZVxuICAgKi9cbiAgYnNTdHlsZTogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZihbJ3RhYnMnLCAncGlsbHMnXSksXG5cbiAgYW5pbWF0aW9uOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgaWQ6ICgwLCBfaXNSZXF1aXJlZEZvckExMXkyWydkZWZhdWx0J10pKF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2ZUeXBlKFtfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZywgX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5udW1iZXJdKSksXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIHdoZW4gYSBUYWIgaXMgc2VsZWN0ZWQuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGZ1bmN0aW9uIChcbiAgICogXHRBbnkgZXZlbnRLZXksXG4gICAqIFx0U3ludGhldGljRXZlbnQgZXZlbnQ/XG4gICAqIClcbiAgICogYGBgXG4gICAqXG4gICAqIEBjb250cm9sbGFibGUgYWN0aXZlS2V5XG4gICAqL1xuICBvblNlbGVjdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5mdW5jLFxuXG4gIC8qKlxuICAgKiBXYWl0IHVudGlsIHRoZSBmaXJzdCBcImVudGVyXCIgdHJhbnNpdGlvbiB0byBtb3VudCB0YWJzIChhZGQgdGhlbSB0byB0aGUgRE9NKVxuICAgKi9cbiAgbW91bnRPbkVudGVyOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLmJvb2wsXG5cbiAgLyoqXG4gICAqIFVubW91bnQgdGFicyAocmVtb3ZlIGl0IGZyb20gdGhlIERPTSkgd2hlbiBpdCBpcyBubyBsb25nZXIgdmlzaWJsZVxuICAgKi9cbiAgdW5tb3VudE9uRXhpdDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5ib29sXG59O1xuXG52YXIgZGVmYXVsdFByb3BzID0ge1xuICBic1N0eWxlOiAndGFicycsXG4gIGFuaW1hdGlvbjogdHJ1ZSxcbiAgbW91bnRPbkVudGVyOiBmYWxzZSxcbiAgdW5tb3VudE9uRXhpdDogZmFsc2Vcbn07XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRBY3RpdmVLZXkoY2hpbGRyZW4pIHtcbiAgdmFyIGRlZmF1bHRBY3RpdmVLZXkgPSB2b2lkIDA7XG4gIF9WYWxpZENvbXBvbmVudENoaWxkcmVuMlsnZGVmYXVsdCddLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIGlmIChkZWZhdWx0QWN0aXZlS2V5ID09IG51bGwpIHtcbiAgICAgIGRlZmF1bHRBY3RpdmVLZXkgPSBjaGlsZC5wcm9wcy5ldmVudEtleTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBkZWZhdWx0QWN0aXZlS2V5O1xufVxuXG52YXIgVGFicyA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKFRhYnMsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFRhYnMoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgVGFicyk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIFRhYnMucHJvdG90eXBlLnJlbmRlclRhYiA9IGZ1bmN0aW9uIHJlbmRlclRhYihjaGlsZCkge1xuICAgIHZhciBfY2hpbGQkcHJvcHMgPSBjaGlsZC5wcm9wcyxcbiAgICAgICAgdGl0bGUgPSBfY2hpbGQkcHJvcHMudGl0bGUsXG4gICAgICAgIGV2ZW50S2V5ID0gX2NoaWxkJHByb3BzLmV2ZW50S2V5LFxuICAgICAgICBkaXNhYmxlZCA9IF9jaGlsZCRwcm9wcy5kaXNhYmxlZCxcbiAgICAgICAgdGFiQ2xhc3NOYW1lID0gX2NoaWxkJHByb3BzLnRhYkNsYXNzTmFtZTtcblxuICAgIGlmICh0aXRsZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBfTmF2SXRlbTJbJ2RlZmF1bHQnXSxcbiAgICAgIHtcbiAgICAgICAgZXZlbnRLZXk6IGV2ZW50S2V5LFxuICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgIGNsYXNzTmFtZTogdGFiQ2xhc3NOYW1lXG4gICAgICB9LFxuICAgICAgdGl0bGVcbiAgICApO1xuICB9O1xuXG4gIFRhYnMucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgaWQgPSBfcHJvcHMuaWQsXG4gICAgICAgIG9uU2VsZWN0ID0gX3Byb3BzLm9uU2VsZWN0LFxuICAgICAgICBhbmltYXRpb24gPSBfcHJvcHMuYW5pbWF0aW9uLFxuICAgICAgICBtb3VudE9uRW50ZXIgPSBfcHJvcHMubW91bnRPbkVudGVyLFxuICAgICAgICB1bm1vdW50T25FeGl0ID0gX3Byb3BzLnVubW91bnRPbkV4aXQsXG4gICAgICAgIGJzQ2xhc3MgPSBfcHJvcHMuYnNDbGFzcyxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGUgPSBfcHJvcHMuc3R5bGUsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBfcHJvcHMkYWN0aXZlS2V5ID0gX3Byb3BzLmFjdGl2ZUtleSxcbiAgICAgICAgYWN0aXZlS2V5ID0gX3Byb3BzJGFjdGl2ZUtleSA9PT0gdW5kZWZpbmVkID8gZ2V0RGVmYXVsdEFjdGl2ZUtleShjaGlsZHJlbikgOiBfcHJvcHMkYWN0aXZlS2V5LFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydpZCcsICdvblNlbGVjdCcsICdhbmltYXRpb24nLCAnbW91bnRPbkVudGVyJywgJ3VubW91bnRPbkV4aXQnLCAnYnNDbGFzcycsICdjbGFzc05hbWUnLCAnc3R5bGUnLCAnY2hpbGRyZW4nLCAnYWN0aXZlS2V5J10pO1xuXG5cbiAgICByZXR1cm4gX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICBUYWJDb250YWluZXIsXG4gICAgICB7XG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgYWN0aXZlS2V5OiBhY3RpdmVLZXksXG4gICAgICAgIG9uU2VsZWN0OiBvblNlbGVjdCxcbiAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsXG4gICAgICAgIHN0eWxlOiBzdHlsZVxuICAgICAgfSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgX05hdjJbJ2RlZmF1bHQnXSxcbiAgICAgICAgICAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBwcm9wcywge1xuICAgICAgICAgICAgcm9sZTogJ3RhYmxpc3QnXG4gICAgICAgICAgfSksXG4gICAgICAgICAgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yWydkZWZhdWx0J10ubWFwKGNoaWxkcmVuLCB0aGlzLnJlbmRlclRhYilcbiAgICAgICAgKSxcbiAgICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgX1RhYkNvbnRlbnQyWydkZWZhdWx0J10sXG4gICAgICAgICAge1xuICAgICAgICAgICAgYnNDbGFzczogYnNDbGFzcyxcbiAgICAgICAgICAgIGFuaW1hdGlvbjogYW5pbWF0aW9uLFxuICAgICAgICAgICAgbW91bnRPbkVudGVyOiBtb3VudE9uRW50ZXIsXG4gICAgICAgICAgICB1bm1vdW50T25FeGl0OiB1bm1vdW50T25FeGl0XG4gICAgICAgICAgfSxcbiAgICAgICAgICBjaGlsZHJlblxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gVGFicztcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cblRhYnMucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuVGFicy5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbigwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ3RhYicsIFRhYnMpO1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSAoMCwgX3VuY29udHJvbGxhYmxlMlsnZGVmYXVsdCddKShUYWJzLCB7IGFjdGl2ZUtleTogJ29uU2VsZWN0JyB9KTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9TYWZlQW5jaG9yID0gcmVxdWlyZSgnLi9TYWZlQW5jaG9yJyk7XG5cbnZhciBfU2FmZUFuY2hvcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TYWZlQW5jaG9yKTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICBzcmM6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICBhbHQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLFxuICBocmVmOiBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLnN0cmluZ1xufTtcblxudmFyIFRodW1ibmFpbCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKFRodW1ibmFpbCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gVGh1bWJuYWlsKCkge1xuICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIFRodW1ibmFpbCk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIFRodW1ibmFpbC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBzcmMgPSBfcHJvcHMuc3JjLFxuICAgICAgICBhbHQgPSBfcHJvcHMuYWx0LFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbixcbiAgICAgICAgcHJvcHMgPSAoMCwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzM1snZGVmYXVsdCddKShfcHJvcHMsIFsnc3JjJywgJ2FsdCcsICdjbGFzc05hbWUnLCAnY2hpbGRyZW4nXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIENvbXBvbmVudCA9IGVsZW1lbnRQcm9wcy5ocmVmID8gX1NhZmVBbmNob3IyWydkZWZhdWx0J10gOiAnZGl2JztcbiAgICB2YXIgY2xhc3NlcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuZ2V0Q2xhc3NTZXQpKGJzUHJvcHMpO1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgQ29tcG9uZW50LFxuICAgICAgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzMlsnZGVmYXVsdCddKShjbGFzc05hbWUsIGNsYXNzZXMpXG4gICAgICB9KSxcbiAgICAgIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KCdpbWcnLCB7IHNyYzogc3JjLCBhbHQ6IGFsdCB9KSxcbiAgICAgIGNoaWxkcmVuICYmIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgeyBjbGFzc05hbWU6ICdjYXB0aW9uJyB9LFxuICAgICAgICBjaGlsZHJlblxuICAgICAgKVxuICAgICk7XG4gIH07XG5cbiAgcmV0dXJuIFRodW1ibmFpbDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cblRodW1ibmFpbC5wcm9wVHlwZXMgPSBwcm9wVHlwZXM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ3RodW1ibmFpbCcsIFRodW1ibmFpbCk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kczMgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvZXh0ZW5kcycpO1xuXG52YXIgX2V4dGVuZHM0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZXh0ZW5kczMpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllcycpO1xuXG52YXIgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzMik7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2syID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrJyk7XG5cbnZhciBfY2xhc3NDYWxsQ2hlY2szID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NDYWxsQ2hlY2syKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuJyk7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMik7XG5cbnZhciBfaW5oZXJpdHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2luaGVyaXRzJyk7XG5cbnZhciBfaW5oZXJpdHMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaW5oZXJpdHMyKTtcblxudmFyIF9jbGFzc25hbWVzID0gcmVxdWlyZSgnY2xhc3NuYW1lcycpO1xuXG52YXIgX2NsYXNzbmFtZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY2xhc3NuYW1lcyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfaXNSZXF1aXJlZEZvckExMXkgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9pc1JlcXVpcmVkRm9yQTExeScpO1xuXG52YXIgX2lzUmVxdWlyZWRGb3JBMTF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2lzUmVxdWlyZWRGb3JBMTF5KTtcblxudmFyIF9ib290c3RyYXBVdGlscyA9IHJlcXVpcmUoJy4vdXRpbHMvYm9vdHN0cmFwVXRpbHMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgcHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQW4gaHRtbCBpZCBhdHRyaWJ1dGUsIG5lY2Vzc2FyeSBmb3IgYWNjZXNzaWJpbGl0eVxuICAgKiBAdHlwZSB7c3RyaW5nfG51bWJlcn1cbiAgICogQHJlcXVpcmVkXG4gICAqL1xuICBpZDogKDAsIF9pc1JlcXVpcmVkRm9yQTExeTJbJ2RlZmF1bHQnXSkoX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZlR5cGUoW19wcm9wVHlwZXMyWydkZWZhdWx0J10uc3RyaW5nLCBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlcl0pKSxcblxuICAvKipcbiAgICogU2V0cyB0aGUgZGlyZWN0aW9uIHRoZSBUb29sdGlwIGlzIHBvc2l0aW9uZWQgdG93YXJkcy5cbiAgICovXG4gIHBsYWNlbWVudDogX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5vbmVPZihbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddKSxcblxuICAvKipcbiAgICogVGhlIFwidG9wXCIgcG9zaXRpb24gdmFsdWUgZm9yIHRoZSBUb29sdGlwLlxuICAgKi9cbiAgcG9zaXRpb25Ub3A6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2ZUeXBlKFtfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlciwgX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmddKSxcbiAgLyoqXG4gICAqIFRoZSBcImxlZnRcIiBwb3NpdGlvbiB2YWx1ZSBmb3IgdGhlIFRvb2x0aXAuXG4gICAqL1xuICBwb3NpdGlvbkxlZnQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2ZUeXBlKFtfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlciwgX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmddKSxcblxuICAvKipcbiAgICogVGhlIFwidG9wXCIgcG9zaXRpb24gdmFsdWUgZm9yIHRoZSBUb29sdGlwIGFycm93LlxuICAgKi9cbiAgYXJyb3dPZmZzZXRUb3A6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2ZUeXBlKFtfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlciwgX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmddKSxcbiAgLyoqXG4gICAqIFRoZSBcImxlZnRcIiBwb3NpdGlvbiB2YWx1ZSBmb3IgdGhlIFRvb2x0aXAgYXJyb3cuXG4gICAqL1xuICBhcnJvd09mZnNldExlZnQ6IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2ZUeXBlKFtfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm51bWJlciwgX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmddKVxufTtcblxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgcGxhY2VtZW50OiAncmlnaHQnXG59O1xuXG52YXIgVG9vbHRpcCA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKFRvb2x0aXAsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFRvb2x0aXAoKSB7XG4gICAgKDAsIF9jbGFzc0NhbGxDaGVjazNbJ2RlZmF1bHQnXSkodGhpcywgVG9vbHRpcCk7XG4gICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgfVxuXG4gIFRvb2x0aXAucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICB2YXIgX2V4dGVuZHMyO1xuXG4gICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgIHBsYWNlbWVudCA9IF9wcm9wcy5wbGFjZW1lbnQsXG4gICAgICAgIHBvc2l0aW9uVG9wID0gX3Byb3BzLnBvc2l0aW9uVG9wLFxuICAgICAgICBwb3NpdGlvbkxlZnQgPSBfcHJvcHMucG9zaXRpb25MZWZ0LFxuICAgICAgICBhcnJvd09mZnNldFRvcCA9IF9wcm9wcy5hcnJvd09mZnNldFRvcCxcbiAgICAgICAgYXJyb3dPZmZzZXRMZWZ0ID0gX3Byb3BzLmFycm93T2Zmc2V0TGVmdCxcbiAgICAgICAgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZSxcbiAgICAgICAgc3R5bGUgPSBfcHJvcHMuc3R5bGUsXG4gICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydwbGFjZW1lbnQnLCAncG9zaXRpb25Ub3AnLCAncG9zaXRpb25MZWZ0JywgJ2Fycm93T2Zmc2V0VG9wJywgJ2Fycm93T2Zmc2V0TGVmdCcsICdjbGFzc05hbWUnLCAnc3R5bGUnLCAnY2hpbGRyZW4nXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKSwgKF9leHRlbmRzMiA9IHt9LCBfZXh0ZW5kczJbcGxhY2VtZW50XSA9IHRydWUsIF9leHRlbmRzMikpO1xuXG4gICAgdmFyIG91dGVyU3R5bGUgPSAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHtcbiAgICAgIHRvcDogcG9zaXRpb25Ub3AsXG4gICAgICBsZWZ0OiBwb3NpdGlvbkxlZnRcbiAgICB9LCBzdHlsZSk7XG5cbiAgICB2YXIgYXJyb3dTdHlsZSA9IHtcbiAgICAgIHRvcDogYXJyb3dPZmZzZXRUb3AsXG4gICAgICBsZWZ0OiBhcnJvd09mZnNldExlZnRcbiAgICB9O1xuXG4gICAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5jcmVhdGVFbGVtZW50KFxuICAgICAgJ2RpdicsXG4gICAgICAoMCwgX2V4dGVuZHM0WydkZWZhdWx0J10pKHt9LCBlbGVtZW50UHJvcHMsIHtcbiAgICAgICAgcm9sZTogJ3Rvb2x0aXAnLFxuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKSxcbiAgICAgICAgc3R5bGU6IG91dGVyU3R5bGVcbiAgICAgIH0pLFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoJ2RpdicsIHsgY2xhc3NOYW1lOiAoMCwgX2Jvb3RzdHJhcFV0aWxzLnByZWZpeCkoYnNQcm9wcywgJ2Fycm93JyksIHN0eWxlOiBhcnJvd1N0eWxlIH0pLFxuICAgICAgX3JlYWN0MlsnZGVmYXVsdCddLmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICdkaXYnLFxuICAgICAgICB7IGNsYXNzTmFtZTogKDAsIF9ib290c3RyYXBVdGlscy5wcmVmaXgpKGJzUHJvcHMsICdpbm5lcicpIH0sXG4gICAgICAgIGNoaWxkcmVuXG4gICAgICApXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gVG9vbHRpcDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cblRvb2x0aXAucHJvcFR5cGVzID0gcHJvcFR5cGVzO1xuVG9vbHRpcC5kZWZhdWx0UHJvcHMgPSBkZWZhdWx0UHJvcHM7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ3Rvb2x0aXAnLCBUb29sdGlwKTtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9leHRlbmRzJyk7XG5cbnZhciBfZXh0ZW5kczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9leHRlbmRzMik7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzJyk7XG5cbnZhciBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3NDYWxsQ2hlY2snKTtcblxudmFyIF9jbGFzc0NhbGxDaGVjazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc0NhbGxDaGVjazIpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4nKTtcblxudmFyIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4yKTtcblxudmFyIF9pbmhlcml0czIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvaW5oZXJpdHMnKTtcblxudmFyIF9pbmhlcml0czMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmhlcml0czIpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gcmVxdWlyZSgnLi91dGlscy9ib290c3RyYXBVdGlscycpO1xuXG52YXIgX1N0eWxlQ29uZmlnID0gcmVxdWlyZSgnLi91dGlscy9TdHlsZUNvbmZpZycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciBXZWxsID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgKDAsIF9pbmhlcml0czNbJ2RlZmF1bHQnXSkoV2VsbCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gV2VsbCgpIHtcbiAgICAoMCwgX2NsYXNzQ2FsbENoZWNrM1snZGVmYXVsdCddKSh0aGlzLCBXZWxsKTtcbiAgICByZXR1cm4gKDAsIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuM1snZGVmYXVsdCddKSh0aGlzLCBfUmVhY3QkQ29tcG9uZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpO1xuICB9XG5cbiAgV2VsbC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lLFxuICAgICAgICBwcm9wcyA9ICgwLCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMzWydkZWZhdWx0J10pKF9wcm9wcywgWydjbGFzc05hbWUnXSk7XG5cbiAgICB2YXIgX3NwbGl0QnNQcm9wcyA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuc3BsaXRCc1Byb3BzKShwcm9wcyksXG4gICAgICAgIGJzUHJvcHMgPSBfc3BsaXRCc1Byb3BzWzBdLFxuICAgICAgICBlbGVtZW50UHJvcHMgPSBfc3BsaXRCc1Byb3BzWzFdO1xuXG4gICAgdmFyIGNsYXNzZXMgPSAoMCwgX2Jvb3RzdHJhcFV0aWxzLmdldENsYXNzU2V0KShic1Byb3BzKTtcblxuICAgIHJldHVybiBfcmVhY3QyWydkZWZhdWx0J10uY3JlYXRlRWxlbWVudCgnZGl2JywgKDAsIF9leHRlbmRzM1snZGVmYXVsdCddKSh7fSwgZWxlbWVudFByb3BzLCB7XG4gICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczJbJ2RlZmF1bHQnXSkoY2xhc3NOYW1lLCBjbGFzc2VzKVxuICAgIH0pKTtcbiAgfTtcblxuICByZXR1cm4gV2VsbDtcbn0oX3JlYWN0MlsnZGVmYXVsdCddLkNvbXBvbmVudCk7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9ICgwLCBfYm9vdHN0cmFwVXRpbHMuYnNDbGFzcykoJ3dlbGwnLCAoMCwgX2Jvb3RzdHJhcFV0aWxzLmJzU2l6ZXMpKFtfU3R5bGVDb25maWcuU2l6ZS5MQVJHRSwgX1N0eWxlQ29uZmlnLlNpemUuU01BTExdLCBXZWxsKSk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLnV0aWxzID0gZXhwb3J0cy5XZWxsID0gZXhwb3J0cy5Ub29sdGlwID0gZXhwb3J0cy5UaHVtYm5haWwgPSBleHBvcnRzLlRhYnMgPSBleHBvcnRzLlRhYlBhbmUgPSBleHBvcnRzLlRhYmxlID0gZXhwb3J0cy5UYWJDb250ZW50ID0gZXhwb3J0cy5UYWJDb250YWluZXIgPSBleHBvcnRzLlRhYiA9IGV4cG9ydHMuU3BsaXRCdXR0b24gPSBleHBvcnRzLlNhZmVBbmNob3IgPSBleHBvcnRzLlJvdyA9IGV4cG9ydHMuUmVzcG9uc2l2ZUVtYmVkID0gZXhwb3J0cy5SYWRpbyA9IGV4cG9ydHMuUHJvZ3Jlc3NCYXIgPSBleHBvcnRzLlBvcG92ZXIgPSBleHBvcnRzLlBhbmVsR3JvdXAgPSBleHBvcnRzLlBhbmVsID0gZXhwb3J0cy5QYWdpbmF0aW9uQnV0dG9uID0gZXhwb3J0cy5QYWdpbmF0aW9uID0gZXhwb3J0cy5QYWdlciA9IGV4cG9ydHMuUGFnZUl0ZW0gPSBleHBvcnRzLlBhZ2VIZWFkZXIgPSBleHBvcnRzLk92ZXJsYXlUcmlnZ2VyID0gZXhwb3J0cy5PdmVybGF5ID0gZXhwb3J0cy5OYXZJdGVtID0gZXhwb3J0cy5OYXZEcm9wZG93biA9IGV4cG9ydHMuTmF2YmFyQnJhbmQgPSBleHBvcnRzLk5hdmJhciA9IGV4cG9ydHMuTmF2ID0gZXhwb3J0cy5Nb2RhbFRpdGxlID0gZXhwb3J0cy5Nb2RhbEhlYWRlciA9IGV4cG9ydHMuTW9kYWxGb290ZXIgPSBleHBvcnRzLk1vZGFsQm9keSA9IGV4cG9ydHMuTW9kYWwgPSBleHBvcnRzLk1lbnVJdGVtID0gZXhwb3J0cy5NZWRpYSA9IGV4cG9ydHMuTGlzdEdyb3VwSXRlbSA9IGV4cG9ydHMuTGlzdEdyb3VwID0gZXhwb3J0cy5MYWJlbCA9IGV4cG9ydHMuSnVtYm90cm9uID0gZXhwb3J0cy5JbnB1dEdyb3VwID0gZXhwb3J0cy5JbWFnZSA9IGV4cG9ydHMuSGVscEJsb2NrID0gZXhwb3J0cy5HcmlkID0gZXhwb3J0cy5HbHlwaGljb24gPSBleHBvcnRzLkZvcm1Hcm91cCA9IGV4cG9ydHMuRm9ybUNvbnRyb2wgPSBleHBvcnRzLkZvcm0gPSBleHBvcnRzLkZhZGUgPSBleHBvcnRzLkRyb3Bkb3duQnV0dG9uID0gZXhwb3J0cy5Ecm9wZG93biA9IGV4cG9ydHMuQ29sbGFwc2UgPSBleHBvcnRzLkNvbCA9IGV4cG9ydHMuQ29udHJvbExhYmVsID0gZXhwb3J0cy5DbGVhcmZpeCA9IGV4cG9ydHMuQ2hlY2tib3ggPSBleHBvcnRzLkNhcm91c2VsSXRlbSA9IGV4cG9ydHMuQ2Fyb3VzZWwgPSBleHBvcnRzLkJ1dHRvblRvb2xiYXIgPSBleHBvcnRzLkJ1dHRvbkdyb3VwID0gZXhwb3J0cy5CdXR0b24gPSBleHBvcnRzLkJyZWFkY3J1bWJJdGVtID0gZXhwb3J0cy5CcmVhZGNydW1iID0gZXhwb3J0cy5CYWRnZSA9IGV4cG9ydHMuQWxlcnQgPSBleHBvcnRzLkFjY29yZGlvbiA9IHVuZGVmaW5lZDtcblxudmFyIF9BY2NvcmRpb24yID0gcmVxdWlyZSgnLi9BY2NvcmRpb24nKTtcblxudmFyIF9BY2NvcmRpb24zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQWNjb3JkaW9uMik7XG5cbnZhciBfQWxlcnQyID0gcmVxdWlyZSgnLi9BbGVydCcpO1xuXG52YXIgX0FsZXJ0MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0FsZXJ0Mik7XG5cbnZhciBfQmFkZ2UyID0gcmVxdWlyZSgnLi9CYWRnZScpO1xuXG52YXIgX0JhZGdlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0JhZGdlMik7XG5cbnZhciBfQnJlYWRjcnVtYjIgPSByZXF1aXJlKCcuL0JyZWFkY3J1bWInKTtcblxudmFyIF9CcmVhZGNydW1iMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0JyZWFkY3J1bWIyKTtcblxudmFyIF9CcmVhZGNydW1iSXRlbTIgPSByZXF1aXJlKCcuL0JyZWFkY3J1bWJJdGVtJyk7XG5cbnZhciBfQnJlYWRjcnVtYkl0ZW0zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQnJlYWRjcnVtYkl0ZW0yKTtcblxudmFyIF9CdXR0b24yID0gcmVxdWlyZSgnLi9CdXR0b24nKTtcblxudmFyIF9CdXR0b24zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQnV0dG9uMik7XG5cbnZhciBfQnV0dG9uR3JvdXAyID0gcmVxdWlyZSgnLi9CdXR0b25Hcm91cCcpO1xuXG52YXIgX0J1dHRvbkdyb3VwMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0J1dHRvbkdyb3VwMik7XG5cbnZhciBfQnV0dG9uVG9vbGJhcjIgPSByZXF1aXJlKCcuL0J1dHRvblRvb2xiYXInKTtcblxudmFyIF9CdXR0b25Ub29sYmFyMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0J1dHRvblRvb2xiYXIyKTtcblxudmFyIF9DYXJvdXNlbDIgPSByZXF1aXJlKCcuL0Nhcm91c2VsJyk7XG5cbnZhciBfQ2Fyb3VzZWwzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2Fyb3VzZWwyKTtcblxudmFyIF9DYXJvdXNlbEl0ZW0yID0gcmVxdWlyZSgnLi9DYXJvdXNlbEl0ZW0nKTtcblxudmFyIF9DYXJvdXNlbEl0ZW0zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ2Fyb3VzZWxJdGVtMik7XG5cbnZhciBfQ2hlY2tib3gyID0gcmVxdWlyZSgnLi9DaGVja2JveCcpO1xuXG52YXIgX0NoZWNrYm94MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NoZWNrYm94Mik7XG5cbnZhciBfQ2xlYXJmaXgyID0gcmVxdWlyZSgnLi9DbGVhcmZpeCcpO1xuXG52YXIgX0NsZWFyZml4MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NsZWFyZml4Mik7XG5cbnZhciBfQ29udHJvbExhYmVsMiA9IHJlcXVpcmUoJy4vQ29udHJvbExhYmVsJyk7XG5cbnZhciBfQ29udHJvbExhYmVsMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0NvbnRyb2xMYWJlbDIpO1xuXG52YXIgX0NvbDIgPSByZXF1aXJlKCcuL0NvbCcpO1xuXG52YXIgX0NvbDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Db2wyKTtcblxudmFyIF9Db2xsYXBzZTIgPSByZXF1aXJlKCcuL0NvbGxhcHNlJyk7XG5cbnZhciBfQ29sbGFwc2UzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfQ29sbGFwc2UyKTtcblxudmFyIF9Ecm9wZG93bjIgPSByZXF1aXJlKCcuL0Ryb3Bkb3duJyk7XG5cbnZhciBfRHJvcGRvd24zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRHJvcGRvd24yKTtcblxudmFyIF9Ecm9wZG93bkJ1dHRvbjIgPSByZXF1aXJlKCcuL0Ryb3Bkb3duQnV0dG9uJyk7XG5cbnZhciBfRHJvcGRvd25CdXR0b24zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRHJvcGRvd25CdXR0b24yKTtcblxudmFyIF9GYWRlMiA9IHJlcXVpcmUoJy4vRmFkZScpO1xuXG52YXIgX0ZhZGUzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfRmFkZTIpO1xuXG52YXIgX0Zvcm0yID0gcmVxdWlyZSgnLi9Gb3JtJyk7XG5cbnZhciBfRm9ybTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Gb3JtMik7XG5cbnZhciBfRm9ybUNvbnRyb2wyID0gcmVxdWlyZSgnLi9Gb3JtQ29udHJvbCcpO1xuXG52YXIgX0Zvcm1Db250cm9sMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Zvcm1Db250cm9sMik7XG5cbnZhciBfRm9ybUdyb3VwMiA9IHJlcXVpcmUoJy4vRm9ybUdyb3VwJyk7XG5cbnZhciBfRm9ybUdyb3VwMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0Zvcm1Hcm91cDIpO1xuXG52YXIgX0dseXBoaWNvbjIgPSByZXF1aXJlKCcuL0dseXBoaWNvbicpO1xuXG52YXIgX0dseXBoaWNvbjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9HbHlwaGljb24yKTtcblxudmFyIF9HcmlkMiA9IHJlcXVpcmUoJy4vR3JpZCcpO1xuXG52YXIgX0dyaWQzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfR3JpZDIpO1xuXG52YXIgX0hlbHBCbG9jazIgPSByZXF1aXJlKCcuL0hlbHBCbG9jaycpO1xuXG52YXIgX0hlbHBCbG9jazMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9IZWxwQmxvY2syKTtcblxudmFyIF9JbWFnZTIgPSByZXF1aXJlKCcuL0ltYWdlJyk7XG5cbnZhciBfSW1hZ2UzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfSW1hZ2UyKTtcblxudmFyIF9JbnB1dEdyb3VwMiA9IHJlcXVpcmUoJy4vSW5wdXRHcm91cCcpO1xuXG52YXIgX0lucHV0R3JvdXAzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfSW5wdXRHcm91cDIpO1xuXG52YXIgX0p1bWJvdHJvbjIgPSByZXF1aXJlKCcuL0p1bWJvdHJvbicpO1xuXG52YXIgX0p1bWJvdHJvbjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9KdW1ib3Ryb24yKTtcblxudmFyIF9MYWJlbDIgPSByZXF1aXJlKCcuL0xhYmVsJyk7XG5cbnZhciBfTGFiZWwzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTGFiZWwyKTtcblxudmFyIF9MaXN0R3JvdXAyID0gcmVxdWlyZSgnLi9MaXN0R3JvdXAnKTtcblxudmFyIF9MaXN0R3JvdXAzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTGlzdEdyb3VwMik7XG5cbnZhciBfTGlzdEdyb3VwSXRlbTIgPSByZXF1aXJlKCcuL0xpc3RHcm91cEl0ZW0nKTtcblxudmFyIF9MaXN0R3JvdXBJdGVtMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0xpc3RHcm91cEl0ZW0yKTtcblxudmFyIF9NZWRpYTIgPSByZXF1aXJlKCcuL01lZGlhJyk7XG5cbnZhciBfTWVkaWEzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTWVkaWEyKTtcblxudmFyIF9NZW51SXRlbTIgPSByZXF1aXJlKCcuL01lbnVJdGVtJyk7XG5cbnZhciBfTWVudUl0ZW0zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTWVudUl0ZW0yKTtcblxudmFyIF9Nb2RhbDIgPSByZXF1aXJlKCcuL01vZGFsJyk7XG5cbnZhciBfTW9kYWwzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTW9kYWwyKTtcblxudmFyIF9Nb2RhbEJvZHkyID0gcmVxdWlyZSgnLi9Nb2RhbEJvZHknKTtcblxudmFyIF9Nb2RhbEJvZHkzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTW9kYWxCb2R5Mik7XG5cbnZhciBfTW9kYWxGb290ZXIyID0gcmVxdWlyZSgnLi9Nb2RhbEZvb3RlcicpO1xuXG52YXIgX01vZGFsRm9vdGVyMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01vZGFsRm9vdGVyMik7XG5cbnZhciBfTW9kYWxIZWFkZXIyID0gcmVxdWlyZSgnLi9Nb2RhbEhlYWRlcicpO1xuXG52YXIgX01vZGFsSGVhZGVyMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01vZGFsSGVhZGVyMik7XG5cbnZhciBfTW9kYWxUaXRsZTIgPSByZXF1aXJlKCcuL01vZGFsVGl0bGUnKTtcblxudmFyIF9Nb2RhbFRpdGxlMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX01vZGFsVGl0bGUyKTtcblxudmFyIF9OYXYyID0gcmVxdWlyZSgnLi9OYXYnKTtcblxudmFyIF9OYXYzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTmF2Mik7XG5cbnZhciBfTmF2YmFyMiA9IHJlcXVpcmUoJy4vTmF2YmFyJyk7XG5cbnZhciBfTmF2YmFyMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX05hdmJhcjIpO1xuXG52YXIgX05hdmJhckJyYW5kMiA9IHJlcXVpcmUoJy4vTmF2YmFyQnJhbmQnKTtcblxudmFyIF9OYXZiYXJCcmFuZDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9OYXZiYXJCcmFuZDIpO1xuXG52YXIgX05hdkRyb3Bkb3duMiA9IHJlcXVpcmUoJy4vTmF2RHJvcGRvd24nKTtcblxudmFyIF9OYXZEcm9wZG93bjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9OYXZEcm9wZG93bjIpO1xuXG52YXIgX05hdkl0ZW0yID0gcmVxdWlyZSgnLi9OYXZJdGVtJyk7XG5cbnZhciBfTmF2SXRlbTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9OYXZJdGVtMik7XG5cbnZhciBfT3ZlcmxheTIgPSByZXF1aXJlKCcuL092ZXJsYXknKTtcblxudmFyIF9PdmVybGF5MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX092ZXJsYXkyKTtcblxudmFyIF9PdmVybGF5VHJpZ2dlcjIgPSByZXF1aXJlKCcuL092ZXJsYXlUcmlnZ2VyJyk7XG5cbnZhciBfT3ZlcmxheVRyaWdnZXIzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfT3ZlcmxheVRyaWdnZXIyKTtcblxudmFyIF9QYWdlSGVhZGVyMiA9IHJlcXVpcmUoJy4vUGFnZUhlYWRlcicpO1xuXG52YXIgX1BhZ2VIZWFkZXIzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUGFnZUhlYWRlcjIpO1xuXG52YXIgX1BhZ2VJdGVtMiA9IHJlcXVpcmUoJy4vUGFnZUl0ZW0nKTtcblxudmFyIF9QYWdlSXRlbTMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9QYWdlSXRlbTIpO1xuXG52YXIgX1BhZ2VyMiA9IHJlcXVpcmUoJy4vUGFnZXInKTtcblxudmFyIF9QYWdlcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9QYWdlcjIpO1xuXG52YXIgX1BhZ2luYXRpb24yID0gcmVxdWlyZSgnLi9QYWdpbmF0aW9uJyk7XG5cbnZhciBfUGFnaW5hdGlvbjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9QYWdpbmF0aW9uMik7XG5cbnZhciBfUGFnaW5hdGlvbkJ1dHRvbjIgPSByZXF1aXJlKCcuL1BhZ2luYXRpb25CdXR0b24nKTtcblxudmFyIF9QYWdpbmF0aW9uQnV0dG9uMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1BhZ2luYXRpb25CdXR0b24yKTtcblxudmFyIF9QYW5lbDIgPSByZXF1aXJlKCcuL1BhbmVsJyk7XG5cbnZhciBfUGFuZWwzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUGFuZWwyKTtcblxudmFyIF9QYW5lbEdyb3VwMiA9IHJlcXVpcmUoJy4vUGFuZWxHcm91cCcpO1xuXG52YXIgX1BhbmVsR3JvdXAzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfUGFuZWxHcm91cDIpO1xuXG52YXIgX1BvcG92ZXIyID0gcmVxdWlyZSgnLi9Qb3BvdmVyJyk7XG5cbnZhciBfUG9wb3ZlcjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Qb3BvdmVyMik7XG5cbnZhciBfUHJvZ3Jlc3NCYXIyID0gcmVxdWlyZSgnLi9Qcm9ncmVzc0JhcicpO1xuXG52YXIgX1Byb2dyZXNzQmFyMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1Byb2dyZXNzQmFyMik7XG5cbnZhciBfUmFkaW8yID0gcmVxdWlyZSgnLi9SYWRpbycpO1xuXG52YXIgX1JhZGlvMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1JhZGlvMik7XG5cbnZhciBfUmVzcG9uc2l2ZUVtYmVkMiA9IHJlcXVpcmUoJy4vUmVzcG9uc2l2ZUVtYmVkJyk7XG5cbnZhciBfUmVzcG9uc2l2ZUVtYmVkMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1Jlc3BvbnNpdmVFbWJlZDIpO1xuXG52YXIgX1JvdzIgPSByZXF1aXJlKCcuL1JvdycpO1xuXG52YXIgX1JvdzMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Sb3cyKTtcblxudmFyIF9TYWZlQW5jaG9yMiA9IHJlcXVpcmUoJy4vU2FmZUFuY2hvcicpO1xuXG52YXIgX1NhZmVBbmNob3IzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU2FmZUFuY2hvcjIpO1xuXG52YXIgX1NwbGl0QnV0dG9uMiA9IHJlcXVpcmUoJy4vU3BsaXRCdXR0b24nKTtcblxudmFyIF9TcGxpdEJ1dHRvbjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9TcGxpdEJ1dHRvbjIpO1xuXG52YXIgX1RhYjIgPSByZXF1aXJlKCcuL1RhYicpO1xuXG52YXIgX1RhYjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UYWIyKTtcblxudmFyIF9UYWJDb250YWluZXIyID0gcmVxdWlyZSgnLi9UYWJDb250YWluZXInKTtcblxudmFyIF9UYWJDb250YWluZXIzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVGFiQ29udGFpbmVyMik7XG5cbnZhciBfVGFiQ29udGVudDIgPSByZXF1aXJlKCcuL1RhYkNvbnRlbnQnKTtcblxudmFyIF9UYWJDb250ZW50MyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RhYkNvbnRlbnQyKTtcblxudmFyIF9UYWJsZTIgPSByZXF1aXJlKCcuL1RhYmxlJyk7XG5cbnZhciBfVGFibGUzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVGFibGUyKTtcblxudmFyIF9UYWJQYW5lMiA9IHJlcXVpcmUoJy4vVGFiUGFuZScpO1xuXG52YXIgX1RhYlBhbmUzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVGFiUGFuZTIpO1xuXG52YXIgX1RhYnMyID0gcmVxdWlyZSgnLi9UYWJzJyk7XG5cbnZhciBfVGFiczMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9UYWJzMik7XG5cbnZhciBfVGh1bWJuYWlsMiA9IHJlcXVpcmUoJy4vVGh1bWJuYWlsJyk7XG5cbnZhciBfVGh1bWJuYWlsMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1RodW1ibmFpbDIpO1xuXG52YXIgX1Rvb2x0aXAyID0gcmVxdWlyZSgnLi9Ub29sdGlwJyk7XG5cbnZhciBfVG9vbHRpcDMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Ub29sdGlwMik7XG5cbnZhciBfV2VsbDIgPSByZXF1aXJlKCcuL1dlbGwnKTtcblxudmFyIF9XZWxsMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1dlbGwyKTtcblxudmFyIF91dGlsczIgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBfdXRpbHMgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChfdXRpbHMyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBlbHNlIHsgdmFyIG5ld09iaiA9IHt9OyBpZiAob2JqICE9IG51bGwpIHsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IG5ld09ialsnZGVmYXVsdCddID0gb2JqOyByZXR1cm4gbmV3T2JqOyB9IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG5leHBvcnRzLkFjY29yZGlvbiA9IF9BY2NvcmRpb24zWydkZWZhdWx0J107XG5leHBvcnRzLkFsZXJ0ID0gX0FsZXJ0M1snZGVmYXVsdCddO1xuZXhwb3J0cy5CYWRnZSA9IF9CYWRnZTNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuQnJlYWRjcnVtYiA9IF9CcmVhZGNydW1iM1snZGVmYXVsdCddO1xuZXhwb3J0cy5CcmVhZGNydW1iSXRlbSA9IF9CcmVhZGNydW1iSXRlbTNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuQnV0dG9uID0gX0J1dHRvbjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuQnV0dG9uR3JvdXAgPSBfQnV0dG9uR3JvdXAzWydkZWZhdWx0J107XG5leHBvcnRzLkJ1dHRvblRvb2xiYXIgPSBfQnV0dG9uVG9vbGJhcjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuQ2Fyb3VzZWwgPSBfQ2Fyb3VzZWwzWydkZWZhdWx0J107XG5leHBvcnRzLkNhcm91c2VsSXRlbSA9IF9DYXJvdXNlbEl0ZW0zWydkZWZhdWx0J107XG5leHBvcnRzLkNoZWNrYm94ID0gX0NoZWNrYm94M1snZGVmYXVsdCddO1xuZXhwb3J0cy5DbGVhcmZpeCA9IF9DbGVhcmZpeDNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuQ29udHJvbExhYmVsID0gX0NvbnRyb2xMYWJlbDNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuQ29sID0gX0NvbDNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuQ29sbGFwc2UgPSBfQ29sbGFwc2UzWydkZWZhdWx0J107XG5leHBvcnRzLkRyb3Bkb3duID0gX0Ryb3Bkb3duM1snZGVmYXVsdCddO1xuZXhwb3J0cy5Ecm9wZG93bkJ1dHRvbiA9IF9Ecm9wZG93bkJ1dHRvbjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuRmFkZSA9IF9GYWRlM1snZGVmYXVsdCddO1xuZXhwb3J0cy5Gb3JtID0gX0Zvcm0zWydkZWZhdWx0J107XG5leHBvcnRzLkZvcm1Db250cm9sID0gX0Zvcm1Db250cm9sM1snZGVmYXVsdCddO1xuZXhwb3J0cy5Gb3JtR3JvdXAgPSBfRm9ybUdyb3VwM1snZGVmYXVsdCddO1xuZXhwb3J0cy5HbHlwaGljb24gPSBfR2x5cGhpY29uM1snZGVmYXVsdCddO1xuZXhwb3J0cy5HcmlkID0gX0dyaWQzWydkZWZhdWx0J107XG5leHBvcnRzLkhlbHBCbG9jayA9IF9IZWxwQmxvY2szWydkZWZhdWx0J107XG5leHBvcnRzLkltYWdlID0gX0ltYWdlM1snZGVmYXVsdCddO1xuZXhwb3J0cy5JbnB1dEdyb3VwID0gX0lucHV0R3JvdXAzWydkZWZhdWx0J107XG5leHBvcnRzLkp1bWJvdHJvbiA9IF9KdW1ib3Ryb24zWydkZWZhdWx0J107XG5leHBvcnRzLkxhYmVsID0gX0xhYmVsM1snZGVmYXVsdCddO1xuZXhwb3J0cy5MaXN0R3JvdXAgPSBfTGlzdEdyb3VwM1snZGVmYXVsdCddO1xuZXhwb3J0cy5MaXN0R3JvdXBJdGVtID0gX0xpc3RHcm91cEl0ZW0zWydkZWZhdWx0J107XG5leHBvcnRzLk1lZGlhID0gX01lZGlhM1snZGVmYXVsdCddO1xuZXhwb3J0cy5NZW51SXRlbSA9IF9NZW51SXRlbTNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuTW9kYWwgPSBfTW9kYWwzWydkZWZhdWx0J107XG5leHBvcnRzLk1vZGFsQm9keSA9IF9Nb2RhbEJvZHkzWydkZWZhdWx0J107XG5leHBvcnRzLk1vZGFsRm9vdGVyID0gX01vZGFsRm9vdGVyM1snZGVmYXVsdCddO1xuZXhwb3J0cy5Nb2RhbEhlYWRlciA9IF9Nb2RhbEhlYWRlcjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuTW9kYWxUaXRsZSA9IF9Nb2RhbFRpdGxlM1snZGVmYXVsdCddO1xuZXhwb3J0cy5OYXYgPSBfTmF2M1snZGVmYXVsdCddO1xuZXhwb3J0cy5OYXZiYXIgPSBfTmF2YmFyM1snZGVmYXVsdCddO1xuZXhwb3J0cy5OYXZiYXJCcmFuZCA9IF9OYXZiYXJCcmFuZDNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuTmF2RHJvcGRvd24gPSBfTmF2RHJvcGRvd24zWydkZWZhdWx0J107XG5leHBvcnRzLk5hdkl0ZW0gPSBfTmF2SXRlbTNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuT3ZlcmxheSA9IF9PdmVybGF5M1snZGVmYXVsdCddO1xuZXhwb3J0cy5PdmVybGF5VHJpZ2dlciA9IF9PdmVybGF5VHJpZ2dlcjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuUGFnZUhlYWRlciA9IF9QYWdlSGVhZGVyM1snZGVmYXVsdCddO1xuZXhwb3J0cy5QYWdlSXRlbSA9IF9QYWdlSXRlbTNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuUGFnZXIgPSBfUGFnZXIzWydkZWZhdWx0J107XG5leHBvcnRzLlBhZ2luYXRpb24gPSBfUGFnaW5hdGlvbjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuUGFnaW5hdGlvbkJ1dHRvbiA9IF9QYWdpbmF0aW9uQnV0dG9uM1snZGVmYXVsdCddO1xuZXhwb3J0cy5QYW5lbCA9IF9QYW5lbDNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuUGFuZWxHcm91cCA9IF9QYW5lbEdyb3VwM1snZGVmYXVsdCddO1xuZXhwb3J0cy5Qb3BvdmVyID0gX1BvcG92ZXIzWydkZWZhdWx0J107XG5leHBvcnRzLlByb2dyZXNzQmFyID0gX1Byb2dyZXNzQmFyM1snZGVmYXVsdCddO1xuZXhwb3J0cy5SYWRpbyA9IF9SYWRpbzNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuUmVzcG9uc2l2ZUVtYmVkID0gX1Jlc3BvbnNpdmVFbWJlZDNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuUm93ID0gX1JvdzNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuU2FmZUFuY2hvciA9IF9TYWZlQW5jaG9yM1snZGVmYXVsdCddO1xuZXhwb3J0cy5TcGxpdEJ1dHRvbiA9IF9TcGxpdEJ1dHRvbjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuVGFiID0gX1RhYjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuVGFiQ29udGFpbmVyID0gX1RhYkNvbnRhaW5lcjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuVGFiQ29udGVudCA9IF9UYWJDb250ZW50M1snZGVmYXVsdCddO1xuZXhwb3J0cy5UYWJsZSA9IF9UYWJsZTNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuVGFiUGFuZSA9IF9UYWJQYW5lM1snZGVmYXVsdCddO1xuZXhwb3J0cy5UYWJzID0gX1RhYnMzWydkZWZhdWx0J107XG5leHBvcnRzLlRodW1ibmFpbCA9IF9UaHVtYm5haWwzWydkZWZhdWx0J107XG5leHBvcnRzLlRvb2x0aXAgPSBfVG9vbHRpcDNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuV2VsbCA9IF9XZWxsM1snZGVmYXVsdCddO1xuZXhwb3J0cy51dGlscyA9IF91dGlsczsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLnJlcXVpcmVkUm9sZXMgPSByZXF1aXJlZFJvbGVzO1xuZXhwb3J0cy5leGNsdXNpdmVSb2xlcyA9IGV4Y2x1c2l2ZVJvbGVzO1xuXG52YXIgX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyID0gcmVxdWlyZSgncmVhY3QtcHJvcC10eXBlcy9saWIvdXRpbHMvY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXInKTtcblxudmFyIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcik7XG5cbnZhciBfVmFsaWRDb21wb25lbnRDaGlsZHJlbiA9IHJlcXVpcmUoJy4vVmFsaWRDb21wb25lbnRDaGlsZHJlbicpO1xuXG52YXIgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfVmFsaWRDb21wb25lbnRDaGlsZHJlbik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuZnVuY3Rpb24gcmVxdWlyZWRSb2xlcygpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHJvbGVzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgcm9sZXNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gKDAsIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcjJbJ2RlZmF1bHQnXSkoZnVuY3Rpb24gKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50KSB7XG4gICAgdmFyIG1pc3NpbmcgPSB2b2lkIDA7XG5cbiAgICByb2xlcy5ldmVyeShmdW5jdGlvbiAocm9sZSkge1xuICAgICAgaWYgKCFfVmFsaWRDb21wb25lbnRDaGlsZHJlbjJbJ2RlZmF1bHQnXS5zb21lKHByb3BzLmNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkLnByb3BzLmJzUm9sZSA9PT0gcm9sZTtcbiAgICAgIH0pKSB7XG4gICAgICAgIG1pc3NpbmcgPSByb2xlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgaWYgKG1pc3NpbmcpIHtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoJyhjaGlsZHJlbikgJyArIGNvbXBvbmVudCArICcgLSBNaXNzaW5nIGEgcmVxdWlyZWQgY2hpbGQgd2l0aCBic1JvbGU6ICcgKyAobWlzc2luZyArICcuICcgKyBjb21wb25lbnQgKyAnIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgY2hpbGQgb2YgZWFjaCBvZiAnKSArICgndGhlIGZvbGxvd2luZyBic1JvbGVzOiAnICsgcm9sZXMuam9pbignLCAnKSkpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZXhjbHVzaXZlUm9sZXMoKSB7XG4gIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgcm9sZXMgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgIHJvbGVzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gIH1cblxuICByZXR1cm4gKDAsIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcjJbJ2RlZmF1bHQnXSkoZnVuY3Rpb24gKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50KSB7XG4gICAgdmFyIGR1cGxpY2F0ZSA9IHZvaWQgMDtcblxuICAgIHJvbGVzLmV2ZXJ5KGZ1bmN0aW9uIChyb2xlKSB7XG4gICAgICB2YXIgY2hpbGRyZW5XaXRoUm9sZSA9IF9WYWxpZENvbXBvbmVudENoaWxkcmVuMlsnZGVmYXVsdCddLmZpbHRlcihwcm9wcy5jaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIHJldHVybiBjaGlsZC5wcm9wcy5ic1JvbGUgPT09IHJvbGU7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGNoaWxkcmVuV2l0aFJvbGUubGVuZ3RoID4gMSkge1xuICAgICAgICBkdXBsaWNhdGUgPSByb2xlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuXG4gICAgaWYgKGR1cGxpY2F0ZSkge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcignKGNoaWxkcmVuKSAnICsgY29tcG9uZW50ICsgJyAtIER1cGxpY2F0ZSBjaGlsZHJlbiBkZXRlY3RlZCBvZiBic1JvbGU6ICcgKyAoZHVwbGljYXRlICsgJy4gT25seSBvbmUgY2hpbGQgZWFjaCBhbGxvd2VkIHdpdGggdGhlIGZvbGxvd2luZyAnKSArICgnYnNSb2xlczogJyArIHJvbGVzLmpvaW4oJywgJykpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSk7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xudmFyIFNpemUgPSBleHBvcnRzLlNpemUgPSB7XG4gIExBUkdFOiAnbGFyZ2UnLFxuICBTTUFMTDogJ3NtYWxsJyxcbiAgWFNNQUxMOiAneHNtYWxsJ1xufTtcblxudmFyIFNJWkVfTUFQID0gZXhwb3J0cy5TSVpFX01BUCA9IHtcbiAgbGFyZ2U6ICdsZycsXG4gIG1lZGl1bTogJ21kJyxcbiAgc21hbGw6ICdzbScsXG4gIHhzbWFsbDogJ3hzJyxcbiAgbGc6ICdsZycsXG4gIG1kOiAnbWQnLFxuICBzbTogJ3NtJyxcbiAgeHM6ICd4cydcbn07XG5cbnZhciBERVZJQ0VfU0laRVMgPSBleHBvcnRzLkRFVklDRV9TSVpFUyA9IFsnbGcnLCAnbWQnLCAnc20nLCAneHMnXTtcblxudmFyIFN0YXRlID0gZXhwb3J0cy5TdGF0ZSA9IHtcbiAgU1VDQ0VTUzogJ3N1Y2Nlc3MnLFxuICBXQVJOSU5HOiAnd2FybmluZycsXG4gIERBTkdFUjogJ2RhbmdlcicsXG4gIElORk86ICdpbmZvJ1xufTtcblxudmFyIFN0eWxlID0gZXhwb3J0cy5TdHlsZSA9IHtcbiAgREVGQVVMVDogJ2RlZmF1bHQnLFxuICBQUklNQVJZOiAncHJpbWFyeScsXG4gIExJTks6ICdsaW5rJyxcbiAgSU5WRVJTRTogJ2ludmVyc2UnXG59OyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbi8qKlxuICogQ29weXJpZ2h0IDIwMTMtMjAxNCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgbW9kaWZpZWQgdmVyc2lvbiBvZjpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9ibG9iL3YwLjEyLjAvc3JjL2FkZG9ucy90cmFuc2l0aW9ucy9SZWFjdFRyYW5zaXRpb25FdmVudHMuanNcbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBoZXJlOlxuICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2Jsb2IvdjAuMTIuMC9MSUNFTlNFXG4gKiBBbiBhZGRpdGlvbmFsIGdyYW50IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGhlcmU6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvYmxvYi92MC4xMi4wL1BBVEVOVFNcbiAqL1xuXG52YXIgY2FuVXNlRE9NID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50ICYmIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcblxuLyoqXG4gKiBFVkVOVF9OQU1FX01BUCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaCBldmVudCBmaXJlZCB3aGVuIGFcbiAqIHRyYW5zaXRpb24vYW5pbWF0aW9uIGVuZHMsIGJhc2VkIG9uIHRoZSBzdHlsZSBwcm9wZXJ0eSB1c2VkIHRvXG4gKiBkZWZpbmUgdGhhdCBldmVudC5cbiAqL1xudmFyIEVWRU5UX05BTUVfTUFQID0ge1xuICB0cmFuc2l0aW9uZW5kOiB7XG4gICAgJ3RyYW5zaXRpb24nOiAndHJhbnNpdGlvbmVuZCcsXG4gICAgJ1dlYmtpdFRyYW5zaXRpb24nOiAnd2Via2l0VHJhbnNpdGlvbkVuZCcsXG4gICAgJ01velRyYW5zaXRpb24nOiAnbW96VHJhbnNpdGlvbkVuZCcsXG4gICAgJ09UcmFuc2l0aW9uJzogJ29UcmFuc2l0aW9uRW5kJyxcbiAgICAnbXNUcmFuc2l0aW9uJzogJ01TVHJhbnNpdGlvbkVuZCdcbiAgfSxcblxuICBhbmltYXRpb25lbmQ6IHtcbiAgICAnYW5pbWF0aW9uJzogJ2FuaW1hdGlvbmVuZCcsXG4gICAgJ1dlYmtpdEFuaW1hdGlvbic6ICd3ZWJraXRBbmltYXRpb25FbmQnLFxuICAgICdNb3pBbmltYXRpb24nOiAnbW96QW5pbWF0aW9uRW5kJyxcbiAgICAnT0FuaW1hdGlvbic6ICdvQW5pbWF0aW9uRW5kJyxcbiAgICAnbXNBbmltYXRpb24nOiAnTVNBbmltYXRpb25FbmQnXG4gIH1cbn07XG5cbnZhciBlbmRFdmVudHMgPSBbXTtcblxuZnVuY3Rpb24gZGV0ZWN0RXZlbnRzKCkge1xuICB2YXIgdGVzdEVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHZhciBzdHlsZSA9IHRlc3RFbC5zdHlsZTtcblxuICAvLyBPbiBzb21lIHBsYXRmb3JtcywgaW4gcGFydGljdWxhciBzb21lIHJlbGVhc2VzIG9mIEFuZHJvaWQgNC54LFxuICAvLyB0aGUgdW4tcHJlZml4ZWQgXCJhbmltYXRpb25cIiBhbmQgXCJ0cmFuc2l0aW9uXCIgcHJvcGVydGllcyBhcmUgZGVmaW5lZCBvbiB0aGVcbiAgLy8gc3R5bGUgb2JqZWN0IGJ1dCB0aGUgZXZlbnRzIHRoYXQgZmlyZSB3aWxsIHN0aWxsIGJlIHByZWZpeGVkLCBzbyB3ZSBuZWVkXG4gIC8vIHRvIGNoZWNrIGlmIHRoZSB1bi1wcmVmaXhlZCBldmVudHMgYXJlIHVzZWFibGUsIGFuZCBpZiBub3QgcmVtb3ZlIHRoZW1cbiAgLy8gZnJvbSB0aGUgbWFwXG4gIGlmICghKCdBbmltYXRpb25FdmVudCcgaW4gd2luZG93KSkge1xuICAgIGRlbGV0ZSBFVkVOVF9OQU1FX01BUC5hbmltYXRpb25lbmQuYW5pbWF0aW9uO1xuICB9XG5cbiAgaWYgKCEoJ1RyYW5zaXRpb25FdmVudCcgaW4gd2luZG93KSkge1xuICAgIGRlbGV0ZSBFVkVOVF9OQU1FX01BUC50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb247XG4gIH1cblxuICBmb3IgKHZhciBiYXNlRXZlbnROYW1lIGluIEVWRU5UX05BTUVfTUFQKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBndWFyZC1mb3ItaW5cbiAgICB2YXIgYmFzZUV2ZW50cyA9IEVWRU5UX05BTUVfTUFQW2Jhc2VFdmVudE5hbWVdO1xuICAgIGZvciAodmFyIHN0eWxlTmFtZSBpbiBiYXNlRXZlbnRzKSB7XG4gICAgICBpZiAoc3R5bGVOYW1lIGluIHN0eWxlKSB7XG4gICAgICAgIGVuZEV2ZW50cy5wdXNoKGJhc2VFdmVudHNbc3R5bGVOYW1lXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5pZiAoY2FuVXNlRE9NKSB7XG4gIGRldGVjdEV2ZW50cygpO1xufVxuXG4vLyBXZSB1c2UgdGhlIHJhdyB7YWRkfHJlbW92ZX1FdmVudExpc3RlbmVyKCkgY2FsbCBiZWNhdXNlIEV2ZW50TGlzdGVuZXJcbi8vIGRvZXMgbm90IGtub3cgaG93IHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lcnMgYW5kIHdlIHJlYWxseSBzaG91bGRcbi8vIGNsZWFuIHVwLiBBbHNvLCB0aGVzZSBldmVudHMgYXJlIG5vdCB0cmlnZ2VyZWQgaW4gb2xkZXIgYnJvd3NlcnNcbi8vIHNvIHdlIHNob3VsZCBiZSBBLU9LIGhlcmUuXG5cbmZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXIobm9kZSwgZXZlbnROYW1lLCBldmVudExpc3RlbmVyKSB7XG4gIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGV2ZW50TGlzdGVuZXIsIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGV2ZW50TGlzdGVuZXIpIHtcbiAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRMaXN0ZW5lciwgZmFsc2UpO1xufVxuXG52YXIgUmVhY3RUcmFuc2l0aW9uRXZlbnRzID0ge1xuICBhZGRFbmRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiBhZGRFbmRFdmVudExpc3RlbmVyKG5vZGUsIGV2ZW50TGlzdGVuZXIpIHtcbiAgICBpZiAoZW5kRXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gSWYgQ1NTIHRyYW5zaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLCB0cmlnZ2VyIGFuIFwiZW5kIGFuaW1hdGlvblwiXG4gICAgICAvLyBldmVudCBpbW1lZGlhdGVseS5cbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGV2ZW50TGlzdGVuZXIsIDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbmRFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZW5kRXZlbnQpIHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIobm9kZSwgZW5kRXZlbnQsIGV2ZW50TGlzdGVuZXIpO1xuICAgIH0pO1xuICB9LFxuICByZW1vdmVFbmRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiByZW1vdmVFbmRFdmVudExpc3RlbmVyKG5vZGUsIGV2ZW50TGlzdGVuZXIpIHtcbiAgICBpZiAoZW5kRXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbmRFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZW5kRXZlbnQpIHtcbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIobm9kZSwgZW5kRXZlbnQsIGV2ZW50TGlzdGVuZXIpO1xuICAgIH0pO1xuICB9XG59O1xuXG5leHBvcnRzWydkZWZhdWx0J10gPSBSZWFjdFRyYW5zaXRpb25FdmVudHM7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG4vKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLFxuICogYnV0IG9ubHkgbWFwcyBvdmVyIGNoaWxkcmVuIHRoYXQgYXJlIFwidmFsaWQgY29tcG9uZW50c1wiLlxuICpcbiAqIFRoZSBtYXBGdW5jdGlvbiBwcm92aWRlZCBpbmRleCB3aWxsIGJlIG5vcm1hbGlzZWQgdG8gdGhlIGNvbXBvbmVudHMgbWFwcGVkLFxuICogc28gYW4gaW52YWxpZCBjb21wb25lbnQgd291bGQgbm90IGluY3JlYXNlIHRoZSBpbmRleC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZnVuYy5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBDb250ZXh0IGZvciBmdW5jLlxuICogQHJldHVybiB7b2JqZWN0fSBPYmplY3QgY29udGFpbmluZyB0aGUgb3JkZXJlZCBtYXAgb2YgcmVzdWx0cy5cbiAqL1xuZnVuY3Rpb24gbWFwKGNoaWxkcmVuLCBmdW5jLCBjb250ZXh0KSB7XG4gIHZhciBpbmRleCA9IDA7XG5cbiAgcmV0dXJuIF9yZWFjdDJbJ2RlZmF1bHQnXS5DaGlsZHJlbi5tYXAoY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIGlmICghX3JlYWN0MlsnZGVmYXVsdCddLmlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgcmV0dXJuIGNoaWxkO1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGluZGV4KyspO1xuICB9KTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlcyB0aHJvdWdoIGNoaWxkcmVuIHRoYXQgYXJlIFwidmFsaWQgY29tcG9uZW50c1wiLlxuICpcbiAqIFRoZSBwcm92aWRlZCBmb3JFYWNoRnVuYyhjaGlsZCwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkIHdpdGggdGhlIGluZGV4IHJlZmxlY3RpbmcgdGhlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIFwidmFsaWQgY29tcG9uZW50c1wiLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmdW5jLlxuICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgZm9yIGNvbnRleHQuXG4gKi9cbi8vIFRPRE86IFRoaXMgbW9kdWxlIHNob3VsZCBiZSBFbGVtZW50Q2hpbGRyZW4sIGFuZCBzaG91bGQgdXNlIG5hbWVkIGV4cG9ydHMuXG5cbmZ1bmN0aW9uIGZvckVhY2goY2hpbGRyZW4sIGZ1bmMsIGNvbnRleHQpIHtcbiAgdmFyIGluZGV4ID0gMDtcblxuICBfcmVhY3QyWydkZWZhdWx0J10uQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgaWYgKCFfcmVhY3QyWydkZWZhdWx0J10uaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBpbmRleCsrKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBcInZhbGlkIGNvbXBvbmVudHNcIiBpbiB0aGUgQ2hpbGRyZW4gY29udGFpbmVyLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gY291bnQoY2hpbGRyZW4pIHtcbiAgdmFyIHJlc3VsdCA9IDA7XG5cbiAgX3JlYWN0MlsnZGVmYXVsdCddLkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIGlmICghX3JlYWN0MlsnZGVmYXVsdCddLmlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgICsrcmVzdWx0O1xuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEZpbmRzIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCxcbiAqIGJ1dCBvbmx5IGl0ZXJhdGVzIG92ZXIgY2hpbGRyZW4gdGhhdCBhcmUgXCJ2YWxpZCBjb21wb25lbnRzXCIuXG4gKlxuICogVGhlIHByb3ZpZGVkIGZvckVhY2hGdW5jKGNoaWxkLCBpbmRleCkgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2hcbiAqIGxlYWYgY2hpbGQgd2l0aCB0aGUgaW5kZXggcmVmbGVjdGluZyB0aGUgcG9zaXRpb24gcmVsYXRpdmUgdG8gXCJ2YWxpZCBjb21wb25lbnRzXCIuXG4gKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0ge2Z1bmN0aW9uKCosIGludCl9IGZ1bmMuXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBmb3IgZnVuYy5cbiAqIEByZXR1cm5zIHthcnJheX0gb2YgY2hpbGRyZW4gdGhhdCBtZWV0IHRoZSBmdW5jIHJldHVybiBzdGF0ZW1lbnRcbiAqL1xuZnVuY3Rpb24gZmlsdGVyKGNoaWxkcmVuLCBmdW5jLCBjb250ZXh0KSB7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciByZXN1bHQgPSBbXTtcblxuICBfcmVhY3QyWydkZWZhdWx0J10uQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgaWYgKCFfcmVhY3QyWydkZWZhdWx0J10uaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZ1bmMuY2FsbChjb250ZXh0LCBjaGlsZCwgaW5kZXgrKykpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGNoaWxkKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGZpbmQoY2hpbGRyZW4sIGZ1bmMsIGNvbnRleHQpIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIHJlc3VsdCA9IHVuZGVmaW5lZDtcblxuICBfcmVhY3QyWydkZWZhdWx0J10uQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIV9yZWFjdDJbJ2RlZmF1bHQnXS5pc1ZhbGlkRWxlbWVudChjaGlsZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBpbmRleCsrKSkge1xuICAgICAgcmVzdWx0ID0gY2hpbGQ7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBldmVyeShjaGlsZHJlbiwgZnVuYywgY29udGV4dCkge1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgcmVzdWx0ID0gdHJ1ZTtcblxuICBfcmVhY3QyWydkZWZhdWx0J10uQ2hpbGRyZW4uZm9yRWFjaChjaGlsZHJlbiwgZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFfcmVhY3QyWydkZWZhdWx0J10uaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGluZGV4KyspKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHNvbWUoY2hpbGRyZW4sIGZ1bmMsIGNvbnRleHQpIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIHJlc3VsdCA9IGZhbHNlO1xuXG4gIF9yZWFjdDJbJ2RlZmF1bHQnXS5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghX3JlYWN0MlsnZGVmYXVsdCddLmlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmdW5jLmNhbGwoY29udGV4dCwgY2hpbGQsIGluZGV4KyspKSB7XG4gICAgICByZXN1bHQgPSB0cnVlO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gdG9BcnJheShjaGlsZHJlbikge1xuICB2YXIgcmVzdWx0ID0gW107XG5cbiAgX3JlYWN0MlsnZGVmYXVsdCddLkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIGlmICghX3JlYWN0MlsnZGVmYXVsdCddLmlzVmFsaWRFbGVtZW50KGNoaWxkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJlc3VsdC5wdXNoKGNoaWxkKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0c1snZGVmYXVsdCddID0ge1xuICBtYXA6IG1hcCxcbiAgZm9yRWFjaDogZm9yRWFjaCxcbiAgY291bnQ6IGNvdW50LFxuICBmaW5kOiBmaW5kLFxuICBmaWx0ZXI6IGZpbHRlcixcbiAgZXZlcnk6IGV2ZXJ5LFxuICBzb21lOiBzb21lLFxuICB0b0FycmF5OiB0b0FycmF5XG59O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5fY3VycnkgPSBleHBvcnRzLmJzU2l6ZXMgPSBleHBvcnRzLmJzU3R5bGVzID0gZXhwb3J0cy5ic0NsYXNzID0gdW5kZWZpbmVkO1xuXG52YXIgX2VudHJpZXMgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2VudHJpZXMnKTtcblxudmFyIF9lbnRyaWVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2VudHJpZXMpO1xuXG52YXIgX2V4dGVuZHMyID0gcmVxdWlyZSgnYmFiZWwtcnVudGltZS9oZWxwZXJzL2V4dGVuZHMnKTtcblxudmFyIF9leHRlbmRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2V4dGVuZHMyKTtcblxuZXhwb3J0cy5wcmVmaXggPSBwcmVmaXg7XG5leHBvcnRzLmdldENsYXNzU2V0ID0gZ2V0Q2xhc3NTZXQ7XG5leHBvcnRzLnNwbGl0QnNQcm9wcyA9IHNwbGl0QnNQcm9wcztcbmV4cG9ydHMuc3BsaXRCc1Byb3BzQW5kT21pdCA9IHNwbGl0QnNQcm9wc0FuZE9taXQ7XG5leHBvcnRzLmFkZFN0eWxlID0gYWRkU3R5bGU7XG5cbnZhciBfaW52YXJpYW50ID0gcmVxdWlyZSgnaW52YXJpYW50Jyk7XG5cbnZhciBfaW52YXJpYW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ludmFyaWFudCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX1N0eWxlQ29uZmlnID0gcmVxdWlyZSgnLi9TdHlsZUNvbmZpZycpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIGN1cnJ5KGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgdmFyIGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgaWYgKHR5cGVvZiBsYXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChDb21wb25lbnQpIHtcbiAgICAgIHJldHVybiBmbi5hcHBseSh1bmRlZmluZWQsIGFyZ3MuY29uY2F0KFtDb21wb25lbnRdKSk7XG4gICAgfTtcbiAgfTtcbn0gLy8gVE9ETzogVGhlIHB1YmxpY2x5IGV4cG9zZWQgcGFydHMgb2YgdGhpcyBzaG91bGQgYmUgaW4gbGliL0Jvb3RzdHJhcFV0aWxzLlxuXG5mdW5jdGlvbiBwcmVmaXgocHJvcHMsIHZhcmlhbnQpIHtcbiAgIShwcm9wcy5ic0NsYXNzICE9IG51bGwpID8gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyA/ICgwLCBfaW52YXJpYW50MlsnZGVmYXVsdCddKShmYWxzZSwgJ0EgYGJzQ2xhc3NgIHByb3AgaXMgcmVxdWlyZWQgZm9yIHRoaXMgY29tcG9uZW50JykgOiAoMCwgX2ludmFyaWFudDJbJ2RlZmF1bHQnXSkoZmFsc2UpIDogdm9pZCAwO1xuICByZXR1cm4gcHJvcHMuYnNDbGFzcyArICh2YXJpYW50ID8gJy0nICsgdmFyaWFudCA6ICcnKTtcbn1cblxudmFyIGJzQ2xhc3MgPSBleHBvcnRzLmJzQ2xhc3MgPSBjdXJyeShmdW5jdGlvbiAoZGVmYXVsdENsYXNzLCBDb21wb25lbnQpIHtcbiAgdmFyIHByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXMgfHwgKENvbXBvbmVudC5wcm9wVHlwZXMgPSB7fSk7XG4gIHZhciBkZWZhdWx0UHJvcHMgPSBDb21wb25lbnQuZGVmYXVsdFByb3BzIHx8IChDb21wb25lbnQuZGVmYXVsdFByb3BzID0ge30pO1xuXG4gIHByb3BUeXBlcy5ic0NsYXNzID0gX3Byb3BUeXBlczJbJ2RlZmF1bHQnXS5zdHJpbmc7XG4gIGRlZmF1bHRQcm9wcy5ic0NsYXNzID0gZGVmYXVsdENsYXNzO1xuXG4gIHJldHVybiBDb21wb25lbnQ7XG59KTtcblxudmFyIGJzU3R5bGVzID0gZXhwb3J0cy5ic1N0eWxlcyA9IGN1cnJ5KGZ1bmN0aW9uIChzdHlsZXMsIGRlZmF1bHRTdHlsZSwgQ29tcG9uZW50KSB7XG4gIGlmICh0eXBlb2YgZGVmYXVsdFN0eWxlICE9PSAnc3RyaW5nJykge1xuICAgIENvbXBvbmVudCA9IGRlZmF1bHRTdHlsZTtcbiAgICBkZWZhdWx0U3R5bGUgPSB1bmRlZmluZWQ7XG4gIH1cblxuICB2YXIgZXhpc3RpbmcgPSBDb21wb25lbnQuU1RZTEVTIHx8IFtdO1xuICB2YXIgcHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcyB8fCB7fTtcblxuICBzdHlsZXMuZm9yRWFjaChmdW5jdGlvbiAoc3R5bGUpIHtcbiAgICBpZiAoZXhpc3RpbmcuaW5kZXhPZihzdHlsZSkgPT09IC0xKSB7XG4gICAgICBleGlzdGluZy5wdXNoKHN0eWxlKTtcbiAgICB9XG4gIH0pO1xuXG4gIHZhciBwcm9wVHlwZSA9IF9wcm9wVHlwZXMyWydkZWZhdWx0J10ub25lT2YoZXhpc3RpbmcpO1xuXG4gIC8vIGV4cG9zZSB0aGUgdmFsdWVzIG9uIHRoZSBwcm9wVHlwZSBmdW5jdGlvbiBmb3IgZG9jdW1lbnRhdGlvblxuICBDb21wb25lbnQuU1RZTEVTID0gcHJvcFR5cGUuX3ZhbHVlcyA9IGV4aXN0aW5nO1xuXG4gIENvbXBvbmVudC5wcm9wVHlwZXMgPSAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBwcm9wVHlwZXMsIHtcbiAgICBic1N0eWxlOiBwcm9wVHlwZVxuICB9KTtcblxuICBpZiAoZGVmYXVsdFN0eWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICB2YXIgZGVmYXVsdFByb3BzID0gQ29tcG9uZW50LmRlZmF1bHRQcm9wcyB8fCAoQ29tcG9uZW50LmRlZmF1bHRQcm9wcyA9IHt9KTtcbiAgICBkZWZhdWx0UHJvcHMuYnNTdHlsZSA9IGRlZmF1bHRTdHlsZTtcbiAgfVxuXG4gIHJldHVybiBDb21wb25lbnQ7XG59KTtcblxudmFyIGJzU2l6ZXMgPSBleHBvcnRzLmJzU2l6ZXMgPSBjdXJyeShmdW5jdGlvbiAoc2l6ZXMsIGRlZmF1bHRTaXplLCBDb21wb25lbnQpIHtcbiAgaWYgKHR5cGVvZiBkZWZhdWx0U2l6ZSAhPT0gJ3N0cmluZycpIHtcbiAgICBDb21wb25lbnQgPSBkZWZhdWx0U2l6ZTtcbiAgICBkZWZhdWx0U2l6ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHZhciBleGlzdGluZyA9IENvbXBvbmVudC5TSVpFUyB8fCBbXTtcbiAgdmFyIHByb3BUeXBlcyA9IENvbXBvbmVudC5wcm9wVHlwZXMgfHwge307XG5cbiAgc2l6ZXMuZm9yRWFjaChmdW5jdGlvbiAoc2l6ZSkge1xuICAgIGlmIChleGlzdGluZy5pbmRleE9mKHNpemUpID09PSAtMSkge1xuICAgICAgZXhpc3RpbmcucHVzaChzaXplKTtcbiAgICB9XG4gIH0pO1xuXG4gIHZhciB2YWx1ZXMgPSBbXTtcbiAgZXhpc3RpbmcuZm9yRWFjaChmdW5jdGlvbiAoc2l6ZSkge1xuICAgIHZhciBtYXBwZWRTaXplID0gX1N0eWxlQ29uZmlnLlNJWkVfTUFQW3NpemVdO1xuICAgIGlmIChtYXBwZWRTaXplICYmIG1hcHBlZFNpemUgIT09IHNpemUpIHtcbiAgICAgIHZhbHVlcy5wdXNoKG1hcHBlZFNpemUpO1xuICAgIH1cblxuICAgIHZhbHVlcy5wdXNoKHNpemUpO1xuICB9KTtcblxuICB2YXIgcHJvcFR5cGUgPSBfcHJvcFR5cGVzMlsnZGVmYXVsdCddLm9uZU9mKHZhbHVlcyk7XG4gIHByb3BUeXBlLl92YWx1ZXMgPSB2YWx1ZXM7XG5cbiAgLy8gZXhwb3NlIHRoZSB2YWx1ZXMgb24gdGhlIHByb3BUeXBlIGZ1bmN0aW9uIGZvciBkb2N1bWVudGF0aW9uXG4gIENvbXBvbmVudC5TSVpFUyA9IGV4aXN0aW5nO1xuXG4gIENvbXBvbmVudC5wcm9wVHlwZXMgPSAoMCwgX2V4dGVuZHMzWydkZWZhdWx0J10pKHt9LCBwcm9wVHlwZXMsIHtcbiAgICBic1NpemU6IHByb3BUeXBlXG4gIH0pO1xuXG4gIGlmIChkZWZhdWx0U2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKCFDb21wb25lbnQuZGVmYXVsdFByb3BzKSB7XG4gICAgICBDb21wb25lbnQuZGVmYXVsdFByb3BzID0ge307XG4gICAgfVxuICAgIENvbXBvbmVudC5kZWZhdWx0UHJvcHMuYnNTaXplID0gZGVmYXVsdFNpemU7XG4gIH1cblxuICByZXR1cm4gQ29tcG9uZW50O1xufSk7XG5cbmZ1bmN0aW9uIGdldENsYXNzU2V0KHByb3BzKSB7XG4gIHZhciBfY2xhc3NlcztcblxuICB2YXIgY2xhc3NlcyA9IChfY2xhc3NlcyA9IHt9LCBfY2xhc3Nlc1twcmVmaXgocHJvcHMpXSA9IHRydWUsIF9jbGFzc2VzKTtcblxuICBpZiAocHJvcHMuYnNTaXplKSB7XG4gICAgdmFyIGJzU2l6ZSA9IF9TdHlsZUNvbmZpZy5TSVpFX01BUFtwcm9wcy5ic1NpemVdIHx8IHByb3BzLmJzU2l6ZTtcbiAgICBjbGFzc2VzW3ByZWZpeChwcm9wcywgYnNTaXplKV0gPSB0cnVlO1xuICB9XG5cbiAgaWYgKHByb3BzLmJzU3R5bGUpIHtcbiAgICBjbGFzc2VzW3ByZWZpeChwcm9wcywgcHJvcHMuYnNTdHlsZSldID0gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBjbGFzc2VzO1xufVxuXG5mdW5jdGlvbiBnZXRCc1Byb3BzKHByb3BzKSB7XG4gIHJldHVybiB7XG4gICAgYnNDbGFzczogcHJvcHMuYnNDbGFzcyxcbiAgICBic1NpemU6IHByb3BzLmJzU2l6ZSxcbiAgICBic1N0eWxlOiBwcm9wcy5ic1N0eWxlLFxuICAgIGJzUm9sZTogcHJvcHMuYnNSb2xlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQnNQcm9wKHByb3BOYW1lKSB7XG4gIHJldHVybiBwcm9wTmFtZSA9PT0gJ2JzQ2xhc3MnIHx8IHByb3BOYW1lID09PSAnYnNTaXplJyB8fCBwcm9wTmFtZSA9PT0gJ2JzU3R5bGUnIHx8IHByb3BOYW1lID09PSAnYnNSb2xlJztcbn1cblxuZnVuY3Rpb24gc3BsaXRCc1Byb3BzKHByb3BzKSB7XG4gIHZhciBlbGVtZW50UHJvcHMgPSB7fTtcbiAgKDAsIF9lbnRyaWVzMlsnZGVmYXVsdCddKShwcm9wcykuZm9yRWFjaChmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBwcm9wTmFtZSA9IF9yZWZbMF0sXG4gICAgICAgIHByb3BWYWx1ZSA9IF9yZWZbMV07XG5cbiAgICBpZiAoIWlzQnNQcm9wKHByb3BOYW1lKSkge1xuICAgICAgZWxlbWVudFByb3BzW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBbZ2V0QnNQcm9wcyhwcm9wcyksIGVsZW1lbnRQcm9wc107XG59XG5cbmZ1bmN0aW9uIHNwbGl0QnNQcm9wc0FuZE9taXQocHJvcHMsIG9taXR0ZWRQcm9wTmFtZXMpIHtcbiAgdmFyIGlzT21pdHRlZFByb3AgPSB7fTtcbiAgb21pdHRlZFByb3BOYW1lcy5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkge1xuICAgIGlzT21pdHRlZFByb3BbcHJvcE5hbWVdID0gdHJ1ZTtcbiAgfSk7XG5cbiAgdmFyIGVsZW1lbnRQcm9wcyA9IHt9O1xuICAoMCwgX2VudHJpZXMyWydkZWZhdWx0J10pKHByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMikge1xuICAgIHZhciBwcm9wTmFtZSA9IF9yZWYyWzBdLFxuICAgICAgICBwcm9wVmFsdWUgPSBfcmVmMlsxXTtcblxuICAgIGlmICghaXNCc1Byb3AocHJvcE5hbWUpICYmICFpc09taXR0ZWRQcm9wW3Byb3BOYW1lXSkge1xuICAgICAgZWxlbWVudFByb3BzW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBbZ2V0QnNQcm9wcyhwcm9wcyksIGVsZW1lbnRQcm9wc107XG59XG5cbi8qKlxuICogQWRkIGEgc3R5bGUgdmFyaWFudCB0byBhIENvbXBvbmVudC4gTXV0YXRlcyB0aGUgcHJvcFR5cGVzIG9mIHRoZSBjb21wb25lbnRcbiAqIGluIG9yZGVyIHRvIHZhbGlkYXRlIHRoZSBuZXcgdmFyaWFudC5cbiAqL1xuZnVuY3Rpb24gYWRkU3R5bGUoQ29tcG9uZW50KSB7XG4gIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgc3R5bGVWYXJpYW50ID0gQXJyYXkoX2xlbjIgPiAxID8gX2xlbjIgLSAxIDogMCksIF9rZXkyID0gMTsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgIHN0eWxlVmFyaWFudFtfa2V5MiAtIDFdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgfVxuXG4gIGJzU3R5bGVzKHN0eWxlVmFyaWFudCwgQ29tcG9uZW50KTtcbn1cblxudmFyIF9jdXJyeSA9IGV4cG9ydHMuX2N1cnJ5ID0gY3Vycnk7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGNhcGl0YWxpemU7XG5mdW5jdGlvbiBjYXBpdGFsaXplKHN0cmluZykge1xuICByZXR1cm4gXCJcIiArIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuLyoqXG4gKiBTYWZlIGNoYWluZWQgZnVuY3Rpb25cbiAqXG4gKiBXaWxsIG9ubHkgY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIGlmIG5lZWRlZCxcbiAqIG90aGVyd2lzZSB3aWxsIHBhc3MgYmFjayBleGlzdGluZyBmdW5jdGlvbnMgb3IgbnVsbC5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBmdW5jdGlvbnMgdG8gY2hhaW5cbiAqIEByZXR1cm5zIHtmdW5jdGlvbnxudWxsfVxuICovXG5mdW5jdGlvbiBjcmVhdGVDaGFpbmVkRnVuY3Rpb24oKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBmdW5jcyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGZ1bmNzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmNzLmZpbHRlcihmdW5jdGlvbiAoZikge1xuICAgIHJldHVybiBmICE9IG51bGw7XG4gIH0pLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBmKSB7XG4gICAgaWYgKHR5cGVvZiBmICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgQXJndW1lbnQgVHlwZSwgbXVzdCBvbmx5IHByb3ZpZGUgZnVuY3Rpb25zLCB1bmRlZmluZWQsIG9yIG51bGwuJyk7XG4gICAgfVxuXG4gICAgaWYgKGFjYyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGY7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGNoYWluZWRGdW5jdGlvbigpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgIGFyZ3NbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgYWNjLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgZi5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9LCBudWxsKTtcbn1cblxuZXhwb3J0c1snZGVmYXVsdCddID0gY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jbGFzc0NhbGxDaGVjaycpO1xuXG52YXIgX2NsYXNzQ2FsbENoZWNrMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzQ2FsbENoZWNrMik7XG5cbnZhciBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIgPSByZXF1aXJlKCdiYWJlbC1ydW50aW1lL2hlbHBlcnMvcG9zc2libGVDb25zdHJ1Y3RvclJldHVybicpO1xuXG52YXIgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIpO1xuXG52YXIgX2luaGVyaXRzMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy9pbmhlcml0cycpO1xuXG52YXIgX2luaGVyaXRzMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2luaGVyaXRzMik7XG5cbnZhciBfdHlwZW9mMiA9IHJlcXVpcmUoJ2JhYmVsLXJ1bnRpbWUvaGVscGVycy90eXBlb2YnKTtcblxudmFyIF90eXBlb2YzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfdHlwZW9mMik7XG5cbmV4cG9ydHMuX3Jlc2V0V2FybmVkID0gX3Jlc2V0V2FybmVkO1xuXG52YXIgX3dhcm5pbmcgPSByZXF1aXJlKCd3YXJuaW5nJyk7XG5cbnZhciBfd2FybmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93YXJuaW5nKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG52YXIgd2FybmVkID0ge307XG5cbmZ1bmN0aW9uIGRlcHJlY2F0aW9uV2FybmluZyhvbGRuYW1lLCBuZXduYW1lLCBsaW5rKSB7XG4gIHZhciBtZXNzYWdlID0gdm9pZCAwO1xuXG4gIGlmICgodHlwZW9mIG9sZG5hbWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiAoMCwgX3R5cGVvZjNbJ2RlZmF1bHQnXSkob2xkbmFtZSkpID09PSAnb2JqZWN0Jykge1xuICAgIG1lc3NhZ2UgPSBvbGRuYW1lLm1lc3NhZ2U7XG4gIH0gZWxzZSB7XG4gICAgbWVzc2FnZSA9IG9sZG5hbWUgKyAnIGlzIGRlcHJlY2F0ZWQuIFVzZSAnICsgbmV3bmFtZSArICcgaW5zdGVhZC4nO1xuXG4gICAgaWYgKGxpbmspIHtcbiAgICAgIG1lc3NhZ2UgKz0gJ1xcbllvdSBjYW4gcmVhZCBtb3JlIGFib3V0IGl0IGF0ICcgKyBsaW5rO1xuICAgIH1cbiAgfVxuXG4gIGlmICh3YXJuZWRbbWVzc2FnZV0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nID8gKDAsIF93YXJuaW5nMlsnZGVmYXVsdCddKShmYWxzZSwgbWVzc2FnZSkgOiB2b2lkIDA7XG4gIHdhcm5lZFttZXNzYWdlXSA9IHRydWU7XG59XG5cbmRlcHJlY2F0aW9uV2FybmluZy53cmFwcGVyID0gZnVuY3Rpb24gKENvbXBvbmVudCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBhcmdzW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICAgICgwLCBfaW5oZXJpdHMzWydkZWZhdWx0J10pKERlcHJlY2F0ZWRDb21wb25lbnQsIF9Db21wb25lbnQpO1xuXG4gICAgZnVuY3Rpb24gRGVwcmVjYXRlZENvbXBvbmVudCgpIHtcbiAgICAgICgwLCBfY2xhc3NDYWxsQ2hlY2szWydkZWZhdWx0J10pKHRoaXMsIERlcHJlY2F0ZWRDb21wb25lbnQpO1xuICAgICAgcmV0dXJuICgwLCBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjNbJ2RlZmF1bHQnXSkodGhpcywgX0NvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgICB9XG5cbiAgICBEZXByZWNhdGVkQ29tcG9uZW50LnByb3RvdHlwZS5jb21wb25lbnRXaWxsTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsTW91bnQoKSB7XG4gICAgICBkZXByZWNhdGlvbldhcm5pbmcuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcblxuICAgICAgaWYgKF9Db21wb25lbnQucHJvdG90eXBlLmNvbXBvbmVudFdpbGxNb3VudCkge1xuICAgICAgICB2YXIgX0NvbXBvbmVudCRwcm90b3R5cGUkO1xuXG4gICAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgbWV0aG9kQXJncyA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICAgICAgbWV0aG9kQXJnc1tfa2V5Ml0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgICB9XG5cbiAgICAgICAgKF9Db21wb25lbnQkcHJvdG90eXBlJCA9IF9Db21wb25lbnQucHJvdG90eXBlLmNvbXBvbmVudFdpbGxNb3VudCkuY2FsbC5hcHBseShfQ29tcG9uZW50JHByb3RvdHlwZSQsIFt0aGlzXS5jb25jYXQobWV0aG9kQXJncykpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gRGVwcmVjYXRlZENvbXBvbmVudDtcbiAgfShDb21wb25lbnQpO1xufTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gZGVwcmVjYXRpb25XYXJuaW5nO1xuZnVuY3Rpb24gX3Jlc2V0V2FybmVkKCkge1xuICB3YXJuZWQgPSB7fTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLlZhbGlkQ29tcG9uZW50Q2hpbGRyZW4gPSBleHBvcnRzLmNyZWF0ZUNoYWluZWRGdW5jdGlvbiA9IGV4cG9ydHMuYm9vdHN0cmFwVXRpbHMgPSB1bmRlZmluZWQ7XG5cbnZhciBfYm9vdHN0cmFwVXRpbHMyID0gcmVxdWlyZSgnLi9ib290c3RyYXBVdGlscycpO1xuXG52YXIgX2Jvb3RzdHJhcFV0aWxzID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQoX2Jvb3RzdHJhcFV0aWxzMik7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMiA9IHJlcXVpcmUoJy4vY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uJyk7XG5cbnZhciBfY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uMyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjIpO1xuXG52YXIgX1ZhbGlkQ29tcG9uZW50Q2hpbGRyZW4yID0gcmVxdWlyZSgnLi9WYWxpZENvbXBvbmVudENoaWxkcmVuJyk7XG5cbnZhciBfVmFsaWRDb21wb25lbnRDaGlsZHJlbjMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9WYWxpZENvbXBvbmVudENoaWxkcmVuMik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQob2JqKSB7IGlmIChvYmogJiYgb2JqLl9fZXNNb2R1bGUpIHsgcmV0dXJuIG9iajsgfSBlbHNlIHsgdmFyIG5ld09iaiA9IHt9OyBpZiAob2JqICE9IG51bGwpIHsgZm9yICh2YXIga2V5IGluIG9iaikgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgbmV3T2JqW2tleV0gPSBvYmpba2V5XTsgfSB9IG5ld09ialsnZGVmYXVsdCddID0gb2JqOyByZXR1cm4gbmV3T2JqOyB9IH1cblxuZXhwb3J0cy5ib290c3RyYXBVdGlscyA9IF9ib290c3RyYXBVdGlscztcbmV4cG9ydHMuY3JlYXRlQ2hhaW5lZEZ1bmN0aW9uID0gX2NyZWF0ZUNoYWluZWRGdW5jdGlvbjNbJ2RlZmF1bHQnXTtcbmV4cG9ydHMuVmFsaWRDb21wb25lbnRDaGlsZHJlbiA9IF9WYWxpZENvbXBvbmVudENoaWxkcmVuM1snZGVmYXVsdCddOyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2VudHJpZXMgPSByZXF1aXJlKFwiYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9lbnRyaWVzXCIpO1xuXG52YXIgX2VudHJpZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZW50cmllcyk7XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gc3BsaXRDb21wb25lbnRQcm9wcztcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgXCJkZWZhdWx0XCI6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIHNwbGl0Q29tcG9uZW50UHJvcHMocHJvcHMsIENvbXBvbmVudCkge1xuICB2YXIgY29tcG9uZW50UHJvcFR5cGVzID0gQ29tcG9uZW50LnByb3BUeXBlcztcblxuICB2YXIgcGFyZW50UHJvcHMgPSB7fTtcbiAgdmFyIGNoaWxkUHJvcHMgPSB7fTtcblxuICAoMCwgX2VudHJpZXMyW1wiZGVmYXVsdFwiXSkocHJvcHMpLmZvckVhY2goZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgcHJvcE5hbWUgPSBfcmVmWzBdLFxuICAgICAgICBwcm9wVmFsdWUgPSBfcmVmWzFdO1xuXG4gICAgaWYgKGNvbXBvbmVudFByb3BUeXBlc1twcm9wTmFtZV0pIHtcbiAgICAgIHBhcmVudFByb3BzW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2hpbGRQcm9wc1twcm9wTmFtZV0gPSBwcm9wVmFsdWU7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gW3BhcmVudFByb3BzLCBjaGlsZFByb3BzXTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1tcImRlZmF1bHRcIl07IiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL1JlYWN0RE9NJyk7XG4iLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgQVJJQURPTVByb3BlcnR5Q29uZmlnID0ge1xuICBQcm9wZXJ0aWVzOiB7XG4gICAgLy8gR2xvYmFsIFN0YXRlcyBhbmQgUHJvcGVydGllc1xuICAgICdhcmlhLWN1cnJlbnQnOiAwLCAvLyBzdGF0ZVxuICAgICdhcmlhLWRldGFpbHMnOiAwLFxuICAgICdhcmlhLWRpc2FibGVkJzogMCwgLy8gc3RhdGVcbiAgICAnYXJpYS1oaWRkZW4nOiAwLCAvLyBzdGF0ZVxuICAgICdhcmlhLWludmFsaWQnOiAwLCAvLyBzdGF0ZVxuICAgICdhcmlhLWtleXNob3J0Y3V0cyc6IDAsXG4gICAgJ2FyaWEtbGFiZWwnOiAwLFxuICAgICdhcmlhLXJvbGVkZXNjcmlwdGlvbic6IDAsXG4gICAgLy8gV2lkZ2V0IEF0dHJpYnV0ZXNcbiAgICAnYXJpYS1hdXRvY29tcGxldGUnOiAwLFxuICAgICdhcmlhLWNoZWNrZWQnOiAwLFxuICAgICdhcmlhLWV4cGFuZGVkJzogMCxcbiAgICAnYXJpYS1oYXNwb3B1cCc6IDAsXG4gICAgJ2FyaWEtbGV2ZWwnOiAwLFxuICAgICdhcmlhLW1vZGFsJzogMCxcbiAgICAnYXJpYS1tdWx0aWxpbmUnOiAwLFxuICAgICdhcmlhLW11bHRpc2VsZWN0YWJsZSc6IDAsXG4gICAgJ2FyaWEtb3JpZW50YXRpb24nOiAwLFxuICAgICdhcmlhLXBsYWNlaG9sZGVyJzogMCxcbiAgICAnYXJpYS1wcmVzc2VkJzogMCxcbiAgICAnYXJpYS1yZWFkb25seSc6IDAsXG4gICAgJ2FyaWEtcmVxdWlyZWQnOiAwLFxuICAgICdhcmlhLXNlbGVjdGVkJzogMCxcbiAgICAnYXJpYS1zb3J0JzogMCxcbiAgICAnYXJpYS12YWx1ZW1heCc6IDAsXG4gICAgJ2FyaWEtdmFsdWVtaW4nOiAwLFxuICAgICdhcmlhLXZhbHVlbm93JzogMCxcbiAgICAnYXJpYS12YWx1ZXRleHQnOiAwLFxuICAgIC8vIExpdmUgUmVnaW9uIEF0dHJpYnV0ZXNcbiAgICAnYXJpYS1hdG9taWMnOiAwLFxuICAgICdhcmlhLWJ1c3knOiAwLFxuICAgICdhcmlhLWxpdmUnOiAwLFxuICAgICdhcmlhLXJlbGV2YW50JzogMCxcbiAgICAvLyBEcmFnLWFuZC1Ecm9wIEF0dHJpYnV0ZXNcbiAgICAnYXJpYS1kcm9wZWZmZWN0JzogMCxcbiAgICAnYXJpYS1ncmFiYmVkJzogMCxcbiAgICAvLyBSZWxhdGlvbnNoaXAgQXR0cmlidXRlc1xuICAgICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnOiAwLFxuICAgICdhcmlhLWNvbGNvdW50JzogMCxcbiAgICAnYXJpYS1jb2xpbmRleCc6IDAsXG4gICAgJ2FyaWEtY29sc3Bhbic6IDAsXG4gICAgJ2FyaWEtY29udHJvbHMnOiAwLFxuICAgICdhcmlhLWRlc2NyaWJlZGJ5JzogMCxcbiAgICAnYXJpYS1lcnJvcm1lc3NhZ2UnOiAwLFxuICAgICdhcmlhLWZsb3d0byc6IDAsXG4gICAgJ2FyaWEtbGFiZWxsZWRieSc6IDAsXG4gICAgJ2FyaWEtb3ducyc6IDAsXG4gICAgJ2FyaWEtcG9zaW5zZXQnOiAwLFxuICAgICdhcmlhLXJvd2NvdW50JzogMCxcbiAgICAnYXJpYS1yb3dpbmRleCc6IDAsXG4gICAgJ2FyaWEtcm93c3Bhbic6IDAsXG4gICAgJ2FyaWEtc2V0c2l6ZSc6IDBcbiAgfSxcbiAgRE9NQXR0cmlidXRlTmFtZXM6IHt9LFxuICBET01Qcm9wZXJ0eU5hbWVzOiB7fVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBBUklBRE9NUHJvcGVydHlDb25maWc7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG5cbnZhciBmb2N1c05vZGUgPSByZXF1aXJlKCdmYmpzL2xpYi9mb2N1c05vZGUnKTtcblxudmFyIEF1dG9Gb2N1c1V0aWxzID0ge1xuICBmb2N1c0RPTUNvbXBvbmVudDogZnVuY3Rpb24gKCkge1xuICAgIGZvY3VzTm9kZShSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0aGlzKSk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gQXV0b0ZvY3VzVXRpbHM7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50IEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXZlbnRQcm9wYWdhdG9ycyA9IHJlcXVpcmUoJy4vRXZlbnRQcm9wYWdhdG9ycycpO1xudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnZmJqcy9saWIvRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcbnZhciBGYWxsYmFja0NvbXBvc2l0aW9uU3RhdGUgPSByZXF1aXJlKCcuL0ZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZScpO1xudmFyIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQnKTtcbnZhciBTeW50aGV0aWNJbnB1dEV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNJbnB1dEV2ZW50Jyk7XG5cbnZhciBFTkRfS0VZQ09ERVMgPSBbOSwgMTMsIDI3LCAzMl07IC8vIFRhYiwgUmV0dXJuLCBFc2MsIFNwYWNlXG52YXIgU1RBUlRfS0VZQ09ERSA9IDIyOTtcblxudmFyIGNhblVzZUNvbXBvc2l0aW9uRXZlbnQgPSBFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgJ0NvbXBvc2l0aW9uRXZlbnQnIGluIHdpbmRvdztcblxudmFyIGRvY3VtZW50TW9kZSA9IG51bGw7XG5pZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmICdkb2N1bWVudE1vZGUnIGluIGRvY3VtZW50KSB7XG4gIGRvY3VtZW50TW9kZSA9IGRvY3VtZW50LmRvY3VtZW50TW9kZTtcbn1cblxuLy8gV2Via2l0IG9mZmVycyBhIHZlcnkgdXNlZnVsIGB0ZXh0SW5wdXRgIGV2ZW50IHRoYXQgY2FuIGJlIHVzZWQgdG9cbi8vIGRpcmVjdGx5IHJlcHJlc2VudCBgYmVmb3JlSW5wdXRgLiBUaGUgSUUgYHRleHRpbnB1dGAgZXZlbnQgaXMgbm90IGFzXG4vLyB1c2VmdWwsIHNvIHdlIGRvbid0IHVzZSBpdC5cbnZhciBjYW5Vc2VUZXh0SW5wdXRFdmVudCA9IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSAmJiAnVGV4dEV2ZW50JyBpbiB3aW5kb3cgJiYgIWRvY3VtZW50TW9kZSAmJiAhaXNQcmVzdG8oKTtcblxuLy8gSW4gSUU5Kywgd2UgaGF2ZSBhY2Nlc3MgdG8gY29tcG9zaXRpb24gZXZlbnRzLCBidXQgdGhlIGRhdGEgc3VwcGxpZWRcbi8vIGJ5IHRoZSBuYXRpdmUgY29tcG9zaXRpb25lbmQgZXZlbnQgbWF5IGJlIGluY29ycmVjdC4gSmFwYW5lc2UgaWRlb2dyYXBoaWNcbi8vIHNwYWNlcywgZm9yIGluc3RhbmNlIChcXHUzMDAwKSBhcmUgbm90IHJlY29yZGVkIGNvcnJlY3RseS5cbnZhciB1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSA9IEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSAmJiAoIWNhblVzZUNvbXBvc2l0aW9uRXZlbnQgfHwgZG9jdW1lbnRNb2RlICYmIGRvY3VtZW50TW9kZSA+IDggJiYgZG9jdW1lbnRNb2RlIDw9IDExKTtcblxuLyoqXG4gKiBPcGVyYSA8PSAxMiBpbmNsdWRlcyBUZXh0RXZlbnQgaW4gd2luZG93LCBidXQgZG9lcyBub3QgZmlyZVxuICogdGV4dCBpbnB1dCBldmVudHMuIFJlbHkgb24ga2V5cHJlc3MgaW5zdGVhZC5cbiAqL1xuZnVuY3Rpb24gaXNQcmVzdG8oKSB7XG4gIHZhciBvcGVyYSA9IHdpbmRvdy5vcGVyYTtcbiAgcmV0dXJuIHR5cGVvZiBvcGVyYSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9wZXJhLnZlcnNpb24gPT09ICdmdW5jdGlvbicgJiYgcGFyc2VJbnQob3BlcmEudmVyc2lvbigpLCAxMCkgPD0gMTI7XG59XG5cbnZhciBTUEFDRUJBUl9DT0RFID0gMzI7XG52YXIgU1BBQ0VCQVJfQ0hBUiA9IFN0cmluZy5mcm9tQ2hhckNvZGUoU1BBQ0VCQVJfQ09ERSk7XG5cbi8vIEV2ZW50cyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBuYW1lcy5cbnZhciBldmVudFR5cGVzID0ge1xuICBiZWZvcmVJbnB1dDoge1xuICAgIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOiB7XG4gICAgICBidWJibGVkOiAnb25CZWZvcmVJbnB1dCcsXG4gICAgICBjYXB0dXJlZDogJ29uQmVmb3JlSW5wdXRDYXB0dXJlJ1xuICAgIH0sXG4gICAgZGVwZW5kZW5jaWVzOiBbJ3RvcENvbXBvc2l0aW9uRW5kJywgJ3RvcEtleVByZXNzJywgJ3RvcFRleHRJbnB1dCcsICd0b3BQYXN0ZSddXG4gIH0sXG4gIGNvbXBvc2l0aW9uRW5kOiB7XG4gICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAgICAgIGJ1YmJsZWQ6ICdvbkNvbXBvc2l0aW9uRW5kJyxcbiAgICAgIGNhcHR1cmVkOiAnb25Db21wb3NpdGlvbkVuZENhcHR1cmUnXG4gICAgfSxcbiAgICBkZXBlbmRlbmNpZXM6IFsndG9wQmx1cicsICd0b3BDb21wb3NpdGlvbkVuZCcsICd0b3BLZXlEb3duJywgJ3RvcEtleVByZXNzJywgJ3RvcEtleVVwJywgJ3RvcE1vdXNlRG93biddXG4gIH0sXG4gIGNvbXBvc2l0aW9uU3RhcnQ6IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogJ29uQ29tcG9zaXRpb25TdGFydCcsXG4gICAgICBjYXB0dXJlZDogJ29uQ29tcG9zaXRpb25TdGFydENhcHR1cmUnXG4gICAgfSxcbiAgICBkZXBlbmRlbmNpZXM6IFsndG9wQmx1cicsICd0b3BDb21wb3NpdGlvblN0YXJ0JywgJ3RvcEtleURvd24nLCAndG9wS2V5UHJlc3MnLCAndG9wS2V5VXAnLCAndG9wTW91c2VEb3duJ11cbiAgfSxcbiAgY29tcG9zaXRpb25VcGRhdGU6IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogJ29uQ29tcG9zaXRpb25VcGRhdGUnLFxuICAgICAgY2FwdHVyZWQ6ICdvbkNvbXBvc2l0aW9uVXBkYXRlQ2FwdHVyZSdcbiAgICB9LFxuICAgIGRlcGVuZGVuY2llczogWyd0b3BCbHVyJywgJ3RvcENvbXBvc2l0aW9uVXBkYXRlJywgJ3RvcEtleURvd24nLCAndG9wS2V5UHJlc3MnLCAndG9wS2V5VXAnLCAndG9wTW91c2VEb3duJ11cbiAgfVxufTtcblxuLy8gVHJhY2sgd2hldGhlciB3ZSd2ZSBldmVyIGhhbmRsZWQgYSBrZXlwcmVzcyBvbiB0aGUgc3BhY2Uga2V5LlxudmFyIGhhc1NwYWNlS2V5cHJlc3MgPSBmYWxzZTtcblxuLyoqXG4gKiBSZXR1cm4gd2hldGhlciBhIG5hdGl2ZSBrZXlwcmVzcyBldmVudCBpcyBhc3N1bWVkIHRvIGJlIGEgY29tbWFuZC5cbiAqIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBGaXJlZm94IGZpcmVzIGBrZXlwcmVzc2AgZXZlbnRzIGZvciBrZXkgY29tbWFuZHNcbiAqIChjdXQsIGNvcHksIHNlbGVjdC1hbGwsIGV0Yy4pIGV2ZW4gdGhvdWdoIG5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZC5cbiAqL1xuZnVuY3Rpb24gaXNLZXlwcmVzc0NvbW1hbmQobmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIChuYXRpdmVFdmVudC5jdHJsS2V5IHx8IG5hdGl2ZUV2ZW50LmFsdEtleSB8fCBuYXRpdmVFdmVudC5tZXRhS2V5KSAmJlxuICAvLyBjdHJsS2V5ICYmIGFsdEtleSBpcyBlcXVpdmFsZW50IHRvIEFsdEdyLCBhbmQgaXMgbm90IGEgY29tbWFuZC5cbiAgIShuYXRpdmVFdmVudC5jdHJsS2V5ICYmIG5hdGl2ZUV2ZW50LmFsdEtleSk7XG59XG5cbi8qKlxuICogVHJhbnNsYXRlIG5hdGl2ZSB0b3AgbGV2ZWwgZXZlbnRzIGludG8gZXZlbnQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvcExldmVsVHlwZVxuICogQHJldHVybiB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRDb21wb3NpdGlvbkV2ZW50VHlwZSh0b3BMZXZlbFR5cGUpIHtcbiAgc3dpdGNoICh0b3BMZXZlbFR5cGUpIHtcbiAgICBjYXNlICd0b3BDb21wb3NpdGlvblN0YXJ0JzpcbiAgICAgIHJldHVybiBldmVudFR5cGVzLmNvbXBvc2l0aW9uU3RhcnQ7XG4gICAgY2FzZSAndG9wQ29tcG9zaXRpb25FbmQnOlxuICAgICAgcmV0dXJuIGV2ZW50VHlwZXMuY29tcG9zaXRpb25FbmQ7XG4gICAgY2FzZSAndG9wQ29tcG9zaXRpb25VcGRhdGUnOlxuICAgICAgcmV0dXJuIGV2ZW50VHlwZXMuY29tcG9zaXRpb25VcGRhdGU7XG4gIH1cbn1cblxuLyoqXG4gKiBEb2VzIG91ciBmYWxsYmFjayBiZXN0LWd1ZXNzIG1vZGVsIHRoaW5rIHRoaXMgZXZlbnQgc2lnbmlmaWVzIHRoYXRcbiAqIGNvbXBvc2l0aW9uIGhhcyBiZWd1bj9cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9wTGV2ZWxUeXBlXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvblN0YXJ0KHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpIHtcbiAgcmV0dXJuIHRvcExldmVsVHlwZSA9PT0gJ3RvcEtleURvd24nICYmIG5hdGl2ZUV2ZW50LmtleUNvZGUgPT09IFNUQVJUX0tFWUNPREU7XG59XG5cbi8qKlxuICogRG9lcyBvdXIgZmFsbGJhY2sgbW9kZSB0aGluayB0aGF0IHRoaXMgZXZlbnQgaXMgdGhlIGVuZCBvZiBjb21wb3NpdGlvbj9cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdG9wTGV2ZWxUeXBlXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZCh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7XG4gICAgY2FzZSAndG9wS2V5VXAnOlxuICAgICAgLy8gQ29tbWFuZCBrZXlzIGluc2VydCBvciBjbGVhciBJTUUgaW5wdXQuXG4gICAgICByZXR1cm4gRU5EX0tFWUNPREVTLmluZGV4T2YobmF0aXZlRXZlbnQua2V5Q29kZSkgIT09IC0xO1xuICAgIGNhc2UgJ3RvcEtleURvd24nOlxuICAgICAgLy8gRXhwZWN0IElNRSBrZXlDb2RlIG9uIGVhY2gga2V5ZG93bi4gSWYgd2UgZ2V0IGFueSBvdGhlclxuICAgICAgLy8gY29kZSB3ZSBtdXN0IGhhdmUgZXhpdGVkIGVhcmxpZXIuXG4gICAgICByZXR1cm4gbmF0aXZlRXZlbnQua2V5Q29kZSAhPT0gU1RBUlRfS0VZQ09ERTtcbiAgICBjYXNlICd0b3BLZXlQcmVzcyc6XG4gICAgY2FzZSAndG9wTW91c2VEb3duJzpcbiAgICBjYXNlICd0b3BCbHVyJzpcbiAgICAgIC8vIEV2ZW50cyBhcmUgbm90IHBvc3NpYmxlIHdpdGhvdXQgY2FuY2VsbGluZyBJTUUuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogR29vZ2xlIElucHV0IFRvb2xzIHByb3ZpZGVzIGNvbXBvc2l0aW9uIGRhdGEgdmlhIGEgQ3VzdG9tRXZlbnQsXG4gKiB3aXRoIHRoZSBgZGF0YWAgcHJvcGVydHkgcG9wdWxhdGVkIGluIHRoZSBgZGV0YWlsYCBvYmplY3QuIElmIHRoaXNcbiAqIGlzIGF2YWlsYWJsZSBvbiB0aGUgZXZlbnQgb2JqZWN0LCB1c2UgaXQuIElmIG5vdCwgdGhpcyBpcyBhIHBsYWluXG4gKiBjb21wb3NpdGlvbiBldmVudCBhbmQgd2UgaGF2ZSBub3RoaW5nIHNwZWNpYWwgdG8gZXh0cmFjdC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnRcbiAqIEByZXR1cm4gez9zdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpIHtcbiAgdmFyIGRldGFpbCA9IG5hdGl2ZUV2ZW50LmRldGFpbDtcbiAgaWYgKHR5cGVvZiBkZXRhaWwgPT09ICdvYmplY3QnICYmICdkYXRhJyBpbiBkZXRhaWwpIHtcbiAgICByZXR1cm4gZGV0YWlsLmRhdGE7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8vIFRyYWNrIHRoZSBjdXJyZW50IElNRSBjb21wb3NpdGlvbiBmYWxsYmFjayBvYmplY3QsIGlmIGFueS5cbnZhciBjdXJyZW50Q29tcG9zaXRpb24gPSBudWxsO1xuXG4vKipcbiAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljQ29tcG9zaXRpb25FdmVudC5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENvbXBvc2l0aW9uRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgdmFyIGV2ZW50VHlwZTtcbiAgdmFyIGZhbGxiYWNrRGF0YTtcblxuICBpZiAoY2FuVXNlQ29tcG9zaXRpb25FdmVudCkge1xuICAgIGV2ZW50VHlwZSA9IGdldENvbXBvc2l0aW9uRXZlbnRUeXBlKHRvcExldmVsVHlwZSk7XG4gIH0gZWxzZSBpZiAoIWN1cnJlbnRDb21wb3NpdGlvbikge1xuICAgIGlmIChpc0ZhbGxiYWNrQ29tcG9zaXRpb25TdGFydCh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgZXZlbnRUeXBlID0gZXZlbnRUeXBlcy5jb21wb3NpdGlvblN0YXJ0O1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0ZhbGxiYWNrQ29tcG9zaXRpb25FbmQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkpIHtcbiAgICBldmVudFR5cGUgPSBldmVudFR5cGVzLmNvbXBvc2l0aW9uRW5kO1xuICB9XG5cbiAgaWYgKCFldmVudFR5cGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmICh1c2VGYWxsYmFja0NvbXBvc2l0aW9uRGF0YSkge1xuICAgIC8vIFRoZSBjdXJyZW50IGNvbXBvc2l0aW9uIGlzIHN0b3JlZCBzdGF0aWNhbGx5IGFuZCBtdXN0IG5vdCBiZVxuICAgIC8vIG92ZXJ3cml0dGVuIHdoaWxlIGNvbXBvc2l0aW9uIGNvbnRpbnVlcy5cbiAgICBpZiAoIWN1cnJlbnRDb21wb3NpdGlvbiAmJiBldmVudFR5cGUgPT09IGV2ZW50VHlwZXMuY29tcG9zaXRpb25TdGFydCkge1xuICAgICAgY3VycmVudENvbXBvc2l0aW9uID0gRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlLmdldFBvb2xlZChuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IGV2ZW50VHlwZXMuY29tcG9zaXRpb25FbmQpIHtcbiAgICAgIGlmIChjdXJyZW50Q29tcG9zaXRpb24pIHtcbiAgICAgICAgZmFsbGJhY2tEYXRhID0gY3VycmVudENvbXBvc2l0aW9uLmdldERhdGEoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgZXZlbnQgPSBTeW50aGV0aWNDb21wb3NpdGlvbkV2ZW50LmdldFBvb2xlZChldmVudFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgaWYgKGZhbGxiYWNrRGF0YSkge1xuICAgIC8vIEluamVjdCBkYXRhIGdlbmVyYXRlZCBmcm9tIGZhbGxiYWNrIHBhdGggaW50byB0aGUgc3ludGhldGljIGV2ZW50LlxuICAgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgcHJvcGVydHkgb2YgbmF0aXZlIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UuXG4gICAgZXZlbnQuZGF0YSA9IGZhbGxiYWNrRGF0YTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgY3VzdG9tRGF0YSA9IGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpO1xuICAgIGlmIChjdXN0b21EYXRhICE9PSBudWxsKSB7XG4gICAgICBldmVudC5kYXRhID0gY3VzdG9tRGF0YTtcbiAgICB9XG4gIH1cblxuICBFdmVudFByb3BhZ2F0b3JzLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZlbnQpO1xuICByZXR1cm4gZXZlbnQ7XG59XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvcExldmVsVHlwZSBSZWNvcmQgZnJvbSBgRXZlbnRDb25zdGFudHNgLlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7P3N0cmluZ30gVGhlIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgYGJlZm9yZUlucHV0YCBldmVudC5cbiAqL1xuZnVuY3Rpb24gZ2V0TmF0aXZlQmVmb3JlSW5wdXRDaGFycyh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSB7XG4gIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7XG4gICAgY2FzZSAndG9wQ29tcG9zaXRpb25FbmQnOlxuICAgICAgcmV0dXJuIGdldERhdGFGcm9tQ3VzdG9tRXZlbnQobmF0aXZlRXZlbnQpO1xuICAgIGNhc2UgJ3RvcEtleVByZXNzJzpcbiAgICAgIC8qKlxuICAgICAgICogSWYgbmF0aXZlIGB0ZXh0SW5wdXRgIGV2ZW50cyBhcmUgYXZhaWxhYmxlLCBvdXIgZ29hbCBpcyB0byBtYWtlXG4gICAgICAgKiB1c2Ugb2YgdGhlbS4gSG93ZXZlciwgdGhlcmUgaXMgYSBzcGVjaWFsIGNhc2U6IHRoZSBzcGFjZWJhciBrZXkuXG4gICAgICAgKiBJbiBXZWJraXQsIHByZXZlbnRpbmcgZGVmYXVsdCBvbiBhIHNwYWNlYmFyIGB0ZXh0SW5wdXRgIGV2ZW50XG4gICAgICAgKiBjYW5jZWxzIGNoYXJhY3RlciBpbnNlcnRpb24sIGJ1dCBpdCAqYWxzbyogY2F1c2VzIHRoZSBicm93c2VyXG4gICAgICAgKiB0byBmYWxsIGJhY2sgdG8gaXRzIGRlZmF1bHQgc3BhY2ViYXIgYmVoYXZpb3Igb2Ygc2Nyb2xsaW5nIHRoZVxuICAgICAgICogcGFnZS5cbiAgICAgICAqXG4gICAgICAgKiBUcmFja2luZyBhdDpcbiAgICAgICAqIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNTUxMDNcbiAgICAgICAqXG4gICAgICAgKiBUbyBhdm9pZCB0aGlzIGlzc3VlLCB1c2UgdGhlIGtleXByZXNzIGV2ZW50IGFzIGlmIG5vIGB0ZXh0SW5wdXRgXG4gICAgICAgKiBldmVudCBpcyBhdmFpbGFibGUuXG4gICAgICAgKi9cbiAgICAgIHZhciB3aGljaCA9IG5hdGl2ZUV2ZW50LndoaWNoO1xuICAgICAgaWYgKHdoaWNoICE9PSBTUEFDRUJBUl9DT0RFKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBoYXNTcGFjZUtleXByZXNzID0gdHJ1ZTtcbiAgICAgIHJldHVybiBTUEFDRUJBUl9DSEFSO1xuXG4gICAgY2FzZSAndG9wVGV4dElucHV0JzpcbiAgICAgIC8vIFJlY29yZCB0aGUgY2hhcmFjdGVycyB0byBiZSBhZGRlZCB0byB0aGUgRE9NLlxuICAgICAgdmFyIGNoYXJzID0gbmF0aXZlRXZlbnQuZGF0YTtcblxuICAgICAgLy8gSWYgaXQncyBhIHNwYWNlYmFyIGNoYXJhY3RlciwgYXNzdW1lIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IGhhbmRsZWRcbiAgICAgIC8vIGl0IGF0IHRoZSBrZXlwcmVzcyBsZXZlbCBhbmQgYmFpbCBpbW1lZGlhdGVseS4gQW5kcm9pZCBDaHJvbWVcbiAgICAgIC8vIGRvZXNuJ3QgZ2l2ZSB1cyBrZXljb2Rlcywgc28gd2UgbmVlZCB0byBibGFja2xpc3QgaXQuXG4gICAgICBpZiAoY2hhcnMgPT09IFNQQUNFQkFSX0NIQVIgJiYgaGFzU3BhY2VLZXlwcmVzcykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNoYXJzO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIEZvciBvdGhlciBuYXRpdmUgZXZlbnQgdHlwZXMsIGRvIG5vdGhpbmcuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEZvciBicm93c2VycyB0aGF0IGRvIG5vdCBwcm92aWRlIHRoZSBgdGV4dElucHV0YCBldmVudCwgZXh0cmFjdCB0aGVcbiAqIGFwcHJvcHJpYXRlIHN0cmluZyB0byB1c2UgZm9yIFN5bnRoZXRpY0lucHV0RXZlbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRvcExldmVsVHlwZSBSZWNvcmQgZnJvbSBgRXZlbnRDb25zdGFudHNgLlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7P3N0cmluZ30gVGhlIGZhbGxiYWNrIHN0cmluZyBmb3IgdGhpcyBgYmVmb3JlSW5wdXRgIGV2ZW50LlxuICovXG5mdW5jdGlvbiBnZXRGYWxsYmFja0JlZm9yZUlucHV0Q2hhcnModG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCkge1xuICAvLyBJZiB3ZSBhcmUgY3VycmVudGx5IGNvbXBvc2luZyAoSU1FKSBhbmQgdXNpbmcgYSBmYWxsYmFjayB0byBkbyBzbyxcbiAgLy8gdHJ5IHRvIGV4dHJhY3QgdGhlIGNvbXBvc2VkIGNoYXJhY3RlcnMgZnJvbSB0aGUgZmFsbGJhY2sgb2JqZWN0LlxuICAvLyBJZiBjb21wb3NpdGlvbiBldmVudCBpcyBhdmFpbGFibGUsIHdlIGV4dHJhY3QgYSBzdHJpbmcgb25seSBhdFxuICAvLyBjb21wb3NpdGlvbmV2ZW50LCBvdGhlcndpc2UgZXh0cmFjdCBpdCBhdCBmYWxsYmFjayBldmVudHMuXG4gIGlmIChjdXJyZW50Q29tcG9zaXRpb24pIHtcbiAgICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wQ29tcG9zaXRpb25FbmQnIHx8ICFjYW5Vc2VDb21wb3NpdGlvbkV2ZW50ICYmIGlzRmFsbGJhY2tDb21wb3NpdGlvbkVuZCh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSkge1xuICAgICAgdmFyIGNoYXJzID0gY3VycmVudENvbXBvc2l0aW9uLmdldERhdGEoKTtcbiAgICAgIEZhbGxiYWNrQ29tcG9zaXRpb25TdGF0ZS5yZWxlYXNlKGN1cnJlbnRDb21wb3NpdGlvbik7XG4gICAgICBjdXJyZW50Q29tcG9zaXRpb24gPSBudWxsO1xuICAgICAgcmV0dXJuIGNoYXJzO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAodG9wTGV2ZWxUeXBlKSB7XG4gICAgY2FzZSAndG9wUGFzdGUnOlxuICAgICAgLy8gSWYgYSBwYXN0ZSBldmVudCBvY2N1cnMgYWZ0ZXIgYSBrZXlwcmVzcywgdGhyb3cgb3V0IHRoZSBpbnB1dFxuICAgICAgLy8gY2hhcnMuIFBhc3RlIGV2ZW50cyBzaG91bGQgbm90IGxlYWQgdG8gQmVmb3JlSW5wdXQgZXZlbnRzLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY2FzZSAndG9wS2V5UHJlc3MnOlxuICAgICAgLyoqXG4gICAgICAgKiBBcyBvZiB2MjcsIEZpcmVmb3ggbWF5IGZpcmUga2V5cHJlc3MgZXZlbnRzIGV2ZW4gd2hlbiBubyBjaGFyYWN0ZXJcbiAgICAgICAqIHdpbGwgYmUgaW5zZXJ0ZWQuIEEgZmV3IHBvc3NpYmlsaXRpZXM6XG4gICAgICAgKlxuICAgICAgICogLSBgd2hpY2hgIGlzIGAwYC4gQXJyb3cga2V5cywgRXNjIGtleSwgZXRjLlxuICAgICAgICpcbiAgICAgICAqIC0gYHdoaWNoYCBpcyB0aGUgcHJlc3NlZCBrZXkgY29kZSwgYnV0IG5vIGNoYXIgaXMgYXZhaWxhYmxlLlxuICAgICAgICogICBFeDogJ0FsdEdyICsgZGAgaW4gUG9saXNoLiBUaGVyZSBpcyBubyBtb2RpZmllZCBjaGFyYWN0ZXIgZm9yXG4gICAgICAgKiAgIHRoaXMga2V5IGNvbWJpbmF0aW9uIGFuZCBubyBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQgaW50byB0aGVcbiAgICAgICAqICAgZG9jdW1lbnQsIGJ1dCBGRiBmaXJlcyB0aGUga2V5cHJlc3MgZm9yIGNoYXIgY29kZSBgMTAwYCBhbnl3YXkuXG4gICAgICAgKiAgIE5vIGBpbnB1dGAgZXZlbnQgd2lsbCBvY2N1ci5cbiAgICAgICAqXG4gICAgICAgKiAtIGB3aGljaGAgaXMgdGhlIHByZXNzZWQga2V5IGNvZGUsIGJ1dCBhIGNvbW1hbmQgY29tYmluYXRpb24gaXNcbiAgICAgICAqICAgYmVpbmcgdXNlZC4gRXg6IGBDbWQrQ2AuIE5vIGNoYXJhY3RlciBpcyBpbnNlcnRlZCwgYW5kIG5vXG4gICAgICAgKiAgIGBpbnB1dGAgZXZlbnQgd2lsbCBvY2N1ci5cbiAgICAgICAqL1xuICAgICAgaWYgKG5hdGl2ZUV2ZW50LndoaWNoICYmICFpc0tleXByZXNzQ29tbWFuZChuYXRpdmVFdmVudCkpIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUobmF0aXZlRXZlbnQud2hpY2gpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY2FzZSAndG9wQ29tcG9zaXRpb25FbmQnOlxuICAgICAgcmV0dXJuIHVzZUZhbGxiYWNrQ29tcG9zaXRpb25EYXRhID8gbnVsbCA6IG5hdGl2ZUV2ZW50LmRhdGE7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdCBhIFN5bnRoZXRpY0lucHV0RXZlbnQgZm9yIGBiZWZvcmVJbnB1dGAsIGJhc2VkIG9uIGVpdGhlciBuYXRpdmVcbiAqIGB0ZXh0SW5wdXRgIG9yIGZhbGxiYWNrIGJlaGF2aW9yLlxuICpcbiAqIEByZXR1cm4gez9vYmplY3R9IEEgU3ludGhldGljSW5wdXRFdmVudC5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEJlZm9yZUlucHV0RXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgdmFyIGNoYXJzO1xuXG4gIGlmIChjYW5Vc2VUZXh0SW5wdXRFdmVudCkge1xuICAgIGNoYXJzID0gZ2V0TmF0aXZlQmVmb3JlSW5wdXRDaGFycyh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KTtcbiAgfSBlbHNlIHtcbiAgICBjaGFycyA9IGdldEZhbGxiYWNrQmVmb3JlSW5wdXRDaGFycyh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KTtcbiAgfVxuXG4gIC8vIElmIG5vIGNoYXJhY3RlcnMgYXJlIGJlaW5nIGluc2VydGVkLCBubyBCZWZvcmVJbnB1dCBldmVudCBzaG91bGRcbiAgLy8gYmUgZmlyZWQuXG4gIGlmICghY2hhcnMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBldmVudCA9IFN5bnRoZXRpY0lucHV0RXZlbnQuZ2V0UG9vbGVkKGV2ZW50VHlwZXMuYmVmb3JlSW5wdXQsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG5cbiAgZXZlbnQuZGF0YSA9IGNoYXJzO1xuICBFdmVudFByb3BhZ2F0b3JzLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZlbnQpO1xuICByZXR1cm4gZXZlbnQ7XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIGBvbkJlZm9yZUlucHV0YCBldmVudCB0byBtYXRjaFxuICogaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAxMzExMDUvI2V2ZW50cy1pbnB1dGV2ZW50cy5cbiAqXG4gKiBUaGlzIGV2ZW50IHBsdWdpbiBpcyBiYXNlZCBvbiB0aGUgbmF0aXZlIGB0ZXh0SW5wdXRgIGV2ZW50XG4gKiBhdmFpbGFibGUgaW4gQ2hyb21lLCBTYWZhcmksIE9wZXJhLCBhbmQgSUUuIFRoaXMgZXZlbnQgZmlyZXMgYWZ0ZXJcbiAqIGBvbktleVByZXNzYCBhbmQgYG9uQ29tcG9zaXRpb25FbmRgLCBidXQgYmVmb3JlIGBvbklucHV0YC5cbiAqXG4gKiBgYmVmb3JlSW5wdXRgIGlzIHNwZWMnZCBidXQgbm90IGltcGxlbWVudGVkIGluIGFueSBicm93c2VycywgYW5kXG4gKiB0aGUgYGlucHV0YCBldmVudCBkb2VzIG5vdCBwcm92aWRlIGFueSB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBoYXNcbiAqIGFjdHVhbGx5IGJlZW4gYWRkZWQsIGNvbnRyYXJ5IHRvIHRoZSBzcGVjLiBUaHVzLCBgdGV4dElucHV0YCBpcyB0aGUgYmVzdFxuICogYXZhaWxhYmxlIGV2ZW50IHRvIGlkZW50aWZ5IHRoZSBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBhY3R1YWxseSBiZWVuIGluc2VydGVkXG4gKiBpbnRvIHRoZSB0YXJnZXQgbm9kZS5cbiAqXG4gKiBUaGlzIHBsdWdpbiBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvciBlbWl0dGluZyBgY29tcG9zaXRpb25gIGV2ZW50cywgdGh1c1xuICogYWxsb3dpbmcgdXMgdG8gc2hhcmUgY29tcG9zaXRpb24gZmFsbGJhY2sgY29kZSBmb3IgYm90aCBgYmVmb3JlSW5wdXRgIGFuZFxuICogYGNvbXBvc2l0aW9uYCBldmVudCB0eXBlcy5cbiAqL1xudmFyIEJlZm9yZUlucHV0RXZlbnRQbHVnaW4gPSB7XG5cbiAgZXZlbnRUeXBlczogZXZlbnRUeXBlcyxcblxuICBleHRyYWN0RXZlbnRzOiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICByZXR1cm4gW2V4dHJhY3RDb21wb3NpdGlvbkV2ZW50KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSwgZXh0cmFjdEJlZm9yZUlucHV0RXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpXTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ1NTIHByb3BlcnRpZXMgd2hpY2ggYWNjZXB0IG51bWJlcnMgYnV0IGFyZSBub3QgaW4gdW5pdHMgb2YgXCJweFwiLlxuICovXG5cbnZhciBpc1VuaXRsZXNzTnVtYmVyID0ge1xuICBhbmltYXRpb25JdGVyYXRpb25Db3VudDogdHJ1ZSxcbiAgYm9yZGVySW1hZ2VPdXRzZXQ6IHRydWUsXG4gIGJvcmRlckltYWdlU2xpY2U6IHRydWUsXG4gIGJvcmRlckltYWdlV2lkdGg6IHRydWUsXG4gIGJveEZsZXg6IHRydWUsXG4gIGJveEZsZXhHcm91cDogdHJ1ZSxcbiAgYm94T3JkaW5hbEdyb3VwOiB0cnVlLFxuICBjb2x1bW5Db3VudDogdHJ1ZSxcbiAgZmxleDogdHJ1ZSxcbiAgZmxleEdyb3c6IHRydWUsXG4gIGZsZXhQb3NpdGl2ZTogdHJ1ZSxcbiAgZmxleFNocmluazogdHJ1ZSxcbiAgZmxleE5lZ2F0aXZlOiB0cnVlLFxuICBmbGV4T3JkZXI6IHRydWUsXG4gIGdyaWRSb3c6IHRydWUsXG4gIGdyaWRDb2x1bW46IHRydWUsXG4gIGZvbnRXZWlnaHQ6IHRydWUsXG4gIGxpbmVDbGFtcDogdHJ1ZSxcbiAgbGluZUhlaWdodDogdHJ1ZSxcbiAgb3BhY2l0eTogdHJ1ZSxcbiAgb3JkZXI6IHRydWUsXG4gIG9ycGhhbnM6IHRydWUsXG4gIHRhYlNpemU6IHRydWUsXG4gIHdpZG93czogdHJ1ZSxcbiAgekluZGV4OiB0cnVlLFxuICB6b29tOiB0cnVlLFxuXG4gIC8vIFNWRy1yZWxhdGVkIHByb3BlcnRpZXNcbiAgZmlsbE9wYWNpdHk6IHRydWUsXG4gIGZsb29kT3BhY2l0eTogdHJ1ZSxcbiAgc3RvcE9wYWNpdHk6IHRydWUsXG4gIHN0cm9rZURhc2hhcnJheTogdHJ1ZSxcbiAgc3Ryb2tlRGFzaG9mZnNldDogdHJ1ZSxcbiAgc3Ryb2tlTWl0ZXJsaW1pdDogdHJ1ZSxcbiAgc3Ryb2tlT3BhY2l0eTogdHJ1ZSxcbiAgc3Ryb2tlV2lkdGg6IHRydWVcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeCB2ZW5kb3Itc3BlY2lmaWMgcHJlZml4LCBlZzogV2Via2l0XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IHN0eWxlIG5hbWUsIGVnOiB0cmFuc2l0aW9uRHVyYXRpb25cbiAqIEByZXR1cm4ge3N0cmluZ30gc3R5bGUgbmFtZSBwcmVmaXhlZCB3aXRoIGBwcmVmaXhgLCBwcm9wZXJseSBjYW1lbENhc2VkLCBlZzpcbiAqIFdlYmtpdFRyYW5zaXRpb25EdXJhdGlvblxuICovXG5mdW5jdGlvbiBwcmVmaXhLZXkocHJlZml4LCBrZXkpIHtcbiAgcmV0dXJuIHByZWZpeCArIGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zdWJzdHJpbmcoMSk7XG59XG5cbi8qKlxuICogU3VwcG9ydCBzdHlsZSBuYW1lcyB0aGF0IG1heSBjb21lIHBhc3NlZCBpbiBwcmVmaXhlZCBieSBhZGRpbmcgcGVybXV0YXRpb25zXG4gKiBvZiB2ZW5kb3IgcHJlZml4ZXMuXG4gKi9cbnZhciBwcmVmaXhlcyA9IFsnV2Via2l0JywgJ21zJywgJ01veicsICdPJ107XG5cbi8vIFVzaW5nIE9iamVjdC5rZXlzIGhlcmUsIG9yIGVsc2UgdGhlIHZhbmlsbGEgZm9yLWluIGxvb3AgbWFrZXMgSUU4IGdvIGludG8gYW5cbi8vIGluZmluaXRlIGxvb3AsIGJlY2F1c2UgaXQgaXRlcmF0ZXMgb3ZlciB0aGUgbmV3bHkgYWRkZWQgcHJvcHMgdG9vLlxuT2JqZWN0LmtleXMoaXNVbml0bGVzc051bWJlcikuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICBwcmVmaXhlcy5mb3JFYWNoKGZ1bmN0aW9uIChwcmVmaXgpIHtcbiAgICBpc1VuaXRsZXNzTnVtYmVyW3ByZWZpeEtleShwcmVmaXgsIHByb3ApXSA9IGlzVW5pdGxlc3NOdW1iZXJbcHJvcF07XG4gIH0pO1xufSk7XG5cbi8qKlxuICogTW9zdCBzdHlsZSBwcm9wZXJ0aWVzIGNhbiBiZSB1bnNldCBieSBkb2luZyAuc3R5bGVbcHJvcF0gPSAnJyBidXQgSUU4XG4gKiBkb2Vzbid0IGxpa2UgZG9pbmcgdGhhdCB3aXRoIHNob3J0aGFuZCBwcm9wZXJ0aWVzIHNvIGZvciB0aGUgcHJvcGVydGllcyB0aGF0XG4gKiBJRTggYnJlYWtzIG9uLCB3aGljaCBhcmUgbGlzdGVkIGhlcmUsIHdlIGluc3RlYWQgdW5zZXQgZWFjaCBvZiB0aGVcbiAqIGluZGl2aWR1YWwgcHJvcGVydGllcy4gU2VlIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzg1LlxuICogVGhlIDQtdmFsdWUgJ2Nsb2NrJyBwcm9wZXJ0aWVzIGxpa2UgbWFyZ2luLCBwYWRkaW5nLCBib3JkZXItd2lkdGggc2VlbSB0b1xuICogYmVoYXZlIHdpdGhvdXQgYW55IHByb2JsZW1zLiBDdXJpb3VzbHksIGxpc3Qtc3R5bGUgd29ya3MgdG9vIHdpdGhvdXQgYW55XG4gKiBzcGVjaWFsIHByb2RkaW5nLlxuICovXG52YXIgc2hvcnRoYW5kUHJvcGVydHlFeHBhbnNpb25zID0ge1xuICBiYWNrZ3JvdW5kOiB7XG4gICAgYmFja2dyb3VuZEF0dGFjaG1lbnQ6IHRydWUsXG4gICAgYmFja2dyb3VuZENvbG9yOiB0cnVlLFxuICAgIGJhY2tncm91bmRJbWFnZTogdHJ1ZSxcbiAgICBiYWNrZ3JvdW5kUG9zaXRpb25YOiB0cnVlLFxuICAgIGJhY2tncm91bmRQb3NpdGlvblk6IHRydWUsXG4gICAgYmFja2dyb3VuZFJlcGVhdDogdHJ1ZVxuICB9LFxuICBiYWNrZ3JvdW5kUG9zaXRpb246IHtcbiAgICBiYWNrZ3JvdW5kUG9zaXRpb25YOiB0cnVlLFxuICAgIGJhY2tncm91bmRQb3NpdGlvblk6IHRydWVcbiAgfSxcbiAgYm9yZGVyOiB7XG4gICAgYm9yZGVyV2lkdGg6IHRydWUsXG4gICAgYm9yZGVyU3R5bGU6IHRydWUsXG4gICAgYm9yZGVyQ29sb3I6IHRydWVcbiAgfSxcbiAgYm9yZGVyQm90dG9tOiB7XG4gICAgYm9yZGVyQm90dG9tV2lkdGg6IHRydWUsXG4gICAgYm9yZGVyQm90dG9tU3R5bGU6IHRydWUsXG4gICAgYm9yZGVyQm90dG9tQ29sb3I6IHRydWVcbiAgfSxcbiAgYm9yZGVyTGVmdDoge1xuICAgIGJvcmRlckxlZnRXaWR0aDogdHJ1ZSxcbiAgICBib3JkZXJMZWZ0U3R5bGU6IHRydWUsXG4gICAgYm9yZGVyTGVmdENvbG9yOiB0cnVlXG4gIH0sXG4gIGJvcmRlclJpZ2h0OiB7XG4gICAgYm9yZGVyUmlnaHRXaWR0aDogdHJ1ZSxcbiAgICBib3JkZXJSaWdodFN0eWxlOiB0cnVlLFxuICAgIGJvcmRlclJpZ2h0Q29sb3I6IHRydWVcbiAgfSxcbiAgYm9yZGVyVG9wOiB7XG4gICAgYm9yZGVyVG9wV2lkdGg6IHRydWUsXG4gICAgYm9yZGVyVG9wU3R5bGU6IHRydWUsXG4gICAgYm9yZGVyVG9wQ29sb3I6IHRydWVcbiAgfSxcbiAgZm9udDoge1xuICAgIGZvbnRTdHlsZTogdHJ1ZSxcbiAgICBmb250VmFyaWFudDogdHJ1ZSxcbiAgICBmb250V2VpZ2h0OiB0cnVlLFxuICAgIGZvbnRTaXplOiB0cnVlLFxuICAgIGxpbmVIZWlnaHQ6IHRydWUsXG4gICAgZm9udEZhbWlseTogdHJ1ZVxuICB9LFxuICBvdXRsaW5lOiB7XG4gICAgb3V0bGluZVdpZHRoOiB0cnVlLFxuICAgIG91dGxpbmVTdHlsZTogdHJ1ZSxcbiAgICBvdXRsaW5lQ29sb3I6IHRydWVcbiAgfVxufTtcblxudmFyIENTU1Byb3BlcnR5ID0ge1xuICBpc1VuaXRsZXNzTnVtYmVyOiBpc1VuaXRsZXNzTnVtYmVyLFxuICBzaG9ydGhhbmRQcm9wZXJ0eUV4cGFuc2lvbnM6IHNob3J0aGFuZFByb3BlcnR5RXhwYW5zaW9uc1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDU1NQcm9wZXJ0eTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ1NTUHJvcGVydHkgPSByZXF1aXJlKCcuL0NTU1Byb3BlcnR5Jyk7XG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xuXG52YXIgY2FtZWxpemVTdHlsZU5hbWUgPSByZXF1aXJlKCdmYmpzL2xpYi9jYW1lbGl6ZVN0eWxlTmFtZScpO1xudmFyIGRhbmdlcm91c1N0eWxlVmFsdWUgPSByZXF1aXJlKCcuL2Rhbmdlcm91c1N0eWxlVmFsdWUnKTtcbnZhciBoeXBoZW5hdGVTdHlsZU5hbWUgPSByZXF1aXJlKCdmYmpzL2xpYi9oeXBoZW5hdGVTdHlsZU5hbWUnKTtcbnZhciBtZW1vaXplU3RyaW5nT25seSA9IHJlcXVpcmUoJ2ZianMvbGliL21lbW9pemVTdHJpbmdPbmx5Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIHByb2Nlc3NTdHlsZU5hbWUgPSBtZW1vaXplU3RyaW5nT25seShmdW5jdGlvbiAoc3R5bGVOYW1lKSB7XG4gIHJldHVybiBoeXBoZW5hdGVTdHlsZU5hbWUoc3R5bGVOYW1lKTtcbn0pO1xuXG52YXIgaGFzU2hvcnRoYW5kUHJvcGVydHlCdWcgPSBmYWxzZTtcbnZhciBzdHlsZUZsb2F0QWNjZXNzb3IgPSAnY3NzRmxvYXQnO1xuaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkge1xuICB2YXIgdGVtcFN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7XG4gIHRyeSB7XG4gICAgLy8gSUU4IHRocm93cyBcIkludmFsaWQgYXJndW1lbnQuXCIgaWYgcmVzZXR0aW5nIHNob3J0aGFuZCBzdHlsZSBwcm9wZXJ0aWVzLlxuICAgIHRlbXBTdHlsZS5mb250ID0gJyc7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBoYXNTaG9ydGhhbmRQcm9wZXJ0eUJ1ZyA9IHRydWU7XG4gIH1cbiAgLy8gSUU4IG9ubHkgc3VwcG9ydHMgYWNjZXNzaW5nIGNzc0Zsb2F0IChzdGFuZGFyZCkgYXMgc3R5bGVGbG9hdFxuICBpZiAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmNzc0Zsb2F0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzdHlsZUZsb2F0QWNjZXNzb3IgPSAnc3R5bGVGbG9hdCc7XG4gIH1cbn1cblxuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIC8vICdtc1RyYW5zZm9ybScgaXMgY29ycmVjdCwgYnV0IHRoZSBvdGhlciBwcmVmaXhlcyBzaG91bGQgYmUgY2FwaXRhbGl6ZWRcbiAgdmFyIGJhZFZlbmRvcmVkU3R5bGVOYW1lUGF0dGVybiA9IC9eKD86d2Via2l0fG1venxvKVtBLVpdLztcblxuICAvLyBzdHlsZSB2YWx1ZXMgc2hvdWxkbid0IGNvbnRhaW4gYSBzZW1pY29sb25cbiAgdmFyIGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybiA9IC87XFxzKiQvO1xuXG4gIHZhciB3YXJuZWRTdHlsZU5hbWVzID0ge307XG4gIHZhciB3YXJuZWRTdHlsZVZhbHVlcyA9IHt9O1xuICB2YXIgd2FybmVkRm9yTmFOVmFsdWUgPSBmYWxzZTtcblxuICB2YXIgd2Fybkh5cGhlbmF0ZWRTdHlsZU5hbWUgPSBmdW5jdGlvbiAobmFtZSwgb3duZXIpIHtcbiAgICBpZiAod2FybmVkU3R5bGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiB3YXJuZWRTdHlsZU5hbWVzW25hbWVdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSA9IHRydWU7XG4gICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVW5zdXBwb3J0ZWQgc3R5bGUgcHJvcGVydHkgJXMuIERpZCB5b3UgbWVhbiAlcz8lcycsIG5hbWUsIGNhbWVsaXplU3R5bGVOYW1lKG5hbWUpLCBjaGVja1JlbmRlck1lc3NhZ2Uob3duZXIpKSA6IHZvaWQgMDtcbiAgfTtcblxuICB2YXIgd2FybkJhZFZlbmRvcmVkU3R5bGVOYW1lID0gZnVuY3Rpb24gKG5hbWUsIG93bmVyKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlTmFtZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkU3R5bGVOYW1lc1tuYW1lXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdhcm5lZFN0eWxlTmFtZXNbbmFtZV0gPSB0cnVlO1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1Vuc3VwcG9ydGVkIHZlbmRvci1wcmVmaXhlZCBzdHlsZSBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuICVzPyVzJywgbmFtZSwgbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSksIGNoZWNrUmVuZGVyTWVzc2FnZShvd25lcikpIDogdm9pZCAwO1xuICB9O1xuXG4gIHZhciB3YXJuU3R5bGVWYWx1ZVdpdGhTZW1pY29sb24gPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIG93bmVyKSB7XG4gICAgaWYgKHdhcm5lZFN0eWxlVmFsdWVzLmhhc093blByb3BlcnR5KHZhbHVlKSAmJiB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRTdHlsZVZhbHVlc1t2YWx1ZV0gPSB0cnVlO1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1N0eWxlIHByb3BlcnR5IHZhbHVlcyBzaG91bGRuXFwndCBjb250YWluIGEgc2VtaWNvbG9uLiVzICcgKyAnVHJ5IFwiJXM6ICVzXCIgaW5zdGVhZC4nLCBjaGVja1JlbmRlck1lc3NhZ2Uob3duZXIpLCBuYW1lLCB2YWx1ZS5yZXBsYWNlKGJhZFN0eWxlVmFsdWVXaXRoU2VtaWNvbG9uUGF0dGVybiwgJycpKSA6IHZvaWQgMDtcbiAgfTtcblxuICB2YXIgd2FyblN0eWxlVmFsdWVJc05hTiA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSwgb3duZXIpIHtcbiAgICBpZiAod2FybmVkRm9yTmFOVmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB3YXJuZWRGb3JOYU5WYWx1ZSA9IHRydWU7XG4gICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnYE5hTmAgaXMgYW4gaW52YWxpZCB2YWx1ZSBmb3IgdGhlIGAlc2AgY3NzIHN0eWxlIHByb3BlcnR5LiVzJywgbmFtZSwgY2hlY2tSZW5kZXJNZXNzYWdlKG93bmVyKSkgOiB2b2lkIDA7XG4gIH07XG5cbiAgdmFyIGNoZWNrUmVuZGVyTWVzc2FnZSA9IGZ1bmN0aW9uIChvd25lcikge1xuICAgIGlmIChvd25lcikge1xuICAgICAgdmFyIG5hbWUgPSBvd25lci5nZXROYW1lKCk7XG4gICAgICBpZiAobmFtZSkge1xuICAgICAgICByZXR1cm4gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtSZWFjdERPTUNvbXBvbmVudH0gY29tcG9uZW50XG4gICAqL1xuICB2YXIgd2FyblZhbGlkU3R5bGUgPSBmdW5jdGlvbiAobmFtZSwgdmFsdWUsIGNvbXBvbmVudCkge1xuICAgIHZhciBvd25lcjtcbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICBvd25lciA9IGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQuX293bmVyO1xuICAgIH1cbiAgICBpZiAobmFtZS5pbmRleE9mKCctJykgPiAtMSkge1xuICAgICAgd2Fybkh5cGhlbmF0ZWRTdHlsZU5hbWUobmFtZSwgb3duZXIpO1xuICAgIH0gZWxzZSBpZiAoYmFkVmVuZG9yZWRTdHlsZU5hbWVQYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICAgIHdhcm5CYWRWZW5kb3JlZFN0eWxlTmFtZShuYW1lLCBvd25lcik7XG4gICAgfSBlbHNlIGlmIChiYWRTdHlsZVZhbHVlV2l0aFNlbWljb2xvblBhdHRlcm4udGVzdCh2YWx1ZSkpIHtcbiAgICAgIHdhcm5TdHlsZVZhbHVlV2l0aFNlbWljb2xvbihuYW1lLCB2YWx1ZSwgb3duZXIpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzTmFOKHZhbHVlKSkge1xuICAgICAgd2FyblN0eWxlVmFsdWVJc05hTihuYW1lLCB2YWx1ZSwgb3duZXIpO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBPcGVyYXRpb25zIGZvciBkZWFsaW5nIHdpdGggQ1NTIHByb3BlcnRpZXMuXG4gKi9cbnZhciBDU1NQcm9wZXJ0eU9wZXJhdGlvbnMgPSB7XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSBtYXBwaW5nIG9mIHN0eWxlIHByb3BlcnRpZXMgZm9yIHVzZSBhcyBpbmxpbmUgc3R5bGVzOlxuICAgKlxuICAgKiAgID4gY3JlYXRlTWFya3VwRm9yU3R5bGVzKHt3aWR0aDogJzIwMHB4JywgaGVpZ2h0OiAwfSlcbiAgICogICBcIndpZHRoOjIwMHB4O2hlaWdodDowO1wiXG4gICAqXG4gICAqIFVuZGVmaW5lZCB2YWx1ZXMgYXJlIGlnbm9yZWQgc28gdGhhdCBkZWNsYXJhdGl2ZSBwcm9ncmFtbWluZyBpcyBlYXNpZXIuXG4gICAqIFRoZSByZXN1bHQgc2hvdWxkIGJlIEhUTUwtZXNjYXBlZCBiZWZvcmUgaW5zZXJ0aW9uIGludG8gdGhlIERPTS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHN0eWxlc1xuICAgKiBAcGFyYW0ge1JlYWN0RE9NQ29tcG9uZW50fSBjb21wb25lbnRcbiAgICogQHJldHVybiB7P3N0cmluZ31cbiAgICovXG4gIGNyZWF0ZU1hcmt1cEZvclN0eWxlczogZnVuY3Rpb24gKHN0eWxlcywgY29tcG9uZW50KSB7XG4gICAgdmFyIHNlcmlhbGl6ZWQgPSAnJztcbiAgICBmb3IgKHZhciBzdHlsZU5hbWUgaW4gc3R5bGVzKSB7XG4gICAgICBpZiAoIXN0eWxlcy5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIHN0eWxlVmFsdWUgPSBzdHlsZXNbc3R5bGVOYW1lXTtcbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICB3YXJuVmFsaWRTdHlsZShzdHlsZU5hbWUsIHN0eWxlVmFsdWUsIGNvbXBvbmVudCk7XG4gICAgICB9XG4gICAgICBpZiAoc3R5bGVWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHNlcmlhbGl6ZWQgKz0gcHJvY2Vzc1N0eWxlTmFtZShzdHlsZU5hbWUpICsgJzonO1xuICAgICAgICBzZXJpYWxpemVkICs9IGRhbmdlcm91c1N0eWxlVmFsdWUoc3R5bGVOYW1lLCBzdHlsZVZhbHVlLCBjb21wb25lbnQpICsgJzsnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplZCB8fCBudWxsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgbXVsdGlwbGUgc3R5bGVzIG9uIGEgbm9kZS4gIElmIGEgdmFsdWUgaXMgc3BlY2lmaWVkIGFzXG4gICAqICcnIChlbXB0eSBzdHJpbmcpLCB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSB3aWxsIGJlIHVuc2V0LlxuICAgKlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAgICogQHBhcmFtIHtvYmplY3R9IHN0eWxlc1xuICAgKiBAcGFyYW0ge1JlYWN0RE9NQ29tcG9uZW50fSBjb21wb25lbnRcbiAgICovXG4gIHNldFZhbHVlRm9yU3R5bGVzOiBmdW5jdGlvbiAobm9kZSwgc3R5bGVzLCBjb21wb25lbnQpIHtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe1xuICAgICAgICBpbnN0YW5jZUlEOiBjb21wb25lbnQuX2RlYnVnSUQsXG4gICAgICAgIHR5cGU6ICd1cGRhdGUgc3R5bGVzJyxcbiAgICAgICAgcGF5bG9hZDogc3R5bGVzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgc3R5bGUgPSBub2RlLnN0eWxlO1xuICAgIGZvciAodmFyIHN0eWxlTmFtZSBpbiBzdHlsZXMpIHtcbiAgICAgIGlmICghc3R5bGVzLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgd2FyblZhbGlkU3R5bGUoc3R5bGVOYW1lLCBzdHlsZXNbc3R5bGVOYW1lXSwgY29tcG9uZW50KTtcbiAgICAgIH1cbiAgICAgIHZhciBzdHlsZVZhbHVlID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZShzdHlsZU5hbWUsIHN0eWxlc1tzdHlsZU5hbWVdLCBjb21wb25lbnQpO1xuICAgICAgaWYgKHN0eWxlTmFtZSA9PT0gJ2Zsb2F0JyB8fCBzdHlsZU5hbWUgPT09ICdjc3NGbG9hdCcpIHtcbiAgICAgICAgc3R5bGVOYW1lID0gc3R5bGVGbG9hdEFjY2Vzc29yO1xuICAgICAgfVxuICAgICAgaWYgKHN0eWxlVmFsdWUpIHtcbiAgICAgICAgc3R5bGVbc3R5bGVOYW1lXSA9IHN0eWxlVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZXhwYW5zaW9uID0gaGFzU2hvcnRoYW5kUHJvcGVydHlCdWcgJiYgQ1NTUHJvcGVydHkuc2hvcnRoYW5kUHJvcGVydHlFeHBhbnNpb25zW3N0eWxlTmFtZV07XG4gICAgICAgIGlmIChleHBhbnNpb24pIHtcbiAgICAgICAgICAvLyBTaG9ydGhhbmQgcHJvcGVydHkgdGhhdCBJRTggd29uJ3QgbGlrZSB1bnNldHRpbmcsIHNvIHVuc2V0IGVhY2hcbiAgICAgICAgICAvLyBjb21wb25lbnQgdG8gcGxhY2F0ZSBpdFxuICAgICAgICAgIGZvciAodmFyIGluZGl2aWR1YWxTdHlsZU5hbWUgaW4gZXhwYW5zaW9uKSB7XG4gICAgICAgICAgICBzdHlsZVtpbmRpdmlkdWFsU3R5bGVOYW1lXSA9ICcnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHlsZVtzdHlsZU5hbWVdID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDU1NQcm9wZXJ0eU9wZXJhdGlvbnM7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG52YXIgUG9vbGVkQ2xhc3MgPSByZXF1aXJlKCcuL1Bvb2xlZENsYXNzJyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHBzZXVkby1ldmVudCBtb2R1bGUgdG8gaGVscCBrZWVwIHRyYWNrIG9mIGNvbXBvbmVudHMgd2FpdGluZyB0b1xuICogYmUgbm90aWZpZWQgd2hlbiB0aGVpciBET00gcmVwcmVzZW50YXRpb25zIGFyZSBhdmFpbGFibGUgZm9yIHVzZS5cbiAqXG4gKiBUaGlzIGltcGxlbWVudHMgYFBvb2xlZENsYXNzYCwgc28geW91IHNob3VsZCBuZXZlciBuZWVkIHRvIGluc3RhbnRpYXRlIHRoaXMuXG4gKiBJbnN0ZWFkLCB1c2UgYENhbGxiYWNrUXVldWUuZ2V0UG9vbGVkKClgLlxuICpcbiAqIEBjbGFzcyBSZWFjdE1vdW50UmVhZHlcbiAqIEBpbXBsZW1lbnRzIFBvb2xlZENsYXNzXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG52YXIgQ2FsbGJhY2tRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQ2FsbGJhY2tRdWV1ZShhcmcpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2FsbGJhY2tRdWV1ZSk7XG5cbiAgICB0aGlzLl9jYWxsYmFja3MgPSBudWxsO1xuICAgIHRoaXMuX2NvbnRleHRzID0gbnVsbDtcbiAgICB0aGlzLl9hcmcgPSBhcmc7XG4gIH1cblxuICAvKipcbiAgICogRW5xdWV1ZXMgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYG5vdGlmeUFsbGAgaXMgaW52b2tlZC5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2sgSW52b2tlZCB3aGVuIGBub3RpZnlBbGxgIGlzIGludm9rZWQuXG4gICAqIEBwYXJhbSB7P29iamVjdH0gY29udGV4dCBDb250ZXh0IHRvIGNhbGwgYGNhbGxiYWNrYCB3aXRoLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cblxuICBDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5lbnF1ZXVlID0gZnVuY3Rpb24gZW5xdWV1ZShjYWxsYmFjaywgY29udGV4dCkge1xuICAgIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcyB8fCBbXTtcbiAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgdGhpcy5fY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cyB8fCBbXTtcbiAgICB0aGlzLl9jb250ZXh0cy5wdXNoKGNvbnRleHQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBJbnZva2VzIGFsbCBlbnF1ZXVlZCBjYWxsYmFja3MgYW5kIGNsZWFycyB0aGUgcXVldWUuIFRoaXMgaXMgaW52b2tlZCBhZnRlclxuICAgKiB0aGUgRE9NIHJlcHJlc2VudGF0aW9uIG9mIGEgY29tcG9uZW50IGhhcyBiZWVuIGNyZWF0ZWQgb3IgdXBkYXRlZC5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuXG5cbiAgQ2FsbGJhY2tRdWV1ZS5wcm90b3R5cGUubm90aWZ5QWxsID0gZnVuY3Rpb24gbm90aWZ5QWxsKCkge1xuICAgIHZhciBjYWxsYmFja3MgPSB0aGlzLl9jYWxsYmFja3M7XG4gICAgdmFyIGNvbnRleHRzID0gdGhpcy5fY29udGV4dHM7XG4gICAgdmFyIGFyZyA9IHRoaXMuX2FyZztcbiAgICBpZiAoY2FsbGJhY2tzICYmIGNvbnRleHRzKSB7XG4gICAgICAhKGNhbGxiYWNrcy5sZW5ndGggPT09IGNvbnRleHRzLmxlbmd0aCkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ01pc21hdGNoZWQgbGlzdCBvZiBjb250ZXh0cyBpbiBjYWxsYmFjayBxdWV1ZScpIDogX3Byb2RJbnZhcmlhbnQoJzI0JykgOiB2b2lkIDA7XG4gICAgICB0aGlzLl9jYWxsYmFja3MgPSBudWxsO1xuICAgICAgdGhpcy5fY29udGV4dHMgPSBudWxsO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjYWxsYmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY2FsbGJhY2tzW2ldLmNhbGwoY29udGV4dHNbaV0sIGFyZyk7XG4gICAgICB9XG4gICAgICBjYWxsYmFja3MubGVuZ3RoID0gMDtcbiAgICAgIGNvbnRleHRzLmxlbmd0aCA9IDA7XG4gICAgfVxuICB9O1xuXG4gIENhbGxiYWNrUXVldWUucHJvdG90eXBlLmNoZWNrcG9pbnQgPSBmdW5jdGlvbiBjaGVja3BvaW50KCkge1xuICAgIHJldHVybiB0aGlzLl9jYWxsYmFja3MgPyB0aGlzLl9jYWxsYmFja3MubGVuZ3RoIDogMDtcbiAgfTtcblxuICBDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5yb2xsYmFjayA9IGZ1bmN0aW9uIHJvbGxiYWNrKGxlbikge1xuICAgIGlmICh0aGlzLl9jYWxsYmFja3MgJiYgdGhpcy5fY29udGV4dHMpIHtcbiAgICAgIHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPSBsZW47XG4gICAgICB0aGlzLl9jb250ZXh0cy5sZW5ndGggPSBsZW47XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGludGVybmFsIHF1ZXVlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG5cblxuICBDYWxsYmFja1F1ZXVlLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uIHJlc2V0KCkge1xuICAgIHRoaXMuX2NhbGxiYWNrcyA9IG51bGw7XG4gICAgdGhpcy5fY29udGV4dHMgPSBudWxsO1xuICB9O1xuXG4gIC8qKlxuICAgKiBgUG9vbGVkQ2xhc3NgIGxvb2tzIGZvciB0aGlzLlxuICAgKi9cblxuXG4gIENhbGxiYWNrUXVldWUucHJvdG90eXBlLmRlc3RydWN0b3IgPSBmdW5jdGlvbiBkZXN0cnVjdG9yKCkge1xuICAgIHRoaXMucmVzZXQoKTtcbiAgfTtcblxuICByZXR1cm4gQ2FsbGJhY2tRdWV1ZTtcbn0oKTtcblxubW9kdWxlLmV4cG9ydHMgPSBQb29sZWRDbGFzcy5hZGRQb29saW5nVG8oQ2FsbGJhY2tRdWV1ZSk7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV2ZW50UGx1Z2luSHViID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpbkh1YicpO1xudmFyIEV2ZW50UHJvcGFnYXRvcnMgPSByZXF1aXJlKCcuL0V2ZW50UHJvcGFnYXRvcnMnKTtcbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xudmFyIFN5bnRoZXRpY0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNFdmVudCcpO1xuXG52YXIgZ2V0RXZlbnRUYXJnZXQgPSByZXF1aXJlKCcuL2dldEV2ZW50VGFyZ2V0Jyk7XG52YXIgaXNFdmVudFN1cHBvcnRlZCA9IHJlcXVpcmUoJy4vaXNFdmVudFN1cHBvcnRlZCcpO1xudmFyIGlzVGV4dElucHV0RWxlbWVudCA9IHJlcXVpcmUoJy4vaXNUZXh0SW5wdXRFbGVtZW50Jyk7XG5cbnZhciBldmVudFR5cGVzID0ge1xuICBjaGFuZ2U6IHtcbiAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICAgICAgYnViYmxlZDogJ29uQ2hhbmdlJyxcbiAgICAgIGNhcHR1cmVkOiAnb25DaGFuZ2VDYXB0dXJlJ1xuICAgIH0sXG4gICAgZGVwZW5kZW5jaWVzOiBbJ3RvcEJsdXInLCAndG9wQ2hhbmdlJywgJ3RvcENsaWNrJywgJ3RvcEZvY3VzJywgJ3RvcElucHV0JywgJ3RvcEtleURvd24nLCAndG9wS2V5VXAnLCAndG9wU2VsZWN0aW9uQ2hhbmdlJ11cbiAgfVxufTtcblxuLyoqXG4gKiBGb3IgSUUgc2hpbXNcbiAqL1xudmFyIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbnZhciBhY3RpdmVFbGVtZW50VmFsdWUgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRWYWx1ZVByb3AgPSBudWxsO1xuXG4vKipcbiAqIFNFQ1RJT046IGhhbmRsZSBgY2hhbmdlYCBldmVudFxuICovXG5mdW5jdGlvbiBzaG91bGRVc2VDaGFuZ2VFdmVudChlbGVtKSB7XG4gIHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gbm9kZU5hbWUgPT09ICdzZWxlY3QnIHx8IG5vZGVOYW1lID09PSAnaW5wdXQnICYmIGVsZW0udHlwZSA9PT0gJ2ZpbGUnO1xufVxuXG52YXIgZG9lc0NoYW5nZUV2ZW50QnViYmxlID0gZmFsc2U7XG5pZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7XG4gIC8vIFNlZSBgaGFuZGxlQ2hhbmdlYCBjb21tZW50IGJlbG93XG4gIGRvZXNDaGFuZ2VFdmVudEJ1YmJsZSA9IGlzRXZlbnRTdXBwb3J0ZWQoJ2NoYW5nZScpICYmICghZG9jdW1lbnQuZG9jdW1lbnRNb2RlIHx8IGRvY3VtZW50LmRvY3VtZW50TW9kZSA+IDgpO1xufVxuXG5mdW5jdGlvbiBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KG5hdGl2ZUV2ZW50KSB7XG4gIHZhciBldmVudCA9IFN5bnRoZXRpY0V2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLmNoYW5nZSwgYWN0aXZlRWxlbWVudEluc3QsIG5hdGl2ZUV2ZW50LCBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkpO1xuICBFdmVudFByb3BhZ2F0b3JzLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoZXZlbnQpO1xuXG4gIC8vIElmIGNoYW5nZSBhbmQgcHJvcGVydHljaGFuZ2UgYnViYmxlZCwgd2UnZCBqdXN0IGJpbmQgdG8gaXQgbGlrZSBhbGwgdGhlXG4gIC8vIG90aGVyIGV2ZW50cyBhbmQgaGF2ZSBpdCBnbyB0aHJvdWdoIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci4gU2luY2UgaXRcbiAgLy8gZG9lc24ndCwgd2UgbWFudWFsbHkgbGlzdGVuIGZvciB0aGUgZXZlbnRzIGFuZCBzbyB3ZSBoYXZlIHRvIGVucXVldWUgYW5kXG4gIC8vIHByb2Nlc3MgdGhlIGFic3RyYWN0IGV2ZW50IG1hbnVhbGx5LlxuICAvL1xuICAvLyBCYXRjaGluZyBpcyBuZWNlc3NhcnkgaGVyZSBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCBhbGwgZXZlbnQgaGFuZGxlcnMgcnVuXG4gIC8vIGJlZm9yZSB0aGUgbmV4dCByZXJlbmRlciAoaW5jbHVkaW5nIGV2ZW50IGhhbmRsZXJzIGF0dGFjaGVkIHRvIGFuY2VzdG9yXG4gIC8vIGVsZW1lbnRzIGluc3RlYWQgb2YgZGlyZWN0bHkgb24gdGhlIGlucHV0KS4gV2l0aG91dCB0aGlzLCBjb250cm9sbGVkXG4gIC8vIGNvbXBvbmVudHMgZG9uJ3Qgd29yayBwcm9wZXJseSBpbiBjb25qdW5jdGlvbiB3aXRoIGV2ZW50IGJ1YmJsaW5nIGJlY2F1c2VcbiAgLy8gdGhlIGNvbXBvbmVudCBpcyByZXJlbmRlcmVkIGFuZCB0aGUgdmFsdWUgcmV2ZXJ0ZWQgYmVmb3JlIGFsbCB0aGUgZXZlbnRcbiAgLy8gaGFuZGxlcnMgY2FuIHJ1bi4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzA4LlxuICBSZWFjdFVwZGF0ZXMuYmF0Y2hlZFVwZGF0ZXMocnVuRXZlbnRJbkJhdGNoLCBldmVudCk7XG59XG5cbmZ1bmN0aW9uIHJ1bkV2ZW50SW5CYXRjaChldmVudCkge1xuICBFdmVudFBsdWdpbkh1Yi5lbnF1ZXVlRXZlbnRzKGV2ZW50KTtcbiAgRXZlbnRQbHVnaW5IdWIucHJvY2Vzc0V2ZW50UXVldWUoZmFsc2UpO1xufVxuXG5mdW5jdGlvbiBzdGFydFdhdGNoaW5nRm9yQ2hhbmdlRXZlbnRJRTgodGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGFjdGl2ZUVsZW1lbnQgPSB0YXJnZXQ7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gdGFyZ2V0SW5zdDtcbiAgYWN0aXZlRWxlbWVudC5hdHRhY2hFdmVudCgnb25jaGFuZ2UnLCBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KTtcbn1cblxuZnVuY3Rpb24gc3RvcFdhdGNoaW5nRm9yQ2hhbmdlRXZlbnRJRTgoKSB7XG4gIGlmICghYWN0aXZlRWxlbWVudCkge1xuICAgIHJldHVybjtcbiAgfVxuICBhY3RpdmVFbGVtZW50LmRldGFjaEV2ZW50KCdvbmNoYW5nZScsIG1hbnVhbERpc3BhdGNoQ2hhbmdlRXZlbnQpO1xuICBhY3RpdmVFbGVtZW50ID0gbnVsbDtcbiAgYWN0aXZlRWxlbWVudEluc3QgPSBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9yQ2hhbmdlRXZlbnQodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0KSB7XG4gIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BDaGFuZ2UnKSB7XG4gICAgcmV0dXJuIHRhcmdldEluc3Q7XG4gIH1cbn1cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50c0ZvckNoYW5nZUV2ZW50SUU4KHRvcExldmVsVHlwZSwgdGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BGb2N1cycpIHtcbiAgICAvLyBzdG9wV2F0Y2hpbmcoKSBzaG91bGQgYmUgYSBub29wIGhlcmUgYnV0IHdlIGNhbGwgaXQganVzdCBpbiBjYXNlIHdlXG4gICAgLy8gbWlzc2VkIGEgYmx1ciBldmVudCBzb21laG93LlxuICAgIHN0b3BXYXRjaGluZ0ZvckNoYW5nZUV2ZW50SUU4KCk7XG4gICAgc3RhcnRXYXRjaGluZ0ZvckNoYW5nZUV2ZW50SUU4KHRhcmdldCwgdGFyZ2V0SW5zdCk7XG4gIH0gZWxzZSBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wQmx1cicpIHtcbiAgICBzdG9wV2F0Y2hpbmdGb3JDaGFuZ2VFdmVudElFOCgpO1xuICB9XG59XG5cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBpbnB1dGAgZXZlbnRcbiAqL1xudmFyIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGZhbHNlO1xuaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkge1xuICAvLyBJRTkgY2xhaW1zIHRvIHN1cHBvcnQgdGhlIGlucHV0IGV2ZW50IGJ1dCBmYWlscyB0byB0cmlnZ2VyIGl0IHdoZW5cbiAgLy8gZGVsZXRpbmcgdGV4dCwgc28gd2UgaWdub3JlIGl0cyBpbnB1dCBldmVudHMuXG4gIC8vIElFMTArIGZpcmUgaW5wdXQgZXZlbnRzIHRvIG9mdGVuLCBzdWNoIHdoZW4gYSBwbGFjZWhvbGRlclxuICAvLyBjaGFuZ2VzIG9yIHdoZW4gYW4gaW5wdXQgd2l0aCBhIHBsYWNlaG9sZGVyIGlzIGZvY3VzZWQuXG4gIGlzSW5wdXRFdmVudFN1cHBvcnRlZCA9IGlzRXZlbnRTdXBwb3J0ZWQoJ2lucHV0JykgJiYgKCFkb2N1bWVudC5kb2N1bWVudE1vZGUgfHwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlID4gMTEpO1xufVxuXG4vKipcbiAqIChGb3IgSUUgPD0xMSkgUmVwbGFjZW1lbnQgZ2V0dGVyL3NldHRlciBmb3IgdGhlIGB2YWx1ZWAgcHJvcGVydHkgdGhhdCBnZXRzXG4gKiBzZXQgb24gdGhlIGFjdGl2ZSBlbGVtZW50LlxuICovXG52YXIgbmV3VmFsdWVQcm9wID0ge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gYWN0aXZlRWxlbWVudFZhbHVlUHJvcC5nZXQuY2FsbCh0aGlzKTtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAodmFsKSB7XG4gICAgLy8gQ2FzdCB0byBhIHN0cmluZyBzbyB3ZSBjYW4gZG8gZXF1YWxpdHkgY2hlY2tzLlxuICAgIGFjdGl2ZUVsZW1lbnRWYWx1ZSA9ICcnICsgdmFsO1xuICAgIGFjdGl2ZUVsZW1lbnRWYWx1ZVByb3Auc2V0LmNhbGwodGhpcywgdmFsKTtcbiAgfVxufTtcblxuLyoqXG4gKiAoRm9yIElFIDw9MTEpIFN0YXJ0cyB0cmFja2luZyBwcm9wZXJ0eWNoYW5nZSBldmVudHMgb24gdGhlIHBhc3NlZC1pbiBlbGVtZW50XG4gKiBhbmQgb3ZlcnJpZGUgdGhlIHZhbHVlIHByb3BlcnR5IHNvIHRoYXQgd2UgY2FuIGRpc3Rpbmd1aXNoIHVzZXIgZXZlbnRzIGZyb21cbiAqIHZhbHVlIGNoYW5nZXMgaW4gSlMuXG4gKi9cbmZ1bmN0aW9uIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpIHtcbiAgYWN0aXZlRWxlbWVudCA9IHRhcmdldDtcbiAgYWN0aXZlRWxlbWVudEluc3QgPSB0YXJnZXRJbnN0O1xuICBhY3RpdmVFbGVtZW50VmFsdWUgPSB0YXJnZXQudmFsdWU7XG4gIGFjdGl2ZUVsZW1lbnRWYWx1ZVByb3AgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsICd2YWx1ZScpO1xuXG4gIC8vIE5vdCBndWFyZGVkIGluIGEgY2FuRGVmaW5lUHJvcGVydHkgY2hlY2s6IElFOCBzdXBwb3J0cyBkZWZpbmVQcm9wZXJ0eSBvbmx5XG4gIC8vIG9uIERPTSBlbGVtZW50c1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYWN0aXZlRWxlbWVudCwgJ3ZhbHVlJywgbmV3VmFsdWVQcm9wKTtcbiAgaWYgKGFjdGl2ZUVsZW1lbnQuYXR0YWNoRXZlbnQpIHtcbiAgICBhY3RpdmVFbGVtZW50LmF0dGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UpO1xuICB9IGVsc2Uge1xuICAgIGFjdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncHJvcGVydHljaGFuZ2UnLCBoYW5kbGVQcm9wZXJ0eUNoYW5nZSwgZmFsc2UpO1xuICB9XG59XG5cbi8qKlxuICogKEZvciBJRSA8PTExKSBSZW1vdmVzIHRoZSBldmVudCBsaXN0ZW5lcnMgZnJvbSB0aGUgY3VycmVudGx5LXRyYWNrZWQgZWxlbWVudCxcbiAqIGlmIGFueSBleGlzdHMuXG4gKi9cbmZ1bmN0aW9uIHN0b3BXYXRjaGluZ0ZvclZhbHVlQ2hhbmdlKCkge1xuICBpZiAoIWFjdGl2ZUVsZW1lbnQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBkZWxldGUgcmVzdG9yZXMgdGhlIG9yaWdpbmFsIHByb3BlcnR5IGRlZmluaXRpb25cbiAgZGVsZXRlIGFjdGl2ZUVsZW1lbnQudmFsdWU7XG5cbiAgaWYgKGFjdGl2ZUVsZW1lbnQuZGV0YWNoRXZlbnQpIHtcbiAgICBhY3RpdmVFbGVtZW50LmRldGFjaEV2ZW50KCdvbnByb3BlcnR5Y2hhbmdlJywgaGFuZGxlUHJvcGVydHlDaGFuZ2UpO1xuICB9IGVsc2Uge1xuICAgIGFjdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncHJvcGVydHljaGFuZ2UnLCBoYW5kbGVQcm9wZXJ0eUNoYW5nZSwgZmFsc2UpO1xuICB9XG5cbiAgYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbiAgYWN0aXZlRWxlbWVudFZhbHVlID0gbnVsbDtcbiAgYWN0aXZlRWxlbWVudFZhbHVlUHJvcCA9IG51bGw7XG59XG5cbi8qKlxuICogKEZvciBJRSA8PTExKSBIYW5kbGVzIGEgcHJvcGVydHljaGFuZ2UgZXZlbnQsIHNlbmRpbmcgYSBgY2hhbmdlYCBldmVudCBpZlxuICogdGhlIHZhbHVlIG9mIHRoZSBhY3RpdmUgZWxlbWVudCBoYXMgY2hhbmdlZC5cbiAqL1xuZnVuY3Rpb24gaGFuZGxlUHJvcGVydHlDaGFuZ2UobmF0aXZlRXZlbnQpIHtcbiAgaWYgKG5hdGl2ZUV2ZW50LnByb3BlcnR5TmFtZSAhPT0gJ3ZhbHVlJykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgdmFsdWUgPSBuYXRpdmVFdmVudC5zcmNFbGVtZW50LnZhbHVlO1xuICBpZiAodmFsdWUgPT09IGFjdGl2ZUVsZW1lbnRWYWx1ZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBhY3RpdmVFbGVtZW50VmFsdWUgPSB2YWx1ZTtcblxuICBtYW51YWxEaXNwYXRjaENoYW5nZUV2ZW50KG5hdGl2ZUV2ZW50KTtcbn1cblxuLyoqXG4gKiBJZiBhIGBjaGFuZ2VgIGV2ZW50IHNob3VsZCBiZSBmaXJlZCwgcmV0dXJucyB0aGUgdGFyZ2V0J3MgSUQuXG4gKi9cbmZ1bmN0aW9uIGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50KHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wSW5wdXQnKSB7XG4gICAgLy8gSW4gbW9kZXJuIGJyb3dzZXJzIChpLmUuLCBub3QgSUU4IG9yIElFOSksIHRoZSBpbnB1dCBldmVudCBpcyBleGFjdGx5XG4gICAgLy8gd2hhdCB3ZSB3YW50IHNvIGZhbGwgdGhyb3VnaCBoZXJlIGFuZCB0cmlnZ2VyIGFuIGFic3RyYWN0IGV2ZW50XG4gICAgcmV0dXJuIHRhcmdldEluc3Q7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlRXZlbnRzRm9ySW5wdXRFdmVudElFKHRvcExldmVsVHlwZSwgdGFyZ2V0LCB0YXJnZXRJbnN0KSB7XG4gIGlmICh0b3BMZXZlbFR5cGUgPT09ICd0b3BGb2N1cycpIHtcbiAgICAvLyBJbiBJRTgsIHdlIGNhbiBjYXB0dXJlIGFsbW9zdCBhbGwgLnZhbHVlIGNoYW5nZXMgYnkgYWRkaW5nIGFcbiAgICAvLyBwcm9wZXJ0eWNoYW5nZSBoYW5kbGVyIGFuZCBsb29raW5nIGZvciBldmVudHMgd2l0aCBwcm9wZXJ0eU5hbWVcbiAgICAvLyBlcXVhbCB0byAndmFsdWUnXG4gICAgLy8gSW4gSUU5LTExLCBwcm9wZXJ0eWNoYW5nZSBmaXJlcyBmb3IgbW9zdCBpbnB1dCBldmVudHMgYnV0IGlzIGJ1Z2d5IGFuZFxuICAgIC8vIGRvZXNuJ3QgZmlyZSB3aGVuIHRleHQgaXMgZGVsZXRlZCwgYnV0IGNvbnZlbmllbnRseSwgc2VsZWN0aW9uY2hhbmdlXG4gICAgLy8gYXBwZWFycyB0byBmaXJlIGluIGFsbCBvZiB0aGUgcmVtYWluaW5nIGNhc2VzIHNvIHdlIGNhdGNoIHRob3NlIGFuZFxuICAgIC8vIGZvcndhcmQgdGhlIGV2ZW50IGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZFxuICAgIC8vIEluIGVpdGhlciBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIGNhbGwgdGhlIGV2ZW50IGhhbmRsZXIgaWYgdGhlIHZhbHVlXG4gICAgLy8gaXMgY2hhbmdlZCBmcm9tIEpTIHNvIHdlIHJlZGVmaW5lIGEgc2V0dGVyIGZvciBgLnZhbHVlYCB0aGF0IHVwZGF0ZXNcbiAgICAvLyBvdXIgYWN0aXZlRWxlbWVudFZhbHVlIHZhcmlhYmxlLCBhbGxvd2luZyB1cyB0byBpZ25vcmUgdGhvc2UgY2hhbmdlc1xuICAgIC8vXG4gICAgLy8gc3RvcFdhdGNoaW5nKCkgc2hvdWxkIGJlIGEgbm9vcCBoZXJlIGJ1dCB3ZSBjYWxsIGl0IGp1c3QgaW4gY2FzZSB3ZVxuICAgIC8vIG1pc3NlZCBhIGJsdXIgZXZlbnQgc29tZWhvdy5cbiAgICBzdG9wV2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSgpO1xuICAgIHN0YXJ0V2F0Y2hpbmdGb3JWYWx1ZUNoYW5nZSh0YXJnZXQsIHRhcmdldEluc3QpO1xuICB9IGVsc2UgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcEJsdXInKSB7XG4gICAgc3RvcFdhdGNoaW5nRm9yVmFsdWVDaGFuZ2UoKTtcbiAgfVxufVxuXG4vLyBGb3IgSUU4IGFuZCBJRTkuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9ySW5wdXRFdmVudElFKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCkge1xuICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wU2VsZWN0aW9uQ2hhbmdlJyB8fCB0b3BMZXZlbFR5cGUgPT09ICd0b3BLZXlVcCcgfHwgdG9wTGV2ZWxUeXBlID09PSAndG9wS2V5RG93bicpIHtcbiAgICAvLyBPbiB0aGUgc2VsZWN0aW9uY2hhbmdlIGV2ZW50LCB0aGUgdGFyZ2V0IGlzIGp1c3QgZG9jdW1lbnQgd2hpY2ggaXNuJ3RcbiAgICAvLyBoZWxwZnVsIGZvciB1cyBzbyBqdXN0IGNoZWNrIGFjdGl2ZUVsZW1lbnQgaW5zdGVhZC5cbiAgICAvL1xuICAgIC8vIDk5JSBvZiB0aGUgdGltZSwga2V5ZG93biBhbmQga2V5dXAgYXJlbid0IG5lY2Vzc2FyeS4gSUU4IGZhaWxzIHRvIGZpcmVcbiAgICAvLyBwcm9wZXJ0eWNoYW5nZSBvbiB0aGUgZmlyc3QgaW5wdXQgZXZlbnQgYWZ0ZXIgc2V0dGluZyBgdmFsdWVgIGZyb20gYVxuICAgIC8vIHNjcmlwdCBhbmQgZmlyZXMgb25seSBrZXlkb3duLCBrZXlwcmVzcywga2V5dXAuIENhdGNoaW5nIGtleXVwIHVzdWFsbHlcbiAgICAvLyBnZXRzIGl0IGFuZCBjYXRjaGluZyBrZXlkb3duIGxldHMgdXMgZmlyZSBhbiBldmVudCBmb3IgdGhlIGZpcnN0XG4gICAgLy8ga2V5c3Ryb2tlIGlmIHVzZXIgZG9lcyBhIGtleSByZXBlYXQgKGl0J2xsIGJlIGEgbGl0dGxlIGRlbGF5ZWQ6IHJpZ2h0XG4gICAgLy8gYmVmb3JlIHRoZSBzZWNvbmQga2V5c3Ryb2tlKS4gT3RoZXIgaW5wdXQgbWV0aG9kcyAoZS5nLiwgcGFzdGUpIHNlZW0gdG9cbiAgICAvLyBmaXJlIHNlbGVjdGlvbmNoYW5nZSBub3JtYWxseS5cbiAgICBpZiAoYWN0aXZlRWxlbWVudCAmJiBhY3RpdmVFbGVtZW50LnZhbHVlICE9PSBhY3RpdmVFbGVtZW50VmFsdWUpIHtcbiAgICAgIGFjdGl2ZUVsZW1lbnRWYWx1ZSA9IGFjdGl2ZUVsZW1lbnQudmFsdWU7XG4gICAgICByZXR1cm4gYWN0aXZlRWxlbWVudEluc3Q7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU0VDVElPTjogaGFuZGxlIGBjbGlja2AgZXZlbnRcbiAqL1xuZnVuY3Rpb24gc2hvdWxkVXNlQ2xpY2tFdmVudChlbGVtKSB7XG4gIC8vIFVzZSB0aGUgYGNsaWNrYCBldmVudCB0byBkZXRlY3QgY2hhbmdlcyB0byBjaGVja2JveCBhbmQgcmFkaW8gaW5wdXRzLlxuICAvLyBUaGlzIGFwcHJvYWNoIHdvcmtzIGFjcm9zcyBhbGwgYnJvd3NlcnMsIHdoZXJlYXMgYGNoYW5nZWAgZG9lcyBub3QgZmlyZVxuICAvLyB1bnRpbCBgYmx1cmAgaW4gSUU4LlxuICByZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcgJiYgKGVsZW0udHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtLnR5cGUgPT09ICdyYWRpbycpO1xufVxuXG5mdW5jdGlvbiBnZXRUYXJnZXRJbnN0Rm9yQ2xpY2tFdmVudCh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QpIHtcbiAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcENsaWNrJykge1xuICAgIHJldHVybiB0YXJnZXRJbnN0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZUNvbnRyb2xsZWRJbnB1dEJsdXIoaW5zdCwgbm9kZSkge1xuICAvLyBUT0RPOiBJbiBJRSwgaW5zdCBpcyBvY2Nhc2lvbmFsbHkgbnVsbC4gV2h5P1xuICBpZiAoaW5zdCA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRmliZXIgYW5kIFJlYWN0RE9NIGtlZXAgd3JhcHBlciBzdGF0ZSBpbiBzZXBhcmF0ZSBwbGFjZXNcbiAgdmFyIHN0YXRlID0gaW5zdC5fd3JhcHBlclN0YXRlIHx8IG5vZGUuX3dyYXBwZXJTdGF0ZTtcblxuICBpZiAoIXN0YXRlIHx8ICFzdGF0ZS5jb250cm9sbGVkIHx8IG5vZGUudHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBJZiBjb250cm9sbGVkLCBhc3NpZ24gdGhlIHZhbHVlIGF0dHJpYnV0ZSB0byB0aGUgY3VycmVudCB2YWx1ZSBvbiBibHVyXG4gIHZhciB2YWx1ZSA9ICcnICsgbm9kZS52YWx1ZTtcbiAgaWYgKG5vZGUuZ2V0QXR0cmlidXRlKCd2YWx1ZScpICE9PSB2YWx1ZSkge1xuICAgIG5vZGUuc2V0QXR0cmlidXRlKCd2YWx1ZScsIHZhbHVlKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uQ2hhbmdlYCBldmVudCB0aGF0IG5vcm1hbGl6ZXMgY2hhbmdlIGV2ZW50c1xuICogYWNyb3NzIGZvcm0gZWxlbWVudHMuIFRoaXMgZXZlbnQgZmlyZXMgYXQgYSB0aW1lIHdoZW4gaXQncyBwb3NzaWJsZSB0b1xuICogY2hhbmdlIHRoZSBlbGVtZW50J3MgdmFsdWUgd2l0aG91dCBzZWVpbmcgYSBmbGlja2VyLlxuICpcbiAqIFN1cHBvcnRlZCBlbGVtZW50cyBhcmU6XG4gKiAtIGlucHV0IChzZWUgYGlzVGV4dElucHV0RWxlbWVudGApXG4gKiAtIHRleHRhcmVhXG4gKiAtIHNlbGVjdFxuICovXG52YXIgQ2hhbmdlRXZlbnRQbHVnaW4gPSB7XG5cbiAgZXZlbnRUeXBlczogZXZlbnRUeXBlcyxcblxuICBleHRyYWN0RXZlbnRzOiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICB2YXIgdGFyZ2V0Tm9kZSA9IHRhcmdldEluc3QgPyBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0YXJnZXRJbnN0KSA6IHdpbmRvdztcblxuICAgIHZhciBnZXRUYXJnZXRJbnN0RnVuYywgaGFuZGxlRXZlbnRGdW5jO1xuICAgIGlmIChzaG91bGRVc2VDaGFuZ2VFdmVudCh0YXJnZXROb2RlKSkge1xuICAgICAgaWYgKGRvZXNDaGFuZ2VFdmVudEJ1YmJsZSkge1xuICAgICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JDaGFuZ2VFdmVudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhhbmRsZUV2ZW50RnVuYyA9IGhhbmRsZUV2ZW50c0ZvckNoYW5nZUV2ZW50SUU4O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNUZXh0SW5wdXRFbGVtZW50KHRhcmdldE5vZGUpKSB7XG4gICAgICBpZiAoaXNJbnB1dEV2ZW50U3VwcG9ydGVkKSB7XG4gICAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvcklucHV0RXZlbnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZXRUYXJnZXRJbnN0RnVuYyA9IGdldFRhcmdldEluc3RGb3JJbnB1dEV2ZW50SUU7XG4gICAgICAgIGhhbmRsZUV2ZW50RnVuYyA9IGhhbmRsZUV2ZW50c0ZvcklucHV0RXZlbnRJRTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHNob3VsZFVzZUNsaWNrRXZlbnQodGFyZ2V0Tm9kZSkpIHtcbiAgICAgIGdldFRhcmdldEluc3RGdW5jID0gZ2V0VGFyZ2V0SW5zdEZvckNsaWNrRXZlbnQ7XG4gICAgfVxuXG4gICAgaWYgKGdldFRhcmdldEluc3RGdW5jKSB7XG4gICAgICB2YXIgaW5zdCA9IGdldFRhcmdldEluc3RGdW5jKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCk7XG4gICAgICBpZiAoaW5zdCkge1xuICAgICAgICB2YXIgZXZlbnQgPSBTeW50aGV0aWNFdmVudC5nZXRQb29sZWQoZXZlbnRUeXBlcy5jaGFuZ2UsIGluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgICAgIGV2ZW50LnR5cGUgPSAnY2hhbmdlJztcbiAgICAgICAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50KTtcbiAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChoYW5kbGVFdmVudEZ1bmMpIHtcbiAgICAgIGhhbmRsZUV2ZW50RnVuYyh0b3BMZXZlbFR5cGUsIHRhcmdldE5vZGUsIHRhcmdldEluc3QpO1xuICAgIH1cblxuICAgIC8vIFdoZW4gYmx1cnJpbmcsIHNldCB0aGUgdmFsdWUgYXR0cmlidXRlIGZvciBudW1iZXIgaW5wdXRzXG4gICAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcEJsdXInKSB7XG4gICAgICBoYW5kbGVDb250cm9sbGVkSW5wdXRCbHVyKHRhcmdldEluc3QsIHRhcmdldE5vZGUpO1xuICAgIH1cbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENoYW5nZUV2ZW50UGx1Z2luOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01MYXp5VHJlZSA9IHJlcXVpcmUoJy4vRE9NTGF6eVRyZWUnKTtcbnZhciBEYW5nZXIgPSByZXF1aXJlKCcuL0RhbmdlcicpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7XG5cbnZhciBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uID0gcmVxdWlyZSgnLi9jcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uJyk7XG52YXIgc2V0SW5uZXJIVE1MID0gcmVxdWlyZSgnLi9zZXRJbm5lckhUTUwnKTtcbnZhciBzZXRUZXh0Q29udGVudCA9IHJlcXVpcmUoJy4vc2V0VGV4dENvbnRlbnQnKTtcblxuZnVuY3Rpb24gZ2V0Tm9kZUFmdGVyKHBhcmVudE5vZGUsIG5vZGUpIHtcbiAgLy8gU3BlY2lhbCBjYXNlIGZvciB0ZXh0IGNvbXBvbmVudHMsIHdoaWNoIHJldHVybiBbb3BlbiwgY2xvc2VdIGNvbW1lbnRzXG4gIC8vIGZyb20gZ2V0SG9zdE5vZGUuXG4gIGlmIChBcnJheS5pc0FycmF5KG5vZGUpKSB7XG4gICAgbm9kZSA9IG5vZGVbMV07XG4gIH1cbiAgcmV0dXJuIG5vZGUgPyBub2RlLm5leHRTaWJsaW5nIDogcGFyZW50Tm9kZS5maXJzdENoaWxkO1xufVxuXG4vKipcbiAqIEluc2VydHMgYGNoaWxkTm9kZWAgYXMgYSBjaGlsZCBvZiBgcGFyZW50Tm9kZWAgYXQgdGhlIGBpbmRleGAuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBwYXJlbnROb2RlIFBhcmVudCBub2RlIGluIHdoaWNoIHRvIGluc2VydC5cbiAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY2hpbGROb2RlIENoaWxkIG5vZGUgdG8gaW5zZXJ0LlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IGF0IHdoaWNoIHRvIGluc2VydCB0aGUgY2hpbGQuXG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIGluc2VydENoaWxkQXQgPSBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uIChwYXJlbnROb2RlLCBjaGlsZE5vZGUsIHJlZmVyZW5jZU5vZGUpIHtcbiAgLy8gV2UgcmVseSBleGNsdXNpdmVseSBvbiBgaW5zZXJ0QmVmb3JlKG5vZGUsIG51bGwpYCBpbnN0ZWFkIG9mIGFsc28gdXNpbmdcbiAgLy8gYGFwcGVuZENoaWxkKG5vZGUpYC4gKFVzaW5nIGB1bmRlZmluZWRgIGlzIG5vdCBhbGxvd2VkIGJ5IGFsbCBicm93c2VycyBzb1xuICAvLyB3ZSBhcmUgY2FyZWZ1bCB0byB1c2UgYG51bGxgLilcbiAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGROb2RlLCByZWZlcmVuY2VOb2RlKTtcbn0pO1xuXG5mdW5jdGlvbiBpbnNlcnRMYXp5VHJlZUNoaWxkQXQocGFyZW50Tm9kZSwgY2hpbGRUcmVlLCByZWZlcmVuY2VOb2RlKSB7XG4gIERPTUxhenlUcmVlLmluc2VydFRyZWVCZWZvcmUocGFyZW50Tm9kZSwgY2hpbGRUcmVlLCByZWZlcmVuY2VOb2RlKTtcbn1cblxuZnVuY3Rpb24gbW92ZUNoaWxkKHBhcmVudE5vZGUsIGNoaWxkTm9kZSwgcmVmZXJlbmNlTm9kZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZE5vZGUpKSB7XG4gICAgbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSwgY2hpbGROb2RlWzBdLCBjaGlsZE5vZGVbMV0sIHJlZmVyZW5jZU5vZGUpO1xuICB9IGVsc2Uge1xuICAgIGluc2VydENoaWxkQXQocGFyZW50Tm9kZSwgY2hpbGROb2RlLCByZWZlcmVuY2VOb2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVDaGlsZChwYXJlbnROb2RlLCBjaGlsZE5vZGUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGROb2RlKSkge1xuICAgIHZhciBjbG9zaW5nQ29tbWVudCA9IGNoaWxkTm9kZVsxXTtcbiAgICBjaGlsZE5vZGUgPSBjaGlsZE5vZGVbMF07XG4gICAgcmVtb3ZlRGVsaW1pdGVkVGV4dChwYXJlbnROb2RlLCBjaGlsZE5vZGUsIGNsb3NpbmdDb21tZW50KTtcbiAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNsb3NpbmdDb21tZW50KTtcbiAgfVxuICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNoaWxkTm9kZSk7XG59XG5cbmZ1bmN0aW9uIG1vdmVEZWxpbWl0ZWRUZXh0KHBhcmVudE5vZGUsIG9wZW5pbmdDb21tZW50LCBjbG9zaW5nQ29tbWVudCwgcmVmZXJlbmNlTm9kZSkge1xuICB2YXIgbm9kZSA9IG9wZW5pbmdDb21tZW50O1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHZhciBuZXh0Tm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgaW5zZXJ0Q2hpbGRBdChwYXJlbnROb2RlLCBub2RlLCByZWZlcmVuY2VOb2RlKTtcbiAgICBpZiAobm9kZSA9PT0gY2xvc2luZ0NvbW1lbnQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBub2RlID0gbmV4dE5vZGU7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVtb3ZlRGVsaW1pdGVkVGV4dChwYXJlbnROb2RlLCBzdGFydE5vZGUsIGNsb3NpbmdDb21tZW50KSB7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdmFyIG5vZGUgPSBzdGFydE5vZGUubmV4dFNpYmxpbmc7XG4gICAgaWYgKG5vZGUgPT09IGNsb3NpbmdDb21tZW50KSB7XG4gICAgICAvLyBUaGUgY2xvc2luZyBjb21tZW50IGlzIHJlbW92ZWQgYnkgUmVhY3RNdWx0aUNoaWxkLlxuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VEZWxpbWl0ZWRUZXh0KG9wZW5pbmdDb21tZW50LCBjbG9zaW5nQ29tbWVudCwgc3RyaW5nVGV4dCkge1xuICB2YXIgcGFyZW50Tm9kZSA9IG9wZW5pbmdDb21tZW50LnBhcmVudE5vZGU7XG4gIHZhciBub2RlQWZ0ZXJDb21tZW50ID0gb3BlbmluZ0NvbW1lbnQubmV4dFNpYmxpbmc7XG4gIGlmIChub2RlQWZ0ZXJDb21tZW50ID09PSBjbG9zaW5nQ29tbWVudCkge1xuICAgIC8vIFRoZXJlIGFyZSBubyB0ZXh0IG5vZGVzIGJldHdlZW4gdGhlIG9wZW5pbmcgYW5kIGNsb3NpbmcgY29tbWVudHM7IGluc2VydFxuICAgIC8vIGEgbmV3IG9uZSBpZiBzdHJpbmdUZXh0IGlzbid0IGVtcHR5LlxuICAgIGlmIChzdHJpbmdUZXh0KSB7XG4gICAgICBpbnNlcnRDaGlsZEF0KHBhcmVudE5vZGUsIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHN0cmluZ1RleHQpLCBub2RlQWZ0ZXJDb21tZW50KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKHN0cmluZ1RleHQpIHtcbiAgICAgIC8vIFNldCB0aGUgdGV4dCBjb250ZW50IG9mIHRoZSBmaXJzdCBub2RlIGFmdGVyIHRoZSBvcGVuaW5nIGNvbW1lbnQsIGFuZFxuICAgICAgLy8gcmVtb3ZlIGFsbCBmb2xsb3dpbmcgbm9kZXMgdXAgdW50aWwgdGhlIGNsb3NpbmcgY29tbWVudC5cbiAgICAgIHNldFRleHRDb250ZW50KG5vZGVBZnRlckNvbW1lbnQsIHN0cmluZ1RleHQpO1xuICAgICAgcmVtb3ZlRGVsaW1pdGVkVGV4dChwYXJlbnROb2RlLCBub2RlQWZ0ZXJDb21tZW50LCBjbG9zaW5nQ29tbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlbW92ZURlbGltaXRlZFRleHQocGFyZW50Tm9kZSwgb3BlbmluZ0NvbW1lbnQsIGNsb3NpbmdDb21tZW50KTtcbiAgICB9XG4gIH1cblxuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgIGluc3RhbmNlSUQ6IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG9wZW5pbmdDb21tZW50KS5fZGVidWdJRCxcbiAgICAgIHR5cGU6ICdyZXBsYWNlIHRleHQnLFxuICAgICAgcGF5bG9hZDogc3RyaW5nVGV4dFxuICAgIH0pO1xuICB9XG59XG5cbnZhciBkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCA9IERhbmdlci5kYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cDtcbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICBkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCA9IGZ1bmN0aW9uIChvbGRDaGlsZCwgbWFya3VwLCBwcmV2SW5zdGFuY2UpIHtcbiAgICBEYW5nZXIuZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAob2xkQ2hpbGQsIG1hcmt1cCk7XG4gICAgaWYgKHByZXZJbnN0YW5jZS5fZGVidWdJRCAhPT0gMCkge1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgIGluc3RhbmNlSUQ6IHByZXZJbnN0YW5jZS5fZGVidWdJRCxcbiAgICAgICAgdHlwZTogJ3JlcGxhY2Ugd2l0aCcsXG4gICAgICAgIHBheWxvYWQ6IG1hcmt1cC50b1N0cmluZygpXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG5leHRJbnN0YW5jZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG1hcmt1cC5ub2RlKTtcbiAgICAgIGlmIChuZXh0SW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgICAgaW5zdGFuY2VJRDogbmV4dEluc3RhbmNlLl9kZWJ1Z0lELFxuICAgICAgICAgIHR5cGU6ICdtb3VudCcsXG4gICAgICAgICAgcGF5bG9hZDogbWFya3VwLnRvU3RyaW5nKClcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIE9wZXJhdGlvbnMgZm9yIHVwZGF0aW5nIHdpdGggRE9NIGNoaWxkcmVuLlxuICovXG52YXIgRE9NQ2hpbGRyZW5PcGVyYXRpb25zID0ge1xuXG4gIGRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwOiBkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCxcblxuICByZXBsYWNlRGVsaW1pdGVkVGV4dDogcmVwbGFjZURlbGltaXRlZFRleHQsXG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgYSBjb21wb25lbnQncyBjaGlsZHJlbiBieSBwcm9jZXNzaW5nIGEgc2VyaWVzIG9mIHVwZGF0ZXMuIFRoZVxuICAgKiB1cGRhdGUgY29uZmlndXJhdGlvbnMgYXJlIGVhY2ggZXhwZWN0ZWQgdG8gaGF2ZSBhIGBwYXJlbnROb2RlYCBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheTxvYmplY3Q+fSB1cGRhdGVzIExpc3Qgb2YgdXBkYXRlIGNvbmZpZ3VyYXRpb25zLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb2Nlc3NVcGRhdGVzOiBmdW5jdGlvbiAocGFyZW50Tm9kZSwgdXBkYXRlcykge1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHBhcmVudE5vZGVEZWJ1Z0lEID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUocGFyZW50Tm9kZSkuX2RlYnVnSUQ7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCB1cGRhdGVzLmxlbmd0aDsgaysrKSB7XG4gICAgICB2YXIgdXBkYXRlID0gdXBkYXRlc1trXTtcbiAgICAgIHN3aXRjaCAodXBkYXRlLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnSU5TRVJUX01BUktVUCc6XG4gICAgICAgICAgaW5zZXJ0TGF6eVRyZWVDaGlsZEF0KHBhcmVudE5vZGUsIHVwZGF0ZS5jb250ZW50LCBnZXROb2RlQWZ0ZXIocGFyZW50Tm9kZSwgdXBkYXRlLmFmdGVyTm9kZSkpO1xuICAgICAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgICAgICAgIGluc3RhbmNlSUQ6IHBhcmVudE5vZGVEZWJ1Z0lELFxuICAgICAgICAgICAgICB0eXBlOiAnaW5zZXJ0IGNoaWxkJyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogeyB0b0luZGV4OiB1cGRhdGUudG9JbmRleCwgY29udGVudDogdXBkYXRlLmNvbnRlbnQudG9TdHJpbmcoKSB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ01PVkVfRVhJU1RJTkcnOlxuICAgICAgICAgIG1vdmVDaGlsZChwYXJlbnROb2RlLCB1cGRhdGUuZnJvbU5vZGUsIGdldE5vZGVBZnRlcihwYXJlbnROb2RlLCB1cGRhdGUuYWZ0ZXJOb2RlKSk7XG4gICAgICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgICAgICAgaW5zdGFuY2VJRDogcGFyZW50Tm9kZURlYnVnSUQsXG4gICAgICAgICAgICAgIHR5cGU6ICdtb3ZlIGNoaWxkJyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogeyBmcm9tSW5kZXg6IHVwZGF0ZS5mcm9tSW5kZXgsIHRvSW5kZXg6IHVwZGF0ZS50b0luZGV4IH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnU0VUX01BUktVUCc6XG4gICAgICAgICAgc2V0SW5uZXJIVE1MKHBhcmVudE5vZGUsIHVwZGF0ZS5jb250ZW50KTtcbiAgICAgICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe1xuICAgICAgICAgICAgICBpbnN0YW5jZUlEOiBwYXJlbnROb2RlRGVidWdJRCxcbiAgICAgICAgICAgICAgdHlwZTogJ3JlcGxhY2UgY2hpbGRyZW4nLFxuICAgICAgICAgICAgICBwYXlsb2FkOiB1cGRhdGUuY29udGVudC50b1N0cmluZygpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1RFWFRfQ09OVEVOVCc6XG4gICAgICAgICAgc2V0VGV4dENvbnRlbnQocGFyZW50Tm9kZSwgdXBkYXRlLmNvbnRlbnQpO1xuICAgICAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uSG9zdE9wZXJhdGlvbih7XG4gICAgICAgICAgICAgIGluc3RhbmNlSUQ6IHBhcmVudE5vZGVEZWJ1Z0lELFxuICAgICAgICAgICAgICB0eXBlOiAncmVwbGFjZSB0ZXh0JyxcbiAgICAgICAgICAgICAgcGF5bG9hZDogdXBkYXRlLmNvbnRlbnQudG9TdHJpbmcoKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdSRU1PVkVfTk9ERSc6XG4gICAgICAgICAgcmVtb3ZlQ2hpbGQocGFyZW50Tm9kZSwgdXBkYXRlLmZyb21Ob2RlKTtcbiAgICAgICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe1xuICAgICAgICAgICAgICBpbnN0YW5jZUlEOiBwYXJlbnROb2RlRGVidWdJRCxcbiAgICAgICAgICAgICAgdHlwZTogJ3JlbW92ZSBjaGlsZCcsXG4gICAgICAgICAgICAgIHBheWxvYWQ6IHsgZnJvbUluZGV4OiB1cGRhdGUuZnJvbUluZGV4IH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBET01DaGlsZHJlbk9wZXJhdGlvbnM7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIERPTU5hbWVzcGFjZXMgPSByZXF1aXJlKCcuL0RPTU5hbWVzcGFjZXMnKTtcbnZhciBzZXRJbm5lckhUTUwgPSByZXF1aXJlKCcuL3NldElubmVySFRNTCcpO1xuXG52YXIgY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbiA9IHJlcXVpcmUoJy4vY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbicpO1xudmFyIHNldFRleHRDb250ZW50ID0gcmVxdWlyZSgnLi9zZXRUZXh0Q29udGVudCcpO1xuXG52YXIgRUxFTUVOVF9OT0RFX1RZUEUgPSAxO1xudmFyIERPQ1VNRU5UX0ZSQUdNRU5UX05PREVfVFlQRSA9IDExO1xuXG4vKipcbiAqIEluIElFICg4LTExKSBhbmQgRWRnZSwgYXBwZW5kaW5nIG5vZGVzIHdpdGggbm8gY2hpbGRyZW4gaXMgZHJhbWF0aWNhbGx5XG4gKiBmYXN0ZXIgdGhhbiBhcHBlbmRpbmcgYSBmdWxsIHN1YnRyZWUsIHNvIHdlIGVzc2VudGlhbGx5IHF1ZXVlIHVwIHRoZVxuICogLmFwcGVuZENoaWxkIGNhbGxzIGhlcmUgYW5kIGFwcGx5IHRoZW0gc28gZWFjaCBub2RlIGlzIGFkZGVkIHRvIGl0cyBwYXJlbnRcbiAqIGJlZm9yZSBhbnkgY2hpbGRyZW4gYXJlIGFkZGVkLlxuICpcbiAqIEluIG90aGVyIGJyb3dzZXJzLCBkb2luZyBzbyBpcyBzbG93ZXIgb3IgbmV1dHJhbCBjb21wYXJlZCB0byB0aGUgb3RoZXIgb3JkZXJcbiAqIChpbiBGaXJlZm94LCB0d2ljZSBhcyBzbG93KSBzbyB3ZSBvbmx5IGRvIHRoaXMgaW52ZXJzaW9uIGluIElFLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc3BpY3lqL2lubmVyaHRtbC12cy1jcmVhdGVlbGVtZW50LXZzLWNsb25lbm9kZS5cbiAqL1xudmFyIGVuYWJsZUxhenkgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudC5kb2N1bWVudE1vZGUgPT09ICdudW1iZXInIHx8IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBuYXZpZ2F0b3IudXNlckFnZW50ID09PSAnc3RyaW5nJyAmJiAvXFxiRWRnZVxcL1xcZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcblxuZnVuY3Rpb24gaW5zZXJ0VHJlZUNoaWxkcmVuKHRyZWUpIHtcbiAgaWYgKCFlbmFibGVMYXp5KSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBub2RlID0gdHJlZS5ub2RlO1xuICB2YXIgY2hpbGRyZW4gPSB0cmVlLmNoaWxkcmVuO1xuICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgaW5zZXJ0VHJlZUJlZm9yZShub2RlLCBjaGlsZHJlbltpXSwgbnVsbCk7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRyZWUuaHRtbCAhPSBudWxsKSB7XG4gICAgc2V0SW5uZXJIVE1MKG5vZGUsIHRyZWUuaHRtbCk7XG4gIH0gZWxzZSBpZiAodHJlZS50ZXh0ICE9IG51bGwpIHtcbiAgICBzZXRUZXh0Q29udGVudChub2RlLCB0cmVlLnRleHQpO1xuICB9XG59XG5cbnZhciBpbnNlcnRUcmVlQmVmb3JlID0gY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbiAocGFyZW50Tm9kZSwgdHJlZSwgcmVmZXJlbmNlTm9kZSkge1xuICAvLyBEb2N1bWVudEZyYWdtZW50cyBhcmVuJ3QgYWN0dWFsbHkgcGFydCBvZiB0aGUgRE9NIGFmdGVyIGluc2VydGlvbiBzb1xuICAvLyBhcHBlbmRpbmcgY2hpbGRyZW4gd29uJ3QgdXBkYXRlIHRoZSBET00uIFdlIG5lZWQgdG8gZW5zdXJlIHRoZSBmcmFnbWVudFxuICAvLyBpcyBwcm9wZXJseSBwb3B1bGF0ZWQgZmlyc3QsIGJyZWFraW5nIG91dCBvZiBvdXIgbGF6eSBhcHByb2FjaCBmb3IganVzdFxuICAvLyB0aGlzIGxldmVsLiBBbHNvLCBzb21lIDxvYmplY3Q+IHBsdWdpbnMgKGxpa2UgRmxhc2ggUGxheWVyKSB3aWxsIHJlYWRcbiAgLy8gPHBhcmFtPiBub2RlcyBpbW1lZGlhdGVseSB1cG9uIGluc2VydGlvbiBpbnRvIHRoZSBET00sIHNvIDxvYmplY3Q+XG4gIC8vIG11c3QgYWxzbyBiZSBwb3B1bGF0ZWQgcHJpb3IgdG8gaW5zZXJ0aW9uIGludG8gdGhlIERPTS5cbiAgaWYgKHRyZWUubm9kZS5ub2RlVHlwZSA9PT0gRE9DVU1FTlRfRlJBR01FTlRfTk9ERV9UWVBFIHx8IHRyZWUubm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFX1RZUEUgJiYgdHJlZS5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdvYmplY3QnICYmICh0cmVlLm5vZGUubmFtZXNwYWNlVVJJID09IG51bGwgfHwgdHJlZS5ub2RlLm5hbWVzcGFjZVVSSSA9PT0gRE9NTmFtZXNwYWNlcy5odG1sKSkge1xuICAgIGluc2VydFRyZWVDaGlsZHJlbih0cmVlKTtcbiAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZSh0cmVlLm5vZGUsIHJlZmVyZW5jZU5vZGUpO1xuICB9IGVsc2Uge1xuICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRyZWUubm9kZSwgcmVmZXJlbmNlTm9kZSk7XG4gICAgaW5zZXJ0VHJlZUNoaWxkcmVuKHRyZWUpO1xuICB9XG59KTtcblxuZnVuY3Rpb24gcmVwbGFjZUNoaWxkV2l0aFRyZWUob2xkTm9kZSwgbmV3VHJlZSkge1xuICBvbGROb2RlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld1RyZWUubm9kZSwgb2xkTm9kZSk7XG4gIGluc2VydFRyZWVDaGlsZHJlbihuZXdUcmVlKTtcbn1cblxuZnVuY3Rpb24gcXVldWVDaGlsZChwYXJlbnRUcmVlLCBjaGlsZFRyZWUpIHtcbiAgaWYgKGVuYWJsZUxhenkpIHtcbiAgICBwYXJlbnRUcmVlLmNoaWxkcmVuLnB1c2goY2hpbGRUcmVlKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJlbnRUcmVlLm5vZGUuYXBwZW5kQ2hpbGQoY2hpbGRUcmVlLm5vZGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHF1ZXVlSFRNTCh0cmVlLCBodG1sKSB7XG4gIGlmIChlbmFibGVMYXp5KSB7XG4gICAgdHJlZS5odG1sID0gaHRtbDtcbiAgfSBlbHNlIHtcbiAgICBzZXRJbm5lckhUTUwodHJlZS5ub2RlLCBodG1sKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBxdWV1ZVRleHQodHJlZSwgdGV4dCkge1xuICBpZiAoZW5hYmxlTGF6eSkge1xuICAgIHRyZWUudGV4dCA9IHRleHQ7XG4gIH0gZWxzZSB7XG4gICAgc2V0VGV4dENvbnRlbnQodHJlZS5ub2RlLCB0ZXh0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIHRoaXMubm9kZS5ub2RlTmFtZTtcbn1cblxuZnVuY3Rpb24gRE9NTGF6eVRyZWUobm9kZSkge1xuICByZXR1cm4ge1xuICAgIG5vZGU6IG5vZGUsXG4gICAgY2hpbGRyZW46IFtdLFxuICAgIGh0bWw6IG51bGwsXG4gICAgdGV4dDogbnVsbCxcbiAgICB0b1N0cmluZzogdG9TdHJpbmdcbiAgfTtcbn1cblxuRE9NTGF6eVRyZWUuaW5zZXJ0VHJlZUJlZm9yZSA9IGluc2VydFRyZWVCZWZvcmU7XG5ET01MYXp5VHJlZS5yZXBsYWNlQ2hpbGRXaXRoVHJlZSA9IHJlcGxhY2VDaGlsZFdpdGhUcmVlO1xuRE9NTGF6eVRyZWUucXVldWVDaGlsZCA9IHF1ZXVlQ2hpbGQ7XG5ET01MYXp5VHJlZS5xdWV1ZUhUTUwgPSBxdWV1ZUhUTUw7XG5ET01MYXp5VHJlZS5xdWV1ZVRleHQgPSBxdWV1ZVRleHQ7XG5cbm1vZHVsZS5leHBvcnRzID0gRE9NTGF6eVRyZWU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIERPTU5hbWVzcGFjZXMgPSB7XG4gIGh0bWw6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJyxcbiAgbWF0aG1sOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCcsXG4gIHN2ZzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJ1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBET01OYW1lc3BhY2VzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuZnVuY3Rpb24gY2hlY2tNYXNrKHZhbHVlLCBiaXRtYXNrKSB7XG4gIHJldHVybiAodmFsdWUgJiBiaXRtYXNrKSA9PT0gYml0bWFzaztcbn1cblxudmFyIERPTVByb3BlcnR5SW5qZWN0aW9uID0ge1xuICAvKipcbiAgICogTWFwcGluZyBmcm9tIG5vcm1hbGl6ZWQsIGNhbWVsY2FzZWQgcHJvcGVydHkgbmFtZXMgdG8gYSBjb25maWd1cmF0aW9uIHRoYXRcbiAgICogc3BlY2lmaWVzIGhvdyB0aGUgYXNzb2NpYXRlZCBET00gcHJvcGVydHkgc2hvdWxkIGJlIGFjY2Vzc2VkIG9yIHJlbmRlcmVkLlxuICAgKi9cbiAgTVVTVF9VU0VfUFJPUEVSVFk6IDB4MSxcbiAgSEFTX0JPT0xFQU5fVkFMVUU6IDB4NCxcbiAgSEFTX05VTUVSSUNfVkFMVUU6IDB4OCxcbiAgSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUU6IDB4MTAgfCAweDgsXG4gIEhBU19PVkVSTE9BREVEX0JPT0xFQU5fVkFMVUU6IDB4MjAsXG5cbiAgLyoqXG4gICAqIEluamVjdCBzb21lIHNwZWNpYWxpemVkIGtub3dsZWRnZSBhYm91dCB0aGUgRE9NLiBUaGlzIHRha2VzIGEgY29uZmlnIG9iamVjdFxuICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAgICpcbiAgICogaXNDdXN0b21BdHRyaWJ1dGU6IGZ1bmN0aW9uIHRoYXQgZ2l2ZW4gYW4gYXR0cmlidXRlIG5hbWUgd2lsbCByZXR1cm4gdHJ1ZVxuICAgKiBpZiBpdCBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NIHZlcmJhdGltLiBVc2VmdWwgZm9yIGRhdGEtKiBvciBhcmlhLSpcbiAgICogYXR0cmlidXRlcyB3aGVyZSBpdCdzIGltcG9zc2libGUgdG8gZW51bWVyYXRlIGFsbCBvZiB0aGUgcG9zc2libGVcbiAgICogYXR0cmlidXRlIG5hbWVzLFxuICAgKlxuICAgKiBQcm9wZXJ0aWVzOiBvYmplY3QgbWFwcGluZyBET00gcHJvcGVydHkgbmFtZSB0byBvbmUgb2YgdGhlXG4gICAqIERPTVByb3BlcnR5SW5qZWN0aW9uIGNvbnN0YW50cyBvciBudWxsLiBJZiB5b3VyIGF0dHJpYnV0ZSBpc24ndCBpbiBoZXJlLFxuICAgKiBpdCB3b24ndCBnZXQgd3JpdHRlbiB0byB0aGUgRE9NLlxuICAgKlxuICAgKiBET01BdHRyaWJ1dGVOYW1lczogb2JqZWN0IG1hcHBpbmcgUmVhY3QgYXR0cmlidXRlIG5hbWUgdG8gdGhlIERPTVxuICAgKiBhdHRyaWJ1dGUgbmFtZS4gQXR0cmlidXRlIG5hbWVzIG5vdCBzcGVjaWZpZWQgdXNlIHRoZSAqKmxvd2VyY2FzZSoqXG4gICAqIG5vcm1hbGl6ZWQgbmFtZS5cbiAgICpcbiAgICogRE9NQXR0cmlidXRlTmFtZXNwYWNlczogb2JqZWN0IG1hcHBpbmcgUmVhY3QgYXR0cmlidXRlIG5hbWUgdG8gdGhlIERPTVxuICAgKiBhdHRyaWJ1dGUgbmFtZXNwYWNlIFVSTC4gKEF0dHJpYnV0ZSBuYW1lcyBub3Qgc3BlY2lmaWVkIHVzZSBubyBuYW1lc3BhY2UuKVxuICAgKlxuICAgKiBET01Qcm9wZXJ0eU5hbWVzOiBzaW1pbGFyIHRvIERPTUF0dHJpYnV0ZU5hbWVzIGJ1dCBmb3IgRE9NIHByb3BlcnRpZXMuXG4gICAqIFByb3BlcnR5IG5hbWVzIG5vdCBzcGVjaWZpZWQgdXNlIHRoZSBub3JtYWxpemVkIG5hbWUuXG4gICAqXG4gICAqIERPTU11dGF0aW9uTWV0aG9kczogUHJvcGVydGllcyB0aGF0IHJlcXVpcmUgc3BlY2lhbCBtdXRhdGlvbiBtZXRob2RzLiBJZlxuICAgKiBgdmFsdWVgIGlzIHVuZGVmaW5lZCwgdGhlIG11dGF0aW9uIG1ldGhvZCBzaG91bGQgdW5zZXQgdGhlIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZG9tUHJvcGVydHlDb25maWcgdGhlIGNvbmZpZyBhcyBkZXNjcmliZWQgYWJvdmUuXG4gICAqL1xuICBpbmplY3RET01Qcm9wZXJ0eUNvbmZpZzogZnVuY3Rpb24gKGRvbVByb3BlcnR5Q29uZmlnKSB7XG4gICAgdmFyIEluamVjdGlvbiA9IERPTVByb3BlcnR5SW5qZWN0aW9uO1xuICAgIHZhciBQcm9wZXJ0aWVzID0gZG9tUHJvcGVydHlDb25maWcuUHJvcGVydGllcyB8fCB7fTtcbiAgICB2YXIgRE9NQXR0cmlidXRlTmFtZXNwYWNlcyA9IGRvbVByb3BlcnR5Q29uZmlnLkRPTUF0dHJpYnV0ZU5hbWVzcGFjZXMgfHwge307XG4gICAgdmFyIERPTUF0dHJpYnV0ZU5hbWVzID0gZG9tUHJvcGVydHlDb25maWcuRE9NQXR0cmlidXRlTmFtZXMgfHwge307XG4gICAgdmFyIERPTVByb3BlcnR5TmFtZXMgPSBkb21Qcm9wZXJ0eUNvbmZpZy5ET01Qcm9wZXJ0eU5hbWVzIHx8IHt9O1xuICAgIHZhciBET01NdXRhdGlvbk1ldGhvZHMgPSBkb21Qcm9wZXJ0eUNvbmZpZy5ET01NdXRhdGlvbk1ldGhvZHMgfHwge307XG5cbiAgICBpZiAoZG9tUHJvcGVydHlDb25maWcuaXNDdXN0b21BdHRyaWJ1dGUpIHtcbiAgICAgIERPTVByb3BlcnR5Ll9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9ucy5wdXNoKGRvbVByb3BlcnR5Q29uZmlnLmlzQ3VzdG9tQXR0cmlidXRlKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBQcm9wZXJ0aWVzKSB7XG4gICAgICAhIURPTVByb3BlcnR5LnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdpbmplY3RET01Qcm9wZXJ0eUNvbmZpZyguLi4pOiBZb3VcXCdyZSB0cnlpbmcgdG8gaW5qZWN0IERPTSBwcm9wZXJ0eSBcXCclc1xcJyB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGluamVjdGVkLiBZb3UgbWF5IGJlIGFjY2lkZW50YWxseSBpbmplY3RpbmcgdGhlIHNhbWUgRE9NIHByb3BlcnR5IGNvbmZpZyB0d2ljZSwgb3IgeW91IG1heSBiZSBpbmplY3RpbmcgdHdvIGNvbmZpZ3MgdGhhdCBoYXZlIGNvbmZsaWN0aW5nIHByb3BlcnR5IG5hbWVzLicsIHByb3BOYW1lKSA6IF9wcm9kSW52YXJpYW50KCc0OCcsIHByb3BOYW1lKSA6IHZvaWQgMDtcblxuICAgICAgdmFyIGxvd2VyQ2FzZWQgPSBwcm9wTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgdmFyIHByb3BDb25maWcgPSBQcm9wZXJ0aWVzW3Byb3BOYW1lXTtcblxuICAgICAgdmFyIHByb3BlcnR5SW5mbyA9IHtcbiAgICAgICAgYXR0cmlidXRlTmFtZTogbG93ZXJDYXNlZCxcbiAgICAgICAgYXR0cmlidXRlTmFtZXNwYWNlOiBudWxsLFxuICAgICAgICBwcm9wZXJ0eU5hbWU6IHByb3BOYW1lLFxuICAgICAgICBtdXRhdGlvbk1ldGhvZDogbnVsbCxcblxuICAgICAgICBtdXN0VXNlUHJvcGVydHk6IGNoZWNrTWFzayhwcm9wQ29uZmlnLCBJbmplY3Rpb24uTVVTVF9VU0VfUFJPUEVSVFkpLFxuICAgICAgICBoYXNCb29sZWFuVmFsdWU6IGNoZWNrTWFzayhwcm9wQ29uZmlnLCBJbmplY3Rpb24uSEFTX0JPT0xFQU5fVkFMVUUpLFxuICAgICAgICBoYXNOdW1lcmljVmFsdWU6IGNoZWNrTWFzayhwcm9wQ29uZmlnLCBJbmplY3Rpb24uSEFTX05VTUVSSUNfVkFMVUUpLFxuICAgICAgICBoYXNQb3NpdGl2ZU51bWVyaWNWYWx1ZTogY2hlY2tNYXNrKHByb3BDb25maWcsIEluamVjdGlvbi5IQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSksXG4gICAgICAgIGhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWU6IGNoZWNrTWFzayhwcm9wQ29uZmlnLCBJbmplY3Rpb24uSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRSlcbiAgICAgIH07XG4gICAgICAhKHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUgKyBwcm9wZXJ0eUluZm8uaGFzTnVtZXJpY1ZhbHVlICsgcHJvcGVydHlJbmZvLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUgPD0gMSkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0RPTVByb3BlcnR5OiBWYWx1ZSBjYW4gYmUgb25lIG9mIGJvb2xlYW4sIG92ZXJsb2FkZWQgYm9vbGVhbiwgb3IgbnVtZXJpYyB2YWx1ZSwgYnV0IG5vdCBhIGNvbWJpbmF0aW9uOiAlcycsIHByb3BOYW1lKSA6IF9wcm9kSW52YXJpYW50KCc1MCcsIHByb3BOYW1lKSA6IHZvaWQgMDtcblxuICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIERPTVByb3BlcnR5LmdldFBvc3NpYmxlU3RhbmRhcmROYW1lW2xvd2VyQ2FzZWRdID0gcHJvcE5hbWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChET01BdHRyaWJ1dGVOYW1lcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBET01BdHRyaWJ1dGVOYW1lc1twcm9wTmFtZV07XG4gICAgICAgIHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTtcbiAgICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgRE9NUHJvcGVydHkuZ2V0UG9zc2libGVTdGFuZGFyZE5hbWVbYXR0cmlidXRlTmFtZV0gPSBwcm9wTmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoRE9NQXR0cmlidXRlTmFtZXNwYWNlcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcGVydHlJbmZvLmF0dHJpYnV0ZU5hbWVzcGFjZSA9IERPTUF0dHJpYnV0ZU5hbWVzcGFjZXNbcHJvcE5hbWVdO1xuICAgICAgfVxuXG4gICAgICBpZiAoRE9NUHJvcGVydHlOYW1lcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcGVydHlJbmZvLnByb3BlcnR5TmFtZSA9IERPTVByb3BlcnR5TmFtZXNbcHJvcE5hbWVdO1xuICAgICAgfVxuXG4gICAgICBpZiAoRE9NTXV0YXRpb25NZXRob2RzLmhhc093blByb3BlcnR5KHByb3BOYW1lKSkge1xuICAgICAgICBwcm9wZXJ0eUluZm8ubXV0YXRpb25NZXRob2QgPSBET01NdXRhdGlvbk1ldGhvZHNbcHJvcE5hbWVdO1xuICAgICAgfVxuXG4gICAgICBET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzW3Byb3BOYW1lXSA9IHByb3BlcnR5SW5mbztcbiAgICB9XG4gIH1cbn07XG5cbi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbnZhciBBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSID0gJzpBLVpfYS16XFxcXHUwMEMwLVxcXFx1MDBENlxcXFx1MDBEOC1cXFxcdTAwRjZcXFxcdTAwRjgtXFxcXHUwMkZGXFxcXHUwMzcwLVxcXFx1MDM3RFxcXFx1MDM3Ri1cXFxcdTFGRkZcXFxcdTIwMEMtXFxcXHUyMDBEXFxcXHUyMDcwLVxcXFx1MjE4RlxcXFx1MkMwMC1cXFxcdTJGRUZcXFxcdTMwMDEtXFxcXHVEN0ZGXFxcXHVGOTAwLVxcXFx1RkRDRlxcXFx1RkRGMC1cXFxcdUZGRkQnO1xuLyogZXNsaW50LWVuYWJsZSBtYXgtbGVuICovXG5cbi8qKlxuICogRE9NUHJvcGVydHkgZXhwb3J0cyBsb29rdXAgb2JqZWN0cyB0aGF0IGNhbiBiZSB1c2VkIGxpa2UgZnVuY3Rpb25zOlxuICpcbiAqICAgPiBET01Qcm9wZXJ0eS5pc1ZhbGlkWydpZCddXG4gKiAgIHRydWVcbiAqICAgPiBET01Qcm9wZXJ0eS5pc1ZhbGlkWydmb29iYXInXVxuICogICB1bmRlZmluZWRcbiAqXG4gKiBBbHRob3VnaCB0aGlzIG1heSBiZSBjb25mdXNpbmcsIGl0IHBlcmZvcm1zIGJldHRlciBpbiBnZW5lcmFsLlxuICpcbiAqIEBzZWUgaHR0cDovL2pzcGVyZi5jb20va2V5LWV4aXN0c1xuICogQHNlZSBodHRwOi8vanNwZXJmLmNvbS9rZXktbWlzc2luZ1xuICovXG52YXIgRE9NUHJvcGVydHkgPSB7XG5cbiAgSURfQVRUUklCVVRFX05BTUU6ICdkYXRhLXJlYWN0aWQnLFxuICBST09UX0FUVFJJQlVURV9OQU1FOiAnZGF0YS1yZWFjdHJvb3QnLFxuXG4gIEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVI6IEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIsXG4gIEFUVFJJQlVURV9OQU1FX0NIQVI6IEFUVFJJQlVURV9OQU1FX1NUQVJUX0NIQVIgKyAnXFxcXC0uMC05XFxcXHUwMEI3XFxcXHUwMzAwLVxcXFx1MDM2RlxcXFx1MjAzRi1cXFxcdTIwNDAnLFxuXG4gIC8qKlxuICAgKiBNYXAgZnJvbSBwcm9wZXJ0eSBcInN0YW5kYXJkIG5hbWVcIiB0byBhbiBvYmplY3Qgd2l0aCBpbmZvIGFib3V0IGhvdyB0byBzZXRcbiAgICogdGhlIHByb3BlcnR5IGluIHRoZSBET00uIEVhY2ggb2JqZWN0IGNvbnRhaW5zOlxuICAgKlxuICAgKiBhdHRyaWJ1dGVOYW1lOlxuICAgKiAgIFVzZWQgd2hlbiByZW5kZXJpbmcgbWFya3VwIG9yIHdpdGggYCpBdHRyaWJ1dGUoKWAuXG4gICAqIGF0dHJpYnV0ZU5hbWVzcGFjZVxuICAgKiBwcm9wZXJ0eU5hbWU6XG4gICAqICAgVXNlZCBvbiBET00gbm9kZSBpbnN0YW5jZXMuIChUaGlzIGluY2x1ZGVzIHByb3BlcnRpZXMgdGhhdCBtdXRhdGUgZHVlIHRvXG4gICAqICAgZXh0ZXJuYWwgZmFjdG9ycy4pXG4gICAqIG11dGF0aW9uTWV0aG9kOlxuICAgKiAgIElmIG5vbi1udWxsLCB1c2VkIGluc3RlYWQgb2YgdGhlIHByb3BlcnR5IG9yIGBzZXRBdHRyaWJ1dGUoKWAgYWZ0ZXJcbiAgICogICBpbml0aWFsIHJlbmRlci5cbiAgICogbXVzdFVzZVByb3BlcnR5OlxuICAgKiAgIFdoZXRoZXIgdGhlIHByb3BlcnR5IG11c3QgYmUgYWNjZXNzZWQgYW5kIG11dGF0ZWQgYXMgYW4gb2JqZWN0IHByb3BlcnR5LlxuICAgKiBoYXNCb29sZWFuVmFsdWU6XG4gICAqICAgV2hldGhlciB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiBzZXQgdG8gYSBmYWxzZXkgdmFsdWUuXG4gICAqIGhhc051bWVyaWNWYWx1ZTpcbiAgICogICBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBtdXN0IGJlIG51bWVyaWMgb3IgcGFyc2UgYXMgYSBudW1lcmljIGFuZCBzaG91bGQgYmVcbiAgICogICByZW1vdmVkIHdoZW4gc2V0IHRvIGEgZmFsc2V5IHZhbHVlLlxuICAgKiBoYXNQb3NpdGl2ZU51bWVyaWNWYWx1ZTpcbiAgICogICBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBtdXN0IGJlIHBvc2l0aXZlIG51bWVyaWMgb3IgcGFyc2UgYXMgYSBwb3NpdGl2ZVxuICAgKiAgIG51bWVyaWMgYW5kIHNob3VsZCBiZSByZW1vdmVkIHdoZW4gc2V0IHRvIGEgZmFsc2V5IHZhbHVlLlxuICAgKiBoYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlOlxuICAgKiAgIFdoZXRoZXIgdGhlIHByb3BlcnR5IGNhbiBiZSB1c2VkIGFzIGEgZmxhZyBhcyB3ZWxsIGFzIHdpdGggYSB2YWx1ZS5cbiAgICogICBSZW1vdmVkIHdoZW4gc3RyaWN0bHkgZXF1YWwgdG8gZmFsc2U7IHByZXNlbnQgd2l0aG91dCBhIHZhbHVlIHdoZW5cbiAgICogICBzdHJpY3RseSBlcXVhbCB0byB0cnVlOyBwcmVzZW50IHdpdGggYSB2YWx1ZSBvdGhlcndpc2UuXG4gICAqL1xuICBwcm9wZXJ0aWVzOiB7fSxcblxuICAvKipcbiAgICogTWFwcGluZyBmcm9tIGxvd2VyY2FzZSBwcm9wZXJ0eSBuYW1lcyB0byB0aGUgcHJvcGVybHkgY2FzZWQgdmVyc2lvbiwgdXNlZFxuICAgKiB0byB3YXJuIGluIHRoZSBjYXNlIG9mIG1pc3NpbmcgcHJvcGVydGllcy4gQXZhaWxhYmxlIG9ubHkgaW4gX19ERVZfXy5cbiAgICpcbiAgICogYXV0b2ZvY3VzIGlzIHByZWRlZmluZWQsIGJlY2F1c2UgYWRkaW5nIGl0IHRvIHRoZSBwcm9wZXJ0eSB3aGl0ZWxpc3RcbiAgICogY2F1c2VzIHVuaW50ZW5kZWQgc2lkZSBlZmZlY3RzLlxuICAgKlxuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgZ2V0UG9zc2libGVTdGFuZGFyZE5hbWU6IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8geyBhdXRvZm9jdXM6ICdhdXRvRm9jdXMnIH0gOiBudWxsLFxuXG4gIC8qKlxuICAgKiBBbGwgb2YgdGhlIGlzQ3VzdG9tQXR0cmlidXRlKCkgZnVuY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIGluamVjdGVkLlxuICAgKi9cbiAgX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zOiBbXSxcblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgYSBwcm9wZXJ0eSBuYW1lIGlzIGEgY3VzdG9tIGF0dHJpYnV0ZS5cbiAgICogQG1ldGhvZFxuICAgKi9cbiAgaXNDdXN0b21BdHRyaWJ1dGU6IGZ1bmN0aW9uIChhdHRyaWJ1dGVOYW1lKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBET01Qcm9wZXJ0eS5faXNDdXN0b21BdHRyaWJ1dGVGdW5jdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpc0N1c3RvbUF0dHJpYnV0ZUZuID0gRE9NUHJvcGVydHkuX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zW2ldO1xuICAgICAgaWYgKGlzQ3VzdG9tQXR0cmlidXRlRm4oYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcblxuICBpbmplY3Rpb246IERPTVByb3BlcnR5SW5qZWN0aW9uXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERPTVByb3BlcnR5OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01Qcm9wZXJ0eSA9IHJlcXVpcmUoJy4vRE9NUHJvcGVydHknKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xuXG52YXIgcXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXIgPSByZXF1aXJlKCcuL3F1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIFZBTElEX0FUVFJJQlVURV9OQU1FX1JFR0VYID0gbmV3IFJlZ0V4cCgnXlsnICsgRE9NUHJvcGVydHkuQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUiArICddWycgKyBET01Qcm9wZXJ0eS5BVFRSSUJVVEVfTkFNRV9DSEFSICsgJ10qJCcpO1xudmFyIGlsbGVnYWxBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTtcbnZhciB2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUgPSB7fTtcblxuZnVuY3Rpb24gaXNBdHRyaWJ1dGVOYW1lU2FmZShhdHRyaWJ1dGVOYW1lKSB7XG4gIGlmICh2YWxpZGF0ZWRBdHRyaWJ1dGVOYW1lQ2FjaGUuaGFzT3duUHJvcGVydHkoYXR0cmlidXRlTmFtZSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZS5oYXNPd25Qcm9wZXJ0eShhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoVkFMSURfQVRUUklCVVRFX05BTUVfUkVHRVgudGVzdChhdHRyaWJ1dGVOYW1lKSkge1xuICAgIHZhbGlkYXRlZEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWxsZWdhbEF0dHJpYnV0ZU5hbWVDYWNoZVthdHRyaWJ1dGVOYW1lXSA9IHRydWU7XG4gIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ludmFsaWQgYXR0cmlidXRlIG5hbWU6IGAlc2AnLCBhdHRyaWJ1dGVOYW1lKSA6IHZvaWQgMDtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBzaG91bGRJZ25vcmVWYWx1ZShwcm9wZXJ0eUluZm8sIHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUgJiYgIXZhbHVlIHx8IHByb3BlcnR5SW5mby5oYXNOdW1lcmljVmFsdWUgJiYgaXNOYU4odmFsdWUpIHx8IHByb3BlcnR5SW5mby5oYXNQb3NpdGl2ZU51bWVyaWNWYWx1ZSAmJiB2YWx1ZSA8IDEgfHwgcHJvcGVydHlJbmZvLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUgJiYgdmFsdWUgPT09IGZhbHNlO1xufVxuXG4vKipcbiAqIE9wZXJhdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCBET00gcHJvcGVydGllcy5cbiAqL1xudmFyIERPTVByb3BlcnR5T3BlcmF0aW9ucyA9IHtcblxuICAvKipcbiAgICogQ3JlYXRlcyBtYXJrdXAgZm9yIHRoZSBJRCBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFVuZXNjYXBlZCBJRC5cbiAgICogQHJldHVybiB7c3RyaW5nfSBNYXJrdXAgc3RyaW5nLlxuICAgKi9cbiAgY3JlYXRlTWFya3VwRm9ySUQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHJldHVybiBET01Qcm9wZXJ0eS5JRF9BVFRSSUJVVEVfTkFNRSArICc9JyArIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKGlkKTtcbiAgfSxcblxuICBzZXRBdHRyaWJ1dGVGb3JJRDogZnVuY3Rpb24gKG5vZGUsIGlkKSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoRE9NUHJvcGVydHkuSURfQVRUUklCVVRFX05BTUUsIGlkKTtcbiAgfSxcblxuICBjcmVhdGVNYXJrdXBGb3JSb290OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIERPTVByb3BlcnR5LlJPT1RfQVRUUklCVVRFX05BTUUgKyAnPVwiXCInO1xuICB9LFxuXG4gIHNldEF0dHJpYnV0ZUZvclJvb3Q6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoRE9NUHJvcGVydHkuUk9PVF9BVFRSSUJVVEVfTkFNRSwgJycpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG1hcmt1cCBmb3IgYSBwcm9wZXJ0eS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfSBNYXJrdXAgc3RyaW5nLCBvciBudWxsIGlmIHRoZSBwcm9wZXJ0eSB3YXMgaW52YWxpZC5cbiAgICovXG4gIGNyZWF0ZU1hcmt1cEZvclByb3BlcnR5OiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgcHJvcGVydHlJbmZvID0gRE9NUHJvcGVydHkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IERPTVByb3BlcnR5LnByb3BlcnRpZXNbbmFtZV0gOiBudWxsO1xuICAgIGlmIChwcm9wZXJ0eUluZm8pIHtcbiAgICAgIGlmIChzaG91bGRJZ25vcmVWYWx1ZShwcm9wZXJ0eUluZm8sIHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG4gICAgICB2YXIgYXR0cmlidXRlTmFtZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lO1xuICAgICAgaWYgKHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUgfHwgcHJvcGVydHlJbmZvLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUgJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZU5hbWUgKyAnPVwiXCInO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF0dHJpYnV0ZU5hbWUgKyAnPScgKyBxdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3Nlcih2YWx1ZSk7XG4gICAgfSBlbHNlIGlmIChET01Qcm9wZXJ0eS5pc0N1c3RvbUF0dHJpYnV0ZShuYW1lKSkge1xuICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5hbWUgKyAnPScgKyBxdW90ZUF0dHJpYnV0ZVZhbHVlRm9yQnJvd3Nlcih2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIG1hcmt1cCBmb3IgYSBjdXN0b20gcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHJldHVybiB7c3RyaW5nfSBNYXJrdXAgc3RyaW5nLCBvciBlbXB0eSBzdHJpbmcgaWYgdGhlIHByb3BlcnR5IHdhcyBpbnZhbGlkLlxuICAgKi9cbiAgY3JlYXRlTWFya3VwRm9yQ3VzdG9tQXR0cmlidXRlOiBmdW5jdGlvbiAobmFtZSwgdmFsdWUpIHtcbiAgICBpZiAoIWlzQXR0cmlidXRlTmFtZVNhZmUobmFtZSkgfHwgdmFsdWUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZSArICc9JyArIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKHZhbHVlKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyB0aGUgdmFsdWUgZm9yIGEgcHJvcGVydHkgb24gYSBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IG5vZGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKi9cbiAgc2V0VmFsdWVGb3JQcm9wZXJ0eTogZnVuY3Rpb24gKG5vZGUsIG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIHByb3BlcnR5SW5mbyA9IERPTVByb3BlcnR5LnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzW25hbWVdIDogbnVsbDtcbiAgICBpZiAocHJvcGVydHlJbmZvKSB7XG4gICAgICB2YXIgbXV0YXRpb25NZXRob2QgPSBwcm9wZXJ0eUluZm8ubXV0YXRpb25NZXRob2Q7XG4gICAgICBpZiAobXV0YXRpb25NZXRob2QpIHtcbiAgICAgICAgbXV0YXRpb25NZXRob2Qobm9kZSwgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChzaG91bGRJZ25vcmVWYWx1ZShwcm9wZXJ0eUluZm8sIHZhbHVlKSkge1xuICAgICAgICB0aGlzLmRlbGV0ZVZhbHVlRm9yUHJvcGVydHkobm9kZSwgbmFtZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlJbmZvLm11c3RVc2VQcm9wZXJ0eSkge1xuICAgICAgICAvLyBDb250cmFyeSB0byBgc2V0QXR0cmlidXRlYCwgb2JqZWN0IHByb3BlcnRpZXMgYXJlIHByb3Blcmx5XG4gICAgICAgIC8vIGB0b1N0cmluZ2BlZCBieSBJRTgvOS5cbiAgICAgICAgbm9kZVtwcm9wZXJ0eUluZm8ucHJvcGVydHlOYW1lXSA9IHZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZU5hbWUgPSBwcm9wZXJ0eUluZm8uYXR0cmlidXRlTmFtZTtcbiAgICAgICAgdmFyIG5hbWVzcGFjZSA9IHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lc3BhY2U7XG4gICAgICAgIC8vIGBzZXRBdHRyaWJ1dGVgIHdpdGggb2JqZWN0cyBiZWNvbWVzIG9ubHkgYFtvYmplY3RdYCBpbiBJRTgvOSxcbiAgICAgICAgLy8gKCcnICsgdmFsdWUpIG1ha2VzIGl0IG91dHB1dCB0aGUgY29ycmVjdCB0b1N0cmluZygpLXZhbHVlLlxuICAgICAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2UsIGF0dHJpYnV0ZU5hbWUsICcnICsgdmFsdWUpO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUgfHwgcHJvcGVydHlJbmZvLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUgJiYgdmFsdWUgPT09IHRydWUpIHtcbiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCAnJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgJycgKyB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKERPTVByb3BlcnR5LmlzQ3VzdG9tQXR0cmlidXRlKG5hbWUpKSB7XG4gICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuc2V0VmFsdWVGb3JBdHRyaWJ1dGUobm9kZSwgbmFtZSwgdmFsdWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHBheWxvYWQgPSB7fTtcbiAgICAgIHBheWxvYWRbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe1xuICAgICAgICBpbnN0YW5jZUlEOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKS5fZGVidWdJRCxcbiAgICAgICAgdHlwZTogJ3VwZGF0ZSBhdHRyaWJ1dGUnLFxuICAgICAgICBwYXlsb2FkOiBwYXlsb2FkXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgc2V0VmFsdWVGb3JBdHRyaWJ1dGU6IGZ1bmN0aW9uIChub2RlLCBuYW1lLCB2YWx1ZSkge1xuICAgIGlmICghaXNBdHRyaWJ1dGVOYW1lU2FmZShuYW1lKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG5hbWUsICcnICsgdmFsdWUpO1xuICAgIH1cblxuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHBheWxvYWQgPSB7fTtcbiAgICAgIHBheWxvYWRbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe1xuICAgICAgICBpbnN0YW5jZUlEOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKS5fZGVidWdJRCxcbiAgICAgICAgdHlwZTogJ3VwZGF0ZSBhdHRyaWJ1dGUnLFxuICAgICAgICBwYXlsb2FkOiBwYXlsb2FkXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYW4gYXR0cmlidXRlcyBmcm9tIGEgbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBkZWxldGVWYWx1ZUZvckF0dHJpYnV0ZTogZnVuY3Rpb24gKG5vZGUsIG5hbWUpIHtcbiAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe1xuICAgICAgICBpbnN0YW5jZUlEOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKS5fZGVidWdJRCxcbiAgICAgICAgdHlwZTogJ3JlbW92ZSBhdHRyaWJ1dGUnLFxuICAgICAgICBwYXlsb2FkOiBuYW1lXG4gICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIHZhbHVlIGZvciBhIHByb3BlcnR5IG9uIGEgbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqL1xuICBkZWxldGVWYWx1ZUZvclByb3BlcnR5OiBmdW5jdGlvbiAobm9kZSwgbmFtZSkge1xuICAgIHZhciBwcm9wZXJ0eUluZm8gPSBET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG5hbWUpID8gRE9NUHJvcGVydHkucHJvcGVydGllc1tuYW1lXSA6IG51bGw7XG4gICAgaWYgKHByb3BlcnR5SW5mbykge1xuICAgICAgdmFyIG11dGF0aW9uTWV0aG9kID0gcHJvcGVydHlJbmZvLm11dGF0aW9uTWV0aG9kO1xuICAgICAgaWYgKG11dGF0aW9uTWV0aG9kKSB7XG4gICAgICAgIG11dGF0aW9uTWV0aG9kKG5vZGUsIHVuZGVmaW5lZCk7XG4gICAgICB9IGVsc2UgaWYgKHByb3BlcnR5SW5mby5tdXN0VXNlUHJvcGVydHkpIHtcbiAgICAgICAgdmFyIHByb3BOYW1lID0gcHJvcGVydHlJbmZvLnByb3BlcnR5TmFtZTtcbiAgICAgICAgaWYgKHByb3BlcnR5SW5mby5oYXNCb29sZWFuVmFsdWUpIHtcbiAgICAgICAgICBub2RlW3Byb3BOYW1lXSA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGVbcHJvcE5hbWVdID0gJyc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKHByb3BlcnR5SW5mby5hdHRyaWJ1dGVOYW1lKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKERPTVByb3BlcnR5LmlzQ3VzdG9tQXR0cmlidXRlKG5hbWUpKSB7XG4gICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkhvc3RPcGVyYXRpb24oe1xuICAgICAgICBpbnN0YW5jZUlEOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0SW5zdGFuY2VGcm9tTm9kZShub2RlKS5fZGVidWdJRCxcbiAgICAgICAgdHlwZTogJ3JlbW92ZSBhdHRyaWJ1dGUnLFxuICAgICAgICBwYXlsb2FkOiBuYW1lXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBET01Qcm9wZXJ0eU9wZXJhdGlvbnM7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIERPTUxhenlUcmVlID0gcmVxdWlyZSgnLi9ET01MYXp5VHJlZScpO1xudmFyIEV4ZWN1dGlvbkVudmlyb25tZW50ID0gcmVxdWlyZSgnZmJqcy9saWIvRXhlY3V0aW9uRW52aXJvbm1lbnQnKTtcblxudmFyIGNyZWF0ZU5vZGVzRnJvbU1hcmt1cCA9IHJlcXVpcmUoJ2ZianMvbGliL2NyZWF0ZU5vZGVzRnJvbU1hcmt1cCcpO1xudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbnZhciBEYW5nZXIgPSB7XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGEgbm9kZSB3aXRoIGEgc3RyaW5nIG9mIG1hcmt1cCBhdCBpdHMgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gaXRzXG4gICAqIHBhcmVudC4gVGhlIG1hcmt1cCBtdXN0IHJlbmRlciBpbnRvIGEgc2luZ2xlIHJvb3Qgbm9kZS5cbiAgICpcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBvbGRDaGlsZCBDaGlsZCBub2RlIHRvIHJlcGxhY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXJrdXAgTWFya3VwIHRvIHJlbmRlciBpbiBwbGFjZSBvZiB0aGUgY2hpbGQgbm9kZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cDogZnVuY3Rpb24gKG9sZENoaWxkLCBtYXJrdXApIHtcbiAgICAhRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCguLi4pOiBDYW5ub3QgcmVuZGVyIG1hcmt1cCBpbiBhIHdvcmtlciB0aHJlYWQuIE1ha2Ugc3VyZSBgd2luZG93YCBhbmQgYGRvY3VtZW50YCBhcmUgYXZhaWxhYmxlIGdsb2JhbGx5IGJlZm9yZSByZXF1aXJpbmcgUmVhY3Qgd2hlbiB1bml0IHRlc3Rpbmcgb3IgdXNlIFJlYWN0RE9NU2VydmVyLnJlbmRlclRvU3RyaW5nKCkgZm9yIHNlcnZlciByZW5kZXJpbmcuJykgOiBfcHJvZEludmFyaWFudCgnNTYnKSA6IHZvaWQgMDtcbiAgICAhbWFya3VwID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCguLi4pOiBNaXNzaW5nIG1hcmt1cC4nKSA6IF9wcm9kSW52YXJpYW50KCc1NycpIDogdm9pZCAwO1xuICAgICEob2xkQ2hpbGQubm9kZU5hbWUgIT09ICdIVE1MJykgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2Rhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwKC4uLik6IENhbm5vdCByZXBsYWNlIG1hcmt1cCBvZiB0aGUgPGh0bWw+IG5vZGUuIFRoaXMgaXMgYmVjYXVzZSBicm93c2VyIHF1aXJrcyBtYWtlIHRoaXMgdW5yZWxpYWJsZSBhbmQvb3Igc2xvdy4gSWYgeW91IHdhbnQgdG8gcmVuZGVyIHRvIHRoZSByb290IHlvdSBtdXN0IHVzZSBzZXJ2ZXIgcmVuZGVyaW5nLiBTZWUgUmVhY3RET01TZXJ2ZXIucmVuZGVyVG9TdHJpbmcoKS4nKSA6IF9wcm9kSW52YXJpYW50KCc1OCcpIDogdm9pZCAwO1xuXG4gICAgaWYgKHR5cGVvZiBtYXJrdXAgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgbmV3Q2hpbGQgPSBjcmVhdGVOb2Rlc0Zyb21NYXJrdXAobWFya3VwLCBlbXB0eUZ1bmN0aW9uKVswXTtcbiAgICAgIG9sZENoaWxkLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG5ld0NoaWxkLCBvbGRDaGlsZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIERPTUxhenlUcmVlLnJlcGxhY2VDaGlsZFdpdGhUcmVlKG9sZENoaWxkLCBtYXJrdXApO1xuICAgIH1cbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IERhbmdlcjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIE1vZHVsZSB0aGF0IGlzIGluamVjdGFibGUgaW50byBgRXZlbnRQbHVnaW5IdWJgLCB0aGF0IHNwZWNpZmllcyBhXG4gKiBkZXRlcm1pbmlzdGljIG9yZGVyaW5nIG9mIGBFdmVudFBsdWdpbmBzLiBBIGNvbnZlbmllbnQgd2F5IHRvIHJlYXNvbiBhYm91dFxuICogcGx1Z2lucywgd2l0aG91dCBoYXZpbmcgdG8gcGFja2FnZSBldmVyeSBvbmUgb2YgdGhlbS4gVGhpcyBpcyBiZXR0ZXIgdGhhblxuICogaGF2aW5nIHBsdWdpbnMgYmUgb3JkZXJlZCBpbiB0aGUgc2FtZSBvcmRlciB0aGF0IHRoZXkgYXJlIGluamVjdGVkIGJlY2F1c2VcbiAqIHRoYXQgb3JkZXJpbmcgd291bGQgYmUgaW5mbHVlbmNlZCBieSB0aGUgcGFja2FnaW5nIG9yZGVyLlxuICogYFJlc3BvbmRlckV2ZW50UGx1Z2luYCBtdXN0IG9jY3VyIGJlZm9yZSBgU2ltcGxlRXZlbnRQbHVnaW5gIHNvIHRoYXRcbiAqIHByZXZlbnRpbmcgZGVmYXVsdCBvbiBldmVudHMgaXMgY29udmVuaWVudCBpbiBgU2ltcGxlRXZlbnRQbHVnaW5gIGhhbmRsZXJzLlxuICovXG5cbnZhciBEZWZhdWx0RXZlbnRQbHVnaW5PcmRlciA9IFsnUmVzcG9uZGVyRXZlbnRQbHVnaW4nLCAnU2ltcGxlRXZlbnRQbHVnaW4nLCAnVGFwRXZlbnRQbHVnaW4nLCAnRW50ZXJMZWF2ZUV2ZW50UGx1Z2luJywgJ0NoYW5nZUV2ZW50UGx1Z2luJywgJ1NlbGVjdEV2ZW50UGx1Z2luJywgJ0JlZm9yZUlucHV0RXZlbnRQbHVnaW4nXTtcblxubW9kdWxlLmV4cG9ydHMgPSBEZWZhdWx0RXZlbnRQbHVnaW5PcmRlcjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXZlbnRQcm9wYWdhdG9ycyA9IHJlcXVpcmUoJy4vRXZlbnRQcm9wYWdhdG9ycycpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgU3ludGhldGljTW91c2VFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljTW91c2VFdmVudCcpO1xuXG52YXIgZXZlbnRUeXBlcyA9IHtcbiAgbW91c2VFbnRlcjoge1xuICAgIHJlZ2lzdHJhdGlvbk5hbWU6ICdvbk1vdXNlRW50ZXInLFxuICAgIGRlcGVuZGVuY2llczogWyd0b3BNb3VzZU91dCcsICd0b3BNb3VzZU92ZXInXVxuICB9LFxuICBtb3VzZUxlYXZlOiB7XG4gICAgcmVnaXN0cmF0aW9uTmFtZTogJ29uTW91c2VMZWF2ZScsXG4gICAgZGVwZW5kZW5jaWVzOiBbJ3RvcE1vdXNlT3V0JywgJ3RvcE1vdXNlT3ZlciddXG4gIH1cbn07XG5cbnZhciBFbnRlckxlYXZlRXZlbnRQbHVnaW4gPSB7XG5cbiAgZXZlbnRUeXBlczogZXZlbnRUeXBlcyxcblxuICAvKipcbiAgICogRm9yIGFsbW9zdCBldmVyeSBpbnRlcmFjdGlvbiB3ZSBjYXJlIGFib3V0LCB0aGVyZSB3aWxsIGJlIGJvdGggYSB0b3AtbGV2ZWxcbiAgICogYG1vdXNlb3ZlcmAgYW5kIGBtb3VzZW91dGAgZXZlbnQgdGhhdCBvY2N1cnMuIE9ubHkgdXNlIGBtb3VzZW91dGAgc28gdGhhdFxuICAgKiB3ZSBkbyBub3QgZXh0cmFjdCBkdXBsaWNhdGUgZXZlbnRzLiBIb3dldmVyLCBtb3ZpbmcgdGhlIG1vdXNlIGludG8gdGhlXG4gICAqIGJyb3dzZXIgZnJvbSBvdXRzaWRlIHdpbGwgbm90IGZpcmUgYSBgbW91c2VvdXRgIGV2ZW50LiBJbiB0aGlzIGNhc2UsIHdlIHVzZVxuICAgKiB0aGUgYG1vdXNlb3ZlcmAgdG9wLWxldmVsIGV2ZW50LlxuICAgKi9cbiAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgaWYgKHRvcExldmVsVHlwZSA9PT0gJ3RvcE1vdXNlT3ZlcicgJiYgKG5hdGl2ZUV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgbmF0aXZlRXZlbnQuZnJvbUVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRvcExldmVsVHlwZSAhPT0gJ3RvcE1vdXNlT3V0JyAmJiB0b3BMZXZlbFR5cGUgIT09ICd0b3BNb3VzZU92ZXInKSB7XG4gICAgICAvLyBNdXN0IG5vdCBiZSBhIG1vdXNlIGluIG9yIG1vdXNlIG91dCAtIGlnbm9yaW5nLlxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHdpbjtcbiAgICBpZiAobmF0aXZlRXZlbnRUYXJnZXQud2luZG93ID09PSBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgICAgLy8gYG5hdGl2ZUV2ZW50VGFyZ2V0YCBpcyBwcm9iYWJseSBhIHdpbmRvdyBvYmplY3QuXG4gICAgICB3aW4gPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETzogRmlndXJlIG91dCB3aHkgYG93bmVyRG9jdW1lbnRgIGlzIHNvbWV0aW1lcyB1bmRlZmluZWQgaW4gSUU4LlxuICAgICAgdmFyIGRvYyA9IG5hdGl2ZUV2ZW50VGFyZ2V0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICBpZiAoZG9jKSB7XG4gICAgICAgIHdpbiA9IGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luID0gd2luZG93O1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBmcm9tO1xuICAgIHZhciB0bztcbiAgICBpZiAodG9wTGV2ZWxUeXBlID09PSAndG9wTW91c2VPdXQnKSB7XG4gICAgICBmcm9tID0gdGFyZ2V0SW5zdDtcbiAgICAgIHZhciByZWxhdGVkID0gbmF0aXZlRXZlbnQucmVsYXRlZFRhcmdldCB8fCBuYXRpdmVFdmVudC50b0VsZW1lbnQ7XG4gICAgICB0byA9IHJlbGF0ZWQgPyBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUocmVsYXRlZCkgOiBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNb3ZpbmcgdG8gYSBub2RlIGZyb20gb3V0c2lkZSB0aGUgd2luZG93LlxuICAgICAgZnJvbSA9IG51bGw7XG4gICAgICB0byA9IHRhcmdldEluc3Q7XG4gICAgfVxuXG4gICAgaWYgKGZyb20gPT09IHRvKSB7XG4gICAgICAvLyBOb3RoaW5nIHBlcnRhaW5zIHRvIG91ciBtYW5hZ2VkIGNvbXBvbmVudHMuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgZnJvbU5vZGUgPSBmcm9tID09IG51bGwgPyB3aW4gOiBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShmcm9tKTtcbiAgICB2YXIgdG9Ob2RlID0gdG8gPT0gbnVsbCA/IHdpbiA6IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHRvKTtcblxuICAgIHZhciBsZWF2ZSA9IFN5bnRoZXRpY01vdXNlRXZlbnQuZ2V0UG9vbGVkKGV2ZW50VHlwZXMubW91c2VMZWF2ZSwgZnJvbSwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICBsZWF2ZS50eXBlID0gJ21vdXNlbGVhdmUnO1xuICAgIGxlYXZlLnRhcmdldCA9IGZyb21Ob2RlO1xuICAgIGxlYXZlLnJlbGF0ZWRUYXJnZXQgPSB0b05vZGU7XG5cbiAgICB2YXIgZW50ZXIgPSBTeW50aGV0aWNNb3VzZUV2ZW50LmdldFBvb2xlZChldmVudFR5cGVzLm1vdXNlRW50ZXIsIHRvLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgIGVudGVyLnR5cGUgPSAnbW91c2VlbnRlcic7XG4gICAgZW50ZXIudGFyZ2V0ID0gdG9Ob2RlO1xuICAgIGVudGVyLnJlbGF0ZWRUYXJnZXQgPSBmcm9tTm9kZTtcblxuICAgIEV2ZW50UHJvcGFnYXRvcnMuYWNjdW11bGF0ZUVudGVyTGVhdmVEaXNwYXRjaGVzKGxlYXZlLCBlbnRlciwgZnJvbSwgdG8pO1xuXG4gICAgcmV0dXJuIFtsZWF2ZSwgZW50ZXJdO1xuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRW50ZXJMZWF2ZUV2ZW50UGx1Z2luOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBFdmVudFBsdWdpblJlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpblJlZ2lzdHJ5Jyk7XG52YXIgRXZlbnRQbHVnaW5VdGlscyA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5VdGlscycpO1xudmFyIFJlYWN0RXJyb3JVdGlscyA9IHJlcXVpcmUoJy4vUmVhY3RFcnJvclV0aWxzJyk7XG5cbnZhciBhY2N1bXVsYXRlSW50byA9IHJlcXVpcmUoJy4vYWNjdW11bGF0ZUludG8nKTtcbnZhciBmb3JFYWNoQWNjdW11bGF0ZWQgPSByZXF1aXJlKCcuL2ZvckVhY2hBY2N1bXVsYXRlZCcpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIEludGVybmFsIHN0b3JlIGZvciBldmVudCBsaXN0ZW5lcnNcbiAqL1xudmFyIGxpc3RlbmVyQmFuayA9IHt9O1xuXG4vKipcbiAqIEludGVybmFsIHF1ZXVlIG9mIGV2ZW50cyB0aGF0IGhhdmUgYWNjdW11bGF0ZWQgdGhlaXIgZGlzcGF0Y2hlcyBhbmQgYXJlXG4gKiB3YWl0aW5nIHRvIGhhdmUgdGhlaXIgZGlzcGF0Y2hlcyBleGVjdXRlZC5cbiAqL1xudmFyIGV2ZW50UXVldWUgPSBudWxsO1xuXG4vKipcbiAqIERpc3BhdGNoZXMgYW4gZXZlbnQgYW5kIHJlbGVhc2VzIGl0IGJhY2sgaW50byB0aGUgcG9vbCwgdW5sZXNzIHBlcnNpc3RlbnQuXG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBldmVudCBTeW50aGV0aWMgZXZlbnQgdG8gYmUgZGlzcGF0Y2hlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2ltdWxhdGVkIElmIHRoZSBldmVudCBpcyBzaW11bGF0ZWQgKGNoYW5nZXMgZXhuIGJlaGF2aW9yKVxuICogQHByaXZhdGVcbiAqL1xudmFyIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFzZSA9IGZ1bmN0aW9uIChldmVudCwgc2ltdWxhdGVkKSB7XG4gIGlmIChldmVudCkge1xuICAgIEV2ZW50UGx1Z2luVXRpbHMuZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyKGV2ZW50LCBzaW11bGF0ZWQpO1xuXG4gICAgaWYgKCFldmVudC5pc1BlcnNpc3RlbnQoKSkge1xuICAgICAgZXZlbnQuY29uc3RydWN0b3IucmVsZWFzZShldmVudCk7XG4gICAgfVxuICB9XG59O1xudmFyIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFzZVNpbXVsYXRlZCA9IGZ1bmN0aW9uIChlKSB7XG4gIHJldHVybiBleGVjdXRlRGlzcGF0Y2hlc0FuZFJlbGVhc2UoZSwgdHJ1ZSk7XG59O1xudmFyIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFzZVRvcExldmVsID0gZnVuY3Rpb24gKGUpIHtcbiAgcmV0dXJuIGV4ZWN1dGVEaXNwYXRjaGVzQW5kUmVsZWFzZShlLCBmYWxzZSk7XG59O1xuXG52YXIgZ2V0RGljdGlvbmFyeUtleSA9IGZ1bmN0aW9uIChpbnN0KSB7XG4gIC8vIFByZXZlbnRzIFY4IHBlcmZvcm1hbmNlIGlzc3VlOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC83MjMyXG4gIHJldHVybiAnLicgKyBpbnN0Ll9yb290Tm9kZUlEO1xufTtcblxuZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSh0YWcpIHtcbiAgcmV0dXJuIHRhZyA9PT0gJ2J1dHRvbicgfHwgdGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3NlbGVjdCcgfHwgdGFnID09PSAndGV4dGFyZWEnO1xufVxuXG5mdW5jdGlvbiBzaG91bGRQcmV2ZW50TW91c2VFdmVudChuYW1lLCB0eXBlLCBwcm9wcykge1xuICBzd2l0Y2ggKG5hbWUpIHtcbiAgICBjYXNlICdvbkNsaWNrJzpcbiAgICBjYXNlICdvbkNsaWNrQ2FwdHVyZSc6XG4gICAgY2FzZSAnb25Eb3VibGVDbGljayc6XG4gICAgY2FzZSAnb25Eb3VibGVDbGlja0NhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VEb3duJzpcbiAgICBjYXNlICdvbk1vdXNlRG93bkNhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VNb3ZlJzpcbiAgICBjYXNlICdvbk1vdXNlTW92ZUNhcHR1cmUnOlxuICAgIGNhc2UgJ29uTW91c2VVcCc6XG4gICAgY2FzZSAnb25Nb3VzZVVwQ2FwdHVyZSc6XG4gICAgICByZXR1cm4gISEocHJvcHMuZGlzYWJsZWQgJiYgaXNJbnRlcmFjdGl2ZSh0eXBlKSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgYSB1bmlmaWVkIGludGVyZmFjZSBmb3IgZXZlbnQgcGx1Z2lucyB0byBiZSBpbnN0YWxsZWQgYW5kIGNvbmZpZ3VyZWQuXG4gKlxuICogRXZlbnQgcGx1Z2lucyBjYW4gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIGBleHRyYWN0RXZlbnRzYCB7ZnVuY3Rpb24oc3RyaW5nLCBET01FdmVudFRhcmdldCwgc3RyaW5nLCBvYmplY3QpOiAqfVxuICogICAgIFJlcXVpcmVkLiBXaGVuIGEgdG9wLWxldmVsIGV2ZW50IGlzIGZpcmVkLCB0aGlzIG1ldGhvZCBpcyBleHBlY3RlZCB0b1xuICogICAgIGV4dHJhY3Qgc3ludGhldGljIGV2ZW50cyB0aGF0IHdpbGwgaW4gdHVybiBiZSBxdWV1ZWQgYW5kIGRpc3BhdGNoZWQuXG4gKlxuICogICBgZXZlbnRUeXBlc2Age29iamVjdH1cbiAqICAgICBPcHRpb25hbCwgcGx1Z2lucyB0aGF0IGZpcmUgZXZlbnRzIG11c3QgcHVibGlzaCBhIG1hcHBpbmcgb2YgcmVnaXN0cmF0aW9uXG4gKiAgICAgbmFtZXMgdGhhdCBhcmUgdXNlZCB0byByZWdpc3RlciBsaXN0ZW5lcnMuIFZhbHVlcyBvZiB0aGlzIG1hcHBpbmcgbXVzdFxuICogICAgIGJlIG9iamVjdHMgdGhhdCBjb250YWluIGByZWdpc3RyYXRpb25OYW1lYCBvciBgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXNgLlxuICpcbiAqICAgYGV4ZWN1dGVEaXNwYXRjaGAge2Z1bmN0aW9uKG9iamVjdCwgZnVuY3Rpb24sIHN0cmluZyl9XG4gKiAgICAgT3B0aW9uYWwsIGFsbG93cyBwbHVnaW5zIHRvIG92ZXJyaWRlIGhvdyBhbiBldmVudCBnZXRzIGRpc3BhdGNoZWQuIEJ5XG4gKiAgICAgZGVmYXVsdCwgdGhlIGxpc3RlbmVyIGlzIHNpbXBseSBpbnZva2VkLlxuICpcbiAqIEVhY2ggcGx1Z2luIHRoYXQgaXMgaW5qZWN0ZWQgaW50byBgRXZlbnRzUGx1Z2luSHViYCBpcyBpbW1lZGlhdGVseSBvcGVyYWJsZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbnZhciBFdmVudFBsdWdpbkh1YiA9IHtcblxuICAvKipcbiAgICogTWV0aG9kcyBmb3IgaW5qZWN0aW5nIGRlcGVuZGVuY2llcy5cbiAgICovXG4gIGluamVjdGlvbjoge1xuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIHthcnJheX0gSW5qZWN0ZWRFdmVudFBsdWdpbk9yZGVyXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIGluamVjdEV2ZW50UGx1Z2luT3JkZXI6IEV2ZW50UGx1Z2luUmVnaXN0cnkuaW5qZWN0RXZlbnRQbHVnaW5PcmRlcixcblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBpbmplY3RlZE5hbWVzVG9QbHVnaW5zIE1hcCBmcm9tIG5hbWVzIHRvIHBsdWdpbiBtb2R1bGVzLlxuICAgICAqL1xuICAgIGluamVjdEV2ZW50UGx1Z2luc0J5TmFtZTogRXZlbnRQbHVnaW5SZWdpc3RyeS5pbmplY3RFdmVudFBsdWdpbnNCeU5hbWVcblxuICB9LFxuXG4gIC8qKlxuICAgKiBTdG9yZXMgYGxpc3RlbmVyYCBhdCBgbGlzdGVuZXJCYW5rW3JlZ2lzdHJhdGlvbk5hbWVdW2tleV1gLiBJcyBpZGVtcG90ZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW5zdCBUaGUgaW5zdGFuY2UsIHdoaWNoIGlzIHRoZSBzb3VyY2Ugb2YgZXZlbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVnaXN0cmF0aW9uTmFtZSBOYW1lIG9mIGxpc3RlbmVyIChlLmcuIGBvbkNsaWNrYCkuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyIFRoZSBjYWxsYmFjayB0byBzdG9yZS5cbiAgICovXG4gIHB1dExpc3RlbmVyOiBmdW5jdGlvbiAoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXIpIHtcbiAgICAhKHR5cGVvZiBsaXN0ZW5lciA9PT0gJ2Z1bmN0aW9uJykgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkICVzIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IHR5cGUgJXMnLCByZWdpc3RyYXRpb25OYW1lLCB0eXBlb2YgbGlzdGVuZXIpIDogX3Byb2RJbnZhcmlhbnQoJzk0JywgcmVnaXN0cmF0aW9uTmFtZSwgdHlwZW9mIGxpc3RlbmVyKSA6IHZvaWQgMDtcblxuICAgIHZhciBrZXkgPSBnZXREaWN0aW9uYXJ5S2V5KGluc3QpO1xuICAgIHZhciBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZSA9IGxpc3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXSB8fCAobGlzdGVuZXJCYW5rW3JlZ2lzdHJhdGlvbk5hbWVdID0ge30pO1xuICAgIGJhbmtGb3JSZWdpc3RyYXRpb25OYW1lW2tleV0gPSBsaXN0ZW5lcjtcblxuICAgIHZhciBQbHVnaW5Nb2R1bGUgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3JlZ2lzdHJhdGlvbk5hbWVdO1xuICAgIGlmIChQbHVnaW5Nb2R1bGUgJiYgUGx1Z2luTW9kdWxlLmRpZFB1dExpc3RlbmVyKSB7XG4gICAgICBQbHVnaW5Nb2R1bGUuZGlkUHV0TGlzdGVuZXIoaW5zdCwgcmVnaXN0cmF0aW9uTmFtZSwgbGlzdGVuZXIpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGluc3QgVGhlIGluc3RhbmNlLCB3aGljaCBpcyB0aGUgc291cmNlIG9mIGV2ZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLlxuICAgKiBAcmV0dXJuIHs/ZnVuY3Rpb259IFRoZSBzdG9yZWQgY2FsbGJhY2suXG4gICAqL1xuICBnZXRMaXN0ZW5lcjogZnVuY3Rpb24gKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgICAvLyBUT0RPOiBzaG91bGRQcmV2ZW50TW91c2VFdmVudCBpcyBET00tc3BlY2lmaWMgYW5kIGRlZmluaXRlbHkgc2hvdWxkIG5vdFxuICAgIC8vIGxpdmUgaGVyZTsgbmVlZHMgdG8gYmUgbW92ZWQgdG8gYSBiZXR0ZXIgcGxhY2Ugc29vblxuICAgIHZhciBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZSA9IGxpc3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXTtcbiAgICBpZiAoc2hvdWxkUHJldmVudE1vdXNlRXZlbnQocmVnaXN0cmF0aW9uTmFtZSwgaW5zdC5fY3VycmVudEVsZW1lbnQudHlwZSwgaW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHMpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIGtleSA9IGdldERpY3Rpb25hcnlLZXkoaW5zdCk7XG4gICAgcmV0dXJuIGJhbmtGb3JSZWdpc3RyYXRpb25OYW1lICYmIGJhbmtGb3JSZWdpc3RyYXRpb25OYW1lW2tleV07XG4gIH0sXG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYSBsaXN0ZW5lciBmcm9tIHRoZSByZWdpc3RyYXRpb24gYmFuay5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGluc3QgVGhlIGluc3RhbmNlLCB3aGljaCBpcyB0aGUgc291cmNlIG9mIGV2ZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgTmFtZSBvZiBsaXN0ZW5lciAoZS5nLiBgb25DbGlja2ApLlxuICAgKi9cbiAgZGVsZXRlTGlzdGVuZXI6IGZ1bmN0aW9uIChpbnN0LCByZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgdmFyIFBsdWdpbk1vZHVsZSA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV07XG4gICAgaWYgKFBsdWdpbk1vZHVsZSAmJiBQbHVnaW5Nb2R1bGUud2lsbERlbGV0ZUxpc3RlbmVyKSB7XG4gICAgICBQbHVnaW5Nb2R1bGUud2lsbERlbGV0ZUxpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIH1cblxuICAgIHZhciBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZSA9IGxpc3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXTtcbiAgICAvLyBUT0RPOiBUaGlzIHNob3VsZCBuZXZlciBiZSBudWxsIC0tIHdoZW4gaXMgaXQ/XG4gICAgaWYgKGJhbmtGb3JSZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgICB2YXIga2V5ID0gZ2V0RGljdGlvbmFyeUtleShpbnN0KTtcbiAgICAgIGRlbGV0ZSBiYW5rRm9yUmVnaXN0cmF0aW9uTmFtZVtrZXldO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogRGVsZXRlcyBhbGwgbGlzdGVuZXJzIGZvciB0aGUgRE9NIGVsZW1lbnQgd2l0aCB0aGUgc3VwcGxpZWQgSUQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbnN0IFRoZSBpbnN0YW5jZSwgd2hpY2ggaXMgdGhlIHNvdXJjZSBvZiBldmVudHMuXG4gICAqL1xuICBkZWxldGVBbGxMaXN0ZW5lcnM6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgdmFyIGtleSA9IGdldERpY3Rpb25hcnlLZXkoaW5zdCk7XG4gICAgZm9yICh2YXIgcmVnaXN0cmF0aW9uTmFtZSBpbiBsaXN0ZW5lckJhbmspIHtcbiAgICAgIGlmICghbGlzdGVuZXJCYW5rLmhhc093blByb3BlcnR5KHJlZ2lzdHJhdGlvbk5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWxpc3RlbmVyQmFua1tyZWdpc3RyYXRpb25OYW1lXVtrZXldKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgUGx1Z2luTW9kdWxlID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tyZWdpc3RyYXRpb25OYW1lXTtcbiAgICAgIGlmIChQbHVnaW5Nb2R1bGUgJiYgUGx1Z2luTW9kdWxlLndpbGxEZWxldGVMaXN0ZW5lcikge1xuICAgICAgICBQbHVnaW5Nb2R1bGUud2lsbERlbGV0ZUxpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgICAgfVxuXG4gICAgICBkZWxldGUgbGlzdGVuZXJCYW5rW3JlZ2lzdHJhdGlvbk5hbWVdW2tleV07XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBBbGxvd3MgcmVnaXN0ZXJlZCBwbHVnaW5zIGFuIG9wcG9ydHVuaXR5IHRvIGV4dHJhY3QgZXZlbnRzIGZyb20gdG9wLWxldmVsXG4gICAqIG5hdGl2ZSBicm93c2VyIGV2ZW50cy5cbiAgICpcbiAgICogQHJldHVybiB7Kn0gQW4gYWNjdW11bGF0aW9uIG9mIHN5bnRoZXRpYyBldmVudHMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZXh0cmFjdEV2ZW50czogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgdGFyZ2V0SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gICAgdmFyIGV2ZW50cztcbiAgICB2YXIgcGx1Z2lucyA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucGx1Z2lucztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIE5vdCBldmVyeSBwbHVnaW4gaW4gdGhlIG9yZGVyaW5nIG1heSBiZSBsb2FkZWQgYXQgcnVudGltZS5cbiAgICAgIHZhciBwb3NzaWJsZVBsdWdpbiA9IHBsdWdpbnNbaV07XG4gICAgICBpZiAocG9zc2libGVQbHVnaW4pIHtcbiAgICAgICAgdmFyIGV4dHJhY3RlZEV2ZW50cyA9IHBvc3NpYmxlUGx1Z2luLmV4dHJhY3RFdmVudHModG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuICAgICAgICBpZiAoZXh0cmFjdGVkRXZlbnRzKSB7XG4gICAgICAgICAgZXZlbnRzID0gYWNjdW11bGF0ZUludG8oZXZlbnRzLCBleHRyYWN0ZWRFdmVudHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBldmVudHM7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEVucXVldWVzIGEgc3ludGhldGljIGV2ZW50IHRoYXQgc2hvdWxkIGJlIGRpc3BhdGNoZWQgd2hlblxuICAgKiBgcHJvY2Vzc0V2ZW50UXVldWVgIGlzIGludm9rZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gZXZlbnRzIEFuIGFjY3VtdWxhdGlvbiBvZiBzeW50aGV0aWMgZXZlbnRzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVFdmVudHM6IGZ1bmN0aW9uIChldmVudHMpIHtcbiAgICBpZiAoZXZlbnRzKSB7XG4gICAgICBldmVudFF1ZXVlID0gYWNjdW11bGF0ZUludG8oZXZlbnRRdWV1ZSwgZXZlbnRzKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIERpc3BhdGNoZXMgYWxsIHN5bnRoZXRpYyBldmVudHMgb24gdGhlIGV2ZW50IHF1ZXVlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb2Nlc3NFdmVudFF1ZXVlOiBmdW5jdGlvbiAoc2ltdWxhdGVkKSB7XG4gICAgLy8gU2V0IGBldmVudFF1ZXVlYCB0byBudWxsIGJlZm9yZSBwcm9jZXNzaW5nIGl0IHNvIHRoYXQgd2UgY2FuIHRlbGwgaWYgbW9yZVxuICAgIC8vIGV2ZW50cyBnZXQgZW5xdWV1ZWQgd2hpbGUgcHJvY2Vzc2luZy5cbiAgICB2YXIgcHJvY2Vzc2luZ0V2ZW50UXVldWUgPSBldmVudFF1ZXVlO1xuICAgIGV2ZW50UXVldWUgPSBudWxsO1xuICAgIGlmIChzaW11bGF0ZWQpIHtcbiAgICAgIGZvckVhY2hBY2N1bXVsYXRlZChwcm9jZXNzaW5nRXZlbnRRdWV1ZSwgZXhlY3V0ZURpc3BhdGNoZXNBbmRSZWxlYXNlU2ltdWxhdGVkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yRWFjaEFjY3VtdWxhdGVkKHByb2Nlc3NpbmdFdmVudFF1ZXVlLCBleGVjdXRlRGlzcGF0Y2hlc0FuZFJlbGVhc2VUb3BMZXZlbCk7XG4gICAgfVxuICAgICEhZXZlbnRRdWV1ZSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAncHJvY2Vzc0V2ZW50UXVldWUoKTogQWRkaXRpb25hbCBldmVudHMgd2VyZSBlbnF1ZXVlZCB3aGlsZSBwcm9jZXNzaW5nIGFuIGV2ZW50IHF1ZXVlLiBTdXBwb3J0IGZvciB0aGlzIGhhcyBub3QgeWV0IGJlZW4gaW1wbGVtZW50ZWQuJykgOiBfcHJvZEludmFyaWFudCgnOTUnKSA6IHZvaWQgMDtcbiAgICAvLyBUaGlzIHdvdWxkIGJlIGEgZ29vZCB0aW1lIHRvIHJldGhyb3cgaWYgYW55IG9mIHRoZSBldmVudCBoYW5kbGVycyB0aHJldy5cbiAgICBSZWFjdEVycm9yVXRpbHMucmV0aHJvd0NhdWdodEVycm9yKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRoZXNlIGFyZSBuZWVkZWQgZm9yIHRlc3RzIG9ubHkuIERvIG5vdCB1c2UhXG4gICAqL1xuICBfX3B1cmdlOiBmdW5jdGlvbiAoKSB7XG4gICAgbGlzdGVuZXJCYW5rID0ge307XG4gIH0sXG5cbiAgX19nZXRMaXN0ZW5lckJhbms6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gbGlzdGVuZXJCYW5rO1xuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRQbHVnaW5IdWI7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogSW5qZWN0YWJsZSBvcmRlcmluZyBvZiBldmVudCBwbHVnaW5zLlxuICovXG52YXIgZXZlbnRQbHVnaW5PcmRlciA9IG51bGw7XG5cbi8qKlxuICogSW5qZWN0YWJsZSBtYXBwaW5nIGZyb20gbmFtZXMgdG8gZXZlbnQgcGx1Z2luIG1vZHVsZXMuXG4gKi9cbnZhciBuYW1lc1RvUGx1Z2lucyA9IHt9O1xuXG4vKipcbiAqIFJlY29tcHV0ZXMgdGhlIHBsdWdpbiBsaXN0IHVzaW5nIHRoZSBpbmplY3RlZCBwbHVnaW5zIGFuZCBwbHVnaW4gb3JkZXJpbmcuXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcmVjb21wdXRlUGx1Z2luT3JkZXJpbmcoKSB7XG4gIGlmICghZXZlbnRQbHVnaW5PcmRlcikge1xuICAgIC8vIFdhaXQgdW50aWwgYW4gYGV2ZW50UGx1Z2luT3JkZXJgIGlzIGluamVjdGVkLlxuICAgIHJldHVybjtcbiAgfVxuICBmb3IgKHZhciBwbHVnaW5OYW1lIGluIG5hbWVzVG9QbHVnaW5zKSB7XG4gICAgdmFyIHBsdWdpbk1vZHVsZSA9IG5hbWVzVG9QbHVnaW5zW3BsdWdpbk5hbWVdO1xuICAgIHZhciBwbHVnaW5JbmRleCA9IGV2ZW50UGx1Z2luT3JkZXIuaW5kZXhPZihwbHVnaW5OYW1lKTtcbiAgICAhKHBsdWdpbkluZGV4ID4gLTEpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpblJlZ2lzdHJ5OiBDYW5ub3QgaW5qZWN0IGV2ZW50IHBsdWdpbnMgdGhhdCBkbyBub3QgZXhpc3QgaW4gdGhlIHBsdWdpbiBvcmRlcmluZywgYCVzYC4nLCBwbHVnaW5OYW1lKSA6IF9wcm9kSW52YXJpYW50KCc5NicsIHBsdWdpbk5hbWUpIDogdm9pZCAwO1xuICAgIGlmIChFdmVudFBsdWdpblJlZ2lzdHJ5LnBsdWdpbnNbcGx1Z2luSW5kZXhdKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgIXBsdWdpbk1vZHVsZS5leHRyYWN0RXZlbnRzID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpblJlZ2lzdHJ5OiBFdmVudCBwbHVnaW5zIG11c3QgaW1wbGVtZW50IGFuIGBleHRyYWN0RXZlbnRzYCBtZXRob2QsIGJ1dCBgJXNgIGRvZXMgbm90LicsIHBsdWdpbk5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzk3JywgcGx1Z2luTmFtZSkgOiB2b2lkIDA7XG4gICAgRXZlbnRQbHVnaW5SZWdpc3RyeS5wbHVnaW5zW3BsdWdpbkluZGV4XSA9IHBsdWdpbk1vZHVsZTtcbiAgICB2YXIgcHVibGlzaGVkRXZlbnRzID0gcGx1Z2luTW9kdWxlLmV2ZW50VHlwZXM7XG4gICAgZm9yICh2YXIgZXZlbnROYW1lIGluIHB1Ymxpc2hlZEV2ZW50cykge1xuICAgICAgIXB1Ymxpc2hFdmVudEZvclBsdWdpbihwdWJsaXNoZWRFdmVudHNbZXZlbnROYW1lXSwgcGx1Z2luTW9kdWxlLCBldmVudE5hbWUpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFdmVudFBsdWdpblJlZ2lzdHJ5OiBGYWlsZWQgdG8gcHVibGlzaCBldmVudCBgJXNgIGZvciBwbHVnaW4gYCVzYC4nLCBldmVudE5hbWUsIHBsdWdpbk5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzk4JywgZXZlbnROYW1lLCBwbHVnaW5OYW1lKSA6IHZvaWQgMDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQdWJsaXNoZXMgYW4gZXZlbnQgc28gdGhhdCBpdCBjYW4gYmUgZGlzcGF0Y2hlZCBieSB0aGUgc3VwcGxpZWQgcGx1Z2luLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBEaXNwYXRjaCBjb25maWd1cmF0aW9uIGZvciB0aGUgZXZlbnQuXG4gKiBAcGFyYW0ge29iamVjdH0gUGx1Z2luTW9kdWxlIFBsdWdpbiBwdWJsaXNoaW5nIHRoZSBldmVudC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGV2ZW50IHdhcyBzdWNjZXNzZnVsbHkgcHVibGlzaGVkLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gcHVibGlzaEV2ZW50Rm9yUGx1Z2luKGRpc3BhdGNoQ29uZmlnLCBwbHVnaW5Nb2R1bGUsIGV2ZW50TmFtZSkge1xuICAhIUV2ZW50UGx1Z2luUmVnaXN0cnkuZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luSHViOiBNb3JlIHRoYW4gb25lIHBsdWdpbiBhdHRlbXB0ZWQgdG8gcHVibGlzaCB0aGUgc2FtZSBldmVudCBuYW1lLCBgJXNgLicsIGV2ZW50TmFtZSkgOiBfcHJvZEludmFyaWFudCgnOTknLCBldmVudE5hbWUpIDogdm9pZCAwO1xuICBFdmVudFBsdWdpblJlZ2lzdHJ5LmV2ZW50TmFtZURpc3BhdGNoQ29uZmlnc1tldmVudE5hbWVdID0gZGlzcGF0Y2hDb25maWc7XG5cbiAgdmFyIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzID0gZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM7XG4gIGlmIChwaGFzZWRSZWdpc3RyYXRpb25OYW1lcykge1xuICAgIGZvciAodmFyIHBoYXNlTmFtZSBpbiBwaGFzZWRSZWdpc3RyYXRpb25OYW1lcykge1xuICAgICAgaWYgKHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzLmhhc093blByb3BlcnR5KHBoYXNlTmFtZSkpIHtcbiAgICAgICAgdmFyIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWUgPSBwaGFzZWRSZWdpc3RyYXRpb25OYW1lc1twaGFzZU5hbWVdO1xuICAgICAgICBwdWJsaXNoUmVnaXN0cmF0aW9uTmFtZShwaGFzZWRSZWdpc3RyYXRpb25OYW1lLCBwbHVnaW5Nb2R1bGUsIGV2ZW50TmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgICBwdWJsaXNoUmVnaXN0cmF0aW9uTmFtZShkaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lLCBwbHVnaW5Nb2R1bGUsIGV2ZW50TmFtZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFB1Ymxpc2hlcyBhIHJlZ2lzdHJhdGlvbiBuYW1lIHRoYXQgaXMgdXNlZCB0byBpZGVudGlmeSBkaXNwYXRjaGVkIGV2ZW50cyBhbmRcbiAqIGNhbiBiZSB1c2VkIHdpdGggYEV2ZW50UGx1Z2luSHViLnB1dExpc3RlbmVyYCB0byByZWdpc3RlciBsaXN0ZW5lcnMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZ2lzdHJhdGlvbk5hbWUgUmVnaXN0cmF0aW9uIG5hbWUgdG8gYWRkLlxuICogQHBhcmFtIHtvYmplY3R9IFBsdWdpbk1vZHVsZSBQbHVnaW4gcHVibGlzaGluZyB0aGUgZXZlbnQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBwdWJsaXNoUmVnaXN0cmF0aW9uTmFtZShyZWdpc3RyYXRpb25OYW1lLCBwbHVnaW5Nb2R1bGUsIGV2ZW50TmFtZSkge1xuICAhIUV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcmVnaXN0cmF0aW9uTmFtZV0gPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luSHViOiBNb3JlIHRoYW4gb25lIHBsdWdpbiBhdHRlbXB0ZWQgdG8gcHVibGlzaCB0aGUgc2FtZSByZWdpc3RyYXRpb24gbmFtZSwgYCVzYC4nLCByZWdpc3RyYXRpb25OYW1lKSA6IF9wcm9kSW52YXJpYW50KCcxMDAnLCByZWdpc3RyYXRpb25OYW1lKSA6IHZvaWQgMDtcbiAgRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tyZWdpc3RyYXRpb25OYW1lXSA9IHBsdWdpbk1vZHVsZTtcbiAgRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW3JlZ2lzdHJhdGlvbk5hbWVdID0gcGx1Z2luTW9kdWxlLmV2ZW50VHlwZXNbZXZlbnROYW1lXS5kZXBlbmRlbmNpZXM7XG5cbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gcmVnaXN0cmF0aW9uTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIEV2ZW50UGx1Z2luUmVnaXN0cnkucG9zc2libGVSZWdpc3RyYXRpb25OYW1lc1tsb3dlckNhc2VkTmFtZV0gPSByZWdpc3RyYXRpb25OYW1lO1xuXG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvbkRvdWJsZUNsaWNrJykge1xuICAgICAgRXZlbnRQbHVnaW5SZWdpc3RyeS5wb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLm9uZGJsY2xpY2sgPSByZWdpc3RyYXRpb25OYW1lO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBwbHVnaW5zIHNvIHRoYXQgdGhleSBjYW4gZXh0cmFjdCBhbmQgZGlzcGF0Y2ggZXZlbnRzLlxuICpcbiAqIEBzZWUge0V2ZW50UGx1Z2luSHVifVxuICovXG52YXIgRXZlbnRQbHVnaW5SZWdpc3RyeSA9IHtcblxuICAvKipcbiAgICogT3JkZXJlZCBsaXN0IG9mIGluamVjdGVkIHBsdWdpbnMuXG4gICAqL1xuICBwbHVnaW5zOiBbXSxcblxuICAvKipcbiAgICogTWFwcGluZyBmcm9tIGV2ZW50IG5hbWUgdG8gZGlzcGF0Y2ggY29uZmlnXG4gICAqL1xuICBldmVudE5hbWVEaXNwYXRjaENvbmZpZ3M6IHt9LFxuXG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gcmVnaXN0cmF0aW9uIG5hbWUgdG8gcGx1Z2luIG1vZHVsZVxuICAgKi9cbiAgcmVnaXN0cmF0aW9uTmFtZU1vZHVsZXM6IHt9LFxuXG4gIC8qKlxuICAgKiBNYXBwaW5nIGZyb20gcmVnaXN0cmF0aW9uIG5hbWUgdG8gZXZlbnQgbmFtZVxuICAgKi9cbiAgcmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llczoge30sXG5cbiAgLyoqXG4gICAqIE1hcHBpbmcgZnJvbSBsb3dlcmNhc2UgcmVnaXN0cmF0aW9uIG5hbWVzIHRvIHRoZSBwcm9wZXJseSBjYXNlZCB2ZXJzaW9uLFxuICAgKiB1c2VkIHRvIHdhcm4gaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBldmVudCBoYW5kbGVycy4gQXZhaWxhYmxlXG4gICAqIG9ubHkgaW4gX19ERVZfXy5cbiAgICogQHR5cGUge09iamVjdH1cbiAgICovXG4gIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM6IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8ge30gOiBudWxsLFxuICAvLyBUcnVzdCB0aGUgZGV2ZWxvcGVyIHRvIG9ubHkgdXNlIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgaW4gX19ERVZfX1xuXG4gIC8qKlxuICAgKiBJbmplY3RzIGFuIG9yZGVyaW5nIG9mIHBsdWdpbnMgKGJ5IHBsdWdpbiBuYW1lKS4gVGhpcyBhbGxvd3MgdGhlIG9yZGVyaW5nXG4gICAqIHRvIGJlIGRlY291cGxlZCBmcm9tIGluamVjdGlvbiBvZiB0aGUgYWN0dWFsIHBsdWdpbnMgc28gdGhhdCBvcmRlcmluZyBpc1xuICAgKiBhbHdheXMgZGV0ZXJtaW5pc3RpYyByZWdhcmRsZXNzIG9mIHBhY2thZ2luZywgb24tdGhlLWZseSBpbmplY3Rpb24sIGV0Yy5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gSW5qZWN0ZWRFdmVudFBsdWdpbk9yZGVyXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAc2VlIHtFdmVudFBsdWdpbkh1Yi5pbmplY3Rpb24uaW5qZWN0RXZlbnRQbHVnaW5PcmRlcn1cbiAgICovXG4gIGluamVjdEV2ZW50UGx1Z2luT3JkZXI6IGZ1bmN0aW9uIChpbmplY3RlZEV2ZW50UGx1Z2luT3JkZXIpIHtcbiAgICAhIWV2ZW50UGx1Z2luT3JkZXIgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0cnk6IENhbm5vdCBpbmplY3QgZXZlbnQgcGx1Z2luIG9yZGVyaW5nIG1vcmUgdGhhbiBvbmNlLiBZb3UgYXJlIGxpa2VseSB0cnlpbmcgdG8gbG9hZCBtb3JlIHRoYW4gb25lIGNvcHkgb2YgUmVhY3QuJykgOiBfcHJvZEludmFyaWFudCgnMTAxJykgOiB2b2lkIDA7XG4gICAgLy8gQ2xvbmUgdGhlIG9yZGVyaW5nIHNvIGl0IGNhbm5vdCBiZSBkeW5hbWljYWxseSBtdXRhdGVkLlxuICAgIGV2ZW50UGx1Z2luT3JkZXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChpbmplY3RlZEV2ZW50UGx1Z2luT3JkZXIpO1xuICAgIHJlY29tcHV0ZVBsdWdpbk9yZGVyaW5nKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEluamVjdHMgcGx1Z2lucyB0byBiZSB1c2VkIGJ5IGBFdmVudFBsdWdpbkh1YmAuIFRoZSBwbHVnaW4gbmFtZXMgbXVzdCBiZVxuICAgKiBpbiB0aGUgb3JkZXJpbmcgaW5qZWN0ZWQgYnkgYGluamVjdEV2ZW50UGx1Z2luT3JkZXJgLlxuICAgKlxuICAgKiBQbHVnaW5zIGNhbiBiZSBpbmplY3RlZCBhcyBwYXJ0IG9mIHBhZ2UgaW5pdGlhbGl6YXRpb24gb3Igb24tdGhlLWZseS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGluamVjdGVkTmFtZXNUb1BsdWdpbnMgTWFwIGZyb20gbmFtZXMgdG8gcGx1Z2luIG1vZHVsZXMuXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAc2VlIHtFdmVudFBsdWdpbkh1Yi5pbmplY3Rpb24uaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lfVxuICAgKi9cbiAgaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lOiBmdW5jdGlvbiAoaW5qZWN0ZWROYW1lc1RvUGx1Z2lucykge1xuICAgIHZhciBpc09yZGVyaW5nRGlydHkgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBwbHVnaW5OYW1lIGluIGluamVjdGVkTmFtZXNUb1BsdWdpbnMpIHtcbiAgICAgIGlmICghaW5qZWN0ZWROYW1lc1RvUGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShwbHVnaW5OYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBwbHVnaW5Nb2R1bGUgPSBpbmplY3RlZE5hbWVzVG9QbHVnaW5zW3BsdWdpbk5hbWVdO1xuICAgICAgaWYgKCFuYW1lc1RvUGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShwbHVnaW5OYW1lKSB8fCBuYW1lc1RvUGx1Z2luc1twbHVnaW5OYW1lXSAhPT0gcGx1Z2luTW9kdWxlKSB7XG4gICAgICAgICEhbmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV0gPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V2ZW50UGx1Z2luUmVnaXN0cnk6IENhbm5vdCBpbmplY3QgdHdvIGRpZmZlcmVudCBldmVudCBwbHVnaW5zIHVzaW5nIHRoZSBzYW1lIG5hbWUsIGAlc2AuJywgcGx1Z2luTmFtZSkgOiBfcHJvZEludmFyaWFudCgnMTAyJywgcGx1Z2luTmFtZSkgOiB2b2lkIDA7XG4gICAgICAgIG5hbWVzVG9QbHVnaW5zW3BsdWdpbk5hbWVdID0gcGx1Z2luTW9kdWxlO1xuICAgICAgICBpc09yZGVyaW5nRGlydHkgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXNPcmRlcmluZ0RpcnR5KSB7XG4gICAgICByZWNvbXB1dGVQbHVnaW5PcmRlcmluZygpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogTG9va3MgdXAgdGhlIHBsdWdpbiBmb3IgdGhlIHN1cHBsaWVkIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgQSBzeW50aGV0aWMgZXZlbnQuXG4gICAqIEByZXR1cm4gez9vYmplY3R9IFRoZSBwbHVnaW4gdGhhdCBjcmVhdGVkIHRoZSBzdXBwbGllZCBldmVudC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXRQbHVnaW5Nb2R1bGVGb3JFdmVudDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIGRpc3BhdGNoQ29uZmlnID0gZXZlbnQuZGlzcGF0Y2hDb25maWc7XG4gICAgaWYgKGRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUpIHtcbiAgICAgIHJldHVybiBFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW2Rpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWVdIHx8IG51bGw7XG4gICAgfVxuICAgIGlmIChkaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBwdWxsaW5nIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzIG91dCBvZiBkaXNwYXRjaENvbmZpZyBoZWxwcyBGbG93IHNlZVxuICAgICAgLy8gdGhhdCBpdCBpcyBub3QgdW5kZWZpbmVkLlxuICAgICAgdmFyIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzID0gZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM7XG5cbiAgICAgIGZvciAodmFyIHBoYXNlIGluIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKSB7XG4gICAgICAgIGlmICghcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkocGhhc2UpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBsdWdpbk1vZHVsZSA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXNbcGhhc2VdXTtcbiAgICAgICAgaWYgKHBsdWdpbk1vZHVsZSkge1xuICAgICAgICAgIHJldHVybiBwbHVnaW5Nb2R1bGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEV4cG9zZWQgZm9yIHVuaXQgdGVzdGluZy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9yZXNldEV2ZW50UGx1Z2luczogZnVuY3Rpb24gKCkge1xuICAgIGV2ZW50UGx1Z2luT3JkZXIgPSBudWxsO1xuICAgIGZvciAodmFyIHBsdWdpbk5hbWUgaW4gbmFtZXNUb1BsdWdpbnMpIHtcbiAgICAgIGlmIChuYW1lc1RvUGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShwbHVnaW5OYW1lKSkge1xuICAgICAgICBkZWxldGUgbmFtZXNUb1BsdWdpbnNbcGx1Z2luTmFtZV07XG4gICAgICB9XG4gICAgfVxuICAgIEV2ZW50UGx1Z2luUmVnaXN0cnkucGx1Z2lucy5sZW5ndGggPSAwO1xuXG4gICAgdmFyIGV2ZW50TmFtZURpc3BhdGNoQ29uZmlncyA9IEV2ZW50UGx1Z2luUmVnaXN0cnkuZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzO1xuICAgIGZvciAodmFyIGV2ZW50TmFtZSBpbiBldmVudE5hbWVEaXNwYXRjaENvbmZpZ3MpIHtcbiAgICAgIGlmIChldmVudE5hbWVEaXNwYXRjaENvbmZpZ3MuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lKSkge1xuICAgICAgICBkZWxldGUgZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzW2V2ZW50TmFtZV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzID0gRXZlbnRQbHVnaW5SZWdpc3RyeS5yZWdpc3RyYXRpb25OYW1lTW9kdWxlcztcbiAgICBmb3IgKHZhciByZWdpc3RyYXRpb25OYW1lIGluIHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzKSB7XG4gICAgICBpZiAocmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMuaGFzT3duUHJvcGVydHkocmVnaXN0cmF0aW9uTmFtZSkpIHtcbiAgICAgICAgZGVsZXRlIHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3JlZ2lzdHJhdGlvbk5hbWVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM7XG4gICAgICBmb3IgKHZhciBsb3dlckNhc2VkTmFtZSBpbiBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzKSB7XG4gICAgICAgIGlmIChwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzLmhhc093blByb3BlcnR5KGxvd2VyQ2FzZWROYW1lKSkge1xuICAgICAgICAgIGRlbGV0ZSBwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWROYW1lXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEV2ZW50UGx1Z2luUmVnaXN0cnk7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0RXJyb3JVdGlscyA9IHJlcXVpcmUoJy4vUmVhY3RFcnJvclV0aWxzJyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG4vKipcbiAqIEluamVjdGVkIGRlcGVuZGVuY2llczpcbiAqL1xuXG4vKipcbiAqIC0gYENvbXBvbmVudFRyZWVgOiBbcmVxdWlyZWRdIE1vZHVsZSB0aGF0IGNhbiBjb252ZXJ0IGJldHdlZW4gUmVhY3QgaW5zdGFuY2VzXG4gKiAgIGFuZCBhY3R1YWwgbm9kZSByZWZlcmVuY2VzLlxuICovXG52YXIgQ29tcG9uZW50VHJlZTtcbnZhciBUcmVlVHJhdmVyc2FsO1xudmFyIGluamVjdGlvbiA9IHtcbiAgaW5qZWN0Q29tcG9uZW50VHJlZTogZnVuY3Rpb24gKEluamVjdGVkKSB7XG4gICAgQ29tcG9uZW50VHJlZSA9IEluamVjdGVkO1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKEluamVjdGVkICYmIEluamVjdGVkLmdldE5vZGVGcm9tSW5zdGFuY2UgJiYgSW5qZWN0ZWQuZ2V0SW5zdGFuY2VGcm9tTm9kZSwgJ0V2ZW50UGx1Z2luVXRpbHMuaW5qZWN0aW9uLmluamVjdENvbXBvbmVudFRyZWUoLi4uKTogSW5qZWN0ZWQgJyArICdtb2R1bGUgaXMgbWlzc2luZyBnZXROb2RlRnJvbUluc3RhbmNlIG9yIGdldEluc3RhbmNlRnJvbU5vZGUuJykgOiB2b2lkIDA7XG4gICAgfVxuICB9LFxuICBpbmplY3RUcmVlVHJhdmVyc2FsOiBmdW5jdGlvbiAoSW5qZWN0ZWQpIHtcbiAgICBUcmVlVHJhdmVyc2FsID0gSW5qZWN0ZWQ7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoSW5qZWN0ZWQgJiYgSW5qZWN0ZWQuaXNBbmNlc3RvciAmJiBJbmplY3RlZC5nZXRMb3dlc3RDb21tb25BbmNlc3RvciwgJ0V2ZW50UGx1Z2luVXRpbHMuaW5qZWN0aW9uLmluamVjdFRyZWVUcmF2ZXJzYWwoLi4uKTogSW5qZWN0ZWQgJyArICdtb2R1bGUgaXMgbWlzc2luZyBpc0FuY2VzdG9yIG9yIGdldExvd2VzdENvbW1vbkFuY2VzdG9yLicpIDogdm9pZCAwO1xuICAgIH1cbiAgfVxufTtcblxuZnVuY3Rpb24gaXNFbmRpc2godG9wTGV2ZWxUeXBlKSB7XG4gIHJldHVybiB0b3BMZXZlbFR5cGUgPT09ICd0b3BNb3VzZVVwJyB8fCB0b3BMZXZlbFR5cGUgPT09ICd0b3BUb3VjaEVuZCcgfHwgdG9wTGV2ZWxUeXBlID09PSAndG9wVG91Y2hDYW5jZWwnO1xufVxuXG5mdW5jdGlvbiBpc01vdmVpc2godG9wTGV2ZWxUeXBlKSB7XG4gIHJldHVybiB0b3BMZXZlbFR5cGUgPT09ICd0b3BNb3VzZU1vdmUnIHx8IHRvcExldmVsVHlwZSA9PT0gJ3RvcFRvdWNoTW92ZSc7XG59XG5mdW5jdGlvbiBpc1N0YXJ0aXNoKHRvcExldmVsVHlwZSkge1xuICByZXR1cm4gdG9wTGV2ZWxUeXBlID09PSAndG9wTW91c2VEb3duJyB8fCB0b3BMZXZlbFR5cGUgPT09ICd0b3BUb3VjaFN0YXJ0Jztcbn1cblxudmFyIHZhbGlkYXRlRXZlbnREaXNwYXRjaGVzO1xuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhbGlkYXRlRXZlbnREaXNwYXRjaGVzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgdmFyIGRpc3BhdGNoTGlzdGVuZXJzID0gZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzO1xuICAgIHZhciBkaXNwYXRjaEluc3RhbmNlcyA9IGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcztcblxuICAgIHZhciBsaXN0ZW5lcnNJc0FyciA9IEFycmF5LmlzQXJyYXkoZGlzcGF0Y2hMaXN0ZW5lcnMpO1xuICAgIHZhciBsaXN0ZW5lcnNMZW4gPSBsaXN0ZW5lcnNJc0FyciA/IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aCA6IGRpc3BhdGNoTGlzdGVuZXJzID8gMSA6IDA7XG5cbiAgICB2YXIgaW5zdGFuY2VzSXNBcnIgPSBBcnJheS5pc0FycmF5KGRpc3BhdGNoSW5zdGFuY2VzKTtcbiAgICB2YXIgaW5zdGFuY2VzTGVuID0gaW5zdGFuY2VzSXNBcnIgPyBkaXNwYXRjaEluc3RhbmNlcy5sZW5ndGggOiBkaXNwYXRjaEluc3RhbmNlcyA/IDEgOiAwO1xuXG4gICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGluc3RhbmNlc0lzQXJyID09PSBsaXN0ZW5lcnNJc0FyciAmJiBpbnN0YW5jZXNMZW4gPT09IGxpc3RlbmVyc0xlbiwgJ0V2ZW50UGx1Z2luVXRpbHM6IEludmFsaWQgYGV2ZW50YC4nKSA6IHZvaWQgMDtcbiAgfTtcbn1cblxuLyoqXG4gKiBEaXNwYXRjaCB0aGUgZXZlbnQgdG8gdGhlIGxpc3RlbmVyLlxuICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgU3ludGhldGljRXZlbnQgdG8gaGFuZGxlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNpbXVsYXRlZCBJZiB0aGUgZXZlbnQgaXMgc2ltdWxhdGVkIChjaGFuZ2VzIGV4biBiZWhhdmlvcilcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGxpc3RlbmVyIEFwcGxpY2F0aW9uLWxldmVsIGNhbGxiYWNrXG4gKiBAcGFyYW0geyp9IGluc3QgSW50ZXJuYWwgY29tcG9uZW50IGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGV4ZWN1dGVEaXNwYXRjaChldmVudCwgc2ltdWxhdGVkLCBsaXN0ZW5lciwgaW5zdCkge1xuICB2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgJ3Vua25vd24tZXZlbnQnO1xuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gRXZlbnRQbHVnaW5VdGlscy5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO1xuICBpZiAoc2ltdWxhdGVkKSB7XG4gICAgUmVhY3RFcnJvclV0aWxzLmludm9rZUd1YXJkZWRDYWxsYmFja1dpdGhDYXRjaCh0eXBlLCBsaXN0ZW5lciwgZXZlbnQpO1xuICB9IGVsc2Uge1xuICAgIFJlYWN0RXJyb3JVdGlscy5pbnZva2VHdWFyZGVkQ2FsbGJhY2sodHlwZSwgbGlzdGVuZXIsIGV2ZW50KTtcbiAgfVxuICBldmVudC5jdXJyZW50VGFyZ2V0ID0gbnVsbDtcbn1cblxuLyoqXG4gKiBTdGFuZGFyZC9zaW1wbGUgaXRlcmF0aW9uIHRocm91Z2ggYW4gZXZlbnQncyBjb2xsZWN0ZWQgZGlzcGF0Y2hlcy5cbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyKGV2ZW50LCBzaW11bGF0ZWQpIHtcbiAgdmFyIGRpc3BhdGNoTGlzdGVuZXJzID0gZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzO1xuICB2YXIgZGlzcGF0Y2hJbnN0YW5jZXMgPSBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXM7XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZhbGlkYXRlRXZlbnREaXNwYXRjaGVzKGV2ZW50KTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShkaXNwYXRjaExpc3RlbmVycykpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BhdGNoTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vIExpc3RlbmVycyBhbmQgSW5zdGFuY2VzIGFyZSB0d28gcGFyYWxsZWwgYXJyYXlzIHRoYXQgYXJlIGFsd2F5cyBpbiBzeW5jLlxuICAgICAgZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBzaW11bGF0ZWQsIGRpc3BhdGNoTGlzdGVuZXJzW2ldLCBkaXNwYXRjaEluc3RhbmNlc1tpXSk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGRpc3BhdGNoTGlzdGVuZXJzKSB7XG4gICAgZXhlY3V0ZURpc3BhdGNoKGV2ZW50LCBzaW11bGF0ZWQsIGRpc3BhdGNoTGlzdGVuZXJzLCBkaXNwYXRjaEluc3RhbmNlcyk7XG4gIH1cbiAgZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzID0gbnVsbDtcbiAgZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzID0gbnVsbDtcbn1cblxuLyoqXG4gKiBTdGFuZGFyZC9zaW1wbGUgaXRlcmF0aW9uIHRocm91Z2ggYW4gZXZlbnQncyBjb2xsZWN0ZWQgZGlzcGF0Y2hlcywgYnV0IHN0b3BzXG4gKiBhdCB0aGUgZmlyc3QgZGlzcGF0Y2ggZXhlY3V0aW9uIHJldHVybmluZyB0cnVlLCBhbmQgcmV0dXJucyB0aGF0IGlkLlxuICpcbiAqIEByZXR1cm4gez9zdHJpbmd9IGlkIG9mIHRoZSBmaXJzdCBkaXNwYXRjaCBleGVjdXRpb24gd2hvJ3MgbGlzdGVuZXIgcmV0dXJuc1xuICogdHJ1ZSwgb3IgbnVsbCBpZiBubyBsaXN0ZW5lciByZXR1cm5lZCB0cnVlLlxuICovXG5mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXJTdG9wQXRUcnVlSW1wbChldmVudCkge1xuICB2YXIgZGlzcGF0Y2hMaXN0ZW5lcnMgPSBldmVudC5fZGlzcGF0Y2hMaXN0ZW5lcnM7XG4gIHZhciBkaXNwYXRjaEluc3RhbmNlcyA9IGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcztcbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdmFsaWRhdGVFdmVudERpc3BhdGNoZXMoZXZlbnQpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGRpc3BhdGNoTGlzdGVuZXJzKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlzcGF0Y2hMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgLy8gTGlzdGVuZXJzIGFuZCBJbnN0YW5jZXMgYXJlIHR3byBwYXJhbGxlbCBhcnJheXMgdGhhdCBhcmUgYWx3YXlzIGluIHN5bmMuXG4gICAgICBpZiAoZGlzcGF0Y2hMaXN0ZW5lcnNbaV0oZXZlbnQsIGRpc3BhdGNoSW5zdGFuY2VzW2ldKSkge1xuICAgICAgICByZXR1cm4gZGlzcGF0Y2hJbnN0YW5jZXNbaV07XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKGRpc3BhdGNoTGlzdGVuZXJzKSB7XG4gICAgaWYgKGRpc3BhdGNoTGlzdGVuZXJzKGV2ZW50LCBkaXNwYXRjaEluc3RhbmNlcykpIHtcbiAgICAgIHJldHVybiBkaXNwYXRjaEluc3RhbmNlcztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQHNlZSBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXJTdG9wQXRUcnVlSW1wbFxuICovXG5mdW5jdGlvbiBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXJTdG9wQXRUcnVlKGV2ZW50KSB7XG4gIHZhciByZXQgPSBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXJTdG9wQXRUcnVlSW1wbChldmVudCk7XG4gIGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcyA9IG51bGw7XG4gIGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycyA9IG51bGw7XG4gIHJldHVybiByZXQ7XG59XG5cbi8qKlxuICogRXhlY3V0aW9uIG9mIGEgXCJkaXJlY3RcIiBkaXNwYXRjaCAtIHRoZXJlIG11c3QgYmUgYXQgbW9zdCBvbmUgZGlzcGF0Y2hcbiAqIGFjY3VtdWxhdGVkIG9uIHRoZSBldmVudCBvciBpdCBpcyBjb25zaWRlcmVkIGFuIGVycm9yLiBJdCBkb2Vzbid0IHJlYWxseSBtYWtlXG4gKiBzZW5zZSBmb3IgYW4gZXZlbnQgd2l0aCBtdWx0aXBsZSBkaXNwYXRjaGVzIChidWJibGVkKSB0byBrZWVwIHRyYWNrIG9mIHRoZVxuICogcmV0dXJuIHZhbHVlcyBhdCBlYWNoIGRpc3BhdGNoIGV4ZWN1dGlvbiwgYnV0IGl0IGRvZXMgdGVuZCB0byBtYWtlIHNlbnNlIHdoZW5cbiAqIGRlYWxpbmcgd2l0aCBcImRpcmVjdFwiIGRpc3BhdGNoZXMuXG4gKlxuICogQHJldHVybiB7Kn0gVGhlIHJldHVybiB2YWx1ZSBvZiBleGVjdXRpbmcgdGhlIHNpbmdsZSBkaXNwYXRjaC5cbiAqL1xuZnVuY3Rpb24gZXhlY3V0ZURpcmVjdERpc3BhdGNoKGV2ZW50KSB7XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZhbGlkYXRlRXZlbnREaXNwYXRjaGVzKGV2ZW50KTtcbiAgfVxuICB2YXIgZGlzcGF0Y2hMaXN0ZW5lciA9IGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycztcbiAgdmFyIGRpc3BhdGNoSW5zdGFuY2UgPSBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXM7XG4gICEhQXJyYXkuaXNBcnJheShkaXNwYXRjaExpc3RlbmVyKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnZXhlY3V0ZURpcmVjdERpc3BhdGNoKC4uLik6IEludmFsaWQgYGV2ZW50YC4nKSA6IF9wcm9kSW52YXJpYW50KCcxMDMnKSA6IHZvaWQgMDtcbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IGRpc3BhdGNoTGlzdGVuZXIgPyBFdmVudFBsdWdpblV0aWxzLmdldE5vZGVGcm9tSW5zdGFuY2UoZGlzcGF0Y2hJbnN0YW5jZSkgOiBudWxsO1xuICB2YXIgcmVzID0gZGlzcGF0Y2hMaXN0ZW5lciA/IGRpc3BhdGNoTGlzdGVuZXIoZXZlbnQpIDogbnVsbDtcbiAgZXZlbnQuY3VycmVudFRhcmdldCA9IG51bGw7XG4gIGV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycyA9IG51bGw7XG4gIGV2ZW50Ll9kaXNwYXRjaEluc3RhbmNlcyA9IG51bGw7XG4gIHJldHVybiByZXM7XG59XG5cbi8qKlxuICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWZmIG51bWJlciBvZiBkaXNwYXRjaGVzIGFjY3VtdWxhdGVkIGlzIGdyZWF0ZXIgdGhhbiAwLlxuICovXG5mdW5jdGlvbiBoYXNEaXNwYXRjaGVzKGV2ZW50KSB7XG4gIHJldHVybiAhIWV2ZW50Ll9kaXNwYXRjaExpc3RlbmVycztcbn1cblxuLyoqXG4gKiBHZW5lcmFsIHV0aWxpdGllcyB0aGF0IGFyZSB1c2VmdWwgaW4gY3JlYXRpbmcgY3VzdG9tIEV2ZW50IFBsdWdpbnMuXG4gKi9cbnZhciBFdmVudFBsdWdpblV0aWxzID0ge1xuICBpc0VuZGlzaDogaXNFbmRpc2gsXG4gIGlzTW92ZWlzaDogaXNNb3ZlaXNoLFxuICBpc1N0YXJ0aXNoOiBpc1N0YXJ0aXNoLFxuXG4gIGV4ZWN1dGVEaXJlY3REaXNwYXRjaDogZXhlY3V0ZURpcmVjdERpc3BhdGNoLFxuICBleGVjdXRlRGlzcGF0Y2hlc0luT3JkZXI6IGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcixcbiAgZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZTogZXhlY3V0ZURpc3BhdGNoZXNJbk9yZGVyU3RvcEF0VHJ1ZSxcbiAgaGFzRGlzcGF0Y2hlczogaGFzRGlzcGF0Y2hlcyxcblxuICBnZXRJbnN0YW5jZUZyb21Ob2RlOiBmdW5jdGlvbiAobm9kZSkge1xuICAgIHJldHVybiBDb21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUobm9kZSk7XG4gIH0sXG4gIGdldE5vZGVGcm9tSW5zdGFuY2U6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIENvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShub2RlKTtcbiAgfSxcbiAgaXNBbmNlc3RvcjogZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gVHJlZVRyYXZlcnNhbC5pc0FuY2VzdG9yKGEsIGIpO1xuICB9LFxuICBnZXRMb3dlc3RDb21tb25BbmNlc3RvcjogZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gVHJlZVRyYXZlcnNhbC5nZXRMb3dlc3RDb21tb25BbmNlc3RvcihhLCBiKTtcbiAgfSxcbiAgZ2V0UGFyZW50SW5zdGFuY2U6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgcmV0dXJuIFRyZWVUcmF2ZXJzYWwuZ2V0UGFyZW50SW5zdGFuY2UoaW5zdCk7XG4gIH0sXG4gIHRyYXZlcnNlVHdvUGhhc2U6IGZ1bmN0aW9uICh0YXJnZXQsIGZuLCBhcmcpIHtcbiAgICByZXR1cm4gVHJlZVRyYXZlcnNhbC50cmF2ZXJzZVR3b1BoYXNlKHRhcmdldCwgZm4sIGFyZyk7XG4gIH0sXG4gIHRyYXZlcnNlRW50ZXJMZWF2ZTogZnVuY3Rpb24gKGZyb20sIHRvLCBmbiwgYXJnRnJvbSwgYXJnVG8pIHtcbiAgICByZXR1cm4gVHJlZVRyYXZlcnNhbC50cmF2ZXJzZUVudGVyTGVhdmUoZnJvbSwgdG8sIGZuLCBhcmdGcm9tLCBhcmdUbyk7XG4gIH0sXG5cbiAgaW5qZWN0aW9uOiBpbmplY3Rpb25cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRQbHVnaW5VdGlsczsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXZlbnRQbHVnaW5IdWIgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luSHViJyk7XG52YXIgRXZlbnRQbHVnaW5VdGlscyA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5VdGlscycpO1xuXG52YXIgYWNjdW11bGF0ZUludG8gPSByZXF1aXJlKCcuL2FjY3VtdWxhdGVJbnRvJyk7XG52YXIgZm9yRWFjaEFjY3VtdWxhdGVkID0gcmVxdWlyZSgnLi9mb3JFYWNoQWNjdW11bGF0ZWQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgZ2V0TGlzdGVuZXIgPSBFdmVudFBsdWdpbkh1Yi5nZXRMaXN0ZW5lcjtcblxuLyoqXG4gKiBTb21lIGV2ZW50IHR5cGVzIGhhdmUgYSBub3Rpb24gb2YgZGlmZmVyZW50IHJlZ2lzdHJhdGlvbiBuYW1lcyBmb3IgZGlmZmVyZW50XG4gKiBcInBoYXNlc1wiIG9mIHByb3BhZ2F0aW9uLiBUaGlzIGZpbmRzIGxpc3RlbmVycyBieSBhIGdpdmVuIHBoYXNlLlxuICovXG5mdW5jdGlvbiBsaXN0ZW5lckF0UGhhc2UoaW5zdCwgZXZlbnQsIHByb3BhZ2F0aW9uUGhhc2UpIHtcbiAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBldmVudC5kaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lc1twcm9wYWdhdGlvblBoYXNlXTtcbiAgcmV0dXJuIGdldExpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpO1xufVxuXG4vKipcbiAqIFRhZ3MgYSBgU3ludGhldGljRXZlbnRgIHdpdGggZGlzcGF0Y2hlZCBsaXN0ZW5lcnMuIENyZWF0aW5nIHRoaXMgZnVuY3Rpb25cbiAqIGhlcmUsIGFsbG93cyB1cyB0byBub3QgaGF2ZSB0byBiaW5kIG9yIGNyZWF0ZSBmdW5jdGlvbnMgZm9yIGVhY2ggZXZlbnQuXG4gKiBNdXRhdGluZyB0aGUgZXZlbnQncyBtZW1iZXJzIGFsbG93cyB1cyB0byBub3QgaGF2ZSB0byBjcmVhdGUgYSB3cmFwcGluZ1xuICogXCJkaXNwYXRjaFwiIG9iamVjdCB0aGF0IHBhaXJzIHRoZSBldmVudCB3aXRoIHRoZSBsaXN0ZW5lci5cbiAqL1xuZnVuY3Rpb24gYWNjdW11bGF0ZURpcmVjdGlvbmFsRGlzcGF0Y2hlcyhpbnN0LCBwaGFzZSwgZXZlbnQpIHtcbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGluc3QsICdEaXNwYXRjaGluZyBpbnN0IG11c3Qgbm90IGJlIG51bGwnKSA6IHZvaWQgMDtcbiAgfVxuICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lckF0UGhhc2UoaW5zdCwgZXZlbnQsIHBoYXNlKTtcbiAgaWYgKGxpc3RlbmVyKSB7XG4gICAgZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzID0gYWNjdW11bGF0ZUludG8oZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzLCBsaXN0ZW5lcik7XG4gICAgZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzID0gYWNjdW11bGF0ZUludG8oZXZlbnQuX2Rpc3BhdGNoSW5zdGFuY2VzLCBpbnN0KTtcbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3QgZGlzcGF0Y2hlcyAobXVzdCBiZSBlbnRpcmVseSBjb2xsZWN0ZWQgYmVmb3JlIGRpc3BhdGNoaW5nIC0gc2VlIHVuaXRcbiAqIHRlc3RzKS4gTGF6aWx5IGFsbG9jYXRlIHRoZSBhcnJheSB0byBjb25zZXJ2ZSBtZW1vcnkuICBXZSBtdXN0IGxvb3AgdGhyb3VnaFxuICogZWFjaCBldmVudCBhbmQgcGVyZm9ybSB0aGUgdHJhdmVyc2FsIGZvciBlYWNoIG9uZS4gV2UgY2Fubm90IHBlcmZvcm0gYVxuICogc2luZ2xlIHRyYXZlcnNhbCBmb3IgdGhlIGVudGlyZSBjb2xsZWN0aW9uIG9mIGV2ZW50cyBiZWNhdXNlIGVhY2ggZXZlbnQgbWF5XG4gKiBoYXZlIGEgZGlmZmVyZW50IHRhcmdldC5cbiAqL1xuZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NpbmdsZShldmVudCkge1xuICBpZiAoZXZlbnQgJiYgZXZlbnQuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpIHtcbiAgICBFdmVudFBsdWdpblV0aWxzLnRyYXZlcnNlVHdvUGhhc2UoZXZlbnQuX3RhcmdldEluc3QsIGFjY3VtdWxhdGVEaXJlY3Rpb25hbERpc3BhdGNoZXMsIGV2ZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIFNhbWUgYXMgYGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTaW5nbGVgLCBidXQgc2tpcHMgb3ZlciB0aGUgdGFyZ2V0SUQuXG4gKi9cbmZ1bmN0aW9uIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTaW5nbGVTa2lwVGFyZ2V0KGV2ZW50KSB7XG4gIGlmIChldmVudCAmJiBldmVudC5kaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lcykge1xuICAgIHZhciB0YXJnZXRJbnN0ID0gZXZlbnQuX3RhcmdldEluc3Q7XG4gICAgdmFyIHBhcmVudEluc3QgPSB0YXJnZXRJbnN0ID8gRXZlbnRQbHVnaW5VdGlscy5nZXRQYXJlbnRJbnN0YW5jZSh0YXJnZXRJbnN0KSA6IG51bGw7XG4gICAgRXZlbnRQbHVnaW5VdGlscy50cmF2ZXJzZVR3b1BoYXNlKHBhcmVudEluc3QsIGFjY3VtdWxhdGVEaXJlY3Rpb25hbERpc3BhdGNoZXMsIGV2ZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIEFjY3VtdWxhdGVzIHdpdGhvdXQgcmVnYXJkIHRvIGRpcmVjdGlvbiwgZG9lcyBub3QgbG9vayBmb3IgcGhhc2VkXG4gKiByZWdpc3RyYXRpb24gbmFtZXMuIFNhbWUgYXMgYGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzU2luZ2xlYCBidXQgd2l0aG91dFxuICogcmVxdWlyaW5nIHRoYXQgdGhlIGBkaXNwYXRjaE1hcmtlcmAgYmUgdGhlIHNhbWUgYXMgdGhlIGRpc3BhdGNoZWQgSUQuXG4gKi9cbmZ1bmN0aW9uIGFjY3VtdWxhdGVEaXNwYXRjaGVzKGluc3QsIGlnbm9yZWREaXJlY3Rpb24sIGV2ZW50KSB7XG4gIGlmIChldmVudCAmJiBldmVudC5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBldmVudC5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lO1xuICAgIHZhciBsaXN0ZW5lciA9IGdldExpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUpO1xuICAgIGlmIChsaXN0ZW5lcikge1xuICAgICAgZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzID0gYWNjdW11bGF0ZUludG8oZXZlbnQuX2Rpc3BhdGNoTGlzdGVuZXJzLCBsaXN0ZW5lcik7XG4gICAgICBldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMgPSBhY2N1bXVsYXRlSW50byhldmVudC5fZGlzcGF0Y2hJbnN0YW5jZXMsIGluc3QpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFjY3VtdWxhdGVzIGRpc3BhdGNoZXMgb24gYW4gYFN5bnRoZXRpY0V2ZW50YCwgYnV0IG9ubHkgZm9yIHRoZVxuICogYGRpc3BhdGNoTWFya2VyYC5cbiAqIEBwYXJhbSB7U3ludGhldGljRXZlbnR9IGV2ZW50XG4gKi9cbmZ1bmN0aW9uIGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzU2luZ2xlKGV2ZW50KSB7XG4gIGlmIChldmVudCAmJiBldmVudC5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgYWNjdW11bGF0ZURpc3BhdGNoZXMoZXZlbnQuX3RhcmdldEluc3QsIG51bGwsIGV2ZW50KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50cykge1xuICBmb3JFYWNoQWNjdW11bGF0ZWQoZXZlbnRzLCBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2luZ2xlKTtcbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlc1NraXBUYXJnZXQoZXZlbnRzKSB7XG4gIGZvckVhY2hBY2N1bXVsYXRlZChldmVudHMsIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTaW5nbGVTa2lwVGFyZ2V0KTtcbn1cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUVudGVyTGVhdmVEaXNwYXRjaGVzKGxlYXZlLCBlbnRlciwgZnJvbSwgdG8pIHtcbiAgRXZlbnRQbHVnaW5VdGlscy50cmF2ZXJzZUVudGVyTGVhdmUoZnJvbSwgdG8sIGFjY3VtdWxhdGVEaXNwYXRjaGVzLCBsZWF2ZSwgZW50ZXIpO1xufVxuXG5mdW5jdGlvbiBhY2N1bXVsYXRlRGlyZWN0RGlzcGF0Y2hlcyhldmVudHMpIHtcbiAgZm9yRWFjaEFjY3VtdWxhdGVkKGV2ZW50cywgYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXNTaW5nbGUpO1xufVxuXG4vKipcbiAqIEEgc21hbGwgc2V0IG9mIHByb3BhZ2F0aW9uIHBhdHRlcm5zLCBlYWNoIG9mIHdoaWNoIHdpbGwgYWNjZXB0IGEgc21hbGwgYW1vdW50XG4gKiBvZiBpbmZvcm1hdGlvbiwgYW5kIGdlbmVyYXRlIGEgc2V0IG9mIFwiZGlzcGF0Y2ggcmVhZHkgZXZlbnQgb2JqZWN0c1wiIC0gd2hpY2hcbiAqIGFyZSBzZXRzIG9mIGV2ZW50cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGFubm90YXRlZCB3aXRoIGEgc2V0IG9mIGRpc3BhdGNoZWRcbiAqIGxpc3RlbmVyIGZ1bmN0aW9ucy9pZHMuIFRoZSBBUEkgaXMgZGVzaWduZWQgdGhpcyB3YXkgdG8gZGlzY291cmFnZSB0aGVzZVxuICogcHJvcGFnYXRpb24gc3RyYXRlZ2llcyBmcm9tIGFjdHVhbGx5IGV4ZWN1dGluZyB0aGUgZGlzcGF0Y2hlcywgc2luY2Ugd2VcbiAqIGFsd2F5cyB3YW50IHRvIGNvbGxlY3QgdGhlIGVudGlyZSBzZXQgb2YgZGlzcGF0Y2hlcyBiZWZvcmUgZXhlY3V0aW5nIGV2ZW50IGFcbiAqIHNpbmdsZSBvbmUuXG4gKlxuICogQGNvbnN0cnVjdG9yIEV2ZW50UHJvcGFnYXRvcnNcbiAqL1xudmFyIEV2ZW50UHJvcGFnYXRvcnMgPSB7XG4gIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXM6IGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMsXG4gIGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTa2lwVGFyZ2V0OiBhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2tpcFRhcmdldCxcbiAgYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXM6IGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzLFxuICBhY2N1bXVsYXRlRW50ZXJMZWF2ZURpc3BhdGNoZXM6IGFjY3VtdWxhdGVFbnRlckxlYXZlRGlzcGF0Y2hlc1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFdmVudFByb3BhZ2F0b3JzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUG9vbGVkQ2xhc3MgPSByZXF1aXJlKCcuL1Bvb2xlZENsYXNzJyk7XG5cbnZhciBnZXRUZXh0Q29udGVudEFjY2Vzc29yID0gcmVxdWlyZSgnLi9nZXRUZXh0Q29udGVudEFjY2Vzc29yJyk7XG5cbi8qKlxuICogVGhpcyBoZWxwZXIgY2xhc3Mgc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IHRleHQgY29udGVudCBvZiBhIHRhcmdldCBub2RlLFxuICogYWxsb3dpbmcgY29tcGFyaXNvbiBvZiBjb250ZW50IGJlZm9yZSBhbmQgYWZ0ZXIgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBJZGVudGlmeSB0aGUgbm9kZSB3aGVyZSBzZWxlY3Rpb24gY3VycmVudGx5IGJlZ2lucywgdGhlbiBvYnNlcnZlXG4gKiBib3RoIGl0cyB0ZXh0IGNvbnRlbnQgYW5kIGl0cyBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBET00uIFNpbmNlIHRoZVxuICogYnJvd3NlciBtYXkgbmF0aXZlbHkgcmVwbGFjZSB0aGUgdGFyZ2V0IG5vZGUgZHVyaW5nIGNvbXBvc2l0aW9uLCB3ZSBjYW5cbiAqIHVzZSBpdHMgcG9zaXRpb24gdG8gZmluZCBpdHMgcmVwbGFjZW1lbnQuXG4gKlxuICogQHBhcmFtIHtET01FdmVudFRhcmdldH0gcm9vdFxuICovXG5mdW5jdGlvbiBGYWxsYmFja0NvbXBvc2l0aW9uU3RhdGUocm9vdCkge1xuICB0aGlzLl9yb290ID0gcm9vdDtcbiAgdGhpcy5fc3RhcnRUZXh0ID0gdGhpcy5nZXRUZXh0KCk7XG4gIHRoaXMuX2ZhbGxiYWNrVGV4dCA9IG51bGw7XG59XG5cbl9hc3NpZ24oRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlLnByb3RvdHlwZSwge1xuICBkZXN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5fcm9vdCA9IG51bGw7XG4gICAgdGhpcy5fc3RhcnRUZXh0ID0gbnVsbDtcbiAgICB0aGlzLl9mYWxsYmFja1RleHQgPSBudWxsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCB0ZXh0IG9mIGlucHV0LlxuICAgKlxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuICBnZXRUZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCd2YWx1ZScgaW4gdGhpcy5fcm9vdCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3Jvb3QudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9yb290W2dldFRleHRDb250ZW50QWNjZXNzb3IoKV07XG4gIH0sXG5cbiAgLyoqXG4gICAqIERldGVybWluZSB0aGUgZGlmZmVyaW5nIHN1YnN0cmluZyBiZXR3ZWVuIHRoZSBpbml0aWFsbHkgc3RvcmVkXG4gICAqIHRleHQgY29udGVudCBhbmQgdGhlIGN1cnJlbnQgY29udGVudC5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cbiAgZ2V0RGF0YTogZnVuY3Rpb24gKCkge1xuICAgIGlmICh0aGlzLl9mYWxsYmFja1RleHQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9mYWxsYmFja1RleHQ7XG4gICAgfVxuXG4gICAgdmFyIHN0YXJ0O1xuICAgIHZhciBzdGFydFZhbHVlID0gdGhpcy5fc3RhcnRUZXh0O1xuICAgIHZhciBzdGFydExlbmd0aCA9IHN0YXJ0VmFsdWUubGVuZ3RoO1xuICAgIHZhciBlbmQ7XG4gICAgdmFyIGVuZFZhbHVlID0gdGhpcy5nZXRUZXh0KCk7XG4gICAgdmFyIGVuZExlbmd0aCA9IGVuZFZhbHVlLmxlbmd0aDtcblxuICAgIGZvciAoc3RhcnQgPSAwOyBzdGFydCA8IHN0YXJ0TGVuZ3RoOyBzdGFydCsrKSB7XG4gICAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydF0gIT09IGVuZFZhbHVlW3N0YXJ0XSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbWluRW5kID0gc3RhcnRMZW5ndGggLSBzdGFydDtcbiAgICBmb3IgKGVuZCA9IDE7IGVuZCA8PSBtaW5FbmQ7IGVuZCsrKSB7XG4gICAgICBpZiAoc3RhcnRWYWx1ZVtzdGFydExlbmd0aCAtIGVuZF0gIT09IGVuZFZhbHVlW2VuZExlbmd0aCAtIGVuZF0pIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNsaWNlVGFpbCA9IGVuZCA+IDEgPyAxIC0gZW5kIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuX2ZhbGxiYWNrVGV4dCA9IGVuZFZhbHVlLnNsaWNlKHN0YXJ0LCBzbGljZVRhaWwpO1xuICAgIHJldHVybiB0aGlzLl9mYWxsYmFja1RleHQ7XG4gIH1cbn0pO1xuXG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oRmFsbGJhY2tDb21wb3NpdGlvblN0YXRlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBGYWxsYmFja0NvbXBvc2l0aW9uU3RhdGU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIERPTVByb3BlcnR5ID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eScpO1xuXG52YXIgTVVTVF9VU0VfUFJPUEVSVFkgPSBET01Qcm9wZXJ0eS5pbmplY3Rpb24uTVVTVF9VU0VfUFJPUEVSVFk7XG52YXIgSEFTX0JPT0xFQU5fVkFMVUUgPSBET01Qcm9wZXJ0eS5pbmplY3Rpb24uSEFTX0JPT0xFQU5fVkFMVUU7XG52YXIgSEFTX05VTUVSSUNfVkFMVUUgPSBET01Qcm9wZXJ0eS5pbmplY3Rpb24uSEFTX05VTUVSSUNfVkFMVUU7XG52YXIgSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUgPSBET01Qcm9wZXJ0eS5pbmplY3Rpb24uSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUU7XG52YXIgSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRSA9IERPTVByb3BlcnR5LmluamVjdGlvbi5IQVNfT1ZFUkxPQURFRF9CT09MRUFOX1ZBTFVFO1xuXG52YXIgSFRNTERPTVByb3BlcnR5Q29uZmlnID0ge1xuICBpc0N1c3RvbUF0dHJpYnV0ZTogUmVnRXhwLnByb3RvdHlwZS50ZXN0LmJpbmQobmV3IFJlZ0V4cCgnXihkYXRhfGFyaWEpLVsnICsgRE9NUHJvcGVydHkuQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKSksXG4gIFByb3BlcnRpZXM6IHtcbiAgICAvKipcbiAgICAgKiBTdGFuZGFyZCBQcm9wZXJ0aWVzXG4gICAgICovXG4gICAgYWNjZXB0OiAwLFxuICAgIGFjY2VwdENoYXJzZXQ6IDAsXG4gICAgYWNjZXNzS2V5OiAwLFxuICAgIGFjdGlvbjogMCxcbiAgICBhbGxvd0Z1bGxTY3JlZW46IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGFsbG93VHJhbnNwYXJlbmN5OiAwLFxuICAgIGFsdDogMCxcbiAgICAvLyBzcGVjaWZpZXMgdGFyZ2V0IGNvbnRleHQgZm9yIGxpbmtzIHdpdGggYHByZWxvYWRgIHR5cGVcbiAgICBhczogMCxcbiAgICBhc3luYzogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgYXV0b0NvbXBsZXRlOiAwLFxuICAgIC8vIGF1dG9Gb2N1cyBpcyBwb2x5ZmlsbGVkL25vcm1hbGl6ZWQgYnkgQXV0b0ZvY3VzVXRpbHNcbiAgICAvLyBhdXRvRm9jdXM6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGF1dG9QbGF5OiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBjYXB0dXJlOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBjZWxsUGFkZGluZzogMCxcbiAgICBjZWxsU3BhY2luZzogMCxcbiAgICBjaGFyU2V0OiAwLFxuICAgIGNoYWxsZW5nZTogMCxcbiAgICBjaGVja2VkOiBNVVNUX1VTRV9QUk9QRVJUWSB8IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGNpdGU6IDAsXG4gICAgY2xhc3NJRDogMCxcbiAgICBjbGFzc05hbWU6IDAsXG4gICAgY29sczogSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUsXG4gICAgY29sU3BhbjogMCxcbiAgICBjb250ZW50OiAwLFxuICAgIGNvbnRlbnRFZGl0YWJsZTogMCxcbiAgICBjb250ZXh0TWVudTogMCxcbiAgICBjb250cm9sczogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgY29vcmRzOiAwLFxuICAgIGNyb3NzT3JpZ2luOiAwLFxuICAgIGRhdGE6IDAsIC8vIEZvciBgPG9iamVjdCAvPmAgYWN0cyBhcyBgc3JjYC5cbiAgICBkYXRlVGltZTogMCxcbiAgICAnZGVmYXVsdCc6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGRlZmVyOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBkaXI6IDAsXG4gICAgZGlzYWJsZWQ6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGRvd25sb2FkOiBIQVNfT1ZFUkxPQURFRF9CT09MRUFOX1ZBTFVFLFxuICAgIGRyYWdnYWJsZTogMCxcbiAgICBlbmNUeXBlOiAwLFxuICAgIGZvcm06IDAsXG4gICAgZm9ybUFjdGlvbjogMCxcbiAgICBmb3JtRW5jVHlwZTogMCxcbiAgICBmb3JtTWV0aG9kOiAwLFxuICAgIGZvcm1Ob1ZhbGlkYXRlOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBmb3JtVGFyZ2V0OiAwLFxuICAgIGZyYW1lQm9yZGVyOiAwLFxuICAgIGhlYWRlcnM6IDAsXG4gICAgaGVpZ2h0OiAwLFxuICAgIGhpZGRlbjogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgaGlnaDogMCxcbiAgICBocmVmOiAwLFxuICAgIGhyZWZMYW5nOiAwLFxuICAgIGh0bWxGb3I6IDAsXG4gICAgaHR0cEVxdWl2OiAwLFxuICAgIGljb246IDAsXG4gICAgaWQ6IDAsXG4gICAgaW5wdXRNb2RlOiAwLFxuICAgIGludGVncml0eTogMCxcbiAgICBpczogMCxcbiAgICBrZXlQYXJhbXM6IDAsXG4gICAga2V5VHlwZTogMCxcbiAgICBraW5kOiAwLFxuICAgIGxhYmVsOiAwLFxuICAgIGxhbmc6IDAsXG4gICAgbGlzdDogMCxcbiAgICBsb29wOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBsb3c6IDAsXG4gICAgbWFuaWZlc3Q6IDAsXG4gICAgbWFyZ2luSGVpZ2h0OiAwLFxuICAgIG1hcmdpbldpZHRoOiAwLFxuICAgIG1heDogMCxcbiAgICBtYXhMZW5ndGg6IDAsXG4gICAgbWVkaWE6IDAsXG4gICAgbWVkaWFHcm91cDogMCxcbiAgICBtZXRob2Q6IDAsXG4gICAgbWluOiAwLFxuICAgIG1pbkxlbmd0aDogMCxcbiAgICAvLyBDYXV0aW9uOyBgb3B0aW9uLnNlbGVjdGVkYCBpcyBub3QgdXBkYXRlZCBpZiBgc2VsZWN0Lm11bHRpcGxlYCBpc1xuICAgIC8vIGRpc2FibGVkIHdpdGggYHJlbW92ZUF0dHJpYnV0ZWAuXG4gICAgbXVsdGlwbGU6IE1VU1RfVVNFX1BST1BFUlRZIHwgSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgbXV0ZWQ6IE1VU1RfVVNFX1BST1BFUlRZIHwgSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgbmFtZTogMCxcbiAgICBub25jZTogMCxcbiAgICBub1ZhbGlkYXRlOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBvcGVuOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBvcHRpbXVtOiAwLFxuICAgIHBhdHRlcm46IDAsXG4gICAgcGxhY2Vob2xkZXI6IDAsXG4gICAgcGxheXNJbmxpbmU6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIHBvc3RlcjogMCxcbiAgICBwcmVsb2FkOiAwLFxuICAgIHByb2ZpbGU6IDAsXG4gICAgcmFkaW9Hcm91cDogMCxcbiAgICByZWFkT25seTogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgcmVmZXJyZXJQb2xpY3k6IDAsXG4gICAgcmVsOiAwLFxuICAgIHJlcXVpcmVkOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICByZXZlcnNlZDogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgcm9sZTogMCxcbiAgICByb3dzOiBIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSxcbiAgICByb3dTcGFuOiBIQVNfTlVNRVJJQ19WQUxVRSxcbiAgICBzYW5kYm94OiAwLFxuICAgIHNjb3BlOiAwLFxuICAgIHNjb3BlZDogSEFTX0JPT0xFQU5fVkFMVUUsXG4gICAgc2Nyb2xsaW5nOiAwLFxuICAgIHNlYW1sZXNzOiBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBzZWxlY3RlZDogTVVTVF9VU0VfUFJPUEVSVFkgfCBIQVNfQk9PTEVBTl9WQUxVRSxcbiAgICBzaGFwZTogMCxcbiAgICBzaXplOiBIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSxcbiAgICBzaXplczogMCxcbiAgICBzcGFuOiBIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSxcbiAgICBzcGVsbENoZWNrOiAwLFxuICAgIHNyYzogMCxcbiAgICBzcmNEb2M6IDAsXG4gICAgc3JjTGFuZzogMCxcbiAgICBzcmNTZXQ6IDAsXG4gICAgc3RhcnQ6IEhBU19OVU1FUklDX1ZBTFVFLFxuICAgIHN0ZXA6IDAsXG4gICAgc3R5bGU6IDAsXG4gICAgc3VtbWFyeTogMCxcbiAgICB0YWJJbmRleDogMCxcbiAgICB0YXJnZXQ6IDAsXG4gICAgdGl0bGU6IDAsXG4gICAgLy8gU2V0dGluZyAudHlwZSB0aHJvd3Mgb24gbm9uLTxpbnB1dD4gdGFnc1xuICAgIHR5cGU6IDAsXG4gICAgdXNlTWFwOiAwLFxuICAgIHZhbHVlOiAwLFxuICAgIHdpZHRoOiAwLFxuICAgIHdtb2RlOiAwLFxuICAgIHdyYXA6IDAsXG5cbiAgICAvKipcbiAgICAgKiBSREZhIFByb3BlcnRpZXNcbiAgICAgKi9cbiAgICBhYm91dDogMCxcbiAgICBkYXRhdHlwZTogMCxcbiAgICBpbmxpc3Q6IDAsXG4gICAgcHJlZml4OiAwLFxuICAgIC8vIHByb3BlcnR5IGlzIGFsc28gc3VwcG9ydGVkIGZvciBPcGVuR3JhcGggaW4gbWV0YSB0YWdzLlxuICAgIHByb3BlcnR5OiAwLFxuICAgIHJlc291cmNlOiAwLFxuICAgICd0eXBlb2YnOiAwLFxuICAgIHZvY2FiOiAwLFxuXG4gICAgLyoqXG4gICAgICogTm9uLXN0YW5kYXJkIFByb3BlcnRpZXNcbiAgICAgKi9cbiAgICAvLyBhdXRvQ2FwaXRhbGl6ZSBhbmQgYXV0b0NvcnJlY3QgYXJlIHN1cHBvcnRlZCBpbiBNb2JpbGUgU2FmYXJpIGZvclxuICAgIC8vIGtleWJvYXJkIGhpbnRzLlxuICAgIGF1dG9DYXBpdGFsaXplOiAwLFxuICAgIGF1dG9Db3JyZWN0OiAwLFxuICAgIC8vIGF1dG9TYXZlIGFsbG93cyBXZWJLaXQvQmxpbmsgdG8gcGVyc2lzdCB2YWx1ZXMgb2YgaW5wdXQgZmllbGRzIG9uIHBhZ2UgcmVsb2Fkc1xuICAgIGF1dG9TYXZlOiAwLFxuICAgIC8vIGNvbG9yIGlzIGZvciBTYWZhcmkgbWFzay1pY29uIGxpbmtcbiAgICBjb2xvcjogMCxcbiAgICAvLyBpdGVtUHJvcCwgaXRlbVNjb3BlLCBpdGVtVHlwZSBhcmUgZm9yXG4gICAgLy8gTWljcm9kYXRhIHN1cHBvcnQuIFNlZSBodHRwOi8vc2NoZW1hLm9yZy9kb2NzL2dzLmh0bWxcbiAgICBpdGVtUHJvcDogMCxcbiAgICBpdGVtU2NvcGU6IEhBU19CT09MRUFOX1ZBTFVFLFxuICAgIGl0ZW1UeXBlOiAwLFxuICAgIC8vIGl0ZW1JRCBhbmQgaXRlbVJlZiBhcmUgZm9yIE1pY3JvZGF0YSBzdXBwb3J0IGFzIHdlbGwgYnV0XG4gICAgLy8gb25seSBzcGVjaWZpZWQgaW4gdGhlIFdIQVRXRyBzcGVjIGRvY3VtZW50LiBTZWVcbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9taWNyb2RhdGEuaHRtbCNtaWNyb2RhdGEtZG9tLWFwaVxuICAgIGl0ZW1JRDogMCxcbiAgICBpdGVtUmVmOiAwLFxuICAgIC8vIHJlc3VsdHMgc2hvdyBsb29raW5nIGdsYXNzIGljb24gYW5kIHJlY2VudCBzZWFyY2hlcyBvbiBpbnB1dFxuICAgIC8vIHNlYXJjaCBmaWVsZHMgaW4gV2ViS2l0L0JsaW5rXG4gICAgcmVzdWx0czogMCxcbiAgICAvLyBJRS1vbmx5IGF0dHJpYnV0ZSB0aGF0IHNwZWNpZmllcyBzZWN1cml0eSByZXN0cmljdGlvbnMgb24gYW4gaWZyYW1lXG4gICAgLy8gYXMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIHNhbmRib3ggYXR0cmlidXRlIG9uIElFPDEwXG4gICAgc2VjdXJpdHk6IDAsXG4gICAgLy8gSUUtb25seSBhdHRyaWJ1dGUgdGhhdCBjb250cm9scyBmb2N1cyBiZWhhdmlvclxuICAgIHVuc2VsZWN0YWJsZTogMFxuICB9LFxuICBET01BdHRyaWJ1dGVOYW1lczoge1xuICAgIGFjY2VwdENoYXJzZXQ6ICdhY2NlcHQtY2hhcnNldCcsXG4gICAgY2xhc3NOYW1lOiAnY2xhc3MnLFxuICAgIGh0bWxGb3I6ICdmb3InLFxuICAgIGh0dHBFcXVpdjogJ2h0dHAtZXF1aXYnXG4gIH0sXG4gIERPTVByb3BlcnR5TmFtZXM6IHt9LFxuICBET01NdXRhdGlvbk1ldGhvZHM6IHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKG5vZGUsIHZhbHVlKSB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIE51bWJlciBpbnB1dHMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50IGR1ZSB0byBzb21lIGVkZ2UgY2FzZXMgaW5cbiAgICAgIC8vIENocm9tZS4gTGV0IGV2ZXJ5dGhpbmcgZWxzZSBhc3NpZ24gdGhlIHZhbHVlIGF0dHJpYnV0ZSBhcyBub3JtYWwuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNTMjaXNzdWVjb21tZW50LTIzNjA3NDMyNlxuICAgICAgaWYgKG5vZGUudHlwZSAhPT0gJ251bWJlcicgfHwgbm9kZS5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykgPT09IGZhbHNlKSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCd2YWx1ZScsICcnICsgdmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChub2RlLnZhbGlkaXR5ICYmICFub2RlLnZhbGlkaXR5LmJhZElucHV0ICYmIG5vZGUub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSBub2RlKSB7XG4gICAgICAgIC8vIERvbid0IGFzc2lnbiBhbiBhdHRyaWJ1dGUgaWYgdmFsaWRhdGlvbiByZXBvcnRzIGJhZFxuICAgICAgICAvLyBpbnB1dC4gQ2hyb21lIHdpbGwgY2xlYXIgdGhlIHZhbHVlLiBBZGRpdGlvbmFsbHksIGRvbid0XG4gICAgICAgIC8vIG9wZXJhdGUgb24gaW5wdXRzIHRoYXQgaGF2ZSBmb2N1cywgb3RoZXJ3aXNlIENocm9tZSBtaWdodFxuICAgICAgICAvLyBzdHJpcCBvZmYgdHJhaWxpbmcgZGVjaW1hbCBwbGFjZXMgYW5kIGNhdXNlIHRoZSB1c2VyJ3NcbiAgICAgICAgLy8gY3Vyc29yIHBvc2l0aW9uIHRvIGp1bXAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIEluIFJlYWN0RE9NSW5wdXQsIHdlIGhhdmUgYW4gb25CbHVyIGV2ZW50IHRoYXQgd2lsbCB0cmlnZ2VyXG4gICAgICAgIC8vIHRoaXMgZnVuY3Rpb24gYWdhaW4gd2hlbiBmb2N1cyBpcyBsb3N0LlxuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgndmFsdWUnLCAnJyArIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gSFRNTERPTVByb3BlcnR5Q29uZmlnOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBFc2NhcGUgYW5kIHdyYXAga2V5IHNvIGl0IGlzIHNhZmUgdG8gdXNlIGFzIGEgcmVhY3RpZFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdG8gYmUgZXNjYXBlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGVzY2FwZWQga2V5LlxuICovXG5cbmZ1bmN0aW9uIGVzY2FwZShrZXkpIHtcbiAgdmFyIGVzY2FwZVJlZ2V4ID0gL1s9Ol0vZztcbiAgdmFyIGVzY2FwZXJMb29rdXAgPSB7XG4gICAgJz0nOiAnPTAnLFxuICAgICc6JzogJz0yJ1xuICB9O1xuICB2YXIgZXNjYXBlZFN0cmluZyA9ICgnJyArIGtleSkucmVwbGFjZShlc2NhcGVSZWdleCwgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgcmV0dXJuIGVzY2FwZXJMb29rdXBbbWF0Y2hdO1xuICB9KTtcblxuICByZXR1cm4gJyQnICsgZXNjYXBlZFN0cmluZztcbn1cblxuLyoqXG4gKiBVbmVzY2FwZSBhbmQgdW53cmFwIGtleSBmb3IgaHVtYW4tcmVhZGFibGUgZGlzcGxheVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgdG8gdW5lc2NhcGUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSB1bmVzY2FwZWQga2V5LlxuICovXG5mdW5jdGlvbiB1bmVzY2FwZShrZXkpIHtcbiAgdmFyIHVuZXNjYXBlUmVnZXggPSAvKD0wfD0yKS9nO1xuICB2YXIgdW5lc2NhcGVyTG9va3VwID0ge1xuICAgICc9MCc6ICc9JyxcbiAgICAnPTInOiAnOidcbiAgfTtcbiAgdmFyIGtleVN1YnN0cmluZyA9IGtleVswXSA9PT0gJy4nICYmIGtleVsxXSA9PT0gJyQnID8ga2V5LnN1YnN0cmluZygyKSA6IGtleS5zdWJzdHJpbmcoMSk7XG5cbiAgcmV0dXJuICgnJyArIGtleVN1YnN0cmluZykucmVwbGFjZSh1bmVzY2FwZVJlZ2V4LCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICByZXR1cm4gdW5lc2NhcGVyTG9va3VwW21hdGNoXTtcbiAgfSk7XG59XG5cbnZhciBLZXlFc2NhcGVVdGlscyA9IHtcbiAgZXNjYXBlOiBlc2NhcGUsXG4gIHVuZXNjYXBlOiB1bmVzY2FwZVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBLZXlFc2NhcGVVdGlsczsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG52YXIgcHJvcFR5cGVzRmFjdG9yeSA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMvZmFjdG9yeScpO1xuXG52YXIgUmVhY3QgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3QnKTtcbnZhciBQcm9wVHlwZXMgPSBwcm9wVHlwZXNGYWN0b3J5KFJlYWN0LmlzVmFsaWRFbGVtZW50KTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBoYXNSZWFkT25seVZhbHVlID0ge1xuICAnYnV0dG9uJzogdHJ1ZSxcbiAgJ2NoZWNrYm94JzogdHJ1ZSxcbiAgJ2ltYWdlJzogdHJ1ZSxcbiAgJ2hpZGRlbic6IHRydWUsXG4gICdyYWRpbyc6IHRydWUsXG4gICdyZXNldCc6IHRydWUsXG4gICdzdWJtaXQnOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBfYXNzZXJ0U2luZ2xlTGluayhpbnB1dFByb3BzKSB7XG4gICEoaW5wdXRQcm9wcy5jaGVja2VkTGluayA9PSBudWxsIHx8IGlucHV0UHJvcHMudmFsdWVMaW5rID09IG51bGwpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW5ub3QgcHJvdmlkZSBhIGNoZWNrZWRMaW5rIGFuZCBhIHZhbHVlTGluay4gSWYgeW91IHdhbnQgdG8gdXNlIGNoZWNrZWRMaW5rLCB5b3UgcHJvYmFibHkgZG9uXFwndCB3YW50IHRvIHVzZSB2YWx1ZUxpbmsgYW5kIHZpY2UgdmVyc2EuJykgOiBfcHJvZEludmFyaWFudCgnODcnKSA6IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIF9hc3NlcnRWYWx1ZUxpbmsoaW5wdXRQcm9wcykge1xuICBfYXNzZXJ0U2luZ2xlTGluayhpbnB1dFByb3BzKTtcbiAgIShpbnB1dFByb3BzLnZhbHVlID09IG51bGwgJiYgaW5wdXRQcm9wcy5vbkNoYW5nZSA9PSBudWxsKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnQ2Fubm90IHByb3ZpZGUgYSB2YWx1ZUxpbmsgYW5kIGEgdmFsdWUgb3Igb25DaGFuZ2UgZXZlbnQuIElmIHlvdSB3YW50IHRvIHVzZSB2YWx1ZSBvciBvbkNoYW5nZSwgeW91IHByb2JhYmx5IGRvblxcJ3Qgd2FudCB0byB1c2UgdmFsdWVMaW5rLicpIDogX3Byb2RJbnZhcmlhbnQoJzg4JykgOiB2b2lkIDA7XG59XG5cbmZ1bmN0aW9uIF9hc3NlcnRDaGVja2VkTGluayhpbnB1dFByb3BzKSB7XG4gIF9hc3NlcnRTaW5nbGVMaW5rKGlucHV0UHJvcHMpO1xuICAhKGlucHV0UHJvcHMuY2hlY2tlZCA9PSBudWxsICYmIGlucHV0UHJvcHMub25DaGFuZ2UgPT0gbnVsbCkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0Nhbm5vdCBwcm92aWRlIGEgY2hlY2tlZExpbmsgYW5kIGEgY2hlY2tlZCBwcm9wZXJ0eSBvciBvbkNoYW5nZSBldmVudC4gSWYgeW91IHdhbnQgdG8gdXNlIGNoZWNrZWQgb3Igb25DaGFuZ2UsIHlvdSBwcm9iYWJseSBkb25cXCd0IHdhbnQgdG8gdXNlIGNoZWNrZWRMaW5rJykgOiBfcHJvZEludmFyaWFudCgnODknKSA6IHZvaWQgMDtcbn1cblxudmFyIHByb3BUeXBlcyA9IHtcbiAgdmFsdWU6IGZ1bmN0aW9uIChwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUpIHtcbiAgICBpZiAoIXByb3BzW3Byb3BOYW1lXSB8fCBoYXNSZWFkT25seVZhbHVlW3Byb3BzLnR5cGVdIHx8IHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBFcnJvcignWW91IHByb3ZpZGVkIGEgYHZhbHVlYCBwcm9wIHRvIGEgZm9ybSBmaWVsZCB3aXRob3V0IGFuICcgKyAnYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiAnICsgJ3RoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRWYWx1ZWAuIE90aGVyd2lzZSwgJyArICdzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4nKTtcbiAgfSxcbiAgY2hlY2tlZDogZnVuY3Rpb24gKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSkge1xuICAgIGlmICghcHJvcHNbcHJvcE5hbWVdIHx8IHByb3BzLm9uQ2hhbmdlIHx8IHByb3BzLnJlYWRPbmx5IHx8IHByb3BzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBFcnJvcignWW91IHByb3ZpZGVkIGEgYGNoZWNrZWRgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gJyArICdgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmICcgKyAndGhlIGZpZWxkIHNob3VsZCBiZSBtdXRhYmxlIHVzZSBgZGVmYXVsdENoZWNrZWRgLiBPdGhlcndpc2UsICcgKyAnc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuJyk7XG4gIH0sXG4gIG9uQ2hhbmdlOiBQcm9wVHlwZXMuZnVuY1xufTtcblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKG93bmVyKSB7XG4gIGlmIChvd25lcikge1xuICAgIHZhciBuYW1lID0gb3duZXIuZ2V0TmFtZSgpO1xuICAgIGlmIChuYW1lKSB7XG4gICAgICByZXR1cm4gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgIH1cbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogUHJvdmlkZSBhIGxpbmtlZCBgdmFsdWVgIGF0dHJpYnV0ZSBmb3IgY29udHJvbGxlZCBmb3Jtcy4gWW91IHNob3VsZCBub3QgdXNlXG4gKiB0aGlzIG91dHNpZGUgb2YgdGhlIFJlYWN0RE9NIGNvbnRyb2xsZWQgZm9ybSBjb21wb25lbnRzLlxuICovXG52YXIgTGlua2VkVmFsdWVVdGlscyA9IHtcbiAgY2hlY2tQcm9wVHlwZXM6IGZ1bmN0aW9uICh0YWdOYW1lLCBwcm9wcywgb3duZXIpIHtcbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBwcm9wVHlwZXMpIHtcbiAgICAgIGlmIChwcm9wVHlwZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIHZhciBlcnJvciA9IHByb3BUeXBlc1twcm9wTmFtZV0ocHJvcHMsIHByb3BOYW1lLCB0YWdOYW1lLCAncHJvcCcsIG51bGwsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IubWVzc2FnZV0gPSB0cnVlO1xuXG4gICAgICAgIHZhciBhZGRlbmR1bSA9IGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShvd25lcik7XG4gICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ZhaWxlZCBmb3JtIHByb3BUeXBlOiAlcyVzJywgZXJyb3IubWVzc2FnZSwgYWRkZW5kdW0pIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGlucHV0UHJvcHMgUHJvcHMgZm9yIGZvcm0gY29tcG9uZW50XG4gICAqIEByZXR1cm4geyp9IGN1cnJlbnQgdmFsdWUgb2YgdGhlIGlucHV0IGVpdGhlciBmcm9tIHZhbHVlIHByb3Agb3IgbGluay5cbiAgICovXG4gIGdldFZhbHVlOiBmdW5jdGlvbiAoaW5wdXRQcm9wcykge1xuICAgIGlmIChpbnB1dFByb3BzLnZhbHVlTGluaykge1xuICAgICAgX2Fzc2VydFZhbHVlTGluayhpbnB1dFByb3BzKTtcbiAgICAgIHJldHVybiBpbnB1dFByb3BzLnZhbHVlTGluay52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0UHJvcHMudmFsdWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBpbnB1dFByb3BzIFByb3BzIGZvciBmb3JtIGNvbXBvbmVudFxuICAgKiBAcmV0dXJuIHsqfSBjdXJyZW50IGNoZWNrZWQgc3RhdHVzIG9mIHRoZSBpbnB1dCBlaXRoZXIgZnJvbSBjaGVja2VkIHByb3BcbiAgICogICAgICAgICAgICAgb3IgbGluay5cbiAgICovXG4gIGdldENoZWNrZWQ6IGZ1bmN0aW9uIChpbnB1dFByb3BzKSB7XG4gICAgaWYgKGlucHV0UHJvcHMuY2hlY2tlZExpbmspIHtcbiAgICAgIF9hc3NlcnRDaGVja2VkTGluayhpbnB1dFByb3BzKTtcbiAgICAgIHJldHVybiBpbnB1dFByb3BzLmNoZWNrZWRMaW5rLnZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRQcm9wcy5jaGVja2VkO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gaW5wdXRQcm9wcyBQcm9wcyBmb3IgZm9ybSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtTeW50aGV0aWNFdmVudH0gZXZlbnQgY2hhbmdlIGV2ZW50IHRvIGhhbmRsZVxuICAgKi9cbiAgZXhlY3V0ZU9uQ2hhbmdlOiBmdW5jdGlvbiAoaW5wdXRQcm9wcywgZXZlbnQpIHtcbiAgICBpZiAoaW5wdXRQcm9wcy52YWx1ZUxpbmspIHtcbiAgICAgIF9hc3NlcnRWYWx1ZUxpbmsoaW5wdXRQcm9wcyk7XG4gICAgICByZXR1cm4gaW5wdXRQcm9wcy52YWx1ZUxpbmsucmVxdWVzdENoYW5nZShldmVudC50YXJnZXQudmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoaW5wdXRQcm9wcy5jaGVja2VkTGluaykge1xuICAgICAgX2Fzc2VydENoZWNrZWRMaW5rKGlucHV0UHJvcHMpO1xuICAgICAgcmV0dXJuIGlucHV0UHJvcHMuY2hlY2tlZExpbmsucmVxdWVzdENoYW5nZShldmVudC50YXJnZXQuY2hlY2tlZCk7XG4gICAgfSBlbHNlIGlmIChpbnB1dFByb3BzLm9uQ2hhbmdlKSB7XG4gICAgICByZXR1cm4gaW5wdXRQcm9wcy5vbkNoYW5nZS5jYWxsKHVuZGVmaW5lZCwgZXZlbnQpO1xuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBMaW5rZWRWYWx1ZVV0aWxzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIFN0YXRpYyBwb29sZXJzLiBTZXZlcmFsIGN1c3RvbSB2ZXJzaW9ucyBmb3IgZWFjaCBwb3RlbnRpYWwgbnVtYmVyIG9mXG4gKiBhcmd1bWVudHMuIEEgY29tcGxldGVseSBnZW5lcmljIHBvb2xlciBpcyBlYXN5IHRvIGltcGxlbWVudCwgYnV0IHdvdWxkXG4gKiByZXF1aXJlIGFjY2Vzc2luZyB0aGUgYGFyZ3VtZW50c2Agb2JqZWN0LiBJbiBlYWNoIG9mIHRoZXNlLCBgdGhpc2AgcmVmZXJzIHRvXG4gKiB0aGUgQ2xhc3MgaXRzZWxmLCBub3QgYW4gaW5zdGFuY2UuIElmIGFueSBvdGhlcnMgYXJlIG5lZWRlZCwgc2ltcGx5IGFkZCB0aGVtXG4gKiBoZXJlLCBvciBpbiB0aGVpciBvd24gZmlsZXMuXG4gKi9cbnZhciBvbmVBcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChjb3B5RmllbGRzRnJvbSkge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCkge1xuICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNlUG9vbC5wb3AoKTtcbiAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBjb3B5RmllbGRzRnJvbSk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgS2xhc3MoY29weUZpZWxkc0Zyb20pO1xuICB9XG59O1xuXG52YXIgdHdvQXJndW1lbnRQb29sZXIgPSBmdW5jdGlvbiAoYTEsIGEyKSB7XG4gIHZhciBLbGFzcyA9IHRoaXM7XG4gIGlmIChLbGFzcy5pbnN0YW5jZVBvb2wubGVuZ3RoKSB7XG4gICAgdmFyIGluc3RhbmNlID0gS2xhc3MuaW5zdGFuY2VQb29sLnBvcCgpO1xuICAgIEtsYXNzLmNhbGwoaW5zdGFuY2UsIGExLCBhMik7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgS2xhc3MoYTEsIGEyKTtcbiAgfVxufTtcblxudmFyIHRocmVlQXJndW1lbnRQb29sZXIgPSBmdW5jdGlvbiAoYTEsIGEyLCBhMykge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCkge1xuICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNlUG9vbC5wb3AoKTtcbiAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBhMSwgYTIsIGEzKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBLbGFzcyhhMSwgYTIsIGEzKTtcbiAgfVxufTtcblxudmFyIGZvdXJBcmd1bWVudFBvb2xlciA9IGZ1bmN0aW9uIChhMSwgYTIsIGEzLCBhNCkge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICBpZiAoS2xhc3MuaW5zdGFuY2VQb29sLmxlbmd0aCkge1xuICAgIHZhciBpbnN0YW5jZSA9IEtsYXNzLmluc3RhbmNlUG9vbC5wb3AoKTtcbiAgICBLbGFzcy5jYWxsKGluc3RhbmNlLCBhMSwgYTIsIGEzLCBhNCk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgS2xhc3MoYTEsIGEyLCBhMywgYTQpO1xuICB9XG59O1xuXG52YXIgc3RhbmRhcmRSZWxlYXNlciA9IGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICB2YXIgS2xhc3MgPSB0aGlzO1xuICAhKGluc3RhbmNlIGluc3RhbmNlb2YgS2xhc3MpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdUcnlpbmcgdG8gcmVsZWFzZSBhbiBpbnN0YW5jZSBpbnRvIGEgcG9vbCBvZiBhIGRpZmZlcmVudCB0eXBlLicpIDogX3Byb2RJbnZhcmlhbnQoJzI1JykgOiB2b2lkIDA7XG4gIGluc3RhbmNlLmRlc3RydWN0b3IoKTtcbiAgaWYgKEtsYXNzLmluc3RhbmNlUG9vbC5sZW5ndGggPCBLbGFzcy5wb29sU2l6ZSkge1xuICAgIEtsYXNzLmluc3RhbmNlUG9vbC5wdXNoKGluc3RhbmNlKTtcbiAgfVxufTtcblxudmFyIERFRkFVTFRfUE9PTF9TSVpFID0gMTA7XG52YXIgREVGQVVMVF9QT09MRVIgPSBvbmVBcmd1bWVudFBvb2xlcjtcblxuLyoqXG4gKiBBdWdtZW50cyBgQ29weUNvbnN0cnVjdG9yYCB0byBiZSBhIHBvb2xhYmxlIGNsYXNzLCBhdWdtZW50aW5nIG9ubHkgdGhlIGNsYXNzXG4gKiBpdHNlbGYgKHN0YXRpY2FsbHkpIG5vdCBhZGRpbmcgYW55IHByb3RvdHlwaWNhbCBmaWVsZHMuIEFueSBDb3B5Q29uc3RydWN0b3JcbiAqIHlvdSBnaXZlIHRoaXMgbWF5IGhhdmUgYSBgcG9vbFNpemVgIHByb3BlcnR5LCBhbmQgd2lsbCBsb29rIGZvciBhXG4gKiBwcm90b3R5cGljYWwgYGRlc3RydWN0b3JgIG9uIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBDb3B5Q29uc3RydWN0b3IgQ29uc3RydWN0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byByZXNldC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IHBvb2xlciBDdXN0b21pemFibGUgcG9vbGVyLlxuICovXG52YXIgYWRkUG9vbGluZ1RvID0gZnVuY3Rpb24gKENvcHlDb25zdHJ1Y3RvciwgcG9vbGVyKSB7XG4gIC8vIENhc3RpbmcgYXMgYW55IHNvIHRoYXQgZmxvdyBpZ25vcmVzIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gYW5kIHRydXN0c1xuICAvLyBpdCB0byBtYXRjaCB0aGUgdHlwZSB3ZSBkZWNsYXJlZFxuICB2YXIgTmV3S2xhc3MgPSBDb3B5Q29uc3RydWN0b3I7XG4gIE5ld0tsYXNzLmluc3RhbmNlUG9vbCA9IFtdO1xuICBOZXdLbGFzcy5nZXRQb29sZWQgPSBwb29sZXIgfHwgREVGQVVMVF9QT09MRVI7XG4gIGlmICghTmV3S2xhc3MucG9vbFNpemUpIHtcbiAgICBOZXdLbGFzcy5wb29sU2l6ZSA9IERFRkFVTFRfUE9PTF9TSVpFO1xuICB9XG4gIE5ld0tsYXNzLnJlbGVhc2UgPSBzdGFuZGFyZFJlbGVhc2VyO1xuICByZXR1cm4gTmV3S2xhc3M7XG59O1xuXG52YXIgUG9vbGVkQ2xhc3MgPSB7XG4gIGFkZFBvb2xpbmdUbzogYWRkUG9vbGluZ1RvLFxuICBvbmVBcmd1bWVudFBvb2xlcjogb25lQXJndW1lbnRQb29sZXIsXG4gIHR3b0FyZ3VtZW50UG9vbGVyOiB0d29Bcmd1bWVudFBvb2xlcixcbiAgdGhyZWVBcmd1bWVudFBvb2xlcjogdGhyZWVBcmd1bWVudFBvb2xlcixcbiAgZm91ckFyZ3VtZW50UG9vbGVyOiBmb3VyQXJndW1lbnRQb29sZXJcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUG9vbGVkQ2xhc3M7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBFdmVudFBsdWdpblJlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpblJlZ2lzdHJ5Jyk7XG52YXIgUmVhY3RFdmVudEVtaXR0ZXJNaXhpbiA9IHJlcXVpcmUoJy4vUmVhY3RFdmVudEVtaXR0ZXJNaXhpbicpO1xudmFyIFZpZXdwb3J0TWV0cmljcyA9IHJlcXVpcmUoJy4vVmlld3BvcnRNZXRyaWNzJyk7XG5cbnZhciBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZSA9IHJlcXVpcmUoJy4vZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUnKTtcbnZhciBpc0V2ZW50U3VwcG9ydGVkID0gcmVxdWlyZSgnLi9pc0V2ZW50U3VwcG9ydGVkJyk7XG5cbi8qKlxuICogU3VtbWFyeSBvZiBgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyYCBldmVudCBoYW5kbGluZzpcbiAqXG4gKiAgLSBUb3AtbGV2ZWwgZGVsZWdhdGlvbiBpcyB1c2VkIHRvIHRyYXAgbW9zdCBuYXRpdmUgYnJvd3NlciBldmVudHMuIFRoaXNcbiAqICAgIG1heSBvbmx5IG9jY3VyIGluIHRoZSBtYWluIHRocmVhZCBhbmQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mXG4gKiAgICBSZWFjdEV2ZW50TGlzdGVuZXIsIHdoaWNoIGlzIGluamVjdGVkIGFuZCBjYW4gdGhlcmVmb3JlIHN1cHBvcnQgcGx1Z2dhYmxlXG4gKiAgICBldmVudCBzb3VyY2VzLiBUaGlzIGlzIHRoZSBvbmx5IHdvcmsgdGhhdCBvY2N1cnMgaW4gdGhlIG1haW4gdGhyZWFkLlxuICpcbiAqICAtIFdlIG5vcm1hbGl6ZSBhbmQgZGUtZHVwbGljYXRlIGV2ZW50cyB0byBhY2NvdW50IGZvciBicm93c2VyIHF1aXJrcy4gVGhpc1xuICogICAgbWF5IGJlIGRvbmUgaW4gdGhlIHdvcmtlciB0aHJlYWQuXG4gKlxuICogIC0gRm9yd2FyZCB0aGVzZSBuYXRpdmUgZXZlbnRzICh3aXRoIHRoZSBhc3NvY2lhdGVkIHRvcC1sZXZlbCB0eXBlIHVzZWQgdG9cbiAqICAgIHRyYXAgaXQpIHRvIGBFdmVudFBsdWdpbkh1YmAsIHdoaWNoIGluIHR1cm4gd2lsbCBhc2sgcGx1Z2lucyBpZiB0aGV5IHdhbnRcbiAqICAgIHRvIGV4dHJhY3QgYW55IHN5bnRoZXRpYyBldmVudHMuXG4gKlxuICogIC0gVGhlIGBFdmVudFBsdWdpbkh1YmAgd2lsbCB0aGVuIHByb2Nlc3MgZWFjaCBldmVudCBieSBhbm5vdGF0aW5nIHRoZW0gd2l0aFxuICogICAgXCJkaXNwYXRjaGVzXCIsIGEgc2VxdWVuY2Ugb2YgbGlzdGVuZXJzIGFuZCBJRHMgdGhhdCBjYXJlIGFib3V0IHRoYXQgZXZlbnQuXG4gKlxuICogIC0gVGhlIGBFdmVudFBsdWdpbkh1YmAgdGhlbiBkaXNwYXRjaGVzIHRoZSBldmVudHMuXG4gKlxuICogT3ZlcnZpZXcgb2YgUmVhY3QgYW5kIHRoZSBldmVudCBzeXN0ZW06XG4gKlxuICogKy0tLS0tLS0tLS0tLSsgICAgLlxuICogfCAgICBET00gICAgIHwgICAgLlxuICogKy0tLS0tLS0tLS0tLSsgICAgLlxuICogICAgICAgfCAgICAgICAgICAgLlxuICogICAgICAgdiAgICAgICAgICAgLlxuICogKy0tLS0tLS0tLS0tLSsgICAgLlxuICogfCBSZWFjdEV2ZW50IHwgICAgLlxuICogfCAgTGlzdGVuZXIgIHwgICAgLlxuICogKy0tLS0tLS0tLS0tLSsgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0rXG4gKiAgICAgICB8ICAgICAgICAgICAuICAgICAgICAgICAgICAgKy0tLS0tLS0tK3xTaW1wbGVFdmVudHxcbiAqICAgICAgIHwgICAgICAgICAgIC4gICAgICAgICAgICAgICB8ICAgICAgICAgfFBsdWdpbiAgICAgfFxuICogKy0tLS0tfC0tLS0tLSsgICAgLiAgICAgICAgICAgICAgIHYgICAgICAgICArLS0tLS0tLS0tLS0rXG4gKiB8ICAgICB8ICAgICAgfCAgICAuICAgICstLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0rXG4gKiB8ICAgICArLS0tLS0tLS0tLS0uLS0tPnxFdmVudFBsdWdpbkh1YnwgICAgICAgICAgICAgICAgICAgIHwgICAgRXZlbnQgICB8XG4gKiB8ICAgICAgICAgICAgfCAgICAuICAgIHwgICAgICAgICAgICAgIHwgICAgICstLS0tLS0tLS0tLSsgIHwgUHJvcGFnYXRvcnN8XG4gKiB8IFJlYWN0RXZlbnQgfCAgICAuICAgIHwgICAgICAgICAgICAgIHwgICAgIHxUYXBFdmVudCAgIHwgIHwtLS0tLS0tLS0tLS18XG4gKiB8ICBFbWl0dGVyICAgfCAgICAuICAgIHwgICAgICAgICAgICAgIHw8LS0tK3xQbHVnaW4gICAgIHwgIHxvdGhlciBwbHVnaW58XG4gKiB8ICAgICAgICAgICAgfCAgICAuICAgIHwgICAgICAgICAgICAgIHwgICAgICstLS0tLS0tLS0tLSsgIHwgIHV0aWxpdGllcyB8XG4gKiB8ICAgICArLS0tLS0tLS0tLS0uLS0tPnwgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0rXG4gKiB8ICAgICB8ICAgICAgfCAgICAuICAgICstLS0tLS0tLS0tLS0tLStcbiAqICstLS0tLXwtLS0tLS0rICAgIC4gICAgICAgICAgICAgICAgXiAgICAgICAgKy0tLS0tLS0tLS0tK1xuICogICAgICAgfCAgICAgICAgICAgLiAgICAgICAgICAgICAgICB8ICAgICAgICB8RW50ZXIvTGVhdmV8XG4gKiAgICAgICArICAgICAgICAgICAuICAgICAgICAgICAgICAgICstLS0tLS0tK3xQbHVnaW4gICAgIHxcbiAqICstLS0tLS0tLS0tLS0tKyAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tK1xuICogfCBhcHBsaWNhdGlvbiB8ICAgLlxuICogfC0tLS0tLS0tLS0tLS18ICAgLlxuICogfCAgICAgICAgICAgICB8ICAgLlxuICogfCAgICAgICAgICAgICB8ICAgLlxuICogKy0tLS0tLS0tLS0tLS0rICAgLlxuICogICAgICAgICAgICAgICAgICAgLlxuICogICAgUmVhY3QgQ29yZSAgICAgLiAgR2VuZXJhbCBQdXJwb3NlIEV2ZW50IFBsdWdpbiBTeXN0ZW1cbiAqL1xuXG52YXIgaGFzRXZlbnRQYWdlWFk7XG52YXIgYWxyZWFkeUxpc3RlbmluZ1RvID0ge307XG52YXIgaXNNb25pdG9yaW5nU2Nyb2xsVmFsdWUgPSBmYWxzZTtcbnZhciByZWFjdFRvcExpc3RlbmVyc0NvdW50ZXIgPSAwO1xuXG4vLyBGb3IgZXZlbnRzIGxpa2UgJ3N1Ym1pdCcgd2hpY2ggZG9uJ3QgY29uc2lzdGVudGx5IGJ1YmJsZSAod2hpY2ggd2UgdHJhcCBhdCBhXG4vLyBsb3dlciBub2RlIHRoYW4gYGRvY3VtZW50YCksIGJpbmRpbmcgYXQgYGRvY3VtZW50YCB3b3VsZCBjYXVzZSBkdXBsaWNhdGVcbi8vIGV2ZW50cyBzbyB3ZSBkb24ndCBpbmNsdWRlIHRoZW0gaGVyZVxudmFyIHRvcEV2ZW50TWFwcGluZyA9IHtcbiAgdG9wQWJvcnQ6ICdhYm9ydCcsXG4gIHRvcEFuaW1hdGlvbkVuZDogZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWUoJ2FuaW1hdGlvbmVuZCcpIHx8ICdhbmltYXRpb25lbmQnLFxuICB0b3BBbmltYXRpb25JdGVyYXRpb246IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25pdGVyYXRpb24nKSB8fCAnYW5pbWF0aW9uaXRlcmF0aW9uJyxcbiAgdG9wQW5pbWF0aW9uU3RhcnQ6IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCdhbmltYXRpb25zdGFydCcpIHx8ICdhbmltYXRpb25zdGFydCcsXG4gIHRvcEJsdXI6ICdibHVyJyxcbiAgdG9wQ2FuUGxheTogJ2NhbnBsYXknLFxuICB0b3BDYW5QbGF5VGhyb3VnaDogJ2NhbnBsYXl0aHJvdWdoJyxcbiAgdG9wQ2hhbmdlOiAnY2hhbmdlJyxcbiAgdG9wQ2xpY2s6ICdjbGljaycsXG4gIHRvcENvbXBvc2l0aW9uRW5kOiAnY29tcG9zaXRpb25lbmQnLFxuICB0b3BDb21wb3NpdGlvblN0YXJ0OiAnY29tcG9zaXRpb25zdGFydCcsXG4gIHRvcENvbXBvc2l0aW9uVXBkYXRlOiAnY29tcG9zaXRpb251cGRhdGUnLFxuICB0b3BDb250ZXh0TWVudTogJ2NvbnRleHRtZW51JyxcbiAgdG9wQ29weTogJ2NvcHknLFxuICB0b3BDdXQ6ICdjdXQnLFxuICB0b3BEb3VibGVDbGljazogJ2RibGNsaWNrJyxcbiAgdG9wRHJhZzogJ2RyYWcnLFxuICB0b3BEcmFnRW5kOiAnZHJhZ2VuZCcsXG4gIHRvcERyYWdFbnRlcjogJ2RyYWdlbnRlcicsXG4gIHRvcERyYWdFeGl0OiAnZHJhZ2V4aXQnLFxuICB0b3BEcmFnTGVhdmU6ICdkcmFnbGVhdmUnLFxuICB0b3BEcmFnT3ZlcjogJ2RyYWdvdmVyJyxcbiAgdG9wRHJhZ1N0YXJ0OiAnZHJhZ3N0YXJ0JyxcbiAgdG9wRHJvcDogJ2Ryb3AnLFxuICB0b3BEdXJhdGlvbkNoYW5nZTogJ2R1cmF0aW9uY2hhbmdlJyxcbiAgdG9wRW1wdGllZDogJ2VtcHRpZWQnLFxuICB0b3BFbmNyeXB0ZWQ6ICdlbmNyeXB0ZWQnLFxuICB0b3BFbmRlZDogJ2VuZGVkJyxcbiAgdG9wRXJyb3I6ICdlcnJvcicsXG4gIHRvcEZvY3VzOiAnZm9jdXMnLFxuICB0b3BJbnB1dDogJ2lucHV0JyxcbiAgdG9wS2V5RG93bjogJ2tleWRvd24nLFxuICB0b3BLZXlQcmVzczogJ2tleXByZXNzJyxcbiAgdG9wS2V5VXA6ICdrZXl1cCcsXG4gIHRvcExvYWRlZERhdGE6ICdsb2FkZWRkYXRhJyxcbiAgdG9wTG9hZGVkTWV0YWRhdGE6ICdsb2FkZWRtZXRhZGF0YScsXG4gIHRvcExvYWRTdGFydDogJ2xvYWRzdGFydCcsXG4gIHRvcE1vdXNlRG93bjogJ21vdXNlZG93bicsXG4gIHRvcE1vdXNlTW92ZTogJ21vdXNlbW92ZScsXG4gIHRvcE1vdXNlT3V0OiAnbW91c2VvdXQnLFxuICB0b3BNb3VzZU92ZXI6ICdtb3VzZW92ZXInLFxuICB0b3BNb3VzZVVwOiAnbW91c2V1cCcsXG4gIHRvcFBhc3RlOiAncGFzdGUnLFxuICB0b3BQYXVzZTogJ3BhdXNlJyxcbiAgdG9wUGxheTogJ3BsYXknLFxuICB0b3BQbGF5aW5nOiAncGxheWluZycsXG4gIHRvcFByb2dyZXNzOiAncHJvZ3Jlc3MnLFxuICB0b3BSYXRlQ2hhbmdlOiAncmF0ZWNoYW5nZScsXG4gIHRvcFNjcm9sbDogJ3Njcm9sbCcsXG4gIHRvcFNlZWtlZDogJ3NlZWtlZCcsXG4gIHRvcFNlZWtpbmc6ICdzZWVraW5nJyxcbiAgdG9wU2VsZWN0aW9uQ2hhbmdlOiAnc2VsZWN0aW9uY2hhbmdlJyxcbiAgdG9wU3RhbGxlZDogJ3N0YWxsZWQnLFxuICB0b3BTdXNwZW5kOiAnc3VzcGVuZCcsXG4gIHRvcFRleHRJbnB1dDogJ3RleHRJbnB1dCcsXG4gIHRvcFRpbWVVcGRhdGU6ICd0aW1ldXBkYXRlJyxcbiAgdG9wVG91Y2hDYW5jZWw6ICd0b3VjaGNhbmNlbCcsXG4gIHRvcFRvdWNoRW5kOiAndG91Y2hlbmQnLFxuICB0b3BUb3VjaE1vdmU6ICd0b3VjaG1vdmUnLFxuICB0b3BUb3VjaFN0YXJ0OiAndG91Y2hzdGFydCcsXG4gIHRvcFRyYW5zaXRpb25FbmQ6IGdldFZlbmRvclByZWZpeGVkRXZlbnROYW1lKCd0cmFuc2l0aW9uZW5kJykgfHwgJ3RyYW5zaXRpb25lbmQnLFxuICB0b3BWb2x1bWVDaGFuZ2U6ICd2b2x1bWVjaGFuZ2UnLFxuICB0b3BXYWl0aW5nOiAnd2FpdGluZycsXG4gIHRvcFdoZWVsOiAnd2hlZWwnXG59O1xuXG4vKipcbiAqIFRvIGVuc3VyZSBubyBjb25mbGljdHMgd2l0aCBvdGhlciBwb3RlbnRpYWwgUmVhY3QgaW5zdGFuY2VzIG9uIHRoZSBwYWdlXG4gKi9cbnZhciB0b3BMaXN0ZW5lcnNJREtleSA9ICdfcmVhY3RMaXN0ZW5lcnNJRCcgKyBTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoMik7XG5cbmZ1bmN0aW9uIGdldExpc3RlbmluZ0ZvckRvY3VtZW50KG1vdW50QXQpIHtcbiAgLy8gSW4gSUU4LCBgbW91bnRBdGAgaXMgYSBob3N0IG9iamVjdCBhbmQgZG9lc24ndCBoYXZlIGBoYXNPd25Qcm9wZXJ0eWBcbiAgLy8gZGlyZWN0bHkuXG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vdW50QXQsIHRvcExpc3RlbmVyc0lES2V5KSkge1xuICAgIG1vdW50QXRbdG9wTGlzdGVuZXJzSURLZXldID0gcmVhY3RUb3BMaXN0ZW5lcnNDb3VudGVyKys7XG4gICAgYWxyZWFkeUxpc3RlbmluZ1RvW21vdW50QXRbdG9wTGlzdGVuZXJzSURLZXldXSA9IHt9O1xuICB9XG4gIHJldHVybiBhbHJlYWR5TGlzdGVuaW5nVG9bbW91bnRBdFt0b3BMaXN0ZW5lcnNJREtleV1dO1xufVxuXG4vKipcbiAqIGBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXJgIGlzIHVzZWQgdG8gYXR0YWNoIHRvcC1sZXZlbCBldmVudCBsaXN0ZW5lcnMuIEZvclxuICogZXhhbXBsZTpcbiAqXG4gKiAgIEV2ZW50UGx1Z2luSHViLnB1dExpc3RlbmVyKCdteUlEJywgJ29uQ2xpY2snLCBteUZ1bmN0aW9uKTtcbiAqXG4gKiBUaGlzIHdvdWxkIGFsbG9jYXRlIGEgXCJyZWdpc3RyYXRpb25cIiBvZiBgKCdvbkNsaWNrJywgbXlGdW5jdGlvbilgIG9uICdteUlEJy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlciA9IF9hc3NpZ24oe30sIFJlYWN0RXZlbnRFbWl0dGVyTWl4aW4sIHtcblxuICAvKipcbiAgICogSW5qZWN0YWJsZSBldmVudCBiYWNrZW5kXG4gICAqL1xuICBSZWFjdEV2ZW50TGlzdGVuZXI6IG51bGwsXG5cbiAgaW5qZWN0aW9uOiB7XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFJlYWN0RXZlbnRMaXN0ZW5lclxuICAgICAqL1xuICAgIGluamVjdFJlYWN0RXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKFJlYWN0RXZlbnRMaXN0ZW5lcikge1xuICAgICAgUmVhY3RFdmVudExpc3RlbmVyLnNldEhhbmRsZVRvcExldmVsKFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5oYW5kbGVUb3BMZXZlbCk7XG4gICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyID0gUmVhY3RFdmVudExpc3RlbmVyO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogU2V0cyB3aGV0aGVyIG9yIG5vdCBhbnkgY3JlYXRlZCBjYWxsYmFja3Mgc2hvdWxkIGJlIGVuYWJsZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZCBUcnVlIGlmIGNhbGxiYWNrcyBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICovXG4gIHNldEVuYWJsZWQ6IGZ1bmN0aW9uIChlbmFibGVkKSB7XG4gICAgaWYgKFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIuc2V0RW5hYmxlZChlbmFibGVkKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgY2FsbGJhY2tzIGFyZSBlbmFibGVkLlxuICAgKi9cbiAgaXNFbmFibGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICEhKFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIgJiYgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci5pc0VuYWJsZWQoKSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFdlIGxpc3RlbiBmb3IgYnViYmxlZCB0b3VjaCBldmVudHMgb24gdGhlIGRvY3VtZW50IG9iamVjdC5cbiAgICpcbiAgICogRmlyZWZveCB2OC4wMSAoYW5kIHBvc3NpYmx5IG90aGVycykgZXhoaWJpdGVkIHN0cmFuZ2UgYmVoYXZpb3Igd2hlblxuICAgKiBtb3VudGluZyBgb25tb3VzZW1vdmVgIGV2ZW50cyBhdCBzb21lIG5vZGUgdGhhdCB3YXMgbm90IHRoZSBkb2N1bWVudFxuICAgKiBlbGVtZW50LiBUaGUgc3ltcHRvbXMgd2VyZSB0aGF0IGlmIHlvdXIgbW91c2UgaXMgbm90IG1vdmluZyBvdmVyIHNvbWV0aGluZ1xuICAgKiBjb250YWluZWQgd2l0aGluIHRoYXQgbW91bnQgcG9pbnQgKGZvciBleGFtcGxlIG9uIHRoZSBiYWNrZ3JvdW5kKSB0aGVcbiAgICogdG9wLWxldmVsIGxpc3RlbmVycyBmb3IgYG9ubW91c2Vtb3ZlYCB3b24ndCBiZSBjYWxsZWQuIEhvd2V2ZXIsIGlmIHlvdVxuICAgKiByZWdpc3RlciB0aGUgYG1vdXNlbW92ZWAgb24gdGhlIGRvY3VtZW50IG9iamVjdCwgdGhlbiBpdCB3aWxsIG9mIGNvdXJzZVxuICAgKiBjYXRjaCBhbGwgYG1vdXNlbW92ZWBzLiBUaGlzIGFsb25nIHdpdGggaU9TIHF1aXJrcywganVzdGlmaWVzIHJlc3RyaWN0aW5nXG4gICAqIHRvcC1sZXZlbCBsaXN0ZW5lcnMgdG8gdGhlIGRvY3VtZW50IG9iamVjdCBvbmx5LCBhdCBsZWFzdCBmb3IgdGhlc2VcbiAgICogbW92ZW1lbnQgdHlwZXMgb2YgZXZlbnRzIGFuZCBwb3NzaWJseSBhbGwgZXZlbnRzLlxuICAgKlxuICAgKiBAc2VlIGh0dHA6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDEwLzA5L2NsaWNrX2V2ZW50X2RlbC5odG1sXG4gICAqXG4gICAqIEFsc28sIGBrZXl1cGAvYGtleXByZXNzYC9ga2V5ZG93bmAgZG8gbm90IGJ1YmJsZSB0byB0aGUgd2luZG93IG9uIElFLCBidXRcbiAgICogdGhleSBidWJibGUgdG8gZG9jdW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpc3RyYXRpb25OYW1lIE5hbWUgb2YgbGlzdGVuZXIgKGUuZy4gYG9uQ2xpY2tgKS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRlbnREb2N1bWVudEhhbmRsZSBEb2N1bWVudCB3aGljaCBvd25zIHRoZSBjb250YWluZXJcbiAgICovXG4gIGxpc3RlblRvOiBmdW5jdGlvbiAocmVnaXN0cmF0aW9uTmFtZSwgY29udGVudERvY3VtZW50SGFuZGxlKSB7XG4gICAgdmFyIG1vdW50QXQgPSBjb250ZW50RG9jdW1lbnRIYW5kbGU7XG4gICAgdmFyIGlzTGlzdGVuaW5nID0gZ2V0TGlzdGVuaW5nRm9yRG9jdW1lbnQobW91bnRBdCk7XG4gICAgdmFyIGRlcGVuZGVuY2llcyA9IEV2ZW50UGx1Z2luUmVnaXN0cnkucmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tyZWdpc3RyYXRpb25OYW1lXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVwZW5kZW5jaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVwZW5kZW5jeSA9IGRlcGVuZGVuY2llc1tpXTtcbiAgICAgIGlmICghKGlzTGlzdGVuaW5nLmhhc093blByb3BlcnR5KGRlcGVuZGVuY3kpICYmIGlzTGlzdGVuaW5nW2RlcGVuZGVuY3ldKSkge1xuICAgICAgICBpZiAoZGVwZW5kZW5jeSA9PT0gJ3RvcFdoZWVsJykge1xuICAgICAgICAgIGlmIChpc0V2ZW50U3VwcG9ydGVkKCd3aGVlbCcpKSB7XG4gICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcFdoZWVsJywgJ3doZWVsJywgbW91bnRBdCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpc0V2ZW50U3VwcG9ydGVkKCdtb3VzZXdoZWVsJykpIHtcbiAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wV2hlZWwnLCAnbW91c2V3aGVlbCcsIG1vdW50QXQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGaXJlZm94IG5lZWRzIHRvIGNhcHR1cmUgYSBkaWZmZXJlbnQgbW91c2Ugc2Nyb2xsIGV2ZW50LlxuICAgICAgICAgICAgLy8gQHNlZSBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2RvbS9ldmVudHMvdGVzdHMvc2Nyb2xsLmh0bWxcbiAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wV2hlZWwnLCAnRE9NTW91c2VTY3JvbGwnLCBtb3VudEF0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZGVwZW5kZW5jeSA9PT0gJ3RvcFNjcm9sbCcpIHtcblxuICAgICAgICAgIGlmIChpc0V2ZW50U3VwcG9ydGVkKCdzY3JvbGwnLCB0cnVlKSkge1xuICAgICAgICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQ2FwdHVyZWRFdmVudCgndG9wU2Nyb2xsJywgJ3Njcm9sbCcsIG1vdW50QXQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcFNjcm9sbCcsICdzY3JvbGwnLCBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLldJTkRPV19IQU5ETEUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkZXBlbmRlbmN5ID09PSAndG9wRm9jdXMnIHx8IGRlcGVuZGVuY3kgPT09ICd0b3BCbHVyJykge1xuXG4gICAgICAgICAgaWYgKGlzRXZlbnRTdXBwb3J0ZWQoJ2ZvY3VzJywgdHJ1ZSkpIHtcbiAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcENhcHR1cmVkRXZlbnQoJ3RvcEZvY3VzJywgJ2ZvY3VzJywgbW91bnRBdCk7XG4gICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KCd0b3BCbHVyJywgJ2JsdXInLCBtb3VudEF0KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzRXZlbnRTdXBwb3J0ZWQoJ2ZvY3VzaW4nKSkge1xuICAgICAgICAgICAgLy8gSUUgaGFzIGBmb2N1c2luYCBhbmQgYGZvY3Vzb3V0YCBldmVudHMgd2hpY2ggYnViYmxlLlxuICAgICAgICAgICAgLy8gQHNlZSBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2Jsb2cvYXJjaGl2ZXMvMjAwOC8wNC9kZWxlZ2F0aW5nX3RoZS5odG1sXG4gICAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcEZvY3VzJywgJ2ZvY3VzaW4nLCBtb3VudEF0KTtcbiAgICAgICAgICAgIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wQmx1cicsICdmb2N1c291dCcsIG1vdW50QXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHRvIG1ha2Ugc3VyZSBibHVyIGFuZCBmb2N1cyBldmVudCBsaXN0ZW5lcnMgYXJlIG9ubHkgYXR0YWNoZWQgb25jZVxuICAgICAgICAgIGlzTGlzdGVuaW5nLnRvcEJsdXIgPSB0cnVlO1xuICAgICAgICAgIGlzTGlzdGVuaW5nLnRvcEZvY3VzID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0b3BFdmVudE1hcHBpbmcuaGFzT3duUHJvcGVydHkoZGVwZW5kZW5jeSkpIHtcbiAgICAgICAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoZGVwZW5kZW5jeSwgdG9wRXZlbnRNYXBwaW5nW2RlcGVuZGVuY3ldLCBtb3VudEF0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlzTGlzdGVuaW5nW2RlcGVuZGVuY3ldID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgdHJhcEJ1YmJsZWRFdmVudDogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgaGFuZGxlckJhc2VOYW1lLCBoYW5kbGUpIHtcbiAgICByZXR1cm4gUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KHRvcExldmVsVHlwZSwgaGFuZGxlckJhc2VOYW1lLCBoYW5kbGUpO1xuICB9LFxuXG4gIHRyYXBDYXB0dXJlZEV2ZW50OiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCBoYW5kbGVyQmFzZU5hbWUsIGhhbmRsZSkge1xuICAgIHJldHVybiBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KHRvcExldmVsVHlwZSwgaGFuZGxlckJhc2VOYW1lLCBoYW5kbGUpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBQcm90ZWN0IGFnYWluc3QgZG9jdW1lbnQuY3JlYXRlRXZlbnQoKSByZXR1cm5pbmcgbnVsbFxuICAgKiBTb21lIHBvcHVwIGJsb2NrZXIgZXh0ZW5zaW9ucyBhcHBlYXIgdG8gZG8gdGhpczpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2lzc3Vlcy82ODg3XG4gICAqL1xuICBzdXBwb3J0c0V2ZW50UGFnZVhZOiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFkb2N1bWVudC5jcmVhdGVFdmVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgZXYgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnTW91c2VFdmVudCcpO1xuICAgIHJldHVybiBldiAhPSBudWxsICYmICdwYWdlWCcgaW4gZXY7XG4gIH0sXG5cbiAgLyoqXG4gICAqIExpc3RlbnMgdG8gd2luZG93IHNjcm9sbCBhbmQgcmVzaXplIGV2ZW50cy4gV2UgY2FjaGUgc2Nyb2xsIHZhbHVlcyBzbyB0aGF0XG4gICAqIGFwcGxpY2F0aW9uIGNvZGUgY2FuIGFjY2VzcyB0aGVtIHdpdGhvdXQgdHJpZ2dlcmluZyByZWZsb3dzLlxuICAgKlxuICAgKiBWaWV3cG9ydE1ldHJpY3MgaXMgb25seSB1c2VkIGJ5IFN5bnRoZXRpY01vdXNlL1RvdWNoRXZlbnQgYW5kIG9ubHkgd2hlblxuICAgKiBwYWdlWC9wYWdlWSBpc24ndCBzdXBwb3J0ZWQgKGxlZ2FjeSBicm93c2VycykuXG4gICAqXG4gICAqIE5PVEU6IFNjcm9sbCBldmVudHMgZG8gbm90IGJ1YmJsZS5cbiAgICpcbiAgICogQHNlZSBodHRwOi8vd3d3LnF1aXJrc21vZGUub3JnL2RvbS9ldmVudHMvc2Nyb2xsLmh0bWxcbiAgICovXG4gIGVuc3VyZVNjcm9sbFZhbHVlTW9uaXRvcmluZzogZnVuY3Rpb24gKCkge1xuICAgIGlmIChoYXNFdmVudFBhZ2VYWSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNFdmVudFBhZ2VYWSA9IFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci5zdXBwb3J0c0V2ZW50UGFnZVhZKCk7XG4gICAgfVxuICAgIGlmICghaGFzRXZlbnRQYWdlWFkgJiYgIWlzTW9uaXRvcmluZ1Njcm9sbFZhbHVlKSB7XG4gICAgICB2YXIgcmVmcmVzaCA9IFZpZXdwb3J0TWV0cmljcy5yZWZyZXNoU2Nyb2xsVmFsdWVzO1xuICAgICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLlJlYWN0RXZlbnRMaXN0ZW5lci5tb25pdG9yU2Nyb2xsVmFsdWUocmVmcmVzaCk7XG4gICAgICBpc01vbml0b3JpbmdTY3JvbGxWYWx1ZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlcjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RSZWNvbmNpbGVyID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZXInKTtcblxudmFyIGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQgPSByZXF1aXJlKCcuL2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQnKTtcbnZhciBLZXlFc2NhcGVVdGlscyA9IHJlcXVpcmUoJy4vS2V5RXNjYXBlVXRpbHMnKTtcbnZhciBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQnKTtcbnZhciB0cmF2ZXJzZUFsbENoaWxkcmVuID0gcmVxdWlyZSgnLi90cmF2ZXJzZUFsbENoaWxkcmVuJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2s7XG5cbmlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnYgJiYgXCJkZXZlbG9wbWVudFwiID09PSAndGVzdCcpIHtcbiAgLy8gVGVtcG9yYXJ5IGhhY2suXG4gIC8vIElubGluZSByZXF1aXJlcyBkb24ndCB3b3JrIHdlbGwgd2l0aCBKZXN0OlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNDBcbiAgLy8gUmVtb3ZlIHRoZSBpbmxpbmUgcmVxdWlyZXMgd2hlbiB3ZSBkb24ndCBuZWVkIHRoZW0gYW55bW9yZTpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzE3OFxuICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbn1cblxuZnVuY3Rpb24gaW5zdGFudGlhdGVDaGlsZChjaGlsZEluc3RhbmNlcywgY2hpbGQsIG5hbWUsIHNlbGZEZWJ1Z0lEKSB7XG4gIC8vIFdlIGZvdW5kIGEgY29tcG9uZW50IGluc3RhbmNlLlxuICB2YXIga2V5VW5pcXVlID0gY2hpbGRJbnN0YW5jZXNbbmFtZV0gPT09IHVuZGVmaW5lZDtcbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKCFSZWFjdENvbXBvbmVudFRyZWVIb29rKSB7XG4gICAgICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbiAgICB9XG4gICAgaWYgKCFrZXlVbmlxdWUpIHtcbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2ZsYXR0ZW5DaGlsZHJlbiguLi4pOiBFbmNvdW50ZXJlZCB0d28gY2hpbGRyZW4gd2l0aCB0aGUgc2FtZSBrZXksICcgKyAnYCVzYC4gQ2hpbGQga2V5cyBtdXN0IGJlIHVuaXF1ZTsgd2hlbiB0d28gY2hpbGRyZW4gc2hhcmUgYSBrZXksIG9ubHkgJyArICd0aGUgZmlyc3QgY2hpbGQgd2lsbCBiZSB1c2VkLiVzJywgS2V5RXNjYXBlVXRpbHMudW5lc2NhcGUobmFtZSksIFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoc2VsZkRlYnVnSUQpKSA6IHZvaWQgMDtcbiAgICB9XG4gIH1cbiAgaWYgKGNoaWxkICE9IG51bGwgJiYga2V5VW5pcXVlKSB7XG4gICAgY2hpbGRJbnN0YW5jZXNbbmFtZV0gPSBpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KGNoaWxkLCB0cnVlKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlYWN0Q2hpbGRSZWNvbmNpbGVyIHByb3ZpZGVzIGhlbHBlcnMgZm9yIGluaXRpYWxpemluZyBvciB1cGRhdGluZyBhIHNldCBvZlxuICogY2hpbGRyZW4uIEl0cyBvdXRwdXQgaXMgc3VpdGFibGUgZm9yIHBhc3NpbmcgaXQgb250byBSZWFjdE11bHRpQ2hpbGQgd2hpY2hcbiAqIGRvZXMgZGlmZmVkIHJlb3JkZXJpbmcgYW5kIGluc2VydGlvbi5cbiAqL1xudmFyIFJlYWN0Q2hpbGRSZWNvbmNpbGVyID0ge1xuICAvKipcbiAgICogR2VuZXJhdGVzIGEgXCJtb3VudCBpbWFnZVwiIGZvciBlYWNoIG9mIHRoZSBzdXBwbGllZCBjaGlsZHJlbi4gSW4gdGhlIGNhc2VcbiAgICogb2YgYFJlYWN0RE9NQ29tcG9uZW50YCwgYSBtb3VudCBpbWFnZSBpcyBhIHN0cmluZyBvZiBtYXJrdXAuXG4gICAqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbmVzdGVkQ2hpbGROb2RlcyBOZXN0ZWQgY2hpbGQgbWFwcy5cbiAgICogQHJldHVybiB7P29iamVjdH0gQSBzZXQgb2YgY2hpbGQgaW5zdGFuY2VzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGluc3RhbnRpYXRlQ2hpbGRyZW46IGZ1bmN0aW9uIChuZXN0ZWRDaGlsZE5vZGVzLCB0cmFuc2FjdGlvbiwgY29udGV4dCwgc2VsZkRlYnVnSUQgLy8gMCBpbiBwcm9kdWN0aW9uIGFuZCBmb3Igcm9vdHNcbiAgKSB7XG4gICAgaWYgKG5lc3RlZENoaWxkTm9kZXMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBjaGlsZEluc3RhbmNlcyA9IHt9O1xuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB0cmF2ZXJzZUFsbENoaWxkcmVuKG5lc3RlZENoaWxkTm9kZXMsIGZ1bmN0aW9uIChjaGlsZEluc3RzLCBjaGlsZCwgbmFtZSkge1xuICAgICAgICByZXR1cm4gaW5zdGFudGlhdGVDaGlsZChjaGlsZEluc3RzLCBjaGlsZCwgbmFtZSwgc2VsZkRlYnVnSUQpO1xuICAgICAgfSwgY2hpbGRJbnN0YW5jZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmF2ZXJzZUFsbENoaWxkcmVuKG5lc3RlZENoaWxkTm9kZXMsIGluc3RhbnRpYXRlQ2hpbGQsIGNoaWxkSW5zdGFuY2VzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkSW5zdGFuY2VzO1xuICB9LFxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSByZW5kZXJlZCBjaGlsZHJlbiBhbmQgcmV0dXJucyBhIG5ldyBzZXQgb2YgY2hpbGRyZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gcHJldkNoaWxkcmVuIFByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgc2V0IG9mIGNoaWxkcmVuLlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHRDaGlsZHJlbiBGbGF0IGNoaWxkIGVsZW1lbnQgbWFwcy5cbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dFxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBBIG5ldyBzZXQgb2YgY2hpbGQgaW5zdGFuY2VzLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHVwZGF0ZUNoaWxkcmVuOiBmdW5jdGlvbiAocHJldkNoaWxkcmVuLCBuZXh0Q2hpbGRyZW4sIG1vdW50SW1hZ2VzLCByZW1vdmVkTm9kZXMsIHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgY29udGV4dCwgc2VsZkRlYnVnSUQgLy8gMCBpbiBwcm9kdWN0aW9uIGFuZCBmb3Igcm9vdHNcbiAgKSB7XG4gICAgLy8gV2UgY3VycmVudGx5IGRvbid0IGhhdmUgYSB3YXkgdG8gdHJhY2sgbW92ZXMgaGVyZSBidXQgaWYgd2UgdXNlIGl0ZXJhdG9yc1xuICAgIC8vIGluc3RlYWQgb2YgZm9yLi5pbiB3ZSBjYW4gemlwIHRoZSBpdGVyYXRvcnMgYW5kIGNoZWNrIGlmIGFuIGl0ZW0gaGFzXG4gICAgLy8gbW92ZWQuXG4gICAgLy8gVE9ETzogSWYgbm90aGluZyBoYXMgY2hhbmdlZCwgcmV0dXJuIHRoZSBwcmV2Q2hpbGRyZW4gb2JqZWN0IHNvIHRoYXQgd2VcbiAgICAvLyBjYW4gcXVpY2tseSBiYWlsb3V0IGlmIG5vdGhpbmcgaGFzIGNoYW5nZWQuXG4gICAgaWYgKCFuZXh0Q2hpbGRyZW4gJiYgIXByZXZDaGlsZHJlbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbmFtZTtcbiAgICB2YXIgcHJldkNoaWxkO1xuICAgIGZvciAobmFtZSBpbiBuZXh0Q2hpbGRyZW4pIHtcbiAgICAgIGlmICghbmV4dENoaWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcHJldkNoaWxkID0gcHJldkNoaWxkcmVuICYmIHByZXZDaGlsZHJlbltuYW1lXTtcbiAgICAgIHZhciBwcmV2RWxlbWVudCA9IHByZXZDaGlsZCAmJiBwcmV2Q2hpbGQuX2N1cnJlbnRFbGVtZW50O1xuICAgICAgdmFyIG5leHRFbGVtZW50ID0gbmV4dENoaWxkcmVuW25hbWVdO1xuICAgICAgaWYgKHByZXZDaGlsZCAhPSBudWxsICYmIHNob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50KHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCkpIHtcbiAgICAgICAgUmVhY3RSZWNvbmNpbGVyLnJlY2VpdmVDb21wb25lbnQocHJldkNoaWxkLCBuZXh0RWxlbWVudCwgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgICAgICBuZXh0Q2hpbGRyZW5bbmFtZV0gPSBwcmV2Q2hpbGQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHJldkNoaWxkKSB7XG4gICAgICAgICAgcmVtb3ZlZE5vZGVzW25hbWVdID0gUmVhY3RSZWNvbmNpbGVyLmdldEhvc3ROb2RlKHByZXZDaGlsZCk7XG4gICAgICAgICAgUmVhY3RSZWNvbmNpbGVyLnVubW91bnRDb21wb25lbnQocHJldkNoaWxkLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIGNoaWxkIG11c3QgYmUgaW5zdGFudGlhdGVkIGJlZm9yZSBpdCdzIG1vdW50ZWQuXG4gICAgICAgIHZhciBuZXh0Q2hpbGRJbnN0YW5jZSA9IGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQobmV4dEVsZW1lbnQsIHRydWUpO1xuICAgICAgICBuZXh0Q2hpbGRyZW5bbmFtZV0gPSBuZXh0Q2hpbGRJbnN0YW5jZTtcbiAgICAgICAgLy8gQ3JlYXRpbmcgbW91bnQgaW1hZ2Ugbm93IGVuc3VyZXMgcmVmcyBhcmUgcmVzb2x2ZWQgaW4gcmlnaHQgb3JkZXJcbiAgICAgICAgLy8gKHNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC83MTAxIGZvciBleHBsYW5hdGlvbikuXG4gICAgICAgIHZhciBuZXh0Q2hpbGRNb3VudEltYWdlID0gUmVhY3RSZWNvbmNpbGVyLm1vdW50Q29tcG9uZW50KG5leHRDaGlsZEluc3RhbmNlLCB0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQsIHNlbGZEZWJ1Z0lEKTtcbiAgICAgICAgbW91bnRJbWFnZXMucHVzaChuZXh0Q2hpbGRNb3VudEltYWdlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gVW5tb3VudCBjaGlsZHJlbiB0aGF0IGFyZSBubyBsb25nZXIgcHJlc2VudC5cbiAgICBmb3IgKG5hbWUgaW4gcHJldkNoaWxkcmVuKSB7XG4gICAgICBpZiAocHJldkNoaWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpICYmICEobmV4dENoaWxkcmVuICYmIG5leHRDaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkpIHtcbiAgICAgICAgcHJldkNoaWxkID0gcHJldkNoaWxkcmVuW25hbWVdO1xuICAgICAgICByZW1vdmVkTm9kZXNbbmFtZV0gPSBSZWFjdFJlY29uY2lsZXIuZ2V0SG9zdE5vZGUocHJldkNoaWxkKTtcbiAgICAgICAgUmVhY3RSZWNvbmNpbGVyLnVubW91bnRDb21wb25lbnQocHJldkNoaWxkLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBVbm1vdW50cyBhbGwgcmVuZGVyZWQgY2hpbGRyZW4uIFRoaXMgc2hvdWxkIGJlIHVzZWQgdG8gY2xlYW4gdXAgY2hpbGRyZW5cbiAgICogd2hlbiB0aGlzIGNvbXBvbmVudCBpcyB1bm1vdW50ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gcmVuZGVyZWRDaGlsZHJlbiBQcmV2aW91c2x5IGluaXRpYWxpemVkIHNldCBvZiBjaGlsZHJlbi5cbiAgICogQGludGVybmFsXG4gICAqL1xuICB1bm1vdW50Q2hpbGRyZW46IGZ1bmN0aW9uIChyZW5kZXJlZENoaWxkcmVuLCBzYWZlbHkpIHtcbiAgICBmb3IgKHZhciBuYW1lIGluIHJlbmRlcmVkQ2hpbGRyZW4pIHtcbiAgICAgIGlmIChyZW5kZXJlZENoaWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHZhciByZW5kZXJlZENoaWxkID0gcmVuZGVyZWRDaGlsZHJlbltuYW1lXTtcbiAgICAgICAgUmVhY3RSZWNvbmNpbGVyLnVubW91bnRDb21wb25lbnQocmVuZGVyZWRDaGlsZCwgc2FmZWx5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdENoaWxkUmVjb25jaWxlcjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NQ2hpbGRyZW5PcGVyYXRpb25zID0gcmVxdWlyZSgnLi9ET01DaGlsZHJlbk9wZXJhdGlvbnMnKTtcbnZhciBSZWFjdERPTUlET3BlcmF0aW9ucyA9IHJlcXVpcmUoJy4vUmVhY3RET01JRE9wZXJhdGlvbnMnKTtcblxuLyoqXG4gKiBBYnN0cmFjdHMgYXdheSBhbGwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgcmVjb25jaWxlciB0aGF0IHJlcXVpcmVzIGtub3dsZWRnZSBvZlxuICogdGhlIGJyb3dzZXIgY29udGV4dC4gVE9ETzogVGhlc2UgY2FsbGVycyBzaG91bGQgYmUgcmVmYWN0b3JlZCB0byBhdm9pZCB0aGVcbiAqIG5lZWQgZm9yIHRoaXMgaW5qZWN0aW9uLlxuICovXG52YXIgUmVhY3RDb21wb25lbnRCcm93c2VyRW52aXJvbm1lbnQgPSB7XG5cbiAgcHJvY2Vzc0NoaWxkcmVuVXBkYXRlczogUmVhY3RET01JRE9wZXJhdGlvbnMuZGFuZ2Vyb3VzbHlQcm9jZXNzQ2hpbGRyZW5VcGRhdGVzLFxuXG4gIHJlcGxhY2VOb2RlV2l0aE1hcmt1cDogRE9NQ2hpbGRyZW5PcGVyYXRpb25zLmRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwXG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RDb21wb25lbnRCcm93c2VyRW52aXJvbm1lbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbnZhciBpbmplY3RlZCA9IGZhbHNlO1xuXG52YXIgUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudCA9IHtcblxuICAvKipcbiAgICogT3B0aW9uYWxseSBpbmplY3RhYmxlIGhvb2sgZm9yIHN3YXBwaW5nIG91dCBtb3VudCBpbWFnZXMgaW4gdGhlIG1pZGRsZSBvZlxuICAgKiB0aGUgdHJlZS5cbiAgICovXG4gIHJlcGxhY2VOb2RlV2l0aE1hcmt1cDogbnVsbCxcblxuICAvKipcbiAgICogT3B0aW9uYWxseSBpbmplY3RhYmxlIGhvb2sgZm9yIHByb2Nlc3NpbmcgYSBxdWV1ZSBvZiBjaGlsZCB1cGRhdGVzLiBXaWxsXG4gICAqIGxhdGVyIG1vdmUgaW50byBNdWx0aUNoaWxkQ29tcG9uZW50cy5cbiAgICovXG4gIHByb2Nlc3NDaGlsZHJlblVwZGF0ZXM6IG51bGwsXG5cbiAgaW5qZWN0aW9uOiB7XG4gICAgaW5qZWN0RW52aXJvbm1lbnQ6IGZ1bmN0aW9uIChlbnZpcm9ubWVudCkge1xuICAgICAgISFpbmplY3RlZCA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQ6IGluamVjdEVudmlyb25tZW50KCkgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuJykgOiBfcHJvZEludmFyaWFudCgnMTA0JykgOiB2b2lkIDA7XG4gICAgICBSZWFjdENvbXBvbmVudEVudmlyb25tZW50LnJlcGxhY2VOb2RlV2l0aE1hcmt1cCA9IGVudmlyb25tZW50LnJlcGxhY2VOb2RlV2l0aE1hcmt1cDtcbiAgICAgIFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQucHJvY2Vzc0NoaWxkcmVuVXBkYXRlcyA9IGVudmlyb25tZW50LnByb2Nlc3NDaGlsZHJlblVwZGF0ZXM7XG4gICAgICBpbmplY3RlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpLFxuICAgIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdCcpO1xudmFyIFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQnKTtcbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdEN1cnJlbnRPd25lcicpO1xudmFyIFJlYWN0RXJyb3JVdGlscyA9IHJlcXVpcmUoJy4vUmVhY3RFcnJvclV0aWxzJyk7XG52YXIgUmVhY3RJbnN0YW5jZU1hcCA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0YW5jZU1hcCcpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xudmFyIFJlYWN0Tm9kZVR5cGVzID0gcmVxdWlyZSgnLi9SZWFjdE5vZGVUeXBlcycpO1xudmFyIFJlYWN0UmVjb25jaWxlciA9IHJlcXVpcmUoJy4vUmVhY3RSZWNvbmNpbGVyJyk7XG5cbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgY2hlY2tSZWFjdFR5cGVTcGVjID0gcmVxdWlyZSgnLi9jaGVja1JlYWN0VHlwZVNwZWMnKTtcbn1cblxudmFyIGVtcHR5T2JqZWN0ID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlPYmplY3QnKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciBzaGFsbG93RXF1YWwgPSByZXF1aXJlKCdmYmpzL2xpYi9zaGFsbG93RXF1YWwnKTtcbnZhciBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgQ29tcG9zaXRlVHlwZXMgPSB7XG4gIEltcHVyZUNsYXNzOiAwLFxuICBQdXJlQ2xhc3M6IDEsXG4gIFN0YXRlbGVzc0Z1bmN0aW9uYWw6IDJcbn07XG5cbmZ1bmN0aW9uIFN0YXRlbGVzc0NvbXBvbmVudChDb21wb25lbnQpIHt9XG5TdGF0ZWxlc3NDb21wb25lbnQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIENvbXBvbmVudCA9IFJlYWN0SW5zdGFuY2VNYXAuZ2V0KHRoaXMpLl9jdXJyZW50RWxlbWVudC50eXBlO1xuICB2YXIgZWxlbWVudCA9IENvbXBvbmVudCh0aGlzLnByb3BzLCB0aGlzLmNvbnRleHQsIHRoaXMudXBkYXRlcik7XG4gIHdhcm5JZkludmFsaWRFbGVtZW50KENvbXBvbmVudCwgZWxlbWVudCk7XG4gIHJldHVybiBlbGVtZW50O1xufTtcblxuZnVuY3Rpb24gd2FybklmSW52YWxpZEVsZW1lbnQoQ29tcG9uZW50LCBlbGVtZW50KSB7XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhlbGVtZW50ID09PSBudWxsIHx8IGVsZW1lbnQgPT09IGZhbHNlIHx8IFJlYWN0LmlzVmFsaWRFbGVtZW50KGVsZW1lbnQpLCAnJXMoLi4uKTogQSB2YWxpZCBSZWFjdCBlbGVtZW50IChvciBudWxsKSBtdXN0IGJlIHJldHVybmVkLiBZb3UgbWF5IGhhdmUgJyArICdyZXR1cm5lZCB1bmRlZmluZWQsIGFuIGFycmF5IG9yIHNvbWUgb3RoZXIgaW52YWxpZCBvYmplY3QuJywgQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIUNvbXBvbmVudC5jaGlsZENvbnRleHRUeXBlcywgJyVzKC4uLik6IGNoaWxkQ29udGV4dFR5cGVzIGNhbm5vdCBiZSBkZWZpbmVkIG9uIGEgZnVuY3Rpb25hbCBjb21wb25lbnQuJywgQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzaG91bGRDb25zdHJ1Y3QoQ29tcG9uZW50KSB7XG4gIHJldHVybiAhIShDb21wb25lbnQucHJvdG90eXBlICYmIENvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCk7XG59XG5cbmZ1bmN0aW9uIGlzUHVyZUNvbXBvbmVudChDb21wb25lbnQpIHtcbiAgcmV0dXJuICEhKENvbXBvbmVudC5wcm90b3R5cGUgJiYgQ29tcG9uZW50LnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCk7XG59XG5cbi8vIFNlcGFyYXRlZCBpbnRvIGEgZnVuY3Rpb24gdG8gY29udGFpbiBkZW9wdGltaXphdGlvbnMgY2F1c2VkIGJ5IHRyeS9maW5hbGx5LlxuZnVuY3Rpb24gbWVhc3VyZUxpZmVDeWNsZVBlcmYoZm4sIGRlYnVnSUQsIHRpbWVyVHlwZSkge1xuICBpZiAoZGVidWdJRCA9PT0gMCkge1xuICAgIC8vIFRvcC1sZXZlbCB3cmFwcGVycyAoc2VlIFJlYWN0TW91bnQpIGFuZCBlbXB0eSBjb21wb25lbnRzIChzZWVcbiAgICAvLyBSZWFjdERPTUVtcHR5Q29tcG9uZW50KSBhcmUgaW52aXNpYmxlIHRvIGhvb2tzIGFuZCBkZXZ0b29scy5cbiAgICAvLyBCb3RoIGFyZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHRoYXQgc2hvdWxkIGdvIGF3YXkgaW4gdGhlIGZ1dHVyZS5cbiAgICByZXR1cm4gZm4oKTtcbiAgfVxuXG4gIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZ2luTGlmZUN5Y2xlVGltZXIoZGVidWdJRCwgdGltZXJUeXBlKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25FbmRMaWZlQ3ljbGVUaW1lcihkZWJ1Z0lELCB0aW1lclR5cGUpO1xuICB9XG59XG5cbi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tIFRoZSBMaWZlLUN5Y2xlIG9mIGEgQ29tcG9zaXRlIENvbXBvbmVudCAtLS0tLS0tLS0tLS0tLS0tLS1cbiAqXG4gKiAtIGNvbnN0cnVjdG9yOiBJbml0aWFsaXphdGlvbiBvZiBzdGF0ZS4gVGhlIGluc3RhbmNlIGlzIG5vdyByZXRhaW5lZC5cbiAqICAgLSBjb21wb25lbnRXaWxsTW91bnRcbiAqICAgLSByZW5kZXJcbiAqICAgLSBbY2hpbGRyZW4ncyBjb25zdHJ1Y3RvcnNdXG4gKiAgICAgLSBbY2hpbGRyZW4ncyBjb21wb25lbnRXaWxsTW91bnQgYW5kIHJlbmRlcl1cbiAqICAgICAtIFtjaGlsZHJlbidzIGNvbXBvbmVudERpZE1vdW50XVxuICogICAgIC0gY29tcG9uZW50RGlkTW91bnRcbiAqXG4gKiAgICAgICBVcGRhdGUgUGhhc2VzOlxuICogICAgICAgLSBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIChvbmx5IGNhbGxlZCBpZiBwYXJlbnQgdXBkYXRlZClcbiAqICAgICAgIC0gc2hvdWxkQ29tcG9uZW50VXBkYXRlXG4gKiAgICAgICAgIC0gY29tcG9uZW50V2lsbFVwZGF0ZVxuICogICAgICAgICAgIC0gcmVuZGVyXG4gKiAgICAgICAgICAgLSBbY2hpbGRyZW4ncyBjb25zdHJ1Y3RvcnMgb3IgcmVjZWl2ZSBwcm9wcyBwaGFzZXNdXG4gKiAgICAgICAgIC0gY29tcG9uZW50RGlkVXBkYXRlXG4gKlxuICogICAgIC0gY29tcG9uZW50V2lsbFVubW91bnRcbiAqICAgICAtIFtjaGlsZHJlbidzIGNvbXBvbmVudFdpbGxVbm1vdW50XVxuICogICAtIFtjaGlsZHJlbiBkZXN0cm95ZWRdXG4gKiAtIChkZXN0cm95ZWQpOiBUaGUgaW5zdGFuY2UgaXMgbm93IGJsYW5rLCByZWxlYXNlZCBieSBSZWFjdCBhbmQgcmVhZHkgZm9yIEdDLlxuICpcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuLyoqXG4gKiBBbiBpbmNyZW1lbnRpbmcgSUQgYXNzaWduZWQgdG8gZWFjaCBjb21wb25lbnQgd2hlbiBpdCBpcyBtb3VudGVkLiBUaGlzIGlzXG4gKiB1c2VkIHRvIGVuZm9yY2UgdGhlIG9yZGVyIGluIHdoaWNoIGBSZWFjdFVwZGF0ZXNgIHVwZGF0ZXMgZGlydHkgY29tcG9uZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG52YXIgbmV4dE1vdW50SUQgPSAxO1xuXG4vKipcbiAqIEBsZW5kcyB7UmVhY3RDb21wb3NpdGVDb21wb25lbnQucHJvdG90eXBlfVxuICovXG52YXIgUmVhY3RDb21wb3NpdGVDb21wb25lbnQgPSB7XG5cbiAgLyoqXG4gICAqIEJhc2UgY29uc3RydWN0b3IgZm9yIGFsbCBjb21wb3NpdGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudFxuICAgKiBAZmluYWxcbiAgICogQGludGVybmFsXG4gICAqL1xuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBlbGVtZW50O1xuICAgIHRoaXMuX3Jvb3ROb2RlSUQgPSAwO1xuICAgIHRoaXMuX2NvbXBvc2l0ZVR5cGUgPSBudWxsO1xuICAgIHRoaXMuX2luc3RhbmNlID0gbnVsbDtcbiAgICB0aGlzLl9ob3N0UGFyZW50ID0gbnVsbDtcbiAgICB0aGlzLl9ob3N0Q29udGFpbmVySW5mbyA9IG51bGw7XG5cbiAgICAvLyBTZWUgUmVhY3RVcGRhdGVRdWV1ZVxuICAgIHRoaXMuX3VwZGF0ZUJhdGNoTnVtYmVyID0gbnVsbDtcbiAgICB0aGlzLl9wZW5kaW5nRWxlbWVudCA9IG51bGw7XG4gICAgdGhpcy5fcGVuZGluZ1N0YXRlUXVldWUgPSBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGUgPSBmYWxzZTtcbiAgICB0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGUgPSBmYWxzZTtcblxuICAgIHRoaXMuX3JlbmRlcmVkTm9kZVR5cGUgPSBudWxsO1xuICAgIHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50ID0gbnVsbDtcbiAgICB0aGlzLl9jb250ZXh0ID0gbnVsbDtcbiAgICB0aGlzLl9tb3VudE9yZGVyID0gMDtcbiAgICB0aGlzLl90b3BMZXZlbFdyYXBwZXIgPSBudWxsO1xuXG4gICAgLy8gU2VlIFJlYWN0VXBkYXRlcyBhbmQgUmVhY3RVcGRhdGVRdWV1ZS5cbiAgICB0aGlzLl9wZW5kaW5nQ2FsbGJhY2tzID0gbnVsbDtcblxuICAgIC8vIENvbXBvbmVudFdpbGxVbm1vdW50IHNoYWxsIG9ubHkgYmUgY2FsbGVkIG9uY2VcbiAgICB0aGlzLl9jYWxsZWRDb21wb25lbnRXaWxsVW5tb3VudCA9IGZhbHNlO1xuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB0aGlzLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciA9IGZhbHNlO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGNvbXBvbmVudCwgcmVuZGVycyBtYXJrdXAsIGFuZCByZWdpc3RlcnMgZXZlbnQgbGlzdGVuZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb258UmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHs/b2JqZWN0fSBob3N0UGFyZW50XG4gICAqIEBwYXJhbSB7P29iamVjdH0gaG9zdENvbnRhaW5lckluZm9cbiAgICogQHBhcmFtIHs/b2JqZWN0fSBjb250ZXh0XG4gICAqIEByZXR1cm4gez9zdHJpbmd9IFJlbmRlcmVkIG1hcmt1cCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBET00uXG4gICAqIEBmaW5hbFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0KSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICAgIHRoaXMuX21vdW50T3JkZXIgPSBuZXh0TW91bnRJRCsrO1xuICAgIHRoaXMuX2hvc3RQYXJlbnQgPSBob3N0UGFyZW50O1xuICAgIHRoaXMuX2hvc3RDb250YWluZXJJbmZvID0gaG9zdENvbnRhaW5lckluZm87XG5cbiAgICB2YXIgcHVibGljUHJvcHMgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztcbiAgICB2YXIgcHVibGljQ29udGV4dCA9IHRoaXMuX3Byb2Nlc3NDb250ZXh0KGNvbnRleHQpO1xuXG4gICAgdmFyIENvbXBvbmVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG5cbiAgICB2YXIgdXBkYXRlUXVldWUgPSB0cmFuc2FjdGlvbi5nZXRVcGRhdGVRdWV1ZSgpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgcHVibGljIGNsYXNzXG4gICAgdmFyIGRvQ29uc3RydWN0ID0gc2hvdWxkQ29uc3RydWN0KENvbXBvbmVudCk7XG4gICAgdmFyIGluc3QgPSB0aGlzLl9jb25zdHJ1Y3RDb21wb25lbnQoZG9Db25zdHJ1Y3QsIHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7XG4gICAgdmFyIHJlbmRlcmVkRWxlbWVudDtcblxuICAgIC8vIFN1cHBvcnQgZnVuY3Rpb25hbCBjb21wb25lbnRzXG4gICAgaWYgKCFkb0NvbnN0cnVjdCAmJiAoaW5zdCA9PSBudWxsIHx8IGluc3QucmVuZGVyID09IG51bGwpKSB7XG4gICAgICByZW5kZXJlZEVsZW1lbnQgPSBpbnN0O1xuICAgICAgd2FybklmSW52YWxpZEVsZW1lbnQoQ29tcG9uZW50LCByZW5kZXJlZEVsZW1lbnQpO1xuICAgICAgIShpbnN0ID09PSBudWxsIHx8IGluc3QgPT09IGZhbHNlIHx8IFJlYWN0LmlzVmFsaWRFbGVtZW50KGluc3QpKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMoLi4uKTogQSB2YWxpZCBSZWFjdCBlbGVtZW50IChvciBudWxsKSBtdXN0IGJlIHJldHVybmVkLiBZb3UgbWF5IGhhdmUgcmV0dXJuZWQgdW5kZWZpbmVkLCBhbiBhcnJheSBvciBzb21lIG90aGVyIGludmFsaWQgb2JqZWN0LicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMTA1JywgQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICAgIGluc3QgPSBuZXcgU3RhdGVsZXNzQ29tcG9uZW50KENvbXBvbmVudCk7XG4gICAgICB0aGlzLl9jb21wb3NpdGVUeXBlID0gQ29tcG9zaXRlVHlwZXMuU3RhdGVsZXNzRnVuY3Rpb25hbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzUHVyZUNvbXBvbmVudChDb21wb25lbnQpKSB7XG4gICAgICAgIHRoaXMuX2NvbXBvc2l0ZVR5cGUgPSBDb21wb3NpdGVUeXBlcy5QdXJlQ2xhc3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jb21wb3NpdGVUeXBlID0gQ29tcG9zaXRlVHlwZXMuSW1wdXJlQ2xhc3M7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAvLyBUaGlzIHdpbGwgdGhyb3cgbGF0ZXIgaW4gX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCwgYnV0IGFkZCBhbiBlYXJseVxuICAgICAgLy8gd2FybmluZyBub3cgdG8gaGVscCBkZWJ1Z2dpbmdcbiAgICAgIGlmIChpbnN0LnJlbmRlciA9PSBudWxsKSB7XG4gICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzKC4uLik6IE5vIGByZW5kZXJgIG1ldGhvZCBmb3VuZCBvbiB0aGUgcmV0dXJuZWQgY29tcG9uZW50ICcgKyAnaW5zdGFuY2U6IHlvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gZGVmaW5lIGByZW5kZXJgLicsIENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICB9XG5cbiAgICAgIHZhciBwcm9wc011dGF0ZWQgPSBpbnN0LnByb3BzICE9PSBwdWJsaWNQcm9wcztcbiAgICAgIHZhciBjb21wb25lbnROYW1lID0gQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IENvbXBvbmVudC5uYW1lIHx8ICdDb21wb25lbnQnO1xuXG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoaW5zdC5wcm9wcyA9PT0gdW5kZWZpbmVkIHx8ICFwcm9wc011dGF0ZWQsICclcyguLi4pOiBXaGVuIGNhbGxpbmcgc3VwZXIoKSBpbiBgJXNgLCBtYWtlIHN1cmUgdG8gcGFzcyAnICsgJ3VwIHRoZSBzYW1lIHByb3BzIHRoYXQgeW91ciBjb21wb25lbnRcXCdzIGNvbnN0cnVjdG9yIHdhcyBwYXNzZWQuJywgY29tcG9uZW50TmFtZSwgY29tcG9uZW50TmFtZSkgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgLy8gVGhlc2Ugc2hvdWxkIGJlIHNldCB1cCBpbiB0aGUgY29uc3RydWN0b3IsIGJ1dCBhcyBhIGNvbnZlbmllbmNlIGZvclxuICAgIC8vIHNpbXBsZXIgY2xhc3MgYWJzdHJhY3Rpb25zLCB3ZSBzZXQgdGhlbSB1cCBhZnRlciB0aGUgZmFjdC5cbiAgICBpbnN0LnByb3BzID0gcHVibGljUHJvcHM7XG4gICAgaW5zdC5jb250ZXh0ID0gcHVibGljQ29udGV4dDtcbiAgICBpbnN0LnJlZnMgPSBlbXB0eU9iamVjdDtcbiAgICBpbnN0LnVwZGF0ZXIgPSB1cGRhdGVRdWV1ZTtcblxuICAgIHRoaXMuX2luc3RhbmNlID0gaW5zdDtcblxuICAgIC8vIFN0b3JlIGEgcmVmZXJlbmNlIGZyb20gdGhlIGluc3RhbmNlIGJhY2sgdG8gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uXG4gICAgUmVhY3RJbnN0YW5jZU1hcC5zZXQoaW5zdCwgdGhpcyk7XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIC8vIFNpbmNlIHBsYWluIEpTIGNsYXNzZXMgYXJlIGRlZmluZWQgd2l0aG91dCBhbnkgc3BlY2lhbCBpbml0aWFsaXphdGlvblxuICAgICAgLy8gbG9naWMsIHdlIGNhbiBub3QgY2F0Y2ggY29tbW9uIGVycm9ycyBlYXJseS4gVGhlcmVmb3JlLCB3ZSBoYXZlIHRvXG4gICAgICAvLyBjYXRjaCB0aGVtIGhlcmUsIGF0IGluaXRpYWxpemF0aW9uIHRpbWUsIGluc3RlYWQuXG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWluc3QuZ2V0SW5pdGlhbFN0YXRlIHx8IGluc3QuZ2V0SW5pdGlhbFN0YXRlLmlzUmVhY3RDbGFzc0FwcHJvdmVkIHx8IGluc3Quc3RhdGUsICdnZXRJbml0aWFsU3RhdGUgd2FzIGRlZmluZWQgb24gJXMsIGEgcGxhaW4gSmF2YVNjcmlwdCBjbGFzcy4gJyArICdUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBjbGFzc2VzIGNyZWF0ZWQgdXNpbmcgUmVhY3QuY3JlYXRlQ2xhc3MuICcgKyAnRGlkIHlvdSBtZWFuIHRvIGRlZmluZSBhIHN0YXRlIHByb3BlcnR5IGluc3RlYWQ/JywgdGhpcy5nZXROYW1lKCkgfHwgJ2EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWluc3QuZ2V0RGVmYXVsdFByb3BzIHx8IGluc3QuZ2V0RGVmYXVsdFByb3BzLmlzUmVhY3RDbGFzc0FwcHJvdmVkLCAnZ2V0RGVmYXVsdFByb3BzIHdhcyBkZWZpbmVkIG9uICVzLCBhIHBsYWluIEphdmFTY3JpcHQgY2xhc3MuICcgKyAnVGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgY2xhc3NlcyBjcmVhdGVkIHVzaW5nIFJlYWN0LmNyZWF0ZUNsYXNzLiAnICsgJ1VzZSBhIHN0YXRpYyBwcm9wZXJ0eSB0byBkZWZpbmUgZGVmYXVsdFByb3BzIGluc3RlYWQuJywgdGhpcy5nZXROYW1lKCkgfHwgJ2EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWluc3QucHJvcFR5cGVzLCAncHJvcFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSBzdGF0aWMgJyArICdwcm9wZXJ0eSB0byBkZWZpbmUgcHJvcFR5cGVzIGluc3RlYWQuJywgdGhpcy5nZXROYW1lKCkgfHwgJ2EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWluc3QuY29udGV4dFR5cGVzLCAnY29udGV4dFR5cGVzIHdhcyBkZWZpbmVkIGFzIGFuIGluc3RhbmNlIHByb3BlcnR5IG9uICVzLiBVc2UgYSAnICsgJ3N0YXRpYyBwcm9wZXJ0eSB0byBkZWZpbmUgY29udGV4dFR5cGVzIGluc3RlYWQuJywgdGhpcy5nZXROYW1lKCkgfHwgJ2EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcodHlwZW9mIGluc3QuY29tcG9uZW50U2hvdWxkVXBkYXRlICE9PSAnZnVuY3Rpb24nLCAnJXMgaGFzIGEgbWV0aG9kIGNhbGxlZCAnICsgJ2NvbXBvbmVudFNob3VsZFVwZGF0ZSgpLiBEaWQgeW91IG1lYW4gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCk/ICcgKyAnVGhlIG5hbWUgaXMgcGhyYXNlZCBhcyBhIHF1ZXN0aW9uIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGlzICcgKyAnZXhwZWN0ZWQgdG8gcmV0dXJuIGEgdmFsdWUuJywgdGhpcy5nZXROYW1lKCkgfHwgJ0EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcodHlwZW9mIGluc3QuY29tcG9uZW50RGlkVW5tb3VudCAhPT0gJ2Z1bmN0aW9uJywgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnREaWRVbm1vdW50KCkuIEJ1dCB0aGVyZSBpcyBubyBzdWNoIGxpZmVjeWNsZSBtZXRob2QuICcgKyAnRGlkIHlvdSBtZWFuIGNvbXBvbmVudFdpbGxVbm1vdW50KCk/JywgdGhpcy5nZXROYW1lKCkgfHwgJ0EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcodHlwZW9mIGluc3QuY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcyAhPT0gJ2Z1bmN0aW9uJywgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzKCkuIERpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/JywgdGhpcy5nZXROYW1lKCkgfHwgJ0EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgdmFyIGluaXRpYWxTdGF0ZSA9IGluc3Quc3RhdGU7XG4gICAgaWYgKGluaXRpYWxTdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpbnN0LnN0YXRlID0gaW5pdGlhbFN0YXRlID0gbnVsbDtcbiAgICB9XG4gICAgISh0eXBlb2YgaW5pdGlhbFN0YXRlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShpbml0aWFsU3RhdGUpKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMuc3RhdGU6IG11c3QgYmUgc2V0IHRvIGFuIG9iamVjdCBvciBudWxsJywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMTA2JywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7XG5cbiAgICB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IG51bGw7XG4gICAgdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuXG4gICAgdmFyIG1hcmt1cDtcbiAgICBpZiAoaW5zdC51bnN0YWJsZV9oYW5kbGVFcnJvcikge1xuICAgICAgbWFya3VwID0gdGhpcy5wZXJmb3JtSW5pdGlhbE1vdW50V2l0aEVycm9ySGFuZGxpbmcocmVuZGVyZWRFbGVtZW50LCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXJrdXAgPSB0aGlzLnBlcmZvcm1Jbml0aWFsTW91bnQocmVuZGVyZWRFbGVtZW50LCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgIH1cblxuICAgIGlmIChpbnN0LmNvbXBvbmVudERpZE1vdW50KSB7XG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgbWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGluc3QuY29tcG9uZW50RGlkTW91bnQoKTtcbiAgICAgICAgICB9LCBfdGhpcy5fZGVidWdJRCwgJ2NvbXBvbmVudERpZE1vdW50Jyk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShpbnN0LmNvbXBvbmVudERpZE1vdW50LCBpbnN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWFya3VwO1xuICB9LFxuXG4gIF9jb25zdHJ1Y3RDb21wb25lbnQ6IGZ1bmN0aW9uIChkb0NvbnN0cnVjdCwgcHVibGljUHJvcHMsIHB1YmxpY0NvbnRleHQsIHVwZGF0ZVF1ZXVlKSB7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID0gdGhpcztcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25zdHJ1Y3RDb21wb25lbnRXaXRob3V0T3duZXIoZG9Db25zdHJ1Y3QsIHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvbnN0cnVjdENvbXBvbmVudFdpdGhvdXRPd25lcihkb0NvbnN0cnVjdCwgcHVibGljUHJvcHMsIHB1YmxpY0NvbnRleHQsIHVwZGF0ZVF1ZXVlKTtcbiAgICB9XG4gIH0sXG5cbiAgX2NvbnN0cnVjdENvbXBvbmVudFdpdGhvdXRPd25lcjogZnVuY3Rpb24gKGRvQ29uc3RydWN0LCBwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTtcblxuICAgIGlmIChkb0NvbnN0cnVjdCkge1xuICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnQocHVibGljUHJvcHMsIHB1YmxpY0NvbnRleHQsIHVwZGF0ZVF1ZXVlKTtcbiAgICAgICAgfSwgdGhpcy5fZGVidWdJRCwgJ2N0b3InKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50KHB1YmxpY1Byb3BzLCBwdWJsaWNDb250ZXh0LCB1cGRhdGVRdWV1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhpcyBjYW4gc3RpbGwgYmUgYW4gaW5zdGFuY2UgaW4gY2FzZSBvZiBmYWN0b3J5IGNvbXBvbmVudHNcbiAgICAvLyBidXQgd2UnbGwgY291bnQgdGhpcyBhcyB0aW1lIHNwZW50IHJlbmRlcmluZyBhcyB0aGUgbW9yZSBjb21tb24gY2FzZS5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHJldHVybiBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBDb21wb25lbnQocHVibGljUHJvcHMsIHB1YmxpY0NvbnRleHQsIHVwZGF0ZVF1ZXVlKTtcbiAgICAgIH0sIHRoaXMuX2RlYnVnSUQsICdyZW5kZXInKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIENvbXBvbmVudChwdWJsaWNQcm9wcywgcHVibGljQ29udGV4dCwgdXBkYXRlUXVldWUpO1xuICAgIH1cbiAgfSxcblxuICBwZXJmb3JtSW5pdGlhbE1vdW50V2l0aEVycm9ySGFuZGxpbmc6IGZ1bmN0aW9uIChyZW5kZXJlZEVsZW1lbnQsIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCB0cmFuc2FjdGlvbiwgY29udGV4dCkge1xuICAgIHZhciBtYXJrdXA7XG4gICAgdmFyIGNoZWNrcG9pbnQgPSB0cmFuc2FjdGlvbi5jaGVja3BvaW50KCk7XG4gICAgdHJ5IHtcbiAgICAgIG1hcmt1cCA9IHRoaXMucGVyZm9ybUluaXRpYWxNb3VudChyZW5kZXJlZEVsZW1lbnQsIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gUm9sbCBiYWNrIHRvIGNoZWNrcG9pbnQsIGhhbmRsZSBlcnJvciAod2hpY2ggbWF5IGFkZCBpdGVtcyB0byB0aGUgdHJhbnNhY3Rpb24pLCBhbmQgdGFrZSBhIG5ldyBjaGVja3BvaW50XG4gICAgICB0cmFuc2FjdGlvbi5yb2xsYmFjayhjaGVja3BvaW50KTtcbiAgICAgIHRoaXMuX2luc3RhbmNlLnVuc3RhYmxlX2hhbmRsZUVycm9yKGUpO1xuICAgICAgaWYgKHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlKSB7XG4gICAgICAgIHRoaXMuX2luc3RhbmNlLnN0YXRlID0gdGhpcy5fcHJvY2Vzc1BlbmRpbmdTdGF0ZSh0aGlzLl9pbnN0YW5jZS5wcm9wcywgdGhpcy5faW5zdGFuY2UuY29udGV4dCk7XG4gICAgICB9XG4gICAgICBjaGVja3BvaW50ID0gdHJhbnNhY3Rpb24uY2hlY2twb2ludCgpO1xuXG4gICAgICB0aGlzLl9yZW5kZXJlZENvbXBvbmVudC51bm1vdW50Q29tcG9uZW50KHRydWUpO1xuICAgICAgdHJhbnNhY3Rpb24ucm9sbGJhY2soY2hlY2twb2ludCk7XG5cbiAgICAgIC8vIFRyeSBhZ2FpbiAtIHdlJ3ZlIGluZm9ybWVkIHRoZSBjb21wb25lbnQgYWJvdXQgdGhlIGVycm9yLCBzbyB0aGV5IGNhbiByZW5kZXIgYW4gZXJyb3IgbWVzc2FnZSB0aGlzIHRpbWUuXG4gICAgICAvLyBJZiB0aGlzIHRocm93cyBhZ2FpbiwgdGhlIGVycm9yIHdpbGwgYnViYmxlIHVwIChhbmQgY2FuIGJlIGNhdWdodCBieSBhIGhpZ2hlciBlcnJvciBib3VuZGFyeSkuXG4gICAgICBtYXJrdXAgPSB0aGlzLnBlcmZvcm1Jbml0aWFsTW91bnQocmVuZGVyZWRFbGVtZW50LCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gbWFya3VwO1xuICB9LFxuXG4gIHBlcmZvcm1Jbml0aWFsTW91bnQ6IGZ1bmN0aW9uIChyZW5kZXJlZEVsZW1lbnQsIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCB0cmFuc2FjdGlvbiwgY29udGV4dCkge1xuICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7XG5cbiAgICB2YXIgZGVidWdJRCA9IDA7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBkZWJ1Z0lEID0gdGhpcy5fZGVidWdJRDtcbiAgICB9XG5cbiAgICBpZiAoaW5zdC5jb21wb25lbnRXaWxsTW91bnQpIHtcbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGluc3QuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICAgIH0sIGRlYnVnSUQsICdjb21wb25lbnRXaWxsTW91bnQnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3QuY29tcG9uZW50V2lsbE1vdW50KCk7XG4gICAgICB9XG4gICAgICAvLyBXaGVuIG1vdW50aW5nLCBjYWxscyB0byBgc2V0U3RhdGVgIGJ5IGBjb21wb25lbnRXaWxsTW91bnRgIHdpbGwgc2V0XG4gICAgICAvLyBgdGhpcy5fcGVuZGluZ1N0YXRlUXVldWVgIHdpdGhvdXQgdHJpZ2dlcmluZyBhIHJlLXJlbmRlci5cbiAgICAgIGlmICh0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSkge1xuICAgICAgICBpbnN0LnN0YXRlID0gdGhpcy5fcHJvY2Vzc1BlbmRpbmdTdGF0ZShpbnN0LnByb3BzLCBpbnN0LmNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIG5vdCBhIHN0YXRlbGVzcyBjb21wb25lbnQsIHdlIG5vdyByZW5kZXJcbiAgICBpZiAocmVuZGVyZWRFbGVtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlbmRlcmVkRWxlbWVudCA9IHRoaXMuX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCgpO1xuICAgIH1cblxuICAgIHZhciBub2RlVHlwZSA9IFJlYWN0Tm9kZVR5cGVzLmdldFR5cGUocmVuZGVyZWRFbGVtZW50KTtcbiAgICB0aGlzLl9yZW5kZXJlZE5vZGVUeXBlID0gbm9kZVR5cGU7XG4gICAgdmFyIGNoaWxkID0gdGhpcy5faW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChyZW5kZXJlZEVsZW1lbnQsIG5vZGVUeXBlICE9PSBSZWFjdE5vZGVUeXBlcy5FTVBUWSAvKiBzaG91bGRIYXZlRGVidWdJRCAqL1xuICAgICk7XG4gICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQgPSBjaGlsZDtcblxuICAgIHZhciBtYXJrdXAgPSBSZWFjdFJlY29uY2lsZXIubW91bnRDb21wb25lbnQoY2hpbGQsIHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgdGhpcy5fcHJvY2Vzc0NoaWxkQ29udGV4dChjb250ZXh0KSwgZGVidWdJRCk7XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChkZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIHZhciBjaGlsZERlYnVnSURzID0gY2hpbGQuX2RlYnVnSUQgIT09IDAgPyBbY2hpbGQuX2RlYnVnSURdIDogW107XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblNldENoaWxkcmVuKGRlYnVnSUQsIGNoaWxkRGVidWdJRHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXJrdXA7XG4gIH0sXG5cbiAgZ2V0SG9zdE5vZGU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gUmVhY3RSZWNvbmNpbGVyLmdldEhvc3ROb2RlKHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50KTtcbiAgfSxcblxuICAvKipcbiAgICogUmVsZWFzZXMgYW55IHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgYG1vdW50Q29tcG9uZW50YC5cbiAgICpcbiAgICogQGZpbmFsXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdW5tb3VudENvbXBvbmVudDogZnVuY3Rpb24gKHNhZmVseSkge1xuICAgIGlmICghdGhpcy5fcmVuZGVyZWRDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaW5zdCA9IHRoaXMuX2luc3RhbmNlO1xuXG4gICAgaWYgKGluc3QuY29tcG9uZW50V2lsbFVubW91bnQgJiYgIWluc3QuX2NhbGxlZENvbXBvbmVudFdpbGxVbm1vdW50KSB7XG4gICAgICBpbnN0Ll9jYWxsZWRDb21wb25lbnRXaWxsVW5tb3VudCA9IHRydWU7XG5cbiAgICAgIGlmIChzYWZlbHkpIHtcbiAgICAgICAgdmFyIG5hbWUgPSB0aGlzLmdldE5hbWUoKSArICcuY29tcG9uZW50V2lsbFVubW91bnQoKSc7XG4gICAgICAgIFJlYWN0RXJyb3JVdGlscy5pbnZva2VHdWFyZGVkQ2FsbGJhY2sobmFtZSwgaW5zdC5jb21wb25lbnRXaWxsVW5tb3VudC5iaW5kKGluc3QpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnN0LmNvbXBvbmVudFdpbGxVbm1vdW50KCk7XG4gICAgICAgICAgfSwgdGhpcy5fZGVidWdJRCwgJ2NvbXBvbmVudFdpbGxVbm1vdW50Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5zdC5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50KSB7XG4gICAgICBSZWFjdFJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudCh0aGlzLl9yZW5kZXJlZENvbXBvbmVudCwgc2FmZWx5KTtcbiAgICAgIHRoaXMuX3JlbmRlcmVkTm9kZVR5cGUgPSBudWxsO1xuICAgICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQgPSBudWxsO1xuICAgICAgdGhpcy5faW5zdGFuY2UgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHBlbmRpbmcgZmllbGRzXG4gICAgLy8gRXZlbiBpZiB0aGlzIGNvbXBvbmVudCBpcyBzY2hlZHVsZWQgZm9yIGFub3RoZXIgdXBkYXRlIGluIFJlYWN0VXBkYXRlcyxcbiAgICAvLyBpdCB3b3VsZCBzdGlsbCBiZSBpZ25vcmVkIGJlY2F1c2UgdGhlc2UgZmllbGRzIGFyZSByZXNldC5cbiAgICB0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IG51bGw7XG4gICAgdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZSA9IGZhbHNlO1xuICAgIHRoaXMuX3BlbmRpbmdDYWxsYmFja3MgPSBudWxsO1xuICAgIHRoaXMuX3BlbmRpbmdFbGVtZW50ID0gbnVsbDtcblxuICAgIC8vIFRoZXNlIGZpZWxkcyBkbyBub3QgcmVhbGx5IG5lZWQgdG8gYmUgcmVzZXQgc2luY2UgdGhpcyBvYmplY3QgaXMgbm9cbiAgICAvLyBsb25nZXIgYWNjZXNzaWJsZS5cbiAgICB0aGlzLl9jb250ZXh0ID0gbnVsbDtcbiAgICB0aGlzLl9yb290Tm9kZUlEID0gMDtcbiAgICB0aGlzLl90b3BMZXZlbFdyYXBwZXIgPSBudWxsO1xuXG4gICAgLy8gRGVsZXRlIHRoZSByZWZlcmVuY2UgZnJvbSB0aGUgaW5zdGFuY2UgdG8gdGhpcyBpbnRlcm5hbCByZXByZXNlbnRhdGlvblxuICAgIC8vIHdoaWNoIGFsbG93IHRoZSBpbnRlcm5hbHMgdG8gYmUgcHJvcGVybHkgY2xlYW5lZCB1cCBldmVuIGlmIHRoZSB1c2VyXG4gICAgLy8gbGVha3MgYSByZWZlcmVuY2UgdG8gdGhlIHB1YmxpYyBpbnN0YW5jZS5cbiAgICBSZWFjdEluc3RhbmNlTWFwLnJlbW92ZShpbnN0KTtcblxuICAgIC8vIFNvbWUgZXhpc3RpbmcgY29tcG9uZW50cyByZWx5IG9uIGluc3QucHJvcHMgZXZlbiBhZnRlciB0aGV5J3ZlIGJlZW5cbiAgICAvLyBkZXN0cm95ZWQgKGluIGV2ZW50IGhhbmRsZXJzKS5cbiAgICAvLyBUT0RPOiBpbnN0LnByb3BzID0gbnVsbDtcbiAgICAvLyBUT0RPOiBpbnN0LnN0YXRlID0gbnVsbDtcbiAgICAvLyBUT0RPOiBpbnN0LmNvbnRleHQgPSBudWxsO1xuICB9LFxuXG4gIC8qKlxuICAgKiBGaWx0ZXJzIHRoZSBjb250ZXh0IG9iamVjdCB0byBvbmx5IGNvbnRhaW4ga2V5cyBzcGVjaWZpZWQgaW5cbiAgICogYGNvbnRleHRUeXBlc2BcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICogQHJldHVybiB7P29iamVjdH1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9tYXNrQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTtcbiAgICB2YXIgY29udGV4dFR5cGVzID0gQ29tcG9uZW50LmNvbnRleHRUeXBlcztcbiAgICBpZiAoIWNvbnRleHRUeXBlcykge1xuICAgICAgcmV0dXJuIGVtcHR5T2JqZWN0O1xuICAgIH1cbiAgICB2YXIgbWFza2VkQ29udGV4dCA9IHt9O1xuICAgIGZvciAodmFyIGNvbnRleHROYW1lIGluIGNvbnRleHRUeXBlcykge1xuICAgICAgbWFza2VkQ29udGV4dFtjb250ZXh0TmFtZV0gPSBjb250ZXh0W2NvbnRleHROYW1lXTtcbiAgICB9XG4gICAgcmV0dXJuIG1hc2tlZENvbnRleHQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgdGhlIGNvbnRleHQgb2JqZWN0IHRvIG9ubHkgY29udGFpbiBrZXlzIHNwZWNpZmllZCBpblxuICAgKiBgY29udGV4dFR5cGVzYCwgYW5kIGFzc2VydHMgdGhhdCB0aGV5IGFyZSB2YWxpZC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICogQHJldHVybiB7P29iamVjdH1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wcm9jZXNzQ29udGV4dDogZnVuY3Rpb24gKGNvbnRleHQpIHtcbiAgICB2YXIgbWFza2VkQ29udGV4dCA9IHRoaXMuX21hc2tDb250ZXh0KGNvbnRleHQpO1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIENvbXBvbmVudCA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG4gICAgICBpZiAoQ29tcG9uZW50LmNvbnRleHRUeXBlcykge1xuICAgICAgICB0aGlzLl9jaGVja0NvbnRleHRUeXBlcyhDb21wb25lbnQuY29udGV4dFR5cGVzLCBtYXNrZWRDb250ZXh0LCAnY29udGV4dCcpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFza2VkQ29udGV4dDtcbiAgfSxcblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IGN1cnJlbnRDb250ZXh0XG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wcm9jZXNzQ2hpbGRDb250ZXh0OiBmdW5jdGlvbiAoY3VycmVudENvbnRleHQpIHtcbiAgICB2YXIgQ29tcG9uZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTtcbiAgICB2YXIgaW5zdCA9IHRoaXMuX2luc3RhbmNlO1xuICAgIHZhciBjaGlsZENvbnRleHQ7XG5cbiAgICBpZiAoaW5zdC5nZXRDaGlsZENvbnRleHQpIHtcbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWdpblByb2Nlc3NpbmdDaGlsZENvbnRleHQoKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjaGlsZENvbnRleHQgPSBpbnN0LmdldENoaWxkQ29udGV4dCgpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkVuZFByb2Nlc3NpbmdDaGlsZENvbnRleHQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hpbGRDb250ZXh0ID0gaW5zdC5nZXRDaGlsZENvbnRleHQoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2hpbGRDb250ZXh0KSB7XG4gICAgICAhKHR5cGVvZiBDb21wb25lbnQuY2hpbGRDb250ZXh0VHlwZXMgPT09ICdvYmplY3QnKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMuZ2V0Q2hpbGRDb250ZXh0KCk6IGNoaWxkQ29udGV4dFR5cGVzIG11c3QgYmUgZGVmaW5lZCBpbiBvcmRlciB0byB1c2UgZ2V0Q2hpbGRDb250ZXh0KCkuJywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiBfcHJvZEludmFyaWFudCgnMTA3JywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tDb250ZXh0VHlwZXMoQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzLCBjaGlsZENvbnRleHQsICdjaGlsZCBjb250ZXh0Jyk7XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBuYW1lIGluIGNoaWxkQ29udGV4dCkge1xuICAgICAgICAhKG5hbWUgaW4gQ29tcG9uZW50LmNoaWxkQ29udGV4dFR5cGVzKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMuZ2V0Q2hpbGRDb250ZXh0KCk6IGtleSBcIiVzXCIgaXMgbm90IGRlZmluZWQgaW4gY2hpbGRDb250ZXh0VHlwZXMuJywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JywgbmFtZSkgOiBfcHJvZEludmFyaWFudCgnMTA4JywgdGhpcy5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JywgbmFtZSkgOiB2b2lkIDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gX2Fzc2lnbih7fSwgY3VycmVudENvbnRleHQsIGNoaWxkQ29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBjdXJyZW50Q29udGV4dDtcbiAgfSxcblxuICAvKipcbiAgICogQXNzZXJ0IHRoYXQgdGhlIGNvbnRleHQgdHlwZXMgYXJlIHZhbGlkXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSB0eXBlU3BlY3MgTWFwIG9mIGNvbnRleHQgZmllbGQgdG8gYSBSZWFjdFByb3BUeXBlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgUnVudGltZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHR5cGUtY2hlY2tlZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb24gZS5nLiBcInByb3BcIiwgXCJjb250ZXh0XCIsIFwiY2hpbGQgY29udGV4dFwiXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2hlY2tDb250ZXh0VHlwZXM6IGZ1bmN0aW9uICh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24pIHtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGNoZWNrUmVhY3RUeXBlU3BlYyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIHRoaXMuZ2V0TmFtZSgpLCBudWxsLCB0aGlzLl9kZWJ1Z0lEKTtcbiAgICB9XG4gIH0sXG5cbiAgcmVjZWl2ZUNvbXBvbmVudDogZnVuY3Rpb24gKG5leHRFbGVtZW50LCB0cmFuc2FjdGlvbiwgbmV4dENvbnRleHQpIHtcbiAgICB2YXIgcHJldkVsZW1lbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudDtcbiAgICB2YXIgcHJldkNvbnRleHQgPSB0aGlzLl9jb250ZXh0O1xuXG4gICAgdGhpcy5fcGVuZGluZ0VsZW1lbnQgPSBudWxsO1xuXG4gICAgdGhpcy51cGRhdGVDb21wb25lbnQodHJhbnNhY3Rpb24sIHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCwgcHJldkNvbnRleHQsIG5leHRDb250ZXh0KTtcbiAgfSxcblxuICAvKipcbiAgICogSWYgYW55IG9mIGBfcGVuZGluZ0VsZW1lbnRgLCBgX3BlbmRpbmdTdGF0ZVF1ZXVlYCwgb3IgYF9wZW5kaW5nRm9yY2VVcGRhdGVgXG4gICAqIGlzIHNldCwgdXBkYXRlIHRoZSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwZXJmb3JtVXBkYXRlSWZOZWNlc3Nhcnk6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbikge1xuICAgIGlmICh0aGlzLl9wZW5kaW5nRWxlbWVudCAhPSBudWxsKSB7XG4gICAgICBSZWFjdFJlY29uY2lsZXIucmVjZWl2ZUNvbXBvbmVudCh0aGlzLCB0aGlzLl9wZW5kaW5nRWxlbWVudCwgdHJhbnNhY3Rpb24sIHRoaXMuX2NvbnRleHQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fcGVuZGluZ1N0YXRlUXVldWUgIT09IG51bGwgfHwgdGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudCh0cmFuc2FjdGlvbiwgdGhpcy5fY3VycmVudEVsZW1lbnQsIHRoaXMuX2N1cnJlbnRFbGVtZW50LCB0aGlzLl9jb250ZXh0LCB0aGlzLl9jb250ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdXBkYXRlQmF0Y2hOdW1iZXIgPSBudWxsO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogUGVyZm9ybSBhbiB1cGRhdGUgdG8gYSBtb3VudGVkIGNvbXBvbmVudC4gVGhlIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgYW5kXG4gICAqIHNob3VsZENvbXBvbmVudFVwZGF0ZSBtZXRob2RzIGFyZSBjYWxsZWQsIHRoZW4gKGFzc3VtaW5nIHRoZSB1cGRhdGUgaXNuJ3RcbiAgICogc2tpcHBlZCkgdGhlIHJlbWFpbmluZyB1cGRhdGUgbGlmZWN5Y2xlIG1ldGhvZHMgYXJlIGNhbGxlZCBhbmQgdGhlIERPTVxuICAgKiByZXByZXNlbnRhdGlvbiBpcyB1cGRhdGVkLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGlzIGltcGxlbWVudHMgUmVhY3QncyByZW5kZXJpbmcgYW5kIHJlY29uY2lsaWF0aW9uIGFsZ29yaXRobS5cbiAgICogU29waGlzdGljYXRlZCBjbGllbnRzIG1heSB3aXNoIHRvIG92ZXJyaWRlIHRoaXMuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IHByZXZQYXJlbnRFbGVtZW50XG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0UGFyZW50RWxlbWVudFxuICAgKiBAaW50ZXJuYWxcbiAgICogQG92ZXJyaWRhYmxlXG4gICAqL1xuICB1cGRhdGVDb21wb25lbnQ6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgcHJldlBhcmVudEVsZW1lbnQsIG5leHRQYXJlbnRFbGVtZW50LCBwcmV2VW5tYXNrZWRDb250ZXh0LCBuZXh0VW5tYXNrZWRDb250ZXh0KSB7XG4gICAgdmFyIGluc3QgPSB0aGlzLl9pbnN0YW5jZTtcbiAgICAhKGluc3QgIT0gbnVsbCkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0F0dGVtcHRlZCB0byB1cGRhdGUgY29tcG9uZW50IGAlc2AgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHVubW91bnRlZCAob3IgZmFpbGVkIHRvIG1vdW50KS4nLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IF9wcm9kSW52YXJpYW50KCcxMzYnLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IHZvaWQgMDtcblxuICAgIHZhciB3aWxsUmVjZWl2ZSA9IGZhbHNlO1xuICAgIHZhciBuZXh0Q29udGV4dDtcblxuICAgIC8vIERldGVybWluZSBpZiB0aGUgY29udGV4dCBoYXMgY2hhbmdlZCBvciBub3RcbiAgICBpZiAodGhpcy5fY29udGV4dCA9PT0gbmV4dFVubWFza2VkQ29udGV4dCkge1xuICAgICAgbmV4dENvbnRleHQgPSBpbnN0LmNvbnRleHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRDb250ZXh0ID0gdGhpcy5fcHJvY2Vzc0NvbnRleHQobmV4dFVubWFza2VkQ29udGV4dCk7XG4gICAgICB3aWxsUmVjZWl2ZSA9IHRydWU7XG4gICAgfVxuXG4gICAgdmFyIHByZXZQcm9wcyA9IHByZXZQYXJlbnRFbGVtZW50LnByb3BzO1xuICAgIHZhciBuZXh0UHJvcHMgPSBuZXh0UGFyZW50RWxlbWVudC5wcm9wcztcblxuICAgIC8vIE5vdCBhIHNpbXBsZSBzdGF0ZSB1cGRhdGUgYnV0IGEgcHJvcHMgdXBkYXRlXG4gICAgaWYgKHByZXZQYXJlbnRFbGVtZW50ICE9PSBuZXh0UGFyZW50RWxlbWVudCkge1xuICAgICAgd2lsbFJlY2VpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIEFuIHVwZGF0ZSBoZXJlIHdpbGwgc2NoZWR1bGUgYW4gdXBkYXRlIGJ1dCBpbW1lZGlhdGVseSBzZXRcbiAgICAvLyBfcGVuZGluZ1N0YXRlUXVldWUgd2hpY2ggd2lsbCBlbnN1cmUgdGhhdCBhbnkgc3RhdGUgdXBkYXRlcyBnZXRzXG4gICAgLy8gaW1tZWRpYXRlbHkgcmVjb25jaWxlZCBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBuZXh0IGJhdGNoLlxuICAgIGlmICh3aWxsUmVjZWl2ZSAmJiBpbnN0LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMpIHtcbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGluc3QuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICAgICAgfSwgdGhpcy5fZGVidWdJRCwgJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluc3QuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgbmV4dFN0YXRlID0gdGhpcy5fcHJvY2Vzc1BlbmRpbmdTdGF0ZShuZXh0UHJvcHMsIG5leHRDb250ZXh0KTtcbiAgICB2YXIgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcblxuICAgIGlmICghdGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlKSB7XG4gICAgICBpZiAoaW5zdC5zaG91bGRDb21wb25lbnRVcGRhdGUpIHtcbiAgICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgc2hvdWxkVXBkYXRlID0gbWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIGluc3Quc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICAgICAgfSwgdGhpcy5fZGVidWdJRCwgJ3Nob3VsZENvbXBvbmVudFVwZGF0ZScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNob3VsZFVwZGF0ZSA9IGluc3Quc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLl9jb21wb3NpdGVUeXBlID09PSBDb21wb3NpdGVUeXBlcy5QdXJlQ2xhc3MpIHtcbiAgICAgICAgICBzaG91bGRVcGRhdGUgPSAhc2hhbGxvd0VxdWFsKHByZXZQcm9wcywgbmV4dFByb3BzKSB8fCAhc2hhbGxvd0VxdWFsKGluc3Quc3RhdGUsIG5leHRTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhzaG91bGRVcGRhdGUgIT09IHVuZGVmaW5lZCwgJyVzLnNob3VsZENvbXBvbmVudFVwZGF0ZSgpOiBSZXR1cm5lZCB1bmRlZmluZWQgaW5zdGVhZCBvZiBhICcgKyAnYm9vbGVhbiB2YWx1ZS4gTWFrZSBzdXJlIHRvIHJldHVybiB0cnVlIG9yIGZhbHNlLicsIHRoaXMuZ2V0TmFtZSgpIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIHRoaXMuX3VwZGF0ZUJhdGNoTnVtYmVyID0gbnVsbDtcbiAgICBpZiAoc2hvdWxkVXBkYXRlKSB7XG4gICAgICB0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGUgPSBmYWxzZTtcbiAgICAgIC8vIFdpbGwgc2V0IGB0aGlzLnByb3BzYCwgYHRoaXMuc3RhdGVgIGFuZCBgdGhpcy5jb250ZXh0YC5cbiAgICAgIHRoaXMuX3BlcmZvcm1Db21wb25lbnRVcGRhdGUobmV4dFBhcmVudEVsZW1lbnQsIG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCwgdHJhbnNhY3Rpb24sIG5leHRVbm1hc2tlZENvbnRleHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBpdCdzIGRldGVybWluZWQgdGhhdCBhIGNvbXBvbmVudCBzaG91bGQgbm90IHVwZGF0ZSwgd2Ugc3RpbGwgd2FudFxuICAgICAgLy8gdG8gc2V0IHByb3BzIGFuZCBzdGF0ZSBidXQgd2Ugc2hvcnRjdXQgdGhlIHJlc3Qgb2YgdGhlIHVwZGF0ZS5cbiAgICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dFBhcmVudEVsZW1lbnQ7XG4gICAgICB0aGlzLl9jb250ZXh0ID0gbmV4dFVubWFza2VkQ29udGV4dDtcbiAgICAgIGluc3QucHJvcHMgPSBuZXh0UHJvcHM7XG4gICAgICBpbnN0LnN0YXRlID0gbmV4dFN0YXRlO1xuICAgICAgaW5zdC5jb250ZXh0ID0gbmV4dENvbnRleHQ7XG4gICAgfVxuICB9LFxuXG4gIF9wcm9jZXNzUGVuZGluZ1N0YXRlOiBmdW5jdGlvbiAocHJvcHMsIGNvbnRleHQpIHtcbiAgICB2YXIgaW5zdCA9IHRoaXMuX2luc3RhbmNlO1xuICAgIHZhciBxdWV1ZSA9IHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlO1xuICAgIHZhciByZXBsYWNlID0gdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZTtcbiAgICB0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlID0gZmFsc2U7XG4gICAgdGhpcy5fcGVuZGluZ1N0YXRlUXVldWUgPSBudWxsO1xuXG4gICAgaWYgKCFxdWV1ZSkge1xuICAgICAgcmV0dXJuIGluc3Quc3RhdGU7XG4gICAgfVxuXG4gICAgaWYgKHJlcGxhY2UgJiYgcXVldWUubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gcXVldWVbMF07XG4gICAgfVxuXG4gICAgdmFyIG5leHRTdGF0ZSA9IF9hc3NpZ24oe30sIHJlcGxhY2UgPyBxdWV1ZVswXSA6IGluc3Quc3RhdGUpO1xuICAgIGZvciAodmFyIGkgPSByZXBsYWNlID8gMSA6IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhcnRpYWwgPSBxdWV1ZVtpXTtcbiAgICAgIF9hc3NpZ24obmV4dFN0YXRlLCB0eXBlb2YgcGFydGlhbCA9PT0gJ2Z1bmN0aW9uJyA/IHBhcnRpYWwuY2FsbChpbnN0LCBuZXh0U3RhdGUsIHByb3BzLCBjb250ZXh0KSA6IHBhcnRpYWwpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXh0U3RhdGU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIE1lcmdlcyBuZXcgcHJvcHMgYW5kIHN0YXRlLCBub3RpZmllcyBkZWxlZ2F0ZSBtZXRob2RzIG9mIHVwZGF0ZSBhbmRcbiAgICogcGVyZm9ybXMgdXBkYXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dEVsZW1lbnQgTmV4dCBlbGVtZW50XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBuZXh0UHJvcHMgTmV4dCBwdWJsaWMgb2JqZWN0IHRvIHNldCBhcyBwcm9wZXJ0aWVzLlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHRTdGF0ZSBOZXh0IG9iamVjdCB0byBzZXQgYXMgc3RhdGUuXG4gICAqIEBwYXJhbSB7P29iamVjdH0gbmV4dENvbnRleHQgTmV4dCBwdWJsaWMgb2JqZWN0IHRvIHNldCBhcyBjb250ZXh0LlxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7P29iamVjdH0gdW5tYXNrZWRDb250ZXh0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcGVyZm9ybUNvbXBvbmVudFVwZGF0ZTogZnVuY3Rpb24gKG5leHRFbGVtZW50LCBuZXh0UHJvcHMsIG5leHRTdGF0ZSwgbmV4dENvbnRleHQsIHRyYW5zYWN0aW9uLCB1bm1hc2tlZENvbnRleHQpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7XG5cbiAgICB2YXIgaGFzQ29tcG9uZW50RGlkVXBkYXRlID0gQm9vbGVhbihpbnN0LmNvbXBvbmVudERpZFVwZGF0ZSk7XG4gICAgdmFyIHByZXZQcm9wcztcbiAgICB2YXIgcHJldlN0YXRlO1xuICAgIHZhciBwcmV2Q29udGV4dDtcbiAgICBpZiAoaGFzQ29tcG9uZW50RGlkVXBkYXRlKSB7XG4gICAgICBwcmV2UHJvcHMgPSBpbnN0LnByb3BzO1xuICAgICAgcHJldlN0YXRlID0gaW5zdC5zdGF0ZTtcbiAgICAgIHByZXZDb250ZXh0ID0gaW5zdC5jb250ZXh0O1xuICAgIH1cblxuICAgIGlmIChpbnN0LmNvbXBvbmVudFdpbGxVcGRhdGUpIHtcbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBtZWFzdXJlTGlmZUN5Y2xlUGVyZihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGluc3QuY29tcG9uZW50V2lsbFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSwgbmV4dENvbnRleHQpO1xuICAgICAgICB9LCB0aGlzLl9kZWJ1Z0lELCAnY29tcG9uZW50V2lsbFVwZGF0ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5zdC5jb21wb25lbnRXaWxsVXBkYXRlKG5leHRQcm9wcywgbmV4dFN0YXRlLCBuZXh0Q29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBuZXh0RWxlbWVudDtcbiAgICB0aGlzLl9jb250ZXh0ID0gdW5tYXNrZWRDb250ZXh0O1xuICAgIGluc3QucHJvcHMgPSBuZXh0UHJvcHM7XG4gICAgaW5zdC5zdGF0ZSA9IG5leHRTdGF0ZTtcbiAgICBpbnN0LmNvbnRleHQgPSBuZXh0Q29udGV4dDtcblxuICAgIHRoaXMuX3VwZGF0ZVJlbmRlcmVkQ29tcG9uZW50KHRyYW5zYWN0aW9uLCB1bm1hc2tlZENvbnRleHQpO1xuXG4gICAgaWYgKGhhc0NvbXBvbmVudERpZFVwZGF0ZSkge1xuICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG1lYXN1cmVMaWZlQ3ljbGVQZXJmKGluc3QuY29tcG9uZW50RGlkVXBkYXRlLmJpbmQoaW5zdCwgcHJldlByb3BzLCBwcmV2U3RhdGUsIHByZXZDb250ZXh0KSwgX3RoaXMyLl9kZWJ1Z0lELCAnY29tcG9uZW50RGlkVXBkYXRlJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShpbnN0LmNvbXBvbmVudERpZFVwZGF0ZS5iaW5kKGluc3QsIHByZXZQcm9wcywgcHJldlN0YXRlLCBwcmV2Q29udGV4dCksIGluc3QpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQ2FsbCB0aGUgY29tcG9uZW50J3MgYHJlbmRlcmAgbWV0aG9kIGFuZCB1cGRhdGUgdGhlIERPTSBhY2NvcmRpbmdseS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF91cGRhdGVSZW5kZXJlZENvbXBvbmVudDogZnVuY3Rpb24gKHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgdmFyIHByZXZDb21wb25lbnRJbnN0YW5jZSA9IHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50O1xuICAgIHZhciBwcmV2UmVuZGVyZWRFbGVtZW50ID0gcHJldkNvbXBvbmVudEluc3RhbmNlLl9jdXJyZW50RWxlbWVudDtcbiAgICB2YXIgbmV4dFJlbmRlcmVkRWxlbWVudCA9IHRoaXMuX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCgpO1xuXG4gICAgdmFyIGRlYnVnSUQgPSAwO1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgZGVidWdJRCA9IHRoaXMuX2RlYnVnSUQ7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50KHByZXZSZW5kZXJlZEVsZW1lbnQsIG5leHRSZW5kZXJlZEVsZW1lbnQpKSB7XG4gICAgICBSZWFjdFJlY29uY2lsZXIucmVjZWl2ZUNvbXBvbmVudChwcmV2Q29tcG9uZW50SW5zdGFuY2UsIG5leHRSZW5kZXJlZEVsZW1lbnQsIHRyYW5zYWN0aW9uLCB0aGlzLl9wcm9jZXNzQ2hpbGRDb250ZXh0KGNvbnRleHQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIG9sZEhvc3ROb2RlID0gUmVhY3RSZWNvbmNpbGVyLmdldEhvc3ROb2RlKHByZXZDb21wb25lbnRJbnN0YW5jZSk7XG4gICAgICBSZWFjdFJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudChwcmV2Q29tcG9uZW50SW5zdGFuY2UsIGZhbHNlKTtcblxuICAgICAgdmFyIG5vZGVUeXBlID0gUmVhY3ROb2RlVHlwZXMuZ2V0VHlwZShuZXh0UmVuZGVyZWRFbGVtZW50KTtcbiAgICAgIHRoaXMuX3JlbmRlcmVkTm9kZVR5cGUgPSBub2RlVHlwZTtcbiAgICAgIHZhciBjaGlsZCA9IHRoaXMuX2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQobmV4dFJlbmRlcmVkRWxlbWVudCwgbm9kZVR5cGUgIT09IFJlYWN0Tm9kZVR5cGVzLkVNUFRZIC8qIHNob3VsZEhhdmVEZWJ1Z0lEICovXG4gICAgICApO1xuICAgICAgdGhpcy5fcmVuZGVyZWRDb21wb25lbnQgPSBjaGlsZDtcblxuICAgICAgdmFyIG5leHRNYXJrdXAgPSBSZWFjdFJlY29uY2lsZXIubW91bnRDb21wb25lbnQoY2hpbGQsIHRyYW5zYWN0aW9uLCB0aGlzLl9ob3N0UGFyZW50LCB0aGlzLl9ob3N0Q29udGFpbmVySW5mbywgdGhpcy5fcHJvY2Vzc0NoaWxkQ29udGV4dChjb250ZXh0KSwgZGVidWdJRCk7XG5cbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBpZiAoZGVidWdJRCAhPT0gMCkge1xuICAgICAgICAgIHZhciBjaGlsZERlYnVnSURzID0gY2hpbGQuX2RlYnVnSUQgIT09IDAgPyBbY2hpbGQuX2RlYnVnSURdIDogW107XG4gICAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4oZGVidWdJRCwgY2hpbGREZWJ1Z0lEcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fcmVwbGFjZU5vZGVXaXRoTWFya3VwKG9sZEhvc3ROb2RlLCBuZXh0TWFya3VwLCBwcmV2Q29tcG9uZW50SW5zdGFuY2UpO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogT3ZlcnJpZGRlbiBpbiBzaGFsbG93IHJlbmRlcmluZy5cbiAgICpcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgX3JlcGxhY2VOb2RlV2l0aE1hcmt1cDogZnVuY3Rpb24gKG9sZEhvc3ROb2RlLCBuZXh0TWFya3VwLCBwcmV2SW5zdGFuY2UpIHtcbiAgICBSZWFjdENvbXBvbmVudEVudmlyb25tZW50LnJlcGxhY2VOb2RlV2l0aE1hcmt1cChvbGRIb3N0Tm9kZSwgbmV4dE1hcmt1cCwgcHJldkluc3RhbmNlKTtcbiAgfSxcblxuICAvKipcbiAgICogQHByb3RlY3RlZFxuICAgKi9cbiAgX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudFdpdGhvdXRPd25lck9yQ29udGV4dDogZnVuY3Rpb24gKCkge1xuICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7XG4gICAgdmFyIHJlbmRlcmVkRWxlbWVudDtcblxuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgcmVuZGVyZWRFbGVtZW50ID0gbWVhc3VyZUxpZmVDeWNsZVBlcmYoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gaW5zdC5yZW5kZXIoKTtcbiAgICAgIH0sIHRoaXMuX2RlYnVnSUQsICdyZW5kZXInKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVuZGVyZWRFbGVtZW50ID0gaW5zdC5yZW5kZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIC8vIFdlIGFsbG93IGF1dG8tbW9ja3MgdG8gcHJvY2VlZCBhcyBpZiB0aGV5J3JlIHJldHVybmluZyBudWxsLlxuICAgICAgaWYgKHJlbmRlcmVkRWxlbWVudCA9PT0gdW5kZWZpbmVkICYmIGluc3QucmVuZGVyLl9pc01vY2tGdW5jdGlvbikge1xuICAgICAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGJhZCBwcmFjdGljZS4gQ29uc2lkZXIgd2FybmluZyBoZXJlIGFuZFxuICAgICAgICAvLyBkZXByZWNhdGluZyB0aGlzIGNvbnZlbmllbmNlLlxuICAgICAgICByZW5kZXJlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZW5kZXJlZEVsZW1lbnQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlbmRlcmVkRWxlbWVudDtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgfHwgdGhpcy5fY29tcG9zaXRlVHlwZSAhPT0gQ29tcG9zaXRlVHlwZXMuU3RhdGVsZXNzRnVuY3Rpb25hbCkge1xuICAgICAgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9IHRoaXM7XG4gICAgICB0cnkge1xuICAgICAgICByZW5kZXJlZEVsZW1lbnQgPSB0aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnRXaXRob3V0T3duZXJPckNvbnRleHQoKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZW5kZXJlZEVsZW1lbnQgPSB0aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnRXaXRob3V0T3duZXJPckNvbnRleHQoKTtcbiAgICB9XG4gICAgIShcbiAgICAvLyBUT0RPOiBBbiBgaXNWYWxpZE5vZGVgIGZ1bmN0aW9uIHdvdWxkIHByb2JhYmx5IGJlIG1vcmUgYXBwcm9wcmlhdGVcbiAgICByZW5kZXJlZEVsZW1lbnQgPT09IG51bGwgfHwgcmVuZGVyZWRFbGVtZW50ID09PSBmYWxzZSB8fCBSZWFjdC5pc1ZhbGlkRWxlbWVudChyZW5kZXJlZEVsZW1lbnQpKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMucmVuZGVyKCk6IEEgdmFsaWQgUmVhY3QgZWxlbWVudCAob3IgbnVsbCkgbXVzdCBiZSByZXR1cm5lZC4gWW91IG1heSBoYXZlIHJldHVybmVkIHVuZGVmaW5lZCwgYW4gYXJyYXkgb3Igc29tZSBvdGhlciBpbnZhbGlkIG9iamVjdC4nLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IF9wcm9kSW52YXJpYW50KCcxMDknLCB0aGlzLmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IHZvaWQgMDtcblxuICAgIHJldHVybiByZW5kZXJlZEVsZW1lbnQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIExhemlseSBhbGxvY2F0ZXMgdGhlIHJlZnMgb2JqZWN0IGFuZCBzdG9yZXMgYGNvbXBvbmVudGAgYXMgYHJlZmAuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWYgUmVmZXJlbmNlIG5hbWUuXG4gICAqIEBwYXJhbSB7Y29tcG9uZW50fSBjb21wb25lbnQgQ29tcG9uZW50IHRvIHN0b3JlIGFzIGByZWZgLlxuICAgKiBAZmluYWxcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGF0dGFjaFJlZjogZnVuY3Rpb24gKHJlZiwgY29tcG9uZW50KSB7XG4gICAgdmFyIGluc3QgPSB0aGlzLmdldFB1YmxpY0luc3RhbmNlKCk7XG4gICAgIShpbnN0ICE9IG51bGwpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdTdGF0ZWxlc3MgZnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgaGF2ZSByZWZzLicpIDogX3Byb2RJbnZhcmlhbnQoJzExMCcpIDogdm9pZCAwO1xuICAgIHZhciBwdWJsaWNDb21wb25lbnRJbnN0YW5jZSA9IGNvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpO1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBjb21wb25lbnQgJiYgY29tcG9uZW50LmdldE5hbWUgPyBjb21wb25lbnQuZ2V0TmFtZSgpIDogJ2EgY29tcG9uZW50JztcbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhwdWJsaWNDb21wb25lbnRJbnN0YW5jZSAhPSBudWxsIHx8IGNvbXBvbmVudC5fY29tcG9zaXRlVHlwZSAhPT0gQ29tcG9zaXRlVHlwZXMuU3RhdGVsZXNzRnVuY3Rpb25hbCwgJ1N0YXRlbGVzcyBmdW5jdGlvbiBjb21wb25lbnRzIGNhbm5vdCBiZSBnaXZlbiByZWZzICcgKyAnKFNlZSByZWYgXCIlc1wiIGluICVzIGNyZWF0ZWQgYnkgJXMpLiAnICsgJ0F0dGVtcHRzIHRvIGFjY2VzcyB0aGlzIHJlZiB3aWxsIGZhaWwuJywgcmVmLCBjb21wb25lbnROYW1lLCB0aGlzLmdldE5hbWUoKSkgOiB2b2lkIDA7XG4gICAgfVxuICAgIHZhciByZWZzID0gaW5zdC5yZWZzID09PSBlbXB0eU9iamVjdCA/IGluc3QucmVmcyA9IHt9IDogaW5zdC5yZWZzO1xuICAgIHJlZnNbcmVmXSA9IHB1YmxpY0NvbXBvbmVudEluc3RhbmNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZXRhY2hlcyBhIHJlZmVyZW5jZSBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmIE5hbWUgdG8gZGVyZWZlcmVuY2UuXG4gICAqIEBmaW5hbFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGV0YWNoUmVmOiBmdW5jdGlvbiAocmVmKSB7XG4gICAgdmFyIHJlZnMgPSB0aGlzLmdldFB1YmxpY0luc3RhbmNlKCkucmVmcztcbiAgICBkZWxldGUgcmVmc1tyZWZdO1xuICB9LFxuXG4gIC8qKlxuICAgKiBHZXQgYSB0ZXh0IGRlc2NyaXB0aW9uIG9mIHRoZSBjb21wb25lbnQgdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSBpdFxuICAgKiBpbiBlcnJvciBtZXNzYWdlcy5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmFtZSBvciBudWxsLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGdldE5hbWU6IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdHlwZSA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG4gICAgdmFyIGNvbnN0cnVjdG9yID0gdGhpcy5faW5zdGFuY2UgJiYgdGhpcy5faW5zdGFuY2UuY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIHR5cGUuZGlzcGxheU5hbWUgfHwgY29uc3RydWN0b3IgJiYgY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgdHlwZS5uYW1lIHx8IGNvbnN0cnVjdG9yICYmIGNvbnN0cnVjdG9yLm5hbWUgfHwgbnVsbDtcbiAgfSxcblxuICAvKipcbiAgICogR2V0IHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29tcG9uZW50IC0gaS5lLiB3aGF0XG4gICAqIGlzIGV4cG9zZWQgYnkgcmVmcyBhbmQgcmV0dXJuZWQgYnkgcmVuZGVyLiBDYW4gYmUgbnVsbCBmb3Igc3RhdGVsZXNzXG4gICAqIGNvbXBvbmVudHMuXG4gICAqXG4gICAqIEByZXR1cm4ge1JlYWN0Q29tcG9uZW50fSB0aGUgcHVibGljIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXRQdWJsaWNJbnN0YW5jZTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBpbnN0ID0gdGhpcy5faW5zdGFuY2U7XG4gICAgaWYgKHRoaXMuX2NvbXBvc2l0ZVR5cGUgPT09IENvbXBvc2l0ZVR5cGVzLlN0YXRlbGVzc0Z1bmN0aW9uYWwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gaW5zdDtcbiAgfSxcblxuICAvLyBTdHViXG4gIF9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50OiBudWxsXG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RDb21wb3NpdGVDb21wb25lbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbi8qIGdsb2JhbHMgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdERlZmF1bHRJbmplY3Rpb24gPSByZXF1aXJlKCcuL1JlYWN0RGVmYXVsdEluamVjdGlvbicpO1xudmFyIFJlYWN0TW91bnQgPSByZXF1aXJlKCcuL1JlYWN0TW91bnQnKTtcbnZhciBSZWFjdFJlY29uY2lsZXIgPSByZXF1aXJlKCcuL1JlYWN0UmVjb25jaWxlcicpO1xudmFyIFJlYWN0VXBkYXRlcyA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVzJyk7XG52YXIgUmVhY3RWZXJzaW9uID0gcmVxdWlyZSgnLi9SZWFjdFZlcnNpb24nKTtcblxudmFyIGZpbmRET01Ob2RlID0gcmVxdWlyZSgnLi9maW5kRE9NTm9kZScpO1xudmFyIGdldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlID0gcmVxdWlyZSgnLi9nZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZScpO1xudmFyIHJlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyID0gcmVxdWlyZSgnLi9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcicpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cblJlYWN0RGVmYXVsdEluamVjdGlvbi5pbmplY3QoKTtcblxudmFyIFJlYWN0RE9NID0ge1xuICBmaW5kRE9NTm9kZTogZmluZERPTU5vZGUsXG4gIHJlbmRlcjogUmVhY3RNb3VudC5yZW5kZXIsXG4gIHVubW91bnRDb21wb25lbnRBdE5vZGU6IFJlYWN0TW91bnQudW5tb3VudENvbXBvbmVudEF0Tm9kZSxcbiAgdmVyc2lvbjogUmVhY3RWZXJzaW9uLFxuXG4gIC8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuICB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlczogUmVhY3RVcGRhdGVzLmJhdGNoZWRVcGRhdGVzLFxuICB1bnN0YWJsZV9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjogcmVuZGVyU3VidHJlZUludG9Db250YWluZXJcbn07XG5cbi8vIEluamVjdCB0aGUgcnVudGltZSBpbnRvIGEgZGV2dG9vbHMgZ2xvYmFsIGhvb2sgcmVnYXJkbGVzcyBvZiBicm93c2VyLlxuLy8gQWxsb3dzIGZvciBkZWJ1Z2dpbmcgd2hlbiB0aGUgaG9vayBpcyBpbmplY3RlZCBvbiB0aGUgcGFnZS5cbmlmICh0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmluamVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uaW5qZWN0KHtcbiAgICBDb21wb25lbnRUcmVlOiB7XG4gICAgICBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZTogUmVhY3RET01Db21wb25lbnRUcmVlLmdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLFxuICAgICAgZ2V0Tm9kZUZyb21JbnN0YW5jZTogZnVuY3Rpb24gKGluc3QpIHtcbiAgICAgICAgLy8gaW5zdCBpcyBhbiBpbnRlcm5hbCBpbnN0YW5jZSAoYnV0IGNvdWxkIGJlIGEgY29tcG9zaXRlKVxuICAgICAgICBpZiAoaW5zdC5fcmVuZGVyZWRDb21wb25lbnQpIHtcbiAgICAgICAgICBpbnN0ID0gZ2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGUoaW5zdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluc3QpIHtcbiAgICAgICAgICByZXR1cm4gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIE1vdW50OiBSZWFjdE1vdW50LFxuICAgIFJlY29uY2lsZXI6IFJlYWN0UmVjb25jaWxlclxuICB9KTtcbn1cblxuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG4gIGlmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgd2luZG93LnRvcCA9PT0gd2luZG93LnNlbGYpIHtcblxuICAgIC8vIEZpcnN0IGNoZWNrIGlmIGRldnRvb2xzIGlzIG5vdCBpbnN0YWxsZWRcbiAgICBpZiAodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIElmIHdlJ3JlIGluIENocm9tZSBvciBGaXJlZm94LCBwcm92aWRlIGEgZG93bmxvYWQgbGluayBpZiBub3QgaW5zdGFsbGVkLlxuICAgICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lJykgPiAtMSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoJ0VkZ2UnKSA9PT0gLTEgfHwgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPiAtMSkge1xuICAgICAgICAvLyBGaXJlZm94IGRvZXMgbm90IGhhdmUgdGhlIGlzc3VlIHdpdGggZGV2dG9vbHMgbG9hZGVkIG92ZXIgZmlsZTovL1xuICAgICAgICB2YXIgc2hvd0ZpbGVVcmxNZXNzYWdlID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sLmluZGV4T2YoJ2h0dHAnKSA9PT0gLTEgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94JykgPT09IC0xO1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdEb3dubG9hZCB0aGUgUmVhY3QgRGV2VG9vbHMgJyArIChzaG93RmlsZVVybE1lc3NhZ2UgPyAnYW5kIHVzZSBhbiBIVFRQIHNlcnZlciAoaW5zdGVhZCBvZiBhIGZpbGU6IFVSTCkgJyA6ICcnKSArICdmb3IgYSBiZXR0ZXIgZGV2ZWxvcG1lbnQgZXhwZXJpZW5jZTogJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWRldnRvb2xzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHRlc3RGdW5jID0gZnVuY3Rpb24gdGVzdEZuKCkge307XG4gICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCh0ZXN0RnVuYy5uYW1lIHx8IHRlc3RGdW5jLnRvU3RyaW5nKCkpLmluZGV4T2YoJ3Rlc3RGbicpICE9PSAtMSwgJ0l0IGxvb2tzIGxpa2UgeW91XFwncmUgdXNpbmcgYSBtaW5pZmllZCBjb3B5IG9mIHRoZSBkZXZlbG9wbWVudCBidWlsZCAnICsgJ29mIFJlYWN0LiBXaGVuIGRlcGxveWluZyBSZWFjdCBhcHBzIHRvIHByb2R1Y3Rpb24sIG1ha2Ugc3VyZSB0byB1c2UgJyArICd0aGUgcHJvZHVjdGlvbiBidWlsZCB3aGljaCBza2lwcyBkZXZlbG9wbWVudCB3YXJuaW5ncyBhbmQgaXMgZmFzdGVyLiAnICsgJ1NlZSBodHRwczovL2ZiLm1lL3JlYWN0LW1pbmlmaWNhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLicpIDogdm9pZCAwO1xuXG4gICAgLy8gSWYgd2UncmUgaW4gSUU4LCBjaGVjayB0byBzZWUgaWYgd2UgYXJlIGluIGNvbXBhdGliaWxpdHkgbW9kZSBhbmQgcHJvdmlkZVxuICAgIC8vIGluZm9ybWF0aW9uIG9uIHByZXZlbnRpbmcgY29tcGF0aWJpbGl0eSBtb2RlXG4gICAgdmFyIGllQ29tcGF0aWJpbGl0eU1vZGUgPSBkb2N1bWVudC5kb2N1bWVudE1vZGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDwgODtcblxuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghaWVDb21wYXRpYmlsaXR5TW9kZSwgJ0ludGVybmV0IEV4cGxvcmVyIGlzIHJ1bm5pbmcgaW4gY29tcGF0aWJpbGl0eSBtb2RlOyBwbGVhc2UgYWRkIHRoZSAnICsgJ2ZvbGxvd2luZyB0YWcgdG8geW91ciBIVE1MIHRvIHByZXZlbnQgdGhpcyBmcm9tIGhhcHBlbmluZzogJyArICc8bWV0YSBodHRwLWVxdWl2PVwiWC1VQS1Db21wYXRpYmxlXCIgY29udGVudD1cIklFPWVkZ2VcIiAvPicpIDogdm9pZCAwO1xuXG4gICAgdmFyIGV4cGVjdGVkRmVhdHVyZXMgPSBbXG4gICAgLy8gc2hpbXNcbiAgICBBcnJheS5pc0FycmF5LCBBcnJheS5wcm90b3R5cGUuZXZlcnksIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLCBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiwgQXJyYXkucHJvdG90eXBlLm1hcCwgRGF0ZS5ub3csIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCBPYmplY3Qua2V5cywgU3RyaW5nLnByb3RvdHlwZS50cmltXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhwZWN0ZWRGZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFleHBlY3RlZEZlYXR1cmVzW2ldKSB7XG4gICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ09uZSBvciBtb3JlIEVTNSBzaGltcyBleHBlY3RlZCBieSBSZWFjdCBhcmUgbm90IGF2YWlsYWJsZTogJyArICdodHRwczovL2ZiLm1lL3JlYWN0LXdhcm5pbmctcG9seWZpbGxzJykgOiB2b2lkIDA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xuICB2YXIgUmVhY3RET01Vbmtub3duUHJvcGVydHlIb29rID0gcmVxdWlyZSgnLi9SZWFjdERPTVVua25vd25Qcm9wZXJ0eUhvb2snKTtcbiAgdmFyIFJlYWN0RE9NTnVsbElucHV0VmFsdWVQcm9wSG9vayA9IHJlcXVpcmUoJy4vUmVhY3RET01OdWxsSW5wdXRWYWx1ZVByb3BIb29rJyk7XG4gIHZhciBSZWFjdERPTUludmFsaWRBUklBSG9vayA9IHJlcXVpcmUoJy4vUmVhY3RET01JbnZhbGlkQVJJQUhvb2snKTtcblxuICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wuYWRkSG9vayhSZWFjdERPTVVua25vd25Qcm9wZXJ0eUhvb2spO1xuICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wuYWRkSG9vayhSZWFjdERPTU51bGxJbnB1dFZhbHVlUHJvcEhvb2spO1xuICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wuYWRkSG9vayhSZWFjdERPTUludmFsaWRBUklBSG9vayk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET007IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbi8qIGdsb2JhbCBoYXNPd25Qcm9wZXJ0eTp0cnVlICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKSxcbiAgICBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgQXV0b0ZvY3VzVXRpbHMgPSByZXF1aXJlKCcuL0F1dG9Gb2N1c1V0aWxzJyk7XG52YXIgQ1NTUHJvcGVydHlPcGVyYXRpb25zID0gcmVxdWlyZSgnLi9DU1NQcm9wZXJ0eU9wZXJhdGlvbnMnKTtcbnZhciBET01MYXp5VHJlZSA9IHJlcXVpcmUoJy4vRE9NTGF6eVRyZWUnKTtcbnZhciBET01OYW1lc3BhY2VzID0gcmVxdWlyZSgnLi9ET01OYW1lc3BhY2VzJyk7XG52YXIgRE9NUHJvcGVydHkgPSByZXF1aXJlKCcuL0RPTVByb3BlcnR5Jyk7XG52YXIgRE9NUHJvcGVydHlPcGVyYXRpb25zID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eU9wZXJhdGlvbnMnKTtcbnZhciBFdmVudFBsdWdpbkh1YiA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5IdWInKTtcbnZhciBFdmVudFBsdWdpblJlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpblJlZ2lzdHJ5Jyk7XG52YXIgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnLi9SZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXInKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudEZsYWdzID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudEZsYWdzJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdERPTUlucHV0ID0gcmVxdWlyZSgnLi9SZWFjdERPTUlucHV0Jyk7XG52YXIgUmVhY3RET01PcHRpb24gPSByZXF1aXJlKCcuL1JlYWN0RE9NT3B0aW9uJyk7XG52YXIgUmVhY3RET01TZWxlY3QgPSByZXF1aXJlKCcuL1JlYWN0RE9NU2VsZWN0Jyk7XG52YXIgUmVhY3RET01UZXh0YXJlYSA9IHJlcXVpcmUoJy4vUmVhY3RET01UZXh0YXJlYScpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xudmFyIFJlYWN0TXVsdGlDaGlsZCA9IHJlcXVpcmUoJy4vUmVhY3RNdWx0aUNoaWxkJyk7XG52YXIgUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbicpO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcbnZhciBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIgPSByZXF1aXJlKCcuL2VzY2FwZVRleHRDb250ZW50Rm9yQnJvd3NlcicpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIGlzRXZlbnRTdXBwb3J0ZWQgPSByZXF1aXJlKCcuL2lzRXZlbnRTdXBwb3J0ZWQnKTtcbnZhciBzaGFsbG93RXF1YWwgPSByZXF1aXJlKCdmYmpzL2xpYi9zaGFsbG93RXF1YWwnKTtcbnZhciB2YWxpZGF0ZURPTU5lc3RpbmcgPSByZXF1aXJlKCcuL3ZhbGlkYXRlRE9NTmVzdGluZycpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBGbGFncyA9IFJlYWN0RE9NQ29tcG9uZW50RmxhZ3M7XG52YXIgZGVsZXRlTGlzdGVuZXIgPSBFdmVudFBsdWdpbkh1Yi5kZWxldGVMaXN0ZW5lcjtcbnZhciBnZXROb2RlID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2U7XG52YXIgbGlzdGVuVG8gPSBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIubGlzdGVuVG87XG52YXIgcmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzO1xuXG4vLyBGb3IgcXVpY2tseSBtYXRjaGluZyBjaGlsZHJlbiB0eXBlLCB0byB0ZXN0IGlmIGNhbiBiZSB0cmVhdGVkIGFzIGNvbnRlbnQuXG52YXIgQ09OVEVOVF9UWVBFUyA9IHsgJ3N0cmluZyc6IHRydWUsICdudW1iZXInOiB0cnVlIH07XG5cbnZhciBTVFlMRSA9ICdzdHlsZSc7XG52YXIgSFRNTCA9ICdfX2h0bWwnO1xudmFyIFJFU0VSVkVEX1BST1BTID0ge1xuICBjaGlsZHJlbjogbnVsbCxcbiAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IG51bGwsXG4gIHN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZzogbnVsbFxufTtcblxuLy8gTm9kZSB0eXBlIGZvciBkb2N1bWVudCBmcmFnbWVudHMgKE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSkuXG52YXIgRE9DX0ZSQUdNRU5UX1RZUEUgPSAxMTtcblxuZnVuY3Rpb24gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKGludGVybmFsSW5zdGFuY2UpIHtcbiAgaWYgKGludGVybmFsSW5zdGFuY2UpIHtcbiAgICB2YXIgb3duZXIgPSBpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudC5fb3duZXIgfHwgbnVsbDtcbiAgICBpZiAob3duZXIpIHtcbiAgICAgIHZhciBuYW1lID0gb3duZXIuZ2V0TmFtZSgpO1xuICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuICcgVGhpcyBET00gbm9kZSB3YXMgcmVuZGVyZWQgYnkgYCcgKyBuYW1lICsgJ2AuJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBmcmllbmRseVN0cmluZ2lmeShvYmopIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgcmV0dXJuICdbJyArIG9iai5tYXAoZnJpZW5kbHlTdHJpbmdpZnkpLmpvaW4oJywgJykgKyAnXSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBwYWlycyA9IFtdO1xuICAgICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICAgIHZhciBrZXlFc2NhcGVkID0gL15bYS16JF9dW1xcdyRfXSokL2kudGVzdChrZXkpID8ga2V5IDogSlNPTi5zdHJpbmdpZnkoa2V5KTtcbiAgICAgICAgICBwYWlycy5wdXNoKGtleUVzY2FwZWQgKyAnOiAnICsgZnJpZW5kbHlTdHJpbmdpZnkob2JqW2tleV0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuICd7JyArIHBhaXJzLmpvaW4oJywgJykgKyAnfSc7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaik7XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiAnW2Z1bmN0aW9uIG9iamVjdF0nO1xuICB9XG4gIC8vIERpZmZlcnMgZnJvbSBKU09OLnN0cmluZ2lmeSBpbiB0aGF0IHVuZGVmaW5lZCBiZWNhdXNlIHVuZGVmaW5lZCBhbmQgdGhhdFxuICAvLyBpbmYgYW5kIG5hbiBkb24ndCBiZWNvbWUgbnVsbFxuICByZXR1cm4gU3RyaW5nKG9iaik7XG59XG5cbnZhciBzdHlsZU11dGF0aW9uV2FybmluZyA9IHt9O1xuXG5mdW5jdGlvbiBjaGVja0FuZFdhcm5Gb3JNdXRhdGVkU3R5bGUoc3R5bGUxLCBzdHlsZTIsIGNvbXBvbmVudCkge1xuICBpZiAoc3R5bGUxID09IG51bGwgfHwgc3R5bGUyID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHNoYWxsb3dFcXVhbChzdHlsZTEsIHN0eWxlMikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC5fdGFnO1xuICB2YXIgb3duZXIgPSBjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjtcbiAgdmFyIG93bmVyTmFtZTtcbiAgaWYgKG93bmVyKSB7XG4gICAgb3duZXJOYW1lID0gb3duZXIuZ2V0TmFtZSgpO1xuICB9XG5cbiAgdmFyIGhhc2ggPSBvd25lck5hbWUgKyAnfCcgKyBjb21wb25lbnROYW1lO1xuXG4gIGlmIChzdHlsZU11dGF0aW9uV2FybmluZy5oYXNPd25Qcm9wZXJ0eShoYXNoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHN0eWxlTXV0YXRpb25XYXJuaW5nW2hhc2hdID0gdHJ1ZTtcblxuICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdgJXNgIHdhcyBwYXNzZWQgYSBzdHlsZSBvYmplY3QgdGhhdCBoYXMgcHJldmlvdXNseSBiZWVuIG11dGF0ZWQuICcgKyAnTXV0YXRpbmcgYHN0eWxlYCBpcyBkZXByZWNhdGVkLiBDb25zaWRlciBjbG9uaW5nIGl0IGJlZm9yZWhhbmQuIENoZWNrICcgKyAndGhlIGByZW5kZXJgICVzLiBQcmV2aW91cyBzdHlsZTogJXMuIE11dGF0ZWQgc3R5bGU6ICVzLicsIGNvbXBvbmVudE5hbWUsIG93bmVyID8gJ29mIGAnICsgb3duZXJOYW1lICsgJ2AnIDogJ3VzaW5nIDwnICsgY29tcG9uZW50TmFtZSArICc+JywgZnJpZW5kbHlTdHJpbmdpZnkoc3R5bGUxKSwgZnJpZW5kbHlTdHJpbmdpZnkoc3R5bGUyKSkgOiB2b2lkIDA7XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGNvbXBvbmVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBwcm9wc1xuICovXG5mdW5jdGlvbiBhc3NlcnRWYWxpZFByb3BzKGNvbXBvbmVudCwgcHJvcHMpIHtcbiAgaWYgKCFwcm9wcykge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBOb3RlIHRoZSB1c2Ugb2YgYD09YCB3aGljaCBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuICBpZiAodm9pZEVsZW1lbnRUYWdzW2NvbXBvbmVudC5fdGFnXSkge1xuICAgICEocHJvcHMuY2hpbGRyZW4gPT0gbnVsbCAmJiBwcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTCA9PSBudWxsKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMgaXMgYSB2b2lkIGVsZW1lbnQgdGFnIGFuZCBtdXN0IG5laXRoZXIgaGF2ZSBgY2hpbGRyZW5gIG5vciB1c2UgYGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4lcycsIGNvbXBvbmVudC5fdGFnLCBjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50Ll9vd25lciA/ICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgJyArIGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQuX293bmVyLmdldE5hbWUoKSArICcuJyA6ICcnKSA6IF9wcm9kSW52YXJpYW50KCcxMzcnLCBjb21wb25lbnQuX3RhZywgY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXIgPyAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICcgKyBjb21wb25lbnQuX2N1cnJlbnRFbGVtZW50Ll9vd25lci5nZXROYW1lKCkgKyAnLicgOiAnJykgOiB2b2lkIDA7XG4gIH1cbiAgaWYgKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICE9IG51bGwpIHtcbiAgICAhKHByb3BzLmNoaWxkcmVuID09IG51bGwpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdDYW4gb25seSBzZXQgb25lIG9mIGBjaGlsZHJlbmAgb3IgYHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYC4nKSA6IF9wcm9kSW52YXJpYW50KCc2MCcpIDogdm9pZCAwO1xuICAgICEodHlwZW9mIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MID09PSAnb2JqZWN0JyAmJiBIVE1MIGluIHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnYHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MYCBtdXN0IGJlIGluIHRoZSBmb3JtIGB7X19odG1sOiAuLi59YC4gUGxlYXNlIHZpc2l0IGh0dHBzOi8vZmIubWUvcmVhY3QtaW52YXJpYW50LWRhbmdlcm91c2x5LXNldC1pbm5lci1odG1sIGZvciBtb3JlIGluZm9ybWF0aW9uLicpIDogX3Byb2RJbnZhcmlhbnQoJzYxJykgOiB2b2lkIDA7XG4gIH1cbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHByb3BzLmlubmVySFRNTCA9PSBudWxsLCAnRGlyZWN0bHkgc2V0dGluZyBwcm9wZXJ0eSBgaW5uZXJIVE1MYCBpcyBub3QgcGVybWl0dGVkLiAnICsgJ0ZvciBtb3JlIGluZm9ybWF0aW9uLCBsb29rdXAgZG9jdW1lbnRhdGlvbiBvbiBgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgLicpIDogdm9pZCAwO1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhwcm9wcy5zdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmcgfHwgIXByb3BzLmNvbnRlbnRFZGl0YWJsZSB8fCBwcm9wcy5jaGlsZHJlbiA9PSBudWxsLCAnQSBjb21wb25lbnQgaXMgYGNvbnRlbnRFZGl0YWJsZWAgYW5kIGNvbnRhaW5zIGBjaGlsZHJlbmAgbWFuYWdlZCBieSAnICsgJ1JlYWN0LiBJdCBpcyBub3cgeW91ciByZXNwb25zaWJpbGl0eSB0byBndWFyYW50ZWUgdGhhdCBub25lIG9mICcgKyAndGhvc2Ugbm9kZXMgYXJlIHVuZXhwZWN0ZWRseSBtb2RpZmllZCBvciBkdXBsaWNhdGVkLiBUaGlzIGlzICcgKyAncHJvYmFibHkgbm90IGludGVudGlvbmFsLicpIDogdm9pZCAwO1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhwcm9wcy5vbkZvY3VzSW4gPT0gbnVsbCAmJiBwcm9wcy5vbkZvY3VzT3V0ID09IG51bGwsICdSZWFjdCB1c2VzIG9uRm9jdXMgYW5kIG9uQmx1ciBpbnN0ZWFkIG9mIG9uRm9jdXNJbiBhbmQgb25Gb2N1c091dC4gJyArICdBbGwgUmVhY3QgZXZlbnRzIGFyZSBub3JtYWxpemVkIHRvIGJ1YmJsZSwgc28gb25Gb2N1c0luIGFuZCBvbkZvY3VzT3V0ICcgKyAnYXJlIG5vdCBuZWVkZWQvc3VwcG9ydGVkIGJ5IFJlYWN0LicpIDogdm9pZCAwO1xuICB9XG4gICEocHJvcHMuc3R5bGUgPT0gbnVsbCB8fCB0eXBlb2YgcHJvcHMuc3R5bGUgPT09ICdvYmplY3QnKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVGhlIGBzdHlsZWAgcHJvcCBleHBlY3RzIGEgbWFwcGluZyBmcm9tIHN0eWxlIHByb3BlcnRpZXMgdG8gdmFsdWVzLCBub3QgYSBzdHJpbmcuIEZvciBleGFtcGxlLCBzdHlsZT17e21hcmdpblJpZ2h0OiBzcGFjaW5nICsgXFwnZW1cXCd9fSB3aGVuIHVzaW5nIEpTWC4lcycsIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShjb21wb25lbnQpKSA6IF9wcm9kSW52YXJpYW50KCc2MicsIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShjb21wb25lbnQpKSA6IHZvaWQgMDtcbn1cblxuZnVuY3Rpb24gZW5xdWV1ZVB1dExpc3RlbmVyKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyLCB0cmFuc2FjdGlvbikge1xuICBpZiAodHJhbnNhY3Rpb24gaW5zdGFuY2VvZiBSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIC8vIElFOCBoYXMgbm8gQVBJIGZvciBldmVudCBjYXB0dXJpbmcgYW5kIHRoZSBgb25TY3JvbGxgIGV2ZW50IGRvZXNuJ3RcbiAgICAvLyBidWJibGUuXG4gICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHJlZ2lzdHJhdGlvbk5hbWUgIT09ICdvblNjcm9sbCcgfHwgaXNFdmVudFN1cHBvcnRlZCgnc2Nyb2xsJywgdHJ1ZSksICdUaGlzIGJyb3dzZXIgZG9lc25cXCd0IHN1cHBvcnQgdGhlIGBvblNjcm9sbGAgZXZlbnQnKSA6IHZvaWQgMDtcbiAgfVxuICB2YXIgY29udGFpbmVySW5mbyA9IGluc3QuX2hvc3RDb250YWluZXJJbmZvO1xuICB2YXIgaXNEb2N1bWVudEZyYWdtZW50ID0gY29udGFpbmVySW5mby5fbm9kZSAmJiBjb250YWluZXJJbmZvLl9ub2RlLm5vZGVUeXBlID09PSBET0NfRlJBR01FTlRfVFlQRTtcbiAgdmFyIGRvYyA9IGlzRG9jdW1lbnRGcmFnbWVudCA/IGNvbnRhaW5lckluZm8uX25vZGUgOiBjb250YWluZXJJbmZvLl9vd25lckRvY3VtZW50O1xuICBsaXN0ZW5UbyhyZWdpc3RyYXRpb25OYW1lLCBkb2MpO1xuICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHB1dExpc3RlbmVyLCB7XG4gICAgaW5zdDogaW5zdCxcbiAgICByZWdpc3RyYXRpb25OYW1lOiByZWdpc3RyYXRpb25OYW1lLFxuICAgIGxpc3RlbmVyOiBsaXN0ZW5lclxuICB9KTtcbn1cblxuZnVuY3Rpb24gcHV0TGlzdGVuZXIoKSB7XG4gIHZhciBsaXN0ZW5lclRvUHV0ID0gdGhpcztcbiAgRXZlbnRQbHVnaW5IdWIucHV0TGlzdGVuZXIobGlzdGVuZXJUb1B1dC5pbnN0LCBsaXN0ZW5lclRvUHV0LnJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyVG9QdXQubGlzdGVuZXIpO1xufVxuXG5mdW5jdGlvbiBpbnB1dFBvc3RNb3VudCgpIHtcbiAgdmFyIGluc3QgPSB0aGlzO1xuICBSZWFjdERPTUlucHV0LnBvc3RNb3VudFdyYXBwZXIoaW5zdCk7XG59XG5cbmZ1bmN0aW9uIHRleHRhcmVhUG9zdE1vdW50KCkge1xuICB2YXIgaW5zdCA9IHRoaXM7XG4gIFJlYWN0RE9NVGV4dGFyZWEucG9zdE1vdW50V3JhcHBlcihpbnN0KTtcbn1cblxuZnVuY3Rpb24gb3B0aW9uUG9zdE1vdW50KCkge1xuICB2YXIgaW5zdCA9IHRoaXM7XG4gIFJlYWN0RE9NT3B0aW9uLnBvc3RNb3VudFdyYXBwZXIoaW5zdCk7XG59XG5cbnZhciBzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldiA9IGVtcHR5RnVuY3Rpb247XG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgc2V0QW5kVmFsaWRhdGVDb250ZW50Q2hpbGREZXYgPSBmdW5jdGlvbiAoY29udGVudCkge1xuICAgIHZhciBoYXNFeGlzdGluZ0NvbnRlbnQgPSB0aGlzLl9jb250ZW50RGVidWdJRCAhPSBudWxsO1xuICAgIHZhciBkZWJ1Z0lEID0gdGhpcy5fZGVidWdJRDtcbiAgICAvLyBUaGlzIElEIHJlcHJlc2VudHMgdGhlIGlubGluZWQgY2hpbGQgdGhhdCBoYXMgbm8gYmFja2luZyBpbnN0YW5jZTpcbiAgICB2YXIgY29udGVudERlYnVnSUQgPSAtZGVidWdJRDtcblxuICAgIGlmIChjb250ZW50ID09IG51bGwpIHtcbiAgICAgIGlmIChoYXNFeGlzdGluZ0NvbnRlbnQpIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uVW5tb3VudENvbXBvbmVudCh0aGlzLl9jb250ZW50RGVidWdJRCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9jb250ZW50RGVidWdJRCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFsaWRhdGVET01OZXN0aW5nKG51bGwsIFN0cmluZyhjb250ZW50KSwgdGhpcywgdGhpcy5fYW5jZXN0b3JJbmZvKTtcbiAgICB0aGlzLl9jb250ZW50RGVidWdJRCA9IGNvbnRlbnREZWJ1Z0lEO1xuICAgIGlmIChoYXNFeGlzdGluZ0NvbnRlbnQpIHtcbiAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZm9yZVVwZGF0ZUNvbXBvbmVudChjb250ZW50RGVidWdJRCwgY29udGVudCk7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25VcGRhdGVDb21wb25lbnQoY29udGVudERlYnVnSUQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWZvcmVNb3VudENvbXBvbmVudChjb250ZW50RGVidWdJRCwgY29udGVudCwgZGVidWdJRCk7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Nb3VudENvbXBvbmVudChjb250ZW50RGVidWdJRCk7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25TZXRDaGlsZHJlbihkZWJ1Z0lELCBbY29udGVudERlYnVnSURdKTtcbiAgICB9XG4gIH07XG59XG5cbi8vIFRoZXJlIGFyZSBzbyBtYW55IG1lZGlhIGV2ZW50cywgaXQgbWFrZXMgc2Vuc2UgdG8ganVzdFxuLy8gbWFpbnRhaW4gYSBsaXN0IHJhdGhlciB0aGFuIGNyZWF0ZSBhIGB0cmFwQnViYmxlZEV2ZW50YCBmb3IgZWFjaFxudmFyIG1lZGlhRXZlbnRzID0ge1xuICB0b3BBYm9ydDogJ2Fib3J0JyxcbiAgdG9wQ2FuUGxheTogJ2NhbnBsYXknLFxuICB0b3BDYW5QbGF5VGhyb3VnaDogJ2NhbnBsYXl0aHJvdWdoJyxcbiAgdG9wRHVyYXRpb25DaGFuZ2U6ICdkdXJhdGlvbmNoYW5nZScsXG4gIHRvcEVtcHRpZWQ6ICdlbXB0aWVkJyxcbiAgdG9wRW5jcnlwdGVkOiAnZW5jcnlwdGVkJyxcbiAgdG9wRW5kZWQ6ICdlbmRlZCcsXG4gIHRvcEVycm9yOiAnZXJyb3InLFxuICB0b3BMb2FkZWREYXRhOiAnbG9hZGVkZGF0YScsXG4gIHRvcExvYWRlZE1ldGFkYXRhOiAnbG9hZGVkbWV0YWRhdGEnLFxuICB0b3BMb2FkU3RhcnQ6ICdsb2Fkc3RhcnQnLFxuICB0b3BQYXVzZTogJ3BhdXNlJyxcbiAgdG9wUGxheTogJ3BsYXknLFxuICB0b3BQbGF5aW5nOiAncGxheWluZycsXG4gIHRvcFByb2dyZXNzOiAncHJvZ3Jlc3MnLFxuICB0b3BSYXRlQ2hhbmdlOiAncmF0ZWNoYW5nZScsXG4gIHRvcFNlZWtlZDogJ3NlZWtlZCcsXG4gIHRvcFNlZWtpbmc6ICdzZWVraW5nJyxcbiAgdG9wU3RhbGxlZDogJ3N0YWxsZWQnLFxuICB0b3BTdXNwZW5kOiAnc3VzcGVuZCcsXG4gIHRvcFRpbWVVcGRhdGU6ICd0aW1ldXBkYXRlJyxcbiAgdG9wVm9sdW1lQ2hhbmdlOiAndm9sdW1lY2hhbmdlJyxcbiAgdG9wV2FpdGluZzogJ3dhaXRpbmcnXG59O1xuXG5mdW5jdGlvbiB0cmFwQnViYmxlZEV2ZW50c0xvY2FsKCkge1xuICB2YXIgaW5zdCA9IHRoaXM7XG4gIC8vIElmIGEgY29tcG9uZW50IHJlbmRlcnMgdG8gbnVsbCBvciBpZiBhbm90aGVyIGNvbXBvbmVudCBmYXRhbHMgYW5kIGNhdXNlc1xuICAvLyB0aGUgc3RhdGUgb2YgdGhlIHRyZWUgdG8gYmUgY29ycnVwdGVkLCBgbm9kZWAgaGVyZSBjYW4gYmUgbnVsbC5cbiAgIWluc3QuX3Jvb3ROb2RlSUQgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ011c3QgYmUgbW91bnRlZCB0byB0cmFwIGV2ZW50cycpIDogX3Byb2RJbnZhcmlhbnQoJzYzJykgOiB2b2lkIDA7XG4gIHZhciBub2RlID0gZ2V0Tm9kZShpbnN0KTtcbiAgIW5vZGUgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3RyYXBCdWJibGVkRXZlbnQoLi4uKTogUmVxdWlyZXMgbm9kZSB0byBiZSByZW5kZXJlZC4nKSA6IF9wcm9kSW52YXJpYW50KCc2NCcpIDogdm9pZCAwO1xuXG4gIHN3aXRjaCAoaW5zdC5fdGFnKSB7XG4gICAgY2FzZSAnaWZyYW1lJzpcbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgaW5zdC5fd3JhcHBlclN0YXRlLmxpc3RlbmVycyA9IFtSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wTG9hZCcsICdsb2FkJywgbm9kZSldO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndmlkZW8nOlxuICAgIGNhc2UgJ2F1ZGlvJzpcblxuICAgICAgaW5zdC5fd3JhcHBlclN0YXRlLmxpc3RlbmVycyA9IFtdO1xuICAgICAgLy8gQ3JlYXRlIGxpc3RlbmVyIGZvciBlYWNoIG1lZGlhIGV2ZW50XG4gICAgICBmb3IgKHZhciBldmVudCBpbiBtZWRpYUV2ZW50cykge1xuICAgICAgICBpZiAobWVkaWFFdmVudHMuaGFzT3duUHJvcGVydHkoZXZlbnQpKSB7XG4gICAgICAgICAgaW5zdC5fd3JhcHBlclN0YXRlLmxpc3RlbmVycy5wdXNoKFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KGV2ZW50LCBtZWRpYUV2ZW50c1tldmVudF0sIG5vZGUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc291cmNlJzpcbiAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMgPSBbUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcEVycm9yJywgJ2Vycm9yJywgbm9kZSldO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaW1nJzpcbiAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMgPSBbUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcEVycm9yJywgJ2Vycm9yJywgbm9kZSksIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KCd0b3BMb2FkJywgJ2xvYWQnLCBub2RlKV07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdmb3JtJzpcbiAgICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMgPSBbUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnRyYXBCdWJibGVkRXZlbnQoJ3RvcFJlc2V0JywgJ3Jlc2V0Jywgbm9kZSksIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlci50cmFwQnViYmxlZEV2ZW50KCd0b3BTdWJtaXQnLCAnc3VibWl0Jywgbm9kZSldO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaW5wdXQnOlxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgaW5zdC5fd3JhcHBlclN0YXRlLmxpc3RlbmVycyA9IFtSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIudHJhcEJ1YmJsZWRFdmVudCgndG9wSW52YWxpZCcsICdpbnZhbGlkJywgbm9kZSldO1xuICAgICAgYnJlYWs7XG4gIH1cbn1cblxuZnVuY3Rpb24gcG9zdFVwZGF0ZVNlbGVjdFdyYXBwZXIoKSB7XG4gIFJlYWN0RE9NU2VsZWN0LnBvc3RVcGRhdGVXcmFwcGVyKHRoaXMpO1xufVxuXG4vLyBGb3IgSFRNTCwgY2VydGFpbiB0YWdzIHNob3VsZCBvbWl0IHRoZWlyIGNsb3NlIHRhZy4gV2Uga2VlcCBhIHdoaXRlbGlzdCBmb3Jcbi8vIHRob3NlIHNwZWNpYWwtY2FzZSB0YWdzLlxuXG52YXIgb21pdHRlZENsb3NlVGFncyA9IHtcbiAgJ2FyZWEnOiB0cnVlLFxuICAnYmFzZSc6IHRydWUsXG4gICdicic6IHRydWUsXG4gICdjb2wnOiB0cnVlLFxuICAnZW1iZWQnOiB0cnVlLFxuICAnaHInOiB0cnVlLFxuICAnaW1nJzogdHJ1ZSxcbiAgJ2lucHV0JzogdHJ1ZSxcbiAgJ2tleWdlbic6IHRydWUsXG4gICdsaW5rJzogdHJ1ZSxcbiAgJ21ldGEnOiB0cnVlLFxuICAncGFyYW0nOiB0cnVlLFxuICAnc291cmNlJzogdHJ1ZSxcbiAgJ3RyYWNrJzogdHJ1ZSxcbiAgJ3dicic6IHRydWVcbn07XG5cbnZhciBuZXdsaW5lRWF0aW5nVGFncyA9IHtcbiAgJ2xpc3RpbmcnOiB0cnVlLFxuICAncHJlJzogdHJ1ZSxcbiAgJ3RleHRhcmVhJzogdHJ1ZVxufTtcblxuLy8gRm9yIEhUTUwsIGNlcnRhaW4gdGFncyBjYW5ub3QgaGF2ZSBjaGlsZHJlbi4gVGhpcyBoYXMgdGhlIHNhbWUgcHVycG9zZSBhc1xuLy8gYG9taXR0ZWRDbG9zZVRhZ3NgIGV4Y2VwdCB0aGF0IGBtZW51aXRlbWAgc2hvdWxkIHN0aWxsIGhhdmUgaXRzIGNsb3NpbmcgdGFnLlxuXG52YXIgdm9pZEVsZW1lbnRUYWdzID0gX2Fzc2lnbih7XG4gICdtZW51aXRlbSc6IHRydWVcbn0sIG9taXR0ZWRDbG9zZVRhZ3MpO1xuXG4vLyBXZSBhY2NlcHQgYW55IHRhZyB0byBiZSByZW5kZXJlZCBidXQgc2luY2UgdGhpcyBnZXRzIGluamVjdGVkIGludG8gYXJiaXRyYXJ5XG4vLyBIVE1MLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGl0J3MgYSBzYWZlIHRhZy5cbi8vIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwvI05ULU5hbWVcblxudmFyIFZBTElEX1RBR19SRUdFWCA9IC9eW2EtekEtWl1bYS16QS1aOl9cXC5cXC1cXGRdKiQvOyAvLyBTaW1wbGlmaWVkIHN1YnNldFxudmFyIHZhbGlkYXRlZFRhZ0NhY2hlID0ge307XG52YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gdmFsaWRhdGVEYW5nZXJvdXNUYWcodGFnKSB7XG4gIGlmICghaGFzT3duUHJvcGVydHkuY2FsbCh2YWxpZGF0ZWRUYWdDYWNoZSwgdGFnKSkge1xuICAgICFWQUxJRF9UQUdfUkVHRVgudGVzdCh0YWcpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdJbnZhbGlkIHRhZzogJXMnLCB0YWcpIDogX3Byb2RJbnZhcmlhbnQoJzY1JywgdGFnKSA6IHZvaWQgMDtcbiAgICB2YWxpZGF0ZWRUYWdDYWNoZVt0YWddID0gdHJ1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0N1c3RvbUNvbXBvbmVudCh0YWdOYW1lLCBwcm9wcykge1xuICByZXR1cm4gdGFnTmFtZS5pbmRleE9mKCctJykgPj0gMCB8fCBwcm9wcy5pcyAhPSBudWxsO1xufVxuXG52YXIgZ2xvYmFsSWRDb3VudGVyID0gMTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFJlYWN0IGNsYXNzIHRoYXQgaXMgaWRlbXBvdGVudCBhbmQgY2FwYWJsZSBvZiBjb250YWluaW5nIG90aGVyXG4gKiBSZWFjdCBjb21wb25lbnRzLiBJdCBhY2NlcHRzIGV2ZW50IGxpc3RlbmVycyBhbmQgRE9NIHByb3BlcnRpZXMgdGhhdCBhcmVcbiAqIHZhbGlkIGFjY29yZGluZyB0byBgRE9NUHJvcGVydHlgLlxuICpcbiAqICAtIEV2ZW50IGxpc3RlbmVyczogYG9uQ2xpY2tgLCBgb25Nb3VzZURvd25gLCBldGMuXG4gKiAgLSBET00gcHJvcGVydGllczogYGNsYXNzTmFtZWAsIGBuYW1lYCwgYHRpdGxlYCwgZXRjLlxuICpcbiAqIFRoZSBgc3R5bGVgIHByb3BlcnR5IGZ1bmN0aW9ucyBkaWZmZXJlbnRseSBmcm9tIHRoZSBET00gQVBJLiBJdCBhY2NlcHRzIGFuXG4gKiBvYmplY3QgbWFwcGluZyBvZiBzdHlsZSBwcm9wZXJ0aWVzIHRvIHZhbHVlcy5cbiAqXG4gKiBAY29uc3RydWN0b3IgUmVhY3RET01Db21wb25lbnRcbiAqIEBleHRlbmRzIFJlYWN0TXVsdGlDaGlsZFxuICovXG5mdW5jdGlvbiBSZWFjdERPTUNvbXBvbmVudChlbGVtZW50KSB7XG4gIHZhciB0YWcgPSBlbGVtZW50LnR5cGU7XG4gIHZhbGlkYXRlRGFuZ2Vyb3VzVGFnKHRhZyk7XG4gIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gZWxlbWVudDtcbiAgdGhpcy5fdGFnID0gdGFnLnRvTG93ZXJDYXNlKCk7XG4gIHRoaXMuX25hbWVzcGFjZVVSSSA9IG51bGw7XG4gIHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW4gPSBudWxsO1xuICB0aGlzLl9wcmV2aW91c1N0eWxlID0gbnVsbDtcbiAgdGhpcy5fcHJldmlvdXNTdHlsZUNvcHkgPSBudWxsO1xuICB0aGlzLl9ob3N0Tm9kZSA9IG51bGw7XG4gIHRoaXMuX2hvc3RQYXJlbnQgPSBudWxsO1xuICB0aGlzLl9yb290Tm9kZUlEID0gMDtcbiAgdGhpcy5fZG9tSUQgPSAwO1xuICB0aGlzLl9ob3N0Q29udGFpbmVySW5mbyA9IG51bGw7XG4gIHRoaXMuX3dyYXBwZXJTdGF0ZSA9IG51bGw7XG4gIHRoaXMuX3RvcExldmVsV3JhcHBlciA9IG51bGw7XG4gIHRoaXMuX2ZsYWdzID0gMDtcbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgdGhpcy5fYW5jZXN0b3JJbmZvID0gbnVsbDtcbiAgICBzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldi5jYWxsKHRoaXMsIG51bGwpO1xuICB9XG59XG5cblJlYWN0RE9NQ29tcG9uZW50LmRpc3BsYXlOYW1lID0gJ1JlYWN0RE9NQ29tcG9uZW50JztcblxuUmVhY3RET01Db21wb25lbnQuTWl4aW4gPSB7XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyByb290IHRhZyBtYXJrdXAgdGhlbiByZWN1cnNlcy4gVGhpcyBtZXRob2QgaGFzIHNpZGUgZWZmZWN0cyBhbmRcbiAgICogaXMgbm90IGlkZW1wb3RlbnQuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb258UmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHs/UmVhY3RET01Db21wb25lbnR9IHRoZSBwYXJlbnQgY29tcG9uZW50IGluc3RhbmNlXG4gICAqIEBwYXJhbSB7P29iamVjdH0gaW5mbyBhYm91dCB0aGUgaG9zdCBjb250YWluZXJcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgY29tcHV0ZWQgbWFya3VwLlxuICAgKi9cbiAgbW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQpIHtcbiAgICB0aGlzLl9yb290Tm9kZUlEID0gZ2xvYmFsSWRDb3VudGVyKys7XG4gICAgdGhpcy5fZG9tSUQgPSBob3N0Q29udGFpbmVySW5mby5faWRDb3VudGVyKys7XG4gICAgdGhpcy5faG9zdFBhcmVudCA9IGhvc3RQYXJlbnQ7XG4gICAgdGhpcy5faG9zdENvbnRhaW5lckluZm8gPSBob3N0Q29udGFpbmVySW5mbztcblxuICAgIHZhciBwcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuXG4gICAgc3dpdGNoICh0aGlzLl90YWcpIHtcbiAgICAgIGNhc2UgJ2F1ZGlvJzpcbiAgICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgY2FzZSAnaWZyYW1lJzpcbiAgICAgIGNhc2UgJ2ltZyc6XG4gICAgICBjYXNlICdsaW5rJzpcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICBjYXNlICdzb3VyY2UnOlxuICAgICAgY2FzZSAndmlkZW8nOlxuICAgICAgICB0aGlzLl93cmFwcGVyU3RhdGUgPSB7XG4gICAgICAgICAgbGlzdGVuZXJzOiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodHJhcEJ1YmJsZWRFdmVudHNMb2NhbCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaW5wdXQnOlxuICAgICAgICBSZWFjdERPTUlucHV0Lm1vdW50V3JhcHBlcih0aGlzLCBwcm9wcywgaG9zdFBhcmVudCk7XG4gICAgICAgIHByb3BzID0gUmVhY3RET01JbnB1dC5nZXRIb3N0UHJvcHModGhpcywgcHJvcHMpO1xuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHRyYXBCdWJibGVkRXZlbnRzTG9jYWwsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAgIFJlYWN0RE9NT3B0aW9uLm1vdW50V3JhcHBlcih0aGlzLCBwcm9wcywgaG9zdFBhcmVudCk7XG4gICAgICAgIHByb3BzID0gUmVhY3RET01PcHRpb24uZ2V0SG9zdFByb3BzKHRoaXMsIHByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICBSZWFjdERPTVNlbGVjdC5tb3VudFdyYXBwZXIodGhpcywgcHJvcHMsIGhvc3RQYXJlbnQpO1xuICAgICAgICBwcm9wcyA9IFJlYWN0RE9NU2VsZWN0LmdldEhvc3RQcm9wcyh0aGlzLCBwcm9wcyk7XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodHJhcEJ1YmJsZWRFdmVudHNMb2NhbCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgICBSZWFjdERPTVRleHRhcmVhLm1vdW50V3JhcHBlcih0aGlzLCBwcm9wcywgaG9zdFBhcmVudCk7XG4gICAgICAgIHByb3BzID0gUmVhY3RET01UZXh0YXJlYS5nZXRIb3N0UHJvcHModGhpcywgcHJvcHMpO1xuICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHRyYXBCdWJibGVkRXZlbnRzTG9jYWwsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBhc3NlcnRWYWxpZFByb3BzKHRoaXMsIHByb3BzKTtcblxuICAgIC8vIFdlIGNyZWF0ZSB0YWdzIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhlaXIgcGFyZW50IGNvbnRhaW5lciwgZXhjZXB0IEhUTUxcbiAgICAvLyB0YWdzIGdldCBubyBuYW1lc3BhY2UuXG4gICAgdmFyIG5hbWVzcGFjZVVSSTtcbiAgICB2YXIgcGFyZW50VGFnO1xuICAgIGlmIChob3N0UGFyZW50ICE9IG51bGwpIHtcbiAgICAgIG5hbWVzcGFjZVVSSSA9IGhvc3RQYXJlbnQuX25hbWVzcGFjZVVSSTtcbiAgICAgIHBhcmVudFRhZyA9IGhvc3RQYXJlbnQuX3RhZztcbiAgICB9IGVsc2UgaWYgKGhvc3RDb250YWluZXJJbmZvLl90YWcpIHtcbiAgICAgIG5hbWVzcGFjZVVSSSA9IGhvc3RDb250YWluZXJJbmZvLl9uYW1lc3BhY2VVUkk7XG4gICAgICBwYXJlbnRUYWcgPSBob3N0Q29udGFpbmVySW5mby5fdGFnO1xuICAgIH1cbiAgICBpZiAobmFtZXNwYWNlVVJJID09IG51bGwgfHwgbmFtZXNwYWNlVVJJID09PSBET01OYW1lc3BhY2VzLnN2ZyAmJiBwYXJlbnRUYWcgPT09ICdmb3JlaWdub2JqZWN0Jykge1xuICAgICAgbmFtZXNwYWNlVVJJID0gRE9NTmFtZXNwYWNlcy5odG1sO1xuICAgIH1cbiAgICBpZiAobmFtZXNwYWNlVVJJID09PSBET01OYW1lc3BhY2VzLmh0bWwpIHtcbiAgICAgIGlmICh0aGlzLl90YWcgPT09ICdzdmcnKSB7XG4gICAgICAgIG5hbWVzcGFjZVVSSSA9IERPTU5hbWVzcGFjZXMuc3ZnO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl90YWcgPT09ICdtYXRoJykge1xuICAgICAgICBuYW1lc3BhY2VVUkkgPSBET01OYW1lc3BhY2VzLm1hdGhtbDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fbmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJO1xuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgcGFyZW50SW5mbztcbiAgICAgIGlmIChob3N0UGFyZW50ICE9IG51bGwpIHtcbiAgICAgICAgcGFyZW50SW5mbyA9IGhvc3RQYXJlbnQuX2FuY2VzdG9ySW5mbztcbiAgICAgIH0gZWxzZSBpZiAoaG9zdENvbnRhaW5lckluZm8uX3RhZykge1xuICAgICAgICBwYXJlbnRJbmZvID0gaG9zdENvbnRhaW5lckluZm8uX2FuY2VzdG9ySW5mbztcbiAgICAgIH1cbiAgICAgIGlmIChwYXJlbnRJbmZvKSB7XG4gICAgICAgIC8vIHBhcmVudEluZm8gc2hvdWxkIGFsd2F5cyBiZSBwcmVzZW50IGV4Y2VwdCBmb3IgdGhlIHRvcC1sZXZlbFxuICAgICAgICAvLyBjb21wb25lbnQgd2hlbiBzZXJ2ZXIgcmVuZGVyaW5nXG4gICAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyh0aGlzLl90YWcsIG51bGwsIHRoaXMsIHBhcmVudEluZm8pO1xuICAgICAgfVxuICAgICAgdGhpcy5fYW5jZXN0b3JJbmZvID0gdmFsaWRhdGVET01OZXN0aW5nLnVwZGF0ZWRBbmNlc3RvckluZm8ocGFyZW50SW5mbywgdGhpcy5fdGFnLCB0aGlzKTtcbiAgICB9XG5cbiAgICB2YXIgbW91bnRJbWFnZTtcbiAgICBpZiAodHJhbnNhY3Rpb24udXNlQ3JlYXRlRWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyRG9jdW1lbnQgPSBob3N0Q29udGFpbmVySW5mby5fb3duZXJEb2N1bWVudDtcbiAgICAgIHZhciBlbDtcbiAgICAgIGlmIChuYW1lc3BhY2VVUkkgPT09IERPTU5hbWVzcGFjZXMuaHRtbCkge1xuICAgICAgICBpZiAodGhpcy5fdGFnID09PSAnc2NyaXB0Jykge1xuICAgICAgICAgIC8vIENyZWF0ZSB0aGUgc2NyaXB0IHZpYSAuaW5uZXJIVE1MIHNvIGl0cyBcInBhcnNlci1pbnNlcnRlZFwiIGZsYWcgaXNcbiAgICAgICAgICAvLyBzZXQgdG8gdHJ1ZSBhbmQgaXQgZG9lcyBub3QgZXhlY3V0ZVxuICAgICAgICAgIHZhciBkaXYgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIHZhciB0eXBlID0gdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZTtcbiAgICAgICAgICBkaXYuaW5uZXJIVE1MID0gJzwnICsgdHlwZSArICc+PC8nICsgdHlwZSArICc+JztcbiAgICAgICAgICBlbCA9IGRpdi5yZW1vdmVDaGlsZChkaXYuZmlyc3RDaGlsZCk7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvcHMuaXMpIHtcbiAgICAgICAgICBlbCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlLCBwcm9wcy5pcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU2VwYXJhdGUgZWxzZSBicmFuY2ggaW5zdGVhZCBvZiB1c2luZyBgcHJvcHMuaXMgfHwgdW5kZWZpbmVkYCBhYm92ZSBiZWN1YXNlIG9mIGEgRmlyZWZveCBidWcuXG4gICAgICAgICAgLy8gU2VlIGRpc2N1c3Npb24gaW4gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNjg5NlxuICAgICAgICAgIC8vIGFuZCBkaXNjdXNzaW9uIGluIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEyNzYyNDBcbiAgICAgICAgICBlbCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWwgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUpO1xuICAgICAgfVxuICAgICAgUmVhY3RET01Db21wb25lbnRUcmVlLnByZWNhY2hlTm9kZSh0aGlzLCBlbCk7XG4gICAgICB0aGlzLl9mbGFncyB8PSBGbGFncy5oYXNDYWNoZWRDaGlsZE5vZGVzO1xuICAgICAgaWYgKCF0aGlzLl9ob3N0UGFyZW50KSB7XG4gICAgICAgIERPTVByb3BlcnR5T3BlcmF0aW9ucy5zZXRBdHRyaWJ1dGVGb3JSb290KGVsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3VwZGF0ZURPTVByb3BlcnRpZXMobnVsbCwgcHJvcHMsIHRyYW5zYWN0aW9uKTtcbiAgICAgIHZhciBsYXp5VHJlZSA9IERPTUxhenlUcmVlKGVsKTtcbiAgICAgIHRoaXMuX2NyZWF0ZUluaXRpYWxDaGlsZHJlbih0cmFuc2FjdGlvbiwgcHJvcHMsIGNvbnRleHQsIGxhenlUcmVlKTtcbiAgICAgIG1vdW50SW1hZ2UgPSBsYXp5VHJlZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHRhZ09wZW4gPSB0aGlzLl9jcmVhdGVPcGVuVGFnTWFya3VwQW5kUHV0TGlzdGVuZXJzKHRyYW5zYWN0aW9uLCBwcm9wcyk7XG4gICAgICB2YXIgdGFnQ29udGVudCA9IHRoaXMuX2NyZWF0ZUNvbnRlbnRNYXJrdXAodHJhbnNhY3Rpb24sIHByb3BzLCBjb250ZXh0KTtcbiAgICAgIGlmICghdGFnQ29udGVudCAmJiBvbWl0dGVkQ2xvc2VUYWdzW3RoaXMuX3RhZ10pIHtcbiAgICAgICAgbW91bnRJbWFnZSA9IHRhZ09wZW4gKyAnLz4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbW91bnRJbWFnZSA9IHRhZ09wZW4gKyAnPicgKyB0YWdDb250ZW50ICsgJzwvJyArIHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUgKyAnPic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dpdGNoICh0aGlzLl90YWcpIHtcbiAgICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShpbnB1dFBvc3RNb3VudCwgdGhpcyk7XG4gICAgICAgIGlmIChwcm9wcy5hdXRvRm9jdXMpIHtcbiAgICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKEF1dG9Gb2N1c1V0aWxzLmZvY3VzRE9NQ29tcG9uZW50LCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgICAgdHJhbnNhY3Rpb24uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZSh0ZXh0YXJlYVBvc3RNb3VudCwgdGhpcyk7XG4gICAgICAgIGlmIChwcm9wcy5hdXRvRm9jdXMpIHtcbiAgICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKEF1dG9Gb2N1c1V0aWxzLmZvY3VzRE9NQ29tcG9uZW50LCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIGlmIChwcm9wcy5hdXRvRm9jdXMpIHtcbiAgICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKEF1dG9Gb2N1c1V0aWxzLmZvY3VzRE9NQ29tcG9uZW50LCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2J1dHRvbic6XG4gICAgICAgIGlmIChwcm9wcy5hdXRvRm9jdXMpIHtcbiAgICAgICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKEF1dG9Gb2N1c1V0aWxzLmZvY3VzRE9NQ29tcG9uZW50LCB0aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29wdGlvbic6XG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUob3B0aW9uUG9zdE1vdW50LCB0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1vdW50SW1hZ2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgbWFya3VwIGZvciB0aGUgb3BlbiB0YWcgYW5kIGFsbCBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBoYXMgc2lkZSBlZmZlY3RzIGJlY2F1c2UgZXZlbnRzIGdldCByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBJdGVyYXRpbmcgb3ZlciBvYmplY3QgcHJvcGVydGllcyBpcyBmYXN0ZXIgdGhhbiBpdGVyYXRpbmcgb3ZlciBhcnJheXMuXG4gICAqIEBzZWUgaHR0cDovL2pzcGVyZi5jb20vb2JqLXZzLWFyci1pdGVyYXRpb25cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9IE1hcmt1cCBvZiBvcGVuaW5nIHRhZy5cbiAgICovXG4gIF9jcmVhdGVPcGVuVGFnTWFya3VwQW5kUHV0TGlzdGVuZXJzOiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIHByb3BzKSB7XG4gICAgdmFyIHJldCA9ICc8JyArIHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7XG5cbiAgICBmb3IgKHZhciBwcm9wS2V5IGluIHByb3BzKSB7XG4gICAgICBpZiAoIXByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdmFyIHByb3BWYWx1ZSA9IHByb3BzW3Byb3BLZXldO1xuICAgICAgaWYgKHByb3BWYWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAgIGlmIChwcm9wVmFsdWUpIHtcbiAgICAgICAgICBlbnF1ZXVlUHV0TGlzdGVuZXIodGhpcywgcHJvcEtleSwgcHJvcFZhbHVlLCB0cmFuc2FjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwcm9wS2V5ID09PSBTVFlMRSkge1xuICAgICAgICAgIGlmIChwcm9wVmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAvLyBTZWUgYF91cGRhdGVET01Qcm9wZXJ0aWVzYC4gc3R5bGUgYmxvY2tcbiAgICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNTdHlsZSA9IHByb3BWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb3BWYWx1ZSA9IHRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5ID0gX2Fzc2lnbih7fSwgcHJvcHMuc3R5bGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwcm9wVmFsdWUgPSBDU1NQcm9wZXJ0eU9wZXJhdGlvbnMuY3JlYXRlTWFya3VwRm9yU3R5bGVzKHByb3BWYWx1ZSwgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1hcmt1cCA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLl90YWcgIT0gbnVsbCAmJiBpc0N1c3RvbUNvbXBvbmVudCh0aGlzLl90YWcsIHByb3BzKSkge1xuICAgICAgICAgIGlmICghUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgICAgICAgIG1hcmt1cCA9IERPTVByb3BlcnR5T3BlcmF0aW9ucy5jcmVhdGVNYXJrdXBGb3JDdXN0b21BdHRyaWJ1dGUocHJvcEtleSwgcHJvcFZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWFya3VwID0gRE9NUHJvcGVydHlPcGVyYXRpb25zLmNyZWF0ZU1hcmt1cEZvclByb3BlcnR5KHByb3BLZXksIHByb3BWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hcmt1cCkge1xuICAgICAgICAgIHJldCArPSAnICcgKyBtYXJrdXA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGb3Igc3RhdGljIHBhZ2VzLCBubyBuZWVkIHRvIHB1dCBSZWFjdCBJRCBhbmQgY2hlY2tzdW0uIFNhdmVzIGxvdHMgb2ZcbiAgICAvLyBieXRlcy5cbiAgICBpZiAodHJhbnNhY3Rpb24ucmVuZGVyVG9TdGF0aWNNYXJrdXApIHtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9ob3N0UGFyZW50KSB7XG4gICAgICByZXQgKz0gJyAnICsgRE9NUHJvcGVydHlPcGVyYXRpb25zLmNyZWF0ZU1hcmt1cEZvclJvb3QoKTtcbiAgICB9XG4gICAgcmV0ICs9ICcgJyArIERPTVByb3BlcnR5T3BlcmF0aW9ucy5jcmVhdGVNYXJrdXBGb3JJRCh0aGlzLl9kb21JRCk7XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcblxuICAvKipcbiAgICogQ3JlYXRlcyBtYXJrdXAgZm9yIHRoZSBjb250ZW50IGJldHdlZW4gdGhlIHRhZ3MuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbnxSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge29iamVjdH0gcHJvcHNcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICogQHJldHVybiB7c3RyaW5nfSBDb250ZW50IG1hcmt1cC5cbiAgICovXG4gIF9jcmVhdGVDb250ZW50TWFya3VwOiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIHByb3BzLCBjb250ZXh0KSB7XG4gICAgdmFyIHJldCA9ICcnO1xuXG4gICAgLy8gSW50ZW50aW9uYWwgdXNlIG9mICE9IHRvIGF2b2lkIGNhdGNoaW5nIHplcm8vZmFsc2UuXG4gICAgdmFyIGlubmVySFRNTCA9IHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MO1xuICAgIGlmIChpbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICAgaWYgKGlubmVySFRNTC5fX2h0bWwgIT0gbnVsbCkge1xuICAgICAgICByZXQgPSBpbm5lckhUTUwuX19odG1sO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY29udGVudFRvVXNlID0gQ09OVEVOVF9UWVBFU1t0eXBlb2YgcHJvcHMuY2hpbGRyZW5dID8gcHJvcHMuY2hpbGRyZW4gOiBudWxsO1xuICAgICAgdmFyIGNoaWxkcmVuVG9Vc2UgPSBjb250ZW50VG9Vc2UgIT0gbnVsbCA/IG51bGwgOiBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIGlmIChjb250ZW50VG9Vc2UgIT0gbnVsbCkge1xuICAgICAgICAvLyBUT0RPOiBWYWxpZGF0ZSB0aGF0IHRleHQgaXMgYWxsb3dlZCBhcyBhIGNoaWxkIG9mIHRoaXMgbm9kZVxuICAgICAgICByZXQgPSBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIoY29udGVudFRvVXNlKTtcbiAgICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgc2V0QW5kVmFsaWRhdGVDb250ZW50Q2hpbGREZXYuY2FsbCh0aGlzLCBjb250ZW50VG9Vc2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNoaWxkcmVuVG9Vc2UgIT0gbnVsbCkge1xuICAgICAgICB2YXIgbW91bnRJbWFnZXMgPSB0aGlzLm1vdW50Q2hpbGRyZW4oY2hpbGRyZW5Ub1VzZSwgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgICAgICByZXQgPSBtb3VudEltYWdlcy5qb2luKCcnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5ld2xpbmVFYXRpbmdUYWdzW3RoaXMuX3RhZ10gJiYgcmV0LmNoYXJBdCgwKSA9PT0gJ1xcbicpIHtcbiAgICAgIC8vIHRleHQvaHRtbCBpZ25vcmVzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlc2UgdGFncyBpZiBpdCdzIGEgbmV3bGluZVxuICAgICAgLy8gUHJlZmVyIHRvIGJyZWFrIGFwcGxpY2F0aW9uL3htbCBvdmVyIHRleHQvaHRtbCAoZm9yIG5vdykgYnkgYWRkaW5nXG4gICAgICAvLyBhIG5ld2xpbmUgc3BlY2lmaWNhbGx5IHRvIGdldCBlYXRlbiBieSB0aGUgcGFyc2VyLiAoQWx0ZXJuYXRlbHkgZm9yXG4gICAgICAvLyB0ZXh0YXJlYXMsIHJlcGxhY2luZyBcIl5cXG5cIiB3aXRoIFwiXFxyXFxuXCIgZG9lc24ndCBnZXQgZWF0ZW4sIGFuZCB0aGUgZmlyc3RcbiAgICAgIC8vIFxcciBpcyBub3JtYWxpemVkIG91dCBieSBIVE1MVGV4dEFyZWFFbGVtZW50I3ZhbHVlLilcbiAgICAgIC8vIFNlZTogPGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWwtcG9seWdsb3QvI25ld2xpbmVzLWluLXRleHRhcmVhLWFuZC1wcmU+XG4gICAgICAvLyBTZWU6IDxodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zeW50YXguaHRtbCNlbGVtZW50LXJlc3RyaWN0aW9ucz5cbiAgICAgIC8vIFNlZTogPGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L3N5bnRheC5odG1sI25ld2xpbmVzPlxuICAgICAgLy8gU2VlOiBQYXJzaW5nIG9mIFwidGV4dGFyZWFcIiBcImxpc3RpbmdcIiBhbmQgXCJwcmVcIiBlbGVtZW50c1xuICAgICAgLy8gIGZyb20gPGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmJvZHk+XG4gICAgICByZXR1cm4gJ1xcbicgKyByZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICB9LFxuXG4gIF9jcmVhdGVJbml0aWFsQ2hpbGRyZW46IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgcHJvcHMsIGNvbnRleHQsIGxhenlUcmVlKSB7XG4gICAgLy8gSW50ZW50aW9uYWwgdXNlIG9mICE9IHRvIGF2b2lkIGNhdGNoaW5nIHplcm8vZmFsc2UuXG4gICAgdmFyIGlubmVySFRNTCA9IHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MO1xuICAgIGlmIChpbm5lckhUTUwgIT0gbnVsbCkge1xuICAgICAgaWYgKGlubmVySFRNTC5fX2h0bWwgIT0gbnVsbCkge1xuICAgICAgICBET01MYXp5VHJlZS5xdWV1ZUhUTUwobGF6eVRyZWUsIGlubmVySFRNTC5fX2h0bWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgY29udGVudFRvVXNlID0gQ09OVEVOVF9UWVBFU1t0eXBlb2YgcHJvcHMuY2hpbGRyZW5dID8gcHJvcHMuY2hpbGRyZW4gOiBudWxsO1xuICAgICAgdmFyIGNoaWxkcmVuVG9Vc2UgPSBjb250ZW50VG9Vc2UgIT0gbnVsbCA/IG51bGwgOiBwcm9wcy5jaGlsZHJlbjtcbiAgICAgIC8vIFRPRE86IFZhbGlkYXRlIHRoYXQgdGV4dCBpcyBhbGxvd2VkIGFzIGEgY2hpbGQgb2YgdGhpcyBub2RlXG4gICAgICBpZiAoY29udGVudFRvVXNlICE9IG51bGwpIHtcbiAgICAgICAgLy8gQXZvaWQgc2V0dGluZyB0ZXh0Q29udGVudCB3aGVuIHRoZSB0ZXh0IGlzIGVtcHR5LiBJbiBJRTExIHNldHRpbmdcbiAgICAgICAgLy8gdGV4dENvbnRlbnQgb24gYSB0ZXh0IGFyZWEgd2lsbCBjYXVzZSB0aGUgcGxhY2Vob2xkZXIgdG8gbm90XG4gICAgICAgIC8vIHNob3cgd2l0aGluIHRoZSB0ZXh0YXJlYSB1bnRpbCBpdCBoYXMgYmVlbiBmb2N1c2VkIGFuZCBibHVycmVkIGFnYWluLlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzY3MzEjaXNzdWVjb21tZW50LTI1NDg3NDU1M1xuICAgICAgICBpZiAoY29udGVudFRvVXNlICE9PSAnJykge1xuICAgICAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgc2V0QW5kVmFsaWRhdGVDb250ZW50Q2hpbGREZXYuY2FsbCh0aGlzLCBjb250ZW50VG9Vc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBET01MYXp5VHJlZS5xdWV1ZVRleHQobGF6eVRyZWUsIGNvbnRlbnRUb1VzZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2hpbGRyZW5Ub1VzZSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBtb3VudEltYWdlcyA9IHRoaXMubW91bnRDaGlsZHJlbihjaGlsZHJlblRvVXNlLCB0cmFuc2FjdGlvbiwgY29udGV4dCk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbW91bnRJbWFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBET01MYXp5VHJlZS5xdWV1ZUNoaWxkKGxhenlUcmVlLCBtb3VudEltYWdlc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlY2VpdmVzIGEgbmV4dCBlbGVtZW50IGFuZCB1cGRhdGVzIHRoZSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dEVsZW1lbnRcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0XG4gICAqL1xuICByZWNlaXZlQ29tcG9uZW50OiBmdW5jdGlvbiAobmV4dEVsZW1lbnQsIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgdmFyIHByZXZFbGVtZW50ID0gdGhpcy5fY3VycmVudEVsZW1lbnQ7XG4gICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBuZXh0RWxlbWVudDtcbiAgICB0aGlzLnVwZGF0ZUNvbXBvbmVudCh0cmFuc2FjdGlvbiwgcHJldkVsZW1lbnQsIG5leHRFbGVtZW50LCBjb250ZXh0KTtcbiAgfSxcblxuICAvKipcbiAgICogVXBkYXRlcyBhIERPTSBjb21wb25lbnQgYWZ0ZXIgaXQgaGFzIGFscmVhZHkgYmVlbiBhbGxvY2F0ZWQgYW5kXG4gICAqIGF0dGFjaGVkIHRvIHRoZSBET00uIFJlY29uY2lsZXMgdGhlIHJvb3QgRE9NIG5vZGUsIHRoZW4gcmVjdXJzZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IHByZXZFbGVtZW50XG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudFxuICAgKiBAaW50ZXJuYWxcbiAgICogQG92ZXJyaWRhYmxlXG4gICAqL1xuICB1cGRhdGVDb21wb25lbnQ6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgcHJldkVsZW1lbnQsIG5leHRFbGVtZW50LCBjb250ZXh0KSB7XG4gICAgdmFyIGxhc3RQcm9wcyA9IHByZXZFbGVtZW50LnByb3BzO1xuICAgIHZhciBuZXh0UHJvcHMgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztcblxuICAgIHN3aXRjaCAodGhpcy5fdGFnKSB7XG4gICAgICBjYXNlICdpbnB1dCc6XG4gICAgICAgIGxhc3RQcm9wcyA9IFJlYWN0RE9NSW5wdXQuZ2V0SG9zdFByb3BzKHRoaXMsIGxhc3RQcm9wcyk7XG4gICAgICAgIG5leHRQcm9wcyA9IFJlYWN0RE9NSW5wdXQuZ2V0SG9zdFByb3BzKHRoaXMsIG5leHRQcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgICAgbGFzdFByb3BzID0gUmVhY3RET01PcHRpb24uZ2V0SG9zdFByb3BzKHRoaXMsIGxhc3RQcm9wcyk7XG4gICAgICAgIG5leHRQcm9wcyA9IFJlYWN0RE9NT3B0aW9uLmdldEhvc3RQcm9wcyh0aGlzLCBuZXh0UHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIGxhc3RQcm9wcyA9IFJlYWN0RE9NU2VsZWN0LmdldEhvc3RQcm9wcyh0aGlzLCBsYXN0UHJvcHMpO1xuICAgICAgICBuZXh0UHJvcHMgPSBSZWFjdERPTVNlbGVjdC5nZXRIb3N0UHJvcHModGhpcywgbmV4dFByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0ZXh0YXJlYSc6XG4gICAgICAgIGxhc3RQcm9wcyA9IFJlYWN0RE9NVGV4dGFyZWEuZ2V0SG9zdFByb3BzKHRoaXMsIGxhc3RQcm9wcyk7XG4gICAgICAgIG5leHRQcm9wcyA9IFJlYWN0RE9NVGV4dGFyZWEuZ2V0SG9zdFByb3BzKHRoaXMsIG5leHRQcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGFzc2VydFZhbGlkUHJvcHModGhpcywgbmV4dFByb3BzKTtcbiAgICB0aGlzLl91cGRhdGVET01Qcm9wZXJ0aWVzKGxhc3RQcm9wcywgbmV4dFByb3BzLCB0cmFuc2FjdGlvbik7XG4gICAgdGhpcy5fdXBkYXRlRE9NQ2hpbGRyZW4obGFzdFByb3BzLCBuZXh0UHJvcHMsIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcblxuICAgIHN3aXRjaCAodGhpcy5fdGFnKSB7XG4gICAgICBjYXNlICdpbnB1dCc6XG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgd3JhcHBlciBhcm91bmQgaW5wdXRzICphZnRlciogdXBkYXRpbmcgcHJvcHMuIFRoaXMgaGFzIHRvXG4gICAgICAgIC8vIGhhcHBlbiBhZnRlciBgX3VwZGF0ZURPTVByb3BlcnRpZXNgLiBPdGhlcndpc2UgSFRNTDUgaW5wdXQgdmFsaWRhdGlvbnNcbiAgICAgICAgLy8gcmFpc2Ugd2FybmluZ3MgYW5kIHByZXZlbnQgdGhlIG5ldyB2YWx1ZSBmcm9tIGJlaW5nIGFzc2lnbmVkLlxuICAgICAgICBSZWFjdERPTUlucHV0LnVwZGF0ZVdyYXBwZXIodGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGV4dGFyZWEnOlxuICAgICAgICBSZWFjdERPTVRleHRhcmVhLnVwZGF0ZVdyYXBwZXIodGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgLy8gPHNlbGVjdD4gdmFsdWUgdXBkYXRlIG5lZWRzIHRvIG9jY3VyIGFmdGVyIDxvcHRpb24+IGNoaWxkcmVuXG4gICAgICAgIC8vIHJlY29uY2lsaWF0aW9uXG4gICAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUocG9zdFVwZGF0ZVNlbGVjdFdyYXBwZXIsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlY29uY2lsZXMgdGhlIHByb3BlcnRpZXMgYnkgZGV0ZWN0aW5nIGRpZmZlcmVuY2VzIGluIHByb3BlcnR5IHZhbHVlcyBhbmRcbiAgICogdXBkYXRpbmcgdGhlIERPTSBhcyBuZWNlc3NhcnkuIFRoaXMgZnVuY3Rpb24gaXMgcHJvYmFibHkgdGhlIHNpbmdsZSBtb3N0XG4gICAqIGNyaXRpY2FsIHBhdGggZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbi5cbiAgICpcbiAgICogVE9ETzogQmVuY2htYXJrIHdoZXRoZXIgY2hlY2tpbmcgZm9yIGNoYW5nZWQgdmFsdWVzIGluIG1lbW9yeSBhY3R1YWxseVxuICAgKiAgICAgICBpbXByb3ZlcyBwZXJmb3JtYW5jZSAoZXNwZWNpYWxseSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudHMpLlxuICAgKiBUT0RPOiBCZW5jaG1hcmsgdGhlIGVmZmVjdHMgb2YgcHV0dGluZyB0aGlzIGF0IHRoZSB0b3Agc2luY2UgOTklIG9mIHByb3BzXG4gICAqICAgICAgIGRvIG5vdCBjaGFuZ2UgZm9yIGEgZ2l2ZW4gcmVjb25jaWxpYXRpb24uXG4gICAqIFRPRE86IEJlbmNobWFyayBhcmVhcyB0aGF0IGNhbiBiZSBpbXByb3ZlZCB3aXRoIGNhY2hpbmcuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBsYXN0UHJvcHNcbiAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9wc1xuICAgKiBAcGFyYW0gez9ET01FbGVtZW50fSBub2RlXG4gICAqL1xuICBfdXBkYXRlRE9NUHJvcGVydGllczogZnVuY3Rpb24gKGxhc3RQcm9wcywgbmV4dFByb3BzLCB0cmFuc2FjdGlvbikge1xuICAgIHZhciBwcm9wS2V5O1xuICAgIHZhciBzdHlsZU5hbWU7XG4gICAgdmFyIHN0eWxlVXBkYXRlcztcbiAgICBmb3IgKHByb3BLZXkgaW4gbGFzdFByb3BzKSB7XG4gICAgICBpZiAobmV4dFByb3BzLmhhc093blByb3BlcnR5KHByb3BLZXkpIHx8ICFsYXN0UHJvcHMuaGFzT3duUHJvcGVydHkocHJvcEtleSkgfHwgbGFzdFByb3BzW3Byb3BLZXldID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcEtleSA9PT0gU1RZTEUpIHtcbiAgICAgICAgdmFyIGxhc3RTdHlsZSA9IHRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5O1xuICAgICAgICBmb3IgKHN0eWxlTmFtZSBpbiBsYXN0U3R5bGUpIHtcbiAgICAgICAgICBpZiAobGFzdFN0eWxlLmhhc093blByb3BlcnR5KHN0eWxlTmFtZSkpIHtcbiAgICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IHN0eWxlVXBkYXRlcyB8fCB7fTtcbiAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gJyc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5ID0gbnVsbDtcbiAgICAgIH0gZWxzZSBpZiAocmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgICAgaWYgKGxhc3RQcm9wc1twcm9wS2V5XSkge1xuICAgICAgICAgIC8vIE9ubHkgY2FsbCBkZWxldGVMaXN0ZW5lciBpZiB0aGVyZSB3YXMgYSBsaXN0ZW5lciBwcmV2aW91c2x5IG9yXG4gICAgICAgICAgLy8gZWxzZSB3aWxsRGVsZXRlTGlzdGVuZXIgZ2V0cyBjYWxsZWQgd2hlbiB0aGVyZSB3YXNuJ3QgYWN0dWFsbHkgYVxuICAgICAgICAgIC8vIGxpc3RlbmVyIChlLmcuLCBvbkNsaWNrPXtudWxsfSlcbiAgICAgICAgICBkZWxldGVMaXN0ZW5lcih0aGlzLCBwcm9wS2V5KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChpc0N1c3RvbUNvbXBvbmVudCh0aGlzLl90YWcsIGxhc3RQcm9wcykpIHtcbiAgICAgICAgaWYgKCFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSkge1xuICAgICAgICAgIERPTVByb3BlcnR5T3BlcmF0aW9ucy5kZWxldGVWYWx1ZUZvckF0dHJpYnV0ZShnZXROb2RlKHRoaXMpLCBwcm9wS2V5KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChET01Qcm9wZXJ0eS5wcm9wZXJ0aWVzW3Byb3BLZXldIHx8IERPTVByb3BlcnR5LmlzQ3VzdG9tQXR0cmlidXRlKHByb3BLZXkpKSB7XG4gICAgICAgIERPTVByb3BlcnR5T3BlcmF0aW9ucy5kZWxldGVWYWx1ZUZvclByb3BlcnR5KGdldE5vZGUodGhpcyksIHByb3BLZXkpO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKHByb3BLZXkgaW4gbmV4dFByb3BzKSB7XG4gICAgICB2YXIgbmV4dFByb3AgPSBuZXh0UHJvcHNbcHJvcEtleV07XG4gICAgICB2YXIgbGFzdFByb3AgPSBwcm9wS2V5ID09PSBTVFlMRSA/IHRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5IDogbGFzdFByb3BzICE9IG51bGwgPyBsYXN0UHJvcHNbcHJvcEtleV0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoIW5leHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShwcm9wS2V5KSB8fCBuZXh0UHJvcCA9PT0gbGFzdFByb3AgfHwgbmV4dFByb3AgPT0gbnVsbCAmJiBsYXN0UHJvcCA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BLZXkgPT09IFNUWUxFKSB7XG4gICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgY2hlY2tBbmRXYXJuRm9yTXV0YXRlZFN0eWxlKHRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5LCB0aGlzLl9wcmV2aW91c1N0eWxlLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzU3R5bGUgPSBuZXh0UHJvcDtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV4dFByb3AgPSB0aGlzLl9wcmV2aW91c1N0eWxlQ29weSA9IF9hc3NpZ24oe30sIG5leHRQcm9wKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9wcmV2aW91c1N0eWxlQ29weSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxhc3RQcm9wKSB7XG4gICAgICAgICAgLy8gVW5zZXQgc3R5bGVzIG9uIGBsYXN0UHJvcGAgYnV0IG5vdCBvbiBgbmV4dFByb3BgLlxuICAgICAgICAgIGZvciAoc3R5bGVOYW1lIGluIGxhc3RQcm9wKSB7XG4gICAgICAgICAgICBpZiAobGFzdFByb3AuaGFzT3duUHJvcGVydHkoc3R5bGVOYW1lKSAmJiAoIW5leHRQcm9wIHx8ICFuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpKSkge1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXMgPSBzdHlsZVVwZGF0ZXMgfHwge307XG4gICAgICAgICAgICAgIHN0eWxlVXBkYXRlc1tzdHlsZU5hbWVdID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFVwZGF0ZSBzdHlsZXMgdGhhdCBjaGFuZ2VkIHNpbmNlIGBsYXN0UHJvcGAuXG4gICAgICAgICAgZm9yIChzdHlsZU5hbWUgaW4gbmV4dFByb3ApIHtcbiAgICAgICAgICAgIGlmIChuZXh0UHJvcC5oYXNPd25Qcm9wZXJ0eShzdHlsZU5hbWUpICYmIGxhc3RQcm9wW3N0eWxlTmFtZV0gIT09IG5leHRQcm9wW3N0eWxlTmFtZV0pIHtcbiAgICAgICAgICAgICAgc3R5bGVVcGRhdGVzID0gc3R5bGVVcGRhdGVzIHx8IHt9O1xuICAgICAgICAgICAgICBzdHlsZVVwZGF0ZXNbc3R5bGVOYW1lXSA9IG5leHRQcm9wW3N0eWxlTmFtZV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFJlbGllcyBvbiBgdXBkYXRlU3R5bGVzQnlJRGAgbm90IG11dGF0aW5nIGBzdHlsZVVwZGF0ZXNgLlxuICAgICAgICAgIHN0eWxlVXBkYXRlcyA9IG5leHRQcm9wO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KHByb3BLZXkpKSB7XG4gICAgICAgIGlmIChuZXh0UHJvcCkge1xuICAgICAgICAgIGVucXVldWVQdXRMaXN0ZW5lcih0aGlzLCBwcm9wS2V5LCBuZXh0UHJvcCwgdHJhbnNhY3Rpb24pO1xuICAgICAgICB9IGVsc2UgaWYgKGxhc3RQcm9wKSB7XG4gICAgICAgICAgZGVsZXRlTGlzdGVuZXIodGhpcywgcHJvcEtleSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDdXN0b21Db21wb25lbnQodGhpcy5fdGFnLCBuZXh0UHJvcHMpKSB7XG4gICAgICAgIGlmICghUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcEtleSkpIHtcbiAgICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuc2V0VmFsdWVGb3JBdHRyaWJ1dGUoZ2V0Tm9kZSh0aGlzKSwgcHJvcEtleSwgbmV4dFByb3ApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKERPTVByb3BlcnR5LnByb3BlcnRpZXNbcHJvcEtleV0gfHwgRE9NUHJvcGVydHkuaXNDdXN0b21BdHRyaWJ1dGUocHJvcEtleSkpIHtcbiAgICAgICAgdmFyIG5vZGUgPSBnZXROb2RlKHRoaXMpO1xuICAgICAgICAvLyBJZiB3ZSdyZSB1cGRhdGluZyB0byBudWxsIG9yIHVuZGVmaW5lZCwgd2Ugc2hvdWxkIHJlbW92ZSB0aGUgcHJvcGVydHlcbiAgICAgICAgLy8gZnJvbSB0aGUgRE9NIG5vZGUgaW5zdGVhZCBvZiBpbmFkdmVydGVudGx5IHNldHRpbmcgdG8gYSBzdHJpbmcuIFRoaXNcbiAgICAgICAgLy8gYnJpbmdzIHVzIGluIGxpbmUgd2l0aCB0aGUgc2FtZSBiZWhhdmlvciB3ZSBoYXZlIG9uIGluaXRpYWwgcmVuZGVyLlxuICAgICAgICBpZiAobmV4dFByb3AgIT0gbnVsbCkge1xuICAgICAgICAgIERPTVByb3BlcnR5T3BlcmF0aW9ucy5zZXRWYWx1ZUZvclByb3BlcnR5KG5vZGUsIHByb3BLZXksIG5leHRQcm9wKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBET01Qcm9wZXJ0eU9wZXJhdGlvbnMuZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eShub2RlLCBwcm9wS2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3R5bGVVcGRhdGVzKSB7XG4gICAgICBDU1NQcm9wZXJ0eU9wZXJhdGlvbnMuc2V0VmFsdWVGb3JTdHlsZXMoZ2V0Tm9kZSh0aGlzKSwgc3R5bGVVcGRhdGVzLCB0aGlzKTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlY29uY2lsZXMgdGhlIGNoaWxkcmVuIHdpdGggdGhlIHZhcmlvdXMgcHJvcGVydGllcyB0aGF0IGFmZmVjdCB0aGVcbiAgICogY2hpbGRyZW4gY29udGVudC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGxhc3RQcm9wc1xuICAgKiBAcGFyYW0ge29iamVjdH0gbmV4dFByb3BzXG4gICAqIEBwYXJhbSB7UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHRcbiAgICovXG4gIF91cGRhdGVET01DaGlsZHJlbjogZnVuY3Rpb24gKGxhc3RQcm9wcywgbmV4dFByb3BzLCB0cmFuc2FjdGlvbiwgY29udGV4dCkge1xuICAgIHZhciBsYXN0Q29udGVudCA9IENPTlRFTlRfVFlQRVNbdHlwZW9mIGxhc3RQcm9wcy5jaGlsZHJlbl0gPyBsYXN0UHJvcHMuY2hpbGRyZW4gOiBudWxsO1xuICAgIHZhciBuZXh0Q29udGVudCA9IENPTlRFTlRfVFlQRVNbdHlwZW9mIG5leHRQcm9wcy5jaGlsZHJlbl0gPyBuZXh0UHJvcHMuY2hpbGRyZW4gOiBudWxsO1xuXG4gICAgdmFyIGxhc3RIdG1sID0gbGFzdFByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICYmIGxhc3RQcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWw7XG4gICAgdmFyIG5leHRIdG1sID0gbmV4dFByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MICYmIG5leHRQcm9wcy5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWw7XG5cbiAgICAvLyBOb3RlIHRoZSB1c2Ugb2YgYCE9YCB3aGljaCBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkLlxuICAgIHZhciBsYXN0Q2hpbGRyZW4gPSBsYXN0Q29udGVudCAhPSBudWxsID8gbnVsbCA6IGxhc3RQcm9wcy5jaGlsZHJlbjtcbiAgICB2YXIgbmV4dENoaWxkcmVuID0gbmV4dENvbnRlbnQgIT0gbnVsbCA/IG51bGwgOiBuZXh0UHJvcHMuY2hpbGRyZW47XG5cbiAgICAvLyBJZiB3ZSdyZSBzd2l0Y2hpbmcgZnJvbSBjaGlsZHJlbiB0byBjb250ZW50L2h0bWwgb3IgdmljZSB2ZXJzYSwgcmVtb3ZlXG4gICAgLy8gdGhlIG9sZCBjb250ZW50XG4gICAgdmFyIGxhc3RIYXNDb250ZW50T3JIdG1sID0gbGFzdENvbnRlbnQgIT0gbnVsbCB8fCBsYXN0SHRtbCAhPSBudWxsO1xuICAgIHZhciBuZXh0SGFzQ29udGVudE9ySHRtbCA9IG5leHRDb250ZW50ICE9IG51bGwgfHwgbmV4dEh0bWwgIT0gbnVsbDtcbiAgICBpZiAobGFzdENoaWxkcmVuICE9IG51bGwgJiYgbmV4dENoaWxkcmVuID09IG51bGwpIHtcbiAgICAgIHRoaXMudXBkYXRlQ2hpbGRyZW4obnVsbCwgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgIH0gZWxzZSBpZiAobGFzdEhhc0NvbnRlbnRPckh0bWwgJiYgIW5leHRIYXNDb250ZW50T3JIdG1sKSB7XG4gICAgICB0aGlzLnVwZGF0ZVRleHRDb250ZW50KCcnKTtcbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25TZXRDaGlsZHJlbih0aGlzLl9kZWJ1Z0lELCBbXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5leHRDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIGlmIChsYXN0Q29udGVudCAhPT0gbmV4dENvbnRlbnQpIHtcbiAgICAgICAgdGhpcy51cGRhdGVUZXh0Q29udGVudCgnJyArIG5leHRDb250ZW50KTtcbiAgICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgc2V0QW5kVmFsaWRhdGVDb250ZW50Q2hpbGREZXYuY2FsbCh0aGlzLCBuZXh0Q29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG5leHRIdG1sICE9IG51bGwpIHtcbiAgICAgIGlmIChsYXN0SHRtbCAhPT0gbmV4dEh0bWwpIHtcbiAgICAgICAgdGhpcy51cGRhdGVNYXJrdXAoJycgKyBuZXh0SHRtbCk7XG4gICAgICB9XG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4odGhpcy5fZGVidWdJRCwgW10pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobmV4dENoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBzZXRBbmRWYWxpZGF0ZUNvbnRlbnRDaGlsZERldi5jYWxsKHRoaXMsIG51bGwpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVwZGF0ZUNoaWxkcmVuKG5leHRDaGlsZHJlbiwgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgIH1cbiAgfSxcblxuICBnZXRIb3N0Tm9kZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBnZXROb2RlKHRoaXMpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyBhbGwgZXZlbnQgcmVnaXN0cmF0aW9ucyBmb3IgdGhpcyBpbnN0YW5jZS4gRG9lcyBub3QgcmVtb3ZlIGZyb21cbiAgICogdGhlIERPTS4gVGhhdCBtdXN0IGJlIGRvbmUgYnkgdGhlIHBhcmVudC5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICB1bm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoc2FmZWx5KSB7XG4gICAgc3dpdGNoICh0aGlzLl90YWcpIHtcbiAgICAgIGNhc2UgJ2F1ZGlvJzpcbiAgICAgIGNhc2UgJ2Zvcm0nOlxuICAgICAgY2FzZSAnaWZyYW1lJzpcbiAgICAgIGNhc2UgJ2ltZyc6XG4gICAgICBjYXNlICdsaW5rJzpcbiAgICAgIGNhc2UgJ29iamVjdCc6XG4gICAgICBjYXNlICdzb3VyY2UnOlxuICAgICAgY2FzZSAndmlkZW8nOlxuICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fd3JhcHBlclN0YXRlLmxpc3RlbmVycztcbiAgICAgICAgaWYgKGxpc3RlbmVycykge1xuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnNbaV0ucmVtb3ZlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgIGNhc2UgJ2JvZHknOlxuICAgICAgICAvKipcbiAgICAgICAgICogQ29tcG9uZW50cyBsaWtlIDxodG1sPiA8aGVhZD4gYW5kIDxib2R5PiBjYW4ndCBiZSByZW1vdmVkIG9yIGFkZGVkXG4gICAgICAgICAqIGVhc2lseSBpbiBhIGNyb3NzLWJyb3dzZXIgd2F5LCBob3dldmVyIGl0J3MgdmFsdWFibGUgdG8gYmUgYWJsZSB0b1xuICAgICAgICAgKiB0YWtlIGFkdmFudGFnZSBvZiBSZWFjdCdzIHJlY29uY2lsaWF0aW9uIGZvciBzdHlsaW5nIGFuZCA8dGl0bGU+XG4gICAgICAgICAqIG1hbmFnZW1lbnQuIFNvIHdlIGp1c3QgZG9jdW1lbnQgaXQgYW5kIHRocm93IGluIGRhbmdlcm91cyBjYXNlcy5cbiAgICAgICAgICovXG4gICAgICAgICFmYWxzZSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnPCVzPiB0cmllZCB0byB1bm1vdW50LiBCZWNhdXNlIG9mIGNyb3NzLWJyb3dzZXIgcXVpcmtzIGl0IGlzIGltcG9zc2libGUgdG8gdW5tb3VudCBzb21lIHRvcC1sZXZlbCBjb21wb25lbnRzIChlZyA8aHRtbD4sIDxoZWFkPiwgYW5kIDxib2R5PikgcmVsaWFibHkgYW5kIGVmZmljaWVudGx5LiBUbyBmaXggdGhpcywgaGF2ZSBhIHNpbmdsZSB0b3AtbGV2ZWwgY29tcG9uZW50IHRoYXQgbmV2ZXIgdW5tb3VudHMgcmVuZGVyIHRoZXNlIGVsZW1lbnRzLicsIHRoaXMuX3RhZykgOiBfcHJvZEludmFyaWFudCgnNjYnLCB0aGlzLl90YWcpIDogdm9pZCAwO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICB0aGlzLnVubW91bnRDaGlsZHJlbihzYWZlbHkpO1xuICAgIFJlYWN0RE9NQ29tcG9uZW50VHJlZS51bmNhY2hlTm9kZSh0aGlzKTtcbiAgICBFdmVudFBsdWdpbkh1Yi5kZWxldGVBbGxMaXN0ZW5lcnModGhpcyk7XG4gICAgdGhpcy5fcm9vdE5vZGVJRCA9IDA7XG4gICAgdGhpcy5fZG9tSUQgPSAwO1xuICAgIHRoaXMuX3dyYXBwZXJTdGF0ZSA9IG51bGw7XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHNldEFuZFZhbGlkYXRlQ29udGVudENoaWxkRGV2LmNhbGwodGhpcywgbnVsbCk7XG4gICAgfVxuICB9LFxuXG4gIGdldFB1YmxpY0luc3RhbmNlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGdldE5vZGUodGhpcyk7XG4gIH1cblxufTtcblxuX2Fzc2lnbihSZWFjdERPTUNvbXBvbmVudC5wcm90b3R5cGUsIFJlYWN0RE9NQ29tcG9uZW50Lk1peGluLCBSZWFjdE11bHRpQ2hpbGQuTWl4aW4pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NQ29tcG9uZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdERPTUNvbXBvbmVudEZsYWdzID0ge1xuICBoYXNDYWNoZWRDaGlsZE5vZGVzOiAxIDw8IDBcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01Db21wb25lbnRGbGFnczsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgRE9NUHJvcGVydHkgPSByZXF1aXJlKCcuL0RPTVByb3BlcnR5Jyk7XG52YXIgUmVhY3RET01Db21wb25lbnRGbGFncyA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRGbGFncycpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbnZhciBBVFRSX05BTUUgPSBET01Qcm9wZXJ0eS5JRF9BVFRSSUJVVEVfTkFNRTtcbnZhciBGbGFncyA9IFJlYWN0RE9NQ29tcG9uZW50RmxhZ3M7XG5cbnZhciBpbnRlcm5hbEluc3RhbmNlS2V5ID0gJ19fcmVhY3RJbnRlcm5hbEluc3RhbmNlJCcgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtcblxuLyoqXG4gKiBDaGVjayBpZiBhIGdpdmVuIG5vZGUgc2hvdWxkIGJlIGNhY2hlZC5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkUHJlY2FjaGVOb2RlKG5vZGUsIG5vZGVJRCkge1xuICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlLmdldEF0dHJpYnV0ZShBVFRSX05BTUUpID09PSBTdHJpbmcobm9kZUlEKSB8fCBub2RlLm5vZGVUeXBlID09PSA4ICYmIG5vZGUubm9kZVZhbHVlID09PSAnIHJlYWN0LXRleHQ6ICcgKyBub2RlSUQgKyAnICcgfHwgbm9kZS5ub2RlVHlwZSA9PT0gOCAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gJyByZWFjdC1lbXB0eTogJyArIG5vZGVJRCArICcgJztcbn1cblxuLyoqXG4gKiBEcmlsbCBkb3duICh0aHJvdWdoIGNvbXBvc2l0ZXMgYW5kIGVtcHR5IGNvbXBvbmVudHMpIHVudGlsIHdlIGdldCBhIGhvc3Qgb3JcbiAqIGhvc3QgdGV4dCBjb21wb25lbnQuXG4gKlxuICogVGhpcyBpcyBwcmV0dHkgcG9seW1vcnBoaWMgYnV0IHVuYXZvaWRhYmxlIHdpdGggdGhlIGN1cnJlbnQgc3RydWN0dXJlIHdlIGhhdmVcbiAqIGZvciBgX3JlbmRlcmVkQ2hpbGRyZW5gLlxuICovXG5mdW5jdGlvbiBnZXRSZW5kZXJlZEhvc3RPclRleHRGcm9tQ29tcG9uZW50KGNvbXBvbmVudCkge1xuICB2YXIgcmVuZGVyZWQ7XG4gIHdoaWxlIChyZW5kZXJlZCA9IGNvbXBvbmVudC5fcmVuZGVyZWRDb21wb25lbnQpIHtcbiAgICBjb21wb25lbnQgPSByZW5kZXJlZDtcbiAgfVxuICByZXR1cm4gY29tcG9uZW50O1xufVxuXG4vKipcbiAqIFBvcHVsYXRlIGBfaG9zdE5vZGVgIG9uIHRoZSByZW5kZXJlZCBob3N0L3RleHQgY29tcG9uZW50IHdpdGggdGhlIGdpdmVuXG4gKiBET00gbm9kZS4gVGhlIHBhc3NlZCBgaW5zdGAgY2FuIGJlIGEgY29tcG9zaXRlLlxuICovXG5mdW5jdGlvbiBwcmVjYWNoZU5vZGUoaW5zdCwgbm9kZSkge1xuICB2YXIgaG9zdEluc3QgPSBnZXRSZW5kZXJlZEhvc3RPclRleHRGcm9tQ29tcG9uZW50KGluc3QpO1xuICBob3N0SW5zdC5faG9zdE5vZGUgPSBub2RlO1xuICBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldID0gaG9zdEluc3Q7XG59XG5cbmZ1bmN0aW9uIHVuY2FjaGVOb2RlKGluc3QpIHtcbiAgdmFyIG5vZGUgPSBpbnN0Ll9ob3N0Tm9kZTtcbiAgaWYgKG5vZGUpIHtcbiAgICBkZWxldGUgbm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XTtcbiAgICBpbnN0Ll9ob3N0Tm9kZSA9IG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBQb3B1bGF0ZSBgX2hvc3ROb2RlYCBvbiBlYWNoIGNoaWxkIG9mIGBpbnN0YCwgYXNzdW1pbmcgdGhhdCB0aGUgY2hpbGRyZW5cbiAqIG1hdGNoIHVwIHdpdGggdGhlIERPTSAoZWxlbWVudCkgY2hpbGRyZW4gb2YgYG5vZGVgLlxuICpcbiAqIFdlIGNhY2hlIGVudGlyZSBsZXZlbHMgYXQgb25jZSB0byBhdm9pZCBhbiBuXjIgcHJvYmxlbSB3aGVyZSB3ZSBhY2Nlc3MgdGhlXG4gKiBjaGlsZHJlbiBvZiBhIG5vZGUgc2VxdWVudGlhbGx5IGFuZCBoYXZlIHRvIHdhbGsgZnJvbSB0aGUgc3RhcnQgdG8gb3VyIHRhcmdldFxuICogbm9kZSBldmVyeSB0aW1lLlxuICpcbiAqIFNpbmNlIHdlIHVwZGF0ZSBgX3JlbmRlcmVkQ2hpbGRyZW5gIGFuZCB0aGUgYWN0dWFsIERPTSBhdCAoc2xpZ2h0bHkpXG4gKiBkaWZmZXJlbnQgdGltZXMsIHdlIGNvdWxkIHJhY2UgaGVyZSBhbmQgc2VlIGEgbmV3ZXIgYF9yZW5kZXJlZENoaWxkcmVuYCB0aGFuXG4gKiB0aGUgRE9NIG5vZGVzIHdlIHNlZS4gVG8gYXZvaWQgdGhpcywgUmVhY3RNdWx0aUNoaWxkIGNhbGxzXG4gKiBgcHJlcGFyZVRvTWFuYWdlQ2hpbGRyZW5gIGJlZm9yZSB3ZSBjaGFuZ2UgYF9yZW5kZXJlZENoaWxkcmVuYCwgYXQgd2hpY2hcbiAqIHRpbWUgdGhlIGNvbnRhaW5lcidzIGNoaWxkIG5vZGVzIGFyZSBhbHdheXMgY2FjaGVkICh1bnRpbCBpdCB1bm1vdW50cykuXG4gKi9cbmZ1bmN0aW9uIHByZWNhY2hlQ2hpbGROb2RlcyhpbnN0LCBub2RlKSB7XG4gIGlmIChpbnN0Ll9mbGFncyAmIEZsYWdzLmhhc0NhY2hlZENoaWxkTm9kZXMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGNoaWxkcmVuID0gaW5zdC5fcmVuZGVyZWRDaGlsZHJlbjtcbiAgdmFyIGNoaWxkTm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgb3V0ZXI6IGZvciAodmFyIG5hbWUgaW4gY2hpbGRyZW4pIHtcbiAgICBpZiAoIWNoaWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdmFyIGNoaWxkSW5zdCA9IGNoaWxkcmVuW25hbWVdO1xuICAgIHZhciBjaGlsZElEID0gZ2V0UmVuZGVyZWRIb3N0T3JUZXh0RnJvbUNvbXBvbmVudChjaGlsZEluc3QpLl9kb21JRDtcbiAgICBpZiAoY2hpbGRJRCA9PT0gMCkge1xuICAgICAgLy8gV2UncmUgY3VycmVudGx5IHVubW91bnRpbmcgdGhpcyBjaGlsZCBpbiBSZWFjdE11bHRpQ2hpbGQ7IHNraXAgaXQuXG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gV2UgYXNzdW1lIHRoZSBjaGlsZCBub2RlcyBhcmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGNoaWxkIGluc3RhbmNlcy5cbiAgICBmb3IgKDsgY2hpbGROb2RlICE9PSBudWxsOyBjaGlsZE5vZGUgPSBjaGlsZE5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgIGlmIChzaG91bGRQcmVjYWNoZU5vZGUoY2hpbGROb2RlLCBjaGlsZElEKSkge1xuICAgICAgICBwcmVjYWNoZU5vZGUoY2hpbGRJbnN0LCBjaGlsZE5vZGUpO1xuICAgICAgICBjb250aW51ZSBvdXRlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gV2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBET00gY2hpbGRyZW4gd2l0aG91dCBmaW5kaW5nIGFuIElEIG1hdGNoLlxuICAgICFmYWxzZSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVW5hYmxlIHRvIGZpbmQgZWxlbWVudCB3aXRoIElEICVzLicsIGNoaWxkSUQpIDogX3Byb2RJbnZhcmlhbnQoJzMyJywgY2hpbGRJRCkgOiB2b2lkIDA7XG4gIH1cbiAgaW5zdC5fZmxhZ3MgfD0gRmxhZ3MuaGFzQ2FjaGVkQ2hpbGROb2Rlcztcbn1cblxuLyoqXG4gKiBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIGNsb3Nlc3QgUmVhY3RET01Db21wb25lbnQgb3JcbiAqIFJlYWN0RE9NVGV4dENvbXBvbmVudCBpbnN0YW5jZSBhbmNlc3Rvci5cbiAqL1xuZnVuY3Rpb24gZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobm9kZSkge1xuICBpZiAobm9kZVtpbnRlcm5hbEluc3RhbmNlS2V5XSkge1xuICAgIHJldHVybiBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldO1xuICB9XG5cbiAgLy8gV2FsayB1cCB0aGUgdHJlZSB1bnRpbCB3ZSBmaW5kIGFuIGFuY2VzdG9yIHdob3NlIGluc3RhbmNlIHdlIGhhdmUgY2FjaGVkLlxuICB2YXIgcGFyZW50cyA9IFtdO1xuICB3aGlsZSAoIW5vZGVbaW50ZXJuYWxJbnN0YW5jZUtleV0pIHtcbiAgICBwYXJlbnRzLnB1c2gobm9kZSk7XG4gICAgaWYgKG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVG9wIG9mIHRoZSB0cmVlLiBUaGlzIG5vZGUgbXVzdCBub3QgYmUgcGFydCBvZiBhIFJlYWN0IHRyZWUgKG9yIGlzXG4gICAgICAvLyB1bm1vdW50ZWQsIHBvdGVudGlhbGx5KS5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjbG9zZXN0O1xuICB2YXIgaW5zdDtcbiAgZm9yICg7IG5vZGUgJiYgKGluc3QgPSBub2RlW2ludGVybmFsSW5zdGFuY2VLZXldKTsgbm9kZSA9IHBhcmVudHMucG9wKCkpIHtcbiAgICBjbG9zZXN0ID0gaW5zdDtcbiAgICBpZiAocGFyZW50cy5sZW5ndGgpIHtcbiAgICAgIHByZWNhY2hlQ2hpbGROb2RlcyhpbnN0LCBub2RlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2xvc2VzdDtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIERPTSBub2RlLCByZXR1cm4gdGhlIFJlYWN0RE9NQ29tcG9uZW50IG9yIFJlYWN0RE9NVGV4dENvbXBvbmVudFxuICogaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIG5vZGUgd2FzIG5vdCByZW5kZXJlZCBieSB0aGlzIFJlYWN0LlxuICovXG5mdW5jdGlvbiBnZXRJbnN0YW5jZUZyb21Ob2RlKG5vZGUpIHtcbiAgdmFyIGluc3QgPSBnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShub2RlKTtcbiAgaWYgKGluc3QgIT0gbnVsbCAmJiBpbnN0Ll9ob3N0Tm9kZSA9PT0gbm9kZSkge1xuICAgIHJldHVybiBpbnN0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYSBSZWFjdERPTUNvbXBvbmVudCBvciBSZWFjdERPTVRleHRDb21wb25lbnQsIHJldHVybiB0aGUgY29ycmVzcG9uZGluZ1xuICogRE9NIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIGdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCkge1xuICAvLyBXaXRob3V0IHRoaXMgZmlyc3QgaW52YXJpYW50LCBwYXNzaW5nIGEgbm9uLURPTS1jb21wb25lbnQgdHJpZ2dlcnMgdGhlIG5leHRcbiAgLy8gaW52YXJpYW50IGZvciBhIG1pc3NpbmcgcGFyZW50LCB3aGljaCBpcyBzdXBlciBjb25mdXNpbmcuXG4gICEoaW5zdC5faG9zdE5vZGUgIT09IHVuZGVmaW5lZCkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2dldE5vZGVGcm9tSW5zdGFuY2U6IEludmFsaWQgYXJndW1lbnQuJykgOiBfcHJvZEludmFyaWFudCgnMzMnKSA6IHZvaWQgMDtcblxuICBpZiAoaW5zdC5faG9zdE5vZGUpIHtcbiAgICByZXR1cm4gaW5zdC5faG9zdE5vZGU7XG4gIH1cblxuICAvLyBXYWxrIHVwIHRoZSB0cmVlIHVudGlsIHdlIGZpbmQgYW4gYW5jZXN0b3Igd2hvc2UgRE9NIG5vZGUgd2UgaGF2ZSBjYWNoZWQuXG4gIHZhciBwYXJlbnRzID0gW107XG4gIHdoaWxlICghaW5zdC5faG9zdE5vZGUpIHtcbiAgICBwYXJlbnRzLnB1c2goaW5zdCk7XG4gICAgIWluc3QuX2hvc3RQYXJlbnQgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0IERPTSB0cmVlIHJvb3Qgc2hvdWxkIGFsd2F5cyBoYXZlIGEgbm9kZSByZWZlcmVuY2UuJykgOiBfcHJvZEludmFyaWFudCgnMzQnKSA6IHZvaWQgMDtcbiAgICBpbnN0ID0gaW5zdC5faG9zdFBhcmVudDtcbiAgfVxuXG4gIC8vIE5vdyBwYXJlbnRzIGNvbnRhaW5zIGVhY2ggYW5jZXN0b3IgdGhhdCBkb2VzICpub3QqIGhhdmUgYSBjYWNoZWQgbmF0aXZlXG4gIC8vIG5vZGUsIGFuZCBgaW5zdGAgaXMgdGhlIGRlZXBlc3QgYW5jZXN0b3IgdGhhdCBkb2VzLlxuICBmb3IgKDsgcGFyZW50cy5sZW5ndGg7IGluc3QgPSBwYXJlbnRzLnBvcCgpKSB7XG4gICAgcHJlY2FjaGVDaGlsZE5vZGVzKGluc3QsIGluc3QuX2hvc3ROb2RlKTtcbiAgfVxuXG4gIHJldHVybiBpbnN0Ll9ob3N0Tm9kZTtcbn1cblxudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHtcbiAgZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGU6IGdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlLFxuICBnZXRJbnN0YW5jZUZyb21Ob2RlOiBnZXRJbnN0YW5jZUZyb21Ob2RlLFxuICBnZXROb2RlRnJvbUluc3RhbmNlOiBnZXROb2RlRnJvbUluc3RhbmNlLFxuICBwcmVjYWNoZUNoaWxkTm9kZXM6IHByZWNhY2hlQ2hpbGROb2RlcyxcbiAgcHJlY2FjaGVOb2RlOiBwcmVjYWNoZU5vZGUsXG4gIHVuY2FjaGVOb2RlOiB1bmNhY2hlTm9kZVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUNvbXBvbmVudFRyZWU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHZhbGlkYXRlRE9NTmVzdGluZyA9IHJlcXVpcmUoJy4vdmFsaWRhdGVET01OZXN0aW5nJyk7XG5cbnZhciBET0NfTk9ERV9UWVBFID0gOTtcblxuZnVuY3Rpb24gUmVhY3RET01Db250YWluZXJJbmZvKHRvcExldmVsV3JhcHBlciwgbm9kZSkge1xuICB2YXIgaW5mbyA9IHtcbiAgICBfdG9wTGV2ZWxXcmFwcGVyOiB0b3BMZXZlbFdyYXBwZXIsXG4gICAgX2lkQ291bnRlcjogMSxcbiAgICBfb3duZXJEb2N1bWVudDogbm9kZSA/IG5vZGUubm9kZVR5cGUgPT09IERPQ19OT0RFX1RZUEUgPyBub2RlIDogbm9kZS5vd25lckRvY3VtZW50IDogbnVsbCxcbiAgICBfbm9kZTogbm9kZSxcbiAgICBfdGFnOiBub2RlID8gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIDogbnVsbCxcbiAgICBfbmFtZXNwYWNlVVJJOiBub2RlID8gbm9kZS5uYW1lc3BhY2VVUkkgOiBudWxsXG4gIH07XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGluZm8uX2FuY2VzdG9ySW5mbyA9IG5vZGUgPyB2YWxpZGF0ZURPTU5lc3RpbmcudXBkYXRlZEFuY2VzdG9ySW5mbyhudWxsLCBpbmZvLl90YWcsIG51bGwpIDogbnVsbDtcbiAgfVxuICByZXR1cm4gaW5mbztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUNvbnRhaW5lckluZm87IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBET01MYXp5VHJlZSA9IHJlcXVpcmUoJy4vRE9NTGF6eVRyZWUnKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xuXG52YXIgUmVhY3RET01FbXB0eUNvbXBvbmVudCA9IGZ1bmN0aW9uIChpbnN0YW50aWF0ZSkge1xuICAvLyBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCB1c2VzIHRoaXM6XG4gIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbnVsbDtcbiAgLy8gUmVhY3RET01Db21wb25lbnRUcmVlIHVzZXMgdGhlc2U6XG4gIHRoaXMuX2hvc3ROb2RlID0gbnVsbDtcbiAgdGhpcy5faG9zdFBhcmVudCA9IG51bGw7XG4gIHRoaXMuX2hvc3RDb250YWluZXJJbmZvID0gbnVsbDtcbiAgdGhpcy5fZG9tSUQgPSAwO1xufTtcbl9hc3NpZ24oUmVhY3RET01FbXB0eUNvbXBvbmVudC5wcm90b3R5cGUsIHtcbiAgbW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uICh0cmFuc2FjdGlvbiwgaG9zdFBhcmVudCwgaG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQpIHtcbiAgICB2YXIgZG9tSUQgPSBob3N0Q29udGFpbmVySW5mby5faWRDb3VudGVyKys7XG4gICAgdGhpcy5fZG9tSUQgPSBkb21JRDtcbiAgICB0aGlzLl9ob3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICB0aGlzLl9ob3N0Q29udGFpbmVySW5mbyA9IGhvc3RDb250YWluZXJJbmZvO1xuXG4gICAgdmFyIG5vZGVWYWx1ZSA9ICcgcmVhY3QtZW1wdHk6ICcgKyB0aGlzLl9kb21JRCArICcgJztcbiAgICBpZiAodHJhbnNhY3Rpb24udXNlQ3JlYXRlRWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyRG9jdW1lbnQgPSBob3N0Q29udGFpbmVySW5mby5fb3duZXJEb2N1bWVudDtcbiAgICAgIHZhciBub2RlID0gb3duZXJEb2N1bWVudC5jcmVhdGVDb21tZW50KG5vZGVWYWx1ZSk7XG4gICAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUucHJlY2FjaGVOb2RlKHRoaXMsIG5vZGUpO1xuICAgICAgcmV0dXJuIERPTUxhenlUcmVlKG5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHJhbnNhY3Rpb24ucmVuZGVyVG9TdGF0aWNNYXJrdXApIHtcbiAgICAgICAgLy8gTm9ybWFsbHkgd2UnZCBpbnNlcnQgYSBjb21tZW50IG5vZGUsIGJ1dCBzaW5jZSB0aGlzIGlzIGEgc2l0dWF0aW9uXG4gICAgICAgIC8vIHdoZXJlIFJlYWN0IHdvbid0IHRha2Ugb3ZlciAoc3RhdGljIHBhZ2VzKSwgd2UgY2FuIHNpbXBseSByZXR1cm5cbiAgICAgICAgLy8gbm90aGluZy5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgICAgcmV0dXJuICc8IS0tJyArIG5vZGVWYWx1ZSArICctLT4nO1xuICAgIH1cbiAgfSxcbiAgcmVjZWl2ZUNvbXBvbmVudDogZnVuY3Rpb24gKCkge30sXG4gIGdldEhvc3ROb2RlOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpO1xuICB9LFxuICB1bm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoKSB7XG4gICAgUmVhY3RET01Db21wb25lbnRUcmVlLnVuY2FjaGVOb2RlKHRoaXMpO1xuICB9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUVtcHR5Q29tcG9uZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdERPTUZlYXR1cmVGbGFncyA9IHtcbiAgdXNlQ3JlYXRlRWxlbWVudDogdHJ1ZSxcbiAgdXNlRmliZXI6IGZhbHNlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NRmVhdHVyZUZsYWdzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01DaGlsZHJlbk9wZXJhdGlvbnMgPSByZXF1aXJlKCcuL0RPTUNoaWxkcmVuT3BlcmF0aW9ucycpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG5cbi8qKlxuICogT3BlcmF0aW9ucyB1c2VkIHRvIHByb2Nlc3MgdXBkYXRlcyB0byBET00gbm9kZXMuXG4gKi9cbnZhciBSZWFjdERPTUlET3BlcmF0aW9ucyA9IHtcblxuICAvKipcbiAgICogVXBkYXRlcyBhIGNvbXBvbmVudCdzIGNoaWxkcmVuIGJ5IHByb2Nlc3NpbmcgYSBzZXJpZXMgb2YgdXBkYXRlcy5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheTxvYmplY3Q+fSB1cGRhdGVzIExpc3Qgb2YgdXBkYXRlIGNvbmZpZ3VyYXRpb25zLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGRhbmdlcm91c2x5UHJvY2Vzc0NoaWxkcmVuVXBkYXRlczogZnVuY3Rpb24gKHBhcmVudEluc3QsIHVwZGF0ZXMpIHtcbiAgICB2YXIgbm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHBhcmVudEluc3QpO1xuICAgIERPTUNoaWxkcmVuT3BlcmF0aW9ucy5wcm9jZXNzVXBkYXRlcyhub2RlLCB1cGRhdGVzKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUlET3BlcmF0aW9uczsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpLFxuICAgIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBET01Qcm9wZXJ0eU9wZXJhdGlvbnMgPSByZXF1aXJlKCcuL0RPTVByb3BlcnR5T3BlcmF0aW9ucycpO1xudmFyIExpbmtlZFZhbHVlVXRpbHMgPSByZXF1aXJlKCcuL0xpbmtlZFZhbHVlVXRpbHMnKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xudmFyIFJlYWN0VXBkYXRlcyA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVzJyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgZGlkV2FyblZhbHVlTGluayA9IGZhbHNlO1xudmFyIGRpZFdhcm5DaGVja2VkTGluayA9IGZhbHNlO1xudmFyIGRpZFdhcm5WYWx1ZURlZmF1bHRWYWx1ZSA9IGZhbHNlO1xudmFyIGRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQgPSBmYWxzZTtcbnZhciBkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkID0gZmFsc2U7XG52YXIgZGlkV2FyblVuY29udHJvbGxlZFRvQ29udHJvbGxlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBmb3JjZVVwZGF0ZUlmTW91bnRlZCgpIHtcbiAgaWYgKHRoaXMuX3Jvb3ROb2RlSUQpIHtcbiAgICAvLyBET00gY29tcG9uZW50IGlzIHN0aWxsIG1vdW50ZWQ7IHVwZGF0ZVxuICAgIFJlYWN0RE9NSW5wdXQudXBkYXRlV3JhcHBlcih0aGlzKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0NvbnRyb2xsZWQocHJvcHMpIHtcbiAgdmFyIHVzZXNDaGVja2VkID0gcHJvcHMudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBwcm9wcy50eXBlID09PSAncmFkaW8nO1xuICByZXR1cm4gdXNlc0NoZWNrZWQgPyBwcm9wcy5jaGVja2VkICE9IG51bGwgOiBwcm9wcy52YWx1ZSAhPSBudWxsO1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgYW4gPGlucHV0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBzZXR0aW5nIHRoZXNlIG9wdGlvbmFsXG4gKiBwcm9wczogYGNoZWNrZWRgLCBgdmFsdWVgLCBgZGVmYXVsdENoZWNrZWRgLCBhbmQgYGRlZmF1bHRWYWx1ZWAuXG4gKlxuICogSWYgYGNoZWNrZWRgIG9yIGB2YWx1ZWAgYXJlIG5vdCBzdXBwbGllZCAob3IgbnVsbC91bmRlZmluZWQpLCB1c2VyIGFjdGlvbnNcbiAqIHRoYXQgYWZmZWN0IHRoZSBjaGVja2VkIHN0YXRlIG9yIHZhbHVlIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSBlbGVtZW50LlxuICpcbiAqIElmIHRoZXkgYXJlIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIGVsZW1lbnQgd2lsbCBub3RcbiAqIHRyaWdnZXIgdXBkYXRlcyB0byB0aGUgZWxlbWVudC4gSW5zdGVhZCwgdGhlIHByb3BzIG11c3QgY2hhbmdlIGluIG9yZGVyIGZvclxuICogdGhlIHJlbmRlcmVkIGVsZW1lbnQgdG8gYmUgdXBkYXRlZC5cbiAqXG4gKiBUaGUgcmVuZGVyZWQgZWxlbWVudCB3aWxsIGJlIGluaXRpYWxpemVkIGFzIHVuY2hlY2tlZCAob3IgYGRlZmF1bHRDaGVja2VkYClcbiAqIHdpdGggYW4gZW1wdHkgdmFsdWUgKG9yIGBkZWZhdWx0VmFsdWVgKS5cbiAqXG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTIvV0QtaHRtbDUtMjAxMjEwMjUvdGhlLWlucHV0LWVsZW1lbnQuaHRtbFxuICovXG52YXIgUmVhY3RET01JbnB1dCA9IHtcbiAgZ2V0SG9zdFByb3BzOiBmdW5jdGlvbiAoaW5zdCwgcHJvcHMpIHtcbiAgICB2YXIgdmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTtcbiAgICB2YXIgY2hlY2tlZCA9IExpbmtlZFZhbHVlVXRpbHMuZ2V0Q2hlY2tlZChwcm9wcyk7XG5cbiAgICB2YXIgaG9zdFByb3BzID0gX2Fzc2lnbih7XG4gICAgICAvLyBNYWtlIHN1cmUgd2Ugc2V0IC50eXBlIGJlZm9yZSBhbnkgb3RoZXIgcHJvcGVydGllcyAoc2V0dGluZyAudmFsdWVcbiAgICAgIC8vIGJlZm9yZSAudHlwZSBtZWFucyAudmFsdWUgaXMgbG9zdCBpbiBJRTExIGFuZCBiZWxvdylcbiAgICAgIHR5cGU6IHVuZGVmaW5lZCxcbiAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzZXQgLnN0ZXAgYmVmb3JlIC52YWx1ZSAoc2V0dGluZyAudmFsdWUgYmVmb3JlIC5zdGVwXG4gICAgICAvLyBtZWFucyAudmFsdWUgaXMgcm91bmRlZCBvbiBtb3VudCwgYmFzZWQgdXBvbiBzdGVwIHByZWNpc2lvbilcbiAgICAgIHN0ZXA6IHVuZGVmaW5lZCxcbiAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBzZXQgLm1pbiAmIC5tYXggYmVmb3JlIC52YWx1ZSAodG8gZW5zdXJlIHByb3BlciBvcmRlclxuICAgICAgLy8gaW4gY29ybmVyIGNhc2VzIHN1Y2ggYXMgbWluIG9yIG1heCBkZXJpdmluZyBmcm9tIHZhbHVlLCBlLmcuIElzc3VlICM3MTcwKVxuICAgICAgbWluOiB1bmRlZmluZWQsXG4gICAgICBtYXg6IHVuZGVmaW5lZFxuICAgIH0sIHByb3BzLCB7XG4gICAgICBkZWZhdWx0Q2hlY2tlZDogdW5kZWZpbmVkLFxuICAgICAgZGVmYXVsdFZhbHVlOiB1bmRlZmluZWQsXG4gICAgICB2YWx1ZTogdmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogaW5zdC5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSxcbiAgICAgIGNoZWNrZWQ6IGNoZWNrZWQgIT0gbnVsbCA/IGNoZWNrZWQgOiBpbnN0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQsXG4gICAgICBvbkNoYW5nZTogaW5zdC5fd3JhcHBlclN0YXRlLm9uQ2hhbmdlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaG9zdFByb3BzO1xuICB9LFxuXG4gIG1vdW50V3JhcHBlcjogZnVuY3Rpb24gKGluc3QsIHByb3BzKSB7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBMaW5rZWRWYWx1ZVV0aWxzLmNoZWNrUHJvcFR5cGVzKCdpbnB1dCcsIHByb3BzLCBpbnN0Ll9jdXJyZW50RWxlbWVudC5fb3duZXIpO1xuXG4gICAgICB2YXIgb3duZXIgPSBpbnN0Ll9jdXJyZW50RWxlbWVudC5fb3duZXI7XG5cbiAgICAgIGlmIChwcm9wcy52YWx1ZUxpbmsgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlTGluaykge1xuICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdgdmFsdWVMaW5rYCBwcm9wIG9uIGBpbnB1dGAgaXMgZGVwcmVjYXRlZDsgc2V0IGB2YWx1ZWAgYW5kIGBvbkNoYW5nZWAgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgICAgICAgZGlkV2FyblZhbHVlTGluayA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMuY2hlY2tlZExpbmsgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FybkNoZWNrZWRMaW5rKSB7XG4gICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2BjaGVja2VkTGlua2AgcHJvcCBvbiBgaW5wdXRgIGlzIGRlcHJlY2F0ZWQ7IHNldCBgdmFsdWVgIGFuZCBgb25DaGFuZ2VgIGluc3RlYWQuJykgOiB2b2lkIDA7XG4gICAgICAgIGRpZFdhcm5DaGVja2VkTGluayA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMuY2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRDaGVja2VkICE9PSB1bmRlZmluZWQgJiYgIWRpZFdhcm5DaGVja2VkRGVmYXVsdENoZWNrZWQpIHtcbiAgICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXMgY29udGFpbnMgYW4gaW5wdXQgb2YgdHlwZSAlcyB3aXRoIGJvdGggY2hlY2tlZCBhbmQgZGVmYXVsdENoZWNrZWQgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIGNoZWNrZWQgcHJvcCwgb3IgdGhlIGRlZmF1bHRDaGVja2VkIHByb3AsIGJ1dCBub3QgJyArICdib3RoKS4gRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgYW5kIHJlbW92ZSBvbmUgb2YgdGhlc2UgcHJvcHMuIE1vcmUgaW5mbzogJyArICdodHRwczovL2ZiLm1lL3JlYWN0LWNvbnRyb2xsZWQtY29tcG9uZW50cycsIG93bmVyICYmIG93bmVyLmdldE5hbWUoKSB8fCAnQSBjb21wb25lbnQnLCBwcm9wcy50eXBlKSA6IHZvaWQgMDtcbiAgICAgICAgZGlkV2FybkNoZWNrZWREZWZhdWx0Q2hlY2tlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMudmFsdWUgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlKSB7XG4gICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzIGNvbnRhaW5zIGFuIGlucHV0IG9mIHR5cGUgJXMgd2l0aCBib3RoIHZhbHVlIGFuZCBkZWZhdWx0VmFsdWUgcHJvcHMuICcgKyAnSW5wdXQgZWxlbWVudHMgbXVzdCBiZSBlaXRoZXIgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgJyArICcoc3BlY2lmeSBlaXRoZXIgdGhlIHZhbHVlIHByb3AsIG9yIHRoZSBkZWZhdWx0VmFsdWUgcHJvcCwgYnV0IG5vdCAnICsgJ2JvdGgpLiBEZWNpZGUgYmV0d2VlbiB1c2luZyBhIGNvbnRyb2xsZWQgb3IgdW5jb250cm9sbGVkIGlucHV0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzJywgb3duZXIgJiYgb3duZXIuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpIDogdm9pZCAwO1xuICAgICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkZWZhdWx0VmFsdWUgPSBwcm9wcy5kZWZhdWx0VmFsdWU7XG4gICAgaW5zdC5fd3JhcHBlclN0YXRlID0ge1xuICAgICAgaW5pdGlhbENoZWNrZWQ6IHByb3BzLmNoZWNrZWQgIT0gbnVsbCA/IHByb3BzLmNoZWNrZWQgOiBwcm9wcy5kZWZhdWx0Q2hlY2tlZCxcbiAgICAgIGluaXRpYWxWYWx1ZTogcHJvcHMudmFsdWUgIT0gbnVsbCA/IHByb3BzLnZhbHVlIDogZGVmYXVsdFZhbHVlLFxuICAgICAgbGlzdGVuZXJzOiBudWxsLFxuICAgICAgb25DaGFuZ2U6IF9oYW5kbGVDaGFuZ2UuYmluZChpbnN0KSxcbiAgICAgIGNvbnRyb2xsZWQ6IGlzQ29udHJvbGxlZChwcm9wcylcbiAgICB9O1xuICB9LFxuXG4gIHVwZGF0ZVdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgdmFyIHByb3BzID0gaW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHM7XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBjb250cm9sbGVkID0gaXNDb250cm9sbGVkKHByb3BzKTtcbiAgICAgIHZhciBvd25lciA9IGluc3QuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjtcblxuICAgICAgaWYgKCFpbnN0Ll93cmFwcGVyU3RhdGUuY29udHJvbGxlZCAmJiBjb250cm9sbGVkICYmICFkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkKSB7XG4gICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzIGlzIGNoYW5naW5nIGFuIHVuY29udHJvbGxlZCBpbnB1dCBvZiB0eXBlICVzIHRvIGJlIGNvbnRyb2xsZWQuICcgKyAnSW5wdXQgZWxlbWVudHMgc2hvdWxkIG5vdCBzd2l0Y2ggZnJvbSB1bmNvbnRyb2xsZWQgdG8gY29udHJvbGxlZCAob3IgdmljZSB2ZXJzYSkuICcgKyAnRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcG9uZW50LiBNb3JlIGluZm86IGh0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzJywgb3duZXIgJiYgb3duZXIuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpIDogdm9pZCAwO1xuICAgICAgICBkaWRXYXJuVW5jb250cm9sbGVkVG9Db250cm9sbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpbnN0Ll93cmFwcGVyU3RhdGUuY29udHJvbGxlZCAmJiAhY29udHJvbGxlZCAmJiAhZGlkV2FybkNvbnRyb2xsZWRUb1VuY29udHJvbGxlZCkge1xuICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyBpcyBjaGFuZ2luZyBhIGNvbnRyb2xsZWQgaW5wdXQgb2YgdHlwZSAlcyB0byBiZSB1bmNvbnRyb2xsZWQuICcgKyAnSW5wdXQgZWxlbWVudHMgc2hvdWxkIG5vdCBzd2l0Y2ggZnJvbSBjb250cm9sbGVkIHRvIHVuY29udHJvbGxlZCAob3IgdmljZSB2ZXJzYSkuICcgKyAnRGVjaWRlIGJldHdlZW4gdXNpbmcgYSBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCBpbnB1dCAnICsgJ2VsZW1lbnQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgY29tcG9uZW50LiBNb3JlIGluZm86IGh0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzJywgb3duZXIgJiYgb3duZXIuZ2V0TmFtZSgpIHx8ICdBIGNvbXBvbmVudCcsIHByb3BzLnR5cGUpIDogdm9pZCAwO1xuICAgICAgICBkaWRXYXJuQ29udHJvbGxlZFRvVW5jb250cm9sbGVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBTaG91bGRuJ3QgdGhpcyBiZSBnZXRDaGVja2VkKHByb3BzKT9cbiAgICB2YXIgY2hlY2tlZCA9IHByb3BzLmNoZWNrZWQ7XG4gICAgaWYgKGNoZWNrZWQgIT0gbnVsbCkge1xuICAgICAgRE9NUHJvcGVydHlPcGVyYXRpb25zLnNldFZhbHVlRm9yUHJvcGVydHkoUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UoaW5zdCksICdjaGVja2VkJywgY2hlY2tlZCB8fCBmYWxzZSk7XG4gICAgfVxuXG4gICAgdmFyIG5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtcbiAgICB2YXIgdmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTtcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKHZhbHVlID09PSAwICYmIG5vZGUudmFsdWUgPT09ICcnKSB7XG4gICAgICAgIG5vZGUudmFsdWUgPSAnMCc7XG4gICAgICAgIC8vIE5vdGU6IElFOSByZXBvcnRzIGEgbnVtYmVyIGlucHV0cyBhcyAndGV4dCcsIHNvIGNoZWNrIHByb3BzIGluc3RlYWQuXG4gICAgICB9IGVsc2UgaWYgKHByb3BzLnR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIC8vIFNpbXVsYXRlIGBpbnB1dC52YWx1ZUFzTnVtYmVyYC4gSUU5IGRvZXMgbm90IHN1cHBvcnQgaXRcbiAgICAgICAgdmFyIHZhbHVlQXNOdW1iZXIgPSBwYXJzZUZsb2F0KG5vZGUudmFsdWUsIDEwKSB8fCAwO1xuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICBpZiAodmFsdWUgIT0gdmFsdWVBc051bWJlcikge1xuICAgICAgICAgIC8vIENhc3QgYHZhbHVlYCB0byBhIHN0cmluZyB0byBlbnN1cmUgdGhlIHZhbHVlIGlzIHNldCBjb3JyZWN0bHkuIFdoaWxlXG4gICAgICAgICAgLy8gYnJvd3NlcnMgdHlwaWNhbGx5IGRvIHRoaXMgYXMgbmVjZXNzYXJ5LCBqc2RvbSBkb2Vzbid0LlxuICAgICAgICAgIG5vZGUudmFsdWUgPSAnJyArIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSBub2RlLnZhbHVlKSB7XG4gICAgICAgIC8vIENhc3QgYHZhbHVlYCB0byBhIHN0cmluZyB0byBlbnN1cmUgdGhlIHZhbHVlIGlzIHNldCBjb3JyZWN0bHkuIFdoaWxlXG4gICAgICAgIC8vIGJyb3dzZXJzIHR5cGljYWxseSBkbyB0aGlzIGFzIG5lY2Vzc2FyeSwganNkb20gZG9lc24ndC5cbiAgICAgICAgbm9kZS52YWx1ZSA9ICcnICsgdmFsdWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcm9wcy52YWx1ZSA9PSBudWxsICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIC8vIEluIENocm9tZSwgYXNzaWduaW5nIGRlZmF1bHRWYWx1ZSB0byBjZXJ0YWluIGlucHV0IHR5cGVzIHRyaWdnZXJzIGlucHV0IHZhbGlkYXRpb24uXG4gICAgICAgIC8vIEZvciBudW1iZXIgaW5wdXRzLCB0aGUgZGlzcGxheSB2YWx1ZSBsb3NlcyB0cmFpbGluZyBkZWNpbWFsIHBvaW50cy4gRm9yIGVtYWlsIGlucHV0cyxcbiAgICAgICAgLy8gQ2hyb21lIHJhaXNlcyBcIlRoZSBzcGVjaWZpZWQgdmFsdWUgPHg+IGlzIG5vdCBhIHZhbGlkIGVtYWlsIGFkZHJlc3NcIi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gSGVyZSB3ZSBjaGVjayB0byBzZWUgaWYgdGhlIGRlZmF1bHRWYWx1ZSBoYXMgYWN0dWFsbHkgY2hhbmdlZCwgYXZvaWRpbmcgdGhlc2UgcHJvYmxlbXNcbiAgICAgICAgLy8gd2hlbiB0aGUgdXNlciBpcyBpbnB1dHRpbmcgdGV4dFxuICAgICAgICAvL1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNTNcbiAgICAgICAgaWYgKG5vZGUuZGVmYXVsdFZhbHVlICE9PSAnJyArIHByb3BzLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICAgIG5vZGUuZGVmYXVsdFZhbHVlID0gJycgKyBwcm9wcy5kZWZhdWx0VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5jaGVja2VkID09IG51bGwgJiYgcHJvcHMuZGVmYXVsdENoZWNrZWQgIT0gbnVsbCkge1xuICAgICAgICBub2RlLmRlZmF1bHRDaGVja2VkID0gISFwcm9wcy5kZWZhdWx0Q2hlY2tlZDtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgcG9zdE1vdW50V3JhcHBlcjogZnVuY3Rpb24gKGluc3QpIHtcbiAgICB2YXIgcHJvcHMgPSBpbnN0Ll9jdXJyZW50RWxlbWVudC5wcm9wcztcblxuICAgIC8vIFRoaXMgaXMgaW4gcG9zdE1vdW50IGJlY2F1c2Ugd2UgbmVlZCBhY2Nlc3MgdG8gdGhlIERPTSBub2RlLCB3aGljaCBpcyBub3RcbiAgICAvLyBhdmFpbGFibGUgdW50aWwgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgbW91bnRlZC5cbiAgICB2YXIgbm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO1xuXG4gICAgLy8gRGV0YWNoIHZhbHVlIGZyb20gZGVmYXVsdFZhbHVlLiBXZSB3b24ndCBkbyBhbnl0aGluZyBpZiB3ZSdyZSB3b3JraW5nIG9uXG4gICAgLy8gc3VibWl0IG9yIHJlc2V0IGlucHV0cyBhcyB0aG9zZSB2YWx1ZXMgJiBkZWZhdWx0VmFsdWVzIGFyZSBsaW5rZWQuIFRoZXlcbiAgICAvLyBhcmUgbm90IHJlc2V0YWJsZSBub2RlcyBzbyB0aGlzIG9wZXJhdGlvbiBkb2Vzbid0IG1hdHRlciBhbmQgYWN0dWFsbHlcbiAgICAvLyByZW1vdmVzIGJyb3dzZXItZGVmYXVsdCB2YWx1ZXMgKGVnIFwiU3VibWl0IFF1ZXJ5XCIpIHdoZW4gbm8gdmFsdWUgaXNcbiAgICAvLyBwcm92aWRlZC5cblxuICAgIHN3aXRjaCAocHJvcHMudHlwZSkge1xuICAgICAgY2FzZSAnc3VibWl0JzpcbiAgICAgIGNhc2UgJ3Jlc2V0JzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjb2xvcic6XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgIGNhc2UgJ2RhdGV0aW1lJzpcbiAgICAgIGNhc2UgJ2RhdGV0aW1lLWxvY2FsJzpcbiAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgIGNhc2UgJ3RpbWUnOlxuICAgICAgY2FzZSAnd2Vlayc6XG4gICAgICAgIC8vIFRoaXMgZml4ZXMgdGhlIG5vLXNob3cgaXNzdWUgb24gaU9TIFNhZmFyaSBhbmQgQW5kcm9pZCBDaHJvbWU6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzIzM1xuICAgICAgICBub2RlLnZhbHVlID0gJyc7XG4gICAgICAgIG5vZGUudmFsdWUgPSBub2RlLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBub2RlLnZhbHVlID0gbm9kZS52YWx1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsbHksIHdlJ2QganVzdCBkbyBgbm9kZS5jaGVja2VkID0gbm9kZS5jaGVja2VkYCB1cG9uIGluaXRpYWwgbW91bnQsIGxlc3MgdGhpcyBidWdcbiAgICAvLyB0aGlzIGlzIG5lZWRlZCB0byB3b3JrIGFyb3VuZCBhIGNocm9tZSBidWcgd2hlcmUgc2V0dGluZyBkZWZhdWx0Q2hlY2tlZFxuICAgIC8vIHdpbGwgc29tZXRpbWVzIGluZmx1ZW5jZSB0aGUgdmFsdWUgb2YgY2hlY2tlZCAoZXZlbiBhZnRlciBkZXRhY2htZW50KS5cbiAgICAvLyBSZWZlcmVuY2U6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTYwODQxNlxuICAgIC8vIFdlIG5lZWQgdG8gdGVtcG9yYXJpbHkgdW5zZXQgbmFtZSB0byBhdm9pZCBkaXNydXB0aW5nIHJhZGlvIGJ1dHRvbiBncm91cHMuXG4gICAgdmFyIG5hbWUgPSBub2RlLm5hbWU7XG4gICAgaWYgKG5hbWUgIT09ICcnKSB7XG4gICAgICBub2RlLm5hbWUgPSAnJztcbiAgICB9XG4gICAgbm9kZS5kZWZhdWx0Q2hlY2tlZCA9ICFub2RlLmRlZmF1bHRDaGVja2VkO1xuICAgIG5vZGUuZGVmYXVsdENoZWNrZWQgPSAhbm9kZS5kZWZhdWx0Q2hlY2tlZDtcbiAgICBpZiAobmFtZSAhPT0gJycpIHtcbiAgICAgIG5vZGUubmFtZSA9IG5hbWU7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBfaGFuZGxlQ2hhbmdlKGV2ZW50KSB7XG4gIHZhciBwcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuXG4gIHZhciByZXR1cm5WYWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZXhlY3V0ZU9uQ2hhbmdlKHByb3BzLCBldmVudCk7XG5cbiAgLy8gSGVyZSB3ZSB1c2UgYXNhcCB0byB3YWl0IHVudGlsIGFsbCB1cGRhdGVzIGhhdmUgcHJvcGFnYXRlZCwgd2hpY2hcbiAgLy8gaXMgaW1wb3J0YW50IHdoZW4gdXNpbmcgY29udHJvbGxlZCBjb21wb25lbnRzIHdpdGhpbiBsYXllcnM6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvMTY5OFxuICBSZWFjdFVwZGF0ZXMuYXNhcChmb3JjZVVwZGF0ZUlmTW91bnRlZCwgdGhpcyk7XG5cbiAgdmFyIG5hbWUgPSBwcm9wcy5uYW1lO1xuICBpZiAocHJvcHMudHlwZSA9PT0gJ3JhZGlvJyAmJiBuYW1lICE9IG51bGwpIHtcbiAgICB2YXIgcm9vdE5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0aGlzKTtcbiAgICB2YXIgcXVlcnlSb290ID0gcm9vdE5vZGU7XG5cbiAgICB3aGlsZSAocXVlcnlSb290LnBhcmVudE5vZGUpIHtcbiAgICAgIHF1ZXJ5Um9vdCA9IHF1ZXJ5Um9vdC5wYXJlbnROb2RlO1xuICAgIH1cblxuICAgIC8vIElmIGByb290Tm9kZS5mb3JtYCB3YXMgbm9uLW51bGwsIHRoZW4gd2UgY291bGQgdHJ5IGBmb3JtLmVsZW1lbnRzYCxcbiAgICAvLyBidXQgdGhhdCBzb21ldGltZXMgYmVoYXZlcyBzdHJhbmdlbHkgaW4gSUU4LiBXZSBjb3VsZCBhbHNvIHRyeSB1c2luZ1xuICAgIC8vIGBmb3JtLmdldEVsZW1lbnRzQnlOYW1lYCwgYnV0IHRoYXQgd2lsbCBvbmx5IHJldHVybiBkaXJlY3QgY2hpbGRyZW5cbiAgICAvLyBhbmQgd29uJ3QgaW5jbHVkZSBpbnB1dHMgdGhhdCB1c2UgdGhlIEhUTUw1IGBmb3JtPWAgYXR0cmlidXRlLiBTaW5jZVxuICAgIC8vIHRoZSBpbnB1dCBtaWdodCBub3QgZXZlbiBiZSBpbiBhIGZvcm0sIGxldCdzIGp1c3QgdXNlIHRoZSBnbG9iYWxcbiAgICAvLyBgcXVlcnlTZWxlY3RvckFsbGAgdG8gZW5zdXJlIHdlIGRvbid0IG1pc3MgYW55dGhpbmcuXG4gICAgdmFyIGdyb3VwID0gcXVlcnlSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9JyArIEpTT04uc3RyaW5naWZ5KCcnICsgbmFtZSkgKyAnXVt0eXBlPVwicmFkaW9cIl0nKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBvdGhlck5vZGUgPSBncm91cFtpXTtcbiAgICAgIGlmIChvdGhlck5vZGUgPT09IHJvb3ROb2RlIHx8IG90aGVyTm9kZS5mb3JtICE9PSByb290Tm9kZS5mb3JtKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgLy8gVGhpcyB3aWxsIHRocm93IGlmIHJhZGlvIGJ1dHRvbnMgcmVuZGVyZWQgYnkgZGlmZmVyZW50IGNvcGllcyBvZiBSZWFjdFxuICAgICAgLy8gYW5kIHRoZSBzYW1lIG5hbWUgYXJlIHJlbmRlcmVkIGludG8gdGhlIHNhbWUgZm9ybSAoc2FtZSBhcyAjMTkzOSkuXG4gICAgICAvLyBUaGF0J3MgcHJvYmFibHkgb2theTsgd2UgZG9uJ3Qgc3VwcG9ydCBpdCBqdXN0IGFzIHdlIGRvbid0IHN1cHBvcnRcbiAgICAgIC8vIG1peGluZyBSZWFjdCByYWRpbyBidXR0b25zIHdpdGggbm9uLVJlYWN0IG9uZXMuXG4gICAgICB2YXIgb3RoZXJJbnN0YW5jZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKG90aGVyTm9kZSk7XG4gICAgICAhb3RoZXJJbnN0YW5jZSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RET01JbnB1dDogTWl4aW5nIFJlYWN0IGFuZCBub24tUmVhY3QgcmFkaW8gaW5wdXRzIHdpdGggdGhlIHNhbWUgYG5hbWVgIGlzIG5vdCBzdXBwb3J0ZWQuJykgOiBfcHJvZEludmFyaWFudCgnOTAnKSA6IHZvaWQgMDtcbiAgICAgIC8vIElmIHRoaXMgaXMgYSBjb250cm9sbGVkIHJhZGlvIGJ1dHRvbiBncm91cCwgZm9yY2luZyB0aGUgaW5wdXQgdGhhdFxuICAgICAgLy8gd2FzIHByZXZpb3VzbHkgY2hlY2tlZCB0byB1cGRhdGUgd2lsbCBjYXVzZSBpdCB0byBiZSBjb21lIHJlLWNoZWNrZWRcbiAgICAgIC8vIGFzIGFwcHJvcHJpYXRlLlxuICAgICAgUmVhY3RVcGRhdGVzLmFzYXAoZm9yY2VVcGRhdGVJZk1vdW50ZWQsIG90aGVySW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTUlucHV0OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01Qcm9wZXJ0eSA9IHJlcXVpcmUoJy4vRE9NUHJvcGVydHknKTtcbnZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcblxudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciB3YXJuZWRQcm9wZXJ0aWVzID0ge307XG52YXIgckFSSUEgPSBuZXcgUmVnRXhwKCdeKGFyaWEpLVsnICsgRE9NUHJvcGVydHkuQVRUUklCVVRFX05BTUVfQ0hBUiArICddKiQnKTtcblxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eSh0YWdOYW1lLCBuYW1lLCBkZWJ1Z0lEKSB7XG4gIGlmICh3YXJuZWRQcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KG5hbWUpICYmIHdhcm5lZFByb3BlcnRpZXNbbmFtZV0pIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChyQVJJQS50ZXN0KG5hbWUpKSB7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHZhciBzdGFuZGFyZE5hbWUgPSBET01Qcm9wZXJ0eS5nZXRQb3NzaWJsZVN0YW5kYXJkTmFtZS5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBET01Qcm9wZXJ0eS5nZXRQb3NzaWJsZVN0YW5kYXJkTmFtZVtsb3dlckNhc2VkTmFtZV0gOiBudWxsO1xuXG4gICAgLy8gSWYgdGhpcyBpcyBhbiBhcmlhLSogYXR0cmlidXRlLCBidXQgaXMgbm90IGxpc3RlZCBpbiB0aGUga25vd24gRE9NXG4gICAgLy8gRE9NIHByb3BlcnRpZXMsIHRoZW4gaXQgaXMgYW4gaW52YWxpZCBhcmlhLSogYXR0cmlidXRlLlxuICAgIGlmIChzdGFuZGFyZE5hbWUgPT0gbnVsbCkge1xuICAgICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIGFyaWEtKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBsb3dlcmNhc2U7IHN1Z2dlc3QgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uLlxuICAgIGlmIChuYW1lICE9PSBzdGFuZGFyZE5hbWUpIHtcbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1Vua25vd24gQVJJQSBhdHRyaWJ1dGUgJXMuIERpZCB5b3UgbWVhbiAlcz8lcycsIG5hbWUsIHN0YW5kYXJkTmFtZSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKSkgOiB2b2lkIDA7XG4gICAgICB3YXJuZWRQcm9wZXJ0aWVzW25hbWVdID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiB3YXJuSW52YWxpZEFSSUFQcm9wcyhkZWJ1Z0lELCBlbGVtZW50KSB7XG4gIHZhciBpbnZhbGlkUHJvcHMgPSBbXTtcblxuICBmb3IgKHZhciBrZXkgaW4gZWxlbWVudC5wcm9wcykge1xuICAgIHZhciBpc1ZhbGlkID0gdmFsaWRhdGVQcm9wZXJ0eShlbGVtZW50LnR5cGUsIGtleSwgZGVidWdJRCk7XG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICBpbnZhbGlkUHJvcHMucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuXG4gIHZhciB1bmtub3duUHJvcFN0cmluZyA9IGludmFsaWRQcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcbiAgICByZXR1cm4gJ2AnICsgcHJvcCArICdgJztcbiAgfSkuam9pbignLCAnKTtcblxuICBpZiAoaW52YWxpZFByb3BzLmxlbmd0aCA9PT0gMSkge1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ludmFsaWQgYXJpYSBwcm9wICVzIG9uIDwlcz4gdGFnLiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9mYi5tZS9pbnZhbGlkLWFyaWEtcHJvcCVzJywgdW5rbm93blByb3BTdHJpbmcsIGVsZW1lbnQudHlwZSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChkZWJ1Z0lEKSkgOiB2b2lkIDA7XG4gIH0gZWxzZSBpZiAoaW52YWxpZFByb3BzLmxlbmd0aCA+IDEpIHtcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdJbnZhbGlkIGFyaWEgcHJvcHMgJXMgb24gPCVzPiB0YWcuICcgKyAnRm9yIGRldGFpbHMsIHNlZSBodHRwczovL2ZiLm1lL2ludmFsaWQtYXJpYS1wcm9wJXMnLCB1bmtub3duUHJvcFN0cmluZywgZWxlbWVudC50eXBlLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpKSA6IHZvaWQgMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVFbGVtZW50KGRlYnVnSUQsIGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCB0eXBlb2YgZWxlbWVudC50eXBlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZWxlbWVudC50eXBlLmluZGV4T2YoJy0nKSA+PSAwIHx8IGVsZW1lbnQucHJvcHMuaXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB3YXJuSW52YWxpZEFSSUFQcm9wcyhkZWJ1Z0lELCBlbGVtZW50KTtcbn1cblxudmFyIFJlYWN0RE9NSW52YWxpZEFSSUFIb29rID0ge1xuICBvbkJlZm9yZU1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCkge1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaGFuZGxlRWxlbWVudChkZWJ1Z0lELCBlbGVtZW50KTtcbiAgICB9XG4gIH0sXG4gIG9uQmVmb3JlVXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCkge1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaGFuZGxlRWxlbWVudChkZWJ1Z0lELCBlbGVtZW50KTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01JbnZhbGlkQVJJQUhvb2s7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDb21wb25lbnRUcmVlSG9vaycpO1xuXG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIGRpZFdhcm5WYWx1ZU51bGwgPSBmYWxzZTtcblxuZnVuY3Rpb24gaGFuZGxlRWxlbWVudChkZWJ1Z0lELCBlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGVsZW1lbnQudHlwZSAhPT0gJ2lucHV0JyAmJiBlbGVtZW50LnR5cGUgIT09ICd0ZXh0YXJlYScgJiYgZWxlbWVudC50eXBlICE9PSAnc2VsZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZWxlbWVudC5wcm9wcyAhPSBudWxsICYmIGVsZW1lbnQucHJvcHMudmFsdWUgPT09IG51bGwgJiYgIWRpZFdhcm5WYWx1ZU51bGwpIHtcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdgdmFsdWVgIHByb3Agb24gYCVzYCBzaG91bGQgbm90IGJlIG51bGwuICcgKyAnQ29uc2lkZXIgdXNpbmcgdGhlIGVtcHR5IHN0cmluZyB0byBjbGVhciB0aGUgY29tcG9uZW50IG9yIGB1bmRlZmluZWRgICcgKyAnZm9yIHVuY29udHJvbGxlZCBjb21wb25lbnRzLiVzJywgZWxlbWVudC50eXBlLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpKSA6IHZvaWQgMDtcblxuICAgIGRpZFdhcm5WYWx1ZU51bGwgPSB0cnVlO1xuICB9XG59XG5cbnZhciBSZWFjdERPTU51bGxJbnB1dFZhbHVlUHJvcEhvb2sgPSB7XG4gIG9uQmVmb3JlTW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChkZWJ1Z0lELCBlbGVtZW50KSB7XG4gICAgaGFuZGxlRWxlbWVudChkZWJ1Z0lELCBlbGVtZW50KTtcbiAgfSxcbiAgb25CZWZvcmVVcGRhdGVDb21wb25lbnQ6IGZ1bmN0aW9uIChkZWJ1Z0lELCBlbGVtZW50KSB7XG4gICAgaGFuZGxlRWxlbWVudChkZWJ1Z0lELCBlbGVtZW50KTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTU51bGxJbnB1dFZhbHVlUHJvcEhvb2s7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdCcpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RET01TZWxlY3QgPSByZXF1aXJlKCcuL1JlYWN0RE9NU2VsZWN0Jyk7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xudmFyIGRpZFdhcm5JbnZhbGlkT3B0aW9uQ2hpbGRyZW4gPSBmYWxzZTtcblxuZnVuY3Rpb24gZmxhdHRlbkNoaWxkcmVuKGNoaWxkcmVuKSB7XG4gIHZhciBjb250ZW50ID0gJyc7XG5cbiAgLy8gRmxhdHRlbiBjaGlsZHJlbiBhbmQgd2FybiBpZiB0aGV5IGFyZW4ndCBzdHJpbmdzIG9yIG51bWJlcnM7XG4gIC8vIGludmFsaWQgdHlwZXMgYXJlIGlnbm9yZWQuXG4gIFJlYWN0LkNoaWxkcmVuLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgIGlmIChjaGlsZCA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2hpbGQgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBjaGlsZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbnRlbnQgKz0gY2hpbGQ7XG4gICAgfSBlbHNlIGlmICghZGlkV2FybkludmFsaWRPcHRpb25DaGlsZHJlbikge1xuICAgICAgZGlkV2FybkludmFsaWRPcHRpb25DaGlsZHJlbiA9IHRydWU7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdPbmx5IHN0cmluZ3MgYW5kIG51bWJlcnMgYXJlIHN1cHBvcnRlZCBhcyA8b3B0aW9uPiBjaGlsZHJlbi4nKSA6IHZvaWQgMDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIEltcGxlbWVudHMgYW4gPG9wdGlvbj4gaG9zdCBjb21wb25lbnQgdGhhdCB3YXJucyB3aGVuIGBzZWxlY3RlZGAgaXMgc2V0LlxuICovXG52YXIgUmVhY3RET01PcHRpb24gPSB7XG4gIG1vdW50V3JhcHBlcjogZnVuY3Rpb24gKGluc3QsIHByb3BzLCBob3N0UGFyZW50KSB7XG4gICAgLy8gVE9ETyAoeXVuZ3N0ZXJzKTogUmVtb3ZlIHN1cHBvcnQgZm9yIGBzZWxlY3RlZGAgaW4gPG9wdGlvbj4uXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcocHJvcHMuc2VsZWN0ZWQgPT0gbnVsbCwgJ1VzZSB0aGUgYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBwcm9wcyBvbiA8c2VsZWN0PiBpbnN0ZWFkIG9mICcgKyAnc2V0dGluZyBgc2VsZWN0ZWRgIG9uIDxvcHRpb24+LicpIDogdm9pZCAwO1xuICAgIH1cblxuICAgIC8vIExvb2sgdXAgd2hldGhlciB0aGlzIG9wdGlvbiBpcyAnc2VsZWN0ZWQnXG4gICAgdmFyIHNlbGVjdFZhbHVlID0gbnVsbDtcbiAgICBpZiAoaG9zdFBhcmVudCAhPSBudWxsKSB7XG4gICAgICB2YXIgc2VsZWN0UGFyZW50ID0gaG9zdFBhcmVudDtcblxuICAgICAgaWYgKHNlbGVjdFBhcmVudC5fdGFnID09PSAnb3B0Z3JvdXAnKSB7XG4gICAgICAgIHNlbGVjdFBhcmVudCA9IHNlbGVjdFBhcmVudC5faG9zdFBhcmVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGVjdFBhcmVudCAhPSBudWxsICYmIHNlbGVjdFBhcmVudC5fdGFnID09PSAnc2VsZWN0Jykge1xuICAgICAgICBzZWxlY3RWYWx1ZSA9IFJlYWN0RE9NU2VsZWN0LmdldFNlbGVjdFZhbHVlQ29udGV4dChzZWxlY3RQYXJlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZSB2YWx1ZSBpcyBudWxsIChlLmcuLCBubyBzcGVjaWZpZWQgdmFsdWUgb3IgYWZ0ZXIgaW5pdGlhbCBtb3VudClcbiAgICAvLyBvciBtaXNzaW5nIChlLmcuLCBmb3IgPGRhdGFsaXN0PiksIHdlIGRvbid0IGNoYW5nZSBwcm9wcy5zZWxlY3RlZFxuICAgIHZhciBzZWxlY3RlZCA9IG51bGw7XG4gICAgaWYgKHNlbGVjdFZhbHVlICE9IG51bGwpIHtcbiAgICAgIHZhciB2YWx1ZTtcbiAgICAgIGlmIChwcm9wcy52YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHZhbHVlID0gcHJvcHMudmFsdWUgKyAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlID0gZmxhdHRlbkNoaWxkcmVuKHByb3BzLmNoaWxkcmVuKTtcbiAgICAgIH1cbiAgICAgIHNlbGVjdGVkID0gZmFsc2U7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShzZWxlY3RWYWx1ZSkpIHtcbiAgICAgICAgLy8gbXVsdGlwbGVcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RWYWx1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICgnJyArIHNlbGVjdFZhbHVlW2ldID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZCA9ICcnICsgc2VsZWN0VmFsdWUgPT09IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGluc3QuX3dyYXBwZXJTdGF0ZSA9IHsgc2VsZWN0ZWQ6IHNlbGVjdGVkIH07XG4gIH0sXG5cbiAgcG9zdE1vdW50V3JhcHBlcjogZnVuY3Rpb24gKGluc3QpIHtcbiAgICAvLyB2YWx1ZT1cIlwiIHNob3VsZCBtYWtlIGEgdmFsdWUgYXR0cmlidXRlICgjNjIxOSlcbiAgICB2YXIgcHJvcHMgPSBpbnN0Ll9jdXJyZW50RWxlbWVudC5wcm9wcztcbiAgICBpZiAocHJvcHMudmFsdWUgIT0gbnVsbCkge1xuICAgICAgdmFyIG5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtcbiAgICAgIG5vZGUuc2V0QXR0cmlidXRlKCd2YWx1ZScsIHByb3BzLnZhbHVlKTtcbiAgICB9XG4gIH0sXG5cbiAgZ2V0SG9zdFByb3BzOiBmdW5jdGlvbiAoaW5zdCwgcHJvcHMpIHtcbiAgICB2YXIgaG9zdFByb3BzID0gX2Fzc2lnbih7IHNlbGVjdGVkOiB1bmRlZmluZWQsIGNoaWxkcmVuOiB1bmRlZmluZWQgfSwgcHJvcHMpO1xuXG4gICAgLy8gUmVhZCBzdGF0ZSBvbmx5IGZyb20gaW5pdGlhbCBtb3VudCBiZWNhdXNlIDxzZWxlY3Q+IHVwZGF0ZXMgdmFsdWVcbiAgICAvLyBtYW51YWxseTsgd2UgbmVlZCB0aGUgaW5pdGlhbCBzdGF0ZSBvbmx5IGZvciBzZXJ2ZXIgcmVuZGVyaW5nXG4gICAgaWYgKGluc3QuX3dyYXBwZXJTdGF0ZS5zZWxlY3RlZCAhPSBudWxsKSB7XG4gICAgICBob3N0UHJvcHMuc2VsZWN0ZWQgPSBpbnN0Ll93cmFwcGVyU3RhdGUuc2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRlbnQgPSBmbGF0dGVuQ2hpbGRyZW4ocHJvcHMuY2hpbGRyZW4pO1xuXG4gICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgIGhvc3RQcm9wcy5jaGlsZHJlbiA9IGNvbnRlbnQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhvc3RQcm9wcztcbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NT3B0aW9uOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgTGlua2VkVmFsdWVVdGlscyA9IHJlcXVpcmUoJy4vTGlua2VkVmFsdWVVdGlscycpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZXMnKTtcblxudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBkaWRXYXJuVmFsdWVMaW5rID0gZmFsc2U7XG52YXIgZGlkV2FyblZhbHVlRGVmYXVsdFZhbHVlID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHVwZGF0ZU9wdGlvbnNJZlBlbmRpbmdVcGRhdGVBbmRNb3VudGVkKCkge1xuICBpZiAodGhpcy5fcm9vdE5vZGVJRCAmJiB0aGlzLl93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZSkge1xuICAgIHRoaXMuX3dyYXBwZXJTdGF0ZS5wZW5kaW5nVXBkYXRlID0gZmFsc2U7XG5cbiAgICB2YXIgcHJvcHMgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztcbiAgICB2YXIgdmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTtcblxuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICB1cGRhdGVPcHRpb25zKHRoaXMsIEJvb2xlYW4ocHJvcHMubXVsdGlwbGUpLCB2YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShvd25lcikge1xuICBpZiAob3duZXIpIHtcbiAgICB2YXIgbmFtZSA9IG93bmVyLmdldE5hbWUoKTtcbiAgICBpZiAobmFtZSkge1xuICAgICAgcmV0dXJuICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG52YXIgdmFsdWVQcm9wTmFtZXMgPSBbJ3ZhbHVlJywgJ2RlZmF1bHRWYWx1ZSddO1xuXG4vKipcbiAqIFZhbGlkYXRpb24gZnVuY3Rpb24gZm9yIGB2YWx1ZWAgYW5kIGBkZWZhdWx0VmFsdWVgLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gY2hlY2tTZWxlY3RQcm9wVHlwZXMoaW5zdCwgcHJvcHMpIHtcbiAgdmFyIG93bmVyID0gaW5zdC5fY3VycmVudEVsZW1lbnQuX293bmVyO1xuICBMaW5rZWRWYWx1ZVV0aWxzLmNoZWNrUHJvcFR5cGVzKCdzZWxlY3QnLCBwcm9wcywgb3duZXIpO1xuXG4gIGlmIChwcm9wcy52YWx1ZUxpbmsgIT09IHVuZGVmaW5lZCAmJiAhZGlkV2FyblZhbHVlTGluaykge1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2B2YWx1ZUxpbmtgIHByb3Agb24gYHNlbGVjdGAgaXMgZGVwcmVjYXRlZDsgc2V0IGB2YWx1ZWAgYW5kIGBvbkNoYW5nZWAgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgICBkaWRXYXJuVmFsdWVMaW5rID0gdHJ1ZTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVQcm9wTmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcHJvcE5hbWUgPSB2YWx1ZVByb3BOYW1lc1tpXTtcbiAgICBpZiAocHJvcHNbcHJvcE5hbWVdID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocHJvcHNbcHJvcE5hbWVdKTtcbiAgICBpZiAocHJvcHMubXVsdGlwbGUgJiYgIWlzQXJyYXkpIHtcbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1RoZSBgJXNgIHByb3Agc3VwcGxpZWQgdG8gPHNlbGVjdD4gbXVzdCBiZSBhbiBhcnJheSBpZiAnICsgJ2BtdWx0aXBsZWAgaXMgdHJ1ZS4lcycsIHByb3BOYW1lLCBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0ob3duZXIpKSA6IHZvaWQgMDtcbiAgICB9IGVsc2UgaWYgKCFwcm9wcy5tdWx0aXBsZSAmJiBpc0FycmF5KSB7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdUaGUgYCVzYCBwcm9wIHN1cHBsaWVkIHRvIDxzZWxlY3Q+IG11c3QgYmUgYSBzY2FsYXIgJyArICd2YWx1ZSBpZiBgbXVsdGlwbGVgIGlzIGZhbHNlLiVzJywgcHJvcE5hbWUsIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShvd25lcikpIDogdm9pZCAwO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEBwYXJhbSB7UmVhY3RET01Db21wb25lbnR9IGluc3RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gbXVsdGlwbGVcbiAqIEBwYXJhbSB7Kn0gcHJvcFZhbHVlIEEgc3RyaW5nYWJsZSAod2l0aCBgbXVsdGlwbGVgLCBhIGxpc3Qgb2Ygc3RyaW5nYWJsZXMpLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gdXBkYXRlT3B0aW9ucyhpbnN0LCBtdWx0aXBsZSwgcHJvcFZhbHVlKSB7XG4gIHZhciBzZWxlY3RlZFZhbHVlLCBpO1xuICB2YXIgb3B0aW9ucyA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpLm9wdGlvbnM7XG5cbiAgaWYgKG11bHRpcGxlKSB7XG4gICAgc2VsZWN0ZWRWYWx1ZSA9IHt9O1xuICAgIGZvciAoaSA9IDA7IGkgPCBwcm9wVmFsdWUubGVuZ3RoOyBpKyspIHtcbiAgICAgIHNlbGVjdGVkVmFsdWVbJycgKyBwcm9wVmFsdWVbaV1dID0gdHJ1ZTtcbiAgICB9XG4gICAgZm9yIChpID0gMDsgaSA8IG9wdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWxlY3RlZCA9IHNlbGVjdGVkVmFsdWUuaGFzT3duUHJvcGVydHkob3B0aW9uc1tpXS52YWx1ZSk7XG4gICAgICBpZiAob3B0aW9uc1tpXS5zZWxlY3RlZCAhPT0gc2VsZWN0ZWQpIHtcbiAgICAgICAgb3B0aW9uc1tpXS5zZWxlY3RlZCA9IHNlbGVjdGVkO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBEbyBub3Qgc2V0IGBzZWxlY3QudmFsdWVgIGFzIGV4YWN0IGJlaGF2aW9yIGlzbid0IGNvbnNpc3RlbnQgYWNyb3NzIGFsbFxuICAgIC8vIGJyb3dzZXJzIGZvciBhbGwgY2FzZXMuXG4gICAgc2VsZWN0ZWRWYWx1ZSA9ICcnICsgcHJvcFZhbHVlO1xuICAgIGZvciAoaSA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAob3B0aW9uc1tpXS52YWx1ZSA9PT0gc2VsZWN0ZWRWYWx1ZSkge1xuICAgICAgICBvcHRpb25zW2ldLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIG9wdGlvbnNbMF0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEltcGxlbWVudHMgYSA8c2VsZWN0PiBob3N0IGNvbXBvbmVudCB0aGF0IGFsbG93cyBvcHRpb25hbGx5IHNldHRpbmcgdGhlXG4gKiBwcm9wcyBgdmFsdWVgIGFuZCBgZGVmYXVsdFZhbHVlYC4gSWYgYG11bHRpcGxlYCBpcyBmYWxzZSwgdGhlIHByb3AgbXVzdCBiZSBhXG4gKiBzdHJpbmdhYmxlLiBJZiBgbXVsdGlwbGVgIGlzIHRydWUsIHRoZSBwcm9wIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5nYWJsZXMuXG4gKlxuICogSWYgYHZhbHVlYCBpcyBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zIHRoYXQgY2hhbmdlIHRoZVxuICogc2VsZWN0ZWQgb3B0aW9uIHdpbGwgdHJpZ2dlciB1cGRhdGVzIHRvIHRoZSByZW5kZXJlZCBvcHRpb25zLlxuICpcbiAqIElmIGl0IGlzIHN1cHBsaWVkIChhbmQgbm90IG51bGwvdW5kZWZpbmVkKSwgdGhlIHJlbmRlcmVkIG9wdGlvbnMgd2lsbCBub3RcbiAqIHVwZGF0ZSBpbiByZXNwb25zZSB0byB1c2VyIGFjdGlvbnMuIEluc3RlYWQsIHRoZSBgdmFsdWVgIHByb3AgbXVzdCBjaGFuZ2UgaW5cbiAqIG9yZGVyIGZvciB0aGUgcmVuZGVyZWQgb3B0aW9ucyB0byB1cGRhdGUuXG4gKlxuICogSWYgYGRlZmF1bHRWYWx1ZWAgaXMgcHJvdmlkZWQsIGFueSBvcHRpb25zIHdpdGggdGhlIHN1cHBsaWVkIHZhbHVlcyB3aWxsIGJlXG4gKiBzZWxlY3RlZC5cbiAqL1xudmFyIFJlYWN0RE9NU2VsZWN0ID0ge1xuICBnZXRIb3N0UHJvcHM6IGZ1bmN0aW9uIChpbnN0LCBwcm9wcykge1xuICAgIHJldHVybiBfYXNzaWduKHt9LCBwcm9wcywge1xuICAgICAgb25DaGFuZ2U6IGluc3QuX3dyYXBwZXJTdGF0ZS5vbkNoYW5nZSxcbiAgICAgIHZhbHVlOiB1bmRlZmluZWRcbiAgICB9KTtcbiAgfSxcblxuICBtb3VudFdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0LCBwcm9wcykge1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgY2hlY2tTZWxlY3RQcm9wVHlwZXMoaW5zdCwgcHJvcHMpO1xuICAgIH1cblxuICAgIHZhciB2YWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZ2V0VmFsdWUocHJvcHMpO1xuICAgIGluc3QuX3dyYXBwZXJTdGF0ZSA9IHtcbiAgICAgIHBlbmRpbmdVcGRhdGU6IGZhbHNlLFxuICAgICAgaW5pdGlhbFZhbHVlOiB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiBwcm9wcy5kZWZhdWx0VmFsdWUsXG4gICAgICBsaXN0ZW5lcnM6IG51bGwsXG4gICAgICBvbkNoYW5nZTogX2hhbmRsZUNoYW5nZS5iaW5kKGluc3QpLFxuICAgICAgd2FzTXVsdGlwbGU6IEJvb2xlYW4ocHJvcHMubXVsdGlwbGUpXG4gICAgfTtcblxuICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUpIHtcbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1NlbGVjdCBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgc2VsZWN0ICcgKyAnZWxlbWVudCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzJykgOiB2b2lkIDA7XG4gICAgICBkaWRXYXJuVmFsdWVEZWZhdWx0VmFsdWUgPSB0cnVlO1xuICAgIH1cbiAgfSxcblxuICBnZXRTZWxlY3RWYWx1ZUNvbnRleHQ6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgLy8gUmVhY3RET01PcHRpb24gbG9va3MgYXQgdGhpcyBpbml0aWFsIHZhbHVlIHNvIHRoZSBpbml0aWFsIGdlbmVyYXRlZFxuICAgIC8vIG1hcmt1cCBoYXMgY29ycmVjdCBgc2VsZWN0ZWRgIGF0dHJpYnV0ZXNcbiAgICByZXR1cm4gaW5zdC5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZTtcbiAgfSxcblxuICBwb3N0VXBkYXRlV3JhcHBlcjogZnVuY3Rpb24gKGluc3QpIHtcbiAgICB2YXIgcHJvcHMgPSBpbnN0Ll9jdXJyZW50RWxlbWVudC5wcm9wcztcblxuICAgIC8vIEFmdGVyIHRoZSBpbml0aWFsIG1vdW50LCB3ZSBjb250cm9sIHNlbGVjdGVkLW5lc3MgbWFudWFsbHkgc28gZG9uJ3QgcGFzc1xuICAgIC8vIHRoaXMgdmFsdWUgZG93blxuICAgIGluc3QuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUgPSB1bmRlZmluZWQ7XG5cbiAgICB2YXIgd2FzTXVsdGlwbGUgPSBpbnN0Ll93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7XG4gICAgaW5zdC5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlID0gQm9vbGVhbihwcm9wcy5tdWx0aXBsZSk7XG5cbiAgICB2YXIgdmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTtcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgaW5zdC5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGUgPSBmYWxzZTtcbiAgICAgIHVwZGF0ZU9wdGlvbnMoaW5zdCwgQm9vbGVhbihwcm9wcy5tdWx0aXBsZSksIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHdhc011bHRpcGxlICE9PSBCb29sZWFuKHByb3BzLm11bHRpcGxlKSkge1xuICAgICAgLy8gRm9yIHNpbXBsaWNpdHksIHJlYXBwbHkgYGRlZmF1bHRWYWx1ZWAgaWYgYG11bHRpcGxlYCBpcyB0b2dnbGVkLlxuICAgICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICAgIHVwZGF0ZU9wdGlvbnMoaW5zdCwgQm9vbGVhbihwcm9wcy5tdWx0aXBsZSksIHByb3BzLmRlZmF1bHRWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZXZlcnQgdGhlIHNlbGVjdCBiYWNrIHRvIGl0cyBkZWZhdWx0IHVuc2VsZWN0ZWQgc3RhdGUuXG4gICAgICAgIHVwZGF0ZU9wdGlvbnMoaW5zdCwgQm9vbGVhbihwcm9wcy5tdWx0aXBsZSksIHByb3BzLm11bHRpcGxlID8gW10gOiAnJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBfaGFuZGxlQ2hhbmdlKGV2ZW50KSB7XG4gIHZhciBwcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuICB2YXIgcmV0dXJuVmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmV4ZWN1dGVPbkNoYW5nZShwcm9wcywgZXZlbnQpO1xuXG4gIGlmICh0aGlzLl9yb290Tm9kZUlEKSB7XG4gICAgdGhpcy5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGUgPSB0cnVlO1xuICB9XG4gIFJlYWN0VXBkYXRlcy5hc2FwKHVwZGF0ZU9wdGlvbnNJZlBlbmRpbmdVcGRhdGVBbmRNb3VudGVkLCB0aGlzKTtcbiAgcmV0dXJuIHJldHVyblZhbHVlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NU2VsZWN0OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbnZhciBnZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0ID0gcmVxdWlyZSgnLi9nZXROb2RlRm9yQ2hhcmFjdGVyT2Zmc2V0Jyk7XG52YXIgZ2V0VGV4dENvbnRlbnRBY2Nlc3NvciA9IHJlcXVpcmUoJy4vZ2V0VGV4dENvbnRlbnRBY2Nlc3NvcicpO1xuXG4vKipcbiAqIFdoaWxlIGBpc0NvbGxhcHNlZGAgaXMgYXZhaWxhYmxlIG9uIHRoZSBTZWxlY3Rpb24gb2JqZWN0IGFuZCBgY29sbGFwc2VkYFxuICogaXMgYXZhaWxhYmxlIG9uIHRoZSBSYW5nZSBvYmplY3QsIElFMTEgc29tZXRpbWVzIGdldHMgdGhlbSB3cm9uZy5cbiAqIElmIHRoZSBhbmNob3IvZm9jdXMgbm9kZXMgYW5kIG9mZnNldHMgYXJlIHRoZSBzYW1lLCB0aGUgcmFuZ2UgaXMgY29sbGFwc2VkLlxuICovXG5mdW5jdGlvbiBpc0NvbGxhcHNlZChhbmNob3JOb2RlLCBhbmNob3JPZmZzZXQsIGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpIHtcbiAgcmV0dXJuIGFuY2hvck5vZGUgPT09IGZvY3VzTm9kZSAmJiBhbmNob3JPZmZzZXQgPT09IGZvY3VzT2Zmc2V0O1xufVxuXG4vKipcbiAqIEdldCB0aGUgYXBwcm9wcmlhdGUgYW5jaG9yIGFuZCBmb2N1cyBub2RlL29mZnNldCBwYWlycyBmb3IgSUUuXG4gKlxuICogVGhlIGNhdGNoIGhlcmUgaXMgdGhhdCBJRSdzIHNlbGVjdGlvbiBBUEkgZG9lc24ndCBwcm92aWRlIGluZm9ybWF0aW9uXG4gKiBhYm91dCB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gaXMgZm9yd2FyZCBvciBiYWNrd2FyZCwgc28gd2UgaGF2ZSB0b1xuICogYmVoYXZlIGFzIHRob3VnaCBpdCdzIGFsd2F5cyBmb3J3YXJkLlxuICpcbiAqIElFIHRleHQgZGlmZmVycyBmcm9tIG1vZGVybiBzZWxlY3Rpb24gaW4gdGhhdCBpdCBiZWhhdmVzIGFzIHRob3VnaFxuICogYmxvY2sgZWxlbWVudHMgZW5kIHdpdGggYSBuZXcgbGluZS4gVGhpcyBtZWFucyBjaGFyYWN0ZXIgb2Zmc2V0cyB3aWxsXG4gKiBkaWZmZXIgYmV0d2VlbiB0aGUgdHdvIEFQSXMuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGdldElFT2Zmc2V0cyhub2RlKSB7XG4gIHZhciBzZWxlY3Rpb24gPSBkb2N1bWVudC5zZWxlY3Rpb247XG4gIHZhciBzZWxlY3RlZFJhbmdlID0gc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7XG4gIHZhciBzZWxlY3RlZExlbmd0aCA9IHNlbGVjdGVkUmFuZ2UudGV4dC5sZW5ndGg7XG5cbiAgLy8gRHVwbGljYXRlIHNlbGVjdGlvbiBzbyB3ZSBjYW4gbW92ZSByYW5nZSB3aXRob3V0IGJyZWFraW5nIHVzZXIgc2VsZWN0aW9uLlxuICB2YXIgZnJvbVN0YXJ0ID0gc2VsZWN0ZWRSYW5nZS5kdXBsaWNhdGUoKTtcbiAgZnJvbVN0YXJ0Lm1vdmVUb0VsZW1lbnRUZXh0KG5vZGUpO1xuICBmcm9tU3RhcnQuc2V0RW5kUG9pbnQoJ0VuZFRvU3RhcnQnLCBzZWxlY3RlZFJhbmdlKTtcblxuICB2YXIgc3RhcnRPZmZzZXQgPSBmcm9tU3RhcnQudGV4dC5sZW5ndGg7XG4gIHZhciBlbmRPZmZzZXQgPSBzdGFydE9mZnNldCArIHNlbGVjdGVkTGVuZ3RoO1xuXG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IHN0YXJ0T2Zmc2V0LFxuICAgIGVuZDogZW5kT2Zmc2V0XG4gIH07XG59XG5cbi8qKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcmV0dXJuIHs/b2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRNb2Rlcm5PZmZzZXRzKG5vZGUpIHtcbiAgdmFyIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24gJiYgd2luZG93LmdldFNlbGVjdGlvbigpO1xuXG4gIGlmICghc2VsZWN0aW9uIHx8IHNlbGVjdGlvbi5yYW5nZUNvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgYW5jaG9yTm9kZSA9IHNlbGVjdGlvbi5hbmNob3JOb2RlO1xuICB2YXIgYW5jaG9yT2Zmc2V0ID0gc2VsZWN0aW9uLmFuY2hvck9mZnNldDtcbiAgdmFyIGZvY3VzTm9kZSA9IHNlbGVjdGlvbi5mb2N1c05vZGU7XG4gIHZhciBmb2N1c09mZnNldCA9IHNlbGVjdGlvbi5mb2N1c09mZnNldDtcblxuICB2YXIgY3VycmVudFJhbmdlID0gc2VsZWN0aW9uLmdldFJhbmdlQXQoMCk7XG5cbiAgLy8gSW4gRmlyZWZveCwgcmFuZ2Uuc3RhcnRDb250YWluZXIgYW5kIHJhbmdlLmVuZENvbnRhaW5lciBjYW4gYmUgXCJhbm9ueW1vdXNcbiAgLy8gZGl2c1wiLCBlLmcuIHRoZSB1cC9kb3duIGJ1dHRvbnMgb24gYW4gPGlucHV0IHR5cGU9XCJudW1iZXJcIj4uIEFub255bW91c1xuICAvLyBkaXZzIGRvIG5vdCBzZWVtIHRvIGV4cG9zZSBwcm9wZXJ0aWVzLCB0cmlnZ2VyaW5nIGEgXCJQZXJtaXNzaW9uIGRlbmllZFxuICAvLyBlcnJvclwiIGlmIGFueSBvZiBpdHMgcHJvcGVydGllcyBhcmUgYWNjZXNzZWQuIFRoZSBvbmx5IHNlZW1pbmdseSBwb3NzaWJsZVxuICAvLyB3YXkgdG8gYXZvaWQgZXJyb3JpbmcgaXMgdG8gYWNjZXNzIGEgcHJvcGVydHkgdGhhdCB0eXBpY2FsbHkgd29ya3MgZm9yXG4gIC8vIG5vbi1hbm9ueW1vdXMgZGl2cyBhbmQgY2F0Y2ggYW55IGVycm9yIHRoYXQgbWF5IG90aGVyd2lzZSBhcmlzZS4gU2VlXG4gIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTIwODQyN1xuICB0cnkge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC1leHByZXNzaW9ucyAqL1xuICAgIGN1cnJlbnRSYW5nZS5zdGFydENvbnRhaW5lci5ub2RlVHlwZTtcbiAgICBjdXJyZW50UmFuZ2UuZW5kQ29udGFpbmVyLm5vZGVUeXBlO1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLWV4cHJlc3Npb25zICovXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIElmIHRoZSBub2RlIGFuZCBvZmZzZXQgdmFsdWVzIGFyZSB0aGUgc2FtZSwgdGhlIHNlbGVjdGlvbiBpcyBjb2xsYXBzZWQuXG4gIC8vIGBTZWxlY3Rpb24uaXNDb2xsYXBzZWRgIGlzIGF2YWlsYWJsZSBuYXRpdmVseSwgYnV0IElFIHNvbWV0aW1lcyBnZXRzXG4gIC8vIHRoaXMgdmFsdWUgd3JvbmcuXG4gIHZhciBpc1NlbGVjdGlvbkNvbGxhcHNlZCA9IGlzQ29sbGFwc2VkKHNlbGVjdGlvbi5hbmNob3JOb2RlLCBzZWxlY3Rpb24uYW5jaG9yT2Zmc2V0LCBzZWxlY3Rpb24uZm9jdXNOb2RlLCBzZWxlY3Rpb24uZm9jdXNPZmZzZXQpO1xuXG4gIHZhciByYW5nZUxlbmd0aCA9IGlzU2VsZWN0aW9uQ29sbGFwc2VkID8gMCA6IGN1cnJlbnRSYW5nZS50b1N0cmluZygpLmxlbmd0aDtcblxuICB2YXIgdGVtcFJhbmdlID0gY3VycmVudFJhbmdlLmNsb25lUmFuZ2UoKTtcbiAgdGVtcFJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhub2RlKTtcbiAgdGVtcFJhbmdlLnNldEVuZChjdXJyZW50UmFuZ2Uuc3RhcnRDb250YWluZXIsIGN1cnJlbnRSYW5nZS5zdGFydE9mZnNldCk7XG5cbiAgdmFyIGlzVGVtcFJhbmdlQ29sbGFwc2VkID0gaXNDb2xsYXBzZWQodGVtcFJhbmdlLnN0YXJ0Q29udGFpbmVyLCB0ZW1wUmFuZ2Uuc3RhcnRPZmZzZXQsIHRlbXBSYW5nZS5lbmRDb250YWluZXIsIHRlbXBSYW5nZS5lbmRPZmZzZXQpO1xuXG4gIHZhciBzdGFydCA9IGlzVGVtcFJhbmdlQ29sbGFwc2VkID8gMCA6IHRlbXBSYW5nZS50b1N0cmluZygpLmxlbmd0aDtcbiAgdmFyIGVuZCA9IHN0YXJ0ICsgcmFuZ2VMZW5ndGg7XG5cbiAgLy8gRGV0ZWN0IHdoZXRoZXIgdGhlIHNlbGVjdGlvbiBpcyBiYWNrd2FyZC5cbiAgdmFyIGRldGVjdGlvblJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgZGV0ZWN0aW9uUmFuZ2Uuc2V0U3RhcnQoYW5jaG9yTm9kZSwgYW5jaG9yT2Zmc2V0KTtcbiAgZGV0ZWN0aW9uUmFuZ2Uuc2V0RW5kKGZvY3VzTm9kZSwgZm9jdXNPZmZzZXQpO1xuICB2YXIgaXNCYWNrd2FyZCA9IGRldGVjdGlvblJhbmdlLmNvbGxhcHNlZDtcblxuICByZXR1cm4ge1xuICAgIHN0YXJ0OiBpc0JhY2t3YXJkID8gZW5kIDogc3RhcnQsXG4gICAgZW5kOiBpc0JhY2t3YXJkID8gc3RhcnQgOiBlbmRcbiAgfTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzXG4gKi9cbmZ1bmN0aW9uIHNldElFT2Zmc2V0cyhub2RlLCBvZmZzZXRzKSB7XG4gIHZhciByYW5nZSA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLmR1cGxpY2F0ZSgpO1xuICB2YXIgc3RhcnQsIGVuZDtcblxuICBpZiAob2Zmc2V0cy5lbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gb2Zmc2V0cy5zdGFydDtcbiAgICBlbmQgPSBzdGFydDtcbiAgfSBlbHNlIGlmIChvZmZzZXRzLnN0YXJ0ID4gb2Zmc2V0cy5lbmQpIHtcbiAgICBzdGFydCA9IG9mZnNldHMuZW5kO1xuICAgIGVuZCA9IG9mZnNldHMuc3RhcnQ7XG4gIH0gZWxzZSB7XG4gICAgc3RhcnQgPSBvZmZzZXRzLnN0YXJ0O1xuICAgIGVuZCA9IG9mZnNldHMuZW5kO1xuICB9XG5cbiAgcmFuZ2UubW92ZVRvRWxlbWVudFRleHQobm9kZSk7XG4gIHJhbmdlLm1vdmVTdGFydCgnY2hhcmFjdGVyJywgc3RhcnQpO1xuICByYW5nZS5zZXRFbmRQb2ludCgnRW5kVG9TdGFydCcsIHJhbmdlKTtcbiAgcmFuZ2UubW92ZUVuZCgnY2hhcmFjdGVyJywgZW5kIC0gc3RhcnQpO1xuICByYW5nZS5zZWxlY3QoKTtcbn1cblxuLyoqXG4gKiBJbiBtb2Rlcm4gbm9uLUlFIGJyb3dzZXJzLCB3ZSBjYW4gc3VwcG9ydCBib3RoIGZvcndhcmQgYW5kIGJhY2t3YXJkXG4gKiBzZWxlY3Rpb25zLlxuICpcbiAqIE5vdGU6IElFMTArIHN1cHBvcnRzIHRoZSBTZWxlY3Rpb24gb2JqZWN0LCBidXQgaXQgZG9lcyBub3Qgc3VwcG9ydFxuICogdGhlIGBleHRlbmRgIG1ldGhvZCwgd2hpY2ggbWVhbnMgdGhhdCBldmVuIGluIG1vZGVybiBJRSwgaXQncyBub3QgcG9zc2libGVcbiAqIHRvIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlIGEgYmFja3dhcmQgc2VsZWN0aW9uLiBUaHVzLCBmb3IgYWxsIElFXG4gKiB2ZXJzaW9ucywgd2UgdXNlIHRoZSBvbGQgSUUgQVBJIHRvIGNyZWF0ZSBvdXIgc2VsZWN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvZmZzZXRzXG4gKi9cbmZ1bmN0aW9uIHNldE1vZGVybk9mZnNldHMobm9kZSwgb2Zmc2V0cykge1xuICBpZiAoIXdpbmRvdy5nZXRTZWxlY3Rpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICB2YXIgbGVuZ3RoID0gbm9kZVtnZXRUZXh0Q29udGVudEFjY2Vzc29yKCldLmxlbmd0aDtcbiAgdmFyIHN0YXJ0ID0gTWF0aC5taW4ob2Zmc2V0cy5zdGFydCwgbGVuZ3RoKTtcbiAgdmFyIGVuZCA9IG9mZnNldHMuZW5kID09PSB1bmRlZmluZWQgPyBzdGFydCA6IE1hdGgubWluKG9mZnNldHMuZW5kLCBsZW5ndGgpO1xuXG4gIC8vIElFIDExIHVzZXMgbW9kZXJuIHNlbGVjdGlvbiwgYnV0IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZXh0ZW5kIG1ldGhvZC5cbiAgLy8gRmxpcCBiYWNrd2FyZCBzZWxlY3Rpb25zLCBzbyB3ZSBjYW4gc2V0IHdpdGggYSBzaW5nbGUgcmFuZ2UuXG4gIGlmICghc2VsZWN0aW9uLmV4dGVuZCAmJiBzdGFydCA+IGVuZCkge1xuICAgIHZhciB0ZW1wID0gZW5kO1xuICAgIGVuZCA9IHN0YXJ0O1xuICAgIHN0YXJ0ID0gdGVtcDtcbiAgfVxuXG4gIHZhciBzdGFydE1hcmtlciA9IGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQobm9kZSwgc3RhcnQpO1xuICB2YXIgZW5kTWFya2VyID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldChub2RlLCBlbmQpO1xuXG4gIGlmIChzdGFydE1hcmtlciAmJiBlbmRNYXJrZXIpIHtcbiAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNldFN0YXJ0KHN0YXJ0TWFya2VyLm5vZGUsIHN0YXJ0TWFya2VyLm9mZnNldCk7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuXG4gICAgaWYgKHN0YXJ0ID4gZW5kKSB7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgc2VsZWN0aW9uLmV4dGVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlLnNldEVuZChlbmRNYXJrZXIubm9kZSwgZW5kTWFya2VyLm9mZnNldCk7XG4gICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgIH1cbiAgfVxufVxuXG52YXIgdXNlSUVPZmZzZXRzID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmICdzZWxlY3Rpb24nIGluIGRvY3VtZW50ICYmICEoJ2dldFNlbGVjdGlvbicgaW4gd2luZG93KTtcblxudmFyIFJlYWN0RE9NU2VsZWN0aW9uID0ge1xuICAvKipcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gICAqL1xuICBnZXRPZmZzZXRzOiB1c2VJRU9mZnNldHMgPyBnZXRJRU9mZnNldHMgOiBnZXRNb2Rlcm5PZmZzZXRzLFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IG5vZGVcbiAgICogQHBhcmFtIHtvYmplY3R9IG9mZnNldHNcbiAgICovXG4gIHNldE9mZnNldHM6IHVzZUlFT2Zmc2V0cyA/IHNldElFT2Zmc2V0cyA6IHNldE1vZGVybk9mZnNldHNcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01TZWxlY3Rpb247IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKSxcbiAgICBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgRE9NQ2hpbGRyZW5PcGVyYXRpb25zID0gcmVxdWlyZSgnLi9ET01DaGlsZHJlbk9wZXJhdGlvbnMnKTtcbnZhciBET01MYXp5VHJlZSA9IHJlcXVpcmUoJy4vRE9NTGF6eVRyZWUnKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xuXG52YXIgZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyID0gcmVxdWlyZSgnLi9lc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXInKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB2YWxpZGF0ZURPTU5lc3RpbmcgPSByZXF1aXJlKCcuL3ZhbGlkYXRlRE9NTmVzdGluZycpO1xuXG4vKipcbiAqIFRleHQgbm9kZXMgdmlvbGF0ZSBhIGNvdXBsZSBhc3N1bXB0aW9ucyB0aGF0IFJlYWN0IG1ha2VzIGFib3V0IGNvbXBvbmVudHM6XG4gKlxuICogIC0gV2hlbiBtb3VudGluZyB0ZXh0IGludG8gdGhlIERPTSwgYWRqYWNlbnQgdGV4dCBub2RlcyBhcmUgbWVyZ2VkLlxuICogIC0gVGV4dCBub2RlcyBjYW5ub3QgYmUgYXNzaWduZWQgYSBSZWFjdCByb290IElELlxuICpcbiAqIFRoaXMgY29tcG9uZW50IGlzIHVzZWQgdG8gd3JhcCBzdHJpbmdzIGJldHdlZW4gY29tbWVudCBub2RlcyBzbyB0aGF0IHRoZXlcbiAqIGNhbiB1bmRlcmdvIHRoZSBzYW1lIHJlY29uY2lsaWF0aW9uIHRoYXQgaXMgYXBwbGllZCB0byBlbGVtZW50cy5cbiAqXG4gKiBUT0RPOiBJbnZlc3RpZ2F0ZSByZXByZXNlbnRpbmcgUmVhY3QgY29tcG9uZW50cyBpbiB0aGUgRE9NIHdpdGggdGV4dCBub2Rlcy5cbiAqXG4gKiBAY2xhc3MgUmVhY3RET01UZXh0Q29tcG9uZW50XG4gKiBAZXh0ZW5kcyBSZWFjdENvbXBvbmVudFxuICogQGludGVybmFsXG4gKi9cbnZhciBSZWFjdERPTVRleHRDb21wb25lbnQgPSBmdW5jdGlvbiAodGV4dCkge1xuICAvLyBUT0RPOiBUaGlzIGlzIHJlYWxseSBhIFJlYWN0VGV4dCAoUmVhY3ROb2RlKSwgbm90IGEgUmVhY3RFbGVtZW50XG4gIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gdGV4dDtcbiAgdGhpcy5fc3RyaW5nVGV4dCA9ICcnICsgdGV4dDtcbiAgLy8gUmVhY3RET01Db21wb25lbnRUcmVlIHVzZXMgdGhlc2U6XG4gIHRoaXMuX2hvc3ROb2RlID0gbnVsbDtcbiAgdGhpcy5faG9zdFBhcmVudCA9IG51bGw7XG5cbiAgLy8gUHJvcGVydGllc1xuICB0aGlzLl9kb21JRCA9IDA7XG4gIHRoaXMuX21vdW50SW5kZXggPSAwO1xuICB0aGlzLl9jbG9zaW5nQ29tbWVudCA9IG51bGw7XG4gIHRoaXMuX2NvbW1lbnROb2RlcyA9IG51bGw7XG59O1xuXG5fYXNzaWduKFJlYWN0RE9NVGV4dENvbXBvbmVudC5wcm90b3R5cGUsIHtcblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgbWFya3VwIGZvciB0aGlzIHRleHQgbm9kZS4gVGhpcyBub2RlIGlzIG5vdCBpbnRlbmRlZCB0byBoYXZlXG4gICAqIGFueSBmZWF0dXJlcyBiZXNpZGVzIGNvbnRhaW5pbmcgdGV4dCBjb250ZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb258UmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAgICogQHJldHVybiB7c3RyaW5nfSBNYXJrdXAgZm9yIHRoaXMgdGV4dCBub2RlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIG1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAodHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0KSB7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YXIgcGFyZW50SW5mbztcbiAgICAgIGlmIChob3N0UGFyZW50ICE9IG51bGwpIHtcbiAgICAgICAgcGFyZW50SW5mbyA9IGhvc3RQYXJlbnQuX2FuY2VzdG9ySW5mbztcbiAgICAgIH0gZWxzZSBpZiAoaG9zdENvbnRhaW5lckluZm8gIT0gbnVsbCkge1xuICAgICAgICBwYXJlbnRJbmZvID0gaG9zdENvbnRhaW5lckluZm8uX2FuY2VzdG9ySW5mbztcbiAgICAgIH1cbiAgICAgIGlmIChwYXJlbnRJbmZvKSB7XG4gICAgICAgIC8vIHBhcmVudEluZm8gc2hvdWxkIGFsd2F5cyBiZSBwcmVzZW50IGV4Y2VwdCBmb3IgdGhlIHRvcC1sZXZlbFxuICAgICAgICAvLyBjb21wb25lbnQgd2hlbiBzZXJ2ZXIgcmVuZGVyaW5nXG4gICAgICAgIHZhbGlkYXRlRE9NTmVzdGluZyhudWxsLCB0aGlzLl9zdHJpbmdUZXh0LCB0aGlzLCBwYXJlbnRJbmZvKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZG9tSUQgPSBob3N0Q29udGFpbmVySW5mby5faWRDb3VudGVyKys7XG4gICAgdmFyIG9wZW5pbmdWYWx1ZSA9ICcgcmVhY3QtdGV4dDogJyArIGRvbUlEICsgJyAnO1xuICAgIHZhciBjbG9zaW5nVmFsdWUgPSAnIC9yZWFjdC10ZXh0ICc7XG4gICAgdGhpcy5fZG9tSUQgPSBkb21JRDtcbiAgICB0aGlzLl9ob3N0UGFyZW50ID0gaG9zdFBhcmVudDtcbiAgICBpZiAodHJhbnNhY3Rpb24udXNlQ3JlYXRlRWxlbWVudCkge1xuICAgICAgdmFyIG93bmVyRG9jdW1lbnQgPSBob3N0Q29udGFpbmVySW5mby5fb3duZXJEb2N1bWVudDtcbiAgICAgIHZhciBvcGVuaW5nQ29tbWVudCA9IG93bmVyRG9jdW1lbnQuY3JlYXRlQ29tbWVudChvcGVuaW5nVmFsdWUpO1xuICAgICAgdmFyIGNsb3NpbmdDb21tZW50ID0gb3duZXJEb2N1bWVudC5jcmVhdGVDb21tZW50KGNsb3NpbmdWYWx1ZSk7XG4gICAgICB2YXIgbGF6eVRyZWUgPSBET01MYXp5VHJlZShvd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSk7XG4gICAgICBET01MYXp5VHJlZS5xdWV1ZUNoaWxkKGxhenlUcmVlLCBET01MYXp5VHJlZShvcGVuaW5nQ29tbWVudCkpO1xuICAgICAgaWYgKHRoaXMuX3N0cmluZ1RleHQpIHtcbiAgICAgICAgRE9NTGF6eVRyZWUucXVldWVDaGlsZChsYXp5VHJlZSwgRE9NTGF6eVRyZWUob3duZXJEb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0aGlzLl9zdHJpbmdUZXh0KSkpO1xuICAgICAgfVxuICAgICAgRE9NTGF6eVRyZWUucXVldWVDaGlsZChsYXp5VHJlZSwgRE9NTGF6eVRyZWUoY2xvc2luZ0NvbW1lbnQpKTtcbiAgICAgIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5wcmVjYWNoZU5vZGUodGhpcywgb3BlbmluZ0NvbW1lbnQpO1xuICAgICAgdGhpcy5fY2xvc2luZ0NvbW1lbnQgPSBjbG9zaW5nQ29tbWVudDtcbiAgICAgIHJldHVybiBsYXp5VHJlZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGVzY2FwZWRUZXh0ID0gZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyKHRoaXMuX3N0cmluZ1RleHQpO1xuXG4gICAgICBpZiAodHJhbnNhY3Rpb24ucmVuZGVyVG9TdGF0aWNNYXJrdXApIHtcbiAgICAgICAgLy8gTm9ybWFsbHkgd2UnZCB3cmFwIHRoaXMgYmV0d2VlbiBjb21tZW50IG5vZGVzIGZvciB0aGUgcmVhc29ucyBzdGF0ZWRcbiAgICAgICAgLy8gYWJvdmUsIGJ1dCBzaW5jZSB0aGlzIGlzIGEgc2l0dWF0aW9uIHdoZXJlIFJlYWN0IHdvbid0IHRha2Ugb3ZlclxuICAgICAgICAvLyAoc3RhdGljIHBhZ2VzKSwgd2UgY2FuIHNpbXBseSByZXR1cm4gdGhlIHRleHQgYXMgaXQgaXMuXG4gICAgICAgIHJldHVybiBlc2NhcGVkVGV4dDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICc8IS0tJyArIG9wZW5pbmdWYWx1ZSArICctLT4nICsgZXNjYXBlZFRleHQgKyAnPCEtLScgKyBjbG9zaW5nVmFsdWUgKyAnLS0+JztcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhpcyBjb21wb25lbnQgYnkgdXBkYXRpbmcgdGhlIHRleHQgY29udGVudC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdFRleHR9IG5leHRUZXh0IFRoZSBuZXh0IHRleHQgY29udGVudFxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcmVjZWl2ZUNvbXBvbmVudDogZnVuY3Rpb24gKG5leHRUZXh0LCB0cmFuc2FjdGlvbikge1xuICAgIGlmIChuZXh0VGV4dCAhPT0gdGhpcy5fY3VycmVudEVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbmV4dFRleHQ7XG4gICAgICB2YXIgbmV4dFN0cmluZ1RleHQgPSAnJyArIG5leHRUZXh0O1xuICAgICAgaWYgKG5leHRTdHJpbmdUZXh0ICE9PSB0aGlzLl9zdHJpbmdUZXh0KSB7XG4gICAgICAgIC8vIFRPRE86IFNhdmUgdGhpcyBhcyBwZW5kaW5nIHByb3BzIGFuZCB1c2UgcGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5XG4gICAgICAgIC8vIGFuZC9vciB1cGRhdGVDb21wb25lbnQgdG8gZG8gdGhlIGFjdHVhbCB1cGRhdGUgZm9yIGNvbnNpc3RlbmN5IHdpdGhcbiAgICAgICAgLy8gb3RoZXIgY29tcG9uZW50IHR5cGVzP1xuICAgICAgICB0aGlzLl9zdHJpbmdUZXh0ID0gbmV4dFN0cmluZ1RleHQ7XG4gICAgICAgIHZhciBjb21tZW50Tm9kZXMgPSB0aGlzLmdldEhvc3ROb2RlKCk7XG4gICAgICAgIERPTUNoaWxkcmVuT3BlcmF0aW9ucy5yZXBsYWNlRGVsaW1pdGVkVGV4dChjb21tZW50Tm9kZXNbMF0sIGNvbW1lbnROb2Rlc1sxXSwgbmV4dFN0cmluZ1RleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICBnZXRIb3N0Tm9kZTogZnVuY3Rpb24gKCkge1xuICAgIHZhciBob3N0Tm9kZSA9IHRoaXMuX2NvbW1lbnROb2RlcztcbiAgICBpZiAoaG9zdE5vZGUpIHtcbiAgICAgIHJldHVybiBob3N0Tm9kZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9jbG9zaW5nQ29tbWVudCkge1xuICAgICAgdmFyIG9wZW5pbmdDb21tZW50ID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcyk7XG4gICAgICB2YXIgbm9kZSA9IG9wZW5pbmdDb21tZW50Lm5leHRTaWJsaW5nO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgIShub2RlICE9IG51bGwpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdNaXNzaW5nIGNsb3NpbmcgY29tbWVudCBmb3IgdGV4dCBjb21wb25lbnQgJXMnLCB0aGlzLl9kb21JRCkgOiBfcHJvZEludmFyaWFudCgnNjcnLCB0aGlzLl9kb21JRCkgOiB2b2lkIDA7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSA4ICYmIG5vZGUubm9kZVZhbHVlID09PSAnIC9yZWFjdC10ZXh0ICcpIHtcbiAgICAgICAgICB0aGlzLl9jbG9zaW5nQ29tbWVudCA9IG5vZGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICB9XG4gICAgfVxuICAgIGhvc3ROb2RlID0gW3RoaXMuX2hvc3ROb2RlLCB0aGlzLl9jbG9zaW5nQ29tbWVudF07XG4gICAgdGhpcy5fY29tbWVudE5vZGVzID0gaG9zdE5vZGU7XG4gICAgcmV0dXJuIGhvc3ROb2RlO1xuICB9LFxuXG4gIHVubW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLl9jbG9zaW5nQ29tbWVudCA9IG51bGw7XG4gICAgdGhpcy5fY29tbWVudE5vZGVzID0gbnVsbDtcbiAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUudW5jYWNoZU5vZGUodGhpcyk7XG4gIH1cblxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01UZXh0Q29tcG9uZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50JyksXG4gICAgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIExpbmtlZFZhbHVlVXRpbHMgPSByZXF1aXJlKCcuL0xpbmtlZFZhbHVlVXRpbHMnKTtcbnZhciBSZWFjdERPTUNvbXBvbmVudFRyZWUgPSByZXF1aXJlKCcuL1JlYWN0RE9NQ29tcG9uZW50VHJlZScpO1xudmFyIFJlYWN0VXBkYXRlcyA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVzJyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgZGlkV2FyblZhbHVlTGluayA9IGZhbHNlO1xudmFyIGRpZFdhcm5WYWxEZWZhdWx0VmFsID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGZvcmNlVXBkYXRlSWZNb3VudGVkKCkge1xuICBpZiAodGhpcy5fcm9vdE5vZGVJRCkge1xuICAgIC8vIERPTSBjb21wb25lbnQgaXMgc3RpbGwgbW91bnRlZDsgdXBkYXRlXG4gICAgUmVhY3RET01UZXh0YXJlYS51cGRhdGVXcmFwcGVyKHRoaXMpO1xuICB9XG59XG5cbi8qKlxuICogSW1wbGVtZW50cyBhIDx0ZXh0YXJlYT4gaG9zdCBjb21wb25lbnQgdGhhdCBhbGxvd3Mgc2V0dGluZyBgdmFsdWVgLCBhbmRcbiAqIGBkZWZhdWx0VmFsdWVgLiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgdHJhZGl0aW9uYWwgRE9NIEFQSSBiZWNhdXNlIHZhbHVlIGlzXG4gKiB1c3VhbGx5IHNldCBhcyBQQ0RBVEEgY2hpbGRyZW4uXG4gKlxuICogSWYgYHZhbHVlYCBpcyBub3Qgc3VwcGxpZWQgKG9yIG51bGwvdW5kZWZpbmVkKSwgdXNlciBhY3Rpb25zIHRoYXQgYWZmZWN0IHRoZVxuICogdmFsdWUgd2lsbCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuXG4gKlxuICogSWYgYHZhbHVlYCBpcyBzdXBwbGllZCAoYW5kIG5vdCBudWxsL3VuZGVmaW5lZCksIHRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGxcbiAqIG5vdCB0cmlnZ2VyIHVwZGF0ZXMgdG8gdGhlIGVsZW1lbnQuIEluc3RlYWQsIHRoZSBgdmFsdWVgIHByb3AgbXVzdCBjaGFuZ2UgaW5cbiAqIG9yZGVyIGZvciB0aGUgcmVuZGVyZWQgZWxlbWVudCB0byBiZSB1cGRhdGVkLlxuICpcbiAqIFRoZSByZW5kZXJlZCBlbGVtZW50IHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCBhbiBlbXB0eSB2YWx1ZSwgdGhlIHByb3BcbiAqIGBkZWZhdWx0VmFsdWVgIGlmIHNwZWNpZmllZCwgb3IgdGhlIGNoaWxkcmVuIGNvbnRlbnQgKGRlcHJlY2F0ZWQpLlxuICovXG52YXIgUmVhY3RET01UZXh0YXJlYSA9IHtcbiAgZ2V0SG9zdFByb3BzOiBmdW5jdGlvbiAoaW5zdCwgcHJvcHMpIHtcbiAgICAhKHByb3BzLmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MID09IG51bGwpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUxgIGRvZXMgbm90IG1ha2Ugc2Vuc2Ugb24gPHRleHRhcmVhPi4nKSA6IF9wcm9kSW52YXJpYW50KCc5MScpIDogdm9pZCAwO1xuXG4gICAgLy8gQWx3YXlzIHNldCBjaGlsZHJlbiB0byB0aGUgc2FtZSB0aGluZy4gSW4gSUU5LCB0aGUgc2VsZWN0aW9uIHJhbmdlIHdpbGxcbiAgICAvLyBnZXQgcmVzZXQgaWYgYHRleHRDb250ZW50YCBpcyBtdXRhdGVkLiAgV2UgY291bGQgYWRkIGEgY2hlY2sgaW4gc2V0VGV4dENvbnRlbnRcbiAgICAvLyB0byBvbmx5IHNldCB0aGUgdmFsdWUgaWYvd2hlbiB0aGUgdmFsdWUgZGlmZmVycyBmcm9tIHRoZSBub2RlIHZhbHVlICh3aGljaCB3b3VsZFxuICAgIC8vIGNvbXBsZXRlbHkgc29sdmUgdGhpcyBJRTkgYnVnKSwgYnV0IFNlYmFzdGlhbitCZW4gc2VlbWVkIHRvIGxpa2UgdGhpcyBzb2x1dGlvbi5cbiAgICAvLyBUaGUgdmFsdWUgY2FuIGJlIGEgYm9vbGVhbiBvciBvYmplY3Qgc28gdGhhdCdzIHdoeSBpdCdzIGZvcmNlZCB0byBiZSBhIHN0cmluZy5cbiAgICB2YXIgaG9zdFByb3BzID0gX2Fzc2lnbih7fSwgcHJvcHMsIHtcbiAgICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gICAgICBkZWZhdWx0VmFsdWU6IHVuZGVmaW5lZCxcbiAgICAgIGNoaWxkcmVuOiAnJyArIGluc3QuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUsXG4gICAgICBvbkNoYW5nZTogaW5zdC5fd3JhcHBlclN0YXRlLm9uQ2hhbmdlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaG9zdFByb3BzO1xuICB9LFxuXG4gIG1vdW50V3JhcHBlcjogZnVuY3Rpb24gKGluc3QsIHByb3BzKSB7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBMaW5rZWRWYWx1ZVV0aWxzLmNoZWNrUHJvcFR5cGVzKCd0ZXh0YXJlYScsIHByb3BzLCBpbnN0Ll9jdXJyZW50RWxlbWVudC5fb3duZXIpO1xuICAgICAgaWYgKHByb3BzLnZhbHVlTGluayAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsdWVMaW5rKSB7XG4gICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2B2YWx1ZUxpbmtgIHByb3Agb24gYHRleHRhcmVhYCBpcyBkZXByZWNhdGVkOyBzZXQgYHZhbHVlYCBhbmQgYG9uQ2hhbmdlYCBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICAgICAgICBkaWRXYXJuVmFsdWVMaW5rID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHByb3BzLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkICYmICFkaWRXYXJuVmFsRGVmYXVsdFZhbCkge1xuICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdUZXh0YXJlYSBlbGVtZW50cyBtdXN0IGJlIGVpdGhlciBjb250cm9sbGVkIG9yIHVuY29udHJvbGxlZCAnICsgJyhzcGVjaWZ5IGVpdGhlciB0aGUgdmFsdWUgcHJvcCwgb3IgdGhlIGRlZmF1bHRWYWx1ZSBwcm9wLCBidXQgbm90ICcgKyAnYm90aCkuIERlY2lkZSBiZXR3ZWVuIHVzaW5nIGEgY29udHJvbGxlZCBvciB1bmNvbnRyb2xsZWQgdGV4dGFyZWEgJyArICdhbmQgcmVtb3ZlIG9uZSBvZiB0aGVzZSBwcm9wcy4gTW9yZSBpbmZvOiAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3QtY29udHJvbGxlZC1jb21wb25lbnRzJykgOiB2b2lkIDA7XG4gICAgICAgIGRpZFdhcm5WYWxEZWZhdWx0VmFsID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmdldFZhbHVlKHByb3BzKTtcbiAgICB2YXIgaW5pdGlhbFZhbHVlID0gdmFsdWU7XG5cbiAgICAvLyBPbmx5IGJvdGhlciBmZXRjaGluZyBkZWZhdWx0IHZhbHVlIGlmIHdlJ3JlIGdvaW5nIHRvIHVzZSBpdFxuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICB2YXIgZGVmYXVsdFZhbHVlID0gcHJvcHMuZGVmYXVsdFZhbHVlO1xuICAgICAgLy8gVE9ETyAoeXVuZ3N0ZXJzKTogUmVtb3ZlIHN1cHBvcnQgZm9yIGNoaWxkcmVuIGNvbnRlbnQgaW4gPHRleHRhcmVhPi5cbiAgICAgIHZhciBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuO1xuICAgICAgaWYgKGNoaWxkcmVuICE9IG51bGwpIHtcbiAgICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVXNlIHRoZSBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIHByb3BzIGluc3RlYWQgb2Ygc2V0dGluZyAnICsgJ2NoaWxkcmVuIG9uIDx0ZXh0YXJlYT4uJykgOiB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgICAgIShkZWZhdWx0VmFsdWUgPT0gbnVsbCkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0lmIHlvdSBzdXBwbHkgYGRlZmF1bHRWYWx1ZWAgb24gYSA8dGV4dGFyZWE+LCBkbyBub3QgcGFzcyBjaGlsZHJlbi4nKSA6IF9wcm9kSW52YXJpYW50KCc5MicpIDogdm9pZCAwO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgICAhKGNoaWxkcmVuLmxlbmd0aCA8PSAxKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnPHRleHRhcmVhPiBjYW4gb25seSBoYXZlIGF0IG1vc3Qgb25lIGNoaWxkLicpIDogX3Byb2RJbnZhcmlhbnQoJzkzJykgOiB2b2lkIDA7XG4gICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlblswXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9ICcnICsgY2hpbGRyZW47XG4gICAgICB9XG4gICAgICBpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gJyc7XG4gICAgICB9XG4gICAgICBpbml0aWFsVmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuXG4gICAgaW5zdC5fd3JhcHBlclN0YXRlID0ge1xuICAgICAgaW5pdGlhbFZhbHVlOiAnJyArIGluaXRpYWxWYWx1ZSxcbiAgICAgIGxpc3RlbmVyczogbnVsbCxcbiAgICAgIG9uQ2hhbmdlOiBfaGFuZGxlQ2hhbmdlLmJpbmQoaW5zdClcbiAgICB9O1xuICB9LFxuXG4gIHVwZGF0ZVdyYXBwZXI6IGZ1bmN0aW9uIChpbnN0KSB7XG4gICAgdmFyIHByb3BzID0gaW5zdC5fY3VycmVudEVsZW1lbnQucHJvcHM7XG5cbiAgICB2YXIgbm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO1xuICAgIHZhciB2YWx1ZSA9IExpbmtlZFZhbHVlVXRpbHMuZ2V0VmFsdWUocHJvcHMpO1xuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAvLyBDYXN0IGB2YWx1ZWAgdG8gYSBzdHJpbmcgdG8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBzZXQgY29ycmVjdGx5LiBXaGlsZVxuICAgICAgLy8gYnJvd3NlcnMgdHlwaWNhbGx5IGRvIHRoaXMgYXMgbmVjZXNzYXJ5LCBqc2RvbSBkb2Vzbid0LlxuICAgICAgdmFyIG5ld1ZhbHVlID0gJycgKyB2YWx1ZTtcblxuICAgICAgLy8gVG8gYXZvaWQgc2lkZSBlZmZlY3RzIChzdWNoIGFzIGxvc2luZyB0ZXh0IHNlbGVjdGlvbiksIG9ubHkgc2V0IHZhbHVlIGlmIGNoYW5nZWRcbiAgICAgIGlmIChuZXdWYWx1ZSAhPT0gbm9kZS52YWx1ZSkge1xuICAgICAgICBub2RlLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlID09IG51bGwpIHtcbiAgICAgICAgbm9kZS5kZWZhdWx0VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHByb3BzLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7XG4gICAgICBub2RlLmRlZmF1bHRWYWx1ZSA9IHByb3BzLmRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gIH0sXG5cbiAgcG9zdE1vdW50V3JhcHBlcjogZnVuY3Rpb24gKGluc3QpIHtcbiAgICAvLyBUaGlzIGlzIGluIHBvc3RNb3VudCBiZWNhdXNlIHdlIG5lZWQgYWNjZXNzIHRvIHRoZSBET00gbm9kZSwgd2hpY2ggaXMgbm90XG4gICAgLy8gYXZhaWxhYmxlIHVudGlsIGFmdGVyIHRoZSBjb21wb25lbnQgaGFzIG1vdW50ZWQuXG4gICAgdmFyIG5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtcbiAgICB2YXIgdGV4dENvbnRlbnQgPSBub2RlLnRleHRDb250ZW50O1xuXG4gICAgLy8gT25seSBzZXQgbm9kZS52YWx1ZSBpZiB0ZXh0Q29udGVudCBpcyBlcXVhbCB0byB0aGUgZXhwZWN0ZWRcbiAgICAvLyBpbml0aWFsIHZhbHVlLiBJbiBJRTEwL0lFMTEgdGhlcmUgaXMgYSBidWcgd2hlcmUgdGhlIHBsYWNlaG9sZGVyIGF0dHJpYnV0ZVxuICAgIC8vIHdpbGwgcG9wdWxhdGUgdGV4dENvbnRlbnQgYXMgd2VsbC5cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy8xMDE1MjUvXG4gICAgaWYgKHRleHRDb250ZW50ID09PSBpbnN0Ll93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlKSB7XG4gICAgICBub2RlLnZhbHVlID0gdGV4dENvbnRlbnQ7XG4gICAgfVxuICB9XG59O1xuXG5mdW5jdGlvbiBfaGFuZGxlQ2hhbmdlKGV2ZW50KSB7XG4gIHZhciBwcm9wcyA9IHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzO1xuICB2YXIgcmV0dXJuVmFsdWUgPSBMaW5rZWRWYWx1ZVV0aWxzLmV4ZWN1dGVPbkNoYW5nZShwcm9wcywgZXZlbnQpO1xuICBSZWFjdFVwZGF0ZXMuYXNhcChmb3JjZVVwZGF0ZUlmTW91bnRlZCwgdGhpcyk7XG4gIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdERPTVRleHRhcmVhOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxvd2VzdCBjb21tb24gYW5jZXN0b3Igb2YgQSBhbmQgQiwgb3IgbnVsbCBpZiB0aGV5IGFyZSBpblxuICogZGlmZmVyZW50IHRyZWVzLlxuICovXG5mdW5jdGlvbiBnZXRMb3dlc3RDb21tb25BbmNlc3RvcihpbnN0QSwgaW5zdEIpIHtcbiAgISgnX2hvc3ROb2RlJyBpbiBpbnN0QSkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2dldE5vZGVGcm9tSW5zdGFuY2U6IEludmFsaWQgYXJndW1lbnQuJykgOiBfcHJvZEludmFyaWFudCgnMzMnKSA6IHZvaWQgMDtcbiAgISgnX2hvc3ROb2RlJyBpbiBpbnN0QikgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2dldE5vZGVGcm9tSW5zdGFuY2U6IEludmFsaWQgYXJndW1lbnQuJykgOiBfcHJvZEludmFyaWFudCgnMzMnKSA6IHZvaWQgMDtcblxuICB2YXIgZGVwdGhBID0gMDtcbiAgZm9yICh2YXIgdGVtcEEgPSBpbnN0QTsgdGVtcEE7IHRlbXBBID0gdGVtcEEuX2hvc3RQYXJlbnQpIHtcbiAgICBkZXB0aEErKztcbiAgfVxuICB2YXIgZGVwdGhCID0gMDtcbiAgZm9yICh2YXIgdGVtcEIgPSBpbnN0QjsgdGVtcEI7IHRlbXBCID0gdGVtcEIuX2hvc3RQYXJlbnQpIHtcbiAgICBkZXB0aEIrKztcbiAgfVxuXG4gIC8vIElmIEEgaXMgZGVlcGVyLCBjcmF3bCB1cC5cbiAgd2hpbGUgKGRlcHRoQSAtIGRlcHRoQiA+IDApIHtcbiAgICBpbnN0QSA9IGluc3RBLl9ob3N0UGFyZW50O1xuICAgIGRlcHRoQS0tO1xuICB9XG5cbiAgLy8gSWYgQiBpcyBkZWVwZXIsIGNyYXdsIHVwLlxuICB3aGlsZSAoZGVwdGhCIC0gZGVwdGhBID4gMCkge1xuICAgIGluc3RCID0gaW5zdEIuX2hvc3RQYXJlbnQ7XG4gICAgZGVwdGhCLS07XG4gIH1cblxuICAvLyBXYWxrIGluIGxvY2tzdGVwIHVudGlsIHdlIGZpbmQgYSBtYXRjaC5cbiAgdmFyIGRlcHRoID0gZGVwdGhBO1xuICB3aGlsZSAoZGVwdGgtLSkge1xuICAgIGlmIChpbnN0QSA9PT0gaW5zdEIpIHtcbiAgICAgIHJldHVybiBpbnN0QTtcbiAgICB9XG4gICAgaW5zdEEgPSBpbnN0QS5faG9zdFBhcmVudDtcbiAgICBpbnN0QiA9IGluc3RCLl9ob3N0UGFyZW50O1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFJldHVybiBpZiBBIGlzIGFuIGFuY2VzdG9yIG9mIEIuXG4gKi9cbmZ1bmN0aW9uIGlzQW5jZXN0b3IoaW5zdEEsIGluc3RCKSB7XG4gICEoJ19ob3N0Tm9kZScgaW4gaW5zdEEpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdpc0FuY2VzdG9yOiBJbnZhbGlkIGFyZ3VtZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzM1JykgOiB2b2lkIDA7XG4gICEoJ19ob3N0Tm9kZScgaW4gaW5zdEIpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdpc0FuY2VzdG9yOiBJbnZhbGlkIGFyZ3VtZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzM1JykgOiB2b2lkIDA7XG5cbiAgd2hpbGUgKGluc3RCKSB7XG4gICAgaWYgKGluc3RCID09PSBpbnN0QSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGluc3RCID0gaW5zdEIuX2hvc3RQYXJlbnQ7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgcGFyZW50IGluc3RhbmNlIG9mIHRoZSBwYXNzZWQtaW4gaW5zdGFuY2UuXG4gKi9cbmZ1bmN0aW9uIGdldFBhcmVudEluc3RhbmNlKGluc3QpIHtcbiAgISgnX2hvc3ROb2RlJyBpbiBpbnN0KSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnZ2V0UGFyZW50SW5zdGFuY2U6IEludmFsaWQgYXJndW1lbnQuJykgOiBfcHJvZEludmFyaWFudCgnMzYnKSA6IHZvaWQgMDtcblxuICByZXR1cm4gaW5zdC5faG9zdFBhcmVudDtcbn1cblxuLyoqXG4gKiBTaW11bGF0ZXMgdGhlIHRyYXZlcnNhbCBvZiBhIHR3by1waGFzZSwgY2FwdHVyZS9idWJibGUgZXZlbnQgZGlzcGF0Y2guXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlVHdvUGhhc2UoaW5zdCwgZm4sIGFyZykge1xuICB2YXIgcGF0aCA9IFtdO1xuICB3aGlsZSAoaW5zdCkge1xuICAgIHBhdGgucHVzaChpbnN0KTtcbiAgICBpbnN0ID0gaW5zdC5faG9zdFBhcmVudDtcbiAgfVxuICB2YXIgaTtcbiAgZm9yIChpID0gcGF0aC5sZW5ndGg7IGktLSA+IDA7KSB7XG4gICAgZm4ocGF0aFtpXSwgJ2NhcHR1cmVkJywgYXJnKTtcbiAgfVxuICBmb3IgKGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgIGZuKHBhdGhbaV0sICdidWJibGVkJywgYXJnKTtcbiAgfVxufVxuXG4vKipcbiAqIFRyYXZlcnNlcyB0aGUgSUQgaGllcmFyY2h5IGFuZCBpbnZva2VzIHRoZSBzdXBwbGllZCBgY2JgIG9uIGFueSBJRHMgdGhhdFxuICogc2hvdWxkIHdvdWxkIHJlY2VpdmUgYSBgbW91c2VFbnRlcmAgb3IgYG1vdXNlTGVhdmVgIGV2ZW50LlxuICpcbiAqIERvZXMgbm90IGludm9rZSB0aGUgY2FsbGJhY2sgb24gdGhlIG5lYXJlc3QgY29tbW9uIGFuY2VzdG9yIGJlY2F1c2Ugbm90aGluZ1xuICogXCJlbnRlcmVkXCIgb3IgXCJsZWZ0XCIgdGhhdCBlbGVtZW50LlxuICovXG5mdW5jdGlvbiB0cmF2ZXJzZUVudGVyTGVhdmUoZnJvbSwgdG8sIGZuLCBhcmdGcm9tLCBhcmdUbykge1xuICB2YXIgY29tbW9uID0gZnJvbSAmJiB0byA/IGdldExvd2VzdENvbW1vbkFuY2VzdG9yKGZyb20sIHRvKSA6IG51bGw7XG4gIHZhciBwYXRoRnJvbSA9IFtdO1xuICB3aGlsZSAoZnJvbSAmJiBmcm9tICE9PSBjb21tb24pIHtcbiAgICBwYXRoRnJvbS5wdXNoKGZyb20pO1xuICAgIGZyb20gPSBmcm9tLl9ob3N0UGFyZW50O1xuICB9XG4gIHZhciBwYXRoVG8gPSBbXTtcbiAgd2hpbGUgKHRvICYmIHRvICE9PSBjb21tb24pIHtcbiAgICBwYXRoVG8ucHVzaCh0byk7XG4gICAgdG8gPSB0by5faG9zdFBhcmVudDtcbiAgfVxuICB2YXIgaTtcbiAgZm9yIChpID0gMDsgaSA8IHBhdGhGcm9tLmxlbmd0aDsgaSsrKSB7XG4gICAgZm4ocGF0aEZyb21baV0sICdidWJibGVkJywgYXJnRnJvbSk7XG4gIH1cbiAgZm9yIChpID0gcGF0aFRvLmxlbmd0aDsgaS0tID4gMDspIHtcbiAgICBmbihwYXRoVG9baV0sICdjYXB0dXJlZCcsIGFyZ1RvKTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgaXNBbmNlc3RvcjogaXNBbmNlc3RvcixcbiAgZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3I6IGdldExvd2VzdENvbW1vbkFuY2VzdG9yLFxuICBnZXRQYXJlbnRJbnN0YW5jZTogZ2V0UGFyZW50SW5zdGFuY2UsXG4gIHRyYXZlcnNlVHdvUGhhc2U6IHRyYXZlcnNlVHdvUGhhc2UsXG4gIHRyYXZlcnNlRW50ZXJMZWF2ZTogdHJhdmVyc2VFbnRlckxlYXZlXG59OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBET01Qcm9wZXJ0eSA9IHJlcXVpcmUoJy4vRE9NUHJvcGVydHknKTtcbnZhciBFdmVudFBsdWdpblJlZ2lzdHJ5ID0gcmVxdWlyZSgnLi9FdmVudFBsdWdpblJlZ2lzdHJ5Jyk7XG52YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIHJlYWN0UHJvcHMgPSB7XG4gICAgY2hpbGRyZW46IHRydWUsXG4gICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHRydWUsXG4gICAga2V5OiB0cnVlLFxuICAgIHJlZjogdHJ1ZSxcblxuICAgIGF1dG9Gb2N1czogdHJ1ZSxcbiAgICBkZWZhdWx0VmFsdWU6IHRydWUsXG4gICAgdmFsdWVMaW5rOiB0cnVlLFxuICAgIGRlZmF1bHRDaGVja2VkOiB0cnVlLFxuICAgIGNoZWNrZWRMaW5rOiB0cnVlLFxuICAgIGlubmVySFRNTDogdHJ1ZSxcbiAgICBzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmc6IHRydWUsXG4gICAgb25Gb2N1c0luOiB0cnVlLFxuICAgIG9uRm9jdXNPdXQ6IHRydWVcbiAgfTtcbiAgdmFyIHdhcm5lZFByb3BlcnRpZXMgPSB7fTtcblxuICB2YXIgdmFsaWRhdGVQcm9wZXJ0eSA9IGZ1bmN0aW9uICh0YWdOYW1lLCBuYW1lLCBkZWJ1Z0lEKSB7XG4gICAgaWYgKERPTVByb3BlcnR5LnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgfHwgRE9NUHJvcGVydHkuaXNDdXN0b21BdHRyaWJ1dGUobmFtZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAocmVhY3RQcm9wcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiByZWFjdFByb3BzW25hbWVdIHx8IHdhcm5lZFByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkobmFtZSkgJiYgd2FybmVkUHJvcGVydGllc1tuYW1lXSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChFdmVudFBsdWdpblJlZ2lzdHJ5LnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgd2FybmVkUHJvcGVydGllc1tuYW1lXSA9IHRydWU7XG4gICAgdmFyIGxvd2VyQ2FzZWROYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gZGF0YS0qIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxvd2VyY2FzZTsgc3VnZ2VzdCB0aGUgbG93ZXJjYXNlIHZlcnNpb25cbiAgICB2YXIgc3RhbmRhcmROYW1lID0gRE9NUHJvcGVydHkuaXNDdXN0b21BdHRyaWJ1dGUobG93ZXJDYXNlZE5hbWUpID8gbG93ZXJDYXNlZE5hbWUgOiBET01Qcm9wZXJ0eS5nZXRQb3NzaWJsZVN0YW5kYXJkTmFtZS5oYXNPd25Qcm9wZXJ0eShsb3dlckNhc2VkTmFtZSkgPyBET01Qcm9wZXJ0eS5nZXRQb3NzaWJsZVN0YW5kYXJkTmFtZVtsb3dlckNhc2VkTmFtZV0gOiBudWxsO1xuXG4gICAgdmFyIHJlZ2lzdHJhdGlvbk5hbWUgPSBFdmVudFBsdWdpblJlZ2lzdHJ5LnBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXMuaGFzT3duUHJvcGVydHkobG93ZXJDYXNlZE5hbWUpID8gRXZlbnRQbHVnaW5SZWdpc3RyeS5wb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzW2xvd2VyQ2FzZWROYW1lXSA6IG51bGw7XG5cbiAgICBpZiAoc3RhbmRhcmROYW1lICE9IG51bGwpIHtcbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1Vua25vd24gRE9NIHByb3BlcnR5ICVzLiBEaWQgeW91IG1lYW4gJXM/JXMnLCBuYW1lLCBzdGFuZGFyZE5hbWUsIFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoZGVidWdJRCkpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmIChyZWdpc3RyYXRpb25OYW1lICE9IG51bGwpIHtcbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1Vua25vd24gZXZlbnQgaGFuZGxlciBwcm9wZXJ0eSAlcy4gRGlkIHlvdSBtZWFuIGAlc2A/JXMnLCBuYW1lLCByZWdpc3RyYXRpb25OYW1lLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpKSA6IHZvaWQgMDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSB3ZXJlIHVuYWJsZSB0byBndWVzcyB3aGljaCBwcm9wIHRoZSB1c2VyIGludGVuZGVkLlxuICAgICAgLy8gSXQgaXMgbGlrZWx5IHRoYXQgdGhlIHVzZXIgd2FzIGp1c3QgYmxpbmRseSBzcHJlYWRpbmcvZm9yd2FyZGluZyBwcm9wc1xuICAgICAgLy8gQ29tcG9uZW50cyBzaG91bGQgYmUgY2FyZWZ1bCB0byBvbmx5IHJlbmRlciB2YWxpZCBwcm9wcy9hdHRyaWJ1dGVzLlxuICAgICAgLy8gV2FybmluZyB3aWxsIGJlIGludm9rZWQgaW4gd2FyblVua25vd25Qcm9wZXJ0aWVzIHRvIGFsbG93IGdyb3VwaW5nLlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfTtcbn1cblxudmFyIHdhcm5Vbmtub3duUHJvcGVydGllcyA9IGZ1bmN0aW9uIChkZWJ1Z0lELCBlbGVtZW50KSB7XG4gIHZhciB1bmtub3duUHJvcHMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIGVsZW1lbnQucHJvcHMpIHtcbiAgICB2YXIgaXNWYWxpZCA9IHZhbGlkYXRlUHJvcGVydHkoZWxlbWVudC50eXBlLCBrZXksIGRlYnVnSUQpO1xuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdW5rbm93blByb3BzLnB1c2goa2V5KTtcbiAgICB9XG4gIH1cblxuICB2YXIgdW5rbm93blByb3BTdHJpbmcgPSB1bmtub3duUHJvcHMubWFwKGZ1bmN0aW9uIChwcm9wKSB7XG4gICAgcmV0dXJuICdgJyArIHByb3AgKyAnYCc7XG4gIH0pLmpvaW4oJywgJyk7XG5cbiAgaWYgKHVua25vd25Qcm9wcy5sZW5ndGggPT09IDEpIHtcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdVbmtub3duIHByb3AgJXMgb24gPCVzPiB0YWcuIFJlbW92ZSB0aGlzIHByb3AgZnJvbSB0aGUgZWxlbWVudC4gJyArICdGb3IgZGV0YWlscywgc2VlIGh0dHBzOi8vZmIubWUvcmVhY3QtdW5rbm93bi1wcm9wJXMnLCB1bmtub3duUHJvcFN0cmluZywgZWxlbWVudC50eXBlLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpKSA6IHZvaWQgMDtcbiAgfSBlbHNlIGlmICh1bmtub3duUHJvcHMubGVuZ3RoID4gMSkge1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1Vua25vd24gcHJvcHMgJXMgb24gPCVzPiB0YWcuIFJlbW92ZSB0aGVzZSBwcm9wcyBmcm9tIHRoZSBlbGVtZW50LiAnICsgJ0ZvciBkZXRhaWxzLCBzZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC11bmtub3duLXByb3AlcycsIHVua25vd25Qcm9wU3RyaW5nLCBlbGVtZW50LnR5cGUsIFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoZGVidWdJRCkpIDogdm9pZCAwO1xuICB9XG59O1xuXG5mdW5jdGlvbiBoYW5kbGVFbGVtZW50KGRlYnVnSUQsIGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCB0eXBlb2YgZWxlbWVudC50eXBlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZWxlbWVudC50eXBlLmluZGV4T2YoJy0nKSA+PSAwIHx8IGVsZW1lbnQucHJvcHMuaXMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgd2FyblVua25vd25Qcm9wZXJ0aWVzKGRlYnVnSUQsIGVsZW1lbnQpO1xufVxuXG52YXIgUmVhY3RET01Vbmtub3duUHJvcGVydHlIb29rID0ge1xuICBvbkJlZm9yZU1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCkge1xuICAgIGhhbmRsZUVsZW1lbnQoZGVidWdJRCwgZWxlbWVudCk7XG4gIH0sXG4gIG9uQmVmb3JlVXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCkge1xuICAgIGhhbmRsZUVsZW1lbnQoZGVidWdJRCwgZWxlbWVudCk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RET01Vbmtub3duUHJvcGVydHlIb29rOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTYtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0SW52YWxpZFNldFN0YXRlV2FybmluZ0hvb2sgPSByZXF1aXJlKCcuL1JlYWN0SW52YWxpZFNldFN0YXRlV2FybmluZ0hvb2snKTtcbnZhciBSZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vayA9IHJlcXVpcmUoJy4vUmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2snKTtcbnZhciBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbnZhciBwZXJmb3JtYW5jZU5vdyA9IHJlcXVpcmUoJ2ZianMvbGliL3BlcmZvcm1hbmNlTm93Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIGhvb2tzID0gW107XG52YXIgZGlkSG9va1Rocm93Rm9yRXZlbnQgPSB7fTtcblxuZnVuY3Rpb24gY2FsbEhvb2soZXZlbnQsIGZuLCBjb250ZXh0LCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KSB7XG4gIHRyeSB7XG4gICAgZm4uY2FsbChjb250ZXh0LCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhkaWRIb29rVGhyb3dGb3JFdmVudFtldmVudF0sICdFeGNlcHRpb24gdGhyb3duIGJ5IGhvb2sgd2hpbGUgaGFuZGxpbmcgJXM6ICVzJywgZXZlbnQsIGUgKyAnXFxuJyArIGUuc3RhY2spIDogdm9pZCAwO1xuICAgIGRpZEhvb2tUaHJvd0ZvckV2ZW50W2V2ZW50XSA9IHRydWU7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdEV2ZW50KGV2ZW50LCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaG9va3MubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaG9vayA9IGhvb2tzW2ldO1xuICAgIHZhciBmbiA9IGhvb2tbZXZlbnRdO1xuICAgIGlmIChmbikge1xuICAgICAgY2FsbEhvb2soZXZlbnQsIGZuLCBob29rLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTtcbiAgICB9XG4gIH1cbn1cblxudmFyIGlzUHJvZmlsaW5nID0gZmFsc2U7XG52YXIgZmx1c2hIaXN0b3J5ID0gW107XG52YXIgbGlmZUN5Y2xlVGltZXJTdGFjayA9IFtdO1xudmFyIGN1cnJlbnRGbHVzaE5lc3RpbmcgPSAwO1xudmFyIGN1cnJlbnRGbHVzaE1lYXN1cmVtZW50cyA9IFtdO1xudmFyIGN1cnJlbnRGbHVzaFN0YXJ0VGltZSA9IDA7XG52YXIgY3VycmVudFRpbWVyRGVidWdJRCA9IG51bGw7XG52YXIgY3VycmVudFRpbWVyU3RhcnRUaW1lID0gMDtcbnZhciBjdXJyZW50VGltZXJOZXN0ZWRGbHVzaER1cmF0aW9uID0gMDtcbnZhciBjdXJyZW50VGltZXJUeXBlID0gbnVsbDtcblxudmFyIGxpZmVDeWNsZVRpbWVySGFzV2FybmVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGNsZWFySGlzdG9yeSgpIHtcbiAgUmVhY3RDb21wb25lbnRUcmVlSG9vay5wdXJnZVVubW91bnRlZENvbXBvbmVudHMoKTtcbiAgUmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2suY2xlYXJIaXN0b3J5KCk7XG59XG5cbmZ1bmN0aW9uIGdldFRyZWVTbmFwc2hvdChyZWdpc3RlcmVkSURzKSB7XG4gIHJldHVybiByZWdpc3RlcmVkSURzLnJlZHVjZShmdW5jdGlvbiAodHJlZSwgaWQpIHtcbiAgICB2YXIgb3duZXJJRCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0T3duZXJJRChpZCk7XG4gICAgdmFyIHBhcmVudElEID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRQYXJlbnRJRChpZCk7XG4gICAgdHJlZVtpZF0gPSB7XG4gICAgICBkaXNwbGF5TmFtZTogUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXREaXNwbGF5TmFtZShpZCksXG4gICAgICB0ZXh0OiBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFRleHQoaWQpLFxuICAgICAgdXBkYXRlQ291bnQ6IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0VXBkYXRlQ291bnQoaWQpLFxuICAgICAgY2hpbGRJRHM6IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0Q2hpbGRJRHMoaWQpLFxuICAgICAgLy8gVGV4dCBub2RlcyBkb24ndCBoYXZlIG93bmVycyBidXQgdGhpcyBpcyBjbG9zZSBlbm91Z2guXG4gICAgICBvd25lcklEOiBvd25lcklEIHx8IHBhcmVudElEICYmIFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0T3duZXJJRChwYXJlbnRJRCkgfHwgMCxcbiAgICAgIHBhcmVudElEOiBwYXJlbnRJRFxuICAgIH07XG4gICAgcmV0dXJuIHRyZWU7XG4gIH0sIHt9KTtcbn1cblxuZnVuY3Rpb24gcmVzZXRNZWFzdXJlbWVudHMoKSB7XG4gIHZhciBwcmV2aW91c1N0YXJ0VGltZSA9IGN1cnJlbnRGbHVzaFN0YXJ0VGltZTtcbiAgdmFyIHByZXZpb3VzTWVhc3VyZW1lbnRzID0gY3VycmVudEZsdXNoTWVhc3VyZW1lbnRzO1xuICB2YXIgcHJldmlvdXNPcGVyYXRpb25zID0gUmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2suZ2V0SGlzdG9yeSgpO1xuXG4gIGlmIChjdXJyZW50Rmx1c2hOZXN0aW5nID09PSAwKSB7XG4gICAgY3VycmVudEZsdXNoU3RhcnRUaW1lID0gMDtcbiAgICBjdXJyZW50Rmx1c2hNZWFzdXJlbWVudHMgPSBbXTtcbiAgICBjbGVhckhpc3RvcnkoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocHJldmlvdXNNZWFzdXJlbWVudHMubGVuZ3RoIHx8IHByZXZpb3VzT3BlcmF0aW9ucy5sZW5ndGgpIHtcbiAgICB2YXIgcmVnaXN0ZXJlZElEcyA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0UmVnaXN0ZXJlZElEcygpO1xuICAgIGZsdXNoSGlzdG9yeS5wdXNoKHtcbiAgICAgIGR1cmF0aW9uOiBwZXJmb3JtYW5jZU5vdygpIC0gcHJldmlvdXNTdGFydFRpbWUsXG4gICAgICBtZWFzdXJlbWVudHM6IHByZXZpb3VzTWVhc3VyZW1lbnRzIHx8IFtdLFxuICAgICAgb3BlcmF0aW9uczogcHJldmlvdXNPcGVyYXRpb25zIHx8IFtdLFxuICAgICAgdHJlZVNuYXBzaG90OiBnZXRUcmVlU25hcHNob3QocmVnaXN0ZXJlZElEcylcbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFySGlzdG9yeSgpO1xuICBjdXJyZW50Rmx1c2hTdGFydFRpbWUgPSBwZXJmb3JtYW5jZU5vdygpO1xuICBjdXJyZW50Rmx1c2hNZWFzdXJlbWVudHMgPSBbXTtcbn1cblxuZnVuY3Rpb24gY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpIHtcbiAgdmFyIGFsbG93Um9vdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgaWYgKGFsbG93Um9vdCAmJiBkZWJ1Z0lEID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghZGVidWdJRCkge1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1JlYWN0RGVidWdUb29sOiBkZWJ1Z0lEIG1heSBub3QgYmUgZW1wdHkuJykgOiB2b2lkIDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gYmVnaW5MaWZlQ3ljbGVUaW1lcihkZWJ1Z0lELCB0aW1lclR5cGUpIHtcbiAgaWYgKGN1cnJlbnRGbHVzaE5lc3RpbmcgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGN1cnJlbnRUaW1lclR5cGUgJiYgIWxpZmVDeWNsZVRpbWVySGFzV2FybmVkKSB7XG4gICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnVGhlcmUgaXMgYW4gaW50ZXJuYWwgZXJyb3IgaW4gdGhlIFJlYWN0IHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IGNvZGUuICcgKyAnRGlkIG5vdCBleHBlY3QgJXMgdGltZXIgdG8gc3RhcnQgd2hpbGUgJXMgdGltZXIgaXMgc3RpbGwgaW4gJyArICdwcm9ncmVzcyBmb3IgJXMgaW5zdGFuY2UuJywgdGltZXJUeXBlLCBjdXJyZW50VGltZXJUeXBlIHx8ICdubycsIGRlYnVnSUQgPT09IGN1cnJlbnRUaW1lckRlYnVnSUQgPyAndGhlIHNhbWUnIDogJ2Fub3RoZXInKSA6IHZvaWQgMDtcbiAgICBsaWZlQ3ljbGVUaW1lckhhc1dhcm5lZCA9IHRydWU7XG4gIH1cbiAgY3VycmVudFRpbWVyU3RhcnRUaW1lID0gcGVyZm9ybWFuY2VOb3coKTtcbiAgY3VycmVudFRpbWVyTmVzdGVkRmx1c2hEdXJhdGlvbiA9IDA7XG4gIGN1cnJlbnRUaW1lckRlYnVnSUQgPSBkZWJ1Z0lEO1xuICBjdXJyZW50VGltZXJUeXBlID0gdGltZXJUeXBlO1xufVxuXG5mdW5jdGlvbiBlbmRMaWZlQ3ljbGVUaW1lcihkZWJ1Z0lELCB0aW1lclR5cGUpIHtcbiAgaWYgKGN1cnJlbnRGbHVzaE5lc3RpbmcgPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGN1cnJlbnRUaW1lclR5cGUgIT09IHRpbWVyVHlwZSAmJiAhbGlmZUN5Y2xlVGltZXJIYXNXYXJuZWQpIHtcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdUaGVyZSBpcyBhbiBpbnRlcm5hbCBlcnJvciBpbiB0aGUgUmVhY3QgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQgY29kZS4gJyArICdXZSBkaWQgbm90IGV4cGVjdCAlcyB0aW1lciB0byBzdG9wIHdoaWxlICVzIHRpbWVyIGlzIHN0aWxsIGluICcgKyAncHJvZ3Jlc3MgZm9yICVzIGluc3RhbmNlLiBQbGVhc2UgcmVwb3J0IHRoaXMgYXMgYSBidWcgaW4gUmVhY3QuJywgdGltZXJUeXBlLCBjdXJyZW50VGltZXJUeXBlIHx8ICdubycsIGRlYnVnSUQgPT09IGN1cnJlbnRUaW1lckRlYnVnSUQgPyAndGhlIHNhbWUnIDogJ2Fub3RoZXInKSA6IHZvaWQgMDtcbiAgICBsaWZlQ3ljbGVUaW1lckhhc1dhcm5lZCA9IHRydWU7XG4gIH1cbiAgaWYgKGlzUHJvZmlsaW5nKSB7XG4gICAgY3VycmVudEZsdXNoTWVhc3VyZW1lbnRzLnB1c2goe1xuICAgICAgdGltZXJUeXBlOiB0aW1lclR5cGUsXG4gICAgICBpbnN0YW5jZUlEOiBkZWJ1Z0lELFxuICAgICAgZHVyYXRpb246IHBlcmZvcm1hbmNlTm93KCkgLSBjdXJyZW50VGltZXJTdGFydFRpbWUgLSBjdXJyZW50VGltZXJOZXN0ZWRGbHVzaER1cmF0aW9uXG4gICAgfSk7XG4gIH1cbiAgY3VycmVudFRpbWVyU3RhcnRUaW1lID0gMDtcbiAgY3VycmVudFRpbWVyTmVzdGVkRmx1c2hEdXJhdGlvbiA9IDA7XG4gIGN1cnJlbnRUaW1lckRlYnVnSUQgPSBudWxsO1xuICBjdXJyZW50VGltZXJUeXBlID0gbnVsbDtcbn1cblxuZnVuY3Rpb24gcGF1c2VDdXJyZW50TGlmZUN5Y2xlVGltZXIoKSB7XG4gIHZhciBjdXJyZW50VGltZXIgPSB7XG4gICAgc3RhcnRUaW1lOiBjdXJyZW50VGltZXJTdGFydFRpbWUsXG4gICAgbmVzdGVkRmx1c2hTdGFydFRpbWU6IHBlcmZvcm1hbmNlTm93KCksXG4gICAgZGVidWdJRDogY3VycmVudFRpbWVyRGVidWdJRCxcbiAgICB0aW1lclR5cGU6IGN1cnJlbnRUaW1lclR5cGVcbiAgfTtcbiAgbGlmZUN5Y2xlVGltZXJTdGFjay5wdXNoKGN1cnJlbnRUaW1lcik7XG4gIGN1cnJlbnRUaW1lclN0YXJ0VGltZSA9IDA7XG4gIGN1cnJlbnRUaW1lck5lc3RlZEZsdXNoRHVyYXRpb24gPSAwO1xuICBjdXJyZW50VGltZXJEZWJ1Z0lEID0gbnVsbDtcbiAgY3VycmVudFRpbWVyVHlwZSA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlc3VtZUN1cnJlbnRMaWZlQ3ljbGVUaW1lcigpIHtcbiAgdmFyIF9saWZlQ3ljbGVUaW1lclN0YWNrJCA9IGxpZmVDeWNsZVRpbWVyU3RhY2sucG9wKCksXG4gICAgICBzdGFydFRpbWUgPSBfbGlmZUN5Y2xlVGltZXJTdGFjayQuc3RhcnRUaW1lLFxuICAgICAgbmVzdGVkRmx1c2hTdGFydFRpbWUgPSBfbGlmZUN5Y2xlVGltZXJTdGFjayQubmVzdGVkRmx1c2hTdGFydFRpbWUsXG4gICAgICBkZWJ1Z0lEID0gX2xpZmVDeWNsZVRpbWVyU3RhY2skLmRlYnVnSUQsXG4gICAgICB0aW1lclR5cGUgPSBfbGlmZUN5Y2xlVGltZXJTdGFjayQudGltZXJUeXBlO1xuXG4gIHZhciBuZXN0ZWRGbHVzaER1cmF0aW9uID0gcGVyZm9ybWFuY2VOb3coKSAtIG5lc3RlZEZsdXNoU3RhcnRUaW1lO1xuICBjdXJyZW50VGltZXJTdGFydFRpbWUgPSBzdGFydFRpbWU7XG4gIGN1cnJlbnRUaW1lck5lc3RlZEZsdXNoRHVyYXRpb24gKz0gbmVzdGVkRmx1c2hEdXJhdGlvbjtcbiAgY3VycmVudFRpbWVyRGVidWdJRCA9IGRlYnVnSUQ7XG4gIGN1cnJlbnRUaW1lclR5cGUgPSB0aW1lclR5cGU7XG59XG5cbnZhciBsYXN0TWFya1RpbWVTdGFtcCA9IDA7XG52YXIgY2FuVXNlUGVyZm9ybWFuY2VNZWFzdXJlID0gdHlwZW9mIHBlcmZvcm1hbmNlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UubWFyayA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UuY2xlYXJNYXJrcyA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UubWVhc3VyZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgcGVyZm9ybWFuY2UuY2xlYXJNZWFzdXJlcyA9PT0gJ2Z1bmN0aW9uJztcblxuZnVuY3Rpb24gc2hvdWxkTWFyayhkZWJ1Z0lEKSB7XG4gIGlmICghaXNQcm9maWxpbmcgfHwgIWNhblVzZVBlcmZvcm1hbmNlTWVhc3VyZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgZWxlbWVudCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RWxlbWVudChkZWJ1Z0lEKTtcbiAgaWYgKGVsZW1lbnQgPT0gbnVsbCB8fCB0eXBlb2YgZWxlbWVudCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGlzSG9zdEVsZW1lbnQgPSB0eXBlb2YgZWxlbWVudC50eXBlID09PSAnc3RyaW5nJztcbiAgaWYgKGlzSG9zdEVsZW1lbnQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIG1hcmtCZWdpbihkZWJ1Z0lELCBtYXJrVHlwZSkge1xuICBpZiAoIXNob3VsZE1hcmsoZGVidWdJRCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbWFya05hbWUgPSBkZWJ1Z0lEICsgJzo6JyArIG1hcmtUeXBlO1xuICBsYXN0TWFya1RpbWVTdGFtcCA9IHBlcmZvcm1hbmNlTm93KCk7XG4gIHBlcmZvcm1hbmNlLm1hcmsobWFya05hbWUpO1xufVxuXG5mdW5jdGlvbiBtYXJrRW5kKGRlYnVnSUQsIG1hcmtUeXBlKSB7XG4gIGlmICghc2hvdWxkTWFyayhkZWJ1Z0lEKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBtYXJrTmFtZSA9IGRlYnVnSUQgKyAnOjonICsgbWFya1R5cGU7XG4gIHZhciBkaXNwbGF5TmFtZSA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RGlzcGxheU5hbWUoZGVidWdJRCkgfHwgJ1Vua25vd24nO1xuXG4gIC8vIENocm9tZSBoYXMgYW4gaXNzdWUgb2YgZHJvcHBpbmcgbWFya2VycyByZWNvcmRlZCB0b28gZmFzdDpcbiAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NjQwNjUyXG4gIC8vIFRvIHdvcmsgYXJvdW5kIHRoaXMsIHdlIHdpbGwgbm90IHJlcG9ydCB2ZXJ5IHNtYWxsIG1lYXN1cmVtZW50cy5cbiAgLy8gSSBkZXRlcm1pbmVkIHRoZSBtYWdpYyBudW1iZXIgYnkgdHdlYWtpbmcgaXQgYmFjayBhbmQgZm9ydGguXG4gIC8vIDAuMDVtcyB3YXMgZW5vdWdoIHRvIHByZXZlbnQgdGhlIGlzc3VlLCBidXQgSSBzZXQgaXQgdG8gMC4xbXMgdG8gYmUgc2FmZS5cbiAgLy8gV2hlbiB0aGUgYnVnIGlzIGZpeGVkLCB3ZSBjYW4gYG1lYXN1cmUoKWAgdW5jb25kaXRpb25hbGx5IGlmIHdlIHdhbnQgdG8uXG4gIHZhciB0aW1lU3RhbXAgPSBwZXJmb3JtYW5jZU5vdygpO1xuICBpZiAodGltZVN0YW1wIC0gbGFzdE1hcmtUaW1lU3RhbXAgPiAwLjEpIHtcbiAgICB2YXIgbWVhc3VyZW1lbnROYW1lID0gZGlzcGxheU5hbWUgKyAnIFsnICsgbWFya1R5cGUgKyAnXSc7XG4gICAgcGVyZm9ybWFuY2UubWVhc3VyZShtZWFzdXJlbWVudE5hbWUsIG1hcmtOYW1lKTtcbiAgfVxuXG4gIHBlcmZvcm1hbmNlLmNsZWFyTWFya3MobWFya05hbWUpO1xuICBwZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKG1lYXN1cmVtZW50TmFtZSk7XG59XG5cbnZhciBSZWFjdERlYnVnVG9vbCA9IHtcbiAgYWRkSG9vazogZnVuY3Rpb24gKGhvb2spIHtcbiAgICBob29rcy5wdXNoKGhvb2spO1xuICB9LFxuICByZW1vdmVIb29rOiBmdW5jdGlvbiAoaG9vaykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaG9va3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChob29rc1tpXSA9PT0gaG9vaykge1xuICAgICAgICBob29rcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGktLTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGlzUHJvZmlsaW5nOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIGlzUHJvZmlsaW5nO1xuICB9LFxuICBiZWdpblByb2ZpbGluZzogZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc1Byb2ZpbGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlzUHJvZmlsaW5nID0gdHJ1ZTtcbiAgICBmbHVzaEhpc3RvcnkubGVuZ3RoID0gMDtcbiAgICByZXNldE1lYXN1cmVtZW50cygpO1xuICAgIFJlYWN0RGVidWdUb29sLmFkZEhvb2soUmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2spO1xuICB9LFxuICBlbmRQcm9maWxpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWlzUHJvZmlsaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaXNQcm9maWxpbmcgPSBmYWxzZTtcbiAgICByZXNldE1lYXN1cmVtZW50cygpO1xuICAgIFJlYWN0RGVidWdUb29sLnJlbW92ZUhvb2soUmVhY3RIb3N0T3BlcmF0aW9uSGlzdG9yeUhvb2spO1xuICB9LFxuICBnZXRGbHVzaEhpc3Rvcnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZmx1c2hIaXN0b3J5O1xuICB9LFxuICBvbkJlZ2luRmx1c2g6IGZ1bmN0aW9uICgpIHtcbiAgICBjdXJyZW50Rmx1c2hOZXN0aW5nKys7XG4gICAgcmVzZXRNZWFzdXJlbWVudHMoKTtcbiAgICBwYXVzZUN1cnJlbnRMaWZlQ3ljbGVUaW1lcigpO1xuICAgIGVtaXRFdmVudCgnb25CZWdpbkZsdXNoJyk7XG4gIH0sXG4gIG9uRW5kRmx1c2g6IGZ1bmN0aW9uICgpIHtcbiAgICByZXNldE1lYXN1cmVtZW50cygpO1xuICAgIGN1cnJlbnRGbHVzaE5lc3RpbmctLTtcbiAgICByZXN1bWVDdXJyZW50TGlmZUN5Y2xlVGltZXIoKTtcbiAgICBlbWl0RXZlbnQoJ29uRW5kRmx1c2gnKTtcbiAgfSxcbiAgb25CZWdpbkxpZmVDeWNsZVRpbWVyOiBmdW5jdGlvbiAoZGVidWdJRCwgdGltZXJUeXBlKSB7XG4gICAgY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpO1xuICAgIGVtaXRFdmVudCgnb25CZWdpbkxpZmVDeWNsZVRpbWVyJywgZGVidWdJRCwgdGltZXJUeXBlKTtcbiAgICBtYXJrQmVnaW4oZGVidWdJRCwgdGltZXJUeXBlKTtcbiAgICBiZWdpbkxpZmVDeWNsZVRpbWVyKGRlYnVnSUQsIHRpbWVyVHlwZSk7XG4gIH0sXG4gIG9uRW5kTGlmZUN5Y2xlVGltZXI6IGZ1bmN0aW9uIChkZWJ1Z0lELCB0aW1lclR5cGUpIHtcbiAgICBjaGVja0RlYnVnSUQoZGVidWdJRCk7XG4gICAgZW5kTGlmZUN5Y2xlVGltZXIoZGVidWdJRCwgdGltZXJUeXBlKTtcbiAgICBtYXJrRW5kKGRlYnVnSUQsIHRpbWVyVHlwZSk7XG4gICAgZW1pdEV2ZW50KCdvbkVuZExpZmVDeWNsZVRpbWVyJywgZGVidWdJRCwgdGltZXJUeXBlKTtcbiAgfSxcbiAgb25CZWdpblByb2Nlc3NpbmdDaGlsZENvbnRleHQ6IGZ1bmN0aW9uICgpIHtcbiAgICBlbWl0RXZlbnQoJ29uQmVnaW5Qcm9jZXNzaW5nQ2hpbGRDb250ZXh0Jyk7XG4gIH0sXG4gIG9uRW5kUHJvY2Vzc2luZ0NoaWxkQ29udGV4dDogZnVuY3Rpb24gKCkge1xuICAgIGVtaXRFdmVudCgnb25FbmRQcm9jZXNzaW5nQ2hpbGRDb250ZXh0Jyk7XG4gIH0sXG4gIG9uSG9zdE9wZXJhdGlvbjogZnVuY3Rpb24gKG9wZXJhdGlvbikge1xuICAgIGNoZWNrRGVidWdJRChvcGVyYXRpb24uaW5zdGFuY2VJRCk7XG4gICAgZW1pdEV2ZW50KCdvbkhvc3RPcGVyYXRpb24nLCBvcGVyYXRpb24pO1xuICB9LFxuICBvblNldFN0YXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgZW1pdEV2ZW50KCdvblNldFN0YXRlJyk7XG4gIH0sXG4gIG9uU2V0Q2hpbGRyZW46IGZ1bmN0aW9uIChkZWJ1Z0lELCBjaGlsZERlYnVnSURzKSB7XG4gICAgY2hlY2tEZWJ1Z0lEKGRlYnVnSUQpO1xuICAgIGNoaWxkRGVidWdJRHMuZm9yRWFjaChjaGVja0RlYnVnSUQpO1xuICAgIGVtaXRFdmVudCgnb25TZXRDaGlsZHJlbicsIGRlYnVnSUQsIGNoaWxkRGVidWdJRHMpO1xuICB9LFxuICBvbkJlZm9yZU1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCwgZWxlbWVudCwgcGFyZW50RGVidWdJRCkge1xuICAgIGNoZWNrRGVidWdJRChkZWJ1Z0lEKTtcbiAgICBjaGVja0RlYnVnSUQocGFyZW50RGVidWdJRCwgdHJ1ZSk7XG4gICAgZW1pdEV2ZW50KCdvbkJlZm9yZU1vdW50Q29tcG9uZW50JywgZGVidWdJRCwgZWxlbWVudCwgcGFyZW50RGVidWdJRCk7XG4gICAgbWFya0JlZ2luKGRlYnVnSUQsICdtb3VudCcpO1xuICB9LFxuICBvbk1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCkge1xuICAgIGNoZWNrRGVidWdJRChkZWJ1Z0lEKTtcbiAgICBtYXJrRW5kKGRlYnVnSUQsICdtb3VudCcpO1xuICAgIGVtaXRFdmVudCgnb25Nb3VudENvbXBvbmVudCcsIGRlYnVnSUQpO1xuICB9LFxuICBvbkJlZm9yZVVwZGF0ZUNvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQsIGVsZW1lbnQpIHtcbiAgICBjaGVja0RlYnVnSUQoZGVidWdJRCk7XG4gICAgZW1pdEV2ZW50KCdvbkJlZm9yZVVwZGF0ZUNvbXBvbmVudCcsIGRlYnVnSUQsIGVsZW1lbnQpO1xuICAgIG1hcmtCZWdpbihkZWJ1Z0lELCAndXBkYXRlJyk7XG4gIH0sXG4gIG9uVXBkYXRlQ29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCkge1xuICAgIGNoZWNrRGVidWdJRChkZWJ1Z0lEKTtcbiAgICBtYXJrRW5kKGRlYnVnSUQsICd1cGRhdGUnKTtcbiAgICBlbWl0RXZlbnQoJ29uVXBkYXRlQ29tcG9uZW50JywgZGVidWdJRCk7XG4gIH0sXG4gIG9uQmVmb3JlVW5tb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGRlYnVnSUQpIHtcbiAgICBjaGVja0RlYnVnSUQoZGVidWdJRCk7XG4gICAgZW1pdEV2ZW50KCdvbkJlZm9yZVVubW91bnRDb21wb25lbnQnLCBkZWJ1Z0lEKTtcbiAgICBtYXJrQmVnaW4oZGVidWdJRCwgJ3VubW91bnQnKTtcbiAgfSxcbiAgb25Vbm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoZGVidWdJRCkge1xuICAgIGNoZWNrRGVidWdJRChkZWJ1Z0lEKTtcbiAgICBtYXJrRW5kKGRlYnVnSUQsICd1bm1vdW50Jyk7XG4gICAgZW1pdEV2ZW50KCdvblVubW91bnRDb21wb25lbnQnLCBkZWJ1Z0lEKTtcbiAgfSxcbiAgb25UZXN0RXZlbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICBlbWl0RXZlbnQoJ29uVGVzdEV2ZW50Jyk7XG4gIH1cbn07XG5cbi8vIFRPRE8gcmVtb3ZlIHRoZXNlIHdoZW4gUk4vd3d3IGdldHMgdXBkYXRlZFxuUmVhY3REZWJ1Z1Rvb2wuYWRkRGV2dG9vbCA9IFJlYWN0RGVidWdUb29sLmFkZEhvb2s7XG5SZWFjdERlYnVnVG9vbC5yZW1vdmVEZXZ0b29sID0gUmVhY3REZWJ1Z1Rvb2wucmVtb3ZlSG9vaztcblxuUmVhY3REZWJ1Z1Rvb2wuYWRkSG9vayhSZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5pbmdIb29rKTtcblJlYWN0RGVidWdUb29sLmFkZEhvb2soUmVhY3RDb21wb25lbnRUcmVlSG9vayk7XG52YXIgdXJsID0gRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NICYmIHdpbmRvdy5sb2NhdGlvbi5ocmVmIHx8ICcnO1xuaWYgKC9bPyZdcmVhY3RfcGVyZlxcYi8udGVzdCh1cmwpKSB7XG4gIFJlYWN0RGVidWdUb29sLmJlZ2luUHJvZmlsaW5nKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3REZWJ1Z1Rvb2w7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xudmFyIFRyYW5zYWN0aW9uID0gcmVxdWlyZSgnLi9UcmFuc2FjdGlvbicpO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcblxudmFyIFJFU0VUX0JBVENIRURfVVBEQVRFUyA9IHtcbiAgaW5pdGlhbGl6ZTogZW1wdHlGdW5jdGlvbixcbiAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5LmlzQmF0Y2hpbmdVcGRhdGVzID0gZmFsc2U7XG4gIH1cbn07XG5cbnZhciBGTFVTSF9CQVRDSEVEX1VQREFURVMgPSB7XG4gIGluaXRpYWxpemU6IGVtcHR5RnVuY3Rpb24sXG4gIGNsb3NlOiBSZWFjdFVwZGF0ZXMuZmx1c2hCYXRjaGVkVXBkYXRlcy5iaW5kKFJlYWN0VXBkYXRlcylcbn07XG5cbnZhciBUUkFOU0FDVElPTl9XUkFQUEVSUyA9IFtGTFVTSF9CQVRDSEVEX1VQREFURVMsIFJFU0VUX0JBVENIRURfVVBEQVRFU107XG5cbmZ1bmN0aW9uIFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3lUcmFuc2FjdGlvbigpIHtcbiAgdGhpcy5yZWluaXRpYWxpemVUcmFuc2FjdGlvbigpO1xufVxuXG5fYXNzaWduKFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3lUcmFuc2FjdGlvbi5wcm90b3R5cGUsIFRyYW5zYWN0aW9uLCB7XG4gIGdldFRyYW5zYWN0aW9uV3JhcHBlcnM6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gVFJBTlNBQ1RJT05fV1JBUFBFUlM7XG4gIH1cbn0pO1xuXG52YXIgdHJhbnNhY3Rpb24gPSBuZXcgUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneVRyYW5zYWN0aW9uKCk7XG5cbnZhciBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5ID0ge1xuICBpc0JhdGNoaW5nVXBkYXRlczogZmFsc2UsXG5cbiAgLyoqXG4gICAqIENhbGwgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGluIGEgY29udGV4dCB3aXRoaW4gd2hpY2ggY2FsbHMgdG8gYHNldFN0YXRlYFxuICAgKiBhbmQgZnJpZW5kcyBhcmUgYmF0Y2hlZCBzdWNoIHRoYXQgY29tcG9uZW50cyBhcmVuJ3QgdXBkYXRlZCB1bm5lY2Vzc2FyaWx5LlxuICAgKi9cbiAgYmF0Y2hlZFVwZGF0ZXM6IGZ1bmN0aW9uIChjYWxsYmFjaywgYSwgYiwgYywgZCwgZSkge1xuICAgIHZhciBhbHJlYWR5QmF0Y2hpbmdVcGRhdGVzID0gUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneS5pc0JhdGNoaW5nVXBkYXRlcztcblxuICAgIFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3kuaXNCYXRjaGluZ1VwZGF0ZXMgPSB0cnVlO1xuXG4gICAgLy8gVGhlIGNvZGUgaXMgd3JpdHRlbiB0aGlzIHdheSB0byBhdm9pZCBleHRyYSBhbGxvY2F0aW9uc1xuICAgIGlmIChhbHJlYWR5QmF0Y2hpbmdVcGRhdGVzKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soYSwgYiwgYywgZCwgZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0cmFuc2FjdGlvbi5wZXJmb3JtKGNhbGxiYWNrLCBudWxsLCBhLCBiLCBjLCBkLCBlKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3REZWZhdWx0QmF0Y2hpbmdTdHJhdGVneTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgQVJJQURPTVByb3BlcnR5Q29uZmlnID0gcmVxdWlyZSgnLi9BUklBRE9NUHJvcGVydHlDb25maWcnKTtcbnZhciBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luID0gcmVxdWlyZSgnLi9CZWZvcmVJbnB1dEV2ZW50UGx1Z2luJyk7XG52YXIgQ2hhbmdlRXZlbnRQbHVnaW4gPSByZXF1aXJlKCcuL0NoYW5nZUV2ZW50UGx1Z2luJyk7XG52YXIgRGVmYXVsdEV2ZW50UGx1Z2luT3JkZXIgPSByZXF1aXJlKCcuL0RlZmF1bHRFdmVudFBsdWdpbk9yZGVyJyk7XG52YXIgRW50ZXJMZWF2ZUV2ZW50UGx1Z2luID0gcmVxdWlyZSgnLi9FbnRlckxlYXZlRXZlbnRQbHVnaW4nKTtcbnZhciBIVE1MRE9NUHJvcGVydHlDb25maWcgPSByZXF1aXJlKCcuL0hUTUxET01Qcm9wZXJ0eUNvbmZpZycpO1xudmFyIFJlYWN0Q29tcG9uZW50QnJvd3NlckVudmlyb25tZW50ID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudCcpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudCcpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RET01FbXB0eUNvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RET01FbXB0eUNvbXBvbmVudCcpO1xudmFyIFJlYWN0RE9NVHJlZVRyYXZlcnNhbCA9IHJlcXVpcmUoJy4vUmVhY3RET01UcmVlVHJhdmVyc2FsJyk7XG52YXIgUmVhY3RET01UZXh0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdERPTVRleHRDb21wb25lbnQnKTtcbnZhciBSZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5ID0gcmVxdWlyZSgnLi9SZWFjdERlZmF1bHRCYXRjaGluZ1N0cmF0ZWd5Jyk7XG52YXIgUmVhY3RFdmVudExpc3RlbmVyID0gcmVxdWlyZSgnLi9SZWFjdEV2ZW50TGlzdGVuZXInKTtcbnZhciBSZWFjdEluamVjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbmplY3Rpb24nKTtcbnZhciBSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uID0gcmVxdWlyZSgnLi9SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uJyk7XG52YXIgU1ZHRE9NUHJvcGVydHlDb25maWcgPSByZXF1aXJlKCcuL1NWR0RPTVByb3BlcnR5Q29uZmlnJyk7XG52YXIgU2VsZWN0RXZlbnRQbHVnaW4gPSByZXF1aXJlKCcuL1NlbGVjdEV2ZW50UGx1Z2luJyk7XG52YXIgU2ltcGxlRXZlbnRQbHVnaW4gPSByZXF1aXJlKCcuL1NpbXBsZUV2ZW50UGx1Z2luJyk7XG5cbnZhciBhbHJlYWR5SW5qZWN0ZWQgPSBmYWxzZTtcblxuZnVuY3Rpb24gaW5qZWN0KCkge1xuICBpZiAoYWxyZWFkeUluamVjdGVkKSB7XG4gICAgLy8gVE9ETzogVGhpcyBpcyBjdXJyZW50bHkgdHJ1ZSBiZWNhdXNlIHRoZXNlIGluamVjdGlvbnMgYXJlIHNoYXJlZCBiZXR3ZWVuXG4gICAgLy8gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlciBwYWNrYWdlLiBUaGV5IHNob3VsZCBiZSBidWlsdCBpbmRlcGVuZGVudGx5XG4gICAgLy8gYW5kIG5vdCBzaGFyZSBhbnkgaW5qZWN0aW9uIHN0YXRlLiBUaGVuIHRoaXMgcHJvYmxlbSB3aWxsIGJlIHNvbHZlZC5cbiAgICByZXR1cm47XG4gIH1cbiAgYWxyZWFkeUluamVjdGVkID0gdHJ1ZTtcblxuICBSZWFjdEluamVjdGlvbi5FdmVudEVtaXR0ZXIuaW5qZWN0UmVhY3RFdmVudExpc3RlbmVyKFJlYWN0RXZlbnRMaXN0ZW5lcik7XG5cbiAgLyoqXG4gICAqIEluamVjdCBtb2R1bGVzIGZvciByZXNvbHZpbmcgRE9NIGhpZXJhcmNoeSBhbmQgcGx1Z2luIG9yZGVyaW5nLlxuICAgKi9cbiAgUmVhY3RJbmplY3Rpb24uRXZlbnRQbHVnaW5IdWIuaW5qZWN0RXZlbnRQbHVnaW5PcmRlcihEZWZhdWx0RXZlbnRQbHVnaW5PcmRlcik7XG4gIFJlYWN0SW5qZWN0aW9uLkV2ZW50UGx1Z2luVXRpbHMuaW5qZWN0Q29tcG9uZW50VHJlZShSZWFjdERPTUNvbXBvbmVudFRyZWUpO1xuICBSZWFjdEluamVjdGlvbi5FdmVudFBsdWdpblV0aWxzLmluamVjdFRyZWVUcmF2ZXJzYWwoUmVhY3RET01UcmVlVHJhdmVyc2FsKTtcblxuICAvKipcbiAgICogU29tZSBpbXBvcnRhbnQgZXZlbnQgcGx1Z2lucyBpbmNsdWRlZCBieSBkZWZhdWx0ICh3aXRob3V0IGhhdmluZyB0byByZXF1aXJlXG4gICAqIHRoZW0pLlxuICAgKi9cbiAgUmVhY3RJbmplY3Rpb24uRXZlbnRQbHVnaW5IdWIuaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lKHtcbiAgICBTaW1wbGVFdmVudFBsdWdpbjogU2ltcGxlRXZlbnRQbHVnaW4sXG4gICAgRW50ZXJMZWF2ZUV2ZW50UGx1Z2luOiBFbnRlckxlYXZlRXZlbnRQbHVnaW4sXG4gICAgQ2hhbmdlRXZlbnRQbHVnaW46IENoYW5nZUV2ZW50UGx1Z2luLFxuICAgIFNlbGVjdEV2ZW50UGx1Z2luOiBTZWxlY3RFdmVudFBsdWdpbixcbiAgICBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luOiBCZWZvcmVJbnB1dEV2ZW50UGx1Z2luXG4gIH0pO1xuXG4gIFJlYWN0SW5qZWN0aW9uLkhvc3RDb21wb25lbnQuaW5qZWN0R2VuZXJpY0NvbXBvbmVudENsYXNzKFJlYWN0RE9NQ29tcG9uZW50KTtcblxuICBSZWFjdEluamVjdGlvbi5Ib3N0Q29tcG9uZW50LmluamVjdFRleHRDb21wb25lbnRDbGFzcyhSZWFjdERPTVRleHRDb21wb25lbnQpO1xuXG4gIFJlYWN0SW5qZWN0aW9uLkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKEFSSUFET01Qcm9wZXJ0eUNvbmZpZyk7XG4gIFJlYWN0SW5qZWN0aW9uLkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKEhUTUxET01Qcm9wZXJ0eUNvbmZpZyk7XG4gIFJlYWN0SW5qZWN0aW9uLkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKFNWR0RPTVByb3BlcnR5Q29uZmlnKTtcblxuICBSZWFjdEluamVjdGlvbi5FbXB0eUNvbXBvbmVudC5pbmplY3RFbXB0eUNvbXBvbmVudEZhY3RvcnkoZnVuY3Rpb24gKGluc3RhbnRpYXRlKSB7XG4gICAgcmV0dXJuIG5ldyBSZWFjdERPTUVtcHR5Q29tcG9uZW50KGluc3RhbnRpYXRlKTtcbiAgfSk7XG5cbiAgUmVhY3RJbmplY3Rpb24uVXBkYXRlcy5pbmplY3RSZWNvbmNpbGVUcmFuc2FjdGlvbihSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uKTtcbiAgUmVhY3RJbmplY3Rpb24uVXBkYXRlcy5pbmplY3RCYXRjaGluZ1N0cmF0ZWd5KFJlYWN0RGVmYXVsdEJhdGNoaW5nU3RyYXRlZ3kpO1xuXG4gIFJlYWN0SW5qZWN0aW9uLkNvbXBvbmVudC5pbmplY3RFbnZpcm9ubWVudChSZWFjdENvbXBvbmVudEJyb3dzZXJFbnZpcm9ubWVudCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpbmplY3Q6IGluamVjdFxufTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8vIFRoZSBTeW1ib2wgdXNlZCB0byB0YWcgdGhlIFJlYWN0RWxlbWVudCB0eXBlLiBJZiB0aGVyZSBpcyBubyBuYXRpdmUgU3ltYm9sXG4vLyBub3IgcG9seWZpbGwsIHRoZW4gYSBwbGFpbiBudW1iZXIgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UuXG5cbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSB0eXBlb2YgU3ltYm9sID09PSAnZnVuY3Rpb24nICYmIFN5bWJvbFsnZm9yJ10gJiYgU3ltYm9sWydmb3InXSgncmVhY3QuZWxlbWVudCcpIHx8IDB4ZWFjNztcblxubW9kdWxlLmV4cG9ydHMgPSBSRUFDVF9FTEVNRU5UX1RZUEU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGVtcHR5Q29tcG9uZW50RmFjdG9yeTtcblxudmFyIFJlYWN0RW1wdHlDb21wb25lbnRJbmplY3Rpb24gPSB7XG4gIGluamVjdEVtcHR5Q29tcG9uZW50RmFjdG9yeTogZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgICBlbXB0eUNvbXBvbmVudEZhY3RvcnkgPSBmYWN0b3J5O1xuICB9XG59O1xuXG52YXIgUmVhY3RFbXB0eUNvbXBvbmVudCA9IHtcbiAgY3JlYXRlOiBmdW5jdGlvbiAoaW5zdGFudGlhdGUpIHtcbiAgICByZXR1cm4gZW1wdHlDb21wb25lbnRGYWN0b3J5KGluc3RhbnRpYXRlKTtcbiAgfVxufTtcblxuUmVhY3RFbXB0eUNvbXBvbmVudC5pbmplY3Rpb24gPSBSZWFjdEVtcHR5Q29tcG9uZW50SW5qZWN0aW9uO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RW1wdHlDb21wb25lbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2F1Z2h0RXJyb3IgPSBudWxsO1xuXG4vKipcbiAqIENhbGwgYSBmdW5jdGlvbiB3aGlsZSBndWFyZGluZyBhZ2FpbnN0IGVycm9ycyB0aGF0IGhhcHBlbnMgd2l0aGluIGl0LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIG9mIHRoZSBndWFyZCB0byB1c2UgZm9yIGxvZ2dpbmcgb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnZva2VcbiAqIEBwYXJhbSB7Kn0gYSBGaXJzdCBhcmd1bWVudFxuICogQHBhcmFtIHsqfSBiIFNlY29uZCBhcmd1bWVudFxuICovXG5mdW5jdGlvbiBpbnZva2VHdWFyZGVkQ2FsbGJhY2sobmFtZSwgZnVuYywgYSkge1xuICB0cnkge1xuICAgIGZ1bmMoYSk7XG4gIH0gY2F0Y2ggKHgpIHtcbiAgICBpZiAoY2F1Z2h0RXJyb3IgPT09IG51bGwpIHtcbiAgICAgIGNhdWdodEVycm9yID0geDtcbiAgICB9XG4gIH1cbn1cblxudmFyIFJlYWN0RXJyb3JVdGlscyA9IHtcbiAgaW52b2tlR3VhcmRlZENhbGxiYWNrOiBpbnZva2VHdWFyZGVkQ2FsbGJhY2ssXG5cbiAgLyoqXG4gICAqIEludm9rZWQgYnkgUmVhY3RUZXN0VXRpbHMuU2ltdWxhdGUgc28gdGhhdCBhbnkgZXJyb3JzIHRocm93biBieSB0aGUgZXZlbnRcbiAgICogaGFuZGxlciBhcmUgc3VyZSB0byBiZSByZXRocm93biBieSByZXRocm93Q2F1Z2h0RXJyb3IuXG4gICAqL1xuICBpbnZva2VHdWFyZGVkQ2FsbGJhY2tXaXRoQ2F0Y2g6IGludm9rZUd1YXJkZWRDYWxsYmFjayxcblxuICAvKipcbiAgICogRHVyaW5nIGV4ZWN1dGlvbiBvZiBndWFyZGVkIGZ1bmN0aW9ucyB3ZSB3aWxsIGNhcHR1cmUgdGhlIGZpcnN0IGVycm9yIHdoaWNoXG4gICAqIHdlIHdpbGwgcmV0aHJvdyB0byBiZSBoYW5kbGVkIGJ5IHRoZSB0b3AgbGV2ZWwgZXJyb3IgaGFuZGxlci5cbiAgICovXG4gIHJldGhyb3dDYXVnaHRFcnJvcjogZnVuY3Rpb24gKCkge1xuICAgIGlmIChjYXVnaHRFcnJvcikge1xuICAgICAgdmFyIGVycm9yID0gY2F1Z2h0RXJyb3I7XG4gICAgICBjYXVnaHRFcnJvciA9IG51bGw7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbn07XG5cbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAvKipcbiAgICogVG8gaGVscCBkZXZlbG9wbWVudCB3ZSBjYW4gZ2V0IGJldHRlciBkZXZ0b29scyBpbnRlZ3JhdGlvbiBieSBzaW11bGF0aW5nIGFcbiAgICogcmVhbCBicm93c2VyIGV2ZW50LlxuICAgKi9cbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZGlzcGF0Y2hFdmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFdmVudCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBmYWtlTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3JlYWN0Jyk7XG4gICAgUmVhY3RFcnJvclV0aWxzLmludm9rZUd1YXJkZWRDYWxsYmFjayA9IGZ1bmN0aW9uIChuYW1lLCBmdW5jLCBhKSB7XG4gICAgICB2YXIgYm91bmRGdW5jID0gZnVuYy5iaW5kKG51bGwsIGEpO1xuICAgICAgdmFyIGV2dFR5cGUgPSAncmVhY3QtJyArIG5hbWU7XG4gICAgICBmYWtlTm9kZS5hZGRFdmVudExpc3RlbmVyKGV2dFR5cGUsIGJvdW5kRnVuYywgZmFsc2UpO1xuICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgICAgZXZ0LmluaXRFdmVudChldnRUeXBlLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgZmFrZU5vZGUuZGlzcGF0Y2hFdmVudChldnQpO1xuICAgICAgZmFrZU5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldnRUeXBlLCBib3VuZEZ1bmMsIGZhbHNlKTtcbiAgICB9O1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RFcnJvclV0aWxzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFdmVudFBsdWdpbkh1YiA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5IdWInKTtcblxuZnVuY3Rpb24gcnVuRXZlbnRRdWV1ZUluQmF0Y2goZXZlbnRzKSB7XG4gIEV2ZW50UGx1Z2luSHViLmVucXVldWVFdmVudHMoZXZlbnRzKTtcbiAgRXZlbnRQbHVnaW5IdWIucHJvY2Vzc0V2ZW50UXVldWUoZmFsc2UpO1xufVxuXG52YXIgUmVhY3RFdmVudEVtaXR0ZXJNaXhpbiA9IHtcblxuICAvKipcbiAgICogU3RyZWFtcyBhIGZpcmVkIHRvcC1sZXZlbCBldmVudCB0byBgRXZlbnRQbHVnaW5IdWJgIHdoZXJlIHBsdWdpbnMgaGF2ZSB0aGVcbiAgICogb3Bwb3J0dW5pdHkgdG8gY3JlYXRlIGBSZWFjdEV2ZW50YHMgdG8gYmUgZGlzcGF0Y2hlZC5cbiAgICovXG4gIGhhbmRsZVRvcExldmVsOiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICB2YXIgZXZlbnRzID0gRXZlbnRQbHVnaW5IdWIuZXh0cmFjdEV2ZW50cyh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgcnVuRXZlbnRRdWV1ZUluQmF0Y2goZXZlbnRzKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEV2ZW50RW1pdHRlck1peGluOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgRXZlbnRMaXN0ZW5lciA9IHJlcXVpcmUoJ2ZianMvbGliL0V2ZW50TGlzdGVuZXInKTtcbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG52YXIgUG9vbGVkQ2xhc3MgPSByZXF1aXJlKCcuL1Bvb2xlZENsYXNzJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdFVwZGF0ZXMgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlcycpO1xuXG52YXIgZ2V0RXZlbnRUYXJnZXQgPSByZXF1aXJlKCcuL2dldEV2ZW50VGFyZ2V0Jyk7XG52YXIgZ2V0VW5ib3VuZGVkU2Nyb2xsUG9zaXRpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9nZXRVbmJvdW5kZWRTY3JvbGxQb3NpdGlvbicpO1xuXG4vKipcbiAqIEZpbmQgdGhlIGRlZXBlc3QgUmVhY3QgY29tcG9uZW50IGNvbXBsZXRlbHkgY29udGFpbmluZyB0aGUgcm9vdCBvZiB0aGVcbiAqIHBhc3NlZC1pbiBpbnN0YW5jZSAoZm9yIHVzZSB3aGVuIGVudGlyZSBSZWFjdCB0cmVlcyBhcmUgbmVzdGVkIHdpdGhpbiBlYWNoXG4gKiBvdGhlcikuIElmIFJlYWN0IHRyZWVzIGFyZSBub3QgbmVzdGVkLCByZXR1cm5zIG51bGwuXG4gKi9cbmZ1bmN0aW9uIGZpbmRQYXJlbnQoaW5zdCkge1xuICAvLyBUT0RPOiBJdCBtYXkgYmUgYSBnb29kIGlkZWEgdG8gY2FjaGUgdGhpcyB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IERPTVxuICAvLyB0cmF2ZXJzYWwsIGJ1dCBjYWNoaW5nIGlzIGRpZmZpY3VsdCB0byBkbyBjb3JyZWN0bHkgd2l0aG91dCB1c2luZyBhXG4gIC8vIG11dGF0aW9uIG9ic2VydmVyIHRvIGxpc3RlbiBmb3IgYWxsIERPTSBjaGFuZ2VzLlxuICB3aGlsZSAoaW5zdC5faG9zdFBhcmVudCkge1xuICAgIGluc3QgPSBpbnN0Ll9ob3N0UGFyZW50O1xuICB9XG4gIHZhciByb290Tm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKGluc3QpO1xuICB2YXIgY29udGFpbmVyID0gcm9vdE5vZGUucGFyZW50Tm9kZTtcbiAgcmV0dXJuIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZShjb250YWluZXIpO1xufVxuXG4vLyBVc2VkIHRvIHN0b3JlIGFuY2VzdG9yIGhpZXJhcmNoeSBpbiB0b3AgbGV2ZWwgY2FsbGJhY2tcbmZ1bmN0aW9uIFRvcExldmVsQ2FsbGJhY2tCb29rS2VlcGluZyh0b3BMZXZlbFR5cGUsIG5hdGl2ZUV2ZW50KSB7XG4gIHRoaXMudG9wTGV2ZWxUeXBlID0gdG9wTGV2ZWxUeXBlO1xuICB0aGlzLm5hdGl2ZUV2ZW50ID0gbmF0aXZlRXZlbnQ7XG4gIHRoaXMuYW5jZXN0b3JzID0gW107XG59XG5fYXNzaWduKFRvcExldmVsQ2FsbGJhY2tCb29rS2VlcGluZy5wcm90b3R5cGUsIHtcbiAgZGVzdHJ1Y3RvcjogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMudG9wTGV2ZWxUeXBlID0gbnVsbDtcbiAgICB0aGlzLm5hdGl2ZUV2ZW50ID0gbnVsbDtcbiAgICB0aGlzLmFuY2VzdG9ycy5sZW5ndGggPSAwO1xuICB9XG59KTtcblBvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhUb3BMZXZlbENhbGxiYWNrQm9va0tlZXBpbmcsIFBvb2xlZENsYXNzLnR3b0FyZ3VtZW50UG9vbGVyKTtcblxuZnVuY3Rpb24gaGFuZGxlVG9wTGV2ZWxJbXBsKGJvb2tLZWVwaW5nKSB7XG4gIHZhciBuYXRpdmVFdmVudFRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KGJvb2tLZWVwaW5nLm5hdGl2ZUV2ZW50KTtcbiAgdmFyIHRhcmdldEluc3QgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUobmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gIC8vIExvb3AgdGhyb3VnaCB0aGUgaGllcmFyY2h5LCBpbiBjYXNlIHRoZXJlJ3MgYW55IG5lc3RlZCBjb21wb25lbnRzLlxuICAvLyBJdCdzIGltcG9ydGFudCB0aGF0IHdlIGJ1aWxkIHRoZSBhcnJheSBvZiBhbmNlc3RvcnMgYmVmb3JlIGNhbGxpbmcgYW55XG4gIC8vIGV2ZW50IGhhbmRsZXJzLCBiZWNhdXNlIGV2ZW50IGhhbmRsZXJzIGNhbiBtb2RpZnkgdGhlIERPTSwgbGVhZGluZyB0b1xuICAvLyBpbmNvbnNpc3RlbmNpZXMgd2l0aCBSZWFjdE1vdW50J3Mgbm9kZSBjYWNoZS4gU2VlICMxMTA1LlxuICB2YXIgYW5jZXN0b3IgPSB0YXJnZXRJbnN0O1xuICBkbyB7XG4gICAgYm9va0tlZXBpbmcuYW5jZXN0b3JzLnB1c2goYW5jZXN0b3IpO1xuICAgIGFuY2VzdG9yID0gYW5jZXN0b3IgJiYgZmluZFBhcmVudChhbmNlc3Rvcik7XG4gIH0gd2hpbGUgKGFuY2VzdG9yKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGJvb2tLZWVwaW5nLmFuY2VzdG9ycy5sZW5ndGg7IGkrKykge1xuICAgIHRhcmdldEluc3QgPSBib29rS2VlcGluZy5hbmNlc3RvcnNbaV07XG4gICAgUmVhY3RFdmVudExpc3RlbmVyLl9oYW5kbGVUb3BMZXZlbChib29rS2VlcGluZy50b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIGJvb2tLZWVwaW5nLm5hdGl2ZUV2ZW50LCBnZXRFdmVudFRhcmdldChib29rS2VlcGluZy5uYXRpdmVFdmVudCkpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNjcm9sbFZhbHVlTW9uaXRvcihjYikge1xuICB2YXIgc2Nyb2xsUG9zaXRpb24gPSBnZXRVbmJvdW5kZWRTY3JvbGxQb3NpdGlvbih3aW5kb3cpO1xuICBjYihzY3JvbGxQb3NpdGlvbik7XG59XG5cbnZhciBSZWFjdEV2ZW50TGlzdGVuZXIgPSB7XG4gIF9lbmFibGVkOiB0cnVlLFxuICBfaGFuZGxlVG9wTGV2ZWw6IG51bGwsXG5cbiAgV0lORE9XX0hBTkRMRTogRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NID8gd2luZG93IDogbnVsbCxcblxuICBzZXRIYW5kbGVUb3BMZXZlbDogZnVuY3Rpb24gKGhhbmRsZVRvcExldmVsKSB7XG4gICAgUmVhY3RFdmVudExpc3RlbmVyLl9oYW5kbGVUb3BMZXZlbCA9IGhhbmRsZVRvcExldmVsO1xuICB9LFxuXG4gIHNldEVuYWJsZWQ6IGZ1bmN0aW9uIChlbmFibGVkKSB7XG4gICAgUmVhY3RFdmVudExpc3RlbmVyLl9lbmFibGVkID0gISFlbmFibGVkO1xuICB9LFxuXG4gIGlzRW5hYmxlZDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBSZWFjdEV2ZW50TGlzdGVuZXIuX2VuYWJsZWQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRyYXBzIHRvcC1sZXZlbCBldmVudHMgYnkgdXNpbmcgZXZlbnQgYnViYmxpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0b3BMZXZlbFR5cGUgUmVjb3JkIGZyb20gYEV2ZW50Q29uc3RhbnRzYC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGhhbmRsZXJCYXNlTmFtZSBFdmVudCBuYW1lIChlLmcuIFwiY2xpY2tcIikuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBlbGVtZW50IEVsZW1lbnQgb24gd2hpY2ggdG8gYXR0YWNoIGxpc3RlbmVyLlxuICAgKiBAcmV0dXJuIHs/b2JqZWN0fSBBbiBvYmplY3Qgd2l0aCBhIHJlbW92ZSBmdW5jdGlvbiB3aGljaCB3aWxsIGZvcmNlZnVsbHlcbiAgICogICAgICAgICAgICAgICAgICByZW1vdmUgdGhlIGxpc3RlbmVyLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHRyYXBCdWJibGVkRXZlbnQ6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIGhhbmRsZXJCYXNlTmFtZSwgZWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBFdmVudExpc3RlbmVyLmxpc3RlbihlbGVtZW50LCBoYW5kbGVyQmFzZU5hbWUsIFJlYWN0RXZlbnRMaXN0ZW5lci5kaXNwYXRjaEV2ZW50LmJpbmQobnVsbCwgdG9wTGV2ZWxUeXBlKSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFRyYXBzIGEgdG9wLWxldmVsIGV2ZW50IGJ5IHVzaW5nIGV2ZW50IGNhcHR1cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRvcExldmVsVHlwZSBSZWNvcmQgZnJvbSBgRXZlbnRDb25zdGFudHNgLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGFuZGxlckJhc2VOYW1lIEV2ZW50IG5hbWUgKGUuZy4gXCJjbGlja1wiKS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGVsZW1lbnQgRWxlbWVudCBvbiB3aGljaCB0byBhdHRhY2ggbGlzdGVuZXIuXG4gICAqIEByZXR1cm4gez9vYmplY3R9IEFuIG9iamVjdCB3aXRoIGEgcmVtb3ZlIGZ1bmN0aW9uIHdoaWNoIHdpbGwgZm9yY2VmdWxseVxuICAgKiAgICAgICAgICAgICAgICAgIHJlbW92ZSB0aGUgbGlzdGVuZXIuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdHJhcENhcHR1cmVkRXZlbnQ6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIGhhbmRsZXJCYXNlTmFtZSwgZWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBFdmVudExpc3RlbmVyLmNhcHR1cmUoZWxlbWVudCwgaGFuZGxlckJhc2VOYW1lLCBSZWFjdEV2ZW50TGlzdGVuZXIuZGlzcGF0Y2hFdmVudC5iaW5kKG51bGwsIHRvcExldmVsVHlwZSkpO1xuICB9LFxuXG4gIG1vbml0b3JTY3JvbGxWYWx1ZTogZnVuY3Rpb24gKHJlZnJlc2gpIHtcbiAgICB2YXIgY2FsbGJhY2sgPSBzY3JvbGxWYWx1ZU1vbml0b3IuYmluZChudWxsLCByZWZyZXNoKTtcbiAgICBFdmVudExpc3RlbmVyLmxpc3Rlbih3aW5kb3csICdzY3JvbGwnLCBjYWxsYmFjayk7XG4gIH0sXG5cbiAgZGlzcGF0Y2hFdmVudDogZnVuY3Rpb24gKHRvcExldmVsVHlwZSwgbmF0aXZlRXZlbnQpIHtcbiAgICBpZiAoIVJlYWN0RXZlbnRMaXN0ZW5lci5fZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBib29rS2VlcGluZyA9IFRvcExldmVsQ2FsbGJhY2tCb29rS2VlcGluZy5nZXRQb29sZWQodG9wTGV2ZWxUeXBlLCBuYXRpdmVFdmVudCk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEV2ZW50IHF1ZXVlIGJlaW5nIHByb2Nlc3NlZCBpbiB0aGUgc2FtZSBjeWNsZSBhbGxvd3NcbiAgICAgIC8vIGBwcmV2ZW50RGVmYXVsdGAuXG4gICAgICBSZWFjdFVwZGF0ZXMuYmF0Y2hlZFVwZGF0ZXMoaGFuZGxlVG9wTGV2ZWxJbXBsLCBib29rS2VlcGluZyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIFRvcExldmVsQ2FsbGJhY2tCb29rS2VlcGluZy5yZWxlYXNlKGJvb2tLZWVwaW5nKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RFdmVudExpc3RlbmVyOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0RmVhdHVyZUZsYWdzID0ge1xuICAvLyBXaGVuIHRydWUsIGNhbGwgY29uc29sZS50aW1lKCkgYmVmb3JlIGFuZCAudGltZUVuZCgpIGFmdGVyIGVhY2ggdG9wLWxldmVsXG4gIC8vIHJlbmRlciAoYm90aCBpbml0aWFsIHJlbmRlcnMgYW5kIHVwZGF0ZXMpLiBVc2VmdWwgd2hlbiBsb29raW5nIGF0IHByb2QtbW9kZVxuICAvLyB0aW1lbGluZSBwcm9maWxlcyBpbiBDaHJvbWUsIGZvciBleGFtcGxlLlxuICBsb2dUb3BMZXZlbFJlbmRlcnM6IGZhbHNlXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RmVhdHVyZUZsYWdzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxudmFyIGdlbmVyaWNDb21wb25lbnRDbGFzcyA9IG51bGw7XG52YXIgdGV4dENvbXBvbmVudENsYXNzID0gbnVsbDtcblxudmFyIFJlYWN0SG9zdENvbXBvbmVudEluamVjdGlvbiA9IHtcbiAgLy8gVGhpcyBhY2NlcHRzIGEgY2xhc3MgdGhhdCByZWNlaXZlcyB0aGUgdGFnIHN0cmluZy4gVGhpcyBpcyBhIGNhdGNoIGFsbFxuICAvLyB0aGF0IGNhbiByZW5kZXIgYW55IGtpbmQgb2YgdGFnLlxuICBpbmplY3RHZW5lcmljQ29tcG9uZW50Q2xhc3M6IGZ1bmN0aW9uIChjb21wb25lbnRDbGFzcykge1xuICAgIGdlbmVyaWNDb21wb25lbnRDbGFzcyA9IGNvbXBvbmVudENsYXNzO1xuICB9LFxuICAvLyBUaGlzIGFjY2VwdHMgYSB0ZXh0IGNvbXBvbmVudCBjbGFzcyB0aGF0IHRha2VzIHRoZSB0ZXh0IHN0cmluZyB0byBiZVxuICAvLyByZW5kZXJlZCBhcyBwcm9wcy5cbiAgaW5qZWN0VGV4dENvbXBvbmVudENsYXNzOiBmdW5jdGlvbiAoY29tcG9uZW50Q2xhc3MpIHtcbiAgICB0ZXh0Q29tcG9uZW50Q2xhc3MgPSBjb21wb25lbnRDbGFzcztcbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgYSBob3N0IGludGVybmFsIGNvbXBvbmVudCBjbGFzcyBmb3IgYSBzcGVjaWZpYyB0YWcuXG4gKlxuICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gY3JlYXRlLlxuICogQHJldHVybiB7ZnVuY3Rpb259IFRoZSBpbnRlcm5hbCBjbGFzcyBjb25zdHJ1Y3RvciBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW50ZXJuYWxDb21wb25lbnQoZWxlbWVudCkge1xuICAhZ2VuZXJpY0NvbXBvbmVudENsYXNzID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdUaGVyZSBpcyBubyByZWdpc3RlcmVkIGNvbXBvbmVudCBmb3IgdGhlIHRhZyAlcycsIGVsZW1lbnQudHlwZSkgOiBfcHJvZEludmFyaWFudCgnMTExJywgZWxlbWVudC50eXBlKSA6IHZvaWQgMDtcbiAgcmV0dXJuIG5ldyBnZW5lcmljQ29tcG9uZW50Q2xhc3MoZWxlbWVudCk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtSZWFjdFRleHR9IHRleHRcbiAqIEByZXR1cm4ge1JlYWN0Q29tcG9uZW50fVxuICovXG5mdW5jdGlvbiBjcmVhdGVJbnN0YW5jZUZvclRleHQodGV4dCkge1xuICByZXR1cm4gbmV3IHRleHRDb21wb25lbnRDbGFzcyh0ZXh0KTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjb21wb25lbnRcbiAqIEByZXR1cm4ge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzVGV4dENvbXBvbmVudChjb21wb25lbnQpIHtcbiAgcmV0dXJuIGNvbXBvbmVudCBpbnN0YW5jZW9mIHRleHRDb21wb25lbnRDbGFzcztcbn1cblxudmFyIFJlYWN0SG9zdENvbXBvbmVudCA9IHtcbiAgY3JlYXRlSW50ZXJuYWxDb21wb25lbnQ6IGNyZWF0ZUludGVybmFsQ29tcG9uZW50LFxuICBjcmVhdGVJbnN0YW5jZUZvclRleHQ6IGNyZWF0ZUluc3RhbmNlRm9yVGV4dCxcbiAgaXNUZXh0Q29tcG9uZW50OiBpc1RleHRDb21wb25lbnQsXG4gIGluamVjdGlvbjogUmVhY3RIb3N0Q29tcG9uZW50SW5qZWN0aW9uXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0SG9zdENvbXBvbmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE2LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBoaXN0b3J5ID0gW107XG5cbnZhciBSZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vayA9IHtcbiAgb25Ib3N0T3BlcmF0aW9uOiBmdW5jdGlvbiAob3BlcmF0aW9uKSB7XG4gICAgaGlzdG9yeS5wdXNoKG9wZXJhdGlvbik7XG4gIH0sXG4gIGNsZWFySGlzdG9yeTogZnVuY3Rpb24gKCkge1xuICAgIGlmIChSZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vay5fcHJldmVudENsZWFyaW5nKSB7XG4gICAgICAvLyBTaG91bGQgb25seSBiZSB1c2VkIGZvciB0ZXN0cy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBoaXN0b3J5ID0gW107XG4gIH0sXG4gIGdldEhpc3Rvcnk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gaGlzdG9yeTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEhvc3RPcGVyYXRpb25IaXN0b3J5SG9vazsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRE9NUHJvcGVydHkgPSByZXF1aXJlKCcuL0RPTVByb3BlcnR5Jyk7XG52YXIgRXZlbnRQbHVnaW5IdWIgPSByZXF1aXJlKCcuL0V2ZW50UGx1Z2luSHViJyk7XG52YXIgRXZlbnRQbHVnaW5VdGlscyA9IHJlcXVpcmUoJy4vRXZlbnRQbHVnaW5VdGlscycpO1xudmFyIFJlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50RW52aXJvbm1lbnQnKTtcbnZhciBSZWFjdEVtcHR5Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVtcHR5Q29tcG9uZW50Jyk7XG52YXIgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnLi9SZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXInKTtcbnZhciBSZWFjdEhvc3RDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0SG9zdENvbXBvbmVudCcpO1xudmFyIFJlYWN0VXBkYXRlcyA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVzJyk7XG5cbnZhciBSZWFjdEluamVjdGlvbiA9IHtcbiAgQ29tcG9uZW50OiBSZWFjdENvbXBvbmVudEVudmlyb25tZW50LmluamVjdGlvbixcbiAgRE9NUHJvcGVydHk6IERPTVByb3BlcnR5LmluamVjdGlvbixcbiAgRW1wdHlDb21wb25lbnQ6IFJlYWN0RW1wdHlDb21wb25lbnQuaW5qZWN0aW9uLFxuICBFdmVudFBsdWdpbkh1YjogRXZlbnRQbHVnaW5IdWIuaW5qZWN0aW9uLFxuICBFdmVudFBsdWdpblV0aWxzOiBFdmVudFBsdWdpblV0aWxzLmluamVjdGlvbixcbiAgRXZlbnRFbWl0dGVyOiBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuaW5qZWN0aW9uLFxuICBIb3N0Q29tcG9uZW50OiBSZWFjdEhvc3RDb21wb25lbnQuaW5qZWN0aW9uLFxuICBVcGRhdGVzOiBSZWFjdFVwZGF0ZXMuaW5qZWN0aW9uXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0SW5qZWN0aW9uOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdERPTVNlbGVjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RET01TZWxlY3Rpb24nKTtcblxudmFyIGNvbnRhaW5zTm9kZSA9IHJlcXVpcmUoJ2ZianMvbGliL2NvbnRhaW5zTm9kZScpO1xudmFyIGZvY3VzTm9kZSA9IHJlcXVpcmUoJ2ZianMvbGliL2ZvY3VzTm9kZScpO1xudmFyIGdldEFjdGl2ZUVsZW1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9nZXRBY3RpdmVFbGVtZW50Jyk7XG5cbmZ1bmN0aW9uIGlzSW5Eb2N1bWVudChub2RlKSB7XG4gIHJldHVybiBjb250YWluc05vZGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBub2RlKTtcbn1cblxuLyoqXG4gKiBAUmVhY3RJbnB1dFNlbGVjdGlvbjogUmVhY3QgaW5wdXQgc2VsZWN0aW9uIG1vZHVsZS4gQmFzZWQgb24gU2VsZWN0aW9uLmpzLFxuICogYnV0IG1vZGlmaWVkIHRvIGJlIHN1aXRhYmxlIGZvciByZWFjdCBhbmQgaGFzIGEgY291cGxlIG9mIGJ1ZyBmaXhlcyAoZG9lc24ndFxuICogYXNzdW1lIGJ1dHRvbnMgaGF2ZSByYW5nZSBzZWxlY3Rpb25zIGFsbG93ZWQpLlxuICogSW5wdXQgc2VsZWN0aW9uIG1vZHVsZSBmb3IgUmVhY3QuXG4gKi9cbnZhciBSZWFjdElucHV0U2VsZWN0aW9uID0ge1xuXG4gIGhhc1NlbGVjdGlvbkNhcGFiaWxpdGllczogZnVuY3Rpb24gKGVsZW0pIHtcbiAgICB2YXIgbm9kZU5hbWUgPSBlbGVtICYmIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBub2RlTmFtZSAmJiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgZWxlbS50eXBlID09PSAndGV4dCcgfHwgbm9kZU5hbWUgPT09ICd0ZXh0YXJlYScgfHwgZWxlbS5jb250ZW50RWRpdGFibGUgPT09ICd0cnVlJyk7XG4gIH0sXG5cbiAgZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb246IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZm9jdXNlZEVsZW0gPSBnZXRBY3RpdmVFbGVtZW50KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZvY3VzZWRFbGVtOiBmb2N1c2VkRWxlbSxcbiAgICAgIHNlbGVjdGlvblJhbmdlOiBSZWFjdElucHV0U2VsZWN0aW9uLmhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhmb2N1c2VkRWxlbSkgPyBSZWFjdElucHV0U2VsZWN0aW9uLmdldFNlbGVjdGlvbihmb2N1c2VkRWxlbSkgOiBudWxsXG4gICAgfTtcbiAgfSxcblxuICAvKipcbiAgICogQHJlc3RvcmVTZWxlY3Rpb246IElmIGFueSBzZWxlY3Rpb24gaW5mb3JtYXRpb24gd2FzIHBvdGVudGlhbGx5IGxvc3QsXG4gICAqIHJlc3RvcmUgaXQuIFRoaXMgaXMgdXNlZnVsIHdoZW4gcGVyZm9ybWluZyBvcGVyYXRpb25zIHRoYXQgY291bGQgcmVtb3ZlIGRvbVxuICAgKiBub2RlcyBhbmQgcGxhY2UgdGhlbSBiYWNrIGluLCByZXN1bHRpbmcgaW4gZm9jdXMgYmVpbmcgbG9zdC5cbiAgICovXG4gIHJlc3RvcmVTZWxlY3Rpb246IGZ1bmN0aW9uIChwcmlvclNlbGVjdGlvbkluZm9ybWF0aW9uKSB7XG4gICAgdmFyIGN1ckZvY3VzZWRFbGVtID0gZ2V0QWN0aXZlRWxlbWVudCgpO1xuICAgIHZhciBwcmlvckZvY3VzZWRFbGVtID0gcHJpb3JTZWxlY3Rpb25JbmZvcm1hdGlvbi5mb2N1c2VkRWxlbTtcbiAgICB2YXIgcHJpb3JTZWxlY3Rpb25SYW5nZSA9IHByaW9yU2VsZWN0aW9uSW5mb3JtYXRpb24uc2VsZWN0aW9uUmFuZ2U7XG4gICAgaWYgKGN1ckZvY3VzZWRFbGVtICE9PSBwcmlvckZvY3VzZWRFbGVtICYmIGlzSW5Eb2N1bWVudChwcmlvckZvY3VzZWRFbGVtKSkge1xuICAgICAgaWYgKFJlYWN0SW5wdXRTZWxlY3Rpb24uaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKHByaW9yRm9jdXNlZEVsZW0pKSB7XG4gICAgICAgIFJlYWN0SW5wdXRTZWxlY3Rpb24uc2V0U2VsZWN0aW9uKHByaW9yRm9jdXNlZEVsZW0sIHByaW9yU2VsZWN0aW9uUmFuZ2UpO1xuICAgICAgfVxuICAgICAgZm9jdXNOb2RlKHByaW9yRm9jdXNlZEVsZW0pO1xuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogQGdldFNlbGVjdGlvbjogR2V0cyB0aGUgc2VsZWN0aW9uIGJvdW5kcyBvZiBhIGZvY3VzZWQgdGV4dGFyZWEsIGlucHV0IG9yXG4gICAqIGNvbnRlbnRFZGl0YWJsZSBub2RlLlxuICAgKiAtQGlucHV0OiBMb29rIHVwIHNlbGVjdGlvbiBib3VuZHMgb2YgdGhpcyBpbnB1dFxuICAgKiAtQHJldHVybiB7c3RhcnQ6IHNlbGVjdGlvblN0YXJ0LCBlbmQ6IHNlbGVjdGlvbkVuZH1cbiAgICovXG4gIGdldFNlbGVjdGlvbjogZnVuY3Rpb24gKGlucHV0KSB7XG4gICAgdmFyIHNlbGVjdGlvbjtcblxuICAgIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIGlucHV0KSB7XG4gICAgICAvLyBNb2Rlcm4gYnJvd3NlciB3aXRoIGlucHV0IG9yIHRleHRhcmVhLlxuICAgICAgc2VsZWN0aW9uID0ge1xuICAgICAgICBzdGFydDogaW5wdXQuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgIGVuZDogaW5wdXQuc2VsZWN0aW9uRW5kXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uICYmIGlucHV0Lm5vZGVOYW1lICYmIGlucHV0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcpIHtcbiAgICAgIC8vIElFOCBpbnB1dC5cbiAgICAgIHZhciByYW5nZSA9IGRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpO1xuICAgICAgLy8gVGhlcmUgY2FuIG9ubHkgYmUgb25lIHNlbGVjdGlvbiBwZXIgZG9jdW1lbnQgaW4gSUUsIHNvIGl0IG11c3RcbiAgICAgIC8vIGJlIGluIG91ciBlbGVtZW50LlxuICAgICAgaWYgKHJhbmdlLnBhcmVudEVsZW1lbnQoKSA9PT0gaW5wdXQpIHtcbiAgICAgICAgc2VsZWN0aW9uID0ge1xuICAgICAgICAgIHN0YXJ0OiAtcmFuZ2UubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCAtaW5wdXQudmFsdWUubGVuZ3RoKSxcbiAgICAgICAgICBlbmQ6IC1yYW5nZS5tb3ZlRW5kKCdjaGFyYWN0ZXInLCAtaW5wdXQudmFsdWUubGVuZ3RoKVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDb250ZW50IGVkaXRhYmxlIG9yIG9sZCBJRSB0ZXh0YXJlYS5cbiAgICAgIHNlbGVjdGlvbiA9IFJlYWN0RE9NU2VsZWN0aW9uLmdldE9mZnNldHMoaW5wdXQpO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3Rpb24gfHwgeyBzdGFydDogMCwgZW5kOiAwIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIEBzZXRTZWxlY3Rpb246IFNldHMgdGhlIHNlbGVjdGlvbiBib3VuZHMgb2YgYSB0ZXh0YXJlYSBvciBpbnB1dCBhbmQgZm9jdXNlc1xuICAgKiB0aGUgaW5wdXQuXG4gICAqIC1AaW5wdXQgICAgIFNldCBzZWxlY3Rpb24gYm91bmRzIG9mIHRoaXMgaW5wdXQgb3IgdGV4dGFyZWFcbiAgICogLUBvZmZzZXRzICAgT2JqZWN0IG9mIHNhbWUgZm9ybSB0aGF0IGlzIHJldHVybmVkIGZyb20gZ2V0KlxuICAgKi9cbiAgc2V0U2VsZWN0aW9uOiBmdW5jdGlvbiAoaW5wdXQsIG9mZnNldHMpIHtcbiAgICB2YXIgc3RhcnQgPSBvZmZzZXRzLnN0YXJ0O1xuICAgIHZhciBlbmQgPSBvZmZzZXRzLmVuZDtcbiAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVuZCA9IHN0YXJ0O1xuICAgIH1cblxuICAgIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIGlucHV0KSB7XG4gICAgICBpbnB1dC5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0O1xuICAgICAgaW5wdXQuc2VsZWN0aW9uRW5kID0gTWF0aC5taW4oZW5kLCBpbnB1dC52YWx1ZS5sZW5ndGgpO1xuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uICYmIGlucHV0Lm5vZGVOYW1lICYmIGlucHV0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcpIHtcbiAgICAgIHZhciByYW5nZSA9IGlucHV0LmNyZWF0ZVRleHRSYW5nZSgpO1xuICAgICAgcmFuZ2UuY29sbGFwc2UodHJ1ZSk7XG4gICAgICByYW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIHN0YXJ0KTtcbiAgICAgIHJhbmdlLm1vdmVFbmQoJ2NoYXJhY3RlcicsIGVuZCAtIHN0YXJ0KTtcbiAgICAgIHJhbmdlLnNlbGVjdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBSZWFjdERPTVNlbGVjdGlvbi5zZXRPZmZzZXRzKGlucHV0LCBvZmZzZXRzKTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RJbnB1dFNlbGVjdGlvbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIGBSZWFjdEluc3RhbmNlTWFwYCBtYWludGFpbnMgYSBtYXBwaW5nIGZyb20gYSBwdWJsaWMgZmFjaW5nIHN0YXRlZnVsXG4gKiBpbnN0YW5jZSAoa2V5KSBhbmQgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uICh2YWx1ZSkuIFRoaXMgYWxsb3dzIHB1YmxpY1xuICogbWV0aG9kcyB0byBhY2NlcHQgdGhlIHVzZXIgZmFjaW5nIGluc3RhbmNlIGFzIGFuIGFyZ3VtZW50IGFuZCBtYXAgdGhlbSBiYWNrXG4gKiB0byBpbnRlcm5hbCBtZXRob2RzLlxuICovXG5cbi8vIFRPRE86IFJlcGxhY2UgdGhpcyB3aXRoIEVTNjogdmFyIFJlYWN0SW5zdGFuY2VNYXAgPSBuZXcgTWFwKCk7XG5cbnZhciBSZWFjdEluc3RhbmNlTWFwID0ge1xuXG4gIC8qKlxuICAgKiBUaGlzIEFQSSBzaG91bGQgYmUgY2FsbGVkIGBkZWxldGVgIGJ1dCB3ZSdkIGhhdmUgdG8gbWFrZSBzdXJlIHRvIGFsd2F5c1xuICAgKiB0cmFuc2Zvcm0gdGhlc2UgdG8gc3RyaW5ncyBmb3IgSUUgc3VwcG9ydC4gV2hlbiB0aGlzIHRyYW5zZm9ybSBpcyBmdWxseVxuICAgKiBzdXBwb3J0ZWQgd2UgY2FuIHJlbmFtZSBpdC5cbiAgICovXG4gIHJlbW92ZTogZnVuY3Rpb24gKGtleSkge1xuICAgIGtleS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlID0gdW5kZWZpbmVkO1xuICB9LFxuXG4gIGdldDogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBrZXkuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZTtcbiAgfSxcblxuICBoYXM6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4ga2V5Ll9yZWFjdEludGVybmFsSW5zdGFuY2UgIT09IHVuZGVmaW5lZDtcbiAgfSxcblxuICBzZXQ6IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAga2V5Ll9yZWFjdEludGVybmFsSW5zdGFuY2UgPSB2YWx1ZTtcbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0SW5zdGFuY2VNYXA7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNi1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyBUcnVzdCB0aGUgZGV2ZWxvcGVyIHRvIG9ubHkgdXNlIFJlYWN0SW5zdHJ1bWVudGF0aW9uIHdpdGggYSBfX0RFVl9fIGNoZWNrXG5cbnZhciBkZWJ1Z1Rvb2wgPSBudWxsO1xuXG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0RGVidWdUb29sID0gcmVxdWlyZSgnLi9SZWFjdERlYnVnVG9vbCcpO1xuICBkZWJ1Z1Rvb2wgPSBSZWFjdERlYnVnVG9vbDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7IGRlYnVnVG9vbDogZGVidWdUb29sIH07IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNi1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBwcm9jZXNzaW5nQ2hpbGRDb250ZXh0ID0gZmFsc2U7XG5cbiAgdmFyIHdhcm5JbnZhbGlkU2V0U3RhdGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFwcm9jZXNzaW5nQ2hpbGRDb250ZXh0LCAnc2V0U3RhdGUoLi4uKTogQ2Fubm90IGNhbGwgc2V0U3RhdGUoKSBpbnNpZGUgZ2V0Q2hpbGRDb250ZXh0KCknKSA6IHZvaWQgMDtcbiAgfTtcbn1cblxudmFyIFJlYWN0SW52YWxpZFNldFN0YXRlV2FybmluZ0hvb2sgPSB7XG4gIG9uQmVnaW5Qcm9jZXNzaW5nQ2hpbGRDb250ZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgcHJvY2Vzc2luZ0NoaWxkQ29udGV4dCA9IHRydWU7XG4gIH0sXG4gIG9uRW5kUHJvY2Vzc2luZ0NoaWxkQ29udGV4dDogZnVuY3Rpb24gKCkge1xuICAgIHByb2Nlc3NpbmdDaGlsZENvbnRleHQgPSBmYWxzZTtcbiAgfSxcbiAgb25TZXRTdGF0ZTogZnVuY3Rpb24gKCkge1xuICAgIHdhcm5JbnZhbGlkU2V0U3RhdGUoKTtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEludmFsaWRTZXRTdGF0ZVdhcm5pbmdIb29rOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBhZGxlcjMyID0gcmVxdWlyZSgnLi9hZGxlcjMyJyk7XG5cbnZhciBUQUdfRU5EID0gL1xcLz8+LztcbnZhciBDT01NRU5UX1NUQVJUID0gL148XFwhXFwtXFwtLztcblxudmFyIFJlYWN0TWFya3VwQ2hlY2tzdW0gPSB7XG4gIENIRUNLU1VNX0FUVFJfTkFNRTogJ2RhdGEtcmVhY3QtY2hlY2tzdW0nLFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWFya3VwIE1hcmt1cCBzdHJpbmdcbiAgICogQHJldHVybiB7c3RyaW5nfSBNYXJrdXAgc3RyaW5nIHdpdGggY2hlY2tzdW0gYXR0cmlidXRlIGF0dGFjaGVkXG4gICAqL1xuICBhZGRDaGVja3N1bVRvTWFya3VwOiBmdW5jdGlvbiAobWFya3VwKSB7XG4gICAgdmFyIGNoZWNrc3VtID0gYWRsZXIzMihtYXJrdXApO1xuXG4gICAgLy8gQWRkIGNoZWNrc3VtIChoYW5kbGUgYm90aCBwYXJlbnQgdGFncywgY29tbWVudHMgYW5kIHNlbGYtY2xvc2luZyB0YWdzKVxuICAgIGlmIChDT01NRU5UX1NUQVJULnRlc3QobWFya3VwKSkge1xuICAgICAgcmV0dXJuIG1hcmt1cDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1hcmt1cC5yZXBsYWNlKFRBR19FTkQsICcgJyArIFJlYWN0TWFya3VwQ2hlY2tzdW0uQ0hFQ0tTVU1fQVRUUl9OQU1FICsgJz1cIicgKyBjaGVja3N1bSArICdcIiQmJyk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWFya3VwIHRvIHVzZVxuICAgKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGVsZW1lbnQgcm9vdCBSZWFjdCBlbGVtZW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIG9yIG5vdCB0aGUgbWFya3VwIGlzIHRoZSBzYW1lXG4gICAqL1xuICBjYW5SZXVzZU1hcmt1cDogZnVuY3Rpb24gKG1hcmt1cCwgZWxlbWVudCkge1xuICAgIHZhciBleGlzdGluZ0NoZWNrc3VtID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoUmVhY3RNYXJrdXBDaGVja3N1bS5DSEVDS1NVTV9BVFRSX05BTUUpO1xuICAgIGV4aXN0aW5nQ2hlY2tzdW0gPSBleGlzdGluZ0NoZWNrc3VtICYmIHBhcnNlSW50KGV4aXN0aW5nQ2hlY2tzdW0sIDEwKTtcbiAgICB2YXIgbWFya3VwQ2hlY2tzdW0gPSBhZGxlcjMyKG1hcmt1cCk7XG4gICAgcmV0dXJuIG1hcmt1cENoZWNrc3VtID09PSBleGlzdGluZ0NoZWNrc3VtO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0TWFya3VwQ2hlY2tzdW07IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIERPTUxhenlUcmVlID0gcmVxdWlyZSgnLi9ET01MYXp5VHJlZScpO1xudmFyIERPTVByb3BlcnR5ID0gcmVxdWlyZSgnLi9ET01Qcm9wZXJ0eScpO1xudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Jyk7XG52YXIgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnLi9SZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXInKTtcbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdEN1cnJlbnRPd25lcicpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RET01Db250YWluZXJJbmZvID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbnRhaW5lckluZm8nKTtcbnZhciBSZWFjdERPTUZlYXR1cmVGbGFncyA9IHJlcXVpcmUoJy4vUmVhY3RET01GZWF0dXJlRmxhZ3MnKTtcbnZhciBSZWFjdEZlYXR1cmVGbGFncyA9IHJlcXVpcmUoJy4vUmVhY3RGZWF0dXJlRmxhZ3MnKTtcbnZhciBSZWFjdEluc3RhbmNlTWFwID0gcmVxdWlyZSgnLi9SZWFjdEluc3RhbmNlTWFwJyk7XG52YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7XG52YXIgUmVhY3RNYXJrdXBDaGVja3N1bSA9IHJlcXVpcmUoJy4vUmVhY3RNYXJrdXBDaGVja3N1bScpO1xudmFyIFJlYWN0UmVjb25jaWxlciA9IHJlcXVpcmUoJy4vUmVhY3RSZWNvbmNpbGVyJyk7XG52YXIgUmVhY3RVcGRhdGVRdWV1ZSA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVRdWV1ZScpO1xudmFyIFJlYWN0VXBkYXRlcyA9IHJlcXVpcmUoJy4vUmVhY3RVcGRhdGVzJyk7XG5cbnZhciBlbXB0eU9iamVjdCA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5T2JqZWN0Jyk7XG52YXIgaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCcpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHNldElubmVySFRNTCA9IHJlcXVpcmUoJy4vc2V0SW5uZXJIVE1MJyk7XG52YXIgc2hvdWxkVXBkYXRlUmVhY3RDb21wb25lbnQgPSByZXF1aXJlKCcuL3Nob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIEFUVFJfTkFNRSA9IERPTVByb3BlcnR5LklEX0FUVFJJQlVURV9OQU1FO1xudmFyIFJPT1RfQVRUUl9OQU1FID0gRE9NUHJvcGVydHkuUk9PVF9BVFRSSUJVVEVfTkFNRTtcblxudmFyIEVMRU1FTlRfTk9ERV9UWVBFID0gMTtcbnZhciBET0NfTk9ERV9UWVBFID0gOTtcbnZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFX1RZUEUgPSAxMTtcblxudmFyIGluc3RhbmNlc0J5UmVhY3RSb290SUQgPSB7fTtcblxuLyoqXG4gKiBGaW5kcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlclxuICogdGhhdCdzIG5vdCBjb21tb24gYmV0d2VlbiB0aGUgdHdvIGdpdmVuIHN0cmluZ3MuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSB0aGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciB3aGVyZSB0aGUgc3RyaW5ncyBkaXZlcmdlXG4gKi9cbmZ1bmN0aW9uIGZpcnN0RGlmZmVyZW5jZUluZGV4KHN0cmluZzEsIHN0cmluZzIpIHtcbiAgdmFyIG1pbkxlbiA9IE1hdGgubWluKHN0cmluZzEubGVuZ3RoLCBzdHJpbmcyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbWluTGVuOyBpKyspIHtcbiAgICBpZiAoc3RyaW5nMS5jaGFyQXQoaSkgIT09IHN0cmluZzIuY2hhckF0KGkpKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cmluZzEubGVuZ3RoID09PSBzdHJpbmcyLmxlbmd0aCA/IC0xIDogbWluTGVuO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7RE9NRWxlbWVudHxET01Eb2N1bWVudH0gY29udGFpbmVyIERPTSBlbGVtZW50IHRoYXQgbWF5IGNvbnRhaW5cbiAqIGEgUmVhY3QgY29tcG9uZW50XG4gKiBAcmV0dXJuIHs/Kn0gRE9NIGVsZW1lbnQgdGhhdCBtYXkgaGF2ZSB0aGUgcmVhY3RSb290IElELCBvciBudWxsLlxuICovXG5mdW5jdGlvbiBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKSB7XG4gIGlmICghY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoY29udGFpbmVyLm5vZGVUeXBlID09PSBET0NfTk9ERV9UWVBFKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5kb2N1bWVudEVsZW1lbnQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lci5maXJzdENoaWxkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGludGVybmFsR2V0SUQobm9kZSkge1xuICAvLyBJZiBub2RlIGlzIHNvbWV0aGluZyBsaWtlIGEgd2luZG93LCBkb2N1bWVudCwgb3IgdGV4dCBub2RlLCBub25lIG9mXG4gIC8vIHdoaWNoIHN1cHBvcnQgYXR0cmlidXRlcyBvciBhIC5nZXRBdHRyaWJ1dGUgbWV0aG9kLCBncmFjZWZ1bGx5IHJldHVyblxuICAvLyB0aGUgZW1wdHkgc3RyaW5nLCBhcyBpZiB0aGUgYXR0cmlidXRlIHdlcmUgbWlzc2luZy5cbiAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSkgfHwgJyc7XG59XG5cbi8qKlxuICogTW91bnRzIHRoaXMgY29tcG9uZW50IGFuZCBpbnNlcnRzIGl0IGludG8gdGhlIERPTS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjb21wb25lbnRJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdG8gbW91bnQuXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBET00gZWxlbWVudCB0byBtb3VudCBpbnRvLlxuICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRSZXVzZU1hcmt1cCBJZiB0cnVlLCBkbyBub3QgaW5zZXJ0IG1hcmt1cFxuICovXG5mdW5jdGlvbiBtb3VudENvbXBvbmVudEludG9Ob2RlKHdyYXBwZXJJbnN0YW5jZSwgY29udGFpbmVyLCB0cmFuc2FjdGlvbiwgc2hvdWxkUmV1c2VNYXJrdXAsIGNvbnRleHQpIHtcbiAgdmFyIG1hcmtlck5hbWU7XG4gIGlmIChSZWFjdEZlYXR1cmVGbGFncy5sb2dUb3BMZXZlbFJlbmRlcnMpIHtcbiAgICB2YXIgd3JhcHBlZEVsZW1lbnQgPSB3cmFwcGVySW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50LnByb3BzLmNoaWxkO1xuICAgIHZhciB0eXBlID0gd3JhcHBlZEVsZW1lbnQudHlwZTtcbiAgICBtYXJrZXJOYW1lID0gJ1JlYWN0IG1vdW50OiAnICsgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyA/IHR5cGUgOiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSk7XG4gICAgY29uc29sZS50aW1lKG1hcmtlck5hbWUpO1xuICB9XG5cbiAgdmFyIG1hcmt1cCA9IFJlYWN0UmVjb25jaWxlci5tb3VudENvbXBvbmVudCh3cmFwcGVySW5zdGFuY2UsIHRyYW5zYWN0aW9uLCBudWxsLCBSZWFjdERPTUNvbnRhaW5lckluZm8od3JhcHBlckluc3RhbmNlLCBjb250YWluZXIpLCBjb250ZXh0LCAwIC8qIHBhcmVudERlYnVnSUQgKi9cbiAgKTtcblxuICBpZiAobWFya2VyTmFtZSkge1xuICAgIGNvbnNvbGUudGltZUVuZChtYXJrZXJOYW1lKTtcbiAgfVxuXG4gIHdyYXBwZXJJbnN0YW5jZS5fcmVuZGVyZWRDb21wb25lbnQuX3RvcExldmVsV3JhcHBlciA9IHdyYXBwZXJJbnN0YW5jZTtcbiAgUmVhY3RNb3VudC5fbW91bnRJbWFnZUludG9Ob2RlKG1hcmt1cCwgY29udGFpbmVyLCB3cmFwcGVySW5zdGFuY2UsIHNob3VsZFJldXNlTWFya3VwLCB0cmFuc2FjdGlvbik7XG59XG5cbi8qKlxuICogQmF0Y2hlZCBtb3VudC5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjb21wb25lbnRJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdG8gbW91bnQuXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBET00gZWxlbWVudCB0byBtb3VudCBpbnRvLlxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRSZXVzZU1hcmt1cCBJZiB0cnVlLCBkbyBub3QgaW5zZXJ0IG1hcmt1cFxuICovXG5mdW5jdGlvbiBiYXRjaGVkTW91bnRDb21wb25lbnRJbnRvTm9kZShjb21wb25lbnRJbnN0YW5jZSwgY29udGFpbmVyLCBzaG91bGRSZXVzZU1hcmt1cCwgY29udGV4dCkge1xuICB2YXIgdHJhbnNhY3Rpb24gPSBSZWFjdFVwZGF0ZXMuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5nZXRQb29sZWQoXG4gIC8qIHVzZUNyZWF0ZUVsZW1lbnQgKi9cbiAgIXNob3VsZFJldXNlTWFya3VwICYmIFJlYWN0RE9NRmVhdHVyZUZsYWdzLnVzZUNyZWF0ZUVsZW1lbnQpO1xuICB0cmFuc2FjdGlvbi5wZXJmb3JtKG1vdW50Q29tcG9uZW50SW50b05vZGUsIG51bGwsIGNvbXBvbmVudEluc3RhbmNlLCBjb250YWluZXIsIHRyYW5zYWN0aW9uLCBzaG91bGRSZXVzZU1hcmt1cCwgY29udGV4dCk7XG4gIFJlYWN0VXBkYXRlcy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uLnJlbGVhc2UodHJhbnNhY3Rpb24pO1xufVxuXG4vKipcbiAqIFVubW91bnRzIGEgY29tcG9uZW50IGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIERPTS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBpbnN0YW5jZSBSZWFjdCBjb21wb25lbnQgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR9IGNvbnRhaW5lciBET00gZWxlbWVudCB0byB1bm1vdW50IGZyb20uXG4gKiBAZmluYWxcbiAqIEBpbnRlcm5hbFxuICogQHNlZSB7UmVhY3RNb3VudC51bm1vdW50Q29tcG9uZW50QXROb2RlfVxuICovXG5mdW5jdGlvbiB1bm1vdW50Q29tcG9uZW50RnJvbU5vZGUoaW5zdGFuY2UsIGNvbnRhaW5lciwgc2FmZWx5KSB7XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZ2luRmx1c2goKTtcbiAgfVxuICBSZWFjdFJlY29uY2lsZXIudW5tb3VudENvbXBvbmVudChpbnN0YW5jZSwgc2FmZWx5KTtcbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uRW5kRmx1c2goKTtcbiAgfVxuXG4gIGlmIChjb250YWluZXIubm9kZVR5cGUgPT09IERPQ19OT0RFX1RZUEUpIHtcbiAgICBjb250YWluZXIgPSBjb250YWluZXIuZG9jdW1lbnRFbGVtZW50O1xuICB9XG5cbiAgLy8gaHR0cDovL2pzcGVyZi5jb20vZW1wdHlpbmctYS1ub2RlXG4gIHdoaWxlIChjb250YWluZXIubGFzdENoaWxkKSB7XG4gICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGNvbnRhaW5lci5sYXN0Q2hpbGQpO1xuICB9XG59XG5cbi8qKlxuICogVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgRE9NIG5vZGUgaGFzIGEgZGlyZWN0IFJlYWN0LXJlbmRlcmVkIGNoaWxkIHRoYXQgaXNcbiAqIG5vdCBhIFJlYWN0IHJvb3QgZWxlbWVudC4gVXNlZnVsIGZvciB3YXJuaW5nIGluIGByZW5kZXJgLFxuICogYHVubW91bnRDb21wb25lbnRBdE5vZGVgLCBldGMuXG4gKlxuICogQHBhcmFtIHs/RE9NRWxlbWVudH0gbm9kZSBUaGUgY2FuZGlkYXRlIERPTSBub2RlLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgRE9NIGVsZW1lbnQgY29udGFpbnMgYSBkaXJlY3QgY2hpbGQgdGhhdCB3YXNcbiAqIHJlbmRlcmVkIGJ5IFJlYWN0IGJ1dCBpcyBub3QgYSByb290IGVsZW1lbnQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gaGFzTm9uUm9vdFJlYWN0Q2hpbGQoY29udGFpbmVyKSB7XG4gIHZhciByb290RWwgPSBnZXRSZWFjdFJvb3RFbGVtZW50SW5Db250YWluZXIoY29udGFpbmVyKTtcbiAgaWYgKHJvb3RFbCkge1xuICAgIHZhciBpbnN0ID0gUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUocm9vdEVsKTtcbiAgICByZXR1cm4gISEoaW5zdCAmJiBpbnN0Ll9ob3N0UGFyZW50KTtcbiAgfVxufVxuXG4vKipcbiAqIFRydWUgaWYgdGhlIHN1cHBsaWVkIERPTSBub2RlIGlzIGEgUmVhY3QgRE9NIGVsZW1lbnQgYW5kXG4gKiBpdCBoYXMgYmVlbiByZW5kZXJlZCBieSBhbm90aGVyIGNvcHkgb2YgUmVhY3QuXG4gKlxuICogQHBhcmFtIHs/RE9NRWxlbWVudH0gbm9kZSBUaGUgY2FuZGlkYXRlIERPTSBub2RlLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgRE9NIGhhcyBiZWVuIHJlbmRlcmVkIGJ5IGFub3RoZXIgY29weSBvZiBSZWFjdFxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIG5vZGVJc1JlbmRlcmVkQnlPdGhlckluc3RhbmNlKGNvbnRhaW5lcikge1xuICB2YXIgcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gIHJldHVybiAhIShyb290RWwgJiYgaXNSZWFjdE5vZGUocm9vdEVsKSAmJiAhUmVhY3RET01Db21wb25lbnRUcmVlLmdldEluc3RhbmNlRnJvbU5vZGUocm9vdEVsKSk7XG59XG5cbi8qKlxuICogVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgRE9NIG5vZGUgaXMgYSB2YWxpZCBub2RlIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHs/RE9NRWxlbWVudH0gbm9kZSBUaGUgY2FuZGlkYXRlIERPTSBub2RlLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgRE9NIGlzIGEgdmFsaWQgRE9NIG5vZGUuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gaXNWYWxpZENvbnRhaW5lcihub2RlKSB7XG4gIHJldHVybiAhIShub2RlICYmIChub2RlLm5vZGVUeXBlID09PSBFTEVNRU5UX05PREVfVFlQRSB8fCBub2RlLm5vZGVUeXBlID09PSBET0NfTk9ERV9UWVBFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREVfVFlQRSkpO1xufVxuXG4vKipcbiAqIFRydWUgaWYgdGhlIHN1cHBsaWVkIERPTSBub2RlIGlzIGEgdmFsaWQgUmVhY3Qgbm9kZSBlbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7P0RPTUVsZW1lbnR9IG5vZGUgVGhlIGNhbmRpZGF0ZSBET00gbm9kZS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIERPTSBpcyBhIHZhbGlkIFJlYWN0IERPTSBub2RlLlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGlzUmVhY3ROb2RlKG5vZGUpIHtcbiAgcmV0dXJuIGlzVmFsaWRDb250YWluZXIobm9kZSkgJiYgKG5vZGUuaGFzQXR0cmlidXRlKFJPT1RfQVRUUl9OQU1FKSB8fCBub2RlLmhhc0F0dHJpYnV0ZShBVFRSX05BTUUpKTtcbn1cblxuZnVuY3Rpb24gZ2V0SG9zdFJvb3RJbnN0YW5jZUluQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICB2YXIgcm9vdEVsID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gIHZhciBwcmV2SG9zdEluc3RhbmNlID0gcm9vdEVsICYmIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKHJvb3RFbCk7XG4gIHJldHVybiBwcmV2SG9zdEluc3RhbmNlICYmICFwcmV2SG9zdEluc3RhbmNlLl9ob3N0UGFyZW50ID8gcHJldkhvc3RJbnN0YW5jZSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGdldFRvcExldmVsV3JhcHBlckluQ29udGFpbmVyKGNvbnRhaW5lcikge1xuICB2YXIgcm9vdCA9IGdldEhvc3RSb290SW5zdGFuY2VJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICByZXR1cm4gcm9vdCA/IHJvb3QuX2hvc3RDb250YWluZXJJbmZvLl90b3BMZXZlbFdyYXBwZXIgOiBudWxsO1xufVxuXG4vKipcbiAqIFRlbXBvcmFyeSAoPykgaGFjayBzbyB0aGF0IHdlIGNhbiBzdG9yZSBhbGwgdG9wLWxldmVsIHBlbmRpbmcgdXBkYXRlcyBvblxuICogY29tcG9zaXRlcyBpbnN0ZWFkIG9mIGhhdmluZyB0byB3b3JyeSBhYm91dCBkaWZmZXJlbnQgdHlwZXMgb2YgY29tcG9uZW50c1xuICogaGVyZS5cbiAqL1xudmFyIHRvcExldmVsUm9vdENvdW50ZXIgPSAxO1xudmFyIFRvcExldmVsV3JhcHBlciA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5yb290SUQgPSB0b3BMZXZlbFJvb3RDb3VudGVyKys7XG59O1xuVG9wTGV2ZWxXcmFwcGVyLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50ID0ge307XG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgVG9wTGV2ZWxXcmFwcGVyLmRpc3BsYXlOYW1lID0gJ1RvcExldmVsV3JhcHBlcic7XG59XG5Ub3BMZXZlbFdyYXBwZXIucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGQ7XG59O1xuVG9wTGV2ZWxXcmFwcGVyLmlzUmVhY3RUb3BMZXZlbFdyYXBwZXIgPSB0cnVlO1xuXG4vKipcbiAqIE1vdW50aW5nIGlzIHRoZSBwcm9jZXNzIG9mIGluaXRpYWxpemluZyBhIFJlYWN0IGNvbXBvbmVudCBieSBjcmVhdGluZyBpdHNcbiAqIHJlcHJlc2VudGF0aXZlIERPTSBlbGVtZW50cyBhbmQgaW5zZXJ0aW5nIHRoZW0gaW50byBhIHN1cHBsaWVkIGBjb250YWluZXJgLlxuICogQW55IHByaW9yIGNvbnRlbnQgaW5zaWRlIGBjb250YWluZXJgIGlzIGRlc3Ryb3llZCBpbiB0aGUgcHJvY2Vzcy5cbiAqXG4gKiAgIFJlYWN0TW91bnQucmVuZGVyKFxuICogICAgIGNvbXBvbmVudCxcbiAqICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyJylcbiAqICAgKTtcbiAqXG4gKiAgIDxkaXYgaWQ9XCJjb250YWluZXJcIj4gICAgICAgICAgICAgICAgICAgPC0tIFN1cHBsaWVkIGBjb250YWluZXJgLlxuICogICAgIDxkaXYgZGF0YS1yZWFjdGlkPVwiLjNcIj4gICAgICAgICAgICAgIDwtLSBSZW5kZXJlZCByZWFjdFJvb3Qgb2YgUmVhY3RcbiAqICAgICAgIC8vIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5cbiAqICAgICA8L2Rpdj5cbiAqICAgPC9kaXY+XG4gKlxuICogSW5zaWRlIG9mIGBjb250YWluZXJgLCB0aGUgZmlyc3QgZWxlbWVudCByZW5kZXJlZCBpcyB0aGUgXCJyZWFjdFJvb3RcIi5cbiAqL1xudmFyIFJlYWN0TW91bnQgPSB7XG5cbiAgVG9wTGV2ZWxXcmFwcGVyOiBUb3BMZXZlbFdyYXBwZXIsXG5cbiAgLyoqXG4gICAqIFVzZWQgYnkgZGV2dG9vbHMuIFRoZSBrZXlzIGFyZSBub3QgaW1wb3J0YW50LlxuICAgKi9cbiAgX2luc3RhbmNlc0J5UmVhY3RSb290SUQ6IGluc3RhbmNlc0J5UmVhY3RSb290SUQsXG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYSBob29rIHByb3ZpZGVkIHRvIHN1cHBvcnQgcmVuZGVyaW5nIFJlYWN0IGNvbXBvbmVudHMgd2hpbGVcbiAgICogZW5zdXJpbmcgdGhhdCB0aGUgYXBwYXJlbnQgc2Nyb2xsIHBvc2l0aW9uIG9mIGl0cyBgY29udGFpbmVyYCBkb2VzIG5vdFxuICAgKiBjaGFuZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIFRoZSBgY29udGFpbmVyYCBiZWluZyByZW5kZXJlZCBpbnRvLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSByZW5kZXJDYWxsYmFjayBUaGlzIG11c3QgYmUgY2FsbGVkIG9uY2UgdG8gZG8gdGhlIHJlbmRlci5cbiAgICovXG4gIHNjcm9sbE1vbml0b3I6IGZ1bmN0aW9uIChjb250YWluZXIsIHJlbmRlckNhbGxiYWNrKSB7XG4gICAgcmVuZGVyQ2FsbGJhY2soKTtcbiAgfSxcblxuICAvKipcbiAgICogVGFrZSBhIGNvbXBvbmVudCB0aGF0J3MgYWxyZWFkeSBtb3VudGVkIGludG8gdGhlIERPTSBhbmQgcmVwbGFjZSBpdHMgcHJvcHNcbiAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gcHJldkNvbXBvbmVudCBjb21wb25lbnQgaW5zdGFuY2UgYWxyZWFkeSBpbiB0aGUgRE9NXG4gICAqIEBwYXJhbSB7UmVhY3RFbGVtZW50fSBuZXh0RWxlbWVudCBjb21wb25lbnQgaW5zdGFuY2UgdG8gcmVuZGVyXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIGNvbnRhaW5lciB0byByZW5kZXIgaW50b1xuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgZnVuY3Rpb24gdHJpZ2dlcmVkIG9uIGNvbXBsZXRpb25cbiAgICovXG4gIF91cGRhdGVSb290Q29tcG9uZW50OiBmdW5jdGlvbiAocHJldkNvbXBvbmVudCwgbmV4dEVsZW1lbnQsIG5leHRDb250ZXh0LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gICAgUmVhY3RNb3VudC5zY3JvbGxNb25pdG9yKGNvbnRhaW5lciwgZnVuY3Rpb24gKCkge1xuICAgICAgUmVhY3RVcGRhdGVRdWV1ZS5lbnF1ZXVlRWxlbWVudEludGVybmFsKHByZXZDb21wb25lbnQsIG5leHRFbGVtZW50LCBuZXh0Q29udGV4dCk7XG4gICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgUmVhY3RVcGRhdGVRdWV1ZS5lbnF1ZXVlQ2FsbGJhY2tJbnRlcm5hbChwcmV2Q29tcG9uZW50LCBjYWxsYmFjayk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHJldkNvbXBvbmVudDtcbiAgfSxcblxuICAvKipcbiAgICogUmVuZGVyIGEgbmV3IGNvbXBvbmVudCBpbnRvIHRoZSBET00uIEhvb2tlZCBieSBob29rcyFcbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IG5leHRFbGVtZW50IGVsZW1lbnQgdG8gcmVuZGVyXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIGNvbnRhaW5lciB0byByZW5kZXIgaW50b1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZFJldXNlTWFya3VwIGlmIHdlIHNob3VsZCBza2lwIHRoZSBtYXJrdXAgaW5zZXJ0aW9uXG4gICAqIEByZXR1cm4ge1JlYWN0Q29tcG9uZW50fSBuZXh0Q29tcG9uZW50XG4gICAqL1xuICBfcmVuZGVyTmV3Um9vdENvbXBvbmVudDogZnVuY3Rpb24gKG5leHRFbGVtZW50LCBjb250YWluZXIsIHNob3VsZFJldXNlTWFya3VwLCBjb250ZXh0KSB7XG4gICAgLy8gVmFyaW91cyBwYXJ0cyBvZiBvdXIgY29kZSAoc3VjaCBhcyBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCdzXG4gICAgLy8gX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCkgYXNzdW1lIHRoYXQgY2FsbHMgdG8gcmVuZGVyIGFyZW4ndCBuZXN0ZWQ7XG4gICAgLy8gdmVyaWZ5IHRoYXQgdGhhdCdzIHRoZSBjYXNlLlxuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID09IG51bGwsICdfcmVuZGVyTmV3Um9vdENvbXBvbmVudCgpOiBSZW5kZXIgbWV0aG9kcyBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uICcgKyAnb2YgcHJvcHMgYW5kIHN0YXRlOyB0cmlnZ2VyaW5nIG5lc3RlZCBjb21wb25lbnQgdXBkYXRlcyBmcm9tICcgKyAncmVuZGVyIGlzIG5vdCBhbGxvd2VkLiBJZiBuZWNlc3NhcnksIHRyaWdnZXIgbmVzdGVkIHVwZGF0ZXMgaW4gJyArICdjb21wb25lbnREaWRVcGRhdGUuIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICVzLicsIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgJiYgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5nZXROYW1lKCkgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7XG5cbiAgICAhaXNWYWxpZENvbnRhaW5lcihjb250YWluZXIpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdfcmVnaXN0ZXJDb21wb25lbnQoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKSA6IF9wcm9kSW52YXJpYW50KCczNycpIDogdm9pZCAwO1xuXG4gICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLmVuc3VyZVNjcm9sbFZhbHVlTW9uaXRvcmluZygpO1xuICAgIHZhciBjb21wb25lbnRJbnN0YW5jZSA9IGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQobmV4dEVsZW1lbnQsIGZhbHNlKTtcblxuICAgIC8vIFRoZSBpbml0aWFsIHJlbmRlciBpcyBzeW5jaHJvbm91cyBidXQgYW55IHVwZGF0ZXMgdGhhdCBoYXBwZW4gZHVyaW5nXG4gICAgLy8gcmVuZGVyaW5nLCBpbiBjb21wb25lbnRXaWxsTW91bnQgb3IgY29tcG9uZW50RGlkTW91bnQsIHdpbGwgYmUgYmF0Y2hlZFxuICAgIC8vIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBiYXRjaGluZyBzdHJhdGVneS5cblxuICAgIFJlYWN0VXBkYXRlcy5iYXRjaGVkVXBkYXRlcyhiYXRjaGVkTW91bnRDb21wb25lbnRJbnRvTm9kZSwgY29tcG9uZW50SW5zdGFuY2UsIGNvbnRhaW5lciwgc2hvdWxkUmV1c2VNYXJrdXAsIGNvbnRleHQpO1xuXG4gICAgdmFyIHdyYXBwZXJJRCA9IGNvbXBvbmVudEluc3RhbmNlLl9pbnN0YW5jZS5yb290SUQ7XG4gICAgaW5zdGFuY2VzQnlSZWFjdFJvb3RJRFt3cmFwcGVySURdID0gY29tcG9uZW50SW5zdGFuY2U7XG5cbiAgICByZXR1cm4gY29tcG9uZW50SW5zdGFuY2U7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgYSBSZWFjdCBjb21wb25lbnQgaW50byB0aGUgRE9NIGluIHRoZSBzdXBwbGllZCBgY29udGFpbmVyYC5cbiAgICpcbiAgICogSWYgdGhlIFJlYWN0IGNvbXBvbmVudCB3YXMgcHJldmlvdXNseSByZW5kZXJlZCBpbnRvIGBjb250YWluZXJgLCB0aGlzIHdpbGxcbiAgICogcGVyZm9ybSBhbiB1cGRhdGUgb24gaXQgYW5kIG9ubHkgbXV0YXRlIHRoZSBET00gYXMgbmVjZXNzYXJ5IHRvIHJlZmxlY3QgdGhlXG4gICAqIGxhdGVzdCBSZWFjdCBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IHBhcmVudENvbXBvbmVudCBUaGUgY29uY2VwdHVhbCBwYXJlbnQgb2YgdGhpcyByZW5kZXIgdHJlZS5cbiAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IG5leHRFbGVtZW50IENvbXBvbmVudCBlbGVtZW50IHRvIHJlbmRlci5cbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBjb250YWluZXIgRE9NIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBmdW5jdGlvbiB0cmlnZ2VyZWQgb24gY29tcGxldGlvblxuICAgKiBAcmV0dXJuIHtSZWFjdENvbXBvbmVudH0gQ29tcG9uZW50IGluc3RhbmNlIHJlbmRlcmVkIGluIGBjb250YWluZXJgLlxuICAgKi9cbiAgcmVuZGVyU3VidHJlZUludG9Db250YWluZXI6IGZ1bmN0aW9uIChwYXJlbnRDb21wb25lbnQsIG5leHRFbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gICAgIShwYXJlbnRDb21wb25lbnQgIT0gbnVsbCAmJiBSZWFjdEluc3RhbmNlTWFwLmhhcyhwYXJlbnRDb21wb25lbnQpKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAncGFyZW50Q29tcG9uZW50IG11c3QgYmUgYSB2YWxpZCBSZWFjdCBDb21wb25lbnQnKSA6IF9wcm9kSW52YXJpYW50KCczOCcpIDogdm9pZCAwO1xuICAgIHJldHVybiBSZWFjdE1vdW50Ll9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcihwYXJlbnRDb21wb25lbnQsIG5leHRFbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKTtcbiAgfSxcblxuICBfcmVuZGVyU3VidHJlZUludG9Db250YWluZXI6IGZ1bmN0aW9uIChwYXJlbnRDb21wb25lbnQsIG5leHRFbGVtZW50LCBjb250YWluZXIsIGNhbGxiYWNrKSB7XG4gICAgUmVhY3RVcGRhdGVRdWV1ZS52YWxpZGF0ZUNhbGxiYWNrKGNhbGxiYWNrLCAnUmVhY3RET00ucmVuZGVyJyk7XG4gICAgIVJlYWN0LmlzVmFsaWRFbGVtZW50KG5leHRFbGVtZW50KSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RET00ucmVuZGVyKCk6IEludmFsaWQgY29tcG9uZW50IGVsZW1lbnQuJXMnLCB0eXBlb2YgbmV4dEVsZW1lbnQgPT09ICdzdHJpbmcnID8gJyBJbnN0ZWFkIG9mIHBhc3NpbmcgYSBzdHJpbmcgbGlrZSBcXCdkaXZcXCcsIHBhc3MgJyArICdSZWFjdC5jcmVhdGVFbGVtZW50KFxcJ2RpdlxcJykgb3IgPGRpdiAvPi4nIDogdHlwZW9mIG5leHRFbGVtZW50ID09PSAnZnVuY3Rpb24nID8gJyBJbnN0ZWFkIG9mIHBhc3NpbmcgYSBjbGFzcyBsaWtlIEZvbywgcGFzcyAnICsgJ1JlYWN0LmNyZWF0ZUVsZW1lbnQoRm9vKSBvciA8Rm9vIC8+LicgOlxuICAgIC8vIENoZWNrIGlmIGl0IHF1YWNrcyBsaWtlIGFuIGVsZW1lbnRcbiAgICBuZXh0RWxlbWVudCAhPSBudWxsICYmIG5leHRFbGVtZW50LnByb3BzICE9PSB1bmRlZmluZWQgPyAnIFRoaXMgbWF5IGJlIGNhdXNlZCBieSB1bmludGVudGlvbmFsbHkgbG9hZGluZyB0d28gaW5kZXBlbmRlbnQgJyArICdjb3BpZXMgb2YgUmVhY3QuJyA6ICcnKSA6IF9wcm9kSW52YXJpYW50KCczOScsIHR5cGVvZiBuZXh0RWxlbWVudCA9PT0gJ3N0cmluZycgPyAnIEluc3RlYWQgb2YgcGFzc2luZyBhIHN0cmluZyBsaWtlIFxcJ2RpdlxcJywgcGFzcyAnICsgJ1JlYWN0LmNyZWF0ZUVsZW1lbnQoXFwnZGl2XFwnKSBvciA8ZGl2IC8+LicgOiB0eXBlb2YgbmV4dEVsZW1lbnQgPT09ICdmdW5jdGlvbicgPyAnIEluc3RlYWQgb2YgcGFzc2luZyBhIGNsYXNzIGxpa2UgRm9vLCBwYXNzICcgKyAnUmVhY3QuY3JlYXRlRWxlbWVudChGb28pIG9yIDxGb28gLz4uJyA6IG5leHRFbGVtZW50ICE9IG51bGwgJiYgbmV4dEVsZW1lbnQucHJvcHMgIT09IHVuZGVmaW5lZCA/ICcgVGhpcyBtYXkgYmUgY2F1c2VkIGJ5IHVuaW50ZW50aW9uYWxseSBsb2FkaW5nIHR3byBpbmRlcGVuZGVudCAnICsgJ2NvcGllcyBvZiBSZWFjdC4nIDogJycpIDogdm9pZCAwO1xuXG4gICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFjb250YWluZXIgfHwgIWNvbnRhaW5lci50YWdOYW1lIHx8IGNvbnRhaW5lci50YWdOYW1lLnRvVXBwZXJDYXNlKCkgIT09ICdCT0RZJywgJ3JlbmRlcigpOiBSZW5kZXJpbmcgY29tcG9uZW50cyBkaXJlY3RseSBpbnRvIGRvY3VtZW50LmJvZHkgaXMgJyArICdkaXNjb3VyYWdlZCwgc2luY2UgaXRzIGNoaWxkcmVuIGFyZSBvZnRlbiBtYW5pcHVsYXRlZCBieSB0aGlyZC1wYXJ0eSAnICsgJ3NjcmlwdHMgYW5kIGJyb3dzZXIgZXh0ZW5zaW9ucy4gVGhpcyBtYXkgbGVhZCB0byBzdWJ0bGUgJyArICdyZWNvbmNpbGlhdGlvbiBpc3N1ZXMuIFRyeSByZW5kZXJpbmcgaW50byBhIGNvbnRhaW5lciBlbGVtZW50IGNyZWF0ZWQgJyArICdmb3IgeW91ciBhcHAuJykgOiB2b2lkIDA7XG5cbiAgICB2YXIgbmV4dFdyYXBwZWRFbGVtZW50ID0gUmVhY3QuY3JlYXRlRWxlbWVudChUb3BMZXZlbFdyYXBwZXIsIHsgY2hpbGQ6IG5leHRFbGVtZW50IH0pO1xuXG4gICAgdmFyIG5leHRDb250ZXh0O1xuICAgIGlmIChwYXJlbnRDb21wb25lbnQpIHtcbiAgICAgIHZhciBwYXJlbnRJbnN0ID0gUmVhY3RJbnN0YW5jZU1hcC5nZXQocGFyZW50Q29tcG9uZW50KTtcbiAgICAgIG5leHRDb250ZXh0ID0gcGFyZW50SW5zdC5fcHJvY2Vzc0NoaWxkQ29udGV4dChwYXJlbnRJbnN0Ll9jb250ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dENvbnRleHQgPSBlbXB0eU9iamVjdDtcbiAgICB9XG5cbiAgICB2YXIgcHJldkNvbXBvbmVudCA9IGdldFRvcExldmVsV3JhcHBlckluQ29udGFpbmVyKGNvbnRhaW5lcik7XG5cbiAgICBpZiAocHJldkNvbXBvbmVudCkge1xuICAgICAgdmFyIHByZXZXcmFwcGVkRWxlbWVudCA9IHByZXZDb21wb25lbnQuX2N1cnJlbnRFbGVtZW50O1xuICAgICAgdmFyIHByZXZFbGVtZW50ID0gcHJldldyYXBwZWRFbGVtZW50LnByb3BzLmNoaWxkO1xuICAgICAgaWYgKHNob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50KHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCkpIHtcbiAgICAgICAgdmFyIHB1YmxpY0luc3QgPSBwcmV2Q29tcG9uZW50Ll9yZW5kZXJlZENvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpO1xuICAgICAgICB2YXIgdXBkYXRlZENhbGxiYWNrID0gY2FsbGJhY2sgJiYgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNhbGxiYWNrLmNhbGwocHVibGljSW5zdCk7XG4gICAgICAgIH07XG4gICAgICAgIFJlYWN0TW91bnQuX3VwZGF0ZVJvb3RDb21wb25lbnQocHJldkNvbXBvbmVudCwgbmV4dFdyYXBwZWRFbGVtZW50LCBuZXh0Q29udGV4dCwgY29udGFpbmVyLCB1cGRhdGVkQ2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gcHVibGljSW5zdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFJlYWN0TW91bnQudW5tb3VudENvbXBvbmVudEF0Tm9kZShjb250YWluZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciByZWFjdFJvb3RFbGVtZW50ID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgdmFyIGNvbnRhaW5lckhhc1JlYWN0TWFya3VwID0gcmVhY3RSb290RWxlbWVudCAmJiAhIWludGVybmFsR2V0SUQocmVhY3RSb290RWxlbWVudCk7XG4gICAgdmFyIGNvbnRhaW5lckhhc05vblJvb3RSZWFjdENoaWxkID0gaGFzTm9uUm9vdFJlYWN0Q2hpbGQoY29udGFpbmVyKTtcblxuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFjb250YWluZXJIYXNOb25Sb290UmVhY3RDaGlsZCwgJ3JlbmRlciguLi4pOiBSZXBsYWNpbmcgUmVhY3QtcmVuZGVyZWQgY2hpbGRyZW4gd2l0aCBhIG5ldyByb290ICcgKyAnY29tcG9uZW50LiBJZiB5b3UgaW50ZW5kZWQgdG8gdXBkYXRlIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsICcgKyAneW91IHNob3VsZCBpbnN0ZWFkIGhhdmUgdGhlIGV4aXN0aW5nIGNoaWxkcmVuIHVwZGF0ZSB0aGVpciBzdGF0ZSAnICsgJ2FuZCByZW5kZXIgdGhlIG5ldyBjb21wb25lbnRzIGluc3RlYWQgb2YgY2FsbGluZyBSZWFjdERPTS5yZW5kZXIuJykgOiB2b2lkIDA7XG5cbiAgICAgIGlmICghY29udGFpbmVySGFzUmVhY3RNYXJrdXAgfHwgcmVhY3RSb290RWxlbWVudC5uZXh0U2libGluZykge1xuICAgICAgICB2YXIgcm9vdEVsZW1lbnRTaWJsaW5nID0gcmVhY3RSb290RWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHJvb3RFbGVtZW50U2libGluZykge1xuICAgICAgICAgIGlmIChpbnRlcm5hbEdldElEKHJvb3RFbGVtZW50U2libGluZykpIHtcbiAgICAgICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ3JlbmRlcigpOiBUYXJnZXQgbm9kZSBoYXMgbWFya3VwIHJlbmRlcmVkIGJ5IFJlYWN0LCBidXQgdGhlcmUgJyArICdhcmUgdW5yZWxhdGVkIG5vZGVzIGFzIHdlbGwuIFRoaXMgaXMgbW9zdCBjb21tb25seSBjYXVzZWQgYnkgJyArICd3aGl0ZS1zcGFjZSBpbnNlcnRlZCBhcm91bmQgc2VydmVyLXJlbmRlcmVkIG1hcmt1cC4nKSA6IHZvaWQgMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICByb290RWxlbWVudFNpYmxpbmcgPSByb290RWxlbWVudFNpYmxpbmcubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc2hvdWxkUmV1c2VNYXJrdXAgPSBjb250YWluZXJIYXNSZWFjdE1hcmt1cCAmJiAhcHJldkNvbXBvbmVudCAmJiAhY29udGFpbmVySGFzTm9uUm9vdFJlYWN0Q2hpbGQ7XG4gICAgdmFyIGNvbXBvbmVudCA9IFJlYWN0TW91bnQuX3JlbmRlck5ld1Jvb3RDb21wb25lbnQobmV4dFdyYXBwZWRFbGVtZW50LCBjb250YWluZXIsIHNob3VsZFJldXNlTWFya3VwLCBuZXh0Q29udGV4dCkuX3JlbmRlcmVkQ29tcG9uZW50LmdldFB1YmxpY0luc3RhbmNlKCk7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBjYWxsYmFjay5jYWxsKGNvbXBvbmVudCk7XG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgYSBSZWFjdCBjb21wb25lbnQgaW50byB0aGUgRE9NIGluIHRoZSBzdXBwbGllZCBgY29udGFpbmVyYC5cbiAgICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0ZG9tLnJlbmRlclxuICAgKlxuICAgKiBJZiB0aGUgUmVhY3QgY29tcG9uZW50IHdhcyBwcmV2aW91c2x5IHJlbmRlcmVkIGludG8gYGNvbnRhaW5lcmAsIHRoaXMgd2lsbFxuICAgKiBwZXJmb3JtIGFuIHVwZGF0ZSBvbiBpdCBhbmQgb25seSBtdXRhdGUgdGhlIERPTSBhcyBuZWNlc3NhcnkgdG8gcmVmbGVjdCB0aGVcbiAgICogbGF0ZXN0IFJlYWN0IGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdEVsZW1lbnR9IG5leHRFbGVtZW50IENvbXBvbmVudCBlbGVtZW50IHRvIHJlbmRlci5cbiAgICogQHBhcmFtIHtET01FbGVtZW50fSBjb250YWluZXIgRE9NIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBmdW5jdGlvbiB0cmlnZ2VyZWQgb24gY29tcGxldGlvblxuICAgKiBAcmV0dXJuIHtSZWFjdENvbXBvbmVudH0gQ29tcG9uZW50IGluc3RhbmNlIHJlbmRlcmVkIGluIGBjb250YWluZXJgLlxuICAgKi9cbiAgcmVuZGVyOiBmdW5jdGlvbiAobmV4dEVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gUmVhY3RNb3VudC5fcmVuZGVyU3VidHJlZUludG9Db250YWluZXIobnVsbCwgbmV4dEVsZW1lbnQsIGNvbnRhaW5lciwgY2FsbGJhY2spO1xuICB9LFxuXG4gIC8qKlxuICAgKiBVbm1vdW50cyBhbmQgZGVzdHJveXMgdGhlIFJlYWN0IGNvbXBvbmVudCByZW5kZXJlZCBpbiB0aGUgYGNvbnRhaW5lcmAuXG4gICAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdGRvbS51bm1vdW50Y29tcG9uZW50YXRub2RlXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gY29udGFpbmVyIERPTSBlbGVtZW50IGNvbnRhaW5pbmcgYSBSZWFjdCBjb21wb25lbnQuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYSBjb21wb25lbnQgd2FzIGZvdW5kIGluIGFuZCB1bm1vdW50ZWQgZnJvbVxuICAgKiAgICAgICAgICAgICAgICAgICBgY29udGFpbmVyYFxuICAgKi9cbiAgdW5tb3VudENvbXBvbmVudEF0Tm9kZTogZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICAgIC8vIFZhcmlvdXMgcGFydHMgb2Ygb3VyIGNvZGUgKHN1Y2ggYXMgUmVhY3RDb21wb3NpdGVDb21wb25lbnQnc1xuICAgIC8vIF9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQpIGFzc3VtZSB0aGF0IGNhbGxzIHRvIHJlbmRlciBhcmVuJ3QgbmVzdGVkO1xuICAgIC8vIHZlcmlmeSB0aGF0IHRoYXQncyB0aGUgY2FzZS4gKFN0cmljdGx5IHNwZWFraW5nLCB1bm1vdW50aW5nIHdvbid0IGNhdXNlIGFcbiAgICAvLyByZW5kZXIgYnV0IHdlIHN0aWxsIGRvbid0IGV4cGVjdCB0byBiZSBpbiBhIHJlbmRlciBjYWxsIGhlcmUuKVxuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50ID09IG51bGwsICd1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFJlbmRlciBtZXRob2RzIHNob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gJyArICdvZiBwcm9wcyBhbmQgc3RhdGU7IHRyaWdnZXJpbmcgbmVzdGVkIGNvbXBvbmVudCB1cGRhdGVzIGZyb20gcmVuZGVyICcgKyAnaXMgbm90IGFsbG93ZWQuIElmIG5lY2Vzc2FyeSwgdHJpZ2dlciBuZXN0ZWQgdXBkYXRlcyBpbiAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZS4gQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgJXMuJywgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCAmJiBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKSB8fCAnUmVhY3RDb21wb3NpdGVDb21wb25lbnQnKSA6IHZvaWQgMDtcblxuICAgICFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3VubW91bnRDb21wb25lbnRBdE5vZGUoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgYSBET00gZWxlbWVudC4nKSA6IF9wcm9kSW52YXJpYW50KCc0MCcpIDogdm9pZCAwO1xuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIW5vZGVJc1JlbmRlcmVkQnlPdGhlckluc3RhbmNlKGNvbnRhaW5lciksICd1bm1vdW50Q29tcG9uZW50QXROb2RlKCk6IFRoZSBub2RlIHlvdVxcJ3JlIGF0dGVtcHRpbmcgdG8gdW5tb3VudCAnICsgJ3dhcyByZW5kZXJlZCBieSBhbm90aGVyIGNvcHkgb2YgUmVhY3QuJykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgdmFyIHByZXZDb21wb25lbnQgPSBnZXRUb3BMZXZlbFdyYXBwZXJJbkNvbnRhaW5lcihjb250YWluZXIpO1xuICAgIGlmICghcHJldkNvbXBvbmVudCkge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIG5vZGUgYmVpbmcgdW5tb3VudGVkIHdhcyByZW5kZXJlZCBieSBSZWFjdCwgYnV0IGlzbid0IGFcbiAgICAgIC8vIHJvb3Qgbm9kZS5cbiAgICAgIHZhciBjb250YWluZXJIYXNOb25Sb290UmVhY3RDaGlsZCA9IGhhc05vblJvb3RSZWFjdENoaWxkKGNvbnRhaW5lcik7XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250YWluZXIgaXRzZWxmIGlzIGEgUmVhY3Qgcm9vdCBub2RlLlxuICAgICAgdmFyIGlzQ29udGFpbmVyUmVhY3RSb290ID0gY29udGFpbmVyLm5vZGVUeXBlID09PSAxICYmIGNvbnRhaW5lci5oYXNBdHRyaWJ1dGUoUk9PVF9BVFRSX05BTUUpO1xuXG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFjb250YWluZXJIYXNOb25Sb290UmVhY3RDaGlsZCwgJ3VubW91bnRDb21wb25lbnRBdE5vZGUoKTogVGhlIG5vZGUgeW91XFwncmUgYXR0ZW1wdGluZyB0byB1bm1vdW50ICcgKyAnd2FzIHJlbmRlcmVkIGJ5IFJlYWN0IGFuZCBpcyBub3QgYSB0b3AtbGV2ZWwgY29udGFpbmVyLiAlcycsIGlzQ29udGFpbmVyUmVhY3RSb290ID8gJ1lvdSBtYXkgaGF2ZSBhY2NpZGVudGFsbHkgcGFzc2VkIGluIGEgUmVhY3Qgcm9vdCBub2RlIGluc3RlYWQgJyArICdvZiBpdHMgY29udGFpbmVyLicgOiAnSW5zdGVhZCwgaGF2ZSB0aGUgcGFyZW50IGNvbXBvbmVudCB1cGRhdGUgaXRzIHN0YXRlIGFuZCAnICsgJ3JlcmVuZGVyIGluIG9yZGVyIHRvIHJlbW92ZSB0aGlzIGNvbXBvbmVudC4nKSA6IHZvaWQgMDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBkZWxldGUgaW5zdGFuY2VzQnlSZWFjdFJvb3RJRFtwcmV2Q29tcG9uZW50Ll9pbnN0YW5jZS5yb290SURdO1xuICAgIFJlYWN0VXBkYXRlcy5iYXRjaGVkVXBkYXRlcyh1bm1vdW50Q29tcG9uZW50RnJvbU5vZGUsIHByZXZDb21wb25lbnQsIGNvbnRhaW5lciwgZmFsc2UpO1xuICAgIHJldHVybiB0cnVlO1xuICB9LFxuXG4gIF9tb3VudEltYWdlSW50b05vZGU6IGZ1bmN0aW9uIChtYXJrdXAsIGNvbnRhaW5lciwgaW5zdGFuY2UsIHNob3VsZFJldXNlTWFya3VwLCB0cmFuc2FjdGlvbikge1xuICAgICFpc1ZhbGlkQ29udGFpbmVyKGNvbnRhaW5lcikgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ21vdW50Q29tcG9uZW50SW50b05vZGUoLi4uKTogVGFyZ2V0IGNvbnRhaW5lciBpcyBub3QgdmFsaWQuJykgOiBfcHJvZEludmFyaWFudCgnNDEnKSA6IHZvaWQgMDtcblxuICAgIGlmIChzaG91bGRSZXVzZU1hcmt1cCkge1xuICAgICAgdmFyIHJvb3RFbGVtZW50ID0gZ2V0UmVhY3RSb290RWxlbWVudEluQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gICAgICBpZiAoUmVhY3RNYXJrdXBDaGVja3N1bS5jYW5SZXVzZU1hcmt1cChtYXJrdXAsIHJvb3RFbGVtZW50KSkge1xuICAgICAgICBSZWFjdERPTUNvbXBvbmVudFRyZWUucHJlY2FjaGVOb2RlKGluc3RhbmNlLCByb290RWxlbWVudCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBjaGVja3N1bSA9IHJvb3RFbGVtZW50LmdldEF0dHJpYnV0ZShSZWFjdE1hcmt1cENoZWNrc3VtLkNIRUNLU1VNX0FUVFJfTkFNRSk7XG4gICAgICAgIHJvb3RFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShSZWFjdE1hcmt1cENoZWNrc3VtLkNIRUNLU1VNX0FUVFJfTkFNRSk7XG5cbiAgICAgICAgdmFyIHJvb3RNYXJrdXAgPSByb290RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgIHJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZShSZWFjdE1hcmt1cENoZWNrc3VtLkNIRUNLU1VNX0FUVFJfTkFNRSwgY2hlY2tzdW0pO1xuXG4gICAgICAgIHZhciBub3JtYWxpemVkTWFya3VwID0gbWFya3VwO1xuICAgICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAvLyBiZWNhdXNlIHJvb3RNYXJrdXAgaXMgcmV0cmlldmVkIGZyb20gdGhlIERPTSwgdmFyaW91cyBub3JtYWxpemF0aW9uc1xuICAgICAgICAgIC8vIHdpbGwgaGF2ZSBvY2N1cnJlZCB3aGljaCB3aWxsIG5vdCBiZSBwcmVzZW50IGluIGBtYXJrdXBgLiBIZXJlLFxuICAgICAgICAgIC8vIGluc2VydCBtYXJrdXAgaW50byBhIDxkaXY+IG9yIDxpZnJhbWU+IGRlcGVuZGluZyBvbiB0aGUgY29udGFpbmVyXG4gICAgICAgICAgLy8gdHlwZSB0byBwZXJmb3JtIHRoZSBzYW1lIG5vcm1hbGl6YXRpb25zIGJlZm9yZSBjb21wYXJpbmcuXG4gICAgICAgICAgdmFyIG5vcm1hbGl6ZXI7XG4gICAgICAgICAgaWYgKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFX1RZUEUpIHtcbiAgICAgICAgICAgIG5vcm1hbGl6ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIG5vcm1hbGl6ZXIuaW5uZXJIVE1MID0gbWFya3VwO1xuICAgICAgICAgICAgbm9ybWFsaXplZE1hcmt1cCA9IG5vcm1hbGl6ZXIuaW5uZXJIVE1MO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBub3JtYWxpemVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG5vcm1hbGl6ZXIpO1xuICAgICAgICAgICAgbm9ybWFsaXplci5jb250ZW50RG9jdW1lbnQud3JpdGUobWFya3VwKTtcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRNYXJrdXAgPSBub3JtYWxpemVyLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChub3JtYWxpemVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZGlmZkluZGV4ID0gZmlyc3REaWZmZXJlbmNlSW5kZXgobm9ybWFsaXplZE1hcmt1cCwgcm9vdE1hcmt1cCk7XG4gICAgICAgIHZhciBkaWZmZXJlbmNlID0gJyAoY2xpZW50KSAnICsgbm9ybWFsaXplZE1hcmt1cC5zdWJzdHJpbmcoZGlmZkluZGV4IC0gMjAsIGRpZmZJbmRleCArIDIwKSArICdcXG4gKHNlcnZlcikgJyArIHJvb3RNYXJrdXAuc3Vic3RyaW5nKGRpZmZJbmRleCAtIDIwLCBkaWZmSW5kZXggKyAyMCk7XG5cbiAgICAgICAgIShjb250YWluZXIubm9kZVR5cGUgIT09IERPQ19OT0RFX1RZUEUpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdZb3VcXCdyZSB0cnlpbmcgdG8gcmVuZGVyIGEgY29tcG9uZW50IHRvIHRoZSBkb2N1bWVudCB1c2luZyBzZXJ2ZXIgcmVuZGVyaW5nIGJ1dCB0aGUgY2hlY2tzdW0gd2FzIGludmFsaWQuIFRoaXMgdXN1YWxseSBtZWFucyB5b3UgcmVuZGVyZWQgYSBkaWZmZXJlbnQgY29tcG9uZW50IHR5cGUgb3IgcHJvcHMgb24gdGhlIGNsaWVudCBmcm9tIHRoZSBvbmUgb24gdGhlIHNlcnZlciwgb3IgeW91ciByZW5kZXIoKSBtZXRob2RzIGFyZSBpbXB1cmUuIFJlYWN0IGNhbm5vdCBoYW5kbGUgdGhpcyBjYXNlIGR1ZSB0byBjcm9zcy1icm93c2VyIHF1aXJrcyBieSByZW5kZXJpbmcgYXQgdGhlIGRvY3VtZW50IHJvb3QuIFlvdSBzaG91bGQgbG9vayBmb3IgZW52aXJvbm1lbnQgZGVwZW5kZW50IGNvZGUgaW4geW91ciBjb21wb25lbnRzIGFuZCBlbnN1cmUgdGhlIHByb3BzIGFyZSB0aGUgc2FtZSBjbGllbnQgYW5kIHNlcnZlciBzaWRlOlxcbiVzJywgZGlmZmVyZW5jZSkgOiBfcHJvZEludmFyaWFudCgnNDInLCBkaWZmZXJlbmNlKSA6IHZvaWQgMDtcblxuICAgICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdSZWFjdCBhdHRlbXB0ZWQgdG8gcmV1c2UgbWFya3VwIGluIGEgY29udGFpbmVyIGJ1dCB0aGUgJyArICdjaGVja3N1bSB3YXMgaW52YWxpZC4gVGhpcyBnZW5lcmFsbHkgbWVhbnMgdGhhdCB5b3UgYXJlICcgKyAndXNpbmcgc2VydmVyIHJlbmRlcmluZyBhbmQgdGhlIG1hcmt1cCBnZW5lcmF0ZWQgb24gdGhlICcgKyAnc2VydmVyIHdhcyBub3Qgd2hhdCB0aGUgY2xpZW50IHdhcyBleHBlY3RpbmcuIFJlYWN0IGluamVjdGVkICcgKyAnbmV3IG1hcmt1cCB0byBjb21wZW5zYXRlIHdoaWNoIHdvcmtzIGJ1dCB5b3UgaGF2ZSBsb3N0IG1hbnkgJyArICdvZiB0aGUgYmVuZWZpdHMgb2Ygc2VydmVyIHJlbmRlcmluZy4gSW5zdGVhZCwgZmlndXJlIG91dCAnICsgJ3doeSB0aGUgbWFya3VwIGJlaW5nIGdlbmVyYXRlZCBpcyBkaWZmZXJlbnQgb24gdGhlIGNsaWVudCAnICsgJ29yIHNlcnZlcjpcXG4lcycsIGRpZmZlcmVuY2UpIDogdm9pZCAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgIShjb250YWluZXIubm9kZVR5cGUgIT09IERPQ19OT0RFX1RZUEUpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdZb3VcXCdyZSB0cnlpbmcgdG8gcmVuZGVyIGEgY29tcG9uZW50IHRvIHRoZSBkb2N1bWVudCBidXQgeW91IGRpZG5cXCd0IHVzZSBzZXJ2ZXIgcmVuZGVyaW5nLiBXZSBjYW5cXCd0IGRvIHRoaXMgd2l0aG91dCB1c2luZyBzZXJ2ZXIgcmVuZGVyaW5nIGR1ZSB0byBjcm9zcy1icm93c2VyIHF1aXJrcy4gU2VlIFJlYWN0RE9NU2VydmVyLnJlbmRlclRvU3RyaW5nKCkgZm9yIHNlcnZlciByZW5kZXJpbmcuJykgOiBfcHJvZEludmFyaWFudCgnNDMnKSA6IHZvaWQgMDtcblxuICAgIGlmICh0cmFuc2FjdGlvbi51c2VDcmVhdGVFbGVtZW50KSB7XG4gICAgICB3aGlsZSAoY29udGFpbmVyLmxhc3RDaGlsZCkge1xuICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQoY29udGFpbmVyLmxhc3RDaGlsZCk7XG4gICAgICB9XG4gICAgICBET01MYXp5VHJlZS5pbnNlcnRUcmVlQmVmb3JlKGNvbnRhaW5lciwgbWFya3VwLCBudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0SW5uZXJIVE1MKGNvbnRhaW5lciwgbWFya3VwKTtcbiAgICAgIFJlYWN0RE9NQ29tcG9uZW50VHJlZS5wcmVjYWNoZU5vZGUoaW5zdGFuY2UsIGNvbnRhaW5lci5maXJzdENoaWxkKTtcbiAgICB9XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBob3N0Tm9kZSA9IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXRJbnN0YW5jZUZyb21Ob2RlKGNvbnRhaW5lci5maXJzdENoaWxkKTtcbiAgICAgIGlmIChob3N0Tm9kZS5fZGVidWdJRCAhPT0gMCkge1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25Ib3N0T3BlcmF0aW9uKHtcbiAgICAgICAgICBpbnN0YW5jZUlEOiBob3N0Tm9kZS5fZGVidWdJRCxcbiAgICAgICAgICB0eXBlOiAnbW91bnQnLFxuICAgICAgICAgIHBheWxvYWQ6IG1hcmt1cC50b1N0cmluZygpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdE1vdW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdENvbXBvbmVudEVudmlyb25tZW50ID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudEVudmlyb25tZW50Jyk7XG52YXIgUmVhY3RJbnN0YW5jZU1hcCA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0YW5jZU1hcCcpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDdXJyZW50T3duZXInKTtcbnZhciBSZWFjdFJlY29uY2lsZXIgPSByZXF1aXJlKCcuL1JlYWN0UmVjb25jaWxlcicpO1xudmFyIFJlYWN0Q2hpbGRSZWNvbmNpbGVyID0gcmVxdWlyZSgnLi9SZWFjdENoaWxkUmVjb25jaWxlcicpO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcbnZhciBmbGF0dGVuQ2hpbGRyZW4gPSByZXF1aXJlKCcuL2ZsYXR0ZW5DaGlsZHJlbicpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIE1ha2UgYW4gdXBkYXRlIGZvciBtYXJrdXAgdG8gYmUgcmVuZGVyZWQgYW5kIGluc2VydGVkIGF0IGEgc3VwcGxpZWQgaW5kZXguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1hcmt1cCBNYXJrdXAgdGhhdCByZW5kZXJzIGludG8gYW4gZWxlbWVudC5cbiAqIEBwYXJhbSB7bnVtYmVyfSB0b0luZGV4IERlc3RpbmF0aW9uIGluZGV4LlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbWFrZUluc2VydE1hcmt1cChtYXJrdXAsIGFmdGVyTm9kZSwgdG9JbmRleCkge1xuICAvLyBOT1RFOiBOdWxsIHZhbHVlcyByZWR1Y2UgaGlkZGVuIGNsYXNzZXMuXG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0lOU0VSVF9NQVJLVVAnLFxuICAgIGNvbnRlbnQ6IG1hcmt1cCxcbiAgICBmcm9tSW5kZXg6IG51bGwsXG4gICAgZnJvbU5vZGU6IG51bGwsXG4gICAgdG9JbmRleDogdG9JbmRleCxcbiAgICBhZnRlck5vZGU6IGFmdGVyTm9kZVxuICB9O1xufVxuXG4vKipcbiAqIE1ha2UgYW4gdXBkYXRlIGZvciBtb3ZpbmcgYW4gZXhpc3RpbmcgZWxlbWVudCB0byBhbm90aGVyIGluZGV4LlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggU291cmNlIGluZGV4IG9mIHRoZSBleGlzdGluZyBlbGVtZW50LlxuICogQHBhcmFtIHtudW1iZXJ9IHRvSW5kZXggRGVzdGluYXRpb24gaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBtYWtlTW92ZShjaGlsZCwgYWZ0ZXJOb2RlLCB0b0luZGV4KSB7XG4gIC8vIE5PVEU6IE51bGwgdmFsdWVzIHJlZHVjZSBoaWRkZW4gY2xhc3Nlcy5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnTU9WRV9FWElTVElORycsXG4gICAgY29udGVudDogbnVsbCxcbiAgICBmcm9tSW5kZXg6IGNoaWxkLl9tb3VudEluZGV4LFxuICAgIGZyb21Ob2RlOiBSZWFjdFJlY29uY2lsZXIuZ2V0SG9zdE5vZGUoY2hpbGQpLFxuICAgIHRvSW5kZXg6IHRvSW5kZXgsXG4gICAgYWZ0ZXJOb2RlOiBhZnRlck5vZGVcbiAgfTtcbn1cblxuLyoqXG4gKiBNYWtlIGFuIHVwZGF0ZSBmb3IgcmVtb3ZpbmcgYW4gZWxlbWVudCBhdCBhbiBpbmRleC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJlbW92ZS5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIG1ha2VSZW1vdmUoY2hpbGQsIG5vZGUpIHtcbiAgLy8gTk9URTogTnVsbCB2YWx1ZXMgcmVkdWNlIGhpZGRlbiBjbGFzc2VzLlxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdSRU1PVkVfTk9ERScsXG4gICAgY29udGVudDogbnVsbCxcbiAgICBmcm9tSW5kZXg6IGNoaWxkLl9tb3VudEluZGV4LFxuICAgIGZyb21Ob2RlOiBub2RlLFxuICAgIHRvSW5kZXg6IG51bGwsXG4gICAgYWZ0ZXJOb2RlOiBudWxsXG4gIH07XG59XG5cbi8qKlxuICogTWFrZSBhbiB1cGRhdGUgZm9yIHNldHRpbmcgdGhlIG1hcmt1cCBvZiBhIG5vZGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1hcmt1cCBNYXJrdXAgdGhhdCByZW5kZXJzIGludG8gYW4gZWxlbWVudC5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIG1ha2VTZXRNYXJrdXAobWFya3VwKSB7XG4gIC8vIE5PVEU6IE51bGwgdmFsdWVzIHJlZHVjZSBoaWRkZW4gY2xhc3Nlcy5cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnU0VUX01BUktVUCcsXG4gICAgY29udGVudDogbWFya3VwLFxuICAgIGZyb21JbmRleDogbnVsbCxcbiAgICBmcm9tTm9kZTogbnVsbCxcbiAgICB0b0luZGV4OiBudWxsLFxuICAgIGFmdGVyTm9kZTogbnVsbFxuICB9O1xufVxuXG4vKipcbiAqIE1ha2UgYW4gdXBkYXRlIGZvciBzZXR0aW5nIHRoZSB0ZXh0IGNvbnRlbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHRDb250ZW50IFRleHQgY29udGVudCB0byBzZXQuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBtYWtlVGV4dENvbnRlbnQodGV4dENvbnRlbnQpIHtcbiAgLy8gTk9URTogTnVsbCB2YWx1ZXMgcmVkdWNlIGhpZGRlbiBjbGFzc2VzLlxuICByZXR1cm4ge1xuICAgIHR5cGU6ICdURVhUX0NPTlRFTlQnLFxuICAgIGNvbnRlbnQ6IHRleHRDb250ZW50LFxuICAgIGZyb21JbmRleDogbnVsbCxcbiAgICBmcm9tTm9kZTogbnVsbCxcbiAgICB0b0luZGV4OiBudWxsLFxuICAgIGFmdGVyTm9kZTogbnVsbFxuICB9O1xufVxuXG4vKipcbiAqIFB1c2ggYW4gdXBkYXRlLCBpZiBhbnksIG9udG8gdGhlIHF1ZXVlLiBDcmVhdGVzIGEgbmV3IHF1ZXVlIGlmIG5vbmUgaXNcbiAqIHBhc3NlZCBhbmQgYWx3YXlzIHJldHVybnMgdGhlIHF1ZXVlLiBNdXRhdGl2ZS5cbiAqL1xuZnVuY3Rpb24gZW5xdWV1ZShxdWV1ZSwgdXBkYXRlKSB7XG4gIGlmICh1cGRhdGUpIHtcbiAgICBxdWV1ZSA9IHF1ZXVlIHx8IFtdO1xuICAgIHF1ZXVlLnB1c2godXBkYXRlKTtcbiAgfVxuICByZXR1cm4gcXVldWU7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIGFueSBlbnF1ZXVlZCB1cGRhdGVzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NRdWV1ZShpbnN0LCB1cGRhdGVRdWV1ZSkge1xuICBSZWFjdENvbXBvbmVudEVudmlyb25tZW50LnByb2Nlc3NDaGlsZHJlblVwZGF0ZXMoaW5zdCwgdXBkYXRlUXVldWUpO1xufVxuXG52YXIgc2V0Q2hpbGRyZW5Gb3JJbnN0cnVtZW50YXRpb24gPSBlbXB0eUZ1bmN0aW9uO1xuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBnZXREZWJ1Z0lEID0gZnVuY3Rpb24gKGluc3QpIHtcbiAgICBpZiAoIWluc3QuX2RlYnVnSUQpIHtcbiAgICAgIC8vIENoZWNrIGZvciBBUlQtbGlrZSBpbnN0YW5jZXMuIFRPRE86IFRoaXMgaXMgc2lsbHkvZ3Jvc3MuXG4gICAgICB2YXIgaW50ZXJuYWw7XG4gICAgICBpZiAoaW50ZXJuYWwgPSBSZWFjdEluc3RhbmNlTWFwLmdldChpbnN0KSkge1xuICAgICAgICBpbnN0ID0gaW50ZXJuYWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbnN0Ll9kZWJ1Z0lEO1xuICB9O1xuICBzZXRDaGlsZHJlbkZvckluc3RydW1lbnRhdGlvbiA9IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICAgIHZhciBkZWJ1Z0lEID0gZ2V0RGVidWdJRCh0aGlzKTtcbiAgICAvLyBUT0RPOiBSZWFjdCBOYXRpdmUgZW1wdHkgY29tcG9uZW50cyBhcmUgYWxzbyBtdWx0aWNoaWxkLlxuICAgIC8vIFRoaXMgbWVhbnMgdGhleSBzdGlsbCBnZXQgaW50byB0aGlzIG1ldGhvZCBidXQgZG9uJ3QgaGF2ZSBfZGVidWdJRC5cbiAgICBpZiAoZGVidWdJRCAhPT0gMCkge1xuICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uU2V0Q2hpbGRyZW4oZGVidWdJRCwgY2hpbGRyZW4gPyBPYmplY3Qua2V5cyhjaGlsZHJlbikubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuW2tleV0uX2RlYnVnSUQ7XG4gICAgICB9KSA6IFtdKTtcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogUmVhY3RNdWx0aUNoaWxkIGFyZSBjYXBhYmxlIG9mIHJlY29uY2lsaW5nIG11bHRpcGxlIGNoaWxkcmVuLlxuICpcbiAqIEBjbGFzcyBSZWFjdE11bHRpQ2hpbGRcbiAqIEBpbnRlcm5hbFxuICovXG52YXIgUmVhY3RNdWx0aUNoaWxkID0ge1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjb21tb24gZnVuY3Rpb25hbGl0eSBmb3IgY29tcG9uZW50cyB0aGF0IG11c3QgcmVjb25jaWxlIG11bHRpcGxlXG4gICAqIGNoaWxkcmVuLiBUaGlzIGlzIHVzZWQgYnkgYFJlYWN0RE9NQ29tcG9uZW50YCB0byBtb3VudCwgdXBkYXRlLCBhbmRcbiAgICogdW5tb3VudCBjaGlsZCBjb21wb25lbnRzLlxuICAgKlxuICAgKiBAbGVuZHMge1JlYWN0TXVsdGlDaGlsZC5wcm90b3R5cGV9XG4gICAqL1xuICBNaXhpbjoge1xuXG4gICAgX3JlY29uY2lsZXJJbnN0YW50aWF0ZUNoaWxkcmVuOiBmdW5jdGlvbiAobmVzdGVkQ2hpbGRyZW4sIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgdmFyIHNlbGZEZWJ1Z0lEID0gZ2V0RGVidWdJRCh0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5fb3duZXI7XG4gICAgICAgICAgICByZXR1cm4gUmVhY3RDaGlsZFJlY29uY2lsZXIuaW5zdGFudGlhdGVDaGlsZHJlbihuZXN0ZWRDaGlsZHJlbiwgdHJhbnNhY3Rpb24sIGNvbnRleHQsIHNlbGZEZWJ1Z0lEKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gUmVhY3RDaGlsZFJlY29uY2lsZXIuaW5zdGFudGlhdGVDaGlsZHJlbihuZXN0ZWRDaGlsZHJlbiwgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgIH0sXG5cbiAgICBfcmVjb25jaWxlclVwZGF0ZUNoaWxkcmVuOiBmdW5jdGlvbiAocHJldkNoaWxkcmVuLCBuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cywgbW91bnRJbWFnZXMsIHJlbW92ZWROb2RlcywgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICAgIHZhciBuZXh0Q2hpbGRyZW47XG4gICAgICB2YXIgc2VsZkRlYnVnSUQgPSAwO1xuICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIHNlbGZEZWJ1Z0lEID0gZ2V0RGVidWdJRCh0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQgPSB0aGlzLl9jdXJyZW50RWxlbWVudC5fb3duZXI7XG4gICAgICAgICAgICBuZXh0Q2hpbGRyZW4gPSBmbGF0dGVuQ2hpbGRyZW4obmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMsIHNlbGZEZWJ1Z0lEKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIFJlYWN0Q2hpbGRSZWNvbmNpbGVyLnVwZGF0ZUNoaWxkcmVuKHByZXZDaGlsZHJlbiwgbmV4dENoaWxkcmVuLCBtb3VudEltYWdlcywgcmVtb3ZlZE5vZGVzLCB0cmFuc2FjdGlvbiwgdGhpcywgdGhpcy5faG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQsIHNlbGZEZWJ1Z0lEKTtcbiAgICAgICAgICByZXR1cm4gbmV4dENoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBuZXh0Q2hpbGRyZW4gPSBmbGF0dGVuQ2hpbGRyZW4obmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMsIHNlbGZEZWJ1Z0lEKTtcbiAgICAgIFJlYWN0Q2hpbGRSZWNvbmNpbGVyLnVwZGF0ZUNoaWxkcmVuKHByZXZDaGlsZHJlbiwgbmV4dENoaWxkcmVuLCBtb3VudEltYWdlcywgcmVtb3ZlZE5vZGVzLCB0cmFuc2FjdGlvbiwgdGhpcywgdGhpcy5faG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQsIHNlbGZEZWJ1Z0lEKTtcbiAgICAgIHJldHVybiBuZXh0Q2hpbGRyZW47XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIFwibW91bnQgaW1hZ2VcIiBmb3IgZWFjaCBvZiB0aGUgc3VwcGxpZWQgY2hpbGRyZW4uIEluIHRoZSBjYXNlXG4gICAgICogb2YgYFJlYWN0RE9NQ29tcG9uZW50YCwgYSBtb3VudCBpbWFnZSBpcyBhIHN0cmluZyBvZiBtYXJrdXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gez9vYmplY3R9IG5lc3RlZENoaWxkcmVuIE5lc3RlZCBjaGlsZCBtYXBzLlxuICAgICAqIEByZXR1cm4ge2FycmF5fSBBbiBhcnJheSBvZiBtb3VudGVkIHJlcHJlc2VudGF0aW9ucy5cbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBtb3VudENoaWxkcmVuOiBmdW5jdGlvbiAobmVzdGVkQ2hpbGRyZW4sIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICB2YXIgY2hpbGRyZW4gPSB0aGlzLl9yZWNvbmNpbGVySW5zdGFudGlhdGVDaGlsZHJlbihuZXN0ZWRDaGlsZHJlbiwgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgICAgdGhpcy5fcmVuZGVyZWRDaGlsZHJlbiA9IGNoaWxkcmVuO1xuXG4gICAgICB2YXIgbW91bnRJbWFnZXMgPSBbXTtcbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICBmb3IgKHZhciBuYW1lIGluIGNoaWxkcmVuKSB7XG4gICAgICAgIGlmIChjaGlsZHJlbi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW25hbWVdO1xuICAgICAgICAgIHZhciBzZWxmRGVidWdJRCA9IDA7XG4gICAgICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBzZWxmRGVidWdJRCA9IGdldERlYnVnSUQodGhpcyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBtb3VudEltYWdlID0gUmVhY3RSZWNvbmNpbGVyLm1vdW50Q29tcG9uZW50KGNoaWxkLCB0cmFuc2FjdGlvbiwgdGhpcywgdGhpcy5faG9zdENvbnRhaW5lckluZm8sIGNvbnRleHQsIHNlbGZEZWJ1Z0lEKTtcbiAgICAgICAgICBjaGlsZC5fbW91bnRJbmRleCA9IGluZGV4Kys7XG4gICAgICAgICAgbW91bnRJbWFnZXMucHVzaChtb3VudEltYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgc2V0Q2hpbGRyZW5Gb3JJbnN0cnVtZW50YXRpb24uY2FsbCh0aGlzLCBjaGlsZHJlbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtb3VudEltYWdlcztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmVwbGFjZXMgYW55IHJlbmRlcmVkIGNoaWxkcmVuIHdpdGggYSB0ZXh0IGNvbnRlbnQgc3RyaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5leHRDb250ZW50IFN0cmluZyBvZiBjb250ZW50LlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHVwZGF0ZVRleHRDb250ZW50OiBmdW5jdGlvbiAobmV4dENvbnRlbnQpIHtcbiAgICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLl9yZW5kZXJlZENoaWxkcmVuO1xuICAgICAgLy8gUmVtb3ZlIGFueSByZW5kZXJlZCBjaGlsZHJlbi5cbiAgICAgIFJlYWN0Q2hpbGRSZWNvbmNpbGVyLnVubW91bnRDaGlsZHJlbihwcmV2Q2hpbGRyZW4sIGZhbHNlKTtcbiAgICAgIGZvciAodmFyIG5hbWUgaW4gcHJldkNoaWxkcmVuKSB7XG4gICAgICAgIGlmIChwcmV2Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAhZmFsc2UgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3VwZGF0ZVRleHRDb250ZW50IGNhbGxlZCBvbiBub24tZW1wdHkgY29tcG9uZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzExOCcpIDogdm9pZCAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTZXQgbmV3IHRleHQgY29udGVudC5cbiAgICAgIHZhciB1cGRhdGVzID0gW21ha2VUZXh0Q29udGVudChuZXh0Q29udGVudCldO1xuICAgICAgcHJvY2Vzc1F1ZXVlKHRoaXMsIHVwZGF0ZXMpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlcyBhbnkgcmVuZGVyZWQgY2hpbGRyZW4gd2l0aCBhIG1hcmt1cCBzdHJpbmcuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV4dE1hcmt1cCBTdHJpbmcgb2YgbWFya3VwLlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHVwZGF0ZU1hcmt1cDogZnVuY3Rpb24gKG5leHRNYXJrdXApIHtcbiAgICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLl9yZW5kZXJlZENoaWxkcmVuO1xuICAgICAgLy8gUmVtb3ZlIGFueSByZW5kZXJlZCBjaGlsZHJlbi5cbiAgICAgIFJlYWN0Q2hpbGRSZWNvbmNpbGVyLnVubW91bnRDaGlsZHJlbihwcmV2Q2hpbGRyZW4sIGZhbHNlKTtcbiAgICAgIGZvciAodmFyIG5hbWUgaW4gcHJldkNoaWxkcmVuKSB7XG4gICAgICAgIGlmIChwcmV2Q2hpbGRyZW4uaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgICAhZmFsc2UgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ3VwZGF0ZVRleHRDb250ZW50IGNhbGxlZCBvbiBub24tZW1wdHkgY29tcG9uZW50LicpIDogX3Byb2RJbnZhcmlhbnQoJzExOCcpIDogdm9pZCAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB2YXIgdXBkYXRlcyA9IFttYWtlU2V0TWFya3VwKG5leHRNYXJrdXApXTtcbiAgICAgIHByb2Nlc3NRdWV1ZSh0aGlzLCB1cGRhdGVzKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgcmVuZGVyZWQgY2hpbGRyZW4gd2l0aCBuZXcgY2hpbGRyZW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzIE5lc3RlZCBjaGlsZCBlbGVtZW50IG1hcHMuXG4gICAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHVwZGF0ZUNoaWxkcmVuOiBmdW5jdGlvbiAobmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMsIHRyYW5zYWN0aW9uLCBjb250ZXh0KSB7XG4gICAgICAvLyBIb29rIHVzZWQgYnkgUmVhY3QgQVJUXG4gICAgICB0aGlzLl91cGRhdGVDaGlsZHJlbihuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cywgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHROZXN0ZWRDaGlsZHJlbkVsZW1lbnRzIE5lc3RlZCBjaGlsZCBlbGVtZW50IG1hcHMuXG4gICAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgICAqIEBmaW5hbFxuICAgICAqIEBwcm90ZWN0ZWRcbiAgICAgKi9cbiAgICBfdXBkYXRlQ2hpbGRyZW46IGZ1bmN0aW9uIChuZXh0TmVzdGVkQ2hpbGRyZW5FbGVtZW50cywgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICAgIHZhciBwcmV2Q2hpbGRyZW4gPSB0aGlzLl9yZW5kZXJlZENoaWxkcmVuO1xuICAgICAgdmFyIHJlbW92ZWROb2RlcyA9IHt9O1xuICAgICAgdmFyIG1vdW50SW1hZ2VzID0gW107XG4gICAgICB2YXIgbmV4dENoaWxkcmVuID0gdGhpcy5fcmVjb25jaWxlclVwZGF0ZUNoaWxkcmVuKHByZXZDaGlsZHJlbiwgbmV4dE5lc3RlZENoaWxkcmVuRWxlbWVudHMsIG1vdW50SW1hZ2VzLCByZW1vdmVkTm9kZXMsIHRyYW5zYWN0aW9uLCBjb250ZXh0KTtcbiAgICAgIGlmICghbmV4dENoaWxkcmVuICYmICFwcmV2Q2hpbGRyZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIHVwZGF0ZXMgPSBudWxsO1xuICAgICAgdmFyIG5hbWU7XG4gICAgICAvLyBgbmV4dEluZGV4YCB3aWxsIGluY3JlbWVudCBmb3IgZWFjaCBjaGlsZCBpbiBgbmV4dENoaWxkcmVuYCwgYnV0XG4gICAgICAvLyBgbGFzdEluZGV4YCB3aWxsIGJlIHRoZSBsYXN0IGluZGV4IHZpc2l0ZWQgaW4gYHByZXZDaGlsZHJlbmAuXG4gICAgICB2YXIgbmV4dEluZGV4ID0gMDtcbiAgICAgIHZhciBsYXN0SW5kZXggPSAwO1xuICAgICAgLy8gYG5leHRNb3VudEluZGV4YCB3aWxsIGluY3JlbWVudCBmb3IgZWFjaCBuZXdseSBtb3VudGVkIGNoaWxkLlxuICAgICAgdmFyIG5leHRNb3VudEluZGV4ID0gMDtcbiAgICAgIHZhciBsYXN0UGxhY2VkTm9kZSA9IG51bGw7XG4gICAgICBmb3IgKG5hbWUgaW4gbmV4dENoaWxkcmVuKSB7XG4gICAgICAgIGlmICghbmV4dENoaWxkcmVuLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByZXZDaGlsZCA9IHByZXZDaGlsZHJlbiAmJiBwcmV2Q2hpbGRyZW5bbmFtZV07XG4gICAgICAgIHZhciBuZXh0Q2hpbGQgPSBuZXh0Q2hpbGRyZW5bbmFtZV07XG4gICAgICAgIGlmIChwcmV2Q2hpbGQgPT09IG5leHRDaGlsZCkge1xuICAgICAgICAgIHVwZGF0ZXMgPSBlbnF1ZXVlKHVwZGF0ZXMsIHRoaXMubW92ZUNoaWxkKHByZXZDaGlsZCwgbGFzdFBsYWNlZE5vZGUsIG5leHRJbmRleCwgbGFzdEluZGV4KSk7XG4gICAgICAgICAgbGFzdEluZGV4ID0gTWF0aC5tYXgocHJldkNoaWxkLl9tb3VudEluZGV4LCBsYXN0SW5kZXgpO1xuICAgICAgICAgIHByZXZDaGlsZC5fbW91bnRJbmRleCA9IG5leHRJbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAocHJldkNoaWxkKSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgYGxhc3RJbmRleGAgYmVmb3JlIGBfbW91bnRJbmRleGAgZ2V0cyB1bnNldCBieSB1bm1vdW50aW5nLlxuICAgICAgICAgICAgbGFzdEluZGV4ID0gTWF0aC5tYXgocHJldkNoaWxkLl9tb3VudEluZGV4LCBsYXN0SW5kZXgpO1xuICAgICAgICAgICAgLy8gVGhlIGByZW1vdmVkTm9kZXNgIGxvb3AgYmVsb3cgd2lsbCBhY3R1YWxseSByZW1vdmUgdGhlIGNoaWxkLlxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBUaGUgY2hpbGQgbXVzdCBiZSBpbnN0YW50aWF0ZWQgYmVmb3JlIGl0J3MgbW91bnRlZC5cbiAgICAgICAgICB1cGRhdGVzID0gZW5xdWV1ZSh1cGRhdGVzLCB0aGlzLl9tb3VudENoaWxkQXRJbmRleChuZXh0Q2hpbGQsIG1vdW50SW1hZ2VzW25leHRNb3VudEluZGV4XSwgbGFzdFBsYWNlZE5vZGUsIG5leHRJbmRleCwgdHJhbnNhY3Rpb24sIGNvbnRleHQpKTtcbiAgICAgICAgICBuZXh0TW91bnRJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIG5leHRJbmRleCsrO1xuICAgICAgICBsYXN0UGxhY2VkTm9kZSA9IFJlYWN0UmVjb25jaWxlci5nZXRIb3N0Tm9kZShuZXh0Q2hpbGQpO1xuICAgICAgfVxuICAgICAgLy8gUmVtb3ZlIGNoaWxkcmVuIHRoYXQgYXJlIG5vIGxvbmdlciBwcmVzZW50LlxuICAgICAgZm9yIChuYW1lIGluIHJlbW92ZWROb2Rlcykge1xuICAgICAgICBpZiAocmVtb3ZlZE5vZGVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgdXBkYXRlcyA9IGVucXVldWUodXBkYXRlcywgdGhpcy5fdW5tb3VudENoaWxkKHByZXZDaGlsZHJlbltuYW1lXSwgcmVtb3ZlZE5vZGVzW25hbWVdKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVzKSB7XG4gICAgICAgIHByb2Nlc3NRdWV1ZSh0aGlzLCB1cGRhdGVzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW4gPSBuZXh0Q2hpbGRyZW47XG5cbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBzZXRDaGlsZHJlbkZvckluc3RydW1lbnRhdGlvbi5jYWxsKHRoaXMsIG5leHRDaGlsZHJlbik7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFVubW91bnRzIGFsbCByZW5kZXJlZCBjaGlsZHJlbi4gVGhpcyBzaG91bGQgYmUgdXNlZCB0byBjbGVhbiB1cCBjaGlsZHJlblxuICAgICAqIHdoZW4gdGhpcyBjb21wb25lbnQgaXMgdW5tb3VudGVkLiBJdCBkb2VzIG5vdCBhY3R1YWxseSBwZXJmb3JtIGFueVxuICAgICAqIGJhY2tlbmQgb3BlcmF0aW9ucy5cbiAgICAgKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHVubW91bnRDaGlsZHJlbjogZnVuY3Rpb24gKHNhZmVseSkge1xuICAgICAgdmFyIHJlbmRlcmVkQ2hpbGRyZW4gPSB0aGlzLl9yZW5kZXJlZENoaWxkcmVuO1xuICAgICAgUmVhY3RDaGlsZFJlY29uY2lsZXIudW5tb3VudENoaWxkcmVuKHJlbmRlcmVkQ2hpbGRyZW4sIHNhZmVseSk7XG4gICAgICB0aGlzLl9yZW5kZXJlZENoaWxkcmVuID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgYSBjaGlsZCBjb21wb25lbnQgdG8gdGhlIHN1cHBsaWVkIGluZGV4LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY2hpbGQgQ29tcG9uZW50IHRvIG1vdmUuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRvSW5kZXggRGVzdGluYXRpb24gaW5kZXggb2YgdGhlIGVsZW1lbnQuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxhc3RJbmRleCBMYXN0IGluZGV4IHZpc2l0ZWQgb2YgdGhlIHNpYmxpbmdzIG9mIGBjaGlsZGAuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIG1vdmVDaGlsZDogZnVuY3Rpb24gKGNoaWxkLCBhZnRlck5vZGUsIHRvSW5kZXgsIGxhc3RJbmRleCkge1xuICAgICAgLy8gSWYgdGhlIGluZGV4IG9mIGBjaGlsZGAgaXMgbGVzcyB0aGFuIGBsYXN0SW5kZXhgLCB0aGVuIGl0IG5lZWRzIHRvXG4gICAgICAvLyBiZSBtb3ZlZC4gT3RoZXJ3aXNlLCB3ZSBkbyBub3QgbmVlZCB0byBtb3ZlIGl0IGJlY2F1c2UgYSBjaGlsZCB3aWxsIGJlXG4gICAgICAvLyBpbnNlcnRlZCBvciBtb3ZlZCBiZWZvcmUgYGNoaWxkYC5cbiAgICAgIGlmIChjaGlsZC5fbW91bnRJbmRleCA8IGxhc3RJbmRleCkge1xuICAgICAgICByZXR1cm4gbWFrZU1vdmUoY2hpbGQsIGFmdGVyTm9kZSwgdG9JbmRleCk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjaGlsZCBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjaGlsZCBDb21wb25lbnQgdG8gY3JlYXRlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb3VudEltYWdlIE1hcmt1cCB0byBpbnNlcnQuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIGNyZWF0ZUNoaWxkOiBmdW5jdGlvbiAoY2hpbGQsIGFmdGVyTm9kZSwgbW91bnRJbWFnZSkge1xuICAgICAgcmV0dXJuIG1ha2VJbnNlcnRNYXJrdXAobW91bnRJbWFnZSwgYWZ0ZXJOb2RlLCBjaGlsZC5fbW91bnRJbmRleCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZXMgYSBjaGlsZCBjb21wb25lbnQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjaGlsZCBDaGlsZCB0byByZW1vdmUuXG4gICAgICogQHByb3RlY3RlZFxuICAgICAqL1xuICAgIHJlbW92ZUNoaWxkOiBmdW5jdGlvbiAoY2hpbGQsIG5vZGUpIHtcbiAgICAgIHJldHVybiBtYWtlUmVtb3ZlKGNoaWxkLCBub2RlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogTW91bnRzIGEgY2hpbGQgd2l0aCB0aGUgc3VwcGxpZWQgbmFtZS5cbiAgICAgKlxuICAgICAqIE5PVEU6IFRoaXMgaXMgcGFydCBvZiBgdXBkYXRlQ2hpbGRyZW5gIGFuZCBpcyBoZXJlIGZvciByZWFkYWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGNoaWxkIENvbXBvbmVudCB0byBtb3VudC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBjaGlsZC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBjaGlsZC5cbiAgICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfbW91bnRDaGlsZEF0SW5kZXg6IGZ1bmN0aW9uIChjaGlsZCwgbW91bnRJbWFnZSwgYWZ0ZXJOb2RlLCBpbmRleCwgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICAgIGNoaWxkLl9tb3VudEluZGV4ID0gaW5kZXg7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVDaGlsZChjaGlsZCwgYWZ0ZXJOb2RlLCBtb3VudEltYWdlKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVW5tb3VudHMgYSByZW5kZXJlZCBjaGlsZC5cbiAgICAgKlxuICAgICAqIE5PVEU6IFRoaXMgaXMgcGFydCBvZiBgdXBkYXRlQ2hpbGRyZW5gIGFuZCBpcyBoZXJlIGZvciByZWFkYWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGNoaWxkIENvbXBvbmVudCB0byB1bm1vdW50LlxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgX3VubW91bnRDaGlsZDogZnVuY3Rpb24gKGNoaWxkLCBub2RlKSB7XG4gICAgICB2YXIgdXBkYXRlID0gdGhpcy5yZW1vdmVDaGlsZChjaGlsZCwgbm9kZSk7XG4gICAgICBjaGlsZC5fbW91bnRJbmRleCA9IG51bGw7XG4gICAgICByZXR1cm4gdXBkYXRlO1xuICAgIH1cblxuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RNdWx0aUNoaWxkOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0ID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0Tm9kZVR5cGVzID0ge1xuICBIT1NUOiAwLFxuICBDT01QT1NJVEU6IDEsXG4gIEVNUFRZOiAyLFxuXG4gIGdldFR5cGU6IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgaWYgKG5vZGUgPT09IG51bGwgfHwgbm9kZSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBSZWFjdE5vZGVUeXBlcy5FTVBUWTtcbiAgICB9IGVsc2UgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KG5vZGUpKSB7XG4gICAgICBpZiAodHlwZW9mIG5vZGUudHlwZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gUmVhY3ROb2RlVHlwZXMuQ09NUE9TSVRFO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFJlYWN0Tm9kZVR5cGVzLkhPU1Q7XG4gICAgICB9XG4gICAgfVxuICAgICFmYWxzZSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnVW5leHBlY3RlZCBub2RlOiAlcycsIG5vZGUpIDogX3Byb2RJbnZhcmlhbnQoJzI2Jywgbm9kZSkgOiB2b2lkIDA7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3ROb2RlVHlwZXM7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogQHBhcmFtIHs/b2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYG9iamVjdGAgaXMgYSB2YWxpZCBvd25lci5cbiAqIEBmaW5hbFxuICovXG5mdW5jdGlvbiBpc1ZhbGlkT3duZXIob2JqZWN0KSB7XG4gIHJldHVybiAhIShvYmplY3QgJiYgdHlwZW9mIG9iamVjdC5hdHRhY2hSZWYgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iamVjdC5kZXRhY2hSZWYgPT09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIFJlYWN0T3duZXJzIGFyZSBjYXBhYmxlIG9mIHN0b3JpbmcgcmVmZXJlbmNlcyB0byBvd25lZCBjb21wb25lbnRzLlxuICpcbiAqIEFsbCBjb21wb25lbnRzIGFyZSBjYXBhYmxlIG9mIC8vYmVpbmcvLyByZWZlcmVuY2VkIGJ5IG93bmVyIGNvbXBvbmVudHMsIGJ1dFxuICogb25seSBSZWFjdE93bmVyIGNvbXBvbmVudHMgYXJlIGNhcGFibGUgb2YgLy9yZWZlcmVuY2luZy8vIG93bmVkIGNvbXBvbmVudHMuXG4gKiBUaGUgbmFtZWQgcmVmZXJlbmNlIGlzIGtub3duIGFzIGEgXCJyZWZcIi5cbiAqXG4gKiBSZWZzIGFyZSBhdmFpbGFibGUgd2hlbiBtb3VudGVkIGFuZCB1cGRhdGVkIGR1cmluZyByZWNvbmNpbGlhdGlvbi5cbiAqXG4gKiAgIHZhciBNeUNvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAqICAgICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICogICAgICAgcmV0dXJuIChcbiAqICAgICAgICAgPGRpdiBvbkNsaWNrPXt0aGlzLmhhbmRsZUNsaWNrfT5cbiAqICAgICAgICAgICA8Q3VzdG9tQ29tcG9uZW50IHJlZj1cImN1c3RvbVwiIC8+XG4gKiAgICAgICAgIDwvZGl2PlxuICogICAgICAgKTtcbiAqICAgICB9LFxuICogICAgIGhhbmRsZUNsaWNrOiBmdW5jdGlvbigpIHtcbiAqICAgICAgIHRoaXMucmVmcy5jdXN0b20uaGFuZGxlQ2xpY2soKTtcbiAqICAgICB9LFxuICogICAgIGNvbXBvbmVudERpZE1vdW50OiBmdW5jdGlvbigpIHtcbiAqICAgICAgIHRoaXMucmVmcy5jdXN0b20uaW5pdGlhbGl6ZSgpO1xuICogICAgIH1cbiAqICAgfSk7XG4gKlxuICogUmVmcyBzaG91bGQgcmFyZWx5IGJlIHVzZWQuIFdoZW4gcmVmcyBhcmUgdXNlZCwgdGhleSBzaG91bGQgb25seSBiZSBkb25lIHRvXG4gKiBjb250cm9sIGRhdGEgdGhhdCBpcyBub3QgaGFuZGxlZCBieSBSZWFjdCdzIGRhdGEgZmxvdy5cbiAqXG4gKiBAY2xhc3MgUmVhY3RPd25lclxuICovXG52YXIgUmVhY3RPd25lciA9IHtcbiAgLyoqXG4gICAqIEFkZHMgYSBjb21wb25lbnQgYnkgcmVmIHRvIGFuIG93bmVyIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gY29tcG9uZW50IENvbXBvbmVudCB0byByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWYgTmFtZSBieSB3aGljaCB0byByZWZlciB0byB0aGUgY29tcG9uZW50LlxuICAgKiBAcGFyYW0ge1JlYWN0T3duZXJ9IG93bmVyIENvbXBvbmVudCBvbiB3aGljaCB0byByZWNvcmQgdGhlIHJlZi5cbiAgICogQGZpbmFsXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgYWRkQ29tcG9uZW50QXNSZWZUbzogZnVuY3Rpb24gKGNvbXBvbmVudCwgcmVmLCBvd25lcikge1xuICAgICFpc1ZhbGlkT3duZXIob3duZXIpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdhZGRDb21wb25lbnRBc1JlZlRvKC4uLik6IE9ubHkgYSBSZWFjdE93bmVyIGNhbiBoYXZlIHJlZnMuIFlvdSBtaWdodCBiZSBhZGRpbmcgYSByZWYgdG8gYSBjb21wb25lbnQgdGhhdCB3YXMgbm90IGNyZWF0ZWQgaW5zaWRlIGEgY29tcG9uZW50XFwncyBgcmVuZGVyYCBtZXRob2QsIG9yIHlvdSBoYXZlIG11bHRpcGxlIGNvcGllcyBvZiBSZWFjdCBsb2FkZWQgKGRldGFpbHM6IGh0dHBzOi8vZmIubWUvcmVhY3QtcmVmcy1tdXN0LWhhdmUtb3duZXIpLicpIDogX3Byb2RJbnZhcmlhbnQoJzExOScpIDogdm9pZCAwO1xuICAgIG93bmVyLmF0dGFjaFJlZihyZWYsIGNvbXBvbmVudCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSBjb21wb25lbnQgYnkgcmVmIGZyb20gYW4gb3duZXIgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjb21wb25lbnQgQ29tcG9uZW50IHRvIGRlcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcmVmIE5hbWUgb2YgdGhlIHJlZiB0byByZW1vdmUuXG4gICAqIEBwYXJhbSB7UmVhY3RPd25lcn0gb3duZXIgQ29tcG9uZW50IG9uIHdoaWNoIHRoZSByZWYgaXMgcmVjb3JkZWQuXG4gICAqIEBmaW5hbFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlbW92ZUNvbXBvbmVudEFzUmVmRnJvbTogZnVuY3Rpb24gKGNvbXBvbmVudCwgcmVmLCBvd25lcikge1xuICAgICFpc1ZhbGlkT3duZXIob3duZXIpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdyZW1vdmVDb21wb25lbnRBc1JlZkZyb20oLi4uKTogT25seSBhIFJlYWN0T3duZXIgY2FuIGhhdmUgcmVmcy4gWW91IG1pZ2h0IGJlIHJlbW92aW5nIGEgcmVmIHRvIGEgY29tcG9uZW50IHRoYXQgd2FzIG5vdCBjcmVhdGVkIGluc2lkZSBhIGNvbXBvbmVudFxcJ3MgYHJlbmRlcmAgbWV0aG9kLCBvciB5b3UgaGF2ZSBtdWx0aXBsZSBjb3BpZXMgb2YgUmVhY3QgbG9hZGVkIChkZXRhaWxzOiBodHRwczovL2ZiLm1lL3JlYWN0LXJlZnMtbXVzdC1oYXZlLW93bmVyKS4nKSA6IF9wcm9kSW52YXJpYW50KCcxMjAnKSA6IHZvaWQgMDtcbiAgICB2YXIgb3duZXJQdWJsaWNJbnN0YW5jZSA9IG93bmVyLmdldFB1YmxpY0luc3RhbmNlKCk7XG4gICAgLy8gQ2hlY2sgdGhhdCBgY29tcG9uZW50YCdzIG93bmVyIGlzIHN0aWxsIGFsaXZlIGFuZCB0aGF0IGBjb21wb25lbnRgIGlzIHN0aWxsIHRoZSBjdXJyZW50IHJlZlxuICAgIC8vIGJlY2F1c2Ugd2UgZG8gbm90IHdhbnQgdG8gZGV0YWNoIHRoZSByZWYgaWYgYW5vdGhlciBjb21wb25lbnQgc3RvbGUgaXQuXG4gICAgaWYgKG93bmVyUHVibGljSW5zdGFuY2UgJiYgb3duZXJQdWJsaWNJbnN0YW5jZS5yZWZzW3JlZl0gPT09IGNvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpKSB7XG4gICAgICBvd25lci5kZXRhY2hSZWYocmVmKTtcbiAgICB9XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdE93bmVyOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzID0ge307XG5cbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcyA9IHtcbiAgICBwcm9wOiAncHJvcCcsXG4gICAgY29udGV4dDogJ2NvbnRleHQnLFxuICAgIGNoaWxkQ29udGV4dDogJ2NoaWxkIGNvbnRleHQnXG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXM7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSAnU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UHJvcFR5cGVzU2VjcmV0OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgQ2FsbGJhY2tRdWV1ZSA9IHJlcXVpcmUoJy4vQ2FsbGJhY2tRdWV1ZScpO1xudmFyIFBvb2xlZENsYXNzID0gcmVxdWlyZSgnLi9Qb29sZWRDbGFzcycpO1xudmFyIFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJy4vUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyJyk7XG52YXIgUmVhY3RJbnB1dFNlbGVjdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnB1dFNlbGVjdGlvbicpO1xudmFyIFJlYWN0SW5zdHJ1bWVudGF0aW9uID0gcmVxdWlyZSgnLi9SZWFjdEluc3RydW1lbnRhdGlvbicpO1xudmFyIFRyYW5zYWN0aW9uID0gcmVxdWlyZSgnLi9UcmFuc2FjdGlvbicpO1xudmFyIFJlYWN0VXBkYXRlUXVldWUgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlUXVldWUnKTtcblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQsIHdoZW4gcG9zc2libGUsIHRoZSBzZWxlY3Rpb24gcmFuZ2UgKGN1cnJlbnRseSBzZWxlY3RlZCB0ZXh0XG4gKiBpbnB1dCkgaXMgbm90IGRpc3R1cmJlZCBieSBwZXJmb3JtaW5nIHRoZSB0cmFuc2FjdGlvbi5cbiAqL1xudmFyIFNFTEVDVElPTl9SRVNUT1JBVElPTiA9IHtcbiAgLyoqXG4gICAqIEByZXR1cm4ge1NlbGVjdGlvbn0gU2VsZWN0aW9uIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgaW5pdGlhbGl6ZTogUmVhY3RJbnB1dFNlbGVjdGlvbi5nZXRTZWxlY3Rpb25JbmZvcm1hdGlvbixcbiAgLyoqXG4gICAqIEBwYXJhbSB7U2VsZWN0aW9ufSBzZWwgU2VsZWN0aW9uIGluZm9ybWF0aW9uIHJldHVybmVkIGZyb20gYGluaXRpYWxpemVgLlxuICAgKi9cbiAgY2xvc2U6IFJlYWN0SW5wdXRTZWxlY3Rpb24ucmVzdG9yZVNlbGVjdGlvblxufTtcblxuLyoqXG4gKiBTdXBwcmVzc2VzIGV2ZW50cyAoYmx1ci9mb2N1cykgdGhhdCBjb3VsZCBiZSBpbmFkdmVydGVudGx5IGRpc3BhdGNoZWQgZHVlIHRvXG4gKiBoaWdoIGxldmVsIERPTSBtYW5pcHVsYXRpb25zIChsaWtlIHRlbXBvcmFyaWx5IHJlbW92aW5nIGEgdGV4dCBpbnB1dCBmcm9tIHRoZVxuICogRE9NKS5cbiAqL1xudmFyIEVWRU5UX1NVUFBSRVNTSU9OID0ge1xuICAvKipcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVGhlIGVuYWJsZWQgc3RhdHVzIG9mIGBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXJgIGJlZm9yZVxuICAgKiB0aGUgcmVjb25jaWxpYXRpb24uXG4gICAqL1xuICBpbml0aWFsaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGN1cnJlbnRseUVuYWJsZWQgPSBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuaXNFbmFibGVkKCk7XG4gICAgUmVhY3RCcm93c2VyRXZlbnRFbWl0dGVyLnNldEVuYWJsZWQoZmFsc2UpO1xuICAgIHJldHVybiBjdXJyZW50bHlFbmFibGVkO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHByZXZpb3VzbHlFbmFibGVkIEVuYWJsZWQgc3RhdHVzIG9mXG4gICAqICAgYFJlYWN0QnJvd3NlckV2ZW50RW1pdHRlcmAgYmVmb3JlIHRoZSByZWNvbmNpbGlhdGlvbiBvY2N1cnJlZC4gYGNsb3NlYFxuICAgKiAgIHJlc3RvcmVzIHRoZSBwcmV2aW91cyB2YWx1ZS5cbiAgICovXG4gIGNsb3NlOiBmdW5jdGlvbiAocHJldmlvdXNseUVuYWJsZWQpIHtcbiAgICBSZWFjdEJyb3dzZXJFdmVudEVtaXR0ZXIuc2V0RW5hYmxlZChwcmV2aW91c2x5RW5hYmxlZCk7XG4gIH1cbn07XG5cbi8qKlxuICogUHJvdmlkZXMgYSBxdWV1ZSBmb3IgY29sbGVjdGluZyBgY29tcG9uZW50RGlkTW91bnRgIGFuZFxuICogYGNvbXBvbmVudERpZFVwZGF0ZWAgY2FsbGJhY2tzIGR1cmluZyB0aGUgdHJhbnNhY3Rpb24uXG4gKi9cbnZhciBPTl9ET01fUkVBRFlfUVVFVUVJTkcgPSB7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgYG9uRE9NUmVhZHlgIHF1ZXVlLlxuICAgKi9cbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMucmVhY3RNb3VudFJlYWR5LnJlc2V0KCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEFmdGVyIERPTSBpcyBmbHVzaGVkLCBpbnZva2UgYWxsIHJlZ2lzdGVyZWQgYG9uRE9NUmVhZHlgIGNhbGxiYWNrcy5cbiAgICovXG4gIGNsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5yZWFjdE1vdW50UmVhZHkubm90aWZ5QWxsKCk7XG4gIH1cbn07XG5cbi8qKlxuICogRXhlY3V0ZWQgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgYFRyYW5zYWN0aW9uYCBpbnN0YW5jZS4gQ29uc2lkZXIgdGhlc2UgYXNcbiAqIGJlaW5nIG1lbWJlciBtZXRob2RzLCBidXQgd2l0aCBhbiBpbXBsaWVkIG9yZGVyaW5nIHdoaWxlIGJlaW5nIGlzb2xhdGVkIGZyb21cbiAqIGVhY2ggb3RoZXIuXG4gKi9cbnZhciBUUkFOU0FDVElPTl9XUkFQUEVSUyA9IFtTRUxFQ1RJT05fUkVTVE9SQVRJT04sIEVWRU5UX1NVUFBSRVNTSU9OLCBPTl9ET01fUkVBRFlfUVVFVUVJTkddO1xuXG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgVFJBTlNBQ1RJT05fV1JBUFBFUlMucHVzaCh7XG4gICAgaW5pdGlhbGl6ZTogUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVnaW5GbHVzaCxcbiAgICBjbG9zZTogUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uRW5kRmx1c2hcbiAgfSk7XG59XG5cbi8qKlxuICogQ3VycmVudGx5OlxuICogLSBUaGUgb3JkZXIgdGhhdCB0aGVzZSBhcmUgbGlzdGVkIGluIHRoZSB0cmFuc2FjdGlvbiBpcyBjcml0aWNhbDpcbiAqIC0gU3VwcHJlc3NlcyBldmVudHMuXG4gKiAtIFJlc3RvcmVzIHNlbGVjdGlvbiByYW5nZS5cbiAqXG4gKiBGdXR1cmU6XG4gKiAtIFJlc3RvcmUgZG9jdW1lbnQvb3ZlcmZsb3cgc2Nyb2xsIHBvc2l0aW9ucyB0aGF0IHdlcmUgdW5pbnRlbnRpb25hbGx5XG4gKiAgIG1vZGlmaWVkIHZpYSBET00gaW5zZXJ0aW9ucyBhYm92ZSB0aGUgdG9wIHZpZXdwb3J0IGJvdW5kYXJ5LlxuICogLSBJbXBsZW1lbnQvaW50ZWdyYXRlIHdpdGggY3VzdG9taXplZCBjb25zdHJhaW50IGJhc2VkIGxheW91dCBzeXN0ZW0gYW5kIGtlZXBcbiAqICAgdHJhY2sgb2Ygd2hpY2ggZGltZW5zaW9ucyBtdXN0IGJlIHJlbWVhc3VyZWQuXG4gKlxuICogQGNsYXNzIFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb25cbiAqL1xuZnVuY3Rpb24gUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbih1c2VDcmVhdGVFbGVtZW50KSB7XG4gIHRoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKTtcbiAgLy8gT25seSBzZXJ2ZXItc2lkZSByZW5kZXJpbmcgcmVhbGx5IG5lZWRzIHRoaXMgb3B0aW9uIChzZWVcbiAgLy8gYFJlYWN0U2VydmVyUmVuZGVyaW5nYCksIGJ1dCBzZXJ2ZXItc2lkZSB1c2VzXG4gIC8vIGBSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uYCBpbnN0ZWFkLiBUaGlzIG9wdGlvbiBpcyBoZXJlIHNvIHRoYXQgaXQnc1xuICAvLyBhY2Nlc3NpYmxlIGFuZCBkZWZhdWx0cyB0byBmYWxzZSB3aGVuIGBSZWFjdERPTUNvbXBvbmVudGAgYW5kXG4gIC8vIGBSZWFjdERPTVRleHRDb21wb25lbnRgIGNoZWNrcyBpdCBpbiBgbW91bnRDb21wb25lbnRgLmBcbiAgdGhpcy5yZW5kZXJUb1N0YXRpY01hcmt1cCA9IGZhbHNlO1xuICB0aGlzLnJlYWN0TW91bnRSZWFkeSA9IENhbGxiYWNrUXVldWUuZ2V0UG9vbGVkKG51bGwpO1xuICB0aGlzLnVzZUNyZWF0ZUVsZW1lbnQgPSB1c2VDcmVhdGVFbGVtZW50O1xufVxuXG52YXIgTWl4aW4gPSB7XG4gIC8qKlxuICAgKiBAc2VlIFRyYW5zYWN0aW9uXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAZmluYWxcbiAgICogQHJldHVybiB7YXJyYXk8b2JqZWN0Pn0gTGlzdCBvZiBvcGVyYXRpb24gd3JhcCBwcm9jZWR1cmVzLlxuICAgKiAgIFRPRE86IGNvbnZlcnQgdG8gYXJyYXk8VHJhbnNhY3Rpb25XcmFwcGVyPlxuICAgKi9cbiAgZ2V0VHJhbnNhY3Rpb25XcmFwcGVyczogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBUUkFOU0FDVElPTl9XUkFQUEVSUztcbiAgfSxcblxuICAvKipcbiAgICogQHJldHVybiB7b2JqZWN0fSBUaGUgcXVldWUgdG8gY29sbGVjdCBgb25ET01SZWFkeWAgY2FsbGJhY2tzIHdpdGguXG4gICAqL1xuICBnZXRSZWFjdE1vdW50UmVhZHk6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFjdE1vdW50UmVhZHk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIEByZXR1cm4ge29iamVjdH0gVGhlIHF1ZXVlIHRvIGNvbGxlY3QgUmVhY3QgYXN5bmMgZXZlbnRzLlxuICAgKi9cbiAgZ2V0VXBkYXRlUXVldWU6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gUmVhY3RVcGRhdGVRdWV1ZTtcbiAgfSxcblxuICAvKipcbiAgICogU2F2ZSBjdXJyZW50IHRyYW5zYWN0aW9uIHN0YXRlIC0tIGlmIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGlzIG1ldGhvZCBpc1xuICAgKiBwYXNzZWQgdG8gYHJvbGxiYWNrYCwgdGhlIHRyYW5zYWN0aW9uIHdpbGwgYmUgcmVzZXQgdG8gdGhhdCBzdGF0ZS5cbiAgICovXG4gIGNoZWNrcG9pbnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAvLyByZWFjdE1vdW50UmVhZHkgaXMgdGhlIG91ciBvbmx5IHN0YXRlZnVsIHdyYXBwZXJcbiAgICByZXR1cm4gdGhpcy5yZWFjdE1vdW50UmVhZHkuY2hlY2twb2ludCgpO1xuICB9LFxuXG4gIHJvbGxiYWNrOiBmdW5jdGlvbiAoY2hlY2twb2ludCkge1xuICAgIHRoaXMucmVhY3RNb3VudFJlYWR5LnJvbGxiYWNrKGNoZWNrcG9pbnQpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBgUG9vbGVkQ2xhc3NgIGxvb2tzIGZvciB0aGlzLCBhbmQgd2lsbCBpbnZva2UgdGhpcyBiZWZvcmUgYWxsb3dpbmcgdGhpc1xuICAgKiBpbnN0YW5jZSB0byBiZSByZXVzZWQuXG4gICAqL1xuICBkZXN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgQ2FsbGJhY2tRdWV1ZS5yZWxlYXNlKHRoaXMucmVhY3RNb3VudFJlYWR5KTtcbiAgICB0aGlzLnJlYWN0TW91bnRSZWFkeSA9IG51bGw7XG4gIH1cbn07XG5cbl9hc3NpZ24oUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5wcm90b3R5cGUsIFRyYW5zYWN0aW9uLCBNaXhpbik7XG5cblBvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uKTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdFJlZiA9IHJlcXVpcmUoJy4vUmVhY3RSZWYnKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcblxudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbi8qKlxuICogSGVscGVyIHRvIGNhbGwgUmVhY3RSZWYuYXR0YWNoUmVmcyB3aXRoIHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCwgc3BsaXQgb3V0XG4gKiB0byBhdm9pZCBhbGxvY2F0aW9ucyBpbiB0aGUgdHJhbnNhY3Rpb24gbW91bnQtcmVhZHkgcXVldWUuXG4gKi9cbmZ1bmN0aW9uIGF0dGFjaFJlZnMoKSB7XG4gIFJlYWN0UmVmLmF0dGFjaFJlZnModGhpcywgdGhpcy5fY3VycmVudEVsZW1lbnQpO1xufVxuXG52YXIgUmVhY3RSZWNvbmNpbGVyID0ge1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgY29tcG9uZW50LCByZW5kZXJzIG1hcmt1cCwgYW5kIHJlZ2lzdGVycyBldmVudCBsaXN0ZW5lcnMuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGludGVybmFsSW5zdGFuY2VcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7P29iamVjdH0gdGhlIGNvbnRhaW5pbmcgaG9zdCBjb21wb25lbnQgaW5zdGFuY2VcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBpbmZvIGFib3V0IHRoZSBob3N0IGNvbnRhaW5lclxuICAgKiBAcmV0dXJuIHs/c3RyaW5nfSBSZW5kZXJlZCBtYXJrdXAgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgRE9NLlxuICAgKiBAZmluYWxcbiAgICogQGludGVybmFsXG4gICAqL1xuICBtb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGludGVybmFsSW5zdGFuY2UsIHRyYW5zYWN0aW9uLCBob3N0UGFyZW50LCBob3N0Q29udGFpbmVySW5mbywgY29udGV4dCwgcGFyZW50RGVidWdJRCAvLyAwIGluIHByb2R1Y3Rpb24gYW5kIGZvciByb290c1xuICApIHtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vbkJlZm9yZU1vdW50Q29tcG9uZW50KGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQsIGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50LCBwYXJlbnREZWJ1Z0lEKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIG1hcmt1cCA9IGludGVybmFsSW5zdGFuY2UubW91bnRDb21wb25lbnQodHJhbnNhY3Rpb24sIGhvc3RQYXJlbnQsIGhvc3RDb250YWluZXJJbmZvLCBjb250ZXh0LCBwYXJlbnREZWJ1Z0lEKTtcbiAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQgJiYgaW50ZXJuYWxJbnN0YW5jZS5fY3VycmVudEVsZW1lbnQucmVmICE9IG51bGwpIHtcbiAgICAgIHRyYW5zYWN0aW9uLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoYXR0YWNoUmVmcywgaW50ZXJuYWxJbnN0YW5jZSk7XG4gICAgfVxuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uTW91bnRDb21wb25lbnQoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXJrdXA7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB2YWx1ZSB0aGF0IGNhbiBiZSBwYXNzZWQgdG9cbiAgICogUmVhY3RDb21wb25lbnRFbnZpcm9ubWVudC5yZXBsYWNlTm9kZVdpdGhNYXJrdXAuXG4gICAqL1xuICBnZXRIb3N0Tm9kZTogZnVuY3Rpb24gKGludGVybmFsSW5zdGFuY2UpIHtcbiAgICByZXR1cm4gaW50ZXJuYWxJbnN0YW5jZS5nZXRIb3N0Tm9kZSgpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSBgbW91bnRDb21wb25lbnRgLlxuICAgKlxuICAgKiBAZmluYWxcbiAgICogQGludGVybmFsXG4gICAqL1xuICB1bm1vdW50Q29tcG9uZW50OiBmdW5jdGlvbiAoaW50ZXJuYWxJbnN0YW5jZSwgc2FmZWx5KSB7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBpZiAoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCAhPT0gMCkge1xuICAgICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25CZWZvcmVVbm1vdW50Q29tcG9uZW50KGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQpO1xuICAgICAgfVxuICAgIH1cbiAgICBSZWFjdFJlZi5kZXRhY2hSZWZzKGludGVybmFsSW5zdGFuY2UsIGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50KTtcbiAgICBpbnRlcm5hbEluc3RhbmNlLnVubW91bnRDb21wb25lbnQoc2FmZWx5KTtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9kZWJ1Z0lEICE9PSAwKSB7XG4gICAgICAgIFJlYWN0SW5zdHJ1bWVudGF0aW9uLmRlYnVnVG9vbC5vblVubW91bnRDb21wb25lbnQoaW50ZXJuYWxJbnN0YW5jZS5fZGVidWdJRCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYSBjb21wb25lbnQgdXNpbmcgYSBuZXcgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gaW50ZXJuYWxJbnN0YW5jZVxuICAgKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gbmV4dEVsZW1lbnRcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge29iamVjdH0gY29udGV4dFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlY2VpdmVDb21wb25lbnQ6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3RhbmNlLCBuZXh0RWxlbWVudCwgdHJhbnNhY3Rpb24sIGNvbnRleHQpIHtcbiAgICB2YXIgcHJldkVsZW1lbnQgPSBpbnRlcm5hbEluc3RhbmNlLl9jdXJyZW50RWxlbWVudDtcblxuICAgIGlmIChuZXh0RWxlbWVudCA9PT0gcHJldkVsZW1lbnQgJiYgY29udGV4dCA9PT0gaW50ZXJuYWxJbnN0YW5jZS5fY29udGV4dCkge1xuICAgICAgLy8gU2luY2UgZWxlbWVudHMgYXJlIGltbXV0YWJsZSBhZnRlciB0aGUgb3duZXIgaXMgcmVuZGVyZWQsXG4gICAgICAvLyB3ZSBjYW4gZG8gYSBjaGVhcCBpZGVudGl0eSBjb21wYXJlIGhlcmUgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgaXMgYVxuICAgICAgLy8gc3VwZXJmbHVvdXMgcmVjb25jaWxlLiBJdCdzIHBvc3NpYmxlIGZvciBzdGF0ZSB0byBiZSBtdXRhYmxlIGJ1dCBzdWNoXG4gICAgICAvLyBjaGFuZ2Ugc2hvdWxkIHRyaWdnZXIgYW4gdXBkYXRlIG9mIHRoZSBvd25lciB3aGljaCB3b3VsZCByZWNyZWF0ZVxuICAgICAgLy8gdGhlIGVsZW1lbnQuIFdlIGV4cGxpY2l0bHkgY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW4gb3duZXIgc2luY2VcbiAgICAgIC8vIGl0J3MgcG9zc2libGUgZm9yIGFuIGVsZW1lbnQgY3JlYXRlZCBvdXRzaWRlIGEgY29tcG9zaXRlIHRvIGJlXG4gICAgICAvLyBkZWVwbHkgbXV0YXRlZCBhbmQgcmV1c2VkLlxuXG4gICAgICAvLyBUT0RPOiBCYWlsaW5nIG91dCBlYXJseSBpcyBqdXN0IGEgcGVyZiBvcHRpbWl6YXRpb24gcmlnaHQ/XG4gICAgICAvLyBUT0RPOiBSZW1vdmluZyB0aGUgcmV0dXJuIHN0YXRlbWVudCBzaG91bGQgYWZmZWN0IGNvcnJlY3RuZXNzP1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVmb3JlVXBkYXRlQ29tcG9uZW50KGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQsIG5leHRFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmVmc0NoYW5nZWQgPSBSZWFjdFJlZi5zaG91bGRVcGRhdGVSZWZzKHByZXZFbGVtZW50LCBuZXh0RWxlbWVudCk7XG5cbiAgICBpZiAocmVmc0NoYW5nZWQpIHtcbiAgICAgIFJlYWN0UmVmLmRldGFjaFJlZnMoaW50ZXJuYWxJbnN0YW5jZSwgcHJldkVsZW1lbnQpO1xuICAgIH1cblxuICAgIGludGVybmFsSW5zdGFuY2UucmVjZWl2ZUNvbXBvbmVudChuZXh0RWxlbWVudCwgdHJhbnNhY3Rpb24sIGNvbnRleHQpO1xuXG4gICAgaWYgKHJlZnNDaGFuZ2VkICYmIGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50ICYmIGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50LnJlZiAhPSBudWxsKSB7XG4gICAgICB0cmFuc2FjdGlvbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGF0dGFjaFJlZnMsIGludGVybmFsSW5zdGFuY2UpO1xuICAgIH1cblxuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uVXBkYXRlQ29tcG9uZW50KGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogRmx1c2ggYW55IGRpcnR5IGNoYW5nZXMgaW4gYSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDb21wb25lbnR9IGludGVybmFsSW5zdGFuY2VcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHBlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeTogZnVuY3Rpb24gKGludGVybmFsSW5zdGFuY2UsIHRyYW5zYWN0aW9uLCB1cGRhdGVCYXRjaE51bWJlcikge1xuICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl91cGRhdGVCYXRjaE51bWJlciAhPT0gdXBkYXRlQmF0Y2hOdW1iZXIpIHtcbiAgICAgIC8vIFRoZSBjb21wb25lbnQncyBlbnF1ZXVlZCBiYXRjaCBudW1iZXIgc2hvdWxkIGFsd2F5cyBiZSB0aGUgY3VycmVudFxuICAgICAgLy8gYmF0Y2ggb3IgdGhlIGZvbGxvd2luZyBvbmUuXG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoaW50ZXJuYWxJbnN0YW5jZS5fdXBkYXRlQmF0Y2hOdW1iZXIgPT0gbnVsbCB8fCBpbnRlcm5hbEluc3RhbmNlLl91cGRhdGVCYXRjaE51bWJlciA9PT0gdXBkYXRlQmF0Y2hOdW1iZXIgKyAxLCAncGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5OiBVbmV4cGVjdGVkIGJhdGNoIG51bWJlciAoY3VycmVudCAlcywgJyArICdwZW5kaW5nICVzKScsIHVwZGF0ZUJhdGNoTnVtYmVyLCBpbnRlcm5hbEluc3RhbmNlLl91cGRhdGVCYXRjaE51bWJlcikgOiB2b2lkIDA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVmb3JlVXBkYXRlQ29tcG9uZW50KGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQsIGludGVybmFsSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaW50ZXJuYWxJbnN0YW5jZS5wZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkodHJhbnNhY3Rpb24pO1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQgIT09IDApIHtcbiAgICAgICAgUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uVXBkYXRlQ29tcG9uZW50KGludGVybmFsSW5zdGFuY2UuX2RlYnVnSUQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0UmVjb25jaWxlcjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdE93bmVyID0gcmVxdWlyZSgnLi9SZWFjdE93bmVyJyk7XG5cbnZhciBSZWFjdFJlZiA9IHt9O1xuXG5mdW5jdGlvbiBhdHRhY2hSZWYocmVmLCBjb21wb25lbnQsIG93bmVyKSB7XG4gIGlmICh0eXBlb2YgcmVmID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVmKGNvbXBvbmVudC5nZXRQdWJsaWNJbnN0YW5jZSgpKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMZWdhY3kgcmVmXG4gICAgUmVhY3RPd25lci5hZGRDb21wb25lbnRBc1JlZlRvKGNvbXBvbmVudCwgcmVmLCBvd25lcik7XG4gIH1cbn1cblxuZnVuY3Rpb24gZGV0YWNoUmVmKHJlZiwgY29tcG9uZW50LCBvd25lcikge1xuICBpZiAodHlwZW9mIHJlZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJlZihudWxsKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMZWdhY3kgcmVmXG4gICAgUmVhY3RPd25lci5yZW1vdmVDb21wb25lbnRBc1JlZkZyb20oY29tcG9uZW50LCByZWYsIG93bmVyKTtcbiAgfVxufVxuXG5SZWFjdFJlZi5hdHRhY2hSZWZzID0gZnVuY3Rpb24gKGluc3RhbmNlLCBlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50ID09PSBudWxsIHx8IHR5cGVvZiBlbGVtZW50ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7XG4gIGlmIChyZWYgIT0gbnVsbCkge1xuICAgIGF0dGFjaFJlZihyZWYsIGluc3RhbmNlLCBlbGVtZW50Ll9vd25lcik7XG4gIH1cbn07XG5cblJlYWN0UmVmLnNob3VsZFVwZGF0ZVJlZnMgPSBmdW5jdGlvbiAocHJldkVsZW1lbnQsIG5leHRFbGVtZW50KSB7XG4gIC8vIElmIGVpdGhlciB0aGUgb3duZXIgb3IgYSBgcmVmYCBoYXMgY2hhbmdlZCwgbWFrZSBzdXJlIHRoZSBuZXdlc3Qgb3duZXJcbiAgLy8gaGFzIHN0b3JlZCBhIHJlZmVyZW5jZSB0byBgdGhpc2AsIGFuZCB0aGUgcHJldmlvdXMgb3duZXIgKGlmIGRpZmZlcmVudClcbiAgLy8gaGFzIGZvcmdvdHRlbiB0aGUgcmVmZXJlbmNlIHRvIGB0aGlzYC4gV2UgdXNlIHRoZSBlbGVtZW50IGluc3RlYWRcbiAgLy8gb2YgdGhlIHB1YmxpYyB0aGlzLnByb3BzIGJlY2F1c2UgdGhlIHBvc3QgcHJvY2Vzc2luZyBjYW5ub3QgZGV0ZXJtaW5lXG4gIC8vIGEgcmVmLiBUaGUgcmVmIGNvbmNlcHR1YWxseSBsaXZlcyBvbiB0aGUgZWxlbWVudC5cblxuICAvLyBUT0RPOiBTaG91bGQgdGhpcyBldmVuIGJlIHBvc3NpYmxlPyBUaGUgb3duZXIgY2Fubm90IGNoYW5nZSBiZWNhdXNlXG4gIC8vIGl0J3MgZm9yYmlkZGVuIGJ5IHNob3VsZFVwZGF0ZVJlYWN0Q29tcG9uZW50LiBUaGUgcmVmIGNhbiBjaGFuZ2VcbiAgLy8gaWYgeW91IHN3YXAgdGhlIGtleXMgb2YgYnV0IG5vdCB0aGUgcmVmcy4gUmVjb25zaWRlciB3aGVyZSB0aGlzIGNoZWNrXG4gIC8vIGlzIG1hZGUuIEl0IHByb2JhYmx5IGJlbG9uZ3Mgd2hlcmUgdGhlIGtleSBjaGVja2luZyBhbmRcbiAgLy8gaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudCBpcyBkb25lLlxuXG4gIHZhciBwcmV2UmVmID0gbnVsbDtcbiAgdmFyIHByZXZPd25lciA9IG51bGw7XG4gIGlmIChwcmV2RWxlbWVudCAhPT0gbnVsbCAmJiB0eXBlb2YgcHJldkVsZW1lbnQgPT09ICdvYmplY3QnKSB7XG4gICAgcHJldlJlZiA9IHByZXZFbGVtZW50LnJlZjtcbiAgICBwcmV2T3duZXIgPSBwcmV2RWxlbWVudC5fb3duZXI7XG4gIH1cblxuICB2YXIgbmV4dFJlZiA9IG51bGw7XG4gIHZhciBuZXh0T3duZXIgPSBudWxsO1xuICBpZiAobmV4dEVsZW1lbnQgIT09IG51bGwgJiYgdHlwZW9mIG5leHRFbGVtZW50ID09PSAnb2JqZWN0Jykge1xuICAgIG5leHRSZWYgPSBuZXh0RWxlbWVudC5yZWY7XG4gICAgbmV4dE93bmVyID0gbmV4dEVsZW1lbnQuX293bmVyO1xuICB9XG5cbiAgcmV0dXJuIHByZXZSZWYgIT09IG5leHRSZWYgfHxcbiAgLy8gSWYgb3duZXIgY2hhbmdlcyBidXQgd2UgaGF2ZSBhbiB1bmNoYW5nZWQgZnVuY3Rpb24gcmVmLCBkb24ndCB1cGRhdGUgcmVmc1xuICB0eXBlb2YgbmV4dFJlZiA9PT0gJ3N0cmluZycgJiYgbmV4dE93bmVyICE9PSBwcmV2T3duZXI7XG59O1xuXG5SZWFjdFJlZi5kZXRhY2hSZWZzID0gZnVuY3Rpb24gKGluc3RhbmNlLCBlbGVtZW50KSB7XG4gIGlmIChlbGVtZW50ID09PSBudWxsIHx8IHR5cGVvZiBlbGVtZW50ICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7XG4gIGlmIChyZWYgIT0gbnVsbCkge1xuICAgIGRldGFjaFJlZihyZWYsIGluc3RhbmNlLCBlbGVtZW50Ll9vd25lcik7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RSZWY7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBQb29sZWRDbGFzcyA9IHJlcXVpcmUoJy4vUG9vbGVkQ2xhc3MnKTtcbnZhciBUcmFuc2FjdGlvbiA9IHJlcXVpcmUoJy4vVHJhbnNhY3Rpb24nKTtcbnZhciBSZWFjdEluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0cnVtZW50YXRpb24nKTtcbnZhciBSZWFjdFNlcnZlclVwZGF0ZVF1ZXVlID0gcmVxdWlyZSgnLi9SZWFjdFNlcnZlclVwZGF0ZVF1ZXVlJyk7XG5cbi8qKlxuICogRXhlY3V0ZWQgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgYFRyYW5zYWN0aW9uYCBpbnN0YW5jZS4gQ29uc2lkZXIgdGhlc2UgYXNcbiAqIGJlaW5nIG1lbWJlciBtZXRob2RzLCBidXQgd2l0aCBhbiBpbXBsaWVkIG9yZGVyaW5nIHdoaWxlIGJlaW5nIGlzb2xhdGVkIGZyb21cbiAqIGVhY2ggb3RoZXIuXG4gKi9cbnZhciBUUkFOU0FDVElPTl9XUkFQUEVSUyA9IFtdO1xuXG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgVFJBTlNBQ1RJT05fV1JBUFBFUlMucHVzaCh7XG4gICAgaW5pdGlhbGl6ZTogUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uQmVnaW5GbHVzaCxcbiAgICBjbG9zZTogUmVhY3RJbnN0cnVtZW50YXRpb24uZGVidWdUb29sLm9uRW5kRmx1c2hcbiAgfSk7XG59XG5cbnZhciBub29wQ2FsbGJhY2tRdWV1ZSA9IHtcbiAgZW5xdWV1ZTogZnVuY3Rpb24gKCkge31cbn07XG5cbi8qKlxuICogQGNsYXNzIFJlYWN0U2VydmVyUmVuZGVyaW5nVHJhbnNhY3Rpb25cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVuZGVyVG9TdGF0aWNNYXJrdXBcbiAqL1xuZnVuY3Rpb24gUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbihyZW5kZXJUb1N0YXRpY01hcmt1cCkge1xuICB0aGlzLnJlaW5pdGlhbGl6ZVRyYW5zYWN0aW9uKCk7XG4gIHRoaXMucmVuZGVyVG9TdGF0aWNNYXJrdXAgPSByZW5kZXJUb1N0YXRpY01hcmt1cDtcbiAgdGhpcy51c2VDcmVhdGVFbGVtZW50ID0gZmFsc2U7XG4gIHRoaXMudXBkYXRlUXVldWUgPSBuZXcgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZSh0aGlzKTtcbn1cblxudmFyIE1peGluID0ge1xuICAvKipcbiAgICogQHNlZSBUcmFuc2FjdGlvblxuICAgKiBAYWJzdHJhY3RcbiAgICogQGZpbmFsXG4gICAqIEByZXR1cm4ge2FycmF5fSBFbXB0eSBsaXN0IG9mIG9wZXJhdGlvbiB3cmFwIHByb2NlZHVyZXMuXG4gICAqL1xuICBnZXRUcmFuc2FjdGlvbldyYXBwZXJzOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIFRSQU5TQUNUSU9OX1dSQVBQRVJTO1xuICB9LFxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9IFRoZSBxdWV1ZSB0byBjb2xsZWN0IGBvbkRPTVJlYWR5YCBjYWxsYmFja3Mgd2l0aC5cbiAgICovXG4gIGdldFJlYWN0TW91bnRSZWFkeTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBub29wQ2FsbGJhY2tRdWV1ZTtcbiAgfSxcblxuICAvKipcbiAgICogQHJldHVybiB7b2JqZWN0fSBUaGUgcXVldWUgdG8gY29sbGVjdCBSZWFjdCBhc3luYyBldmVudHMuXG4gICAqL1xuICBnZXRVcGRhdGVRdWV1ZTogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZVF1ZXVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBgUG9vbGVkQ2xhc3NgIGxvb2tzIGZvciB0aGlzLCBhbmQgd2lsbCBpbnZva2UgdGhpcyBiZWZvcmUgYWxsb3dpbmcgdGhpc1xuICAgKiBpbnN0YW5jZSB0byBiZSByZXVzZWQuXG4gICAqL1xuICBkZXN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7fSxcblxuICBjaGVja3BvaW50OiBmdW5jdGlvbiAoKSB7fSxcblxuICByb2xsYmFjazogZnVuY3Rpb24gKCkge31cbn07XG5cbl9hc3NpZ24oUmVhY3RTZXJ2ZXJSZW5kZXJpbmdUcmFuc2FjdGlvbi5wcm90b3R5cGUsIFRyYW5zYWN0aW9uLCBNaXhpbik7XG5cblBvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uKTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFNlcnZlclJlbmRlcmluZ1RyYW5zYWN0aW9uOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxudmFyIFJlYWN0VXBkYXRlUXVldWUgPSByZXF1aXJlKCcuL1JlYWN0VXBkYXRlUXVldWUnKTtcblxudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbmZ1bmN0aW9uIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IHB1YmxpY0luc3RhbmNlLmNvbnN0cnVjdG9yO1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzKC4uLik6IENhbiBvbmx5IHVwZGF0ZSBhIG1vdW50aW5nIGNvbXBvbmVudC4gJyArICdUaGlzIHVzdWFsbHkgbWVhbnMgeW91IGNhbGxlZCAlcygpIG91dHNpZGUgY29tcG9uZW50V2lsbE1vdW50KCkgb24gdGhlIHNlcnZlci4gJyArICdUaGlzIGlzIGEgbm8tb3AuIFBsZWFzZSBjaGVjayB0aGUgY29kZSBmb3IgdGhlICVzIGNvbXBvbmVudC4nLCBjYWxsZXJOYW1lLCBjYWxsZXJOYW1lLCBjb25zdHJ1Y3RvciAmJiAoY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgY29uc3RydWN0b3IubmFtZSkgfHwgJ1JlYWN0Q2xhc3MnKSA6IHZvaWQgMDtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHVwZGF0ZSBxdWV1ZSB1c2VkIGZvciBzZXJ2ZXIgcmVuZGVyaW5nLlxuICogSXQgZGVsZWdhdGVzIHRvIFJlYWN0VXBkYXRlUXVldWUgd2hpbGUgc2VydmVyIHJlbmRlcmluZyBpcyBpbiBwcm9ncmVzcyBhbmRcbiAqIHN3aXRjaGVzIHRvIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlIGFmdGVyIHRoZSB0cmFuc2FjdGlvbiBoYXMgY29tcGxldGVkLlxuICogQGNsYXNzIFJlYWN0U2VydmVyVXBkYXRlUXVldWVcbiAqIEBwYXJhbSB7VHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gKi9cblxudmFyIFJlYWN0U2VydmVyVXBkYXRlUXVldWUgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFJlYWN0U2VydmVyVXBkYXRlUXVldWUodHJhbnNhY3Rpb24pIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZSk7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB3ZSB3YW50IHRvIHRlc3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBmaW5hbFxuICAgKi9cblxuXG4gIFJlYWN0U2VydmVyVXBkYXRlUXVldWUucHJvdG90eXBlLmlzTW91bnRlZCA9IGZ1bmN0aW9uIGlzTW91bnRlZChwdWJsaWNJbnN0YW5jZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogRW5xdWV1ZSBhIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhZnRlciBhbGwgdGhlIHBlbmRpbmcgdXBkYXRlc1xuICAgKiBoYXZlIHByb2Nlc3NlZC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdG8gdXNlIGFzIGB0aGlzYCBjb250ZXh0LlxuICAgKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuXG4gIFJlYWN0U2VydmVyVXBkYXRlUXVldWUucHJvdG90eXBlLmVucXVldWVDYWxsYmFjayA9IGZ1bmN0aW9uIGVucXVldWVDYWxsYmFjayhwdWJsaWNJbnN0YW5jZSwgY2FsbGJhY2ssIGNhbGxlck5hbWUpIHtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5pc0luVHJhbnNhY3Rpb24oKSkge1xuICAgICAgUmVhY3RVcGRhdGVRdWV1ZS5lbnF1ZXVlQ2FsbGJhY2socHVibGljSW5zdGFuY2UsIGNhbGxiYWNrLCBjYWxsZXJOYW1lKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEZvcmNlcyBhbiB1cGRhdGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHdpdGhcbiAgICogY2VydGFpbnR5IHRoYXQgd2UgYXJlICoqbm90KiogaW4gYSBET00gdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFlvdSBtYXkgd2FudCB0byBjYWxsIHRoaXMgd2hlbiB5b3Uga25vdyB0aGF0IHNvbWUgZGVlcGVyIGFzcGVjdCBvZiB0aGVcbiAgICogY29tcG9uZW50J3Mgc3RhdGUgaGFzIGNoYW5nZWQgYnV0IGBzZXRTdGF0ZWAgd2FzIG5vdCBjYWxsZWQuXG4gICAqXG4gICAqIFRoaXMgd2lsbCBub3QgaW52b2tlIGBzaG91bGRDb21wb25lbnRVcGRhdGVgLCBidXQgaXQgd2lsbCBpbnZva2VcbiAgICogYGNvbXBvbmVudFdpbGxVcGRhdGVgIGFuZCBgY29tcG9uZW50RGlkVXBkYXRlYC5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cblxuXG4gIFJlYWN0U2VydmVyVXBkYXRlUXVldWUucHJvdG90eXBlLmVucXVldWVGb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIGVucXVldWVGb3JjZVVwZGF0ZShwdWJsaWNJbnN0YW5jZSkge1xuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uLmlzSW5UcmFuc2FjdGlvbigpKSB7XG4gICAgICBSZWFjdFVwZGF0ZVF1ZXVlLmVucXVldWVGb3JjZVVwZGF0ZShwdWJsaWNJbnN0YW5jZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIGFsbCBvZiB0aGUgc3RhdGUuIEFsd2F5cyB1c2UgdGhpcyBvciBgc2V0U3RhdGVgIHRvIG11dGF0ZSBzdGF0ZS5cbiAgICogWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICAgKlxuICAgKiBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBgdGhpcy5zdGF0ZWAgd2lsbCBiZSBpbW1lZGlhdGVseSB1cGRhdGVkLCBzb1xuICAgKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R8ZnVuY3Rpb259IGNvbXBsZXRlU3RhdGUgTmV4dCBzdGF0ZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuXG5cbiAgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZS5wcm90b3R5cGUuZW5xdWV1ZVJlcGxhY2VTdGF0ZSA9IGZ1bmN0aW9uIGVucXVldWVSZXBsYWNlU3RhdGUocHVibGljSW5zdGFuY2UsIGNvbXBsZXRlU3RhdGUpIHtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5pc0luVHJhbnNhY3Rpb24oKSkge1xuICAgICAgUmVhY3RVcGRhdGVRdWV1ZS5lbnF1ZXVlUmVwbGFjZVN0YXRlKHB1YmxpY0luc3RhbmNlLCBjb21wbGV0ZVN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdyZXBsYWNlU3RhdGUnKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2UgX3BlbmRpbmdTdGF0ZSBpc1xuICAgKiBpbnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcgc3RyYXRlZ3kgdGhhdCBpcyBub3QgYXZhaWxhYmxlIHRvIGRlZXBcbiAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25mdXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0XG4gICAqIGR1cmluZyB0aGUgbWVyZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbn0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBzdGF0ZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuXG5cbiAgUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZS5wcm90b3R5cGUuZW5xdWV1ZVNldFN0YXRlID0gZnVuY3Rpb24gZW5xdWV1ZVNldFN0YXRlKHB1YmxpY0luc3RhbmNlLCBwYXJ0aWFsU3RhdGUpIHtcbiAgICBpZiAodGhpcy50cmFuc2FjdGlvbi5pc0luVHJhbnNhY3Rpb24oKSkge1xuICAgICAgUmVhY3RVcGRhdGVRdWV1ZS5lbnF1ZXVlU2V0U3RhdGUocHVibGljSW5zdGFuY2UsIHBhcnRpYWxTdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCAnc2V0U3RhdGUnKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFJlYWN0U2VydmVyVXBkYXRlUXVldWU7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RTZXJ2ZXJVcGRhdGVRdWV1ZTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDdXJyZW50T3duZXInKTtcbnZhciBSZWFjdEluc3RhbmNlTWFwID0gcmVxdWlyZSgnLi9SZWFjdEluc3RhbmNlTWFwJyk7XG52YXIgUmVhY3RJbnN0cnVtZW50YXRpb24gPSByZXF1aXJlKCcuL1JlYWN0SW5zdHJ1bWVudGF0aW9uJyk7XG52YXIgUmVhY3RVcGRhdGVzID0gcmVxdWlyZSgnLi9SZWFjdFVwZGF0ZXMnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbmZ1bmN0aW9uIGVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSkge1xuICBSZWFjdFVwZGF0ZXMuZW5xdWV1ZVVwZGF0ZShpbnRlcm5hbEluc3RhbmNlKTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VW5leHBlY3RlZEFyZ3VtZW50KGFyZykge1xuICB2YXIgdHlwZSA9IHR5cGVvZiBhcmc7XG4gIGlmICh0eXBlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG4gIHZhciBkaXNwbGF5TmFtZSA9IGFyZy5jb25zdHJ1Y3RvciAmJiBhcmcuY29uc3RydWN0b3IubmFtZSB8fCB0eXBlO1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFyZyk7XG4gIGlmIChrZXlzLmxlbmd0aCA+IDAgJiYga2V5cy5sZW5ndGggPCAyMCkge1xuICAgIHJldHVybiBkaXNwbGF5TmFtZSArICcgKGtleXM6ICcgKyBrZXlzLmpvaW4oJywgJykgKyAnKSc7XG4gIH1cbiAgcmV0dXJuIGRpc3BsYXlOYW1lO1xufVxuXG5mdW5jdGlvbiBnZXRJbnRlcm5hbEluc3RhbmNlUmVhZHlGb3JVcGRhdGUocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUpIHtcbiAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBSZWFjdEluc3RhbmNlTWFwLmdldChwdWJsaWNJbnN0YW5jZSk7XG4gIGlmICghaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFyIGN0b3IgPSBwdWJsaWNJbnN0YW5jZS5jb25zdHJ1Y3RvcjtcbiAgICAgIC8vIE9ubHkgd2FybiB3aGVuIHdlIGhhdmUgYSBjYWxsZXJOYW1lLiBPdGhlcndpc2Ugd2Ugc2hvdWxkIGJlIHNpbGVudC5cbiAgICAgIC8vIFdlJ3JlIHByb2JhYmx5IGNhbGxpbmcgZnJvbSBlbnF1ZXVlQ2FsbGJhY2suIFdlIGRvbid0IHdhbnQgdG8gd2FyblxuICAgICAgLy8gdGhlcmUgYmVjYXVzZSB3ZSBhbHJlYWR5IHdhcm5lZCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgbGlmZWN5Y2xlIG1ldGhvZC5cbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyghY2FsbGVyTmFtZSwgJyVzKC4uLik6IENhbiBvbmx5IHVwZGF0ZSBhIG1vdW50ZWQgb3IgbW91bnRpbmcgY29tcG9uZW50LiAnICsgJ1RoaXMgdXN1YWxseSBtZWFucyB5b3UgY2FsbGVkICVzKCkgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4gJyArICdUaGlzIGlzIGEgbm8tb3AuIFBsZWFzZSBjaGVjayB0aGUgY29kZSBmb3IgdGhlICVzIGNvbXBvbmVudC4nLCBjYWxsZXJOYW1lLCBjYWxsZXJOYW1lLCBjdG9yICYmIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgfHwgJ1JlYWN0Q2xhc3MnKSA6IHZvaWQgMDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCA9PSBudWxsLCAnJXMoLi4uKTogQ2Fubm90IHVwZGF0ZSBkdXJpbmcgYW4gZXhpc3Rpbmcgc3RhdGUgdHJhbnNpdGlvbiAoc3VjaCBhcyAnICsgJ3dpdGhpbiBgcmVuZGVyYCBvciBhbm90aGVyIGNvbXBvbmVudFxcJ3MgY29uc3RydWN0b3IpLiBSZW5kZXIgbWV0aG9kcyAnICsgJ3Nob3VsZCBiZSBhIHB1cmUgZnVuY3Rpb24gb2YgcHJvcHMgYW5kIHN0YXRlOyBjb25zdHJ1Y3RvciAnICsgJ3NpZGUtZWZmZWN0cyBhcmUgYW4gYW50aS1wYXR0ZXJuLCBidXQgY2FuIGJlIG1vdmVkIHRvICcgKyAnYGNvbXBvbmVudFdpbGxNb3VudGAuJywgY2FsbGVyTmFtZSkgOiB2b2lkIDA7XG4gIH1cblxuICByZXR1cm4gaW50ZXJuYWxJbnN0YW5jZTtcbn1cblxuLyoqXG4gKiBSZWFjdFVwZGF0ZVF1ZXVlIGFsbG93cyBmb3Igc3RhdGUgdXBkYXRlcyB0byBiZSBzY2hlZHVsZWQgaW50byBhIGxhdGVyXG4gKiByZWNvbmNpbGlhdGlvbiBzdGVwLlxuICovXG52YXIgUmVhY3RVcGRhdGVRdWV1ZSA9IHtcblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgb3Igbm90IHRoaXMgY29tcG9zaXRlIGNvbXBvbmVudCBpcyBtb3VudGVkLlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB3ZSB3YW50IHRvIHRlc3QuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgaXNNb3VudGVkOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG4gICAgICBpZiAob3duZXIgIT09IG51bGwpIHtcbiAgICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKG93bmVyLl93YXJuZWRBYm91dFJlZnNJblJlbmRlciwgJyVzIGlzIGFjY2Vzc2luZyBpc01vdW50ZWQgaW5zaWRlIGl0cyByZW5kZXIoKSBmdW5jdGlvbi4gJyArICdyZW5kZXIoKSBzaG91bGQgYmUgYSBwdXJlIGZ1bmN0aW9uIG9mIHByb3BzIGFuZCBzdGF0ZS4gSXQgc2hvdWxkICcgKyAnbmV2ZXIgYWNjZXNzIHNvbWV0aGluZyB0aGF0IHJlcXVpcmVzIHN0YWxlIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgJyArICdyZW5kZXIsIHN1Y2ggYXMgcmVmcy4gTW92ZSB0aGlzIGxvZ2ljIHRvIGNvbXBvbmVudERpZE1vdW50IGFuZCAnICsgJ2NvbXBvbmVudERpZFVwZGF0ZSBpbnN0ZWFkLicsIG93bmVyLmdldE5hbWUoKSB8fCAnQSBjb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICAgICAgb3duZXIuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBSZWFjdEluc3RhbmNlTWFwLmdldChwdWJsaWNJbnN0YW5jZSk7XG4gICAgaWYgKGludGVybmFsSW5zdGFuY2UpIHtcbiAgICAgIC8vIER1cmluZyBjb21wb25lbnRXaWxsTW91bnQgYW5kIHJlbmRlciB0aGlzIHdpbGwgc3RpbGwgYmUgbnVsbCBidXQgYWZ0ZXJcbiAgICAgIC8vIHRoYXQgd2lsbCBhbHdheXMgcmVuZGVyIHRvIHNvbWV0aGluZy4gQXQgbGVhc3QgZm9yIG5vdy4gU28gd2UgY2FuIHVzZVxuICAgICAgLy8gdGhpcyBoYWNrLlxuICAgICAgcmV0dXJuICEhaW50ZXJuYWxJbnN0YW5jZS5fcmVuZGVyZWRDb21wb25lbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG5cbiAgLyoqXG4gICAqIEVucXVldWUgYSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIgYWxsIHRoZSBwZW5kaW5nIHVwZGF0ZXNcbiAgICogaGF2ZSBwcm9jZXNzZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRvIHVzZSBhcyBgdGhpc2AgY29udGV4dC5cbiAgICogQHBhcmFtIHs/ZnVuY3Rpb259IGNhbGxiYWNrIENhbGxlZCBhZnRlciBzdGF0ZSBpcyB1cGRhdGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGVyTmFtZSBOYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGluIHRoZSBwdWJsaWMgQVBJLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVDYWxsYmFjazogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjYWxsYmFjaywgY2FsbGVyTmFtZSkge1xuICAgIFJlYWN0VXBkYXRlUXVldWUudmFsaWRhdGVDYWxsYmFjayhjYWxsYmFjaywgY2FsbGVyTmFtZSk7XG4gICAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBnZXRJbnRlcm5hbEluc3RhbmNlUmVhZHlGb3JVcGRhdGUocHVibGljSW5zdGFuY2UpO1xuXG4gICAgLy8gUHJldmlvdXNseSB3ZSB3b3VsZCB0aHJvdyBhbiBlcnJvciBpZiB3ZSBkaWRuJ3QgaGF2ZSBhbiBpbnRlcm5hbFxuICAgIC8vIGluc3RhbmNlLiBTaW5jZSB3ZSB3YW50IHRvIG1ha2UgaXQgYSBuby1vcCBpbnN0ZWFkLCB3ZSBtaXJyb3IgdGhlIHNhbWVcbiAgICAvLyBiZWhhdmlvciB3ZSBoYXZlIGluIG90aGVyIGVucXVldWUqIG1ldGhvZHMuXG4gICAgLy8gV2UgYWxzbyBuZWVkIHRvIGlnbm9yZSBjYWxsYmFja3MgaW4gY29tcG9uZW50V2lsbE1vdW50LiBTZWVcbiAgICAvLyBlbnF1ZXVlVXBkYXRlcy5cbiAgICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzKSB7XG4gICAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzID0gW2NhbGxiYWNrXTtcbiAgICB9XG4gICAgLy8gVE9ETzogVGhlIGNhbGxiYWNrIGhlcmUgaXMgaWdub3JlZCB3aGVuIHNldFN0YXRlIGlzIGNhbGxlZCBmcm9tXG4gICAgLy8gY29tcG9uZW50V2lsbE1vdW50LiBFaXRoZXIgZml4IGl0IG9yIGRpc2FsbG93IGRvaW5nIHNvIGNvbXBsZXRlbHkgaW5cbiAgICAvLyBmYXZvciBvZiBnZXRJbml0aWFsU3RhdGUuIEFsdGVybmF0aXZlbHksIHdlIGNhbiBkaXNhbGxvd1xuICAgIC8vIGNvbXBvbmVudFdpbGxNb3VudCBkdXJpbmcgc2VydmVyLXNpZGUgcmVuZGVyaW5nLlxuICAgIGVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSk7XG4gIH0sXG5cbiAgZW5xdWV1ZUNhbGxiYWNrSW50ZXJuYWw6IGZ1bmN0aW9uIChpbnRlcm5hbEluc3RhbmNlLCBjYWxsYmFjaykge1xuICAgIGlmIChpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzKSB7XG4gICAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nQ2FsbGJhY2tzID0gW2NhbGxiYWNrXTtcbiAgICB9XG4gICAgZW5xdWV1ZVVwZGF0ZShpbnRlcm5hbEluc3RhbmNlKTtcbiAgfSxcblxuICAvKipcbiAgICogRm9yY2VzIGFuIHVwZGF0ZS4gVGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIHdoZW4gaXQgaXMga25vd24gd2l0aFxuICAgKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogWW91IG1heSB3YW50IHRvIGNhbGwgdGhpcyB3aGVuIHlvdSBrbm93IHRoYXQgc29tZSBkZWVwZXIgYXNwZWN0IG9mIHRoZVxuICAgKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC5cbiAgICpcbiAgICogVGhpcyB3aWxsIG5vdCBpbnZva2UgYHNob3VsZENvbXBvbmVudFVwZGF0ZWAsIGJ1dCBpdCB3aWxsIGludm9rZVxuICAgKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0aGF0IHNob3VsZCByZXJlbmRlci5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBkYXRlKHB1YmxpY0luc3RhbmNlLCAnZm9yY2VVcGRhdGUnKTtcblxuICAgIGlmICghaW50ZXJuYWxJbnN0YW5jZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdGb3JjZVVwZGF0ZSA9IHRydWU7XG5cbiAgICBlbnF1ZXVlVXBkYXRlKGludGVybmFsSW5zdGFuY2UpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgb3IgYHNldFN0YXRlYCB0byBtdXRhdGUgc3RhdGUuXG4gICAqIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAgICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb21wbGV0ZVN0YXRlIE5leHQgc3RhdGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjb21wbGV0ZVN0YXRlLCBjYWxsYmFjaykge1xuICAgIHZhciBpbnRlcm5hbEluc3RhbmNlID0gZ2V0SW50ZXJuYWxJbnN0YW5jZVJlYWR5Rm9yVXBkYXRlKHB1YmxpY0luc3RhbmNlLCAncmVwbGFjZVN0YXRlJyk7XG5cbiAgICBpZiAoIWludGVybmFsSW5zdGFuY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nU3RhdGVRdWV1ZSA9IFtjb21wbGV0ZVN0YXRlXTtcbiAgICBpbnRlcm5hbEluc3RhbmNlLl9wZW5kaW5nUmVwbGFjZVN0YXRlID0gdHJ1ZTtcblxuICAgIC8vIEZ1dHVyZS1wcm9vZiAxNS41XG4gICAgaWYgKGNhbGxiYWNrICE9PSB1bmRlZmluZWQgJiYgY2FsbGJhY2sgIT09IG51bGwpIHtcbiAgICAgIFJlYWN0VXBkYXRlUXVldWUudmFsaWRhdGVDYWxsYmFjayhjYWxsYmFjaywgJ3JlcGxhY2VTdGF0ZScpO1xuICAgICAgaWYgKGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdDYWxsYmFja3MpIHtcbiAgICAgICAgaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ0NhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdDYWxsYmFja3MgPSBbY2FsbGJhY2tdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBUaGlzIG9ubHkgZXhpc3RzIGJlY2F1c2UgX3BlbmRpbmdTdGF0ZSBpc1xuICAgKiBpbnRlcm5hbC4gVGhpcyBwcm92aWRlcyBhIG1lcmdpbmcgc3RyYXRlZ3kgdGhhdCBpcyBub3QgYXZhaWxhYmxlIHRvIGRlZXBcbiAgICogcHJvcGVydGllcyB3aGljaCBpcyBjb25mdXNpbmcuIFRPRE86IEV4cG9zZSBwZW5kaW5nU3RhdGUgb3IgZG9uJ3QgdXNlIGl0XG4gICAqIGR1cmluZyB0aGUgbWVyZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBzdGF0ZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlU2V0U3RhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgcGFydGlhbFN0YXRlKSB7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBSZWFjdEluc3RydW1lbnRhdGlvbi5kZWJ1Z1Rvb2wub25TZXRTdGF0ZSgpO1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHBhcnRpYWxTdGF0ZSAhPSBudWxsLCAnc2V0U3RhdGUoLi4uKTogWW91IHBhc3NlZCBhbiB1bmRlZmluZWQgb3IgbnVsbCBzdGF0ZSBvYmplY3Q7ICcgKyAnaW5zdGVhZCwgdXNlIGZvcmNlVXBkYXRlKCkuJykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgdmFyIGludGVybmFsSW5zdGFuY2UgPSBnZXRJbnRlcm5hbEluc3RhbmNlUmVhZHlGb3JVcGRhdGUocHVibGljSW5zdGFuY2UsICdzZXRTdGF0ZScpO1xuXG4gICAgaWYgKCFpbnRlcm5hbEluc3RhbmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHF1ZXVlID0gaW50ZXJuYWxJbnN0YW5jZS5fcGVuZGluZ1N0YXRlUXVldWUgfHwgKGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdTdGF0ZVF1ZXVlID0gW10pO1xuICAgIHF1ZXVlLnB1c2gocGFydGlhbFN0YXRlKTtcblxuICAgIGVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSk7XG4gIH0sXG5cbiAgZW5xdWV1ZUVsZW1lbnRJbnRlcm5hbDogZnVuY3Rpb24gKGludGVybmFsSW5zdGFuY2UsIG5leHRFbGVtZW50LCBuZXh0Q29udGV4dCkge1xuICAgIGludGVybmFsSW5zdGFuY2UuX3BlbmRpbmdFbGVtZW50ID0gbmV4dEVsZW1lbnQ7XG4gICAgLy8gVE9ETzogaW50cm9kdWNlIF9wZW5kaW5nQ29udGV4dCBpbnN0ZWFkIG9mIHNldHRpbmcgaXQgZGlyZWN0bHkuXG4gICAgaW50ZXJuYWxJbnN0YW5jZS5fY29udGV4dCA9IG5leHRDb250ZXh0O1xuICAgIGVucXVldWVVcGRhdGUoaW50ZXJuYWxJbnN0YW5jZSk7XG4gIH0sXG5cbiAgdmFsaWRhdGVDYWxsYmFjazogZnVuY3Rpb24gKGNhbGxiYWNrLCBjYWxsZXJOYW1lKSB7XG4gICAgISghY2FsbGJhY2sgfHwgdHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXMoLi4uKTogRXhwZWN0ZWQgdGhlIGxhc3Qgb3B0aW9uYWwgYGNhbGxiYWNrYCBhcmd1bWVudCB0byBiZSBhIGZ1bmN0aW9uLiBJbnN0ZWFkIHJlY2VpdmVkOiAlcy4nLCBjYWxsZXJOYW1lLCBmb3JtYXRVbmV4cGVjdGVkQXJndW1lbnQoY2FsbGJhY2spKSA6IF9wcm9kSW52YXJpYW50KCcxMjInLCBjYWxsZXJOYW1lLCBmb3JtYXRVbmV4cGVjdGVkQXJndW1lbnQoY2FsbGJhY2spKSA6IHZvaWQgMDtcbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0VXBkYXRlUXVldWU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKSxcbiAgICBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgQ2FsbGJhY2tRdWV1ZSA9IHJlcXVpcmUoJy4vQ2FsbGJhY2tRdWV1ZScpO1xudmFyIFBvb2xlZENsYXNzID0gcmVxdWlyZSgnLi9Qb29sZWRDbGFzcycpO1xudmFyIFJlYWN0RmVhdHVyZUZsYWdzID0gcmVxdWlyZSgnLi9SZWFjdEZlYXR1cmVGbGFncycpO1xudmFyIFJlYWN0UmVjb25jaWxlciA9IHJlcXVpcmUoJy4vUmVhY3RSZWNvbmNpbGVyJyk7XG52YXIgVHJhbnNhY3Rpb24gPSByZXF1aXJlKCcuL1RyYW5zYWN0aW9uJyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxudmFyIGRpcnR5Q29tcG9uZW50cyA9IFtdO1xudmFyIHVwZGF0ZUJhdGNoTnVtYmVyID0gMDtcbnZhciBhc2FwQ2FsbGJhY2tRdWV1ZSA9IENhbGxiYWNrUXVldWUuZ2V0UG9vbGVkKCk7XG52YXIgYXNhcEVucXVldWVkID0gZmFsc2U7XG5cbnZhciBiYXRjaGluZ1N0cmF0ZWd5ID0gbnVsbDtcblxuZnVuY3Rpb24gZW5zdXJlSW5qZWN0ZWQoKSB7XG4gICEoUmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24gJiYgYmF0Y2hpbmdTdHJhdGVneSkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0VXBkYXRlczogbXVzdCBpbmplY3QgYSByZWNvbmNpbGUgdHJhbnNhY3Rpb24gY2xhc3MgYW5kIGJhdGNoaW5nIHN0cmF0ZWd5JykgOiBfcHJvZEludmFyaWFudCgnMTIzJykgOiB2b2lkIDA7XG59XG5cbnZhciBORVNURURfVVBEQVRFUyA9IHtcbiAgaW5pdGlhbGl6ZTogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoID0gZGlydHlDb21wb25lbnRzLmxlbmd0aDtcbiAgfSxcbiAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGggIT09IGRpcnR5Q29tcG9uZW50cy5sZW5ndGgpIHtcbiAgICAgIC8vIEFkZGl0aW9uYWwgdXBkYXRlcyB3ZXJlIGVucXVldWVkIGJ5IGNvbXBvbmVudERpZFVwZGF0ZSBoYW5kbGVycyBvclxuICAgICAgLy8gc2ltaWxhcjsgYmVmb3JlIG91ciBvd24gVVBEQVRFX1FVRVVFSU5HIHdyYXBwZXIgY2xvc2VzLCB3ZSB3YW50IHRvIHJ1blxuICAgICAgLy8gdGhlc2UgbmV3IHVwZGF0ZXMgc28gdGhhdCBpZiBBJ3MgY29tcG9uZW50RGlkVXBkYXRlIGNhbGxzIHNldFN0YXRlIG9uXG4gICAgICAvLyBCLCBCIHdpbGwgdXBkYXRlIGJlZm9yZSB0aGUgY2FsbGJhY2sgQSdzIHVwZGF0ZXIgcHJvdmlkZWQgd2hlbiBjYWxsaW5nXG4gICAgICAvLyBzZXRTdGF0ZS5cbiAgICAgIGRpcnR5Q29tcG9uZW50cy5zcGxpY2UoMCwgdGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGgpO1xuICAgICAgZmx1c2hCYXRjaGVkVXBkYXRlcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkaXJ0eUNvbXBvbmVudHMubGVuZ3RoID0gMDtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBVUERBVEVfUVVFVUVJTkcgPSB7XG4gIGluaXRpYWxpemU6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmNhbGxiYWNrUXVldWUucmVzZXQoKTtcbiAgfSxcbiAgY2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmNhbGxiYWNrUXVldWUubm90aWZ5QWxsKCk7XG4gIH1cbn07XG5cbnZhciBUUkFOU0FDVElPTl9XUkFQUEVSUyA9IFtORVNURURfVVBEQVRFUywgVVBEQVRFX1FVRVVFSU5HXTtcblxuZnVuY3Rpb24gUmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbigpIHtcbiAgdGhpcy5yZWluaXRpYWxpemVUcmFuc2FjdGlvbigpO1xuICB0aGlzLmRpcnR5Q29tcG9uZW50c0xlbmd0aCA9IG51bGw7XG4gIHRoaXMuY2FsbGJhY2tRdWV1ZSA9IENhbGxiYWNrUXVldWUuZ2V0UG9vbGVkKCk7XG4gIHRoaXMucmVjb25jaWxlVHJhbnNhY3Rpb24gPSBSZWFjdFVwZGF0ZXMuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5nZXRQb29sZWQoXG4gIC8qIHVzZUNyZWF0ZUVsZW1lbnQgKi90cnVlKTtcbn1cblxuX2Fzc2lnbihSZWFjdFVwZGF0ZXNGbHVzaFRyYW5zYWN0aW9uLnByb3RvdHlwZSwgVHJhbnNhY3Rpb24sIHtcbiAgZ2V0VHJhbnNhY3Rpb25XcmFwcGVyczogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBUUkFOU0FDVElPTl9XUkFQUEVSUztcbiAgfSxcblxuICBkZXN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGggPSBudWxsO1xuICAgIENhbGxiYWNrUXVldWUucmVsZWFzZSh0aGlzLmNhbGxiYWNrUXVldWUpO1xuICAgIHRoaXMuY2FsbGJhY2tRdWV1ZSA9IG51bGw7XG4gICAgUmVhY3RVcGRhdGVzLlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24ucmVsZWFzZSh0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uKTtcbiAgICB0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uID0gbnVsbDtcbiAgfSxcblxuICBwZXJmb3JtOiBmdW5jdGlvbiAobWV0aG9kLCBzY29wZSwgYSkge1xuICAgIC8vIEVzc2VudGlhbGx5IGNhbGxzIGB0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uLnBlcmZvcm0obWV0aG9kLCBzY29wZSwgYSlgXG4gICAgLy8gd2l0aCB0aGlzIHRyYW5zYWN0aW9uJ3Mgd3JhcHBlcnMgYXJvdW5kIGl0LlxuICAgIHJldHVybiBUcmFuc2FjdGlvbi5wZXJmb3JtLmNhbGwodGhpcywgdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbi5wZXJmb3JtLCB0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uLCBtZXRob2QsIHNjb3BlLCBhKTtcbiAgfVxufSk7XG5cblBvb2xlZENsYXNzLmFkZFBvb2xpbmdUbyhSZWFjdFVwZGF0ZXNGbHVzaFRyYW5zYWN0aW9uKTtcblxuZnVuY3Rpb24gYmF0Y2hlZFVwZGF0ZXMoY2FsbGJhY2ssIGEsIGIsIGMsIGQsIGUpIHtcbiAgZW5zdXJlSW5qZWN0ZWQoKTtcbiAgcmV0dXJuIGJhdGNoaW5nU3RyYXRlZ3kuYmF0Y2hlZFVwZGF0ZXMoY2FsbGJhY2ssIGEsIGIsIGMsIGQsIGUpO1xufVxuXG4vKipcbiAqIEFycmF5IGNvbXBhcmF0b3IgZm9yIFJlYWN0Q29tcG9uZW50cyBieSBtb3VudCBvcmRlcmluZy5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0Q29tcG9uZW50fSBjMSBmaXJzdCBjb21wb25lbnQgeW91J3JlIGNvbXBhcmluZ1xuICogQHBhcmFtIHtSZWFjdENvbXBvbmVudH0gYzIgc2Vjb25kIGNvbXBvbmVudCB5b3UncmUgY29tcGFyaW5nXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFJldHVybiB2YWx1ZSB1c2FibGUgYnkgQXJyYXkucHJvdG90eXBlLnNvcnQoKS5cbiAqL1xuZnVuY3Rpb24gbW91bnRPcmRlckNvbXBhcmF0b3IoYzEsIGMyKSB7XG4gIHJldHVybiBjMS5fbW91bnRPcmRlciAtIGMyLl9tb3VudE9yZGVyO1xufVxuXG5mdW5jdGlvbiBydW5CYXRjaGVkVXBkYXRlcyh0cmFuc2FjdGlvbikge1xuICB2YXIgbGVuID0gdHJhbnNhY3Rpb24uZGlydHlDb21wb25lbnRzTGVuZ3RoO1xuICAhKGxlbiA9PT0gZGlydHlDb21wb25lbnRzLmxlbmd0aCkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0V4cGVjdGVkIGZsdXNoIHRyYW5zYWN0aW9uXFwncyBzdG9yZWQgZGlydHktY29tcG9uZW50cyBsZW5ndGggKCVzKSB0byBtYXRjaCBkaXJ0eS1jb21wb25lbnRzIGFycmF5IGxlbmd0aCAoJXMpLicsIGxlbiwgZGlydHlDb21wb25lbnRzLmxlbmd0aCkgOiBfcHJvZEludmFyaWFudCgnMTI0JywgbGVuLCBkaXJ0eUNvbXBvbmVudHMubGVuZ3RoKSA6IHZvaWQgMDtcblxuICAvLyBTaW5jZSByZWNvbmNpbGluZyBhIGNvbXBvbmVudCBoaWdoZXIgaW4gdGhlIG93bmVyIGhpZXJhcmNoeSB1c3VhbGx5IChub3RcbiAgLy8gYWx3YXlzIC0tIHNlZSBzaG91bGRDb21wb25lbnRVcGRhdGUoKSkgd2lsbCByZWNvbmNpbGUgY2hpbGRyZW4sIHJlY29uY2lsZVxuICAvLyB0aGVtIGJlZm9yZSB0aGVpciBjaGlsZHJlbiBieSBzb3J0aW5nIHRoZSBhcnJheS5cbiAgZGlydHlDb21wb25lbnRzLnNvcnQobW91bnRPcmRlckNvbXBhcmF0b3IpO1xuXG4gIC8vIEFueSB1cGRhdGVzIGVucXVldWVkIHdoaWxlIHJlY29uY2lsaW5nIG11c3QgYmUgcGVyZm9ybWVkIGFmdGVyIHRoaXMgZW50aXJlXG4gIC8vIGJhdGNoLiBPdGhlcndpc2UsIGlmIGRpcnR5Q29tcG9uZW50cyBpcyBbQSwgQl0gd2hlcmUgQSBoYXMgY2hpbGRyZW4gQiBhbmRcbiAgLy8gQywgQiBjb3VsZCB1cGRhdGUgdHdpY2UgaW4gYSBzaW5nbGUgYmF0Y2ggaWYgQydzIHJlbmRlciBlbnF1ZXVlcyBhbiB1cGRhdGVcbiAgLy8gdG8gQiAoc2luY2UgQiB3b3VsZCBoYXZlIGFscmVhZHkgdXBkYXRlZCwgd2Ugc2hvdWxkIHNraXAgaXQsIGFuZCB0aGUgb25seVxuICAvLyB3YXkgd2UgY2FuIGtub3cgdG8gZG8gc28gaXMgYnkgY2hlY2tpbmcgdGhlIGJhdGNoIGNvdW50ZXIpLlxuICB1cGRhdGVCYXRjaE51bWJlcisrO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAvLyBJZiBhIGNvbXBvbmVudCBpcyB1bm1vdW50ZWQgYmVmb3JlIHBlbmRpbmcgY2hhbmdlcyBhcHBseSwgaXQgd2lsbCBzdGlsbFxuICAgIC8vIGJlIGhlcmUsIGJ1dCB3ZSBhc3N1bWUgdGhhdCBpdCBoYXMgY2xlYXJlZCBpdHMgX3BlbmRpbmdDYWxsYmFja3MgYW5kXG4gICAgLy8gdGhhdCBwZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkgaXMgYSBub29wLlxuICAgIHZhciBjb21wb25lbnQgPSBkaXJ0eUNvbXBvbmVudHNbaV07XG5cbiAgICAvLyBJZiBwZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkgaGFwcGVucyB0byBlbnF1ZXVlIGFueSBuZXcgdXBkYXRlcywgd2VcbiAgICAvLyBzaG91bGRuJ3QgZXhlY3V0ZSB0aGUgY2FsbGJhY2tzIHVudGlsIHRoZSBuZXh0IHJlbmRlciBoYXBwZW5zLCBzb1xuICAgIC8vIHN0YXNoIHRoZSBjYWxsYmFja3MgZmlyc3RcbiAgICB2YXIgY2FsbGJhY2tzID0gY29tcG9uZW50Ll9wZW5kaW5nQ2FsbGJhY2tzO1xuICAgIGNvbXBvbmVudC5fcGVuZGluZ0NhbGxiYWNrcyA9IG51bGw7XG5cbiAgICB2YXIgbWFya2VyTmFtZTtcbiAgICBpZiAoUmVhY3RGZWF0dXJlRmxhZ3MubG9nVG9wTGV2ZWxSZW5kZXJzKSB7XG4gICAgICB2YXIgbmFtZWRDb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgICAvLyBEdWNrIHR5cGUgVG9wTGV2ZWxXcmFwcGVyLiBUaGlzIGlzIHByb2JhYmx5IGFsd2F5cyB0cnVlLlxuICAgICAgaWYgKGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQudHlwZS5pc1JlYWN0VG9wTGV2ZWxXcmFwcGVyKSB7XG4gICAgICAgIG5hbWVkQ29tcG9uZW50ID0gY29tcG9uZW50Ll9yZW5kZXJlZENvbXBvbmVudDtcbiAgICAgIH1cbiAgICAgIG1hcmtlck5hbWUgPSAnUmVhY3QgdXBkYXRlOiAnICsgbmFtZWRDb21wb25lbnQuZ2V0TmFtZSgpO1xuICAgICAgY29uc29sZS50aW1lKG1hcmtlck5hbWUpO1xuICAgIH1cblxuICAgIFJlYWN0UmVjb25jaWxlci5wZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkoY29tcG9uZW50LCB0cmFuc2FjdGlvbi5yZWNvbmNpbGVUcmFuc2FjdGlvbiwgdXBkYXRlQmF0Y2hOdW1iZXIpO1xuXG4gICAgaWYgKG1hcmtlck5hbWUpIHtcbiAgICAgIGNvbnNvbGUudGltZUVuZChtYXJrZXJOYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoY2FsbGJhY2tzKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGNhbGxiYWNrcy5sZW5ndGg7IGorKykge1xuICAgICAgICB0cmFuc2FjdGlvbi5jYWxsYmFja1F1ZXVlLmVucXVldWUoY2FsbGJhY2tzW2pdLCBjb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbnZhciBmbHVzaEJhdGNoZWRVcGRhdGVzID0gZnVuY3Rpb24gKCkge1xuICAvLyBSZWFjdFVwZGF0ZXNGbHVzaFRyYW5zYWN0aW9uJ3Mgd3JhcHBlcnMgd2lsbCBjbGVhciB0aGUgZGlydHlDb21wb25lbnRzXG4gIC8vIGFycmF5IGFuZCBwZXJmb3JtIGFueSB1cGRhdGVzIGVucXVldWVkIGJ5IG1vdW50LXJlYWR5IGhhbmRsZXJzIChpLmUuLFxuICAvLyBjb21wb25lbnREaWRVcGRhdGUpIGJ1dCB3ZSBuZWVkIHRvIGNoZWNrIGhlcmUgdG9vIGluIG9yZGVyIHRvIGNhdGNoXG4gIC8vIHVwZGF0ZXMgZW5xdWV1ZWQgYnkgc2V0U3RhdGUgY2FsbGJhY2tzIGFuZCBhc2FwIGNhbGxzLlxuICB3aGlsZSAoZGlydHlDb21wb25lbnRzLmxlbmd0aCB8fCBhc2FwRW5xdWV1ZWQpIHtcbiAgICBpZiAoZGlydHlDb21wb25lbnRzLmxlbmd0aCkge1xuICAgICAgdmFyIHRyYW5zYWN0aW9uID0gUmVhY3RVcGRhdGVzRmx1c2hUcmFuc2FjdGlvbi5nZXRQb29sZWQoKTtcbiAgICAgIHRyYW5zYWN0aW9uLnBlcmZvcm0ocnVuQmF0Y2hlZFVwZGF0ZXMsIG51bGwsIHRyYW5zYWN0aW9uKTtcbiAgICAgIFJlYWN0VXBkYXRlc0ZsdXNoVHJhbnNhY3Rpb24ucmVsZWFzZSh0cmFuc2FjdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKGFzYXBFbnF1ZXVlZCkge1xuICAgICAgYXNhcEVucXVldWVkID0gZmFsc2U7XG4gICAgICB2YXIgcXVldWUgPSBhc2FwQ2FsbGJhY2tRdWV1ZTtcbiAgICAgIGFzYXBDYWxsYmFja1F1ZXVlID0gQ2FsbGJhY2tRdWV1ZS5nZXRQb29sZWQoKTtcbiAgICAgIHF1ZXVlLm5vdGlmeUFsbCgpO1xuICAgICAgQ2FsbGJhY2tRdWV1ZS5yZWxlYXNlKHF1ZXVlKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogTWFyayBhIGNvbXBvbmVudCBhcyBuZWVkaW5nIGEgcmVyZW5kZXIsIGFkZGluZyBhbiBvcHRpb25hbCBjYWxsYmFjayB0byBhXG4gKiBsaXN0IG9mIGZ1bmN0aW9ucyB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIG9uY2UgdGhlIHJlcmVuZGVyIG9jY3Vycy5cbiAqL1xuZnVuY3Rpb24gZW5xdWV1ZVVwZGF0ZShjb21wb25lbnQpIHtcbiAgZW5zdXJlSW5qZWN0ZWQoKTtcblxuICAvLyBWYXJpb3VzIHBhcnRzIG9mIG91ciBjb2RlIChzdWNoIGFzIFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50J3NcbiAgLy8gX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCkgYXNzdW1lIHRoYXQgY2FsbHMgdG8gcmVuZGVyIGFyZW4ndCBuZXN0ZWQ7XG4gIC8vIHZlcmlmeSB0aGF0IHRoYXQncyB0aGUgY2FzZS4gKFRoaXMgaXMgY2FsbGVkIGJ5IGVhY2ggdG9wLWxldmVsIHVwZGF0ZVxuICAvLyBmdW5jdGlvbiwgbGlrZSBzZXRTdGF0ZSwgZm9yY2VVcGRhdGUsIGV0Yy47IGNyZWF0aW9uIGFuZFxuICAvLyBkZXN0cnVjdGlvbiBvZiB0b3AtbGV2ZWwgY29tcG9uZW50cyBpcyBndWFyZGVkIGluIFJlYWN0TW91bnQuKVxuXG4gIGlmICghYmF0Y2hpbmdTdHJhdGVneS5pc0JhdGNoaW5nVXBkYXRlcykge1xuICAgIGJhdGNoaW5nU3RyYXRlZ3kuYmF0Y2hlZFVwZGF0ZXMoZW5xdWV1ZVVwZGF0ZSwgY29tcG9uZW50KTtcbiAgICByZXR1cm47XG4gIH1cblxuICBkaXJ0eUNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuICBpZiAoY29tcG9uZW50Ll91cGRhdGVCYXRjaE51bWJlciA9PSBudWxsKSB7XG4gICAgY29tcG9uZW50Ll91cGRhdGVCYXRjaE51bWJlciA9IHVwZGF0ZUJhdGNoTnVtYmVyICsgMTtcbiAgfVxufVxuXG4vKipcbiAqIEVucXVldWUgYSBjYWxsYmFjayB0byBiZSBydW4gYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBiYXRjaGluZyBjeWNsZS4gVGhyb3dzXG4gKiBpZiBubyB1cGRhdGVzIGFyZSBjdXJyZW50bHkgYmVpbmcgcGVyZm9ybWVkLlxuICovXG5mdW5jdGlvbiBhc2FwKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICFiYXRjaGluZ1N0cmF0ZWd5LmlzQmF0Y2hpbmdVcGRhdGVzID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdFVwZGF0ZXMuYXNhcDogQ2FuXFwndCBlbnF1ZXVlIGFuIGFzYXAgY2FsbGJhY2sgaW4gYSBjb250ZXh0IHdoZXJldXBkYXRlcyBhcmUgbm90IGJlaW5nIGJhdGNoZWQuJykgOiBfcHJvZEludmFyaWFudCgnMTI1JykgOiB2b2lkIDA7XG4gIGFzYXBDYWxsYmFja1F1ZXVlLmVucXVldWUoY2FsbGJhY2ssIGNvbnRleHQpO1xuICBhc2FwRW5xdWV1ZWQgPSB0cnVlO1xufVxuXG52YXIgUmVhY3RVcGRhdGVzSW5qZWN0aW9uID0ge1xuICBpbmplY3RSZWNvbmNpbGVUcmFuc2FjdGlvbjogZnVuY3Rpb24gKFJlY29uY2lsZVRyYW5zYWN0aW9uKSB7XG4gICAgIVJlY29uY2lsZVRyYW5zYWN0aW9uID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdFVwZGF0ZXM6IG11c3QgcHJvdmlkZSBhIHJlY29uY2lsZSB0cmFuc2FjdGlvbiBjbGFzcycpIDogX3Byb2RJbnZhcmlhbnQoJzEyNicpIDogdm9pZCAwO1xuICAgIFJlYWN0VXBkYXRlcy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uID0gUmVjb25jaWxlVHJhbnNhY3Rpb247XG4gIH0sXG5cbiAgaW5qZWN0QmF0Y2hpbmdTdHJhdGVneTogZnVuY3Rpb24gKF9iYXRjaGluZ1N0cmF0ZWd5KSB7XG4gICAgIV9iYXRjaGluZ1N0cmF0ZWd5ID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdFVwZGF0ZXM6IG11c3QgcHJvdmlkZSBhIGJhdGNoaW5nIHN0cmF0ZWd5JykgOiBfcHJvZEludmFyaWFudCgnMTI3JykgOiB2b2lkIDA7XG4gICAgISh0eXBlb2YgX2JhdGNoaW5nU3RyYXRlZ3kuYmF0Y2hlZFVwZGF0ZXMgPT09ICdmdW5jdGlvbicpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdFVwZGF0ZXM6IG11c3QgcHJvdmlkZSBhIGJhdGNoZWRVcGRhdGVzKCkgZnVuY3Rpb24nKSA6IF9wcm9kSW52YXJpYW50KCcxMjgnKSA6IHZvaWQgMDtcbiAgICAhKHR5cGVvZiBfYmF0Y2hpbmdTdHJhdGVneS5pc0JhdGNoaW5nVXBkYXRlcyA9PT0gJ2Jvb2xlYW4nKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RVcGRhdGVzOiBtdXN0IHByb3ZpZGUgYW4gaXNCYXRjaGluZ1VwZGF0ZXMgYm9vbGVhbiBhdHRyaWJ1dGUnKSA6IF9wcm9kSW52YXJpYW50KCcxMjknKSA6IHZvaWQgMDtcbiAgICBiYXRjaGluZ1N0cmF0ZWd5ID0gX2JhdGNoaW5nU3RyYXRlZ3k7XG4gIH1cbn07XG5cbnZhciBSZWFjdFVwZGF0ZXMgPSB7XG4gIC8qKlxuICAgKiBSZWFjdCByZWZlcmVuY2VzIGBSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uYCB1c2luZyB0aGlzIHByb3BlcnR5IGluIG9yZGVyXG4gICAqIHRvIGFsbG93IGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIFJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb246IG51bGwsXG5cbiAgYmF0Y2hlZFVwZGF0ZXM6IGJhdGNoZWRVcGRhdGVzLFxuICBlbnF1ZXVlVXBkYXRlOiBlbnF1ZXVlVXBkYXRlLFxuICBmbHVzaEJhdGNoZWRVcGRhdGVzOiBmbHVzaEJhdGNoZWRVcGRhdGVzLFxuICBpbmplY3Rpb246IFJlYWN0VXBkYXRlc0luamVjdGlvbixcbiAgYXNhcDogYXNhcFxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFVwZGF0ZXM7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSAnMTUuNS40JzsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgTlMgPSB7XG4gIHhsaW5rOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycsXG4gIHhtbDogJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSdcbn07XG5cbi8vIFdlIHVzZSBhdHRyaWJ1dGVzIGZvciBldmVyeXRoaW5nIFNWRyBzbyBsZXQncyBhdm9pZCBzb21lIGR1cGxpY2F0aW9uIGFuZCBydW5cbi8vIGNvZGUgaW5zdGVhZC5cbi8vIFRoZSBmb2xsb3dpbmcgYXJlIGFsbCBzcGVjaWZpZWQgaW4gdGhlIEhUTUwgY29uZmlnIGFscmVhZHkgc28gd2UgZXhjbHVkZSBoZXJlLlxuLy8gLSBjbGFzcyAoYXMgY2xhc3NOYW1lKVxuLy8gLSBjb2xvclxuLy8gLSBoZWlnaHRcbi8vIC0gaWRcbi8vIC0gbGFuZ1xuLy8gLSBtYXhcbi8vIC0gbWVkaWFcbi8vIC0gbWV0aG9kXG4vLyAtIG1pblxuLy8gLSBuYW1lXG4vLyAtIHN0eWxlXG4vLyAtIHRhcmdldFxuLy8gLSB0eXBlXG4vLyAtIHdpZHRoXG52YXIgQVRUUlMgPSB7XG4gIGFjY2VudEhlaWdodDogJ2FjY2VudC1oZWlnaHQnLFxuICBhY2N1bXVsYXRlOiAwLFxuICBhZGRpdGl2ZTogMCxcbiAgYWxpZ25tZW50QmFzZWxpbmU6ICdhbGlnbm1lbnQtYmFzZWxpbmUnLFxuICBhbGxvd1Jlb3JkZXI6ICdhbGxvd1Jlb3JkZXInLFxuICBhbHBoYWJldGljOiAwLFxuICBhbXBsaXR1ZGU6IDAsXG4gIGFyYWJpY0Zvcm06ICdhcmFiaWMtZm9ybScsXG4gIGFzY2VudDogMCxcbiAgYXR0cmlidXRlTmFtZTogJ2F0dHJpYnV0ZU5hbWUnLFxuICBhdHRyaWJ1dGVUeXBlOiAnYXR0cmlidXRlVHlwZScsXG4gIGF1dG9SZXZlcnNlOiAnYXV0b1JldmVyc2UnLFxuICBhemltdXRoOiAwLFxuICBiYXNlRnJlcXVlbmN5OiAnYmFzZUZyZXF1ZW5jeScsXG4gIGJhc2VQcm9maWxlOiAnYmFzZVByb2ZpbGUnLFxuICBiYXNlbGluZVNoaWZ0OiAnYmFzZWxpbmUtc2hpZnQnLFxuICBiYm94OiAwLFxuICBiZWdpbjogMCxcbiAgYmlhczogMCxcbiAgYnk6IDAsXG4gIGNhbGNNb2RlOiAnY2FsY01vZGUnLFxuICBjYXBIZWlnaHQ6ICdjYXAtaGVpZ2h0JyxcbiAgY2xpcDogMCxcbiAgY2xpcFBhdGg6ICdjbGlwLXBhdGgnLFxuICBjbGlwUnVsZTogJ2NsaXAtcnVsZScsXG4gIGNsaXBQYXRoVW5pdHM6ICdjbGlwUGF0aFVuaXRzJyxcbiAgY29sb3JJbnRlcnBvbGF0aW9uOiAnY29sb3ItaW50ZXJwb2xhdGlvbicsXG4gIGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6ICdjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMnLFxuICBjb2xvclByb2ZpbGU6ICdjb2xvci1wcm9maWxlJyxcbiAgY29sb3JSZW5kZXJpbmc6ICdjb2xvci1yZW5kZXJpbmcnLFxuICBjb250ZW50U2NyaXB0VHlwZTogJ2NvbnRlbnRTY3JpcHRUeXBlJyxcbiAgY29udGVudFN0eWxlVHlwZTogJ2NvbnRlbnRTdHlsZVR5cGUnLFxuICBjdXJzb3I6IDAsXG4gIGN4OiAwLFxuICBjeTogMCxcbiAgZDogMCxcbiAgZGVjZWxlcmF0ZTogMCxcbiAgZGVzY2VudDogMCxcbiAgZGlmZnVzZUNvbnN0YW50OiAnZGlmZnVzZUNvbnN0YW50JyxcbiAgZGlyZWN0aW9uOiAwLFxuICBkaXNwbGF5OiAwLFxuICBkaXZpc29yOiAwLFxuICBkb21pbmFudEJhc2VsaW5lOiAnZG9taW5hbnQtYmFzZWxpbmUnLFxuICBkdXI6IDAsXG4gIGR4OiAwLFxuICBkeTogMCxcbiAgZWRnZU1vZGU6ICdlZGdlTW9kZScsXG4gIGVsZXZhdGlvbjogMCxcbiAgZW5hYmxlQmFja2dyb3VuZDogJ2VuYWJsZS1iYWNrZ3JvdW5kJyxcbiAgZW5kOiAwLFxuICBleHBvbmVudDogMCxcbiAgZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZDogJ2V4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQnLFxuICBmaWxsOiAwLFxuICBmaWxsT3BhY2l0eTogJ2ZpbGwtb3BhY2l0eScsXG4gIGZpbGxSdWxlOiAnZmlsbC1ydWxlJyxcbiAgZmlsdGVyOiAwLFxuICBmaWx0ZXJSZXM6ICdmaWx0ZXJSZXMnLFxuICBmaWx0ZXJVbml0czogJ2ZpbHRlclVuaXRzJyxcbiAgZmxvb2RDb2xvcjogJ2Zsb29kLWNvbG9yJyxcbiAgZmxvb2RPcGFjaXR5OiAnZmxvb2Qtb3BhY2l0eScsXG4gIGZvY3VzYWJsZTogMCxcbiAgZm9udEZhbWlseTogJ2ZvbnQtZmFtaWx5JyxcbiAgZm9udFNpemU6ICdmb250LXNpemUnLFxuICBmb250U2l6ZUFkanVzdDogJ2ZvbnQtc2l6ZS1hZGp1c3QnLFxuICBmb250U3RyZXRjaDogJ2ZvbnQtc3RyZXRjaCcsXG4gIGZvbnRTdHlsZTogJ2ZvbnQtc3R5bGUnLFxuICBmb250VmFyaWFudDogJ2ZvbnQtdmFyaWFudCcsXG4gIGZvbnRXZWlnaHQ6ICdmb250LXdlaWdodCcsXG4gIGZvcm1hdDogMCxcbiAgZnJvbTogMCxcbiAgZng6IDAsXG4gIGZ5OiAwLFxuICBnMTogMCxcbiAgZzI6IDAsXG4gIGdseXBoTmFtZTogJ2dseXBoLW5hbWUnLFxuICBnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbDogJ2dseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwnLFxuICBnbHlwaE9yaWVudGF0aW9uVmVydGljYWw6ICdnbHlwaC1vcmllbnRhdGlvbi12ZXJ0aWNhbCcsXG4gIGdseXBoUmVmOiAnZ2x5cGhSZWYnLFxuICBncmFkaWVudFRyYW5zZm9ybTogJ2dyYWRpZW50VHJhbnNmb3JtJyxcbiAgZ3JhZGllbnRVbml0czogJ2dyYWRpZW50VW5pdHMnLFxuICBoYW5naW5nOiAwLFxuICBob3JpekFkdlg6ICdob3Jpei1hZHYteCcsXG4gIGhvcml6T3JpZ2luWDogJ2hvcml6LW9yaWdpbi14JyxcbiAgaWRlb2dyYXBoaWM6IDAsXG4gIGltYWdlUmVuZGVyaW5nOiAnaW1hZ2UtcmVuZGVyaW5nJyxcbiAgJ2luJzogMCxcbiAgaW4yOiAwLFxuICBpbnRlcmNlcHQ6IDAsXG4gIGs6IDAsXG4gIGsxOiAwLFxuICBrMjogMCxcbiAgazM6IDAsXG4gIGs0OiAwLFxuICBrZXJuZWxNYXRyaXg6ICdrZXJuZWxNYXRyaXgnLFxuICBrZXJuZWxVbml0TGVuZ3RoOiAna2VybmVsVW5pdExlbmd0aCcsXG4gIGtlcm5pbmc6IDAsXG4gIGtleVBvaW50czogJ2tleVBvaW50cycsXG4gIGtleVNwbGluZXM6ICdrZXlTcGxpbmVzJyxcbiAga2V5VGltZXM6ICdrZXlUaW1lcycsXG4gIGxlbmd0aEFkanVzdDogJ2xlbmd0aEFkanVzdCcsXG4gIGxldHRlclNwYWNpbmc6ICdsZXR0ZXItc3BhY2luZycsXG4gIGxpZ2h0aW5nQ29sb3I6ICdsaWdodGluZy1jb2xvcicsXG4gIGxpbWl0aW5nQ29uZUFuZ2xlOiAnbGltaXRpbmdDb25lQW5nbGUnLFxuICBsb2NhbDogMCxcbiAgbWFya2VyRW5kOiAnbWFya2VyLWVuZCcsXG4gIG1hcmtlck1pZDogJ21hcmtlci1taWQnLFxuICBtYXJrZXJTdGFydDogJ21hcmtlci1zdGFydCcsXG4gIG1hcmtlckhlaWdodDogJ21hcmtlckhlaWdodCcsXG4gIG1hcmtlclVuaXRzOiAnbWFya2VyVW5pdHMnLFxuICBtYXJrZXJXaWR0aDogJ21hcmtlcldpZHRoJyxcbiAgbWFzazogMCxcbiAgbWFza0NvbnRlbnRVbml0czogJ21hc2tDb250ZW50VW5pdHMnLFxuICBtYXNrVW5pdHM6ICdtYXNrVW5pdHMnLFxuICBtYXRoZW1hdGljYWw6IDAsXG4gIG1vZGU6IDAsXG4gIG51bU9jdGF2ZXM6ICdudW1PY3RhdmVzJyxcbiAgb2Zmc2V0OiAwLFxuICBvcGFjaXR5OiAwLFxuICBvcGVyYXRvcjogMCxcbiAgb3JkZXI6IDAsXG4gIG9yaWVudDogMCxcbiAgb3JpZW50YXRpb246IDAsXG4gIG9yaWdpbjogMCxcbiAgb3ZlcmZsb3c6IDAsXG4gIG92ZXJsaW5lUG9zaXRpb246ICdvdmVybGluZS1wb3NpdGlvbicsXG4gIG92ZXJsaW5lVGhpY2tuZXNzOiAnb3ZlcmxpbmUtdGhpY2tuZXNzJyxcbiAgcGFpbnRPcmRlcjogJ3BhaW50LW9yZGVyJyxcbiAgcGFub3NlMTogJ3Bhbm9zZS0xJyxcbiAgcGF0aExlbmd0aDogJ3BhdGhMZW5ndGgnLFxuICBwYXR0ZXJuQ29udGVudFVuaXRzOiAncGF0dGVybkNvbnRlbnRVbml0cycsXG4gIHBhdHRlcm5UcmFuc2Zvcm06ICdwYXR0ZXJuVHJhbnNmb3JtJyxcbiAgcGF0dGVyblVuaXRzOiAncGF0dGVyblVuaXRzJyxcbiAgcG9pbnRlckV2ZW50czogJ3BvaW50ZXItZXZlbnRzJyxcbiAgcG9pbnRzOiAwLFxuICBwb2ludHNBdFg6ICdwb2ludHNBdFgnLFxuICBwb2ludHNBdFk6ICdwb2ludHNBdFknLFxuICBwb2ludHNBdFo6ICdwb2ludHNBdFonLFxuICBwcmVzZXJ2ZUFscGhhOiAncHJlc2VydmVBbHBoYScsXG4gIHByZXNlcnZlQXNwZWN0UmF0aW86ICdwcmVzZXJ2ZUFzcGVjdFJhdGlvJyxcbiAgcHJpbWl0aXZlVW5pdHM6ICdwcmltaXRpdmVVbml0cycsXG4gIHI6IDAsXG4gIHJhZGl1czogMCxcbiAgcmVmWDogJ3JlZlgnLFxuICByZWZZOiAncmVmWScsXG4gIHJlbmRlcmluZ0ludGVudDogJ3JlbmRlcmluZy1pbnRlbnQnLFxuICByZXBlYXRDb3VudDogJ3JlcGVhdENvdW50JyxcbiAgcmVwZWF0RHVyOiAncmVwZWF0RHVyJyxcbiAgcmVxdWlyZWRFeHRlbnNpb25zOiAncmVxdWlyZWRFeHRlbnNpb25zJyxcbiAgcmVxdWlyZWRGZWF0dXJlczogJ3JlcXVpcmVkRmVhdHVyZXMnLFxuICByZXN0YXJ0OiAwLFxuICByZXN1bHQ6IDAsXG4gIHJvdGF0ZTogMCxcbiAgcng6IDAsXG4gIHJ5OiAwLFxuICBzY2FsZTogMCxcbiAgc2VlZDogMCxcbiAgc2hhcGVSZW5kZXJpbmc6ICdzaGFwZS1yZW5kZXJpbmcnLFxuICBzbG9wZTogMCxcbiAgc3BhY2luZzogMCxcbiAgc3BlY3VsYXJDb25zdGFudDogJ3NwZWN1bGFyQ29uc3RhbnQnLFxuICBzcGVjdWxhckV4cG9uZW50OiAnc3BlY3VsYXJFeHBvbmVudCcsXG4gIHNwZWVkOiAwLFxuICBzcHJlYWRNZXRob2Q6ICdzcHJlYWRNZXRob2QnLFxuICBzdGFydE9mZnNldDogJ3N0YXJ0T2Zmc2V0JyxcbiAgc3RkRGV2aWF0aW9uOiAnc3RkRGV2aWF0aW9uJyxcbiAgc3RlbWg6IDAsXG4gIHN0ZW12OiAwLFxuICBzdGl0Y2hUaWxlczogJ3N0aXRjaFRpbGVzJyxcbiAgc3RvcENvbG9yOiAnc3RvcC1jb2xvcicsXG4gIHN0b3BPcGFjaXR5OiAnc3RvcC1vcGFjaXR5JyxcbiAgc3RyaWtldGhyb3VnaFBvc2l0aW9uOiAnc3RyaWtldGhyb3VnaC1wb3NpdGlvbicsXG4gIHN0cmlrZXRocm91Z2hUaGlja25lc3M6ICdzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcycsXG4gIHN0cmluZzogMCxcbiAgc3Ryb2tlOiAwLFxuICBzdHJva2VEYXNoYXJyYXk6ICdzdHJva2UtZGFzaGFycmF5JyxcbiAgc3Ryb2tlRGFzaG9mZnNldDogJ3N0cm9rZS1kYXNob2Zmc2V0JyxcbiAgc3Ryb2tlTGluZWNhcDogJ3N0cm9rZS1saW5lY2FwJyxcbiAgc3Ryb2tlTGluZWpvaW46ICdzdHJva2UtbGluZWpvaW4nLFxuICBzdHJva2VNaXRlcmxpbWl0OiAnc3Ryb2tlLW1pdGVybGltaXQnLFxuICBzdHJva2VPcGFjaXR5OiAnc3Ryb2tlLW9wYWNpdHknLFxuICBzdHJva2VXaWR0aDogJ3N0cm9rZS13aWR0aCcsXG4gIHN1cmZhY2VTY2FsZTogJ3N1cmZhY2VTY2FsZScsXG4gIHN5c3RlbUxhbmd1YWdlOiAnc3lzdGVtTGFuZ3VhZ2UnLFxuICB0YWJsZVZhbHVlczogJ3RhYmxlVmFsdWVzJyxcbiAgdGFyZ2V0WDogJ3RhcmdldFgnLFxuICB0YXJnZXRZOiAndGFyZ2V0WScsXG4gIHRleHRBbmNob3I6ICd0ZXh0LWFuY2hvcicsXG4gIHRleHREZWNvcmF0aW9uOiAndGV4dC1kZWNvcmF0aW9uJyxcbiAgdGV4dFJlbmRlcmluZzogJ3RleHQtcmVuZGVyaW5nJyxcbiAgdGV4dExlbmd0aDogJ3RleHRMZW5ndGgnLFxuICB0bzogMCxcbiAgdHJhbnNmb3JtOiAwLFxuICB1MTogMCxcbiAgdTI6IDAsXG4gIHVuZGVybGluZVBvc2l0aW9uOiAndW5kZXJsaW5lLXBvc2l0aW9uJyxcbiAgdW5kZXJsaW5lVGhpY2tuZXNzOiAndW5kZXJsaW5lLXRoaWNrbmVzcycsXG4gIHVuaWNvZGU6IDAsXG4gIHVuaWNvZGVCaWRpOiAndW5pY29kZS1iaWRpJyxcbiAgdW5pY29kZVJhbmdlOiAndW5pY29kZS1yYW5nZScsXG4gIHVuaXRzUGVyRW06ICd1bml0cy1wZXItZW0nLFxuICB2QWxwaGFiZXRpYzogJ3YtYWxwaGFiZXRpYycsXG4gIHZIYW5naW5nOiAndi1oYW5naW5nJyxcbiAgdklkZW9ncmFwaGljOiAndi1pZGVvZ3JhcGhpYycsXG4gIHZNYXRoZW1hdGljYWw6ICd2LW1hdGhlbWF0aWNhbCcsXG4gIHZhbHVlczogMCxcbiAgdmVjdG9yRWZmZWN0OiAndmVjdG9yLWVmZmVjdCcsXG4gIHZlcnNpb246IDAsXG4gIHZlcnRBZHZZOiAndmVydC1hZHYteScsXG4gIHZlcnRPcmlnaW5YOiAndmVydC1vcmlnaW4teCcsXG4gIHZlcnRPcmlnaW5ZOiAndmVydC1vcmlnaW4teScsXG4gIHZpZXdCb3g6ICd2aWV3Qm94JyxcbiAgdmlld1RhcmdldDogJ3ZpZXdUYXJnZXQnLFxuICB2aXNpYmlsaXR5OiAwLFxuICB3aWR0aHM6IDAsXG4gIHdvcmRTcGFjaW5nOiAnd29yZC1zcGFjaW5nJyxcbiAgd3JpdGluZ01vZGU6ICd3cml0aW5nLW1vZGUnLFxuICB4OiAwLFxuICB4SGVpZ2h0OiAneC1oZWlnaHQnLFxuICB4MTogMCxcbiAgeDI6IDAsXG4gIHhDaGFubmVsU2VsZWN0b3I6ICd4Q2hhbm5lbFNlbGVjdG9yJyxcbiAgeGxpbmtBY3R1YXRlOiAneGxpbms6YWN0dWF0ZScsXG4gIHhsaW5rQXJjcm9sZTogJ3hsaW5rOmFyY3JvbGUnLFxuICB4bGlua0hyZWY6ICd4bGluazpocmVmJyxcbiAgeGxpbmtSb2xlOiAneGxpbms6cm9sZScsXG4gIHhsaW5rU2hvdzogJ3hsaW5rOnNob3cnLFxuICB4bGlua1RpdGxlOiAneGxpbms6dGl0bGUnLFxuICB4bGlua1R5cGU6ICd4bGluazp0eXBlJyxcbiAgeG1sQmFzZTogJ3htbDpiYXNlJyxcbiAgeG1sbnM6IDAsXG4gIHhtbG5zWGxpbms6ICd4bWxuczp4bGluaycsXG4gIHhtbExhbmc6ICd4bWw6bGFuZycsXG4gIHhtbFNwYWNlOiAneG1sOnNwYWNlJyxcbiAgeTogMCxcbiAgeTE6IDAsXG4gIHkyOiAwLFxuICB5Q2hhbm5lbFNlbGVjdG9yOiAneUNoYW5uZWxTZWxlY3RvcicsXG4gIHo6IDAsXG4gIHpvb21BbmRQYW46ICd6b29tQW5kUGFuJ1xufTtcblxudmFyIFNWR0RPTVByb3BlcnR5Q29uZmlnID0ge1xuICBQcm9wZXJ0aWVzOiB7fSxcbiAgRE9NQXR0cmlidXRlTmFtZXNwYWNlczoge1xuICAgIHhsaW5rQWN0dWF0ZTogTlMueGxpbmssXG4gICAgeGxpbmtBcmNyb2xlOiBOUy54bGluayxcbiAgICB4bGlua0hyZWY6IE5TLnhsaW5rLFxuICAgIHhsaW5rUm9sZTogTlMueGxpbmssXG4gICAgeGxpbmtTaG93OiBOUy54bGluayxcbiAgICB4bGlua1RpdGxlOiBOUy54bGluayxcbiAgICB4bGlua1R5cGU6IE5TLnhsaW5rLFxuICAgIHhtbEJhc2U6IE5TLnhtbCxcbiAgICB4bWxMYW5nOiBOUy54bWwsXG4gICAgeG1sU3BhY2U6IE5TLnhtbFxuICB9LFxuICBET01BdHRyaWJ1dGVOYW1lczoge31cbn07XG5cbk9iamVjdC5rZXlzKEFUVFJTKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgU1ZHRE9NUHJvcGVydHlDb25maWcuUHJvcGVydGllc1trZXldID0gMDtcbiAgaWYgKEFUVFJTW2tleV0pIHtcbiAgICBTVkdET01Qcm9wZXJ0eUNvbmZpZy5ET01BdHRyaWJ1dGVOYW1lc1trZXldID0gQVRUUlNba2V5XTtcbiAgfVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU1ZHRE9NUHJvcGVydHlDb25maWc7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIEV2ZW50UHJvcGFnYXRvcnMgPSByZXF1aXJlKCcuL0V2ZW50UHJvcGFnYXRvcnMnKTtcbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBSZWFjdElucHV0U2VsZWN0aW9uID0gcmVxdWlyZSgnLi9SZWFjdElucHV0U2VsZWN0aW9uJyk7XG52YXIgU3ludGhldGljRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0V2ZW50Jyk7XG5cbnZhciBnZXRBY3RpdmVFbGVtZW50ID0gcmVxdWlyZSgnZmJqcy9saWIvZ2V0QWN0aXZlRWxlbWVudCcpO1xudmFyIGlzVGV4dElucHV0RWxlbWVudCA9IHJlcXVpcmUoJy4vaXNUZXh0SW5wdXRFbGVtZW50Jyk7XG52YXIgc2hhbGxvd0VxdWFsID0gcmVxdWlyZSgnZmJqcy9saWIvc2hhbGxvd0VxdWFsJyk7XG5cbnZhciBza2lwU2VsZWN0aW9uQ2hhbmdlRXZlbnQgPSBFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00gJiYgJ2RvY3VtZW50TW9kZScgaW4gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDw9IDExO1xuXG52YXIgZXZlbnRUeXBlcyA9IHtcbiAgc2VsZWN0OiB7XG4gICAgcGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6IHtcbiAgICAgIGJ1YmJsZWQ6ICdvblNlbGVjdCcsXG4gICAgICBjYXB0dXJlZDogJ29uU2VsZWN0Q2FwdHVyZSdcbiAgICB9LFxuICAgIGRlcGVuZGVuY2llczogWyd0b3BCbHVyJywgJ3RvcENvbnRleHRNZW51JywgJ3RvcEZvY3VzJywgJ3RvcEtleURvd24nLCAndG9wS2V5VXAnLCAndG9wTW91c2VEb3duJywgJ3RvcE1vdXNlVXAnLCAndG9wU2VsZWN0aW9uQ2hhbmdlJ11cbiAgfVxufTtcblxudmFyIGFjdGl2ZUVsZW1lbnQgPSBudWxsO1xudmFyIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbnZhciBsYXN0U2VsZWN0aW9uID0gbnVsbDtcbnZhciBtb3VzZURvd24gPSBmYWxzZTtcblxuLy8gVHJhY2sgd2hldGhlciBhIGxpc3RlbmVyIGV4aXN0cyBmb3IgdGhpcyBwbHVnaW4uIElmIG5vbmUgZXhpc3QsIHdlIGRvXG4vLyBub3QgZXh0cmFjdCBldmVudHMuIFNlZSAjMzYzOS5cbnZhciBoYXNMaXN0ZW5lciA9IGZhbHNlO1xuXG4vKipcbiAqIEdldCBhbiBvYmplY3Qgd2hpY2ggaXMgYSB1bmlxdWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLlxuICpcbiAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBub3QgYmUgY29uc2lzdGVudCBhY3Jvc3Mgbm9kZXMgb3IgYnJvd3NlcnMsIGJ1dFxuICogdHdvIGlkZW50aWNhbCBzZWxlY3Rpb25zIG9uIHRoZSBzYW1lIG5vZGUgd2lsbCByZXR1cm4gaWRlbnRpY2FsIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGdldFNlbGVjdGlvbihub2RlKSB7XG4gIGlmICgnc2VsZWN0aW9uU3RhcnQnIGluIG5vZGUgJiYgUmVhY3RJbnB1dFNlbGVjdGlvbi5oYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMobm9kZSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IG5vZGUuc2VsZWN0aW9uU3RhcnQsXG4gICAgICBlbmQ6IG5vZGUuc2VsZWN0aW9uRW5kXG4gICAgfTtcbiAgfSBlbHNlIGlmICh3aW5kb3cuZ2V0U2VsZWN0aW9uKSB7XG4gICAgdmFyIHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgICByZXR1cm4ge1xuICAgICAgYW5jaG9yTm9kZTogc2VsZWN0aW9uLmFuY2hvck5vZGUsXG4gICAgICBhbmNob3JPZmZzZXQ6IHNlbGVjdGlvbi5hbmNob3JPZmZzZXQsXG4gICAgICBmb2N1c05vZGU6IHNlbGVjdGlvbi5mb2N1c05vZGUsXG4gICAgICBmb2N1c09mZnNldDogc2VsZWN0aW9uLmZvY3VzT2Zmc2V0XG4gICAgfTtcbiAgfSBlbHNlIGlmIChkb2N1bWVudC5zZWxlY3Rpb24pIHtcbiAgICB2YXIgcmFuZ2UgPSBkb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKTtcbiAgICByZXR1cm4ge1xuICAgICAgcGFyZW50RWxlbWVudDogcmFuZ2UucGFyZW50RWxlbWVudCgpLFxuICAgICAgdGV4dDogcmFuZ2UudGV4dCxcbiAgICAgIHRvcDogcmFuZ2UuYm91bmRpbmdUb3AsXG4gICAgICBsZWZ0OiByYW5nZS5ib3VuZGluZ0xlZnRcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogUG9sbCBzZWxlY3Rpb24gdG8gc2VlIHdoZXRoZXIgaXQncyBjaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudFxuICogQHJldHVybiB7P1N5bnRoZXRpY0V2ZW50fVxuICovXG5mdW5jdGlvbiBjb25zdHJ1Y3RTZWxlY3RFdmVudChuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgLy8gRW5zdXJlIHdlIGhhdmUgdGhlIHJpZ2h0IGVsZW1lbnQsIGFuZCB0aGF0IHRoZSB1c2VyIGlzIG5vdCBkcmFnZ2luZyBhXG4gIC8vIHNlbGVjdGlvbiAodGhpcyBtYXRjaGVzIG5hdGl2ZSBgc2VsZWN0YCBldmVudCBiZWhhdmlvcikuIEluIEhUTUw1LCBzZWxlY3RcbiAgLy8gZmlyZXMgb25seSBvbiBpbnB1dCBhbmQgdGV4dGFyZWEgdGh1cyBpZiB0aGVyZSdzIG5vIGZvY3VzZWQgZWxlbWVudCB3ZVxuICAvLyB3b24ndCBkaXNwYXRjaC5cbiAgaWYgKG1vdXNlRG93biB8fCBhY3RpdmVFbGVtZW50ID09IG51bGwgfHwgYWN0aXZlRWxlbWVudCAhPT0gZ2V0QWN0aXZlRWxlbWVudCgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBPbmx5IGZpcmUgd2hlbiBzZWxlY3Rpb24gaGFzIGFjdHVhbGx5IGNoYW5nZWQuXG4gIHZhciBjdXJyZW50U2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKGFjdGl2ZUVsZW1lbnQpO1xuICBpZiAoIWxhc3RTZWxlY3Rpb24gfHwgIXNoYWxsb3dFcXVhbChsYXN0U2VsZWN0aW9uLCBjdXJyZW50U2VsZWN0aW9uKSkge1xuICAgIGxhc3RTZWxlY3Rpb24gPSBjdXJyZW50U2VsZWN0aW9uO1xuXG4gICAgdmFyIHN5bnRoZXRpY0V2ZW50ID0gU3ludGhldGljRXZlbnQuZ2V0UG9vbGVkKGV2ZW50VHlwZXMuc2VsZWN0LCBhY3RpdmVFbGVtZW50SW5zdCwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcblxuICAgIHN5bnRoZXRpY0V2ZW50LnR5cGUgPSAnc2VsZWN0JztcbiAgICBzeW50aGV0aWNFdmVudC50YXJnZXQgPSBhY3RpdmVFbGVtZW50O1xuXG4gICAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKHN5bnRoZXRpY0V2ZW50KTtcblxuICAgIHJldHVybiBzeW50aGV0aWNFdmVudDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFRoaXMgcGx1Z2luIGNyZWF0ZXMgYW4gYG9uU2VsZWN0YCBldmVudCB0aGF0IG5vcm1hbGl6ZXMgc2VsZWN0IGV2ZW50c1xuICogYWNyb3NzIGZvcm0gZWxlbWVudHMuXG4gKlxuICogU3VwcG9ydGVkIGVsZW1lbnRzIGFyZTpcbiAqIC0gaW5wdXQgKHNlZSBgaXNUZXh0SW5wdXRFbGVtZW50YClcbiAqIC0gdGV4dGFyZWFcbiAqIC0gY29udGVudEVkaXRhYmxlXG4gKlxuICogVGhpcyBkaWZmZXJzIGZyb20gbmF0aXZlIGJyb3dzZXIgaW1wbGVtZW50YXRpb25zIGluIHRoZSBmb2xsb3dpbmcgd2F5czpcbiAqIC0gRmlyZXMgb24gY29udGVudEVkaXRhYmxlIGZpZWxkcyBhcyB3ZWxsIGFzIGlucHV0cy5cbiAqIC0gRmlyZXMgZm9yIGNvbGxhcHNlZCBzZWxlY3Rpb24uXG4gKiAtIEZpcmVzIGFmdGVyIHVzZXIgaW5wdXQuXG4gKi9cbnZhciBTZWxlY3RFdmVudFBsdWdpbiA9IHtcblxuICBldmVudFR5cGVzOiBldmVudFR5cGVzLFxuXG4gIGV4dHJhY3RFdmVudHM6IGZ1bmN0aW9uICh0b3BMZXZlbFR5cGUsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICAgIGlmICghaGFzTGlzdGVuZXIpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciB0YXJnZXROb2RlID0gdGFyZ2V0SW5zdCA/IFJlYWN0RE9NQ29tcG9uZW50VHJlZS5nZXROb2RlRnJvbUluc3RhbmNlKHRhcmdldEluc3QpIDogd2luZG93O1xuXG4gICAgc3dpdGNoICh0b3BMZXZlbFR5cGUpIHtcbiAgICAgIC8vIFRyYWNrIHRoZSBpbnB1dCBub2RlIHRoYXQgaGFzIGZvY3VzLlxuICAgICAgY2FzZSAndG9wRm9jdXMnOlxuICAgICAgICBpZiAoaXNUZXh0SW5wdXRFbGVtZW50KHRhcmdldE5vZGUpIHx8IHRhcmdldE5vZGUuY29udGVudEVkaXRhYmxlID09PSAndHJ1ZScpIHtcbiAgICAgICAgICBhY3RpdmVFbGVtZW50ID0gdGFyZ2V0Tm9kZTtcbiAgICAgICAgICBhY3RpdmVFbGVtZW50SW5zdCA9IHRhcmdldEluc3Q7XG4gICAgICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BCbHVyJzpcbiAgICAgICAgYWN0aXZlRWxlbWVudCA9IG51bGw7XG4gICAgICAgIGFjdGl2ZUVsZW1lbnRJbnN0ID0gbnVsbDtcbiAgICAgICAgbGFzdFNlbGVjdGlvbiA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICAvLyBEb24ndCBmaXJlIHRoZSBldmVudCB3aGlsZSB0aGUgdXNlciBpcyBkcmFnZ2luZy4gVGhpcyBtYXRjaGVzIHRoZVxuICAgICAgLy8gc2VtYW50aWNzIG9mIHRoZSBuYXRpdmUgc2VsZWN0IGV2ZW50LlxuICAgICAgY2FzZSAndG9wTW91c2VEb3duJzpcbiAgICAgICAgbW91c2VEb3duID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BDb250ZXh0TWVudSc6XG4gICAgICBjYXNlICd0b3BNb3VzZVVwJzpcbiAgICAgICAgbW91c2VEb3duID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBjb25zdHJ1Y3RTZWxlY3RFdmVudChuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xuXG4gICAgICAvLyBDaHJvbWUgYW5kIElFIGZpcmUgbm9uLXN0YW5kYXJkIGV2ZW50IHdoZW4gc2VsZWN0aW9uIGlzIGNoYW5nZWQgKGFuZFxuICAgICAgLy8gc29tZXRpbWVzIHdoZW4gaXQgaGFzbid0KS4gSUUncyBldmVudCBmaXJlcyBvdXQgb2Ygb3JkZXIgd2l0aCByZXNwZWN0XG4gICAgICAvLyB0byBrZXkgYW5kIGlucHV0IGV2ZW50cyBvbiBkZWxldGlvbiwgc28gd2UgZGlzY2FyZCBpdC5cbiAgICAgIC8vXG4gICAgICAvLyBGaXJlZm94IGRvZXNuJ3Qgc3VwcG9ydCBzZWxlY3Rpb25jaGFuZ2UsIHNvIGNoZWNrIHNlbGVjdGlvbiBzdGF0dXNcbiAgICAgIC8vIGFmdGVyIGVhY2gga2V5IGVudHJ5LiBUaGUgc2VsZWN0aW9uIGNoYW5nZXMgYWZ0ZXIga2V5ZG93biBhbmQgYmVmb3JlXG4gICAgICAvLyBrZXl1cCwgYnV0IHdlIGNoZWNrIG9uIGtleWRvd24gYXMgd2VsbCBpbiB0aGUgY2FzZSBvZiBob2xkaW5nIGRvd24gYVxuICAgICAgLy8ga2V5LCB3aGVuIG11bHRpcGxlIGtleWRvd24gZXZlbnRzIGFyZSBmaXJlZCBidXQgb25seSBvbmUga2V5dXAgaXMuXG4gICAgICAvLyBUaGlzIGlzIGFsc28gb3VyIGFwcHJvYWNoIGZvciBJRSBoYW5kbGluZywgZm9yIHRoZSByZWFzb24gYWJvdmUuXG4gICAgICBjYXNlICd0b3BTZWxlY3Rpb25DaGFuZ2UnOlxuICAgICAgICBpZiAoc2tpcFNlbGVjdGlvbkNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIC8vIGZhbGxzIHRocm91Z2hcbiAgICAgIGNhc2UgJ3RvcEtleURvd24nOlxuICAgICAgY2FzZSAndG9wS2V5VXAnOlxuICAgICAgICByZXR1cm4gY29uc3RydWN0U2VsZWN0RXZlbnQobmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSxcblxuICBkaWRQdXRMaXN0ZW5lcjogZnVuY3Rpb24gKGluc3QsIHJlZ2lzdHJhdGlvbk5hbWUsIGxpc3RlbmVyKSB7XG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvblNlbGVjdCcpIHtcbiAgICAgIGhhc0xpc3RlbmVyID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gU2VsZWN0RXZlbnRQbHVnaW47IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgRXZlbnRMaXN0ZW5lciA9IHJlcXVpcmUoJ2ZianMvbGliL0V2ZW50TGlzdGVuZXInKTtcbnZhciBFdmVudFByb3BhZ2F0b3JzID0gcmVxdWlyZSgnLi9FdmVudFByb3BhZ2F0b3JzJyk7XG52YXIgUmVhY3RET01Db21wb25lbnRUcmVlID0gcmVxdWlyZSgnLi9SZWFjdERPTUNvbXBvbmVudFRyZWUnKTtcbnZhciBTeW50aGV0aWNBbmltYXRpb25FdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljQW5pbWF0aW9uRXZlbnQnKTtcbnZhciBTeW50aGV0aWNDbGlwYm9hcmRFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljQ2xpcGJvYXJkRXZlbnQnKTtcbnZhciBTeW50aGV0aWNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRXZlbnQnKTtcbnZhciBTeW50aGV0aWNGb2N1c0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNGb2N1c0V2ZW50Jyk7XG52YXIgU3ludGhldGljS2V5Ym9hcmRFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljS2V5Ym9hcmRFdmVudCcpO1xudmFyIFN5bnRoZXRpY01vdXNlRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY01vdXNlRXZlbnQnKTtcbnZhciBTeW50aGV0aWNEcmFnRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY0RyYWdFdmVudCcpO1xudmFyIFN5bnRoZXRpY1RvdWNoRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY1RvdWNoRXZlbnQnKTtcbnZhciBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY1RyYW5zaXRpb25FdmVudCcpO1xudmFyIFN5bnRoZXRpY1VJRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY1VJRXZlbnQnKTtcbnZhciBTeW50aGV0aWNXaGVlbEV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNXaGVlbEV2ZW50Jyk7XG5cbnZhciBlbXB0eUZ1bmN0aW9uID0gcmVxdWlyZSgnZmJqcy9saWIvZW1wdHlGdW5jdGlvbicpO1xudmFyIGdldEV2ZW50Q2hhckNvZGUgPSByZXF1aXJlKCcuL2dldEV2ZW50Q2hhckNvZGUnKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcblxuLyoqXG4gKiBUdXJuc1xuICogWydhYm9ydCcsIC4uLl1cbiAqIGludG9cbiAqIGV2ZW50VHlwZXMgPSB7XG4gKiAgICdhYm9ydCc6IHtcbiAqICAgICBwaGFzZWRSZWdpc3RyYXRpb25OYW1lczoge1xuICogICAgICAgYnViYmxlZDogJ29uQWJvcnQnLFxuICogICAgICAgY2FwdHVyZWQ6ICdvbkFib3J0Q2FwdHVyZScsXG4gKiAgICAgfSxcbiAqICAgICBkZXBlbmRlbmNpZXM6IFsndG9wQWJvcnQnXSxcbiAqICAgfSxcbiAqICAgLi4uXG4gKiB9O1xuICogdG9wTGV2ZWxFdmVudHNUb0Rpc3BhdGNoQ29uZmlnID0ge1xuICogICAndG9wQWJvcnQnOiB7IHNhbWVDb25maWcgfVxuICogfTtcbiAqL1xudmFyIGV2ZW50VHlwZXMgPSB7fTtcbnZhciB0b3BMZXZlbEV2ZW50c1RvRGlzcGF0Y2hDb25maWcgPSB7fTtcblsnYWJvcnQnLCAnYW5pbWF0aW9uRW5kJywgJ2FuaW1hdGlvbkl0ZXJhdGlvbicsICdhbmltYXRpb25TdGFydCcsICdibHVyJywgJ2NhblBsYXknLCAnY2FuUGxheVRocm91Z2gnLCAnY2xpY2snLCAnY29udGV4dE1lbnUnLCAnY29weScsICdjdXQnLCAnZG91YmxlQ2xpY2snLCAnZHJhZycsICdkcmFnRW5kJywgJ2RyYWdFbnRlcicsICdkcmFnRXhpdCcsICdkcmFnTGVhdmUnLCAnZHJhZ092ZXInLCAnZHJhZ1N0YXJ0JywgJ2Ryb3AnLCAnZHVyYXRpb25DaGFuZ2UnLCAnZW1wdGllZCcsICdlbmNyeXB0ZWQnLCAnZW5kZWQnLCAnZXJyb3InLCAnZm9jdXMnLCAnaW5wdXQnLCAnaW52YWxpZCcsICdrZXlEb3duJywgJ2tleVByZXNzJywgJ2tleVVwJywgJ2xvYWQnLCAnbG9hZGVkRGF0YScsICdsb2FkZWRNZXRhZGF0YScsICdsb2FkU3RhcnQnLCAnbW91c2VEb3duJywgJ21vdXNlTW92ZScsICdtb3VzZU91dCcsICdtb3VzZU92ZXInLCAnbW91c2VVcCcsICdwYXN0ZScsICdwYXVzZScsICdwbGF5JywgJ3BsYXlpbmcnLCAncHJvZ3Jlc3MnLCAncmF0ZUNoYW5nZScsICdyZXNldCcsICdzY3JvbGwnLCAnc2Vla2VkJywgJ3NlZWtpbmcnLCAnc3RhbGxlZCcsICdzdWJtaXQnLCAnc3VzcGVuZCcsICd0aW1lVXBkYXRlJywgJ3RvdWNoQ2FuY2VsJywgJ3RvdWNoRW5kJywgJ3RvdWNoTW92ZScsICd0b3VjaFN0YXJ0JywgJ3RyYW5zaXRpb25FbmQnLCAndm9sdW1lQ2hhbmdlJywgJ3dhaXRpbmcnLCAnd2hlZWwnXS5mb3JFYWNoKGZ1bmN0aW9uIChldmVudCkge1xuICB2YXIgY2FwaXRhbGl6ZWRFdmVudCA9IGV2ZW50WzBdLnRvVXBwZXJDYXNlKCkgKyBldmVudC5zbGljZSgxKTtcbiAgdmFyIG9uRXZlbnQgPSAnb24nICsgY2FwaXRhbGl6ZWRFdmVudDtcbiAgdmFyIHRvcEV2ZW50ID0gJ3RvcCcgKyBjYXBpdGFsaXplZEV2ZW50O1xuXG4gIHZhciB0eXBlID0ge1xuICAgIHBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOiB7XG4gICAgICBidWJibGVkOiBvbkV2ZW50LFxuICAgICAgY2FwdHVyZWQ6IG9uRXZlbnQgKyAnQ2FwdHVyZSdcbiAgICB9LFxuICAgIGRlcGVuZGVuY2llczogW3RvcEV2ZW50XVxuICB9O1xuICBldmVudFR5cGVzW2V2ZW50XSA9IHR5cGU7XG4gIHRvcExldmVsRXZlbnRzVG9EaXNwYXRjaENvbmZpZ1t0b3BFdmVudF0gPSB0eXBlO1xufSk7XG5cbnZhciBvbkNsaWNrTGlzdGVuZXJzID0ge307XG5cbmZ1bmN0aW9uIGdldERpY3Rpb25hcnlLZXkoaW5zdCkge1xuICAvLyBQcmV2ZW50cyBWOCBwZXJmb3JtYW5jZSBpc3N1ZTpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzIzMlxuICByZXR1cm4gJy4nICsgaW5zdC5fcm9vdE5vZGVJRDtcbn1cblxuZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSh0YWcpIHtcbiAgcmV0dXJuIHRhZyA9PT0gJ2J1dHRvbicgfHwgdGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3NlbGVjdCcgfHwgdGFnID09PSAndGV4dGFyZWEnO1xufVxuXG52YXIgU2ltcGxlRXZlbnRQbHVnaW4gPSB7XG5cbiAgZXZlbnRUeXBlczogZXZlbnRUeXBlcyxcblxuICBleHRyYWN0RXZlbnRzOiBmdW5jdGlvbiAodG9wTGV2ZWxUeXBlLCB0YXJnZXRJbnN0LCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgICB2YXIgZGlzcGF0Y2hDb25maWcgPSB0b3BMZXZlbEV2ZW50c1RvRGlzcGF0Y2hDb25maWdbdG9wTGV2ZWxUeXBlXTtcbiAgICBpZiAoIWRpc3BhdGNoQ29uZmlnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIEV2ZW50Q29uc3RydWN0b3I7XG4gICAgc3dpdGNoICh0b3BMZXZlbFR5cGUpIHtcbiAgICAgIGNhc2UgJ3RvcEFib3J0JzpcbiAgICAgIGNhc2UgJ3RvcENhblBsYXknOlxuICAgICAgY2FzZSAndG9wQ2FuUGxheVRocm91Z2gnOlxuICAgICAgY2FzZSAndG9wRHVyYXRpb25DaGFuZ2UnOlxuICAgICAgY2FzZSAndG9wRW1wdGllZCc6XG4gICAgICBjYXNlICd0b3BFbmNyeXB0ZWQnOlxuICAgICAgY2FzZSAndG9wRW5kZWQnOlxuICAgICAgY2FzZSAndG9wRXJyb3InOlxuICAgICAgY2FzZSAndG9wSW5wdXQnOlxuICAgICAgY2FzZSAndG9wSW52YWxpZCc6XG4gICAgICBjYXNlICd0b3BMb2FkJzpcbiAgICAgIGNhc2UgJ3RvcExvYWRlZERhdGEnOlxuICAgICAgY2FzZSAndG9wTG9hZGVkTWV0YWRhdGEnOlxuICAgICAgY2FzZSAndG9wTG9hZFN0YXJ0JzpcbiAgICAgIGNhc2UgJ3RvcFBhdXNlJzpcbiAgICAgIGNhc2UgJ3RvcFBsYXknOlxuICAgICAgY2FzZSAndG9wUGxheWluZyc6XG4gICAgICBjYXNlICd0b3BQcm9ncmVzcyc6XG4gICAgICBjYXNlICd0b3BSYXRlQ2hhbmdlJzpcbiAgICAgIGNhc2UgJ3RvcFJlc2V0JzpcbiAgICAgIGNhc2UgJ3RvcFNlZWtlZCc6XG4gICAgICBjYXNlICd0b3BTZWVraW5nJzpcbiAgICAgIGNhc2UgJ3RvcFN0YWxsZWQnOlxuICAgICAgY2FzZSAndG9wU3VibWl0JzpcbiAgICAgIGNhc2UgJ3RvcFN1c3BlbmQnOlxuICAgICAgY2FzZSAndG9wVGltZVVwZGF0ZSc6XG4gICAgICBjYXNlICd0b3BWb2x1bWVDaGFuZ2UnOlxuICAgICAgY2FzZSAndG9wV2FpdGluZyc6XG4gICAgICAgIC8vIEhUTUwgRXZlbnRzXG4gICAgICAgIC8vIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvaW5kZXguaHRtbCNldmVudHMtMFxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wS2V5UHJlc3MnOlxuICAgICAgICAvLyBGaXJlZm94IGNyZWF0ZXMgYSBrZXlwcmVzcyBldmVudCBmb3IgZnVuY3Rpb24ga2V5cyB0b28uIFRoaXMgcmVtb3Zlc1xuICAgICAgICAvLyB0aGUgdW53YW50ZWQga2V5cHJlc3MgZXZlbnRzLiBFbnRlciBpcyBob3dldmVyIGJvdGggcHJpbnRhYmxlIGFuZFxuICAgICAgICAvLyBub24tcHJpbnRhYmxlLiBPbmUgd291bGQgZXhwZWN0IFRhYiB0byBiZSBhcyB3ZWxsIChidXQgaXQgaXNuJ3QpLlxuICAgICAgICBpZiAoZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSAndG9wS2V5RG93bic6XG4gICAgICBjYXNlICd0b3BLZXlVcCc6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNLZXlib2FyZEV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcEJsdXInOlxuICAgICAgY2FzZSAndG9wRm9jdXMnOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljRm9jdXNFdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BDbGljayc6XG4gICAgICAgIC8vIEZpcmVmb3ggY3JlYXRlcyBhIGNsaWNrIGV2ZW50IG9uIHJpZ2h0IG1vdXNlIGNsaWNrcy4gVGhpcyByZW1vdmVzIHRoZVxuICAgICAgICAvLyB1bndhbnRlZCBjbGljayBldmVudHMuXG4gICAgICAgIGlmIChuYXRpdmVFdmVudC5idXR0b24gPT09IDIpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSAndG9wRG91YmxlQ2xpY2snOlxuICAgICAgY2FzZSAndG9wTW91c2VEb3duJzpcbiAgICAgIGNhc2UgJ3RvcE1vdXNlTW92ZSc6XG4gICAgICBjYXNlICd0b3BNb3VzZVVwJzpcbiAgICAgIC8vIFRPRE86IERpc2FibGVkIGVsZW1lbnRzIHNob3VsZCBub3QgcmVzcG9uZCB0byBtb3VzZSBldmVudHNcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgJ3RvcE1vdXNlT3V0JzpcbiAgICAgIGNhc2UgJ3RvcE1vdXNlT3Zlcic6XG4gICAgICBjYXNlICd0b3BDb250ZXh0TWVudSc6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNNb3VzZUV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcERyYWcnOlxuICAgICAgY2FzZSAndG9wRHJhZ0VuZCc6XG4gICAgICBjYXNlICd0b3BEcmFnRW50ZXInOlxuICAgICAgY2FzZSAndG9wRHJhZ0V4aXQnOlxuICAgICAgY2FzZSAndG9wRHJhZ0xlYXZlJzpcbiAgICAgIGNhc2UgJ3RvcERyYWdPdmVyJzpcbiAgICAgIGNhc2UgJ3RvcERyYWdTdGFydCc6XG4gICAgICBjYXNlICd0b3BEcm9wJzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY0RyYWdFdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BUb3VjaENhbmNlbCc6XG4gICAgICBjYXNlICd0b3BUb3VjaEVuZCc6XG4gICAgICBjYXNlICd0b3BUb3VjaE1vdmUnOlxuICAgICAgY2FzZSAndG9wVG91Y2hTdGFydCc6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNUb3VjaEV2ZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3RvcEFuaW1hdGlvbkVuZCc6XG4gICAgICBjYXNlICd0b3BBbmltYXRpb25JdGVyYXRpb24nOlxuICAgICAgY2FzZSAndG9wQW5pbWF0aW9uU3RhcnQnOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljQW5pbWF0aW9uRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wVHJhbnNpdGlvbkVuZCc6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wU2Nyb2xsJzpcbiAgICAgICAgRXZlbnRDb25zdHJ1Y3RvciA9IFN5bnRoZXRpY1VJRXZlbnQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndG9wV2hlZWwnOlxuICAgICAgICBFdmVudENvbnN0cnVjdG9yID0gU3ludGhldGljV2hlZWxFdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0b3BDb3B5JzpcbiAgICAgIGNhc2UgJ3RvcEN1dCc6XG4gICAgICBjYXNlICd0b3BQYXN0ZSc6XG4gICAgICAgIEV2ZW50Q29uc3RydWN0b3IgPSBTeW50aGV0aWNDbGlwYm9hcmRFdmVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgICFFdmVudENvbnN0cnVjdG9yID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdTaW1wbGVFdmVudFBsdWdpbjogVW5oYW5kbGVkIGV2ZW50IHR5cGUsIGAlc2AuJywgdG9wTGV2ZWxUeXBlKSA6IF9wcm9kSW52YXJpYW50KCc4NicsIHRvcExldmVsVHlwZSkgOiB2b2lkIDA7XG4gICAgdmFyIGV2ZW50ID0gRXZlbnRDb25zdHJ1Y3Rvci5nZXRQb29sZWQoZGlzcGF0Y2hDb25maWcsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG4gICAgRXZlbnRQcm9wYWdhdG9ycy5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGV2ZW50KTtcbiAgICByZXR1cm4gZXZlbnQ7XG4gIH0sXG5cbiAgZGlkUHV0TGlzdGVuZXI6IGZ1bmN0aW9uIChpbnN0LCByZWdpc3RyYXRpb25OYW1lLCBsaXN0ZW5lcikge1xuICAgIC8vIE1vYmlsZSBTYWZhcmkgZG9lcyBub3QgZmlyZSBwcm9wZXJseSBidWJibGUgY2xpY2sgZXZlbnRzIG9uXG4gICAgLy8gbm9uLWludGVyYWN0aXZlIGVsZW1lbnRzLCB3aGljaCBtZWFucyBkZWxlZ2F0ZWQgY2xpY2sgbGlzdGVuZXJzIGRvIG5vdFxuICAgIC8vIGZpcmUuIFRoZSB3b3JrYXJvdW5kIGZvciB0aGlzIGJ1ZyBpbnZvbHZlcyBhdHRhY2hpbmcgYW4gZW1wdHkgY2xpY2tcbiAgICAvLyBsaXN0ZW5lciBvbiB0aGUgdGFyZ2V0IG5vZGUuXG4gICAgLy8gaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTAvMDkvY2xpY2tfZXZlbnRfZGVsLmh0bWxcbiAgICBpZiAocmVnaXN0cmF0aW9uTmFtZSA9PT0gJ29uQ2xpY2snICYmICFpc0ludGVyYWN0aXZlKGluc3QuX3RhZykpIHtcbiAgICAgIHZhciBrZXkgPSBnZXREaWN0aW9uYXJ5S2V5KGluc3QpO1xuICAgICAgdmFyIG5vZGUgPSBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KTtcbiAgICAgIGlmICghb25DbGlja0xpc3RlbmVyc1trZXldKSB7XG4gICAgICAgIG9uQ2xpY2tMaXN0ZW5lcnNba2V5XSA9IEV2ZW50TGlzdGVuZXIubGlzdGVuKG5vZGUsICdjbGljaycsIGVtcHR5RnVuY3Rpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICB3aWxsRGVsZXRlTGlzdGVuZXI6IGZ1bmN0aW9uIChpbnN0LCByZWdpc3RyYXRpb25OYW1lKSB7XG4gICAgaWYgKHJlZ2lzdHJhdGlvbk5hbWUgPT09ICdvbkNsaWNrJyAmJiAhaXNJbnRlcmFjdGl2ZShpbnN0Ll90YWcpKSB7XG4gICAgICB2YXIga2V5ID0gZ2V0RGljdGlvbmFyeUtleShpbnN0KTtcbiAgICAgIG9uQ2xpY2tMaXN0ZW5lcnNba2V5XS5yZW1vdmUoKTtcbiAgICAgIGRlbGV0ZSBvbkNsaWNrTGlzdGVuZXJzW2tleV07XG4gICAgfVxuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gU2ltcGxlRXZlbnRQbHVnaW47IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNFdmVudCcpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1hbmltYXRpb25zLyNBbmltYXRpb25FdmVudC1pbnRlcmZhY2VcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0FuaW1hdGlvbkV2ZW50XG4gKi9cbnZhciBBbmltYXRpb25FdmVudEludGVyZmFjZSA9IHtcbiAgYW5pbWF0aW9uTmFtZTogbnVsbCxcbiAgZWxhcHNlZFRpbWU6IG51bGwsXG4gIHBzZXVkb0VsZW1lbnQ6IG51bGxcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY0V2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNBbmltYXRpb25FdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICByZXR1cm4gU3ludGhldGljRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cblN5bnRoZXRpY0V2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNBbmltYXRpb25FdmVudCwgQW5pbWF0aW9uRXZlbnRJbnRlcmZhY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY0FuaW1hdGlvbkV2ZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBTeW50aGV0aWNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRXZlbnQnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NsaXBib2FyZC1hcGlzL1xuICovXG52YXIgQ2xpcGJvYXJkRXZlbnRJbnRlcmZhY2UgPSB7XG4gIGNsaXBib2FyZERhdGE6IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiAnY2xpcGJvYXJkRGF0YScgaW4gZXZlbnQgPyBldmVudC5jbGlwYm9hcmREYXRhIDogd2luZG93LmNsaXBib2FyZERhdGE7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9XG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuU3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0NsaXBib2FyZEV2ZW50LCBDbGlwYm9hcmRFdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljQ2xpcGJvYXJkRXZlbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNFdmVudCcpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtY29tcG9zaXRpb25ldmVudHNcbiAqL1xudmFyIENvbXBvc2l0aW9uRXZlbnRJbnRlcmZhY2UgPSB7XG4gIGRhdGE6IG51bGxcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9XG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY0NvbXBvc2l0aW9uRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljQ29tcG9zaXRpb25FdmVudCwgQ29tcG9zaXRpb25FdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljQ29tcG9zaXRpb25FdmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3ludGhldGljTW91c2VFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljTW91c2VFdmVudCcpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRHJhZ0V2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xudmFyIERyYWdFdmVudEludGVyZmFjZSA9IHtcbiAgZGF0YVRyYW5zZmVyOiBudWxsXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNVSUV2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNEcmFnRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY01vdXNlRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cblN5bnRoZXRpY01vdXNlRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0RyYWdFdmVudCwgRHJhZ0V2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNEcmFnRXZlbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBQb29sZWRDbGFzcyA9IHJlcXVpcmUoJy4vUG9vbGVkQ2xhc3MnKTtcblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIGRpZFdhcm5Gb3JBZGRlZE5ld1Byb3BlcnR5ID0gZmFsc2U7XG52YXIgaXNQcm94eVN1cHBvcnRlZCA9IHR5cGVvZiBQcm94eSA9PT0gJ2Z1bmN0aW9uJztcblxudmFyIHNob3VsZEJlUmVsZWFzZWRQcm9wZXJ0aWVzID0gWydkaXNwYXRjaENvbmZpZycsICdfdGFyZ2V0SW5zdCcsICduYXRpdmVFdmVudCcsICdpc0RlZmF1bHRQcmV2ZW50ZWQnLCAnaXNQcm9wYWdhdGlvblN0b3BwZWQnLCAnX2Rpc3BhdGNoTGlzdGVuZXJzJywgJ19kaXNwYXRjaEluc3RhbmNlcyddO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG52YXIgRXZlbnRJbnRlcmZhY2UgPSB7XG4gIHR5cGU6IG51bGwsXG4gIHRhcmdldDogbnVsbCxcbiAgLy8gY3VycmVudFRhcmdldCBpcyBzZXQgd2hlbiBkaXNwYXRjaGluZzsgbm8gdXNlIGluIGNvcHlpbmcgaXQgaGVyZVxuICBjdXJyZW50VGFyZ2V0OiBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zTnVsbCxcbiAgZXZlbnRQaGFzZTogbnVsbCxcbiAgYnViYmxlczogbnVsbCxcbiAgY2FuY2VsYWJsZTogbnVsbCxcbiAgdGltZVN0YW1wOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG4gIH0sXG4gIGRlZmF1bHRQcmV2ZW50ZWQ6IG51bGwsXG4gIGlzVHJ1c3RlZDogbnVsbFxufTtcblxuLyoqXG4gKiBTeW50aGV0aWMgZXZlbnRzIGFyZSBkaXNwYXRjaGVkIGJ5IGV2ZW50IHBsdWdpbnMsIHR5cGljYWxseSBpbiByZXNwb25zZSB0byBhXG4gKiB0b3AtbGV2ZWwgZXZlbnQgZGVsZWdhdGlvbiBoYW5kbGVyLlxuICpcbiAqIFRoZXNlIHN5c3RlbXMgc2hvdWxkIGdlbmVyYWxseSB1c2UgcG9vbGluZyB0byByZWR1Y2UgdGhlIGZyZXF1ZW5jeSBvZiBnYXJiYWdlXG4gKiBjb2xsZWN0aW9uLiBUaGUgc3lzdGVtIHNob3VsZCBjaGVjayBgaXNQZXJzaXN0ZW50YCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVcbiAqIGV2ZW50IHNob3VsZCBiZSByZWxlYXNlZCBpbnRvIHRoZSBwb29sIGFmdGVyIGJlaW5nIGRpc3BhdGNoZWQuIFVzZXJzIHRoYXRcbiAqIG5lZWQgYSBwZXJzaXN0ZWQgZXZlbnQgc2hvdWxkIGludm9rZSBgcGVyc2lzdGAuXG4gKlxuICogU3ludGhldGljIGV2ZW50cyAoYW5kIHN1YmNsYXNzZXMpIGltcGxlbWVudCB0aGUgRE9NIExldmVsIDMgRXZlbnRzIEFQSSBieVxuICogbm9ybWFsaXppbmcgYnJvd3NlciBxdWlya3MuIFN1YmNsYXNzZXMgZG8gbm90IG5lY2Vzc2FyaWx5IGhhdmUgdG8gaW1wbGVtZW50IGFcbiAqIERPTSBpbnRlcmZhY2U7IGN1c3RvbSBhcHBsaWNhdGlvbi1zcGVjaWZpYyBldmVudHMgY2FuIGFsc28gc3ViY2xhc3MgdGhpcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0geyp9IHRhcmdldEluc3QgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcGFyYW0ge0RPTUV2ZW50VGFyZ2V0fSBuYXRpdmVFdmVudFRhcmdldCBUYXJnZXQgbm9kZS5cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljRXZlbnQoZGlzcGF0Y2hDb25maWcsIHRhcmdldEluc3QsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAvLyB0aGVzZSBoYXZlIGEgZ2V0dGVyL3NldHRlciBmb3Igd2FybmluZ3NcbiAgICBkZWxldGUgdGhpcy5uYXRpdmVFdmVudDtcbiAgICBkZWxldGUgdGhpcy5wcmV2ZW50RGVmYXVsdDtcbiAgICBkZWxldGUgdGhpcy5zdG9wUHJvcGFnYXRpb247XG4gIH1cblxuICB0aGlzLmRpc3BhdGNoQ29uZmlnID0gZGlzcGF0Y2hDb25maWc7XG4gIHRoaXMuX3RhcmdldEluc3QgPSB0YXJnZXRJbnN0O1xuICB0aGlzLm5hdGl2ZUV2ZW50ID0gbmF0aXZlRXZlbnQ7XG5cbiAgdmFyIEludGVyZmFjZSA9IHRoaXMuY29uc3RydWN0b3IuSW50ZXJmYWNlO1xuICBmb3IgKHZhciBwcm9wTmFtZSBpbiBJbnRlcmZhY2UpIHtcbiAgICBpZiAoIUludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGRlbGV0ZSB0aGlzW3Byb3BOYW1lXTsgLy8gdGhpcyBoYXMgYSBnZXR0ZXIvc2V0dGVyIGZvciB3YXJuaW5nc1xuICAgIH1cbiAgICB2YXIgbm9ybWFsaXplID0gSW50ZXJmYWNlW3Byb3BOYW1lXTtcbiAgICBpZiAobm9ybWFsaXplKSB7XG4gICAgICB0aGlzW3Byb3BOYW1lXSA9IG5vcm1hbGl6ZShuYXRpdmVFdmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ3RhcmdldCcpIHtcbiAgICAgICAgdGhpcy50YXJnZXQgPSBuYXRpdmVFdmVudFRhcmdldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNbcHJvcE5hbWVdID0gbmF0aXZlRXZlbnRbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBkZWZhdWx0UHJldmVudGVkID0gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCAhPSBudWxsID8gbmF0aXZlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA6IG5hdGl2ZUV2ZW50LnJldHVyblZhbHVlID09PSBmYWxzZTtcbiAgaWYgKGRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0ZhbHNlO1xuICB9XG4gIHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zRmFsc2U7XG4gIHJldHVybiB0aGlzO1xufVxuXG5fYXNzaWduKFN5bnRoZXRpY0V2ZW50LnByb3RvdHlwZSwge1xuXG4gIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICB2YXIgZXZlbnQgPSB0aGlzLm5hdGl2ZUV2ZW50O1xuICAgIGlmICghZXZlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQucHJldmVudERlZmF1bHQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQucmV0dXJuVmFsdWUgIT09ICd1bmtub3duJykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSB2YWxpZC10eXBlb2ZcbiAgICAgIGV2ZW50LnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RydWU7XG4gIH0sXG5cbiAgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV2ZW50ID0gdGhpcy5uYXRpdmVFdmVudDtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXZlbnQuY2FuY2VsQnViYmxlICE9PSAndW5rbm93bicpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgdmFsaWQtdHlwZW9mXG4gICAgICAvLyBUaGUgQ2hhbmdlRXZlbnRQbHVnaW4gcmVnaXN0ZXJzIGEgXCJwcm9wZXJ0eWNoYW5nZVwiIGV2ZW50IGZvclxuICAgICAgLy8gSUUuIFRoaXMgZXZlbnQgZG9lcyBub3Qgc3VwcG9ydCBidWJibGluZyBvciBjYW5jZWxsaW5nLCBhbmRcbiAgICAgIC8vIGFueSByZWZlcmVuY2VzIHRvIGNhbmNlbEJ1YmJsZSB0aHJvdyBcIk1lbWJlciBub3QgZm91bmRcIi4gIEFcbiAgICAgIC8vIHR5cGVvZiBjaGVjayBvZiBcInVua25vd25cIiBjaXJjdW12ZW50cyB0aGlzIGlzc3VlIChhbmQgaXMgYWxzb1xuICAgICAgLy8gSUUgc3BlY2lmaWMpLlxuICAgICAgZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc1RydWU7XG4gIH0sXG5cbiAgLyoqXG4gICAqIFdlIHJlbGVhc2UgYWxsIGRpc3BhdGNoZWQgYFN5bnRoZXRpY0V2ZW50YHMgYWZ0ZXIgZWFjaCBldmVudCBsb29wLCBhZGRpbmdcbiAgICogdGhlbSBiYWNrIGludG8gdGhlIHBvb2wuIFRoaXMgYWxsb3dzIGEgd2F5IHRvIGhvbGQgb250byBhIHJlZmVyZW5jZSB0aGF0XG4gICAqIHdvbid0IGJlIGFkZGVkIGJhY2sgaW50byB0aGUgcG9vbC5cbiAgICovXG4gIHBlcnNpc3Q6IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmlzUGVyc2lzdGVudCA9IGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNUcnVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhpcyBldmVudCBzaG91bGQgYmUgcmVsZWFzZWQgYmFjayBpbnRvIHRoZSBwb29sLlxuICAgKlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoaXMgc2hvdWxkIG5vdCBiZSByZWxlYXNlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgaXNQZXJzaXN0ZW50OiBlbXB0eUZ1bmN0aW9uLnRoYXRSZXR1cm5zRmFsc2UsXG5cbiAgLyoqXG4gICAqIGBQb29sZWRDbGFzc2AgbG9va3MgZm9yIGBkZXN0cnVjdG9yYCBvbiBlYWNoIGluc3RhbmNlIGl0IHJlbGVhc2VzLlxuICAgKi9cbiAgZGVzdHJ1Y3RvcjogZnVuY3Rpb24gKCkge1xuICAgIHZhciBJbnRlcmZhY2UgPSB0aGlzLmNvbnN0cnVjdG9yLkludGVyZmFjZTtcbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBJbnRlcmZhY2UpIHtcbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcE5hbWUsIGdldFBvb2xlZFdhcm5pbmdQcm9wZXJ0eURlZmluaXRpb24ocHJvcE5hbWUsIEludGVyZmFjZVtwcm9wTmFtZV0pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNbcHJvcE5hbWVdID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaG91bGRCZVJlbGVhc2VkUHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpc1tzaG91bGRCZVJlbGVhc2VkUHJvcGVydGllc1tpXV0gPSBudWxsO1xuICAgIH1cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnbmF0aXZlRXZlbnQnLCBnZXRQb29sZWRXYXJuaW5nUHJvcGVydHlEZWZpbml0aW9uKCduYXRpdmVFdmVudCcsIG51bGwpKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAncHJldmVudERlZmF1bHQnLCBnZXRQb29sZWRXYXJuaW5nUHJvcGVydHlEZWZpbml0aW9uKCdwcmV2ZW50RGVmYXVsdCcsIGVtcHR5RnVuY3Rpb24pKTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnc3RvcFByb3BhZ2F0aW9uJywgZ2V0UG9vbGVkV2FybmluZ1Byb3BlcnR5RGVmaW5pdGlvbignc3RvcFByb3BhZ2F0aW9uJywgZW1wdHlGdW5jdGlvbikpO1xuICAgIH1cbiAgfVxuXG59KTtcblxuU3ludGhldGljRXZlbnQuSW50ZXJmYWNlID0gRXZlbnRJbnRlcmZhY2U7XG5cbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICBpZiAoaXNQcm94eVN1cHBvcnRlZCkge1xuICAgIC8qZXNsaW50LWRpc2FibGUgbm8tZnVuYy1hc3NpZ24gKi9cbiAgICBTeW50aGV0aWNFdmVudCA9IG5ldyBQcm94eShTeW50aGV0aWNFdmVudCwge1xuICAgICAgY29uc3RydWN0OiBmdW5jdGlvbiAodGFyZ2V0LCBhcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcGx5KHRhcmdldCwgT2JqZWN0LmNyZWF0ZSh0YXJnZXQucHJvdG90eXBlKSwgYXJncyk7XG4gICAgICB9LFxuICAgICAgYXBwbHk6IGZ1bmN0aW9uIChjb25zdHJ1Y3RvciwgdGhhdCwgYXJncykge1xuICAgICAgICByZXR1cm4gbmV3IFByb3h5KGNvbnN0cnVjdG9yLmFwcGx5KHRoYXQsIGFyZ3MpLCB7XG4gICAgICAgICAgc2V0OiBmdW5jdGlvbiAodGFyZ2V0LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHByb3AgIT09ICdpc1BlcnNpc3RlbnQnICYmICF0YXJnZXQuY29uc3RydWN0b3IuSW50ZXJmYWNlLmhhc093blByb3BlcnR5KHByb3ApICYmIHNob3VsZEJlUmVsZWFzZWRQcm9wZXJ0aWVzLmluZGV4T2YocHJvcCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhkaWRXYXJuRm9yQWRkZWROZXdQcm9wZXJ0eSB8fCB0YXJnZXQuaXNQZXJzaXN0ZW50KCksICdUaGlzIHN5bnRoZXRpYyBldmVudCBpcyByZXVzZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIElmIHlvdVxcJ3JlICcgKyAnc2VlaW5nIHRoaXMsIHlvdVxcJ3JlIGFkZGluZyBhIG5ldyBwcm9wZXJ0eSBpbiB0aGUgc3ludGhldGljIGV2ZW50IG9iamVjdC4gJyArICdUaGUgcHJvcGVydHkgaXMgbmV2ZXIgcmVsZWFzZWQuIFNlZSAnICsgJ2h0dHBzOi8vZmIubWUvcmVhY3QtZXZlbnQtcG9vbGluZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgZGlkV2FybkZvckFkZGVkTmV3UHJvcGVydHkgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8qZXNsaW50LWVuYWJsZSBuby1mdW5jLWFzc2lnbiAqL1xuICB9XG59XG4vKipcbiAqIEhlbHBlciB0byByZWR1Y2UgYm9pbGVycGxhdGUgd2hlbiBjcmVhdGluZyBzdWJjbGFzc2VzLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IENsYXNzXG4gKiBAcGFyYW0gez9vYmplY3R9IEludGVyZmFjZVxuICovXG5TeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MgPSBmdW5jdGlvbiAoQ2xhc3MsIEludGVyZmFjZSkge1xuICB2YXIgU3VwZXIgPSB0aGlzO1xuXG4gIHZhciBFID0gZnVuY3Rpb24gKCkge307XG4gIEUucHJvdG90eXBlID0gU3VwZXIucHJvdG90eXBlO1xuICB2YXIgcHJvdG90eXBlID0gbmV3IEUoKTtcblxuICBfYXNzaWduKHByb3RvdHlwZSwgQ2xhc3MucHJvdG90eXBlKTtcbiAgQ2xhc3MucHJvdG90eXBlID0gcHJvdG90eXBlO1xuICBDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDbGFzcztcblxuICBDbGFzcy5JbnRlcmZhY2UgPSBfYXNzaWduKHt9LCBTdXBlci5JbnRlcmZhY2UsIEludGVyZmFjZSk7XG4gIENsYXNzLmF1Z21lbnRDbGFzcyA9IFN1cGVyLmF1Z21lbnRDbGFzcztcblxuICBQb29sZWRDbGFzcy5hZGRQb29saW5nVG8oQ2xhc3MsIFBvb2xlZENsYXNzLmZvdXJBcmd1bWVudFBvb2xlcik7XG59O1xuXG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oU3ludGhldGljRXZlbnQsIFBvb2xlZENsYXNzLmZvdXJBcmd1bWVudFBvb2xlcik7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljRXZlbnQ7XG5cbi8qKlxuICAqIEhlbHBlciB0byBudWxsaWZ5IHN5bnRoZXRpY0V2ZW50IGluc3RhbmNlIHByb3BlcnRpZXMgd2hlbiBkZXN0cnVjdGluZ1xuICAqXG4gICogQHBhcmFtIHtvYmplY3R9IFN5bnRoZXRpY0V2ZW50XG4gICogQHBhcmFtIHtTdHJpbmd9IHByb3BOYW1lXG4gICogQHJldHVybiB7b2JqZWN0fSBkZWZpbmVQcm9wZXJ0eSBvYmplY3RcbiAgKi9cbmZ1bmN0aW9uIGdldFBvb2xlZFdhcm5pbmdQcm9wZXJ0eURlZmluaXRpb24ocHJvcE5hbWUsIGdldFZhbCkge1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBnZXRWYWwgPT09ICdmdW5jdGlvbic7XG4gIHJldHVybiB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHNldDogc2V0LFxuICAgIGdldDogZ2V0XG4gIH07XG5cbiAgZnVuY3Rpb24gc2V0KHZhbCkge1xuICAgIHZhciBhY3Rpb24gPSBpc0Z1bmN0aW9uID8gJ3NldHRpbmcgdGhlIG1ldGhvZCcgOiAnc2V0dGluZyB0aGUgcHJvcGVydHknO1xuICAgIHdhcm4oYWN0aW9uLCAnVGhpcyBpcyBlZmZlY3RpdmVseSBhIG5vLW9wJyk7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldCgpIHtcbiAgICB2YXIgYWN0aW9uID0gaXNGdW5jdGlvbiA/ICdhY2Nlc3NpbmcgdGhlIG1ldGhvZCcgOiAnYWNjZXNzaW5nIHRoZSBwcm9wZXJ0eSc7XG4gICAgdmFyIHJlc3VsdCA9IGlzRnVuY3Rpb24gPyAnVGhpcyBpcyBhIG5vLW9wIGZ1bmN0aW9uJyA6ICdUaGlzIGlzIHNldCB0byBudWxsJztcbiAgICB3YXJuKGFjdGlvbiwgcmVzdWx0KTtcbiAgICByZXR1cm4gZ2V0VmFsO1xuICB9XG5cbiAgZnVuY3Rpb24gd2FybihhY3Rpb24sIHJlc3VsdCkge1xuICAgIHZhciB3YXJuaW5nQ29uZGl0aW9uID0gZmFsc2U7XG4gICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHdhcm5pbmdDb25kaXRpb24sICdUaGlzIHN5bnRoZXRpYyBldmVudCBpcyByZXVzZWQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIElmIHlvdVxcJ3JlIHNlZWluZyB0aGlzLCAnICsgJ3lvdVxcJ3JlICVzIGAlc2Agb24gYSByZWxlYXNlZC9udWxsaWZpZWQgc3ludGhldGljIGV2ZW50LiAlcy4gJyArICdJZiB5b3UgbXVzdCBrZWVwIHRoZSBvcmlnaW5hbCBzeW50aGV0aWMgZXZlbnQgYXJvdW5kLCB1c2UgZXZlbnQucGVyc2lzdCgpLiAnICsgJ1NlZSBodHRwczovL2ZiLm1lL3JlYWN0LWV2ZW50LXBvb2xpbmcgZm9yIG1vcmUgaW5mb3JtYXRpb24uJywgYWN0aW9uLCBwcm9wTmFtZSwgcmVzdWx0KSA6IHZvaWQgMDtcbiAgfVxufSIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBTeW50aGV0aWNVSUV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNVSUV2ZW50Jyk7XG5cbi8qKlxuICogQGludGVyZmFjZSBGb2N1c0V2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xudmFyIEZvY3VzRXZlbnRJbnRlcmZhY2UgPSB7XG4gIHJlbGF0ZWRUYXJnZXQ6IG51bGxcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9XG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY0ZvY3VzRXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY1VJRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cblN5bnRoZXRpY1VJRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY0ZvY3VzRXZlbnQsIEZvY3VzRXZlbnRJbnRlcmZhY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY0ZvY3VzRXZlbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY0V2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNFdmVudCcpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAxMzExMDVcbiAqICAgICAgLyNldmVudHMtaW5wdXRldmVudHNcbiAqL1xudmFyIElucHV0RXZlbnRJbnRlcmZhY2UgPSB7XG4gIGRhdGE6IG51bGxcbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY1VJRXZlbnR9XG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY0lucHV0RXZlbnQoZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpIHtcbiAgcmV0dXJuIFN5bnRoZXRpY0V2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljSW5wdXRFdmVudCwgSW5wdXRFdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljSW5wdXRFdmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3ludGhldGljVUlFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljVUlFdmVudCcpO1xuXG52YXIgZ2V0RXZlbnRDaGFyQ29kZSA9IHJlcXVpcmUoJy4vZ2V0RXZlbnRDaGFyQ29kZScpO1xudmFyIGdldEV2ZW50S2V5ID0gcmVxdWlyZSgnLi9nZXRFdmVudEtleScpO1xudmFyIGdldEV2ZW50TW9kaWZpZXJTdGF0ZSA9IHJlcXVpcmUoJy4vZ2V0RXZlbnRNb2RpZmllclN0YXRlJyk7XG5cbi8qKlxuICogQGludGVyZmFjZSBLZXlib2FyZEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy9cbiAqL1xudmFyIEtleWJvYXJkRXZlbnRJbnRlcmZhY2UgPSB7XG4gIGtleTogZ2V0RXZlbnRLZXksXG4gIGxvY2F0aW9uOiBudWxsLFxuICBjdHJsS2V5OiBudWxsLFxuICBzaGlmdEtleTogbnVsbCxcbiAgYWx0S2V5OiBudWxsLFxuICBtZXRhS2V5OiBudWxsLFxuICByZXBlYXQ6IG51bGwsXG4gIGxvY2FsZTogbnVsbCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlLFxuICAvLyBMZWdhY3kgSW50ZXJmYWNlXG4gIGNoYXJDb2RlOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBgY2hhckNvZGVgIGlzIHRoZSByZXN1bHQgb2YgYSBLZXlQcmVzcyBldmVudCBhbmQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2ZcbiAgICAvLyB0aGUgYWN0dWFsIHByaW50YWJsZSBjaGFyYWN0ZXIuXG5cbiAgICAvLyBLZXlQcmVzcyBpcyBkZXByZWNhdGVkLCBidXQgaXRzIHJlcGxhY2VtZW50IGlzIG5vdCB5ZXQgZmluYWwgYW5kIG5vdFxuICAgIC8vIGltcGxlbWVudGVkIGluIGFueSBtYWpvciBicm93c2VyLiBPbmx5IEtleVByZXNzIGhhcyBjaGFyQ29kZS5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgcmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfSxcbiAga2V5Q29kZTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYGtleUNvZGVgIGlzIHRoZSByZXN1bHQgb2YgYSBLZXlEb3duL1VwIGV2ZW50IGFuZCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZlxuICAgIC8vIHBoeXNpY2FsIGtleWJvYXJkIGtleS5cblxuICAgIC8vIFRoZSBhY3R1YWwgbWVhbmluZyBvZiB0aGUgdmFsdWUgZGVwZW5kcyBvbiB0aGUgdXNlcnMnIGtleWJvYXJkIGxheW91dFxuICAgIC8vIHdoaWNoIGNhbm5vdCBiZSBkZXRlY3RlZC4gQXNzdW1pbmcgdGhhdCBpdCBpcyBhIFVTIGtleWJvYXJkIGxheW91dFxuICAgIC8vIHByb3ZpZGVzIGEgc3VycHJpc2luZ2x5IGFjY3VyYXRlIG1hcHBpbmcgZm9yIFVTIGFuZCBFdXJvcGVhbiB1c2Vycy5cbiAgICAvLyBEdWUgdG8gdGhpcywgaXQgaXMgbGVmdCB0byB0aGUgdXNlciB0byBpbXBsZW1lbnQgYXQgdGhpcyB0aW1lLlxuICAgIGlmIChldmVudC50eXBlID09PSAna2V5ZG93bicgfHwgZXZlbnQudHlwZSA9PT0gJ2tleXVwJykge1xuICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGU7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9LFxuICB3aGljaDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gYHdoaWNoYCBpcyBhbiBhbGlhcyBmb3IgZWl0aGVyIGBrZXlDb2RlYCBvciBgY2hhckNvZGVgIGRlcGVuZGluZyBvbiB0aGVcbiAgICAvLyB0eXBlIG9mIHRoZSBldmVudC5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgICAgcmV0dXJuIGdldEV2ZW50Q2hhckNvZGUoZXZlbnQpO1xuICAgIH1cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IGV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAgIHJldHVybiBldmVudC5rZXlDb2RlO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAZXh0ZW5kcyB7U3ludGhldGljVUlFdmVudH1cbiAqL1xuZnVuY3Rpb24gU3ludGhldGljS2V5Ym9hcmRFdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICByZXR1cm4gU3ludGhldGljVUlFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuU3ludGhldGljVUlFdmVudC5hdWdtZW50Q2xhc3MoU3ludGhldGljS2V5Ym9hcmRFdmVudCwgS2V5Ym9hcmRFdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljS2V5Ym9hcmRFdmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3ludGhldGljVUlFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljVUlFdmVudCcpO1xudmFyIFZpZXdwb3J0TWV0cmljcyA9IHJlcXVpcmUoJy4vVmlld3BvcnRNZXRyaWNzJyk7XG5cbnZhciBnZXRFdmVudE1vZGlmaWVyU3RhdGUgPSByZXF1aXJlKCcuL2dldEV2ZW50TW9kaWZpZXJTdGF0ZScpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgTW91c2VFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cbnZhciBNb3VzZUV2ZW50SW50ZXJmYWNlID0ge1xuICBzY3JlZW5YOiBudWxsLFxuICBzY3JlZW5ZOiBudWxsLFxuICBjbGllbnRYOiBudWxsLFxuICBjbGllbnRZOiBudWxsLFxuICBjdHJsS2V5OiBudWxsLFxuICBzaGlmdEtleTogbnVsbCxcbiAgYWx0S2V5OiBudWxsLFxuICBtZXRhS2V5OiBudWxsLFxuICBnZXRNb2RpZmllclN0YXRlOiBnZXRFdmVudE1vZGlmaWVyU3RhdGUsXG4gIGJ1dHRvbjogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gV2Via2l0LCBGaXJlZm94LCBJRTkrXG4gICAgLy8gd2hpY2g6ICAxIDIgM1xuICAgIC8vIGJ1dHRvbjogMCAxIDIgKHN0YW5kYXJkKVxuICAgIHZhciBidXR0b24gPSBldmVudC5idXR0b247XG4gICAgaWYgKCd3aGljaCcgaW4gZXZlbnQpIHtcbiAgICAgIHJldHVybiBidXR0b247XG4gICAgfVxuICAgIC8vIElFPDlcbiAgICAvLyB3aGljaDogIHVuZGVmaW5lZFxuICAgIC8vIGJ1dHRvbjogMCAwIDBcbiAgICAvLyBidXR0b246IDEgNCAyIChvbm1vdXNldXApXG4gICAgcmV0dXJuIGJ1dHRvbiA9PT0gMiA/IDIgOiBidXR0b24gPT09IDQgPyAxIDogMDtcbiAgfSxcbiAgYnV0dG9uczogbnVsbCxcbiAgcmVsYXRlZFRhcmdldDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIGV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgKGV2ZW50LmZyb21FbGVtZW50ID09PSBldmVudC5zcmNFbGVtZW50ID8gZXZlbnQudG9FbGVtZW50IDogZXZlbnQuZnJvbUVsZW1lbnQpO1xuICB9LFxuICAvLyBcIlByb3ByaWV0YXJ5XCIgSW50ZXJmYWNlLlxuICBwYWdlWDogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdwYWdlWCcgaW4gZXZlbnQgPyBldmVudC5wYWdlWCA6IGV2ZW50LmNsaWVudFggKyBWaWV3cG9ydE1ldHJpY3MuY3VycmVudFNjcm9sbExlZnQ7XG4gIH0sXG4gIHBhZ2VZOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ3BhZ2VZJyBpbiBldmVudCA/IGV2ZW50LnBhZ2VZIDogZXZlbnQuY2xpZW50WSArIFZpZXdwb3J0TWV0cmljcy5jdXJyZW50U2Nyb2xsVG9wO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNVSUV2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNNb3VzZUV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNVSUV2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNVSUV2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNNb3VzZUV2ZW50LCBNb3VzZUV2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNNb3VzZUV2ZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBTeW50aGV0aWNVSUV2ZW50ID0gcmVxdWlyZSgnLi9TeW50aGV0aWNVSUV2ZW50Jyk7XG5cbnZhciBnZXRFdmVudE1vZGlmaWVyU3RhdGUgPSByZXF1aXJlKCcuL2dldEV2ZW50TW9kaWZpZXJTdGF0ZScpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgVG91Y2hFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi90b3VjaC1ldmVudHMvXG4gKi9cbnZhciBUb3VjaEV2ZW50SW50ZXJmYWNlID0ge1xuICB0b3VjaGVzOiBudWxsLFxuICB0YXJnZXRUb3VjaGVzOiBudWxsLFxuICBjaGFuZ2VkVG91Y2hlczogbnVsbCxcbiAgYWx0S2V5OiBudWxsLFxuICBtZXRhS2V5OiBudWxsLFxuICBjdHJsS2V5OiBudWxsLFxuICBzaGlmdEtleTogbnVsbCxcbiAgZ2V0TW9kaWZpZXJTdGF0ZTogZ2V0RXZlbnRNb2RpZmllclN0YXRlXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNVSUV2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNUb3VjaEV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNVSUV2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNVSUV2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNUb3VjaEV2ZW50LCBUb3VjaEV2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNUb3VjaEV2ZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBTeW50aGV0aWNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRXZlbnQnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIEV2ZW50XG4gKiBAc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDkvV0QtY3NzMy10cmFuc2l0aW9ucy0yMDA5MDMyMC8jdHJhbnNpdGlvbi1ldmVudHMtXG4gKiBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9UcmFuc2l0aW9uRXZlbnRcbiAqL1xudmFyIFRyYW5zaXRpb25FdmVudEludGVyZmFjZSA9IHtcbiAgcHJvcGVydHlOYW1lOiBudWxsLFxuICBlbGFwc2VkVGltZTogbnVsbCxcbiAgcHNldWRvRWxlbWVudDogbnVsbFxufTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZGlzcGF0Y2hDb25maWcgQ29uZmlndXJhdGlvbiB1c2VkIHRvIGRpc3BhdGNoIHRoaXMgZXZlbnQuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlzcGF0Y2hNYXJrZXIgTWFya2VyIGlkZW50aWZ5aW5nIHRoZSBldmVudCB0YXJnZXQuXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAZXh0ZW5kcyB7U3ludGhldGljRXZlbnR9XG4gKi9cbmZ1bmN0aW9uIFN5bnRoZXRpY1RyYW5zaXRpb25FdmVudChkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCkge1xuICByZXR1cm4gU3ludGhldGljRXZlbnQuY2FsbCh0aGlzLCBkaXNwYXRjaENvbmZpZywgZGlzcGF0Y2hNYXJrZXIsIG5hdGl2ZUV2ZW50LCBuYXRpdmVFdmVudFRhcmdldCk7XG59XG5cblN5bnRoZXRpY0V2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNUcmFuc2l0aW9uRXZlbnQsIFRyYW5zaXRpb25FdmVudEludGVyZmFjZSk7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ludGhldGljVHJhbnNpdGlvbkV2ZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBTeW50aGV0aWNFdmVudCA9IHJlcXVpcmUoJy4vU3ludGhldGljRXZlbnQnKTtcblxudmFyIGdldEV2ZW50VGFyZ2V0ID0gcmVxdWlyZSgnLi9nZXRFdmVudFRhcmdldCcpO1xuXG4vKipcbiAqIEBpbnRlcmZhY2UgVUlFdmVudFxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvXG4gKi9cbnZhciBVSUV2ZW50SW50ZXJmYWNlID0ge1xuICB2aWV3OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudmlldykge1xuICAgICAgcmV0dXJuIGV2ZW50LnZpZXc7XG4gICAgfVxuXG4gICAgdmFyIHRhcmdldCA9IGdldEV2ZW50VGFyZ2V0KGV2ZW50KTtcbiAgICBpZiAodGFyZ2V0LndpbmRvdyA9PT0gdGFyZ2V0KSB7XG4gICAgICAvLyB0YXJnZXQgaXMgYSB3aW5kb3cgb2JqZWN0XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cblxuICAgIHZhciBkb2MgPSB0YXJnZXQub3duZXJEb2N1bWVudDtcbiAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSBgb3duZXJEb2N1bWVudGAgaXMgc29tZXRpbWVzIHVuZGVmaW5lZCBpbiBJRTguXG4gICAgaWYgKGRvYykge1xuICAgICAgcmV0dXJuIGRvYy5kZWZhdWx0VmlldyB8fCBkb2MucGFyZW50V2luZG93O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gd2luZG93O1xuICAgIH1cbiAgfSxcbiAgZGV0YWlsOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gZXZlbnQuZGV0YWlsIHx8IDA7XG4gIH1cbn07XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGRpc3BhdGNoQ29uZmlnIENvbmZpZ3VyYXRpb24gdXNlZCB0byBkaXNwYXRjaCB0aGlzIGV2ZW50LlxuICogQHBhcmFtIHtzdHJpbmd9IGRpc3BhdGNoTWFya2VyIE1hcmtlciBpZGVudGlmeWluZyB0aGUgZXZlbnQgdGFyZ2V0LlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQGV4dGVuZHMge1N5bnRoZXRpY0V2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNVSUV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNFdmVudC5jYWxsKHRoaXMsIGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KTtcbn1cblxuU3ludGhldGljRXZlbnQuYXVnbWVudENsYXNzKFN5bnRoZXRpY1VJRXZlbnQsIFVJRXZlbnRJbnRlcmZhY2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bnRoZXRpY1VJRXZlbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFN5bnRoZXRpY01vdXNlRXZlbnQgPSByZXF1aXJlKCcuL1N5bnRoZXRpY01vdXNlRXZlbnQnKTtcblxuLyoqXG4gKiBAaW50ZXJmYWNlIFdoZWVsRXZlbnRcbiAqIEBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzL1xuICovXG52YXIgV2hlZWxFdmVudEludGVyZmFjZSA9IHtcbiAgZGVsdGFYOiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gJ2RlbHRhWCcgaW4gZXZlbnQgPyBldmVudC5kZWx0YVggOlxuICAgIC8vIEZhbGxiYWNrIHRvIGB3aGVlbERlbHRhWGAgZm9yIFdlYmtpdCBhbmQgbm9ybWFsaXplIChyaWdodCBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGFYJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhWCA6IDA7XG4gIH0sXG4gIGRlbHRhWTogZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuICdkZWx0YVknIGluIGV2ZW50ID8gZXZlbnQuZGVsdGFZIDpcbiAgICAvLyBGYWxsYmFjayB0byBgd2hlZWxEZWx0YVlgIGZvciBXZWJraXQgYW5kIG5vcm1hbGl6ZSAoZG93biBpcyBwb3NpdGl2ZSkuXG4gICAgJ3doZWVsRGVsdGFZJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhWSA6XG4gICAgLy8gRmFsbGJhY2sgdG8gYHdoZWVsRGVsdGFgIGZvciBJRTw5IGFuZCBub3JtYWxpemUgKGRvd24gaXMgcG9zaXRpdmUpLlxuICAgICd3aGVlbERlbHRhJyBpbiBldmVudCA/IC1ldmVudC53aGVlbERlbHRhIDogMDtcbiAgfSxcbiAgZGVsdGFaOiBudWxsLFxuXG4gIC8vIEJyb3dzZXJzIHdpdGhvdXQgXCJkZWx0YU1vZGVcIiBpcyByZXBvcnRpbmcgaW4gcmF3IHdoZWVsIGRlbHRhIHdoZXJlIG9uZVxuICAvLyBub3RjaCBvbiB0aGUgc2Nyb2xsIGlzIGFsd2F5cyArLy0gMTIwLCByb3VnaGx5IGVxdWl2YWxlbnQgdG8gcGl4ZWxzLlxuICAvLyBBIGdvb2QgYXBwcm94aW1hdGlvbiBvZiBET01fREVMVEFfTElORSAoMSkgaXMgNSUgb2Ygdmlld3BvcnQgc2l6ZSBvclxuICAvLyB+NDAgcGl4ZWxzLCBmb3IgRE9NX0RFTFRBX1NDUkVFTiAoMikgaXQgaXMgODcuNSUgb2Ygdmlld3BvcnQgc2l6ZS5cbiAgZGVsdGFNb2RlOiBudWxsXG59O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBkaXNwYXRjaENvbmZpZyBDb25maWd1cmF0aW9uIHVzZWQgdG8gZGlzcGF0Y2ggdGhpcyBldmVudC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXNwYXRjaE1hcmtlciBNYXJrZXIgaWRlbnRpZnlpbmcgdGhlIGV2ZW50IHRhcmdldC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEBleHRlbmRzIHtTeW50aGV0aWNNb3VzZUV2ZW50fVxuICovXG5mdW5jdGlvbiBTeW50aGV0aWNXaGVlbEV2ZW50KGRpc3BhdGNoQ29uZmlnLCBkaXNwYXRjaE1hcmtlciwgbmF0aXZlRXZlbnQsIG5hdGl2ZUV2ZW50VGFyZ2V0KSB7XG4gIHJldHVybiBTeW50aGV0aWNNb3VzZUV2ZW50LmNhbGwodGhpcywgZGlzcGF0Y2hDb25maWcsIGRpc3BhdGNoTWFya2VyLCBuYXRpdmVFdmVudCwgbmF0aXZlRXZlbnRUYXJnZXQpO1xufVxuXG5TeW50aGV0aWNNb3VzZUV2ZW50LmF1Z21lbnRDbGFzcyhTeW50aGV0aWNXaGVlbEV2ZW50LCBXaGVlbEV2ZW50SW50ZXJmYWNlKTtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW50aGV0aWNXaGVlbEV2ZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG52YXIgT0JTRVJWRURfRVJST1IgPSB7fTtcblxuLyoqXG4gKiBgVHJhbnNhY3Rpb25gIGNyZWF0ZXMgYSBibGFjayBib3ggdGhhdCBpcyBhYmxlIHRvIHdyYXAgYW55IG1ldGhvZCBzdWNoIHRoYXRcbiAqIGNlcnRhaW4gaW52YXJpYW50cyBhcmUgbWFpbnRhaW5lZCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBtZXRob2QgaXMgaW52b2tlZFxuICogKEV2ZW4gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biB3aGlsZSBpbnZva2luZyB0aGUgd3JhcHBlZCBtZXRob2QpLiBXaG9ldmVyXG4gKiBpbnN0YW50aWF0ZXMgYSB0cmFuc2FjdGlvbiBjYW4gcHJvdmlkZSBlbmZvcmNlcnMgb2YgdGhlIGludmFyaWFudHMgYXRcbiAqIGNyZWF0aW9uIHRpbWUuIFRoZSBgVHJhbnNhY3Rpb25gIGNsYXNzIGl0c2VsZiB3aWxsIHN1cHBseSBvbmUgYWRkaXRpb25hbFxuICogYXV0b21hdGljIGludmFyaWFudCBmb3IgeW91IC0gdGhlIGludmFyaWFudCB0aGF0IGFueSB0cmFuc2FjdGlvbiBpbnN0YW5jZVxuICogc2hvdWxkIG5vdCBiZSBydW4gd2hpbGUgaXQgaXMgYWxyZWFkeSBiZWluZyBydW4uIFlvdSB3b3VsZCB0eXBpY2FsbHkgY3JlYXRlIGFcbiAqIHNpbmdsZSBpbnN0YW5jZSBvZiBhIGBUcmFuc2FjdGlvbmAgZm9yIHJldXNlIG11bHRpcGxlIHRpbWVzLCB0aGF0IHBvdGVudGlhbGx5XG4gKiBpcyB1c2VkIHRvIHdyYXAgc2V2ZXJhbCBkaWZmZXJlbnQgbWV0aG9kcy4gV3JhcHBlcnMgYXJlIGV4dHJlbWVseSBzaW1wbGUgLVxuICogdGhleSBvbmx5IHJlcXVpcmUgaW1wbGVtZW50aW5nIHR3byBtZXRob2RzLlxuICpcbiAqIDxwcmU+XG4gKiAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlcnMgKGluamVjdGVkIGF0IGNyZWF0aW9uIHRpbWUpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAgICAgICAgK1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS0tLS0tLS0rXG4gKiAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgdiAgICAgICAgfCAgICAgICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgIHwgICAgICArLS0tLS0tLS0tLS0tLS0tKyAgIHwgICAgICAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICB8ICAgKy0tfCAgICB3cmFwcGVyMSAgIHwtLS18LS0tLSsgICAgICAgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgfCAgIHwgICstLS0tLS0tLS0tLS0tLS0rICAgdiAgICB8ICAgICAgICAgfFxuICogICAgICAgICAgICAgICAgICAgIHwgICB8ICAgICAgICAgICstLS0tLS0tLS0tLS0tKyAgfCAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICB8ICAgfCAgICAgKy0tLS18ICAgd3JhcHBlcjIgIHwtLS0tLS0tLSsgICB8XG4gKiAgICAgICAgICAgICAgICAgICAgfCAgIHwgICAgIHwgICAgKy0tLS0tLS0tLS0tLS0rICB8ICAgICB8ICAgfFxuICogICAgICAgICAgICAgICAgICAgIHwgICB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgICAgfCAgIHxcbiAqICAgICAgICAgICAgICAgICAgICB8ICAgdiAgICAgdiAgICAgICAgICAgICAgICAgICAgIHYgICAgIHYgICB8IHdyYXBwZXJcbiAqICAgICAgICAgICAgICAgICAgICB8ICstLS0rICstLS0rICAgKy0tLS0tLS0tLSsgICArLS0tKyArLS0tKyB8IGludmFyaWFudHNcbiAqIHBlcmZvcm0oYW55TWV0aG9kKSB8IHwgICB8IHwgICB8ICAgfCAgICAgICAgIHwgICB8ICAgfCB8ICAgfCB8IG1haW50YWluZWRcbiAqICstLS0tLS0tLS0tLS0tLS0tLT58LXwtLS18LXwtLS18LS0+fGFueU1ldGhvZHwtLS18LS0tfC18LS0tfC18LS0tLS0tLS0+XG4gKiAgICAgICAgICAgICAgICAgICAgfCB8ICAgfCB8ICAgfCAgIHwgICAgICAgICB8ICAgfCAgIHwgfCAgIHwgfFxuICogICAgICAgICAgICAgICAgICAgIHwgfCAgIHwgfCAgIHwgICB8ICAgICAgICAgfCAgIHwgICB8IHwgICB8IHxcbiAqICAgICAgICAgICAgICAgICAgICB8IHwgICB8IHwgICB8ICAgfCAgICAgICAgIHwgICB8ICAgfCB8ICAgfCB8XG4gKiAgICAgICAgICAgICAgICAgICAgfCArLS0tKyArLS0tKyAgICstLS0tLS0tLS0rICAgKy0tLSsgKy0tLSsgfFxuICogICAgICAgICAgICAgICAgICAgIHwgIGluaXRpYWxpemUgICAgICAgICAgICAgICAgICAgIGNsb3NlICAgIHxcbiAqICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gKiA8L3ByZT5cbiAqXG4gKiBVc2UgY2FzZXM6XG4gKiAtIFByZXNlcnZpbmcgdGhlIGlucHV0IHNlbGVjdGlvbiByYW5nZXMgYmVmb3JlL2FmdGVyIHJlY29uY2lsaWF0aW9uLlxuICogICBSZXN0b3Jpbmcgc2VsZWN0aW9uIGV2ZW4gaW4gdGhlIGV2ZW50IG9mIGFuIHVuZXhwZWN0ZWQgZXJyb3IuXG4gKiAtIERlYWN0aXZhdGluZyBldmVudHMgd2hpbGUgcmVhcnJhbmdpbmcgdGhlIERPTSwgcHJldmVudGluZyBibHVycy9mb2N1c2VzLFxuICogICB3aGlsZSBndWFyYW50ZWVpbmcgdGhhdCBhZnRlcndhcmRzLCB0aGUgZXZlbnQgc3lzdGVtIGlzIHJlYWN0aXZhdGVkLlxuICogLSBGbHVzaGluZyBhIHF1ZXVlIG9mIGNvbGxlY3RlZCBET00gbXV0YXRpb25zIHRvIHRoZSBtYWluIFVJIHRocmVhZCBhZnRlciBhXG4gKiAgIHJlY29uY2lsaWF0aW9uIHRha2VzIHBsYWNlIGluIGEgd29ya2VyIHRocmVhZC5cbiAqIC0gSW52b2tpbmcgYW55IGNvbGxlY3RlZCBgY29tcG9uZW50RGlkVXBkYXRlYCBjYWxsYmFja3MgYWZ0ZXIgcmVuZGVyaW5nIG5ld1xuICogICBjb250ZW50LlxuICogLSAoRnV0dXJlIHVzZSBjYXNlKTogV3JhcHBpbmcgcGFydGljdWxhciBmbHVzaGVzIG9mIHRoZSBgUmVhY3RXb3JrZXJgIHF1ZXVlXG4gKiAgIHRvIHByZXNlcnZlIHRoZSBgc2Nyb2xsVG9wYCAoYW4gYXV0b21hdGljIHNjcm9sbCBhd2FyZSBET00pLlxuICogLSAoRnV0dXJlIHVzZSBjYXNlKTogTGF5b3V0IGNhbGN1bGF0aW9ucyBiZWZvcmUgYW5kIGFmdGVyIERPTSB1cGRhdGVzLlxuICpcbiAqIFRyYW5zYWN0aW9uYWwgcGx1Z2luIEFQSTpcbiAqIC0gQSBtb2R1bGUgdGhhdCBoYXMgYW4gYGluaXRpYWxpemVgIG1ldGhvZCB0aGF0IHJldHVybnMgYW55IHByZWNvbXB1dGF0aW9uLlxuICogLSBhbmQgYSBgY2xvc2VgIG1ldGhvZCB0aGF0IGFjY2VwdHMgdGhlIHByZWNvbXB1dGF0aW9uLiBgY2xvc2VgIGlzIGludm9rZWRcbiAqICAgd2hlbiB0aGUgd3JhcHBlZCBwcm9jZXNzIGlzIGNvbXBsZXRlZCwgb3IgaGFzIGZhaWxlZC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PFRyYW5zYWN0aW9uYWxXcmFwcGVyPn0gdHJhbnNhY3Rpb25XcmFwcGVyIFdyYXBwZXIgbW9kdWxlc1xuICogdGhhdCBpbXBsZW1lbnQgYGluaXRpYWxpemVgIGFuZCBgY2xvc2VgLlxuICogQHJldHVybiB7VHJhbnNhY3Rpb259IFNpbmdsZSB0cmFuc2FjdGlvbiBmb3IgcmV1c2UgaW4gdGhyZWFkLlxuICpcbiAqIEBjbGFzcyBUcmFuc2FjdGlvblxuICovXG52YXIgVHJhbnNhY3Rpb25JbXBsID0ge1xuICAvKipcbiAgICogU2V0cyB1cCB0aGlzIGluc3RhbmNlIHNvIHRoYXQgaXQgaXMgcHJlcGFyZWQgZm9yIGNvbGxlY3RpbmcgbWV0cmljcy4gRG9lc1xuICAgKiBzbyBzdWNoIHRoYXQgdGhpcyBzZXR1cCBtZXRob2QgbWF5IGJlIHVzZWQgb24gYW4gaW5zdGFuY2UgdGhhdCBpcyBhbHJlYWR5XG4gICAqIGluaXRpYWxpemVkLCBpbiBhIHdheSB0aGF0IGRvZXMgbm90IGNvbnN1bWUgYWRkaXRpb25hbCBtZW1vcnkgdXBvbiByZXVzZS5cbiAgICogVGhhdCBjYW4gYmUgdXNlZnVsIGlmIHlvdSBkZWNpZGUgdG8gbWFrZSB5b3VyIHN1YmNsYXNzIG9mIHRoaXMgbWl4aW4gYVxuICAgKiBcIlBvb2xlZENsYXNzXCIuXG4gICAqL1xuICByZWluaXRpYWxpemVUcmFuc2FjdGlvbjogZnVuY3Rpb24gKCkge1xuICAgIHRoaXMudHJhbnNhY3Rpb25XcmFwcGVycyA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25XcmFwcGVycygpO1xuICAgIGlmICh0aGlzLndyYXBwZXJJbml0RGF0YSkge1xuICAgICAgdGhpcy53cmFwcGVySW5pdERhdGEubGVuZ3RoID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53cmFwcGVySW5pdERhdGEgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5faXNJblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gIH0sXG5cbiAgX2lzSW5UcmFuc2FjdGlvbjogZmFsc2UsXG5cbiAgLyoqXG4gICAqIEBhYnN0cmFjdFxuICAgKiBAcmV0dXJuIHtBcnJheTxUcmFuc2FjdGlvbldyYXBwZXI+fSBBcnJheSBvZiB0cmFuc2FjdGlvbiB3cmFwcGVycy5cbiAgICovXG4gIGdldFRyYW5zYWN0aW9uV3JhcHBlcnM6IG51bGwsXG5cbiAgaXNJblRyYW5zYWN0aW9uOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5faXNJblRyYW5zYWN0aW9uO1xuICB9LFxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyB0aGUgZnVuY3Rpb24gd2l0aGluIGEgc2FmZXR5IHdpbmRvdy4gVXNlIHRoaXMgZm9yIHRoZSB0b3AgbGV2ZWxcbiAgICogbWV0aG9kcyB0aGF0IHJlc3VsdCBpbiBsYXJnZSBhbW91bnRzIG9mIGNvbXB1dGF0aW9uL211dGF0aW9ucyB0aGF0IHdvdWxkXG4gICAqIG5lZWQgdG8gYmUgc2FmZXR5IGNoZWNrZWQuIFRoZSBvcHRpb25hbCBhcmd1bWVudHMgaGVscHMgcHJldmVudCB0aGUgbmVlZFxuICAgKiB0byBiaW5kIGluIG1hbnkgY2FzZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1ldGhvZCBNZW1iZXIgb2Ygc2NvcGUgdG8gY2FsbC5cbiAgICogQHBhcmFtIHtPYmplY3R9IHNjb3BlIFNjb3BlIHRvIGludm9rZSBmcm9tLlxuICAgKiBAcGFyYW0ge09iamVjdD89fSBhIEFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAgICogQHBhcmFtIHtPYmplY3Q/PX0gYiBBcmd1bWVudCB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gICAqIEBwYXJhbSB7T2JqZWN0Pz19IGMgQXJndW1lbnQgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICAgKiBAcGFyYW0ge09iamVjdD89fSBkIEFyZ3VtZW50IHRvIHBhc3MgdG8gdGhlIG1ldGhvZC5cbiAgICogQHBhcmFtIHtPYmplY3Q/PX0gZSBBcmd1bWVudCB0byBwYXNzIHRvIHRoZSBtZXRob2QuXG4gICAqIEBwYXJhbSB7T2JqZWN0Pz19IGYgQXJndW1lbnQgdG8gcGFzcyB0byB0aGUgbWV0aG9kLlxuICAgKlxuICAgKiBAcmV0dXJuIHsqfSBSZXR1cm4gdmFsdWUgZnJvbSBgbWV0aG9kYC5cbiAgICovXG4gIHBlcmZvcm06IGZ1bmN0aW9uIChtZXRob2QsIHNjb3BlLCBhLCBiLCBjLCBkLCBlLCBmKSB7XG4gICAgISF0aGlzLmlzSW5UcmFuc2FjdGlvbigpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdUcmFuc2FjdGlvbi5wZXJmb3JtKC4uLik6IENhbm5vdCBpbml0aWFsaXplIGEgdHJhbnNhY3Rpb24gd2hlbiB0aGVyZSBpcyBhbHJlYWR5IGFuIG91dHN0YW5kaW5nIHRyYW5zYWN0aW9uLicpIDogX3Byb2RJbnZhcmlhbnQoJzI3JykgOiB2b2lkIDA7XG4gICAgdmFyIGVycm9yVGhyb3duO1xuICAgIHZhciByZXQ7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2lzSW5UcmFuc2FjdGlvbiA9IHRydWU7XG4gICAgICAvLyBDYXRjaGluZyBlcnJvcnMgbWFrZXMgZGVidWdnaW5nIG1vcmUgZGlmZmljdWx0LCBzbyB3ZSBzdGFydCB3aXRoXG4gICAgICAvLyBlcnJvclRocm93biBzZXQgdG8gdHJ1ZSBiZWZvcmUgc2V0dGluZyBpdCB0byBmYWxzZSBhZnRlciBjYWxsaW5nXG4gICAgICAvLyBjbG9zZSAtLSBpZiBpdCdzIHN0aWxsIHNldCB0byB0cnVlIGluIHRoZSBmaW5hbGx5IGJsb2NrLCBpdCBtZWFuc1xuICAgICAgLy8gb25lIG9mIHRoZXNlIGNhbGxzIHRocmV3LlxuICAgICAgZXJyb3JUaHJvd24gPSB0cnVlO1xuICAgICAgdGhpcy5pbml0aWFsaXplQWxsKDApO1xuICAgICAgcmV0ID0gbWV0aG9kLmNhbGwoc2NvcGUsIGEsIGIsIGMsIGQsIGUsIGYpO1xuICAgICAgZXJyb3JUaHJvd24gPSBmYWxzZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKGVycm9yVGhyb3duKSB7XG4gICAgICAgICAgLy8gSWYgYG1ldGhvZGAgdGhyb3dzLCBwcmVmZXIgdG8gc2hvdyB0aGF0IHN0YWNrIHRyYWNlIG92ZXIgYW55IHRocm93blxuICAgICAgICAgIC8vIGJ5IGludm9raW5nIGBjbG9zZUFsbGAuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VBbGwoMCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7fVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFNpbmNlIGBtZXRob2RgIGRpZG4ndCB0aHJvdywgd2UgZG9uJ3Qgd2FudCB0byBzaWxlbmNlIHRoZSBleGNlcHRpb25cbiAgICAgICAgICAvLyBoZXJlLlxuICAgICAgICAgIHRoaXMuY2xvc2VBbGwoMCk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuX2lzSW5UcmFuc2FjdGlvbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9LFxuXG4gIGluaXRpYWxpemVBbGw6IGZ1bmN0aW9uIChzdGFydEluZGV4KSB7XG4gICAgdmFyIHRyYW5zYWN0aW9uV3JhcHBlcnMgPSB0aGlzLnRyYW5zYWN0aW9uV3JhcHBlcnM7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0SW5kZXg7IGkgPCB0cmFuc2FjdGlvbldyYXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgd3JhcHBlciA9IHRyYW5zYWN0aW9uV3JhcHBlcnNbaV07XG4gICAgICB0cnkge1xuICAgICAgICAvLyBDYXRjaGluZyBlcnJvcnMgbWFrZXMgZGVidWdnaW5nIG1vcmUgZGlmZmljdWx0LCBzbyB3ZSBzdGFydCB3aXRoIHRoZVxuICAgICAgICAvLyBPQlNFUlZFRF9FUlJPUiBzdGF0ZSBiZWZvcmUgb3ZlcndyaXRpbmcgaXQgd2l0aCB0aGUgcmVhbCByZXR1cm4gdmFsdWVcbiAgICAgICAgLy8gb2YgaW5pdGlhbGl6ZSAtLSBpZiBpdCdzIHN0aWxsIHNldCB0byBPQlNFUlZFRF9FUlJPUiBpbiB0aGUgZmluYWxseVxuICAgICAgICAvLyBibG9jaywgaXQgbWVhbnMgd3JhcHBlci5pbml0aWFsaXplIHRocmV3LlxuICAgICAgICB0aGlzLndyYXBwZXJJbml0RGF0YVtpXSA9IE9CU0VSVkVEX0VSUk9SO1xuICAgICAgICB0aGlzLndyYXBwZXJJbml0RGF0YVtpXSA9IHdyYXBwZXIuaW5pdGlhbGl6ZSA/IHdyYXBwZXIuaW5pdGlhbGl6ZS5jYWxsKHRoaXMpIDogbnVsbDtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmICh0aGlzLndyYXBwZXJJbml0RGF0YVtpXSA9PT0gT0JTRVJWRURfRVJST1IpIHtcbiAgICAgICAgICAvLyBUaGUgaW5pdGlhbGl6ZXIgZm9yIHdyYXBwZXIgaSB0aHJldyBhbiBlcnJvcjsgaW5pdGlhbGl6ZSB0aGVcbiAgICAgICAgICAvLyByZW1haW5pbmcgd3JhcHBlcnMgYnV0IHNpbGVuY2UgYW55IGV4Y2VwdGlvbnMgZnJvbSB0aGVtIHRvIGVuc3VyZVxuICAgICAgICAgIC8vIHRoYXQgdGhlIGZpcnN0IGVycm9yIGlzIHRoZSBvbmUgdG8gYnViYmxlIHVwLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxpemVBbGwoaSArIDEpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge31cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSxcblxuICAvKipcbiAgICogSW52b2tlcyBlYWNoIG9mIGB0aGlzLnRyYW5zYWN0aW9uV3JhcHBlcnMuY2xvc2VbaV1gIGZ1bmN0aW9ucywgcGFzc2luZyBpbnRvXG4gICAqIHRoZW0gdGhlIHJlc3BlY3RpdmUgcmV0dXJuIHZhbHVlcyBvZiBgdGhpcy50cmFuc2FjdGlvbldyYXBwZXJzLmluaXRbaV1gXG4gICAqIChgY2xvc2VgcnMgdGhhdCBjb3JyZXNwb25kIHRvIGluaXRpYWxpemVycyB0aGF0IGZhaWxlZCB3aWxsIG5vdCBiZVxuICAgKiBpbnZva2VkKS5cbiAgICovXG4gIGNsb3NlQWxsOiBmdW5jdGlvbiAoc3RhcnRJbmRleCkge1xuICAgICF0aGlzLmlzSW5UcmFuc2FjdGlvbigpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdUcmFuc2FjdGlvbi5jbG9zZUFsbCgpOiBDYW5ub3QgY2xvc2UgdHJhbnNhY3Rpb24gd2hlbiBub25lIGFyZSBvcGVuLicpIDogX3Byb2RJbnZhcmlhbnQoJzI4JykgOiB2b2lkIDA7XG4gICAgdmFyIHRyYW5zYWN0aW9uV3JhcHBlcnMgPSB0aGlzLnRyYW5zYWN0aW9uV3JhcHBlcnM7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0SW5kZXg7IGkgPCB0cmFuc2FjdGlvbldyYXBwZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgd3JhcHBlciA9IHRyYW5zYWN0aW9uV3JhcHBlcnNbaV07XG4gICAgICB2YXIgaW5pdERhdGEgPSB0aGlzLndyYXBwZXJJbml0RGF0YVtpXTtcbiAgICAgIHZhciBlcnJvclRocm93bjtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIENhdGNoaW5nIGVycm9ycyBtYWtlcyBkZWJ1Z2dpbmcgbW9yZSBkaWZmaWN1bHQsIHNvIHdlIHN0YXJ0IHdpdGhcbiAgICAgICAgLy8gZXJyb3JUaHJvd24gc2V0IHRvIHRydWUgYmVmb3JlIHNldHRpbmcgaXQgdG8gZmFsc2UgYWZ0ZXIgY2FsbGluZ1xuICAgICAgICAvLyBjbG9zZSAtLSBpZiBpdCdzIHN0aWxsIHNldCB0byB0cnVlIGluIHRoZSBmaW5hbGx5IGJsb2NrLCBpdCBtZWFuc1xuICAgICAgICAvLyB3cmFwcGVyLmNsb3NlIHRocmV3LlxuICAgICAgICBlcnJvclRocm93biA9IHRydWU7XG4gICAgICAgIGlmIChpbml0RGF0YSAhPT0gT0JTRVJWRURfRVJST1IgJiYgd3JhcHBlci5jbG9zZSkge1xuICAgICAgICAgIHdyYXBwZXIuY2xvc2UuY2FsbCh0aGlzLCBpbml0RGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZXJyb3JUaHJvd24gPSBmYWxzZTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChlcnJvclRocm93bikge1xuICAgICAgICAgIC8vIFRoZSBjbG9zZXIgZm9yIHdyYXBwZXIgaSB0aHJldyBhbiBlcnJvcjsgY2xvc2UgdGhlIHJlbWFpbmluZ1xuICAgICAgICAgIC8vIHdyYXBwZXJzIGJ1dCBzaWxlbmNlIGFueSBleGNlcHRpb25zIGZyb20gdGhlbSB0byBlbnN1cmUgdGhhdCB0aGVcbiAgICAgICAgICAvLyBmaXJzdCBlcnJvciBpcyB0aGUgb25lIHRvIGJ1YmJsZSB1cC5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZUFsbChpICsgMSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLndyYXBwZXJJbml0RGF0YS5sZW5ndGggPSAwO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zYWN0aW9uSW1wbDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmlld3BvcnRNZXRyaWNzID0ge1xuXG4gIGN1cnJlbnRTY3JvbGxMZWZ0OiAwLFxuXG4gIGN1cnJlbnRTY3JvbGxUb3A6IDAsXG5cbiAgcmVmcmVzaFNjcm9sbFZhbHVlczogZnVuY3Rpb24gKHNjcm9sbFBvc2l0aW9uKSB7XG4gICAgVmlld3BvcnRNZXRyaWNzLmN1cnJlbnRTY3JvbGxMZWZ0ID0gc2Nyb2xsUG9zaXRpb24ueDtcbiAgICBWaWV3cG9ydE1ldHJpY3MuY3VycmVudFNjcm9sbFRvcCA9IHNjcm9sbFBvc2l0aW9uLnk7XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBWaWV3cG9ydE1ldHJpY3M7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG5cbi8qKlxuICogQWNjdW11bGF0ZXMgaXRlbXMgdGhhdCBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZCBpbnRvIHRoZSBmaXJzdCBvbmUuIFRoaXNcbiAqIGlzIHVzZWQgdG8gY29uc2VydmUgbWVtb3J5IGJ5IGF2b2lkaW5nIGFycmF5IGFsbG9jYXRpb25zLCBhbmQgdGh1cyBzYWNyaWZpY2VzXG4gKiBBUEkgY2xlYW5uZXNzLiBTaW5jZSBgY3VycmVudGAgY2FuIGJlIG51bGwgYmVmb3JlIGJlaW5nIHBhc3NlZCBpbiBhbmQgbm90XG4gKiBudWxsIGFmdGVyIHRoaXMgZnVuY3Rpb24sIG1ha2Ugc3VyZSB0byBhc3NpZ24gaXQgYmFjayB0byBgY3VycmVudGA6XG4gKlxuICogYGEgPSBhY2N1bXVsYXRlSW50byhhLCBiKTtgXG4gKlxuICogVGhpcyBBUEkgc2hvdWxkIGJlIHNwYXJpbmdseSB1c2VkLiBUcnkgYGFjY3VtdWxhdGVgIGZvciBzb21ldGhpbmcgY2xlYW5lci5cbiAqXG4gKiBAcmV0dXJuIHsqfGFycmF5PCo+fSBBbiBhY2N1bXVsYXRpb24gb2YgaXRlbXMuXG4gKi9cblxuZnVuY3Rpb24gYWNjdW11bGF0ZUludG8oY3VycmVudCwgbmV4dCkge1xuICAhKG5leHQgIT0gbnVsbCkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2FjY3VtdWxhdGVJbnRvKC4uLik6IEFjY3VtdWxhdGVkIGl0ZW1zIG11c3Qgbm90IGJlIG51bGwgb3IgdW5kZWZpbmVkLicpIDogX3Byb2RJbnZhcmlhbnQoJzMwJykgOiB2b2lkIDA7XG5cbiAgaWYgKGN1cnJlbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiBuZXh0O1xuICB9XG5cbiAgLy8gQm90aCBhcmUgbm90IGVtcHR5LiBXYXJuaW5nOiBOZXZlciBjYWxsIHguY29uY2F0KHkpIHdoZW4geW91IGFyZSBub3RcbiAgLy8gY2VydGFpbiB0aGF0IHggaXMgYW4gQXJyYXkgKHggY291bGQgYmUgYSBzdHJpbmcgd2l0aCBjb25jYXQgbWV0aG9kKS5cbiAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShuZXh0KSkge1xuICAgICAgY3VycmVudC5wdXNoLmFwcGx5KGN1cnJlbnQsIG5leHQpO1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIGN1cnJlbnQucHVzaChuZXh0KTtcbiAgICByZXR1cm4gY3VycmVudDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KG5leHQpKSB7XG4gICAgLy8gQSBiaXQgdG9vIGRhbmdlcm91cyB0byBtdXRhdGUgYG5leHRgLlxuICAgIHJldHVybiBbY3VycmVudF0uY29uY2F0KG5leHQpO1xuICB9XG5cbiAgcmV0dXJuIFtjdXJyZW50LCBuZXh0XTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBhY2N1bXVsYXRlSW50bzsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBNT0QgPSA2NTUyMTtcblxuLy8gYWRsZXIzMiBpcyBub3QgY3J5cHRvZ3JhcGhpY2FsbHkgc3Ryb25nLCBhbmQgaXMgb25seSB1c2VkIHRvIHNhbml0eSBjaGVjayB0aGF0XG4vLyBtYXJrdXAgZ2VuZXJhdGVkIG9uIHRoZSBzZXJ2ZXIgbWF0Y2hlcyB0aGUgbWFya3VwIGdlbmVyYXRlZCBvbiB0aGUgY2xpZW50LlxuLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiAoYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBTaGVldEpTIHZlcnNpb24pIGhhcyBiZWVuIG9wdGltaXplZFxuLy8gZm9yIG91ciB1c2UgY2FzZSwgYXQgdGhlIGV4cGVuc2Ugb2YgY29uZm9ybWluZyB0byB0aGUgYWRsZXIzMiBzcGVjaWZpY2F0aW9uXG4vLyBmb3Igbm9uLWFzY2lpIGlucHV0cy5cbmZ1bmN0aW9uIGFkbGVyMzIoZGF0YSkge1xuICB2YXIgYSA9IDE7XG4gIHZhciBiID0gMDtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbCA9IGRhdGEubGVuZ3RoO1xuICB2YXIgbSA9IGwgJiB+MHgzO1xuICB3aGlsZSAoaSA8IG0pIHtcbiAgICB2YXIgbiA9IE1hdGgubWluKGkgKyA0MDk2LCBtKTtcbiAgICBmb3IgKDsgaSA8IG47IGkgKz0gNCkge1xuICAgICAgYiArPSAoYSArPSBkYXRhLmNoYXJDb2RlQXQoaSkpICsgKGEgKz0gZGF0YS5jaGFyQ29kZUF0KGkgKyAxKSkgKyAoYSArPSBkYXRhLmNoYXJDb2RlQXQoaSArIDIpKSArIChhICs9IGRhdGEuY2hhckNvZGVBdChpICsgMykpO1xuICAgIH1cbiAgICBhICU9IE1PRDtcbiAgICBiICU9IE1PRDtcbiAgfVxuICBmb3IgKDsgaSA8IGw7IGkrKykge1xuICAgIGIgKz0gYSArPSBkYXRhLmNoYXJDb2RlQXQoaSk7XG4gIH1cbiAgYSAlPSBNT0Q7XG4gIGIgJT0gTU9EO1xuICByZXR1cm4gYSB8IGIgPDwgMTY7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYWRsZXIzMjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzJyk7XG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vaztcblxuaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiBcImRldmVsb3BtZW50XCIgPT09ICd0ZXN0Jykge1xuICAvLyBUZW1wb3JhcnkgaGFjay5cbiAgLy8gSW5saW5lIHJlcXVpcmVzIGRvbid0IHdvcmsgd2VsbCB3aXRoIEplc3Q6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI0MFxuICAvLyBSZW1vdmUgdGhlIGlubGluZSByZXF1aXJlcyB3aGVuIHdlIGRvbid0IG5lZWQgdGhlbSBhbnltb3JlOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC83MTc4XG4gIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDb21wb25lbnRUcmVlSG9vaycpO1xufVxuXG52YXIgbG9nZ2VkVHlwZUZhaWx1cmVzID0ge307XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIHZhbHVlcyBtYXRjaCB3aXRoIHRoZSB0eXBlIHNwZWNzLlxuICogRXJyb3IgbWVzc2FnZXMgYXJlIG1lbW9yaXplZCBhbmQgd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHR5cGVTcGVjcyBNYXAgb2YgbmFtZSB0byBhIFJlYWN0UHJvcFR5cGVcbiAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZXMgUnVudGltZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIHR5cGUtY2hlY2tlZFxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uIGUuZy4gXCJwcm9wXCIsIFwiY29udGV4dFwiLCBcImNoaWxkIGNvbnRleHRcIlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbXBvbmVudE5hbWUgTmFtZSBvZiB0aGUgY29tcG9uZW50IGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7P29iamVjdH0gZWxlbWVudCBUaGUgUmVhY3QgZWxlbWVudCB0aGF0IGlzIGJlaW5nIHR5cGUtY2hlY2tlZFxuICogQHBhcmFtIHs/bnVtYmVyfSBkZWJ1Z0lEIFRoZSBSZWFjdCBjb21wb25lbnQgaW5zdGFuY2UgdGhhdCBpcyBiZWluZyB0eXBlLWNoZWNrZWRcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrUmVhY3RUeXBlU3BlYyh0eXBlU3BlY3MsIHZhbHVlcywgbG9jYXRpb24sIGNvbXBvbmVudE5hbWUsIGVsZW1lbnQsIGRlYnVnSUQpIHtcbiAgZm9yICh2YXIgdHlwZVNwZWNOYW1lIGluIHR5cGVTcGVjcykge1xuICAgIGlmICh0eXBlU3BlY3MuaGFzT3duUHJvcGVydHkodHlwZVNwZWNOYW1lKSkge1xuICAgICAgdmFyIGVycm9yO1xuICAgICAgLy8gUHJvcCB0eXBlIHZhbGlkYXRpb24gbWF5IHRocm93LiBJbiBjYXNlIHRoZXkgZG8sIHdlIGRvbid0IHdhbnQgdG9cbiAgICAgIC8vIGZhaWwgdGhlIHJlbmRlciBwaGFzZSB3aGVyZSBpdCBkaWRuJ3QgZmFpbCBiZWZvcmUuIFNvIHdlIGxvZyBpdC5cbiAgICAgIC8vIEFmdGVyIHRoZXNlIGhhdmUgYmVlbiBjbGVhbmVkIHVwLCB3ZSdsbCBsZXQgdGhlbSB0aHJvdy5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBhbiBpbnZhcmlhbnQgdGhhdCBnZXRzIGNhdWdodC4gSXQncyB0aGUgc2FtZVxuICAgICAgICAvLyBiZWhhdmlvciBhcyB3aXRob3V0IHRoaXMgc3RhdGVtZW50IGV4Y2VwdCB3aXRoIGEgYmV0dGVyIG1lc3NhZ2UuXG4gICAgICAgICEodHlwZW9mIHR5cGVTcGVjc1t0eXBlU3BlY05hbWVdID09PSAnZnVuY3Rpb24nKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnJXM6ICVzIHR5cGUgYCVzYCBpcyBpbnZhbGlkOyBpdCBtdXN0IGJlIGEgZnVuY3Rpb24sIHVzdWFsbHkgZnJvbSBSZWFjdC5Qcm9wVHlwZXMuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sIHR5cGVTcGVjTmFtZSkgOiBfcHJvZEludmFyaWFudCgnODQnLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXSwgdHlwZVNwZWNOYW1lKSA6IHZvaWQgMDtcbiAgICAgICAgZXJyb3IgPSB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSh2YWx1ZXMsIHR5cGVTcGVjTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIG51bGwsIFJlYWN0UHJvcFR5cGVzU2VjcmV0KTtcbiAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgIGVycm9yID0gZXg7XG4gICAgICB9XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIWVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgRXJyb3IsICclczogdHlwZSBzcGVjaWZpY2F0aW9uIG9mICVzIGAlc2AgaXMgaW52YWxpZDsgdGhlIHR5cGUgY2hlY2tlciAnICsgJ2Z1bmN0aW9uIG11c3QgcmV0dXJuIGBudWxsYCBvciBhbiBgRXJyb3JgIGJ1dCByZXR1cm5lZCBhICVzLiAnICsgJ1lvdSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gdG8gcGFzcyBhbiBhcmd1bWVudCB0byB0aGUgdHlwZSBjaGVja2VyICcgKyAnY3JlYXRvciAoYXJyYXlPZiwgaW5zdGFuY2VPZiwgb2JqZWN0T2YsIG9uZU9mLCBvbmVPZlR5cGUsIGFuZCAnICsgJ3NoYXBlIGFsbCByZXF1aXJlIGFuIGFyZ3VtZW50KS4nLCBjb21wb25lbnROYW1lIHx8ICdSZWFjdCBjbGFzcycsIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzW2xvY2F0aW9uXSwgdHlwZVNwZWNOYW1lLCB0eXBlb2YgZXJyb3IpIDogdm9pZCAwO1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgIShlcnJvci5tZXNzYWdlIGluIGxvZ2dlZFR5cGVGYWlsdXJlcykpIHtcbiAgICAgICAgLy8gT25seSBtb25pdG9yIHRoaXMgZmFpbHVyZSBvbmNlIGJlY2F1c2UgdGhlcmUgdGVuZHMgdG8gYmUgYSBsb3Qgb2YgdGhlXG4gICAgICAgIC8vIHNhbWUgZXJyb3IuXG4gICAgICAgIGxvZ2dlZFR5cGVGYWlsdXJlc1tlcnJvci5tZXNzYWdlXSA9IHRydWU7XG5cbiAgICAgICAgdmFyIGNvbXBvbmVudFN0YWNrSW5mbyA9ICcnO1xuXG4gICAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIGlmICghUmVhY3RDb21wb25lbnRUcmVlSG9vaykge1xuICAgICAgICAgICAgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdENvbXBvbmVudFRyZWVIb29rJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkZWJ1Z0lEICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wb25lbnRTdGFja0luZm8gPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldFN0YWNrQWRkZW5kdW1CeUlEKGRlYnVnSUQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgY29tcG9uZW50U3RhY2tJbmZvID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRDdXJyZW50U3RhY2tBZGRlbmR1bShlbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdGYWlsZWQgJXMgdHlwZTogJXMlcycsIGxvY2F0aW9uLCBlcnJvci5tZXNzYWdlLCBjb21wb25lbnRTdGFja0luZm8pIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGNoZWNrUmVhY3RUeXBlU3BlYzsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuLyogZ2xvYmFscyBNU0FwcCAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ3JlYXRlIGEgZnVuY3Rpb24gd2hpY2ggaGFzICd1bnNhZmUnIHByaXZpbGVnZXMgKHJlcXVpcmVkIGJ5IHdpbmRvd3M4IGFwcHMpXG4gKi9cblxudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSBmdW5jdGlvbiAoZnVuYykge1xuICBpZiAodHlwZW9mIE1TQXBwICE9PSAndW5kZWZpbmVkJyAmJiBNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnMCwgYXJnMSwgYXJnMiwgYXJnMykge1xuICAgICAgTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZnVuYyhhcmcwLCBhcmcxLCBhcmcyLCBhcmczKTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlTWljcm9zb2Z0VW5zYWZlTG9jYWxGdW5jdGlvbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ1NTUHJvcGVydHkgPSByZXF1aXJlKCcuL0NTU1Byb3BlcnR5Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIGlzVW5pdGxlc3NOdW1iZXIgPSBDU1NQcm9wZXJ0eS5pc1VuaXRsZXNzTnVtYmVyO1xudmFyIHN0eWxlV2FybmluZ3MgPSB7fTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgdmFsdWUgaW50byB0aGUgcHJvcGVyIGNzcyB3cml0YWJsZSB2YWx1ZS4gVGhlIHN0eWxlIG5hbWUgYG5hbWVgXG4gKiBzaG91bGQgYmUgbG9naWNhbCAobm8gaHlwaGVucyksIGFzIHNwZWNpZmllZFxuICogaW4gYENTU1Byb3BlcnR5LmlzVW5pdGxlc3NOdW1iZXJgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBwcm9wZXJ0eSBuYW1lIHN1Y2ggYXMgYHRvcE1hcmdpbmAuXG4gKiBAcGFyYW0geyp9IHZhbHVlIENTUyBwcm9wZXJ0eSB2YWx1ZSBzdWNoIGFzIGAxMHB4YC5cbiAqIEBwYXJhbSB7UmVhY3RET01Db21wb25lbnR9IGNvbXBvbmVudFxuICogQHJldHVybiB7c3RyaW5nfSBOb3JtYWxpemVkIHN0eWxlIHZhbHVlIHdpdGggZGltZW5zaW9ucyBhcHBsaWVkLlxuICovXG5mdW5jdGlvbiBkYW5nZXJvdXNTdHlsZVZhbHVlKG5hbWUsIHZhbHVlLCBjb21wb25lbnQpIHtcbiAgLy8gTm90ZSB0aGF0IHdlJ3ZlIHJlbW92ZWQgZXNjYXBlVGV4dEZvckJyb3dzZXIoKSBjYWxscyBoZXJlIHNpbmNlIHRoZVxuICAvLyB3aG9sZSBzdHJpbmcgd2lsbCBiZSBlc2NhcGVkIHdoZW4gdGhlIGF0dHJpYnV0ZSBpcyBpbmplY3RlZCBpbnRvXG4gIC8vIHRoZSBtYXJrdXAuIElmIHlvdSBwcm92aWRlIHVuc2FmZSB1c2VyIGRhdGEgaGVyZSB0aGV5IGNhbiBpbmplY3RcbiAgLy8gYXJiaXRyYXJ5IENTUyB3aGljaCBtYXkgYmUgcHJvYmxlbWF0aWMgKEkgY291bGRuJ3QgcmVwcm8gdGhpcyk6XG4gIC8vIGh0dHBzOi8vd3d3Lm93YXNwLm9yZy9pbmRleC5waHAvWFNTX0ZpbHRlcl9FdmFzaW9uX0NoZWF0X1NoZWV0XG4gIC8vIGh0dHA6Ly93d3cudGhlc3Bhbm5lci5jby51ay8yMDA3LzExLzI2L3VsdGltYXRlLXhzcy1jc3MtaW5qZWN0aW9uL1xuICAvLyBUaGlzIGlzIG5vdCBhbiBYU1MgaG9sZSBidXQgaW5zdGVhZCBhIHBvdGVudGlhbCBDU1MgaW5qZWN0aW9uIGlzc3VlXG4gIC8vIHdoaWNoIGhhcyBsZWFkIHRvIGEgZ3JlYXRlciBkaXNjdXNzaW9uIGFib3V0IGhvdyB3ZSdyZSBnb2luZyB0b1xuICAvLyB0cnVzdCBVUkxzIG1vdmluZyBmb3J3YXJkLiBTZWUgIzIxMTU5MDFcblxuICB2YXIgaXNFbXB0eSA9IHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHwgdmFsdWUgPT09ICcnO1xuICBpZiAoaXNFbXB0eSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHZhciBpc05vbk51bWVyaWMgPSBpc05hTih2YWx1ZSk7XG4gIGlmIChpc05vbk51bWVyaWMgfHwgdmFsdWUgPT09IDAgfHwgaXNVbml0bGVzc051bWJlci5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiBpc1VuaXRsZXNzTnVtYmVyW25hbWVdKSB7XG4gICAgcmV0dXJuICcnICsgdmFsdWU7IC8vIGNhc3QgdG8gc3RyaW5nXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgLy8gQWxsb3cgJzAnIHRvIHBhc3MgdGhyb3VnaCB3aXRob3V0IHdhcm5pbmcuIDAgaXMgYWxyZWFkeSBzcGVjaWFsIGFuZFxuICAgICAgLy8gZG9lc24ndCByZXF1aXJlIHVuaXRzLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHdhcm4gYWJvdXQgaXQuXG4gICAgICBpZiAoY29tcG9uZW50ICYmIHZhbHVlICE9PSAnMCcpIHtcbiAgICAgICAgdmFyIG93bmVyID0gY29tcG9uZW50Ll9jdXJyZW50RWxlbWVudC5fb3duZXI7XG4gICAgICAgIHZhciBvd25lck5hbWUgPSBvd25lciA/IG93bmVyLmdldE5hbWUoKSA6IG51bGw7XG4gICAgICAgIGlmIChvd25lck5hbWUgJiYgIXN0eWxlV2FybmluZ3Nbb3duZXJOYW1lXSkge1xuICAgICAgICAgIHN0eWxlV2FybmluZ3Nbb3duZXJOYW1lXSA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKG93bmVyTmFtZSkge1xuICAgICAgICAgIHZhciB3YXJuaW5ncyA9IHN0eWxlV2FybmluZ3Nbb3duZXJOYW1lXTtcbiAgICAgICAgICB3YXJuZWQgPSB3YXJuaW5nc1tuYW1lXTtcbiAgICAgICAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgICAgICAgd2FybmluZ3NbbmFtZV0gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2EgYCVzYCB0YWcgKG93bmVyOiBgJXNgKSB3YXMgcGFzc2VkIGEgbnVtZXJpYyBzdHJpbmcgdmFsdWUgJyArICdmb3IgQ1NTIHByb3BlcnR5IGAlc2AgKHZhbHVlOiBgJXNgKSB3aGljaCB3aWxsIGJlIHRyZWF0ZWQgJyArICdhcyBhIHVuaXRsZXNzIG51bWJlciBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFJlYWN0LicsIGNvbXBvbmVudC5fY3VycmVudEVsZW1lbnQudHlwZSwgb3duZXJOYW1lIHx8ICd1bmtub3duJywgbmFtZSwgdmFsdWUpIDogdm9pZCAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHZhbHVlID0gdmFsdWUudHJpbSgpO1xuICB9XG4gIHJldHVybiB2YWx1ZSArICdweCc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZGFuZ2Vyb3VzU3R5bGVWYWx1ZTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE2LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBCYXNlZCBvbiB0aGUgZXNjYXBlLWh0bWwgbGlicmFyeSwgd2hpY2ggaXMgdXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgYmVsb3c6XG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMgVEogSG9sb3dheWNodWtcbiAqIENvcHlyaWdodCAoYykgMjAxNSBBbmRyZWFzIEx1YmJlXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgVGlhbmNoZW5nIFwiVGltb3RoeVwiIEd1XG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nXG4gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbiAqICdTb2Z0d2FyZScpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbiAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbiAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0b1xuICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvXG4gKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmVcbiAqIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAnQVMgSVMnLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4gKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG4gKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWVxuICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCxcbiAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFXG4gKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyBjb2RlIGNvcGllZCBhbmQgbW9kaWZpZWQgZnJvbSBlc2NhcGUtaHRtbFxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgbWF0Y2hIdG1sUmVnRXhwID0gL1tcIicmPD5dLztcblxuLyoqXG4gKiBFc2NhcGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBzdHJpbmcgb2YgaHRtbC5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGVzY2FwZSBmb3IgaW5zZXJ0aW5nIGludG8gSFRNTFxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIGVzY2FwZUh0bWwoc3RyaW5nKSB7XG4gIHZhciBzdHIgPSAnJyArIHN0cmluZztcbiAgdmFyIG1hdGNoID0gbWF0Y2hIdG1sUmVnRXhwLmV4ZWMoc3RyKTtcblxuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuXG4gIHZhciBlc2NhcGU7XG4gIHZhciBodG1sID0gJyc7XG4gIHZhciBpbmRleCA9IDA7XG4gIHZhciBsYXN0SW5kZXggPSAwO1xuXG4gIGZvciAoaW5kZXggPSBtYXRjaC5pbmRleDsgaW5kZXggPCBzdHIubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgc3dpdGNoIChzdHIuY2hhckNvZGVBdChpbmRleCkpIHtcbiAgICAgIGNhc2UgMzQ6XG4gICAgICAgIC8vIFwiXG4gICAgICAgIGVzY2FwZSA9ICcmcXVvdDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzg6XG4gICAgICAgIC8vICZcbiAgICAgICAgZXNjYXBlID0gJyZhbXA7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM5OlxuICAgICAgICAvLyAnXG4gICAgICAgIGVzY2FwZSA9ICcmI3gyNzsnOyAvLyBtb2RpZmllZCBmcm9tIGVzY2FwZS1odG1sOyB1c2VkIHRvIGJlICcmIzM5J1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjA6XG4gICAgICAgIC8vIDxcbiAgICAgICAgZXNjYXBlID0gJyZsdDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNjI6XG4gICAgICAgIC8vID5cbiAgICAgICAgZXNjYXBlID0gJyZndDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChsYXN0SW5kZXggIT09IGluZGV4KSB7XG4gICAgICBodG1sICs9IHN0ci5zdWJzdHJpbmcobGFzdEluZGV4LCBpbmRleCk7XG4gICAgfVxuXG4gICAgbGFzdEluZGV4ID0gaW5kZXggKyAxO1xuICAgIGh0bWwgKz0gZXNjYXBlO1xuICB9XG5cbiAgcmV0dXJuIGxhc3RJbmRleCAhPT0gaW5kZXggPyBodG1sICsgc3RyLnN1YnN0cmluZyhsYXN0SW5kZXgsIGluZGV4KSA6IGh0bWw7XG59XG4vLyBlbmQgY29kZSBjb3BpZWQgYW5kIG1vZGlmaWVkIGZyb20gZXNjYXBlLWh0bWxcblxuXG4vKipcbiAqIEVzY2FwZXMgdGV4dCB0byBwcmV2ZW50IHNjcmlwdGluZyBhdHRhY2tzLlxuICpcbiAqIEBwYXJhbSB7Kn0gdGV4dCBUZXh0IHZhbHVlIHRvIGVzY2FwZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gQW4gZXNjYXBlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3Nlcih0ZXh0KSB7XG4gIGlmICh0eXBlb2YgdGV4dCA9PT0gJ2Jvb2xlYW4nIHx8IHR5cGVvZiB0ZXh0ID09PSAnbnVtYmVyJykge1xuICAgIC8vIHRoaXMgc2hvcnRjaXJjdWl0IGhlbHBzIHBlcmYgZm9yIHR5cGVzIHRoYXQgd2Uga25vdyB3aWxsIG5ldmVyIGhhdmVcbiAgICAvLyBzcGVjaWFsIGNoYXJhY3RlcnMsIGVzcGVjaWFsbHkgZ2l2ZW4gdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgb2Z0ZW5cbiAgICAvLyBmb3IgbnVtZXJpYyBkb20gaWRzLlxuICAgIHJldHVybiAnJyArIHRleHQ7XG4gIH1cbiAgcmV0dXJuIGVzY2FwZUh0bWwodGV4dCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfcHJvZEludmFyaWFudCA9IHJlcXVpcmUoJy4vcmVhY3RQcm9kSW52YXJpYW50Jyk7XG5cbnZhciBSZWFjdEN1cnJlbnRPd25lciA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9SZWFjdEN1cnJlbnRPd25lcicpO1xudmFyIFJlYWN0RE9NQ29tcG9uZW50VHJlZSA9IHJlcXVpcmUoJy4vUmVhY3RET01Db21wb25lbnRUcmVlJyk7XG52YXIgUmVhY3RJbnN0YW5jZU1hcCA9IHJlcXVpcmUoJy4vUmVhY3RJbnN0YW5jZU1hcCcpO1xuXG52YXIgZ2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGUgPSByZXF1aXJlKCcuL2dldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlJyk7XG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBET00gbm9kZSByZW5kZXJlZCBieSB0aGlzIGVsZW1lbnQuXG4gKlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0ZG9tLmZpbmRkb21ub2RlXG4gKlxuICogQHBhcmFtIHtSZWFjdENvbXBvbmVudHxET01FbGVtZW50fSBjb21wb25lbnRPckVsZW1lbnRcbiAqIEByZXR1cm4gez9ET01FbGVtZW50fSBUaGUgcm9vdCBub2RlIG9mIHRoaXMgZWxlbWVudC5cbiAqL1xuZnVuY3Rpb24gZmluZERPTU5vZGUoY29tcG9uZW50T3JFbGVtZW50KSB7XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZhciBvd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG4gICAgaWYgKG93bmVyICE9PSBudWxsKSB7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcob3duZXIuX3dhcm5lZEFib3V0UmVmc0luUmVuZGVyLCAnJXMgaXMgYWNjZXNzaW5nIGZpbmRET01Ob2RlIGluc2lkZSBpdHMgcmVuZGVyKCkuICcgKyAncmVuZGVyKCkgc2hvdWxkIGJlIGEgcHVyZSBmdW5jdGlvbiBvZiBwcm9wcyBhbmQgc3RhdGUuIEl0IHNob3VsZCAnICsgJ25ldmVyIGFjY2VzcyBzb21ldGhpbmcgdGhhdCByZXF1aXJlcyBzdGFsZSBkYXRhIGZyb20gdGhlIHByZXZpb3VzICcgKyAncmVuZGVyLCBzdWNoIGFzIHJlZnMuIE1vdmUgdGhpcyBsb2dpYyB0byBjb21wb25lbnREaWRNb3VudCBhbmQgJyArICdjb21wb25lbnREaWRVcGRhdGUgaW5zdGVhZC4nLCBvd25lci5nZXROYW1lKCkgfHwgJ0EgY29tcG9uZW50JykgOiB2b2lkIDA7XG4gICAgICBvd25lci5fd2FybmVkQWJvdXRSZWZzSW5SZW5kZXIgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAoY29tcG9uZW50T3JFbGVtZW50ID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoY29tcG9uZW50T3JFbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgcmV0dXJuIGNvbXBvbmVudE9yRWxlbWVudDtcbiAgfVxuXG4gIHZhciBpbnN0ID0gUmVhY3RJbnN0YW5jZU1hcC5nZXQoY29tcG9uZW50T3JFbGVtZW50KTtcbiAgaWYgKGluc3QpIHtcbiAgICBpbnN0ID0gZ2V0SG9zdENvbXBvbmVudEZyb21Db21wb3NpdGUoaW5zdCk7XG4gICAgcmV0dXJuIGluc3QgPyBSZWFjdERPTUNvbXBvbmVudFRyZWUuZ2V0Tm9kZUZyb21JbnN0YW5jZShpbnN0KSA6IG51bGw7XG4gIH1cblxuICBpZiAodHlwZW9mIGNvbXBvbmVudE9yRWxlbWVudC5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAhZmFsc2UgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ2ZpbmRET01Ob2RlIHdhcyBjYWxsZWQgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4nKSA6IF9wcm9kSW52YXJpYW50KCc0NCcpIDogdm9pZCAwO1xuICB9IGVsc2Uge1xuICAgICFmYWxzZSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRWxlbWVudCBhcHBlYXJzIHRvIGJlIG5laXRoZXIgUmVhY3RDb21wb25lbnQgbm9yIERPTU5vZGUgKGtleXM6ICVzKScsIE9iamVjdC5rZXlzKGNvbXBvbmVudE9yRWxlbWVudCkpIDogX3Byb2RJbnZhcmlhbnQoJzQ1JywgT2JqZWN0LmtleXMoY29tcG9uZW50T3JFbGVtZW50KSkgOiB2b2lkIDA7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmaW5kRE9NTm9kZTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBLZXlFc2NhcGVVdGlscyA9IHJlcXVpcmUoJy4vS2V5RXNjYXBlVXRpbHMnKTtcbnZhciB0cmF2ZXJzZUFsbENoaWxkcmVuID0gcmVxdWlyZSgnLi90cmF2ZXJzZUFsbENoaWxkcmVuJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2s7XG5cbmlmICh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgcHJvY2Vzcy5lbnYgJiYgXCJkZXZlbG9wbWVudFwiID09PSAndGVzdCcpIHtcbiAgLy8gVGVtcG9yYXJ5IGhhY2suXG4gIC8vIElubGluZSByZXF1aXJlcyBkb24ndCB3b3JrIHdlbGwgd2l0aCBKZXN0OlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzcyNDBcbiAgLy8gUmVtb3ZlIHRoZSBpbmxpbmUgcmVxdWlyZXMgd2hlbiB3ZSBkb24ndCBuZWVkIHRoZW0gYW55bW9yZTpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3B1bGwvNzE3OFxuICBSZWFjdENvbXBvbmVudFRyZWVIb29rID0gcmVxdWlyZSgncmVhY3QvbGliL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSB0cmF2ZXJzZUNvbnRleHQgQ29udGV4dCBwYXNzZWQgdGhyb3VnaCB0cmF2ZXJzYWwuXG4gKiBAcGFyYW0gez9SZWFjdENvbXBvbmVudH0gY2hpbGQgUmVhY3QgY2hpbGQgY29tcG9uZW50LlxuICogQHBhcmFtIHshc3RyaW5nfSBuYW1lIFN0cmluZyBuYW1lIG9mIGtleSBwYXRoIHRvIGNoaWxkLlxuICogQHBhcmFtIHtudW1iZXI9fSBzZWxmRGVidWdJRCBPcHRpb25hbCBkZWJ1Z0lEIG9mIHRoZSBjdXJyZW50IGludGVybmFsIGluc3RhbmNlLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCh0cmF2ZXJzZUNvbnRleHQsIGNoaWxkLCBuYW1lLCBzZWxmRGVidWdJRCkge1xuICAvLyBXZSBmb3VuZCBhIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgaWYgKHRyYXZlcnNlQ29udGV4dCAmJiB0eXBlb2YgdHJhdmVyc2VDb250ZXh0ID09PSAnb2JqZWN0Jykge1xuICAgIHZhciByZXN1bHQgPSB0cmF2ZXJzZUNvbnRleHQ7XG4gICAgdmFyIGtleVVuaXF1ZSA9IHJlc3VsdFtuYW1lXSA9PT0gdW5kZWZpbmVkO1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgaWYgKCFSZWFjdENvbXBvbmVudFRyZWVIb29rKSB7XG4gICAgICAgIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDb21wb25lbnRUcmVlSG9vaycpO1xuICAgICAgfVxuICAgICAgaWYgKCFrZXlVbmlxdWUpIHtcbiAgICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnZmxhdHRlbkNoaWxkcmVuKC4uLik6IEVuY291bnRlcmVkIHR3byBjaGlsZHJlbiB3aXRoIHRoZSBzYW1lIGtleSwgJyArICdgJXNgLiBDaGlsZCBrZXlzIG11c3QgYmUgdW5pcXVlOyB3aGVuIHR3byBjaGlsZHJlbiBzaGFyZSBhIGtleSwgb25seSAnICsgJ3RoZSBmaXJzdCBjaGlsZCB3aWxsIGJlIHVzZWQuJXMnLCBLZXlFc2NhcGVVdGlscy51bmVzY2FwZShuYW1lKSwgUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChzZWxmRGVidWdJRCkpIDogdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5VW5pcXVlICYmIGNoaWxkICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdFtuYW1lXSA9IGNoaWxkO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEZsYXR0ZW5zIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYC4gQW55IG51bGxcbiAqIGNoaWxkcmVuIHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgb2JqZWN0LlxuICogQHJldHVybiB7IW9iamVjdH0gZmxhdHRlbmVkIGNoaWxkcmVuIGtleWVkIGJ5IG5hbWUuXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5DaGlsZHJlbihjaGlsZHJlbiwgc2VsZkRlYnVnSUQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cbiAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGZ1bmN0aW9uICh0cmF2ZXJzZUNvbnRleHQsIGNoaWxkLCBuYW1lKSB7XG4gICAgICByZXR1cm4gZmxhdHRlblNpbmdsZUNoaWxkSW50b0NvbnRleHQodHJhdmVyc2VDb250ZXh0LCBjaGlsZCwgbmFtZSwgc2VsZkRlYnVnSUQpO1xuICAgIH0sIHJlc3VsdCk7XG4gIH0gZWxzZSB7XG4gICAgdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgZmxhdHRlblNpbmdsZUNoaWxkSW50b0NvbnRleHQsIHJlc3VsdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmbGF0dGVuQ2hpbGRyZW47IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEBwYXJhbSB7YXJyYXl9IGFyciBhbiBcImFjY3VtdWxhdGlvblwiIG9mIGl0ZW1zIHdoaWNoIGlzIGVpdGhlciBhbiBBcnJheSBvclxuICogYSBzaW5nbGUgaXRlbS4gVXNlZnVsIHdoZW4gcGFpcmVkIHdpdGggdGhlIGBhY2N1bXVsYXRlYCBtb2R1bGUuIFRoaXMgaXMgYVxuICogc2ltcGxlIHV0aWxpdHkgdGhhdCBhbGxvd3MgdXMgdG8gcmVhc29uIGFib3V0IGEgY29sbGVjdGlvbiBvZiBpdGVtcywgYnV0XG4gKiBoYW5kbGluZyB0aGUgY2FzZSB3aGVuIHRoZXJlIGlzIGV4YWN0bHkgb25lIGl0ZW0gKGFuZCB3ZSBkbyBub3QgbmVlZCB0b1xuICogYWxsb2NhdGUgYW4gYXJyYXkpLlxuICovXG5cbmZ1bmN0aW9uIGZvckVhY2hBY2N1bXVsYXRlZChhcnIsIGNiLCBzY29wZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgYXJyLmZvckVhY2goY2IsIHNjb3BlKTtcbiAgfSBlbHNlIGlmIChhcnIpIHtcbiAgICBjYi5jYWxsKHNjb3BlLCBhcnIpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZm9yRWFjaEFjY3VtdWxhdGVkOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogYGNoYXJDb2RlYCByZXByZXNlbnRzIHRoZSBhY3R1YWwgXCJjaGFyYWN0ZXIgY29kZVwiIGFuZCBpcyBzYWZlIHRvIHVzZSB3aXRoXG4gKiBgU3RyaW5nLmZyb21DaGFyQ29kZWAuIEFzIHN1Y2gsIG9ubHkga2V5cyB0aGF0IGNvcnJlc3BvbmQgdG8gcHJpbnRhYmxlXG4gKiBjaGFyYWN0ZXJzIHByb2R1Y2UgYSB2YWxpZCBgY2hhckNvZGVgLCB0aGUgb25seSBleGNlcHRpb24gdG8gdGhpcyBpcyBFbnRlci5cbiAqIFRoZSBUYWIta2V5IGlzIGNvbnNpZGVyZWQgbm9uLXByaW50YWJsZSBhbmQgZG9lcyBub3QgaGF2ZSBhIGBjaGFyQ29kZWAsXG4gKiBwcmVzdW1hYmx5IGJlY2F1c2UgaXQgZG9lcyBub3QgcHJvZHVjZSBhIHRhYi1jaGFyYWN0ZXIgaW4gYnJvd3NlcnMuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG5hdGl2ZUV2ZW50IE5hdGl2ZSBicm93c2VyIGV2ZW50LlxuICogQHJldHVybiB7bnVtYmVyfSBOb3JtYWxpemVkIGBjaGFyQ29kZWAgcHJvcGVydHkuXG4gKi9cblxuZnVuY3Rpb24gZ2V0RXZlbnRDaGFyQ29kZShuYXRpdmVFdmVudCkge1xuICB2YXIgY2hhckNvZGU7XG4gIHZhciBrZXlDb2RlID0gbmF0aXZlRXZlbnQua2V5Q29kZTtcblxuICBpZiAoJ2NoYXJDb2RlJyBpbiBuYXRpdmVFdmVudCkge1xuICAgIGNoYXJDb2RlID0gbmF0aXZlRXZlbnQuY2hhckNvZGU7XG5cbiAgICAvLyBGRiBkb2VzIG5vdCBzZXQgYGNoYXJDb2RlYCBmb3IgdGhlIEVudGVyLWtleSwgY2hlY2sgYWdhaW5zdCBga2V5Q29kZWAuXG4gICAgaWYgKGNoYXJDb2RlID09PSAwICYmIGtleUNvZGUgPT09IDEzKSB7XG4gICAgICBjaGFyQ29kZSA9IDEzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJRTggZG9lcyBub3QgaW1wbGVtZW50IGBjaGFyQ29kZWAsIGJ1dCBga2V5Q29kZWAgaGFzIHRoZSBjb3JyZWN0IHZhbHVlLlxuICAgIGNoYXJDb2RlID0ga2V5Q29kZTtcbiAgfVxuXG4gIC8vIFNvbWUgbm9uLXByaW50YWJsZSBrZXlzIGFyZSByZXBvcnRlZCBpbiBgY2hhckNvZGVgL2BrZXlDb2RlYCwgZGlzY2FyZCB0aGVtLlxuICAvLyBNdXN0IG5vdCBkaXNjYXJkIHRoZSAobm9uLSlwcmludGFibGUgRW50ZXIta2V5LlxuICBpZiAoY2hhckNvZGUgPj0gMzIgfHwgY2hhckNvZGUgPT09IDEzKSB7XG4gICAgcmV0dXJuIGNoYXJDb2RlO1xuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0RXZlbnRDaGFyQ29kZTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgZ2V0RXZlbnRDaGFyQ29kZSA9IHJlcXVpcmUoJy4vZ2V0RXZlbnRDaGFyQ29kZScpO1xuXG4vKipcbiAqIE5vcm1hbGl6YXRpb24gb2YgZGVwcmVjYXRlZCBIVE1MNSBga2V5YCB2YWx1ZXNcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cbnZhciBub3JtYWxpemVLZXkgPSB7XG4gICdFc2MnOiAnRXNjYXBlJyxcbiAgJ1NwYWNlYmFyJzogJyAnLFxuICAnTGVmdCc6ICdBcnJvd0xlZnQnLFxuICAnVXAnOiAnQXJyb3dVcCcsXG4gICdSaWdodCc6ICdBcnJvd1JpZ2h0JyxcbiAgJ0Rvd24nOiAnQXJyb3dEb3duJyxcbiAgJ0RlbCc6ICdEZWxldGUnLFxuICAnV2luJzogJ09TJyxcbiAgJ01lbnUnOiAnQ29udGV4dE1lbnUnLFxuICAnQXBwcyc6ICdDb250ZXh0TWVudScsXG4gICdTY3JvbGwnOiAnU2Nyb2xsTG9jaycsXG4gICdNb3pQcmludGFibGVLZXknOiAnVW5pZGVudGlmaWVkJ1xufTtcblxuLyoqXG4gKiBUcmFuc2xhdGlvbiBmcm9tIGxlZ2FjeSBga2V5Q29kZWAgdG8gSFRNTDUgYGtleWBcbiAqIE9ubHkgc3BlY2lhbCBrZXlzIHN1cHBvcnRlZCwgYWxsIG90aGVycyBkZXBlbmQgb24ga2V5Ym9hcmQgbGF5b3V0IG9yIGJyb3dzZXJcbiAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQjS2V5X25hbWVzXG4gKi9cbnZhciB0cmFuc2xhdGVUb0tleSA9IHtcbiAgODogJ0JhY2tzcGFjZScsXG4gIDk6ICdUYWInLFxuICAxMjogJ0NsZWFyJyxcbiAgMTM6ICdFbnRlcicsXG4gIDE2OiAnU2hpZnQnLFxuICAxNzogJ0NvbnRyb2wnLFxuICAxODogJ0FsdCcsXG4gIDE5OiAnUGF1c2UnLFxuICAyMDogJ0NhcHNMb2NrJyxcbiAgMjc6ICdFc2NhcGUnLFxuICAzMjogJyAnLFxuICAzMzogJ1BhZ2VVcCcsXG4gIDM0OiAnUGFnZURvd24nLFxuICAzNTogJ0VuZCcsXG4gIDM2OiAnSG9tZScsXG4gIDM3OiAnQXJyb3dMZWZ0JyxcbiAgMzg6ICdBcnJvd1VwJyxcbiAgMzk6ICdBcnJvd1JpZ2h0JyxcbiAgNDA6ICdBcnJvd0Rvd24nLFxuICA0NTogJ0luc2VydCcsXG4gIDQ2OiAnRGVsZXRlJyxcbiAgMTEyOiAnRjEnLCAxMTM6ICdGMicsIDExNDogJ0YzJywgMTE1OiAnRjQnLCAxMTY6ICdGNScsIDExNzogJ0Y2JyxcbiAgMTE4OiAnRjcnLCAxMTk6ICdGOCcsIDEyMDogJ0Y5JywgMTIxOiAnRjEwJywgMTIyOiAnRjExJywgMTIzOiAnRjEyJyxcbiAgMTQ0OiAnTnVtTG9jaycsXG4gIDE0NTogJ1Njcm9sbExvY2snLFxuICAyMjQ6ICdNZXRhJ1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gbmF0aXZlRXZlbnQgTmF0aXZlIGJyb3dzZXIgZXZlbnQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IE5vcm1hbGl6ZWQgYGtleWAgcHJvcGVydHkuXG4gKi9cbmZ1bmN0aW9uIGdldEV2ZW50S2V5KG5hdGl2ZUV2ZW50KSB7XG4gIGlmIChuYXRpdmVFdmVudC5rZXkpIHtcbiAgICAvLyBOb3JtYWxpemUgaW5jb25zaXN0ZW50IHZhbHVlcyByZXBvcnRlZCBieSBicm93c2VycyBkdWUgdG9cbiAgICAvLyBpbXBsZW1lbnRhdGlvbnMgb2YgYSB3b3JraW5nIGRyYWZ0IHNwZWNpZmljYXRpb24uXG5cbiAgICAvLyBGaXJlRm94IGltcGxlbWVudHMgYGtleWAgYnV0IHJldHVybnMgYE1velByaW50YWJsZUtleWAgZm9yIGFsbFxuICAgIC8vIHByaW50YWJsZSBjaGFyYWN0ZXJzIChub3JtYWxpemVkIHRvIGBVbmlkZW50aWZpZWRgKSwgaWdub3JlIGl0LlxuICAgIHZhciBrZXkgPSBub3JtYWxpemVLZXlbbmF0aXZlRXZlbnQua2V5XSB8fCBuYXRpdmVFdmVudC5rZXk7XG4gICAgaWYgKGtleSAhPT0gJ1VuaWRlbnRpZmllZCcpIHtcbiAgICAgIHJldHVybiBrZXk7XG4gICAgfVxuICB9XG5cbiAgLy8gQnJvd3NlciBkb2VzIG5vdCBpbXBsZW1lbnQgYGtleWAsIHBvbHlmaWxsIGFzIG11Y2ggb2YgaXQgYXMgd2UgY2FuLlxuICBpZiAobmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleXByZXNzJykge1xuICAgIHZhciBjaGFyQ29kZSA9IGdldEV2ZW50Q2hhckNvZGUobmF0aXZlRXZlbnQpO1xuXG4gICAgLy8gVGhlIGVudGVyLWtleSBpcyB0ZWNobmljYWxseSBib3RoIHByaW50YWJsZSBhbmQgbm9uLXByaW50YWJsZSBhbmQgY2FuXG4gICAgLy8gdGh1cyBiZSBjYXB0dXJlZCBieSBga2V5cHJlc3NgLCBubyBvdGhlciBub24tcHJpbnRhYmxlIGtleSBzaG91bGQuXG4gICAgcmV0dXJuIGNoYXJDb2RlID09PSAxMyA/ICdFbnRlcicgOiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlKTtcbiAgfVxuICBpZiAobmF0aXZlRXZlbnQudHlwZSA9PT0gJ2tleWRvd24nIHx8IG5hdGl2ZUV2ZW50LnR5cGUgPT09ICdrZXl1cCcpIHtcbiAgICAvLyBXaGlsZSB1c2VyIGtleWJvYXJkIGxheW91dCBkZXRlcm1pbmVzIHRoZSBhY3R1YWwgbWVhbmluZyBvZiBlYWNoXG4gICAgLy8gYGtleUNvZGVgIHZhbHVlLCBhbG1vc3QgYWxsIGZ1bmN0aW9uIGtleXMgaGF2ZSBhIHVuaXZlcnNhbCB2YWx1ZS5cbiAgICByZXR1cm4gdHJhbnNsYXRlVG9LZXlbbmF0aXZlRXZlbnQua2V5Q29kZV0gfHwgJ1VuaWRlbnRpZmllZCc7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldEV2ZW50S2V5OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogVHJhbnNsYXRpb24gZnJvbSBtb2RpZmllciBrZXkgdG8gdGhlIGFzc29jaWF0ZWQgcHJvcGVydHkgaW4gdGhlIGV2ZW50LlxuICogQHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2tleXMtTW9kaWZpZXJzXG4gKi9cblxudmFyIG1vZGlmaWVyS2V5VG9Qcm9wID0ge1xuICAnQWx0JzogJ2FsdEtleScsXG4gICdDb250cm9sJzogJ2N0cmxLZXknLFxuICAnTWV0YSc6ICdtZXRhS2V5JyxcbiAgJ1NoaWZ0JzogJ3NoaWZ0S2V5J1xufTtcblxuLy8gSUU4IGRvZXMgbm90IGltcGxlbWVudCBnZXRNb2RpZmllclN0YXRlIHNvIHdlIHNpbXBseSBtYXAgaXQgdG8gdGhlIG9ubHlcbi8vIG1vZGlmaWVyIGtleXMgZXhwb3NlZCBieSB0aGUgZXZlbnQgaXRzZWxmLCBkb2VzIG5vdCBzdXBwb3J0IExvY2sta2V5cy5cbi8vIEN1cnJlbnRseSwgYWxsIG1ham9yIGJyb3dzZXJzIGV4Y2VwdCBDaHJvbWUgc2VlbXMgdG8gc3VwcG9ydCBMb2NrLWtleXMuXG5mdW5jdGlvbiBtb2RpZmllclN0YXRlR2V0dGVyKGtleUFyZykge1xuICB2YXIgc3ludGhldGljRXZlbnQgPSB0aGlzO1xuICB2YXIgbmF0aXZlRXZlbnQgPSBzeW50aGV0aWNFdmVudC5uYXRpdmVFdmVudDtcbiAgaWYgKG5hdGl2ZUV2ZW50LmdldE1vZGlmaWVyU3RhdGUpIHtcbiAgICByZXR1cm4gbmF0aXZlRXZlbnQuZ2V0TW9kaWZpZXJTdGF0ZShrZXlBcmcpO1xuICB9XG4gIHZhciBrZXlQcm9wID0gbW9kaWZpZXJLZXlUb1Byb3Bba2V5QXJnXTtcbiAgcmV0dXJuIGtleVByb3AgPyAhIW5hdGl2ZUV2ZW50W2tleVByb3BdIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50TW9kaWZpZXJTdGF0ZShuYXRpdmVFdmVudCkge1xuICByZXR1cm4gbW9kaWZpZXJTdGF0ZUdldHRlcjtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRFdmVudE1vZGlmaWVyU3RhdGU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBHZXRzIHRoZSB0YXJnZXQgbm9kZSBmcm9tIGEgbmF0aXZlIGJyb3dzZXIgZXZlbnQgYnkgYWNjb3VudGluZyBmb3JcbiAqIGluY29uc2lzdGVuY2llcyBpbiBicm93c2VyIERPTSBBUElzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBuYXRpdmVFdmVudCBOYXRpdmUgYnJvd3NlciBldmVudC5cbiAqIEByZXR1cm4ge0RPTUV2ZW50VGFyZ2V0fSBUYXJnZXQgbm9kZS5cbiAqL1xuXG5mdW5jdGlvbiBnZXRFdmVudFRhcmdldChuYXRpdmVFdmVudCkge1xuICB2YXIgdGFyZ2V0ID0gbmF0aXZlRXZlbnQudGFyZ2V0IHx8IG5hdGl2ZUV2ZW50LnNyY0VsZW1lbnQgfHwgd2luZG93O1xuXG4gIC8vIE5vcm1hbGl6ZSBTVkcgPHVzZT4gZWxlbWVudCBldmVudHMgIzQ5NjNcbiAgaWYgKHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCkge1xuICAgIHRhcmdldCA9IHRhcmdldC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudDtcbiAgfVxuXG4gIC8vIFNhZmFyaSBtYXkgZmlyZSBldmVudHMgb24gdGV4dCBub2RlcyAoTm9kZS5URVhUX05PREUgaXMgMykuXG4gIC8vIEBzZWUgaHR0cDovL3d3dy5xdWlya3Ntb2RlLm9yZy9qcy9ldmVudHNfcHJvcGVydGllcy5odG1sXG4gIHJldHVybiB0YXJnZXQubm9kZVR5cGUgPT09IDMgPyB0YXJnZXQucGFyZW50Tm9kZSA6IHRhcmdldDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRFdmVudFRhcmdldDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3ROb2RlVHlwZXMgPSByZXF1aXJlKCcuL1JlYWN0Tm9kZVR5cGVzJyk7XG5cbmZ1bmN0aW9uIGdldEhvc3RDb21wb25lbnRGcm9tQ29tcG9zaXRlKGluc3QpIHtcbiAgdmFyIHR5cGU7XG5cbiAgd2hpbGUgKCh0eXBlID0gaW5zdC5fcmVuZGVyZWROb2RlVHlwZSkgPT09IFJlYWN0Tm9kZVR5cGVzLkNPTVBPU0lURSkge1xuICAgIGluc3QgPSBpbnN0Ll9yZW5kZXJlZENvbXBvbmVudDtcbiAgfVxuXG4gIGlmICh0eXBlID09PSBSZWFjdE5vZGVUeXBlcy5IT1NUKSB7XG4gICAgcmV0dXJuIGluc3QuX3JlbmRlcmVkQ29tcG9uZW50O1xuICB9IGVsc2UgaWYgKHR5cGUgPT09IFJlYWN0Tm9kZVR5cGVzLkVNUFRZKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRIb3N0Q29tcG9uZW50RnJvbUNvbXBvc2l0ZTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKiBcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qIGdsb2JhbCBTeW1ib2wgKi9cblxudmFyIElURVJBVE9SX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgU3ltYm9sLml0ZXJhdG9yO1xudmFyIEZBVVhfSVRFUkFUT1JfU1lNQk9MID0gJ0BAaXRlcmF0b3InOyAvLyBCZWZvcmUgU3ltYm9sIHNwZWMuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgaXRlcmF0b3IgbWV0aG9kIGZ1bmN0aW9uIGNvbnRhaW5lZCBvbiB0aGUgaXRlcmFibGUgb2JqZWN0LlxuICpcbiAqIEJlIHN1cmUgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBpdGVyYWJsZSBhcyBjb250ZXh0OlxuICpcbiAqICAgICB2YXIgaXRlcmF0b3JGbiA9IGdldEl0ZXJhdG9yRm4obXlJdGVyYWJsZSk7XG4gKiAgICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAqICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChteUl0ZXJhYmxlKTtcbiAqICAgICAgIC4uLlxuICogICAgIH1cbiAqXG4gKiBAcGFyYW0gez9vYmplY3R9IG1heWJlSXRlcmFibGVcbiAqIEByZXR1cm4gez9mdW5jdGlvbn1cbiAqL1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JGbihtYXliZUl0ZXJhYmxlKSB7XG4gIHZhciBpdGVyYXRvckZuID0gbWF5YmVJdGVyYWJsZSAmJiAoSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbSVRFUkFUT1JfU1lNQk9MXSB8fCBtYXliZUl0ZXJhYmxlW0ZBVVhfSVRFUkFUT1JfU1lNQk9MXSk7XG4gIGlmICh0eXBlb2YgaXRlcmF0b3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBpdGVyYXRvckZuO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0SXRlcmF0b3JGbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEdpdmVuIGFueSBub2RlIHJldHVybiB0aGUgZmlyc3QgbGVhZiBub2RlIHdpdGhvdXQgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHtET01FbGVtZW50fERPTVRleHROb2RlfVxuICovXG5cbmZ1bmN0aW9uIGdldExlYWZOb2RlKG5vZGUpIHtcbiAgd2hpbGUgKG5vZGUgJiYgbm9kZS5maXJzdENoaWxkKSB7XG4gICAgbm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgfVxuICByZXR1cm4gbm9kZTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG5leHQgc2libGluZyB3aXRoaW4gYSBjb250YWluZXIuIFRoaXMgd2lsbCB3YWxrIHVwIHRoZVxuICogRE9NIGlmIGEgbm9kZSdzIHNpYmxpbmdzIGhhdmUgYmVlbiBleGhhdXN0ZWQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fERPTVRleHROb2RlfSBub2RlXG4gKiBAcmV0dXJuIHs/RE9NRWxlbWVudHxET01UZXh0Tm9kZX1cbiAqL1xuZnVuY3Rpb24gZ2V0U2libGluZ05vZGUobm9kZSkge1xuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlLm5leHRTaWJsaW5nKSB7XG4gICAgICByZXR1cm4gbm9kZS5uZXh0U2libGluZztcbiAgICB9XG4gICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgfVxufVxuXG4vKipcbiAqIEdldCBvYmplY3QgZGVzY3JpYmluZyB0aGUgbm9kZXMgd2hpY2ggY29udGFpbiBjaGFyYWN0ZXJzIGF0IG9mZnNldC5cbiAqXG4gKiBAcGFyYW0ge0RPTUVsZW1lbnR8RE9NVGV4dE5vZGV9IHJvb3RcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXRcbiAqIEByZXR1cm4gez9vYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGdldE5vZGVGb3JDaGFyYWN0ZXJPZmZzZXQocm9vdCwgb2Zmc2V0KSB7XG4gIHZhciBub2RlID0gZ2V0TGVhZk5vZGUocm9vdCk7XG4gIHZhciBub2RlU3RhcnQgPSAwO1xuICB2YXIgbm9kZUVuZCA9IDA7XG5cbiAgd2hpbGUgKG5vZGUpIHtcbiAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgbm9kZUVuZCA9IG5vZGVTdGFydCArIG5vZGUudGV4dENvbnRlbnQubGVuZ3RoO1xuXG4gICAgICBpZiAobm9kZVN0YXJ0IDw9IG9mZnNldCAmJiBub2RlRW5kID49IG9mZnNldCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgb2Zmc2V0OiBvZmZzZXQgLSBub2RlU3RhcnRcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgbm9kZVN0YXJ0ID0gbm9kZUVuZDtcbiAgICB9XG5cbiAgICBub2RlID0gZ2V0TGVhZk5vZGUoZ2V0U2libGluZ05vZGUobm9kZSkpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0Tm9kZUZvckNoYXJhY3Rlck9mZnNldDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xuXG52YXIgY29udGVudEtleSA9IG51bGw7XG5cbi8qKlxuICogR2V0cyB0aGUga2V5IHVzZWQgdG8gYWNjZXNzIHRleHQgY29udGVudCBvbiBhIERPTSBub2RlLlxuICpcbiAqIEByZXR1cm4gez9zdHJpbmd9IEtleSB1c2VkIHRvIGFjY2VzcyB0ZXh0IGNvbnRlbnQuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gZ2V0VGV4dENvbnRlbnRBY2Nlc3NvcigpIHtcbiAgaWYgKCFjb250ZW50S2V5ICYmIEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkge1xuICAgIC8vIFByZWZlciB0ZXh0Q29udGVudCB0byBpbm5lclRleHQgYmVjYXVzZSBtYW55IGJyb3dzZXJzIHN1cHBvcnQgYm90aCBidXRcbiAgICAvLyBTVkcgPHRleHQ+IGVsZW1lbnRzIGRvbid0IHN1cHBvcnQgaW5uZXJUZXh0IGV2ZW4gd2hlbiA8ZGl2PiBkb2VzLlxuICAgIGNvbnRlbnRLZXkgPSAndGV4dENvbnRlbnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCA/ICd0ZXh0Q29udGVudCcgOiAnaW5uZXJUZXh0JztcbiAgfVxuICByZXR1cm4gY29udGVudEtleTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRUZXh0Q29udGVudEFjY2Vzc29yOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBFeGVjdXRpb25FbnZpcm9ubWVudCA9IHJlcXVpcmUoJ2ZianMvbGliL0V4ZWN1dGlvbkVudmlyb25tZW50Jyk7XG5cbi8qKlxuICogR2VuZXJhdGUgYSBtYXBwaW5nIG9mIHN0YW5kYXJkIHZlbmRvciBwcmVmaXhlcyB1c2luZyB0aGUgZGVmaW5lZCBzdHlsZSBwcm9wZXJ0eSBhbmQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3R5bGVQcm9wXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5mdW5jdGlvbiBtYWtlUHJlZml4TWFwKHN0eWxlUHJvcCwgZXZlbnROYW1lKSB7XG4gIHZhciBwcmVmaXhlcyA9IHt9O1xuXG4gIHByZWZpeGVzW3N0eWxlUHJvcC50b0xvd2VyQ2FzZSgpXSA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuICBwcmVmaXhlc1snV2Via2l0JyArIHN0eWxlUHJvcF0gPSAnd2Via2l0JyArIGV2ZW50TmFtZTtcbiAgcHJlZml4ZXNbJ01veicgKyBzdHlsZVByb3BdID0gJ21veicgKyBldmVudE5hbWU7XG4gIHByZWZpeGVzWydtcycgKyBzdHlsZVByb3BdID0gJ01TJyArIGV2ZW50TmFtZTtcbiAgcHJlZml4ZXNbJ08nICsgc3R5bGVQcm9wXSA9ICdvJyArIGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gIHJldHVybiBwcmVmaXhlcztcbn1cblxuLyoqXG4gKiBBIGxpc3Qgb2YgZXZlbnQgbmFtZXMgdG8gYSBjb25maWd1cmFibGUgbGlzdCBvZiB2ZW5kb3IgcHJlZml4ZXMuXG4gKi9cbnZhciB2ZW5kb3JQcmVmaXhlcyA9IHtcbiAgYW5pbWF0aW9uZW5kOiBtYWtlUHJlZml4TWFwKCdBbmltYXRpb24nLCAnQW5pbWF0aW9uRW5kJyksXG4gIGFuaW1hdGlvbml0ZXJhdGlvbjogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvbkl0ZXJhdGlvbicpLFxuICBhbmltYXRpb25zdGFydDogbWFrZVByZWZpeE1hcCgnQW5pbWF0aW9uJywgJ0FuaW1hdGlvblN0YXJ0JyksXG4gIHRyYW5zaXRpb25lbmQ6IG1ha2VQcmVmaXhNYXAoJ1RyYW5zaXRpb24nLCAnVHJhbnNpdGlvbkVuZCcpXG59O1xuXG4vKipcbiAqIEV2ZW50IG5hbWVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gZGV0ZWN0ZWQgYW5kIHByZWZpeGVkIChpZiBhcHBsaWNhYmxlKS5cbiAqL1xudmFyIHByZWZpeGVkRXZlbnROYW1lcyA9IHt9O1xuXG4vKipcbiAqIEVsZW1lbnQgdG8gY2hlY2sgZm9yIHByZWZpeGVzIG9uLlxuICovXG52YXIgc3R5bGUgPSB7fTtcblxuLyoqXG4gKiBCb290c3RyYXAgaWYgYSBET00gZXhpc3RzLlxuICovXG5pZiAoRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NKSB7XG4gIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jykuc3R5bGU7XG5cbiAgLy8gT24gc29tZSBwbGF0Zm9ybXMsIGluIHBhcnRpY3VsYXIgc29tZSByZWxlYXNlcyBvZiBBbmRyb2lkIDQueCxcbiAgLy8gdGhlIHVuLXByZWZpeGVkIFwiYW5pbWF0aW9uXCIgYW5kIFwidHJhbnNpdGlvblwiIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgb24gdGhlXG4gIC8vIHN0eWxlIG9iamVjdCBidXQgdGhlIGV2ZW50cyB0aGF0IGZpcmUgd2lsbCBzdGlsbCBiZSBwcmVmaXhlZCwgc28gd2UgbmVlZFxuICAvLyB0byBjaGVjayBpZiB0aGUgdW4tcHJlZml4ZWQgZXZlbnRzIGFyZSB1c2FibGUsIGFuZCBpZiBub3QgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgbWFwLlxuICBpZiAoISgnQW5pbWF0aW9uRXZlbnQnIGluIHdpbmRvdykpIHtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbjtcbiAgICBkZWxldGUgdmVuZG9yUHJlZml4ZXMuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uO1xuICB9XG5cbiAgLy8gU2FtZSBhcyBhYm92ZVxuICBpZiAoISgnVHJhbnNpdGlvbkV2ZW50JyBpbiB3aW5kb3cpKSB7XG4gICAgZGVsZXRlIHZlbmRvclByZWZpeGVzLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbjtcbiAgfVxufVxuXG4vKipcbiAqIEF0dGVtcHRzIHRvIGRldGVybWluZSB0aGUgY29ycmVjdCB2ZW5kb3IgcHJlZml4ZWQgZXZlbnQgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRWZW5kb3JQcmVmaXhlZEV2ZW50TmFtZShldmVudE5hbWUpIHtcbiAgaWYgKHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIHByZWZpeGVkRXZlbnROYW1lc1tldmVudE5hbWVdO1xuICB9IGVsc2UgaWYgKCF2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdKSB7XG4gICAgcmV0dXJuIGV2ZW50TmFtZTtcbiAgfVxuXG4gIHZhciBwcmVmaXhNYXAgPSB2ZW5kb3JQcmVmaXhlc1tldmVudE5hbWVdO1xuXG4gIGZvciAodmFyIHN0eWxlUHJvcCBpbiBwcmVmaXhNYXApIHtcbiAgICBpZiAocHJlZml4TWFwLmhhc093blByb3BlcnR5KHN0eWxlUHJvcCkgJiYgc3R5bGVQcm9wIGluIHN0eWxlKSB7XG4gICAgICByZXR1cm4gcHJlZml4ZWRFdmVudE5hbWVzW2V2ZW50TmFtZV0gPSBwcmVmaXhNYXBbc3R5bGVQcm9wXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2V0VmVuZG9yUHJlZml4ZWRFdmVudE5hbWU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKSxcbiAgICBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3RDb21wb3NpdGVDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50Jyk7XG52YXIgUmVhY3RFbXB0eUNvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RFbXB0eUNvbXBvbmVudCcpO1xudmFyIFJlYWN0SG9zdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RIb3N0Q29tcG9uZW50Jyk7XG5cbnZhciBnZXROZXh0RGVidWdJRCA9IHJlcXVpcmUoJ3JlYWN0L2xpYi9nZXROZXh0RGVidWdJRCcpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbi8vIFRvIGF2b2lkIGEgY3ljbGljIGRlcGVuZGVuY3ksIHdlIGNyZWF0ZSB0aGUgZmluYWwgY2xhc3MgaW4gdGhpcyBtb2R1bGVcbnZhciBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudFdyYXBwZXIgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICB0aGlzLmNvbnN0cnVjdChlbGVtZW50KTtcbn07XG5cbmZ1bmN0aW9uIGdldERlY2xhcmF0aW9uRXJyb3JBZGRlbmR1bShvd25lcikge1xuICBpZiAob3duZXIpIHtcbiAgICB2YXIgbmFtZSA9IG93bmVyLmdldE5hbWUoKTtcbiAgICBpZiAobmFtZSkge1xuICAgICAgcmV0dXJuICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSB0eXBlIHJlZmVyZW5jZSBpcyBhIGtub3duIGludGVybmFsIHR5cGUuIEkuZS4gbm90IGEgdXNlclxuICogcHJvdmlkZWQgY29tcG9zaXRlIHR5cGUuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gdHlwZVxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSB2YWxpZCBpbnRlcm5hbCB0eXBlLlxuICovXG5mdW5jdGlvbiBpc0ludGVybmFsQ29tcG9uZW50VHlwZSh0eXBlKSB7XG4gIHJldHVybiB0eXBlb2YgdHlwZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdHlwZS5wcm90b3R5cGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB0eXBlLnByb3RvdHlwZS5tb3VudENvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdHlwZS5wcm90b3R5cGUucmVjZWl2ZUNvbXBvbmVudCA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuLyoqXG4gKiBHaXZlbiBhIFJlYWN0Tm9kZSwgY3JlYXRlIGFuIGluc3RhbmNlIHRoYXQgd2lsbCBhY3R1YWxseSBiZSBtb3VudGVkLlxuICpcbiAqIEBwYXJhbSB7UmVhY3ROb2RlfSBub2RlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZEhhdmVEZWJ1Z0lEXG4gKiBAcmV0dXJuIHtvYmplY3R9IEEgbmV3IGluc3RhbmNlIG9mIHRoZSBlbGVtZW50J3MgY29uc3RydWN0b3IuXG4gKiBAcHJvdGVjdGVkXG4gKi9cbmZ1bmN0aW9uIGluc3RhbnRpYXRlUmVhY3RDb21wb25lbnQobm9kZSwgc2hvdWxkSGF2ZURlYnVnSUQpIHtcbiAgdmFyIGluc3RhbmNlO1xuXG4gIGlmIChub2RlID09PSBudWxsIHx8IG5vZGUgPT09IGZhbHNlKSB7XG4gICAgaW5zdGFuY2UgPSBSZWFjdEVtcHR5Q29tcG9uZW50LmNyZWF0ZShpbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygbm9kZSA9PT0gJ29iamVjdCcpIHtcbiAgICB2YXIgZWxlbWVudCA9IG5vZGU7XG4gICAgdmFyIHR5cGUgPSBlbGVtZW50LnR5cGU7XG4gICAgaWYgKHR5cGVvZiB0eXBlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgdmFyIGluZm8gPSAnJztcbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgJ2l0XFwncyBkZWZpbmVkIGluLic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGluZm8gKz0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKGVsZW1lbnQuX293bmVyKTtcbiAgICAgICFmYWxzZSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRWxlbWVudCB0eXBlIGlzIGludmFsaWQ6IGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRzKSBidXQgZ290OiAlcy4lcycsIHR5cGUgPT0gbnVsbCA/IHR5cGUgOiB0eXBlb2YgdHlwZSwgaW5mbykgOiBfcHJvZEludmFyaWFudCgnMTMwJywgdHlwZSA9PSBudWxsID8gdHlwZSA6IHR5cGVvZiB0eXBlLCBpbmZvKSA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIGNhc2Ugc3RyaW5nIHZhbHVlc1xuICAgIGlmICh0eXBlb2YgZWxlbWVudC50eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgaW5zdGFuY2UgPSBSZWFjdEhvc3RDb21wb25lbnQuY3JlYXRlSW50ZXJuYWxDb21wb25lbnQoZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChpc0ludGVybmFsQ29tcG9uZW50VHlwZShlbGVtZW50LnR5cGUpKSB7XG4gICAgICAvLyBUaGlzIGlzIHRlbXBvcmFyaWx5IGF2YWlsYWJsZSBmb3IgY3VzdG9tIGNvbXBvbmVudHMgdGhhdCBhcmUgbm90IHN0cmluZ1xuICAgICAgLy8gcmVwcmVzZW50YXRpb25zLiBJLmUuIEFSVC4gT25jZSB0aG9zZSBhcmUgdXBkYXRlZCB0byB1c2UgdGhlIHN0cmluZ1xuICAgICAgLy8gcmVwcmVzZW50YXRpb24sIHdlIGNhbiBkcm9wIHRoaXMgY29kZSBwYXRoLlxuICAgICAgaW5zdGFuY2UgPSBuZXcgZWxlbWVudC50eXBlKGVsZW1lbnQpO1xuXG4gICAgICAvLyBXZSByZW5hbWVkIHRoaXMuIEFsbG93IHRoZSBvbGQgbmFtZSBmb3IgY29tcGF0LiA6KFxuICAgICAgaWYgKCFpbnN0YW5jZS5nZXRIb3N0Tm9kZSkge1xuICAgICAgICBpbnN0YW5jZS5nZXRIb3N0Tm9kZSA9IGluc3RhbmNlLmdldE5hdGl2ZU5vZGU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlID0gbmV3IFJlYWN0Q29tcG9zaXRlQ29tcG9uZW50V3JhcHBlcihlbGVtZW50KTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIG5vZGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBub2RlID09PSAnbnVtYmVyJykge1xuICAgIGluc3RhbmNlID0gUmVhY3RIb3N0Q29tcG9uZW50LmNyZWF0ZUluc3RhbmNlRm9yVGV4dChub2RlKTtcbiAgfSBlbHNlIHtcbiAgICAhZmFsc2UgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0VuY291bnRlcmVkIGludmFsaWQgUmVhY3Qgbm9kZSBvZiB0eXBlICVzJywgdHlwZW9mIG5vZGUpIDogX3Byb2RJbnZhcmlhbnQoJzEzMScsIHR5cGVvZiBub2RlKSA6IHZvaWQgMDtcbiAgfVxuXG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyh0eXBlb2YgaW5zdGFuY2UubW91bnRDb21wb25lbnQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLnJlY2VpdmVDb21wb25lbnQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIGluc3RhbmNlLmdldEhvc3ROb2RlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBpbnN0YW5jZS51bm1vdW50Q29tcG9uZW50ID09PSAnZnVuY3Rpb24nLCAnT25seSBSZWFjdCBDb21wb25lbnRzIGNhbiBiZSBtb3VudGVkLicpIDogdm9pZCAwO1xuICB9XG5cbiAgLy8gVGhlc2UgdHdvIGZpZWxkcyBhcmUgdXNlZCBieSB0aGUgRE9NIGFuZCBBUlQgZGlmZmluZyBhbGdvcml0aG1zXG4gIC8vIHJlc3BlY3RpdmVseS4gSW5zdGVhZCBvZiB1c2luZyBleHBhbmRvcyBvbiBjb21wb25lbnRzLCB3ZSBzaG91bGQgYmVcbiAgLy8gc3RvcmluZyB0aGUgc3RhdGUgbmVlZGVkIGJ5IHRoZSBkaWZmaW5nIGFsZ29yaXRobXMgZWxzZXdoZXJlLlxuICBpbnN0YW5jZS5fbW91bnRJbmRleCA9IDA7XG4gIGluc3RhbmNlLl9tb3VudEltYWdlID0gbnVsbDtcblxuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpbnN0YW5jZS5fZGVidWdJRCA9IHNob3VsZEhhdmVEZWJ1Z0lEID8gZ2V0TmV4dERlYnVnSUQoKSA6IDA7XG4gIH1cblxuICAvLyBJbnRlcm5hbCBpbnN0YW5jZXMgc2hvdWxkIGZ1bGx5IGNvbnN0cnVjdGVkIGF0IHRoaXMgcG9pbnQsIHNvIHRoZXkgc2hvdWxkXG4gIC8vIG5vdCBnZXQgYW55IG5ldyBmaWVsZHMgYWRkZWQgdG8gdGhlbSBhdCB0aGlzIHBvaW50LlxuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zKSB7XG4gICAgICBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoaW5zdGFuY2UpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpbnN0YW5jZTtcbn1cblxuX2Fzc2lnbihSZWFjdENvbXBvc2l0ZUNvbXBvbmVudFdyYXBwZXIucHJvdG90eXBlLCBSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCwge1xuICBfaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudDogaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudFxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gaW5zdGFudGlhdGVSZWFjdENvbXBvbmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xuXG52YXIgdXNlSGFzRmVhdHVyZTtcbmlmIChFeGVjdXRpb25FbnZpcm9ubWVudC5jYW5Vc2VET00pIHtcbiAgdXNlSGFzRmVhdHVyZSA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uICYmIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUgJiZcbiAgLy8gYWx3YXlzIHJldHVybnMgdHJ1ZSBpbiBuZXdlciBicm93c2VycyBhcyBwZXIgdGhlIHN0YW5kYXJkLlxuICAvLyBAc2VlIGh0dHA6Ly9kb20uc3BlYy53aGF0d2cub3JnLyNkb20tZG9taW1wbGVtZW50YXRpb24taGFzZmVhdHVyZVxuICBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCcnLCAnJykgIT09IHRydWU7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGV2ZW50IGlzIHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBleGVjdXRpb24gZW52aXJvbm1lbnQuXG4gKlxuICogTk9URTogVGhpcyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSBmb3Igbm9uLWdlbmVyaWMgZXZlbnRzIHN1Y2ggYXMgYGNoYW5nZWAsXG4gKiBgcmVzZXRgLCBgbG9hZGAsIGBlcnJvcmAsIGFuZCBgc2VsZWN0YC5cbiAqXG4gKiBCb3Jyb3dzIGZyb20gTW9kZXJuaXpyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVTdWZmaXggRXZlbnQgbmFtZSwgZS5nLiBcImNsaWNrXCIuXG4gKiBAcGFyYW0gez9ib29sZWFufSBjYXB0dXJlIENoZWNrIGlmIHRoZSBjYXB0dXJlIHBoYXNlIGlzIHN1cHBvcnRlZC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGV2ZW50IGlzIHN1cHBvcnRlZC5cbiAqIEBpbnRlcm5hbFxuICogQGxpY2Vuc2UgTW9kZXJuaXpyIDMuMC4wcHJlIChDdXN0b20gQnVpbGQpIHwgTUlUXG4gKi9cbmZ1bmN0aW9uIGlzRXZlbnRTdXBwb3J0ZWQoZXZlbnROYW1lU3VmZml4LCBjYXB0dXJlKSB7XG4gIGlmICghRXhlY3V0aW9uRW52aXJvbm1lbnQuY2FuVXNlRE9NIHx8IGNhcHR1cmUgJiYgISgnYWRkRXZlbnRMaXN0ZW5lcicgaW4gZG9jdW1lbnQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGV2ZW50TmFtZSA9ICdvbicgKyBldmVudE5hbWVTdWZmaXg7XG4gIHZhciBpc1N1cHBvcnRlZCA9IGV2ZW50TmFtZSBpbiBkb2N1bWVudDtcblxuICBpZiAoIWlzU3VwcG9ydGVkKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShldmVudE5hbWUsICdyZXR1cm47Jyk7XG4gICAgaXNTdXBwb3J0ZWQgPSB0eXBlb2YgZWxlbWVudFtldmVudE5hbWVdID09PSAnZnVuY3Rpb24nO1xuICB9XG5cbiAgaWYgKCFpc1N1cHBvcnRlZCAmJiB1c2VIYXNGZWF0dXJlICYmIGV2ZW50TmFtZVN1ZmZpeCA9PT0gJ3doZWVsJykge1xuICAgIC8vIFRoaXMgaXMgdGhlIG9ubHkgd2F5IHRvIHRlc3Qgc3VwcG9ydCBmb3IgdGhlIGB3aGVlbGAgZXZlbnQgaW4gSUU5Ky5cbiAgICBpc1N1cHBvcnRlZCA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoJ0V2ZW50cy53aGVlbCcsICczLjAnKTtcbiAgfVxuXG4gIHJldHVybiBpc1N1cHBvcnRlZDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0V2ZW50U3VwcG9ydGVkOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBAc2VlIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL3RoZS1pbnB1dC1lbGVtZW50Lmh0bWwjaW5wdXQtdHlwZS1hdHRyLXN1bW1hcnlcbiAqL1xuXG52YXIgc3VwcG9ydGVkSW5wdXRUeXBlcyA9IHtcbiAgJ2NvbG9yJzogdHJ1ZSxcbiAgJ2RhdGUnOiB0cnVlLFxuICAnZGF0ZXRpbWUnOiB0cnVlLFxuICAnZGF0ZXRpbWUtbG9jYWwnOiB0cnVlLFxuICAnZW1haWwnOiB0cnVlLFxuICAnbW9udGgnOiB0cnVlLFxuICAnbnVtYmVyJzogdHJ1ZSxcbiAgJ3Bhc3N3b3JkJzogdHJ1ZSxcbiAgJ3JhbmdlJzogdHJ1ZSxcbiAgJ3NlYXJjaCc6IHRydWUsXG4gICd0ZWwnOiB0cnVlLFxuICAndGV4dCc6IHRydWUsXG4gICd0aW1lJzogdHJ1ZSxcbiAgJ3VybCc6IHRydWUsXG4gICd3ZWVrJzogdHJ1ZVxufTtcblxuZnVuY3Rpb24gaXNUZXh0SW5wdXRFbGVtZW50KGVsZW0pIHtcbiAgdmFyIG5vZGVOYW1lID0gZWxlbSAmJiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcpIHtcbiAgICByZXR1cm4gISFzdXBwb3J0ZWRJbnB1dFR5cGVzW2VsZW0udHlwZV07XG4gIH1cblxuICBpZiAobm9kZU5hbWUgPT09ICd0ZXh0YXJlYScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1RleHRJbnB1dEVsZW1lbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3NlciA9IHJlcXVpcmUoJy4vZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyJyk7XG5cbi8qKlxuICogRXNjYXBlcyBhdHRyaWJ1dGUgdmFsdWUgdG8gcHJldmVudCBzY3JpcHRpbmcgYXR0YWNrcy5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIGVzY2FwZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gQW4gZXNjYXBlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIHF1b3RlQXR0cmlidXRlVmFsdWVGb3JCcm93c2VyKHZhbHVlKSB7XG4gIHJldHVybiAnXCInICsgZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyKHZhbHVlKSArICdcIic7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcXVvdGVBdHRyaWJ1dGVWYWx1ZUZvckJyb3dzZXI7IiwiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogV0FSTklORzogRE8gTk9UIG1hbnVhbGx5IHJlcXVpcmUgdGhpcyBtb2R1bGUuXG4gKiBUaGlzIGlzIGEgcmVwbGFjZW1lbnQgZm9yIGBpbnZhcmlhbnQoLi4uKWAgdXNlZCBieSB0aGUgZXJyb3IgY29kZSBzeXN0ZW1cbiAqIGFuZCB3aWxsIF9vbmx5XyBiZSByZXF1aXJlZCBieSB0aGUgY29ycmVzcG9uZGluZyBiYWJlbCBwYXNzLlxuICogSXQgYWx3YXlzIHRocm93cy5cbiAqL1xuXG5mdW5jdGlvbiByZWFjdFByb2RJbnZhcmlhbnQoY29kZSkge1xuICB2YXIgYXJnQ291bnQgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcblxuICB2YXIgbWVzc2FnZSA9ICdNaW5pZmllZCBSZWFjdCBlcnJvciAjJyArIGNvZGUgKyAnOyB2aXNpdCAnICsgJ2h0dHA6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PScgKyBjb2RlO1xuXG4gIGZvciAodmFyIGFyZ0lkeCA9IDA7IGFyZ0lkeCA8IGFyZ0NvdW50OyBhcmdJZHgrKykge1xuICAgIG1lc3NhZ2UgKz0gJyZhcmdzW109JyArIGVuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbYXJnSWR4ICsgMV0pO1xuICB9XG5cbiAgbWVzc2FnZSArPSAnIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCcgKyAnIGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLic7XG5cbiAgdmFyIGVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICBlcnJvci5uYW1lID0gJ0ludmFyaWFudCBWaW9sYXRpb24nO1xuICBlcnJvci5mcmFtZXNUb1BvcCA9IDE7IC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgcmVhY3RQcm9kSW52YXJpYW50J3Mgb3duIGZyYW1lXG5cbiAgdGhyb3cgZXJyb3I7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVhY3RQcm9kSW52YXJpYW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdE1vdW50ID0gcmVxdWlyZSgnLi9SZWFjdE1vdW50Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RNb3VudC5yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xudmFyIERPTU5hbWVzcGFjZXMgPSByZXF1aXJlKCcuL0RPTU5hbWVzcGFjZXMnKTtcblxudmFyIFdISVRFU1BBQ0VfVEVTVCA9IC9eWyBcXHJcXG5cXHRcXGZdLztcbnZhciBOT05WSVNJQkxFX1RFU1QgPSAvPCghLS18bGlua3xub3NjcmlwdHxtZXRhfHNjcmlwdHxzdHlsZSlbIFxcclxcblxcdFxcZlxcLz5dLztcblxudmFyIGNyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24gPSByZXF1aXJlKCcuL2NyZWF0ZU1pY3Jvc29mdFVuc2FmZUxvY2FsRnVuY3Rpb24nKTtcblxuLy8gU1ZHIHRlbXAgY29udGFpbmVyIGZvciBJRSBsYWNraW5nIGlubmVySFRNTFxudmFyIHJldXNhYmxlU1ZHQ29udGFpbmVyO1xuXG4vKipcbiAqIFNldCB0aGUgaW5uZXJIVE1MIHByb3BlcnR5IG9mIGEgbm9kZSwgZW5zdXJpbmcgdGhhdCB3aGl0ZXNwYWNlIGlzIHByZXNlcnZlZFxuICogZXZlbiBpbiBJRTguXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuICogQGludGVybmFsXG4gKi9cbnZhciBzZXRJbm5lckhUTUwgPSBjcmVhdGVNaWNyb3NvZnRVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uIChub2RlLCBodG1sKSB7XG4gIC8vIElFIGRvZXMgbm90IGhhdmUgaW5uZXJIVE1MIGZvciBTVkcgbm9kZXMsIHNvIGluc3RlYWQgd2UgaW5qZWN0IHRoZVxuICAvLyBuZXcgbWFya3VwIGluIGEgdGVtcCBub2RlIGFuZCB0aGVuIG1vdmUgdGhlIGNoaWxkIG5vZGVzIGFjcm9zcyBpbnRvXG4gIC8vIHRoZSB0YXJnZXQgbm9kZVxuICBpZiAobm9kZS5uYW1lc3BhY2VVUkkgPT09IERPTU5hbWVzcGFjZXMuc3ZnICYmICEoJ2lubmVySFRNTCcgaW4gbm9kZSkpIHtcbiAgICByZXVzYWJsZVNWR0NvbnRhaW5lciA9IHJldXNhYmxlU1ZHQ29udGFpbmVyIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHJldXNhYmxlU1ZHQ29udGFpbmVyLmlubmVySFRNTCA9ICc8c3ZnPicgKyBodG1sICsgJzwvc3ZnPic7XG4gICAgdmFyIHN2Z05vZGUgPSByZXVzYWJsZVNWR0NvbnRhaW5lci5maXJzdENoaWxkO1xuICAgIHdoaWxlIChzdmdOb2RlLmZpcnN0Q2hpbGQpIHtcbiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoc3ZnTm9kZS5maXJzdENoaWxkKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbm9kZS5pbm5lckhUTUwgPSBodG1sO1xuICB9XG59KTtcblxuaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkge1xuICAvLyBJRTg6IFdoZW4gdXBkYXRpbmcgYSBqdXN0IGNyZWF0ZWQgbm9kZSB3aXRoIGlubmVySFRNTCBvbmx5IGxlYWRpbmdcbiAgLy8gd2hpdGVzcGFjZSBpcyByZW1vdmVkLiBXaGVuIHVwZGF0aW5nIGFuIGV4aXN0aW5nIG5vZGUgd2l0aCBpbm5lckhUTUxcbiAgLy8gd2hpdGVzcGFjZSBpbiByb290IFRleHROb2RlcyBpcyBhbHNvIGNvbGxhcHNlZC5cbiAgLy8gQHNlZSBxdWlya3Ntb2RlLm9yZy9idWdyZXBvcnRzL2FyY2hpdmVzLzIwMDQvMTEvaW5uZXJodG1sX2FuZF90Lmh0bWxcblxuICAvLyBGZWF0dXJlIGRldGVjdGlvbjsgb25seSBJRTggaXMga25vd24gdG8gYmVoYXZlIGltcHJvcGVybHkgbGlrZSB0aGlzLlxuICB2YXIgdGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdGVzdEVsZW1lbnQuaW5uZXJIVE1MID0gJyAnO1xuICBpZiAodGVzdEVsZW1lbnQuaW5uZXJIVE1MID09PSAnJykge1xuICAgIHNldElubmVySFRNTCA9IGZ1bmN0aW9uIChub2RlLCBodG1sKSB7XG4gICAgICAvLyBNYWdpYyB0aGVvcnk6IElFOCBzdXBwb3NlZGx5IGRpZmZlcmVudGlhdGVzIGJldHdlZW4gYWRkZWQgYW5kIHVwZGF0ZWRcbiAgICAgIC8vIG5vZGVzIHdoZW4gcHJvY2Vzc2luZyBpbm5lckhUTUwsIGlubmVySFRNTCBvbiB1cGRhdGVkIG5vZGVzIHN1ZmZlcnNcbiAgICAgIC8vIGZyb20gd29yc2Ugd2hpdGVzcGFjZSBiZWhhdmlvci4gUmUtYWRkaW5nIGEgbm9kZSBsaWtlIHRoaXMgdHJpZ2dlcnNcbiAgICAgIC8vIHRoZSBpbml0aWFsIGFuZCBtb3JlIGZhdm9yYWJsZSB3aGl0ZXNwYWNlIGJlaGF2aW9yLlxuICAgICAgLy8gVE9ETzogV2hhdCB0byBkbyBvbiBhIGRldGFjaGVkIG5vZGU/XG4gICAgICBpZiAobm9kZS5wYXJlbnROb2RlKSB7XG4gICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobm9kZSwgbm9kZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIGFsc28gaW1wbGVtZW50IGEgd29ya2Fyb3VuZCBmb3Igbm9uLXZpc2libGUgdGFncyBkaXNhcHBlYXJpbmcgaW50b1xuICAgICAgLy8gdGhpbiBhaXIgb24gSUU4LCB0aGlzIG9ubHkgaGFwcGVucyBpZiB0aGVyZSBpcyBubyB2aXNpYmxlIHRleHRcbiAgICAgIC8vIGluLWZyb250IG9mIHRoZSBub24tdmlzaWJsZSB0YWdzLiBQaWdneWJhY2sgb24gdGhlIHdoaXRlc3BhY2UgZml4XG4gICAgICAvLyBhbmQgc2ltcGx5IGNoZWNrIGlmIGFueSBub24tdmlzaWJsZSB0YWdzIGFwcGVhciBpbiB0aGUgc291cmNlLlxuICAgICAgaWYgKFdISVRFU1BBQ0VfVEVTVC50ZXN0KGh0bWwpIHx8IGh0bWxbMF0gPT09ICc8JyAmJiBOT05WSVNJQkxFX1RFU1QudGVzdChodG1sKSkge1xuICAgICAgICAvLyBSZWNvdmVyIGxlYWRpbmcgd2hpdGVzcGFjZSBieSB0ZW1wb3JhcmlseSBwcmVwZW5kaW5nIGFueSBjaGFyYWN0ZXIuXG4gICAgICAgIC8vIFxcdUZFRkYgaGFzIHRoZSBwb3RlbnRpYWwgYWR2YW50YWdlIG9mIGJlaW5nIHplcm8td2lkdGgvaW52aXNpYmxlLlxuICAgICAgICAvLyBVZ2xpZnlKUyBkcm9wcyBVK0ZFRkYgY2hhcnMgd2hlbiBwYXJzaW5nLCBzbyB1c2UgU3RyaW5nLmZyb21DaGFyQ29kZVxuICAgICAgICAvLyBpbiBob3BlcyB0aGF0IHRoaXMgaXMgcHJlc2VydmVkIGV2ZW4gaWYgXCJcXHVGRUZGXCIgaXMgdHJhbnNmb3JtZWQgdG9cbiAgICAgICAgLy8gdGhlIGFjdHVhbCBVbmljb2RlIGNoYXJhY3RlciAoYnkgQmFiZWwsIGZvciBleGFtcGxlKS5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21pc2hvby9VZ2xpZnlKUzIvYmxvYi92Mi40LjIwL2xpYi9wYXJzZS5qcyNMMjE2XG4gICAgICAgIG5vZGUuaW5uZXJIVE1MID0gU3RyaW5nLmZyb21DaGFyQ29kZSgweEZFRkYpICsgaHRtbDtcblxuICAgICAgICAvLyBkZWxldGVEYXRhIGxlYXZlcyBhbiBlbXB0eSBgVGV4dE5vZGVgIHdoaWNoIG9mZnNldHMgdGhlIGluZGV4IG9mIGFsbFxuICAgICAgICAvLyBjaGlsZHJlbi4gRGVmaW5pdGVseSB3YW50IHRvIGF2b2lkIHRoaXMuXG4gICAgICAgIHZhciB0ZXh0Tm9kZSA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgaWYgKHRleHROb2RlLmRhdGEubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgbm9kZS5yZW1vdmVDaGlsZCh0ZXh0Tm9kZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGV4dE5vZGUuZGVsZXRlRGF0YSgwLCAxKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbm9kZS5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgdGVzdEVsZW1lbnQgPSBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldElubmVySFRNTDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgRXhlY3V0aW9uRW52aXJvbm1lbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9FeGVjdXRpb25FbnZpcm9ubWVudCcpO1xudmFyIGVzY2FwZVRleHRDb250ZW50Rm9yQnJvd3NlciA9IHJlcXVpcmUoJy4vZXNjYXBlVGV4dENvbnRlbnRGb3JCcm93c2VyJyk7XG52YXIgc2V0SW5uZXJIVE1MID0gcmVxdWlyZSgnLi9zZXRJbm5lckhUTUwnKTtcblxuLyoqXG4gKiBTZXQgdGhlIHRleHRDb250ZW50IHByb3BlcnR5IG9mIGEgbm9kZSwgZW5zdXJpbmcgdGhhdCB3aGl0ZXNwYWNlIGlzIHByZXNlcnZlZFxuICogZXZlbiBpbiBJRTguIGlubmVyVGV4dCBpcyBhIHBvb3Igc3Vic3RpdHV0ZSBmb3IgdGV4dENvbnRlbnQgYW5kLCBhbW9uZyBtYW55XG4gKiBpc3N1ZXMsIGluc2VydHMgPGJyPiBpbnN0ZWFkIG9mIHRoZSBsaXRlcmFsIG5ld2xpbmUgY2hhcnMuIGlubmVySFRNTCBiZWhhdmVzXG4gKiBhcyBpdCBzaG91bGQuXG4gKlxuICogQHBhcmFtIHtET01FbGVtZW50fSBub2RlXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dFxuICogQGludGVybmFsXG4gKi9cbnZhciBzZXRUZXh0Q29udGVudCA9IGZ1bmN0aW9uIChub2RlLCB0ZXh0KSB7XG4gIGlmICh0ZXh0KSB7XG4gICAgdmFyIGZpcnN0Q2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQ7XG5cbiAgICBpZiAoZmlyc3RDaGlsZCAmJiBmaXJzdENoaWxkID09PSBub2RlLmxhc3RDaGlsZCAmJiBmaXJzdENoaWxkLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICBmaXJzdENoaWxkLm5vZGVWYWx1ZSA9IHRleHQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIG5vZGUudGV4dENvbnRlbnQgPSB0ZXh0O1xufTtcblxuaWYgKEV4ZWN1dGlvbkVudmlyb25tZW50LmNhblVzZURPTSkge1xuICBpZiAoISgndGV4dENvbnRlbnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpIHtcbiAgICBzZXRUZXh0Q29udGVudCA9IGZ1bmN0aW9uIChub2RlLCB0ZXh0KSB7XG4gICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICBub2RlLm5vZGVWYWx1ZSA9IHRleHQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNldElubmVySFRNTChub2RlLCBlc2NhcGVUZXh0Q29udGVudEZvckJyb3dzZXIodGV4dCkpO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXRUZXh0Q29udGVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEdpdmVuIGEgYHByZXZFbGVtZW50YCBhbmQgYG5leHRFbGVtZW50YCwgZGV0ZXJtaW5lcyBpZiB0aGUgZXhpc3RpbmdcbiAqIGluc3RhbmNlIHNob3VsZCBiZSB1cGRhdGVkIGFzIG9wcG9zZWQgdG8gYmVpbmcgZGVzdHJveWVkIG9yIHJlcGxhY2VkIGJ5IGEgbmV3XG4gKiBpbnN0YW5jZS4gQm90aCBhcmd1bWVudHMgYXJlIGVsZW1lbnRzLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGlzIGxvZ2ljIGNhblxuICogb3BlcmF0ZSBvbiBzdGF0ZWxlc3MgdHJlZXMgd2l0aG91dCBhbnkgYmFja2luZyBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gez9vYmplY3R9IHByZXZFbGVtZW50XG4gKiBAcGFyYW0gez9vYmplY3R9IG5leHRFbGVtZW50XG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBleGlzdGluZyBpbnN0YW5jZSBzaG91bGQgYmUgdXBkYXRlZC5cbiAqIEBwcm90ZWN0ZWRcbiAqL1xuXG5mdW5jdGlvbiBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudChwcmV2RWxlbWVudCwgbmV4dEVsZW1lbnQpIHtcbiAgdmFyIHByZXZFbXB0eSA9IHByZXZFbGVtZW50ID09PSBudWxsIHx8IHByZXZFbGVtZW50ID09PSBmYWxzZTtcbiAgdmFyIG5leHRFbXB0eSA9IG5leHRFbGVtZW50ID09PSBudWxsIHx8IG5leHRFbGVtZW50ID09PSBmYWxzZTtcbiAgaWYgKHByZXZFbXB0eSB8fCBuZXh0RW1wdHkpIHtcbiAgICByZXR1cm4gcHJldkVtcHR5ID09PSBuZXh0RW1wdHk7XG4gIH1cblxuICB2YXIgcHJldlR5cGUgPSB0eXBlb2YgcHJldkVsZW1lbnQ7XG4gIHZhciBuZXh0VHlwZSA9IHR5cGVvZiBuZXh0RWxlbWVudDtcbiAgaWYgKHByZXZUeXBlID09PSAnc3RyaW5nJyB8fCBwcmV2VHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gbmV4dFR5cGUgPT09ICdzdHJpbmcnIHx8IG5leHRUeXBlID09PSAnbnVtYmVyJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV4dFR5cGUgPT09ICdvYmplY3QnICYmIHByZXZFbGVtZW50LnR5cGUgPT09IG5leHRFbGVtZW50LnR5cGUgJiYgcHJldkVsZW1lbnQua2V5ID09PSBuZXh0RWxlbWVudC5rZXk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVcGRhdGVSZWFjdENvbXBvbmVudDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSByZXF1aXJlKCdyZWFjdC9saWIvUmVhY3RDdXJyZW50T3duZXInKTtcbnZhciBSRUFDVF9FTEVNRU5UX1RZUEUgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudFN5bWJvbCcpO1xuXG52YXIgZ2V0SXRlcmF0b3JGbiA9IHJlcXVpcmUoJy4vZ2V0SXRlcmF0b3JGbicpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIEtleUVzY2FwZVV0aWxzID0gcmVxdWlyZSgnLi9LZXlFc2NhcGVVdGlscycpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBTRVBBUkFUT1IgPSAnLic7XG52YXIgU1VCU0VQQVJBVE9SID0gJzonO1xuXG4vKipcbiAqIFRoaXMgaXMgaW5saW5lZCBmcm9tIFJlYWN0RWxlbWVudCBzaW5jZSB0aGlzIGZpbGUgaXMgc2hhcmVkIGJldHdlZW5cbiAqIGlzb21vcnBoaWMgYW5kIHJlbmRlcmVycy4gV2UgY291bGQgZXh0cmFjdCB0aGlzIHRvIGFcbiAqXG4gKi9cblxuLyoqXG4gKiBUT0RPOiBUZXN0IHRoYXQgYSBzaW5nbGUgY2hpbGQgYW5kIGFuIGFycmF5IHdpdGggb25lIGl0ZW0gaGF2ZSB0aGUgc2FtZSBrZXlcbiAqIHBhdHRlcm4uXG4gKi9cblxudmFyIGRpZFdhcm5BYm91dE1hcHMgPSBmYWxzZTtcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIGtleSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIGEgY29tcG9uZW50IHdpdGhpbiBhIHNldC5cbiAqXG4gKiBAcGFyYW0geyp9IGNvbXBvbmVudCBBIGNvbXBvbmVudCB0aGF0IGNvdWxkIGNvbnRhaW4gYSBtYW51YWwga2V5LlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IHRoYXQgaXMgdXNlZCBpZiBhIG1hbnVhbCBrZXkgaXMgbm90IHByb3ZpZGVkLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBnZXRDb21wb25lbnRLZXkoY29tcG9uZW50LCBpbmRleCkge1xuICAvLyBEbyBzb21lIHR5cGVjaGVja2luZyBoZXJlIHNpbmNlIHdlIGNhbGwgdGhpcyBibGluZGx5LiBXZSB3YW50IHRvIGVuc3VyZVxuICAvLyB0aGF0IHdlIGRvbid0IGJsb2NrIHBvdGVudGlhbCBmdXR1cmUgRVMgQVBJcy5cbiAgaWYgKGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50ID09PSAnb2JqZWN0JyAmJiBjb21wb25lbnQua2V5ICE9IG51bGwpIHtcbiAgICAvLyBFeHBsaWNpdCBrZXlcbiAgICByZXR1cm4gS2V5RXNjYXBlVXRpbHMuZXNjYXBlKGNvbXBvbmVudC5rZXkpO1xuICB9XG4gIC8vIEltcGxpY2l0IGtleSBkZXRlcm1pbmVkIGJ5IHRoZSBpbmRleCBpbiB0aGUgc2V0XG4gIHJldHVybiBpbmRleC50b1N0cmluZygzNik7XG59XG5cbi8qKlxuICogQHBhcmFtIHs/Kn0gY2hpbGRyZW4gQ2hpbGRyZW4gdHJlZSBjb250YWluZXIuXG4gKiBAcGFyYW0geyFzdHJpbmd9IG5hbWVTb0ZhciBOYW1lIG9mIHRoZSBrZXkgcGF0aCBzbyBmYXIuXG4gKiBAcGFyYW0geyFmdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gaW52b2tlIHdpdGggZWFjaCBjaGlsZCBmb3VuZC5cbiAqIEBwYXJhbSB7Pyp9IHRyYXZlcnNlQ29udGV4dCBVc2VkIHRvIHBhc3MgaW5mb3JtYXRpb24gdGhyb3VnaG91dCB0aGUgdHJhdmVyc2FsXG4gKiBwcm9jZXNzLlxuICogQHJldHVybiB7IW51bWJlcn0gVGhlIG51bWJlciBvZiBjaGlsZHJlbiBpbiB0aGlzIHN1YnRyZWUuXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkcmVuLCBuYW1lU29GYXIsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgY2hpbGRyZW47XG5cbiAgaWYgKHR5cGUgPT09ICd1bmRlZmluZWQnIHx8IHR5cGUgPT09ICdib29sZWFuJykge1xuICAgIC8vIEFsbCBvZiB0aGUgYWJvdmUgYXJlIHBlcmNlaXZlZCBhcyBudWxsLlxuICAgIGNoaWxkcmVuID0gbnVsbDtcbiAgfVxuXG4gIGlmIChjaGlsZHJlbiA9PT0gbnVsbCB8fCB0eXBlID09PSAnc3RyaW5nJyB8fCB0eXBlID09PSAnbnVtYmVyJyB8fFxuICAvLyBUaGUgZm9sbG93aW5nIGlzIGlubGluZWQgZnJvbSBSZWFjdEVsZW1lbnQuIFRoaXMgbWVhbnMgd2UgY2FuIG9wdGltaXplXG4gIC8vIHNvbWUgY2hlY2tzLiBSZWFjdCBGaWJlciBhbHNvIGlubGluZXMgdGhpcyBsb2dpYyBmb3Igc2ltaWxhciBwdXJwb3Nlcy5cbiAgdHlwZSA9PT0gJ29iamVjdCcgJiYgY2hpbGRyZW4uJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgIGNhbGxiYWNrKHRyYXZlcnNlQ29udGV4dCwgY2hpbGRyZW4sXG4gICAgLy8gSWYgaXQncyB0aGUgb25seSBjaGlsZCwgdHJlYXQgdGhlIG5hbWUgYXMgaWYgaXQgd2FzIHdyYXBwZWQgaW4gYW4gYXJyYXlcbiAgICAvLyBzbyB0aGF0IGl0J3MgY29uc2lzdGVudCBpZiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGdyb3dzLlxuICAgIG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgKyBnZXRDb21wb25lbnRLZXkoY2hpbGRyZW4sIDApIDogbmFtZVNvRmFyKTtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHZhciBjaGlsZDtcbiAgdmFyIG5leHROYW1lO1xuICB2YXIgc3VidHJlZUNvdW50ID0gMDsgLy8gQ291bnQgb2YgY2hpbGRyZW4gZm91bmQgaW4gdGhlIGN1cnJlbnQgc3VidHJlZS5cbiAgdmFyIG5leHROYW1lUHJlZml4ID0gbmFtZVNvRmFyID09PSAnJyA/IFNFUEFSQVRPUiA6IG5hbWVTb0ZhciArIFNVQlNFUEFSQVRPUjtcblxuICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldENvbXBvbmVudEtleShjaGlsZCwgaSk7XG4gICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGl0ZXJhdG9yRm4gPSBnZXRJdGVyYXRvckZuKGNoaWxkcmVuKTtcbiAgICBpZiAoaXRlcmF0b3JGbikge1xuICAgICAgdmFyIGl0ZXJhdG9yID0gaXRlcmF0b3JGbi5jYWxsKGNoaWxkcmVuKTtcbiAgICAgIHZhciBzdGVwO1xuICAgICAgaWYgKGl0ZXJhdG9yRm4gIT09IGNoaWxkcmVuLmVudHJpZXMpIHtcbiAgICAgICAgdmFyIGlpID0gMDtcbiAgICAgICAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgICAgICAgIGNoaWxkID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCBpaSsrKTtcbiAgICAgICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgdmFyIG1hcHNBc0NoaWxkcmVuQWRkZW5kdW0gPSAnJztcbiAgICAgICAgICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgICAgICAgICAgdmFyIG1hcHNBc0NoaWxkcmVuT3duZXJOYW1lID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5nZXROYW1lKCk7XG4gICAgICAgICAgICBpZiAobWFwc0FzQ2hpbGRyZW5Pd25lck5hbWUpIHtcbiAgICAgICAgICAgICAgbWFwc0FzQ2hpbGRyZW5BZGRlbmR1bSA9ICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBtYXBzQXNDaGlsZHJlbk93bmVyTmFtZSArICdgLic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhkaWRXYXJuQWJvdXRNYXBzLCAnVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3QgeWV0IGZ1bGx5IHN1cHBvcnRlZC4gSXQgaXMgYW4gJyArICdleHBlcmltZW50YWwgZmVhdHVyZSB0aGF0IG1pZ2h0IGJlIHJlbW92ZWQuIENvbnZlcnQgaXQgdG8gYSAnICsgJ3NlcXVlbmNlIC8gaXRlcmFibGUgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLiVzJywgbWFwc0FzQ2hpbGRyZW5BZGRlbmR1bSkgOiB2b2lkIDA7XG4gICAgICAgICAgZGlkV2FybkFib3V0TWFwcyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSXRlcmF0b3Igd2lsbCBwcm92aWRlIGVudHJ5IFtrLHZdIHR1cGxlcyByYXRoZXIgdGhhbiB2YWx1ZXMuXG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICB2YXIgZW50cnkgPSBzdGVwLnZhbHVlO1xuICAgICAgICAgIGlmIChlbnRyeSkge1xuICAgICAgICAgICAgY2hpbGQgPSBlbnRyeVsxXTtcbiAgICAgICAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBLZXlFc2NhcGVVdGlscy5lc2NhcGUoZW50cnlbMF0pICsgU1VCU0VQQVJBVE9SICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkLCAwKTtcbiAgICAgICAgICAgIHN1YnRyZWVDb3VudCArPSB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZCwgbmV4dE5hbWUsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHZhciBhZGRlbmR1bSA9ICcnO1xuICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIGFkZGVuZHVtID0gJyBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5ICcgKyAnaW5zdGVhZCBvciB3cmFwIHRoZSBvYmplY3QgdXNpbmcgY3JlYXRlRnJhZ21lbnQob2JqZWN0KSBmcm9tIHRoZSAnICsgJ1JlYWN0IGFkZC1vbnMuJztcbiAgICAgICAgaWYgKGNoaWxkcmVuLl9pc1JlYWN0RWxlbWVudCkge1xuICAgICAgICAgIGFkZGVuZHVtID0gJyBJdCBsb29rcyBsaWtlIHlvdVxcJ3JlIHVzaW5nIGFuIGVsZW1lbnQgY3JlYXRlZCBieSBhIGRpZmZlcmVudCAnICsgJ3ZlcnNpb24gb2YgUmVhY3QuIE1ha2Ugc3VyZSB0byB1c2Ugb25seSBvbmUgY29weSBvZiBSZWFjdC4nO1xuICAgICAgICB9XG4gICAgICAgIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgICAgICAgdmFyIG5hbWUgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKTtcbiAgICAgICAgICBpZiAobmFtZSkge1xuICAgICAgICAgICAgYWRkZW5kdW0gKz0gJyBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgJyArIG5hbWUgKyAnYC4nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIGNoaWxkcmVuU3RyaW5nID0gU3RyaW5nKGNoaWxkcmVuKTtcbiAgICAgICFmYWxzZSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiAlcykuJXMnLCBjaGlsZHJlblN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRyZW5TdHJpbmcsIGFkZGVuZHVtKSA6IF9wcm9kSW52YXJpYW50KCczMScsIGNoaWxkcmVuU3RyaW5nID09PSAnW29iamVjdCBPYmplY3RdJyA/ICdvYmplY3Qgd2l0aCBrZXlzIHsnICsgT2JqZWN0LmtleXMoY2hpbGRyZW4pLmpvaW4oJywgJykgKyAnfScgOiBjaGlsZHJlblN0cmluZywgYWRkZW5kdW0pIDogdm9pZCAwO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdWJ0cmVlQ291bnQ7XG59XG5cbi8qKlxuICogVHJhdmVyc2VzIGNoaWxkcmVuIHRoYXQgYXJlIHR5cGljYWxseSBzcGVjaWZpZWQgYXMgYHByb3BzLmNoaWxkcmVuYCwgYnV0XG4gKiBtaWdodCBhbHNvIGJlIHNwZWNpZmllZCB0aHJvdWdoIGF0dHJpYnV0ZXM6XG4gKlxuICogLSBgdHJhdmVyc2VBbGxDaGlsZHJlbih0aGlzLnByb3BzLmNoaWxkcmVuLCAuLi4pYFxuICogLSBgdHJhdmVyc2VBbGxDaGlsZHJlbih0aGlzLnByb3BzLmxlZnRQYW5lbENoaWxkcmVuLCAuLi4pYFxuICpcbiAqIFRoZSBgdHJhdmVyc2VDb250ZXh0YCBpcyBhbiBvcHRpb25hbCBhcmd1bWVudCB0aGF0IGlzIHBhc3NlZCB0aHJvdWdoIHRoZVxuICogZW50aXJlIHRyYXZlcnNhbC4gSXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgYWNjdW11bGF0aW9ucyBvciBhbnl0aGluZyBlbHNlIHRoYXRcbiAqIHRoZSBjYWxsYmFjayBtaWdodCBmaW5kIHJlbGV2YW50LlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgb2JqZWN0LlxuICogQHBhcmFtIHshZnVuY3Rpb259IGNhbGxiYWNrIFRvIGludm9rZSB1cG9uIHRyYXZlcnNpbmcgZWFjaCBjaGlsZC5cbiAqIEBwYXJhbSB7Pyp9IHRyYXZlcnNlQ29udGV4dCBDb250ZXh0IGZvciB0cmF2ZXJzYWwuXG4gKiBAcmV0dXJuIHshbnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHRoaXMgc3VidHJlZS5cbiAqL1xuZnVuY3Rpb24gdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCkge1xuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcmV0dXJuIHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkcmVuLCAnJywgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdHJhdmVyc2VBbGxDaGlsZHJlbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDE1LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX2Fzc2lnbiA9IHJlcXVpcmUoJ29iamVjdC1hc3NpZ24nKTtcblxudmFyIGVtcHR5RnVuY3Rpb24gPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eUZ1bmN0aW9uJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIHZhbGlkYXRlRE9NTmVzdGluZyA9IGVtcHR5RnVuY3Rpb247XG5cbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAvLyBUaGlzIHZhbGlkYXRpb24gY29kZSB3YXMgd3JpdHRlbiBiYXNlZCBvbiB0aGUgSFRNTDUgcGFyc2luZyBzcGVjOlxuICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNoYXMtYW4tZWxlbWVudC1pbi1zY29wZVxuICAvL1xuICAvLyBOb3RlOiB0aGlzIGRvZXMgbm90IGNhdGNoIGFsbCBpbnZhbGlkIG5lc3RpbmcsIG5vciBkb2VzIGl0IHRyeSB0byAoYXMgaXQnc1xuICAvLyBub3QgY2xlYXIgd2hhdCBwcmFjdGljYWwgYmVuZWZpdCBkb2luZyBzbyBwcm92aWRlcyk7IGluc3RlYWQsIHdlIHdhcm4gb25seVxuICAvLyBmb3IgY2FzZXMgd2hlcmUgdGhlIHBhcnNlciB3aWxsIGdpdmUgYSBwYXJzZSB0cmVlIGRpZmZlcmluZyBmcm9tIHdoYXQgUmVhY3RcbiAgLy8gaW50ZW5kZWQuIEZvciBleGFtcGxlLCA8Yj48ZGl2PjwvZGl2PjwvYj4gaXMgaW52YWxpZCBidXQgd2UgZG9uJ3Qgd2FyblxuICAvLyBiZWNhdXNlIGl0IHN0aWxsIHBhcnNlcyBjb3JyZWN0bHk7IHdlIGRvIHdhcm4gZm9yIG90aGVyIGNhc2VzIGxpa2UgbmVzdGVkXG4gIC8vIDxwPiB0YWdzIHdoZXJlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY29uZCBlbGVtZW50IGltcGxpY2l0bHkgY2xvc2VzIHRoZVxuICAvLyBmaXJzdCwgY2F1c2luZyBhIGNvbmZ1c2luZyBtZXNzLlxuXG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3NwZWNpYWxcbiAgdmFyIHNwZWNpYWxUYWdzID0gWydhZGRyZXNzJywgJ2FwcGxldCcsICdhcmVhJywgJ2FydGljbGUnLCAnYXNpZGUnLCAnYmFzZScsICdiYXNlZm9udCcsICdiZ3NvdW5kJywgJ2Jsb2NrcXVvdGUnLCAnYm9keScsICdicicsICdidXR0b24nLCAnY2FwdGlvbicsICdjZW50ZXInLCAnY29sJywgJ2NvbGdyb3VwJywgJ2RkJywgJ2RldGFpbHMnLCAnZGlyJywgJ2RpdicsICdkbCcsICdkdCcsICdlbWJlZCcsICdmaWVsZHNldCcsICdmaWdjYXB0aW9uJywgJ2ZpZ3VyZScsICdmb290ZXInLCAnZm9ybScsICdmcmFtZScsICdmcmFtZXNldCcsICdoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNicsICdoZWFkJywgJ2hlYWRlcicsICdoZ3JvdXAnLCAnaHInLCAnaHRtbCcsICdpZnJhbWUnLCAnaW1nJywgJ2lucHV0JywgJ2lzaW5kZXgnLCAnbGknLCAnbGluaycsICdsaXN0aW5nJywgJ21haW4nLCAnbWFycXVlZScsICdtZW51JywgJ21lbnVpdGVtJywgJ21ldGEnLCAnbmF2JywgJ25vZW1iZWQnLCAnbm9mcmFtZXMnLCAnbm9zY3JpcHQnLCAnb2JqZWN0JywgJ29sJywgJ3AnLCAncGFyYW0nLCAncGxhaW50ZXh0JywgJ3ByZScsICdzY3JpcHQnLCAnc2VjdGlvbicsICdzZWxlY3QnLCAnc291cmNlJywgJ3N0eWxlJywgJ3N1bW1hcnknLCAndGFibGUnLCAndGJvZHknLCAndGQnLCAndGVtcGxhdGUnLCAndGV4dGFyZWEnLCAndGZvb3QnLCAndGgnLCAndGhlYWQnLCAndGl0bGUnLCAndHInLCAndHJhY2snLCAndWwnLCAnd2JyJywgJ3htcCddO1xuXG4gIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2hhcy1hbi1lbGVtZW50LWluLXNjb3BlXG4gIHZhciBpblNjb3BlVGFncyA9IFsnYXBwbGV0JywgJ2NhcHRpb24nLCAnaHRtbCcsICd0YWJsZScsICd0ZCcsICd0aCcsICdtYXJxdWVlJywgJ29iamVjdCcsICd0ZW1wbGF0ZScsXG5cbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaHRtbC1pbnRlZ3JhdGlvbi1wb2ludFxuICAvLyBUT0RPOiBEaXN0aW5ndWlzaCBieSBuYW1lc3BhY2UgaGVyZSAtLSBmb3IgPHRpdGxlPiwgaW5jbHVkaW5nIGl0IGhlcmVcbiAgLy8gZXJycyBvbiB0aGUgc2lkZSBvZiBmZXdlciB3YXJuaW5nc1xuICAnZm9yZWlnbk9iamVjdCcsICdkZXNjJywgJ3RpdGxlJ107XG5cbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjaGFzLWFuLWVsZW1lbnQtaW4tYnV0dG9uLXNjb3BlXG4gIHZhciBidXR0b25TY29wZVRhZ3MgPSBpblNjb3BlVGFncy5jb25jYXQoWydidXR0b24nXSk7XG5cbiAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjZ2VuZXJhdGUtaW1wbGllZC1lbmQtdGFnc1xuICB2YXIgaW1wbGllZEVuZFRhZ3MgPSBbJ2RkJywgJ2R0JywgJ2xpJywgJ29wdGlvbicsICdvcHRncm91cCcsICdwJywgJ3JwJywgJ3J0J107XG5cbiAgdmFyIGVtcHR5QW5jZXN0b3JJbmZvID0ge1xuICAgIGN1cnJlbnQ6IG51bGwsXG5cbiAgICBmb3JtVGFnOiBudWxsLFxuICAgIGFUYWdJblNjb3BlOiBudWxsLFxuICAgIGJ1dHRvblRhZ0luU2NvcGU6IG51bGwsXG4gICAgbm9iclRhZ0luU2NvcGU6IG51bGwsXG4gICAgcFRhZ0luQnV0dG9uU2NvcGU6IG51bGwsXG5cbiAgICBsaXN0SXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsLFxuICAgIGRsSXRlbVRhZ0F1dG9jbG9zaW5nOiBudWxsXG4gIH07XG5cbiAgdmFyIHVwZGF0ZWRBbmNlc3RvckluZm8gPSBmdW5jdGlvbiAob2xkSW5mbywgdGFnLCBpbnN0YW5jZSkge1xuICAgIHZhciBhbmNlc3RvckluZm8gPSBfYXNzaWduKHt9LCBvbGRJbmZvIHx8IGVtcHR5QW5jZXN0b3JJbmZvKTtcbiAgICB2YXIgaW5mbyA9IHsgdGFnOiB0YWcsIGluc3RhbmNlOiBpbnN0YW5jZSB9O1xuXG4gICAgaWYgKGluU2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZSA9IG51bGw7XG4gICAgICBhbmNlc3RvckluZm8uYnV0dG9uVGFnSW5TY29wZSA9IG51bGw7XG4gICAgICBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoYnV0dG9uU2NvcGVUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gU2VlIHJ1bGVzIGZvciAnbGknLCAnZGQnLCAnZHQnIHN0YXJ0IHRhZ3MgaW5cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5ib2R5XG4gICAgaWYgKHNwZWNpYWxUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEgJiYgdGFnICE9PSAnYWRkcmVzcycgJiYgdGFnICE9PSAnZGl2JyAmJiB0YWcgIT09ICdwJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBudWxsO1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gbnVsbDtcbiAgICB9XG5cbiAgICBhbmNlc3RvckluZm8uY3VycmVudCA9IGluZm87XG5cbiAgICBpZiAodGFnID09PSAnZm9ybScpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5mb3JtVGFnID0gaW5mbztcbiAgICB9XG4gICAgaWYgKHRhZyA9PT0gJ2EnKSB7XG4gICAgICBhbmNlc3RvckluZm8uYVRhZ0luU2NvcGUgPSBpbmZvO1xuICAgIH1cbiAgICBpZiAodGFnID09PSAnYnV0dG9uJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmJ1dHRvblRhZ0luU2NvcGUgPSBpbmZvO1xuICAgIH1cbiAgICBpZiAodGFnID09PSAnbm9icicpIHtcbiAgICAgIGFuY2VzdG9ySW5mby5ub2JyVGFnSW5TY29wZSA9IGluZm87XG4gICAgfVxuICAgIGlmICh0YWcgPT09ICdwJykge1xuICAgICAgYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlID0gaW5mbztcbiAgICB9XG4gICAgaWYgKHRhZyA9PT0gJ2xpJykge1xuICAgICAgYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3NpbmcgPSBpbmZvO1xuICAgIH1cbiAgICBpZiAodGFnID09PSAnZGQnIHx8IHRhZyA9PT0gJ2R0Jykge1xuICAgICAgYW5jZXN0b3JJbmZvLmRsSXRlbVRhZ0F1dG9jbG9zaW5nID0gaW5mbztcbiAgICB9XG5cbiAgICByZXR1cm4gYW5jZXN0b3JJbmZvO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXJcbiAgICovXG4gIHZhciBpc1RhZ1ZhbGlkV2l0aFBhcmVudCA9IGZ1bmN0aW9uICh0YWcsIHBhcmVudFRhZykge1xuICAgIC8vIEZpcnN0LCBsZXQncyBjaGVjayBpZiB3ZSdyZSBpbiBhbiB1bnVzdWFsIHBhcnNpbmcgbW9kZS4uLlxuICAgIHN3aXRjaCAocGFyZW50VGFnKSB7XG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5zZWxlY3RcbiAgICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdvcHRpb24nIHx8IHRhZyA9PT0gJ29wdGdyb3VwJyB8fCB0YWcgPT09ICcjdGV4dCc7XG4gICAgICBjYXNlICdvcHRncm91cCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdvcHRpb24nIHx8IHRhZyA9PT0gJyN0ZXh0JztcbiAgICAgIC8vIFN0cmljdGx5IHNwZWFraW5nLCBzZWVpbmcgYW4gPG9wdGlvbj4gZG9lc24ndCBtZWFuIHdlJ3JlIGluIGEgPHNlbGVjdD5cbiAgICAgIC8vIGJ1dFxuICAgICAgY2FzZSAnb3B0aW9uJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJyN0ZXh0JztcblxuICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjcGFyc2luZy1tYWluLWludGRcbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbmNhcHRpb25cbiAgICAgIC8vIE5vIHNwZWNpYWwgYmVoYXZpb3Igc2luY2UgdGhlc2UgcnVsZXMgZmFsbCBiYWNrIHRvIFwiaW4gYm9keVwiIG1vZGUgZm9yXG4gICAgICAvLyBhbGwgZXhjZXB0IHNwZWNpYWwgdGFibGUgbm9kZXMgd2hpY2ggY2F1c2UgYmFkIHBhcnNpbmcgYmVoYXZpb3IgYW55d2F5LlxuXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW50clxuICAgICAgY2FzZSAndHInOlxuICAgICAgICByZXR1cm4gdGFnID09PSAndGgnIHx8IHRhZyA9PT0gJ3RkJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG5cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRib2R5XG4gICAgICBjYXNlICd0Ym9keSc6XG4gICAgICBjYXNlICd0aGVhZCc6XG4gICAgICBjYXNlICd0Zm9vdCc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICd0cicgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5jb2xncm91cFxuICAgICAgY2FzZSAnY29sZ3JvdXAnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnY29sJyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG5cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3BhcnNpbmctbWFpbi1pbnRhYmxlXG4gICAgICBjYXNlICd0YWJsZSc6XG4gICAgICAgIHJldHVybiB0YWcgPT09ICdjYXB0aW9uJyB8fCB0YWcgPT09ICdjb2xncm91cCcgfHwgdGFnID09PSAndGJvZHknIHx8IHRhZyA9PT0gJ3Rmb290JyB8fCB0YWcgPT09ICd0aGVhZCcgfHwgdGFnID09PSAnc3R5bGUnIHx8IHRhZyA9PT0gJ3NjcmlwdCcgfHwgdGFnID09PSAndGVtcGxhdGUnO1xuXG4gICAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5oZWFkXG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgICAgcmV0dXJuIHRhZyA9PT0gJ2Jhc2UnIHx8IHRhZyA9PT0gJ2Jhc2Vmb250JyB8fCB0YWcgPT09ICdiZ3NvdW5kJyB8fCB0YWcgPT09ICdsaW5rJyB8fCB0YWcgPT09ICdtZXRhJyB8fCB0YWcgPT09ICd0aXRsZScgfHwgdGFnID09PSAnbm9zY3JpcHQnIHx8IHRhZyA9PT0gJ25vZnJhbWVzJyB8fCB0YWcgPT09ICdzdHlsZScgfHwgdGFnID09PSAnc2NyaXB0JyB8fCB0YWcgPT09ICd0ZW1wbGF0ZSc7XG5cbiAgICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NlbWFudGljcy5odG1sI3RoZS1odG1sLWVsZW1lbnRcbiAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnaGVhZCcgfHwgdGFnID09PSAnYm9keSc7XG4gICAgICBjYXNlICcjZG9jdW1lbnQnOlxuICAgICAgICByZXR1cm4gdGFnID09PSAnaHRtbCc7XG4gICAgfVxuXG4gICAgLy8gUHJvYmFibHkgaW4gdGhlIFwiaW4gYm9keVwiIHBhcnNpbmcgbW9kZSwgc28gd2Ugb3V0bGF3IG9ubHkgdGFnIGNvbWJvc1xuICAgIC8vIHdoZXJlIHRoZSBwYXJzaW5nIHJ1bGVzIGNhdXNlIGltcGxpY2l0IG9wZW5zIG9yIGNsb3NlcyB0byBiZSBhZGRlZC5cbiAgICAvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNwYXJzaW5nLW1haW4taW5ib2R5XG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2gxJzpcbiAgICAgIGNhc2UgJ2gyJzpcbiAgICAgIGNhc2UgJ2gzJzpcbiAgICAgIGNhc2UgJ2g0JzpcbiAgICAgIGNhc2UgJ2g1JzpcbiAgICAgIGNhc2UgJ2g2JzpcbiAgICAgICAgcmV0dXJuIHBhcmVudFRhZyAhPT0gJ2gxJyAmJiBwYXJlbnRUYWcgIT09ICdoMicgJiYgcGFyZW50VGFnICE9PSAnaDMnICYmIHBhcmVudFRhZyAhPT0gJ2g0JyAmJiBwYXJlbnRUYWcgIT09ICdoNScgJiYgcGFyZW50VGFnICE9PSAnaDYnO1xuXG4gICAgICBjYXNlICdycCc6XG4gICAgICBjYXNlICdydCc6XG4gICAgICAgIHJldHVybiBpbXBsaWVkRW5kVGFncy5pbmRleE9mKHBhcmVudFRhZykgPT09IC0xO1xuXG4gICAgICBjYXNlICdib2R5JzpcbiAgICAgIGNhc2UgJ2NhcHRpb24nOlxuICAgICAgY2FzZSAnY29sJzpcbiAgICAgIGNhc2UgJ2NvbGdyb3VwJzpcbiAgICAgIGNhc2UgJ2ZyYW1lJzpcbiAgICAgIGNhc2UgJ2hlYWQnOlxuICAgICAgY2FzZSAnaHRtbCc6XG4gICAgICBjYXNlICd0Ym9keSc6XG4gICAgICBjYXNlICd0ZCc6XG4gICAgICBjYXNlICd0Zm9vdCc6XG4gICAgICBjYXNlICd0aCc6XG4gICAgICBjYXNlICd0aGVhZCc6XG4gICAgICBjYXNlICd0cic6XG4gICAgICAgIC8vIFRoZXNlIHRhZ3MgYXJlIG9ubHkgdmFsaWQgd2l0aCBhIGZldyBwYXJlbnRzIHRoYXQgaGF2ZSBzcGVjaWFsIGNoaWxkXG4gICAgICAgIC8vIHBhcnNpbmcgcnVsZXMgLS0gaWYgd2UncmUgZG93biBoZXJlLCB0aGVuIG5vbmUgb2YgdGhvc2UgbWF0Y2hlZCBhbmRcbiAgICAgICAgLy8gc28gd2UgYWxsb3cgaXQgb25seSBpZiB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIHBhcmVudCBpcywgYXMgYWxsIG90aGVyXG4gICAgICAgIC8vIGNhc2VzIGFyZSBpbnZhbGlkLlxuICAgICAgICByZXR1cm4gcGFyZW50VGFnID09IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlclxuICAgKi9cbiAgdmFyIGZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcgPSBmdW5jdGlvbiAodGFnLCBhbmNlc3RvckluZm8pIHtcbiAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgY2FzZSAnYWRkcmVzcyc6XG4gICAgICBjYXNlICdhcnRpY2xlJzpcbiAgICAgIGNhc2UgJ2FzaWRlJzpcbiAgICAgIGNhc2UgJ2Jsb2NrcXVvdGUnOlxuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgIGNhc2UgJ2RldGFpbHMnOlxuICAgICAgY2FzZSAnZGlhbG9nJzpcbiAgICAgIGNhc2UgJ2Rpcic6XG4gICAgICBjYXNlICdkaXYnOlxuICAgICAgY2FzZSAnZGwnOlxuICAgICAgY2FzZSAnZmllbGRzZXQnOlxuICAgICAgY2FzZSAnZmlnY2FwdGlvbic6XG4gICAgICBjYXNlICdmaWd1cmUnOlxuICAgICAgY2FzZSAnZm9vdGVyJzpcbiAgICAgIGNhc2UgJ2hlYWRlcic6XG4gICAgICBjYXNlICdoZ3JvdXAnOlxuICAgICAgY2FzZSAnbWFpbic6XG4gICAgICBjYXNlICdtZW51JzpcbiAgICAgIGNhc2UgJ25hdic6XG4gICAgICBjYXNlICdvbCc6XG4gICAgICBjYXNlICdwJzpcbiAgICAgIGNhc2UgJ3NlY3Rpb24nOlxuICAgICAgY2FzZSAnc3VtbWFyeSc6XG4gICAgICBjYXNlICd1bCc6XG4gICAgICBjYXNlICdwcmUnOlxuICAgICAgY2FzZSAnbGlzdGluZyc6XG4gICAgICBjYXNlICd0YWJsZSc6XG4gICAgICBjYXNlICdocic6XG4gICAgICBjYXNlICd4bXAnOlxuICAgICAgY2FzZSAnaDEnOlxuICAgICAgY2FzZSAnaDInOlxuICAgICAgY2FzZSAnaDMnOlxuICAgICAgY2FzZSAnaDQnOlxuICAgICAgY2FzZSAnaDUnOlxuICAgICAgY2FzZSAnaDYnOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLnBUYWdJbkJ1dHRvblNjb3BlO1xuXG4gICAgICBjYXNlICdmb3JtJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5mb3JtVGFnIHx8IGFuY2VzdG9ySW5mby5wVGFnSW5CdXR0b25TY29wZTtcblxuICAgICAgY2FzZSAnbGknOlxuICAgICAgICByZXR1cm4gYW5jZXN0b3JJbmZvLmxpc3RJdGVtVGFnQXV0b2Nsb3Npbmc7XG5cbiAgICAgIGNhc2UgJ2RkJzpcbiAgICAgIGNhc2UgJ2R0JzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5kbEl0ZW1UYWdBdXRvY2xvc2luZztcblxuICAgICAgY2FzZSAnYnV0dG9uJzpcbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5idXR0b25UYWdJblNjb3BlO1xuXG4gICAgICBjYXNlICdhJzpcbiAgICAgICAgLy8gU3BlYyBzYXlzIHNvbWV0aGluZyBhYm91dCBzdG9yaW5nIGEgbGlzdCBvZiBtYXJrZXJzLCBidXQgaXQgc291bmRzXG4gICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gdGhpcyBjaGVjay5cbiAgICAgICAgcmV0dXJuIGFuY2VzdG9ySW5mby5hVGFnSW5TY29wZTtcblxuICAgICAgY2FzZSAnbm9icic6XG4gICAgICAgIHJldHVybiBhbmNlc3RvckluZm8ubm9iclRhZ0luU2NvcGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgUmVhY3RDb21wb3NpdGVDb21wb25lbnQgaW5zdGFuY2UsIHJldHVybiBhIGxpc3Qgb2YgaXRzIHJlY3Vyc2l2ZVxuICAgKiBvd25lcnMsIHN0YXJ0aW5nIGF0IHRoZSByb290IGFuZCBlbmRpbmcgd2l0aCB0aGUgaW5zdGFuY2UgaXRzZWxmLlxuICAgKi9cbiAgdmFyIGZpbmRPd25lclN0YWNrID0gZnVuY3Rpb24gKGluc3RhbmNlKSB7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHZhciBzdGFjayA9IFtdO1xuICAgIGRvIHtcbiAgICAgIHN0YWNrLnB1c2goaW5zdGFuY2UpO1xuICAgIH0gd2hpbGUgKGluc3RhbmNlID0gaW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lcik7XG4gICAgc3RhY2sucmV2ZXJzZSgpO1xuICAgIHJldHVybiBzdGFjaztcbiAgfTtcblxuICB2YXIgZGlkV2FybiA9IHt9O1xuXG4gIHZhbGlkYXRlRE9NTmVzdGluZyA9IGZ1bmN0aW9uIChjaGlsZFRhZywgY2hpbGRUZXh0LCBjaGlsZEluc3RhbmNlLCBhbmNlc3RvckluZm8pIHtcbiAgICBhbmNlc3RvckluZm8gPSBhbmNlc3RvckluZm8gfHwgZW1wdHlBbmNlc3RvckluZm87XG4gICAgdmFyIHBhcmVudEluZm8gPSBhbmNlc3RvckluZm8uY3VycmVudDtcbiAgICB2YXIgcGFyZW50VGFnID0gcGFyZW50SW5mbyAmJiBwYXJlbnRJbmZvLnRhZztcblxuICAgIGlmIChjaGlsZFRleHQgIT0gbnVsbCkge1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGNoaWxkVGFnID09IG51bGwsICd2YWxpZGF0ZURPTU5lc3Rpbmc6IHdoZW4gY2hpbGRUZXh0IGlzIHBhc3NlZCwgY2hpbGRUYWcgc2hvdWxkIGJlIG51bGwnKSA6IHZvaWQgMDtcbiAgICAgIGNoaWxkVGFnID0gJyN0ZXh0JztcbiAgICB9XG5cbiAgICB2YXIgaW52YWxpZFBhcmVudCA9IGlzVGFnVmFsaWRXaXRoUGFyZW50KGNoaWxkVGFnLCBwYXJlbnRUYWcpID8gbnVsbCA6IHBhcmVudEluZm87XG4gICAgdmFyIGludmFsaWRBbmNlc3RvciA9IGludmFsaWRQYXJlbnQgPyBudWxsIDogZmluZEludmFsaWRBbmNlc3RvckZvclRhZyhjaGlsZFRhZywgYW5jZXN0b3JJbmZvKTtcbiAgICB2YXIgcHJvYmxlbWF0aWMgPSBpbnZhbGlkUGFyZW50IHx8IGludmFsaWRBbmNlc3RvcjtcblxuICAgIGlmIChwcm9ibGVtYXRpYykge1xuICAgICAgdmFyIGFuY2VzdG9yVGFnID0gcHJvYmxlbWF0aWMudGFnO1xuICAgICAgdmFyIGFuY2VzdG9ySW5zdGFuY2UgPSBwcm9ibGVtYXRpYy5pbnN0YW5jZTtcblxuICAgICAgdmFyIGNoaWxkT3duZXIgPSBjaGlsZEluc3RhbmNlICYmIGNoaWxkSW5zdGFuY2UuX2N1cnJlbnRFbGVtZW50Ll9vd25lcjtcbiAgICAgIHZhciBhbmNlc3Rvck93bmVyID0gYW5jZXN0b3JJbnN0YW5jZSAmJiBhbmNlc3Rvckluc3RhbmNlLl9jdXJyZW50RWxlbWVudC5fb3duZXI7XG5cbiAgICAgIHZhciBjaGlsZE93bmVycyA9IGZpbmRPd25lclN0YWNrKGNoaWxkT3duZXIpO1xuICAgICAgdmFyIGFuY2VzdG9yT3duZXJzID0gZmluZE93bmVyU3RhY2soYW5jZXN0b3JPd25lcik7XG5cbiAgICAgIHZhciBtaW5TdGFja0xlbiA9IE1hdGgubWluKGNoaWxkT3duZXJzLmxlbmd0aCwgYW5jZXN0b3JPd25lcnMubGVuZ3RoKTtcbiAgICAgIHZhciBpO1xuXG4gICAgICB2YXIgZGVlcGVzdENvbW1vbiA9IC0xO1xuICAgICAgZm9yIChpID0gMDsgaSA8IG1pblN0YWNrTGVuOyBpKyspIHtcbiAgICAgICAgaWYgKGNoaWxkT3duZXJzW2ldID09PSBhbmNlc3Rvck93bmVyc1tpXSkge1xuICAgICAgICAgIGRlZXBlc3RDb21tb24gPSBpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBVTktOT1dOID0gJyh1bmtub3duKSc7XG4gICAgICB2YXIgY2hpbGRPd25lck5hbWVzID0gY2hpbGRPd25lcnMuc2xpY2UoZGVlcGVzdENvbW1vbiArIDEpLm1hcChmdW5jdGlvbiAoaW5zdCkge1xuICAgICAgICByZXR1cm4gaW5zdC5nZXROYW1lKCkgfHwgVU5LTk9XTjtcbiAgICAgIH0pO1xuICAgICAgdmFyIGFuY2VzdG9yT3duZXJOYW1lcyA9IGFuY2VzdG9yT3duZXJzLnNsaWNlKGRlZXBlc3RDb21tb24gKyAxKS5tYXAoZnVuY3Rpb24gKGluc3QpIHtcbiAgICAgICAgcmV0dXJuIGluc3QuZ2V0TmFtZSgpIHx8IFVOS05PV047XG4gICAgICB9KTtcbiAgICAgIHZhciBvd25lckluZm8gPSBbXS5jb25jYXQoXG4gICAgICAvLyBJZiB0aGUgcGFyZW50IGFuZCBjaGlsZCBpbnN0YW5jZXMgaGF2ZSBhIGNvbW1vbiBvd25lciBhbmNlc3Rvciwgc3RhcnRcbiAgICAgIC8vIHdpdGggdGhhdCAtLSBvdGhlcndpc2Ugd2UganVzdCBzdGFydCB3aXRoIHRoZSBwYXJlbnQncyBvd25lcnMuXG4gICAgICBkZWVwZXN0Q29tbW9uICE9PSAtMSA/IGNoaWxkT3duZXJzW2RlZXBlc3RDb21tb25dLmdldE5hbWUoKSB8fCBVTktOT1dOIDogW10sIGFuY2VzdG9yT3duZXJOYW1lcywgYW5jZXN0b3JUYWcsXG4gICAgICAvLyBJZiB3ZSdyZSB3YXJuaW5nIGFib3V0IGFuIGludmFsaWQgKG5vbi1wYXJlbnQpIGFuY2VzdHJ5LCBhZGQgJy4uLidcbiAgICAgIGludmFsaWRBbmNlc3RvciA/IFsnLi4uJ10gOiBbXSwgY2hpbGRPd25lck5hbWVzLCBjaGlsZFRhZykuam9pbignID4gJyk7XG5cbiAgICAgIHZhciB3YXJuS2V5ID0gISFpbnZhbGlkUGFyZW50ICsgJ3wnICsgY2hpbGRUYWcgKyAnfCcgKyBhbmNlc3RvclRhZyArICd8JyArIG93bmVySW5mbztcbiAgICAgIGlmIChkaWRXYXJuW3dhcm5LZXldKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGRpZFdhcm5bd2FybktleV0gPSB0cnVlO1xuXG4gICAgICB2YXIgdGFnRGlzcGxheU5hbWUgPSBjaGlsZFRhZztcbiAgICAgIHZhciB3aGl0ZXNwYWNlSW5mbyA9ICcnO1xuICAgICAgaWYgKGNoaWxkVGFnID09PSAnI3RleHQnKSB7XG4gICAgICAgIGlmICgvXFxTLy50ZXN0KGNoaWxkVGV4dCkpIHtcbiAgICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICdUZXh0IG5vZGVzJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICdXaGl0ZXNwYWNlIHRleHQgbm9kZXMnO1xuICAgICAgICAgIHdoaXRlc3BhY2VJbmZvID0gJyBNYWtlIHN1cmUgeW91IGRvblxcJ3QgaGF2ZSBhbnkgZXh0cmEgd2hpdGVzcGFjZSBiZXR3ZWVuIHRhZ3Mgb24gJyArICdlYWNoIGxpbmUgb2YgeW91ciBzb3VyY2UgY29kZS4nO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YWdEaXNwbGF5TmFtZSA9ICc8JyArIGNoaWxkVGFnICsgJz4nO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW52YWxpZFBhcmVudCkge1xuICAgICAgICB2YXIgaW5mbyA9ICcnO1xuICAgICAgICBpZiAoYW5jZXN0b3JUYWcgPT09ICd0YWJsZScgJiYgY2hpbGRUYWcgPT09ICd0cicpIHtcbiAgICAgICAgICBpbmZvICs9ICcgQWRkIGEgPHRib2R5PiB0byB5b3VyIGNvZGUgdG8gbWF0Y2ggdGhlIERPTSB0cmVlIGdlbmVyYXRlZCBieSAnICsgJ3RoZSBicm93c2VyLic7XG4gICAgICAgIH1cbiAgICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAndmFsaWRhdGVET01OZXN0aW5nKC4uLik6ICVzIGNhbm5vdCBhcHBlYXIgYXMgYSBjaGlsZCBvZiA8JXM+LiVzICcgKyAnU2VlICVzLiVzJywgdGFnRGlzcGxheU5hbWUsIGFuY2VzdG9yVGFnLCB3aGl0ZXNwYWNlSW5mbywgb3duZXJJbmZvLCBpbmZvKSA6IHZvaWQgMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ3ZhbGlkYXRlRE9NTmVzdGluZyguLi4pOiAlcyBjYW5ub3QgYXBwZWFyIGFzIGEgZGVzY2VuZGFudCBvZiAnICsgJzwlcz4uIFNlZSAlcy4nLCB0YWdEaXNwbGF5TmFtZSwgYW5jZXN0b3JUYWcsIG93bmVySW5mbykgOiB2b2lkIDA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHZhbGlkYXRlRE9NTmVzdGluZy51cGRhdGVkQW5jZXN0b3JJbmZvID0gdXBkYXRlZEFuY2VzdG9ySW5mbztcblxuICAvLyBGb3IgdGVzdGluZ1xuICB2YWxpZGF0ZURPTU5lc3RpbmcuaXNUYWdWYWxpZEluQ29udGV4dCA9IGZ1bmN0aW9uICh0YWcsIGFuY2VzdG9ySW5mbykge1xuICAgIGFuY2VzdG9ySW5mbyA9IGFuY2VzdG9ySW5mbyB8fCBlbXB0eUFuY2VzdG9ySW5mbztcbiAgICB2YXIgcGFyZW50SW5mbyA9IGFuY2VzdG9ySW5mby5jdXJyZW50O1xuICAgIHZhciBwYXJlbnRUYWcgPSBwYXJlbnRJbmZvICYmIHBhcmVudEluZm8udGFnO1xuICAgIHJldHVybiBpc1RhZ1ZhbGlkV2l0aFBhcmVudCh0YWcsIHBhcmVudFRhZykgJiYgIWZpbmRJbnZhbGlkQW5jZXN0b3JGb3JUYWcodGFnLCBhbmNlc3RvckluZm8pO1xuICB9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHZhbGlkYXRlRE9NTmVzdGluZzsiLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJyZWFjdFwiKSwgcmVxdWlyZShcInByb3AtdHlwZXNcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW1wicmVhY3RcIiwgXCJwcm9wLXR5cGVzXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkRyb3B6b25lXCJdID0gZmFjdG9yeShyZXF1aXJlKFwicmVhY3RcIiksIHJlcXVpcmUoXCJwcm9wLXR5cGVzXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJEcm9wem9uZVwiXSA9IGZhY3Rvcnkocm9vdFtcInJlYWN0XCJdLCByb290W1wicHJvcC10eXBlc1wiXSk7XG59KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzJfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8zX18pIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pXG4vKioqKioqLyBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbi8qKioqKiovIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fSxcbi8qKioqKiovIFx0XHRcdGlkOiBtb2R1bGVJZCxcbi8qKioqKiovIFx0XHRcdGxvYWRlZDogZmFsc2Vcbi8qKioqKiovIFx0XHR9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbi8qKioqKiovIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuLyoqKioqKi8gXHRcdG1vZHVsZS5sb2FkZWQgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXHQvKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24ocHJvY2Vzcykgeyd1c2Ugc3RyaWN0Jztcblx0XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuXHQgIHZhbHVlOiB0cnVlXG5cdH0pO1xuXHRcblx0dmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblx0XG5cdHZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7XG5cdFxuXHR2YXIgX3JlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblx0XG5cdHZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXHRcblx0dmFyIF9wcm9wVHlwZXMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpO1xuXHRcblx0dmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblx0XG5cdHZhciBfYXR0ckFjY2VwdCA9IF9fd2VicGFja19yZXF1aXJlX18oNCk7XG5cdFxuXHR2YXIgX2F0dHJBY2NlcHQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXR0ckFjY2VwdCk7XG5cdFxuXHR2YXIgX2dldERhdGFUcmFuc2Zlckl0ZW1zID0gX193ZWJwYWNrX3JlcXVpcmVfXyg1KTtcblx0XG5cdHZhciBfZ2V0RGF0YVRyYW5zZmVySXRlbXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0RGF0YVRyYW5zZmVySXRlbXMpO1xuXHRcblx0ZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblx0XG5cdGZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvYmosIGtleXMpIHsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBpIGluIG9iaikgeyBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTsgdGFyZ2V0W2ldID0gb2JqW2ldOyB9IHJldHVybiB0YXJnZXQ7IH1cblx0XG5cdGZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheShhcnIpIHsgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgeyBmb3IgKHZhciBpID0gMCwgYXJyMiA9IEFycmF5KGFyci5sZW5ndGgpOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7IGFycjJbaV0gPSBhcnJbaV07IH0gcmV0dXJuIGFycjI7IH0gZWxzZSB7IHJldHVybiBBcnJheS5mcm9tKGFycik7IH0gfVxuXHRcblx0ZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblx0XG5cdGZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXHRcblx0ZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9IC8qIGVzbGludCBwcmVmZXItdGVtcGxhdGU6IDAgKi9cblx0XG5cdHZhciBzdXBwb3J0TXVsdGlwbGUgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50ICYmIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgPyAnbXVsdGlwbGUnIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0JykgOiB0cnVlO1xuXHRcblx0dmFyIERyb3B6b25lID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcblx0ICBfaW5oZXJpdHMoRHJvcHpvbmUsIF9SZWFjdCRDb21wb25lbnQpO1xuXHRcblx0ICBfY3JlYXRlQ2xhc3MoRHJvcHpvbmUsIG51bGwsIFt7XG5cdCAgICBrZXk6ICdvbkRvY3VtZW50RHJhZ092ZXInLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIG9uRG9jdW1lbnREcmFnT3ZlcihlKSB7XG5cdCAgICAgIC8vIGFsbG93IHRoZSBlbnRpcmUgZG9jdW1lbnQgdG8gYmUgYSBkcmFnIHRhcmdldFxuXHQgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICB9XG5cdCAgfV0pO1xuXHRcblx0ICBmdW5jdGlvbiBEcm9wem9uZShwcm9wcywgY29udGV4dCkge1xuXHQgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIERyb3B6b25lKTtcblx0XG5cdCAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoRHJvcHpvbmUuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihEcm9wem9uZSkpLmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblx0XG5cdCAgICBfdGhpcy5yZW5kZXJDaGlsZHJlbiA9IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuXHQgICAgICBpZiAodHlwZW9mIGNoaWxkcmVuID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgcmV0dXJuIGNoaWxkcmVuKF90aGlzLnN0YXRlKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gY2hpbGRyZW47XG5cdCAgICB9O1xuXHRcblx0ICAgIF90aGlzLm9uQ2xpY2sgPSBfdGhpcy5vbkNsaWNrLmJpbmQoX3RoaXMpO1xuXHQgICAgX3RoaXMub25Eb2N1bWVudERyb3AgPSBfdGhpcy5vbkRvY3VtZW50RHJvcC5iaW5kKF90aGlzKTtcblx0ICAgIF90aGlzLm9uRHJhZ1N0YXJ0ID0gX3RoaXMub25EcmFnU3RhcnQuYmluZChfdGhpcyk7XG5cdCAgICBfdGhpcy5vbkRyYWdFbnRlciA9IF90aGlzLm9uRHJhZ0VudGVyLmJpbmQoX3RoaXMpO1xuXHQgICAgX3RoaXMub25EcmFnTGVhdmUgPSBfdGhpcy5vbkRyYWdMZWF2ZS5iaW5kKF90aGlzKTtcblx0ICAgIF90aGlzLm9uRHJhZ092ZXIgPSBfdGhpcy5vbkRyYWdPdmVyLmJpbmQoX3RoaXMpO1xuXHQgICAgX3RoaXMub25Ecm9wID0gX3RoaXMub25Ecm9wLmJpbmQoX3RoaXMpO1xuXHQgICAgX3RoaXMub25GaWxlRGlhbG9nQ2FuY2VsID0gX3RoaXMub25GaWxlRGlhbG9nQ2FuY2VsLmJpbmQoX3RoaXMpO1xuXHQgICAgX3RoaXMuZmlsZUFjY2VwdGVkID0gX3RoaXMuZmlsZUFjY2VwdGVkLmJpbmQoX3RoaXMpO1xuXHQgICAgX3RoaXMuc2V0UmVmID0gX3RoaXMuc2V0UmVmLmJpbmQoX3RoaXMpO1xuXHQgICAgX3RoaXMuaXNGaWxlRGlhbG9nQWN0aXZlID0gZmFsc2U7XG5cdCAgICBfdGhpcy5zdGF0ZSA9IHtcblx0ICAgICAgaXNEcmFnQWN0aXZlOiBmYWxzZSxcblx0ICAgICAgYWNjZXB0ZWRGaWxlczogW10sXG5cdCAgICAgIHJlamVjdGVkRmlsZXM6IFtdXG5cdCAgICB9O1xuXHQgICAgcmV0dXJuIF90aGlzO1xuXHQgIH1cblx0XG5cdCAgX2NyZWF0ZUNsYXNzKERyb3B6b25lLCBbe1xuXHQgICAga2V5OiAnY29tcG9uZW50RGlkTW91bnQnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuXHQgICAgICB2YXIgcHJldmVudERyb3BPbkRvY3VtZW50ID0gdGhpcy5wcm9wcy5wcmV2ZW50RHJvcE9uRG9jdW1lbnQ7XG5cdFxuXHQgICAgICB0aGlzLmRyYWdUYXJnZXRzID0gW107XG5cdFxuXHQgICAgICBpZiAocHJldmVudERyb3BPbkRvY3VtZW50KSB7XG5cdCAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCBEcm9wem9uZS5vbkRvY3VtZW50RHJhZ092ZXIsIGZhbHNlKTtcblx0ICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5vbkRvY3VtZW50RHJvcCwgZmFsc2UpO1xuXHQgICAgICB9XG5cdCAgICAgIC8vIFRyaWVkIGltcGxlbWVudGluZyBhZGRFdmVudExpc3RlbmVyLCBidXQgZGlkbid0IHdvcmsgb3V0XG5cdCAgICAgIGRvY3VtZW50LmJvZHkub25mb2N1cyA9IHRoaXMub25GaWxlRGlhbG9nQ2FuY2VsO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ2NvbXBvbmVudFdpbGxVbm1vdW50Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcblx0ICAgICAgdmFyIHByZXZlbnREcm9wT25Eb2N1bWVudCA9IHRoaXMucHJvcHMucHJldmVudERyb3BPbkRvY3VtZW50O1xuXHRcblx0ICAgICAgaWYgKHByZXZlbnREcm9wT25Eb2N1bWVudCkge1xuXHQgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgRHJvcHpvbmUub25Eb2N1bWVudERyYWdPdmVyKTtcblx0ICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5vbkRvY3VtZW50RHJvcCk7XG5cdCAgICAgIH1cblx0ICAgICAgLy8gQ2FuIGJlIHJlcGxhY2VkIHdpdGggcmVtb3ZlRXZlbnRMaXN0ZW5lciwgaWYgYWRkRXZlbnRMaXN0ZW5lciB3b3Jrc1xuXHQgICAgICBkb2N1bWVudC5ib2R5Lm9uZm9jdXMgPSBudWxsO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29uRG9jdW1lbnREcm9wJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvbkRvY3VtZW50RHJvcChlKSB7XG5cdCAgICAgIGlmICh0aGlzLm5vZGUuY29udGFpbnMoZS50YXJnZXQpKSB7XG5cdCAgICAgICAgLy8gaWYgd2UgaW50ZXJjZXB0ZWQgYW4gZXZlbnQgZm9yIG91ciBpbnN0YW5jZSwgbGV0IGl0IHByb3BhZ2F0ZSBkb3duIHRvIHRoZSBpbnN0YW5jZSdzIG9uRHJvcCBoYW5kbGVyXG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgICB9XG5cdCAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblx0ICAgICAgdGhpcy5kcmFnVGFyZ2V0cyA9IFtdO1xuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29uRHJhZ1N0YXJ0Jyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBvbkRyYWdTdGFydChlKSB7XG5cdCAgICAgIGlmICh0aGlzLnByb3BzLm9uRHJhZ1N0YXJ0KSB7XG5cdCAgICAgICAgdGhpcy5wcm9wcy5vbkRyYWdTdGFydC5jYWxsKHRoaXMsIGUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnb25EcmFnRW50ZXInLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIG9uRHJhZ0VudGVyKGUpIHtcblx0ICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcblx0ICAgICAgLy8gQ291bnQgdGhlIGRyb3B6b25lIGFuZCBhbnkgY2hpbGRyZW4gdGhhdCBhcmUgZW50ZXJlZC5cblx0ICAgICAgaWYgKHRoaXMuZHJhZ1RhcmdldHMuaW5kZXhPZihlLnRhcmdldCkgPT09IC0xKSB7XG5cdCAgICAgICAgdGhpcy5kcmFnVGFyZ2V0cy5wdXNoKGUudGFyZ2V0KTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdmFyIGZpbGVzID0gKDAsIF9nZXREYXRhVHJhbnNmZXJJdGVtczIuZGVmYXVsdCkoZSk7XG5cdCAgICAgIHZhciBhbGxGaWxlc0FjY2VwdGVkID0gdGhpcy5hbGxGaWxlc0FjY2VwdGVkKGZpbGVzKTtcblx0ICAgICAgdmFyIGlzTXVsdGlwbGVBbGxvd2VkID0gdGhpcy5wcm9wcy5tdWx0aXBsZSB8fCBmaWxlcy5sZW5ndGggPD0gMTtcblx0XG5cdCAgICAgIHRoaXMuc2V0U3RhdGUoe1xuXHQgICAgICAgIGlzRHJhZ0FjdGl2ZTogYWxsRmlsZXNBY2NlcHRlZCxcblx0ICAgICAgICBpc0RyYWdSZWplY3Q6ICFhbGxGaWxlc0FjY2VwdGVkIHx8ICFpc011bHRpcGxlQWxsb3dlZFxuXHQgICAgICB9KTtcblx0XG5cdCAgICAgIGlmICh0aGlzLnByb3BzLm9uRHJhZ0VudGVyKSB7XG5cdCAgICAgICAgdGhpcy5wcm9wcy5vbkRyYWdFbnRlci5jYWxsKHRoaXMsIGUpO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnb25EcmFnT3ZlcicsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gb25EcmFnT3ZlcihlKSB7XG5cdCAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuXHQgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cdCAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdCAgICAgIHRyeSB7XG5cdCAgICAgICAgZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuXHQgICAgICB9IGNhdGNoIChlcnIpIHtcblx0ICAgICAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yXG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGlmICh0aGlzLnByb3BzLm9uRHJhZ092ZXIpIHtcblx0ICAgICAgICB0aGlzLnByb3BzLm9uRHJhZ092ZXIuY2FsbCh0aGlzLCBlKTtcblx0ICAgICAgfVxuXHQgICAgICByZXR1cm4gZmFsc2U7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnb25EcmFnTGVhdmUnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIG9uRHJhZ0xlYXZlKGUpIHtcblx0ICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cdFxuXHQgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cdFxuXHQgICAgICAvLyBPbmx5IGRlYWN0aXZhdGUgb25jZSB0aGUgZHJvcHpvbmUgYW5kIGFsbCBjaGlsZHJlbiBoYXZlIGJlZW4gbGVmdC5cblx0ICAgICAgdGhpcy5kcmFnVGFyZ2V0cyA9IHRoaXMuZHJhZ1RhcmdldHMuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuXHQgICAgICAgIHJldHVybiBlbCAhPT0gZS50YXJnZXQgJiYgX3RoaXMyLm5vZGUuY29udGFpbnMoZWwpO1xuXHQgICAgICB9KTtcblx0ICAgICAgaWYgKHRoaXMuZHJhZ1RhcmdldHMubGVuZ3RoID4gMCkge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgdGhpcy5zZXRTdGF0ZSh7XG5cdCAgICAgICAgaXNEcmFnQWN0aXZlOiBmYWxzZSxcblx0ICAgICAgICBpc0RyYWdSZWplY3Q6IGZhbHNlXG5cdCAgICAgIH0pO1xuXHRcblx0ICAgICAgaWYgKHRoaXMucHJvcHMub25EcmFnTGVhdmUpIHtcblx0ICAgICAgICB0aGlzLnByb3BzLm9uRHJhZ0xlYXZlLmNhbGwodGhpcywgZSk7XG5cdCAgICAgIH1cblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdvbkRyb3AnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIG9uRHJvcChlKSB7XG5cdCAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXHRcblx0ICAgICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG5cdCAgICAgICAgICBvbkRyb3AgPSBfcHJvcHMub25Ecm9wLFxuXHQgICAgICAgICAgb25Ecm9wQWNjZXB0ZWQgPSBfcHJvcHMub25Ecm9wQWNjZXB0ZWQsXG5cdCAgICAgICAgICBvbkRyb3BSZWplY3RlZCA9IF9wcm9wcy5vbkRyb3BSZWplY3RlZCxcblx0ICAgICAgICAgIG11bHRpcGxlID0gX3Byb3BzLm11bHRpcGxlLFxuXHQgICAgICAgICAgZGlzYWJsZVByZXZpZXcgPSBfcHJvcHMuZGlzYWJsZVByZXZpZXc7XG5cdFxuXHQgICAgICB2YXIgZmlsZUxpc3QgPSAoMCwgX2dldERhdGFUcmFuc2Zlckl0ZW1zMi5kZWZhdWx0KShlKTtcblx0ICAgICAgdmFyIGFjY2VwdGVkRmlsZXMgPSBbXTtcblx0ICAgICAgdmFyIHJlamVjdGVkRmlsZXMgPSBbXTtcblx0XG5cdCAgICAgIC8vIFN0b3AgZGVmYXVsdCBicm93c2VyIGJlaGF2aW9yXG5cdCAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblx0XG5cdCAgICAgIC8vIFJlc2V0IHRoZSBjb3VudGVyIGFsb25nIHdpdGggdGhlIGRyYWcgb24gYSBkcm9wLlxuXHQgICAgICB0aGlzLmRyYWdUYXJnZXRzID0gW107XG5cdCAgICAgIHRoaXMuaXNGaWxlRGlhbG9nQWN0aXZlID0gZmFsc2U7XG5cdFxuXHQgICAgICBmaWxlTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChmaWxlKSB7XG5cdCAgICAgICAgaWYgKCFkaXNhYmxlUHJldmlldykge1xuXHQgICAgICAgICAgdHJ5IHtcblx0ICAgICAgICAgICAgZmlsZS5wcmV2aWV3ID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cblx0ICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuXHQgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuXHQgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBnZW5lcmF0ZSBwcmV2aWV3IGZvciBmaWxlJywgZmlsZSwgZXJyKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG5cdCAgICAgICAgICAgIH1cblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9XG5cdFxuXHQgICAgICAgIGlmIChfdGhpczMuZmlsZUFjY2VwdGVkKGZpbGUpICYmIF90aGlzMy5maWxlTWF0Y2hTaXplKGZpbGUpKSB7XG5cdCAgICAgICAgICBhY2NlcHRlZEZpbGVzLnB1c2goZmlsZSk7XG5cdCAgICAgICAgfSBlbHNlIHtcblx0ICAgICAgICAgIHJlamVjdGVkRmlsZXMucHVzaChmaWxlKTtcblx0ICAgICAgICB9XG5cdCAgICAgIH0pO1xuXHRcblx0ICAgICAgaWYgKCFtdWx0aXBsZSkge1xuXHQgICAgICAgIC8vIGlmIG5vdCBpbiBtdWx0aSBtb2RlIGFkZCBhbnkgZXh0cmEgYWNjZXB0ZWQgZmlsZXMgdG8gcmVqZWN0ZWQuXG5cdCAgICAgICAgLy8gVGhpcyB3aWxsIGFsbG93IGVuZCB1c2VycyB0byBlYXNpbHkgaWdub3JlIGEgbXVsdGkgZmlsZSBkcm9wIGluIFwic2luZ2xlXCIgbW9kZS5cblx0ICAgICAgICByZWplY3RlZEZpbGVzLnB1c2guYXBwbHkocmVqZWN0ZWRGaWxlcywgX3RvQ29uc3VtYWJsZUFycmF5KGFjY2VwdGVkRmlsZXMuc3BsaWNlKDEpKSk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGlmIChvbkRyb3ApIHtcblx0ICAgICAgICBvbkRyb3AuY2FsbCh0aGlzLCBhY2NlcHRlZEZpbGVzLCByZWplY3RlZEZpbGVzLCBlKTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgaWYgKHJlamVjdGVkRmlsZXMubGVuZ3RoID4gMCAmJiBvbkRyb3BSZWplY3RlZCkge1xuXHQgICAgICAgIG9uRHJvcFJlamVjdGVkLmNhbGwodGhpcywgcmVqZWN0ZWRGaWxlcywgZSk7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIGlmIChhY2NlcHRlZEZpbGVzLmxlbmd0aCA+IDAgJiYgb25Ecm9wQWNjZXB0ZWQpIHtcblx0ICAgICAgICBvbkRyb3BBY2NlcHRlZC5jYWxsKHRoaXMsIGFjY2VwdGVkRmlsZXMsIGUpO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICAvLyBSZXNldCBkcmFnIHN0YXRlXG5cdCAgICAgIHRoaXMuc2V0U3RhdGUoe1xuXHQgICAgICAgIGlzRHJhZ0FjdGl2ZTogZmFsc2UsXG5cdCAgICAgICAgaXNEcmFnUmVqZWN0OiBmYWxzZSxcblx0ICAgICAgICBhY2NlcHRlZEZpbGVzOiBhY2NlcHRlZEZpbGVzLFxuXHQgICAgICAgIHJlamVjdGVkRmlsZXM6IHJlamVjdGVkRmlsZXNcblx0ICAgICAgfSk7XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnb25DbGljaycsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gb25DbGljayhlKSB7XG5cdCAgICAgIHZhciBfcHJvcHMyID0gdGhpcy5wcm9wcyxcblx0ICAgICAgICAgIG9uQ2xpY2sgPSBfcHJvcHMyLm9uQ2xpY2ssXG5cdCAgICAgICAgICBkaXNhYmxlQ2xpY2sgPSBfcHJvcHMyLmRpc2FibGVDbGljaztcblx0XG5cdCAgICAgIGlmICghZGlzYWJsZUNsaWNrKSB7XG5cdCAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0ICAgICAgICB0aGlzLm9wZW4oKTtcblx0ICAgICAgICBpZiAob25DbGljaykge1xuXHQgICAgICAgICAgb25DbGljay5jYWxsKHRoaXMsIGUpO1xuXHQgICAgICAgIH1cblx0ICAgICAgfVxuXHQgICAgfVxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29uRmlsZURpYWxvZ0NhbmNlbCcsXG5cdCAgICB2YWx1ZTogZnVuY3Rpb24gb25GaWxlRGlhbG9nQ2FuY2VsKCkge1xuXHQgICAgICAvLyB0aW1lb3V0IHdpbGwgbm90IHJlY29nbml6ZSBjb250ZXh0IG9mIHRoaXMgbWV0aG9kXG5cdCAgICAgIHZhciBvbkZpbGVEaWFsb2dDYW5jZWwgPSB0aGlzLnByb3BzLm9uRmlsZURpYWxvZ0NhbmNlbDtcblx0ICAgICAgdmFyIGZpbGVJbnB1dEVsID0gdGhpcy5maWxlSW5wdXRFbDtcblx0ICAgICAgdmFyIGlzRmlsZURpYWxvZ0FjdGl2ZSA9IHRoaXMuaXNGaWxlRGlhbG9nQWN0aXZlO1xuXHQgICAgICAvLyBleGVjdXRlIHRoZSB0aW1lb3V0IG9ubHkgaWYgdGhlIG9uRmlsZURpYWxvZ0NhbmNlbCBpcyBkZWZpbmVkIGFuZCBGaWxlRGlhbG9nXG5cdCAgICAgIC8vIGlzIG9wZW5lZCBpbiB0aGUgYnJvd3NlclxuXHRcblx0ICAgICAgaWYgKG9uRmlsZURpYWxvZ0NhbmNlbCAmJiBpc0ZpbGVEaWFsb2dBY3RpdmUpIHtcblx0ICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcblx0ICAgICAgICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IGFzIEZpbGVMaXN0XG5cdCAgICAgICAgICB2YXIgRmlsZUxpc3QgPSBmaWxlSW5wdXRFbC5maWxlcztcblx0ICAgICAgICAgIGlmICghRmlsZUxpc3QubGVuZ3RoKSB7XG5cdCAgICAgICAgICAgIGlzRmlsZURpYWxvZ0FjdGl2ZSA9IGZhbHNlO1xuXHQgICAgICAgICAgICBvbkZpbGVEaWFsb2dDYW5jZWwoKTtcblx0ICAgICAgICAgIH1cblx0ICAgICAgICB9LCAzMDApO1xuXHQgICAgICB9XG5cdCAgICB9XG5cdCAgfSwge1xuXHQgICAga2V5OiAnc2V0UmVmJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRSZWYocmVmKSB7XG5cdCAgICAgIHRoaXMubm9kZSA9IHJlZjtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdmaWxlQWNjZXB0ZWQnLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIGZpbGVBY2NlcHRlZChmaWxlKSB7XG5cdCAgICAgIC8vIEZpcmVmb3ggdmVyc2lvbnMgcHJpb3IgdG8gNTMgcmV0dXJuIGEgYm9ndXMgTUlNRSB0eXBlIGZvciBldmVyeSBmaWxlIGRyYWcsIHNvIGRyYWdvdmVycyB3aXRoXG5cdCAgICAgIC8vIHRoYXQgTUlNRSB0eXBlIHdpbGwgYWx3YXlzIGJlIGFjY2VwdGVkXG5cdCAgICAgIHJldHVybiBmaWxlLnR5cGUgPT09ICdhcHBsaWNhdGlvbi94LW1vei1maWxlJyB8fCAoMCwgX2F0dHJBY2NlcHQyLmRlZmF1bHQpKGZpbGUsIHRoaXMucHJvcHMuYWNjZXB0KTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdmaWxlTWF0Y2hTaXplJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBmaWxlTWF0Y2hTaXplKGZpbGUpIHtcblx0ICAgICAgcmV0dXJuIGZpbGUuc2l6ZSA8PSB0aGlzLnByb3BzLm1heFNpemUgJiYgZmlsZS5zaXplID49IHRoaXMucHJvcHMubWluU2l6ZTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdhbGxGaWxlc0FjY2VwdGVkJyxcblx0ICAgIHZhbHVlOiBmdW5jdGlvbiBhbGxGaWxlc0FjY2VwdGVkKGZpbGVzKSB7XG5cdCAgICAgIHJldHVybiBmaWxlcy5ldmVyeSh0aGlzLmZpbGVBY2NlcHRlZCk7XG5cdCAgICB9XG5cdFxuXHQgICAgLyoqXG5cdCAgICAgKiBPcGVuIHN5c3RlbSBmaWxlIHVwbG9hZCBkaWFsb2cuXG5cdCAgICAgKlxuXHQgICAgICogQHB1YmxpY1xuXHQgICAgICovXG5cdFxuXHQgIH0sIHtcblx0ICAgIGtleTogJ29wZW4nLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIG9wZW4oKSB7XG5cdCAgICAgIHRoaXMuaXNGaWxlRGlhbG9nQWN0aXZlID0gdHJ1ZTtcblx0ICAgICAgdGhpcy5maWxlSW5wdXRFbC52YWx1ZSA9IG51bGw7XG5cdCAgICAgIHRoaXMuZmlsZUlucHV0RWwuY2xpY2soKTtcblx0ICAgIH1cblx0ICB9LCB7XG5cdCAgICBrZXk6ICdyZW5kZXInLFxuXHQgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcblx0ICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cdFxuXHQgICAgICB2YXIgX3Byb3BzMyA9IHRoaXMucHJvcHMsXG5cdCAgICAgICAgICBhY2NlcHQgPSBfcHJvcHMzLmFjY2VwdCxcblx0ICAgICAgICAgIGFjdGl2ZUNsYXNzTmFtZSA9IF9wcm9wczMuYWN0aXZlQ2xhc3NOYW1lLFxuXHQgICAgICAgICAgaW5wdXRQcm9wcyA9IF9wcm9wczMuaW5wdXRQcm9wcyxcblx0ICAgICAgICAgIG11bHRpcGxlID0gX3Byb3BzMy5tdWx0aXBsZSxcblx0ICAgICAgICAgIG5hbWUgPSBfcHJvcHMzLm5hbWUsXG5cdCAgICAgICAgICByZWplY3RDbGFzc05hbWUgPSBfcHJvcHMzLnJlamVjdENsYXNzTmFtZSxcblx0ICAgICAgICAgIGNoaWxkcmVuID0gX3Byb3BzMy5jaGlsZHJlbixcblx0ICAgICAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3Byb3BzMywgWydhY2NlcHQnLCAnYWN0aXZlQ2xhc3NOYW1lJywgJ2lucHV0UHJvcHMnLCAnbXVsdGlwbGUnLCAnbmFtZScsICdyZWplY3RDbGFzc05hbWUnLCAnY2hpbGRyZW4nXSk7XG5cdFxuXHQgICAgICB2YXIgYWN0aXZlU3R5bGUgPSByZXN0LmFjdGl2ZVN0eWxlLFxuXHQgICAgICAgICAgY2xhc3NOYW1lID0gcmVzdC5jbGFzc05hbWUsXG5cdCAgICAgICAgICByZWplY3RTdHlsZSA9IHJlc3QucmVqZWN0U3R5bGUsXG5cdCAgICAgICAgICBzdHlsZSA9IHJlc3Quc3R5bGUsXG5cdCAgICAgICAgICBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhyZXN0LCBbJ2FjdGl2ZVN0eWxlJywgJ2NsYXNzTmFtZScsICdyZWplY3RTdHlsZScsICdzdHlsZSddKTtcblx0XG5cdCAgICAgIHZhciBfc3RhdGUgPSB0aGlzLnN0YXRlLFxuXHQgICAgICAgICAgaXNEcmFnQWN0aXZlID0gX3N0YXRlLmlzRHJhZ0FjdGl2ZSxcblx0ICAgICAgICAgIGlzRHJhZ1JlamVjdCA9IF9zdGF0ZS5pc0RyYWdSZWplY3Q7XG5cdFxuXHRcblx0ICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lIHx8ICcnO1xuXHRcblx0ICAgICAgaWYgKGlzRHJhZ0FjdGl2ZSAmJiBhY3RpdmVDbGFzc05hbWUpIHtcblx0ICAgICAgICBjbGFzc05hbWUgKz0gJyAnICsgYWN0aXZlQ2xhc3NOYW1lO1xuXHQgICAgICB9XG5cdCAgICAgIGlmIChpc0RyYWdSZWplY3QgJiYgcmVqZWN0Q2xhc3NOYW1lKSB7XG5cdCAgICAgICAgY2xhc3NOYW1lICs9ICcgJyArIHJlamVjdENsYXNzTmFtZTtcblx0ICAgICAgfVxuXHRcblx0ICAgICAgaWYgKCFjbGFzc05hbWUgJiYgIXN0eWxlICYmICFhY3RpdmVTdHlsZSAmJiAhcmVqZWN0U3R5bGUpIHtcblx0ICAgICAgICBzdHlsZSA9IHtcblx0ICAgICAgICAgIHdpZHRoOiAyMDAsXG5cdCAgICAgICAgICBoZWlnaHQ6IDIwMCxcblx0ICAgICAgICAgIGJvcmRlcldpZHRoOiAyLFxuXHQgICAgICAgICAgYm9yZGVyQ29sb3I6ICcjNjY2Jyxcblx0ICAgICAgICAgIGJvcmRlclN0eWxlOiAnZGFzaGVkJyxcblx0ICAgICAgICAgIGJvcmRlclJhZGl1czogNVxuXHQgICAgICAgIH07XG5cdCAgICAgICAgYWN0aXZlU3R5bGUgPSB7XG5cdCAgICAgICAgICBib3JkZXJTdHlsZTogJ3NvbGlkJyxcblx0ICAgICAgICAgIGJvcmRlckNvbG9yOiAnIzZjNicsXG5cdCAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZWVlJ1xuXHQgICAgICAgIH07XG5cdCAgICAgICAgcmVqZWN0U3R5bGUgPSB7XG5cdCAgICAgICAgICBib3JkZXJTdHlsZTogJ3NvbGlkJyxcblx0ICAgICAgICAgIGJvcmRlckNvbG9yOiAnI2M2NicsXG5cdCAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZWVlJ1xuXHQgICAgICAgIH07XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIHZhciBhcHBsaWVkU3R5bGUgPSB2b2lkIDA7XG5cdCAgICAgIGlmIChhY3RpdmVTdHlsZSAmJiBpc0RyYWdBY3RpdmUpIHtcblx0ICAgICAgICBhcHBsaWVkU3R5bGUgPSBfZXh0ZW5kcyh7fSwgc3R5bGUsIGFjdGl2ZVN0eWxlKTtcblx0ICAgICAgfSBlbHNlIGlmIChyZWplY3RTdHlsZSAmJiBpc0RyYWdSZWplY3QpIHtcblx0ICAgICAgICBhcHBsaWVkU3R5bGUgPSBfZXh0ZW5kcyh7fSwgc3R5bGUsIHJlamVjdFN0eWxlKTtcblx0ICAgICAgfSBlbHNlIHtcblx0ICAgICAgICBhcHBsaWVkU3R5bGUgPSBfZXh0ZW5kcyh7fSwgc3R5bGUpO1xuXHQgICAgICB9XG5cdFxuXHQgICAgICB2YXIgaW5wdXRBdHRyaWJ1dGVzID0ge1xuXHQgICAgICAgIGFjY2VwdDogYWNjZXB0LFxuXHQgICAgICAgIHR5cGU6ICdmaWxlJyxcblx0ICAgICAgICBzdHlsZTogeyBkaXNwbGF5OiAnbm9uZScgfSxcblx0ICAgICAgICBtdWx0aXBsZTogc3VwcG9ydE11bHRpcGxlICYmIG11bHRpcGxlLFxuXHQgICAgICAgIHJlZjogZnVuY3Rpb24gcmVmKGVsKSB7XG5cdCAgICAgICAgICByZXR1cm4gX3RoaXM0LmZpbGVJbnB1dEVsID0gZWw7XG5cdCAgICAgICAgfSwgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXHQgICAgICAgIG9uQ2hhbmdlOiB0aGlzLm9uRHJvcFxuXHQgICAgICB9O1xuXHRcblx0ICAgICAgaWYgKG5hbWUgJiYgbmFtZS5sZW5ndGgpIHtcblx0ICAgICAgICBpbnB1dEF0dHJpYnV0ZXMubmFtZSA9IG5hbWU7XG5cdCAgICAgIH1cblx0XG5cdCAgICAgIC8vIFJlbW92ZSBjdXN0b20gcHJvcGVydGllcyBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSB3cmFwcGVyIGRpdiBlbGVtZW50XG5cdCAgICAgIHZhciBjdXN0b21Qcm9wcyA9IFsnYWNjZXB0ZWRGaWxlcycsICdwcmV2ZW50RHJvcE9uRG9jdW1lbnQnLCAnZGlzYWJsZVByZXZpZXcnLCAnZGlzYWJsZUNsaWNrJywgJ29uRHJvcEFjY2VwdGVkJywgJ29uRHJvcFJlamVjdGVkJywgJ29uRmlsZURpYWxvZ0NhbmNlbCcsICdtYXhTaXplJywgJ21pblNpemUnXTtcblx0ICAgICAgdmFyIGRpdlByb3BzID0gX2V4dGVuZHMoe30sIHByb3BzKTtcblx0ICAgICAgY3VzdG9tUHJvcHMuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuXHQgICAgICAgIHJldHVybiBkZWxldGUgZGl2UHJvcHNbcHJvcF07XG5cdCAgICAgIH0pO1xuXHRcblx0ICAgICAgcmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuXHQgICAgICAgICdkaXYnLFxuXHQgICAgICAgIF9leHRlbmRzKHtcblx0ICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuXHQgICAgICAgICAgc3R5bGU6IGFwcGxpZWRTdHlsZVxuXHQgICAgICAgIH0sIGRpdlByb3BzIC8qIGV4cGFuZCB1c2VyIHByb3ZpZGVkIHByb3BzIGZpcnN0IHNvIGV2ZW50IGhhbmRsZXJzIGFyZSBuZXZlciBvdmVycmlkZGVuICovLCB7XG5cdCAgICAgICAgICBvbkNsaWNrOiB0aGlzLm9uQ2xpY2ssXG5cdCAgICAgICAgICBvbkRyYWdTdGFydDogdGhpcy5vbkRyYWdTdGFydCxcblx0ICAgICAgICAgIG9uRHJhZ0VudGVyOiB0aGlzLm9uRHJhZ0VudGVyLFxuXHQgICAgICAgICAgb25EcmFnT3ZlcjogdGhpcy5vbkRyYWdPdmVyLFxuXHQgICAgICAgICAgb25EcmFnTGVhdmU6IHRoaXMub25EcmFnTGVhdmUsXG5cdCAgICAgICAgICBvbkRyb3A6IHRoaXMub25Ecm9wLFxuXHQgICAgICAgICAgcmVmOiB0aGlzLnNldFJlZlxuXHQgICAgICAgIH0pLFxuXHQgICAgICAgIHRoaXMucmVuZGVyQ2hpbGRyZW4oY2hpbGRyZW4pLFxuXHQgICAgICAgIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCdpbnB1dCcsIF9leHRlbmRzKHt9LCBpbnB1dFByb3BzIC8qIGV4cGFuZCB1c2VyIHByb3ZpZGVkIGlucHV0UHJvcHMgZmlyc3Qgc28gaW5wdXRBdHRyaWJ1dGVzIG92ZXJyaWRlIHRoZW0gKi8sIGlucHV0QXR0cmlidXRlcykpXG5cdCAgICAgICk7XG5cdCAgICB9XG5cdCAgfV0pO1xuXHRcblx0ICByZXR1cm4gRHJvcHpvbmU7XG5cdH0oX3JlYWN0Mi5kZWZhdWx0LkNvbXBvbmVudCk7XG5cdFxuXHREcm9wem9uZS5wcm9wVHlwZXMgPSB7XG5cdCAgLyoqXG5cdCAgICogQWxsb3cgc3BlY2lmaWMgdHlwZXMgb2YgZmlsZXMuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vb2tvbmV0L2F0dHItYWNjZXB0IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuXHQgICAqIEtlZXAgaW4gbWluZCB0aGF0IG1pbWUgdHlwZSBkZXRlcm1pbmF0aW9uIGlzIG5vdCByZWxpYWJsZSBhY2Nyb3NzIHBsYXRmb3Jtcy4gQ1NWIGZpbGVzLFxuXHQgICAqIGZvciBleGFtcGxlLCBhcmUgcmVwb3J0ZWQgYXMgdGV4dC9wbGFpbiB1bmRlciBtYWNPUyBidXQgYXMgYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsIHVuZGVyXG5cdCAgICogV2luZG93cy4gSW4gc29tZSBjYXNlcyB0aGVyZSBtaWdodCBub3QgYmUgYSBtaW1lIHR5cGUgc2V0IGF0IGFsbC5cblx0ICAgKiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9va29uZXQvcmVhY3QtZHJvcHpvbmUvaXNzdWVzLzI3NlxuXHQgICAqL1xuXHQgIGFjY2VwdDogX3Byb3BUeXBlczIuZGVmYXVsdC5zdHJpbmcsXG5cdFxuXHQgIC8qKlxuXHQgICAqIENvbnRlbnRzIG9mIHRoZSBkcm9wem9uZVxuXHQgICAqL1xuXHQgIGNoaWxkcmVuOiBfcHJvcFR5cGVzMi5kZWZhdWx0Lm9uZU9mVHlwZShbX3Byb3BUeXBlczIuZGVmYXVsdC5ub2RlLCBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmNdKSxcblx0XG5cdCAgLyoqXG5cdCAgICogRGlzYWxsb3cgY2xpY2tpbmcgb24gdGhlIGRyb3B6b25lIGNvbnRhaW5lciB0byBvcGVuIGZpbGUgZGlhbG9nXG5cdCAgICovXG5cdCAgZGlzYWJsZUNsaWNrOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2wsXG5cdFxuXHQgIC8qKlxuXHQgICAqIEVuYWJsZS9kaXNhYmxlIHByZXZpZXcgZ2VuZXJhdGlvblxuXHQgICAqL1xuXHQgIGRpc2FibGVQcmV2aWV3OiBfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2wsXG5cdFxuXHQgIC8qKlxuXHQgICAqIElmIGZhbHNlLCBhbGxvdyBkcm9wcGVkIGl0ZW1zIHRvIHRha2Ugb3ZlciB0aGUgY3VycmVudCBicm93c2VyIHdpbmRvd1xuXHQgICAqL1xuXHQgIHByZXZlbnREcm9wT25Eb2N1bWVudDogX3Byb3BUeXBlczIuZGVmYXVsdC5ib29sLFxuXHRcblx0ICAvKipcblx0ICAgKiBQYXNzIGFkZGl0aW9uYWwgYXR0cmlidXRlcyB0byB0aGUgYDxpbnB1dCB0eXBlPVwiZmlsZVwiLz5gIHRhZ1xuXHQgICAqL1xuXHQgIGlucHV0UHJvcHM6IF9wcm9wVHlwZXMyLmRlZmF1bHQub2JqZWN0LFxuXHRcblx0ICAvKipcblx0ICAgKiBBbGxvdyBkcm9wcGluZyBtdWx0aXBsZSBmaWxlc1xuXHQgICAqL1xuXHQgIG11bHRpcGxlOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2wsXG5cdFxuXHQgIC8qKlxuXHQgICAqIGBuYW1lYCBhdHRyaWJ1dGUgZm9yIHRoZSBpbnB1dCB0YWdcblx0ICAgKi9cblx0ICBuYW1lOiBfcHJvcFR5cGVzMi5kZWZhdWx0LnN0cmluZyxcblx0XG5cdCAgLyoqXG5cdCAgICogTWF4aW11bSBmaWxlIHNpemVcblx0ICAgKi9cblx0ICBtYXhTaXplOiBfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcixcblx0XG5cdCAgLyoqXG5cdCAgICogTWluaW11bSBmaWxlIHNpemVcblx0ICAgKi9cblx0ICBtaW5TaXplOiBfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcixcblx0XG5cdCAgLyoqXG5cdCAgICogY2xhc3NOYW1lXG5cdCAgICovXG5cdCAgY2xhc3NOYW1lOiBfcHJvcFR5cGVzMi5kZWZhdWx0LnN0cmluZyxcblx0XG5cdCAgLyoqXG5cdCAgICogY2xhc3NOYW1lIGZvciBhY2NlcHRlZCBzdGF0ZVxuXHQgICAqL1xuXHQgIGFjdGl2ZUNsYXNzTmFtZTogX3Byb3BUeXBlczIuZGVmYXVsdC5zdHJpbmcsXG5cdFxuXHQgIC8qKlxuXHQgICAqIGNsYXNzTmFtZSBmb3IgcmVqZWN0ZWQgc3RhdGVcblx0ICAgKi9cblx0ICByZWplY3RDbGFzc05hbWU6IF9wcm9wVHlwZXMyLmRlZmF1bHQuc3RyaW5nLFxuXHRcblx0ICAvKipcblx0ICAgKiBDU1Mgc3R5bGVzIHRvIGFwcGx5XG5cdCAgICovXG5cdCAgc3R5bGU6IF9wcm9wVHlwZXMyLmRlZmF1bHQub2JqZWN0LFxuXHRcblx0ICAvKipcblx0ICAgKiBDU1Mgc3R5bGVzIHRvIGFwcGx5IHdoZW4gZHJvcCB3aWxsIGJlIGFjY2VwdGVkXG5cdCAgICovXG5cdCAgYWN0aXZlU3R5bGU6IF9wcm9wVHlwZXMyLmRlZmF1bHQub2JqZWN0LFxuXHRcblx0ICAvKipcblx0ICAgKiBDU1Mgc3R5bGVzIHRvIGFwcGx5IHdoZW4gZHJvcCB3aWxsIGJlIHJlamVjdGVkXG5cdCAgICovXG5cdCAgcmVqZWN0U3R5bGU6IF9wcm9wVHlwZXMyLmRlZmF1bHQub2JqZWN0LFxuXHRcblx0ICAvKipcblx0ICAgKiBvbkNsaWNrIGNhbGxiYWNrXG5cdCAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcblx0ICAgKi9cblx0ICBvbkNsaWNrOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG5cdFxuXHQgIC8qKlxuXHQgICAqIG9uRHJvcCBjYWxsYmFja1xuXHQgICAqL1xuXHQgIG9uRHJvcDogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuXHRcblx0ICAvKipcblx0ICAgKiBvbkRyb3BBY2NlcHRlZCBjYWxsYmFja1xuXHQgICAqL1xuXHQgIG9uRHJvcEFjY2VwdGVkOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG5cdFxuXHQgIC8qKlxuXHQgICAqIG9uRHJvcFJlamVjdGVkIGNhbGxiYWNrXG5cdCAgICovXG5cdCAgb25Ecm9wUmVqZWN0ZWQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblx0XG5cdCAgLyoqXG5cdCAgICogb25EcmFnU3RhcnQgY2FsbGJhY2tcblx0ICAgKi9cblx0ICBvbkRyYWdTdGFydDogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuXHRcblx0ICAvKipcblx0ICAgKiBvbkRyYWdFbnRlciBjYWxsYmFja1xuXHQgICAqL1xuXHQgIG9uRHJhZ0VudGVyOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG5cdFxuXHQgIC8qKlxuXHQgICAqIG9uRHJhZ092ZXIgY2FsbGJhY2tcblx0ICAgKi9cblx0ICBvbkRyYWdPdmVyOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG5cdFxuXHQgIC8qKlxuXHQgICAqIG9uRHJhZ0xlYXZlIGNhbGxiYWNrXG5cdCAgICovXG5cdCAgb25EcmFnTGVhdmU6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblx0XG5cdCAgLyoqXG5cdCAgICogUHJvdmlkZSBhIGNhbGxiYWNrIG9uIGNsaWNraW5nIHRoZSBjYW5jZWwgYnV0dG9uIG9mIHRoZSBmaWxlIGRpYWxvZ1xuXHQgICAqL1xuXHQgIG9uRmlsZURpYWxvZ0NhbmNlbDogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jXG5cdH07XG5cdFxuXHREcm9wem9uZS5kZWZhdWx0UHJvcHMgPSB7XG5cdCAgcHJldmVudERyb3BPbkRvY3VtZW50OiB0cnVlLFxuXHQgIGRpc2FibGVQcmV2aWV3OiBmYWxzZSxcblx0ICBkaXNhYmxlQ2xpY2s6IGZhbHNlLFxuXHQgIG11bHRpcGxlOiB0cnVlLFxuXHQgIG1heFNpemU6IEluZmluaXR5LFxuXHQgIG1pblNpemU6IDBcblx0fTtcblx0XG5cdGV4cG9ydHMuZGVmYXVsdCA9IERyb3B6b25lO1xuXHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTtcblx0LyogV0VCUEFDSyBWQVIgSU5KRUNUSU9OICovfS5jYWxsKGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18oMSkpKVxuXG4vKioqLyB9KSxcbi8qIDEgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHQvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcblx0dmFyIHByb2Nlc3MgPSBtb2R1bGUuZXhwb3J0cyA9IHt9O1xuXHRcblx0Ly8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG5cdC8vIGRvbid0IGJyZWFrIHRoaW5ncy4gIEJ1dCB3ZSBuZWVkIHRvIHdyYXAgaXQgaW4gYSB0cnkgY2F0Y2ggaW4gY2FzZSBpdCBpc1xuXHQvLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG5cdC8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cdFxuXHR2YXIgY2FjaGVkU2V0VGltZW91dDtcblx0dmFyIGNhY2hlZENsZWFyVGltZW91dDtcblx0XG5cdGZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcblx0fVxuXHRmdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcblx0ICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG5cdH1cblx0KGZ1bmN0aW9uICgpIHtcblx0ICAgIHRyeSB7XG5cdCAgICAgICAgaWYgKHR5cGVvZiBzZXRUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG5cdCAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuXHQgICAgICAgIH1cblx0ICAgIH0gY2F0Y2ggKGUpIHtcblx0ICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcblx0ICAgIH1cblx0ICAgIHRyeSB7XG5cdCAgICAgICAgaWYgKHR5cGVvZiBjbGVhclRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcblx0ICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuXHQgICAgICAgIH0gZWxzZSB7XG5cdCAgICAgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG5cdCAgICAgICAgfVxuXHQgICAgfSBjYXRjaCAoZSkge1xuXHQgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGRlZmF1bHRDbGVhclRpbWVvdXQ7XG5cdCAgICB9XG5cdH0gKCkpXG5cdGZ1bmN0aW9uIHJ1blRpbWVvdXQoZnVuKSB7XG5cdCAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuXHQgICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuXHQgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG5cdCAgICB9XG5cdCAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuXHQgICAgaWYgKChjYWNoZWRTZXRUaW1lb3V0ID09PSBkZWZhdWx0U2V0VGltb3V0IHx8ICFjYWNoZWRTZXRUaW1lb3V0KSAmJiBzZXRUaW1lb3V0KSB7XG5cdCAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG5cdCAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcblx0ICAgIH1cblx0ICAgIHRyeSB7XG5cdCAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuXHQgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0KGZ1biwgMCk7XG5cdCAgICB9IGNhdGNoKGUpe1xuXHQgICAgICAgIHRyeSB7XG5cdCAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCB0cnVzdCB0aGUgZ2xvYmFsIG9iamVjdCB3aGVuIGNhbGxlZCBub3JtYWxseVxuXHQgICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG5cdCAgICAgICAgfSBjYXRjaChlKXtcblx0ICAgICAgICAgICAgLy8gc2FtZSBhcyBhYm92ZSBidXQgd2hlbiBpdCdzIGEgdmVyc2lvbiBvZiBJLkUuIHRoYXQgbXVzdCBoYXZlIHRoZSBnbG9iYWwgb2JqZWN0IGZvciAndGhpcycsIGhvcGZ1bGx5IG91ciBjb250ZXh0IGNvcnJlY3Qgb3RoZXJ3aXNlIGl0IHdpbGwgdGhyb3cgYSBnbG9iYWwgZXJyb3Jcblx0ICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0XG5cdFxuXHR9XG5cdGZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcblx0ICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuXHQgICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuXHQgICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcblx0ICAgIH1cblx0ICAgIC8vIGlmIGNsZWFyVGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcblx0ICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuXHQgICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcblx0ICAgICAgICByZXR1cm4gY2xlYXJUaW1lb3V0KG1hcmtlcik7XG5cdCAgICB9XG5cdCAgICB0cnkge1xuXHQgICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3Ncblx0ICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG5cdCAgICB9IGNhdGNoIChlKXtcblx0ICAgICAgICB0cnkge1xuXHQgICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG5cdCAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuXHQgICAgICAgIH0gY2F0Y2ggKGUpe1xuXHQgICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cblx0ICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuXHQgICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwodGhpcywgbWFya2VyKTtcblx0ICAgICAgICB9XG5cdCAgICB9XG5cdFxuXHRcblx0XG5cdH1cblx0dmFyIHF1ZXVlID0gW107XG5cdHZhciBkcmFpbmluZyA9IGZhbHNlO1xuXHR2YXIgY3VycmVudFF1ZXVlO1xuXHR2YXIgcXVldWVJbmRleCA9IC0xO1xuXHRcblx0ZnVuY3Rpb24gY2xlYW5VcE5leHRUaWNrKCkge1xuXHQgICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG5cdCAgICAgICAgcmV0dXJuO1xuXHQgICAgfVxuXHQgICAgZHJhaW5pbmcgPSBmYWxzZTtcblx0ICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG5cdCAgICAgICAgcXVldWUgPSBjdXJyZW50UXVldWUuY29uY2F0KHF1ZXVlKTtcblx0ICAgIH0gZWxzZSB7XG5cdCAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuXHQgICAgfVxuXHQgICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuXHQgICAgICAgIGRyYWluUXVldWUoKTtcblx0ICAgIH1cblx0fVxuXHRcblx0ZnVuY3Rpb24gZHJhaW5RdWV1ZSgpIHtcblx0ICAgIGlmIChkcmFpbmluZykge1xuXHQgICAgICAgIHJldHVybjtcblx0ICAgIH1cblx0ICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuXHQgICAgZHJhaW5pbmcgPSB0cnVlO1xuXHRcblx0ICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG5cdCAgICB3aGlsZShsZW4pIHtcblx0ICAgICAgICBjdXJyZW50UXVldWUgPSBxdWV1ZTtcblx0ICAgICAgICBxdWV1ZSA9IFtdO1xuXHQgICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcblx0ICAgICAgICAgICAgaWYgKGN1cnJlbnRRdWV1ZSkge1xuXHQgICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcblx0ICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG5cdCAgICB9XG5cdCAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuXHQgICAgZHJhaW5pbmcgPSBmYWxzZTtcblx0ICAgIHJ1bkNsZWFyVGltZW91dCh0aW1lb3V0KTtcblx0fVxuXHRcblx0cHJvY2Vzcy5uZXh0VGljayA9IGZ1bmN0aW9uIChmdW4pIHtcblx0ICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcblx0ICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuXHQgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG5cdCAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuXHQgICAgICAgIH1cblx0ICAgIH1cblx0ICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG5cdCAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuXHQgICAgICAgIHJ1blRpbWVvdXQoZHJhaW5RdWV1ZSk7XG5cdCAgICB9XG5cdH07XG5cdFxuXHQvLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5cdGZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuXHQgICAgdGhpcy5mdW4gPSBmdW47XG5cdCAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG5cdH1cblx0SXRlbS5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKCkge1xuXHQgICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG5cdH07XG5cdHByb2Nlc3MudGl0bGUgPSAnYnJvd3Nlcic7XG5cdHByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5cdHByb2Nlc3MuZW52ID0ge307XG5cdHByb2Nlc3MuYXJndiA9IFtdO1xuXHRwcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcblx0cHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXHRcblx0ZnVuY3Rpb24gbm9vcCgpIHt9XG5cdFxuXHRwcm9jZXNzLm9uID0gbm9vcDtcblx0cHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5cdHByb2Nlc3Mub25jZSA9IG5vb3A7XG5cdHByb2Nlc3Mub2ZmID0gbm9vcDtcblx0cHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5cdHByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcblx0cHJvY2Vzcy5lbWl0ID0gbm9vcDtcblx0XG5cdHByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG5cdCAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkJyk7XG5cdH07XG5cdFxuXHRwcm9jZXNzLmN3ZCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuICcvJyB9O1xuXHRwcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuXHQgICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcblx0fTtcblx0cHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcblxuXG4vKioqLyB9KSxcbi8qIDIgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMl9fO1xuXG4vKioqLyB9KSxcbi8qIDMgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfM19fO1xuXG4vKioqLyB9KSxcbi8qIDQgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxuXHRtb2R1bGUuZXhwb3J0cz1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKGUpe2lmKHJbZV0pcmV0dXJuIHJbZV0uZXhwb3J0czt2YXIgbz1yW2VdPXtleHBvcnRzOnt9LGlkOmUsbG9hZGVkOiExfTtyZXR1cm4gdFtlXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyxuKSxvLmxvYWRlZD0hMCxvLmV4cG9ydHN9dmFyIHI9e307cmV0dXJuIG4ubT10LG4uYz1yLG4ucD1cIlwiLG4oMCl9KFtmdW5jdGlvbih0LG4scil7XCJ1c2Ugc3RyaWN0XCI7bi5fX2VzTW9kdWxlPSEwLHIoOCkscig5KSxuW1wiZGVmYXVsdFwiXT1mdW5jdGlvbih0LG4pe2lmKHQmJm4pe3ZhciByPWZ1bmN0aW9uKCl7dmFyIHI9QXJyYXkuaXNBcnJheShuKT9uOm4uc3BsaXQoXCIsXCIpLGU9dC5uYW1lfHxcIlwiLG89dC50eXBlfHxcIlwiLGk9by5yZXBsYWNlKC9cXC8uKiQvLFwiXCIpO3JldHVybnt2OnIuc29tZShmdW5jdGlvbih0KXt2YXIgbj10LnRyaW0oKTtyZXR1cm5cIi5cIj09PW4uY2hhckF0KDApP2UudG9Mb3dlckNhc2UoKS5lbmRzV2l0aChuLnRvTG93ZXJDYXNlKCkpOi9cXC9cXCokLy50ZXN0KG4pP2k9PT1uLnJlcGxhY2UoL1xcLy4qJC8sXCJcIik6bz09PW59KX19KCk7aWYoXCJvYmplY3RcIj09dHlwZW9mIHIpcmV0dXJuIHIudn1yZXR1cm4hMH0sdC5leHBvcnRzPW5bXCJkZWZhdWx0XCJdfSxmdW5jdGlvbih0LG4pe3ZhciByPXQuZXhwb3J0cz17dmVyc2lvbjpcIjEuMi4yXCJ9O1wibnVtYmVyXCI9PXR5cGVvZiBfX2UmJihfX2U9cil9LGZ1bmN0aW9uKHQsbil7dmFyIHI9dC5leHBvcnRzPVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5NYXRoPT1NYXRoP3dpbmRvdzpcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZiYmc2VsZi5NYXRoPT1NYXRoP3NlbGY6RnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1wibnVtYmVyXCI9PXR5cGVvZiBfX2cmJihfX2c9cil9LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDIpLG89cigxKSxpPXIoNCksdT1yKDE5KSxjPVwicHJvdG90eXBlXCIsZj1mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0LmFwcGx5KG4sYXJndW1lbnRzKX19LHM9ZnVuY3Rpb24odCxuLHIpe3ZhciBhLHAsbCx5LGQ9dCZzLkcsaD10JnMuUCx2PWQ/ZTp0JnMuUz9lW25dfHwoZVtuXT17fSk6KGVbbl18fHt9KVtjXSx4PWQ/bzpvW25dfHwob1tuXT17fSk7ZCYmKHI9bik7Zm9yKGEgaW4gcilwPSEodCZzLkYpJiZ2JiZhIGluIHYsbD0ocD92OnIpW2FdLHk9dCZzLkImJnA/ZihsLGUpOmgmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGw/ZihGdW5jdGlvbi5jYWxsLGwpOmwsdiYmIXAmJnUodixhLGwpLHhbYV0hPWwmJmkoeCxhLHkpLGgmJigoeFtjXXx8KHhbY109e30pKVthXT1sKX07ZS5jb3JlPW8scy5GPTEscy5HPTIscy5TPTQscy5QPTgscy5CPTE2LHMuVz0zMix0LmV4cG9ydHM9c30sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoNSksbz1yKDE4KTt0LmV4cG9ydHM9cigyMik/ZnVuY3Rpb24odCxuLHIpe3JldHVybiBlLnNldERlc2ModCxuLG8oMSxyKSl9OmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdFtuXT1yLHR9fSxmdW5jdGlvbih0LG4pe3ZhciByPU9iamVjdDt0LmV4cG9ydHM9e2NyZWF0ZTpyLmNyZWF0ZSxnZXRQcm90bzpyLmdldFByb3RvdHlwZU9mLGlzRW51bTp7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxnZXREZXNjOnIuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLHNldERlc2M6ci5kZWZpbmVQcm9wZXJ0eSxzZXREZXNjczpyLmRlZmluZVByb3BlcnRpZXMsZ2V0S2V5czpyLmtleXMsZ2V0TmFtZXM6ci5nZXRPd25Qcm9wZXJ0eU5hbWVzLGdldFN5bWJvbHM6ci5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsZWFjaDpbXS5mb3JFYWNofX0sZnVuY3Rpb24odCxuKXt2YXIgcj0wLGU9TWF0aC5yYW5kb20oKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuXCJTeW1ib2woXCIuY29uY2F0KHZvaWQgMD09PXQ/XCJcIjp0LFwiKV9cIiwoKytyK2UpLnRvU3RyaW5nKDM2KSl9fSxmdW5jdGlvbih0LG4scil7dmFyIGU9cigyMCkoXCJ3a3NcIiksbz1yKDIpLlN5bWJvbDt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGVbdF18fChlW3RdPW8mJm9bdF18fChvfHxyKDYpKShcIlN5bWJvbC5cIit0KSl9fSxmdW5jdGlvbih0LG4scil7cigyNiksdC5leHBvcnRzPXIoMSkuQXJyYXkuc29tZX0sZnVuY3Rpb24odCxuLHIpe3IoMjUpLHQuZXhwb3J0cz1yKDEpLlN0cmluZy5lbmRzV2l0aH0sZnVuY3Rpb24odCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgdCl0aHJvdyBUeXBlRXJyb3IodCtcIiBpcyBub3QgYSBmdW5jdGlvbiFcIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LG4pe3ZhciByPXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gci5jYWxsKHQpLnNsaWNlKDgsLTEpfX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMTApO3QuZXhwb3J0cz1mdW5jdGlvbih0LG4scil7aWYoZSh0KSx2b2lkIDA9PT1uKXJldHVybiB0O3N3aXRjaChyKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiB0LmNhbGwobixyKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihyLGUpe3JldHVybiB0LmNhbGwobixyLGUpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKHIsZSxvKXtyZXR1cm4gdC5jYWxsKG4scixlLG8pfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShuLGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24odCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT10KXRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIit0KTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsbixyKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIG49Ly4vO3RyeXtcIi8uL1wiW3RdKG4pfWNhdGNoKGUpe3RyeXtyZXR1cm4gbltyKDcpKFwibWF0Y2hcIildPSExLCFcIi8uL1wiW3RdKG4pfWNhdGNoKG8pe319cmV0dXJuITB9fSxmdW5jdGlvbih0LG4pe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt0cnl7cmV0dXJuISF0KCl9Y2F0Y2gobil7cmV0dXJuITB9fX0sZnVuY3Rpb24odCxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIHQ/bnVsbCE9PXQ6XCJmdW5jdGlvblwiPT10eXBlb2YgdH19LGZ1bmN0aW9uKHQsbixyKXt2YXIgZT1yKDE2KSxvPXIoMTEpLGk9cig3KShcIm1hdGNoXCIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgbjtyZXR1cm4gZSh0KSYmKHZvaWQgMCE9PShuPXRbaV0pPyEhbjpcIlJlZ0V4cFwiPT1vKHQpKX19LGZ1bmN0aW9uKHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKHQsbil7cmV0dXJue2VudW1lcmFibGU6ISgxJnQpLGNvbmZpZ3VyYWJsZTohKDImdCksd3JpdGFibGU6ISg0JnQpLHZhbHVlOm59fX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMiksbz1yKDQpLGk9cig2KShcInNyY1wiKSx1PVwidG9TdHJpbmdcIixjPUZ1bmN0aW9uW3VdLGY9KFwiXCIrYykuc3BsaXQodSk7cigxKS5pbnNwZWN0U291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBjLmNhbGwodCl9LCh0LmV4cG9ydHM9ZnVuY3Rpb24odCxuLHIsdSl7XCJmdW5jdGlvblwiPT10eXBlb2YgciYmKG8ocixpLHRbbl0/XCJcIit0W25dOmYuam9pbihTdHJpbmcobikpKSxcIm5hbWVcImluIHJ8fChyLm5hbWU9bikpLHQ9PT1lP3Rbbl09cjoodXx8ZGVsZXRlIHRbbl0sbyh0LG4scikpfSkoRnVuY3Rpb24ucHJvdG90eXBlLHUsZnVuY3Rpb24oKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzJiZ0aGlzW2ldfHxjLmNhbGwodGhpcyl9KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMiksbz1cIl9fY29yZS1qc19zaGFyZWRfX1wiLGk9ZVtvXXx8KGVbb109e30pO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaVt0XXx8KGlbdF09e30pfX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMTcpLG89cigxMyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsbixyKXtpZihlKG4pKXRocm93IFR5cGVFcnJvcihcIlN0cmluZyNcIityK1wiIGRvZXNuJ3QgYWNjZXB0IHJlZ2V4IVwiKTtyZXR1cm4gU3RyaW5nKG8odCkpfX0sZnVuY3Rpb24odCxuLHIpe3QuZXhwb3J0cz0hcigxNSkoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LFwiYVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsbil7dmFyIHI9TWF0aC5jZWlsLGU9TWF0aC5mbG9vcjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGlzTmFOKHQ9K3QpPzA6KHQ+MD9lOnIpKHQpfX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoMjMpLG89TWF0aC5taW47dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0PjA/byhlKHQpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9fSxmdW5jdGlvbih0LG4scil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGU9cigzKSxvPXIoMjQpLGk9cigyMSksdT1cImVuZHNXaXRoXCIsYz1cIlwiW3VdO2UoZS5QK2UuRipyKDE0KSh1KSxcIlN0cmluZ1wiLHtlbmRzV2l0aDpmdW5jdGlvbih0KXt2YXIgbj1pKHRoaXMsdCx1KSxyPWFyZ3VtZW50cyxlPXIubGVuZ3RoPjE/clsxXTp2b2lkIDAsZj1vKG4ubGVuZ3RoKSxzPXZvaWQgMD09PWU/ZjpNYXRoLm1pbihvKGUpLGYpLGE9U3RyaW5nKHQpO3JldHVybiBjP2MuY2FsbChuLGEscyk6bi5zbGljZShzLWEubGVuZ3RoLHMpPT09YX19KX0sZnVuY3Rpb24odCxuLHIpe3ZhciBlPXIoNSksbz1yKDMpLGk9cigxKS5BcnJheXx8QXJyYXksdT17fSxjPWZ1bmN0aW9uKHQsbil7ZS5lYWNoLmNhbGwodC5zcGxpdChcIixcIiksZnVuY3Rpb24odCl7dm9pZCAwPT1uJiZ0IGluIGk/dVt0XT1pW3RdOnQgaW5bXSYmKHVbdF09cigxMikoRnVuY3Rpb24uY2FsbCxbXVt0XSxuKSl9KX07YyhcInBvcCxyZXZlcnNlLHNoaWZ0LGtleXMsdmFsdWVzLGVudHJpZXNcIiwxKSxjKFwiaW5kZXhPZixldmVyeSxzb21lLGZvckVhY2gsbWFwLGZpbHRlcixmaW5kLGZpbmRJbmRleCxpbmNsdWRlc1wiLDMpLGMoXCJqb2luLHNsaWNlLGNvbmNhdCxwdXNoLHNwbGljZSx1bnNoaWZ0LHNvcnQsbGFzdEluZGV4T2YscmVkdWNlLHJlZHVjZVJpZ2h0LGNvcHlXaXRoaW4sZmlsbFwiKSxvKG8uUyxcIkFycmF5XCIsdSl9XSk7XG5cbi8qKiovIH0pLFxuLyogNSAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cykge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXHRcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG5cdCAgdmFsdWU6IHRydWVcblx0fSk7XG5cdGV4cG9ydHMuZGVmYXVsdCA9IGdldERhdGFUcmFuc2ZlckZpbGVzO1xuXHRmdW5jdGlvbiBnZXREYXRhVHJhbnNmZXJGaWxlcyhldmVudCkge1xuXHQgIHZhciBkYXRhVHJhbnNmZXJJdGVtc0xpc3QgPSBbXTtcblx0ICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG5cdCAgICB2YXIgZHQgPSBldmVudC5kYXRhVHJhbnNmZXI7XG5cdCAgICBpZiAoZHQuZmlsZXMgJiYgZHQuZmlsZXMubGVuZ3RoKSB7XG5cdCAgICAgIGRhdGFUcmFuc2Zlckl0ZW1zTGlzdCA9IGR0LmZpbGVzO1xuXHQgICAgfSBlbHNlIGlmIChkdC5pdGVtcyAmJiBkdC5pdGVtcy5sZW5ndGgpIHtcblx0ICAgICAgLy8gRHVyaW5nIHRoZSBkcmFnIGV2ZW4gdGhlIGRhdGFUcmFuc2Zlci5maWxlcyBpcyBudWxsXG5cdCAgICAgIC8vIGJ1dCBDaHJvbWUgaW1wbGVtZW50cyBzb21lIGRyYWcgc3RvcmUsIHdoaWNoIGlzIGFjY2VzaWJsZSB2aWEgZGF0YVRyYW5zZmVyLml0ZW1zXG5cdCAgICAgIGRhdGFUcmFuc2Zlckl0ZW1zTGlzdCA9IGR0Lml0ZW1zO1xuXHQgICAgfVxuXHQgIH0gZWxzZSBpZiAoZXZlbnQudGFyZ2V0ICYmIGV2ZW50LnRhcmdldC5maWxlcykge1xuXHQgICAgZGF0YVRyYW5zZmVySXRlbXNMaXN0ID0gZXZlbnQudGFyZ2V0LmZpbGVzO1xuXHQgIH1cblx0ICAvLyBDb252ZXJ0IGZyb20gRGF0YVRyYW5zZmVySXRlbXNMaXN0IHRvIHRoZSBuYXRpdmUgQXJyYXlcblx0ICByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZGF0YVRyYW5zZmVySXRlbXNMaXN0KTtcblx0fVxuXHRtb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbXCJkZWZhdWx0XCJdO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSlcbn0pO1xuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiLypcbiAqIENvcHlyaWdodCAyMDE3LCBZYWhvbyBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG4gKiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcblxuZnVuY3Rpb24gX2ludGVyb3BEZWZhdWx0IChleCkgeyByZXR1cm4gKGV4ICYmICh0eXBlb2YgZXggPT09ICdvYmplY3QnKSAmJiAnZGVmYXVsdCcgaW4gZXgpID8gZXhbJ2RlZmF1bHQnXSA6IGV4OyB9XG5cbnZhciBhbGxMb2NhbGVEYXRhID0gX2ludGVyb3BEZWZhdWx0KHJlcXVpcmUoJy4uL2xvY2FsZS1kYXRhL2luZGV4LmpzJykpO1xudmFyIEludGxNZXNzYWdlRm9ybWF0ID0gX2ludGVyb3BEZWZhdWx0KHJlcXVpcmUoJ2ludGwtbWVzc2FnZWZvcm1hdCcpKTtcbnZhciBJbnRsUmVsYXRpdmVGb3JtYXQgPSBfaW50ZXJvcERlZmF1bHQocmVxdWlyZSgnaW50bC1yZWxhdGl2ZWZvcm1hdCcpKTtcbnZhciBQcm9wVHlwZXMgPSBfaW50ZXJvcERlZmF1bHQocmVxdWlyZSgncHJvcC10eXBlcycpKTtcbnZhciBSZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG52YXIgUmVhY3RfX2RlZmF1bHQgPSBfaW50ZXJvcERlZmF1bHQoUmVhY3QpO1xudmFyIGludmFyaWFudCA9IF9pbnRlcm9wRGVmYXVsdChyZXF1aXJlKCdpbnZhcmlhbnQnKSk7XG52YXIgbWVtb2l6ZUludGxDb25zdHJ1Y3RvciA9IF9pbnRlcm9wRGVmYXVsdChyZXF1aXJlKCdpbnRsLWZvcm1hdC1jYWNoZScpKTtcblxuLy8gR0VORVJBVEVEIEZJTEVcbnZhciBkZWZhdWx0TG9jYWxlRGF0YSA9IHsgXCJsb2NhbGVcIjogXCJlblwiLCBcInBsdXJhbFJ1bGVGdW5jdGlvblwiOiBmdW5jdGlvbiBwbHVyYWxSdWxlRnVuY3Rpb24obiwgb3JkKSB7XG4gICAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoXCIuXCIpLFxuICAgICAgICB2MCA9ICFzWzFdLFxuICAgICAgICB0MCA9IE51bWJlcihzWzBdKSA9PSBuLFxuICAgICAgICBuMTAgPSB0MCAmJiBzWzBdLnNsaWNlKC0xKSxcbiAgICAgICAgbjEwMCA9IHQwICYmIHNbMF0uc2xpY2UoLTIpO2lmIChvcmQpIHJldHVybiBuMTAgPT0gMSAmJiBuMTAwICE9IDExID8gXCJvbmVcIiA6IG4xMCA9PSAyICYmIG4xMDAgIT0gMTIgPyBcInR3b1wiIDogbjEwID09IDMgJiYgbjEwMCAhPSAxMyA/IFwiZmV3XCIgOiBcIm90aGVyXCI7cmV0dXJuIG4gPT0gMSAmJiB2MCA/IFwib25lXCIgOiBcIm90aGVyXCI7XG4gIH0sIFwiZmllbGRzXCI6IHsgXCJ5ZWFyXCI6IHsgXCJkaXNwbGF5TmFtZVwiOiBcInllYXJcIiwgXCJyZWxhdGl2ZVwiOiB7IFwiMFwiOiBcInRoaXMgeWVhclwiLCBcIjFcIjogXCJuZXh0IHllYXJcIiwgXCItMVwiOiBcImxhc3QgeWVhclwiIH0sIFwicmVsYXRpdmVUaW1lXCI6IHsgXCJmdXR1cmVcIjogeyBcIm9uZVwiOiBcImluIHswfSB5ZWFyXCIsIFwib3RoZXJcIjogXCJpbiB7MH0geWVhcnNcIiB9LCBcInBhc3RcIjogeyBcIm9uZVwiOiBcInswfSB5ZWFyIGFnb1wiLCBcIm90aGVyXCI6IFwiezB9IHllYXJzIGFnb1wiIH0gfSB9LCBcIm1vbnRoXCI6IHsgXCJkaXNwbGF5TmFtZVwiOiBcIm1vbnRoXCIsIFwicmVsYXRpdmVcIjogeyBcIjBcIjogXCJ0aGlzIG1vbnRoXCIsIFwiMVwiOiBcIm5leHQgbW9udGhcIiwgXCItMVwiOiBcImxhc3QgbW9udGhcIiB9LCBcInJlbGF0aXZlVGltZVwiOiB7IFwiZnV0dXJlXCI6IHsgXCJvbmVcIjogXCJpbiB7MH0gbW9udGhcIiwgXCJvdGhlclwiOiBcImluIHswfSBtb250aHNcIiB9LCBcInBhc3RcIjogeyBcIm9uZVwiOiBcInswfSBtb250aCBhZ29cIiwgXCJvdGhlclwiOiBcInswfSBtb250aHMgYWdvXCIgfSB9IH0sIFwiZGF5XCI6IHsgXCJkaXNwbGF5TmFtZVwiOiBcImRheVwiLCBcInJlbGF0aXZlXCI6IHsgXCIwXCI6IFwidG9kYXlcIiwgXCIxXCI6IFwidG9tb3Jyb3dcIiwgXCItMVwiOiBcInllc3RlcmRheVwiIH0sIFwicmVsYXRpdmVUaW1lXCI6IHsgXCJmdXR1cmVcIjogeyBcIm9uZVwiOiBcImluIHswfSBkYXlcIiwgXCJvdGhlclwiOiBcImluIHswfSBkYXlzXCIgfSwgXCJwYXN0XCI6IHsgXCJvbmVcIjogXCJ7MH0gZGF5IGFnb1wiLCBcIm90aGVyXCI6IFwiezB9IGRheXMgYWdvXCIgfSB9IH0sIFwiaG91clwiOiB7IFwiZGlzcGxheU5hbWVcIjogXCJob3VyXCIsIFwicmVsYXRpdmVUaW1lXCI6IHsgXCJmdXR1cmVcIjogeyBcIm9uZVwiOiBcImluIHswfSBob3VyXCIsIFwib3RoZXJcIjogXCJpbiB7MH0gaG91cnNcIiB9LCBcInBhc3RcIjogeyBcIm9uZVwiOiBcInswfSBob3VyIGFnb1wiLCBcIm90aGVyXCI6IFwiezB9IGhvdXJzIGFnb1wiIH0gfSB9LCBcIm1pbnV0ZVwiOiB7IFwiZGlzcGxheU5hbWVcIjogXCJtaW51dGVcIiwgXCJyZWxhdGl2ZVRpbWVcIjogeyBcImZ1dHVyZVwiOiB7IFwib25lXCI6IFwiaW4gezB9IG1pbnV0ZVwiLCBcIm90aGVyXCI6IFwiaW4gezB9IG1pbnV0ZXNcIiB9LCBcInBhc3RcIjogeyBcIm9uZVwiOiBcInswfSBtaW51dGUgYWdvXCIsIFwib3RoZXJcIjogXCJ7MH0gbWludXRlcyBhZ29cIiB9IH0gfSwgXCJzZWNvbmRcIjogeyBcImRpc3BsYXlOYW1lXCI6IFwic2Vjb25kXCIsIFwicmVsYXRpdmVcIjogeyBcIjBcIjogXCJub3dcIiB9LCBcInJlbGF0aXZlVGltZVwiOiB7IFwiZnV0dXJlXCI6IHsgXCJvbmVcIjogXCJpbiB7MH0gc2Vjb25kXCIsIFwib3RoZXJcIjogXCJpbiB7MH0gc2Vjb25kc1wiIH0sIFwicGFzdFwiOiB7IFwib25lXCI6IFwiezB9IHNlY29uZCBhZ29cIiwgXCJvdGhlclwiOiBcInswfSBzZWNvbmRzIGFnb1wiIH0gfSB9IH0gfTtcblxuLypcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG4gKiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbmZ1bmN0aW9uIGFkZExvY2FsZURhdGEoKSB7XG4gICAgdmFyIGRhdGEgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFtdO1xuXG4gICAgdmFyIGxvY2FsZXMgPSBBcnJheS5pc0FycmF5KGRhdGEpID8gZGF0YSA6IFtkYXRhXTtcblxuICAgIGxvY2FsZXMuZm9yRWFjaChmdW5jdGlvbiAobG9jYWxlRGF0YSkge1xuICAgICAgICBpZiAobG9jYWxlRGF0YSAmJiBsb2NhbGVEYXRhLmxvY2FsZSkge1xuICAgICAgICAgICAgSW50bE1lc3NhZ2VGb3JtYXQuX19hZGRMb2NhbGVEYXRhKGxvY2FsZURhdGEpO1xuICAgICAgICAgICAgSW50bFJlbGF0aXZlRm9ybWF0Ll9fYWRkTG9jYWxlRGF0YShsb2NhbGVEYXRhKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBoYXNMb2NhbGVEYXRhKGxvY2FsZSkge1xuICAgIHZhciBsb2NhbGVQYXJ0cyA9IChsb2NhbGUgfHwgJycpLnNwbGl0KCctJyk7XG5cbiAgICB3aGlsZSAobG9jYWxlUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoaGFzSU1GQW5kSVJGTG9jYWxlRGF0YShsb2NhbGVQYXJ0cy5qb2luKCctJykpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvY2FsZVBhcnRzLnBvcCgpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaGFzSU1GQW5kSVJGTG9jYWxlRGF0YShsb2NhbGUpIHtcbiAgICB2YXIgbm9ybWFsaXplZExvY2FsZSA9IGxvY2FsZSAmJiBsb2NhbGUudG9Mb3dlckNhc2UoKTtcblxuICAgIHJldHVybiAhIShJbnRsTWVzc2FnZUZvcm1hdC5fX2xvY2FsZURhdGFfX1tub3JtYWxpemVkTG9jYWxlXSAmJiBJbnRsUmVsYXRpdmVGb3JtYXQuX19sb2NhbGVEYXRhX19bbm9ybWFsaXplZExvY2FsZV0pO1xufVxuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gdHlwZW9mIG9iajtcbn0gOiBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqO1xufTtcblxuXG5cblxuXG5cblxuXG5cblxuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG5cblxuXG5cbnZhciBkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmosIGtleSwgdmFsdWUpIHtcbiAgaWYgKGtleSBpbiBvYmopIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcblxuICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cblxuXG52YXIgaW5oZXJpdHMgPSBmdW5jdGlvbiAoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpO1xuICB9XG5cbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgY29uc3RydWN0b3I6IHtcbiAgICAgIHZhbHVlOiBzdWJDbGFzcyxcbiAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XG59O1xuXG5cblxuXG5cblxuXG5cblxudmFyIG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKG9iaiwga2V5cykge1xuICB2YXIgdGFyZ2V0ID0ge307XG5cbiAgZm9yICh2YXIgaSBpbiBvYmopIHtcbiAgICBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlO1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlO1xuICAgIHRhcmdldFtpXSA9IG9ialtpXTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59O1xuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IGZ1bmN0aW9uIChzZWxmLCBjYWxsKSB7XG4gIGlmICghc2VsZikge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmO1xufTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxudmFyIHRvQ29uc3VtYWJsZUFycmF5ID0gZnVuY3Rpb24gKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgYXJyMltpXSA9IGFycltpXTtcblxuICAgIHJldHVybiBhcnIyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBBcnJheS5mcm9tKGFycik7XG4gIH1cbn07XG5cbi8qXG4gKiBDb3B5cmlnaHQgMjAxNSwgWWFob28gSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLlxuICogU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuXG52YXIgYm9vbCA9IFByb3BUeXBlcy5ib29sO1xudmFyIG51bWJlciA9IFByb3BUeXBlcy5udW1iZXI7XG52YXIgc3RyaW5nID0gUHJvcFR5cGVzLnN0cmluZztcbnZhciBmdW5jID0gUHJvcFR5cGVzLmZ1bmM7XG52YXIgb2JqZWN0ID0gUHJvcFR5cGVzLm9iamVjdDtcbnZhciBvbmVPZiA9IFByb3BUeXBlcy5vbmVPZjtcbnZhciBzaGFwZSA9IFByb3BUeXBlcy5zaGFwZTtcbnZhciBhbnkgPSBQcm9wVHlwZXMuYW55O1xuXG52YXIgbG9jYWxlTWF0Y2hlciA9IG9uZU9mKFsnYmVzdCBmaXQnLCAnbG9va3VwJ10pO1xudmFyIG5hcnJvd1Nob3J0TG9uZyA9IG9uZU9mKFsnbmFycm93JywgJ3Nob3J0JywgJ2xvbmcnXSk7XG52YXIgbnVtZXJpYzJkaWdpdCA9IG9uZU9mKFsnbnVtZXJpYycsICcyLWRpZ2l0J10pO1xudmFyIGZ1bmNSZXEgPSBmdW5jLmlzUmVxdWlyZWQ7XG5cbnZhciBpbnRsQ29uZmlnUHJvcFR5cGVzID0ge1xuICAgIGxvY2FsZTogc3RyaW5nLFxuICAgIGZvcm1hdHM6IG9iamVjdCxcbiAgICBtZXNzYWdlczogb2JqZWN0LFxuICAgIHRleHRDb21wb25lbnQ6IGFueSxcblxuICAgIGRlZmF1bHRMb2NhbGU6IHN0cmluZyxcbiAgICBkZWZhdWx0Rm9ybWF0czogb2JqZWN0XG59O1xuXG52YXIgaW50bEZvcm1hdFByb3BUeXBlcyA9IHtcbiAgICBmb3JtYXREYXRlOiBmdW5jUmVxLFxuICAgIGZvcm1hdFRpbWU6IGZ1bmNSZXEsXG4gICAgZm9ybWF0UmVsYXRpdmU6IGZ1bmNSZXEsXG4gICAgZm9ybWF0TnVtYmVyOiBmdW5jUmVxLFxuICAgIGZvcm1hdFBsdXJhbDogZnVuY1JlcSxcbiAgICBmb3JtYXRNZXNzYWdlOiBmdW5jUmVxLFxuICAgIGZvcm1hdEhUTUxNZXNzYWdlOiBmdW5jUmVxXG59O1xuXG52YXIgaW50bFNoYXBlID0gc2hhcGUoX2V4dGVuZHMoe30sIGludGxDb25maWdQcm9wVHlwZXMsIGludGxGb3JtYXRQcm9wVHlwZXMsIHtcbiAgICBmb3JtYXR0ZXJzOiBvYmplY3QsXG4gICAgbm93OiBmdW5jUmVxXG59KSk7XG5cbnZhciBtZXNzYWdlRGVzY3JpcHRvclByb3BUeXBlcyA9IHtcbiAgICBpZDogc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICBkZWZhdWx0TWVzc2FnZTogc3RyaW5nXG59O1xuXG52YXIgZGF0ZVRpbWVGb3JtYXRQcm9wVHlwZXMgPSB7XG4gICAgbG9jYWxlTWF0Y2hlcjogbG9jYWxlTWF0Y2hlcixcbiAgICBmb3JtYXRNYXRjaGVyOiBvbmVPZihbJ2Jhc2ljJywgJ2Jlc3QgZml0J10pLFxuXG4gICAgdGltZVpvbmU6IHN0cmluZyxcbiAgICBob3VyMTI6IGJvb2wsXG5cbiAgICB3ZWVrZGF5OiBuYXJyb3dTaG9ydExvbmcsXG4gICAgZXJhOiBuYXJyb3dTaG9ydExvbmcsXG4gICAgeWVhcjogbnVtZXJpYzJkaWdpdCxcbiAgICBtb250aDogb25lT2YoWydudW1lcmljJywgJzItZGlnaXQnLCAnbmFycm93JywgJ3Nob3J0JywgJ2xvbmcnXSksXG4gICAgZGF5OiBudW1lcmljMmRpZ2l0LFxuICAgIGhvdXI6IG51bWVyaWMyZGlnaXQsXG4gICAgbWludXRlOiBudW1lcmljMmRpZ2l0LFxuICAgIHNlY29uZDogbnVtZXJpYzJkaWdpdCxcbiAgICB0aW1lWm9uZU5hbWU6IG9uZU9mKFsnc2hvcnQnLCAnbG9uZyddKVxufTtcblxudmFyIG51bWJlckZvcm1hdFByb3BUeXBlcyA9IHtcbiAgICBsb2NhbGVNYXRjaGVyOiBsb2NhbGVNYXRjaGVyLFxuXG4gICAgc3R5bGU6IG9uZU9mKFsnZGVjaW1hbCcsICdjdXJyZW5jeScsICdwZXJjZW50J10pLFxuICAgIGN1cnJlbmN5OiBzdHJpbmcsXG4gICAgY3VycmVuY3lEaXNwbGF5OiBvbmVPZihbJ3N5bWJvbCcsICdjb2RlJywgJ25hbWUnXSksXG4gICAgdXNlR3JvdXBpbmc6IGJvb2wsXG5cbiAgICBtaW5pbXVtSW50ZWdlckRpZ2l0czogbnVtYmVyLFxuICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogbnVtYmVyLFxuICAgIG1heGltdW1GcmFjdGlvbkRpZ2l0czogbnVtYmVyLFxuICAgIG1pbmltdW1TaWduaWZpY2FudERpZ2l0czogbnVtYmVyLFxuICAgIG1heGltdW1TaWduaWZpY2FudERpZ2l0czogbnVtYmVyXG59O1xuXG52YXIgcmVsYXRpdmVGb3JtYXRQcm9wVHlwZXMgPSB7XG4gICAgc3R5bGU6IG9uZU9mKFsnYmVzdCBmaXQnLCAnbnVtZXJpYyddKSxcbiAgICB1bml0czogb25lT2YoWydzZWNvbmQnLCAnbWludXRlJywgJ2hvdXInLCAnZGF5JywgJ21vbnRoJywgJ3llYXInXSlcbn07XG5cbnZhciBwbHVyYWxGb3JtYXRQcm9wVHlwZXMgPSB7XG4gICAgc3R5bGU6IG9uZU9mKFsnY2FyZGluYWwnLCAnb3JkaW5hbCddKVxufTtcblxuLypcbkhUTUwgZXNjYXBpbmcgYW5kIHNoYWxsb3ctZXF1YWxzIGltcGxlbWVudGF0aW9ucyBhcmUgdGhlIHNhbWUgYXMgUmVhY3Qnc1xuKG9uIHB1cnBvc2UuKSBUaGVyZWZvcmUsIGl0IGhhcyB0aGUgZm9sbG93aW5nIENvcHlyaWdodCBhbmQgTGljZW5zaW5nOlxuXG5Db3B5cmlnaHQgMjAxMy0yMDE0LCBGYWNlYm9vaywgSW5jLlxuQWxsIHJpZ2h0cyByZXNlcnZlZC5cblxuVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlIExJQ0VOU0VcbmZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIFJlYWN0J3Mgc291cmNlIHRyZWUuXG4qL1xuXG52YXIgaW50bENvbmZpZ1Byb3BOYW1lcyA9IE9iamVjdC5rZXlzKGludGxDb25maWdQcm9wVHlwZXMpO1xuXG52YXIgRVNDQVBFRF9DSEFSUyA9IHtcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJz4nOiAnJmd0OycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgJ1xcJyc6ICcmI3gyNzsnXG59O1xuXG52YXIgVU5TQUZFX0NIQVJTX1JFR0VYID0gL1smPjxcIiddL2c7XG5cbmZ1bmN0aW9uIGVzY2FwZShzdHIpIHtcbiAgICByZXR1cm4gKCcnICsgc3RyKS5yZXBsYWNlKFVOU0FGRV9DSEFSU19SRUdFWCwgZnVuY3Rpb24gKG1hdGNoKSB7XG4gICAgICAgIHJldHVybiBFU0NBUEVEX0NIQVJTW21hdGNoXTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZmlsdGVyUHJvcHMocHJvcHMsIHdoaXRlbGlzdCkge1xuICAgIHZhciBkZWZhdWx0cyQkMSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICByZXR1cm4gd2hpdGVsaXN0LnJlZHVjZShmdW5jdGlvbiAoZmlsdGVyZWQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHByb3BzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZFtuYW1lXSA9IHByb3BzW25hbWVdO1xuICAgICAgICB9IGVsc2UgaWYgKGRlZmF1bHRzJCQxLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZFtuYW1lXSA9IGRlZmF1bHRzJCQxW25hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkO1xuICAgIH0sIHt9KTtcbn1cblxuZnVuY3Rpb24gaW52YXJpYW50SW50bENvbnRleHQoKSB7XG4gICAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LFxuICAgICAgICBpbnRsID0gX3JlZi5pbnRsO1xuXG4gICAgaW52YXJpYW50KGludGwsICdbUmVhY3QgSW50bF0gQ291bGQgbm90IGZpbmQgcmVxdWlyZWQgYGludGxgIG9iamVjdC4gJyArICc8SW50bFByb3ZpZGVyPiBuZWVkcyB0byBleGlzdCBpbiB0aGUgY29tcG9uZW50IGFuY2VzdHJ5LicpO1xufVxuXG5mdW5jdGlvbiBzaGFsbG93RXF1YWxzKG9iakEsIG9iakIpIHtcbiAgICBpZiAob2JqQSA9PT0gb2JqQikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoKHR5cGVvZiBvYmpBID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihvYmpBKSkgIT09ICdvYmplY3QnIHx8IG9iakEgPT09IG51bGwgfHwgKHR5cGVvZiBvYmpCID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihvYmpCKSkgIT09ICdvYmplY3QnIHx8IG9iakIgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBrZXlzQSA9IE9iamVjdC5rZXlzKG9iakEpO1xuICAgIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gICAgaWYgKGtleXNBLmxlbmd0aCAhPT0ga2V5c0IubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUZXN0IGZvciBBJ3Mga2V5cyBkaWZmZXJlbnQgZnJvbSBCLlxuICAgIHZhciBiSGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmJpbmQob2JqQik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzQS5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAoIWJIYXNPd25Qcm9wZXJ0eShrZXlzQVtpXSkgfHwgb2JqQVtrZXlzQVtpXV0gIT09IG9iakJba2V5c0FbaV1dKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkSW50bENvbXBvbmVudFVwZGF0ZShfcmVmMiwgbmV4dFByb3BzLCBuZXh0U3RhdGUpIHtcbiAgICB2YXIgcHJvcHMgPSBfcmVmMi5wcm9wcyxcbiAgICAgICAgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgICAgX3JlZjIkY29udGV4dCA9IF9yZWYyLmNvbnRleHQsXG4gICAgICAgIGNvbnRleHQgPSBfcmVmMiRjb250ZXh0ID09PSB1bmRlZmluZWQgPyB7fSA6IF9yZWYyJGNvbnRleHQ7XG4gICAgdmFyIG5leHRDb250ZXh0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcbiAgICB2YXIgX2NvbnRleHQkaW50bCA9IGNvbnRleHQuaW50bCxcbiAgICAgICAgaW50bCA9IF9jb250ZXh0JGludGwgPT09IHVuZGVmaW5lZCA/IHt9IDogX2NvbnRleHQkaW50bDtcbiAgICB2YXIgX25leHRDb250ZXh0JGludGwgPSBuZXh0Q29udGV4dC5pbnRsLFxuICAgICAgICBuZXh0SW50bCA9IF9uZXh0Q29udGV4dCRpbnRsID09PSB1bmRlZmluZWQgPyB7fSA6IF9uZXh0Q29udGV4dCRpbnRsO1xuXG5cbiAgICByZXR1cm4gIXNoYWxsb3dFcXVhbHMobmV4dFByb3BzLCBwcm9wcykgfHwgIXNoYWxsb3dFcXVhbHMobmV4dFN0YXRlLCBzdGF0ZSkgfHwgIShuZXh0SW50bCA9PT0gaW50bCB8fCBzaGFsbG93RXF1YWxzKGZpbHRlclByb3BzKG5leHRJbnRsLCBpbnRsQ29uZmlnUHJvcE5hbWVzKSwgZmlsdGVyUHJvcHMoaW50bCwgaW50bENvbmZpZ1Byb3BOYW1lcykpKTtcbn1cblxuLypcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG4gKiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbi8vIEluc3BpcmVkIGJ5IHJlYWN0LXJlZHV4J3MgYGNvbm5lY3QoKWAgSE9DIGZhY3RvcnkgZnVuY3Rpb24gaW1wbGVtZW50YXRpb246XG4vLyBodHRwczovL2dpdGh1Yi5jb20vcmFja3QvcmVhY3QtcmVkdXhcblxuZnVuY3Rpb24gZ2V0RGlzcGxheU5hbWUoQ29tcG9uZW50JCQxKSB7XG4gICAgcmV0dXJuIENvbXBvbmVudCQkMS5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQkJDEubmFtZSB8fCAnQ29tcG9uZW50Jztcbn1cblxuZnVuY3Rpb24gaW5qZWN0SW50bChXcmFwcGVkQ29tcG9uZW50KSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgIHZhciBfb3B0aW9ucyRpbnRsUHJvcE5hbWUgPSBvcHRpb25zLmludGxQcm9wTmFtZSxcbiAgICAgICAgaW50bFByb3BOYW1lID0gX29wdGlvbnMkaW50bFByb3BOYW1lID09PSB1bmRlZmluZWQgPyAnaW50bCcgOiBfb3B0aW9ucyRpbnRsUHJvcE5hbWUsXG4gICAgICAgIF9vcHRpb25zJHdpdGhSZWYgPSBvcHRpb25zLndpdGhSZWYsXG4gICAgICAgIHdpdGhSZWYgPSBfb3B0aW9ucyR3aXRoUmVmID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IF9vcHRpb25zJHdpdGhSZWY7XG5cbiAgICB2YXIgSW5qZWN0SW50bCA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gICAgICAgIGluaGVyaXRzKEluamVjdEludGwsIF9Db21wb25lbnQpO1xuXG4gICAgICAgIGZ1bmN0aW9uIEluamVjdEludGwocHJvcHMsIGNvbnRleHQpIHtcbiAgICAgICAgICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEluamVjdEludGwpO1xuXG4gICAgICAgICAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChJbmplY3RJbnRsLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoSW5qZWN0SW50bCkpLmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgICAgICAgICAgaW52YXJpYW50SW50bENvbnRleHQoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgICAgIH1cblxuICAgICAgICBjcmVhdGVDbGFzcyhJbmplY3RJbnRsLCBbe1xuICAgICAgICAgICAga2V5OiAnZ2V0V3JhcHBlZEluc3RhbmNlJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRXcmFwcGVkSW5zdGFuY2UoKSB7XG4gICAgICAgICAgICAgICAgaW52YXJpYW50KHdpdGhSZWYsICdbUmVhY3QgSW50bF0gVG8gYWNjZXNzIHRoZSB3cmFwcGVkIGluc3RhbmNlLCAnICsgJ3RoZSBge3dpdGhSZWY6IHRydWV9YCBvcHRpb24gbXVzdCBiZSBzZXQgd2hlbiBjYWxsaW5nOiAnICsgJ2BpbmplY3RJbnRsKClgJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZzLndyYXBwZWRJbnN0YW5jZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwge1xuICAgICAgICAgICAga2V5OiAncmVuZGVyJyxcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoV3JhcHBlZENvbXBvbmVudCwgX2V4dGVuZHMoe30sIHRoaXMucHJvcHMsIGRlZmluZVByb3BlcnR5KHt9LCBpbnRsUHJvcE5hbWUsIHRoaXMuY29udGV4dC5pbnRsKSwge1xuICAgICAgICAgICAgICAgICAgICByZWY6IHdpdGhSZWYgPyAnd3JhcHBlZEluc3RhbmNlJyA6IG51bGxcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1dKTtcbiAgICAgICAgcmV0dXJuIEluamVjdEludGw7XG4gICAgfShSZWFjdC5Db21wb25lbnQpO1xuXG4gICAgSW5qZWN0SW50bC5kaXNwbGF5TmFtZSA9ICdJbmplY3RJbnRsKCcgKyBnZXREaXNwbGF5TmFtZShXcmFwcGVkQ29tcG9uZW50KSArICcpJztcbiAgICBJbmplY3RJbnRsLmNvbnRleHRUeXBlcyA9IHtcbiAgICAgICAgaW50bDogaW50bFNoYXBlXG4gICAgfTtcbiAgICBJbmplY3RJbnRsLldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuXG5cbiAgICByZXR1cm4gSW5qZWN0SW50bDtcbn1cblxuLypcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG4gKiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbmZ1bmN0aW9uIGRlZmluZU1lc3NhZ2VzKG1lc3NhZ2VEZXNjcmlwdG9ycykge1xuICAvLyBUaGlzIHNpbXBseSByZXR1cm5zIHdoYXQncyBwYXNzZWQtaW4gYmVjYXVzZSBpdCdzIG1lYW50IHRvIGJlIGEgaG9vayBmb3JcbiAgLy8gYmFiZWwtcGx1Z2luLXJlYWN0LWludGwuXG4gIHJldHVybiBtZXNzYWdlRGVzY3JpcHRvcnM7XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgMjAxNSwgWWFob28gSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLlxuICogU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuXG4vLyBUaGlzIGlzIGEgXCJoYWNrXCIgdW50aWwgYSBwcm9wZXIgYGludGwtcGx1cmFsZm9ybWF0YCBwYWNrYWdlIGlzIGNyZWF0ZWQuXG5cbmZ1bmN0aW9uIHJlc29sdmVMb2NhbGUobG9jYWxlcykge1xuICAgIC8vIEludGxNZXNzYWdlRm9ybWF0I19yZXNvbHZlTG9jYWxlKCkgZG9lcyBub3QgZGVwZW5kIG9uIGB0aGlzYC5cbiAgICByZXR1cm4gSW50bE1lc3NhZ2VGb3JtYXQucHJvdG90eXBlLl9yZXNvbHZlTG9jYWxlKGxvY2FsZXMpO1xufVxuXG5mdW5jdGlvbiBmaW5kUGx1cmFsRnVuY3Rpb24obG9jYWxlKSB7XG4gICAgLy8gSW50bE1lc3NhZ2VGb3JtYXQjX2ZpbmRQbHVyYWxGdW5jdGlvbigpIGRvZXMgbm90IGRlcGVuZCBvbiBgdGhpc2AuXG4gICAgcmV0dXJuIEludGxNZXNzYWdlRm9ybWF0LnByb3RvdHlwZS5fZmluZFBsdXJhbFJ1bGVGdW5jdGlvbihsb2NhbGUpO1xufVxuXG52YXIgSW50bFBsdXJhbEZvcm1hdCA9IGZ1bmN0aW9uIEludGxQbHVyYWxGb3JtYXQobG9jYWxlcykge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBJbnRsUGx1cmFsRm9ybWF0KTtcblxuICAgIHZhciB1c2VPcmRpbmFsID0gb3B0aW9ucy5zdHlsZSA9PT0gJ29yZGluYWwnO1xuICAgIHZhciBwbHVyYWxGbiA9IGZpbmRQbHVyYWxGdW5jdGlvbihyZXNvbHZlTG9jYWxlKGxvY2FsZXMpKTtcblxuICAgIHRoaXMuZm9ybWF0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBwbHVyYWxGbih2YWx1ZSwgdXNlT3JkaW5hbCk7XG4gICAgfTtcbn07XG5cbi8qXG4gKiBDb3B5cmlnaHQgMjAxNSwgWWFob28gSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLlxuICogU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuXG52YXIgREFURV9USU1FX0ZPUk1BVF9PUFRJT05TID0gT2JqZWN0LmtleXMoZGF0ZVRpbWVGb3JtYXRQcm9wVHlwZXMpO1xudmFyIE5VTUJFUl9GT1JNQVRfT1BUSU9OUyA9IE9iamVjdC5rZXlzKG51bWJlckZvcm1hdFByb3BUeXBlcyk7XG52YXIgUkVMQVRJVkVfRk9STUFUX09QVElPTlMgPSBPYmplY3Qua2V5cyhyZWxhdGl2ZUZvcm1hdFByb3BUeXBlcyk7XG52YXIgUExVUkFMX0ZPUk1BVF9PUFRJT05TID0gT2JqZWN0LmtleXMocGx1cmFsRm9ybWF0UHJvcFR5cGVzKTtcblxudmFyIFJFTEFUSVZFX0ZPUk1BVF9USFJFU0hPTERTID0ge1xuICAgIHNlY29uZDogNjAsIC8vIHNlY29uZHMgdG8gbWludXRlXG4gICAgbWludXRlOiA2MCwgLy8gbWludXRlcyB0byBob3VyXG4gICAgaG91cjogMjQsIC8vIGhvdXJzIHRvIGRheVxuICAgIGRheTogMzAsIC8vIGRheXMgdG8gbW9udGhcbiAgICBtb250aDogMTIgfTtcblxuZnVuY3Rpb24gdXBkYXRlUmVsYXRpdmVGb3JtYXRUaHJlc2hvbGRzKG5ld1RocmVzaG9sZHMpIHtcbiAgICB2YXIgdGhyZXNob2xkcyA9IEludGxSZWxhdGl2ZUZvcm1hdC50aHJlc2hvbGRzO1xuICAgIHRocmVzaG9sZHMuc2Vjb25kID0gbmV3VGhyZXNob2xkcy5zZWNvbmQ7XG4gICAgdGhyZXNob2xkcy5taW51dGUgPSBuZXdUaHJlc2hvbGRzLm1pbnV0ZTtcbiAgICB0aHJlc2hvbGRzLmhvdXIgPSBuZXdUaHJlc2hvbGRzLmhvdXI7XG4gICAgdGhyZXNob2xkcy5kYXkgPSBuZXdUaHJlc2hvbGRzLmRheTtcbiAgICB0aHJlc2hvbGRzLm1vbnRoID0gbmV3VGhyZXNob2xkcy5tb250aDtcbn1cblxuZnVuY3Rpb24gZ2V0TmFtZWRGb3JtYXQoZm9ybWF0cywgdHlwZSwgbmFtZSkge1xuICAgIHZhciBmb3JtYXQgPSBmb3JtYXRzICYmIGZvcm1hdHNbdHlwZV0gJiYgZm9ybWF0c1t0eXBlXVtuYW1lXTtcbiAgICBpZiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiBmb3JtYXQ7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW1JlYWN0IEludGxdIE5vICcgKyB0eXBlICsgJyBmb3JtYXQgbmFtZWQ6ICcgKyBuYW1lKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGZvcm1hdERhdGUoY29uZmlnLCBzdGF0ZSwgdmFsdWUpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG4gICAgdmFyIGxvY2FsZSA9IGNvbmZpZy5sb2NhbGUsXG4gICAgICAgIGZvcm1hdHMgPSBjb25maWcuZm9ybWF0cztcbiAgICB2YXIgZm9ybWF0ID0gb3B0aW9ucy5mb3JtYXQ7XG5cblxuICAgIHZhciBkYXRlID0gbmV3IERhdGUodmFsdWUpO1xuICAgIHZhciBkZWZhdWx0cyQkMSA9IGZvcm1hdCAmJiBnZXROYW1lZEZvcm1hdChmb3JtYXRzLCAnZGF0ZScsIGZvcm1hdCk7XG4gICAgdmFyIGZpbHRlcmVkT3B0aW9ucyA9IGZpbHRlclByb3BzKG9wdGlvbnMsIERBVEVfVElNRV9GT1JNQVRfT1BUSU9OUywgZGVmYXVsdHMkJDEpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHN0YXRlLmdldERhdGVUaW1lRm9ybWF0KGxvY2FsZSwgZmlsdGVyZWRPcHRpb25zKS5mb3JtYXQoZGF0ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1JlYWN0IEludGxdIEVycm9yIGZvcm1hdHRpbmcgZGF0ZS5cXG4nICsgZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gU3RyaW5nKGRhdGUpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUaW1lKGNvbmZpZywgc3RhdGUsIHZhbHVlKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICAgIHZhciBsb2NhbGUgPSBjb25maWcubG9jYWxlLFxuICAgICAgICBmb3JtYXRzID0gY29uZmlnLmZvcm1hdHM7XG4gICAgdmFyIGZvcm1hdCA9IG9wdGlvbnMuZm9ybWF0O1xuXG5cbiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICB2YXIgZGVmYXVsdHMkJDEgPSBmb3JtYXQgJiYgZ2V0TmFtZWRGb3JtYXQoZm9ybWF0cywgJ3RpbWUnLCBmb3JtYXQpO1xuICAgIHZhciBmaWx0ZXJlZE9wdGlvbnMgPSBmaWx0ZXJQcm9wcyhvcHRpb25zLCBEQVRFX1RJTUVfRk9STUFUX09QVElPTlMsIGRlZmF1bHRzJCQxKTtcblxuICAgIGlmICghZmlsdGVyZWRPcHRpb25zLmhvdXIgJiYgIWZpbHRlcmVkT3B0aW9ucy5taW51dGUgJiYgIWZpbHRlcmVkT3B0aW9ucy5zZWNvbmQpIHtcbiAgICAgICAgLy8gQWRkIGRlZmF1bHQgZm9ybWF0dGluZyBvcHRpb25zIGlmIGhvdXIsIG1pbnV0ZSwgb3Igc2Vjb25kIGlzbid0IGRlZmluZWQuXG4gICAgICAgIGZpbHRlcmVkT3B0aW9ucyA9IF9leHRlbmRzKHt9LCBmaWx0ZXJlZE9wdGlvbnMsIHsgaG91cjogJ251bWVyaWMnLCBtaW51dGU6ICdudW1lcmljJyB9KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gc3RhdGUuZ2V0RGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBmaWx0ZXJlZE9wdGlvbnMpLmZvcm1hdChkYXRlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbUmVhY3QgSW50bF0gRXJyb3IgZm9ybWF0dGluZyB0aW1lLlxcbicgKyBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcoZGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFJlbGF0aXZlKGNvbmZpZywgc3RhdGUsIHZhbHVlKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuICAgIHZhciBsb2NhbGUgPSBjb25maWcubG9jYWxlLFxuICAgICAgICBmb3JtYXRzID0gY29uZmlnLmZvcm1hdHM7XG4gICAgdmFyIGZvcm1hdCA9IG9wdGlvbnMuZm9ybWF0O1xuXG5cbiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICB2YXIgbm93ID0gbmV3IERhdGUob3B0aW9ucy5ub3cpO1xuICAgIHZhciBkZWZhdWx0cyQkMSA9IGZvcm1hdCAmJiBnZXROYW1lZEZvcm1hdChmb3JtYXRzLCAncmVsYXRpdmUnLCBmb3JtYXQpO1xuICAgIHZhciBmaWx0ZXJlZE9wdGlvbnMgPSBmaWx0ZXJQcm9wcyhvcHRpb25zLCBSRUxBVElWRV9GT1JNQVRfT1BUSU9OUywgZGVmYXVsdHMkJDEpO1xuXG4gICAgLy8gQ2FwdHVyZSB0aGUgY3VycmVudCB0aHJlc2hvbGQgdmFsdWVzLCB0aGVuIHRlbXBvcmFyaWx5IG92ZXJyaWRlIHRoZW0gd2l0aFxuICAgIC8vIHNwZWNpZmljIHZhbHVlcyBqdXN0IGZvciB0aGlzIHJlbmRlci5cbiAgICB2YXIgb2xkVGhyZXNob2xkcyA9IF9leHRlbmRzKHt9LCBJbnRsUmVsYXRpdmVGb3JtYXQudGhyZXNob2xkcyk7XG4gICAgdXBkYXRlUmVsYXRpdmVGb3JtYXRUaHJlc2hvbGRzKFJFTEFUSVZFX0ZPUk1BVF9USFJFU0hPTERTKTtcblxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS5nZXRSZWxhdGl2ZUZvcm1hdChsb2NhbGUsIGZpbHRlcmVkT3B0aW9ucykuZm9ybWF0KGRhdGUsIHtcbiAgICAgICAgICAgIG5vdzogaXNGaW5pdGUobm93KSA/IG5vdyA6IHN0YXRlLm5vdygpXG4gICAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tSZWFjdCBJbnRsXSBFcnJvciBmb3JtYXR0aW5nIHJlbGF0aXZlIHRpbWUuXFxuJyArIGUpO1xuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdXBkYXRlUmVsYXRpdmVGb3JtYXRUaHJlc2hvbGRzKG9sZFRocmVzaG9sZHMpO1xuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcoZGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdE51bWJlcihjb25maWcsIHN0YXRlLCB2YWx1ZSkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fTtcbiAgICB2YXIgbG9jYWxlID0gY29uZmlnLmxvY2FsZSxcbiAgICAgICAgZm9ybWF0cyA9IGNvbmZpZy5mb3JtYXRzO1xuICAgIHZhciBmb3JtYXQgPSBvcHRpb25zLmZvcm1hdDtcblxuXG4gICAgdmFyIGRlZmF1bHRzJCQxID0gZm9ybWF0ICYmIGdldE5hbWVkRm9ybWF0KGZvcm1hdHMsICdudW1iZXInLCBmb3JtYXQpO1xuICAgIHZhciBmaWx0ZXJlZE9wdGlvbnMgPSBmaWx0ZXJQcm9wcyhvcHRpb25zLCBOVU1CRVJfRk9STUFUX09QVElPTlMsIGRlZmF1bHRzJCQxKTtcblxuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS5nZXROdW1iZXJGb3JtYXQobG9jYWxlLCBmaWx0ZXJlZE9wdGlvbnMpLmZvcm1hdCh2YWx1ZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1JlYWN0IEludGxdIEVycm9yIGZvcm1hdHRpbmcgbnVtYmVyLlxcbicgKyBlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRQbHVyYWwoY29uZmlnLCBzdGF0ZSwgdmFsdWUpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG4gICAgdmFyIGxvY2FsZSA9IGNvbmZpZy5sb2NhbGU7XG5cblxuICAgIHZhciBmaWx0ZXJlZE9wdGlvbnMgPSBmaWx0ZXJQcm9wcyhvcHRpb25zLCBQTFVSQUxfRk9STUFUX09QVElPTlMpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHN0YXRlLmdldFBsdXJhbEZvcm1hdChsb2NhbGUsIGZpbHRlcmVkT3B0aW9ucykuZm9ybWF0KHZhbHVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbUmVhY3QgSW50bF0gRXJyb3IgZm9ybWF0dGluZyBwbHVyYWwuXFxuJyArIGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICdvdGhlcic7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdE1lc3NhZ2UoY29uZmlnLCBzdGF0ZSkge1xuICAgIHZhciBtZXNzYWdlRGVzY3JpcHRvciA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG4gICAgdmFyIHZhbHVlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG4gICAgdmFyIGxvY2FsZSA9IGNvbmZpZy5sb2NhbGUsXG4gICAgICAgIGZvcm1hdHMgPSBjb25maWcuZm9ybWF0cyxcbiAgICAgICAgbWVzc2FnZXMgPSBjb25maWcubWVzc2FnZXMsXG4gICAgICAgIGRlZmF1bHRMb2NhbGUgPSBjb25maWcuZGVmYXVsdExvY2FsZSxcbiAgICAgICAgZGVmYXVsdEZvcm1hdHMgPSBjb25maWcuZGVmYXVsdEZvcm1hdHM7XG4gICAgdmFyIGlkID0gbWVzc2FnZURlc2NyaXB0b3IuaWQsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlID0gbWVzc2FnZURlc2NyaXB0b3IuZGVmYXVsdE1lc3NhZ2U7XG5cbiAgICAvLyBgaWRgIGlzIGEgcmVxdWlyZWQgZmllbGQgb2YgYSBNZXNzYWdlIERlc2NyaXB0b3IuXG5cbiAgICBpbnZhcmlhbnQoaWQsICdbUmVhY3QgSW50bF0gQW4gYGlkYCBtdXN0IGJlIHByb3ZpZGVkIHRvIGZvcm1hdCBhIG1lc3NhZ2UuJyk7XG5cbiAgICB2YXIgbWVzc2FnZSA9IG1lc3NhZ2VzICYmIG1lc3NhZ2VzW2lkXTtcbiAgICB2YXIgaGFzVmFsdWVzID0gT2JqZWN0LmtleXModmFsdWVzKS5sZW5ndGggPiAwO1xuXG4gICAgLy8gQXZvaWQgZXhwZW5zaXZlIG1lc3NhZ2UgZm9ybWF0dGluZyBmb3Igc2ltcGxlIG1lc3NhZ2VzIHdpdGhvdXQgdmFsdWVzLiBJblxuICAgIC8vIGRldmVsb3BtZW50IG1lc3NhZ2VzIHdpbGwgYWx3YXlzIGJlIGZvcm1hdHRlZCBpbiBjYXNlIG9mIG1pc3NpbmcgdmFsdWVzLlxuICAgIGlmICghaGFzVmFsdWVzICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2UgfHwgZGVmYXVsdE1lc3NhZ2UgfHwgaWQ7XG4gICAgfVxuXG4gICAgdmFyIGZvcm1hdHRlZE1lc3NhZ2UgPSB2b2lkIDA7XG5cbiAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGZvcm1hdHRlciA9IHN0YXRlLmdldE1lc3NhZ2VGb3JtYXQobWVzc2FnZSwgbG9jYWxlLCBmb3JtYXRzKTtcblxuICAgICAgICAgICAgZm9ybWF0dGVkTWVzc2FnZSA9IGZvcm1hdHRlci5mb3JtYXQodmFsdWVzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbUmVhY3QgSW50bF0gRXJyb3IgZm9ybWF0dGluZyBtZXNzYWdlOiBcIicgKyBpZCArICdcIiBmb3IgbG9jYWxlOiBcIicgKyBsb2NhbGUgKyAnXCInICsgKGRlZmF1bHRNZXNzYWdlID8gJywgdXNpbmcgZGVmYXVsdCBtZXNzYWdlIGFzIGZhbGxiYWNrLicgOiAnJykgKyAoJ1xcbicgKyBlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB3YXJuaW5ncyBmcm9tIGxpdHRlcmluZyB0aGUgY29uc29sZSBpbiBkZXZlbG9wbWVudFxuICAgICAgICAgICAgLy8gd2hlbiBubyBgbWVzc2FnZXNgIGFyZSBwYXNzZWQgaW50byB0aGUgPEludGxQcm92aWRlcj4gZm9yIHRoZVxuICAgICAgICAgICAgLy8gZGVmYXVsdCBsb2NhbGUsIGFuZCBhIGRlZmF1bHQgbWVzc2FnZSBpcyBpbiB0aGUgc291cmNlLlxuICAgICAgICAgICAgaWYgKCFkZWZhdWx0TWVzc2FnZSB8fCBsb2NhbGUgJiYgbG9jYWxlLnRvTG93ZXJDYXNlKCkgIT09IGRlZmF1bHRMb2NhbGUudG9Mb3dlckNhc2UoKSkge1xuXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW1JlYWN0IEludGxdIE1pc3NpbmcgbWVzc2FnZTogXCInICsgaWQgKyAnXCIgZm9yIGxvY2FsZTogXCInICsgbG9jYWxlICsgJ1wiJyArIChkZWZhdWx0TWVzc2FnZSA/ICcsIHVzaW5nIGRlZmF1bHQgbWVzc2FnZSBhcyBmYWxsYmFjay4nIDogJycpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICghZm9ybWF0dGVkTWVzc2FnZSAmJiBkZWZhdWx0TWVzc2FnZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIF9mb3JtYXR0ZXIgPSBzdGF0ZS5nZXRNZXNzYWdlRm9ybWF0KGRlZmF1bHRNZXNzYWdlLCBkZWZhdWx0TG9jYWxlLCBkZWZhdWx0Rm9ybWF0cyk7XG5cbiAgICAgICAgICAgIGZvcm1hdHRlZE1lc3NhZ2UgPSBfZm9ybWF0dGVyLmZvcm1hdCh2YWx1ZXMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tSZWFjdCBJbnRsXSBFcnJvciBmb3JtYXR0aW5nIHRoZSBkZWZhdWx0IG1lc3NhZ2UgZm9yOiBcIicgKyBpZCArICdcIicgKyAoJ1xcbicgKyBlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWZvcm1hdHRlZE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tSZWFjdCBJbnRsXSBDYW5ub3QgZm9ybWF0IG1lc3NhZ2U6IFwiJyArIGlkICsgJ1wiLCAnICsgKCd1c2luZyBtZXNzYWdlICcgKyAobWVzc2FnZSB8fCBkZWZhdWx0TWVzc2FnZSA/ICdzb3VyY2UnIDogJ2lkJykgKyAnIGFzIGZhbGxiYWNrLicpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmb3JtYXR0ZWRNZXNzYWdlIHx8IG1lc3NhZ2UgfHwgZGVmYXVsdE1lc3NhZ2UgfHwgaWQ7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEhUTUxNZXNzYWdlKGNvbmZpZywgc3RhdGUsIG1lc3NhZ2VEZXNjcmlwdG9yKSB7XG4gICAgdmFyIHJhd1ZhbHVlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDoge307XG5cbiAgICAvLyBQcm9jZXNzIGFsbCB0aGUgdmFsdWVzIGJlZm9yZSB0aGV5IGFyZSB1c2VkIHdoZW4gZm9ybWF0dGluZyB0aGUgSUNVXG4gICAgLy8gTWVzc2FnZSBzdHJpbmcuIFNpbmNlIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZSBtaWdodCBiZSBpbmplY3RlZCB2aWFcbiAgICAvLyBgaW5uZXJIVE1MYCwgYWxsIFN0cmluZy1iYXNlZCB2YWx1ZXMgbmVlZCB0byBiZSBIVE1MLWVzY2FwZWQuXG4gICAgdmFyIGVzY2FwZWRWYWx1ZXMgPSBPYmplY3Qua2V5cyhyYXdWYWx1ZXMpLnJlZHVjZShmdW5jdGlvbiAoZXNjYXBlZCwgbmFtZSkge1xuICAgICAgICB2YXIgdmFsdWUgPSByYXdWYWx1ZXNbbmFtZV07XG4gICAgICAgIGVzY2FwZWRbbmFtZV0gPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gZXNjYXBlKHZhbHVlKSA6IHZhbHVlO1xuICAgICAgICByZXR1cm4gZXNjYXBlZDtcbiAgICB9LCB7fSk7XG5cbiAgICByZXR1cm4gZm9ybWF0TWVzc2FnZShjb25maWcsIHN0YXRlLCBtZXNzYWdlRGVzY3JpcHRvciwgZXNjYXBlZFZhbHVlcyk7XG59XG5cblxuXG52YXIgZm9ybWF0ID0gT2JqZWN0LmZyZWV6ZSh7XG5cdGZvcm1hdERhdGU6IGZvcm1hdERhdGUsXG5cdGZvcm1hdFRpbWU6IGZvcm1hdFRpbWUsXG5cdGZvcm1hdFJlbGF0aXZlOiBmb3JtYXRSZWxhdGl2ZSxcblx0Zm9ybWF0TnVtYmVyOiBmb3JtYXROdW1iZXIsXG5cdGZvcm1hdFBsdXJhbDogZm9ybWF0UGx1cmFsLFxuXHRmb3JtYXRNZXNzYWdlOiBmb3JtYXRNZXNzYWdlLFxuXHRmb3JtYXRIVE1MTWVzc2FnZTogZm9ybWF0SFRNTE1lc3NhZ2Vcbn0pO1xuXG4vKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cbiAqIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxudmFyIGludGxDb25maWdQcm9wTmFtZXMkMSA9IE9iamVjdC5rZXlzKGludGxDb25maWdQcm9wVHlwZXMpO1xudmFyIGludGxGb3JtYXRQcm9wTmFtZXMgPSBPYmplY3Qua2V5cyhpbnRsRm9ybWF0UHJvcFR5cGVzKTtcblxuLy8gVGhlc2UgYXJlIG5vdCBhIHN0YXRpYyBwcm9wZXJ0eSBvbiB0aGUgYEludGxQcm92aWRlcmAgY2xhc3Mgc28gdGhlIGludGxcbi8vIGNvbmZpZyB2YWx1ZXMgY2FuIGJlIGluaGVyaXRlZCBmcm9tIGFuIDxJbnRsUHJvdmlkZXI+IGFuY2VzdG9yLlxudmFyIGRlZmF1bHRQcm9wcyA9IHtcbiAgICBmb3JtYXRzOiB7fSxcbiAgICBtZXNzYWdlczoge30sXG4gICAgdGV4dENvbXBvbmVudDogJ3NwYW4nLFxuXG4gICAgZGVmYXVsdExvY2FsZTogJ2VuJyxcbiAgICBkZWZhdWx0Rm9ybWF0czoge31cbn07XG5cbnZhciBJbnRsUHJvdmlkZXIgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICAgIGluaGVyaXRzKEludGxQcm92aWRlciwgX0NvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBJbnRsUHJvdmlkZXIocHJvcHMpIHtcbiAgICAgICAgdmFyIGNvbnRleHQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuICAgICAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBJbnRsUHJvdmlkZXIpO1xuXG4gICAgICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKEludGxQcm92aWRlci5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKEludGxQcm92aWRlcikpLmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgICAgICBpbnZhcmlhbnQodHlwZW9mIEludGwgIT09ICd1bmRlZmluZWQnLCAnW1JlYWN0IEludGxdIFRoZSBgSW50bGAgQVBJcyBtdXN0IGJlIGF2YWlsYWJsZSBpbiB0aGUgcnVudGltZSwgJyArICdhbmQgZG8gbm90IGFwcGVhciB0byBiZSBidWlsdC1pbi4gQW4gYEludGxgIHBvbHlmaWxsIHNob3VsZCBiZSBsb2FkZWQuXFxuJyArICdTZWU6IGh0dHA6Ly9mb3JtYXRqcy5pby9ndWlkZXMvcnVudGltZS1lbnZpcm9ubWVudHMvJyk7XG5cbiAgICAgICAgdmFyIGludGxDb250ZXh0ID0gY29udGV4dC5pbnRsO1xuXG4gICAgICAgIC8vIFVzZWQgdG8gc3RhYmlsaXplIHRpbWUgd2hlbiBwZXJmb3JtaW5nIGFuIGluaXRpYWwgcmVuZGVyaW5nIHNvIHRoYXRcbiAgICAgICAgLy8gYWxsIHJlbGF0aXZlIHRpbWVzIHVzZSB0aGUgc2FtZSByZWZlcmVuY2UgXCJub3dcIiB0aW1lLlxuXG4gICAgICAgIHZhciBpbml0aWFsTm93ID0gdm9pZCAwO1xuICAgICAgICBpZiAoaXNGaW5pdGUocHJvcHMuaW5pdGlhbE5vdykpIHtcbiAgICAgICAgICAgIGluaXRpYWxOb3cgPSBOdW1iZXIocHJvcHMuaW5pdGlhbE5vdyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBXaGVuIGFuIGBpbml0aWFsTm93YCBpc24ndCBwcm92aWRlZCB2aWEgYHByb3BzYCwgbG9vayB0byBzZWUgYW5cbiAgICAgICAgICAgIC8vIDxJbnRsUHJvdmlkZXI+IGV4aXN0cyBpbiB0aGUgYW5jZXN0cnkgYW5kIGNhbGwgaXRzIGBub3coKWBcbiAgICAgICAgICAgIC8vIGZ1bmN0aW9uIHRvIHByb3BhZ2F0ZSBpdHMgdmFsdWUgZm9yIFwibm93XCIuXG4gICAgICAgICAgICBpbml0aWFsTm93ID0gaW50bENvbnRleHQgPyBpbnRsQ29udGV4dC5ub3coKSA6IERhdGUubm93KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGluZyBgSW50bCpgIGZvcm1hdHRlcnMgaXMgZXhwZW5zaXZlLiBJZiB0aGVyZSdzIGEgcGFyZW50XG4gICAgICAgIC8vIGA8SW50bFByb3ZpZGVyPmAsIHRoZW4gaXRzIGZvcm1hdHRlcnMgd2lsbCBiZSB1c2VkLiBPdGhlcndpc2UsIHRoaXNcbiAgICAgICAgLy8gbWVtb2l6ZSB0aGUgYEludGwqYCBjb25zdHJ1Y3RvcnMgYW5kIGNhY2hlIHRoZW0gZm9yIHRoZSBsaWZlY3ljbGUgb2ZcbiAgICAgICAgLy8gdGhpcyBJbnRsUHJvdmlkZXIgaW5zdGFuY2UuXG5cbiAgICAgICAgdmFyIF9yZWYgPSBpbnRsQ29udGV4dCB8fCB7fSxcbiAgICAgICAgICAgIF9yZWYkZm9ybWF0dGVycyA9IF9yZWYuZm9ybWF0dGVycyxcbiAgICAgICAgICAgIGZvcm1hdHRlcnMgPSBfcmVmJGZvcm1hdHRlcnMgPT09IHVuZGVmaW5lZCA/IHtcbiAgICAgICAgICAgIGdldERhdGVUaW1lRm9ybWF0OiBtZW1vaXplSW50bENvbnN0cnVjdG9yKEludGwuRGF0ZVRpbWVGb3JtYXQpLFxuICAgICAgICAgICAgZ2V0TnVtYmVyRm9ybWF0OiBtZW1vaXplSW50bENvbnN0cnVjdG9yKEludGwuTnVtYmVyRm9ybWF0KSxcbiAgICAgICAgICAgIGdldE1lc3NhZ2VGb3JtYXQ6IG1lbW9pemVJbnRsQ29uc3RydWN0b3IoSW50bE1lc3NhZ2VGb3JtYXQpLFxuICAgICAgICAgICAgZ2V0UmVsYXRpdmVGb3JtYXQ6IG1lbW9pemVJbnRsQ29uc3RydWN0b3IoSW50bFJlbGF0aXZlRm9ybWF0KSxcbiAgICAgICAgICAgIGdldFBsdXJhbEZvcm1hdDogbWVtb2l6ZUludGxDb25zdHJ1Y3RvcihJbnRsUGx1cmFsRm9ybWF0KVxuICAgICAgICB9IDogX3JlZiRmb3JtYXR0ZXJzO1xuXG4gICAgICAgIF90aGlzLnN0YXRlID0gX2V4dGVuZHMoe30sIGZvcm1hdHRlcnMsIHtcblxuICAgICAgICAgICAgLy8gV3JhcHBlciB0byBwcm92aWRlIHN0YWJsZSBcIm5vd1wiIHRpbWUgZm9yIGluaXRpYWwgcmVuZGVyLlxuICAgICAgICAgICAgbm93OiBmdW5jdGlvbiBub3coKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9kaWREaXNwbGF5ID8gRGF0ZS5ub3coKSA6IGluaXRpYWxOb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgY3JlYXRlQ2xhc3MoSW50bFByb3ZpZGVyLCBbe1xuICAgICAgICBrZXk6ICdnZXRDb25maWcnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0Q29uZmlnKCkge1xuICAgICAgICAgICAgdmFyIGludGxDb250ZXh0ID0gdGhpcy5jb250ZXh0LmludGw7XG5cbiAgICAgICAgICAgIC8vIEJ1aWxkIGEgd2hpdGVsaXN0ZWQgY29uZmlnIG9iamVjdCBmcm9tIGBwcm9wc2AsIGRlZmF1bHRzLCBhbmRcbiAgICAgICAgICAgIC8vIGBjb250ZXh0LmludGxgLCBpZiBhbiA8SW50bFByb3ZpZGVyPiBleGlzdHMgaW4gdGhlIGFuY2VzdHJ5LlxuXG4gICAgICAgICAgICB2YXIgY29uZmlnID0gZmlsdGVyUHJvcHModGhpcy5wcm9wcywgaW50bENvbmZpZ1Byb3BOYW1lcyQxLCBpbnRsQ29udGV4dCk7XG5cbiAgICAgICAgICAgIC8vIEFwcGx5IGRlZmF1bHQgcHJvcHMuIFRoaXMgbXVzdCBiZSBhcHBsaWVkIGxhc3QgYWZ0ZXIgdGhlIHByb3BzIGhhdmVcbiAgICAgICAgICAgIC8vIGJlZW4gcmVzb2x2ZWQgYW5kIGluaGVyaXRlZCBmcm9tIGFueSA8SW50bFByb3ZpZGVyPiBpbiB0aGUgYW5jZXN0cnkuXG4gICAgICAgICAgICAvLyBUaGlzIG1hdGNoZXMgaG93IFJlYWN0IHJlc29sdmVzIGBkZWZhdWx0UHJvcHNgLlxuICAgICAgICAgICAgZm9yICh2YXIgcHJvcE5hbWUgaW4gZGVmYXVsdFByb3BzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ1twcm9wTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25maWdbcHJvcE5hbWVdID0gZGVmYXVsdFByb3BzW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaGFzTG9jYWxlRGF0YShjb25maWcubG9jYWxlKSkge1xuICAgICAgICAgICAgICAgIHZhciBfY29uZmlnID0gY29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBsb2NhbGUgPSBfY29uZmlnLmxvY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdExvY2FsZSA9IF9jb25maWcuZGVmYXVsdExvY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEZvcm1hdHMgPSBfY29uZmlnLmRlZmF1bHRGb3JtYXRzO1xuXG5cbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbUmVhY3QgSW50bF0gTWlzc2luZyBsb2NhbGUgZGF0YSBmb3IgbG9jYWxlOiBcIicgKyBsb2NhbGUgKyAnXCIuICcgKyAoJ1VzaW5nIGRlZmF1bHQgbG9jYWxlOiBcIicgKyBkZWZhdWx0TG9jYWxlICsgJ1wiIGFzIGZhbGxiYWNrLicpKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGVyZSdzIG5vIHJlZ2lzdGVyZWQgbG9jYWxlIGRhdGEgZm9yIGBsb2NhbGVgLCB0aGlzIHdpbGxcbiAgICAgICAgICAgICAgICAvLyBmYWxsYmFjayB0byB0aGUgYGRlZmF1bHRMb2NhbGVgIHRvIG1ha2Ugc3VyZSB0aGluZ3MgY2FuIHJlbmRlci5cbiAgICAgICAgICAgICAgICAvLyBUaGUgYG1lc3NhZ2VzYCBhcmUgb3ZlcnJpZGRlbiB0byB0aGUgYGRlZmF1bHRQcm9wc2AgZW1wdHkgb2JqZWN0XG4gICAgICAgICAgICAgICAgLy8gdG8gbWFpbnRhaW4gcmVmZXJlbnRpYWwgZXF1YWxpdHkgYWNyb3NzIHJlLXJlbmRlcnMuIEl0J3MgYXNzdW1lZFxuICAgICAgICAgICAgICAgIC8vIGVhY2ggPEZvcm1hdHRlZE1lc3NhZ2U+IGNvbnRhaW5zIGEgYGRlZmF1bHRNZXNzYWdlYCBwcm9wLlxuICAgICAgICAgICAgICAgIGNvbmZpZyA9IF9leHRlbmRzKHt9LCBjb25maWcsIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlOiBkZWZhdWx0TG9jYWxlLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXRzOiBkZWZhdWx0Rm9ybWF0cyxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXM6IGRlZmF1bHRQcm9wcy5tZXNzYWdlc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdnZXRCb3VuZEZvcm1hdEZucycsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRCb3VuZEZvcm1hdEZucyhjb25maWcsIHN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gaW50bEZvcm1hdFByb3BOYW1lcy5yZWR1Y2UoZnVuY3Rpb24gKGJvdW5kRm9ybWF0Rm5zLCBuYW1lKSB7XG4gICAgICAgICAgICAgICAgYm91bmRGb3JtYXRGbnNbbmFtZV0gPSBmb3JtYXRbbmFtZV0uYmluZChudWxsLCBjb25maWcsIHN0YXRlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYm91bmRGb3JtYXRGbnM7XG4gICAgICAgICAgICB9LCB7fSk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ2dldENoaWxkQ29udGV4dCcsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRDaGlsZENvbnRleHQoKSB7XG4gICAgICAgICAgICB2YXIgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcblxuICAgICAgICAgICAgLy8gQmluZCBpbnRsIGZhY3RvcmllcyBhbmQgY3VycmVudCBjb25maWcgdG8gdGhlIGZvcm1hdCBmdW5jdGlvbnMuXG4gICAgICAgICAgICB2YXIgYm91bmRGb3JtYXRGbnMgPSB0aGlzLmdldEJvdW5kRm9ybWF0Rm5zKGNvbmZpZywgdGhpcy5zdGF0ZSk7XG5cbiAgICAgICAgICAgIHZhciBfc3RhdGUgPSB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgICAgIG5vdyA9IF9zdGF0ZS5ub3csXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVycyA9IG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9zdGF0ZSwgWydub3cnXSk7XG5cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBpbnRsOiBfZXh0ZW5kcyh7fSwgY29uZmlnLCBib3VuZEZvcm1hdEZucywge1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXJzOiBmb3JtYXR0ZXJzLFxuICAgICAgICAgICAgICAgICAgICBub3c6IG5vd1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdzaG91bGRDb21wb25lbnRVcGRhdGUnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG5leHQgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgICAgICBuZXh0W19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gc2hvdWxkSW50bENvbXBvbmVudFVwZGF0ZS5hcHBseSh1bmRlZmluZWQsIFt0aGlzXS5jb25jYXQobmV4dCkpO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdjb21wb25lbnREaWRNb3VudCcsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgICAgIHRoaXMuX2RpZERpc3BsYXkgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdyZW5kZXInLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICAgICAgcmV0dXJuIFJlYWN0LkNoaWxkcmVuLm9ubHkodGhpcy5wcm9wcy5jaGlsZHJlbik7XG4gICAgICAgIH1cbiAgICB9XSk7XG4gICAgcmV0dXJuIEludGxQcm92aWRlcjtcbn0oUmVhY3QuQ29tcG9uZW50KTtcblxuSW50bFByb3ZpZGVyLmRpc3BsYXlOYW1lID0gJ0ludGxQcm92aWRlcic7XG5JbnRsUHJvdmlkZXIuY29udGV4dFR5cGVzID0ge1xuICAgIGludGw6IGludGxTaGFwZVxufTtcbkludGxQcm92aWRlci5jaGlsZENvbnRleHRUeXBlcyA9IHtcbiAgICBpbnRsOiBpbnRsU2hhcGUuaXNSZXF1aXJlZFxufTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEludGxQcm92aWRlci5wcm9wVHlwZXMgPSBfZXh0ZW5kcyh7fSwgaW50bENvbmZpZ1Byb3BUeXBlcywge1xuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMuZWxlbWVudC5pc1JlcXVpcmVkLFxuICAgIGluaXRpYWxOb3c6IFByb3BUeXBlcy5hbnlcbn0pIDogdm9pZCAwO1xuXG4vKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cbiAqIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxudmFyIEZvcm1hdHRlZERhdGUgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICAgIGluaGVyaXRzKEZvcm1hdHRlZERhdGUsIF9Db21wb25lbnQpO1xuXG4gICAgZnVuY3Rpb24gRm9ybWF0dGVkRGF0ZShwcm9wcywgY29udGV4dCkge1xuICAgICAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBGb3JtYXR0ZWREYXRlKTtcblxuICAgICAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChGb3JtYXR0ZWREYXRlLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRm9ybWF0dGVkRGF0ZSkpLmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgICAgICBpbnZhcmlhbnRJbnRsQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIGNyZWF0ZUNsYXNzKEZvcm1hdHRlZERhdGUsIFt7XG4gICAgICAgIGtleTogJ3Nob3VsZENvbXBvbmVudFVwZGF0ZScsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUoKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbmV4dCA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgICAgICAgIG5leHRbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBzaG91bGRJbnRsQ29tcG9uZW50VXBkYXRlLmFwcGx5KHVuZGVmaW5lZCwgW3RoaXNdLmNvbmNhdChuZXh0KSk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ3JlbmRlcicsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgICAgICB2YXIgX2NvbnRleHQkaW50bCA9IHRoaXMuY29udGV4dC5pbnRsLFxuICAgICAgICAgICAgICAgIGZvcm1hdERhdGUgPSBfY29udGV4dCRpbnRsLmZvcm1hdERhdGUsXG4gICAgICAgICAgICAgICAgVGV4dCA9IF9jb250ZXh0JGludGwudGV4dENvbXBvbmVudDtcbiAgICAgICAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgICAgIHZhbHVlID0gX3Byb3BzLnZhbHVlLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuO1xuXG5cbiAgICAgICAgICAgIHZhciBmb3JtYXR0ZWREYXRlID0gZm9ybWF0RGF0ZSh2YWx1ZSwgdGhpcy5wcm9wcyk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW4oZm9ybWF0dGVkRGF0ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgIFRleHQsXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWREYXRlXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfV0pO1xuICAgIHJldHVybiBGb3JtYXR0ZWREYXRlO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5Gb3JtYXR0ZWREYXRlLmRpc3BsYXlOYW1lID0gJ0Zvcm1hdHRlZERhdGUnO1xuRm9ybWF0dGVkRGF0ZS5jb250ZXh0VHlwZXMgPSB7XG4gICAgaW50bDogaW50bFNoYXBlXG59O1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gRm9ybWF0dGVkRGF0ZS5wcm9wVHlwZXMgPSBfZXh0ZW5kcyh7fSwgZGF0ZVRpbWVGb3JtYXRQcm9wVHlwZXMsIHtcbiAgICB2YWx1ZTogUHJvcFR5cGVzLmFueS5pc1JlcXVpcmVkLFxuICAgIGZvcm1hdDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLmZ1bmNcbn0pIDogdm9pZCAwO1xuXG4vKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cbiAqIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxudmFyIEZvcm1hdHRlZFRpbWUgPSBmdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICAgIGluaGVyaXRzKEZvcm1hdHRlZFRpbWUsIF9Db21wb25lbnQpO1xuXG4gICAgZnVuY3Rpb24gRm9ybWF0dGVkVGltZShwcm9wcywgY29udGV4dCkge1xuICAgICAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBGb3JtYXR0ZWRUaW1lKTtcblxuICAgICAgICB2YXIgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChGb3JtYXR0ZWRUaW1lLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRm9ybWF0dGVkVGltZSkpLmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgICAgICBpbnZhcmlhbnRJbnRsQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIGNyZWF0ZUNsYXNzKEZvcm1hdHRlZFRpbWUsIFt7XG4gICAgICAgIGtleTogJ3Nob3VsZENvbXBvbmVudFVwZGF0ZScsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUoKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbmV4dCA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgICAgICAgIG5leHRbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBzaG91bGRJbnRsQ29tcG9uZW50VXBkYXRlLmFwcGx5KHVuZGVmaW5lZCwgW3RoaXNdLmNvbmNhdChuZXh0KSk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ3JlbmRlcicsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgICAgICB2YXIgX2NvbnRleHQkaW50bCA9IHRoaXMuY29udGV4dC5pbnRsLFxuICAgICAgICAgICAgICAgIGZvcm1hdFRpbWUgPSBfY29udGV4dCRpbnRsLmZvcm1hdFRpbWUsXG4gICAgICAgICAgICAgICAgVGV4dCA9IF9jb250ZXh0JGludGwudGV4dENvbXBvbmVudDtcbiAgICAgICAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgICAgIHZhbHVlID0gX3Byb3BzLnZhbHVlLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuO1xuXG5cbiAgICAgICAgICAgIHZhciBmb3JtYXR0ZWRUaW1lID0gZm9ybWF0VGltZSh2YWx1ZSwgdGhpcy5wcm9wcyk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW4oZm9ybWF0dGVkVGltZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgICAgICAgIFRleHQsXG4gICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRUaW1lXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfV0pO1xuICAgIHJldHVybiBGb3JtYXR0ZWRUaW1lO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5Gb3JtYXR0ZWRUaW1lLmRpc3BsYXlOYW1lID0gJ0Zvcm1hdHRlZFRpbWUnO1xuRm9ybWF0dGVkVGltZS5jb250ZXh0VHlwZXMgPSB7XG4gICAgaW50bDogaW50bFNoYXBlXG59O1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gRm9ybWF0dGVkVGltZS5wcm9wVHlwZXMgPSBfZXh0ZW5kcyh7fSwgZGF0ZVRpbWVGb3JtYXRQcm9wVHlwZXMsIHtcbiAgICB2YWx1ZTogUHJvcFR5cGVzLmFueS5pc1JlcXVpcmVkLFxuICAgIGZvcm1hdDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLmZ1bmNcbn0pIDogdm9pZCAwO1xuXG4vKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cbiAqIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxudmFyIFNFQ09ORCA9IDEwMDA7XG52YXIgTUlOVVRFID0gMTAwMCAqIDYwO1xudmFyIEhPVVIgPSAxMDAwICogNjAgKiA2MDtcbnZhciBEQVkgPSAxMDAwICogNjAgKiA2MCAqIDI0O1xuXG4vLyBUaGUgbWF4aW11bSB0aW1lciBkZWxheSB2YWx1ZSBpcyBhIDMyLWJpdCBzaWduZWQgaW50ZWdlci5cbi8vIFNlZTogaHR0cHM6Ly9tZG4uaW8vc2V0VGltZW91dFxudmFyIE1BWF9USU1FUl9ERUxBWSA9IDIxNDc0ODM2NDc7XG5cbmZ1bmN0aW9uIHNlbGVjdFVuaXRzKGRlbHRhKSB7XG4gICAgdmFyIGFic0RlbHRhID0gTWF0aC5hYnMoZGVsdGEpO1xuXG4gICAgaWYgKGFic0RlbHRhIDwgTUlOVVRFKSB7XG4gICAgICAgIHJldHVybiAnc2Vjb25kJztcbiAgICB9XG5cbiAgICBpZiAoYWJzRGVsdGEgPCBIT1VSKSB7XG4gICAgICAgIHJldHVybiAnbWludXRlJztcbiAgICB9XG5cbiAgICBpZiAoYWJzRGVsdGEgPCBEQVkpIHtcbiAgICAgICAgcmV0dXJuICdob3VyJztcbiAgICB9XG5cbiAgICAvLyBUaGUgbWF4aW11bSBzY2hlZHVsZWQgZGVsYXkgd2lsbCBiZSBtZWFzdXJlZCBpbiBkYXlzIHNpbmNlIHRoZSBtYXhpbXVtXG4gICAgLy8gdGltZXIgZGVsYXkgaXMgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGluIDI1IGRheXMuXG4gICAgcmV0dXJuICdkYXknO1xufVxuXG5mdW5jdGlvbiBnZXRVbml0RGVsYXkodW5pdHMpIHtcbiAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgICAgICAgICByZXR1cm4gU0VDT05EO1xuICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgcmV0dXJuIE1JTlVURTtcbiAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICByZXR1cm4gSE9VUjtcbiAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIHJldHVybiBEQVk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gTUFYX1RJTUVSX0RFTEFZO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gaXNTYW1lRGF0ZShhLCBiKSB7XG4gICAgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGFUaW1lID0gbmV3IERhdGUoYSkuZ2V0VGltZSgpO1xuICAgIHZhciBiVGltZSA9IG5ldyBEYXRlKGIpLmdldFRpbWUoKTtcblxuICAgIHJldHVybiBpc0Zpbml0ZShhVGltZSkgJiYgaXNGaW5pdGUoYlRpbWUpICYmIGFUaW1lID09PSBiVGltZTtcbn1cblxudmFyIEZvcm1hdHRlZFJlbGF0aXZlID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICBpbmhlcml0cyhGb3JtYXR0ZWRSZWxhdGl2ZSwgX0NvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBGb3JtYXR0ZWRSZWxhdGl2ZShwcm9wcywgY29udGV4dCkge1xuICAgICAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBGb3JtYXR0ZWRSZWxhdGl2ZSk7XG5cbiAgICAgICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoRm9ybWF0dGVkUmVsYXRpdmUuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihGb3JtYXR0ZWRSZWxhdGl2ZSkpLmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgICAgICBpbnZhcmlhbnRJbnRsQ29udGV4dChjb250ZXh0KTtcblxuICAgICAgICB2YXIgbm93ID0gaXNGaW5pdGUocHJvcHMuaW5pdGlhbE5vdykgPyBOdW1iZXIocHJvcHMuaW5pdGlhbE5vdykgOiBjb250ZXh0LmludGwubm93KCk7XG5cbiAgICAgICAgLy8gYG5vd2AgaXMgc3RvcmVkIGFzIHN0YXRlIHNvIHRoYXQgYHJlbmRlcigpYCByZW1haW5zIGEgZnVuY3Rpb24gb2ZcbiAgICAgICAgLy8gcHJvcHMgKyBzdGF0ZSwgaW5zdGVhZCBvZiBhY2Nlc3NpbmcgYERhdGUubm93KClgIGluc2lkZSBgcmVuZGVyKClgLlxuICAgICAgICBfdGhpcy5zdGF0ZSA9IHsgbm93OiBub3cgfTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIGNyZWF0ZUNsYXNzKEZvcm1hdHRlZFJlbGF0aXZlLCBbe1xuICAgICAgICBrZXk6ICdzY2hlZHVsZU5leHRVcGRhdGUnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gc2NoZWR1bGVOZXh0VXBkYXRlKHByb3BzLCBzdGF0ZSkge1xuICAgICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICAgICAgIC8vIENhbmNlbCBhbmQgcGVuZGluZyB1cGRhdGUgYmVjYXVzZSB3ZSdyZSBzY2hlZHVsaW5nIGEgbmV3IHVwZGF0ZS5cbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7XG5cbiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHByb3BzLnZhbHVlLFxuICAgICAgICAgICAgICAgIHVuaXRzID0gcHJvcHMudW5pdHMsXG4gICAgICAgICAgICAgICAgdXBkYXRlSW50ZXJ2YWwgPSBwcm9wcy51cGRhdGVJbnRlcnZhbDtcblxuICAgICAgICAgICAgdmFyIHRpbWUgPSBuZXcgRGF0ZSh2YWx1ZSkuZ2V0VGltZSgpO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgYHVwZGF0ZUludGVydmFsYCBpcyBmYWxzeSwgaW5jbHVkaW5nIGAwYCBvciB3ZSBkb24ndCBoYXZlIGFcbiAgICAgICAgICAgIC8vIHZhbGlkIGRhdGUsIHRoZW4gYXV0byB1cGRhdGVzIGhhdmUgYmVlbiB0dXJuZWQgb2ZmLCBzbyB3ZSBiYWlsIGFuZFxuICAgICAgICAgICAgLy8gc2tpcCBzY2hlZHVsaW5nIGFuIHVwZGF0ZS5cbiAgICAgICAgICAgIGlmICghdXBkYXRlSW50ZXJ2YWwgfHwgIWlzRmluaXRlKHRpbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZGVsdGEgPSB0aW1lIC0gc3RhdGUubm93O1xuICAgICAgICAgICAgdmFyIHVuaXREZWxheSA9IGdldFVuaXREZWxheSh1bml0cyB8fCBzZWxlY3RVbml0cyhkZWx0YSkpO1xuICAgICAgICAgICAgdmFyIHVuaXRSZW1haW5kZXIgPSBNYXRoLmFicyhkZWx0YSAlIHVuaXREZWxheSk7XG5cbiAgICAgICAgICAgIC8vIFdlIHdhbnQgdGhlIGxhcmdlc3QgcG9zc2libGUgdGltZXIgZGVsYXkgd2hpY2ggd2lsbCBzdGlsbCBkaXNwbGF5XG4gICAgICAgICAgICAvLyBhY2N1cmF0ZSBpbmZvcm1hdGlvbiB3aGlsZSByZWR1Y2luZyB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzLiBUaGUgZGVsYXlcbiAgICAgICAgICAgIC8vIHNob3VsZCBiZSB1bnRpbCB0aGUgbmV4dCBcImludGVyZXN0aW5nXCIgbW9tZW50LCBsaWtlIGEgdGljayBmcm9tXG4gICAgICAgICAgICAvLyBcIjEgbWludXRlIGFnb1wiIHRvIFwiMiBtaW51dGVzIGFnb1wiIHdoZW4gdGhlIGRlbHRhIGlzIDEyMCwwMDBtcy5cbiAgICAgICAgICAgIHZhciBkZWxheSA9IGRlbHRhIDwgMCA/IE1hdGgubWF4KHVwZGF0ZUludGVydmFsLCB1bml0RGVsYXkgLSB1bml0UmVtYWluZGVyKSA6IE1hdGgubWF4KHVwZGF0ZUludGVydmFsLCB1bml0UmVtYWluZGVyKTtcblxuICAgICAgICAgICAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpczIuc2V0U3RhdGUoeyBub3c6IF90aGlzMi5jb250ZXh0LmludGwubm93KCkgfSk7XG4gICAgICAgICAgICB9LCBkZWxheSk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ2NvbXBvbmVudERpZE1vdW50JyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZU5leHRVcGRhdGUodGhpcy5wcm9wcywgdGhpcy5zdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhfcmVmKSB7XG4gICAgICAgICAgICB2YXIgbmV4dFZhbHVlID0gX3JlZi52YWx1ZTtcblxuICAgICAgICAgICAgLy8gV2hlbiB0aGUgYHByb3BzLnZhbHVlYCBkYXRlIGNoYW5nZXMsIGBzdGF0ZS5ub3dgIG5lZWRzIHRvIGJlIHVwZGF0ZWQsXG4gICAgICAgICAgICAvLyBhbmQgdGhlIG5leHQgdXBkYXRlIGNhbiBiZSByZXNjaGVkdWxlZC5cbiAgICAgICAgICAgIGlmICghaXNTYW1lRGF0ZShuZXh0VmFsdWUsIHRoaXMucHJvcHMudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IG5vdzogdGhpcy5jb250ZXh0LmludGwubm93KCkgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ3Nob3VsZENvbXBvbmVudFVwZGF0ZScsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUoKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbmV4dCA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgICAgICAgICAgIG5leHRbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBzaG91bGRJbnRsQ29tcG9uZW50VXBkYXRlLmFwcGx5KHVuZGVmaW5lZCwgW3RoaXNdLmNvbmNhdChuZXh0KSk7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ2NvbXBvbmVudFdpbGxVcGRhdGUnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVwZGF0ZShuZXh0UHJvcHMsIG5leHRTdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZU5leHRVcGRhdGUobmV4dFByb3BzLCBuZXh0U3RhdGUpO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdjb21wb25lbnRXaWxsVW5tb3VudCcsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lcik7XG4gICAgICAgIH1cbiAgICB9LCB7XG4gICAgICAgIGtleTogJ3JlbmRlcicsXG4gICAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICAgICAgICB2YXIgX2NvbnRleHQkaW50bCA9IHRoaXMuY29udGV4dC5pbnRsLFxuICAgICAgICAgICAgICAgIGZvcm1hdFJlbGF0aXZlID0gX2NvbnRleHQkaW50bC5mb3JtYXRSZWxhdGl2ZSxcbiAgICAgICAgICAgICAgICBUZXh0ID0gX2NvbnRleHQkaW50bC50ZXh0Q29tcG9uZW50O1xuICAgICAgICAgICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBfcHJvcHMudmFsdWUsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW47XG5cblxuICAgICAgICAgICAgdmFyIGZvcm1hdHRlZFJlbGF0aXZlID0gZm9ybWF0UmVsYXRpdmUodmFsdWUsIF9leHRlbmRzKHt9LCB0aGlzLnByb3BzLCB0aGlzLnN0YXRlKSk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW4oZm9ybWF0dGVkUmVsYXRpdmUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAgICAgICBUZXh0LFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgZm9ybWF0dGVkUmVsYXRpdmVcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XSk7XG4gICAgcmV0dXJuIEZvcm1hdHRlZFJlbGF0aXZlO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5Gb3JtYXR0ZWRSZWxhdGl2ZS5kaXNwbGF5TmFtZSA9ICdGb3JtYXR0ZWRSZWxhdGl2ZSc7XG5Gb3JtYXR0ZWRSZWxhdGl2ZS5jb250ZXh0VHlwZXMgPSB7XG4gICAgaW50bDogaW50bFNoYXBlXG59O1xuRm9ybWF0dGVkUmVsYXRpdmUuZGVmYXVsdFByb3BzID0ge1xuICAgIHVwZGF0ZUludGVydmFsOiAxMDAwICogMTBcbn07XG5wcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyBGb3JtYXR0ZWRSZWxhdGl2ZS5wcm9wVHlwZXMgPSBfZXh0ZW5kcyh7fSwgcmVsYXRpdmVGb3JtYXRQcm9wVHlwZXMsIHtcbiAgICB2YWx1ZTogUHJvcFR5cGVzLmFueS5pc1JlcXVpcmVkLFxuICAgIGZvcm1hdDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICB1cGRhdGVJbnRlcnZhbDogUHJvcFR5cGVzLm51bWJlcixcbiAgICBpbml0aWFsTm93OiBQcm9wVHlwZXMuYW55LFxuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMuZnVuY1xufSkgOiB2b2lkIDA7XG5cbi8qXG4gKiBDb3B5cmlnaHQgMjAxNSwgWWFob28gSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLlxuICogU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuXG52YXIgRm9ybWF0dGVkTnVtYmVyID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICBpbmhlcml0cyhGb3JtYXR0ZWROdW1iZXIsIF9Db21wb25lbnQpO1xuXG4gICAgZnVuY3Rpb24gRm9ybWF0dGVkTnVtYmVyKHByb3BzLCBjb250ZXh0KSB7XG4gICAgICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEZvcm1hdHRlZE51bWJlcik7XG5cbiAgICAgICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoRm9ybWF0dGVkTnVtYmVyLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2YoRm9ybWF0dGVkTnVtYmVyKSkuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgICAgIGludmFyaWFudEludGxDb250ZXh0KGNvbnRleHQpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuXG4gICAgY3JlYXRlQ2xhc3MoRm9ybWF0dGVkTnVtYmVyLCBbe1xuICAgICAgICBrZXk6ICdzaG91bGRDb21wb25lbnRVcGRhdGUnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkge1xuICAgICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIG5leHQgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgICAgICBuZXh0W19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gc2hvdWxkSW50bENvbXBvbmVudFVwZGF0ZS5hcHBseSh1bmRlZmluZWQsIFt0aGlzXS5jb25jYXQobmV4dCkpO1xuICAgICAgICB9XG4gICAgfSwge1xuICAgICAgICBrZXk6ICdyZW5kZXInLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgICAgICAgdmFyIF9jb250ZXh0JGludGwgPSB0aGlzLmNvbnRleHQuaW50bCxcbiAgICAgICAgICAgICAgICBmb3JtYXROdW1iZXIgPSBfY29udGV4dCRpbnRsLmZvcm1hdE51bWJlcixcbiAgICAgICAgICAgICAgICBUZXh0ID0gX2NvbnRleHQkaW50bC50ZXh0Q29tcG9uZW50O1xuICAgICAgICAgICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgICAgICAgdmFsdWUgPSBfcHJvcHMudmFsdWUsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW47XG5cblxuICAgICAgICAgICAgdmFyIGZvcm1hdHRlZE51bWJlciA9IGZvcm1hdE51bWJlcih2YWx1ZSwgdGhpcy5wcm9wcyk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW4oZm9ybWF0dGVkTnVtYmVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgVGV4dCxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIGZvcm1hdHRlZE51bWJlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1dKTtcbiAgICByZXR1cm4gRm9ybWF0dGVkTnVtYmVyO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5Gb3JtYXR0ZWROdW1iZXIuZGlzcGxheU5hbWUgPSAnRm9ybWF0dGVkTnVtYmVyJztcbkZvcm1hdHRlZE51bWJlci5jb250ZXh0VHlwZXMgPSB7XG4gICAgaW50bDogaW50bFNoYXBlXG59O1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gRm9ybWF0dGVkTnVtYmVyLnByb3BUeXBlcyA9IF9leHRlbmRzKHt9LCBudW1iZXJGb3JtYXRQcm9wVHlwZXMsIHtcbiAgICB2YWx1ZTogUHJvcFR5cGVzLmFueS5pc1JlcXVpcmVkLFxuICAgIGZvcm1hdDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLmZ1bmNcbn0pIDogdm9pZCAwO1xuXG4vKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cbiAqIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxudmFyIEZvcm1hdHRlZFBsdXJhbCA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gICAgaW5oZXJpdHMoRm9ybWF0dGVkUGx1cmFsLCBfQ29tcG9uZW50KTtcblxuICAgIGZ1bmN0aW9uIEZvcm1hdHRlZFBsdXJhbChwcm9wcywgY29udGV4dCkge1xuICAgICAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBGb3JtYXR0ZWRQbHVyYWwpO1xuXG4gICAgICAgIHZhciBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKEZvcm1hdHRlZFBsdXJhbC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKEZvcm1hdHRlZFBsdXJhbCkpLmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgICAgICBpbnZhcmlhbnRJbnRsQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIGNyZWF0ZUNsYXNzKEZvcm1hdHRlZFBsdXJhbCwgW3tcbiAgICAgICAga2V5OiAnc2hvdWxkQ29tcG9uZW50VXBkYXRlJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBuZXh0ID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICAgICAgbmV4dFtfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHNob3VsZEludGxDb21wb25lbnRVcGRhdGUuYXBwbHkodW5kZWZpbmVkLCBbdGhpc10uY29uY2F0KG5leHQpKTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAncmVuZGVyJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgICAgIHZhciBfY29udGV4dCRpbnRsID0gdGhpcy5jb250ZXh0LmludGwsXG4gICAgICAgICAgICAgICAgZm9ybWF0UGx1cmFsID0gX2NvbnRleHQkaW50bC5mb3JtYXRQbHVyYWwsXG4gICAgICAgICAgICAgICAgVGV4dCA9IF9jb250ZXh0JGludGwudGV4dENvbXBvbmVudDtcbiAgICAgICAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzLFxuICAgICAgICAgICAgICAgIHZhbHVlID0gX3Byb3BzLnZhbHVlLFxuICAgICAgICAgICAgICAgIG90aGVyID0gX3Byb3BzLm90aGVyLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuO1xuXG5cbiAgICAgICAgICAgIHZhciBwbHVyYWxDYXRlZ29yeSA9IGZvcm1hdFBsdXJhbCh2YWx1ZSwgdGhpcy5wcm9wcyk7XG4gICAgICAgICAgICB2YXIgZm9ybWF0dGVkUGx1cmFsID0gdGhpcy5wcm9wc1twbHVyYWxDYXRlZ29yeV0gfHwgb3RoZXI7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2hpbGRyZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW4oZm9ybWF0dGVkUGx1cmFsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgICAgICAgVGV4dCxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIGZvcm1hdHRlZFBsdXJhbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1dKTtcbiAgICByZXR1cm4gRm9ybWF0dGVkUGx1cmFsO1xufShSZWFjdC5Db21wb25lbnQpO1xuXG5Gb3JtYXR0ZWRQbHVyYWwuZGlzcGxheU5hbWUgPSAnRm9ybWF0dGVkUGx1cmFsJztcbkZvcm1hdHRlZFBsdXJhbC5jb250ZXh0VHlwZXMgPSB7XG4gICAgaW50bDogaW50bFNoYXBlXG59O1xuRm9ybWF0dGVkUGx1cmFsLmRlZmF1bHRQcm9wcyA9IHtcbiAgICBzdHlsZTogJ2NhcmRpbmFsJ1xufTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEZvcm1hdHRlZFBsdXJhbC5wcm9wVHlwZXMgPSBfZXh0ZW5kcyh7fSwgcGx1cmFsRm9ybWF0UHJvcFR5cGVzLCB7XG4gICAgdmFsdWU6IFByb3BUeXBlcy5hbnkuaXNSZXF1aXJlZCxcblxuICAgIG90aGVyOiBQcm9wVHlwZXMubm9kZS5pc1JlcXVpcmVkLFxuICAgIHplcm86IFByb3BUeXBlcy5ub2RlLFxuICAgIG9uZTogUHJvcFR5cGVzLm5vZGUsXG4gICAgdHdvOiBQcm9wVHlwZXMubm9kZSxcbiAgICBmZXc6IFByb3BUeXBlcy5ub2RlLFxuICAgIG1hbnk6IFByb3BUeXBlcy5ub2RlLFxuXG4gICAgY2hpbGRyZW46IFByb3BUeXBlcy5mdW5jXG59KSA6IHZvaWQgMDtcblxuLypcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG4gKiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbnZhciBGb3JtYXR0ZWRNZXNzYWdlID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICBpbmhlcml0cyhGb3JtYXR0ZWRNZXNzYWdlLCBfQ29tcG9uZW50KTtcblxuICAgIGZ1bmN0aW9uIEZvcm1hdHRlZE1lc3NhZ2UocHJvcHMsIGNvbnRleHQpIHtcbiAgICAgICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRm9ybWF0dGVkTWVzc2FnZSk7XG5cbiAgICAgICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoRm9ybWF0dGVkTWVzc2FnZS5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKEZvcm1hdHRlZE1lc3NhZ2UpKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICAgICAgaW52YXJpYW50SW50bENvbnRleHQoY29udGV4dCk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG5cbiAgICBjcmVhdGVDbGFzcyhGb3JtYXR0ZWRNZXNzYWdlLCBbe1xuICAgICAgICBrZXk6ICdzaG91bGRDb21wb25lbnRVcGRhdGUnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcykge1xuICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMucHJvcHMudmFsdWVzO1xuICAgICAgICAgICAgdmFyIG5leHRWYWx1ZXMgPSBuZXh0UHJvcHMudmFsdWVzO1xuXG5cbiAgICAgICAgICAgIGlmICghc2hhbGxvd0VxdWFscyhuZXh0VmFsdWVzLCB2YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNpbmNlIGB2YWx1ZXNgIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCwgd2Uga25vdyB0aGV5J3JlIG5vdFxuICAgICAgICAgICAgLy8gZGlmZmVyZW50LCBzbyB0aGUgY3VycmVudCBgdmFsdWVzYCBhcmUgY2FycmllZCBvdmVyIHNvIHRoZSBzaGFsbG93XG4gICAgICAgICAgICAvLyBlcXVhbHMgY29tcGFyaXNvbiBvbiB0aGUgb3RoZXIgcHJvcHMgaXNuJ3QgYWZmZWN0ZWQgYnkgdGhlIGB2YWx1ZXNgLlxuICAgICAgICAgICAgdmFyIG5leHRQcm9wc1RvQ2hlY2sgPSBfZXh0ZW5kcyh7fSwgbmV4dFByb3BzLCB7XG4gICAgICAgICAgICAgICAgdmFsdWVzOiB2YWx1ZXNcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbmV4dCA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgICAgICBuZXh0W19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHNob3VsZEludGxDb21wb25lbnRVcGRhdGUuYXBwbHkodW5kZWZpbmVkLCBbdGhpcywgbmV4dFByb3BzVG9DaGVja10uY29uY2F0KG5leHQpKTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAncmVuZGVyJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgICAgIHZhciBfY29udGV4dCRpbnRsID0gdGhpcy5jb250ZXh0LmludGwsXG4gICAgICAgICAgICAgICAgZm9ybWF0TWVzc2FnZSA9IF9jb250ZXh0JGludGwuZm9ybWF0TWVzc2FnZSxcbiAgICAgICAgICAgICAgICBUZXh0ID0gX2NvbnRleHQkaW50bC50ZXh0Q29tcG9uZW50O1xuICAgICAgICAgICAgdmFyIF9wcm9wcyA9IHRoaXMucHJvcHMsXG4gICAgICAgICAgICAgICAgaWQgPSBfcHJvcHMuaWQsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBfcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2UgPSBfcHJvcHMuZGVmYXVsdE1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgdmFsdWVzID0gX3Byb3BzLnZhbHVlcyxcbiAgICAgICAgICAgICAgICBfcHJvcHMkdGFnTmFtZSA9IF9wcm9wcy50YWdOYW1lLFxuICAgICAgICAgICAgICAgIENvbXBvbmVudCQkMSA9IF9wcm9wcyR0YWdOYW1lID09PSB1bmRlZmluZWQgPyBUZXh0IDogX3Byb3BzJHRhZ05hbWUsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBfcHJvcHMuY2hpbGRyZW47XG5cblxuICAgICAgICAgICAgdmFyIHRva2VuRGVsaW1pdGVyID0gdm9pZCAwO1xuICAgICAgICAgICAgdmFyIHRva2VuaXplZFZhbHVlcyA9IHZvaWQgMDtcbiAgICAgICAgICAgIHZhciBlbGVtZW50cyA9IHZvaWQgMDtcblxuICAgICAgICAgICAgdmFyIGhhc1ZhbHVlcyA9IHZhbHVlcyAmJiBPYmplY3Qua2V5cyh2YWx1ZXMpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICBpZiAoaGFzVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgLy8gQ3JlYXRlcyBhIHRva2VuIHdpdGggYSByYW5kb20gVUlEIHRoYXQgc2hvdWxkIG5vdCBiZSBndWVzc2FibGUgb3JcbiAgICAgICAgICAgICAgICAvLyBjb25mbGljdCB3aXRoIG90aGVyIHBhcnRzIG9mIHRoZSBgbWVzc2FnZWAgc3RyaW5nLlxuICAgICAgICAgICAgICAgIHZhciB1aWQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAwMDAwKS50b1N0cmluZygxNik7XG5cbiAgICAgICAgICAgICAgICB2YXIgZ2VuZXJhdGVUb2tlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNvdW50ZXIgPSAwO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdFTEVNRU5ULScgKyB1aWQgKyAnLScgKyAoY291bnRlciArPSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KCk7XG5cbiAgICAgICAgICAgICAgICAvLyBTcGxpdHRpbmcgd2l0aCBhIGRlbGltaXRlciB0byBzdXBwb3J0IElFOC4gV2hlbiB1c2luZyBhIHJlZ2V4XG4gICAgICAgICAgICAgICAgLy8gd2l0aCBhIGNhcHR1cmUgZ3JvdXAgSUU4IGRvZXMgbm90IGluY2x1ZGUgdGhlIGNhcHR1cmUgZ3JvdXAgaW5cbiAgICAgICAgICAgICAgICAvLyB0aGUgcmVzdWx0aW5nIGFycmF5LlxuICAgICAgICAgICAgICAgIHRva2VuRGVsaW1pdGVyID0gJ0BfXycgKyB1aWQgKyAnX19AJztcbiAgICAgICAgICAgICAgICB0b2tlbml6ZWRWYWx1ZXMgPSB7fTtcbiAgICAgICAgICAgICAgICBlbGVtZW50cyA9IHt9O1xuXG4gICAgICAgICAgICAgICAgLy8gSXRlcmF0ZXMgb3ZlciB0aGUgYHByb3BzYCB0byBrZWVwIHRyYWNrIG9mIGFueSBSZWFjdCBFbGVtZW50XG4gICAgICAgICAgICAgICAgLy8gdmFsdWVzIHNvIHRoZXkgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IHRoZSBgdG9rZW5gIGFzIGEgcGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBgbWVzc2FnZWAgaXMgZm9ybWF0dGVkLiBUaGlzIGFsbG93cyB0aGUgZm9ybWF0dGVkXG4gICAgICAgICAgICAgICAgLy8gbWVzc2FnZSB0byB0aGVuIGJlIGJyb2tlbi11cCBpbnRvIHBhcnRzIHdpdGggcmVmZXJlbmNlcyB0byB0aGVcbiAgICAgICAgICAgICAgICAvLyBSZWFjdCBFbGVtZW50cyBpbnNlcnRlZCBiYWNrIGluLlxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlcykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNbbmFtZV07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFJlYWN0LmlzVmFsaWRFbGVtZW50KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VuID0gZ2VuZXJhdGVUb2tlbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5pemVkVmFsdWVzW25hbWVdID0gdG9rZW5EZWxpbWl0ZXIgKyB0b2tlbiArIHRva2VuRGVsaW1pdGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHNbdG9rZW5dID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZWRWYWx1ZXNbbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHsgaWQ6IGlkLCBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sIGRlZmF1bHRNZXNzYWdlOiBkZWZhdWx0TWVzc2FnZSB9O1xuICAgICAgICAgICAgdmFyIGZvcm1hdHRlZE1lc3NhZ2UgPSBmb3JtYXRNZXNzYWdlKGRlc2NyaXB0b3IsIHRva2VuaXplZFZhbHVlcyB8fCB2YWx1ZXMpO1xuXG4gICAgICAgICAgICB2YXIgbm9kZXMgPSB2b2lkIDA7XG5cbiAgICAgICAgICAgIHZhciBoYXNFbGVtZW50cyA9IGVsZW1lbnRzICYmIE9iamVjdC5rZXlzKGVsZW1lbnRzKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgaWYgKGhhc0VsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgLy8gU3BsaXQgdGhlIG1lc3NhZ2UgaW50byBwYXJ0cyBzbyB0aGUgUmVhY3QgRWxlbWVudCB2YWx1ZXMgY2FwdHVyZWRcbiAgICAgICAgICAgICAgICAvLyBhYm92ZSBjYW4gYmUgaW5zZXJ0ZWQgYmFjayBpbnRvIHRoZSByZW5kZXJlZCBtZXNzYWdlLiBUaGlzXG4gICAgICAgICAgICAgICAgLy8gYXBwcm9hY2ggYWxsb3dzIG1lc3NhZ2VzIHRvIHJlbmRlciB3aXRoIFJlYWN0IEVsZW1lbnRzIHdoaWxlXG4gICAgICAgICAgICAgICAgLy8ga2VlcGluZyBSZWFjdCdzIHZpcnR1YWwgZGlmZmluZyB3b3JraW5nIHByb3Blcmx5LlxuICAgICAgICAgICAgICAgIG5vZGVzID0gZm9ybWF0dGVkTWVzc2FnZS5zcGxpdCh0b2tlbkRlbGltaXRlcikuZmlsdGVyKGZ1bmN0aW9uIChwYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhIXBhcnQ7XG4gICAgICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChwYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50c1twYXJ0XSB8fCBwYXJ0O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlcyA9IFtmb3JtYXR0ZWRNZXNzYWdlXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbi5hcHBseSh1bmRlZmluZWQsIHRvQ29uc3VtYWJsZUFycmF5KG5vZGVzKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE5lZWRzIHRvIHVzZSBgY3JlYXRlRWxlbWVudCgpYCBpbnN0ZWFkIG9mIEpTWCwgb3RoZXJ3aXNlIFJlYWN0IHdpbGxcbiAgICAgICAgICAgIC8vIHdhcm4gYWJvdXQgYSBtaXNzaW5nIGBrZXlgIHByb3Agd2l0aCByaWNoLXRleHQgbWVzc2FnZSBmb3JtYXR0aW5nLlxuICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQuYXBwbHkodW5kZWZpbmVkLCBbQ29tcG9uZW50JCQxLCBudWxsXS5jb25jYXQodG9Db25zdW1hYmxlQXJyYXkobm9kZXMpKSk7XG4gICAgICAgIH1cbiAgICB9XSk7XG4gICAgcmV0dXJuIEZvcm1hdHRlZE1lc3NhZ2U7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbkZvcm1hdHRlZE1lc3NhZ2UuZGlzcGxheU5hbWUgPSAnRm9ybWF0dGVkTWVzc2FnZSc7XG5Gb3JtYXR0ZWRNZXNzYWdlLmNvbnRleHRUeXBlcyA9IHtcbiAgICBpbnRsOiBpbnRsU2hhcGVcbn07XG5Gb3JtYXR0ZWRNZXNzYWdlLmRlZmF1bHRQcm9wcyA9IHtcbiAgICB2YWx1ZXM6IHt9XG59O1xucHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gRm9ybWF0dGVkTWVzc2FnZS5wcm9wVHlwZXMgPSBfZXh0ZW5kcyh7fSwgbWVzc2FnZURlc2NyaXB0b3JQcm9wVHlwZXMsIHtcbiAgICB2YWx1ZXM6IFByb3BUeXBlcy5vYmplY3QsXG4gICAgdGFnTmFtZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjaGlsZHJlbjogUHJvcFR5cGVzLmZ1bmNcbn0pIDogdm9pZCAwO1xuXG4vKlxuICogQ29weXJpZ2h0IDIwMTUsIFlhaG9vIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgTGljZW5zZS5cbiAqIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cblxudmFyIEZvcm1hdHRlZEhUTUxNZXNzYWdlID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICBpbmhlcml0cyhGb3JtYXR0ZWRIVE1MTWVzc2FnZSwgX0NvbXBvbmVudCk7XG5cbiAgICBmdW5jdGlvbiBGb3JtYXR0ZWRIVE1MTWVzc2FnZShwcm9wcywgY29udGV4dCkge1xuICAgICAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBGb3JtYXR0ZWRIVE1MTWVzc2FnZSk7XG5cbiAgICAgICAgdmFyIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoRm9ybWF0dGVkSFRNTE1lc3NhZ2UuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihGb3JtYXR0ZWRIVE1MTWVzc2FnZSkpLmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgICAgICBpbnZhcmlhbnRJbnRsQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIGNyZWF0ZUNsYXNzKEZvcm1hdHRlZEhUTUxNZXNzYWdlLCBbe1xuICAgICAgICBrZXk6ICdzaG91bGRDb21wb25lbnRVcGRhdGUnLFxuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wcykge1xuICAgICAgICAgICAgdmFyIHZhbHVlcyA9IHRoaXMucHJvcHMudmFsdWVzO1xuICAgICAgICAgICAgdmFyIG5leHRWYWx1ZXMgPSBuZXh0UHJvcHMudmFsdWVzO1xuXG5cbiAgICAgICAgICAgIGlmICghc2hhbGxvd0VxdWFscyhuZXh0VmFsdWVzLCB2YWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNpbmNlIGB2YWx1ZXNgIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCwgd2Uga25vdyB0aGV5J3JlIG5vdFxuICAgICAgICAgICAgLy8gZGlmZmVyZW50LCBzbyB0aGUgY3VycmVudCBgdmFsdWVzYCBhcmUgY2FycmllZCBvdmVyIHNvIHRoZSBzaGFsbG93XG4gICAgICAgICAgICAvLyBlcXVhbHMgY29tcGFyaXNvbiBvbiB0aGUgb3RoZXIgcHJvcHMgaXNuJ3QgYWZmZWN0ZWQgYnkgdGhlIGB2YWx1ZXNgLlxuICAgICAgICAgICAgdmFyIG5leHRQcm9wc1RvQ2hlY2sgPSBfZXh0ZW5kcyh7fSwgbmV4dFByb3BzLCB7XG4gICAgICAgICAgICAgICAgdmFsdWVzOiB2YWx1ZXNcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbmV4dCA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgICAgICAgICBuZXh0W19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHNob3VsZEludGxDb21wb25lbnRVcGRhdGUuYXBwbHkodW5kZWZpbmVkLCBbdGhpcywgbmV4dFByb3BzVG9DaGVja10uY29uY2F0KG5leHQpKTtcbiAgICAgICAgfVxuICAgIH0sIHtcbiAgICAgICAga2V5OiAncmVuZGVyJyxcbiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgICAgIHZhciBfY29udGV4dCRpbnRsID0gdGhpcy5jb250ZXh0LmludGwsXG4gICAgICAgICAgICAgICAgZm9ybWF0SFRNTE1lc3NhZ2UgPSBfY29udGV4dCRpbnRsLmZvcm1hdEhUTUxNZXNzYWdlLFxuICAgICAgICAgICAgICAgIFRleHQgPSBfY29udGV4dCRpbnRsLnRleHRDb21wb25lbnQ7XG4gICAgICAgICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcyxcbiAgICAgICAgICAgICAgICBpZCA9IF9wcm9wcy5pZCxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IF9wcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICBkZWZhdWx0TWVzc2FnZSA9IF9wcm9wcy5kZWZhdWx0TWVzc2FnZSxcbiAgICAgICAgICAgICAgICByYXdWYWx1ZXMgPSBfcHJvcHMudmFsdWVzLFxuICAgICAgICAgICAgICAgIF9wcm9wcyR0YWdOYW1lID0gX3Byb3BzLnRhZ05hbWUsXG4gICAgICAgICAgICAgICAgQ29tcG9uZW50JCQxID0gX3Byb3BzJHRhZ05hbWUgPT09IHVuZGVmaW5lZCA/IFRleHQgOiBfcHJvcHMkdGFnTmFtZSxcbiAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbjtcblxuXG4gICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHsgaWQ6IGlkLCBkZXNjcmlwdGlvbjogZGVzY3JpcHRpb24sIGRlZmF1bHRNZXNzYWdlOiBkZWZhdWx0TWVzc2FnZSB9O1xuICAgICAgICAgICAgdmFyIGZvcm1hdHRlZEhUTUxNZXNzYWdlID0gZm9ybWF0SFRNTE1lc3NhZ2UoZGVzY3JpcHRvciwgcmF3VmFsdWVzKTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBjaGlsZHJlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbihmb3JtYXR0ZWRIVE1MTWVzc2FnZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBtZXNzYWdlIHByZXN1bWFibHkgaGFzIEhUTUwgaW4gaXQsIHdlIG5lZWQgdG8gc2V0XG4gICAgICAgICAgICAvLyBgaW5uZXJIVE1MYCBpbiBvcmRlciBmb3IgaXQgdG8gYmUgcmVuZGVyZWQgYW5kIG5vdCBlc2NhcGVkIGJ5IFJlYWN0LlxuICAgICAgICAgICAgLy8gVG8gYmUgc2FmZSwgYWxsIHN0cmluZyBwcm9wIHZhbHVlcyB3ZXJlIGVzY2FwZWQgd2hlbiBmb3JtYXR0aW5nIHRoZVxuICAgICAgICAgICAgLy8gbWVzc2FnZS4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBtZXNzYWdlIGlzIG5vdCBVR0MsIGFuZCBjYW1lIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBkZXZlbG9wZXIgbWFraW5nIGl0IG1vcmUgbGlrZSBhIHRlbXBsYXRlLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE5vdGU6IFRoZXJlJ3MgYSBwZXJmIGltcGFjdCBvZiB1c2luZyB0aGlzIGNvbXBvbmVudCBzaW5jZSB0aGVyZSdzIG5vXG4gICAgICAgICAgICAvLyB3YXkgZm9yIFJlYWN0IHRvIGRvIGl0cyB2aXJ0dWFsIERPTSBkaWZmaW5nLlxuICAgICAgICAgICAgdmFyIGh0bWwgPSB7IF9faHRtbDogZm9ybWF0dGVkSFRNTE1lc3NhZ2UgfTtcbiAgICAgICAgICAgIHJldHVybiBSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KENvbXBvbmVudCQkMSwgeyBkYW5nZXJvdXNseVNldElubmVySFRNTDogaHRtbCB9KTtcbiAgICAgICAgfVxuICAgIH1dKTtcbiAgICByZXR1cm4gRm9ybWF0dGVkSFRNTE1lc3NhZ2U7XG59KFJlYWN0LkNvbXBvbmVudCk7XG5cbkZvcm1hdHRlZEhUTUxNZXNzYWdlLmRpc3BsYXlOYW1lID0gJ0Zvcm1hdHRlZEhUTUxNZXNzYWdlJztcbkZvcm1hdHRlZEhUTUxNZXNzYWdlLmNvbnRleHRUeXBlcyA9IHtcbiAgICBpbnRsOiBpbnRsU2hhcGVcbn07XG5Gb3JtYXR0ZWRIVE1MTWVzc2FnZS5kZWZhdWx0UHJvcHMgPSB7XG4gICAgdmFsdWVzOiB7fVxufTtcbnByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IEZvcm1hdHRlZEhUTUxNZXNzYWdlLnByb3BUeXBlcyA9IF9leHRlbmRzKHt9LCBtZXNzYWdlRGVzY3JpcHRvclByb3BUeXBlcywge1xuICAgIHZhbHVlczogUHJvcFR5cGVzLm9iamVjdCxcbiAgICB0YWdOYW1lOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgIGNoaWxkcmVuOiBQcm9wVHlwZXMuZnVuY1xufSkgOiB2b2lkIDA7XG5cbi8qXG4gKiBDb3B5cmlnaHQgMjAxNSwgWWFob28gSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBMaWNlbnNlLlxuICogU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuXG5hZGRMb2NhbGVEYXRhKGRlZmF1bHRMb2NhbGVEYXRhKTtcblxuLypcbiAqIENvcHlyaWdodCAyMDE1LCBZYWhvbyBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIExpY2Vuc2UuXG4gKiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5cbmFkZExvY2FsZURhdGEoYWxsTG9jYWxlRGF0YSk7XG5cbmV4cG9ydHMuYWRkTG9jYWxlRGF0YSA9IGFkZExvY2FsZURhdGE7XG5leHBvcnRzLmludGxTaGFwZSA9IGludGxTaGFwZTtcbmV4cG9ydHMuaW5qZWN0SW50bCA9IGluamVjdEludGw7XG5leHBvcnRzLmRlZmluZU1lc3NhZ2VzID0gZGVmaW5lTWVzc2FnZXM7XG5leHBvcnRzLkludGxQcm92aWRlciA9IEludGxQcm92aWRlcjtcbmV4cG9ydHMuRm9ybWF0dGVkRGF0ZSA9IEZvcm1hdHRlZERhdGU7XG5leHBvcnRzLkZvcm1hdHRlZFRpbWUgPSBGb3JtYXR0ZWRUaW1lO1xuZXhwb3J0cy5Gb3JtYXR0ZWRSZWxhdGl2ZSA9IEZvcm1hdHRlZFJlbGF0aXZlO1xuZXhwb3J0cy5Gb3JtYXR0ZWROdW1iZXIgPSBGb3JtYXR0ZWROdW1iZXI7XG5leHBvcnRzLkZvcm1hdHRlZFBsdXJhbCA9IEZvcm1hdHRlZFBsdXJhbDtcbmV4cG9ydHMuRm9ybWF0dGVkTWVzc2FnZSA9IEZvcm1hdHRlZE1lc3NhZ2U7XG5leHBvcnRzLkZvcm1hdHRlZEhUTUxNZXNzYWdlID0gRm9ybWF0dGVkSFRNTE1lc3NhZ2U7XG4iLCIhZnVuY3Rpb24oZSxhKXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1hKCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShhKTooZS5SZWFjdEludGxMb2NhbGVEYXRhPWUuUmVhY3RJbnRsTG9jYWxlRGF0YXx8e30sZS5SZWFjdEludGxMb2NhbGVEYXRhLmVuPWEoKSl9KHRoaXMsZnVuY3Rpb24oKXtcInVzZSBzdHJpY3RcIjt2YXIgZT1be2xvY2FsZTpcImVuXCIscGx1cmFsUnVsZUZ1bmN0aW9uOmZ1bmN0aW9uKGUsYSl7dmFyIG49U3RyaW5nKGUpLnNwbGl0KFwiLlwiKSxsPSFuWzFdLG89TnVtYmVyKG5bMF0pPT1lLHQ9byYmblswXS5zbGljZSgtMSkscj1vJiZuWzBdLnNsaWNlKC0yKTtyZXR1cm4gYT8xPT10JiYxMSE9cj9cIm9uZVwiOjI9PXQmJjEyIT1yP1widHdvXCI6Mz09dCYmMTMhPXI/XCJmZXdcIjpcIm90aGVyXCI6MT09ZSYmbD9cIm9uZVwiOlwib3RoZXJcIn0sZmllbGRzOnt5ZWFyOntkaXNwbGF5TmFtZTpcInllYXJcIixyZWxhdGl2ZTp7MDpcInRoaXMgeWVhclwiLDE6XCJuZXh0IHllYXJcIixcIi0xXCI6XCJsYXN0IHllYXJcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImluIHswfSB5ZWFyXCIsb3RoZXI6XCJpbiB7MH0geWVhcnNcIn0scGFzdDp7b25lOlwiezB9IHllYXIgYWdvXCIsb3RoZXI6XCJ7MH0geWVhcnMgYWdvXCJ9fX0sbW9udGg6e2Rpc3BsYXlOYW1lOlwibW9udGhcIixyZWxhdGl2ZTp7MDpcInRoaXMgbW9udGhcIiwxOlwibmV4dCBtb250aFwiLFwiLTFcIjpcImxhc3QgbW9udGhcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImluIHswfSBtb250aFwiLG90aGVyOlwiaW4gezB9IG1vbnRoc1wifSxwYXN0OntvbmU6XCJ7MH0gbW9udGggYWdvXCIsb3RoZXI6XCJ7MH0gbW9udGhzIGFnb1wifX19LGRheTp7ZGlzcGxheU5hbWU6XCJkYXlcIixyZWxhdGl2ZTp7MDpcInRvZGF5XCIsMTpcInRvbW9ycm93XCIsXCItMVwiOlwieWVzdGVyZGF5XCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJpbiB7MH0gZGF5XCIsb3RoZXI6XCJpbiB7MH0gZGF5c1wifSxwYXN0OntvbmU6XCJ7MH0gZGF5IGFnb1wiLG90aGVyOlwiezB9IGRheXMgYWdvXCJ9fX0saG91cjp7ZGlzcGxheU5hbWU6XCJob3VyXCIscmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImluIHswfSBob3VyXCIsb3RoZXI6XCJpbiB7MH0gaG91cnNcIn0scGFzdDp7b25lOlwiezB9IGhvdXIgYWdvXCIsb3RoZXI6XCJ7MH0gaG91cnMgYWdvXCJ9fX0sbWludXRlOntkaXNwbGF5TmFtZTpcIm1pbnV0ZVwiLHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJpbiB7MH0gbWludXRlXCIsb3RoZXI6XCJpbiB7MH0gbWludXRlc1wifSxwYXN0OntvbmU6XCJ7MH0gbWludXRlIGFnb1wiLG90aGVyOlwiezB9IG1pbnV0ZXMgYWdvXCJ9fX0sc2Vjb25kOntkaXNwbGF5TmFtZTpcInNlY29uZFwiLHJlbGF0aXZlOnswOlwibm93XCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJpbiB7MH0gc2Vjb25kXCIsb3RoZXI6XCJpbiB7MH0gc2Vjb25kc1wifSxwYXN0OntvbmU6XCJ7MH0gc2Vjb25kIGFnb1wiLG90aGVyOlwiezB9IHNlY29uZHMgYWdvXCJ9fX19fSx7bG9jYWxlOlwiZW4tMDAxXCIscGFyZW50TG9jYWxlOlwiZW5cIn0se2xvY2FsZTpcImVuLTE1MFwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tQUdcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUFJXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1BU1wiLHBhcmVudExvY2FsZTpcImVuXCJ9LHtsb2NhbGU6XCJlbi1BVFwiLHBhcmVudExvY2FsZTpcImVuLTE1MFwifSx7bG9jYWxlOlwiZW4tQVVcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUJCXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1CRVwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tQklcIixwYXJlbnRMb2NhbGU6XCJlblwifSx7bG9jYWxlOlwiZW4tQk1cIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUJTXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1CV1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tQlpcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUNBXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1DQ1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tQ0hcIixwYXJlbnRMb2NhbGU6XCJlbi0xNTBcIn0se2xvY2FsZTpcImVuLUNLXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1DTVwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tQ1hcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUNZXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1ERVwiLHBhcmVudExvY2FsZTpcImVuLTE1MFwifSx7bG9jYWxlOlwiZW4tREdcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLURLXCIscGFyZW50TG9jYWxlOlwiZW4tMTUwXCJ9LHtsb2NhbGU6XCJlbi1ETVwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tRHNydFwiLHBsdXJhbFJ1bGVGdW5jdGlvbjpmdW5jdGlvbihlLGEpe3JldHVyblwib3RoZXJcIn0sZmllbGRzOnt5ZWFyOntkaXNwbGF5TmFtZTpcIlllYXJcIixyZWxhdGl2ZTp7MDpcInRoaXMgeWVhclwiLDE6XCJuZXh0IHllYXJcIixcIi0xXCI6XCJsYXN0IHllYXJcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e290aGVyOlwiK3swfSB5XCJ9LHBhc3Q6e290aGVyOlwiLXswfSB5XCJ9fX0sbW9udGg6e2Rpc3BsYXlOYW1lOlwiTW9udGhcIixyZWxhdGl2ZTp7MDpcInRoaXMgbW9udGhcIiwxOlwibmV4dCBtb250aFwiLFwiLTFcIjpcImxhc3QgbW9udGhcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e290aGVyOlwiK3swfSBtXCJ9LHBhc3Q6e290aGVyOlwiLXswfSBtXCJ9fX0sZGF5OntkaXNwbGF5TmFtZTpcIkRheVwiLHJlbGF0aXZlOnswOlwidG9kYXlcIiwxOlwidG9tb3Jyb3dcIixcIi0xXCI6XCJ5ZXN0ZXJkYXlcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e290aGVyOlwiK3swfSBkXCJ9LHBhc3Q6e290aGVyOlwiLXswfSBkXCJ9fX0saG91cjp7ZGlzcGxheU5hbWU6XCJIb3VyXCIscmVsYXRpdmVUaW1lOntmdXR1cmU6e290aGVyOlwiK3swfSBoXCJ9LHBhc3Q6e290aGVyOlwiLXswfSBoXCJ9fX0sbWludXRlOntkaXNwbGF5TmFtZTpcIk1pbnV0ZVwiLHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvdGhlcjpcIit7MH0gbWluXCJ9LHBhc3Q6e290aGVyOlwiLXswfSBtaW5cIn19fSxzZWNvbmQ6e2Rpc3BsYXlOYW1lOlwiU2Vjb25kXCIscmVsYXRpdmU6ezA6XCJub3dcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e290aGVyOlwiK3swfSBzXCJ9LHBhc3Q6e290aGVyOlwiLXswfSBzXCJ9fX19fSx7bG9jYWxlOlwiZW4tRVJcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUZJXCIscGFyZW50TG9jYWxlOlwiZW4tMTUwXCJ9LHtsb2NhbGU6XCJlbi1GSlwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tRktcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUZNXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1HQlwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tR0RcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUdHXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1HSFwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tR0lcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUdNXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1HVVwiLHBhcmVudExvY2FsZTpcImVuXCJ9LHtsb2NhbGU6XCJlbi1HWVwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tSEtcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUlFXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1JTFwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tSU1cIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUlOXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1JT1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tSkVcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUpNXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1LRVwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tS0lcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUtOXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1LWVwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tTENcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLUxSXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1MU1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tTUdcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLU1IXCIscGFyZW50TG9jYWxlOlwiZW5cIn0se2xvY2FsZTpcImVuLU1PXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1NUFwiLHBhcmVudExvY2FsZTpcImVuXCJ9LHtsb2NhbGU6XCJlbi1NU1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tTVRcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLU1VXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1NV1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tTVlcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLU5BXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1ORlwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tTkdcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLU5MXCIscGFyZW50TG9jYWxlOlwiZW4tMTUwXCJ9LHtsb2NhbGU6XCJlbi1OUlwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tTlVcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLU5aXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1QR1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tUEhcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLVBLXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1QTlwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tUFJcIixwYXJlbnRMb2NhbGU6XCJlblwifSx7bG9jYWxlOlwiZW4tUFdcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLVJXXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1TQlwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tU0NcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLVNEXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1TRVwiLHBhcmVudExvY2FsZTpcImVuLTE1MFwifSx7bG9jYWxlOlwiZW4tU0dcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLVNIXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1TSVwiLHBhcmVudExvY2FsZTpcImVuLTE1MFwifSx7bG9jYWxlOlwiZW4tU0xcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLVNTXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1TWFwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tU1pcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLVNoYXdcIixwbHVyYWxSdWxlRnVuY3Rpb246ZnVuY3Rpb24oZSxhKXtyZXR1cm5cIm90aGVyXCJ9LGZpZWxkczp7eWVhcjp7ZGlzcGxheU5hbWU6XCJZZWFyXCIscmVsYXRpdmU6ezA6XCJ0aGlzIHllYXJcIiwxOlwibmV4dCB5ZWFyXCIsXCItMVwiOlwibGFzdCB5ZWFyXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvdGhlcjpcIit7MH0geVwifSxwYXN0OntvdGhlcjpcIi17MH0geVwifX19LG1vbnRoOntkaXNwbGF5TmFtZTpcIk1vbnRoXCIscmVsYXRpdmU6ezA6XCJ0aGlzIG1vbnRoXCIsMTpcIm5leHQgbW9udGhcIixcIi0xXCI6XCJsYXN0IG1vbnRoXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvdGhlcjpcIit7MH0gbVwifSxwYXN0OntvdGhlcjpcIi17MH0gbVwifX19LGRheTp7ZGlzcGxheU5hbWU6XCJEYXlcIixyZWxhdGl2ZTp7MDpcInRvZGF5XCIsMTpcInRvbW9ycm93XCIsXCItMVwiOlwieWVzdGVyZGF5XCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvdGhlcjpcIit7MH0gZFwifSxwYXN0OntvdGhlcjpcIi17MH0gZFwifX19LGhvdXI6e2Rpc3BsYXlOYW1lOlwiSG91clwiLHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvdGhlcjpcIit7MH0gaFwifSxwYXN0OntvdGhlcjpcIi17MH0gaFwifX19LG1pbnV0ZTp7ZGlzcGxheU5hbWU6XCJNaW51dGVcIixyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b3RoZXI6XCIrezB9IG1pblwifSxwYXN0OntvdGhlcjpcIi17MH0gbWluXCJ9fX0sc2Vjb25kOntkaXNwbGF5TmFtZTpcIlNlY29uZFwiLHJlbGF0aXZlOnswOlwibm93XCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvdGhlcjpcIit7MH0gc1wifSxwYXN0OntvdGhlcjpcIi17MH0gc1wifX19fX0se2xvY2FsZTpcImVuLVRDXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1US1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tVE9cIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLVRUXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1UVlwiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tVFpcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLVVHXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1VTVwiLHBhcmVudExvY2FsZTpcImVuXCJ9LHtsb2NhbGU6XCJlbi1VU1wiLHBhcmVudExvY2FsZTpcImVuXCJ9LHtsb2NhbGU6XCJlbi1WQ1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tVkdcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLVZJXCIscGFyZW50TG9jYWxlOlwiZW5cIn0se2xvY2FsZTpcImVuLVZVXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1XU1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifSx7bG9jYWxlOlwiZW4tWkFcIixwYXJlbnRMb2NhbGU6XCJlbi0wMDFcIn0se2xvY2FsZTpcImVuLVpNXCIscGFyZW50TG9jYWxlOlwiZW4tMDAxXCJ9LHtsb2NhbGU6XCJlbi1aV1wiLHBhcmVudExvY2FsZTpcImVuLTAwMVwifV07cmV0dXJuIGV9KTtcbiIsIiFmdW5jdGlvbihlLGEpe1wib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPWEoKTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKGEpOihlLlJlYWN0SW50bExvY2FsZURhdGE9ZS5SZWFjdEludGxMb2NhbGVEYXRhfHx7fSxlLlJlYWN0SW50bExvY2FsZURhdGEuZXM9YSgpKX0odGhpcyxmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBlPVt7bG9jYWxlOlwiZXNcIixwbHVyYWxSdWxlRnVuY3Rpb246ZnVuY3Rpb24oZSxhKXtyZXR1cm4gYT9cIm90aGVyXCI6MT09ZT9cIm9uZVwiOlwib3RoZXJcIn0sZmllbGRzOnt5ZWFyOntkaXNwbGF5TmFtZTpcImHDsW9cIixyZWxhdGl2ZTp7MDpcImVzdGUgYcOxb1wiLDE6XCJlbCBwcsOzeGltbyBhw7FvXCIsXCItMVwiOlwiZWwgYcOxbyBwYXNhZG9cIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gYcOxb1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBhw7Fvc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBhw7FvXCIsb3RoZXI6XCJoYWNlIHswfSBhw7Fvc1wifX19LG1vbnRoOntkaXNwbGF5TmFtZTpcIm1lc1wiLHJlbGF0aXZlOnswOlwiZXN0ZSBtZXNcIiwxOlwiZWwgcHLDs3hpbW8gbWVzXCIsXCItMVwiOlwiZWwgbWVzIHBhc2Fkb1wifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBtZXNcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gbWVzZXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gbWVzXCIsb3RoZXI6XCJoYWNlIHswfSBtZXNlc1wifX19LGRheTp7ZGlzcGxheU5hbWU6XCJkw61hXCIscmVsYXRpdmU6ezA6XCJob3lcIiwxOlwibWHDsWFuYVwiLDI6XCJwYXNhZG8gbWHDsWFuYVwiLFwiLTJcIjpcImFudGVheWVyXCIsXCItMVwiOlwiYXllclwifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBkw61hXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IGTDrWFzXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IGTDrWFcIixvdGhlcjpcImhhY2UgezB9IGTDrWFzXCJ9fX0saG91cjp7ZGlzcGxheU5hbWU6XCJob3JhXCIscmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gaG9yYVwiLG90aGVyOlwiZGVudHJvIGRlIHswfSBob3Jhc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBob3JhXCIsb3RoZXI6XCJoYWNlIHswfSBob3Jhc1wifX19LG1pbnV0ZTp7ZGlzcGxheU5hbWU6XCJtaW51dG9cIixyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBtaW51dG9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gbWludXRvc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBtaW51dG9cIixvdGhlcjpcImhhY2UgezB9IG1pbnV0b3NcIn19fSxzZWNvbmQ6e2Rpc3BsYXlOYW1lOlwic2VndW5kb1wiLHJlbGF0aXZlOnswOlwiYWhvcmFcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gc2VndW5kb1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBzZWd1bmRvc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBzZWd1bmRvXCIsb3RoZXI6XCJoYWNlIHswfSBzZWd1bmRvc1wifX19fX0se2xvY2FsZTpcImVzLTQxOVwiLHBhcmVudExvY2FsZTpcImVzXCJ9LHtsb2NhbGU6XCJlcy1BUlwiLHBhcmVudExvY2FsZTpcImVzLTQxOVwifSx7bG9jYWxlOlwiZXMtQk9cIixwYXJlbnRMb2NhbGU6XCJlcy00MTlcIn0se2xvY2FsZTpcImVzLUNMXCIscGFyZW50TG9jYWxlOlwiZXMtNDE5XCJ9LHtsb2NhbGU6XCJlcy1DT1wiLHBhcmVudExvY2FsZTpcImVzLTQxOVwifSx7bG9jYWxlOlwiZXMtQ1JcIixwYXJlbnRMb2NhbGU6XCJlcy00MTlcIixmaWVsZHM6e3llYXI6e2Rpc3BsYXlOYW1lOlwiYcOxb1wiLHJlbGF0aXZlOnswOlwiZXN0ZSBhw7FvXCIsMTpcImVsIHByw7N4aW1vIGHDsW9cIixcIi0xXCI6XCJlbCBhw7FvIHBhc2Fkb1wifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBhw7FvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IGHDsW9zXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IGHDsW9cIixvdGhlcjpcImhhY2UgezB9IGHDsW9zXCJ9fX0sbW9udGg6e2Rpc3BsYXlOYW1lOlwibWVzXCIscmVsYXRpdmU6ezA6XCJlc3RlIG1lc1wiLDE6XCJlbCBwcsOzeGltbyBtZXNcIixcIi0xXCI6XCJlbCBtZXMgcGFzYWRvXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IG1lc1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBtZXNlc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBtZXNcIixvdGhlcjpcImhhY2UgezB9IG1lc2VzXCJ9fX0sZGF5OntkaXNwbGF5TmFtZTpcImTDrWFcIixyZWxhdGl2ZTp7MDpcImhveVwiLDE6XCJtYcOxYW5hXCIsMjpcInBhc2FkbyBtYcOxYW5hXCIsXCItMlwiOlwiYW50aWVyXCIsXCItMVwiOlwiYXllclwifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBkw61hXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IGTDrWFzXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IGTDrWFcIixvdGhlcjpcImhhY2UgezB9IGTDrWFzXCJ9fX0saG91cjp7ZGlzcGxheU5hbWU6XCJob3JhXCIscmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gaG9yYVwiLG90aGVyOlwiZGVudHJvIGRlIHswfSBob3Jhc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBob3JhXCIsb3RoZXI6XCJoYWNlIHswfSBob3Jhc1wifX19LG1pbnV0ZTp7ZGlzcGxheU5hbWU6XCJtaW51dG9cIixyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBtaW51dG9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gbWludXRvc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBtaW51dG9cIixvdGhlcjpcImhhY2UgezB9IG1pbnV0b3NcIn19fSxzZWNvbmQ6e2Rpc3BsYXlOYW1lOlwic2VndW5kb1wiLHJlbGF0aXZlOnswOlwiYWhvcmFcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gc2VndW5kb1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBzZWd1bmRvc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBzZWd1bmRvXCIsb3RoZXI6XCJoYWNlIHswfSBzZWd1bmRvc1wifX19fX0se2xvY2FsZTpcImVzLUNVXCIscGFyZW50TG9jYWxlOlwiZXMtNDE5XCJ9LHtsb2NhbGU6XCJlcy1ET1wiLHBhcmVudExvY2FsZTpcImVzLTQxOVwiLGZpZWxkczp7eWVhcjp7ZGlzcGxheU5hbWU6XCJBw7FvXCIscmVsYXRpdmU6ezA6XCJlc3RlIGHDsW9cIiwxOlwiZWwgcHLDs3hpbW8gYcOxb1wiLFwiLTFcIjpcImVsIGHDsW8gcGFzYWRvXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGHDsW9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gYcOxb3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gYcOxb1wiLG90aGVyOlwiaGFjZSB7MH0gYcOxb3NcIn19fSxtb250aDp7ZGlzcGxheU5hbWU6XCJNZXNcIixyZWxhdGl2ZTp7MDpcImVzdGUgbWVzXCIsMTpcImVsIHByw7N4aW1vIG1lc1wiLFwiLTFcIjpcImVsIG1lcyBwYXNhZG9cIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gbWVzXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IG1lc2VzXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IG1lc1wiLG90aGVyOlwiaGFjZSB7MH0gbWVzZXNcIn19fSxkYXk6e2Rpc3BsYXlOYW1lOlwiRMOtYVwiLHJlbGF0aXZlOnswOlwiaG95XCIsMTpcIm1hw7FhbmFcIiwyOlwicGFzYWRvIG1hw7FhbmFcIixcIi0yXCI6XCJhbnRlYXllclwiLFwiLTFcIjpcImF5ZXJcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gZMOtYVwiLG90aGVyOlwiZGVudHJvIGRlIHswfSBkw61hc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBkw61hXCIsb3RoZXI6XCJoYWNlIHswfSBkw61hc1wifX19LGhvdXI6e2Rpc3BsYXlOYW1lOlwiaG9yYVwiLHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGhvcmFcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gaG9yYXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gaG9yYVwiLG90aGVyOlwiaGFjZSB7MH0gaG9yYXNcIn19fSxtaW51dGU6e2Rpc3BsYXlOYW1lOlwiTWludXRvXCIscmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gbWludXRvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IG1pbnV0b3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gbWludXRvXCIsb3RoZXI6XCJoYWNlIHswfSBtaW51dG9zXCJ9fX0sc2Vjb25kOntkaXNwbGF5TmFtZTpcIlNlZ3VuZG9cIixyZWxhdGl2ZTp7MDpcImFob3JhXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IHNlZ3VuZG9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gc2VndW5kb3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gc2VndW5kb1wiLG90aGVyOlwiaGFjZSB7MH0gc2VndW5kb3NcIn19fX19LHtsb2NhbGU6XCJlcy1FQVwiLHBhcmVudExvY2FsZTpcImVzXCJ9LHtsb2NhbGU6XCJlcy1FQ1wiLHBhcmVudExvY2FsZTpcImVzLTQxOVwifSx7bG9jYWxlOlwiZXMtR1FcIixwYXJlbnRMb2NhbGU6XCJlc1wifSx7bG9jYWxlOlwiZXMtR1RcIixwYXJlbnRMb2NhbGU6XCJlcy00MTlcIixmaWVsZHM6e3llYXI6e2Rpc3BsYXlOYW1lOlwiYcOxb1wiLHJlbGF0aXZlOnswOlwiZXN0ZSBhw7FvXCIsMTpcImVsIHByw7N4aW1vIGHDsW9cIixcIi0xXCI6XCJlbCBhw7FvIHBhc2Fkb1wifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBhw7FvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IGHDsW9zXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IGHDsW9cIixvdGhlcjpcImhhY2UgezB9IGHDsW9zXCJ9fX0sbW9udGg6e2Rpc3BsYXlOYW1lOlwibWVzXCIscmVsYXRpdmU6ezA6XCJlc3RlIG1lc1wiLDE6XCJlbCBwcsOzeGltbyBtZXNcIixcIi0xXCI6XCJlbCBtZXMgcGFzYWRvXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IG1lc1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBtZXNlc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBtZXNcIixvdGhlcjpcImhhY2UgezB9IG1lc2VzXCJ9fX0sZGF5OntkaXNwbGF5TmFtZTpcImTDrWFcIixyZWxhdGl2ZTp7MDpcImhveVwiLDE6XCJtYcOxYW5hXCIsMjpcInBhc2FkbyBtYcOxYW5hXCIsXCItMlwiOlwiYW50aWVyXCIsXCItMVwiOlwiYXllclwifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBkw61hXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IGTDrWFzXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IGTDrWFcIixvdGhlcjpcImhhY2UgezB9IGTDrWFzXCJ9fX0saG91cjp7ZGlzcGxheU5hbWU6XCJob3JhXCIscmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gaG9yYVwiLG90aGVyOlwiZGVudHJvIGRlIHswfSBob3Jhc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBob3JhXCIsb3RoZXI6XCJoYWNlIHswfSBob3Jhc1wifX19LG1pbnV0ZTp7ZGlzcGxheU5hbWU6XCJtaW51dG9cIixyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBtaW51dG9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gbWludXRvc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBtaW51dG9cIixvdGhlcjpcImhhY2UgezB9IG1pbnV0b3NcIn19fSxzZWNvbmQ6e2Rpc3BsYXlOYW1lOlwic2VndW5kb1wiLHJlbGF0aXZlOnswOlwiYWhvcmFcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gc2VndW5kb1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBzZWd1bmRvc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBzZWd1bmRvXCIsb3RoZXI6XCJoYWNlIHswfSBzZWd1bmRvc1wifX19fX0se2xvY2FsZTpcImVzLUhOXCIscGFyZW50TG9jYWxlOlwiZXMtNDE5XCIsZmllbGRzOnt5ZWFyOntkaXNwbGF5TmFtZTpcImHDsW9cIixyZWxhdGl2ZTp7MDpcImVzdGUgYcOxb1wiLDE6XCJlbCBwcsOzeGltbyBhw7FvXCIsXCItMVwiOlwiZWwgYcOxbyBwYXNhZG9cIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gYcOxb1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBhw7Fvc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBhw7FvXCIsb3RoZXI6XCJoYWNlIHswfSBhw7Fvc1wifX19LG1vbnRoOntkaXNwbGF5TmFtZTpcIm1lc1wiLHJlbGF0aXZlOnswOlwiZXN0ZSBtZXNcIiwxOlwiZWwgcHLDs3hpbW8gbWVzXCIsXCItMVwiOlwiZWwgbWVzIHBhc2Fkb1wifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBtZXNcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gbWVzZXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gbWVzXCIsb3RoZXI6XCJoYWNlIHswfSBtZXNlc1wifX19LGRheTp7ZGlzcGxheU5hbWU6XCJkw61hXCIscmVsYXRpdmU6ezA6XCJob3lcIiwxOlwibWHDsWFuYVwiLDI6XCJwYXNhZG8gbWHDsWFuYVwiLFwiLTJcIjpcImFudGllclwiLFwiLTFcIjpcImF5ZXJcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gZMOtYVwiLG90aGVyOlwiZGVudHJvIGRlIHswfSBkw61hc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBkw61hXCIsb3RoZXI6XCJoYWNlIHswfSBkw61hc1wifX19LGhvdXI6e2Rpc3BsYXlOYW1lOlwiaG9yYVwiLHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGhvcmFcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gaG9yYXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gaG9yYVwiLG90aGVyOlwiaGFjZSB7MH0gaG9yYXNcIn19fSxtaW51dGU6e2Rpc3BsYXlOYW1lOlwibWludXRvXCIscmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gbWludXRvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IG1pbnV0b3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gbWludXRvXCIsb3RoZXI6XCJoYWNlIHswfSBtaW51dG9zXCJ9fX0sc2Vjb25kOntkaXNwbGF5TmFtZTpcInNlZ3VuZG9cIixyZWxhdGl2ZTp7MDpcImFob3JhXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IHNlZ3VuZG9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gc2VndW5kb3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gc2VndW5kb1wiLG90aGVyOlwiaGFjZSB7MH0gc2VndW5kb3NcIn19fX19LHtsb2NhbGU6XCJlcy1JQ1wiLHBhcmVudExvY2FsZTpcImVzXCJ9LHtsb2NhbGU6XCJlcy1NWFwiLHBhcmVudExvY2FsZTpcImVzLTQxOVwiLGZpZWxkczp7eWVhcjp7ZGlzcGxheU5hbWU6XCJhw7FvXCIscmVsYXRpdmU6ezA6XCJlc3RlIGHDsW9cIiwxOlwiZWwgYcOxbyBwcsOzeGltb1wiLFwiLTFcIjpcImVsIGHDsW8gcGFzYWRvXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGHDsW9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gYcOxb3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gYcOxb1wiLG90aGVyOlwiaGFjZSB7MH0gYcOxb3NcIn19fSxtb250aDp7ZGlzcGxheU5hbWU6XCJtZXNcIixyZWxhdGl2ZTp7MDpcImVzdGUgbWVzXCIsMTpcImVsIG1lcyBwcsOzeGltb1wiLFwiLTFcIjpcImVsIG1lcyBwYXNhZG9cIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImVuIHswfSBtZXNcIixvdGhlcjpcImVuIHswfSBtZXNlc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBtZXNcIixvdGhlcjpcImhhY2UgezB9IG1lc2VzXCJ9fX0sZGF5OntkaXNwbGF5TmFtZTpcImTDrWFcIixyZWxhdGl2ZTp7MDpcImhveVwiLDE6XCJtYcOxYW5hXCIsMjpcInBhc2FkbyBtYcOxYW5hXCIsXCItMlwiOlwiYW50aWVyXCIsXCItMVwiOlwiYXllclwifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBkw61hXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IGTDrWFzXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IGTDrWFcIixvdGhlcjpcImhhY2UgezB9IGTDrWFzXCJ9fX0saG91cjp7ZGlzcGxheU5hbWU6XCJob3JhXCIscmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gaG9yYVwiLG90aGVyOlwiZGVudHJvIGRlIHswfSBob3Jhc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBob3JhXCIsb3RoZXI6XCJoYWNlIHswfSBob3Jhc1wifX19LG1pbnV0ZTp7ZGlzcGxheU5hbWU6XCJtaW51dG9cIixyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBtaW51dG9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gbWludXRvc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBtaW51dG9cIixvdGhlcjpcImhhY2UgezB9IG1pbnV0b3NcIn19fSxzZWNvbmQ6e2Rpc3BsYXlOYW1lOlwic2VndW5kb1wiLHJlbGF0aXZlOnswOlwiYWhvcmFcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gc2VndW5kb1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBzZWd1bmRvc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBzZWd1bmRvXCIsb3RoZXI6XCJoYWNlIHswfSBzZWd1bmRvc1wifX19fX0se2xvY2FsZTpcImVzLU5JXCIscGFyZW50TG9jYWxlOlwiZXMtNDE5XCIsZmllbGRzOnt5ZWFyOntkaXNwbGF5TmFtZTpcImHDsW9cIixyZWxhdGl2ZTp7MDpcImVzdGUgYcOxb1wiLDE6XCJlbCBwcsOzeGltbyBhw7FvXCIsXCItMVwiOlwiZWwgYcOxbyBwYXNhZG9cIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gYcOxb1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBhw7Fvc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBhw7FvXCIsb3RoZXI6XCJoYWNlIHswfSBhw7Fvc1wifX19LG1vbnRoOntkaXNwbGF5TmFtZTpcIm1lc1wiLHJlbGF0aXZlOnswOlwiZXN0ZSBtZXNcIiwxOlwiZWwgcHLDs3hpbW8gbWVzXCIsXCItMVwiOlwiZWwgbWVzIHBhc2Fkb1wifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBtZXNcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gbWVzZXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gbWVzXCIsb3RoZXI6XCJoYWNlIHswfSBtZXNlc1wifX19LGRheTp7ZGlzcGxheU5hbWU6XCJkw61hXCIscmVsYXRpdmU6ezA6XCJob3lcIiwxOlwibWHDsWFuYVwiLDI6XCJwYXNhZG8gbWHDsWFuYVwiLFwiLTJcIjpcImFudGllclwiLFwiLTFcIjpcImF5ZXJcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gZMOtYVwiLG90aGVyOlwiZGVudHJvIGRlIHswfSBkw61hc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBkw61hXCIsb3RoZXI6XCJoYWNlIHswfSBkw61hc1wifX19LGhvdXI6e2Rpc3BsYXlOYW1lOlwiaG9yYVwiLHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGhvcmFcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gaG9yYXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gaG9yYVwiLG90aGVyOlwiaGFjZSB7MH0gaG9yYXNcIn19fSxtaW51dGU6e2Rpc3BsYXlOYW1lOlwibWludXRvXCIscmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gbWludXRvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IG1pbnV0b3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gbWludXRvXCIsb3RoZXI6XCJoYWNlIHswfSBtaW51dG9zXCJ9fX0sc2Vjb25kOntkaXNwbGF5TmFtZTpcInNlZ3VuZG9cIixyZWxhdGl2ZTp7MDpcImFob3JhXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IHNlZ3VuZG9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gc2VndW5kb3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gc2VndW5kb1wiLG90aGVyOlwiaGFjZSB7MH0gc2VndW5kb3NcIn19fX19LHtsb2NhbGU6XCJlcy1QQVwiLHBhcmVudExvY2FsZTpcImVzLTQxOVwiLGZpZWxkczp7eWVhcjp7ZGlzcGxheU5hbWU6XCJhw7FvXCIscmVsYXRpdmU6ezA6XCJlc3RlIGHDsW9cIiwxOlwiZWwgcHLDs3hpbW8gYcOxb1wiLFwiLTFcIjpcImVsIGHDsW8gcGFzYWRvXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGHDsW9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gYcOxb3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gYcOxb1wiLG90aGVyOlwiaGFjZSB7MH0gYcOxb3NcIn19fSxtb250aDp7ZGlzcGxheU5hbWU6XCJtZXNcIixyZWxhdGl2ZTp7MDpcImVzdGUgbWVzXCIsMTpcImVsIHByw7N4aW1vIG1lc1wiLFwiLTFcIjpcImVsIG1lcyBwYXNhZG9cIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gbWVzXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IG1lc2VzXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IG1lc1wiLG90aGVyOlwiaGFjZSB7MH0gbWVzZXNcIn19fSxkYXk6e2Rpc3BsYXlOYW1lOlwiZMOtYVwiLHJlbGF0aXZlOnswOlwiaG95XCIsMTpcIm1hw7FhbmFcIiwyOlwicGFzYWRvIG1hw7FhbmFcIixcIi0yXCI6XCJhbnRpZXJcIixcIi0xXCI6XCJheWVyXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGTDrWFcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gZMOtYXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gZMOtYVwiLG90aGVyOlwiaGFjZSB7MH0gZMOtYXNcIn19fSxob3VyOntkaXNwbGF5TmFtZTpcImhvcmFcIixyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBob3JhXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IGhvcmFzXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IGhvcmFcIixvdGhlcjpcImhhY2UgezB9IGhvcmFzXCJ9fX0sbWludXRlOntkaXNwbGF5TmFtZTpcIm1pbnV0b1wiLHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IG1pbnV0b1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBtaW51dG9zXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IG1pbnV0b1wiLG90aGVyOlwiaGFjZSB7MH0gbWludXRvc1wifX19LHNlY29uZDp7ZGlzcGxheU5hbWU6XCJzZWd1bmRvXCIscmVsYXRpdmU6ezA6XCJhaG9yYVwifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBzZWd1bmRvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IHNlZ3VuZG9zXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IHNlZ3VuZG9cIixvdGhlcjpcImhhY2UgezB9IHNlZ3VuZG9zXCJ9fX19fSx7bG9jYWxlOlwiZXMtUEVcIixwYXJlbnRMb2NhbGU6XCJlcy00MTlcIn0se2xvY2FsZTpcImVzLVBIXCIscGFyZW50TG9jYWxlOlwiZXNcIn0se2xvY2FsZTpcImVzLVBSXCIscGFyZW50TG9jYWxlOlwiZXMtNDE5XCJ9LHtsb2NhbGU6XCJlcy1QWVwiLHBhcmVudExvY2FsZTpcImVzLTQxOVwiLGZpZWxkczp7eWVhcjp7ZGlzcGxheU5hbWU6XCJhw7FvXCIscmVsYXRpdmU6ezA6XCJlc3RlIGHDsW9cIiwxOlwiZWwgcHLDs3hpbW8gYcOxb1wiLFwiLTFcIjpcImVsIGHDsW8gcGFzYWRvXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGHDsW9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gYcOxb3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gYcOxb1wiLG90aGVyOlwiaGFjZSB7MH0gYcOxb3NcIn19fSxtb250aDp7ZGlzcGxheU5hbWU6XCJtZXNcIixyZWxhdGl2ZTp7MDpcImVzdGUgbWVzXCIsMTpcImVsIHByw7N4aW1vIG1lc1wiLFwiLTFcIjpcImVsIG1lcyBwYXNhZG9cIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gbWVzXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IG1lc2VzXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IG1lc1wiLG90aGVyOlwiaGFjZSB7MH0gbWVzZXNcIn19fSxkYXk6e2Rpc3BsYXlOYW1lOlwiZMOtYVwiLHJlbGF0aXZlOnswOlwiaG95XCIsMTpcIm1hw7FhbmFcIiwyOlwicGFzYWRvIG1hw7FhbmFcIixcIi0yXCI6XCJhbnRlcyBkZSBheWVyXCIsXCItMVwiOlwiYXllclwifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBkw61hXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IGTDrWFzXCJ9LHBhc3Q6e29uZTpcImhhY2UgezB9IGTDrWFcIixvdGhlcjpcImhhY2UgezB9IGTDrWFzXCJ9fX0saG91cjp7ZGlzcGxheU5hbWU6XCJob3JhXCIscmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gaG9yYVwiLG90aGVyOlwiZGVudHJvIGRlIHswfSBob3Jhc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBob3JhXCIsb3RoZXI6XCJoYWNlIHswfSBob3Jhc1wifX19LG1pbnV0ZTp7ZGlzcGxheU5hbWU6XCJtaW51dG9cIixyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBtaW51dG9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gbWludXRvc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBtaW51dG9cIixvdGhlcjpcImhhY2UgezB9IG1pbnV0b3NcIn19fSxzZWNvbmQ6e2Rpc3BsYXlOYW1lOlwic2VndW5kb1wiLHJlbGF0aXZlOnswOlwiYWhvcmFcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gc2VndW5kb1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBzZWd1bmRvc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBzZWd1bmRvXCIsb3RoZXI6XCJoYWNlIHswfSBzZWd1bmRvc1wifX19fX0se2xvY2FsZTpcImVzLVNWXCIscGFyZW50TG9jYWxlOlwiZXMtNDE5XCIsZmllbGRzOnt5ZWFyOntkaXNwbGF5TmFtZTpcImHDsW9cIixyZWxhdGl2ZTp7MDpcImVzdGUgYcOxb1wiLDE6XCJlbCBwcsOzeGltbyBhw7FvXCIsXCItMVwiOlwiZWwgYcOxbyBwYXNhZG9cIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gYcOxb1wiLG90aGVyOlwiZGVudHJvIGRlIHswfSBhw7Fvc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBhw7FvXCIsb3RoZXI6XCJoYWNlIHswfSBhw7Fvc1wifX19LG1vbnRoOntkaXNwbGF5TmFtZTpcIm1lc1wiLHJlbGF0aXZlOnswOlwiZXN0ZSBtZXNcIiwxOlwiZWwgcHLDs3hpbW8gbWVzXCIsXCItMVwiOlwiZWwgbWVzIHBhc2Fkb1wifSxyZWxhdGl2ZVRpbWU6e2Z1dHVyZTp7b25lOlwiZGVudHJvIGRlIHswfSBtZXNcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gbWVzZXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gbWVzXCIsb3RoZXI6XCJoYWNlIHswfSBtZXNlc1wifX19LGRheTp7ZGlzcGxheU5hbWU6XCJkw61hXCIscmVsYXRpdmU6ezA6XCJob3lcIiwxOlwibWHDsWFuYVwiLDI6XCJwYXNhZG8gbWHDsWFuYVwiLFwiLTJcIjpcImFudGllclwiLFwiLTFcIjpcImF5ZXJcIn0scmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gZMOtYVwiLG90aGVyOlwiZGVudHJvIGRlIHswfSBkw61hc1wifSxwYXN0OntvbmU6XCJoYWNlIHswfSBkw61hXCIsb3RoZXI6XCJoYWNlIHswfSBkw61hc1wifX19LGhvdXI6e2Rpc3BsYXlOYW1lOlwiaG9yYVwiLHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IGhvcmFcIixvdGhlcjpcImRlbnRybyBkZSB7MH0gaG9yYXNcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gaG9yYVwiLG90aGVyOlwiaGFjZSB7MH0gaG9yYXNcIn19fSxtaW51dGU6e2Rpc3BsYXlOYW1lOlwibWludXRvXCIscmVsYXRpdmVUaW1lOntmdXR1cmU6e29uZTpcImRlbnRybyBkZSB7MH0gbWludXRvXCIsb3RoZXI6XCJkZW50cm8gZGUgezB9IG1pbnV0b3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gbWludXRvXCIsb3RoZXI6XCJoYWNlIHswfSBtaW51dG9zXCJ9fX0sc2Vjb25kOntkaXNwbGF5TmFtZTpcInNlZ3VuZG9cIixyZWxhdGl2ZTp7MDpcImFob3JhXCJ9LHJlbGF0aXZlVGltZTp7ZnV0dXJlOntvbmU6XCJkZW50cm8gZGUgezB9IHNlZ3VuZG9cIixvdGhlcjpcImRlbnRybyBkZSB7MH0gc2VndW5kb3NcIn0scGFzdDp7b25lOlwiaGFjZSB7MH0gc2VndW5kb1wiLG90aGVyOlwiaGFjZSB7MH0gc2VndW5kb3NcIn19fX19LHtsb2NhbGU6XCJlcy1VU1wiLHBhcmVudExvY2FsZTpcImVzLTQxOVwifSx7bG9jYWxlOlwiZXMtVVlcIixwYXJlbnRMb2NhbGU6XCJlcy00MTlcIn0se2xvY2FsZTpcImVzLVZFXCIscGFyZW50TG9jYWxlOlwiZXMtNDE5XCJ9XTtyZXR1cm4gZX0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX3dhcm5pbmcgPSByZXF1aXJlKCd3YXJuaW5nJyk7XG5cbnZhciBfd2FybmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93YXJuaW5nKTtcblxudmFyIF9jb21wb25lbnRPckVsZW1lbnQgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9jb21wb25lbnRPckVsZW1lbnQnKTtcblxudmFyIF9jb21wb25lbnRPckVsZW1lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29tcG9uZW50T3JFbGVtZW50KTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG52YXIgX1BvcnRhbCA9IHJlcXVpcmUoJy4vUG9ydGFsJyk7XG5cbnZhciBfUG9ydGFsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1BvcnRhbCk7XG5cbnZhciBfTW9kYWxNYW5hZ2VyID0gcmVxdWlyZSgnLi9Nb2RhbE1hbmFnZXInKTtcblxudmFyIF9Nb2RhbE1hbmFnZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfTW9kYWxNYW5hZ2VyKTtcblxudmFyIF9vd25lckRvY3VtZW50ID0gcmVxdWlyZSgnLi91dGlscy9vd25lckRvY3VtZW50Jyk7XG5cbnZhciBfb3duZXJEb2N1bWVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vd25lckRvY3VtZW50KTtcblxudmFyIF9hZGRFdmVudExpc3RlbmVyID0gcmVxdWlyZSgnLi91dGlscy9hZGRFdmVudExpc3RlbmVyJyk7XG5cbnZhciBfYWRkRXZlbnRMaXN0ZW5lcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hZGRFdmVudExpc3RlbmVyKTtcblxudmFyIF9hZGRGb2N1c0xpc3RlbmVyID0gcmVxdWlyZSgnLi91dGlscy9hZGRGb2N1c0xpc3RlbmVyJyk7XG5cbnZhciBfYWRkRm9jdXNMaXN0ZW5lcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9hZGRGb2N1c0xpc3RlbmVyKTtcblxudmFyIF9pbkRPTSA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL3V0aWwvaW5ET00nKTtcblxudmFyIF9pbkRPTTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbkRPTSk7XG5cbnZhciBfYWN0aXZlRWxlbWVudCA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL2FjdGl2ZUVsZW1lbnQnKTtcblxudmFyIF9hY3RpdmVFbGVtZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2FjdGl2ZUVsZW1lbnQpO1xuXG52YXIgX2NvbnRhaW5zID0gcmVxdWlyZSgnZG9tLWhlbHBlcnMvcXVlcnkvY29udGFpbnMnKTtcblxudmFyIF9jb250YWluczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb250YWlucyk7XG5cbnZhciBfZ2V0Q29udGFpbmVyID0gcmVxdWlyZSgnLi91dGlscy9nZXRDb250YWluZXInKTtcblxudmFyIF9nZXRDb250YWluZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0Q29udGFpbmVyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfSAvKmVzbGludC1kaXNhYmxlIHJlYWN0L3Byb3AtdHlwZXMgKi9cblxuXG52YXIgbW9kYWxNYW5hZ2VyID0gbmV3IF9Nb2RhbE1hbmFnZXIyLmRlZmF1bHQoKTtcblxuLyoqXG4gKiBMb3ZlIHRoZW0gb3IgaGF0ZSB0aGVtLCBgPE1vZGFsLz5gIHByb3ZpZGVzIGEgc29saWQgZm91bmRhdGlvbiBmb3IgY3JlYXRpbmcgZGlhbG9ncywgbGlnaHRib3hlcywgb3Igd2hhdGV2ZXIgZWxzZS5cbiAqIFRoZSBNb2RhbCBjb21wb25lbnQgcmVuZGVycyBpdHMgYGNoaWxkcmVuYCBub2RlIGluIGZyb250IG9mIGEgYmFja2Ryb3AgY29tcG9uZW50LlxuICpcbiAqIFRoZSBNb2RhbCBvZmZlcnMgYSBmZXcgaGVscGZ1bCBmZWF0dXJlcyBvdmVyIHVzaW5nIGp1c3QgYSBgPFBvcnRhbC8+YCBjb21wb25lbnQgYW5kIHNvbWUgc3R5bGVzOlxuICpcbiAqIC0gTWFuYWdlcyBkaWFsb2cgc3RhY2tpbmcgd2hlbiBvbmUtYXQtYS10aW1lIGp1c3QgaXNuJ3QgZW5vdWdoLlxuICogLSBDcmVhdGVzIGEgYmFja2Ryb3AsIGZvciBkaXNhYmxpbmcgaW50ZXJhY3Rpb24gYmVsb3cgdGhlIG1vZGFsLlxuICogLSBJdCBwcm9wZXJseSBtYW5hZ2VzIGZvY3VzOyBtb3ZpbmcgdG8gdGhlIG1vZGFsIGNvbnRlbnQsIGFuZCBrZWVwaW5nIGl0IHRoZXJlIHVudGlsIHRoZSBtb2RhbCBpcyBjbG9zZWQuXG4gKiAtIEl0IGRpc2FibGVzIHNjcm9sbGluZyBvZiB0aGUgcGFnZSBjb250ZW50IHdoaWxlIG9wZW4uXG4gKiAtIEFkZHMgdGhlIGFwcHJvcHJpYXRlIEFSSUEgcm9sZXMgYXJlIGF1dG9tYXRpY2FsbHkuXG4gKiAtIEVhc2lseSBwbHVnZ2FibGUgYW5pbWF0aW9ucyB2aWEgYSBgPFRyYW5zaXRpb24vPmAgY29tcG9uZW50LlxuICpcbiAqIE5vdGUgdGhhdCwgaW4gdGhlIHNhbWUgd2F5IHRoZSBiYWNrZHJvcCBlbGVtZW50IHByZXZlbnRzIHVzZXJzIGZyb20gY2xpY2tpbmcgb3IgaW50ZXJhY3RpbmdcbiAqIHdpdGggdGhlIHBhZ2UgY29udGVudCB1bmRlcm5lYXRoIHRoZSBNb2RhbCwgU2NyZWVuIHJlYWRlcnMgYWxzbyBuZWVkIHRvIGJlIHNpZ25hbGVkIHRvIG5vdCB0b1xuICogaW50ZXJhY3Qgd2l0aCBwYWdlIGNvbnRlbnQgd2hpbGUgdGhlIE1vZGFsIGlzIG9wZW4uIFRvIGRvIHRoaXMsIHdlIHVzZSBhIGNvbW1vbiB0ZWNobmlxdWUgb2YgYXBwbHlpbmdcbiAqIHRoZSBgYXJpYS1oaWRkZW49J3RydWUnYCBhdHRyaWJ1dGUgdG8gdGhlIG5vbi1Nb2RhbCBlbGVtZW50cyBpbiB0aGUgTW9kYWwgYGNvbnRhaW5lcmAuIFRoaXMgbWVhbnMgdGhhdCBmb3JcbiAqIGEgTW9kYWwgdG8gYmUgdHJ1bHkgbW9kYWwsIGl0IHNob3VsZCBoYXZlIGEgYGNvbnRhaW5lcmAgdGhhdCBpcyBfb3V0c2lkZV8geW91ciBhcHAnc1xuICogUmVhY3QgaGllcmFyY2h5IChzdWNoIGFzIHRoZSBkZWZhdWx0OiBkb2N1bWVudC5ib2R5KS5cbiAqL1xuXG52YXIgTW9kYWwgPSBmdW5jdGlvbiAoX1JlYWN0JENvbXBvbmVudCkge1xuICBfaW5oZXJpdHMoTW9kYWwsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE1vZGFsKCkge1xuICAgIHZhciBfcmVmO1xuXG4gICAgdmFyIF90ZW1wLCBfdGhpcywgX3JldDtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBNb2RhbCk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3JldCA9IChfdGVtcCA9IChfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIChfcmVmID0gTW9kYWwuX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihNb2RhbCkpLmNhbGwuYXBwbHkoX3JlZiwgW3RoaXNdLmNvbmNhdChhcmdzKSkpLCBfdGhpcyksIF9pbml0aWFsaXNlUHJvcHMuY2FsbChfdGhpcyksIF90ZW1wKSwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oX3RoaXMsIF9yZXQpO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKE1vZGFsLCBbe1xuICAgIGtleTogJ29taXRQcm9wcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG9taXRQcm9wcyhwcm9wcywgcHJvcFR5cGVzKSB7XG5cbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocHJvcHMpO1xuICAgICAgdmFyIG5ld1Byb3BzID0ge307XG4gICAgICBrZXlzLm1hcChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChwcm9wVHlwZXMsIHByb3ApKSB7XG4gICAgICAgICAgbmV3UHJvcHNbcHJvcF0gPSBwcm9wc1twcm9wXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBuZXdQcm9wcztcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZW5kZXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcztcbiAgICAgIHZhciBzaG93ID0gX3Byb3BzLnNob3c7XG4gICAgICB2YXIgY29udGFpbmVyID0gX3Byb3BzLmNvbnRhaW5lcjtcbiAgICAgIHZhciBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBUcmFuc2l0aW9uID0gX3Byb3BzLnRyYW5zaXRpb247XG4gICAgICB2YXIgYmFja2Ryb3AgPSBfcHJvcHMuYmFja2Ryb3A7XG4gICAgICB2YXIgZGlhbG9nVHJhbnNpdGlvblRpbWVvdXQgPSBfcHJvcHMuZGlhbG9nVHJhbnNpdGlvblRpbWVvdXQ7XG4gICAgICB2YXIgY2xhc3NOYW1lID0gX3Byb3BzLmNsYXNzTmFtZTtcbiAgICAgIHZhciBzdHlsZSA9IF9wcm9wcy5zdHlsZTtcbiAgICAgIHZhciBvbkV4aXQgPSBfcHJvcHMub25FeGl0O1xuICAgICAgdmFyIG9uRXhpdGluZyA9IF9wcm9wcy5vbkV4aXRpbmc7XG4gICAgICB2YXIgb25FbnRlciA9IF9wcm9wcy5vbkVudGVyO1xuICAgICAgdmFyIG9uRW50ZXJpbmcgPSBfcHJvcHMub25FbnRlcmluZztcbiAgICAgIHZhciBvbkVudGVyZWQgPSBfcHJvcHMub25FbnRlcmVkO1xuXG5cbiAgICAgIHZhciBkaWFsb2cgPSBfcmVhY3QyLmRlZmF1bHQuQ2hpbGRyZW4ub25seShjaGlsZHJlbik7XG4gICAgICB2YXIgZmlsdGVyZWRQcm9wcyA9IHRoaXMub21pdFByb3BzKHRoaXMucHJvcHMsIE1vZGFsLnByb3BUeXBlcyk7XG5cbiAgICAgIHZhciBtb3VudE1vZGFsID0gc2hvdyB8fCBUcmFuc2l0aW9uICYmICF0aGlzLnN0YXRlLmV4aXRlZDtcbiAgICAgIGlmICghbW91bnRNb2RhbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIF9kaWFsb2ckcHJvcHMgPSBkaWFsb2cucHJvcHM7XG4gICAgICB2YXIgcm9sZSA9IF9kaWFsb2ckcHJvcHMucm9sZTtcbiAgICAgIHZhciB0YWJJbmRleCA9IF9kaWFsb2ckcHJvcHMudGFiSW5kZXg7XG5cblxuICAgICAgaWYgKHJvbGUgPT09IHVuZGVmaW5lZCB8fCB0YWJJbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGRpYWxvZyA9ICgwLCBfcmVhY3QuY2xvbmVFbGVtZW50KShkaWFsb2csIHtcbiAgICAgICAgICByb2xlOiByb2xlID09PSB1bmRlZmluZWQgPyAnZG9jdW1lbnQnIDogcm9sZSxcbiAgICAgICAgICB0YWJJbmRleDogdGFiSW5kZXggPT0gbnVsbCA/ICctMScgOiB0YWJJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKFRyYW5zaXRpb24pIHtcbiAgICAgICAgZGlhbG9nID0gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoXG4gICAgICAgICAgVHJhbnNpdGlvbixcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0cmFuc2l0aW9uQXBwZWFyOiB0cnVlLFxuICAgICAgICAgICAgdW5tb3VudE9uRXhpdDogdHJ1ZSxcbiAgICAgICAgICAgICdpbic6IHNob3csXG4gICAgICAgICAgICB0aW1lb3V0OiBkaWFsb2dUcmFuc2l0aW9uVGltZW91dCxcbiAgICAgICAgICAgIG9uRXhpdDogb25FeGl0LFxuICAgICAgICAgICAgb25FeGl0aW5nOiBvbkV4aXRpbmcsXG4gICAgICAgICAgICBvbkV4aXRlZDogdGhpcy5oYW5kbGVIaWRkZW4sXG4gICAgICAgICAgICBvbkVudGVyOiBvbkVudGVyLFxuICAgICAgICAgICAgb25FbnRlcmluZzogb25FbnRlcmluZyxcbiAgICAgICAgICAgIG9uRW50ZXJlZDogb25FbnRlcmVkXG4gICAgICAgICAgfSxcbiAgICAgICAgICBkaWFsb2dcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICBfUG9ydGFsMi5kZWZhdWx0LFxuICAgICAgICB7XG4gICAgICAgICAgcmVmOiB0aGlzLnNldE1vdW50Tm9kZSxcbiAgICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lclxuICAgICAgICB9LFxuICAgICAgICBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgICAnZGl2JyxcbiAgICAgICAgICBfZXh0ZW5kcyh7XG4gICAgICAgICAgICByZWY6IHRoaXMuc2V0TW9kYWxOb2RlLFxuICAgICAgICAgICAgcm9sZTogcm9sZSB8fCAnZGlhbG9nJ1xuICAgICAgICAgIH0sIGZpbHRlcmVkUHJvcHMsIHtcbiAgICAgICAgICAgIHN0eWxlOiBzdHlsZSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lXG4gICAgICAgICAgfSksXG4gICAgICAgICAgYmFja2Ryb3AgJiYgdGhpcy5yZW5kZXJCYWNrZHJvcCgpLFxuICAgICAgICAgIGRpYWxvZ1xuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgaWYgKG5leHRQcm9wcy5zaG93KSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBleGl0ZWQ6IGZhbHNlIH0pO1xuICAgICAgfSBlbHNlIGlmICghbmV4dFByb3BzLnRyYW5zaXRpb24pIHtcbiAgICAgICAgLy8gT3RoZXJ3aXNlIGxldCBoYW5kbGVIaWRkZW4gdGFrZSBjYXJlIG9mIG1hcmtpbmcgZXhpdGVkLlxuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZXhpdGVkOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudFdpbGxVcGRhdGUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVXBkYXRlKG5leHRQcm9wcykge1xuICAgICAgaWYgKCF0aGlzLnByb3BzLnNob3cgJiYgbmV4dFByb3BzLnNob3cpIHtcbiAgICAgICAgdGhpcy5jaGVja0ZvckZvY3VzKCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnY29tcG9uZW50RGlkTW91bnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMuX2lzTW91bnRlZCA9IHRydWU7XG4gICAgICBpZiAodGhpcy5wcm9wcy5zaG93KSB7XG4gICAgICAgIHRoaXMub25TaG93KCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnY29tcG9uZW50RGlkVXBkYXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgdmFyIHRyYW5zaXRpb24gPSB0aGlzLnByb3BzLnRyYW5zaXRpb247XG5cblxuICAgICAgaWYgKHByZXZQcm9wcy5zaG93ICYmICF0aGlzLnByb3BzLnNob3cgJiYgIXRyYW5zaXRpb24pIHtcbiAgICAgICAgLy8gT3RoZXJ3aXNlIGhhbmRsZUhpZGRlbiB3aWxsIGNhbGwgdGhpcy5cbiAgICAgICAgdGhpcy5vbkhpZGUoKTtcbiAgICAgIH0gZWxzZSBpZiAoIXByZXZQcm9wcy5zaG93ICYmIHRoaXMucHJvcHMuc2hvdykge1xuICAgICAgICB0aGlzLm9uU2hvdygpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudFdpbGxVbm1vdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB2YXIgX3Byb3BzMiA9IHRoaXMucHJvcHM7XG4gICAgICB2YXIgc2hvdyA9IF9wcm9wczIuc2hvdztcbiAgICAgIHZhciB0cmFuc2l0aW9uID0gX3Byb3BzMi50cmFuc2l0aW9uO1xuXG5cbiAgICAgIHRoaXMuX2lzTW91bnRlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoc2hvdyB8fCB0cmFuc2l0aW9uICYmICF0aGlzLnN0YXRlLmV4aXRlZCkge1xuICAgICAgICB0aGlzLm9uSGlkZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vaW5zdGVhZCBvZiBhIHJlZiwgd2hpY2ggbWlnaHQgY29uZmxpY3Qgd2l0aCBvbmUgdGhlIHBhcmVudCBhcHBsaWVkLlxuXG4gIH1dKTtcblxuICByZXR1cm4gTW9kYWw7XG59KF9yZWFjdDIuZGVmYXVsdC5Db21wb25lbnQpO1xuXG5Nb2RhbC5wcm9wVHlwZXMgPSBfZXh0ZW5kcyh7fSwgX1BvcnRhbDIuZGVmYXVsdC5wcm9wVHlwZXMsIHtcblxuICAvKipcbiAgICogU2V0IHRoZSB2aXNpYmlsaXR5IG9mIHRoZSBNb2RhbFxuICAgKi9cbiAgc2hvdzogX3Byb3BUeXBlczIuZGVmYXVsdC5ib29sLFxuXG4gIC8qKlxuICAgKiBBIE5vZGUsIENvbXBvbmVudCBpbnN0YW5jZSwgb3IgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGVpdGhlci4gVGhlIE1vZGFsIGlzIGFwcGVuZGVkIHRvIGl0J3MgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqXG4gICAqIEZvciB0aGUgc2FrZSBvZiBhc3Npc3RpdmUgdGVjaG5vbG9naWVzLCB0aGUgY29udGFpbmVyIHNob3VsZCB1c3VhbGx5IGJlIHRoZSBkb2N1bWVudCBib2R5LCBzbyB0aGF0IHRoZSByZXN0IG9mIHRoZVxuICAgKiBwYWdlIGNvbnRlbnQgY2FuIGJlIHBsYWNlZCBiZWhpbmQgYSB2aXJ0dWFsIGJhY2tkcm9wIGFzIHdlbGwgYXMgYSB2aXN1YWwgb25lLlxuICAgKi9cbiAgY29udGFpbmVyOiBfcHJvcFR5cGVzMi5kZWZhdWx0Lm9uZU9mVHlwZShbX2NvbXBvbmVudE9yRWxlbWVudDIuZGVmYXVsdCwgX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jXSksXG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZmlyZWQgd2hlbiB0aGUgTW9kYWwgaXMgb3BlbmluZy5cbiAgICovXG4gIG9uU2hvdzogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZpcmVkIHdoZW4gZWl0aGVyIHRoZSBiYWNrZHJvcCBpcyBjbGlja2VkLCBvciB0aGUgZXNjYXBlIGtleSBpcyBwcmVzc2VkLlxuICAgKlxuICAgKiBUaGUgYG9uSGlkZWAgY2FsbGJhY2sgb25seSBzaWduYWxzIGludGVudCBmcm9tIHRoZSBNb2RhbCxcbiAgICogeW91IG11c3QgYWN0dWFsbHkgc2V0IHRoZSBgc2hvd2AgcHJvcCB0byBgZmFsc2VgIGZvciB0aGUgTW9kYWwgdG8gY2xvc2UuXG4gICAqL1xuICBvbkhpZGU6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblxuICAvKipcbiAgICogSW5jbHVkZSBhIGJhY2tkcm9wIGNvbXBvbmVudC5cbiAgICovXG4gIGJhY2tkcm9wOiBfcHJvcFR5cGVzMi5kZWZhdWx0Lm9uZU9mVHlwZShbX3Byb3BUeXBlczIuZGVmYXVsdC5ib29sLCBfcHJvcFR5cGVzMi5kZWZhdWx0Lm9uZU9mKFsnc3RhdGljJ10pXSksXG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgYmFja2Ryb3AgY29tcG9uZW50LiBVc2VmdWwgZm9yIGN1c3RvbVxuICAgKiBiYWNrZHJvcCByZW5kZXJpbmcuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqICByZW5kZXJCYWNrZHJvcD17cHJvcHMgPT4gPE15QmFja2Ryb3Agey4uLnByb3BzfSAvPn1cbiAgICogYGBgXG4gICAqL1xuICByZW5kZXJCYWNrZHJvcDogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZpcmVkIHdoZW4gdGhlIGVzY2FwZSBrZXksIGlmIHNwZWNpZmllZCBpbiBga2V5Ym9hcmRgLCBpcyBwcmVzc2VkLlxuICAgKi9cbiAgb25Fc2NhcGVLZXlVcDogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZpcmVkIHdoZW4gdGhlIGJhY2tkcm9wLCBpZiBzcGVjaWZpZWQsIGlzIGNsaWNrZWQuXG4gICAqL1xuICBvbkJhY2tkcm9wQ2xpY2s6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblxuICAvKipcbiAgICogQSBzdHlsZSBvYmplY3QgZm9yIHRoZSBiYWNrZHJvcCBjb21wb25lbnQuXG4gICAqL1xuICBiYWNrZHJvcFN0eWxlOiBfcHJvcFR5cGVzMi5kZWZhdWx0Lm9iamVjdCxcblxuICAvKipcbiAgICogQSBjc3MgY2xhc3Mgb3IgY2xhc3NlcyBmb3IgdGhlIGJhY2tkcm9wIGNvbXBvbmVudC5cbiAgICovXG4gIGJhY2tkcm9wQ2xhc3NOYW1lOiBfcHJvcFR5cGVzMi5kZWZhdWx0LnN0cmluZyxcblxuICAvKipcbiAgICogQSBjc3MgY2xhc3Mgb3Igc2V0IG9mIGNsYXNzZXMgYXBwbGllZCB0byB0aGUgbW9kYWwgY29udGFpbmVyIHdoZW4gdGhlIG1vZGFsIGlzIG9wZW4sXG4gICAqIGFuZCByZW1vdmVkIHdoZW4gaXQgaXMgY2xvc2VkLlxuICAgKi9cbiAgY29udGFpbmVyQ2xhc3NOYW1lOiBfcHJvcFR5cGVzMi5kZWZhdWx0LnN0cmluZyxcblxuICAvKipcbiAgICogQ2xvc2UgdGhlIG1vZGFsIHdoZW4gZXNjYXBlIGtleSBpcyBwcmVzc2VkXG4gICAqL1xuICBrZXlib2FyZDogX3Byb3BUeXBlczIuZGVmYXVsdC5ib29sLFxuXG4gIC8qKlxuICAgKiBBIGA8VHJhbnNpdGlvbi8+YCBjb21wb25lbnQgdG8gdXNlIGZvciB0aGUgZGlhbG9nIGFuZCBiYWNrZHJvcCBjb21wb25lbnRzLlxuICAgKi9cbiAgdHJhbnNpdGlvbjogX2VsZW1lbnRUeXBlMi5kZWZhdWx0LFxuXG4gIC8qKlxuICAgKiBUaGUgYHRpbWVvdXRgIG9mIHRoZSBkaWFsb2cgdHJhbnNpdGlvbiBpZiBzcGVjaWZpZWQuIFRoaXMgbnVtYmVyIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXRcbiAgICogdHJhbnNpdGlvbiBjYWxsYmFja3MgYXJlIGFsd2F5cyBmaXJlZCwgZXZlbiBpZiBicm93c2VyIHRyYW5zaXRpb24gZXZlbnRzIGFyZSBjYW5jZWxlZC5cbiAgICpcbiAgICogU2VlIHRoZSBUcmFuc2l0aW9uIGB0aW1lb3V0YCBwcm9wIGZvciBtb3JlIGluZm9tYXRpb24uXG4gICAqL1xuICBkaWFsb2dUcmFuc2l0aW9uVGltZW91dDogX3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIsXG5cbiAgLyoqXG4gICAqIFRoZSBgdGltZW91dGAgb2YgdGhlIGJhY2tkcm9wIHRyYW5zaXRpb24gaWYgc3BlY2lmaWVkLiBUaGlzIG51bWJlciBpcyB1c2VkIHRvXG4gICAqIGVuc3VyZSB0aGF0IHRyYW5zaXRpb24gY2FsbGJhY2tzIGFyZSBhbHdheXMgZmlyZWQsIGV2ZW4gaWYgYnJvd3NlciB0cmFuc2l0aW9uIGV2ZW50cyBhcmUgY2FuY2VsZWQuXG4gICAqXG4gICAqIFNlZSB0aGUgVHJhbnNpdGlvbiBgdGltZW91dGAgcHJvcCBmb3IgbW9yZSBpbmZvbWF0aW9uLlxuICAgKi9cbiAgYmFja2Ryb3BUcmFuc2l0aW9uVGltZW91dDogX3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIsXG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgIFRoZSBtb2RhbCB3aWxsIGF1dG9tYXRpY2FsbHkgc2hpZnQgZm9jdXMgdG8gaXRzZWxmIHdoZW4gaXQgb3BlbnMsIGFuZFxuICAgKiByZXBsYWNlIGl0IHRvIHRoZSBsYXN0IGZvY3VzZWQgZWxlbWVudCB3aGVuIGl0IGNsb3Nlcy4gVGhpcyBhbHNvXG4gICAqIHdvcmtzIGNvcnJlY3RseSB3aXRoIGFueSBNb2RhbCBjaGlsZHJlbiB0aGF0IGhhdmUgdGhlIGBhdXRvRm9jdXNgIHByb3AuXG4gICAqXG4gICAqIEdlbmVyYWxseSB0aGlzIHNob3VsZCBuZXZlciBiZSBzZXQgdG8gYGZhbHNlYCBhcyBpdCBtYWtlcyB0aGUgTW9kYWwgbGVzc1xuICAgKiBhY2Nlc3NpYmxlIHRvIGFzc2lzdGl2ZSB0ZWNobm9sb2dpZXMsIGxpa2Ugc2NyZWVuIHJlYWRlcnMuXG4gICAqL1xuICBhdXRvRm9jdXM6IF9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbCxcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgVGhlIG1vZGFsIHdpbGwgcHJldmVudCBmb2N1cyBmcm9tIGxlYXZpbmcgdGhlIE1vZGFsIHdoaWxlIG9wZW4uXG4gICAqXG4gICAqIEdlbmVyYWxseSB0aGlzIHNob3VsZCBuZXZlciBiZSBzZXQgdG8gYGZhbHNlYCBhcyBpdCBtYWtlcyB0aGUgTW9kYWwgbGVzc1xuICAgKiBhY2Nlc3NpYmxlIHRvIGFzc2lzdGl2ZSB0ZWNobm9sb2dpZXMsIGxpa2Ugc2NyZWVuIHJlYWRlcnMuXG4gICAqL1xuICBlbmZvcmNlRm9jdXM6IF9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbCxcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgVGhlIG1vZGFsIHdpbGwgcmVzdG9yZSBmb2N1cyB0byBwcmV2aW91c2x5IGZvY3VzZWQgZWxlbWVudCBvbmNlXG4gICAqIG1vZGFsIGlzIGhpZGRlblxuICAgKi9cbiAgcmVzdG9yZUZvY3VzOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2wsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGJlZm9yZSB0aGUgTW9kYWwgdHJhbnNpdGlvbnMgaW5cbiAgICovXG4gIG9uRW50ZXI6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYXMgdGhlIE1vZGFsIGJlZ2lucyB0byB0cmFuc2l0aW9uIGluXG4gICAqL1xuICBvbkVudGVyaW5nOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBNb2RhbCBmaW5pc2hlcyB0cmFuc2l0aW9uaW5nIGluXG4gICAqL1xuICBvbkVudGVyZWQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgcmlnaHQgYmVmb3JlIHRoZSBNb2RhbCB0cmFuc2l0aW9ucyBvdXRcbiAgICovXG4gIG9uRXhpdDogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhcyB0aGUgTW9kYWwgYmVnaW5zIHRvIHRyYW5zaXRpb24gb3V0XG4gICAqL1xuICBvbkV4aXRpbmc6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIE1vZGFsIGZpbmlzaGVzIHRyYW5zaXRpb25pbmcgb3V0XG4gICAqL1xuICBvbkV4aXRlZDogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuXG4gIC8qKlxuICAgKiBBIE1vZGFsTWFuYWdlciBpbnN0YW5jZSB1c2VkIHRvIHRyYWNrIGFuZCBtYW5hZ2UgdGhlIHN0YXRlIG9mIG9wZW5cbiAgICogTW9kYWxzLiBVc2VmdWwgd2hlbiBjdXN0b21pemluZyBob3cgbW9kYWxzIGludGVyYWN0IHdpdGhpbiBhIGNvbnRhaW5lclxuICAgKi9cbiAgbWFuYWdlcjogX3Byb3BUeXBlczIuZGVmYXVsdC5vYmplY3QuaXNSZXF1aXJlZFxufSk7XG5Nb2RhbC5kZWZhdWx0UHJvcHMgPSB7XG4gIHNob3c6IGZhbHNlLFxuICBiYWNrZHJvcDogdHJ1ZSxcbiAga2V5Ym9hcmQ6IHRydWUsXG4gIGF1dG9Gb2N1czogdHJ1ZSxcbiAgZW5mb3JjZUZvY3VzOiB0cnVlLFxuICByZXN0b3JlRm9jdXM6IHRydWUsXG4gIG9uSGlkZTogZnVuY3Rpb24gb25IaWRlKCkge30sXG4gIG1hbmFnZXI6IG1vZGFsTWFuYWdlcixcbiAgcmVuZGVyQmFja2Ryb3A6IGZ1bmN0aW9uIHJlbmRlckJhY2tkcm9wKHByb3BzKSB7XG4gICAgcmV0dXJuIF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KCdkaXYnLCBwcm9wcyk7XG4gIH1cbn07XG5cbnZhciBfaW5pdGlhbGlzZVByb3BzID0gZnVuY3Rpb24gX2luaXRpYWxpc2VQcm9wcygpIHtcbiAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgdGhpcy5zdGF0ZSA9IHsgZXhpdGVkOiAhdGhpcy5wcm9wcy5zaG93IH07XG5cbiAgdGhpcy5yZW5kZXJCYWNrZHJvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgX3Byb3BzMyA9IF90aGlzMi5wcm9wcztcbiAgICB2YXIgYmFja2Ryb3BTdHlsZSA9IF9wcm9wczMuYmFja2Ryb3BTdHlsZTtcbiAgICB2YXIgYmFja2Ryb3BDbGFzc05hbWUgPSBfcHJvcHMzLmJhY2tkcm9wQ2xhc3NOYW1lO1xuICAgIHZhciByZW5kZXJCYWNrZHJvcCA9IF9wcm9wczMucmVuZGVyQmFja2Ryb3A7XG4gICAgdmFyIFRyYW5zaXRpb24gPSBfcHJvcHMzLnRyYW5zaXRpb247XG4gICAgdmFyIGJhY2tkcm9wVHJhbnNpdGlvblRpbWVvdXQgPSBfcHJvcHMzLmJhY2tkcm9wVHJhbnNpdGlvblRpbWVvdXQ7XG5cblxuICAgIHZhciBiYWNrZHJvcFJlZiA9IGZ1bmN0aW9uIGJhY2tkcm9wUmVmKHJlZikge1xuICAgICAgcmV0dXJuIF90aGlzMi5iYWNrZHJvcCA9IHJlZjtcbiAgICB9O1xuXG4gICAgdmFyIGJhY2tkcm9wID0gcmVuZGVyQmFja2Ryb3Aoe1xuICAgICAgcmVmOiBiYWNrZHJvcFJlZixcbiAgICAgIHN0eWxlOiBiYWNrZHJvcFN0eWxlLFxuICAgICAgY2xhc3NOYW1lOiBiYWNrZHJvcENsYXNzTmFtZSxcbiAgICAgIG9uQ2xpY2s6IF90aGlzMi5oYW5kbGVCYWNrZHJvcENsaWNrXG4gICAgfSk7XG5cbiAgICBpZiAoVHJhbnNpdGlvbikge1xuICAgICAgYmFja2Ryb3AgPSBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgVHJhbnNpdGlvbixcbiAgICAgICAgeyB0cmFuc2l0aW9uQXBwZWFyOiB0cnVlLFxuICAgICAgICAgICdpbic6IF90aGlzMi5wcm9wcy5zaG93LFxuICAgICAgICAgIHRpbWVvdXQ6IGJhY2tkcm9wVHJhbnNpdGlvblRpbWVvdXRcbiAgICAgICAgfSxcbiAgICAgICAgYmFja2Ryb3BcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhY2tkcm9wO1xuICB9O1xuXG4gIHRoaXMub25TaG93ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBkb2MgPSAoMCwgX293bmVyRG9jdW1lbnQyLmRlZmF1bHQpKF90aGlzMik7XG4gICAgdmFyIGNvbnRhaW5lciA9ICgwLCBfZ2V0Q29udGFpbmVyMi5kZWZhdWx0KShfdGhpczIucHJvcHMuY29udGFpbmVyLCBkb2MuYm9keSk7XG5cbiAgICBfdGhpczIucHJvcHMubWFuYWdlci5hZGQoX3RoaXMyLCBjb250YWluZXIsIF90aGlzMi5wcm9wcy5jb250YWluZXJDbGFzc05hbWUpO1xuXG4gICAgX3RoaXMyLl9vbkRvY3VtZW50S2V5dXBMaXN0ZW5lciA9ICgwLCBfYWRkRXZlbnRMaXN0ZW5lcjIuZGVmYXVsdCkoZG9jLCAna2V5dXAnLCBfdGhpczIuaGFuZGxlRG9jdW1lbnRLZXlVcCk7XG5cbiAgICBfdGhpczIuX29uRm9jdXNpbkxpc3RlbmVyID0gKDAsIF9hZGRGb2N1c0xpc3RlbmVyMi5kZWZhdWx0KShfdGhpczIuZW5mb3JjZUZvY3VzKTtcblxuICAgIF90aGlzMi5mb2N1cygpO1xuXG4gICAgaWYgKF90aGlzMi5wcm9wcy5vblNob3cpIHtcbiAgICAgIF90aGlzMi5wcm9wcy5vblNob3coKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5vbkhpZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMyLnByb3BzLm1hbmFnZXIucmVtb3ZlKF90aGlzMik7XG5cbiAgICBfdGhpczIuX29uRG9jdW1lbnRLZXl1cExpc3RlbmVyLnJlbW92ZSgpO1xuXG4gICAgX3RoaXMyLl9vbkZvY3VzaW5MaXN0ZW5lci5yZW1vdmUoKTtcblxuICAgIGlmIChfdGhpczIucHJvcHMucmVzdG9yZUZvY3VzKSB7XG4gICAgICBfdGhpczIucmVzdG9yZUxhc3RGb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLnNldE1vdW50Tm9kZSA9IGZ1bmN0aW9uIChyZWYpIHtcbiAgICBfdGhpczIubW91bnROb2RlID0gcmVmID8gcmVmLmdldE1vdW50Tm9kZSgpIDogcmVmO1xuICB9O1xuXG4gIHRoaXMuc2V0TW9kYWxOb2RlID0gZnVuY3Rpb24gKHJlZikge1xuICAgIF90aGlzMi5tb2RhbE5vZGUgPSByZWY7XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVIaWRkZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMyLnNldFN0YXRlKHsgZXhpdGVkOiB0cnVlIH0pO1xuICAgIF90aGlzMi5vbkhpZGUoKTtcblxuICAgIGlmIChfdGhpczIucHJvcHMub25FeGl0ZWQpIHtcbiAgICAgIHZhciBfcHJvcHM0O1xuXG4gICAgICAoX3Byb3BzNCA9IF90aGlzMi5wcm9wcykub25FeGl0ZWQuYXBwbHkoX3Byb3BzNCwgYXJndW1lbnRzKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVCYWNrZHJvcENsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoZS50YXJnZXQgIT09IGUuY3VycmVudFRhcmdldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChfdGhpczIucHJvcHMub25CYWNrZHJvcENsaWNrKSB7XG4gICAgICBfdGhpczIucHJvcHMub25CYWNrZHJvcENsaWNrKGUpO1xuICAgIH1cblxuICAgIGlmIChfdGhpczIucHJvcHMuYmFja2Ryb3AgPT09IHRydWUpIHtcbiAgICAgIF90aGlzMi5wcm9wcy5vbkhpZGUoKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVEb2N1bWVudEtleVVwID0gZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoX3RoaXMyLnByb3BzLmtleWJvYXJkICYmIGUua2V5Q29kZSA9PT0gMjcgJiYgX3RoaXMyLmlzVG9wTW9kYWwoKSkge1xuICAgICAgaWYgKF90aGlzMi5wcm9wcy5vbkVzY2FwZUtleVVwKSB7XG4gICAgICAgIF90aGlzMi5wcm9wcy5vbkVzY2FwZUtleVVwKGUpO1xuICAgICAgfVxuICAgICAgX3RoaXMyLnByb3BzLm9uSGlkZSgpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLmNoZWNrRm9yRm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKF9pbkRPTTIuZGVmYXVsdCkge1xuICAgICAgX3RoaXMyLmxhc3RGb2N1cyA9ICgwLCBfYWN0aXZlRWxlbWVudDIuZGVmYXVsdCkoKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5mb2N1cyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXV0b0ZvY3VzID0gX3RoaXMyLnByb3BzLmF1dG9Gb2N1cztcbiAgICB2YXIgbW9kYWxDb250ZW50ID0gX3RoaXMyLmdldERpYWxvZ0VsZW1lbnQoKTtcbiAgICB2YXIgY3VycmVudCA9ICgwLCBfYWN0aXZlRWxlbWVudDIuZGVmYXVsdCkoKDAsIF9vd25lckRvY3VtZW50Mi5kZWZhdWx0KShfdGhpczIpKTtcbiAgICB2YXIgZm9jdXNJbk1vZGFsID0gY3VycmVudCAmJiAoMCwgX2NvbnRhaW5zMi5kZWZhdWx0KShtb2RhbENvbnRlbnQsIGN1cnJlbnQpO1xuXG4gICAgaWYgKG1vZGFsQ29udGVudCAmJiBhdXRvRm9jdXMgJiYgIWZvY3VzSW5Nb2RhbCkge1xuICAgICAgX3RoaXMyLmxhc3RGb2N1cyA9IGN1cnJlbnQ7XG5cbiAgICAgIGlmICghbW9kYWxDb250ZW50Lmhhc0F0dHJpYnV0ZSgndGFiSW5kZXgnKSkge1xuICAgICAgICBtb2RhbENvbnRlbnQuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsIC0xKTtcbiAgICAgICAgKDAsIF93YXJuaW5nMi5kZWZhdWx0KShmYWxzZSwgJ1RoZSBtb2RhbCBjb250ZW50IG5vZGUgZG9lcyBub3QgYWNjZXB0IGZvY3VzLiAnICsgJ0ZvciB0aGUgYmVuZWZpdCBvZiBhc3Npc3RpdmUgdGVjaG5vbG9naWVzLCB0aGUgdGFiSW5kZXggb2YgdGhlIG5vZGUgaXMgYmVpbmcgc2V0IHRvIFwiLTFcIi4nKTtcbiAgICAgIH1cblxuICAgICAgbW9kYWxDb250ZW50LmZvY3VzKCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMucmVzdG9yZUxhc3RGb2N1cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBTdXBwb3J0OiA8PUlFMTEgZG9lc24ndCBzdXBwb3J0IGBmb2N1cygpYCBvbiBzdmcgZWxlbWVudHMgKFJCOiAjOTE3KVxuICAgIGlmIChfdGhpczIubGFzdEZvY3VzICYmIF90aGlzMi5sYXN0Rm9jdXMuZm9jdXMpIHtcbiAgICAgIF90aGlzMi5sYXN0Rm9jdXMuZm9jdXMoKTtcbiAgICAgIF90aGlzMi5sYXN0Rm9jdXMgPSBudWxsO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLmVuZm9yY2VGb2N1cyA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZW5mb3JjZUZvY3VzID0gX3RoaXMyLnByb3BzLmVuZm9yY2VGb2N1cztcblxuXG4gICAgaWYgKCFlbmZvcmNlRm9jdXMgfHwgIV90aGlzMi5faXNNb3VudGVkIHx8ICFfdGhpczIuaXNUb3BNb2RhbCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGFjdGl2ZSA9ICgwLCBfYWN0aXZlRWxlbWVudDIuZGVmYXVsdCkoKDAsIF9vd25lckRvY3VtZW50Mi5kZWZhdWx0KShfdGhpczIpKTtcbiAgICB2YXIgbW9kYWwgPSBfdGhpczIuZ2V0RGlhbG9nRWxlbWVudCgpO1xuXG4gICAgaWYgKG1vZGFsICYmIG1vZGFsICE9PSBhY3RpdmUgJiYgISgwLCBfY29udGFpbnMyLmRlZmF1bHQpKG1vZGFsLCBhY3RpdmUpKSB7XG4gICAgICBtb2RhbC5mb2N1cygpO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLmdldERpYWxvZ0VsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5vZGUgPSBfdGhpczIubW9kYWxOb2RlO1xuICAgIHJldHVybiBub2RlICYmIG5vZGUubGFzdENoaWxkO1xuICB9O1xuXG4gIHRoaXMuaXNUb3BNb2RhbCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3RoaXMyLnByb3BzLm1hbmFnZXIuaXNUb3BNb2RhbChfdGhpczIpO1xuICB9O1xufTtcblxuTW9kYWwuTWFuYWdlciA9IF9Nb2RhbE1hbmFnZXIyLmRlZmF1bHQ7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IE1vZGFsO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX3N0eWxlID0gcmVxdWlyZSgnZG9tLWhlbHBlcnMvc3R5bGUnKTtcblxudmFyIF9zdHlsZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zdHlsZSk7XG5cbnZhciBfY2xhc3MgPSByZXF1aXJlKCdkb20taGVscGVycy9jbGFzcycpO1xuXG52YXIgX2NsYXNzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NsYXNzKTtcblxudmFyIF9zY3JvbGxiYXJTaXplID0gcmVxdWlyZSgnZG9tLWhlbHBlcnMvdXRpbC9zY3JvbGxiYXJTaXplJyk7XG5cbnZhciBfc2Nyb2xsYmFyU2l6ZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9zY3JvbGxiYXJTaXplKTtcblxudmFyIF9pc092ZXJmbG93aW5nID0gcmVxdWlyZSgnLi91dGlscy9pc092ZXJmbG93aW5nJyk7XG5cbnZhciBfaXNPdmVyZmxvd2luZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pc092ZXJmbG93aW5nKTtcblxudmFyIF9tYW5hZ2VBcmlhSGlkZGVuID0gcmVxdWlyZSgnLi91dGlscy9tYW5hZ2VBcmlhSGlkZGVuJyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIGZpbmRJbmRleE9mKGFyciwgY2IpIHtcbiAgdmFyIGlkeCA9IC0xO1xuICBhcnIuc29tZShmdW5jdGlvbiAoZCwgaSkge1xuICAgIGlmIChjYihkLCBpKSkge1xuICAgICAgaWR4ID0gaTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBpZHg7XG59XG5cbmZ1bmN0aW9uIGZpbmRDb250YWluZXIoZGF0YSwgbW9kYWwpIHtcbiAgcmV0dXJuIGZpbmRJbmRleE9mKGRhdGEsIGZ1bmN0aW9uIChkKSB7XG4gICAgcmV0dXJuIGQubW9kYWxzLmluZGV4T2YobW9kYWwpICE9PSAtMTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNldENvbnRhaW5lclN0eWxlKHN0YXRlLCBjb250YWluZXIpIHtcbiAgdmFyIHN0eWxlID0geyBvdmVyZmxvdzogJ2hpZGRlbicgfTtcblxuICAvLyB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBhY3R1YWwgYHN0eWxlYCBoZXJlXG4gIC8vIGJlY2FzdWUgd2Ugd2lsbCBvdmVycmlkZSBpdFxuICBzdGF0ZS5zdHlsZSA9IHtcbiAgICBvdmVyZmxvdzogY29udGFpbmVyLnN0eWxlLm92ZXJmbG93LFxuICAgIHBhZGRpbmdSaWdodDogY29udGFpbmVyLnN0eWxlLnBhZGRpbmdSaWdodFxuICB9O1xuXG4gIGlmIChzdGF0ZS5vdmVyZmxvd2luZykge1xuICAgIC8vIHVzZSBjb21wdXRlZCBzdHlsZSwgaGVyZSB0byBnZXQgdGhlIHJlYWwgcGFkZGluZ1xuICAgIC8vIHRvIGFkZCBvdXIgc2Nyb2xsYmFyIHdpZHRoXG4gICAgc3R5bGUucGFkZGluZ1JpZ2h0ID0gcGFyc2VJbnQoKDAsIF9zdHlsZTIuZGVmYXVsdCkoY29udGFpbmVyLCAncGFkZGluZ1JpZ2h0JykgfHwgMCwgMTApICsgKDAsIF9zY3JvbGxiYXJTaXplMi5kZWZhdWx0KSgpICsgJ3B4JztcbiAgfVxuXG4gICgwLCBfc3R5bGUyLmRlZmF1bHQpKGNvbnRhaW5lciwgc3R5bGUpO1xufVxuXG5mdW5jdGlvbiByZW1vdmVDb250YWluZXJTdHlsZShfcmVmLCBjb250YWluZXIpIHtcbiAgdmFyIHN0eWxlID0gX3JlZi5zdHlsZTtcblxuXG4gIE9iamVjdC5rZXlzKHN0eWxlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gY29udGFpbmVyLnN0eWxlW2tleV0gPSBzdHlsZVtrZXldO1xuICB9KTtcbn1cbi8qKlxuICogUHJvcGVyIHN0YXRlIG1hbmFnbWVudCBmb3IgY29udGFpbmVycyBhbmQgdGhlIG1vZGFscyBpbiB0aG9zZSBjb250YWluZXJzLlxuICpcbiAqIEBpbnRlcm5hbCBVc2VkIGJ5IHRoZSBNb2RhbCB0byBlbnN1cmUgcHJvcGVyIHN0eWxpbmcgb2YgY29udGFpbmVycy5cbiAqL1xuXG52YXIgTW9kYWxNYW5hZ2VyID0gZnVuY3Rpb24gTW9kYWxNYW5hZ2VyKCkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gIHZhciBfcmVmMiA9IGFyZ3VtZW50cy5sZW5ndGggPD0gMCB8fCBhcmd1bWVudHNbMF0gPT09IHVuZGVmaW5lZCA/IHt9IDogYXJndW1lbnRzWzBdO1xuXG4gIHZhciBfcmVmMiRoaWRlU2libGluZ05vZGUgPSBfcmVmMi5oaWRlU2libGluZ05vZGVzO1xuICB2YXIgaGlkZVNpYmxpbmdOb2RlcyA9IF9yZWYyJGhpZGVTaWJsaW5nTm9kZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IF9yZWYyJGhpZGVTaWJsaW5nTm9kZTtcbiAgdmFyIF9yZWYyJGhhbmRsZUNvbnRhaW5lciA9IF9yZWYyLmhhbmRsZUNvbnRhaW5lck92ZXJmbG93O1xuICB2YXIgaGFuZGxlQ29udGFpbmVyT3ZlcmZsb3cgPSBfcmVmMiRoYW5kbGVDb250YWluZXIgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBfcmVmMiRoYW5kbGVDb250YWluZXI7XG5cbiAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIE1vZGFsTWFuYWdlcik7XG5cbiAgdGhpcy5hZGQgPSBmdW5jdGlvbiAobW9kYWwsIGNvbnRhaW5lciwgY2xhc3NOYW1lKSB7XG4gICAgdmFyIG1vZGFsSWR4ID0gX3RoaXMubW9kYWxzLmluZGV4T2YobW9kYWwpO1xuICAgIHZhciBjb250YWluZXJJZHggPSBfdGhpcy5jb250YWluZXJzLmluZGV4T2YoY29udGFpbmVyKTtcblxuICAgIGlmIChtb2RhbElkeCAhPT0gLTEpIHtcbiAgICAgIHJldHVybiBtb2RhbElkeDtcbiAgICB9XG5cbiAgICBtb2RhbElkeCA9IF90aGlzLm1vZGFscy5sZW5ndGg7XG4gICAgX3RoaXMubW9kYWxzLnB1c2gobW9kYWwpO1xuXG4gICAgaWYgKF90aGlzLmhpZGVTaWJsaW5nTm9kZXMpIHtcbiAgICAgICgwLCBfbWFuYWdlQXJpYUhpZGRlbi5oaWRlU2libGluZ3MpKGNvbnRhaW5lciwgbW9kYWwubW91bnROb2RlKTtcbiAgICB9XG5cbiAgICBpZiAoY29udGFpbmVySWR4ICE9PSAtMSkge1xuICAgICAgX3RoaXMuZGF0YVtjb250YWluZXJJZHhdLm1vZGFscy5wdXNoKG1vZGFsKTtcbiAgICAgIHJldHVybiBtb2RhbElkeDtcbiAgICB9XG5cbiAgICB2YXIgZGF0YSA9IHtcbiAgICAgIG1vZGFsczogW21vZGFsXSxcbiAgICAgIC8vcmlnaHQgbm93IG9ubHkgdGhlIGZpcnN0IG1vZGFsIG9mIGEgY29udGFpbmVyIHdpbGwgaGF2ZSBpdHMgY2xhc3NlcyBhcHBsaWVkXG4gICAgICBjbGFzc2VzOiBjbGFzc05hbWUgPyBjbGFzc05hbWUuc3BsaXQoL1xccysvKSA6IFtdLFxuXG4gICAgICBvdmVyZmxvd2luZzogKDAsIF9pc092ZXJmbG93aW5nMi5kZWZhdWx0KShjb250YWluZXIpXG4gICAgfTtcblxuICAgIGlmIChfdGhpcy5oYW5kbGVDb250YWluZXJPdmVyZmxvdykge1xuICAgICAgc2V0Q29udGFpbmVyU3R5bGUoZGF0YSwgY29udGFpbmVyKTtcbiAgICB9XG5cbiAgICBkYXRhLmNsYXNzZXMuZm9yRWFjaChfY2xhc3MyLmRlZmF1bHQuYWRkQ2xhc3MuYmluZChudWxsLCBjb250YWluZXIpKTtcblxuICAgIF90aGlzLmNvbnRhaW5lcnMucHVzaChjb250YWluZXIpO1xuICAgIF90aGlzLmRhdGEucHVzaChkYXRhKTtcblxuICAgIHJldHVybiBtb2RhbElkeDtcbiAgfTtcblxuICB0aGlzLnJlbW92ZSA9IGZ1bmN0aW9uIChtb2RhbCkge1xuICAgIHZhciBtb2RhbElkeCA9IF90aGlzLm1vZGFscy5pbmRleE9mKG1vZGFsKTtcblxuICAgIGlmIChtb2RhbElkeCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgY29udGFpbmVySWR4ID0gZmluZENvbnRhaW5lcihfdGhpcy5kYXRhLCBtb2RhbCk7XG4gICAgdmFyIGRhdGEgPSBfdGhpcy5kYXRhW2NvbnRhaW5lcklkeF07XG4gICAgdmFyIGNvbnRhaW5lciA9IF90aGlzLmNvbnRhaW5lcnNbY29udGFpbmVySWR4XTtcblxuICAgIGRhdGEubW9kYWxzLnNwbGljZShkYXRhLm1vZGFscy5pbmRleE9mKG1vZGFsKSwgMSk7XG5cbiAgICBfdGhpcy5tb2RhbHMuc3BsaWNlKG1vZGFsSWR4LCAxKTtcblxuICAgIC8vIGlmIHRoYXQgd2FzIHRoZSBsYXN0IG1vZGFsIGluIGEgY29udGFpbmVyLFxuICAgIC8vIGNsZWFuIHVwIHRoZSBjb250YWluZXJcbiAgICBpZiAoZGF0YS5tb2RhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBkYXRhLmNsYXNzZXMuZm9yRWFjaChfY2xhc3MyLmRlZmF1bHQucmVtb3ZlQ2xhc3MuYmluZChudWxsLCBjb250YWluZXIpKTtcblxuICAgICAgaWYgKF90aGlzLmhhbmRsZUNvbnRhaW5lck92ZXJmbG93KSB7XG4gICAgICAgIHJlbW92ZUNvbnRhaW5lclN0eWxlKGRhdGEsIGNvbnRhaW5lcik7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy5oaWRlU2libGluZ05vZGVzKSB7XG4gICAgICAgICgwLCBfbWFuYWdlQXJpYUhpZGRlbi5zaG93U2libGluZ3MpKGNvbnRhaW5lciwgbW9kYWwubW91bnROb2RlKTtcbiAgICAgIH1cbiAgICAgIF90aGlzLmNvbnRhaW5lcnMuc3BsaWNlKGNvbnRhaW5lcklkeCwgMSk7XG4gICAgICBfdGhpcy5kYXRhLnNwbGljZShjb250YWluZXJJZHgsIDEpO1xuICAgIH0gZWxzZSBpZiAoX3RoaXMuaGlkZVNpYmxpbmdOb2Rlcykge1xuICAgICAgLy9vdGhlcndpc2UgbWFrZSBzdXJlIHRoZSBuZXh0IHRvcCBtb2RhbCBpcyB2aXNpYmxlIHRvIGEgU1JcbiAgICAgICgwLCBfbWFuYWdlQXJpYUhpZGRlbi5hcmlhSGlkZGVuKShmYWxzZSwgZGF0YS5tb2RhbHNbZGF0YS5tb2RhbHMubGVuZ3RoIC0gMV0ubW91bnROb2RlKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5pc1RvcE1vZGFsID0gZnVuY3Rpb24gKG1vZGFsKSB7XG4gICAgcmV0dXJuICEhX3RoaXMubW9kYWxzLmxlbmd0aCAmJiBfdGhpcy5tb2RhbHNbX3RoaXMubW9kYWxzLmxlbmd0aCAtIDFdID09PSBtb2RhbDtcbiAgfTtcblxuICB0aGlzLmhpZGVTaWJsaW5nTm9kZXMgPSBoaWRlU2libGluZ05vZGVzO1xuICB0aGlzLmhhbmRsZUNvbnRhaW5lck92ZXJmbG93ID0gaGFuZGxlQ29udGFpbmVyT3ZlcmZsb3c7XG4gIHRoaXMubW9kYWxzID0gW107XG4gIHRoaXMuY29udGFpbmVycyA9IFtdO1xuICB0aGlzLmRhdGEgPSBbXTtcbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IE1vZGFsTWFuYWdlcjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9Qb3J0YWwgPSByZXF1aXJlKCcuL1BvcnRhbCcpO1xuXG52YXIgX1BvcnRhbDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Qb3J0YWwpO1xuXG52YXIgX1Bvc2l0aW9uID0gcmVxdWlyZSgnLi9Qb3NpdGlvbicpO1xuXG52YXIgX1Bvc2l0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1Bvc2l0aW9uKTtcblxudmFyIF9Sb290Q2xvc2VXcmFwcGVyID0gcmVxdWlyZSgnLi9Sb290Q2xvc2VXcmFwcGVyJyk7XG5cbnZhciBfUm9vdENsb3NlV3JhcHBlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9Sb290Q2xvc2VXcmFwcGVyKTtcblxudmFyIF9lbGVtZW50VHlwZSA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2VsZW1lbnRUeXBlJyk7XG5cbnZhciBfZWxlbWVudFR5cGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZWxlbWVudFR5cGUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIgaSBpbiBvYmopIHsgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7IHRhcmdldFtpXSA9IG9ialtpXTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuLyoqXG4gKiBCdWlsdCBvbiB0b3Agb2YgYDxQb3NpdGlvbi8+YCBhbmQgYDxQb3J0YWwvPmAsIHRoZSBvdmVybGF5IGNvbXBvbmVudCBpcyBncmVhdCBmb3IgY3VzdG9tIHRvb2x0aXAgb3ZlcmxheXMuXG4gKi9cbnZhciBPdmVybGF5ID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKE92ZXJsYXksIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIE92ZXJsYXkocHJvcHMsIGNvbnRleHQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgT3ZlcmxheSk7XG5cbiAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoT3ZlcmxheS5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKE92ZXJsYXkpKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICBfdGhpcy5oYW5kbGVIaWRkZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5zZXRTdGF0ZSh7IGV4aXRlZDogdHJ1ZSB9KTtcblxuICAgICAgaWYgKF90aGlzLnByb3BzLm9uRXhpdGVkKSB7XG4gICAgICAgIHZhciBfdGhpcyRwcm9wcztcblxuICAgICAgICAoX3RoaXMkcHJvcHMgPSBfdGhpcy5wcm9wcykub25FeGl0ZWQuYXBwbHkoX3RoaXMkcHJvcHMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnN0YXRlID0geyBleGl0ZWQ6ICFwcm9wcy5zaG93IH07XG4gICAgX3RoaXMub25IaWRkZW5MaXN0ZW5lciA9IF90aGlzLmhhbmRsZUhpZGRlbi5iaW5kKF90aGlzKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoT3ZlcmxheSwgW3tcbiAgICBrZXk6ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICAgIGlmIChuZXh0UHJvcHMuc2hvdykge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZXhpdGVkOiBmYWxzZSB9KTtcbiAgICAgIH0gZWxzZSBpZiAoIW5leHRQcm9wcy50cmFuc2l0aW9uKSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSBsZXQgaGFuZGxlSGlkZGVuIHRha2UgY2FyZSBvZiBtYXJraW5nIGV4aXRlZC5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGV4aXRlZDogdHJ1ZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZW5kZXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcztcbiAgICAgIHZhciBjb250YWluZXIgPSBfcHJvcHMuY29udGFpbmVyO1xuICAgICAgdmFyIGNvbnRhaW5lclBhZGRpbmcgPSBfcHJvcHMuY29udGFpbmVyUGFkZGluZztcbiAgICAgIHZhciB0YXJnZXQgPSBfcHJvcHMudGFyZ2V0O1xuICAgICAgdmFyIHBsYWNlbWVudCA9IF9wcm9wcy5wbGFjZW1lbnQ7XG4gICAgICB2YXIgc2hvdWxkVXBkYXRlUG9zaXRpb24gPSBfcHJvcHMuc2hvdWxkVXBkYXRlUG9zaXRpb247XG4gICAgICB2YXIgcm9vdENsb3NlID0gX3Byb3BzLnJvb3RDbG9zZTtcbiAgICAgIHZhciBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBUcmFuc2l0aW9uID0gX3Byb3BzLnRyYW5zaXRpb247XG5cbiAgICAgIHZhciBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMsIFsnY29udGFpbmVyJywgJ2NvbnRhaW5lclBhZGRpbmcnLCAndGFyZ2V0JywgJ3BsYWNlbWVudCcsICdzaG91bGRVcGRhdGVQb3NpdGlvbicsICdyb290Q2xvc2UnLCAnY2hpbGRyZW4nLCAndHJhbnNpdGlvbiddKTtcblxuICAgICAgLy8gRG9uJ3QgdW4tcmVuZGVyIHRoZSBvdmVybGF5IHdoaWxlIGl0J3MgdHJhbnNpdGlvbmluZyBvdXQuXG5cblxuICAgICAgdmFyIG1vdW50T3ZlcmxheSA9IHByb3BzLnNob3cgfHwgVHJhbnNpdGlvbiAmJiAhdGhpcy5zdGF0ZS5leGl0ZWQ7XG4gICAgICBpZiAoIW1vdW50T3ZlcmxheSkge1xuICAgICAgICAvLyBEb24ndCBib3RoZXIgc2hvd2luZyBhbnl0aGluZyBpZiB3ZSBkb24ndCBoYXZlIHRvLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIGNoaWxkID0gY2hpbGRyZW47XG5cbiAgICAgIC8vIFBvc2l0aW9uIGlzIGJlIGlubmVyLW1vc3QgYmVjYXVzZSBpdCBhZGRzIGlubGluZSBzdHlsZXMgaW50byB0aGUgY2hpbGQsXG4gICAgICAvLyB3aGljaCB0aGUgb3RoZXIgd3JhcHBlcnMgZG9uJ3QgZm9yd2FyZCBjb3JyZWN0bHkuXG4gICAgICBjaGlsZCA9IF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICBfUG9zaXRpb24yLmRlZmF1bHQsXG4gICAgICAgIHsgY29udGFpbmVyOiBjb250YWluZXIsIGNvbnRhaW5lclBhZGRpbmc6IGNvbnRhaW5lclBhZGRpbmcsIHRhcmdldDogdGFyZ2V0LCBwbGFjZW1lbnQ6IHBsYWNlbWVudCwgc2hvdWxkVXBkYXRlUG9zaXRpb246IHNob3VsZFVwZGF0ZVBvc2l0aW9uIH0sXG4gICAgICAgIGNoaWxkXG4gICAgICApO1xuXG4gICAgICBpZiAoVHJhbnNpdGlvbikge1xuICAgICAgICB2YXIgb25FeGl0ID0gcHJvcHMub25FeGl0O1xuICAgICAgICB2YXIgb25FeGl0aW5nID0gcHJvcHMub25FeGl0aW5nO1xuICAgICAgICB2YXIgb25FbnRlciA9IHByb3BzLm9uRW50ZXI7XG4gICAgICAgIHZhciBvbkVudGVyaW5nID0gcHJvcHMub25FbnRlcmluZztcbiAgICAgICAgdmFyIG9uRW50ZXJlZCA9IHByb3BzLm9uRW50ZXJlZDtcblxuICAgICAgICAvLyBUaGlzIGFuaW1hdGVzIHRoZSBjaGlsZCBub2RlIGJ5IGluamVjdGluZyBwcm9wcywgc28gaXQgbXVzdCBwcmVjZWRlXG4gICAgICAgIC8vIGFueXRoaW5nIHRoYXQgYWRkcyBhIHdyYXBwaW5nIGRpdi5cblxuICAgICAgICBjaGlsZCA9IF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgIFRyYW5zaXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgJ2luJzogcHJvcHMuc2hvdyxcbiAgICAgICAgICAgIHRyYW5zaXRpb25BcHBlYXI6IHRydWUsXG4gICAgICAgICAgICBvbkV4aXQ6IG9uRXhpdCxcbiAgICAgICAgICAgIG9uRXhpdGluZzogb25FeGl0aW5nLFxuICAgICAgICAgICAgb25FeGl0ZWQ6IHRoaXMub25IaWRkZW5MaXN0ZW5lcixcbiAgICAgICAgICAgIG9uRW50ZXI6IG9uRW50ZXIsXG4gICAgICAgICAgICBvbkVudGVyaW5nOiBvbkVudGVyaW5nLFxuICAgICAgICAgICAgb25FbnRlcmVkOiBvbkVudGVyZWRcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNoaWxkXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoaXMgZ29lcyBhZnRlciBldmVyeXRoaW5nIGVsc2UgYmVjYXVzZSBpdCBhZGRzIGEgd3JhcHBpbmcgZGl2LlxuICAgICAgaWYgKHJvb3RDbG9zZSkge1xuICAgICAgICBjaGlsZCA9IF9yZWFjdDIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KFxuICAgICAgICAgIF9Sb290Q2xvc2VXcmFwcGVyMi5kZWZhdWx0LFxuICAgICAgICAgIHsgb25Sb290Q2xvc2U6IHByb3BzLm9uSGlkZSB9LFxuICAgICAgICAgIGNoaWxkXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBfcmVhY3QyLmRlZmF1bHQuY3JlYXRlRWxlbWVudChcbiAgICAgICAgX1BvcnRhbDIuZGVmYXVsdCxcbiAgICAgICAgeyBjb250YWluZXI6IGNvbnRhaW5lciB9LFxuICAgICAgICBjaGlsZFxuICAgICAgKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gT3ZlcmxheTtcbn0oX3JlYWN0Mi5kZWZhdWx0LkNvbXBvbmVudCk7XG5cbk92ZXJsYXkucHJvcFR5cGVzID0gX2V4dGVuZHMoe30sIF9Qb3J0YWwyLmRlZmF1bHQucHJvcFR5cGVzLCBfUG9zaXRpb24yLmRlZmF1bHQucHJvcFR5cGVzLCB7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgT3ZlcmxheVxuICAgKi9cbiAgc2hvdzogX3Byb3BUeXBlczIuZGVmYXVsdC5ib29sLFxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoZXRoZXIgdGhlIG92ZXJsYXkgc2hvdWxkIHRyaWdnZXIgYG9uSGlkZWAgd2hlbiB0aGUgdXNlciBjbGlja3Mgb3V0c2lkZSB0aGUgb3ZlcmxheVxuICAgKi9cbiAgcm9vdENsb3NlOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmJvb2wsXG5cbiAgLyoqXG4gICAqIEEgQ2FsbGJhY2sgZmlyZWQgYnkgdGhlIE92ZXJsYXkgd2hlbiBpdCB3aXNoZXMgdG8gYmUgaGlkZGVuLlxuICAgKlxuICAgKiBfX3JlcXVpcmVkX18gd2hlbiBgcm9vdENsb3NlYCBpcyBgdHJ1ZWAuXG4gICAqXG4gICAqIEB0eXBlIGZ1bmNcbiAgICovXG4gIG9uSGlkZTogZnVuY3Rpb24gb25IaWRlKHByb3BzKSB7XG4gICAgdmFyIHByb3BUeXBlID0gX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jO1xuICAgIGlmIChwcm9wcy5yb290Q2xvc2UpIHtcbiAgICAgIHByb3BUeXBlID0gcHJvcFR5cGUuaXNSZXF1aXJlZDtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9wVHlwZS5hcHBseSh1bmRlZmluZWQsIFtwcm9wc10uY29uY2F0KGFyZ3MpKTtcbiAgfSxcblxuXG4gIC8qKlxuICAgKiBBIGA8VHJhbnNpdGlvbi8+YCBjb21wb25lbnQgdXNlZCB0byBhbmltYXRlIHRoZSBvdmVybGF5IGNoYW5nZXMgdmlzaWJpbGl0eS5cbiAgICovXG4gIHRyYW5zaXRpb246IF9lbGVtZW50VHlwZTIuZGVmYXVsdCxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYmVmb3JlIHRoZSBPdmVybGF5IHRyYW5zaXRpb25zIGluXG4gICAqL1xuICBvbkVudGVyOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFzIHRoZSBPdmVybGF5IGJlZ2lucyB0byB0cmFuc2l0aW9uIGluXG4gICAqL1xuICBvbkVudGVyaW5nOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBPdmVybGF5IGZpbmlzaGVzIHRyYW5zaXRpb25pbmcgaW5cbiAgICovXG4gIG9uRW50ZXJlZDogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCByaWdodCBiZWZvcmUgdGhlIE92ZXJsYXkgdHJhbnNpdGlvbnMgb3V0XG4gICAqL1xuICBvbkV4aXQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYXMgdGhlIE92ZXJsYXkgYmVnaW5zIHRvIHRyYW5zaXRpb24gb3V0XG4gICAqL1xuICBvbkV4aXRpbmc6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcblxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIE92ZXJsYXkgZmluaXNoZXMgdHJhbnNpdGlvbmluZyBvdXRcbiAgICovXG4gIG9uRXhpdGVkOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmNcbn0pO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBPdmVybGF5O1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX3JlYWN0RG9tID0gcmVxdWlyZSgncmVhY3QtZG9tJyk7XG5cbnZhciBfcmVhY3REb20yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3REb20pO1xuXG52YXIgX2NvbXBvbmVudE9yRWxlbWVudCA9IHJlcXVpcmUoJ3JlYWN0LXByb3AtdHlwZXMvbGliL2NvbXBvbmVudE9yRWxlbWVudCcpO1xuXG52YXIgX2NvbXBvbmVudE9yRWxlbWVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb21wb25lbnRPckVsZW1lbnQpO1xuXG52YXIgX293bmVyRG9jdW1lbnQgPSByZXF1aXJlKCcuL3V0aWxzL293bmVyRG9jdW1lbnQnKTtcblxudmFyIF9vd25lckRvY3VtZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX293bmVyRG9jdW1lbnQpO1xuXG52YXIgX2dldENvbnRhaW5lciA9IHJlcXVpcmUoJy4vdXRpbHMvZ2V0Q29udGFpbmVyJyk7XG5cbnZhciBfZ2V0Q29udGFpbmVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2dldENvbnRhaW5lcik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuLyoqXG4gKiBUaGUgYDxQb3J0YWwvPmAgY29tcG9uZW50IHJlbmRlcnMgaXRzIGNoaWxkcmVuIGludG8gYSBuZXcgXCJzdWJ0cmVlXCIgb3V0c2lkZSBvZiBjdXJyZW50IGNvbXBvbmVudCBoaWVyYXJjaHkuXG4gKiBZb3UgY2FuIHRoaW5rIG9mIGl0IGFzIGEgZGVjbGFyYXRpdmUgYGFwcGVuZENoaWxkKClgLCBvciBqUXVlcnkncyBgJC5mbi5hcHBlbmRUbygpYC5cbiAqIFRoZSBjaGlsZHJlbiBvZiBgPFBvcnRhbC8+YCBjb21wb25lbnQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgYGNvbnRhaW5lcmAgc3BlY2lmaWVkLlxuICovXG52YXIgUG9ydGFsID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFBvcnRhbCwgX1JlYWN0JENvbXBvbmVudCk7XG5cbiAgZnVuY3Rpb24gUG9ydGFsKCkge1xuICAgIHZhciBfcmVmO1xuXG4gICAgdmFyIF90ZW1wLCBfdGhpcywgX3JldDtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQb3J0YWwpO1xuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIF9yZXQgPSAoX3RlbXAgPSAoX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoX3JlZiA9IFBvcnRhbC5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKFBvcnRhbCkpLmNhbGwuYXBwbHkoX3JlZiwgW3RoaXNdLmNvbmNhdChhcmdzKSkpLCBfdGhpcyksIF90aGlzLl9tb3VudE92ZXJsYXlUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzLl9vdmVybGF5VGFyZ2V0KSB7XG4gICAgICAgIF90aGlzLl9vdmVybGF5VGFyZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIF90aGlzLl9wb3J0YWxDb250YWluZXJOb2RlID0gKDAsIF9nZXRDb250YWluZXIyLmRlZmF1bHQpKF90aGlzLnByb3BzLmNvbnRhaW5lciwgKDAsIF9vd25lckRvY3VtZW50Mi5kZWZhdWx0KShfdGhpcykuYm9keSk7XG4gICAgICAgIF90aGlzLl9wb3J0YWxDb250YWluZXJOb2RlLmFwcGVuZENoaWxkKF90aGlzLl9vdmVybGF5VGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9LCBfdGhpcy5fdW5tb3VudE92ZXJsYXlUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuX292ZXJsYXlUYXJnZXQpIHtcbiAgICAgICAgX3RoaXMuX3BvcnRhbENvbnRhaW5lck5vZGUucmVtb3ZlQ2hpbGQoX3RoaXMuX292ZXJsYXlUYXJnZXQpO1xuICAgICAgICBfdGhpcy5fb3ZlcmxheVRhcmdldCA9IG51bGw7XG4gICAgICB9XG4gICAgICBfdGhpcy5fcG9ydGFsQ29udGFpbmVyTm9kZSA9IG51bGw7XG4gICAgfSwgX3RoaXMuX3JlbmRlck92ZXJsYXkgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgIHZhciBvdmVybGF5ID0gIV90aGlzLnByb3BzLmNoaWxkcmVuID8gbnVsbCA6IF9yZWFjdDIuZGVmYXVsdC5DaGlsZHJlbi5vbmx5KF90aGlzLnByb3BzLmNoaWxkcmVuKTtcblxuICAgICAgLy8gU2F2ZSByZWZlcmVuY2UgZm9yIGZ1dHVyZSBhY2Nlc3MuXG4gICAgICBpZiAob3ZlcmxheSAhPT0gbnVsbCkge1xuICAgICAgICBfdGhpcy5fbW91bnRPdmVybGF5VGFyZ2V0KCk7XG4gICAgICAgIF90aGlzLl9vdmVybGF5SW5zdGFuY2UgPSBfcmVhY3REb20yLmRlZmF1bHQudW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIoX3RoaXMsIG92ZXJsYXksIF90aGlzLl9vdmVybGF5VGFyZ2V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVucmVuZGVyIGlmIHRoZSBjb21wb25lbnQgaXMgbnVsbCBmb3IgdHJhbnNpdGlvbnMgdG8gbnVsbFxuICAgICAgICBfdGhpcy5fdW5yZW5kZXJPdmVybGF5KCk7XG4gICAgICAgIF90aGlzLl91bm1vdW50T3ZlcmxheVRhcmdldCgpO1xuICAgICAgfVxuICAgIH0sIF90aGlzLl91bnJlbmRlck92ZXJsYXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMuX292ZXJsYXlUYXJnZXQpIHtcbiAgICAgICAgX3JlYWN0RG9tMi5kZWZhdWx0LnVubW91bnRDb21wb25lbnRBdE5vZGUoX3RoaXMuX292ZXJsYXlUYXJnZXQpO1xuICAgICAgICBfdGhpcy5fb3ZlcmxheUluc3RhbmNlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9LCBfdGhpcy5nZXRNb3VudE5vZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuX292ZXJsYXlUYXJnZXQ7XG4gICAgfSwgX3RoaXMuZ2V0T3ZlcmxheURPTU5vZGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoIV90aGlzLl9pc01vdW50ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdnZXRPdmVybGF5RE9NTm9kZSgpOiBBIGNvbXBvbmVudCBtdXN0IGJlIG1vdW50ZWQgdG8gaGF2ZSBhIERPTSBub2RlLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMuX292ZXJsYXlJbnN0YW5jZSkge1xuICAgICAgICByZXR1cm4gX3JlYWN0RG9tMi5kZWZhdWx0LmZpbmRET01Ob2RlKF90aGlzLl9vdmVybGF5SW5zdGFuY2UpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LCBfdGVtcCksIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKF90aGlzLCBfcmV0KTtcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhQb3J0YWwsIFt7XG4gICAga2V5OiAnY29tcG9uZW50RGlkTW91bnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgIHRoaXMuX2lzTW91bnRlZCA9IHRydWU7XG4gICAgICB0aGlzLl9yZW5kZXJPdmVybGF5KCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnY29tcG9uZW50RGlkVXBkYXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgdGhpcy5fcmVuZGVyT3ZlcmxheSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgaWYgKHRoaXMuX292ZXJsYXlUYXJnZXQgJiYgbmV4dFByb3BzLmNvbnRhaW5lciAhPT0gdGhpcy5wcm9wcy5jb250YWluZXIpIHtcbiAgICAgICAgdGhpcy5fcG9ydGFsQ29udGFpbmVyTm9kZS5yZW1vdmVDaGlsZCh0aGlzLl9vdmVybGF5VGFyZ2V0KTtcbiAgICAgICAgdGhpcy5fcG9ydGFsQ29udGFpbmVyTm9kZSA9ICgwLCBfZ2V0Q29udGFpbmVyMi5kZWZhdWx0KShuZXh0UHJvcHMuY29udGFpbmVyLCAoMCwgX293bmVyRG9jdW1lbnQyLmRlZmF1bHQpKHRoaXMpLmJvZHkpO1xuICAgICAgICB0aGlzLl9wb3J0YWxDb250YWluZXJOb2RlLmFwcGVuZENoaWxkKHRoaXMuX292ZXJsYXlUYXJnZXQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudFdpbGxVbm1vdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICB0aGlzLl9pc01vdW50ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3VucmVuZGVyT3ZlcmxheSgpO1xuICAgICAgdGhpcy5fdW5tb3VudE92ZXJsYXlUYXJnZXQoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdyZW5kZXInLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUG9ydGFsO1xufShfcmVhY3QyLmRlZmF1bHQuQ29tcG9uZW50KTtcblxuUG9ydGFsLmRpc3BsYXlOYW1lID0gJ1BvcnRhbCc7XG5Qb3J0YWwucHJvcFR5cGVzID0ge1xuICAvKipcbiAgICogQSBOb2RlLCBDb21wb25lbnQgaW5zdGFuY2UsIG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBlaXRoZXIuIFRoZSBgY29udGFpbmVyYCB3aWxsIGhhdmUgdGhlIFBvcnRhbCBjaGlsZHJlblxuICAgKiBhcHBlbmRlZCB0byBpdC5cbiAgICovXG4gIGNvbnRhaW5lcjogX3Byb3BUeXBlczIuZGVmYXVsdC5vbmVPZlR5cGUoW19jb21wb25lbnRPckVsZW1lbnQyLmRlZmF1bHQsIF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuY10pXG59O1xuZXhwb3J0cy5kZWZhdWx0ID0gUG9ydGFsO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9yZWFjdERvbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuXG52YXIgX3JlYWN0RG9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0RG9tKTtcblxudmFyIF9jb21wb25lbnRPckVsZW1lbnQgPSByZXF1aXJlKCdyZWFjdC1wcm9wLXR5cGVzL2xpYi9jb21wb25lbnRPckVsZW1lbnQnKTtcblxudmFyIF9jb21wb25lbnRPckVsZW1lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY29tcG9uZW50T3JFbGVtZW50KTtcblxudmFyIF9jYWxjdWxhdGVQb3NpdGlvbiA9IHJlcXVpcmUoJy4vdXRpbHMvY2FsY3VsYXRlUG9zaXRpb24nKTtcblxudmFyIF9jYWxjdWxhdGVQb3NpdGlvbjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jYWxjdWxhdGVQb3NpdGlvbik7XG5cbnZhciBfZ2V0Q29udGFpbmVyID0gcmVxdWlyZSgnLi91dGlscy9nZXRDb250YWluZXInKTtcblxudmFyIF9nZXRDb250YWluZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2V0Q29udGFpbmVyKTtcblxudmFyIF9vd25lckRvY3VtZW50ID0gcmVxdWlyZSgnLi91dGlscy9vd25lckRvY3VtZW50Jyk7XG5cbnZhciBfb3duZXJEb2N1bWVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vd25lckRvY3VtZW50KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbi8qKlxuICogVGhlIFBvc2l0aW9uIGNvbXBvbmVudCBjYWxjdWxhdGVzIHRoZSBjb29yZGluYXRlcyBmb3IgaXRzIGNoaWxkLCB0byBwb3NpdGlvblxuICogaXQgcmVsYXRpdmUgdG8gYSBgdGFyZ2V0YCBjb21wb25lbnQgb3Igbm9kZS4gVXNlZnVsIGZvciBjcmVhdGluZyBjYWxsb3V0c1xuICogYW5kIHRvb2x0aXBzLCB0aGUgUG9zaXRpb24gY29tcG9uZW50IGluamVjdHMgYSBgc3R5bGVgIHByb3BzIHdpdGggYGxlZnRgIGFuZFxuICogYHRvcGAgdmFsdWVzIGZvciBwb3NpdGlvbmluZyB5b3VyIGNvbXBvbmVudC5cbiAqXG4gKiBJdCBhbHNvIGluamVjdHMgXCJhcnJvd1wiIGBsZWZ0YCwgYW5kIGB0b3BgIHZhbHVlcyBmb3Igc3R5bGluZyBjYWxsb3V0IGFycm93c1xuICogZm9yIGdpdmluZyB5b3VyIGNvbXBvbmVudHMgYSBzZW5zZSBvZiBkaXJlY3Rpb25hbGl0eS5cbiAqL1xudmFyIFBvc2l0aW9uID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFBvc2l0aW9uLCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICBmdW5jdGlvbiBQb3NpdGlvbihwcm9wcywgY29udGV4dCkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBQb3NpdGlvbik7XG5cbiAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoUG9zaXRpb24uX19wcm90b19fIHx8IE9iamVjdC5nZXRQcm90b3R5cGVPZihQb3NpdGlvbikpLmNhbGwodGhpcywgcHJvcHMsIGNvbnRleHQpKTtcblxuICAgIF90aGlzLmdldFRhcmdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBfdGhpcy5wcm9wcy50YXJnZXQ7XG5cbiAgICAgIHZhciB0YXJnZXRFbGVtZW50ID0gdHlwZW9mIHRhcmdldCA9PT0gJ2Z1bmN0aW9uJyA/IHRhcmdldCgpIDogdGFyZ2V0O1xuICAgICAgcmV0dXJuIHRhcmdldEVsZW1lbnQgJiYgX3JlYWN0RG9tMi5kZWZhdWx0LmZpbmRET01Ob2RlKHRhcmdldEVsZW1lbnQpIHx8IG51bGw7XG4gICAgfTtcblxuICAgIF90aGlzLm1heWJlVXBkYXRlUG9zaXRpb24gPSBmdW5jdGlvbiAocGxhY2VtZW50Q2hhbmdlZCkge1xuICAgICAgdmFyIHRhcmdldCA9IF90aGlzLmdldFRhcmdldCgpO1xuXG4gICAgICBpZiAoIV90aGlzLnByb3BzLnNob3VsZFVwZGF0ZVBvc2l0aW9uICYmIHRhcmdldCA9PT0gX3RoaXMuX2xhc3RUYXJnZXQgJiYgIXBsYWNlbWVudENoYW5nZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpcy51cGRhdGVQb3NpdGlvbih0YXJnZXQpO1xuICAgIH07XG5cbiAgICBfdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHBvc2l0aW9uTGVmdDogMCxcbiAgICAgIHBvc2l0aW9uVG9wOiAwLFxuICAgICAgYXJyb3dPZmZzZXRMZWZ0OiBudWxsLFxuICAgICAgYXJyb3dPZmZzZXRUb3A6IG51bGxcbiAgICB9O1xuXG4gICAgX3RoaXMuX25lZWRzRmx1c2ggPSBmYWxzZTtcbiAgICBfdGhpcy5fbGFzdFRhcmdldCA9IG51bGw7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgX2NyZWF0ZUNsYXNzKFBvc2l0aW9uLCBbe1xuICAgIGtleTogJ2NvbXBvbmVudERpZE1vdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKHRoaXMuZ2V0VGFyZ2V0KCkpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCkge1xuICAgICAgdGhpcy5fbmVlZHNGbHVzaCA9IHRydWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnY29tcG9uZW50RGlkVXBkYXRlJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcykge1xuICAgICAgaWYgKHRoaXMuX25lZWRzRmx1c2gpIHtcbiAgICAgICAgdGhpcy5fbmVlZHNGbHVzaCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1heWJlVXBkYXRlUG9zaXRpb24odGhpcy5wcm9wcy5wbGFjZW1lbnQgIT09IHByZXZQcm9wcy5wbGFjZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlbmRlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfcHJvcHMgPSB0aGlzLnByb3BzO1xuICAgICAgdmFyIGNoaWxkcmVuID0gX3Byb3BzLmNoaWxkcmVuO1xuICAgICAgdmFyIGNsYXNzTmFtZSA9IF9wcm9wcy5jbGFzc05hbWU7XG5cbiAgICAgIHZhciBwcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMsIFsnY2hpbGRyZW4nLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgICB2YXIgX3N0YXRlID0gdGhpcy5zdGF0ZTtcbiAgICAgIHZhciBwb3NpdGlvbkxlZnQgPSBfc3RhdGUucG9zaXRpb25MZWZ0O1xuICAgICAgdmFyIHBvc2l0aW9uVG9wID0gX3N0YXRlLnBvc2l0aW9uVG9wO1xuXG4gICAgICB2YXIgYXJyb3dQb3NpdGlvbiA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfc3RhdGUsIFsncG9zaXRpb25MZWZ0JywgJ3Bvc2l0aW9uVG9wJ10pO1xuXG4gICAgICAvLyBUaGVzZSBzaG91bGQgbm90IGJlIGZvcndhcmRlZCB0byB0aGUgY2hpbGQuXG5cblxuICAgICAgZGVsZXRlIHByb3BzLnRhcmdldDtcbiAgICAgIGRlbGV0ZSBwcm9wcy5jb250YWluZXI7XG4gICAgICBkZWxldGUgcHJvcHMuY29udGFpbmVyUGFkZGluZztcbiAgICAgIGRlbGV0ZSBwcm9wcy5zaG91bGRVcGRhdGVQb3NpdGlvbjtcblxuICAgICAgdmFyIGNoaWxkID0gX3JlYWN0Mi5kZWZhdWx0LkNoaWxkcmVuLm9ubHkoY2hpbGRyZW4pO1xuICAgICAgcmV0dXJuICgwLCBfcmVhY3QuY2xvbmVFbGVtZW50KShjaGlsZCwgX2V4dGVuZHMoe30sIHByb3BzLCBhcnJvd1Bvc2l0aW9uLCB7XG4gICAgICAgIC8vIEZJWE1FOiBEb24ndCBmb3J3YXJkIGBwb3NpdGlvbkxlZnRgIGFuZCBgcG9zaXRpb25Ub3BgIHZpYSBib3RoIHByb3BzXG4gICAgICAgIC8vIGFuZCBgcHJvcHMuc3R5bGVgLlxuICAgICAgICBwb3NpdGlvbkxlZnQ6IHBvc2l0aW9uTGVmdCxcbiAgICAgICAgcG9zaXRpb25Ub3A6IHBvc2l0aW9uVG9wLFxuICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lczIuZGVmYXVsdCkoY2xhc3NOYW1lLCBjaGlsZC5wcm9wcy5jbGFzc05hbWUpLFxuICAgICAgICBzdHlsZTogX2V4dGVuZHMoe30sIGNoaWxkLnByb3BzLnN0eWxlLCB7XG4gICAgICAgICAgbGVmdDogcG9zaXRpb25MZWZ0LFxuICAgICAgICAgIHRvcDogcG9zaXRpb25Ub3BcbiAgICAgICAgfSlcbiAgICAgIH0pKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICd1cGRhdGVQb3NpdGlvbicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZVBvc2l0aW9uKHRhcmdldCkge1xuICAgICAgdGhpcy5fbGFzdFRhcmdldCA9IHRhcmdldDtcblxuICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcG9zaXRpb25MZWZ0OiAwLFxuICAgICAgICAgIHBvc2l0aW9uVG9wOiAwLFxuICAgICAgICAgIGFycm93T2Zmc2V0TGVmdDogbnVsbCxcbiAgICAgICAgICBhcnJvd09mZnNldFRvcDogbnVsbFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBvdmVybGF5ID0gX3JlYWN0RG9tMi5kZWZhdWx0LmZpbmRET01Ob2RlKHRoaXMpO1xuICAgICAgdmFyIGNvbnRhaW5lciA9ICgwLCBfZ2V0Q29udGFpbmVyMi5kZWZhdWx0KSh0aGlzLnByb3BzLmNvbnRhaW5lciwgKDAsIF9vd25lckRvY3VtZW50Mi5kZWZhdWx0KSh0aGlzKS5ib2R5KTtcblxuICAgICAgdGhpcy5zZXRTdGF0ZSgoMCwgX2NhbGN1bGF0ZVBvc2l0aW9uMi5kZWZhdWx0KSh0aGlzLnByb3BzLnBsYWNlbWVudCwgb3ZlcmxheSwgdGFyZ2V0LCBjb250YWluZXIsIHRoaXMucHJvcHMuY29udGFpbmVyUGFkZGluZykpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQb3NpdGlvbjtcbn0oX3JlYWN0Mi5kZWZhdWx0LkNvbXBvbmVudCk7XG5cblBvc2l0aW9uLnByb3BUeXBlcyA9IHtcbiAgLyoqXG4gICAqIEEgbm9kZSwgZWxlbWVudCwgb3IgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGVpdGhlci4gVGhlIGNoaWxkIHdpbGwgYmVcbiAgICogYmUgcG9zaXRpb25lZCBuZXh0IHRvIHRoZSBgdGFyZ2V0YCBzcGVjaWZpZWQuXG4gICAqL1xuICB0YXJnZXQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQub25lT2ZUeXBlKFtfY29tcG9uZW50T3JFbGVtZW50Mi5kZWZhdWx0LCBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmNdKSxcblxuICAvKipcbiAgICogXCJvZmZzZXRQYXJlbnRcIiBvZiB0aGUgY29tcG9uZW50XG4gICAqL1xuICBjb250YWluZXI6IF9wcm9wVHlwZXMyLmRlZmF1bHQub25lT2ZUeXBlKFtfY29tcG9uZW50T3JFbGVtZW50Mi5kZWZhdWx0LCBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmNdKSxcbiAgLyoqXG4gICAqIE1pbmltdW0gc3BhY2luZyBpbiBwaXhlbHMgYmV0d2VlbiBjb250YWluZXIgYm9yZGVyIGFuZCBjb21wb25lbnQgYm9yZGVyXG4gICAqL1xuICBjb250YWluZXJQYWRkaW5nOiBfcHJvcFR5cGVzMi5kZWZhdWx0Lm51bWJlcixcbiAgLyoqXG4gICAqIEhvdyB0byBwb3NpdGlvbiB0aGUgY29tcG9uZW50IHJlbGF0aXZlIHRvIHRoZSB0YXJnZXRcbiAgICovXG4gIHBsYWNlbWVudDogX3Byb3BUeXBlczIuZGVmYXVsdC5vbmVPZihbJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddKSxcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBvc2l0aW9uIHNob3VsZCBiZSBjaGFuZ2VkIG9uIGVhY2ggdXBkYXRlXG4gICAqL1xuICBzaG91bGRVcGRhdGVQb3NpdGlvbjogX3Byb3BUeXBlczIuZGVmYXVsdC5ib29sXG59O1xuXG5Qb3NpdGlvbi5kaXNwbGF5TmFtZSA9ICdQb3NpdGlvbic7XG5cblBvc2l0aW9uLmRlZmF1bHRQcm9wcyA9IHtcbiAgY29udGFpbmVyUGFkZGluZzogMCxcbiAgcGxhY2VtZW50OiAncmlnaHQnLFxuICBzaG91bGRVcGRhdGVQb3NpdGlvbjogZmFsc2Vcbn07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFBvc2l0aW9uO1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG52YXIgX2NvbnRhaW5zID0gcmVxdWlyZSgnZG9tLWhlbHBlcnMvcXVlcnkvY29udGFpbnMnKTtcblxudmFyIF9jb250YWluczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb250YWlucyk7XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9wcm9wVHlwZXMgPSByZXF1aXJlKCdwcm9wLXR5cGVzJyk7XG5cbnZhciBfcHJvcFR5cGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Byb3BUeXBlcyk7XG5cbnZhciBfcmVhY3REb20gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcblxudmFyIF9yZWFjdERvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdERvbSk7XG5cbnZhciBfYWRkRXZlbnRMaXN0ZW5lciA9IHJlcXVpcmUoJy4vdXRpbHMvYWRkRXZlbnRMaXN0ZW5lcicpO1xuXG52YXIgX2FkZEV2ZW50TGlzdGVuZXIyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYWRkRXZlbnRMaXN0ZW5lcik7XG5cbnZhciBfb3duZXJEb2N1bWVudCA9IHJlcXVpcmUoJy4vdXRpbHMvb3duZXJEb2N1bWVudCcpO1xuXG52YXIgX293bmVyRG9jdW1lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb3duZXJEb2N1bWVudCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxudmFyIGVzY2FwZUtleUNvZGUgPSAyNztcblxuZnVuY3Rpb24gaXNMZWZ0Q2xpY2tFdmVudChldmVudCkge1xuICByZXR1cm4gZXZlbnQuYnV0dG9uID09PSAwO1xufVxuXG5mdW5jdGlvbiBpc01vZGlmaWVkRXZlbnQoZXZlbnQpIHtcbiAgcmV0dXJuICEhKGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuYWx0S2V5IHx8IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQuc2hpZnRLZXkpO1xufVxuXG4vKipcbiAqIFRoZSBgPFJvb3RDbG9zZVdyYXBwZXIvPmAgY29tcG9uZW50IHJlZ2lzdGVycyB5b3VyIGNhbGxiYWNrIG9uIHRoZSBkb2N1bWVudFxuICogd2hlbiByZW5kZXJlZC4gUG93ZXJzIHRoZSBgPE92ZXJsYXkvPmAgY29tcG9uZW50LiBUaGlzIGlzIHVzZWQgYWNoaWV2ZSBtb2RhbFxuICogc3R5bGUgYmVoYXZpb3Igd2hlcmUgeW91ciBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciB0cmllcyB0b1xuICogaW50ZXJhY3Qgd2l0aCB0aGUgcmVzdCBvZiB0aGUgZG9jdW1lbnQgb3IgaGl0cyB0aGUgYGVzY2Aga2V5LlxuICovXG5cbnZhciBSb290Q2xvc2VXcmFwcGVyID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFJvb3RDbG9zZVdyYXBwZXIsIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFJvb3RDbG9zZVdyYXBwZXIocHJvcHMsIGNvbnRleHQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgUm9vdENsb3NlV3JhcHBlcik7XG5cbiAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoUm9vdENsb3NlV3JhcHBlci5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKFJvb3RDbG9zZVdyYXBwZXIpKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICBfdGhpcy5hZGRFdmVudExpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBldmVudCA9IF90aGlzLnByb3BzLmV2ZW50O1xuXG4gICAgICB2YXIgZG9jID0gKDAsIF9vd25lckRvY3VtZW50Mi5kZWZhdWx0KShfdGhpcyk7XG5cbiAgICAgIC8vIFVzZSBjYXB0dXJlIGZvciB0aGlzIGxpc3RlbmVyIHNvIGl0IGZpcmVzIGJlZm9yZSBSZWFjdCdzIGxpc3RlbmVyLCB0b1xuICAgICAgLy8gYXZvaWQgZmFsc2UgcG9zaXRpdmVzIGluIHRoZSBjb250YWlucygpIGNoZWNrIGJlbG93IGlmIHRoZSB0YXJnZXQgRE9NXG4gICAgICAvLyBlbGVtZW50IGlzIHJlbW92ZWQgaW4gdGhlIFJlYWN0IG1vdXNlIGNhbGxiYWNrLlxuICAgICAgX3RoaXMuZG9jdW1lbnRNb3VzZUNhcHR1cmVMaXN0ZW5lciA9ICgwLCBfYWRkRXZlbnRMaXN0ZW5lcjIuZGVmYXVsdCkoZG9jLCBldmVudCwgX3RoaXMuaGFuZGxlTW91c2VDYXB0dXJlLCB0cnVlKTtcblxuICAgICAgX3RoaXMuZG9jdW1lbnRNb3VzZUxpc3RlbmVyID0gKDAsIF9hZGRFdmVudExpc3RlbmVyMi5kZWZhdWx0KShkb2MsIGV2ZW50LCBfdGhpcy5oYW5kbGVNb3VzZSk7XG5cbiAgICAgIF90aGlzLmRvY3VtZW50S2V5dXBMaXN0ZW5lciA9ICgwLCBfYWRkRXZlbnRMaXN0ZW5lcjIuZGVmYXVsdCkoZG9jLCAna2V5dXAnLCBfdGhpcy5oYW5kbGVLZXlVcCk7XG4gICAgfTtcblxuICAgIF90aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKF90aGlzLmRvY3VtZW50TW91c2VDYXB0dXJlTGlzdGVuZXIpIHtcbiAgICAgICAgX3RoaXMuZG9jdW1lbnRNb3VzZUNhcHR1cmVMaXN0ZW5lci5yZW1vdmUoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzLmRvY3VtZW50TW91c2VMaXN0ZW5lcikge1xuICAgICAgICBfdGhpcy5kb2N1bWVudE1vdXNlTGlzdGVuZXIucmVtb3ZlKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpcy5kb2N1bWVudEtleXVwTGlzdGVuZXIpIHtcbiAgICAgICAgX3RoaXMuZG9jdW1lbnRLZXl1cExpc3RlbmVyLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5oYW5kbGVNb3VzZUNhcHR1cmUgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgX3RoaXMucHJldmVudE1vdXNlUm9vdENsb3NlID0gaXNNb2RpZmllZEV2ZW50KGUpIHx8ICFpc0xlZnRDbGlja0V2ZW50KGUpIHx8ICgwLCBfY29udGFpbnMyLmRlZmF1bHQpKF9yZWFjdERvbTIuZGVmYXVsdC5maW5kRE9NTm9kZShfdGhpcyksIGUudGFyZ2V0KTtcbiAgICB9O1xuXG4gICAgX3RoaXMuaGFuZGxlTW91c2UgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCFfdGhpcy5wcmV2ZW50TW91c2VSb290Q2xvc2UgJiYgX3RoaXMucHJvcHMub25Sb290Q2xvc2UpIHtcbiAgICAgICAgX3RoaXMucHJvcHMub25Sb290Q2xvc2UoZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLmhhbmRsZUtleVVwID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmIChlLmtleUNvZGUgPT09IGVzY2FwZUtleUNvZGUgJiYgX3RoaXMucHJvcHMub25Sb290Q2xvc2UpIHtcbiAgICAgICAgX3RoaXMucHJvcHMub25Sb290Q2xvc2UoZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF90aGlzLnByZXZlbnRNb3VzZVJvb3RDbG9zZSA9IGZhbHNlO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIF9jcmVhdGVDbGFzcyhSb290Q2xvc2VXcmFwcGVyLCBbe1xuICAgIGtleTogJ2NvbXBvbmVudERpZE1vdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICBpZiAoIXRoaXMucHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVycygpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudERpZFVwZGF0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICAgIGlmICghdGhpcy5wcm9wcy5kaXNhYmxlZCAmJiBwcmV2UHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVycygpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnByb3BzLmRpc2FibGVkICYmICFwcmV2UHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudFdpbGxVbm1vdW50JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICBpZiAoIXRoaXMucHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3JlbmRlcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBSb290Q2xvc2VXcmFwcGVyO1xufShfcmVhY3QyLmRlZmF1bHQuQ29tcG9uZW50KTtcblxuUm9vdENsb3NlV3JhcHBlci5kaXNwbGF5TmFtZSA9ICdSb290Q2xvc2VXcmFwcGVyJztcblxuUm9vdENsb3NlV3JhcHBlci5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciBjbGljayBvciBtb3VzZWRvd24uIEFsc28gdHJpZ2dlcnMgd2hlbiB1c2VyIGhpdHMgYGVzY2AuXG4gICAqL1xuICBvblJvb3RDbG9zZTogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuICAvKipcbiAgICogQ2hpbGRyZW4gdG8gcmVuZGVyLlxuICAgKi9cbiAgY2hpbGRyZW46IF9wcm9wVHlwZXMyLmRlZmF1bHQuZWxlbWVudCxcbiAgLyoqXG4gICAqIERpc2FibGUgdGhlIHRoZSBSb290Q2xvc2VXcmFwcGVyLCBwcmV2ZW50aW5nIGl0IGZyb20gdHJpZ2dlcmluZyBgb25Sb290Q2xvc2VgLlxuICAgKi9cbiAgZGlzYWJsZWQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbCxcbiAgLyoqXG4gICAqIENob29zZSB3aGljaCBkb2N1bWVudCBtb3VzZSBldmVudCB0byBiaW5kIHRvLlxuICAgKi9cbiAgZXZlbnQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQub25lT2YoWydjbGljaycsICdtb3VzZWRvd24nXSlcbn07XG5cblJvb3RDbG9zZVdyYXBwZXIuZGVmYXVsdFByb3BzID0ge1xuICBldmVudDogJ2NsaWNrJ1xufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gUm9vdENsb3NlV3JhcHBlcjtcbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuRVhJVElORyA9IGV4cG9ydHMuRU5URVJFRCA9IGV4cG9ydHMuRU5URVJJTkcgPSBleHBvcnRzLkVYSVRFRCA9IGV4cG9ydHMuVU5NT1VOVEVEID0gdW5kZWZpbmVkO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG52YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgeyBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpOyB9IH0gcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsgaWYgKHByb3RvUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfTsgfSgpO1xuXG52YXIgX2NsYXNzbmFtZXMgPSByZXF1aXJlKCdjbGFzc25hbWVzJyk7XG5cbnZhciBfY2xhc3NuYW1lczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jbGFzc25hbWVzKTtcblxudmFyIF9vbiA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL2V2ZW50cy9vbicpO1xuXG52YXIgX29uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29uKTtcblxudmFyIF9wcm9wZXJ0aWVzID0gcmVxdWlyZSgnZG9tLWhlbHBlcnMvdHJhbnNpdGlvbi9wcm9wZXJ0aWVzJyk7XG5cbnZhciBfcHJvcGVydGllczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wZXJ0aWVzKTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxudmFyIF9yZWFjdERvbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuXG52YXIgX3JlYWN0RG9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0RG9tKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG9iaiwga2V5cykgeyB2YXIgdGFyZ2V0ID0ge307IGZvciAodmFyIGkgaW4gb2JqKSB7IGlmIChrZXlzLmluZGV4T2YoaSkgPj0gMCkgY29udGludWU7IGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgaSkpIGNvbnRpbnVlOyB0YXJnZXRbaV0gPSBvYmpbaV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG5mdW5jdGlvbiBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybihzZWxmLCBjYWxsKSB7IGlmICghc2VsZikgeyB0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7IH0gcmV0dXJuIGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpID8gY2FsbCA6IHNlbGY7IH1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgXCIgKyB0eXBlb2Ygc3VwZXJDbGFzcyk7IH0gc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlLCB7IGNvbnN0cnVjdG9yOiB7IHZhbHVlOiBzdWJDbGFzcywgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSB9KTsgaWYgKHN1cGVyQ2xhc3MpIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcykgOiBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzOyB9XG5cbnZhciB0cmFuc2l0aW9uRW5kRXZlbnQgPSBfcHJvcGVydGllczIuZGVmYXVsdC5lbmQ7XG5cbnZhciBVTk1PVU5URUQgPSBleHBvcnRzLlVOTU9VTlRFRCA9IDA7XG52YXIgRVhJVEVEID0gZXhwb3J0cy5FWElURUQgPSAxO1xudmFyIEVOVEVSSU5HID0gZXhwb3J0cy5FTlRFUklORyA9IDI7XG52YXIgRU5URVJFRCA9IGV4cG9ydHMuRU5URVJFRCA9IDM7XG52YXIgRVhJVElORyA9IGV4cG9ydHMuRVhJVElORyA9IDQ7XG5cbi8qKlxuICogVGhlIFRyYW5zaXRpb24gY29tcG9uZW50IGxldHMgeW91IGRlZmluZSBhbmQgcnVuIGNzcyB0cmFuc2l0aW9ucyB3aXRoIGEgc2ltcGxlIGRlY2xhcmF0aXZlIGFwaS5cbiAqIEl0IHdvcmtzIHNpbWlsYXIgdG8gUmVhY3QncyBvd24gW0NTU1RyYW5zaXRpb25Hcm91cF0oaHR0cDovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL2FuaW1hdGlvbi5odG1sI2hpZ2gtbGV2ZWwtYXBpLXJlYWN0Y3NzdHJhbnNpdGlvbmdyb3VwKVxuICogYnV0IGlzIHNwZWNpZmljYWxseSBvcHRpbWl6ZWQgZm9yIHRyYW5zaXRpb25pbmcgYSBzaW5nbGUgY2hpbGQgXCJpblwiIG9yIFwib3V0XCIuXG4gKlxuICogWW91IGRvbid0IGV2ZW4gbmVlZCB0byB1c2UgY2xhc3MgYmFzZWQgY3NzIHRyYW5zaXRpb25zIGlmIHlvdSBkb24ndCB3YW50IHRvIChidXQgaXQgaXMgZWFzaWVzdCkuXG4gKiBUaGUgZXh0ZW5zaXZlIHNldCBvZiBsaWZlY3ljbGUgY2FsbGJhY2tzIG1lYW5zIHlvdSBoYXZlIGNvbnRyb2wgb3ZlclxuICogdGhlIHRyYW5zaXRpb25pbmcgbm93IGF0IGVhY2ggc3RlcCBvZiB0aGUgd2F5LlxuICovXG5cbnZhciBUcmFuc2l0aW9uID0gZnVuY3Rpb24gKF9SZWFjdCRDb21wb25lbnQpIHtcbiAgX2luaGVyaXRzKFRyYW5zaXRpb24sIF9SZWFjdCRDb21wb25lbnQpO1xuXG4gIGZ1bmN0aW9uIFRyYW5zaXRpb24ocHJvcHMsIGNvbnRleHQpIHtcbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVHJhbnNpdGlvbik7XG5cbiAgICB2YXIgX3RoaXMgPSBfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCAoVHJhbnNpdGlvbi5fX3Byb3RvX18gfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKFRyYW5zaXRpb24pKS5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICBfdGhpcy51cGRhdGVTdGF0dXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMubmV4dFN0YXR1cyAhPT0gbnVsbCkge1xuICAgICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIG5leHRTdGF0dXMgd2lsbCBhbHdheXMgYmUgRU5URVJJTkcgb3IgRVhJVElORy5cbiAgICAgICAgICBfdGhpcy5jYW5jZWxOZXh0Q2FsbGJhY2soKTtcbiAgICAgICAgICB2YXIgbm9kZSA9IF9yZWFjdERvbTIuZGVmYXVsdC5maW5kRE9NTm9kZShfdGhpcyk7XG5cbiAgICAgICAgICBpZiAoX3RoaXMubmV4dFN0YXR1cyA9PT0gRU5URVJJTkcpIHtcbiAgICAgICAgICAgIF90aGlzLnByb3BzLm9uRW50ZXIobm9kZSk7XG5cbiAgICAgICAgICAgIF90aGlzLnNhZmVTZXRTdGF0ZSh7IHN0YXR1czogRU5URVJJTkcgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBfdGhpcy5wcm9wcy5vbkVudGVyaW5nKG5vZGUpO1xuXG4gICAgICAgICAgICAgIF90aGlzLm9uVHJhbnNpdGlvbkVuZChub2RlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgX3RoaXMuc2FmZVNldFN0YXRlKHsgc3RhdHVzOiBFTlRFUkVEIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgIF90aGlzLnByb3BzLm9uRW50ZXJlZChub2RlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3RoaXMucHJvcHMub25FeGl0KG5vZGUpO1xuXG4gICAgICAgICAgICBfdGhpcy5zYWZlU2V0U3RhdGUoeyBzdGF0dXM6IEVYSVRJTkcgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICBfdGhpcy5wcm9wcy5vbkV4aXRpbmcobm9kZSk7XG5cbiAgICAgICAgICAgICAgX3RoaXMub25UcmFuc2l0aW9uRW5kKG5vZGUsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBfdGhpcy5zYWZlU2V0U3RhdGUoeyBzdGF0dXM6IEVYSVRFRCB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICBfdGhpcy5wcm9wcy5vbkV4aXRlZChub2RlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpcy5uZXh0U3RhdHVzID0gbnVsbDtcbiAgICAgICAgfSkoKTtcbiAgICAgIH0gZWxzZSBpZiAoX3RoaXMucHJvcHMudW5tb3VudE9uRXhpdCAmJiBfdGhpcy5zdGF0ZS5zdGF0dXMgPT09IEVYSVRFRCkge1xuICAgICAgICBfdGhpcy5zZXRTdGF0ZSh7IHN0YXR1czogVU5NT1VOVEVEIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfdGhpcy5jYW5jZWxOZXh0Q2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoX3RoaXMubmV4dENhbGxiYWNrICE9PSBudWxsKSB7XG4gICAgICAgIF90aGlzLm5leHRDYWxsYmFjay5jYW5jZWwoKTtcbiAgICAgICAgX3RoaXMubmV4dENhbGxiYWNrID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3RoaXMuc2FmZVNldFN0YXRlID0gZnVuY3Rpb24gKG5leHRTdGF0ZSwgY2FsbGJhY2spIHtcbiAgICAgIC8vIFRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSwgYnV0IHRoZXJlIGFyZSB3ZWlyZCByYWNlIGNvbmRpdGlvbnMgd2l0aFxuICAgICAgLy8gc2V0U3RhdGUgY2FsbGJhY2tzIGFuZCB1bm1vdW50aW5nIGluIHRlc3RpbmcsIHNvIGFsd2F5cyBtYWtlIHN1cmUgdGhhdFxuICAgICAgLy8gd2UgY2FuIGNhbmNlbCBhbnkgcGVuZGluZyBzZXRTdGF0ZSBjYWxsYmFja3MgYWZ0ZXIgd2UgdW5tb3VudC5cbiAgICAgIF90aGlzLnNldFN0YXRlKG5leHRTdGF0ZSwgX3RoaXMuc2V0TmV4dENhbGxiYWNrKGNhbGxiYWNrKSk7XG4gICAgfTtcblxuICAgIF90aGlzLnNldE5leHRDYWxsYmFjayA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgdmFyIGFjdGl2ZSA9IHRydWU7XG5cbiAgICAgIF90aGlzLm5leHRDYWxsYmFjayA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgX3RoaXMubmV4dENhbGxiYWNrID0gbnVsbDtcblxuICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgX3RoaXMubmV4dENhbGxiYWNrLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gX3RoaXMubmV4dENhbGxiYWNrO1xuICAgIH07XG5cbiAgICBfdGhpcy5vblRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiAobm9kZSwgaGFuZGxlcikge1xuICAgICAgX3RoaXMuc2V0TmV4dENhbGxiYWNrKGhhbmRsZXIpO1xuXG4gICAgICBpZiAobm9kZSkge1xuICAgICAgICAoMCwgX29uMi5kZWZhdWx0KShub2RlLCB0cmFuc2l0aW9uRW5kRXZlbnQsIF90aGlzLm5leHRDYWxsYmFjayk7XG4gICAgICAgIHNldFRpbWVvdXQoX3RoaXMubmV4dENhbGxiYWNrLCBfdGhpcy5wcm9wcy50aW1lb3V0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldFRpbWVvdXQoX3RoaXMubmV4dENhbGxiYWNrLCAwKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIGluaXRpYWxTdGF0dXMgPSB2b2lkIDA7XG4gICAgX3RoaXMubmV4dFN0YXR1cyA9IG51bGw7XG5cbiAgICBpZiAocHJvcHMuaW4pIHtcbiAgICAgIGlmIChwcm9wcy50cmFuc2l0aW9uQXBwZWFyKSB7XG4gICAgICAgIGluaXRpYWxTdGF0dXMgPSBFWElURUQ7XG4gICAgICAgIF90aGlzLm5leHRTdGF0dXMgPSBFTlRFUklORztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluaXRpYWxTdGF0dXMgPSBFTlRFUkVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocHJvcHMudW5tb3VudE9uRXhpdCB8fCBwcm9wcy5tb3VudE9uRW50ZXIpIHtcbiAgICAgICAgaW5pdGlhbFN0YXR1cyA9IFVOTU9VTlRFRDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluaXRpYWxTdGF0dXMgPSBFWElURUQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX3RoaXMuc3RhdGUgPSB7IHN0YXR1czogaW5pdGlhbFN0YXR1cyB9O1xuXG4gICAgX3RoaXMubmV4dENhbGxiYWNrID0gbnVsbDtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBfY3JlYXRlQ2xhc3MoVHJhbnNpdGlvbiwgW3tcbiAgICBrZXk6ICdjb21wb25lbnREaWRNb3VudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgdGhpcy51cGRhdGVTdGF0dXMoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICAgIHZhciBzdGF0dXMgPSB0aGlzLnN0YXRlLnN0YXR1cztcblxuXG4gICAgICBpZiAobmV4dFByb3BzLmluKSB7XG4gICAgICAgIGlmIChzdGF0dXMgPT09IFVOTU9VTlRFRCkge1xuICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzdGF0dXM6IEVYSVRFRCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdHVzICE9PSBFTlRFUklORyAmJiBzdGF0dXMgIT09IEVOVEVSRUQpIHtcbiAgICAgICAgICB0aGlzLm5leHRTdGF0dXMgPSBFTlRFUklORztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gRU5URVJJTkcgfHwgc3RhdHVzID09PSBFTlRFUkVEKSB7XG4gICAgICAgICAgdGhpcy5uZXh0U3RhdHVzID0gRVhJVElORztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2NvbXBvbmVudERpZFVwZGF0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgICAgIHRoaXMudXBkYXRlU3RhdHVzKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnY29tcG9uZW50V2lsbFVubW91bnQnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgIHRoaXMuY2FuY2VsTmV4dENhbGxiYWNrKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAncmVuZGVyJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKCkge1xuICAgICAgdmFyIHN0YXR1cyA9IHRoaXMuc3RhdGUuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA9PT0gVU5NT1VOVEVEKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB2YXIgX3Byb3BzID0gdGhpcy5wcm9wcztcbiAgICAgIHZhciBjaGlsZHJlbiA9IF9wcm9wcy5jaGlsZHJlbjtcbiAgICAgIHZhciBjbGFzc05hbWUgPSBfcHJvcHMuY2xhc3NOYW1lO1xuXG4gICAgICB2YXIgY2hpbGRQcm9wcyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcHJvcHMsIFsnY2hpbGRyZW4nLCAnY2xhc3NOYW1lJ10pO1xuXG4gICAgICBPYmplY3Qua2V5cyhUcmFuc2l0aW9uLnByb3BUeXBlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiBkZWxldGUgY2hpbGRQcm9wc1trZXldO1xuICAgICAgfSk7XG5cbiAgICAgIHZhciB0cmFuc2l0aW9uQ2xhc3NOYW1lID0gdm9pZCAwO1xuICAgICAgaWYgKHN0YXR1cyA9PT0gRVhJVEVEKSB7XG4gICAgICAgIHRyYW5zaXRpb25DbGFzc05hbWUgPSB0aGlzLnByb3BzLmV4aXRlZENsYXNzTmFtZTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSBFTlRFUklORykge1xuICAgICAgICB0cmFuc2l0aW9uQ2xhc3NOYW1lID0gdGhpcy5wcm9wcy5lbnRlcmluZ0NsYXNzTmFtZTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09PSBFTlRFUkVEKSB7XG4gICAgICAgIHRyYW5zaXRpb25DbGFzc05hbWUgPSB0aGlzLnByb3BzLmVudGVyZWRDbGFzc05hbWU7XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gRVhJVElORykge1xuICAgICAgICB0cmFuc2l0aW9uQ2xhc3NOYW1lID0gdGhpcy5wcm9wcy5leGl0aW5nQ2xhc3NOYW1lO1xuICAgICAgfVxuXG4gICAgICB2YXIgY2hpbGQgPSBfcmVhY3QyLmRlZmF1bHQuQ2hpbGRyZW4ub25seShjaGlsZHJlbik7XG4gICAgICByZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNsb25lRWxlbWVudChjaGlsZCwgX2V4dGVuZHMoe30sIGNoaWxkUHJvcHMsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMyLmRlZmF1bHQpKGNoaWxkLnByb3BzLmNsYXNzTmFtZSwgY2xhc3NOYW1lLCB0cmFuc2l0aW9uQ2xhc3NOYW1lKVxuICAgICAgfSkpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBUcmFuc2l0aW9uO1xufShfcmVhY3QyLmRlZmF1bHQuQ29tcG9uZW50KTtcblxuVHJhbnNpdGlvbi5wcm9wVHlwZXMgPSB7XG4gIC8qKlxuICAgKiBTaG93IHRoZSBjb21wb25lbnQ7IHRyaWdnZXJzIHRoZSBlbnRlciBvciBleGl0IGFuaW1hdGlvblxuICAgKi9cbiAgaW46IF9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbCxcblxuICAvKipcbiAgICogV2FpdCB1bnRpbCB0aGUgZmlyc3QgXCJlbnRlclwiIHRyYW5zaXRpb24gdG8gbW91bnQgdGhlIGNvbXBvbmVudCAoYWRkIGl0IHRvIHRoZSBET00pXG4gICAqL1xuICBtb3VudE9uRW50ZXI6IF9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbCxcblxuICAvKipcbiAgICogVW5tb3VudCB0aGUgY29tcG9uZW50IChyZW1vdmUgaXQgZnJvbSB0aGUgRE9NKSB3aGVuIGl0IGlzIG5vdCBzaG93blxuICAgKi9cbiAgdW5tb3VudE9uRXhpdDogX3Byb3BUeXBlczIuZGVmYXVsdC5ib29sLFxuXG4gIC8qKlxuICAgKiBSdW4gdGhlIGVudGVyIGFuaW1hdGlvbiB3aGVuIHRoZSBjb21wb25lbnQgbW91bnRzLCBpZiBpdCBpcyBpbml0aWFsbHlcbiAgICogc2hvd25cbiAgICovXG4gIHRyYW5zaXRpb25BcHBlYXI6IF9wcm9wVHlwZXMyLmRlZmF1bHQuYm9vbCxcblxuICAvKipcbiAgICogQSBUaW1lb3V0IGZvciB0aGUgYW5pbWF0aW9uLCBpbiBtaWxsaXNlY29uZHMsIHRvIGVuc3VyZSB0aGF0IGEgbm9kZSBkb2Vzbid0XG4gICAqIHRyYW5zaXRpb24gaW5kZWZpbmF0ZWx5IGlmIHRoZSBicm93c2VyIHRyYW5zaXRpb25FbmQgZXZlbnRzIGFyZVxuICAgKiBjYW5jZWxlZCBvciBpbnRlcnJ1cHRlZC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCB0aGlzIGlzIHNldCB0byBhIGhpZ2ggbnVtYmVyICg1IHNlY29uZHMpIGFzIGEgZmFpbHNhZmUuIFlvdSBzaG91bGQgY29uc2lkZXJcbiAgICogc2V0dGluZyB0aGlzIHRvIHRoZSBkdXJhdGlvbiBvZiB5b3VyIGFuaW1hdGlvbiAob3IgYSBiaXQgYWJvdmUgaXQpLlxuICAgKi9cbiAgdGltZW91dDogX3Byb3BUeXBlczIuZGVmYXVsdC5udW1iZXIsXG5cbiAgLyoqXG4gICAqIENTUyBjbGFzcyBvciBjbGFzc2VzIGFwcGxpZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGV4aXRlZFxuICAgKi9cbiAgZXhpdGVkQ2xhc3NOYW1lOiBfcHJvcFR5cGVzMi5kZWZhdWx0LnN0cmluZyxcbiAgLyoqXG4gICAqIENTUyBjbGFzcyBvciBjbGFzc2VzIGFwcGxpZWQgd2hpbGUgdGhlIGNvbXBvbmVudCBpcyBleGl0aW5nXG4gICAqL1xuICBleGl0aW5nQ2xhc3NOYW1lOiBfcHJvcFR5cGVzMi5kZWZhdWx0LnN0cmluZyxcbiAgLyoqXG4gICAqIENTUyBjbGFzcyBvciBjbGFzc2VzIGFwcGxpZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGVudGVyZWRcbiAgICovXG4gIGVudGVyZWRDbGFzc05hbWU6IF9wcm9wVHlwZXMyLmRlZmF1bHQuc3RyaW5nLFxuICAvKipcbiAgICogQ1NTIGNsYXNzIG9yIGNsYXNzZXMgYXBwbGllZCB3aGlsZSB0aGUgY29tcG9uZW50IGlzIGVudGVyaW5nXG4gICAqL1xuICBlbnRlcmluZ0NsYXNzTmFtZTogX3Byb3BUeXBlczIuZGVmYXVsdC5zdHJpbmcsXG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGJlZm9yZSB0aGUgXCJlbnRlcmluZ1wiIGNsYXNzZXMgYXJlIGFwcGxpZWRcbiAgICovXG4gIG9uRW50ZXI6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGFmdGVyIHRoZSBcImVudGVyaW5nXCIgY2xhc3NlcyBhcmUgYXBwbGllZFxuICAgKi9cbiAgb25FbnRlcmluZzogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLFxuICAvKipcbiAgICogQ2FsbGJhY2sgZmlyZWQgYWZ0ZXIgdGhlIFwiZW50ZXJcIiBjbGFzc2VzIGFyZSBhcHBsaWVkXG4gICAqL1xuICBvbkVudGVyZWQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYyxcbiAgLyoqXG4gICAqIENhbGxiYWNrIGZpcmVkIGJlZm9yZSB0aGUgXCJleGl0aW5nXCIgY2xhc3NlcyBhcmUgYXBwbGllZFxuICAgKi9cbiAgb25FeGl0OiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgXCJleGl0aW5nXCIgY2xhc3NlcyBhcmUgYXBwbGllZFxuICAgKi9cbiAgb25FeGl0aW5nOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMsXG4gIC8qKlxuICAgKiBDYWxsYmFjayBmaXJlZCBhZnRlciB0aGUgXCJleGl0ZWRcIiBjbGFzc2VzIGFyZSBhcHBsaWVkXG4gICAqL1xuICBvbkV4aXRlZDogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jXG59O1xuXG4vLyBOYW1lIHRoZSBmdW5jdGlvbiBzbyBpdCBpcyBjbGVhcmVyIGluIHRoZSBkb2N1bWVudGF0aW9uXG5mdW5jdGlvbiBub29wKCkge31cblxuVHJhbnNpdGlvbi5kaXNwbGF5TmFtZSA9ICdUcmFuc2l0aW9uJztcblxuVHJhbnNpdGlvbi5kZWZhdWx0UHJvcHMgPSB7XG4gIGluOiBmYWxzZSxcbiAgdW5tb3VudE9uRXhpdDogZmFsc2UsXG4gIHRyYW5zaXRpb25BcHBlYXI6IGZhbHNlLFxuXG4gIHRpbWVvdXQ6IDUwMDAsXG5cbiAgb25FbnRlcjogbm9vcCxcbiAgb25FbnRlcmluZzogbm9vcCxcbiAgb25FbnRlcmVkOiBub29wLFxuXG4gIG9uRXhpdDogbm9vcCxcbiAgb25FeGl0aW5nOiBub29wLFxuICBvbkV4aXRlZDogbm9vcFxufTtcblxuZXhwb3J0cy5kZWZhdWx0ID0gVHJhbnNpdGlvbjsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChub2RlLCBldmVudCwgaGFuZGxlciwgY2FwdHVyZSkge1xuICAoMCwgX29uMi5kZWZhdWx0KShub2RlLCBldmVudCwgaGFuZGxlciwgY2FwdHVyZSk7XG5cbiAgcmV0dXJuIHtcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgICgwLCBfb2ZmMi5kZWZhdWx0KShub2RlLCBldmVudCwgaGFuZGxlciwgY2FwdHVyZSk7XG4gICAgfVxuICB9O1xufTtcblxudmFyIF9vbiA9IHJlcXVpcmUoJ2RvbS1oZWxwZXJzL2V2ZW50cy9vbicpO1xuXG52YXIgX29uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29uKTtcblxudmFyIF9vZmYgPSByZXF1aXJlKCdkb20taGVscGVycy9ldmVudHMvb2ZmJyk7XG5cbnZhciBfb2ZmMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29mZik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGFkZEZvY3VzTGlzdGVuZXI7XG4vKipcbiAqIEZpcmVmb3ggZG9lc24ndCBoYXZlIGEgZm9jdXNpbiBldmVudCBzbyB1c2luZyBjYXB0dXJlIGlzIGVhc2llc3Qgd2F5IHRvIGdldCBidWJibGluZ1xuICogSUU4IGNhbid0IGRvIGFkZEV2ZW50TGlzdGVuZXIsIGJ1dCBkb2VzIGhhdmUgb25mb2N1c2luLCBzbyB3ZSB1c2UgdGhhdCBpbiBpZThcbiAqXG4gKiBXZSBvbmx5IGFsbG93IG9uZSBMaXN0ZW5lciBhdCBhIHRpbWUgdG8gYXZvaWQgc3RhY2sgb3ZlcmZsb3dzXG4gKi9cbmZ1bmN0aW9uIGFkZEZvY3VzTGlzdGVuZXIoaGFuZGxlcikge1xuICB2YXIgdXNlRm9jdXNpbiA9ICFkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyO1xuICB2YXIgcmVtb3ZlID0gdm9pZCAwO1xuXG4gIGlmICh1c2VGb2N1c2luKSB7XG4gICAgZG9jdW1lbnQuYXR0YWNoRXZlbnQoJ29uZm9jdXNpbicsIGhhbmRsZXIpO1xuICAgIHJlbW92ZSA9IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIHJldHVybiBkb2N1bWVudC5kZXRhY2hFdmVudCgnb25mb2N1c2luJywgaGFuZGxlcik7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIGhhbmRsZXIsIHRydWUpO1xuICAgIHJlbW92ZSA9IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIHJldHVybiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIGhhbmRsZXIsIHRydWUpO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4geyByZW1vdmU6IHJlbW92ZSB9O1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gY2FsY3VsYXRlUG9zaXRpb247XG5cbnZhciBfb2Zmc2V0ID0gcmVxdWlyZSgnZG9tLWhlbHBlcnMvcXVlcnkvb2Zmc2V0Jyk7XG5cbnZhciBfb2Zmc2V0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX29mZnNldCk7XG5cbnZhciBfcG9zaXRpb24gPSByZXF1aXJlKCdkb20taGVscGVycy9xdWVyeS9wb3NpdGlvbicpO1xuXG52YXIgX3Bvc2l0aW9uMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3Bvc2l0aW9uKTtcblxudmFyIF9zY3JvbGxUb3AgPSByZXF1aXJlKCdkb20taGVscGVycy9xdWVyeS9zY3JvbGxUb3AnKTtcblxudmFyIF9zY3JvbGxUb3AyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc2Nyb2xsVG9wKTtcblxudmFyIF9vd25lckRvY3VtZW50ID0gcmVxdWlyZSgnLi9vd25lckRvY3VtZW50Jyk7XG5cbnZhciBfb3duZXJEb2N1bWVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9vd25lckRvY3VtZW50KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gZ2V0Q29udGFpbmVyRGltZW5zaW9ucyhjb250YWluZXJOb2RlKSB7XG4gIHZhciB3aWR0aCA9IHZvaWQgMCxcbiAgICAgIGhlaWdodCA9IHZvaWQgMCxcbiAgICAgIHNjcm9sbCA9IHZvaWQgMDtcblxuICBpZiAoY29udGFpbmVyTm9kZS50YWdOYW1lID09PSAnQk9EWScpIHtcbiAgICB3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcblxuICAgIHNjcm9sbCA9ICgwLCBfc2Nyb2xsVG9wMi5kZWZhdWx0KSgoMCwgX293bmVyRG9jdW1lbnQyLmRlZmF1bHQpKGNvbnRhaW5lck5vZGUpLmRvY3VtZW50RWxlbWVudCkgfHwgKDAsIF9zY3JvbGxUb3AyLmRlZmF1bHQpKGNvbnRhaW5lck5vZGUpO1xuICB9IGVsc2Uge1xuICAgIHZhciBfZ2V0T2Zmc2V0ID0gKDAsIF9vZmZzZXQyLmRlZmF1bHQpKGNvbnRhaW5lck5vZGUpO1xuXG4gICAgd2lkdGggPSBfZ2V0T2Zmc2V0LndpZHRoO1xuICAgIGhlaWdodCA9IF9nZXRPZmZzZXQuaGVpZ2h0O1xuXG4gICAgc2Nyb2xsID0gKDAsIF9zY3JvbGxUb3AyLmRlZmF1bHQpKGNvbnRhaW5lck5vZGUpO1xuICB9XG5cbiAgcmV0dXJuIHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCwgc2Nyb2xsOiBzY3JvbGwgfTtcbn1cblxuZnVuY3Rpb24gZ2V0VG9wRGVsdGEodG9wLCBvdmVybGF5SGVpZ2h0LCBjb250YWluZXIsIHBhZGRpbmcpIHtcbiAgdmFyIGNvbnRhaW5lckRpbWVuc2lvbnMgPSBnZXRDb250YWluZXJEaW1lbnNpb25zKGNvbnRhaW5lcik7XG4gIHZhciBjb250YWluZXJTY3JvbGwgPSBjb250YWluZXJEaW1lbnNpb25zLnNjcm9sbDtcbiAgdmFyIGNvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lckRpbWVuc2lvbnMuaGVpZ2h0O1xuXG4gIHZhciB0b3BFZGdlT2Zmc2V0ID0gdG9wIC0gcGFkZGluZyAtIGNvbnRhaW5lclNjcm9sbDtcbiAgdmFyIGJvdHRvbUVkZ2VPZmZzZXQgPSB0b3AgKyBwYWRkaW5nIC0gY29udGFpbmVyU2Nyb2xsICsgb3ZlcmxheUhlaWdodDtcblxuICBpZiAodG9wRWRnZU9mZnNldCA8IDApIHtcbiAgICByZXR1cm4gLXRvcEVkZ2VPZmZzZXQ7XG4gIH0gZWxzZSBpZiAoYm90dG9tRWRnZU9mZnNldCA+IGNvbnRhaW5lckhlaWdodCkge1xuICAgIHJldHVybiBjb250YWluZXJIZWlnaHQgLSBib3R0b21FZGdlT2Zmc2V0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldExlZnREZWx0YShsZWZ0LCBvdmVybGF5V2lkdGgsIGNvbnRhaW5lciwgcGFkZGluZykge1xuICB2YXIgY29udGFpbmVyRGltZW5zaW9ucyA9IGdldENvbnRhaW5lckRpbWVuc2lvbnMoY29udGFpbmVyKTtcbiAgdmFyIGNvbnRhaW5lcldpZHRoID0gY29udGFpbmVyRGltZW5zaW9ucy53aWR0aDtcblxuICB2YXIgbGVmdEVkZ2VPZmZzZXQgPSBsZWZ0IC0gcGFkZGluZztcbiAgdmFyIHJpZ2h0RWRnZU9mZnNldCA9IGxlZnQgKyBwYWRkaW5nICsgb3ZlcmxheVdpZHRoO1xuXG4gIGlmIChsZWZ0RWRnZU9mZnNldCA8IDApIHtcbiAgICByZXR1cm4gLWxlZnRFZGdlT2Zmc2V0O1xuICB9IGVsc2UgaWYgKHJpZ2h0RWRnZU9mZnNldCA+IGNvbnRhaW5lcldpZHRoKSB7XG4gICAgcmV0dXJuIGNvbnRhaW5lcldpZHRoIC0gcmlnaHRFZGdlT2Zmc2V0O1xuICB9XG5cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVBvc2l0aW9uKHBsYWNlbWVudCwgb3ZlcmxheU5vZGUsIHRhcmdldCwgY29udGFpbmVyLCBwYWRkaW5nKSB7XG4gIHZhciBjaGlsZE9mZnNldCA9IGNvbnRhaW5lci50YWdOYW1lID09PSAnQk9EWScgPyAoMCwgX29mZnNldDIuZGVmYXVsdCkodGFyZ2V0KSA6ICgwLCBfcG9zaXRpb24yLmRlZmF1bHQpKHRhcmdldCwgY29udGFpbmVyKTtcblxuICB2YXIgX2dldE9mZnNldDIgPSAoMCwgX29mZnNldDIuZGVmYXVsdCkob3ZlcmxheU5vZGUpO1xuXG4gIHZhciBvdmVybGF5SGVpZ2h0ID0gX2dldE9mZnNldDIuaGVpZ2h0O1xuICB2YXIgb3ZlcmxheVdpZHRoID0gX2dldE9mZnNldDIud2lkdGg7XG5cblxuICB2YXIgcG9zaXRpb25MZWZ0ID0gdm9pZCAwLFxuICAgICAgcG9zaXRpb25Ub3AgPSB2b2lkIDAsXG4gICAgICBhcnJvd09mZnNldExlZnQgPSB2b2lkIDAsXG4gICAgICBhcnJvd09mZnNldFRvcCA9IHZvaWQgMDtcblxuICBpZiAocGxhY2VtZW50ID09PSAnbGVmdCcgfHwgcGxhY2VtZW50ID09PSAncmlnaHQnKSB7XG4gICAgcG9zaXRpb25Ub3AgPSBjaGlsZE9mZnNldC50b3AgKyAoY2hpbGRPZmZzZXQuaGVpZ2h0IC0gb3ZlcmxheUhlaWdodCkgLyAyO1xuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gJ2xlZnQnKSB7XG4gICAgICBwb3NpdGlvbkxlZnQgPSBjaGlsZE9mZnNldC5sZWZ0IC0gb3ZlcmxheVdpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3NpdGlvbkxlZnQgPSBjaGlsZE9mZnNldC5sZWZ0ICsgY2hpbGRPZmZzZXQud2lkdGg7XG4gICAgfVxuXG4gICAgdmFyIHRvcERlbHRhID0gZ2V0VG9wRGVsdGEocG9zaXRpb25Ub3AsIG92ZXJsYXlIZWlnaHQsIGNvbnRhaW5lciwgcGFkZGluZyk7XG5cbiAgICBwb3NpdGlvblRvcCArPSB0b3BEZWx0YTtcbiAgICBhcnJvd09mZnNldFRvcCA9IDUwICogKDEgLSAyICogdG9wRGVsdGEgLyBvdmVybGF5SGVpZ2h0KSArICclJztcbiAgICBhcnJvd09mZnNldExlZnQgPSB2b2lkIDA7XG4gIH0gZWxzZSBpZiAocGxhY2VtZW50ID09PSAndG9wJyB8fCBwbGFjZW1lbnQgPT09ICdib3R0b20nKSB7XG4gICAgcG9zaXRpb25MZWZ0ID0gY2hpbGRPZmZzZXQubGVmdCArIChjaGlsZE9mZnNldC53aWR0aCAtIG92ZXJsYXlXaWR0aCkgLyAyO1xuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gJ3RvcCcpIHtcbiAgICAgIHBvc2l0aW9uVG9wID0gY2hpbGRPZmZzZXQudG9wIC0gb3ZlcmxheUhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9zaXRpb25Ub3AgPSBjaGlsZE9mZnNldC50b3AgKyBjaGlsZE9mZnNldC5oZWlnaHQ7XG4gICAgfVxuXG4gICAgdmFyIGxlZnREZWx0YSA9IGdldExlZnREZWx0YShwb3NpdGlvbkxlZnQsIG92ZXJsYXlXaWR0aCwgY29udGFpbmVyLCBwYWRkaW5nKTtcblxuICAgIHBvc2l0aW9uTGVmdCArPSBsZWZ0RGVsdGE7XG4gICAgYXJyb3dPZmZzZXRMZWZ0ID0gNTAgKiAoMSAtIDIgKiBsZWZ0RGVsdGEgLyBvdmVybGF5V2lkdGgpICsgJyUnO1xuICAgIGFycm93T2Zmc2V0VG9wID0gdm9pZCAwO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignY2FsY092ZXJsYXlQb3NpdGlvbigpOiBObyBzdWNoIHBsYWNlbWVudCBvZiBcIicgKyBwbGFjZW1lbnQgKyAnXCIgZm91bmQuJyk7XG4gIH1cblxuICByZXR1cm4geyBwb3NpdGlvbkxlZnQ6IHBvc2l0aW9uTGVmdCwgcG9zaXRpb25Ub3A6IHBvc2l0aW9uVG9wLCBhcnJvd09mZnNldExlZnQ6IGFycm93T2Zmc2V0TGVmdCwgYXJyb3dPZmZzZXRUb3A6IGFycm93T2Zmc2V0VG9wIH07XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBnZXRDb250YWluZXI7XG5cbnZhciBfcmVhY3REb20gPSByZXF1aXJlKCdyZWFjdC1kb20nKTtcblxudmFyIF9yZWFjdERvbTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdERvbSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIGdldENvbnRhaW5lcihjb250YWluZXIsIGRlZmF1bHRDb250YWluZXIpIHtcbiAgY29udGFpbmVyID0gdHlwZW9mIGNvbnRhaW5lciA9PT0gJ2Z1bmN0aW9uJyA/IGNvbnRhaW5lcigpIDogY29udGFpbmVyO1xuICByZXR1cm4gX3JlYWN0RG9tMi5kZWZhdWx0LmZpbmRET01Ob2RlKGNvbnRhaW5lcikgfHwgZGVmYXVsdENvbnRhaW5lcjtcbn1cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGlzT3ZlcmZsb3dpbmc7XG5cbnZhciBfaXNXaW5kb3cgPSByZXF1aXJlKCdkb20taGVscGVycy9xdWVyeS9pc1dpbmRvdycpO1xuXG52YXIgX2lzV2luZG93MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2lzV2luZG93KTtcblxudmFyIF9vd25lckRvY3VtZW50ID0gcmVxdWlyZSgnZG9tLWhlbHBlcnMvb3duZXJEb2N1bWVudCcpO1xuXG52YXIgX293bmVyRG9jdW1lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb3duZXJEb2N1bWVudCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIGlzQm9keShub2RlKSB7XG4gIHJldHVybiBub2RlICYmIG5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYm9keSc7XG59XG5cbmZ1bmN0aW9uIGJvZHlJc092ZXJmbG93aW5nKG5vZGUpIHtcbiAgdmFyIGRvYyA9ICgwLCBfb3duZXJEb2N1bWVudDIuZGVmYXVsdCkobm9kZSk7XG4gIHZhciB3aW4gPSAoMCwgX2lzV2luZG93Mi5kZWZhdWx0KShkb2MpO1xuICB2YXIgZnVsbFdpZHRoID0gd2luLmlubmVyV2lkdGg7XG5cbiAgLy8gU3VwcG9ydDogaWU4LCBubyBpbm5lcldpZHRoXG4gIGlmICghZnVsbFdpZHRoKSB7XG4gICAgdmFyIGRvY3VtZW50RWxlbWVudFJlY3QgPSBkb2MuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGZ1bGxXaWR0aCA9IGRvY3VtZW50RWxlbWVudFJlY3QucmlnaHQgLSBNYXRoLmFicyhkb2N1bWVudEVsZW1lbnRSZWN0LmxlZnQpO1xuICB9XG5cbiAgcmV0dXJuIGRvYy5ib2R5LmNsaWVudFdpZHRoIDwgZnVsbFdpZHRoO1xufVxuXG5mdW5jdGlvbiBpc092ZXJmbG93aW5nKGNvbnRhaW5lcikge1xuICB2YXIgd2luID0gKDAsIF9pc1dpbmRvdzIuZGVmYXVsdCkoY29udGFpbmVyKTtcblxuICByZXR1cm4gd2luIHx8IGlzQm9keShjb250YWluZXIpID8gYm9keUlzT3ZlcmZsb3dpbmcoY29udGFpbmVyKSA6IGNvbnRhaW5lci5zY3JvbGxIZWlnaHQgPiBjb250YWluZXIuY2xpZW50SGVpZ2h0O1xufVxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzWydkZWZhdWx0J107IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5hcmlhSGlkZGVuID0gYXJpYUhpZGRlbjtcbmV4cG9ydHMuaGlkZVNpYmxpbmdzID0gaGlkZVNpYmxpbmdzO1xuZXhwb3J0cy5zaG93U2libGluZ3MgPSBzaG93U2libGluZ3M7XG5cbnZhciBCTEFDS0xJU1QgPSBbJ3RlbXBsYXRlJywgJ3NjcmlwdCcsICdzdHlsZSddO1xuXG52YXIgaXNIaWRhYmxlID0gZnVuY3Rpb24gaXNIaWRhYmxlKF9yZWYpIHtcbiAgdmFyIG5vZGVUeXBlID0gX3JlZi5ub2RlVHlwZTtcbiAgdmFyIHRhZ05hbWUgPSBfcmVmLnRhZ05hbWU7XG4gIHJldHVybiBub2RlVHlwZSA9PT0gMSAmJiBCTEFDS0xJU1QuaW5kZXhPZih0YWdOYW1lLnRvTG93ZXJDYXNlKCkpID09PSAtMTtcbn07XG5cbnZhciBzaWJsaW5ncyA9IGZ1bmN0aW9uIHNpYmxpbmdzKGNvbnRhaW5lciwgbW91bnQsIGNiKSB7XG4gIG1vdW50ID0gW10uY29uY2F0KG1vdW50KTtcblxuICBbXS5mb3JFYWNoLmNhbGwoY29udGFpbmVyLmNoaWxkcmVuLCBmdW5jdGlvbiAobm9kZSkge1xuICAgIGlmIChtb3VudC5pbmRleE9mKG5vZGUpID09PSAtMSAmJiBpc0hpZGFibGUobm9kZSkpIHtcbiAgICAgIGNiKG5vZGUpO1xuICAgIH1cbiAgfSk7XG59O1xuXG5mdW5jdGlvbiBhcmlhSGlkZGVuKHNob3csIG5vZGUpIHtcbiAgaWYgKCFub2RlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChzaG93KSB7XG4gICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgfSBlbHNlIHtcbiAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoaWRlU2libGluZ3MoY29udGFpbmVyLCBtb3VudE5vZGUpIHtcbiAgc2libGluZ3MoY29udGFpbmVyLCBtb3VudE5vZGUsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIGFyaWFIaWRkZW4odHJ1ZSwgbm9kZSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzaG93U2libGluZ3MoY29udGFpbmVyLCBtb3VudE5vZGUpIHtcbiAgc2libGluZ3MoY29udGFpbmVyLCBtb3VudE5vZGUsIGZ1bmN0aW9uIChub2RlKSB7XG4gICAgcmV0dXJuIGFyaWFIaWRkZW4oZmFsc2UsIG5vZGUpO1xuICB9KTtcbn0iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGZ1bmN0aW9uIChjb21wb25lbnRPckVsZW1lbnQpIHtcbiAgcmV0dXJuICgwLCBfb3duZXJEb2N1bWVudDIuZGVmYXVsdCkoX3JlYWN0RG9tMi5kZWZhdWx0LmZpbmRET01Ob2RlKGNvbXBvbmVudE9yRWxlbWVudCkpO1xufTtcblxudmFyIF9yZWFjdERvbSA9IHJlcXVpcmUoJ3JlYWN0LWRvbScpO1xuXG52YXIgX3JlYWN0RG9tMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0RG9tKTtcblxudmFyIF9vd25lckRvY3VtZW50ID0gcmVxdWlyZSgnZG9tLWhlbHBlcnMvb3duZXJEb2N1bWVudCcpO1xuXG52YXIgX293bmVyRG9jdW1lbnQyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfb3duZXJEb2N1bWVudCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0c1snZGVmYXVsdCddOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuZGVmYXVsdCA9IGFsbDtcblxudmFyIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlciA9IHJlcXVpcmUoJy4vdXRpbHMvY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXInKTtcblxudmFyIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIGFsbCgpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIHZhbGlkYXRvcnMgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICB2YWxpZGF0b3JzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgZnVuY3Rpb24gYWxsUHJvcFR5cGVzKCkge1xuICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4yKSwgX2tleTIgPSAwOyBfa2V5MiA8IF9sZW4yOyBfa2V5MisrKSB7XG4gICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgfVxuXG4gICAgdmFyIGVycm9yID0gbnVsbDtcblxuICAgIHZhbGlkYXRvcnMuZm9yRWFjaChmdW5jdGlvbiAodmFsaWRhdG9yKSB7XG4gICAgICBpZiAoZXJyb3IgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciByZXN1bHQgPSB2YWxpZGF0b3IuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkge1xuICAgICAgICBlcnJvciA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBlcnJvcjtcbiAgfVxuXG4gIHJldHVybiAoMCwgX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyMi5kZWZhdWx0KShhbGxQcm9wVHlwZXMpO1xufSIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbnZhciBfcmVhY3QgPSByZXF1aXJlKCdyZWFjdCcpO1xuXG52YXIgX3JlYWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3JlYWN0KTtcblxudmFyIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlciA9IHJlcXVpcmUoJy4vdXRpbHMvY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXInKTtcblxudmFyIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcjIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcik7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIHZhbGlkYXRlKHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICB2YXIgcHJvcFZhbHVlID0gcHJvcHNbcHJvcE5hbWVdO1xuICB2YXIgcHJvcFR5cGUgPSB0eXBlb2YgcHJvcFZhbHVlID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihwcm9wVmFsdWUpO1xuXG4gIGlmIChfcmVhY3QyLmRlZmF1bHQuaXNWYWxpZEVsZW1lbnQocHJvcFZhbHVlKSkge1xuICAgIHJldHVybiBuZXcgRXJyb3IoJ0ludmFsaWQgJyArIGxvY2F0aW9uICsgJyBgJyArIHByb3BGdWxsTmFtZSArICdgIG9mIHR5cGUgUmVhY3RFbGVtZW50ICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIFJlYWN0Q29tcG9uZW50IG9yIGEgJykgKyAnRE9NRWxlbWVudC4gWW91IGNhbiB1c3VhbGx5IG9idGFpbiBhIFJlYWN0Q29tcG9uZW50IG9yIERPTUVsZW1lbnQgJyArICdmcm9tIGEgUmVhY3RFbGVtZW50IGJ5IGF0dGFjaGluZyBhIHJlZiB0byBpdC4nKTtcbiAgfVxuXG4gIGlmICgocHJvcFR5cGUgIT09ICdvYmplY3QnIHx8IHR5cGVvZiBwcm9wVmFsdWUucmVuZGVyICE9PSAnZnVuY3Rpb24nKSAmJiBwcm9wVmFsdWUubm9kZVR5cGUgIT09IDEpIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB2YWx1ZSBgJyArIHByb3BWYWx1ZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhIFJlYWN0Q29tcG9uZW50IG9yIGEgJykgKyAnRE9NRWxlbWVudC4nKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnRzLmRlZmF1bHQgPSAoMCwgX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyMi5kZWZhdWx0KSh2YWxpZGF0ZSk7IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcmVhY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcmVhY3QpO1xuXG52YXIgX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyID0gcmVxdWlyZSgnLi91dGlscy9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcicpO1xuXG52YXIgX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZUNoYWluYWJsZVR5cGVDaGVja2VyKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gZWxlbWVudFR5cGUocHJvcHMsIHByb3BOYW1lLCBjb21wb25lbnROYW1lLCBsb2NhdGlvbiwgcHJvcEZ1bGxOYW1lKSB7XG4gIHZhciBwcm9wVmFsdWUgPSBwcm9wc1twcm9wTmFtZV07XG4gIHZhciBwcm9wVHlwZSA9IHR5cGVvZiBwcm9wVmFsdWUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKHByb3BWYWx1ZSk7XG5cbiAgaWYgKF9yZWFjdDIuZGVmYXVsdC5pc1ZhbGlkRWxlbWVudChwcm9wVmFsdWUpKSB7XG4gICAgcmV0dXJuIG5ldyBFcnJvcignSW52YWxpZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lICsgJ2Agb2YgdHlwZSBSZWFjdEVsZW1lbnQgJyArICgnc3VwcGxpZWQgdG8gYCcgKyBjb21wb25lbnROYW1lICsgJ2AsIGV4cGVjdGVkIGFuIGVsZW1lbnQgdHlwZSAoYSBzdHJpbmcgJykgKyAnb3IgYSBSZWFjdENsYXNzKS4nKTtcbiAgfVxuXG4gIGlmIChwcm9wVHlwZSAhPT0gJ2Z1bmN0aW9uJyAmJiBwcm9wVHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbmV3IEVycm9yKCdJbnZhbGlkICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWUgKyAnYCBvZiB2YWx1ZSBgJyArIHByb3BWYWx1ZSArICdgICcgKyAoJ3N1cHBsaWVkIHRvIGAnICsgY29tcG9uZW50TmFtZSArICdgLCBleHBlY3RlZCBhbiBlbGVtZW50IHR5cGUgKGEgc3RyaW5nICcpICsgJ29yIGEgUmVhY3RDbGFzcykuJyk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gKDAsIF9jcmVhdGVDaGFpbmFibGVUeXBlQ2hlY2tlcjIuZGVmYXVsdCkoZWxlbWVudFR5cGUpOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuZGVmYXVsdCA9IGlzUmVxdWlyZWRGb3JBMTF5O1xuZnVuY3Rpb24gaXNSZXF1aXJlZEZvckExMXkodmFsaWRhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWUpIHtcbiAgICB2YXIgY29tcG9uZW50TmFtZVNhZmUgPSBjb21wb25lbnROYW1lIHx8ICc8PGFub255bW91cz4+JztcbiAgICB2YXIgcHJvcEZ1bGxOYW1lU2FmZSA9IHByb3BGdWxsTmFtZSB8fCBwcm9wTmFtZTtcblxuICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5ldyBFcnJvcignVGhlICcgKyBsb2NhdGlvbiArICcgYCcgKyBwcm9wRnVsbE5hbWVTYWZlICsgJ2AgaXMgcmVxdWlyZWQgdG8gbWFrZSAnICsgKCdgJyArIGNvbXBvbmVudE5hbWVTYWZlICsgJ2AgYWNjZXNzaWJsZSBmb3IgdXNlcnMgb2YgYXNzaXN0aXZlICcpICsgJ3RlY2hub2xvZ2llcyBzdWNoIGFzIHNjcmVlbiByZWFkZXJzLicpO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDUgPyBfbGVuIC0gNSA6IDApLCBfa2V5ID0gNTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gNV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRvci5hcHBseSh1bmRlZmluZWQsIFtwcm9wcywgcHJvcE5hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWVdLmNvbmNhdChhcmdzKSk7XG4gIH07XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5kZWZhdWx0ID0gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXI7XG4vKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG4vLyBNb3N0bHkgdGFrZW4gZnJvbSBSZWFjdFByb3BUeXBlcy5cblxuZnVuY3Rpb24gY3JlYXRlQ2hhaW5hYmxlVHlwZUNoZWNrZXIodmFsaWRhdGUpIHtcbiAgZnVuY3Rpb24gY2hlY2tUeXBlKGlzUmVxdWlyZWQsIHByb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZSwgbG9jYXRpb24sIHByb3BGdWxsTmFtZSkge1xuICAgIHZhciBjb21wb25lbnROYW1lU2FmZSA9IGNvbXBvbmVudE5hbWUgfHwgJzw8YW5vbnltb3VzPj4nO1xuICAgIHZhciBwcm9wRnVsbE5hbWVTYWZlID0gcHJvcEZ1bGxOYW1lIHx8IHByb3BOYW1lO1xuXG4gICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PSBudWxsKSB7XG4gICAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdSZXF1aXJlZCAnICsgbG9jYXRpb24gKyAnIGAnICsgcHJvcEZ1bGxOYW1lU2FmZSArICdgIHdhcyBub3Qgc3BlY2lmaWVkICcgKyAoJ2luIGAnICsgY29tcG9uZW50TmFtZVNhZmUgKyAnYC4nKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiA+IDYgPyBfbGVuIC0gNiA6IDApLCBfa2V5ID0gNjsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gNl0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRlLmFwcGx5KHVuZGVmaW5lZCwgW3Byb3BzLCBwcm9wTmFtZSwgY29tcG9uZW50TmFtZVNhZmUsIGxvY2F0aW9uLCBwcm9wRnVsbE5hbWVTYWZlXS5jb25jYXQoYXJncykpO1xuICB9XG5cbiAgdmFyIGNoYWluZWRDaGVja1R5cGUgPSBjaGVja1R5cGUuYmluZChudWxsLCBmYWxzZSk7XG4gIGNoYWluZWRDaGVja1R5cGUuaXNSZXF1aXJlZCA9IGNoZWNrVHlwZS5iaW5kKG51bGwsIHRydWUpO1xuXG4gIHJldHVybiBjaGFpbmVkQ2hlY2tUeXBlO1xufSIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuY3JlYXRlUHJvdmlkZXIgPSBjcmVhdGVQcm92aWRlcjtcblxudmFyIF9yZWFjdCA9IHJlcXVpcmUoJ3JlYWN0Jyk7XG5cbnZhciBfcHJvcFR5cGVzID0gcmVxdWlyZSgncHJvcC10eXBlcycpO1xuXG52YXIgX3Byb3BUeXBlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wcm9wVHlwZXMpO1xuXG52YXIgX1Byb3BUeXBlcyA9IHJlcXVpcmUoJy4uL3V0aWxzL1Byb3BUeXBlcycpO1xuXG52YXIgX3dhcm5pbmcgPSByZXF1aXJlKCcuLi91dGlscy93YXJuaW5nJyk7XG5cbnZhciBfd2FybmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93YXJuaW5nKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG52YXIgZGlkV2FybkFib3V0UmVjZWl2aW5nU3RvcmUgPSBmYWxzZTtcbmZ1bmN0aW9uIHdhcm5BYm91dFJlY2VpdmluZ1N0b3JlKCkge1xuICBpZiAoZGlkV2FybkFib3V0UmVjZWl2aW5nU3RvcmUpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgZGlkV2FybkFib3V0UmVjZWl2aW5nU3RvcmUgPSB0cnVlO1xuXG4gICgwLCBfd2FybmluZzIuZGVmYXVsdCkoJzxQcm92aWRlcj4gZG9lcyBub3Qgc3VwcG9ydCBjaGFuZ2luZyBgc3RvcmVgIG9uIHRoZSBmbHkuICcgKyAnSXQgaXMgbW9zdCBsaWtlbHkgdGhhdCB5b3Ugc2VlIHRoaXMgZXJyb3IgYmVjYXVzZSB5b3UgdXBkYXRlZCB0byAnICsgJ1JlZHV4IDIueCBhbmQgUmVhY3QgUmVkdXggMi54IHdoaWNoIG5vIGxvbmdlciBob3QgcmVsb2FkIHJlZHVjZXJzICcgKyAnYXV0b21hdGljYWxseS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGpzL3JlYWN0LXJlZHV4L3JlbGVhc2VzLycgKyAndGFnL3YyLjAuMCBmb3IgdGhlIG1pZ3JhdGlvbiBpbnN0cnVjdGlvbnMuJyk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVByb3ZpZGVyKCkge1xuICB2YXIgX1Byb3ZpZGVyJGNoaWxkQ29udGV4O1xuXG4gIHZhciBzdG9yZUtleSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ3N0b3JlJztcbiAgdmFyIHN1YktleSA9IGFyZ3VtZW50c1sxXTtcblxuICB2YXIgc3Vic2NyaXB0aW9uS2V5ID0gc3ViS2V5IHx8IHN0b3JlS2V5ICsgJ1N1YnNjcmlwdGlvbic7XG5cbiAgdmFyIFByb3ZpZGVyID0gZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgICBfaW5oZXJpdHMoUHJvdmlkZXIsIF9Db21wb25lbnQpO1xuXG4gICAgUHJvdmlkZXIucHJvdG90eXBlLmdldENoaWxkQ29udGV4dCA9IGZ1bmN0aW9uIGdldENoaWxkQ29udGV4dCgpIHtcbiAgICAgIHZhciBfcmVmO1xuXG4gICAgICByZXR1cm4gX3JlZiA9IHt9LCBfcmVmW3N0b3JlS2V5XSA9IHRoaXNbc3RvcmVLZXldLCBfcmVmW3N1YnNjcmlwdGlvbktleV0gPSBudWxsLCBfcmVmO1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBQcm92aWRlcihwcm9wcywgY29udGV4dCkge1xuICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIFByb3ZpZGVyKTtcblxuICAgICAgdmFyIF90aGlzID0gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX0NvbXBvbmVudC5jYWxsKHRoaXMsIHByb3BzLCBjb250ZXh0KSk7XG5cbiAgICAgIF90aGlzW3N0b3JlS2V5XSA9IHByb3BzLnN0b3JlO1xuICAgICAgcmV0dXJuIF90aGlzO1xuICAgIH1cblxuICAgIFByb3ZpZGVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICByZXR1cm4gX3JlYWN0LkNoaWxkcmVuLm9ubHkodGhpcy5wcm9wcy5jaGlsZHJlbik7XG4gICAgfTtcblxuICAgIHJldHVybiBQcm92aWRlcjtcbiAgfShfcmVhY3QuQ29tcG9uZW50KTtcblxuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBQcm92aWRlci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyA9IGZ1bmN0aW9uIChuZXh0UHJvcHMpIHtcbiAgICAgIGlmICh0aGlzW3N0b3JlS2V5XSAhPT0gbmV4dFByb3BzLnN0b3JlKSB7XG4gICAgICAgIHdhcm5BYm91dFJlY2VpdmluZ1N0b3JlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIFByb3ZpZGVyLnByb3BUeXBlcyA9IHtcbiAgICBzdG9yZTogX1Byb3BUeXBlcy5zdG9yZVNoYXBlLmlzUmVxdWlyZWQsXG4gICAgY2hpbGRyZW46IF9wcm9wVHlwZXMyLmRlZmF1bHQuZWxlbWVudC5pc1JlcXVpcmVkXG4gIH07XG4gIFByb3ZpZGVyLmNoaWxkQ29udGV4dFR5cGVzID0gKF9Qcm92aWRlciRjaGlsZENvbnRleCA9IHt9LCBfUHJvdmlkZXIkY2hpbGRDb250ZXhbc3RvcmVLZXldID0gX1Byb3BUeXBlcy5zdG9yZVNoYXBlLmlzUmVxdWlyZWQsIF9Qcm92aWRlciRjaGlsZENvbnRleFtzdWJzY3JpcHRpb25LZXldID0gX1Byb3BUeXBlcy5zdWJzY3JpcHRpb25TaGFwZSwgX1Byb3ZpZGVyJGNoaWxkQ29udGV4KTtcbiAgUHJvdmlkZXIuZGlzcGxheU5hbWUgPSAnUHJvdmlkZXInO1xuXG4gIHJldHVybiBQcm92aWRlcjtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gY3JlYXRlUHJvdmlkZXIoKTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGNvbm5lY3RBZHZhbmNlZDtcblxudmFyIF9ob2lzdE5vblJlYWN0U3RhdGljcyA9IHJlcXVpcmUoJ2hvaXN0LW5vbi1yZWFjdC1zdGF0aWNzJyk7XG5cbnZhciBfaG9pc3ROb25SZWFjdFN0YXRpY3MyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaG9pc3ROb25SZWFjdFN0YXRpY3MpO1xuXG52YXIgX2ludmFyaWFudCA9IHJlcXVpcmUoJ2ludmFyaWFudCcpO1xuXG52YXIgX2ludmFyaWFudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbnZhcmlhbnQpO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9TdWJzY3JpcHRpb24gPSByZXF1aXJlKCcuLi91dGlscy9TdWJzY3JpcHRpb24nKTtcblxudmFyIF9TdWJzY3JpcHRpb24yID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU3Vic2NyaXB0aW9uKTtcblxudmFyIF9Qcm9wVHlwZXMgPSByZXF1aXJlKCcuLi91dGlscy9Qcm9wVHlwZXMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgeyBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpOyB9IH1cblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkgeyBpZiAoIXNlbGYpIHsgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpOyB9IHJldHVybiBjYWxsICYmICh0eXBlb2YgY2FsbCA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgY2FsbCA9PT0gXCJmdW5jdGlvblwiKSA/IGNhbGwgOiBzZWxmOyB9XG5cbmZ1bmN0aW9uIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09IFwiZnVuY3Rpb25cIiAmJiBzdXBlckNsYXNzICE9PSBudWxsKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiICsgdHlwZW9mIHN1cGVyQ2xhc3MpOyB9IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwgeyBjb25zdHJ1Y3RvcjogeyB2YWx1ZTogc3ViQ2xhc3MsIGVudW1lcmFibGU6IGZhbHNlLCB3cml0YWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0gfSk7IGlmIChzdXBlckNsYXNzKSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIDogc3ViQ2xhc3MuX19wcm90b19fID0gc3VwZXJDbGFzczsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIgaSBpbiBvYmopIHsgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7IHRhcmdldFtpXSA9IG9ialtpXTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbnZhciBob3RSZWxvYWRpbmdWZXJzaW9uID0gMDtcbnZhciBkdW1teVN0YXRlID0ge307XG5mdW5jdGlvbiBub29wKCkge31cbmZ1bmN0aW9uIG1ha2VTZWxlY3RvclN0YXRlZnVsKHNvdXJjZVNlbGVjdG9yLCBzdG9yZSkge1xuICAvLyB3cmFwIHRoZSBzZWxlY3RvciBpbiBhbiBvYmplY3QgdGhhdCB0cmFja3MgaXRzIHJlc3VsdHMgYmV0d2VlbiBydW5zLlxuICB2YXIgc2VsZWN0b3IgPSB7XG4gICAgcnVuOiBmdW5jdGlvbiBydW5Db21wb25lbnRTZWxlY3Rvcihwcm9wcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIG5leHRQcm9wcyA9IHNvdXJjZVNlbGVjdG9yKHN0b3JlLmdldFN0YXRlKCksIHByb3BzKTtcbiAgICAgICAgaWYgKG5leHRQcm9wcyAhPT0gc2VsZWN0b3IucHJvcHMgfHwgc2VsZWN0b3IuZXJyb3IpIHtcbiAgICAgICAgICBzZWxlY3Rvci5zaG91bGRDb21wb25lbnRVcGRhdGUgPSB0cnVlO1xuICAgICAgICAgIHNlbGVjdG9yLnByb3BzID0gbmV4dFByb3BzO1xuICAgICAgICAgIHNlbGVjdG9yLmVycm9yID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgc2VsZWN0b3Iuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgc2VsZWN0b3IuZXJyb3IgPSBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHNlbGVjdG9yO1xufVxuXG5mdW5jdGlvbiBjb25uZWN0QWR2YW5jZWQoXG4vKlxuICBzZWxlY3RvckZhY3RvcnkgaXMgYSBmdW5jIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHJldHVybmluZyB0aGUgc2VsZWN0b3IgZnVuY3Rpb24gdXNlZCB0b1xuICBjb21wdXRlIG5ldyBwcm9wcyBmcm9tIHN0YXRlLCBwcm9wcywgYW5kIGRpc3BhdGNoLiBGb3IgZXhhbXBsZTpcbiAgICAgZXhwb3J0IGRlZmF1bHQgY29ubmVjdEFkdmFuY2VkKChkaXNwYXRjaCwgb3B0aW9ucykgPT4gKHN0YXRlLCBwcm9wcykgPT4gKHtcbiAgICAgIHRoaW5nOiBzdGF0ZS50aGluZ3NbcHJvcHMudGhpbmdJZF0sXG4gICAgICBzYXZlVGhpbmc6IGZpZWxkcyA9PiBkaXNwYXRjaChhY3Rpb25DcmVhdG9ycy5zYXZlVGhpbmcocHJvcHMudGhpbmdJZCwgZmllbGRzKSksXG4gICAgfSkpKFlvdXJDb21wb25lbnQpXG4gICBBY2Nlc3MgdG8gZGlzcGF0Y2ggaXMgcHJvdmlkZWQgdG8gdGhlIGZhY3Rvcnkgc28gc2VsZWN0b3JGYWN0b3JpZXMgY2FuIGJpbmQgYWN0aW9uQ3JlYXRvcnNcbiAgb3V0c2lkZSBvZiB0aGVpciBzZWxlY3RvciBhcyBhbiBvcHRpbWl6YXRpb24uIE9wdGlvbnMgcGFzc2VkIHRvIGNvbm5lY3RBZHZhbmNlZCBhcmUgcGFzc2VkIHRvXG4gIHRoZSBzZWxlY3RvckZhY3RvcnksIGFsb25nIHdpdGggZGlzcGxheU5hbWUgYW5kIFdyYXBwZWRDb21wb25lbnQsIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQuXG4gICBOb3RlIHRoYXQgc2VsZWN0b3JGYWN0b3J5IGlzIHJlc3BvbnNpYmxlIGZvciBhbGwgY2FjaGluZy9tZW1vaXphdGlvbiBvZiBpbmJvdW5kIGFuZCBvdXRib3VuZFxuICBwcm9wcy4gRG8gbm90IHVzZSBjb25uZWN0QWR2YW5jZWQgZGlyZWN0bHkgd2l0aG91dCBtZW1vaXppbmcgcmVzdWx0cyBiZXR3ZWVuIGNhbGxzIHRvIHlvdXJcbiAgc2VsZWN0b3IsIG90aGVyd2lzZSB0aGUgQ29ubmVjdCBjb21wb25lbnQgd2lsbCByZS1yZW5kZXIgb24gZXZlcnkgc3RhdGUgb3IgcHJvcHMgY2hhbmdlLlxuKi9cbnNlbGVjdG9yRmFjdG9yeSkge1xuICB2YXIgX2NvbnRleHRUeXBlcywgX2NoaWxkQ29udGV4dFR5cGVzO1xuXG4gIHZhciBfcmVmID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fSxcbiAgICAgIF9yZWYkZ2V0RGlzcGxheU5hbWUgPSBfcmVmLmdldERpc3BsYXlOYW1lLFxuICAgICAgZ2V0RGlzcGxheU5hbWUgPSBfcmVmJGdldERpc3BsYXlOYW1lID09PSB1bmRlZmluZWQgPyBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiAnQ29ubmVjdEFkdmFuY2VkKCcgKyBuYW1lICsgJyknO1xuICB9IDogX3JlZiRnZXREaXNwbGF5TmFtZSxcbiAgICAgIF9yZWYkbWV0aG9kTmFtZSA9IF9yZWYubWV0aG9kTmFtZSxcbiAgICAgIG1ldGhvZE5hbWUgPSBfcmVmJG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCA/ICdjb25uZWN0QWR2YW5jZWQnIDogX3JlZiRtZXRob2ROYW1lLFxuICAgICAgX3JlZiRyZW5kZXJDb3VudFByb3AgPSBfcmVmLnJlbmRlckNvdW50UHJvcCxcbiAgICAgIHJlbmRlckNvdW50UHJvcCA9IF9yZWYkcmVuZGVyQ291bnRQcm9wID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBfcmVmJHJlbmRlckNvdW50UHJvcCxcbiAgICAgIF9yZWYkc2hvdWxkSGFuZGxlU3RhdCA9IF9yZWYuc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzLFxuICAgICAgc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzID0gX3JlZiRzaG91bGRIYW5kbGVTdGF0ID09PSB1bmRlZmluZWQgPyB0cnVlIDogX3JlZiRzaG91bGRIYW5kbGVTdGF0LFxuICAgICAgX3JlZiRzdG9yZUtleSA9IF9yZWYuc3RvcmVLZXksXG4gICAgICBzdG9yZUtleSA9IF9yZWYkc3RvcmVLZXkgPT09IHVuZGVmaW5lZCA/ICdzdG9yZScgOiBfcmVmJHN0b3JlS2V5LFxuICAgICAgX3JlZiR3aXRoUmVmID0gX3JlZi53aXRoUmVmLFxuICAgICAgd2l0aFJlZiA9IF9yZWYkd2l0aFJlZiA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBfcmVmJHdpdGhSZWYsXG4gICAgICBjb25uZWN0T3B0aW9ucyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBbJ2dldERpc3BsYXlOYW1lJywgJ21ldGhvZE5hbWUnLCAncmVuZGVyQ291bnRQcm9wJywgJ3Nob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcycsICdzdG9yZUtleScsICd3aXRoUmVmJ10pO1xuXG4gIHZhciBzdWJzY3JpcHRpb25LZXkgPSBzdG9yZUtleSArICdTdWJzY3JpcHRpb24nO1xuICB2YXIgdmVyc2lvbiA9IGhvdFJlbG9hZGluZ1ZlcnNpb24rKztcblxuICB2YXIgY29udGV4dFR5cGVzID0gKF9jb250ZXh0VHlwZXMgPSB7fSwgX2NvbnRleHRUeXBlc1tzdG9yZUtleV0gPSBfUHJvcFR5cGVzLnN0b3JlU2hhcGUsIF9jb250ZXh0VHlwZXNbc3Vic2NyaXB0aW9uS2V5XSA9IF9Qcm9wVHlwZXMuc3Vic2NyaXB0aW9uU2hhcGUsIF9jb250ZXh0VHlwZXMpO1xuICB2YXIgY2hpbGRDb250ZXh0VHlwZXMgPSAoX2NoaWxkQ29udGV4dFR5cGVzID0ge30sIF9jaGlsZENvbnRleHRUeXBlc1tzdWJzY3JpcHRpb25LZXldID0gX1Byb3BUeXBlcy5zdWJzY3JpcHRpb25TaGFwZSwgX2NoaWxkQ29udGV4dFR5cGVzKTtcblxuICByZXR1cm4gZnVuY3Rpb24gd3JhcFdpdGhDb25uZWN0KFdyYXBwZWRDb21wb25lbnQpIHtcbiAgICAoMCwgX2ludmFyaWFudDIuZGVmYXVsdCkodHlwZW9mIFdyYXBwZWRDb21wb25lbnQgPT0gJ2Z1bmN0aW9uJywgJ1lvdSBtdXN0IHBhc3MgYSBjb21wb25lbnQgdG8gdGhlIGZ1bmN0aW9uIHJldHVybmVkIGJ5ICcgKyAoJ2Nvbm5lY3QuIEluc3RlYWQgcmVjZWl2ZWQgJyArIEpTT04uc3RyaW5naWZ5KFdyYXBwZWRDb21wb25lbnQpKSk7XG5cbiAgICB2YXIgd3JhcHBlZENvbXBvbmVudE5hbWUgPSBXcmFwcGVkQ29tcG9uZW50LmRpc3BsYXlOYW1lIHx8IFdyYXBwZWRDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JztcblxuICAgIHZhciBkaXNwbGF5TmFtZSA9IGdldERpc3BsYXlOYW1lKHdyYXBwZWRDb21wb25lbnROYW1lKTtcblxuICAgIHZhciBzZWxlY3RvckZhY3RvcnlPcHRpb25zID0gX2V4dGVuZHMoe30sIGNvbm5lY3RPcHRpb25zLCB7XG4gICAgICBnZXREaXNwbGF5TmFtZTogZ2V0RGlzcGxheU5hbWUsXG4gICAgICBtZXRob2ROYW1lOiBtZXRob2ROYW1lLFxuICAgICAgcmVuZGVyQ291bnRQcm9wOiByZW5kZXJDb3VudFByb3AsXG4gICAgICBzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXM6IHNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcyxcbiAgICAgIHN0b3JlS2V5OiBzdG9yZUtleSxcbiAgICAgIHdpdGhSZWY6IHdpdGhSZWYsXG4gICAgICBkaXNwbGF5TmFtZTogZGlzcGxheU5hbWUsXG4gICAgICB3cmFwcGVkQ29tcG9uZW50TmFtZTogd3JhcHBlZENvbXBvbmVudE5hbWUsXG4gICAgICBXcmFwcGVkQ29tcG9uZW50OiBXcmFwcGVkQ29tcG9uZW50XG4gICAgfSk7XG5cbiAgICB2YXIgQ29ubmVjdCA9IGZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gICAgICBfaW5oZXJpdHMoQ29ubmVjdCwgX0NvbXBvbmVudCk7XG5cbiAgICAgIGZ1bmN0aW9uIENvbm5lY3QocHJvcHMsIGNvbnRleHQpIHtcbiAgICAgICAgX2NsYXNzQ2FsbENoZWNrKHRoaXMsIENvbm5lY3QpO1xuXG4gICAgICAgIHZhciBfdGhpcyA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIF9Db21wb25lbnQuY2FsbCh0aGlzLCBwcm9wcywgY29udGV4dCkpO1xuXG4gICAgICAgIF90aGlzLnZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICBfdGhpcy5zdGF0ZSA9IHt9O1xuICAgICAgICBfdGhpcy5yZW5kZXJDb3VudCA9IDA7XG4gICAgICAgIF90aGlzLnN0b3JlID0gcHJvcHNbc3RvcmVLZXldIHx8IGNvbnRleHRbc3RvcmVLZXldO1xuICAgICAgICBfdGhpcy5wcm9wc01vZGUgPSBCb29sZWFuKHByb3BzW3N0b3JlS2V5XSk7XG4gICAgICAgIF90aGlzLnNldFdyYXBwZWRJbnN0YW5jZSA9IF90aGlzLnNldFdyYXBwZWRJbnN0YW5jZS5iaW5kKF90aGlzKTtcblxuICAgICAgICAoMCwgX2ludmFyaWFudDIuZGVmYXVsdCkoX3RoaXMuc3RvcmUsICdDb3VsZCBub3QgZmluZCBcIicgKyBzdG9yZUtleSArICdcIiBpbiBlaXRoZXIgdGhlIGNvbnRleHQgb3IgcHJvcHMgb2YgJyArICgnXCInICsgZGlzcGxheU5hbWUgKyAnXCIuIEVpdGhlciB3cmFwIHRoZSByb290IGNvbXBvbmVudCBpbiBhIDxQcm92aWRlcj4sICcpICsgKCdvciBleHBsaWNpdGx5IHBhc3MgXCInICsgc3RvcmVLZXkgKyAnXCIgYXMgYSBwcm9wIHRvIFwiJyArIGRpc3BsYXlOYW1lICsgJ1wiLicpKTtcblxuICAgICAgICBfdGhpcy5pbml0U2VsZWN0b3IoKTtcbiAgICAgICAgX3RoaXMuaW5pdFN1YnNjcmlwdGlvbigpO1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgICB9XG5cbiAgICAgIENvbm5lY3QucHJvdG90eXBlLmdldENoaWxkQ29udGV4dCA9IGZ1bmN0aW9uIGdldENoaWxkQ29udGV4dCgpIHtcbiAgICAgICAgdmFyIF9yZWYyO1xuXG4gICAgICAgIC8vIElmIHRoaXMgY29tcG9uZW50IHJlY2VpdmVkIHN0b3JlIGZyb20gcHJvcHMsIGl0cyBzdWJzY3JpcHRpb24gc2hvdWxkIGJlIHRyYW5zcGFyZW50XG4gICAgICAgIC8vIHRvIGFueSBkZXNjZW5kYW50cyByZWNlaXZpbmcgc3RvcmUrc3Vic2NyaXB0aW9uIGZyb20gY29udGV4dDsgaXQgcGFzc2VzIGFsb25nXG4gICAgICAgIC8vIHN1YnNjcmlwdGlvbiBwYXNzZWQgdG8gaXQuIE90aGVyd2lzZSwgaXQgc2hhZG93cyB0aGUgcGFyZW50IHN1YnNjcmlwdGlvbiwgd2hpY2ggYWxsb3dzXG4gICAgICAgIC8vIENvbm5lY3QgdG8gY29udHJvbCBvcmRlcmluZyBvZiBub3RpZmljYXRpb25zIHRvIGZsb3cgdG9wLWRvd24uXG4gICAgICAgIHZhciBzdWJzY3JpcHRpb24gPSB0aGlzLnByb3BzTW9kZSA/IG51bGwgOiB0aGlzLnN1YnNjcmlwdGlvbjtcbiAgICAgICAgcmV0dXJuIF9yZWYyID0ge30sIF9yZWYyW3N1YnNjcmlwdGlvbktleV0gPSBzdWJzY3JpcHRpb24gfHwgdGhpcy5jb250ZXh0W3N1YnNjcmlwdGlvbktleV0sIF9yZWYyO1xuICAgICAgfTtcblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgaWYgKCFzaG91bGRIYW5kbGVTdGF0ZUNoYW5nZXMpIHJldHVybjtcblxuICAgICAgICAvLyBjb21wb25lbnRXaWxsTW91bnQgZmlyZXMgZHVyaW5nIHNlcnZlciBzaWRlIHJlbmRlcmluZywgYnV0IGNvbXBvbmVudERpZE1vdW50IGFuZFxuICAgICAgICAvLyBjb21wb25lbnRXaWxsVW5tb3VudCBkbyBub3QuIEJlY2F1c2Ugb2YgdGhpcywgdHJ5U3Vic2NyaWJlIGhhcHBlbnMgZHVyaW5nIC4uLmRpZE1vdW50LlxuICAgICAgICAvLyBPdGhlcndpc2UsIHVuc3Vic2NyaXB0aW9uIHdvdWxkIG5ldmVyIHRha2UgcGxhY2UgZHVyaW5nIFNTUiwgY2F1c2luZyBhIG1lbW9yeSBsZWFrLlxuICAgICAgICAvLyBUbyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgYSBjaGlsZCBjb21wb25lbnQgbWF5IGhhdmUgdHJpZ2dlcmVkIGEgc3RhdGUgY2hhbmdlIGJ5XG4gICAgICAgIC8vIGRpc3BhdGNoaW5nIGFuIGFjdGlvbiBpbiBpdHMgY29tcG9uZW50V2lsbE1vdW50LCB3ZSBoYXZlIHRvIHJlLXJ1biB0aGUgc2VsZWN0IGFuZCBtYXliZVxuICAgICAgICAvLyByZS1yZW5kZXIuXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uLnRyeVN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLnNlbGVjdG9yLnJ1bih0aGlzLnByb3BzKTtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0b3Iuc2hvdWxkQ29tcG9uZW50VXBkYXRlKSB0aGlzLmZvcmNlVXBkYXRlKCk7XG4gICAgICB9O1xuXG4gICAgICBDb25uZWN0LnByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rvci5ydW4obmV4dFByb3BzKTtcbiAgICAgIH07XG5cbiAgICAgIENvbm5lY3QucHJvdG90eXBlLnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IGZ1bmN0aW9uIHNob3VsZENvbXBvbmVudFVwZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0b3Iuc2hvdWxkQ29tcG9uZW50VXBkYXRlO1xuICAgICAgfTtcblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uKSB0aGlzLnN1YnNjcmlwdGlvbi50cnlVbnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMubm90aWZ5TmVzdGVkU3VicyA9IG5vb3A7XG4gICAgICAgIHRoaXMuc3RvcmUgPSBudWxsO1xuICAgICAgICB0aGlzLnNlbGVjdG9yLnJ1biA9IG5vb3A7XG4gICAgICAgIHRoaXMuc2VsZWN0b3Iuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZmFsc2U7XG4gICAgICB9O1xuXG4gICAgICBDb25uZWN0LnByb3RvdHlwZS5nZXRXcmFwcGVkSW5zdGFuY2UgPSBmdW5jdGlvbiBnZXRXcmFwcGVkSW5zdGFuY2UoKSB7XG4gICAgICAgICgwLCBfaW52YXJpYW50Mi5kZWZhdWx0KSh3aXRoUmVmLCAnVG8gYWNjZXNzIHRoZSB3cmFwcGVkIGluc3RhbmNlLCB5b3UgbmVlZCB0byBzcGVjaWZ5ICcgKyAoJ3sgd2l0aFJlZjogdHJ1ZSB9IGluIHRoZSBvcHRpb25zIGFyZ3VtZW50IG9mIHRoZSAnICsgbWV0aG9kTmFtZSArICcoKSBjYWxsLicpKTtcbiAgICAgICAgcmV0dXJuIHRoaXMud3JhcHBlZEluc3RhbmNlO1xuICAgICAgfTtcblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUuc2V0V3JhcHBlZEluc3RhbmNlID0gZnVuY3Rpb24gc2V0V3JhcHBlZEluc3RhbmNlKHJlZikge1xuICAgICAgICB0aGlzLndyYXBwZWRJbnN0YW5jZSA9IHJlZjtcbiAgICAgIH07XG5cbiAgICAgIENvbm5lY3QucHJvdG90eXBlLmluaXRTZWxlY3RvciA9IGZ1bmN0aW9uIGluaXRTZWxlY3RvcigpIHtcbiAgICAgICAgdmFyIHNvdXJjZVNlbGVjdG9yID0gc2VsZWN0b3JGYWN0b3J5KHRoaXMuc3RvcmUuZGlzcGF0Y2gsIHNlbGVjdG9yRmFjdG9yeU9wdGlvbnMpO1xuICAgICAgICB0aGlzLnNlbGVjdG9yID0gbWFrZVNlbGVjdG9yU3RhdGVmdWwoc291cmNlU2VsZWN0b3IsIHRoaXMuc3RvcmUpO1xuICAgICAgICB0aGlzLnNlbGVjdG9yLnJ1bih0aGlzLnByb3BzKTtcbiAgICAgIH07XG5cbiAgICAgIENvbm5lY3QucHJvdG90eXBlLmluaXRTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiBpbml0U3Vic2NyaXB0aW9uKCkge1xuICAgICAgICBpZiAoIXNob3VsZEhhbmRsZVN0YXRlQ2hhbmdlcykgcmV0dXJuO1xuXG4gICAgICAgIC8vIHBhcmVudFN1YidzIHNvdXJjZSBzaG91bGQgbWF0Y2ggd2hlcmUgc3RvcmUgY2FtZSBmcm9tOiBwcm9wcyB2cy4gY29udGV4dC4gQSBjb21wb25lbnRcbiAgICAgICAgLy8gY29ubmVjdGVkIHRvIHRoZSBzdG9yZSB2aWEgcHJvcHMgc2hvdWxkbid0IHVzZSBzdWJzY3JpcHRpb24gZnJvbSBjb250ZXh0LCBvciB2aWNlIHZlcnNhLlxuICAgICAgICB2YXIgcGFyZW50U3ViID0gKHRoaXMucHJvcHNNb2RlID8gdGhpcy5wcm9wcyA6IHRoaXMuY29udGV4dClbc3Vic2NyaXB0aW9uS2V5XTtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBuZXcgX1N1YnNjcmlwdGlvbjIuZGVmYXVsdCh0aGlzLnN0b3JlLCBwYXJlbnRTdWIsIHRoaXMub25TdGF0ZUNoYW5nZS5iaW5kKHRoaXMpKTtcblxuICAgICAgICAvLyBgbm90aWZ5TmVzdGVkU3Vic2AgaXMgZHVwbGljYXRlZCB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGNvbXBvbmVudCBpcyAgdW5tb3VudGVkIGluXG4gICAgICAgIC8vIHRoZSBtaWRkbGUgb2YgdGhlIG5vdGlmaWNhdGlvbiBsb29wLCB3aGVyZSBgdGhpcy5zdWJzY3JpcHRpb25gIHdpbGwgdGhlbiBiZSBudWxsLiBBblxuICAgICAgICAvLyBleHRyYSBudWxsIGNoZWNrIGV2ZXJ5IGNoYW5nZSBjYW4gYmUgYXZvaWRlZCBieSBjb3B5aW5nIHRoZSBtZXRob2Qgb250byBgdGhpc2AgYW5kIHRoZW5cbiAgICAgICAgLy8gcmVwbGFjaW5nIGl0IHdpdGggYSBuby1vcCBvbiB1bm1vdW50LiBUaGlzIGNhbiBwcm9iYWJseSBiZSBhdm9pZGVkIGlmIFN1YnNjcmlwdGlvbidzXG4gICAgICAgIC8vIGxpc3RlbmVycyBsb2dpYyBpcyBjaGFuZ2VkIHRvIG5vdCBjYWxsIGxpc3RlbmVycyB0aGF0IGhhdmUgYmVlbiB1bnN1YnNjcmliZWQgaW4gdGhlXG4gICAgICAgIC8vIG1pZGRsZSBvZiB0aGUgbm90aWZpY2F0aW9uIGxvb3AuXG4gICAgICAgIHRoaXMubm90aWZ5TmVzdGVkU3VicyA9IHRoaXMuc3Vic2NyaXB0aW9uLm5vdGlmeU5lc3RlZFN1YnMuYmluZCh0aGlzLnN1YnNjcmlwdGlvbik7XG4gICAgICB9O1xuXG4gICAgICBDb25uZWN0LnByb3RvdHlwZS5vblN0YXRlQ2hhbmdlID0gZnVuY3Rpb24gb25TdGF0ZUNoYW5nZSgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rvci5ydW4odGhpcy5wcm9wcyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdG9yLnNob3VsZENvbXBvbmVudFVwZGF0ZSkge1xuICAgICAgICAgIHRoaXMubm90aWZ5TmVzdGVkU3VicygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY29tcG9uZW50RGlkVXBkYXRlID0gdGhpcy5ub3RpZnlOZXN0ZWRTdWJzT25Db21wb25lbnREaWRVcGRhdGU7XG4gICAgICAgICAgdGhpcy5zZXRTdGF0ZShkdW1teVN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUubm90aWZ5TmVzdGVkU3Vic09uQ29tcG9uZW50RGlkVXBkYXRlID0gZnVuY3Rpb24gbm90aWZ5TmVzdGVkU3Vic09uQ29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgICAvLyBgY29tcG9uZW50RGlkVXBkYXRlYCBpcyBjb25kaXRpb25hbGx5IGltcGxlbWVudGVkIHdoZW4gYG9uU3RhdGVDaGFuZ2VgIGRldGVybWluZXMgaXRcbiAgICAgICAgLy8gbmVlZHMgdG8gbm90aWZ5IG5lc3RlZCBzdWJzLiBPbmNlIGNhbGxlZCwgaXQgdW5pbXBsZW1lbnRzIGl0c2VsZiB1bnRpbCBmdXJ0aGVyIHN0YXRlXG4gICAgICAgIC8vIGNoYW5nZXMgb2NjdXIuIERvaW5nIGl0IHRoaXMgd2F5IHZzIGhhdmluZyBhIHBlcm1hbmVudCBgY29tcG9uZW50RGlkTW91bnRgIHRoYXQgZG9lc1xuICAgICAgICAvLyBhIGJvb2xlYW4gY2hlY2sgZXZlcnkgdGltZSBhdm9pZHMgYW4gZXh0cmEgbWV0aG9kIGNhbGwgbW9zdCBvZiB0aGUgdGltZSwgcmVzdWx0aW5nXG4gICAgICAgIC8vIGluIHNvbWUgcGVyZiBib29zdC5cbiAgICAgICAgdGhpcy5jb21wb25lbnREaWRVcGRhdGUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubm90aWZ5TmVzdGVkU3VicygpO1xuICAgICAgfTtcblxuICAgICAgQ29ubmVjdC5wcm90b3R5cGUuaXNTdWJzY3JpYmVkID0gZnVuY3Rpb24gaXNTdWJzY3JpYmVkKCkge1xuICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLnN1YnNjcmlwdGlvbikgJiYgdGhpcy5zdWJzY3JpcHRpb24uaXNTdWJzY3JpYmVkKCk7XG4gICAgICB9O1xuXG4gICAgICBDb25uZWN0LnByb3RvdHlwZS5hZGRFeHRyYVByb3BzID0gZnVuY3Rpb24gYWRkRXh0cmFQcm9wcyhwcm9wcykge1xuICAgICAgICBpZiAoIXdpdGhSZWYgJiYgIXJlbmRlckNvdW50UHJvcCAmJiAhKHRoaXMucHJvcHNNb2RlICYmIHRoaXMuc3Vic2NyaXB0aW9uKSkgcmV0dXJuIHByb3BzO1xuICAgICAgICAvLyBtYWtlIGEgc2hhbGxvdyBjb3B5IHNvIHRoYXQgZmllbGRzIGFkZGVkIGRvbid0IGxlYWsgdG8gdGhlIG9yaWdpbmFsIHNlbGVjdG9yLlxuICAgICAgICAvLyB0aGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciAncmVmJyBzaW5jZSB0aGF0J3MgYSByZWZlcmVuY2UgYmFjayB0byB0aGUgY29tcG9uZW50XG4gICAgICAgIC8vIGluc3RhbmNlLiBhIHNpbmdsZXRvbiBtZW1vaXplZCBzZWxlY3RvciB3b3VsZCB0aGVuIGJlIGhvbGRpbmcgYSByZWZlcmVuY2UgdG8gdGhlXG4gICAgICAgIC8vIGluc3RhbmNlLCBwcmV2ZW50aW5nIHRoZSBpbnN0YW5jZSBmcm9tIGJlaW5nIGdhcmJhZ2UgY29sbGVjdGVkLCBhbmQgdGhhdCB3b3VsZCBiZSBiYWRcbiAgICAgICAgdmFyIHdpdGhFeHRyYXMgPSBfZXh0ZW5kcyh7fSwgcHJvcHMpO1xuICAgICAgICBpZiAod2l0aFJlZikgd2l0aEV4dHJhcy5yZWYgPSB0aGlzLnNldFdyYXBwZWRJbnN0YW5jZTtcbiAgICAgICAgaWYgKHJlbmRlckNvdW50UHJvcCkgd2l0aEV4dHJhc1tyZW5kZXJDb3VudFByb3BdID0gdGhpcy5yZW5kZXJDb3VudCsrO1xuICAgICAgICBpZiAodGhpcy5wcm9wc01vZGUgJiYgdGhpcy5zdWJzY3JpcHRpb24pIHdpdGhFeHRyYXNbc3Vic2NyaXB0aW9uS2V5XSA9IHRoaXMuc3Vic2NyaXB0aW9uO1xuICAgICAgICByZXR1cm4gd2l0aEV4dHJhcztcbiAgICAgIH07XG5cbiAgICAgIENvbm5lY3QucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgdmFyIHNlbGVjdG9yID0gdGhpcy5zZWxlY3RvcjtcbiAgICAgICAgc2VsZWN0b3Iuc2hvdWxkQ29tcG9uZW50VXBkYXRlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHNlbGVjdG9yLmVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgc2VsZWN0b3IuZXJyb3I7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuICgwLCBfcmVhY3QuY3JlYXRlRWxlbWVudCkoV3JhcHBlZENvbXBvbmVudCwgdGhpcy5hZGRFeHRyYVByb3BzKHNlbGVjdG9yLnByb3BzKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBDb25uZWN0O1xuICAgIH0oX3JlYWN0LkNvbXBvbmVudCk7XG5cbiAgICBDb25uZWN0LldyYXBwZWRDb21wb25lbnQgPSBXcmFwcGVkQ29tcG9uZW50O1xuICAgIENvbm5lY3QuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcbiAgICBDb25uZWN0LmNoaWxkQ29udGV4dFR5cGVzID0gY2hpbGRDb250ZXh0VHlwZXM7XG4gICAgQ29ubmVjdC5jb250ZXh0VHlwZXMgPSBjb250ZXh0VHlwZXM7XG4gICAgQ29ubmVjdC5wcm9wVHlwZXMgPSBjb250ZXh0VHlwZXM7XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIENvbm5lY3QucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVcGRhdGUgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVXBkYXRlKCkge1xuICAgICAgICAvLyBXZSBhcmUgaG90IHJlbG9hZGluZyFcbiAgICAgICAgaWYgKHRoaXMudmVyc2lvbiAhPT0gdmVyc2lvbikge1xuICAgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgICAgdGhpcy5pbml0U2VsZWN0b3IoKTtcblxuICAgICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbikgdGhpcy5zdWJzY3JpcHRpb24udHJ5VW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB0aGlzLmluaXRTdWJzY3JpcHRpb24oKTtcbiAgICAgICAgICBpZiAoc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzKSB0aGlzLnN1YnNjcmlwdGlvbi50cnlTdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gKDAsIF9ob2lzdE5vblJlYWN0U3RhdGljczIuZGVmYXVsdCkoQ29ubmVjdCwgV3JhcHBlZENvbXBvbmVudCk7XG4gIH07XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9O1xuXG5leHBvcnRzLmNyZWF0ZUNvbm5lY3QgPSBjcmVhdGVDb25uZWN0O1xuXG52YXIgX2Nvbm5lY3RBZHZhbmNlZCA9IHJlcXVpcmUoJy4uL2NvbXBvbmVudHMvY29ubmVjdEFkdmFuY2VkJyk7XG5cbnZhciBfY29ubmVjdEFkdmFuY2VkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Nvbm5lY3RBZHZhbmNlZCk7XG5cbnZhciBfc2hhbGxvd0VxdWFsID0gcmVxdWlyZSgnLi4vdXRpbHMvc2hhbGxvd0VxdWFsJyk7XG5cbnZhciBfc2hhbGxvd0VxdWFsMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NoYWxsb3dFcXVhbCk7XG5cbnZhciBfbWFwRGlzcGF0Y2hUb1Byb3BzID0gcmVxdWlyZSgnLi9tYXBEaXNwYXRjaFRvUHJvcHMnKTtcblxudmFyIF9tYXBEaXNwYXRjaFRvUHJvcHMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfbWFwRGlzcGF0Y2hUb1Byb3BzKTtcblxudmFyIF9tYXBTdGF0ZVRvUHJvcHMgPSByZXF1aXJlKCcuL21hcFN0YXRlVG9Qcm9wcycpO1xuXG52YXIgX21hcFN0YXRlVG9Qcm9wczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9tYXBTdGF0ZVRvUHJvcHMpO1xuXG52YXIgX21lcmdlUHJvcHMgPSByZXF1aXJlKCcuL21lcmdlUHJvcHMnKTtcblxudmFyIF9tZXJnZVByb3BzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX21lcmdlUHJvcHMpO1xuXG52YXIgX3NlbGVjdG9yRmFjdG9yeSA9IHJlcXVpcmUoJy4vc2VsZWN0b3JGYWN0b3J5Jyk7XG5cbnZhciBfc2VsZWN0b3JGYWN0b3J5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3NlbGVjdG9yRmFjdG9yeSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhvYmosIGtleXMpIHsgdmFyIHRhcmdldCA9IHt9OyBmb3IgKHZhciBpIGluIG9iaikgeyBpZiAoa2V5cy5pbmRleE9mKGkpID49IDApIGNvbnRpbnVlOyBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGkpKSBjb250aW51ZTsgdGFyZ2V0W2ldID0gb2JqW2ldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuLypcbiAgY29ubmVjdCBpcyBhIGZhY2FkZSBvdmVyIGNvbm5lY3RBZHZhbmNlZC4gSXQgdHVybnMgaXRzIGFyZ3MgaW50byBhIGNvbXBhdGlibGVcbiAgc2VsZWN0b3JGYWN0b3J5LCB3aGljaCBoYXMgdGhlIHNpZ25hdHVyZTpcblxuICAgIChkaXNwYXRjaCwgb3B0aW9ucykgPT4gKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSA9PiBuZXh0RmluYWxQcm9wc1xuICBcbiAgY29ubmVjdCBwYXNzZXMgaXRzIGFyZ3MgdG8gY29ubmVjdEFkdmFuY2VkIGFzIG9wdGlvbnMsIHdoaWNoIHdpbGwgaW4gdHVybiBwYXNzIHRoZW0gdG9cbiAgc2VsZWN0b3JGYWN0b3J5IGVhY2ggdGltZSBhIENvbm5lY3QgY29tcG9uZW50IGluc3RhbmNlIGlzIGluc3RhbnRpYXRlZCBvciBob3QgcmVsb2FkZWQuXG5cbiAgc2VsZWN0b3JGYWN0b3J5IHJldHVybnMgYSBmaW5hbCBwcm9wcyBzZWxlY3RvciBmcm9tIGl0cyBtYXBTdGF0ZVRvUHJvcHMsXG4gIG1hcFN0YXRlVG9Qcm9wc0ZhY3RvcmllcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3JpZXMsIG1lcmdlUHJvcHMsXG4gIG1lcmdlUHJvcHNGYWN0b3JpZXMsIGFuZCBwdXJlIGFyZ3MuXG5cbiAgVGhlIHJlc3VsdGluZyBmaW5hbCBwcm9wcyBzZWxlY3RvciBpcyBjYWxsZWQgYnkgdGhlIENvbm5lY3QgY29tcG9uZW50IGluc3RhbmNlIHdoZW5ldmVyXG4gIGl0IHJlY2VpdmVzIG5ldyBwcm9wcyBvciBzdG9yZSBzdGF0ZS5cbiAqL1xuXG5mdW5jdGlvbiBtYXRjaChhcmcsIGZhY3RvcmllcywgbmFtZSkge1xuICBmb3IgKHZhciBpID0gZmFjdG9yaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgdmFyIHJlc3VsdCA9IGZhY3Rvcmllc1tpXShhcmcpO1xuICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKGRpc3BhdGNoLCBvcHRpb25zKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhbHVlIG9mIHR5cGUgJyArIHR5cGVvZiBhcmcgKyAnIGZvciAnICsgbmFtZSArICcgYXJndW1lbnQgd2hlbiBjb25uZWN0aW5nIGNvbXBvbmVudCAnICsgb3B0aW9ucy53cmFwcGVkQ29tcG9uZW50TmFtZSArICcuJyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0cmljdEVxdWFsKGEsIGIpIHtcbiAgcmV0dXJuIGEgPT09IGI7XG59XG5cbi8vIGNyZWF0ZUNvbm5lY3Qgd2l0aCBkZWZhdWx0IGFyZ3MgYnVpbGRzIHRoZSAnb2ZmaWNpYWwnIGNvbm5lY3QgYmVoYXZpb3IuIENhbGxpbmcgaXQgd2l0aFxuLy8gZGlmZmVyZW50IG9wdGlvbnMgb3BlbnMgdXAgc29tZSB0ZXN0aW5nIGFuZCBleHRlbnNpYmlsaXR5IHNjZW5hcmlvc1xuZnVuY3Rpb24gY3JlYXRlQ29ubmVjdCgpIHtcbiAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9LFxuICAgICAgX3JlZiRjb25uZWN0SE9DID0gX3JlZi5jb25uZWN0SE9DLFxuICAgICAgY29ubmVjdEhPQyA9IF9yZWYkY29ubmVjdEhPQyA9PT0gdW5kZWZpbmVkID8gX2Nvbm5lY3RBZHZhbmNlZDIuZGVmYXVsdCA6IF9yZWYkY29ubmVjdEhPQyxcbiAgICAgIF9yZWYkbWFwU3RhdGVUb1Byb3BzRiA9IF9yZWYubWFwU3RhdGVUb1Byb3BzRmFjdG9yaWVzLFxuICAgICAgbWFwU3RhdGVUb1Byb3BzRmFjdG9yaWVzID0gX3JlZiRtYXBTdGF0ZVRvUHJvcHNGID09PSB1bmRlZmluZWQgPyBfbWFwU3RhdGVUb1Byb3BzMi5kZWZhdWx0IDogX3JlZiRtYXBTdGF0ZVRvUHJvcHNGLFxuICAgICAgX3JlZiRtYXBEaXNwYXRjaFRvUHJvID0gX3JlZi5tYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3JpZXMsXG4gICAgICBtYXBEaXNwYXRjaFRvUHJvcHNGYWN0b3JpZXMgPSBfcmVmJG1hcERpc3BhdGNoVG9Qcm8gPT09IHVuZGVmaW5lZCA/IF9tYXBEaXNwYXRjaFRvUHJvcHMyLmRlZmF1bHQgOiBfcmVmJG1hcERpc3BhdGNoVG9Qcm8sXG4gICAgICBfcmVmJG1lcmdlUHJvcHNGYWN0b3IgPSBfcmVmLm1lcmdlUHJvcHNGYWN0b3JpZXMsXG4gICAgICBtZXJnZVByb3BzRmFjdG9yaWVzID0gX3JlZiRtZXJnZVByb3BzRmFjdG9yID09PSB1bmRlZmluZWQgPyBfbWVyZ2VQcm9wczIuZGVmYXVsdCA6IF9yZWYkbWVyZ2VQcm9wc0ZhY3RvcixcbiAgICAgIF9yZWYkc2VsZWN0b3JGYWN0b3J5ID0gX3JlZi5zZWxlY3RvckZhY3RvcnksXG4gICAgICBzZWxlY3RvckZhY3RvcnkgPSBfcmVmJHNlbGVjdG9yRmFjdG9yeSA9PT0gdW5kZWZpbmVkID8gX3NlbGVjdG9yRmFjdG9yeTIuZGVmYXVsdCA6IF9yZWYkc2VsZWN0b3JGYWN0b3J5O1xuXG4gIHJldHVybiBmdW5jdGlvbiBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzKSB7XG4gICAgdmFyIF9yZWYyID0gYXJndW1lbnRzLmxlbmd0aCA+IDMgJiYgYXJndW1lbnRzWzNdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbM10gOiB7fSxcbiAgICAgICAgX3JlZjIkcHVyZSA9IF9yZWYyLnB1cmUsXG4gICAgICAgIHB1cmUgPSBfcmVmMiRwdXJlID09PSB1bmRlZmluZWQgPyB0cnVlIDogX3JlZjIkcHVyZSxcbiAgICAgICAgX3JlZjIkYXJlU3RhdGVzRXF1YWwgPSBfcmVmMi5hcmVTdGF0ZXNFcXVhbCxcbiAgICAgICAgYXJlU3RhdGVzRXF1YWwgPSBfcmVmMiRhcmVTdGF0ZXNFcXVhbCA9PT0gdW5kZWZpbmVkID8gc3RyaWN0RXF1YWwgOiBfcmVmMiRhcmVTdGF0ZXNFcXVhbCxcbiAgICAgICAgX3JlZjIkYXJlT3duUHJvcHNFcXVhID0gX3JlZjIuYXJlT3duUHJvcHNFcXVhbCxcbiAgICAgICAgYXJlT3duUHJvcHNFcXVhbCA9IF9yZWYyJGFyZU93blByb3BzRXF1YSA9PT0gdW5kZWZpbmVkID8gX3NoYWxsb3dFcXVhbDIuZGVmYXVsdCA6IF9yZWYyJGFyZU93blByb3BzRXF1YSxcbiAgICAgICAgX3JlZjIkYXJlU3RhdGVQcm9wc0VxID0gX3JlZjIuYXJlU3RhdGVQcm9wc0VxdWFsLFxuICAgICAgICBhcmVTdGF0ZVByb3BzRXF1YWwgPSBfcmVmMiRhcmVTdGF0ZVByb3BzRXEgPT09IHVuZGVmaW5lZCA/IF9zaGFsbG93RXF1YWwyLmRlZmF1bHQgOiBfcmVmMiRhcmVTdGF0ZVByb3BzRXEsXG4gICAgICAgIF9yZWYyJGFyZU1lcmdlZFByb3BzRSA9IF9yZWYyLmFyZU1lcmdlZFByb3BzRXF1YWwsXG4gICAgICAgIGFyZU1lcmdlZFByb3BzRXF1YWwgPSBfcmVmMiRhcmVNZXJnZWRQcm9wc0UgPT09IHVuZGVmaW5lZCA/IF9zaGFsbG93RXF1YWwyLmRlZmF1bHQgOiBfcmVmMiRhcmVNZXJnZWRQcm9wc0UsXG4gICAgICAgIGV4dHJhT3B0aW9ucyA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmMiwgWydwdXJlJywgJ2FyZVN0YXRlc0VxdWFsJywgJ2FyZU93blByb3BzRXF1YWwnLCAnYXJlU3RhdGVQcm9wc0VxdWFsJywgJ2FyZU1lcmdlZFByb3BzRXF1YWwnXSk7XG5cbiAgICB2YXIgaW5pdE1hcFN0YXRlVG9Qcm9wcyA9IG1hdGNoKG1hcFN0YXRlVG9Qcm9wcywgbWFwU3RhdGVUb1Byb3BzRmFjdG9yaWVzLCAnbWFwU3RhdGVUb1Byb3BzJyk7XG4gICAgdmFyIGluaXRNYXBEaXNwYXRjaFRvUHJvcHMgPSBtYXRjaChtYXBEaXNwYXRjaFRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wc0ZhY3RvcmllcywgJ21hcERpc3BhdGNoVG9Qcm9wcycpO1xuICAgIHZhciBpbml0TWVyZ2VQcm9wcyA9IG1hdGNoKG1lcmdlUHJvcHMsIG1lcmdlUHJvcHNGYWN0b3JpZXMsICdtZXJnZVByb3BzJyk7XG5cbiAgICByZXR1cm4gY29ubmVjdEhPQyhzZWxlY3RvckZhY3RvcnksIF9leHRlbmRzKHtcbiAgICAgIC8vIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXNcbiAgICAgIG1ldGhvZE5hbWU6ICdjb25uZWN0JyxcblxuICAgICAgLy8gdXNlZCB0byBjb21wdXRlIENvbm5lY3QncyBkaXNwbGF5TmFtZSBmcm9tIHRoZSB3cmFwcGVkIGNvbXBvbmVudCdzIGRpc3BsYXlOYW1lLlxuICAgICAgZ2V0RGlzcGxheU5hbWU6IGZ1bmN0aW9uIGdldERpc3BsYXlOYW1lKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuICdDb25uZWN0KCcgKyBuYW1lICsgJyknO1xuICAgICAgfSxcblxuICAgICAgLy8gaWYgbWFwU3RhdGVUb1Byb3BzIGlzIGZhbHN5LCB0aGUgQ29ubmVjdCBjb21wb25lbnQgZG9lc24ndCBzdWJzY3JpYmUgdG8gc3RvcmUgc3RhdGUgY2hhbmdlc1xuICAgICAgc2hvdWxkSGFuZGxlU3RhdGVDaGFuZ2VzOiBCb29sZWFuKG1hcFN0YXRlVG9Qcm9wcyksXG5cbiAgICAgIC8vIHBhc3NlZCB0aHJvdWdoIHRvIHNlbGVjdG9yRmFjdG9yeVxuICAgICAgaW5pdE1hcFN0YXRlVG9Qcm9wczogaW5pdE1hcFN0YXRlVG9Qcm9wcyxcbiAgICAgIGluaXRNYXBEaXNwYXRjaFRvUHJvcHM6IGluaXRNYXBEaXNwYXRjaFRvUHJvcHMsXG4gICAgICBpbml0TWVyZ2VQcm9wczogaW5pdE1lcmdlUHJvcHMsXG4gICAgICBwdXJlOiBwdXJlLFxuICAgICAgYXJlU3RhdGVzRXF1YWw6IGFyZVN0YXRlc0VxdWFsLFxuICAgICAgYXJlT3duUHJvcHNFcXVhbDogYXJlT3duUHJvcHNFcXVhbCxcbiAgICAgIGFyZVN0YXRlUHJvcHNFcXVhbDogYXJlU3RhdGVQcm9wc0VxdWFsLFxuICAgICAgYXJlTWVyZ2VkUHJvcHNFcXVhbDogYXJlTWVyZ2VkUHJvcHNFcXVhbFxuXG4gICAgfSwgZXh0cmFPcHRpb25zKSk7XG4gIH07XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGNyZWF0ZUNvbm5lY3QoKTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLndoZW5NYXBEaXNwYXRjaFRvUHJvcHNJc0Z1bmN0aW9uID0gd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzRnVuY3Rpb247XG5leHBvcnRzLndoZW5NYXBEaXNwYXRjaFRvUHJvcHNJc01pc3NpbmcgPSB3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNNaXNzaW5nO1xuZXhwb3J0cy53aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNPYmplY3QgPSB3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNPYmplY3Q7XG5cbnZhciBfcmVkdXggPSByZXF1aXJlKCdyZWR1eCcpO1xuXG52YXIgX3dyYXBNYXBUb1Byb3BzID0gcmVxdWlyZSgnLi93cmFwTWFwVG9Qcm9wcycpO1xuXG5mdW5jdGlvbiB3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNGdW5jdGlvbihtYXBEaXNwYXRjaFRvUHJvcHMpIHtcbiAgcmV0dXJuIHR5cGVvZiBtYXBEaXNwYXRjaFRvUHJvcHMgPT09ICdmdW5jdGlvbicgPyAoMCwgX3dyYXBNYXBUb1Byb3BzLndyYXBNYXBUb1Byb3BzRnVuYykobWFwRGlzcGF0Y2hUb1Byb3BzLCAnbWFwRGlzcGF0Y2hUb1Byb3BzJykgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHdoZW5NYXBEaXNwYXRjaFRvUHJvcHNJc01pc3NpbmcobWFwRGlzcGF0Y2hUb1Byb3BzKSB7XG4gIHJldHVybiAhbWFwRGlzcGF0Y2hUb1Byb3BzID8gKDAsIF93cmFwTWFwVG9Qcm9wcy53cmFwTWFwVG9Qcm9wc0NvbnN0YW50KShmdW5jdGlvbiAoZGlzcGF0Y2gpIHtcbiAgICByZXR1cm4geyBkaXNwYXRjaDogZGlzcGF0Y2ggfTtcbiAgfSkgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHdoZW5NYXBEaXNwYXRjaFRvUHJvcHNJc09iamVjdChtYXBEaXNwYXRjaFRvUHJvcHMpIHtcbiAgcmV0dXJuIG1hcERpc3BhdGNoVG9Qcm9wcyAmJiB0eXBlb2YgbWFwRGlzcGF0Y2hUb1Byb3BzID09PSAnb2JqZWN0JyA/ICgwLCBfd3JhcE1hcFRvUHJvcHMud3JhcE1hcFRvUHJvcHNDb25zdGFudCkoZnVuY3Rpb24gKGRpc3BhdGNoKSB7XG4gICAgcmV0dXJuICgwLCBfcmVkdXguYmluZEFjdGlvbkNyZWF0b3JzKShtYXBEaXNwYXRjaFRvUHJvcHMsIGRpc3BhdGNoKTtcbiAgfSkgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFt3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNGdW5jdGlvbiwgd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzTWlzc2luZywgd2hlbk1hcERpc3BhdGNoVG9Qcm9wc0lzT2JqZWN0XTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLndoZW5NYXBTdGF0ZVRvUHJvcHNJc0Z1bmN0aW9uID0gd2hlbk1hcFN0YXRlVG9Qcm9wc0lzRnVuY3Rpb247XG5leHBvcnRzLndoZW5NYXBTdGF0ZVRvUHJvcHNJc01pc3NpbmcgPSB3aGVuTWFwU3RhdGVUb1Byb3BzSXNNaXNzaW5nO1xuXG52YXIgX3dyYXBNYXBUb1Byb3BzID0gcmVxdWlyZSgnLi93cmFwTWFwVG9Qcm9wcycpO1xuXG5mdW5jdGlvbiB3aGVuTWFwU3RhdGVUb1Byb3BzSXNGdW5jdGlvbihtYXBTdGF0ZVRvUHJvcHMpIHtcbiAgcmV0dXJuIHR5cGVvZiBtYXBTdGF0ZVRvUHJvcHMgPT09ICdmdW5jdGlvbicgPyAoMCwgX3dyYXBNYXBUb1Byb3BzLndyYXBNYXBUb1Byb3BzRnVuYykobWFwU3RhdGVUb1Byb3BzLCAnbWFwU3RhdGVUb1Byb3BzJykgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIHdoZW5NYXBTdGF0ZVRvUHJvcHNJc01pc3NpbmcobWFwU3RhdGVUb1Byb3BzKSB7XG4gIHJldHVybiAhbWFwU3RhdGVUb1Byb3BzID8gKDAsIF93cmFwTWFwVG9Qcm9wcy53cmFwTWFwVG9Qcm9wc0NvbnN0YW50KShmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9KSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gW3doZW5NYXBTdGF0ZVRvUHJvcHNJc0Z1bmN0aW9uLCB3aGVuTWFwU3RhdGVUb1Byb3BzSXNNaXNzaW5nXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbmV4cG9ydHMuZGVmYXVsdE1lcmdlUHJvcHMgPSBkZWZhdWx0TWVyZ2VQcm9wcztcbmV4cG9ydHMud3JhcE1lcmdlUHJvcHNGdW5jID0gd3JhcE1lcmdlUHJvcHNGdW5jO1xuZXhwb3J0cy53aGVuTWVyZ2VQcm9wc0lzRnVuY3Rpb24gPSB3aGVuTWVyZ2VQcm9wc0lzRnVuY3Rpb247XG5leHBvcnRzLndoZW5NZXJnZVByb3BzSXNPbWl0dGVkID0gd2hlbk1lcmdlUHJvcHNJc09taXR0ZWQ7XG5cbnZhciBfdmVyaWZ5UGxhaW5PYmplY3QgPSByZXF1aXJlKCcuLi91dGlscy92ZXJpZnlQbGFpbk9iamVjdCcpO1xuXG52YXIgX3ZlcmlmeVBsYWluT2JqZWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX3ZlcmlmeVBsYWluT2JqZWN0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gZGVmYXVsdE1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpIHtcbiAgcmV0dXJuIF9leHRlbmRzKHt9LCBvd25Qcm9wcywgc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcyk7XG59XG5cbmZ1bmN0aW9uIHdyYXBNZXJnZVByb3BzRnVuYyhtZXJnZVByb3BzKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbml0TWVyZ2VQcm9wc1Byb3h5KGRpc3BhdGNoLCBfcmVmKSB7XG4gICAgdmFyIGRpc3BsYXlOYW1lID0gX3JlZi5kaXNwbGF5TmFtZSxcbiAgICAgICAgcHVyZSA9IF9yZWYucHVyZSxcbiAgICAgICAgYXJlTWVyZ2VkUHJvcHNFcXVhbCA9IF9yZWYuYXJlTWVyZ2VkUHJvcHNFcXVhbDtcblxuICAgIHZhciBoYXNSdW5PbmNlID0gZmFsc2U7XG4gICAgdmFyIG1lcmdlZFByb3BzID0gdm9pZCAwO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1lcmdlUHJvcHNQcm94eShzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcykge1xuICAgICAgdmFyIG5leHRNZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuXG4gICAgICBpZiAoaGFzUnVuT25jZSkge1xuICAgICAgICBpZiAoIXB1cmUgfHwgIWFyZU1lcmdlZFByb3BzRXF1YWwobmV4dE1lcmdlZFByb3BzLCBtZXJnZWRQcm9wcykpIG1lcmdlZFByb3BzID0gbmV4dE1lcmdlZFByb3BzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGFzUnVuT25jZSA9IHRydWU7XG4gICAgICAgIG1lcmdlZFByb3BzID0gbmV4dE1lcmdlZFByb3BzO1xuXG4gICAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykgKDAsIF92ZXJpZnlQbGFpbk9iamVjdDIuZGVmYXVsdCkobWVyZ2VkUHJvcHMsIGRpc3BsYXlOYW1lLCAnbWVyZ2VQcm9wcycpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gICAgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gd2hlbk1lcmdlUHJvcHNJc0Z1bmN0aW9uKG1lcmdlUHJvcHMpIHtcbiAgcmV0dXJuIHR5cGVvZiBtZXJnZVByb3BzID09PSAnZnVuY3Rpb24nID8gd3JhcE1lcmdlUHJvcHNGdW5jKG1lcmdlUHJvcHMpIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiB3aGVuTWVyZ2VQcm9wc0lzT21pdHRlZChtZXJnZVByb3BzKSB7XG4gIHJldHVybiAhbWVyZ2VQcm9wcyA/IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGVmYXVsdE1lcmdlUHJvcHM7XG4gIH0gOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IFt3aGVuTWVyZ2VQcm9wc0lzRnVuY3Rpb24sIHdoZW5NZXJnZVByb3BzSXNPbWl0dGVkXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmltcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkgPSBpbXB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5O1xuZXhwb3J0cy5wdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeSA9IHB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5O1xuZXhwb3J0cy5kZWZhdWx0ID0gZmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeTtcblxudmFyIF92ZXJpZnlTdWJzZWxlY3RvcnMgPSByZXF1aXJlKCcuL3ZlcmlmeVN1YnNlbGVjdG9ycycpO1xuXG52YXIgX3ZlcmlmeVN1YnNlbGVjdG9yczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF92ZXJpZnlTdWJzZWxlY3RvcnMpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMob2JqLCBrZXlzKSB7IHZhciB0YXJnZXQgPSB7fTsgZm9yICh2YXIgaSBpbiBvYmopIHsgaWYgKGtleXMuaW5kZXhPZihpKSA+PSAwKSBjb250aW51ZTsgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBpKSkgY29udGludWU7IHRhcmdldFtpXSA9IG9ialtpXTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmZ1bmN0aW9uIGltcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3RvcnkobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMsIG1lcmdlUHJvcHMsIGRpc3BhdGNoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbXB1cmVGaW5hbFByb3BzU2VsZWN0b3Ioc3RhdGUsIG93blByb3BzKSB7XG4gICAgcmV0dXJuIG1lcmdlUHJvcHMobWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyksIG1hcERpc3BhdGNoVG9Qcm9wcyhkaXNwYXRjaCwgb3duUHJvcHMpLCBvd25Qcm9wcyk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHB1cmVGaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCBkaXNwYXRjaCwgX3JlZikge1xuICB2YXIgYXJlU3RhdGVzRXF1YWwgPSBfcmVmLmFyZVN0YXRlc0VxdWFsLFxuICAgICAgYXJlT3duUHJvcHNFcXVhbCA9IF9yZWYuYXJlT3duUHJvcHNFcXVhbCxcbiAgICAgIGFyZVN0YXRlUHJvcHNFcXVhbCA9IF9yZWYuYXJlU3RhdGVQcm9wc0VxdWFsO1xuXG4gIHZhciBoYXNSdW5BdExlYXN0T25jZSA9IGZhbHNlO1xuICB2YXIgc3RhdGUgPSB2b2lkIDA7XG4gIHZhciBvd25Qcm9wcyA9IHZvaWQgMDtcbiAgdmFyIHN0YXRlUHJvcHMgPSB2b2lkIDA7XG4gIHZhciBkaXNwYXRjaFByb3BzID0gdm9pZCAwO1xuICB2YXIgbWVyZ2VkUHJvcHMgPSB2b2lkIDA7XG5cbiAgZnVuY3Rpb24gaGFuZGxlRmlyc3RDYWxsKGZpcnN0U3RhdGUsIGZpcnN0T3duUHJvcHMpIHtcbiAgICBzdGF0ZSA9IGZpcnN0U3RhdGU7XG4gICAgb3duUHJvcHMgPSBmaXJzdE93blByb3BzO1xuICAgIHN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcbiAgICBkaXNwYXRjaFByb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgbWVyZ2VkUHJvcHMgPSBtZXJnZVByb3BzKHN0YXRlUHJvcHMsIGRpc3BhdGNoUHJvcHMsIG93blByb3BzKTtcbiAgICBoYXNSdW5BdExlYXN0T25jZSA9IHRydWU7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTmV3UHJvcHNBbmROZXdTdGF0ZSgpIHtcbiAgICBzdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG5cbiAgICBpZiAobWFwRGlzcGF0Y2hUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSBkaXNwYXRjaFByb3BzID0gbWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvd25Qcm9wcyk7XG5cbiAgICBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuICAgIHJldHVybiBtZXJnZWRQcm9wcztcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZU5ld1Byb3BzKCkge1xuICAgIGlmIChtYXBTdGF0ZVRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMpIHN0YXRlUHJvcHMgPSBtYXBTdGF0ZVRvUHJvcHMoc3RhdGUsIG93blByb3BzKTtcblxuICAgIGlmIChtYXBEaXNwYXRjaFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMpIGRpc3BhdGNoUHJvcHMgPSBtYXBEaXNwYXRjaFRvUHJvcHMoZGlzcGF0Y2gsIG93blByb3BzKTtcblxuICAgIG1lcmdlZFByb3BzID0gbWVyZ2VQcm9wcyhzdGF0ZVByb3BzLCBkaXNwYXRjaFByb3BzLCBvd25Qcm9wcyk7XG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlTmV3U3RhdGUoKSB7XG4gICAgdmFyIG5leHRTdGF0ZVByb3BzID0gbWFwU3RhdGVUb1Byb3BzKHN0YXRlLCBvd25Qcm9wcyk7XG4gICAgdmFyIHN0YXRlUHJvcHNDaGFuZ2VkID0gIWFyZVN0YXRlUHJvcHNFcXVhbChuZXh0U3RhdGVQcm9wcywgc3RhdGVQcm9wcyk7XG4gICAgc3RhdGVQcm9wcyA9IG5leHRTdGF0ZVByb3BzO1xuXG4gICAgaWYgKHN0YXRlUHJvcHNDaGFuZ2VkKSBtZXJnZWRQcm9wcyA9IG1lcmdlUHJvcHMoc3RhdGVQcm9wcywgZGlzcGF0Y2hQcm9wcywgb3duUHJvcHMpO1xuXG4gICAgcmV0dXJuIG1lcmdlZFByb3BzO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlU3Vic2VxdWVudENhbGxzKG5leHRTdGF0ZSwgbmV4dE93blByb3BzKSB7XG4gICAgdmFyIHByb3BzQ2hhbmdlZCA9ICFhcmVPd25Qcm9wc0VxdWFsKG5leHRPd25Qcm9wcywgb3duUHJvcHMpO1xuICAgIHZhciBzdGF0ZUNoYW5nZWQgPSAhYXJlU3RhdGVzRXF1YWwobmV4dFN0YXRlLCBzdGF0ZSk7XG4gICAgc3RhdGUgPSBuZXh0U3RhdGU7XG4gICAgb3duUHJvcHMgPSBuZXh0T3duUHJvcHM7XG5cbiAgICBpZiAocHJvcHNDaGFuZ2VkICYmIHN0YXRlQ2hhbmdlZCkgcmV0dXJuIGhhbmRsZU5ld1Byb3BzQW5kTmV3U3RhdGUoKTtcbiAgICBpZiAocHJvcHNDaGFuZ2VkKSByZXR1cm4gaGFuZGxlTmV3UHJvcHMoKTtcbiAgICBpZiAoc3RhdGVDaGFuZ2VkKSByZXR1cm4gaGFuZGxlTmV3U3RhdGUoKTtcbiAgICByZXR1cm4gbWVyZ2VkUHJvcHM7XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gcHVyZUZpbmFsUHJvcHNTZWxlY3RvcihuZXh0U3RhdGUsIG5leHRPd25Qcm9wcykge1xuICAgIHJldHVybiBoYXNSdW5BdExlYXN0T25jZSA/IGhhbmRsZVN1YnNlcXVlbnRDYWxscyhuZXh0U3RhdGUsIG5leHRPd25Qcm9wcykgOiBoYW5kbGVGaXJzdENhbGwobmV4dFN0YXRlLCBuZXh0T3duUHJvcHMpO1xuICB9O1xufVxuXG4vLyBUT0RPOiBBZGQgbW9yZSBjb21tZW50c1xuXG4vLyBJZiBwdXJlIGlzIHRydWUsIHRoZSBzZWxlY3RvciByZXR1cm5lZCBieSBzZWxlY3RvckZhY3Rvcnkgd2lsbCBtZW1vaXplIGl0cyByZXN1bHRzLFxuLy8gYWxsb3dpbmcgY29ubmVjdEFkdmFuY2VkJ3Mgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHRvIHJldHVybiBmYWxzZSBpZiBmaW5hbFxuLy8gcHJvcHMgaGF2ZSBub3QgY2hhbmdlZC4gSWYgZmFsc2UsIHRoZSBzZWxlY3RvciB3aWxsIGFsd2F5cyByZXR1cm4gYSBuZXdcbi8vIG9iamVjdCBhbmQgc2hvdWxkQ29tcG9uZW50VXBkYXRlIHdpbGwgYWx3YXlzIHJldHVybiB0cnVlLlxuXG5mdW5jdGlvbiBmaW5hbFByb3BzU2VsZWN0b3JGYWN0b3J5KGRpc3BhdGNoLCBfcmVmMikge1xuICB2YXIgaW5pdE1hcFN0YXRlVG9Qcm9wcyA9IF9yZWYyLmluaXRNYXBTdGF0ZVRvUHJvcHMsXG4gICAgICBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzID0gX3JlZjIuaW5pdE1hcERpc3BhdGNoVG9Qcm9wcyxcbiAgICAgIGluaXRNZXJnZVByb3BzID0gX3JlZjIuaW5pdE1lcmdlUHJvcHMsXG4gICAgICBvcHRpb25zID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYyLCBbJ2luaXRNYXBTdGF0ZVRvUHJvcHMnLCAnaW5pdE1hcERpc3BhdGNoVG9Qcm9wcycsICdpbml0TWVyZ2VQcm9wcyddKTtcblxuICB2YXIgbWFwU3RhdGVUb1Byb3BzID0gaW5pdE1hcFN0YXRlVG9Qcm9wcyhkaXNwYXRjaCwgb3B0aW9ucyk7XG4gIHZhciBtYXBEaXNwYXRjaFRvUHJvcHMgPSBpbml0TWFwRGlzcGF0Y2hUb1Byb3BzKGRpc3BhdGNoLCBvcHRpb25zKTtcbiAgdmFyIG1lcmdlUHJvcHMgPSBpbml0TWVyZ2VQcm9wcyhkaXNwYXRjaCwgb3B0aW9ucyk7XG5cbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgKDAsIF92ZXJpZnlTdWJzZWxlY3RvcnMyLmRlZmF1bHQpKG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCBvcHRpb25zLmRpc3BsYXlOYW1lKTtcbiAgfVxuXG4gIHZhciBzZWxlY3RvckZhY3RvcnkgPSBvcHRpb25zLnB1cmUgPyBwdXJlRmluYWxQcm9wc1NlbGVjdG9yRmFjdG9yeSA6IGltcHVyZUZpbmFsUHJvcHNTZWxlY3RvckZhY3Rvcnk7XG5cbiAgcmV0dXJuIHNlbGVjdG9yRmFjdG9yeShtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcywgbWVyZ2VQcm9wcywgZGlzcGF0Y2gsIG9wdGlvbnMpO1xufSIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZlcmlmeVN1YnNlbGVjdG9ycztcblxudmFyIF93YXJuaW5nID0gcmVxdWlyZSgnLi4vdXRpbHMvd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIHZlcmlmeShzZWxlY3RvciwgbWV0aG9kTmFtZSwgZGlzcGxheU5hbWUpIHtcbiAgaWYgKCFzZWxlY3Rvcikge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCB2YWx1ZSBmb3IgJyArIG1ldGhvZE5hbWUgKyAnIGluICcgKyBkaXNwbGF5TmFtZSArICcuJyk7XG4gIH0gZWxzZSBpZiAobWV0aG9kTmFtZSA9PT0gJ21hcFN0YXRlVG9Qcm9wcycgfHwgbWV0aG9kTmFtZSA9PT0gJ21hcERpc3BhdGNoVG9Qcm9wcycpIHtcbiAgICBpZiAoIXNlbGVjdG9yLmhhc093blByb3BlcnR5KCdkZXBlbmRzT25Pd25Qcm9wcycpKSB7XG4gICAgICAoMCwgX3dhcm5pbmcyLmRlZmF1bHQpKCdUaGUgc2VsZWN0b3IgZm9yICcgKyBtZXRob2ROYW1lICsgJyBvZiAnICsgZGlzcGxheU5hbWUgKyAnIGRpZCBub3Qgc3BlY2lmeSBhIHZhbHVlIGZvciBkZXBlbmRzT25Pd25Qcm9wcy4nKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gdmVyaWZ5U3Vic2VsZWN0b3JzKG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzLCBtZXJnZVByb3BzLCBkaXNwbGF5TmFtZSkge1xuICB2ZXJpZnkobWFwU3RhdGVUb1Byb3BzLCAnbWFwU3RhdGVUb1Byb3BzJywgZGlzcGxheU5hbWUpO1xuICB2ZXJpZnkobWFwRGlzcGF0Y2hUb1Byb3BzLCAnbWFwRGlzcGF0Y2hUb1Byb3BzJywgZGlzcGxheU5hbWUpO1xuICB2ZXJpZnkobWVyZ2VQcm9wcywgJ21lcmdlUHJvcHMnLCBkaXNwbGF5TmFtZSk7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy53cmFwTWFwVG9Qcm9wc0NvbnN0YW50ID0gd3JhcE1hcFRvUHJvcHNDb25zdGFudDtcbmV4cG9ydHMuZ2V0RGVwZW5kc09uT3duUHJvcHMgPSBnZXREZXBlbmRzT25Pd25Qcm9wcztcbmV4cG9ydHMud3JhcE1hcFRvUHJvcHNGdW5jID0gd3JhcE1hcFRvUHJvcHNGdW5jO1xuXG52YXIgX3ZlcmlmeVBsYWluT2JqZWN0ID0gcmVxdWlyZSgnLi4vdXRpbHMvdmVyaWZ5UGxhaW5PYmplY3QnKTtcblxudmFyIF92ZXJpZnlQbGFpbk9iamVjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF92ZXJpZnlQbGFpbk9iamVjdCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIHdyYXBNYXBUb1Byb3BzQ29uc3RhbnQoZ2V0Q29uc3RhbnQpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRDb25zdGFudFNlbGVjdG9yKGRpc3BhdGNoLCBvcHRpb25zKSB7XG4gICAgdmFyIGNvbnN0YW50ID0gZ2V0Q29uc3RhbnQoZGlzcGF0Y2gsIG9wdGlvbnMpO1xuXG4gICAgZnVuY3Rpb24gY29uc3RhbnRTZWxlY3RvcigpIHtcbiAgICAgIHJldHVybiBjb25zdGFudDtcbiAgICB9XG4gICAgY29uc3RhbnRTZWxlY3Rvci5kZXBlbmRzT25Pd25Qcm9wcyA9IGZhbHNlO1xuICAgIHJldHVybiBjb25zdGFudFNlbGVjdG9yO1xuICB9O1xufVxuXG4vLyBkZXBlbmRzT25Pd25Qcm9wcyBpcyB1c2VkIGJ5IGNyZWF0ZU1hcFRvUHJvcHNQcm94eSB0byBkZXRlcm1pbmUgd2hldGhlciB0byBwYXNzIHByb3BzIGFzIGFyZ3Ncbi8vIHRvIHRoZSBtYXBUb1Byb3BzIGZ1bmN0aW9uIGJlaW5nIHdyYXBwZWQuIEl0IGlzIGFsc28gdXNlZCBieSBtYWtlUHVyZVByb3BzU2VsZWN0b3IgdG8gZGV0ZXJtaW5lXG4vLyB3aGV0aGVyIG1hcFRvUHJvcHMgbmVlZHMgdG8gYmUgaW52b2tlZCB3aGVuIHByb3BzIGhhdmUgY2hhbmdlZC5cbi8vIFxuLy8gQSBsZW5ndGggb2Ygb25lIHNpZ25hbHMgdGhhdCBtYXBUb1Byb3BzIGRvZXMgbm90IGRlcGVuZCBvbiBwcm9wcyBmcm9tIHRoZSBwYXJlbnQgY29tcG9uZW50LlxuLy8gQSBsZW5ndGggb2YgemVybyBpcyBhc3N1bWVkIHRvIG1lYW4gbWFwVG9Qcm9wcyBpcyBnZXR0aW5nIGFyZ3MgdmlhIGFyZ3VtZW50cyBvciAuLi5hcmdzIGFuZFxuLy8gdGhlcmVmb3JlIG5vdCByZXBvcnRpbmcgaXRzIGxlbmd0aCBhY2N1cmF0ZWx5Li5cbmZ1bmN0aW9uIGdldERlcGVuZHNPbk93blByb3BzKG1hcFRvUHJvcHMpIHtcbiAgcmV0dXJuIG1hcFRvUHJvcHMuZGVwZW5kc09uT3duUHJvcHMgIT09IG51bGwgJiYgbWFwVG9Qcm9wcy5kZXBlbmRzT25Pd25Qcm9wcyAhPT0gdW5kZWZpbmVkID8gQm9vbGVhbihtYXBUb1Byb3BzLmRlcGVuZHNPbk93blByb3BzKSA6IG1hcFRvUHJvcHMubGVuZ3RoICE9PSAxO1xufVxuXG4vLyBVc2VkIGJ5IHdoZW5NYXBTdGF0ZVRvUHJvcHNJc0Z1bmN0aW9uIGFuZCB3aGVuTWFwRGlzcGF0Y2hUb1Byb3BzSXNGdW5jdGlvbixcbi8vIHRoaXMgZnVuY3Rpb24gd3JhcHMgbWFwVG9Qcm9wcyBpbiBhIHByb3h5IGZ1bmN0aW9uIHdoaWNoIGRvZXMgc2V2ZXJhbCB0aGluZ3M6XG4vLyBcbi8vICAqIERldGVjdHMgd2hldGhlciB0aGUgbWFwVG9Qcm9wcyBmdW5jdGlvbiBiZWluZyBjYWxsZWQgZGVwZW5kcyBvbiBwcm9wcywgd2hpY2hcbi8vICAgIGlzIHVzZWQgYnkgc2VsZWN0b3JGYWN0b3J5IHRvIGRlY2lkZSBpZiBpdCBzaG91bGQgcmVpbnZva2Ugb24gcHJvcHMgY2hhbmdlcy5cbi8vICAgIFxuLy8gICogT24gZmlyc3QgY2FsbCwgaGFuZGxlcyBtYXBUb1Byb3BzIGlmIHJldHVybnMgYW5vdGhlciBmdW5jdGlvbiwgYW5kIHRyZWF0cyB0aGF0XG4vLyAgICBuZXcgZnVuY3Rpb24gYXMgdGhlIHRydWUgbWFwVG9Qcm9wcyBmb3Igc3Vic2VxdWVudCBjYWxscy5cbi8vICAgIFxuLy8gICogT24gZmlyc3QgY2FsbCwgdmVyaWZpZXMgdGhlIGZpcnN0IHJlc3VsdCBpcyBhIHBsYWluIG9iamVjdCwgaW4gb3JkZXIgdG8gd2FyblxuLy8gICAgdGhlIGRldmVsb3BlciB0aGF0IHRoZWlyIG1hcFRvUHJvcHMgZnVuY3Rpb24gaXMgbm90IHJldHVybmluZyBhIHZhbGlkIHJlc3VsdC5cbi8vICAgIFxuZnVuY3Rpb24gd3JhcE1hcFRvUHJvcHNGdW5jKG1hcFRvUHJvcHMsIG1ldGhvZE5hbWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluaXRQcm94eVNlbGVjdG9yKGRpc3BhdGNoLCBfcmVmKSB7XG4gICAgdmFyIGRpc3BsYXlOYW1lID0gX3JlZi5kaXNwbGF5TmFtZTtcblxuICAgIHZhciBwcm94eSA9IGZ1bmN0aW9uIG1hcFRvUHJvcHNQcm94eShzdGF0ZU9yRGlzcGF0Y2gsIG93blByb3BzKSB7XG4gICAgICByZXR1cm4gcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPyBwcm94eS5tYXBUb1Byb3BzKHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIDogcHJveHkubWFwVG9Qcm9wcyhzdGF0ZU9yRGlzcGF0Y2gpO1xuICAgIH07XG5cbiAgICAvLyBhbGxvdyBkZXRlY3RGYWN0b3J5QW5kVmVyaWZ5IHRvIGdldCBvd25Qcm9wc1xuICAgIHByb3h5LmRlcGVuZHNPbk93blByb3BzID0gdHJ1ZTtcblxuICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBmdW5jdGlvbiBkZXRlY3RGYWN0b3J5QW5kVmVyaWZ5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpIHtcbiAgICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBtYXBUb1Byb3BzO1xuICAgICAgcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPSBnZXREZXBlbmRzT25Pd25Qcm9wcyhtYXBUb1Byb3BzKTtcbiAgICAgIHZhciBwcm9wcyA9IHByb3h5KHN0YXRlT3JEaXNwYXRjaCwgb3duUHJvcHMpO1xuXG4gICAgICBpZiAodHlwZW9mIHByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByb3h5Lm1hcFRvUHJvcHMgPSBwcm9wcztcbiAgICAgICAgcHJveHkuZGVwZW5kc09uT3duUHJvcHMgPSBnZXREZXBlbmRzT25Pd25Qcm9wcyhwcm9wcyk7XG4gICAgICAgIHByb3BzID0gcHJveHkoc3RhdGVPckRpc3BhdGNoLCBvd25Qcm9wcyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykgKDAsIF92ZXJpZnlQbGFpbk9iamVjdDIuZGVmYXVsdCkocHJvcHMsIGRpc3BsYXlOYW1lLCBtZXRob2ROYW1lKTtcblxuICAgICAgcmV0dXJuIHByb3BzO1xuICAgIH07XG5cbiAgICByZXR1cm4gcHJveHk7XG4gIH07XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5jb25uZWN0ID0gZXhwb3J0cy5jb25uZWN0QWR2YW5jZWQgPSBleHBvcnRzLmNyZWF0ZVByb3ZpZGVyID0gZXhwb3J0cy5Qcm92aWRlciA9IHVuZGVmaW5lZDtcblxudmFyIF9Qcm92aWRlciA9IHJlcXVpcmUoJy4vY29tcG9uZW50cy9Qcm92aWRlcicpO1xuXG52YXIgX1Byb3ZpZGVyMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX1Byb3ZpZGVyKTtcblxudmFyIF9jb25uZWN0QWR2YW5jZWQgPSByZXF1aXJlKCcuL2NvbXBvbmVudHMvY29ubmVjdEFkdmFuY2VkJyk7XG5cbnZhciBfY29ubmVjdEFkdmFuY2VkMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Nvbm5lY3RBZHZhbmNlZCk7XG5cbnZhciBfY29ubmVjdCA9IHJlcXVpcmUoJy4vY29ubmVjdC9jb25uZWN0Jyk7XG5cbnZhciBfY29ubmVjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb25uZWN0KTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZXhwb3J0cy5Qcm92aWRlciA9IF9Qcm92aWRlcjIuZGVmYXVsdDtcbmV4cG9ydHMuY3JlYXRlUHJvdmlkZXIgPSBfUHJvdmlkZXIuY3JlYXRlUHJvdmlkZXI7XG5leHBvcnRzLmNvbm5lY3RBZHZhbmNlZCA9IF9jb25uZWN0QWR2YW5jZWQyLmRlZmF1bHQ7XG5leHBvcnRzLmNvbm5lY3QgPSBfY29ubmVjdDIuZGVmYXVsdDsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLnN0b3JlU2hhcGUgPSBleHBvcnRzLnN1YnNjcmlwdGlvblNoYXBlID0gdW5kZWZpbmVkO1xuXG52YXIgX3Byb3BUeXBlcyA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMnKTtcblxudmFyIF9wcm9wVHlwZXMyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcHJvcFR5cGVzKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxudmFyIHN1YnNjcmlwdGlvblNoYXBlID0gZXhwb3J0cy5zdWJzY3JpcHRpb25TaGFwZSA9IF9wcm9wVHlwZXMyLmRlZmF1bHQuc2hhcGUoe1xuICB0cnlTdWJzY3JpYmU6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYy5pc1JlcXVpcmVkLFxuICB0cnlVbnN1YnNjcmliZTogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLmlzUmVxdWlyZWQsXG4gIG5vdGlmeU5lc3RlZFN1YnM6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYy5pc1JlcXVpcmVkLFxuICBpc1N1YnNjcmliZWQ6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYy5pc1JlcXVpcmVkXG59KTtcblxudmFyIHN0b3JlU2hhcGUgPSBleHBvcnRzLnN0b3JlU2hhcGUgPSBfcHJvcFR5cGVzMi5kZWZhdWx0LnNoYXBlKHtcbiAgc3Vic2NyaWJlOiBfcHJvcFR5cGVzMi5kZWZhdWx0LmZ1bmMuaXNSZXF1aXJlZCxcbiAgZGlzcGF0Y2g6IF9wcm9wVHlwZXMyLmRlZmF1bHQuZnVuYy5pc1JlcXVpcmVkLFxuICBnZXRTdGF0ZTogX3Byb3BUeXBlczIuZGVmYXVsdC5mdW5jLmlzUmVxdWlyZWRcbn0pOyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7IGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7IH0gfVxuXG4vLyBlbmNhcHN1bGF0ZXMgdGhlIHN1YnNjcmlwdGlvbiBsb2dpYyBmb3IgY29ubmVjdGluZyBhIGNvbXBvbmVudCB0byB0aGUgcmVkdXggc3RvcmUsIGFzXG4vLyB3ZWxsIGFzIG5lc3Rpbmcgc3Vic2NyaXB0aW9ucyBvZiBkZXNjZW5kYW50IGNvbXBvbmVudHMsIHNvIHRoYXQgd2UgY2FuIGVuc3VyZSB0aGVcbi8vIGFuY2VzdG9yIGNvbXBvbmVudHMgcmUtcmVuZGVyIGJlZm9yZSBkZXNjZW5kYW50c1xuXG52YXIgQ0xFQVJFRCA9IG51bGw7XG52YXIgbnVsbExpc3RlbmVycyA9IHtcbiAgbm90aWZ5OiBmdW5jdGlvbiBub3RpZnkoKSB7fVxufTtcblxuZnVuY3Rpb24gY3JlYXRlTGlzdGVuZXJDb2xsZWN0aW9uKCkge1xuICAvLyB0aGUgY3VycmVudC9uZXh0IHBhdHRlcm4gaXMgY29waWVkIGZyb20gcmVkdXgncyBjcmVhdGVTdG9yZSBjb2RlLlxuICAvLyBUT0RPOiByZWZhY3RvcitleHBvc2UgdGhhdCBjb2RlIHRvIGJlIHJldXNhYmxlIGhlcmU/XG4gIHZhciBjdXJyZW50ID0gW107XG4gIHZhciBuZXh0ID0gW107XG5cbiAgcmV0dXJuIHtcbiAgICBjbGVhcjogZnVuY3Rpb24gY2xlYXIoKSB7XG4gICAgICBuZXh0ID0gQ0xFQVJFRDtcbiAgICAgIGN1cnJlbnQgPSBDTEVBUkVEO1xuICAgIH0sXG4gICAgbm90aWZ5OiBmdW5jdGlvbiBub3RpZnkoKSB7XG4gICAgICB2YXIgbGlzdGVuZXJzID0gY3VycmVudCA9IG5leHQ7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsaXN0ZW5lcnNbaV0oKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHN1YnNjcmliZTogZnVuY3Rpb24gc3Vic2NyaWJlKGxpc3RlbmVyKSB7XG4gICAgICB2YXIgaXNTdWJzY3JpYmVkID0gdHJ1ZTtcbiAgICAgIGlmIChuZXh0ID09PSBjdXJyZW50KSBuZXh0ID0gY3VycmVudC5zbGljZSgpO1xuICAgICAgbmV4dC5wdXNoKGxpc3RlbmVyKTtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHVuc3Vic2NyaWJlKCkge1xuICAgICAgICBpZiAoIWlzU3Vic2NyaWJlZCB8fCBjdXJyZW50ID09PSBDTEVBUkVEKSByZXR1cm47XG4gICAgICAgIGlzU3Vic2NyaWJlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChuZXh0ID09PSBjdXJyZW50KSBuZXh0ID0gY3VycmVudC5zbGljZSgpO1xuICAgICAgICBuZXh0LnNwbGljZShuZXh0LmluZGV4T2YobGlzdGVuZXIpLCAxKTtcbiAgICAgIH07XG4gICAgfVxuICB9O1xufVxuXG52YXIgU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBTdWJzY3JpcHRpb24oc3RvcmUsIHBhcmVudFN1Yiwgb25TdGF0ZUNoYW5nZSkge1xuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBTdWJzY3JpcHRpb24pO1xuXG4gICAgdGhpcy5zdG9yZSA9IHN0b3JlO1xuICAgIHRoaXMucGFyZW50U3ViID0gcGFyZW50U3ViO1xuICAgIHRoaXMub25TdGF0ZUNoYW5nZSA9IG9uU3RhdGVDaGFuZ2U7XG4gICAgdGhpcy51bnN1YnNjcmliZSA9IG51bGw7XG4gICAgdGhpcy5saXN0ZW5lcnMgPSBudWxsTGlzdGVuZXJzO1xuICB9XG5cbiAgU3Vic2NyaXB0aW9uLnByb3RvdHlwZS5hZGROZXN0ZWRTdWIgPSBmdW5jdGlvbiBhZGROZXN0ZWRTdWIobGlzdGVuZXIpIHtcbiAgICB0aGlzLnRyeVN1YnNjcmliZSgpO1xuICAgIHJldHVybiB0aGlzLmxpc3RlbmVycy5zdWJzY3JpYmUobGlzdGVuZXIpO1xuICB9O1xuXG4gIFN1YnNjcmlwdGlvbi5wcm90b3R5cGUubm90aWZ5TmVzdGVkU3VicyA9IGZ1bmN0aW9uIG5vdGlmeU5lc3RlZFN1YnMoKSB7XG4gICAgdGhpcy5saXN0ZW5lcnMubm90aWZ5KCk7XG4gIH07XG5cbiAgU3Vic2NyaXB0aW9uLnByb3RvdHlwZS5pc1N1YnNjcmliZWQgPSBmdW5jdGlvbiBpc1N1YnNjcmliZWQoKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4odGhpcy51bnN1YnNjcmliZSk7XG4gIH07XG5cbiAgU3Vic2NyaXB0aW9uLnByb3RvdHlwZS50cnlTdWJzY3JpYmUgPSBmdW5jdGlvbiB0cnlTdWJzY3JpYmUoKSB7XG4gICAgaWYgKCF0aGlzLnVuc3Vic2NyaWJlKSB7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlID0gdGhpcy5wYXJlbnRTdWIgPyB0aGlzLnBhcmVudFN1Yi5hZGROZXN0ZWRTdWIodGhpcy5vblN0YXRlQ2hhbmdlKSA6IHRoaXMuc3RvcmUuc3Vic2NyaWJlKHRoaXMub25TdGF0ZUNoYW5nZSk7XG5cbiAgICAgIHRoaXMubGlzdGVuZXJzID0gY3JlYXRlTGlzdGVuZXJDb2xsZWN0aW9uKCk7XG4gICAgfVxuICB9O1xuXG4gIFN1YnNjcmlwdGlvbi5wcm90b3R5cGUudHJ5VW5zdWJzY3JpYmUgPSBmdW5jdGlvbiB0cnlVbnN1YnNjcmliZSgpIHtcbiAgICBpZiAodGhpcy51bnN1YnNjcmliZSkge1xuICAgICAgdGhpcy51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy51bnN1YnNjcmliZSA9IG51bGw7XG4gICAgICB0aGlzLmxpc3RlbmVycy5jbGVhcigpO1xuICAgICAgdGhpcy5saXN0ZW5lcnMgPSBudWxsTGlzdGVuZXJzO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gU3Vic2NyaXB0aW9uO1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBTdWJzY3JpcHRpb247IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0cy5kZWZhdWx0ID0gc2hhbGxvd0VxdWFsO1xudmFyIGhhc093biA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG5cbmZ1bmN0aW9uIGlzKHgsIHkpIHtcbiAgaWYgKHggPT09IHkpIHtcbiAgICByZXR1cm4geCAhPT0gMCB8fCB5ICE9PSAwIHx8IDEgLyB4ID09PSAxIC8geTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geCAhPT0geCAmJiB5ICE9PSB5O1xuICB9XG59XG5cbmZ1bmN0aW9uIHNoYWxsb3dFcXVhbChvYmpBLCBvYmpCKSB7XG4gIGlmIChpcyhvYmpBLCBvYmpCKSkgcmV0dXJuIHRydWU7XG5cbiAgaWYgKHR5cGVvZiBvYmpBICE9PSAnb2JqZWN0JyB8fCBvYmpBID09PSBudWxsIHx8IHR5cGVvZiBvYmpCICE9PSAnb2JqZWN0JyB8fCBvYmpCID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIHZhciBrZXlzQiA9IE9iamVjdC5rZXlzKG9iakIpO1xuXG4gIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5c0EubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIWhhc093bi5jYWxsKG9iakIsIGtleXNBW2ldKSB8fCAhaXMob2JqQVtrZXlzQVtpXV0sIG9iakJba2V5c0FbaV1dKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufSIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZlcmlmeVBsYWluT2JqZWN0O1xuXG52YXIgX2lzUGxhaW5PYmplY3QgPSByZXF1aXJlKCdsb2Rhc2gvaXNQbGFpbk9iamVjdCcpO1xuXG52YXIgX2lzUGxhaW5PYmplY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNQbGFpbk9iamVjdCk7XG5cbnZhciBfd2FybmluZyA9IHJlcXVpcmUoJy4vd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIHZlcmlmeVBsYWluT2JqZWN0KHZhbHVlLCBkaXNwbGF5TmFtZSwgbWV0aG9kTmFtZSkge1xuICBpZiAoISgwLCBfaXNQbGFpbk9iamVjdDIuZGVmYXVsdCkodmFsdWUpKSB7XG4gICAgKDAsIF93YXJuaW5nMi5kZWZhdWx0KShtZXRob2ROYW1lICsgJygpIGluICcgKyBkaXNwbGF5TmFtZSArICcgbXVzdCByZXR1cm4gYSBwbGFpbiBvYmplY3QuIEluc3RlYWQgcmVjZWl2ZWQgJyArIHZhbHVlICsgJy4nKTtcbiAgfVxufSIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuZGVmYXVsdCA9IHdhcm5pbmc7XG4vKipcbiAqIFByaW50cyBhIHdhcm5pbmcgaW4gdGhlIGNvbnNvbGUgaWYgaXQgZXhpc3RzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBtZXNzYWdlIFRoZSB3YXJuaW5nIG1lc3NhZ2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gd2FybmluZyhtZXNzYWdlKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY29uc29sZS5lcnJvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gIH1cbiAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG4gIHRyeSB7XG4gICAgLy8gVGhpcyBlcnJvciB3YXMgdGhyb3duIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCBpZiB5b3UgZW5hYmxlXG4gICAgLy8gXCJicmVhayBvbiBhbGwgZXhjZXB0aW9uc1wiIGluIHlvdXIgY29uc29sZSxcbiAgICAvLyBpdCB3b3VsZCBwYXVzZSB0aGUgZXhlY3V0aW9uIGF0IHRoaXMgbGluZS5cbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgbm8tZW1wdHkgKi9cbiAgfSBjYXRjaCAoZSkge31cbiAgLyogZXNsaW50LWVuYWJsZSBuby1lbXB0eSAqL1xufSIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3RDaGlsZHJlbiA9IHJlcXVpcmUoJy4vUmVhY3RDaGlsZHJlbicpO1xudmFyIFJlYWN0Q29tcG9uZW50ID0gcmVxdWlyZSgnLi9SZWFjdENvbXBvbmVudCcpO1xudmFyIFJlYWN0UHVyZUNvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RQdXJlQ29tcG9uZW50Jyk7XG52YXIgUmVhY3RDbGFzcyA9IHJlcXVpcmUoJy4vUmVhY3RDbGFzcycpO1xudmFyIFJlYWN0RE9NRmFjdG9yaWVzID0gcmVxdWlyZSgnLi9SZWFjdERPTUZhY3RvcmllcycpO1xudmFyIFJlYWN0RWxlbWVudCA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50Jyk7XG52YXIgUmVhY3RQcm9wVHlwZXMgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVzJyk7XG52YXIgUmVhY3RWZXJzaW9uID0gcmVxdWlyZSgnLi9SZWFjdFZlcnNpb24nKTtcblxudmFyIG9ubHlDaGlsZCA9IHJlcXVpcmUoJy4vb25seUNoaWxkJyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxudmFyIGNyZWF0ZUVsZW1lbnQgPSBSZWFjdEVsZW1lbnQuY3JlYXRlRWxlbWVudDtcbnZhciBjcmVhdGVGYWN0b3J5ID0gUmVhY3RFbGVtZW50LmNyZWF0ZUZhY3Rvcnk7XG52YXIgY2xvbmVFbGVtZW50ID0gUmVhY3RFbGVtZW50LmNsb25lRWxlbWVudDtcblxuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciBjYW5EZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vY2FuRGVmaW5lUHJvcGVydHknKTtcbiAgdmFyIFJlYWN0RWxlbWVudFZhbGlkYXRvciA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50VmFsaWRhdG9yJyk7XG4gIHZhciBkaWRXYXJuUHJvcFR5cGVzRGVwcmVjYXRlZCA9IGZhbHNlO1xuICBjcmVhdGVFbGVtZW50ID0gUmVhY3RFbGVtZW50VmFsaWRhdG9yLmNyZWF0ZUVsZW1lbnQ7XG4gIGNyZWF0ZUZhY3RvcnkgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3IuY3JlYXRlRmFjdG9yeTtcbiAgY2xvbmVFbGVtZW50ID0gUmVhY3RFbGVtZW50VmFsaWRhdG9yLmNsb25lRWxlbWVudDtcbn1cblxudmFyIF9fc3ByZWFkID0gX2Fzc2lnbjtcblxuaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgX19zcHJlYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKHdhcm5lZCwgJ1JlYWN0Ll9fc3ByZWFkIGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4gVXNlICcgKyAnT2JqZWN0LmFzc2lnbiBkaXJlY3RseSBvciBhbm90aGVyIGhlbHBlciBmdW5jdGlvbiB3aXRoIHNpbWlsYXIgJyArICdzZW1hbnRpY3MuIFlvdSBtYXkgYmUgc2VlaW5nIHRoaXMgd2FybmluZyBkdWUgdG8geW91ciBjb21waWxlci4gJyArICdTZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC1zcHJlYWQtZGVwcmVjYXRpb24gZm9yIG1vcmUgZGV0YWlscy4nKSA6IHZvaWQgMDtcbiAgICB3YXJuZWQgPSB0cnVlO1xuICAgIHJldHVybiBfYXNzaWduLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbnZhciBSZWFjdCA9IHtcblxuICAvLyBNb2Rlcm5cblxuICBDaGlsZHJlbjoge1xuICAgIG1hcDogUmVhY3RDaGlsZHJlbi5tYXAsXG4gICAgZm9yRWFjaDogUmVhY3RDaGlsZHJlbi5mb3JFYWNoLFxuICAgIGNvdW50OiBSZWFjdENoaWxkcmVuLmNvdW50LFxuICAgIHRvQXJyYXk6IFJlYWN0Q2hpbGRyZW4udG9BcnJheSxcbiAgICBvbmx5OiBvbmx5Q2hpbGRcbiAgfSxcblxuICBDb21wb25lbnQ6IFJlYWN0Q29tcG9uZW50LFxuICBQdXJlQ29tcG9uZW50OiBSZWFjdFB1cmVDb21wb25lbnQsXG5cbiAgY3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCxcbiAgY2xvbmVFbGVtZW50OiBjbG9uZUVsZW1lbnQsXG4gIGlzVmFsaWRFbGVtZW50OiBSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQsXG5cbiAgLy8gQ2xhc3NpY1xuXG4gIFByb3BUeXBlczogUmVhY3RQcm9wVHlwZXMsXG4gIGNyZWF0ZUNsYXNzOiBSZWFjdENsYXNzLmNyZWF0ZUNsYXNzLFxuICBjcmVhdGVGYWN0b3J5OiBjcmVhdGVGYWN0b3J5LFxuICBjcmVhdGVNaXhpbjogZnVuY3Rpb24gKG1peGluKSB7XG4gICAgLy8gQ3VycmVudGx5IGEgbm9vcC4gV2lsbCBiZSB1c2VkIHRvIHZhbGlkYXRlIGFuZCB0cmFjZSBtaXhpbnMuXG4gICAgcmV0dXJuIG1peGluO1xuICB9LFxuXG4gIC8vIFRoaXMgbG9va3MgRE9NIHNwZWNpZmljIGJ1dCB0aGVzZSBhcmUgYWN0dWFsbHkgaXNvbW9ycGhpYyBoZWxwZXJzXG4gIC8vIHNpbmNlIHRoZXkgYXJlIGp1c3QgZ2VuZXJhdGluZyBET00gc3RyaW5ncy5cbiAgRE9NOiBSZWFjdERPTUZhY3RvcmllcyxcblxuICB2ZXJzaW9uOiBSZWFjdFZlcnNpb24sXG5cbiAgLy8gRGVwcmVjYXRlZCBob29rIGZvciBKU1ggc3ByZWFkLCBkb24ndCB1c2UgdGhpcyBmb3IgYW55dGhpbmcuXG4gIF9fc3ByZWFkOiBfX3NwcmVhZFxufTtcblxuLy8gVE9ETzogRml4IHRlc3RzIHNvIHRoYXQgdGhpcyBkZXByZWNhdGlvbiB3YXJuaW5nIGRvZXNuJ3QgY2F1c2UgZmFpbHVyZXMuXG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgaWYgKGNhbkRlZmluZVByb3BlcnR5KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWN0LCAnUHJvcFR5cGVzJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhkaWRXYXJuUHJvcFR5cGVzRGVwcmVjYXRlZCwgJ0FjY2Vzc2luZyBQcm9wVHlwZXMgdmlhIHRoZSBtYWluIFJlYWN0IHBhY2thZ2UgaXMgZGVwcmVjYXRlZC4gVXNlICcgKyAndGhlIHByb3AtdHlwZXMgcGFja2FnZSBmcm9tIG5wbSBpbnN0ZWFkLicpIDogdm9pZCAwO1xuICAgICAgICBkaWRXYXJuUHJvcFR5cGVzRGVwcmVjYXRlZCA9IHRydWU7XG4gICAgICAgIHJldHVybiBSZWFjdFByb3BUeXBlcztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBQb29sZWRDbGFzcyA9IHJlcXVpcmUoJy4vUG9vbGVkQ2xhc3MnKTtcbnZhciBSZWFjdEVsZW1lbnQgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudCcpO1xuXG52YXIgZW1wdHlGdW5jdGlvbiA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5RnVuY3Rpb24nKTtcbnZhciB0cmF2ZXJzZUFsbENoaWxkcmVuID0gcmVxdWlyZSgnLi90cmF2ZXJzZUFsbENoaWxkcmVuJyk7XG5cbnZhciB0d29Bcmd1bWVudFBvb2xlciA9IFBvb2xlZENsYXNzLnR3b0FyZ3VtZW50UG9vbGVyO1xudmFyIGZvdXJBcmd1bWVudFBvb2xlciA9IFBvb2xlZENsYXNzLmZvdXJBcmd1bWVudFBvb2xlcjtcblxudmFyIHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4ID0gL1xcLysvZztcbmZ1bmN0aW9uIGVzY2FwZVVzZXJQcm92aWRlZEtleSh0ZXh0KSB7XG4gIHJldHVybiAoJycgKyB0ZXh0KS5yZXBsYWNlKHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4LCAnJCYvJyk7XG59XG5cbi8qKlxuICogUG9vbGVkQ2xhc3MgcmVwcmVzZW50aW5nIHRoZSBib29ra2VlcGluZyBhc3NvY2lhdGVkIHdpdGggcGVyZm9ybWluZyBhIGNoaWxkXG4gKiB0cmF2ZXJzYWwuIEFsbG93cyBhdm9pZGluZyBiaW5kaW5nIGNhbGxiYWNrcy5cbiAqXG4gKiBAY29uc3RydWN0b3IgRm9yRWFjaEJvb2tLZWVwaW5nXG4gKiBAcGFyYW0geyFmdW5jdGlvbn0gZm9yRWFjaEZ1bmN0aW9uIEZ1bmN0aW9uIHRvIHBlcmZvcm0gdHJhdmVyc2FsIHdpdGguXG4gKiBAcGFyYW0gez8qfSBmb3JFYWNoQ29udGV4dCBDb250ZXh0IHRvIHBlcmZvcm0gY29udGV4dCB3aXRoLlxuICovXG5mdW5jdGlvbiBGb3JFYWNoQm9va0tlZXBpbmcoZm9yRWFjaEZ1bmN0aW9uLCBmb3JFYWNoQ29udGV4dCkge1xuICB0aGlzLmZ1bmMgPSBmb3JFYWNoRnVuY3Rpb247XG4gIHRoaXMuY29udGV4dCA9IGZvckVhY2hDb250ZXh0O1xuICB0aGlzLmNvdW50ID0gMDtcbn1cbkZvckVhY2hCb29rS2VlcGluZy5wcm90b3R5cGUuZGVzdHJ1Y3RvciA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5mdW5jID0gbnVsbDtcbiAgdGhpcy5jb250ZXh0ID0gbnVsbDtcbiAgdGhpcy5jb3VudCA9IDA7XG59O1xuUG9vbGVkQ2xhc3MuYWRkUG9vbGluZ1RvKEZvckVhY2hCb29rS2VlcGluZywgdHdvQXJndW1lbnRQb29sZXIpO1xuXG5mdW5jdGlvbiBmb3JFYWNoU2luZ2xlQ2hpbGQoYm9va0tlZXBpbmcsIGNoaWxkLCBuYW1lKSB7XG4gIHZhciBmdW5jID0gYm9va0tlZXBpbmcuZnVuYyxcbiAgICAgIGNvbnRleHQgPSBib29rS2VlcGluZy5jb250ZXh0O1xuXG4gIGZ1bmMuY2FsbChjb250ZXh0LCBjaGlsZCwgYm9va0tlZXBpbmcuY291bnQrKyk7XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgdGhyb3VnaCBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAuXG4gKlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNoaWxkcmVuLmZvcmVhY2hcbiAqXG4gKiBUaGUgcHJvdmlkZWQgZm9yRWFjaEZ1bmMoY2hpbGQsIGluZGV4KSB3aWxsIGJlIGNhbGxlZCBmb3IgZWFjaFxuICogbGVhZiBjaGlsZC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIGNvbnRhaW5lci5cbiAqIEBwYXJhbSB7ZnVuY3Rpb24oKiwgaW50KX0gZm9yRWFjaEZ1bmNcbiAqIEBwYXJhbSB7Kn0gZm9yRWFjaENvbnRleHQgQ29udGV4dCBmb3IgZm9yRWFjaENvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGZvckVhY2hDaGlsZHJlbihjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7XG4gIGlmIChjaGlsZHJlbiA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuO1xuICB9XG4gIHZhciB0cmF2ZXJzZUNvbnRleHQgPSBGb3JFYWNoQm9va0tlZXBpbmcuZ2V0UG9vbGVkKGZvckVhY2hGdW5jLCBmb3JFYWNoQ29udGV4dCk7XG4gIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGZvckVhY2hTaW5nbGVDaGlsZCwgdHJhdmVyc2VDb250ZXh0KTtcbiAgRm9yRWFjaEJvb2tLZWVwaW5nLnJlbGVhc2UodHJhdmVyc2VDb250ZXh0KTtcbn1cblxuLyoqXG4gKiBQb29sZWRDbGFzcyByZXByZXNlbnRpbmcgdGhlIGJvb2trZWVwaW5nIGFzc29jaWF0ZWQgd2l0aCBwZXJmb3JtaW5nIGEgY2hpbGRcbiAqIG1hcHBpbmcuIEFsbG93cyBhdm9pZGluZyBiaW5kaW5nIGNhbGxiYWNrcy5cbiAqXG4gKiBAY29uc3RydWN0b3IgTWFwQm9va0tlZXBpbmdcbiAqIEBwYXJhbSB7ISp9IG1hcFJlc3VsdCBPYmplY3QgY29udGFpbmluZyB0aGUgb3JkZXJlZCBtYXAgb2YgcmVzdWx0cy5cbiAqIEBwYXJhbSB7IWZ1bmN0aW9ufSBtYXBGdW5jdGlvbiBGdW5jdGlvbiB0byBwZXJmb3JtIG1hcHBpbmcgd2l0aC5cbiAqIEBwYXJhbSB7Pyp9IG1hcENvbnRleHQgQ29udGV4dCB0byBwZXJmb3JtIG1hcHBpbmcgd2l0aC5cbiAqL1xuZnVuY3Rpb24gTWFwQm9va0tlZXBpbmcobWFwUmVzdWx0LCBrZXlQcmVmaXgsIG1hcEZ1bmN0aW9uLCBtYXBDb250ZXh0KSB7XG4gIHRoaXMucmVzdWx0ID0gbWFwUmVzdWx0O1xuICB0aGlzLmtleVByZWZpeCA9IGtleVByZWZpeDtcbiAgdGhpcy5mdW5jID0gbWFwRnVuY3Rpb247XG4gIHRoaXMuY29udGV4dCA9IG1hcENvbnRleHQ7XG4gIHRoaXMuY291bnQgPSAwO1xufVxuTWFwQm9va0tlZXBpbmcucHJvdG90eXBlLmRlc3RydWN0b3IgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMucmVzdWx0ID0gbnVsbDtcbiAgdGhpcy5rZXlQcmVmaXggPSBudWxsO1xuICB0aGlzLmZ1bmMgPSBudWxsO1xuICB0aGlzLmNvbnRleHQgPSBudWxsO1xuICB0aGlzLmNvdW50ID0gMDtcbn07XG5Qb29sZWRDbGFzcy5hZGRQb29saW5nVG8oTWFwQm9va0tlZXBpbmcsIGZvdXJBcmd1bWVudFBvb2xlcik7XG5cbmZ1bmN0aW9uIG1hcFNpbmdsZUNoaWxkSW50b0NvbnRleHQoYm9va0tlZXBpbmcsIGNoaWxkLCBjaGlsZEtleSkge1xuICB2YXIgcmVzdWx0ID0gYm9va0tlZXBpbmcucmVzdWx0LFxuICAgICAga2V5UHJlZml4ID0gYm9va0tlZXBpbmcua2V5UHJlZml4LFxuICAgICAgZnVuYyA9IGJvb2tLZWVwaW5nLmZ1bmMsXG4gICAgICBjb250ZXh0ID0gYm9va0tlZXBpbmcuY29udGV4dDtcblxuXG4gIHZhciBtYXBwZWRDaGlsZCA9IGZ1bmMuY2FsbChjb250ZXh0LCBjaGlsZCwgYm9va0tlZXBpbmcuY291bnQrKyk7XG4gIGlmIChBcnJheS5pc0FycmF5KG1hcHBlZENoaWxkKSkge1xuICAgIG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwobWFwcGVkQ2hpbGQsIHJlc3VsdCwgY2hpbGRLZXksIGVtcHR5RnVuY3Rpb24udGhhdFJldHVybnNBcmd1bWVudCk7XG4gIH0gZWxzZSBpZiAobWFwcGVkQ2hpbGQgIT0gbnVsbCkge1xuICAgIGlmIChSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQobWFwcGVkQ2hpbGQpKSB7XG4gICAgICBtYXBwZWRDaGlsZCA9IFJlYWN0RWxlbWVudC5jbG9uZUFuZFJlcGxhY2VLZXkobWFwcGVkQ2hpbGQsXG4gICAgICAvLyBLZWVwIGJvdGggdGhlIChtYXBwZWQpIGFuZCBvbGQga2V5cyBpZiB0aGV5IGRpZmZlciwganVzdCBhc1xuICAgICAgLy8gdHJhdmVyc2VBbGxDaGlsZHJlbiB1c2VkIHRvIGRvIGZvciBvYmplY3RzIGFzIGNoaWxkcmVuXG4gICAgICBrZXlQcmVmaXggKyAobWFwcGVkQ2hpbGQua2V5ICYmICghY2hpbGQgfHwgY2hpbGQua2V5ICE9PSBtYXBwZWRDaGlsZC5rZXkpID8gZXNjYXBlVXNlclByb3ZpZGVkS2V5KG1hcHBlZENoaWxkLmtleSkgKyAnLycgOiAnJykgKyBjaGlsZEtleSk7XG4gICAgfVxuICAgIHJlc3VsdC5wdXNoKG1hcHBlZENoaWxkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsKGNoaWxkcmVuLCBhcnJheSwgcHJlZml4LCBmdW5jLCBjb250ZXh0KSB7XG4gIHZhciBlc2NhcGVkUHJlZml4ID0gJyc7XG4gIGlmIChwcmVmaXggIT0gbnVsbCkge1xuICAgIGVzY2FwZWRQcmVmaXggPSBlc2NhcGVVc2VyUHJvdmlkZWRLZXkocHJlZml4KSArICcvJztcbiAgfVxuICB2YXIgdHJhdmVyc2VDb250ZXh0ID0gTWFwQm9va0tlZXBpbmcuZ2V0UG9vbGVkKGFycmF5LCBlc2NhcGVkUHJlZml4LCBmdW5jLCBjb250ZXh0KTtcbiAgdHJhdmVyc2VBbGxDaGlsZHJlbihjaGlsZHJlbiwgbWFwU2luZ2xlQ2hpbGRJbnRvQ29udGV4dCwgdHJhdmVyc2VDb250ZXh0KTtcbiAgTWFwQm9va0tlZXBpbmcucmVsZWFzZSh0cmF2ZXJzZUNvbnRleHQpO1xufVxuXG4vKipcbiAqIE1hcHMgY2hpbGRyZW4gdGhhdCBhcmUgdHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jaGlsZHJlbi5tYXBcbiAqXG4gKiBUaGUgcHJvdmlkZWQgbWFwRnVuY3Rpb24oY2hpbGQsIGtleSwgaW5kZXgpIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoXG4gKiBsZWFmIGNoaWxkLlxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHtmdW5jdGlvbigqLCBpbnQpfSBmdW5jIFRoZSBtYXAgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBmb3IgbWFwRnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtvYmplY3R9IE9iamVjdCBjb250YWluaW5nIHRoZSBvcmRlcmVkIG1hcCBvZiByZXN1bHRzLlxuICovXG5mdW5jdGlvbiBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuYywgY29udGV4dCkge1xuICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkge1xuICAgIHJldHVybiBjaGlsZHJlbjtcbiAgfVxuICB2YXIgcmVzdWx0ID0gW107XG4gIG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwoY2hpbGRyZW4sIHJlc3VsdCwgbnVsbCwgZnVuYywgY29udGV4dCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGZvckVhY2hTaW5nbGVDaGlsZER1bW15KHRyYXZlcnNlQ29udGV4dCwgY2hpbGQsIG5hbWUpIHtcbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzXG4gKiBgcHJvcHMuY2hpbGRyZW5gLlxuICpcbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jaGlsZHJlbi5jb3VudFxuICpcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuLlxuICovXG5mdW5jdGlvbiBjb3VudENoaWxkcmVuKGNoaWxkcmVuLCBjb250ZXh0KSB7XG4gIHJldHVybiB0cmF2ZXJzZUFsbENoaWxkcmVuKGNoaWxkcmVuLCBmb3JFYWNoU2luZ2xlQ2hpbGREdW1teSwgbnVsbCk7XG59XG5cbi8qKlxuICogRmxhdHRlbiBhIGNoaWxkcmVuIG9iamVjdCAodHlwaWNhbGx5IHNwZWNpZmllZCBhcyBgcHJvcHMuY2hpbGRyZW5gKSBhbmRcbiAqIHJldHVybiBhbiBhcnJheSB3aXRoIGFwcHJvcHJpYXRlbHkgcmUta2V5ZWQgY2hpbGRyZW4uXG4gKlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNoaWxkcmVuLnRvYXJyYXlcbiAqL1xuZnVuY3Rpb24gdG9BcnJheShjaGlsZHJlbikge1xuICB2YXIgcmVzdWx0ID0gW107XG4gIG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWwoY2hpbGRyZW4sIHJlc3VsdCwgbnVsbCwgZW1wdHlGdW5jdGlvbi50aGF0UmV0dXJuc0FyZ3VtZW50KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxudmFyIFJlYWN0Q2hpbGRyZW4gPSB7XG4gIGZvckVhY2g6IGZvckVhY2hDaGlsZHJlbixcbiAgbWFwOiBtYXBDaGlsZHJlbixcbiAgbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbDogbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbCxcbiAgY291bnQ6IGNvdW50Q2hpbGRyZW4sXG4gIHRvQXJyYXk6IHRvQXJyYXlcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3RDaGlsZHJlbjsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpLFxuICAgIF9hc3NpZ24gPSByZXF1aXJlKCdvYmplY3QtYXNzaWduJyk7XG5cbnZhciBSZWFjdENvbXBvbmVudCA9IHJlcXVpcmUoJy4vUmVhY3RDb21wb25lbnQnKTtcbnZhciBSZWFjdEVsZW1lbnQgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudCcpO1xudmFyIFJlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzID0gcmVxdWlyZSgnLi9SZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lcycpO1xudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0gcmVxdWlyZSgnLi9SZWFjdE5vb3BVcGRhdGVRdWV1ZScpO1xuXG52YXIgZW1wdHlPYmplY3QgPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eU9iamVjdCcpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbnZhciBNSVhJTlNfS0VZID0gJ21peGlucyc7XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byBhbGxvdyB0aGUgY3JlYXRpb24gb2YgYW5vbnltb3VzIGZ1bmN0aW9ucyB3aGljaCBkbyBub3Rcbi8vIGhhdmUgLm5hbWUgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBiZWluZyBhc3NpZ25lZCB0by5cbmZ1bmN0aW9uIGlkZW50aXR5KGZuKSB7XG4gIHJldHVybiBmbjtcbn1cblxuLyoqXG4gKiBQb2xpY2llcyB0aGF0IGRlc2NyaWJlIG1ldGhvZHMgaW4gYFJlYWN0Q2xhc3NJbnRlcmZhY2VgLlxuICovXG5cblxudmFyIGluamVjdGVkTWl4aW5zID0gW107XG5cbi8qKlxuICogQ29tcG9zaXRlIGNvbXBvbmVudHMgYXJlIGhpZ2hlci1sZXZlbCBjb21wb25lbnRzIHRoYXQgY29tcG9zZSBvdGhlciBjb21wb3NpdGVcbiAqIG9yIGhvc3QgY29tcG9uZW50cy5cbiAqXG4gKiBUbyBjcmVhdGUgYSBuZXcgdHlwZSBvZiBgUmVhY3RDbGFzc2AsIHBhc3MgYSBzcGVjaWZpY2F0aW9uIG9mXG4gKiB5b3VyIG5ldyBjbGFzcyB0byBgUmVhY3QuY3JlYXRlQ2xhc3NgLiBUaGUgb25seSByZXF1aXJlbWVudCBvZiB5b3VyIGNsYXNzXG4gKiBzcGVjaWZpY2F0aW9uIGlzIHRoYXQgeW91IGltcGxlbWVudCBhIGByZW5kZXJgIG1ldGhvZC5cbiAqXG4gKiAgIHZhciBNeUNvbXBvbmVudCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbiAqICAgICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICogICAgICAgcmV0dXJuIDxkaXY+SGVsbG8gV29ybGQ8L2Rpdj47XG4gKiAgICAgfVxuICogICB9KTtcbiAqXG4gKiBUaGUgY2xhc3Mgc3BlY2lmaWNhdGlvbiBzdXBwb3J0cyBhIHNwZWNpZmljIHByb3RvY29sIG9mIG1ldGhvZHMgdGhhdCBoYXZlXG4gKiBzcGVjaWFsIG1lYW5pbmcgKGUuZy4gYHJlbmRlcmApLiBTZWUgYFJlYWN0Q2xhc3NJbnRlcmZhY2VgIGZvclxuICogbW9yZSB0aGUgY29tcHJlaGVuc2l2ZSBwcm90b2NvbC4gQW55IG90aGVyIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgaW4gdGhlXG4gKiBjbGFzcyBzcGVjaWZpY2F0aW9uIHdpbGwgYmUgYXZhaWxhYmxlIG9uIHRoZSBwcm90b3R5cGUuXG4gKlxuICogQGludGVyZmFjZSBSZWFjdENsYXNzSW50ZXJmYWNlXG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIFJlYWN0Q2xhc3NJbnRlcmZhY2UgPSB7XG5cbiAgLyoqXG4gICAqIEFuIGFycmF5IG9mIE1peGluIG9iamVjdHMgdG8gaW5jbHVkZSB3aGVuIGRlZmluaW5nIHlvdXIgY29tcG9uZW50LlxuICAgKlxuICAgKiBAdHlwZSB7YXJyYXl9XG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgbWl4aW5zOiAnREVGSU5FX01BTlknLFxuXG4gIC8qKlxuICAgKiBBbiBvYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIGRlZmluZWQgb25cbiAgICogdGhlIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yIGluc3RlYWQgb2YgaXRzIHByb3RvdHlwZSAoc3RhdGljIG1ldGhvZHMpLlxuICAgKlxuICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIHN0YXRpY3M6ICdERUZJTkVfTUFOWScsXG5cbiAgLyoqXG4gICAqIERlZmluaXRpb24gb2YgcHJvcCB0eXBlcyBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAqXG4gICAqIEB0eXBlIHtvYmplY3R9XG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgcHJvcFR5cGVzOiAnREVGSU5FX01BTlknLFxuXG4gIC8qKlxuICAgKiBEZWZpbml0aW9uIG9mIGNvbnRleHQgdHlwZXMgZm9yIHRoaXMgY29tcG9uZW50LlxuICAgKlxuICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIGNvbnRleHRUeXBlczogJ0RFRklORV9NQU5ZJyxcblxuICAvKipcbiAgICogRGVmaW5pdGlvbiBvZiBjb250ZXh0IHR5cGVzIHRoaXMgY29tcG9uZW50IHNldHMgZm9yIGl0cyBjaGlsZHJlbi5cbiAgICpcbiAgICogQHR5cGUge29iamVjdH1cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBjaGlsZENvbnRleHRUeXBlczogJ0RFRklORV9NQU5ZJyxcblxuICAvLyA9PT09IERlZmluaXRpb24gbWV0aG9kcyA9PT09XG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIG1vdW50ZWQuIFZhbHVlcyBpbiB0aGUgbWFwcGluZyB3aWxsIGJlIHNldCBvblxuICAgKiBgdGhpcy5wcm9wc2AgaWYgdGhhdCBwcm9wIGlzIG5vdCBzcGVjaWZpZWQgKGkuZS4gdXNpbmcgYW4gYGluYCBjaGVjaykuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYmVmb3JlIGBnZXRJbml0aWFsU3RhdGVgIGFuZCB0aGVyZWZvcmUgY2Fubm90IHJlbHlcbiAgICogb24gYHRoaXMuc3RhdGVgIG9yIHVzZSBgdGhpcy5zZXRTdGF0ZWAuXG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBnZXREZWZhdWx0UHJvcHM6ICdERUZJTkVfTUFOWV9NRVJHRUQnLFxuXG4gIC8qKlxuICAgKiBJbnZva2VkIG9uY2UgYmVmb3JlIHRoZSBjb21wb25lbnQgaXMgbW91bnRlZC4gVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHVzZWRcbiAgICogYXMgdGhlIGluaXRpYWwgdmFsdWUgb2YgYHRoaXMuc3RhdGVgLlxuICAgKlxuICAgKiAgIGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAqICAgICByZXR1cm4ge1xuICAgKiAgICAgICBpc09uOiBmYWxzZSxcbiAgICogICAgICAgZm9vQmF6OiBuZXcgQmF6Rm9vKClcbiAgICogICAgIH1cbiAgICogICB9XG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBnZXRJbml0aWFsU3RhdGU6ICdERUZJTkVfTUFOWV9NRVJHRUQnLFxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtvYmplY3R9XG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgZ2V0Q2hpbGRDb250ZXh0OiAnREVGSU5FX01BTllfTUVSR0VEJyxcblxuICAvKipcbiAgICogVXNlcyBwcm9wcyBmcm9tIGB0aGlzLnByb3BzYCBhbmQgc3RhdGUgZnJvbSBgdGhpcy5zdGF0ZWAgdG8gcmVuZGVyIHRoZVxuICAgKiBzdHJ1Y3R1cmUgb2YgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogTm8gZ3VhcmFudGVlcyBhcmUgbWFkZSBhYm91dCB3aGVuIG9yIGhvdyBvZnRlbiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkLCBzb1xuICAgKiBpdCBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cy5cbiAgICpcbiAgICogICByZW5kZXI6IGZ1bmN0aW9uKCkge1xuICAgKiAgICAgdmFyIG5hbWUgPSB0aGlzLnByb3BzLm5hbWU7XG4gICAqICAgICByZXR1cm4gPGRpdj5IZWxsbywge25hbWV9ITwvZGl2PjtcbiAgICogICB9XG4gICAqXG4gICAqIEByZXR1cm4ge1JlYWN0Q29tcG9uZW50fVxuICAgKiBAcmVxdWlyZWRcbiAgICovXG4gIHJlbmRlcjogJ0RFRklORV9PTkNFJyxcblxuICAvLyA9PT09IERlbGVnYXRlIG1ldGhvZHMgPT09PVxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBpbml0aWFsbHkgY3JlYXRlZCBhbmQgYWJvdXQgdG8gYmUgbW91bnRlZC5cbiAgICogVGhpcyBtYXkgaGF2ZSBzaWRlIGVmZmVjdHMsIGJ1dCBhbnkgZXh0ZXJuYWwgc3Vic2NyaXB0aW9ucyBvciBkYXRhIGNyZWF0ZWRcbiAgICogYnkgdGhpcyBtZXRob2QgbXVzdCBiZSBjbGVhbmVkIHVwIGluIGBjb21wb25lbnRXaWxsVW5tb3VudGAuXG4gICAqXG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgY29tcG9uZW50V2lsbE1vdW50OiAnREVGSU5FX01BTlknLFxuXG4gIC8qKlxuICAgKiBJbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBoYXMgYmVlbiBtb3VudGVkIGFuZCBoYXMgYSBET00gcmVwcmVzZW50YXRpb24uXG4gICAqIEhvd2V2ZXIsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBET00gbm9kZSBpcyBpbiB0aGUgZG9jdW1lbnQuXG4gICAqXG4gICAqIFVzZSB0aGlzIGFzIGFuIG9wcG9ydHVuaXR5IHRvIG9wZXJhdGUgb24gdGhlIERPTSB3aGVuIHRoZSBjb21wb25lbnQgaGFzXG4gICAqIGJlZW4gbW91bnRlZCAoaW5pdGlhbGl6ZWQgYW5kIHJlbmRlcmVkKSBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAqXG4gICAqIEBwYXJhbSB7RE9NRWxlbWVudH0gcm9vdE5vZGUgRE9NIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBjb21wb25lbnQuXG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgY29tcG9uZW50RGlkTW91bnQ6ICdERUZJTkVfTUFOWScsXG5cbiAgLyoqXG4gICAqIEludm9rZWQgYmVmb3JlIHRoZSBjb21wb25lbnQgcmVjZWl2ZXMgbmV3IHByb3BzLlxuICAgKlxuICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byByZWFjdCB0byBhIHByb3AgdHJhbnNpdGlvbiBieSB1cGRhdGluZyB0aGVcbiAgICogc3RhdGUgdXNpbmcgYHRoaXMuc2V0U3RhdGVgLiBDdXJyZW50IHByb3BzIGFyZSBhY2Nlc3NlZCB2aWEgYHRoaXMucHJvcHNgLlxuICAgKlxuICAgKiAgIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6IGZ1bmN0aW9uKG5leHRQcm9wcywgbmV4dENvbnRleHQpIHtcbiAgICogICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgKiAgICAgICBsaWtlc0luY3JlYXNpbmc6IG5leHRQcm9wcy5saWtlQ291bnQgPiB0aGlzLnByb3BzLmxpa2VDb3VudFxuICAgKiAgICAgfSk7XG4gICAqICAgfVxuICAgKlxuICAgKiBOT1RFOiBUaGVyZSBpcyBubyBlcXVpdmFsZW50IGBjb21wb25lbnRXaWxsUmVjZWl2ZVN0YXRlYC4gQW4gaW5jb21pbmcgcHJvcFxuICAgKiB0cmFuc2l0aW9uIG1heSBjYXVzZSBhIHN0YXRlIGNoYW5nZSwgYnV0IHRoZSBvcHBvc2l0ZSBpcyBub3QgdHJ1ZS4gSWYgeW91XG4gICAqIG5lZWQgaXQsIHlvdSBhcmUgcHJvYmFibHkgbG9va2luZyBmb3IgYGNvbXBvbmVudFdpbGxVcGRhdGVgLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gbmV4dFByb3BzXG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogJ0RFRklORV9NQU5ZJyxcblxuICAvKipcbiAgICogSW52b2tlZCB3aGlsZSBkZWNpZGluZyBpZiB0aGUgY29tcG9uZW50IHNob3VsZCBiZSB1cGRhdGVkIGFzIGEgcmVzdWx0IG9mXG4gICAqIHJlY2VpdmluZyBuZXcgcHJvcHMsIHN0YXRlIGFuZC9vciBjb250ZXh0LlxuICAgKlxuICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBgcmV0dXJuIGZhbHNlYCB3aGVuIHlvdSdyZSBjZXJ0YWluIHRoYXQgdGhlXG4gICAqIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBwcm9wcy9zdGF0ZS9jb250ZXh0IHdpbGwgbm90IHJlcXVpcmUgYSBjb21wb25lbnRcbiAgICogdXBkYXRlLlxuICAgKlxuICAgKiAgIHNob3VsZENvbXBvbmVudFVwZGF0ZTogZnVuY3Rpb24obmV4dFByb3BzLCBuZXh0U3RhdGUsIG5leHRDb250ZXh0KSB7XG4gICAqICAgICByZXR1cm4gIWVxdWFsKG5leHRQcm9wcywgdGhpcy5wcm9wcykgfHxcbiAgICogICAgICAgIWVxdWFsKG5leHRTdGF0ZSwgdGhpcy5zdGF0ZSkgfHxcbiAgICogICAgICAgIWVxdWFsKG5leHRDb250ZXh0LCB0aGlzLmNvbnRleHQpO1xuICAgKiAgIH1cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG5leHRQcm9wc1xuICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHRTdGF0ZVxuICAgKiBAcGFyYW0gez9vYmplY3R9IG5leHRDb250ZXh0XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGNvbXBvbmVudCBzaG91bGQgdXBkYXRlLlxuICAgKiBAb3B0aW9uYWxcbiAgICovXG4gIHNob3VsZENvbXBvbmVudFVwZGF0ZTogJ0RFRklORV9PTkNFJyxcblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgYWJvdXQgdG8gdXBkYXRlIGR1ZSB0byBhIHRyYW5zaXRpb24gZnJvbVxuICAgKiBgdGhpcy5wcm9wc2AsIGB0aGlzLnN0YXRlYCBhbmQgYHRoaXMuY29udGV4dGAgdG8gYG5leHRQcm9wc2AsIGBuZXh0U3RhdGVgXG4gICAqIGFuZCBgbmV4dENvbnRleHRgLlxuICAgKlxuICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBwZXJmb3JtIHByZXBhcmF0aW9uIGJlZm9yZSBhbiB1cGRhdGUgb2NjdXJzLlxuICAgKlxuICAgKiBOT1RFOiBZb3UgKipjYW5ub3QqKiB1c2UgYHRoaXMuc2V0U3RhdGUoKWAgaW4gdGhpcyBtZXRob2QuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBuZXh0UHJvcHNcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0U3RhdGVcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBuZXh0Q29udGV4dFxuICAgKiBAcGFyYW0ge1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb259IHRyYW5zYWN0aW9uXG4gICAqIEBvcHRpb25hbFxuICAgKi9cbiAgY29tcG9uZW50V2lsbFVwZGF0ZTogJ0RFRklORV9NQU5ZJyxcblxuICAvKipcbiAgICogSW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQncyBET00gcmVwcmVzZW50YXRpb24gaGFzIGJlZW4gdXBkYXRlZC5cbiAgICpcbiAgICogVXNlIHRoaXMgYXMgYW4gb3Bwb3J0dW5pdHkgdG8gb3BlcmF0ZSBvbiB0aGUgRE9NIHdoZW4gdGhlIGNvbXBvbmVudCBoYXNcbiAgICogYmVlbiB1cGRhdGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gcHJldlByb3BzXG4gICAqIEBwYXJhbSB7P29iamVjdH0gcHJldlN0YXRlXG4gICAqIEBwYXJhbSB7P29iamVjdH0gcHJldkNvbnRleHRcbiAgICogQHBhcmFtIHtET01FbGVtZW50fSByb290Tm9kZSBET00gZWxlbWVudCByZXByZXNlbnRpbmcgdGhlIGNvbXBvbmVudC5cbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBjb21wb25lbnREaWRVcGRhdGU6ICdERUZJTkVfTUFOWScsXG5cbiAgLyoqXG4gICAqIEludm9rZWQgd2hlbiB0aGUgY29tcG9uZW50IGlzIGFib3V0IHRvIGJlIHJlbW92ZWQgZnJvbSBpdHMgcGFyZW50IGFuZCBoYXZlXG4gICAqIGl0cyBET00gcmVwcmVzZW50YXRpb24gZGVzdHJveWVkLlxuICAgKlxuICAgKiBVc2UgdGhpcyBhcyBhbiBvcHBvcnR1bml0eSB0byBkZWFsbG9jYXRlIGFueSBleHRlcm5hbCByZXNvdXJjZXMuXG4gICAqXG4gICAqIE5PVEU6IFRoZXJlIGlzIG5vIGBjb21wb25lbnREaWRVbm1vdW50YCBzaW5jZSB5b3VyIGNvbXBvbmVudCB3aWxsIGhhdmUgYmVlblxuICAgKiBkZXN0cm95ZWQgYnkgdGhhdCBwb2ludC5cbiAgICpcbiAgICogQG9wdGlvbmFsXG4gICAqL1xuICBjb21wb25lbnRXaWxsVW5tb3VudDogJ0RFRklORV9NQU5ZJyxcblxuICAvLyA9PT09IEFkdmFuY2VkIG1ldGhvZHMgPT09PVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHRoZSBjb21wb25lbnQncyBjdXJyZW50bHkgbW91bnRlZCBET00gcmVwcmVzZW50YXRpb24uXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoaXMgaW1wbGVtZW50cyBSZWFjdCdzIHJlbmRlcmluZyBhbmQgcmVjb25jaWxpYXRpb24gYWxnb3JpdGhtLlxuICAgKiBTb3BoaXN0aWNhdGVkIGNsaWVudHMgbWF5IHdpc2ggdG8gb3ZlcnJpZGUgdGhpcy5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9ufSB0cmFuc2FjdGlvblxuICAgKiBAaW50ZXJuYWxcbiAgICogQG92ZXJyaWRhYmxlXG4gICAqL1xuICB1cGRhdGVDb21wb25lbnQ6ICdPVkVSUklERV9CQVNFJ1xuXG59O1xuXG4vKipcbiAqIE1hcHBpbmcgZnJvbSBjbGFzcyBzcGVjaWZpY2F0aW9uIGtleXMgdG8gc3BlY2lhbCBwcm9jZXNzaW5nIGZ1bmN0aW9ucy5cbiAqXG4gKiBBbHRob3VnaCB0aGVzZSBhcmUgZGVjbGFyZWQgbGlrZSBpbnN0YW5jZSBwcm9wZXJ0aWVzIGluIHRoZSBzcGVjaWZpY2F0aW9uXG4gKiB3aGVuIGRlZmluaW5nIGNsYXNzZXMgdXNpbmcgYFJlYWN0LmNyZWF0ZUNsYXNzYCwgdGhleSBhcmUgYWN0dWFsbHkgc3RhdGljXG4gKiBhbmQgYXJlIGFjY2Vzc2libGUgb24gdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQgb2YgdGhlIHByb3RvdHlwZS4gRGVzcGl0ZVxuICogYmVpbmcgc3RhdGljLCB0aGV5IG11c3QgYmUgZGVmaW5lZCBvdXRzaWRlIG9mIHRoZSBcInN0YXRpY3NcIiBrZXkgdW5kZXJcbiAqIHdoaWNoIGFsbCBvdGhlciBzdGF0aWMgbWV0aG9kcyBhcmUgZGVmaW5lZC5cbiAqL1xudmFyIFJFU0VSVkVEX1NQRUNfS0VZUyA9IHtcbiAgZGlzcGxheU5hbWU6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgZGlzcGxheU5hbWUpIHtcbiAgICBDb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lO1xuICB9LFxuICBtaXhpbnM6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgbWl4aW5zKSB7XG4gICAgaWYgKG1peGlucykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtaXhpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbWl4U3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIG1peGluc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBjaGlsZENvbnRleHRUeXBlczogZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBjaGlsZENvbnRleHRUeXBlcykge1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgdmFsaWRhdGVUeXBlRGVmKENvbnN0cnVjdG9yLCBjaGlsZENvbnRleHRUeXBlcywgJ2NoaWxkQ29udGV4dCcpO1xuICAgIH1cbiAgICBDb25zdHJ1Y3Rvci5jaGlsZENvbnRleHRUeXBlcyA9IF9hc3NpZ24oe30sIENvbnN0cnVjdG9yLmNoaWxkQ29udGV4dFR5cGVzLCBjaGlsZENvbnRleHRUeXBlcyk7XG4gIH0sXG4gIGNvbnRleHRUeXBlczogZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBjb250ZXh0VHlwZXMpIHtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhbGlkYXRlVHlwZURlZihDb25zdHJ1Y3RvciwgY29udGV4dFR5cGVzLCAnY29udGV4dCcpO1xuICAgIH1cbiAgICBDb25zdHJ1Y3Rvci5jb250ZXh0VHlwZXMgPSBfYXNzaWduKHt9LCBDb25zdHJ1Y3Rvci5jb250ZXh0VHlwZXMsIGNvbnRleHRUeXBlcyk7XG4gIH0sXG4gIC8qKlxuICAgKiBTcGVjaWFsIGNhc2UgZ2V0RGVmYXVsdFByb3BzIHdoaWNoIHNob3VsZCBtb3ZlIGludG8gc3RhdGljcyBidXQgcmVxdWlyZXNcbiAgICogYXV0b21hdGljIG1lcmdpbmcuXG4gICAqL1xuICBnZXREZWZhdWx0UHJvcHM6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgZ2V0RGVmYXVsdFByb3BzKSB7XG4gICAgaWYgKENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcykge1xuICAgICAgQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzID0gY3JlYXRlTWVyZ2VkUmVzdWx0RnVuY3Rpb24oQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzLCBnZXREZWZhdWx0UHJvcHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMgPSBnZXREZWZhdWx0UHJvcHM7XG4gICAgfVxuICB9LFxuICBwcm9wVHlwZXM6IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvcFR5cGVzKSB7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICB2YWxpZGF0ZVR5cGVEZWYoQ29uc3RydWN0b3IsIHByb3BUeXBlcywgJ3Byb3AnKTtcbiAgICB9XG4gICAgQ29uc3RydWN0b3IucHJvcFR5cGVzID0gX2Fzc2lnbih7fSwgQ29uc3RydWN0b3IucHJvcFR5cGVzLCBwcm9wVHlwZXMpO1xuICB9LFxuICBzdGF0aWNzOiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHN0YXRpY3MpIHtcbiAgICBtaXhTdGF0aWNTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3Rvciwgc3RhdGljcyk7XG4gIH0sXG4gIGF1dG9iaW5kOiBmdW5jdGlvbiAoKSB7fSB9O1xuXG5mdW5jdGlvbiB2YWxpZGF0ZVR5cGVEZWYoQ29uc3RydWN0b3IsIHR5cGVEZWYsIGxvY2F0aW9uKSB7XG4gIGZvciAodmFyIHByb3BOYW1lIGluIHR5cGVEZWYpIHtcbiAgICBpZiAodHlwZURlZi5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgIC8vIHVzZSBhIHdhcm5pbmcgaW5zdGVhZCBvZiBhbiBpbnZhcmlhbnQgc28gY29tcG9uZW50c1xuICAgICAgLy8gZG9uJ3Qgc2hvdyB1cCBpbiBwcm9kIGJ1dCBvbmx5IGluIF9fREVWX19cbiAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyh0eXBlb2YgdHlwZURlZltwcm9wTmFtZV0gPT09ICdmdW5jdGlvbicsICclczogJXMgdHlwZSBgJXNgIGlzIGludmFsaWQ7IGl0IG11c3QgYmUgYSBmdW5jdGlvbiwgdXN1YWxseSBmcm9tICcgKyAnUmVhY3QuUHJvcFR5cGVzLicsIENvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8ICdSZWFjdENsYXNzJywgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dLCBwcm9wTmFtZSkgOiB2b2lkIDA7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTWV0aG9kT3ZlcnJpZGUoaXNBbHJlYWR5RGVmaW5lZCwgbmFtZSkge1xuICB2YXIgc3BlY1BvbGljeSA9IFJlYWN0Q2xhc3NJbnRlcmZhY2UuaGFzT3duUHJvcGVydHkobmFtZSkgPyBSZWFjdENsYXNzSW50ZXJmYWNlW25hbWVdIDogbnVsbDtcblxuICAvLyBEaXNhbGxvdyBvdmVycmlkaW5nIG9mIGJhc2UgY2xhc3MgbWV0aG9kcyB1bmxlc3MgZXhwbGljaXRseSBhbGxvd2VkLlxuICBpZiAoUmVhY3RDbGFzc01peGluLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgIShzcGVjUG9saWN5ID09PSAnT1ZFUlJJREVfQkFTRScpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdENsYXNzSW50ZXJmYWNlOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gb3ZlcnJpZGUgYCVzYCBmcm9tIHlvdXIgY2xhc3Mgc3BlY2lmaWNhdGlvbi4gRW5zdXJlIHRoYXQgeW91ciBtZXRob2QgbmFtZXMgZG8gbm90IG92ZXJsYXAgd2l0aCBSZWFjdCBtZXRob2RzLicsIG5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzczJywgbmFtZSkgOiB2b2lkIDA7XG4gIH1cblxuICAvLyBEaXNhbGxvdyBkZWZpbmluZyBtZXRob2RzIG1vcmUgdGhhbiBvbmNlIHVubGVzcyBleHBsaWNpdGx5IGFsbG93ZWQuXG4gIGlmIChpc0FscmVhZHlEZWZpbmVkKSB7XG4gICAgIShzcGVjUG9saWN5ID09PSAnREVGSU5FX01BTlknIHx8IHNwZWNQb2xpY3kgPT09ICdERUZJTkVfTUFOWV9NRVJHRUQnKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RDbGFzc0ludGVyZmFjZTogWW91IGFyZSBhdHRlbXB0aW5nIHRvIGRlZmluZSBgJXNgIG9uIHlvdXIgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlLiBUaGlzIGNvbmZsaWN0IG1heSBiZSBkdWUgdG8gYSBtaXhpbi4nLCBuYW1lKSA6IF9wcm9kSW52YXJpYW50KCc3NCcsIG5hbWUpIDogdm9pZCAwO1xuICB9XG59XG5cbi8qKlxuICogTWl4aW4gaGVscGVyIHdoaWNoIGhhbmRsZXMgcG9saWN5IHZhbGlkYXRpb24gYW5kIHJlc2VydmVkXG4gKiBzcGVjaWZpY2F0aW9uIGtleXMgd2hlbiBidWlsZGluZyBSZWFjdCBjbGFzc2VzLlxuICovXG5mdW5jdGlvbiBtaXhTcGVjSW50b0NvbXBvbmVudChDb25zdHJ1Y3Rvciwgc3BlYykge1xuICBpZiAoIXNwZWMpIHtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciB0eXBlb2ZTcGVjID0gdHlwZW9mIHNwZWM7XG4gICAgICB2YXIgaXNNaXhpblZhbGlkID0gdHlwZW9mU3BlYyA9PT0gJ29iamVjdCcgJiYgc3BlYyAhPT0gbnVsbDtcblxuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGlzTWl4aW5WYWxpZCwgJyVzOiBZb3VcXCdyZSBhdHRlbXB0aW5nIHRvIGluY2x1ZGUgYSBtaXhpbiB0aGF0IGlzIGVpdGhlciBudWxsICcgKyAnb3Igbm90IGFuIG9iamVjdC4gQ2hlY2sgdGhlIG1peGlucyBpbmNsdWRlZCBieSB0aGUgY29tcG9uZW50LCAnICsgJ2FzIHdlbGwgYXMgYW55IG1peGlucyB0aGV5IGluY2x1ZGUgdGhlbXNlbHZlcy4gJyArICdFeHBlY3RlZCBvYmplY3QgYnV0IGdvdCAlcy4nLCBDb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCAnUmVhY3RDbGFzcycsIHNwZWMgPT09IG51bGwgPyBudWxsIDogdHlwZW9mU3BlYykgOiB2b2lkIDA7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgISh0eXBlb2Ygc3BlYyAhPT0gJ2Z1bmN0aW9uJykgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q2xhc3M6IFlvdVxcJ3JlIGF0dGVtcHRpbmcgdG8gdXNlIGEgY29tcG9uZW50IGNsYXNzIG9yIGZ1bmN0aW9uIGFzIGEgbWl4aW4uIEluc3RlYWQsIGp1c3QgdXNlIGEgcmVndWxhciBvYmplY3QuJykgOiBfcHJvZEludmFyaWFudCgnNzUnKSA6IHZvaWQgMDtcbiAgISFSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQoc3BlYykgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q2xhc3M6IFlvdVxcJ3JlIGF0dGVtcHRpbmcgdG8gdXNlIGEgY29tcG9uZW50IGFzIGEgbWl4aW4uIEluc3RlYWQsIGp1c3QgdXNlIGEgcmVndWxhciBvYmplY3QuJykgOiBfcHJvZEludmFyaWFudCgnNzYnKSA6IHZvaWQgMDtcblxuICB2YXIgcHJvdG8gPSBDb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIHZhciBhdXRvQmluZFBhaXJzID0gcHJvdG8uX19yZWFjdEF1dG9CaW5kUGFpcnM7XG5cbiAgLy8gQnkgaGFuZGxpbmcgbWl4aW5zIGJlZm9yZSBhbnkgb3RoZXIgcHJvcGVydGllcywgd2UgZW5zdXJlIHRoZSBzYW1lXG4gIC8vIGNoYWluaW5nIG9yZGVyIGlzIGFwcGxpZWQgdG8gbWV0aG9kcyB3aXRoIERFRklORV9NQU5ZIHBvbGljeSwgd2hldGhlclxuICAvLyBtaXhpbnMgYXJlIGxpc3RlZCBiZWZvcmUgb3IgYWZ0ZXIgdGhlc2UgbWV0aG9kcyBpbiB0aGUgc3BlYy5cbiAgaWYgKHNwZWMuaGFzT3duUHJvcGVydHkoTUlYSU5TX0tFWSkpIHtcbiAgICBSRVNFUlZFRF9TUEVDX0tFWVMubWl4aW5zKENvbnN0cnVjdG9yLCBzcGVjLm1peGlucyk7XG4gIH1cblxuICBmb3IgKHZhciBuYW1lIGluIHNwZWMpIHtcbiAgICBpZiAoIXNwZWMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChuYW1lID09PSBNSVhJTlNfS0VZKSB7XG4gICAgICAvLyBXZSBoYXZlIGFscmVhZHkgaGFuZGxlZCBtaXhpbnMgaW4gYSBzcGVjaWFsIGNhc2UgYWJvdmUuXG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgcHJvcGVydHkgPSBzcGVjW25hbWVdO1xuICAgIHZhciBpc0FscmVhZHlEZWZpbmVkID0gcHJvdG8uaGFzT3duUHJvcGVydHkobmFtZSk7XG4gICAgdmFsaWRhdGVNZXRob2RPdmVycmlkZShpc0FscmVhZHlEZWZpbmVkLCBuYW1lKTtcblxuICAgIGlmIChSRVNFUlZFRF9TUEVDX0tFWVMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIFJFU0VSVkVEX1NQRUNfS0VZU1tuYW1lXShDb25zdHJ1Y3RvciwgcHJvcGVydHkpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTZXR1cCBtZXRob2RzIG9uIHByb3RvdHlwZTpcbiAgICAgIC8vIFRoZSBmb2xsb3dpbmcgbWVtYmVyIG1ldGhvZHMgc2hvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5IGJvdW5kOlxuICAgICAgLy8gMS4gRXhwZWN0ZWQgUmVhY3RDbGFzcyBtZXRob2RzIChpbiB0aGUgXCJpbnRlcmZhY2VcIikuXG4gICAgICAvLyAyLiBPdmVycmlkZGVuIG1ldGhvZHMgKHRoYXQgd2VyZSBtaXhlZCBpbikuXG4gICAgICB2YXIgaXNSZWFjdENsYXNzTWV0aG9kID0gUmVhY3RDbGFzc0ludGVyZmFjZS5oYXNPd25Qcm9wZXJ0eShuYW1lKTtcbiAgICAgIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIHByb3BlcnR5ID09PSAnZnVuY3Rpb24nO1xuICAgICAgdmFyIHNob3VsZEF1dG9CaW5kID0gaXNGdW5jdGlvbiAmJiAhaXNSZWFjdENsYXNzTWV0aG9kICYmICFpc0FscmVhZHlEZWZpbmVkICYmIHNwZWMuYXV0b2JpbmQgIT09IGZhbHNlO1xuXG4gICAgICBpZiAoc2hvdWxkQXV0b0JpbmQpIHtcbiAgICAgICAgYXV0b0JpbmRQYWlycy5wdXNoKG5hbWUsIHByb3BlcnR5KTtcbiAgICAgICAgcHJvdG9bbmFtZV0gPSBwcm9wZXJ0eTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc0FscmVhZHlEZWZpbmVkKSB7XG4gICAgICAgICAgdmFyIHNwZWNQb2xpY3kgPSBSZWFjdENsYXNzSW50ZXJmYWNlW25hbWVdO1xuXG4gICAgICAgICAgLy8gVGhlc2UgY2FzZXMgc2hvdWxkIGFscmVhZHkgYmUgY2F1Z2h0IGJ5IHZhbGlkYXRlTWV0aG9kT3ZlcnJpZGUuXG4gICAgICAgICAgIShpc1JlYWN0Q2xhc3NNZXRob2QgJiYgKHNwZWNQb2xpY3kgPT09ICdERUZJTkVfTUFOWV9NRVJHRUQnIHx8IHNwZWNQb2xpY3kgPT09ICdERUZJTkVfTUFOWScpKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RDbGFzczogVW5leHBlY3RlZCBzcGVjIHBvbGljeSAlcyBmb3Iga2V5ICVzIHdoZW4gbWl4aW5nIGluIGNvbXBvbmVudCBzcGVjcy4nLCBzcGVjUG9saWN5LCBuYW1lKSA6IF9wcm9kSW52YXJpYW50KCc3NycsIHNwZWNQb2xpY3ksIG5hbWUpIDogdm9pZCAwO1xuXG4gICAgICAgICAgLy8gRm9yIG1ldGhvZHMgd2hpY2ggYXJlIGRlZmluZWQgbW9yZSB0aGFuIG9uY2UsIGNhbGwgdGhlIGV4aXN0aW5nXG4gICAgICAgICAgLy8gbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGUgbmV3IHByb3BlcnR5LCBtZXJnaW5nIGlmIGFwcHJvcHJpYXRlLlxuICAgICAgICAgIGlmIChzcGVjUG9saWN5ID09PSAnREVGSU5FX01BTllfTUVSR0VEJykge1xuICAgICAgICAgICAgcHJvdG9bbmFtZV0gPSBjcmVhdGVNZXJnZWRSZXN1bHRGdW5jdGlvbihwcm90b1tuYW1lXSwgcHJvcGVydHkpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoc3BlY1BvbGljeSA9PT0gJ0RFRklORV9NQU5ZJykge1xuICAgICAgICAgICAgcHJvdG9bbmFtZV0gPSBjcmVhdGVDaGFpbmVkRnVuY3Rpb24ocHJvdG9bbmFtZV0sIHByb3BlcnR5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvdG9bbmFtZV0gPSBwcm9wZXJ0eTtcbiAgICAgICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIC8vIEFkZCB2ZXJib3NlIGRpc3BsYXlOYW1lIHRvIHRoZSBmdW5jdGlvbiwgd2hpY2ggaGVscHMgd2hlbiBsb29raW5nXG4gICAgICAgICAgICAvLyBhdCBwcm9maWxpbmcgdG9vbHMuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnR5ID09PSAnZnVuY3Rpb24nICYmIHNwZWMuZGlzcGxheU5hbWUpIHtcbiAgICAgICAgICAgICAgcHJvdG9bbmFtZV0uZGlzcGxheU5hbWUgPSBzcGVjLmRpc3BsYXlOYW1lICsgJ18nICsgbmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbWl4U3RhdGljU3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIHN0YXRpY3MpIHtcbiAgaWYgKCFzdGF0aWNzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAodmFyIG5hbWUgaW4gc3RhdGljcykge1xuICAgIHZhciBwcm9wZXJ0eSA9IHN0YXRpY3NbbmFtZV07XG4gICAgaWYgKCFzdGF0aWNzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgaXNSZXNlcnZlZCA9IG5hbWUgaW4gUkVTRVJWRURfU1BFQ19LRVlTO1xuICAgICEhaXNSZXNlcnZlZCA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnUmVhY3RDbGFzczogWW91IGFyZSBhdHRlbXB0aW5nIHRvIGRlZmluZSBhIHJlc2VydmVkIHByb3BlcnR5LCBgJXNgLCB0aGF0IHNob3VsZG5cXCd0IGJlIG9uIHRoZSBcInN0YXRpY3NcIiBrZXkuIERlZmluZSBpdCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBpbnN0ZWFkOyBpdCB3aWxsIHN0aWxsIGJlIGFjY2Vzc2libGUgb24gdGhlIGNvbnN0cnVjdG9yLicsIG5hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzc4JywgbmFtZSkgOiB2b2lkIDA7XG5cbiAgICB2YXIgaXNJbmhlcml0ZWQgPSBuYW1lIGluIENvbnN0cnVjdG9yO1xuICAgICEhaXNJbmhlcml0ZWQgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ1JlYWN0Q2xhc3M6IFlvdSBhcmUgYXR0ZW1wdGluZyB0byBkZWZpbmUgYCVzYCBvbiB5b3VyIGNvbXBvbmVudCBtb3JlIHRoYW4gb25jZS4gVGhpcyBjb25mbGljdCBtYXkgYmUgZHVlIHRvIGEgbWl4aW4uJywgbmFtZSkgOiBfcHJvZEludmFyaWFudCgnNzknLCBuYW1lKSA6IHZvaWQgMDtcbiAgICBDb25zdHJ1Y3RvcltuYW1lXSA9IHByb3BlcnR5O1xuICB9XG59XG5cbi8qKlxuICogTWVyZ2UgdHdvIG9iamVjdHMsIGJ1dCB0aHJvdyBpZiBib3RoIGNvbnRhaW4gdGhlIHNhbWUga2V5LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvbmUgVGhlIGZpcnN0IG9iamVjdCwgd2hpY2ggaXMgbXV0YXRlZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSB0d28gVGhlIHNlY29uZCBvYmplY3RcbiAqIEByZXR1cm4ge29iamVjdH0gb25lIGFmdGVyIGl0IGhhcyBiZWVuIG11dGF0ZWQgdG8gY29udGFpbiBldmVyeXRoaW5nIGluIHR3by5cbiAqL1xuZnVuY3Rpb24gbWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cyhvbmUsIHR3bykge1xuICAhKG9uZSAmJiB0d28gJiYgdHlwZW9mIG9uZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHR3byA9PT0gJ29iamVjdCcpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzKCk6IENhbm5vdCBtZXJnZSBub24tb2JqZWN0cy4nKSA6IF9wcm9kSW52YXJpYW50KCc4MCcpIDogdm9pZCAwO1xuXG4gIGZvciAodmFyIGtleSBpbiB0d28pIHtcbiAgICBpZiAodHdvLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICEob25lW2tleV0gPT09IHVuZGVmaW5lZCkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ21lcmdlSW50b1dpdGhOb0R1cGxpY2F0ZUtleXMoKTogVHJpZWQgdG8gbWVyZ2UgdHdvIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBrZXk6IGAlc2AuIFRoaXMgY29uZmxpY3QgbWF5IGJlIGR1ZSB0byBhIG1peGluOyBpbiBwYXJ0aWN1bGFyLCB0aGlzIG1heSBiZSBjYXVzZWQgYnkgdHdvIGdldEluaXRpYWxTdGF0ZSgpIG9yIGdldERlZmF1bHRQcm9wcygpIG1ldGhvZHMgcmV0dXJuaW5nIG9iamVjdHMgd2l0aCBjbGFzaGluZyBrZXlzLicsIGtleSkgOiBfcHJvZEludmFyaWFudCgnODEnLCBrZXkpIDogdm9pZCAwO1xuICAgICAgb25lW2tleV0gPSB0d29ba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG9uZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHR3byBmdW5jdGlvbnMgYW5kIG1lcmdlcyB0aGVpciByZXR1cm4gdmFsdWVzLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IG9uZSBGdW5jdGlvbiB0byBpbnZva2UgZmlyc3QuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSB0d28gRnVuY3Rpb24gdG8gaW52b2tlIHNlY29uZC5cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSBGdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIHR3byBhcmd1bWVudCBmdW5jdGlvbnMuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjcmVhdGVNZXJnZWRSZXN1bHRGdW5jdGlvbihvbmUsIHR3bykge1xuICByZXR1cm4gZnVuY3Rpb24gbWVyZ2VkUmVzdWx0KCkge1xuICAgIHZhciBhID0gb25lLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgdmFyIGIgPSB0d28uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpZiAoYSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gYjtcbiAgICB9IGVsc2UgaWYgKGIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGE7XG4gICAgfVxuICAgIHZhciBjID0ge307XG4gICAgbWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cyhjLCBhKTtcbiAgICBtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzKGMsIGIpO1xuICAgIHJldHVybiBjO1xuICB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdHdvIGZ1bmN0aW9ucyBhbmQgaWdub3JlcyB0aGVpciByZXR1cm4gdmFsZXMuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gb25lIEZ1bmN0aW9uIHRvIGludm9rZSBmaXJzdC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHR3byBGdW5jdGlvbiB0byBpbnZva2Ugc2Vjb25kLlxuICogQHJldHVybiB7ZnVuY3Rpb259IEZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgdHdvIGFyZ3VtZW50IGZ1bmN0aW9ucy5cbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNoYWluZWRGdW5jdGlvbihvbmUsIHR3bykge1xuICByZXR1cm4gZnVuY3Rpb24gY2hhaW5lZEZ1bmN0aW9uKCkge1xuICAgIG9uZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIHR3by5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG4vKipcbiAqIEJpbmRzIGEgbWV0aG9kIHRvIHRoZSBjb21wb25lbnQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNvbXBvbmVudCBDb21wb25lbnQgd2hvc2UgbWV0aG9kIGlzIGdvaW5nIHRvIGJlIGJvdW5kLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gbWV0aG9kIE1ldGhvZCB0byBiZSBib3VuZC5cbiAqIEByZXR1cm4ge2Z1bmN0aW9ufSBUaGUgYm91bmQgbWV0aG9kLlxuICovXG5mdW5jdGlvbiBiaW5kQXV0b0JpbmRNZXRob2QoY29tcG9uZW50LCBtZXRob2QpIHtcbiAgdmFyIGJvdW5kTWV0aG9kID0gbWV0aG9kLmJpbmQoY29tcG9uZW50KTtcbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgYm91bmRNZXRob2QuX19yZWFjdEJvdW5kQ29udGV4dCA9IGNvbXBvbmVudDtcbiAgICBib3VuZE1ldGhvZC5fX3JlYWN0Qm91bmRNZXRob2QgPSBtZXRob2Q7XG4gICAgYm91bmRNZXRob2QuX19yZWFjdEJvdW5kQXJndW1lbnRzID0gbnVsbDtcbiAgICB2YXIgY29tcG9uZW50TmFtZSA9IGNvbXBvbmVudC5jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZTtcbiAgICB2YXIgX2JpbmQgPSBib3VuZE1ldGhvZC5iaW5kO1xuICAgIGJvdW5kTWV0aG9kLmJpbmQgPSBmdW5jdGlvbiAobmV3VGhpcykge1xuICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICAvLyBVc2VyIGlzIHRyeWluZyB0byBiaW5kKCkgYW4gYXV0b2JvdW5kIG1ldGhvZDsgd2UgZWZmZWN0aXZlbHkgd2lsbFxuICAgICAgLy8gaWdub3JlIHRoZSB2YWx1ZSBvZiBcInRoaXNcIiB0aGF0IHRoZSB1c2VyIGlzIHRyeWluZyB0byB1c2UsIHNvXG4gICAgICAvLyBsZXQncyB3YXJuLlxuICAgICAgaWYgKG5ld1RoaXMgIT09IGNvbXBvbmVudCAmJiBuZXdUaGlzICE9PSBudWxsKSB7XG4gICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2JpbmQoKTogUmVhY3QgY29tcG9uZW50IG1ldGhvZHMgbWF5IG9ubHkgYmUgYm91bmQgdG8gdGhlICcgKyAnY29tcG9uZW50IGluc3RhbmNlLiBTZWUgJXMnLCBjb21wb25lbnROYW1lKSA6IHZvaWQgMDtcbiAgICAgIH0gZWxzZSBpZiAoIWFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ2JpbmQoKTogWW91IGFyZSBiaW5kaW5nIGEgY29tcG9uZW50IG1ldGhvZCB0byB0aGUgY29tcG9uZW50LiAnICsgJ1JlYWN0IGRvZXMgdGhpcyBmb3IgeW91IGF1dG9tYXRpY2FsbHkgaW4gYSBoaWdoLXBlcmZvcm1hbmNlICcgKyAnd2F5LCBzbyB5b3UgY2FuIHNhZmVseSByZW1vdmUgdGhpcyBjYWxsLiBTZWUgJXMnLCBjb21wb25lbnROYW1lKSA6IHZvaWQgMDtcbiAgICAgICAgcmV0dXJuIGJvdW5kTWV0aG9kO1xuICAgICAgfVxuICAgICAgdmFyIHJlYm91bmRNZXRob2QgPSBfYmluZC5hcHBseShib3VuZE1ldGhvZCwgYXJndW1lbnRzKTtcbiAgICAgIHJlYm91bmRNZXRob2QuX19yZWFjdEJvdW5kQ29udGV4dCA9IGNvbXBvbmVudDtcbiAgICAgIHJlYm91bmRNZXRob2QuX19yZWFjdEJvdW5kTWV0aG9kID0gbWV0aG9kO1xuICAgICAgcmVib3VuZE1ldGhvZC5fX3JlYWN0Qm91bmRBcmd1bWVudHMgPSBhcmdzO1xuICAgICAgcmV0dXJuIHJlYm91bmRNZXRob2Q7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gYm91bmRNZXRob2Q7XG59XG5cbi8qKlxuICogQmluZHMgYWxsIGF1dG8tYm91bmQgbWV0aG9kcyBpbiBhIGNvbXBvbmVudC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29tcG9uZW50IENvbXBvbmVudCB3aG9zZSBtZXRob2QgaXMgZ29pbmcgdG8gYmUgYm91bmQuXG4gKi9cbmZ1bmN0aW9uIGJpbmRBdXRvQmluZE1ldGhvZHMoY29tcG9uZW50KSB7XG4gIHZhciBwYWlycyA9IGNvbXBvbmVudC5fX3JlYWN0QXV0b0JpbmRQYWlycztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBhdXRvQmluZEtleSA9IHBhaXJzW2ldO1xuICAgIHZhciBtZXRob2QgPSBwYWlyc1tpICsgMV07XG4gICAgY29tcG9uZW50W2F1dG9CaW5kS2V5XSA9IGJpbmRBdXRvQmluZE1ldGhvZChjb21wb25lbnQsIG1ldGhvZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBZGQgbW9yZSB0byB0aGUgUmVhY3RDbGFzcyBiYXNlIGNsYXNzLiBUaGVzZSBhcmUgYWxsIGxlZ2FjeSBmZWF0dXJlcyBhbmRcbiAqIHRoZXJlZm9yZSBub3QgYWxyZWFkeSBwYXJ0IG9mIHRoZSBtb2Rlcm4gUmVhY3RDb21wb25lbnQuXG4gKi9cbnZhciBSZWFjdENsYXNzTWl4aW4gPSB7XG5cbiAgLyoqXG4gICAqIFRPRE86IFRoaXMgd2lsbCBiZSBkZXByZWNhdGVkIGJlY2F1c2Ugc3RhdGUgc2hvdWxkIGFsd2F5cyBrZWVwIGEgY29uc2lzdGVudFxuICAgKiB0eXBlIHNpZ25hdHVyZSBhbmQgdGhlIG9ubHkgdXNlIGNhc2UgZm9yIHRoaXMsIGlzIHRvIGF2b2lkIHRoYXQuXG4gICAqL1xuICByZXBsYWNlU3RhdGU6IGZ1bmN0aW9uIChuZXdTdGF0ZSwgY2FsbGJhY2spIHtcbiAgICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZSh0aGlzLCBuZXdTdGF0ZSk7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUNhbGxiYWNrKHRoaXMsIGNhbGxiYWNrLCAncmVwbGFjZVN0YXRlJyk7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBvciBub3QgdGhpcyBjb21wb3NpdGUgY29tcG9uZW50IGlzIG1vdW50ZWQuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbW91bnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBmaW5hbFxuICAgKi9cbiAgaXNNb3VudGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlci5pc01vdW50ZWQodGhpcyk7XG4gIH1cbn07XG5cbnZhciBSZWFjdENsYXNzQ29tcG9uZW50ID0gZnVuY3Rpb24gKCkge307XG5fYXNzaWduKFJlYWN0Q2xhc3NDb21wb25lbnQucHJvdG90eXBlLCBSZWFjdENvbXBvbmVudC5wcm90b3R5cGUsIFJlYWN0Q2xhc3NNaXhpbik7XG5cbnZhciBkaWRXYXJuRGVwcmVjYXRlZCA9IGZhbHNlO1xuXG4vKipcbiAqIE1vZHVsZSBmb3IgY3JlYXRpbmcgY29tcG9zaXRlIGNvbXBvbmVudHMuXG4gKlxuICogQGNsYXNzIFJlYWN0Q2xhc3NcbiAqL1xudmFyIFJlYWN0Q2xhc3MgPSB7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjb21wb3NpdGUgY29tcG9uZW50IGNsYXNzIGdpdmVuIGEgY2xhc3Mgc3BlY2lmaWNhdGlvbi5cbiAgICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNyZWF0ZWNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBzcGVjIENsYXNzIHNwZWNpZmljYXRpb24gKHdoaWNoIG11c3QgZGVmaW5lIGByZW5kZXJgKS5cbiAgICogQHJldHVybiB7ZnVuY3Rpb259IENvbXBvbmVudCBjb25zdHJ1Y3RvciBmdW5jdGlvbi5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgY3JlYXRlQ2xhc3M6IGZ1bmN0aW9uIChzcGVjKSB7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZGlkV2FybkRlcHJlY2F0ZWQsICclczogUmVhY3QuY3JlYXRlQ2xhc3MgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHZlcnNpb24gMTYuICcgKyAnVXNlIHBsYWluIEphdmFTY3JpcHQgY2xhc3NlcyBpbnN0ZWFkLiBJZiB5b3VcXCdyZSBub3QgeWV0IHJlYWR5IHRvICcgKyAnbWlncmF0ZSwgY3JlYXRlLXJlYWN0LWNsYXNzIGlzIGF2YWlsYWJsZSBvbiBucG0gYXMgYSAnICsgJ2Ryb3AtaW4gcmVwbGFjZW1lbnQuJywgc3BlYyAmJiBzcGVjLmRpc3BsYXlOYW1lIHx8ICdBIENvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgZGlkV2FybkRlcHJlY2F0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFRvIGtlZXAgb3VyIHdhcm5pbmdzIG1vcmUgdW5kZXJzdGFuZGFibGUsIHdlJ2xsIHVzZSBhIGxpdHRsZSBoYWNrIGhlcmUgdG9cbiAgICAvLyBlbnN1cmUgdGhhdCBDb25zdHJ1Y3Rvci5uYW1lICE9PSAnQ29uc3RydWN0b3InLiBUaGlzIG1ha2VzIHN1cmUgd2UgZG9uJ3RcbiAgICAvLyB1bm5lY2Vzc2FyaWx5IGlkZW50aWZ5IGEgY2xhc3Mgd2l0aG91dCBkaXNwbGF5TmFtZSBhcyAnQ29uc3RydWN0b3InLlxuICAgIHZhciBDb25zdHJ1Y3RvciA9IGlkZW50aXR5KGZ1bmN0aW9uIChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICAgICAgLy8gVGhpcyBjb25zdHJ1Y3RvciBnZXRzIG92ZXJyaWRkZW4gYnkgbW9ja3MuIFRoZSBhcmd1bWVudCBpcyB1c2VkXG4gICAgICAvLyBieSBtb2NrcyB0byBhc3NlcnQgb24gd2hhdCBnZXRzIG1vdW50ZWQuXG5cbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcodGhpcyBpbnN0YW5jZW9mIENvbnN0cnVjdG9yLCAnU29tZXRoaW5nIGlzIGNhbGxpbmcgYSBSZWFjdCBjb21wb25lbnQgZGlyZWN0bHkuIFVzZSBhIGZhY3Rvcnkgb3IgJyArICdKU1ggaW5zdGVhZC4gU2VlOiBodHRwczovL2ZiLm1lL3JlYWN0LWxlZ2FjeWZhY3RvcnknKSA6IHZvaWQgMDtcbiAgICAgIH1cblxuICAgICAgLy8gV2lyZSB1cCBhdXRvLWJpbmRpbmdcbiAgICAgIGlmICh0aGlzLl9fcmVhY3RBdXRvQmluZFBhaXJzLmxlbmd0aCkge1xuICAgICAgICBiaW5kQXV0b0JpbmRNZXRob2RzKHRoaXMpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gICAgICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xuXG4gICAgICB0aGlzLnN0YXRlID0gbnVsbDtcblxuICAgICAgLy8gUmVhY3RDbGFzc2VzIGRvZXNuJ3QgaGF2ZSBjb25zdHJ1Y3RvcnMuIEluc3RlYWQsIHRoZXkgdXNlIHRoZVxuICAgICAgLy8gZ2V0SW5pdGlhbFN0YXRlIGFuZCBjb21wb25lbnRXaWxsTW91bnQgbWV0aG9kcyBmb3IgaW5pdGlhbGl6YXRpb24uXG5cbiAgICAgIHZhciBpbml0aWFsU3RhdGUgPSB0aGlzLmdldEluaXRpYWxTdGF0ZSA/IHRoaXMuZ2V0SW5pdGlhbFN0YXRlKCkgOiBudWxsO1xuICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgIC8vIFdlIGFsbG93IGF1dG8tbW9ja3MgdG8gcHJvY2VlZCBhcyBpZiB0aGV5J3JlIHJldHVybmluZyBudWxsLlxuICAgICAgICBpZiAoaW5pdGlhbFN0YXRlID09PSB1bmRlZmluZWQgJiYgdGhpcy5nZXRJbml0aWFsU3RhdGUuX2lzTW9ja0Z1bmN0aW9uKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBwcm9iYWJseSBiYWQgcHJhY3RpY2UuIENvbnNpZGVyIHdhcm5pbmcgaGVyZSBhbmRcbiAgICAgICAgICAvLyBkZXByZWNhdGluZyB0aGlzIGNvbnZlbmllbmNlLlxuICAgICAgICAgIGluaXRpYWxTdGF0ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgICEodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaW5pdGlhbFN0YXRlKSkgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzLmdldEluaXRpYWxTdGF0ZSgpOiBtdXN0IHJldHVybiBhbiBvYmplY3Qgb3IgbnVsbCcsIENvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8ICdSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCcpIDogX3Byb2RJbnZhcmlhbnQoJzgyJywgQ29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgJ1JlYWN0Q29tcG9zaXRlQ29tcG9uZW50JykgOiB2b2lkIDA7XG5cbiAgICAgIHRoaXMuc3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gICAgfSk7XG4gICAgQ29uc3RydWN0b3IucHJvdG90eXBlID0gbmV3IFJlYWN0Q2xhc3NDb21wb25lbnQoKTtcbiAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25zdHJ1Y3RvcjtcbiAgICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUuX19yZWFjdEF1dG9CaW5kUGFpcnMgPSBbXTtcblxuICAgIGluamVjdGVkTWl4aW5zLmZvckVhY2gobWl4U3BlY0ludG9Db21wb25lbnQuYmluZChudWxsLCBDb25zdHJ1Y3RvcikpO1xuXG4gICAgbWl4U3BlY0ludG9Db21wb25lbnQoQ29uc3RydWN0b3IsIHNwZWMpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdFByb3BzIHByb3BlcnR5IGFmdGVyIGFsbCBtaXhpbnMgaGF2ZSBiZWVuIG1lcmdlZC5cbiAgICBpZiAoQ29uc3RydWN0b3IuZ2V0RGVmYXVsdFByb3BzKSB7XG4gICAgICBDb25zdHJ1Y3Rvci5kZWZhdWx0UHJvcHMgPSBDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMoKTtcbiAgICB9XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIC8vIFRoaXMgaXMgYSB0YWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgdXNlIG9mIHRoZXNlIG1ldGhvZCBuYW1lcyBpcyBvayxcbiAgICAgIC8vIHNpbmNlIGl0J3MgdXNlZCB3aXRoIGNyZWF0ZUNsYXNzLiBJZiBpdCdzIG5vdCwgdGhlbiBpdCdzIGxpa2VseSBhXG4gICAgICAvLyBtaXN0YWtlIHNvIHdlJ2xsIHdhcm4geW91IHRvIHVzZSB0aGUgc3RhdGljIHByb3BlcnR5LCBwcm9wZXJ0eVxuICAgICAgLy8gaW5pdGlhbGl6ZXIgb3IgY29uc3RydWN0b3IgcmVzcGVjdGl2ZWx5LlxuICAgICAgaWYgKENvbnN0cnVjdG9yLmdldERlZmF1bHRQcm9wcykge1xuICAgICAgICBDb25zdHJ1Y3Rvci5nZXREZWZhdWx0UHJvcHMuaXNSZWFjdENsYXNzQXBwcm92ZWQgPSB7fTtcbiAgICAgIH1cbiAgICAgIGlmIChDb25zdHJ1Y3Rvci5wcm90b3R5cGUuZ2V0SW5pdGlhbFN0YXRlKSB7XG4gICAgICAgIENvbnN0cnVjdG9yLnByb3RvdHlwZS5nZXRJbml0aWFsU3RhdGUuaXNSZWFjdENsYXNzQXBwcm92ZWQgPSB7fTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAhQ29uc3RydWN0b3IucHJvdG90eXBlLnJlbmRlciA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnY3JlYXRlQ2xhc3MoLi4uKTogQ2xhc3Mgc3BlY2lmaWNhdGlvbiBtdXN0IGltcGxlbWVudCBhIGByZW5kZXJgIG1ldGhvZC4nKSA6IF9wcm9kSW52YXJpYW50KCc4MycpIDogdm9pZCAwO1xuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoIUNvbnN0cnVjdG9yLnByb3RvdHlwZS5jb21wb25lbnRTaG91bGRVcGRhdGUsICclcyBoYXMgYSBtZXRob2QgY2FsbGVkICcgKyAnY29tcG9uZW50U2hvdWxkVXBkYXRlKCkuIERpZCB5b3UgbWVhbiBzaG91bGRDb21wb25lbnRVcGRhdGUoKT8gJyArICdUaGUgbmFtZSBpcyBwaHJhc2VkIGFzIGEgcXVlc3Rpb24gYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgJyArICdleHBlY3RlZCB0byByZXR1cm4gYSB2YWx1ZS4nLCBzcGVjLmRpc3BsYXlOYW1lIHx8ICdBIGNvbXBvbmVudCcpIDogdm9pZCAwO1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFDb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29tcG9uZW50V2lsbFJlY2lldmVQcm9wcywgJyVzIGhhcyBhIG1ldGhvZCBjYWxsZWQgJyArICdjb21wb25lbnRXaWxsUmVjaWV2ZVByb3BzKCkuIERpZCB5b3UgbWVhbiBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKCk/Jywgc3BlYy5kaXNwbGF5TmFtZSB8fCAnQSBjb21wb25lbnQnKSA6IHZvaWQgMDtcbiAgICB9XG5cbiAgICAvLyBSZWR1Y2UgdGltZSBzcGVudCBkb2luZyBsb29rdXBzIGJ5IHNldHRpbmcgdGhlc2Ugb24gdGhlIHByb3RvdHlwZS5cbiAgICBmb3IgKHZhciBtZXRob2ROYW1lIGluIFJlYWN0Q2xhc3NJbnRlcmZhY2UpIHtcbiAgICAgIGlmICghQ29uc3RydWN0b3IucHJvdG90eXBlW21ldGhvZE5hbWVdKSB7XG4gICAgICAgIENvbnN0cnVjdG9yLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9LFxuXG4gIGluamVjdGlvbjoge1xuICAgIGluamVjdE1peGluOiBmdW5jdGlvbiAobWl4aW4pIHtcbiAgICAgIGluamVjdGVkTWl4aW5zLnB1c2gobWl4aW4pO1xuICAgIH1cbiAgfVxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q2xhc3M7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlID0gcmVxdWlyZSgnLi9SZWFjdE5vb3BVcGRhdGVRdWV1ZScpO1xuXG52YXIgY2FuRGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL2NhbkRlZmluZVByb3BlcnR5Jyk7XG52YXIgZW1wdHlPYmplY3QgPSByZXF1aXJlKCdmYmpzL2xpYi9lbXB0eU9iamVjdCcpO1xudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBoZWxwZXJzIGZvciB0aGUgdXBkYXRpbmcgc3RhdGUgb2YgYSBjb21wb25lbnQuXG4gKi9cbmZ1bmN0aW9uIFJlYWN0Q29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdldHMgaW5qZWN0ZWQgYnkgdGhlXG4gIC8vIHJlbmRlcmVyLlxuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG5SZWFjdENvbXBvbmVudC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudCA9IHt9O1xuXG4vKipcbiAqIFNldHMgYSBzdWJzZXQgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgdG8gbXV0YXRlXG4gKiBzdGF0ZS4gWW91IHNob3VsZCB0cmVhdCBgdGhpcy5zdGF0ZWAgYXMgaW1tdXRhYmxlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGB0aGlzLnN0YXRlYCB3aWxsIGJlIGltbWVkaWF0ZWx5IHVwZGF0ZWQsIHNvXG4gKiBhY2Nlc3NpbmcgYHRoaXMuc3RhdGVgIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgbWF5IHJldHVybiB0aGUgb2xkIHZhbHVlLlxuICpcbiAqIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGNhbGxzIHRvIGBzZXRTdGF0ZWAgd2lsbCBydW4gc3luY2hyb25vdXNseSxcbiAqIGFzIHRoZXkgbWF5IGV2ZW50dWFsbHkgYmUgYmF0Y2hlZCB0b2dldGhlci4gIFlvdSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbFxuICogY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIGNhbGwgdG8gc2V0U3RhdGUgaXMgYWN0dWFsbHlcbiAqIGNvbXBsZXRlZC5cbiAqXG4gKiBXaGVuIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgdG8gc2V0U3RhdGUsIGl0IHdpbGwgYmUgY2FsbGVkIGF0IHNvbWUgcG9pbnQgaW5cbiAqIHRoZSBmdXR1cmUgKG5vdCBzeW5jaHJvbm91c2x5KS4gSXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgdXAgdG8gZGF0ZVxuICogY29tcG9uZW50IGFyZ3VtZW50cyAoc3RhdGUsIHByb3BzLCBjb250ZXh0KS4gVGhlc2UgdmFsdWVzIGNhbiBiZSBkaWZmZXJlbnRcbiAqIGZyb20gdGhpcy4qIGJlY2F1c2UgeW91ciBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGFmdGVyIHJlY2VpdmVQcm9wcyBidXQgYmVmb3JlXG4gKiBzaG91bGRDb21wb25lbnRVcGRhdGUsIGFuZCB0aGlzIG5ldyBzdGF0ZSwgcHJvcHMsIGFuZCBjb250ZXh0IHdpbGwgbm90IHlldCBiZVxuICogYXNzaWduZWQgdG8gdGhpcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdHxmdW5jdGlvbn0gcGFydGlhbFN0YXRlIE5leHQgcGFydGlhbCBzdGF0ZSBvciBmdW5jdGlvbiB0b1xuICogICAgICAgIHByb2R1Y2UgbmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIGN1cnJlbnQgc3RhdGUuXG4gKiBAcGFyYW0gez9mdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGVkIGFmdGVyIHN0YXRlIGlzIHVwZGF0ZWQuXG4gKiBAZmluYWxcbiAqIEBwcm90ZWN0ZWRcbiAqL1xuUmVhY3RDb21wb25lbnQucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2spIHtcbiAgISh0eXBlb2YgcGFydGlhbFN0YXRlID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgcGFydGlhbFN0YXRlID09PSAnZnVuY3Rpb24nIHx8IHBhcnRpYWxTdGF0ZSA9PSBudWxsKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnc2V0U3RhdGUoLi4uKTogdGFrZXMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcyB0byB1cGRhdGUgb3IgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMuJykgOiBfcHJvZEludmFyaWFudCgnODUnKSA6IHZvaWQgMDtcbiAgdGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLCBwYXJ0aWFsU3RhdGUpO1xuICBpZiAoY2FsbGJhY2spIHtcbiAgICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUNhbGxiYWNrKHRoaXMsIGNhbGxiYWNrLCAnc2V0U3RhdGUnKTtcbiAgfVxufTtcblxuLyoqXG4gKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoXG4gKiBjZXJ0YWludHkgdGhhdCB3ZSBhcmUgKipub3QqKiBpbiBhIERPTSB0cmFuc2FjdGlvbi5cbiAqXG4gKiBZb3UgbWF5IHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qgb2YgdGhlXG4gKiBjb21wb25lbnQncyBzdGF0ZSBoYXMgY2hhbmdlZCBidXQgYHNldFN0YXRlYCB3YXMgbm90IGNhbGxlZC5cbiAqXG4gKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCwgYnV0IGl0IHdpbGwgaW52b2tlXG4gKiBgY29tcG9uZW50V2lsbFVwZGF0ZWAgYW5kIGBjb21wb25lbnREaWRVcGRhdGVgLlxuICpcbiAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgdXBkYXRlIGlzIGNvbXBsZXRlLlxuICogQGZpbmFsXG4gKiBAcHJvdGVjdGVkXG4gKi9cblJlYWN0Q29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMpO1xuICBpZiAoY2FsbGJhY2spIHtcbiAgICB0aGlzLnVwZGF0ZXIuZW5xdWV1ZUNhbGxiYWNrKHRoaXMsIGNhbGxiYWNrLCAnZm9yY2VVcGRhdGUnKTtcbiAgfVxufTtcblxuLyoqXG4gKiBEZXByZWNhdGVkIEFQSXMuIFRoZXNlIEFQSXMgdXNlZCB0byBleGlzdCBvbiBjbGFzc2ljIFJlYWN0IGNsYXNzZXMgYnV0IHNpbmNlXG4gKiB3ZSB3b3VsZCBsaWtlIHRvIGRlcHJlY2F0ZSB0aGVtLCB3ZSdyZSBub3QgZ29pbmcgdG8gbW92ZSB0aGVtIG92ZXIgdG8gdGhpc1xuICogbW9kZXJuIGJhc2UgY2xhc3MuIEluc3RlYWQsIHdlIGRlZmluZSBhIGdldHRlciB0aGF0IHdhcm5zIGlmIGl0J3MgYWNjZXNzZWQuXG4gKi9cbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICB2YXIgZGVwcmVjYXRlZEFQSXMgPSB7XG4gICAgaXNNb3VudGVkOiBbJ2lzTW91bnRlZCcsICdJbnN0ZWFkLCBtYWtlIHN1cmUgdG8gY2xlYW4gdXAgc3Vic2NyaXB0aW9ucyBhbmQgcGVuZGluZyByZXF1ZXN0cyBpbiAnICsgJ2NvbXBvbmVudFdpbGxVbm1vdW50IHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzLiddLFxuICAgIHJlcGxhY2VTdGF0ZTogWydyZXBsYWNlU3RhdGUnLCAnUmVmYWN0b3IgeW91ciBjb2RlIHRvIHVzZSBzZXRTdGF0ZSBpbnN0ZWFkIChzZWUgJyArICdodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzMyMzYpLiddXG4gIH07XG4gIHZhciBkZWZpbmVEZXByZWNhdGlvbldhcm5pbmcgPSBmdW5jdGlvbiAobWV0aG9kTmFtZSwgaW5mbykge1xuICAgIGlmIChjYW5EZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlYWN0Q29tcG9uZW50LnByb3RvdHlwZSwgbWV0aG9kTmFtZSwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICclcyguLi4pIGlzIGRlcHJlY2F0ZWQgaW4gcGxhaW4gSmF2YVNjcmlwdCBSZWFjdCBjbGFzc2VzLiAlcycsIGluZm9bMF0sIGluZm9bMV0pIDogdm9pZCAwO1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgZm9yICh2YXIgZm5OYW1lIGluIGRlcHJlY2F0ZWRBUElzKSB7XG4gICAgaWYgKGRlcHJlY2F0ZWRBUElzLmhhc093blByb3BlcnR5KGZuTmFtZSkpIHtcbiAgICAgIGRlZmluZURlcHJlY2F0aW9uV2FybmluZyhmbk5hbWUsIGRlcHJlY2F0ZWRBUElzW2ZuTmFtZV0pO1xuICAgIH1cbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q29tcG9uZW50OyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTYtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9wcm9kSW52YXJpYW50ID0gcmVxdWlyZSgnLi9yZWFjdFByb2RJbnZhcmlhbnQnKTtcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgnLi9SZWFjdEN1cnJlbnRPd25lcicpO1xuXG52YXIgaW52YXJpYW50ID0gcmVxdWlyZSgnZmJqcy9saWIvaW52YXJpYW50Jyk7XG52YXIgd2FybmluZyA9IHJlcXVpcmUoJ2ZianMvbGliL3dhcm5pbmcnKTtcblxuZnVuY3Rpb24gaXNOYXRpdmUoZm4pIHtcbiAgLy8gQmFzZWQgb24gaXNOYXRpdmUoKSBmcm9tIExvZGFzaFxuICB2YXIgZnVuY1RvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xuICB2YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuICB2YXIgcmVJc05hdGl2ZSA9IFJlZ0V4cCgnXicgKyBmdW5jVG9TdHJpbmdcbiAgLy8gVGFrZSBhbiBleGFtcGxlIG5hdGl2ZSBmdW5jdGlvbiBzb3VyY2UgZm9yIGNvbXBhcmlzb25cbiAgLmNhbGwoaGFzT3duUHJvcGVydHkpXG4gIC8vIFN0cmlwIHJlZ2V4IGNoYXJhY3RlcnMgc28gd2UgY2FuIHVzZSBpdCBmb3IgcmVnZXhcbiAgLnJlcGxhY2UoL1tcXFxcXiQuKis/KClbXFxde318XS9nLCAnXFxcXCQmJylcbiAgLy8gUmVtb3ZlIGhhc093blByb3BlcnR5IGZyb20gdGhlIHRlbXBsYXRlIHRvIG1ha2UgaXQgZ2VuZXJpY1xuICAucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXFxcXCgpfCBmb3IgLis/KD89XFxcXFxcXSkvZywgJyQxLio/JykgKyAnJCcpO1xuICB0cnkge1xuICAgIHZhciBzb3VyY2UgPSBmdW5jVG9TdHJpbmcuY2FsbChmbik7XG4gICAgcmV0dXJuIHJlSXNOYXRpdmUudGVzdChzb3VyY2UpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxudmFyIGNhblVzZUNvbGxlY3Rpb25zID1cbi8vIEFycmF5LmZyb21cbnR5cGVvZiBBcnJheS5mcm9tID09PSAnZnVuY3Rpb24nICYmXG4vLyBNYXBcbnR5cGVvZiBNYXAgPT09ICdmdW5jdGlvbicgJiYgaXNOYXRpdmUoTWFwKSAmJlxuLy8gTWFwLnByb3RvdHlwZS5rZXlzXG5NYXAucHJvdG90eXBlICE9IG51bGwgJiYgdHlwZW9mIE1hcC5wcm90b3R5cGUua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiBpc05hdGl2ZShNYXAucHJvdG90eXBlLmtleXMpICYmXG4vLyBTZXRcbnR5cGVvZiBTZXQgPT09ICdmdW5jdGlvbicgJiYgaXNOYXRpdmUoU2V0KSAmJlxuLy8gU2V0LnByb3RvdHlwZS5rZXlzXG5TZXQucHJvdG90eXBlICE9IG51bGwgJiYgdHlwZW9mIFNldC5wcm90b3R5cGUua2V5cyA9PT0gJ2Z1bmN0aW9uJyAmJiBpc05hdGl2ZShTZXQucHJvdG90eXBlLmtleXMpO1xuXG52YXIgc2V0SXRlbTtcbnZhciBnZXRJdGVtO1xudmFyIHJlbW92ZUl0ZW07XG52YXIgZ2V0SXRlbUlEcztcbnZhciBhZGRSb290O1xudmFyIHJlbW92ZVJvb3Q7XG52YXIgZ2V0Um9vdElEcztcblxuaWYgKGNhblVzZUNvbGxlY3Rpb25zKSB7XG4gIHZhciBpdGVtTWFwID0gbmV3IE1hcCgpO1xuICB2YXIgcm9vdElEU2V0ID0gbmV3IFNldCgpO1xuXG4gIHNldEl0ZW0gPSBmdW5jdGlvbiAoaWQsIGl0ZW0pIHtcbiAgICBpdGVtTWFwLnNldChpZCwgaXRlbSk7XG4gIH07XG4gIGdldEl0ZW0gPSBmdW5jdGlvbiAoaWQpIHtcbiAgICByZXR1cm4gaXRlbU1hcC5nZXQoaWQpO1xuICB9O1xuICByZW1vdmVJdGVtID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgaXRlbU1hcFsnZGVsZXRlJ10oaWQpO1xuICB9O1xuICBnZXRJdGVtSURzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKGl0ZW1NYXAua2V5cygpKTtcbiAgfTtcblxuICBhZGRSb290ID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgcm9vdElEU2V0LmFkZChpZCk7XG4gIH07XG4gIHJlbW92ZVJvb3QgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICByb290SURTZXRbJ2RlbGV0ZSddKGlkKTtcbiAgfTtcbiAgZ2V0Um9vdElEcyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShyb290SURTZXQua2V5cygpKTtcbiAgfTtcbn0gZWxzZSB7XG4gIHZhciBpdGVtQnlLZXkgPSB7fTtcbiAgdmFyIHJvb3RCeUtleSA9IHt9O1xuXG4gIC8vIFVzZSBub24tbnVtZXJpYyBrZXlzIHRvIHByZXZlbnQgVjggcGVyZm9ybWFuY2UgaXNzdWVzOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC83MjMyXG4gIHZhciBnZXRLZXlGcm9tSUQgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICByZXR1cm4gJy4nICsgaWQ7XG4gIH07XG4gIHZhciBnZXRJREZyb21LZXkgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KGtleS5zdWJzdHIoMSksIDEwKTtcbiAgfTtcblxuICBzZXRJdGVtID0gZnVuY3Rpb24gKGlkLCBpdGVtKSB7XG4gICAgdmFyIGtleSA9IGdldEtleUZyb21JRChpZCk7XG4gICAgaXRlbUJ5S2V5W2tleV0gPSBpdGVtO1xuICB9O1xuICBnZXRJdGVtID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGtleSA9IGdldEtleUZyb21JRChpZCk7XG4gICAgcmV0dXJuIGl0ZW1CeUtleVtrZXldO1xuICB9O1xuICByZW1vdmVJdGVtID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGtleSA9IGdldEtleUZyb21JRChpZCk7XG4gICAgZGVsZXRlIGl0ZW1CeUtleVtrZXldO1xuICB9O1xuICBnZXRJdGVtSURzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhpdGVtQnlLZXkpLm1hcChnZXRJREZyb21LZXkpO1xuICB9O1xuXG4gIGFkZFJvb3QgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIga2V5ID0gZ2V0S2V5RnJvbUlEKGlkKTtcbiAgICByb290QnlLZXlba2V5XSA9IHRydWU7XG4gIH07XG4gIHJlbW92ZVJvb3QgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIga2V5ID0gZ2V0S2V5RnJvbUlEKGlkKTtcbiAgICBkZWxldGUgcm9vdEJ5S2V5W2tleV07XG4gIH07XG4gIGdldFJvb3RJRHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJvb3RCeUtleSkubWFwKGdldElERnJvbUtleSk7XG4gIH07XG59XG5cbnZhciB1bm1vdW50ZWRJRHMgPSBbXTtcblxuZnVuY3Rpb24gcHVyZ2VEZWVwKGlkKSB7XG4gIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gIGlmIChpdGVtKSB7XG4gICAgdmFyIGNoaWxkSURzID0gaXRlbS5jaGlsZElEcztcblxuICAgIHJlbW92ZUl0ZW0oaWQpO1xuICAgIGNoaWxkSURzLmZvckVhY2gocHVyZ2VEZWVwKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXNjcmliZUNvbXBvbmVudEZyYW1lKG5hbWUsIHNvdXJjZSwgb3duZXJOYW1lKSB7XG4gIHJldHVybiAnXFxuICAgIGluICcgKyAobmFtZSB8fCAnVW5rbm93bicpICsgKHNvdXJjZSA/ICcgKGF0ICcgKyBzb3VyY2UuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXFxcXC9dLywgJycpICsgJzonICsgc291cmNlLmxpbmVOdW1iZXIgKyAnKScgOiBvd25lck5hbWUgPyAnIChjcmVhdGVkIGJ5ICcgKyBvd25lck5hbWUgKyAnKScgOiAnJyk7XG59XG5cbmZ1bmN0aW9uIGdldERpc3BsYXlOYW1lKGVsZW1lbnQpIHtcbiAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybiAnI2VtcHR5JztcbiAgfSBlbHNlIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGVsZW1lbnQgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuICcjdGV4dCc7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQudHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZWxlbWVudC50eXBlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBlbGVtZW50LnR5cGUuZGlzcGxheU5hbWUgfHwgZWxlbWVudC50eXBlLm5hbWUgfHwgJ1Vua25vd24nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlSUQoaWQpIHtcbiAgdmFyIG5hbWUgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldERpc3BsYXlOYW1lKGlkKTtcbiAgdmFyIGVsZW1lbnQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEVsZW1lbnQoaWQpO1xuICB2YXIgb3duZXJJRCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0T3duZXJJRChpZCk7XG4gIHZhciBvd25lck5hbWU7XG4gIGlmIChvd25lcklEKSB7XG4gICAgb3duZXJOYW1lID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXREaXNwbGF5TmFtZShvd25lcklEKTtcbiAgfVxuICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZWxlbWVudCwgJ1JlYWN0Q29tcG9uZW50VHJlZUhvb2s6IE1pc3NpbmcgUmVhY3QgZWxlbWVudCBmb3IgZGVidWdJRCAlcyB3aGVuICcgKyAnYnVpbGRpbmcgc3RhY2snLCBpZCkgOiB2b2lkIDA7XG4gIHJldHVybiBkZXNjcmliZUNvbXBvbmVudEZyYW1lKG5hbWUsIGVsZW1lbnQgJiYgZWxlbWVudC5fc291cmNlLCBvd25lck5hbWUpO1xufVxuXG52YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vayA9IHtcbiAgb25TZXRDaGlsZHJlbjogZnVuY3Rpb24gKGlkLCBuZXh0Q2hpbGRJRHMpIHtcbiAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICAgICFpdGVtID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdJdGVtIG11c3QgaGF2ZSBiZWVuIHNldCcpIDogX3Byb2RJbnZhcmlhbnQoJzE0NCcpIDogdm9pZCAwO1xuICAgIGl0ZW0uY2hpbGRJRHMgPSBuZXh0Q2hpbGRJRHM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5leHRDaGlsZElEcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG5leHRDaGlsZElEID0gbmV4dENoaWxkSURzW2ldO1xuICAgICAgdmFyIG5leHRDaGlsZCA9IGdldEl0ZW0obmV4dENoaWxkSUQpO1xuICAgICAgIW5leHRDaGlsZCA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgaG9vayBldmVudHMgdG8gZmlyZSBmb3IgdGhlIGNoaWxkIGJlZm9yZSBpdHMgcGFyZW50IGluY2x1ZGVzIGl0IGluIG9uU2V0Q2hpbGRyZW4oKS4nKSA6IF9wcm9kSW52YXJpYW50KCcxNDAnKSA6IHZvaWQgMDtcbiAgICAgICEobmV4dENoaWxkLmNoaWxkSURzICE9IG51bGwgfHwgdHlwZW9mIG5leHRDaGlsZC5lbGVtZW50ICE9PSAnb2JqZWN0JyB8fCBuZXh0Q2hpbGQuZWxlbWVudCA9PSBudWxsKSA/IFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gaW52YXJpYW50KGZhbHNlLCAnRXhwZWN0ZWQgb25TZXRDaGlsZHJlbigpIHRvIGZpcmUgZm9yIGEgY29udGFpbmVyIGNoaWxkIGJlZm9yZSBpdHMgcGFyZW50IGluY2x1ZGVzIGl0IGluIG9uU2V0Q2hpbGRyZW4oKS4nKSA6IF9wcm9kSW52YXJpYW50KCcxNDEnKSA6IHZvaWQgMDtcbiAgICAgICFuZXh0Q2hpbGQuaXNNb3VudGVkID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBvbk1vdW50Q29tcG9uZW50KCkgdG8gZmlyZSBmb3IgdGhlIGNoaWxkIGJlZm9yZSBpdHMgcGFyZW50IGluY2x1ZGVzIGl0IGluIG9uU2V0Q2hpbGRyZW4oKS4nKSA6IF9wcm9kSW52YXJpYW50KCc3MScpIDogdm9pZCAwO1xuICAgICAgaWYgKG5leHRDaGlsZC5wYXJlbnRJRCA9PSBudWxsKSB7XG4gICAgICAgIG5leHRDaGlsZC5wYXJlbnRJRCA9IGlkO1xuICAgICAgICAvLyBUT0RPOiBUaGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgYnV0IG1vdW50aW5nIGEgbmV3IHJvb3QgZHVyaW5nIGluXG4gICAgICAgIC8vIGNvbXBvbmVudFdpbGxNb3VudCBjdXJyZW50bHkgY2F1c2VzIG5vdC15ZXQtbW91bnRlZCBjb21wb25lbnRzIHRvXG4gICAgICAgIC8vIGJlIHB1cmdlZCBmcm9tIG91ciB0cmVlIGRhdGEgc28gdGhlaXIgcGFyZW50IGlkIGlzIG1pc3NpbmcuXG4gICAgICB9XG4gICAgICAhKG5leHRDaGlsZC5wYXJlbnRJRCA9PT0gaWQpID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdFeHBlY3RlZCBvbkJlZm9yZU1vdW50Q29tcG9uZW50KCkgcGFyZW50IGFuZCBvblNldENoaWxkcmVuKCkgdG8gYmUgY29uc2lzdGVudCAoJXMgaGFzIHBhcmVudHMgJXMgYW5kICVzKS4nLCBuZXh0Q2hpbGRJRCwgbmV4dENoaWxkLnBhcmVudElELCBpZCkgOiBfcHJvZEludmFyaWFudCgnMTQyJywgbmV4dENoaWxkSUQsIG5leHRDaGlsZC5wYXJlbnRJRCwgaWQpIDogdm9pZCAwO1xuICAgIH1cbiAgfSxcbiAgb25CZWZvcmVNb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGlkLCBlbGVtZW50LCBwYXJlbnRJRCkge1xuICAgIHZhciBpdGVtID0ge1xuICAgICAgZWxlbWVudDogZWxlbWVudCxcbiAgICAgIHBhcmVudElEOiBwYXJlbnRJRCxcbiAgICAgIHRleHQ6IG51bGwsXG4gICAgICBjaGlsZElEczogW10sXG4gICAgICBpc01vdW50ZWQ6IGZhbHNlLFxuICAgICAgdXBkYXRlQ291bnQ6IDBcbiAgICB9O1xuICAgIHNldEl0ZW0oaWQsIGl0ZW0pO1xuICB9LFxuICBvbkJlZm9yZVVwZGF0ZUNvbXBvbmVudDogZnVuY3Rpb24gKGlkLCBlbGVtZW50KSB7XG4gICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTtcbiAgICBpZiAoIWl0ZW0gfHwgIWl0ZW0uaXNNb3VudGVkKSB7XG4gICAgICAvLyBXZSBtYXkgZW5kIHVwIGhlcmUgYXMgYSByZXN1bHQgb2Ygc2V0U3RhdGUoKSBpbiBjb21wb25lbnRXaWxsVW5tb3VudCgpLlxuICAgICAgLy8gSW4gdGhpcyBjYXNlLCBpZ25vcmUgdGhlIGVsZW1lbnQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGl0ZW0uZWxlbWVudCA9IGVsZW1lbnQ7XG4gIH0sXG4gIG9uTW91bnRDb21wb25lbnQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gICAgIWl0ZW0gPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ0l0ZW0gbXVzdCBoYXZlIGJlZW4gc2V0JykgOiBfcHJvZEludmFyaWFudCgnMTQ0JykgOiB2b2lkIDA7XG4gICAgaXRlbS5pc01vdW50ZWQgPSB0cnVlO1xuICAgIHZhciBpc1Jvb3QgPSBpdGVtLnBhcmVudElEID09PSAwO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIGFkZFJvb3QoaWQpO1xuICAgIH1cbiAgfSxcbiAgb25VcGRhdGVDb21wb25lbnQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gICAgaWYgKCFpdGVtIHx8ICFpdGVtLmlzTW91bnRlZCkge1xuICAgICAgLy8gV2UgbWF5IGVuZCB1cCBoZXJlIGFzIGEgcmVzdWx0IG9mIHNldFN0YXRlKCkgaW4gY29tcG9uZW50V2lsbFVubW91bnQoKS5cbiAgICAgIC8vIEluIHRoaXMgY2FzZSwgaWdub3JlIHRoZSBlbGVtZW50LlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpdGVtLnVwZGF0ZUNvdW50Kys7XG4gIH0sXG4gIG9uVW5tb3VudENvbXBvbmVudDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTtcbiAgICBpZiAoaXRlbSkge1xuICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayBpZiBpdCBleGlzdHMuXG4gICAgICAvLyBgaXRlbWAgbWlnaHQgbm90IGV4aXN0IGlmIGl0IGlzIGluc2lkZSBhbiBlcnJvciBib3VuZGFyeSwgYW5kIGEgc2libGluZ1xuICAgICAgLy8gZXJyb3IgYm91bmRhcnkgY2hpbGQgdGhyZXcgd2hpbGUgbW91bnRpbmcuIFRoZW4gdGhpcyBpbnN0YW5jZSBuZXZlclxuICAgICAgLy8gZ290IGEgY2hhbmNlIHRvIG1vdW50LCBidXQgaXQgc3RpbGwgZ2V0cyBhbiB1bm1vdW50aW5nIGV2ZW50IGR1cmluZ1xuICAgICAgLy8gdGhlIGVycm9yIGJvdW5kYXJ5IGNsZWFudXAuXG4gICAgICBpdGVtLmlzTW91bnRlZCA9IGZhbHNlO1xuICAgICAgdmFyIGlzUm9vdCA9IGl0ZW0ucGFyZW50SUQgPT09IDA7XG4gICAgICBpZiAoaXNSb290KSB7XG4gICAgICAgIHJlbW92ZVJvb3QoaWQpO1xuICAgICAgfVxuICAgIH1cbiAgICB1bm1vdW50ZWRJRHMucHVzaChpZCk7XG4gIH0sXG4gIHB1cmdlVW5tb3VudGVkQ29tcG9uZW50czogZnVuY3Rpb24gKCkge1xuICAgIGlmIChSZWFjdENvbXBvbmVudFRyZWVIb29rLl9wcmV2ZW50UHVyZ2luZykge1xuICAgICAgLy8gU2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgdGVzdGluZy5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHVubW91bnRlZElEcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGlkID0gdW5tb3VudGVkSURzW2ldO1xuICAgICAgcHVyZ2VEZWVwKGlkKTtcbiAgICB9XG4gICAgdW5tb3VudGVkSURzLmxlbmd0aCA9IDA7XG4gIH0sXG4gIGlzTW91bnRlZDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTtcbiAgICByZXR1cm4gaXRlbSA/IGl0ZW0uaXNNb3VudGVkIDogZmFsc2U7XG4gIH0sXG4gIGdldEN1cnJlbnRTdGFja0FkZGVuZHVtOiBmdW5jdGlvbiAodG9wRWxlbWVudCkge1xuICAgIHZhciBpbmZvID0gJyc7XG4gICAgaWYgKHRvcEVsZW1lbnQpIHtcbiAgICAgIHZhciBuYW1lID0gZ2V0RGlzcGxheU5hbWUodG9wRWxlbWVudCk7XG4gICAgICB2YXIgb3duZXIgPSB0b3BFbGVtZW50Ll9vd25lcjtcbiAgICAgIGluZm8gKz0gZGVzY3JpYmVDb21wb25lbnRGcmFtZShuYW1lLCB0b3BFbGVtZW50Ll9zb3VyY2UsIG93bmVyICYmIG93bmVyLmdldE5hbWUoKSk7XG4gICAgfVxuXG4gICAgdmFyIGN1cnJlbnRPd25lciA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQ7XG4gICAgdmFyIGlkID0gY3VycmVudE93bmVyICYmIGN1cnJlbnRPd25lci5fZGVidWdJRDtcblxuICAgIGluZm8gKz0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRTdGFja0FkZGVuZHVtQnlJRChpZCk7XG4gICAgcmV0dXJuIGluZm87XG4gIH0sXG4gIGdldFN0YWNrQWRkZW5kdW1CeUlEOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaW5mbyA9ICcnO1xuICAgIHdoaWxlIChpZCkge1xuICAgICAgaW5mbyArPSBkZXNjcmliZUlEKGlkKTtcbiAgICAgIGlkID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRQYXJlbnRJRChpZCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9LFxuICBnZXRDaGlsZElEczogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGl0ZW0gPSBnZXRJdGVtKGlkKTtcbiAgICByZXR1cm4gaXRlbSA/IGl0ZW0uY2hpbGRJRHMgOiBbXTtcbiAgfSxcbiAgZ2V0RGlzcGxheU5hbWU6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBlbGVtZW50ID0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRFbGVtZW50KGlkKTtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZ2V0RGlzcGxheU5hbWUoZWxlbWVudCk7XG4gIH0sXG4gIGdldEVsZW1lbnQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gICAgcmV0dXJuIGl0ZW0gPyBpdGVtLmVsZW1lbnQgOiBudWxsO1xuICB9LFxuICBnZXRPd25lcklEOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgZWxlbWVudCA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0RWxlbWVudChpZCk7XG4gICAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50Ll9vd25lcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50Ll9vd25lci5fZGVidWdJRDtcbiAgfSxcbiAgZ2V0UGFyZW50SUQ6IGZ1bmN0aW9uIChpZCkge1xuICAgIHZhciBpdGVtID0gZ2V0SXRlbShpZCk7XG4gICAgcmV0dXJuIGl0ZW0gPyBpdGVtLnBhcmVudElEIDogbnVsbDtcbiAgfSxcbiAgZ2V0U291cmNlOiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICAgIHZhciBlbGVtZW50ID0gaXRlbSA/IGl0ZW0uZWxlbWVudCA6IG51bGw7XG4gICAgdmFyIHNvdXJjZSA9IGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQuX3NvdXJjZSA6IG51bGw7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfSxcbiAgZ2V0VGV4dDogZnVuY3Rpb24gKGlkKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEVsZW1lbnQoaWQpO1xuICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVsZW1lbnQgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gJycgKyBlbGVtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH0sXG4gIGdldFVwZGF0ZUNvdW50OiBmdW5jdGlvbiAoaWQpIHtcbiAgICB2YXIgaXRlbSA9IGdldEl0ZW0oaWQpO1xuICAgIHJldHVybiBpdGVtID8gaXRlbS51cGRhdGVDb3VudCA6IDA7XG4gIH0sXG5cblxuICBnZXRSb290SURzOiBnZXRSb290SURzLFxuICBnZXRSZWdpc3RlcmVkSURzOiBnZXRJdGVtSURzXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2s7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IG93bmVyLlxuICpcbiAqIFRoZSBjdXJyZW50IG93bmVyIGlzIHRoZSBjb21wb25lbnQgd2hvIHNob3VsZCBvd24gYW55IGNvbXBvbmVudHMgdGhhdCBhcmVcbiAqIGN1cnJlbnRseSBiZWluZyBjb25zdHJ1Y3RlZC5cbiAqL1xudmFyIFJlYWN0Q3VycmVudE93bmVyID0ge1xuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogQHR5cGUge1JlYWN0Q29tcG9uZW50fVxuICAgKi9cbiAgY3VycmVudDogbnVsbFxuXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0Q3VycmVudE93bmVyOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdEVsZW1lbnQgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudCcpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGZhY3RvcnkgdGhhdCBjcmVhdGVzIEhUTUwgdGFnIGVsZW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbnZhciBjcmVhdGVET01GYWN0b3J5ID0gUmVhY3RFbGVtZW50LmNyZWF0ZUZhY3Rvcnk7XG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgdmFyIFJlYWN0RWxlbWVudFZhbGlkYXRvciA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50VmFsaWRhdG9yJyk7XG4gIGNyZWF0ZURPTUZhY3RvcnkgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3IuY3JlYXRlRmFjdG9yeTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWFwcGluZyBmcm9tIHN1cHBvcnRlZCBIVE1MIHRhZ3MgdG8gYFJlYWN0RE9NQ29tcG9uZW50YCBjbGFzc2VzLlxuICogVGhpcyBpcyBhbHNvIGFjY2Vzc2libGUgdmlhIGBSZWFjdC5ET01gLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xudmFyIFJlYWN0RE9NRmFjdG9yaWVzID0ge1xuICBhOiBjcmVhdGVET01GYWN0b3J5KCdhJyksXG4gIGFiYnI6IGNyZWF0ZURPTUZhY3RvcnkoJ2FiYnInKSxcbiAgYWRkcmVzczogY3JlYXRlRE9NRmFjdG9yeSgnYWRkcmVzcycpLFxuICBhcmVhOiBjcmVhdGVET01GYWN0b3J5KCdhcmVhJyksXG4gIGFydGljbGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2FydGljbGUnKSxcbiAgYXNpZGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2FzaWRlJyksXG4gIGF1ZGlvOiBjcmVhdGVET01GYWN0b3J5KCdhdWRpbycpLFxuICBiOiBjcmVhdGVET01GYWN0b3J5KCdiJyksXG4gIGJhc2U6IGNyZWF0ZURPTUZhY3RvcnkoJ2Jhc2UnKSxcbiAgYmRpOiBjcmVhdGVET01GYWN0b3J5KCdiZGknKSxcbiAgYmRvOiBjcmVhdGVET01GYWN0b3J5KCdiZG8nKSxcbiAgYmlnOiBjcmVhdGVET01GYWN0b3J5KCdiaWcnKSxcbiAgYmxvY2txdW90ZTogY3JlYXRlRE9NRmFjdG9yeSgnYmxvY2txdW90ZScpLFxuICBib2R5OiBjcmVhdGVET01GYWN0b3J5KCdib2R5JyksXG4gIGJyOiBjcmVhdGVET01GYWN0b3J5KCdicicpLFxuICBidXR0b246IGNyZWF0ZURPTUZhY3RvcnkoJ2J1dHRvbicpLFxuICBjYW52YXM6IGNyZWF0ZURPTUZhY3RvcnkoJ2NhbnZhcycpLFxuICBjYXB0aW9uOiBjcmVhdGVET01GYWN0b3J5KCdjYXB0aW9uJyksXG4gIGNpdGU6IGNyZWF0ZURPTUZhY3RvcnkoJ2NpdGUnKSxcbiAgY29kZTogY3JlYXRlRE9NRmFjdG9yeSgnY29kZScpLFxuICBjb2w6IGNyZWF0ZURPTUZhY3RvcnkoJ2NvbCcpLFxuICBjb2xncm91cDogY3JlYXRlRE9NRmFjdG9yeSgnY29sZ3JvdXAnKSxcbiAgZGF0YTogY3JlYXRlRE9NRmFjdG9yeSgnZGF0YScpLFxuICBkYXRhbGlzdDogY3JlYXRlRE9NRmFjdG9yeSgnZGF0YWxpc3QnKSxcbiAgZGQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2RkJyksXG4gIGRlbDogY3JlYXRlRE9NRmFjdG9yeSgnZGVsJyksXG4gIGRldGFpbHM6IGNyZWF0ZURPTUZhY3RvcnkoJ2RldGFpbHMnKSxcbiAgZGZuOiBjcmVhdGVET01GYWN0b3J5KCdkZm4nKSxcbiAgZGlhbG9nOiBjcmVhdGVET01GYWN0b3J5KCdkaWFsb2cnKSxcbiAgZGl2OiBjcmVhdGVET01GYWN0b3J5KCdkaXYnKSxcbiAgZGw6IGNyZWF0ZURPTUZhY3RvcnkoJ2RsJyksXG4gIGR0OiBjcmVhdGVET01GYWN0b3J5KCdkdCcpLFxuICBlbTogY3JlYXRlRE9NRmFjdG9yeSgnZW0nKSxcbiAgZW1iZWQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2VtYmVkJyksXG4gIGZpZWxkc2V0OiBjcmVhdGVET01GYWN0b3J5KCdmaWVsZHNldCcpLFxuICBmaWdjYXB0aW9uOiBjcmVhdGVET01GYWN0b3J5KCdmaWdjYXB0aW9uJyksXG4gIGZpZ3VyZTogY3JlYXRlRE9NRmFjdG9yeSgnZmlndXJlJyksXG4gIGZvb3RlcjogY3JlYXRlRE9NRmFjdG9yeSgnZm9vdGVyJyksXG4gIGZvcm06IGNyZWF0ZURPTUZhY3RvcnkoJ2Zvcm0nKSxcbiAgaDE6IGNyZWF0ZURPTUZhY3RvcnkoJ2gxJyksXG4gIGgyOiBjcmVhdGVET01GYWN0b3J5KCdoMicpLFxuICBoMzogY3JlYXRlRE9NRmFjdG9yeSgnaDMnKSxcbiAgaDQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2g0JyksXG4gIGg1OiBjcmVhdGVET01GYWN0b3J5KCdoNScpLFxuICBoNjogY3JlYXRlRE9NRmFjdG9yeSgnaDYnKSxcbiAgaGVhZDogY3JlYXRlRE9NRmFjdG9yeSgnaGVhZCcpLFxuICBoZWFkZXI6IGNyZWF0ZURPTUZhY3RvcnkoJ2hlYWRlcicpLFxuICBoZ3JvdXA6IGNyZWF0ZURPTUZhY3RvcnkoJ2hncm91cCcpLFxuICBocjogY3JlYXRlRE9NRmFjdG9yeSgnaHInKSxcbiAgaHRtbDogY3JlYXRlRE9NRmFjdG9yeSgnaHRtbCcpLFxuICBpOiBjcmVhdGVET01GYWN0b3J5KCdpJyksXG4gIGlmcmFtZTogY3JlYXRlRE9NRmFjdG9yeSgnaWZyYW1lJyksXG4gIGltZzogY3JlYXRlRE9NRmFjdG9yeSgnaW1nJyksXG4gIGlucHV0OiBjcmVhdGVET01GYWN0b3J5KCdpbnB1dCcpLFxuICBpbnM6IGNyZWF0ZURPTUZhY3RvcnkoJ2lucycpLFxuICBrYmQ6IGNyZWF0ZURPTUZhY3RvcnkoJ2tiZCcpLFxuICBrZXlnZW46IGNyZWF0ZURPTUZhY3RvcnkoJ2tleWdlbicpLFxuICBsYWJlbDogY3JlYXRlRE9NRmFjdG9yeSgnbGFiZWwnKSxcbiAgbGVnZW5kOiBjcmVhdGVET01GYWN0b3J5KCdsZWdlbmQnKSxcbiAgbGk6IGNyZWF0ZURPTUZhY3RvcnkoJ2xpJyksXG4gIGxpbms6IGNyZWF0ZURPTUZhY3RvcnkoJ2xpbmsnKSxcbiAgbWFpbjogY3JlYXRlRE9NRmFjdG9yeSgnbWFpbicpLFxuICBtYXA6IGNyZWF0ZURPTUZhY3RvcnkoJ21hcCcpLFxuICBtYXJrOiBjcmVhdGVET01GYWN0b3J5KCdtYXJrJyksXG4gIG1lbnU6IGNyZWF0ZURPTUZhY3RvcnkoJ21lbnUnKSxcbiAgbWVudWl0ZW06IGNyZWF0ZURPTUZhY3RvcnkoJ21lbnVpdGVtJyksXG4gIG1ldGE6IGNyZWF0ZURPTUZhY3RvcnkoJ21ldGEnKSxcbiAgbWV0ZXI6IGNyZWF0ZURPTUZhY3RvcnkoJ21ldGVyJyksXG4gIG5hdjogY3JlYXRlRE9NRmFjdG9yeSgnbmF2JyksXG4gIG5vc2NyaXB0OiBjcmVhdGVET01GYWN0b3J5KCdub3NjcmlwdCcpLFxuICBvYmplY3Q6IGNyZWF0ZURPTUZhY3RvcnkoJ29iamVjdCcpLFxuICBvbDogY3JlYXRlRE9NRmFjdG9yeSgnb2wnKSxcbiAgb3B0Z3JvdXA6IGNyZWF0ZURPTUZhY3RvcnkoJ29wdGdyb3VwJyksXG4gIG9wdGlvbjogY3JlYXRlRE9NRmFjdG9yeSgnb3B0aW9uJyksXG4gIG91dHB1dDogY3JlYXRlRE9NRmFjdG9yeSgnb3V0cHV0JyksXG4gIHA6IGNyZWF0ZURPTUZhY3RvcnkoJ3AnKSxcbiAgcGFyYW06IGNyZWF0ZURPTUZhY3RvcnkoJ3BhcmFtJyksXG4gIHBpY3R1cmU6IGNyZWF0ZURPTUZhY3RvcnkoJ3BpY3R1cmUnKSxcbiAgcHJlOiBjcmVhdGVET01GYWN0b3J5KCdwcmUnKSxcbiAgcHJvZ3Jlc3M6IGNyZWF0ZURPTUZhY3RvcnkoJ3Byb2dyZXNzJyksXG4gIHE6IGNyZWF0ZURPTUZhY3RvcnkoJ3EnKSxcbiAgcnA6IGNyZWF0ZURPTUZhY3RvcnkoJ3JwJyksXG4gIHJ0OiBjcmVhdGVET01GYWN0b3J5KCdydCcpLFxuICBydWJ5OiBjcmVhdGVET01GYWN0b3J5KCdydWJ5JyksXG4gIHM6IGNyZWF0ZURPTUZhY3RvcnkoJ3MnKSxcbiAgc2FtcDogY3JlYXRlRE9NRmFjdG9yeSgnc2FtcCcpLFxuICBzY3JpcHQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3NjcmlwdCcpLFxuICBzZWN0aW9uOiBjcmVhdGVET01GYWN0b3J5KCdzZWN0aW9uJyksXG4gIHNlbGVjdDogY3JlYXRlRE9NRmFjdG9yeSgnc2VsZWN0JyksXG4gIHNtYWxsOiBjcmVhdGVET01GYWN0b3J5KCdzbWFsbCcpLFxuICBzb3VyY2U6IGNyZWF0ZURPTUZhY3RvcnkoJ3NvdXJjZScpLFxuICBzcGFuOiBjcmVhdGVET01GYWN0b3J5KCdzcGFuJyksXG4gIHN0cm9uZzogY3JlYXRlRE9NRmFjdG9yeSgnc3Ryb25nJyksXG4gIHN0eWxlOiBjcmVhdGVET01GYWN0b3J5KCdzdHlsZScpLFxuICBzdWI6IGNyZWF0ZURPTUZhY3RvcnkoJ3N1YicpLFxuICBzdW1tYXJ5OiBjcmVhdGVET01GYWN0b3J5KCdzdW1tYXJ5JyksXG4gIHN1cDogY3JlYXRlRE9NRmFjdG9yeSgnc3VwJyksXG4gIHRhYmxlOiBjcmVhdGVET01GYWN0b3J5KCd0YWJsZScpLFxuICB0Ym9keTogY3JlYXRlRE9NRmFjdG9yeSgndGJvZHknKSxcbiAgdGQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3RkJyksXG4gIHRleHRhcmVhOiBjcmVhdGVET01GYWN0b3J5KCd0ZXh0YXJlYScpLFxuICB0Zm9vdDogY3JlYXRlRE9NRmFjdG9yeSgndGZvb3QnKSxcbiAgdGg6IGNyZWF0ZURPTUZhY3RvcnkoJ3RoJyksXG4gIHRoZWFkOiBjcmVhdGVET01GYWN0b3J5KCd0aGVhZCcpLFxuICB0aW1lOiBjcmVhdGVET01GYWN0b3J5KCd0aW1lJyksXG4gIHRpdGxlOiBjcmVhdGVET01GYWN0b3J5KCd0aXRsZScpLFxuICB0cjogY3JlYXRlRE9NRmFjdG9yeSgndHInKSxcbiAgdHJhY2s6IGNyZWF0ZURPTUZhY3RvcnkoJ3RyYWNrJyksXG4gIHU6IGNyZWF0ZURPTUZhY3RvcnkoJ3UnKSxcbiAgdWw6IGNyZWF0ZURPTUZhY3RvcnkoJ3VsJyksXG4gICd2YXInOiBjcmVhdGVET01GYWN0b3J5KCd2YXInKSxcbiAgdmlkZW86IGNyZWF0ZURPTUZhY3RvcnkoJ3ZpZGVvJyksXG4gIHdicjogY3JlYXRlRE9NRmFjdG9yeSgnd2JyJyksXG5cbiAgLy8gU1ZHXG4gIGNpcmNsZTogY3JlYXRlRE9NRmFjdG9yeSgnY2lyY2xlJyksXG4gIGNsaXBQYXRoOiBjcmVhdGVET01GYWN0b3J5KCdjbGlwUGF0aCcpLFxuICBkZWZzOiBjcmVhdGVET01GYWN0b3J5KCdkZWZzJyksXG4gIGVsbGlwc2U6IGNyZWF0ZURPTUZhY3RvcnkoJ2VsbGlwc2UnKSxcbiAgZzogY3JlYXRlRE9NRmFjdG9yeSgnZycpLFxuICBpbWFnZTogY3JlYXRlRE9NRmFjdG9yeSgnaW1hZ2UnKSxcbiAgbGluZTogY3JlYXRlRE9NRmFjdG9yeSgnbGluZScpLFxuICBsaW5lYXJHcmFkaWVudDogY3JlYXRlRE9NRmFjdG9yeSgnbGluZWFyR3JhZGllbnQnKSxcbiAgbWFzazogY3JlYXRlRE9NRmFjdG9yeSgnbWFzaycpLFxuICBwYXRoOiBjcmVhdGVET01GYWN0b3J5KCdwYXRoJyksXG4gIHBhdHRlcm46IGNyZWF0ZURPTUZhY3RvcnkoJ3BhdHRlcm4nKSxcbiAgcG9seWdvbjogY3JlYXRlRE9NRmFjdG9yeSgncG9seWdvbicpLFxuICBwb2x5bGluZTogY3JlYXRlRE9NRmFjdG9yeSgncG9seWxpbmUnKSxcbiAgcmFkaWFsR3JhZGllbnQ6IGNyZWF0ZURPTUZhY3RvcnkoJ3JhZGlhbEdyYWRpZW50JyksXG4gIHJlY3Q6IGNyZWF0ZURPTUZhY3RvcnkoJ3JlY3QnKSxcbiAgc3RvcDogY3JlYXRlRE9NRmFjdG9yeSgnc3RvcCcpLFxuICBzdmc6IGNyZWF0ZURPTUZhY3RvcnkoJ3N2ZycpLFxuICB0ZXh0OiBjcmVhdGVET01GYWN0b3J5KCd0ZXh0JyksXG4gIHRzcGFuOiBjcmVhdGVET01GYWN0b3J5KCd0c3BhbicpXG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IFJlYWN0RE9NRmFjdG9yaWVzOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSByZXF1aXJlKCcuL1JlYWN0Q3VycmVudE93bmVyJyk7XG5cbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xudmFyIGNhbkRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9jYW5EZWZpbmVQcm9wZXJ0eScpO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHJlcXVpcmUoJy4vUmVhY3RFbGVtZW50U3ltYm9sJyk7XG5cbnZhciBSRVNFUlZFRF9QUk9QUyA9IHtcbiAga2V5OiB0cnVlLFxuICByZWY6IHRydWUsXG4gIF9fc2VsZjogdHJ1ZSxcbiAgX19zb3VyY2U6IHRydWVcbn07XG5cbnZhciBzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biwgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd247XG5cbmZ1bmN0aW9uIGhhc1ZhbGlkUmVmKGNvbmZpZykge1xuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsICdyZWYnKSkge1xuICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCAncmVmJykuZ2V0O1xuICAgICAgaWYgKGdldHRlciAmJiBnZXR0ZXIuaXNSZWFjdFdhcm5pbmcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY29uZmlnLnJlZiAhPT0gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBoYXNWYWxpZEtleShjb25maWcpIHtcbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCAna2V5JykpIHtcbiAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgJ2tleScpLmdldDtcbiAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbmZpZy5rZXkgIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93bikge1xuICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gPSB0cnVlO1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXM6IGBrZXlgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL2ZiLm1lL3JlYWN0LXNwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpIDogdm9pZCAwO1xuICAgIH1cbiAgfTtcbiAgd2FybkFib3V0QWNjZXNzaW5nS2V5LmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAna2V5Jywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nS2V5LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVmaW5lUmVmUHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciB3YXJuQWJvdXRBY2Nlc3NpbmdSZWYgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFzcGVjaWFsUHJvcFJlZldhcm5pbmdTaG93bikge1xuICAgICAgc3BlY2lhbFByb3BSZWZXYXJuaW5nU2hvd24gPSB0cnVlO1xuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGZhbHNlLCAnJXM6IGByZWZgIGlzIG5vdCBhIHByb3AuIFRyeWluZyB0byBhY2Nlc3MgaXQgd2lsbCByZXN1bHQgJyArICdpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lICcgKyAndmFsdWUgd2l0aGluIHRoZSBjaGlsZCBjb21wb25lbnQsIHlvdSBzaG91bGQgcGFzcyBpdCBhcyBhIGRpZmZlcmVudCAnICsgJ3Byb3AuIChodHRwczovL2ZiLm1lL3JlYWN0LXNwZWNpYWwtcHJvcHMpJywgZGlzcGxheU5hbWUpIDogdm9pZCAwO1xuICAgIH1cbiAgfTtcbiAgd2FybkFib3V0QWNjZXNzaW5nUmVmLmlzUmVhY3RXYXJuaW5nID0gdHJ1ZTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3BzLCAncmVmJywge1xuICAgIGdldDogd2FybkFib3V0QWNjZXNzaW5nUmVmLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBuZXcgUmVhY3QgZWxlbWVudC4gVGhpcyBubyBsb25nZXIgYWRoZXJlcyB0b1xuICogdGhlIGNsYXNzIHBhdHRlcm4sIHNvIGRvIG5vdCB1c2UgbmV3IHRvIGNhbGwgaXQuIEFsc28sIG5vIGluc3RhbmNlb2YgY2hlY2tcbiAqIHdpbGwgd29yay4gSW5zdGVhZCB0ZXN0ICQkdHlwZW9mIGZpZWxkIGFnYWluc3QgU3ltYm9sLmZvcigncmVhY3QuZWxlbWVudCcpIHRvIGNoZWNrXG4gKiBpZiBzb21ldGhpbmcgaXMgYSBSZWFjdCBFbGVtZW50LlxuICpcbiAqIEBwYXJhbSB7Kn0gdHlwZVxuICogQHBhcmFtIHsqfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gcmVmXG4gKiBAcGFyYW0geyp9IHNlbGYgQSAqdGVtcG9yYXJ5KiBoZWxwZXIgdG8gZGV0ZWN0IHBsYWNlcyB3aGVyZSBgdGhpc2AgaXNcbiAqIGRpZmZlcmVudCBmcm9tIHRoZSBgb3duZXJgIHdoZW4gUmVhY3QuY3JlYXRlRWxlbWVudCBpcyBjYWxsZWQsIHNvIHRoYXQgd2VcbiAqIGNhbiB3YXJuLiBXZSB3YW50IHRvIGdldCByaWQgb2Ygb3duZXIgYW5kIHJlcGxhY2Ugc3RyaW5nIGByZWZgcyB3aXRoIGFycm93XG4gKiBmdW5jdGlvbnMsIGFuZCBhcyBsb25nIGFzIGB0aGlzYCBhbmQgb3duZXIgYXJlIHRoZSBzYW1lLCB0aGVyZSB3aWxsIGJlIG5vXG4gKiBjaGFuZ2UgaW4gYmVoYXZpb3IuXG4gKiBAcGFyYW0geyp9IHNvdXJjZSBBbiBhbm5vdGF0aW9uIG9iamVjdCAoYWRkZWQgYnkgYSB0cmFuc3BpbGVyIG9yIG90aGVyd2lzZSlcbiAqIGluZGljYXRpbmcgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBhbmQvb3Igb3RoZXIgaW5mb3JtYXRpb24uXG4gKiBAcGFyYW0geyp9IG93bmVyXG4gKiBAcGFyYW0geyp9IHByb3BzXG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIFJlYWN0RWxlbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgdmFyIGVsZW1lbnQgPSB7XG4gICAgLy8gVGhpcyB0YWcgYWxsb3cgdXMgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhpcyBhcyBhIFJlYWN0IEVsZW1lbnRcbiAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuXG4gICAgLy8gQnVpbHQtaW4gcHJvcGVydGllcyB0aGF0IGJlbG9uZyBvbiB0aGUgZWxlbWVudFxuICAgIHR5cGU6IHR5cGUsXG4gICAga2V5OiBrZXksXG4gICAgcmVmOiByZWYsXG4gICAgcHJvcHM6IHByb3BzLFxuXG4gICAgLy8gUmVjb3JkIHRoZSBjb21wb25lbnQgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoaXMgZWxlbWVudC5cbiAgICBfb3duZXI6IG93bmVyXG4gIH07XG5cbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgLy8gVGhlIHZhbGlkYXRpb24gZmxhZyBpcyBjdXJyZW50bHkgbXV0YXRpdmUuIFdlIHB1dCBpdCBvblxuICAgIC8vIGFuIGV4dGVybmFsIGJhY2tpbmcgc3RvcmUgc28gdGhhdCB3ZSBjYW4gZnJlZXplIHRoZSB3aG9sZSBvYmplY3QuXG4gICAgLy8gVGhpcyBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIFdlYWtNYXAgb25jZSB0aGV5IGFyZSBpbXBsZW1lbnRlZCBpblxuICAgIC8vIGNvbW1vbmx5IHVzZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzLlxuICAgIGVsZW1lbnQuX3N0b3JlID0ge307XG5cbiAgICAvLyBUbyBtYWtlIGNvbXBhcmluZyBSZWFjdEVsZW1lbnRzIGVhc2llciBmb3IgdGVzdGluZyBwdXJwb3Nlcywgd2UgbWFrZVxuICAgIC8vIHRoZSB2YWxpZGF0aW9uIGZsYWcgbm9uLWVudW1lcmFibGUgKHdoZXJlIHBvc3NpYmxlLCB3aGljaCBzaG91bGRcbiAgICAvLyBpbmNsdWRlIGV2ZXJ5IGVudmlyb25tZW50IHdlIHJ1biB0ZXN0cyBpbiksIHNvIHRoZSB0ZXN0IGZyYW1ld29ya1xuICAgIC8vIGlnbm9yZXMgaXQuXG4gICAgaWYgKGNhbkRlZmluZVByb3BlcnR5KSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWxlbWVudC5fc3RvcmUsICd2YWxpZGF0ZWQnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IGZhbHNlXG4gICAgICB9KTtcbiAgICAgIC8vIHNlbGYgYW5kIHNvdXJjZSBhcmUgREVWIG9ubHkgcHJvcGVydGllcy5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NlbGYnLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIHZhbHVlOiBzZWxmXG4gICAgICB9KTtcbiAgICAgIC8vIFR3byBlbGVtZW50cyBjcmVhdGVkIGluIHR3byBkaWZmZXJlbnQgcGxhY2VzIHNob3VsZCBiZSBjb25zaWRlcmVkXG4gICAgICAvLyBlcXVhbCBmb3IgdGVzdGluZyBwdXJwb3NlcyBhbmQgdGhlcmVmb3JlIHdlIGhpZGUgaXQgZnJvbSBlbnVtZXJhdGlvbi5cbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50LCAnX3NvdXJjZScsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgdmFsdWU6IHNvdXJjZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IGZhbHNlO1xuICAgICAgZWxlbWVudC5fc2VsZiA9IHNlbGY7XG4gICAgICBlbGVtZW50Ll9zb3VyY2UgPSBzb3VyY2U7XG4gICAgfVxuICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGVsZW1lbnQucHJvcHMpO1xuICAgICAgT2JqZWN0LmZyZWV6ZShlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgUmVhY3RFbGVtZW50IG9mIHRoZSBnaXZlbiB0eXBlLlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNyZWF0ZWVsZW1lbnRcbiAqL1xuUmVhY3RFbGVtZW50LmNyZWF0ZUVsZW1lbnQgPSBmdW5jdGlvbiAodHlwZSwgY29uZmlnLCBjaGlsZHJlbikge1xuICB2YXIgcHJvcE5hbWU7XG5cbiAgLy8gUmVzZXJ2ZWQgbmFtZXMgYXJlIGV4dHJhY3RlZFxuICB2YXIgcHJvcHMgPSB7fTtcblxuICB2YXIga2V5ID0gbnVsbDtcbiAgdmFyIHJlZiA9IG51bGw7XG4gIHZhciBzZWxmID0gbnVsbDtcbiAgdmFyIHNvdXJjZSA9IG51bGw7XG5cbiAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgaWYgKGhhc1ZhbGlkUmVmKGNvbmZpZykpIHtcbiAgICAgIHJlZiA9IGNvbmZpZy5yZWY7XG4gICAgfVxuICAgIGlmIChoYXNWYWxpZEtleShjb25maWcpKSB7XG4gICAgICBrZXkgPSAnJyArIGNvbmZpZy5rZXk7XG4gICAgfVxuXG4gICAgc2VsZiA9IGNvbmZpZy5fX3NlbGYgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBjb25maWcuX19zZWxmO1xuICAgIHNvdXJjZSA9IGNvbmZpZy5fX3NvdXJjZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGNvbmZpZy5fX3NvdXJjZTtcbiAgICAvLyBSZW1haW5pbmcgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gYSBuZXcgcHJvcHMgb2JqZWN0XG4gICAgZm9yIChwcm9wTmFtZSBpbiBjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpICYmICFSRVNFUlZFRF9QUk9QUy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcbiAgICAgICAgcHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChPYmplY3QuZnJlZXplKSB7XG4gICAgICAgIE9iamVjdC5mcmVlemUoY2hpbGRBcnJheSk7XG4gICAgICB9XG4gICAgfVxuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgfVxuXG4gIC8vIFJlc29sdmUgZGVmYXVsdCBwcm9wc1xuICBpZiAodHlwZSAmJiB0eXBlLmRlZmF1bHRQcm9wcykge1xuICAgIHZhciBkZWZhdWx0UHJvcHMgPSB0eXBlLmRlZmF1bHRQcm9wcztcbiAgICBmb3IgKHByb3BOYW1lIGluIGRlZmF1bHRQcm9wcykge1xuICAgICAgaWYgKHByb3BzW3Byb3BOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGRlZmF1bHRQcm9wc1twcm9wTmFtZV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGlmIChrZXkgfHwgcmVmKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BzLiQkdHlwZW9mID09PSAndW5kZWZpbmVkJyB8fCBwcm9wcy4kJHR5cGVvZiAhPT0gUkVBQ1RfRUxFTUVOVF9UWVBFKSB7XG4gICAgICAgIHZhciBkaXNwbGF5TmFtZSA9IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nID8gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgJ1Vua25vd24nIDogdHlwZTtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgIGRlZmluZVJlZlByb3BXYXJuaW5nR2V0dGVyKHByb3BzLCBkaXNwbGF5TmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFJlYWN0RWxlbWVudCh0eXBlLCBrZXksIHJlZiwgc2VsZiwgc291cmNlLCBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LCBwcm9wcyk7XG59O1xuXG4vKipcbiAqIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgUmVhY3RFbGVtZW50cyBvZiBhIGdpdmVuIHR5cGUuXG4gKiBTZWUgaHR0cHM6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy90b3AtbGV2ZWwtYXBpLmh0bWwjcmVhY3QuY3JlYXRlZmFjdG9yeVxuICovXG5SZWFjdEVsZW1lbnQuY3JlYXRlRmFjdG9yeSA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gIHZhciBmYWN0b3J5ID0gUmVhY3RFbGVtZW50LmNyZWF0ZUVsZW1lbnQuYmluZChudWxsLCB0eXBlKTtcbiAgLy8gRXhwb3NlIHRoZSB0eXBlIG9uIHRoZSBmYWN0b3J5IGFuZCB0aGUgcHJvdG90eXBlIHNvIHRoYXQgaXQgY2FuIGJlXG4gIC8vIGVhc2lseSBhY2Nlc3NlZCBvbiBlbGVtZW50cy4gRS5nLiBgPEZvbyAvPi50eXBlID09PSBGb29gLlxuICAvLyBUaGlzIHNob3VsZCBub3QgYmUgbmFtZWQgYGNvbnN0cnVjdG9yYCBzaW5jZSB0aGlzIG1heSBub3QgYmUgdGhlIGZ1bmN0aW9uXG4gIC8vIHRoYXQgY3JlYXRlZCB0aGUgZWxlbWVudCwgYW5kIGl0IG1heSBub3QgZXZlbiBiZSBhIGNvbnN0cnVjdG9yLlxuICAvLyBMZWdhY3kgaG9vayBUT0RPOiBXYXJuIGlmIHRoaXMgaXMgYWNjZXNzZWRcbiAgZmFjdG9yeS50eXBlID0gdHlwZTtcbiAgcmV0dXJuIGZhY3Rvcnk7XG59O1xuXG5SZWFjdEVsZW1lbnQuY2xvbmVBbmRSZXBsYWNlS2V5ID0gZnVuY3Rpb24gKG9sZEVsZW1lbnQsIG5ld0tleSkge1xuICB2YXIgbmV3RWxlbWVudCA9IFJlYWN0RWxlbWVudChvbGRFbGVtZW50LnR5cGUsIG5ld0tleSwgb2xkRWxlbWVudC5yZWYsIG9sZEVsZW1lbnQuX3NlbGYsIG9sZEVsZW1lbnQuX3NvdXJjZSwgb2xkRWxlbWVudC5fb3duZXIsIG9sZEVsZW1lbnQucHJvcHMpO1xuXG4gIHJldHVybiBuZXdFbGVtZW50O1xufTtcblxuLyoqXG4gKiBDbG9uZSBhbmQgcmV0dXJuIGEgbmV3IFJlYWN0RWxlbWVudCB1c2luZyBlbGVtZW50IGFzIHRoZSBzdGFydGluZyBwb2ludC5cbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5jbG9uZWVsZW1lbnRcbiAqL1xuUmVhY3RFbGVtZW50LmNsb25lRWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50LCBjb25maWcsIGNoaWxkcmVuKSB7XG4gIHZhciBwcm9wTmFtZTtcblxuICAvLyBPcmlnaW5hbCBwcm9wcyBhcmUgY29waWVkXG4gIHZhciBwcm9wcyA9IF9hc3NpZ24oe30sIGVsZW1lbnQucHJvcHMpO1xuXG4gIC8vIFJlc2VydmVkIG5hbWVzIGFyZSBleHRyYWN0ZWRcbiAgdmFyIGtleSA9IGVsZW1lbnQua2V5O1xuICB2YXIgcmVmID0gZWxlbWVudC5yZWY7XG4gIC8vIFNlbGYgaXMgcHJlc2VydmVkIHNpbmNlIHRoZSBvd25lciBpcyBwcmVzZXJ2ZWQuXG4gIHZhciBzZWxmID0gZWxlbWVudC5fc2VsZjtcbiAgLy8gU291cmNlIGlzIHByZXNlcnZlZCBzaW5jZSBjbG9uZUVsZW1lbnQgaXMgdW5saWtlbHkgdG8gYmUgdGFyZ2V0ZWQgYnkgYVxuICAvLyB0cmFuc3BpbGVyLCBhbmQgdGhlIG9yaWdpbmFsIHNvdXJjZSBpcyBwcm9iYWJseSBhIGJldHRlciBpbmRpY2F0b3Igb2YgdGhlXG4gIC8vIHRydWUgb3duZXIuXG4gIHZhciBzb3VyY2UgPSBlbGVtZW50Ll9zb3VyY2U7XG5cbiAgLy8gT3duZXIgd2lsbCBiZSBwcmVzZXJ2ZWQsIHVubGVzcyByZWYgaXMgb3ZlcnJpZGRlblxuICB2YXIgb3duZXIgPSBlbGVtZW50Ll9vd25lcjtcblxuICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICBpZiAoaGFzVmFsaWRSZWYoY29uZmlnKSkge1xuICAgICAgLy8gU2lsZW50bHkgc3RlYWwgdGhlIHJlZiBmcm9tIHRoZSBwYXJlbnQuXG4gICAgICByZWYgPSBjb25maWcucmVmO1xuICAgICAgb3duZXIgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50O1xuICAgIH1cbiAgICBpZiAoaGFzVmFsaWRLZXkoY29uZmlnKSkge1xuICAgICAga2V5ID0gJycgKyBjb25maWcua2V5O1xuICAgIH1cblxuICAgIC8vIFJlbWFpbmluZyBwcm9wZXJ0aWVzIG92ZXJyaWRlIGV4aXN0aW5nIHByb3BzXG4gICAgdmFyIGRlZmF1bHRQcm9wcztcbiAgICBpZiAoZWxlbWVudC50eXBlICYmIGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHMpIHtcbiAgICAgIGRlZmF1bHRQcm9wcyA9IGVsZW1lbnQudHlwZS5kZWZhdWx0UHJvcHM7XG4gICAgfVxuICAgIGZvciAocHJvcE5hbWUgaW4gY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJiAhUkVTRVJWRURfUFJPUFMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG4gICAgICAgIGlmIChjb25maWdbcHJvcE5hbWVdID09PSB1bmRlZmluZWQgJiYgZGVmYXVsdFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBSZXNvbHZlIGRlZmF1bHQgcHJvcHNcbiAgICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByb3BzW3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBDaGlsZHJlbiBjYW4gYmUgbW9yZSB0aGFuIG9uZSBhcmd1bWVudCwgYW5kIHRob3NlIGFyZSB0cmFuc2ZlcnJlZCBvbnRvXG4gIC8vIHRoZSBuZXdseSBhbGxvY2F0ZWQgcHJvcHMgb2JqZWN0LlxuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgaWYgKGNoaWxkcmVuTGVuZ3RoID09PSAxKSB7XG4gICAgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgfSBlbHNlIGlmIChjaGlsZHJlbkxlbmd0aCA+IDEpIHtcbiAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyBpKyspIHtcbiAgICAgIGNoaWxkQXJyYXlbaV0gPSBhcmd1bWVudHNbaSArIDJdO1xuICAgIH1cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH1cblxuICByZXR1cm4gUmVhY3RFbGVtZW50KGVsZW1lbnQudHlwZSwga2V5LCByZWYsIHNlbGYsIHNvdXJjZSwgb3duZXIsIHByb3BzKTtcbn07XG5cbi8qKlxuICogVmVyaWZpZXMgdGhlIG9iamVjdCBpcyBhIFJlYWN0RWxlbWVudC5cbiAqIFNlZSBodHRwczovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL3RvcC1sZXZlbC1hcGkuaHRtbCNyZWFjdC5pc3ZhbGlkZWxlbWVudFxuICogQHBhcmFtIHs/b2JqZWN0fSBvYmplY3RcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYG9iamVjdGAgaXMgYSB2YWxpZCBjb21wb25lbnQuXG4gKiBAZmluYWxcbiAqL1xuUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50ID0gZnVuY3Rpb24gKG9iamVjdCkge1xuICByZXR1cm4gdHlwZW9mIG9iamVjdCA9PT0gJ29iamVjdCcgJiYgb2JqZWN0ICE9PSBudWxsICYmIG9iamVjdC4kJHR5cGVvZiA9PT0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEVsZW1lbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbi8qKlxuICogUmVhY3RFbGVtZW50VmFsaWRhdG9yIHByb3ZpZGVzIGEgd3JhcHBlciBhcm91bmQgYSBlbGVtZW50IGZhY3RvcnlcbiAqIHdoaWNoIHZhbGlkYXRlcyB0aGUgcHJvcHMgcGFzc2VkIHRvIHRoZSBlbGVtZW50LiBUaGlzIGlzIGludGVuZGVkIHRvIGJlXG4gKiB1c2VkIG9ubHkgaW4gREVWIGFuZCBjb3VsZCBiZSByZXBsYWNlZCBieSBhIHN0YXRpYyB0eXBlIGNoZWNrZXIgZm9yIGxhbmd1YWdlc1xuICogdGhhdCBzdXBwb3J0IGl0LlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0Q3VycmVudE93bmVyID0gcmVxdWlyZSgnLi9SZWFjdEN1cnJlbnRPd25lcicpO1xudmFyIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbnZhciBSZWFjdEVsZW1lbnQgPSByZXF1aXJlKCcuL1JlYWN0RWxlbWVudCcpO1xuXG52YXIgY2hlY2tSZWFjdFR5cGVTcGVjID0gcmVxdWlyZSgnLi9jaGVja1JlYWN0VHlwZVNwZWMnKTtcblxudmFyIGNhbkRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9jYW5EZWZpbmVQcm9wZXJ0eScpO1xudmFyIGdldEl0ZXJhdG9yRm4gPSByZXF1aXJlKCcuL2dldEl0ZXJhdG9yRm4nKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG5mdW5jdGlvbiBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKSB7XG4gIGlmIChSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgdmFyIG5hbWUgPSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50LmdldE5hbWUoKTtcbiAgICBpZiAobmFtZSkge1xuICAgICAgcmV0dXJuICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VJbmZvRXJyb3JBZGRlbmR1bShlbGVtZW50UHJvcHMpIHtcbiAgaWYgKGVsZW1lbnRQcm9wcyAhPT0gbnVsbCAmJiBlbGVtZW50UHJvcHMgIT09IHVuZGVmaW5lZCAmJiBlbGVtZW50UHJvcHMuX19zb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgIHZhciBzb3VyY2UgPSBlbGVtZW50UHJvcHMuX19zb3VyY2U7XG4gICAgdmFyIGZpbGVOYW1lID0gc291cmNlLmZpbGVOYW1lLnJlcGxhY2UoL14uKltcXFxcXFwvXS8sICcnKTtcbiAgICB2YXIgbGluZU51bWJlciA9IHNvdXJjZS5saW5lTnVtYmVyO1xuICAgIHJldHVybiAnIENoZWNrIHlvdXIgY29kZSBhdCAnICsgZmlsZU5hbWUgKyAnOicgKyBsaW5lTnVtYmVyICsgJy4nO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBXYXJuIGlmIHRoZXJlJ3Mgbm8ga2V5IGV4cGxpY2l0bHkgc2V0IG9uIGR5bmFtaWMgYXJyYXlzIG9mIGNoaWxkcmVuIG9yXG4gKiBvYmplY3Qga2V5cyBhcmUgbm90IHZhbGlkLiBUaGlzIGFsbG93cyB1cyB0byBrZWVwIHRyYWNrIG9mIGNoaWxkcmVuIGJldHdlZW5cbiAqIHVwZGF0ZXMuXG4gKi9cbnZhciBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fTtcblxuZnVuY3Rpb24gZ2V0Q3VycmVudENvbXBvbmVudEVycm9ySW5mbyhwYXJlbnRUeXBlKSB7XG4gIHZhciBpbmZvID0gZ2V0RGVjbGFyYXRpb25FcnJvckFkZGVuZHVtKCk7XG5cbiAgaWYgKCFpbmZvKSB7XG4gICAgdmFyIHBhcmVudE5hbWUgPSB0eXBlb2YgcGFyZW50VHlwZSA9PT0gJ3N0cmluZycgPyBwYXJlbnRUeXBlIDogcGFyZW50VHlwZS5kaXNwbGF5TmFtZSB8fCBwYXJlbnRUeXBlLm5hbWU7XG4gICAgaWYgKHBhcmVudE5hbWUpIHtcbiAgICAgIGluZm8gPSAnIENoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPCcgKyBwYXJlbnROYW1lICsgJz4uJztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluZm87XG59XG5cbi8qKlxuICogV2FybiBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW4gZXhwbGljaXQga2V5IGFzc2lnbmVkIHRvIGl0LlxuICogVGhpcyBlbGVtZW50IGlzIGluIGFuIGFycmF5LiBUaGUgYXJyYXkgY291bGQgZ3JvdyBhbmQgc2hyaW5rIG9yIGJlXG4gKiByZW9yZGVyZWQuIEFsbCBjaGlsZHJlbiB0aGF0IGhhdmVuJ3QgYWxyZWFkeSBiZWVuIHZhbGlkYXRlZCBhcmUgcmVxdWlyZWQgdG9cbiAqIGhhdmUgYSBcImtleVwiIHByb3BlcnR5IGFzc2lnbmVkIHRvIGl0LiBFcnJvciBzdGF0dXNlcyBhcmUgY2FjaGVkIHNvIGEgd2FybmluZ1xuICogd2lsbCBvbmx5IGJlIHNob3duIG9uY2UuXG4gKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudCBFbGVtZW50IHRoYXQgcmVxdWlyZXMgYSBrZXkuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgZWxlbWVudCdzIHBhcmVudCdzIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICBpZiAoIWVsZW1lbnQuX3N0b3JlIHx8IGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCB8fCBlbGVtZW50LmtleSAhPSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IHRydWU7XG5cbiAgdmFyIG1lbW9pemVyID0gb3duZXJIYXNLZXlVc2VXYXJuaW5nLnVuaXF1ZUtleSB8fCAob3duZXJIYXNLZXlVc2VXYXJuaW5nLnVuaXF1ZUtleSA9IHt9KTtcblxuICB2YXIgY3VycmVudENvbXBvbmVudEVycm9ySW5mbyA9IGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSk7XG4gIGlmIChtZW1vaXplcltjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSkge1xuICAgIHJldHVybjtcbiAgfVxuICBtZW1vaXplcltjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvXSA9IHRydWU7XG5cbiAgLy8gVXN1YWxseSB0aGUgY3VycmVudCBvd25lciBpcyB0aGUgb2ZmZW5kZXIsIGJ1dCBpZiBpdCBhY2NlcHRzIGNoaWxkcmVuIGFzIGFcbiAgLy8gcHJvcGVydHksIGl0IG1heSBiZSB0aGUgY3JlYXRvciBvZiB0aGUgY2hpbGQgdGhhdCdzIHJlc3BvbnNpYmxlIGZvclxuICAvLyBhc3NpZ25pbmcgaXQgYSBrZXkuXG4gIHZhciBjaGlsZE93bmVyID0gJyc7XG4gIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuX293bmVyICYmIGVsZW1lbnQuX293bmVyICE9PSBSZWFjdEN1cnJlbnRPd25lci5jdXJyZW50KSB7XG4gICAgLy8gR2l2ZSB0aGUgY29tcG9uZW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoaXMgY2hpbGQuXG4gICAgY2hpbGRPd25lciA9ICcgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gJyArIGVsZW1lbnQuX293bmVyLmdldE5hbWUoKSArICcuJztcbiAgfVxuXG4gIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0VhY2ggY2hpbGQgaW4gYW4gYXJyYXkgb3IgaXRlcmF0b3Igc2hvdWxkIGhhdmUgYSB1bmlxdWUgXCJrZXlcIiBwcm9wLicgKyAnJXMlcyBTZWUgaHR0cHM6Ly9mYi5tZS9yZWFjdC13YXJuaW5nLWtleXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uJXMnLCBjdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvLCBjaGlsZE93bmVyLCBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEN1cnJlbnRTdGFja0FkZGVuZHVtKGVsZW1lbnQpKSA6IHZvaWQgMDtcbn1cblxuLyoqXG4gKiBFbnN1cmUgdGhhdCBldmVyeSBlbGVtZW50IGVpdGhlciBpcyBwYXNzZWQgaW4gYSBzdGF0aWMgbG9jYXRpb24sIGluIGFuXG4gKiBhcnJheSB3aXRoIGFuIGV4cGxpY2l0IGtleXMgcHJvcGVydHkgZGVmaW5lZCwgb3IgaW4gYW4gb2JqZWN0IGxpdGVyYWxcbiAqIHdpdGggdmFsaWQga2V5IHByb3BlcnR5LlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHBhcmFtIHtSZWFjdE5vZGV9IG5vZGUgU3RhdGljYWxseSBwYXNzZWQgY2hpbGQgb2YgYW55IHR5cGUuXG4gKiBAcGFyYW0geyp9IHBhcmVudFR5cGUgbm9kZSdzIHBhcmVudCdzIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlQ2hpbGRLZXlzKG5vZGUsIHBhcmVudFR5cGUpIHtcbiAgaWYgKHR5cGVvZiBub2RlICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShub2RlKSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGNoaWxkID0gbm9kZVtpXTtcbiAgICAgIGlmIChSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQoY2hpbGQpKSB7XG4gICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmIChSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQobm9kZSkpIHtcbiAgICAvLyBUaGlzIGVsZW1lbnQgd2FzIHBhc3NlZCBpbiBhIHZhbGlkIGxvY2F0aW9uLlxuICAgIGlmIChub2RlLl9zdG9yZSkge1xuICAgICAgbm9kZS5fc3RvcmUudmFsaWRhdGVkID0gdHJ1ZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAobm9kZSkge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihub2RlKTtcbiAgICAvLyBFbnRyeSBpdGVyYXRvcnMgcHJvdmlkZSBpbXBsaWNpdCBrZXlzLlxuICAgIGlmIChpdGVyYXRvckZuKSB7XG4gICAgICBpZiAoaXRlcmF0b3JGbiAhPT0gbm9kZS5lbnRyaWVzKSB7XG4gICAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChub2RlKTtcbiAgICAgICAgdmFyIHN0ZXA7XG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICBpZiAoUmVhY3RFbGVtZW50LmlzVmFsaWRFbGVtZW50KHN0ZXAudmFsdWUpKSB7XG4gICAgICAgICAgICB2YWxpZGF0ZUV4cGxpY2l0S2V5KHN0ZXAudmFsdWUsIHBhcmVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEdpdmVuIGFuIGVsZW1lbnQsIHZhbGlkYXRlIHRoYXQgaXRzIHByb3BzIGZvbGxvdyB0aGUgcHJvcFR5cGVzIGRlZmluaXRpb24sXG4gKiBwcm92aWRlZCBieSB0aGUgdHlwZS5cbiAqXG4gKiBAcGFyYW0ge1JlYWN0RWxlbWVudH0gZWxlbWVudFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KSB7XG4gIHZhciBjb21wb25lbnRDbGFzcyA9IGVsZW1lbnQudHlwZTtcbiAgaWYgKHR5cGVvZiBjb21wb25lbnRDbGFzcyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbmFtZSA9IGNvbXBvbmVudENsYXNzLmRpc3BsYXlOYW1lIHx8IGNvbXBvbmVudENsYXNzLm5hbWU7XG4gIGlmIChjb21wb25lbnRDbGFzcy5wcm9wVHlwZXMpIHtcbiAgICBjaGVja1JlYWN0VHlwZVNwZWMoY29tcG9uZW50Q2xhc3MucHJvcFR5cGVzLCBlbGVtZW50LnByb3BzLCAncHJvcCcsIG5hbWUsIGVsZW1lbnQsIG51bGwpO1xuICB9XG4gIGlmICh0eXBlb2YgY29tcG9uZW50Q2xhc3MuZ2V0RGVmYXVsdFByb3BzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKGNvbXBvbmVudENsYXNzLmdldERlZmF1bHRQcm9wcy5pc1JlYWN0Q2xhc3NBcHByb3ZlZCwgJ2dldERlZmF1bHRQcm9wcyBpcyBvbmx5IHVzZWQgb24gY2xhc3NpYyBSZWFjdC5jcmVhdGVDbGFzcyAnICsgJ2RlZmluaXRpb25zLiBVc2UgYSBzdGF0aWMgcHJvcGVydHkgbmFtZWQgYGRlZmF1bHRQcm9wc2AgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgfVxufVxuXG52YXIgUmVhY3RFbGVtZW50VmFsaWRhdG9yID0ge1xuXG4gIGNyZWF0ZUVsZW1lbnQ6IGZ1bmN0aW9uICh0eXBlLCBwcm9wcywgY2hpbGRyZW4pIHtcbiAgICB2YXIgdmFsaWRUeXBlID0gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nO1xuICAgIC8vIFdlIHdhcm4gaW4gdGhpcyBjYXNlIGJ1dCBkb24ndCB0aHJvdy4gV2UgZXhwZWN0IHRoZSBlbGVtZW50IGNyZWF0aW9uIHRvXG4gICAgLy8gc3VjY2VlZCBhbmQgdGhlcmUgd2lsbCBsaWtlbHkgYmUgZXJyb3JzIGluIHJlbmRlci5cbiAgICBpZiAoIXZhbGlkVHlwZSkge1xuICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgaW5mbyA9ICcnO1xuICAgICAgICBpZiAodHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB0eXBlID09PSAnb2JqZWN0JyAmJiB0eXBlICE9PSBudWxsICYmIE9iamVjdC5rZXlzKHR5cGUpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGluZm8gKz0gJyBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSAnICsgJ2l0XFwncyBkZWZpbmVkIGluLic7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc291cmNlSW5mbyA9IGdldFNvdXJjZUluZm9FcnJvckFkZGVuZHVtKHByb3BzKTtcbiAgICAgICAgaWYgKHNvdXJjZUluZm8pIHtcbiAgICAgICAgICBpbmZvICs9IHNvdXJjZUluZm87XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaW5mbyArPSBnZXREZWNsYXJhdGlvbkVycm9yQWRkZW5kdW0oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZm8gKz0gUmVhY3RDb21wb25lbnRUcmVlSG9vay5nZXRDdXJyZW50U3RhY2tBZGRlbmR1bSgpO1xuXG4gICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ1JlYWN0LmNyZWF0ZUVsZW1lbnQ6IHR5cGUgaXMgaW52YWxpZCAtLSBleHBlY3RlZCBhIHN0cmluZyAoZm9yICcgKyAnYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSAnICsgJ2NvbXBvbmVudHMpIGJ1dCBnb3Q6ICVzLiVzJywgdHlwZSA9PSBudWxsID8gdHlwZSA6IHR5cGVvZiB0eXBlLCBpbmZvKSA6IHZvaWQgMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZWxlbWVudCA9IFJlYWN0RWxlbWVudC5jcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAvLyBUaGUgcmVzdWx0IGNhbiBiZSBudWxsaXNoIGlmIGEgbW9jayBvciBhIGN1c3RvbSBmdW5jdGlvbiBpcyB1c2VkLlxuICAgIC8vIFRPRE86IERyb3AgdGhpcyB3aGVuIHRoZXNlIGFyZSBubyBsb25nZXIgYWxsb3dlZCBhcyB0aGUgdHlwZSBhcmd1bWVudC5cbiAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBTa2lwIGtleSB3YXJuaW5nIGlmIHRoZSB0eXBlIGlzbid0IHZhbGlkIHNpbmNlIG91ciBrZXkgdmFsaWRhdGlvbiBsb2dpY1xuICAgIC8vIGRvZXNuJ3QgZXhwZWN0IGEgbm9uLXN0cmluZy9mdW5jdGlvbiB0eXBlIGFuZCBjYW4gdGhyb3cgY29uZnVzaW5nIGVycm9ycy5cbiAgICAvLyBXZSBkb24ndCB3YW50IGV4Y2VwdGlvbiBiZWhhdmlvciB0byBkaWZmZXIgYmV0d2VlbiBkZXYgYW5kIHByb2QuXG4gICAgLy8gKFJlbmRlcmluZyB3aWxsIHRocm93IHdpdGggYSBoZWxwZnVsIG1lc3NhZ2UgYW5kIGFzIHNvb24gYXMgdGhlIHR5cGUgaXNcbiAgICAvLyBmaXhlZCwgdGhlIGtleSB3YXJuaW5ncyB3aWxsIGFwcGVhci4pXG4gICAgaWYgKHZhbGlkVHlwZSkge1xuICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFsaWRhdGVDaGlsZEtleXMoYXJndW1lbnRzW2ldLCB0eXBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YWxpZGF0ZVByb3BUeXBlcyhlbGVtZW50KTtcblxuICAgIHJldHVybiBlbGVtZW50O1xuICB9LFxuXG4gIGNyZWF0ZUZhY3Rvcnk6IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgdmFyIHZhbGlkYXRlZEZhY3RvcnkgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3IuY3JlYXRlRWxlbWVudC5iaW5kKG51bGwsIHR5cGUpO1xuICAgIC8vIExlZ2FjeSBob29rIFRPRE86IFdhcm4gaWYgdGhpcyBpcyBhY2Nlc3NlZFxuICAgIHZhbGlkYXRlZEZhY3RvcnkudHlwZSA9IHR5cGU7XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmIChjYW5EZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmFsaWRhdGVkRmFjdG9yeSwgJ3R5cGUnLCB7XG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZmFsc2UsICdGYWN0b3J5LnR5cGUgaXMgZGVwcmVjYXRlZC4gQWNjZXNzIHRoZSBjbGFzcyBkaXJlY3RseSAnICsgJ2JlZm9yZSBwYXNzaW5nIGl0IHRvIGNyZWF0ZUZhY3RvcnkuJykgOiB2b2lkIDA7XG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ3R5cGUnLCB7XG4gICAgICAgICAgICAgIHZhbHVlOiB0eXBlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRlZEZhY3Rvcnk7XG4gIH0sXG5cbiAgY2xvbmVFbGVtZW50OiBmdW5jdGlvbiAoZWxlbWVudCwgcHJvcHMsIGNoaWxkcmVuKSB7XG4gICAgdmFyIG5ld0VsZW1lbnQgPSBSZWFjdEVsZW1lbnQuY2xvbmVFbGVtZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1tpXSwgbmV3RWxlbWVudC50eXBlKTtcbiAgICB9XG4gICAgdmFsaWRhdGVQcm9wVHlwZXMobmV3RWxlbWVudCk7XG4gICAgcmV0dXJuIG5ld0VsZW1lbnQ7XG4gIH1cblxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdEVsZW1lbnRWYWxpZGF0b3I7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIHdhcm5pbmcgPSByZXF1aXJlKCdmYmpzL2xpYi93YXJuaW5nJyk7XG5cbmZ1bmN0aW9uIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBjYWxsZXJOYW1lKSB7XG4gIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIHZhciBjb25zdHJ1Y3RvciA9IHB1YmxpY0luc3RhbmNlLmNvbnN0cnVjdG9yO1xuICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJyVzKC4uLik6IENhbiBvbmx5IHVwZGF0ZSBhIG1vdW50ZWQgb3IgbW91bnRpbmcgY29tcG9uZW50LiAnICsgJ1RoaXMgdXN1YWxseSBtZWFucyB5b3UgY2FsbGVkICVzKCkgb24gYW4gdW5tb3VudGVkIGNvbXBvbmVudC4gJyArICdUaGlzIGlzIGEgbm8tb3AuIFBsZWFzZSBjaGVjayB0aGUgY29kZSBmb3IgdGhlICVzIGNvbXBvbmVudC4nLCBjYWxsZXJOYW1lLCBjYWxsZXJOYW1lLCBjb25zdHJ1Y3RvciAmJiAoY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgY29uc3RydWN0b3IubmFtZSkgfHwgJ1JlYWN0Q2xhc3MnKSA6IHZvaWQgMDtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGFic3RyYWN0IEFQSSBmb3IgYW4gdXBkYXRlIHF1ZXVlLlxuICovXG52YXIgUmVhY3ROb29wVXBkYXRlUXVldWUgPSB7XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbXBvc2l0ZSBjb21wb25lbnQgaXMgbW91bnRlZC5cbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2Ugd2Ugd2FudCB0byB0ZXN0LlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIG1vdW50ZWQsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogQHByb3RlY3RlZFxuICAgKiBAZmluYWxcbiAgICovXG4gIGlzTW91bnRlZDogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBFbnF1ZXVlIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGFmdGVyIGFsbCB0aGUgcGVuZGluZyB1cGRhdGVzXG4gICAqIGhhdmUgcHJvY2Vzc2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlYWN0Q2xhc3N9IHB1YmxpY0luc3RhbmNlIFRoZSBpbnN0YW5jZSB0byB1c2UgYXMgYHRoaXNgIGNvbnRleHQuXG4gICAqIEBwYXJhbSB7P2Z1bmN0aW9ufSBjYWxsYmFjayBDYWxsZWQgYWZ0ZXIgc3RhdGUgaXMgdXBkYXRlZC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBlbnF1ZXVlQ2FsbGJhY2s6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSwgY2FsbGJhY2spIHt9LFxuXG4gIC8qKlxuICAgKiBGb3JjZXMgYW4gdXBkYXRlLiBUaGlzIHNob3VsZCBvbmx5IGJlIGludm9rZWQgd2hlbiBpdCBpcyBrbm93biB3aXRoXG4gICAqIGNlcnRhaW50eSB0aGF0IHdlIGFyZSAqKm5vdCoqIGluIGEgRE9NIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBZb3UgbWF5IHdhbnQgdG8gY2FsbCB0aGlzIHdoZW4geW91IGtub3cgdGhhdCBzb21lIGRlZXBlciBhc3BlY3Qgb2YgdGhlXG4gICAqIGNvbXBvbmVudCdzIHN0YXRlIGhhcyBjaGFuZ2VkIGJ1dCBgc2V0U3RhdGVgIHdhcyBub3QgY2FsbGVkLlxuICAgKlxuICAgKiBUaGlzIHdpbGwgbm90IGludm9rZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCwgYnV0IGl0IHdpbGwgaW52b2tlXG4gICAqIGBjb21wb25lbnRXaWxsVXBkYXRlYCBhbmQgYGNvbXBvbmVudERpZFVwZGF0ZWAuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVhY3RDbGFzc30gcHVibGljSW5zdGFuY2UgVGhlIGluc3RhbmNlIHRoYXQgc2hvdWxkIHJlcmVuZGVyLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVGb3JjZVVwZGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdmb3JjZVVwZGF0ZScpO1xuICB9LFxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhbGwgb2YgdGhlIHN0YXRlLiBBbHdheXMgdXNlIHRoaXMgb3IgYHNldFN0YXRlYCB0byBtdXRhdGUgc3RhdGUuXG4gICAqIFlvdSBzaG91bGQgdHJlYXQgYHRoaXMuc3RhdGVgIGFzIGltbXV0YWJsZS5cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgYHRoaXMuc3RhdGVgIHdpbGwgYmUgaW1tZWRpYXRlbHkgdXBkYXRlZCwgc29cbiAgICogYWNjZXNzaW5nIGB0aGlzLnN0YXRlYCBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIG1heSByZXR1cm4gdGhlIG9sZCB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBjb21wbGV0ZVN0YXRlIE5leHQgc3RhdGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZW5xdWV1ZVJlcGxhY2VTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBjb21wbGV0ZVN0YXRlKSB7XG4gICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsICdyZXBsYWNlU3RhdGUnKTtcbiAgfSxcblxuICAvKipcbiAgICogU2V0cyBhIHN1YnNldCBvZiB0aGUgc3RhdGUuIFRoaXMgb25seSBleGlzdHMgYmVjYXVzZSBfcGVuZGluZ1N0YXRlIGlzXG4gICAqIGludGVybmFsLiBUaGlzIHByb3ZpZGVzIGEgbWVyZ2luZyBzdHJhdGVneSB0aGF0IGlzIG5vdCBhdmFpbGFibGUgdG8gZGVlcFxuICAgKiBwcm9wZXJ0aWVzIHdoaWNoIGlzIGNvbmZ1c2luZy4gVE9ETzogRXhwb3NlIHBlbmRpbmdTdGF0ZSBvciBkb24ndCB1c2UgaXRcbiAgICogZHVyaW5nIHRoZSBtZXJnZS5cbiAgICpcbiAgICogQHBhcmFtIHtSZWFjdENsYXNzfSBwdWJsaWNJbnN0YW5jZSBUaGUgaW5zdGFuY2UgdGhhdCBzaG91bGQgcmVyZW5kZXIuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBwYXJ0aWFsU3RhdGUgTmV4dCBwYXJ0aWFsIHN0YXRlIHRvIGJlIG1lcmdlZCB3aXRoIHN0YXRlLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlLCBwYXJ0aWFsU3RhdGUpIHtcbiAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgJ3NldFN0YXRlJyk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gUmVhY3ROb29wVXBkYXRlUXVldWU7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIF9yZXF1aXJlID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKSxcbiAgICBpc1ZhbGlkRWxlbWVudCA9IF9yZXF1aXJlLmlzVmFsaWRFbGVtZW50O1xuXG52YXIgZmFjdG9yeSA9IHJlcXVpcmUoJ3Byb3AtdHlwZXMvZmFjdG9yeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoaXNWYWxpZEVsZW1lbnQpOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBfYXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG52YXIgUmVhY3RDb21wb25lbnQgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50Jyk7XG52YXIgUmVhY3ROb29wVXBkYXRlUXVldWUgPSByZXF1aXJlKCcuL1JlYWN0Tm9vcFVwZGF0ZVF1ZXVlJyk7XG5cbnZhciBlbXB0eU9iamVjdCA9IHJlcXVpcmUoJ2ZianMvbGliL2VtcHR5T2JqZWN0Jyk7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBoZWxwZXJzIGZvciB0aGUgdXBkYXRpbmcgc3RhdGUgb2YgYSBjb21wb25lbnQuXG4gKi9cbmZ1bmN0aW9uIFJlYWN0UHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICAvLyBEdXBsaWNhdGVkIGZyb20gUmVhY3RDb21wb25lbnQuXG4gIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gIC8vIFdlIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdXBkYXRlciBidXQgdGhlIHJlYWwgb25lIGdldHMgaW5qZWN0ZWQgYnkgdGhlXG4gIC8vIHJlbmRlcmVyLlxuICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xufVxuXG5mdW5jdGlvbiBDb21wb25lbnREdW1teSgpIHt9XG5Db21wb25lbnREdW1teS5wcm90b3R5cGUgPSBSZWFjdENvbXBvbmVudC5wcm90b3R5cGU7XG5SZWFjdFB1cmVDb21wb25lbnQucHJvdG90eXBlID0gbmV3IENvbXBvbmVudER1bW15KCk7XG5SZWFjdFB1cmVDb21wb25lbnQucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmVhY3RQdXJlQ29tcG9uZW50O1xuLy8gQXZvaWQgYW4gZXh0cmEgcHJvdG90eXBlIGp1bXAgZm9yIHRoZXNlIG1ldGhvZHMuXG5fYXNzaWduKFJlYWN0UHVyZUNvbXBvbmVudC5wcm90b3R5cGUsIFJlYWN0Q29tcG9uZW50LnByb3RvdHlwZSk7XG5SZWFjdFB1cmVDb21wb25lbnQucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50ID0gdHJ1ZTtcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFjdFB1cmVDb21wb25lbnQ7IiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxMy1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKlxuICogXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FuRGVmaW5lUHJvcGVydHkgPSBmYWxzZTtcbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICB0cnkge1xuICAgIC8vICRGbG93Rml4TWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzI4NVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3gnLCB7IGdldDogZnVuY3Rpb24gKCkge30gfSk7XG4gICAgY2FuRGVmaW5lUHJvcGVydHkgPSB0cnVlO1xuICB9IGNhdGNoICh4KSB7XG4gICAgLy8gSUUgd2lsbCBmYWlsIG9uIGRlZmluZVByb3BlcnR5XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjYW5EZWZpbmVQcm9wZXJ0eTsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXMgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVMb2NhdGlvbk5hbWVzJyk7XG52YXIgUmVhY3RQcm9wVHlwZXNTZWNyZXQgPSByZXF1aXJlKCcuL1JlYWN0UHJvcFR5cGVzU2VjcmV0Jyk7XG5cbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgUmVhY3RDb21wb25lbnRUcmVlSG9vaztcblxuaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBwcm9jZXNzLmVudiAmJiBcImRldmVsb3BtZW50XCIgPT09ICd0ZXN0Jykge1xuICAvLyBUZW1wb3JhcnkgaGFjay5cbiAgLy8gSW5saW5lIHJlcXVpcmVzIGRvbid0IHdvcmsgd2VsbCB3aXRoIEplc3Q6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMvNzI0MFxuICAvLyBSZW1vdmUgdGhlIGlubGluZSByZXF1aXJlcyB3aGVuIHdlIGRvbid0IG5lZWQgdGhlbSBhbnltb3JlOlxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvcHVsbC83MTc4XG4gIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbn1cblxudmFyIGxvZ2dlZFR5cGVGYWlsdXJlcyA9IHt9O1xuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSB2YWx1ZXMgbWF0Y2ggd2l0aCB0aGUgdHlwZSBzcGVjcy5cbiAqIEVycm9yIG1lc3NhZ2VzIGFyZSBtZW1vcml6ZWQgYW5kIHdpbGwgb25seSBiZSBzaG93biBvbmNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSB0eXBlU3BlY3MgTWFwIG9mIG5hbWUgdG8gYSBSZWFjdFByb3BUeXBlXG4gKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIFJ1bnRpbWUgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSB0eXBlLWNoZWNrZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvbiBlLmcuIFwicHJvcFwiLCBcImNvbnRleHRcIiwgXCJjaGlsZCBjb250ZXh0XCJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wb25lbnROYW1lIE5hbWUgb2YgdGhlIGNvbXBvbmVudCBmb3IgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gez9vYmplY3R9IGVsZW1lbnQgVGhlIFJlYWN0IGVsZW1lbnQgdGhhdCBpcyBiZWluZyB0eXBlLWNoZWNrZWRcbiAqIEBwYXJhbSB7P251bWJlcn0gZGVidWdJRCBUaGUgUmVhY3QgY29tcG9uZW50IGluc3RhbmNlIHRoYXQgaXMgYmVpbmcgdHlwZS1jaGVja2VkXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjaGVja1JlYWN0VHlwZVNwZWModHlwZVNwZWNzLCB2YWx1ZXMsIGxvY2F0aW9uLCBjb21wb25lbnROYW1lLCBlbGVtZW50LCBkZWJ1Z0lEKSB7XG4gIGZvciAodmFyIHR5cGVTcGVjTmFtZSBpbiB0eXBlU3BlY3MpIHtcbiAgICBpZiAodHlwZVNwZWNzLmhhc093blByb3BlcnR5KHR5cGVTcGVjTmFtZSkpIHtcbiAgICAgIHZhciBlcnJvcjtcbiAgICAgIC8vIFByb3AgdHlwZSB2YWxpZGF0aW9uIG1heSB0aHJvdy4gSW4gY2FzZSB0aGV5IGRvLCB3ZSBkb24ndCB3YW50IHRvXG4gICAgICAvLyBmYWlsIHRoZSByZW5kZXIgcGhhc2Ugd2hlcmUgaXQgZGlkbid0IGZhaWwgYmVmb3JlLiBTbyB3ZSBsb2cgaXQuXG4gICAgICAvLyBBZnRlciB0aGVzZSBoYXZlIGJlZW4gY2xlYW5lZCB1cCwgd2UnbGwgbGV0IHRoZW0gdGhyb3cuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgYW4gaW52YXJpYW50IHRoYXQgZ2V0cyBjYXVnaHQuIEl0J3MgdGhlIHNhbWVcbiAgICAgICAgLy8gYmVoYXZpb3IgYXMgd2l0aG91dCB0aGlzIHN0YXRlbWVudCBleGNlcHQgd2l0aCBhIGJldHRlciBtZXNzYWdlLlxuICAgICAgICAhKHR5cGVvZiB0eXBlU3BlY3NbdHlwZVNwZWNOYW1lXSA9PT0gJ2Z1bmN0aW9uJykgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJyVzOiAlcyB0eXBlIGAlc2AgaXMgaW52YWxpZDsgaXQgbXVzdCBiZSBhIGZ1bmN0aW9uLCB1c3VhbGx5IGZyb20gUmVhY3QuUHJvcFR5cGVzLicsIGNvbXBvbmVudE5hbWUgfHwgJ1JlYWN0IGNsYXNzJywgUmVhY3RQcm9wVHlwZUxvY2F0aW9uTmFtZXNbbG9jYXRpb25dLCB0eXBlU3BlY05hbWUpIDogX3Byb2RJbnZhcmlhbnQoJzg0JywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sIHR5cGVTcGVjTmFtZSkgOiB2b2lkIDA7XG4gICAgICAgIGVycm9yID0gdHlwZVNwZWNzW3R5cGVTcGVjTmFtZV0odmFsdWVzLCB0eXBlU3BlY05hbWUsIGNvbXBvbmVudE5hbWUsIGxvY2F0aW9uLCBudWxsLCBSZWFjdFByb3BUeXBlc1NlY3JldCk7XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBlcnJvciA9IGV4O1xuICAgICAgfVxuICAgICAgXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyB3YXJuaW5nKCFlcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIEVycm9yLCAnJXM6IHR5cGUgc3BlY2lmaWNhdGlvbiBvZiAlcyBgJXNgIGlzIGludmFsaWQ7IHRoZSB0eXBlIGNoZWNrZXIgJyArICdmdW5jdGlvbiBtdXN0IHJldHVybiBgbnVsbGAgb3IgYW4gYEVycm9yYCBidXQgcmV0dXJuZWQgYSAlcy4gJyArICdZb3UgbWF5IGhhdmUgZm9yZ290dGVuIHRvIHBhc3MgYW4gYXJndW1lbnQgdG8gdGhlIHR5cGUgY2hlY2tlciAnICsgJ2NyZWF0b3IgKGFycmF5T2YsIGluc3RhbmNlT2YsIG9iamVjdE9mLCBvbmVPZiwgb25lT2ZUeXBlLCBhbmQgJyArICdzaGFwZSBhbGwgcmVxdWlyZSBhbiBhcmd1bWVudCkuJywgY29tcG9uZW50TmFtZSB8fCAnUmVhY3QgY2xhc3MnLCBSZWFjdFByb3BUeXBlTG9jYXRpb25OYW1lc1tsb2NhdGlvbl0sIHR5cGVTcGVjTmFtZSwgdHlwZW9mIGVycm9yKSA6IHZvaWQgMDtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmICEoZXJyb3IubWVzc2FnZSBpbiBsb2dnZWRUeXBlRmFpbHVyZXMpKSB7XG4gICAgICAgIC8vIE9ubHkgbW9uaXRvciB0aGlzIGZhaWx1cmUgb25jZSBiZWNhdXNlIHRoZXJlIHRlbmRzIHRvIGJlIGEgbG90IG9mIHRoZVxuICAgICAgICAvLyBzYW1lIGVycm9yLlxuICAgICAgICBsb2dnZWRUeXBlRmFpbHVyZXNbZXJyb3IubWVzc2FnZV0gPSB0cnVlO1xuXG4gICAgICAgIHZhciBjb21wb25lbnRTdGFja0luZm8gPSAnJztcblxuICAgICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICBpZiAoIVJlYWN0Q29tcG9uZW50VHJlZUhvb2spIHtcbiAgICAgICAgICAgIFJlYWN0Q29tcG9uZW50VHJlZUhvb2sgPSByZXF1aXJlKCcuL1JlYWN0Q29tcG9uZW50VHJlZUhvb2snKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRlYnVnSUQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudFN0YWNrSW5mbyA9IFJlYWN0Q29tcG9uZW50VHJlZUhvb2suZ2V0U3RhY2tBZGRlbmR1bUJ5SUQoZGVidWdJRCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb21wb25lbnRTdGFja0luZm8gPSBSZWFjdENvbXBvbmVudFRyZWVIb29rLmdldEN1cnJlbnRTdGFja0FkZGVuZHVtKGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nID8gd2FybmluZyhmYWxzZSwgJ0ZhaWxlZCAlcyB0eXBlOiAlcyVzJywgbG9jYXRpb24sIGVycm9yLm1lc3NhZ2UsIGNvbXBvbmVudFN0YWNrSW5mbykgOiB2b2lkIDA7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY2hlY2tSZWFjdFR5cGVTcGVjOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqIFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxudmFyIG5leHREZWJ1Z0lEID0gMTtcblxuZnVuY3Rpb24gZ2V0TmV4dERlYnVnSUQoKSB7XG4gIHJldHVybiBuZXh0RGVidWdJRCsrO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldE5leHREZWJ1Z0lEOyIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICpcbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RFbGVtZW50ID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnQnKTtcblxudmFyIGludmFyaWFudCA9IHJlcXVpcmUoJ2ZianMvbGliL2ludmFyaWFudCcpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IGNoaWxkIGluIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiBhbmQgdmVyaWZpZXMgdGhhdCB0aGVyZVxuICogaXMgb25seSBvbmUgY2hpbGQgaW4gdGhlIGNvbGxlY3Rpb24uXG4gKlxuICogU2VlIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3JlYWN0L2RvY3MvdG9wLWxldmVsLWFwaS5odG1sI3JlYWN0LmNoaWxkcmVuLm9ubHlcbiAqXG4gKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBhIHNpbmdsZSBjaGlsZCBnZXRzXG4gKiBwYXNzZWQgd2l0aG91dCBhIHdyYXBwZXIsIGJ1dCB0aGUgcHVycG9zZSBvZiB0aGlzIGhlbHBlciBmdW5jdGlvbiBpcyB0b1xuICogYWJzdHJhY3QgYXdheSB0aGUgcGFydGljdWxhciBzdHJ1Y3R1cmUgb2YgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHs/b2JqZWN0fSBjaGlsZHJlbiBDaGlsZCBjb2xsZWN0aW9uIHN0cnVjdHVyZS5cbiAqIEByZXR1cm4ge1JlYWN0RWxlbWVudH0gVGhlIGZpcnN0IGFuZCBvbmx5IGBSZWFjdEVsZW1lbnRgIGNvbnRhaW5lZCBpbiB0aGVcbiAqIHN0cnVjdHVyZS5cbiAqL1xuZnVuY3Rpb24gb25seUNoaWxkKGNoaWxkcmVuKSB7XG4gICFSZWFjdEVsZW1lbnQuaXNWYWxpZEVsZW1lbnQoY2hpbGRyZW4pID8gXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgPyBpbnZhcmlhbnQoZmFsc2UsICdSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4nKSA6IF9wcm9kSW52YXJpYW50KCcxNDMnKSA6IHZvaWQgMDtcbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9ubHlDaGlsZDsiLCIvKipcbiAqIENvcHlyaWdodCAyMDEzLXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLiBBbiBhZGRpdGlvbmFsIGdyYW50XG4gKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3Byb2RJbnZhcmlhbnQgPSByZXF1aXJlKCcuL3JlYWN0UHJvZEludmFyaWFudCcpO1xuXG52YXIgUmVhY3RDdXJyZW50T3duZXIgPSByZXF1aXJlKCcuL1JlYWN0Q3VycmVudE93bmVyJyk7XG52YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gcmVxdWlyZSgnLi9SZWFjdEVsZW1lbnRTeW1ib2wnKTtcblxudmFyIGdldEl0ZXJhdG9yRm4gPSByZXF1aXJlKCcuL2dldEl0ZXJhdG9yRm4nKTtcbnZhciBpbnZhcmlhbnQgPSByZXF1aXJlKCdmYmpzL2xpYi9pbnZhcmlhbnQnKTtcbnZhciBLZXlFc2NhcGVVdGlscyA9IHJlcXVpcmUoJy4vS2V5RXNjYXBlVXRpbHMnKTtcbnZhciB3YXJuaW5nID0gcmVxdWlyZSgnZmJqcy9saWIvd2FybmluZycpO1xuXG52YXIgU0VQQVJBVE9SID0gJy4nO1xudmFyIFNVQlNFUEFSQVRPUiA9ICc6JztcblxuLyoqXG4gKiBUaGlzIGlzIGlubGluZWQgZnJvbSBSZWFjdEVsZW1lbnQgc2luY2UgdGhpcyBmaWxlIGlzIHNoYXJlZCBiZXR3ZWVuXG4gKiBpc29tb3JwaGljIGFuZCByZW5kZXJlcnMuIFdlIGNvdWxkIGV4dHJhY3QgdGhpcyB0byBhXG4gKlxuICovXG5cbi8qKlxuICogVE9ETzogVGVzdCB0aGF0IGEgc2luZ2xlIGNoaWxkIGFuZCBhbiBhcnJheSB3aXRoIG9uZSBpdGVtIGhhdmUgdGhlIHNhbWUga2V5XG4gKiBwYXR0ZXJuLlxuICovXG5cbnZhciBkaWRXYXJuQWJvdXRNYXBzID0gZmFsc2U7XG5cbi8qKlxuICogR2VuZXJhdGUgYSBrZXkgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyBhIGNvbXBvbmVudCB3aXRoaW4gYSBzZXQuXG4gKlxuICogQHBhcmFtIHsqfSBjb21wb25lbnQgQSBjb21wb25lbnQgdGhhdCBjb3VsZCBjb250YWluIGEgbWFudWFsIGtleS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCB0aGF0IGlzIHVzZWQgaWYgYSBtYW51YWwga2V5IGlzIG5vdCBwcm92aWRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZ2V0Q29tcG9uZW50S2V5KGNvbXBvbmVudCwgaW5kZXgpIHtcbiAgLy8gRG8gc29tZSB0eXBlY2hlY2tpbmcgaGVyZSBzaW5jZSB3ZSBjYWxsIHRoaXMgYmxpbmRseS4gV2Ugd2FudCB0byBlbnN1cmVcbiAgLy8gdGhhdCB3ZSBkb24ndCBibG9jayBwb3RlbnRpYWwgZnV0dXJlIEVTIEFQSXMuXG4gIGlmIChjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudCA9PT0gJ29iamVjdCcgJiYgY29tcG9uZW50LmtleSAhPSBudWxsKSB7XG4gICAgLy8gRXhwbGljaXQga2V5XG4gICAgcmV0dXJuIEtleUVzY2FwZVV0aWxzLmVzY2FwZShjb21wb25lbnQua2V5KTtcbiAgfVxuICAvLyBJbXBsaWNpdCBrZXkgZGV0ZXJtaW5lZCBieSB0aGUgaW5kZXggaW4gdGhlIHNldFxuICByZXR1cm4gaW5kZXgudG9TdHJpbmcoMzYpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7Pyp9IGNoaWxkcmVuIENoaWxkcmVuIHRyZWUgY29udGFpbmVyLlxuICogQHBhcmFtIHshc3RyaW5nfSBuYW1lU29GYXIgTmFtZSBvZiB0aGUga2V5IHBhdGggc28gZmFyLlxuICogQHBhcmFtIHshZnVuY3Rpb259IGNhbGxiYWNrIENhbGxiYWNrIHRvIGludm9rZSB3aXRoIGVhY2ggY2hpbGQgZm91bmQuXG4gKiBAcGFyYW0gez8qfSB0cmF2ZXJzZUNvbnRleHQgVXNlZCB0byBwYXNzIGluZm9ybWF0aW9uIHRocm91Z2hvdXQgdGhlIHRyYXZlcnNhbFxuICogcHJvY2Vzcy5cbiAqIEByZXR1cm4geyFudW1iZXJ9IFRoZSBudW1iZXIgb2YgY2hpbGRyZW4gaW4gdGhpcyBzdWJ0cmVlLlxuICovXG5mdW5jdGlvbiB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZHJlbiwgbmFtZVNvRmFyLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KSB7XG4gIHZhciB0eXBlID0gdHlwZW9mIGNoaWxkcmVuO1xuXG4gIGlmICh0eXBlID09PSAndW5kZWZpbmVkJyB8fCB0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAvLyBBbGwgb2YgdGhlIGFib3ZlIGFyZSBwZXJjZWl2ZWQgYXMgbnVsbC5cbiAgICBjaGlsZHJlbiA9IG51bGw7XG4gIH1cblxuICBpZiAoY2hpbGRyZW4gPT09IG51bGwgfHwgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicgfHxcbiAgLy8gVGhlIGZvbGxvd2luZyBpcyBpbmxpbmVkIGZyb20gUmVhY3RFbGVtZW50LiBUaGlzIG1lYW5zIHdlIGNhbiBvcHRpbWl6ZVxuICAvLyBzb21lIGNoZWNrcy4gUmVhY3QgRmliZXIgYWxzbyBpbmxpbmVzIHRoaXMgbG9naWMgZm9yIHNpbWlsYXIgcHVycG9zZXMuXG4gIHR5cGUgPT09ICdvYmplY3QnICYmIGNoaWxkcmVuLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUpIHtcbiAgICBjYWxsYmFjayh0cmF2ZXJzZUNvbnRleHQsIGNoaWxkcmVuLFxuICAgIC8vIElmIGl0J3MgdGhlIG9ubHkgY2hpbGQsIHRyZWF0IHRoZSBuYW1lIGFzIGlmIGl0IHdhcyB3cmFwcGVkIGluIGFuIGFycmF5XG4gICAgLy8gc28gdGhhdCBpdCdzIGNvbnNpc3RlbnQgaWYgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBncm93cy5cbiAgICBuYW1lU29GYXIgPT09ICcnID8gU0VQQVJBVE9SICsgZ2V0Q29tcG9uZW50S2V5KGNoaWxkcmVuLCAwKSA6IG5hbWVTb0Zhcik7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICB2YXIgY2hpbGQ7XG4gIHZhciBuZXh0TmFtZTtcbiAgdmFyIHN1YnRyZWVDb3VudCA9IDA7IC8vIENvdW50IG9mIGNoaWxkcmVuIGZvdW5kIGluIHRoZSBjdXJyZW50IHN1YnRyZWUuXG4gIHZhciBuZXh0TmFtZVByZWZpeCA9IG5hbWVTb0ZhciA9PT0gJycgPyBTRVBBUkFUT1IgOiBuYW1lU29GYXIgKyBTVUJTRVBBUkFUT1I7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIG5leHROYW1lID0gbmV4dE5hbWVQcmVmaXggKyBnZXRDb21wb25lbnRLZXkoY2hpbGQsIGkpO1xuICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLCBuZXh0TmFtZSwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBpdGVyYXRvckZuID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbik7XG4gICAgaWYgKGl0ZXJhdG9yRm4pIHtcbiAgICAgIHZhciBpdGVyYXRvciA9IGl0ZXJhdG9yRm4uY2FsbChjaGlsZHJlbik7XG4gICAgICB2YXIgc3RlcDtcbiAgICAgIGlmIChpdGVyYXRvckZuICE9PSBjaGlsZHJlbi5lbnRyaWVzKSB7XG4gICAgICAgIHZhciBpaSA9IDA7XG4gICAgICAgIHdoaWxlICghKHN0ZXAgPSBpdGVyYXRvci5uZXh0KCkpLmRvbmUpIHtcbiAgICAgICAgICBjaGlsZCA9IHN0ZXAudmFsdWU7XG4gICAgICAgICAgbmV4dE5hbWUgPSBuZXh0TmFtZVByZWZpeCArIGdldENvbXBvbmVudEtleShjaGlsZCwgaWkrKyk7XG4gICAgICAgICAgc3VidHJlZUNvdW50ICs9IHRyYXZlcnNlQWxsQ2hpbGRyZW5JbXBsKGNoaWxkLCBuZXh0TmFtZSwgY2FsbGJhY2ssIHRyYXZlcnNlQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIHZhciBtYXBzQXNDaGlsZHJlbkFkZGVuZHVtID0gJyc7XG4gICAgICAgICAgaWYgKFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHZhciBtYXBzQXNDaGlsZHJlbk93bmVyTmFtZSA9IFJlYWN0Q3VycmVudE93bmVyLmN1cnJlbnQuZ2V0TmFtZSgpO1xuICAgICAgICAgICAgaWYgKG1hcHNBc0NoaWxkcmVuT3duZXJOYW1lKSB7XG4gICAgICAgICAgICAgIG1hcHNBc0NoaWxkcmVuQWRkZW5kdW0gPSAnIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mIGAnICsgbWFwc0FzQ2hpbGRyZW5Pd25lck5hbWUgKyAnYC4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IHdhcm5pbmcoZGlkV2FybkFib3V0TWFwcywgJ1VzaW5nIE1hcHMgYXMgY2hpbGRyZW4gaXMgbm90IHlldCBmdWxseSBzdXBwb3J0ZWQuIEl0IGlzIGFuICcgKyAnZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhhdCBtaWdodCBiZSByZW1vdmVkLiBDb252ZXJ0IGl0IHRvIGEgJyArICdzZXF1ZW5jZSAvIGl0ZXJhYmxlIG9mIGtleWVkIFJlYWN0RWxlbWVudHMgaW5zdGVhZC4lcycsIG1hcHNBc0NoaWxkcmVuQWRkZW5kdW0pIDogdm9pZCAwO1xuICAgICAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEl0ZXJhdG9yIHdpbGwgcHJvdmlkZSBlbnRyeSBbayx2XSB0dXBsZXMgcmF0aGVyIHRoYW4gdmFsdWVzLlxuICAgICAgICB3aGlsZSAoIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSB7XG4gICAgICAgICAgdmFyIGVudHJ5ID0gc3RlcC52YWx1ZTtcbiAgICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAgIGNoaWxkID0gZW50cnlbMV07XG4gICAgICAgICAgICBuZXh0TmFtZSA9IG5leHROYW1lUHJlZml4ICsgS2V5RXNjYXBlVXRpbHMuZXNjYXBlKGVudHJ5WzBdKSArIFNVQlNFUEFSQVRPUiArIGdldENvbXBvbmVudEtleShjaGlsZCwgMCk7XG4gICAgICAgICAgICBzdWJ0cmVlQ291bnQgKz0gdHJhdmVyc2VBbGxDaGlsZHJlbkltcGwoY2hpbGQsIG5leHROYW1lLCBjYWxsYmFjaywgdHJhdmVyc2VDb250ZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICB2YXIgYWRkZW5kdW0gPSAnJztcbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICBhZGRlbmR1bSA9ICcgSWYgeW91IG1lYW50IHRvIHJlbmRlciBhIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4sIHVzZSBhbiBhcnJheSAnICsgJ2luc3RlYWQgb3Igd3JhcCB0aGUgb2JqZWN0IHVzaW5nIGNyZWF0ZUZyYWdtZW50KG9iamVjdCkgZnJvbSB0aGUgJyArICdSZWFjdCBhZGQtb25zLic7XG4gICAgICAgIGlmIChjaGlsZHJlbi5faXNSZWFjdEVsZW1lbnQpIHtcbiAgICAgICAgICBhZGRlbmR1bSA9ICcgSXQgbG9va3MgbGlrZSB5b3VcXCdyZSB1c2luZyBhbiBlbGVtZW50IGNyZWF0ZWQgYnkgYSBkaWZmZXJlbnQgJyArICd2ZXJzaW9uIG9mIFJlYWN0LiBNYWtlIHN1cmUgdG8gdXNlIG9ubHkgb25lIGNvcHkgb2YgUmVhY3QuJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoUmVhY3RDdXJyZW50T3duZXIuY3VycmVudCkge1xuICAgICAgICAgIHZhciBuYW1lID0gUmVhY3RDdXJyZW50T3duZXIuY3VycmVudC5nZXROYW1lKCk7XG4gICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgIGFkZGVuZHVtICs9ICcgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCcgKyBuYW1lICsgJ2AuJztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBjaGlsZHJlblN0cmluZyA9IFN0cmluZyhjaGlsZHJlbik7XG4gICAgICAhZmFsc2UgPyBcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJyA/IGludmFyaWFudChmYWxzZSwgJ09iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogJXMpLiVzJywgY2hpbGRyZW5TdHJpbmcgPT09ICdbb2JqZWN0IE9iamVjdF0nID8gJ29iamVjdCB3aXRoIGtleXMgeycgKyBPYmplY3Qua2V5cyhjaGlsZHJlbikuam9pbignLCAnKSArICd9JyA6IGNoaWxkcmVuU3RyaW5nLCBhZGRlbmR1bSkgOiBfcHJvZEludmFyaWFudCgnMzEnLCBjaGlsZHJlblN0cmluZyA9PT0gJ1tvYmplY3QgT2JqZWN0XScgPyAnb2JqZWN0IHdpdGgga2V5cyB7JyArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKCcsICcpICsgJ30nIDogY2hpbGRyZW5TdHJpbmcsIGFkZGVuZHVtKSA6IHZvaWQgMDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3VidHJlZUNvdW50O1xufVxuXG4vKipcbiAqIFRyYXZlcnNlcyBjaGlsZHJlbiB0aGF0IGFyZSB0eXBpY2FsbHkgc3BlY2lmaWVkIGFzIGBwcm9wcy5jaGlsZHJlbmAsIGJ1dFxuICogbWlnaHQgYWxzbyBiZSBzcGVjaWZpZWQgdGhyb3VnaCBhdHRyaWJ1dGVzOlxuICpcbiAqIC0gYHRyYXZlcnNlQWxsQ2hpbGRyZW4odGhpcy5wcm9wcy5jaGlsZHJlbiwgLi4uKWBcbiAqIC0gYHRyYXZlcnNlQWxsQ2hpbGRyZW4odGhpcy5wcm9wcy5sZWZ0UGFuZWxDaGlsZHJlbiwgLi4uKWBcbiAqXG4gKiBUaGUgYHRyYXZlcnNlQ29udGV4dGAgaXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdGhyb3VnaCB0aGVcbiAqIGVudGlyZSB0cmF2ZXJzYWwuIEl0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGFjY3VtdWxhdGlvbnMgb3IgYW55dGhpbmcgZWxzZSB0aGF0XG4gKiB0aGUgY2FsbGJhY2sgbWlnaHQgZmluZCByZWxldmFudC5cbiAqXG4gKiBAcGFyYW0gez8qfSBjaGlsZHJlbiBDaGlsZHJlbiB0cmVlIG9iamVjdC5cbiAqIEBwYXJhbSB7IWZ1bmN0aW9ufSBjYWxsYmFjayBUbyBpbnZva2UgdXBvbiB0cmF2ZXJzaW5nIGVhY2ggY2hpbGQuXG4gKiBAcGFyYW0gez8qfSB0cmF2ZXJzZUNvbnRleHQgQ29udGV4dCBmb3IgdHJhdmVyc2FsLlxuICogQHJldHVybiB7IW51bWJlcn0gVGhlIG51bWJlciBvZiBjaGlsZHJlbiBpbiB0aGlzIHN1YnRyZWUuXG4gKi9cbmZ1bmN0aW9uIHRyYXZlcnNlQWxsQ2hpbGRyZW4oY2hpbGRyZW4sIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpIHtcbiAgaWYgKGNoaWxkcmVuID09IG51bGwpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHJldHVybiB0cmF2ZXJzZUFsbENoaWxkcmVuSW1wbChjaGlsZHJlbiwgJycsIGNhbGxiYWNrLCB0cmF2ZXJzZUNvbnRleHQpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRyYXZlcnNlQWxsQ2hpbGRyZW47IiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL1JlYWN0Jyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5mdW5jdGlvbiBjcmVhdGVUaHVua01pZGRsZXdhcmUoZXh0cmFBcmd1bWVudCkge1xuICByZXR1cm4gZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgZGlzcGF0Y2ggPSBfcmVmLmRpc3BhdGNoLFxuICAgICAgICBnZXRTdGF0ZSA9IF9yZWYuZ2V0U3RhdGU7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIChuZXh0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGFjdGlvbikge1xuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBhY3Rpb24oZGlzcGF0Y2gsIGdldFN0YXRlLCBleHRyYUFyZ3VtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0KGFjdGlvbik7XG4gICAgICB9O1xuICAgIH07XG4gIH07XG59XG5cbnZhciB0aHVuayA9IGNyZWF0ZVRodW5rTWlkZGxld2FyZSgpO1xudGh1bmsud2l0aEV4dHJhQXJndW1lbnQgPSBjcmVhdGVUaHVua01pZGRsZXdhcmU7XG5cbmV4cG9ydHNbJ2RlZmF1bHQnXSA9IHRodW5rOyIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTtcblxuZXhwb3J0c1snZGVmYXVsdCddID0gYXBwbHlNaWRkbGV3YXJlO1xuXG52YXIgX2NvbXBvc2UgPSByZXF1aXJlKCcuL2NvbXBvc2UnKTtcblxudmFyIF9jb21wb3NlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NvbXBvc2UpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN0b3JlIGVuaGFuY2VyIHRoYXQgYXBwbGllcyBtaWRkbGV3YXJlIHRvIHRoZSBkaXNwYXRjaCBtZXRob2RcbiAqIG9mIHRoZSBSZWR1eCBzdG9yZS4gVGhpcyBpcyBoYW5keSBmb3IgYSB2YXJpZXR5IG9mIHRhc2tzLCBzdWNoIGFzIGV4cHJlc3NpbmdcbiAqIGFzeW5jaHJvbm91cyBhY3Rpb25zIGluIGEgY29uY2lzZSBtYW5uZXIsIG9yIGxvZ2dpbmcgZXZlcnkgYWN0aW9uIHBheWxvYWQuXG4gKlxuICogU2VlIGByZWR1eC10aHVua2AgcGFja2FnZSBhcyBhbiBleGFtcGxlIG9mIHRoZSBSZWR1eCBtaWRkbGV3YXJlLlxuICpcbiAqIEJlY2F1c2UgbWlkZGxld2FyZSBpcyBwb3RlbnRpYWxseSBhc3luY2hyb25vdXMsIHRoaXMgc2hvdWxkIGJlIHRoZSBmaXJzdFxuICogc3RvcmUgZW5oYW5jZXIgaW4gdGhlIGNvbXBvc2l0aW9uIGNoYWluLlxuICpcbiAqIE5vdGUgdGhhdCBlYWNoIG1pZGRsZXdhcmUgd2lsbCBiZSBnaXZlbiB0aGUgYGRpc3BhdGNoYCBhbmQgYGdldFN0YXRlYCBmdW5jdGlvbnNcbiAqIGFzIG5hbWVkIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gey4uLkZ1bmN0aW9ufSBtaWRkbGV3YXJlcyBUaGUgbWlkZGxld2FyZSBjaGFpbiB0byBiZSBhcHBsaWVkLlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBBIHN0b3JlIGVuaGFuY2VyIGFwcGx5aW5nIHRoZSBtaWRkbGV3YXJlLlxuICovXG5mdW5jdGlvbiBhcHBseU1pZGRsZXdhcmUoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBtaWRkbGV3YXJlcyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIG1pZGRsZXdhcmVzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChjcmVhdGVTdG9yZSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gICAgICB2YXIgc3RvcmUgPSBjcmVhdGVTdG9yZShyZWR1Y2VyLCBwcmVsb2FkZWRTdGF0ZSwgZW5oYW5jZXIpO1xuICAgICAgdmFyIF9kaXNwYXRjaCA9IHN0b3JlLmRpc3BhdGNoO1xuICAgICAgdmFyIGNoYWluID0gW107XG5cbiAgICAgIHZhciBtaWRkbGV3YXJlQVBJID0ge1xuICAgICAgICBnZXRTdGF0ZTogc3RvcmUuZ2V0U3RhdGUsXG4gICAgICAgIGRpc3BhdGNoOiBmdW5jdGlvbiBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICAgICAgICByZXR1cm4gX2Rpc3BhdGNoKGFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBjaGFpbiA9IG1pZGRsZXdhcmVzLm1hcChmdW5jdGlvbiAobWlkZGxld2FyZSkge1xuICAgICAgICByZXR1cm4gbWlkZGxld2FyZShtaWRkbGV3YXJlQVBJKTtcbiAgICAgIH0pO1xuICAgICAgX2Rpc3BhdGNoID0gX2NvbXBvc2UyWydkZWZhdWx0J10uYXBwbHkodW5kZWZpbmVkLCBjaGFpbikoc3RvcmUuZGlzcGF0Y2gpO1xuXG4gICAgICByZXR1cm4gX2V4dGVuZHMoe30sIHN0b3JlLCB7XG4gICAgICAgIGRpc3BhdGNoOiBfZGlzcGF0Y2hcbiAgICAgIH0pO1xuICAgIH07XG4gIH07XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0gYmluZEFjdGlvbkNyZWF0b3JzO1xuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3IoYWN0aW9uQ3JlYXRvciwgZGlzcGF0Y2gpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZGlzcGF0Y2goYWN0aW9uQ3JlYXRvci5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cykpO1xuICB9O1xufVxuXG4vKipcbiAqIFR1cm5zIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIGFjdGlvbiBjcmVhdG9ycywgaW50byBhbiBvYmplY3Qgd2l0aCB0aGVcbiAqIHNhbWUga2V5cywgYnV0IHdpdGggZXZlcnkgZnVuY3Rpb24gd3JhcHBlZCBpbnRvIGEgYGRpc3BhdGNoYCBjYWxsIHNvIHRoZXlcbiAqIG1heSBiZSBpbnZva2VkIGRpcmVjdGx5LiBUaGlzIGlzIGp1c3QgYSBjb252ZW5pZW5jZSBtZXRob2QsIGFzIHlvdSBjYW4gY2FsbFxuICogYHN0b3JlLmRpc3BhdGNoKE15QWN0aW9uQ3JlYXRvcnMuZG9Tb21ldGhpbmcoKSlgIHlvdXJzZWxmIGp1c3QgZmluZS5cbiAqXG4gKiBGb3IgY29udmVuaWVuY2UsIHlvdSBjYW4gYWxzbyBwYXNzIGEgc2luZ2xlIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCxcbiAqIGFuZCBnZXQgYSBmdW5jdGlvbiBpbiByZXR1cm4uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbnxPYmplY3R9IGFjdGlvbkNyZWF0b3JzIEFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIGFjdGlvblxuICogY3JlYXRvciBmdW5jdGlvbnMuIE9uZSBoYW5keSB3YXkgdG8gb2J0YWluIGl0IGlzIHRvIHVzZSBFUzYgYGltcG9ydCAqIGFzYFxuICogc3ludGF4LiBZb3UgbWF5IGFsc28gcGFzcyBhIHNpbmdsZSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBkaXNwYXRjaCBUaGUgYGRpc3BhdGNoYCBmdW5jdGlvbiBhdmFpbGFibGUgb24geW91ciBSZWR1eFxuICogc3RvcmUuXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufE9iamVjdH0gVGhlIG9iamVjdCBtaW1pY2tpbmcgdGhlIG9yaWdpbmFsIG9iamVjdCwgYnV0IHdpdGhcbiAqIGV2ZXJ5IGFjdGlvbiBjcmVhdG9yIHdyYXBwZWQgaW50byB0aGUgYGRpc3BhdGNoYCBjYWxsLiBJZiB5b3UgcGFzc2VkIGFcbiAqIGZ1bmN0aW9uIGFzIGBhY3Rpb25DcmVhdG9yc2AsIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBhbHNvIGJlIGEgc2luZ2xlXG4gKiBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gYmluZEFjdGlvbkNyZWF0b3JzKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCkge1xuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3JzLCBkaXNwYXRjaCk7XG4gIH1cblxuICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3JzICE9PSAnb2JqZWN0JyB8fCBhY3Rpb25DcmVhdG9ycyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcignYmluZEFjdGlvbkNyZWF0b3JzIGV4cGVjdGVkIGFuIG9iamVjdCBvciBhIGZ1bmN0aW9uLCBpbnN0ZWFkIHJlY2VpdmVkICcgKyAoYWN0aW9uQ3JlYXRvcnMgPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2YgYWN0aW9uQ3JlYXRvcnMpICsgJy4gJyArICdEaWQgeW91IHdyaXRlIFwiaW1wb3J0IEFjdGlvbkNyZWF0b3JzIGZyb21cIiBpbnN0ZWFkIG9mIFwiaW1wb3J0ICogYXMgQWN0aW9uQ3JlYXRvcnMgZnJvbVwiPycpO1xuICB9XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhY3Rpb25DcmVhdG9ycyk7XG4gIHZhciBib3VuZEFjdGlvbkNyZWF0b3JzID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIHZhciBhY3Rpb25DcmVhdG9yID0gYWN0aW9uQ3JlYXRvcnNba2V5XTtcbiAgICBpZiAodHlwZW9mIGFjdGlvbkNyZWF0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGJvdW5kQWN0aW9uQ3JlYXRvcnNba2V5XSA9IGJpbmRBY3Rpb25DcmVhdG9yKGFjdGlvbkNyZWF0b3IsIGRpc3BhdGNoKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJvdW5kQWN0aW9uQ3JlYXRvcnM7XG59IiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuZXhwb3J0c1snZGVmYXVsdCddID0gY29tYmluZVJlZHVjZXJzO1xuXG52YXIgX2NyZWF0ZVN0b3JlID0gcmVxdWlyZSgnLi9jcmVhdGVTdG9yZScpO1xuXG52YXIgX2lzUGxhaW5PYmplY3QgPSByZXF1aXJlKCdsb2Rhc2gvaXNQbGFpbk9iamVjdCcpO1xuXG52YXIgX2lzUGxhaW5PYmplY3QyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfaXNQbGFpbk9iamVjdCk7XG5cbnZhciBfd2FybmluZyA9IHJlcXVpcmUoJy4vdXRpbHMvd2FybmluZycpO1xuXG52YXIgX3dhcm5pbmcyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfd2FybmluZyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuZnVuY3Rpb24gZ2V0VW5kZWZpbmVkU3RhdGVFcnJvck1lc3NhZ2Uoa2V5LCBhY3Rpb24pIHtcbiAgdmFyIGFjdGlvblR5cGUgPSBhY3Rpb24gJiYgYWN0aW9uLnR5cGU7XG4gIHZhciBhY3Rpb25OYW1lID0gYWN0aW9uVHlwZSAmJiAnXCInICsgYWN0aW9uVHlwZS50b1N0cmluZygpICsgJ1wiJyB8fCAnYW4gYWN0aW9uJztcblxuICByZXR1cm4gJ0dpdmVuIGFjdGlvbiAnICsgYWN0aW9uTmFtZSArICcsIHJlZHVjZXIgXCInICsga2V5ICsgJ1wiIHJldHVybmVkIHVuZGVmaW5lZC4gJyArICdUbyBpZ25vcmUgYW4gYWN0aW9uLCB5b3UgbXVzdCBleHBsaWNpdGx5IHJldHVybiB0aGUgcHJldmlvdXMgc3RhdGUuJztcbn1cblxuZnVuY3Rpb24gZ2V0VW5leHBlY3RlZFN0YXRlU2hhcGVXYXJuaW5nTWVzc2FnZShpbnB1dFN0YXRlLCByZWR1Y2VycywgYWN0aW9uLCB1bmV4cGVjdGVkS2V5Q2FjaGUpIHtcbiAgdmFyIHJlZHVjZXJLZXlzID0gT2JqZWN0LmtleXMocmVkdWNlcnMpO1xuICB2YXIgYXJndW1lbnROYW1lID0gYWN0aW9uICYmIGFjdGlvbi50eXBlID09PSBfY3JlYXRlU3RvcmUuQWN0aW9uVHlwZXMuSU5JVCA/ICdwcmVsb2FkZWRTdGF0ZSBhcmd1bWVudCBwYXNzZWQgdG8gY3JlYXRlU3RvcmUnIDogJ3ByZXZpb3VzIHN0YXRlIHJlY2VpdmVkIGJ5IHRoZSByZWR1Y2VyJztcblxuICBpZiAocmVkdWNlcktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdTdG9yZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgcmVkdWNlci4gTWFrZSBzdXJlIHRoZSBhcmd1bWVudCBwYXNzZWQgJyArICd0byBjb21iaW5lUmVkdWNlcnMgaXMgYW4gb2JqZWN0IHdob3NlIHZhbHVlcyBhcmUgcmVkdWNlcnMuJztcbiAgfVxuXG4gIGlmICghKDAsIF9pc1BsYWluT2JqZWN0MlsnZGVmYXVsdCddKShpbnB1dFN0YXRlKSkge1xuICAgIHJldHVybiAnVGhlICcgKyBhcmd1bWVudE5hbWUgKyAnIGhhcyB1bmV4cGVjdGVkIHR5cGUgb2YgXCInICsge30udG9TdHJpbmcuY2FsbChpbnB1dFN0YXRlKS5tYXRjaCgvXFxzKFthLXp8QS1aXSspLylbMV0gKyAnXCIuIEV4cGVjdGVkIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgJyArICgna2V5czogXCInICsgcmVkdWNlcktleXMuam9pbignXCIsIFwiJykgKyAnXCInKTtcbiAgfVxuXG4gIHZhciB1bmV4cGVjdGVkS2V5cyA9IE9iamVjdC5rZXlzKGlucHV0U3RhdGUpLmZpbHRlcihmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuICFyZWR1Y2Vycy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICF1bmV4cGVjdGVkS2V5Q2FjaGVba2V5XTtcbiAgfSk7XG5cbiAgdW5leHBlY3RlZEtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgdW5leHBlY3RlZEtleUNhY2hlW2tleV0gPSB0cnVlO1xuICB9KTtcblxuICBpZiAodW5leHBlY3RlZEtleXMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiAnVW5leHBlY3RlZCAnICsgKHVuZXhwZWN0ZWRLZXlzLmxlbmd0aCA+IDEgPyAna2V5cycgOiAna2V5JykgKyAnICcgKyAoJ1wiJyArIHVuZXhwZWN0ZWRLZXlzLmpvaW4oJ1wiLCBcIicpICsgJ1wiIGZvdW5kIGluICcgKyBhcmd1bWVudE5hbWUgKyAnLiAnKSArICdFeHBlY3RlZCB0byBmaW5kIG9uZSBvZiB0aGUga25vd24gcmVkdWNlciBrZXlzIGluc3RlYWQ6ICcgKyAoJ1wiJyArIHJlZHVjZXJLZXlzLmpvaW4oJ1wiLCBcIicpICsgJ1wiLiBVbmV4cGVjdGVkIGtleXMgd2lsbCBiZSBpZ25vcmVkLicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFJlZHVjZXJTYW5pdHkocmVkdWNlcnMpIHtcbiAgT2JqZWN0LmtleXMocmVkdWNlcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciByZWR1Y2VyID0gcmVkdWNlcnNba2V5XTtcbiAgICB2YXIgaW5pdGlhbFN0YXRlID0gcmVkdWNlcih1bmRlZmluZWQsIHsgdHlwZTogX2NyZWF0ZVN0b3JlLkFjdGlvblR5cGVzLklOSVQgfSk7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVkdWNlciBcIicgKyBrZXkgKyAnXCIgcmV0dXJuZWQgdW5kZWZpbmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4gJyArICdJZiB0aGUgc3RhdGUgcGFzc2VkIHRvIHRoZSByZWR1Y2VyIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgJyArICdleHBsaWNpdGx5IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZS4gVGhlIGluaXRpYWwgc3RhdGUgbWF5ICcgKyAnbm90IGJlIHVuZGVmaW5lZC4nKTtcbiAgICB9XG5cbiAgICB2YXIgdHlwZSA9ICdAQHJlZHV4L1BST0JFX1VOS05PV05fQUNUSU9OXycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNykuc3BsaXQoJycpLmpvaW4oJy4nKTtcbiAgICBpZiAodHlwZW9mIHJlZHVjZXIodW5kZWZpbmVkLCB7IHR5cGU6IHR5cGUgfSkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZHVjZXIgXCInICsga2V5ICsgJ1wiIHJldHVybmVkIHVuZGVmaW5lZCB3aGVuIHByb2JlZCB3aXRoIGEgcmFuZG9tIHR5cGUuICcgKyAoJ0RvblxcJ3QgdHJ5IHRvIGhhbmRsZSAnICsgX2NyZWF0ZVN0b3JlLkFjdGlvblR5cGVzLklOSVQgKyAnIG9yIG90aGVyIGFjdGlvbnMgaW4gXCJyZWR1eC8qXCIgJykgKyAnbmFtZXNwYWNlLiBUaGV5IGFyZSBjb25zaWRlcmVkIHByaXZhdGUuIEluc3RlYWQsIHlvdSBtdXN0IHJldHVybiB0aGUgJyArICdjdXJyZW50IHN0YXRlIGZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB1bmxlc3MgaXQgaXMgdW5kZWZpbmVkLCAnICsgJ2luIHdoaWNoIGNhc2UgeW91IG11c3QgcmV0dXJuIHRoZSBpbml0aWFsIHN0YXRlLCByZWdhcmRsZXNzIG9mIHRoZSAnICsgJ2FjdGlvbiB0eXBlLiBUaGUgaW5pdGlhbCBzdGF0ZSBtYXkgbm90IGJlIHVuZGVmaW5lZC4nKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFR1cm5zIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIGRpZmZlcmVudCByZWR1Y2VyIGZ1bmN0aW9ucywgaW50byBhIHNpbmdsZVxuICogcmVkdWNlciBmdW5jdGlvbi4gSXQgd2lsbCBjYWxsIGV2ZXJ5IGNoaWxkIHJlZHVjZXIsIGFuZCBnYXRoZXIgdGhlaXIgcmVzdWx0c1xuICogaW50byBhIHNpbmdsZSBzdGF0ZSBvYmplY3QsIHdob3NlIGtleXMgY29ycmVzcG9uZCB0byB0aGUga2V5cyBvZiB0aGUgcGFzc2VkXG4gKiByZWR1Y2VyIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcmVkdWNlcnMgQW4gb2JqZWN0IHdob3NlIHZhbHVlcyBjb3JyZXNwb25kIHRvIGRpZmZlcmVudFxuICogcmVkdWNlciBmdW5jdGlvbnMgdGhhdCBuZWVkIHRvIGJlIGNvbWJpbmVkIGludG8gb25lLiBPbmUgaGFuZHkgd2F5IHRvIG9idGFpblxuICogaXQgaXMgdG8gdXNlIEVTNiBgaW1wb3J0ICogYXMgcmVkdWNlcnNgIHN5bnRheC4gVGhlIHJlZHVjZXJzIG1heSBuZXZlciByZXR1cm5cbiAqIHVuZGVmaW5lZCBmb3IgYW55IGFjdGlvbi4gSW5zdGVhZCwgdGhleSBzaG91bGQgcmV0dXJuIHRoZWlyIGluaXRpYWwgc3RhdGVcbiAqIGlmIHRoZSBzdGF0ZSBwYXNzZWQgdG8gdGhlbSB3YXMgdW5kZWZpbmVkLCBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgZm9yIGFueVxuICogdW5yZWNvZ25pemVkIGFjdGlvbi5cbiAqXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IEEgcmVkdWNlciBmdW5jdGlvbiB0aGF0IGludm9rZXMgZXZlcnkgcmVkdWNlciBpbnNpZGUgdGhlXG4gKiBwYXNzZWQgb2JqZWN0LCBhbmQgYnVpbGRzIGEgc3RhdGUgb2JqZWN0IHdpdGggdGhlIHNhbWUgc2hhcGUuXG4gKi9cbmZ1bmN0aW9uIGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2Vycykge1xuICB2YXIgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7XG4gIHZhciBmaW5hbFJlZHVjZXJzID0ge307XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmVkdWNlcktleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0gcmVkdWNlcktleXNbaV07XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgKDAsIF93YXJuaW5nMlsnZGVmYXVsdCddKSgnTm8gcmVkdWNlciBwcm92aWRlZCBmb3Iga2V5IFwiJyArIGtleSArICdcIicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZmluYWxSZWR1Y2Vyc1trZXldID0gcmVkdWNlcnNba2V5XTtcbiAgICB9XG4gIH1cbiAgdmFyIGZpbmFsUmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhmaW5hbFJlZHVjZXJzKTtcblxuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICB2YXIgdW5leHBlY3RlZEtleUNhY2hlID0ge307XG4gIH1cblxuICB2YXIgc2FuaXR5RXJyb3I7XG4gIHRyeSB7XG4gICAgYXNzZXJ0UmVkdWNlclNhbml0eShmaW5hbFJlZHVjZXJzKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHNhbml0eUVycm9yID0gZTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiBjb21iaW5hdGlvbigpIHtcbiAgICB2YXIgc3RhdGUgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTtcbiAgICB2YXIgYWN0aW9uID0gYXJndW1lbnRzWzFdO1xuXG4gICAgaWYgKHNhbml0eUVycm9yKSB7XG4gICAgICB0aHJvdyBzYW5pdHlFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIHZhciB3YXJuaW5nTWVzc2FnZSA9IGdldFVuZXhwZWN0ZWRTdGF0ZVNoYXBlV2FybmluZ01lc3NhZ2Uoc3RhdGUsIGZpbmFsUmVkdWNlcnMsIGFjdGlvbiwgdW5leHBlY3RlZEtleUNhY2hlKTtcbiAgICAgIGlmICh3YXJuaW5nTWVzc2FnZSkge1xuICAgICAgICAoMCwgX3dhcm5pbmcyWydkZWZhdWx0J10pKHdhcm5pbmdNZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaGFzQ2hhbmdlZCA9IGZhbHNlO1xuICAgIHZhciBuZXh0U3RhdGUgPSB7fTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbmFsUmVkdWNlcktleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBmaW5hbFJlZHVjZXJLZXlzW2ldO1xuICAgICAgdmFyIHJlZHVjZXIgPSBmaW5hbFJlZHVjZXJzW2tleV07XG4gICAgICB2YXIgcHJldmlvdXNTdGF0ZUZvcktleSA9IHN0YXRlW2tleV07XG4gICAgICB2YXIgbmV4dFN0YXRlRm9yS2V5ID0gcmVkdWNlcihwcmV2aW91c1N0YXRlRm9yS2V5LCBhY3Rpb24pO1xuICAgICAgaWYgKHR5cGVvZiBuZXh0U3RhdGVGb3JLZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSBnZXRVbmRlZmluZWRTdGF0ZUVycm9yTWVzc2FnZShrZXksIGFjdGlvbik7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuICAgICAgbmV4dFN0YXRlW2tleV0gPSBuZXh0U3RhdGVGb3JLZXk7XG4gICAgICBoYXNDaGFuZ2VkID0gaGFzQ2hhbmdlZCB8fCBuZXh0U3RhdGVGb3JLZXkgIT09IHByZXZpb3VzU3RhdGVGb3JLZXk7XG4gICAgfVxuICAgIHJldHVybiBoYXNDaGFuZ2VkID8gbmV4dFN0YXRlIDogc3RhdGU7XG4gIH07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGNvbXBvc2U7XG4vKipcbiAqIENvbXBvc2VzIHNpbmdsZS1hcmd1bWVudCBmdW5jdGlvbnMgZnJvbSByaWdodCB0byBsZWZ0LiBUaGUgcmlnaHRtb3N0XG4gKiBmdW5jdGlvbiBjYW4gdGFrZSBtdWx0aXBsZSBhcmd1bWVudHMgYXMgaXQgcHJvdmlkZXMgdGhlIHNpZ25hdHVyZSBmb3JcbiAqIHRoZSByZXN1bHRpbmcgY29tcG9zaXRlIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7Li4uRnVuY3Rpb259IGZ1bmNzIFRoZSBmdW5jdGlvbnMgdG8gY29tcG9zZS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiBvYnRhaW5lZCBieSBjb21wb3NpbmcgdGhlIGFyZ3VtZW50IGZ1bmN0aW9uc1xuICogZnJvbSByaWdodCB0byBsZWZ0LiBGb3IgZXhhbXBsZSwgY29tcG9zZShmLCBnLCBoKSBpcyBpZGVudGljYWwgdG8gZG9pbmdcbiAqICguLi5hcmdzKSA9PiBmKGcoaCguLi5hcmdzKSkpLlxuICovXG5cbmZ1bmN0aW9uIGNvbXBvc2UoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBmdW5jcyA9IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGZ1bmNzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgaWYgKGZ1bmNzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICByZXR1cm4gYXJnO1xuICAgIH07XG4gIH1cblxuICBpZiAoZnVuY3MubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGZ1bmNzWzBdO1xuICB9XG5cbiAgdmFyIGxhc3QgPSBmdW5jc1tmdW5jcy5sZW5ndGggLSAxXTtcbiAgdmFyIHJlc3QgPSBmdW5jcy5zbGljZSgwLCAtMSk7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHJlc3QucmVkdWNlUmlnaHQoZnVuY3Rpb24gKGNvbXBvc2VkLCBmKSB7XG4gICAgICByZXR1cm4gZihjb21wb3NlZCk7XG4gICAgfSwgbGFzdC5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cykpO1xuICB9O1xufSIsIid1c2Ugc3RyaWN0JztcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcbmV4cG9ydHMuQWN0aW9uVHlwZXMgPSB1bmRlZmluZWQ7XG5leHBvcnRzWydkZWZhdWx0J10gPSBjcmVhdGVTdG9yZTtcblxudmFyIF9pc1BsYWluT2JqZWN0ID0gcmVxdWlyZSgnbG9kYXNoL2lzUGxhaW5PYmplY3QnKTtcblxudmFyIF9pc1BsYWluT2JqZWN0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2lzUGxhaW5PYmplY3QpO1xuXG52YXIgX3N5bWJvbE9ic2VydmFibGUgPSByZXF1aXJlKCdzeW1ib2wtb2JzZXJ2YWJsZScpO1xuXG52YXIgX3N5bWJvbE9ic2VydmFibGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfc3ltYm9sT2JzZXJ2YWJsZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7ICdkZWZhdWx0Jzogb2JqIH07IH1cblxuLyoqXG4gKiBUaGVzZSBhcmUgcHJpdmF0ZSBhY3Rpb24gdHlwZXMgcmVzZXJ2ZWQgYnkgUmVkdXguXG4gKiBGb3IgYW55IHVua25vd24gYWN0aW9ucywgeW91IG11c3QgcmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlLlxuICogSWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgdW5kZWZpbmVkLCB5b3UgbXVzdCByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUuXG4gKiBEbyBub3QgcmVmZXJlbmNlIHRoZXNlIGFjdGlvbiB0eXBlcyBkaXJlY3RseSBpbiB5b3VyIGNvZGUuXG4gKi9cbnZhciBBY3Rpb25UeXBlcyA9IGV4cG9ydHMuQWN0aW9uVHlwZXMgPSB7XG4gIElOSVQ6ICdAQHJlZHV4L0lOSVQnXG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBSZWR1eCBzdG9yZSB0aGF0IGhvbGRzIHRoZSBzdGF0ZSB0cmVlLlxuICogVGhlIG9ubHkgd2F5IHRvIGNoYW5nZSB0aGUgZGF0YSBpbiB0aGUgc3RvcmUgaXMgdG8gY2FsbCBgZGlzcGF0Y2goKWAgb24gaXQuXG4gKlxuICogVGhlcmUgc2hvdWxkIG9ubHkgYmUgYSBzaW5nbGUgc3RvcmUgaW4geW91ciBhcHAuIFRvIHNwZWNpZnkgaG93IGRpZmZlcmVudFxuICogcGFydHMgb2YgdGhlIHN0YXRlIHRyZWUgcmVzcG9uZCB0byBhY3Rpb25zLCB5b3UgbWF5IGNvbWJpbmUgc2V2ZXJhbCByZWR1Y2Vyc1xuICogaW50byBhIHNpbmdsZSByZWR1Y2VyIGZ1bmN0aW9uIGJ5IHVzaW5nIGBjb21iaW5lUmVkdWNlcnNgLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHJlZHVjZXIgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIG5leHQgc3RhdGUgdHJlZSwgZ2l2ZW5cbiAqIHRoZSBjdXJyZW50IHN0YXRlIHRyZWUgYW5kIHRoZSBhY3Rpb24gdG8gaGFuZGxlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBbcHJlbG9hZGVkU3RhdGVdIFRoZSBpbml0aWFsIHN0YXRlLiBZb3UgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBpdFxuICogdG8gaHlkcmF0ZSB0aGUgc3RhdGUgZnJvbSB0aGUgc2VydmVyIGluIHVuaXZlcnNhbCBhcHBzLCBvciB0byByZXN0b3JlIGFcbiAqIHByZXZpb3VzbHkgc2VyaWFsaXplZCB1c2VyIHNlc3Npb24uXG4gKiBJZiB5b3UgdXNlIGBjb21iaW5lUmVkdWNlcnNgIHRvIHByb2R1Y2UgdGhlIHJvb3QgcmVkdWNlciBmdW5jdGlvbiwgdGhpcyBtdXN0IGJlXG4gKiBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBzaGFwZSBhcyBgY29tYmluZVJlZHVjZXJzYCBrZXlzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVuaGFuY2VyIFRoZSBzdG9yZSBlbmhhbmNlci4gWW91IG1heSBvcHRpb25hbGx5IHNwZWNpZnkgaXRcbiAqIHRvIGVuaGFuY2UgdGhlIHN0b3JlIHdpdGggdGhpcmQtcGFydHkgY2FwYWJpbGl0aWVzIHN1Y2ggYXMgbWlkZGxld2FyZSxcbiAqIHRpbWUgdHJhdmVsLCBwZXJzaXN0ZW5jZSwgZXRjLiBUaGUgb25seSBzdG9yZSBlbmhhbmNlciB0aGF0IHNoaXBzIHdpdGggUmVkdXhcbiAqIGlzIGBhcHBseU1pZGRsZXdhcmUoKWAuXG4gKlxuICogQHJldHVybnMge1N0b3JlfSBBIFJlZHV4IHN0b3JlIHRoYXQgbGV0cyB5b3UgcmVhZCB0aGUgc3RhdGUsIGRpc3BhdGNoIGFjdGlvbnNcbiAqIGFuZCBzdWJzY3JpYmUgdG8gY2hhbmdlcy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3RvcmUocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUsIGVuaGFuY2VyKSB7XG4gIHZhciBfcmVmMjtcblxuICBpZiAodHlwZW9mIHByZWxvYWRlZFN0YXRlID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBlbmhhbmNlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBlbmhhbmNlciA9IHByZWxvYWRlZFN0YXRlO1xuICAgIHByZWxvYWRlZFN0YXRlID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBpZiAodHlwZW9mIGVuaGFuY2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRoZSBlbmhhbmNlciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlcihjcmVhdGVTdG9yZSkocmVkdWNlciwgcHJlbG9hZGVkU3RhdGUpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZWR1Y2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0aGUgcmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgdmFyIGN1cnJlbnRSZWR1Y2VyID0gcmVkdWNlcjtcbiAgdmFyIGN1cnJlbnRTdGF0ZSA9IHByZWxvYWRlZFN0YXRlO1xuICB2YXIgY3VycmVudExpc3RlbmVycyA9IFtdO1xuICB2YXIgbmV4dExpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnM7XG4gIHZhciBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpIHtcbiAgICBpZiAobmV4dExpc3RlbmVycyA9PT0gY3VycmVudExpc3RlbmVycykge1xuICAgICAgbmV4dExpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnMuc2xpY2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgdGhlIHN0YXRlIHRyZWUgbWFuYWdlZCBieSB0aGUgc3RvcmUuXG4gICAqXG4gICAqIEByZXR1cm5zIHthbnl9IFRoZSBjdXJyZW50IHN0YXRlIHRyZWUgb2YgeW91ciBhcHBsaWNhdGlvbi5cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0YXRlKCkge1xuICAgIHJldHVybiBjdXJyZW50U3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNoYW5nZSBsaXN0ZW5lci4gSXQgd2lsbCBiZSBjYWxsZWQgYW55IHRpbWUgYW4gYWN0aW9uIGlzIGRpc3BhdGNoZWQsXG4gICAqIGFuZCBzb21lIHBhcnQgb2YgdGhlIHN0YXRlIHRyZWUgbWF5IHBvdGVudGlhbGx5IGhhdmUgY2hhbmdlZC4gWW91IG1heSB0aGVuXG4gICAqIGNhbGwgYGdldFN0YXRlKClgIHRvIHJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgdHJlZSBpbnNpZGUgdGhlIGNhbGxiYWNrLlxuICAgKlxuICAgKiBZb3UgbWF5IGNhbGwgYGRpc3BhdGNoKClgIGZyb20gYSBjaGFuZ2UgbGlzdGVuZXIsIHdpdGggdGhlIGZvbGxvd2luZ1xuICAgKiBjYXZlYXRzOlxuICAgKlxuICAgKiAxLiBUaGUgc3Vic2NyaXB0aW9ucyBhcmUgc25hcHNob3R0ZWQganVzdCBiZWZvcmUgZXZlcnkgYGRpc3BhdGNoKClgIGNhbGwuXG4gICAqIElmIHlvdSBzdWJzY3JpYmUgb3IgdW5zdWJzY3JpYmUgd2hpbGUgdGhlIGxpc3RlbmVycyBhcmUgYmVpbmcgaW52b2tlZCwgdGhpc1xuICAgKiB3aWxsIG5vdCBoYXZlIGFueSBlZmZlY3Qgb24gdGhlIGBkaXNwYXRjaCgpYCB0aGF0IGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcy5cbiAgICogSG93ZXZlciwgdGhlIG5leHQgYGRpc3BhdGNoKClgIGNhbGwsIHdoZXRoZXIgbmVzdGVkIG9yIG5vdCwgd2lsbCB1c2UgYSBtb3JlXG4gICAqIHJlY2VudCBzbmFwc2hvdCBvZiB0aGUgc3Vic2NyaXB0aW9uIGxpc3QuXG4gICAqXG4gICAqIDIuIFRoZSBsaXN0ZW5lciBzaG91bGQgbm90IGV4cGVjdCB0byBzZWUgYWxsIHN0YXRlIGNoYW5nZXMsIGFzIHRoZSBzdGF0ZVxuICAgKiBtaWdodCBoYXZlIGJlZW4gdXBkYXRlZCBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgYSBuZXN0ZWQgYGRpc3BhdGNoKClgIGJlZm9yZVxuICAgKiB0aGUgbGlzdGVuZXIgaXMgY2FsbGVkLiBJdCBpcywgaG93ZXZlciwgZ3VhcmFudGVlZCB0aGF0IGFsbCBzdWJzY3JpYmVyc1xuICAgKiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgYGRpc3BhdGNoKClgIHN0YXJ0ZWQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgbGF0ZXN0XG4gICAqIHN0YXRlIGJ5IHRoZSB0aW1lIGl0IGV4aXRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBBIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgb24gZXZlcnkgZGlzcGF0Y2guXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiB0byByZW1vdmUgdGhpcyBjaGFuZ2UgbGlzdGVuZXIuXG4gICAqL1xuICBmdW5jdGlvbiBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGxpc3RlbmVyIHRvIGJlIGEgZnVuY3Rpb24uJyk7XG4gICAgfVxuXG4gICAgdmFyIGlzU3Vic2NyaWJlZCA9IHRydWU7XG5cbiAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgbmV4dExpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblxuICAgIHJldHVybiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHtcbiAgICAgIGlmICghaXNTdWJzY3JpYmVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaXNTdWJzY3JpYmVkID0gZmFsc2U7XG5cbiAgICAgIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKTtcbiAgICAgIHZhciBpbmRleCA9IG5leHRMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICBuZXh0TGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGFjdGlvbi4gSXQgaXMgdGhlIG9ubHkgd2F5IHRvIHRyaWdnZXIgYSBzdGF0ZSBjaGFuZ2UuXG4gICAqXG4gICAqIFRoZSBgcmVkdWNlcmAgZnVuY3Rpb24sIHVzZWQgdG8gY3JlYXRlIHRoZSBzdG9yZSwgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGVcbiAgICogY3VycmVudCBzdGF0ZSB0cmVlIGFuZCB0aGUgZ2l2ZW4gYGFjdGlvbmAuIEl0cyByZXR1cm4gdmFsdWUgd2lsbFxuICAgKiBiZSBjb25zaWRlcmVkIHRoZSAqKm5leHQqKiBzdGF0ZSBvZiB0aGUgdHJlZSwgYW5kIHRoZSBjaGFuZ2UgbGlzdGVuZXJzXG4gICAqIHdpbGwgYmUgbm90aWZpZWQuXG4gICAqXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgcGxhaW4gb2JqZWN0IGFjdGlvbnMuIElmIHlvdSB3YW50IHRvXG4gICAqIGRpc3BhdGNoIGEgUHJvbWlzZSwgYW4gT2JzZXJ2YWJsZSwgYSB0aHVuaywgb3Igc29tZXRoaW5nIGVsc2UsIHlvdSBuZWVkIHRvXG4gICAqIHdyYXAgeW91ciBzdG9yZSBjcmVhdGluZyBmdW5jdGlvbiBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIG1pZGRsZXdhcmUuIEZvclxuICAgKiBleGFtcGxlLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBgcmVkdXgtdGh1bmtgIHBhY2thZ2UuIEV2ZW4gdGhlXG4gICAqIG1pZGRsZXdhcmUgd2lsbCBldmVudHVhbGx5IGRpc3BhdGNoIHBsYWluIG9iamVjdCBhY3Rpb25zIHVzaW5nIHRoaXMgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gYWN0aW9uIEEgcGxhaW4gb2JqZWN0IHJlcHJlc2VudGluZyDigJx3aGF0IGNoYW5nZWTigJ0uIEl0IGlzXG4gICAqIGEgZ29vZCBpZGVhIHRvIGtlZXAgYWN0aW9ucyBzZXJpYWxpemFibGUgc28geW91IGNhbiByZWNvcmQgYW5kIHJlcGxheSB1c2VyXG4gICAqIHNlc3Npb25zLCBvciB1c2UgdGhlIHRpbWUgdHJhdmVsbGluZyBgcmVkdXgtZGV2dG9vbHNgLiBBbiBhY3Rpb24gbXVzdCBoYXZlXG4gICAqIGEgYHR5cGVgIHByb3BlcnR5IHdoaWNoIG1heSBub3QgYmUgYHVuZGVmaW5lZGAuIEl0IGlzIGEgZ29vZCBpZGVhIHRvIHVzZVxuICAgKiBzdHJpbmcgY29uc3RhbnRzIGZvciBhY3Rpb24gdHlwZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtPYmplY3R9IEZvciBjb252ZW5pZW5jZSwgdGhlIHNhbWUgYWN0aW9uIG9iamVjdCB5b3UgZGlzcGF0Y2hlZC5cbiAgICpcbiAgICogTm90ZSB0aGF0LCBpZiB5b3UgdXNlIGEgY3VzdG9tIG1pZGRsZXdhcmUsIGl0IG1heSB3cmFwIGBkaXNwYXRjaCgpYCB0b1xuICAgKiByZXR1cm4gc29tZXRoaW5nIGVsc2UgKGZvciBleGFtcGxlLCBhIFByb21pc2UgeW91IGNhbiBhd2FpdCkuXG4gICAqL1xuICBmdW5jdGlvbiBkaXNwYXRjaChhY3Rpb24pIHtcbiAgICBpZiAoISgwLCBfaXNQbGFpbk9iamVjdDJbJ2RlZmF1bHQnXSkoYWN0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBY3Rpb25zIG11c3QgYmUgcGxhaW4gb2JqZWN0cy4gJyArICdVc2UgY3VzdG9tIG1pZGRsZXdhcmUgZm9yIGFzeW5jIGFjdGlvbnMuJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBhY3Rpb24udHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWN0aW9ucyBtYXkgbm90IGhhdmUgYW4gdW5kZWZpbmVkIFwidHlwZVwiIHByb3BlcnR5LiAnICsgJ0hhdmUgeW91IG1pc3NwZWxsZWQgYSBjb25zdGFudD8nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWR1Y2VycyBtYXkgbm90IGRpc3BhdGNoIGFjdGlvbnMuJyk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlzRGlzcGF0Y2hpbmcgPSB0cnVlO1xuICAgICAgY3VycmVudFN0YXRlID0gY3VycmVudFJlZHVjZXIoY3VycmVudFN0YXRlLCBhY3Rpb24pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpc0Rpc3BhdGNoaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGxpc3RlbmVycyA9IGN1cnJlbnRMaXN0ZW5lcnMgPSBuZXh0TGlzdGVuZXJzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsaXN0ZW5lcnNbaV0oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIHRoZSByZWR1Y2VyIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBzdG9yZSB0byBjYWxjdWxhdGUgdGhlIHN0YXRlLlxuICAgKlxuICAgKiBZb3UgbWlnaHQgbmVlZCB0aGlzIGlmIHlvdXIgYXBwIGltcGxlbWVudHMgY29kZSBzcGxpdHRpbmcgYW5kIHlvdSB3YW50IHRvXG4gICAqIGxvYWQgc29tZSBvZiB0aGUgcmVkdWNlcnMgZHluYW1pY2FsbHkuIFlvdSBtaWdodCBhbHNvIG5lZWQgdGhpcyBpZiB5b3VcbiAgICogaW1wbGVtZW50IGEgaG90IHJlbG9hZGluZyBtZWNoYW5pc20gZm9yIFJlZHV4LlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXh0UmVkdWNlciBUaGUgcmVkdWNlciBmb3IgdGhlIHN0b3JlIHRvIHVzZSBpbnN0ZWFkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VSZWR1Y2VyKG5leHRSZWR1Y2VyKSB7XG4gICAgaWYgKHR5cGVvZiBuZXh0UmVkdWNlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0aGUgbmV4dFJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBjdXJyZW50UmVkdWNlciA9IG5leHRSZWR1Y2VyO1xuICAgIGRpc3BhdGNoKHsgdHlwZTogQWN0aW9uVHlwZXMuSU5JVCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm9wZXJhYmlsaXR5IHBvaW50IGZvciBvYnNlcnZhYmxlL3JlYWN0aXZlIGxpYnJhcmllcy5cbiAgICogQHJldHVybnMge29ic2VydmFibGV9IEEgbWluaW1hbCBvYnNlcnZhYmxlIG9mIHN0YXRlIGNoYW5nZXMuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIG9ic2VydmFibGUgcHJvcG9zYWw6XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS96ZW5wYXJzaW5nL2VzLW9ic2VydmFibGVcbiAgICovXG4gIGZ1bmN0aW9uIG9ic2VydmFibGUoKSB7XG4gICAgdmFyIF9yZWY7XG5cbiAgICB2YXIgb3V0ZXJTdWJzY3JpYmUgPSBzdWJzY3JpYmU7XG4gICAgcmV0dXJuIF9yZWYgPSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBtaW5pbWFsIG9ic2VydmFibGUgc3Vic2NyaXB0aW9uIG1ldGhvZC5cbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYnNlcnZlciBBbnkgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gb2JzZXJ2ZXIuXG4gICAgICAgKiBUaGUgb2JzZXJ2ZXIgb2JqZWN0IHNob3VsZCBoYXZlIGEgYG5leHRgIG1ldGhvZC5cbiAgICAgICAqIEByZXR1cm5zIHtzdWJzY3JpcHRpb259IEFuIG9iamVjdCB3aXRoIGFuIGB1bnN1YnNjcmliZWAgbWV0aG9kIHRoYXQgY2FuXG4gICAgICAgKiBiZSB1c2VkIHRvIHVuc3Vic2NyaWJlIHRoZSBvYnNlcnZhYmxlIGZyb20gdGhlIHN0b3JlLCBhbmQgcHJldmVudCBmdXJ0aGVyXG4gICAgICAgKiBlbWlzc2lvbiBvZiB2YWx1ZXMgZnJvbSB0aGUgb2JzZXJ2YWJsZS5cbiAgICAgICAqL1xuICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbiBzdWJzY3JpYmUob2JzZXJ2ZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYnNlcnZlciAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCB0aGUgb2JzZXJ2ZXIgdG8gYmUgYW4gb2JqZWN0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gb2JzZXJ2ZVN0YXRlKCkge1xuICAgICAgICAgIGlmIChvYnNlcnZlci5uZXh0KSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KGdldFN0YXRlKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVTdGF0ZSgpO1xuICAgICAgICB2YXIgdW5zdWJzY3JpYmUgPSBvdXRlclN1YnNjcmliZShvYnNlcnZlU3RhdGUpO1xuICAgICAgICByZXR1cm4geyB1bnN1YnNjcmliZTogdW5zdWJzY3JpYmUgfTtcbiAgICAgIH1cbiAgICB9LCBfcmVmW19zeW1ib2xPYnNlcnZhYmxlMlsnZGVmYXVsdCddXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sIF9yZWY7XG4gIH1cblxuICAvLyBXaGVuIGEgc3RvcmUgaXMgY3JlYXRlZCwgYW4gXCJJTklUXCIgYWN0aW9uIGlzIGRpc3BhdGNoZWQgc28gdGhhdCBldmVyeVxuICAvLyByZWR1Y2VyIHJldHVybnMgdGhlaXIgaW5pdGlhbCBzdGF0ZS4gVGhpcyBlZmZlY3RpdmVseSBwb3B1bGF0ZXNcbiAgLy8gdGhlIGluaXRpYWwgc3RhdGUgdHJlZS5cbiAgZGlzcGF0Y2goeyB0eXBlOiBBY3Rpb25UeXBlcy5JTklUIH0pO1xuXG4gIHJldHVybiBfcmVmMiA9IHtcbiAgICBkaXNwYXRjaDogZGlzcGF0Y2gsXG4gICAgc3Vic2NyaWJlOiBzdWJzY3JpYmUsXG4gICAgZ2V0U3RhdGU6IGdldFN0YXRlLFxuICAgIHJlcGxhY2VSZWR1Y2VyOiByZXBsYWNlUmVkdWNlclxuICB9LCBfcmVmMltfc3ltYm9sT2JzZXJ2YWJsZTJbJ2RlZmF1bHQnXV0gPSBvYnNlcnZhYmxlLCBfcmVmMjtcbn0iLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLmNvbXBvc2UgPSBleHBvcnRzLmFwcGx5TWlkZGxld2FyZSA9IGV4cG9ydHMuYmluZEFjdGlvbkNyZWF0b3JzID0gZXhwb3J0cy5jb21iaW5lUmVkdWNlcnMgPSBleHBvcnRzLmNyZWF0ZVN0b3JlID0gdW5kZWZpbmVkO1xuXG52YXIgX2NyZWF0ZVN0b3JlID0gcmVxdWlyZSgnLi9jcmVhdGVTdG9yZScpO1xuXG52YXIgX2NyZWF0ZVN0b3JlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2NyZWF0ZVN0b3JlKTtcblxudmFyIF9jb21iaW5lUmVkdWNlcnMgPSByZXF1aXJlKCcuL2NvbWJpbmVSZWR1Y2VycycpO1xuXG52YXIgX2NvbWJpbmVSZWR1Y2VyczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb21iaW5lUmVkdWNlcnMpO1xuXG52YXIgX2JpbmRBY3Rpb25DcmVhdG9ycyA9IHJlcXVpcmUoJy4vYmluZEFjdGlvbkNyZWF0b3JzJyk7XG5cbnZhciBfYmluZEFjdGlvbkNyZWF0b3JzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2JpbmRBY3Rpb25DcmVhdG9ycyk7XG5cbnZhciBfYXBwbHlNaWRkbGV3YXJlID0gcmVxdWlyZSgnLi9hcHBseU1pZGRsZXdhcmUnKTtcblxudmFyIF9hcHBseU1pZGRsZXdhcmUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfYXBwbHlNaWRkbGV3YXJlKTtcblxudmFyIF9jb21wb3NlID0gcmVxdWlyZSgnLi9jb21wb3NlJyk7XG5cbnZhciBfY29tcG9zZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jb21wb3NlKTtcblxudmFyIF93YXJuaW5nID0gcmVxdWlyZSgnLi91dGlscy93YXJuaW5nJyk7XG5cbnZhciBfd2FybmluZzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF93YXJuaW5nKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgJ2RlZmF1bHQnOiBvYmogfTsgfVxuXG4vKlxuKiBUaGlzIGlzIGEgZHVtbXkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGZ1bmN0aW9uIG5hbWUgaGFzIGJlZW4gYWx0ZXJlZCBieSBtaW5pZmljYXRpb24uXG4qIElmIHRoZSBmdW5jdGlvbiBoYXMgYmVlbiBtaW5pZmllZCBhbmQgTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJywgd2FybiB0aGUgdXNlci5cbiovXG5mdW5jdGlvbiBpc0NydXNoZWQoKSB7fVxuXG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicgJiYgdHlwZW9mIGlzQ3J1c2hlZC5uYW1lID09PSAnc3RyaW5nJyAmJiBpc0NydXNoZWQubmFtZSAhPT0gJ2lzQ3J1c2hlZCcpIHtcbiAgKDAsIF93YXJuaW5nMlsnZGVmYXVsdCddKSgnWW91IGFyZSBjdXJyZW50bHkgdXNpbmcgbWluaWZpZWQgY29kZSBvdXRzaWRlIG9mIE5PREVfRU5WID09PSBcXCdwcm9kdWN0aW9uXFwnLiAnICsgJ1RoaXMgbWVhbnMgdGhhdCB5b3UgYXJlIHJ1bm5pbmcgYSBzbG93ZXIgZGV2ZWxvcG1lbnQgYnVpbGQgb2YgUmVkdXguICcgKyAnWW91IGNhbiB1c2UgbG9vc2UtZW52aWZ5IChodHRwczovL2dpdGh1Yi5jb20vemVydG9zaC9sb29zZS1lbnZpZnkpIGZvciBicm93c2VyaWZ5ICcgKyAnb3IgRGVmaW5lUGx1Z2luIGZvciB3ZWJwYWNrIChodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzMwMDMwMDMxKSAnICsgJ3RvIGVuc3VyZSB5b3UgaGF2ZSB0aGUgY29ycmVjdCBjb2RlIGZvciB5b3VyIHByb2R1Y3Rpb24gYnVpbGQuJyk7XG59XG5cbmV4cG9ydHMuY3JlYXRlU3RvcmUgPSBfY3JlYXRlU3RvcmUyWydkZWZhdWx0J107XG5leHBvcnRzLmNvbWJpbmVSZWR1Y2VycyA9IF9jb21iaW5lUmVkdWNlcnMyWydkZWZhdWx0J107XG5leHBvcnRzLmJpbmRBY3Rpb25DcmVhdG9ycyA9IF9iaW5kQWN0aW9uQ3JlYXRvcnMyWydkZWZhdWx0J107XG5leHBvcnRzLmFwcGx5TWlkZGxld2FyZSA9IF9hcHBseU1pZGRsZXdhcmUyWydkZWZhdWx0J107XG5leHBvcnRzLmNvbXBvc2UgPSBfY29tcG9zZTJbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzWydkZWZhdWx0J10gPSB3YXJuaW5nO1xuLyoqXG4gKiBQcmludHMgYSB3YXJuaW5nIGluIHRoZSBjb25zb2xlIGlmIGl0IGV4aXN0cy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBUaGUgd2FybmluZyBtZXNzYWdlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHdhcm5pbmcobWVzc2FnZSkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICB9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tY29uc29sZSAqL1xuICB0cnkge1xuICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgaWYgeW91IGVuYWJsZVxuICAgIC8vIFwiYnJlYWsgb24gYWxsIGV4Y2VwdGlvbnNcIiBpbiB5b3VyIGNvbnNvbGUsXG4gICAgLy8gaXQgd291bGQgcGF1c2UgdGhlIGV4ZWN1dGlvbiBhdCB0aGlzIGxpbmUuXG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWVtcHR5ICovXG4gIH0gY2F0Y2ggKGUpIHt9XG4gIC8qIGVzbGludC1lbmFibGUgbm8tZW1wdHkgKi9cbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2luZGV4Jyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfcG9ueWZpbGwgPSByZXF1aXJlKCcuL3BvbnlmaWxsJyk7XG5cbnZhciBfcG9ueWZpbGwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcG9ueWZpbGwpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyAnZGVmYXVsdCc6IG9iaiB9OyB9XG5cbnZhciByb290OyAvKiBnbG9iYWwgd2luZG93ICovXG5cblxuaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xuICByb290ID0gc2VsZjtcbn0gZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgcm9vdCA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgcm9vdCA9IGdsb2JhbDtcbn0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgcm9vdCA9IG1vZHVsZTtcbn0gZWxzZSB7XG4gIHJvb3QgPSBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xufVxuXG52YXIgcmVzdWx0ID0gKDAsIF9wb255ZmlsbDJbJ2RlZmF1bHQnXSkocm9vdCk7XG5leHBvcnRzWydkZWZhdWx0J10gPSByZXN1bHQ7IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcblx0dmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0c1snZGVmYXVsdCddID0gc3ltYm9sT2JzZXJ2YWJsZVBvbnlmaWxsO1xuZnVuY3Rpb24gc3ltYm9sT2JzZXJ2YWJsZVBvbnlmaWxsKHJvb3QpIHtcblx0dmFyIHJlc3VsdDtcblx0dmFyIF9TeW1ib2wgPSByb290LlN5bWJvbDtcblxuXHRpZiAodHlwZW9mIF9TeW1ib2wgPT09ICdmdW5jdGlvbicpIHtcblx0XHRpZiAoX1N5bWJvbC5vYnNlcnZhYmxlKSB7XG5cdFx0XHRyZXN1bHQgPSBfU3ltYm9sLm9ic2VydmFibGU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdCA9IF9TeW1ib2woJ29ic2VydmFibGUnKTtcblx0XHRcdF9TeW1ib2wub2JzZXJ2YWJsZSA9IHJlc3VsdDtcblx0XHR9XG5cdH0gZWxzZSB7XG5cdFx0cmVzdWx0ID0gJ0BAb2JzZXJ2YWJsZSc7XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07XG5cbmV4cG9ydHMuZGVmYXVsdCA9IGNyZWF0ZVVuY29udHJvbGxhYmxlO1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfaW52YXJpYW50ID0gcmVxdWlyZSgnaW52YXJpYW50Jyk7XG5cbnZhciBfaW52YXJpYW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ludmFyaWFudCk7XG5cbnZhciBfdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciB1dGlscyA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKF91dGlscyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKG9iaikgeyBpZiAob2JqICYmIG9iai5fX2VzTW9kdWxlKSB7IHJldHVybiBvYmo7IH0gZWxzZSB7IHZhciBuZXdPYmogPSB7fTsgaWYgKG9iaiAhPSBudWxsKSB7IGZvciAodmFyIGtleSBpbiBvYmopIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIG5ld09ialtrZXldID0gb2JqW2tleV07IH0gfSBuZXdPYmouZGVmYXVsdCA9IG9iajsgcmV0dXJuIG5ld09iajsgfSB9XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHsgaWYgKCFzZWxmKSB7IHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTsgfSByZXR1cm4gY2FsbCAmJiAodHlwZW9mIGNhbGwgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhbGwgPT09IFwiZnVuY3Rpb25cIikgPyBjYWxsIDogc2VsZjsgfVxuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCBcIiArIHR5cGVvZiBzdXBlckNsYXNzKTsgfSBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IHsgdmFsdWU6IHN1YkNsYXNzLCBlbnVtZXJhYmxlOiBmYWxzZSwgd3JpdGFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9IH0pOyBpZiAoc3VwZXJDbGFzcykgT2JqZWN0LnNldFByb3RvdHlwZU9mID8gT2JqZWN0LnNldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKSA6IHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7IH1cblxuZnVuY3Rpb24gY3JlYXRlVW5jb250cm9sbGFibGUobWl4aW4sIHNldCkge1xuXG4gIHJldHVybiB1bmNvbnRyb2xsYWJsZTtcblxuICBmdW5jdGlvbiB1bmNvbnRyb2xsYWJsZShDb21wb25lbnQsIGNvbnRyb2xsZWRWYWx1ZXMpIHtcbiAgICB2YXIgX2NsYXNzLCBfdGVtcDtcblxuICAgIHZhciBtZXRob2RzID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBbXTtcblxuICAgIHZhciBkaXNwbGF5TmFtZSA9IENvbXBvbmVudC5kaXNwbGF5TmFtZSB8fCBDb21wb25lbnQubmFtZSB8fCAnQ29tcG9uZW50JyxcbiAgICAgICAgYmFzZVByb3BUeXBlcyA9IHV0aWxzLmdldFR5cGUoQ29tcG9uZW50KS5wcm9wVHlwZXMsXG4gICAgICAgIGlzQ29tcG9zaXRlQ29tcG9uZW50ID0gdXRpbHMuaXNSZWFjdENvbXBvbmVudChDb21wb25lbnQpLFxuICAgICAgICBjb250cm9sbGVkUHJvcHMgPSBPYmplY3Qua2V5cyhjb250cm9sbGVkVmFsdWVzKSxcbiAgICAgICAgcHJvcFR5cGVzO1xuXG4gICAgdmFyIE9NSVRfUFJPUFMgPSBbJ3ZhbHVlTGluaycsICdjaGVja2VkTGluayddLmNvbmNhdChjb250cm9sbGVkUHJvcHMubWFwKHV0aWxzLmRlZmF1bHRLZXkpKTtcblxuICAgIHByb3BUeXBlcyA9IHV0aWxzLnVuY29udHJvbGxlZFByb3BUeXBlcyhjb250cm9sbGVkVmFsdWVzLCBiYXNlUHJvcFR5cGVzLCBkaXNwbGF5TmFtZSk7XG5cbiAgICAoMCwgX2ludmFyaWFudDIuZGVmYXVsdCkoaXNDb21wb3NpdGVDb21wb25lbnQgfHwgIW1ldGhvZHMubGVuZ3RoLCAnW3VuY29udHJvbGxhYmxlXSBzdGF0ZWxlc3MgZnVuY3Rpb24gY29tcG9uZW50cyBjYW5ub3QgcGFzcyB0aHJvdWdoIG1ldGhvZHMgJyArICdiZWNhdXNlIHRoZXkgaGF2ZSBubyBhc3NvY2lhdGVkIGluc3RhbmNlcy4gQ2hlY2sgY29tcG9uZW50OiAnICsgZGlzcGxheU5hbWUgKyAnLCAnICsgJ2F0dGVtcHRpbmcgdG8gcGFzcyB0aHJvdWdoIG1ldGhvZHM6ICcgKyBtZXRob2RzLmpvaW4oJywgJykpO1xuXG4gICAgbWV0aG9kcyA9IHV0aWxzLnRyYW5zZm9ybShtZXRob2RzLCBmdW5jdGlvbiAob2JqLCBtZXRob2QpIHtcbiAgICAgIG9ialttZXRob2RdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3JlZnMkaW5uZXI7XG5cbiAgICAgICAgcmV0dXJuIChfcmVmcyRpbm5lciA9IHRoaXMucmVmcy5pbm5lcilbbWV0aG9kXS5hcHBseShfcmVmcyRpbm5lciwgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfSwge30pO1xuXG4gICAgdmFyIGNvbXBvbmVudCA9IChfdGVtcCA9IF9jbGFzcyA9IGZ1bmN0aW9uIChfUmVhY3QkQ29tcG9uZW50KSB7XG4gICAgICBfaW5oZXJpdHMoY29tcG9uZW50LCBfUmVhY3QkQ29tcG9uZW50KTtcblxuICAgICAgZnVuY3Rpb24gY29tcG9uZW50KCkge1xuICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgY29tcG9uZW50KTtcblxuICAgICAgICByZXR1cm4gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgX1JlYWN0JENvbXBvbmVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTtcbiAgICAgIH1cblxuICAgICAgY29tcG9uZW50LnByb3RvdHlwZS5zaG91bGRDb21wb25lbnRVcGRhdGUgPSBmdW5jdGlvbiBzaG91bGRDb21wb25lbnRVcGRhdGUoKSB7XG4gICAgICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhbWl4aW4uc2hvdWxkQ29tcG9uZW50VXBkYXRlIHx8IG1peGluLnNob3VsZENvbXBvbmVudFVwZGF0ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbXBvbmVudC5wcm90b3R5cGUuY29tcG9uZW50V2lsbE1vdW50ID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbE1vdW50KCkge1xuICAgICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgICB2YXIgcHJvcHMgPSB0aGlzLnByb3BzO1xuXG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IHt9O1xuXG4gICAgICAgIGNvbnRyb2xsZWRQcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICBfdGhpczIuX3ZhbHVlc1trZXldID0gcHJvcHNbdXRpbHMuZGVmYXVsdEtleShrZXkpXTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICAvKipcbiAgICAgICAqIElmIGEgcHJvcCBzd2l0Y2hlcyBmcm9tIGNvbnRyb2xsZWQgdG8gVW5jb250cm9sbGVkXG4gICAgICAgKiByZXNldCBpdHMgdmFsdWUgdG8gdGhlIGRlZmF1bHRWYWx1ZVxuICAgICAgICovXG5cblxuICAgICAgY29tcG9uZW50LnByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzID0gZnVuY3Rpb24gY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXh0UHJvcHMpIHtcbiAgICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgICAgdmFyIHByb3BzID0gdGhpcy5wcm9wcztcblxuICAgICAgICBpZiAobWl4aW4uY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcykge1xuICAgICAgICAgIG1peGluLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMuY2FsbCh0aGlzLCBuZXh0UHJvcHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udHJvbGxlZFByb3BzLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIGlmICh1dGlscy5nZXRWYWx1ZShuZXh0UHJvcHMsIGtleSkgPT09IHVuZGVmaW5lZCAmJiB1dGlscy5nZXRWYWx1ZShwcm9wcywga2V5KSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBfdGhpczMuX3ZhbHVlc1trZXldID0gbmV4dFByb3BzW3V0aWxzLmRlZmF1bHRLZXkoa2V5KV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbXBvbmVudC5wcm90b3R5cGUuY29tcG9uZW50V2lsbFVubW91bnQgPSBmdW5jdGlvbiBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICAgICAgdGhpcy51bm1vdW50ZWQgPSB0cnVlO1xuICAgICAgfTtcblxuICAgICAgY29tcG9uZW50LnByb3RvdHlwZS5nZXRDb250cm9sbGVkSW5zdGFuY2UgPSBmdW5jdGlvbiBnZXRDb250cm9sbGVkSW5zdGFuY2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZnMuaW5uZXI7XG4gICAgICB9O1xuXG4gICAgICBjb21wb25lbnQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICAgICAgdmFyIG5ld1Byb3BzID0ge30sXG4gICAgICAgICAgICBwcm9wcyA9IG9taXRQcm9wcyh0aGlzLnByb3BzKTtcblxuICAgICAgICB1dGlscy5lYWNoKGNvbnRyb2xsZWRWYWx1ZXMsIGZ1bmN0aW9uIChoYW5kbGUsIHByb3BOYW1lKSB7XG4gICAgICAgICAgdmFyIGxpbmtQcm9wTmFtZSA9IHV0aWxzLmdldExpbmtOYW1lKHByb3BOYW1lKSxcbiAgICAgICAgICAgICAgcHJvcCA9IF90aGlzNC5wcm9wc1twcm9wTmFtZV07XG5cbiAgICAgICAgICBpZiAobGlua1Byb3BOYW1lICYmICFpc1Byb3AoX3RoaXM0LnByb3BzLCBwcm9wTmFtZSkgJiYgaXNQcm9wKF90aGlzNC5wcm9wcywgbGlua1Byb3BOYW1lKSkge1xuICAgICAgICAgICAgcHJvcCA9IF90aGlzNC5wcm9wc1tsaW5rUHJvcE5hbWVdLnZhbHVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG5ld1Byb3BzW3Byb3BOYW1lXSA9IHByb3AgIT09IHVuZGVmaW5lZCA/IHByb3AgOiBfdGhpczQuX3ZhbHVlc1twcm9wTmFtZV07XG5cbiAgICAgICAgICBuZXdQcm9wc1toYW5kbGVdID0gc2V0QW5kTm90aWZ5LmJpbmQoX3RoaXM0LCBwcm9wTmFtZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5ld1Byb3BzID0gX2V4dGVuZHMoe30sIHByb3BzLCBuZXdQcm9wcywge1xuICAgICAgICAgIHJlZjogaXNDb21wb3NpdGVDb21wb25lbnQgPyAnaW5uZXInIDogbnVsbFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gX3JlYWN0Mi5kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoQ29tcG9uZW50LCBuZXdQcm9wcyk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH0oX3JlYWN0Mi5kZWZhdWx0LkNvbXBvbmVudCksIF9jbGFzcy5kaXNwbGF5TmFtZSA9ICdVbmNvbnRyb2xsZWQoJyArIGRpc3BsYXlOYW1lICsgJyknLCBfY2xhc3MucHJvcFR5cGVzID0gcHJvcFR5cGVzLCBfdGVtcCk7XG5cbiAgICBfZXh0ZW5kcyhjb21wb25lbnQucHJvdG90eXBlLCBtZXRob2RzKTtcblxuICAgIGNvbXBvbmVudC5Db250cm9sbGVkQ29tcG9uZW50ID0gQ29tcG9uZW50O1xuXG4gICAgLyoqXG4gICAgICogdXNlZnVsIHdoZW4gd3JhcHBpbmcgYSBDb21wb25lbnQgYW5kIHlvdSB3YW50IHRvIGNvbnRyb2xcbiAgICAgKiBldmVyeXRoaW5nXG4gICAgICovXG4gICAgY29tcG9uZW50LmRlZmVyQ29udHJvbFRvID0gZnVuY3Rpb24gKG5ld0NvbXBvbmVudCkge1xuICAgICAgdmFyIGFkZGl0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICB2YXIgbmV4dE1ldGhvZHMgPSBhcmd1bWVudHNbMl07XG5cbiAgICAgIHJldHVybiB1bmNvbnRyb2xsYWJsZShuZXdDb21wb25lbnQsIF9leHRlbmRzKHt9LCBjb250cm9sbGVkVmFsdWVzLCBhZGRpdGlvbnMpLCBuZXh0TWV0aG9kcyk7XG4gICAgfTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG5cbiAgICBmdW5jdGlvbiBzZXRBbmROb3RpZnkocHJvcE5hbWUsIHZhbHVlKSB7XG4gICAgICB2YXIgbGlua05hbWUgPSB1dGlscy5nZXRMaW5rTmFtZShwcm9wTmFtZSksXG4gICAgICAgICAgaGFuZGxlciA9IHRoaXMucHJvcHNbY29udHJvbGxlZFZhbHVlc1twcm9wTmFtZV1dO1xuXG4gICAgICBpZiAobGlua05hbWUgJiYgaXNQcm9wKHRoaXMucHJvcHMsIGxpbmtOYW1lKSAmJiAhaGFuZGxlcikge1xuICAgICAgICBoYW5kbGVyID0gdGhpcy5wcm9wc1tsaW5rTmFtZV0ucmVxdWVzdENoYW5nZTtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gQXJyYXkoX2xlbjIgPiAyID8gX2xlbjIgLSAyIDogMCksIF9rZXkyID0gMjsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyIC0gMl0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgfVxuXG4gICAgICBzZXQodGhpcywgcHJvcE5hbWUsIGhhbmRsZXIsIHZhbHVlLCBhcmdzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1Byb3AocHJvcHMsIHByb3ApIHtcbiAgICAgIHJldHVybiBwcm9wc1twcm9wXSAhPT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9taXRQcm9wcyhwcm9wcykge1xuICAgICAgdmFyIHJlc3VsdCA9IHt9O1xuXG4gICAgICB1dGlscy5lYWNoKHByb3BzLCBmdW5jdGlvbiAodmFsdWUsIGtleSkge1xuICAgICAgICBpZiAoT01JVF9QUk9QUy5pbmRleE9mKGtleSkgPT09IC0xKSByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5cbnZhciBfY3JlYXRlVW5jb250cm9sbGFibGUgPSByZXF1aXJlKCcuL2NyZWF0ZVVuY29udHJvbGxhYmxlJyk7XG5cbnZhciBfY3JlYXRlVW5jb250cm9sbGFibGUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfY3JlYXRlVW5jb250cm9sbGFibGUpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG52YXIgbWl4aW4gPSB7XG4gIHNob3VsZENvbXBvbmVudFVwZGF0ZTogZnVuY3Rpb24gc2hvdWxkQ29tcG9uZW50VXBkYXRlKCkge1xuICAgIC8vbGV0IHRoZSBmb3JjZVVwZGF0ZSB0cmlnZ2VyIHRoZSB1cGRhdGVcbiAgICByZXR1cm4gIXRoaXMuX25vdGlmeWluZztcbiAgfVxufTtcblxuZnVuY3Rpb24gc2V0KGNvbXBvbmVudCwgcHJvcE5hbWUsIGhhbmRsZXIsIHZhbHVlLCBhcmdzKSB7XG4gIGlmIChoYW5kbGVyKSB7XG4gICAgY29tcG9uZW50Ll9ub3RpZnlpbmcgPSB0cnVlO1xuICAgIGhhbmRsZXIuY2FsbC5hcHBseShoYW5kbGVyLCBbY29tcG9uZW50LCB2YWx1ZV0uY29uY2F0KGFyZ3MpKTtcbiAgICBjb21wb25lbnQuX25vdGlmeWluZyA9IGZhbHNlO1xuICB9XG5cbiAgY29tcG9uZW50Ll92YWx1ZXNbcHJvcE5hbWVdID0gdmFsdWU7XG5cbiAgaWYgKCFjb21wb25lbnQudW5tb3VudGVkKSBjb21wb25lbnQuZm9yY2VVcGRhdGUoKTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gKDAsIF9jcmVhdGVVbmNvbnRyb2xsYWJsZTIuZGVmYXVsdCkobWl4aW4sIHNldCk7XG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHNbJ2RlZmF1bHQnXTsiLCIndXNlIHN0cmljdCc7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XG5leHBvcnRzLnZlcnNpb24gPSB1bmRlZmluZWQ7XG5leHBvcnRzLnVuY29udHJvbGxlZFByb3BUeXBlcyA9IHVuY29udHJvbGxlZFByb3BUeXBlcztcbmV4cG9ydHMuZ2V0VHlwZSA9IGdldFR5cGU7XG5leHBvcnRzLmdldFZhbHVlID0gZ2V0VmFsdWU7XG5leHBvcnRzLmdldExpbmtOYW1lID0gZ2V0TGlua05hbWU7XG5leHBvcnRzLmRlZmF1bHRLZXkgPSBkZWZhdWx0S2V5O1xuZXhwb3J0cy5jaGFpbiA9IGNoYWluO1xuZXhwb3J0cy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07XG5leHBvcnRzLmVhY2ggPSBlYWNoO1xuZXhwb3J0cy5oYXMgPSBoYXM7XG5leHBvcnRzLmlzUmVhY3RDb21wb25lbnQgPSBpc1JlYWN0Q29tcG9uZW50O1xuXG52YXIgX3JlYWN0ID0gcmVxdWlyZSgncmVhY3QnKTtcblxudmFyIF9yZWFjdDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9yZWFjdCk7XG5cbnZhciBfaW52YXJpYW50ID0gcmVxdWlyZSgnaW52YXJpYW50Jyk7XG5cbnZhciBfaW52YXJpYW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ludmFyaWFudCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIHJlYWRPbmx5UHJvcFR5cGUoaGFuZGxlciwgbmFtZSkge1xuICByZXR1cm4gZnVuY3Rpb24gKHByb3BzLCBwcm9wTmFtZSkge1xuICAgIGlmIChwcm9wc1twcm9wTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKCFwcm9wc1toYW5kbGVyXSkge1xuICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdZb3UgaGF2ZSBwcm92aWRlZCBhIGAnICsgcHJvcE5hbWUgKyAnYCBwcm9wIHRvICcgKyAnYCcgKyBuYW1lICsgJ2Agd2l0aG91dCBhbiBgJyArIGhhbmRsZXIgKyAnYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiAnICsgJ0lmIHRoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYCcgKyBkZWZhdWx0S2V5KHByb3BOYW1lKSArICdgLiBPdGhlcndpc2UsIHNldCBgJyArIGhhbmRsZXIgKyAnYCcpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gdW5jb250cm9sbGVkUHJvcFR5cGVzKGNvbnRyb2xsZWRWYWx1ZXMsIGJhc2VQcm9wVHlwZXMsIGRpc3BsYXlOYW1lKSB7XG4gIHZhciBwcm9wVHlwZXMgPSB7fTtcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJyAmJiBiYXNlUHJvcFR5cGVzKSB7XG4gICAgdHJhbnNmb3JtKGNvbnRyb2xsZWRWYWx1ZXMsIGZ1bmN0aW9uIChvYmosIGhhbmRsZXIsIHByb3ApIHtcbiAgICAgICgwLCBfaW52YXJpYW50Mi5kZWZhdWx0KSh0eXBlb2YgaGFuZGxlciA9PT0gJ3N0cmluZycgJiYgaGFuZGxlci50cmltKCkubGVuZ3RoLCAnVW5jb250cm9sbGFibGUgLSBbJXNdOiB0aGUgcHJvcCBgJXNgIG5lZWRzIGEgdmFsaWQgaGFuZGxlciBrZXkgbmFtZSBpbiBvcmRlciB0byBtYWtlIGl0IHVuY29udHJvbGxhYmxlJywgZGlzcGxheU5hbWUsIHByb3ApO1xuXG4gICAgICBvYmpbcHJvcF0gPSByZWFkT25seVByb3BUeXBlKGhhbmRsZXIsIGRpc3BsYXlOYW1lKTtcbiAgICB9LCBwcm9wVHlwZXMpO1xuICB9XG5cbiAgcmV0dXJuIHByb3BUeXBlcztcbn1cblxudmFyIHZlcnNpb24gPSBleHBvcnRzLnZlcnNpb24gPSBfcmVhY3QyLmRlZmF1bHQudmVyc2lvbi5zcGxpdCgnLicpLm1hcChwYXJzZUZsb2F0KTtcblxuZnVuY3Rpb24gZ2V0VHlwZShjb21wb25lbnQpIHtcbiAgaWYgKHZlcnNpb25bMF0gPj0gMTUgfHwgdmVyc2lvblswXSA9PT0gMCAmJiB2ZXJzaW9uWzFdID49IDEzKSByZXR1cm4gY29tcG9uZW50O1xuXG4gIHJldHVybiBjb21wb25lbnQudHlwZTtcbn1cblxuZnVuY3Rpb24gZ2V0VmFsdWUocHJvcHMsIG5hbWUpIHtcbiAgdmFyIGxpbmtQcm9wTmFtZSA9IGdldExpbmtOYW1lKG5hbWUpO1xuXG4gIGlmIChsaW5rUHJvcE5hbWUgJiYgIWlzUHJvcChwcm9wcywgbmFtZSkgJiYgaXNQcm9wKHByb3BzLCBsaW5rUHJvcE5hbWUpKSByZXR1cm4gcHJvcHNbbGlua1Byb3BOYW1lXS52YWx1ZTtcblxuICByZXR1cm4gcHJvcHNbbmFtZV07XG59XG5cbmZ1bmN0aW9uIGlzUHJvcChwcm9wcywgcHJvcCkge1xuICByZXR1cm4gcHJvcHNbcHJvcF0gIT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0TGlua05hbWUobmFtZSkge1xuICByZXR1cm4gbmFtZSA9PT0gJ3ZhbHVlJyA/ICd2YWx1ZUxpbmsnIDogbmFtZSA9PT0gJ2NoZWNrZWQnID8gJ2NoZWNrZWRMaW5rJyA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRLZXkoa2V5KSB7XG4gIHJldHVybiAnZGVmYXVsdCcgKyBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyKDEpO1xufVxuXG5mdW5jdGlvbiBjaGFpbih0aGlzQXJnLCBhLCBiKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjaGFpbmVkRnVuY3Rpb24oKSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgYSAmJiBhLmNhbGwuYXBwbHkoYSwgW3RoaXNBcmddLmNvbmNhdChhcmdzKSk7XG4gICAgYiAmJiBiLmNhbGwuYXBwbHkoYiwgW3RoaXNBcmddLmNvbmNhdChhcmdzKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybShvYmosIGNiLCBzZWVkKSB7XG4gIGVhY2gob2JqLCBjYi5iaW5kKG51bGwsIHNlZWQgPSBzZWVkIHx8IChBcnJheS5pc0FycmF5KG9iaikgPyBbXSA6IHt9KSkpO1xuICByZXR1cm4gc2VlZDtcbn1cblxuZnVuY3Rpb24gZWFjaChvYmosIGNiLCB0aGlzQXJnKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmouZm9yRWFjaChjYiwgdGhpc0FyZyk7XG5cbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChoYXMob2JqLCBrZXkpKSBjYi5jYWxsKHRoaXNBcmcsIG9ialtrZXldLCBrZXksIG9iaik7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzKG8sIGspIHtcbiAgcmV0dXJuIG8gPyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobywgaykgOiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuIEFuIGFkZGl0aW9uYWwgZ3JhbnRcbiAqIG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBpc1JlYWN0Q29tcG9uZW50KGNvbXBvbmVudCkge1xuICByZXR1cm4gISEoY29tcG9uZW50ICYmIGNvbXBvbmVudC5wcm90b3R5cGUgJiYgY29tcG9uZW50LnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KTtcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuJ3VzZSBzdHJpY3QnO1xuXG52YXIgcHVueWNvZGUgPSByZXF1aXJlKCdwdW55Y29kZScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuZXhwb3J0cy5wYXJzZSA9IHVybFBhcnNlO1xuZXhwb3J0cy5yZXNvbHZlID0gdXJsUmVzb2x2ZTtcbmV4cG9ydHMucmVzb2x2ZU9iamVjdCA9IHVybFJlc29sdmVPYmplY3Q7XG5leHBvcnRzLmZvcm1hdCA9IHVybEZvcm1hdDtcblxuZXhwb3J0cy5VcmwgPSBVcmw7XG5cbmZ1bmN0aW9uIFVybCgpIHtcbiAgdGhpcy5wcm90b2NvbCA9IG51bGw7XG4gIHRoaXMuc2xhc2hlcyA9IG51bGw7XG4gIHRoaXMuYXV0aCA9IG51bGw7XG4gIHRoaXMuaG9zdCA9IG51bGw7XG4gIHRoaXMucG9ydCA9IG51bGw7XG4gIHRoaXMuaG9zdG5hbWUgPSBudWxsO1xuICB0aGlzLmhhc2ggPSBudWxsO1xuICB0aGlzLnNlYXJjaCA9IG51bGw7XG4gIHRoaXMucXVlcnkgPSBudWxsO1xuICB0aGlzLnBhdGhuYW1lID0gbnVsbDtcbiAgdGhpcy5wYXRoID0gbnVsbDtcbiAgdGhpcy5ocmVmID0gbnVsbDtcbn1cblxuLy8gUmVmZXJlbmNlOiBSRkMgMzk4NiwgUkZDIDE4MDgsIFJGQyAyMzk2XG5cbi8vIGRlZmluZSB0aGVzZSBoZXJlIHNvIGF0IGxlYXN0IHRoZXkgb25seSBoYXZlIHRvIGJlXG4vLyBjb21waWxlZCBvbmNlIG9uIHRoZSBmaXJzdCBtb2R1bGUgbG9hZC5cbnZhciBwcm90b2NvbFBhdHRlcm4gPSAvXihbYS16MC05ListXSs6KS9pLFxuICAgIHBvcnRQYXR0ZXJuID0gLzpbMC05XSokLyxcblxuICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgYSBzaW1wbGUgcGF0aCBVUkxcbiAgICBzaW1wbGVQYXRoUGF0dGVybiA9IC9eKFxcL1xcLz8oPyFcXC8pW15cXD9cXHNdKikoXFw/W15cXHNdKik/JC8sXG5cbiAgICAvLyBSRkMgMjM5NjogY2hhcmFjdGVycyByZXNlcnZlZCBmb3IgZGVsaW1pdGluZyBVUkxzLlxuICAgIC8vIFdlIGFjdHVhbGx5IGp1c3QgYXV0by1lc2NhcGUgdGhlc2UuXG4gICAgZGVsaW1zID0gWyc8JywgJz4nLCAnXCInLCAnYCcsICcgJywgJ1xccicsICdcXG4nLCAnXFx0J10sXG5cbiAgICAvLyBSRkMgMjM5NjogY2hhcmFjdGVycyBub3QgYWxsb3dlZCBmb3IgdmFyaW91cyByZWFzb25zLlxuICAgIHVud2lzZSA9IFsneycsICd9JywgJ3wnLCAnXFxcXCcsICdeJywgJ2AnXS5jb25jYXQoZGVsaW1zKSxcblxuICAgIC8vIEFsbG93ZWQgYnkgUkZDcywgYnV0IGNhdXNlIG9mIFhTUyBhdHRhY2tzLiAgQWx3YXlzIGVzY2FwZSB0aGVzZS5cbiAgICBhdXRvRXNjYXBlID0gWydcXCcnXS5jb25jYXQodW53aXNlKSxcbiAgICAvLyBDaGFyYWN0ZXJzIHRoYXQgYXJlIG5ldmVyIGV2ZXIgYWxsb3dlZCBpbiBhIGhvc3RuYW1lLlxuICAgIC8vIE5vdGUgdGhhdCBhbnkgaW52YWxpZCBjaGFycyBhcmUgYWxzbyBoYW5kbGVkLCBidXQgdGhlc2VcbiAgICAvLyBhcmUgdGhlIG9uZXMgdGhhdCBhcmUgKmV4cGVjdGVkKiB0byBiZSBzZWVuLCBzbyB3ZSBmYXN0LXBhdGhcbiAgICAvLyB0aGVtLlxuICAgIG5vbkhvc3RDaGFycyA9IFsnJScsICcvJywgJz8nLCAnOycsICcjJ10uY29uY2F0KGF1dG9Fc2NhcGUpLFxuICAgIGhvc3RFbmRpbmdDaGFycyA9IFsnLycsICc/JywgJyMnXSxcbiAgICBob3N0bmFtZU1heExlbiA9IDI1NSxcbiAgICBob3N0bmFtZVBhcnRQYXR0ZXJuID0gL15bK2EtejAtOUEtWl8tXXswLDYzfSQvLFxuICAgIGhvc3RuYW1lUGFydFN0YXJ0ID0gL14oWythLXowLTlBLVpfLV17MCw2M30pKC4qKSQvLFxuICAgIC8vIHByb3RvY29scyB0aGF0IGNhbiBhbGxvdyBcInVuc2FmZVwiIGFuZCBcInVud2lzZVwiIGNoYXJzLlxuICAgIHVuc2FmZVByb3RvY29sID0ge1xuICAgICAgJ2phdmFzY3JpcHQnOiB0cnVlLFxuICAgICAgJ2phdmFzY3JpcHQ6JzogdHJ1ZVxuICAgIH0sXG4gICAgLy8gcHJvdG9jb2xzIHRoYXQgbmV2ZXIgaGF2ZSBhIGhvc3RuYW1lLlxuICAgIGhvc3RsZXNzUHJvdG9jb2wgPSB7XG4gICAgICAnamF2YXNjcmlwdCc6IHRydWUsXG4gICAgICAnamF2YXNjcmlwdDonOiB0cnVlXG4gICAgfSxcbiAgICAvLyBwcm90b2NvbHMgdGhhdCBhbHdheXMgY29udGFpbiBhIC8vIGJpdC5cbiAgICBzbGFzaGVkUHJvdG9jb2wgPSB7XG4gICAgICAnaHR0cCc6IHRydWUsXG4gICAgICAnaHR0cHMnOiB0cnVlLFxuICAgICAgJ2Z0cCc6IHRydWUsXG4gICAgICAnZ29waGVyJzogdHJ1ZSxcbiAgICAgICdmaWxlJzogdHJ1ZSxcbiAgICAgICdodHRwOic6IHRydWUsXG4gICAgICAnaHR0cHM6JzogdHJ1ZSxcbiAgICAgICdmdHA6JzogdHJ1ZSxcbiAgICAgICdnb3BoZXI6JzogdHJ1ZSxcbiAgICAgICdmaWxlOic6IHRydWVcbiAgICB9LFxuICAgIHF1ZXJ5c3RyaW5nID0gcmVxdWlyZSgncXVlcnlzdHJpbmcnKTtcblxuZnVuY3Rpb24gdXJsUGFyc2UodXJsLCBwYXJzZVF1ZXJ5U3RyaW5nLCBzbGFzaGVzRGVub3RlSG9zdCkge1xuICBpZiAodXJsICYmIHV0aWwuaXNPYmplY3QodXJsKSAmJiB1cmwgaW5zdGFuY2VvZiBVcmwpIHJldHVybiB1cmw7XG5cbiAgdmFyIHUgPSBuZXcgVXJsO1xuICB1LnBhcnNlKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpO1xuICByZXR1cm4gdTtcbn1cblxuVXJsLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uKHVybCwgcGFyc2VRdWVyeVN0cmluZywgc2xhc2hlc0Rlbm90ZUhvc3QpIHtcbiAgaWYgKCF1dGlsLmlzU3RyaW5nKHVybCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUGFyYW1ldGVyICd1cmwnIG11c3QgYmUgYSBzdHJpbmcsIG5vdCBcIiArIHR5cGVvZiB1cmwpO1xuICB9XG5cbiAgLy8gQ29weSBjaHJvbWUsIElFLCBvcGVyYSBiYWNrc2xhc2gtaGFuZGxpbmcgYmVoYXZpb3IuXG4gIC8vIEJhY2sgc2xhc2hlcyBiZWZvcmUgdGhlIHF1ZXJ5IHN0cmluZyBnZXQgY29udmVydGVkIHRvIGZvcndhcmQgc2xhc2hlc1xuICAvLyBTZWU6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0yNTkxNlxuICB2YXIgcXVlcnlJbmRleCA9IHVybC5pbmRleE9mKCc/JyksXG4gICAgICBzcGxpdHRlciA9XG4gICAgICAgICAgKHF1ZXJ5SW5kZXggIT09IC0xICYmIHF1ZXJ5SW5kZXggPCB1cmwuaW5kZXhPZignIycpKSA/ICc/JyA6ICcjJyxcbiAgICAgIHVTcGxpdCA9IHVybC5zcGxpdChzcGxpdHRlciksXG4gICAgICBzbGFzaFJlZ2V4ID0gL1xcXFwvZztcbiAgdVNwbGl0WzBdID0gdVNwbGl0WzBdLnJlcGxhY2Uoc2xhc2hSZWdleCwgJy8nKTtcbiAgdXJsID0gdVNwbGl0LmpvaW4oc3BsaXR0ZXIpO1xuXG4gIHZhciByZXN0ID0gdXJsO1xuXG4gIC8vIHRyaW0gYmVmb3JlIHByb2NlZWRpbmcuXG4gIC8vIFRoaXMgaXMgdG8gc3VwcG9ydCBwYXJzZSBzdHVmZiBsaWtlIFwiICBodHRwOi8vZm9vLmNvbSAgXFxuXCJcbiAgcmVzdCA9IHJlc3QudHJpbSgpO1xuXG4gIGlmICghc2xhc2hlc0Rlbm90ZUhvc3QgJiYgdXJsLnNwbGl0KCcjJykubGVuZ3RoID09PSAxKSB7XG4gICAgLy8gVHJ5IGZhc3QgcGF0aCByZWdleHBcbiAgICB2YXIgc2ltcGxlUGF0aCA9IHNpbXBsZVBhdGhQYXR0ZXJuLmV4ZWMocmVzdCk7XG4gICAgaWYgKHNpbXBsZVBhdGgpIHtcbiAgICAgIHRoaXMucGF0aCA9IHJlc3Q7XG4gICAgICB0aGlzLmhyZWYgPSByZXN0O1xuICAgICAgdGhpcy5wYXRobmFtZSA9IHNpbXBsZVBhdGhbMV07XG4gICAgICBpZiAoc2ltcGxlUGF0aFsyXSkge1xuICAgICAgICB0aGlzLnNlYXJjaCA9IHNpbXBsZVBhdGhbMl07XG4gICAgICAgIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5c3RyaW5nLnBhcnNlKHRoaXMuc2VhcmNoLnN1YnN0cigxKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5xdWVyeSA9IHRoaXMuc2VhcmNoLnN1YnN0cigxKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc2VhcmNoID0gJyc7XG4gICAgICAgIHRoaXMucXVlcnkgPSB7fTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfVxuXG4gIHZhciBwcm90byA9IHByb3RvY29sUGF0dGVybi5leGVjKHJlc3QpO1xuICBpZiAocHJvdG8pIHtcbiAgICBwcm90byA9IHByb3RvWzBdO1xuICAgIHZhciBsb3dlclByb3RvID0gcHJvdG8udG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLnByb3RvY29sID0gbG93ZXJQcm90bztcbiAgICByZXN0ID0gcmVzdC5zdWJzdHIocHJvdG8ubGVuZ3RoKTtcbiAgfVxuXG4gIC8vIGZpZ3VyZSBvdXQgaWYgaXQncyBnb3QgYSBob3N0XG4gIC8vIHVzZXJAc2VydmVyIGlzICphbHdheXMqIGludGVycHJldGVkIGFzIGEgaG9zdG5hbWUsIGFuZCB1cmxcbiAgLy8gcmVzb2x1dGlvbiB3aWxsIHRyZWF0IC8vZm9vL2JhciBhcyBob3N0PWZvbyxwYXRoPWJhciBiZWNhdXNlIHRoYXQnc1xuICAvLyBob3cgdGhlIGJyb3dzZXIgcmVzb2x2ZXMgcmVsYXRpdmUgVVJMcy5cbiAgaWYgKHNsYXNoZXNEZW5vdGVIb3N0IHx8IHByb3RvIHx8IHJlc3QubWF0Y2goL15cXC9cXC9bXkBcXC9dK0BbXkBcXC9dKy8pKSB7XG4gICAgdmFyIHNsYXNoZXMgPSByZXN0LnN1YnN0cigwLCAyKSA9PT0gJy8vJztcbiAgICBpZiAoc2xhc2hlcyAmJiAhKHByb3RvICYmIGhvc3RsZXNzUHJvdG9jb2xbcHJvdG9dKSkge1xuICAgICAgcmVzdCA9IHJlc3Quc3Vic3RyKDIpO1xuICAgICAgdGhpcy5zbGFzaGVzID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWhvc3RsZXNzUHJvdG9jb2xbcHJvdG9dICYmXG4gICAgICAoc2xhc2hlcyB8fCAocHJvdG8gJiYgIXNsYXNoZWRQcm90b2NvbFtwcm90b10pKSkge1xuXG4gICAgLy8gdGhlcmUncyBhIGhvc3RuYW1lLlxuICAgIC8vIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiAvLCA/LCA7LCBvciAjIGVuZHMgdGhlIGhvc3QuXG4gICAgLy9cbiAgICAvLyBJZiB0aGVyZSBpcyBhbiBAIGluIHRoZSBob3N0bmFtZSwgdGhlbiBub24taG9zdCBjaGFycyAqYXJlKiBhbGxvd2VkXG4gICAgLy8gdG8gdGhlIGxlZnQgb2YgdGhlIGxhc3QgQCBzaWduLCB1bmxlc3Mgc29tZSBob3N0LWVuZGluZyBjaGFyYWN0ZXJcbiAgICAvLyBjb21lcyAqYmVmb3JlKiB0aGUgQC1zaWduLlxuICAgIC8vIFVSTHMgYXJlIG9ibm94aW91cy5cbiAgICAvL1xuICAgIC8vIGV4OlxuICAgIC8vIGh0dHA6Ly9hQGJAYy8gPT4gdXNlcjphQGIgaG9zdDpjXG4gICAgLy8gaHR0cDovL2FAYj9AYyA9PiB1c2VyOmEgaG9zdDpjIHBhdGg6Lz9AY1xuXG4gICAgLy8gdjAuMTIgVE9ETyhpc2FhY3MpOiBUaGlzIGlzIG5vdCBxdWl0ZSBob3cgQ2hyb21lIGRvZXMgdGhpbmdzLlxuICAgIC8vIFJldmlldyBvdXIgdGVzdCBjYXNlIGFnYWluc3QgYnJvd3NlcnMgbW9yZSBjb21wcmVoZW5zaXZlbHkuXG5cbiAgICAvLyBmaW5kIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBhbnkgaG9zdEVuZGluZ0NoYXJzXG4gICAgdmFyIGhvc3RFbmQgPSAtMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhvc3RFbmRpbmdDaGFycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhlYyA9IHJlc3QuaW5kZXhPZihob3N0RW5kaW5nQ2hhcnNbaV0pO1xuICAgICAgaWYgKGhlYyAhPT0gLTEgJiYgKGhvc3RFbmQgPT09IC0xIHx8IGhlYyA8IGhvc3RFbmQpKVxuICAgICAgICBob3N0RW5kID0gaGVjO1xuICAgIH1cblxuICAgIC8vIGF0IHRoaXMgcG9pbnQsIGVpdGhlciB3ZSBoYXZlIGFuIGV4cGxpY2l0IHBvaW50IHdoZXJlIHRoZVxuICAgIC8vIGF1dGggcG9ydGlvbiBjYW5ub3QgZ28gcGFzdCwgb3IgdGhlIGxhc3QgQCBjaGFyIGlzIHRoZSBkZWNpZGVyLlxuICAgIHZhciBhdXRoLCBhdFNpZ247XG4gICAgaWYgKGhvc3RFbmQgPT09IC0xKSB7XG4gICAgICAvLyBhdFNpZ24gY2FuIGJlIGFueXdoZXJlLlxuICAgICAgYXRTaWduID0gcmVzdC5sYXN0SW5kZXhPZignQCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBhdFNpZ24gbXVzdCBiZSBpbiBhdXRoIHBvcnRpb24uXG4gICAgICAvLyBodHRwOi8vYUBiL2NAZCA9PiBob3N0OmIgYXV0aDphIHBhdGg6L2NAZFxuICAgICAgYXRTaWduID0gcmVzdC5sYXN0SW5kZXhPZignQCcsIGhvc3RFbmQpO1xuICAgIH1cblxuICAgIC8vIE5vdyB3ZSBoYXZlIGEgcG9ydGlvbiB3aGljaCBpcyBkZWZpbml0ZWx5IHRoZSBhdXRoLlxuICAgIC8vIFB1bGwgdGhhdCBvZmYuXG4gICAgaWYgKGF0U2lnbiAhPT0gLTEpIHtcbiAgICAgIGF1dGggPSByZXN0LnNsaWNlKDAsIGF0U2lnbik7XG4gICAgICByZXN0ID0gcmVzdC5zbGljZShhdFNpZ24gKyAxKTtcbiAgICAgIHRoaXMuYXV0aCA9IGRlY29kZVVSSUNvbXBvbmVudChhdXRoKTtcbiAgICB9XG5cbiAgICAvLyB0aGUgaG9zdCBpcyB0aGUgcmVtYWluaW5nIHRvIHRoZSBsZWZ0IG9mIHRoZSBmaXJzdCBub24taG9zdCBjaGFyXG4gICAgaG9zdEVuZCA9IC0xO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9uSG9zdENoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaGVjID0gcmVzdC5pbmRleE9mKG5vbkhvc3RDaGFyc1tpXSk7XG4gICAgICBpZiAoaGVjICE9PSAtMSAmJiAoaG9zdEVuZCA9PT0gLTEgfHwgaGVjIDwgaG9zdEVuZCkpXG4gICAgICAgIGhvc3RFbmQgPSBoZWM7XG4gICAgfVxuICAgIC8vIGlmIHdlIHN0aWxsIGhhdmUgbm90IGhpdCBpdCwgdGhlbiB0aGUgZW50aXJlIHRoaW5nIGlzIGEgaG9zdC5cbiAgICBpZiAoaG9zdEVuZCA9PT0gLTEpXG4gICAgICBob3N0RW5kID0gcmVzdC5sZW5ndGg7XG5cbiAgICB0aGlzLmhvc3QgPSByZXN0LnNsaWNlKDAsIGhvc3RFbmQpO1xuICAgIHJlc3QgPSByZXN0LnNsaWNlKGhvc3RFbmQpO1xuXG4gICAgLy8gcHVsbCBvdXQgcG9ydC5cbiAgICB0aGlzLnBhcnNlSG9zdCgpO1xuXG4gICAgLy8gd2UndmUgaW5kaWNhdGVkIHRoYXQgdGhlcmUgaXMgYSBob3N0bmFtZSxcbiAgICAvLyBzbyBldmVuIGlmIGl0J3MgZW1wdHksIGl0IGhhcyB0byBiZSBwcmVzZW50LlxuICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3RuYW1lIHx8ICcnO1xuXG4gICAgLy8gaWYgaG9zdG5hbWUgYmVnaW5zIHdpdGggWyBhbmQgZW5kcyB3aXRoIF1cbiAgICAvLyBhc3N1bWUgdGhhdCBpdCdzIGFuIElQdjYgYWRkcmVzcy5cbiAgICB2YXIgaXB2Nkhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZVswXSA9PT0gJ1snICYmXG4gICAgICAgIHRoaXMuaG9zdG5hbWVbdGhpcy5ob3N0bmFtZS5sZW5ndGggLSAxXSA9PT0gJ10nO1xuXG4gICAgLy8gdmFsaWRhdGUgYSBsaXR0bGUuXG4gICAgaWYgKCFpcHY2SG9zdG5hbWUpIHtcbiAgICAgIHZhciBob3N0cGFydHMgPSB0aGlzLmhvc3RuYW1lLnNwbGl0KC9cXC4vKTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gaG9zdHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICB2YXIgcGFydCA9IGhvc3RwYXJ0c1tpXTtcbiAgICAgICAgaWYgKCFwYXJ0KSBjb250aW51ZTtcbiAgICAgICAgaWYgKCFwYXJ0Lm1hdGNoKGhvc3RuYW1lUGFydFBhdHRlcm4pKSB7XG4gICAgICAgICAgdmFyIG5ld3BhcnQgPSAnJztcbiAgICAgICAgICBmb3IgKHZhciBqID0gMCwgayA9IHBhcnQubGVuZ3RoOyBqIDwgazsgaisrKSB7XG4gICAgICAgICAgICBpZiAocGFydC5jaGFyQ29kZUF0KGopID4gMTI3KSB7XG4gICAgICAgICAgICAgIC8vIHdlIHJlcGxhY2Ugbm9uLUFTQ0lJIGNoYXIgd2l0aCBhIHRlbXBvcmFyeSBwbGFjZWhvbGRlclxuICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRoaXMgdG8gbWFrZSBzdXJlIHNpemUgb2YgaG9zdG5hbWUgaXMgbm90XG4gICAgICAgICAgICAgIC8vIGJyb2tlbiBieSByZXBsYWNpbmcgbm9uLUFTQ0lJIGJ5IG5vdGhpbmdcbiAgICAgICAgICAgICAgbmV3cGFydCArPSAneCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBuZXdwYXJ0ICs9IHBhcnRbal07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHdlIHRlc3QgYWdhaW4gd2l0aCBBU0NJSSBjaGFyIG9ubHlcbiAgICAgICAgICBpZiAoIW5ld3BhcnQubWF0Y2goaG9zdG5hbWVQYXJ0UGF0dGVybikpIHtcbiAgICAgICAgICAgIHZhciB2YWxpZFBhcnRzID0gaG9zdHBhcnRzLnNsaWNlKDAsIGkpO1xuICAgICAgICAgICAgdmFyIG5vdEhvc3QgPSBob3N0cGFydHMuc2xpY2UoaSArIDEpO1xuICAgICAgICAgICAgdmFyIGJpdCA9IHBhcnQubWF0Y2goaG9zdG5hbWVQYXJ0U3RhcnQpO1xuICAgICAgICAgICAgaWYgKGJpdCkge1xuICAgICAgICAgICAgICB2YWxpZFBhcnRzLnB1c2goYml0WzFdKTtcbiAgICAgICAgICAgICAgbm90SG9zdC51bnNoaWZ0KGJpdFsyXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm90SG9zdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgcmVzdCA9ICcvJyArIG5vdEhvc3Quam9pbignLicpICsgcmVzdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaG9zdG5hbWUgPSB2YWxpZFBhcnRzLmpvaW4oJy4nKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmhvc3RuYW1lLmxlbmd0aCA+IGhvc3RuYW1lTWF4TGVuKSB7XG4gICAgICB0aGlzLmhvc3RuYW1lID0gJyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGhvc3RuYW1lcyBhcmUgYWx3YXlzIGxvd2VyIGNhc2UuXG4gICAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIGlmICghaXB2Nkhvc3RuYW1lKSB7XG4gICAgICAvLyBJRE5BIFN1cHBvcnQ6IFJldHVybnMgYSBwdW55Y29kZWQgcmVwcmVzZW50YXRpb24gb2YgXCJkb21haW5cIi5cbiAgICAgIC8vIEl0IG9ubHkgY29udmVydHMgcGFydHMgb2YgdGhlIGRvbWFpbiBuYW1lIHRoYXRcbiAgICAgIC8vIGhhdmUgbm9uLUFTQ0lJIGNoYXJhY3RlcnMsIGkuZS4gaXQgZG9lc24ndCBtYXR0ZXIgaWZcbiAgICAgIC8vIHlvdSBjYWxsIGl0IHdpdGggYSBkb21haW4gdGhhdCBhbHJlYWR5IGlzIEFTQ0lJLW9ubHkuXG4gICAgICB0aGlzLmhvc3RuYW1lID0gcHVueWNvZGUudG9BU0NJSSh0aGlzLmhvc3RuYW1lKTtcbiAgICB9XG5cbiAgICB2YXIgcCA9IHRoaXMucG9ydCA/ICc6JyArIHRoaXMucG9ydCA6ICcnO1xuICAgIHZhciBoID0gdGhpcy5ob3N0bmFtZSB8fCAnJztcbiAgICB0aGlzLmhvc3QgPSBoICsgcDtcbiAgICB0aGlzLmhyZWYgKz0gdGhpcy5ob3N0O1xuXG4gICAgLy8gc3RyaXAgWyBhbmQgXSBmcm9tIHRoZSBob3N0bmFtZVxuICAgIC8vIHRoZSBob3N0IGZpZWxkIHN0aWxsIHJldGFpbnMgdGhlbSwgdGhvdWdoXG4gICAgaWYgKGlwdjZIb3N0bmFtZSkge1xuICAgICAgdGhpcy5ob3N0bmFtZSA9IHRoaXMuaG9zdG5hbWUuc3Vic3RyKDEsIHRoaXMuaG9zdG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBpZiAocmVzdFswXSAhPT0gJy8nKSB7XG4gICAgICAgIHJlc3QgPSAnLycgKyByZXN0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vdyByZXN0IGlzIHNldCB0byB0aGUgcG9zdC1ob3N0IHN0dWZmLlxuICAvLyBjaG9wIG9mZiBhbnkgZGVsaW0gY2hhcnMuXG4gIGlmICghdW5zYWZlUHJvdG9jb2xbbG93ZXJQcm90b10pIHtcblxuICAgIC8vIEZpcnN0LCBtYWtlIDEwMCUgc3VyZSB0aGF0IGFueSBcImF1dG9Fc2NhcGVcIiBjaGFycyBnZXRcbiAgICAvLyBlc2NhcGVkLCBldmVuIGlmIGVuY29kZVVSSUNvbXBvbmVudCBkb2Vzbid0IHRoaW5rIHRoZXlcbiAgICAvLyBuZWVkIHRvIGJlLlxuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXV0b0VzY2FwZS5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciBhZSA9IGF1dG9Fc2NhcGVbaV07XG4gICAgICBpZiAocmVzdC5pbmRleE9mKGFlKSA9PT0gLTEpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgdmFyIGVzYyA9IGVuY29kZVVSSUNvbXBvbmVudChhZSk7XG4gICAgICBpZiAoZXNjID09PSBhZSkge1xuICAgICAgICBlc2MgPSBlc2NhcGUoYWUpO1xuICAgICAgfVxuICAgICAgcmVzdCA9IHJlc3Quc3BsaXQoYWUpLmpvaW4oZXNjKTtcbiAgICB9XG4gIH1cblxuXG4gIC8vIGNob3Agb2ZmIGZyb20gdGhlIHRhaWwgZmlyc3QuXG4gIHZhciBoYXNoID0gcmVzdC5pbmRleE9mKCcjJyk7XG4gIGlmIChoYXNoICE9PSAtMSkge1xuICAgIC8vIGdvdCBhIGZyYWdtZW50IHN0cmluZy5cbiAgICB0aGlzLmhhc2ggPSByZXN0LnN1YnN0cihoYXNoKTtcbiAgICByZXN0ID0gcmVzdC5zbGljZSgwLCBoYXNoKTtcbiAgfVxuICB2YXIgcW0gPSByZXN0LmluZGV4T2YoJz8nKTtcbiAgaWYgKHFtICE9PSAtMSkge1xuICAgIHRoaXMuc2VhcmNoID0gcmVzdC5zdWJzdHIocW0pO1xuICAgIHRoaXMucXVlcnkgPSByZXN0LnN1YnN0cihxbSArIDEpO1xuICAgIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnlzdHJpbmcucGFyc2UodGhpcy5xdWVyeSk7XG4gICAgfVxuICAgIHJlc3QgPSByZXN0LnNsaWNlKDAsIHFtKTtcbiAgfSBlbHNlIGlmIChwYXJzZVF1ZXJ5U3RyaW5nKSB7XG4gICAgLy8gbm8gcXVlcnkgc3RyaW5nLCBidXQgcGFyc2VRdWVyeVN0cmluZyBzdGlsbCByZXF1ZXN0ZWRcbiAgICB0aGlzLnNlYXJjaCA9ICcnO1xuICAgIHRoaXMucXVlcnkgPSB7fTtcbiAgfVxuICBpZiAocmVzdCkgdGhpcy5wYXRobmFtZSA9IHJlc3Q7XG4gIGlmIChzbGFzaGVkUHJvdG9jb2xbbG93ZXJQcm90b10gJiZcbiAgICAgIHRoaXMuaG9zdG5hbWUgJiYgIXRoaXMucGF0aG5hbWUpIHtcbiAgICB0aGlzLnBhdGhuYW1lID0gJy8nO1xuICB9XG5cbiAgLy90byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICBpZiAodGhpcy5wYXRobmFtZSB8fCB0aGlzLnNlYXJjaCkge1xuICAgIHZhciBwID0gdGhpcy5wYXRobmFtZSB8fCAnJztcbiAgICB2YXIgcyA9IHRoaXMuc2VhcmNoIHx8ICcnO1xuICAgIHRoaXMucGF0aCA9IHAgKyBzO1xuICB9XG5cbiAgLy8gZmluYWxseSwgcmVjb25zdHJ1Y3QgdGhlIGhyZWYgYmFzZWQgb24gd2hhdCBoYXMgYmVlbiB2YWxpZGF0ZWQuXG4gIHRoaXMuaHJlZiA9IHRoaXMuZm9ybWF0KCk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gZm9ybWF0IGEgcGFyc2VkIG9iamVjdCBpbnRvIGEgdXJsIHN0cmluZ1xuZnVuY3Rpb24gdXJsRm9ybWF0KG9iaikge1xuICAvLyBlbnN1cmUgaXQncyBhbiBvYmplY3QsIGFuZCBub3QgYSBzdHJpbmcgdXJsLlxuICAvLyBJZiBpdCdzIGFuIG9iaiwgdGhpcyBpcyBhIG5vLW9wLlxuICAvLyB0aGlzIHdheSwgeW91IGNhbiBjYWxsIHVybF9mb3JtYXQoKSBvbiBzdHJpbmdzXG4gIC8vIHRvIGNsZWFuIHVwIHBvdGVudGlhbGx5IHdvbmt5IHVybHMuXG4gIGlmICh1dGlsLmlzU3RyaW5nKG9iaikpIG9iaiA9IHVybFBhcnNlKG9iaik7XG4gIGlmICghKG9iaiBpbnN0YW5jZW9mIFVybCkpIHJldHVybiBVcmwucHJvdG90eXBlLmZvcm1hdC5jYWxsKG9iaik7XG4gIHJldHVybiBvYmouZm9ybWF0KCk7XG59XG5cblVybC5wcm90b3R5cGUuZm9ybWF0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBhdXRoID0gdGhpcy5hdXRoIHx8ICcnO1xuICBpZiAoYXV0aCkge1xuICAgIGF1dGggPSBlbmNvZGVVUklDb21wb25lbnQoYXV0aCk7XG4gICAgYXV0aCA9IGF1dGgucmVwbGFjZSgvJTNBL2ksICc6Jyk7XG4gICAgYXV0aCArPSAnQCc7XG4gIH1cblxuICB2YXIgcHJvdG9jb2wgPSB0aGlzLnByb3RvY29sIHx8ICcnLFxuICAgICAgcGF0aG5hbWUgPSB0aGlzLnBhdGhuYW1lIHx8ICcnLFxuICAgICAgaGFzaCA9IHRoaXMuaGFzaCB8fCAnJyxcbiAgICAgIGhvc3QgPSBmYWxzZSxcbiAgICAgIHF1ZXJ5ID0gJyc7XG5cbiAgaWYgKHRoaXMuaG9zdCkge1xuICAgIGhvc3QgPSBhdXRoICsgdGhpcy5ob3N0O1xuICB9IGVsc2UgaWYgKHRoaXMuaG9zdG5hbWUpIHtcbiAgICBob3N0ID0gYXV0aCArICh0aGlzLmhvc3RuYW1lLmluZGV4T2YoJzonKSA9PT0gLTEgP1xuICAgICAgICB0aGlzLmhvc3RuYW1lIDpcbiAgICAgICAgJ1snICsgdGhpcy5ob3N0bmFtZSArICddJyk7XG4gICAgaWYgKHRoaXMucG9ydCkge1xuICAgICAgaG9zdCArPSAnOicgKyB0aGlzLnBvcnQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMucXVlcnkgJiZcbiAgICAgIHV0aWwuaXNPYmplY3QodGhpcy5xdWVyeSkgJiZcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMucXVlcnkpLmxlbmd0aCkge1xuICAgIHF1ZXJ5ID0gcXVlcnlzdHJpbmcuc3RyaW5naWZ5KHRoaXMucXVlcnkpO1xuICB9XG5cbiAgdmFyIHNlYXJjaCA9IHRoaXMuc2VhcmNoIHx8IChxdWVyeSAmJiAoJz8nICsgcXVlcnkpKSB8fCAnJztcblxuICBpZiAocHJvdG9jb2wgJiYgcHJvdG9jb2wuc3Vic3RyKC0xKSAhPT0gJzonKSBwcm90b2NvbCArPSAnOic7XG5cbiAgLy8gb25seSB0aGUgc2xhc2hlZFByb3RvY29scyBnZXQgdGhlIC8vLiAgTm90IG1haWx0bzosIHhtcHA6LCBldGMuXG4gIC8vIHVubGVzcyB0aGV5IGhhZCB0aGVtIHRvIGJlZ2luIHdpdGguXG4gIGlmICh0aGlzLnNsYXNoZXMgfHxcbiAgICAgICghcHJvdG9jb2wgfHwgc2xhc2hlZFByb3RvY29sW3Byb3RvY29sXSkgJiYgaG9zdCAhPT0gZmFsc2UpIHtcbiAgICBob3N0ID0gJy8vJyArIChob3N0IHx8ICcnKTtcbiAgICBpZiAocGF0aG5hbWUgJiYgcGF0aG5hbWUuY2hhckF0KDApICE9PSAnLycpIHBhdGhuYW1lID0gJy8nICsgcGF0aG5hbWU7XG4gIH0gZWxzZSBpZiAoIWhvc3QpIHtcbiAgICBob3N0ID0gJyc7XG4gIH1cblxuICBpZiAoaGFzaCAmJiBoYXNoLmNoYXJBdCgwKSAhPT0gJyMnKSBoYXNoID0gJyMnICsgaGFzaDtcbiAgaWYgKHNlYXJjaCAmJiBzZWFyY2guY2hhckF0KDApICE9PSAnPycpIHNlYXJjaCA9ICc/JyArIHNlYXJjaDtcblxuICBwYXRobmFtZSA9IHBhdGhuYW1lLnJlcGxhY2UoL1s/I10vZywgZnVuY3Rpb24obWF0Y2gpIHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KG1hdGNoKTtcbiAgfSk7XG4gIHNlYXJjaCA9IHNlYXJjaC5yZXBsYWNlKCcjJywgJyUyMycpO1xuXG4gIHJldHVybiBwcm90b2NvbCArIGhvc3QgKyBwYXRobmFtZSArIHNlYXJjaCArIGhhc2g7XG59O1xuXG5mdW5jdGlvbiB1cmxSZXNvbHZlKHNvdXJjZSwgcmVsYXRpdmUpIHtcbiAgcmV0dXJuIHVybFBhcnNlKHNvdXJjZSwgZmFsc2UsIHRydWUpLnJlc29sdmUocmVsYXRpdmUpO1xufVxuXG5VcmwucHJvdG90eXBlLnJlc29sdmUgPSBmdW5jdGlvbihyZWxhdGl2ZSkge1xuICByZXR1cm4gdGhpcy5yZXNvbHZlT2JqZWN0KHVybFBhcnNlKHJlbGF0aXZlLCBmYWxzZSwgdHJ1ZSkpLmZvcm1hdCgpO1xufTtcblxuZnVuY3Rpb24gdXJsUmVzb2x2ZU9iamVjdChzb3VyY2UsIHJlbGF0aXZlKSB7XG4gIGlmICghc291cmNlKSByZXR1cm4gcmVsYXRpdmU7XG4gIHJldHVybiB1cmxQYXJzZShzb3VyY2UsIGZhbHNlLCB0cnVlKS5yZXNvbHZlT2JqZWN0KHJlbGF0aXZlKTtcbn1cblxuVXJsLnByb3RvdHlwZS5yZXNvbHZlT2JqZWN0ID0gZnVuY3Rpb24ocmVsYXRpdmUpIHtcbiAgaWYgKHV0aWwuaXNTdHJpbmcocmVsYXRpdmUpKSB7XG4gICAgdmFyIHJlbCA9IG5ldyBVcmwoKTtcbiAgICByZWwucGFyc2UocmVsYXRpdmUsIGZhbHNlLCB0cnVlKTtcbiAgICByZWxhdGl2ZSA9IHJlbDtcbiAgfVxuXG4gIHZhciByZXN1bHQgPSBuZXcgVXJsKCk7XG4gIHZhciB0a2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpO1xuICBmb3IgKHZhciB0ayA9IDA7IHRrIDwgdGtleXMubGVuZ3RoOyB0aysrKSB7XG4gICAgdmFyIHRrZXkgPSB0a2V5c1t0a107XG4gICAgcmVzdWx0W3RrZXldID0gdGhpc1t0a2V5XTtcbiAgfVxuXG4gIC8vIGhhc2ggaXMgYWx3YXlzIG92ZXJyaWRkZW4sIG5vIG1hdHRlciB3aGF0LlxuICAvLyBldmVuIGhyZWY9XCJcIiB3aWxsIHJlbW92ZSBpdC5cbiAgcmVzdWx0Lmhhc2ggPSByZWxhdGl2ZS5oYXNoO1xuXG4gIC8vIGlmIHRoZSByZWxhdGl2ZSB1cmwgaXMgZW1wdHksIHRoZW4gdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZG8gaGVyZS5cbiAgaWYgKHJlbGF0aXZlLmhyZWYgPT09ICcnKSB7XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIGhyZWZzIGxpa2UgLy9mb28vYmFyIGFsd2F5cyBjdXQgdG8gdGhlIHByb3RvY29sLlxuICBpZiAocmVsYXRpdmUuc2xhc2hlcyAmJiAhcmVsYXRpdmUucHJvdG9jb2wpIHtcbiAgICAvLyB0YWtlIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBwcm90b2NvbCBmcm9tIHJlbGF0aXZlXG4gICAgdmFyIHJrZXlzID0gT2JqZWN0LmtleXMocmVsYXRpdmUpO1xuICAgIGZvciAodmFyIHJrID0gMDsgcmsgPCBya2V5cy5sZW5ndGg7IHJrKyspIHtcbiAgICAgIHZhciBya2V5ID0gcmtleXNbcmtdO1xuICAgICAgaWYgKHJrZXkgIT09ICdwcm90b2NvbCcpXG4gICAgICAgIHJlc3VsdFtya2V5XSA9IHJlbGF0aXZlW3JrZXldO1xuICAgIH1cblxuICAgIC8vdXJsUGFyc2UgYXBwZW5kcyB0cmFpbGluZyAvIHRvIHVybHMgbGlrZSBodHRwOi8vd3d3LmV4YW1wbGUuY29tXG4gICAgaWYgKHNsYXNoZWRQcm90b2NvbFtyZXN1bHQucHJvdG9jb2xdICYmXG4gICAgICAgIHJlc3VsdC5ob3N0bmFtZSAmJiAhcmVzdWx0LnBhdGhuYW1lKSB7XG4gICAgICByZXN1bHQucGF0aCA9IHJlc3VsdC5wYXRobmFtZSA9ICcvJztcbiAgICB9XG5cbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgaWYgKHJlbGF0aXZlLnByb3RvY29sICYmIHJlbGF0aXZlLnByb3RvY29sICE9PSByZXN1bHQucHJvdG9jb2wpIHtcbiAgICAvLyBpZiBpdCdzIGEga25vd24gdXJsIHByb3RvY29sLCB0aGVuIGNoYW5naW5nXG4gICAgLy8gdGhlIHByb3RvY29sIGRvZXMgd2VpcmQgdGhpbmdzXG4gICAgLy8gZmlyc3QsIGlmIGl0J3Mgbm90IGZpbGU6LCB0aGVuIHdlIE1VU1QgaGF2ZSBhIGhvc3QsXG4gICAgLy8gYW5kIGlmIHRoZXJlIHdhcyBhIHBhdGhcbiAgICAvLyB0byBiZWdpbiB3aXRoLCB0aGVuIHdlIE1VU1QgaGF2ZSBhIHBhdGguXG4gICAgLy8gaWYgaXQgaXMgZmlsZTosIHRoZW4gdGhlIGhvc3QgaXMgZHJvcHBlZCxcbiAgICAvLyBiZWNhdXNlIHRoYXQncyBrbm93biB0byBiZSBob3N0bGVzcy5cbiAgICAvLyBhbnl0aGluZyBlbHNlIGlzIGFzc3VtZWQgdG8gYmUgYWJzb2x1dGUuXG4gICAgaWYgKCFzbGFzaGVkUHJvdG9jb2xbcmVsYXRpdmUucHJvdG9jb2xdKSB7XG4gICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHJlbGF0aXZlKTtcbiAgICAgIGZvciAodmFyIHYgPSAwOyB2IDwga2V5cy5sZW5ndGg7IHYrKykge1xuICAgICAgICB2YXIgayA9IGtleXNbdl07XG4gICAgICAgIHJlc3VsdFtrXSA9IHJlbGF0aXZlW2tdO1xuICAgICAgfVxuICAgICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJlc3VsdC5wcm90b2NvbCA9IHJlbGF0aXZlLnByb3RvY29sO1xuICAgIGlmICghcmVsYXRpdmUuaG9zdCAmJiAhaG9zdGxlc3NQcm90b2NvbFtyZWxhdGl2ZS5wcm90b2NvbF0pIHtcbiAgICAgIHZhciByZWxQYXRoID0gKHJlbGF0aXZlLnBhdGhuYW1lIHx8ICcnKS5zcGxpdCgnLycpO1xuICAgICAgd2hpbGUgKHJlbFBhdGgubGVuZ3RoICYmICEocmVsYXRpdmUuaG9zdCA9IHJlbFBhdGguc2hpZnQoKSkpO1xuICAgICAgaWYgKCFyZWxhdGl2ZS5ob3N0KSByZWxhdGl2ZS5ob3N0ID0gJyc7XG4gICAgICBpZiAoIXJlbGF0aXZlLmhvc3RuYW1lKSByZWxhdGl2ZS5ob3N0bmFtZSA9ICcnO1xuICAgICAgaWYgKHJlbFBhdGhbMF0gIT09ICcnKSByZWxQYXRoLnVuc2hpZnQoJycpO1xuICAgICAgaWYgKHJlbFBhdGgubGVuZ3RoIDwgMikgcmVsUGF0aC51bnNoaWZ0KCcnKTtcbiAgICAgIHJlc3VsdC5wYXRobmFtZSA9IHJlbFBhdGguam9pbignLycpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucGF0aG5hbWUgPSByZWxhdGl2ZS5wYXRobmFtZTtcbiAgICB9XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgICByZXN1bHQuaG9zdCA9IHJlbGF0aXZlLmhvc3QgfHwgJyc7XG4gICAgcmVzdWx0LmF1dGggPSByZWxhdGl2ZS5hdXRoO1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9IHJlbGF0aXZlLmhvc3RuYW1lIHx8IHJlbGF0aXZlLmhvc3Q7XG4gICAgcmVzdWx0LnBvcnQgPSByZWxhdGl2ZS5wb3J0O1xuICAgIC8vIHRvIHN1cHBvcnQgaHR0cC5yZXF1ZXN0XG4gICAgaWYgKHJlc3VsdC5wYXRobmFtZSB8fCByZXN1bHQuc2VhcmNoKSB7XG4gICAgICB2YXIgcCA9IHJlc3VsdC5wYXRobmFtZSB8fCAnJztcbiAgICAgIHZhciBzID0gcmVzdWx0LnNlYXJjaCB8fCAnJztcbiAgICAgIHJlc3VsdC5wYXRoID0gcCArIHM7XG4gICAgfVxuICAgIHJlc3VsdC5zbGFzaGVzID0gcmVzdWx0LnNsYXNoZXMgfHwgcmVsYXRpdmUuc2xhc2hlcztcbiAgICByZXN1bHQuaHJlZiA9IHJlc3VsdC5mb3JtYXQoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdmFyIGlzU291cmNlQWJzID0gKHJlc3VsdC5wYXRobmFtZSAmJiByZXN1bHQucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycpLFxuICAgICAgaXNSZWxBYnMgPSAoXG4gICAgICAgICAgcmVsYXRpdmUuaG9zdCB8fFxuICAgICAgICAgIHJlbGF0aXZlLnBhdGhuYW1lICYmIHJlbGF0aXZlLnBhdGhuYW1lLmNoYXJBdCgwKSA9PT0gJy8nXG4gICAgICApLFxuICAgICAgbXVzdEVuZEFicyA9IChpc1JlbEFicyB8fCBpc1NvdXJjZUFicyB8fFxuICAgICAgICAgICAgICAgICAgICAocmVzdWx0Lmhvc3QgJiYgcmVsYXRpdmUucGF0aG5hbWUpKSxcbiAgICAgIHJlbW92ZUFsbERvdHMgPSBtdXN0RW5kQWJzLFxuICAgICAgc3JjUGF0aCA9IHJlc3VsdC5wYXRobmFtZSAmJiByZXN1bHQucGF0aG5hbWUuc3BsaXQoJy8nKSB8fCBbXSxcbiAgICAgIHJlbFBhdGggPSByZWxhdGl2ZS5wYXRobmFtZSAmJiByZWxhdGl2ZS5wYXRobmFtZS5zcGxpdCgnLycpIHx8IFtdLFxuICAgICAgcHN5Y2hvdGljID0gcmVzdWx0LnByb3RvY29sICYmICFzbGFzaGVkUHJvdG9jb2xbcmVzdWx0LnByb3RvY29sXTtcblxuICAvLyBpZiB0aGUgdXJsIGlzIGEgbm9uLXNsYXNoZWQgdXJsLCB0aGVuIHJlbGF0aXZlXG4gIC8vIGxpbmtzIGxpa2UgLi4vLi4gc2hvdWxkIGJlIGFibGVcbiAgLy8gdG8gY3Jhd2wgdXAgdG8gdGhlIGhvc3RuYW1lLCBhcyB3ZWxsLiAgVGhpcyBpcyBzdHJhbmdlLlxuICAvLyByZXN1bHQucHJvdG9jb2wgaGFzIGFscmVhZHkgYmVlbiBzZXQgYnkgbm93LlxuICAvLyBMYXRlciBvbiwgcHV0IHRoZSBmaXJzdCBwYXRoIHBhcnQgaW50byB0aGUgaG9zdCBmaWVsZC5cbiAgaWYgKHBzeWNob3RpYykge1xuICAgIHJlc3VsdC5ob3N0bmFtZSA9ICcnO1xuICAgIHJlc3VsdC5wb3J0ID0gbnVsbDtcbiAgICBpZiAocmVzdWx0Lmhvc3QpIHtcbiAgICAgIGlmIChzcmNQYXRoWzBdID09PSAnJykgc3JjUGF0aFswXSA9IHJlc3VsdC5ob3N0O1xuICAgICAgZWxzZSBzcmNQYXRoLnVuc2hpZnQocmVzdWx0Lmhvc3QpO1xuICAgIH1cbiAgICByZXN1bHQuaG9zdCA9ICcnO1xuICAgIGlmIChyZWxhdGl2ZS5wcm90b2NvbCkge1xuICAgICAgcmVsYXRpdmUuaG9zdG5hbWUgPSBudWxsO1xuICAgICAgcmVsYXRpdmUucG9ydCA9IG51bGw7XG4gICAgICBpZiAocmVsYXRpdmUuaG9zdCkge1xuICAgICAgICBpZiAocmVsUGF0aFswXSA9PT0gJycpIHJlbFBhdGhbMF0gPSByZWxhdGl2ZS5ob3N0O1xuICAgICAgICBlbHNlIHJlbFBhdGgudW5zaGlmdChyZWxhdGl2ZS5ob3N0KTtcbiAgICAgIH1cbiAgICAgIHJlbGF0aXZlLmhvc3QgPSBudWxsO1xuICAgIH1cbiAgICBtdXN0RW5kQWJzID0gbXVzdEVuZEFicyAmJiAocmVsUGF0aFswXSA9PT0gJycgfHwgc3JjUGF0aFswXSA9PT0gJycpO1xuICB9XG5cbiAgaWYgKGlzUmVsQWJzKSB7XG4gICAgLy8gaXQncyBhYnNvbHV0ZS5cbiAgICByZXN1bHQuaG9zdCA9IChyZWxhdGl2ZS5ob3N0IHx8IHJlbGF0aXZlLmhvc3QgPT09ICcnKSA/XG4gICAgICAgICAgICAgICAgICByZWxhdGl2ZS5ob3N0IDogcmVzdWx0Lmhvc3Q7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gKHJlbGF0aXZlLmhvc3RuYW1lIHx8IHJlbGF0aXZlLmhvc3RuYW1lID09PSAnJykgP1xuICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlLmhvc3RuYW1lIDogcmVzdWx0Lmhvc3RuYW1lO1xuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgc3JjUGF0aCA9IHJlbFBhdGg7XG4gICAgLy8gZmFsbCB0aHJvdWdoIHRvIHRoZSBkb3QtaGFuZGxpbmcgYmVsb3cuXG4gIH0gZWxzZSBpZiAocmVsUGF0aC5sZW5ndGgpIHtcbiAgICAvLyBpdCdzIHJlbGF0aXZlXG4gICAgLy8gdGhyb3cgYXdheSB0aGUgZXhpc3RpbmcgZmlsZSwgYW5kIHRha2UgdGhlIG5ldyBwYXRoIGluc3RlYWQuXG4gICAgaWYgKCFzcmNQYXRoKSBzcmNQYXRoID0gW107XG4gICAgc3JjUGF0aC5wb3AoKTtcbiAgICBzcmNQYXRoID0gc3JjUGF0aC5jb25jYXQocmVsUGF0aCk7XG4gICAgcmVzdWx0LnNlYXJjaCA9IHJlbGF0aXZlLnNlYXJjaDtcbiAgICByZXN1bHQucXVlcnkgPSByZWxhdGl2ZS5xdWVyeTtcbiAgfSBlbHNlIGlmICghdXRpbC5pc051bGxPclVuZGVmaW5lZChyZWxhdGl2ZS5zZWFyY2gpKSB7XG4gICAgLy8ganVzdCBwdWxsIG91dCB0aGUgc2VhcmNoLlxuICAgIC8vIGxpa2UgaHJlZj0nP2ZvbycuXG4gICAgLy8gUHV0IHRoaXMgYWZ0ZXIgdGhlIG90aGVyIHR3byBjYXNlcyBiZWNhdXNlIGl0IHNpbXBsaWZpZXMgdGhlIGJvb2xlYW5zXG4gICAgaWYgKHBzeWNob3RpYykge1xuICAgICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVzdWx0Lmhvc3QgPSBzcmNQYXRoLnNoaWZ0KCk7XG4gICAgICAvL29jY2F0aW9uYWx5IHRoZSBhdXRoIGNhbiBnZXQgc3R1Y2sgb25seSBpbiBob3N0XG4gICAgICAvL3RoaXMgZXNwZWNpYWxseSBoYXBwZW5zIGluIGNhc2VzIGxpa2VcbiAgICAgIC8vdXJsLnJlc29sdmVPYmplY3QoJ21haWx0bzpsb2NhbDFAZG9tYWluMScsICdsb2NhbDJAZG9tYWluMicpXG4gICAgICB2YXIgYXV0aEluSG9zdCA9IHJlc3VsdC5ob3N0ICYmIHJlc3VsdC5ob3N0LmluZGV4T2YoJ0AnKSA+IDAgP1xuICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuaG9zdC5zcGxpdCgnQCcpIDogZmFsc2U7XG4gICAgICBpZiAoYXV0aEluSG9zdCkge1xuICAgICAgICByZXN1bHQuYXV0aCA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgICAgcmVzdWx0Lmhvc3QgPSByZXN1bHQuaG9zdG5hbWUgPSBhdXRoSW5Ib3N0LnNoaWZ0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5zZWFyY2ggPSByZWxhdGl2ZS5zZWFyY2g7XG4gICAgcmVzdWx0LnF1ZXJ5ID0gcmVsYXRpdmUucXVlcnk7XG4gICAgLy90byBzdXBwb3J0IGh0dHAucmVxdWVzdFxuICAgIGlmICghdXRpbC5pc051bGwocmVzdWx0LnBhdGhuYW1lKSB8fCAhdXRpbC5pc051bGwocmVzdWx0LnNlYXJjaCkpIHtcbiAgICAgIHJlc3VsdC5wYXRoID0gKHJlc3VsdC5wYXRobmFtZSA/IHJlc3VsdC5wYXRobmFtZSA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgIChyZXN1bHQuc2VhcmNoID8gcmVzdWx0LnNlYXJjaCA6ICcnKTtcbiAgICB9XG4gICAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmICghc3JjUGF0aC5sZW5ndGgpIHtcbiAgICAvLyBubyBwYXRoIGF0IGFsbC4gIGVhc3kuXG4gICAgLy8gd2UndmUgYWxyZWFkeSBoYW5kbGVkIHRoZSBvdGhlciBzdHVmZiBhYm92ZS5cbiAgICByZXN1bHQucGF0aG5hbWUgPSBudWxsO1xuICAgIC8vdG8gc3VwcG9ydCBodHRwLnJlcXVlc3RcbiAgICBpZiAocmVzdWx0LnNlYXJjaCkge1xuICAgICAgcmVzdWx0LnBhdGggPSAnLycgKyByZXN1bHQuc2VhcmNoO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucGF0aCA9IG51bGw7XG4gICAgfVxuICAgIHJlc3VsdC5ocmVmID0gcmVzdWx0LmZvcm1hdCgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBpZiBhIHVybCBFTkRzIGluIC4gb3IgLi4sIHRoZW4gaXQgbXVzdCBnZXQgYSB0cmFpbGluZyBzbGFzaC5cbiAgLy8gaG93ZXZlciwgaWYgaXQgZW5kcyBpbiBhbnl0aGluZyBlbHNlIG5vbi1zbGFzaHksXG4gIC8vIHRoZW4gaXQgbXVzdCBOT1QgZ2V0IGEgdHJhaWxpbmcgc2xhc2guXG4gIHZhciBsYXN0ID0gc3JjUGF0aC5zbGljZSgtMSlbMF07XG4gIHZhciBoYXNUcmFpbGluZ1NsYXNoID0gKFxuICAgICAgKHJlc3VsdC5ob3N0IHx8IHJlbGF0aXZlLmhvc3QgfHwgc3JjUGF0aC5sZW5ndGggPiAxKSAmJlxuICAgICAgKGxhc3QgPT09ICcuJyB8fCBsYXN0ID09PSAnLi4nKSB8fCBsYXN0ID09PSAnJyk7XG5cbiAgLy8gc3RyaXAgc2luZ2xlIGRvdHMsIHJlc29sdmUgZG91YmxlIGRvdHMgdG8gcGFyZW50IGRpclxuICAvLyBpZiB0aGUgcGF0aCB0cmllcyB0byBnbyBhYm92ZSB0aGUgcm9vdCwgYHVwYCBlbmRzIHVwID4gMFxuICB2YXIgdXAgPSAwO1xuICBmb3IgKHZhciBpID0gc3JjUGF0aC5sZW5ndGg7IGkgPj0gMDsgaS0tKSB7XG4gICAgbGFzdCA9IHNyY1BhdGhbaV07XG4gICAgaWYgKGxhc3QgPT09ICcuJykge1xuICAgICAgc3JjUGF0aC5zcGxpY2UoaSwgMSk7XG4gICAgfSBlbHNlIGlmIChsYXN0ID09PSAnLi4nKSB7XG4gICAgICBzcmNQYXRoLnNwbGljZShpLCAxKTtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCkge1xuICAgICAgc3JjUGF0aC5zcGxpY2UoaSwgMSk7XG4gICAgICB1cC0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBwYXRoIGlzIGFsbG93ZWQgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIHJlc3RvcmUgbGVhZGluZyAuLnNcbiAgaWYgKCFtdXN0RW5kQWJzICYmICFyZW1vdmVBbGxEb3RzKSB7XG4gICAgZm9yICg7IHVwLS07IHVwKSB7XG4gICAgICBzcmNQYXRoLnVuc2hpZnQoJy4uJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKG11c3RFbmRBYnMgJiYgc3JjUGF0aFswXSAhPT0gJycgJiZcbiAgICAgICghc3JjUGF0aFswXSB8fCBzcmNQYXRoWzBdLmNoYXJBdCgwKSAhPT0gJy8nKSkge1xuICAgIHNyY1BhdGgudW5zaGlmdCgnJyk7XG4gIH1cblxuICBpZiAoaGFzVHJhaWxpbmdTbGFzaCAmJiAoc3JjUGF0aC5qb2luKCcvJykuc3Vic3RyKC0xKSAhPT0gJy8nKSkge1xuICAgIHNyY1BhdGgucHVzaCgnJyk7XG4gIH1cblxuICB2YXIgaXNBYnNvbHV0ZSA9IHNyY1BhdGhbMF0gPT09ICcnIHx8XG4gICAgICAoc3JjUGF0aFswXSAmJiBzcmNQYXRoWzBdLmNoYXJBdCgwKSA9PT0gJy8nKTtcblxuICAvLyBwdXQgdGhlIGhvc3QgYmFja1xuICBpZiAocHN5Y2hvdGljKSB7XG4gICAgcmVzdWx0Lmhvc3RuYW1lID0gcmVzdWx0Lmhvc3QgPSBpc0Fic29sdXRlID8gJycgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUGF0aC5sZW5ndGggPyBzcmNQYXRoLnNoaWZ0KCkgOiAnJztcbiAgICAvL29jY2F0aW9uYWx5IHRoZSBhdXRoIGNhbiBnZXQgc3R1Y2sgb25seSBpbiBob3N0XG4gICAgLy90aGlzIGVzcGVjaWFsbHkgaGFwcGVucyBpbiBjYXNlcyBsaWtlXG4gICAgLy91cmwucmVzb2x2ZU9iamVjdCgnbWFpbHRvOmxvY2FsMUBkb21haW4xJywgJ2xvY2FsMkBkb21haW4yJylcbiAgICB2YXIgYXV0aEluSG9zdCA9IHJlc3VsdC5ob3N0ICYmIHJlc3VsdC5ob3N0LmluZGV4T2YoJ0AnKSA+IDAgP1xuICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Lmhvc3Quc3BsaXQoJ0AnKSA6IGZhbHNlO1xuICAgIGlmIChhdXRoSW5Ib3N0KSB7XG4gICAgICByZXN1bHQuYXV0aCA9IGF1dGhJbkhvc3Quc2hpZnQoKTtcbiAgICAgIHJlc3VsdC5ob3N0ID0gcmVzdWx0Lmhvc3RuYW1lID0gYXV0aEluSG9zdC5zaGlmdCgpO1xuICAgIH1cbiAgfVxuXG4gIG11c3RFbmRBYnMgPSBtdXN0RW5kQWJzIHx8IChyZXN1bHQuaG9zdCAmJiBzcmNQYXRoLmxlbmd0aCk7XG5cbiAgaWYgKG11c3RFbmRBYnMgJiYgIWlzQWJzb2x1dGUpIHtcbiAgICBzcmNQYXRoLnVuc2hpZnQoJycpO1xuICB9XG5cbiAgaWYgKCFzcmNQYXRoLmxlbmd0aCkge1xuICAgIHJlc3VsdC5wYXRobmFtZSA9IG51bGw7XG4gICAgcmVzdWx0LnBhdGggPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdC5wYXRobmFtZSA9IHNyY1BhdGguam9pbignLycpO1xuICB9XG5cbiAgLy90byBzdXBwb3J0IHJlcXVlc3QuaHR0cFxuICBpZiAoIXV0aWwuaXNOdWxsKHJlc3VsdC5wYXRobmFtZSkgfHwgIXV0aWwuaXNOdWxsKHJlc3VsdC5zZWFyY2gpKSB7XG4gICAgcmVzdWx0LnBhdGggPSAocmVzdWx0LnBhdGhuYW1lID8gcmVzdWx0LnBhdGhuYW1lIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChyZXN1bHQuc2VhcmNoID8gcmVzdWx0LnNlYXJjaCA6ICcnKTtcbiAgfVxuICByZXN1bHQuYXV0aCA9IHJlbGF0aXZlLmF1dGggfHwgcmVzdWx0LmF1dGg7XG4gIHJlc3VsdC5zbGFzaGVzID0gcmVzdWx0LnNsYXNoZXMgfHwgcmVsYXRpdmUuc2xhc2hlcztcbiAgcmVzdWx0LmhyZWYgPSByZXN1bHQuZm9ybWF0KCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5VcmwucHJvdG90eXBlLnBhcnNlSG9zdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaG9zdCA9IHRoaXMuaG9zdDtcbiAgdmFyIHBvcnQgPSBwb3J0UGF0dGVybi5leGVjKGhvc3QpO1xuICBpZiAocG9ydCkge1xuICAgIHBvcnQgPSBwb3J0WzBdO1xuICAgIGlmIChwb3J0ICE9PSAnOicpIHtcbiAgICAgIHRoaXMucG9ydCA9IHBvcnQuc3Vic3RyKDEpO1xuICAgIH1cbiAgICBob3N0ID0gaG9zdC5zdWJzdHIoMCwgaG9zdC5sZW5ndGggLSBwb3J0Lmxlbmd0aCk7XG4gIH1cbiAgaWYgKGhvc3QpIHRoaXMuaG9zdG5hbWUgPSBob3N0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGlzU3RyaW5nOiBmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gdHlwZW9mKGFyZykgPT09ICdzdHJpbmcnO1xuICB9LFxuICBpc09iamVjdDogZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHR5cGVvZihhcmcpID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG4gIH0sXG4gIGlzTnVsbDogZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbiAgfSxcbiAgaXNOdWxsT3JVbmRlZmluZWQ6IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBhcmcgPT0gbnVsbDtcbiAgfVxufTtcbiIsIi8qISBodHRwczovL210aHMuYmUvdXRmOGpzIHYyLjEuMiBieSBAbWF0aGlhcyAqL1xuOyhmdW5jdGlvbihyb290KSB7XG5cblx0Ly8gRGV0ZWN0IGZyZWUgdmFyaWFibGVzIGBleHBvcnRzYFxuXHR2YXIgZnJlZUV4cG9ydHMgPSB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzO1xuXG5cdC8vIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgXG5cdHZhciBmcmVlTW9kdWxlID0gdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiZcblx0XHRtb2R1bGUuZXhwb3J0cyA9PSBmcmVlRXhwb3J0cyAmJiBtb2R1bGU7XG5cblx0Ly8gRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAsIGZyb20gTm9kZS5qcyBvciBCcm93c2VyaWZpZWQgY29kZSxcblx0Ly8gYW5kIHVzZSBpdCBhcyBgcm9vdGBcblx0dmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbDtcblx0aWYgKGZyZWVHbG9iYWwuZ2xvYmFsID09PSBmcmVlR2xvYmFsIHx8IGZyZWVHbG9iYWwud2luZG93ID09PSBmcmVlR2xvYmFsKSB7XG5cdFx0cm9vdCA9IGZyZWVHbG9iYWw7XG5cdH1cblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHR2YXIgc3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcblxuXHQvLyBUYWtlbiBmcm9tIGh0dHBzOi8vbXRocy5iZS9wdW55Y29kZVxuXHRmdW5jdGlvbiB1Y3MyZGVjb2RlKHN0cmluZykge1xuXHRcdHZhciBvdXRwdXQgPSBbXTtcblx0XHR2YXIgY291bnRlciA9IDA7XG5cdFx0dmFyIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG5cdFx0dmFyIHZhbHVlO1xuXHRcdHZhciBleHRyYTtcblx0XHR3aGlsZSAoY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0dmFsdWUgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuXHRcdFx0aWYgKHZhbHVlID49IDB4RDgwMCAmJiB2YWx1ZSA8PSAweERCRkYgJiYgY291bnRlciA8IGxlbmd0aCkge1xuXHRcdFx0XHQvLyBoaWdoIHN1cnJvZ2F0ZSwgYW5kIHRoZXJlIGlzIGEgbmV4dCBjaGFyYWN0ZXJcblx0XHRcdFx0ZXh0cmEgPSBzdHJpbmcuY2hhckNvZGVBdChjb3VudGVyKyspO1xuXHRcdFx0XHRpZiAoKGV4dHJhICYgMHhGQzAwKSA9PSAweERDMDApIHsgLy8gbG93IHN1cnJvZ2F0ZVxuXHRcdFx0XHRcdG91dHB1dC5wdXNoKCgodmFsdWUgJiAweDNGRikgPDwgMTApICsgKGV4dHJhICYgMHgzRkYpICsgMHgxMDAwMCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gdW5tYXRjaGVkIHN1cnJvZ2F0ZTsgb25seSBhcHBlbmQgdGhpcyBjb2RlIHVuaXQsIGluIGNhc2UgdGhlIG5leHRcblx0XHRcdFx0XHQvLyBjb2RlIHVuaXQgaXMgdGhlIGhpZ2ggc3Vycm9nYXRlIG9mIGEgc3Vycm9nYXRlIHBhaXJcblx0XHRcdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0XHRcdFx0Y291bnRlci0tO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvdXRwdXQucHVzaCh2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBvdXRwdXQ7XG5cdH1cblxuXHQvLyBUYWtlbiBmcm9tIGh0dHBzOi8vbXRocy5iZS9wdW55Y29kZVxuXHRmdW5jdGlvbiB1Y3MyZW5jb2RlKGFycmF5KSB7XG5cdFx0dmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcblx0XHR2YXIgaW5kZXggPSAtMTtcblx0XHR2YXIgdmFsdWU7XG5cdFx0dmFyIG91dHB1dCA9ICcnO1xuXHRcdHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7XG5cdFx0XHR2YWx1ZSA9IGFycmF5W2luZGV4XTtcblx0XHRcdGlmICh2YWx1ZSA+IDB4RkZGRikge1xuXHRcdFx0XHR2YWx1ZSAtPSAweDEwMDAwO1xuXHRcdFx0XHRvdXRwdXQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKHZhbHVlID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKTtcblx0XHRcdFx0dmFsdWUgPSAweERDMDAgfCB2YWx1ZSAmIDB4M0ZGO1xuXHRcdFx0fVxuXHRcdFx0b3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZSh2YWx1ZSk7XG5cdFx0fVxuXHRcdHJldHVybiBvdXRwdXQ7XG5cdH1cblxuXHRmdW5jdGlvbiBjaGVja1NjYWxhclZhbHVlKGNvZGVQb2ludCkge1xuXHRcdGlmIChjb2RlUG9pbnQgPj0gMHhEODAwICYmIGNvZGVQb2ludCA8PSAweERGRkYpIHtcblx0XHRcdHRocm93IEVycm9yKFxuXHRcdFx0XHQnTG9uZSBzdXJyb2dhdGUgVSsnICsgY29kZVBvaW50LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpICtcblx0XHRcdFx0JyBpcyBub3QgYSBzY2FsYXIgdmFsdWUnXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHRmdW5jdGlvbiBjcmVhdGVCeXRlKGNvZGVQb2ludCwgc2hpZnQpIHtcblx0XHRyZXR1cm4gc3RyaW5nRnJvbUNoYXJDb2RlKCgoY29kZVBvaW50ID4+IHNoaWZ0KSAmIDB4M0YpIHwgMHg4MCk7XG5cdH1cblxuXHRmdW5jdGlvbiBlbmNvZGVDb2RlUG9pbnQoY29kZVBvaW50KSB7XG5cdFx0aWYgKChjb2RlUG9pbnQgJiAweEZGRkZGRjgwKSA9PSAwKSB7IC8vIDEtYnl0ZSBzZXF1ZW5jZVxuXHRcdFx0cmV0dXJuIHN0cmluZ0Zyb21DaGFyQ29kZShjb2RlUG9pbnQpO1xuXHRcdH1cblx0XHR2YXIgc3ltYm9sID0gJyc7XG5cdFx0aWYgKChjb2RlUG9pbnQgJiAweEZGRkZGODAwKSA9PSAwKSB7IC8vIDItYnl0ZSBzZXF1ZW5jZVxuXHRcdFx0c3ltYm9sID0gc3RyaW5nRnJvbUNoYXJDb2RlKCgoY29kZVBvaW50ID4+IDYpICYgMHgxRikgfCAweEMwKTtcblx0XHR9XG5cdFx0ZWxzZSBpZiAoKGNvZGVQb2ludCAmIDB4RkZGRjAwMDApID09IDApIHsgLy8gMy1ieXRlIHNlcXVlbmNlXG5cdFx0XHRjaGVja1NjYWxhclZhbHVlKGNvZGVQb2ludCk7XG5cdFx0XHRzeW1ib2wgPSBzdHJpbmdGcm9tQ2hhckNvZGUoKChjb2RlUG9pbnQgPj4gMTIpICYgMHgwRikgfCAweEUwKTtcblx0XHRcdHN5bWJvbCArPSBjcmVhdGVCeXRlKGNvZGVQb2ludCwgNik7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKChjb2RlUG9pbnQgJiAweEZGRTAwMDAwKSA9PSAwKSB7IC8vIDQtYnl0ZSBzZXF1ZW5jZVxuXHRcdFx0c3ltYm9sID0gc3RyaW5nRnJvbUNoYXJDb2RlKCgoY29kZVBvaW50ID4+IDE4KSAmIDB4MDcpIHwgMHhGMCk7XG5cdFx0XHRzeW1ib2wgKz0gY3JlYXRlQnl0ZShjb2RlUG9pbnQsIDEyKTtcblx0XHRcdHN5bWJvbCArPSBjcmVhdGVCeXRlKGNvZGVQb2ludCwgNik7XG5cdFx0fVxuXHRcdHN5bWJvbCArPSBzdHJpbmdGcm9tQ2hhckNvZGUoKGNvZGVQb2ludCAmIDB4M0YpIHwgMHg4MCk7XG5cdFx0cmV0dXJuIHN5bWJvbDtcblx0fVxuXG5cdGZ1bmN0aW9uIHV0ZjhlbmNvZGUoc3RyaW5nKSB7XG5cdFx0dmFyIGNvZGVQb2ludHMgPSB1Y3MyZGVjb2RlKHN0cmluZyk7XG5cdFx0dmFyIGxlbmd0aCA9IGNvZGVQb2ludHMubGVuZ3RoO1xuXHRcdHZhciBpbmRleCA9IC0xO1xuXHRcdHZhciBjb2RlUG9pbnQ7XG5cdFx0dmFyIGJ5dGVTdHJpbmcgPSAnJztcblx0XHR3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuXHRcdFx0Y29kZVBvaW50ID0gY29kZVBvaW50c1tpbmRleF07XG5cdFx0XHRieXRlU3RyaW5nICs9IGVuY29kZUNvZGVQb2ludChjb2RlUG9pbnQpO1xuXHRcdH1cblx0XHRyZXR1cm4gYnl0ZVN0cmluZztcblx0fVxuXG5cdC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG5cdGZ1bmN0aW9uIHJlYWRDb250aW51YXRpb25CeXRlKCkge1xuXHRcdGlmIChieXRlSW5kZXggPj0gYnl0ZUNvdW50KSB7XG5cdFx0XHR0aHJvdyBFcnJvcignSW52YWxpZCBieXRlIGluZGV4Jyk7XG5cdFx0fVxuXG5cdFx0dmFyIGNvbnRpbnVhdGlvbkJ5dGUgPSBieXRlQXJyYXlbYnl0ZUluZGV4XSAmIDB4RkY7XG5cdFx0Ynl0ZUluZGV4Kys7XG5cblx0XHRpZiAoKGNvbnRpbnVhdGlvbkJ5dGUgJiAweEMwKSA9PSAweDgwKSB7XG5cdFx0XHRyZXR1cm4gY29udGludWF0aW9uQnl0ZSAmIDB4M0Y7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgd2UgZW5kIHVwIGhlcmUsIGl04oCZcyBub3QgYSBjb250aW51YXRpb24gYnl0ZVxuXHRcdHRocm93IEVycm9yKCdJbnZhbGlkIGNvbnRpbnVhdGlvbiBieXRlJyk7XG5cdH1cblxuXHRmdW5jdGlvbiBkZWNvZGVTeW1ib2woKSB7XG5cdFx0dmFyIGJ5dGUxO1xuXHRcdHZhciBieXRlMjtcblx0XHR2YXIgYnl0ZTM7XG5cdFx0dmFyIGJ5dGU0O1xuXHRcdHZhciBjb2RlUG9pbnQ7XG5cblx0XHRpZiAoYnl0ZUluZGV4ID4gYnl0ZUNvdW50KSB7XG5cdFx0XHR0aHJvdyBFcnJvcignSW52YWxpZCBieXRlIGluZGV4Jyk7XG5cdFx0fVxuXG5cdFx0aWYgKGJ5dGVJbmRleCA9PSBieXRlQ291bnQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyBSZWFkIGZpcnN0IGJ5dGVcblx0XHRieXRlMSA9IGJ5dGVBcnJheVtieXRlSW5kZXhdICYgMHhGRjtcblx0XHRieXRlSW5kZXgrKztcblxuXHRcdC8vIDEtYnl0ZSBzZXF1ZW5jZSAobm8gY29udGludWF0aW9uIGJ5dGVzKVxuXHRcdGlmICgoYnl0ZTEgJiAweDgwKSA9PSAwKSB7XG5cdFx0XHRyZXR1cm4gYnl0ZTE7XG5cdFx0fVxuXG5cdFx0Ly8gMi1ieXRlIHNlcXVlbmNlXG5cdFx0aWYgKChieXRlMSAmIDB4RTApID09IDB4QzApIHtcblx0XHRcdGJ5dGUyID0gcmVhZENvbnRpbnVhdGlvbkJ5dGUoKTtcblx0XHRcdGNvZGVQb2ludCA9ICgoYnl0ZTEgJiAweDFGKSA8PCA2KSB8IGJ5dGUyO1xuXHRcdFx0aWYgKGNvZGVQb2ludCA+PSAweDgwKSB7XG5cdFx0XHRcdHJldHVybiBjb2RlUG9pbnQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBFcnJvcignSW52YWxpZCBjb250aW51YXRpb24gYnl0ZScpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIDMtYnl0ZSBzZXF1ZW5jZSAobWF5IGluY2x1ZGUgdW5wYWlyZWQgc3Vycm9nYXRlcylcblx0XHRpZiAoKGJ5dGUxICYgMHhGMCkgPT0gMHhFMCkge1xuXHRcdFx0Ynl0ZTIgPSByZWFkQ29udGludWF0aW9uQnl0ZSgpO1xuXHRcdFx0Ynl0ZTMgPSByZWFkQ29udGludWF0aW9uQnl0ZSgpO1xuXHRcdFx0Y29kZVBvaW50ID0gKChieXRlMSAmIDB4MEYpIDw8IDEyKSB8IChieXRlMiA8PCA2KSB8IGJ5dGUzO1xuXHRcdFx0aWYgKGNvZGVQb2ludCA+PSAweDA4MDApIHtcblx0XHRcdFx0Y2hlY2tTY2FsYXJWYWx1ZShjb2RlUG9pbnQpO1xuXHRcdFx0XHRyZXR1cm4gY29kZVBvaW50O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhyb3cgRXJyb3IoJ0ludmFsaWQgY29udGludWF0aW9uIGJ5dGUnKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyA0LWJ5dGUgc2VxdWVuY2Vcblx0XHRpZiAoKGJ5dGUxICYgMHhGOCkgPT0gMHhGMCkge1xuXHRcdFx0Ynl0ZTIgPSByZWFkQ29udGludWF0aW9uQnl0ZSgpO1xuXHRcdFx0Ynl0ZTMgPSByZWFkQ29udGludWF0aW9uQnl0ZSgpO1xuXHRcdFx0Ynl0ZTQgPSByZWFkQ29udGludWF0aW9uQnl0ZSgpO1xuXHRcdFx0Y29kZVBvaW50ID0gKChieXRlMSAmIDB4MDcpIDw8IDB4MTIpIHwgKGJ5dGUyIDw8IDB4MEMpIHxcblx0XHRcdFx0KGJ5dGUzIDw8IDB4MDYpIHwgYnl0ZTQ7XG5cdFx0XHRpZiAoY29kZVBvaW50ID49IDB4MDEwMDAwICYmIGNvZGVQb2ludCA8PSAweDEwRkZGRikge1xuXHRcdFx0XHRyZXR1cm4gY29kZVBvaW50O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRocm93IEVycm9yKCdJbnZhbGlkIFVURi04IGRldGVjdGVkJyk7XG5cdH1cblxuXHR2YXIgYnl0ZUFycmF5O1xuXHR2YXIgYnl0ZUNvdW50O1xuXHR2YXIgYnl0ZUluZGV4O1xuXHRmdW5jdGlvbiB1dGY4ZGVjb2RlKGJ5dGVTdHJpbmcpIHtcblx0XHRieXRlQXJyYXkgPSB1Y3MyZGVjb2RlKGJ5dGVTdHJpbmcpO1xuXHRcdGJ5dGVDb3VudCA9IGJ5dGVBcnJheS5sZW5ndGg7XG5cdFx0Ynl0ZUluZGV4ID0gMDtcblx0XHR2YXIgY29kZVBvaW50cyA9IFtdO1xuXHRcdHZhciB0bXA7XG5cdFx0d2hpbGUgKCh0bXAgPSBkZWNvZGVTeW1ib2woKSkgIT09IGZhbHNlKSB7XG5cdFx0XHRjb2RlUG9pbnRzLnB1c2godG1wKTtcblx0XHR9XG5cdFx0cmV0dXJuIHVjczJlbmNvZGUoY29kZVBvaW50cyk7XG5cdH1cblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHR2YXIgdXRmOCA9IHtcblx0XHQndmVyc2lvbic6ICcyLjEuMicsXG5cdFx0J2VuY29kZSc6IHV0ZjhlbmNvZGUsXG5cdFx0J2RlY29kZSc6IHV0ZjhkZWNvZGVcblx0fTtcblxuXHQvLyBTb21lIEFNRCBidWlsZCBvcHRpbWl6ZXJzLCBsaWtlIHIuanMsIGNoZWNrIGZvciBzcGVjaWZpYyBjb25kaXRpb24gcGF0dGVybnNcblx0Ly8gbGlrZSB0aGUgZm9sbG93aW5nOlxuXHRpZiAoXG5cdFx0dHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmXG5cdFx0dHlwZW9mIGRlZmluZS5hbWQgPT0gJ29iamVjdCcgJiZcblx0XHRkZWZpbmUuYW1kXG5cdCkge1xuXHRcdGRlZmluZShmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB1dGY4O1xuXHRcdH0pO1xuXHR9XHRlbHNlIGlmIChmcmVlRXhwb3J0cyAmJiAhZnJlZUV4cG9ydHMubm9kZVR5cGUpIHtcblx0XHRpZiAoZnJlZU1vZHVsZSkgeyAvLyBpbiBOb2RlLmpzIG9yIFJpbmdvSlMgdjAuOC4wK1xuXHRcdFx0ZnJlZU1vZHVsZS5leHBvcnRzID0gdXRmODtcblx0XHR9IGVsc2UgeyAvLyBpbiBOYXJ3aGFsIG9yIFJpbmdvSlMgdjAuNy4wLVxuXHRcdFx0dmFyIG9iamVjdCA9IHt9O1xuXHRcdFx0dmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0Lmhhc093blByb3BlcnR5O1xuXHRcdFx0Zm9yICh2YXIga2V5IGluIHV0ZjgpIHtcblx0XHRcdFx0aGFzT3duUHJvcGVydHkuY2FsbCh1dGY4LCBrZXkpICYmIChmcmVlRXhwb3J0c1trZXldID0gdXRmOFtrZXldKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSB7IC8vIGluIFJoaW5vIG9yIGEgd2ViIGJyb3dzZXJcblx0XHRyb290LnV0ZjggPSB1dGY4O1xuXHR9XG5cbn0odGhpcykpO1xuIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNC0yMDE1LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudFxuICogb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFNpbWlsYXIgdG8gaW52YXJpYW50IGJ1dCBvbmx5IGxvZ3MgYSB3YXJuaW5nIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IG1ldC5cbiAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gbG9nIGlzc3VlcyBpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMgaW4gY3JpdGljYWxcbiAqIHBhdGhzLiBSZW1vdmluZyB0aGUgbG9nZ2luZyBjb2RlIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50cyB3aWxsIGtlZXAgdGhlXG4gKiBzYW1lIGxvZ2ljIGFuZCBmb2xsb3cgdGhlIHNhbWUgY29kZSBwYXRocy5cbiAqL1xuXG52YXIgd2FybmluZyA9IGZ1bmN0aW9uKCkge307XG5cbmlmIChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykge1xuICB3YXJuaW5nID0gZnVuY3Rpb24oY29uZGl0aW9uLCBmb3JtYXQsIGFyZ3MpIHtcbiAgICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICBhcmdzID0gbmV3IEFycmF5KGxlbiA+IDIgPyBsZW4gLSAyIDogMCk7XG4gICAgZm9yICh2YXIga2V5ID0gMjsga2V5IDwgbGVuOyBrZXkrKykge1xuICAgICAgYXJnc1trZXkgLSAyXSA9IGFyZ3VtZW50c1trZXldO1xuICAgIH1cbiAgICBpZiAoZm9ybWF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2B3YXJuaW5nKGNvbmRpdGlvbiwgZm9ybWF0LCAuLi5hcmdzKWAgcmVxdWlyZXMgYSB3YXJuaW5nICcgK1xuICAgICAgICAnbWVzc2FnZSBhcmd1bWVudCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGZvcm1hdC5sZW5ndGggPCAxMCB8fCAoL15bc1xcV10qJC8pLnRlc3QoZm9ybWF0KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIHdhcm5pbmcgZm9ybWF0IHNob3VsZCBiZSBhYmxlIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMgJyArXG4gICAgICAgICd3YXJuaW5nLiBQbGVhc2UsIHVzZSBhIG1vcmUgZGVzY3JpcHRpdmUgZm9ybWF0IHRoYW46ICcgKyBmb3JtYXRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFjb25kaXRpb24pIHtcbiAgICAgIHZhciBhcmdJbmRleCA9IDA7XG4gICAgICB2YXIgbWVzc2FnZSA9ICdXYXJuaW5nOiAnICtcbiAgICAgICAgZm9ybWF0LnJlcGxhY2UoLyVzL2csIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBhcmdzW2FyZ0luZGV4KytdO1xuICAgICAgICB9KTtcbiAgICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgZXJyb3Igd2FzIHRocm93biBhcyBhIGNvbnZlbmllbmNlIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhpcyBzdGFja1xuICAgICAgICAvLyB0byBmaW5kIHRoZSBjYWxsc2l0ZSB0aGF0IGNhdXNlZCB0aGlzIHdhcm5pbmcgdG8gZmlyZS5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBjYXRjaCh4KSB7fVxuICAgIH1cbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB3YXJuaW5nO1xuIiwidmFyIGJ1bmRsZUZuID0gYXJndW1lbnRzWzNdO1xudmFyIHNvdXJjZXMgPSBhcmd1bWVudHNbNF07XG52YXIgY2FjaGUgPSBhcmd1bWVudHNbNV07XG5cbnZhciBzdHJpbmdpZnkgPSBKU09OLnN0cmluZ2lmeTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIG9wdGlvbnMpIHtcbiAgICB2YXIgd2tleTtcbiAgICB2YXIgY2FjaGVLZXlzID0gT2JqZWN0LmtleXMoY2FjaGUpO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGwgPSBjYWNoZUtleXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIHZhciBrZXkgPSBjYWNoZUtleXNbaV07XG4gICAgICAgIHZhciBleHAgPSBjYWNoZVtrZXldLmV4cG9ydHM7XG4gICAgICAgIC8vIFVzaW5nIGJhYmVsIGFzIGEgdHJhbnNwaWxlciB0byB1c2UgZXNtb2R1bGUsIHRoZSBleHBvcnQgd2lsbCBhbHdheXNcbiAgICAgICAgLy8gYmUgYW4gb2JqZWN0IHdpdGggdGhlIGRlZmF1bHQgZXhwb3J0IGFzIGEgcHJvcGVydHkgb2YgaXQuIFRvIGVuc3VyZVxuICAgICAgICAvLyB0aGUgZXhpc3RpbmcgYXBpIGFuZCBiYWJlbCBlc21vZHVsZSBleHBvcnRzIGFyZSBib3RoIHN1cHBvcnRlZCB3ZVxuICAgICAgICAvLyBjaGVjayBmb3IgYm90aFxuICAgICAgICBpZiAoZXhwID09PSBmbiB8fCBleHAgJiYgZXhwLmRlZmF1bHQgPT09IGZuKSB7XG4gICAgICAgICAgICB3a2V5ID0ga2V5O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXdrZXkpIHtcbiAgICAgICAgd2tleSA9IE1hdGguZmxvb3IoTWF0aC5wb3coMTYsIDgpICogTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoMTYpO1xuICAgICAgICB2YXIgd2NhY2hlID0ge307XG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gY2FjaGVLZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgdmFyIGtleSA9IGNhY2hlS2V5c1tpXTtcbiAgICAgICAgICAgIHdjYWNoZVtrZXldID0ga2V5O1xuICAgICAgICB9XG4gICAgICAgIHNvdXJjZXNbd2tleV0gPSBbXG4gICAgICAgICAgICBGdW5jdGlvbihbJ3JlcXVpcmUnLCdtb2R1bGUnLCdleHBvcnRzJ10sICcoJyArIGZuICsgJykoc2VsZiknKSxcbiAgICAgICAgICAgIHdjYWNoZVxuICAgICAgICBdO1xuICAgIH1cbiAgICB2YXIgc2tleSA9IE1hdGguZmxvb3IoTWF0aC5wb3coMTYsIDgpICogTWF0aC5yYW5kb20oKSkudG9TdHJpbmcoMTYpO1xuXG4gICAgdmFyIHNjYWNoZSA9IHt9OyBzY2FjaGVbd2tleV0gPSB3a2V5O1xuICAgIHNvdXJjZXNbc2tleV0gPSBbXG4gICAgICAgIEZ1bmN0aW9uKFsncmVxdWlyZSddLCAoXG4gICAgICAgICAgICAvLyB0cnkgdG8gY2FsbCBkZWZhdWx0IGlmIGRlZmluZWQgdG8gYWxzbyBzdXBwb3J0IGJhYmVsIGVzbW9kdWxlXG4gICAgICAgICAgICAvLyBleHBvcnRzXG4gICAgICAgICAgICAndmFyIGYgPSByZXF1aXJlKCcgKyBzdHJpbmdpZnkod2tleSkgKyAnKTsnICtcbiAgICAgICAgICAgICcoZi5kZWZhdWx0ID8gZi5kZWZhdWx0IDogZikoc2VsZik7J1xuICAgICAgICApKSxcbiAgICAgICAgc2NhY2hlXG4gICAgXTtcblxuICAgIHZhciB3b3JrZXJTb3VyY2VzID0ge307XG4gICAgcmVzb2x2ZVNvdXJjZXMoc2tleSk7XG5cbiAgICBmdW5jdGlvbiByZXNvbHZlU291cmNlcyhrZXkpIHtcbiAgICAgICAgd29ya2VyU291cmNlc1trZXldID0gdHJ1ZTtcblxuICAgICAgICBmb3IgKHZhciBkZXBQYXRoIGluIHNvdXJjZXNba2V5XVsxXSkge1xuICAgICAgICAgICAgdmFyIGRlcEtleSA9IHNvdXJjZXNba2V5XVsxXVtkZXBQYXRoXTtcbiAgICAgICAgICAgIGlmICghd29ya2VyU291cmNlc1tkZXBLZXldKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZVNvdXJjZXMoZGVwS2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBzcmMgPSAnKCcgKyBidW5kbGVGbiArICcpKHsnXG4gICAgICAgICsgT2JqZWN0LmtleXMod29ya2VyU291cmNlcykubWFwKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdpZnkoa2V5KSArICc6WydcbiAgICAgICAgICAgICAgICArIHNvdXJjZXNba2V5XVswXVxuICAgICAgICAgICAgICAgICsgJywnICsgc3RyaW5naWZ5KHNvdXJjZXNba2V5XVsxXSkgKyAnXSdcbiAgICAgICAgICAgIDtcbiAgICAgICAgfSkuam9pbignLCcpXG4gICAgICAgICsgJ30se30sWycgKyBzdHJpbmdpZnkoc2tleSkgKyAnXSknXG4gICAgO1xuXG4gICAgdmFyIFVSTCA9IHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTCB8fCB3aW5kb3cubW96VVJMIHx8IHdpbmRvdy5tc1VSTDtcblxuICAgIHZhciBibG9iID0gbmV3IEJsb2IoW3NyY10sIHsgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcgfSk7XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5iYXJlKSB7IHJldHVybiBibG9iOyB9XG4gICAgdmFyIHdvcmtlclVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXIod29ya2VyVXJsKTtcbiAgICB3b3JrZXIub2JqZWN0VVJMID0gd29ya2VyVXJsO1xuICAgIHJldHVybiB3b3JrZXI7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkNIQVJTRVRTID0ge307XG5leHBvcnRzLkRFRkFVTFRfQ0hBUlNFVCA9IGV4cG9ydHMuQ0hBUlNFVFNbJ0InXTtcbmV4cG9ydHMuQ0hBUlNFVFNbJzAnXSA9IHtcbiAgICAnYCc6ICdcXHUyNWM2JyxcbiAgICAnYSc6ICdcXHUyNTkyJyxcbiAgICAnYic6ICdcXHUwMDA5JyxcbiAgICAnYyc6ICdcXHUwMDBjJyxcbiAgICAnZCc6ICdcXHUwMDBkJyxcbiAgICAnZSc6ICdcXHUwMDBhJyxcbiAgICAnZic6ICdcXHUwMGIwJyxcbiAgICAnZyc6ICdcXHUwMGIxJyxcbiAgICAnaCc6ICdcXHUyNDI0JyxcbiAgICAnaSc6ICdcXHUwMDBiJyxcbiAgICAnaic6ICdcXHUyNTE4JyxcbiAgICAnayc6ICdcXHUyNTEwJyxcbiAgICAnbCc6ICdcXHUyNTBjJyxcbiAgICAnbSc6ICdcXHUyNTE0JyxcbiAgICAnbic6ICdcXHUyNTNjJyxcbiAgICAnbyc6ICdcXHUyM2JhJyxcbiAgICAncCc6ICdcXHUyM2JiJyxcbiAgICAncSc6ICdcXHUyNTAwJyxcbiAgICAncic6ICdcXHUyM2JjJyxcbiAgICAncyc6ICdcXHUyM2JkJyxcbiAgICAndCc6ICdcXHUyNTFjJyxcbiAgICAndSc6ICdcXHUyNTI0JyxcbiAgICAndic6ICdcXHUyNTM0JyxcbiAgICAndyc6ICdcXHUyNTJjJyxcbiAgICAneCc6ICdcXHUyNTAyJyxcbiAgICAneSc6ICdcXHUyMjY0JyxcbiAgICAneic6ICdcXHUyMjY1JyxcbiAgICAneyc6ICdcXHUwM2MwJyxcbiAgICAnfCc6ICdcXHUyMjYwJyxcbiAgICAnfSc6ICdcXHUwMGEzJyxcbiAgICAnfic6ICdcXHUwMGI3J1xufTtcbmV4cG9ydHMuQ0hBUlNFVFNbJ0EnXSA9IHtcbiAgICAnIyc6ICfCoydcbn07XG5leHBvcnRzLkNIQVJTRVRTWydCJ10gPSBudWxsO1xuZXhwb3J0cy5DSEFSU0VUU1snNCddID0ge1xuICAgICcjJzogJ8KjJyxcbiAgICAnQCc6ICfCvicsXG4gICAgJ1snOiAnaWonLFxuICAgICdcXFxcJzogJ8K9JyxcbiAgICAnXSc6ICd8JyxcbiAgICAneyc6ICfCqCcsXG4gICAgJ3wnOiAnZicsXG4gICAgJ30nOiAnwrwnLFxuICAgICd+JzogJ8K0J1xufTtcbmV4cG9ydHMuQ0hBUlNFVFNbJ0MnXSA9XG4gICAgZXhwb3J0cy5DSEFSU0VUU1snNSddID0ge1xuICAgICAgICAnWyc6ICfDhCcsXG4gICAgICAgICdcXFxcJzogJ8OWJyxcbiAgICAgICAgJ10nOiAnw4UnLFxuICAgICAgICAnXic6ICfDnCcsXG4gICAgICAgICdgJzogJ8OpJyxcbiAgICAgICAgJ3snOiAnw6QnLFxuICAgICAgICAnfCc6ICfDticsXG4gICAgICAgICd9JzogJ8OlJyxcbiAgICAgICAgJ34nOiAnw7wnXG4gICAgfTtcbmV4cG9ydHMuQ0hBUlNFVFNbJ1InXSA9IHtcbiAgICAnIyc6ICfCoycsXG4gICAgJ0AnOiAnw6AnLFxuICAgICdbJzogJ8KwJyxcbiAgICAnXFxcXCc6ICfDpycsXG4gICAgJ10nOiAnwqcnLFxuICAgICd7JzogJ8OpJyxcbiAgICAnfCc6ICfDuScsXG4gICAgJ30nOiAnw6gnLFxuICAgICd+JzogJ8KoJ1xufTtcbmV4cG9ydHMuQ0hBUlNFVFNbJ1EnXSA9IHtcbiAgICAnQCc6ICfDoCcsXG4gICAgJ1snOiAnw6InLFxuICAgICdcXFxcJzogJ8OnJyxcbiAgICAnXSc6ICfDqicsXG4gICAgJ14nOiAnw64nLFxuICAgICdgJzogJ8O0JyxcbiAgICAneyc6ICfDqScsXG4gICAgJ3wnOiAnw7knLFxuICAgICd9JzogJ8OoJyxcbiAgICAnfic6ICfDuydcbn07XG5leHBvcnRzLkNIQVJTRVRTWydLJ10gPSB7XG4gICAgJ0AnOiAnwqcnLFxuICAgICdbJzogJ8OEJyxcbiAgICAnXFxcXCc6ICfDlicsXG4gICAgJ10nOiAnw5wnLFxuICAgICd7JzogJ8OkJyxcbiAgICAnfCc6ICfDticsXG4gICAgJ30nOiAnw7wnLFxuICAgICd+JzogJ8OfJ1xufTtcbmV4cG9ydHMuQ0hBUlNFVFNbJ1knXSA9IHtcbiAgICAnIyc6ICfCoycsXG4gICAgJ0AnOiAnwqcnLFxuICAgICdbJzogJ8KwJyxcbiAgICAnXFxcXCc6ICfDpycsXG4gICAgJ10nOiAnw6knLFxuICAgICdgJzogJ8O5JyxcbiAgICAneyc6ICfDoCcsXG4gICAgJ3wnOiAnw7InLFxuICAgICd9JzogJ8OoJyxcbiAgICAnfic6ICfDrCdcbn07XG5leHBvcnRzLkNIQVJTRVRTWydFJ10gPVxuICAgIGV4cG9ydHMuQ0hBUlNFVFNbJzYnXSA9IHtcbiAgICAgICAgJ0AnOiAnw4QnLFxuICAgICAgICAnWyc6ICfDhicsXG4gICAgICAgICdcXFxcJzogJ8OYJyxcbiAgICAgICAgJ10nOiAnw4UnLFxuICAgICAgICAnXic6ICfDnCcsXG4gICAgICAgICdgJzogJ8OkJyxcbiAgICAgICAgJ3snOiAnw6YnLFxuICAgICAgICAnfCc6ICfDuCcsXG4gICAgICAgICd9JzogJ8OlJyxcbiAgICAgICAgJ34nOiAnw7wnXG4gICAgfTtcbmV4cG9ydHMuQ0hBUlNFVFNbJ1onXSA9IHtcbiAgICAnIyc6ICfCoycsXG4gICAgJ0AnOiAnwqcnLFxuICAgICdbJzogJ8KhJyxcbiAgICAnXFxcXCc6ICfDkScsXG4gICAgJ10nOiAnwr8nLFxuICAgICd7JzogJ8KwJyxcbiAgICAnfCc6ICfDsScsXG4gICAgJ30nOiAnw6cnXG59O1xuZXhwb3J0cy5DSEFSU0VUU1snSCddID1cbiAgICBleHBvcnRzLkNIQVJTRVRTWyc3J10gPSB7XG4gICAgICAgICdAJzogJ8OJJyxcbiAgICAgICAgJ1snOiAnw4QnLFxuICAgICAgICAnXFxcXCc6ICfDlicsXG4gICAgICAgICddJzogJ8OFJyxcbiAgICAgICAgJ14nOiAnw5wnLFxuICAgICAgICAnYCc6ICfDqScsXG4gICAgICAgICd7JzogJ8OkJyxcbiAgICAgICAgJ3wnOiAnw7YnLFxuICAgICAgICAnfSc6ICfDpScsXG4gICAgICAgICd+JzogJ8O8J1xuICAgIH07XG5leHBvcnRzLkNIQVJTRVRTWyc9J10gPSB7XG4gICAgJyMnOiAnw7knLFxuICAgICdAJzogJ8OgJyxcbiAgICAnWyc6ICfDqScsXG4gICAgJ1xcXFwnOiAnw6cnLFxuICAgICddJzogJ8OqJyxcbiAgICAnXic6ICfDricsXG4gICAgJ18nOiAnw6gnLFxuICAgICdgJzogJ8O0JyxcbiAgICAneyc6ICfDpCcsXG4gICAgJ3wnOiAnw7YnLFxuICAgICd9JzogJ8O8JyxcbiAgICAnfic6ICfDuydcbn07XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoYXJzZXRzLmpzLm1hcFxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgQ29tcG9zaXRpb25IZWxwZXIgPSAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbXBvc2l0aW9uSGVscGVyKHRleHRhcmVhLCBjb21wb3NpdGlvblZpZXcsIHRlcm1pbmFsKSB7XG4gICAgICAgIHRoaXMudGV4dGFyZWEgPSB0ZXh0YXJlYTtcbiAgICAgICAgdGhpcy5jb21wb3NpdGlvblZpZXcgPSBjb21wb3NpdGlvblZpZXc7XG4gICAgICAgIHRoaXMudGVybWluYWwgPSB0ZXJtaW5hbDtcbiAgICAgICAgdGhpcy5pc0NvbXBvc2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzU2VuZGluZ0NvbXBvc2l0aW9uID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25Qb3NpdGlvbiA9IHsgc3RhcnQ6IG51bGwsIGVuZDogbnVsbCB9O1xuICAgIH1cbiAgICBDb21wb3NpdGlvbkhlbHBlci5wcm90b3R5cGUuY29tcG9zaXRpb25zdGFydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5pc0NvbXBvc2luZyA9IHRydWU7XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25Qb3NpdGlvbi5zdGFydCA9IHRoaXMudGV4dGFyZWEudmFsdWUubGVuZ3RoO1xuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uVmlldy50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uVmlldy5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICB9O1xuICAgIENvbXBvc2l0aW9uSGVscGVyLnByb3RvdHlwZS5jb21wb3NpdGlvbnVwZGF0ZSA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLmNvbXBvc2l0aW9uVmlldy50ZXh0Q29udGVudCA9IGV2LmRhdGE7XG4gICAgICAgIHRoaXMudXBkYXRlQ29tcG9zaXRpb25FbGVtZW50cygpO1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzLmNvbXBvc2l0aW9uUG9zaXRpb24uZW5kID0gX3RoaXMudGV4dGFyZWEudmFsdWUubGVuZ3RoO1xuICAgICAgICB9LCAwKTtcbiAgICB9O1xuICAgIENvbXBvc2l0aW9uSGVscGVyLnByb3RvdHlwZS5jb21wb3NpdGlvbmVuZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5maW5hbGl6ZUNvbXBvc2l0aW9uKHRydWUpO1xuICAgIH07XG4gICAgQ29tcG9zaXRpb25IZWxwZXIucHJvdG90eXBlLmtleWRvd24gPSBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNDb21wb3NpbmcgfHwgdGhpcy5pc1NlbmRpbmdDb21wb3NpdGlvbikge1xuICAgICAgICAgICAgaWYgKGV2LmtleUNvZGUgPT09IDIyOSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGV2LmtleUNvZGUgPT09IDE2IHx8IGV2LmtleUNvZGUgPT09IDE3IHx8IGV2LmtleUNvZGUgPT09IDE4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maW5hbGl6ZUNvbXBvc2l0aW9uKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXYua2V5Q29kZSA9PT0gMjI5KSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZUFueVRleHRhcmVhQ2hhbmdlcygpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgQ29tcG9zaXRpb25IZWxwZXIucHJvdG90eXBlLmZpbmFsaXplQ29tcG9zaXRpb24gPSBmdW5jdGlvbiAod2FpdEZvclByb3BvZ2F0aW9uKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMuY29tcG9zaXRpb25WaWV3LmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgICB0aGlzLmlzQ29tcG9zaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY2xlYXJUZXh0YXJlYVBvc2l0aW9uKCk7XG4gICAgICAgIGlmICghd2FpdEZvclByb3BvZ2F0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmlzU2VuZGluZ0NvbXBvc2l0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICB2YXIgaW5wdXQgPSB0aGlzLnRleHRhcmVhLnZhbHVlLnN1YnN0cmluZyh0aGlzLmNvbXBvc2l0aW9uUG9zaXRpb24uc3RhcnQsIHRoaXMuY29tcG9zaXRpb25Qb3NpdGlvbi5lbmQpO1xuICAgICAgICAgICAgdGhpcy50ZXJtaW5hbC5oYW5kbGVyKGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciBjdXJyZW50Q29tcG9zaXRpb25Qb3NpdGlvbl8xID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmNvbXBvc2l0aW9uUG9zaXRpb24uc3RhcnQsXG4gICAgICAgICAgICAgICAgZW5kOiB0aGlzLmNvbXBvc2l0aW9uUG9zaXRpb24uZW5kLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuaXNTZW5kaW5nQ29tcG9zaXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLmlzU2VuZGluZ0NvbXBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmlzU2VuZGluZ0NvbXBvc2l0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzLmlzQ29tcG9zaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IF90aGlzLnRleHRhcmVhLnZhbHVlLnN1YnN0cmluZyhjdXJyZW50Q29tcG9zaXRpb25Qb3NpdGlvbl8xLnN0YXJ0LCBjdXJyZW50Q29tcG9zaXRpb25Qb3NpdGlvbl8xLmVuZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IF90aGlzLnRleHRhcmVhLnZhbHVlLnN1YnN0cmluZyhjdXJyZW50Q29tcG9zaXRpb25Qb3NpdGlvbl8xLnN0YXJ0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfdGhpcy50ZXJtaW5hbC5oYW5kbGVyKGlucHV0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ29tcG9zaXRpb25IZWxwZXIucHJvdG90eXBlLmhhbmRsZUFueVRleHRhcmVhQ2hhbmdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIG9sZFZhbHVlID0gdGhpcy50ZXh0YXJlYS52YWx1ZTtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIV90aGlzLmlzQ29tcG9zaW5nKSB7XG4gICAgICAgICAgICAgICAgdmFyIG5ld1ZhbHVlID0gX3RoaXMudGV4dGFyZWEudmFsdWU7XG4gICAgICAgICAgICAgICAgdmFyIGRpZmYgPSBuZXdWYWx1ZS5yZXBsYWNlKG9sZFZhbHVlLCAnJyk7XG4gICAgICAgICAgICAgICAgaWYgKGRpZmYubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBfdGhpcy50ZXJtaW5hbC5oYW5kbGVyKGRpZmYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMCk7XG4gICAgfTtcbiAgICBDb21wb3NpdGlvbkhlbHBlci5wcm90b3R5cGUudXBkYXRlQ29tcG9zaXRpb25FbGVtZW50cyA9IGZ1bmN0aW9uIChkb250UmVjdXJzZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoIXRoaXMuaXNDb21wb3NpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY3Vyc29yID0gdGhpcy50ZXJtaW5hbC5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy50ZXJtaW5hbC1jdXJzb3InKTtcbiAgICAgICAgaWYgKGN1cnNvcikge1xuICAgICAgICAgICAgdmFyIHh0ZXJtUm93cyA9IHRoaXMudGVybWluYWwuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcueHRlcm0tcm93cycpO1xuICAgICAgICAgICAgdmFyIGN1cnNvclRvcCA9IHh0ZXJtUm93cy5vZmZzZXRUb3AgKyBjdXJzb3Iub2Zmc2V0VG9wO1xuICAgICAgICAgICAgdGhpcy5jb21wb3NpdGlvblZpZXcuc3R5bGUubGVmdCA9IGN1cnNvci5vZmZzZXRMZWZ0ICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMuY29tcG9zaXRpb25WaWV3LnN0eWxlLnRvcCA9IGN1cnNvclRvcCArICdweCc7XG4gICAgICAgICAgICB0aGlzLmNvbXBvc2l0aW9uVmlldy5zdHlsZS5oZWlnaHQgPSBjdXJzb3Iub2Zmc2V0SGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMuY29tcG9zaXRpb25WaWV3LnN0eWxlLmxpbmVIZWlnaHQgPSBjdXJzb3Iub2Zmc2V0SGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgICAgIHZhciBjb21wb3NpdGlvblZpZXdCb3VuZHMgPSB0aGlzLmNvbXBvc2l0aW9uVmlldy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHRoaXMudGV4dGFyZWEuc3R5bGUubGVmdCA9IGN1cnNvci5vZmZzZXRMZWZ0ICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMudGV4dGFyZWEuc3R5bGUudG9wID0gY3Vyc29yVG9wICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMudGV4dGFyZWEuc3R5bGUud2lkdGggPSBjb21wb3NpdGlvblZpZXdCb3VuZHMud2lkdGggKyAncHgnO1xuICAgICAgICAgICAgdGhpcy50ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSBjb21wb3NpdGlvblZpZXdCb3VuZHMuaGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgICAgIHRoaXMudGV4dGFyZWEuc3R5bGUubGluZUhlaWdodCA9IGNvbXBvc2l0aW9uVmlld0JvdW5kcy5oZWlnaHQgKyAncHgnO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZG9udFJlY3Vyc2UpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMudXBkYXRlQ29tcG9zaXRpb25FbGVtZW50cyh0cnVlKTsgfSwgMCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIDtcbiAgICBDb21wb3NpdGlvbkhlbHBlci5wcm90b3R5cGUuY2xlYXJUZXh0YXJlYVBvc2l0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnRleHRhcmVhLnN0eWxlLmxlZnQgPSAnJztcbiAgICAgICAgdGhpcy50ZXh0YXJlYS5zdHlsZS50b3AgPSAnJztcbiAgICB9O1xuICAgIDtcbiAgICByZXR1cm4gQ29tcG9zaXRpb25IZWxwZXI7XG59KCkpO1xuZXhwb3J0cy5Db21wb3NpdGlvbkhlbHBlciA9IENvbXBvc2l0aW9uSGVscGVyO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Db21wb3NpdGlvbkhlbHBlci5qcy5tYXBcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIEMwO1xuKGZ1bmN0aW9uIChDMCkge1xuICAgIEMwLk5VTCA9ICdcXHgwMCc7XG4gICAgQzAuU09IID0gJ1xceDAxJztcbiAgICBDMC5TVFggPSAnXFx4MDInO1xuICAgIEMwLkVUWCA9ICdcXHgwMyc7XG4gICAgQzAuRU9UID0gJ1xceDA0JztcbiAgICBDMC5FTlEgPSAnXFx4MDUnO1xuICAgIEMwLkFDSyA9ICdcXHgwNic7XG4gICAgQzAuQkVMID0gJ1xceDA3JztcbiAgICBDMC5CUyA9ICdcXHgwOCc7XG4gICAgQzAuSFQgPSAnXFx4MDknO1xuICAgIEMwLkxGID0gJ1xceDBhJztcbiAgICBDMC5WVCA9ICdcXHgwYic7XG4gICAgQzAuRkYgPSAnXFx4MGMnO1xuICAgIEMwLkNSID0gJ1xceDBkJztcbiAgICBDMC5TTyA9ICdcXHgwZSc7XG4gICAgQzAuU0kgPSAnXFx4MGYnO1xuICAgIEMwLkRMRSA9ICdcXHgxMCc7XG4gICAgQzAuREMxID0gJ1xceDExJztcbiAgICBDMC5EQzIgPSAnXFx4MTInO1xuICAgIEMwLkRDMyA9ICdcXHgxMyc7XG4gICAgQzAuREM0ID0gJ1xceDE0JztcbiAgICBDMC5OQUsgPSAnXFx4MTUnO1xuICAgIEMwLlNZTiA9ICdcXHgxNic7XG4gICAgQzAuRVRCID0gJ1xceDE3JztcbiAgICBDMC5DQU4gPSAnXFx4MTgnO1xuICAgIEMwLkVNID0gJ1xceDE5JztcbiAgICBDMC5TVUIgPSAnXFx4MWEnO1xuICAgIEMwLkVTQyA9ICdcXHgxYic7XG4gICAgQzAuRlMgPSAnXFx4MWMnO1xuICAgIEMwLkdTID0gJ1xceDFkJztcbiAgICBDMC5SUyA9ICdcXHgxZSc7XG4gICAgQzAuVVMgPSAnXFx4MWYnO1xuICAgIEMwLlNQID0gJ1xceDIwJztcbiAgICBDMC5ERUwgPSAnXFx4N2YnO1xufSkoQzAgPSBleHBvcnRzLkMwIHx8IChleHBvcnRzLkMwID0ge30pKTtcbjtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXNjYXBlU2VxdWVuY2VzLmpzLm1hcFxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG47XG52YXIgRXZlbnRFbWl0dGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gICAgICAgIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgICB9XG4gICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uICh0eXBlLCBsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSB0aGlzLl9ldmVudHNbdHlwZV0gfHwgW107XG4gICAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgICB9O1xuICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24gKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnRzW3R5cGVdKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG9iaiA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICAgICAgdmFyIGkgPSBvYmoubGVuZ3RoO1xuICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgICBpZiAob2JqW2ldID09PSBsaXN0ZW5lciB8fCBvYmpbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB7XG4gICAgICAgICAgICAgICAgb2JqLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2V2ZW50c1t0eXBlXSkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24gKHR5cGUsIGxpc3RlbmVyKSB7XG4gICAgICAgIGZ1bmN0aW9uIG9uKCkge1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgICAgICAgICAgdGhpcy5vZmYodHlwZSwgb24pO1xuICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIG9uLmxpc3RlbmVyID0gbGlzdGVuZXI7XG4gICAgICAgIHJldHVybiB0aGlzLm9uKHR5cGUsIG9uKTtcbiAgICB9O1xuICAgIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnRzW3R5cGVdKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICB2YXIgb2JqID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgb2JqW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudHNbdHlwZV0gfHwgW107XG4gICAgfTtcbiAgICByZXR1cm4gRXZlbnRFbWl0dGVyO1xufSgpKTtcbmV4cG9ydHMuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1FdmVudEVtaXR0ZXIuanMubWFwXG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBFc2NhcGVTZXF1ZW5jZXNfMSA9IHJlcXVpcmUoXCIuL0VzY2FwZVNlcXVlbmNlc1wiKTtcbnZhciBDaGFyc2V0c18xID0gcmVxdWlyZShcIi4vQ2hhcnNldHNcIik7XG52YXIgSW5wdXRIYW5kbGVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBJbnB1dEhhbmRsZXIoX3Rlcm1pbmFsKSB7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsID0gX3Rlcm1pbmFsO1xuICAgIH1cbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLmFkZENoYXIgPSBmdW5jdGlvbiAoY2hhciwgY29kZSkge1xuICAgICAgICBpZiAoY2hhciA+PSAnICcpIHtcbiAgICAgICAgICAgIHZhciBjaF93aWR0aCA9IHdjd2lkdGgoY29kZSk7XG4gICAgICAgICAgICBpZiAodGhpcy5fdGVybWluYWwuY2hhcnNldCAmJiB0aGlzLl90ZXJtaW5hbC5jaGFyc2V0W2NoYXJdKSB7XG4gICAgICAgICAgICAgICAgY2hhciA9IHRoaXMuX3Rlcm1pbmFsLmNoYXJzZXRbY2hhcl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgcm93ID0gdGhpcy5fdGVybWluYWwueSArIHRoaXMuX3Rlcm1pbmFsLnliYXNlO1xuICAgICAgICAgICAgaWYgKCFjaF93aWR0aCAmJiB0aGlzLl90ZXJtaW5hbC54KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLmxpbmVzLmdldChyb3cpW3RoaXMuX3Rlcm1pbmFsLnggLSAxXSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3Rlcm1pbmFsLmxpbmVzLmdldChyb3cpW3RoaXMuX3Rlcm1pbmFsLnggLSAxXVsyXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLmxpbmVzLmdldChyb3cpW3RoaXMuX3Rlcm1pbmFsLnggLSAyXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5saW5lcy5nZXQocm93KVt0aGlzLl90ZXJtaW5hbC54IC0gMl1bMV0gKz0gY2hhcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmxpbmVzLmdldChyb3cpW3RoaXMuX3Rlcm1pbmFsLnggLSAxXVsxXSArPSBjaGFyO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnVwZGF0ZVJhbmdlKHRoaXMuX3Rlcm1pbmFsLnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5fdGVybWluYWwueCArIGNoX3dpZHRoIC0gMSA+PSB0aGlzLl90ZXJtaW5hbC5jb2xzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLndyYXBhcm91bmRNb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnggPSAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC55Kys7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC55ID4gdGhpcy5fdGVybWluYWwuc2Nyb2xsQm90dG9tKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC55LS07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zY3JvbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoX3dpZHRoID09PSAyKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJvdyA9IHRoaXMuX3Rlcm1pbmFsLnkgKyB0aGlzLl90ZXJtaW5hbC55YmFzZTtcbiAgICAgICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC5pbnNlcnRNb2RlKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbW92ZXMgPSAwOyBtb3ZlcyA8IGNoX3dpZHRoOyArK21vdmVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZW1vdmVkID0gdGhpcy5fdGVybWluYWwubGluZXMuZ2V0KHRoaXMuX3Rlcm1pbmFsLnkgKyB0aGlzLl90ZXJtaW5hbC55YmFzZSkucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZW1vdmVkWzJdID09PSAwXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLl90ZXJtaW5hbC5saW5lcy5nZXQocm93KVt0aGlzLl90ZXJtaW5hbC5jb2xzIC0gMl1cbiAgICAgICAgICAgICAgICAgICAgICAgICYmIHRoaXMuX3Rlcm1pbmFsLmxpbmVzLmdldChyb3cpW3RoaXMuX3Rlcm1pbmFsLmNvbHMgLSAyXVsyXSA9PT0gMilcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmxpbmVzLmdldChyb3cpW3RoaXMuX3Rlcm1pbmFsLmNvbHMgLSAyXSA9IFt0aGlzLl90ZXJtaW5hbC5jdXJBdHRyLCAnICcsIDFdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5saW5lcy5nZXQocm93KS5zcGxpY2UodGhpcy5fdGVybWluYWwueCwgMCwgW3RoaXMuX3Rlcm1pbmFsLmN1ckF0dHIsICcgJywgMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmxpbmVzLmdldChyb3cpW3RoaXMuX3Rlcm1pbmFsLnhdID0gW3RoaXMuX3Rlcm1pbmFsLmN1ckF0dHIsIGNoYXIsIGNoX3dpZHRoXTtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLngrKztcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnVwZGF0ZVJhbmdlKHRoaXMuX3Rlcm1pbmFsLnkpO1xuICAgICAgICAgICAgaWYgKGNoX3dpZHRoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubGluZXMuZ2V0KHJvdylbdGhpcy5fdGVybWluYWwueF0gPSBbdGhpcy5fdGVybWluYWwuY3VyQXR0ciwgJycsIDBdO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLngrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5iZWxsID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoIXRoaXMuX3Rlcm1pbmFsLnZpc3VhbEJlbGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90ZXJtaW5hbC5lbGVtZW50LnN0eWxlLmJvcmRlckNvbG9yID0gJ3doaXRlJztcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fdGVybWluYWwuZWxlbWVudC5zdHlsZS5ib3JkZXJDb2xvciA9ICcnOyB9LCAxMCk7XG4gICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC5wb3BPbkJlbGwpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUubGluZUZlZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC5jb252ZXJ0RW9sKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC54ID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90ZXJtaW5hbC55Kys7XG4gICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC55ID4gdGhpcy5fdGVybWluYWwuc2Nyb2xsQm90dG9tKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC55LS07XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zY3JvbGwoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwueCA+PSB0aGlzLl90ZXJtaW5hbC5jb2xzKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC54LS07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuY2FycmlhZ2VSZXR1cm4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnggPSAwO1xuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5iYWNrc3BhY2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC54ID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueC0tO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLnRhYiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fdGVybWluYWwueCA9IHRoaXMuX3Rlcm1pbmFsLm5leHRTdG9wKCk7XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLnNoaWZ0T3V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC5zZXRnTGV2ZWwoMSk7XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLnNoaWZ0SW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNldGdMZXZlbCgwKTtcbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuaW5zZXJ0Q2hhcnMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXJhbSwgcm93LCBqLCBjaDtcbiAgICAgICAgcGFyYW0gPSBwYXJhbXNbMF07XG4gICAgICAgIGlmIChwYXJhbSA8IDEpXG4gICAgICAgICAgICBwYXJhbSA9IDE7XG4gICAgICAgIHJvdyA9IHRoaXMuX3Rlcm1pbmFsLnkgKyB0aGlzLl90ZXJtaW5hbC55YmFzZTtcbiAgICAgICAgaiA9IHRoaXMuX3Rlcm1pbmFsLng7XG4gICAgICAgIGNoID0gW3RoaXMuX3Rlcm1pbmFsLmVyYXNlQXR0cigpLCAnICcsIDFdO1xuICAgICAgICB3aGlsZSAocGFyYW0tLSAmJiBqIDwgdGhpcy5fdGVybWluYWwuY29scykge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubGluZXMuZ2V0KHJvdykuc3BsaWNlKGorKywgMCwgY2gpO1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubGluZXMuZ2V0KHJvdykucG9wKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuY3Vyc29yVXAgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1swXTtcbiAgICAgICAgaWYgKHBhcmFtIDwgMSkge1xuICAgICAgICAgICAgcGFyYW0gPSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnkgLT0gcGFyYW07XG4gICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC55IDwgMCkge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueSA9IDA7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuY3Vyc29yRG93biA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zWzBdO1xuICAgICAgICBpZiAocGFyYW0gPCAxKSB7XG4gICAgICAgICAgICBwYXJhbSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGVybWluYWwueSArPSBwYXJhbTtcbiAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLnkgPj0gdGhpcy5fdGVybWluYWwucm93cykge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueSA9IHRoaXMuX3Rlcm1pbmFsLnJvd3MgLSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC54ID49IHRoaXMuX3Rlcm1pbmFsLmNvbHMpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLngtLTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5jdXJzb3JGb3J3YXJkID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbMF07XG4gICAgICAgIGlmIChwYXJhbSA8IDEpIHtcbiAgICAgICAgICAgIHBhcmFtID0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90ZXJtaW5hbC54ICs9IHBhcmFtO1xuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwueCA+PSB0aGlzLl90ZXJtaW5hbC5jb2xzKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC54ID0gdGhpcy5fdGVybWluYWwuY29scyAtIDE7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuY3Vyc29yQmFja3dhcmQgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1swXTtcbiAgICAgICAgaWYgKHBhcmFtIDwgMSkge1xuICAgICAgICAgICAgcGFyYW0gPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC54ID49IHRoaXMuX3Rlcm1pbmFsLmNvbHMpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLngtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90ZXJtaW5hbC54IC09IHBhcmFtO1xuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwueCA8IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnggPSAwO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLmN1cnNvck5leHRMaW5lID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbMF07XG4gICAgICAgIGlmIChwYXJhbSA8IDEpIHtcbiAgICAgICAgICAgIHBhcmFtID0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90ZXJtaW5hbC55ICs9IHBhcmFtO1xuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwueSA+PSB0aGlzLl90ZXJtaW5hbC5yb3dzKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC55ID0gdGhpcy5fdGVybWluYWwucm93cyAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGVybWluYWwueCA9IDA7XG4gICAgfTtcbiAgICA7XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5jdXJzb3JQcmVjZWRpbmdMaW5lID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbMF07XG4gICAgICAgIGlmIChwYXJhbSA8IDEpIHtcbiAgICAgICAgICAgIHBhcmFtID0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90ZXJtaW5hbC55IC09IHBhcmFtO1xuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwueSA8IDApIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnkgPSAwO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnggPSAwO1xuICAgIH07XG4gICAgO1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuY3Vyc29yQ2hhckFic29sdXRlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbMF07XG4gICAgICAgIGlmIChwYXJhbSA8IDEpIHtcbiAgICAgICAgICAgIHBhcmFtID0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90ZXJtaW5hbC54ID0gcGFyYW0gLSAxO1xuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5jdXJzb3JQb3NpdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHJvdywgY29sO1xuICAgICAgICByb3cgPSBwYXJhbXNbMF0gLSAxO1xuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICBjb2wgPSBwYXJhbXNbMV0gLSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29sID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocm93IDwgMCkge1xuICAgICAgICAgICAgcm93ID0gMDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyb3cgPj0gdGhpcy5fdGVybWluYWwucm93cykge1xuICAgICAgICAgICAgcm93ID0gdGhpcy5fdGVybWluYWwucm93cyAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbCA8IDApIHtcbiAgICAgICAgICAgIGNvbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY29sID49IHRoaXMuX3Rlcm1pbmFsLmNvbHMpIHtcbiAgICAgICAgICAgIGNvbCA9IHRoaXMuX3Rlcm1pbmFsLmNvbHMgLSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnggPSBjb2w7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnkgPSByb3c7XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLmN1cnNvckZvcndhcmRUYWIgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1swXSB8fCAxO1xuICAgICAgICB3aGlsZSAocGFyYW0tLSkge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueCA9IHRoaXMuX3Rlcm1pbmFsLm5leHRTdG9wKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuZXJhc2VJbkRpc3BsYXkgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBqO1xuICAgICAgICBzd2l0Y2ggKHBhcmFtc1swXSkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmVyYXNlUmlnaHQodGhpcy5fdGVybWluYWwueCwgdGhpcy5fdGVybWluYWwueSk7XG4gICAgICAgICAgICAgICAgaiA9IHRoaXMuX3Rlcm1pbmFsLnkgKyAxO1xuICAgICAgICAgICAgICAgIGZvciAoOyBqIDwgdGhpcy5fdGVybWluYWwucm93czsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmVyYXNlTGluZShqKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuZXJhc2VMZWZ0KHRoaXMuX3Rlcm1pbmFsLngsIHRoaXMuX3Rlcm1pbmFsLnkpO1xuICAgICAgICAgICAgICAgIGogPSB0aGlzLl90ZXJtaW5hbC55O1xuICAgICAgICAgICAgICAgIHdoaWxlIChqLS0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuZXJhc2VMaW5lKGopO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBqID0gdGhpcy5fdGVybWluYWwucm93cztcbiAgICAgICAgICAgICAgICB3aGlsZSAoai0tKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5lcmFzZUxpbmUoaik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgdmFyIHNjcm9sbEJhY2tTaXplID0gdGhpcy5fdGVybWluYWwubGluZXMubGVuZ3RoIC0gdGhpcy5fdGVybWluYWwucm93cztcbiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsQmFja1NpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmxpbmVzLnRyaW1TdGFydChzY3JvbGxCYWNrU2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnliYXNlID0gTWF0aC5tYXgodGhpcy5fdGVybWluYWwueWJhc2UgLSBzY3JvbGxCYWNrU2l6ZSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnlkaXNwID0gTWF0aC5tYXgodGhpcy5fdGVybWluYWwueWRpc3AgLSBzY3JvbGxCYWNrU2l6ZSwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLmVyYXNlSW5MaW5lID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtc1swXSkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmVyYXNlUmlnaHQodGhpcy5fdGVybWluYWwueCwgdGhpcy5fdGVybWluYWwueSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuZXJhc2VMZWZ0KHRoaXMuX3Rlcm1pbmFsLngsIHRoaXMuX3Rlcm1pbmFsLnkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmVyYXNlTGluZSh0aGlzLl90ZXJtaW5hbC55KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5pbnNlcnRMaW5lcyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhcmFtLCByb3csIGo7XG4gICAgICAgIHBhcmFtID0gcGFyYW1zWzBdO1xuICAgICAgICBpZiAocGFyYW0gPCAxKSB7XG4gICAgICAgICAgICBwYXJhbSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgcm93ID0gdGhpcy5fdGVybWluYWwueSArIHRoaXMuX3Rlcm1pbmFsLnliYXNlO1xuICAgICAgICBqID0gdGhpcy5fdGVybWluYWwucm93cyAtIDEgLSB0aGlzLl90ZXJtaW5hbC5zY3JvbGxCb3R0b207XG4gICAgICAgIGogPSB0aGlzLl90ZXJtaW5hbC5yb3dzIC0gMSArIHRoaXMuX3Rlcm1pbmFsLnliYXNlIC0gaiArIDE7XG4gICAgICAgIHdoaWxlIChwYXJhbS0tKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fdGVybWluYWwubGluZXMubGVuZ3RoID09PSB0aGlzLl90ZXJtaW5hbC5saW5lcy5tYXhMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5saW5lcy50cmltU3RhcnQoMSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueWJhc2UtLTtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC55ZGlzcC0tO1xuICAgICAgICAgICAgICAgIHJvdy0tO1xuICAgICAgICAgICAgICAgIGotLTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmxpbmVzLnNwbGljZShyb3csIDAsIHRoaXMuX3Rlcm1pbmFsLmJsYW5rTGluZSh0cnVlKSk7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5saW5lcy5zcGxpY2UoaiwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGVybWluYWwudXBkYXRlUmFuZ2UodGhpcy5fdGVybWluYWwueSk7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnVwZGF0ZVJhbmdlKHRoaXMuX3Rlcm1pbmFsLnNjcm9sbEJvdHRvbSk7XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLmRlbGV0ZUxpbmVzID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGFyYW0sIHJvdywgajtcbiAgICAgICAgcGFyYW0gPSBwYXJhbXNbMF07XG4gICAgICAgIGlmIChwYXJhbSA8IDEpIHtcbiAgICAgICAgICAgIHBhcmFtID0gMTtcbiAgICAgICAgfVxuICAgICAgICByb3cgPSB0aGlzLl90ZXJtaW5hbC55ICsgdGhpcy5fdGVybWluYWwueWJhc2U7XG4gICAgICAgIGogPSB0aGlzLl90ZXJtaW5hbC5yb3dzIC0gMSAtIHRoaXMuX3Rlcm1pbmFsLnNjcm9sbEJvdHRvbTtcbiAgICAgICAgaiA9IHRoaXMuX3Rlcm1pbmFsLnJvd3MgLSAxICsgdGhpcy5fdGVybWluYWwueWJhc2UgLSBqO1xuICAgICAgICB3aGlsZSAocGFyYW0tLSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLmxpbmVzLmxlbmd0aCA9PT0gdGhpcy5fdGVybWluYWwubGluZXMubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubGluZXMudHJpbVN0YXJ0KDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnliYXNlIC09IDE7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueWRpc3AgLT0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmxpbmVzLnNwbGljZShqICsgMSwgMCwgdGhpcy5fdGVybWluYWwuYmxhbmtMaW5lKHRydWUpKTtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmxpbmVzLnNwbGljZShyb3csIDEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnVwZGF0ZVJhbmdlKHRoaXMuX3Rlcm1pbmFsLnkpO1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC51cGRhdGVSYW5nZSh0aGlzLl90ZXJtaW5hbC5zY3JvbGxCb3R0b20pO1xuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5kZWxldGVDaGFycyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhcmFtLCByb3csIGNoO1xuICAgICAgICBwYXJhbSA9IHBhcmFtc1swXTtcbiAgICAgICAgaWYgKHBhcmFtIDwgMSkge1xuICAgICAgICAgICAgcGFyYW0gPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJvdyA9IHRoaXMuX3Rlcm1pbmFsLnkgKyB0aGlzLl90ZXJtaW5hbC55YmFzZTtcbiAgICAgICAgY2ggPSBbdGhpcy5fdGVybWluYWwuZXJhc2VBdHRyKCksICcgJywgMV07XG4gICAgICAgIHdoaWxlIChwYXJhbS0tKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5saW5lcy5nZXQocm93KS5zcGxpY2UodGhpcy5fdGVybWluYWwueCwgMSk7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5saW5lcy5nZXQocm93KS5wdXNoKGNoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5zY3JvbGxVcCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zWzBdIHx8IDE7XG4gICAgICAgIHdoaWxlIChwYXJhbS0tKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5saW5lcy5zcGxpY2UodGhpcy5fdGVybWluYWwueWJhc2UgKyB0aGlzLl90ZXJtaW5hbC5zY3JvbGxUb3AsIDEpO1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubGluZXMuc3BsaWNlKHRoaXMuX3Rlcm1pbmFsLnliYXNlICsgdGhpcy5fdGVybWluYWwuc2Nyb2xsQm90dG9tLCAwLCB0aGlzLl90ZXJtaW5hbC5ibGFua0xpbmUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGVybWluYWwudXBkYXRlUmFuZ2UodGhpcy5fdGVybWluYWwuc2Nyb2xsVG9wKTtcbiAgICAgICAgdGhpcy5fdGVybWluYWwudXBkYXRlUmFuZ2UodGhpcy5fdGVybWluYWwuc2Nyb2xsQm90dG9tKTtcbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuc2Nyb2xsRG93biA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zWzBdIHx8IDE7XG4gICAgICAgIHdoaWxlIChwYXJhbS0tKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5saW5lcy5zcGxpY2UodGhpcy5fdGVybWluYWwueWJhc2UgKyB0aGlzLl90ZXJtaW5hbC5zY3JvbGxCb3R0b20sIDEpO1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubGluZXMuc3BsaWNlKHRoaXMuX3Rlcm1pbmFsLnliYXNlICsgdGhpcy5fdGVybWluYWwuc2Nyb2xsVG9wLCAwLCB0aGlzLl90ZXJtaW5hbC5ibGFua0xpbmUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGVybWluYWwudXBkYXRlUmFuZ2UodGhpcy5fdGVybWluYWwuc2Nyb2xsVG9wKTtcbiAgICAgICAgdGhpcy5fdGVybWluYWwudXBkYXRlUmFuZ2UodGhpcy5fdGVybWluYWwuc2Nyb2xsQm90dG9tKTtcbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuZXJhc2VDaGFycyA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhcmFtLCByb3csIGosIGNoO1xuICAgICAgICBwYXJhbSA9IHBhcmFtc1swXTtcbiAgICAgICAgaWYgKHBhcmFtIDwgMSkge1xuICAgICAgICAgICAgcGFyYW0gPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJvdyA9IHRoaXMuX3Rlcm1pbmFsLnkgKyB0aGlzLl90ZXJtaW5hbC55YmFzZTtcbiAgICAgICAgaiA9IHRoaXMuX3Rlcm1pbmFsLng7XG4gICAgICAgIGNoID0gW3RoaXMuX3Rlcm1pbmFsLmVyYXNlQXR0cigpLCAnICcsIDFdO1xuICAgICAgICB3aGlsZSAocGFyYW0tLSAmJiBqIDwgdGhpcy5fdGVybWluYWwuY29scykge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubGluZXMuZ2V0KHJvdylbaisrXSA9IGNoO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLmN1cnNvckJhY2t3YXJkVGFiID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbMF0gfHwgMTtcbiAgICAgICAgd2hpbGUgKHBhcmFtLS0pIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnggPSB0aGlzLl90ZXJtaW5hbC5wcmV2U3RvcCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLmNoYXJQb3NBYnNvbHV0ZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zWzBdO1xuICAgICAgICBpZiAocGFyYW0gPCAxKSB7XG4gICAgICAgICAgICBwYXJhbSA9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGVybWluYWwueCA9IHBhcmFtIC0gMTtcbiAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLnggPj0gdGhpcy5fdGVybWluYWwuY29scykge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueCA9IHRoaXMuX3Rlcm1pbmFsLmNvbHMgLSAxO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLkhQb3NpdGlvblJlbGF0aXZlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbMF07XG4gICAgICAgIGlmIChwYXJhbSA8IDEpIHtcbiAgICAgICAgICAgIHBhcmFtID0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90ZXJtaW5hbC54ICs9IHBhcmFtO1xuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwueCA+PSB0aGlzLl90ZXJtaW5hbC5jb2xzKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC54ID0gdGhpcy5fdGVybWluYWwuY29scyAtIDE7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUucmVwZWF0UHJlY2VkaW5nQ2hhcmFjdGVyID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbMF0gfHwgMSwgbGluZSA9IHRoaXMuX3Rlcm1pbmFsLmxpbmVzLmdldCh0aGlzLl90ZXJtaW5hbC55YmFzZSArIHRoaXMuX3Rlcm1pbmFsLnkpLCBjaCA9IGxpbmVbdGhpcy5fdGVybWluYWwueCAtIDFdIHx8IFt0aGlzLl90ZXJtaW5hbC5kZWZBdHRyLCAnICcsIDFdO1xuICAgICAgICB3aGlsZSAocGFyYW0tLSkge1xuICAgICAgICAgICAgbGluZVt0aGlzLl90ZXJtaW5hbC54KytdID0gY2g7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuc2VuZERldmljZUF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIGlmIChwYXJhbXNbMF0gPiAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl90ZXJtaW5hbC5wcmVmaXgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC5pcygneHRlcm0nKSB8fCB0aGlzLl90ZXJtaW5hbC5pcygncnh2dC11bmljb2RlJykgfHwgdGhpcy5fdGVybWluYWwuaXMoJ3NjcmVlbicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2VuZChFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWz8xOzJjJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl90ZXJtaW5hbC5pcygnbGludXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNlbmQoRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1s/NmMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90ZXJtaW5hbC5wcmVmaXggPT09ICc+Jykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLmlzKCd4dGVybScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2VuZChFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWz4wOzI3NjswYycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fdGVybWluYWwuaXMoJ3J4dnQtdW5pY29kZScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2VuZChFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWz44NTs5NTswYycpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fdGVybWluYWwuaXMoJ2xpbnV4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zZW5kKHBhcmFtc1swXSArICdjJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLl90ZXJtaW5hbC5pcygnc2NyZWVuJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zZW5kKEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbPjgzOzQwMDAzOzBjJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUubGluZVBvc0Fic29sdXRlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbMF07XG4gICAgICAgIGlmIChwYXJhbSA8IDEpIHtcbiAgICAgICAgICAgIHBhcmFtID0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90ZXJtaW5hbC55ID0gcGFyYW0gLSAxO1xuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwueSA+PSB0aGlzLl90ZXJtaW5hbC5yb3dzKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC55ID0gdGhpcy5fdGVybWluYWwucm93cyAtIDE7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuVlBvc2l0aW9uUmVsYXRpdmUgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIHZhciBwYXJhbSA9IHBhcmFtc1swXTtcbiAgICAgICAgaWYgKHBhcmFtIDwgMSkge1xuICAgICAgICAgICAgcGFyYW0gPSAxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnkgKz0gcGFyYW07XG4gICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC55ID49IHRoaXMuX3Rlcm1pbmFsLnJvd3MpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnkgPSB0aGlzLl90ZXJtaW5hbC5yb3dzIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwueCA+PSB0aGlzLl90ZXJtaW5hbC5jb2xzKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC54LS07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuSFZQb3NpdGlvbiA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgaWYgKHBhcmFtc1swXSA8IDEpXG4gICAgICAgICAgICBwYXJhbXNbMF0gPSAxO1xuICAgICAgICBpZiAocGFyYW1zWzFdIDwgMSlcbiAgICAgICAgICAgIHBhcmFtc1sxXSA9IDE7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnkgPSBwYXJhbXNbMF0gLSAxO1xuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwueSA+PSB0aGlzLl90ZXJtaW5hbC5yb3dzKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC55ID0gdGhpcy5fdGVybWluYWwucm93cyAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGVybWluYWwueCA9IHBhcmFtc1sxXSAtIDE7XG4gICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC54ID49IHRoaXMuX3Rlcm1pbmFsLmNvbHMpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnggPSB0aGlzLl90ZXJtaW5hbC5jb2xzIC0gMTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS50YWJDbGVhciA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdmFyIHBhcmFtID0gcGFyYW1zWzBdO1xuICAgICAgICBpZiAocGFyYW0gPD0gMCkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3Rlcm1pbmFsLnRhYnNbdGhpcy5fdGVybWluYWwueF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocGFyYW0gPT09IDMpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnRhYnMgPSB7fTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5zZXRNb2RlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRNb2RlKFtwYXJhbXNbaV1dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX3Rlcm1pbmFsLnByZWZpeCkge1xuICAgICAgICAgICAgc3dpdGNoIChwYXJhbXNbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmluc2VydE1vZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDIwOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90ZXJtaW5hbC5wcmVmaXggPT09ICc/Jykge1xuICAgICAgICAgICAgc3dpdGNoIChwYXJhbXNbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmFwcGxpY2F0aW9uQ3Vyc29yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zZXRnQ2hhcnNldCgwLCBDaGFyc2V0c18xLkRFRkFVTFRfQ0hBUlNFVCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNldGdDaGFyc2V0KDEsIENoYXJzZXRzXzEuREVGQVVMVF9DSEFSU0VUKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2V0Z0NoYXJzZXQoMiwgQ2hhcnNldHNfMS5ERUZBVUxUX0NIQVJTRVQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zZXRnQ2hhcnNldCgzLCBDaGFyc2V0c18xLkRFRkFVTFRfQ0hBUlNFVCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2F2ZWRDb2xzID0gdGhpcy5fdGVybWluYWwuY29scztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwucmVzaXplKDEzMiwgdGhpcy5fdGVybWluYWwucm93cyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwub3JpZ2luTW9kZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwud3JhcGFyb3VuZE1vZGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDY2OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5sb2coJ1NlcmlhbCBwb3J0IHJlcXVlc3RlZCBhcHBsaWNhdGlvbiBrZXlwYWQuJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmFwcGxpY2F0aW9uS2V5cGFkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwudmlld3BvcnQuc3luY1Njcm9sbEFyZWEoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgICAgIGNhc2UgMTAwMDpcbiAgICAgICAgICAgICAgICBjYXNlIDEwMDI6XG4gICAgICAgICAgICAgICAgY2FzZSAxMDAzOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC54MTBNb3VzZSA9IHBhcmFtc1swXSA9PT0gOTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwudnQyMDBNb3VzZSA9IHBhcmFtc1swXSA9PT0gMTAwMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubm9ybWFsTW91c2UgPSBwYXJhbXNbMF0gPiAxMDAwO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5tb3VzZUV2ZW50cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2RlZmF1bHQnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5sb2coJ0JpbmRpbmcgdG8gbW91c2UgZXZlbnRzLicpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEwMDQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNlbmRGb2N1cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTAwNTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwudXRmTW91c2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEwMDY6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNnck1vdXNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDE1OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC51cnh2dE1vdXNlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyNTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuY3Vyc29ySGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA0OTpcbiAgICAgICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIGNhc2UgNDc6XG4gICAgICAgICAgICAgICAgY2FzZSAxMDQ3OlxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3Rlcm1pbmFsLm5vcm1hbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5vcm1hbCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lczogdGhpcy5fdGVybWluYWwubGluZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeWJhc2U6IHRoaXMuX3Rlcm1pbmFsLnliYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlkaXNwOiB0aGlzLl90ZXJtaW5hbC55ZGlzcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiB0aGlzLl90ZXJtaW5hbC54LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHRoaXMuX3Rlcm1pbmFsLnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiB0aGlzLl90ZXJtaW5hbC5zY3JvbGxUb3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsQm90dG9tOiB0aGlzLl90ZXJtaW5hbC5zY3JvbGxCb3R0b20sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiczogdGhpcy5fdGVybWluYWwudGFic1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC52aWV3cG9ydC5zeW5jU2Nyb2xsQXJlYSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwubm9ybWFsID0gbm9ybWFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2hvd0N1cnNvcigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLnJlc2V0TW9kZSA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRNb2RlKFtwYXJhbXNbaV1dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX3Rlcm1pbmFsLnByZWZpeCkge1xuICAgICAgICAgICAgc3dpdGNoIChwYXJhbXNbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmluc2VydE1vZGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5fdGVybWluYWwucHJlZml4ID09PSAnPycpIHtcbiAgICAgICAgICAgIHN3aXRjaCAocGFyYW1zWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5hcHBsaWNhdGlvbkN1cnNvciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC5jb2xzID09PSAxMzIgJiYgdGhpcy5fdGVybWluYWwuc2F2ZWRDb2xzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5yZXNpemUodGhpcy5fdGVybWluYWwuc2F2ZWRDb2xzLCB0aGlzLl90ZXJtaW5hbC5yb3dzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fdGVybWluYWwuc2F2ZWRDb2xzO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLm9yaWdpbk1vZGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA3OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC53cmFwYXJvdW5kTW9kZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDY2OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5sb2coJ1N3aXRjaGluZyBiYWNrIHRvIG5vcm1hbCBrZXlwYWQuJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmFwcGxpY2F0aW9uS2V5cGFkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnZpZXdwb3J0LnN5bmNTY3JvbGxBcmVhKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICBjYXNlIDEwMDA6XG4gICAgICAgICAgICAgICAgY2FzZSAxMDAyOlxuICAgICAgICAgICAgICAgIGNhc2UgMTAwMzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueDEwTW91c2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwudnQyMDBNb3VzZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5ub3JtYWxNb3VzZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5tb3VzZUV2ZW50cyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5lbGVtZW50LnN0eWxlLmN1cnNvciA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEwMDQ6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNlbmRGb2N1cyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEwMDU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnV0Zk1vdXNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTAwNjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2dyTW91c2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMDE1OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC51cnh2dE1vdXNlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjU6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmN1cnNvckhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTA0OTpcbiAgICAgICAgICAgICAgICAgICAgO1xuICAgICAgICAgICAgICAgIGNhc2UgNDc6XG4gICAgICAgICAgICAgICAgY2FzZSAxMDQ3OlxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGVybWluYWwubm9ybWFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5saW5lcyA9IHRoaXMuX3Rlcm1pbmFsLm5vcm1hbC5saW5lcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnliYXNlID0gdGhpcy5fdGVybWluYWwubm9ybWFsLnliYXNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwueWRpc3AgPSB0aGlzLl90ZXJtaW5hbC5ub3JtYWwueWRpc3A7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC54ID0gdGhpcy5fdGVybWluYWwubm9ybWFsLng7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC55ID0gdGhpcy5fdGVybWluYWwubm9ybWFsLnk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zY3JvbGxUb3AgPSB0aGlzLl90ZXJtaW5hbC5ub3JtYWwuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2Nyb2xsQm90dG9tID0gdGhpcy5fdGVybWluYWwubm9ybWFsLnNjcm9sbEJvdHRvbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnRhYnMgPSB0aGlzLl90ZXJtaW5hbC5ub3JtYWwudGFicztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLm5vcm1hbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5yZWZyZXNoKDAsIHRoaXMuX3Rlcm1pbmFsLnJvd3MgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnZpZXdwb3J0LnN5bmNTY3JvbGxBcmVhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zaG93Q3Vyc29yKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuY2hhckF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoID09PSAxICYmIHBhcmFtc1swXSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuY3VyQXR0ciA9IHRoaXMuX3Rlcm1pbmFsLmRlZkF0dHI7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGwgPSBwYXJhbXMubGVuZ3RoLCBpID0gMCwgZmxhZ3MgPSB0aGlzLl90ZXJtaW5hbC5jdXJBdHRyID4+IDE4LCBmZyA9ICh0aGlzLl90ZXJtaW5hbC5jdXJBdHRyID4+IDkpICYgMHgxZmYsIGJnID0gdGhpcy5fdGVybWluYWwuY3VyQXR0ciAmIDB4MWZmLCBwO1xuICAgICAgICBmb3IgKDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgcCA9IHBhcmFtc1tpXTtcbiAgICAgICAgICAgIGlmIChwID49IDMwICYmIHAgPD0gMzcpIHtcbiAgICAgICAgICAgICAgICBmZyA9IHAgLSAzMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHAgPj0gNDAgJiYgcCA8PSA0Nykge1xuICAgICAgICAgICAgICAgIGJnID0gcCAtIDQwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocCA+PSA5MCAmJiBwIDw9IDk3KSB7XG4gICAgICAgICAgICAgICAgcCArPSA4O1xuICAgICAgICAgICAgICAgIGZnID0gcCAtIDkwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocCA+PSAxMDAgJiYgcCA8PSAxMDcpIHtcbiAgICAgICAgICAgICAgICBwICs9IDg7XG4gICAgICAgICAgICAgICAgYmcgPSBwIC0gMTAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGZsYWdzID0gdGhpcy5fdGVybWluYWwuZGVmQXR0ciA+PiAxODtcbiAgICAgICAgICAgICAgICBmZyA9ICh0aGlzLl90ZXJtaW5hbC5kZWZBdHRyID4+IDkpICYgMHgxZmY7XG4gICAgICAgICAgICAgICAgYmcgPSB0aGlzLl90ZXJtaW5hbC5kZWZBdHRyICYgMHgxZmY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwID09PSAxKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHAgPT09IDQpIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocCA9PT0gNSkge1xuICAgICAgICAgICAgICAgIGZsYWdzIHw9IDQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwID09PSA3KSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgfD0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHAgPT09IDgpIHtcbiAgICAgICAgICAgICAgICBmbGFncyB8PSAxNjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHAgPT09IDIyKSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgJj0gfjE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwID09PSAyNCkge1xuICAgICAgICAgICAgICAgIGZsYWdzICY9IH4yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocCA9PT0gMjUpIHtcbiAgICAgICAgICAgICAgICBmbGFncyAmPSB+NDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHAgPT09IDI3KSB7XG4gICAgICAgICAgICAgICAgZmxhZ3MgJj0gfjg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwID09PSAyOCkge1xuICAgICAgICAgICAgICAgIGZsYWdzICY9IH4xNjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHAgPT09IDM5KSB7XG4gICAgICAgICAgICAgICAgZmcgPSAodGhpcy5fdGVybWluYWwuZGVmQXR0ciA+PiA5KSAmIDB4MWZmO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocCA9PT0gNDkpIHtcbiAgICAgICAgICAgICAgICBiZyA9IHRoaXMuX3Rlcm1pbmFsLmRlZkF0dHIgJiAweDFmZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHAgPT09IDM4KSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtc1tpICsgMV0gPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgICAgICAgICAgICBmZyA9IHRoaXMuX3Rlcm1pbmFsLm1hdGNoQ29sb3IocGFyYW1zW2ldICYgMHhmZiwgcGFyYW1zW2kgKyAxXSAmIDB4ZmYsIHBhcmFtc1tpICsgMl0gJiAweGZmKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZnID09PSAtMSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGZnID0gMHgxZmY7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyYW1zW2kgKyAxXSA9PT0gNSkge1xuICAgICAgICAgICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgICAgICAgICAgIHAgPSBwYXJhbXNbaV0gJiAweGZmO1xuICAgICAgICAgICAgICAgICAgICBmZyA9IHA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAocCA9PT0gNDgpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyYW1zW2kgKyAxXSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBpICs9IDI7XG4gICAgICAgICAgICAgICAgICAgIGJnID0gdGhpcy5fdGVybWluYWwubWF0Y2hDb2xvcihwYXJhbXNbaV0gJiAweGZmLCBwYXJhbXNbaSArIDFdICYgMHhmZiwgcGFyYW1zW2kgKyAyXSAmIDB4ZmYpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYmcgPT09IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgYmcgPSAweDFmZjtcbiAgICAgICAgICAgICAgICAgICAgaSArPSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJhbXNbaSArIDFdID09PSA1KSB7XG4gICAgICAgICAgICAgICAgICAgIGkgKz0gMjtcbiAgICAgICAgICAgICAgICAgICAgcCA9IHBhcmFtc1tpXSAmIDB4ZmY7XG4gICAgICAgICAgICAgICAgICAgIGJnID0gcDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChwID09PSAxMDApIHtcbiAgICAgICAgICAgICAgICBmZyA9ICh0aGlzLl90ZXJtaW5hbC5kZWZBdHRyID4+IDkpICYgMHgxZmY7XG4gICAgICAgICAgICAgICAgYmcgPSB0aGlzLl90ZXJtaW5hbC5kZWZBdHRyICYgMHgxZmY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5lcnJvcignVW5rbm93biBTR1IgYXR0cmlidXRlOiAlZC4nLCBwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90ZXJtaW5hbC5jdXJBdHRyID0gKGZsYWdzIDw8IDE4KSB8IChmZyA8PCA5KSB8IGJnO1xuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5kZXZpY2VTdGF0dXMgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgIGlmICghdGhpcy5fdGVybWluYWwucHJlZml4KSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHBhcmFtc1swXSkge1xuICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2VuZChFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzBuJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2VuZChFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWydcbiAgICAgICAgICAgICAgICAgICAgICAgICsgKHRoaXMuX3Rlcm1pbmFsLnkgKyAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgKyAnOydcbiAgICAgICAgICAgICAgICAgICAgICAgICsgKHRoaXMuX3Rlcm1pbmFsLnggKyAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgKyAnUicpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90ZXJtaW5hbC5wcmVmaXggPT09ICc/Jykge1xuICAgICAgICAgICAgc3dpdGNoIChwYXJhbXNbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNlbmQoRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1s/J1xuICAgICAgICAgICAgICAgICAgICAgICAgKyAodGhpcy5fdGVybWluYWwueSArIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICArICc7J1xuICAgICAgICAgICAgICAgICAgICAgICAgKyAodGhpcy5fdGVybWluYWwueCArIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICArICdSJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjU6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMjY6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNTM6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLnNvZnRSZXNldCA9IGZ1bmN0aW9uIChwYXJhbXMpIHtcbiAgICAgICAgdGhpcy5fdGVybWluYWwuY3Vyc29ySGlkZGVuID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLmluc2VydE1vZGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fdGVybWluYWwub3JpZ2luTW9kZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC53cmFwYXJvdW5kTW9kZSA9IHRydWU7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLmFwcGxpY2F0aW9uS2V5cGFkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnZpZXdwb3J0LnN5bmNTY3JvbGxBcmVhKCk7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLmFwcGxpY2F0aW9uQ3Vyc29yID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNjcm9sbFRvcCA9IDA7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNjcm9sbEJvdHRvbSA9IHRoaXMuX3Rlcm1pbmFsLnJvd3MgLSAxO1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC5jdXJBdHRyID0gdGhpcy5fdGVybWluYWwuZGVmQXR0cjtcbiAgICAgICAgdGhpcy5fdGVybWluYWwueCA9IHRoaXMuX3Rlcm1pbmFsLnkgPSAwO1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC5jaGFyc2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdGVybWluYWwuZ2xldmVsID0gMDtcbiAgICAgICAgdGhpcy5fdGVybWluYWwuY2hhcnNldHMgPSBbbnVsbF07XG4gICAgfTtcbiAgICBJbnB1dEhhbmRsZXIucHJvdG90eXBlLnNldEN1cnNvclN0eWxlID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB2YXIgcGFyYW0gPSBwYXJhbXNbMF0gPCAxID8gMSA6IHBhcmFtc1swXTtcbiAgICAgICAgc3dpdGNoIChwYXJhbSkge1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNldE9wdGlvbignY3Vyc29yU3R5bGUnLCAnYmxvY2snKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zZXRPcHRpb24oJ2N1cnNvclN0eWxlJywgJ3VuZGVybGluZScpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNldE9wdGlvbignY3Vyc29yU3R5bGUnLCAnYmFyJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGlzQmxpbmtpbmcgPSBwYXJhbSAlIDIgPT09IDE7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNldE9wdGlvbignY3Vyc29yQmxpbmsnLCBpc0JsaW5raW5nKTtcbiAgICB9O1xuICAgIElucHV0SGFuZGxlci5wcm90b3R5cGUuc2V0U2Nyb2xsUmVnaW9uID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICBpZiAodGhpcy5fdGVybWluYWwucHJlZml4KVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC5zY3JvbGxUb3AgPSAocGFyYW1zWzBdIHx8IDEpIC0gMTtcbiAgICAgICAgdGhpcy5fdGVybWluYWwuc2Nyb2xsQm90dG9tID0gKHBhcmFtc1sxXSAmJiBwYXJhbXNbMV0gPD0gdGhpcy5fdGVybWluYWwucm93cyA/IHBhcmFtc1sxXSA6IHRoaXMuX3Rlcm1pbmFsLnJvd3MpIC0gMTtcbiAgICAgICAgdGhpcy5fdGVybWluYWwueCA9IDA7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnkgPSAwO1xuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5zYXZlQ3Vyc29yID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC5zYXZlZFggPSB0aGlzLl90ZXJtaW5hbC54O1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC5zYXZlZFkgPSB0aGlzLl90ZXJtaW5hbC55O1xuICAgIH07XG4gICAgSW5wdXRIYW5kbGVyLnByb3RvdHlwZS5yZXN0b3JlQ3Vyc29yID0gZnVuY3Rpb24gKHBhcmFtcykge1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC54ID0gdGhpcy5fdGVybWluYWwuc2F2ZWRYIHx8IDA7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnkgPSB0aGlzLl90ZXJtaW5hbC5zYXZlZFkgfHwgMDtcbiAgICB9O1xuICAgIHJldHVybiBJbnB1dEhhbmRsZXI7XG59KCkpO1xuZXhwb3J0cy5JbnB1dEhhbmRsZXIgPSBJbnB1dEhhbmRsZXI7XG52YXIgd2N3aWR0aCA9IChmdW5jdGlvbiAob3B0cykge1xuICAgIHZhciBDT01CSU5JTkcgPSBbXG4gICAgICAgIFsweDAzMDAsIDB4MDM2Rl0sIFsweDA0ODMsIDB4MDQ4Nl0sIFsweDA0ODgsIDB4MDQ4OV0sXG4gICAgICAgIFsweDA1OTEsIDB4MDVCRF0sIFsweDA1QkYsIDB4MDVCRl0sIFsweDA1QzEsIDB4MDVDMl0sXG4gICAgICAgIFsweDA1QzQsIDB4MDVDNV0sIFsweDA1QzcsIDB4MDVDN10sIFsweDA2MDAsIDB4MDYwM10sXG4gICAgICAgIFsweDA2MTAsIDB4MDYxNV0sIFsweDA2NEIsIDB4MDY1RV0sIFsweDA2NzAsIDB4MDY3MF0sXG4gICAgICAgIFsweDA2RDYsIDB4MDZFNF0sIFsweDA2RTcsIDB4MDZFOF0sIFsweDA2RUEsIDB4MDZFRF0sXG4gICAgICAgIFsweDA3MEYsIDB4MDcwRl0sIFsweDA3MTEsIDB4MDcxMV0sIFsweDA3MzAsIDB4MDc0QV0sXG4gICAgICAgIFsweDA3QTYsIDB4MDdCMF0sIFsweDA3RUIsIDB4MDdGM10sIFsweDA5MDEsIDB4MDkwMl0sXG4gICAgICAgIFsweDA5M0MsIDB4MDkzQ10sIFsweDA5NDEsIDB4MDk0OF0sIFsweDA5NEQsIDB4MDk0RF0sXG4gICAgICAgIFsweDA5NTEsIDB4MDk1NF0sIFsweDA5NjIsIDB4MDk2M10sIFsweDA5ODEsIDB4MDk4MV0sXG4gICAgICAgIFsweDA5QkMsIDB4MDlCQ10sIFsweDA5QzEsIDB4MDlDNF0sIFsweDA5Q0QsIDB4MDlDRF0sXG4gICAgICAgIFsweDA5RTIsIDB4MDlFM10sIFsweDBBMDEsIDB4MEEwMl0sIFsweDBBM0MsIDB4MEEzQ10sXG4gICAgICAgIFsweDBBNDEsIDB4MEE0Ml0sIFsweDBBNDcsIDB4MEE0OF0sIFsweDBBNEIsIDB4MEE0RF0sXG4gICAgICAgIFsweDBBNzAsIDB4MEE3MV0sIFsweDBBODEsIDB4MEE4Ml0sIFsweDBBQkMsIDB4MEFCQ10sXG4gICAgICAgIFsweDBBQzEsIDB4MEFDNV0sIFsweDBBQzcsIDB4MEFDOF0sIFsweDBBQ0QsIDB4MEFDRF0sXG4gICAgICAgIFsweDBBRTIsIDB4MEFFM10sIFsweDBCMDEsIDB4MEIwMV0sIFsweDBCM0MsIDB4MEIzQ10sXG4gICAgICAgIFsweDBCM0YsIDB4MEIzRl0sIFsweDBCNDEsIDB4MEI0M10sIFsweDBCNEQsIDB4MEI0RF0sXG4gICAgICAgIFsweDBCNTYsIDB4MEI1Nl0sIFsweDBCODIsIDB4MEI4Ml0sIFsweDBCQzAsIDB4MEJDMF0sXG4gICAgICAgIFsweDBCQ0QsIDB4MEJDRF0sIFsweDBDM0UsIDB4MEM0MF0sIFsweDBDNDYsIDB4MEM0OF0sXG4gICAgICAgIFsweDBDNEEsIDB4MEM0RF0sIFsweDBDNTUsIDB4MEM1Nl0sIFsweDBDQkMsIDB4MENCQ10sXG4gICAgICAgIFsweDBDQkYsIDB4MENCRl0sIFsweDBDQzYsIDB4MENDNl0sIFsweDBDQ0MsIDB4MENDRF0sXG4gICAgICAgIFsweDBDRTIsIDB4MENFM10sIFsweDBENDEsIDB4MEQ0M10sIFsweDBENEQsIDB4MEQ0RF0sXG4gICAgICAgIFsweDBEQ0EsIDB4MERDQV0sIFsweDBERDIsIDB4MERENF0sIFsweDBERDYsIDB4MERENl0sXG4gICAgICAgIFsweDBFMzEsIDB4MEUzMV0sIFsweDBFMzQsIDB4MEUzQV0sIFsweDBFNDcsIDB4MEU0RV0sXG4gICAgICAgIFsweDBFQjEsIDB4MEVCMV0sIFsweDBFQjQsIDB4MEVCOV0sIFsweDBFQkIsIDB4MEVCQ10sXG4gICAgICAgIFsweDBFQzgsIDB4MEVDRF0sIFsweDBGMTgsIDB4MEYxOV0sIFsweDBGMzUsIDB4MEYzNV0sXG4gICAgICAgIFsweDBGMzcsIDB4MEYzN10sIFsweDBGMzksIDB4MEYzOV0sIFsweDBGNzEsIDB4MEY3RV0sXG4gICAgICAgIFsweDBGODAsIDB4MEY4NF0sIFsweDBGODYsIDB4MEY4N10sIFsweDBGOTAsIDB4MEY5N10sXG4gICAgICAgIFsweDBGOTksIDB4MEZCQ10sIFsweDBGQzYsIDB4MEZDNl0sIFsweDEwMkQsIDB4MTAzMF0sXG4gICAgICAgIFsweDEwMzIsIDB4MTAzMl0sIFsweDEwMzYsIDB4MTAzN10sIFsweDEwMzksIDB4MTAzOV0sXG4gICAgICAgIFsweDEwNTgsIDB4MTA1OV0sIFsweDExNjAsIDB4MTFGRl0sIFsweDEzNUYsIDB4MTM1Rl0sXG4gICAgICAgIFsweDE3MTIsIDB4MTcxNF0sIFsweDE3MzIsIDB4MTczNF0sIFsweDE3NTIsIDB4MTc1M10sXG4gICAgICAgIFsweDE3NzIsIDB4MTc3M10sIFsweDE3QjQsIDB4MTdCNV0sIFsweDE3QjcsIDB4MTdCRF0sXG4gICAgICAgIFsweDE3QzYsIDB4MTdDNl0sIFsweDE3QzksIDB4MTdEM10sIFsweDE3REQsIDB4MTdERF0sXG4gICAgICAgIFsweDE4MEIsIDB4MTgwRF0sIFsweDE4QTksIDB4MThBOV0sIFsweDE5MjAsIDB4MTkyMl0sXG4gICAgICAgIFsweDE5MjcsIDB4MTkyOF0sIFsweDE5MzIsIDB4MTkzMl0sIFsweDE5MzksIDB4MTkzQl0sXG4gICAgICAgIFsweDFBMTcsIDB4MUExOF0sIFsweDFCMDAsIDB4MUIwM10sIFsweDFCMzQsIDB4MUIzNF0sXG4gICAgICAgIFsweDFCMzYsIDB4MUIzQV0sIFsweDFCM0MsIDB4MUIzQ10sIFsweDFCNDIsIDB4MUI0Ml0sXG4gICAgICAgIFsweDFCNkIsIDB4MUI3M10sIFsweDFEQzAsIDB4MURDQV0sIFsweDFERkUsIDB4MURGRl0sXG4gICAgICAgIFsweDIwMEIsIDB4MjAwRl0sIFsweDIwMkEsIDB4MjAyRV0sIFsweDIwNjAsIDB4MjA2M10sXG4gICAgICAgIFsweDIwNkEsIDB4MjA2Rl0sIFsweDIwRDAsIDB4MjBFRl0sIFsweDMwMkEsIDB4MzAyRl0sXG4gICAgICAgIFsweDMwOTksIDB4MzA5QV0sIFsweEE4MDYsIDB4QTgwNl0sIFsweEE4MEIsIDB4QTgwQl0sXG4gICAgICAgIFsweEE4MjUsIDB4QTgyNl0sIFsweEZCMUUsIDB4RkIxRV0sIFsweEZFMDAsIDB4RkUwRl0sXG4gICAgICAgIFsweEZFMjAsIDB4RkUyM10sIFsweEZFRkYsIDB4RkVGRl0sIFsweEZGRjksIDB4RkZGQl0sXG4gICAgICAgIFsweDEwQTAxLCAweDEwQTAzXSwgWzB4MTBBMDUsIDB4MTBBMDZdLCBbMHgxMEEwQywgMHgxMEEwRl0sXG4gICAgICAgIFsweDEwQTM4LCAweDEwQTNBXSwgWzB4MTBBM0YsIDB4MTBBM0ZdLCBbMHgxRDE2NywgMHgxRDE2OV0sXG4gICAgICAgIFsweDFEMTczLCAweDFEMTgyXSwgWzB4MUQxODUsIDB4MUQxOEJdLCBbMHgxRDFBQSwgMHgxRDFBRF0sXG4gICAgICAgIFsweDFEMjQyLCAweDFEMjQ0XSwgWzB4RTAwMDEsIDB4RTAwMDFdLCBbMHhFMDAyMCwgMHhFMDA3Rl0sXG4gICAgICAgIFsweEUwMTAwLCAweEUwMUVGXVxuICAgIF07XG4gICAgZnVuY3Rpb24gYmlzZWFyY2godWNzKSB7XG4gICAgICAgIHZhciBtaW4gPSAwO1xuICAgICAgICB2YXIgbWF4ID0gQ09NQklOSU5HLmxlbmd0aCAtIDE7XG4gICAgICAgIHZhciBtaWQ7XG4gICAgICAgIGlmICh1Y3MgPCBDT01CSU5JTkdbMF1bMF0gfHwgdWNzID4gQ09NQklOSU5HW21heF1bMV0pXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHdoaWxlIChtYXggPj0gbWluKSB7XG4gICAgICAgICAgICBtaWQgPSBNYXRoLmZsb29yKChtaW4gKyBtYXgpIC8gMik7XG4gICAgICAgICAgICBpZiAodWNzID4gQ09NQklOSU5HW21pZF1bMV0pXG4gICAgICAgICAgICAgICAgbWluID0gbWlkICsgMTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHVjcyA8IENPTUJJTklOR1ttaWRdWzBdKVxuICAgICAgICAgICAgICAgIG1heCA9IG1pZCAtIDE7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3Y3dpZHRoKHVjcykge1xuICAgICAgICBpZiAodWNzID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG9wdHMubnVsO1xuICAgICAgICBpZiAodWNzIDwgMzIgfHwgKHVjcyA+PSAweDdmICYmIHVjcyA8IDB4YTApKVxuICAgICAgICAgICAgcmV0dXJuIG9wdHMuY29udHJvbDtcbiAgICAgICAgaWYgKGJpc2VhcmNoKHVjcykpXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgaWYgKGlzV2lkZSh1Y3MpKSB7XG4gICAgICAgICAgICByZXR1cm4gMjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNXaWRlKHVjcykge1xuICAgICAgICByZXR1cm4gKHVjcyA+PSAweDExMDAgJiYgKHVjcyA8PSAweDExNWYgfHxcbiAgICAgICAgICAgIHVjcyA9PT0gMHgyMzI5IHx8XG4gICAgICAgICAgICB1Y3MgPT09IDB4MjMyYSB8fFxuICAgICAgICAgICAgKHVjcyA+PSAweDJlODAgJiYgdWNzIDw9IDB4YTRjZiAmJiB1Y3MgIT09IDB4MzAzZikgfHxcbiAgICAgICAgICAgICh1Y3MgPj0gMHhhYzAwICYmIHVjcyA8PSAweGQ3YTMpIHx8XG4gICAgICAgICAgICAodWNzID49IDB4ZjkwMCAmJiB1Y3MgPD0gMHhmYWZmKSB8fFxuICAgICAgICAgICAgKHVjcyA+PSAweGZlMTAgJiYgdWNzIDw9IDB4ZmUxOSkgfHxcbiAgICAgICAgICAgICh1Y3MgPj0gMHhmZTMwICYmIHVjcyA8PSAweGZlNmYpIHx8XG4gICAgICAgICAgICAodWNzID49IDB4ZmYwMCAmJiB1Y3MgPD0gMHhmZjYwKSB8fFxuICAgICAgICAgICAgKHVjcyA+PSAweGZmZTAgJiYgdWNzIDw9IDB4ZmZlNikgfHxcbiAgICAgICAgICAgICh1Y3MgPj0gMHgyMDAwMCAmJiB1Y3MgPD0gMHgyZmZmZCkgfHxcbiAgICAgICAgICAgICh1Y3MgPj0gMHgzMDAwMCAmJiB1Y3MgPD0gMHgzZmZmZCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHdjd2lkdGg7XG59KSh7IG51bDogMCwgY29udHJvbDogMCB9KTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SW5wdXRIYW5kbGVyLmpzLm1hcFxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgSU5WQUxJRF9MSU5LX0NMQVNTID0gJ3h0ZXJtLWludmFsaWQtbGluayc7XG52YXIgcHJvdG9jb2xDbGF1c2UgPSAnKGh0dHBzPzpcXFxcL1xcXFwvKSc7XG52YXIgZG9tYWluQ2hhcmFjdGVyU2V0ID0gJ1tcXFxcZGEtelxcXFwuLV0rJztcbnZhciBuZWdhdGVkRG9tYWluQ2hhcmFjdGVyU2V0ID0gJ1teXFxcXGRhLXpcXFxcLi1dKyc7XG52YXIgZG9tYWluQm9keUNsYXVzZSA9ICcoJyArIGRvbWFpbkNoYXJhY3RlclNldCArICcpJztcbnZhciB0bGRDbGF1c2UgPSAnKFthLXpcXFxcLl17Miw2fSknO1xudmFyIGlwQ2xhdXNlID0gJygoXFxcXGR7MSwzfVxcXFwuKXszfVxcXFxkezEsM30pJztcbnZhciBsb2NhbEhvc3RDbGF1c2UgPSAnKGxvY2FsaG9zdCknO1xudmFyIHBvcnRDbGF1c2UgPSAnKDpcXFxcZHsxLDV9KSc7XG52YXIgaG9zdENsYXVzZSA9ICcoKCcgKyBkb21haW5Cb2R5Q2xhdXNlICsgJ1xcXFwuJyArIHRsZENsYXVzZSArICcpfCcgKyBpcENsYXVzZSArICd8JyArIGxvY2FsSG9zdENsYXVzZSArICcpJyArIHBvcnRDbGF1c2UgKyAnPyc7XG52YXIgcGF0aENsYXVzZSA9ICcoXFxcXC9bXFxcXC9cXFxcd1xcXFwuXFxcXC0lfl0qKSonO1xudmFyIHF1ZXJ5U3RyaW5nSGFzaEZyYWdtZW50Q2hhcmFjdGVyU2V0ID0gJ1swLTlcXFxcd1xcXFxbXFxcXF1cXFxcKFxcXFwpXFxcXC9cXFxcP1xcXFwhI0AkJSZcXCcqKyw6O35cXFxcPVxcXFwuXFxcXC1dKic7XG52YXIgcXVlcnlTdHJpbmdDbGF1c2UgPSAnKFxcXFw/JyArIHF1ZXJ5U3RyaW5nSGFzaEZyYWdtZW50Q2hhcmFjdGVyU2V0ICsgJyk/JztcbnZhciBoYXNoRnJhZ21lbnRDbGF1c2UgPSAnKCMnICsgcXVlcnlTdHJpbmdIYXNoRnJhZ21lbnRDaGFyYWN0ZXJTZXQgKyAnKT8nO1xudmFyIG5lZ2F0ZWRQYXRoQ2hhcmFjdGVyU2V0ID0gJ1teXFxcXC9cXFxcd1xcXFwuXFxcXC0lXSsnO1xudmFyIGJvZHlDbGF1c2UgPSBob3N0Q2xhdXNlICsgcGF0aENsYXVzZSArIHF1ZXJ5U3RyaW5nQ2xhdXNlICsgaGFzaEZyYWdtZW50Q2xhdXNlO1xudmFyIHN0YXJ0ID0gJyg/Ol58JyArIG5lZ2F0ZWREb21haW5DaGFyYWN0ZXJTZXQgKyAnKSgnO1xudmFyIGVuZCA9ICcpKCR8JyArIG5lZ2F0ZWRQYXRoQ2hhcmFjdGVyU2V0ICsgJyknO1xudmFyIHN0cmljdFVybFJlZ2V4ID0gbmV3IFJlZ0V4cChzdGFydCArIHByb3RvY29sQ2xhdXNlICsgYm9keUNsYXVzZSArIGVuZCk7XG52YXIgSFlQRVJURVhUX0xJTktfTUFUQ0hFUl9JRCA9IDA7XG52YXIgTGlua2lmaWVyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBMaW5raWZpZXIoKSB7XG4gICAgICAgIHRoaXMuX25leHRMaW5rTWF0Y2hlcklkID0gSFlQRVJURVhUX0xJTktfTUFUQ0hFUl9JRDtcbiAgICAgICAgdGhpcy5fcm93VGltZW91dElkcyA9IFtdO1xuICAgICAgICB0aGlzLl9saW5rTWF0Y2hlcnMgPSBbXTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckxpbmtNYXRjaGVyKHN0cmljdFVybFJlZ2V4LCBudWxsLCB7IG1hdGNoSW5kZXg6IDEgfSk7XG4gICAgfVxuICAgIExpbmtpZmllci5wcm90b3R5cGUuYXR0YWNoVG9Eb20gPSBmdW5jdGlvbiAoZG9jdW1lbnQsIHJvd3MpIHtcbiAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBkb2N1bWVudDtcbiAgICAgICAgdGhpcy5fcm93cyA9IHJvd3M7XG4gICAgfTtcbiAgICBMaW5raWZpZXIucHJvdG90eXBlLmxpbmtpZnlSb3cgPSBmdW5jdGlvbiAocm93SW5kZXgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9kb2N1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciB0aW1lb3V0SWQgPSB0aGlzLl9yb3dUaW1lb3V0SWRzW3Jvd0luZGV4XTtcbiAgICAgICAgaWYgKHRpbWVvdXRJZCkge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcm93VGltZW91dElkc1tyb3dJbmRleF0gPSBzZXRUaW1lb3V0KHRoaXMuX2xpbmtpZnlSb3cuYmluZCh0aGlzLCByb3dJbmRleCksIExpbmtpZmllci5USU1FX0JFRk9SRV9MSU5LSUZZKTtcbiAgICB9O1xuICAgIExpbmtpZmllci5wcm90b3R5cGUuc2V0SHlwZXJ0ZXh0TGlua0hhbmRsZXIgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgICAgICB0aGlzLl9saW5rTWF0Y2hlcnNbSFlQRVJURVhUX0xJTktfTUFUQ0hFUl9JRF0uaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgfTtcbiAgICBMaW5raWZpZXIucHJvdG90eXBlLnNldEh5cGVydGV4dFZhbGlkYXRpb25DYWxsYmFjayA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICB0aGlzLl9saW5rTWF0Y2hlcnNbSFlQRVJURVhUX0xJTktfTUFUQ0hFUl9JRF0udmFsaWRhdGlvbkNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfTtcbiAgICBMaW5raWZpZXIucHJvdG90eXBlLnJlZ2lzdGVyTGlua01hdGNoZXIgPSBmdW5jdGlvbiAocmVnZXgsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICAgICAgaWYgKHRoaXMuX25leHRMaW5rTWF0Y2hlcklkICE9PSBIWVBFUlRFWFRfTElOS19NQVRDSEVSX0lEICYmICFoYW5kbGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hhbmRsZXIgbXVzdCBiZSBkZWZpbmVkJyk7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1hdGNoZXIgPSB7XG4gICAgICAgICAgICBpZDogdGhpcy5fbmV4dExpbmtNYXRjaGVySWQrKyxcbiAgICAgICAgICAgIHJlZ2V4OiByZWdleCxcbiAgICAgICAgICAgIGhhbmRsZXI6IGhhbmRsZXIsXG4gICAgICAgICAgICBtYXRjaEluZGV4OiBvcHRpb25zLm1hdGNoSW5kZXgsXG4gICAgICAgICAgICB2YWxpZGF0aW9uQ2FsbGJhY2s6IG9wdGlvbnMudmFsaWRhdGlvbkNhbGxiYWNrLFxuICAgICAgICAgICAgcHJpb3JpdHk6IG9wdGlvbnMucHJpb3JpdHkgfHwgMFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9hZGRMaW5rTWF0Y2hlclRvTGlzdChtYXRjaGVyKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXIuaWQ7XG4gICAgfTtcbiAgICBMaW5raWZpZXIucHJvdG90eXBlLl9hZGRMaW5rTWF0Y2hlclRvTGlzdCA9IGZ1bmN0aW9uIChtYXRjaGVyKSB7XG4gICAgICAgIGlmICh0aGlzLl9saW5rTWF0Y2hlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLl9saW5rTWF0Y2hlcnMucHVzaChtYXRjaGVyKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5fbGlua01hdGNoZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAobWF0Y2hlci5wcmlvcml0eSA8PSB0aGlzLl9saW5rTWF0Y2hlcnNbaV0ucHJpb3JpdHkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9saW5rTWF0Y2hlcnMuc3BsaWNlKGkgKyAxLCAwLCBtYXRjaGVyKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbGlua01hdGNoZXJzLnNwbGljZSgwLCAwLCBtYXRjaGVyKTtcbiAgICB9O1xuICAgIExpbmtpZmllci5wcm90b3R5cGUuZGVyZWdpc3RlckxpbmtNYXRjaGVyID0gZnVuY3Rpb24gKG1hdGNoZXJJZCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHRoaXMuX2xpbmtNYXRjaGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2xpbmtNYXRjaGVyc1tpXS5pZCA9PT0gbWF0Y2hlcklkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGlua01hdGNoZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBMaW5raWZpZXIucHJvdG90eXBlLl9saW5raWZ5Um93ID0gZnVuY3Rpb24gKHJvd0luZGV4KSB7XG4gICAgICAgIHZhciByb3cgPSB0aGlzLl9yb3dzW3Jvd0luZGV4XTtcbiAgICAgICAgaWYgKCFyb3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdGV4dCA9IHJvdy50ZXh0Q29udGVudDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9saW5rTWF0Y2hlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBtYXRjaGVyID0gdGhpcy5fbGlua01hdGNoZXJzW2ldO1xuICAgICAgICAgICAgdmFyIGxpbmtFbGVtZW50cyA9IHRoaXMuX2RvTGlua2lmeVJvdyhyb3csIG1hdGNoZXIpO1xuICAgICAgICAgICAgaWYgKGxpbmtFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIudmFsaWRhdGlvbkNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKGopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gbGlua0VsZW1lbnRzW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlci52YWxpZGF0aW9uQ2FsbGJhY2soZWxlbWVudC50ZXh0Q29udGVudCwgZWxlbWVudCwgZnVuY3Rpb24gKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKElOVkFMSURfTElOS19DTEFTUyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGlua0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfbG9vcF8xKGopO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgTGlua2lmaWVyLnByb3RvdHlwZS5fZG9MaW5raWZ5Um93ID0gZnVuY3Rpb24gKHJvdywgbWF0Y2hlcikge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIHZhciBpc0h0dHBMaW5rTWF0Y2hlciA9IG1hdGNoZXIuaWQgPT09IEhZUEVSVEVYVF9MSU5LX01BVENIRVJfSUQ7XG4gICAgICAgIHZhciBub2RlcyA9IHJvdy5jaGlsZE5vZGVzO1xuICAgICAgICB2YXIgbWF0Y2ggPSByb3cudGV4dENvbnRlbnQubWF0Y2gobWF0Y2hlci5yZWdleCk7XG4gICAgICAgIGlmICghbWF0Y2ggfHwgbWF0Y2gubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHZhciB1cmkgPSBtYXRjaFt0eXBlb2YgbWF0Y2hlci5tYXRjaEluZGV4ICE9PSAnbnVtYmVyJyA/IDAgOiBtYXRjaGVyLm1hdGNoSW5kZXhdO1xuICAgICAgICB2YXIgcm93U3RhcnRJbmRleCA9IG1hdGNoLmluZGV4ICsgdXJpLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIG5vZGUgPSBub2Rlc1tpXTtcbiAgICAgICAgICAgIHZhciBzZWFyY2hJbmRleCA9IG5vZGUudGV4dENvbnRlbnQuaW5kZXhPZih1cmkpO1xuICAgICAgICAgICAgaWYgKHNlYXJjaEluZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgICB2YXIgbGlua0VsZW1lbnQgPSB0aGlzLl9jcmVhdGVBbmNob3JFbGVtZW50KHVyaSwgbWF0Y2hlci5oYW5kbGVyLCBpc0h0dHBMaW5rTWF0Y2hlcik7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUudGV4dENvbnRlbnQubGVuZ3RoID09PSB1cmkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXBsYWNlTm9kZShub2RlLCBsaW5rRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IG5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5ub2RlTmFtZSA9PT0gJ0EnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuaW5uZXJIVE1MID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5vZGVzQWRkZWQgPSB0aGlzLl9yZXBsYWNlTm9kZVN1YnN0cmluZ1dpdGhOb2RlKG5vZGUsIGxpbmtFbGVtZW50LCB1cmksIHNlYXJjaEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgaSArPSBub2Rlc0FkZGVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChsaW5rRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbWF0Y2ggPSByb3cudGV4dENvbnRlbnQuc3Vic3RyaW5nKHJvd1N0YXJ0SW5kZXgpLm1hdGNoKG1hdGNoZXIucmVnZXgpO1xuICAgICAgICAgICAgICAgIGlmICghbWF0Y2ggfHwgbWF0Y2gubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHVyaSA9IG1hdGNoW3R5cGVvZiBtYXRjaGVyLm1hdGNoSW5kZXggIT09ICdudW1iZXInID8gMCA6IG1hdGNoZXIubWF0Y2hJbmRleF07XG4gICAgICAgICAgICAgICAgcm93U3RhcnRJbmRleCArPSBtYXRjaC5pbmRleCArIHVyaS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIExpbmtpZmllci5wcm90b3R5cGUuX2NyZWF0ZUFuY2hvckVsZW1lbnQgPSBmdW5jdGlvbiAodXJpLCBoYW5kbGVyLCBpc0h5cGVydGV4dExpbmtIYW5kbGVyKSB7XG4gICAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICBlbGVtZW50LnRleHRDb250ZW50ID0gdXJpO1xuICAgICAgICBlbGVtZW50LmRyYWdnYWJsZSA9IGZhbHNlO1xuICAgICAgICBpZiAoaXNIeXBlcnRleHRMaW5rSGFuZGxlcikge1xuICAgICAgICAgICAgZWxlbWVudC5ocmVmID0gdXJpO1xuICAgICAgICAgICAgZWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlcihldmVudCwgdXJpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoSU5WQUxJRF9MSU5LX0NMQVNTKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyKGV2ZW50LCB1cmkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgfTtcbiAgICBMaW5raWZpZXIucHJvdG90eXBlLl9yZXBsYWNlTm9kZSA9IGZ1bmN0aW9uIChvbGROb2RlKSB7XG4gICAgICAgIHZhciBuZXdOb2RlcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgbmV3Tm9kZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcmVudCA9IG9sZE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuZXdOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShuZXdOb2Rlc1tpXSwgb2xkTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKG9sZE5vZGUpO1xuICAgIH07XG4gICAgTGlua2lmaWVyLnByb3RvdHlwZS5fcmVwbGFjZU5vZGVTdWJzdHJpbmdXaXRoTm9kZSA9IGZ1bmN0aW9uICh0YXJnZXROb2RlLCBuZXdOb2RlLCBzdWJzdHJpbmcsIHN1YnN0cmluZ0luZGV4KSB7XG4gICAgICAgIHZhciBub2RlID0gdGFyZ2V0Tm9kZTtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDMpIHtcbiAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkTm9kZXNbMF07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPT09IDAgJiYgbm9kZS5ub2RlVHlwZSAhPT0gMykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0YXJnZXROb2RlIG11c3QgYmUgYSB0ZXh0IG5vZGUgb3Igb25seSBjb250YWluIGEgc2luZ2xlIHRleHQgbm9kZScpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBmdWxsVGV4dCA9IG5vZGUudGV4dENvbnRlbnQ7XG4gICAgICAgIGlmIChzdWJzdHJpbmdJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgdmFyIHJpZ2h0VGV4dF8xID0gZnVsbFRleHQuc3Vic3RyaW5nKHN1YnN0cmluZy5sZW5ndGgpO1xuICAgICAgICAgICAgdmFyIHJpZ2h0VGV4dE5vZGVfMSA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZVRleHROb2RlKHJpZ2h0VGV4dF8xKTtcbiAgICAgICAgICAgIHRoaXMuX3JlcGxhY2VOb2RlKG5vZGUsIG5ld05vZGUsIHJpZ2h0VGV4dE5vZGVfMSk7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3Vic3RyaW5nSW5kZXggPT09IHRhcmdldE5vZGUudGV4dENvbnRlbnQubGVuZ3RoIC0gc3Vic3RyaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGxlZnRUZXh0XzEgPSBmdWxsVGV4dC5zdWJzdHJpbmcoMCwgc3Vic3RyaW5nSW5kZXgpO1xuICAgICAgICAgICAgdmFyIGxlZnRUZXh0Tm9kZV8xID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobGVmdFRleHRfMSk7XG4gICAgICAgICAgICB0aGlzLl9yZXBsYWNlTm9kZShub2RlLCBsZWZ0VGV4dE5vZGVfMSwgbmV3Tm9kZSk7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbGVmdFRleHQgPSBmdWxsVGV4dC5zdWJzdHJpbmcoMCwgc3Vic3RyaW5nSW5kZXgpO1xuICAgICAgICB2YXIgbGVmdFRleHROb2RlID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobGVmdFRleHQpO1xuICAgICAgICB2YXIgcmlnaHRUZXh0ID0gZnVsbFRleHQuc3Vic3RyaW5nKHN1YnN0cmluZ0luZGV4ICsgc3Vic3RyaW5nLmxlbmd0aCk7XG4gICAgICAgIHZhciByaWdodFRleHROb2RlID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocmlnaHRUZXh0KTtcbiAgICAgICAgdGhpcy5fcmVwbGFjZU5vZGUobm9kZSwgbGVmdFRleHROb2RlLCBuZXdOb2RlLCByaWdodFRleHROb2RlKTtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfTtcbiAgICByZXR1cm4gTGlua2lmaWVyO1xufSgpKTtcbkxpbmtpZmllci5USU1FX0JFRk9SRV9MSU5LSUZZID0gMjAwO1xuZXhwb3J0cy5MaW5raWZpZXIgPSBMaW5raWZpZXI7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxpbmtpZmllci5qcy5tYXBcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIEVzY2FwZVNlcXVlbmNlc18xID0gcmVxdWlyZShcIi4vRXNjYXBlU2VxdWVuY2VzXCIpO1xudmFyIENoYXJzZXRzXzEgPSByZXF1aXJlKFwiLi9DaGFyc2V0c1wiKTtcbnZhciBub3JtYWxTdGF0ZUhhbmRsZXIgPSB7fTtcbm5vcm1hbFN0YXRlSGFuZGxlcltFc2NhcGVTZXF1ZW5jZXNfMS5DMC5CRUxdID0gZnVuY3Rpb24gKHBhcnNlciwgaGFuZGxlcikgeyByZXR1cm4gaGFuZGxlci5iZWxsKCk7IH07XG5ub3JtYWxTdGF0ZUhhbmRsZXJbRXNjYXBlU2VxdWVuY2VzXzEuQzAuTEZdID0gZnVuY3Rpb24gKHBhcnNlciwgaGFuZGxlcikgeyByZXR1cm4gaGFuZGxlci5saW5lRmVlZCgpOyB9O1xubm9ybWFsU3RhdGVIYW5kbGVyW0VzY2FwZVNlcXVlbmNlc18xLkMwLlZUXSA9IG5vcm1hbFN0YXRlSGFuZGxlcltFc2NhcGVTZXF1ZW5jZXNfMS5DMC5MRl07XG5ub3JtYWxTdGF0ZUhhbmRsZXJbRXNjYXBlU2VxdWVuY2VzXzEuQzAuRkZdID0gbm9ybWFsU3RhdGVIYW5kbGVyW0VzY2FwZVNlcXVlbmNlc18xLkMwLkxGXTtcbm5vcm1hbFN0YXRlSGFuZGxlcltFc2NhcGVTZXF1ZW5jZXNfMS5DMC5DUl0gPSBmdW5jdGlvbiAocGFyc2VyLCBoYW5kbGVyKSB7IHJldHVybiBoYW5kbGVyLmNhcnJpYWdlUmV0dXJuKCk7IH07XG5ub3JtYWxTdGF0ZUhhbmRsZXJbRXNjYXBlU2VxdWVuY2VzXzEuQzAuQlNdID0gZnVuY3Rpb24gKHBhcnNlciwgaGFuZGxlcikgeyByZXR1cm4gaGFuZGxlci5iYWNrc3BhY2UoKTsgfTtcbm5vcm1hbFN0YXRlSGFuZGxlcltFc2NhcGVTZXF1ZW5jZXNfMS5DMC5IVF0gPSBmdW5jdGlvbiAocGFyc2VyLCBoYW5kbGVyKSB7IHJldHVybiBoYW5kbGVyLnRhYigpOyB9O1xubm9ybWFsU3RhdGVIYW5kbGVyW0VzY2FwZVNlcXVlbmNlc18xLkMwLlNPXSA9IGZ1bmN0aW9uIChwYXJzZXIsIGhhbmRsZXIpIHsgcmV0dXJuIGhhbmRsZXIuc2hpZnRPdXQoKTsgfTtcbm5vcm1hbFN0YXRlSGFuZGxlcltFc2NhcGVTZXF1ZW5jZXNfMS5DMC5TSV0gPSBmdW5jdGlvbiAocGFyc2VyLCBoYW5kbGVyKSB7IHJldHVybiBoYW5kbGVyLnNoaWZ0SW4oKTsgfTtcbm5vcm1hbFN0YXRlSGFuZGxlcltFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0NdID0gZnVuY3Rpb24gKHBhcnNlciwgaGFuZGxlcikgeyByZXR1cm4gcGFyc2VyLnNldFN0YXRlKFBhcnNlclN0YXRlLkVTQ0FQRUQpOyB9O1xudmFyIGVzY2FwZWRTdGF0ZUhhbmRsZXIgPSB7fTtcbmVzY2FwZWRTdGF0ZUhhbmRsZXJbJ1snXSA9IGZ1bmN0aW9uIChwYXJzZXIsIHRlcm1pbmFsKSB7XG4gICAgdGVybWluYWwucGFyYW1zID0gW107XG4gICAgdGVybWluYWwuY3VycmVudFBhcmFtID0gMDtcbiAgICBwYXJzZXIuc2V0U3RhdGUoUGFyc2VyU3RhdGUuQ1NJX1BBUkFNKTtcbn07XG5lc2NhcGVkU3RhdGVIYW5kbGVyWyddJ10gPSBmdW5jdGlvbiAocGFyc2VyLCB0ZXJtaW5hbCkge1xuICAgIHRlcm1pbmFsLnBhcmFtcyA9IFtdO1xuICAgIHRlcm1pbmFsLmN1cnJlbnRQYXJhbSA9IDA7XG4gICAgcGFyc2VyLnNldFN0YXRlKFBhcnNlclN0YXRlLk9TQyk7XG59O1xuZXNjYXBlZFN0YXRlSGFuZGxlclsnUCddID0gZnVuY3Rpb24gKHBhcnNlciwgdGVybWluYWwpIHtcbiAgICB0ZXJtaW5hbC5wYXJhbXMgPSBbXTtcbiAgICB0ZXJtaW5hbC5jdXJyZW50UGFyYW0gPSAwO1xuICAgIHBhcnNlci5zZXRTdGF0ZShQYXJzZXJTdGF0ZS5EQ1MpO1xufTtcbmVzY2FwZWRTdGF0ZUhhbmRsZXJbJ18nXSA9IGZ1bmN0aW9uIChwYXJzZXIsIHRlcm1pbmFsKSB7XG4gICAgcGFyc2VyLnNldFN0YXRlKFBhcnNlclN0YXRlLklHTk9SRSk7XG59O1xuZXNjYXBlZFN0YXRlSGFuZGxlclsnXiddID0gZnVuY3Rpb24gKHBhcnNlciwgdGVybWluYWwpIHtcbiAgICBwYXJzZXIuc2V0U3RhdGUoUGFyc2VyU3RhdGUuSUdOT1JFKTtcbn07XG5lc2NhcGVkU3RhdGVIYW5kbGVyWydjJ10gPSBmdW5jdGlvbiAocGFyc2VyLCB0ZXJtaW5hbCkge1xuICAgIHRlcm1pbmFsLnJlc2V0KCk7XG59O1xuZXNjYXBlZFN0YXRlSGFuZGxlclsnRSddID0gZnVuY3Rpb24gKHBhcnNlciwgdGVybWluYWwpIHtcbiAgICB0ZXJtaW5hbC54ID0gMDtcbiAgICB0ZXJtaW5hbC5pbmRleCgpO1xuICAgIHBhcnNlci5zZXRTdGF0ZShQYXJzZXJTdGF0ZS5OT1JNQUwpO1xufTtcbmVzY2FwZWRTdGF0ZUhhbmRsZXJbJ0QnXSA9IGZ1bmN0aW9uIChwYXJzZXIsIHRlcm1pbmFsKSB7XG4gICAgdGVybWluYWwuaW5kZXgoKTtcbiAgICBwYXJzZXIuc2V0U3RhdGUoUGFyc2VyU3RhdGUuTk9STUFMKTtcbn07XG5lc2NhcGVkU3RhdGVIYW5kbGVyWydNJ10gPSBmdW5jdGlvbiAocGFyc2VyLCB0ZXJtaW5hbCkge1xuICAgIHRlcm1pbmFsLnJldmVyc2VJbmRleCgpO1xuICAgIHBhcnNlci5zZXRTdGF0ZShQYXJzZXJTdGF0ZS5OT1JNQUwpO1xufTtcbmVzY2FwZWRTdGF0ZUhhbmRsZXJbJyUnXSA9IGZ1bmN0aW9uIChwYXJzZXIsIHRlcm1pbmFsKSB7XG4gICAgdGVybWluYWwuc2V0Z0xldmVsKDApO1xuICAgIHRlcm1pbmFsLnNldGdDaGFyc2V0KDAsIENoYXJzZXRzXzEuREVGQVVMVF9DSEFSU0VUKTtcbiAgICBwYXJzZXIuc2V0U3RhdGUoUGFyc2VyU3RhdGUuTk9STUFMKTtcbiAgICBwYXJzZXIuc2tpcE5leHRDaGFyKCk7XG59O1xuZXNjYXBlZFN0YXRlSGFuZGxlcltFc2NhcGVTZXF1ZW5jZXNfMS5DMC5DQU5dID0gZnVuY3Rpb24gKHBhcnNlcikgeyByZXR1cm4gcGFyc2VyLnNldFN0YXRlKFBhcnNlclN0YXRlLk5PUk1BTCk7IH07XG52YXIgY3NpUGFyYW1TdGF0ZUhhbmRsZXIgPSB7fTtcbmNzaVBhcmFtU3RhdGVIYW5kbGVyWyc/J10gPSBmdW5jdGlvbiAocGFyc2VyKSB7IHJldHVybiBwYXJzZXIuc2V0UHJlZml4KCc/Jyk7IH07XG5jc2lQYXJhbVN0YXRlSGFuZGxlclsnPiddID0gZnVuY3Rpb24gKHBhcnNlcikgeyByZXR1cm4gcGFyc2VyLnNldFByZWZpeCgnPicpOyB9O1xuY3NpUGFyYW1TdGF0ZUhhbmRsZXJbJyEnXSA9IGZ1bmN0aW9uIChwYXJzZXIpIHsgcmV0dXJuIHBhcnNlci5zZXRQcmVmaXgoJyEnKTsgfTtcbmNzaVBhcmFtU3RhdGVIYW5kbGVyWycwJ10gPSBmdW5jdGlvbiAocGFyc2VyKSB7IHJldHVybiBwYXJzZXIuc2V0UGFyYW0ocGFyc2VyLmdldFBhcmFtKCkgKiAxMCk7IH07XG5jc2lQYXJhbVN0YXRlSGFuZGxlclsnMSddID0gZnVuY3Rpb24gKHBhcnNlcikgeyByZXR1cm4gcGFyc2VyLnNldFBhcmFtKHBhcnNlci5nZXRQYXJhbSgpICogMTAgKyAxKTsgfTtcbmNzaVBhcmFtU3RhdGVIYW5kbGVyWycyJ10gPSBmdW5jdGlvbiAocGFyc2VyKSB7IHJldHVybiBwYXJzZXIuc2V0UGFyYW0ocGFyc2VyLmdldFBhcmFtKCkgKiAxMCArIDIpOyB9O1xuY3NpUGFyYW1TdGF0ZUhhbmRsZXJbJzMnXSA9IGZ1bmN0aW9uIChwYXJzZXIpIHsgcmV0dXJuIHBhcnNlci5zZXRQYXJhbShwYXJzZXIuZ2V0UGFyYW0oKSAqIDEwICsgMyk7IH07XG5jc2lQYXJhbVN0YXRlSGFuZGxlclsnNCddID0gZnVuY3Rpb24gKHBhcnNlcikgeyByZXR1cm4gcGFyc2VyLnNldFBhcmFtKHBhcnNlci5nZXRQYXJhbSgpICogMTAgKyA0KTsgfTtcbmNzaVBhcmFtU3RhdGVIYW5kbGVyWyc1J10gPSBmdW5jdGlvbiAocGFyc2VyKSB7IHJldHVybiBwYXJzZXIuc2V0UGFyYW0ocGFyc2VyLmdldFBhcmFtKCkgKiAxMCArIDUpOyB9O1xuY3NpUGFyYW1TdGF0ZUhhbmRsZXJbJzYnXSA9IGZ1bmN0aW9uIChwYXJzZXIpIHsgcmV0dXJuIHBhcnNlci5zZXRQYXJhbShwYXJzZXIuZ2V0UGFyYW0oKSAqIDEwICsgNik7IH07XG5jc2lQYXJhbVN0YXRlSGFuZGxlclsnNyddID0gZnVuY3Rpb24gKHBhcnNlcikgeyByZXR1cm4gcGFyc2VyLnNldFBhcmFtKHBhcnNlci5nZXRQYXJhbSgpICogMTAgKyA3KTsgfTtcbmNzaVBhcmFtU3RhdGVIYW5kbGVyWyc4J10gPSBmdW5jdGlvbiAocGFyc2VyKSB7IHJldHVybiBwYXJzZXIuc2V0UGFyYW0ocGFyc2VyLmdldFBhcmFtKCkgKiAxMCArIDgpOyB9O1xuY3NpUGFyYW1TdGF0ZUhhbmRsZXJbJzknXSA9IGZ1bmN0aW9uIChwYXJzZXIpIHsgcmV0dXJuIHBhcnNlci5zZXRQYXJhbShwYXJzZXIuZ2V0UGFyYW0oKSAqIDEwICsgOSk7IH07XG5jc2lQYXJhbVN0YXRlSGFuZGxlclsnJCddID0gZnVuY3Rpb24gKHBhcnNlcikgeyByZXR1cm4gcGFyc2VyLnNldFBvc3RmaXgoJyQnKTsgfTtcbmNzaVBhcmFtU3RhdGVIYW5kbGVyWydcIiddID0gZnVuY3Rpb24gKHBhcnNlcikgeyByZXR1cm4gcGFyc2VyLnNldFBvc3RmaXgoJ1wiJyk7IH07XG5jc2lQYXJhbVN0YXRlSGFuZGxlclsnICddID0gZnVuY3Rpb24gKHBhcnNlcikgeyByZXR1cm4gcGFyc2VyLnNldFBvc3RmaXgoJyAnKTsgfTtcbmNzaVBhcmFtU3RhdGVIYW5kbGVyWydcXCcnXSA9IGZ1bmN0aW9uIChwYXJzZXIpIHsgcmV0dXJuIHBhcnNlci5zZXRQb3N0Zml4KCdcXCcnKTsgfTtcbmNzaVBhcmFtU3RhdGVIYW5kbGVyWyc7J10gPSBmdW5jdGlvbiAocGFyc2VyKSB7IHJldHVybiBwYXJzZXIuZmluYWxpemVQYXJhbSgpOyB9O1xuY3NpUGFyYW1TdGF0ZUhhbmRsZXJbRXNjYXBlU2VxdWVuY2VzXzEuQzAuQ0FOXSA9IGZ1bmN0aW9uIChwYXJzZXIpIHsgcmV0dXJuIHBhcnNlci5zZXRTdGF0ZShQYXJzZXJTdGF0ZS5OT1JNQUwpOyB9O1xudmFyIGNzaVN0YXRlSGFuZGxlciA9IHt9O1xuY3NpU3RhdGVIYW5kbGVyWydAJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHsgcmV0dXJuIGhhbmRsZXIuaW5zZXJ0Q2hhcnMocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlclsnQSddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7IHJldHVybiBoYW5kbGVyLmN1cnNvclVwKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ0InXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5jdXJzb3JEb3duKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ0MnXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5jdXJzb3JGb3J3YXJkKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ0QnXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5jdXJzb3JCYWNrd2FyZChwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWydFJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHsgcmV0dXJuIGhhbmRsZXIuY3Vyc29yTmV4dExpbmUocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlclsnRiddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7IHJldHVybiBoYW5kbGVyLmN1cnNvclByZWNlZGluZ0xpbmUocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlclsnRyddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7IHJldHVybiBoYW5kbGVyLmN1cnNvckNoYXJBYnNvbHV0ZShwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWydIJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHsgcmV0dXJuIGhhbmRsZXIuY3Vyc29yUG9zaXRpb24ocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlclsnSSddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7IHJldHVybiBoYW5kbGVyLmN1cnNvckZvcndhcmRUYWIocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlclsnSiddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7IHJldHVybiBoYW5kbGVyLmVyYXNlSW5EaXNwbGF5KHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ0snXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5lcmFzZUluTGluZShwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWydMJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHsgcmV0dXJuIGhhbmRsZXIuaW5zZXJ0TGluZXMocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlclsnTSddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7IHJldHVybiBoYW5kbGVyLmRlbGV0ZUxpbmVzKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ1AnXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5kZWxldGVDaGFycyhwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWydTJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHsgcmV0dXJuIGhhbmRsZXIuc2Nyb2xsVXAocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlclsnVCddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7XG4gICAgaWYgKHBhcmFtcy5sZW5ndGggPCAyICYmICFwcmVmaXgpIHtcbiAgICAgICAgaGFuZGxlci5zY3JvbGxEb3duKHBhcmFtcyk7XG4gICAgfVxufTtcbmNzaVN0YXRlSGFuZGxlclsnWCddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7IHJldHVybiBoYW5kbGVyLmVyYXNlQ2hhcnMocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlclsnWiddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7IHJldHVybiBoYW5kbGVyLmN1cnNvckJhY2t3YXJkVGFiKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ2AnXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5jaGFyUG9zQWJzb2x1dGUocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlclsnYSddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7IHJldHVybiBoYW5kbGVyLkhQb3NpdGlvblJlbGF0aXZlKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ2InXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5yZXBlYXRQcmVjZWRpbmdDaGFyYWN0ZXIocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlclsnYyddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7IHJldHVybiBoYW5kbGVyLnNlbmREZXZpY2VBdHRyaWJ1dGVzKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ2QnXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5saW5lUG9zQWJzb2x1dGUocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlclsnZSddID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4KSB7IHJldHVybiBoYW5kbGVyLlZQb3NpdGlvblJlbGF0aXZlKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ2YnXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5IVlBvc2l0aW9uKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ2cnXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci50YWJDbGVhcihwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWydoJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHsgcmV0dXJuIGhhbmRsZXIuc2V0TW9kZShwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWydsJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHsgcmV0dXJuIGhhbmRsZXIucmVzZXRNb2RlKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ20nXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkgeyByZXR1cm4gaGFuZGxlci5jaGFyQXR0cmlidXRlcyhwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWyduJ10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zLCBwcmVmaXgpIHsgcmV0dXJuIGhhbmRsZXIuZGV2aWNlU3RhdHVzKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ3AnXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCkge1xuICAgIHN3aXRjaCAocHJlZml4KSB7XG4gICAgICAgIGNhc2UgJyEnOlxuICAgICAgICAgICAgaGFuZGxlci5zb2Z0UmVzZXQocGFyYW1zKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbn07XG5jc2lTdGF0ZUhhbmRsZXJbJ3EnXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMsIHByZWZpeCwgcG9zdGZpeCkge1xuICAgIGlmIChwb3N0Zml4ID09PSAnICcpIHtcbiAgICAgICAgaGFuZGxlci5zZXRDdXJzb3JTdHlsZShwYXJhbXMpO1xuICAgIH1cbn07XG5jc2lTdGF0ZUhhbmRsZXJbJ3InXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMpIHsgcmV0dXJuIGhhbmRsZXIuc2V0U2Nyb2xsUmVnaW9uKHBhcmFtcyk7IH07XG5jc2lTdGF0ZUhhbmRsZXJbJ3MnXSA9IGZ1bmN0aW9uIChoYW5kbGVyLCBwYXJhbXMpIHsgcmV0dXJuIGhhbmRsZXIuc2F2ZUN1cnNvcihwYXJhbXMpOyB9O1xuY3NpU3RhdGVIYW5kbGVyWyd1J10gPSBmdW5jdGlvbiAoaGFuZGxlciwgcGFyYW1zKSB7IHJldHVybiBoYW5kbGVyLnJlc3RvcmVDdXJzb3IocGFyYW1zKTsgfTtcbmNzaVN0YXRlSGFuZGxlcltFc2NhcGVTZXF1ZW5jZXNfMS5DMC5DQU5dID0gZnVuY3Rpb24gKGhhbmRsZXIsIHBhcmFtcywgcHJlZml4LCBwb3N0Zml4LCBwYXJzZXIpIHsgcmV0dXJuIHBhcnNlci5zZXRTdGF0ZShQYXJzZXJTdGF0ZS5OT1JNQUwpOyB9O1xudmFyIFBhcnNlclN0YXRlO1xuKGZ1bmN0aW9uIChQYXJzZXJTdGF0ZSkge1xuICAgIFBhcnNlclN0YXRlW1BhcnNlclN0YXRlW1wiTk9STUFMXCJdID0gMF0gPSBcIk5PUk1BTFwiO1xuICAgIFBhcnNlclN0YXRlW1BhcnNlclN0YXRlW1wiRVNDQVBFRFwiXSA9IDFdID0gXCJFU0NBUEVEXCI7XG4gICAgUGFyc2VyU3RhdGVbUGFyc2VyU3RhdGVbXCJDU0lfUEFSQU1cIl0gPSAyXSA9IFwiQ1NJX1BBUkFNXCI7XG4gICAgUGFyc2VyU3RhdGVbUGFyc2VyU3RhdGVbXCJDU0lcIl0gPSAzXSA9IFwiQ1NJXCI7XG4gICAgUGFyc2VyU3RhdGVbUGFyc2VyU3RhdGVbXCJPU0NcIl0gPSA0XSA9IFwiT1NDXCI7XG4gICAgUGFyc2VyU3RhdGVbUGFyc2VyU3RhdGVbXCJDSEFSU0VUXCJdID0gNV0gPSBcIkNIQVJTRVRcIjtcbiAgICBQYXJzZXJTdGF0ZVtQYXJzZXJTdGF0ZVtcIkRDU1wiXSA9IDZdID0gXCJEQ1NcIjtcbiAgICBQYXJzZXJTdGF0ZVtQYXJzZXJTdGF0ZVtcIklHTk9SRVwiXSA9IDddID0gXCJJR05PUkVcIjtcbn0pKFBhcnNlclN0YXRlIHx8IChQYXJzZXJTdGF0ZSA9IHt9KSk7XG52YXIgUGFyc2VyID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBQYXJzZXIoX2lucHV0SGFuZGxlciwgX3Rlcm1pbmFsKSB7XG4gICAgICAgIHRoaXMuX2lucHV0SGFuZGxlciA9IF9pbnB1dEhhbmRsZXI7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsID0gX3Rlcm1pbmFsO1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IFBhcnNlclN0YXRlLk5PUk1BTDtcbiAgICB9XG4gICAgUGFyc2VyLnByb3RvdHlwZS5wYXJzZSA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHZhciBsID0gZGF0YS5sZW5ndGgsIGosIGNzLCBjaCwgY29kZSwgbG93O1xuICAgICAgICB0aGlzLl9wb3NpdGlvbiA9IDA7XG4gICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC5zdXJyb2dhdGVfaGlnaCkge1xuICAgICAgICAgICAgZGF0YSA9IHRoaXMuX3Rlcm1pbmFsLnN1cnJvZ2F0ZV9oaWdoICsgZGF0YTtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnN1cnJvZ2F0ZV9oaWdoID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7IHRoaXMuX3Bvc2l0aW9uIDwgbDsgdGhpcy5fcG9zaXRpb24rKykge1xuICAgICAgICAgICAgY2ggPSBkYXRhW3RoaXMuX3Bvc2l0aW9uXTtcbiAgICAgICAgICAgIGNvZGUgPSBkYXRhLmNoYXJDb2RlQXQodGhpcy5fcG9zaXRpb24pO1xuICAgICAgICAgICAgaWYgKDB4RDgwMCA8PSBjb2RlICYmIGNvZGUgPD0gMHhEQkZGKSB7XG4gICAgICAgICAgICAgICAgbG93ID0gZGF0YS5jaGFyQ29kZUF0KHRoaXMuX3Bvc2l0aW9uICsgMSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxvdykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc3Vycm9nYXRlX2hpZ2ggPSBjaDtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvZGUgPSAoKGNvZGUgLSAweEQ4MDApICogMHg0MDApICsgKGxvdyAtIDB4REMwMCkgKyAweDEwMDAwO1xuICAgICAgICAgICAgICAgIGNoICs9IGRhdGEuY2hhckF0KHRoaXMuX3Bvc2l0aW9uICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoMHhEQzAwIDw9IGNvZGUgJiYgY29kZSA8PSAweERGRkYpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX3N0YXRlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBQYXJzZXJTdGF0ZS5OT1JNQUw6XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaCBpbiBub3JtYWxTdGF0ZUhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbFN0YXRlSGFuZGxlcltjaF0odGhpcywgdGhpcy5faW5wdXRIYW5kbGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0SGFuZGxlci5hZGRDaGFyKGNoLCBjb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFBhcnNlclN0YXRlLkVTQ0FQRUQ6XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaCBpbiBlc2NhcGVkU3RhdGVIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVkU3RhdGVIYW5kbGVyW2NoXSh0aGlzLCB0aGlzLl90ZXJtaW5hbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcoJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJyknOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnKic6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJy0nOlxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcoJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmdjaGFyc2V0ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcpJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmdjaGFyc2V0ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcqJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmdjaGFyc2V0ID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmdjaGFyc2V0ID0gMztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICctJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmdjaGFyc2V0ID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcuJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmdjaGFyc2V0ID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IFBhcnNlclN0YXRlLkNIQVJTRVQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcvJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5nY2hhcnNldCA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSBQYXJzZXJTdGF0ZS5DSEFSU0VUO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uLS07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdOJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ08nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2V0Z0xldmVsKDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2V0Z0xldmVsKDMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnfCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2V0Z0xldmVsKDMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnfSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2V0Z0xldmVsKDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnfic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuc2V0Z0xldmVsKDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnNyc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5wdXRIYW5kbGVyLnNhdmVDdXJzb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IFBhcnNlclN0YXRlLk5PUk1BTDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzgnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0SGFuZGxlci5yZXN0b3JlQ3Vyc29yKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSBQYXJzZXJTdGF0ZS5OT1JNQUw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcjJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IFBhcnNlclN0YXRlLk5PUk1BTDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3NpdGlvbisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnSCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwudGFiU2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSBQYXJzZXJTdGF0ZS5OT1JNQUw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc9JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5sb2coJ1NlcmlhbCBwb3J0IHJlcXVlc3RlZCBhcHBsaWNhdGlvbiBrZXlwYWQuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuYXBwbGljYXRpb25LZXlwYWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnZpZXdwb3J0LnN5bmNTY3JvbGxBcmVhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSBQYXJzZXJTdGF0ZS5OT1JNQUw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5sb2coJ1N3aXRjaGluZyBiYWNrIHRvIG5vcm1hbCBrZXlwYWQuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuYXBwbGljYXRpb25LZXlwYWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC52aWV3cG9ydC5zeW5jU2Nyb2xsQXJlYSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gUGFyc2VyU3RhdGUuTk9STUFMO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IFBhcnNlclN0YXRlLk5PUk1BTDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5lcnJvcignVW5rbm93biBFU0MgY29udHJvbDogJXMuJywgY2gpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgUGFyc2VyU3RhdGUuQ0hBUlNFVDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoIGluIENoYXJzZXRzXzEuQ0hBUlNFVFMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzID0gQ2hhcnNldHNfMS5DSEFSU0VUU1tjaF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICcvJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2tpcE5leHRDaGFyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjcyA9IENoYXJzZXRzXzEuREVGQVVMVF9DSEFSU0VUO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnNldGdDaGFyc2V0KHRoaXMuX3Rlcm1pbmFsLmdjaGFyc2V0LCBjcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmdjaGFyc2V0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSBQYXJzZXJTdGF0ZS5OT1JNQUw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgUGFyc2VyU3RhdGUuT1NDOlxuICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyB8fCBjaCA9PT0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuQkVMKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3NpdGlvbisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwucGFyYW1zLnB1c2godGhpcy5fdGVybWluYWwuY3VycmVudFBhcmFtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fdGVybWluYWwucGFyYW1zWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl90ZXJtaW5hbC5wYXJhbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnRpdGxlID0gdGhpcy5fdGVybWluYWwucGFyYW1zWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuaGFuZGxlVGl0bGUodGhpcy5fdGVybWluYWwudGl0bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0NjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1MDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1MTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA1MjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTE6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTY6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMTg6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwucGFyYW1zID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5jdXJyZW50UGFyYW0gPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSBQYXJzZXJTdGF0ZS5OT1JNQUw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3Rlcm1pbmFsLnBhcmFtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5jdXJyZW50UGFyYW0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuY3VycmVudFBhcmFtICogMTAgKyBjaC5jaGFyQ29kZUF0KDApIC0gNDg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoID09PSAnOycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwucGFyYW1zLnB1c2godGhpcy5fdGVybWluYWwuY3VycmVudFBhcmFtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuY3VycmVudFBhcmFtID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuY3VycmVudFBhcmFtICs9IGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgUGFyc2VyU3RhdGUuQ1NJX1BBUkFNOlxuICAgICAgICAgICAgICAgICAgICBpZiAoY2ggaW4gY3NpUGFyYW1TdGF0ZUhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNzaVBhcmFtU3RhdGVIYW5kbGVyW2NoXSh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluYWxpemVQYXJhbSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IFBhcnNlclN0YXRlLkNTSTtcbiAgICAgICAgICAgICAgICBjYXNlIFBhcnNlclN0YXRlLkNTSTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoIGluIGNzaVN0YXRlSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3NpU3RhdGVIYW5kbGVyW2NoXSh0aGlzLl9pbnB1dEhhbmRsZXIsIHRoaXMuX3Rlcm1pbmFsLnBhcmFtcywgdGhpcy5fdGVybWluYWwucHJlZml4LCB0aGlzLl90ZXJtaW5hbC5wb3N0Zml4LCB0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmVycm9yKCdVbmtub3duIENTSSBjb2RlOiAlcy4nLCBjaCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSBQYXJzZXJTdGF0ZS5OT1JNQUw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnByZWZpeCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5wb3N0Zml4ID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgUGFyc2VyU3RhdGUuRENTOlxuICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyB8fCBjaCA9PT0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuQkVMKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb3NpdGlvbisrO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLl90ZXJtaW5hbC5wcmVmaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICckcSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwdCA9IHRoaXMuX3Rlcm1pbmFsLmN1cnJlbnRQYXJhbSwgdmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXCJxJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdCA9ICcwXCJxJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1wicCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQgPSAnNjFcInAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQgPSAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICh0aGlzLl90ZXJtaW5hbC5zY3JvbGxUb3AgKyAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICc7J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICh0aGlzLl90ZXJtaW5hbC5zY3JvbGxCb3R0b20gKyAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICdyJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ID0gJzBtJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuZXJyb3IoJ1Vua25vd24gRENTIFB0OiAlcy4nLCBwdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHQgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zZW5kKEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdQJyArICt2YWxpZCArICckcicgKyBwdCArIEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdcXFxcJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJytwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnK3EnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdCA9IHRoaXMuX3Rlcm1pbmFsLmN1cnJlbnRQYXJhbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCB2YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5zZW5kKEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdQJyArICt2YWxpZCArICcrcicgKyBwdCArIEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdcXFxcJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmVycm9yKCdVbmtub3duIERDUyBwcmVmaXg6ICVzLicsIHRoaXMuX3Rlcm1pbmFsLnByZWZpeCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuY3VycmVudFBhcmFtID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLnByZWZpeCA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSBQYXJzZXJTdGF0ZS5OT1JNQUw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3Rlcm1pbmFsLmN1cnJlbnRQYXJhbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl90ZXJtaW5hbC5wcmVmaXggJiYgY2ggIT09ICckJyAmJiBjaCAhPT0gJysnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuY3VycmVudFBhcmFtID0gY2g7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLl90ZXJtaW5hbC5wcmVmaXgubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuY3VycmVudFBhcmFtID0gY2g7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5wcmVmaXggKz0gY2g7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5jdXJyZW50UGFyYW0gKz0gY2g7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBQYXJzZXJTdGF0ZS5JR05PUkU6XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDIHx8IGNoID09PSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5CRUwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IFBhcnNlclN0YXRlLk5PUk1BTDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgUGFyc2VyLnByb3RvdHlwZS5zZXRTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlO1xuICAgIH07XG4gICAgUGFyc2VyLnByb3RvdHlwZS5zZXRQcmVmaXggPSBmdW5jdGlvbiAocHJlZml4KSB7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnByZWZpeCA9IHByZWZpeDtcbiAgICB9O1xuICAgIFBhcnNlci5wcm90b3R5cGUuc2V0UG9zdGZpeCA9IGZ1bmN0aW9uIChwb3N0Zml4KSB7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnBvc3RmaXggPSBwb3N0Zml4O1xuICAgIH07XG4gICAgUGFyc2VyLnByb3RvdHlwZS5zZXRQYXJhbSA9IGZ1bmN0aW9uIChwYXJhbSkge1xuICAgICAgICB0aGlzLl90ZXJtaW5hbC5jdXJyZW50UGFyYW0gPSBwYXJhbTtcbiAgICB9O1xuICAgIFBhcnNlci5wcm90b3R5cGUuZ2V0UGFyYW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl90ZXJtaW5hbC5jdXJyZW50UGFyYW07XG4gICAgfTtcbiAgICBQYXJzZXIucHJvdG90eXBlLmZpbmFsaXplUGFyYW0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLnBhcmFtcy5wdXNoKHRoaXMuX3Rlcm1pbmFsLmN1cnJlbnRQYXJhbSk7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsLmN1cnJlbnRQYXJhbSA9IDA7XG4gICAgfTtcbiAgICBQYXJzZXIucHJvdG90eXBlLnNraXBOZXh0Q2hhciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdGhpcy5fcG9zaXRpb24rKztcbiAgICB9O1xuICAgIHJldHVybiBQYXJzZXI7XG59KCkpO1xuZXhwb3J0cy5QYXJzZXIgPSBQYXJzZXI7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVBhcnNlci5qcy5tYXBcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIE1BWF9SRUZSRVNIX0ZSQU1FX1NLSVAgPSA1O1xudmFyIEZMQUdTO1xuKGZ1bmN0aW9uIChGTEFHUykge1xuICAgIEZMQUdTW0ZMQUdTW1wiQk9MRFwiXSA9IDFdID0gXCJCT0xEXCI7XG4gICAgRkxBR1NbRkxBR1NbXCJVTkRFUkxJTkVcIl0gPSAyXSA9IFwiVU5ERVJMSU5FXCI7XG4gICAgRkxBR1NbRkxBR1NbXCJCTElOS1wiXSA9IDRdID0gXCJCTElOS1wiO1xuICAgIEZMQUdTW0ZMQUdTW1wiSU5WRVJTRVwiXSA9IDhdID0gXCJJTlZFUlNFXCI7XG4gICAgRkxBR1NbRkxBR1NbXCJJTlZJU0lCTEVcIl0gPSAxNl0gPSBcIklOVklTSUJMRVwiO1xufSkoRkxBR1MgfHwgKEZMQUdTID0ge30pKTtcbjtcbnZhciBicm9rZW5Cb2xkID0gbnVsbDtcbnZhciBSZW5kZXJlciA9IChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmVuZGVyZXIoX3Rlcm1pbmFsKSB7XG4gICAgICAgIHRoaXMuX3Rlcm1pbmFsID0gX3Rlcm1pbmFsO1xuICAgICAgICB0aGlzLl9yZWZyZXNoUm93c1F1ZXVlID0gW107XG4gICAgICAgIHRoaXMuX3JlZnJlc2hGcmFtZXNTa2lwcGVkID0gMDtcbiAgICAgICAgdGhpcy5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lID0gbnVsbDtcbiAgICAgICAgaWYgKGJyb2tlbkJvbGQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGJyb2tlbkJvbGQgPSBjaGVja0JvbGRCcm9rZW4odGhpcy5fdGVybWluYWwuZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgUmVuZGVyZXIucHJvdG90eXBlLnF1ZXVlUmVmcmVzaCA9IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgICAgIHRoaXMuX3JlZnJlc2hSb3dzUXVldWUucHVzaCh7IHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQgfSk7XG4gICAgICAgIGlmICghdGhpcy5fcmVmcmVzaEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICAgICAgICB0aGlzLl9yZWZyZXNoQW5pbWF0aW9uRnJhbWUgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZnJlc2hMb29wLmJpbmQodGhpcykpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBSZW5kZXJlci5wcm90b3R5cGUuX3JlZnJlc2hMb29wID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgc2tpcEZyYW1lID0gdGhpcy5fdGVybWluYWwud3JpdGVCdWZmZXIubGVuZ3RoID4gMCAmJiB0aGlzLl9yZWZyZXNoRnJhbWVzU2tpcHBlZCsrIDw9IE1BWF9SRUZSRVNIX0ZSQU1FX1NLSVA7XG4gICAgICAgIGlmIChza2lwRnJhbWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZnJlc2hBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fcmVmcmVzaExvb3AuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcmVmcmVzaEZyYW1lc1NraXBwZWQgPSAwO1xuICAgICAgICB2YXIgc3RhcnQ7XG4gICAgICAgIHZhciBlbmQ7XG4gICAgICAgIGlmICh0aGlzLl9yZWZyZXNoUm93c1F1ZXVlLmxlbmd0aCA+IDQpIHtcbiAgICAgICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgICAgIGVuZCA9IHRoaXMuX3Rlcm1pbmFsLnJvd3MgLSAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3RhcnQgPSB0aGlzLl9yZWZyZXNoUm93c1F1ZXVlWzBdLnN0YXJ0O1xuICAgICAgICAgICAgZW5kID0gdGhpcy5fcmVmcmVzaFJvd3NRdWV1ZVswXS5lbmQ7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHRoaXMuX3JlZnJlc2hSb3dzUXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcmVmcmVzaFJvd3NRdWV1ZVtpXS5zdGFydCA8IHN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5fcmVmcmVzaFJvd3NRdWV1ZVtpXS5zdGFydDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3JlZnJlc2hSb3dzUXVldWVbaV0uZW5kID4gZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGVuZCA9IHRoaXMuX3JlZnJlc2hSb3dzUXVldWVbaV0uZW5kO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9yZWZyZXNoUm93c1F1ZXVlID0gW107XG4gICAgICAgIHRoaXMuX3JlZnJlc2hBbmltYXRpb25GcmFtZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlZnJlc2goc3RhcnQsIGVuZCk7XG4gICAgfTtcbiAgICBSZW5kZXJlci5wcm90b3R5cGUuX3JlZnJlc2ggPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICAgICAgICB2YXIgeCwgeSwgaSwgbGluZSwgb3V0LCBjaCwgY2hfd2lkdGgsIHdpZHRoLCBkYXRhLCBhdHRyLCBiZywgZmcsIGZsYWdzLCByb3csIHBhcmVudCwgZm9jdXNlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgIGlmIChlbmQgLSBzdGFydCA+PSB0aGlzLl90ZXJtaW5hbC5yb3dzIC8gMikge1xuICAgICAgICAgICAgcGFyZW50ID0gdGhpcy5fdGVybWluYWwuZWxlbWVudC5wYXJlbnROb2RlO1xuICAgICAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5fdGVybWluYWwucm93Q29udGFpbmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB3aWR0aCA9IHRoaXMuX3Rlcm1pbmFsLmNvbHM7XG4gICAgICAgIHkgPSBzdGFydDtcbiAgICAgICAgaWYgKGVuZCA+PSB0aGlzLl90ZXJtaW5hbC5yb3dzKSB7XG4gICAgICAgICAgICB0aGlzLl90ZXJtaW5hbC5sb2coJ2BlbmRgIGlzIHRvbyBsYXJnZS4gTW9zdCBsaWtlbHkgYSBiYWQgQ1NSLicpO1xuICAgICAgICAgICAgZW5kID0gdGhpcy5fdGVybWluYWwucm93cyAtIDE7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICg7IHkgPD0gZW5kOyB5KyspIHtcbiAgICAgICAgICAgIHJvdyA9IHkgKyB0aGlzLl90ZXJtaW5hbC55ZGlzcDtcbiAgICAgICAgICAgIGxpbmUgPSB0aGlzLl90ZXJtaW5hbC5saW5lcy5nZXQocm93KTtcbiAgICAgICAgICAgIGlmICghbGluZSB8fCAhdGhpcy5fdGVybWluYWwuY2hpbGRyZW5beV0pIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCA9ICcnO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Rlcm1pbmFsLnkgPT09IHkgLSAodGhpcy5fdGVybWluYWwueWJhc2UgLSB0aGlzLl90ZXJtaW5hbC55ZGlzcClcbiAgICAgICAgICAgICAgICAmJiB0aGlzLl90ZXJtaW5hbC5jdXJzb3JTdGF0ZVxuICAgICAgICAgICAgICAgICYmICF0aGlzLl90ZXJtaW5hbC5jdXJzb3JIaWRkZW4pIHtcbiAgICAgICAgICAgICAgICB4ID0gdGhpcy5fdGVybWluYWwueDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHggPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF0dHIgPSB0aGlzLl90ZXJtaW5hbC5kZWZBdHRyO1xuICAgICAgICAgICAgaSA9IDA7XG4gICAgICAgICAgICBmb3IgKDsgaSA8IHdpZHRoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWxpbmVbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGEgPSBsaW5lW2ldWzBdO1xuICAgICAgICAgICAgICAgIGNoID0gbGluZVtpXVsxXTtcbiAgICAgICAgICAgICAgICBjaF93aWR0aCA9IGxpbmVbaV1bMl07XG4gICAgICAgICAgICAgICAgaWYgKCFjaF93aWR0aClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09IHgpXG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAtMTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPT0gYXR0cikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ciAhPT0gdGhpcy5fdGVybWluYWwuZGVmQXR0cikge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICc8L3NwYW4+JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPT0gdGhpcy5fdGVybWluYWwuZGVmQXR0cikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICc8c3BhbiBjbGFzcz1cInJldmVyc2UtdmlkZW8gdGVybWluYWwtY3Vyc29yXCI+JztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbGFzc05hbWVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmcgPSBkYXRhICYgMHgxZmY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmcgPSAoZGF0YSA+PiA5KSAmIDB4MWZmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gZGF0YSA+PiAxODtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGTEFHUy5CT0xEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYnJva2VuQm9sZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCd4dGVybS1ib2xkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZnIDwgOClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZnICs9IDg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIEZMQUdTLlVOREVSTElORSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWVzLnB1c2goJ3h0ZXJtLXVuZGVybGluZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBGTEFHUy5CTElOSykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWVzLnB1c2goJ3h0ZXJtLWJsaW5rJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIEZMQUdTLklOVkVSU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmcgPSBbZmcsIGZnID0gYmddWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgMSkgJiYgZmcgPCA4KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmcgKz0gODtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgRkxBR1MuSU5WSVNJQkxFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZXMucHVzaCgneHRlcm0taGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIEZMQUdTLklOVkVSU0UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJnID09PSAyNTcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnID0gMTU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZnID09PSAyNTYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZnID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmcgPCAyNTYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCd4dGVybS1iZy1jb2xvci0nICsgYmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmcgPCAyNTYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCd4dGVybS1jb2xvci0nICsgZmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJzxzcGFuJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NOYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcgY2xhc3M9XCInICsgY2xhc3NOYW1lcy5qb2luKCcgJykgKyAnXCInO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJz4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjaF93aWR0aCA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJzxzcGFuIGNsYXNzPVwieHRlcm0td2lkZS1jaGFyXCI+JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3dpdGNoIChjaCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICcmJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnJmFtcDsnO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJzwnOlxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9ICcmbHQ7JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlICc+JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSAnJmd0Oyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA8PSAnICcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gJyZuYnNwOyc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQgKz0gY2g7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGNoX3dpZHRoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dCArPSAnPC9zcGFuPic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGF0dHIgPSBkYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGF0dHIgIT09IHRoaXMuX3Rlcm1pbmFsLmRlZkF0dHIpIHtcbiAgICAgICAgICAgICAgICBvdXQgKz0gJzwvc3Bhbj4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fdGVybWluYWwuY2hpbGRyZW5beV0uaW5uZXJIVE1MID0gb3V0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlcm1pbmFsLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5fdGVybWluYWwucm93Q29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90ZXJtaW5hbC5lbWl0KCdyZWZyZXNoJywgeyBlbGVtZW50OiB0aGlzLl90ZXJtaW5hbC5lbGVtZW50LCBzdGFydDogc3RhcnQsIGVuZDogZW5kIH0pO1xuICAgIH07XG4gICAgO1xuICAgIHJldHVybiBSZW5kZXJlcjtcbn0oKSk7XG5leHBvcnRzLlJlbmRlcmVyID0gUmVuZGVyZXI7XG5mdW5jdGlvbiBjaGVja0JvbGRCcm9rZW4odGVybWluYWwpIHtcbiAgICB2YXIgZG9jdW1lbnQgPSB0ZXJtaW5hbC5vd25lckRvY3VtZW50O1xuICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICBlbC5pbm5lckhUTUwgPSAnaGVsbG8gd29ybGQnO1xuICAgIHRlcm1pbmFsLmFwcGVuZENoaWxkKGVsKTtcbiAgICB2YXIgdzEgPSBlbC5vZmZzZXRXaWR0aDtcbiAgICB2YXIgaDEgPSBlbC5vZmZzZXRIZWlnaHQ7XG4gICAgZWwuc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcbiAgICB2YXIgdzIgPSBlbC5vZmZzZXRXaWR0aDtcbiAgICB2YXIgaDIgPSBlbC5vZmZzZXRIZWlnaHQ7XG4gICAgdGVybWluYWwucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIHJldHVybiB3MSAhPT0gdzIgfHwgaDEgIT09IGgyO1xufVxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1SZW5kZXJlci5qcy5tYXBcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIFZpZXdwb3J0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBWaWV3cG9ydCh0ZXJtaW5hbCwgdmlld3BvcnRFbGVtZW50LCBzY3JvbGxBcmVhLCBjaGFyTWVhc3VyZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLnRlcm1pbmFsID0gdGVybWluYWw7XG4gICAgICAgIHRoaXMudmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtZW50O1xuICAgICAgICB0aGlzLnNjcm9sbEFyZWEgPSBzY3JvbGxBcmVhO1xuICAgICAgICB0aGlzLmNoYXJNZWFzdXJlID0gY2hhck1lYXN1cmU7XG4gICAgICAgIHRoaXMuY3VycmVudFJvd0hlaWdodCA9IDA7XG4gICAgICAgIHRoaXMubGFzdFJlY29yZGVkQnVmZmVyTGVuZ3RoID0gMDtcbiAgICAgICAgdGhpcy5sYXN0UmVjb3JkZWRWaWV3cG9ydEhlaWdodCA9IDA7XG4gICAgICAgIHRoaXMudGVybWluYWwub24oJ3Njcm9sbCcsIHRoaXMuc3luY1Njcm9sbEFyZWEuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMudGVybWluYWwub24oJ3Jlc2l6ZScsIHRoaXMuc3luY1Njcm9sbEFyZWEuYmluZCh0aGlzKSk7XG4gICAgICAgIHRoaXMudmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMub25TY3JvbGwuYmluZCh0aGlzKSk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuc3luY1Njcm9sbEFyZWEoKTsgfSwgMCk7XG4gICAgfVxuICAgIFZpZXdwb3J0LnByb3RvdHlwZS5yZWZyZXNoID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5jaGFyTWVhc3VyZS5oZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICB2YXIgcm93SGVpZ2h0Q2hhbmdlZCA9IHRoaXMuY2hhck1lYXN1cmUuaGVpZ2h0ICE9PSB0aGlzLmN1cnJlbnRSb3dIZWlnaHQ7XG4gICAgICAgICAgICBpZiAocm93SGVpZ2h0Q2hhbmdlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFJvd0hlaWdodCA9IHRoaXMuY2hhck1lYXN1cmUuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnRFbGVtZW50LnN0eWxlLmxpbmVIZWlnaHQgPSB0aGlzLmNoYXJNZWFzdXJlLmhlaWdodCArICdweCc7XG4gICAgICAgICAgICAgICAgdGhpcy50ZXJtaW5hbC5yb3dDb250YWluZXIuc3R5bGUubGluZUhlaWdodCA9IHRoaXMuY2hhck1lYXN1cmUuaGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB2aWV3cG9ydEhlaWdodENoYW5nZWQgPSB0aGlzLmxhc3RSZWNvcmRlZFZpZXdwb3J0SGVpZ2h0ICE9PSB0aGlzLnRlcm1pbmFsLnJvd3M7XG4gICAgICAgICAgICBpZiAocm93SGVpZ2h0Q2hhbmdlZCB8fCB2aWV3cG9ydEhlaWdodENoYW5nZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RSZWNvcmRlZFZpZXdwb3J0SGVpZ2h0ID0gdGhpcy50ZXJtaW5hbC5yb3dzO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnRFbGVtZW50LnN0eWxlLmhlaWdodCA9IHRoaXMuY2hhck1lYXN1cmUuaGVpZ2h0ICogdGhpcy50ZXJtaW5hbC5yb3dzICsgJ3B4JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQXJlYS5zdHlsZS5oZWlnaHQgPSAodGhpcy5jaGFyTWVhc3VyZS5oZWlnaHQgKiB0aGlzLmxhc3RSZWNvcmRlZEJ1ZmZlckxlbmd0aCkgKyAncHgnO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBWaWV3cG9ydC5wcm90b3R5cGUuc3luY1Njcm9sbEFyZWEgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RSZWNvcmRlZEJ1ZmZlckxlbmd0aCAhPT0gdGhpcy50ZXJtaW5hbC5saW5lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdFJlY29yZGVkQnVmZmVyTGVuZ3RoID0gdGhpcy50ZXJtaW5hbC5saW5lcy5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmxhc3RSZWNvcmRlZFZpZXdwb3J0SGVpZ2h0ICE9PSB0aGlzLnRlcm1pbmFsLnJvd3MpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2hhck1lYXN1cmUuaGVpZ2h0ICE9PSB0aGlzLmN1cnJlbnRSb3dIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy50ZXJtaW5hbC55ZGlzcCAqIHRoaXMuY3VycmVudFJvd0hlaWdodDtcbiAgICAgICAgaWYgKHRoaXMudmlld3BvcnRFbGVtZW50LnNjcm9sbFRvcCAhPT0gc2Nyb2xsVG9wKSB7XG4gICAgICAgICAgICB0aGlzLnZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFZpZXdwb3J0LnByb3RvdHlwZS5vblNjcm9sbCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICB2YXIgbmV3Um93ID0gTWF0aC5yb3VuZCh0aGlzLnZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3AgLyB0aGlzLmN1cnJlbnRSb3dIZWlnaHQpO1xuICAgICAgICB2YXIgZGlmZiA9IG5ld1JvdyAtIHRoaXMudGVybWluYWwueWRpc3A7XG4gICAgICAgIHRoaXMudGVybWluYWwuc2Nyb2xsRGlzcChkaWZmLCB0cnVlKTtcbiAgICB9O1xuICAgIFZpZXdwb3J0LnByb3RvdHlwZS5vbldoZWVsID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIGlmIChldi5kZWx0YVkgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbXVsdGlwbGllciA9IDE7XG4gICAgICAgIGlmIChldi5kZWx0YU1vZGUgPT09IFdoZWVsRXZlbnQuRE9NX0RFTFRBX0xJTkUpIHtcbiAgICAgICAgICAgIG11bHRpcGxpZXIgPSB0aGlzLmN1cnJlbnRSb3dIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZXYuZGVsdGFNb2RlID09PSBXaGVlbEV2ZW50LkRPTV9ERUxUQV9QQUdFKSB7XG4gICAgICAgICAgICBtdWx0aXBsaWVyID0gdGhpcy5jdXJyZW50Um93SGVpZ2h0ICogdGhpcy50ZXJtaW5hbC5yb3dzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmlld3BvcnRFbGVtZW50LnNjcm9sbFRvcCArPSBldi5kZWx0YVkgKiBtdWx0aXBsaWVyO1xuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG4gICAgO1xuICAgIHJldHVybiBWaWV3cG9ydDtcbn0oKSk7XG5leHBvcnRzLlZpZXdwb3J0ID0gVmlld3BvcnQ7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVZpZXdwb3J0LmpzLm1hcFxuIiwiLyoqXG4gKiBGaXQgdGVybWluYWwgY29sdW1ucyBhbmQgcm93cyB0byB0aGUgZGltZW5zaW9ucyBvZiBpdHMgRE9NIGVsZW1lbnQuXG4gKlxuICogIyMgQXBwcm9hY2hcbiAqIC0gUm93czogVHJ1bmNhdGUgdGhlIGRpdmlzaW9uIG9mIHRoZSB0ZXJtaW5hbCBwYXJlbnQgZWxlbWVudCBoZWlnaHQgYnkgdGhlIHRlcm1pbmFsIHJvdyBoZWlnaHQuXG4gKlxuICogLSBDb2x1bW5zOiBUcnVuY2F0ZSB0aGUgZGl2aXNpb24gb2YgdGhlIHRlcm1pbmFsIHBhcmVudCBlbGVtZW50IHdpZHRoIGJ5IHRoZSB0ZXJtaW5hbCBjaGFyYWN0ZXJcbiAqIHdpZHRoIChhcHBseSBkaXNwbGF5OiBpbmxpbmUgYXQgdGhlIHRlcm1pbmFsIHJvdyBhbmQgdHJ1bmNhdGUgaXRzIHdpZHRoIHdpdGggdGhlIGN1cnJlbnRcbiAqIG51bWJlciBvZiBjb2x1bW5zKS5cbiAqIEBtb2R1bGUgeHRlcm0vYWRkb25zL2ZpdC9maXRcbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbihmdW5jdGlvbiAoZml0KSB7XG4gIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpIHtcbiAgICAvKlxuICAgICAqIENvbW1vbkpTIGVudmlyb25tZW50XG4gICAgICovXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmaXQocmVxdWlyZSgnLi4vLi4veHRlcm0nKSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgLypcbiAgICAgKiBSZXF1aXJlLmpzIGlzIGF2YWlsYWJsZVxuICAgICAqL1xuICAgIGRlZmluZShbJy4uLy4uL3h0ZXJtJ10sIGZpdCk7XG4gIH0gZWxzZSB7XG4gICAgLypcbiAgICAgKiBQbGFpbiBicm93c2VyIGVudmlyb25tZW50XG4gICAgICovXG4gICAgZml0KHdpbmRvdy5UZXJtaW5hbCk7XG4gIH1cbn0pKGZ1bmN0aW9uIChYdGVybSkge1xuICB2YXIgZXhwb3J0cyA9IHt9O1xuXG4gIGV4cG9ydHMucHJvcG9zZUdlb21ldHJ5ID0gZnVuY3Rpb24gKHRlcm0pIHtcbiAgICBpZiAoIXRlcm0uZWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdmFyIHBhcmVudEVsZW1lbnRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRlcm0uZWxlbWVudC5wYXJlbnRFbGVtZW50KSxcbiAgICAgICAgcGFyZW50RWxlbWVudEhlaWdodCA9IHBhcnNlSW50KHBhcmVudEVsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdoZWlnaHQnKSksXG4gICAgICAgIHBhcmVudEVsZW1lbnRXaWR0aCA9IE1hdGgubWF4KDAsIHBhcnNlSW50KHBhcmVudEVsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCd3aWR0aCcpKSAtIDE3KSxcbiAgICAgICAgZWxlbWVudFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGVybS5lbGVtZW50KSxcbiAgICAgICAgZWxlbWVudFBhZGRpbmdWZXIgPSBwYXJzZUludChlbGVtZW50U3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy10b3AnKSkgKyBwYXJzZUludChlbGVtZW50U3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy1ib3R0b20nKSksXG4gICAgICAgIGVsZW1lbnRQYWRkaW5nSG9yID0gcGFyc2VJbnQoZWxlbWVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctcmlnaHQnKSkgKyBwYXJzZUludChlbGVtZW50U3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy1sZWZ0JykpLFxuICAgICAgICBhdmFpbGFibGVIZWlnaHQgPSBwYXJlbnRFbGVtZW50SGVpZ2h0IC0gZWxlbWVudFBhZGRpbmdWZXIsXG4gICAgICAgIGF2YWlsYWJsZVdpZHRoID0gcGFyZW50RWxlbWVudFdpZHRoIC0gZWxlbWVudFBhZGRpbmdIb3IsXG4gICAgICAgIGNvbnRhaW5lciA9IHRlcm0ucm93Q29udGFpbmVyLFxuICAgICAgICBzdWJqZWN0Um93ID0gdGVybS5yb3dDb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQsXG4gICAgICAgIGNvbnRlbnRCdWZmZXIgPSBzdWJqZWN0Um93LmlubmVySFRNTCxcbiAgICAgICAgY2hhcmFjdGVySGVpZ2h0LFxuICAgICAgICByb3dzLFxuICAgICAgICBjaGFyYWN0ZXJXaWR0aCxcbiAgICAgICAgY29scyxcbiAgICAgICAgZ2VvbWV0cnk7XG5cbiAgICBzdWJqZWN0Um93LnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJztcbiAgICBzdWJqZWN0Um93LmlubmVySFRNTCA9ICdXJzsgLy8gQ29tbW9uIGNoYXJhY3RlciBmb3IgbWVhc3VyaW5nIHdpZHRoLCBhbHRob3VnaCBvbiBtb25vc3BhY2VcbiAgICBjaGFyYWN0ZXJXaWR0aCA9IHN1YmplY3RSb3cuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgc3ViamVjdFJvdy5zdHlsZS5kaXNwbGF5ID0gJyc7IC8vIFJldmVydCBzdHlsZSBiZWZvcmUgY2FsY3VsYXRpbmcgaGVpZ2h0LCBzaW5jZSB0aGV5IGRpZmZlci5cbiAgICBjaGFyYWN0ZXJIZWlnaHQgPSBzdWJqZWN0Um93LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICBzdWJqZWN0Um93LmlubmVySFRNTCA9IGNvbnRlbnRCdWZmZXI7XG5cbiAgICByb3dzID0gcGFyc2VJbnQoYXZhaWxhYmxlSGVpZ2h0IC8gY2hhcmFjdGVySGVpZ2h0KTtcbiAgICBjb2xzID0gcGFyc2VJbnQoYXZhaWxhYmxlV2lkdGggLyBjaGFyYWN0ZXJXaWR0aCk7XG5cbiAgICBnZW9tZXRyeSA9IHtjb2xzOiBjb2xzLCByb3dzOiByb3dzfTtcbiAgICByZXR1cm4gZ2VvbWV0cnk7XG4gIH07XG5cbiAgZXhwb3J0cy5maXQgPSBmdW5jdGlvbiAodGVybSkge1xuICAgIHZhciBnZW9tZXRyeSA9IGV4cG9ydHMucHJvcG9zZUdlb21ldHJ5KHRlcm0pO1xuXG4gICAgaWYgKGdlb21ldHJ5KSB7XG4gICAgICB0ZXJtLnJlc2l6ZShnZW9tZXRyeS5jb2xzLCBnZW9tZXRyeS5yb3dzKTtcbiAgICB9XG4gIH07XG5cbiAgWHRlcm0ucHJvdG90eXBlLnByb3Bvc2VHZW9tZXRyeSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5wcm9wb3NlR2VvbWV0cnkodGhpcyk7XG4gIH07XG5cbiAgWHRlcm0ucHJvdG90eXBlLmZpdCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5maXQodGhpcyk7XG4gIH07XG5cbiAgcmV0dXJuIGV4cG9ydHM7XG59KTtcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZnVuY3Rpb24gcHJlcGFyZVRleHRGb3JDbGlwYm9hcmQodGV4dCkge1xuICAgIHZhciBzcGFjZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMzIpLCBub25CcmVha2luZ1NwYWNlID0gU3RyaW5nLmZyb21DaGFyQ29kZSgxNjApLCBhbGxOb25CcmVha2luZ1NwYWNlcyA9IG5ldyBSZWdFeHAobm9uQnJlYWtpbmdTcGFjZSwgJ2cnKSwgcHJvY2Vzc2VkVGV4dCA9IHRleHQuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbiAobGluZSkge1xuICAgICAgICB2YXIgcHJvY2Vzc2VkTGluZSA9IGxpbmUucmVwbGFjZSgvXFxzKyQvZywgJycpLnJlcGxhY2UoYWxsTm9uQnJlYWtpbmdTcGFjZXMsIHNwYWNlKTtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZExpbmU7XG4gICAgfSkuam9pbignXFxuJyk7XG4gICAgcmV0dXJuIHByb2Nlc3NlZFRleHQ7XG59XG5leHBvcnRzLnByZXBhcmVUZXh0Rm9yQ2xpcGJvYXJkID0gcHJlcGFyZVRleHRGb3JDbGlwYm9hcmQ7XG5mdW5jdGlvbiBjb3B5SGFuZGxlcihldiwgdGVybSkge1xuICAgIHZhciBjb3BpZWRUZXh0ID0gd2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCksIHRleHQgPSBwcmVwYXJlVGV4dEZvckNsaXBib2FyZChjb3BpZWRUZXh0KTtcbiAgICBpZiAodGVybS5icm93c2VyLmlzTVNJRSkge1xuICAgICAgICB3aW5kb3cuY2xpcGJvYXJkRGF0YS5zZXREYXRhKCdUZXh0JywgdGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBldi5jbGlwYm9hcmREYXRhLnNldERhdGEoJ3RleHQvcGxhaW4nLCB0ZXh0KTtcbiAgICB9XG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcbn1cbmV4cG9ydHMuY29weUhhbmRsZXIgPSBjb3B5SGFuZGxlcjtcbmZ1bmN0aW9uIHBhc3RlSGFuZGxlcihldiwgdGVybSkge1xuICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHZhciB0ZXh0O1xuICAgIHZhciBkaXNwYXRjaFBhc3RlID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICAgICAgdGVybS5oYW5kbGVyKHRleHQpO1xuICAgICAgICB0ZXJtLnRleHRhcmVhLnZhbHVlID0gJyc7XG4gICAgICAgIHJldHVybiB0ZXJtLmNhbmNlbChldik7XG4gICAgfTtcbiAgICBpZiAodGVybS5icm93c2VyLmlzTVNJRSkge1xuICAgICAgICBpZiAod2luZG93LmNsaXBib2FyZERhdGEpIHtcbiAgICAgICAgICAgIHRleHQgPSB3aW5kb3cuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCdUZXh0Jyk7XG4gICAgICAgICAgICBkaXNwYXRjaFBhc3RlKHRleHQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoZXYuY2xpcGJvYXJkRGF0YSkge1xuICAgICAgICAgICAgdGV4dCA9IGV2LmNsaXBib2FyZERhdGEuZ2V0RGF0YSgndGV4dC9wbGFpbicpO1xuICAgICAgICAgICAgZGlzcGF0Y2hQYXN0ZSh0ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMucGFzdGVIYW5kbGVyID0gcGFzdGVIYW5kbGVyO1xuZnVuY3Rpb24gcmlnaHRDbGlja0hhbmRsZXIoZXYsIHRlcm0pIHtcbiAgICB2YXIgcyA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpLCBzZWxlY3RlZFRleHQgPSBwcmVwYXJlVGV4dEZvckNsaXBib2FyZChzLnRvU3RyaW5nKCkpLCBjbGlja0lzT25TZWxlY3Rpb24gPSBmYWxzZSwgeCA9IGV2LmNsaWVudFgsIHkgPSBldi5jbGllbnRZO1xuICAgIGlmIChzLnJhbmdlQ291bnQpIHtcbiAgICAgICAgdmFyIHIgPSBzLmdldFJhbmdlQXQoMCksIGNyID0gci5nZXRDbGllbnRSZWN0cygpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcmVjdCA9IGNyW2ldO1xuICAgICAgICAgICAgY2xpY2tJc09uU2VsZWN0aW9uID0gKCh4ID4gcmVjdC5sZWZ0KSAmJiAoeCA8IHJlY3QucmlnaHQpICYmXG4gICAgICAgICAgICAgICAgKHkgPiByZWN0LnRvcCkgJiYgKHkgPCByZWN0LmJvdHRvbSkpO1xuICAgICAgICAgICAgaWYgKGNsaWNrSXNPblNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxlY3RlZFRleHQubWF0Y2goL15cXHMkLykgfHwgIXNlbGVjdGVkVGV4dC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNsaWNrSXNPblNlbGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghY2xpY2tJc09uU2VsZWN0aW9uKSB7XG4gICAgICAgIHRlcm0udGV4dGFyZWEuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnO1xuICAgICAgICB0ZXJtLnRleHRhcmVhLnN0eWxlLndpZHRoID0gJzIwcHgnO1xuICAgICAgICB0ZXJtLnRleHRhcmVhLnN0eWxlLmhlaWdodCA9ICcyMHB4JztcbiAgICAgICAgdGVybS50ZXh0YXJlYS5zdHlsZS5sZWZ0ID0gKHggLSAxMCkgKyAncHgnO1xuICAgICAgICB0ZXJtLnRleHRhcmVhLnN0eWxlLnRvcCA9ICh5IC0gMTApICsgJ3B4JztcbiAgICAgICAgdGVybS50ZXh0YXJlYS5zdHlsZS56SW5kZXggPSAnMTAwMCc7XG4gICAgICAgIHRlcm0udGV4dGFyZWEuZm9jdXMoKTtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0ZXJtLnRleHRhcmVhLnN0eWxlLnBvc2l0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIHRlcm0udGV4dGFyZWEuc3R5bGUud2lkdGggPSBudWxsO1xuICAgICAgICAgICAgdGVybS50ZXh0YXJlYS5zdHlsZS5oZWlnaHQgPSBudWxsO1xuICAgICAgICAgICAgdGVybS50ZXh0YXJlYS5zdHlsZS5sZWZ0ID0gbnVsbDtcbiAgICAgICAgICAgIHRlcm0udGV4dGFyZWEuc3R5bGUudG9wID0gbnVsbDtcbiAgICAgICAgICAgIHRlcm0udGV4dGFyZWEuc3R5bGUuekluZGV4ID0gbnVsbDtcbiAgICAgICAgfSwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5yaWdodENsaWNrSGFuZGxlciA9IHJpZ2h0Q2xpY2tIYW5kbGVyO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1DbGlwYm9hcmQuanMubWFwXG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBHZW5lcmljXzEgPSByZXF1aXJlKFwiLi9HZW5lcmljXCIpO1xudmFyIGlzTm9kZSA9ICh0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJykgPyB0cnVlIDogZmFsc2U7XG52YXIgdXNlckFnZW50ID0gKGlzTm9kZSkgPyAnbm9kZScgOiBuYXZpZ2F0b3IudXNlckFnZW50O1xudmFyIHBsYXRmb3JtID0gKGlzTm9kZSkgPyAnbm9kZScgOiBuYXZpZ2F0b3IucGxhdGZvcm07XG5leHBvcnRzLmlzRmlyZWZveCA9ICEhfnVzZXJBZ2VudC5pbmRleE9mKCdGaXJlZm94Jyk7XG5leHBvcnRzLmlzTVNJRSA9ICEhfnVzZXJBZ2VudC5pbmRleE9mKCdNU0lFJykgfHwgISF+dXNlckFnZW50LmluZGV4T2YoJ1RyaWRlbnQnKTtcbmV4cG9ydHMuaXNNYWMgPSBHZW5lcmljXzEuY29udGFpbnMoWydNYWNpbnRvc2gnLCAnTWFjSW50ZWwnLCAnTWFjUFBDJywgJ01hYzY4SyddLCBwbGF0Zm9ybSk7XG5leHBvcnRzLmlzSXBhZCA9IHBsYXRmb3JtID09PSAnaVBhZCc7XG5leHBvcnRzLmlzSXBob25lID0gcGxhdGZvcm0gPT09ICdpUGhvbmUnO1xuZXhwb3J0cy5pc01TV2luZG93cyA9IEdlbmVyaWNfMS5jb250YWlucyhbJ1dpbmRvd3MnLCAnV2luMTYnLCAnV2luMzInLCAnV2luQ0UnXSwgcGxhdGZvcm0pO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1Ccm93c2VyLmpzLm1hcFxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19leHRlbmRzID0gKHRoaXMgJiYgdGhpcy5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBFdmVudEVtaXR0ZXJfanNfMSA9IHJlcXVpcmUoXCIuLi9FdmVudEVtaXR0ZXIuanNcIik7XG52YXIgQ2hhck1lYXN1cmUgPSAoZnVuY3Rpb24gKF9zdXBlcikge1xuICAgIF9fZXh0ZW5kcyhDaGFyTWVhc3VyZSwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBDaGFyTWVhc3VyZShkb2N1bWVudCwgcGFyZW50RWxlbWVudCkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgICAgICBfdGhpcy5fZG9jdW1lbnQgPSBkb2N1bWVudDtcbiAgICAgICAgX3RoaXMuX3BhcmVudEVsZW1lbnQgPSBwYXJlbnRFbGVtZW50O1xuICAgICAgICByZXR1cm4gX3RoaXM7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDaGFyTWVhc3VyZS5wcm90b3R5cGUsIFwid2lkdGhcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENoYXJNZWFzdXJlLnByb3RvdHlwZSwgXCJoZWlnaHRcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oZWlnaHQ7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIENoYXJNZWFzdXJlLnByb3RvdHlwZS5tZWFzdXJlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICBpZiAoIXRoaXMuX21lYXN1cmVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9tZWFzdXJlRWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgIHRoaXMuX21lYXN1cmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgICAgIHRoaXMuX21lYXN1cmVFbGVtZW50LnN0eWxlLnRvcCA9ICcwJztcbiAgICAgICAgICAgIHRoaXMuX21lYXN1cmVFbGVtZW50LnN0eWxlLmxlZnQgPSAnLTk5OTllbSc7XG4gICAgICAgICAgICB0aGlzLl9tZWFzdXJlRWxlbWVudC50ZXh0Q29udGVudCA9ICdXJztcbiAgICAgICAgICAgIHRoaXMuX21lYXN1cmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgICAgICAgICAgdGhpcy5fcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLl9tZWFzdXJlRWxlbWVudCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9kb01lYXN1cmUoKTsgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9kb01lYXN1cmUoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgQ2hhck1lYXN1cmUucHJvdG90eXBlLl9kb01lYXN1cmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBnZW9tZXRyeSA9IHRoaXMuX21lYXN1cmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBpZiAoZ2VvbWV0cnkud2lkdGggPT09IDAgfHwgZ2VvbWV0cnkuaGVpZ2h0ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX3dpZHRoICE9PSBnZW9tZXRyeS53aWR0aCB8fCB0aGlzLl9oZWlnaHQgIT09IGdlb21ldHJ5LmhlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5fd2lkdGggPSBnZW9tZXRyeS53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuX2hlaWdodCA9IGdlb21ldHJ5LmhlaWdodDtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY2hhcnNpemVjaGFuZ2VkJyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBDaGFyTWVhc3VyZTtcbn0oRXZlbnRFbWl0dGVyX2pzXzEuRXZlbnRFbWl0dGVyKSk7XG5leHBvcnRzLkNoYXJNZWFzdXJlID0gQ2hhck1lYXN1cmU7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUNoYXJNZWFzdXJlLmpzLm1hcFxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgQ2lyY3VsYXJMaXN0ID0gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDaXJjdWxhckxpc3QobWF4TGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuX2FycmF5ID0gbmV3IEFycmF5KG1heExlbmd0aCk7XG4gICAgICAgIHRoaXMuX3N0YXJ0SW5kZXggPSAwO1xuICAgICAgICB0aGlzLl9sZW5ndGggPSAwO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ2lyY3VsYXJMaXN0LnByb3RvdHlwZSwgXCJtYXhMZW5ndGhcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcnJheS5sZW5ndGg7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5ld01heExlbmd0aCkge1xuICAgICAgICAgICAgdmFyIG5ld0FycmF5ID0gbmV3IEFycmF5KG5ld01heExlbmd0aCk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IE1hdGgubWluKG5ld01heExlbmd0aCwgdGhpcy5sZW5ndGgpOyBpKyspIHtcbiAgICAgICAgICAgICAgICBuZXdBcnJheVtpXSA9IHRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KGkpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2FycmF5ID0gbmV3QXJyYXk7XG4gICAgICAgICAgICB0aGlzLl9zdGFydEluZGV4ID0gMDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENpcmN1bGFyTGlzdC5wcm90b3R5cGUsIFwibGVuZ3RoXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbGVuZ3RoO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IGZ1bmN0aW9uIChuZXdMZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChuZXdMZW5ndGggPiB0aGlzLl9sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5fbGVuZ3RoOyBpIDwgbmV3TGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXJyYXlbaV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbGVuZ3RoID0gbmV3TGVuZ3RoO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ2lyY3VsYXJMaXN0LnByb3RvdHlwZSwgXCJmb3JFYWNoXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXJyYXkuZm9yRWFjaDtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgQ2lyY3VsYXJMaXN0LnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KGluZGV4KV07XG4gICAgfTtcbiAgICBDaXJjdWxhckxpc3QucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChpbmRleCwgdmFsdWUpIHtcbiAgICAgICAgdGhpcy5fYXJyYXlbdGhpcy5fZ2V0Q3ljbGljSW5kZXgoaW5kZXgpXSA9IHZhbHVlO1xuICAgIH07XG4gICAgQ2lyY3VsYXJMaXN0LnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KHRoaXMuX2xlbmd0aCldID0gdmFsdWU7XG4gICAgICAgIGlmICh0aGlzLl9sZW5ndGggPT09IHRoaXMubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGFydEluZGV4Kys7XG4gICAgICAgICAgICBpZiAodGhpcy5fc3RhcnRJbmRleCA9PT0gdGhpcy5tYXhMZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGFydEluZGV4ID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2xlbmd0aCsrO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBDaXJjdWxhckxpc3QucHJvdG90eXBlLnBvcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KHRoaXMuX2xlbmd0aC0tIC0gMSldO1xuICAgIH07XG4gICAgQ2lyY3VsYXJMaXN0LnByb3RvdHlwZS5zcGxpY2UgPSBmdW5jdGlvbiAoc3RhcnQsIGRlbGV0ZUNvdW50KSB7XG4gICAgICAgIHZhciBpdGVtcyA9IFtdO1xuICAgICAgICBmb3IgKHZhciBfaSA9IDI7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykge1xuICAgICAgICAgICAgaXRlbXNbX2kgLSAyXSA9IGFyZ3VtZW50c1tfaV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlbGV0ZUNvdW50KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCB0aGlzLl9sZW5ndGggLSBkZWxldGVDb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYXJyYXlbdGhpcy5fZ2V0Q3ljbGljSW5kZXgoaSldID0gdGhpcy5fYXJyYXlbdGhpcy5fZ2V0Q3ljbGljSW5kZXgoaSArIGRlbGV0ZUNvdW50KV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9sZW5ndGggLT0gZGVsZXRlQ291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMuX2xlbmd0aCAtIDE7IGkgPj0gc3RhcnQ7IGktLSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KGkgKyBpdGVtcy5sZW5ndGgpXSA9IHRoaXMuX2FycmF5W3RoaXMuX2dldEN5Y2xpY0luZGV4KGkpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hcnJheVt0aGlzLl9nZXRDeWNsaWNJbmRleChzdGFydCArIGkpXSA9IGl0ZW1zW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2xlbmd0aCArIGl0ZW1zLmxlbmd0aCA+IHRoaXMubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRJbmRleCArPSAodGhpcy5fbGVuZ3RoICsgaXRlbXMubGVuZ3RoKSAtIHRoaXMubWF4TGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xlbmd0aCA9IHRoaXMubWF4TGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGVuZ3RoICs9IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgQ2lyY3VsYXJMaXN0LnByb3RvdHlwZS50cmltU3RhcnQgPSBmdW5jdGlvbiAoY291bnQpIHtcbiAgICAgICAgaWYgKGNvdW50ID4gdGhpcy5fbGVuZ3RoKSB7XG4gICAgICAgICAgICBjb3VudCA9IHRoaXMuX2xlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGFydEluZGV4ICs9IGNvdW50O1xuICAgICAgICB0aGlzLl9sZW5ndGggLT0gY291bnQ7XG4gICAgfTtcbiAgICBDaXJjdWxhckxpc3QucHJvdG90eXBlLnNoaWZ0RWxlbWVudHMgPSBmdW5jdGlvbiAoc3RhcnQsIGNvdW50LCBvZmZzZXQpIHtcbiAgICAgICAgaWYgKGNvdW50IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMuX2xlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdGFydCBhcmd1bWVudCBvdXQgb2YgcmFuZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnQgKyBvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzaGlmdCBlbGVtZW50cyBpbiBsaXN0IGJleW9uZCBpbmRleCAwJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9mZnNldCA+IDApIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoc3RhcnQgKyBpICsgb2Zmc2V0LCB0aGlzLmdldChzdGFydCArIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBleHBhbmRMaXN0QnkgPSAoc3RhcnQgKyBjb3VudCArIG9mZnNldCkgLSB0aGlzLl9sZW5ndGg7XG4gICAgICAgICAgICBpZiAoZXhwYW5kTGlzdEJ5ID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xlbmd0aCArPSBleHBhbmRMaXN0Qnk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuX2xlbmd0aCA+IHRoaXMubWF4TGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xlbmd0aC0tO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGFydEluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQoc3RhcnQgKyBpICsgb2Zmc2V0LCB0aGlzLmdldChzdGFydCArIGkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgQ2lyY3VsYXJMaXN0LnByb3RvdHlwZS5fZ2V0Q3ljbGljSW5kZXggPSBmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLl9zdGFydEluZGV4ICsgaW5kZXgpICUgdGhpcy5tYXhMZW5ndGg7XG4gICAgfTtcbiAgICByZXR1cm4gQ2lyY3VsYXJMaXN0O1xufSgpKTtcbmV4cG9ydHMuQ2lyY3VsYXJMaXN0ID0gQ2lyY3VsYXJMaXN0O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1DaXJjdWxhckxpc3QuanMubWFwXG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmZ1bmN0aW9uIGNvbnRhaW5zKGFyciwgZWwpIHtcbiAgICByZXR1cm4gYXJyLmluZGV4T2YoZWwpID49IDA7XG59XG5leHBvcnRzLmNvbnRhaW5zID0gY29udGFpbnM7XG47XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUdlbmVyaWMuanMubWFwXG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBDb21wb3NpdGlvbkhlbHBlcl8xID0gcmVxdWlyZShcIi4vQ29tcG9zaXRpb25IZWxwZXJcIik7XG52YXIgRXZlbnRFbWl0dGVyXzEgPSByZXF1aXJlKFwiLi9FdmVudEVtaXR0ZXJcIik7XG52YXIgVmlld3BvcnRfMSA9IHJlcXVpcmUoXCIuL1ZpZXdwb3J0XCIpO1xudmFyIENsaXBib2FyZF8xID0gcmVxdWlyZShcIi4vaGFuZGxlcnMvQ2xpcGJvYXJkXCIpO1xudmFyIENpcmN1bGFyTGlzdF8xID0gcmVxdWlyZShcIi4vdXRpbHMvQ2lyY3VsYXJMaXN0XCIpO1xudmFyIEVzY2FwZVNlcXVlbmNlc18xID0gcmVxdWlyZShcIi4vRXNjYXBlU2VxdWVuY2VzXCIpO1xudmFyIElucHV0SGFuZGxlcl8xID0gcmVxdWlyZShcIi4vSW5wdXRIYW5kbGVyXCIpO1xudmFyIFBhcnNlcl8xID0gcmVxdWlyZShcIi4vUGFyc2VyXCIpO1xudmFyIFJlbmRlcmVyXzEgPSByZXF1aXJlKFwiLi9SZW5kZXJlclwiKTtcbnZhciBMaW5raWZpZXJfMSA9IHJlcXVpcmUoXCIuL0xpbmtpZmllclwiKTtcbnZhciBDaGFyTWVhc3VyZV8xID0gcmVxdWlyZShcIi4vdXRpbHMvQ2hhck1lYXN1cmVcIik7XG52YXIgQnJvd3NlciA9IHJlcXVpcmUoXCIuL3V0aWxzL0Jyb3dzZXJcIik7XG52YXIgZG9jdW1lbnQgPSAodHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJykgPyB3aW5kb3cuZG9jdW1lbnQgOiBudWxsO1xudmFyIFdSSVRFX0JVRkZFUl9QQVVTRV9USFJFU0hPTEQgPSA1O1xudmFyIFdSSVRFX0JBVENIX1NJWkUgPSAzMDA7XG52YXIgQ1VSU09SX0JMSU5LX0lOVEVSVkFMID0gNjAwO1xuZnVuY3Rpb24gVGVybWluYWwob3B0aW9ucykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVGVybWluYWwpKSB7XG4gICAgICAgIHJldHVybiBuZXcgVGVybWluYWwoYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XG4gICAgfVxuICAgIHNlbGYuYnJvd3NlciA9IEJyb3dzZXI7XG4gICAgc2VsZi5jYW5jZWwgPSBUZXJtaW5hbC5jYW5jZWw7XG4gICAgRXZlbnRFbWl0dGVyXzEuRXZlbnRFbWl0dGVyLmNhbGwodGhpcyk7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnbnVtYmVyJykge1xuICAgICAgICBvcHRpb25zID0ge1xuICAgICAgICAgICAgY29sczogYXJndW1lbnRzWzBdLFxuICAgICAgICAgICAgcm93czogYXJndW1lbnRzWzFdLFxuICAgICAgICAgICAgaGFuZGxlcjogYXJndW1lbnRzWzJdXG4gICAgICAgIH07XG4gICAgfVxuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIE9iamVjdC5rZXlzKFRlcm1pbmFsLmRlZmF1bHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKG9wdGlvbnNba2V5XSA9PSBudWxsKSB7XG4gICAgICAgICAgICBvcHRpb25zW2tleV0gPSBUZXJtaW5hbC5vcHRpb25zW2tleV07XG4gICAgICAgICAgICBpZiAoVGVybWluYWxba2V5XSAhPT0gVGVybWluYWwuZGVmYXVsdHNba2V5XSkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnNba2V5XSA9IFRlcm1pbmFsW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2VsZltrZXldID0gb3B0aW9uc1trZXldO1xuICAgIH0pO1xuICAgIGlmIChvcHRpb25zLmNvbG9ycy5sZW5ndGggPT09IDgpIHtcbiAgICAgICAgb3B0aW9ucy5jb2xvcnMgPSBvcHRpb25zLmNvbG9ycy5jb25jYXQoVGVybWluYWwuX2NvbG9ycy5zbGljZSg4KSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG9wdGlvbnMuY29sb3JzLmxlbmd0aCA9PT0gMTYpIHtcbiAgICAgICAgb3B0aW9ucy5jb2xvcnMgPSBvcHRpb25zLmNvbG9ycy5jb25jYXQoVGVybWluYWwuX2NvbG9ycy5zbGljZSgxNikpO1xuICAgIH1cbiAgICBlbHNlIGlmIChvcHRpb25zLmNvbG9ycy5sZW5ndGggPT09IDEwKSB7XG4gICAgICAgIG9wdGlvbnMuY29sb3JzID0gb3B0aW9ucy5jb2xvcnMuc2xpY2UoMCwgLTIpLmNvbmNhdChUZXJtaW5hbC5fY29sb3JzLnNsaWNlKDgsIC0yKSwgb3B0aW9ucy5jb2xvcnMuc2xpY2UoLTIpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAob3B0aW9ucy5jb2xvcnMubGVuZ3RoID09PSAxOCkge1xuICAgICAgICBvcHRpb25zLmNvbG9ycyA9IG9wdGlvbnMuY29sb3JzLmNvbmNhdChUZXJtaW5hbC5fY29sb3JzLnNsaWNlKDE2LCAtMiksIG9wdGlvbnMuY29sb3JzLnNsaWNlKC0yKSk7XG4gICAgfVxuICAgIHRoaXMuY29sb3JzID0gb3B0aW9ucy5jb2xvcnM7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLnBhcmVudCA9IG9wdGlvbnMuYm9keSB8fCBvcHRpb25zLnBhcmVudCB8fCAoZG9jdW1lbnQgPyBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYm9keScpWzBdIDogbnVsbCk7XG4gICAgdGhpcy5jb2xzID0gb3B0aW9ucy5jb2xzIHx8IG9wdGlvbnMuZ2VvbWV0cnlbMF07XG4gICAgdGhpcy5yb3dzID0gb3B0aW9ucy5yb3dzIHx8IG9wdGlvbnMuZ2VvbWV0cnlbMV07XG4gICAgdGhpcy5nZW9tZXRyeSA9IFt0aGlzLmNvbHMsIHRoaXMucm93c107XG4gICAgaWYgKG9wdGlvbnMuaGFuZGxlcikge1xuICAgICAgICB0aGlzLm9uKCdkYXRhJywgb3B0aW9ucy5oYW5kbGVyKTtcbiAgICB9XG4gICAgdGhpcy55YmFzZSA9IDA7XG4gICAgdGhpcy55ZGlzcCA9IDA7XG4gICAgdGhpcy54ID0gMDtcbiAgICB0aGlzLnkgPSAwO1xuICAgIHRoaXMuY3Vyc29yU3RhdGUgPSAwO1xuICAgIHRoaXMuY3Vyc29ySGlkZGVuID0gZmFsc2U7XG4gICAgdGhpcy5jb252ZXJ0RW9sO1xuICAgIHRoaXMucXVldWUgPSAnJztcbiAgICB0aGlzLnNjcm9sbFRvcCA9IDA7XG4gICAgdGhpcy5zY3JvbGxCb3R0b20gPSB0aGlzLnJvd3MgLSAxO1xuICAgIHRoaXMuY3VzdG9tS2V5ZG93bkhhbmRsZXIgPSBudWxsO1xuICAgIHRoaXMuY3Vyc29yQmxpbmtJbnRlcnZhbCA9IG51bGw7XG4gICAgdGhpcy5hcHBsaWNhdGlvbktleXBhZCA9IGZhbHNlO1xuICAgIHRoaXMuYXBwbGljYXRpb25DdXJzb3IgPSBmYWxzZTtcbiAgICB0aGlzLm9yaWdpbk1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLmluc2VydE1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLndyYXBhcm91bmRNb2RlID0gdHJ1ZTtcbiAgICB0aGlzLm5vcm1hbCA9IG51bGw7XG4gICAgdGhpcy5jaGFyc2V0ID0gbnVsbDtcbiAgICB0aGlzLmdjaGFyc2V0ID0gbnVsbDtcbiAgICB0aGlzLmdsZXZlbCA9IDA7XG4gICAgdGhpcy5jaGFyc2V0cyA9IFtudWxsXTtcbiAgICB0aGlzLmRlY0xvY2F0b3I7XG4gICAgdGhpcy54MTBNb3VzZTtcbiAgICB0aGlzLnZ0MjAwTW91c2U7XG4gICAgdGhpcy52dDMwME1vdXNlO1xuICAgIHRoaXMubm9ybWFsTW91c2U7XG4gICAgdGhpcy5tb3VzZUV2ZW50cztcbiAgICB0aGlzLnNlbmRGb2N1cztcbiAgICB0aGlzLnV0Zk1vdXNlO1xuICAgIHRoaXMuc2dyTW91c2U7XG4gICAgdGhpcy51cnh2dE1vdXNlO1xuICAgIHRoaXMuZWxlbWVudDtcbiAgICB0aGlzLmNoaWxkcmVuO1xuICAgIHRoaXMucmVmcmVzaFN0YXJ0O1xuICAgIHRoaXMucmVmcmVzaEVuZDtcbiAgICB0aGlzLnNhdmVkWDtcbiAgICB0aGlzLnNhdmVkWTtcbiAgICB0aGlzLnNhdmVkQ29scztcbiAgICB0aGlzLnJlYWRhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcbiAgICB0aGlzLmRlZkF0dHIgPSAoMCA8PCAxOCkgfCAoMjU3IDw8IDkpIHwgKDI1NiA8PCAwKTtcbiAgICB0aGlzLmN1ckF0dHIgPSB0aGlzLmRlZkF0dHI7XG4gICAgdGhpcy5wYXJhbXMgPSBbXTtcbiAgICB0aGlzLmN1cnJlbnRQYXJhbSA9IDA7XG4gICAgdGhpcy5wcmVmaXggPSAnJztcbiAgICB0aGlzLnBvc3RmaXggPSAnJztcbiAgICB0aGlzLmlucHV0SGFuZGxlciA9IG5ldyBJbnB1dEhhbmRsZXJfMS5JbnB1dEhhbmRsZXIodGhpcyk7XG4gICAgdGhpcy5wYXJzZXIgPSBuZXcgUGFyc2VyXzEuUGFyc2VyKHRoaXMuaW5wdXRIYW5kbGVyLCB0aGlzKTtcbiAgICB0aGlzLnJlbmRlcmVyID0gdGhpcy5yZW5kZXJlciB8fCBudWxsO1xuICAgIHRoaXMubGlua2lmaWVyID0gdGhpcy5saW5raWZpZXIgfHwgbmV3IExpbmtpZmllcl8xLkxpbmtpZmllcigpO1xuICAgIHRoaXMud3JpdGVCdWZmZXIgPSBbXTtcbiAgICB0aGlzLndyaXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIHRoaXMueG9mZlNlbnRUb0NhdGNoVXAgPSBmYWxzZTtcbiAgICB0aGlzLndyaXRlU3RvcHBlZCA9IGZhbHNlO1xuICAgIHRoaXMuc3Vycm9nYXRlX2hpZ2ggPSAnJztcbiAgICB0aGlzLmxpbmVzID0gbmV3IENpcmN1bGFyTGlzdF8xLkNpcmN1bGFyTGlzdCh0aGlzLnNjcm9sbGJhY2spO1xuICAgIHZhciBpID0gdGhpcy5yb3dzO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgICAgdGhpcy5saW5lcy5wdXNoKHRoaXMuYmxhbmtMaW5lKCkpO1xuICAgIH1cbiAgICB0aGlzLnRhYnM7XG4gICAgdGhpcy5zZXR1cFN0b3BzKCk7XG4gICAgdGhpcy51c2VyU2Nyb2xsaW5nID0gZmFsc2U7XG59XG5pbmhlcml0cyhUZXJtaW5hbCwgRXZlbnRFbWl0dGVyXzEuRXZlbnRFbWl0dGVyKTtcblRlcm1pbmFsLnByb3RvdHlwZS5lcmFzZUF0dHIgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICh0aGlzLmRlZkF0dHIgJiB+MHgxZmYpIHwgKHRoaXMuY3VyQXR0ciAmIDB4MWZmKTtcbn07XG5UZXJtaW5hbC50YW5nb0NvbG9ycyA9IFtcbiAgICAnIzJlMzQzNicsXG4gICAgJyNjYzAwMDAnLFxuICAgICcjNGU5YTA2JyxcbiAgICAnI2M0YTAwMCcsXG4gICAgJyMzNDY1YTQnLFxuICAgICcjNzU1MDdiJyxcbiAgICAnIzA2OTg5YScsXG4gICAgJyNkM2Q3Y2YnLFxuICAgICcjNTU1NzUzJyxcbiAgICAnI2VmMjkyOScsXG4gICAgJyM4YWUyMzQnLFxuICAgICcjZmNlOTRmJyxcbiAgICAnIzcyOWZjZicsXG4gICAgJyNhZDdmYTgnLFxuICAgICcjMzRlMmUyJyxcbiAgICAnI2VlZWVlYydcbl07XG5UZXJtaW5hbC5jb2xvcnMgPSAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb2xvcnMgPSBUZXJtaW5hbC50YW5nb0NvbG9ycy5zbGljZSgpLCByID0gWzB4MDAsIDB4NWYsIDB4ODcsIDB4YWYsIDB4ZDcsIDB4ZmZdLCBpO1xuICAgIGkgPSAwO1xuICAgIGZvciAoOyBpIDwgMjE2OyBpKyspIHtcbiAgICAgICAgb3V0KHJbKGkgLyAzNikgJSA2IHwgMF0sIHJbKGkgLyA2KSAlIDYgfCAwXSwgcltpICUgNl0pO1xuICAgIH1cbiAgICBpID0gMDtcbiAgICBmb3IgKDsgaSA8IDI0OyBpKyspIHtcbiAgICAgICAgciA9IDggKyBpICogMTA7XG4gICAgICAgIG91dChyLCByLCByKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gb3V0KHIsIGcsIGIpIHtcbiAgICAgICAgY29sb3JzLnB1c2goJyMnICsgaGV4KHIpICsgaGV4KGcpICsgaGV4KGIpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaGV4KGMpIHtcbiAgICAgICAgYyA9IGMudG9TdHJpbmcoMTYpO1xuICAgICAgICByZXR1cm4gYy5sZW5ndGggPCAyID8gJzAnICsgYyA6IGM7XG4gICAgfVxuICAgIHJldHVybiBjb2xvcnM7XG59KSgpO1xuVGVybWluYWwuX2NvbG9ycyA9IFRlcm1pbmFsLmNvbG9ycy5zbGljZSgpO1xuVGVybWluYWwudmNvbG9ycyA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG91dCA9IFtdLCBjb2xvcnMgPSBUZXJtaW5hbC5jb2xvcnMsIGkgPSAwLCBjb2xvcjtcbiAgICBmb3IgKDsgaSA8IDI1NjsgaSsrKSB7XG4gICAgICAgIGNvbG9yID0gcGFyc2VJbnQoY29sb3JzW2ldLnN1YnN0cmluZygxKSwgMTYpO1xuICAgICAgICBvdXQucHVzaChbXG4gICAgICAgICAgICAoY29sb3IgPj4gMTYpICYgMHhmZixcbiAgICAgICAgICAgIChjb2xvciA+PiA4KSAmIDB4ZmYsXG4gICAgICAgICAgICBjb2xvciAmIDB4ZmZcbiAgICAgICAgXSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59KSgpO1xuVGVybWluYWwuZGVmYXVsdHMgPSB7XG4gICAgY29sb3JzOiBUZXJtaW5hbC5jb2xvcnMsXG4gICAgdGhlbWU6ICdkZWZhdWx0JyxcbiAgICBjb252ZXJ0RW9sOiBmYWxzZSxcbiAgICB0ZXJtTmFtZTogJ3h0ZXJtJyxcbiAgICBnZW9tZXRyeTogWzgwLCAyNF0sXG4gICAgY3Vyc29yQmxpbms6IGZhbHNlLFxuICAgIGN1cnNvclN0eWxlOiAnYmxvY2snLFxuICAgIHZpc3VhbEJlbGw6IGZhbHNlLFxuICAgIHBvcE9uQmVsbDogZmFsc2UsXG4gICAgc2Nyb2xsYmFjazogMTAwMCxcbiAgICBzY3JlZW5LZXlzOiBmYWxzZSxcbiAgICBkZWJ1ZzogZmFsc2UsXG4gICAgY2FuY2VsRXZlbnRzOiBmYWxzZSxcbiAgICBkaXNhYmxlU3RkaW46IGZhbHNlLFxuICAgIHVzZUZsb3dDb250cm9sOiBmYWxzZSxcbiAgICB0YWJTdG9wV2lkdGg6IDhcbn07XG5UZXJtaW5hbC5vcHRpb25zID0ge307XG5UZXJtaW5hbC5mb2N1cyA9IG51bGw7XG5lYWNoKGtleXMoVGVybWluYWwuZGVmYXVsdHMpLCBmdW5jdGlvbiAoa2V5KSB7XG4gICAgVGVybWluYWxba2V5XSA9IFRlcm1pbmFsLmRlZmF1bHRzW2tleV07XG4gICAgVGVybWluYWwub3B0aW9uc1trZXldID0gVGVybWluYWwuZGVmYXVsdHNba2V5XTtcbn0pO1xuVGVybWluYWwucHJvdG90eXBlLmZvY3VzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnRleHRhcmVhLmZvY3VzKCk7XG59O1xuVGVybWluYWwucHJvdG90eXBlLmdldE9wdGlvbiA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgaWYgKCEoa2V5IGluIFRlcm1pbmFsLmRlZmF1bHRzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIG9wdGlvbiB3aXRoIGtleSBcIicgKyBrZXkgKyAnXCInKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnNba2V5XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc1trZXldO1xuICAgIH1cbiAgICByZXR1cm4gdGhpc1trZXldO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5zZXRPcHRpb24gPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghKGtleSBpbiBUZXJtaW5hbC5kZWZhdWx0cykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBvcHRpb24gd2l0aCBrZXkgXCInICsga2V5ICsgJ1wiJyk7XG4gICAgfVxuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ3Njcm9sbGJhY2snOlxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9uc1trZXldICE9PSB2YWx1ZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA+IHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBhbW91bnRUb1RyaW0gPSB0aGlzLmxpbmVzLmxlbmd0aCAtIHZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbmVlZHNSZWZyZXNoID0gKHRoaXMueWRpc3AgLSBhbW91bnRUb1RyaW0gPCAwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saW5lcy50cmltU3RhcnQoYW1vdW50VG9UcmltKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy55YmFzZSA9IE1hdGgubWF4KHRoaXMueWJhc2UgLSBhbW91bnRUb1RyaW0sIDApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnlkaXNwID0gTWF0aC5tYXgodGhpcy55ZGlzcCAtIGFtb3VudFRvVHJpbSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZWVkc1JlZnJlc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaCgwLCB0aGlzLnJvd3MgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLmxpbmVzLm1heExlbmd0aCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld3BvcnQuc3luY1Njcm9sbEFyZWEoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzW2tleV0gPSB2YWx1ZTtcbiAgICB0aGlzLm9wdGlvbnNba2V5XSA9IHZhbHVlO1xuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ2N1cnNvckJsaW5rJzpcbiAgICAgICAgICAgIHRoaXMuc2V0Q3Vyc29yQmxpbmtpbmcodmFsdWUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2N1cnNvclN0eWxlJzpcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKFwieHRlcm0tY3Vyc29yLXN0eWxlLXVuZGVybGluZVwiLCB2YWx1ZSA9PT0gJ3VuZGVybGluZScpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoXCJ4dGVybS1jdXJzb3Itc3R5bGUtYmFyXCIsIHZhbHVlID09PSAnYmFyJyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndGFiU3RvcFdpZHRoJzpcbiAgICAgICAgICAgIHRoaXMuc2V0dXBTdG9wcygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufTtcblRlcm1pbmFsLnByb3RvdHlwZS5yZXN0YXJ0Q3Vyc29yQmxpbmtpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5zZXRDdXJzb3JCbGlua2luZyh0aGlzLm9wdGlvbnMuY3Vyc29yQmxpbmspO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5zZXRDdXJzb3JCbGlua2luZyA9IGZ1bmN0aW9uIChlbmFibGVkKSB7XG4gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoJ3h0ZXJtLWN1cnNvci1ibGluaycsIGVuYWJsZWQpO1xuICAgIHRoaXMuY2xlYXJDdXJzb3JCbGlua2luZ0ludGVydmFsKCk7XG4gICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLmN1cnNvckJsaW5rSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLmVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgneHRlcm0tY3Vyc29yLWJsaW5rLW9uJyk7XG4gICAgICAgIH0sIENVUlNPUl9CTElOS19JTlRFUlZBTCk7XG4gICAgfVxufTtcblRlcm1pbmFsLnByb3RvdHlwZS5jbGVhckN1cnNvckJsaW5raW5nSW50ZXJ2YWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3h0ZXJtLWN1cnNvci1ibGluay1vbicpO1xuICAgIGlmICh0aGlzLmN1cnNvckJsaW5rSW50ZXJ2YWwpIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmN1cnNvckJsaW5rSW50ZXJ2YWwpO1xuICAgICAgICB0aGlzLmN1cnNvckJsaW5rSW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cbn07XG5UZXJtaW5hbC5iaW5kRm9jdXMgPSBmdW5jdGlvbiAodGVybSkge1xuICAgIG9uKHRlcm0udGV4dGFyZWEsICdmb2N1cycsIGZ1bmN0aW9uIChldikge1xuICAgICAgICBpZiAodGVybS5zZW5kRm9jdXMpIHtcbiAgICAgICAgICAgIHRlcm0uc2VuZChFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnW0knKTtcbiAgICAgICAgfVxuICAgICAgICB0ZXJtLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZm9jdXMnKTtcbiAgICAgICAgdGVybS5zaG93Q3Vyc29yKCk7XG4gICAgICAgIHRlcm0ucmVzdGFydEN1cnNvckJsaW5raW5nLmFwcGx5KHRlcm0pO1xuICAgICAgICBUZXJtaW5hbC5mb2N1cyA9IHRlcm07XG4gICAgICAgIHRlcm0uZW1pdCgnZm9jdXMnLCB7IHRlcm1pbmFsOiB0ZXJtIH0pO1xuICAgIH0pO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5ibHVyID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLnRleHRhcmVhLmJsdXIoKTtcbn07XG5UZXJtaW5hbC5iaW5kQmx1ciA9IGZ1bmN0aW9uICh0ZXJtKSB7XG4gICAgb24odGVybS50ZXh0YXJlYSwgJ2JsdXInLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgdGVybS5yZWZyZXNoKHRlcm0ueSwgdGVybS55KTtcbiAgICAgICAgaWYgKHRlcm0uc2VuZEZvY3VzKSB7XG4gICAgICAgICAgICB0ZXJtLnNlbmQoRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1tPJyk7XG4gICAgICAgIH1cbiAgICAgICAgdGVybS5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2ZvY3VzJyk7XG4gICAgICAgIHRlcm0uY2xlYXJDdXJzb3JCbGlua2luZ0ludGVydmFsLmFwcGx5KHRlcm0pO1xuICAgICAgICBUZXJtaW5hbC5mb2N1cyA9IG51bGw7XG4gICAgICAgIHRlcm0uZW1pdCgnYmx1cicsIHsgdGVybWluYWw6IHRlcm0gfSk7XG4gICAgfSk7XG59O1xuVGVybWluYWwucHJvdG90eXBlLmluaXRHbG9iYWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRlcm0gPSB0aGlzO1xuICAgIFRlcm1pbmFsLmJpbmRLZXlzKHRoaXMpO1xuICAgIFRlcm1pbmFsLmJpbmRGb2N1cyh0aGlzKTtcbiAgICBUZXJtaW5hbC5iaW5kQmx1cih0aGlzKTtcbiAgICBvbih0aGlzLmVsZW1lbnQsICdjb3B5JywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIENsaXBib2FyZF8xLmNvcHlIYW5kbGVyLmNhbGwodGhpcywgZXYsIHRlcm0pO1xuICAgIH0pO1xuICAgIG9uKHRoaXMudGV4dGFyZWEsICdwYXN0ZScsIGZ1bmN0aW9uIChldikge1xuICAgICAgICBDbGlwYm9hcmRfMS5wYXN0ZUhhbmRsZXIuY2FsbCh0aGlzLCBldiwgdGVybSk7XG4gICAgfSk7XG4gICAgb24odGhpcy5lbGVtZW50LCAncGFzdGUnLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgQ2xpcGJvYXJkXzEucGFzdGVIYW5kbGVyLmNhbGwodGhpcywgZXYsIHRlcm0pO1xuICAgIH0pO1xuICAgIGZ1bmN0aW9uIHJpZ2h0Q2xpY2tIYW5kbGVyV3JhcHBlcihldikge1xuICAgICAgICBDbGlwYm9hcmRfMS5yaWdodENsaWNrSGFuZGxlci5jYWxsKHRoaXMsIGV2LCB0ZXJtKTtcbiAgICB9XG4gICAgaWYgKHRlcm0uYnJvd3Nlci5pc0ZpcmVmb3gpIHtcbiAgICAgICAgb24odGhpcy5lbGVtZW50LCAnbW91c2Vkb3duJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgICAgICBpZiAoZXYuYnV0dG9uID09IDIpIHtcbiAgICAgICAgICAgICAgICByaWdodENsaWNrSGFuZGxlcldyYXBwZXIoZXYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIG9uKHRoaXMuZWxlbWVudCwgJ2NvbnRleHRtZW51JywgcmlnaHRDbGlja0hhbmRsZXJXcmFwcGVyKTtcbiAgICB9XG59O1xuVGVybWluYWwuYmluZEtleXMgPSBmdW5jdGlvbiAodGVybSkge1xuICAgIG9uKHRlcm0uZWxlbWVudCwgJ2tleWRvd24nLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT0gdGhpcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRlcm0ua2V5RG93bihldik7XG4gICAgfSwgdHJ1ZSk7XG4gICAgb24odGVybS5lbGVtZW50LCAna2V5cHJlc3MnLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT0gdGhpcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRlcm0ua2V5UHJlc3MoZXYpO1xuICAgIH0sIHRydWUpO1xuICAgIG9uKHRlcm0uZWxlbWVudCwgJ2tleXVwJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIGlmICghd2FzTW9uZGlmaWVyS2V5T25seUV2ZW50KGV2KSkge1xuICAgICAgICAgICAgdGVybS5mb2N1cyh0ZXJtKTtcbiAgICAgICAgfVxuICAgIH0sIHRydWUpO1xuICAgIG9uKHRlcm0udGV4dGFyZWEsICdrZXlkb3duJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIHRlcm0ua2V5RG93bihldik7XG4gICAgfSwgdHJ1ZSk7XG4gICAgb24odGVybS50ZXh0YXJlYSwgJ2tleXByZXNzJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIHRlcm0ua2V5UHJlc3MoZXYpO1xuICAgICAgICB0aGlzLnZhbHVlID0gJyc7XG4gICAgfSwgdHJ1ZSk7XG4gICAgb24odGVybS50ZXh0YXJlYSwgJ2NvbXBvc2l0aW9uc3RhcnQnLCB0ZXJtLmNvbXBvc2l0aW9uSGVscGVyLmNvbXBvc2l0aW9uc3RhcnQuYmluZCh0ZXJtLmNvbXBvc2l0aW9uSGVscGVyKSk7XG4gICAgb24odGVybS50ZXh0YXJlYSwgJ2NvbXBvc2l0aW9udXBkYXRlJywgdGVybS5jb21wb3NpdGlvbkhlbHBlci5jb21wb3NpdGlvbnVwZGF0ZS5iaW5kKHRlcm0uY29tcG9zaXRpb25IZWxwZXIpKTtcbiAgICBvbih0ZXJtLnRleHRhcmVhLCAnY29tcG9zaXRpb25lbmQnLCB0ZXJtLmNvbXBvc2l0aW9uSGVscGVyLmNvbXBvc2l0aW9uZW5kLmJpbmQodGVybS5jb21wb3NpdGlvbkhlbHBlcikpO1xuICAgIHRlcm0ub24oJ3JlZnJlc2gnLCB0ZXJtLmNvbXBvc2l0aW9uSGVscGVyLnVwZGF0ZUNvbXBvc2l0aW9uRWxlbWVudHMuYmluZCh0ZXJtLmNvbXBvc2l0aW9uSGVscGVyKSk7XG4gICAgdGVybS5vbigncmVmcmVzaCcsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHRlcm0ucXVldWVMaW5raWZpY2F0aW9uKGRhdGEuc3RhcnQsIGRhdGEuZW5kKTtcbiAgICB9KTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuaW5zZXJ0Um93ID0gZnVuY3Rpb24gKHJvdykge1xuICAgIGlmICh0eXBlb2Ygcm93ICE9ICdvYmplY3QnKSB7XG4gICAgICAgIHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIH1cbiAgICB0aGlzLnJvd0NvbnRhaW5lci5hcHBlbmRDaGlsZChyb3cpO1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaChyb3cpO1xuICAgIHJldHVybiByb3c7XG59O1xuVGVybWluYWwucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbiAocGFyZW50LCBmb2N1cykge1xuICAgIHZhciBzZWxmID0gdGhpcywgaSA9IDAsIGRpdjtcbiAgICB0aGlzLnBhcmVudCA9IHBhcmVudCB8fCB0aGlzLnBhcmVudDtcbiAgICBpZiAoIXRoaXMucGFyZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGVybWluYWwgcmVxdWlyZXMgYSBwYXJlbnQgZWxlbWVudC4nKTtcbiAgICB9XG4gICAgdGhpcy5jb250ZXh0ID0gdGhpcy5wYXJlbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcbiAgICB0aGlzLmRvY3VtZW50ID0gdGhpcy5wYXJlbnQub3duZXJEb2N1bWVudDtcbiAgICB0aGlzLmJvZHkgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF07XG4gICAgdGhpcy5lbGVtZW50ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndGVybWluYWwnKTtcbiAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgneHRlcm0nKTtcbiAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgneHRlcm0tdGhlbWUtJyArIHRoaXMudGhlbWUpO1xuICAgIHRoaXMuc2V0Q3Vyc29yQmxpbmtpbmcodGhpcy5vcHRpb25zLmN1cnNvckJsaW5rKTtcbiAgICB0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0O1xuICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgMCk7XG4gICAgdGhpcy52aWV3cG9ydEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLnZpZXdwb3J0RWxlbWVudC5jbGFzc0xpc3QuYWRkKCd4dGVybS12aWV3cG9ydCcpO1xuICAgIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnZpZXdwb3J0RWxlbWVudCk7XG4gICAgdGhpcy52aWV3cG9ydFNjcm9sbEFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLnZpZXdwb3J0U2Nyb2xsQXJlYS5jbGFzc0xpc3QuYWRkKCd4dGVybS1zY3JvbGwtYXJlYScpO1xuICAgIHRoaXMudmlld3BvcnRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudmlld3BvcnRTY3JvbGxBcmVhKTtcbiAgICB0aGlzLnJvd0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIHRoaXMucm93Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLXJvd3MnKTtcbiAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5yb3dDb250YWluZXIpO1xuICAgIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgICB0aGlzLmxpbmtpZmllci5hdHRhY2hUb0RvbShkb2N1bWVudCwgdGhpcy5jaGlsZHJlbik7XG4gICAgdGhpcy5oZWxwZXJDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmhlbHBlckNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd4dGVybS1oZWxwZXJzJyk7XG4gICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaGVscGVyQ29udGFpbmVyKTtcbiAgICB0aGlzLnRleHRhcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgICB0aGlzLnRleHRhcmVhLmNsYXNzTGlzdC5hZGQoJ3h0ZXJtLWhlbHBlci10ZXh0YXJlYScpO1xuICAgIHRoaXMudGV4dGFyZWEuc2V0QXR0cmlidXRlKCdhdXRvY29ycmVjdCcsICdvZmYnKTtcbiAgICB0aGlzLnRleHRhcmVhLnNldEF0dHJpYnV0ZSgnYXV0b2NhcGl0YWxpemUnLCAnb2ZmJyk7XG4gICAgdGhpcy50ZXh0YXJlYS5zZXRBdHRyaWJ1dGUoJ3NwZWxsY2hlY2snLCAnZmFsc2UnKTtcbiAgICB0aGlzLnRleHRhcmVhLnRhYkluZGV4ID0gMDtcbiAgICB0aGlzLnRleHRhcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLmVtaXQoJ2ZvY3VzJywgeyB0ZXJtaW5hbDogc2VsZiB9KTtcbiAgICB9KTtcbiAgICB0aGlzLnRleHRhcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnYmx1cicsIHsgdGVybWluYWw6IHNlbGYgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5oZWxwZXJDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy50ZXh0YXJlYSk7XG4gICAgdGhpcy5jb21wb3NpdGlvblZpZXcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLmNvbXBvc2l0aW9uVmlldy5jbGFzc0xpc3QuYWRkKCdjb21wb3NpdGlvbi12aWV3Jyk7XG4gICAgdGhpcy5jb21wb3NpdGlvbkhlbHBlciA9IG5ldyBDb21wb3NpdGlvbkhlbHBlcl8xLkNvbXBvc2l0aW9uSGVscGVyKHRoaXMudGV4dGFyZWEsIHRoaXMuY29tcG9zaXRpb25WaWV3LCB0aGlzKTtcbiAgICB0aGlzLmhlbHBlckNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmNvbXBvc2l0aW9uVmlldyk7XG4gICAgdGhpcy5jaGFyU2l6ZVN0eWxlRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgdGhpcy5oZWxwZXJDb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jaGFyU2l6ZVN0eWxlRWxlbWVudCk7XG4gICAgZm9yICg7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgICB0aGlzLmluc2VydFJvdygpO1xuICAgIH1cbiAgICB0aGlzLnBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpO1xuICAgIHRoaXMuY2hhck1lYXN1cmUgPSBuZXcgQ2hhck1lYXN1cmVfMS5DaGFyTWVhc3VyZShkb2N1bWVudCwgdGhpcy5oZWxwZXJDb250YWluZXIpO1xuICAgIHRoaXMuY2hhck1lYXN1cmUub24oJ2NoYXJzaXplY2hhbmdlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi51cGRhdGVDaGFyU2l6ZUNTUygpO1xuICAgIH0pO1xuICAgIHRoaXMuY2hhck1lYXN1cmUubWVhc3VyZSgpO1xuICAgIHRoaXMudmlld3BvcnQgPSBuZXcgVmlld3BvcnRfMS5WaWV3cG9ydCh0aGlzLCB0aGlzLnZpZXdwb3J0RWxlbWVudCwgdGhpcy52aWV3cG9ydFNjcm9sbEFyZWEsIHRoaXMuY2hhck1lYXN1cmUpO1xuICAgIHRoaXMucmVuZGVyZXIgPSBuZXcgUmVuZGVyZXJfMS5SZW5kZXJlcih0aGlzKTtcbiAgICB0aGlzLnJlZnJlc2goMCwgdGhpcy5yb3dzIC0gMSk7XG4gICAgdGhpcy5pbml0R2xvYmFsKCk7XG4gICAgaWYgKHR5cGVvZiBmb2N1cyA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIgbWVzc2FnZSA9ICdZb3UgZGlkIG5vdCBwYXNzIHRoZSBgZm9jdXNgIGFyZ3VtZW50IGluIGBUZXJtaW5hbC5wcm90b3R5cGUub3BlbigpYC5cXG4nO1xuICAgICAgICBtZXNzYWdlICs9ICdUaGUgYGZvY3VzYCBhcmd1bWVudCBub3cgZGVmYXVsdHMgdG8gYHRydWVgIGJ1dCBzdGFydGluZyB3aXRoIHh0ZXJtLmpzIDMuMCAnO1xuICAgICAgICBtZXNzYWdlICs9ICdpdCB3aWxsIGRlZmF1bHQgdG8gYGZhbHNlYC4nO1xuICAgICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgICAgIGZvY3VzID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGZvY3VzKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKTtcbiAgICB9XG4gICAgb24odGhpcy5lbGVtZW50LCAnY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBzZWxlY3Rpb24gPSBkb2N1bWVudC5nZXRTZWxlY3Rpb24oKSwgY29sbGFwc2VkID0gc2VsZWN0aW9uLmlzQ29sbGFwc2VkLCBpc1JhbmdlID0gdHlwZW9mIGNvbGxhcHNlZCA9PSAnYm9vbGVhbicgPyAhY29sbGFwc2VkIDogc2VsZWN0aW9uLnR5cGUgPT0gJ1JhbmdlJztcbiAgICAgICAgaWYgKCFpc1JhbmdlKSB7XG4gICAgICAgICAgICBzZWxmLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmJpbmRNb3VzZSgpO1xuICAgIHRoaXMuZW1pdCgnb3BlbicpO1xufTtcblRlcm1pbmFsLmxvYWRBZGRvbiA9IGZ1bmN0aW9uIChhZGRvbiwgY2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlKCcuL2FkZG9ucy8nICsgYWRkb24gKyAnLycgKyBhZGRvbik7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gcmVxdWlyZShbJy4vYWRkb25zLycgKyBhZGRvbiArICcvJyArIGFkZG9uXSwgY2FsbGJhY2spO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IGxvYWQgYSBtb2R1bGUgd2l0aG91dCBhIENvbW1vbkpTIG9yIFJlcXVpcmVKUyBlbnZpcm9ubWVudC4nKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG5UZXJtaW5hbC5wcm90b3R5cGUudXBkYXRlQ2hhclNpemVDU1MgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5jaGFyU2l6ZVN0eWxlRWxlbWVudC50ZXh0Q29udGVudCA9ICcueHRlcm0td2lkZS1jaGFye3dpZHRoOicgKyAodGhpcy5jaGFyTWVhc3VyZS53aWR0aCAqIDIpICsgJ3B4O30nO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5iaW5kTW91c2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGVsID0gdGhpcy5lbGVtZW50LCBzZWxmID0gdGhpcywgcHJlc3NlZCA9IDMyO1xuICAgIGZ1bmN0aW9uIHNlbmRCdXR0b24oZXYpIHtcbiAgICAgICAgdmFyIGJ1dHRvbiwgcG9zO1xuICAgICAgICBidXR0b24gPSBnZXRCdXR0b24oZXYpO1xuICAgICAgICBwb3MgPSBnZXRDb29yZHMoZXYpO1xuICAgICAgICBpZiAoIXBvcylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgc2VuZEV2ZW50KGJ1dHRvbiwgcG9zKTtcbiAgICAgICAgc3dpdGNoIChldi5vdmVycmlkZVR5cGUgfHwgZXYudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnbW91c2Vkb3duJzpcbiAgICAgICAgICAgICAgICBwcmVzc2VkID0gYnV0dG9uO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW91c2V1cCc6XG4gICAgICAgICAgICAgICAgcHJlc3NlZCA9IDMyO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnd2hlZWwnOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNlbmRNb3ZlKGV2KSB7XG4gICAgICAgIHZhciBidXR0b24gPSBwcmVzc2VkLCBwb3M7XG4gICAgICAgIHBvcyA9IGdldENvb3Jkcyhldik7XG4gICAgICAgIGlmICghcG9zKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBidXR0b24gKz0gMzI7XG4gICAgICAgIHNlbmRFdmVudChidXR0b24sIHBvcyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVuY29kZShkYXRhLCBjaCkge1xuICAgICAgICBpZiAoIXNlbGYudXRmTW91c2UpIHtcbiAgICAgICAgICAgIGlmIChjaCA9PT0gMjU1KVxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLnB1c2goMCk7XG4gICAgICAgICAgICBpZiAoY2ggPiAxMjcpXG4gICAgICAgICAgICAgICAgY2ggPSAxMjc7XG4gICAgICAgICAgICBkYXRhLnB1c2goY2gpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNoID09PSAyMDQ3KVxuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLnB1c2goMCk7XG4gICAgICAgICAgICBpZiAoY2ggPCAxMjcpIHtcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2goY2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGNoID4gMjA0NylcbiAgICAgICAgICAgICAgICAgICAgY2ggPSAyMDQ3O1xuICAgICAgICAgICAgICAgIGRhdGEucHVzaCgweEMwIHwgKGNoID4+IDYpKTtcbiAgICAgICAgICAgICAgICBkYXRhLnB1c2goMHg4MCB8IChjaCAmIDB4M0YpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBzZW5kRXZlbnQoYnV0dG9uLCBwb3MpIHtcbiAgICAgICAgaWYgKHNlbGYudnQzMDBNb3VzZSkge1xuICAgICAgICAgICAgYnV0dG9uICY9IDM7XG4gICAgICAgICAgICBwb3MueCAtPSAzMjtcbiAgICAgICAgICAgIHBvcy55IC09IDMyO1xuICAgICAgICAgICAgdmFyIGRhdGEgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzI0JztcbiAgICAgICAgICAgIGlmIChidXR0b24gPT09IDApXG4gICAgICAgICAgICAgICAgZGF0YSArPSAnMSc7XG4gICAgICAgICAgICBlbHNlIGlmIChidXR0b24gPT09IDEpXG4gICAgICAgICAgICAgICAgZGF0YSArPSAnMyc7XG4gICAgICAgICAgICBlbHNlIGlmIChidXR0b24gPT09IDIpXG4gICAgICAgICAgICAgICAgZGF0YSArPSAnNSc7XG4gICAgICAgICAgICBlbHNlIGlmIChidXR0b24gPT09IDMpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIGRhdGEgKz0gJzAnO1xuICAgICAgICAgICAgZGF0YSArPSAnflsnICsgcG9zLnggKyAnLCcgKyBwb3MueSArICddXFxyJztcbiAgICAgICAgICAgIHNlbGYuc2VuZChkYXRhKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZi5kZWNMb2NhdG9yKSB7XG4gICAgICAgICAgICBidXR0b24gJj0gMztcbiAgICAgICAgICAgIHBvcy54IC09IDMyO1xuICAgICAgICAgICAgcG9zLnkgLT0gMzI7XG4gICAgICAgICAgICBpZiAoYnV0dG9uID09PSAwKVxuICAgICAgICAgICAgICAgIGJ1dHRvbiA9IDI7XG4gICAgICAgICAgICBlbHNlIGlmIChidXR0b24gPT09IDEpXG4gICAgICAgICAgICAgICAgYnV0dG9uID0gNDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGJ1dHRvbiA9PT0gMilcbiAgICAgICAgICAgICAgICBidXR0b24gPSA2O1xuICAgICAgICAgICAgZWxzZSBpZiAoYnV0dG9uID09PSAzKVxuICAgICAgICAgICAgICAgIGJ1dHRvbiA9IDM7XG4gICAgICAgICAgICBzZWxmLnNlbmQoRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1snXG4gICAgICAgICAgICAgICAgKyBidXR0b25cbiAgICAgICAgICAgICAgICArICc7J1xuICAgICAgICAgICAgICAgICsgKGJ1dHRvbiA9PT0gMyA/IDQgOiAwKVxuICAgICAgICAgICAgICAgICsgJzsnXG4gICAgICAgICAgICAgICAgKyBwb3MueVxuICAgICAgICAgICAgICAgICsgJzsnXG4gICAgICAgICAgICAgICAgKyBwb3MueFxuICAgICAgICAgICAgICAgICsgJzsnXG4gICAgICAgICAgICAgICAgKyAocG9zLnBhZ2UgfHwgMClcbiAgICAgICAgICAgICAgICArICcmdycpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxmLnVyeHZ0TW91c2UpIHtcbiAgICAgICAgICAgIHBvcy54IC09IDMyO1xuICAgICAgICAgICAgcG9zLnkgLT0gMzI7XG4gICAgICAgICAgICBwb3MueCsrO1xuICAgICAgICAgICAgcG9zLnkrKztcbiAgICAgICAgICAgIHNlbGYuc2VuZChFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWycgKyBidXR0b24gKyAnOycgKyBwb3MueCArICc7JyArIHBvcy55ICsgJ00nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VsZi5zZ3JNb3VzZSkge1xuICAgICAgICAgICAgcG9zLnggLT0gMzI7XG4gICAgICAgICAgICBwb3MueSAtPSAzMjtcbiAgICAgICAgICAgIHNlbGYuc2VuZChFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzwnXG4gICAgICAgICAgICAgICAgKyAoKChidXR0b24gJiAzKSA9PT0gMyA/IGJ1dHRvbiAmIH4zIDogYnV0dG9uKSAtIDMyKVxuICAgICAgICAgICAgICAgICsgJzsnXG4gICAgICAgICAgICAgICAgKyBwb3MueFxuICAgICAgICAgICAgICAgICsgJzsnXG4gICAgICAgICAgICAgICAgKyBwb3MueVxuICAgICAgICAgICAgICAgICsgKChidXR0b24gJiAzKSA9PT0gMyA/ICdtJyA6ICdNJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXRhID0gW107XG4gICAgICAgIGVuY29kZShkYXRhLCBidXR0b24pO1xuICAgICAgICBlbmNvZGUoZGF0YSwgcG9zLngpO1xuICAgICAgICBlbmNvZGUoZGF0YSwgcG9zLnkpO1xuICAgICAgICBzZWxmLnNlbmQoRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1tNJyArIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBkYXRhKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEJ1dHRvbihldikge1xuICAgICAgICB2YXIgYnV0dG9uLCBzaGlmdCwgbWV0YSwgY3RybCwgbW9kO1xuICAgICAgICBzd2l0Y2ggKGV2Lm92ZXJyaWRlVHlwZSB8fCBldi50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdtb3VzZWRvd24nOlxuICAgICAgICAgICAgICAgIGJ1dHRvbiA9IGV2LmJ1dHRvbiAhPSBudWxsXG4gICAgICAgICAgICAgICAgICAgID8gK2V2LmJ1dHRvblxuICAgICAgICAgICAgICAgICAgICA6IGV2LndoaWNoICE9IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZXYud2hpY2ggLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYuYnJvd3Nlci5pc01TSUUpIHtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uID0gYnV0dG9uID09PSAxID8gMCA6IGJ1dHRvbiA9PT0gNCA/IDEgOiBidXR0b247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW91c2V1cCc6XG4gICAgICAgICAgICAgICAgYnV0dG9uID0gMztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0RPTU1vdXNlU2Nyb2xsJzpcbiAgICAgICAgICAgICAgICBidXR0b24gPSBldi5kZXRhaWwgPCAwXG4gICAgICAgICAgICAgICAgICAgID8gNjRcbiAgICAgICAgICAgICAgICAgICAgOiA2NTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3doZWVsJzpcbiAgICAgICAgICAgICAgICBidXR0b24gPSBldi53aGVlbERlbHRhWSA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyA2NFxuICAgICAgICAgICAgICAgICAgICA6IDY1O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHNoaWZ0ID0gZXYuc2hpZnRLZXkgPyA0IDogMDtcbiAgICAgICAgbWV0YSA9IGV2Lm1ldGFLZXkgPyA4IDogMDtcbiAgICAgICAgY3RybCA9IGV2LmN0cmxLZXkgPyAxNiA6IDA7XG4gICAgICAgIG1vZCA9IHNoaWZ0IHwgbWV0YSB8IGN0cmw7XG4gICAgICAgIGlmIChzZWxmLnZ0MjAwTW91c2UpIHtcbiAgICAgICAgICAgIG1vZCAmPSBjdHJsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFzZWxmLm5vcm1hbE1vdXNlKSB7XG4gICAgICAgICAgICBtb2QgPSAwO1xuICAgICAgICB9XG4gICAgICAgIGJ1dHRvbiA9ICgzMiArIChtb2QgPDwgMikpICsgYnV0dG9uO1xuICAgICAgICByZXR1cm4gYnV0dG9uO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDb29yZHMoZXYpIHtcbiAgICAgICAgdmFyIHgsIHksIHcsIGgsIGVsO1xuICAgICAgICBpZiAoZXYucGFnZVggPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgeCA9IGV2LnBhZ2VYO1xuICAgICAgICB5ID0gZXYucGFnZVk7XG4gICAgICAgIGVsID0gc2VsZi5lbGVtZW50O1xuICAgICAgICB3aGlsZSAoZWwgJiYgZWwgIT09IHNlbGYuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICAgICAgICB4IC09IGVsLm9mZnNldExlZnQ7XG4gICAgICAgICAgICB5IC09IGVsLm9mZnNldFRvcDtcbiAgICAgICAgICAgIGVsID0gJ29mZnNldFBhcmVudCcgaW4gZWxcbiAgICAgICAgICAgICAgICA/IGVsLm9mZnNldFBhcmVudFxuICAgICAgICAgICAgICAgIDogZWwucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICB4ID0gTWF0aC5jZWlsKHggLyBzZWxmLmNoYXJNZWFzdXJlLndpZHRoKTtcbiAgICAgICAgeSA9IE1hdGguY2VpbCh5IC8gc2VsZi5jaGFyTWVhc3VyZS5oZWlnaHQpO1xuICAgICAgICBpZiAoeCA8IDApXG4gICAgICAgICAgICB4ID0gMDtcbiAgICAgICAgaWYgKHggPiBzZWxmLmNvbHMpXG4gICAgICAgICAgICB4ID0gc2VsZi5jb2xzO1xuICAgICAgICBpZiAoeSA8IDApXG4gICAgICAgICAgICB5ID0gMDtcbiAgICAgICAgaWYgKHkgPiBzZWxmLnJvd3MpXG4gICAgICAgICAgICB5ID0gc2VsZi5yb3dzO1xuICAgICAgICB4ICs9IDMyO1xuICAgICAgICB5ICs9IDMyO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgeDogeCxcbiAgICAgICAgICAgIHk6IHksXG4gICAgICAgICAgICB0eXBlOiAnd2hlZWwnXG4gICAgICAgIH07XG4gICAgfVxuICAgIG9uKGVsLCAnbW91c2Vkb3duJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIGlmICghc2VsZi5tb3VzZUV2ZW50cylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgc2VuZEJ1dHRvbihldik7XG4gICAgICAgIHNlbGYuZm9jdXMoKTtcbiAgICAgICAgaWYgKHNlbGYudnQyMDBNb3VzZSkge1xuICAgICAgICAgICAgZXYub3ZlcnJpZGVUeXBlID0gJ21vdXNldXAnO1xuICAgICAgICAgICAgc2VuZEJ1dHRvbihldik7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWwoZXYpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWxmLm5vcm1hbE1vdXNlKVxuICAgICAgICAgICAgb24oc2VsZi5kb2N1bWVudCwgJ21vdXNlbW92ZScsIHNlbmRNb3ZlKTtcbiAgICAgICAgaWYgKCFzZWxmLngxME1vdXNlKSB7XG4gICAgICAgICAgICBvbihzZWxmLmRvY3VtZW50LCAnbW91c2V1cCcsIGZ1bmN0aW9uIHVwKGV2KSB7XG4gICAgICAgICAgICAgICAgc2VuZEJ1dHRvbihldik7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGYubm9ybWFsTW91c2UpXG4gICAgICAgICAgICAgICAgICAgIG9mZihzZWxmLmRvY3VtZW50LCAnbW91c2Vtb3ZlJywgc2VuZE1vdmUpO1xuICAgICAgICAgICAgICAgIG9mZihzZWxmLmRvY3VtZW50LCAnbW91c2V1cCcsIHVwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWwoZXYpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsKGV2KTtcbiAgICB9KTtcbiAgICBvbihlbCwgJ3doZWVsJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIGlmICghc2VsZi5tb3VzZUV2ZW50cylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKHNlbGYueDEwTW91c2VcbiAgICAgICAgICAgIHx8IHNlbGYudnQzMDBNb3VzZVxuICAgICAgICAgICAgfHwgc2VsZi5kZWNMb2NhdG9yKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBzZW5kQnV0dG9uKGV2KTtcbiAgICAgICAgcmV0dXJuIHNlbGYuY2FuY2VsKGV2KTtcbiAgICB9KTtcbiAgICBvbihlbCwgJ3doZWVsJywgZnVuY3Rpb24gKGV2KSB7XG4gICAgICAgIGlmIChzZWxmLm1vdXNlRXZlbnRzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBzZWxmLnZpZXdwb3J0Lm9uV2hlZWwoZXYpO1xuICAgICAgICByZXR1cm4gc2VsZi5jYW5jZWwoZXYpO1xuICAgIH0pO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMucmVhZGFibGUgPSBmYWxzZTtcbiAgICB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG4gICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24gKCkgeyB9O1xuICAgIHRoaXMud3JpdGUgPSBmdW5jdGlvbiAoKSB7IH07XG4gICAgaWYgKHRoaXMuZWxlbWVudCAmJiB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICB0aGlzLmVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnQpO1xuICAgIH1cbn07XG5UZXJtaW5hbC5wcm90b3R5cGUucmVmcmVzaCA9IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5xdWV1ZVJlZnJlc2goc3RhcnQsIGVuZCk7XG4gICAgfVxufTtcblRlcm1pbmFsLnByb3RvdHlwZS5xdWV1ZUxpbmtpZmljYXRpb24gPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCkge1xuICAgIGlmICh0aGlzLmxpbmtpZmllcikge1xuICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMubGlua2lmaWVyLmxpbmtpZnlSb3coaSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuVGVybWluYWwucHJvdG90eXBlLnNob3dDdXJzb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLmN1cnNvclN0YXRlKSB7XG4gICAgICAgIHRoaXMuY3Vyc29yU3RhdGUgPSAxO1xuICAgICAgICB0aGlzLnJlZnJlc2godGhpcy55LCB0aGlzLnkpO1xuICAgIH1cbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuc2Nyb2xsID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciByb3c7XG4gICAgaWYgKHRoaXMubGluZXMubGVuZ3RoID09PSB0aGlzLmxpbmVzLm1heExlbmd0aCkge1xuICAgICAgICB0aGlzLmxpbmVzLnRyaW1TdGFydCgxKTtcbiAgICAgICAgdGhpcy55YmFzZS0tO1xuICAgICAgICBpZiAodGhpcy55ZGlzcCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy55ZGlzcC0tO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRoaXMueWJhc2UrKztcbiAgICBpZiAoIXRoaXMudXNlclNjcm9sbGluZykge1xuICAgICAgICB0aGlzLnlkaXNwID0gdGhpcy55YmFzZTtcbiAgICB9XG4gICAgcm93ID0gdGhpcy55YmFzZSArIHRoaXMucm93cyAtIDE7XG4gICAgcm93IC09IHRoaXMucm93cyAtIDEgLSB0aGlzLnNjcm9sbEJvdHRvbTtcbiAgICBpZiAocm93ID09PSB0aGlzLmxpbmVzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmxpbmVzLnB1c2godGhpcy5ibGFua0xpbmUoKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aGlzLmxpbmVzLnNwbGljZShyb3csIDAsIHRoaXMuYmxhbmtMaW5lKCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zY3JvbGxUb3AgIT09IDApIHtcbiAgICAgICAgaWYgKHRoaXMueWJhc2UgIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMueWJhc2UtLTtcbiAgICAgICAgICAgIGlmICghdGhpcy51c2VyU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy55ZGlzcCA9IHRoaXMueWJhc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5saW5lcy5zcGxpY2UodGhpcy55YmFzZSArIHRoaXMuc2Nyb2xsVG9wLCAxKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVSYW5nZSh0aGlzLnNjcm9sbFRvcCk7XG4gICAgdGhpcy51cGRhdGVSYW5nZSh0aGlzLnNjcm9sbEJvdHRvbSk7XG4gICAgdGhpcy5lbWl0KCdzY3JvbGwnLCB0aGlzLnlkaXNwKTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuc2Nyb2xsRGlzcCA9IGZ1bmN0aW9uIChkaXNwLCBzdXBwcmVzc1Njcm9sbEV2ZW50KSB7XG4gICAgaWYgKGRpc3AgPCAwKSB7XG4gICAgICAgIHRoaXMudXNlclNjcm9sbGluZyA9IHRydWU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRpc3AgKyB0aGlzLnlkaXNwID49IHRoaXMueWJhc2UpIHtcbiAgICAgICAgdGhpcy51c2VyU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMueWRpc3AgKz0gZGlzcDtcbiAgICBpZiAodGhpcy55ZGlzcCA+IHRoaXMueWJhc2UpIHtcbiAgICAgICAgdGhpcy55ZGlzcCA9IHRoaXMueWJhc2U7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRoaXMueWRpc3AgPCAwKSB7XG4gICAgICAgIHRoaXMueWRpc3AgPSAwO1xuICAgIH1cbiAgICBpZiAoIXN1cHByZXNzU2Nyb2xsRXZlbnQpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdzY3JvbGwnLCB0aGlzLnlkaXNwKTtcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoKDAsIHRoaXMucm93cyAtIDEpO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5zY3JvbGxQYWdlcyA9IGZ1bmN0aW9uIChwYWdlQ291bnQpIHtcbiAgICB0aGlzLnNjcm9sbERpc3AocGFnZUNvdW50ICogKHRoaXMucm93cyAtIDEpKTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuc2Nyb2xsVG9Ub3AgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5zY3JvbGxEaXNwKC10aGlzLnlkaXNwKTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuc2Nyb2xsVG9Cb3R0b20gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5zY3JvbGxEaXNwKHRoaXMueWJhc2UgLSB0aGlzLnlkaXNwKTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHRoaXMud3JpdGVCdWZmZXIucHVzaChkYXRhKTtcbiAgICBpZiAodGhpcy5vcHRpb25zLnVzZUZsb3dDb250cm9sICYmICF0aGlzLnhvZmZTZW50VG9DYXRjaFVwICYmIHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoID49IFdSSVRFX0JVRkZFUl9QQVVTRV9USFJFU0hPTEQpIHtcbiAgICAgICAgdGhpcy5zZW5kKEVzY2FwZVNlcXVlbmNlc18xLkMwLkRDMyk7XG4gICAgICAgIHRoaXMueG9mZlNlbnRUb0NhdGNoVXAgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMud3JpdGVJblByb2dyZXNzICYmIHRoaXMud3JpdGVCdWZmZXIubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLndyaXRlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLmlubmVyV3JpdGUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxufTtcblRlcm1pbmFsLnByb3RvdHlwZS5pbm5lcldyaXRlID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciB3cml0ZUJhdGNoID0gdGhpcy53cml0ZUJ1ZmZlci5zcGxpY2UoMCwgV1JJVEVfQkFUQ0hfU0laRSk7XG4gICAgd2hpbGUgKHdyaXRlQmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgZGF0YSA9IHdyaXRlQmF0Y2guc2hpZnQoKTtcbiAgICAgICAgdmFyIGwgPSBkYXRhLmxlbmd0aCwgaSA9IDAsIGosIGNzLCBjaCwgY29kZSwgbG93LCBjaF93aWR0aCwgcm93O1xuICAgICAgICBpZiAodGhpcy54b2ZmU2VudFRvQ2F0Y2hVcCAmJiB3cml0ZUJhdGNoLmxlbmd0aCA9PT0gMCAmJiB0aGlzLndyaXRlQnVmZmVyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5zZW5kKEVzY2FwZVNlcXVlbmNlc18xLkMwLkRDMSk7XG4gICAgICAgICAgICB0aGlzLnhvZmZTZW50VG9DYXRjaFVwID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWZyZXNoU3RhcnQgPSB0aGlzLnk7XG4gICAgICAgIHRoaXMucmVmcmVzaEVuZCA9IHRoaXMueTtcbiAgICAgICAgdGhpcy5wYXJzZXIucGFyc2UoZGF0YSk7XG4gICAgICAgIHRoaXMudXBkYXRlUmFuZ2UodGhpcy55KTtcbiAgICAgICAgdGhpcy5yZWZyZXNoKHRoaXMucmVmcmVzaFN0YXJ0LCB0aGlzLnJlZnJlc2hFbmQpO1xuICAgIH1cbiAgICBpZiAodGhpcy53cml0ZUJ1ZmZlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLmlubmVyV3JpdGUoKTtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aGlzLndyaXRlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIH1cbn07XG5UZXJtaW5hbC5wcm90b3R5cGUud3JpdGVsbiA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdGhpcy53cml0ZShkYXRhICsgJ1xcclxcbicpO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5hdHRhY2hDdXN0b21LZXlkb3duSGFuZGxlciA9IGZ1bmN0aW9uIChjdXN0b21LZXlkb3duSGFuZGxlcikge1xuICAgIHRoaXMuY3VzdG9tS2V5ZG93bkhhbmRsZXIgPSBjdXN0b21LZXlkb3duSGFuZGxlcjtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuc2V0SHlwZXJ0ZXh0TGlua0hhbmRsZXIgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgIGlmICghdGhpcy5saW5raWZpZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYXR0YWNoIGEgaHlwZXJ0ZXh0IGxpbmsgaGFuZGxlciBiZWZvcmUgVGVybWluYWwub3BlbiBpcyBjYWxsZWQnKTtcbiAgICB9XG4gICAgdGhpcy5saW5raWZpZXIuc2V0SHlwZXJ0ZXh0TGlua0hhbmRsZXIoaGFuZGxlcik7XG4gICAgdGhpcy5yZWZyZXNoKDAsIHRoaXMucm93cyAtIDEpO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5zZXRIeXBlcnRleHRWYWxpZGF0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiAoaGFuZGxlcikge1xuICAgIGlmICghdGhpcy5saW5raWZpZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYXR0YWNoIGEgaHlwZXJ0ZXh0IHZhbGlkYXRpb24gY2FsbGJhY2sgYmVmb3JlIFRlcm1pbmFsLm9wZW4gaXMgY2FsbGVkJyk7XG4gICAgfVxuICAgIHRoaXMubGlua2lmaWVyLnNldEh5cGVydGV4dFZhbGlkYXRpb25DYWxsYmFjayhoYW5kbGVyKTtcbiAgICB0aGlzLnJlZnJlc2goMCwgdGhpcy5yb3dzIC0gMSk7XG59O1xuVGVybWluYWwucHJvdG90eXBlLnJlZ2lzdGVyTGlua01hdGNoZXIgPSBmdW5jdGlvbiAocmVnZXgsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5saW5raWZpZXIpIHtcbiAgICAgICAgdmFyIG1hdGNoZXJJZCA9IHRoaXMubGlua2lmaWVyLnJlZ2lzdGVyTGlua01hdGNoZXIocmVnZXgsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnJlZnJlc2goMCwgdGhpcy5yb3dzIC0gMSk7XG4gICAgICAgIHJldHVybiBtYXRjaGVySWQ7XG4gICAgfVxufTtcblRlcm1pbmFsLnByb3RvdHlwZS5kZXJlZ2lzdGVyTGlua01hdGNoZXIgPSBmdW5jdGlvbiAobWF0Y2hlcklkKSB7XG4gICAgaWYgKHRoaXMubGlua2lmaWVyKSB7XG4gICAgICAgIGlmICh0aGlzLmxpbmtpZmllci5kZXJlZ2lzdGVyTGlua01hdGNoZXIobWF0Y2hlcklkKSkge1xuICAgICAgICAgICAgdGhpcy5yZWZyZXNoKDAsIHRoaXMucm93cyAtIDEpO1xuICAgICAgICB9XG4gICAgfVxufTtcblRlcm1pbmFsLnByb3RvdHlwZS5rZXlEb3duID0gZnVuY3Rpb24gKGV2KSB7XG4gICAgaWYgKHRoaXMuY3VzdG9tS2V5ZG93bkhhbmRsZXIgJiYgdGhpcy5jdXN0b21LZXlkb3duSGFuZGxlcihldikgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5yZXN0YXJ0Q3Vyc29yQmxpbmtpbmcoKTtcbiAgICBpZiAoIXRoaXMuY29tcG9zaXRpb25IZWxwZXIua2V5ZG93bi5iaW5kKHRoaXMuY29tcG9zaXRpb25IZWxwZXIpKGV2KSkge1xuICAgICAgICBpZiAodGhpcy55YmFzZSAhPT0gdGhpcy55ZGlzcCkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciByZXN1bHQgPSB0aGlzLmV2YWx1YXRlS2V5RXNjYXBlU2VxdWVuY2UoZXYpO1xuICAgIGlmIChyZXN1bHQua2V5ID09PSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5EQzMpIHtcbiAgICAgICAgdGhpcy53cml0ZVN0b3BwZWQgPSB0cnVlO1xuICAgIH1cbiAgICBlbHNlIGlmIChyZXN1bHQua2V5ID09PSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5EQzEpIHtcbiAgICAgICAgdGhpcy53cml0ZVN0b3BwZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC5zY3JvbGxEaXNwKSB7XG4gICAgICAgIHRoaXMuc2Nyb2xsRGlzcChyZXN1bHQuc2Nyb2xsRGlzcCk7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbmNlbChldiwgdHJ1ZSk7XG4gICAgfVxuICAgIGlmIChpc1RoaXJkTGV2ZWxTaGlmdCh0aGlzLCBldikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChyZXN1bHQuY2FuY2VsKSB7XG4gICAgICAgIHRoaXMuY2FuY2VsKGV2LCB0cnVlKTtcbiAgICB9XG4gICAgaWYgKCFyZXN1bHQua2V5KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmVtaXQoJ2tleWRvd24nLCBldik7XG4gICAgdGhpcy5lbWl0KCdrZXknLCByZXN1bHQua2V5LCBldik7XG4gICAgdGhpcy5zaG93Q3Vyc29yKCk7XG4gICAgdGhpcy5oYW5kbGVyKHJlc3VsdC5rZXkpO1xuICAgIHJldHVybiB0aGlzLmNhbmNlbChldiwgdHJ1ZSk7XG59O1xuVGVybWluYWwucHJvdG90eXBlLmV2YWx1YXRlS2V5RXNjYXBlU2VxdWVuY2UgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICB2YXIgcmVzdWx0ID0ge1xuICAgICAgICBjYW5jZWw6IGZhbHNlLFxuICAgICAgICBrZXk6IHVuZGVmaW5lZCxcbiAgICAgICAgc2Nyb2xsRGlzcDogdW5kZWZpbmVkXG4gICAgfTtcbiAgICB2YXIgbW9kaWZpZXJzID0gZXYuc2hpZnRLZXkgPDwgMCB8IGV2LmFsdEtleSA8PCAxIHwgZXYuY3RybEtleSA8PCAyIHwgZXYubWV0YUtleSA8PCAzO1xuICAgIHN3aXRjaCAoZXYua2V5Q29kZSkge1xuICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICBpZiAoZXYuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuQlM7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuREVMO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgIGlmIChldi5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnW1onO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkhUO1xuICAgICAgICAgICAgcmVzdWx0LmNhbmNlbCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5DUjtcbiAgICAgICAgICAgIHJlc3VsdC5jYW5jZWwgPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjc6XG4gICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDO1xuICAgICAgICAgICAgcmVzdWx0LmNhbmNlbCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzNzpcbiAgICAgICAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1sxOycgKyAobW9kaWZpZXJzICsgMSkgKyAnRCc7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5rZXkgPT0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1sxOzNEJykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gKHRoaXMuYnJvd3Nlci5pc01hYykgPyBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnYicgOiBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzE7NUQnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuYXBwbGljYXRpb25DdXJzb3IpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ09EJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnW0QnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzk6XG4gICAgICAgICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTsnICsgKG1vZGlmaWVycyArIDEpICsgJ0MnO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQua2V5ID09IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTszQycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9ICh0aGlzLmJyb3dzZXIuaXNNYWMpID8gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ2YnIDogRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1sxOzVDJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmFwcGxpY2F0aW9uQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdPQyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1tDJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM4OlxuICAgICAgICAgICAgaWYgKG1vZGlmaWVycykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzE7JyArIChtb2RpZmllcnMgKyAxKSArICdBJztcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmtleSA9PSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzE7M0EnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzE7NUEnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuYXBwbGljYXRpb25DdXJzb3IpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ09BJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnW0EnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDA6XG4gICAgICAgICAgICBpZiAobW9kaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTsnICsgKG1vZGlmaWVycyArIDEpICsgJ0InO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQua2V5ID09IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTszQicpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTs1Qic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5hcHBsaWNhdGlvbkN1cnNvcikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnT0InO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbQic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0NTpcbiAgICAgICAgICAgIGlmICghZXYuc2hpZnRLZXkgJiYgIWV2LmN0cmxLZXkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1syfic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0NjpcbiAgICAgICAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1szOycgKyAobW9kaWZpZXJzICsgMSkgKyAnfic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1szfic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzNjpcbiAgICAgICAgICAgIGlmIChtb2RpZmllcnMpXG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTsnICsgKG1vZGlmaWVycyArIDEpICsgJ0gnO1xuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5hcHBsaWNhdGlvbkN1cnNvcilcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ09IJztcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1tIJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM1OlxuICAgICAgICAgICAgaWYgKG1vZGlmaWVycylcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1sxOycgKyAobW9kaWZpZXJzICsgMSkgKyAnRic7XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmFwcGxpY2F0aW9uQ3Vyc29yKVxuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnT0YnO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnW0YnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzM6XG4gICAgICAgICAgICBpZiAoZXYuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuc2Nyb2xsRGlzcCA9IC0odGhpcy5yb3dzIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1s1fic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzNDpcbiAgICAgICAgICAgIGlmIChldi5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zY3JvbGxEaXNwID0gdGhpcy5yb3dzIC0gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAnWzZ+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDExMjpcbiAgICAgICAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1sxOycgKyAobW9kaWZpZXJzICsgMSkgKyAnUCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ09QJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDExMzpcbiAgICAgICAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1sxOycgKyAobW9kaWZpZXJzICsgMSkgKyAnUSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ09RJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDExNDpcbiAgICAgICAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1sxOycgKyAobW9kaWZpZXJzICsgMSkgKyAnUic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ09SJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDExNTpcbiAgICAgICAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1sxOycgKyAobW9kaWZpZXJzICsgMSkgKyAnUyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ09TJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDExNjpcbiAgICAgICAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1sxNTsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTV+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDExNzpcbiAgICAgICAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1sxNzsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTd+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDExODpcbiAgICAgICAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1sxODsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTh+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDExOTpcbiAgICAgICAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1sxOTsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMTl+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEyMDpcbiAgICAgICAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1syMDsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMjB+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEyMTpcbiAgICAgICAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1syMTsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMjF+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEyMjpcbiAgICAgICAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1syMzsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMjN+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEyMzpcbiAgICAgICAgICAgIGlmIChtb2RpZmllcnMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgJ1syNDsnICsgKG1vZGlmaWVycyArIDEpICsgJ34nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdbMjR+JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKGV2LmN0cmxLZXkgJiYgIWV2LnNoaWZ0S2V5ICYmICFldi5hbHRLZXkgJiYgIWV2Lm1ldGFLZXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXYua2V5Q29kZSA+PSA2NSAmJiBldi5rZXlDb2RlIDw9IDkwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGV2LmtleUNvZGUgLSA2NCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGV2LmtleUNvZGUgPT09IDMyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChldi5rZXlDb2RlID49IDUxICYmIGV2LmtleUNvZGUgPD0gNTUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZXYua2V5Q29kZSAtIDUxICsgMjcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChldi5rZXlDb2RlID09PSA1Nikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gU3RyaW5nLmZyb21DaGFyQ29kZSgxMjcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChldi5rZXlDb2RlID09PSAyMTkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMjcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChldi5rZXlDb2RlID09PSAyMjApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMjgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChldi5rZXlDb2RlID09PSAyMjEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMjkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmJyb3dzZXIuaXNNYWMgJiYgZXYuYWx0S2V5ICYmICFldi5jdHJsS2V5ICYmICFldi5tZXRhS2V5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGV2LmtleUNvZGUgPj0gNjUgJiYgZXYua2V5Q29kZSA8PSA5MCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0gRXNjYXBlU2VxdWVuY2VzXzEuQzAuRVNDICsgU3RyaW5nLmZyb21DaGFyQ29kZShldi5rZXlDb2RlICsgMzIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChldi5rZXlDb2RlID09PSAxOTIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IEVzY2FwZVNlcXVlbmNlc18xLkMwLkVTQyArICdgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXYua2V5Q29kZSA+PSA0OCAmJiBldi5rZXlDb2RlIDw9IDU3KSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBFc2NhcGVTZXF1ZW5jZXNfMS5DMC5FU0MgKyAoZXYua2V5Q29kZSAtIDQ4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuc2V0Z0xldmVsID0gZnVuY3Rpb24gKGcpIHtcbiAgICB0aGlzLmdsZXZlbCA9IGc7XG4gICAgdGhpcy5jaGFyc2V0ID0gdGhpcy5jaGFyc2V0c1tnXTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuc2V0Z0NoYXJzZXQgPSBmdW5jdGlvbiAoZywgY2hhcnNldCkge1xuICAgIHRoaXMuY2hhcnNldHNbZ10gPSBjaGFyc2V0O1xuICAgIGlmICh0aGlzLmdsZXZlbCA9PT0gZykge1xuICAgICAgICB0aGlzLmNoYXJzZXQgPSBjaGFyc2V0O1xuICAgIH1cbn07XG5UZXJtaW5hbC5wcm90b3R5cGUua2V5UHJlc3MgPSBmdW5jdGlvbiAoZXYpIHtcbiAgICB2YXIga2V5O1xuICAgIHRoaXMuY2FuY2VsKGV2KTtcbiAgICBpZiAoZXYuY2hhckNvZGUpIHtcbiAgICAgICAga2V5ID0gZXYuY2hhckNvZGU7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV2LndoaWNoID09IG51bGwpIHtcbiAgICAgICAga2V5ID0gZXYua2V5Q29kZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXYud2hpY2ggIT09IDAgJiYgZXYuY2hhckNvZGUgIT09IDApIHtcbiAgICAgICAga2V5ID0gZXYud2hpY2g7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICgha2V5IHx8ICgoZXYuYWx0S2V5IHx8IGV2LmN0cmxLZXkgfHwgZXYubWV0YUtleSkgJiYgIWlzVGhpcmRMZXZlbFNoaWZ0KHRoaXMsIGV2KSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBrZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGtleSk7XG4gICAgdGhpcy5lbWl0KCdrZXlwcmVzcycsIGtleSwgZXYpO1xuICAgIHRoaXMuZW1pdCgna2V5Jywga2V5LCBldik7XG4gICAgdGhpcy5zaG93Q3Vyc29yKCk7XG4gICAgdGhpcy5oYW5kbGVyKGtleSk7XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24gKGRhdGEpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaWYgKCF0aGlzLnF1ZXVlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2VsZi5oYW5kbGVyKHNlbGYucXVldWUpO1xuICAgICAgICAgICAgc2VsZi5xdWV1ZSA9ICcnO1xuICAgICAgICB9LCAxKTtcbiAgICB9XG4gICAgdGhpcy5xdWV1ZSArPSBkYXRhO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5iZWxsID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy52aXN1YWxCZWxsKVxuICAgICAgICByZXR1cm47XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuZWxlbWVudC5zdHlsZS5ib3JkZXJDb2xvciA9ICd3aGl0ZSc7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYuZWxlbWVudC5zdHlsZS5ib3JkZXJDb2xvciA9ICcnO1xuICAgIH0sIDEwKTtcbiAgICBpZiAodGhpcy5wb3BPbkJlbGwpXG4gICAgICAgIHRoaXMuZm9jdXMoKTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUubG9nID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5kZWJ1ZylcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmICghdGhpcy5jb250ZXh0LmNvbnNvbGUgfHwgIXRoaXMuY29udGV4dC5jb25zb2xlLmxvZylcbiAgICAgICAgcmV0dXJuO1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICB0aGlzLmNvbnRleHQuY29uc29sZS5sb2cuYXBwbHkodGhpcy5jb250ZXh0LmNvbnNvbGUsIGFyZ3MpO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuZGVidWcpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAoIXRoaXMuY29udGV4dC5jb25zb2xlIHx8ICF0aGlzLmNvbnRleHQuY29uc29sZS5lcnJvcilcbiAgICAgICAgcmV0dXJuO1xuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICB0aGlzLmNvbnRleHQuY29uc29sZS5lcnJvci5hcHBseSh0aGlzLmNvbnRleHQuY29uc29sZSwgYXJncyk7XG59O1xuVGVybWluYWwucHJvdG90eXBlLnJlc2l6ZSA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgaWYgKGlzTmFOKHgpIHx8IGlzTmFOKHkpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGxpbmUsIGVsLCBpLCBqLCBjaCwgYWRkVG9ZO1xuICAgIGlmICh4ID09PSB0aGlzLmNvbHMgJiYgeSA9PT0gdGhpcy5yb3dzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHggPCAxKVxuICAgICAgICB4ID0gMTtcbiAgICBpZiAoeSA8IDEpXG4gICAgICAgIHkgPSAxO1xuICAgIGogPSB0aGlzLmNvbHM7XG4gICAgaWYgKGogPCB4KSB7XG4gICAgICAgIGNoID0gW3RoaXMuZGVmQXR0ciwgJyAnLCAxXTtcbiAgICAgICAgaSA9IHRoaXMubGluZXMubGVuZ3RoO1xuICAgICAgICB3aGlsZSAoaS0tKSB7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5saW5lcy5nZXQoaSkubGVuZ3RoIDwgeCkge1xuICAgICAgICAgICAgICAgIHRoaXMubGluZXMuZ2V0KGkpLnB1c2goY2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHRoaXMuY29scyA9IHg7XG4gICAgdGhpcy5zZXR1cFN0b3BzKHRoaXMuY29scyk7XG4gICAgaiA9IHRoaXMucm93cztcbiAgICBhZGRUb1kgPSAwO1xuICAgIGlmIChqIDwgeSkge1xuICAgICAgICBlbCA9IHRoaXMuZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKGorKyA8IHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA8IHkgKyB0aGlzLnliYXNlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMueWJhc2UgPiAwICYmIHRoaXMubGluZXMubGVuZ3RoIDw9IHRoaXMueWJhc2UgKyB0aGlzLnkgKyBhZGRUb1kgKyAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMueWJhc2UtLTtcbiAgICAgICAgICAgICAgICAgICAgYWRkVG9ZKys7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnlkaXNwID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy55ZGlzcC0tO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpbmVzLnB1c2godGhpcy5ibGFua0xpbmUoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoIDwgeSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0Um93KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHdoaWxlIChqLS0gPiB5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5saW5lcy5sZW5ndGggPiB5ICsgdGhpcy55YmFzZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmxpbmVzLmxlbmd0aCA+IHRoaXMueWJhc2UgKyB0aGlzLnkgKyAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGluZXMucG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnliYXNlKys7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMueWRpc3ArKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPiB5KSB7XG4gICAgICAgICAgICAgICAgZWwgPSB0aGlzLmNoaWxkcmVuLnNoaWZ0KCk7XG4gICAgICAgICAgICAgICAgaWYgKCFlbClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yb3dzID0geTtcbiAgICBpZiAodGhpcy55ID49IHkpIHtcbiAgICAgICAgdGhpcy55ID0geSAtIDE7XG4gICAgfVxuICAgIGlmIChhZGRUb1kpIHtcbiAgICAgICAgdGhpcy55ICs9IGFkZFRvWTtcbiAgICB9XG4gICAgaWYgKHRoaXMueCA+PSB4KSB7XG4gICAgICAgIHRoaXMueCA9IHggLSAxO1xuICAgIH1cbiAgICB0aGlzLnNjcm9sbFRvcCA9IDA7XG4gICAgdGhpcy5zY3JvbGxCb3R0b20gPSB5IC0gMTtcbiAgICB0aGlzLmNoYXJNZWFzdXJlLm1lYXN1cmUoKTtcbiAgICB0aGlzLnJlZnJlc2goMCwgdGhpcy5yb3dzIC0gMSk7XG4gICAgdGhpcy5ub3JtYWwgPSBudWxsO1xuICAgIHRoaXMuZ2VvbWV0cnkgPSBbdGhpcy5jb2xzLCB0aGlzLnJvd3NdO1xuICAgIHRoaXMuZW1pdCgncmVzaXplJywgeyB0ZXJtaW5hbDogdGhpcywgY29sczogeCwgcm93czogeSB9KTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUudXBkYXRlUmFuZ2UgPSBmdW5jdGlvbiAoeSkge1xuICAgIGlmICh5IDwgdGhpcy5yZWZyZXNoU3RhcnQpXG4gICAgICAgIHRoaXMucmVmcmVzaFN0YXJ0ID0geTtcbiAgICBpZiAoeSA+IHRoaXMucmVmcmVzaEVuZClcbiAgICAgICAgdGhpcy5yZWZyZXNoRW5kID0geTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUubWF4UmFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5yZWZyZXNoU3RhcnQgPSAwO1xuICAgIHRoaXMucmVmcmVzaEVuZCA9IHRoaXMucm93cyAtIDE7XG59O1xuVGVybWluYWwucHJvdG90eXBlLnNldHVwU3RvcHMgPSBmdW5jdGlvbiAoaSkge1xuICAgIGlmIChpICE9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLnRhYnNbaV0pIHtcbiAgICAgICAgICAgIGkgPSB0aGlzLnByZXZTdG9wKGkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aGlzLnRhYnMgPSB7fTtcbiAgICAgICAgaSA9IDA7XG4gICAgfVxuICAgIGZvciAoOyBpIDwgdGhpcy5jb2xzOyBpICs9IHRoaXMuZ2V0T3B0aW9uKCd0YWJTdG9wV2lkdGgnKSkge1xuICAgICAgICB0aGlzLnRhYnNbaV0gPSB0cnVlO1xuICAgIH1cbn07XG5UZXJtaW5hbC5wcm90b3R5cGUucHJldlN0b3AgPSBmdW5jdGlvbiAoeCkge1xuICAgIGlmICh4ID09IG51bGwpXG4gICAgICAgIHggPSB0aGlzLng7XG4gICAgd2hpbGUgKCF0aGlzLnRhYnNbLS14XSAmJiB4ID4gMClcbiAgICAgICAgO1xuICAgIHJldHVybiB4ID49IHRoaXMuY29sc1xuICAgICAgICA/IHRoaXMuY29scyAtIDFcbiAgICAgICAgOiB4IDwgMCA/IDAgOiB4O1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5uZXh0U3RvcCA9IGZ1bmN0aW9uICh4KSB7XG4gICAgaWYgKHggPT0gbnVsbClcbiAgICAgICAgeCA9IHRoaXMueDtcbiAgICB3aGlsZSAoIXRoaXMudGFic1srK3hdICYmIHggPCB0aGlzLmNvbHMpXG4gICAgICAgIDtcbiAgICByZXR1cm4geCA+PSB0aGlzLmNvbHNcbiAgICAgICAgPyB0aGlzLmNvbHMgLSAxXG4gICAgICAgIDogeCA8IDAgPyAwIDogeDtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuZXJhc2VSaWdodCA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgdmFyIGxpbmUgPSB0aGlzLmxpbmVzLmdldCh0aGlzLnliYXNlICsgeSk7XG4gICAgaWYgKCFsaW5lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGNoID0gW3RoaXMuZXJhc2VBdHRyKCksICcgJywgMV07XG4gICAgZm9yICg7IHggPCB0aGlzLmNvbHM7IHgrKykge1xuICAgICAgICBsaW5lW3hdID0gY2g7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlUmFuZ2UoeSk7XG59O1xuVGVybWluYWwucHJvdG90eXBlLmVyYXNlTGVmdCA9IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgdmFyIGxpbmUgPSB0aGlzLmxpbmVzLmdldCh0aGlzLnliYXNlICsgeSk7XG4gICAgaWYgKCFsaW5lKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIGNoID0gW3RoaXMuZXJhc2VBdHRyKCksICcgJywgMV07XG4gICAgeCsrO1xuICAgIHdoaWxlICh4LS0pIHtcbiAgICAgICAgbGluZVt4XSA9IGNoO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVJhbmdlKHkpO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodGhpcy55YmFzZSA9PT0gMCAmJiB0aGlzLnkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxpbmVzLnNldCgwLCB0aGlzLmxpbmVzLmdldCh0aGlzLnliYXNlICsgdGhpcy55KSk7XG4gICAgdGhpcy5saW5lcy5sZW5ndGggPSAxO1xuICAgIHRoaXMueWRpc3AgPSAwO1xuICAgIHRoaXMueWJhc2UgPSAwO1xuICAgIHRoaXMueSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCB0aGlzLnJvd3M7IGkrKykge1xuICAgICAgICB0aGlzLmxpbmVzLnB1c2godGhpcy5ibGFua0xpbmUoKSk7XG4gICAgfVxuICAgIHRoaXMucmVmcmVzaCgwLCB0aGlzLnJvd3MgLSAxKTtcbiAgICB0aGlzLmVtaXQoJ3Njcm9sbCcsIHRoaXMueWRpc3ApO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5lcmFzZUxpbmUgPSBmdW5jdGlvbiAoeSkge1xuICAgIHRoaXMuZXJhc2VSaWdodCgwLCB5KTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuYmxhbmtMaW5lID0gZnVuY3Rpb24gKGN1cikge1xuICAgIHZhciBhdHRyID0gY3VyXG4gICAgICAgID8gdGhpcy5lcmFzZUF0dHIoKVxuICAgICAgICA6IHRoaXMuZGVmQXR0cjtcbiAgICB2YXIgY2ggPSBbYXR0ciwgJyAnLCAxXSwgbGluZSA9IFtdLCBpID0gMDtcbiAgICBmb3IgKDsgaSA8IHRoaXMuY29sczsgaSsrKSB7XG4gICAgICAgIGxpbmVbaV0gPSBjaDtcbiAgICB9XG4gICAgcmV0dXJuIGxpbmU7XG59O1xuVGVybWluYWwucHJvdG90eXBlLmNoID0gZnVuY3Rpb24gKGN1cikge1xuICAgIHJldHVybiBjdXJcbiAgICAgICAgPyBbdGhpcy5lcmFzZUF0dHIoKSwgJyAnLCAxXVxuICAgICAgICA6IFt0aGlzLmRlZkF0dHIsICcgJywgMV07XG59O1xuVGVybWluYWwucHJvdG90eXBlLmlzID0gZnVuY3Rpb24gKHRlcm0pIHtcbiAgICB2YXIgbmFtZSA9IHRoaXMudGVybU5hbWU7XG4gICAgcmV0dXJuIChuYW1lICsgJycpLmluZGV4T2YodGVybSkgPT09IDA7XG59O1xuVGVybWluYWwucHJvdG90eXBlLmhhbmRsZXIgPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZGlzYWJsZVN0ZGluKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMueWJhc2UgIT09IHRoaXMueWRpc3ApIHtcbiAgICAgICAgdGhpcy5zY3JvbGxUb0JvdHRvbSgpO1xuICAgIH1cbiAgICB0aGlzLmVtaXQoJ2RhdGEnLCBkYXRhKTtcbn07XG5UZXJtaW5hbC5wcm90b3R5cGUuaGFuZGxlVGl0bGUgPSBmdW5jdGlvbiAodGl0bGUpIHtcbiAgICB0aGlzLmVtaXQoJ3RpdGxlJywgdGl0bGUpO1xufTtcblRlcm1pbmFsLnByb3RvdHlwZS5pbmRleCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnkrKztcbiAgICBpZiAodGhpcy55ID4gdGhpcy5zY3JvbGxCb3R0b20pIHtcbiAgICAgICAgdGhpcy55LS07XG4gICAgICAgIHRoaXMuc2Nyb2xsKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnggPj0gdGhpcy5jb2xzKSB7XG4gICAgICAgIHRoaXMueC0tO1xuICAgIH1cbn07XG5UZXJtaW5hbC5wcm90b3R5cGUucmV2ZXJzZUluZGV4ID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBqO1xuICAgIGlmICh0aGlzLnkgPT09IHRoaXMuc2Nyb2xsVG9wKSB7XG4gICAgICAgIHRoaXMubGluZXMuc2hpZnRFbGVtZW50cyh0aGlzLnkgKyB0aGlzLnliYXNlLCB0aGlzLnJvd3MgLSAxLCAxKTtcbiAgICAgICAgdGhpcy5saW5lcy5zZXQodGhpcy55ICsgdGhpcy55YmFzZSwgdGhpcy5ibGFua0xpbmUodHJ1ZSkpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJhbmdlKHRoaXMuc2Nyb2xsVG9wKTtcbiAgICAgICAgdGhpcy51cGRhdGVSYW5nZSh0aGlzLnNjcm9sbEJvdHRvbSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aGlzLnktLTtcbiAgICB9XG59O1xuVGVybWluYWwucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgIHRoaXMub3B0aW9ucy5yb3dzID0gdGhpcy5yb3dzO1xuICAgIHRoaXMub3B0aW9ucy5jb2xzID0gdGhpcy5jb2xzO1xuICAgIHZhciBjdXN0b21LZXlkb3duSGFuZGxlciA9IHRoaXMuY3VzdG9tS2V5ZG93bkhhbmRsZXI7XG4gICAgdmFyIGN1cnNvckJsaW5rSW50ZXJ2YWwgPSB0aGlzLmN1cnNvckJsaW5rSW50ZXJ2YWw7XG4gICAgVGVybWluYWwuY2FsbCh0aGlzLCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMuY3VzdG9tS2V5ZG93bkhhbmRsZXIgPSBjdXN0b21LZXlkb3duSGFuZGxlcjtcbiAgICB0aGlzLmN1cnNvckJsaW5rSW50ZXJ2YWwgPSBjdXJzb3JCbGlua0ludGVydmFsO1xuICAgIHRoaXMucmVmcmVzaCgwLCB0aGlzLnJvd3MgLSAxKTtcbiAgICB0aGlzLnZpZXdwb3J0LnN5bmNTY3JvbGxBcmVhKCk7XG59O1xuVGVybWluYWwucHJvdG90eXBlLnRhYlNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLnRhYnNbdGhpcy54XSA9IHRydWU7XG59O1xuZnVuY3Rpb24gb24oZWwsIHR5cGUsIGhhbmRsZXIsIGNhcHR1cmUpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZWwpKSB7XG4gICAgICAgIGVsID0gW2VsXTtcbiAgICB9XG4gICAgZWwuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgY2FwdHVyZSB8fCBmYWxzZSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBvZmYoZWwsIHR5cGUsIGhhbmRsZXIsIGNhcHR1cmUpIHtcbiAgICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGhhbmRsZXIsIGNhcHR1cmUgfHwgZmFsc2UpO1xufVxuZnVuY3Rpb24gY2FuY2VsKGV2LCBmb3JjZSkge1xuICAgIGlmICghdGhpcy5jYW5jZWxFdmVudHMgJiYgIWZvcmNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBpbmhlcml0cyhjaGlsZCwgcGFyZW50KSB7XG4gICAgZnVuY3Rpb24gZigpIHtcbiAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGNoaWxkO1xuICAgIH1cbiAgICBmLnByb3RvdHlwZSA9IHBhcmVudC5wcm90b3R5cGU7XG4gICAgY2hpbGQucHJvdG90eXBlID0gbmV3IGY7XG59XG5mdW5jdGlvbiBpbmRleE9mKG9iaiwgZWwpIHtcbiAgICB2YXIgaSA9IG9iai5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgICBpZiAob2JqW2ldID09PSBlbClcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG59XG5mdW5jdGlvbiBpc1RoaXJkTGV2ZWxTaGlmdCh0ZXJtLCBldikge1xuICAgIHZhciB0aGlyZExldmVsS2V5ID0gKHRlcm0uYnJvd3Nlci5pc01hYyAmJiBldi5hbHRLZXkgJiYgIWV2LmN0cmxLZXkgJiYgIWV2Lm1ldGFLZXkpIHx8XG4gICAgICAgICh0ZXJtLmJyb3dzZXIuaXNNU1dpbmRvd3MgJiYgZXYuYWx0S2V5ICYmIGV2LmN0cmxLZXkgJiYgIWV2Lm1ldGFLZXkpO1xuICAgIGlmIChldi50eXBlID09ICdrZXlwcmVzcycpIHtcbiAgICAgICAgcmV0dXJuIHRoaXJkTGV2ZWxLZXk7XG4gICAgfVxuICAgIHJldHVybiB0aGlyZExldmVsS2V5ICYmICghZXYua2V5Q29kZSB8fCBldi5rZXlDb2RlID4gNDcpO1xufVxuVGVybWluYWwucHJvdG90eXBlLm1hdGNoQ29sb3IgPSBtYXRjaENvbG9yO1xuZnVuY3Rpb24gbWF0Y2hDb2xvcihyMSwgZzEsIGIxKSB7XG4gICAgdmFyIGhhc2ggPSAocjEgPDwgMTYpIHwgKGcxIDw8IDgpIHwgYjE7XG4gICAgaWYgKG1hdGNoQ29sb3IuX2NhY2hlW2hhc2hdICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoQ29sb3IuX2NhY2hlW2hhc2hdO1xuICAgIH1cbiAgICB2YXIgbGRpZmYgPSBJbmZpbml0eSwgbGkgPSAtMSwgaSA9IDAsIGMsIHIyLCBnMiwgYjIsIGRpZmY7XG4gICAgZm9yICg7IGkgPCBUZXJtaW5hbC52Y29sb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGMgPSBUZXJtaW5hbC52Y29sb3JzW2ldO1xuICAgICAgICByMiA9IGNbMF07XG4gICAgICAgIGcyID0gY1sxXTtcbiAgICAgICAgYjIgPSBjWzJdO1xuICAgICAgICBkaWZmID0gbWF0Y2hDb2xvci5kaXN0YW5jZShyMSwgZzEsIGIxLCByMiwgZzIsIGIyKTtcbiAgICAgICAgaWYgKGRpZmYgPT09IDApIHtcbiAgICAgICAgICAgIGxpID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWZmIDwgbGRpZmYpIHtcbiAgICAgICAgICAgIGxkaWZmID0gZGlmZjtcbiAgICAgICAgICAgIGxpID0gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hDb2xvci5fY2FjaGVbaGFzaF0gPSBsaTtcbn1cbm1hdGNoQ29sb3IuX2NhY2hlID0ge307XG5tYXRjaENvbG9yLmRpc3RhbmNlID0gZnVuY3Rpb24gKHIxLCBnMSwgYjEsIHIyLCBnMiwgYjIpIHtcbiAgICByZXR1cm4gTWF0aC5wb3coMzAgKiAocjEgLSByMiksIDIpXG4gICAgICAgICsgTWF0aC5wb3coNTkgKiAoZzEgLSBnMiksIDIpXG4gICAgICAgICsgTWF0aC5wb3coMTEgKiAoYjEgLSBiMiksIDIpO1xufTtcbmZ1bmN0aW9uIGVhY2gob2JqLCBpdGVyLCBjb24pIHtcbiAgICBpZiAob2JqLmZvckVhY2gpXG4gICAgICAgIHJldHVybiBvYmouZm9yRWFjaChpdGVyLCBjb24pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGl0ZXIuY2FsbChjb24sIG9ialtpXSwgaSwgb2JqKTtcbiAgICB9XG59XG5mdW5jdGlvbiB3YXNNb25kaWZpZXJLZXlPbmx5RXZlbnQoZXYpIHtcbiAgICByZXR1cm4gZXYua2V5Q29kZSA9PT0gMTYgfHxcbiAgICAgICAgZXYua2V5Q29kZSA9PT0gMTcgfHxcbiAgICAgICAgZXYua2V5Q29kZSA9PT0gMTg7XG59XG5mdW5jdGlvbiBrZXlzKG9iaikge1xuICAgIGlmIChPYmplY3Qua2V5cylcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaik7XG4gICAgdmFyIGtleSwga2V5cyA9IFtdO1xuICAgIGZvciAoa2V5IGluIG9iaikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtleXM7XG59XG5UZXJtaW5hbC5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXJfMS5FdmVudEVtaXR0ZXI7XG5UZXJtaW5hbC5pbmhlcml0cyA9IGluaGVyaXRzO1xuVGVybWluYWwub24gPSBvbjtcblRlcm1pbmFsLm9mZiA9IG9mZjtcblRlcm1pbmFsLmNhbmNlbCA9IGNhbmNlbDtcbm1vZHVsZS5leHBvcnRzID0gVGVybWluYWw7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXh0ZXJtLmpzLm1hcFxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgcmVuZGVyIH0gZnJvbSAncmVhY3QtZG9tJ1xuaW1wb3J0IHsgUHJvdmlkZXIgfSBmcm9tICdyZWFjdC1yZWR1eCdcbmltcG9ydCBjb25maWd1cmVTdG9yZSBmcm9tICcuL3N0b3JlL2NvbmZpZ3VyZS1zdG9yZSdcbmltcG9ydCB7IHNlbGVjdFNlY3Rpb24gfSBmcm9tICcuL2FjdGlvbnMvYXBwJ1xuXG5pbXBvcnQgUmVtb3RlIGZyb20gJy4vY29tbW9uL2xpYi9yZW1vdGUnXG5pbXBvcnQgQXBwIGZyb20gJy4vY29tcG9uZW50cy9hcHAnXG5cbmltcG9ydCB7IEludGxQcm92aWRlciwgYWRkTG9jYWxlRGF0YSB9IGZyb20gJ3JlYWN0LWludGwnXG5pbXBvcnQgZXMgZnJvbSAncmVhY3QtaW50bC9sb2NhbGUtZGF0YS9lcydcbmltcG9ydCBlbiBmcm9tICdyZWFjdC1pbnRsL2xvY2FsZS1kYXRhL2VuJ1xuaW1wb3J0IG1lc3NhZ2VzRVMgZnJvbSAnLi90cmFuc2xhdGlvbnMvZXMuanNvbidcbmltcG9ydCBtZXNzYWdlc0VOIGZyb20gJy4vdHJhbnNsYXRpb25zL2VuLmpzb24nXG5hZGRMb2NhbGVEYXRhKFsuLi5lbiwgLi4uZXNdKVxuY29uc3QgZGVmYXVsdExvY2FsZSA9ICdlbidcblxuY2xhc3MgRUhvcnVzIHtcbiAgY29uc3RydWN0b3IgKGNvbmZpZyA9IHt9KSB7XG4gICAgY29uc3QgaGVhZGVyID0gKHR5cGVvZiBjb25maWcuaGVhZGVyICE9PSAndW5kZWZpbmVkJylcbiAgICAgID8gY29uZmlnLmhlYWRlclxuICAgICAgOiB0cnVlXG4gICAgY29uc3Qge1xuICAgICAgYWdlbnRMYXN0Q29udGFjdCwgYWdlbnRJc0J1c3ksIGxvZ28sIHNlY3Rpb24sIGxvY2FsZSxcbiAgICAgIGhhbmRsZURpc2Nvbm5lY3QsIHBhc3MsIGhhbmRsZVRlbXBQYXNzR2VuZXJhdGVkLCB0bXBQYXNzXG4gICAgfSA9IGNvbmZpZ1xuXG4gICAgUmVtb3RlLmluaXRpYWxpemUoY29uZmlnKVxuXG4gICAgLy8gU3RvcmUgKHJlZHV4KVxuICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHtcbiAgICAgIGFwcDoge1xuICAgICAgICBsb2dvVVJMOiBsb2dvLFxuICAgICAgICBzaG93SGVhZGVyOiBoZWFkZXIsXG4gICAgICAgIGhhbmRsZURpc2Nvbm5lY3Q6IGhhbmRsZURpc2Nvbm5lY3QgfHwgKCgpID0+IHt9KSxcbiAgICAgICAgaGFuZGxlVGVtcFBhc3NHZW5lcmF0ZWRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzZWN0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaW5pdGlhbFN0YXRlLmFwcC5zZWN0aW9ucyA9IHtcbiAgICAgICAgYWN0aXZlOiBzZWN0aW9uLFxuICAgICAgICBmaXJzdEFjdGl2ZTogc2VjdGlvblxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGFnZW50TGFzdENvbnRhY3QgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpbml0aWFsU3RhdGUuYXBwLmFnZW50TGFzdENvbnRhY3QgPSBhZ2VudExhc3RDb250YWN0XG4gICAgfVxuICAgIGlmICh0eXBlb2YgYWdlbnRJc0J1c3kgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpbml0aWFsU3RhdGUuYXBwLmFnZW50SXNCdXN5ID0gYWdlbnRJc0J1c3lcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBwYXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgaW5pdGlhbFN0YXRlLmFwcC5wYXNzID0gcGFzc1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRtcFBhc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpbml0aWFsU3RhdGUuYXBwLnRtcFBhc3MgPSB0bXBQYXNzXG4gICAgfVxuXG4gICAgaWYgKGxvY2FsZSkge1xuICAgICAgdGhpcy5fbG9jYWxlID0gbG9jYWxlXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgbmF2aWdhdG9yLmxhbmd1YWdlID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fbG9jYWxlID0gbmF2aWdhdG9yLmxhbmd1YWdlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xvY2FsZSA9ICdlbidcbiAgICB9XG4gICAgdGhpcy5fbWVzc2FnZXMgPSB7fVxuICAgIHN3aXRjaCAodGhpcy5fbG9jYWxlKSB7XG4gICAgICBjYXNlICdlcyc6XG4gICAgICAgIHRoaXMuX21lc3NhZ2VzID0gbWVzc2FnZXNFU1xuICAgICAgICBicmVha1xuICAgICAgLy8gRW5nbGlzaCBpcyB0aGUgZGVmYXVsdCBsYW5ndWFnZVxuICAgICAgY2FzZSAnZW4nOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhpcy5fbWVzc2FnZXMgPSBtZXNzYWdlc0VOXG4gICAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgdGhpcy5fc3RvcmUgPSBjb25maWd1cmVTdG9yZShpbml0aWFsU3RhdGUpXG4gIH1cblxuICByZW5kZXJJbiAoZWxlbWVudCkge1xuICAgIHJlbmRlcihcbiAgICAgIDxQcm92aWRlciBzdG9yZT17dGhpcy5fc3RvcmV9PlxuICAgICAgICA8SW50bFByb3ZpZGVyXG4gICAgICAgICAgZGVmYXVsdExvY2FsZT17XG4gICAgICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nID8gdGhpcy5fbG9jYWxlIDogZGVmYXVsdExvY2FsZVxuICAgICAgICAgIH1cbiAgICAgICAgICBsb2NhbGU9e3RoaXMuX2xvY2FsZX1cbiAgICAgICAgICBtZXNzYWdlcz17dGhpcy5fbWVzc2FnZXN9PlxuICAgICAgICAgIDxBcHAgLz5cbiAgICAgICAgPC9JbnRsUHJvdmlkZXI+XG4gICAgICA8L1Byb3ZpZGVyPixcbiAgICAgIGVsZW1lbnRcbiAgICApXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8vIHNldCBsb2dvIChsb2dvKSB7XG4gIC8vICAgdGhpcy5fbG9nbyA9IGxvZ29cbiAgLy8gfVxuICBnZXQgbG9nbyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlLmdldFN0YXRlKCkuYXBwLmxvZ29VUkxcbiAgfVxuXG4gIC8vIHNldCBoZWFkZXIgKHZhbHVlKSB7XG4gIC8vICAgdGhpcy5faGVhZGVyID0gdmFsdWVcbiAgLy8gfVxuICBnZXQgaGVhZGVyICgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmUuZ2V0U3RhdGUoKS5hcHAuc2hvd0hlYWRlclxuICB9XG5cbiAgLy8gc2V0IGhhbmRsZURpc2Nvbm5lY3QgKGhhbmRsZURpc2Nvbm5lY3QpIHtcbiAgLy8gICB0aGlzLl9oYW5kbGVEaXNjb25uZWN0ID0gaGFuZGxlRGlzY29ubmVjdFxuICAvLyB9XG4gIGdldCBoYW5kbGVEaXNjb25uZWN0ICgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmUuZ2V0U3RhdGUoKS5hcHAuaGFuZGxlRGlzY29ubmVjdFxuICB9XG5cbiAgLy8gc2V0IGFnZW50TGFzdENvbnRhY3QgKGFnZW50TGFzdENvbnRhY3QpIHtcbiAgLy8gICB0aGlzLl9hZ2VudExhc3RDb250YWN0ID0gYWdlbnRMYXN0Q29udGFjdFxuICAvLyB9XG4gIGdldCBhZ2VudExhc3RDb250YWN0ICgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmUuZ2V0U3RhdGUoKS5hcHAuYWdlbnRMYXN0Q29udGFjdFxuICB9XG5cbiAgLy8gc2V0IGFnZW50SXNCdXN5IChhZ2VudElzQnVzeSkge1xuICAvLyAgIHRoaXMuX2FnZW50SXNCdXN5ID0gYWdlbnRJc0J1c3lcbiAgLy8gfVxuICBnZXQgYWdlbnRJc0J1c3kgKCkge1xuICAgIHJldHVybiB0aGlzLl9zdG9yZS5nZXRTdGF0ZSgpLmFwcC5hZ2VudElzQnVzeVxuICB9XG5cbiAgLy8gc2V0IHNlY3Rpb24gKHNlY3Rpb24pIHtcbiAgLy8gICB0aGlzLl9zZWN0aW9uID0gc2VjdGlvblxuICAvLyB9XG4gIGNoYW5nZVNlY3Rpb24gKHNlY3Rpb24pIHtcbiAgICB0aGlzLl9zdG9yZS5kaXNwYXRjaChzZWxlY3RTZWN0aW9uKHNlY3Rpb24pKVxuICB9XG4gIGdldCBzZWN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmUuZ2V0U3RhdGUoKS5hcHAuc2VjdGlvbnMuYWN0aXZlXG4gIH1cblxuICBnZXQgc3RhdGUgKCkge1xuICAgIHJldHVybiB0aGlzLl9zdG9yZS5nZXRTdGF0ZSgpXG4gIH1cblxuICBnZXQgcmVtb3RlICgpIHtcbiAgICByZXR1cm4gUmVtb3RlXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRUhvcnVzXG4iLCJpbXBvcnQgUmVtb3RlIGZyb20gJy4uL2NvbW1vbi9saWIvcmVtb3RlJ1xuaW1wb3J0IHsgUFJPVE8gfSBmcm9tICcuLi9jb25zdGFudHMnXG5cbmltcG9ydCB7XG4gIC8vIENvbm5lY3Rpb25cbiAgUkVTRVRfQUdFTlRfU1RBVEUsIENPTk5fQUdFTlRfUkVRVUVTVCwgQ09OTl9BR0VOVF9TVUNDRVNTLCBDT05OX0FHRU5UX0ZBSUxVUkUsXG4gIERJU0NPTk5fQUdFTlRfUkVRVUVTVCwgRElTQ09OTl9BR0VOVF9TVUNDRVNTLCBDTEVBUl9DT05OX0VSUk9SLFxuICAvLyBBdXRoZW50aWNhdGlvblxuICBBVVRIX0FHRU5UX1JFUVVFU1QsIEFVVEhfQUdFTlRfU1VDQ0VTUywgQVVUSF9BR0VOVF9GQUlMVVJFLFxuICBSRVZPS0VfQUdFTlRfQVVUSCwgQ0xFQVJfQVVUSF9FUlJPUixcbiAgLy8gVGVtcG9yYXJ5IHBhc3NcbiAgVEVNUF9QQVNTX1JFUVVFU1QsIFRFTVBfUEFTU19TVUNDRVNTLCBURU1QX1BBU1NfRkFJTFVSRSxcbiAgLy8gRGF0YVxuICBGRVRDSF9BR0VOVF9SRVFVRVNULCBGRVRDSF9BR0VOVF9TVUNDRVNTLCBGRVRDSF9BR0VOVF9GQUlMVVJFLFxuICBDTEVBUl9BR0VOVF9FUlJPUlxufSBmcm9tICcuLi9jb25zdGFudHMvYWdlbnQnXG5cbmV4cG9ydCBmdW5jdGlvbiByZXNldEFnZW50U3RhdGUgKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFJFU0VUX0FHRU5UX1NUQVRFXG4gIH1cbn1cblxuLy8gQ29ubmVjdGlvblxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDb25uZWN0aW9uRXJyb3IgKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IENMRUFSX0NPTk5fRVJST1JcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29ubmVjdGlvbkFnZW50UmVxdWVzdCAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQ09OTl9BR0VOVF9SRVFVRVNUXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbm5lY3Rpb25BZ2VudFN1Y2Nlc3MgKGNvbm5lY3RlZEF0KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQ09OTl9BR0VOVF9TVUNDRVNTLFxuICAgIHBheWxvYWQ6IHtcbiAgICAgIGNvbm5lY3RlZEF0XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25uZWN0aW9uQWdlbnRGYWlsdXJlIChlcnJvcikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IENPTk5fQUdFTlRfRkFJTFVSRSxcbiAgICBwYXlsb2FkOiB7XG4gICAgICBlcnJvckNvZGU6IGVycm9yLnJlc3BvbnNlLmNvZGUsXG4gICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLnJlc3BvbnNlLnJlYXNvblxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlzY29ubmVjdGlvbkFnZW50UmVxdWVzdCAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogRElTQ09OTl9BR0VOVF9SRVFVRVNUXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc2Nvbm5lY3Rpb25BZ2VudFN1Y2Nlc3MgKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IERJU0NPTk5fQUdFTlRfU1VDQ0VTU1xuICB9XG59XG5cbi8vIEF1dGhlbnRpY2F0aW9uXG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckF1dGhlbnRpY2F0aW9uRXJyb3IgKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IENMRUFSX0FVVEhfRVJST1JcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmV2b2tlQWdlbnRBdXRoZW50aWNhdGlvbiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogUkVWT0tFX0FHRU5UX0FVVEhcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXV0ZW50aWNhdGVBZ2VudFJlcXVlc3QgKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFVVEhfQUdFTlRfUkVRVUVTVFxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhdXRlbnRpY2F0ZUFnZW50U3VjY2VzcyAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQVVUSF9BR0VOVF9TVUNDRVNTXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGF1dGVudGljYXRlQWdlbnRGYWlsdXJlIChlcnJvcikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFVVEhfQUdFTlRfRkFJTFVSRSxcbiAgICBwYXlsb2FkOiB7XG4gICAgICBlcnJvckNvZGU6IGVycm9yLnJlc3BvbnNlLmNvZGUsXG4gICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLnJlc3BvbnNlLnJlYXNvblxuICAgIH1cbiAgfVxufVxuXG4vLyBUSFVOS1xuZXhwb3J0IGZ1bmN0aW9uIHNlbmRBZ2VudFBhc3N3b3JkIChwYXNzd29yZCkge1xuICByZXR1cm4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIGRpc3BhdGNoKGF1dGVudGljYXRlQWdlbnRSZXF1ZXN0KCkpXG4gICAgUmVtb3RlLnNlbmQoe1xuICAgICAgcHJvdG86IFBST1RPLkFHRU5UX1BBU1MsXG4gICAgICBkYXRhOiBwYXNzd29yZFxuICAgIH0pXG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBzZW5kQWdlbnRUbXBQYXNzd29yZCAocGFzc3dvcmQpIHtcbiAgcmV0dXJuIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICBkaXNwYXRjaChhdXRlbnRpY2F0ZUFnZW50UmVxdWVzdCgpKVxuICAgIFJlbW90ZS5zZW5kKHtcbiAgICAgIHByb3RvOiBQUk9UTy5URU1QX0xPR0lOLFxuICAgICAgZGF0YTogcGFzc3dvcmRcbiAgICB9KVxuICB9XG59XG5cbi8vIFRlbXBvcmFyeSBwYXNzXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW1wUGFzc1JlcXVlc3QgKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFRFTVBfUEFTU19SRVFVRVNUXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRlbXBQYXNzU3VjY2VzcyAocGFzcywgZXhwaXJlc0F0KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogVEVNUF9QQVNTX1NVQ0NFU1MsXG4gICAgcGF5bG9hZDoge1xuICAgICAgcGFzcyxcbiAgICAgIGV4cGlyZXNBdFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcFBhc3NGYWlsdXJlIChlcnJvcikge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFRFTVBfUEFTU19GQUlMVVJFLFxuICAgIHBheWxvYWQ6IHtcbiAgICAgIGVycm9yQ29kZTogZXJyb3IucmVzcG9uc2UuY29kZSxcbiAgICAgIGVycm9yTWVzc2FnZTogZXJyb3IucmVzcG9uc2UucmVhc29uXG4gICAgfVxuICB9XG59XG5cbi8vIFRIVU5LXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcFBhc3MgKGV4cGlyZXMpIHtcbiAgcmV0dXJuIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICBkaXNwYXRjaChnZXRUZW1wUGFzc1JlcXVlc3QoKSlcbiAgICBSZW1vdGUuc2VuZCh7XG4gICAgICBwcm90bzogUFJPVE8uVEVNUF9QQVNTLFxuICAgICAgZGF0YToge1xuICAgICAgICBhY3Rpb246ICdnZXRfdGVtcF9wYXNzJyxcbiAgICAgICAgZXhwaXJlc1xuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cblxuLy8gRGF0YVxuXG5leHBvcnQgZnVuY3Rpb24gZmV0Y2hBZ2VudFJlcXVlc3QgKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEZFVENIX0FHRU5UX1JFUVVFU1RcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmV0Y2hBZ2VudFN1Y2Nlc3MgKGRhdGEsIHJlY2VpdmVkQXQpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBGRVRDSF9BR0VOVF9TVUNDRVNTLFxuICAgIHBheWxvYWQ6IHtcbiAgICAgIGRhdGEsXG4gICAgICByZWNlaXZlZEF0XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaEFnZW50RmFpbHVyZSAoZXJyb3IpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBGRVRDSF9BR0VOVF9GQUlMVVJFLFxuICAgIHBheWxvYWQ6IHtcbiAgICAgIGVycm9yQ29kZTogZXJyb3IucmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5yZXNwb25zZS5zdGF0dXNUZXh0XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckFnZW50RXJyb3IgKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IENMRUFSX0FHRU5UX0VSUk9SXG4gIH1cbn1cblxuLy8gVEhVTktcbmV4cG9ydCBmdW5jdGlvbiBmZXRjaEFnZW50ICgpIHtcbiAgcmV0dXJuIChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgICBkaXNwYXRjaChmZXRjaEFnZW50UmVxdWVzdCgpKVxuICAgIFJlbW90ZS5zZW5kKHtcbiAgICAgIHByb3RvOiBQUk9UTy5TWVNURU0sXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGFjdGlvbjogJ2dldCdcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG4iLCJpbXBvcnQgUmVtb3RlIGZyb20gJy4uL2NvbW1vbi9saWIvcmVtb3RlJ1xuaW1wb3J0IHsgUFJPVE8gfSBmcm9tICcuLi9jb25zdGFudHMnXG5pbXBvcnQge1xuICBGRVRDSF9TRUNUSU9OU19SRVFVRVNULCBGRVRDSF9TRUNUSU9OU19TVUNDRVNTLCBGRVRDSF9TRUNUSU9OU19GQUlMVVJFLFxuICBGRVRDSF9SRU1PVEVfU0VDVElPTl9SRVFVRVNULCBGRVRDSF9SRU1PVEVfU0VDVElPTl9FTkQsXG4gIFVQREFURV9TRUNUSU9OLCBTRUxFQ1RfU0VDVElPTiwgRU5BQkxFX1NFQ1RJT04sIERJU0FCTEVfU0VDVElPTixcbiAgQUxMT1dfU0VDVElPTiwgUkVTRVRfQkxPQ0tfUkVRVUVTVCwgUkVTRVRfRklSU1RfQUNUSVZFX1NFQ1RJT04sXG4gIElORk9STV9SRU1PVEVfU0VDVElPTl9FTkQsXG4gIFVQREFURV9MT0dPX1VSTCxcbiAgU0hPV19IRUFERVIsIEhJREVfSEVBREVSLFxuICBVUERBVEVfRElTQ09OTkVDVF9IQU5ETEVSXG59IGZyb20gJy4uL2NvbnN0YW50cy9hcHAnXG5pbXBvcnQgeyBzZW5kQWdlbnRQYXNzd29yZCwgc2VuZEFnZW50VG1wUGFzc3dvcmQgfSBmcm9tICcuLi9hY3Rpb25zL2FnZW50J1xuXG5jb25zdCBVTkJMT0NLX1RJTUVPVVQgPSA2MDAwMFxuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0U2VjdGlvbiAoa2V5KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogU0VMRUNUX1NFQ1RJT04sXG4gICAgcGF5bG9hZDoge1xuICAgICAga2V5XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVTZWN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBFTkFCTEVfU0VDVElPTixcbiAgICBwYXlsb2FkOiB7XG4gICAgICBrZXlcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc2FibGVTZWN0aW9uIChrZXkpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBESVNBQkxFX1NFQ1RJT04sXG4gICAgcGF5bG9hZDoge1xuICAgICAga2V5XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTZWN0aW9uIChrZXksIGRhdGEpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBVUERBVEVfU0VDVElPTixcbiAgICBwYXlsb2FkOiB7XG4gICAgICBrZXksXG4gICAgICBkYXRhXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhbGxvd1NlY3Rpb24gKGtleSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEFMTE9XX1NFQ1RJT04sXG4gICAgcGF5bG9hZDoge1xuICAgICAga2V5XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNldEJsb2NrUmVxdWVzdCAoa2V5KSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogUkVTRVRfQkxPQ0tfUkVRVUVTVCxcbiAgICBwYXlsb2FkOiB7XG4gICAgICBrZXlcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZldGNoU2VjdGlvbnNSZXF1ZXN0ICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBGRVRDSF9TRUNUSU9OU19SRVFVRVNUXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZldGNoU2VjdGlvbnNTdWNjZXNzIChpdGVtcywgcmVjZWl2ZWRBdCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEZFVENIX1NFQ1RJT05TX1NVQ0NFU1MsXG4gICAgcGF5bG9hZDoge1xuICAgICAgaXRlbXNcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZldGNoUmVtb3RlU2VjdGlvblJlcXVlc3QgKGtleSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEZFVENIX1JFTU9URV9TRUNUSU9OX1JFUVVFU1QsXG4gICAgcGF5bG9hZDoge1xuICAgICAga2V5XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaFJlbW90ZVNlY3Rpb25FbmQgKGtleSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IEZFVENIX1JFTU9URV9TRUNUSU9OX0VORCxcbiAgICBwYXlsb2FkOiB7XG4gICAgICBrZXlcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluZm9ybVJlbW90ZVNlY3Rpb25FbmQgKGtleSkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IElORk9STV9SRU1PVEVfU0VDVElPTl9FTkQsXG4gICAgcGF5bG9hZDoge1xuICAgICAga2V5XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaFNlY3Rpb25zRmFpbHVyZSAoZXJyb3IpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBGRVRDSF9TRUNUSU9OU19GQUlMVVJFLFxuICAgIHBheWxvYWQ6IHtcbiAgICAgIHN0YXR1czogZXJyb3IucmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgc3RhdHVzVGV4dDogZXJyb3IucmVzcG9uc2Uuc3RhdHVzVGV4dFxuICAgIH1cbiAgfVxufVxuXG4vLyBUSFVOS1xuZXhwb3J0IGZ1bmN0aW9uIGZldGNoU2VjdGlvbnMgKCkge1xuICByZXR1cm4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIGRpc3BhdGNoKGZldGNoU2VjdGlvbnNSZXF1ZXN0KCkpXG4gICAgUmVtb3RlLnNlbmQoe1xuICAgICAgcHJvdG86IFBST1RPLlNZU1RFTSxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgYWN0aW9uOiAnc2VjdGlvbidcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8vIFRIVU5LXG5leHBvcnQgZnVuY3Rpb24gZmV0Y2hSZW1vdGVTZWN0aW9uIChzZWN0aW9uKSB7XG4gIHJldHVybiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgZGlzcGF0Y2goZmV0Y2hSZW1vdGVTZWN0aW9uUmVxdWVzdChzZWN0aW9uKSlcbiAgICBSZW1vdGUuc2VuZCh7XG4gICAgICBwcm90bzogUFJPVE8uVEVNUF9TRUNUSU9OLFxuICAgICAgZGF0YToge1xuICAgICAgICBhY3Rpb246ICdhY2Nlc3Nfc2VjdGlvbicsXG4gICAgICAgIHNlY3Rpb25cbiAgICAgIH1cbiAgICB9KVxuICAgIGNvbnN0IHJlc2V0RGVsYXllZCA9ICgpID0+IHsgZGlzcGF0Y2gocmVzZXRCbG9ja1JlcXVlc3Qoc2VjdGlvbikpIH1cbiAgICBzZXRUaW1lb3V0KHJlc2V0RGVsYXllZCwgVU5CTE9DS19USU1FT1VUKVxuICB9XG59XG5cbi8vIFRIVU5LXG5leHBvcnQgZnVuY3Rpb24gaW5mb3JtUmVtb3RlU2VjdGlvbiAoc2VjdGlvbikge1xuICByZXR1cm4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIGRpc3BhdGNoKGluZm9ybVJlbW90ZVNlY3Rpb25FbmQoc2VjdGlvbikpXG4gICAgUmVtb3RlLnNlbmQoe1xuICAgICAgcHJvdG86IFBST1RPLlRFTVBfU0VDVElPTixcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgYWN0aW9uOiAnYWNjZXNzX3NlY3Rpb24nLFxuICAgICAgICBzZWN0aW9uXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRGaXJzdEFjdGl2ZVNlY3Rpb24gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFJFU0VUX0ZJUlNUX0FDVElWRV9TRUNUSU9OXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxvZ29VUkwgKGxvZ29VUkwpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBVUERBVEVfTE9HT19VUkwsXG4gICAgcGF5bG9hZDoge1xuICAgICAgbG9nb1VSTFxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvd0hlYWRlciAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogU0hPV19IRUFERVJcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaGlkZUhlYWRlciAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogSElERV9IRUFERVJcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRGlzY29ubmVjdEhhbmRsZXIgKGhhbmRsZURpc2Nvbm5lY3QpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBVUERBVEVfRElTQ09OTkVDVF9IQU5ETEVSLFxuICAgIHBheWxvYWQ6IHtcbiAgICAgIGhhbmRsZURpc2Nvbm5lY3RcbiAgICB9XG4gIH1cbn1cblxuLy8gVEhVTktcbi8vIFNlYXJjaCBpbnRvIHRoZSBzdGF0ZSBmb3IgYSBwYXNzd29yZCBvciBhIHRlbXBvcmFyeSBwYXNzd29yZFxuZXhwb3J0IGZ1bmN0aW9uIHRyeVBhc3N3b3JkcyAoKSB7XG4gIHJldHVybiAoZGlzcGF0Y2gsIGdldFN0YXRlKSA9PiB7XG4gICAgY29uc3QgeyBwYXNzLCB0bXBQYXNzLCBoYW5kbGVUZW1wUGFzc0dlbmVyYXRlZCB9ID0gZ2V0U3RhdGUoKS5hcHBcbiAgICBpZiAocGFzcyAmJiBwYXNzLmxlbmd0aCA+IDApIHtcbiAgICAgIGRpc3BhdGNoKHNlbmRBZ2VudFBhc3N3b3JkKHBhc3MpKVxuICAgICAgLy8gRGlzYWJsZSB0aGUgc2hhcmUgc2VjdGlvbiBpZiB0aGUgaGFuZGxlciBmdW5jdGlvbiB0byBnZW5lcmF0ZVxuICAgICAgLy8gdGhlIHNoYXJlIFVSTCBpcyBlbXB0eVxuICAgICAgaWYgKCFoYW5kbGVUZW1wUGFzc0dlbmVyYXRlZCkgZGlzcGF0Y2goZGlzYWJsZVNlY3Rpb24oJ3NoYXJlJykpXG4gICAgfSBlbHNlIGlmICh0bXBQYXNzICYmIHRtcFBhc3MubGVuZ3RoID4gMCkge1xuICAgICAgZGlzcGF0Y2goZGlzYWJsZVNlY3Rpb24oJ3NoYXJlJykpXG4gICAgICBkaXNwYXRjaChzZW5kQWdlbnRUbXBQYXNzd29yZCh0bXBQYXNzKSlcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCBSZW1vdGUgZnJvbSAnLi4vY29tbW9uL2xpYi9yZW1vdGUnXG5pbXBvcnQgeyBQUk9UTyB9IGZyb20gJy4uL2NvbnN0YW50cydcblxuaW1wb3J0IHtcbiAgUkVTRVRfRElTUExBWV9TVEFURSwgVVBEQVRFX0RJU1BMQVlfREFUQSwgQ0xFQVJfRElTUExBWV9FUlJPUixcbiAgQ09OTl9ESVNQTEFZX1JFUVVFU1QsIENPTk5fRElTUExBWV9TVUNDRVNTLCBDT05OX0RJU1BMQVlfRkFJTFVSRSxcbiAgRElTQ09OTl9ESVNQTEFZX1JFUVVFU1QsIERJU0NPTk5fRElTUExBWV9TVUNDRVNTXG59IGZyb20gJy4uL2NvbnN0YW50cy9kaXNwbGF5J1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzZXREaXNwbGF5U3RhdGUgKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFJFU0VUX0RJU1BMQVlfU1RBVEVcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRGlzcGxheURhdGEgKGRhdGEpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBVUERBVEVfRElTUExBWV9EQVRBLFxuICAgIHBheWxvYWQ6IHtcbiAgICAgIGRhdGFcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyRGlzcGxheUVycm9yICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBDTEVBUl9ESVNQTEFZX0VSUk9SXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbm5lY3Rpb25EaXNwbGF5UmVxdWVzdCAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQ09OTl9ESVNQTEFZX1JFUVVFU1RcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29ubmVjdGlvbkRpc3BsYXlTdWNjZXNzICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBDT05OX0RJU1BMQVlfU1VDQ0VTU1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25uZWN0aW9uRGlzcGxheUZhaWx1cmUgKGVycm9yKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogQ09OTl9ESVNQTEFZX0ZBSUxVUkUsXG4gICAgcGF5bG9hZDoge1xuICAgICAgZXJyb3JDb2RlOiBlcnJvci5yZXNwb25zZS5jb2RlLFxuICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5yZXNwb25zZS5yZWFzb25cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc2Nvbm5lY3Rpb25EaXNwbGF5UmVxdWVzdCAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogRElTQ09OTl9ESVNQTEFZX1JFUVVFU1RcbiAgfVxufVxuXG4vLyBUSFVOS1xuZXhwb3J0IGZ1bmN0aW9uIGRpc2NvbmVjdERpc3BsYXkgKCkge1xuICByZXR1cm4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICAgIFJlbW90ZS5zZW5kKHsgcHJvdG86IFBST1RPLkRJU1BMQVlfQ0xPU0UgfSlcbiAgICBkaXNwYXRjaChkaXNjb25uZWN0aW9uRGlzcGxheVJlcXVlc3QoKSlcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlzY29ubmVjdGlvbkRpc3BsYXlTdWNjZXNzICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBESVNDT05OX0RJU1BMQVlfU1VDQ0VTU1xuICB9XG59XG4iLCJcbmltcG9ydCBSZW1vdGUgZnJvbSAnLi4vY29tbW9uL2xpYi9yZW1vdGUnXG5pbXBvcnQgdG9QYXRoQXJyYXkgZnJvbSAnLi4vbGliL2ZpbGVzL3BhdGgtYXJyYXknXG5pbXBvcnQgeyBiYXNlNjRFbmNBcnIgfSBmcm9tICcuLi9jb21tb24vbGliL2Jhc2U2NCdcblxuaW1wb3J0IHsgUFJPVE8gfSBmcm9tICcuLi9jb25zdGFudHMnXG5cbmltcG9ydCB7XG4gIENIQU5HRV9ESVJfRklMRVMsXG4gIEZFVENIX0ZJTEVTX1JFUVVFU1QsIEZFVENIX0ZJTEVTX1NVQ0NFU1MsIEZFVENIX0ZJTEVTX0ZBSUxVUkUsXG4gIERFTEVURV9GSUxFX1JFUVVFU1QsIERFTEVURV9GSUxFX1NVQ0NFU1MsIERFTEVURV9GSUxFX0ZBSUxVUkUsXG4gIENMRUFSX0ZJTEVTX0VSUk9SLCBDTEVBUl9GSUxFX0VSUk9SLFxuICBET1dOTE9BRF9GSUxFX0ZBSUxVUkUsIENMRUFSX0RPV05MT0FEX0ZJTEVfRVJST1IsXG4gIFVQTE9BRF9GSUxFX0ZBSUxVUkUsIENMRUFSX1VQTE9BRF9GSUxFX0VSUk9SXG59IGZyb20gJy4uL2NvbnN0YW50cy9maWxlcydcblxuaW1wb3J0IHsgZ2V0RmlsZSB9IGZyb20gJy4uL3JlZHVjZXJzL2ZpbGVzJ1xuXG5leHBvcnQgY29uc3QgY2QgPSAocGF0aCkgPT4gKHtcbiAgdHlwZTogQ0hBTkdFX0RJUl9GSUxFUyxcbiAgcGF5bG9hZDoge1xuICAgIHBhdGhBcnJheTogdG9QYXRoQXJyYXkocGF0aClcbiAgfVxufSlcblxuZXhwb3J0IGNvbnN0IGZldGNoRmlsZXNSZXF1ZXN0ID0gKHBhdGgpID0+ICh7XG4gIHR5cGU6IEZFVENIX0ZJTEVTX1JFUVVFU1QsXG4gIHBheWxvYWQ6IHtcbiAgICBwYXRoQXJyYXk6IHRvUGF0aEFycmF5KHBhdGgpXG4gIH1cbn0pXG5cbmV4cG9ydCBjb25zdCBmZXRjaEZpbGVzRmFpbHVyZSA9IChwYXRoLCBlcnJvcikgPT4gKHtcbiAgdHlwZTogRkVUQ0hfRklMRVNfRkFJTFVSRSxcbiAgcGF5bG9hZDoge1xuICAgIHBhdGhBcnJheTogdG9QYXRoQXJyYXkocGF0aCksXG4gICAgZXJyb3JDb2RlOiBlcnJvci5yZXNwb25zZS5zdGF0dXMsXG4gICAgZXJyb3JNZXNzYWdlOiBlcnJvci5yZXNwb25zZS5zdGF0dXNUZXh0XG4gIH1cbn0pXG5cbmV4cG9ydCBjb25zdCBmZXRjaEZpbGVzU3VjY2VzcyA9IChwYXRoLCBpdGVtcywgcmVjZWl2ZWRBdCwge1xuICByb290SXNXaW4sXG4gIHJvb3RJc1Bvc2l4LFxuICByb290SXNSZWFkYWJsZSxcbiAgcm9vdElzV3JpdGFibGVcbn0gPSB7fSkgPT4gKHtcbiAgdHlwZTogRkVUQ0hfRklMRVNfU1VDQ0VTUyxcbiAgcGF5bG9hZDoge1xuICAgIHBhdGhBcnJheTogdG9QYXRoQXJyYXkocGF0aCksXG4gICAgcmVjZWl2ZWRBdCxcbiAgICBpdGVtcyxcbiAgICByb290SXNXaW4sXG4gICAgcm9vdElzUG9zaXgsXG4gICAgcm9vdElzUmVhZGFibGUsXG4gICAgcm9vdElzV3JpdGFibGVcbiAgfVxufSlcblxuLy8gVEhVTktcbmV4cG9ydCBjb25zdCBmZXRjaEZpbGVzID0gKHBhdGgpID0+IChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgZGlzcGF0Y2goZmV0Y2hGaWxlc1JlcXVlc3QocGF0aCkpXG4gIC8vIFdTXG4gIFJlbW90ZS5zZW5kKHtcbiAgICBwcm90bzogUFJPVE8uRklMRVMsXG4gICAgZGF0YToge1xuICAgICAgYWN0aW9uOiAnbHMnLFxuICAgICAgcGF0aDogcGF0aFxuICAgIH1cbiAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGNsZWFyRmlsZXNFcnJvciA9IChwYXRoKSA9PiAoe1xuICB0eXBlOiBDTEVBUl9GSUxFU19FUlJPUixcbiAgcGF5bG9hZDoge1xuICAgIHBhdGhBcnJheTogdG9QYXRoQXJyYXkocGF0aClcbiAgfVxufSlcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZUZpbGVSZXF1ZXN0ID0gKHBhdGgpID0+ICh7XG4gIHR5cGU6IERFTEVURV9GSUxFX1JFUVVFU1QsXG4gIHBheWxvYWQ6IHtcbiAgICBwYXRoQXJyYXk6IHRvUGF0aEFycmF5KHBhdGgpXG4gIH1cbn0pXG5cbmV4cG9ydCBjb25zdCBkZWxldGVGaWxlRmFpbHVyZSA9IChwYXRoLCBlcnJvcikgPT4gKHtcbiAgdHlwZTogREVMRVRFX0ZJTEVfRkFJTFVSRSxcbiAgcGF5bG9hZDoge1xuICAgIHBhdGhBcnJheTogdG9QYXRoQXJyYXkocGF0aCksXG4gICAgZXJyb3JDb2RlOiBlcnJvci5yZXNwb25zZS5zdGF0dXMsXG4gICAgZXJyb3JNZXNzYWdlOiBlcnJvci5yZXNwb25zZS5zdGF0dXNUZXh0XG4gIH1cbn0pXG5cbmV4cG9ydCBjb25zdCBkZWxldGVGaWxlU3VjY2VzcyA9IChwYXRoKSA9PiAoe1xuICB0eXBlOiBERUxFVEVfRklMRV9TVUNDRVNTLFxuICBwYXlsb2FkOiB7XG4gICAgcGF0aEFycmF5OiB0b1BhdGhBcnJheShwYXRoKVxuICB9XG59KVxuXG4vLyBUSFVOS1xuZXhwb3J0IGNvbnN0IGRlbGV0ZUZpbGUgPSAocGF0aCkgPT4gKGRpc3BhdGNoLCBnZXRTdGF0ZSkgPT4ge1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZShnZXRTdGF0ZSgpLmZpbGVzLCBwYXRoKVxuXG4gIGlmIChmaWxlKSB7XG4gICAgZGlzcGF0Y2goZGVsZXRlRmlsZVJlcXVlc3QocGF0aCkpXG4gICAgUmVtb3RlLnNlbmQoe1xuICAgICAgcHJvdG86IFBST1RPLkZJTEVTLFxuICAgICAgZGF0YToge1xuICAgICAgICBhY3Rpb246ICdkZWxldGUnLFxuICAgICAgICBkaXJfbmFtZTogZmlsZS5kaXJuYW1lLFxuICAgICAgICBmaWxlX25hbWU6IGZpbGUuYmFzZW5hbWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBjbGVhckZpbGVFcnJvciA9IChwYXRoKSA9PiAoe1xuICB0eXBlOiBDTEVBUl9GSUxFX0VSUk9SLFxuICBwYXlsb2FkOiB7XG4gICAgcGF0aEFycmF5OiB0b1BhdGhBcnJheShwYXRoKVxuICB9XG59KVxuXG4vLyBEb3dubG9hZC9VcGxvYWRcblxuZXhwb3J0IGNvbnN0IGRvd25sb2FkRmlsZUZhaWx1cmUgPSAocGF0aCwgZXJyb3IpID0+ICh7XG4gIHR5cGU6IERPV05MT0FEX0ZJTEVfRkFJTFVSRSxcbiAgcGF5bG9hZDoge1xuICAgIHBhdGgsXG4gICAgZXJyb3JDb2RlOiBlcnJvci5yZXNwb25zZS5zdGF0dXMsXG4gICAgZXJyb3JNZXNzYWdlOiBlcnJvci5yZXNwb25zZS5zdGF0dXNUZXh0XG4gIH1cbn0pXG5cbmV4cG9ydCBjb25zdCBjbGVhckRvd25sb2FkRmlsZUVycm9yID0gKHBhdGgpID0+ICh7XG4gIHR5cGU6IENMRUFSX0RPV05MT0FEX0ZJTEVfRVJST1IsXG4gIHBheWxvYWQ6IHsgcGF0aCB9XG59KVxuXG5leHBvcnQgY29uc3QgdXBsb2FkRmlsZUZhaWx1cmUgPSAocGF0aCwgZXJyb3IpID0+ICh7XG4gIHR5cGU6IFVQTE9BRF9GSUxFX0ZBSUxVUkUsXG4gIHBheWxvYWQ6IHtcbiAgICBwYXRoLFxuICAgIGVycm9yQ29kZTogZXJyb3IucmVzcG9uc2Uuc3RhdHVzLFxuICAgIGVycm9yTWVzc2FnZTogZXJyb3IucmVzcG9uc2Uuc3RhdHVzVGV4dFxuICB9XG59KVxuXG5leHBvcnQgY29uc3QgY2xlYXJVcGxvYWRGaWxlRXJyb3IgPSAocGF0aCkgPT4gKHtcbiAgdHlwZTogQ0xFQVJfVVBMT0FEX0ZJTEVfRVJST1IsXG4gIHBheWxvYWQ6IHsgcGF0aCB9XG59KVxuXG4vLyBOT1QgQU4gQUNUSU9OIENSRUFUT1JcbmV4cG9ydCBjb25zdCBzZW5kQ2h1bmsgPSAoZGlybmFtZSwgYmFzZW5hbWUsIGNodW5rLCBvZmZzZXQsIHNpemUpID0+IHtcbiAgY29uc3QgY2h1bmtWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoY2h1bmspXG4gIFJlbW90ZS5zZW5kKHtcbiAgICBwcm90bzogUFJPVE8uRklMRVMsXG4gICAgZGF0YToge1xuICAgICAgYWN0aW9uOiAndXBsb2FkJyxcbiAgICAgIGRpcl9uYW1lOiBkaXJuYW1lLFxuICAgICAgZmlsZV9uYW1lOiBiYXNlbmFtZSxcbiAgICAgIGNodW5rOiBiYXNlNjRFbmNBcnIoY2h1bmtWaWV3KSxcbiAgICAgIG9mZnNldDogb2Zmc2V0LFxuICAgICAgc2l6ZTogc2l6ZVxuICAgIH1cbiAgfSlcbn1cblxuLy8gTk9UIEFOIEFDVElPTiBDUkVBVE9SXG5leHBvcnQgY29uc3QgcmVxdWVzdENodW5rID0gKGRpcm5hbWUsIGJhc2VuYW1lLCBvZmZzZXQpID0+IHtcbiAgUmVtb3RlLnNlbmQoe1xuICAgIHByb3RvOiBQUk9UTy5GSUxFUyxcbiAgICBkYXRhOiB7XG4gICAgICBhY3Rpb246ICdkb3dubG9hZCcsXG4gICAgICBkaXJfbmFtZTogZGlybmFtZSxcbiAgICAgIGZpbGVfbmFtZTogYmFzZW5hbWUsXG4gICAgICBvZmZzZXQ6IG9mZnNldFxuICAgIH1cbiAgfSlcbn1cbiIsImltcG9ydCBSZW1vdGUgZnJvbSAnLi4vY29tbW9uL2xpYi9yZW1vdGUnXG5pbXBvcnQgeyBQUk9UTyB9IGZyb20gJy4uL2NvbnN0YW50cydcblxuaW1wb3J0IHtcbiAgUkVTRVRfVEVSTV9TVEFURSxcbiAgSU5JVF9URVJNX1JFUVVFU1QsXG4gIElOSVRfVEVSTV9TVUNDRVNTLFxuICBJTklUX1RFUk1fRkFJTFVSRSxcbiAgU0FWRV9URVJNX0RBVEEsXG4gIENMRUFSX1RFUk1fRVJST1Jcbn0gZnJvbSAnLi4vY29uc3RhbnRzL3Rlcm1pbmFsJ1xuXG5leHBvcnQgY29uc3QgcmVzZXRUZXJtU3RhdGUgPSAoKSA9PiAoeyB0eXBlOiBSRVNFVF9URVJNX1NUQVRFIH0pXG5cbmV4cG9ydCBjb25zdCBpbml0aWFsaXplVGVybVJlcXVlc3QgPSAoY29scywgcm93cykgPT4gKHtcbiAgdHlwZTogSU5JVF9URVJNX1JFUVVFU1QsXG4gIHBheWxvYWQ6IHsgY29scywgcm93cyB9XG59KVxuXG5leHBvcnQgY29uc3QgaW5pdGlhbGl6ZVRlcm1TdWNjZXNzID0gKGluaXRpYWxpemVkQXQpID0+ICh7XG4gIHR5cGU6IElOSVRfVEVSTV9TVUNDRVNTLFxuICBwYXlsb2FkOiB7IGluaXRpYWxpemVkQXQgfVxufSlcblxuZXhwb3J0IGNvbnN0IGluaXRpYWxpemVUZXJtRmFpbHVyZSA9IChlcnJvcikgPT4gKHtcbiAgdHlwZTogSU5JVF9URVJNX0ZBSUxVUkUsXG4gIHBheWxvYWQ6IHtcbiAgICBlcnJvckNvZGU6IGVycm9yLnJlc3BvbnNlLnN0YXR1cyxcbiAgICBlcnJvck1lc3NhZ2U6IGVycm9yLnJlc3BvbnNlLnN0YXR1c1RleHRcbiAgfVxufSlcblxuZXhwb3J0IGNvbnN0IGNsZWFyVGVybUVycm9yID0gKCkgPT4gKHsgdHlwZTogQ0xFQVJfVEVSTV9FUlJPUiB9KVxuXG4vLyBUSFVOS1xuZXhwb3J0IGNvbnN0IGluaXRpYWxpemVUZXJtID0gKGNvbHMsIHJvd3MpID0+IChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgZGlzcGF0Y2goaW5pdGlhbGl6ZVRlcm1SZXF1ZXN0KGNvbHMsIHJvd3MpKVxuICBSZW1vdGUuc2VuZCh7IHByb3RvOiBQUk9UTy5URVJNX0lOSVQsIGRhdGE6IHsgY29scywgcm93cyB9IH0pXG59XG5cbmV4cG9ydCBjb25zdCBzYXZlVGVybURhdGEgPSAobmV3RGF0YSwgZGF0YVJldmVpdmVkQXQpID0+ICh7XG4gIHR5cGU6IFNBVkVfVEVSTV9EQVRBLFxuICBwYXlsb2FkOiB7IG5ld0RhdGEsIGRhdGFSZXZlaXZlZEF0IH1cbn0pXG5cbi8vIFRIVU5LXG5leHBvcnQgY29uc3Qgc2VuZFRlcm1EYXRhID0gKGRhdGEpID0+IChkaXNwYXRjaCwgZ2V0U3RhdGUpID0+IHtcbiAgUmVtb3RlLnNlbmQoeyBwcm90bzogUFJPVE8uVEVSTSwgZGF0YSB9KVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnXG5cbmNsYXNzIEJhc2VDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnQge1xuICAvLyBCaW5kIHRoZSBjbGFzcyBjb250ZXh0IHRvIHRoZSBldmVudCBoYW5kbGVyc1xuICBfYmluZCAoLi4ubWV0aG9kcykge1xuICAgIG1ldGhvZHMuZm9yRWFjaCgobWV0aG9kKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIHRoaXNbbWV0aG9kXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhpc1ttZXRob2RdID0gdGhpc1ttZXRob2RdLmJpbmQodGhpcylcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJhc2VDb21wb25lbnRcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCBjbGFzc25hbWVzIGZyb20gJ2NsYXNzbmFtZXMnXG5cbmNsYXNzIENlbGwgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcbiAgICB0aGlzLl9oYW5kbGVDZWxsQ2xpY2sgPSB0aGlzLl9oYW5kbGVDZWxsQ2xpY2suYmluZCh0aGlzKVxuICB9XG5cbiAgX2hhbmRsZUNlbGxDbGljayAoY2VsbERhdGEpIHtcbiAgICByZXR1cm4gKHR5cGVvZiB0aGlzLnByb3BzLm9uQ2VsbENsaWNrID09PSAnZnVuY3Rpb24nKVxuICAgICAgPyAoZXZlbnQpID0+IHRoaXMucHJvcHMub25DZWxsQ2xpY2soZXZlbnQsIGNlbGxEYXRhKVxuICAgICAgOiBudWxsXG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgY29sdW1uS2V5LCBhbGlnbiwgd2lkdGgsIGNlbGxGb3JtYXR0ZXIsIGNoaWxkcmVuIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgY2VsbFN0eWxlID0geyB3aWR0aDogd2lkdGggfHwgJ2F1dG8nIH1cbiAgICBjb25zdCBjbGFzc2VzID0gWyBgdGV4dC0ke2FsaWdufWAgXVxuXG4gICAgLy8gVHJ5IHRvIGZvcm1hdCB0aGUgY2hpbGRyZW5cbiAgICBjb25zdCBmb3JtYXR0ZWRDaGlsZHJlbiA9ICh0eXBlb2YgY2VsbEZvcm1hdHRlciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgID8gY2VsbEZvcm1hdHRlcihjaGlsZHJlbilcbiAgICAgIDogY2hpbGRyZW5cblxuICAgIHZhciBjZWxsRGF0YSA9IHtcbiAgICAgIGNvbHVtbktleTogY29sdW1uS2V5LFxuICAgICAgY2hpbGRyZW46IGNoaWxkcmVuLFxuICAgICAgYWxpZ246IGFsaWduLFxuICAgICAgd2lkdGg6IHdpZHRoXG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDx0ZFxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzbmFtZXMoY2xhc3Nlcyl9XG4gICAgICAgIHN0eWxlPXtjZWxsU3R5bGV9XG4gICAgICAgIG9uQ2xpY2s9e3RoaXMuX2hhbmRsZUNlbGxDbGljayhjZWxsRGF0YSl9PlxuICAgICAgICB7IGZvcm1hdHRlZENoaWxkcmVuIH1cbiAgICAgIDwvdGQ+XG4gICAgKVxuICB9XG59XG5cbkNlbGwucHJvcFR5cGVzID0ge1xuICBjb2x1bW5LZXk6IFJlYWN0LlByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgIFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gICAgUmVhY3QuUHJvcFR5cGVzLm51bWJlclxuICBdKS5pc1JlcXVpcmVkLFxuICBhbGlnbjogUmVhY3QuUHJvcFR5cGVzLm9uZU9mKFsnbGVmdCcsICdjZW50ZXInLCAncmlnaHQnXSksXG4gIHdpZHRoOiBSZWFjdC5Qcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICAgIFJlYWN0LlByb3BUeXBlcy5udW1iZXJcbiAgXSksXG4gIGNlbGxGb3JtYXR0ZXI6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBvbkNlbGxDbGljazogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGNoaWxkcmVuOiBSZWFjdC5Qcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICAgIFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gICAgUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gICAgUmVhY3QuUHJvcFR5cGVzLm9iamVjdFxuICBdKVxufVxuQ2VsbC5kZWZhdWx0UHJvcHMgPSB7XG4gIGFsaWduOiAnY2VudGVyJ1xufVxuXG5leHBvcnQgZGVmYXVsdCBDZWxsXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJ1xuXG5jbGFzcyBIZWFkQ2VsbCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgYWxpZ24sIHdpZHRoLCBoZWFkRm9ybWF0dGVyLCBjaGlsZHJlbiwgb25DbGljaywgc29ydEJ1dHRvblxuICAgIH0gPSB0aGlzLnByb3BzXG5cbiAgICBjb25zdCBjbGFzc2VzID0gWyBgdGV4dC0ke2FsaWdufWAgXVxuICAgIGNvbnN0IGhlYWRTdHlsZSA9IHsgd2lkdGg6IHdpZHRoIHx8ICdhdXRvJyB9XG4gICAgaWYgKHR5cGVvZiBvbkNsaWNrID09PSAnZnVuY3Rpb24nKSBoZWFkU3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInXG5cbiAgICAvLyBUcnkgdG8gZm9ybWF0IHRoZSBjaGlsZHJlblxuICAgIGNvbnN0IGZvcm1hdHRlZENoaWxkcmVuID0gKHR5cGVvZiBoZWFkRm9ybWF0dGVyID09PSAnZnVuY3Rpb24nKVxuICAgICAgPyBoZWFkRm9ybWF0dGVyKGNoaWxkcmVuKVxuICAgICAgOiBjaGlsZHJlblxuXG4gICAgcmV0dXJuIChcbiAgICAgIDx0aFxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoY2xhc3Nlcyl9XG4gICAgICAgIHN0eWxlPXtoZWFkU3R5bGV9XG4gICAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9PlxuICAgICAgICB7IGZvcm1hdHRlZENoaWxkcmVuIH1cbiAgICAgICAgeyBzb3J0QnV0dG9uICYmXG4gICAgICAgICAgc29ydEJ1dHRvblxuICAgICAgICB9XG4gICAgICA8L3RoPlxuICAgIClcbiAgfVxufVxuXG5IZWFkQ2VsbC5wcm9wVHlwZXMgPSB7XG4gIGNvbHVtbktleTogUmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgICBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyXG4gIF0pLmlzUmVxdWlyZWQsXG4gIGFsaWduOiBSZWFjdC5Qcm9wVHlwZXMub25lT2YoWydsZWZ0JywgJ2NlbnRlcicsICdyaWdodCddKSxcbiAgd2lkdGg6IFJlYWN0LlByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgIFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gICAgUmVhY3QuUHJvcFR5cGVzLm51bWJlclxuICBdKSxcbiAgaGVhZEZvcm1hdHRlcjogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIHNvcnRCdXR0b246IFJlYWN0LlByb3BUeXBlcy5lbGVtZW50LFxuICBvbkNsaWNrOiBSZWFjdC5Qcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgICBSZWFjdC5Qcm9wVHlwZXMuYm9vbFxuICBdKSxcbiAgY2hpbGRyZW46IFJlYWN0LlByb3BUeXBlcy5ub2RlLmlzUmVxdWlyZWRcbn1cbkhlYWRDZWxsLmRlZmF1bHRQcm9wcyA9IHtcbiAgYWxpZ246ICdjZW50ZXInXG59XG5cbmV4cG9ydCBkZWZhdWx0IEhlYWRDZWxsXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJ1xuXG5pbXBvcnQgQ29sdW1uIGZyb20gJy4uL2xpYi9Db2x1bW4nXG5pbXBvcnQgQ2VsbCBmcm9tICcuL0NlbGwnXG5cbmNsYXNzIFJvdyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBjb2x1bW5zLCBkYXRhLCBzZWxlY3RlZCwgcm93U2VsZWN0aW9uIH0gPSB0aGlzLnByb3BzXG5cbiAgICBjb25zdCBjbGFzc2VzID0geyAnaW5mbyc6IHNlbGVjdGVkIH1cbiAgICBjb25zdCBzdHlsZSA9IHsgY3Vyc29yOiAncG9pbnRlcicgfVxuXG4gICAgY29uc3QgaGFuZGxlQ2xpY2sgPSAodHlwZW9mIHJvd1NlbGVjdGlvbiAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICA/IChldmVudCkgPT4gcm93U2VsZWN0aW9uKGRhdGEsICFzZWxlY3RlZClcbiAgICAgIDogbnVsbFxuXG4gICAgcmV0dXJuIChcbiAgICAgIDx0clxuICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoY2xhc3Nlcyl9XG4gICAgICAgIG9uQ2xpY2s9e2hhbmRsZUNsaWNrfVxuICAgICAgICBzdHlsZT17c3R5bGV9PlxuICAgICAgICB7XG4gICAgICAgICAgY29sdW1ucy5tYXAoKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHVtbi5oaWRkZW4pIHJldHVybiBudWxsXG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxDZWxsXG4gICAgICAgICAgICAgICAga2V5PXtjb2x1bW4uZGF0YUtleX1cbiAgICAgICAgICAgICAgICBjb2x1bW5LZXk9e2NvbHVtbi5kYXRhS2V5fVxuICAgICAgICAgICAgICAgIGFsaWduPXtjb2x1bW4uYWxpZ259XG4gICAgICAgICAgICAgICAgd2lkdGg9e2NvbHVtbi53aWR0aH1cbiAgICAgICAgICAgICAgICBjZWxsRm9ybWF0dGVyPXtjb2x1bW4uY2VsbEZvcm1hdHRlcn0+XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZGF0YVtjb2x1bW4uZGF0YUtleV1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvQ2VsbD5cbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICA8L3RyPlxuICAgIClcbiAgfVxufVxuXG5Sb3cucHJvcFR5cGVzID0ge1xuICAvLyBDb2x1bW5zXG4gIGNvbHVtbnM6IFJlYWN0LlByb3BUeXBlcy5hcnJheU9mKFJlYWN0LlByb3BUeXBlcy5pbnN0YW5jZU9mKENvbHVtbikpLmlzUmVxdWlyZWQsXG4gIC8vIERhdGEgb2YgdGhlIHJvd1xuICBkYXRhOiBSZWFjdC5Qcm9wVHlwZXMub2JqZWN0LmlzUmVxdWlyZWQsXG4gIC8vIFdldGhlciBpcyBzZWxlY3RlZCBvciBub3RcbiAgc2VsZWN0ZWQ6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICAvLyBJbnRlcm5hbCBmdW5jdGlvbiB3aGljaCB0cmlnZ2VycyB0aGUgcm93IHNlbGVjdGlvbiBjaGFuZ2VcbiAgcm93U2VsZWN0aW9uOiBSZWFjdC5Qcm9wVHlwZXMuZnVuY1xufVxuUm93LmRlZmF1bHRQcm9wcyA9IHtcbiAgc2VsZWN0ZWQ6IGZhbHNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IFJvd1xuIiwiaW1wb3J0IFJlYWN0LCB7IFByb3BUeXBlcyB9IGZyb20gJ3JlYWN0J1xuXG5pbXBvcnQgQ29sdW1uIGZyb20gJy4uL2xpYi9Db2x1bW4nXG5pbXBvcnQgUm93IGZyb20gJy4vUm93J1xuXG5jbGFzcyBUQm9keSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgZGF0YSwgY29sdW1ucywga2V5VmFsdWUsIGtleVZhbHVlU2VsZWN0ZWQsIHJvd1NlbGVjdGlvblxuICAgIH0gPSB0aGlzLnByb3BzXG5cbiAgICByZXR1cm4gKFxuICAgICAgPHRib2R5PlxuICAgICAgICB7XG4gICAgICAgICAgLy8gSXRlcmF0ZSB0aGUgcm93c1xuICAgICAgICAgIGRhdGEubWFwKChyb3dEYXRhLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gZmFsc2VcblxuICAgICAgICAgICAgLy8gVGhlIHJvdyBvbmx5IGNhbiBiZSBzZWxlY3RlZCB0aGVuIHRoZSAna2V5VmFsdWUnIGlzIHNldHRlZFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXlWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2Yga2V5VmFsdWVTZWxlY3RlZCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICgodHlwZW9mIGtleVZhbHVlU2VsZWN0ZWQgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHVlU2VsZWN0ZWQubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiBrZXlWYWx1ZVNlbGVjdGVkID09PSAnbnVtYmVyJykgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2Ygcm93RGF0YVtrZXlWYWx1ZV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHNlbGVjdGVkID0gKHJvd0RhdGFba2V5VmFsdWVdID09PSBrZXlWYWx1ZVNlbGVjdGVkKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8Um93XG4gICAgICAgICAgICAgICAga2V5PXtpbmRleH1cbiAgICAgICAgICAgICAgICBjb2x1bW5zPXtjb2x1bW5zfVxuICAgICAgICAgICAgICAgIGRhdGE9e3Jvd0RhdGF9XG4gICAgICAgICAgICAgICAga2V5VmFsdWU9e2tleVZhbHVlfVxuICAgICAgICAgICAgICAgIHNlbGVjdGVkPXtzZWxlY3RlZH1cbiAgICAgICAgICAgICAgICByb3dTZWxlY3Rpb249e3Jvd1NlbGVjdGlvbn0gLz5cbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICA8L3Rib2R5PlxuICAgIClcbiAgfVxufVxuXG5UQm9keS5wcm9wVHlwZXMgPSB7XG4gIC8vIENvbHVtbnNcbiAgY29sdW1uczogUHJvcFR5cGVzLmFycmF5T2YoUHJvcFR5cGVzLmluc3RhbmNlT2YoQ29sdW1uKSkuaXNSZXF1aXJlZCxcbiAgLy8gUm93c1xuICBkYXRhOiBQcm9wVHlwZXMuYXJyYXlPZihQcm9wVHlwZXMub2JqZWN0KS5pc1JlcXVpcmVkLFxuICAvLyBDb2x1bW4gd2hpY2ggY29udGFpbnMgdW5pcXVlIHZhbHVlc1xuICBrZXlWYWx1ZTogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLFxuICAvLyBJZGVudGlmaWVyIG9mIHRoZSBzZWxlY3RlZCByb3cuIEl0IGlzIGEgdmFsdWUgb2YgdGhlICdrZXlWYWx1ZScgY29sdW1uXG4gIGtleVZhbHVlU2VsZWN0ZWQ6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKSxcbiAgLy8gSW50ZXJuYWwgZnVuY3Rpb24gd2hpY2ggdHJpZ2dlcnMgdGhlIHJvdyBzZWxlY3Rpb24gY2hhbmdlXG4gIHJvd1NlbGVjdGlvbjogUHJvcFR5cGVzLmZ1bmNcbn1cblxuZXhwb3J0IGRlZmF1bHQgVEJvZHlcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEdseXBoaWNvbiB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcblxuaW1wb3J0IEhlYWRDZWxsIGZyb20gJy4vSGVhZENlbGwnXG5pbXBvcnQgQ29sdW1uIGZyb20gJy4uL2xpYi9Db2x1bW4nXG5cbmNsYXNzIFRIZWFkIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICB0aGlzLnJlbmRlclNvcnRCdXR0b24gPSB0aGlzLnJlbmRlclNvcnRCdXR0b24uYmluZCh0aGlzKVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGNvbHVtbnMsIG9yZGVyQnksIGNoYW5nZU9yZGVyLCBjaGFuZ2VTb3J0SGFuZGxlciB9ID0gdGhpcy5wcm9wc1xuICAgIHJldHVybiAoXG4gICAgICA8dGhlYWQ+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlckhlYWRDZWxsKGNvbHVtbiwgb3JkZXJCeSwgY2hhbmdlT3JkZXIsIGNoYW5nZVNvcnRIYW5kbGVyKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgIClcbiAgfVxuXG4gIHJlbmRlckhlYWRDZWxsIChjb2x1bW4sIG9yZGVyQnksIGNoYW5nZU9yZGVyLCBjaGFuZ2VTb3J0SGFuZGxlcikge1xuICAgIGlmIChjb2x1bW4uaGlkZGVuKSByZXR1cm4gbnVsbFxuXG4gICAgLy8gU29ydCBidXR0b25cbiAgICB2YXIgc29ydEJ1dHRvbiA9IG51bGxcbiAgICBpZiAoY29sdW1uLnNvcnRhYmxlICYmIGNvbHVtbi5kYXRhS2V5ID09PSBvcmRlckJ5LmNvbHVtbktleSkge1xuICAgICAgc29ydEJ1dHRvbiA9IHRoaXMucmVuZGVyU29ydEJ1dHRvbihjb2x1bW4uc29ydFByb3BzLnR5cGUsIG9yZGVyQnkudmFsdWUpXG4gICAgfVxuICAgIC8vIFNvcnQgaGFuZGxlclxuICAgIHZhciBzb3J0Q2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcblxuICAgICAgY2hhbmdlU29ydEhhbmRsZXIoY29sdW1uLnNvcnRQcm9wc1snc29ydC1oYW5kbGVyJ10pXG5cbiAgICAgIGlmIChvcmRlckJ5LmNvbHVtbktleSAhPT0gY29sdW1uLmRhdGFLZXkpIHtcbiAgICAgICAgY2hhbmdlT3JkZXIoY29sdW1uLmRhdGFLZXksICdBU0MnKVxuICAgICAgfSBlbHNlIGlmIChvcmRlckJ5LnZhbHVlID09PSAnQVNDJykge1xuICAgICAgICBjaGFuZ2VPcmRlcihjb2x1bW4uZGF0YUtleSwgJ0RFU0MnKVxuICAgICAgfSBlbHNlIGlmIChvcmRlckJ5LnZhbHVlID09PSAnREVTQycpIHtcbiAgICAgICAgY2hhbmdlT3JkZXIoJycsICdBU0MnKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8SGVhZENlbGxcbiAgICAgICAga2V5PXtjb2x1bW4uZGF0YUtleX1cbiAgICAgICAgY29sdW1uS2V5PXtjb2x1bW4uZGF0YUtleX1cbiAgICAgICAgYWxpZ249e2NvbHVtbi5hbGlnbn1cbiAgICAgICAgd2lkdGg9e2NvbHVtbi53aWR0aH1cbiAgICAgICAgaGVhZEZvcm1hdHRlcj17Y29sdW1uLmhlYWRGb3JtYXR0ZXJ9XG4gICAgICAgIHNvcnRCdXR0b249e3NvcnRCdXR0b259XG4gICAgICAgIG9uQ2xpY2s9e2NvbHVtbi5zb3J0YWJsZSA/IHNvcnRDbGljayA6IGZhbHNlfVxuICAgICAgICBmaWx0ZXJCdXR0b249e251bGx9PlxuICAgICAgICB7XG4gICAgICAgICAgY29sdW1uLm5hbWVcbiAgICAgICAgfVxuICAgICAgPC9IZWFkQ2VsbD5cbiAgICApXG4gIH1cblxuICByZW5kZXJTb3J0QnV0dG9uICh0eXBlLCB2YWx1ZSkge1xuICAgIHZhciBidXR0b25UeXBlID0gJydcbiAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gJ0RFU0MnKSBidXR0b25UeXBlID0gJ3NvcnQtYnktYWxwaGFiZXQtYWx0J1xuICAgICAgZWxzZSBidXR0b25UeXBlID0gJ3NvcnQtYnktYWxwaGFiZXQnXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgaWYgKHZhbHVlID09PSAnREVTQycpIGJ1dHRvblR5cGUgPSAnc29ydC1ieS1vcmRlci1hbHQnXG4gICAgICBlbHNlIGJ1dHRvblR5cGUgPSAnc29ydC1ieS1vcmRlcidcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHZhbHVlID09PSAnREVTQycpIGJ1dHRvblR5cGUgPSAnc29ydC1ieS1hdHRyaWJ1dGVzLWFsdCdcbiAgICAgIGVsc2UgYnV0dG9uVHlwZSA9ICdzb3J0LWJ5LWF0dHJpYnV0ZXMnXG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxHbHlwaGljb25cbiAgICAgICAgc3R5bGU9e3sgcGFkZGluZ0xlZnQ6ICcxMHB4JyB9fVxuICAgICAgICBnbHlwaD17YnV0dG9uVHlwZX1cbiAgICAgICAgY2xhc3NOYW1lPSdwdWxsLXJpZ2h0JyAvPlxuICAgIClcbiAgfVxufVxuXG5USGVhZC5wcm9wVHlwZXMgPSB7XG4gIGNvbHVtbnM6IFJlYWN0LlByb3BUeXBlcy5hcnJheU9mKFJlYWN0LlByb3BUeXBlcy5pbnN0YW5jZU9mKENvbHVtbikpLmlzUmVxdWlyZWQsXG4gIC8vIE9iamVjdCB3aXRoIHRoZSBzb3J0IGRhdGFcbiAgb3JkZXJCeTogUmVhY3QuUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAvLyBGdW5jdGlvbiB0byBjaGFuZ2UgdGhlIHJvd3Mgc29ydFxuICBjaGFuZ2VPcmRlcjogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgY2hhbmdlU29ydEhhbmRsZXI6IFJlYWN0LlByb3BUeXBlcy5mdW5jXG59XG5cbmV4cG9ydCBkZWZhdWx0IFRIZWFkXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJ1xuXG5pbXBvcnQgQ29sdW1uIGZyb20gJy4uL2xpYi9Db2x1bW4nXG5pbXBvcnQgVEhlYWQgZnJvbSAnLi9USGVhZCdcbmltcG9ydCBUQm9keSBmcm9tICcuL1RCb2R5J1xuXG5jbGFzcyBUYWJsZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIG9yZGVyQnk6IHRoaXMucHJvcHMub3JkZXJCeSxcbiAgICAgIGtleVZhbHVlU2VsZWN0ZWQ6IHRoaXMucHJvcHMua2V5VmFsdWVTZWxlY3RlZCxcbiAgICAgIGhhbmRsZVNvcnQ6IGZhbHNlXG4gICAgfVxuXG4gICAgdGhpcy5fb25Sb3dTZWxlY3Rpb24gPSB0aGlzLl9vblJvd1NlbGVjdGlvbi5iaW5kKHRoaXMpXG4gICAgdGhpcy5fY2hhbmdlT3JkZXIgPSB0aGlzLl9jaGFuZ2VPcmRlci5iaW5kKHRoaXMpXG4gICAgdGhpcy5fY2hhbmdlU29ydEhhbmRsZXIgPSB0aGlzLl9jaGFuZ2VTb3J0SGFuZGxlci5iaW5kKHRoaXMpXG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbHVtbnMsIGRhdGEsIGtleVZhbHVlLCByZXNwb25zaXZlLCBib3JkZXJlZCwgY29uZGVuc2VkLCBob3Zlciwgc3RyaXBlZFxuICAgIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgeyBvcmRlckJ5LCBrZXlWYWx1ZVNlbGVjdGVkLCBoYW5kbGVTb3J0IH0gPSB0aGlzLnN0YXRlXG4gICAgY29uc3Qgc29ydEtleSA9IG9yZGVyQnkuY29sdW1uS2V5XG4gICAgY29uc3Qgc29ydFR5cGUgPSBvcmRlckJ5LnZhbHVlXG5cbiAgICBjb25zdCBzb3J0SGFuZGxlciA9IGhhbmRsZVNvcnQgfHwgdGhpcy5kZWZhdWx0SGFuZGxlU29ydFxuXG4gICAgLy8gU29ydCB0aGUgaXRlbXNcbiAgICBjb25zdCByb3dzID0gKG9yZGVyQnkuY29sdW1uS2V5Lmxlbmd0aCA+IDApXG4gICAgICA/IGRhdGEuc29ydChzb3J0SGFuZGxlcihzb3J0S2V5LCBzb3J0VHlwZSkpXG4gICAgICA6IGRhdGEuc2xpY2UoKVxuXG4gICAgdmFyIGNsYXNzZXMgPSB7XG4gICAgICAndGFibGUnOiB0cnVlLFxuICAgICAgJ3RhYmxlLWJvcmRlcmVkJzogYm9yZGVyZWQsXG4gICAgICAndGFibGUtY29uZGVuc2VkJzogY29uZGVuc2VkLFxuICAgICAgJ3RhYmxlLWhvdmVyJzogaG92ZXIsXG4gICAgICAndGFibGUtc3RyaXBlZCc6IHN0cmlwZWRcbiAgICB9XG5cbiAgICB2YXIgdGFibGUgPVxuICAgICAgPHRhYmxlIGNsYXNzTmFtZT17Y2xhc3NuYW1lcyhjbGFzc2VzKX0+XG4gICAgICAgIDxUSGVhZFxuICAgICAgICAgIGNvbHVtbnM9e2NvbHVtbnN9XG4gICAgICAgICAgb3JkZXJCeT17b3JkZXJCeX1cbiAgICAgICAgICBjaGFuZ2VPcmRlcj17dGhpcy5fY2hhbmdlT3JkZXJ9XG4gICAgICAgICAgY2hhbmdlU29ydEhhbmRsZXI9e3RoaXMuX2NoYW5nZVNvcnRIYW5kbGVyfSAvPlxuICAgICAgICA8VEJvZHlcbiAgICAgICAgICBrZXlWYWx1ZT17a2V5VmFsdWV9XG4gICAgICAgICAga2V5VmFsdWVTZWxlY3RlZD17a2V5VmFsdWVTZWxlY3RlZH1cbiAgICAgICAgICBjb2x1bW5zPXtjb2x1bW5zfVxuICAgICAgICAgIGRhdGE9e3Jvd3N9XG4gICAgICAgICAgcm93U2VsZWN0aW9uPXt0aGlzLl9vblJvd1NlbGVjdGlvbn0gLz5cbiAgICAgIDwvdGFibGU+XG5cbiAgICByZXR1cm4gcmVzcG9uc2l2ZSA/IDxkaXY+eyB0YWJsZSB9PC9kaXY+IDogdGFibGVcbiAgfVxuXG4gIGRlZmF1bHRIYW5kbGVTb3J0IChzb3J0S2V5LCBzb3J0VHlwZSkge1xuICAgIHJldHVybiAoYSwgYikgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBhW3NvcnRLZXldID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgIHR5cGVvZiBiW3NvcnRLZXldID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuXG4gICAgICBsZXQgdmFsQSA9IGFbc29ydEtleV1cbiAgICAgIGxldCB2YWxCID0gYltzb3J0S2V5XVxuXG4gICAgICBpZiAodHlwZW9mIHZhbEEgPT09ICdzdHJpbmcnKSB2YWxBID0gdmFsQS50b0xvd2VyQ2FzZSgpXG4gICAgICBpZiAodHlwZW9mIHZhbEIgPT09ICdzdHJpbmcnKSB2YWxCID0gdmFsQi50b0xvd2VyQ2FzZSgpXG5cbiAgICAgIGlmIChzb3J0VHlwZSA9PT0gJ0FTQycpIHtcbiAgICAgICAgaWYgKHZhbEEgPCB2YWxCKSByZXR1cm4gLTFcbiAgICAgICAgaWYgKHZhbEEgPiB2YWxCKSByZXR1cm4gMVxuICAgICAgICByZXR1cm4gMFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHZhbEEgPiB2YWxCKSByZXR1cm4gLTFcbiAgICAgICAgaWYgKHZhbEEgPCB2YWxCKSByZXR1cm4gMVxuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9jaGFuZ2VPcmRlciAoY29sdW1uS2V5LCB2YWx1ZSA9ICdBU0MnKSB7XG4gICAgaWYgKHR5cGVvZiBjb2x1bW5LZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAodmFsdWUgPT09ICdBU0MnIHx8IHZhbHVlID09PSAnREVTQycpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgb3JkZXJCeToge1xuICAgICAgICAgICAgY29sdW1uS2V5OiBjb2x1bW5LZXksXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX2NoYW5nZVNvcnRIYW5kbGVyIChoYW5kbGVTb3J0KSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7IGhhbmRsZVNvcnQgfSlcbiAgfVxuXG4gIF9vblJvd1NlbGVjdGlvbiAocm93RGF0YSwgaXNTZWxlY3RlZCkge1xuICAgIGNvbnN0IHsga2V5VmFsdWUsIG9uUm93U2VsZWN0ZWQsIG9uUm93VW5zZWxlY3RlZCB9ID0gdGhpcy5wcm9wc1xuXG4gICAgaWYgKHR5cGVvZiBrZXlWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBpZGVudGlmaWVyID0gKHR5cGVvZiByb3dEYXRhW2tleVZhbHVlXSAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgID8gcm93RGF0YVtrZXlWYWx1ZV1cbiAgICAgICAgOiBmYWxzZVxuXG4gICAgICBpZiAoaWRlbnRpZmllciAhPT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGtleVZhbHVlU2VsZWN0ZWQ6IGlzU2VsZWN0ZWQgPyBpZGVudGlmaWVyIDogJycgfSlcblxuICAgICAgICBpZiAoaXNTZWxlY3RlZCAmJiBvblJvd1NlbGVjdGVkKSB7XG4gICAgICAgICAgb25Sb3dTZWxlY3RlZChpZGVudGlmaWVyLCByb3dEYXRhKVxuICAgICAgICB9IGVsc2UgaWYgKCFpc1NlbGVjdGVkICYmIG9uUm93VW5zZWxlY3RlZCkge1xuICAgICAgICAgIG9uUm93VW5zZWxlY3RlZChpZGVudGlmaWVyLCByb3dEYXRhKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblRhYmxlLnByb3BUeXBlcyA9IHtcbiAgLy8gQ29sdW1uc1xuICBjb2x1bW5zOiBSZWFjdC5Qcm9wVHlwZXMuYXJyYXlPZihSZWFjdC5Qcm9wVHlwZXMuaW5zdGFuY2VPZihDb2x1bW4pKSxcbiAgLy8gUm93c1xuICBkYXRhOiBSZWFjdC5Qcm9wVHlwZXMuYXJyYXlPZihSZWFjdC5Qcm9wVHlwZXMub2JqZWN0KSxcbiAgLy8gQ29sdW1uIHdoaWNoIGNvbnRhaW5zIHVuaXF1ZSB2YWx1ZXNcbiAga2V5VmFsdWU6IFJlYWN0LlByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgIFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gICAgUmVhY3QuUHJvcFR5cGVzLm51bWJlclxuICBdKSxcbiAgLy8gSWRlbnRpZmllciBvZiB0aGUgc2VsZWN0ZWQgcm93LiBJdCBpcyBhIHZhbHVlIG9mIHRoZSAna2V5VmFsdWUnIGNvbHVtblxuICBrZXlWYWx1ZVNlbGVjdGVkOiBSZWFjdC5Qcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICAgIFJlYWN0LlByb3BUeXBlcy5udW1iZXJcbiAgXSksXG4gIC8vIFVzZXIgZGVmaW5lZCBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gYSByb3cgaXMgc2VsZWN0ZWRcbiAgb25Sb3dTZWxlY3RlZDogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIC8vIFVzZXIgZGVmaW5lZCBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gYSByb3cgaXMgdW5zZWxlY3RlZFxuICBvblJvd1Vuc2VsZWN0ZWQ6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICAvLyBPYmplY3Qgeydjb2x1bW5LZXknLCAndmFsdWUnfSB0byBzb3J0IHRoZSByb3dzXG4gIG9yZGVyQnk6IFJlYWN0LlByb3BUeXBlcy5vYmplY3QsXG4gIC8vIENsYXNzZXNcbiAgYm9yZGVyZWQ6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBjb25kZW5zZWQ6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBob3ZlcjogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIHJlc3BvbnNpdmU6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBzdHJpcGVkOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbFxufVxuVGFibGUuZGVmYXVsdFByb3BzID0ge1xuICBjb2x1bW5zOiBbXSxcbiAgZGF0YTogW10sXG4gIG9yZGVyQnk6IHtcbiAgICBjb2x1bW5LZXk6ICcnLFxuICAgIHZhbHVlOiAnQVNDJ1xuICB9LFxuICAvLyBDbGFzc2VzXG4gIGJvcmRlcmVkOiBmYWxzZSxcbiAgY29uZGVuc2VkOiBmYWxzZSxcbiAgaG92ZXI6IGZhbHNlLFxuICByZXNwb25zaXZlOiBmYWxzZSxcbiAgc3RyaXBlZDogZmFsc2Vcbn1cblxuZXhwb3J0IGRlZmF1bHQgVGFibGVcbiIsImltcG9ydCBUYWJsZSBmcm9tICcuL2NvbXBvbmVudHMvVGFibGUnXG5pbXBvcnQgQ29sdW1uIGZyb20gJy4vbGliL0NvbHVtbidcblxuZXhwb3J0IGRlZmF1bHQgVGFibGVcbmV4cG9ydCB7IENvbHVtbiBhcyBEYXRhQ29sdW1uIH1cbiIsIlxuY2xhc3MgQ29sdW1uIHtcbiAgY29uc3RydWN0b3IgKHByb3BzID0ge30pIHtcbiAgICB0aGlzLmhpZGRlbiA9IHByb3BzLmhpZGRlbiB8fCBmYWxzZVxuICAgIHRoaXMuZGF0YUtleSA9IHByb3BzLmRhdGFLZXlcbiAgICB0aGlzLm5hbWUgPSBwcm9wcy5uYW1lXG4gICAgdGhpcy5hbGlnbiA9IHByb3BzLmFsaWduIHx8ICdsZWZ0J1xuICAgIHRoaXMud2lkdGggPSBwcm9wcy53aWR0aCB8fCAnYXV0bydcbiAgICB0aGlzLmhlYWRGb3JtYXR0ZXIgPSBwcm9wcy5oZWFkRm9ybWF0dGVyXG4gICAgdGhpcy5jZWxsRm9ybWF0dGVyID0gcHJvcHMuY2VsbEZvcm1hdHRlclxuICAgIHRoaXMub25DZWxsQ2xpY2sgPSBwcm9wcy5vbkNlbGxDbGlja1xuXG4gICAgdGhpcy5zb3J0YWJsZSA9IHByb3BzLnNvcnRhYmxlIHx8IGZhbHNlXG4gICAgdGhpcy5zb3J0QnkgPSBwcm9wcy5zb3J0QnkgfHwgJ0FTQydcbiAgICB0aGlzLnNvcnRQcm9wcyA9IHByb3BzLnNvcnRQcm9wc1xuICB9XG5cbiAgc2V0IGhpZGRlbiAoaGlkZGVuKSB7XG4gICAgLy8gaGlkZGVuXG4gICAgdmFyIGhpZGRlblR5cGUgPSB0eXBlb2YgaGlkZGVuXG4gICAgaWYgKGhpZGRlblR5cGUgPT09ICdib29sZWFuJykgdGhpcy5faGlkZGVuID0gaGlkZGVuXG4gICAgZWxzZSB0aGlzLl9oaWRkZW4gPSBmYWxzZVxuICB9XG5cbiAgZ2V0IGhpZGRlbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hpZGRlblxuICB9XG5cbiAgc2V0IGRhdGFLZXkgKGRhdGFLZXkpIHtcbiAgICAvLyBkYXRhS2V5XG4gICAgdmFyIGRhdGFLZXlUeXBlID0gdHlwZW9mIGRhdGFLZXlcbiAgICBpZiAoZGF0YUtleVR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZGF0YSBrZXkgaXMgcmVxdWlyZWQnKVxuICAgIH1cbiAgICBpZiAoZGF0YUtleVR5cGUgIT09ICdzdHJpbmcnICYmIGRhdGFLZXlUeXBlICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGRhdGEga2V5IG9mIHRoZSBjb2x1bW4gc2hvdWxkIGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyJylcbiAgICB9XG4gICAgdGhpcy5fZGF0YUtleSA9IGRhdGFLZXlcbiAgfVxuXG4gIGdldCBkYXRhS2V5ICgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YUtleVxuICB9XG5cbiAgc2V0IG5hbWUgKG5hbWUpIHtcbiAgICAvLyBuYW1lXG4gICAgdmFyIG5hbWVUeXBlID0gdHlwZW9mIG5hbWVcbiAgICBpZiAobmFtZVR5cGUgPT09ICdzdHJpbmcnKSB0aGlzLl9uYW1lID0gbmFtZVxuICB9XG5cbiAgZ2V0IG5hbWUgKCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lXG4gIH1cblxuICBzZXQgYWxpZ24gKGFsaWduKSB7XG4gICAgLy8gYWxpZ25cbiAgICB2YXIgdmFsaWRBbGlnbiA9IFsnbGVmdCcsICdjZW50ZXInLCAncmlnaHQnXVxuICAgIHZhciBhbGlnblR5cGUgPSB0eXBlb2YgYWxpZ25cbiAgICBpZiAoYWxpZ25UeXBlID09PSAnc3RyaW5nJyAmJiB2YWxpZEFsaWduLmluZGV4T2YoYWxpZ24pICE9PSAtMSkge1xuICAgICAgdGhpcy5fYWxpZ24gPSBhbGlnblxuICAgIH1cbiAgfVxuXG4gIGdldCBhbGlnbiAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FsaWduXG4gIH1cblxuICBzZXQgd2lkdGggKHdpZHRoKSB7XG4gICAgLy8gd2lkdGhcbiAgICB2YXIgd2lkdGhUeXBlID0gdHlwZW9mIHdpZHRoXG4gICAgaWYgKHdpZHRoVHlwZSA9PT0gJ251bWJlcicpIHRoaXMuX3dpZHRoID0gYCR7d2lkdGh9cHhgXG4gICAgZWxzZSBpZiAod2lkdGhUeXBlID09PSAnc3RyaW5nJykgdGhpcy5fd2lkdGggPSB3aWR0aFxuICB9XG5cbiAgZ2V0IHdpZHRoICgpIHtcbiAgICByZXR1cm4gdGhpcy5fd2lkdGhcbiAgfVxuXG4gIHNldCBoZWFkRm9ybWF0dGVyIChoZWFkRm9ybWF0dGVyKSB7XG4gICAgLy8gaGVhZEZvcm1hdHRlclxuICAgIHZhciBoZWFkRm9ybWF0dGVyVHlwZSA9IHR5cGVvZiBoZWFkRm9ybWF0dGVyXG4gICAgaWYgKGhlYWRGb3JtYXR0ZXJUeXBlID09PSAnZnVuY3Rpb24nKSB0aGlzLl9oZWFkRm9ybWF0dGVyID0gaGVhZEZvcm1hdHRlclxuICB9XG5cbiAgZ2V0IGhlYWRGb3JtYXR0ZXIgKCkge1xuICAgIHJldHVybiB0aGlzLl9oZWFkRm9ybWF0dGVyXG4gIH1cblxuICBzZXQgY2VsbEZvcm1hdHRlciAoY2VsbEZvcm1hdHRlcikge1xuICAgIC8vIGNlbGxGb3JtYXR0ZXJcbiAgICB2YXIgY2VsbEZvcm1hdHRlclR5cGUgPSB0eXBlb2YgY2VsbEZvcm1hdHRlclxuICAgIGlmIChjZWxsRm9ybWF0dGVyVHlwZSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fY2VsbEZvcm1hdHRlciA9IGNlbGxGb3JtYXR0ZXJcbiAgfVxuXG4gIGdldCBjZWxsRm9ybWF0dGVyICgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2VsbEZvcm1hdHRlclxuICB9XG5cbiAgc2V0IG9uQ2VsbENsaWNrIChvbkNlbGxDbGljaykge1xuICAgIC8vIG9uQ2VsbENsaWNrXG4gICAgdmFyIG9uQ2VsbENsaWNrVHlwZSA9IHR5cGVvZiBvbkNlbGxDbGlja1xuICAgIGlmIChvbkNlbGxDbGlja1R5cGUgPT09ICdmdW5jdGlvbicpIHRoaXMuX29uQ2VsbENsaWNrID0gb25DZWxsQ2xpY2tcbiAgfVxuXG4gIGdldCBvbkNlbGxDbGljayAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX29uQ2VsbENsaWNrXG4gIH1cblxuICBzZXQgc29ydGFibGUgKHNvcnRhYmxlKSB7XG4gICAgLy8gc29ydGFibGVcbiAgICB2YXIgc29ydGFibGVUeXBlID0gdHlwZW9mIHNvcnRhYmxlXG4gICAgaWYgKHNvcnRhYmxlVHlwZSA9PT0gJ2Jvb2xlYW4nKSB0aGlzLl9zb3J0YWJsZSA9IHNvcnRhYmxlXG4gICAgZWxzZSB0aGlzLl9zb3J0YWJsZSA9IGZhbHNlXG4gIH1cblxuICBnZXQgc29ydGFibGUgKCkge1xuICAgIHJldHVybiB0aGlzLl9zb3J0YWJsZVxuICB9XG5cbiAgc2V0IHNvcnRCeSAoc29ydEJ5KSB7XG4gICAgLy8gc29ydEJ5XG4gICAgdmFyIHNvcnRCeVR5cGUgPSB0eXBlb2Ygc29ydEJ5XG4gICAgaWYgKHNvcnRCeVR5cGUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgIChzb3J0QnlUeXBlID09PSAnQVNDJyB8fCBzb3J0QnlUeXBlID09PSAnREVTQycpKSB7XG4gICAgICB0aGlzLl9zb3J0QnkgPSBzb3J0QnlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc29ydEJ5ID0gJ0FTQydcbiAgICB9XG4gIH1cblxuICBnZXQgc29ydEJ5ICgpIHtcbiAgICByZXR1cm4gdGhpcy5fc29ydEJ5XG4gIH1cblxuICBzdGF0aWMgZ2V0IGRlZmF1bHRTb3J0UHJvcHMgKCkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiAnYXR0cmlidXRlcycsXG4gICAgICAnc29ydC1oYW5kbGVyJzogZmFsc2VcbiAgICB9XG4gIH1cblxuICBzZXQgc29ydFByb3BzIChzb3J0UHJvcHMpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3NvcnRQcm9wcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuX3NvcnRQcm9wcyA9IENvbHVtbi5kZWZhdWx0U29ydFByb3BzXG4gICAgfVxuICAgIC8vIHNvcnRQcm9wc1xuICAgIHZhciBzb3J0UHJvcHNUeXBlID0gdHlwZW9mIHNvcnRQcm9wc1xuICAgIGlmIChzb3J0UHJvcHNUeXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHR5cGVvZiBzb3J0UHJvcHMudHlwZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAoc29ydFByb3BzLnR5cGUgPT09ICdudW1iZXInIHx8IHNvcnRQcm9wcy50eXBlID09PSAnc3RyaW5nJykpIHtcbiAgICAgICAgdGhpcy5fc29ydFByb3BzLnR5cGUgPSBzb3J0UHJvcHMudHlwZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc29ydFByb3BzLnR5cGUgPSBDb2x1bW4uZGVmYXVsdFNvcnRQcm9wcy50eXBlXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc29ydFByb3BzWydzb3J0LWhhbmRsZXInXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzLl9zb3J0UHJvcHNbJ3NvcnQtaGFuZGxlciddID0gc29ydFByb3BzWydzb3J0LWhhbmRsZXInXVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fc29ydFByb3BzWydzb3J0LWhhbmRsZXInXSA9IENvbHVtbi5kZWZhdWx0U29ydFByb3BzWydzb3J0LWhhbmRsZXInXVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zb3J0UHJvcHMgPSBDb2x1bW4uZGVmYXVsdFNvcnRQcm9wc1xuICAgIH1cbiAgfVxuXG4gIGdldCBzb3J0UHJvcHMgKCkge1xuICAgIHJldHVybiB0aGlzLl9zb3J0UHJvcHNcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb2x1bW5cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcblxuY2xhc3MgT3ZlcmxheSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy5fZ2V0RGlzcGxheVNpemUgPSAoKSA9PiB7XG4gICAgICBsZXQgWyB3aWR0aCwgaGVpZ2h0IF0gPSBbIDAsIDAgXVxuICAgICAgcmV0dXJuIFsgd2lkdGgsIGhlaWdodCBdXG4gICAgfVxuICAgIHRoaXMuX2hhbmRsZVJlc2l6ZSA9IHRoaXMucHJvcHMub25SZXNpemVcbiAgICAgID8gKGV2ZW50KSA9PiB0aGlzLnByb3BzLm9uUmVzaXplKC4uLnRoaXMuX2dldERpc3BsYXlTaXplKCkpXG4gICAgICA6ICgpID0+IHt9XG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgc2hvd0JhY2tncm91bmQsIGFsaWduLCBjaGlsZHJlbiB9ID0gdGhpcy5wcm9wc1xuXG4gICAgbGV0IGFsaWdubWVudCA9IHt9XG4gICAgc3dpdGNoIChhbGlnbikge1xuICAgICAgY2FzZSAnY2VudGVyJzpcbiAgICAgICAgYWxpZ25tZW50ID0ge1xuICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJ1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgICBhbGlnbm1lbnQgPSB7XG4gICAgICAgICAgYWxpZ25JdGVtczogJ2ZsZXgtc3RhcnQnLFxuICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJ1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICBhbGlnbm1lbnQgPSB7XG4gICAgICAgICAgYWxpZ25JdGVtczogJ2ZsZXgtZW5kJyxcbiAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcidcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnbGVmdCc6XG4gICAgICAgIGFsaWdubWVudCA9IHtcbiAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2ZsZXgtc3RhcnQnXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgYWxpZ25tZW50ID0ge1xuICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnZmxleC1lbmQnXG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBjb25zdCBvdmVybGF5U3R5bGUgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmZ1bGxTY3JlZW5TdHlsZSwgYWxpZ25tZW50LCB7XG4gICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICB6SW5kZXg6ICcyMDAwJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgIH0pXG4gICAgY29uc3QgYmFja2dyb3VuZFN0eWxlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5mdWxsU2NyZWVuU3R5bGUsXG4gICAgICB0aGlzLmJhY2tncm91bmRDb2xvclN0eWxlLCB7IHBvc2l0aW9uOiAnYWJzb2x1dGUnIH0pXG4gICAgY29uc3Qgb3ZlcmxheUNvbnRlbnRTdHlsZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZnVsbFNjcmVlblN0eWxlLCB7XG4gICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdhdXRvJ1xuICAgIH0pXG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiByZWY9J292ZXJsYXknIGNsYXNzTmFtZT0nb3ZlcmxheScgc3R5bGU9e292ZXJsYXlTdHlsZX0+XG4gICAgICAgIHsgc2hvd0JhY2tncm91bmQgJiZcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nb3ZlcmxheS1iYWNrZ3JvdW5kJyBzdHlsZT17YmFja2dyb3VuZFN0eWxlfSAvPlxuICAgICAgICB9XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdvdmVybGF5LWNvbnRlbnQnIHN0eWxlPXtvdmVybGF5Q29udGVudFN0eWxlfT5cbiAgICAgICAgICB7IGNoaWxkcmVuIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgaWYgKHdpbmRvdykgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX2hhbmRsZVJlc2l6ZSlcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50ICgpIHtcbiAgICBpZiAod2luZG93KSB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5faGFuZGxlUmVzaXplKVxuICB9XG5cbiAgZ2V0IGZ1bGxTY3JlZW5TdHlsZSAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgdG9wOiAnMCcsXG4gICAgICBib3R0b206ICcwJyxcbiAgICAgIGxlZnQ6ICcwJyxcbiAgICAgIHJpZ2h0OiAnMCcsXG4gICAgICBvdmVyZmxvdzogJ2hpZGRlbidcbiAgICB9XG4gIH1cblxuICBnZXQgYmFja2dyb3VuZENvbG9yU3R5bGUgKCkge1xuICAgIHJldHVybiB7XG4gICAgICBiYWNrZ3JvdW5kOiAncmdiYSgwLCAwLCAwLCAwLjgpJ1xuICAgIH1cbiAgfVxufVxuXG5PdmVybGF5LnByb3BUeXBlcyA9IHtcbiAgc2hvd0JhY2tncm91bmQ6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBhbGlnbjogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgb25SZXNpemU6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBjaGlsZHJlbjogUmVhY3QuUHJvcFR5cGVzLm5vZGUuaXNSZXF1aXJlZFxufVxuT3ZlcmxheS5kZWZhdWx0UHJvcHMgPSB7XG4gIHNob3dCYWNrZ3JvdW5kOiBmYWxzZSxcbiAgYWxpZ246ICdjZW50ZXInXG59XG5cbmV4cG9ydCBkZWZhdWx0IE92ZXJsYXlcbiIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQsIFByb3BUeXBlcyB9IGZyb20gJ3JlYWN0J1xuXG5jbGFzcyBBcmVhIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgc3RhdGljIGdldCBwcm9wVHlwZXMgKCkge1xuICAgIHJldHVybiB7XG4gICAgICBwYXRoOiBQcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gICAgICBmaWxsOiBQcm9wVHlwZXMuc3RyaW5nLFxuICAgICAgc3Ryb2tlOiBQcm9wVHlwZXMuc3RyaW5nXG4gICAgfVxuICB9XG4gIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BzICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsbDogJyMzMTgyQkQnLFxuICAgICAgc3Ryb2tlOiBudWxsXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPHBhdGhcbiAgICAgICAgZD17dGhpcy5wcm9wcy5wYXRofVxuICAgICAgICBmaWxsPXt0aGlzLnByb3BzLmZpbGx9XG4gICAgICAgIHN0cm9rZT17dGhpcy5wcm9wcy5zdHJva2V9IC8+XG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFyZWFcbiIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQsIFByb3BUeXBlcyB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IGQzIGZyb20gJ2QzJ1xuaW1wb3J0IERhdGFTZXJpZXMgZnJvbSAnLi9EYXRhU2VyaWVzJ1xuaW1wb3J0IHsgQ2hhcnQgfSBmcm9tICcuLi9jb21tb24nXG5cbmNsYXNzIEFyZWFDaGFydCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcFR5cGVzICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKSxcbiAgICAgIGhlaWdodDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pLFxuICAgICAgZmlsbDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIHN0cm9rZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIGludGVycG9sYXRlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgIGludGVycG9sYXRpb25UeXBlOiBQcm9wVHlwZXMuc3RyaW5nXG4gICAgfVxuICB9XG4gIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BzICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW50ZXJwb2xhdGU6IGZhbHNlLFxuICAgICAgaW50ZXJwb2xhdGlvblR5cGU6IG51bGxcbiAgICB9XG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHNcblxuICAgIHZhciBpbnRlcnBvbGF0aW9uVHlwZSA9IHByb3BzLmludGVycG9sYXRpb25UeXBlIHx8XG4gICAgICAocHJvcHMuaW50ZXJwb2xhdGUgPyAnY2FyZGluYWwnIDogJ2xpbmVhcicpXG5cbiAgICB2YXIgeFNjYWxlID0gZDMuc2NhbGUubGluZWFyKClcbiAgICAvLyB2YXIgeFNjYWxlID0gZDMudGltZS5zY2FsZSgpXG4gICAgICAucmFuZ2UoWzAsIHByb3BzLndpZHRoXSlcbiAgICAgIC5kb21haW4oZDMuZXh0ZW50KHByb3BzLmRhdGEubWFwKChkKSA9PiBkLngpKSlcbiAgICB2YXIgeVNjYWxlID0gZDMuc2NhbGUubGluZWFyKClcbiAgICAgIC5yYW5nZShbcHJvcHMuaGVpZ2h0LCAwXSlcbiAgICAgIC5kb21haW4oWzAsIDEwMF0pXG5cbiAgICByZXR1cm4gKFxuICAgICAgPENoYXJ0XG4gICAgICAgIHdpZHRoPXtwcm9wcy53aWR0aH1cbiAgICAgICAgaGVpZ2h0PXtwcm9wcy5oZWlnaHR9PlxuICAgICAgICA8RGF0YVNlcmllc1xuICAgICAgICAgIHdpZHRoPXtwcm9wcy53aWR0aH1cbiAgICAgICAgICBoZWlnaHQ9e3Byb3BzLmhlaWdodH1cbiAgICAgICAgICBmaWxsPXtwcm9wcy5maWxsfVxuICAgICAgICAgIHN0cm9rZT17cHJvcHMuc3Ryb2tlfVxuICAgICAgICAgIGRhdGE9e3Byb3BzLmRhdGF9XG4gICAgICAgICAgeFNjYWxlPXt4U2NhbGV9XG4gICAgICAgICAgeVNjYWxlPXt5U2NhbGV9XG4gICAgICAgICAgaW50ZXJwb2xhdGlvblR5cGU9e2ludGVycG9sYXRpb25UeXBlfSAvPlxuICAgICAgPC9DaGFydD5cbiAgICApXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXJlYUNoYXJ0XG4iLCJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50LCBQcm9wVHlwZXMgfSBmcm9tICdyZWFjdCdcbmltcG9ydCBkMyBmcm9tICdkMydcbmltcG9ydCBBcmVhIGZyb20gJy4vQXJlYSdcblxuY2xhc3MgRGF0YVNlcmllcyBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcFR5cGVzICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsbDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgIHN0cm9rZTogUHJvcFR5cGVzLnN0cmluZ1xuICAgICAgLy8gaW50ZXJwb2xhdGlvblR5cGU6IFByb3BUeXBlcy5zdHJpbmcsXG4gICAgICAvLyB4U2NhbGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICAvLyB5U2NhbGU6IFByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gICAgICAvLyBkYXRhOiBQcm9wVHlwZXMuYXJyYXksXG4gICAgICAvLyBoZWlnaHQ6IFByb3BUeXBlcy5udW1iZXJcbiAgICB9XG4gIH1cbiAgc3RhdGljIGdldCBkZWZhdWx0UHJvcHMgKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbnRlcnBvbGF0aW9uVHlwZTogJ2xpbmVhcidcbiAgICB9XG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHhTY2FsZSwgeVNjYWxlLCBpbnRlcnBvbGF0aW9uVHlwZSwgaGVpZ2h0LCBkYXRhLCBmaWxsLCBzdHJva2VcbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgdmFyIGFyZWEgPSBkMy5zdmcuYXJlYSgpXG4gICAgICAueCgoZCkgPT4geFNjYWxlKGQueCkpXG4gICAgICAueTAoaGVpZ2h0KVxuICAgICAgLnkxKChkKSA9PiB5U2NhbGUoZC55KSlcbiAgICAgIC5pbnRlcnBvbGF0ZShpbnRlcnBvbGF0aW9uVHlwZSlcblxuICAgIHZhciBwYXRoID0gYXJlYShkYXRhKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxBcmVhIHBhdGg9e3BhdGh9IGZpbGw9e2ZpbGx9IHN0cm9rZT17c3Ryb2tlfSAvPlxuICAgIClcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEYXRhU2VyaWVzXG4iLCJpbXBvcnQgQXJlYUNoYXJ0IGZyb20gJy4vQXJlYUNoYXJ0J1xuXG5leHBvcnQgZGVmYXVsdCBBcmVhQ2hhcnRcbiIsImltcG9ydCBSZWFjdCwgeyBDb21wb25lbnQsIFByb3BUeXBlcyB9IGZyb20gJ3JlYWN0J1xuXG5jbGFzcyBDaGFydCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcFR5cGVzICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5zdHJpbmcsIFByb3BUeXBlcy5udW1iZXJdKSxcbiAgICAgIGhlaWd0aDogUHJvcFR5cGVzLm9uZU9mVHlwZShbUHJvcFR5cGVzLnN0cmluZywgUHJvcFR5cGVzLm51bWJlcl0pXG4gICAgfVxuICB9XG4gIHN0YXRpYyBnZXQgZGVmYXVsdFByb3BzICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IDQwMCxcbiAgICAgIGhlaWdodDogMjAwXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IHdpZHRoLCBoZWlndGgsIGNoaWxkcmVuIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgY2hhcnRTdHlsZSA9IHtcbiAgICAgIGJhY2tncm91bmQ6ICdyZ2IoNDEsMTcwLDIwNCknLFxuICAgICAgYm9yZGVyUmFkaXVzOiAnNXB4J1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8c3ZnIHN0eWxlPXtjaGFydFN0eWxlfSB3aWR0aD17d2lkdGh9IGhlaWdodD17aGVpZ3RofT5cbiAgICAgICAgeyBjaGlsZHJlbiB9XG4gICAgICA8L3N2Zz5cbiAgICApXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ2hhcnRcbiIsImltcG9ydCBDaGFydCBmcm9tICcuL0NoYXJ0J1xuXG5leHBvcnQgeyBDaGFydCB9XG4iLCJpbXBvcnQgQXJlYUNoYXJ0IGZyb20gJy4vYXJlYS1jaGFydCdcblxuZXhwb3J0IHsgQXJlYUNoYXJ0IH1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7XG4gIFRvb2x0aXAsIE92ZXJsYXlUcmlnZ2VyLCBEcm9wZG93bixcbiAgQnV0dG9uLCBHbHlwaGljb24sIE1lbnVJdGVtXG59IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcbmltcG9ydCB7IGluamVjdEludGwgfSBmcm9tICdyZWFjdC1pbnRsJ1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcydcblxuY2xhc3MgUmVmcmVzaEJ1dHRvbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIC8vIERlZmF1bHQgcGVyaW9kc1xuICBzdGF0aWMgZ2V0IHBlcmlvZHMgKCkge1xuICAgIHJldHVybiBuZXcgTWFwKClcbiAgICAgIC5zZXQoMCwgJ05ldmVyJylcbiAgICAgIC5zZXQoNSwgJzUgc2Vjb25kcycpXG4gICAgICAuc2V0KDEwLCAnMTAgc2Vjb25kcycpXG4gICAgICAuc2V0KDE1LCAnMTUgc2Vjb25kcycpXG4gICAgICAuc2V0KDMwLCAnMzAgc2Vjb25kcycpXG4gICAgICAuc2V0KDYwLCAnMSBtaW51dGUnKVxuICB9XG5cbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICAvLyBNZXNzYWdlcyBkZWZpbml0aW9uc1xuICAgIHRoaXMubWVzc2FnZXMgPSB7XG4gICAgICBsYXN0VXBkYXRlOiB7XG4gICAgICAgIGlkOiAnbGFzdFVwZGF0ZScsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnTGFzdCB1cGRhdGUnXG4gICAgICB9LFxuICAgICAgbmV2ZXJVcGRhdGVkOiB7XG4gICAgICAgIGlkOiAnbmV2ZXJVcGRhdGVkJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdOZXZlciB1cGRhdGVkJ1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX19jaGFuZ2VMYXN0VXBkYXRlTWVzc2FnZSA9IHRoaXMuX19jaGFuZ2VMYXN0VXBkYXRlTWVzc2FnZS5iaW5kKHRoaXMpXG4gICAgdGhpcy5fX3N0YXJ0SW50ZXJ2YWwgPSB0aGlzLl9fc3RhcnRJbnRlcnZhbC5iaW5kKHRoaXMpXG4gICAgdGhpcy5fX3N0b3BJbnRlcnZhbCA9IHRoaXMuX19zdG9wSW50ZXJ2YWwuYmluZCh0aGlzKVxuICAgIHRoaXMuX19sYXN0VXBkYXRlTWVzc2FnZSA9IHRoaXMuX19sYXN0VXBkYXRlTWVzc2FnZS5iaW5kKHRoaXMpXG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgbGFzdFVwZGF0ZU1lc3NhZ2U6IHRoaXMuX19sYXN0VXBkYXRlTWVzc2FnZSh0aGlzLnByb3BzLmxhc3RVcGRhdGUpXG4gICAgfVxuICB9XG5cbiAgX19sYXN0VXBkYXRlTWVzc2FnZSAodGltZXN0YW1wKSB7XG4gICAgY29uc3QgZGVmaW5lTWVzc2FnZSA9IHRoaXMucHJvcHMuaW50bC5mb3JtYXRNZXNzYWdlXG4gICAgY29uc3QgcmVsYXRpdmVEYXRlID0gdGhpcy5wcm9wcy5pbnRsLmZvcm1hdFJlbGF0aXZlXG4gICAgcmV0dXJuIHRpbWVzdGFtcFxuICAgICAgPyBgJHtkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMubGFzdFVwZGF0ZSl9ICR7cmVsYXRpdmVEYXRlKHRpbWVzdGFtcCl9YFxuICAgICAgOiBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMubmV2ZXJVcGRhdGVkKVxuICB9XG5cbiAgX19jaGFuZ2VMYXN0VXBkYXRlTWVzc2FnZSAoKSB7XG4gICAgLy8gVXBkYXRlIHRoZSBsYXN0IHVwZGF0ZSB0b29sdGlwXG4gICAgY29uc3QgeyBsYXN0VXBkYXRlIH0gPSB0aGlzLnByb3BzXG4gICAgaWYgKGxhc3RVcGRhdGUgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgbGFzdFVwZGF0ZU1lc3NhZ2U6IHRoaXMuX19sYXN0VXBkYXRlTWVzc2FnZShsYXN0VXBkYXRlKVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBfX3N0YXJ0SW50ZXJ2YWwgKCkge1xuICAgIGlmICghdGhpcy5fX2ludGVydmFsSUQpIHtcbiAgICAgIHRoaXMuX19jaGFuZ2VMYXN0VXBkYXRlTWVzc2FnZSgpXG4gICAgICB0aGlzLl9faW50ZXJ2YWxJRCA9IHNldEludGVydmFsKHRoaXMuX19jaGFuZ2VMYXN0VXBkYXRlTWVzc2FnZSwgMTAwMClcbiAgICB9XG4gIH1cblxuICBfX3N0b3BJbnRlcnZhbCAoKSB7XG4gICAgaWYgKHRoaXMuX19pbnRlcnZhbElEKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuX19pbnRlcnZhbElEKVxuICAgICAgZGVsZXRlIHRoaXMuX19pbnRlcnZhbElEXG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIHRoaXMuX19zdGFydEludGVydmFsKClcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50ICgpIHtcbiAgICB0aGlzLl9fc3RvcEludGVydmFsKClcbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgdG9vbHRpcCA9IChpZCwgbWVzc2FnZSkgPT4gKDxUb29sdGlwIGlkPXtpZH0+e21lc3NhZ2V9PC9Ub29sdGlwPilcbiAgICBjb25zdCB7IGxhc3RVcGRhdGVNZXNzYWdlIH0gPSB0aGlzLnN0YXRlXG4gICAgY29uc3Qge1xuICAgICAgaGFuZGxlUmVmcmVzaCwgaGFuZGxlUGVyaW9kQ2hhbmdlLCBjaGlsZHJlbixcbiAgICAgIHBlcmlvZHMsIGFjdGl2ZVBlcmlvZCwgZW5hYmxlUGVyaW9kc1xuICAgIH0gPSB0aGlzLnByb3BzXG5cbiAgICB2YXIgcmVmcmVzaEJ1dHRvbiA9IChcbiAgICAgIDxCdXR0b24gb25DbGljaz17aGFuZGxlUmVmcmVzaH0+XG4gICAgICAgIDxHbHlwaGljb24gZ2x5cGg9J3JlZnJlc2gnIC8+XG4gICAgICAgIHsgY2hpbGRyZW4gJiYgPHNwYW4+Jm5ic3A7PC9zcGFuPiB9XG4gICAgICAgIHsgY2hpbGRyZW4gfVxuICAgICAgPC9CdXR0b24+XG4gICAgKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxPdmVybGF5VHJpZ2dlclxuICAgICAgICBwbGFjZW1lbnQ9J3JpZ2h0J1xuICAgICAgICBvdmVybGF5PXt0b29sdGlwKCdsYXN0LXVwZGF0ZS10b29sdGlwJywgbGFzdFVwZGF0ZU1lc3NhZ2UpfT5cbiAgICAgICAge1xuICAgICAgICAgIGVuYWJsZVBlcmlvZHNcbiAgICAgICAgICAgID8gKFxuICAgICAgICAgICAgICA8RHJvcGRvd24gaWQ9J3JlZnJlc2gtYnV0dG9uJyBjbGFzc05hbWU9J3JlZnJlc2gtYnV0dG9uJz5cbiAgICAgICAgICAgICAgICB7IHJlZnJlc2hCdXR0b24gfVxuICAgICAgICAgICAgICAgIDxEcm9wZG93bi5Ub2dnbGUgLz5cbiAgICAgICAgICAgICAgICA8RHJvcGRvd24uTWVudT5cbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgWy4uLnBlcmlvZHMua2V5cygpXS5tYXAoKHBlcmlvZCwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8TWVudUl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NuYW1lcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICdhY3RpdmUnOiAocGVyaW9kID09PSBhY3RpdmVQZXJpb2QpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudEtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICBvblNlbGVjdD17KCkgPT4gaGFuZGxlUGVyaW9kQ2hhbmdlKHBlcmlvZCl9PlxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2RzLmdldChwZXJpb2QpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9NZW51SXRlbT5cbiAgICAgICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L0Ryb3Bkb3duLk1lbnU+XG4gICAgICAgICAgICAgIDwvRHJvcGRvd24+XG4gICAgICAgICAgICApXG4gICAgICAgICAgICA6IChcbiAgICAgICAgICAgICAgcmVmcmVzaEJ1dHRvblxuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgICA8L092ZXJsYXlUcmlnZ2VyPlxuICAgIClcbiAgfVxufVxuXG5SZWZyZXNoQnV0dG9uLnByb3BUeXBlcyA9IHtcbiAgaGFuZGxlUmVmcmVzaDogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgaGFuZGxlUGVyaW9kQ2hhbmdlOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgcGVyaW9kczogUmVhY3QuUHJvcFR5cGVzLmluc3RhbmNlT2YoTWFwKSxcbiAgYWN0aXZlUGVyaW9kOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICBlbmFibGVQZXJpb2RzOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgbGFzdFVwZGF0ZTogUmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUmVhY3QuUHJvcFR5cGVzLmluc3RhbmNlT2YoRGF0ZSksXG4gICAgUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgICBSZWFjdC5Qcm9wVHlwZXMuYm9vbFxuICBdKSxcbiAgY2hpbGRyZW46IFJlYWN0LlByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgIFJlYWN0LlByb3BUeXBlcy5ub2RlLFxuICAgIFJlYWN0LlByb3BUeXBlcy5zdHJpbmdcbiAgXSksXG4gIGludGw6IFJlYWN0LlByb3BUeXBlcy5vYmplY3Rcbn1cblxuUmVmcmVzaEJ1dHRvbi5kZWZhdWx0UHJvcHMgPSB7XG4gIGFjdGl2ZVBlcmlvZDogMCxcbiAgbGFzdFVwZGF0ZTogZmFsc2UsXG4gIHBlcmlvZHM6IFJlZnJlc2hCdXR0b24ucGVyaW9kcyxcbiAgZW5hYmxlUGVyaW9kczogdHJ1ZVxufVxuXG5leHBvcnQgZGVmYXVsdCBpbmplY3RJbnRsKFJlZnJlc2hCdXR0b24pXG4iLCJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnXG5pbXBvcnQgUmVtb3RlIGZyb20gJy4vcmVtb3RlJ1xuaW1wb3J0IHsgUFJPVE8gfSBmcm9tICcuLi8uLi9jb25zdGFudHMnXG5cbmNvbnN0IE9QRU4gPSAnb3BlbidcbmNvbnN0IE1FU1NBR0UgPSAnbWVzc2FnZSdcbmNvbnN0IENMT1NFID0gJ2Nsb3NlJ1xuY29uc3QgRVJST1IgPSAnZXJyb3InXG5cbmNsYXNzIEZha2VXZWJTb2NrZXQgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvciAodXJpKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgLy8gQmluZCBldmVudHNcbiAgICBSZW1vdGUub25PcGVuKChldmVudCkgPT4ge1xuXG4gICAgfSlcbiAgICBSZW1vdGUub25DbG9zZSgoZXZlbnQpID0+IHtcblxuICAgIH0pXG4gICAgUmVtb3RlLm9uRXJyb3IoKGV2ZW50KSA9PiB7XG5cbiAgICB9KVxuXG4gICAgLy8gTUVHQUhBQ0s6IEV4dHJhY3QgdGhlIG1vZGUgZnJvbSB0aGUgY29ubmVjdGlvbiB1cmlcbiAgICBsZXQgbW9kZVxuICAgIHRyeSB7XG4gICAgICBtb2RlID0gTnVtYmVyLnBhcnNlSW50KHVyaS5tYXRjaCgvOlxcL1xcLyhcXGQrKVs6L10vaSlbMV0sIDEwKVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbW9kZSA9IFBST1RPLkRJU1BMQVlcbiAgICB9XG5cbiAgICB0aGlzLm1vZGUgPSBtb2RlXG5cbiAgICAvLyBFeGVjdXRlIHRoZSBvcGVuIG9uIHRoZSBuZXh0IHRpY2sgdG8gYWxsb3cgdGhlIGV2ZW50cyBjYWxsYmFjayBzZXRcbiAgICBzZXRUaW1lb3V0KHRoaXMub3Blbi5iaW5kKHRoaXMpLCAxKVxuICB9XG5cbiAgc2V0IG1vZGUgKG1vZGUpIHtcbiAgICB0aGlzLl9fbW9kZSA9IG1vZGVcbiAgfVxuXG4gIGdldCBtb2RlICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX21vZGVcbiAgfVxuXG4gIHNldCBvbm1lc3NhZ2UgKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoTUVTU0FHRSlcbiAgICB0aGlzLm9uKE1FU1NBR0UsIGNhbGxiYWNrKVxuICB9XG5cbiAgc2V0IG9ub3BlbiAoY2FsbGJhY2spIHtcbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhPUEVOKVxuICAgIHRoaXMub24oT1BFTiwgY2FsbGJhY2spXG4gIH1cblxuICBzZXQgb25jbG9zZSAoY2FsbGJhY2spIHtcbiAgICB0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhDTE9TRSlcbiAgICB0aGlzLm9uKENMT1NFLCBjYWxsYmFjaylcbiAgfVxuXG4gIHNldCBvbmVycm9yIChjYWxsYmFjaykge1xuICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKEVSUk9SKVxuICAgIHRoaXMub24oRVJST1IsIGNhbGxiYWNrKVxuICB9XG5cbiAgc2V0IGJpbmFyeVR5cGUgKGJpbmFyeVR5cGUpIHtcbiAgICAvLyBEbyBub3RoaW5nXG4gIH1cblxuICBnZXQgYnVmZmVyZWRBbW91bnQgKCkge1xuICAgIHJldHVybiBSZW1vdGUuYnVmZmVyZWRBbW91bnRcbiAgfVxuXG4gIGdldCBwcm90b2NvbCAoKSB7XG4gICAgcmV0dXJuIFJlbW90ZS5wcm90b2NvbFxuICB9XG5cbiAgZ2V0IHJlYWR5U3RhdGUgKCkge1xuICAgIHJldHVybiBSZW1vdGUuc3RhdGVcbiAgfVxuXG4gIG9wZW4gKCkge1xuICAgIHRoaXMuZW1pdChPUEVOKVxuXG4gICAgLy8gVk5DIG1vZGVcbiAgICBpZiAodGhpcy5tb2RlID09PSBQUk9UTy5ESVNQTEFZKSB7XG4gICAgICBSZW1vdGUub24oUFJPVE8uRElTUExBWV9JTklULCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ1JlY2VpdmVkJywgUFJPVE8uRElTUExBWV9JTklULCByZXNwb25zZSlcbiAgICAgICAgdGhpcy5lbWl0KE1FU1NBR0UsIHsgZGF0YTogcmVzcG9uc2UuZGF0YUJ1ZmZlciB9KVxuICAgICAgfSlcbiAgICAgIFJlbW90ZS5vbihQUk9UTy5ESVNQTEFZX0NMT1NFLCAoKSA9PiB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdSZWNlaXZlZCcsIFBST1RPLkRJU1BMQVlfQ0xPU0UpXG4gICAgICAgIHRoaXMuZW1pdChDTE9TRSwge30pXG4gICAgICB9KVxuICAgICAgUmVtb3RlLm9uKFBST1RPLkRJU1BMQVksIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnUmVjZWl2ZWQnLCBQUk9UTy5ESVNQTEFZLCByZXNwb25zZSlcbiAgICAgICAgdGhpcy5lbWl0KE1FU1NBR0UsIHsgZGF0YTogcmVzcG9uc2UuZGF0YUJ1ZmZlciB9KVxuICAgICAgfSlcblxuICAgICAgLy8gSW5pdCBSRkIgcHJvdG9jb2xcbiAgICAgIHRoaXMuc2VuZCh7IGFjdGlvbjogJ2Nvbm5lY3QnIH0sIFBST1RPLkRJU1BMQVlfSU5JVClcbiAgICB9XG4gIH1cblxuICBjbG9zZSAoKSB7XG4gICAgLy8gVk5DIG1vZGVcbiAgICBpZiAodGhpcy5tb2RlID09PSBQUk9UTy5ESVNQTEFZKSB7XG4gICAgICBSZW1vdGUucmVtb3ZlQWxsTGlzdGVuZXJzKFBST1RPLkRJU1BMQVlfSU5JVClcbiAgICAgIFJlbW90ZS5yZW1vdmVBbGxMaXN0ZW5lcnMoUFJPVE8uRElTUExBWV9DTE9TRSlcbiAgICAgIFJlbW90ZS5yZW1vdmVBbGxMaXN0ZW5lcnMoUFJPVE8uRElTUExBWSlcbiAgICB9XG5cbiAgICB0aGlzLmVtaXQoQ0xPU0UsIHt9KVxuICB9XG5cbiAgc2VuZCAobWVzc2FnZSwgcHJvdG8gPSBQUk9UTy5ESVNQTEFZKSB7XG4gICAgUmVtb3RlLnNlbmQoe1xuICAgICAgcHJvdG86IHByb3RvLFxuICAgICAgZGF0YTogbWVzc2FnZVxuICAgIH0pXG4gIH1cbn1cblxuRmFrZVdlYlNvY2tldC5OT1RJTklUID0gUmVtb3RlLk5PVElOSVRcbkZha2VXZWJTb2NrZXQuQ09OTkVDVElORyA9IFJlbW90ZS5DT05ORUNUSU5HXG5GYWtlV2ViU29ja2V0Lk9QRU4gPSBSZW1vdGUuT1BFTlxuRmFrZVdlYlNvY2tldC5DTE9TSU5HID0gUmVtb3RlLkNMT1NJTkdcbkZha2VXZWJTb2NrZXQuQ0xPU0VEID0gUmVtb3RlLkNMT1NFRFxuXG5leHBvcnQgZGVmYXVsdCBGYWtlV2ViU29ja2V0XG4iLCJjbGFzcyBMb2dnZXIge1xuICBjb25zdHJ1Y3RvciAocHJvcHMgPSB7fSkge1xuICAgIHRoaXMuc2VjdGlvbiA9IHByb3BzLnNlY3Rpb24gfHwgJydcbiAgfVxuXG4gIGRvTG9nICh0eXBlLCAuLi5wYXJhbXMpIHtcbiAgICAvLyBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgY29uc29sZVt0eXBlXSh0aGlzLnNlY3Rpb24gPyBgWyR7dGhpcy5zZWN0aW9ufV1gIDogJycsIC4uLnBhcmFtcylcbiAgICAvLyB9XG4gIH1cblxuICBsb2cgKC4uLnBhcmFtcykge1xuICAgIHRoaXMuZG9Mb2coJ2xvZycsIC4uLnBhcmFtcylcbiAgfVxuXG4gIGVycm9yICguLi5wYXJhbXMpIHtcbiAgICB0aGlzLmRvTG9nKCdlcnJvcicsIC4uLnBhcmFtcylcbiAgfVxuXG4gIHdhcm5pbmcgKC4uLnBhcmFtcykge1xuICAgIHRoaXMuZG9Mb2coJ3dhcm4nLCAuLi5wYXJhbXMpXG4gIH1cblxuICBpbmZvICguLi5wYXJhbXMpIHtcbiAgICB0aGlzLmRvTG9nKCdpbmZvJywgLi4ucGFyYW1zKVxuICB9XG5cbiAgdHJhY2UgKC4uLnBhcmFtcykge1xuICAgIHRoaXMuZG9Mb2coJ3RyYWNlJywgLi4ucGFyYW1zKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExvZ2dlclxuIiwiJ3VzZSBzdHJpY3QnXG5cbi8qIFxcXG58KnxcbnwqfCAgQmFzZTY0IC8gYmluYXJ5IGRhdGEgLyBVVEYtOCBzdHJpbmdzIHV0aWxpdGllc1xufCp8XG58KnwgIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvQmFzZTY0X2VuY29kaW5nX2FuZF9kZWNvZGluZ1xufCp8XG5cXCAqL1xuXG4vKiBBcnJheSBvZiBieXRlcyB0byBiYXNlNjQgc3RyaW5nIGRlY29kaW5nICovXG5cbmZ1bmN0aW9uIGI2NFRvVWludDYgKG5DaHIpIHtcbiAgcmV0dXJuIG5DaHIgPiA2NCAmJiBuQ2hyIDwgOTFcbiAgICAgID8gbkNociAtIDY1XG4gICAgOiBuQ2hyID4gOTYgJiYgbkNociA8IDEyM1xuICAgICAgPyBuQ2hyIC0gNzFcbiAgICA6IG5DaHIgPiA0NyAmJiBuQ2hyIDwgNThcbiAgICAgID8gbkNociArIDRcbiAgICA6IG5DaHIgPT09IDQzXG4gICAgICA/IDYyXG4gICAgOiBuQ2hyID09PSA0N1xuICAgICAgPyA2M1xuICAgIDogMFxufVxuXG5mdW5jdGlvbiBiYXNlNjREZWNUb0FyciAoc0Jhc2U2NCwgbkJsb2Nrc1NpemUpIHtcbiAgdmFyIHNCNjRFbmMgPSBzQmFzZTY0LnJlcGxhY2UoL1teQS1aYS16MC05XFwrXFwvXS9nLCAnJykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICB2YXIgbkluTGVuID0gc0I2NEVuYy5sZW5ndGhcbiAgdmFyIG5PdXRMZW4gPSBuQmxvY2tzU2l6ZSA/IE1hdGguY2VpbCgobkluTGVuICogMyArIDEgPj4gMikgLyBuQmxvY2tzU2l6ZSkgKiBuQmxvY2tzU2l6ZSA6IG5JbkxlbiAqIDMgKyAxID4+IDJcbiAgdmFyIHRhQnl0ZXMgPSBuZXcgVWludDhBcnJheShuT3V0TGVuKVxuXG4gIGZvciAodmFyIG5Nb2QzLCBuTW9kNCwgblVpbnQyNCA9IDAsIG5PdXRJZHggPSAwLCBuSW5JZHggPSAwOyBuSW5JZHggPCBuSW5MZW47IG5JbklkeCsrKSB7XG4gICAgbk1vZDQgPSBuSW5JZHggJiAzXG4gICAgblVpbnQyNCB8PSBiNjRUb1VpbnQ2KHNCNjRFbmMuY2hhckNvZGVBdChuSW5JZHgpKSA8PCAxOCAtIDYgKiBuTW9kNFxuICAgIGlmIChuTW9kNCA9PT0gMyB8fCBuSW5MZW4gLSBuSW5JZHggPT09IDEpIHtcbiAgICAgIGZvciAobk1vZDMgPSAwOyBuTW9kMyA8IDMgJiYgbk91dElkeCA8IG5PdXRMZW47IG5Nb2QzKyssIG5PdXRJZHgrKykge1xuICAgICAgICB0YUJ5dGVzW25PdXRJZHhdID0gblVpbnQyNCA+Pj4gKDE2ID4+PiBuTW9kMyAmIDI0KSAmIDI1NVxuICAgICAgfVxuICAgICAgblVpbnQyNCA9IDBcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFCeXRlc1xufVxuXG4vKiBCYXNlNjQgc3RyaW5nIHRvIGFycmF5IGVuY29kaW5nICovXG5cbmZ1bmN0aW9uIHVpbnQ2VG9CNjQgKG5VaW50Nikge1xuICByZXR1cm4gblVpbnQ2IDwgMjZcbiAgICAgID8gblVpbnQ2ICsgNjVcbiAgICA6IG5VaW50NiA8IDUyXG4gICAgICA/IG5VaW50NiArIDcxXG4gICAgOiBuVWludDYgPCA2MlxuICAgICAgPyBuVWludDYgLSA0XG4gICAgOiBuVWludDYgPT09IDYyXG4gICAgICA/IDQzXG4gICAgOiBuVWludDYgPT09IDYzXG4gICAgICA/IDQ3XG4gICAgOiA2NVxufVxuXG5mdW5jdGlvbiBiYXNlNjRFbmNBcnIgKGFCeXRlcykge1xuICB2YXIgbk1vZDMgPSAyXG4gIHZhciBzQjY0RW5jID0gJydcblxuICBmb3IgKHZhciBuTGVuID0gYUJ5dGVzLmxlbmd0aCwgblVpbnQyNCA9IDAsIG5JZHggPSAwOyBuSWR4IDwgbkxlbjsgbklkeCsrKSB7XG4gICAgbk1vZDMgPSBuSWR4ICUgM1xuICAgIGlmIChuSWR4ID4gMCAmJiAobklkeCAqIDQgLyAzKSAlIDc2ID09PSAwKSB7IHNCNjRFbmMgKz0gJ1xcclxcbicgfVxuICAgIG5VaW50MjQgfD0gYUJ5dGVzW25JZHhdIDw8ICgxNiA+Pj4gbk1vZDMgJiAyNClcbiAgICBpZiAobk1vZDMgPT09IDIgfHwgYUJ5dGVzLmxlbmd0aCAtIG5JZHggPT09IDEpIHtcbiAgICAgIHNCNjRFbmMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1aW50NlRvQjY0KG5VaW50MjQgPj4+IDE4ICYgNjMpLCB1aW50NlRvQjY0KG5VaW50MjQgPj4+IDEyICYgNjMpLCB1aW50NlRvQjY0KG5VaW50MjQgPj4+IDYgJiA2MyksIHVpbnQ2VG9CNjQoblVpbnQyNCAmIDYzKSlcbiAgICAgIG5VaW50MjQgPSAwXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNCNjRFbmMuc3Vic3RyKDAsIHNCNjRFbmMubGVuZ3RoIC0gMiArIG5Nb2QzKSArIChuTW9kMyA9PT0gMiA/ICcnIDogbk1vZDMgPT09IDEgPyAnPScgOiAnPT0nKVxufVxuXG4vKiBVVEYtOCBhcnJheSB0byBET01TdHJpbmcgYW5kIHZpY2UgdmVyc2EgKi9cblxuZnVuY3Rpb24gVVRGOEFyclRvU3RyIChhQnl0ZXMpIHtcbiAgdmFyIHNWaWV3ID0gJydcblxuICBmb3IgKHZhciBuUGFydCwgbkxlbiA9IGFCeXRlcy5sZW5ndGgsIG5JZHggPSAwOyBuSWR4IDwgbkxlbjsgbklkeCsrKSB7XG4gICAgblBhcnQgPSBhQnl0ZXNbbklkeF1cbiAgICBzVmlldyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFxuICAgICAgblBhcnQgPiAyNTEgJiYgblBhcnQgPCAyNTQgJiYgbklkeCArIDUgPCBuTGVuIC8qIHNpeCBieXRlcyAqL1xuICAgICAgICAvKiAoblBhcnQgLSAyNTIgPDwgMzApIG1heSBiZSBub3Qgc28gc2FmZSBpbiBFQ01BU2NyaXB0ISBTby4uLjogKi9cbiAgICAgICAgPyAoblBhcnQgLSAyNTIpICogMTA3Mzc0MTgyNCArIChhQnl0ZXNbKytuSWR4XSAtIDEyOCA8PCAyNCkgKyAoYUJ5dGVzWysrbklkeF0gLSAxMjggPDwgMTgpICsgKGFCeXRlc1srK25JZHhdIC0gMTI4IDw8IDEyKSArIChhQnl0ZXNbKytuSWR4XSAtIDEyOCA8PCA2KSArIGFCeXRlc1srK25JZHhdIC0gMTI4XG4gICAgICA6IG5QYXJ0ID4gMjQ3ICYmIG5QYXJ0IDwgMjUyICYmIG5JZHggKyA0IDwgbkxlbiAvKiBmaXZlIGJ5dGVzICovXG4gICAgICAgID8gKG5QYXJ0IC0gMjQ4IDw8IDI0KSArIChhQnl0ZXNbKytuSWR4XSAtIDEyOCA8PCAxOCkgKyAoYUJ5dGVzWysrbklkeF0gLSAxMjggPDwgMTIpICsgKGFCeXRlc1srK25JZHhdIC0gMTI4IDw8IDYpICsgYUJ5dGVzWysrbklkeF0gLSAxMjhcbiAgICAgIDogblBhcnQgPiAyMzkgJiYgblBhcnQgPCAyNDggJiYgbklkeCArIDMgPCBuTGVuIC8qIGZvdXIgYnl0ZXMgKi9cbiAgICAgICAgPyAoblBhcnQgLSAyNDAgPDwgMTgpICsgKGFCeXRlc1srK25JZHhdIC0gMTI4IDw8IDEyKSArIChhQnl0ZXNbKytuSWR4XSAtIDEyOCA8PCA2KSArIGFCeXRlc1srK25JZHhdIC0gMTI4XG4gICAgICA6IG5QYXJ0ID4gMjIzICYmIG5QYXJ0IDwgMjQwICYmIG5JZHggKyAyIDwgbkxlbiAvKiB0aHJlZSBieXRlcyAqL1xuICAgICAgICA/IChuUGFydCAtIDIyNCA8PCAxMikgKyAoYUJ5dGVzWysrbklkeF0gLSAxMjggPDwgNikgKyBhQnl0ZXNbKytuSWR4XSAtIDEyOFxuICAgICAgOiBuUGFydCA+IDE5MSAmJiBuUGFydCA8IDIyNCAmJiBuSWR4ICsgMSA8IG5MZW4gLyogdHdvIGJ5dGVzICovXG4gICAgICAgID8gKG5QYXJ0IC0gMTkyIDw8IDYpICsgYUJ5dGVzWysrbklkeF0gLSAxMjhcbiAgICAgIDogblBhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gc1ZpZXdcbn1cblxuZnVuY3Rpb24gc3RyVG9VVEY4QXJyIChzRE9NU3RyKSB7XG4gIHZhciBhQnl0ZXNcbiAgdmFyIG5DaHJcbiAgdmFyIG5TdHJMZW4gPSBzRE9NU3RyLmxlbmd0aFxuICB2YXIgbkFyckxlbiA9IDBcblxuICAvKiBtYXBwaW5nLi4uICovXG5cbiAgZm9yICh2YXIgbk1hcElkeCA9IDA7IG5NYXBJZHggPCBuU3RyTGVuOyBuTWFwSWR4KyspIHtcbiAgICBuQ2hyID0gc0RPTVN0ci5jaGFyQ29kZUF0KG5NYXBJZHgpXG4gICAgbkFyckxlbiArPSBuQ2hyIDwgMHg4MCA/IDEgOiBuQ2hyIDwgMHg4MDAgPyAyIDogbkNociA8IDB4MTAwMDAgPyAzIDogbkNociA8IDB4MjAwMDAwID8gNCA6IG5DaHIgPCAweDQwMDAwMDAgPyA1IDogNlxuICB9XG5cbiAgYUJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobkFyckxlbilcblxuICAvKiB0cmFuc2NyaXB0aW9uLi4uICovXG5cbiAgZm9yICh2YXIgbklkeCA9IDAsIG5DaHJJZHggPSAwOyBuSWR4IDwgbkFyckxlbjsgbkNocklkeCsrKSB7XG4gICAgbkNociA9IHNET01TdHIuY2hhckNvZGVBdChuQ2hySWR4KVxuICAgIGlmIChuQ2hyIDwgMTI4KSB7XG4gICAgICAvKiBvbmUgYnl0ZSAqL1xuICAgICAgYUJ5dGVzW25JZHgrK10gPSBuQ2hyXG4gICAgfSBlbHNlIGlmIChuQ2hyIDwgMHg4MDApIHtcbiAgICAgIC8qIHR3byBieXRlcyAqL1xuICAgICAgYUJ5dGVzW25JZHgrK10gPSAxOTIgKyAobkNociA+Pj4gNilcbiAgICAgIGFCeXRlc1tuSWR4KytdID0gMTI4ICsgKG5DaHIgJiA2MylcbiAgICB9IGVsc2UgaWYgKG5DaHIgPCAweDEwMDAwKSB7XG4gICAgICAvKiB0aHJlZSBieXRlcyAqL1xuICAgICAgYUJ5dGVzW25JZHgrK10gPSAyMjQgKyAobkNociA+Pj4gMTIpXG4gICAgICBhQnl0ZXNbbklkeCsrXSA9IDEyOCArIChuQ2hyID4+PiA2ICYgNjMpXG4gICAgICBhQnl0ZXNbbklkeCsrXSA9IDEyOCArIChuQ2hyICYgNjMpXG4gICAgfSBlbHNlIGlmIChuQ2hyIDwgMHgyMDAwMDApIHtcbiAgICAgIC8qIGZvdXIgYnl0ZXMgKi9cbiAgICAgIGFCeXRlc1tuSWR4KytdID0gMjQwICsgKG5DaHIgPj4+IDE4KVxuICAgICAgYUJ5dGVzW25JZHgrK10gPSAxMjggKyAobkNociA+Pj4gMTIgJiA2MylcbiAgICAgIGFCeXRlc1tuSWR4KytdID0gMTI4ICsgKG5DaHIgPj4+IDYgJiA2MylcbiAgICAgIGFCeXRlc1tuSWR4KytdID0gMTI4ICsgKG5DaHIgJiA2MylcbiAgICB9IGVsc2UgaWYgKG5DaHIgPCAweDQwMDAwMDApIHtcbiAgICAgIC8qIGZpdmUgYnl0ZXMgKi9cbiAgICAgIGFCeXRlc1tuSWR4KytdID0gMjQ4ICsgKG5DaHIgPj4+IDI0KVxuICAgICAgYUJ5dGVzW25JZHgrK10gPSAxMjggKyAobkNociA+Pj4gMTggJiA2MylcbiAgICAgIGFCeXRlc1tuSWR4KytdID0gMTI4ICsgKG5DaHIgPj4+IDEyICYgNjMpXG4gICAgICBhQnl0ZXNbbklkeCsrXSA9IDEyOCArIChuQ2hyID4+PiA2ICYgNjMpXG4gICAgICBhQnl0ZXNbbklkeCsrXSA9IDEyOCArIChuQ2hyICYgNjMpXG4gICAgfSBlbHNlIC8qIGlmIChuQ2hyIDw9IDB4N2ZmZmZmZmYpICovIHtcbiAgICAgIC8qIHNpeCBieXRlcyAqL1xuICAgICAgYUJ5dGVzW25JZHgrK10gPSAyNTIgKyAobkNociA+Pj4gMzApXG4gICAgICBhQnl0ZXNbbklkeCsrXSA9IDEyOCArIChuQ2hyID4+PiAyNCAmIDYzKVxuICAgICAgYUJ5dGVzW25JZHgrK10gPSAxMjggKyAobkNociA+Pj4gMTggJiA2MylcbiAgICAgIGFCeXRlc1tuSWR4KytdID0gMTI4ICsgKG5DaHIgPj4+IDEyICYgNjMpXG4gICAgICBhQnl0ZXNbbklkeCsrXSA9IDEyOCArIChuQ2hyID4+PiA2ICYgNjMpXG4gICAgICBhQnl0ZXNbbklkeCsrXSA9IDEyOCArIChuQ2hyICYgNjMpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFCeXRlc1xufVxuXG5mdW5jdGlvbiBzdHJUb0Jhc2U2NCAoc3RySW5wdXQpIHtcbiAgaWYgKHR5cGVvZiBzdHJJbnB1dCAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgaW5wdXQgc2hvdWxkIGJlIGEgc3RyaW5nJylcbiAgfVxuXG4gIHJldHVybiBiYXNlNjRFbmNBcnIoc3RyVG9VVEY4QXJyKHN0cklucHV0KSlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9TdHIgKGJhc2U2NElucHV0KSB7XG4gIGlmICh0eXBlb2YgYmFzZTY0SW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGlucHV0IHNob3VsZCBiZSBhIHN0cmluZycpXG4gIH1cblxuICByZXR1cm4gVVRGOEFyclRvU3RyKGJhc2U2NERlY1RvQXJyKGJhc2U2NElucHV0KSlcbn1cblxuZXhwb3J0IHtcbiAgYmFzZTY0RGVjVG9BcnIsXG4gIGJhc2U2NEVuY0FycixcbiAgVVRGOEFyclRvU3RyLFxuICBzdHJUb1VURjhBcnIsXG4gIHN0clRvQmFzZTY0LFxuICBiYXNlNjRUb1N0clxufVxuIiwiLyogZ2xvYmFscyBXZWJTb2NrZXQgKi9cblxuaW1wb3J0IEV2ZW50RW1taXRlciBmcm9tICdldmVudHMnXG5pbXBvcnQgdXJsUGFyc2VyIGZyb20gJ3VybCdcblxuY2xhc3MgUmVtb3RlIGV4dGVuZHMgRXZlbnRFbW1pdGVyIHtcbiAgY29uc3RydWN0b3IgKCkge1xuICAgIHN1cGVyKClcblxuICAgIHRoaXMuX19pc0Nvbm5lY3RpbmcgPSBmYWxzZVxuICAgIHRoaXMuX19pc0Rpc2Nvbm5lY3RpbmcgPSBmYWxzZVxuICB9XG5cbiAgaW5pdGlhbGl6ZSAocGFyYW1zID0ge30pIHtcbiAgICAvLyBDaGVjayByZXF1aXJlZCBwYXJhbXNcbiAgICBpZiAoIXBhcmFtcy51cmwgfHwgIXBhcmFtcy5hZ2VudElEKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVycycpXG4gICAgfVxuXG4gICAgdGhpcy51cmwgPSBwYXJhbXMudXJsXG4gICAgdGhpcy5hZ2VudElEID0gcGFyYW1zLmFnZW50SURcblxuICAgIGlmIChwYXJhbXMub25PcGVuKSB0aGlzLm9uT3BlbihwYXJhbXMub25PcGVuKVxuICAgIGlmIChwYXJhbXMub25PcGVuaW5nKSB0aGlzLm9uT3BlbmluZyhwYXJhbXMub25PcGVuaW5nKVxuICAgIGlmIChwYXJhbXMub25DbG9zaW5nKSB0aGlzLm9uQ2xvc2luZyhwYXJhbXMub25DbG9zaW5nKVxuICAgIGlmIChwYXJhbXMub25DbG9zZSkgdGhpcy5vbkNsb3NlKHBhcmFtcy5vbkNsb3NlKVxuICAgIGlmIChwYXJhbXMub25FcnJvcikgdGhpcy5vbkVycm9yKHBhcmFtcy5vbkVycm9yKVxuICAgIGlmIChwYXJhbXMub25NZXNzYWdlKSB0aGlzLm9uTWVzc2FnZShwYXJhbXMub25NZXNzYWdlKVxuICAgIGlmIChwYXJhbXMubWVzc2FnZVBhcnNlcikgdGhpcy5tZXNzYWdlUGFyc2VyID0gcGFyYW1zLm1lc3NhZ2VQYXJzZXJcbiAgfVxuXG4gIHNldCBhZ2VudElEIChhZ2VudElEKSB7XG4gICAgdmFyIGFnZW50SURUeXBlID0gdHlwZW9mIGFnZW50SURcbiAgICBpZiAoYWdlbnRJRFR5cGUgIT09ICdudW1iZXInICYmIGFnZW50SURUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGFnZW50IElEIHNob3VsZCBiZSBhIG51bWJlciBvciBhIHN0cmluZycpXG4gICAgfVxuICAgIHRoaXMuX19hZ2VudElEID0gYWdlbnRJRFxuXG4gICAgdGhpcy5fX3VybC5wYXRobmFtZSA9ICcvJyArIHRoaXMuX19hZ2VudElEXG4gIH1cblxuICBnZXQgYWdlbnRJRCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19hZ2VudElEXG4gIH1cblxuICBzZXQgdXJsICh1cmwpIHtcbiAgICB2YXIgdXJsVHlwZSA9IHR5cGVvZiB1cmxcbiAgICBpZiAodXJsVHlwZSAhPT0gJ3N0cmluZycgJiYgdXJsVHlwZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBVUkwgc2hvdWxkIGJlIGFuIFVSTCBvYmplY3Qgb3IgYSBzdHJpbmcnKVxuICAgIH1cblxuICAgIGlmICh1cmxUeXBlID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fX3VybCA9IHVybFBhcnNlci5wYXJzZSh1cmwpXG4gICAgfSBlbHNlIGlmICh1cmxUeXBlID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5fX3VybCA9IHVybFxuICAgICAgLy8gRW5zdXJlIHNsYXNoZXNcbiAgICAgIHRoaXMuX191cmwuc2xhc2hlcyA9IHRydWVcbiAgICB9XG4gIH1cblxuICBnZXQgdXJsICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3VybFxuICB9XG5cbiAgZ2V0IHVybFN0cmluZyAoKSB7XG4gICAgcmV0dXJuIHVybFBhcnNlci5mb3JtYXQodGhpcy51cmwpXG4gIH1cblxuICBnZXQgcHJvdG9jb2wgKCkge1xuICAgIHJldHVybiAnYmluYXJ5J1xuICB9XG5cbiAgZ2V0IGJ1ZmZlcmVkQW1vdW50ICgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX193cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmICh0aGlzLl9fd3MucmVhZHlTdGF0ZSA9PT0gUmVtb3RlLk9QRU4pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX193cy5idWZmZXJlZEFtb3VudFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBzdGF0ZSAoKSB7XG4gICAgaWYgKHRoaXMuX19pc0Nvbm5lY3RpbmcpIHJldHVybiBSZW1vdGUuQ09OTkVDVElOR1xuICAgIGVsc2UgaWYgKHRoaXMuX19pc0Rpc2Nvbm5lY3RpbmcpIHJldHVybiBSZW1vdGUuQ0xPU0lOR1xuICAgIGVsc2UgaWYgKCF0aGlzLmFnZW50SUQpIHJldHVybiBSZW1vdGUuTk9USU5JVFxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLl9fd3MgIT09ICd1bmRlZmluZWQnKSByZXR1cm4gdGhpcy5fX3dzLnJlYWR5U3RhdGVcblxuICAgIHJldHVybiBSZW1vdGUuQ0xPU0VEXG4gIH1cblxuICBnZXQgaXNDb25uZWN0ZWQgKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fX3dzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHRoaXMuX193cy5yZWFkeVN0YXRlID09PSBSZW1vdGUuT1BFTlxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHNldCBtZXNzYWdlUGFyc2VyIChtZXNzYWdlUGFyc2VyKSB7XG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlUGFyc2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLl9fbWVzc2FnZVBhcnNlciA9IG1lc3NhZ2VQYXJzZXJcbiAgICB9XG4gIH1cblxuICAvLyAtLSBFdmVudCBoYW5kbGVycyAtLSAvL1xuICBfX3N0YXJ0Q29uVGltZW91dCAodGltZSA9IDEwMDAwKSB7XG4gICAgdGhpcy5fX2NvblRpbWVyID0gc2V0VGltZW91dCh0aGlzLmNsb3NlLmJpbmQodGhpcyksIHRpbWUpXG4gIH1cblxuICBfX3N0b3BDb25UaW1lb3V0ICgpIHtcbiAgICBpZiAodGhpcy5fX2NvblRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fX2NvblRpbWVyKVxuICAgICAgdGhpcy5fX2NvblRpbWVyID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIF9fb25PcGVuIChldmVudCkge1xuICAgIHRoaXMuX19zdG9wQ29uVGltZW91dCgpXG5cbiAgICB0aGlzLl9faXNDb25uZWN0aW5nID0gZmFsc2VcbiAgICB0aGlzLl9faXNEaXNjb25uZWN0aW5nID0gZmFsc2VcbiAgICB0aGlzLmVtaXQoJ29wZW4nLCBldmVudClcbiAgfVxuXG4gIF9fb25PcGVuaW5nICgpIHtcbiAgICB0aGlzLl9fc3RhcnRDb25UaW1lb3V0KClcblxuICAgIHRoaXMuX19pc0Nvbm5lY3RpbmcgPSB0cnVlXG4gICAgdGhpcy5fX2lzRGlzY29ubmVjdGluZyA9IGZhbHNlXG4gICAgdGhpcy5lbWl0KCdvcGVuaW5nJylcbiAgfVxuXG4gIF9fb25DbG9zZSAoZXZlbnQpIHtcbiAgICB0aGlzLl9fc3RvcENvblRpbWVvdXQoKVxuXG4gICAgdGhpcy5fX2lzQ29ubmVjdGluZyA9IGZhbHNlXG4gICAgdGhpcy5fX2lzRGlzY29ubmVjdGluZyA9IGZhbHNlXG4gICAgdGhpcy5lbWl0KCdjbG9zZScsIGV2ZW50KVxuICB9XG5cbiAgX19vbkNsb3NpbmcgKCkge1xuICAgIHRoaXMuX19zdG9wQ29uVGltZW91dCgpXG5cbiAgICB0aGlzLl9faXNDb25uZWN0aW5nID0gZmFsc2VcbiAgICB0aGlzLl9faXNEaXNjb25uZWN0aW5nID0gdHJ1ZVxuICAgIHRoaXMuZW1pdCgnY2xvc2luZycpXG4gIH1cblxuICBfX29uRXJyb3IgKGV2ZW50KSB7XG4gICAgdGhpcy5fX3N0b3BDb25UaW1lb3V0KClcblxuICAgIHRoaXMuZW1pdCgnZXJyb3InLCBldmVudClcbiAgfVxuXG4gIF9fb25NZXNzYWdlIChldmVudCkge1xuICAgIHRoaXMuZW1pdCgnbWVzc2FnZScsIGV2ZW50LmRhdGEpXG4gIH1cblxuICBvbk9wZW4gKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMub24oJ29wZW4nLCBjYWxsYmFjaylcbiAgfVxuXG4gIG9uT3BlbmluZyAoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5vbignb3BlbmluZycsIGNhbGxiYWNrKVxuICB9XG5cbiAgb25DbG9zZSAoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5vbignY2xvc2UnLCBjYWxsYmFjaylcbiAgfVxuXG4gIG9uQ2xvc2luZyAoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5vbignY2xvc2luZycsIGNhbGxiYWNrKVxuICB9XG5cbiAgb25FcnJvciAoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5vbignZXJyb3InLCBjYWxsYmFjaylcbiAgfVxuXG4gIG9uTWVzc2FnZSAoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5vbignbWVzc2FnZScsIGNhbGxiYWNrKVxuICB9XG5cbiAgY29ubmVjdCAoKSB7XG4gICAgLy8gSEFDSyAvL1xuICAgIC8vIHZhciBvcGVuID0gdGhpcy5fX29uT3Blbi5iaW5kKHRoaXMpXG4gICAgLy8gdGhpcy5fX3dzID0ge31cbiAgICAvLyB0aGlzLl9fd3Muc2VuZCA9ICgpPT57fVxuICAgIC8vIHRoaXMuX193cy5jbG9zZSA9ICgpPT57fVxuICAgIC8vIHRoaXMuX193cy5yZWFkeVN0YXRlID0gUmVtb3RlLk9QRU5cbiAgICAvLyBvcGVuKClcbiAgICAvLyByZXR1cm5cbiAgICAvLyBIQUNLIC8vXG5cbiAgICBpZiAoIXRoaXMuaXNDb25uZWN0ZWQgJiYgdGhpcy5hZ2VudElEKSB7XG4gICAgICAvLyBGaXJlIG9wZW5pbmcgZXZlbnRcbiAgICAgIHRoaXMuX19vbk9wZW5pbmcoKVxuXG4gICAgICB0aGlzLl9fd3MgPSBuZXcgV2ViU29ja2V0KHRoaXMudXJsU3RyaW5nLCB0aGlzLnByb3RvY29sKVxuICAgICAgdGhpcy5fX3dzLmJpbmFyeVR5cGUgPSAnYXJyYXlidWZmZXInXG4gICAgICB0aGlzLl9fd3Mub25vcGVuID0gdGhpcy5fX29uT3Blbi5iaW5kKHRoaXMpXG4gICAgICB0aGlzLl9fd3Mub25jbG9zZSA9IHRoaXMuX19vbkNsb3NlLmJpbmQodGhpcylcbiAgICAgIHRoaXMuX193cy5vbmVycm9yID0gdGhpcy5fX29uRXJyb3IuYmluZCh0aGlzKVxuICAgICAgdGhpcy5fX3dzLm9ubWVzc2FnZSA9IHRoaXMuX19vbk1lc3NhZ2UuYmluZCh0aGlzKVxuICAgIH1cbiAgfVxuXG4gIHJlY29ubmVjdCAoKSB7XG4gICAgdGhpcy5jb25uZWN0KClcbiAgfVxuXG4gIGNsb3NlICgpIHtcbiAgICAvLyBGaXJlIGNsb3NpbmcgZXZlbnRcbiAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkgdGhpcy5fX29uQ2xvc2luZygpXG4gICAgaWYgKHRoaXMuX193cykgdGhpcy5fX3dzLmNsb3NlKClcbiAgfVxuXG4gIHNlbmQgKG1lc3NhZ2UpIHtcbiAgICBpZiAodGhpcy5pc0Nvbm5lY3RlZCkge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLl9fbWVzc2FnZVBhcnNlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBtZXNzYWdlID0gdGhpcy5fX21lc3NhZ2VQYXJzZXIobWVzc2FnZSlcbiAgICAgIH1cbiAgICAgIHRoaXMuX193cy5zZW5kKG1lc3NhZ2UpXG4gICAgfVxuICB9XG59XG5cblJlbW90ZS5OT1RJTklUID0gLTFcblJlbW90ZS5DT05ORUNUSU5HID0gMFxuUmVtb3RlLk9QRU4gPSAxXG5SZW1vdGUuQ0xPU0lORyA9IDJcblJlbW90ZS5DTE9TRUQgPSAzXG5cbmV4cG9ydCBkZWZhdWx0IFJlbW90ZVxuIiwiLy8gc3JjL2NvbW1vbi9saWIvcmVtb3RlL1JlbW90ZUFnZW50LmpzXG5cbmltcG9ydCBSZW1vdGUgZnJvbSAnLi9SZW1vdGUnXG5pbXBvcnQgUmVtb3RlUmVzcG9uc2UgZnJvbSAnLi9yZXNwb25zZS1kYXRhJ1xuXG5jbGFzcyBSZW1vdGVBZ2VudCBleHRlbmRzIFJlbW90ZSB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICBzdXBlcigpXG5cbiAgICB0aGlzLm1lc3NhZ2VQYXJzZXIgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAobWVzc2FnZS5kYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgfHxcbiAgICAgICAgICAgIG1lc3NhZ2UuZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UucHJvdG8gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gKG1lc3NhZ2UuZGF0YSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKVxuICAgICAgICAgICAgICA/IG1lc3NhZ2UuZGF0YSAvLyBBcnJheUJ1ZmZlclxuICAgICAgICAgICAgICA6IG1lc3NhZ2UuZGF0YS5idWZmZXIgLy8gQXJyYXlCdWZmZXIgZnJvbSBVaW50OEFycmF5XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFNlbmQgYW4gQXJyYXlCdWZmZXIgd2l0aCB0aGUgcHJvdG8gKyBtZXNzYWdlXG4gICAgICAgICAgICBjb25zdCBtVmlldyA9IG5ldyBVaW50OEFycmF5KDEgKyBtZXNzYWdlLmRhdGEuYnl0ZUxlbmd0aCkgLy8gUHJvdG8gLT4gMSBieXRlXG4gICAgICAgICAgICBtVmlldy5zZXQobmV3IFVpbnQ4QXJyYXkoW21lc3NhZ2UucHJvdG9dKSwgMClcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSAobWVzc2FnZS5kYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpXG4gICAgICAgICAgICAgID8gbmV3IFVpbnQ4QXJyYXkobWVzc2FnZS5kYXRhKSAvLyB0eXBlZCBhcnJheSBmcm9tIGJ1ZmZlclxuICAgICAgICAgICAgICA6IG1lc3NhZ2UuZGF0YSAvLyBhbHJlYWR5IGEgdHlwZWQgYXJyYXlcbiAgICAgICAgICAgIG1WaWV3LnNldChkYXRhLCAxKVxuICAgICAgICAgICAgbWVzc2FnZSA9IG1WaWV3LmJ1ZmZlclxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgZmluYWxNZXNzYWdlID0gJydcbiAgICAgICAgICAvLyBQcm90b1xuICAgICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZS5wcm90byAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGZpbmFsTWVzc2FnZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKG1lc3NhZ2UucHJvdG8pXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIERhdGFcbiAgICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UuZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGZpbmFsTWVzc2FnZSArPSBtZXNzYWdlLmRhdGFcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBtZXNzYWdlLmRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBmaW5hbE1lc3NhZ2UgKz0gSlNPTi5zdHJpbmdpZnkobWVzc2FnZS5kYXRhKVxuICAgICAgICAgIH1cbiAgICAgICAgICBtZXNzYWdlID0gZmluYWxNZXNzYWdlXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UuYnVmZmVyXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBtZXNzYWdlXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2VIYW5kbGVyID0gKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyByZXNwb25zZSB3aWxsIGFsd2F5cyBiZSBBcnJheUJ1ZmZlclxuICAgICAgaWYgKCEocmVzcG9uc2UgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHJldHVyblxuICAgICAgY29uc3QgclJlc3BvbnNlID0gbmV3IFJlbW90ZVJlc3BvbnNlKHJlc3BvbnNlKVxuICAgICAgdGhpcy5lbWl0KHJSZXNwb25zZS5wcm90bywgclJlc3BvbnNlKVxuICAgIH1cblxuICAgIHRoaXMub25NZXNzYWdlKHJlc3BvbnNlSGFuZGxlcilcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBSZW1vdGVBZ2VudFxuIiwiLy8gc3JjL2NvbW1vbi9saWIvcmVtb3RlL2luZGV4LmpzXG5cbmltcG9ydCBSZW1vdGVBZ2VudCBmcm9tICcuL1JlbW90ZUFnZW50J1xuXG5jb25zdCBhZ2VudCA9IG5ldyBSZW1vdGVBZ2VudCgpXG5hZ2VudC5OT1RJTklUID0gLTFcbmFnZW50LkNPTk5FQ1RJTkcgPSAwXG5hZ2VudC5PUEVOID0gMVxuYWdlbnQuQ0xPU0lORyA9IDJcbmFnZW50LkNMT1NFRCA9IDNcblxuLy8gRXhwb3J0aW5nIHRoaXMgd2F5IHRoZSBjbGFzcyB3aWxsIGFjdCBhcyBhIHNpbmdsZXRvblxuZXhwb3J0IGRlZmF1bHQgYWdlbnRcbiIsImltcG9ydCB1dGY4IGZyb20gJ3V0ZjgnXG5cbmZ1bmN0aW9uIFJlc3BvbnNlRGF0YSAocmVzcG9uc2UpIHtcbiAgLy8gQ3JlYXRlIGEgVVRGLTggdmlldyB0byByZWFkIHRoZSBQUk9UT1xuICB0aGlzLnByb3RvID0gKG5ldyBVaW50OEFycmF5KHJlc3BvbnNlLnNsaWNlKDAsIDEpKSlbMF1cbiAgLy8gVGhlIGRhdGEgd2lsbCBiZSBhbiBBcnJheUJ1ZmZlciB3aXRob3V0IHRoZSBwcm90b1xuICB0aGlzLmRhdGFCdWZmZXIgPSByZXNwb25zZS5zbGljZSgxKSAvLyBzdGFydHMgZnJvbSB0aGUgYnl0ZSA4XG5cbiAgLy8gRGF0YSByZXByZXNlbnRlZCBhcyBhIFVURi04IHN0cmluZ1xuICBsZXQgZGF0YVN0cmluZ1xuXG4gIGNvbnN0IHVJbnQ4VG9TdHJpbmcgPSAodThhKSA9PiB7XG4gICAgY29uc3QgQ0hVTktfU0laRSA9IDB4ODAwMFxuICAgIGNvbnN0IGNodW5rcyA9IFtdXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHU4YS5sZW5ndGg7IGkgKz0gQ0hVTktfU0laRSkge1xuICAgICAgY2h1bmtzLnB1c2goXG4gICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgdThhLnN1YmFycmF5KGksIGkgKyBDSFVOS19TSVpFKSlcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gY2h1bmtzLmpvaW4oJycpXG4gIH1cblxuICB0aGlzLnRvU3RyaW5nID0gKCkgPT4ge1xuICAgIC8vIExhenkgbG9hZFxuICAgIGlmICghZGF0YVN0cmluZykge1xuICAgICAgZGF0YVN0cmluZyA9IHVJbnQ4VG9TdHJpbmcobmV3IFVpbnQ4QXJyYXkodGhpcy5kYXRhQnVmZmVyKSlcbiAgICB9XG4gICAgcmV0dXJuIGRhdGFTdHJpbmdcbiAgfVxuXG4gIC8vIERhdGEgcmVwcmVzZW50ZWQgYXMgYW4gT2JqZWN0XG4gIGxldCBkYXRhXG5cbiAgdGhpcy50b0pTT04gPSAoKSA9PiB7XG4gICAgLy8gTGF6eSBsb2FkXG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBXQVJOSU5HOiBUaGUgcmVjZWl2ZWQgZGF0YSB3aGljaCB3YXMganNvbiBlbmNvZGVkIGludG8gdGhlIGFnZW50XG4gICAgICAgIC8vIG5lZWRzIHRvIGJlIGRvdWJsZSBVVEY4IGRlY29kZWRcbiAgICAgICAgZGF0YSA9IEpTT04ucGFyc2UodXRmOC5kZWNvZGUodGhpcy50b1N0cmluZygpKSlcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBkYXRhID0gSlNPTi5wYXJzZSh0aGlzLnRvU3RyaW5nKCkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVzcG9uc2VEYXRhXG4iLCJleHBvcnQgY2xhc3MgZnVsbFNjcmVlblV0aWwge1xuICBzdXBwb3J0ZWRGdWxsc2NyZWVuICgpIHtcbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdmFyIGVsZW0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRcbiAgICAgIHJldHVybiAoZWxlbS5yZXF1ZXN0RnVsbHNjcmVlbiB8fFxuICAgICAgICAgICAgICBlbGVtLm1zUmVxdWVzdEZ1bGxzY3JlZW4gfHxcbiAgICAgICAgICAgICAgZWxlbS5tb3pSZXF1ZXN0RnVsbFNjcmVlbiB8fFxuICAgICAgICAgICAgICBlbGVtLndlYmtpdFJlcXVlc3RGdWxsU2NyZWVuKVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGVuYWJsZWRGdWxsc2NyZWVuICgpIHtcbiAgICBpZiAoIXRoaXMuc3VwcG9ydGVkRnVsbHNjcmVlbigpIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gKGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50IHx8XG4gICAgICAgICAgICBkb2N1bWVudC5tc0Z1bGxzY3JlZW5FbGVtZW50IHx8XG4gICAgICAgICAgICBkb2N1bWVudC5tb3pGdWxsU2NyZWVuRWxlbWVudCB8fFxuICAgICAgICAgICAgZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQpXG4gIH1cblxuICBleGl0RnVsbHNjcmVlbiAoKSB7XG4gICAgaWYgKCF0aGlzLnN1cHBvcnRlZEZ1bGxzY3JlZW4oKSB8fCB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSByZXR1cm5cbiAgICBpZiAodGhpcy5lbmFibGVkRnVsbHNjcmVlbigpKSB7XG4gICAgICBpZiAoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pIGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClcbiAgICAgIGVsc2UgaWYgKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pIGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKVxuICAgICAgZWxzZSBpZiAoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbikgZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpXG4gICAgICBlbHNlIGlmIChkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbikgZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKVxuICAgIH1cbiAgfVxuXG4gIHJlcXVlc3RGdWxsc2NyZWVuIChlbGVtKSB7XG4gICAgaWYgKCF0aGlzLnN1cHBvcnRlZEZ1bGxzY3JlZW4oKSB8fCB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSByZXR1cm5cblxuICAgIGlmICghdGhpcy5lbmFibGVkRnVsbHNjcmVlbigpKSB7XG4gICAgICBpZiAoZWxlbS5yZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICBlbGVtLnJlcXVlc3RGdWxsc2NyZWVuKClcbiAgICAgIH0gZWxzZSBpZiAoZWxlbS5tc1JlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgIGVsZW0ubXNSZXF1ZXN0RnVsbHNjcmVlbigpXG4gICAgICB9IGVsc2UgaWYgKGVsZW0ubW96UmVxdWVzdEZ1bGxTY3JlZW4pIHtcbiAgICAgICAgZWxlbS5tb3pSZXF1ZXN0RnVsbFNjcmVlbigpXG4gICAgICB9IGVsc2UgaWYgKGVsZW0ud2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgICAgZWxlbS53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbih3aW5kb3cuRWxlbWVudC5BTExPV19LRVlCT0FSRF9JTlBVVClcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5leGl0RnVsbHNjcmVlbigpXG4gICAgfVxuICB9XG5cbiAgYmluZEZ1bGxzY3JlZW5FdmVudHMgKGNhbGxiYWNrLCBjYWxsYmFja0Vycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykgY2FsbGJhY2sgPSAoKSA9PiB7fVxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2tFcnJvciAhPT0gJ2Z1bmN0aW9uJykgY2FsbGJhY2tFcnJvciA9ICgpID0+IHt9XG5cbiAgICAvLyBObyBwcmVmaXhcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmdWxsc2NyZWVuZXJyb3InLCAoZXZlbnQpID0+IHtcbiAgICAgIGNhbGxiYWNrRXJyb3IoZXZlbnQpXG4gICAgfSlcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdmdWxsc2NyZWVuY2hhbmdlJywgKGV2ZW50KSA9PiB7XG4gICAgICBjYWxsYmFjayhldmVudClcbiAgICB9KVxuXG4gICAgLy8gTVMgcHJlZml4XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignTVNGdWxsc2NyZWVuRXJyb3InLCAoZXZlbnQpID0+IHtcbiAgICAgIGNhbGxiYWNrRXJyb3IoZXZlbnQpXG4gICAgfSlcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdNU0Z1bGxzY3JlZW5DaGFuZ2UnLCAoZXZlbnQpID0+IHtcbiAgICAgIGNhbGxiYWNrKGV2ZW50KVxuICAgIH0pXG5cbiAgICAvLyBtb3ogcHJlZml4XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW96ZnVsbHNjcmVlbmVycm9yJywgKGV2ZW50KSA9PiB7XG4gICAgICBjYWxsYmFja0Vycm9yKGV2ZW50KVxuICAgIH0pXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW96ZnVsbHNjcmVlbmNoYW5nZScsIChldmVudCkgPT4ge1xuICAgICAgY2FsbGJhY2soZXZlbnQpXG4gICAgfSlcblxuICAgIC8vIHdlYmtpdCBwcmVmaXhcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRmdWxsc2NyZWVuZXJyb3InLCAoZXZlbnQpID0+IHtcbiAgICAgIGNhbGxiYWNrRXJyb3IoZXZlbnQpXG4gICAgfSlcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd3ZWJraXRmdWxsc2NyZWVuY2hhbmdlJywgKGV2ZW50KSA9PiB7XG4gICAgICBjYWxsYmFjayhldmVudClcbiAgICB9KVxuICB9XG5cbiAgdW5iaW5kRnVsbHNjcmVlbkV2ZW50cyAoY2FsbGJhY2ssIGNhbGxiYWNrRXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSBjYWxsYmFjayA9ICgpID0+IHt9XG4gICAgaWYgKHR5cGVvZiBjYWxsYmFja0Vycm9yICE9PSAnZnVuY3Rpb24nKSBjYWxsYmFja0Vycm9yID0gKCkgPT4ge31cblxuICAgIC8vIE5vIHByZWZpeFxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Z1bGxzY3JlZW5lcnJvcicsIGNhbGxiYWNrRXJyb3IpXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZnVsbHNjcmVlbmNoYW5nZScsIGNhbGxiYWNrKVxuXG4gICAgLy8gTVMgcHJlZml4XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignTVNGdWxsc2NyZWVuRXJyb3InLCBjYWxsYmFja0Vycm9yKVxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ01TRnVsbHNjcmVlbkNoYW5nZScsIGNhbGxiYWNrKVxuXG4gICAgLy8gbW96IHByZWZpeFxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vemZ1bGxzY3JlZW5lcnJvcicsIGNhbGxiYWNrRXJyb3IpXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW96ZnVsbHNjcmVlbmNoYW5nZScsIGNhbGxiYWNrKVxuXG4gICAgLy8gd2Via2l0IHByZWZpeFxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3dlYmtpdGZ1bGxzY3JlZW5lcnJvcicsIGNhbGxiYWNrRXJyb3IpXG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignd2Via2l0ZnVsbHNjcmVlbmNoYW5nZScsIGNhbGxiYWNrKVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBlbnN1cmVCb29sID0gKHZhbHVlLCBlcnJNZXNzID0gJ1RoZSB2YWx1ZSBzaG91bGQgYmUgYm9vbGVhbicpID0+IHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICghTnVtYmVyLmlzTmFOKE51bWJlci5wYXJzZUludCh2YWx1ZSwgMTApKSkge1xuICAgICAgICB2YWx1ZSA9IEJvb2xlYW4oTnVtYmVyLnBhcnNlSW50KHZhbHVlLCAxMCkpXG4gICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSAndHJ1ZScgfHwgdmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICAgICAgdmFsdWUgPSAodmFsdWUgPT09ICd0cnVlJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoZXJyTWVzcylcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHZhbHVlID0gQm9vbGVhbihOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihlcnJNZXNzKVxuICAgIH1cbiAgfVxuICByZXR1cm4gdmFsdWVcbn1cblxuLyoqXG4gKiBDdXRzIHRoZSB0ZXh0IGlmIHRoZWlyIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gdGhlIHNlbGVjdGVkIG1heCBsZW5ndGhcbiAqIGFuZCBhcHBsaWVzIHRoZSBzZWxlY3RlZCBlbGxpcHNlIHRvIHRoZSByZXN1bHQgdGV4dC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGV4dCB0byBjdXRcbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXggTWF4aW11bSBsZW5ndGggYWZ0ZXIgY3V0dGluZyB0aGUgdGV4dFxuICogQHBhcmFtIHtzdHJpbmd9IGVsbGlwc2UgU3RyaW5nIHRvIGJlIGFkZGVkIHRvIHRoZSBjdXR0ZWQgdGV4dFxuICogQHJldHVybnMge3N0cmluZ30gRnVsbCB0ZXh0IG9yIHRleHQgY3V0dGVkIHdpdGggdGhlIGVsbGlwc2VcbiAqL1xuZXhwb3J0IGNvbnN0IGVsbGlwc2l6ZSA9IChzdHIsIG1heCA9IDE0MCwgZWxsaXBzZSA9ICfigKYnKSA9PiAoXG4gIChzdHIudHJpbSgpLmxlbmd0aCA+IG1heCkgPyBzdHIuc3Vic3RyKDAsIG1heCkudHJpbSgpICsgZWxsaXBzZSA6IHN0clxuKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgaW5qZWN0SW50bCB9IGZyb20gJ3JlYWN0LWludGwnXG5pbXBvcnQge1xuICBNb2RhbCwgQnV0dG9uLCBHbHlwaGljb24sIEZvcm1Hcm91cCwgSW5wdXRHcm91cCwgRm9ybUNvbnRyb2xcbn0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuXG5leHBvcnQgY2xhc3MgQWdlbnRBdXRoZW50aWNhdGlvbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy5oYW5kbGVIaWRlID0gKGV2ZW50KSA9PiB7XG4gICAgICBwcm9wcy5oYW5kbGVIaWRlKClcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZVN1Ym1pdCA9IChldmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgcHJvcHMuaGFuZGxlU3VibWl0KGV2ZW50LnRhcmdldC5wYXNzd29yZC52YWx1ZSlcbiAgICAgIHByb3BzLmhhbmRsZUhpZGUoKVxuICAgIH1cblxuICAgIHRoaXMubWVzc2FnZXMgPSB7XG4gICAgICBhZ2VudFBhc3N3b3JkOiB7XG4gICAgICAgIGlkOiAnYWdlbnRQYXNzd29yZCcsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnQWdlbnQgcGFzc3dvcmQnXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IHNob3cgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCBkZWZpbmVNZXNzYWdlID0gdGhpcy5wcm9wcy5pbnRsLmZvcm1hdE1lc3NhZ2VcblxuICAgIHJldHVybiAoXG4gICAgICA8TW9kYWxcbiAgICAgICAgc2hvdz17c2hvd31cbiAgICAgICAga2V5Ym9hcmRcbiAgICAgICAgb25IaWRlPXt0aGlzLmhhbmRsZUhpZGV9XG4gICAgICAgIGJzU2l6ZT0nc21hbGwnXG4gICAgICAgIGFyaWEtbGFiZWxsZWRieT0nY29udGFpbmVkLW1vZGFsLXRpdGxlLXNtJz5cbiAgICAgICAgPE1vZGFsLkhlYWRlciBjbG9zZUJ1dHRvbj17ZmFsc2V9PlxuICAgICAgICAgIDxNb2RhbC5UaXRsZSBpZD0nY29udGFpbmVkLW1vZGFsLXRpdGxlLXNtJz5cbiAgICAgICAgICAgIHsgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLmFnZW50UGFzc3dvcmQpIH1cbiAgICAgICAgICA8L01vZGFsLlRpdGxlPlxuICAgICAgICA8L01vZGFsLkhlYWRlcj5cbiAgICAgICAgPE1vZGFsLkJvZHk+XG4gICAgICAgICAgPGZvcm0gb25TdWJtaXQ9e3RoaXMuaGFuZGxlU3VibWl0fT5cbiAgICAgICAgICAgIDxGb3JtR3JvdXA+XG4gICAgICAgICAgICAgIDxJbnB1dEdyb3VwPlxuICAgICAgICAgICAgICAgIDxJbnB1dEdyb3VwLkJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDxCdXR0b24gdHlwZT0nc3VibWl0JyBic1N0eWxlPSdwcmltYXJ5Jz5cbiAgICAgICAgICAgICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD0nbG9nLWluJyAvPlxuICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgPC9JbnB1dEdyb3VwLkJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8Rm9ybUNvbnRyb2xcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudENsYXNzPSdpbnB1dCdcbiAgICAgICAgICAgICAgICAgIGF1dG9Gb2N1c1xuICAgICAgICAgICAgICAgICAgb25Gb2N1cz17KGUpID0+IGUudGFyZ2V0LnNlbGVjdCgpfVxuICAgICAgICAgICAgICAgICAgbmFtZT0ncGFzc3dvcmQnXG4gICAgICAgICAgICAgICAgICB0eXBlPSdwYXNzd29yZCdcbiAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXt0aGlzLm1lc3NhZ2V9XG4gICAgICAgICAgICAgICAgICByZXF1aXJlZCAvPlxuICAgICAgICAgICAgICA8L0lucHV0R3JvdXA+XG4gICAgICAgICAgICA8L0Zvcm1Hcm91cD5cbiAgICAgICAgICA8L2Zvcm0+XG4gICAgICAgIDwvTW9kYWwuQm9keT5cbiAgICAgIDwvTW9kYWw+XG4gICAgKVxuICB9XG59XG5cbkFnZW50QXV0aGVudGljYXRpb24ucHJvcFR5cGVzID0ge1xuICBoYW5kbGVTdWJtaXQ6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGhhbmRsZUhpZGU6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBzaG93OiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcblxuICBpbnRsOiBSZWFjdC5Qcm9wVHlwZXMub2JqZWN0XG59XG5cbkFnZW50QXV0aGVudGljYXRpb24uZGVmYXVsdFByb3BzID0ge1xuICBoYW5kbGVIaWRlOiAoKSA9PiB7fSxcbiAgZm9ybWF0TWVzc2FnZTogKCkgPT4ge30sXG4gIHNob3c6IHRydWVcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5qZWN0SW50bChBZ2VudEF1dGhlbnRpY2F0aW9uKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4J1xuaW1wb3J0IHsgaW5qZWN0SW50bCwgaW50bFNoYXBlIH0gZnJvbSAncmVhY3QtaW50bCdcbmltcG9ydCBSZW1vdGUgZnJvbSAnLi4vY29tbW9uL2xpYi9yZW1vdGUnXG5cbmltcG9ydCB7IGdldFNlY3Rpb24sIGdldEFjdGl2ZVNlY3Rpb24sIGdldEZpcnN0QWN0aXZlIH0gZnJvbSAnLi4vcmVkdWNlcnMvYXBwJ1xuaW1wb3J0IHsgc2VuZEFnZW50UGFzc3dvcmQgfSBmcm9tICcuLi9hY3Rpb25zL2FnZW50J1xuaW1wb3J0IHsgZmV0Y2hSZW1vdGVTZWN0aW9uLCByZXNldEZpcnN0QWN0aXZlU2VjdGlvbiwgaW5mb3JtUmVtb3RlU2VjdGlvbiB9XG4gIGZyb20gJy4uL2FjdGlvbnMvYXBwJ1xuXG5pbXBvcnQgYmluZFJlc3BvbnNlcyBmcm9tICcuLi9yZXNwb25zZXMnXG5cbi8vIENvbXBvbmVudHNcbmltcG9ydCBIZWFkZXIgZnJvbSAnLi4vY29tcG9uZW50cy9oZWFkZXInXG5pbXBvcnQgSW5mb1BhbmVsIGZyb20gJy4uL2NvbXBvbmVudHMvaW5mby1wYW5lbCdcbmltcG9ydCBBZ2VudEF1dGhlbnRpY2F0aW9uIGZyb20gJy4uL2NvbXBvbmVudHMvYWdlbnQtYXV0aGVudGljYXRpb24nXG5pbXBvcnQgU2VjdGlvbiwgeyBQZXJzaXN0ZW50U2VjdGlvbnMgfSBmcm9tICcuLi9jb21wb25lbnRzL3NlY3Rpb24nXG5cbmNsYXNzIEFwcCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgLy8gQmluZCBhbGwgdGhlIHJlbW90ZSBldmVudCBoYW5kbGVycyAvL1xuICAgIGNvbnN0IHsgZGlzcGF0Y2gsIGludGwgfSA9IHRoaXMucHJvcHNcbiAgICBiaW5kUmVzcG9uc2VzKFJlbW90ZSwgZGlzcGF0Y2gsIGludGwpXG5cbiAgICB0aGlzLmhhbmRsZURpc2Nvbm5lY3RDbGljayA9ICgpID0+IHtcbiAgICAgIGlmIChSZW1vdGUuaXNDb25uZWN0ZWQpIHtcbiAgICAgICAgUmVtb3RlLmNsb3NlKClcbiAgICAgIH1cbiAgICAgIHNldFRpbWVvdXQocHJvcHMuaGFuZGxlRGlzY29ubmVjdENsaWNrLCAxMDApXG4gICAgfVxuXG4gICAgdGhpcy5yZWNvbm5lY3QgPSBSZW1vdGUucmVjb25uZWN0LmJpbmQoUmVtb3RlKVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBzaG93SGVhZGVyLCBzZWxlY3RlZFNlY3Rpb24sIGhhbmRsZUFnZW50UGFzc1N1Ym1pdCxcbiAgICAgIGFsbG93U2VjdGlvbiwgYmxvY2tSZXF1ZXN0U2VjdGlvbiwgZmV0Y2hpbmdSZW1vdGVTZWN0aW9uLFxuICAgICAgaW5mb3JtUmVtb3RlU2VjdGlvbixcbiAgICAgIGZldGNoU2VjdGlvbiwgaW5mb3JtU2VjdGlvbiwgZmlyc3RBY3RpdmVTZWN0aW9uLCBoYW5kbGVGaXJzdEFjdGl2ZVNlY3Rpb24sXG4gICAgICAvLyBDb25uZWN0aW9uXG4gICAgICBpc1Vua25vd24sIGlzQnVzeSwgaXNDb25uZWN0aW5nLCBpc0Rpc2Nvbm5lY3RpbmcsIGlzQ29ubmVjdGVkLFxuICAgICAgY29ubmVjdGlvbkVycm9yLCBjb25uZWN0aW9uRXJyb3JDb2RlLCBjb25uZWN0aW9uRXJyb3JNZXNzYWdlLFxuICAgICAgLy8gQXV0aGVudGljYXRpb25cbiAgICAgIGlzQXV0aGVudGljYXRpbmcsIGlzQXV0aGVudGljYXRlZCxcbiAgICAgIGF1dGhlbnRpY2F0aW9uRXJyb3IsIGF1dGhlbnRpY2F0aW9uRXJyb3JDb2RlLCBhdXRoZW50aWNhdGlvbkVycm9yTWVzc2FnZSxcbiAgICAgIC8vIEFnZW50IGluZm9cbiAgICAgIGFnZW50SUQsIGFnZW50SG9zdG5hbWVcbiAgICB9ID0gdGhpcy5wcm9wc1xuXG4gICAgY29uc3QgaGFuZGxlQWxsb3dTZWN0aW9uQ2xpY2sgPSBpbmZvcm1SZW1vdGVTZWN0aW9uXG4gICAgICA/IGluZm9ybVNlY3Rpb25cbiAgICAgIDogZmV0Y2hTZWN0aW9uXG5cbiAgICBjb25zdCBjb250YWluZXJTdHlsZSA9IHtcbiAgICAgIHBhZGRpbmdUb3A6IHNob3dIZWFkZXIgPyAnNzBweCcgOiAnMjBweCdcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBpZD0nZWhvcnVzLWFwcCc+XG4gICAgICAgIHsgc2hvd0hlYWRlciAmJlxuICAgICAgICAgIDxIZWFkZXJcbiAgICAgICAgICAgIGFnZW50SUQ9e2FnZW50SUR9XG4gICAgICAgICAgICBhZ2VudEhvc3RuYW1lPXthZ2VudEhvc3RuYW1lfVxuICAgICAgICAgICAgaGFuZGxlRGlzY29ubmVjdENsaWNrPXt0aGlzLmhhbmRsZURpc2Nvbm5lY3RDbGlja30gLz5cbiAgICAgICAgfVxuICAgICAgICA8ZGl2XG4gICAgICAgICAgaWQ9J2Vob3J1cy1jb250YWluZXInXG4gICAgICAgICAgY2xhc3NOYW1lPSdjb250YWluZXItZmx1aWQnXG4gICAgICAgICAgc3R5bGU9e2NvbnRhaW5lclN0eWxlfT5cbiAgICAgICAgICB7IGlzQ29ubmVjdGVkICYmIGlzQXV0aGVudGljYXRlZCAmJlxuICAgICAgICAgICAgPFNlY3Rpb25cbiAgICAgICAgICAgICAgc2VsZWN0ZWQ9e3NlbGVjdGVkU2VjdGlvbn1cbiAgICAgICAgICAgICAgYWxsb3c9e2FsbG93U2VjdGlvbn1cbiAgICAgICAgICAgICAgYmxvY2tSZXF1ZXN0PXtibG9ja1JlcXVlc3RTZWN0aW9ufVxuICAgICAgICAgICAgICBoYW5kbGVBbGxvd1NlY3Rpb25DbGljaz17aGFuZGxlQWxsb3dTZWN0aW9uQ2xpY2t9XG4gICAgICAgICAgICAgIGZldGNoaW5nUmVtb3RlPXtmZXRjaGluZ1JlbW90ZVNlY3Rpb259XG4gICAgICAgICAgICAgIGZpcnN0QWN0aXZlPXtmaXJzdEFjdGl2ZVNlY3Rpb259XG4gICAgICAgICAgICAgIHJlc2V0Rmlyc3RBY3RpdmU9e2hhbmRsZUZpcnN0QWN0aXZlU2VjdGlvbn0gLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgeyBpc0Nvbm5lY3RlZCAmJiBpc0F1dGhlbnRpY2F0ZWQgJiZcbiAgICAgICAgICAgIDxQZXJzaXN0ZW50U2VjdGlvbnMgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgeyAoIWlzQ29ubmVjdGVkIHx8ICFpc0F1dGhlbnRpY2F0ZWQpICYmXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8SW5mb1BhbmVsXG4gICAgICAgICAgICAgICAgaXNVbmtub3duPXtpc1Vua25vd259XG4gICAgICAgICAgICAgICAgaXNCdXN5PXtpc0J1c3l9XG4gICAgICAgICAgICAgICAgaXNDb25uZWN0aW5nPXtpc0Nvbm5lY3Rpbmd9XG4gICAgICAgICAgICAgICAgaXNEaXNjb25uZWN0aW5nPXtpc0Rpc2Nvbm5lY3Rpbmd9XG4gICAgICAgICAgICAgICAgaXNDb25uZWN0ZWQ9e2lzQ29ubmVjdGVkfVxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25FcnJvcj17Y29ubmVjdGlvbkVycm9yfVxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25FcnJvckNvZGU9e2Nvbm5lY3Rpb25FcnJvckNvZGV9XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbkVycm9yTWVzc2FnZT17Y29ubmVjdGlvbkVycm9yTWVzc2FnZX1cbiAgICAgICAgICAgICAgICBpc0F1dGhlbnRpY2F0aW5nPXtpc0F1dGhlbnRpY2F0aW5nfVxuICAgICAgICAgICAgICAgIGlzQXV0aGVudGljYXRlZD17aXNBdXRoZW50aWNhdGVkfVxuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uRXJyb3I9e2F1dGhlbnRpY2F0aW9uRXJyb3J9XG4gICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb25FcnJvckNvZGU9e2F1dGhlbnRpY2F0aW9uRXJyb3JDb2RlfVxuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uRXJyb3JNZXNzYWdlPXthdXRoZW50aWNhdGlvbkVycm9yTWVzc2FnZX1cbiAgICAgICAgICAgICAgICBoYW5kbGVDb25uZWN0aW9uPXt0aGlzLnJlY29ubmVjdH1cbiAgICAgICAgICAgICAgICB0aW1lcj17NjB9IC8+XG4gICAgICAgICAgICAgIHsgaXNDb25uZWN0ZWQgJiYgIWlzQXV0aGVudGljYXRpbmcgJiYgIWlzQXV0aGVudGljYXRlZCAmJlxuICAgICAgICAgICAgICAgIDxBZ2VudEF1dGhlbnRpY2F0aW9uIGhhbmRsZVN1Ym1pdD17aGFuZGxlQWdlbnRQYXNzU3VibWl0fSAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIC8vIEluaXQgV2ViU29ja2V0IGNvbm5lY3Rpb25cbiAgICBpZiAoUmVtb3RlLmFnZW50SUQpIHtcbiAgICAgIHNldFRpbWVvdXQoUmVtb3RlLmNvbm5lY3QuYmluZChSZW1vdGUpLCAxKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgYWdlbnQgSUQnKVxuICAgIH1cbiAgfVxufVxuXG5BcHAucHJvcFR5cGVzID0ge1xuICBzaG93SGVhZGVyOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgc2VsZWN0ZWRTZWN0aW9uOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBhbGxvd1NlY3Rpb246IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBibG9ja1JlcXVlc3RTZWN0aW9uOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgZmV0Y2hpbmdSZW1vdGVTZWN0aW9uOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgZmlyc3RBY3RpdmVTZWN0aW9uOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBpbmZvcm1SZW1vdGVTZWN0aW9uOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaGFuZGxlRmlyc3RBY3RpdmVTZWN0aW9uOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgaGFuZGxlRGlzY29ubmVjdENsaWNrOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgaGFuZGxlQWdlbnRQYXNzU3VibWl0OiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBmZXRjaFNlY3Rpb246IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBpbmZvcm1TZWN0aW9uOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgLy8gQ29ubmVjdGlvblxuICBpc1Vua25vd246IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBpc0J1c3k6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBpc0Nvbm5lY3Rpbmc6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBpc0Rpc2Nvbm5lY3Rpbmc6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBpc0Nvbm5lY3RlZDogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGNvbm5lY3Rpb25FcnJvcjogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGNvbm5lY3Rpb25FcnJvckNvZGU6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIGNvbm5lY3Rpb25FcnJvck1lc3NhZ2U6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIC8vIEF1dGhlbnRpY2F0aW9uXG4gIGlzQXV0aGVudGljYXRpbmc6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBpc0F1dGhlbnRpY2F0ZWQ6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBhdXRoZW50aWNhdGlvbkVycm9yOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgYXV0aGVudGljYXRpb25FcnJvckNvZGU6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIGF1dGhlbnRpY2F0aW9uRXJyb3JNZXNzYWdlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICAvLyBBZ2VudCBpbmZvXG4gIGFnZW50SUQ6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGFnZW50SG9zdG5hbWU6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIC8vIFJlZHV4IGFuZCBJbnRsIHJlZmVyZW5jZXNcbiAgZGlzcGF0Y2g6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGludGw6IGludGxTaGFwZS5pc1JlcXVpcmVkXG59XG5cbkFwcC5kZWZhdWx0UHJvcHMgPSB7XG4gIHNob3dIZWFkZXI6IHRydWUsXG4gIGFsbG93U2VjdGlvbjogZmFsc2UsXG4gIGJsb2NrUmVxdWVzdDogZmFsc2UsXG4gIGZldGNoaW5nUmVtb3RlOiBmYWxzZSxcbiAgaW5mb3JtUmVtb3RlU2VjdGlvbjogZmFsc2UsXG4gIC8vIENvbm5lY3Rpb25cbiAgaXNVbmtub3duOiBmYWxzZSxcbiAgaXNCdXN5OiBmYWxzZSxcbiAgaXNDb25uZWN0aW5nOiBmYWxzZSxcbiAgaXNEaXNjb25uZWN0aW5nOiBmYWxzZSxcbiAgaXNDb25uZWN0ZWQ6IGZhbHNlLFxuICBjb25uZWN0aW9uRXJyb3I6IGZhbHNlLFxuICBjb25uZWN0aW9uRXJyb3JDb2RlOiBudWxsLFxuICBjb25uZWN0aW9uRXJyb3JNZXNzYWdlOiBudWxsLFxuICAvLyBBdXRoZW50aWNhdGlvblxuICBpc0F1dGhlbnRpY2F0aW5nOiBmYWxzZSxcbiAgaXNBdXRoZW50aWNhdGVkOiBmYWxzZSxcbiAgYXV0aGVudGljYXRpb25FcnJvcjogZmFsc2UsXG4gIGF1dGhlbnRpY2F0aW9uRXJyb3JDb2RlOiBudWxsLFxuICBhdXRoZW50aWNhdGlvbkVycm9yTWVzc2FnZTogbnVsbCxcbiAgLy8gQWdlbnQgaW5mb1xuICBhZ2VudElEOiAnJyxcbiAgYWdlbnRIb3N0bmFtZTogJydcbn1cblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHN0YXRlLCBwcm9wcykgPT4ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gIGNvbnN0IHBlcmlvZCA9IDYwMDAwMCAvLyBUZW4gbWludXRlcyBpbiBtc1xuICBjb25zdCBpc1Vua25vd24gPSBzdGF0ZS5hcHAuYWdlbnRMYXN0Q29udGFjdCAmJlxuICAgIChub3cgLSBzdGF0ZS5hcHAuYWdlbnRMYXN0Q29udGFjdCA+IHBlcmlvZClcblxuICBjb25zdCBuZXdQcm9wcyA9IHtcbiAgICBzaG93SGVhZGVyOiBzdGF0ZS5hcHAuc2hvd0hlYWRlcixcbiAgICBoYW5kbGVEaXNjb25uZWN0Q2xpY2s6IHN0YXRlLmFwcC5oYW5kbGVEaXNjb25uZWN0LFxuICAgIC8vIENvbm5lY3Rpb25cbiAgICBpc1Vua25vd24sXG4gICAgaXNCdXN5OiBzdGF0ZS5hcHAuYWdlbnRJc0J1c3ksXG4gICAgaXNDb25uZWN0aW5nOiBzdGF0ZS5hZ2VudC5pc0Nvbm5lY3RpbmcsXG4gICAgaXNEaXNjb25uZWN0aW5nOiBzdGF0ZS5hZ2VudC5pc0Rpc2Nvbm5lY3RpbmcsXG4gICAgaXNDb25uZWN0ZWQ6IHN0YXRlLmFnZW50LmlzQ29ubmVjdGVkLFxuICAgIGNvbm5lY3Rpb25FcnJvcjogc3RhdGUuYWdlbnQuY29ubmVjdGlvbkVycm9yLFxuICAgIGNvbm5lY3Rpb25FcnJvckNvZGU6IHN0YXRlLmFnZW50LmNvbm5lY3Rpb25FcnJvckNvZGUsXG4gICAgY29ubmVjdGlvbkVycm9yTWVzc2FnZTogc3RhdGUuYWdlbnQuY29ubmVjdGlvbkVycm9yTWVzc2FnZSxcbiAgICAvLyBBdXRoZW50aWNhdGlvblxuICAgIGlzQXV0aGVudGljYXRpbmc6IHN0YXRlLmFnZW50LmlzQXV0aGVudGljYXRpbmcsXG4gICAgaXNBdXRoZW50aWNhdGVkOiBzdGF0ZS5hZ2VudC5pc0F1dGhlbnRpY2F0ZWQsXG4gICAgYXV0aGVudGljYXRpb25FcnJvcjogc3RhdGUuYWdlbnQuYXV0aGVudGljYXRpb25FcnJvcixcbiAgICBhdXRoZW50aWNhdGlvbkVycm9yQ29kZTogc3RhdGUuYWdlbnQuYXV0aGVudGljYXRpb25FcnJvckNvZGUsXG4gICAgYXV0aGVudGljYXRpb25FcnJvck1lc3NhZ2U6IHN0YXRlLmFnZW50LmF1dGhlbnRpY2F0aW9uRXJyb3JNZXNzYWdlLFxuICAgIC8vIEFnZW50IGluZm9cbiAgICBhZ2VudElEOiBzdGF0ZS5hZ2VudC5pZCxcbiAgICBhZ2VudEhvc3RuYW1lOiBzdGF0ZS5hZ2VudC5ob3N0bmFtZVxuICB9XG4gIGNvbnN0IGFjdGl2ZVNlY3Rpb24gPSBnZXRBY3RpdmVTZWN0aW9uKHN0YXRlLmFwcClcbiAgaWYgKGFjdGl2ZVNlY3Rpb24pIHtcbiAgICBuZXdQcm9wcy5zZWxlY3RlZFNlY3Rpb24gPSBhY3RpdmVTZWN0aW9uXG4gICAgY29uc3Qgc2VjdGlvblByb3BzID0gZ2V0U2VjdGlvbihzdGF0ZS5hcHAsIGFjdGl2ZVNlY3Rpb24pXG4gICAgbmV3UHJvcHMuYWxsb3dTZWN0aW9uID0gc2VjdGlvblByb3BzLmFsbG93XG4gICAgbmV3UHJvcHMuYmxvY2tSZXF1ZXN0U2VjdGlvbiA9IHNlY3Rpb25Qcm9wcy5ibG9ja1JlcXVlc3RcbiAgICBuZXdQcm9wcy5pbmZvcm1SZW1vdGVTZWN0aW9uID0gc2VjdGlvblByb3BzLmluZm9ybVxuICAgIG5ld1Byb3BzLmZldGNoaW5nUmVtb3RlU2VjdGlvbiA9IHNlY3Rpb25Qcm9wcy5mZXRjaGluZ1JlbW90ZVxuICB9XG4gIGNvbnN0IGZpcnN0U2VjdGlvbiA9IGdldEZpcnN0QWN0aXZlKHN0YXRlLmFwcClcbiAgaWYgKGZpcnN0U2VjdGlvbikge1xuICAgIG5ld1Byb3BzLmZpcnN0QWN0aXZlU2VjdGlvbiA9IGZpcnN0U2VjdGlvblxuICB9XG5cbiAgcmV0dXJuIG5ld1Byb3BzXG59XG5jb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSAoZGlzcGF0Y2gsIHByb3BzKSA9PiB7XG4gIHJldHVybiB7XG4gICAgZGlzcGF0Y2gsXG4gICAgaGFuZGxlQWdlbnRQYXNzU3VibWl0OiAocGFzcykgPT4gZGlzcGF0Y2goc2VuZEFnZW50UGFzc3dvcmQocGFzcykpLFxuICAgIGZldGNoU2VjdGlvbjogKHNlY3Rpb24pID0+IGRpc3BhdGNoKGZldGNoUmVtb3RlU2VjdGlvbihzZWN0aW9uKSksXG4gICAgaW5mb3JtU2VjdGlvbjogKHNlY3Rpb24pID0+IGRpc3BhdGNoKGluZm9ybVJlbW90ZVNlY3Rpb24oc2VjdGlvbikpLFxuICAgIGhhbmRsZUZpcnN0QWN0aXZlU2VjdGlvbjogKHNlY3Rpb24pID0+IGRpc3BhdGNoKHJlc2V0Rmlyc3RBY3RpdmVTZWN0aW9uKCkpXG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMpKGluamVjdEludGwoQXBwKSlcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7XG4gIEJ1dHRvbiwgQnV0dG9uR3JvdXAsIEJ1dHRvblRvb2xiYXIsIEdseXBoaWNvbiwgT3ZlcmxheVRyaWdnZXIsIFRvb2x0aXBcbn0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuaW1wb3J0IHsgZGVmaW5lTWVzc2FnZXMsIEZvcm1hdHRlZE1lc3NhZ2UgfSBmcm9tICdyZWFjdC1pbnRsJ1xuaW1wb3J0IERpc3BsYXlLZXlzQnV0dG9uIGZyb20gJy4va2V5cy1idXR0b24nXG5pbXBvcnQgS2V5Ym9hcmRCdXR0b24gZnJvbSAnLi9rZXlib2FyZC1idXR0b24nXG5cbi8vIE1lc3NhZ2VzIGRlZmluaXRpb25cbmNvbnN0IG1lc3NhZ2VzID0gZGVmaW5lTWVzc2FnZXMoe1xuICBkaXNjb25uZWN0OiB7XG4gICAgaWQ6ICdkaXNjb25uZWN0JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0Rpc2Nvbm5lY3QnXG4gIH0sXG4gIGNvbm5lY3Q6IHtcbiAgICBpZDogJ2Nvbm5lY3QnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnQ29ubmVjdCdcbiAgfSxcbiAgZnVsbHNjcmVlbjoge1xuICAgIGlkOiAnZnVsbHNjcmVlbicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdGdWxsc2NyZWVuJ1xuICB9LFxuICBleGl0RnVsbHNjcmVlbjoge1xuICAgIGlkOiAnZXhpdEZ1bGxzY3JlZW4nLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRXhpdCBmdWxsc2NyZWVuJ1xuICB9LFxuICBjbGlwYm9hcmQ6IHtcbiAgICBpZDogJ2NsaXBib2FyZCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdDbGlwYm9hcmQnXG4gIH0sXG4gIHRydWVDb2xvcjoge1xuICAgIGlkOiAndHJ1ZUNvbG9yJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RydWUgQ29sb3InXG4gIH0sXG4gIGxvY2FsQ3Vyc29yOiB7XG4gICAgaWQ6ICdsb2NhbEN1cnNvcicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdMb2NhbCBDdXJzb3InLFxuICAgIGRlc2NyaXB0aW9uOiAnRGlzcGxheSB0aGUgbG9jYWwgbW91c2Ugb24gcmVtb3RlIFZOQydcbiAgfSxcbiAgc2hhcmVkOiB7XG4gICAgaWQ6ICdzaGFyZWQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnU2hhcmVkJ1xuICB9LFxuICB2aWV3T25seToge1xuICAgIGlkOiAndmlld09ubHknLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVmlldyBPbmx5JyxcbiAgICBkZXNjcmlwdGlvbjogJ09ubHkgZGlzcGxheSByZW1vdGUgZGVza3RvcCBhbmQgY2Fubm90IGludGVyYWN0IHdpdGggaXQnXG4gIH0sXG4gIGZ1bGxNZW51OiB7XG4gICAgaWQ6ICdmdWxsTWVudScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdGdWxsIE1lbnUnLFxuICAgIGRlc2NyaXB0aW9uOiAnRGlzcGxheSBhbGwgb3B0aW9ucyBpbiBWTkMgbWVudSdcbiAgfSxcbiAgc21hbGxNZW51OiB7XG4gICAgaWQ6ICdzbWFsbE1lbnUnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnU21hbGwgTWVudScsXG4gICAgZGVzY3JpcHRpb246ICdEaXNwbGF5IGxlc3Mgb3B0aW9ucyBpbiBWTkMgbWVudSdcbiAgfVxufSlcblxuY2xhc3MgRGlzcGxheUJ1dHRvbnMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIHRoaXMuaGFuZGxlQ29ubmVjdENsaWNrID0gdGhpcy5wcm9wcy5oYW5kbGVDb25uZWN0Q2xpY2tcbiAgICAgID8gKGV2ZW50KSA9PiB0aGlzLnByb3BzLmhhbmRsZUNvbm5lY3RDbGljaygpXG4gICAgICA6ICgpID0+IHt9XG4gICAgdGhpcy5oYW5kbGVEaXNjb25uZWN0Q2xpY2sgPSB0aGlzLnByb3BzLmhhbmRsZURpc2Nvbm5lY3RDbGlja1xuICAgICAgPyAoZXZlbnQpID0+IHRoaXMucHJvcHMuaGFuZGxlRGlzY29ubmVjdENsaWNrKClcbiAgICAgIDogKCkgPT4ge31cbiAgICB0aGlzLmhhbmRsZUZ1bGxTY3JlZW5DbGljayA9IHRoaXMucHJvcHMuaGFuZGxlRnVsbFNjcmVlbkNsaWNrXG4gICAgICA/IChldmVudCkgPT4gdGhpcy5wcm9wcy5oYW5kbGVGdWxsU2NyZWVuQ2xpY2soKVxuICAgICAgOiAoKSA9PiB7fVxuICAgIHRoaXMuaGFuZGxlVHJ1ZUNvbG9yQ2xpY2sgPSB0aGlzLnByb3BzLmhhbmRsZVRydWVDb2xvckNsaWNrXG4gICAgICA/ICh2YWx1ZSkgPT4gKGV2ZW50KSA9PiB0aGlzLnByb3BzLmhhbmRsZVRydWVDb2xvckNsaWNrKHZhbHVlKVxuICAgICAgOiAoKSA9PiB7fVxuICAgIHRoaXMuaGFuZGxlTG9jYWxDdXJzb3JDbGljayA9IHRoaXMucHJvcHMuaGFuZGxlTG9jYWxDdXJzb3JDbGlja1xuICAgICAgPyAodmFsdWUpID0+IChldmVudCkgPT4gdGhpcy5wcm9wcy5oYW5kbGVMb2NhbEN1cnNvckNsaWNrKHZhbHVlKVxuICAgICAgOiAoKSA9PiB7fVxuICAgIHRoaXMuaGFuZGxlU2hhcmVkQ2xpY2sgPSB0aGlzLnByb3BzLmhhbmRsZVNoYXJlZENsaWNrXG4gICAgICA/ICh2YWx1ZSkgPT4gKGV2ZW50KSA9PiB0aGlzLnByb3BzLmhhbmRsZVNoYXJlZENsaWNrKHZhbHVlKVxuICAgICAgOiAoKSA9PiB7fVxuICAgIHRoaXMuaGFuZGxlVmlld09ubHlDbGljayA9IHRoaXMucHJvcHMuaGFuZGxlVmlld09ubHlDbGlja1xuICAgICAgPyAodmFsdWUpID0+IChldmVudCkgPT4gdGhpcy5wcm9wcy5oYW5kbGVWaWV3T25seUNsaWNrKHZhbHVlKVxuICAgICAgOiAoKSA9PiB7fVxuICAgIHRoaXMuaGFuZGxlQ2xpcGJvYXJkQ2xpY2sgPSB0aGlzLnByb3BzLmhhbmRsZUNsaXBib2FyZENsaWNrXG4gICAgICA/IChldmVudCkgPT4gdGhpcy5wcm9wcy5oYW5kbGVDbGlwYm9hcmRDbGljaygpXG4gICAgICA6ICgpID0+IHt9XG4gICAgdGhpcy5oYW5kbGVQYW5lbFNpemVDbGljayA9IHRoaXMucHJvcHMuaGFuZGxlUGFuZWxTaXplQ2xpY2tcbiAgICAgID8gKGV2ZW50KSA9PiB0aGlzLnByb3BzLmhhbmRsZVBhbmVsU2l6ZUNsaWNrKClcbiAgICAgIDogKCkgPT4ge31cbiAgICB0aGlzLnNlbmRLZXkgPSB0aGlzLnByb3BzLnNlbmRLZXlcbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaXNNb2JpbGUsIGlzQ29ubmVjdGluZywgaXNDb25uZWN0ZWQsIGlzRnVsbHNjcmVlbiwgc2hvd0Z1bGxzY3JlZW5CdG4sXG4gICAgICB0cnVlQ29sb3IsIGxvY2FsQ3Vyc29yLCBzaGFyZWQsIHZpZXdPbmx5LCBjbGlwYm9hcmQsIHRvb2x0aXBQbGFjZW1lbnQsXG4gICAgICB0b2dnbGVQYW5lbFNpemUsIHBhbmVsU21hbGwsIGNoaWxkcmVuLFxuICAgICAgb25WaXJ0dWFsS2V5Ym9hcmRVc2VkXG4gICAgfSA9IHRoaXMucHJvcHNcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGlkPSdkaXNwbGF5LWJ1dHRvbnMnPlxuICAgICAgICA8QnV0dG9uVG9vbGJhcj5cbiAgICAgICAgICB7IChpc0Nvbm5lY3RlZCB8fCBpc0Nvbm5lY3RpbmcpICYmXG4gICAgICAgICAgICA8T3ZlcmxheVRyaWdnZXJcbiAgICAgICAgICAgICAgcGxhY2VtZW50PXt0b29sdGlwUGxhY2VtZW50fVxuICAgICAgICAgICAgICBvdmVybGF5PXtcbiAgICAgICAgICAgICAgICA8VG9vbHRpcCBpZD0nZGlzcC10b29sdGlwLWRpc2Nvbm5lY3QnPlxuICAgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLmRpc2Nvbm5lY3R9IC8+XG4gICAgICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgICAgICB9PlxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdwdWxsLXJpZ2h0J1xuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlRGlzY29ubmVjdENsaWNrfT5cbiAgICAgICAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdsb2ctb3V0JyAvPlxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgIDwvT3ZlcmxheVRyaWdnZXI+XG4gICAgICAgICAgfVxuICAgICAgICAgIHsgKCFpc0Nvbm5lY3RlZCAmJiAhaXNDb25uZWN0aW5nKSAmJlxuICAgICAgICAgICAgPE92ZXJsYXlUcmlnZ2VyXG4gICAgICAgICAgICAgIHBsYWNlbWVudD17dG9vbHRpcFBsYWNlbWVudH1cbiAgICAgICAgICAgICAgb3ZlcmxheT17XG4gICAgICAgICAgICAgICAgPFRvb2x0aXAgaWQ9J2Rpc3AtdG9vbHRpcC1jb25uZWN0Jz5cbiAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5jb25uZWN0fSAvPlxuICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgfT5cbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ncHVsbC1yaWdodCdcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZUNvbm5lY3RDbGlja30+XG4gICAgICAgICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD0nbG9nLWluJyAvPlxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgIDwvT3ZlcmxheVRyaWdnZXI+XG4gICAgICAgICAgfVxuICAgICAgICAgIHsgaXNDb25uZWN0ZWQgJiYgc2hvd0Z1bGxzY3JlZW5CdG4gJiYgaXNGdWxsc2NyZWVuICYmICFwYW5lbFNtYWxsICYmXG4gICAgICAgICAgICA8T3ZlcmxheVRyaWdnZXJcbiAgICAgICAgICAgICAgcGxhY2VtZW50PXt0b29sdGlwUGxhY2VtZW50fVxuICAgICAgICAgICAgICBvdmVybGF5PXtcbiAgICAgICAgICAgICAgICA8VG9vbHRpcCBpZD0nZGlzcC10b29sdGlwLWV4aXQtZnVsbHNjcmVlbic+XG4gICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMuZXhpdEZ1bGxzY3JlZW59IC8+XG4gICAgICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgICAgICB9PlxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdwdWxsLXJpZ2h0J1xuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlRnVsbFNjcmVlbkNsaWNrfT5cbiAgICAgICAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdyZXNpemUtc21hbGwnIC8+XG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgPC9PdmVybGF5VHJpZ2dlcj5cbiAgICAgICAgICB9XG4gICAgICAgICAgeyBpc0Nvbm5lY3RlZCAmJiBzaG93RnVsbHNjcmVlbkJ0biAmJiAhaXNGdWxsc2NyZWVuICYmICFwYW5lbFNtYWxsICYmXG4gICAgICAgICAgICA8T3ZlcmxheVRyaWdnZXJcbiAgICAgICAgICAgICAgcGxhY2VtZW50PXt0b29sdGlwUGxhY2VtZW50fVxuICAgICAgICAgICAgICBvdmVybGF5PXtcbiAgICAgICAgICAgICAgICA8VG9vbHRpcCBpZD0nZGlzcC10b29sdGlwLWZ1bGxzY3JlZW4nPlxuICAgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLmZ1bGxzY3JlZW59IC8+XG4gICAgICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgICAgICB9PlxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdwdWxsLXJpZ2h0J1xuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlRnVsbFNjcmVlbkNsaWNrfT5cbiAgICAgICAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdyZXNpemUtZnVsbCcgLz5cbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICA8L092ZXJsYXlUcmlnZ2VyPlxuICAgICAgICAgIH1cbiAgICAgICAgICB7IGlzQ29ubmVjdGVkICYmICFwYW5lbFNtYWxsICYmXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncHVsbC1yaWdodCBidG4tZ3JvdXAnPlxuICAgICAgICAgICAgICA8RGlzcGxheUtleXNCdXR0b24gc2VuZEtleT17dGhpcy5zZW5kS2V5fSAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICAgIHsgaXNDb25uZWN0ZWQgJiYgaXNNb2JpbGUgJiYgIXBhbmVsU21hbGwgJiZcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdwdWxsLXJpZ2h0IGJ0bi1ncm91cCc+XG4gICAgICAgICAgICAgIDxLZXlib2FyZEJ1dHRvbiBvblZpcnR1YWxLZXlib2FyZFVzZWQ9e29uVmlydHVhbEtleWJvYXJkVXNlZH0gLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgICB7IGlzQ29ubmVjdGVkICYmIGNsaXBib2FyZCAmJiAhcGFuZWxTbWFsbCAmJlxuICAgICAgICAgICAgPE92ZXJsYXlUcmlnZ2VyXG4gICAgICAgICAgICAgIHBsYWNlbWVudD17dG9vbHRpcFBsYWNlbWVudH1cbiAgICAgICAgICAgICAgb3ZlcmxheT17XG4gICAgICAgICAgICAgICAgPFRvb2x0aXAgaWQ9J2Rpc3AtdG9vbHRpcC1jbGlwYm9hcmQnPlxuICAgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLmNsaXBib2FyZH0gLz5cbiAgICAgICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICAgIH0+XG4gICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9J3B1bGwtcmlnaHQnXG4gICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVDbGlwYm9hcmRDbGlja30+XG4gICAgICAgICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD0nY29weScgLz5cbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICA8L092ZXJsYXlUcmlnZ2VyPlxuICAgICAgICAgIH1cbiAgICAgICAgICB7ICFpc0Nvbm5lY3RlZCAmJlxuICAgICAgICAgICAgPEJ1dHRvbkdyb3VwIGNsYXNzTmFtZT0ncHVsbC1yaWdodCc+XG4gICAgICAgICAgICAgIDxPdmVybGF5VHJpZ2dlclxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD17dG9vbHRpcFBsYWNlbWVudH1cbiAgICAgICAgICAgICAgICBvdmVybGF5PXtcbiAgICAgICAgICAgICAgICAgIDxUb29sdGlwIGlkPSdkaXNwLXRvb2x0aXAtdHJ1ZS1jb2xvcic+XG4gICAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy50cnVlQ29sb3J9IC8+XG4gICAgICAgICAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgICAgICAgICAgfT5cbiAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17aXNDb25uZWN0aW5nIHx8IGlzQ29ubmVjdGVkfVxuICAgICAgICAgICAgICAgICAgYWN0aXZlPXt0cnVlQ29sb3J9XG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZVRydWVDb2xvckNsaWNrKCF0cnVlQ29sb3IpfT5cbiAgICAgICAgICAgICAgICAgIDxHbHlwaGljb24gZ2x5cGg9J3RpbnQnIC8+XG4gICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgIDwvT3ZlcmxheVRyaWdnZXI+XG4gICAgICAgICAgICAgIDxPdmVybGF5VHJpZ2dlclxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD17dG9vbHRpcFBsYWNlbWVudH1cbiAgICAgICAgICAgICAgICBvdmVybGF5PXtcbiAgICAgICAgICAgICAgICAgIDxUb29sdGlwIGlkPSdkaXNwLXRvb2x0aXAtbG9jYWwtY3Vyc29yJz5cbiAgICAgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLmxvY2FsQ3Vyc29yfSAvPlxuICAgICAgICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgICAgICAgIH0+XG4gICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzQ29ubmVjdGluZyB8fCBpc0Nvbm5lY3RlZH1cbiAgICAgICAgICAgICAgICAgIGFjdGl2ZT17bG9jYWxDdXJzb3J9XG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZUxvY2FsQ3Vyc29yQ2xpY2soIWxvY2FsQ3Vyc29yKX0+XG4gICAgICAgICAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdhc3RlcmlzaycgLz5cbiAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgPC9PdmVybGF5VHJpZ2dlcj5cbiAgICAgICAgICAgICAgPE92ZXJsYXlUcmlnZ2VyXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PXt0b29sdGlwUGxhY2VtZW50fVxuICAgICAgICAgICAgICAgIG92ZXJsYXk9e1xuICAgICAgICAgICAgICAgICAgPFRvb2x0aXAgaWQ9J2Rpc3AtdG9vbHRpcC1zaGFyZWQnPlxuICAgICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMuc2hhcmVkfSAvPlxuICAgICAgICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgICAgICAgIH0+XG4gICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzQ29ubmVjdGluZyB8fCBpc0Nvbm5lY3RlZH1cbiAgICAgICAgICAgICAgICAgIGFjdGl2ZT17c2hhcmVkfVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVTaGFyZWRDbGljayghc2hhcmVkKX0+XG4gICAgICAgICAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdzaGFyZS1hbHQnIC8+XG4gICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgIDwvT3ZlcmxheVRyaWdnZXI+XG4gICAgICAgICAgICAgIDxPdmVybGF5VHJpZ2dlclxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD17dG9vbHRpcFBsYWNlbWVudH1cbiAgICAgICAgICAgICAgICBvdmVybGF5PXtcbiAgICAgICAgICAgICAgICAgIDxUb29sdGlwIGlkPSdkaXNwLXRvb2x0aXAtdmlldy1vbmx5Jz5cbiAgICAgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLnZpZXdPbmx5fSAvPlxuICAgICAgICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgICAgICAgIH0+XG4gICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e2lzQ29ubmVjdGluZyB8fCBpc0Nvbm5lY3RlZH1cbiAgICAgICAgICAgICAgICAgIGFjdGl2ZT17dmlld09ubHl9XG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZVZpZXdPbmx5Q2xpY2soIXZpZXdPbmx5KX0+XG4gICAgICAgICAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdleWUtb3BlbicgLz5cbiAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgPC9PdmVybGF5VHJpZ2dlcj5cbiAgICAgICAgICAgIDwvQnV0dG9uR3JvdXA+XG4gICAgICAgICAgfVxuICAgICAgICAgIHsgIXBhbmVsU21hbGwgJiYgY2hpbGRyZW4gfVxuICAgICAgICAgIHsgaXNDb25uZWN0ZWQgJiYgdG9nZ2xlUGFuZWxTaXplICYmXG4gICAgICAgICAgICA8T3ZlcmxheVRyaWdnZXJcbiAgICAgICAgICAgICAgcGxhY2VtZW50PXt0b29sdGlwUGxhY2VtZW50fVxuICAgICAgICAgICAgICBvdmVybGF5PXtcbiAgICAgICAgICAgICAgICA8VG9vbHRpcCBpZD0nZGlzcC10b29sdGlwLXRvZ2dsZS1idG5zLXBhbi1zaXplJz5cbiAgICAgICAgICAgICAgICAgIHsgcGFuZWxTbWFsbCAmJiA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMuZnVsbE1lbnV9IC8+IH1cbiAgICAgICAgICAgICAgICAgIHsgIXBhbmVsU21hbGwgJiYgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLnNtYWxsTWVudX0gLz4gfVxuICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgfT5cbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0ncHVsbC1yaWdodCdcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZVBhbmVsU2l6ZUNsaWNrfT5cbiAgICAgICAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPXtwYW5lbFNtYWxsID8gJ3BsdXMnIDogJ21pbnVzJ30gLz5cbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICA8L092ZXJsYXlUcmlnZ2VyPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9CdXR0b25Ub29sYmFyPlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59XG5cbkRpc3BsYXlCdXR0b25zLnByb3BUeXBlcyA9IHtcbiAgaXNNb2JpbGU6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBpc0Nvbm5lY3Rpbmc6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBpc0RpY29ubmVjdGluZzogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGlzQ29ubmVjdGVkOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaGFuZGxlQ29ubmVjdENsaWNrOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgaGFuZGxlRGlzY29ubmVjdENsaWNrOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgaXNGdWxsc2NyZWVuOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgc2hvd0Z1bGxzY3JlZW5CdG46IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBoYW5kbGVGdWxsU2NyZWVuQ2xpY2s6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICB0cnVlQ29sb3I6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBoYW5kbGVUcnVlQ29sb3JDbGljazogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGxvY2FsQ3Vyc29yOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaGFuZGxlTG9jYWxDdXJzb3JDbGljazogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIHNoYXJlZDogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGhhbmRsZVNoYXJlZENsaWNrOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgdmlld09ubHk6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBoYW5kbGVWaWV3T25seUNsaWNrOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgY2xpcGJvYXJkOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaGFuZGxlQ2xpcGJvYXJkQ2xpY2s6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBzZW5kS2V5OiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBoYW5kbGVQYW5lbFNpemVDbGljazogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIHRvZ2dsZVBhbmVsU2l6ZTogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIHBhbmVsU21hbGw6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICB0b29sdGlwUGxhY2VtZW50OiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBvblZpcnR1YWxLZXlib2FyZFVzZWQ6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBjaGlsZHJlbjogUmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUmVhY3QuUHJvcFR5cGVzLmFycmF5T2YoUmVhY3QuUHJvcFR5cGVzLm5vZGUpLFxuICAgIFJlYWN0LlByb3BUeXBlcy5ub2RlXG4gIF0pXG59XG5EaXNwbGF5QnV0dG9ucy5kZWZhdWx0UHJvcHMgPSB7XG4gIGlzTW9iaWxlOiBmYWxzZSxcbiAgaXNDb25uZWN0aW5nOiBmYWxzZSxcbiAgaXNEaWNvbm5lY3Rpbmc6IGZhbHNlLFxuICBpc0Nvbm5lY3RlZDogZmFsc2UsXG4gIGlzRnVsbHNjcmVlbjogZmFsc2UsXG4gIHNob3dGdWxsc2NyZWVuQnRuOiBmYWxzZSxcbiAgdHJ1ZUNvbG9yOiB0cnVlLFxuICBsb2NhbEN1cnNvcjogdHJ1ZSxcbiAgc2hhcmVkOiB0cnVlLFxuICB2aWV3T25seTogZmFsc2UsXG4gIGNsaXBib2FyZDogZmFsc2UsXG4gIHRvZ2dsZVBhbmVsU2l6ZTogZmFsc2UsXG4gIHBhbmVsU21hbGw6IGZhbHNlLFxuICB0b29sdGlwUGxhY2VtZW50OiAnYm90dG9tJ1xufVxuXG5leHBvcnQgZGVmYXVsdCBEaXNwbGF5QnV0dG9uc1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgTW9kYWwsIEJ1dHRvbiwgRm9ybUNvbnRyb2wsIE5hdiwgTmF2SXRlbSB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcbmltcG9ydCB7IGluamVjdEludGwgfSBmcm9tICdyZWFjdC1pbnRsJ1xuXG5jbGFzcyBDbGlwYm9hcmRNb2RhbCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGxvYzogJ3JlbW90ZScsXG4gICAgICBsb2NhbFRleHQ6ICcnXG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVDbG9zZSA9IHRoaXMucHJvcHMuaGFuZGxlQ2xvc2VcbiAgICAgID8gKGV2ZW50KSA9PiB0aGlzLnByb3BzLmhhbmRsZUNsb3NlKClcbiAgICAgIDogKCkgPT4ge31cbiAgICAvLyBNZW51XG4gICAgdGhpcy5oYW5kbGVTZWxlY3QgPSAobG9jKSA9PiAoZXZlbnQpID0+IHRoaXMuc2V0U3RhdGUoeyBsb2MgfSlcblxuICAgIHRoaXMuaGFuZGxlTG9jYWxUZXh0Q2hhbmdlID0gKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLnNldFN0YXRlKHsgbG9jYWxUZXh0OiBldmVudC50YXJnZXQudmFsdWUgfSlcbiAgICB9XG4gICAgLy8gVGV4dGFyZWEgdG8gcmVtb3RlIGNsaXBib2FyZFxuICAgIHRoaXMuaGFuZGxlU2VuZCA9IChldmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgY29uc3QgeyBvbkNsaXBib2FyZFNlbmQgfSA9IHRoaXMucHJvcHNcbiAgICAgIGNvbnN0IHsgbG9jYWxUZXh0IH0gPSB0aGlzLnN0YXRlXG4gICAgICBpZiAob25DbGlwYm9hcmRTZW5kKSBvbkNsaXBib2FyZFNlbmQobG9jYWxUZXh0KVxuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGxvY2FsVGV4dDogJycgfSlcbiAgICB9XG5cbiAgICAvLyBNZXNzYWdlcyBkZWZpbml0aW9uXG4gICAgdGhpcy5tZXNzYWdlcyA9IHtcbiAgICAgIHJlbW90ZToge1xuICAgICAgICBpZDogJ3JlbW90ZScsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnUmVtb3RlJ1xuICAgICAgfSxcbiAgICAgIGxvY2FsOiB7XG4gICAgICAgIGlkOiAnbG9jYWwnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0xvY2FsJ1xuICAgICAgfSxcbiAgICAgIG5vdGhpbmdDb3BpZWQ6IHtcbiAgICAgICAgaWQ6ICdub3RoaW5nQ29waWVkJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdOb3RoaW5nIGNvcGllZCdcbiAgICAgIH0sXG4gICAgICBjdXJyZW50Q2xpcGJvYXJkRXhwbGFpbmF0aW9uOiB7XG4gICAgICAgIGlkOiAnY3VycmVudENsaXBib2FyZEV4cGxhaW5hdGlvbicsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhpcyBpcyB0aGUgY3VycmVudCBjbGlwYm9hcmQgb24gdGhlIHJlbW90ZSBtYWNoaW5lLiBDb3B5IHdoYXQgeW91IG5lZWQnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ01lc3NhZ2UgZGlzcGxheWVkIHRvIGNvcHkgbG9jYWwgY2xpcGJvYXJkIHRvIHJlbW90ZSBtYWNoaW5lJ1xuICAgICAgfSxcbiAgICAgIGNsaWNrU2VuZENsaXBib2FyZDoge1xuICAgICAgICBpZDogJ2NsaWNrU2VuZENsaXBib2FyZCcsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnQ2xpY2sgdG8gc2VuZCB0aGUgdGV4dCB0byB0aGUgcmVtb3RlIGNsaXBib2FyZC4nLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0hlbHAgY2xpY2thYmxlIG1lc3NhZ2Ugd2hlbiB3cml0ZSB0ZXh0IHRvIHNlbmQgdG8gcmVtb3RlIGNsaXBib2FyZCdcbiAgICAgIH0sXG4gICAgICBzZW5kOiB7XG4gICAgICAgIGlkOiAnc2VuZCcsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnc2VuZCdcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgc2hvdywgcmVtb3RlQ2xpcGJvYXJkVGV4dCB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IHsgbG9jLCBsb2NhbFRleHQgfSA9IHRoaXMuc3RhdGVcbiAgICBjb25zdCBkZWZpbmVNZXNzYWdlID0gdGhpcy5wcm9wcy5pbnRsLmZvcm1hdE1lc3NhZ2VcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0nY2xpcGJvYXJkLWZvcm0nID5cbiAgICAgICAgPE1vZGFsXG4gICAgICAgICAgc2hvdz17c2hvd31cbiAgICAgICAgICBrZXlib2FyZFxuICAgICAgICAgIGJhY2tkcm9wXG4gICAgICAgICAgb25IaWRlPXt0aGlzLmhhbmRsZUNsb3NlfVxuICAgICAgICAgIGFyaWEtbGFiZWxsZWRieT0nY29udGFpbmVkLW1vZGFsLXRpdGxlJz5cbiAgICAgICAgICA8TW9kYWwuSGVhZGVyIGNsb3NlQnV0dG9uPlxuICAgICAgICAgICAgPE5hdiBpZD0nY29udGFpbmVkLW1vZGFsLXRpdGxlJyBic1N0eWxlPSdwaWxscycganVzdGlmaWVkPlxuICAgICAgICAgICAgICA8TmF2SXRlbVxuICAgICAgICAgICAgICAgIGFjdGl2ZT17bG9jID09PSAncmVtb3RlJ31cbiAgICAgICAgICAgICAgICBvblNlbGVjdD17dGhpcy5oYW5kbGVTZWxlY3QoJ3JlbW90ZScpfT5cbiAgICAgICAgICAgICAgICB7IGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy5yZW1vdGUpIH1cbiAgICAgICAgICAgICAgPC9OYXZJdGVtPlxuICAgICAgICAgICAgICA8TmF2SXRlbVxuICAgICAgICAgICAgICAgIGFjdGl2ZT17bG9jID09PSAnbG9jYWwnfVxuICAgICAgICAgICAgICAgIG9uU2VsZWN0PXt0aGlzLmhhbmRsZVNlbGVjdCgnbG9jYWwnKX0+XG4gICAgICAgICAgICAgICAgeyBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMubG9jYWwpIH1cbiAgICAgICAgICAgICAgPC9OYXZJdGVtPlxuICAgICAgICAgICAgPC9OYXY+XG4gICAgICAgICAgPC9Nb2RhbC5IZWFkZXI+XG4gICAgICAgICAgPE1vZGFsLkJvZHk+XG4gICAgICAgICAgICB7IGxvYyA9PT0gJ3JlbW90ZScgJiZcbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICB7IHJlbW90ZUNsaXBib2FyZFRleHQubGVuZ3RoIDw9IDAgJiZcbiAgICAgICAgICAgICAgICAgIGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy5ub3RoaW5nQ29waWVkKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB7IHJlbW90ZUNsaXBib2FyZFRleHQubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgPEZvcm1Db250cm9sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9J3RleHRhcmVhJ1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRDbGFzcz0ndGV4dGFyZWEnXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZT17cmVtb3RlQ2xpcGJvYXJkVGV4dH1cbiAgICAgICAgICAgICAgICAgICAgb25Gb2N1cz17KGV2ZW50KSA9PiBldmVudC50YXJnZXQuc2VsZWN0KCl9IC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHsgbG9jID09PSAnbG9jYWwnICYmXG4gICAgICAgICAgICAgIDxGb3JtQ29udHJvbFxuICAgICAgICAgICAgICAgIHR5cGU9J3RleHRhcmVhJ1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudENsYXNzPSd0ZXh0YXJlYSdcbiAgICAgICAgICAgICAgICB2YWx1ZT17bG9jYWxUZXh0fVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLmhhbmRsZUxvY2FsVGV4dENoYW5nZX1cbiAgICAgICAgICAgICAgICBvbkZvY3VzPXsoZXZlbnQpID0+IGV2ZW50LnRhcmdldC5zZWxlY3QoKX0gLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L01vZGFsLkJvZHk+XG4gICAgICAgICAgPE1vZGFsLkZvb3Rlcj5cbiAgICAgICAgICAgIHsgbG9jID09PSAncmVtb3RlJyAmJlxuICAgICAgICAgICAgICA8c21hbGw+XG4gICAgICAgICAgICAgICAgeyBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuY3VycmVudENsaXBib2FyZEV4cGxhaW5hdGlvbikgfVxuICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeyBsb2MgPT09ICdsb2NhbCcgJiZcbiAgICAgICAgICAgICAgPHNtYWxsPlxuICAgICAgICAgICAgICAgIHsgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLmNsaWNrU2VuZENsaXBib2FyZCkgfVxuICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgeyBsb2MgPT09ICdsb2NhbCcgJiZcbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9J3N1Ym1pdCdcbiAgICAgICAgICAgICAgICBic1N0eWxlPSdwcmltYXJ5J1xuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlU2VuZH0+XG4gICAgICAgICAgICAgICAgeyBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuc2VuZCkgfVxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L01vZGFsLkZvb3Rlcj5cbiAgICAgICAgPC9Nb2RhbD5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxufVxuXG5DbGlwYm9hcmRNb2RhbC5wcm9wVHlwZXMgPSB7XG4gIHNob3c6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICByZW1vdGVDbGlwYm9hcmRUZXh0OiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBoYW5kbGVDbG9zZTogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIG9uQ2xpcGJvYXJkU2VuZDogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGludGw6IFJlYWN0LlByb3BUeXBlcy5vYmplY3Rcbn1cbkNsaXBib2FyZE1vZGFsLmRlZmF1bHRQcm9wcyA9IHtcbiAgc2hvdzogZmFsc2UsXG4gIHJlbW90ZUNsaXBib2FyZFRleHQ6ICcnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdEludGwoQ2xpcGJvYXJkTW9kYWwpXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnXG5pbXBvcnQgeyBkZWZpbmVNZXNzYWdlcywgRm9ybWF0dGVkTWVzc2FnZSB9IGZyb20gJ3JlYWN0LWludGwnXG5pbXBvcnQge1xuICBBbGVydCwgV2VsbCwgQnV0dG9uLCBHbHlwaGljb24sIE92ZXJsYXlUcmlnZ2VyLCBUb29sdGlwXG59IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcbmltcG9ydCBSRkIgZnJvbSAnQG5yYXluYXVkL25vdm5jL2xpYi9yZmInXG5pbXBvcnQgS2V5c3ltZGVmIGZyb20gJ0BucmF5bmF1ZC9ub3ZuYy9saWIvaW5wdXQva2V5c3ltZGVmJ1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcydcbmltcG9ydCBNb2JpbGVEZXRlY3QgZnJvbSAnbW9iaWxlLWRldGVjdCdcbmltcG9ydCB7IHNhdmVBcyB9IGZyb20gJ2ZpbGVzYXZlci5qcy9GaWxlU2F2ZXInXG5pbXBvcnQgdG9CbG9iIGZyb20gJ2NhbnZhcy10by1ibG9iJ1xuXG5pbXBvcnQgTG9nZ2VyIGZyb20gJy4uLy4uL2NvbW1vbi9saWIvTG9nZ2VyJ1xuaW1wb3J0IHsgUFJPVE8gfSBmcm9tICcuLi8uLi9jb25zdGFudHMnXG5pbXBvcnQgRmFrZVdlYlNvY2tldCBmcm9tICcuLi8uLi9jb21tb24vbGliL0Zha2VXZWJTb2NrZXQnXG5cbmltcG9ydCB7IHNob3dIZWFkZXIsIGhpZGVIZWFkZXIgfSBmcm9tICcuLi8uLi9hY3Rpb25zL2FwcCdcbmltcG9ydCB7XG4gIHVwZGF0ZURpc3BsYXlEYXRhLFxuICBjb25uZWN0aW9uRGlzcGxheVJlcXVlc3QsIGNvbm5lY3Rpb25EaXNwbGF5U3VjY2VzcywgY29ubmVjdGlvbkRpc3BsYXlGYWlsdXJlLFxuICBkaXNjb25lY3REaXNwbGF5LCBkaXNjb25uZWN0aW9uRGlzcGxheVJlcXVlc3QsIGRpc2Nvbm5lY3Rpb25EaXNwbGF5U3VjY2VzcyxcbiAgY2xlYXJEaXNwbGF5RXJyb3Jcbn0gZnJvbSAnLi4vLi4vYWN0aW9ucy9kaXNwbGF5J1xuaW1wb3J0IHsgZ2V0QWN0aXZlU2VjdGlvbiwgZ2V0U2VjdGlvbiB9IGZyb20gJy4uLy4uL3JlZHVjZXJzL2FwcCdcblxuLy8gQ29tcG9uZW50c1xuaW1wb3J0IE92ZXJsYXkgZnJvbSAnLi4vLi4vY29tbW9uL2NvbXBvbmVudHMvb3ZlcmxheSdcbmltcG9ydCBEaXNwbGF5QnV0dG9ucyBmcm9tICcuL2J1dHRvbnMnXG5pbXBvcnQgRGlzcGxheVBhc3NGb3JtIGZyb20gJy4vcGFzcy1mb3JtJ1xuaW1wb3J0IENsaXBib2FyZE1vZGFsIGZyb20gJy4vY2xpcGJvYXJkLW1vZGFsJ1xuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHsgc2VjdGlvbjogJ0Rpc3BsYXkgbWFpbicgfSlcblxuLy8gTWVzc2FnZXMgZGVmaW5pdGlvbnNcbmNvbnN0IG1lc3NhZ2VzID0gZGVmaW5lTWVzc2FnZXMoe1xuICBtb3ZlRG93bjoge1xuICAgIGlkOiAnbW92ZURvd24nLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnTW92ZSBkb3duJ1xuICB9LFxuICBtb3ZlVXA6IHtcbiAgICBpZDogJ21vdmVVcCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdNb3ZlIHVwJ1xuICB9LFxuICB0YWtlU2NyZWVuc2hvdDoge1xuICAgIGlkOiAndGFrZVNjcmVlbnNob3QnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVGFrZSBzY3JlZW5zaG90J1xuICB9LFxuICBlcnJvcjoge1xuICAgIGlkOiAnZXJyb3InLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRXJyb3InXG4gIH0sXG4gIGRpc2Nvbm5lY3RlZEluZm86IHtcbiAgICBpZDogJ2Rpc2Nvbm5lY3RlZEluZm8nLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnUHJlc3MgXFwnQ29ubmVjdFxcJyBidXR0b24gdG8gYWNjZXNzIHRoZSByZW1vdGUgZGVzay4nXG4gIH0sXG4gIGNvbm5lY3RpbmdEb3RzOiB7XG4gICAgaWQ6ICdjb25uZWN0aW5nRG90cycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdDb25uZWN0aW5nLi4uJ1xuICB9LFxuICBkaXNjb25uZWN0aW5nRG90czoge1xuICAgIGlkOiAnZGlzY29ubmVjdGluZ0RvdHMnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRGlzY29ubmVjdGluZy4uLidcbiAgfVxufSlcblxuZXhwb3J0IGNsYXNzIERpc3BsYXkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBoZWFkZXI6IHRoaXMucHJvcHMuaGVhZGVyLFxuICAgICAgc2hvd1Bhc3NGb3JtOiBmYWxzZSxcbiAgICAgIGlzRnVsbHNjcmVlbjogZmFsc2UsXG4gICAgICBidXR0b25zQWxpZ25tZW50OiAndG9wJyxcbiAgICAgIGlzTW9iaWxlOiBmYWxzZSxcbiAgICAgIHJlbW90ZUNsaXBib2FyZFRleHQ6ICcnLFxuICAgICAgc2hvd0NsaXBib2FyZE1vZGFsOiBmYWxzZSxcbiAgICAgIGJ1dHRvbnNQYW5lbFNtYWxsOiBmYWxzZVxuICAgIH1cblxuICAgIHRoaXMucmZiID0gbnVsbFxuXG4gICAgLy8gSEFDSzogU3RvcmUgdGhlIHJlZiB0byB0aGUgbmF0aXZlIHdlYnNvY2tldCBsaWJyYXJ5IHRvIHJlc3RvcmUgaXQgbGF0ZXJcbiAgICB0aGlzLm5hdGl2ZVdlYlNvY2tldCA9IFdlYlNvY2tldFxuXG4gICAgdGhpcy5jb25uZWN0RGlzcGxheSA9IHRoaXMuY29ubmVjdERpc3BsYXkuYmluZCh0aGlzKVxuICAgIHRoaXMuZGlzY29ubmVjdERpc3BsYXkgPSB0aGlzLmRpc2Nvbm5lY3REaXNwbGF5LmJpbmQodGhpcylcbiAgICB0aGlzLnJlcXVlc3RGdWxsc2NyZWVuID0gdGhpcy5yZXF1ZXN0RnVsbHNjcmVlbi5iaW5kKHRoaXMpXG4gICAgdGhpcy5leGl0RnVsbHNjcmVlbiA9IHRoaXMuZXhpdEZ1bGxzY3JlZW4uYmluZCh0aGlzKVxuICAgIHRoaXMuX29uVXBkYXRlU3RhdGUgPSB0aGlzLl9vblVwZGF0ZVN0YXRlLmJpbmQodGhpcylcbiAgICB0aGlzLl9vbkRpc2Nvbm5lY3RlZCA9IHRoaXMuX29uRGlzY29ubmVjdGVkLmJpbmQodGhpcylcbiAgICB0aGlzLl9oYW5kbGVSZXNpemUgPSB0aGlzLl9oYW5kbGVSZXNpemUuYmluZCh0aGlzKVxuICAgIHRoaXMuX2dldERpc3BsYXlTaXplID0gdGhpcy5fZ2V0RGlzcGxheVNpemUuYmluZCh0aGlzKVxuICAgIHRoaXMuX2hhbmRsZVBhc3NTdWJtaXQgPSB0aGlzLl9oYW5kbGVQYXNzU3VibWl0LmJpbmQodGhpcylcblxuICAgIHRoaXMuaGFuZGxlVHJ1ZUNvbG9yQ2xpY2sgPSAodHJ1ZUNvbG9yKSA9PlxuICAgICAgdGhpcy5wcm9wcy51cGRhdGVEaXNwbGF5RGF0YSh7IHRydWVDb2xvciB9KVxuICAgIHRoaXMuaGFuZGxlTG9jYWxDdXJzb3JDbGljayA9IChsb2NhbEN1cnNvcikgPT5cbiAgICAgIHRoaXMucHJvcHMudXBkYXRlRGlzcGxheURhdGEoeyBsb2NhbEN1cnNvciB9KVxuICAgIHRoaXMuaGFuZGxlU2hhcmVkQ2xpY2sgPSAoc2hhcmVkKSA9PlxuICAgICAgdGhpcy5wcm9wcy51cGRhdGVEaXNwbGF5RGF0YSh7IHNoYXJlZCB9KVxuICAgIHRoaXMuaGFuZGxlVmlld09ubHlDbGljayA9ICh2aWV3T25seSkgPT5cbiAgICAgIHRoaXMucHJvcHMudXBkYXRlRGlzcGxheURhdGEoeyB2aWV3T25seSB9KVxuICAgIHRoaXMuaGFuZGxlRnVsbFNjcmVlbkNsaWNrID0gKCkgPT4ge1xuICAgICAgY29uc3QgeyBpc0Z1bGxzY3JlZW4gfSA9IHRoaXMuc3RhdGVcbiAgICAgIGlmIChpc0Z1bGxzY3JlZW4pIHRoaXMuZXhpdEZ1bGxzY3JlZW4oKVxuICAgICAgZWxzZSB0aGlzLnJlcXVlc3RGdWxsc2NyZWVuKClcbiAgICB9XG5cbiAgICB0aGlzLl9jb25uZWN0UkZCID0gKG1vZGUsIHBhc3MpID0+IHtcbiAgICAgIGlmICh0aGlzLnJmYikge1xuICAgICAgICBnbG9iYWwuV2ViU29ja2V0ID0gRmFrZVdlYlNvY2tldCAvLyBIQUNLOiBVc2UgYSBjdXN0b20gaW1wbGVtZW50YXRpb25cbiAgICAgICAgdGhpcy5yZmIuY29ubmVjdChtb2RlLCA1OTAwLCBwYXNzKVxuICAgICAgICBnbG9iYWwuV2ViU29ja2V0ID0gdGhpcy5uYXRpdmVXZWJTb2NrZXQgLy8gSEFDSzogUmVzdG9yZSBpbXBsZW1lbnRhdGlvblxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VuZEtleSA9ICguLi5wYXJhbXMpID0+IHtcbiAgICAgIGlmICh0aGlzLnJmYikgdGhpcy5yZmIuc2VuZEtleSguLi5wYXJhbXMpXG4gICAgfVxuXG4gICAgdGhpcy5jaGVja01vYmlsZSA9ICgpID0+IHtcbiAgICAgIGlmICh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCkge1xuICAgICAgICBjb25zdCBtZCA9IG5ldyBNb2JpbGVEZXRlY3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpXG4gICAgICAgIGlmIChtZC5tb2JpbGUoKSkgcmV0dXJuIHRoaXMuc2V0U3RhdGUoeyBpc01vYmlsZTogdHJ1ZSB9KVxuICAgICAgfVxuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzTW9iaWxlOiBmYWxzZSB9KVxuICAgIH1cblxuICAgIHRoaXMuX29uQ2xpcGJvYXJkUmVjZWl2ZSA9IChyZmIsIHRleHQpID0+IHtcbiAgICAgIC8vIGxvZ2dlci5sb2coJ1tSRkJdJywgJ1tDbGlwYm9hcmQgaW5jb21pbmddJywgdGV4dClcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyByZW1vdGVDbGlwYm9hcmRUZXh0OiB0ZXh0IH0pXG4gICAgfVxuXG4gICAgdGhpcy50b2dnbGVDbGlwYm9hcmRNb2RhbCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHsgc2hvd0NsaXBib2FyZE1vZGFsIH0gPSB0aGlzLnN0YXRlXG4gICAgICBpZiAoc2hvd0NsaXBib2FyZE1vZGFsKSB0aGlzLl9ncmFiSW5wdXQoKVxuICAgICAgZWxzZSB0aGlzLl91bmdyYWJJbnB1dCgpXG4gICAgICB0aGlzLnNldFN0YXRlKHsgc2hvd0NsaXBib2FyZE1vZGFsOiAhc2hvd0NsaXBib2FyZE1vZGFsIH0pXG4gICAgfVxuICAgIHRoaXMub25Mb2NhbENsaXBib2FyZFNlbmQgPSAodGV4dCkgPT4ge1xuICAgICAgaWYgKHRoaXMucmZiKSB0aGlzLnJmYi5jbGlwYm9hcmRQYXN0ZUZyb20odGV4dClcbiAgICB9XG5cbiAgICB0aGlzLnRha2VTY3JlZW5zaG90ID0gKGV2ZW50KSA9PiB7XG4gICAgICBpZiAodGhpcy5kaXNwbGF5UmVmKSB7XG4gICAgICAgIHRoaXMuZGlzcGxheVJlZi50b0Jsb2IoKGJsb2IpID0+IHNhdmVBcyhibG9iLCAnc2NyZWVuc2hvdC5wbmcnKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBXaGVuIG5vcm1hbCBrZXlib2FyZCBldmVudHMgYXJlIGxlZnQgdW5jb3VnaHQsIHVzZSB0aGUgaW5wdXQgZXZlbnRzIGZyb21cbiAgICAvLyB0aGUga2V5Ym9hcmRpbnB1dCBlbGVtZW50IGluc3RlYWQgYW5kIGdlbmVyYXRlIHRoZSBjb3JyZXNwb25kaW5nIGtleSBldmVudHMuXG4gICAgLy8gVGhpcyBjb2RlIGlzIHJlcXVpcmVkIHNpbmNlIHNvbWUgYnJvd3NlcnMgb24gQW5kcm9pZCBhcmUgaW5jb25zaXN0ZW50IGluXG4gICAgLy8gc2VuZGluZyBrZXlDb2RlcyBpbiB0aGUgbm9ybWFsIGtleWJvYXJkIGV2ZW50cyB3aGVuIHVzaW5nIG9uIHNjcmVlbiBrZXlib2FyZHMuXG4gICAgdGhpcy5oYW5kbGVWaXJ0dWFsS2V5Ym9hcmRVc2VkID0gKHZhbHVlKSA9PiB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIC8vIFRPRE86IENoYW5nZSBvbiBub3ZuYyB1cGRhdGVcbiAgICAgICAgY29uc3QgeyBrZXlzeW0gfSA9IEtleXN5bWRlZi5sb29rdXAodmFsdWUuY2hhckNvZGVBdChpKSkgfHwge31cbiAgICAgICAgaWYgKGtleXN5bSkgdGhpcy5yZmIuc2VuZEtleShrZXlzeW0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy50b2dnbGVCdXR0b25zUGFuZWxTaXplID0gKCkgPT4ge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGJ1dHRvbnNQYW5lbFNtYWxsOiAhdGhpcy5zdGF0ZS5idXR0b25zUGFuZWxTbWFsbCB9KVxuICAgIH1cblxuICAgIC8vIEhhY2sgdG8gYWxsb3cgdGhlIG5vVk5DIGxpYnJhcnkgdXNlIHRoZSBwZXJzaXN0ZW50IHdlYnNvY2tldCBjb25uZWN0aW9uXG4gICAgaWYgKCFnbG9iYWwuTmF0aXZlV2ViU29ja2V0KSBnbG9iYWwuTmF0aXZlV2ViU29ja2V0ID0gRmFrZVdlYlNvY2tldFxuXG4gICAgdGhpcy5fcHJldmVudENhbnZhc0RlZmF1bHQgPSAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgfVxuICB9XG5cbiAgZ2V0IGRpc3BsYXlCb3JkZXJXaWR0aCAoKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaXNNb2JpbGUsIHNob3dQYXNzRm9ybSwgaXNGdWxsc2NyZWVuLCBidXR0b25zQWxpZ25tZW50LFxuICAgICAgcmVtb3RlQ2xpcGJvYXJkVGV4dCwgc2hvd0NsaXBib2FyZE1vZGFsLCBidXR0b25zUGFuZWxTbWFsbFxuICAgIH0gPSB0aGlzLnN0YXRlXG4gICAgY29uc3Qge1xuICAgICAgc2hvdywgaXNBZ2VudENvbm5lY3RlZCwgaXNBZ2VudEF1dGhlbnRpY2F0ZWQsXG4gICAgICBpc0Nvbm5lY3RpbmcsIGlzRGlzY29ubmVjdGluZywgaXNDb25uZWN0ZWQsIGVycm9yLCBlcnJvck1lc3NhZ2UsXG4gICAgICB0cnVlQ29sb3IsIGxvY2FsQ3Vyc29yLCBzaGFyZWQsIHZpZXdPbmx5XG4gICAgfSA9IHRoaXMucHJvcHNcblxuICAgIGNvbnN0IGhpZGRlbiA9ICFzaG93IHx8ICFpc0FnZW50Q29ubmVjdGVkIHx8ICFpc0FnZW50QXV0aGVudGljYXRlZFxuXG4gICAgY29uc3QgaXNCdXR0b25zVXAgPSBidXR0b25zQWxpZ25tZW50ID09PSAndG9wJ1xuICAgIGNvbnN0IGhhbmRsZU1vdmVDbGljayA9IChldmVudCkgPT4ge1xuICAgICAgaWYgKGlzQnV0dG9uc1VwKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBidXR0b25zQWxpZ25tZW50OiAnYm90dG9tJyB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGJ1dHRvbnNBbGlnbm1lbnQ6ICd0b3AnIH0pXG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG1vdmVCdXR0b24gPSAoXG4gICAgICA8T3ZlcmxheVRyaWdnZXJcbiAgICAgICAgcGxhY2VtZW50PXshaXNCdXR0b25zVXAgPyAndG9wJyA6ICdib3R0b20nfVxuICAgICAgICBvdmVybGF5PXtcbiAgICAgICAgICA8VG9vbHRpcCBpZD0nZGlzcC10b29sdGlwLW1vdmUtYnV0dG9ucyc+XG4gICAgICAgICAgICB7IGlzQnV0dG9uc1VwICYmIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5tb3ZlRG93bn0gLz4gfVxuICAgICAgICAgICAgeyAhaXNCdXR0b25zVXAgJiYgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLm1vdmVVcH0gLz4gfVxuICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgfT5cbiAgICAgICAgPEJ1dHRvblxuICAgICAgICAgIGNsYXNzTmFtZT0ncHVsbC1yaWdodCdcbiAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVNb3ZlQ2xpY2t9PlxuICAgICAgICAgIDxHbHlwaGljb24gZ2x5cGg9e2lzQnV0dG9uc1VwID8gJ2Fycm93LWRvd24nIDogJ2Fycm93LXVwJ30gLz5cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICA8L092ZXJsYXlUcmlnZ2VyPlxuICAgIClcblxuICAgIGNvbnN0IHNjcmVlbnNob3RCdXR0b24gPSAoXG4gICAgICA8T3ZlcmxheVRyaWdnZXJcbiAgICAgICAgcGxhY2VtZW50PXshaXNCdXR0b25zVXAgPyAndG9wJyA6ICdib3R0b20nfVxuICAgICAgICBvdmVybGF5PXtcbiAgICAgICAgICA8VG9vbHRpcCBpZD0nZGlzcC10b29sdGlwLXNjci1idXR0b25zJz5cbiAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy50YWtlU2NyZWVuc2hvdH0gLz5cbiAgICAgICAgICA8L1Rvb2x0aXA+XG4gICAgICAgIH0+XG4gICAgICAgIDxCdXR0b25cbiAgICAgICAgICBjbGFzc05hbWU9J3B1bGwtcmlnaHQnXG4gICAgICAgICAgb25DbGljaz17dGhpcy50YWtlU2NyZWVuc2hvdH0+XG4gICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD0nY2FtZXJhJyAvPlxuICAgICAgICA8L0J1dHRvbj5cbiAgICAgIDwvT3ZlcmxheVRyaWdnZXI+XG4gICAgKVxuXG4gICAgY29uc3QgYnV0dG9ucyA9IChcbiAgICAgIDxEaXNwbGF5QnV0dG9uc1xuICAgICAgICBpc01vYmlsZT17aXNNb2JpbGV9XG4gICAgICAgIGlzQ29ubmVjdGluZz17aXNDb25uZWN0aW5nfVxuICAgICAgICBpc0Rpc2Nvbm5lY3Rpbmc9e2lzRGlzY29ubmVjdGluZ31cbiAgICAgICAgaXNDb25uZWN0ZWQ9e2lzQ29ubmVjdGVkfVxuICAgICAgICBoYW5kbGVDb25uZWN0Q2xpY2s9e3RoaXMuY29ubmVjdERpc3BsYXl9XG4gICAgICAgIGhhbmRsZURpc2Nvbm5lY3RDbGljaz17dGhpcy5kaXNjb25uZWN0RGlzcGxheX1cbiAgICAgICAgaXNGdWxsc2NyZWVuPXtpc0Z1bGxzY3JlZW59XG4gICAgICAgIHNob3dGdWxsc2NyZWVuQnRuXG4gICAgICAgIGhhbmRsZUZ1bGxTY3JlZW5DbGljaz17dGhpcy5oYW5kbGVGdWxsU2NyZWVuQ2xpY2t9XG4gICAgICAgIHRydWVDb2xvcj17dHJ1ZUNvbG9yfVxuICAgICAgICBoYW5kbGVUcnVlQ29sb3JDbGljaz17dGhpcy5oYW5kbGVUcnVlQ29sb3JDbGlja31cbiAgICAgICAgbG9jYWxDdXJzb3I9e2xvY2FsQ3Vyc29yfVxuICAgICAgICBoYW5kbGVMb2NhbEN1cnNvckNsaWNrPXt0aGlzLmhhbmRsZUxvY2FsQ3Vyc29yQ2xpY2t9XG4gICAgICAgIHNoYXJlZD17c2hhcmVkfVxuICAgICAgICBoYW5kbGVTaGFyZWRDbGljaz17dGhpcy5oYW5kbGVTaGFyZWRDbGlja31cbiAgICAgICAgdmlld09ubHk9e3ZpZXdPbmx5fVxuICAgICAgICBoYW5kbGVWaWV3T25seUNsaWNrPXt0aGlzLmhhbmRsZVZpZXdPbmx5Q2xpY2t9XG4gICAgICAgIGNsaXBib2FyZFxuICAgICAgICBoYW5kbGVDbGlwYm9hcmRDbGljaz17dGhpcy50b2dnbGVDbGlwYm9hcmRNb2RhbH1cbiAgICAgICAgc2VuZEtleT17dGhpcy5zZW5kS2V5fVxuICAgICAgICB0b2dnbGVQYW5lbFNpemVcbiAgICAgICAgaGFuZGxlUGFuZWxTaXplQ2xpY2s9e3RoaXMudG9nZ2xlQnV0dG9uc1BhbmVsU2l6ZX1cbiAgICAgICAgcGFuZWxTbWFsbD17YnV0dG9uc1BhbmVsU21hbGx9XG4gICAgICAgIHRvb2x0aXBQbGFjZW1lbnQ9eyFpc0J1dHRvbnNVcCA/ICd0b3AnIDogJ2JvdHRvbSd9XG4gICAgICAgIG9uVmlydHVhbEtleWJvYXJkVXNlZD17dGhpcy5oYW5kbGVWaXJ0dWFsS2V5Ym9hcmRVc2VkfT5cbiAgICAgICAgeyBpc0Nvbm5lY3RlZCAmJiBzY3JlZW5zaG90QnV0dG9uIH1cbiAgICAgICAgeyBpc0Z1bGxzY3JlZW4gJiYgbW92ZUJ1dHRvbiB9XG4gICAgICA8L0Rpc3BsYXlCdXR0b25zPlxuICAgIClcbiAgICBjb25zdCBwYW5lbCA9IChidXR0b25zKSA9PiAoXG4gICAgICA8V2VsbCBic1NpemU9J3NtYWxsJyBzdHlsZT17eyBtYXJnaW5Cb3R0b206ICcwJyB9fT5cbiAgICAgICAgeyBidXR0b25zIH1cbiAgICAgIDwvV2VsbD5cbiAgICApXG5cbiAgICBjb25zdCBkaXNwbGF5U3R5bGUgPSAoaXNGdWxsc2NyZWVuKVxuICAgICAgPyB7XG4gICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICB0b3A6ICcwJyxcbiAgICAgICAgYm90dG9tOiAnMCcsXG4gICAgICAgIGxlZnQ6ICcwJyxcbiAgICAgICAgcmlnaHQ6ICcwJyxcbiAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcidcbiAgICAgIH1cbiAgICAgIDoge31cbiAgICBjb25zdCBjU3R5bGUgPSAoaXNDb25uZWN0ZWQgJiYgIWlzRGlzY29ubmVjdGluZyAmJiB0aGlzLmRpc3BsYXlCb3JkZXJXaWR0aCA+IDApXG4gICAgICA/IHtcbiAgICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsIC8vIFRvIGZpdCB0aGUgY29udGVudCBzaXplXG4gICAgICAgIGZvbnRTaXplOiAnMHB4JywgLy8gVHJpY2sgdG8gYXZvaWQgdGhlIGJvdHRvbSBzcGFjZSBmcm9tIGlubGluZS1ibG9ja1xuICAgICAgICBib3JkZXI6IGAke3RoaXMuZGlzcGxheUJvcmRlcldpZHRofXB4IHNvbGlkIGJsYWNrYFxuICAgICAgfVxuICAgICAgOiB7fVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc25hbWVzKCdkaXNwbGF5LW1haW4nLCB7ICdoaWRkZW4nOiBoaWRkZW4gfSl9XG4gICAgICAgIHJlZj17KHJlZikgPT4geyB0aGlzLm1haW5EaXZSZWYgPSByZWYgfX0+XG4gICAgICAgIHsgc2hvd1Bhc3NGb3JtICYmXG4gICAgICAgICAgPERpc3BsYXlQYXNzRm9ybSBzaG93IGhhbmRsZVN1Ym1pdD17dGhpcy5faGFuZGxlUGFzc1N1Ym1pdH0gLz5cbiAgICAgICAgfVxuICAgICAgICB7ICFpc0Z1bGxzY3JlZW4gJiYgYnV0dG9ucyB9XG4gICAgICAgIHsgIWlzRnVsbHNjcmVlbiAmJiA8YnIgLz4gfVxuICAgICAgICB7IGlzRnVsbHNjcmVlbiAmJlxuICAgICAgICAgIDxPdmVybGF5IGFsaWduPXtpc0J1dHRvbnNVcCA/ICd0b3AnIDogJ2JvdHRvbSd9PlxuICAgICAgICAgICAgeyBwYW5lbChidXR0b25zKSB9XG4gICAgICAgICAgPC9PdmVybGF5PlxuICAgICAgICB9XG4gICAgICAgIHsgZXJyb3IgJiZcbiAgICAgICAgICA8QWxlcnQgYnNTdHlsZT0nZGFuZ2VyJyBvbkRpc21pc3M9e3RoaXMucHJvcHMuY2xlYXJEaXNwbGF5RXJyb3J9PlxuICAgICAgICAgICAgeyBlcnJvck1lc3NhZ2UubGVuZ3RoID4gMCAmJiBlcnJvck1lc3NhZ2UgfVxuICAgICAgICAgICAgeyBlcnJvck1lc3NhZ2UubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5lcnJvcn0gLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L0FsZXJ0PlxuICAgICAgICB9XG4gICAgICAgIHsgKCFpc0Nvbm5lY3RlZCB8fCAoaXNDb25uZWN0ZWQgJiYgaXNEaXNjb25uZWN0aW5nKSkgJiZcbiAgICAgICAgICA8QWxlcnQ+XG4gICAgICAgICAgICB7ICFpc0Nvbm5lY3RpbmcgJiYgIWlzRGlzY29ubmVjdGluZyAmJlxuICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMuZGlzY29ubmVjdGVkSW5mb30gLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHsgaXNDb25uZWN0aW5nICYmXG4gICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5jb25uZWN0aW5nRG90c30gLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHsgaXNEaXNjb25uZWN0aW5nICYmXG4gICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5kaXNjb25uZWN0aW5nRG90c30gLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L0FsZXJ0PlxuICAgICAgICB9XG4gICAgICAgIDxDbGlwYm9hcmRNb2RhbFxuICAgICAgICAgIHNob3c9e3Nob3dDbGlwYm9hcmRNb2RhbH1cbiAgICAgICAgICByZW1vdGVDbGlwYm9hcmRUZXh0PXtyZW1vdGVDbGlwYm9hcmRUZXh0fVxuICAgICAgICAgIGhhbmRsZUNsb3NlPXt0aGlzLnRvZ2dsZUNsaXBib2FyZE1vZGFsfVxuICAgICAgICAgIG9uQ2xpcGJvYXJkU2VuZD17dGhpcy5vbkxvY2FsQ2xpcGJvYXJkU2VuZH0gLz5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGlkPSdkaXNwbGF5LWNvbnRhaW5lcidcbiAgICAgICAgICBjbGFzc05hbWU9J3RleHQtY2VudGVyJ1xuICAgICAgICAgIHN0eWxlPXtkaXNwbGF5U3R5bGV9PlxuICAgICAgICAgIDxkaXYgc3R5bGU9e2NTdHlsZX0+XG4gICAgICAgICAgICA8Y2FudmFzXG4gICAgICAgICAgICAgIG9uQ29udGV4dE1lbnU9e3RoaXMuX3ByZXZlbnRDYW52YXNEZWZhdWx0fVxuICAgICAgICAgICAgICByZWY9eyhyZWYpID0+IHsgdGhpcy5kaXNwbGF5UmVmID0gcmVmIH19IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIHRoaXMuY2hlY2tNb2JpbGUoKVxuICAgIGlmICh3aW5kb3cpIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9oYW5kbGVSZXNpemUpXG5cbiAgICAvLyBBZGQgdGhlIHRvQmxvYiBwb2x5ZmlsbFxuICAgIGlmICghdG9CbG9iLnN1cHBvcnRlZCkgdG9CbG9iLmluaXQoKVxuICB9XG5cbiAgY29tcG9uZW50V2lsbFVwZGF0ZSAobmV4dFByb3BzLCBuZXh0U3RhdGUpIHtcbiAgICBjb25zdCBzaG93ID0gbmV4dFByb3BzICYmIG5leHRQcm9wcy5zaG93ICYmXG4gICAgICBuZXh0UHJvcHMuaXNBZ2VudENvbm5lY3RlZCAmJiBuZXh0UHJvcHMuaXNBZ2VudEF1dGhlbnRpY2F0ZWRcbiAgICBjb25zdCBwcmV2U2hvdyA9IHRoaXMucHJvcHMuc2hvdyAmJlxuICAgICAgdGhpcy5wcm9wcy5pc0FnZW50Q29ubmVjdGVkICYmIHRoaXMucHJvcHMuaXNBZ2VudEF1dGhlbnRpY2F0ZWRcbiAgICAvLyBXaWxsIGJlIHNob3cgd2hlbiB1cGRhdGVkLCBzbyB1cGRhdGUgdGhlIGhlYWRlciB2YWx1ZVxuICAgIGlmIChzaG93ICYmICFwcmV2U2hvdykge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGhlYWRlcjogdGhpcy5wcm9wcy5oZWFkZXIgfSlcbiAgICB9XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUgKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgY29uc3QgcHJldlNob3cgPSBwcmV2UHJvcHMgJiYgcHJldlByb3BzLnNob3cgJiZcbiAgICAgIHByZXZQcm9wcy5pc0FnZW50Q29ubmVjdGVkICYmIHByZXZQcm9wcy5pc0FnZW50QXV0aGVudGljYXRlZFxuICAgIGNvbnN0IHNob3cgPSB0aGlzLnByb3BzLnNob3cgJiZcbiAgICAgIHRoaXMucHJvcHMuaXNBZ2VudENvbm5lY3RlZCAmJiB0aGlzLnByb3BzLmlzQWdlbnRBdXRoZW50aWNhdGVkXG5cbiAgICBpZiAocHJldlN0YXRlLmlzRnVsbHNjcmVlbiAhPT0gdGhpcy5zdGF0ZS5pc0Z1bGxzY3JlZW4pIHRoaXMuX2hhbmRsZVJlc2l6ZSgpXG5cbiAgICBpZiAoc2hvdyAmJiAhcHJldlNob3cpIHtcbiAgICAgIC8vIFNvZnQgbW91bnRcbiAgICAgIHRoaXMuX2dyYWJJbnB1dCgpXG4gICAgICAvLyBBZGQgdGhlIHJlc2l6ZSBsaXN0ZW5lcnNcbiAgICAgIGlmICh3aW5kb3cpIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9oYW5kbGVSZXNpemUpXG4gICAgICAvLyBSZXNpemUgZXZlcnkgdGltZSB0aGUgdXNlciBlbnRlciB0aGUgc2VjdGlvbiAodGhlIHNpemUgbWF5IGhhdmUgY2hhbmdlZClcbiAgICAgIHRoaXMuX2hhbmRsZVJlc2l6ZSgpXG4gICAgfSBlbHNlIGlmICghc2hvdyAmJiBwcmV2U2hvdykge1xuICAgICAgLy8gU29mdCB1bm1vdW50XG4gICAgICBpZiAodGhpcy5wcm9wcy5zaG93SGVhZGVyICYmIHRoaXMuc3RhdGUuaGVhZGVyKSB0aGlzLnByb3BzLnNob3dIZWFkZXIoKVxuICAgICAgdGhpcy5fdW5ncmFiSW5wdXQoKVxuICAgICAgLy8gUmVtb3ZlIHRoZSByZXNpemUgbGlzdGVuZXJzXG4gICAgICBpZiAod2luZG93KSB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5faGFuZGxlUmVzaXplKVxuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50ICgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5zaG93SGVhZGVyICYmIHRoaXMuc3RhdGUuaGVhZGVyKSB0aGlzLnByb3BzLnNob3dIZWFkZXIoKVxuICAgIGlmICh3aW5kb3cpIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9oYW5kbGVSZXNpemUpXG5cbiAgICBpZiAodGhpcy5yZmIpIHRoaXMuZGlzY29ubmVjdERpc3BsYXkoKVxuXG4gICAgdGhpcy5fY2xlYXJUaW1lcigpXG4gIH1cblxuICBfZ3JhYklucHV0ICgpIHtcbiAgICBpZiAodGhpcy5yZmIpIHtcbiAgICAgIGlmICh0aGlzLnJmYi5nZXRfa2V5Ym9hcmQpIHRoaXMucmZiLmdldF9rZXlib2FyZCgpLmdyYWIoKVxuICAgICAgaWYgKHRoaXMucmZiLmdldF9tb3VzZSkgdGhpcy5yZmIuZ2V0X21vdXNlKCkuZ3JhYigpXG4gICAgfVxuICB9XG5cbiAgX3VuZ3JhYklucHV0ICgpIHtcbiAgICBpZiAodGhpcy5yZmIpIHtcbiAgICAgIGlmICh0aGlzLnJmYi5nZXRfa2V5Ym9hcmQpIHRoaXMucmZiLmdldF9rZXlib2FyZCgpLnVuZ3JhYigpXG4gICAgICBpZiAodGhpcy5yZmIuZ2V0X21vdXNlKSB0aGlzLnJmYi5nZXRfbW91c2UoKS51bmdyYWIoKVxuICAgIH1cbiAgfVxuXG4gIF9pbml0VGltZXIgKGNhbGxiYWNrLCBzZWNvbmRzID0gMTApIHtcbiAgICB0aGlzLl9jbGVhclRpbWVyKClcbiAgICB0aGlzLl90aW1lclJlZiA9IHNldFRpbWVvdXQoY2FsbGJhY2suYmluZCh0aGlzKSwgc2Vjb25kcyAqIDEwMDApXG4gIH1cblxuICBfY2xlYXJUaW1lciAoKSB7XG4gICAgaWYgKHRoaXMuX3RpbWVyUmVmKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXJSZWYpXG4gICAgICB0aGlzLl90aW1lclJlZiA9IG51bGxcbiAgICB9XG4gIH1cblxuICBfaGFuZGxlUGFzc1N1Ym1pdCAocGFzcykge1xuICAgIHRoaXMuc2V0U3RhdGUoeyBzaG93UGFzc0Zvcm06IGZhbHNlIH0pXG4gICAgLy8gUGVyZm9ybSBhIHJlYWwgY29ubmVjdGlvblxuICAgIC8vIEhhY2sgdG8gcGFzcyB0aGUgbW9kZSB0byB0aGUgRmFrZVdlYlNvY2tldFxuICAgIHRoaXMuX2Nvbm5lY3RSRkIoUFJPVE8uRElTUExBWSwgcGFzcylcbiAgICB0aGlzLl9pbml0VGltZXIodGhpcy5kaXNjb25uZWN0RGlzcGxheSlcbiAgfVxuXG4gIF9nZXREaXNwbGF5U2l6ZSAoKSB7XG4gICAgY29uc3QgeyBpc0Z1bGxzY3JlZW4gfSA9IHRoaXMuc3RhdGVcblxuICAgIGlmIChpc0Z1bGxzY3JlZW4pIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gd2luZG93LmlubmVyV2lkdGggfHxcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIHx8XG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGhcbiAgICAgIGNvbnN0IGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodCB8fFxuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IHx8XG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0XG4gICAgICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdXG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhlaWdodFdpbmRvdyA9IE51bWJlci5pc05hTih3aW5kb3cuaW5uZXJIZWlnaHQpXG4gICAgICAgID8gd2luZG93LmNsaWVudEhlaWdodFxuICAgICAgICA6IHdpbmRvdy5pbm5lckhlaWdodFxuICAgICAgY29uc3QgaGVpZ2h0VG9Ub3AgPSB0aGlzLmRpc3BsYXlSZWYub2Zmc2V0VG9wXG4gICAgICBjb25zdCB3aWR0aCA9IHRoaXMubWFpbkRpdlJlZi5vZmZzZXRXaWR0aFxuICAgICAgY29uc3QgaGVpZ2h0ID0gKGhlaWdodFdpbmRvdyAtIGhlaWdodFRvVG9wIC0gMTApXG4gICAgICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdXG4gICAgfVxuICB9XG5cbiAgX2hhbmRsZVJlc2l6ZSAoZXZlbnQpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5pc0Nvbm5lY3RlZCAmJiB0aGlzLnJmYikge1xuICAgICAgY29uc3QgWyB3aWR0aCwgaGVpZ2h0IF0gPSB0aGlzLl9nZXREaXNwbGF5U2l6ZSgpXG4gICAgICBjb25zdCBzY2FsZVJhdGlvID0gdGhpcy5yZmIuZ2V0X2Rpc3BsYXkoKS5hdXRvc2NhbGUod2lkdGgsIGhlaWdodCwgdHJ1ZSlcbiAgICAgIHRoaXMucmZiLmdldF9tb3VzZSgpLnNldF9zY2FsZShzY2FsZVJhdGlvKVxuICAgIH1cbiAgfVxuXG4gIHJlcXVlc3RGdWxsc2NyZWVuICgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5oaWRlSGVhZGVyKSB0aGlzLnByb3BzLmhpZGVIZWFkZXIoKVxuICAgIHRoaXMuc2V0U3RhdGUoeyBpc0Z1bGxzY3JlZW46IHRydWUgfSlcbiAgfVxuXG4gIGV4aXRGdWxsc2NyZWVuICgpIHtcbiAgICBpZiAodGhpcy5wcm9wcy5zaG93SGVhZGVyICYmIHRoaXMuc3RhdGUuaGVhZGVyKSB0aGlzLnByb3BzLnNob3dIZWFkZXIoKVxuICAgIHRoaXMuc2V0U3RhdGUoeyBpc0Z1bGxzY3JlZW46IGZhbHNlIH0pXG4gIH1cblxuICBfb25VcGRhdGVTdGF0ZSAocmZiLCBzdGF0ZSwgb2xkc3RhdGUpIHtcbiAgICBsb2dnZXIubG9nKCdbUkZCXScsICdzdGF0ZTonLCBzdGF0ZSwgJ29sZCBzdGF0ZTonLCBvbGRzdGF0ZSlcblxuICAgIGlmIChzdGF0ZSA9PT0gJ2Nvbm5lY3QnKSB7XG4gICAgICB0aGlzLnByb3BzLmNvbm5lY3Rpb25EaXNwbGF5UmVxdWVzdCgpXG4gICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gJ2Nvbm5lY3RlZCcpIHtcbiAgICAgIHRoaXMuX2NsZWFyVGltZXIoKVxuICAgICAgdGhpcy5wcm9wcy5jb25uZWN0aW9uRGlzcGxheVN1Y2Nlc3MoKVxuICAgICAgdGhpcy5faGFuZGxlUmVzaXplKClcbiAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAnZGlzY29ubmVjdCcpIHtcbiAgICAgIHRoaXMucHJvcHMuZGlzY29ubmVjdGlvbkRpc3BsYXlSZXF1ZXN0KClcbiAgICB9IGVsc2UgaWYgKHN0YXRlID09PSAnZGlzY29ubmVjdGVkJykge1xuICAgICAgdGhpcy5leGl0RnVsbHNjcmVlbigpXG4gICAgICB0aGlzLnByb3BzLmRpc2Nvbm5lY3Rpb25EaXNwbGF5U3VjY2VzcygpXG4gICAgfVxuICB9XG5cbiAgX29uRGlzY29ubmVjdGVkIChyZmIsIHJlYXNvbikge1xuICAgIGlmIChyZWFzb24gJiYgcmVhc29uLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdWTkMgZXJyb3InKVxuICAgICAgZXJyb3IucmVzcG9uc2UgPSB7IGNvZGU6IDUwMCwgcmVhc29uIH1cbiAgICAgIHRoaXMucHJvcHMuY29ubmVjdGlvbkRpc3BsYXlGYWlsdXJlKGVycm9yKVxuICAgIH1cbiAgfVxuXG4gIGNvbm5lY3REaXNwbGF5ICgpIHtcbiAgICBjb25zdCB7XG4gICAgICB0cnVlQ29sb3IsIGxvY2FsQ3Vyc29yLCBzaGFyZWQsIHZpZXdPbmx5XG4gICAgfSA9IHRoaXMucHJvcHNcblxuICAgIHRoaXMucmZiID0gbmV3IFJGQih7XG4gICAgICB0YXJnZXQ6IHRoaXMuZGlzcGxheVJlZixcbiAgICAgIHdzUHJvdG9jb2xzOiBbJ2JpbmFyeSddLFxuICAgICAgdHJ1ZV9jb2xvcjogdHJ1ZUNvbG9yLFxuICAgICAgbG9jYWxfY3Vyc29yOiBsb2NhbEN1cnNvcixcbiAgICAgIHNoYXJlZDogc2hhcmVkLFxuICAgICAgdmlld19vbmx5OiB2aWV3T25seSxcbiAgICAgIHZpZXdwb3J0RHJhZzogZmFsc2UsXG4gICAgICBvblVwZGF0ZVN0YXRlOiB0aGlzLl9vblVwZGF0ZVN0YXRlLFxuICAgICAgb25EaXNjb25uZWN0ZWQ6IHRoaXMuX29uRGlzY29ubmVjdGVkLFxuICAgICAgb25DbGlwYm9hcmQ6IHRoaXMuX29uQ2xpcGJvYXJkUmVjZWl2ZSxcbiAgICAgIG9uUGFzc3dvcmRSZXF1aXJlZDogKHJmYikgPT4gbG9nZ2VyLmxvZygnW1JGQl0nLCAnUGFzc3dvcmQgcmVxdWlyZWQnKVxuICAgIH0pXG5cbiAgICAvLyBIYWNrIHRvIHBhc3MgdGhlIG1vZGUgdG8gdGhlIEZha2VXZWJTb2NrZXRcbiAgICB0aGlzLl9jb25uZWN0UkZCKFBST1RPLkRJU1BMQVkpXG4gIH1cblxuICBkaXNjb25uZWN0RGlzcGxheSAoKSB7XG4gICAgdGhpcy5wcm9wcy5kaXNjb25lY3REaXNwbGF5KClcbiAgICBpZiAodGhpcy5yZmIgJiYgdGhpcy5yZmIuX3JmYl9jb25uZWN0aW9uX3N0YXRlICE9PSAnZGlzY29ubmVjdGVkJykge1xuICAgICAgdGhpcy5yZmIuZGlzY29ubmVjdCgpXG4gICAgICAvLyBIQUNLOiBUbyBoaWRlIHRoZSBjYW52YXMgc2luY2UgdGhlIGNsZWFyUmVjdCBmdW5jdGlvblxuICAgICAgLy8gY2FsbGVkIGluc2lkZSB0aGlzLnJmYi5kaXNjb25uZWN0KCkgZG9lcyBub3Qgd29ya1xuICAgICAgdGhpcy5kaXNwbGF5UmVmLmhlaWdodCA9IDBcbiAgICB9XG4gIH1cbn1cblxuRGlzcGxheS5wcm9wVHlwZXMgPSB7XG4gIHNob3c6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBoZWFkZXI6IFJlYWN0LlByb3BUeXBlcy5ib29sLmlzUmVxdWlyZWQsXG4gIGlzQWdlbnRDb25uZWN0ZWQ6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBpc0FnZW50QXV0aGVudGljYXRlZDogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG5cbiAgaXNDb25uZWN0aW5nOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaXNEaXNjb25uZWN0aW5nOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaXNDb25uZWN0ZWQ6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBlcnJvcjogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGVycm9yTWVzc2FnZTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcblxuICB0cnVlQ29sb3I6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBsb2NhbEN1cnNvcjogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIHNoYXJlZDogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIHZpZXdPbmx5OiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcblxuICB1cGRhdGVEaXNwbGF5RGF0YTogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgY29ubmVjdGlvbkRpc3BsYXlSZXF1ZXN0OiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBjb25uZWN0aW9uRGlzcGxheVN1Y2Nlc3M6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGNvbm5lY3Rpb25EaXNwbGF5RmFpbHVyZTogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgZGlzY29uZWN0RGlzcGxheTogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgZGlzY29ubmVjdGlvbkRpc3BsYXlSZXF1ZXN0OiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBkaXNjb25uZWN0aW9uRGlzcGxheVN1Y2Nlc3M6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGNsZWFyRGlzcGxheUVycm9yOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBzaG93SGVhZGVyOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBoaWRlSGVhZGVyOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkXG59XG5EaXNwbGF5LmRlZmF1bHRQcm9wcyA9IHtcbiAgc2hvdzogZmFsc2UsXG4gIGlzQWdlbnRDb25uZWN0ZWQ6IGZhbHNlLFxuICBpc0FnZW50QXV0aGVudGljYXRlZDogZmFsc2UsXG5cbiAgaXNDb25uZWN0aW5nOiBmYWxzZSxcbiAgaXNEaXNjb25uZWN0aW5nOiBmYWxzZSxcbiAgaXNDb25uZWN0ZWQ6IGZhbHNlLFxuICBlcnJvcjogZmFsc2UsXG4gIGVycm9yTWVzc2FnZTogJycsXG5cbiAgdHJ1ZUNvbG9yOiB0cnVlLFxuICBsb2NhbEN1cnNvcjogdHJ1ZSxcbiAgc2hhcmVkOiB0cnVlLFxuICB2aWV3T25seTogZmFsc2Vcbn1cblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgYXBwLCBhZ2VudCwgZGlzcGxheSB9KSA9PiB7XG4gIGNvbnN0IGFjdGl2ZVNlY3Rpb24gPSBnZXRBY3RpdmVTZWN0aW9uKGFwcClcbiAgY29uc3QgZGlzcGxheVNlY3Rpb24gPSBnZXRTZWN0aW9uKGFwcCwgYWN0aXZlU2VjdGlvbilcbiAgY29uc3QgeyBzaG93SGVhZGVyOiBoZWFkZXIgfSA9IGFwcFxuICBjb25zdCB7XG4gICAgaXNDb25uZWN0ZWQ6IGlzQWdlbnRDb25uZWN0ZWQsIGlzQXV0aGVudGljYXRlZDogaXNBZ2VudEF1dGhlbnRpY2F0ZWRcbiAgfSA9IGFnZW50XG4gIGNvbnN0IHtcbiAgICBpc0Nvbm5lY3RpbmcsIGlzRGlzY29ubmVjdGluZywgaXNDb25uZWN0ZWQsXG4gICAgZXJyb3IsIGVycm9yTWVzc2FnZSxcbiAgICB0cnVlQ29sb3IsIGxvY2FsQ3Vyc29yLCBzaGFyZWQsIHZpZXdPbmx5LCB3aWxsTmVlZFBhc3MsIHNob3dQYXNzRm9ybVxuICB9ID0gZGlzcGxheVxuXG4gIHJldHVybiB7XG4gICAgLy8gQXBwXG4gICAgc2hvdzogYWN0aXZlU2VjdGlvbiA9PT0gJ2Rpc3BsYXknICYmIGRpc3BsYXlTZWN0aW9uLmFsbG93LFxuICAgIGhlYWRlcixcbiAgICAvLyBBZ2VudFxuICAgIGlzQWdlbnRDb25uZWN0ZWQsXG4gICAgaXNBZ2VudEF1dGhlbnRpY2F0ZWQsXG4gICAgLy8gRGlzcGxheVxuICAgIGlzQ29ubmVjdGluZyxcbiAgICBpc0Rpc2Nvbm5lY3RpbmcsXG4gICAgaXNDb25uZWN0ZWQsXG4gICAgZXJyb3IsXG4gICAgZXJyb3JNZXNzYWdlLFxuICAgIHRydWVDb2xvcixcbiAgICBsb2NhbEN1cnNvcixcbiAgICBzaGFyZWQsXG4gICAgdmlld09ubHksXG4gICAgd2lsbE5lZWRQYXNzLFxuICAgIHNob3dQYXNzRm9ybVxuICB9XG59XG5jb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSAoZGlzcGF0Y2gpID0+IHtcbiAgcmV0dXJuIHtcbiAgICB1cGRhdGVEaXNwbGF5RGF0YTogKGRhdGEpID0+IGRpc3BhdGNoKHVwZGF0ZURpc3BsYXlEYXRhKGRhdGEpKSxcbiAgICBjb25uZWN0aW9uRGlzcGxheVJlcXVlc3Q6ICgpID0+IGRpc3BhdGNoKGNvbm5lY3Rpb25EaXNwbGF5UmVxdWVzdCgpKSxcbiAgICBjb25uZWN0aW9uRGlzcGxheVN1Y2Nlc3M6ICgpID0+IGRpc3BhdGNoKGNvbm5lY3Rpb25EaXNwbGF5U3VjY2VzcygpKSxcbiAgICBjb25uZWN0aW9uRGlzcGxheUZhaWx1cmU6IChlcnIpID0+IGRpc3BhdGNoKGNvbm5lY3Rpb25EaXNwbGF5RmFpbHVyZShlcnIpKSxcbiAgICBkaXNjb25lY3REaXNwbGF5OiAoKSA9PiBkaXNwYXRjaChkaXNjb25lY3REaXNwbGF5KCkpLFxuICAgIGRpc2Nvbm5lY3Rpb25EaXNwbGF5UmVxdWVzdDogKCkgPT4gZGlzcGF0Y2goZGlzY29ubmVjdGlvbkRpc3BsYXlSZXF1ZXN0KCkpLFxuICAgIGRpc2Nvbm5lY3Rpb25EaXNwbGF5U3VjY2VzczogKCkgPT4gZGlzcGF0Y2goZGlzY29ubmVjdGlvbkRpc3BsYXlTdWNjZXNzKCkpLFxuICAgIGNsZWFyRGlzcGxheUVycm9yOiAoKSA9PiBkaXNwYXRjaChjbGVhckRpc3BsYXlFcnJvcigpKSxcbiAgICBzaG93SGVhZGVyOiAoKSA9PiBkaXNwYXRjaChzaG93SGVhZGVyKCkpLFxuICAgIGhpZGVIZWFkZXI6ICgpID0+IGRpc3BhdGNoKGhpZGVIZWFkZXIoKSlcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoRGlzcGxheSlcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJ1dHRvbiwgR2x5cGhpY29uLCBPdmVybGF5VHJpZ2dlciwgVG9vbHRpcCB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcbmltcG9ydCB7IGRlZmluZU1lc3NhZ2VzLCBGb3JtYXR0ZWRNZXNzYWdlIH0gZnJvbSAncmVhY3QtaW50bCdcblxuLy8gTWVzc2FnZXMgZGVmaW5pdGlvbnNcbmNvbnN0IG1lc3NhZ2VzID0gZGVmaW5lTWVzc2FnZXMoe1xuICBrZXlib2FyZDoge1xuICAgIGlkOiAna2V5Ym9hcmQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnS2V5Ym9hcmQnXG4gIH1cbn0pXG5cbmNsYXNzIEtleWJvYXJkQnV0dG9uIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgZm9jdXNlZDogZmFsc2VcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZUZvY3VzID0gKGUpID0+IHRoaXMuc2V0U3RhdGUoeyBmb2N1c2VkOiB0cnVlIH0pXG4gICAgdGhpcy5oYW5kbGVCbHVyID0gKGUpID0+IHRoaXMuc2V0U3RhdGUoeyBmb2N1c2VkOiBmYWxzZSB9KVxuXG4gICAgdGhpcy5zaG93VmlydHVhbEtleWJvYXJkID0gKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSB0aGlzLnJlZnMuaW5wdXRcbiAgICAgIGlmICghdGhpcy5zdGF0ZS5mb2N1c2VkKSB7XG4gICAgICAgIGlucHV0LmZvY3VzKClcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGwgPSBpbnB1dC52YWx1ZS5sZW5ndGhcbiAgICAgICAgICAvLyBNb3ZlIHRoZSBjYXJldCB0byB0aGUgZW5kXG4gICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UobCwgbClcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7fSAvLyBzZXRTZWxlY3Rpb25SYW5nZSBpcyB1bmRlZmluZWQgaW4gR29vZ2xlIENocm9tZVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaGlkZVZpcnR1YWxLZXlib2FyZCA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmZvY3VzZWQpIHRoaXMucmVmcy5pbnB1dC5ibHVyKClcbiAgICB9XG5cbiAgICB0aGlzLnRvZ2dsZVZpcnR1YWxLZXlib2FyZCA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnN0YXRlLmZvY3VzZWQpIHRoaXMuaGlkZVZpcnR1YWxLZXlib2FyZCgpXG4gICAgICBlbHNlIHRoaXMuc2hvd1ZpcnR1YWxLZXlib2FyZCgpXG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVDaGFuZ2UgPSAoZSkgPT4ge1xuICAgICAgY29uc3QgeyBvblZpcnR1YWxLZXlib2FyZFVzZWQgfSA9IHRoaXMucHJvcHNcbiAgICAgIGlmIChvblZpcnR1YWxLZXlib2FyZFVzZWQpIG9uVmlydHVhbEtleWJvYXJkVXNlZChlLnRhcmdldC52YWx1ZSlcbiAgICB9XG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IGludmlzaWJsZUlucHV0ID0ge1xuICAgICAgd2lkdGg6ICcwJyxcbiAgICAgIGhlaWdodDogJzAnLFxuICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICBvdXRsaW5lOiAnbm9uZSdcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAgPE92ZXJsYXlUcmlnZ2VyXG4gICAgICAgICAgcGxhY2VtZW50PSdib3R0b20nXG4gICAgICAgICAgb3ZlcmxheT17XG4gICAgICAgICAgICA8VG9vbHRpcCBpZD0nZGlzcC10b29sdGlwLWtleWJvYXJkJz5cbiAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLmtleWJvYXJkfSAvPlxuICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgIH0+XG4gICAgICAgICAgPEJ1dHRvbiBvbkNsaWNrPXt0aGlzLnRvZ2dsZVZpcnR1YWxLZXlib2FyZH0+XG4gICAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdwZW5jaWwnIC8+XG4gICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgIDwvT3ZlcmxheVRyaWdnZXI+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIGlkPSdrZXlib2FyZC1pbnB1dCdcbiAgICAgICAgICByZWY9J2lucHV0J1xuICAgICAgICAgIHR5cGU9J3RleHQnXG4gICAgICAgICAgYXV0b0NhcGl0YWxpemU9J29mZidcbiAgICAgICAgICBhdXRvQ29ycmVjdD0nb2ZmJ1xuICAgICAgICAgIGF1dG9Db21wbGV0ZT0nb2ZmJ1xuICAgICAgICAgIHNwZWxsQ2hlY2s9J2ZhbHNlJ1xuICAgICAgICAgIHZhbHVlPScnIC8vIENvbnRyb2xsZWRcbiAgICAgICAgICBvbkNoYW5nZT17dGhpcy5oYW5kbGVDaGFuZ2V9XG4gICAgICAgICAgb25Gb2N1cz17dGhpcy5oYW5kbGVGb2N1c31cbiAgICAgICAgICBvbkJsdXI9e3RoaXMuaGFuZGxlQmx1cn1cbiAgICAgICAgICBzdHlsZT17aW52aXNpYmxlSW5wdXR9IC8+XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cbn1cblxuS2V5Ym9hcmRCdXR0b24ucHJvcFR5cGVzID0ge1xuICBvblZpcnR1YWxLZXlib2FyZFVzZWQ6IFJlYWN0LlByb3BUeXBlcy5mdW5jXG59XG5cbmV4cG9ydCBkZWZhdWx0IEtleWJvYXJkQnV0dG9uXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgS2V5cyBmcm9tICdAbnJheW5hdWQvbm92bmMvbGliL2lucHV0L2tleXN5bSdcbmltcG9ydCB7IGluamVjdEludGwgfSBmcm9tICdyZWFjdC1pbnRsJ1xuXG5jb25zdCBDVFJMX0FMVF9ERUwgPSAnQ1RSTF9BTFRfREVMJ1xuY29uc3QgQ1RSTF9TSElGVF9FU0MgPSAnQ1RSTF9TSElGVF9FU0MnXG5cbmNsYXNzIERpc3BsYXlLZXlzQnV0dG9uIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICB0aGlzLnNlbmRLZXkgPSB0aGlzLnByb3BzLnNlbmRLZXkgPyB0aGlzLnByb3BzLnNlbmRLZXkgOiAoKSA9PiB7fVxuICAgIHRoaXMuc2VuZEtleXMgPSAodmFsdWUpID0+IHtcbiAgICAgIHRoaXMuZ2V0Q29tYmluYXRpb24odmFsdWUpKHRoaXMuc2VuZEtleSlcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVDb21iU3VibWl0ID0gKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICB0aGlzLnNlbmRLZXlzKGV2ZW50LnRhcmdldC5jb21iaW5hdGlvbi52YWx1ZSlcbiAgICB9XG5cbiAgICAvLyBNZXNzYWdlcyBkZWZpbml0aW9uc1xuICAgIHRoaXMubWVzc2FnZXMgPSB7XG4gICAgICBzZW5kOiB7XG4gICAgICAgIGlkOiAnc2VuZCcsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnU2VuZCdcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IGRlZmluZU1lc3NhZ2UgPSB0aGlzLnByb3BzLmludGwuZm9ybWF0TWVzc2FnZVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxmb3JtXG4gICAgICAgIGlkPSdkaXNwbGF5LWtleXMtYnV0dG9uJ1xuICAgICAgICBjbGFzc05hbWU9J2Zvcm0taW5saW5lJ1xuICAgICAgICBvblN1Ym1pdD17dGhpcy5oYW5kbGVDb21iU3VibWl0fVxuICAgICAgICBzdHlsZT17eyBkaXNwbGF5OiAnaW5saW5lJyB9fT5cbiAgICAgICAgPHNlbGVjdFxuICAgICAgICAgIHR5cGU9J3NlbGVjdCdcbiAgICAgICAgICBuYW1lPSdjb21iaW5hdGlvbidcbiAgICAgICAgICBjbGFzc05hbWU9J2Zvcm0tY29udHJvbCdcbiAgICAgICAgICBzdHlsZT17eyBkaXNwbGF5OiAnaW5saW5lJywgd2lkdGg6ICdhdXRvJyB9fT5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPXtDVFJMX0FMVF9ERUx9PkN0cmwrQWx0K0RlbDwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9e0NUUkxfU0hJRlRfRVNDfT5DdHJsK1NoaWZ0K0VzYzwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgdHlwZT0nc3VibWl0J1xuICAgICAgICAgIHZhbHVlPXtkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuc2VuZCl9XG4gICAgICAgICAgY2xhc3NOYW1lPSdidG4gYnRuLWRlZmF1bHQnXG4gICAgICAgICAgc3R5bGU9e3sgZmxvYXQ6ICdub25lJyB9fSAvPlxuICAgICAgPC9mb3JtPlxuICAgIClcbiAgfVxuXG4gIGdldENvbWJpbmF0aW9uICh2YWx1ZSkge1xuICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgIGNhc2UgQ1RSTF9BTFRfREVMOlxuICAgICAgICByZXR1cm4gdGhpcy5zZW5kQ3RybEFsdERlbFxuICAgICAgY2FzZSBDVFJMX1NISUZUX0VTQzpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZEN0cmxTaGlmdEVzY1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICgpID0+IHt9XG4gICAgfVxuICB9XG5cbiAgc2VuZEN0cmxBbHREZWwgKHNlbmRLZXkpIHtcbiAgICBzZW5kS2V5KEtleXMuWEtfQ29udHJvbF9MLCAxKVxuICAgIHNlbmRLZXkoS2V5cy5YS19BbHRfTCwgMSlcbiAgICBzZW5kS2V5KEtleXMuWEtfRGVsZXRlLCAxKVxuICAgIHNlbmRLZXkoS2V5cy5YS19EZWxldGUsIDApXG4gICAgc2VuZEtleShLZXlzLlhLX0FsdF9MLCAwKVxuICAgIHNlbmRLZXkoS2V5cy5YS19Db250cm9sX0wsIDApXG4gIH1cblxuICBzZW5kQ3RybFNoaWZ0RXNjIChzZW5kS2V5KSB7XG4gICAgc2VuZEtleShLZXlzLlhLX0NvbnRyb2xfTCwgMSlcbiAgICBzZW5kS2V5KEtleXMuWEtfU2hpZnRfTCwgMSlcbiAgICBzZW5kS2V5KEtleXMuWEtfRXNjYXBlLCAxKVxuICAgIHNlbmRLZXkoS2V5cy5YS19Fc2NhcGUsIDApXG4gICAgc2VuZEtleShLZXlzLlhLX1NoaWZ0X0wsIDApXG4gICAgc2VuZEtleShLZXlzLlhLX0NvbnRyb2xfTCwgMClcbiAgfVxufVxuXG5EaXNwbGF5S2V5c0J1dHRvbi5wcm9wVHlwZXMgPSB7XG4gIHNlbmRLZXk6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGludGw6IFJlYWN0LlByb3BUeXBlcy5vYmplY3Rcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5qZWN0SW50bChEaXNwbGF5S2V5c0J1dHRvbilcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7XG4gIE1vZGFsLCBCdXR0b24sIEdseXBoaWNvbiwgRm9ybUdyb3VwLCBJbnB1dEdyb3VwLCBGb3JtQ29udHJvbFxufSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQgeyBpbmplY3RJbnRsIH0gZnJvbSAncmVhY3QtaW50bCdcblxuY2xhc3MgRGlzcGxheVBhc3NGb3JtIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICB0aGlzLmhhbmRsZUNsb3NlID0gdGhpcy5wcm9wcy5oYW5kbGVDbG9zZVxuICAgICAgPyAoZXZlbnQpID0+IHRoaXMucHJvcHMuaGFuZGxlQ2xvc2UoKVxuICAgICAgOiAoKSA9PiB7fVxuICAgIHRoaXMuaGFuZGxlU3VibWl0ID0gKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICB0aGlzLnByb3BzLmhhbmRsZVN1Ym1pdChldmVudC50YXJnZXRbJ2Rpc3BsYXktcGFzcyddLnZhbHVlKVxuICAgIH1cblxuICAgIHRoaXMubWVzc2FnZXMgPSB7XG4gICAgICBkaXNwbGF5UGFzc3dvcmQ6IHtcbiAgICAgICAgaWQ6ICdkaXNwbGF5UGFzc3dvcmQnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0Rpc3BsYXkgcGFzc3dvcmQnXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IHNob3cgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCBkZWZpbmVNZXNzYWdlID0gdGhpcy5wcm9wcy5pbnRsLmZvcm1hdE1lc3NhZ2VcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGlkPSdkaXNwbGF5LXBhc3MtZm9ybSc+XG4gICAgICAgIDxNb2RhbFxuICAgICAgICAgIHNob3c9e3Nob3d9XG4gICAgICAgICAga2V5Ym9hcmQ9e2ZhbHNlfVxuICAgICAgICAgIGJhY2tkcm9wPSdzdGF0aWMnXG4gICAgICAgICAgb25IaWRlPXt0aGlzLmhhbmRsZUNsb3NlfVxuICAgICAgICAgIGJzU2l6ZT0nc21hbGwnXG4gICAgICAgICAgYXJpYS1sYWJlbGxlZGJ5PSdjb250YWluZWQtbW9kYWwtdGl0bGUtc20nPlxuICAgICAgICAgIDxNb2RhbC5IZWFkZXIgY2xvc2VCdXR0b249e2ZhbHNlfT5cbiAgICAgICAgICAgIDxNb2RhbC5UaXRsZSBpZD0nY29udGFpbmVkLW1vZGFsLXRpdGxlLXNtJz5cbiAgICAgICAgICAgICAgeyBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuZGlzcGxheVBhc3N3b3JkKSB9XG4gICAgICAgICAgICA8L01vZGFsLlRpdGxlPlxuICAgICAgICAgIDwvTW9kYWwuSGVhZGVyPlxuICAgICAgICAgIDxNb2RhbC5Cb2R5PlxuICAgICAgICAgICAgPGZvcm0gb25TdWJtaXQ9e3RoaXMuaGFuZGxlU3VibWl0fT5cbiAgICAgICAgICAgICAgPEZvcm1Hcm91cD5cbiAgICAgICAgICAgICAgICA8SW5wdXRHcm91cD5cbiAgICAgICAgICAgICAgICAgIDxJbnB1dEdyb3VwLkJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiB0eXBlPSdzdWJtaXQnIGJzU3R5bGU9J3ByaW1hcnknPlxuICAgICAgICAgICAgICAgICAgICAgIDxHbHlwaGljb24gZ2x5cGg9J29rJyAvPlxuICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvSW5wdXRHcm91cC5CdXR0b24+XG4gICAgICAgICAgICAgICAgICA8Rm9ybUNvbnRyb2xcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Q2xhc3M9J2lucHV0J1xuICAgICAgICAgICAgICAgICAgICBhdXRvRm9jdXNcbiAgICAgICAgICAgICAgICAgICAgb25Gb2N1cz17KGUpID0+IGUudGFyZ2V0LnNlbGVjdCgpfVxuICAgICAgICAgICAgICAgICAgICBuYW1lPSdkaXNwbGF5LXBhc3MnXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9J3Bhc3N3b3JkJ1xuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0nUGFzc3dvcmQnXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIC8+XG4gICAgICAgICAgICAgICAgPC9JbnB1dEdyb3VwPlxuICAgICAgICAgICAgICA8L0Zvcm1Hcm91cD5cbiAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICA8L01vZGFsLkJvZHk+XG4gICAgICAgIDwvTW9kYWw+XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cbn1cblxuRGlzcGxheVBhc3NGb3JtLnByb3BUeXBlcyA9IHtcbiAgc2hvdzogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGhhbmRsZUNsb3NlOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgaGFuZGxlU3VibWl0OiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBpbnRsOiBSZWFjdC5Qcm9wVHlwZXMub2JqZWN0XG59XG5EaXNwbGF5UGFzc0Zvcm0uZGVmYXVsdFByb3BzID0ge1xuICBzaG93OiBmYWxzZVxufVxuXG5leHBvcnQgZGVmYXVsdCBpbmplY3RJbnRsKERpc3BsYXlQYXNzRm9ybSlcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGVsbGlwc2l6ZSB9IGZyb20gJy4uL2NvbW1vbi9saWIvdXRpbCdcblxuLypcbiAqIEN1dHMgdGhlIHRleHQgKGNoaWxkcmVuKSBpZiB0aGVpciBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIHRoZSBzZWxlY3RlZFxuICogbWF4IGxlbmd0aCBhbmQgYXBwbGllcyB0aGUgc2VsZWN0ZWQgZWxsaXBzZSB0byB0aGUgcmVzdWx0IHRleHQuXG4gKi9cbmNvbnN0IEVsbGlwc2l6ZSA9ICh7IGNoaWxkcmVuLCBtYXgsIGVsbGlwc2UgfSkgPT4gKFxuICA8c3BhbiB0aXRsZT17Y2hpbGRyZW59PlxuICAgIHsgISFjaGlsZHJlbiAmJiBlbGxpcHNpemUoY2hpbGRyZW4sIG1heCwgZWxsaXBzZSkgfVxuICA8L3NwYW4+XG4pXG5cbkVsbGlwc2l6ZS5wcm9wVHlwZXMgPSB7XG4gIGNoaWxkcmVuOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBtYXg6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIGVsbGlwc2U6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmdcbn1cblxuZXhwb3J0IGRlZmF1bHQgRWxsaXBzaXplXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgY2xhc3NuYW1lcyBmcm9tICdjbGFzc25hbWVzJ1xuaW1wb3J0IHsgR2x5cGhpY29uIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuXG5jbGFzcyBCcmVhZGNydW1icyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy5wYXJzZVBhdGhuYW1lID0gKHBhdGhuYW1lLCBzZXBhcmF0b3IpID0+IHtcbiAgICAgIHJldHVybiBwYXRobmFtZVxuICAgICAgICAuc3BsaXQoc2VwYXJhdG9yKVxuICAgICAgICAuZmlsdGVyKChpdGVtKSA9PiBpdGVtICYmIGl0ZW0ubGVuZ3RoID4gMClcbiAgICAgICAgLm1hcCgoYmFzZW5hbWUsIGluZGV4LCBiYXNlbmFtZXMpID0+ICh7XG4gICAgICAgICAgcGF0aG5hbWU6IGJhc2VuYW1lcy5zbGljZSgwLCBpbmRleCArIDEpLmpvaW4oc2VwYXJhdG9yKSxcbiAgICAgICAgICBiYXNlbmFtZSxcbiAgICAgICAgICBhY3RpdmU6IChpbmRleCA9PT0gYmFzZW5hbWVzLmxlbmd0aCAtIDEpXG4gICAgICAgIH0pKVxuICAgIH1cbiAgICB0aGlzLmhhbmRsZUNsaWNrID0gKHR5cGVvZiB0aGlzLnByb3BzLm9uU2VsZWN0aW9uID09PSAnZnVuY3Rpb24nKVxuICAgICAgPyAocGF0aG5hbWUgPSAnJykgPT4gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvcHMub25TZWxlY3Rpb24ocGF0aG5hbWUpXG4gICAgICB9XG4gICAgICA6ICgpID0+IChldmVudCkgPT4ge31cbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBwYXRobmFtZSwgc2VwYXJhdG9yIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLnBhcnNlUGF0aG5hbWUocGF0aG5hbWUsIHNlcGFyYXRvcilcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0nZmlsZXMtYnJlYWRjcnVtYnMnPlxuICAgICAgICA8b2wgY2xhc3NOYW1lPSdicmVhZGNydW1iJz5cbiAgICAgICAgICA8bGkgY2xhc3NOYW1lPXtjbGFzc25hbWVzKHsgYWN0aXZlOiBpdGVtcy5sZW5ndGggPD0gMCB9KX0+XG4gICAgICAgICAgICB7IGl0ZW1zLmxlbmd0aCA8PSAwICYmIDxHbHlwaGljb24gZ2x5cGg9J2hvbWUnIC8+IH1cbiAgICAgICAgICAgIHsgaXRlbXMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICA8YSBocmVmPScvJyBvbkNsaWNrPXt0aGlzLmhhbmRsZUNsaWNrKCl9PlxuICAgICAgICAgICAgICAgIDxHbHlwaGljb24gZ2x5cGg9J2hvbWUnIC8+XG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2xpPlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGl0ZW1zLm1hcCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzbmFtZXMoeyBhY3RpdmU6IGl0ZW0uYWN0aXZlIH0pfT5cbiAgICAgICAgICAgICAgICAgIHsgaXRlbS5hY3RpdmUgJiZcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5iYXNlbmFtZVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgeyAhaXRlbS5hY3RpdmUgJiZcbiAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICBocmVmPXtpdGVtLnBhdGhuYW1lfVxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuaGFuZGxlQ2xpY2soaXRlbS5wYXRobmFtZSl9PlxuICAgICAgICAgICAgICAgICAgICAgIHsgaXRlbS5iYXNlbmFtZSB9XG4gICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgPC9vbD5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxufVxuXG5CcmVhZGNydW1icy5wcm9wVHlwZXMgPSB7XG4gIHBhdGhuYW1lOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIHNlcGFyYXRvcjogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgb25TZWxlY3Rpb246IFJlYWN0LlByb3BUeXBlcy5mdW5jXG59XG5CcmVhZGNydW1icy5kZWZhdWx0UHJvcHMgPSB7XG4gIHNlcGFyYXRvcjogJy8nXG59XG5cbmV4cG9ydCBkZWZhdWx0IEJyZWFkY3J1bWJzXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBCdXR0b25Hcm91cCwgQnV0dG9uLCBHbHlwaGljb24gfSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQge1xuICBkZWZpbmVNZXNzYWdlcywgaW5qZWN0SW50bCwgaW50bFNoYXBlLCBGb3JtYXR0ZWRNZXNzYWdlXG59IGZyb20gJ3JlYWN0LWludGwnXG5cbmltcG9ydCBSZWZyZXNoQnV0dG9uIGZyb20gJy4uLy4uL2NvbW1vbi9jb21wb25lbnRzL3JlZnJlc2gtYnV0dG9uJ1xuaW1wb3J0IERvd25sb2Fkc01vZGFsIGZyb20gJy4vZG93bmxvYWRzLW1vZGFsJ1xuaW1wb3J0IFVwbG9hZHNNb2RhbCBmcm9tICcuL3VwbG9hZHMtbW9kYWwnXG5cbmNvbnN0IG1lc3NhZ2VzID0gZGVmaW5lTWVzc2FnZXMoe1xuICByZWZyZXNoRGlyZWN0b3J5OiB7XG4gICAgaWQ6ICdyZWZyZXNoRGlyZWN0b3J5JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1JlZnJlc2ggZGlyZWN0b3J5J1xuICB9LFxuICBkb3dubG9hZHM6IHtcbiAgICBpZDogJ2Rvd25sb2FkcycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdEb3dubG9hZHMnXG4gIH0sXG4gIHVwbG9hZHM6IHtcbiAgICBpZDogJ3VwbG9hZHMnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVXBsb2FkcydcbiAgfVxufSlcblxuY2xhc3MgRmlsZXNCdXR0b25zIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBkaXJuYW1lLCBzZXBhcmF0b3IsXG4gICAgICBpc1VwbG9hZGluZywgdXBsb2FkRW5hYmxlZCwgbGFzdFVwZGF0ZSwgb25SZWZyZXNoQ2xpY2ssXG4gICAgICBpc0Rvd25sb2FkaW5nLCBzaG93RG93bmxvYWRzLCBvbkRvd25sb2Fkc0NsaWNrLFxuICAgICAgc2hvd1VwbG9hZHMsIG9uVXBsb2Fkc0NsaWNrLCBpbnRsOiB7IGZvcm1hdE1lc3NhZ2UgfVxuICAgIH0gPSB0aGlzLnByb3BzXG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBpZD0nZmlsZXMtYnV0dG9ucyc+XG4gICAgICAgIDxEb3dubG9hZHNNb2RhbCBzaG93PXtzaG93RG93bmxvYWRzfSBoYW5kbGVIaWRlPXtvbkRvd25sb2Fkc0NsaWNrfSAvPlxuICAgICAgICA8VXBsb2Fkc01vZGFsXG4gICAgICAgICAgZGlybmFtZT17ZGlybmFtZX1cbiAgICAgICAgICBzZXBhcmF0b3I9e3NlcGFyYXRvcn1cbiAgICAgICAgICBzaG93PXtzaG93VXBsb2Fkc31cbiAgICAgICAgICBoYW5kbGVIaWRlPXtvblVwbG9hZHNDbGlja31cbiAgICAgICAgICB1cGxvYWRFbmFibGVkPXt1cGxvYWRFbmFibGVkfSAvPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93Jz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sLW1kLTggdGV4dC1sZWZ0Jz5cbiAgICAgICAgICAgIDxSZWZyZXNoQnV0dG9uXG4gICAgICAgICAgICAgIGhhbmRsZVJlZnJlc2g9e29uUmVmcmVzaENsaWNrfVxuICAgICAgICAgICAgICBsYXN0VXBkYXRlPXtsYXN0VXBkYXRlfVxuICAgICAgICAgICAgICBlbmFibGVQZXJpb2RzPXtmYWxzZX0+XG4gICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5yZWZyZXNoRGlyZWN0b3J5fSAvPlxuICAgICAgICAgICAgPC9SZWZyZXNoQnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2wtbWQtNCB0ZXh0LXJpZ2h0Jz5cbiAgICAgICAgICAgIHsgISFsYXN0VXBkYXRlICYmXG4gICAgICAgICAgICAgIDxCdXR0b25Hcm91cD5cbiAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2lzRG93bmxvYWRpbmcgPyAnYnV0dG9uLWNvbG9yLWFuaW1hdGUnIDogJyd9XG4gICAgICAgICAgICAgICAgICBic1N0eWxlPSdkZWZhdWx0J1xuICAgICAgICAgICAgICAgICAgdGl0bGU9e2Zvcm1hdE1lc3NhZ2UobWVzc2FnZXMuZG93bmxvYWRzKX1cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uRG93bmxvYWRzQ2xpY2t9PlxuICAgICAgICAgICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD0nY2xvdWQtZG93bmxvYWQnIC8+XG4gICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtpc1VwbG9hZGluZyA/ICdidXR0b24tY29sb3ItYW5pbWF0ZScgOiAnJ31cbiAgICAgICAgICAgICAgICAgIGJzU3R5bGU9J2RlZmF1bHQnXG4gICAgICAgICAgICAgICAgICB0aXRsZT17Zm9ybWF0TWVzc2FnZShtZXNzYWdlcy51cGxvYWRzKX1cbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uVXBsb2Fkc0NsaWNrfT5cbiAgICAgICAgICAgICAgICAgIDxHbHlwaGljb24gZ2x5cGg9J2Nsb3VkLXVwbG9hZCcgLz5cbiAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgPC9CdXR0b25Hcm91cD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cbn1cblxuRmlsZXNCdXR0b25zLnByb3BUeXBlcyA9IHtcbiAgZGlybmFtZTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkLFxuICBzZXBhcmF0b3I6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG5cbiAgbGFzdFVwZGF0ZTogUmVhY3QuUHJvcFR5cGVzLmluc3RhbmNlT2YoRGF0ZSksXG5cbiAgb25SZWZyZXNoQ2xpY2s6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGlzRG93bmxvYWRpbmc6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBzaG93RG93bmxvYWRzOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgb25Eb3dubG9hZHNDbGljazogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgaXNVcGxvYWRpbmc6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBzaG93VXBsb2FkczogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIHVwbG9hZEVuYWJsZWQ6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBvblVwbG9hZHNDbGljazogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcblxuICBpbnRsOiBpbnRsU2hhcGUuaXNSZXF1aXJlZFxufVxuXG5GaWxlc0J1dHRvbnMuZGVmYXVsdFByb3BzID0ge1xuICBsYXN0VXBkYXRlOiBmYWxzZSxcblxuICBpc0Rvd25sb2FkaW5nOiBmYWxzZSxcbiAgc2hvd0Rvd25sb2FkczogZmFsc2UsXG4gIGlzVXBsb2FkaW5nOiBmYWxzZSxcbiAgc2hvd1VwbG9hZHM6IGZhbHNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdEludGwoRmlsZXNCdXR0b25zKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4J1xuaW1wb3J0IHsgQWxlcnQsIE1vZGFsIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuaW1wb3J0IHsgZGVmaW5lTWVzc2FnZXMsIEZvcm1hdHRlZE1lc3NhZ2UgfSBmcm9tICdyZWFjdC1pbnRsJ1xuXG5pbXBvcnQgeyBjbGVhckRvd25sb2FkRmlsZUVycm9yIH0gZnJvbSAnLi4vLi4vYWN0aW9ucy9maWxlcydcbmltcG9ydCB7IGdldERvd25sb2FkRXJyb3JzIH0gZnJvbSAnLi4vLi4vcmVkdWNlcnMvZmlsZXMnXG5cbmltcG9ydCBEb3dubG9hZHMgZnJvbSAnLi9kb3dubG9hZHMnXG5cbmNvbnN0IG1lc3NhZ2VzID0gZGVmaW5lTWVzc2FnZXMoe1xuICBkb3dubG9hZHM6IHtcbiAgICBpZDogJ2Rvd25sb2FkcycsIGRlZmF1bHRNZXNzYWdlOiAnRG93bmxvYWRzJ1xuICB9XG59KVxuXG5jb25zdCBEb3dubG9hZHNNb2RhbCA9ICh7XG4gIHNob3csIGhhbmRsZUhpZGUsIGRvd25sb2FkRXJyb3JzLCBjbGVhckRvd25sb2FkRXJyb3Jcbn0pID0+IChcbiAgPE1vZGFsIHNob3c9e3Nob3d9IG9uSGlkZT17aGFuZGxlSGlkZX0+XG4gICAgPE1vZGFsLkhlYWRlciBjbG9zZUJ1dHRvbj5cbiAgICAgIDxNb2RhbC5UaXRsZT5cbiAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLmRvd25sb2Fkc30gLz5cbiAgICAgIDwvTW9kYWwuVGl0bGU+XG4gICAgPC9Nb2RhbC5IZWFkZXI+XG4gICAgPE1vZGFsLkJvZHk+XG4gICAgICB7IGRvd25sb2FkRXJyb3JzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgZG93bmxvYWRFcnJvcnMubWFwKCh7IHBhdGgsIG1lc3NhZ2UgfSwgaSkgPT4gKFxuICAgICAgICAgIDxBbGVydFxuICAgICAgICAgICAga2V5PXtpfVxuICAgICAgICAgICAgYnNTdHlsZT0nZGFuZ2VyJ1xuICAgICAgICAgICAgb25EaXNtaXNzPXsoZSkgPT4gY2xlYXJEb3dubG9hZEVycm9yKHBhdGgpfT5cbiAgICAgICAgICAgIHsgbWVzc2FnZSB9XG4gICAgICAgICAgPC9BbGVydD5cbiAgICAgICAgKSlcbiAgICAgIH1cbiAgICAgIDxEb3dubG9hZHMgLz5cbiAgICA8L01vZGFsLkJvZHk+XG4gIDwvTW9kYWw+XG4pXG5cbkRvd25sb2Fkc01vZGFsLnByb3BUeXBlcyA9IHtcbiAgc2hvdzogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGhhbmRsZUhpZGU6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG5cbiAgZG93bmxvYWRFcnJvcnM6IFJlYWN0LlByb3BUeXBlcy5hcnJheU9mKFJlYWN0LlByb3BUeXBlcy5zaGFwZSh7XG4gICAgcGF0aDogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjb2RlOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICAgIG1lc3NhZ2U6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmdcbiAgfSkpLFxuICBjbGVhckRvd25sb2FkRXJyb3I6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbn1cbkRvd25sb2Fkc01vZGFsLmRlZmF1bHRQcm9wVHlwZXMgPSB7XG4gIHNob3c6IGZhbHNlLFxuXG4gIGRvd25sb2FkRXJyb3JzOiBbXVxufVxuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoeyBmaWxlcyB9KSA9PiAoe1xuICBkb3dubG9hZEVycm9yczogZ2V0RG93bmxvYWRFcnJvcnMoZmlsZXMpXG59KVxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gKGRpc3BhdGNoKSA9PiAoe1xuICBjbGVhckRvd25sb2FkRXJyb3I6IChwYXRoKSA9PiBkaXNwYXRjaChjbGVhckRvd25sb2FkRmlsZUVycm9yKHBhdGgpKVxufSlcbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QobWFwU3RhdGVUb1Byb3BzLCBtYXBEaXNwYXRjaFRvUHJvcHMpKERvd25sb2Fkc01vZGFsKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQnV0dG9uLCBMaXN0R3JvdXAsIExpc3RHcm91cEl0ZW0sIEFsZXJ0IH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuaW1wb3J0IHsgZGVmaW5lTWVzc2FnZXMsIEZvcm1hdHRlZE1lc3NhZ2UgfSBmcm9tICdyZWFjdC1pbnRsJ1xuXG5pbXBvcnQgRmlsZXNEb3dubG9hZENvbnRyb2xsZXIgZnJvbSAnLi4vLi4vbGliL2ZpbGVzL2ZpbGVzLWRvd25sb2FkLWNvbnRyb2xsZXInXG5pbXBvcnQgRWxsaXBzaXplIGZyb20gJy4uL2VsbGlwc2l6ZSdcbmltcG9ydCBQcm9ncmVzc0JhciBmcm9tICcuLi9wcm9ncmVzcy1iYXInXG5cbmNvbnN0IEZJTEVOQU1FX01BWF9MRU5HVEggPSA1MFxuXG5jb25zdCBtZXNzYWdlcyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgZW1wdHk6IHtcbiAgICBpZDogJ2VtcHR5JywgZGVmYXVsdE1lc3NhZ2U6ICdFbXB0eSdcbiAgfVxufSlcblxuY29uc3QgRG93bmxvYWRzID0gKHsgZmlsZXMsIG9uUmVtb3ZlRmlsZSB9KSA9PiAoXG4gIDxMaXN0R3JvdXAgY2xhc3NOYW1lPSdmaWxlcy1kb3dubG9hZC1kb3dubG9hZHMnPlxuICAgIHsgZmlsZXMubGVuZ3RoIDw9IDAgJiZcbiAgICAgIDxBbGVydCBic1N0eWxlPSdkYW5nZXInPlxuICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMuZW1wdHl9IC8+XG4gICAgICA8L0FsZXJ0PlxuICAgIH1cbiAgICB7IGZpbGVzLmxlbmd0aCA+IDAgJiZcbiAgICAgIGZpbGVzLm1hcCgoeyBiYXNlbmFtZTogbmFtZSwgcGF0aCwgcHJvZ3Jlc3MgfSwgaW5kZXgpID0+IChcbiAgICAgICAgPExpc3RHcm91cEl0ZW1cbiAgICAgICAgICBrZXk9e2luZGV4fVxuICAgICAgICAgIGJzU3R5bGU9eyhwcm9ncmVzcyA8IDEwMCkgPyAnaW5mbycgOiAnc3VjY2Vzcyd9PlxuICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgIHR5cGU9J2J1dHRvbidcbiAgICAgICAgICAgIGNsYXNzTmFtZT0nY2xvc2UnXG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvblJlbW92ZUZpbGUocGF0aCl9PlxuICAgICAgICAgICAgPHNwYW4+JnRpbWVzOzwvc3Bhbj5cbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICA8RWxsaXBzaXplIG1heD17RklMRU5BTUVfTUFYX0xFTkdUSH0+e25hbWV9PC9FbGxpcHNpemU+XG4gICAgICAgICAgPFByb2dyZXNzQmFyIHZhbHVlPXtwcm9ncmVzc30gLz5cbiAgICAgICAgPC9MaXN0R3JvdXBJdGVtPlxuICAgICAgKSlcbiAgICB9XG4gIDwvTGlzdEdyb3VwPlxuKVxuXG5Eb3dubG9hZHMucHJvcFR5cGVzID0ge1xuICBmaWxlczogUmVhY3QuUHJvcFR5cGVzLmFycmF5LFxuICBvblJlbW92ZUZpbGU6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWRcbn1cblxuRG93bmxvYWRzLmRlZmF1bHRQcm9wcyA9IHtcbiAgZmlsZXM6IFtdXG59XG5cbmNsYXNzIERvd25sb2Fkc0NvbnRhaW5lciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy5nZXREb3dubG9hZEZpbGVzID0gKCkgPT4gKHtcbiAgICAgIGZpbGVzOiBGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5maWxlcy5tYXAoKGZpbGVEb3dubG9hZCwgaW5kZXgpID0+ICh7XG4gICAgICAgIHBhdGg6IGZpbGVEb3dubG9hZC5maWxlLnBhdGgsXG4gICAgICAgIGRpcm5hbWU6IGZpbGVEb3dubG9hZC5maWxlLmRpcm5hbWUsXG4gICAgICAgIGJhc2VuYW1lOiBmaWxlRG93bmxvYWQuZmlsZS5iYXNlbmFtZSxcbiAgICAgICAgcHJvZ3Jlc3M6IGZpbGVEb3dubG9hZC5wcm9ncmVzc1xuICAgICAgfSkpXG4gICAgfSlcblxuICAgIHRoaXMuaGFuZGxlRmlsZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuc2V0U3RhdGUodGhpcy5nZXREb3dubG9hZEZpbGVzKVxuICAgIH1cblxuICAgIHRoaXMuaGFuZGxlUmVtb3ZlRmlsZSA9IChwYXRoKSA9PiBGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5yZW1vdmVGaWxlKHBhdGgpXG5cbiAgICB0aGlzLnN0YXRlID0gdGhpcy5nZXREb3dubG9hZEZpbGVzKClcbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBmaWxlcyB9ID0gdGhpcy5zdGF0ZVxuICAgIHJldHVybiAoPERvd25sb2FkcyBmaWxlcz17ZmlsZXN9IG9uUmVtb3ZlRmlsZT17dGhpcy5oYW5kbGVSZW1vdmVGaWxlfSAvPilcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICBGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5vbignZmlsZScsIHRoaXMuaGFuZGxlRmlsZSlcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50ICgpIHtcbiAgICBGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5yZW1vdmVMaXN0ZW5lcignZmlsZScsIHRoaXMuaGFuZGxlRmlsZSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBEb3dubG9hZHNDb250YWluZXJcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGRlZmluZU1lc3NhZ2VzLCBGb3JtYXR0ZWRNZXNzYWdlIH0gZnJvbSAncmVhY3QtaW50bCdcblxuY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gIHVwbG9hZERpc2FibGVkOiB7XG4gICAgaWQ6ICd1cGxvYWQtZGlzYWJsZWQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVXBsb2FkIGRpc2FibGVkIG9uIHRoaXMgZGlyZWN0b3J5J1xuICB9LFxuICB1cGxvYWREcm9wOiB7XG4gICAgaWQ6ICd1cGxvYWQtZHJvcCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdEcm9wIHRoZSBmaWxlIHRvIHN0YXJ0IHRoZSB1cGxvYWQnXG4gIH1cbn0pXG5cbmNvbnN0IEZpbGVEcm9wTWVzc2FnZSA9ICh7IHVwbG9hZEVuYWJsZWQgfSkgPT4gKFxuICA8c3BhbiBjbGFzc05hbWU9J2xlYWQnPlxuICAgIHsgdXBsb2FkRW5hYmxlZCAmJiA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMudXBsb2FkRHJvcH0gLz4gfVxuICAgIHsgIXVwbG9hZEVuYWJsZWQgJiYgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLnVwbG9hZERpc2FibGVkfSAvPiB9XG4gIDwvc3Bhbj5cbilcblxuRmlsZURyb3BNZXNzYWdlLnByb3BUeXBlcyA9IHtcbiAgdXBsb2FkRW5hYmxlZDogUmVhY3QuUHJvcFR5cGVzLmJvb2xcbn1cblxuZXhwb3J0IGRlZmF1bHQgRmlsZURyb3BNZXNzYWdlXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5cbmNvbnN0IHN0eWxlID0ge1xuICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgdG9wOiAwLFxuICByaWdodDogMCxcbiAgYm90dG9tOiAwLFxuICBsZWZ0OiAwLFxuICBjb2xvcjogJyNmZmYnLFxuICBiYWNrZ3JvdW5kOiAncmdiYSgwLDAsMCwwLjUpJyxcbiAgekluZGV4OiAxMVxufVxuXG5jb25zdCBib3JkZXJNYXJnaW4gPSAxMFxuXG5jb25zdCBib3JkZXJTdHlsZSA9IHtcbiAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gIHRvcDogYm9yZGVyTWFyZ2luLFxuICByaWdodDogYm9yZGVyTWFyZ2luLFxuICBib3R0b206IGJvcmRlck1hcmdpbixcbiAgbGVmdDogYm9yZGVyTWFyZ2luLFxuICBib3JkZXJDb2xvcjogJyNlZWUnLFxuICBib3JkZXJSYWRpdXM6ICc0cHgnLFxuICBib3JkZXJTdHlsZTogJ2Rhc2hlZCcsXG4gIGJvcmRlcldpZHRoOiAnNHB4J1xufVxuXG5jb25zdCBnZXRCb3JkZXJTdHlsZSA9ICh7IG9mZnNldFRvcCA9IDAgfSkgPT4gKHtcbiAgLi4uYm9yZGVyU3R5bGUsXG4gIHRvcDogYm9yZGVyU3R5bGUudG9wICsgb2Zmc2V0VG9wXG59KVxuXG5jb25zdCBGaWxlRHJvcE92ZXJsYXkgPSAoeyBvZmZzZXRUb3AsIGNoaWxkcmVuIH0pID0+IChcbiAgPGRpdiBzdHlsZT17c3R5bGV9PlxuICAgIDxkaXYgc3R5bGU9e2dldEJvcmRlclN0eWxlKHsgb2Zmc2V0VG9wIH0pfT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPSd0ZXh0LWNlbnRlcic+eyBjaGlsZHJlbiB9PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuKVxuXG5GaWxlRHJvcE92ZXJsYXkucHJvcFR5cGVzID0ge1xuICBvZmZzZXRUb3A6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIGNoaWxkcmVuOiBSZWFjdC5Qcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBSZWFjdC5Qcm9wVHlwZXMubm9kZSxcbiAgICBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nXG4gIF0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IEZpbGVEcm9wT3ZlcmxheVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IERyb3B6b25lIGZyb20gJ3JlYWN0LWRyb3B6b25lJ1xuaW1wb3J0IEZpbGVEcm9wT3ZlcmxheSBmcm9tICcuL2ZpbGUtZHJvcC1vdmVybGF5J1xuXG5jbGFzcyBGaWxlRHJvcHpvbmUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBkcm9wem9uZUFjdGl2ZTogZmFsc2VcbiAgICB9XG5cbiAgICB0aGlzLnNob3dEcm9wem9uZU92ZXJsYXkgPSAoKSA9PiB0aGlzLnNldFN0YXRlKHsgZHJvcHpvbmVBY3RpdmU6IHRydWUgfSlcbiAgICB0aGlzLmhpZGVEcm9wem9uZU92ZXJsYXkgPSAoKSA9PiB0aGlzLnNldFN0YXRlKHsgZHJvcHpvbmVBY3RpdmU6IGZhbHNlIH0pXG4gICAgdGhpcy5oYW5kbGVGaWxlc0Ryb3AgPSAoLi4uYXJncykgPT4ge1xuICAgICAgdGhpcy5wcm9wcy5vbkRyb3AoLi4uYXJncylcbiAgICAgIHRoaXMuaGlkZURyb3B6b25lT3ZlcmxheSgpXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBvdmVybGF5TWVzc2FnZSwgb3ZlcmxheU9mZnNldFRvcCwgZHJvcHpvbmVSZWYsIGNoaWxkcmVuLCAuLi5wcm9wc1xuICAgIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgeyBkcm9wem9uZUFjdGl2ZSB9ID0gdGhpcy5zdGF0ZVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxEcm9wem9uZVxuICAgICAgICBzdHlsZT17e319XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgICAgcmVmPXtkcm9wem9uZVJlZn1cbiAgICAgICAgb25EcmFnRW50ZXI9e3RoaXMuc2hvd0Ryb3B6b25lT3ZlcmxheX1cbiAgICAgICAgb25EcmFnTGVhdmU9e3RoaXMuaGlkZURyb3B6b25lT3ZlcmxheX1cbiAgICAgICAgb25Ecm9wPXt0aGlzLmhhbmRsZUZpbGVzRHJvcH0+XG4gICAgICAgIHsgZHJvcHpvbmVBY3RpdmUgJiZcbiAgICAgICAgICA8RmlsZURyb3BPdmVybGF5IG9mZnNldFRvcD17b3ZlcmxheU9mZnNldFRvcH0+XG4gICAgICAgICAgICB7IG92ZXJsYXlNZXNzYWdlIH1cbiAgICAgICAgICA8L0ZpbGVEcm9wT3ZlcmxheT5cbiAgICAgICAgfVxuICAgICAgICB7IGNoaWxkcmVuIH1cbiAgICAgIDwvRHJvcHpvbmU+XG4gICAgKVxuICB9XG59XG5cbkZpbGVEcm9wem9uZS5wcm9wVHlwZXMgPSB7XG4gIGRpc2FibGVDbGljazogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGRpc2FibGVQcmV2aWV3OiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgZHJvcHpvbmVSZWY6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBvbkRyb3A6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIG92ZXJsYXlNZXNzYWdlOiBGaWxlRHJvcE92ZXJsYXkucHJvcFR5cGVzLmNoaWxkcmVuLmlzUmVxdWlyZWQsXG4gIG92ZXJsYXlPZmZzZXRUb3A6IEZpbGVEcm9wT3ZlcmxheS5wcm9wVHlwZXMub2Zmc2V0VG9wLFxuICBjaGlsZHJlbjogUmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUmVhY3QuUHJvcFR5cGVzLmFycmF5T2YoUmVhY3QuUHJvcFR5cGVzLm5vZGUpLFxuICAgIFJlYWN0LlByb3BUeXBlcy5ub2RlXG4gIF0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IEZpbGVEcm9wem9uZVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4J1xuaW1wb3J0IHsgQWxlcnQgfSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQge1xuICBkZWZpbmVNZXNzYWdlcywgaW5qZWN0SW50bCwgaW50bFNoYXBlLCBGb3JtYXR0ZWRNZXNzYWdlXG59IGZyb20gJ3JlYWN0LWludGwnXG5cbmltcG9ydCB7XG4gIGNkLCBmZXRjaEZpbGVzLCBkZWxldGVGaWxlLFxuICBjbGVhckZpbGVzRXJyb3IsIGNsZWFyRmlsZUVycm9yLFxuICBjbGVhckRvd25sb2FkRmlsZUVycm9yLCBjbGVhclVwbG9hZEZpbGVFcnJvclxufSBmcm9tICcuLi8uLi9hY3Rpb25zL2ZpbGVzJ1xuaW1wb3J0IHtcbiAgZ2V0SXRlbXNNZXRhZGF0YSwgZ2V0SXRlbXMsIGdldERpcixcbiAgZ2V0SXRlbXNFcnJvcnMsIGdldERvd25sb2FkRXJyb3JzLCBnZXRVcGxvYWRFcnJvcnNcbn0gZnJvbSAnLi4vLi4vcmVkdWNlcnMvZmlsZXMnXG5cbmltcG9ydCBVc2VyRmlsZSBmcm9tICcuLi8uLi9saWIvZmlsZXMvdXNlci1maWxlJ1xuaW1wb3J0IEZpbGVJdGVtIGZyb20gJy4uLy4uL2xpYi9maWxlcy9maWxlLWl0ZW0nXG5pbXBvcnQgRmlsZXNEb3dubG9hZENvbnRyb2xsZXIgZnJvbSAnLi4vLi4vbGliL2ZpbGVzL2ZpbGVzLWRvd25sb2FkLWNvbnRyb2xsZXInXG5pbXBvcnQgRmlsZXNVcGxvYWRDb250cm9sbGVyIGZyb20gJy4uLy4uL2xpYi9maWxlcy9maWxlcy11cGxvYWQtY29udHJvbGxlcidcblxuaW1wb3J0IEZpbGVzQnV0dG9ucyBmcm9tICcuL2J1dHRvbnMnXG5pbXBvcnQgRmlsZXNCcmVhZGNydW1icyBmcm9tICcuL2JyZWFkY3J1bWJzJ1xuaW1wb3J0IEZpbGVzVGFibGUgZnJvbSAnLi90YWJsZSdcbmltcG9ydCBGaWxlRHJvcHpvbmUgZnJvbSAnLi9maWxlLWRyb3B6b25lJ1xuaW1wb3J0IEZpbGVEcm9wTWVzc2FnZSBmcm9tICcuL2ZpbGUtZHJvcC1tZXNzYWdlJ1xuXG5jb25zdCBET1dOTE9BRF9TSVpFX0xJTUlUID0gMTA0ODU3NjAwIC8vIDEwMCAqIDEwMjQgKiAxMDI0IDwxMDBNQlxuY29uc3QgQ0FDSEVfSU5URVJWQUwgPSAxODAwMDAgLy8gMyBtaW51dGVzICogNjAgc2Vjb25kcyAqIDEwMDAgbWlsaXNlY29uZHNcblxuY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gIGxvYWRpbmdEb3RzOiB7XG4gICAgaWQ6ICdsb2FkaW5nRG90cycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdMb2FkaW5nLi4uJ1xuICB9LFxuICB0aGVyZUFyZU5vRmlsZXM6IHtcbiAgICBpZDogJ3RoZXJlQXJlTm9GaWxlcycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGVyZSBhcmUgbm8gZmlsZXMnXG4gIH0sXG4gIHVwbG9hZERpc2FibGVkOiB7XG4gICAgaWQ6ICd1cGxvYWQtZGlzYWJsZWQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVXBsb2FkIGRpc2FibGVkIG9uIHRoaXMgZGlyZWN0b3J5J1xuICB9LFxuICBmaWxlc0Rvd25sb2FkTGltaXQ6IHtcbiAgICBpZDogJ2ZpbGVzRG93bmxvYWRMaW1pdCcsXG4gICAgZGVmaW5lTWVzc2FnZTogJ0N1cnJlbnRseSwgdGhlIGRvd25sb2FkIGlzIHN1cHBvcnRlZCBvbmx5IHdpdGggaXRlbXMgb2YgMTAwTUIgb3IgbGVzcy4nLFxuICAgIGRlc2NyaXB0aW9uOiAnRmlsZXMgc2l6ZSBsaW1pdGF0aW9uIG1lc3NhZ2UnXG4gIH0sXG4gIGVycm9yOiB7XG4gICAgaWQ6ICdlcnJvcicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdFcnJvcidcbiAgfVxufSlcblxuZXhwb3J0IGNsYXNzIEZpbGVzTWFpbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHNob3dEb3dubG9hZHM6IGZhbHNlLFxuICAgICAgc2hvd1VwbG9hZHM6IGZhbHNlLFxuICAgICAgaXNVcGxvYWRpbmc6IGZhbHNlLFxuICAgICAgaXNEb3dubG9hZGluZzogZmFsc2VcbiAgICB9XG5cbiAgICB0aGlzLm9wZW5VcGxvYWRzID0gKCkgPT4gdGhpcy5zZXRTdGF0ZSh7IHNob3dVcGxvYWRzOiB0cnVlIH0pXG4gICAgdGhpcy5jbG9zZVVwbG9hZHMgPSAoKSA9PiB0aGlzLnNldFN0YXRlKHsgc2hvd1VwbG9hZHM6IGZhbHNlIH0pXG4gICAgdGhpcy50b2dnbGVVcGxvYWRzID0gKCkgPT4gdGhpcy5zZXRTdGF0ZSh7IHNob3dVcGxvYWRzOiAhdGhpcy5zdGF0ZS5zaG93VXBsb2FkcyB9KVxuXG4gICAgdGhpcy5vcGVuRG93bmxvYWRzID0gKCkgPT4gdGhpcy5zZXRTdGF0ZSh7IHNob3dEb3dubG9hZHM6IHRydWUgfSlcbiAgICB0aGlzLmNsb3NlRG93bmxvYWRzID0gKCkgPT4gdGhpcy5zZXRTdGF0ZSh7IHNob3dEb3dubG9hZHM6IGZhbHNlIH0pXG4gICAgdGhpcy50b2dnbGVEb3dubG9hZHMgPSAoKSA9PiB0aGlzLnNldFN0YXRlKHsgc2hvd0Rvd25sb2FkczogIXRoaXMuc3RhdGUuc2hvd0Rvd25sb2FkcyB9KVxuXG4gICAgdGhpcy5jbGVhckVycm9yID0gKGUpID0+IHtcbiAgICAgIGNvbnN0IHsgcGF0aCwgY2xlYXJFcnJvciB9ID0gdGhpcy5wcm9wc1xuICAgICAgaWYgKGNsZWFyRXJyb3IpIGNsZWFyRXJyb3IocGF0aClcbiAgICB9XG5cbiAgICB0aGlzLmNsZWFySXRlbUVycm9yID0gKHBhdGgpID0+IChlKSA9PiB7XG4gICAgICBjb25zdCB7IGNsZWFySXRlbUVycm9yIH0gPSB0aGlzLnByb3BzXG4gICAgICBpZiAoY2xlYXJJdGVtRXJyb3IpIGNsZWFySXRlbUVycm9yKHBhdGgpXG4gICAgfVxuXG4gICAgdGhpcy5jbGVhckRvd25sb2FkRXJyb3IgPSAocGF0aCkgPT4gKGUpID0+IHtcbiAgICAgIGNvbnN0IHsgY2xlYXJEb3dubG9hZEVycm9yIH0gPSB0aGlzLnByb3BzXG4gICAgICBpZiAoY2xlYXJEb3dubG9hZEVycm9yKSBjbGVhckRvd25sb2FkRXJyb3IocGF0aClcbiAgICB9XG5cbiAgICB0aGlzLmNsZWFyVXBsb2FkRXJyb3IgPSAocGF0aCkgPT4gKGUpID0+IHtcbiAgICAgIGNvbnN0IHsgY2xlYXJVcGxvYWRFcnJvciB9ID0gdGhpcy5wcm9wc1xuICAgICAgaWYgKGNsZWFyVXBsb2FkRXJyb3IpIGNsZWFyVXBsb2FkRXJyb3IocGF0aClcbiAgICB9XG5cbiAgICBjb25zdCBhZGRGaWxlID0gKGZpbGVIYW5kbGUpID0+IHtcbiAgICAgIC8vIFN0YXJ0IHRvIHVwbG9hZCBhIGZpbGVcbiAgICAgIGNvbnN0IHsgcGF0aCwgc2VwYXJhdG9yIH0gPSB0aGlzLnByb3BzXG4gICAgICBjb25zdCB0eXBlT1MgPSBzZXBhcmF0b3IgPT09ICcvJyA/ICdsaW51eCcgOiAnd2luJ1xuICAgICAgY29uc3QgZmlsZSA9IG5ldyBVc2VyRmlsZShmaWxlSGFuZGxlLCBwYXRoLCB0eXBlT1MpXG4gICAgICBGaWxlc1VwbG9hZENvbnRyb2xsZXIuYWRkRmlsZShmaWxlKVxuICAgIH1cbiAgICB0aGlzLmhhbmRsZUZpbGVzRHJvcCA9IChhY2NlcHRlZEZpbGVzKSA9PiB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5pc1dyaXRhYmxlKSBhY2NlcHRlZEZpbGVzLmZvckVhY2goYWRkRmlsZSlcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZVVwbG9hZENvbXBsZXRlZCA9IChwYXRobmFtZSkgPT4ge1xuICAgICAgLy8gVXBkYXRlIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIGNvbXBsZXRlZCBmaWxlXG4gICAgICBjb25zdCB7IHNlcGFyYXRvciwgZmV0Y2hGaWxlcyB9ID0gdGhpcy5wcm9wc1xuICAgICAgY29uc3QgdHlwZU9TID0gc2VwYXJhdG9yID09PSAnLycgPyAnbGludXgnIDogJ3dpbidcbiAgICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZUl0ZW0ocGF0aG5hbWUsIHt9LCB0eXBlT1MpXG4gICAgICBmZXRjaEZpbGVzKGZpbGUuZGlybmFtZSlcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZVVwbG9hZFByb2dyZXNzID0gKHBhdGhuYW1lLCBwcm9ncmVzcykgPT4ge1xuICAgICAgaWYgKHByb2dyZXNzID49IDEwMCkgdGhpcy5oYW5kbGVVcGxvYWRDb21wbGV0ZWQocGF0aG5hbWUpXG4gICAgfVxuXG4gICAgY29uc3QgaXNVcGxvYWRpbmcgPSAoKSA9PiBGaWxlc1VwbG9hZENvbnRyb2xsZXIuZmlsZXMubGVuZ3RoID4gMFxuICAgIHRoaXMuY2hlY2tVcGxvYWRpbmcgPSAoKSA9PiB0aGlzLnNldFN0YXRlKHsgaXNVcGxvYWRpbmc6IGlzVXBsb2FkaW5nKCkgfSlcbiAgICBjb25zdCBpc0Rvd25sb2FkaW5nID0gKCkgPT4gRmlsZXNEb3dubG9hZENvbnRyb2xsZXIuZmlsZXMubGVuZ3RoID4gMFxuICAgIHRoaXMuY2hlY2tEb3dubG9hZGluZyA9ICgpID0+IHRoaXMuc2V0U3RhdGUoeyBpc0Rvd25sb2FkaW5nOiBpc0Rvd25sb2FkaW5nKCkgfSlcbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaXNXcml0YWJsZSwgcGF0aCwgc2VwYXJhdG9yLCBpdGVtcywgaXNGZXRjaGluZywgcmVjZWl2ZWRBdCxcbiAgICAgIGZldGNoRmlsZXMsIGNkLCBkZWxldGVGaWxlLFxuICAgICAgZXJyb3IsIGVycm9yQ29kZSwgaXRlbXNFcnJvcnMsIGRvd25sb2FkRXJyb3JzLCB1cGxvYWRFcnJvcnMsXG4gICAgICBzaG93SGVhZGVyLCBpbnRsOiB7IGZvcm1hdE1lc3NhZ2UgfVxuICAgIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgeyBpc0Rvd25sb2FkaW5nLCBzaG93RG93bmxvYWRzLCBpc1VwbG9hZGluZywgc2hvd1VwbG9hZHMgfSA9IHRoaXMuc3RhdGVcblxuICAgIHJldHVybiAoXG4gICAgICA8RmlsZURyb3B6b25lXG4gICAgICAgIG9uRHJvcD17dGhpcy5oYW5kbGVGaWxlc0Ryb3B9XG4gICAgICAgIG92ZXJsYXlNZXNzYWdlPXs8RmlsZURyb3BNZXNzYWdlIHVwbG9hZEVuYWJsZWQ9e2lzV3JpdGFibGV9IC8+fVxuICAgICAgICBvdmVybGF5T2Zmc2V0VG9wPXtzaG93SGVhZGVyID8gNTAgOiAwfVxuICAgICAgICBkaXNhYmxlQ2xpY2tcbiAgICAgICAgZGlzYWJsZVByZXZpZXc+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdmaWxlcy1tYWluJz5cbiAgICAgICAgICA8RmlsZXNCcmVhZGNydW1icyBwYXRobmFtZT17cGF0aH0gc2VwYXJhdG9yPXtzZXBhcmF0b3J9IG9uU2VsZWN0aW9uPXtjZH0gLz5cbiAgICAgICAgICB7IGVycm9yICYmXG4gICAgICAgICAgICA8QWxlcnQgYnNTdHlsZT0nZGFuZ2VyJyBvbkRpc21pc3M9e3RoaXMuY2xlYXJFcnJvcn0+XG4gICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlXG4gICAgICAgICAgICAgICAgey4uLihtZXNzYWdlc1tlcnJvckNvZGVdIHx8IG1lc3NhZ2VzLmVycm9yKX1cbiAgICAgICAgICAgICAgICB2YWx1ZXM9e3sgcGF0aCB9fSAvPlxuICAgICAgICAgICAgPC9BbGVydD5cbiAgICAgICAgICB9XG4gICAgICAgICAgeyBpdGVtc0Vycm9ycy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICBpdGVtc0Vycm9ycy5tYXAoKHsgcGF0aCwgY29kZSwgbWVzc2FnZSB9LCBpKSA9PiAoXG4gICAgICAgICAgICAgIDxBbGVydCBrZXk9e2l9IGJzU3R5bGU9J2Rhbmdlcicgb25EaXNtaXNzPXt0aGlzLmNsZWFySXRlbUVycm9yKHBhdGgpfT5cbiAgICAgICAgICAgICAgICB7IG1lc3NhZ2UgfVxuICAgICAgICAgICAgICA8L0FsZXJ0PlxuICAgICAgICAgICAgKSlcbiAgICAgICAgICB9XG4gICAgICAgICAgeyAhc2hvd0Rvd25sb2FkcyAmJiBkb3dubG9hZEVycm9ycy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICBkb3dubG9hZEVycm9ycy5tYXAoKHsgcGF0aCwgY29kZSwgbWVzc2FnZSB9LCBpKSA9PiAoXG4gICAgICAgICAgICAgIDxBbGVydCBrZXk9e2l9IGJzU3R5bGU9J2Rhbmdlcicgb25EaXNtaXNzPXt0aGlzLmNsZWFyRG93bmxvYWRFcnJvcihwYXRoKX0+XG4gICAgICAgICAgICAgICAgeyBtZXNzYWdlIH1cbiAgICAgICAgICAgICAgPC9BbGVydD5cbiAgICAgICAgICAgICkpXG4gICAgICAgICAgfVxuICAgICAgICAgIHsgIXNob3dVcGxvYWRzICYmIHVwbG9hZEVycm9ycy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICB1cGxvYWRFcnJvcnMubWFwKCh7IHBhdGgsIGNvZGUsIG1lc3NhZ2UgfSwgaSkgPT4gKFxuICAgICAgICAgICAgICA8QWxlcnQga2V5PXtpfSBic1N0eWxlPSdkYW5nZXInIG9uRGlzbWlzcz17dGhpcy5jbGVhclVwbG9hZEVycm9yKHBhdGgpfT5cbiAgICAgICAgICAgICAgICB7IG1lc3NhZ2UgfVxuICAgICAgICAgICAgICA8L0FsZXJ0PlxuICAgICAgICAgICAgKSlcbiAgICAgICAgICB9XG4gICAgICAgICAgeyAhZXJyb3IgJiZcbiAgICAgICAgICAgIDxGaWxlc0J1dHRvbnNcbiAgICAgICAgICAgICAgZGlybmFtZT17cGF0aH1cbiAgICAgICAgICAgICAgc2VwYXJhdG9yPXtzZXBhcmF0b3J9XG4gICAgICAgICAgICAgIGxhc3RVcGRhdGU9e3JlY2VpdmVkQXR9XG4gICAgICAgICAgICAgIG9uUmVmcmVzaENsaWNrPXsoKSA9PiBmZXRjaEZpbGVzKHBhdGgpfVxuICAgICAgICAgICAgICBpc1VwbG9hZGluZz17aXNVcGxvYWRpbmd9XG4gICAgICAgICAgICAgIHNob3dVcGxvYWRzPXtzaG93VXBsb2Fkc31cbiAgICAgICAgICAgICAgdXBsb2FkRW5hYmxlZD17aXNXcml0YWJsZX1cbiAgICAgICAgICAgICAgb25VcGxvYWRzQ2xpY2s9e3RoaXMudG9nZ2xlVXBsb2Fkc31cbiAgICAgICAgICAgICAgaXNEb3dubG9hZGluZz17aXNEb3dubG9hZGluZ31cbiAgICAgICAgICAgICAgc2hvd0Rvd25sb2Fkcz17c2hvd0Rvd25sb2Fkc31cbiAgICAgICAgICAgICAgb25Eb3dubG9hZHNDbGljaz17dGhpcy50b2dnbGVEb3dubG9hZHN9IC8+XG4gICAgICAgICAgfVxuICAgICAgICAgIHsgaXNGZXRjaGluZyAmJiA8YnIgLz4gfVxuICAgICAgICAgIHsgaXNGZXRjaGluZyAmJlxuICAgICAgICAgICAgPEFsZXJ0PjxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5sb2FkaW5nRG90c30gLz48L0FsZXJ0PlxuICAgICAgICAgIH1cbiAgICAgICAgICB7IHJlY2VpdmVkQXQgJiYgPGJyIC8+IH1cbiAgICAgICAgICB7IHJlY2VpdmVkQXQgJiYgaXRlbXMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICA8QWxlcnQgYnNTdHlsZT0nZGFuZ2VyJz5cbiAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLnRoZXJlQXJlTm9GaWxlc30gLz5cbiAgICAgICAgICAgIDwvQWxlcnQ+XG4gICAgICAgICAgfVxuICAgICAgICAgIHsgcmVjZWl2ZWRBdCAmJiBpdGVtcy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICA8RmlsZXNUYWJsZVxuICAgICAgICAgICAgICBpdGVtcz17aXRlbXN9XG4gICAgICAgICAgICAgIG9uSXRlbUNsaWNrPXtcbiAgICAgICAgICAgICAgICAoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXNEaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2QoaXRlbS5wYXRoKVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnVsbEl0ZW0gPSBpdGVtcy5maW5kKChpKSA9PiBpdGVtLnBhdGggPT09IGkucGF0aClcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmdWxsSXRlbSkgcmV0dXJuXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgICAgICAgIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpY2F0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgIGNhbkJlRGVsZXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICBpc1JlYWRhYmxlOiByZWFkYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICBpc1dyaXRhYmxlOiB3cml0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICBpc1dpblxuICAgICAgICAgICAgICAgICAgICB9ID0gZnVsbEl0ZW1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlSXRlbSA9IG5ldyBGaWxlSXRlbShwYXRoLCB7XG4gICAgICAgICAgICAgICAgICAgICAgc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICBtaW1lVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICBsYXN0TW9kaWZpY2F0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgIGNhbkJlRGVsZXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICByZWFkYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICB3cml0YWJsZVxuICAgICAgICAgICAgICAgICAgICB9LCBpc1dpbiA/ICd3aW4nIDogJ2xpbnV4JylcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGVJdGVtLnNpemUgfHwgZmlsZUl0ZW0uc2l6ZSA8IChET1dOTE9BRF9TSVpFX0xJTUlUKSkge1xuICAgICAgICAgICAgICAgICAgICAgIEZpbGVzRG93bmxvYWRDb250cm9sbGVyLmFkZEZpbGUoZmlsZUl0ZW0pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gYWxlcnQgaXMgYW4gdWdseSB3YXkuIFJlZmFjdG9yIGluIHRoZSBmdXR1cmVcbiAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWxlcnQoZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5maWxlc0Rvd25sb2FkTGltaXQpKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRlbGV0ZUZpbGU9e2RlbGV0ZUZpbGV9IC8+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvRmlsZURyb3B6b25lPlxuICAgIClcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICBjb25zdCB7IHBhdGgsIGZldGNoRmlsZXMgfSA9IHRoaXMucHJvcHNcbiAgICBmZXRjaEZpbGVzKHBhdGgpXG4gICAgRmlsZXNVcGxvYWRDb250cm9sbGVyLm9uKCdmaWxlJywgdGhpcy5jaGVja1VwbG9hZGluZylcbiAgICBGaWxlc1VwbG9hZENvbnRyb2xsZXIub24oJ3Byb2dyZXNzJywgdGhpcy5oYW5kbGVVcGxvYWRQcm9ncmVzcylcbiAgICBGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5vbignZmlsZScsIHRoaXMuY2hlY2tEb3dubG9hZGluZylcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50ICgpIHtcbiAgICBGaWxlc1VwbG9hZENvbnRyb2xsZXIucmVtb3ZlTGlzdGVuZXIoJ2ZpbGUnLCB0aGlzLmNoZWNrVXBsb2FkaW5nKVxuICAgIEZpbGVzVXBsb2FkQ29udHJvbGxlci5yZW1vdmVMaXN0ZW5lcigncHJvZ3Jlc3MnLCB0aGlzLmhhbmRsZVVwbG9hZFByb2dyZXNzKVxuICAgIEZpbGVzRG93bmxvYWRDb250cm9sbGVyLnJlbW92ZUxpc3RlbmVyKCdmaWxlJywgdGhpcy5jaGVja0Rvd25sb2FkaW5nKVxuICB9XG5cbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAoeyBwYXRoOiBuZXh0UGF0aCwgaXNGZXRjaGluZywgcmVjZWl2ZWRBdCwgbm93IH0pIHtcbiAgICBjb25zdCB7IHBhdGgsIGZldGNoRmlsZXMgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCBjYWNoZSA9IG5vdyAmJiByZWNlaXZlZEF0ICYmXG4gICAgICBub3cuZ2V0VGltZSgpIC0gcmVjZWl2ZWRBdC5nZXRUaW1lKCkgPCBDQUNIRV9JTlRFUlZBTFxuICAgIGlmIChwYXRoICE9PSBuZXh0UGF0aCAmJiAhaXNGZXRjaGluZyAmJiAhY2FjaGUpIGZldGNoRmlsZXMobmV4dFBhdGgpXG4gIH1cbn1cblxuRmlsZXNNYWluLnByb3BUeXBlcyA9IHtcbiAgcGF0aDogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgaXNXcml0YWJsZTogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIHNlcGFyYXRvcjogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgaXRlbXM6IFJlYWN0LlByb3BUeXBlcy5hcnJheSxcbiAgaXNGZXRjaGluZzogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIHJlY2VpdmVkQXQ6IFJlYWN0LlByb3BUeXBlcy5pbnN0YW5jZU9mKERhdGUpLFxuXG4gIGNkOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICBmZXRjaEZpbGVzOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuXG4gIGRlbGV0ZUZpbGU6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuXG4gIGVycm9yOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgZXJyb3JDb2RlOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICBlcnJvck1lc3NhZ2U6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGNsZWFyRXJyb3I6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuXG4gIGl0ZW1zRXJyb3JzOiBSZWFjdC5Qcm9wVHlwZXMuYXJyYXlPZihSZWFjdC5Qcm9wVHlwZXMuc2hhcGUoe1xuICAgIHBhdGg6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gICAgY29kZTogUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgICBtZXNzYWdlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nXG4gIH0pKSxcbiAgY2xlYXJJdGVtRXJyb3I6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuXG4gIGRvd25sb2FkRXJyb3JzOiBSZWFjdC5Qcm9wVHlwZXMuYXJyYXlPZihSZWFjdC5Qcm9wVHlwZXMuc2hhcGUoe1xuICAgIHBhdGg6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gICAgY29kZTogUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgICBtZXNzYWdlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nXG4gIH0pKSxcbiAgY2xlYXJEb3dubG9hZEVycm9yOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcblxuICB1cGxvYWRFcnJvcnM6IFJlYWN0LlByb3BUeXBlcy5hcnJheU9mKFJlYWN0LlByb3BUeXBlcy5zaGFwZSh7XG4gICAgcGF0aDogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgICBjb2RlOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICAgIG1lc3NhZ2U6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmdcbiAgfSkpLFxuICBjbGVhclVwbG9hZEVycm9yOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcblxuICBzaG93SGVhZGVyOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgbm93OiBSZWFjdC5Qcm9wVHlwZXMuaW5zdGFuY2VPZihEYXRlKSxcbiAgaW50bDogaW50bFNoYXBlLmlzUmVxdWlyZWRcbn1cblxuRmlsZXNNYWluLmRlZmF1bHRQcm9wcyA9IHtcbiAgaXNXcml0YWJsZTogZmFsc2UsXG4gIHBhdGg6ICcnLFxuICBzZXBhcmF0b3I6ICcvJyxcbiAgaXRlbXM6IFtdLFxuXG4gIGl0ZW1zRXJyb3JzOiBbXSxcbiAgZG93bmxvYWRFcnJvcnM6IFtdLFxuICB1cGxvYWRFcnJvcnM6IFtdXG59XG5cbmNvbnN0IHBhcnNlSXRlbXMgPSAoaXRlbXMpID0+IGl0ZW1zXG4gIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgaWYgKGEuaXNEaXIpIHJldHVybiAtMVxuICAgIGVsc2UgaWYgKGIuaXNEaXIpIHJldHVybiAxXG4gICAgZWxzZSByZXR1cm4gMFxuICB9KVxuICAubWFwKCh7XG4gICAgcGF0aCwgYmFzZW5hbWUsIGlzRGlyLCBpc0RyaXZlLCBpc0ZpbGUsIHNpemUsIG1pbWVUeXBlLCBsYXN0TW9kaWZpY2F0aW9uLFxuICAgIGlzUmVhZGFibGUsIGlzV3JpdGFibGUsIGNhbkJlRGVsZXRlZCwgaXNEZWxldGluZywgaXNXaW5cbiAgfSwgaW5kZXgpID0+ICh7XG4gICAgYmFzZW5hbWU6IHtcbiAgICAgIHBhdGgsXG4gICAgICBuYW1lOiBiYXNlbmFtZSxcbiAgICAgIGlzRGlyLFxuICAgICAgaXNEcml2ZSxcbiAgICAgIGlzUmVhZGFibGVcbiAgICB9LFxuICAgIGJ1dHRvbnM6IHtcbiAgICAgIHBhdGgsXG4gICAgICBpc0ZpbGUsXG4gICAgICBpc0RlbGV0aW5nLFxuICAgICAgY2FuQmVEZWxldGVkOiBjYW5CZURlbGV0ZWQgJiYgaXNXcml0YWJsZVxuICAgIH0sXG4gICAgcGF0aCxcbiAgICBzaXplLFxuICAgIGxhc3RNb2RpZmljYXRpb24sXG4gICAgbWltZVR5cGUsXG4gICAgY2FuQmVEZWxldGVkLFxuICAgIGlzUmVhZGFibGUsXG4gICAgaXNXcml0YWJsZSxcbiAgICBpc1dpblxuICB9KSlcbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9ICh7IGFwcDogeyBzaG93SGVhZGVyIH0sIGZpbGVzIH0pID0+IHtcbiAgY29uc3QgY3VycmVudFBhdGhBcnJheSA9IGZpbGVzLnBhdGhBcnJheVxuICBjb25zdCBzZXBhcmF0b3IgPSAoZmlsZXMucm9vdElzUG9zaXgpID8gJy8nIDogJ1xcXFwnXG4gIGNvbnN0IHtcbiAgICBpc0ZldGNoaW5nLCByZWNlaXZlZEF0LCBlcnJvciwgZXJyb3JDb2RlLCBlcnJvck1lc3NhZ2VcbiAgfSA9IGdldEl0ZW1zTWV0YWRhdGEoZmlsZXMsIGN1cnJlbnRQYXRoQXJyYXkpIHx8IHt9XG5cbiAgY29uc3QgaXNXcml0YWJsZSA9IGN1cnJlbnRQYXRoQXJyYXkubGVuZ3RoID09PSAwXG4gICAgPyBmaWxlcy5yb290SXNXcml0YWJsZVxuICAgIDogKGdldERpcihmaWxlcywgY3VycmVudFBhdGhBcnJheSkgfHwge30pLmlzV3JpdGFibGVcblxuICBjb25zdCBpdGVtc0Vycm9ycyA9IGdldEl0ZW1zRXJyb3JzKGZpbGVzLCBjdXJyZW50UGF0aEFycmF5KVxuICBjb25zdCBkb3dubG9hZEVycm9ycyA9IGdldERvd25sb2FkRXJyb3JzKGZpbGVzKVxuICBjb25zdCB1cGxvYWRFcnJvcnMgPSBnZXRVcGxvYWRFcnJvcnMoZmlsZXMpXG5cbiAgcmV0dXJuIHtcbiAgICBpdGVtczogcGFyc2VJdGVtcyhnZXRJdGVtcyhmaWxlcywgY3VycmVudFBhdGhBcnJheSkgfHwgW10pLFxuICAgIHBhdGg6IGN1cnJlbnRQYXRoQXJyYXkuam9pbihzZXBhcmF0b3IpLFxuICAgIHJvb3RJc1dpbjogZmlsZXMucm9vdElzV2luLFxuICAgIHNlcGFyYXRvcixcbiAgICBpc1dyaXRhYmxlLFxuICAgIGlzRmV0Y2hpbmcsXG4gICAgcmVjZWl2ZWRBdCxcbiAgICBlcnJvcixcbiAgICBlcnJvckNvZGUsXG4gICAgZXJyb3JNZXNzYWdlLFxuICAgIGl0ZW1zRXJyb3JzLFxuICAgIGRvd25sb2FkRXJyb3JzLFxuICAgIHVwbG9hZEVycm9ycyxcbiAgICBzaG93SGVhZGVyLFxuICAgIG5vdzogbmV3IERhdGUoKVxuICB9XG59XG5jb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSAoZGlzcGF0Y2gpID0+ICh7XG4gIGNkOiAocGF0aCkgPT4gZGlzcGF0Y2goY2QocGF0aCkpLFxuICBmZXRjaEZpbGVzOiAocGF0aCkgPT4gZGlzcGF0Y2goZmV0Y2hGaWxlcyhwYXRoKSksXG4gIGNsZWFyRXJyb3I6IChwYXRoKSA9PiBkaXNwYXRjaChjbGVhckZpbGVzRXJyb3IocGF0aCkpLFxuICBjbGVhckl0ZW1FcnJvcjogKHBhdGgpID0+IGRpc3BhdGNoKGNsZWFyRmlsZUVycm9yKHBhdGgpKSxcbiAgY2xlYXJEb3dubG9hZEVycm9yOiAocGF0aCkgPT4gZGlzcGF0Y2goY2xlYXJEb3dubG9hZEZpbGVFcnJvcihwYXRoKSksXG4gIGNsZWFyVXBsb2FkRXJyb3I6IChwYXRoKSA9PiBkaXNwYXRjaChjbGVhclVwbG9hZEZpbGVFcnJvcihwYXRoKSksXG4gIGRlbGV0ZUZpbGU6IChwYXRoKSA9PiBkaXNwYXRjaChkZWxldGVGaWxlKHBhdGgpKVxufSlcbmV4cG9ydCBkZWZhdWx0IGNvbm5lY3QoXG4gIG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzXG4pKGluamVjdEludGwoRmlsZXNNYWluKSlcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IEJ1dHRvbiwgR2x5cGhpY29uLCBPdmVybGF5VHJpZ2dlciwgUG9wb3ZlciB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcbmltcG9ydCB7XG4gIGRlZmluZU1lc3NhZ2VzLCBpbmplY3RJbnRsLCBpbnRsU2hhcGUsIEZvcm1hdHRlZE1lc3NhZ2Vcbn0gZnJvbSAncmVhY3QtaW50bCdcbmltcG9ydCBodW1hbml6ZSBmcm9tICdodW1hbml6ZSdcblxuaW1wb3J0IERhdGFUYWJsZSwgeyBEYXRhQ29sdW1uIH0gZnJvbSAnLi4vLi4vY29tbW9uL2NvbXBvbmVudHMvZGF0YS10YWJsZSdcblxuY29uc3QgbWVzc2FnZXMgPSBkZWZpbmVNZXNzYWdlcyh7XG4gIG5hbWU6IHtcbiAgICBpZDogJ25hbWUnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnTmFtZSdcbiAgfSxcbiAgc2l6ZToge1xuICAgIGlkOiAnc2l6ZScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdTaXplJ1xuICB9LFxuICBsYXN0TW9kaWZpY2F0aW9uOiB7XG4gICAgaWQ6ICdsYXN0TW9kaWZpY2F0aW9uJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0xhc3QgbW9kaWZpY2F0aW9uJ1xuICB9LFxuICBhY3Rpb25zOiB7XG4gICAgaWQ6ICdhY3Rpb25zJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0FjdGlvbnMnXG4gIH0sXG4gIHRoZUZpbGVXaWxsQmVEZWxldGVkOiB7XG4gICAgaWQ6ICd0aGVGaWxlV2lsbEJlRGVsZXRlZCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgZmlsZSB3aWxsIGJlIGRlbGV0ZWQnXG4gIH0sXG4gIHllczoge1xuICAgIGlkOiAneWVzJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1llcydcbiAgfSxcbiAgYXJlWW91U3VyZVF1ZXN0aW9uTWFyazoge1xuICAgIGlkOiAnYXJlWW91U3VyZVF1ZXN0aW9uTWFyaycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdBcmUgeW91IHN1cmU/J1xuICB9LFxuICBkZWxldGU6IHtcbiAgICBpZDogJ2RlbGV0ZScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdEZWxldGUnXG4gIH1cbn0pXG5cbmNsYXNzIEZpbGVzVGFibGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIHRoaXMuaGFuZGxlUmVzaXplID0gKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBoZWlnaHRXaW5kb3cgPSBOdW1iZXIuaXNOYU4od2luZG93LmlubmVySGVpZ2h0KVxuICAgICAgICA/IHdpbmRvdy5jbGllbnRIZWlnaHRcbiAgICAgICAgOiB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgICAgIGNvbnN0IGhlaWdodEZpbGVzQnV0dG9ucyA9ICh0aGlzLnRhYmxlUmVmKSA/IHRoaXMudGFibGVSZWYub2Zmc2V0VG9wIDogMFxuXG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgaGVpZ2h0OiAoaGVpZ2h0V2luZG93KSA/IChoZWlnaHRXaW5kb3cgLSBoZWlnaHRGaWxlc0J1dHRvbnMpIC0gMTAgOiAwXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuaGFuZGxlSXRlbUNsaWNrID0gKGl0ZW0pID0+IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcblxuICAgICAgY29uc3QgeyBvbkl0ZW1DbGljayB9ID0gdGhpcy5wcm9wc1xuICAgICAgaWYgKG9uSXRlbUNsaWNrKSBvbkl0ZW1DbGljayhpdGVtKVxuICAgIH1cblxuICAgIHRoaXMuaGFuZGxlRGVsZXRlID0gKHBhdGgpID0+IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcblxuICAgICAgY29uc3QgeyBkZWxldGVGaWxlIH0gPSB0aGlzLnByb3BzXG4gICAgICBpZiAoZGVsZXRlRmlsZSkgZGVsZXRlRmlsZShwYXRoKVxuICAgIH1cblxuICAgIHRoaXMuaGFuZGxlTmFtZVNvcnQgPSAoc29ydEtleSwgc29ydFR5cGUpID0+IHtcbiAgICAgIHJldHVybiAoYSwgYikgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGFbc29ydEtleV0gPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICB0eXBlb2YgYltzb3J0S2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZhbEEgPSBhW3NvcnRLZXldLm5hbWVcbiAgICAgICAgbGV0IHZhbEIgPSBiW3NvcnRLZXldLm5hbWVcblxuICAgICAgICBpZiAodHlwZW9mIHZhbEEgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICB0eXBlb2YgdmFsQiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWxBID09PSAnc3RyaW5nJykgdmFsQSA9IHZhbEEudG9Mb3dlckNhc2UoKVxuICAgICAgICBpZiAodHlwZW9mIHZhbEIgPT09ICdzdHJpbmcnKSB2YWxCID0gdmFsQi50b0xvd2VyQ2FzZSgpXG5cbiAgICAgICAgaWYgKHNvcnRUeXBlID09PSAnQVNDJykge1xuICAgICAgICAgIGlmICh2YWxBIDwgdmFsQikgcmV0dXJuIC0xXG4gICAgICAgICAgaWYgKHZhbEEgPiB2YWxCKSByZXR1cm4gMVxuICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHZhbEEgPiB2YWxCKSByZXR1cm4gLTFcbiAgICAgICAgICBpZiAodmFsQSA8IHZhbEIpIHJldHVybiAxXG4gICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaGFuZGxlUm93U2VsZWN0ZWQgPSB0aGlzLnByb3BzLm9uUm93U2VsZWN0ZWRcbiAgICAgID8gdGhpcy5wcm9wcy5vblJvd1NlbGVjdGVkXG4gICAgICA6IChpZGVudGlmaWVyLCByb3dEYXRhKSA9PiB7fVxuXG4gICAgdGhpcy5oYW5kbGVSb3dVbnNlbGVjdGVkID0gdGhpcy5wcm9wcy5vblJvd1Vuc2VsZWN0ZWRcbiAgICAgID8gdGhpcy5wcm9wcy5vblJvd1Vuc2VsZWN0ZWRcbiAgICAgIDogKGlkZW50aWZpZXIsIHJvd0RhdGEpID0+IHt9XG5cbiAgICB0aGlzLnN0YXRlID0geyBoZWlnaHQ6IDAgfVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGhlaWdodCB9ID0gdGhpcy5zdGF0ZVxuICAgIGNvbnN0IHsgaXRlbXMsIGludGw6IHsgZm9ybWF0TWVzc2FnZSwgZm9ybWF0UmVsYXRpdmUgfSB9ID0gdGhpcy5wcm9wc1xuXG4gICAgY29uc3QgcGF0aENvbCA9IG5ldyBEYXRhQ29sdW1uKHtcbiAgICAgIGRhdGFLZXk6ICdwYXRoJyxcbiAgICAgIG5hbWU6ICdQYXRoJyxcbiAgICAgIGhpZGRlbjogdHJ1ZVxuICAgIH0pXG4gICAgY29uc3QgbmFtZUNvbCA9IG5ldyBEYXRhQ29sdW1uKHtcbiAgICAgIGRhdGFLZXk6ICdiYXNlbmFtZScsXG4gICAgICBuYW1lOiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLm5hbWUpLFxuICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICBzb3J0UHJvcHM6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICdzb3J0LWhhbmRsZXInOiB0aGlzLmhhbmRsZU5hbWVTb3J0XG4gICAgICB9LFxuICAgICAgYWxpZ246ICdsZWZ0JyxcbiAgICAgIGNlbGxGb3JtYXR0ZXI6IChkYXRhKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGEubmFtZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgICAgICAgdHlwZW9mIGRhdGEuaXNEaXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBkYXRhLnBhdGggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBnbHlwaCA9IGRhdGEuaXNEaXJcbiAgICAgICAgICAgICAgPyBkYXRhLmlzRHJpdmVcbiAgICAgICAgICAgICAgICA/ICdoZGQnXG4gICAgICAgICAgICAgICAgOiAnZm9sZGVyLW9wZW4nXG4gICAgICAgICAgICAgIDogJ2ZpbGUnXG4gICAgICAgICAgICBjb25zdCBjZWxsQ29udGVudCA9IChcbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPXtnbHlwaH0gLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj57IGRhdGEubmFtZSB9PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmIChkYXRhLmlzUmVhZGFibGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8YSBjbGFzc05hbWU9J2ZpbGUtbGluaycgb25DbGljaz17dGhpcy5oYW5kbGVJdGVtQ2xpY2soZGF0YSl9PlxuICAgICAgICAgICAgICAgICAgeyBjZWxsQ29udGVudCB9XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBDYW4ndCBiZSBkb3dubG9hZGVkXG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdmaWxlLWxpbmsnPlxuICAgICAgICAgICAgICAgICAgeyBjZWxsQ29udGVudCB9XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnTi9BJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZGF0YVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICBjb25zdCBzaXplQ29sID0gbmV3IERhdGFDb2x1bW4oe1xuICAgICAgZGF0YUtleTogJ3NpemUnLFxuICAgICAgbmFtZTogZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5zaXplKSxcbiAgICAgIGFsaWduOiAncmlnaHQnLFxuICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICB3aWR0aDogJzIwJScsXG4gICAgICBzb3J0UHJvcHM6IHtcbiAgICAgICAgdHlwZTogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICBjZWxsRm9ybWF0dGVyOiAoc2l6ZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNpemUgPT09ICd1bmRlZmluZWQnKSBzaXplID0gaHVtYW5pemUuZmlsZXNpemUoMClcbiAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PT0gZmFsc2UpIHNpemUgPSAnLS0nXG4gICAgICAgIGVsc2Ugc2l6ZSA9IGh1bWFuaXplLmZpbGVzaXplKHNpemUpXG4gICAgICAgIHJldHVybiBzaXplXG4gICAgICB9XG4gICAgfSlcbiAgICBjb25zdCBsbW9kQ29sID0gbmV3IERhdGFDb2x1bW4oe1xuICAgICAgZGF0YUtleTogJ2xhc3RNb2RpZmljYXRpb24nLFxuICAgICAgbmFtZTogZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5sYXN0TW9kaWZpY2F0aW9uKSxcbiAgICAgIGFsaWduOiAncmlnaHQnLFxuICAgICAgd2lkdGg6ICcyMCUnLFxuICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICBjZWxsRm9ybWF0dGVyOiAodGltZXN0YW1wKSA9PiB0aW1lc3RhbXAgPj0gMFxuICAgICAgICA/IGZvcm1hdFJlbGF0aXZlKHRpbWVzdGFtcCAqIDEwMDApXG4gICAgICAgIDogJy0tJ1xuICAgIH0pXG4gICAgY29uc3QgYnV0dG9uc0NvbCA9IG5ldyBEYXRhQ29sdW1uKHtcbiAgICAgIGRhdGFLZXk6ICdidXR0b25zJyxcbiAgICAgIG5hbWU6IGZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuYWN0aW9ucyksXG4gICAgICBhbGlnbjogJ2NlbnRlcicsXG4gICAgICB3aWR0aDogJzUlJyxcbiAgICAgIGNlbGxGb3JtYXR0ZXI6IChkYXRhKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgZGF0YS5pc0ZpbGUgJiYgZGF0YS5jYW5CZURlbGV0ZWQpIHtcbiAgICAgICAgICBpZiAoZGF0YS5pc0RlbGV0aW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8R2x5cGhpY29uXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPSdnbHlwaGljb24tcmVmcmVzaC1hbmltYXRlJ1xuICAgICAgICAgICAgICAgIGdseXBoPSdyZWZyZXNoJyAvPlxuICAgICAgICAgICAgKVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPE92ZXJsYXlUcmlnZ2VyIHRyaWdnZXI9J2NsaWNrJyBwbGFjZW1lbnQ9J2xlZnQnIHJvb3RDbG9zZSBvdmVybGF5PXtcbiAgICAgICAgICAgICAgPFBvcG92ZXJcbiAgICAgICAgICAgICAgICBpZD0ncG9wb3Zlci1jb25maXJtLWRlbGV0ZSdcbiAgICAgICAgICAgICAgICB0aXRsZT17Zm9ybWF0TWVzc2FnZShtZXNzYWdlcy5hcmVZb3VTdXJlUXVlc3Rpb25NYXJrKX0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3RleHQtY2VudGVyJz5cbiAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy50aGVGaWxlV2lsbEJlRGVsZXRlZH0gLz5cbiAgICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBic1N0eWxlPSdkYW5nZXInXG4gICAgICAgICAgICAgICAgICAgIGJzU2l6ZT0nc21hbGwnXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPSdDb25maXJtIGRlbGV0aW9uJ1xuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmhhbmRsZURlbGV0ZShkYXRhLnBhdGgpfT5cbiAgICAgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLnllc30gLz5cbiAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L1BvcG92ZXI+XG4gICAgICAgICAgICAgIH0+XG4gICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICBic1N0eWxlPSdkZWZhdWx0J1xuICAgICAgICAgICAgICAgIGJzU2l6ZT0neHNtYWxsJ1xuICAgICAgICAgICAgICAgIHRpdGxlPXtmb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmRlbGV0ZSl9PlxuICAgICAgICAgICAgICAgIDxHbHlwaGljb24gZ2x5cGg9J3RyYXNoJyAvPlxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgIDwvT3ZlcmxheVRyaWdnZXI+XG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgY29uc3QgY29tcG9uZW50U3R5bGUgPSB7fVxuICAgIGlmIChoZWlnaHQpIHtcbiAgICAgIGNvbXBvbmVudFN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCdcbiAgICAgIGNvbXBvbmVudFN0eWxlLm92ZXJmbG93ID0gJ2F1dG8nXG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgaWQ9J2ZpbGVzLXRhYmxlJ1xuICAgICAgICBzdHlsZT17Y29tcG9uZW50U3R5bGV9XG4gICAgICAgIHJlZj17KHJlZikgPT4geyB0aGlzLnRhYmxlUmVmID0gcmVmIH19PlxuICAgICAgICA8RGF0YVRhYmxlXG4gICAgICAgICAga2V5VmFsdWU9J3BhdGgnXG4gICAgICAgICAgY29sdW1ucz17WyBwYXRoQ29sLCBuYW1lQ29sLCBzaXplQ29sLCBsbW9kQ29sLCBidXR0b25zQ29sIF19XG4gICAgICAgICAgZGF0YT17aXRlbXN9XG4gICAgICAgICAgb25Sb3dTZWxlY3RlZD17dGhpcy5oYW5kbGVSb3dTZWxlY3RlZH1cbiAgICAgICAgICBvblJvd1Vuc2VsZWN0ZWQ9e3RoaXMuaGFuZGxlUm93VW5zZWxlY3RlZH1cbiAgICAgICAgICBob3ZlclxuICAgICAgICAgIHJlc3BvbnNpdmUgLz5cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICB0aGlzLmhhbmRsZVJlc2l6ZSgpXG4gICAgaWYgKHdpbmRvdykgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuaGFuZGxlUmVzaXplKVxuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQgKCkge1xuICAgIGlmICh3aW5kb3cpIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLmhhbmRsZVJlc2l6ZSlcbiAgfVxufVxuXG5GaWxlc1RhYmxlLnByb3BUeXBlcyA9IHtcbiAgaXRlbXM6IFJlYWN0LlByb3BUeXBlcy5hcnJheSxcbiAgb25JdGVtQ2xpY2s6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBvblJvd1NlbGVjdGVkOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgb25Sb3dVbnNlbGVjdGVkOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgZGVsZXRlRmlsZTogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGludGw6IGludGxTaGFwZS5pc1JlcXVpcmVkXG59XG5cbkZpbGVzVGFibGUuZGVmYXVsdFByb3BzID0ge1xuICBpdGVtczogW11cbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5qZWN0SW50bChGaWxlc1RhYmxlKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgY29ubmVjdCB9IGZyb20gJ3JlYWN0LXJlZHV4J1xuaW1wb3J0IHsgQWxlcnQsIE1vZGFsIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuaW1wb3J0IHsgZGVmaW5lTWVzc2FnZXMsIEZvcm1hdHRlZE1lc3NhZ2UgfSBmcm9tICdyZWFjdC1pbnRsJ1xuXG5pbXBvcnQgeyBjbGVhclVwbG9hZEZpbGVFcnJvciB9IGZyb20gJy4uLy4uL2FjdGlvbnMvZmlsZXMnXG5pbXBvcnQgeyBnZXRVcGxvYWRFcnJvcnMgfSBmcm9tICcuLi8uLi9yZWR1Y2Vycy9maWxlcydcblxuaW1wb3J0IFVwbG9hZHMgZnJvbSAnLi91cGxvYWRzJ1xuXG5jb25zdCBtZXNzYWdlcyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgdXBsb2Fkczoge1xuICAgIGlkOiAndXBsb2FkcycsIGRlZmF1bHRNZXNzYWdlOiAnVXBsb2FkcydcbiAgfVxufSlcblxuY29uc3QgVXBsb2Fkc01vZGFsID0gKHtcbiAgZGlybmFtZSwgc2VwYXJhdG9yLCBzaG93LCBoYW5kbGVIaWRlLCB1cGxvYWRFbmFibGVkLFxuICB1cGxvYWRFcnJvcnMsIGNsZWFyVXBsb2FkRXJyb3Jcbn0pID0+IChcbiAgPE1vZGFsIHNob3c9e3Nob3d9IG9uSGlkZT17aGFuZGxlSGlkZX0+XG4gICAgPE1vZGFsLkhlYWRlciBjbG9zZUJ1dHRvbj5cbiAgICAgIDxNb2RhbC5UaXRsZT5cbiAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLnVwbG9hZHN9IC8+XG4gICAgICA8L01vZGFsLlRpdGxlPlxuICAgIDwvTW9kYWwuSGVhZGVyPlxuICAgIDxNb2RhbC5Cb2R5PlxuICAgICAgeyB1cGxvYWRFcnJvcnMubGVuZ3RoID4gMCAmJlxuICAgICAgICB1cGxvYWRFcnJvcnMubWFwKCh7IHBhdGgsIG1lc3NhZ2UgfSwgaSkgPT4gKFxuICAgICAgICAgIDxBbGVydFxuICAgICAgICAgICAga2V5PXtpfVxuICAgICAgICAgICAgYnNTdHlsZT0nZGFuZ2VyJ1xuICAgICAgICAgICAgb25EaXNtaXNzPXsoZSkgPT4gY2xlYXJVcGxvYWRFcnJvcihwYXRoKX0+XG4gICAgICAgICAgICB7IG1lc3NhZ2UgfVxuICAgICAgICAgIDwvQWxlcnQ+XG4gICAgICAgICkpXG4gICAgICB9XG4gICAgICA8VXBsb2Fkc1xuICAgICAgICBkaXJuYW1lPXtkaXJuYW1lfVxuICAgICAgICBzZXBhcmF0b3I9e3NlcGFyYXRvcn1cbiAgICAgICAgdXBsb2FkRW5hYmxlZD17dXBsb2FkRW5hYmxlZH0gLz5cbiAgICA8L01vZGFsLkJvZHk+XG4gIDwvTW9kYWw+XG4pXG5cblVwbG9hZHNNb2RhbC5wcm9wVHlwZXMgPSB7XG4gIGRpcm5hbWU6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgc2VwYXJhdG9yOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuXG4gIHNob3c6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBoYW5kbGVIaWRlOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgdXBsb2FkRW5hYmxlZDogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG5cbiAgdXBsb2FkRXJyb3JzOiBSZWFjdC5Qcm9wVHlwZXMuYXJyYXlPZihSZWFjdC5Qcm9wVHlwZXMuc2hhcGUoe1xuICAgIHBhdGg6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gICAgY29kZTogUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgICBtZXNzYWdlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nXG4gIH0pKSxcbiAgY2xlYXJVcGxvYWRFcnJvcjogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxufVxuXG5VcGxvYWRzTW9kYWwuZGVmYXVsdFByb3BUeXBlcyA9IHtcbiAgc2hvdzogZmFsc2UsXG4gIHVwbG9hZEVycm9yczogW11cbn1cblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHsgZmlsZXMgfSkgPT4gKHtcbiAgdXBsb2FkRXJyb3JzOiBnZXRVcGxvYWRFcnJvcnMoZmlsZXMpXG59KVxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gKGRpc3BhdGNoKSA9PiAoe1xuICBjbGVhclVwbG9hZEVycm9yOiAocGF0aCkgPT4gZGlzcGF0Y2goY2xlYXJVcGxvYWRGaWxlRXJyb3IocGF0aCkpXG59KVxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoVXBsb2Fkc01vZGFsKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQnV0dG9uLCBMaXN0R3JvdXAsIExpc3RHcm91cEl0ZW0gfSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQgeyBkZWZpbmVNZXNzYWdlcywgRm9ybWF0dGVkTWVzc2FnZSB9IGZyb20gJ3JlYWN0LWludGwnXG5cbmltcG9ydCBGaWxlc1VwbG9hZENvbnRyb2xsZXIgZnJvbSAnLi4vLi4vbGliL2ZpbGVzL2ZpbGVzLXVwbG9hZC1jb250cm9sbGVyJ1xuaW1wb3J0IFVzZXJGaWxlIGZyb20gJy4uLy4uL2xpYi9maWxlcy91c2VyLWZpbGUnXG5pbXBvcnQgRWxsaXBzaXplIGZyb20gJy4uL2VsbGlwc2l6ZSdcbmltcG9ydCBQcm9ncmVzc0JhciBmcm9tICcuLi9wcm9ncmVzcy1iYXInXG5pbXBvcnQgRmlsZURyb3B6b25lIGZyb20gJy4vZmlsZS1kcm9wem9uZSdcbmltcG9ydCBGaWxlRHJvcE1lc3NhZ2UgZnJvbSAnLi9maWxlLWRyb3AtbWVzc2FnZSdcblxuY29uc3QgRklMRU5BTUVfTUFYX0xFTkdUSCA9IDUwXG5cbmNvbnN0IG1lc3NhZ2VzID0gZGVmaW5lTWVzc2FnZXMoe1xuICBjbGlja1RvVXBsb2FkOiB7XG4gICAgaWQ6ICdjbGljay10by11cGxvYWQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnQ2xpY2sgdG8gdXBsb2FkJ1xuICB9XG59KVxuXG5jbGFzcyBVcGxvYWRzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICB0aGlzLmRyb3B6b25lID0gbnVsbFxuICAgIHRoaXMub3BlblVwbG9hZHNTZWxlY3RvciA9ICgpID0+IHsgaWYgKHRoaXMuZHJvcHpvbmUpIHRoaXMuZHJvcHpvbmUub3BlbigpIH1cbiAgICB0aGlzLmhhbmRsZVVwbG9hZENsaWNrID0gKGUpID0+IHRoaXMub3BlblVwbG9hZHNTZWxlY3RvcigpXG4gICAgY29uc3QgYWRkRmlsZSA9IChmaWxlSGFuZGxlKSA9PiB7XG4gICAgICBjb25zdCB7IGRpcm5hbWUsIHNlcGFyYXRvciB9ID0gdGhpcy5wcm9wc1xuICAgICAgY29uc3QgdHlwZU9TID0gc2VwYXJhdG9yID09PSAnLycgPyAnbGludXgnIDogJ3dpbidcbiAgICAgIGNvbnN0IGZpbGUgPSBuZXcgVXNlckZpbGUoZmlsZUhhbmRsZSwgZGlybmFtZSwgdHlwZU9TKVxuICAgICAgRmlsZXNVcGxvYWRDb250cm9sbGVyLmFkZEZpbGUoZmlsZSlcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVGaWxlc0Ryb3AgPSAoYWNjZXB0ZWRGaWxlcykgPT4ge1xuICAgICAgaWYgKHRoaXMucHJvcHMudXBsb2FkRW5hYmxlZCkgYWNjZXB0ZWRGaWxlcy5mb3JFYWNoKGFkZEZpbGUpXG4gICAgfVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGZpbGVzLCB1cGxvYWRFbmFibGVkLCBvblJlbW92ZUZpbGUgfSA9IHRoaXMucHJvcHNcblxuICAgIHJldHVybiAoXG4gICAgICA8RmlsZURyb3B6b25lXG4gICAgICAgIGRyb3B6b25lUmVmPXsocmVmKSA9PiB7IHRoaXMuZHJvcHpvbmUgPSByZWYgfX1cbiAgICAgICAgb25Ecm9wPXt0aGlzLmhhbmRsZUZpbGVzRHJvcH1cbiAgICAgICAgb3ZlcmxheU1lc3NhZ2U9ezxGaWxlRHJvcE1lc3NhZ2UgdXBsb2FkRW5hYmxlZD17dXBsb2FkRW5hYmxlZH0gLz59XG4gICAgICAgIGRpc2FibGVDbGlja1xuICAgICAgICBkaXNhYmxlUHJldmlldz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2ZpbGUtdXBsb2Fkcyc+XG4gICAgICAgICAgeyB1cGxvYWRFbmFibGVkICYmXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ndGV4dC1jZW50ZXInPlxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT0nYnV0dG9uJ1xuICAgICAgICAgICAgICAgIGJzU3R5bGU9J3ByaW1hcnknXG4gICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5oYW5kbGVVcGxvYWRDbGlja30+XG4gICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLmNsaWNrVG9VcGxvYWR9IC8+XG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfVxuICAgICAgICAgIHsgZmlsZXMubGVuZ3RoID4gMCAmJiA8YnIgLz4gfVxuICAgICAgICAgIHsgZmlsZXMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgPExpc3RHcm91cD5cbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZpbGVzLm1hcCgoeyBiYXNlbmFtZTogbmFtZSwgcGF0aCwgcHJvZ3Jlc3MgfSwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICAgIDxMaXN0R3JvdXBJdGVtXG4gICAgICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgICAgIGJzU3R5bGU9eyhwcm9ncmVzcyA8IDEwMCkgPyAnaW5mbycgOiAnc3VjY2Vzcyd9PlxuICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT0nYnV0dG9uJ1xuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT0nY2xvc2UnXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IG9uUmVtb3ZlRmlsZShwYXRoKX0+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+JnRpbWVzOzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxFbGxpcHNpemUgbWF4PXtGSUxFTkFNRV9NQVhfTEVOR1RIfT57bmFtZX08L0VsbGlwc2l6ZT5cbiAgICAgICAgICAgICAgICAgICAgPFByb2dyZXNzQmFyIHZhbHVlPXtwcm9ncmVzc30gLz5cbiAgICAgICAgICAgICAgICAgIDwvTGlzdEdyb3VwSXRlbT5cbiAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L0xpc3RHcm91cD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9GaWxlRHJvcHpvbmU+XG4gICAgKVxuICB9XG59XG5cblVwbG9hZHMucHJvcFR5cGVzID0ge1xuICBkaXJuYW1lOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLmlzUmVxdWlyZWQsXG4gIHNlcGFyYXRvcjogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgZmlsZXM6IFJlYWN0LlByb3BUeXBlcy5hcnJheSxcbiAgdXBsb2FkRW5hYmxlZDogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIG9uUmVtb3ZlRmlsZTogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZFxufVxuXG5VcGxvYWRzLmRlZmF1bHRQcm9wcyA9IHtcbiAgc2VwYXJhdG9yOiAnLycsXG4gIGZpbGVzOiBbXVxufVxuXG5jbGFzcyBVcGxvYWRzQ29udGFpbmVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICB0aGlzLmdldFVwbG9hZEZpbGVzID0gKCkgPT4gKHtcbiAgICAgIGZpbGVzOiBGaWxlc1VwbG9hZENvbnRyb2xsZXIuZmlsZXMubWFwKChmaWxlVXBsb2FkLCBpbmRleCkgPT4gKHtcbiAgICAgICAgcGF0aDogZmlsZVVwbG9hZC5maWxlLnBhdGgsXG4gICAgICAgIGRpcm5hbWU6IGZpbGVVcGxvYWQuZmlsZS5kaXJuYW1lLFxuICAgICAgICBiYXNlbmFtZTogZmlsZVVwbG9hZC5maWxlLmJhc2VuYW1lLFxuICAgICAgICBwcm9ncmVzczogZmlsZVVwbG9hZC5wcm9ncmVzc1xuICAgICAgfSkpXG4gICAgfSlcblxuICAgIHRoaXMuaGFuZGxlRmlsZSA9ICgpID0+IHRoaXMuc2V0U3RhdGUodGhpcy5nZXRVcGxvYWRGaWxlcylcblxuICAgIHRoaXMuaGFuZGxlUmVtb3ZlRmlsZSA9IChwYXRoKSA9PiBGaWxlc1VwbG9hZENvbnRyb2xsZXIucmVtb3ZlRmlsZShwYXRoKVxuXG4gICAgdGhpcy5zdGF0ZSA9IHRoaXMuZ2V0VXBsb2FkRmlsZXMoKVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGZpbGVzIH0gPSB0aGlzLnN0YXRlXG4gICAgY29uc3QgeyBkaXJuYW1lLCBzZXBhcmF0b3IsIHVwbG9hZEVuYWJsZWQgfSA9IHRoaXMucHJvcHNcbiAgICByZXR1cm4gKFxuICAgICAgPFVwbG9hZHNcbiAgICAgICAgZGlybmFtZT17ZGlybmFtZX1cbiAgICAgICAgc2VwYXJhdG9yPXtzZXBhcmF0b3J9XG4gICAgICAgIHVwbG9hZEVuYWJsZWQ9e3VwbG9hZEVuYWJsZWR9XG4gICAgICAgIGZpbGVzPXtmaWxlc31cbiAgICAgICAgb25SZW1vdmVGaWxlPXt0aGlzLmhhbmRsZVJlbW92ZUZpbGV9IC8+XG4gICAgKVxuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIEZpbGVzVXBsb2FkQ29udHJvbGxlci5vbignZmlsZScsIHRoaXMuaGFuZGxlRmlsZSlcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50ICgpIHtcbiAgICBGaWxlc1VwbG9hZENvbnRyb2xsZXIucmVtb3ZlTGlzdGVuZXIoJ2ZpbGUnLCB0aGlzLmhhbmRsZUZpbGUpXG4gIH1cbn1cblxuVXBsb2Fkc0NvbnRhaW5lci5wcm9wVHlwZXMgPSB7XG4gIGRpcm5hbWU6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgc2VwYXJhdG9yOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICB1cGxvYWRFbmFibGVkOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbFxufVxuXG5leHBvcnQgZGVmYXVsdCBVcGxvYWRzQ29udGFpbmVyXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnXG5pbXBvcnQgeyBHbHlwaGljb24sIE5hdmJhciwgTmF2LCBNZW51SXRlbSwgTmF2SXRlbSB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcbmltcG9ydCB7IEZvcm1hdHRlZE1lc3NhZ2UgfSBmcm9tICdyZWFjdC1pbnRsJ1xuXG5pbXBvcnQge1xuICBzZWxlY3RTZWN0aW9uLCBmZXRjaFJlbW90ZVNlY3Rpb24sIGluZm9ybVJlbW90ZVNlY3Rpb25cbn0gZnJvbSAnLi4vYWN0aW9ucy9hcHAnXG5pbXBvcnQgeyBnZXRTZWN0aW9ucywgZ2V0QWN0aXZlU2VjdGlvbiB9IGZyb20gJy4uL3JlZHVjZXJzL2FwcCdcbmltcG9ydCBFbGxpcHNpemUgZnJvbSAnLi9lbGxpcHNpemUnXG5cbmV4cG9ydCBjbGFzcyBIZWFkZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIGlmIChwcm9wcy5zZWxlY3RTZWN0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdFNlY3Rpb24gPSAoc2VjdGlvbikgPT4gKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2VjdGlvbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBwcm9wcy5zZWxlY3RTZWN0aW9uKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9wcy5zZWxlY3RTZWN0aW9uKHNlY3Rpb24ua2V5KVxuICAgICAgICAgIC8vIFJlcXVlc3QgY29uZGl0aW9uXG4gICAgICAgICAgY29uc3QgcmVxdWVzdENvbmRpdGlvbiA9ICFzZWN0aW9uLmFsbG93ICYmXG4gICAgICAgICAgICAhc2VjdGlvbi5mZXRjaGluZ1JlbW90ZSAmJlxuICAgICAgICAgICAgIXNlY3Rpb24uYmxvY2tSZXF1ZXN0XG4gICAgICAgICAgaWYgKHJlcXVlc3RDb25kaXRpb24pIHtcbiAgICAgICAgICAgIGlmIChzZWN0aW9uLmluZm9ybSkgcHJvcHMuaW5mb3JtU2VjdGlvbihzZWN0aW9uLmtleSlcbiAgICAgICAgICAgIGVsc2UgcHJvcHMuZmV0Y2hTZWN0aW9uKHNlY3Rpb24ua2V5KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJvcHMuaGFuZGxlRGlzY29ubmVjdENsaWNrKSB7XG4gICAgICB0aGlzLmhhbmRsZURpc2Nvbm5lY3RDbGljayA9IHByb3BzLmhhbmRsZURpc2Nvbm5lY3RDbGlja1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhhbmRsZURpc2Nvbm5lY3RDbGljayA9ICgpID0+IHt9XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IGxvZ28sIHNlY3Rpb25zLCBhY3RpdmVTZWN0aW9uLCBhZ2VudElELCBhZ2VudEhvc3RuYW1lIH0gPSB0aGlzLnByb3BzXG5cbiAgICByZXR1cm4gKFxuICAgICAgPE5hdmJhciBpZD0nZWhvcnVzLWhlYWRlcicgZml4ZWRUb3AgaW52ZXJzZSBjb2xsYXBzZU9uU2VsZWN0IGZsdWlkPlxuICAgICAgICA8TmF2YmFyLkhlYWRlcj5cbiAgICAgICAgICB7IGxvZ28ubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgPE5hdmJhci5CcmFuZD5cbiAgICAgICAgICAgICAgPGltZyBzcmM9e2xvZ299IG9uQ2xpY2s9e3RoaXMuc2VsZWN0U2VjdGlvbigpfSAvPlxuICAgICAgICAgICAgPC9OYXZiYXIuQnJhbmQ+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxOYXZiYXIuVG9nZ2xlIC8+XG4gICAgICAgIDwvTmF2YmFyLkhlYWRlcj5cblxuICAgICAgICA8TmF2YmFyLkNvbGxhcHNlPlxuICAgICAgICAgIDxOYXY+XG4gICAgICAgICAgICB7IHNlY3Rpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgc2VjdGlvbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChzZWN0aW9uKSA9PiBzZWN0aW9uLmVuYWJsZWQpXG4gICAgICAgICAgICAgICAgLm1hcCgoc2VjdGlvbiwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICAgIDxOYXZJdGVtXG4gICAgICAgICAgICAgICAgICAgIGtleT17aW5kZXh9XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50S2V5PXtpbmRleCArIDF9XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZT17YWN0aXZlU2VjdGlvbiA9PT0gc2VjdGlvbi5rZXl9XG4gICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0PXt0aGlzLnNlbGVjdFNlY3Rpb24oc2VjdGlvbil9PlxuICAgICAgICAgICAgICAgICAgICB7ICEhc2VjdGlvbi5uYW1lICYmIHNlY3Rpb24ubmFtZS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPXtzZWN0aW9uLmtleX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRNZXNzYWdlPXtzZWN0aW9uLm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9OYXZJdGVtPlxuICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9OYXY+XG5cbiAgICAgICAgICA8TmF2IHB1bGxSaWdodD5cbiAgICAgICAgICAgIDxNZW51SXRlbSBldmVudEtleT0nMScgb25TZWxlY3Q9e3RoaXMuaGFuZGxlRGlzY29ubmVjdENsaWNrfT5cbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3sgcG9zaXRpb246ICdyZWxhdGl2ZScsIHRvcDogJzJweCcgfX0+XG4gICAgICAgICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD0nb2ZmJyAvPlxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuPiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgICAgeyBhZ2VudEhvc3RuYW1lLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICA8c3Bhbj4oPEVsbGlwc2l6ZSBtYXg9ezEwfT57IGFnZW50SG9zdG5hbWUgfTwvRWxsaXBzaXplPik8L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgeyBhZ2VudEhvc3RuYW1lLmxlbmd0aCA8PSAwICYmIGFnZW50SUQubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgIDxzcGFuPig8RWxsaXBzaXplIG1heD17MTB9PnsgYElEOiAke2FnZW50SUR9YCB9PC9FbGxpcHNpemU+KTwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9NZW51SXRlbT5cbiAgICAgICAgICA8L05hdj5cbiAgICAgICAgPC9OYXZiYXIuQ29sbGFwc2U+XG4gICAgICA8L05hdmJhcj5cbiAgICApXG4gIH1cbn1cblxuSGVhZGVyLnByb3BUeXBlcyA9IHtcbiAgbG9nbzogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgYWN0aXZlU2VjdGlvbjogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgc2VjdGlvbnM6IFJlYWN0LlByb3BUeXBlcy5hcnJheSxcbiAgc2VsZWN0U2VjdGlvbjogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGZldGNoU2VjdGlvbjogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGluZm9ybVNlY3Rpb246IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBoYW5kbGVEaXNjb25uZWN0Q2xpY2s6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICAvLyBBZ2VudCBpbmZvXG4gIGFnZW50SUQ6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGFnZW50SG9zdG5hbWU6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmdcbn1cblxuSGVhZGVyLmRlZmF1bHRQcm9wcyA9IHtcbiAgbG9nbzogJycsXG4gIGFjdGl2ZVNlY3Rpb246ICcnLFxuICBzZWN0aW9uczogW10sXG4gIGZldGNoU2VjdGlvbjogKCkgPT4ge30sXG4gIGluZm9ybVNlY3Rpb246ICgpID0+IHt9LFxuICAvLyBBZ2VudCBpbmZvXG4gIGFnZW50SUQ6ICcnLFxuICBhZ2VudEhvc3RuYW1lOiAnJ1xufVxuXG5jb25zdCBtYXBTdGF0ZVRvUHJvcHMgPSAoc3RhdGUsIHByb3BzKSA9PiB7XG4gIGNvbnN0IG5ld1Byb3BzID0ge1xuICAgIGxvZ286IHN0YXRlLmFwcC5sb2dvVVJMLFxuICAgIHNlY3Rpb25zOiBnZXRTZWN0aW9ucyhzdGF0ZS5hcHApXG4gIH1cbiAgY29uc3QgYWN0aXZlU2VjdGlvbiA9IGdldEFjdGl2ZVNlY3Rpb24oc3RhdGUuYXBwKVxuICBpZiAoYWN0aXZlU2VjdGlvbikgbmV3UHJvcHMuYWN0aXZlU2VjdGlvbiA9IGFjdGl2ZVNlY3Rpb25cblxuICByZXR1cm4gbmV3UHJvcHNcbn1cbmNvbnN0IG1hcERpc3BhdGNoVG9Qcm9wcyA9IChkaXNwYXRjaCwgcHJvcHMpID0+IHtcbiAgcmV0dXJuIHtcbiAgICBmZXRjaFNlY3Rpb246IChrZXkpID0+IGRpc3BhdGNoKGZldGNoUmVtb3RlU2VjdGlvbihrZXkpKSxcbiAgICBpbmZvcm1TZWN0aW9uOiAoa2V5KSA9PiBkaXNwYXRjaChpbmZvcm1SZW1vdGVTZWN0aW9uKGtleSkpLFxuICAgIHNlbGVjdFNlY3Rpb246IChrZXkpID0+IGRpc3BhdGNoKHNlbGVjdFNlY3Rpb24oa2V5KSlcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdChtYXBTdGF0ZVRvUHJvcHMsIG1hcERpc3BhdGNoVG9Qcm9wcykoSGVhZGVyKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgSnVtYm90cm9uLCBCdXR0b24gfSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQgeyBpbmplY3RJbnRsLCBpbnRsU2hhcGUsIGRlZmluZU1lc3NhZ2VzIH0gZnJvbSAncmVhY3QtaW50bCdcbmltcG9ydCB7IEFVVEhfSU5WQUxJRCwgQVVUSF9USU1FT1VUIH0gZnJvbSAnLi4vY29uc3RhbnRzL2F1dGgnXG5pbXBvcnQge1xuICBDTE9TRV9OT1JNQUwsIENMT1NFX0dPSU5HX0FXQVksIENMT1NFX1BST1RPQ09MX0VSUk9SLCBDTE9TRV9VTlNVUFBPUlRFRCxcbiAgQ0xPU0VfTk9fU1RBVFVTLCBDTE9TRV9BQk5PUk1BTCwgQ0xPU0VfVU5TVVBQT1JURURfREFUQSxcbiAgQ0xPU0VfUE9MSUNZX1ZJT0xBVElPTiwgQ0xPU0VfVE9PX0xBUkdFLCBDTE9TRV9NSVNTSU5HX0VYVEVOU0lPTixcbiAgQ0xPU0VfSU5URVJOQUxfRVJST1IsIENMT1NFX1NFUlZJQ0VfUkVTVEFSVCwgQ0xPU0VfVFJZX0FHQUlOX0xBVEVSLFxuICBDTE9TRV9UTFNfSEFORFNIQUtFLCBDTE9TRV9BVVRIX0lOVkFMSUQsIENMT1NFX0FVVEhfVElNRU9VVCwgQ0xPU0VfSU5BQ1RJVklUWSxcbiAgQ0xPU0VfQVVUSF9FWFBJUkVEXG59IGZyb20gJy4uL2NvbnN0YW50cy93ZWJzb2NrZXQnXG5cbmNvbnN0IG1lc3NhZ2VEZXNjcmlwdG9ycyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgY29ubmVjdGluZ0RvdHM6IHtcbiAgICBpZDogJ2Nvbm5lY3RpbmdEb3RzJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0Nvbm5lY3RpbmcuLi4nXG4gIH0sXG4gIGRpc2Nvbm5lY3RpbmdEb3RzOiB7XG4gICAgaWQ6ICdkaXNjb25uZWN0aW5nRG90cycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdEaXNjb25uZWN0aW5nLi4uJ1xuICB9LFxuICBieWVNZXNzYWdlOiB7XG4gICAgaWQ6ICdieWVNZXNzYWdlJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1NvIGxvbmcsIGh1bWFuLi4uJyxcbiAgICBkZXNjcmlwdGlvbjogJ01lc3NhZ2UgZGlzcGxheWVkIHdoaWxlIHRoZSBjbGllbnQgaXMgZGlzY29ubmVjdGluZydcbiAgfSxcbiAgYmxvY2tlZFNlY3Rpb246IHtcbiAgICBpZDogJ2Jsb2NrZWRTZWN0aW9uJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0Jsb2NrZWQgc2VjdGlvbicsXG4gICAgZGVzY3JpcHRpb246ICdUaXRsZSBkaXNwbGF5ZWQgd2hlbiByZW1vdGUgdXNlciByZWplY3QgYSBjb25uZWN0aW9uIHRvIGEgc2VjdGlvbidcbiAgfSxcbiAgYmxvY2tlZFNlY3Rpb25TdWI6IHtcbiAgICBpZDogJ2Jsb2NrZWRTZWN0aW9uU3ViJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RoaXMgc2VjdGlvbiByZXF1aXJlcyBhY3RpdmUgdmFsaWRhdGlvbi4gV2FpdGluZyB0byBsb2NhbCB1c2VyJyxcbiAgICBkZXNjcmlwdGlvbjogJ1N1YnRpdGxlIGRpc3BsYXllZCB3aGVuIHJlbW90ZSB1c2VyIHJlamVjdCBhIGNvbm5lY3Rpb24gdG8gYSBzZWN0aW9uJ1xuICB9LFxuICBjb25uZWN0aW9uRmFpbGVkTWFpbjoge1xuICAgIGlkOiAnY29ubmVjdGlvbkZhaWxlZE1haW4nLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnSXQgc2VlbXMgdGhlIGNvbm5lY3Rpb24gZmFpbGVkJyxcbiAgICBkZXNjcmlwdGlvbjogJ01lc3NhZ2UgZGlzcGxheWVkIGFsd2F5cyB3aGVuIGNvbm5lY3Rpb24gZmFpbGVkJ1xuICB9LFxuICBjb25uZWN0aW9uRmFpbGVkQnVzeToge1xuICAgIGlkOiAnY29ubmVjdGlvbkZhaWxlZEJ1c3knLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnUHJvYmFibHkgYW5vdGhlciB1c2VyIGlzIHVzaW5nIHRoZSBhZ2VudCBhdCB0aGlzIG1vbWVudCcsXG4gICAgZGVzY3JpcHRpb246ICdNZXNzYWdlIGRpc3BsYXllZCB3aGVuIGNvbm5lY3Rpb24gZmFpbGVkIGJlY2F1c2UgYW5vdGhlciBjbGllbnQgaXMgY29ubmVjdGluZyB0byB0aGUgc2FtZSBhZ2VudC4nXG4gIH0sXG4gIGNvbm5lY3Rpb25GYWlsZWREb3duOiB7XG4gICAgaWQ6ICdjb25uZWN0aW9uRmFpbGVkRG93bicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgYWdlbnQgaXMgcHJvYmFibHkgZG93biwgc2luY2UgaXRzIGxhc3QgY29udGFjdCB3YXMgYSBsb25nIHRpbWUgYWdvLicsXG4gICAgZGVzY3JpcHRpb246ICdNZXNzYWdlIGRpc3BsYXllZCB3aGVuIGNvbm5lY3Rpb24gZmFpbGVkIGJlY2F1c2UgYWdlbnQgaXMgZG93bi4nXG4gIH0sXG4gIGNvbm5lY3Rpb25GYWlsZWRTZXJ2ZXI6IHtcbiAgICBpZDogJ2Nvbm5lY3Rpb25GYWlsZWRTZXJ2ZXInLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlIHNlcnZlciBjYW4gYmUgdW5yZWFjaGFibGUgb3IgbWF5IGJlIGEgY29ubmVjdGlvbiBzdGlsbCBvcGVuLiBUcnkgYWdhaW4nLFxuICAgIGRlc2NyaXB0aW9uOiAnTWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBjb25uZWN0aW9uIGZhaWxlZCBiZWNhdXNlIGNhbm5vdCBjb25uZWN0IHdpdGggc2VydmVyLidcbiAgfSxcbiAgbm90Q29ubmVjdGVkOiB7XG4gICAgaWQ6ICdub3RDb25uZWN0ZWQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnTm90IGNvbm5lY3RlZCdcbiAgfSxcbiAgcmVjb25uZWN0Tm93OiB7XG4gICAgaWQ6ICdyZWNvbm5lY3ROb3cnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnUmVjb25uZWN0IG5vdydcbiAgfSxcbiAgdHJ5UmVsb2FkaW5nOiB7XG4gICAgaWQ6ICd0cnlSZWxvYWRpbmcnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVHJ5IHJlbG9hZGluZyB0aGUgcGFnZSdcbiAgfSxcbiAgYXV0aGVudGljYXRpbmdEb3RzOiB7XG4gICAgaWQ6ICdhdXRoZW50aWNhdGluZ0RvdHMnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnQXV0aGVudGljYXRpbmcuLi4nXG4gIH0sXG4gIGF1dGhlbnRpY2F0aW5nU3ViOiB7XG4gICAgaWQ6ICdhdXRoZW50aWNhdGluZ1N1YicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdMZXQgbWUgc2VlIGhvdyByZWxpYWJsZSB5b3UgYXJlJyxcbiAgICBkZXNjcmlwdGlvbjogJ1N1YnRpdGxlIHdoaWxlIHBhc3N3b3JkIGlzIGJlZW4gY2hlY2tlZCdcbiAgfSxcbiAgbm90QXV0aGVudGljYXRlZDoge1xuICAgIGlkOiAnbm90QXV0aGVudGljYXRlZCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdOb3QgYXV0aGVudGljYXRlZCdcbiAgfSxcbiAgcGFzc3dvcmROZWVkZWQ6IHtcbiAgICBpZDogJ3Bhc3N3b3JkTmVlZGVkJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1Bhc3N3b3JkIG5lZWRlZCdcbiAgfSxcbiAgbm90SW5pdGlhbGl6ZWQ6IHtcbiAgICBpZDogJ25vdEluaXRpYWxpemVkJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ05vdCBpbml0aWFsaXplZCdcbiAgfSxcbiAgaW52YWxpZFBhc3N3b3JkOiB7XG4gICAgaWQ6ICdpbnZhbGlkUGFzc3dvcmQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnSW52YWxpZCBwYXNzd29yZCdcbiAgfSxcbiAgdGltZW91dFBhc3N3b3JkOiB7XG4gICAgaWQ6ICd0aW1lb3V0UGFzc3dvcmQnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlIGFnZW50IGhhcyBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gZHVlIHRvIGEgdGltZW91dCB3aGlsZSBleHBlY3RpbmcgdG8gY29tcGxldGUgdGhlIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MuJyxcbiAgICBkZXNjcmlwdGlvbjogJ01lc3NhZ2UgZGlzcGxheWVkIHdoZW4gdGhlIHRpbWUgdG8gdHlwZSB0aGUgcGFzc3dvcmQgaXMgZWxhcHNlZCdcbiAgfSxcbiAgc29ja2V0TWVzc2FnZUNsb3NlTm9ybWFsOiB7XG4gICAgaWQ6ICdzb2NrZXRNZXNzYWdlQ2xvc2VOb3JtYWwnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gY2xvc2VkIHN1Y2Nlc3NmdWxseS4nLFxuICAgIGRlc2NyaXB0aW9uOiAnTWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBjb25uZWN0aW9uIGlzIGNsb3NlZCBncmFjZWZ1bGx5J1xuICB9LFxuICBzb2NrZXRNZXNzYWdlQ2xvc2VHb2luZ0F3YXk6IHtcbiAgICBpZDogJ3NvY2tldE1lc3NhZ2VDbG9zZUdvaW5nQXdheScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgYWdlbnQgaGFzIGNsb3NlZCB0aGUgY29ubmVjdGlvbi4nLFxuICAgIGRlc2NyaXB0aW9uOiAnTWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiB0aGUgYWdlbnQgY2xvc2VkIHRoZSBjb25uZWN0aW9uJ1xuICB9LFxuICBzb2NrZXRNZXNzYWdlQ2xvc2VQcm90b2NvbEVycm9yOiB7XG4gICAgaWQ6ICdzb2NrZXRNZXNzYWdlQ2xvc2VQcm90b2NvbEVycm9yJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZSBhZ2VudCBpcyB0ZXJtaW5hdGluZyB0aGUgY29ubmVjdGlvbiBkdWUgdG8gYSBwcm90b2NvbCBlcnJvci4nLFxuICAgIGRlc2NyaXB0aW9uOiAnTWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBwcm90b2NvbCBmYWlscydcbiAgfSxcbiAgc29ja2V0TWVzc2FnZUNsb3NlVW5zdXBwb3J0ZWQ6IHtcbiAgICBpZDogJ3NvY2tldE1lc3NhZ2VDbG9zZVVuc3VwcG9ydGVkJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZSBjb25uZWN0aW9uIGlzIGJlaW5nIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgYWdlbnQgcmVjZWl2ZWQgZGF0YSBvZiBhIHR5cGUgaXQgY2Fubm90IGFjY2VwdC4nLFxuICAgIGRlc2NyaXB0aW9uOiAnTWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBhZ2VudCByZWNlaXZlIGFuIHVuc3VwcG9ydGVkIGNvZGUnXG4gIH0sXG4gIHNvY2tldE1lc3NhZ2VDbG9zZU5vU3RhdHVzOiB7XG4gICAgaWQ6ICdzb2NrZXRNZXNzYWdlQ2xvc2VOb1N0YXR1cycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdObyBzdGF0dXMgY29kZSB3YXMgcHJvdmlkZWQgZXZlbiB0aG91Z2ggb25lIHdhcyBleHBlY3RlZC4nLFxuICAgIGRlc2NyaXB0aW9uOiAnTWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBzZW5kIGEgY2xvc2UgbWVzc2FnZSBhbmQgYWdlbmQgZG9lcyBub3QgYW5zd2VyJ1xuICB9LFxuICBzb2NrZXRNZXNzYWdlQ2xvc2VBYm5vcm1hbDoge1xuICAgIGlkOiAnc29ja2V0TWVzc2FnZUNsb3NlQWJub3JtYWwnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCBhYm5vcm1hbGx5IHdpdGhvdXQgYSBjbG9zZSBzaWduYWwuJyxcbiAgICBkZXNjcmlwdGlvbjogJ01lc3NhZ2UgZGlzcGxheWVkIHdoZW4gY29ubmVjdGlvbiBpcyBjbG9zZWQgYWJub3JtYWxseSdcbiAgfSxcbiAgc29ja2V0TWVzc2FnZUNsb3NlVW5zdXBwb3J0ZWREYXRhOiB7XG4gICAgaWQ6ICdzb2NrZXRNZXNzYWdlQ2xvc2VVbnN1cHBvcnRlZERhdGEnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlIGFnZW50IGlzIHRlcm1pbmF0aW4gdGhlIGNvbm5lY3Rpb24gYmVjYXVzZSBhIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIHRoYXQgY29udGFpbmVkIGluY29uc2lzdGVudCBkYXRhLicsXG4gICAgZGVzY3JpcHRpb246ICdNZXNzYWdlIGRpc3BsYXllZCB3aGVuIGNvbm5lY3Rpb24gZW5kcyBiZWNhdXNlIHVuc3VwcG9ydGVkIGRhdGEgaXMgcmVjZWl2ZWQnXG4gIH0sXG4gIHNvY2tldE1lc3NhZ2VDbG9zZVBvbGljeVZpb2xhdGlvbjoge1xuICAgIGlkOiAnc29ja2V0TWVzc2FnZUNsb3NlUG9saWN5VmlvbGF0aW9uJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZSBhZ2VudCBpcyB0ZXJtaW5hdGluZyB0aGUgY29ubmVjdGlvbiBiZWNhdXNlIGl0IHJlY2VpdmVkIGEgbWVzc2FnZSB0aGF0IHZpb2xhdGVzIGl0cyBwb2xpY3kuJyxcbiAgICBkZXNjcmlwdGlvbjogJ01lc3NhZ2UgZGlzcGxheWVkIHdoZW4gdGhlIHBvbGljeSBpcyB2aW9sYXRlZCdcbiAgfSxcbiAgc29ja2V0TWVzc2FnZUNsb3NlVG9vTGFyZ2U6IHtcbiAgICBpZDogJ3NvY2tldE1lc3NhZ2VDbG9zZVRvb0xhcmdlJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZSBhZ2VudCBpcyB0ZXJtaW5hdGluZyB0aGUgY29ubmVjdGlvbiBiZWNhdXNlIGEgZGF0YSBmcmFtZSB3YXMgcmVjZWl2ZWQgdGhhdCBpcyB0b28gbGFyZ2UuJyxcbiAgICBkZXNjcmlwdGlvbjogJ01lc3NhZ2UgZGlzcGxheWVkIHdoZW4gY29ubmVjdGlvbiBpcyBjbG9zZWQgYmVjYXVzZSBkYXRhIGlzIGxhcmdlciB0aGFuIHN1cHBvcnRlZCdcbiAgfSxcbiAgc29ja2V0TWVzc2FnZUNsb3NlTWlzc2luZ0V4dGVuc2lvbjoge1xuICAgIGlkOiAnc29ja2V0TWVzc2FnZUNsb3NlTWlzc2luZ0V4dGVuc2lvbicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgY2xpZW50IGlzIHRlcm1pbmF0aW5nIHRoZSBjb25uZWN0aW9uIGJlY2F1c2UgaXQgZXhwZWN0ZWQgdGhlIGFnZW50IHRvIG5lZ290aWF0ZSBvbmUgb3IgbW9yZSBleHRlbnNpb24sIGJ1dCBpdCBkaWRuXFwndC4nLFxuICAgIGRlc2NyaXB0aW9uOiAnTWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBpdCBpcyB0cnkgdG8gdXNlIGEgbWlzc2luZyBleHRlbnNpb24nXG4gIH0sXG4gIHNvY2tldE1lc3NhZ2VDbG9zZUludGVybmFsRXJyb3I6IHtcbiAgICBpZDogJ3NvY2tldE1lc3NhZ2VDbG9zZUludGVybmFsRXJyb3InLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlIGFnZW50IGlzIHRlcm1pbmF0aW5nIHRoZSBjb25uZWN0aW9uIGJlY2F1c2UgaXQgZW5jb3VudGVyZWQgYW4gdW5leHBlY3RlZCBjb25kaXRpb24gdGhhdCBwcmV2ZW50ZWQgaXQgZnJvbSBmdWxmaWxsaW5nIHRoZSByZXF1ZXN0LicsXG4gICAgZGVzY3JpcHRpb246ICdNZXNzYWdlIGRpc3BsYXllZCB3aGVuIGFuIGludGVybmFsIGVycm9yIG9jY3VycydcbiAgfSxcbiAgc29ja2V0TWVzc2FnZUNsb3NlU2VydmljZVJlc3RhcnQ6IHtcbiAgICBpZDogJ3NvY2tldE1lc3NhZ2VDbG9zZVNlcnZpY2VSZXN0YXJ0JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZSBhZ2VudCBpcyB0ZXJtaW5hdGluZyB0aGUgY29ubmVjdGlvbiBiZWNhdXNlIGl0IGlzIHJlc3RhcnRpbmcuJyxcbiAgICBkZXNjcmlwdGlvbjogJ01lc3NhZ2UgZGlzcGxheWVkIHdoZW4gY29ubmVjdGlvbiBpcyB0ZXJtaW5hdGluZyBkdWUgdG8gYSByZXN0YXJ0J1xuICB9LFxuICBzb2NrZXRNZXNzYWdlQ2xvc2VUcnlBZ2FpbkxhdGVyOiB7XG4gICAgaWQ6ICdzb2NrZXRNZXNzYWdlQ2xvc2VUcnlBZ2FpbkxhdGVyJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZSBhZ2VudCBpcyB0ZXJtaW5hdGluZyB0aGUgY29ubmVjdGlvbiBkdWUgdG8gYSB0ZW1wb3JhcnkgY29uZGl0aW9uLicsXG4gICAgZGVzY3JpcHRpb246ICdNZXNzYWdlIGRpc3BsYXllZCB3aGVuIGNsb3NlIGNvbm5lY3Rpb24gZHVlIHRvIGEgdGVtcG9yYXJ5IGNvbmRpdGlvbi4nXG4gIH0sXG4gIHNvY2tldE1lc3NhZ2VDbG9zZVRsc0hhbmRzaGFrZToge1xuICAgIGlkOiAnc29ja2V0TWVzc2FnZUNsb3NlVGxzSGFuZHNoYWtlJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgZHVlIHRvIGEgZmFpbHVyZSB0byBwZXJmb3JtIGEgVExTIGhhbmRzaGFrZS4nLFxuICAgIGRlc2NyaXB0aW9uOiAnTWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBUTFMgaGFuZHNoYWtlIGZhaWxzLidcbiAgfSxcbiAgc29ja2V0TWVzc2FnZUNsb3NlSW5hY3Rpdml0eToge1xuICAgIGlkOiAnc29ja2V0TWVzc2FnZUNsb3NlSW5hY3Rpdml0eScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdUaGUgYWdlbnQgaGFzIGNsb3NlZCB0aGUgY29ubmVjdGlvbiBkdWUgdG8gaW5hY3Rpdml0eS4nLFxuICAgIGRlc2NyaXB0aW9uOiAnTWVzc2FnZSBkaXNwbGF5ZWQgd2hlbiBjb25uZWN0aW9uIGNsb3NlZCBkdWUgdG8gaW5hY3Rpdml0eSdcbiAgfSxcbiAgc29ja2V0TWVzc2FnZUNsb3NlQXV0aEV4cGlyZWQ6IHtcbiAgICBpZDogJ3NvY2tldE1lc3NhZ2VDbG9zZUF1dGhFeHBpcmVkJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZSBhZ2VudCBoYXMgY2xvc2VkIHRoZSBjb25uZWN0aW9uIGJlY2F1c2UgdGhlIHRlbXBvcmFyeSBhdXRob3JpemF0aW9uIGhhcyBleHBpcmVkLicsXG4gICAgZGVzY3JpcHRpb246ICdNZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZSB0ZW1wb3JhcnkgYXV0aG9yaXphdGlvbiBoYXMgZXhwaXJlZCBhbmQgY29ubmVjdGlvbiBpcyBjbG9zZWQuJ1xuICB9LFxuICBzb2NrZXRNZXNzYWdlQ2xvc2VEZWZhdWx0OiB7XG4gICAgaWQ6ICdzb2NrZXRNZXNzYWdlQ2xvc2VEZWZhdWx0JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgd2l0aG91dCByZWNlaXZpbmcgYSB2YWxpZCBjb2RlLicsXG4gICAgZGVzY3JpcHRpb246ICdNZXNzYWdlIGRpc3BsYXllZCB3aGVuIGNsb3NlIGNvbm5lY3Rpb24gd2hlbiBhIGdlbmVyaWMgZmFpbCBpcyBwcm9kdWNlZCdcbiAgfVxufSlcblxuY2xhc3MgSW5mb1BhbmVsIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICB0aGlzLnN0YXRlID0geyBjb3VudDogdGhpcy5wcm9wcy50aW1lciwgY2FudENvbm5lY3Q6IGZhbHNlIH1cbiAgICB0aGlzLmdldFBhbmVsTWVzc2FnZXMgPSB0aGlzLmdldFBhbmVsTWVzc2FnZXMuYmluZCh0aGlzKVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7IHRpdGxlLCBkZXNjcmlwdGlvbiwgcmVjb25uZWN0LCBidXR0b24gfSA9IHRoaXMuZ2V0UGFuZWxNZXNzYWdlcygpXG5cbiAgICByZXR1cm4gKFxuICAgICAgPEp1bWJvdHJvbj5cbiAgICAgICAgeyB0aXRsZS5sZW5ndGggPiAwICYmIDxoMT57IHRpdGxlIH08L2gxPiB9XG4gICAgICAgIHsgKGRlc2NyaXB0aW9uLmxlbmd0aCA+IDAgfHwgcmVjb25uZWN0Lmxlbmd0aCA+IDApICYmXG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIHsgZGVzY3JpcHRpb24ubGVuZ3RoID4gMCAmJiA8cD57IGRlc2NyaXB0aW9uIH08L3A+IH1cbiAgICAgICAgICAgIHsgcmVjb25uZWN0Lmxlbmd0aCA+IDAgJiYgPHA+eyByZWNvbm5lY3QgfTwvcD4gfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIHsgYnV0dG9uLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICA8cD5cbiAgICAgICAgICAgIDxCdXR0b24gYnNTdHlsZT0ncHJpbWFyeScgb25DbGljaz17dGhpcy5wcm9wcy5oYW5kbGVDb25uZWN0aW9ufT5cbiAgICAgICAgICAgICAgeyBidXR0b24gfVxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgPC9wPlxuICAgICAgICB9XG4gICAgICA8L0p1bWJvdHJvbj5cbiAgICApXG4gIH1cblxuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIChuZXh0UHJvcHMpIHtcbiAgICBjb25zdCB7IGlzQ29ubmVjdGluZywgaXNDb25uZWN0ZWQgfSA9IG5leHRQcm9wc1xuICAgIGNvbnN0IHdhc0Nvbm5lY3RpbmcgPSB0aGlzLnByb3BzLmlzQ29ubmVjdGluZ1xuXG4gICAgaWYgKGlzQ29ubmVjdGluZykge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7IGNhbnRDb25uZWN0OiBmYWxzZSB9KVxuICAgIH0gZWxzZSBpZiAod2FzQ29ubmVjdGluZyAmJiAhaXNDb25uZWN0ZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoeyBjYW50Q29ubmVjdDogdHJ1ZSB9KVxuICAgIH1cbiAgfVxuXG4gIGdldFBhbmVsTWVzc2FnZXMgKCkge1xuICAgIGNvbnN0IG1lc3NhZ2VzID0ge1xuICAgICAgdGl0bGU6ICcnLFxuICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgcmVjb25uZWN0OiAnJyxcbiAgICAgIGJ1dHRvbjogJydcbiAgICB9XG5cbiAgICBjb25zdCB7IGNhbnRDb25uZWN0IH0gPSB0aGlzLnN0YXRlXG4gICAgY29uc3Qge1xuICAgICAgLy8gQ29ubmVjdGlvblxuICAgICAgaXNVbmtub3duLCBpc0J1c3ksXG4gICAgICBpc0Nvbm5lY3RpbmcsIGlzRGlzY29ubmVjdGluZywgaXNDb25uZWN0ZWQsXG4gICAgICBjb25uZWN0aW9uRXJyb3IsIGNvbm5lY3Rpb25FcnJvckNvZGUsXG4gICAgICAvLyBBdXRoZW50aWNhdGlvblxuICAgICAgaXNBdXRoZW50aWNhdGluZywgaXNBdXRoZW50aWNhdGVkLFxuICAgICAgYXV0aGVudGljYXRpb25FcnJvciwgYXV0aGVudGljYXRpb25FcnJvckNvZGUsIGF1dGhlbnRpY2F0aW9uRXJyb3JNZXNzYWdlLFxuICAgICAgLy8gRmV0Y2hpbmcgcmVtb3RlIHNlY3Rpb25cbiAgICAgIGlzRmV0Y2hpbmdTZWN0aW9uLFxuICAgICAgLy8gaW50bCBwcm92aWRlclxuICAgICAgaW50bFxuICAgIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgZm9ybWF0TWVzc2FnZSA9IGludGwuZm9ybWF0TWVzc2FnZVxuXG4gICAgaWYgKGlzQ29ubmVjdGluZykge1xuICAgICAgbWVzc2FnZXMudGl0bGUgPSBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5jb25uZWN0aW5nRG90cylcbiAgICAgIG1lc3NhZ2VzLmRlc2NyaXB0aW9uID0gJydcbiAgICB9IGVsc2UgaWYgKGlzRGlzY29ubmVjdGluZykge1xuICAgICAgbWVzc2FnZXMudGl0bGUgPSBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5kaXNjb25uZWN0aW5nRG90cylcbiAgICAgIG1lc3NhZ2VzLmRlc2NyaXB0aW9uID0gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuYnllTWVzc2FnZSlcbiAgICB9IGVsc2UgaWYgKGlzRmV0Y2hpbmdTZWN0aW9uKSB7XG4gICAgICBtZXNzYWdlcy50aXRsZSA9IGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLmJsb2NrZWRTZWN0aW9uKVxuICAgICAgbWVzc2FnZXMuZGVzY3JpcHRpb24gPSBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5ibG9ja2VkU2VjdGlvblN1YilcbiAgICB9IGVsc2UgaWYgKCFpc0Nvbm5lY3RlZCkge1xuICAgICAgaWYgKGNvbm5lY3Rpb25FcnJvciB8fCBjYW50Q29ubmVjdCB8fCBhdXRoZW50aWNhdGlvbkVycm9yKSB7XG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5jb25uZWN0aW9uRmFpbGVkTWFpbilcbiAgICAgICAgaWYgKGF1dGhlbnRpY2F0aW9uRXJyb3IpIHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSB0aGlzLmdldFdlYlNvY2tldENsb3NlTWVzc2FnZShhdXRoZW50aWNhdGlvbkVycm9yQ29kZSxcbiAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uRXJyb3JNZXNzYWdlKVxuICAgICAgICB9IGVsc2UgaWYgKGNhbnRDb25uZWN0KSB7XG4gICAgICAgICAgaWYgKGlzQnVzeSkge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlICs9ICcgJyArIGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLmNvbm5lY3Rpb25GYWlsZWRCdXN5KVxuICAgICAgICAgIH0gZWxzZSBpZiAoaXNVbmtub3duKSB7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gJyAnICsgZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuY29ubmVjdGlvbkZhaWxlZERvd24pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSArPSAnICcgKyBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5jb25uZWN0aW9uRmFpbGVkU2VydmVyKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgPSB0aGlzLmdldFdlYlNvY2tldENsb3NlTWVzc2FnZShjb25uZWN0aW9uRXJyb3JDb2RlKVxuICAgICAgICB9XG5cbiAgICAgICAgbWVzc2FnZXMudGl0bGUgPSBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5ub3RDb25uZWN0ZWQpXG4gICAgICAgIG1lc3NhZ2VzLmRlc2NyaXB0aW9uID0gZXJyb3JNZXNzYWdlXG4gICAgICAgIGlmIChjb25uZWN0aW9uRXJyb3JDb2RlICE9PSBDTE9TRV9BVVRIX0VYUElSRUQpIHtcbiAgICAgICAgICBtZXNzYWdlcy5idXR0b24gPSBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5yZWNvbm5lY3ROb3cpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lc3NhZ2VzLnRpdGxlID0gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMubm90Q29ubmVjdGVkKVxuICAgICAgICBtZXNzYWdlcy5kZXNjcmlwdGlvbiA9IGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLnRyeVJlbG9hZGluZylcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQ29ubmVjdGVkKSB7XG4gICAgICBpZiAoaXNBdXRoZW50aWNhdGluZykge1xuICAgICAgICBtZXNzYWdlcy50aXRsZSA9IGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLmF1dGhlbnRpY2F0aW5nRG90cylcbiAgICAgICAgbWVzc2FnZXMuZGVzY3JpcHRpb24gPSBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5hdXRoZW50aWNhdGluZ1N1YilcbiAgICAgIH0gZWxzZSBpZiAoIWlzQXV0aGVudGljYXRlZCkge1xuICAgICAgICBtZXNzYWdlcy50aXRsZSA9IGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLm5vdEF1dGhlbnRpY2F0ZWQpXG4gICAgICAgIG1lc3NhZ2VzLmRlc2NyaXB0aW9uID0gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMucGFzc3dvcmROZWVkZWQpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lc3NhZ2VzLnRpdGxlID0gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMubm90SW5pdGlhbGl6ZWQpXG4gICAgICBtZXNzYWdlcy5kZXNjcmlwdGlvbiA9IGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLnRyeVJlbG9hZGluZylcbiAgICB9XG5cbiAgICByZXR1cm4gbWVzc2FnZXNcbiAgfVxuXG4gIGdldEF1dGhlbnRpY2F0aW9uRXJyb3JNZXNzYWdlIChjb2RlLCByZWFzb24pIHtcbiAgICBjb25zdCBmb3JtYXRNZXNzYWdlID0gdGhpcy5wcm9wcy5pbnRsLmZvcm1hdE1lc3NhZ2VcbiAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgIGNhc2UgQVVUSF9JTlZBTElEOlxuICAgICAgICByZXR1cm4gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuaW52YWxpZFBhc3N3b3JkKVxuICAgICAgY2FzZSBBVVRIX1RJTUVPVVQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy50aW1lb3V0UGFzc3dvcmQpXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gcmVhc29uXG4gICAgfVxuICB9XG5cbiAgZ2V0V2ViU29ja2V0Q2xvc2VNZXNzYWdlIChjb2RlKSB7XG4gICAgY29uc3QgZm9ybWF0TWVzc2FnZSA9IHRoaXMucHJvcHMuaW50bC5mb3JtYXRNZXNzYWdlXG4gICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICBjYXNlIENMT1NFX05PUk1BTDpcbiAgICAgICAgcmV0dXJuIGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLnNvY2tldE1lc3NhZ2VDbG9zZU5vcm1hbClcbiAgICAgIGNhc2UgQ0xPU0VfR09JTkdfQVdBWTpcbiAgICAgICAgcmV0dXJuIGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLnNvY2tldE1lc3NhZ2VDbG9zZUdvaW5nQXdheSlcbiAgICAgIGNhc2UgQ0xPU0VfUFJPVE9DT0xfRVJST1I6XG4gICAgICAgIHJldHVybiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5zb2NrZXRNZXNzYWdlQ2xvc2VQcm90b2NvbEVycm9yKVxuICAgICAgY2FzZSBDTE9TRV9VTlNVUFBPUlRFRDpcbiAgICAgICAgcmV0dXJuIGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLnNvY2tldE1lc3NhZ2VDbG9zZVVuc3VwcG9ydGVkKVxuICAgICAgY2FzZSBDTE9TRV9OT19TVEFUVVM6XG4gICAgICAgIHJldHVybiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5zb2NrZXRNZXNzYWdlQ2xvc2VOb1N0YXR1cylcbiAgICAgIGNhc2UgQ0xPU0VfQUJOT1JNQUw6XG4gICAgICAgIHJldHVybiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5zb2NrZXRNZXNzYWdlQ2xvc2VBYm5vcm1hbClcbiAgICAgIGNhc2UgQ0xPU0VfVU5TVVBQT1JURURfREFUQTpcbiAgICAgICAgcmV0dXJuIGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLnNvY2tldE1lc3NhZ2VDbG9zZVVuc3VwcG9ydGVkRGF0YSlcbiAgICAgIGNhc2UgQ0xPU0VfUE9MSUNZX1ZJT0xBVElPTjpcbiAgICAgICAgcmV0dXJuIGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLnNvY2tldE1lc3NhZ2VDbG9zZVBvbGljeVZpb2xhdGlvbilcbiAgICAgIGNhc2UgQ0xPU0VfVE9PX0xBUkdFOlxuICAgICAgICByZXR1cm4gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuc29ja2V0TWVzc2FnZUNsb3NlVG9vTGFyZ2UpXG4gICAgICBjYXNlIENMT1NFX01JU1NJTkdfRVhURU5TSU9OOlxuICAgICAgICByZXR1cm4gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuc29ja2V0TWVzc2FnZUNsb3NlTWlzc2luZ0V4dGVuc2lvbilcbiAgICAgIGNhc2UgQ0xPU0VfSU5URVJOQUxfRVJST1I6XG4gICAgICAgIHJldHVybiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5zb2NrZXRNZXNzYWdlQ2xvc2VJbnRlcm5hbEVycm9yKVxuICAgICAgY2FzZSBDTE9TRV9TRVJWSUNFX1JFU1RBUlQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5zb2NrZXRNZXNzYWdlQ2xvc2VTZXJ2aWNlUmVzdGFydClcbiAgICAgIGNhc2UgQ0xPU0VfVFJZX0FHQUlOX0xBVEVSOlxuICAgICAgICByZXR1cm4gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuc29ja2V0TWVzc2FnZUNsb3NlVHJ5QWdhaW5MYXRlcilcbiAgICAgIGNhc2UgQ0xPU0VfVExTX0hBTkRTSEFLRTpcbiAgICAgICAgcmV0dXJuIGZvcm1hdE1lc3NhZ2UobWVzc2FnZURlc2NyaXB0b3JzLnNvY2tldE1lc3NhZ2VDbG9zZVRsc0hhbmRzaGFrZSlcbiAgICAgIGNhc2UgQ0xPU0VfQVVUSF9JTlZBTElEOlxuICAgICAgICByZXR1cm4gZm9ybWF0TWVzc2FnZShtZXNzYWdlRGVzY3JpcHRvcnMuaW52YWxpZFBhc3N3b3JkKVxuICAgICAgY2FzZSBDTE9TRV9BVVRIX1RJTUVPVVQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy50aW1lb3V0UGFzc3dvcmQpXG4gICAgICBjYXNlIENMT1NFX0lOQUNUSVZJVFk6XG4gICAgICAgIHJldHVybiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5zb2NrZXRNZXNzYWdlQ2xvc2VJbmFjdGl2aXR5KVxuICAgICAgY2FzZSBDTE9TRV9BVVRIX0VYUElSRUQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5zb2NrZXRNZXNzYWdlQ2xvc2VBdXRoRXhwaXJlZClcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRNZXNzYWdlKG1lc3NhZ2VEZXNjcmlwdG9ycy5zb2NrZXRNZXNzYWdlQ2xvc2VEZWZhdWx0KVxuICAgIH1cbiAgfVxufVxuXG5JbmZvUGFuZWwucHJvcFR5cGVzID0ge1xuICBoYW5kbGVDb25uZWN0aW9uOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLFxuICB0aW1lcjogUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgLy8gQ29ubmVjdGlvblxuICBpc1Vua25vd246IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBpc0J1c3k6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBpc0Nvbm5lY3Rpbmc6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBpc0Rpc2Nvbm5lY3Rpbmc6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBpc0Nvbm5lY3RlZDogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGNvbm5lY3Rpb25FcnJvcjogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGNvbm5lY3Rpb25FcnJvckNvZGU6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIGNvbm5lY3Rpb25FcnJvck1lc3NhZ2U6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIC8vIEF1dGhlbnRpY2F0aW9uXG4gIGlzQXV0aGVudGljYXRpbmc6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBpc0F1dGhlbnRpY2F0ZWQ6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBhdXRoZW50aWNhdGlvbkVycm9yOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgYXV0aGVudGljYXRpb25FcnJvckNvZGU6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIGF1dGhlbnRpY2F0aW9uRXJyb3JNZXNzYWdlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICAvLyBGZXRjaGluZyByZW1vdGUgc2VjdGlvblxuICBpc0ZldGNoaW5nU2VjdGlvbjogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG5cbiAgaW50bDogaW50bFNoYXBlLmlzUmVxdWlyZWRcbn1cblxuSW5mb1BhbmVsLmRlZmF1bHRQcm9wcyA9IHtcbiAgdGltZXI6IDMwLFxuICAvLyBDb25uZWN0aW9uXG4gIGlzVW5rbm93bjogZmFsc2UsXG4gIGlzQnVzeTogZmFsc2UsXG4gIGlzQ29ubmVjdGluZzogZmFsc2UsXG4gIGlzRGlzY29ubmVjdGluZzogZmFsc2UsXG4gIGlzQ29ubmVjdGVkOiBmYWxzZSxcbiAgY29ubmVjdGlvbkVycm9yOiBmYWxzZSxcbiAgY29ubmVjdGlvbkVycm9yQ29kZTogbnVsbCxcbiAgY29ubmVjdGlvbkVycm9yTWVzc2FnZTogbnVsbCxcbiAgLy8gQXV0aGVudGljYXRpb25cbiAgaXNBdXRoZW50aWNhdGluZzogZmFsc2UsXG4gIGlzQXV0aGVudGljYXRlZDogZmFsc2UsXG4gIGF1dGhlbnRpY2F0aW9uRXJyb3I6IGZhbHNlLFxuICBhdXRoZW50aWNhdGlvbkVycm9yQ29kZTogbnVsbCxcbiAgYXV0aGVudGljYXRpb25FcnJvck1lc3NhZ2U6IG51bGwsXG4gIC8vIEZldGNoaW5nIHJlbW90ZSBzZWN0aW9uXG4gIGlzRmV0Y2hpbmdTZWN0aW9uOiBmYWxzZVxufVxuXG5leHBvcnQgZGVmYXVsdCBpbmplY3RJbnRsKEluZm9QYW5lbClcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFByb2dyZXNzQmFyIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuXG5jbGFzcyBQcm9ncmVzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyB2YWx1ZSB9ID0gdGhpcy5wcm9wc1xuICAgIHJldHVybiAoXG4gICAgICA8UHJvZ3Jlc3NCYXJcbiAgICAgICAgbm93PXt2YWx1ZX1cbiAgICAgICAgYWN0aXZlPXsodmFsdWUgPCAxMDApfVxuICAgICAgICBsYWJlbD17YCR7dmFsdWUudG9GaXhlZCgyKX0lYH0gLz5cbiAgICApXG4gIH1cblxuICBzaG91bGRDb21wb25lbnRVcGRhdGUgKG5leHRQcm9wcykge1xuICAgIGNvbnN0IHsgdmFsdWUgfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCB7IHZhbHVlOiBuZXh0VmFsdWUgfSA9IG5leHRQcm9wc1xuICAgIHJldHVybiAodmFsdWUudG9GaXhlZCgyKSAhPT0gbmV4dFZhbHVlLnRvRml4ZWQoMikpXG4gIH1cbn1cblxuUHJvZ3Jlc3MucHJvcFR5cGVzID0ge1xuICB2YWx1ZTogUmVhY3QuUHJvcFR5cGVzLm51bWJlclxufVxuXG5Qcm9ncmVzcy5kZWZhdWx0UHJvcHMgPSB7XG4gIHZhbHVlOiAwXG59XG5cbmV4cG9ydCBkZWZhdWx0IFByb2dyZXNzXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBKdW1ib3Ryb24sIEJ1dHRvbiB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcbmltcG9ydCB7IGluamVjdEludGwgfSBmcm9tICdyZWFjdC1pbnRsJ1xuXG5jbGFzcyBSZXF1ZXN0U2VjdGlvbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIHNlY3Rpb246IHRoaXMucHJvcHMuc2VjdGlvbixcbiAgICAgIGJsb2NrUmVxdWVzdDogdGhpcy5wcm9wcy5ibG9ja1JlcXVlc3QsXG4gICAgICBmaXJzdEFjdGl2ZTogdGhpcy5wcm9wcy5maXJzdEFjdGl2ZVxuICAgIH1cblxuICAgIHRoaXMuaGFuZGxlVHJ5QWdhaW4gPSAoKSA9PiB7XG4gICAgICB0aGlzLnByb3BzLmhhbmRsZUFsbG93U2VjdGlvbkNsaWNrKHRoaXMuc3RhdGUuc2VjdGlvbilcbiAgICB9XG5cbiAgICB0aGlzLmZpcnN0QWN0aXZhdGlvbiA9ICgpID0+IHtcbiAgICAgIHRoaXMucHJvcHMuaGFuZGxlQWxsb3dTZWN0aW9uQ2xpY2sodGhpcy5zdGF0ZS5maXJzdEFjdGl2ZSlcbiAgICAgIHRoaXMucHJvcHMucmVzZXRGaXJzdEFjdGl2ZSgpXG4gICAgfVxuXG4gICAgLy8gTWVzc2FnZXMgZGVmaW5pdGlvbnNcbiAgICB0aGlzLm1lc3NhZ2VzID0ge1xuICAgICAgZm9yYmlkZGVuU2VjdGlvbjoge1xuICAgICAgICBpZDogJ2ZvcmJpZGRlblNlY3Rpb24nLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0ZvcmJpZGRlbiBzZWN0aW9uJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdUaXRsZSBkaXNwbGF5ZWQgd2hlbiBhIHVzZXIgcmVmdXNlIHRoZSBjb25uZXRpb24gdG8gYSBzZWN0aW9uJ1xuICAgICAgfSxcbiAgICAgIGZvcmJpZGRlblNlY3Rpb25TdWI6IHtcbiAgICAgICAgaWQ6ICdmb3JiaWRkZW5TZWN0aW9uU3ViJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdBIHJlbW90ZSB1c2VyIGFjdGl2ZWx5IHJlZnVzZWQgeW91ciByZXF1ZXN0IHRvIG9wZW4ge3NlY3Rpb259LicsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU3VidGl0bGUgZGlzcGxheWVkIHdoZW4gYSB1c2VyIHJlZnVzZSB0aGUgY29ubmV0aW9uIHRvIGEgc2VjdGlvbidcbiAgICAgIH0sXG4gICAgICB0cnlBZ2Fpbjoge1xuICAgICAgICBpZDogJ3RyeUFnYWluJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdUcnkgYWdhaW4nXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCBzZWN0aW9uID0gdGhpcy5wcm9wcy5zZWN0aW9uXG4gICAgY29uc3QgYmxvY2tSZXF1ZXN0ID0gdGhpcy5wcm9wcy5ibG9ja1JlcXVlc3RcbiAgICBjb25zdCBkZWZpbmVNZXNzYWdlID0gdGhpcy5wcm9wcy5pbnRsLmZvcm1hdE1lc3NhZ2VcblxuICAgIHJldHVybiAoXG4gICAgICA8SnVtYm90cm9uID5cbiAgICAgICAgPGgxPnsgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLmZvcmJpZGRlblNlY3Rpb24pIH08L2gxPlxuXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPHA+eyBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuZm9yYmlkZGVuU2VjdGlvblN1YixcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgc2VjdGlvbjogZGVmaW5lTWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgaWQ6IHNlY3Rpb24sXG4gICAgICAgICAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdOL0EnXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KSB9XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7ICFibG9ja1JlcXVlc3QgJiZcbiAgICAgICAgICA8cD5cbiAgICAgICAgICAgIDxCdXR0b24gYnNTdHlsZT0ncHJpbWFyeScgb25DbGljaz17dGhpcy5oYW5kbGVUcnlBZ2Fpbn0gPlxuICAgICAgICAgICAgICB7IGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy50cnlBZ2FpbikgfVxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgPC9wPlxuICAgICAgICB9XG4gICAgICA8L0p1bWJvdHJvbj5cbiAgICApXG4gIH1cblxuICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIChuZXh0UHJvcHMpIHtcbiAgICBjb25zdCB7IHNlY3Rpb24sIGJsb2NrUmVxdWVzdCwgZmlyc3RBY3RpdmUgfSA9IG5leHRQcm9wc1xuXG4gICAgdGhpcy5zZXRTdGF0ZSh7IHNlY3Rpb24sIGJsb2NrUmVxdWVzdCwgZmlyc3RBY3RpdmUgfSlcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxNb3VudCAoKSB7XG4gICAgY29uc3QgeyBmaXJzdEFjdGl2ZSB9ID0gdGhpcy5wcm9wc1xuICAgIGlmIChmaXJzdEFjdGl2ZSkge1xuICAgICAgdGhpcy5maXJzdEFjdGl2YXRpb24oZmlyc3RBY3RpdmUpXG4gICAgfVxuICB9XG59XG5cblJlcXVlc3RTZWN0aW9uLnByb3BUeXBlcyA9IHtcbiAgc2VjdGlvbjogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgYmxvY2tSZXF1ZXN0OiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgZmlyc3RBY3RpdmU6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIHJlc2V0Rmlyc3RBY3RpdmU6IFJlYWN0LlByb3BUeXBlcy5mdW5jLFxuICBoYW5kbGVBbGxvd1NlY3Rpb25DbGljazogUmVhY3QuUHJvcFR5cGVzLmZ1bmMsXG4gIGludGw6IFJlYWN0LlByb3BUeXBlcy5vYmplY3Rcbn1cblxuUmVxdWVzdFNlY3Rpb24uZGVmYXVsdFByb3BzID0ge1xuICBzZWN0aW9uOiAnJyxcbiAgYmxvY2tSZXF1ZXN0OiBmYWxzZSxcbiAgZmlyc3RBY3RpdmU6IG51bGwsXG4gIHJlc2V0Rmlyc3RBY3RpdmU6ICgpID0+IHt9LFxuICBoYW5kbGVBbGxvd1NlY3Rpb25DbGljazogKCkgPT4ge31cbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5qZWN0SW50bChSZXF1ZXN0U2VjdGlvbilcbiIsIi8vIHNyYy9jb21wb25lbnRzL2FwcC1tYWluL2luZGV4LmpzeFxuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBDb250YWluZXIgfSBmcm9tICdmbHV4L3V0aWxzJ1xuXG4vLyBDb21wb25lbnRzXG5pbXBvcnQgU3lzdGVtVmlldyBmcm9tICcuLi9jb21wb25lbnRzL3N5c3RlbSdcbmltcG9ydCBTZXJ2aWNlc01haW4gZnJvbSAnLi4vc2VydmljZXMtbWFuYWdlci9jb21wb25lbnRzL3NlcnZpY2VzLW1haW4nXG5pbXBvcnQgUHJvY2Vzc2VzTWFpbiBmcm9tICcuLi9wcm9jZXNzZXMtbWFuYWdlci9jb21wb25lbnRzJ1xuaW1wb3J0IEZpbGVzVmlldyBmcm9tICcuLi9jb21wb25lbnRzL2ZpbGVzJ1xuaW1wb3J0IFRlcm1pbmFsVmlldyBmcm9tICcuLi9jb21wb25lbnRzL3Rlcm1pbmFsJ1xuaW1wb3J0IERpc3BsYXlWaWV3IGZyb20gJy4uL2NvbXBvbmVudHMvZGlzcGxheSdcbmltcG9ydCBTaGFyZUFnZW50IGZyb20gJy4uL2NvbXBvbmVudHMvc2hhcmUnXG5pbXBvcnQgUmVxdWVzdFNlY3Rpb24gZnJvbSAnLi4vY29tcG9uZW50cy9yZXF1ZXN0LXNlY3Rpb24nXG5pbXBvcnQgSW5mb1BhbmVsIGZyb20gJy4uL2NvbXBvbmVudHMvaW5mby1wYW5lbCdcblxuY29uc3QgUHJvY2Vzc2VzQ29udGFpbmVyID0gQ29udGFpbmVyLmNyZWF0ZShQcm9jZXNzZXNNYWluLCB7IHdpdGhQcm9wczogZmFsc2UgfSlcbmNvbnN0IFNlcnZpY2VzQ29udGFpbmVyID0gQ29udGFpbmVyLmNyZWF0ZShTZXJ2aWNlc01haW4sIHsgd2l0aFByb3BzOiBmYWxzZSB9KVxuXG5jb25zdCBTZWN0aW9uID0gKHByb3BzKSA9PiAoXG4gIDxkaXYgaWQ9J2Vob3J1cy1zZWN0aW9uJz5cbiAgICB7IHByb3BzLnNlbGVjdGVkID09PSAnc3lzdGVtJyAmJlxuICAgICAgPFN5c3RlbVZpZXcgLz5cbiAgICB9XG4gICAgeyBwcm9wcy5zZWxlY3RlZCA9PT0gJ3Byb2Nlc3NlcycgJiYgcHJvcHMuYWxsb3cgJiZcbiAgICAgIDxQcm9jZXNzZXNDb250YWluZXIgLz5cbiAgICB9XG4gICAgeyBwcm9wcy5zZWxlY3RlZCA9PT0gJ3NlcnZpY2VzJyAmJiBwcm9wcy5hbGxvdyAmJlxuICAgICAgPFNlcnZpY2VzQ29udGFpbmVyIC8+XG4gICAgfVxuICAgIHsgcHJvcHMuc2VsZWN0ZWQgPT09ICdmaWxlcycgJiYgcHJvcHMuYWxsb3cgJiYgPEZpbGVzVmlldyAvPiB9XG4gICAgeyBwcm9wcy5zZWxlY3RlZCA9PT0gJ3NoYXJlJyAmJiBwcm9wcy5hbGxvdyAmJlxuICAgICAgPFNoYXJlQWdlbnQgLz5cbiAgICB9XG4gICAgeyBwcm9wcy5zZWxlY3RlZCAhPT0gJ3N5c3RlbScgJiYgIXByb3BzLmFsbG93ICYmICFwcm9wcy5mZXRjaGluZ1JlbW90ZSAmJlxuICAgICAgPFJlcXVlc3RTZWN0aW9uXG4gICAgICAgIHNlY3Rpb249e3Byb3BzLnNlbGVjdGVkfVxuICAgICAgICBibG9ja1JlcXVlc3Q9e3Byb3BzLmJsb2NrUmVxdWVzdH1cbiAgICAgICAgaGFuZGxlQWxsb3dTZWN0aW9uQ2xpY2s9e3Byb3BzLmhhbmRsZUFsbG93U2VjdGlvbkNsaWNrfVxuICAgICAgICBmaXJzdEFjdGl2ZT17cHJvcHMuZmlyc3RBY3RpdmV9XG4gICAgICAgIHJlc2V0Rmlyc3RBY3RpdmU9e3Byb3BzLnJlc2V0Rmlyc3RBY3RpdmV9IC8+XG4gICAgfVxuICAgIHsgcHJvcHMuZmV0Y2hpbmdSZW1vdGUgJiYgIXByb3BzLmFsbG93ICYmXG4gICAgICA8SW5mb1BhbmVsIGlzRmV0Y2hpbmdTZWN0aW9uIC8+XG4gICAgfVxuICA8L2Rpdj5cbilcblNlY3Rpb24ucHJvcFR5cGVzID0ge1xuICBzZWxlY3RlZDogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgYWxsb3c6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBibG9ja1JlcXVlc3Q6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBmZXRjaGluZ1JlbW90ZTogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGZpcnN0QWN0aXZlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICByZXNldEZpcnN0QWN0aXZlOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgaGFuZGxlQWxsb3dTZWN0aW9uQ2xpY2s6IFJlYWN0LlByb3BUeXBlcy5mdW5jXG59XG5TZWN0aW9uLmRlZmF1bHRQcm9wcyA9IHtcbiAgc2VsZWN0ZWQ6ICdzeXN0ZW0nLFxuICBhbGxvdzogZmFsc2UsXG4gIGJsb2NrUmVxdWVzdDogZmFsc2UsXG4gIGZldGNoaW5nUmVtb3RlOiBmYWxzZSxcbiAgZmlyc3RBY3RpdmU6IG51bGwsXG4gIHJlc2V0Rmlyc3RBY3RpdmU6ICgpID0+IHt9LFxuICBoYW5kbGVBbGxvd1NlY3Rpb25DbGljazogKCkgPT4ge31cbn1cblxuLy8gSEFDSyB0byBhdm9pZCB0aGUgdGVybWluYWwgYW5kIGRpc3BsYXkgdW5tb3VudFxuZXhwb3J0IGNvbnN0IFBlcnNpc3RlbnRTZWN0aW9ucyA9IChwcm9wcykgPT4gKFxuICA8ZGl2IGlkPSdlaG9ydXMtcGVyc2lzdGVudC1jb250YWluZXInPlxuICAgIDxUZXJtaW5hbFZpZXcgLz5cbiAgICA8RGlzcGxheVZpZXcgLz5cbiAgPC9kaXY+XG4pXG5cbmV4cG9ydCBkZWZhdWx0IFNlY3Rpb25cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCdcbmltcG9ydCB7XG4gIEZvcm1Hcm91cCwgSW5wdXRHcm91cCwgRm9ybUNvbnRyb2wsIEFsZXJ0LCBCdXR0b25cbn0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuaW1wb3J0IHtcbiAgZGVmaW5lTWVzc2FnZXMsIGluamVjdEludGwsIGludGxTaGFwZSwgRm9ybWF0dGVkTWVzc2FnZVxufSBmcm9tICdyZWFjdC1pbnRsJ1xuXG5pbXBvcnQgeyBnZXRUZW1wUGFzcyB9IGZyb20gJy4uL2FjdGlvbnMvYWdlbnQnXG5cbi8vIE1lc3NhZ2VzIGRlZmluaXRpb25zXG5jb25zdCBtZXNzYWdlcyA9IGRlZmluZU1lc3NhZ2VzKHtcbiAgZXJyb3I6IHtcbiAgICBpZDogJ2Vycm9yJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0Vycm9yJ1xuICB9LFxuICBleHBpcmF0aW9uSW5NaW51dGVzOiB7XG4gICAgaWQ6ICdleHBpcmF0aW9uSW5NaW51dGVzJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0V4cGlyYXRpb24gaW4gbWludXRlcydcbiAgfSxcbiAgc2hhcmVBZ2VudEFjY2Vzczoge1xuICAgIGlkOiAnc2hhcmUtYWdlbnQtYWNjZXNzJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1NoYXJlIHRoZSBhY2Nlc3MgdG8gdGhpcyBhZ2VudCcsXG4gICAgZGVzY3JpcHRpb246ICdFeHBsYW5hdGlvbiBzaGFyaW5nIHRoZSBhY2Nlc3MnXG4gIH0sXG4gIHNoYXJlV2FybmluZzoge1xuICAgIGlkOiAnc2hhcmUtd2FybmluZy1tZXNzYWdlJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1JlbWVtYmVyIHRvIGRpc2Nvbm5lY3QgZnJvbSB0aGlzIGFnZW50IHRvIGFsbG93IHRoZSBjb25uZWN0aW9uIG9mIGFub3RoZXIgdXNlcicsXG4gICAgZGVzY3JpcHRpb246ICdFeHBsYW5hdGlvbiBhYm91dCBkaXNjb25uZWN0aW5nIGJlZm9yZSBzaGFyZSB0aGUgVVJMIG9mIGFnZW50IHNoYXJpbmcnXG4gIH0sXG4gIGdlbmVyYXRlVXJsRXhwbGFuYXRpb246IHtcbiAgICBpZDogJ2dlbmVyYXRlVXJsRXhwbGFuYXRpb24nLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnV2l0aCB0aGlzIHVybCwgcGVvcGxlIHdpbGwgYWNjZXNzIGRpcmVjdGx5IHRvIHRoaXMgYWdlbnQgZHVyaW5nIHRoZSB0aW1lIHNwZWNpZmllZCB3aXRob3V0IHRoZSByZXF1aXJlbWVudHMgb2YgaGF2aW5nIGFuIGFjY291bnQgb3IgYmVpbmcgbG9nZ2VkIGluLicsXG4gICAgZGVzY3JpcHRpb246ICdFeHBsYW5hdGlvbiBhYm91dCBnZW5lcmF0aW5nIHVybCdcbiAgfSxcbiAgcmVxdWVzdGluZ1Bhc3NEb3RzOiB7XG4gICAgaWQ6ICdyZXF1ZXN0aW5nUGFzc0RvdHMnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnUmVxdWVzdGluZyBwYXNzLi4uJ1xuICB9LFxuICByZXF1ZXN0aW5nVXJsRG90czoge1xuICAgIGlkOiAncmVxdWVzdGluZ1VybERvdHMnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnUmVxdWVzdGluZyBVUkwuLi4nXG4gIH0sXG4gIGdlbmVyYXRlVXJsOiB7XG4gICAgaWQ6ICdnZW5lcmF0ZVVybCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdHZW5lcmF0ZSBVUkwnXG4gIH0sXG4gIHRlbXBvcmFyeVVybDoge1xuICAgIGlkOiAndGVtcG9yYXJ5VXJsJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1RlbXBvcmFyeSBVUkwnXG4gIH0sXG4gIGRpc2Nvbm5lY3RVc2VyOiB7XG4gICAgaWQ6ICdkaXNjb25uZWN0VXNlcicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdEaXNjb25uZWN0IG5vdydcbiAgfVxufSlcblxuY2xhc3MgU2hhcmVBZ2VudFVSTCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICAgICAgZXJyb3I6IGZhbHNlLFxuICAgICAgZXJyb3JNZXNzYWdlOiAnJyxcbiAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgdXJsOiAnJ1xuICAgIH1cblxuICAgIHRoaXMuc3RhdGUgPSBpbml0aWFsU3RhdGVcblxuICAgIHRoaXMuZ2VuU2hhcmVVUkwgPSAoe1xuICAgICAgcGFzcywgZXhwaXJlc0F0ID0gMzAwLCBoYW5kbGVUZW1wUGFzc0dlbmVyYXRlZFxuICAgIH0gPSB0aGlzLnByb3BzKSA9PiB7XG4gICAgICAvLyBMb2FkaW5nIHN0YXJ0XG4gICAgICB0aGlzLnNldFN0YXRlKE9iamVjdC5hc3NpZ24oe30sIGluaXRpYWxTdGF0ZSwgeyBsb2FkaW5nOiB0cnVlIH0pKVxuXG4gICAgICBjb25zdCBleHBpcmVzSW4gPSBleHBpcmVzQXQgLSAoRGF0ZS5ub3coKSAvIDEwMDAgfCAwKVxuXG4gICAgICAvLyBTaWduYXR1cmUgb2YgaGFuZGxlVGVtcFBhc3NHZW5lcmF0ZWQ6XG4gICAgICAvLyAocGFzczogU3RyaW5nLCBleHBpcmVzSW46IEludCwgY2FsbGJhY2s6IChlcnI6IEVycm9yLCB1cmw6IFN0cmluZykgPT4gVm9pZCkgPT4gVm9pZFxuICAgICAgaGFuZGxlVGVtcFBhc3NHZW5lcmF0ZWQocGFzcywgZXhwaXJlc0luLCAoZXJyLCB1cmwpID0+IHtcbiAgICAgICAgLy8gTG9hZGluZyBlbmRzXG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKE9iamVjdC5hc3NpZ24oe30sIGluaXRpYWxTdGF0ZSwge1xuICAgICAgICAgICAgZXJyb3I6IHRydWUsIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2VcbiAgICAgICAgICB9KSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldFN0YXRlKE9iamVjdC5hc3NpZ24oe30sIGluaXRpYWxTdGF0ZSwgeyB1cmw6IHVybCB9KSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgZXJyb3IsIGVycm9yTWVzc2FnZSwgbG9hZGluZywgdXJsIH0gPSB0aGlzLnN0YXRlXG4gICAgY29uc3QgeyBpbnRsOiB7IGZvcm1hdE1lc3NhZ2UgfSwgaGFuZGxlRGlzY29ubmVjdENsaWNrIH0gPSB0aGlzLnByb3BzXG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdj5cbiAgICAgICAgeyBlcnJvciAmJlxuICAgICAgICAgIDxBbGVydCBic1N0eWxlPSdkYW5nZXInPlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgID8gZXJyb3JNZXNzYWdlXG4gICAgICAgICAgICAgICAgOiA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMuZXJyb3J9IC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9BbGVydD5cbiAgICAgICAgfVxuICAgICAgICB7IGxvYWRpbmcgJiZcbiAgICAgICAgICA8QWxlcnQ+PEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLnJlcXVlc3RpbmdVcmxEb3RzfSAvPjwvQWxlcnQ+XG4gICAgICAgIH1cbiAgICAgICAgeyAhbG9hZGluZyAmJiB1cmwubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8c21hbGwgY2xhc3NOYW1lPSdoZWxwJz5cbiAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLmdlbmVyYXRlVXJsRXhwbGFuYXRpb259IC8+XG4gICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgPEZvcm1Db250cm9sXG4gICAgICAgICAgICAgIGNvbXBvbmVudENsYXNzPSdpbnB1dCdcbiAgICAgICAgICAgICAgbmFtZT0ndGVtcC11cmwnXG4gICAgICAgICAgICAgIHR5cGU9J3RleHQnXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtmb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLnRlbXBvcmFyeVVybCl9XG4gICAgICAgICAgICAgIHZhbHVlPXt1cmx9XG4gICAgICAgICAgICAgIG9uRm9jdXM9eyhlKSA9PiBlLnRhcmdldC5zZWxlY3QoKX1cbiAgICAgICAgICAgICAgYXV0b0ZvY3VzIC8+XG4gICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdhbGVydCBhbGVydC1kYW5nZXInIHJvbGU9J2FsZXJ0Jz5cbiAgICAgICAgICAgICAgPGg0PlxuICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5zaGFyZVdhcm5pbmd9IC8+XG4gICAgICAgICAgICAgICAgeyEhaGFuZGxlRGlzY29ubmVjdENsaWNrICYmXG4gICAgICAgICAgICAgICAgICA8c3Bhbj4mbmJzcDtcbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvbiBvbkNsaWNrPXtoYW5kbGVEaXNjb25uZWN0Q2xpY2t9PlxuICAgICAgICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5kaXNjb25uZWN0VXNlcn0gLz5cbiAgICAgICAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2g0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICB0aGlzLmdlblNoYXJlVVJMKClcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMgKG5leHRQcm9wcykge1xuICAgIGlmIChuZXh0UHJvcHMucGFzcyAmJlxuICAgICAgICBuZXh0UHJvcHMucGFzcy5sZW5ndGggPiAwICYmXG4gICAgICAgIG5leHRQcm9wcy5wYXNzICE9PSB0aGlzLnByb3BzLnBhc3MpIHtcbiAgICAgIHRoaXMuZ2VuU2hhcmVVUkwoeyAuLi50aGlzLnByb3BzLCAuLi5uZXh0UHJvcHMgfSlcbiAgICB9XG4gIH1cbn1cblxuU2hhcmVBZ2VudFVSTC5wcm9wVHlwZXMgPSB7XG4gIHBhc3M6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgZXhwaXJlc0F0OiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICBoYW5kbGVUZW1wUGFzc0dlbmVyYXRlZDogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgaW50bDogaW50bFNoYXBlLmlzUmVxdWlyZWQsXG4gIGhhbmRsZURpc2Nvbm5lY3RDbGljazogUmVhY3QuUHJvcFR5cGVzLmZ1bmNcbn1cblxuY2xhc3MgU2hhcmVBZ2VudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy5oYW5kbGVTdWJtaXQgPSAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBjb25zdCB7IGdldFRlbXBQYXNzLCBkZWZhdWx0RXhwaXJhdGlvbiB9ID0gdGhpcy5wcm9wc1xuICAgICAgaWYgKGdldFRlbXBQYXNzKSB7XG4gICAgICAgIGNvbnN0IG1pbnV0ZXMgPSBlLnRhcmdldC5taW51dGVzLnZhbHVlIHx8IGRlZmF1bHRFeHBpcmF0aW9uXG4gICAgICAgIGNvbnN0IHNlY29uZHMgPSBtaW51dGVzICogNjBcbiAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gTnVtYmVyLnBhcnNlSW50KChEYXRlLm5vdygpIC8gMTAwMCkgKyBzZWNvbmRzLCAxMClcbiAgICAgICAgZ2V0VGVtcFBhc3MoZXhwaXJlc0F0KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgZGVmYXVsdEV4cGlyYXRpb24sIGVycm9yLCBlcnJvck1lc3NhZ2UsIGZldGNoaW5nLFxuICAgICAgcGFzcywgZXhwaXJlc0F0LCBoYW5kbGVUZW1wUGFzc0dlbmVyYXRlZCxcbiAgICAgIGludGwsIGhhbmRsZURpc2Nvbm5lY3RDbGlja1xuICAgIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgeyBmb3JtYXRNZXNzYWdlIH0gPSBpbnRsXG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBjbGFzc05hbWU9J3BhbmVsIHBhbmVsLWRlZmF1bHQnPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncGFuZWwtaGVhZGluZyc+XG4gICAgICAgICAgPGg0PjxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5zaGFyZUFnZW50QWNjZXNzfSAvPjwvaDQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncGFuZWwtYm9keSc+XG4gICAgICAgICAgeyBlcnJvciAmJlxuICAgICAgICAgICAgPEFsZXJ0IGJzU3R5bGU9J2Rhbmdlcic+XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgPyBlcnJvck1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgIDogPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLmVycm9yfSAvPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L0FsZXJ0PlxuICAgICAgICAgIH1cbiAgICAgICAgICB7IGZldGNoaW5nICYmXG4gICAgICAgICAgICA8QWxlcnQ+PEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLnJlcXVlc3RpbmdQYXNzRG90c30gLz48L0FsZXJ0PlxuICAgICAgICAgIH1cbiAgICAgICAgICB7ICFmZXRjaGluZyAmJlxuICAgICAgICAgICAgPGZvcm0gb25TdWJtaXQ9e3RoaXMuaGFuZGxlU3VibWl0fT5cbiAgICAgICAgICAgICAgPHNtYWxsPlxuICAgICAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi5tZXNzYWdlcy5leHBpcmF0aW9uSW5NaW51dGVzfSAvPlxuICAgICAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgICAgICA8Rm9ybUdyb3VwPlxuICAgICAgICAgICAgICAgIDxJbnB1dEdyb3VwPlxuICAgICAgICAgICAgICAgICAgPElucHV0R3JvdXAuQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIHR5cGU9J3N1Ym1pdCcgYnNTdHlsZT0ncHJpbWFyeSc+XG4gICAgICAgICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLmdlbmVyYXRlVXJsfSAvPlxuICAgICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvSW5wdXRHcm91cC5CdXR0b24+XG4gICAgICAgICAgICAgICAgICA8Rm9ybUNvbnRyb2xcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Q2xhc3M9J2lucHV0J1xuICAgICAgICAgICAgICAgICAgICBuYW1lPSdtaW51dGVzJ1xuICAgICAgICAgICAgICAgICAgICB0eXBlPSdudW1iZXInXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtmb3JtYXRNZXNzYWdlKG1lc3NhZ2VzLmV4cGlyYXRpb25Jbk1pbnV0ZXMpfVxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU9e2RlZmF1bHRFeHBpcmF0aW9ufVxuICAgICAgICAgICAgICAgICAgICBhdXRvRm9jdXNcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQgLz5cbiAgICAgICAgICAgICAgICA8L0lucHV0R3JvdXA+XG4gICAgICAgICAgICAgIDwvRm9ybUdyb3VwPlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgIH1cbiAgICAgICAgICB7ICFmZXRjaGluZyAmJiAocGFzcyAmJiBwYXNzLmxlbmd0aCA+IDApICYmXG4gICAgICAgICAgICA8U2hhcmVBZ2VudFVSTFxuICAgICAgICAgICAgICBwYXNzPXtwYXNzfVxuICAgICAgICAgICAgICBleHBpcmVzQXQ9e2V4cGlyZXNBdH1cbiAgICAgICAgICAgICAgaGFuZGxlVGVtcFBhc3NHZW5lcmF0ZWQ9e2hhbmRsZVRlbXBQYXNzR2VuZXJhdGVkfVxuICAgICAgICAgICAgICBoYW5kbGVEaXNjb25uZWN0Q2xpY2s9e2hhbmRsZURpc2Nvbm5lY3RDbGlja31cbiAgICAgICAgICAgICAgaW50bD17aW50bH0gLz5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59XG5cblNoYXJlQWdlbnQucHJvcFR5cGVzID0gT2JqZWN0LmFzc2lnbih7XG4gIGRlZmF1bHRFeHBpcmF0aW9uOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICBlcnJvcjogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGVycm9yTWVzc2FnZTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgZmV0Y2hpbmc6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICBwYXNzOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBleHBpcmVzQXQ6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIGdldFRlbXBQYXNzOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgaGFuZGxlVGVtcFBhc3NHZW5lcmF0ZWQ6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGludGw6IGludGxTaGFwZS5pc1JlcXVpcmVkLFxuICBoYW5kbGVEaXNjb25uZWN0Q2xpY2s6IFJlYWN0LlByb3BUeXBlcy5mdW5jXG59LCBTaGFyZUFnZW50VVJMLnByb3BUeXBlcylcblxuU2hhcmVBZ2VudC5kZWZhdWx0UHJvcHMgPSB7XG4gIGRlZmF1bHRFeHBpcmF0aW9uOiAxNSxcbiAgZXJyb3I6IGZhbHNlLFxuICBlcnJvck1lc3NhZ2U6ICcnLFxuICBmZXRjaGluZzogZmFsc2UsXG4gIHBhc3M6ICcnLFxuICBnZXRUZW1wUGFzczogKCkgPT4ge31cbn1cblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHN0YXRlKSA9PiAoe1xuICBlcnJvcjogc3RhdGUuYWdlbnQudGVtcFBhc3MuZXJyb3IsXG4gIGVycm9yTWVzc2FnZTogc3RhdGUuYWdlbnQudGVtcFBhc3MuZXJyb3JNZXNzYWdlLFxuICBmZXRjaGluZzogc3RhdGUuYWdlbnQudGVtcFBhc3MuZmV0Y2hpbmcsXG4gIHBhc3M6IHN0YXRlLmFnZW50LnRlbXBQYXNzLnBhc3MsXG4gIGV4cGlyZXNBdDogc3RhdGUuYWdlbnQudGVtcFBhc3MuZXhwaXJlc0F0LFxuICBoYW5kbGVUZW1wUGFzc0dlbmVyYXRlZDogc3RhdGUuYXBwLmhhbmRsZVRlbXBQYXNzR2VuZXJhdGVkLFxuICBoYW5kbGVEaXNjb25uZWN0Q2xpY2s6IHN0YXRlLmFwcC5oYW5kbGVEaXNjb25uZWN0XG59KVxuY29uc3QgbWFwRGlzcGF0Y2hUb1Byb3BzID0gKGRpc3BhdGNoLCBwcm9wcykgPT4gKHtcbiAgZ2V0VGVtcFBhc3M6IChleHBpcmVzKSA9PiBkaXNwYXRjaChnZXRUZW1wUGFzcyhleHBpcmVzKSlcbn0pXG5leHBvcnQgZGVmYXVsdCBpbmplY3RJbnRsKFxuICBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShTaGFyZUFnZW50KVxuKVxuIiwiLy8gc3JjL3N5c3RlbS9jb21wb25lbnRzL3N5c3RlbS1hZGRyZXNzL2luZGV4LmpzeFxuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBpbmplY3RJbnRsIH0gZnJvbSAncmVhY3QtaW50bCdcblxuLy8gTWVzc2FnZXMgZGVmaW5pdGlvbnNcbmNvbnN0IG1lc3NhZ2VzID0ge1xuICBob3N0bmFtZToge1xuICAgIGlkOiAnaG9zdG5hbWUnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnSG9zdGFuYW1lJ1xuICB9LFxuICBhZGRyZXNzOiB7XG4gICAgaWQ6ICdhZGRyZXNzJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0FkZHJlc3MnXG4gIH1cbn1cblxuLy8gSW1wbGVtZW50cyBmbHV4IENvbnRhaW5lclxuY2xhc3MgU3lzdGVtQWRkcmVzcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgZGVmaW5lTWVzc2FnZSA9IHRoaXMucHJvcHMuaW50bC5mb3JtYXRNZXNzYWdlXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdzeXN0ZW0tYWRkcmVzcyB3ZWxsJz5cbiAgICAgICAge1xuICAgICAgICAgICh0aGlzLnByb3BzLmhvc3RuYW1lLmxlbmd0aCA+IDApXG4gICAgICAgICAgPyAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgICAgICAgIHsgZGVmaW5lTWVzc2FnZShtZXNzYWdlcy5ob3N0bmFtZSkgfVxuICAgICAgICAgICAgICA8L3N0cm9uZz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3B1bGwtcmlnaHQnPlxuICAgICAgICAgICAgICAgIHsgdGhpcy5wcm9wcy5ob3N0bmFtZSB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKVxuICAgICAgICAgIDogbnVsbFxuICAgICAgICB9XG4gICAgICAgIHtcbiAgICAgICAgICAodGhpcy5wcm9wcy5hZGRyZXNzLmxlbmd0aCA+IDApXG4gICAgICAgICAgPyAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgICAgICAgIHsgZGVmaW5lTWVzc2FnZShtZXNzYWdlcy5hZGRyZXNzKSB9XG4gICAgICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncHVsbC1yaWdodCc+XG4gICAgICAgICAgICAgICAgeyB0aGlzLnByb3BzLmFkZHJlc3MgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIClcbiAgICAgICAgICA6IG51bGxcbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgc2hvdWxkQ29tcG9uZW50VXBkYXRlIChuZXh0UHJvcHMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5wcm9wcy5ob3N0bmFtZSAhPT0gbmV4dFByb3BzLmhvc3RuYW1lIHx8XG4gICAgICB0aGlzLnByb3BzLmFkZHJlc3MgIT09IG5leHRQcm9wcy5hZGRyZXNzXG4gICAgKVxuICB9XG59XG5cblN5c3RlbUFkZHJlc3MucHJvcFR5cGVzID0ge1xuICBob3N0bmFtZTogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgYWRkcmVzczogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcblxuICBpbnRsOiBSZWFjdC5Qcm9wVHlwZXMub2JqZWN0XG59XG5cblN5c3RlbUFkZHJlc3MuZGVmYXVsdFByb3BzID0ge1xuICBob3N0bmFtZTogJycsXG4gIGFkZHJlc3M6ICcnXG59XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdEludGwoU3lzdGVtQWRkcmVzcylcbiIsIi8vIHNyYy9zeXN0ZW0vY29tcG9uZW50cy9zeXN0ZW0tYWdlbnQvaW5kZXguanN4XG5cbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCdcbmltcG9ydCB7IEZvcm1hdHRlZE1lc3NhZ2UsIEZvcm1hdHRlZFJlbGF0aXZlIH0gZnJvbSAncmVhY3QtaW50bCdcblxuLy8gTWVzc2FnZXMgZGVmaW5pdGlvbnNcbmNvbnN0IG1lc3NhZ2VzID0ge1xuICBhZ2VudFZlcnNpb246IHtcbiAgICBpZDogJ2FnZW50VmVyc2lvbicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdBZ2VudCB2ZXJzaW9uJ1xuICB9LFxuICB1cHRpbWU6IHtcbiAgICBpZDogJ3VwdGltZScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdVcHRpbWUnXG4gIH1cbn1cblxuLy8gSW1wbGVtZW50cyBmbHV4IENvbnRhaW5lclxuY2xhc3MgU3lzdGVtQWdlbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIgKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0nc3lzdGVtLWFnZW50IHdlbGwnPlxuICAgICAgICB7XG4gICAgICAgICAgKHRoaXMucHJvcHMudmVyc2lvbi5sZW5ndGggPiAwKVxuICAgICAgICAgID8gKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMuYWdlbnRWZXJzaW9ufSAvPlxuICAgICAgICAgICAgICA8L3N0cm9uZz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3B1bGwtcmlnaHQnPlxuICAgICAgICAgICAgICAgIHsgdGhpcy5wcm9wcy52ZXJzaW9uIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApXG4gICAgICAgICAgOiBudWxsXG4gICAgICAgIH1cbiAgICAgICAge1xuICAgICAgICAgICh0aGlzLnByb3BzLnVwdGltZSlcbiAgICAgICAgICA/IChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxzdHJvbmc+XG4gICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLm1lc3NhZ2VzLnVwdGltZX0gLz5cbiAgICAgICAgICAgICAgPC9zdHJvbmc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdwdWxsLXJpZ2h0Jz5cbiAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkUmVsYXRpdmVcbiAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnByb3BzLm5vdyAtIHRoaXMucHJvcHMudXB0aW1lfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKVxuICAgICAgICAgIDogbnVsbFxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cblxuICBzaG91bGRDb21wb25lbnRVcGRhdGUgKG5leHRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnByb3BzLnZlcnNpb24gIT09IG5leHRQcm9wcy52ZXJzaW9uIHx8XG4gICAgICB0aGlzLnByb3BzLnVwdGltZSAhPT0gbmV4dFByb3BzLnVwdGltZVxuICAgIClcbiAgfVxufVxuXG5TeXN0ZW1BZ2VudC5wcm9wVHlwZXMgPSB7XG4gIHZlcnNpb246IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIHVwdGltZTogUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgbm93OiBSZWFjdC5Qcm9wVHlwZXMuaW5zdGFuY2VPZihEYXRlKVxufVxuXG5TeXN0ZW1BZ2VudC5kZWZhdWx0UHJvcHMgPSB7XG4gIHZlcnNpb246ICcnLFxuICB1cHRpbWU6IDBcbn1cblxuZXhwb3J0IGRlZmF1bHQgY29ubmVjdCgoKSA9PiAoeyBub3c6IG5ldyBEYXRlKCkgfSkpKFN5c3RlbUFnZW50KVxuIiwiLy8gc3JjL3N5c3RlbS9jb21wb25lbnRzL3N5c3RlbS1kZXNjcmlwdGlvbi9pbmRleC5qc3hcblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuXG4vLyBJbXBsZW1lbnRzIGZsdXggQ29udGFpbmVyXG5jbGFzcyBTeXN0ZW1EZXNjcmlwdGlvbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIHJlbmRlciAoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdzeXN0ZW0tZGVzY3JpcHRpb24gd2VsbCc+XG4gICAgICAgIHsgdGhpcy5wcm9wcy5kZXNjcmlwdGlvbiB9XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cblxuICBzaG91bGRDb21wb25lbnRVcGRhdGUgKG5leHRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnByb3BzLmRlc2NyaXB0aW9uICE9PSBuZXh0UHJvcHMuZGVzY3JpcHRpb25cbiAgICApXG4gIH1cbn1cblxuU3lzdGVtRGVzY3JpcHRpb24ucHJvcFR5cGVzID0ge1xuICBkZXNjcmlwdGlvbjogUmVhY3QuUHJvcFR5cGVzLnN0cmluZy5pc1JlcXVpcmVkXG59XG5cblN5c3RlbURlc2NyaXB0aW9uLmRlZmF1bHRQcm9wcyA9IHtcbiAgZGVzY3JpcHRpb246ICcnXG59XG5cbmV4cG9ydCBkZWZhdWx0IFN5c3RlbURlc2NyaXB0aW9uXG4iLCIvLyBzcmMvc3lzdGVtL2NvbXBvbmVudHMvc3lzdGVtLWhhcmR3YXJlL2luZGV4LmpzeFxuXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgaHVtYW5pemUgZnJvbSAnaHVtYW5pemUnXG5pbXBvcnQgeyBpbnRsU2hhcGUsIGluamVjdEludGwgfSBmcm9tICdyZWFjdC1pbnRsJ1xuXG4vLyBNZXNzYWdlcyBkZWZpbml0aW9uc1xuY29uc3QgbWVzc2FnZXMgPSB7XG4gIGNwdToge1xuICAgIGlkOiAnY3B1JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0NQVSdcbiAgfSxcbiAgcmFtOiB7XG4gICAgaWQ6ICdyYW0nLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnUkFNJ1xuICB9LFxuICBoZGQ6IHtcbiAgICBpZDogJ2hkZCcsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdIREQnXG4gIH1cbn1cblxuLy8gSW1wbGVtZW50cyBmbHV4IENvbnRhaW5lclxuY2xhc3MgU3lzdGVtSGFyZHdhcmUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IGRlZmluZU1lc3NhZ2UgPSB0aGlzLnByb3BzLmludGwuZm9ybWF0TWVzc2FnZVxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0nc3lzdGVtLWhhcmR3YXJlIHdlbGwnPlxuICAgICAgICB7XG4gICAgICAgICAgKHRoaXMucHJvcHMuY3B1RGVzY3JpcHRpb24ubGVuZ3RoID4gMClcbiAgICAgICAgICA/IChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxzdHJvbmc+XG4gICAgICAgICAgICAgICAgeyBkZWZpbmVNZXNzYWdlKG1lc3NhZ2VzLmNwdSkgfVxuICAgICAgICAgICAgICA8L3N0cm9uZz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3B1bGwtcmlnaHQnPlxuICAgICAgICAgICAgICAgIHsgdGhpcy5wcm9wcy5jcHVEZXNjcmlwdGlvbiB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKVxuICAgICAgICAgIDogbnVsbFxuICAgICAgICB9XG4gICAgICAgIHtcbiAgICAgICAgICAodGhpcy5wcm9wcy5yYW0pXG4gICAgICAgICAgPyAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgICAgICAgIHsgZGVmaW5lTWVzc2FnZShtZXNzYWdlcy5yYW0pIH1cbiAgICAgICAgICAgICAgPC9zdHJvbmc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdwdWxsLXJpZ2h0Jz5cbiAgICAgICAgICAgICAgICB7IGh1bWFuaXplLmZpbGVzaXplKHRoaXMucHJvcHMucmFtKSB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKVxuICAgICAgICAgIDogbnVsbFxuICAgICAgICB9XG4gICAgICAgIHtcbiAgICAgICAgICAodGhpcy5wcm9wcy5oZGQpXG4gICAgICAgICAgPyAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgICAgICAgIHsgZGVmaW5lTWVzc2FnZShtZXNzYWdlcy5oZGQpIH1cbiAgICAgICAgICAgICAgPC9zdHJvbmc+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdwdWxsLXJpZ2h0Jz5cbiAgICAgICAgICAgICAgICB7IGh1bWFuaXplLmZpbGVzaXplKHRoaXMucHJvcHMuaGRkKSB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKVxuICAgICAgICAgIDogbnVsbFxuICAgICAgICB9XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cblxuICBzaG91bGRDb21wb25lbnRVcGRhdGUgKG5leHRQcm9wcykge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnByb3BzLmNwdURlc2NyaXB0aW9uICE9PSBuZXh0UHJvcHMuY3B1RGVzY3JpcHRpb24gfHxcbiAgICAgIHRoaXMucHJvcHMucmFtICE9PSBuZXh0UHJvcHMucmFtIHx8XG4gICAgICB0aGlzLnByb3BzLmhkZCAhPT0gbmV4dFByb3BzLmhkZFxuICAgIClcbiAgfVxufVxuXG5TeXN0ZW1IYXJkd2FyZS5wcm9wVHlwZXMgPSB7XG4gIGNwdURlc2NyaXB0aW9uOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICByYW06IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIGhkZDogUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgaW50bDogaW50bFNoYXBlLmlzUmVxdWlyZWRcbn1cblxuU3lzdGVtSGFyZHdhcmUuZGVmYXVsdFByb3BzID0ge1xuICBjcHVEZXNjcmlwdGlvbjogJycsXG4gIHJhbTogMCxcbiAgaGRkOiAwXG59XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdEludGwoU3lzdGVtSGFyZHdhcmUpXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjb25uZWN0IH0gZnJvbSAncmVhY3QtcmVkdXgnXG5pbXBvcnQgeyBBbGVydCB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcbmltcG9ydCB7IGluamVjdEludGwgfSBmcm9tICdyZWFjdC1pbnRsJ1xuXG5pbXBvcnQgeyBmZXRjaEFnZW50IH0gZnJvbSAnLi4vLi4vYWN0aW9ucy9hZ2VudCdcbmltcG9ydCBTeXN0ZW1EZXNjcmlwdGlvbiBmcm9tICcuL2Rlc2NyaXB0aW9uJ1xuaW1wb3J0IFN5c3RlbUhhcmR3YXJlIGZyb20gJy4vaGFyZHdhcmUnXG5pbXBvcnQgU3lzdGVtT1MgZnJvbSAnLi9vcydcbmltcG9ydCBTeXN0ZW1BZ2VudCBmcm9tICcuL2FnZW50J1xuaW1wb3J0IFN5c3RlbUFkZHJlc3MgZnJvbSAnLi9hZGRyZXNzJ1xuXG5jb25zdCBtZXNzYWdlcyA9IHtcbiAgY29ubmVjdGVkVG86IHtcbiAgICBpZDogJ2Nvbm5lY3RlZFRvJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0Nvbm5lY3RlZCB0byB7aG9zdG5hbWV9IChJRDp7YWdlbnRJRH0pJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RpdGxlIGZyb20gc3lzdGVtIGluZm9ybWF0aW9uIGNvbm5lY3Rpb24gdG8gcmVtb3RlIG1hY2hpbmUnLFxuICAgIHZhbHVlczoge1xuICAgICAgaG9zdG5hbWU6ICdOL0EnXG4gICAgfVxuICB9LFxuICBsb2FkaW5nRG90czoge1xuICAgIGlkOiAnbG9hZGluZ0RvdHMnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnTG9hZGluZy4uLidcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgU3lzdGVtID0gKHByb3BzKSA9PiAoXG4gIDxkaXYgY2xhc3NOYW1lPSdzeXN0ZW0tbWFpbiBjb250YWluZXItZmx1aWQnPlxuICAgIDxoMz5cbiAgICAgIHsgcHJvcHMuZGVmaW5lTWVzc2FnZShcbiAgICAgICAgbWVzc2FnZXMuY29ubmVjdGVkVG8sIHtcbiAgICAgICAgICBob3N0bmFtZTogcHJvcHMuaG9zdG5hbWUsXG4gICAgICAgICAgYWdlbnRJRDogcHJvcHMuYWdlbnRJRCB9XG4gICAgICAgICkgfVxuICAgIDwvaDM+XG4gICAgPGJyIC8+XG4gICAgeyBwcm9wcy5pc0ZldGNoaW5nICYmXG4gICAgICA8QWxlcnQ+XG4gICAgICAgIHsgcHJvcHMuZGVmaW5lTWVzc2FnZShtZXNzYWdlcy5sb2FkaW5nRG90cykgfVxuICAgICAgPC9BbGVydD5cbiAgICB9XG4gICAgeyBwcm9wcy5kZXNjcmlwdGlvbiAmJiBwcm9wcy5kZXNjcmlwdGlvbi5sZW5ndGggPiAwICYmXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0ncm93Jz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbC14cy0xMic+XG4gICAgICAgICAgPFN5c3RlbURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uPXtwcm9wcy5kZXNjcmlwdGlvbn0gLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gICAgeyAhcHJvcHMuaXNGZXRjaGluZyAmJiAhIXByb3BzLnJlY2VpdmVkQXQgJiZcbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cnPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sLXhzLTEyIGNvbC1zbS02Jz5cbiAgICAgICAgICA8U3lzdGVtSGFyZHdhcmVcbiAgICAgICAgICAgIGNwdURlc2NyaXB0aW9uPXtwcm9wcy5jcHVEZXNjcmlwdGlvbn1cbiAgICAgICAgICAgIHJhbT17cHJvcHMucmFtfVxuICAgICAgICAgICAgaGRkPXtwcm9wcy5oZGR9IC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sLXhzLTEyIGNvbC1zbS02Jz5cbiAgICAgICAgICA8U3lzdGVtT1NcbiAgICAgICAgICAgIG9zPXtwcm9wcy5vc31cbiAgICAgICAgICAgIG9zVmVyc2lvbj17cHJvcHMub3NWZXJzaW9ufVxuICAgICAgICAgICAgbGFuZ3VhZ2U9e3Byb3BzLmxhbmd1YWdlfSAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgICB7ICFwcm9wcy5pc0ZldGNoaW5nICYmICEhcHJvcHMucmVjZWl2ZWRBdCAmJlxuICAgICAgPGRpdiBjbGFzc05hbWU9J3Jvdyc+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2wteHMtMTIgY29sLXNtLTYnPlxuICAgICAgICAgIDxTeXN0ZW1BZ2VudFxuICAgICAgICAgICAgdmVyc2lvbj17cHJvcHMudmVyc2lvbn1cbiAgICAgICAgICAgIHVwdGltZT17cHJvcHMudXB0aW1lfSAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbC14cy0xMiBjb2wtc20tNic+XG4gICAgICAgICAgPFN5c3RlbUFkZHJlc3NcbiAgICAgICAgICAgIGhvc3RuYW1lPXtwcm9wcy5ob3N0bmFtZX1cbiAgICAgICAgICAgIGFkZHJlc3M9e3Byb3BzLmFkZHJlc3N9IC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgfVxuICA8L2Rpdj5cbilcblxuU3lzdGVtLnByb3BUeXBlcyA9IHtcbiAgaXNGZXRjaGluZzogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIHJlY2VpdmVkQXQ6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIGFnZW50SUQ6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcuaXNSZXF1aXJlZCxcbiAgZGVzY3JpcHRpb246IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGNwdURlc2NyaXB0aW9uOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICByYW06IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIGhkZDogUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgb3M6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIG9zVmVyc2lvbjogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgbGFuZ3VhZ2U6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIHZlcnNpb246IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIHVwdGltZTogUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgaG9zdG5hbWU6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGFkZHJlc3M6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGRlZmluZU1lc3NhZ2U6IFJlYWN0LlByb3BUeXBlcy5mdW5jXG59XG5TeXN0ZW0uZGVmYXVsdFByb3BzID0ge1xuICBpc0ZldGNoaW5nOiBmYWxzZSxcbiAgcmVjZWl2ZWRBdDogbnVsbFxufVxuXG5jbGFzcyBTeXN0ZW1GZXRjaGVyIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgcmVuZGVyICgpIHtcbiAgICByZXR1cm4gPFN5c3RlbSB7Li4udGhpcy5wcm9wc30gLz5cbiAgfVxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgY29uc3QgUEVSSU9EID0gMTgwMDAwIC8vIDMgbWludXRlc1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICBpZiAoIXRoaXMucHJvcHMuaXNGZXRjaGluZyAmJiAoIXRoaXMucHJvcHMucmVjZWl2ZWRBdCB8fFxuICAgICAgICB0aGlzLnByb3BzLnJlY2VpdmVkQXQgPCBub3cgLSBQRVJJT0QpKSB7XG4gICAgICB0aGlzLnByb3BzLmZldGNoQWdlbnQoKVxuICAgIH1cbiAgfVxufVxuU3lzdGVtRmV0Y2hlci5wcm9wVHlwZXMgPSB7XG4gIGZldGNoQWdlbnQ6IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIGlzRmV0Y2hpbmc6IFJlYWN0LlByb3BUeXBlcy5ib29sLFxuICByZWNlaXZlZEF0OiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuXG4gIGludGw6IFJlYWN0LlByb3BUeXBlcy5vYmplY3Rcbn1cblxuY29uc3QgbWFwU3RhdGVUb1Byb3BzID0gKHN0YXRlLCBwcm9wcykgPT4ge1xuICByZXR1cm4ge1xuICAgIGlzRmV0Y2hpbmc6IHN0YXRlLmFnZW50LmlzRmV0Y2hpbmcsXG4gICAgcmVjZWl2ZWRBdDogc3RhdGUuYWdlbnQucmVjZWl2ZWRBdCxcbiAgICBhZ2VudElEOiBzdGF0ZS5hZ2VudC5pZCxcbiAgICB1cHRpbWU6IHN0YXRlLmFnZW50LnVwdGltZSxcbiAgICB2ZXJzaW9uOiBzdGF0ZS5hZ2VudC52ZXJzaW9uLFxuICAgIGFkZHJlc3M6IHN0YXRlLmFnZW50LmFkZHJlc3MsXG4gICAgaG9zdG5hbWU6IHN0YXRlLmFnZW50Lmhvc3RuYW1lLFxuICAgIGRlc2NyaXB0aW9uOiBzdGF0ZS5hZ2VudC5kZXNjcmlwdGlvbixcbiAgICBsYW5ndWFnZTogc3RhdGUuYWdlbnQubGFuZ3VhZ2UsXG4gICAgb3M6IHN0YXRlLmFnZW50Lm9zLFxuICAgIG9zVmVyc2lvbjogc3RhdGUuYWdlbnQub3NWZXJzaW9uLFxuICAgIGNwdURlc2NyaXB0aW9uOiBzdGF0ZS5hZ2VudC5jcHVEZXNjcmlwdGlvbixcbiAgICByYW06IHN0YXRlLmFnZW50LnJhbSxcbiAgICBoZGQ6IHN0YXRlLmFnZW50LmhkZFxuICB9XG59XG5jb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSAoZGlzcGF0Y2gsIHByb3BzKSA9PiB7XG4gIHJldHVybiB7XG4gICAgZmV0Y2hBZ2VudDogKCkgPT4gZGlzcGF0Y2goZmV0Y2hBZ2VudCgpKSxcbiAgICBkZWZpbmVNZXNzYWdlOiBwcm9wcy5pbnRsLmZvcm1hdE1lc3NhZ2VcbiAgfVxufVxuZXhwb3J0IGRlZmF1bHQgaW5qZWN0SW50bChjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShTeXN0ZW1GZXRjaGVyKSlcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGluamVjdEludGwgfSBmcm9tICdyZWFjdC1pbnRsJ1xuXG4vLyBNZXNzYWdlcyBkZWZpbml0aW9uc1xuY29uc3QgbWVzc2FnZXMgPSB7XG4gIG9zOiB7XG4gICAgaWQ6ICdvcycsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdPUydcbiAgfSxcbiAgbGFuOiB7XG4gICAgaWQ6ICdsYW5ndWFnZScsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdMYW5ndWFnZSdcbiAgfSxcbiAgYXJjaDoge1xuICAgIGlkOiAnYXJjaGl0ZWN0dXJlJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0FyY2hpdGVjaHR1cmUnXG4gIH1cbn1cblxuLy8gSW1wbGVtZW50cyBmbHV4IENvbnRhaW5lclxuY2xhc3MgU3lzdGVtT1MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgb3MsIG9zVmVyc2lvbiwgYXJjaGl0ZWN0dXJlLCBsYW5ndWFnZSB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IGRlZmluZU1lc3NhZ2UgPSB0aGlzLnByb3BzLmludGwuZm9ybWF0TWVzc2FnZVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdzeXN0ZW0tb3Mgd2VsbCc+XG4gICAgICAgIHsgb3MubGVuZ3RoID4gMCAmJlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8c3Ryb25nPlxuICAgICAgICAgICAgICB7IGRlZmluZU1lc3NhZ2UobWVzc2FnZXMub3MpIH1cbiAgICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3B1bGwtcmlnaHQnPlxuICAgICAgICAgICAgICB7IGAke29zfSAke29zVmVyc2lvbn1gIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIHsgYXJjaGl0ZWN0dXJlLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICAgICAgeyBkZWZpbmVNZXNzYWdlKG1lc3NhZ2VzLmFyY2gpIH1cbiAgICAgICAgICAgIDwvc3Ryb25nPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3B1bGwtcmlnaHQnPlxuICAgICAgICAgICAgICB7IGFyY2hpdGVjdHVyZSB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICB7IGxhbmd1YWdlLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICAgICAgeyBkZWZpbmVNZXNzYWdlKG1lc3NhZ2VzLmxhbikgfVxuICAgICAgICAgICAgPC9zdHJvbmc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0ncHVsbC1yaWdodCc+XG4gICAgICAgICAgICAgIHsgbGFuZ3VhZ2UgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIClcbiAgfVxuXG4gIHNob3VsZENvbXBvbmVudFVwZGF0ZSAobmV4dFByb3BzKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMucHJvcHMub3MgIT09IG5leHRQcm9wcy5vcyB8fFxuICAgICAgdGhpcy5wcm9wcy5vc1ZlcnNpb24gIT09IG5leHRQcm9wcy5vc1ZlcnNpb24gfHxcbiAgICAgIHRoaXMucHJvcHMuYXJjaGl0ZWN0dXJlICE9PSBuZXh0UHJvcHMuYXJjaGl0ZWN0dXJlIHx8XG4gICAgICB0aGlzLnByb3BzLmxhbmd1YWdlICE9PSBuZXh0UHJvcHMubGFuZ3VhZ2VcbiAgICApXG4gIH1cbn1cblxuU3lzdGVtT1MucHJvcFR5cGVzID0ge1xuICBvczogUmVhY3QuUHJvcFR5cGVzLnN0cmluZyxcbiAgb3NWZXJzaW9uOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBhcmNoaXRlY3R1cmU6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGxhbmd1YWdlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBpbnRsOiBSZWFjdC5Qcm9wVHlwZXMub2JqZWN0XG59XG5cblN5c3RlbU9TLmRlZmF1bHRQcm9wcyA9IHtcbiAgb3M6ICcnLFxuICBvc1ZlcnNpb246ICcnLFxuICBhcmNoaXRlY3R1cmU6ICcnLFxuICBsYW5ndWFnZTogJydcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5qZWN0SW50bChTeXN0ZW1PUylcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGNvbm5lY3QgfSBmcm9tICdyZWFjdC1yZWR1eCdcbmltcG9ydCB7IGRlZmluZU1lc3NhZ2VzLCBGb3JtYXR0ZWRNZXNzYWdlIH0gZnJvbSAncmVhY3QtaW50bCdcbmltcG9ydCB7IEFsZXJ0IH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuaW1wb3J0IFRlcm0gZnJvbSAneHRlcm0nXG5pbXBvcnQgeyBwcm9wb3NlR2VvbWV0cnkgfSBmcm9tICd4dGVybS9saWIvYWRkb25zL2ZpdCdcbmltcG9ydCB7IHJlc2V0VGVybVN0YXRlLCBpbml0aWFsaXplVGVybSwgc2VuZFRlcm1EYXRhIH0gZnJvbSAnLi4vYWN0aW9ucy90ZXJtaW5hbCdcbmltcG9ydCB7IGdldEFjdGl2ZVNlY3Rpb24sIGdldFNlY3Rpb24gfSBmcm9tICcuLi9yZWR1Y2Vycy9hcHAnXG5cbmNvbnN0IG1lc3NhZ2VzID0gZGVmaW5lTWVzc2FnZXMoe1xuICBsb2FkaW5nRG90czogeyBpZDogJ2xvYWRpbmdEb3RzJywgZGVmYXVsdE1lc3NhZ2U6ICdMb2FkaW5nLi4uJyB9XG59KVxuXG5jb25zdCBIRUFERVJTSVpFID0gNTBcblxuZXhwb3J0IGNsYXNzIFRlcm1pbmFsIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICB0aGlzLnRlcm0gPSBudWxsXG4gICAgLy8gVG8gZm9jdXMgdGhlIHRlcm0gdGV4dGFyZWFcbiAgICB0aGlzLl9mb2N1c1Rlcm0gPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy50ZXJtRm9jdXNUUmVmKSBjbGVhclRpbWVvdXQodGhpcy50ZXJtRm9jdXNUUmVmKVxuICAgICAgdGhpcy50ZXJtRm9jdXNUUmVmID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnRlcm0pIHRoaXMudGVybS50ZXh0YXJlYS5mb2N1cygpXG4gICAgICB9LCAxKVxuICAgIH1cbiAgICB0aGlzLl9kZXN0cm95VGVybSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnRlcm0pIHtcbiAgICAgICAgdGhpcy50ZXJtLmRlc3Ryb3koKVxuICAgICAgICB0aGlzLnRlcm0gPSBudWxsXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX2NyZWF0ZVRlcm0gPSAoKSA9PiB7XG4gICAgICB0aGlzLl9kZXN0cm95VGVybSgpXG4gICAgICB0aGlzLnRlcm0gPSBuZXcgVGVybSh7IGN1cnNvckJsaW5rOiB0cnVlIH0pXG4gICAgICB0aGlzLnRlcm0ub24oJ2RhdGEnLCB0aGlzLnByb3BzLnNlbmRUZXJtRGF0YSlcbiAgICAgIHRoaXMudGVybS5vcGVuKHRoaXMucmVmcy50ZXJtLCB0cnVlKVxuICAgICAgY29uc3QgeyBjb2xzLCByb3dzIH0gPSBwcm9wb3NlR2VvbWV0cnkodGhpcy50ZXJtKVxuICAgICAgdGhpcy50ZXJtLnJlc2l6ZShjb2xzLCByb3dzKVxuICAgICAgdGhpcy5wcm9wcy5pbml0aWFsaXplVGVybShjb2xzLCByb3dzKVxuICAgIH1cbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgeyBzaG93LCBzaG93SGVhZGVyLCBpc0luaXRpYWxpemluZyB9ID0gdGhpcy5wcm9wc1xuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzTmFtZT0ndGVybWluYWwtbWFpbidcbiAgICAgICAgcmVmPSdjb250YWluZXInPlxuICAgICAgICB7IHNob3cgJiYgIXRoaXMudGVybSAmJiBpc0luaXRpYWxpemluZyAmJlxuICAgICAgICAgIDxBbGVydD48Rm9ybWF0dGVkTWVzc2FnZSB7Li4ubWVzc2FnZXMubG9hZGluZ0RvdHN9IC8+PC9BbGVydD5cbiAgICAgICAgfVxuICAgICAgICA8ZGl2IHN0eWxlPXt7XG4gICAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgICAgdG9wOiBzaG93ID8gKHNob3dIZWFkZXIgPyBgJHtIRUFERVJTSVpFfXB4YCA6ICcwcHgnKSA6IGBjYWxjKDEwMHZoICsgMTAwcHgpYCxcbiAgICAgICAgICBsZWZ0OiAnMHB4JyxcbiAgICAgICAgICB3aWR0aDogJzEwMHZ3JyxcbiAgICAgICAgICBoZWlnaHQ6IHNob3dIZWFkZXIgPyBgY2FsYygxMDB2aCAtICR7SEVBREVSU0laRX1weClgIDogJzEwMHZoJyxcbiAgICAgICAgICBiYWNrZ3JvdW5kOiAnIzAwMDAwMCdcbiAgICAgICAgfX0+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J3Rlcm1pbmFsLWNvbnRhaW5lcicgcmVmPSd0ZXJtJyBzdHlsZT17e1xuICAgICAgICAgICAgaGVpZ2h0OiB3aW5kb3dcbiAgICAgICAgICAgICAgPyBzaG93SGVhZGVyXG4gICAgICAgICAgICAgICAgPyBgJHt3aW5kb3cuaW5uZXJIZWlnaHQgLSBIRUFERVJTSVpFfXB4YFxuICAgICAgICAgICAgICAgIDogYCR7d2luZG93LmlubmVySGVpZ2h0fXB4YFxuICAgICAgICAgICAgICA6ICcxMDAlJ1xuICAgICAgICAgIH19IC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIGNvbnN0IHsgc2hvdywgaXNJbml0aWFsaXplZCwgaXNJbml0aWFsaXppbmcgfSA9IHRoaXMucHJvcHNcbiAgICBpZiAoc2hvdyAmJiAhdGhpcy50ZXJtICYmICFpc0luaXRpYWxpemVkICYmICFpc0luaXRpYWxpemluZykge1xuICAgICAgdGhpcy5fY3JlYXRlVGVybSgpXG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAobmV4dFByb3BzKSB7XG4gICAgdmFyIHtcbiAgICAgIGlzQWN0aXZlLCBzaG93LCBpc0luaXRpYWxpemVkLCBpc0luaXRpYWxpemluZywgbmV3RGF0YSwgZGF0YVJldmVpdmVkQXRcbiAgICB9ID0gbmV4dFByb3BzXG5cbiAgICBpZiAoaXNBY3RpdmUgJiYgIXRoaXMucHJvcHMuaXNBY3RpdmUgJiYgISF0aGlzLnRlcm0pIHtcbiAgICAgIHRoaXMuX2ZvY3VzVGVybSgpXG4gICAgfVxuICAgIGlmIChzaG93ICYmICF0aGlzLnRlcm0gJiYgIWlzSW5pdGlhbGl6ZWQgJiYgIWlzSW5pdGlhbGl6aW5nKSB7XG4gICAgICB0aGlzLl9jcmVhdGVUZXJtKClcbiAgICAgIHRoaXMuX2ZvY3VzVGVybSgpXG4gICAgfVxuICAgIGlmICh0aGlzLnRlcm0gJiYgaXNJbml0aWFsaXplZCAmJiBuZXdEYXRhICYmXG4gICAgICAgIHRoaXMucHJvcHMuZGF0YVJldmVpdmVkQXQgIT09IGRhdGFSZXZlaXZlZEF0KSB7XG4gICAgICAvLyBOZXcgZGF0YSB0byB3cml0ZVxuICAgICAgdGhpcy50ZXJtLndyaXRlKG5ld0RhdGEpXG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQgKCkge1xuICAgIHRoaXMuX2Rlc3Ryb3lUZXJtKClcbiAgICB0aGlzLnByb3BzLnJlc2V0VGVybVN0YXRlKClcbiAgfVxufVxuXG5UZXJtaW5hbC5wcm9wVHlwZXMgPSB7XG4gIGlzQWN0aXZlOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgc2hvdzogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGlzSW5pdGlhbGl6aW5nOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbCxcbiAgaXNJbml0aWFsaXplZDogUmVhY3QuUHJvcFR5cGVzLmJvb2wsXG4gIGNvbHM6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIHJvd3M6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIG5ld0RhdGE6IFJlYWN0LlByb3BUeXBlcy5zdHJpbmcsXG4gIGRhdGFSZXZlaXZlZEF0OiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICByZXNldFRlcm1TdGF0ZTogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbiAgaW5pdGlhbGl6ZVRlcm06IFJlYWN0LlByb3BUeXBlcy5mdW5jLmlzUmVxdWlyZWQsXG4gIHNlbmRUZXJtRGF0YTogUmVhY3QuUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcblxuICBzaG93SGVhZGVyOiBSZWFjdC5Qcm9wVHlwZXMuYm9vbFxufVxuVGVybWluYWwuZGVmYXVsdFByb3BzID0ge1xuICBpc0FjdGl2ZTogZmFsc2UsXG4gIHNob3c6IGZhbHNlLFxuICBpc0luaXRpYWxpemluZzogZmFsc2UsXG4gIGlzSW5pdGlhbGl6ZWQ6IGZhbHNlLFxuICBjb2xzOiA4MCxcbiAgcm93czogMjQsXG4gIG5ld0RhdGE6IG51bGwsXG4gIGRhdGFSZXZlaXZlZEF0OiBudWxsXG59XG5cbmNvbnN0IG1hcFN0YXRlVG9Qcm9wcyA9IChzdGF0ZSwgcHJvcHMpID0+IHtcbiAgY29uc3QgYWN0aXZlID0gZ2V0QWN0aXZlU2VjdGlvbihzdGF0ZS5hcHApXG4gIGNvbnN0IHRlcm1pbmFsU2VjdGlvbiA9IGdldFNlY3Rpb24oc3RhdGUuYXBwLCBhY3RpdmUpXG4gIHJldHVybiB7XG4gICAgaXNJbml0aWFsaXppbmc6IHN0YXRlLnRlcm1pbmFsLmlzSW5pdGlhbGl6aW5nLFxuICAgIGlzSW5pdGlhbGl6ZWQ6IHN0YXRlLnRlcm1pbmFsLmlzSW5pdGlhbGl6ZWQsXG4gICAgY29sczogc3RhdGUudGVybWluYWwuY29scyxcbiAgICByb3dzOiBzdGF0ZS50ZXJtaW5hbC5yb3dzLFxuICAgIG5ld0RhdGE6IHN0YXRlLnRlcm1pbmFsLm5ld0RhdGEsXG4gICAgZGF0YVJldmVpdmVkQXQ6IHN0YXRlLnRlcm1pbmFsLmRhdGFSZXZlaXZlZEF0LFxuICAgIGlzQWN0aXZlOiBhY3RpdmUgPT09ICd0ZXJtaW5hbCcsXG4gICAgc2hvdzogKGFjdGl2ZSA9PT0gJ3Rlcm1pbmFsJyAmJiB0ZXJtaW5hbFNlY3Rpb24uYWxsb3cgJiZcbiAgICAgIHN0YXRlLmFnZW50LmlzQ29ubmVjdGVkICYmIHN0YXRlLmFnZW50LmlzQXV0aGVudGljYXRlZCksXG4gICAgc2hvd0hlYWRlcjogc3RhdGUuYXBwLnNob3dIZWFkZXJcbiAgfVxufVxuXG5jb25zdCBtYXBEaXNwYXRjaFRvUHJvcHMgPSAoZGlzcGF0Y2gsIHByb3BzKSA9PiB7XG4gIHJldHVybiB7XG4gICAgcmVzZXRUZXJtU3RhdGU6ICgpID0+IGRpc3BhdGNoKHJlc2V0VGVybVN0YXRlKCkpLFxuICAgIGluaXRpYWxpemVUZXJtOiAoY29scywgcm93cykgPT4gZGlzcGF0Y2goaW5pdGlhbGl6ZVRlcm0oY29scywgcm93cykpLFxuICAgIHNlbmRUZXJtRGF0YTogKGRhdGEpID0+IGRpc3BhdGNoKHNlbmRUZXJtRGF0YShkYXRhKSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjb25uZWN0KG1hcFN0YXRlVG9Qcm9wcywgbWFwRGlzcGF0Y2hUb1Byb3BzKShUZXJtaW5hbClcbiIsIi8vIENvbm5lY3Rpb25cbmV4cG9ydCBjb25zdCBSRVNFVF9BR0VOVF9TVEFURSA9ICdDTElFTlRfUkVTRVRfQUdFTlRfU1RBVEUnXG5leHBvcnQgY29uc3QgQ09OTl9BR0VOVF9SRVFVRVNUID0gJ0NMSUVOVF9DT05OX0FHRU5UX1JFUVVFU1QnXG5leHBvcnQgY29uc3QgQ09OTl9BR0VOVF9TVUNDRVNTID0gJ0NMSUVOVF9DT05OX0FHRU5UX1NVQ0NFU1MnXG5leHBvcnQgY29uc3QgQ09OTl9BR0VOVF9GQUlMVVJFID0gJ0NMSUVOVF9DT05OX0FHRU5UX0ZBSUxVUkUnXG5leHBvcnQgY29uc3QgRElTQ09OTl9BR0VOVF9SRVFVRVNUID0gJ0NMSUVOVF9ESVNDT05OX0FHRU5UX1JFUVVFU1QnXG5leHBvcnQgY29uc3QgRElTQ09OTl9BR0VOVF9TVUNDRVNTID0gJ0NMSUVOVF9ESVNDT05OX0FHRU5UX1NVQ0NFU1MnXG5leHBvcnQgY29uc3QgQ0xFQVJfQ09OTl9FUlJPUiA9ICdDTElFTlRfQ0xFQVJfQ09OTl9FUlJPUidcbi8vIEF1dGhlbnRpY2F0aW9uXG5leHBvcnQgY29uc3QgQVVUSF9BR0VOVF9SRVFVRVNUID0gJ0NMSUVOVF9BVVRIX0FHRU5UX1JFUVVFU1QnXG5leHBvcnQgY29uc3QgQVVUSF9BR0VOVF9TVUNDRVNTID0gJ0NMSUVOVF9BVVRIX0FHRU5UX1NVQ0NFU1MnXG5leHBvcnQgY29uc3QgQVVUSF9BR0VOVF9GQUlMVVJFID0gJ0NMSUVOVF9BVVRIX0FHRU5UX0ZBSUxVUkUnXG5leHBvcnQgY29uc3QgUkVWT0tFX0FHRU5UX0FVVEggPSAnQ0xJRU5UX1JFVk9LRV9BR0VOVF9BVVRIJ1xuZXhwb3J0IGNvbnN0IENMRUFSX0FVVEhfRVJST1IgPSAnQ0xJRU5UX0NMRUFSX0FVVEhfRVJST1InXG4vLyBUZW1wb3JhcnkgcGFzc1xuZXhwb3J0IGNvbnN0IFRFTVBfUEFTU19SRVFVRVNUID0gJ1RFTVBfUEFTU19SRVFVRVNUJ1xuZXhwb3J0IGNvbnN0IFRFTVBfUEFTU19TVUNDRVNTID0gJ1RFTVBfUEFTU19TVUNDRVNTJ1xuZXhwb3J0IGNvbnN0IFRFTVBfUEFTU19GQUlMVVJFID0gJ1RFTVBfUEFTU19GQUlMVVJFJ1xuLy8gRGF0YVxuZXhwb3J0IGNvbnN0IEZFVENIX0FHRU5UX1JFUVVFU1QgPSAnQ0xJRU5UX0ZFVENIX0FHRU5UX1JFUVVFU1QnXG5leHBvcnQgY29uc3QgRkVUQ0hfQUdFTlRfU1VDQ0VTUyA9ICdDTElFTlRfRkVUQ0hfQUdFTlRfU1VDQ0VTUydcbmV4cG9ydCBjb25zdCBGRVRDSF9BR0VOVF9GQUlMVVJFID0gJ0NMSUVOVF9GRVRDSF9BR0VOVF9GQUlMVVJFJ1xuZXhwb3J0IGNvbnN0IENMRUFSX0FHRU5UX0VSUk9SID0gJ0NMSUVOVF9DTEVBUl9BR0VOVF9FUlJPUidcbiIsIlxuLy8gU2VjdGlvbnNcbmV4cG9ydCBjb25zdCBGRVRDSF9TRUNUSU9OU19SRVFVRVNUID0gJ0NMSUVOVF9GRVRDSF9TRUNUSU9OU19SRVFVRVNUJ1xuZXhwb3J0IGNvbnN0IEZFVENIX1NFQ1RJT05TX1NVQ0NFU1MgPSAnQ0xJRU5UX0ZFVENIX1NFQ1RJT05TX1NVQ0NFU1MnXG5leHBvcnQgY29uc3QgRkVUQ0hfU0VDVElPTlNfRkFJTFVSRSA9ICdDTElFTlRfRkVUQ0hfU0VDVElPTlNfRkFJTFVSRSdcbmV4cG9ydCBjb25zdCBGRVRDSF9SRU1PVEVfU0VDVElPTl9SRVFVRVNUID0gJ0NMSUVOVF9GRVRDSF9SRU1PVEVfU0VDVElPTl9SRVFVRVNUJ1xuZXhwb3J0IGNvbnN0IEZFVENIX1JFTU9URV9TRUNUSU9OX0VORCA9ICdDTElFTlRfRkVUQ0hfUkVNT1RFX1NFQ1RJT05fRU5EJ1xuZXhwb3J0IGNvbnN0IElORk9STV9SRU1PVEVfU0VDVElPTl9FTkQgPSAnQ0xJRU5UX0lORk9STV9SRU1PVEVfU0VDVElPTl9FTkQnXG5leHBvcnQgY29uc3QgUkVTRVRfRklSU1RfQUNUSVZFX1NFQ1RJT04gPSAnQ0xJRU5UX1JFU0VUX0ZJUlNUX0FDVElWRV9TRUNUSU9OJ1xuZXhwb3J0IGNvbnN0IFVQREFURV9TRUNUSU9OID0gJ0NMSUVOVF9VUERBVEVfU0VDVElPTidcbmV4cG9ydCBjb25zdCBTRUxFQ1RfU0VDVElPTiA9ICdDTElFTlRfU0VMRUNUX1NFQ1RJT04nXG5leHBvcnQgY29uc3QgRU5BQkxFX1NFQ1RJT04gPSAnQ0xJRU5UX0VOQUJMRV9TRUNUSU9OJ1xuZXhwb3J0IGNvbnN0IERJU0FCTEVfU0VDVElPTiA9ICdDTElFTlRfRElTQUJMRV9TRUNUSU9OJ1xuZXhwb3J0IGNvbnN0IEFMTE9XX1NFQ1RJT04gPSAnQ0xJRU5UX0FMTE9XX1NFQ1RJT04nXG5leHBvcnQgY29uc3QgUkVTRVRfQkxPQ0tfUkVRVUVTVCA9ICdDTElFTlRfUkVTRVRfQkxPQ0tfUkVRVUVTVCdcblxuLy8gQXBwXG5leHBvcnQgY29uc3QgVVBEQVRFX0xPR09fVVJMID0gJ0NMSUVOVF9VUERBVEVfTE9HT19VUkwnXG5leHBvcnQgY29uc3QgU0hPV19IRUFERVIgPSAnQ0xJRU5UX1NIT1dfSEVBREVSJ1xuZXhwb3J0IGNvbnN0IEhJREVfSEVBREVSID0gJ0NMSUVOVF9ISURFX0hFQURFUidcbmV4cG9ydCBjb25zdCBVUERBVEVfRElTQ09OTkVDVF9IQU5ETEVSID0gJ0NMSUVOVF9VUERBVEVfRElTQ09OTkVDVF9IQU5ETEVSJ1xuIiwiXG4vLyBBdXRoXG5leHBvcnQgY29uc3QgQVVUSF9JTlZBTElEID0gMVxuZXhwb3J0IGNvbnN0IEFVVEhfVElNRU9VVCA9IDJcbiIsIlxuZXhwb3J0IGNvbnN0IFJFU0VUX0RJU1BMQVlfU1RBVEUgPSAnQ0xJRU5UX1JFU0VUX0RJU1BMQVlfU1RBVEUnXG5leHBvcnQgY29uc3QgVVBEQVRFX0RJU1BMQVlfREFUQSA9ICdDTElFTlRfVVBEQVRFX0RJU1BMQVlfREFUQSdcbmV4cG9ydCBjb25zdCBDTEVBUl9ESVNQTEFZX0VSUk9SID0gJ0NMSUVOVF9DTEVBUl9ESVNQTEFZX0VSUk9SJ1xuZXhwb3J0IGNvbnN0IENPTk5fRElTUExBWV9SRVFVRVNUID0gJ0NMSUVOVF9DT05OX0RJU1BMQVlfUkVRVUVTVCdcbmV4cG9ydCBjb25zdCBDT05OX0RJU1BMQVlfU1VDQ0VTUyA9ICdDTElFTlRfQ09OTl9ESVNQTEFZX1NVQ0NFU1MnXG5leHBvcnQgY29uc3QgQ09OTl9ESVNQTEFZX0ZBSUxVUkUgPSAnQ0xJRU5UX0NPTk5fRElTUExBWV9GQUlMVVJFJ1xuZXhwb3J0IGNvbnN0IERJU0NPTk5fRElTUExBWV9SRVFVRVNUID0gJ0NMSUVOVF9ESVNDT05OX0RJU1BMQVlfUkVRVUVTVCdcbmV4cG9ydCBjb25zdCBESVNDT05OX0RJU1BMQVlfU1VDQ0VTUyA9ICdDTElFTlRfRElTQ09OTl9ESVNQTEFZX1NVQ0NFU1MnXG5leHBvcnQgY29uc3QgRElTQ09OTl9ESVNQTEFZX0ZBSUxVUkUgPSAnQ0xJRU5UX0RJU0NPTk5fRElTUExBWV9GQUlMVVJFJ1xuIiwiXG5leHBvcnQgY29uc3QgQ0hBTkdFX0RJUl9GSUxFUyA9ICdDSEFOR0VfRElSX0ZJTEVTJ1xuZXhwb3J0IGNvbnN0IEZFVENIX0ZJTEVTX1JFUVVFU1QgPSAnRkVUQ0hfRklMRVNfUkVRVUVTVCdcbmV4cG9ydCBjb25zdCBGRVRDSF9GSUxFU19TVUNDRVNTID0gJ0ZFVENIX0ZJTEVTX1NVQ0NFU1MnXG5leHBvcnQgY29uc3QgRkVUQ0hfRklMRVNfRkFJTFVSRSA9ICdGRVRDSF9GSUxFU19GQUlMVVJFJ1xuZXhwb3J0IGNvbnN0IEZFVENIX0ZJTEVfU1VDQ0VTUyA9ICdGRVRDSF9GSUxFX1NVQ0NFU1MnXG5leHBvcnQgY29uc3QgREVMRVRFX0ZJTEVfUkVRVUVTVCA9ICdERUxFVEVfRklMRV9SRVFVRVNUJ1xuZXhwb3J0IGNvbnN0IERFTEVURV9GSUxFX1NVQ0NFU1MgPSAnREVMRVRFX0ZJTEVfU1VDQ0VTUydcbmV4cG9ydCBjb25zdCBERUxFVEVfRklMRV9GQUlMVVJFID0gJ0RFTEVURV9GSUxFX0ZBSUxVUkUnXG5leHBvcnQgY29uc3QgQ0xFQVJfRklMRVNfRVJST1IgPSAnQ0xFQVJfRklMRVNfRVJST1InXG5leHBvcnQgY29uc3QgQ0xFQVJfRklMRV9FUlJPUiA9ICdDTEVBUl9GSUxFX0VSUk9SJ1xuXG4vLyBEb3dubG9hZHMgLyBVcGxvYWRzXG5leHBvcnQgY29uc3QgRE9XTkxPQURfRklMRV9GQUlMVVJFID0gJ0RPV05MT0FEX0ZJTEVfRkFJTFVSRSdcbmV4cG9ydCBjb25zdCBDTEVBUl9ET1dOTE9BRF9GSUxFX0VSUk9SID0gJ0NMRUFSX0RPV05MT0FEX0ZJTEVfRVJST1InXG5leHBvcnQgY29uc3QgVVBMT0FEX0ZJTEVfRkFJTFVSRSA9ICdVUExPQURfRklMRV9GQUlMVVJFJ1xuZXhwb3J0IGNvbnN0IENMRUFSX1VQTE9BRF9GSUxFX0VSUk9SID0gJ0NMRUFSX1VQTE9BRF9GSUxFX0VSUk9SJ1xuXG4vLyBFcnJvciBjb2Rlc1xuZXhwb3J0IGNvbnN0IEVSUk9SX0ZFVENIID0gNDAwMDFcbmV4cG9ydCBjb25zdCBFUlJPUl9ERUxFVEUgPSA0MDAwMlxuZXhwb3J0IGNvbnN0IEVSUk9SX0RPV05MT0FEID0gNDAwMDNcbmV4cG9ydCBjb25zdCBFUlJPUl9VUExPQUQgPSA0MDAwNFxuIiwiXG5leHBvcnQgY29uc3QgUFJPVE8gPSB7XG4gIEFHRU5UX1BBU1M6IDEsXG4gIENPTk5fUkVBRFk6IDIsXG4gIEFVVEhfRVJST1I6IDMsXG4gIERJU1BMQVlfSU5JVDogMTAsXG4gIERJU1BMQVk6IDExLFxuICBESVNQTEFZX0NMT1NFOiAxMixcbiAgU0VSVklDRVM6IDIwLFxuICBQUk9DRVNTRVM6IDMwLFxuICBGSUxFUzogNDAsXG4gIFRFUk1fSU5JVDogNTAsXG4gIFRFUk06IDUxLFxuICBTWVNURU06IDYwLFxuICBURU1QX1BBU1M6IDcwLFxuICBURU1QX0xPR0lOOiA3MSxcbiAgVEVNUF9TRUNUSU9OOiA3MlxufVxuIiwiXG5leHBvcnQgY29uc3QgUkVTRVRfVEVSTV9TVEFURSA9ICdDTElFTlRfUkVTRVRfVEVSTV9TVEFURSdcbmV4cG9ydCBjb25zdCBJTklUX1RFUk1fUkVRVUVTVCA9ICdDTElFTlRfSU5JVF9URVJNX1JFUVVFU1QnXG5leHBvcnQgY29uc3QgSU5JVF9URVJNX1NVQ0NFU1MgPSAnQ0xJRU5UX0lOSVRfVEVSTV9TVUNDRVNTJ1xuZXhwb3J0IGNvbnN0IElOSVRfVEVSTV9GQUlMVVJFID0gJ0NMSUVOVF9JTklUX1RFUk1fRkFJTFVSRSdcbmV4cG9ydCBjb25zdCBTQVZFX1RFUk1fREFUQSA9ICdDTElFTlRfU0FWRV9URVJNX0RBVEEnXG5leHBvcnQgY29uc3QgQ0xFQVJfVEVSTV9FUlJPUiA9ICdDTElFTlRfQ0xFQVJfVEVSTV9FUlJPUidcbiIsIi8vIFJlc2VydmVkIGNvZGVzXG5leHBvcnQgY29uc3QgQ0xPU0VfTk9STUFMID0gMTAwMFxuZXhwb3J0IGNvbnN0IENMT1NFX0dPSU5HX0FXQVkgPSAxMDAxXG5leHBvcnQgY29uc3QgQ0xPU0VfUFJPVE9DT0xfRVJST1IgPSAxMDAyXG5leHBvcnQgY29uc3QgQ0xPU0VfVU5TVVBQT1JURUQgPSAxMDAzXG5leHBvcnQgY29uc3QgQ0xPU0VfUkVTRVJWRURfMTAwNCA9IDEwMDRcbmV4cG9ydCBjb25zdCBDTE9TRV9OT19TVEFUVVMgPSAxMDA1XG5leHBvcnQgY29uc3QgQ0xPU0VfQUJOT1JNQUwgPSAxMDA2XG5leHBvcnQgY29uc3QgQ0xPU0VfVU5TVVBQT1JURURfREFUQSA9IDEwMDdcbmV4cG9ydCBjb25zdCBDTE9TRV9QT0xJQ1lfVklPTEFUSU9OID0gMTAwOFxuZXhwb3J0IGNvbnN0IENMT1NFX1RPT19MQVJHRSA9IDEwMDlcbmV4cG9ydCBjb25zdCBDTE9TRV9NSVNTSU5HX0VYVEVOU0lPTiA9IDEwMTBcbmV4cG9ydCBjb25zdCBDTE9TRV9JTlRFUk5BTF9FUlJPUiA9IDEwMTFcbmV4cG9ydCBjb25zdCBDTE9TRV9TRVJWSUNFX1JFU1RBUlQgPSAxMDEyXG5leHBvcnQgY29uc3QgQ0xPU0VfVFJZX0FHQUlOX0xBVEVSID0gMTAxM1xuZXhwb3J0IGNvbnN0IENMT1NFX1JFU0VSVkVEXzEwMTQgPSAxMDE0XG5leHBvcnQgY29uc3QgQ0xPU0VfVExTX0hBTkRTSEFLRSA9IDEwMTVcblxuLy8gQXBwbGljYXRpb24gY29kZXNcbmV4cG9ydCBjb25zdCBDTE9TRV9BVVRIX0lOVkFMSUQgPSA0MDAwXG5leHBvcnQgY29uc3QgQ0xPU0VfQVVUSF9USU1FT1VUID0gNDAwMVxuZXhwb3J0IGNvbnN0IENMT1NFX0lOQUNUSVZJVFkgPSA0MDEwXG5leHBvcnQgY29uc3QgQ0xPU0VfQVVUSF9FWFBJUkVEID0gNDAxMVxuIiwiaW1wb3J0IHsgRGlzcGF0Y2hlciB9IGZyb20gJ2ZsdXgnXG5sZXQgQXBwRGlzcGF0Y2hlciA9IG5ldyBEaXNwYXRjaGVyKClcbmV4cG9ydCBkZWZhdWx0IEFwcERpc3BhdGNoZXJcbiIsImltcG9ydCBMb2dnZXIgZnJvbSAnLi9jb21tb24vbGliL0xvZ2dlcidcbmltcG9ydCBFSG9ydXMgZnJvbSAnLi9FSG9ydXMnXG5pbXBvcnQgJ2JhYmVsLXJlZ2lzdGVyJ1xuXG53aW5kb3cuTG9nZ2VyID0gTG9nZ2VyXG53aW5kb3cuRUhvcnVzID0gRUhvcnVzXG4iLCJpbXBvcnQgRlNJdGVtIGZyb20gJy4vZnMtaXRlbSdcblxuY2xhc3MgRGlySXRlbSBleHRlbmRzIEZTSXRlbSB7XG4gIGNvbnN0cnVjdG9yIChwYXRoLCBwcm9wcyA9IHt9LCB0eXBlT1MpIHtcbiAgICBzdXBlcihwYXRoLCB0eXBlT1MpXG5cbiAgICB0aGlzLl9faXRlbXMgPSBuZXcgTWFwKClcbiAgICB0aGlzLl9fbG9hZGVkID0gZmFsc2VcblxuICAgIGlmIChwcm9wcy5sYXN0TW9kaWZpY2F0aW9uKSB0aGlzLmxhc3RNb2RpZmljYXRpb24gPSBwcm9wcy5sYXN0TW9kaWZpY2F0aW9uXG4gICAgdGhpcy5yZWFkYWJsZSA9IHByb3BzLnJlYWRhYmxlIHx8IGZhbHNlXG4gICAgdGhpcy53cml0YWJsZSA9IHByb3BzLndyaXRhYmxlIHx8IGZhbHNlXG4gIH1cblxuICBnZXQgaXNEaXIgKCkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBnZXQgbG9hZGVkICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2xvYWRlZFxuICB9XG5cbiAgc2V0IGxvYWRlZCAobG9hZGVkKSB7XG4gICAgaWYgKHR5cGVvZiBsb2FkZWQgPT09ICdib29sZWFuJykgdGhpcy5fX2xvYWRlZCA9IGxvYWRlZFxuICB9XG5cbiAgZ2V0IHNpemUgKCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZ2V0IGV4dGVuc2lvbiAoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBnZXQgaXRlbXMgKCkge1xuICAgIHJldHVybiBbLi4udGhpcy5fX2l0ZW1zLnZhbHVlcygpXVxuICB9XG5cbiAgc2V0IGl0ZW1zIChpdGVtcykge1xuICAgIGlmICh0eXBlb2YgaXRlbXNbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgaXRlbXMnKVxuICAgIH1cblxuICAgIHRoaXMuX19pdGVtcy5jbGVhcigpXG4gICAgZm9yIChsZXQgaW5kZXggaW4gaXRlbXMpIHtcbiAgICAgIGxldCBpdGVtID0gaXRlbXNbaW5kZXhdXG4gICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIEZTSXRlbSkgdGhpcy5hZGQoaXRlbSlcbiAgICB9XG4gIH1cblxuICBhZGQgKGl0ZW0pIHtcbiAgICBpZiAoIShpdGVtIGluc3RhbmNlb2YgRlNJdGVtKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBpdGVtJylcbiAgICB0aGlzLl9faXRlbXMuc2V0KGl0ZW0uYmFzZW5hbWUsIGl0ZW0pXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGhhcyAoYmFzZW5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fX2l0ZW1zLmhhcyhiYXNlbmFtZSlcbiAgfVxuXG4gIGdldCAoYmFzZW5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5fX2l0ZW1zLmdldChiYXNlbmFtZSlcbiAgfVxuXG4gIGRlbGV0ZSAoYmFzZW5hbWUpIHtcbiAgICBpZiAodGhpcy5oYXMoYmFzZW5hbWUpKSB0aGlzLl9faXRlbXMuZGVsZXRlKGJhc2VuYW1lKVxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRGlySXRlbVxuIiwiaW1wb3J0IEZpbGVJdGVtIGZyb20gJy4vZmlsZS1pdGVtJ1xuXG5jbGFzcyBGaWxlRG93bmxvYWQge1xuICBjb25zdHJ1Y3RvciAoZmlsZSwgb2Zmc2V0ID0gMCkge1xuICAgIGlmICghKGZpbGUgaW5zdGFuY2VvZiBGaWxlSXRlbSkgfHwgIWZpbGUuc2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBmaWxlJylcbiAgICB9XG5cbiAgICAvLyBTdG9yZSB0aGUgdXNlciBmaWxlXG4gICAgdGhpcy5fX2ZpbGUgPSBmaWxlXG4gICAgdGhpcy5fX29mZnNldCA9IG9mZnNldFxuICAgIHRoaXMuX19zaXplID0gdGhpcy5fX2ZpbGUuc2l6ZVxuICAgIHRoaXMuX19wcm9ncmVzcyA9IDBcblxuICAgIHRoaXMuX19iID0gbmV3IEFycmF5QnVmZmVyKHRoaXMuc2l6ZSlcbiAgICB0aGlzLl9fYlZpZXcgPSBuZXcgVWludDhBcnJheSh0aGlzLl9fYilcbiAgfVxuXG4gIC8vIE9mZnNldCAoaW4gYnl0ZXMpXG4gIF9fY2hlY2tPZmZzZXQgKG9mZnNldCkge1xuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIG9mZnNldCBzaG91bGQgYmUgYSBudW1iZXInKVxuICAgIH0gZWxzZSBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSBvZmZzZXQgc2hvdWxkIGJlIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiAwJylcbiAgICB9XG4gIH1cblxuICBzZXQgb2Zmc2V0IChvZmZzZXQpIHtcbiAgICB0aGlzLl9fY2hlY2tPZmZzZXQob2Zmc2V0KVxuICAgIHRoaXMuX19vZmZzZXQgPSBvZmZzZXRcblxuICAgIHRoaXMuX191cGRhdGVQcm9ncmVzcygpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgZ2V0IG9mZnNldCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19vZmZzZXRcbiAgfVxuXG4gIC8vIFNpemUgKGluIGJ5dGVzKVxuICBnZXQgc2l6ZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19zaXplXG4gIH1cblxuICAvLyBQcm9ncmVzc1xuICBnZXQgcHJvZ3Jlc3MgKCkge1xuICAgIHJldHVybiB0aGlzLl9fcHJvZ3Jlc3NcbiAgfVxuXG4gIF9fdXBkYXRlUHJvZ3Jlc3MgKCkge1xuICAgIHZhciBwcm9ncmVzcyA9IDBcbiAgICBpZiAodGhpcy5vZmZzZXQgPiAwICYmIHRoaXMuc2l6ZSA+IDApIHtcbiAgICAgIHByb2dyZXNzID0gKHRoaXMub2Zmc2V0IDwgdGhpcy5zaXplKVxuICAgICAgICA/ICgodGhpcy5vZmZzZXQgKiAxMDApIC8gdGhpcy5zaXplKVxuICAgICAgICA6IDEwMFxuICAgIH1cbiAgICB0aGlzLl9fcHJvZ3Jlc3MgPSBwcm9ncmVzc1xuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8vIEZpbGVcbiAgZ2V0IGZpbGUgKCkge1xuICAgIHJldHVybiB0aGlzLl9fZmlsZVxuICB9XG5cbiAgLy8gU2F2ZSBjaHVuayBpbnRvIHRoZSBidWZmZXJcbiAgc2F2ZUNodW5rIChjaHVuaywgb2Zmc2V0LCBjaHVua1NpemUpIHtcbiAgICBpZiAodGhpcy5vZmZzZXQgPD0gb2Zmc2V0KSB7XG4gICAgICBsZXQgY3Vyck9mZnNldCA9IG9mZnNldFxuICAgICAgY29uc3QgbWF4T2Zmc2V0ID0gb2Zmc2V0ICsgY2h1bmtTaXplXG5cbiAgICAgIGZvciAobGV0IGIgb2YgY2h1bmspIHtcbiAgICAgICAgdGhpcy5fX2JWaWV3W2N1cnJPZmZzZXRdID0gYlxuXG4gICAgICAgIGlmIChjdXJyT2Zmc2V0IDwgdGhpcy5fX2IuYnl0ZUxlbmd0aCAmJiBjdXJyT2Zmc2V0IDwgbWF4T2Zmc2V0KSB7XG4gICAgICAgICAgY3Vyck9mZnNldCsrXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLm9mZnNldCA9IGN1cnJPZmZzZXRcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgdG9CbG9iICh0eXBlID0gJ3RleHQvcGxhaW47Y2hhcnNldD11dGYtOCcpIHtcbiAgICByZXR1cm4gbmV3IEJsb2IoW3RoaXMuX19iXSwgeyB0eXBlOiB0eXBlIH0pXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRmlsZURvd25sb2FkXG4iLCJpbXBvcnQgRlNJdGVtIGZyb20gJy4vZnMtaXRlbSdcblxuY2xhc3MgRmlsZUl0ZW0gZXh0ZW5kcyBGU0l0ZW0ge1xuICBjb25zdHJ1Y3RvciAocGF0aCwgcHJvcHMgPSB7fSwgdHlwZU9TKSB7XG4gICAgc3VwZXIocGF0aCwgdHlwZU9TKVxuXG4gICAgdGhpcy5zaXplID0gcHJvcHMuc2l6ZSB8fCAwXG4gICAgdGhpcy5taW1lVHlwZSA9IHByb3BzLm1pbWVUeXBlIHx8ICcnXG4gICAgdGhpcy5sYXN0TW9kaWZpY2F0aW9uID0gcHJvcHMubGFzdE1vZGlmaWNhdGlvbiB8fCAwXG4gICAgdGhpcy5jYW5CZURlbGV0ZWQgPSBwcm9wcy5jYW5CZURlbGV0ZWQgfHwgZmFsc2VcbiAgICB0aGlzLnJlYWRhYmxlID0gcHJvcHMucmVhZGFibGUgfHwgZmFsc2VcbiAgICB0aGlzLndyaXRhYmxlID0gcHJvcHMud3JpdGFibGUgfHwgZmFsc2VcbiAgfVxuXG4gIGdldCBpc0ZpbGUgKCkge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBnZXQgbWltZVR5cGUgKCkge1xuICAgIHJldHVybiB0aGlzLl9fbWltZVR5cGVcbiAgfVxuXG4gIHNldCBtaW1lVHlwZSAobWltZVR5cGUpIHtcbiAgICBpZiAodHlwZW9mIG1pbWVUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIG1pbWUtdHlwZSBzaG91bGQgYmUgc3RyaW5nJylcbiAgICB9XG4gICAgdGhpcy5fX21pbWVUeXBlID0gbWltZVR5cGVcbiAgfVxuXG4gIGdldCBzaXplICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3NpemVcbiAgfVxuXG4gIHNldCBzaXplIChzaXplKSB7XG4gICAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHNpemUgc2hvdWxkIGJlIG51bWVyaWMnKVxuICAgIH1cbiAgICB0aGlzLl9fc2l6ZSA9IHNpemVcbiAgfVxuXG4gIGdldCBpc0RlbGV0aW5nICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2lzRGVsZXRpbmcgfHwgZmFsc2VcbiAgfVxuICBzZXQgaXNEZWxldGluZyAoZGVsZXRpbmcpIHtcbiAgICBpZiAodHlwZW9mIGRlbGV0aW5nICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2YWx1ZSBzaG91bGQgYmUgYm9vbGVhbicpXG4gICAgfVxuICAgIHRoaXMuX19pc0RlbGV0aW5nID0gZGVsZXRpbmdcbiAgfVxuXG4gIGdldCBjYW5CZURlbGV0ZWQgKCkge1xuICAgIHJldHVybiB0aGlzLl9fY2FuQmVEZWxldGVkXG4gIH1cbiAgc2V0IGNhbkJlRGVsZXRlZCAoY2FuQmUpIHtcbiAgICBpZiAodHlwZW9mIGNhbkJlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2YWx1ZSBzaG91bGQgYmUgYm9vbGVhbicpXG4gICAgfVxuICAgIHRoaXMuX19jYW5CZURlbGV0ZWQgPSBjYW5CZVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZpbGVJdGVtXG4iLCJpbXBvcnQgVXNlckZpbGUgZnJvbSAnLi91c2VyLWZpbGUnXG5cbmNsYXNzIEZpbGVVcGxvYWQge1xuICBjb25zdHJ1Y3RvciAodXNlckZpbGUsIG9mZnNldCA9IDApIHtcbiAgICAvLyBpZiAoIUZpbGVVcGxvYWQuaXNTdXBwb3J0ZWQpXG4gICAgLy8gICBGaWxlVXBsb2FkLm5vdFN1cHBvcnRlZCgpXG4gICAgaWYgKCEodXNlckZpbGUgaW5zdGFuY2VvZiBVc2VyRmlsZSkgfHwgIXVzZXJGaWxlLnNpemUpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgZmlsZScpXG4gICAgfVxuXG4gICAgLy8gU3RvcmUgdGhlIHVzZXIgZmlsZVxuICAgIHRoaXMuX191c2VyRmlsZSA9IHVzZXJGaWxlXG4gICAgdGhpcy5fX29mZnNldCA9IG9mZnNldFxuICAgIHRoaXMuX19zaXplID0gdGhpcy5fX3VzZXJGaWxlLnNpemVcbiAgICB0aGlzLl9fcHJvZ3Jlc3MgPSAwXG4gIH1cblxuICAvLyBPZmZzZXQgKGluIGJ5dGVzKVxuICBfX2NoZWNrT2Zmc2V0IChvZmZzZXQpIHtcbiAgICBpZiAodHlwZW9mIG9mZnNldCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBvZmZzZXQgc2hvdWxkIGJlIGEgbnVtYmVyJylcbiAgICB9IGVsc2UgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgb2Zmc2V0IHNob3VsZCBiZSBlcXVhbCBvciBncmVhdGVyIHRoYW4gMCcpXG4gICAgfVxuICB9XG5cbiAgc2V0IG9mZnNldCAob2Zmc2V0KSB7XG4gICAgdGhpcy5fX2NoZWNrT2Zmc2V0KG9mZnNldClcbiAgICB0aGlzLl9fb2Zmc2V0ID0gb2Zmc2V0XG5cbiAgICB0aGlzLl9fdXBkYXRlUHJvZ3Jlc3MoKVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIGdldCBvZmZzZXQgKCkge1xuICAgIHJldHVybiB0aGlzLl9fb2Zmc2V0XG4gIH1cblxuICAvLyBTaXplIChpbiBieXRlcylcbiAgZ2V0IHNpemUgKCkge1xuICAgIHJldHVybiB0aGlzLl9fc2l6ZVxuICB9XG5cbiAgLy8gUHJvZ3Jlc3NcbiAgZ2V0IHByb2dyZXNzICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3Byb2dyZXNzXG4gIH1cblxuICBfX3VwZGF0ZVByb2dyZXNzICgpIHtcbiAgICB2YXIgcHJvZ3Jlc3MgPSAwXG4gICAgaWYgKHRoaXMub2Zmc2V0ID4gMCAmJiB0aGlzLnNpemUgPiAwKSB7XG4gICAgICBwcm9ncmVzcyA9ICh0aGlzLm9mZnNldCA8IHRoaXMuc2l6ZSlcbiAgICAgICAgPyAoKHRoaXMub2Zmc2V0ICogMTAwKSAvIHRoaXMuc2l6ZSlcbiAgICAgICAgOiAxMDBcbiAgICB9XG4gICAgdGhpcy5fX3Byb2dyZXNzID0gcHJvZ3Jlc3NcbiAgfVxuXG4gIC8vIEZpbGVcbiAgZ2V0IGZpbGUgKCkge1xuICAgIHJldHVybiB0aGlzLl9fdXNlckZpbGVcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGaWxlVXBsb2FkXG4iLCJpbXBvcnQgVXNlckZpbGUgZnJvbSAnLi91c2VyLWZpbGUnXG5pbXBvcnQgVXNlckZpbGVSZWFkZXIgZnJvbSAnLi91c2VyLWZpbGUtcmVhZGVyJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAoc2VsZikge1xuICBzZWxmLmZpbGVSZWFkZXIgPSBudWxsXG5cbiAgLy8gVXRpbCBmdW5jdGlvblxuICBzZWxmLmVtaXQgPSAoYWN0aW9uVHlwZSwgcGF5bG9hZCA9IHt9KSA9PiB7XG4gICAgc2VsZi5wb3N0TWVzc2FnZSh7XG4gICAgICBhY3Rpb25UeXBlOiBhY3Rpb25UeXBlLFxuICAgICAgcGF5bG9hZDogcGF5bG9hZFxuICAgIH0pXG4gIH1cblxuICAvLyBSZWFjdCB0byB0aGUgJ3JlYWQnIGV2ZW50IHJlY2VpdmVkIGZyb20gVXNlckZpbGVSZWFkZXJcbiAgc2VsZi5oYW5kbGVSZWFkID0gKGNodW5rLCBvZmZzZXQsIGxlbmd0aCkgPT4ge1xuICAgIHNlbGYuZW1pdCgncmVhZCcsIHsgY2h1bms6IGNodW5rLCBvZmZzZXQ6IG9mZnNldCwgbGVuZ3RoOiBsZW5ndGggfSlcbiAgfVxuICAvLyBFcnJvciBoYW5kbGluZ1xuICBzZWxmLmhhbmRsZUVycm9yID0gKGVycm9yKSA9PiB7XG4gICAgc2VsZi5lbWl0KCdlcnJvcicsIHsgZXJyb3I6IGVycm9yLm1lc3NhZ2UgfSlcbiAgfVxuICAvLyBIYW5kbGUgdGhlICdmaWxlJyBldmVudCByZWNlaXZlZCBmcm9tIHRoZSBtYXN0ZXJcbiAgc2VsZi5sb2FkRmlsZSA9IChmaWxlSGFuZGxlLCBkaXJuYW1lLCB0eXBlT1MpID0+IHtcbiAgICBpZiAoc2VsZi5maWxlUmVhZGVyKSB7XG4gICAgICBzZWxmLmhhbmRsZUVycm9yKG5ldyBFcnJvcignVGhlIGZpbGUgZXhpc3RzIHlldCcpKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGxldCBmaWxlID0gbmV3IFVzZXJGaWxlKGZpbGVIYW5kbGUsIGRpcm5hbWUsIHR5cGVPUylcbiAgICAgIHNlbGYuZmlsZVJlYWRlciA9IG5ldyBVc2VyRmlsZVJlYWRlcihmaWxlKVxuXG4gICAgICBzZWxmLmZpbGVSZWFkZXIub24oJ3JlYWQnLCAoY2h1bmssIG9mZnNldCwgbGVuZ3RoKSA9PiB7XG4gICAgICAgIHNlbGYuaGFuZGxlUmVhZChjaHVuaywgb2Zmc2V0LCBsZW5ndGgpXG4gICAgICB9KVxuICAgICAgc2VsZi5maWxlUmVhZGVyLm9uKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBzZWxmLmhhbmRsZUVycm9yKGVycm9yKVxuICAgICAgfSlcblxuICAgICAgc2VsZi5lbWl0KCdmaWxlJylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2VsZi5maWxlUmVhZGVyID0gbnVsbFxuICAgICAgc2VsZi5oYW5kbGVFcnJvcihlcnJvcilcbiAgICB9XG4gIH1cblxuICAvLyBSZWNlaXZlZCBtZXNzYWdlc1xuICBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZXZlbnQpID0+IHtcbiAgICB2YXIgYWN0aW9uVHlwZSA9IGV2ZW50LmRhdGEuYWN0aW9uVHlwZVxuICAgIHZhciBwYXlsb2FkID0gZXZlbnQuZGF0YS5wYXlsb2FkXG5cbiAgICAvLyBjb25zb2xlLmxvZygnW0ZpbGVzV29ya2VyXScsIGFjdGlvblR5cGUsIHBheWxvYWQpIC8vIERFQlVHXG5cbiAgICBzd2l0Y2ggKGFjdGlvblR5cGUpIHtcbiAgICAgIGNhc2UgJ2ZpbGUnOlxuICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQuZmlsZUhhbmRsZSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHBheWxvYWQuZmlsZUhhbmRsZSBpbnN0YW5jZW9mIEZpbGUgJiZcbiAgICAgICAgICAgIHR5cGVvZiBwYXlsb2FkLmRpcm5hbWUgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICB0eXBlb2YgcGF5bG9hZC50eXBlT1MgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgc2VsZi5sb2FkRmlsZShwYXlsb2FkLmZpbGVIYW5kbGUsIHBheWxvYWQuZGlybmFtZSwgcGF5bG9hZC50eXBlT1MpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZi5oYW5kbGVFcnJvcihuZXcgRXJyb3IoJ0ludmFsaWQgcGF5bG9hZCB3aGVuIGxvYWRpbmcgdGhlIGZpbGUnKSlcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncmVhZCc6XG4gICAgICAgIGlmICghc2VsZi5maWxlUmVhZGVyKSB7XG4gICAgICAgICAgc2VsZi5oYW5kbGVFcnJvcihuZXcgRXJyb3IoJ1RoZSBmaWxlIGRvblxcJ3QgZXhpc3RzIHlldCcpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBvZmZzZXQgPSAocGF5bG9hZC5vZmZzZXQpID8gcGF5bG9hZC5vZmZzZXQgOiAwXG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgc2VsZi5maWxlUmVhZGVyLnJlYWQob2Zmc2V0KVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBzZWxmLmhhbmRsZUVycm9yKGVycm9yKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc2VsZi5oYW5kbGVFcnJvcihuZXcgRXJyb3IoJ0ludmFsaWQgYWN0aW9uIHR5cGUnKSlcbiAgICB9XG4gIH0pXG59XG4iLCJpbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnXG5cbi8vIHNhdmVBc1xuaW1wb3J0IHsgc2F2ZUFzIH0gZnJvbSAnZmlsZXNhdmVyLmpzL0ZpbGVTYXZlcidcblxuaW1wb3J0IEZpbGVEb3dubG9hZCBmcm9tICcuL2ZpbGUtZG93bmxvYWQnXG5pbXBvcnQgRmlsZUl0ZW0gZnJvbSAnLi9maWxlLWl0ZW0nXG5cbmltcG9ydCBMb2dnZXIgZnJvbSAnLi4vLi4vY29tbW9uL2xpYi9Mb2dnZXInXG5cbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoeyBzZWN0aW9uOiAnRmlsZXMgZG93bmxvYWQgY29udHJvbGxlcicgfSlcblxuY2xhc3MgRmlsZXNEb3dubG9hZENvbnRyb2xsZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgaWYgKCFGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5pc1N1cHBvcnRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGZWF0dXJlIG5vdCBzdXBwb3J0ZWQnKVxuICAgIH1cblxuICAgIHN1cGVyKClcblxuICAgIC8vIEZpbGVzXG4gICAgdGhpcy5fX2ZpbGVzID0gbmV3IE1hcCgpXG4gICAgLy8gUXVldWVcbiAgICB0aGlzLl9fcSA9IFtdXG4gICAgLy8gU3RhdGVcbiAgICB0aGlzLl9fc3RhdGUgPSBGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5SVU5OSU5HXG4gIH1cblxuICBzZXQgcmVxdWVzdENodW5rQWN0aW9uIChhY3Rpb24pIHtcbiAgICB0aGlzLl9fcmVxdWVzdENodW5rQWN0aW9uID0gYWN0aW9uXG4gIH1cblxuICBnZXQgc3RhdGUgKCkge1xuICAgIHJldHVybiB0aGlzLl9fc3RhdGVcbiAgfVxuXG4gIC8vIEZpbGVzXG4gIGdldCBmaWxlcyAoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLl9fZmlsZXMudmFsdWVzKCldXG4gIH1cblxuICBhZGRGaWxlIChmaWxlKSB7XG4gICAgaWYgKCEoZmlsZSBpbnN0YW5jZW9mIEZpbGVJdGVtKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignTm90IGEgdmFsaWQgZmlsZScpXG5cbiAgICB2YXIgZmlsZURvd25sb2FkID0gbmV3IEZpbGVEb3dubG9hZChmaWxlKVxuXG4gICAgaWYgKCF0aGlzLl9fZmlsZXMuaGFzKGZpbGVEb3dubG9hZC5maWxlLnBhdGgpKSB7XG4gICAgICB0aGlzLl9fZmlsZXMuc2V0KGZpbGVEb3dubG9hZC5maWxlLnBhdGgsIGZpbGVEb3dubG9hZClcblxuICAgICAgLy8gRW1pdCBhIGZpbGUgZXZlbnRcbiAgICAgIHRoaXMuZW1pdChGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5GSUxFLCBmaWxlRG93bmxvYWQuZmlsZS5wYXRoLCBmaWxlRG93bmxvYWQpXG5cbiAgICAgIC8vIFJlcXVlc3QgZG93bmxvYWRcbiAgICAgIHRoaXMuZG93bmxvYWQoZmlsZURvd25sb2FkLmZpbGUucGF0aClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcmVtb3ZlRmlsZSAocGF0aCkge1xuICAgIGlmICh0aGlzLl9fZmlsZXMuaGFzKHBhdGgpKSB7XG4gICAgICB0aGlzLl9fZmlsZXMuZGVsZXRlKHBhdGgpXG5cbiAgICAgIC8vIEVtaXQgYSBmaWxlIGV2ZW50XG4gICAgICB0aGlzLmVtaXQoRmlsZXNEb3dubG9hZENvbnRyb2xsZXIuRklMRSwgcGF0aCwgbnVsbClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgY2xlYW5GaWxlcyAoKSB7XG4gICAgZm9yIChsZXQgWywgZmlsZV0gb2YgdGhpcy5fX2ZpbGVzKSB7XG4gICAgICB0aGlzLnJlbW92ZUZpbGUoZmlsZSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgLy8gVGFza3NcbiAgX19hZGRUYXNrICh0YXNrKSB7XG4gICAgdGhpcy5fX3EucG9wKHRhc2spXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgX19nZXRUYXNrICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3Euc2hpZnQoKVxuICB9XG5cbiAgX19jbGVhblRhc2tzICgpIHtcbiAgICB0aGlzLl9fcSA9IFtdXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgX19mbHVzaCAoKSB7XG4gICAgZm9yIChsZXQgdGFzazsgdGhpcy5zdGF0ZSA9PT0gRmlsZXNEb3dubG9hZENvbnRyb2xsZXIuUlVOTklORyAmJiAodGFzayA9IHRoaXMuX19nZXRUYXNrKCkpOykge1xuICAgICAgY29uc3QgeyBhY3Rpb24sIHBheWxvYWQgfSA9IHRhc2tcblxuICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgY2FzZSAnZG93bmxvYWQnOlxuICAgICAgICAgIGlmICh0aGlzLl9fZmlsZXMuaGFzKHBheWxvYWQucGF0aCkpIHRoaXMuZG93bmxvYWQocGF5bG9hZC5wYXRoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQXNrIGZvciBhIG5ldyBjaHVuayBvZiB0aGUgZmlsZVxuICBkb3dubG9hZCAocGF0aCkge1xuICAgIGlmICghdGhpcy5fX2ZpbGVzLmhhcyhwYXRoKSkgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGZpbGUgZG9lc25cXCd0IGV4aXN0JylcblxuICAgIGlmICh0aGlzLl9fc3RhdGUgPT09IEZpbGVzRG93bmxvYWRDb250cm9sbGVyLlBBVVNFRCkge1xuICAgICAgdGhpcy5fX2FkZFRhc2soe1xuICAgICAgICBhY3Rpb246ICdkb3dubG9hZCcsXG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICBwYXRoOiBwYXRoXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX19yZXF1ZXN0Q2h1bmsocGF0aClcbiAgICB9XG4gIH1cblxuICBfX3JlcXVlc3RDaHVuayAocGF0aCkge1xuICAgIGlmICghdGhpcy5fX2ZpbGVzLmhhcyhwYXRoKSkgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGZpbGUgZG9lc25cXCd0IGV4aXN0JylcblxuICAgIHZhciBmaWxlRG93bmxvYWQgPSB0aGlzLl9fZmlsZXMuZ2V0KHBhdGgpXG4gICAgaWYgKGZpbGVEb3dubG9hZC5wcm9ncmVzcyA8IDEwMCkge1xuICAgICAgaWYgKHRoaXMuX19zdGF0ZSA9PT0gRmlsZXNEb3dubG9hZENvbnRyb2xsZXIuUlVOTklORykge1xuICAgICAgICBsZXQgeyBmaWxlOiB7IGRpcm5hbWUsIGJhc2VuYW1lIH0sIG9mZnNldCB9ID0gZmlsZURvd25sb2FkXG4gICAgICAgIHRoaXMuX19yZXF1ZXN0Q2h1bmtBY3Rpb24oZGlybmFtZSwgYmFzZW5hbWUsIG9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBBZnRlciBzYXZpbmcgYSBjaHVuaywgYXNrIGZvciBhIG5ldyB1bnRpbCAxMDAlIGNvbXBsZXRlZFxuICBzYXZlQ2h1bmsgKHBhdGgsIGNodW5rLCBvZmZzZXQsIGNodW5rU2l6ZSkge1xuICAgIGlmICh0aGlzLl9fZmlsZXMuaGFzKHBhdGgpKSB7XG4gICAgICBsZXQgZmlsZURvd25sb2FkID0gdGhpcy5fX2ZpbGVzLmdldChwYXRoKVxuXG4gICAgICAvLyBVbnRpbCB0aGUgcmVtb3RlIHJlY2VpdmUgdGhlIG9mZnNldFxuICAgICAgb2Zmc2V0ID0gZmlsZURvd25sb2FkLm9mZnNldFxuXG4gICAgICBpZiAoZmlsZURvd25sb2FkLm9mZnNldCA8PSBvZmZzZXQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmaWxlRG93bmxvYWQuc2F2ZUNodW5rKGNodW5rLCBvZmZzZXQsIGNodW5rU2l6ZSlcbiAgICAgICAgICBjaHVuayA9IG51bGxcblxuICAgICAgICAgIC8vIEVtaXQgYSBwcm9ncmVzcyBldmVudFxuICAgICAgICAgIHRoaXMuZW1pdChGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5QUk9HUkVTUywgcGF0aCwgZmlsZURvd25sb2FkLnByb2dyZXNzKVxuICAgICAgICAgIC8vIEVtaXQgYSBmaWxlIGV2ZW50XG4gICAgICAgICAgdGhpcy5lbWl0KEZpbGVzRG93bmxvYWRDb250cm9sbGVyLkZJTEUsIHBhdGgsIGZpbGVEb3dubG9hZClcblxuICAgICAgICAgIC8vIFNhdmUgdGhlIGZpbGVcbiAgICAgICAgICBpZiAoZmlsZURvd25sb2FkLnByb2dyZXNzIDwgMTAwKSB7XG4gICAgICAgICAgICB0aGlzLl9fZmlsZXMuc2V0KHBhdGgsIGZpbGVEb3dubG9hZClcbiAgICAgICAgICAgIC8vIFJlcXVlc3QgZG93bmxvYWRcbiAgICAgICAgICAgIHRoaXMuZG93bmxvYWQocGF0aClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2F2ZUFzKGZpbGVEb3dubG9hZC50b0Jsb2IoKSwgZmlsZURvd25sb2FkLmZpbGUuYmFzZW5hbWUsIHRydWUpXG4gICAgICAgICAgICB0aGlzLnJlbW92ZUZpbGUocGF0aClcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIHBhdXNlRG93bmxvYWRzICgpIHtcbiAgICB0aGlzLl9fc3RhdGUgPSBGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5QQVVTRURcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGFydERvd25sb2FkcyAoKSB7XG4gICAgdGhpcy5fX3N0YXRlID0gRmlsZXNEb3dubG9hZENvbnRyb2xsZXIuUlVOTklOR1xuICAgIHRoaXMuX19mbHVzaCgpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RvcERvd25sb2FkcyAoKSB7XG4gICAgdGhpcy5fX3N0YXRlID0gRmlsZXNEb3dubG9hZENvbnRyb2xsZXIuUEFVU0VEXG4gICAgdGhpcy5fX2NsZWFuVGFza3MoKVxuICAgIHRoaXMuY2xlYW5GaWxlcygpXG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG59XG5cbi8vIFN0YXRlc1xuRmlsZXNEb3dubG9hZENvbnRyb2xsZXIuUEFVU0VEID0gJ3BhdXNlZCdcbkZpbGVzRG93bmxvYWRDb250cm9sbGVyLlJVTk5JTkcgPSAncnVubmluZydcblxuLy8gRXZlbnRzXG5GaWxlc0Rvd25sb2FkQ29udHJvbGxlci5GSUxFID0gJ2ZpbGUnXG5GaWxlc0Rvd25sb2FkQ29udHJvbGxlci5QUk9HUkVTUyA9ICdwcm9ncmVzcydcblxuRmlsZXNEb3dubG9hZENvbnRyb2xsZXIuaXNTdXBwb3J0ZWQgPSAod2luZG93ICYmIHdpbmRvdy5GaWxlICYmIHdpbmRvdy5GaWxlUmVhZGVyICYmIHdpbmRvdy5GaWxlTGlzdCAmJiB3aW5kb3cuQmxvYilcblxuZXhwb3J0IGRlZmF1bHQgbmV3IEZpbGVzRG93bmxvYWRDb250cm9sbGVyKClcbiIsImltcG9ydCB3b3JrIGZyb20gJ3dlYndvcmtpZnknXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnXG5cbmltcG9ydCBMb2dnZXIgZnJvbSAnLi4vLi4vY29tbW9uL2xpYi9Mb2dnZXInXG5cbmltcG9ydCBGaWxlV29ya2VyIGZyb20gJy4vZmlsZS13b3JrZXInXG5pbXBvcnQgRmlsZVVwbG9hZCBmcm9tICcuL2ZpbGUtdXBsb2FkJ1xuaW1wb3J0IFVzZXJGaWxlIGZyb20gJy4vdXNlci1maWxlJ1xuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHsgc2VjdGlvbjogJ0ZpbGVzIHVwbG9hZCBjb250cm9sbGVyJyB9KVxuXG5jbGFzcyBGaWxlc1VwbG9hZENvbnRyb2xsZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgaWYgKCFGaWxlc1VwbG9hZENvbnRyb2xsZXIuaXNTdXBwb3J0ZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmVhdHVyZSBub3Qgc3VwcG9ydGVkJylcbiAgICB9XG5cbiAgICBzdXBlcigpXG5cbiAgICAvLyBGaWxlc1xuICAgIHRoaXMuX19maWxlcyA9IG5ldyBNYXAoKVxuICAgIC8vIFdvcmtlcnNcbiAgICB0aGlzLl9fd29ya2VycyA9IG5ldyBNYXAoKVxuICAgIC8vIFF1ZXVlXG4gICAgdGhpcy5fX3EgPSBbXVxuICAgIC8vIFN0YXRlXG4gICAgdGhpcy5fX3N0YXRlID0gRmlsZXNVcGxvYWRDb250cm9sbGVyLlJVTk5JTkdcbiAgfVxuXG4gIHNldCBzZW5kQ2h1bmtBY3Rpb24gKGFjdGlvbikge1xuICAgIHRoaXMuX19zZW5kQ2h1bmtBY3Rpb24gPSBhY3Rpb25cbiAgfVxuXG4gIGdldCBzdGF0ZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19zdGF0ZVxuICB9XG5cbiAgLy8gRmlsZXNcbiAgZ2V0IGZpbGVzICgpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuX19maWxlcy52YWx1ZXMoKV1cbiAgfVxuXG4gIGFkZEZpbGUgKGZpbGUpIHtcbiAgICBpZiAoIShmaWxlIGluc3RhbmNlb2YgVXNlckZpbGUpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdOb3QgYSB1c2VyIGZpbGUnKVxuXG4gICAgY29uc3QgZmlsZVVwbG9hZCA9IG5ldyBGaWxlVXBsb2FkKGZpbGUpXG5cbiAgICBpZiAoIXRoaXMuX19maWxlcy5oYXMoZmlsZVVwbG9hZC5maWxlLnBhdGgpKSB7XG4gICAgICB0aGlzLl9fZmlsZXMuc2V0KGZpbGVVcGxvYWQuZmlsZS5wYXRoLCBmaWxlVXBsb2FkKVxuXG4gICAgICAvLyBFbWl0IGEgZmlsZSBldmVudFxuICAgICAgdGhpcy5lbWl0KEZpbGVzVXBsb2FkQ29udHJvbGxlci5GSUxFLCBmaWxlVXBsb2FkLmZpbGUucGF0aCwgZmlsZVVwbG9hZClcblxuICAgICAgLy8gUmVxdWVzdCByZWFkXG4gICAgICB0aGlzLnVwbG9hZChmaWxlVXBsb2FkLmZpbGUucGF0aClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcmVtb3ZlV29ya2VyIChwYXRoKSB7XG4gICAgaWYgKHRoaXMuX193b3JrZXJzLmhhcyhwYXRoKSkge1xuICAgICAgdGhpcy5fX3dvcmtlcnMuZ2V0KHBhdGgpLnRlcm1pbmF0ZSgpXG4gICAgICB0aGlzLl9fd29ya2Vycy5kZWxldGUocGF0aClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcmVtb3ZlRmlsZSAocGF0aCkge1xuICAgIHRoaXMucmVtb3ZlV29ya2VyKHBhdGgpXG5cbiAgICBpZiAodGhpcy5fX2ZpbGVzLmhhcyhwYXRoKSkge1xuICAgICAgdGhpcy5fX2ZpbGVzLmRlbGV0ZShwYXRoKVxuXG4gICAgICAvLyBFbWl0IGEgZmlsZSBldmVudFxuICAgICAgdGhpcy5lbWl0KEZpbGVzVXBsb2FkQ29udHJvbGxlci5GSUxFLCBwYXRoLCBudWxsKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBjbGVhbkZpbGVzICgpIHtcbiAgICBmb3IgKGxldCBbLCBmaWxlXSBvZiB0aGlzLl9fZmlsZXMpIHtcbiAgICAgIHRoaXMucmVtb3ZlRmlsZShmaWxlKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvLyBUYXNrc1xuICBfX2FkZFRhc2sgKHRhc2spIHtcbiAgICB0aGlzLl9fcS5wb3AodGFzaylcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBfX2dldFRhc2sgKCkge1xuICAgIHJldHVybiB0aGlzLl9fcS5zaGlmdCgpXG4gIH1cblxuICBfX2NsZWFuVGFza3MgKCkge1xuICAgIHRoaXMuX19xID0gW11cblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBfX2ZsdXNoICgpIHtcbiAgICBmb3IgKGxldCB0YXNrOyB0aGlzLnN0YXRlID09PSBGaWxlc1VwbG9hZENvbnRyb2xsZXIuUlVOTklORyAmJiAodGFzayA9IHRoaXMuX19nZXRUYXNrKCkpOykge1xuICAgICAgY29uc3QgeyBhY3Rpb24sIHBheWxvYWQgfSA9IHRhc2tcblxuICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgY2FzZSAndXBsb2FkJzpcbiAgICAgICAgICAvLyBSZXF1ZXN0IHJlYWRcbiAgICAgICAgICBpZiAodGhpcy5fX2ZpbGVzLmhhcyhwYXlsb2FkLnBhdGgpKSB0aGlzLnVwbG9hZChwYXlsb2FkLnBhdGgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGVGaWxlT2Zmc2V0IChwYXRoLCBvZmZzZXQpIHtcbiAgICBpZiAodGhpcy5fX2ZpbGVzLmhhcyhwYXRoKSkge1xuICAgICAgbGV0IGZpbGVVcGxvYWQgPSB0aGlzLl9fZmlsZXMuZ2V0KHBhdGgpXG5cbiAgICAgIGZpbGVVcGxvYWQub2Zmc2V0ID0gb2Zmc2V0XG4gICAgICAvLyBFbWl0IGEgcHJvZ3Jlc3MgZXZlbnRcbiAgICAgIHRoaXMuZW1pdChGaWxlc1VwbG9hZENvbnRyb2xsZXIuUFJPR1JFU1MsIHBhdGgsIGZpbGVVcGxvYWQucHJvZ3Jlc3MpXG5cbiAgICAgIHRoaXMuX19maWxlcy5zZXQocGF0aCwgZmlsZVVwbG9hZClcbiAgICAgIC8vIEVtaXQgYSBmaWxlIGV2ZW50XG4gICAgICB0aGlzLmVtaXQoRmlsZXNVcGxvYWRDb250cm9sbGVyLkZJTEUsIHBhdGgsIGZpbGVVcGxvYWQpXG5cbiAgICAgIGlmIChmaWxlVXBsb2FkLnByb2dyZXNzIDwgMTAwKSB7XG4gICAgICAgIC8vIFJlcXVlc3QgdXBsb2FkXG4gICAgICAgIHRoaXMudXBsb2FkKHBhdGgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZVdvcmtlcihwYXRoKVxuICAgICAgICB0aGlzLnJlbW92ZUZpbGUocGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGxvYWQgKHBhdGgpIHtcbiAgICBpZiAoIXRoaXMuX19maWxlcy5oYXMocGF0aCkpIHRocm93IG5ldyBFcnJvcignVGhpcyBmaWxlIGRvZXNuXFwndCBleGlzdCcpXG5cbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gRmlsZXNVcGxvYWRDb250cm9sbGVyLlBBVVNFRCkge1xuICAgICAgdGhpcy5fX2FkZFRhc2soe1xuICAgICAgICBhY3Rpb246ICd1cGxvYWQnLFxuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgcGF0aDogcGF0aFxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9fcmVxdWVzdFJlYWQocGF0aClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgX19yZXF1ZXN0UmVhZCAocGF0aCkge1xuICAgIGlmICghdGhpcy5fX2ZpbGVzLmhhcyhwYXRoKSkgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGZpbGUgZG9lc25cXCd0IGV4aXN0JylcblxuICAgIGNvbnN0IGZpbGVVcGxvYWQgPSB0aGlzLl9fZmlsZXMuZ2V0KHBhdGgpXG4gICAgaWYgKGZpbGVVcGxvYWQucHJvZ3Jlc3MgPCAxMDApIHtcbiAgICAgIGlmICh0aGlzLl9fc3RhdGUgPT09IEZpbGVzVXBsb2FkQ29udHJvbGxlci5SVU5OSU5HKSB7XG4gICAgICAgIHRoaXMuX19pbml0V29ya2VyKHBhdGgpXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4gbG9nZ2VyLmVycm9yKGVycm9yKSlcbiAgICAgICAgICAudGhlbigod29ya2VyKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX193b3JrZXJzLmhhcyhwYXRoKSkgdGhpcy5fX3dvcmtlcnMuc2V0KHBhdGgsIHdvcmtlcilcblxuICAgICAgICAgICAgLy8gU3RhcnQgdGhlIHJlYWQgd2hpY2ggd2lsbCBmaXJlIHRoZSBjaHVuayBzZW5kaW5nXG4gICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICBhY3Rpb25UeXBlOiAncmVhZCcsXG4gICAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgICBvZmZzZXQ6IGZpbGVVcGxvYWQub2Zmc2V0XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVXb3JrZXIocGF0aClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgX19oYW5kbGVXb3JrZXJSZWFkIChmaWxlLCBjaHVuaywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgICB0aGlzLl9fc2VuZENodW5rQWN0aW9uKGZpbGUuZGlybmFtZSwgZmlsZS5iYXNlbmFtZSwgY2h1bmssIG9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgX19pbml0V29ya2VyIChwYXRoKSB7XG4gICAgY29uc3QgZmlsZXMgPSB0aGlzLl9fZmlsZXNcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIWZpbGVzLmhhcyhwYXRoKSkgdGhyb3cgbmV3IEVycm9yKCdUaGlzIGZpbGUgZG9lc25cXCd0IGV4aXN0JylcblxuICAgICAgLy8gUmV0dXJuIHRoZSBleGlzdGluZyB3b3JrZXJcbiAgICAgIGlmICh0aGlzLl9fd29ya2Vycy5oYXMocGF0aCkpIHtcbiAgICAgICAgcmVzb2x2ZSh0aGlzLl9fd29ya2Vycy5nZXQocGF0aCksIDEpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgd29ya2VyXG4gICAgICBjb25zdCB3b3JrZXIgPSB3b3JrKEZpbGVXb3JrZXIpXG4gICAgICBsZXQgZmlsZSA9IGZpbGVzLmdldChwYXRoKS5maWxlXG5cbiAgICAgIC8vIEFkZCB3b3JrZXIgbGlzdGVuZXJzXG4gICAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICBjb25zdCB7IGFjdGlvblR5cGUsIHBheWxvYWQgfSA9IGV2ZW50LmRhdGFcblxuICAgICAgICAvLyBsb2dnZXIubG9nKGFjdGlvblR5cGUsIHBheWxvYWQpIC8vIERFQlVHXG5cbiAgICAgICAgc3dpdGNoIChhY3Rpb25UeXBlKSB7XG4gICAgICAgICAgY2FzZSAnZmlsZSc6XG4gICAgICAgICAgICAvLyBSZXNvbHZlIHRoZSBwcm9taXNlXG4gICAgICAgICAgICByZXNvbHZlKHdvcmtlciwgMClcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgY2FzZSAncmVhZCc6XG4gICAgICAgICAgICBpZiAodHlwZW9mIHBheWxvYWQuY2h1bmsgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgICAgICAgICAgdHlwZW9mIHBheWxvYWQub2Zmc2V0ID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBwYXlsb2FkLmxlbmd0aCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgdGhpcy5fX2hhbmRsZVdvcmtlclJlYWQoZmlsZSwgcGF5bG9hZC5jaHVuaywgcGF5bG9hZC5vZmZzZXQsIHBheWxvYWQubGVuZ3RoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdJbnZhbGlkIHBheWxvYWQgb24gcmVhZCBldmVudCcpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgICAgIC8vIFJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihwYXlsb2FkLmVycm9yKSlcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignSW52YWxpZCBhY3Rpb24gdHlwZScpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIC8vIFNlbmQgYSBtZXNzYWdlIHRvIGxvYWQgdGhlIGZpbGVcbiAgICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgIGFjdGlvblR5cGU6ICdmaWxlJyxcbiAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgIGZpbGVIYW5kbGU6IGZpbGUuZmlsZUhhbmRsZSxcbiAgICAgICAgICBkaXJuYW1lOiBmaWxlLmRpcm5hbWUsXG4gICAgICAgICAgdHlwZU9TOiBmaWxlLnR5cGVPU1xuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBwYXVzZVVwbG9hZHMgKCkge1xuICAgIHRoaXMuX19zdGF0ZSA9IEZpbGVzVXBsb2FkQ29udHJvbGxlci5QQVVTRURcbiAgfVxuXG4gIHN0YXJ0VXBsb2FkcyAoKSB7XG4gICAgdGhpcy5fX3N0YXRlID0gRmlsZXNVcGxvYWRDb250cm9sbGVyLlJVTk5JTkdcbiAgICB0aGlzLl9fZmx1c2goKVxuICB9XG5cbiAgc3RvcFVwbG9hZHMgKCkge1xuICAgIHRoaXMuX19zdGF0ZSA9IEZpbGVzVXBsb2FkQ29udHJvbGxlci5QQVVTRURcbiAgICB0aGlzLl9fY2xlYW5UYXNrcygpXG4gICAgdGhpcy5jbGVhbkZpbGVzKClcbiAgfVxufVxuXG4vLyBTdGF0ZXNcbkZpbGVzVXBsb2FkQ29udHJvbGxlci5QQVVTRUQgPSAncGF1c2VkJ1xuRmlsZXNVcGxvYWRDb250cm9sbGVyLlJVTk5JTkcgPSAncnVubmluZydcblxuLy8gRXZlbnRzXG5GaWxlc1VwbG9hZENvbnRyb2xsZXIuRklMRSA9ICdmaWxlJ1xuRmlsZXNVcGxvYWRDb250cm9sbGVyLlBST0dSRVNTID0gJ3Byb2dyZXNzJ1xuXG5GaWxlc1VwbG9hZENvbnRyb2xsZXIuaXNTdXBwb3J0ZWQgPSAod2luZG93ICYmIHdpbmRvdy5GaWxlICYmIHdpbmRvdy5GaWxlUmVhZGVyICYmIHdpbmRvdy5GaWxlTGlzdCAmJiB3aW5kb3cuQmxvYilcblxuZXhwb3J0IGRlZmF1bHQgbmV3IEZpbGVzVXBsb2FkQ29udHJvbGxlcigpXG4iLCJpbXBvcnQgcGF0aFBhcnNlIGZyb20gJ3BhdGgtcGFyc2UnXG5pbXBvcnQgZ2V0UGF0aFBhcnNlciwgeyBNT0RFX1BPU0lYLCBNT0RFX1dJTiB9IGZyb20gJy4vcGF0aC1wYXJzZXInXG5pbXBvcnQgeyBlbnN1cmVCb29sIH0gZnJvbSAnLi4vLi4vY29tbW9uL2xpYi91dGlsJ1xuXG5jbGFzcyBGU0l0ZW0ge1xuICBjb25zdHJ1Y3RvciAocGF0aCwgdHlwZU9TKSB7XG4gICAgLy8gRmlyc3QhISBEbyB0aGlzIGJlZm9yZSBzZXR0aW5nIHRoZSBwYXRoXG4gICAgdGhpcy50eXBlT1MgPSB0eXBlT1NcblxuICAgIHRoaXMucGF0aCA9IHBhdGhcbiAgICB0aGlzLl9fbGFzdE1vZGlmaWNhdGlvbiA9IDBcbiAgICB0aGlzLl9fbGFzdFVwZGF0ZSA9IDBcbiAgICB0aGlzLl9yZWFkYWJsZSA9IGZhbHNlXG4gICAgdGhpcy5fd3JpdGFibGUgPSBmYWxzZVxuICB9XG5cbiAgc2V0IHR5cGVPUyAodHlwZU9TKSB7XG4gICAgdGhpcy5fX3R5cGVPUyA9IHR5cGVPU1xuICAgIGlmICh0eXBlT1MgJiYgdHlwZU9TLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3dpbicpKSB7XG4gICAgICB0aGlzLl9fcG9zaXggPSBmYWxzZVxuICAgICAgdGhpcy5fX3dpbiA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fX3Bvc2l4ID0gdHJ1ZVxuICAgICAgdGhpcy5fX3dpbiA9IGZhbHNlXG4gICAgfVxuXG4gICAgLy8gUmVidWlsZCBwYXRoXG4gICAgaWYgKHRoaXMuX19wYXRoKSB0aGlzLnBhdGggPSB0aGlzLnBhdGhcbiAgfVxuXG4gIGdldCB0eXBlT1MgKCkge1xuICAgIHJldHVybiB0aGlzLl9fdHlwZU9TXG4gIH1cblxuICBnZXQgaXNQb3NpeCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19wb3NpeFxuICB9XG5cbiAgZ2V0IGlzV2luICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3dpblxuICB9XG5cbiAgZ2V0IGlzRGlyICgpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGdldCBpc0RyaXZlICgpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGdldCBpc0ZpbGUgKCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZ2V0IHNlcGFyYXRvciAoKSB7XG4gICAgcmV0dXJuICh0aGlzLmlzV2luID8gJ1xcXFwnIDogJy8nKVxuICB9XG5cbiAgZ2V0IHBhdGggKCkge1xuICAgIGlmICh0aGlzLmRpcm5hbWUubGVuZ3RoIDw9IDAgJiYgdGhpcy5iYXNlbmFtZS5sZW5ndGggPD0gMCkgcmV0dXJuICcnXG4gICAgZWxzZSBpZiAodGhpcy5kaXJuYW1lLmxlbmd0aCA8PSAwKSByZXR1cm4gdGhpcy5iYXNlbmFtZVxuICAgIGVsc2UgaWYgKHRoaXMuYmFzZW5hbWUubGVuZ3RoIDw9IDApIHJldHVybiB0aGlzLmRpcm5hbWVcbiAgICBlbHNlIHJldHVybiBgJHt0aGlzLmRpcm5hbWV9JHt0aGlzLnNlcGFyYXRvcn0ke3RoaXMuYmFzZW5hbWV9YFxuICB9XG5cbiAgc2V0IHBhdGggKHBhdGgpIHtcbiAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgcGF0aCBzaG91bGQgYmUgYSBzdHJpbmcnKVxuICAgIH1cblxuICAgIGNvbnN0IHBhdGhQYXJzZXIgPSBnZXRQYXRoUGFyc2VyKHRoaXMuaXNXaW4gPyBNT0RFX1dJTiA6IE1PREVfUE9TSVgpXG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLmxlbmd0aCA+IDAgPyBwYXRoUGFyc2VyLm5vcm1hbGl6ZShwYXRoKSA6ICcnXG5cbiAgICBpZiAodGhpcy5pc1dpbikge1xuICAgICAgdGhpcy5fX3BhdGggPSBwYXRoUGFyc2Uud2luMzIobm9ybWFsaXplZFBhdGgucmVwbGFjZSgvXFwvLywgJ1xcXFwnKSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fX3BhdGggPSBwYXRoUGFyc2UucG9zaXgobm9ybWFsaXplZFBhdGgpXG4gICAgfVxuICB9XG5cbiAgZ2V0IHJvb3QgKCkge1xuICAgIHJldHVybiB0aGlzLl9fcGF0aC5yb290LnJlcGxhY2UoL1tcXFxcXFwvXSQvLCAnJykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICB9XG5cbiAgZ2V0IGRpcm5hbWUgKCkge1xuICAgIHJldHVybiB0aGlzLl9fcGF0aC5kaXIucmVwbGFjZSgvW1xcXFxcXC9dJC8sICcnKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gIH1cblxuICBnZXQgYmFzZW5hbWUgKCkge1xuICAgIHJldHVybiB0aGlzLl9fcGF0aC5iYXNlXG4gIH1cblxuICBnZXQgbmFtZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19wYXRoLm5hbWVcbiAgfVxuXG4gIGdldCBleHRlbnNpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9fcGF0aC5leHRcbiAgfVxuXG4gIGdldCBsYXN0TW9kaWZpY2F0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2xhc3RNb2RpZmljYXRpb25cbiAgfVxuXG4gIC8vIEluIHV0aW1lc3RhbXAgd2l0aCBtaWxsaXNlY29uZHNcbiAgc2V0IGxhc3RNb2RpZmljYXRpb24gKGxhc3RNb2RpZmljYXRpb24pIHtcbiAgICB0aGlzLl9fbGFzdE1vZGlmaWNhdGlvbiA9IGxhc3RNb2RpZmljYXRpb25cbiAgfVxuXG4gIC8vIERhdGUgb2YgdGhlIGxhc3QgcmVtb3RlIG1vZGlmaWNhdGlvbiBpbiB0aGlzIG9iamVjdCBpbiB1dGltZXN0YW1wIHdpdGggbWlsbGlzZWNvbmRzXG4gIGdldCBsYXN0VXBkYXRlICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2xhc3RVcGRhdGVcbiAgfVxuXG4gIC8vIERhdGUgb2YgdGhlIGxhc3QgcmVtb3RlIG1vZGlmaWNhdGlvbiBpbiB0aGlzIG9iamVjdCBpbiB1dGltZXN0YW1wIHdpdGggbWlsbGlzZWNvbmRzXG4gIHNldCBsYXN0VXBkYXRlIChsYXN0VXBkYXRlKSB7XG4gICAgdGhpcy5fX2xhc3RVcGRhdGUgPSBsYXN0VXBkYXRlXG4gICAgdGhpcy5sb2FkZWQgPSB0cnVlXG4gIH1cblxuICBnZXQgaXNEZWxldGluZyAoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgc2V0IGlzRGVsZXRpbmcgKGRlbGV0aW5nKSB7XG4gICAgLy8gbG9sIG5vdGhpbmcgaGFwcGVuc1xuICB9XG5cbiAgZ2V0IGNhbkJlRGVsZXRlZCAoKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgc2V0IGNhbkJlRGVsZXRlZCAoY2FuQmUpIHtcbiAgICAvLyBsb2wgbm90aGluZyBoYXBwZW5zXG4gIH1cblxuICBnZXQgcmVhZGFibGUgKCkge1xuICAgIHJldHVybiB0aGlzLl9yZWFkYWJsZVxuICB9XG4gIHNldCByZWFkYWJsZSAodmFsdWUpIHtcbiAgICB0aGlzLl9yZWFkYWJsZSA9IGVuc3VyZUJvb2wodmFsdWUsICdyZWFkYWJsZSB2YWx1ZSBzaG91bGQgYmUgYm9vbGVhbicpXG4gIH1cblxuICBnZXQgd3JpdGFibGUgKCkge1xuICAgIHJldHVybiB0aGlzLl93cml0YWJsZVxuICB9XG4gIHNldCB3cml0YWJsZSAodmFsdWUpIHtcbiAgICB0aGlzLl93cml0YWJsZSA9IGVuc3VyZUJvb2wodmFsdWUsICd3cml0YWJsZSB2YWx1ZSBzaG91bGQgYmUgYm9vbGVhbicpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRlNJdGVtXG4iLCJpbXBvcnQgZ2V0UGF0aFBhcnNlciwgeyBNT0RFX1BPU0lYLCBNT0RFX1dJTiB9IGZyb20gJy4vcGF0aC1wYXJzZXInXG5leHBvcnQgeyBNT0RFX1BPU0lYLCBNT0RFX1dJTiB9IGZyb20gJy4vcGF0aC1wYXJzZXInXG5cbmNvbnN0IFNFUF9QT1NJWCA9ICcvJ1xuY29uc3QgU0VQX1dJTiA9ICdcXFxcJ1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge01PREVfUE9TSVh8TU9ERV9XSU59IG1vZGVcbiAqXG4gKiBAcmV0dXJuIEFycmF5IG9mIGV2ZXJ5IGl0ZW0gb2YgdGhlIHBhdGhcbiAqXG4gKiBAdGhyb3dzIEVycm9yIHdoZW4gdGhlIG1vZGUgaXMgaW52YWxpZFxuICovXG5leHBvcnQgZGVmYXVsdCAocGF0aCA9IFNFUF9QT1NJWCwgbW9kZSA9IE1PREVfUE9TSVgpID0+IHtcbiAgaWYgKG1vZGUgIT09IE1PREVfUE9TSVggJiYgbW9kZSAhPT0gTU9ERV9XSU4pIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtb2RlJylcblxuICBpZiAocGF0aC5sZW5ndGggPT09IDAgfHxcbiAgICAgIChtb2RlID09PSBNT0RFX1BPU0lYICYmIHBhdGggPT09IFNFUF9QT1NJWCkgfHxcbiAgICAgIChtb2RlID09PSBNT0RFX1dJTiAmJiBwYXRoID09PSBTRVBfV0lOKSkge1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgY29uc3QgcGF0aFBhcnNlciA9IGdldFBhdGhQYXJzZXIobW9kZSlcblxuICBsZXQgbm9ybWFsaXplZFBhdGggPSBwYXRoUGFyc2VyLm5vcm1hbGl6ZShwYXRoKVxuICBpZiAobW9kZSA9PT0gTU9ERV9XSU4gJiYgbm9ybWFsaXplZFBhdGguaW5kZXhPZihTRVBfUE9TSVgpICE9PSAtMSkge1xuICAgIG5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplZFBhdGgucmVwbGFjZSgvXFwvL2csIFNFUF9XSU4pXG4gIH0gZWxzZSBpZiAobW9kZSA9PT0gTU9ERV9QT1NJWCAmJiBub3JtYWxpemVkUGF0aC5pbmRleE9mKFNFUF9XSU4pICE9PSAtMSkge1xuICAgIG5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplZFBhdGgucmVwbGFjZSgvXFxcXC9nLCBTRVBfUE9TSVgpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIG5vcm1hbGl6ZWRQYXRoLmluZGV4T2YocGF0aFBhcnNlci5zZXApID09PSAwXG4gICAgICA/IG5vcm1hbGl6ZWRQYXRoLnN1YnN0cigxKVxuICAgICAgOiBub3JtYWxpemVkUGF0aFxuICApLnNwbGl0KHBhdGhQYXJzZXIuc2VwKVxufVxuIiwiaW1wb3J0IHBhdGhNb2R1bGUgZnJvbSAncGF0aCdcblxuZXhwb3J0IGNvbnN0IE1PREVfUE9TSVggPSAnTU9ERV9QT1NJWCdcbmV4cG9ydCBjb25zdCBNT0RFX1dJTiA9ICdNT0RFX1dJTidcblxuLyoqXG4gKiBAcGFyYW0ge01PREVfUE9TSVh8TU9ERV9XSU59IG1vZGVcbiAqXG4gKiBAcmV0dXJuIE5vZGUgbW9kdWxlICdwYXRoJ1xuICpcbiAqIEB0aHJvd3MgRXJyb3Igd2hlbiB0aGUgbW9kZSBpcyBpbnZhbGlkXG4gKi9cbmV4cG9ydCBkZWZhdWx0IChtb2RlID0gTU9ERV9QT1NJWCkgPT4ge1xuICBpZiAobW9kZSA9PT0gTU9ERV9QT1NJWCkgcmV0dXJuIHsgLi4ucGF0aE1vZHVsZSwgc2VwOiAnLycgfVxuICBlbHNlIGlmIChtb2RlID09PSBNT0RFX1dJTikgcmV0dXJuIHsgLi4ucGF0aE1vZHVsZSwgc2VwOiAnXFxcXCcgfVxuICBlbHNlIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtb2RlJylcbn1cbiIsImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cydcbmltcG9ydCBVc2VyRmlsZSBmcm9tICcuL3VzZXItZmlsZSdcblxuLy8gQ29udmVyc2lvbiBjb25zdGFudHNcbmNvbnN0IEJZVEUgPSAxXG5jb25zdCBLSUxPQllURSA9IEJZVEUgKiAxMDI0XG5cbmNsYXNzIFVzZXJGaWxlUmVhZGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgc3RhdGljIGdldCBub3RTdXBwb3J0ZWQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRmVhdHVyZSBub3Qgc3VwcG9ydGVkJylcbiAgfVxuXG4gIGNvbnN0cnVjdG9yICh1c2VyRmlsZSwgY2h1bmtTaXplID0gKEtJTE9CWVRFICogMTYpKSB7XG4gICAgaWYgKCEodXNlckZpbGUgaW5zdGFuY2VvZiBVc2VyRmlsZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgZmlsZScpXG5cbiAgICBzdXBlcigpXG5cbiAgICAvLyBTdG9yZSB0aGUgdXNlciBmaWxlXG4gICAgdGhpcy5fX3VzZXJGaWxlID0gdXNlckZpbGVcblxuICAgIC8vIENodW5rXG4gICAgdGhpcy5jaHVua1NpemUgPSBjaHVua1NpemVcblxuICAgIC8vIENoZWNrIHRoZSBzbGljZSBtZXRob2RcbiAgICBpZiAoIXRoaXMuX191c2VyRmlsZS5zbGljZSkgVXNlckZpbGVSZWFkZXIubm90U3VwcG9ydGVkKClcbiAgfVxuXG4gIC8vIENodW5rIChpbiBieXRlcylcbiAgY2hlY2tDaHVua1NpemUgKGNodW5rU2l6ZSkge1xuICAgIGlmICh0eXBlb2YgY2h1bmtTaXplICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGNodW5rIHNpemUgc2hvdWxkIGJlIGEgbnVtYmVyJylcbiAgICB9IGVsc2UgaWYgKGNodW5rU2l6ZSA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIGNodW5rIHNpemUgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwJylcbiAgICB9XG4gIH1cblxuICBzZXQgY2h1bmtTaXplIChjaHVua1NpemUpIHtcbiAgICB0aGlzLmNoZWNrQ2h1bmtTaXplKGNodW5rU2l6ZSlcblxuICAgIHRoaXMuX19jaHVua1NpemUgPSBjaHVua1NpemVcblxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBnZXQgY2h1bmtTaXplICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2NodW5rU2l6ZVxuICB9XG5cbiAgLy8gT2Zmc2V0IChpbiBieXRlcylcbiAgY2hlY2tPZmZzZXQgKG9mZnNldCkge1xuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIG9mZnNldCBzaG91bGQgYmUgYSBudW1iZXInKVxuICAgIH0gZWxzZSBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSBvZmZzZXQgc2hvdWxkIGJlIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiAwJylcbiAgICB9XG4gIH1cblxuICAvLyBCbG9iIHNsaWNlIG1ldGhvZFxuICBzbGljZSAoc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiB0aGlzLl9fdXNlckZpbGUuc2xpY2Uoc3RhcnQsIGVuZClcbiAgfVxuXG4gIGVycm9ySGFuZGxlciAoZXZlbnQpIHtcbiAgICB2YXIgZXJyb3IgPSBldmVudC50YXJnZXQuZXJyb3JcblxuICAgIHN3aXRjaCAoZXJyb3IuY29kZSkge1xuICAgICAgY2FzZSBlcnJvci5OT1RfRk9VTkRfRVJSOlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpbGUgTm90IEZvdW5kJylcbiAgICAgIGNhc2UgZXJyb3IuTk9UX1JFQURBQkxFX0VSUjpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlIGlzIG5vdCByZWFkYWJsZScpXG4gICAgICBjYXNlIGVycm9yLkFCT1JUX0VSUjpcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQW4gZXJyb3Igb2NjdXJyZWQgcmVhZGluZyB0aGlzIGZpbGUnKVxuICAgIH1cbiAgfVxuXG4gIHJlYWQgKG9mZnNldCwgY2h1bmtTaXplKSB7XG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgb2Zmc2V0IGlzIG5vdCBkZWZpbmVkJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjaHVua1NpemUgPT09ICd1bmRlZmluZWQnKSBjaHVua1NpemUgPSB0aGlzLmNodW5rU2l6ZVxuXG4gICAgdGhpcy5jaGVja09mZnNldChvZmZzZXQpXG4gICAgdGhpcy5jaGVja0NodW5rU2l6ZShjaHVua1NpemUpXG5cbiAgICB2YXIgc2l6ZSA9IHRoaXMuX191c2VyRmlsZS5zaXplXG5cbiAgICBpZiAob2Zmc2V0ID49IHNpemUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignT2Zmc2V0IGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiBmaWxlIHNpemUnKVxuICAgIH1cblxuICAgIGlmICgob2Zmc2V0ICsgY2h1bmtTaXplKSA+IHNpemUpIGNodW5rU2l6ZSA9IHNpemUgLSBvZmZzZXRcblxuICAgIGNvbnN0IHN0YXJ0ID0gb2Zmc2V0XG4gICAgY29uc3QgZW5kID0gb2Zmc2V0ICsgY2h1bmtTaXplXG4gICAgY29uc3QgYmxvYiA9IHRoaXMuc2xpY2Uoc3RhcnQsIGVuZClcbiAgICBsZXQgcmVhZGVyID0gbnVsbFxuICAgIGxldCByZWFkZXJUeXBlID0gbnVsbFxuICAgIGxldCBwcm9jZXNzU2xpY2UgPSAoc2xpY2UpID0+IHtcbiAgICAgIHRoaXMub2Zmc2V0ICs9IGNodW5rU2l6ZVxuICAgICAgdGhpcy5lbWl0KCdyZWFkJywgc2xpY2UsIG9mZnNldCwgY2h1bmtTaXplKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpXG4gICAgICByZWFkZXJUeXBlID0gJ0ZpbGVSZWFkZXInXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEZpbGVSZWFkZXIgbm90IHN1cHBvcnRlZCBpbiBXVyAodGhhbmtzLCBGaXJlZm94KVxuICAgIH1cbiAgICBpZiAoIXJlYWRlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVhZGVyID0gbmV3IHdpbmRvdy5GaWxlUmVhZGVyU3luYygpXG4gICAgICAgIHJlYWRlclR5cGUgPSAnRmlsZVJlYWRlclN5bmMnXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBGaWxlUmVhZGVyU3luYyBub3Qgc3VwcG9ydGVkICguLi4uLi4uLilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWxlUmVhZGVyIG9yIEZpbGVSZWFkZXJTeW5jIG5vdCBzdXBwb3J0ZWQnKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyZWFkZXJUeXBlICYmIHJlYWRlclR5cGUgPT09ICdGaWxlUmVhZGVyJykge1xuICAgICAgcHJvY2Vzc1NsaWNlLmJpbmQodGhpcylcbiAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgbGV0IHRhcmdldCA9IGV2ZW50LnRhcmdldFxuXG4gICAgICAgIGlmICh0YXJnZXQucmVhZHlTdGF0ZSAhPT0gRmlsZVJlYWRlci5ET05FKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciByZWFkaW5nIHRoZSBmaWxlJylcbiAgICAgICAgfVxuXG4gICAgICAgIHByb2Nlc3NTbGljZSh0YXJnZXQucmVzdWx0KVxuICAgICAgfVxuICAgICAgcmVhZGVyLm9uZXJyb3IgPSB0aGlzLmVycm9ySGFuZGxlci5iaW5kKHRoaXMpXG4gICAgICByZWFkZXIucmVhZEFzQXJyYXlCdWZmZXIoYmxvYilcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHNsaWNlID0gcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpXG4gICAgICBwcm9jZXNzU2xpY2Uoc2xpY2UpXG4gICAgfVxuICB9XG5cbiAgcmVhZEZyb20gKG9mZnNldCkge1xuICAgIHRoaXMucmVhZChvZmZzZXQpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVXNlckZpbGVSZWFkZXJcbiIsImltcG9ydCBGaWxlSXRlbSBmcm9tICcuL2ZpbGUtaXRlbSdcbmltcG9ydCBEaXJJdGVtIGZyb20gJy4vZGlyLWl0ZW0nXG5cbmNsYXNzIFVzZXJGaWxlIGV4dGVuZHMgRmlsZUl0ZW0ge1xuICBzdGF0aWMgZ2V0IGlzU3VwcG9ydGVkICgpIHtcbiAgICByZXR1cm4gKHdpbmRvdyAmJiB3aW5kb3cuRmlsZSAmJiB3aW5kb3cuRmlsZVJlYWRlciAmJiB3aW5kb3cuRmlsZUxpc3QgJiYgd2luZG93LkJsb2IpXG4gIH1cblxuICBjb25zdHJ1Y3RvciAoZmlsZUhhbmRsZSwgZGVzdCwgdHlwZU9TKSB7XG4gICAgLy8gaWYgKCFVc2VyRmlsZS5pc1N1cHBvcnRlZClcbiAgICAvLyAgIHRocm93IG5ldyBFcnJvcignRmVhdHVyZSBub3Qgc3VwcG9ydGVkJylcbiAgICBpZiAoIShmaWxlSGFuZGxlIGluc3RhbmNlb2YgRmlsZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgZmlsZSBoYW5kbGVyJylcbiAgICB9XG5cbiAgICBzdXBlcihkZXN0LCB7XG4gICAgICBzaXplOiBmaWxlSGFuZGxlLnNpemUsXG4gICAgICBtaW1lVHlwZTogZmlsZUhhbmRsZS50eXBlLFxuICAgICAgbGFzdE1vZGlmaWNhdGlvbjogZmlsZUhhbmRsZS5sYXN0TW9kaWZpZWRcbiAgICB9LCB0eXBlT1MpXG5cbiAgICAvLyBGaXggdGhlIHBhdGggbm93IHdlIGhhdmUgdGhlIG9zIHR5cGVcbiAgICBjb25zdCBkaXIgPSBuZXcgRGlySXRlbShkZXN0LCB7fSwgdHlwZU9TKVxuICAgIHRoaXMucGF0aCA9IChkaXIucGF0aC5sZW5ndGggPiAwKVxuICAgICAgPyBkaXIucGF0aCArIGRpci5zZXBhcmF0b3IgKyBmaWxlSGFuZGxlLm5hbWVcbiAgICAgIDogZmlsZUhhbmRsZS5uYW1lXG5cbiAgICAvLyBTdG9yZSB0aGUgZmlsZSBoYW5kbGVcbiAgICB0aGlzLmZpbGVIYW5kbGUgPSBmaWxlSGFuZGxlXG4gIH1cblxuICBzbGljZSAoc3RhcnQsIGVuZCkge1xuICAgIHZhciBibG9iID0gbnVsbFxuICAgIGlmICgnc2xpY2UnIGluIHRoaXMuZmlsZUhhbmRsZSkge1xuICAgICAgYmxvYiA9IHRoaXMuZmlsZUhhbmRsZS5zbGljZShzdGFydCwgZW5kKVxuICAgIH0gZWxzZSBpZiAoJ3dlYmtpdFNsaWNlJyBpbiB0aGlzLmZpbGVIYW5kbGUpIHtcbiAgICAgIGJsb2IgPSB0aGlzLmZpbGVIYW5kbGUud2Via2l0U2xpY2Uoc3RhcnQsIGVuZClcbiAgICB9IGVsc2UgaWYgKCdtb3pTbGljZScgaW4gdGhpcy5maWxlSGFuZGxlKSB7XG4gICAgICBibG9iID0gdGhpcy5maWxlSGFuZGxlLm1velNsaWNlKHN0YXJ0LCBlbmQpXG4gICAgfVxuXG4gICAgcmV0dXJuIGJsb2JcbiAgfVxuXG4gIGdldCBpc0Nsb3NlZCAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZUhhbmRsZS5pc0Nsb3NlZFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFVzZXJGaWxlXG4iLCJjbGFzcyBQcm9jZXNzIHtcbiAgY29uc3RydWN0b3IgKHByb3BzID0ge30pIHtcbiAgICB0aGlzLlBJRCA9IHByb3BzLlBJRFxuICAgIHRoaXMudXNlciA9IHByb3BzLnVzZXJcbiAgICB0aGlzLm5hbWUgPSBwcm9wcy5uYW1lXG4gICAgdGhpcy5DUFUgPSBwcm9wcy5DUFVcbiAgICB0aGlzLlJBTSA9IHByb3BzLlJBTVxuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBwcm9wcy5kZXNjcmlwdGlvblxuICB9XG5cbiAgc2V0IFBJRCAoUElEKSB7XG4gICAgaWYgKHR5cGVvZiBQSUQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgUElEIG9mIHRoZSBwcm9jZXNzIGlzIHJlcXVpcmVkJylcbiAgICB9XG4gICAgaWYgKE51bWJlci5pc05hTihQSUQpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgUElEIG9mIHRoZSBwcm9jZXNzIHNob3VsZCBiZSBhIG51bWJlcicpXG4gICAgfVxuICAgIHRoaXMuX1BJRCA9IFBJRFxuICB9XG4gIGdldCBQSUQgKCkge1xuICAgIHJldHVybiB0aGlzLl9QSURcbiAgfVxuXG4gIHNldCB1c2VyICh1c2VyID0gJycpIHtcbiAgICBpZiAodHlwZW9mIHVzZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdXNlciBvZiB0aGUgcHJvY2VzcyBzaG91bGQgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICB0aGlzLl91c2VyID0gdXNlclxuICB9XG4gIGdldCB1c2VyICgpIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlclxuICB9XG5cbiAgc2V0IG5hbWUgKG5hbWUgPSAnJykge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBuYW1lIG9mIHRoZSBwcm9jZXNzIGlzIHJlcXVpcmVkJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIG5hbWUgb2YgdGhlIHByb2Nlc3Mgc2hvdWxkIGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgdGhpcy5fbmFtZSA9IG5hbWVcbiAgfVxuICBnZXQgbmFtZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWVcbiAgfVxuXG4gIHNldCBDUFUgKENQVSA9IDApIHtcbiAgICB0aGlzLl9DUFUgPSAhTnVtYmVyLmlzTmFOKENQVSlcbiAgICAgID8gTnVtYmVyKENQVS50b0ZpeGVkKDEpKVxuICAgICAgOiAwXG4gIH1cbiAgZ2V0IENQVSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX0NQVVxuICB9XG5cbiAgc2V0IFJBTSAoUkFNID0gMCkge1xuICAgIHRoaXMuX1JBTSA9ICFOdW1iZXIuaXNOYU4oUkFNKVxuICAgICAgPyBOdW1iZXIoUkFNKVxuICAgICAgOiAwXG4gIH1cbiAgZ2V0IFJBTSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX1JBTVxuICB9XG5cbiAgc2V0IGRlc2NyaXB0aW9uIChkZXNjcmlwdGlvbiA9ICcnKSB7XG4gICAgaWYgKHR5cGVvZiBkZXNjcmlwdGlvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvY2VzcyBzaG91bGQgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uXG4gIH1cbiAgZ2V0IGRlc2NyaXB0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVzY3JpcHRpb25cbiAgfVxuXG4gIHN0YXRpYyBnZXQgc29ydEhhbmRsZXIgKCkge1xuICAgIHJldHVybiAocHJvcCwgb3JkZXIpID0+IHtcbiAgICAgIC8vIE9ubHkgQVNDIG9yIERFU0MgYXJlIHN1cHBvcnRlZFxuICAgICAgaWYgKG9yZGVyICE9PSAnQVNDJyAmJiBvcmRlciAhPT0gJ0RFU0MnKSBvcmRlciA9ICdBU0MnXG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgbGV0IHJlcyA9IDBcbiAgICAgICAgY29uc3QgdmFsQSA9ICh0eXBlb2YgYVtwcm9wXSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgPyBhW3Byb3BdLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICA6IGFbcHJvcF1cbiAgICAgICAgY29uc3QgdmFsQiA9ICh0eXBlb2YgYltwcm9wXSA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgPyBiW3Byb3BdLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICA6IGJbcHJvcF1cblxuICAgICAgICBpZiAodmFsQSA9PT0gdmFsQikgcmVzID0gMFxuICAgICAgICBpZiAob3JkZXIgPT09ICdBU0MnKSByZXMgPSB2YWxBID4gdmFsQiA/IDEgOiAtMVxuICAgICAgICBlbHNlIGlmIChvcmRlciA9PT0gJ0RFU0MnKSByZXMgPSB2YWxBIDwgdmFsQiA/IDEgOiAtMVxuXG4gICAgICAgIHJldHVybiByZXNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IGlkZW50aWZpZXIgKCkge1xuICAgIHJldHVybiAoUElELCBuYW1lKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIFBJRCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHByb2Nlc3MgUElEIHNob3VsZCBiZSBhIG51bWJlcicpXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBwcm9jZXNzIG5hbWUgaXMgbm90IGEgc3RyaW5nJylcbiAgICAgIH1cbiAgICAgIHJldHVybiBTeW1ib2wuZm9yKGBbJHtQSUR9XSAke25hbWV9YClcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IGRlZmF1dFNvcnRPYmplY3QgKCkge1xuICAgIHJldHVybiBuZXcgTWFwKClcbiAgICAgIC5zZXQoJ1BJRCcsICcnKVxuICAgICAgLnNldCgndXNlcicsICcnKVxuICAgICAgLnNldCgnbmFtZScsICcnKVxuICAgICAgLnNldCgnQ1BVJywgJycpXG4gICAgICAuc2V0KCdSQU0nLCAnJylcbiAgICAgIC5zZXQoJ2Rlc2NyaXB0aW9uJywgJycpXG4gIH1cblxuICBzdGF0aWMgZ2V0IGRlZmF1dEZpbHRlck9iamVjdCAoKSB7XG4gICAgcmV0dXJuIG5ldyBNYXAoKVxuICAgICAgLnNldCgnUElEJywgJycpXG4gICAgICAuc2V0KCd1c2VyJywgJycpXG4gICAgICAuc2V0KCduYW1lJywgJycpXG4gICAgICAuc2V0KCdDUFUnLCAnJylcbiAgICAgIC5zZXQoJ1JBTScsICcnKVxuICAgICAgLnNldCgnZGVzY3JpcHRpb24nLCAnJylcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQcm9jZXNzXG4iLCIvLyBzcmMvcHJvY2Vzc2VzLW1hbmFnZXIvYWN0aW9ucy9pbmRleC5qc1xuXG5pbXBvcnQgQXBwRGlzcGF0Y2hlciBmcm9tICcuLi8uLi9kaXNwYXRjaGVyJ1xuaW1wb3J0IFByb2Nlc3Nlc0NvbnN0YW50cyBmcm9tICcuLi9jb25zdGFudHMnXG5pbXBvcnQgUmVtb3RlIGZyb20gJy4uLy4uL2NvbW1vbi9saWIvcmVtb3RlJ1xuaW1wb3J0IHsgUFJPVE8gfSBmcm9tICcuLi8uLi9jb25zdGFudHMnXG5cbmNvbnN0IFByb2Nlc3Nlc0FjdGlvbnMgPSB7XG4gIC8vIC0tIFJlbW90ZSAtLSAvL1xuXG4gIHJlcXVlc3RMaXN0OiAoKSA9PiB7XG4gICAgUmVtb3RlLnNlbmQoe1xuICAgICAgcHJvdG86IFBST1RPLlBST0NFU1NFUyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgYWN0aW9uOiAnbGlzdCdcbiAgICAgIH1cbiAgICB9KVxuICB9LFxuXG4gIHJlcXVlc3RTdG9wOiAoUElELCBuYW1lKSA9PiB7XG4gICAgUmVtb3RlLnNlbmQoe1xuICAgICAgcHJvdG86IFBST1RPLlBST0NFU1NFUyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgYWN0aW9uOiAnc3RvcCcsXG4gICAgICAgIHBpZDogUElELFxuICAgICAgICBwcm9jZXNzX25hbWU6IG5hbWVcbiAgICAgIH1cbiAgICB9KVxuICB9LFxuXG4gIC8vIC0tIExvY2FsIC0tIC8vXG5cbiAgaW5pdGlhbGl6ZVN0b3JlOiAoKSA9PiB7XG4gICAgQXBwRGlzcGF0Y2hlci5kaXNwYXRjaCh7XG4gICAgICBhY3Rpb25UeXBlOiBQcm9jZXNzZXNDb25zdGFudHMuSU5JVF9QUk9DRVNTRVNfU1RPUkVcbiAgICB9KVxuICB9LFxuXG4gIGZpbHRlcjogKHByb3AsIGZpbHRlcikgPT4ge1xuICAgIEFwcERpc3BhdGNoZXIuZGlzcGF0Y2goe1xuICAgICAgYWN0aW9uVHlwZTogUHJvY2Vzc2VzQ29uc3RhbnRzLkZJTFRFUl9QUk9DRVNTRVMsXG4gICAgICBwcm9wOiBwcm9wLFxuICAgICAgZmlsdGVyOiBmaWx0ZXJcbiAgICB9KVxuICB9LFxuXG4gIHNvcnQ6IChwcm9wLCBvcmRlcikgPT4ge1xuICAgIEFwcERpc3BhdGNoZXIuZGlzcGF0Y2goe1xuICAgICAgYWN0aW9uVHlwZTogUHJvY2Vzc2VzQ29uc3RhbnRzLlNPUlRfUFJPQ0VTU0VTLFxuICAgICAgcHJvcDogcHJvcCxcbiAgICAgIG9yZGVyOiBvcmRlclxuICAgIH0pXG4gIH0sXG5cbiAgZmV0Y2g6IChsaXN0LCBzeXN0ZW1JbmZvLCB0aW1lc3RhbXApID0+IHtcbiAgICBBcHBEaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIGFjdGlvblR5cGU6IFByb2Nlc3Nlc0NvbnN0YW50cy5GRVRDSF9QUk9DRVNTRVMsXG4gICAgICBsaXN0OiBsaXN0LFxuICAgICAgc3lzdGVtSW5mbzogc3lzdGVtSW5mbyxcbiAgICAgIHRpbWVzdGFtcDogdGltZXN0YW1wXG4gICAgfSlcbiAgfSxcblxuICBzZWxlY3Q6IChQSUQsIG5hbWUpID0+IHtcbiAgICBBcHBEaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIGFjdGlvblR5cGU6IFByb2Nlc3Nlc0NvbnN0YW50cy5TRUxFQ1RfUFJPQ0VTUyxcbiAgICAgIFBJRDogUElELFxuICAgICAgbmFtZTogbmFtZVxuICAgIH0pXG4gIH0sXG5cbiAgY2xlYW5TZWxlY3RlZDogKCkgPT4ge1xuICAgIEFwcERpc3BhdGNoZXIuZGlzcGF0Y2goe1xuICAgICAgYWN0aW9uVHlwZTogUHJvY2Vzc2VzQ29uc3RhbnRzLkNMRUFOX1NFTEVDVEVEX1BST0NFU1NcbiAgICB9KVxuICB9LFxuXG4gIHN0b3A6IChQSUQsIG5hbWUpID0+IHtcbiAgICBBcHBEaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIGFjdGlvblR5cGU6IFByb2Nlc3Nlc0NvbnN0YW50cy5TVE9QX1BST0NFU1MsXG4gICAgICBQSUQ6IFBJRCxcbiAgICAgIG5hbWU6IG5hbWVcbiAgICB9KVxuICB9LFxuXG4gIHJlbW92ZTogKFBJRCwgbmFtZSkgPT4ge1xuICAgIEFwcERpc3BhdGNoZXIuZGlzcGF0Y2goe1xuICAgICAgYWN0aW9uVHlwZTogUHJvY2Vzc2VzQ29uc3RhbnRzLlJFTU9WRV9QUk9DRVNTLFxuICAgICAgUElEOiBQSUQsXG4gICAgICBuYW1lOiBuYW1lXG4gICAgfSlcbiAgfSxcblxuICBhZGRUb1N0b3BwaW5nOiAoUElELCBuYW1lKSA9PiB7XG4gICAgQXBwRGlzcGF0Y2hlci5kaXNwYXRjaCh7XG4gICAgICBhY3Rpb25UeXBlOiBQcm9jZXNzZXNDb25zdGFudHMuQUREX1RPX1NUT1BQSU5HLFxuICAgICAgUElEOiBQSUQsXG4gICAgICBuYW1lOiBuYW1lXG4gICAgfSlcbiAgfSxcblxuICByZW1vdmVGcm9tU3RvcHBpbmc6IChQSUQsIG5hbWUpID0+IHtcbiAgICBBcHBEaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIGFjdGlvblR5cGU6IFByb2Nlc3Nlc0NvbnN0YW50cy5SRU1PVkVfRlJPTV9TVE9QUElORyxcbiAgICAgIFBJRDogUElELFxuICAgICAgbmFtZTogbmFtZVxuICAgIH0pXG4gIH0sXG5cbiAgY2hhbmdlUGVyaW9kOiAocGVyaW9kKSA9PiB7XG4gICAgQXBwRGlzcGF0Y2hlci5kaXNwYXRjaCh7XG4gICAgICBhY3Rpb25UeXBlOiBQcm9jZXNzZXNDb25zdGFudHMuQ0hBTkdFX1BFUklPRCxcbiAgICAgIHBlcmlvZDogcGVyaW9kXG4gICAgfSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBQcm9jZXNzZXNBY3Rpb25zXG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQge1xuICBCdXR0b24sIEdseXBoaWNvbiwgT3ZlcmxheVRyaWdnZXIsIFRvb2x0aXAsIEZvcm1Db250cm9sXG59IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcbmltcG9ydCB7IGluamVjdEludGwgfSBmcm9tICdyZWFjdC1pbnRsJ1xuXG5pbXBvcnQgUHJvY2VzcyBmcm9tICcuLi9Qcm9jZXNzJ1xuaW1wb3J0IFByb2Nlc3Nlc0FjdGlvbnMgZnJvbSAnLi4vYWN0aW9ucydcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4uLy4uL2NvbW1vbi9jb21wb25lbnRzL0Jhc2VDb21wb25lbnQnXG5pbXBvcnQgUmVmcmVzaEJ1dHRvbiBmcm9tICcuLi8uLi9jb21tb24vY29tcG9uZW50cy9yZWZyZXNoLWJ1dHRvbidcblxuY2xhc3MgUHJvY2Vzc2VzQnV0dG9ucyBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIC8vIE1lc3NhZ2VzIGRlZmluaXRpb25zXG4gICAgdGhpcy5tZXNzYWdlcyA9IHtcbiAgICAgIFhfU2Vjb25kczoge1xuICAgICAgICBpZDogJ1hfU2Vjb25kcycsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAne25TZWNvbmRzLCBwbHVyYWwsID0we05ldmVyfSBvbmV7IyBzZWNvbmR9IG90aGVyeyMgc2Vjb25kc319JyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdPbmx5IHRyYW5zbGF0ZSBcIk5ldmVyXCIsIFwic2Vjb25kXCIgYW5kIFwic2Vjb25kc1wiJ1xuICAgICAgfSxcbiAgICAgIFhfTWludXRlczoge1xuICAgICAgICBpZDogJ1hfTWludXRlcycsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAne25NaW51dGVzLCBwbHVyYWwsID0we05ldmVyfSBvbmV7IyBtaW51dGV9IG90aGVyeyMgbWludXRlc319JyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdPbmx5IHRyYW5zbGF0ZSBcIk5ldmVyXCIsIFwibWludXRlXCIgYW5kIFwibWludXRlc1wiJ1xuICAgICAgfSxcbiAgICAgIHJlZnJlc2hQcm9jZXNzZXM6IHtcbiAgICAgICAgaWQ6ICdyZWZyZXNoUHJvY2Vzc2VzJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdSZWZyZXNoIHByb2Nlc3NlcydcbiAgICAgIH0sXG4gICAgICBzdG9wUHJvY2Vzczoge1xuICAgICAgICBpZDogJ3N0b3BQcm9jZXNzJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdTdG9wIHByb2Nlc3MnXG4gICAgICB9LFxuICAgICAgY2xpY2tPbkFQcm9jZXNzOiB7XG4gICAgICAgIGlkOiAnY2xpY2tPbkFQcm9jZXNzJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdDbGljayBvbiBhIHByb2Nlc3MnXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5nZXRQZXJpb2RzID0gKGRlZmluZU1lc3NhZ2UpID0+IHtcbiAgICAgIHZhciBwZXJpb2RzID0gbmV3IE1hcCgpXG4gICAgICBwZXJpb2RzLnNldCgwLCBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuWF9TZWNvbmRzLCB7IG5TZWNvbmRzOiAwIH0pKVxuICAgICAgcGVyaW9kcy5zZXQoNSwgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLlhfU2Vjb25kcywgeyBuU2Vjb25kczogNSB9KSlcbiAgICAgIHBlcmlvZHMuc2V0KDEwLCBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuWF9TZWNvbmRzLCB7IG5TZWNvbmRzOiAxMCB9KSlcbiAgICAgIHBlcmlvZHMuc2V0KDE1LCBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuWF9TZWNvbmRzLCB7IG5TZWNvbmRzOiAxNSB9KSlcbiAgICAgIHBlcmlvZHMuc2V0KDMwLCBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuWF9TZWNvbmRzLCB7IG5TZWNvbmRzOiAzMCB9KSlcbiAgICAgIHBlcmlvZHMuc2V0KDYwLCBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuWF9NaW51dGVzLCB7IG5NaW51dGVzOiAxIH0pKVxuXG4gICAgICByZXR1cm4gcGVyaW9kc1xuICAgIH1cbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3QgZGVmaW5lTWVzc2FnZSA9IHRoaXMucHJvcHMuaW50bC5mb3JtYXRNZXNzYWdlXG5cbiAgICBsZXQgcHJvY2Vzc1RleHQgPSBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuY2xpY2tPbkFQcm9jZXNzKVxuICAgIGxldCBidXR0b25EaXNhYmxlZCA9IHRydWVcblxuICAgIGlmICh0aGlzLnByb3BzLnByb2Nlc3MgaW5zdGFuY2VvZiBQcm9jZXNzKSB7XG4gICAgICBwcm9jZXNzVGV4dCA9IHRoaXMucHJvcHMucHJvY2Vzcy5uYW1lXG4gICAgICBidXR0b25EaXNhYmxlZCA9ICEhdGhpcy5wcm9wcy5wcm9jZXNzLnN0b3BwaW5nXG4gICAgfVxuXG4gICAgY29uc3QgdG9vbHRpcCA9IChpZCwgbWVzc2FnZSkgPT4gPFRvb2x0aXAgaWQ9e2lkfT57bWVzc2FnZX08L1Rvb2x0aXA+XG4gICAgY29uc3QgaGFuZGxlUmVmcmVzaCA9ICgpID0+IFByb2Nlc3Nlc0FjdGlvbnMucmVxdWVzdExpc3QoKVxuICAgIGNvbnN0IGhhbmRsZVBlcmlvZENoYW5nZSA9IChwZXJpb2QpID0+IHtcbiAgICAgIGlmICh0aGlzLnByb3BzLm9uUGVyaW9kQ2hhbmdlKSB7XG4gICAgICAgIFByb2Nlc3Nlc0FjdGlvbnMuY2hhbmdlUGVyaW9kKHBlcmlvZClcbiAgICAgICAgdGhpcy5wcm9wcy5vblBlcmlvZENoYW5nZShwZXJpb2QpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaGFuZGxlQnV0dG9uQ2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIGlmICh0aGlzLnByb3BzLnByb2Nlc3MgaW5zdGFuY2VvZiBQcm9jZXNzKSB7XG4gICAgICAgIC8vIEFkZCB0aGUgcHJvY2VzcyB0byBhIGxpc3Qgb2YgcHJvY2Vzc2VzIGluIHN0b3BwaW5nIHN0YXRlXG4gICAgICAgIFByb2Nlc3Nlc0FjdGlvbnMuYWRkVG9TdG9wcGluZyh0aGlzLnByb3BzLnByb2Nlc3MuUElELCB0aGlzLnByb3BzLnByb2Nlc3MubmFtZSlcbiAgICAgICAgLy8gU2VuZCBhIHRhc2sgdG8gdGhlIHJlbW90ZSB0byBzdG9wIHRoZSBwcm9jZXNzXG4gICAgICAgIFByb2Nlc3Nlc0FjdGlvbnMucmVxdWVzdFN0b3AodGhpcy5wcm9wcy5wcm9jZXNzLlBJRCwgdGhpcy5wcm9wcy5wcm9jZXNzLm5hbWUpXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgaWQ9J3Byb2Nlc3Nlcy1idXR0b25zJz5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J3Jvdyc+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbC1tZC0zIHRleHQtbGVmdCc+XG4gICAgICAgICAgICA8UmVmcmVzaEJ1dHRvblxuICAgICAgICAgICAgICBsYXN0VXBkYXRlPXt0aGlzLnByb3BzLmxhc3RVcGRhdGV9XG4gICAgICAgICAgICAgIHBlcmlvZHM9e3RoaXMuZ2V0UGVyaW9kcyhkZWZpbmVNZXNzYWdlKX1cbiAgICAgICAgICAgICAgYWN0aXZlUGVyaW9kPXt0aGlzLnByb3BzLnVwZGF0ZVBlcmlvZH1cbiAgICAgICAgICAgICAgaGFuZGxlUmVmcmVzaD17aGFuZGxlUmVmcmVzaH1cbiAgICAgICAgICAgICAgaGFuZGxlUGVyaW9kQ2hhbmdlPXtoYW5kbGVQZXJpb2RDaGFuZ2V9PlxuICAgICAgICAgICAgICB7IGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy5yZWZyZXNoUHJvY2Vzc2VzKSB9XG4gICAgICAgICAgICA8L1JlZnJlc2hCdXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbC1tZC04IHRleHQtcmlnaHQnPlxuICAgICAgICAgICAgPEZvcm1Db250cm9sLlN0YXRpYz57IHByb2Nlc3NUZXh0IH08L0Zvcm1Db250cm9sLlN0YXRpYz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sLW1kLTEgdGV4dC1yaWdodCc+XG4gICAgICAgICAgICA8T3ZlcmxheVRyaWdnZXJcbiAgICAgICAgICAgICAgcGxhY2VtZW50PSdib3R0b20nXG4gICAgICAgICAgICAgIG92ZXJsYXk9e3Rvb2x0aXAoXG4gICAgICAgICAgICAgICAgJ3Byb2MtdG9vbHRpcC1zdG9wJyxcbiAgICAgICAgICAgICAgICBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuc3RvcFByb2Nlc3MpXG4gICAgICAgICAgICAgICl9PlxuICAgICAgICAgICAgICA8QnV0dG9uIGRpc2FibGVkPXtidXR0b25EaXNhYmxlZH0gb25DbGljaz17aGFuZGxlQnV0dG9uQ2xpY2t9PlxuICAgICAgICAgICAgICAgIDxHbHlwaGljb24gZ2x5cGg9J3N0b3AnIC8+XG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgPC9PdmVybGF5VHJpZ2dlcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cbn1cblxuUHJvY2Vzc2VzQnV0dG9ucy5wcm9wVHlwZXMgPSB7XG4gIHVwZGF0ZVBlcmlvZDogUmVhY3QuUHJvcFR5cGVzLm51bWJlcixcbiAgcHJvY2VzczogUmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUmVhY3QuUHJvcFR5cGVzLmluc3RhbmNlT2YoUHJvY2VzcyksIFJlYWN0LlByb3BUeXBlcy5ib29sXG4gIF0pLFxuICBsYXN0VXBkYXRlOiBSZWFjdC5Qcm9wVHlwZXMub25lT2ZUeXBlKFtcbiAgICBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLCBSZWFjdC5Qcm9wVHlwZXMuYm9vbFxuICBdKSxcbiAgb25QZXJpb2RDaGFuZ2U6IFJlYWN0LlByb3BUeXBlcy5mdW5jXG59XG5Qcm9jZXNzZXNCdXR0b25zLmRlZmF1bHRQcm9wcyA9IHtcbiAgdXBkYXRlUGVyaW9kOiAwLFxuICBwcm9jZXNzOiBmYWxzZSxcbiAgbGFzdFVwZGF0ZTogZmFsc2Vcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5qZWN0SW50bChQcm9jZXNzZXNCdXR0b25zKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCB9IGZyb20gJ3JlYWN0LWJvb3RzdHJhcCdcbmltcG9ydCB7IGluamVjdEludGwgfSBmcm9tICdyZWFjdC1pbnRsJ1xuXG5pbXBvcnQgUHJvY2Vzc2VzQWN0aW9ucyBmcm9tICcuLi9hY3Rpb25zJ1xuXG5jbGFzcyBQcm9jZXNzZXNGaWx0ZXIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIC8vIE1lc3NhZ2VzIGRlZmluaXRpb25zXG4gICAgdGhpcy5tZXNzYWdlcyA9IHtcbiAgICAgIGZpbHRlclByb2Nlc3M6IHtcbiAgICAgICAgaWQ6ICdmaWx0ZXJQcm9jZXNzJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdGaWx0ZXIgbGlzdCBieSBQSUQsIHVzZXIgb3IgbmFtZScsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnUGxhY2Vob2xkZXIgaW50byB0ZXh0Ym94IG9mIHByb2Nlc3NlcyBmaWx0ZXInXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCBkZWZpbmVNZXNzYWdlID0gdGhpcy5wcm9wcy5pbnRsLmZvcm1hdE1lc3NhZ2VcbiAgICByZXR1cm4gKFxuICAgICAgPEZvcm1Hcm91cD5cbiAgICAgICAgPEZvcm1Db250cm9sXG4gICAgICAgICAgY29tcG9uZW50Q2xhc3M9J2lucHV0J1xuICAgICAgICAgIHR5cGU9J3RleHQnXG4gICAgICAgICAgYnNTaXplPSdzbWFsbCdcbiAgICAgICAgICBwbGFjZWhvbGRlcj17ZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLmZpbHRlclByb2Nlc3MpfVxuICAgICAgICAgIHZhbHVlPXt0aGlzLnNlYXJjaFRleHR9XG4gICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgIFByb2Nlc3Nlc0FjdGlvbnMuZmlsdGVyKFsnUElEJywgJ3VzZXInLCAnbmFtZSddLCBlLnRhcmdldC52YWx1ZSlcbiAgICAgICAgICB9fSAvPlxuICAgICAgPC9Gb3JtR3JvdXA+XG4gICAgKVxuICB9XG5cbiAgZ2V0IHNlYXJjaFRleHQgKCkge1xuICAgIGNvbnN0IHsgZmlsdGVyIH0gPSB0aGlzLnByb3BzXG4gICAgY29uc3QgZmlsdGVyUElEID0gZmlsdGVyLmdldCgnUElEJylcbiAgICBjb25zdCBmaWx0ZXJVc2VyID0gZmlsdGVyLmdldCgndXNlcicpXG4gICAgY29uc3QgZmlsdGVyTmFtZSA9IGZpbHRlci5nZXQoJ25hbWUnKVxuXG4gICAgaWYgKHR5cGVvZiBmaWx0ZXJOYW1lICE9PSAndW5kZWZpbmVkJyAmJiBmaWx0ZXJOYW1lLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBmaWx0ZXJOYW1lXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZmlsdGVyVXNlciAhPT0gJ3VuZGVmaW5lZCcgJiYgZmlsdGVyVXNlci5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZmlsdGVyVXNlclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpbHRlclBJRCAhPT0gJ3VuZGVmaW5lZCcgJiYgZmlsdGVyUElELmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBmaWx0ZXJQSURcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnXG4gICAgfVxuICB9XG59XG5cblByb2Nlc3Nlc0ZpbHRlci5wcm9wVHlwZXMgPSB7XG4gIGZpbHRlcjogUmVhY3QuUHJvcFR5cGVzLmluc3RhbmNlT2YoTWFwKS5pc1JlcXVpcmVkLFxuICBpbnRsOiBSZWFjdC5Qcm9wVHlwZXMub2JqZWN0XG59XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdEludGwoUHJvY2Vzc2VzRmlsdGVyKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgaW5qZWN0SW50bCB9IGZyb20gJ3JlYWN0LWludGwnXG5pbXBvcnQgaHVtYW5pemUgZnJvbSAnaHVtYW5pemUnXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuLi8uLi9jb21tb24vY29tcG9uZW50cy9CYXNlQ29tcG9uZW50J1xuaW1wb3J0IHsgQXJlYUNoYXJ0IH0gZnJvbSAnLi4vLi4vY29tbW9uL2NvbXBvbmVudHMvcmVhY3QtY2hhcnRzJ1xuXG5jbGFzcyBQcm9jZXNzZXNHcmFwaHMgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICAvLyBNZXNzYWdlcyBkZWZpbml0aW9uc1xuICAgIHRoaXMubWVzc2FnZXMgPSB7XG4gICAgICBjcHU6IHtcbiAgICAgICAgaWQ6ICdjcHUnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0NQVSdcbiAgICAgIH0sXG4gICAgICByYW06IHtcbiAgICAgICAgaWQ6ICdyYW0nLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ1JBTSdcbiAgICAgIH0sXG4gICAgICB1c2VkOiB7XG4gICAgICAgIGlkOiAndXNlZCcsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnVXNlZCdcbiAgICAgIH0sXG4gICAgICB0b3RhbDoge1xuICAgICAgICBpZDogJ3RvdGFsJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdUb3RhbCdcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHsgZGF0YUNQVSwgZGF0YVJBTSwgdXNlZENQVSwgdXNlZFJBTSwgdG90YWxSQU0gfSA9IHRoaXMucHJvcHNcbiAgICBjb25zdCBkZWZpbmVNZXNzYWdlID0gdGhpcy5wcm9wcy5pbnRsLmZvcm1hdE1lc3NhZ2VcblxuICAgIGNvbnN0IGJhY2tncm91bmRDb2xvciA9ICdyZ2IoNDEsMTcwLDIwNCknXG4gICAgY29uc3QgY2hhcnRDb2xvciA9ICdyZ2IoMjU1LDE4OSwzMCknXG4gICAgY29uc3QgY2hhcnRTdHlsZSA9IHtcbiAgICAgIGJhY2tncm91bmQ6IGJhY2tncm91bmRDb2xvcixcbiAgICAgIGJvcmRlclJhZGl1czogJzVweCdcbiAgICB9XG4gICAgY29uc3QgY29tcG9uZW50U3R5bGUgPSB7XG4gICAgICBoZWlnaHQ6ICc4MHB4JyxcbiAgICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnXG4gICAgfVxuXG4gICAgLy8gRG8gbm90IHJlbmRlciB0aGUgdmlldyFcbiAgICBpZiAoIWRhdGFDUFUgfHwgIWRhdGFSQU0gfHwgIXRvdGFsUkFNIHx8XG4gICAgICAgIGRhdGFDUFUubGVuZ3RoIDw9IDAgfHwgZGF0YVJBTS5sZW5ndGggPD0gMCkgcmV0dXJuIG51bGxcblxuICAgIC8vIERvIG5vdCByZW5kZXIgdGhlIHZpZXchXG4gICAgaWYgKHR5cGVvZiB1c2VkQ1BVICE9PSAnbnVtYmVyJyB8fCB0eXBlb2YgdXNlZFJBTSAhPT0gJ251bWJlcicpIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4gKFxuICAgICAgPGRpdiBpZD0ncHJvY2Vzc2VzLWdyYXBocycgc3R5bGU9e2NvbXBvbmVudFN0eWxlfSBjbGFzc05hbWU9J2hpZGRlbi14cyc+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cnPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2wtbWQtNCB0ZXh0LWxlZnQnPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbC1tZC02IHRleHQtbGVmdCc+XG4gICAgICAgICAgICAgIDxoND57IGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy5jcHUpIH08L2g0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sLW1kLTYgdGV4dC1yaWdodCc+XG4gICAgICAgICAgICAgIDxoMz57IHVzZWRDUFUudG9GaXhlZCgyKSArICclJyB9PC9oMz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2wtbWQtMiB0ZXh0LWNlbnRlcic+XG4gICAgICAgICAgICA8QXJlYUNoYXJ0XG4gICAgICAgICAgICAgIHN0eWxlPXtjaGFydFN0eWxlfVxuICAgICAgICAgICAgICBmaWxsPXtjaGFydENvbG9yfVxuICAgICAgICAgICAgICBzdHJva2U9e2NoYXJ0Q29sb3J9XG4gICAgICAgICAgICAgIHdpZHRoPXsxNjB9XG4gICAgICAgICAgICAgIGhlaWdodD17ODB9XG4gICAgICAgICAgICAgIGRhdGE9e2RhdGFDUFV9IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbC1tZC0yIHRleHQtY2VudGVyJz5cbiAgICAgICAgICAgIDxBcmVhQ2hhcnRcbiAgICAgICAgICAgICAgc3R5bGU9e2NoYXJ0U3R5bGV9XG4gICAgICAgICAgICAgIGZpbGw9e2NoYXJ0Q29sb3J9XG4gICAgICAgICAgICAgIHN0cm9rZT17Y2hhcnRDb2xvcn1cbiAgICAgICAgICAgICAgd2lkdGg9ezE2MH1cbiAgICAgICAgICAgICAgaGVpZ2h0PXs4MH1cbiAgICAgICAgICAgICAgZGF0YT17ZGF0YVJBTX0gLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sLW1kLTQgdGV4dC1yaWdodCc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sLW1kLTggdGV4dC1sZWZ0Jz5cbiAgICAgICAgICAgICAgPGg1PlxuICAgICAgICAgICAgICAgIHsgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLnVzZWQpfVxuICAgICAgICAgICAgICAgIHsgJzogJyB9XG4gICAgICAgICAgICAgICAgeyBodW1hbml6ZS5maWxlc2l6ZSh1c2VkUkFNKSB9XG4gICAgICAgICAgICAgIDwvaDU+XG4gICAgICAgICAgICAgIDxoNT5cbiAgICAgICAgICAgICAgICB7IGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy50b3RhbCl9XG4gICAgICAgICAgICAgICAgeyAnOiAnIH1cbiAgICAgICAgICAgICAgICB7IGh1bWFuaXplLmZpbGVzaXplKHRvdGFsUkFNKSB9XG4gICAgICAgICAgICAgIDwvaDU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2wtbWQtNCB0ZXh0LXJpZ2h0Jz5cbiAgICAgICAgICAgICAgPGg0PnsgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLnJhbSkgfTwvaDQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cbn1cblxuUHJvY2Vzc2VzR3JhcGhzLnByb3BUeXBlcyA9IHtcbiAgZGF0YUNQVTogUmVhY3QuUHJvcFR5cGVzLmFycmF5LmlzUmVxdWlyZWQsXG4gIGRhdGFSQU06IFJlYWN0LlByb3BUeXBlcy5hcnJheS5pc1JlcXVpcmVkLFxuICB1c2VkQ1BVOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLmlzUmVxdWlyZWQsXG4gIHVzZWRSQU06IFJlYWN0LlByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgdG90YWxSQU06IFJlYWN0LlByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCxcbiAgbGFzdFVwZGF0ZTogUmVhY3QuUHJvcFR5cGVzLm9uZU9mVHlwZShbXG4gICAgUmVhY3QuUHJvcFR5cGVzLm51bWJlciwgUmVhY3QuUHJvcFR5cGVzLmJvb2xcbiAgXSlcbn1cblByb2Nlc3Nlc0dyYXBocy5kZWZhdWx0UHJvcHMgPSB7XG4gIGRhdGFDUFU6IFtdLFxuICBkYXRhUkFNOiBbXSxcbiAgdXNlZENQVTogMCxcbiAgdXNlZFJBTTogMCxcbiAgdG90YWxSQU06IDAsXG4gIGxhc3RVcGRhdGU6IGZhbHNlXG59XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdEludGwoUHJvY2Vzc2VzR3JhcGhzKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IExvZ2dlciBmcm9tICcuLi8uLi9jb21tb24vbGliL0xvZ2dlcidcbmltcG9ydCBQcm9jZXNzZXNBY3Rpb25zIGZyb20gJy4uL2FjdGlvbnMnXG5pbXBvcnQgUHJvY2Vzc2VzU3RvcmUgZnJvbSAnLi4vc3RvcmUnXG5pbXBvcnQgUHJvY2VzcyBmcm9tICcuLi9Qcm9jZXNzJ1xuXG4vLyBDb21wb25lbnRzXG5pbXBvcnQgUHJvY2Vzc2VzRmlsdGVyIGZyb20gJy4vZmlsdGVyJ1xuaW1wb3J0IFByb2Nlc3Nlc0J1dHRvbnMgZnJvbSAnLi9idXR0b25zJ1xuaW1wb3J0IFByb2Nlc3Nlc1RhYmxlIGZyb20gJy4vdGFibGUnXG5pbXBvcnQgUHJvY2Vzc2VzR3JhcGhzIGZyb20gJy4vZ3JhcGhzJ1xuXG5jbGFzcyBQcm9jZXNzZXNNYWluIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgc3RhdGljIGdldFN0b3JlcyAoKSB7XG4gICAgcmV0dXJuIFtQcm9jZXNzZXNTdG9yZV1cbiAgfVxuXG4gIHN0YXRpYyBjYWxjdWxhdGVTdGF0ZSAocHJldlN0YXRlLCBwcm9wcykge1xuICAgIGNvbnN0IHN0YXRpY0xvZ2dlciA9IG5ldyBMb2dnZXIoeyBzZWN0aW9uOiAnUHJvY2Vzc2VzIG1haW4gKHN0YXRpYyknIH0pXG5cbiAgICAvLyAtLSBQcm9jZXNzIHRoZSBwcm9jZXNzZXMgLS0gLy9cbiAgICBsZXQgcHJvY2Vzc2VzXG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3NlcyA9IFByb2Nlc3Nlc01haW4uZ2V0UHJvY2Vzc2VkUHJvY2Vzc2VzKFByb2Nlc3Nlc1N0b3JlLnByb2Nlc3NlcylcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc3RhdGljTG9nZ2VyLmVycm9yKGVycm9yKVxuICAgIH1cbiAgICAvLyAtLSBQcm9jZXNzIHRoZSBwcm9jZXNzZXMgLS0gLy9cblxuICAgIC8vIC0tIFByb2Nlc3MgdGhlIGdyYXBoIGRhdGEgLS0gLy9cbiAgICBsZXQgY3B1R3JhcGhEYXRhID0gW11cbiAgICBsZXQgcmFtR3JhcGhEYXRhID0gW11cbiAgICBjb25zdCBjcHVEYXRhID0gcHJvY2Vzc2VzLnJlZHVjZSgodG90YWwsIHByb2Nlc3MpID0+IHRvdGFsICsgcHJvY2Vzcy5DUFUsIDApXG4gICAgbGV0IHJhbURhdGEgPSBQcm9jZXNzZXNTdG9yZS5zeXN0ZW1JbmZvLmF2YWlsYWJsZVJBTSB8fCAwXG4gICAgbGV0IHRvdGFsUkFNID0gUHJvY2Vzc2VzU3RvcmUuc3lzdGVtSW5mby50b3RhbFJBTSB8fCAwXG4gICAgcmFtRGF0YSA9IHRvdGFsUkFNIDwgcmFtRGF0YSA/IHRvdGFsUkFNIDogcmFtRGF0YVxuXG4gICAgLy8gYnJhY2tldCBzY29wZVxuICAgIHtcbiAgICAgIC8vIFRoaXMgdmFyaWFibGVzIGRvZXNuJ3QgZXhpc3Qgb3V0c2lkZSB0aGUgYnJhY2tldHNcbiAgICAgIGxldCBsYXN0VXBkYXRlID0gUHJvY2Vzc2VzU3RvcmUucHJvY2Vzc2VzTGFzdFVwZGF0ZVxuICAgICAgbGV0IHVwZGF0ZVBlcmlvZCA9IFByb2Nlc3Nlc1N0b3JlLnVwZGF0ZVBlcmlvZCB8fCA1XG4gICAgICBsZXQgZ3JhcGhQZXJpb2QgPSB1cGRhdGVQZXJpb2QgKiAyNVxuICAgICAgICAvLyBDb252ZXJ0IHRvICVcbiAgICAgIGxldCByYW1EYXRhUGVyID0gdG90YWxSQU0gPyAocmFtRGF0YSAqIDEwMCkgLyB0b3RhbFJBTSA6IDBcblxuICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgdGhlIGNvbXBvbmVudCBpcyByZW5kZXJlZCwgbm8gcmVxdWVzdCBmb3IgZGF0YSBoYXMgYmVlbiBwZXJmb3JtZWRcbiAgICAgIGlmIChwcmV2U3RhdGUpIHtcbiAgICAgICAgLy8gRmlyc3QgcHJvY2Vzc2VzIGxpc3QgcmVjZWl2ZWQgb3IgcmVjZWl2ZWQgYSBuZXcgdmFsaWQgcHJvY2Vzc2VzIGxpc3RcbiAgICAgICAgaWYgKHRvdGFsUkFNICYmIGxhc3RVcGRhdGUgIT09IGZhbHNlICYmXG4gICAgICAgICAgICAocHJldlN0YXRlLmxhc3RVcGRhdGUgPT09IGZhbHNlIHx8XG4gICAgICAgICAgICAgIChwcmV2U3RhdGUubGFzdFVwZGF0ZSAhPT0gZmFsc2UgJiZcbiAgICAgICAgICAgICAgICBsYXN0VXBkYXRlID4gcHJldlN0YXRlLmxhc3RVcGRhdGUpKSkge1xuICAgICAgICAgIC8vIENvbnZlcnQgbGFzdFVwZGF0ZSBhbmQgdXBkYXRlUGVyaW9kIGZvbSBtcyB0byBzZWNvbmRzXG4gICAgICAgICAgbGFzdFVwZGF0ZSAvPSAxMDAwXG4gICAgICAgICAgdXBkYXRlUGVyaW9kIC89IDEwMDBcblxuICAgICAgICAgIGxldCBzdGFydFRpbWVzdGFtcCA9IGxhc3RVcGRhdGUgLSAoZ3JhcGhQZXJpb2QgKyAodXBkYXRlUGVyaW9kICogMikpXG5cbiAgICAgICAgICAvLyBSZW1vdmUgb2xkIGRhdGEuXG4gICAgICAgICAgLy8gR2l2ZSBleHRyYSB0aW1lIGJlZm9yZSB0aGUgaW5pdCB0aW1lIG9mIHRoZSBncmFwaFxuICAgICAgICAgIC8vICh0d28gdGltZXMgdGhlIHVwZGF0ZSBwZXJpb2QpXG4gICAgICAgICAgaWYgKHByZXZTdGF0ZS5jcHVHcmFwaERhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY3B1R3JhcGhEYXRhID0gcHJldlN0YXRlLmNwdUdyYXBoRGF0YS5maWx0ZXIoKHByb2Nlc3MpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIChwcm9jZXNzLnggPiBzdGFydFRpbWVzdGFtcCAmJiBwcm9jZXNzLnggPCBsYXN0VXBkYXRlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBQdXNoIHRoZSBsYXN0IHZhbHVlIGFuZCBmaWxsIHdpdGggemVyb3MgdGhlIHBvc3NpYmxlIHBlcmlvZFxuICAgICAgICAgIC8vIGJldHdlZW4gdGhlIGZpcnN0IHZhbHVlIGFuZCB0aGUgaW5pdCB0aW1lIG9mIHRoZSBncmFwaC5cbiAgICAgICAgICBjcHVHcmFwaERhdGEucHVzaCh7IHg6IGxhc3RVcGRhdGUsIHk6IGNwdURhdGEgfSlcbiAgICAgICAgICB3aGlsZSAoY3B1R3JhcGhEYXRhWzBdLnggPiAobGFzdFVwZGF0ZSAtIGdyYXBoUGVyaW9kKSkge1xuICAgICAgICAgICAgY3B1R3JhcGhEYXRhLnVuc2hpZnQoeyB4OiAoY3B1R3JhcGhEYXRhWzBdLnggLSB1cGRhdGVQZXJpb2QpLCB5OiAwIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUmVtb3ZlIG9sZCBkYXRhLlxuICAgICAgICAgIC8vIEdpdmUgZXh0cmEgdGltZSBiZWZvcmUgdGhlIGluaXQgdGltZSBvZiB0aGUgZ3JhcGhcbiAgICAgICAgICAvLyAodHdvIHRpbWVzIHRoZSB1cGRhdGUgcGVyaW9kKVxuICAgICAgICAgIGlmIChwcmV2U3RhdGUucmFtR3JhcGhEYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJhbUdyYXBoRGF0YSA9IHByZXZTdGF0ZS5yYW1HcmFwaERhdGEuZmlsdGVyKChwcm9jZXNzKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiAocHJvY2Vzcy54ID4gc3RhcnRUaW1lc3RhbXAgJiYgcHJvY2Vzcy54IDwgbGFzdFVwZGF0ZSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUHVzaCB0aGUgbGFzdCB2YWx1ZSBhbmQgZmlsbCB3aXRoIHplcm9zIHRoZSBwb3NzaWJsZSBwZXJpb2RcbiAgICAgICAgICAvLyBiZXR3ZWVuIHRoZSBmaXJzdCB2YWx1ZSBhbmQgdGhlIGluaXQgdGltZSBvZiB0aGUgZ3JhcGguXG4gICAgICAgICAgcmFtR3JhcGhEYXRhLnB1c2goeyB4OiBsYXN0VXBkYXRlLCB5OiByYW1EYXRhUGVyIH0pXG4gICAgICAgICAgd2hpbGUgKHJhbUdyYXBoRGF0YVswXS54ID4gKGxhc3RVcGRhdGUgLSBncmFwaFBlcmlvZCkpIHtcbiAgICAgICAgICAgIHJhbUdyYXBoRGF0YS51bnNoaWZ0KHsgeDogKHJhbUdyYXBoRGF0YVswXS54IC0gdXBkYXRlUGVyaW9kKSwgeTogMCB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjcHVHcmFwaERhdGEgPSBwcmV2U3RhdGUuY3B1R3JhcGhEYXRhXG4gICAgICAgICAgcmFtR3JhcGhEYXRhID0gcHJldlN0YXRlLnJhbUdyYXBoRGF0YVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjcHVHcmFwaERhdGEgPSB0aGlzLmRlZmF1bHRHcmFwaERhdGEoZ3JhcGhQZXJpb2QsIHVwZGF0ZVBlcmlvZClcbiAgICAgICAgcmFtR3JhcGhEYXRhID0gdGhpcy5kZWZhdWx0R3JhcGhEYXRhKGdyYXBoUGVyaW9kLCB1cGRhdGVQZXJpb2QpXG4gICAgICB9XG4gICAgfVxuICAgIC8vIC0tIFByb2Nlc3MgdGhlIGdyYXBoIGRhdGEgLS0gLy9cblxuICAgIHJldHVybiB7XG4gICAgICBwcm9jZXNzZXM6IHByb2Nlc3NlcyB8fCBbXSxcbiAgICAgIGNwdUdyYXBoRGF0YTogY3B1R3JhcGhEYXRhLFxuICAgICAgdXNlZENQVTogY3B1RGF0YSxcbiAgICAgIHJhbUdyYXBoRGF0YTogcmFtR3JhcGhEYXRhLFxuICAgICAgdXNlZFJBTTogcmFtRGF0YSxcbiAgICAgIHRvdGFsUkFNOiBQcm9jZXNzZXNTdG9yZS5zeXN0ZW1JbmZvLnRvdGFsUkFNLFxuICAgICAgc2VsZWN0ZWRQcm9jZXNzOiBQcm9jZXNzZXNTdG9yZS5zZWxlY3RlZFByb2Nlc3MsXG4gICAgICBsYXN0VXBkYXRlOiBQcm9jZXNzZXNTdG9yZS5wcm9jZXNzZXNMYXN0VXBkYXRlLFxuICAgICAgdXBkYXRlUGVyaW9kOiBQcm9jZXNzZXNTdG9yZS51cGRhdGVQZXJpb2QsXG4gICAgICBmaWx0ZXI6IFByb2Nlc3Nlc1N0b3JlLmZpbHRlcixcbiAgICAgIG9yZGVyOiBQcm9jZXNzZXNTdG9yZS5vcmRlclxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRQcm9jZXNzZWRQcm9jZXNzZXMgKHByb2Nlc3Nlcykge1xuICAgIC8vIFRlbXBcbiAgICBwcm9jZXNzZXMgPSBwcm9jZXNzZXNcbiAgICAgIC5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIHZhciByZXMgPSBQcm9jZXNzLnNvcnRIYW5kbGVyKCduYW1lJywgJ0FTQycpKGEsIGIpXG4gICAgICAgIHJldHVybiAocmVzID09PSAwKSA/IFByb2Nlc3Muc29ydEhhbmRsZXIoJ1BJRCcsICdBU0MnKShhLCBiKSA6IHJlc1xuICAgICAgfSlcblxuICAgIHJldHVybiBwcm9jZXNzZXNcbiAgfVxuXG4gIHN0YXRpYyBnZXRGaWx0ZXJlZFByb2Nlc3NlcyAocHJvY2Vzc2VzKSB7XG4gICAgY29uc3QgZmlsdGVyID0gUHJvY2Vzc2VzU3RvcmUuZmlsdGVyXG4gICAgY29uc3QgcGlkRmlsdGVyID0gZmlsdGVyLmdldCgnUElEJylcbiAgICBjb25zdCB1c2VyRmlsdGVyID0gZmlsdGVyLmdldCgndXNlcicpXG4gICAgY29uc3QgbmFtZUZpbHRlciA9IGZpbHRlci5nZXQoJ25hbWUnKVxuXG4gICAgLy8gRW1wdHkgZmlsdGVyXG4gICAgaWYgKCghcGlkRmlsdGVyIHx8IHBpZEZpbHRlci5sZW5ndGggPD0gMCkgJiZcbiAgICAgICAgKCF1c2VyRmlsdGVyIHx8IHVzZXJGaWx0ZXIubGVuZ3RoIDw9IDApICYmXG4gICAgICAgICghbmFtZUZpbHRlciB8fCBuYW1lRmlsdGVyLmxlbmd0aCA8PSAwKSkge1xuICAgICAgcmV0dXJuIHByb2Nlc3Nlc1xuICAgIH1cbiAgICAvLyBGaWx0ZXIgcHJvY2Vzc2VzXG4gICAgcmV0dXJuIHByb2Nlc3Nlcy5maWx0ZXIoKHByb2MsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBjaGVja1BJRCA9ICh0eXBlb2YgcGlkRmlsdGVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBTdHJpbmcocHJvYy5QSUQpLmluZGV4T2YocGlkRmlsdGVyKSAhPT0gLTEpXG4gICAgICBjb25zdCBjaGVja1VzZXIgPSAodHlwZW9mIHVzZXJGaWx0ZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHVzZXJGaWx0ZXIubGVuZ3RoID4gMCAmJlxuICAgICAgICBwcm9jLnVzZXIudG9Mb3dlckNhc2UoKS5pbmRleE9mKHVzZXJGaWx0ZXIudG9Mb3dlckNhc2UoKSkgIT09IC0xKVxuICAgICAgY29uc3QgY2hlY2tOYW1lID0gKHR5cGVvZiBuYW1lRmlsdGVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBuYW1lRmlsdGVyLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgcHJvYy5uYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihuYW1lRmlsdGVyLnRvTG93ZXJDYXNlKCkpICE9PSAtMSlcblxuICAgICAgcmV0dXJuIChjaGVja1BJRCB8fCBjaGVja1VzZXIgfHwgY2hlY2tOYW1lKVxuICAgIH0pXG4gIH1cblxuICBzdGF0aWMgZGVmYXVsdEdyYXBoRGF0YSAoZ3JhcGhQZXJpb2QsIHVwZGF0ZVBlcmlvZCkge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCkgLyAxMDAwXG4gICAgbGV0IGNwdUdyYXBoRGF0YSA9IFtdXG4gICAgbGV0IGF1eFRpbWVzdGFtcCA9IHRpbWVzdGFtcCAtIChncmFwaFBlcmlvZCArICh1cGRhdGVQZXJpb2QgKiAyKSlcbiAgICB3aGlsZSAoYXV4VGltZXN0YW1wIDwgdGltZXN0YW1wKSB7XG4gICAgICBjcHVHcmFwaERhdGEucHVzaCh7IHg6IGF1eFRpbWVzdGFtcCwgeTogMCB9KVxuICAgICAgYXV4VGltZXN0YW1wICs9IHVwZGF0ZVBlcmlvZFxuICAgIH1cbiAgICBjcHVHcmFwaERhdGEucHVzaCh7IHg6IGF1eFRpbWVzdGFtcCwgeTogMCB9KVxuXG4gICAgcmV0dXJuIGNwdUdyYXBoRGF0YVxuICB9XG5cbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICB0aGlzLnN0YXJ0VXBkYXRlSW50ZXJ2YWwgPSB0aGlzLnN0YXJ0VXBkYXRlSW50ZXJ2YWwuYmluZCh0aGlzKVxuICAgIHRoaXMuc3RvcFVwZGF0ZUludGVydmFsID0gdGhpcy5zdG9wVXBkYXRlSW50ZXJ2YWwuYmluZCh0aGlzKVxuICB9XG5cbiAgc3RhcnRVcGRhdGVJbnRlcnZhbCAocGVyaW9kKSB7XG4gICAgdGhpcy5zdG9wVXBkYXRlSW50ZXJ2YWwoKVxuICAgIGlmIChwZXJpb2QpIHtcbiAgICAgIHRoaXMuX191cGRhdGVJbnRlcnZhbElEID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBQcm9jZXNzZXNBY3Rpb25zLnJlcXVlc3RMaXN0KClcbiAgICAgIH0sIHBlcmlvZCAqIDEwMDApXG4gICAgfVxuICB9XG5cbiAgc3RvcFVwZGF0ZUludGVydmFsICgpIHtcbiAgICBpZiAodGhpcy5fX3VwZGF0ZUludGVydmFsSUQpIGNsZWFySW50ZXJ2YWwodGhpcy5fX3VwZGF0ZUludGVydmFsSUQpXG4gIH1cblxuICBjb21wb25lbnREaWRNb3VudCAoKSB7XG4gICAgLy8gRmV0Y2ggdGhlIHByb2Nlc3NlcyBiZWZvcmUgcmVuZGVyaW5nXG4gICAgaWYgKHRoaXMuc3RhdGUubGFzdFVwZGF0ZSA9PT0gZmFsc2UpIFByb2Nlc3Nlc0FjdGlvbnMucmVxdWVzdExpc3QoKVxuICAgIHRoaXMuc3RhcnRVcGRhdGVJbnRlcnZhbCh0aGlzLnN0YXRlLnVwZGF0ZVBlcmlvZClcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50ICgpIHtcbiAgICB0aGlzLnN0b3BVcGRhdGVJbnRlcnZhbCgpXG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHNlbGVjdGVkUHJvY2VzcywgbGFzdFVwZGF0ZSwgdXBkYXRlUGVyaW9kLCBwcm9jZXNzZXMsXG4gICAgICBjcHVHcmFwaERhdGEsIHVzZWRDUFUsIHJhbUdyYXBoRGF0YSwgdXNlZFJBTSwgdG90YWxSQU0sXG4gICAgICBmaWx0ZXJcbiAgICB9ID0gdGhpcy5zdGF0ZVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdwcm9jZXNzc2VzLW1haW4nPlxuICAgICAgICA8UHJvY2Vzc2VzRmlsdGVyIGZpbHRlcj17ZmlsdGVyfSAvPlxuICAgICAgICA8UHJvY2Vzc2VzQnV0dG9uc1xuICAgICAgICAgIHByb2Nlc3M9e3NlbGVjdGVkUHJvY2Vzc31cbiAgICAgICAgICBsYXN0VXBkYXRlPXtsYXN0VXBkYXRlfVxuICAgICAgICAgIHVwZGF0ZVBlcmlvZD17dXBkYXRlUGVyaW9kfVxuICAgICAgICAgIG9uUGVyaW9kQ2hhbmdlPXt0aGlzLnN0YXJ0VXBkYXRlSW50ZXJ2YWx9IC8+XG4gICAgICAgIDxiciAvPlxuICAgICAgICA8UHJvY2Vzc2VzVGFibGVcbiAgICAgICAgICBwcm9jZXNzZXM9e1Byb2Nlc3Nlc01haW4uZ2V0RmlsdGVyZWRQcm9jZXNzZXMocHJvY2Vzc2VzKX1cbiAgICAgICAgICBsYXN0VXBkYXRlPXtsYXN0VXBkYXRlfSAvPlxuICAgICAgICA8UHJvY2Vzc2VzR3JhcGhzXG4gICAgICAgICAgZGF0YUNQVT17Y3B1R3JhcGhEYXRhfVxuICAgICAgICAgIHVzZWRDUFU9e3VzZWRDUFV9XG4gICAgICAgICAgZGF0YVJBTT17cmFtR3JhcGhEYXRhfVxuICAgICAgICAgIHVzZWRSQU09e3VzZWRSQU19XG4gICAgICAgICAgdG90YWxSQU09e3RvdGFsUkFNfVxuICAgICAgICAgIGxhc3RVcGRhdGU9e2xhc3RVcGRhdGV9IC8+XG4gICAgICA8L2Rpdj5cbiAgICApXG4gIH1cbn1cblxuUHJvY2Vzc2VzTWFpbi5wcm9wVHlwZXMgPSB7XG4gIHByb2Nlc3NlczogUmVhY3QuUHJvcFR5cGVzLmFycmF5T2YoUmVhY3QuUHJvcFR5cGVzLmluc3RhbmNlT2YoUHJvY2VzcykpLFxuICBsYXN0VXBkYXRlOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICB1cGRhdGVQZXJpb2Q6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIGZpbHRlcjogUmVhY3QuUHJvcFR5cGVzLmluc3RhbmNlT2YoTWFwKSxcbiAgb3JkZXI6IFJlYWN0LlByb3BUeXBlcy5pbnN0YW5jZU9mKE1hcClcbn1cblxuZXhwb3J0IGRlZmF1bHQgUHJvY2Vzc2VzTWFpblxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQWxlcnQgfSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQgeyBpbmplY3RJbnRsIH0gZnJvbSAncmVhY3QtaW50bCdcbmltcG9ydCBodW1hbml6ZSBmcm9tICdodW1hbml6ZSdcbmltcG9ydCBQcm9jZXNzIGZyb20gJy4uL1Byb2Nlc3MnXG5pbXBvcnQgUHJvY2Vzc2VzQWN0aW9ucyBmcm9tICcuLi9hY3Rpb25zJ1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi4vLi4vY29tbW9uL2NvbXBvbmVudHMvQmFzZUNvbXBvbmVudCdcbmltcG9ydCBEYXRhVGFibGUsIHsgRGF0YUNvbHVtbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9jb21wb25lbnRzL2RhdGEtdGFibGUnXG5cbmNsYXNzIFByb2Nlc3Nlc1RhYmxlIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuICAgIHRoaXMuc3RhdGUgPSB7IGhlaWdodDogdGhpcy5wcm9wcy5oZWlnaHQgfHwgMCB9XG4gICAgdGhpcy5fYmluZCgnX19oYW5kbGVSZXNpemUnKVxuXG4gICAgLy8gTWVzc2FnZXMgZGVmaW5pdGlvbnNcbiAgICB0aGlzLm1lc3NhZ2VzID0ge1xuICAgICAgcGlkOiB7XG4gICAgICAgIGlkOiAncGlkJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdQSUQnXG4gICAgICB9LFxuICAgICAgdXNlcjoge1xuICAgICAgICBpZDogJ3VzZXInLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ1VzZXInXG4gICAgICB9LFxuICAgICAgbmFtZToge1xuICAgICAgICBpZDogJ25hbWUnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ05hbWUnXG4gICAgICB9LFxuICAgICAgY3B1OiB7XG4gICAgICAgIGlkOiAnY3B1JyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdDUFUnXG4gICAgICB9LFxuICAgICAgcmFtOiB7XG4gICAgICAgIGlkOiAncmFtJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdSQU0nXG4gICAgICB9LFxuICAgICAgbG9hZGluZ0RvdHM6IHtcbiAgICAgICAgaWQ6ICdsb2FkaW5nRG90cycsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnTG9hZGluZy4uLidcbiAgICAgIH0sXG4gICAgICB0aGVyZUFyZU5vUHJvY2Vzc2VzOiB7XG4gICAgICAgIGlkOiAndGhlcmVBcmVOb1Byb2Nlc3NlcycsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnVGhlcmUgYXJlIG5vIHByb2Nlc3NlcydcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfX2hhbmRsZVJlc2l6ZSAoZXZlbnQpIHtcbiAgICBjb25zdCBoZWlnaHRXaW5kb3cgPSBOdW1iZXIuaXNOYU4od2luZG93LmlubmVySGVpZ2h0KVxuICAgICAgPyB3aW5kb3cuY2xpZW50SGVpZ2h0XG4gICAgICA6IHdpbmRvdy5pbm5lckhlaWdodFxuICAgIGNvbnN0IHRoaXNUYWJsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9jZXNzZXMtdGFibGUnKVxuICAgIGNvbnN0IGhlaWdodFByb2NCdXR0b25zID0gdGhpc1RhYmxlID8gdGhpc1RhYmxlLm9mZnNldFRvcCA6IDBcbiAgICBjb25zdCBncmFwaHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJvY2Vzc2VzLWdyYXBocycpXG4gICAgY29uc3QgaGVpZ2h0R3JhcGhzID0gZ3JhcGhzID8gZ3JhcGhzLm9mZnNldEhlaWdodCA6IDgwIC8vIFVnbHkgYW5kIGF3ZnVsIGhhY2tcblxuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgaGVpZ2h0OiBoZWlnaHRXaW5kb3dcbiAgICAgICAgPyAoaGVpZ2h0V2luZG93IC0gaGVpZ2h0UHJvY0J1dHRvbnMgLSBoZWlnaHRHcmFwaHMgLSAyMClcbiAgICAgICAgOiAwXG4gICAgfSlcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICB0aGlzLl9faGFuZGxlUmVzaXplKClcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fX2hhbmRsZVJlc2l6ZSlcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50ICgpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fX2hhbmRsZVJlc2l6ZSlcbiAgfVxuXG4gIHJlbmRlciAoKSB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlXG4gICAgY29uc3QgcHJvcHMgPSB0aGlzLnByb3BzXG4gICAgY29uc3QgZGVmaW5lTWVzc2FnZSA9IHRoaXMucHJvcHMuaW50bC5mb3JtYXRNZXNzYWdlXG5cbiAgICBjb25zdCBwaWRDb2wgPSBuZXcgRGF0YUNvbHVtbih7XG4gICAgICBkYXRhS2V5OiAnUElEJyxcbiAgICAgIG5hbWU6IGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy5waWQpLFxuICAgICAgYWxpZ246ICdsZWZ0JyxcbiAgICAgIHdpZHRoOiAnODBweCcsXG4gICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIGhpZGRlbjogZmFsc2UsXG4gICAgICBzb3J0UHJvcHM6IHtcbiAgICAgICAgdHlwZTogJ251bWJlcidcbiAgICAgIH1cbiAgICB9KVxuICAgIGNvbnN0IHVzZXJDb2wgPSBuZXcgRGF0YUNvbHVtbih7XG4gICAgICBkYXRhS2V5OiAndXNlcicsXG4gICAgICBuYW1lOiBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMudXNlciksXG4gICAgICBhbGlnbjogJ2xlZnQnLFxuICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICBzb3J0UHJvcHM6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZydcbiAgICAgIH1cbiAgICB9KVxuICAgIGNvbnN0IG5hbWVDb2wgPSBuZXcgRGF0YUNvbHVtbih7XG4gICAgICBkYXRhS2V5OiAnbmFtZScsXG4gICAgICBuYW1lOiBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMubmFtZSksXG4gICAgICBhbGlnbjogJ2xlZnQnLFxuICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICBzb3J0UHJvcHM6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZydcbiAgICAgIH1cbiAgICB9KVxuICAgIGNvbnN0IGNwdUNvbCA9IG5ldyBEYXRhQ29sdW1uKHtcbiAgICAgIGRhdGFLZXk6ICdDUFUnLFxuICAgICAgbmFtZTogZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLmNwdSksXG4gICAgICBhbGlnbjogJ3JpZ2h0JyxcbiAgICAgIHdpZHRoOiAnNzBweCcsXG4gICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIHNvcnRQcm9wczoge1xuICAgICAgICB0eXBlOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIGNlbGxGb3JtYXR0ZXI6IChjZWxsKSA9PiBjZWxsICsgJyUnXG4gICAgfSlcbiAgICBjb25zdCBtZW1Db2wgPSBuZXcgRGF0YUNvbHVtbih7XG4gICAgICBkYXRhS2V5OiAnUkFNJyxcbiAgICAgIG5hbWU6IGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy5yYW0pLFxuICAgICAgYWxpZ246ICdyaWdodCcsXG4gICAgICB3aWR0aDogJzEwMHB4JyxcbiAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgc29ydFByb3BzOiB7XG4gICAgICAgIHR5cGU6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAgY2VsbEZvcm1hdHRlcjogKGNlbGwpID0+IGh1bWFuaXplLmZpbGVzaXplKGNlbGwpXG4gICAgfSlcblxuICAgIGNvbnN0IG9uUm93U2VsZWN0ZWQgPSAoaWRlbnRpZmllciwgcm93RGF0YSkgPT4gUHJvY2Vzc2VzQWN0aW9ucy5zZWxlY3Qocm93RGF0YS5QSUQsIHJvd0RhdGEubmFtZSlcbiAgICBjb25zdCBvblJvd1Vuc2VsZWN0ZWQgPSAoaWRlbnRpZmllciwgcm93RGF0YSkgPT4gUHJvY2Vzc2VzQWN0aW9ucy5jbGVhblNlbGVjdGVkKClcblxuICAgIGxldCBjb21wb25lbnRTdHlsZSA9IHt9XG4gICAgaWYgKHN0YXRlLmhlaWdodCkge1xuICAgICAgY29tcG9uZW50U3R5bGUuaGVpZ2h0ID0gc3RhdGUuaGVpZ2h0ICsgJ3B4J1xuICAgICAgY29tcG9uZW50U3R5bGUub3ZlcmZsb3cgPSAnYXV0bydcbiAgICAgIGNvbXBvbmVudFN0eWxlLm1hcmdpbkJvdHRvbSA9ICcxMHB4J1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGlkPSdwcm9jZXNzZXMtdGFibGUnIHN0eWxlPXtjb21wb25lbnRTdHlsZX0+XG4gICAgICAgIHsgIXByb3BzLmxhc3RVcGRhdGUgJiZcbiAgICAgICAgICA8QWxlcnQgYnNTdHlsZT0naW5mbyc+XG4gICAgICAgICAgICB7IGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy5sb2FkaW5nRG90cykgfVxuICAgICAgICAgIDwvQWxlcnQ+XG4gICAgICAgIH1cbiAgICAgICAgeyBwcm9wcy5sYXN0VXBkYXRlICYmIHByb3BzLnByb2Nlc3Nlcy5sZW5ndGggPD0gMCAmJlxuICAgICAgICAgIDxBbGVydCBic1N0eWxlPSdkYW5nZXInPlxuICAgICAgICAgICAgeyBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMudGhlcmVBcmVOb1Byb2Nlc3NlcykgfVxuICAgICAgICAgIDwvQWxlcnQ+XG4gICAgICAgIH1cbiAgICAgICAgeyBwcm9wcy5sYXN0VXBkYXRlICYmIHByb3BzLnByb2Nlc3Nlcy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgPERhdGFUYWJsZVxuICAgICAgICAgICAga2V5VmFsdWU9J1BJRCdcbiAgICAgICAgICAgIGNvbHVtbnM9e1twaWRDb2wsIHVzZXJDb2wsIG5hbWVDb2wsIGNwdUNvbCwgbWVtQ29sXX1cbiAgICAgICAgICAgIGRhdGE9e3Byb3BzLnByb2Nlc3Nlc31cbiAgICAgICAgICAgIG9uUm93U2VsZWN0ZWQ9e3Byb3BzLm9uUm93U2VsZWN0ZWQgfHwgb25Sb3dTZWxlY3RlZH1cbiAgICAgICAgICAgIG9uUm93VW5zZWxlY3RlZD17cHJvcHMub25Sb3dVbnNlbGVjdGVkIHx8IG9uUm93VW5zZWxlY3RlZH1cbiAgICAgICAgICAgIGJvcmRlcmVkIGhvdmVyIHJlc3BvbnNpdmUgc3RyaXBlZCBjb25kZW5zZWQgLz5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59XG5cblByb2Nlc3Nlc1RhYmxlLnByb3BUeXBlcyA9IHtcbiAgcHJvY2Vzc2VzOiBSZWFjdC5Qcm9wVHlwZXMuYXJyYXlPZihSZWFjdC5Qcm9wVHlwZXMuaW5zdGFuY2VPZihQcm9jZXNzKSksXG4gIGxhc3RVcGRhdGU6IFJlYWN0LlByb3BUeXBlcy5vbmVPZlR5cGUoW1xuICAgIFJlYWN0LlByb3BUeXBlcy5udW1iZXIsIFJlYWN0LlByb3BUeXBlcy5ib29sXG4gIF0pLFxuICBvblJvd1NlbGVjdGVkOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgb25Sb3dVbnNlbGVjdGVkOiBSZWFjdC5Qcm9wVHlwZXMuZnVuYyxcbiAgaW50bDogUmVhY3QuUHJvcFR5cGVzLm9iamVjdFxufVxuUHJvY2Vzc2VzVGFibGUuZGVmYXVsdFByb3BzID0ge1xuICBwcm9jZXNzZXM6IFtdLFxuICBsYXN0VXBkYXRlOiBmYWxzZSxcbiAgaGVpZ2h0OiAwXG59XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdEludGwoUHJvY2Vzc2VzVGFibGUpXG4iLCIvLyBzcmMvcHJvY2Vzc2VzLW1hbmFnZXIvY29uc3RhbnRzL2luZGV4LmpzXG5cbmNvbnN0IFByb2Nlc3Nlc0NvbnN0YW50cyA9IHtcbiAgSU5JVF9QUk9DRVNTRVNfU1RPUkU6ICdpbml0LXByb2Nlc3Nlcy1zdG9yZScsXG4gIEZJTFRFUl9QUk9DRVNTRVM6ICdmaWx0ZXItcHJvY2Vzc2VzJyxcbiAgU09SVF9QUk9DRVNTRVM6ICdzb3J0LXByb2Nlc3NlcycsXG4gIEZFVENIX1BST0NFU1NFUzogJ2ZldGNoLXByb2Nlc3NlcycsXG4gIFNFTEVDVF9QUk9DRVNTOiAnc2VsZWN0LXByb2Nlc3MnLFxuICBDTEVBTl9TRUxFQ1RFRF9QUk9DRVNTOiAnY2xlYW4tc2VsZWN0ZWQtcHJvY2VzcycsXG4gIFNUT1BfUFJPQ0VTUzogJ3N0b3AtcHJvY2VzcycsXG4gIFJFTU9WRV9QUk9DRVNTOiAncmVtb3ZlLXByb2Nlc3MnLFxuICBBRERfVE9fU1RPUFBJTkc6ICdhZGQtcHJvY2Vzcy10by1zdG9wcGluZycsXG4gIFJFTU9WRV9GUk9NX1NUT1BQSU5HOiAncmVtb3ZlLXByb2Nlc3MtZnJvbS1zdG9wcGluZycsXG4gIENIQU5HRV9QRVJJT0Q6ICdwcm9jZXNzZXMtY2hhbmdlLXBlcmlvZCdcbn1cblxuZXhwb3J0IGRlZmF1bHQgUHJvY2Vzc2VzQ29uc3RhbnRzXG4iLCIvLyBzcmMvcHJvY2Vzc2VzLW1hbmFnZXIvc3RvcmVzL2luZGV4LmpzXG5cbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnZmx1eC91dGlscydcbmltcG9ydCBBcHBEaXNwYXRjaGVyIGZyb20gJy4uLy4uL2Rpc3BhdGNoZXInXG5pbXBvcnQgTG9nZ2VyIGZyb20gJy4uLy4uL2NvbW1vbi9saWIvTG9nZ2VyJ1xuXG5pbXBvcnQgUHJvY2Vzc2VzQ29uc3RhbnRzIGZyb20gJy4uL2NvbnN0YW50cydcbmltcG9ydCBQcm9jZXNzIGZyb20gJy4uL1Byb2Nlc3MnXG5cbnZhciBsb2dnZXIgPSBuZXcgTG9nZ2VyKHsgc2VjdGlvbjogJ1Byb2Nlc3NlcyBzdG9yZScgfSlcblxuY2xhc3MgUHJvY2Vzc2VzU3RvcmUgZXh0ZW5kcyBTdG9yZSB7XG4gIGNvbnN0cnVjdG9yIChkaXNwYXRjaGVyKSB7XG4gICAgc3VwZXIoZGlzcGF0Y2hlcilcblxuICAgIHRoaXMuaW5pdGlhbGl6ZSgpXG4gIH1cblxuICBpbml0aWFsaXplICgpIHtcbiAgICAvLyBQcm9jZXNzZXMgbGlzdFxuICAgIHRoaXMuX19wcm9jZXNzZXMgPSBuZXcgTWFwKClcbiAgICAvLyBMYXN0IHVwZGF0ZSBvZiBwcm9jZXNzZXMgbGlzdFxuICAgIHRoaXMuX19wcm9jZXNzZXNMYXN0VXBkYXRlID0gZmFsc2VcbiAgICAvLyBTZWxlY3RlZCBwcm9jZXNzXG4gICAgdGhpcy5fX2NsZWFuU2VsZWN0ZWRQcm9jZXNzKClcbiAgICAvLyBTdG9wcGluZyBwcm9jZXNzZXNcbiAgICB0aGlzLl9fY2xlYW5TdG9wcGluZ1Byb2Nlc3NlcygpXG4gICAgLy8gU3lzdGVtIGluZm9cbiAgICB0aGlzLl9fc3lzdGVtSW5mbyA9IHt9XG4gICAgLy8gUHJvY2VzcyBmaWx0ZXJcbiAgICB0aGlzLl9fY2xlYW5GaWx0ZXIoKVxuICAgIC8vIFByb2Nlc3Mgb3JkZXJcbiAgICB0aGlzLl9fY2xlYW5PcmRlcigpXG4gICAgLy8gU3RhcnQgc29ydGluZyBieSBuYW1lXG4gICAgdGhpcy5fX29yZGVyLnNldCgnbmFtZScsICdBU0MnKVxuICAgIC8vIERlZmF1bHQgdXBkYXRlIHBlcmlvZFxuICAgIHRoaXMuX191cGRhdGVQZXJpb2QgPSA1IC8vIERlZmF1bHRcbiAgfVxuXG4gIHZhbGlkYXRlUHJvY2Vzc0lkZW50aWZpZXIgKFBJRCwgbmFtZSkge1xuICAgIHZhciByZXN1bHQgPSB0cnVlXG4gICAgdmFyIG1lc3NhZ2UgPSAnJ1xuICAgIHZhciBlcnJvciA9IG51bGxcblxuICAgIGlmICh0eXBlb2YgUElEICE9PSAnbnVtYmVyJykge1xuICAgICAgcmVzdWx0ID0gZmFsc2VcbiAgICAgIG1lc3NhZ2UgPSAnVGhlIHByb2Nlc3MgUElEIHNob3VsZCBiZSBhIG51bWJlcidcbiAgICAgIGVycm9yID0gbmV3IFR5cGVFcnJvcihtZXNzYWdlKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZVxuICAgICAgbWVzc2FnZSA9ICdUaGUgcHJvY2VzcyBuYW1lIHNob3VsZCBiZSBhIHN0cmluZydcbiAgICAgIGVycm9yID0gbmV3IFR5cGVFcnJvcihtZXNzYWdlKVxuICAgIH1cblxuICAgIHJldHVybiB7IHJlc3VsdCwgbWVzc2FnZSwgZXJyb3IgfVxuICB9XG5cbiAgLy8gLS0gR2V0dGVycyAtLSAvL1xuXG4gIHByb2Nlc3MgKFBJRCwgbmFtZSkge1xuICAgIHZhciB7IGVycm9yIH0gPSB0aGlzLnZhbGlkYXRlUHJvY2Vzc0lkZW50aWZpZXIoUElELCBuYW1lKVxuICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3JcblxuICAgIHJldHVybiB0aGlzLl9fcHJvY2Vzc2VzLmdldChQcm9jZXNzLmlkZW50aWZpZXIoUElELCBuYW1lKSlcbiAgfVxuXG4gIGdldCBwcm9jZXNzZXMgKCkge1xuICAgIHJldHVybiBbLi4udGhpcy5fX3Byb2Nlc3Nlcy52YWx1ZXMoKV1cbiAgfVxuXG4gIGdldCBwcm9jZXNzZXNMYXN0VXBkYXRlICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3Byb2Nlc3Nlc0xhc3RVcGRhdGVcbiAgfVxuXG4gIGdldCBzZWxlY3RlZFByb2Nlc3MgKCkge1xuICAgIHZhciBwcm9jZXNzID0gdGhpcy5fX3NlbGVjdGVkUHJvY2Vzc1xuICAgIGlmICh0eXBlb2YgKHByb2Nlc3MuUElEKSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIHR5cGVvZiAocHJvY2Vzcy5uYW1lKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIEFkZCB0aGUgc3RvcHBpbmcgcHJvcGVydHlcbiAgICAgIHByb2Nlc3Muc3RvcHBpbmcgPSB0aGlzLmlzUHJvY2Vzc1N0b3BwaW5nKHByb2Nlc3MuUElELCBwcm9jZXNzLm5hbWUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHByb2Nlc3NcbiAgfVxuXG4gIGlzUHJvY2Vzc1N0b3BwaW5nIChQSUQsIG5hbWUpIHtcbiAgICB2YXIgeyBlcnJvciB9ID0gdGhpcy52YWxpZGF0ZVByb2Nlc3NJZGVudGlmaWVyKFBJRCwgbmFtZSlcbiAgICBpZiAoZXJyb3IpIHRocm93IGVycm9yXG5cbiAgICB2YXIgaWRlbnRpZmllciA9IFByb2Nlc3MuaWRlbnRpZmllcihQSUQsIG5hbWUpXG5cbiAgICByZXR1cm4gKHRoaXMuX19wcm9jZXNzZXMuaGFzKGlkZW50aWZpZXIpICYmXG4gICAgICAgICAgICB0aGlzLl9fcHJvY2Vzc2VzU3RvcHBpbmcuaW5kZXhPZihpZGVudGlmaWVyKSAhPT0gLTEpXG4gIH1cblxuICBnZXQgc3lzdGVtSW5mbyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19zeXN0ZW1JbmZvXG4gIH1cblxuICBnZXQgZmlsdGVyICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX2ZpbHRlclxuICB9XG5cbiAgZ2V0IG9yZGVyICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX29yZGVyXG4gIH1cblxuICBnZXQgdXBkYXRlUGVyaW9kICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3VwZGF0ZVBlcmlvZFxuICB9XG5cbiAgLy8gLS0gU2V0dGVycyAoUHJpdmF0ZSkgLS0gLy9cblxuICAvKlxuICAgKiBUaGUgcHJvY2Vzc2VzIHBhcmFtZXRlciBhY2NlcHQgYW4gYXJyYXkgb2YgUHJvY2VzcyBvYmplY3RzXG4gICAqIG9yIGFueSBpdGVyYWJsZSBvZiBqcyBvYmplY3RzLiBJZiB0aGUgaWRlbnRpZmllciBwcm9wZXJ0eVxuICAgKiBkb250IGV4aXN0IGluIHRoZSBqcyBvYmplY3QsIHRoZWlyIGtleSB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBfX3NldFByb2Nlc3NlcyAocHJvY2Vzc2VzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgcHJvY2Vzc2VzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgcHJvY2Vzc2VzIHNvdXJjZSBpcyBlbXB0eScpXG4gICAgICB9XG4gICAgICB0aGlzLl9fY2xlYXJQcm9jZXNzZXMoKVxuICAgICAgdGhpcy5fX2FkZFByb2Nlc3Nlcyhwcm9jZXNzZXMpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFByb3BhZ2F0ZSBlcnJvclxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKlxuICAgKiBUaGUgcHJvY2Vzc2VzIHBhcmFtZXRlciBhY2NlcHQgYW4gYXJyYXkgb2YgUHJvY2VzcyBvYmplY3RzXG4gICAqIG9yIGFueSBpdGVyYWJsZSBvZiBqcyBvYmplY3RzLiBJZiB0aGUgbmFtZSBwcm9wZXJ0eVxuICAgKiBkb24ndCBleGlzdCBpbiB0aGUganMgb2JqZWN0LCB0aGVpciBrZXkgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgX19hZGRQcm9jZXNzZXMgKHByb2Nlc3Nlcykge1xuICAgIGlmICh0eXBlb2YgcHJvY2Vzc2VzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHByb2Nlc3NlcyBzb3VyY2UgaXMgZW1wdHknKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyAncHJvY2Vzc2VzJyBzaG91bGQgYmUgaXRlcmFibGVcbiAgICAgIGxldCBwcm9jZXNzZXNJdGVyYWJsZVxuXG4gICAgICAvLyBJdGVyYWJsZVxuICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzZXNbU3ltYm9sLml0ZXJhdG9yXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcHJvY2Vzc2VzSXRlcmFibGUgPSBwcm9jZXNzZXNcbiAgICAgIC8vIE5vdCBpdGVyYWJsZVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcHJvY2Vzc2VzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBHZXQgYW4gaXRlcmFibGUgb2JqZWN0IGZyb20gdGhlIHBsYWluIGpzIG9iamVjdFxuICAgICAgICBwcm9jZXNzZXNJdGVyYWJsZSA9IG5ldyBNYXAoKVxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gcHJvY2Vzc2VzKSB7XG4gICAgICAgICAgcHJvY2Vzc2VzSXRlcmFibGUuc2V0KGtleSwgcHJvY2Vzc2VzW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBwcm9jZXNzZXNJdGVyYWJsZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHByb2Nlc3NlcyBzb3VyY2UgaXMgbm90IGl0ZXJhYmxlJylcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgW2tleSwgcHJvY2Vzc10gb2YgcHJvY2Vzc2VzSXRlcmFibGUpIHtcbiAgICAgICAgLy8gaWRlbnRpZmllciBjaGVja1xuICAgICAgICBpZiAodHlwZW9mIHByb2Nlc3MuUElEID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHZhciBQSUQgPSBOdW1iZXIucGFyc2VJbnQoa2V5KVxuICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKFBJRCkpIHtcbiAgICAgICAgICAgIHByb2Nlc3MuUElEID0gUElEXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdUaGUgZWxlbWVudCBpcyBub3Qgd2VsbCBmb3JtZWQgYW5kIGNhbm5vdCBiZSBpbnRyb2R1Y2VkJywgcHJvY2VzcylcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fX2FkZFByb2Nlc3MocHJvY2VzcylcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gUHJvcGFnYXRlIGVycm9yXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIF9fY2xlYXJQcm9jZXNzIChQSUQsIG5hbWUpIHtcbiAgICBjb25zdCB7IGVycm9yIH0gPSB0aGlzLnZhbGlkYXRlUHJvY2Vzc0lkZW50aWZpZXIoUElELCBuYW1lKVxuICAgIGlmIChlcnJvcikgdGhyb3cgZXJyb3JcblxuICAgIHRoaXMuX19wcm9jZXNzZXMuZGVsZXRlKFByb2Nlc3MuaWRlbnRpZmllcihQSUQsIG5hbWUpKVxuICB9XG5cbiAgX19jbGVhclByb2Nlc3NlcyAoKSB7XG4gICAgaWYgKHRoaXMuX19wcm9jZXNzZXMuc2l6ZSA+IDApIHRoaXMuX19wcm9jZXNzZXMuY2xlYXIoKVxuICB9XG5cbiAgX19hZGRQcm9jZXNzIChwcm9jZXNzKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9jZXNzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHByb2Nlc3Mgc291cmNlIGlzIGVtcHR5JylcbiAgICB9XG4gICAgY29uc3QgeyBlcnJvciB9ID0gdGhpcy52YWxpZGF0ZVByb2Nlc3NJZGVudGlmaWVyKHByb2Nlc3MuUElELCBwcm9jZXNzLm5hbWUpXG4gICAgaWYgKGVycm9yKSB0aHJvdyBlcnJvclxuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChwcm9jZXNzIGluc3RhbmNlb2YgUHJvY2Vzcykge1xuICAgICAgICB0aGlzLl9fcHJvY2Vzc2VzLnNldChQcm9jZXNzLmlkZW50aWZpZXIocHJvY2Vzcy5QSUQsIHByb2Nlc3MubmFtZSksIHByb2Nlc3MpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9fcHJvY2Vzc2VzLnNldChQcm9jZXNzLmlkZW50aWZpZXIocHJvY2Vzcy5QSUQsIHByb2Nlc3MubmFtZSksIG5ldyBQcm9jZXNzKHByb2Nlc3MpKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBQcm9wYWdhdGUgZXJyb3JcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgX19zZXRTZWxlY3RlZFByb2Nlc3MgKFBJRCwgbmFtZSkge1xuICAgIGNvbnN0IHsgZXJyb3IgfSA9IHRoaXMudmFsaWRhdGVQcm9jZXNzSWRlbnRpZmllcihQSUQsIG5hbWUpXG4gICAgaWYgKGVycm9yKSB0aHJvdyBlcnJvclxuXG4gICAgdGhpcy5fX3NlbGVjdGVkUHJvY2VzcyA9IG5ldyBQcm9jZXNzKHsgUElELCBuYW1lIH0pXG4gIH1cblxuICBfX2NsZWFuU2VsZWN0ZWRQcm9jZXNzICgpIHtcbiAgICB0aGlzLl9fc2VsZWN0ZWRQcm9jZXNzID0gJydcbiAgfVxuXG4gIF9fYWRkVG9TdG9wcGluZ1Byb2Nlc3NlcyAoUElELCBuYW1lKSB7XG4gICAgdmFyIHsgZXJyb3IgfSA9IHRoaXMudmFsaWRhdGVQcm9jZXNzSWRlbnRpZmllcihQSUQsIG5hbWUpXG4gICAgaWYgKGVycm9yKSB0aHJvdyBlcnJvclxuXG4gICAgY29uc3QgaWRlbnRpZmllciA9IFByb2Nlc3MuaWRlbnRpZmllcihQSUQsIG5hbWUpXG5cbiAgICBpZiAodGhpcy5fX3Byb2Nlc3Nlcy5oYXMoaWRlbnRpZmllcikgJiZcbiAgICAgICAgIXRoaXMuX19wcm9jZXNzZXNTdG9wcGluZy5pbmRleE9mKGlkZW50aWZpZXIpICE9PSAtMSkge1xuICAgICAgdGhpcy5fX3Byb2Nlc3Nlc1N0b3BwaW5nLnB1c2goaWRlbnRpZmllcilcbiAgICB9XG4gIH1cblxuICBfX3JlbW92ZUZyb21TdG9wcGluZ1Byb2Nlc3NlcyAoUElELCBuYW1lKSB7XG4gICAgdmFyIHsgZXJyb3IgfSA9IHRoaXMudmFsaWRhdGVQcm9jZXNzSWRlbnRpZmllcihQSUQsIG5hbWUpXG4gICAgaWYgKGVycm9yKSB0aHJvdyBlcnJvclxuXG4gICAgdmFyIGlkZW50aWZpZXIgPSBQcm9jZXNzLmlkZW50aWZpZXIoUElELCBuYW1lKVxuICAgIHZhciBpbmRleCA9IHRoaXMuX19wcm9jZXNzZXNTdG9wcGluZy5pbmRleE9mKGlkZW50aWZpZXIpXG5cbiAgICBpZiAoaW5kZXggPiAtMSkgdGhpcy5fX3NlcnZpY2VzVXBkYXRpbmcuc3BsaWNlKGluZGV4LCAxKVxuICB9XG5cbiAgX191cGRhdGVTdG9wcGluZ1Byb2Nlc3NlcyAoKSB7XG4gICAgdGhpcy5fX3Byb2Nlc3Nlc1N0b3BwaW5nLmZpbHRlcigoaWRlbnRpZmllcikgPT4gdGhpcy5fX3Byb2Nlc3Nlcy5oYXMoaWRlbnRpZmllcikpXG4gIH1cblxuICBfX2NsZWFuU3RvcHBpbmdQcm9jZXNzZXMgKCkge1xuICAgIHRoaXMuX19wcm9jZXNzZXNTdG9wcGluZyA9IFtdXG4gIH1cblxuICBfX3NldEZpbHRlciAocHJvcCwgZmlsdGVyKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wID09PSAndW5kZWZpbmVkJyB8fCBwcm9wLmxlbmd0aCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZmlsdGVyIGl0ZW0gaXMgZW1wdHknKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGZpbHRlciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBmaWx0ZXIgaXMgbm90IGEgc3RyaW5nJylcbiAgICB9XG5cbiAgICBpZiAoIShwcm9wIGluc3RhbmNlb2YgQXJyYXkpKSBwcm9wID0gW3Byb3BdXG5cbiAgICBwcm9wLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGlmICghdGhpcy5fX2ZpbHRlci5oYXMoaXRlbSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGZpbHRlciBpdGVtIGRvIG5vdCBleGlzdHMnKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9fZmlsdGVyLnNldChpdGVtLCBmaWx0ZXIpXG4gICAgfSlcbiAgfVxuXG4gIF9fY2xlYW5GaWx0ZXIgKCkge1xuICAgIHRoaXMuX19maWx0ZXIgPSBQcm9jZXNzLmRlZmF1dEZpbHRlck9iamVjdFxuICB9XG5cbiAgX19zZXRPcmRlciAocHJvcCwgb3JkZXIpIHtcbiAgICBpZiAodHlwZW9mIHByb3AgPT09ICd1bmRlZmluZWQnIHx8IHByb3AubGVuZ3RoIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBvcmRlciBpdGVtIGlzIGVtcHR5JylcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX19vcmRlci5oYXMocHJvcCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBvcmRlciBpdGVtIGRvIG5vdCBleGlzdHMnKVxuICAgIH1cblxuICAgIGxldCBsYXN0T3JkZXIgPSB0aGlzLl9fb3JkZXIuZ2V0KHByb3ApXG5cbiAgICAvLyBSZXNldCB0aGUgb3JkZXJcbiAgICB0aGlzLl9fb3JkZXIgPSBQcm9jZXNzLmRlZmF1dFNvcnRPYmplY3RcblxuICAgIC8vIFdoZW4gdGhlIHBhcmFtIG9yZGVyIGlzIHVuZGVmaW5lZCwgY2hhbmdlIHRoZSBsYXN0IG9yZGVyXG4gICAgaWYgKHR5cGVvZiBvcmRlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGlmIChsYXN0T3JkZXIgPT09ICcnKSB7XG4gICAgICAgIG9yZGVyID0gJ0FTQydcbiAgICAgIH0gZWxzZSBpZiAobGFzdE9yZGVyID09PSAnQVNDJykge1xuICAgICAgICBvcmRlciA9ICdERVNDJ1xuICAgICAgfSBlbHNlIGlmIChsYXN0T3JkZXIgPT09ICdERVNDJykge1xuICAgICAgICBvcmRlciA9ICcnXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fX29yZGVyLnNldChwcm9wLCBvcmRlcilcbiAgfVxuXG4gIF9fY2xlYW5PcmRlciAoKSB7XG4gICAgdGhpcy5fX29yZGVyID0gUHJvY2Vzcy5kZWZhdXRTb3J0T2JqZWN0XG4gIH1cblxuICAvLyAtLSBEaXNwYXRjaGVyIHJlZ2lzdGVyIC0tIC8vXG5cbiAgX19vbkRpc3BhdGNoIChwYXlsb2FkKSB7XG4gICAgc3dpdGNoIChwYXlsb2FkLmFjdGlvblR5cGUpIHtcbiAgICAgIGNhc2UgUHJvY2Vzc2VzQ29uc3RhbnRzLklOSVRfUFJPQ0VTU0VTX1NUT1JFOlxuICAgICAgICAvLyBDT05TT0xFIFRSQUNFXG4gICAgICAgIGxvZ2dlci5pbmZvKCdJbml0aWFsaXppbmcgc3RvcmUuLi4nKVxuXG4gICAgICAgIC8vIFdpbGwgcmVjZWl2ZSBwYXlsb2FkLmZpbHRlclxuICAgICAgICB0aGlzLmluaXRpYWxpemUoKVxuXG4gICAgICAgIC8vIE5vdGlmeSB0aGUgb2JzZXJ2ZXJzIHRoYXQgdGhlIHN0b3JlIGNoYW5nZWRcbiAgICAgICAgdGhpcy5fX2VtaXRDaGFuZ2UoKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFByb2Nlc3Nlc0NvbnN0YW50cy5GSUxURVJfUFJPQ0VTU0VTOlxuICAgICAgICAvLyBDT05TT0xFIFRSQUNFXG4gICAgICAgIGxvZ2dlci5pbmZvKCdGaWx0ZXJpbmcgcHJvY2Vzc2VzLi4uJylcblxuICAgICAgICAvLyBXaWxsIHJlY2VpdmUgcGF5bG9hZC5maWx0ZXJcbiAgICAgICAgdGhpcy5fX3NldEZpbHRlcihwYXlsb2FkLnByb3AsIHBheWxvYWQuZmlsdGVyKVxuXG4gICAgICAgIC8vIE5vdGlmeSB0aGUgb2JzZXJ2ZXJzIHRoYXQgdGhlIHN0b3JlIGNoYW5nZWRcbiAgICAgICAgdGhpcy5fX2VtaXRDaGFuZ2UoKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFByb2Nlc3Nlc0NvbnN0YW50cy5TT1JUX1BST0NFU1NFUzpcbiAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICBsb2dnZXIuaW5mbygnU29ydGluZyBwcm9jZXNzZXMuLi4nKVxuXG4gICAgICAgIC8vIFdpbGwgcmVjZWl2ZSBwYXlsb2FkLnByb3AgYW5kIHBheWxvYWQub3JkZXJcbiAgICAgICAgdGhpcy5fX3NldE9yZGVyKHBheWxvYWQucHJvcCwgcGF5bG9hZC5vcmRlcilcblxuICAgICAgICAvLyBOb3RpZnkgdGhlIG9ic2VydmVycyB0aGF0IHRoZSBzdG9yZSBjaGFuZ2VkXG4gICAgICAgIHRoaXMuX19lbWl0Q2hhbmdlKClcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBQcm9jZXNzZXNDb25zdGFudHMuRkVUQ0hfUFJPQ0VTU0VTOlxuICAgICAgICAvLyBDT05TT0xFIFRSQUNFXG4gICAgICAgIGxvZ2dlci5pbmZvKCdSZXRyaWV2aW5nIHByb2Nlc3Nlcy4uLicpXG5cbiAgICAgICAgaWYgKHBheWxvYWQubGlzdCkge1xuICAgICAgICAgIC8vIFdpbGwgcmVjZWl2ZSBwYXlsb2FkLmxpc3QgYW5kIHBheWxvYWQudGltZXN0YW1wXG4gICAgICAgICAgdGhpcy5fX3NldFByb2Nlc3NlcyhwYXlsb2FkLmxpc3QpXG4gICAgICAgICAgdGhpcy5fX3Byb2Nlc3Nlc0xhc3RVcGRhdGUgPSBEYXRlLm5vdygpXG5cbiAgICAgICAgICBpZiAocGF5bG9hZC5zeXN0ZW1JbmZvKSB7XG4gICAgICAgICAgICB0aGlzLl9fc3lzdGVtSW5mbyA9IHtcbiAgICAgICAgICAgICAgdG90YWxSQU06IHBheWxvYWQuc3lzdGVtSW5mby50b3RhbFJBTSxcbiAgICAgICAgICAgICAgYXZhaWxhYmxlUkFNOiBwYXlsb2FkLnN5c3RlbUluZm8uYXZhaWxhYmxlUkFNXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTm90aWZ5IHRoZSBvYnNlcnZlcnMgdGhhdCB0aGUgc3RvcmUgY2hhbmdlZFxuICAgICAgICAgIHRoaXMuX19lbWl0Q2hhbmdlKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBDT05TT0xFIFRSQUNFXG4gICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0ludmFsaWQgcHJvY2Vzc2VzJylcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFByb2Nlc3Nlc0NvbnN0YW50cy5TRUxFQ1RfUFJPQ0VTUzpcbiAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICBsb2dnZXIuaW5mbygnU2VsZWN0aW5nIHByb2Nlc3MuLi4nKVxuXG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCB7IHJlc3VsdCB9ID0gdGhpcy52YWxpZGF0ZVByb2Nlc3NJZGVudGlmaWVyKHBheWxvYWQuUElELCBwYXlsb2FkLm5hbWUpXG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgLy8gV2lsbCByZWNlaXZlIHBheWxvYWQuUElEIGFuZCBwYXlsb2FkLm5hbWVcbiAgICAgICAgICAgIGlmICghcGF5bG9hZC5uYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnZWhvcnVzJykpIHtcbiAgICAgICAgICAgICAgdGhpcy5fX3NldFNlbGVjdGVkUHJvY2VzcyhwYXlsb2FkLlBJRCwgcGF5bG9hZC5uYW1lKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5fX2NsZWFuU2VsZWN0ZWRQcm9jZXNzKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE5vdGlmeSB0aGUgb2JzZXJ2ZXJzIHRoYXQgdGhlIHN0b3JlIGNoYW5nZWRcbiAgICAgICAgICAgIHRoaXMuX19lbWl0Q2hhbmdlKClcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0ludmFsaWQgdmFsdWVzIGZvciB0aGUgcHJvY2VzcyBzZWxlY3Rpb24nKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFByb2Nlc3Nlc0NvbnN0YW50cy5DTEVBTl9TRUxFQ1RFRF9QUk9DRVNTOlxuICAgICAgICAvLyBDT05TT0xFIFRSQUNFXG4gICAgICAgIGxvZ2dlci5pbmZvKCdEZXNlbGVjdGluZyB0aGUgcHJvY2Vzcy4uLicpXG5cbiAgICAgICAgLy8gV2lsbCByZWNlaXZlIHBheWxvYWQuaWRlbnRpZmllclxuICAgICAgICB0aGlzLl9fY2xlYW5TZWxlY3RlZFByb2Nlc3MoKVxuXG4gICAgICAgIC8vIE5vdGlmeSB0aGUgb2JzZXJ2ZXJzIHRoYXQgdGhlIHN0b3JlIGNoYW5nZWRcbiAgICAgICAgdGhpcy5fX2VtaXRDaGFuZ2UoKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFByb2Nlc3Nlc0NvbnN0YW50cy5TVE9QX1BST0NFU1M6XG4gICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgbG9nZ2VyLmluZm8oYFN0b3BwaW5nIHRoZSBwcm9jZXNzICcke3BheWxvYWQubmFtZX0nIFske3BheWxvYWQuUElEfV1gKVxuXG4gICAgICAgIC8vIC8vIFdpbGwgcmVjZWl2ZSBwYXlsb2FkLlBJRCBhbmQgcGF5bG9hZC5uYW1lXG4gICAgICAgIC8vIGlmICh0eXBlb2YgcGF5bG9hZC5QSUQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBwYXlsb2FkLm5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgLy8gTm90aWZ5IHRoZSBvYnNlcnZlcnMgdGhhdCB0aGUgc3RvcmUgY2hhbmdlZFxuICAgICAgICAvLyAgIHRoaXMuX19lbWl0Q2hhbmdlKClcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBlbHNlIHtcbiAgICAgICAgLy8gICAvLyBDT05TT0xFIFRSQUNFXG4gICAgICAgIC8vICAgbG9nZ2VyLndhcm5pbmcoJ0ludmFsaWQgdmFsdWVzIGZvciBzdG9wcGluZyB0aGUgcHJvY2VzcycpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgUHJvY2Vzc2VzQ29uc3RhbnRzLkFERF9UT19TVE9QUElORzpcbiAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICBsb2dnZXIuaW5mbyhgQWRkaW5nIHRoZSBwcm9jZXNzICcke3BheWxvYWQubmFtZX0nIFske3BheWxvYWQuUElEfV0gdG8gdGhlIHN0b3BwaW5nIGxpc3RgKVxuXG4gICAgICAgIHtcbiAgICAgICAgICAvLyBXaWxsIHJlY2VpdmUgcGF5bG9hZC5QSUQgYW5kIHBheWxvYWQubmFtZVxuICAgICAgICAgIGNvbnN0IHsgcmVzdWx0IH0gPSB0aGlzLnZhbGlkYXRlUHJvY2Vzc0lkZW50aWZpZXIocGF5bG9hZC5QSUQsIHBheWxvYWQubmFtZSlcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLl9fYWRkVG9TdG9wcGluZ1Byb2Nlc3NlcyhwYXlsb2FkLlBJRCwgcGF5bG9hZC5uYW1lKVxuXG4gICAgICAgICAgICAvLyBOb3RpZnkgdGhlIG9ic2VydmVycyB0aGF0IHRoZSBzdG9yZSBjaGFuZ2VkXG4gICAgICAgICAgICB0aGlzLl9fZW1pdENoYW5nZSgpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdJbnZhbGlkIHZhbHVlcyBmb3Igc3RvcHBpbmcgdGhlIHByb2Nlc3MnKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFByb2Nlc3Nlc0NvbnN0YW50cy5SRU1PVkVfRlJPTV9TVE9QUElORzpcbiAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICBsb2dnZXIuaW5mbyhgUmVtb3ZpbmcgdGhlIHByb2Nlc3MgJyR7cGF5bG9hZC5uYW1lfScgWyR7cGF5bG9hZC5QSUR9XSBmcm9tIHRoZSBzdG9wcGluZyBsaXN0YClcblxuICAgICAgICB7XG4gICAgICAgICAgLy8gV2lsbCByZWNlaXZlIHBheWxvYWQuUElEIGFuZCBwYXlsb2FkLm5hbWVcbiAgICAgICAgICBjb25zdCB7IHJlc3VsdCB9ID0gdGhpcy52YWxpZGF0ZVByb2Nlc3NJZGVudGlmaWVyKHBheWxvYWQuUElELCBwYXlsb2FkLm5hbWUpXG4gICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy5fX3JlbW92ZUZyb21TdG9wcGluZ1Byb2Nlc3NlcyhwYXlsb2FkLlBJRCwgcGF5bG9hZC5uYW1lKVxuXG4gICAgICAgICAgICAvLyBOb3RpZnkgdGhlIG9ic2VydmVycyB0aGF0IHRoZSBzdG9yZSBjaGFuZ2VkXG4gICAgICAgICAgICB0aGlzLl9fZW1pdENoYW5nZSgpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdJbnZhbGlkIHZhbHVlcyBmb3Igc3RvcHBpbmcgdGhlIHByb2Nlc3MnKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFByb2Nlc3Nlc0NvbnN0YW50cy5SRU1PVkVfUFJPQ0VTUzpcbiAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICBsb2dnZXIuaW5mbyhgUmVtb3ZpbmcgdGhlIHByb2Nlc3MgJyR7cGF5bG9hZC5uYW1lfScgWyR7cGF5bG9hZC5QSUR9XWApXG5cbiAgICAgICAge1xuICAgICAgICAgIC8vIFdpbGwgcmVjZWl2ZSBwYXlsb2FkLlBJRCBhbmQgcGF5bG9hZC5uYW1lXG4gICAgICAgICAgY29uc3QgeyByZXN1bHQgfSA9IHRoaXMudmFsaWRhdGVQcm9jZXNzSWRlbnRpZmllcihwYXlsb2FkLlBJRCwgcGF5bG9hZC5uYW1lKVxuICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuX19jbGVhclByb2Nlc3MocGF5bG9hZC5QSUQsIHBheWxvYWQubmFtZSlcblxuICAgICAgICAgICAgLy8gTm90aWZ5IHRoZSBvYnNlcnZlcnMgdGhhdCB0aGUgc3RvcmUgY2hhbmdlZFxuICAgICAgICAgICAgdGhpcy5fX2VtaXRDaGFuZ2UoKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBDT05TT0xFIFRSQUNFXG4gICAgICAgICAgICBsb2dnZXIud2FybmluZygnSW52YWxpZCB2YWx1ZXMgZm9yIHJlbW92aW5nIHRoZSBwcm9jZXNzJylcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBQcm9jZXNzZXNDb25zdGFudHMuQ0hBTkdFX1BFUklPRDpcbiAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICBsb2dnZXIuaW5mbygnVXBkYXRpbmcgdGhlIHBlcmlvZC4uLicpXG5cbiAgICAgICAgLy8gV2lsbCByZWNlaXZlIHBheWxvYWQucGVyaW9kXG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC5wZXJpb2QgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgaWYgKHBheWxvYWQucGVyaW9kIDwgMCkgcGF5bG9hZC5wZXJpb2QgPSAwXG4gICAgICAgICAgdGhpcy5fX3VwZGF0ZVBlcmlvZCA9IHBheWxvYWQucGVyaW9kXG5cbiAgICAgICAgICAvLyBOb3RpZnkgdGhlIG9ic2VydmVycyB0aGF0IHRoZSBzdG9yZSBjaGFuZ2VkXG4gICAgICAgICAgdGhpcy5fX2VtaXRDaGFuZ2UoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgICBsb2dnZXIud2FybmluZygnSW52YWxpZCBwZXJpb2QnKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9XG59XG5cbi8vIEV4cG9ydGluZyB0aGlzIHdheSB0aGUgY2xhc3Mgd2lsbCBhY3QgYXMgYSBzaW5nbGV0b25cbmV4cG9ydCBkZWZhdWx0IG5ldyBQcm9jZXNzZXNTdG9yZShBcHBEaXNwYXRjaGVyKVxuIiwiaW1wb3J0IHtcbiAgLy8gQ29ubmVjdGlvblxuICBSRVNFVF9BR0VOVF9TVEFURSwgQ09OTl9BR0VOVF9SRVFVRVNULCBDT05OX0FHRU5UX1NVQ0NFU1MsIENPTk5fQUdFTlRfRkFJTFVSRSxcbiAgRElTQ09OTl9BR0VOVF9SRVFVRVNULCBESVNDT05OX0FHRU5UX1NVQ0NFU1MsIENMRUFSX0NPTk5fRVJST1IsXG4gIC8vIEF1dGhlbnRpY2F0aW9uXG4gIEFVVEhfQUdFTlRfUkVRVUVTVCwgQVVUSF9BR0VOVF9TVUNDRVNTLCBBVVRIX0FHRU5UX0ZBSUxVUkUsXG4gIFJFVk9LRV9BR0VOVF9BVVRILCBDTEVBUl9BVVRIX0VSUk9SLFxuICAvLyBUZW1wb3JhcnkgcGFzc1xuICBURU1QX1BBU1NfUkVRVUVTVCwgVEVNUF9QQVNTX1NVQ0NFU1MsIFRFTVBfUEFTU19GQUlMVVJFLFxuICAvLyBEYXRhXG4gIEZFVENIX0FHRU5UX1JFUVVFU1QsIEZFVENIX0FHRU5UX1NVQ0NFU1MsIEZFVENIX0FHRU5UX0ZBSUxVUkUsXG4gIENMRUFSX0FHRU5UX0VSUk9SXG59IGZyb20gJy4uL2NvbnN0YW50cy9hZ2VudCdcblxuLy8gVGVtcG9yYXJ5IHBhc3MgdG8gc2hhcmUgYWNjZXNzXG5jb25zdCBpbml0aWFsVGVtcFBhc3NTdGF0ZSA9IHtcbiAgZXJyb3I6IGZhbHNlLFxuICBlcnJvck1lc3NhZ2U6ICcnLFxuICBmZXRjaGluZzogZmFsc2UsXG4gIGV4cGlyZXNBdDogbnVsbCxcbiAgZGF0YTogbnVsbFxufVxuXG5jb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gIGlkOiAnJyxcbiAgLy8gQ29ubmVjdGlvblxuICBpc0Nvbm5lY3Rpbmc6IGZhbHNlLFxuICBpc0Rpc2Nvbm5lY3Rpbmc6IGZhbHNlLFxuICBpc0Nvbm5lY3RlZDogZmFsc2UsXG4gIGNvbm5lY3RlZEF0OiBudWxsLFxuICBjb25uZWN0aW9uRXJyb3I6IGZhbHNlLFxuICBjb25uZWN0aW9uRXJyb3JDb2RlOiBudWxsLFxuICBjb25uZWN0aW9uRXJyb3JNZXNzYWdlOiBudWxsLFxuICAvLyBBdXRoZW50aWNhdGlvblxuICBpc0F1dGhlbnRpY2F0aW5nOiBmYWxzZSxcbiAgaXNBdXRoZW50aWNhdGVkOiBmYWxzZSxcbiAgYXV0aGVudGljYXRpb25FcnJvcjogZmFsc2UsXG4gIGF1dGhlbnRpY2F0aW9uRXJyb3JDb2RlOiBudWxsLFxuICBhdXRoZW50aWNhdGlvbkVycm9yTWVzc2FnZTogbnVsbCxcbiAgLy8gVGVtcG9yYXJ5IHBhc3MgdG8gc2hhcmUgYWNjZXNzXG4gIHRlbXBQYXNzOiBpbml0aWFsVGVtcFBhc3NTdGF0ZSxcbiAgLy8gRGF0YVxuICB1cHRpbWU6IDAsXG4gIHZlcnNpb246ICcnLFxuICBhZGRyZXNzOiAnJyxcbiAgaG9zdG5hbWU6ICcnLFxuICBkZXNjcmlwdGlvbjogJycsXG4gIGxhbmd1YWdlOiAnJyxcbiAgb3M6ICd1bmtub3duJyxcbiAgb3NWZXJzaW9uOiAnJyxcbiAgYXJjaGl0ZWN0dXJlOiAnJyxcbiAgY3B1RGVzY3JpcHRpb246ICcnLFxuICByYW06IDAsXG4gIGhkZDogMCxcbiAgaXNGZXRjaGluZzogZmFsc2UsXG4gIHJlY2VpdmVkQXQ6IG51bGwsXG4gIGVycm9yOiBmYWxzZSxcbiAgZXJyb3JDb2RlOiBudWxsLFxuICBlcnJvck1lc3NhZ2U6IG51bGxcbn1cblxuY29uc3QgdGVtcFBhc3NSZWR1Y2VyID0gKHN0YXRlID0gaW5pdGlhbFRlbXBQYXNzU3RhdGUsIGFjdGlvbikgPT4ge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBURU1QX1BBU1NfUkVRVUVTVDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBpbml0aWFsVGVtcFBhc3NTdGF0ZSwgeyBmZXRjaGluZzogdHJ1ZSB9KVxuICAgIGNhc2UgVEVNUF9QQVNTX1NVQ0NFU1M6XG4gICAgICBjb25zdCB7IHBhc3MsIGV4cGlyZXNBdCB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBpbml0aWFsVGVtcFBhc3NTdGF0ZSwgeyBwYXNzLCBleHBpcmVzQXQgfSlcbiAgICBjYXNlIFRFTVBfUEFTU19GQUlMVVJFOlxuICAgICAgY29uc3QgeyBlcnJvciwgZXJyb3JNZXNzYWdlIH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGluaXRpYWxUZW1wUGFzc1N0YXRlLCB7IGVycm9yLCBlcnJvck1lc3NhZ2UgfSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24pID0+IHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgUkVTRVRfQUdFTlRfU1RBVEU6XG4gICAgICByZXR1cm4gaW5pdGlhbFN0YXRlXG4gICAgLy8gQ29ubmVjdGlvblxuICAgIGNhc2UgQ09OTl9BR0VOVF9SRVFVRVNUOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGlzQ29ubmVjdGluZzogdHJ1ZSxcbiAgICAgICAgaXNDb25uZWN0ZWQ6IGZhbHNlXG4gICAgICB9KVxuICAgIGNhc2UgQ09OTl9BR0VOVF9TVUNDRVNTOlxuICAgICAgY29uc3QgeyBjb25uZWN0ZWRBdCB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc0Nvbm5lY3Rpbmc6IGZhbHNlLFxuICAgICAgICBpc0Nvbm5lY3RlZDogdHJ1ZSxcbiAgICAgICAgY29ubmVjdGVkQXRcbiAgICAgIH0pXG4gICAgY2FzZSBDT05OX0FHRU5UX0ZBSUxVUkU6XG4gICAgICBjb25zdCB7IGVycm9yQ29kZSwgZXJyb3JNZXNzYWdlIH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGlzQ29ubmVjdGluZzogZmFsc2UsXG4gICAgICAgIGlzQ29ubmVjdGVkOiBmYWxzZSxcbiAgICAgICAgY29ubmVjdGlvbkVycm9yOiB0cnVlLFxuICAgICAgICBjb25uZWN0aW9uRXJyb3JDb2RlOiBlcnJvckNvZGUsXG4gICAgICAgIGNvbm5lY3Rpb25FcnJvck1lc3NhZ2U6IGVycm9yTWVzc2FnZVxuICAgICAgfSlcbiAgICBjYXNlIERJU0NPTk5fQUdFTlRfUkVRVUVTVDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc0Rpc2Nvbm5lY3Rpbmc6IHRydWVcbiAgICAgIH0pXG4gICAgY2FzZSBESVNDT05OX0FHRU5UX1NVQ0NFU1M6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgaXNEaXNjb25uZWN0aW5nOiBmYWxzZSxcbiAgICAgICAgaXNDb25uZWN0ZWQ6IGZhbHNlXG4gICAgICB9KVxuICAgIGNhc2UgQ0xFQVJfQ09OTl9FUlJPUjpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBjb25uZWN0aW9uRXJyb3I6IGluaXRpYWxTdGF0ZS5jb25uZWN0aW9uRXJyb3IsXG4gICAgICAgIGNvbm5lY3Rpb25FcnJvckNvZGU6IGluaXRpYWxTdGF0ZS5jb25uZWN0aW9uRXJyb3JDb2RlLFxuICAgICAgICBjb25uZWN0aW9uRXJyb3JNZXNzYWdlOiBpbml0aWFsU3RhdGUuY29ubmVjdGlvbkVycm9yTWVzc2FnZVxuICAgICAgfSlcbiAgICAvLyBBdXRoZW50aWNhdGlvblxuICAgIGNhc2UgUkVWT0tFX0FHRU5UX0FVVEg6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgaXNBdXRoZW50aWNhdGluZzogZmFsc2UsXG4gICAgICAgIGlzQXV0aGVudGljYXRlZDogZmFsc2VcbiAgICAgIH0pXG4gICAgY2FzZSBBVVRIX0FHRU5UX1JFUVVFU1Q6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgaXNBdXRoZW50aWNhdGluZzogdHJ1ZSxcbiAgICAgICAgaXNBdXRoZW50aWNhdGVkOiBmYWxzZVxuICAgICAgfSlcbiAgICBjYXNlIEFVVEhfQUdFTlRfU1VDQ0VTUzpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc0F1dGhlbnRpY2F0aW5nOiBmYWxzZSxcbiAgICAgICAgaXNBdXRoZW50aWNhdGVkOiB0cnVlXG4gICAgICB9KVxuICAgIGNhc2UgQVVUSF9BR0VOVF9GQUlMVVJFOlxuICAgICAge1xuICAgICAgICBjb25zdCB7IGVycm9yQ29kZSwgZXJyb3JNZXNzYWdlIH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgICBpc0F1dGhlbnRpY2F0aW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0F1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGF1dGhlbnRpY2F0aW9uRXJyb3I6IHRydWUsXG4gICAgICAgICAgYXV0aGVudGljYXRpb25FcnJvckNvZGU6IGVycm9yQ29kZSxcbiAgICAgICAgICBhdXRoZW50aWNhdGlvbkVycm9yTWVzc2FnZTogZXJyb3JNZXNzYWdlXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgY2FzZSBDTEVBUl9BVVRIX0VSUk9SOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGF1dGhlbnRpY2F0aW9uRXJyb3I6IGluaXRpYWxTdGF0ZS5hdXRoZW50aWNhdGlvbkVycm9yLFxuICAgICAgICBhdXRoZW50aWNhdGlvbkVycm9yQ29kZTogaW5pdGlhbFN0YXRlLmF1dGhlbnRpY2F0aW9uRXJyb3JDb2RlLFxuICAgICAgICBhdXRoZW50aWNhdGlvbkVycm9yTWVzc2FnZTogaW5pdGlhbFN0YXRlLmF1dGhlbnRpY2F0aW9uRXJyb3JNZXNzYWdlXG4gICAgICB9KVxuICAgIC8vIFRlbXBvcmFyeSBwYXNzXG4gICAgY2FzZSBURU1QX1BBU1NfUkVRVUVTVDpcbiAgICBjYXNlIFRFTVBfUEFTU19TVUNDRVNTOlxuICAgIGNhc2UgVEVNUF9QQVNTX0ZBSUxVUkU6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgdGVtcFBhc3M6IHRlbXBQYXNzUmVkdWNlcihzdGF0ZS50ZW1wUGFzcywgYWN0aW9uKVxuICAgICAgfSlcbiAgICAvLyBEYXRhXG4gICAgY2FzZSBGRVRDSF9BR0VOVF9SRVFVRVNUOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGlzRmV0Y2hpbmc6IHRydWVcbiAgICAgIH0pXG4gICAgY2FzZSBGRVRDSF9BR0VOVF9TVUNDRVNTOlxuICAgICAgY29uc3QgeyBkYXRhLCByZWNlaXZlZEF0IH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgY29uc3Qge1xuICAgICAgICBpZCwgdXB0aW1lLCB2ZXJzaW9uLCBhZGRyZXNzLCBob3N0bmFtZSwgZGVzY3JpcHRpb24sXG4gICAgICAgIGxhbmd1YWdlLCBvcywgb3NWZXJzaW9uLCBhcmNoaXRlY3R1cmUsIGNwdURlc2NyaXB0aW9uLCByYW0sIGhkZFxuICAgICAgfSA9IGRhdGFcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc0ZldGNoaW5nOiBmYWxzZSxcbiAgICAgICAgcmVjZWl2ZWRBdCxcbiAgICAgICAgaWQsXG4gICAgICAgIHVwdGltZSxcbiAgICAgICAgdmVyc2lvbixcbiAgICAgICAgYWRkcmVzcyxcbiAgICAgICAgaG9zdG5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICBsYW5ndWFnZSxcbiAgICAgICAgb3MsXG4gICAgICAgIG9zVmVyc2lvbixcbiAgICAgICAgYXJjaGl0ZWN0dXJlLFxuICAgICAgICBjcHVEZXNjcmlwdGlvbixcbiAgICAgICAgcmFtLFxuICAgICAgICBoZGRcbiAgICAgIH0pXG4gICAgY2FzZSBGRVRDSF9BR0VOVF9GQUlMVVJFOlxuICAgICAge1xuICAgICAgICBjb25zdCB7IGVycm9yQ29kZSwgZXJyb3JNZXNzYWdlIH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgICBpc0ZldGNoaW5nOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgICBlcnJvckNvZGUsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgY2FzZSBDTEVBUl9BR0VOVF9FUlJPUjpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBlcnJvcjogZmFsc2UsXG4gICAgICAgIGVycm9yQ29kZTogbnVsbCxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBudWxsXG4gICAgICB9KVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGVcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgVVBEQVRFX0xPR09fVVJMLFxuICBTSE9XX0hFQURFUiwgSElERV9IRUFERVIsXG4gIFVQREFURV9ESVNDT05ORUNUX0hBTkRMRVJcbn0gZnJvbSAnLi4vY29uc3RhbnRzL2FwcCdcblxuaW1wb3J0IHNlY3Rpb25zUmVkdWNlciwge1xuICBnZXRBY3RpdmVTZWN0aW9uIGFzIGdldEFjdGl2ZVNlY3Rpb25VdGlsLFxuICBnZXRTZWN0aW9uIGFzIGdldFNlY3Rpb25VdGlsLFxuICBnZXRTZWN0aW9ucyBhcyBnZXRTZWN0aW9uc1V0aWwsXG4gIGdldEZpcnN0QWN0aXZlIGFzIGdldEZpcnN0QWN0aXZlVXRpbFxufSBmcm9tICcuLi9yZWR1Y2Vycy9zZWN0aW9ucydcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2ZVNlY3Rpb24gKHN0YXRlKSB7XG4gIHJldHVybiBnZXRBY3RpdmVTZWN0aW9uVXRpbChzdGF0ZS5zZWN0aW9ucylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNlY3Rpb24gKHN0YXRlLCBrZXkpIHtcbiAgcmV0dXJuIGdldFNlY3Rpb25VdGlsKHN0YXRlLnNlY3Rpb25zLCBrZXkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZWN0aW9ucyAoc3RhdGUpIHtcbiAgcmV0dXJuIGdldFNlY3Rpb25zVXRpbChzdGF0ZS5zZWN0aW9ucylcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpcnN0QWN0aXZlIChzdGF0ZSkge1xuICByZXR1cm4gZ2V0Rmlyc3RBY3RpdmVVdGlsKHN0YXRlLnNlY3Rpb25zKVxufVxuXG5leHBvcnQgZGVmYXVsdCAoc3RhdGUgPSB7XG4gIGxvZ29VUkw6ICcnLFxuICBzaG93SGVhZGVyOiB0cnVlLFxuICBhZ2VudExhc3RDb250YWN0OiAwLFxuICBhZ2VudElzQnVzeTogZmFsc2UsXG4gIGhhbmRsZURpc2Nvbm5lY3Q6ICgpID0+IHt9LFxuICBoYW5kbGVUZW1wUGFzc0dlbmVyYXRlZDogbnVsbCxcbiAgcGFzczogbnVsbCxcbiAgdG1wUGFzczogbnVsbFxufSwgYWN0aW9uKSA9PiB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIFVQREFURV9MT0dPX1VSTDpcbiAgICAgIGNvbnN0IHsgbG9nb1VSTCB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBsb2dvVVJMXG4gICAgICB9KVxuICAgIGNhc2UgU0hPV19IRUFERVI6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgc2hvd0hlYWRlcjogdHJ1ZVxuICAgICAgfSlcbiAgICBjYXNlIEhJREVfSEVBREVSOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIHNob3dIZWFkZXI6IGZhbHNlXG4gICAgICB9KVxuICAgIGNhc2UgVVBEQVRFX0RJU0NPTk5FQ1RfSEFORExFUjpcbiAgICAgIGNvbnN0IHsgaGFuZGxlRGlzY29ubmVjdCB9ID0gdGhpcy5wYXlsb2FkXG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgaGFuZGxlRGlzY29ubmVjdFxuICAgICAgfSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIHNlY3Rpb25zOiBzZWN0aW9uc1JlZHVjZXIoc3RhdGUuc2VjdGlvbnMsIGFjdGlvbilcbiAgICAgIH0pXG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIFJFU0VUX0RJU1BMQVlfU1RBVEUsIFVQREFURV9ESVNQTEFZX0RBVEEsIENMRUFSX0RJU1BMQVlfRVJST1IsXG4gIENPTk5fRElTUExBWV9SRVFVRVNULCBDT05OX0RJU1BMQVlfU1VDQ0VTUywgQ09OTl9ESVNQTEFZX0ZBSUxVUkUsXG4gIERJU0NPTk5fRElTUExBWV9SRVFVRVNULCBESVNDT05OX0RJU1BMQVlfU1VDQ0VTU1xufSBmcm9tICcuLi9jb25zdGFudHMvZGlzcGxheSdcblxuY29uc3QgaW5pdGlhbFN0YXRlID0ge1xuICB0cnVlQ29sb3I6IHRydWUsXG4gIGxvY2FsQ3Vyc29yOiB0cnVlLFxuICBzaGFyZWQ6IHRydWUsXG4gIHZpZXdPbmx5OiBmYWxzZSxcbiAgaXNDb25uZWN0aW5nOiBmYWxzZSxcbiAgaXNEaXNjb25uZWN0aW5nOiBmYWxzZSxcbiAgaXNDb25uZWN0ZWQ6IGZhbHNlLFxuICBlcnJvcjogZmFsc2UsXG4gIGVycm9yQ29kZTogbnVsbCxcbiAgZXJyb3JNZXNzYWdlOiBudWxsXG59XG5cbmV4cG9ydCBkZWZhdWx0IChzdGF0ZSA9IGluaXRpYWxTdGF0ZSwgYWN0aW9uKSA9PiB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIFJFU0VUX0RJU1BMQVlfU1RBVEU6XG4gICAgICByZXR1cm4gaW5pdGlhbFN0YXRlXG4gICAgY2FzZSBDT05OX0RJU1BMQVlfUkVRVUVTVDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc0Nvbm5lY3Rpbmc6IHRydWUsXG4gICAgICAgIGlzRGlzY29ubmVjdGluZzogZmFsc2UsXG4gICAgICAgIGlzQ29ubmVjdGVkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IGluaXRpYWxTdGF0ZS5lcnJvcixcbiAgICAgICAgZXJyb3JDb2RlOiBpbml0aWFsU3RhdGUuZXJyb3JDb2RlLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IGluaXRpYWxTdGF0ZS5lcnJvck1lc3NhZ2VcbiAgICAgIH0pXG4gICAgY2FzZSBDT05OX0RJU1BMQVlfU1VDQ0VTUzpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc0Nvbm5lY3Rpbmc6IGZhbHNlLFxuICAgICAgICBpc0Rpc2Nvbm5lY3Rpbmc6IGZhbHNlLFxuICAgICAgICBpc0Nvbm5lY3RlZDogdHJ1ZVxuICAgICAgfSlcbiAgICBjYXNlIENPTk5fRElTUExBWV9GQUlMVVJFOlxuICAgICAge1xuICAgICAgICBjb25zdCB7IGVycm9yQ29kZSwgZXJyb3JNZXNzYWdlIH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgICBpc0Nvbm5lY3Rpbmc6IGZhbHNlLFxuICAgICAgICAgIGlzRGlzY29ubmVjdGluZzogZmFsc2UsXG4gICAgICAgICAgaXNDb25uZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB0cnVlLFxuICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICBlcnJvck1lc3NhZ2VcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICBjYXNlIERJU0NPTk5fRElTUExBWV9SRVFVRVNUOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGlzQ29ubmVjdGluZzogZmFsc2UsXG4gICAgICAgIGlzRGlzY29ubmVjdGluZzogdHJ1ZVxuICAgICAgfSlcbiAgICBjYXNlIERJU0NPTk5fRElTUExBWV9TVUNDRVNTOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGlzQ29ubmVjdGluZzogZmFsc2UsXG4gICAgICAgIGlzRGlzY29ubmVjdGluZzogZmFsc2UsXG4gICAgICAgIGlzQ29ubmVjdGVkOiBmYWxzZVxuICAgICAgfSlcbiAgICBjYXNlIFVQREFURV9ESVNQTEFZX0RBVEE6XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IGFjdGlvbi5wYXlsb2FkXG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIGRhdGEpXG4gICAgY2FzZSBDTEVBUl9ESVNQTEFZX0VSUk9SOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGVycm9yOiBpbml0aWFsU3RhdGUuZXJyb3IsXG4gICAgICAgIGVycm9yQ29kZTogaW5pdGlhbFN0YXRlLmVycm9yQ29kZSxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBpbml0aWFsU3RhdGUuZXJyb3JNZXNzYWdlXG4gICAgICB9KVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGVcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ0hBTkdFX0RJUl9GSUxFUyxcbiAgRkVUQ0hfRklMRVNfUkVRVUVTVCwgRkVUQ0hfRklMRVNfU1VDQ0VTUywgRkVUQ0hfRklMRVNfRkFJTFVSRSxcbiAgRkVUQ0hfRklMRV9TVUNDRVNTLFxuICBERUxFVEVfRklMRV9SRVFVRVNULCBERUxFVEVfRklMRV9TVUNDRVNTLCBERUxFVEVfRklMRV9GQUlMVVJFLFxuICBDTEVBUl9GSUxFU19FUlJPUiwgQ0xFQVJfRklMRV9FUlJPUixcbiAgRE9XTkxPQURfRklMRV9GQUlMVVJFLCBDTEVBUl9ET1dOTE9BRF9GSUxFX0VSUk9SLFxuICBVUExPQURfRklMRV9GQUlMVVJFLCBDTEVBUl9VUExPQURfRklMRV9FUlJPUlxufSBmcm9tICcuLi9jb25zdGFudHMvZmlsZXMnXG5cbmltcG9ydCB0b1BhdGhBcnJheSBmcm9tICcuLi9saWIvZmlsZXMvcGF0aC1hcnJheSdcblxuLyogKiAqIFNFTEVDVE9SUyAqICogKi9cblxuZXhwb3J0IGNvbnN0IGdldEN1cnJlbnRQYXRoQXJyYXkgPSAoeyBwYXRoQXJyYXkgfSkgPT4gcGF0aEFycmF5XG5cbmNvbnN0IFRZUEVfRklMRSA9ICdUWVBFX0ZJTEUnXG5jb25zdCBUWVBFX0RJUiA9ICdUWVBFX0RJUidcbmNvbnN0IFRZUEVfQUxMID0gJ1RZUEVfQUxMJ1xuZXhwb3J0IGNvbnN0IGdldEl0ZW0gPSAoc3RhdGUsIHBhdGgsIHR5cGUgPSBUWVBFX0FMTCkgPT4ge1xuICBpZiAoIXBhdGggfHwgcGF0aC5sZW5ndGggPT09IDApIFR5cGVFcnJvcignUGF0aCByZXF1aXJlZCcpXG4gIGNvbnN0IHBhdGhBcnJheSA9ICh0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycpID8gdG9QYXRoQXJyYXkocGF0aCkgOiBwYXRoXG5cbiAgaWYgKHBhdGhBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgWyBiYXNlbmFtZSwgLi4ubmV3UGF0aEFycmF5IF0gPSBwYXRoQXJyYXlcblxuICAgIGNvbnN0IGl0ZW0gPSAoc3RhdGUuaXRlbXMgfHwgc3RhdGUpLmJ5QmFzZW5hbWVbYmFzZW5hbWVdXG4gICAgaWYgKG5ld1BhdGhBcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgIGlmICh0eXBlID09PSBUWVBFX0FMTCB8fFxuICAgICAgICAgICh0eXBlID09PSBUWVBFX0ZJTEUgJiYgaXRlbS5pc0ZpbGUpIHx8XG4gICAgICAgICAgKHR5cGUgPT09IFRZUEVfRElSICYmIGl0ZW0uaXNEaXIpIHx8XG4gICAgICAgICAgKHR5cGUgPT09IFRZUEVfRElSICYmIGl0ZW0uaXNEcml2ZSkpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGl0ZW0uaXNEaXIgfHwgaXRlbS5pc0RyaXZlKSB7XG4gICAgICAgIC8vIEByZWN1cnNpdmVcbiAgICAgICAgcmV0dXJuIGdldEl0ZW0oaXRlbS5pdGVtcywgbmV3UGF0aEFycmF5LCB0eXBlKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZ2V0RmlsZSA9ICguLi5hcmdzKSA9PiBnZXRJdGVtKC4uLmFyZ3MsIFRZUEVfRklMRSlcblxuZXhwb3J0IGNvbnN0IGdldERpciA9ICguLi5hcmdzKSA9PiBnZXRJdGVtKC4uLmFyZ3MsIFRZUEVfRElSKVxuXG5leHBvcnQgY29uc3QgZ2V0SXRlbXNNZXRhZGF0YSA9IChzdGF0ZSwgcGF0aCA9ICcnKSA9PiB7XG4gIGNvbnN0IHBhdGhBcnJheSA9ICh0eXBlb2YgcGF0aCA9PT0gJ3N0cmluZycpID8gdG9QYXRoQXJyYXkocGF0aCkgOiBwYXRoXG4gIHJldHVybiAocGF0aEFycmF5Lmxlbmd0aCA+IDApXG4gICAgPyAoZ2V0RGlyKHN0YXRlLCBwYXRoQXJyYXkpIHx8IHt9KS5pdGVtc1xuICAgIDogc3RhdGUuaXRlbXNcbn1cblxuZXhwb3J0IGNvbnN0IGdldEl0ZW1zID0gKHN0YXRlLCBwYXRoID0gJycsIHR5cGUgPSBUWVBFX0FMTCkgPT4ge1xuICBjb25zdCBwYXRoQXJyYXkgPSAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSA/IHRvUGF0aEFycmF5KHBhdGgpIDogcGF0aFxuXG4gIGNvbnN0IGl0ZW1zID0gZ2V0SXRlbXNNZXRhZGF0YShzdGF0ZSwgcGF0aEFycmF5KVxuXG4gIGlmICghaXRlbXMpIHJldHVybiBbXVxuXG4gIC8vIFJldHVybiB0aGUgaXRlbXNcbiAgcmV0dXJuIGl0ZW1zLmJhc2VuYW1lc1xuICAgIC5tYXAoKGIpID0+IGl0ZW1zLmJ5QmFzZW5hbWVbYl0pXG4gICAgLmZpbHRlcigoaSkgPT4gKFxuICAgICAgdHlwZSA9PT0gVFlQRV9BTEwgfHxcbiAgICAgICAgKHR5cGUgPT09IFRZUEVfRklMRSAmJiBpLmlzRmlsZSkgfHxcbiAgICAgICAgKHR5cGUgPT09IFRZUEVfRElSICYmIGkuaXNEaXIpIHx8XG4gICAgICAgICh0eXBlID09PSBUWVBFX0RJUiAmJiBpLmlzRHJpdmUpXG4gICAgKSlcbn1cblxuY29uc3QgaXNJdGVtRXJyb3IgPSAoeyBlcnJvciB9KSA9PiBlcnJvclxuY29uc3QgaXRlbUVycm9yID0gKHsgcGF0aCwgZXJyb3JDb2RlOiBjb2RlLCBlcnJvck1lc3NhZ2U6IG1lc3NhZ2UgfSkgPT4gKHtcbiAgcGF0aCwgY29kZSwgbWVzc2FnZVxufSlcbmV4cG9ydCBjb25zdCBnZXRJdGVtc0Vycm9ycyA9ICguLi5hcmdzKSA9PiBnZXRJdGVtcyguLi5hcmdzKVxuICAuZmlsdGVyKGlzSXRlbUVycm9yKS5tYXAoaXRlbUVycm9yKVxuXG5jb25zdCBnZXRFcnJvcnMgPSAoZXJyb3JzKSA9PiBlcnJvcnMucGF0aHMubWFwKChwYXRoKSA9PiAoe1xuICBwYXRoLFxuICAuLi5lcnJvcnMuYnlQYXRoW3BhdGhdXG59KSlcbmV4cG9ydCBjb25zdCBnZXREb3dubG9hZEVycm9ycyA9IChzdGF0ZSkgPT4gZ2V0RXJyb3JzKHN0YXRlLmRvd25sb2Fkcy5lcnJvcnMpXG5leHBvcnQgY29uc3QgZ2V0VXBsb2FkRXJyb3JzID0gKHN0YXRlKSA9PiBnZXRFcnJvcnMoc3RhdGUudXBsb2Fkcy5lcnJvcnMpXG5cbi8qICogKiBSRURVQ0VSUyAqICogKi9cblxuY29uc3QgaW5pdGlhbEZpbGVTdGF0ZSA9IHtcbiAgc2VwYXJhdG9yOiAnLycsXG4gIHBhdGg6ICcnLFxuICBkaXJuYW1lOiAnJyxcbiAgYmFzZW5hbWU6ICcnLFxuICBsYXN0TW9kaWZpY2F0aW9uOiBudWxsLFxuXG4gIGlzRmlsZTogZmFsc2UsXG4gIG1pbWVUeXBlOiBudWxsLFxuICBzaXplOiBudWxsLFxuICBjYW5CZURlbGV0ZWQ6IGZhbHNlLFxuXG4gIGlzRGlyOiBmYWxzZSxcbiAgaXNEcml2ZTogZmFsc2UsXG4gIGl0ZW1zOiB1bmRlZmluZWQsIC8vIGl0ZW1zUmVkdWNlclxuXG4gIGlzV3JpdGFibGU6IGZhbHNlLFxuICBpc1JlYWRhYmxlOiBmYWxzZSxcbiAgaXNQb3NpeDogZmFsc2UsXG4gIGlzV2luOiBmYWxzZSxcblxuICBpc0RlbGV0aW5nOiBmYWxzZSxcbiAgZXJyb3I6IGZhbHNlLFxuICBlcnJvckNvZGU6IG51bGwsXG4gIGVycm9yTWVzc2FnZTogbnVsbFxufVxuXG5jb25zdCBmaWxlUmVkdWNlciA9IChzdGF0ZSA9IGluaXRpYWxGaWxlU3RhdGUsIGFjdGlvbikgPT4ge1xuICBpZiAoIWFjdGlvbi5wYXlsb2FkKSByZXR1cm4gc3RhdGVcbiAgY29uc3QgeyBwYXRoQXJyYXkgPSBbXSB9ID0gYWN0aW9uLnBheWxvYWRcblxuICAvLyBVcGRhdGUgdGhpcyBsZXZlbFxuICBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgRkVUQ0hfRklMRV9TVUNDRVNTOlxuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGFjdGlvbi5wYXlsb2FkXG4gICAgICAgIC8vIGNvbnN0IHsgIH0gPSBkYXRhXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAvLyBJbml0IHRoZSBjaGlsZHJlbiByZWR1Y2VyXG4gICAgICAgICAgaXRlbXM6IChkYXRhLmlzRGlyIHx8IGRhdGEuaXNEcml2ZSlcbiAgICAgICAgICAgID8gaXRlbXNSZWR1Y2VyKHN0YXRlLml0ZW1zLCB7IHR5cGU6IG51bGwgfSlcbiAgICAgICAgICAgIDogc3RhdGUuaXRlbXMsXG4gICAgICAgICAgZXJyb3I6IGluaXRpYWxTdGF0ZS5lcnJvcixcbiAgICAgICAgICBlcnJvckNvZGU6IGluaXRpYWxTdGF0ZS5lcnJvckNvZGUsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBpbml0aWFsU3RhdGUuZXJyb3JNZXNzYWdlXG4gICAgICAgIH1cbiAgICAgIGNhc2UgRkVUQ0hfRklMRVNfU1VDQ0VTUzpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAvLyBTYXZlIGludG8gdGhlIGNoaWxkcmVuIHJlZHVjZXJcbiAgICAgICAgICBpdGVtczogKHN0YXRlLmlzRGlyIHx8IHN0YXRlLmlzRHJpdmUpXG4gICAgICAgICAgICA/IGl0ZW1zUmVkdWNlcihzdGF0ZS5pdGVtcywgYWN0aW9uKVxuICAgICAgICAgICAgOiBzdGF0ZS5pdGVtc1xuICAgICAgICB9XG4gICAgICBjYXNlIERFTEVURV9GSUxFX1JFUVVFU1Q6XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgaXNEZWxldGluZzogdHJ1ZSxcbiAgICAgICAgICBlcnJvcjogaW5pdGlhbFN0YXRlLmVycm9yLFxuICAgICAgICAgIGVycm9yQ29kZTogaW5pdGlhbFN0YXRlLmVycm9yQ29kZSxcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGluaXRpYWxTdGF0ZS5lcnJvck1lc3NhZ2VcbiAgICAgICAgfVxuICAgICAgY2FzZSBERUxFVEVfRklMRV9GQUlMVVJFOlxuICAgICAgICBjb25zdCB7IGVycm9yQ29kZSwgZXJyb3JNZXNzYWdlIH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIGlzRGVsZXRpbmc6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB0cnVlLFxuICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICBlcnJvck1lc3NhZ2VcbiAgICAgICAgfVxuICAgICAgY2FzZSBDTEVBUl9GSUxFX0VSUk9SOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIGVycm9yOiBpbml0aWFsU3RhdGUuZXJyb3IsXG4gICAgICAgICAgZXJyb3JDb2RlOiBpbml0aWFsU3RhdGUuZXJyb3JDb2RlLFxuICAgICAgICAgIGVycm9yTWVzc2FnZTogaW5pdGlhbFN0YXRlLmVycm9yTWVzc2FnZVxuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIGl0ZW1zOiAoc3RhdGUuaXNEaXIgfHwgc3RhdGUuaXNEcml2ZSlcbiAgICAgICAgICAgID8gaXRlbXNSZWR1Y2VyKHN0YXRlLml0ZW1zLCBhY3Rpb24pXG4gICAgICAgICAgICA6IHN0YXRlLml0ZW1zXG4gICAgICAgIH1cbiAgICB9XG4gIC8vIFByb3BhZ2F0ZSB0aGUgYWN0aW9uXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChzdGF0ZS5pc0RpciB8fCBzdGF0ZS5pc0RyaXZlKVxuICAgICAgPyB7IC4uLnN0YXRlLCBpdGVtczogaXRlbXNSZWR1Y2VyKHN0YXRlLml0ZW1zLCBhY3Rpb24pIH1cbiAgICAgIDogc3RhdGVcbiAgfVxufVxuXG5jb25zdCBmaWxlc0J5QmFzZW5hbWVSZWR1Y2VyID0gKHN0YXRlID0ge30sIGFjdGlvbikgPT4ge1xuICBpZiAoIWFjdGlvbi5wYXlsb2FkKSByZXR1cm4gc3RhdGVcbiAgY29uc3QgeyBwYXRoQXJyYXk6IFsgYmFzZW5hbWUsIC4uLnBhdGhBcnJheSBdID0gW10gfSA9IGFjdGlvbi5wYXlsb2FkXG5cbiAgaWYgKGJhc2VuYW1lKSB7XG4gICAgLy8gVXBkYXRlIGEgaXRlbSBvZiB0aGlzIGxldmVsXG4gICAgaWYgKHBhdGhBcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgICAgY2FzZSBERUxFVEVfRklMRV9TVUNDRVNTOlxuICAgICAgICAgIGNvbnN0IHsgW2Jhc2VuYW1lXTogaXRlbSwgLi4ucmVzdCB9ID0gc3RhdGVcbiAgICAgICAgICByZXR1cm4gKGl0ZW0pID8gcmVzdCA6IHN0YXRlXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgW2Jhc2VuYW1lXTogZmlsZVJlZHVjZXIoc3RhdGVbYmFzZW5hbWVdLCB7XG4gICAgICAgICAgICAgIC4uLmFjdGlvbixcbiAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgIC4uLmFjdGlvbi5wYXlsb2FkLFxuICAgICAgICAgICAgICAgIHBhdGhBcnJheTogW11cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgLy8gUHJvcGFnYXRlIHRoZSBhY3Rpb25cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIFtiYXNlbmFtZV06IGZpbGVSZWR1Y2VyKHN0YXRlW2Jhc2VuYW1lXSwge1xuICAgICAgICAgIC4uLmFjdGlvbixcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAuLi5hY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgICAgIHBhdGhBcnJheVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIC8vIFVwZGF0ZSB0aGlzIGxldmVsXG4gIH0gZWxzZSB7XG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgY2FzZSBGRVRDSF9GSUxFU19TVUNDRVNTOlxuICAgICAgICBjb25zdCB7IGl0ZW1zIH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgICByZXR1cm4gaXRlbXMucmVkdWNlKChhY2MsIGl0ZW0pID0+ICh7XG4gICAgICAgICAgLi4uYWNjLFxuICAgICAgICAgIFtpdGVtLmJhc2VuYW1lXTogZmlsZVJlZHVjZXIoc3RhdGVbaXRlbS5iYXNlbmFtZV0sIHtcbiAgICAgICAgICAgIC4uLmFjdGlvbixcbiAgICAgICAgICAgIHR5cGU6IEZFVENIX0ZJTEVfU1VDQ0VTUyxcbiAgICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgICAgLi4uYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgICAgIGRhdGE6IGl0ZW1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9KSwge30pXG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gc3RhdGVcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgZmlsZXNCYXNlbmFtZXNSZWR1Y2VyID0gKHN0YXRlID0gW10sIGFjdGlvbikgPT4ge1xuICBpZiAoIWFjdGlvbi5wYXlsb2FkKSByZXR1cm4gc3RhdGVcbiAgY29uc3QgeyBwYXRoQXJyYXk6IFsgYmFzZW5hbWUsIC4uLnBhdGhBcnJheSBdID0gW10gfSA9IGFjdGlvbi5wYXlsb2FkXG4gIC8vIE9ubHkgYWxsb3cgdGhlIGVkaXRpb24gb2YgdGhpcyBsZXZlbFxuICBpZiAocGF0aEFycmF5Lmxlbmd0aCA+IDApIHJldHVybiBzdGF0ZVxuXG4gIGlmIChiYXNlbmFtZSkge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgREVMRVRFX0ZJTEVfU1VDQ0VTUzpcbiAgICAgICAgY29uc3QgaW5kZXggPSBzdGF0ZS5pbmRleE9mKGJhc2VuYW1lKVxuICAgICAgICByZXR1cm4gKGluZGV4ICE9PSAtMSlcbiAgICAgICAgICA/IFsuLi5zdGF0ZS5zbGljZSgwLCBpbmRleCksIC4uLnN0YXRlLnNsaWNlKGluZGV4ICsgMSldXG4gICAgICAgICAgOiBzdGF0ZVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHN0YXRlXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgRkVUQ0hfRklMRVNfU1VDQ0VTUzpcbiAgICAgICAgY29uc3QgeyBpdGVtcyB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgICAgcmV0dXJuIGl0ZW1zLm1hcCgoZmlsZSkgPT4gZmlsZS5iYXNlbmFtZSlcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBzdGF0ZVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gIGJ5QmFzZW5hbWU6IHt9LFxuICBiYXNlbmFtZXM6IFtdLFxuXG4gIGlzRmV0Y2hpbmc6IGZhbHNlLFxuICByZWNlaXZlZEF0OiBudWxsLFxuICBlcnJvcjogZmFsc2UsXG4gIGVycm9yQ29kZTogbnVsbCxcbiAgZXJyb3JNZXNzYWdlOiBudWxsXG59XG5leHBvcnQgY29uc3QgaXRlbXNSZWR1Y2VyID0gKHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24pID0+IHtcbiAgaWYgKCFhY3Rpb24ucGF5bG9hZCkgcmV0dXJuIHN0YXRlXG4gIGNvbnN0IHsgcGF0aEFycmF5ID0gW10gfSA9IGFjdGlvbi5wYXlsb2FkXG5cbiAgaWYgKHBhdGhBcnJheS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBVcGRhdGUgdGhpcyBub2RlXG4gICAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgICAgY2FzZSBGRVRDSF9GSUxFU19SRVFVRVNUOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIGlzRmV0Y2hpbmc6IHRydWUsXG4gICAgICAgICAgZXJyb3I6IGluaXRpYWxTdGF0ZS5lcnJvcixcbiAgICAgICAgICBlcnJvckNvZGU6IGluaXRpYWxTdGF0ZS5lcnJvckNvZGUsXG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBpbml0aWFsU3RhdGUuZXJyb3JNZXNzYWdlXG4gICAgICAgIH1cbiAgICAgIGNhc2UgRkVUQ0hfRklMRVNfU1VDQ0VTUzpcbiAgICAgICAgY29uc3QgeyByZWNlaXZlZEF0IH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIGlzRmV0Y2hpbmc6IGZhbHNlLFxuICAgICAgICAgIHJlY2VpdmVkQXQsXG4gICAgICAgICAgYnlCYXNlbmFtZTogZmlsZXNCeUJhc2VuYW1lUmVkdWNlcihzdGF0ZS5ieUJhc2VuYW1lLCBhY3Rpb24pLFxuICAgICAgICAgIGJhc2VuYW1lczogZmlsZXNCYXNlbmFtZXNSZWR1Y2VyKHN0YXRlLmJhc2VuYW1lcywgYWN0aW9uKSxcbiAgICAgICAgICBlcnJvcjogaW5pdGlhbFN0YXRlLmVycm9yLFxuICAgICAgICAgIGVycm9yQ29kZTogaW5pdGlhbFN0YXRlLmVycm9yQ29kZSxcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGluaXRpYWxTdGF0ZS5lcnJvck1lc3NhZ2VcbiAgICAgICAgfVxuICAgICAgY2FzZSBGRVRDSF9GSUxFU19GQUlMVVJFOlxuICAgICAgICBjb25zdCB7IGVycm9yQ29kZSwgZXJyb3JNZXNzYWdlIH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIGlzRmV0Y2hpbmc6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiB0cnVlLFxuICAgICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgICBlcnJvck1lc3NhZ2VcbiAgICAgICAgfVxuICAgICAgY2FzZSBDTEVBUl9GSUxFU19FUlJPUjpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBlcnJvcjogaW5pdGlhbFN0YXRlLmVycm9yLFxuICAgICAgICAgIGVycm9yQ29kZTogaW5pdGlhbFN0YXRlLmVycm9yQ29kZSxcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGluaXRpYWxTdGF0ZS5lcnJvck1lc3NhZ2VcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBieUJhc2VuYW1lOiBmaWxlc0J5QmFzZW5hbWVSZWR1Y2VyKHN0YXRlLmJ5QmFzZW5hbWUsIGFjdGlvbiksXG4gICAgICAgICAgYmFzZW5hbWVzOiBmaWxlc0Jhc2VuYW1lc1JlZHVjZXIoc3RhdGUuYmFzZW5hbWVzLCBhY3Rpb24pXG4gICAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAocGF0aEFycmF5Lmxlbmd0aCA9PT0gMSkge1xuICAgIC8vIFVwZGF0ZSBhIGNoaWxkIGl0ZW1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBieUJhc2VuYW1lOiBmaWxlc0J5QmFzZW5hbWVSZWR1Y2VyKHN0YXRlLmJ5QmFzZW5hbWUsIGFjdGlvbiksXG4gICAgICBiYXNlbmFtZXM6IGZpbGVzQmFzZW5hbWVzUmVkdWNlcihzdGF0ZS5iYXNlbmFtZXMsIGFjdGlvbilcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gS2VlcCBzZWFyY2hpbmcgdGhlIG5vZGVcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBieUJhc2VuYW1lOiBmaWxlc0J5QmFzZW5hbWVSZWR1Y2VyKHN0YXRlLmJ5QmFzZW5hbWUsIGFjdGlvbilcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgaW5pdGlhbEVycm9yc1N0YXRlID0ge1xuICBieVBhdGg6IHt9LFxuICBwYXRoczogW11cbn1cbmNvbnN0IGNyZWF0ZUVycm9yc1JlZHVjZXIgPSAoeyBmaWxlRmFpbHVyZVR5cGUsIGNsZWFyRmlsZUVycm9yVHlwZSB9KSA9PiB7XG4gIHJldHVybiAoc3RhdGUgPSBpbml0aWFsRXJyb3JzU3RhdGUsIGFjdGlvbikgPT4ge1xuICAgIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICAgIGNhc2UgZmlsZUZhaWx1cmVUeXBlOlxuICAgICAgICB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgcGF0aCwgZXJyb3JDb2RlOiBjb2RlLCBlcnJvck1lc3NhZ2U6IG1lc3NhZ2VcbiAgICAgICAgICB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgICAgICBjb25zdCBwYXRoc0luZGV4ID0gc3RhdGUucGF0aHMuaW5kZXhPZihwYXRoKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIGJ5UGF0aDoge1xuICAgICAgICAgICAgICAuLi5zdGF0ZS5ieVBhdGgsXG4gICAgICAgICAgICAgIFtwYXRoXTogeyBjb2RlLCBtZXNzYWdlIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXRoczogKHBhdGhzSW5kZXggPT09IC0xKVxuICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAuLi5zdGF0ZS5wYXRocyxcbiAgICAgICAgICAgICAgICBwYXRoXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgOiBbXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUucGF0aHMuc2xpY2UoMCwgcGF0aHNJbmRleCksXG4gICAgICAgICAgICAgICAgLi4uc3RhdGUucGF0aHMuc2xpY2UocGF0aHNJbmRleCArIDEpLFxuICAgICAgICAgICAgICAgIHBhdGhcbiAgICAgICAgICAgICAgXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgY2FzZSBjbGVhckZpbGVFcnJvclR5cGU6XG4gICAgICAgIHtcbiAgICAgICAgICBjb25zdCB7IHBhdGggfSA9IGFjdGlvbi5wYXlsb2FkXG4gICAgICAgICAgY29uc3QgeyBbcGF0aF06IHRhcmdldCwgLi4ucmVzdEJ5UGF0aCB9ID0gc3RhdGUuYnlQYXRoXG5cbiAgICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuIHN0YXRlXG4gICAgICAgICAgY29uc3QgcGF0aEluZGV4ID0gc3RhdGUucGF0aHMuaW5kZXhPZihwYXRoKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICAgIGJ5UGF0aDogcmVzdEJ5UGF0aCxcbiAgICAgICAgICAgIHBhdGhzOiBbXG4gICAgICAgICAgICAgIC4uLnN0YXRlLnBhdGhzLnNsaWNlKDAsIHBhdGhJbmRleCksXG4gICAgICAgICAgICAgIC4uLnN0YXRlLnBhdGhzLnNsaWNlKHBhdGhJbmRleCArIDEpXG4gICAgICAgICAgICBdXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gc3RhdGVcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgZG93bmxvYWRFcnJvcnNSZWR1Y2VyID0gY3JlYXRlRXJyb3JzUmVkdWNlcih7XG4gIGZpbGVGYWlsdXJlVHlwZTogRE9XTkxPQURfRklMRV9GQUlMVVJFLFxuICBjbGVhckZpbGVFcnJvclR5cGU6IENMRUFSX0RPV05MT0FEX0ZJTEVfRVJST1Jcbn0pXG5cbmNvbnN0IGRvd25sb2Fkc1JlZHVjZXIgPSAoc3RhdGUgPSB7IGVycm9yczogdW5kZWZpbmVkIH0sIGFjdGlvbikgPT4ge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBlcnJvcnM6IGRvd25sb2FkRXJyb3JzUmVkdWNlcihzdGF0ZS5lcnJvcnMsIGFjdGlvbilcbiAgICAgIH1cbiAgfVxufVxuXG5jb25zdCB1cGxvYWRFcnJvcnNSZWR1Y2VyID0gY3JlYXRlRXJyb3JzUmVkdWNlcih7XG4gIGZpbGVGYWlsdXJlVHlwZTogVVBMT0FEX0ZJTEVfRkFJTFVSRSxcbiAgY2xlYXJGaWxlRXJyb3JUeXBlOiBDTEVBUl9VUExPQURfRklMRV9FUlJPUlxufSlcblxuY29uc3QgdXBsb2Fkc1JlZHVjZXIgPSAoc3RhdGUgPSB7IGVycm9yczogdW5kZWZpbmVkIH0sIGFjdGlvbikgPT4ge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBlcnJvcnM6IHVwbG9hZEVycm9yc1JlZHVjZXIoc3RhdGUuZXJyb3JzLCBhY3Rpb24pXG4gICAgICB9XG4gIH1cbn1cblxuY29uc3QgaW5pdGlhbE1haW5TdGF0ZSA9IHtcbiAgcGF0aEFycmF5OiBbXSxcbiAgcm9vdElzV2luOiBmYWxzZSxcbiAgcm9vdElzUG9zaXg6IHRydWUsXG4gIHJvb3RJc1JlYWRhYmxlOiBmYWxzZSxcbiAgcm9vdElzV3JpdGFibGU6IGZhbHNlLFxuICBpdGVtczogdW5kZWZpbmVkLFxuICBkb3dubG9hZHM6IHVuZGVmaW5lZCxcbiAgdXBsb2FkczogdW5kZWZpbmVkXG59XG5leHBvcnQgZGVmYXVsdCAoc3RhdGUgPSBpbml0aWFsTWFpblN0YXRlLCBhY3Rpb24pID0+IHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgQ0hBTkdFX0RJUl9GSUxFUzpcbiAgICAgIGNvbnN0IHsgcGF0aEFycmF5IH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIHBhdGhBcnJheVxuICAgICAgfVxuICAgIGNhc2UgRkVUQ0hfRklMRVNfU1VDQ0VTUzpcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcm9vdElzV2luLCByb290SXNQb3NpeCwgcm9vdElzUmVhZGFibGUsIHJvb3RJc1dyaXRhYmxlXG4gICAgICB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBpdGVtczogaXRlbXNSZWR1Y2VyKHN0YXRlLml0ZW1zLCBhY3Rpb24pLFxuICAgICAgICByb290SXNXaW4sXG4gICAgICAgIHJvb3RJc1Bvc2l4LFxuICAgICAgICByb290SXNSZWFkYWJsZSxcbiAgICAgICAgcm9vdElzV3JpdGFibGVcbiAgICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGl0ZW1zOiBpdGVtc1JlZHVjZXIoc3RhdGUuaXRlbXMsIGFjdGlvbiksXG4gICAgICAgIGRvd25sb2FkczogZG93bmxvYWRzUmVkdWNlcihzdGF0ZS5kb3dubG9hZHMsIGFjdGlvbiksXG4gICAgICAgIHVwbG9hZHM6IHVwbG9hZHNSZWR1Y2VyKHN0YXRlLnVwbG9hZHMsIGFjdGlvbilcbiAgICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgY29tYmluZVJlZHVjZXJzIH0gZnJvbSAncmVkdXgnXG5pbXBvcnQgYXBwIGZyb20gJy4uL3JlZHVjZXJzL2FwcCdcbmltcG9ydCBhZ2VudCBmcm9tICcuLi9yZWR1Y2Vycy9hZ2VudCdcbmltcG9ydCB0ZXJtaW5hbCBmcm9tICcuLi9yZWR1Y2Vycy90ZXJtaW5hbCdcbmltcG9ydCBkaXNwbGF5IGZyb20gJy4uL3JlZHVjZXJzL2Rpc3BsYXknXG5pbXBvcnQgZmlsZXMgZnJvbSAnLi4vcmVkdWNlcnMvZmlsZXMnXG5cbmV4cG9ydCBkZWZhdWx0IGNvbWJpbmVSZWR1Y2Vycyh7XG4gIGFwcCxcbiAgYWdlbnQsXG4gIHRlcm1pbmFsLFxuICBkaXNwbGF5LFxuICBmaWxlc1xufSlcbiIsImltcG9ydCB7XG4gIEZFVENIX1NFQ1RJT05TX1JFUVVFU1QsIEZFVENIX1NFQ1RJT05TX1NVQ0NFU1MsIEZFVENIX1NFQ1RJT05TX0ZBSUxVUkUsXG4gIEZFVENIX1JFTU9URV9TRUNUSU9OX1JFUVVFU1QsIEZFVENIX1JFTU9URV9TRUNUSU9OX0VORCxcbiAgUkVTRVRfRklSU1RfQUNUSVZFX1NFQ1RJT04sIElORk9STV9SRU1PVEVfU0VDVElPTl9FTkQsXG4gIFVQREFURV9TRUNUSU9OLCBTRUxFQ1RfU0VDVElPTiwgRU5BQkxFX1NFQ1RJT04sIERJU0FCTEVfU0VDVElPTiwgQUxMT1dfU0VDVElPTixcbiAgUkVTRVRfQkxPQ0tfUkVRVUVTVFxufSBmcm9tICcuLi9jb25zdGFudHMvYXBwJ1xuXG5jb25zdCBzZWN0aW9uUmVkdWNlciA9IChzdGF0ZSA9IHtcbiAga2V5OiAnJyxcbiAgbmFtZTogJycsXG4gIGVuYWJsZWQ6IGZhbHNlLFxuICBibG9ja1JlcXVlc3Q6IGZhbHNlLFxuICBhbGxvdzogZmFsc2UsXG4gIGluZm9ybTogZmFsc2Vcbn0sIGFjdGlvbikgPT4ge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBFTkFCTEVfU0VDVElPTjpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBlbmFibGVkOiB0cnVlXG4gICAgICB9KVxuICAgIGNhc2UgRElTQUJMRV9TRUNUSU9OOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBhbGxvdzogZmFsc2VcbiAgICAgIH0pXG4gICAgY2FzZSBVUERBVEVfU0VDVElPTjpcbiAgICAgIGNvbnN0IHsgZGF0YSB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBlbmFibGVkOiBkYXRhLmVuYWJsZWQsXG4gICAgICAgIGFsbG93OiBkYXRhLmFsbG93LFxuICAgICAgICBpbmZvcm06IGRhdGEuaW5mb3JtXG4gICAgICB9KVxuICAgIGNhc2UgQUxMT1dfU0VDVElPTjpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwgeyBhbGxvdzogdHJ1ZSB9KVxuICAgIGNhc2UgUkVTRVRfQkxPQ0tfUkVRVUVTVDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBibG9ja1JlcXVlc3Q6IGZhbHNlLFxuICAgICAgICBmZXRjaGluZ1JlbW90ZTogZmFsc2VcbiAgICAgIH0pXG4gICAgY2FzZSBGRVRDSF9SRU1PVEVfU0VDVElPTl9SRVFVRVNUOlxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGZldGNoaW5nUmVtb3RlOiB0cnVlLFxuICAgICAgICBibG9ja1JlcXVlc3Q6IHRydWVcbiAgICAgIH0pXG4gICAgY2FzZSBGRVRDSF9SRU1PVEVfU0VDVElPTl9FTkQ6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgZmV0Y2hpbmdSZW1vdGU6IGZhbHNlXG4gICAgICB9KVxuICAgIGNhc2UgSU5GT1JNX1JFTU9URV9TRUNUSU9OX0VORDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpbmZvcm06IGZhbHNlLFxuICAgICAgICBhbGxvdzogdHJ1ZVxuICAgICAgfSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlXG4gIH1cbn1cblxuY29uc3Qgc2VjdGlvbnNCeUtleVJlZHVjZXIgPSAoc3RhdGUgPSB7XG4gICd0ZXJtaW5hbCc6IHtcbiAgICBrZXk6ICd0ZXJtaW5hbCcsXG4gICAgbmFtZTogJ1Rlcm1pbmFsJyxcbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgICBibG9ja1JlcXVlc3Q6IGZhbHNlLFxuICAgIGFsbG93OiBmYWxzZSxcbiAgICBmZXRjaGluZ1JlbW90ZTogZmFsc2UsXG4gICAgaW5mb3JtOiBmYWxzZVxuICB9LFxuICAnZGlzcGxheSc6IHtcbiAgICBrZXk6ICdkaXNwbGF5JyxcbiAgICBuYW1lOiAnRGlzcGxheScsXG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgYmxvY2tSZXF1ZXN0OiBmYWxzZSxcbiAgICBhbGxvdzogZmFsc2UsXG4gICAgZmV0Y2hpbmdSZW1vdGU6IGZhbHNlLFxuICAgIGluZm9ybTogZmFsc2VcbiAgfSxcbiAgJ3Byb2Nlc3Nlcyc6IHtcbiAgICBrZXk6ICdwcm9jZXNzZXMnLFxuICAgIG5hbWU6ICdQcm9jZXNzZXMnLFxuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIGJsb2NrUmVxdWVzdDogZmFsc2UsXG4gICAgYWxsb3c6IGZhbHNlLFxuICAgIGZldGNoaW5nUmVtb3RlOiBmYWxzZSxcbiAgICBpbmZvcm06IGZhbHNlXG4gIH0sXG4gICdzZXJ2aWNlcyc6IHtcbiAgICBrZXk6ICdzZXJ2aWNlcycsXG4gICAgbmFtZTogJ1NlcnZpY2VzJyxcbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgICBibG9ja1JlcXVlc3Q6IGZhbHNlLFxuICAgIGFsbG93OiBmYWxzZSxcbiAgICBmZXRjaGluZ1JlbW90ZTogZmFsc2UsXG4gICAgaW5mb3JtOiBmYWxzZVxuICB9LFxuICAnZmlsZXMnOiB7XG4gICAga2V5OiAnZmlsZXMnLFxuICAgIG5hbWU6ICdGaWxlcycsXG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgYmxvY2tSZXF1ZXN0OiBmYWxzZSxcbiAgICBhbGxvdzogZmFsc2UsXG4gICAgZmV0Y2hpbmdSZW1vdGU6IGZhbHNlLFxuICAgIGluZm9ybTogZmFsc2VcbiAgfSxcbiAgJ3NoYXJlJzoge1xuICAgIGtleTogJ3NoYXJlJyxcbiAgICBuYW1lOiAnU2hhcmUnLFxuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIGJsb2NrUmVxdWVzdDogZmFsc2UsXG4gICAgYWxsb3c6IGZhbHNlLFxuICAgIGZldGNoaW5nUmVtb3RlOiBmYWxzZSxcbiAgICBpbmZvcm06IGZhbHNlXG4gIH1cbn0sIGFjdGlvbikgPT4ge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBGRVRDSF9TRUNUSU9OU19TVUNDRVNTOlxuICAgICAgY29uc3QgeyBpdGVtcyB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgIGxldCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKVxuICAgICAgaXRlbXMuZm9yRWFjaCgoc2VjdGlvbikgPT4ge1xuICAgICAgICBuZXdTdGF0ZVtzZWN0aW9uLmtleV0gPSBzZWN0aW9uUmVkdWNlcihzdGF0ZVtzZWN0aW9uLmtleV0sIHtcbiAgICAgICAgICB0eXBlOiBVUERBVEVfU0VDVElPTixcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBkYXRhOiBzZWN0aW9uXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICAgIGl0ZW1zLmZvckVhY2goKHNlY3Rpb24pID0+IHtcbiAgICAgICAgbmV3U3RhdGVbc2VjdGlvbi5rZXldID0gc2VjdGlvblJlZHVjZXIobmV3U3RhdGVbc2VjdGlvbi5rZXldLCB7XG4gICAgICAgICAgdHlwZTogUkVTRVRfQkxPQ0tfUkVRVUVTVCxcbiAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICBkYXRhOiBzZWN0aW9uXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICAgIHJldHVybiBuZXdTdGF0ZVxuICAgIGNhc2UgRU5BQkxFX1NFQ1RJT046XG4gICAgY2FzZSBESVNBQkxFX1NFQ1RJT046XG4gICAgY2FzZSBVUERBVEVfU0VDVElPTjpcbiAgICBjYXNlIEFMTE9XX1NFQ1RJT046XG4gICAgY2FzZSBSRVNFVF9CTE9DS19SRVFVRVNUOlxuICAgIGNhc2UgRkVUQ0hfUkVNT1RFX1NFQ1RJT05fUkVRVUVTVDpcbiAgICBjYXNlIEZFVENIX1JFTU9URV9TRUNUSU9OX0VORDpcbiAgICBjYXNlIElORk9STV9SRU1PVEVfU0VDVElPTl9FTkQ6XG4gICAgICBjb25zdCB7IGtleSB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBba2V5XTogc2VjdGlvblJlZHVjZXIoc3RhdGVba2V5XSwgYWN0aW9uKVxuICAgICAgfSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlXG4gIH1cbn1cblxuY29uc3Qgc2VjdGlvbnNLZXlzUmVkdWNlciA9IChzdGF0ZSA9IFtcbiAgJ3Rlcm1pbmFsJywgJ2Rpc3BsYXknLCAncHJvY2Vzc2VzJywgJ3NlcnZpY2VzJywgJ2ZpbGVzJywgJ3NoYXJlJ1xuXSwgYWN0aW9uKSA9PiB7XG4gIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAgICBjYXNlIEZFVENIX1NFQ1RJT05TX1NVQ0NFU1M6XG4gICAgICByZXR1cm4gc3RhdGVcbiAgICAgIC8vIGNvbnN0IHsgaXRlbXMgfSA9IGFjdGlvbi5wYXlsb2FkXG4gICAgICAvLyByZXR1cm4gaXRlbXMubWFwKChzZWN0aW9uKSA9PiBzZWN0aW9uLmtleSlcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHN0YXRlXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldEFjdGl2ZVNlY3Rpb24gPSAoc3RhdGUpID0+IHtcbiAgY29uc3QgYWN0aXZlS2V5ID0gc3RhdGUuYWN0aXZlXG4gIGlmIChhY3RpdmVLZXkgJiYgc3RhdGUuYnlLZXlbYWN0aXZlS2V5XSkge1xuICAgIGNvbnN0IGFjdGl2ZVNlY3Rpb24gPSBzdGF0ZS5ieUtleVthY3RpdmVLZXldXG4gICAgaWYgKGFjdGl2ZVNlY3Rpb24uZW5hYmxlZCkgcmV0dXJuIGFjdGl2ZUtleVxuICB9XG4gIHJldHVybiBudWxsXG59XG5cbmV4cG9ydCBjb25zdCBnZXRTZWN0aW9uID0gKHN0YXRlLCBrZXkpID0+IHtcbiAgcmV0dXJuIHN0YXRlLmJ5S2V5W2tleV1cbn1cblxuZXhwb3J0IGNvbnN0IGdldFNlY3Rpb25zID0gKHN0YXRlKSA9PiB7XG4gIHJldHVybiBzdGF0ZS5rZXlzLm1hcCgoa2V5KSA9PiBnZXRTZWN0aW9uKHN0YXRlLCBrZXkpKVxufVxuXG5leHBvcnQgY29uc3QgZ2V0Rmlyc3RBY3RpdmUgPSAoc3RhdGUpID0+IHtcbiAgcmV0dXJuIHN0YXRlLmZpcnN0QWN0aXZlXG59XG5cbmV4cG9ydCBkZWZhdWx0IChzdGF0ZSA9IHtcbiAgYWN0aXZlOiBudWxsLFxuICBmaXJzdEFjdGl2ZTogbnVsbCxcbiAgaXNGZXRjaGluZzogZmFsc2UsXG4gIHJlY2VpdmVkQXQ6IG51bGwsXG4gIGVycm9yOiBmYWxzZSxcbiAgZXJyb3JDb2RlOiBudWxsLFxuICBlcnJvck1lc3NhZ2U6IG51bGxcbn0sIGFjdGlvbikgPT4ge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSBTRUxFQ1RfU0VDVElPTjpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBhY3RpdmU6IGFjdGlvbi5wYXlsb2FkLmtleVxuICAgICAgfSlcbiAgICBjYXNlIEZFVENIX1NFQ1RJT05TX1JFUVVFU1Q6XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgaXNGZXRjaGluZzogdHJ1ZVxuICAgICAgfSlcbiAgICBjYXNlIEZFVENIX1NFQ1RJT05TX0ZBSUxVUkU6XG4gICAgICBjb25zdCB7IGVycm9yQ29kZSwgZXJyb3JNZXNzYWdlIH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGlzRmV0Y2hpbmc6IGZhbHNlLFxuICAgICAgICBlcnJvcjogdHJ1ZSxcbiAgICAgICAgZXJyb3JDb2RlLFxuICAgICAgICBlcnJvck1lc3NhZ2VcbiAgICAgIH0pXG4gICAgY2FzZSBGRVRDSF9TRUNUSU9OU19TVUNDRVNTOlxuICAgICAgY29uc3QgeyByZWNlaXZlZEF0IH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIGlzRmV0Y2hpbmc6IHRydWUsXG4gICAgICAgIHJlY2VpdmVkQXQsXG4gICAgICAgIGJ5S2V5OiBzZWN0aW9uc0J5S2V5UmVkdWNlcihzdGF0ZS5ieUtleSwgYWN0aW9uKSxcbiAgICAgICAga2V5czogc2VjdGlvbnNLZXlzUmVkdWNlcihzdGF0ZS5rZXlzLCBhY3Rpb24pXG4gICAgICB9KVxuICAgIGNhc2UgUkVTRVRfRklSU1RfQUNUSVZFX1NFQ1RJT046XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgZmlyc3RBY3RpdmU6IG51bGxcbiAgICAgIH0pXG4gICAgY2FzZSBFTkFCTEVfU0VDVElPTjpcbiAgICBjYXNlIERJU0FCTEVfU0VDVElPTjpcbiAgICBjYXNlIEFMTE9XX1NFQ1RJT046XG4gICAgY2FzZSBGRVRDSF9SRU1PVEVfU0VDVElPTl9SRVFVRVNUOlxuICAgIGNhc2UgRkVUQ0hfUkVNT1RFX1NFQ1RJT05fRU5EOlxuICAgIGNhc2UgUkVTRVRfQkxPQ0tfUkVRVUVTVDpcbiAgICBjYXNlIElORk9STV9SRU1PVEVfU0VDVElPTl9FTkQ6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBieUtleTogc2VjdGlvbnNCeUtleVJlZHVjZXIoc3RhdGUuYnlLZXksIGFjdGlvbiksXG4gICAgICAgIGtleXM6IHNlY3Rpb25zS2V5c1JlZHVjZXIoc3RhdGUua2V5cywgYWN0aW9uKVxuICAgICAgfSlcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgUkVTRVRfVEVSTV9TVEFURSxcbiAgSU5JVF9URVJNX1JFUVVFU1QsXG4gIElOSVRfVEVSTV9TVUNDRVNTLFxuICBJTklUX1RFUk1fRkFJTFVSRSxcbiAgU0FWRV9URVJNX0RBVEEsXG4gIENMRUFSX1RFUk1fRVJST1Jcbn0gZnJvbSAnLi4vY29uc3RhbnRzL3Rlcm1pbmFsJ1xuXG5jb25zdCBpbml0aWFsU3RhdGUgPSB7XG4gIGNvbHM6IDgwLFxuICByb3dzOiAyNCxcbiAgaXNJbml0aWFsaXppbmc6IGZhbHNlLFxuICBpc0luaXRpYWxpemVkOiBmYWxzZSxcbiAgaW5pdGlhbGl6ZWRBdDogbnVsbCxcbiAgZXJyb3I6IGZhbHNlLFxuICBlcnJvckNvZGU6IG51bGwsXG4gIGVycm9yTWVzc2FnZTogbnVsbCxcbiAgbmV3RGF0YTogbnVsbCxcbiAgZGF0YVJldmVpdmVkQXQ6IG51bGxcbn1cblxuZXhwb3J0IGRlZmF1bHQgKHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24pID0+IHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgUkVTRVRfVEVSTV9TVEFURTpcbiAgICAgIHJldHVybiB7IC4uLmluaXRpYWxTdGF0ZSB9XG4gICAgY2FzZSBJTklUX1RFUk1fUkVRVUVTVDpcbiAgICAgIGNvbnN0IHsgY29scywgcm93cyB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc0luaXRpYWxpemluZzogdHJ1ZSxcbiAgICAgICAgaXNJbml0aWFsaXplZDogZmFsc2UsXG4gICAgICAgIGNvbHMsXG4gICAgICAgIHJvd3NcbiAgICAgIH0pXG4gICAgY2FzZSBJTklUX1RFUk1fU1VDQ0VTUzpcbiAgICAgIGNvbnN0IHsgaW5pdGlhbGl6ZWRBdCB9ID0gYWN0aW9uLnBheWxvYWRcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBpc0luaXRpYWxpemluZzogZmFsc2UsXG4gICAgICAgIGlzSW5pdGlhbGl6ZWQ6IHRydWUsXG4gICAgICAgIGluaXRpYWxpemVkQXRcbiAgICAgIH0pXG4gICAgY2FzZSBJTklUX1RFUk1fRkFJTFVSRTpcbiAgICAgIGNvbnN0IHsgZXJyb3JDb2RlLCBlcnJvck1lc3NhZ2UgfSA9IGFjdGlvbi5wYXlsb2FkXG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUsIHtcbiAgICAgICAgaXNJbml0aWFsaXppbmc6IGZhbHNlLFxuICAgICAgICBpc0luaXRpYWxpemVkOiBmYWxzZSxcbiAgICAgICAgZXJyb3I6IHRydWUsXG4gICAgICAgIGVycm9yQ29kZSxcbiAgICAgICAgZXJyb3JNZXNzYWdlXG4gICAgICB9KVxuICAgIGNhc2UgU0FWRV9URVJNX0RBVEE6XG4gICAgICBjb25zdCB7IG5ld0RhdGEsIGRhdGFSZXZlaXZlZEF0IH0gPSBhY3Rpb24ucGF5bG9hZFxuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCB7XG4gICAgICAgIG5ld0RhdGEsXG4gICAgICAgIGRhdGFSZXZlaXZlZEF0XG4gICAgICB9KVxuICAgIGNhc2UgQ0xFQVJfVEVSTV9FUlJPUjpcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwge1xuICAgICAgICBlcnJvcjogZmFsc2UsXG4gICAgICAgIGVycm9yQ29kZTogbnVsbCxcbiAgICAgICAgZXJyb3JNZXNzYWdlOiBudWxsXG4gICAgICB9KVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gc3RhdGVcbiAgfVxufVxuIiwiaW1wb3J0IHsgZGVmaW5lTWVzc2FnZXMgfSBmcm9tICdyZWFjdC1pbnRsJ1xuXG5pbXBvcnQgTG9nZ2VyIGZyb20gJy4uL2NvbW1vbi9saWIvTG9nZ2VyJ1xuaW1wb3J0IHsgYmFzZTY0RGVjVG9BcnIgfSBmcm9tICcuLi9jb21tb24vbGliL2Jhc2U2NCdcblxuaW1wb3J0IHsgUFJPVE8gfSBmcm9tICcuLi9jb25zdGFudHMnXG5pbXBvcnQge1xuICBFUlJPUl9GRVRDSCwgRVJST1JfREVMRVRJT04sIEVSUk9SX0RPV05MT0FELCBFUlJPUl9VUExPQURcbn0gZnJvbSAnLi4vY29uc3RhbnRzL2ZpbGVzJ1xuXG5pbXBvcnQge1xuICBmZXRjaEZpbGVzU3VjY2VzcywgZmV0Y2hGaWxlc0ZhaWx1cmUsXG4gIGRlbGV0ZUZpbGVTdWNjZXNzLCBkZWxldGVGaWxlRmFpbHVyZSxcbiAgZG93bmxvYWRGaWxlRmFpbHVyZSwgdXBsb2FkRmlsZUZhaWx1cmUsXG4gIHJlcXVlc3RDaHVuaywgc2VuZENodW5rXG59IGZyb20gJy4uL2FjdGlvbnMvZmlsZXMnXG5cbmltcG9ydCBEaXJJdGVtIGZyb20gJy4uL2xpYi9maWxlcy9kaXItaXRlbSdcbmltcG9ydCBGaWxlc0Rvd25sb2FkQ29udHJvbGxlciBmcm9tICcuLi9saWIvZmlsZXMvZmlsZXMtZG93bmxvYWQtY29udHJvbGxlcidcbmltcG9ydCBGaWxlc1VwbG9hZENvbnRyb2xsZXIgZnJvbSAnLi4vbGliL2ZpbGVzL2ZpbGVzLXVwbG9hZC1jb250cm9sbGVyJ1xuaW1wb3J0IGdldFBhdGhQYXJzZXIsIHsgTU9ERV9QT1NJWCwgTU9ERV9XSU4gfSBmcm9tICcuLi9saWIvZmlsZXMvcGF0aC1wYXJzZXInXG5pbXBvcnQgdG9QYXRoQXJyYXkgZnJvbSAnLi4vbGliL2ZpbGVzL3BhdGgtYXJyYXknXG5cbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoeyBzZWN0aW9uOiAnRmlsZXMgcmVzcG9uc2UnIH0pXG5cbmNvbnN0IG1lc3NhZ2VzID0gZGVmaW5lTWVzc2FnZXMoe1xuICBlcnJvckRpcmVjdG9yeToge1xuICAgIGlkOiAnZXJyb3ItZmVjaGluZy1yb290JyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0Vycm9yIG9wZW5pbmcgdGhlIGRpcmVjdG9yeToge3BhdGh9JyxcbiAgICB2YWx1ZXM6IHtcbiAgICAgIHBhdGg6ICctJ1xuICAgIH1cbiAgfSxcbiAgZXJyb3JSb290OiB7XG4gICAgaWQ6ICdlcnJvci1mZWNoaW5nLWRpcicsXG4gICAgZGVmYXVsdE1lc3NhZ2U6ICdFcnJvciBvcGVuaW5nIHRoZSByb290IGRpcmVjdG9yeSdcbiAgfSxcbiAgZXJyb3JVcGxvYWQ6IHtcbiAgICBpZDogJ2Vycm9yLXVwbG9hZC1maWxlJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ1VwbG9hZCBmYWlsZWQgKHtwYXRofSknLFxuICAgIHZhbHVlczoge1xuICAgICAgcGF0aDogJy0nXG4gICAgfVxuICB9LFxuICBlcnJvckRvd25sb2FkOiB7XG4gICAgaWQ6ICdlcnJvci1kb3dubG9hZC1maWxlJyxcbiAgICBkZWZhdWx0TWVzc2FnZTogJ0Rvd25sb2FkIGZhaWxlZCAoe3BhdGh9KScsXG4gICAgdmFsdWVzOiB7XG4gICAgICBwYXRoOiAnLSdcbiAgICB9XG4gIH0sXG4gIGVycm9yRGVsZXRpbmc6IHtcbiAgICBpZDogJ2Vycm9yLWRlbGV0aW5nLWZpbGUnLFxuICAgIGRlZmF1bHRNZXNzYWdlOiAnRXJyb3IgZGVsZXRpbmcgdGhlIGZpbGUge3BhdGh9JyxcbiAgICB2YWx1ZXM6IHtcbiAgICAgIHBhdGg6ICdOL0EnXG4gICAgfVxuICB9XG59KVxuXG5leHBvcnQgZGVmYXVsdCAocmVtb3RlLCBkaXNwYXRjaCwgaW50bCkgPT4ge1xuICAvLyBCaW5kIHRoZSBmaWxlcyB1cGxvYWQgc3RhdGUgdG8gdGhlIGZpbGVzIHN0b3JlXG4gIC8vIEZpbGVzVXBsb2FkQ29udHJvbGxlci5vbignZmlsZScsIChwYXRoLCBmaWxlVXBsb2FkKSA9PiB7XG4gIC8vICAgRmlsZXNBY3Rpb25zLnVwZGF0ZUZpbGVVcGxvYWQocGF0aCwgZmlsZVVwbG9hZClcbiAgLy8gfSlcblxuICAvLyBBZGQgdGhlIGFjdGlvbiB0byByZXF1ZXN0IG5ldyBjaHVua3MgdG8gdGhlIGZpbGVzIGRvd25sb2FkIGNvbnRyb2xsZXJcbiAgRmlsZXNEb3dubG9hZENvbnRyb2xsZXIucmVxdWVzdENodW5rQWN0aW9uID0gcmVxdWVzdENodW5rXG4gIC8vIEFkZCB0aGUgYWN0aW9uIHRvIHNlbmQgbmV3IGNodW5rcyB0byB0aGUgZmlsZXMgdXBsb2FkIGNvbnRyb2xsZXJcbiAgRmlsZXNVcGxvYWRDb250cm9sbGVyLnNlbmRDaHVua0FjdGlvbiA9IHNlbmRDaHVua1xuXG4gIC8vIEhhbmRsZSB0aGUgd3MgY29ubmVjdGlvbiBldmVudHNcbiAgcmVtb3RlLm9uT3BlbigoZXZlbnQpID0+IHtcbiAgICBGaWxlc1VwbG9hZENvbnRyb2xsZXIuc3RhcnRVcGxvYWRzKClcbiAgICBGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5zdGFydERvd25sb2FkcygpXG4gIH0pXG4gIHJlbW90ZS5vbkNsb3NlKChldmVudCkgPT4ge1xuICAgIEZpbGVzVXBsb2FkQ29udHJvbGxlci5wYXVzZVVwbG9hZHMoKVxuICAgIEZpbGVzRG93bmxvYWRDb250cm9sbGVyLnBhdXNlRG93bmxvYWRzKClcbiAgfSlcbiAgcmVtb3RlLm9uQ2xvc2luZygoZXZlbnQpID0+IHtcbiAgICAvLyBUaGlzIGlzIGEgbWFudWFsIGNsb3NlXG4gICAgRmlsZXNVcGxvYWRDb250cm9sbGVyLnN0b3BVcGxvYWRzKClcbiAgICBGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5zdG9wRG93bmxvYWRzKClcbiAgfSlcbiAgcmVtb3RlLm9uKFBST1RPLkZJTEVTLCAocmVzcG9uc2UpID0+IHtcbiAgICAvLyBkYXRhIHNob3VsZCBiZSBhIEpTT05cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlLnRvSlNPTigpXG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YS5hY3Rpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIGFjdGlvbiBvbiBtZXNzYWdlJylcbiAgICAgIH1cblxuICAgICAgLy8gbG9nZ2VyLmluZm8oJ1tQUk9UTy5GSUxFU10nLCBkYXRhKVxuXG4gICAgICBzd2l0Y2ggKGRhdGEuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgJ2xzJzpcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGEuc3RhdHVzICE9PSAndW5kZWZpbmVkJyAmJiAhZGF0YS5zdGF0dXMpIHtcbiAgICAgICAgICAgIGxldCBlcnJvciA9IG5ldyBFcnJvcigpXG4gICAgICAgICAgICBlcnJvci5yZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgc3RhdHVzOiBFUlJPUl9GRVRDSCxcbiAgICAgICAgICAgICAgc3RhdHVzVGV4dDogdHlwZW9mIGRhdGEucGF0aCA9PT0gJ3N0cmluZycgJiYgZGF0YS5wYXRoLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICA/IGludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5lcnJvckRpcmVjdG9yeSwgeyBwYXRoOiBkYXRhLnBhdGggfSlcbiAgICAgICAgICAgICAgICA6IGludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5lcnJvclJvb3QpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXNwYXRjaChmZXRjaEZpbGVzRmFpbHVyZShkYXRhLnBhdGgsIGVycm9yKSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIHBhdGhcbiAgICAgICAgICAgICAgdHlwZW9mIGRhdGEucGF0aCAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBsaXN0XG4gICAgICAgICAgICAgIHR5cGVvZiBkYXRhLmxpc3QgIT09ICdvYmplY3QnIHx8XG4gICAgICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgdGltZXN0YW1wXG4gICAgICAgICAgICAgIHR5cGVvZiBkYXRhLnRpbWVzdGFtcCA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBvc1xuICAgICAgICAgICAgICB0eXBlb2YgZGF0YS5vcyAhPT0gJ3N0cmluZydcbiAgICAgICAgICAgICkgdGhyb3cgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyIG9uIG1lc3NhZ2UnKVxuXG4gICAgICAgICAgICBjb25zdCBjYW5CZURlbGV0ZWQgPSAodHlwZW9mIGRhdGEuZmlsZURlbGV0ZSAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgICAgICAgID8gISFOdW1iZXIucGFyc2VJbnQoZGF0YS5maWxlRGVsZXRlLCAxMClcbiAgICAgICAgICAgICAgOiBmYWxzZVxuXG4gICAgICAgICAgICBjb25zdCBpc1dpbiA9IGRhdGEub3MudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnd2luJylcbiAgICAgICAgICAgIGNvbnN0IGlzUG9zaXggPSAhaXNXaW5cbiAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJzZXIgPSBnZXRQYXRoUGFyc2VyKGlzV2luID8gTU9ERV9XSU4gOiBNT0RFX1BPU0lYKVxuICAgICAgICAgICAgLy8gR2V0IHJpZCBvZiBtaXhlZCBzZXBhcmF0b3JzXG4gICAgICAgICAgICBjb25zdCByZXBsYWNlTWl4ZWRTZXAgPSAocCkgPT4gaXNXaW4gPyBwLnJlcGxhY2UoL1xcLy8sICdcXFxcJykgOiBwXG4gICAgICAgICAgICBjb25zdCBkaXJuYW1lID0gcmVwbGFjZU1peGVkU2VwKGRhdGEucGF0aClcbiAgICAgICAgICAgIGNvbnN0IGpvaW5QYXRoID0gKGJhc2VuYW1lKSA9PiByZXBsYWNlTWl4ZWRTZXAocGF0aFBhcnNlci5qb2luKGRpcm5hbWUsIGJhc2VuYW1lKSlcblxuICAgICAgICAgICAgY29uc3QgcGFyc2VGaWxlcyA9IChpdGVtcykgPT4gaXRlbXMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgICAgICBzZXBhcmF0b3I6IHBhdGhQYXJzZXIuc2VwLFxuICAgICAgICAgICAgICBwYXRoOiBqb2luUGF0aChpdGVtWydmaWxlX25hbWUnXSksXG4gICAgICAgICAgICAgIGRpcm5hbWUsXG4gICAgICAgICAgICAgIGJhc2VuYW1lOiBpdGVtWydmaWxlX25hbWUnXSxcbiAgICAgICAgICAgICAgbGFzdE1vZGlmaWNhdGlvbjogaXRlbVsnbXRpbWUnXSxcbiAgICAgICAgICAgICAgaXNGaWxlOiAhaXRlbVsnaXNfZGlyJ10gJiYgIWl0ZW1bJ2lzX2RyaXZlJ10sXG4gICAgICAgICAgICAgIG1pbWVUeXBlOiBpdGVtWydtaW1lX3R5cGUnXSxcbiAgICAgICAgICAgICAgc2l6ZTogaXRlbVsnZmlsZV9zaXplJ10sXG4gICAgICAgICAgICAgIGNhbkJlRGVsZXRlZCxcbiAgICAgICAgICAgICAgaXNEaXI6ICEhaXRlbVsnaXNfZGlyJ10sXG4gICAgICAgICAgICAgIGlzRHJpdmU6ICEhaXRlbVsnaXNfZHJpdmUnXSxcbiAgICAgICAgICAgICAgaXNXcml0YWJsZTogISFpdGVtWyd3cml0YWJsZSddLFxuICAgICAgICAgICAgICBpc1JlYWRhYmxlOiAhIWl0ZW1bJ3JlYWRhYmxlJ10sXG4gICAgICAgICAgICAgIGlzUG9zaXgsXG4gICAgICAgICAgICAgIGlzV2luXG4gICAgICAgICAgICB9KSlcblxuICAgICAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKVxuXG4gICAgICAgICAgICBjb25zdCBwYXRoQXJyYXkgPSB0b1BhdGhBcnJheShkaXJuYW1lLCBpc1dpbiA/IE1PREVfV0lOIDogTU9ERV9QT1NJWClcbiAgICAgICAgICAgIGNvbnN0IHJvb3REYXRhID0gcGF0aEFycmF5Lmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICByb290SXNXaW46IGlzV2luLFxuICAgICAgICAgICAgICAgIHJvb3RJc1Bvc2l4OiBpc1Bvc2l4LFxuICAgICAgICAgICAgICAgIHJvb3RJc1JlYWRhYmxlOiAhIWRhdGEucmVhZGFibGUsXG4gICAgICAgICAgICAgICAgcm9vdElzV3JpdGFibGU6ICEhZGF0YS53cml0YWJsZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDoge31cblxuICAgICAgICAgICAgZGlzcGF0Y2goXG4gICAgICAgICAgICAgIGZldGNoRmlsZXNTdWNjZXNzKGRpcm5hbWUsIHBhcnNlRmlsZXMoZGF0YS5saXN0KSwgbm93LCByb290RGF0YSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcblxuICAgICAgICBjYXNlICd1cGxvYWQnOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgZGlyX25hbWVcbiAgICAgICAgICAgIHR5cGVvZiBkYXRhLmRpcl9uYW1lICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBmaWxlX25hbWVcbiAgICAgICAgICAgIHR5cGVvZiBkYXRhLmZpbGVfbmFtZSAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgdGltZXN0YW1wXG4gICAgICAgICAgICB0eXBlb2YgZGF0YS50aW1lc3RhbXAgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIG9zXG4gICAgICAgICAgICB0eXBlb2YgZGF0YS5vcyAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgc3RhdHVzXG4gICAgICAgICAgICB0eXBlb2YgZGF0YS5zdGF0dXMgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIG9mZnNldFxuICAgICAgICAgICAgKGRhdGEuc3RhdHVzICYmIHR5cGVvZiBkYXRhLm9mZnNldCAhPT0gJ251bWJlcicpXG4gICAgICAgICAgKSB0aHJvdyBFcnJvcignTWlzc2luZyBwYXJhbWV0ZXIgb24gbWVzc2FnZScpXG5cbiAgICAgICAgICAvLyBVc2UgYSBuZXcgc2NvcGUgYmxvY2tcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBkaXIgPSBuZXcgRGlySXRlbShkYXRhLmRpcl9uYW1lLCB7fSwgZGF0YS5vcylcbiAgICAgICAgICAgIC8vIEZpeCB0aGUgcGF0aCBub3cgd2UgaGF2ZSB0aGUgb3MgdHlwZVxuICAgICAgICAgICAgY29uc3QgcGF0aCA9IChkaXIucGF0aC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICA/IGRpci5wYXRoICsgZGlyLnNlcGFyYXRvciArIGRhdGEuZmlsZV9uYW1lXG4gICAgICAgICAgICAgIDogZGF0YS5maWxlX25hbWVcblxuICAgICAgICAgICAgaWYgKCFkYXRhLnN0YXR1cykge1xuICAgICAgICAgICAgICBGaWxlc1VwbG9hZENvbnRyb2xsZXIucmVtb3ZlRmlsZShwYXRoKVxuICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoKVxuICAgICAgICAgICAgICBlcnJvci5yZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IEVSUk9SX1VQTE9BRCxcbiAgICAgICAgICAgICAgICBzdGF0dXNUZXh0OiBpbnRsLmZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuZXJyb3JVcGxvYWQsIHsgcGF0aCB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRpc3BhdGNoKHVwbG9hZEZpbGVGYWlsdXJlKHBhdGgsIGVycm9yKSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIEZpbGVzVXBsb2FkQ29udHJvbGxlci51cGRhdGVGaWxlT2Zmc2V0KFxuICAgICAgICAgICAgICAgIHBhdGgsIGRhdGEub2Zmc2V0LCBkYXRhLnRpbWVzdGFtcFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG5cbiAgICAgICAgY2FzZSAnZG93bmxvYWQnOlxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgZGlyX25hbWVcbiAgICAgICAgICAgIHR5cGVvZiBkYXRhLmRpcl9uYW1lICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBmaWxlX25hbWVcbiAgICAgICAgICAgIHR5cGVvZiBkYXRhLmZpbGVfbmFtZSAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgdGltZXN0YW1wXG4gICAgICAgICAgICB0eXBlb2YgZGF0YS50aW1lc3RhbXAgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIG9zXG4gICAgICAgICAgICB0eXBlb2YgZGF0YS5vcyAhPT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgc2l6ZVxuICAgICAgICAgICAgdHlwZW9mIGRhdGEuc2l6ZSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICApIHRocm93IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlciBvbiBtZXNzYWdlJylcblxuICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgb2Zmc2V0XG4gICAgICAgICAgLy8gaWYgKHR5cGVvZiBkYXRhLm9mZnNldCAhPT0gJ251bWJlcicpXG4gICAgICAgICAgLy8gICB0aHJvdyBFcnJvcignTWlzc2luZyBwYXJhbWV0ZXIgb24gbWVzc2FnZScpXG4gICAgICAgICAgLy8gT0ZGU0VUIE1JU1NJTkchISFcblxuICAgICAgICAgIC8vIFVzZSBhIG5ldyBzY29wZSBibG9ja1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGRpciA9IG5ldyBEaXJJdGVtKGRhdGEuZGlyX25hbWUsIHt9LCBkYXRhLm9zKVxuICAgICAgICAgICAgLy8gRml4IHRoZSBwYXRoIG5vdyB3ZSBoYXZlIHRoZSBvcyB0eXBlXG4gICAgICAgICAgICBjb25zdCBwYXRoID0gKGRpci5wYXRoLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgID8gZGlyLnBhdGggKyBkaXIuc2VwYXJhdG9yICsgZGF0YS5maWxlX25hbWVcbiAgICAgICAgICAgICAgOiBkYXRhLmZpbGVfbmFtZVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEuc3RhdHVzICE9PSAndW5kZWZpbmVkJyAmJiAhZGF0YS5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgRmlsZXNEb3dubG9hZENvbnRyb2xsZXIucmVtb3ZlRmlsZShwYXRoKVxuICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoKVxuICAgICAgICAgICAgICBlcnJvci5yZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IEVSUk9SX0RPV05MT0FELFxuICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IGludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5lcnJvckRvd25sb2FkLCB7IHBhdGggfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkaXNwYXRjaChkb3dubG9hZEZpbGVGYWlsdXJlKHBhdGgsIGVycm9yKSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRhdGEuY2h1bmsgPSBiYXNlNjREZWNUb0FycihkYXRhLmNodW5rKVxuXG4gICAgICAgICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IE51bWJlci5wYXJzZUludChkYXRhLnNpemUsIDEwKVxuICAgICAgICAgICAgICBGaWxlc0Rvd25sb2FkQ29udHJvbGxlci5zYXZlQ2h1bmsoXG4gICAgICAgICAgICAgICAgcGF0aCwgZGF0YS5jaHVuaywgZGF0YS5vZmZzZXQsIGNodW5rU2l6ZVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBzdGF0dXNcbiAgICAgICAgICAgIHR5cGVvZiBkYXRhLnN0YXR1cyA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgb3NcbiAgICAgICAgICAgIHR5cGVvZiBkYXRhLm9zICE9PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBkaXJfbmFtZVxuICAgICAgICAgICAgdHlwZW9mIGRhdGEuZGlyX25hbWUgIT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIGZpbGVfbmFtZVxuICAgICAgICAgICAgdHlwZW9mIGRhdGEuZmlsZV9uYW1lICE9PSAnc3RyaW5nJ1xuICAgICAgICAgICkgdGhyb3cgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyIG9uIG1lc3NhZ2UnKVxuXG4gICAgICAgICAgLy8gVXNlIGEgbmV3IHNjb3BlIGJsb2NrXG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgZGlyID0gbmV3IERpckl0ZW0oZGF0YS5kaXJfbmFtZSwge30sIGRhdGEub3MpXG4gICAgICAgICAgICAvLyBGaXggdGhlIHBhdGggbm93IHdlIGhhdmUgdGhlIG9zIHR5cGVcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSAoZGlyLnBhdGgubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgPyBkaXIucGF0aCArIGRpci5zZXBhcmF0b3IgKyBkYXRhLmZpbGVfbmFtZVxuICAgICAgICAgICAgICA6IGRhdGEuZmlsZV9uYW1lXG5cbiAgICAgICAgICAgIGlmIChkYXRhLnN0YXR1cykge1xuICAgICAgICAgICAgICAvLyBTdWNjZXNzXG4gICAgICAgICAgICAgIGRpc3BhdGNoKGRlbGV0ZUZpbGVTdWNjZXNzKHBhdGgpKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gRmFpbHVyZVxuICAgICAgICAgICAgICBsZXQgZXJyb3IgPSBuZXcgRXJyb3IoKVxuICAgICAgICAgICAgICBlcnJvci5yZXNwb25zZSA9IHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IEVSUk9SX0RFTEVUSU9OLFxuICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IGludGwuZm9ybWF0TWVzc2FnZShtZXNzYWdlcy5lcnJvckRlbGV0aW5nLCB7IHBhdGggfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkaXNwYXRjaChkZWxldGVGaWxlRmFpbHVyZShwYXRoLCBlcnJvcikpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0ludmFsaWQgYWN0aW9uOicsIGRhdGEuYWN0aW9uKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgfVxuICB9KVxufVxuIiwiaW1wb3J0IExvZ2dlciBmcm9tICcuLi9jb21tb24vbGliL0xvZ2dlcidcbmltcG9ydCB7IFBST1RPIH0gZnJvbSAnLi4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgZmV0Y2hTZWN0aW9ucywgdHJ5UGFzc3dvcmRzIH0gZnJvbSAnLi4vYWN0aW9ucy9hcHAnXG5pbXBvcnQge1xuICBmZXRjaEFnZW50LFxuICBjb25uZWN0aW9uQWdlbnRSZXF1ZXN0LCBjb25uZWN0aW9uQWdlbnRTdWNjZXNzLCBjb25uZWN0aW9uQWdlbnRGYWlsdXJlLFxuICBkaXNjb25uZWN0aW9uQWdlbnRTdWNjZXNzLCBkaXNjb25uZWN0aW9uQWdlbnRSZXF1ZXN0LCBjbGVhckNvbm5lY3Rpb25FcnJvcixcbiAgYXV0ZW50aWNhdGVBZ2VudFN1Y2Nlc3MsIGF1dGVudGljYXRlQWdlbnRGYWlsdXJlLCByZXZva2VBZ2VudEF1dGhlbnRpY2F0aW9uLFxuICBjbGVhckF1dGhlbnRpY2F0aW9uRXJyb3Jcbn0gZnJvbSAnLi4vYWN0aW9ucy9hZ2VudCdcblxuaW1wb3J0IGJpbmRUZXJtaW5hbFJlc3BvbnNlcyBmcm9tICcuLi9yZXNwb25zZXMvdGVybWluYWwnXG5pbXBvcnQgYmluZFN5c3RlbVJlc3BvbnNlcyBmcm9tICcuLi9yZXNwb25zZXMvc3lzdGVtJ1xuaW1wb3J0IGJpbmRQcm9jZXNzZXNSZXNwb25zZXMgZnJvbSAnLi4vcmVzcG9uc2VzL3Byb2Nlc3NlcydcbmltcG9ydCBiaW5kRmlsZXNSZXNwb25zZXMgZnJvbSAnLi4vcmVzcG9uc2VzL2ZpbGVzJ1xuaW1wb3J0IGJpbmRTZXJ2aWNlc1Jlc3BvbnNlcyBmcm9tICcuLi9yZXNwb25zZXMvc2VydmljZXMnXG5cbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoeyBzZWN0aW9uOiAnUmVzcG9uc2VzJyB9KVxuXG5leHBvcnQgZGVmYXVsdCAocmVtb3RlLCBkaXNwYXRjaCwgaW50bCkgPT4ge1xuICAvLyBSZWdpc3RlciByZW1vdGUgbGlzdGVuZXJzXG5cbiAgLy8gTGlzdGVuIGZvciBzdGF0ZSBjaGFuZ2VzXG4gIHJlbW90ZS5vbk9wZW4oKGV2ZW50KSA9PiB7XG4gICAgbG9nZ2VyLmluZm8oJ1t3c10nLCAnQ29ubmVjdGlvbiBvcGVuJywgZXZlbnQpXG4gICAgZGlzcGF0Y2goY29ubmVjdGlvbkFnZW50U3VjY2VzcyhEYXRlLm5vdygpKSlcbiAgfSlcbiAgcmVtb3RlLm9uT3BlbmluZygoZXZlbnQpID0+IHtcbiAgICBsb2dnZXIuaW5mbygnW3dzXScsICdPcGVuaW5nIGNvbm5lY3Rpb24uLi4nKVxuICAgIGRpc3BhdGNoKGNsZWFyQXV0aGVudGljYXRpb25FcnJvcigpKVxuICAgIGRpc3BhdGNoKGNsZWFyQ29ubmVjdGlvbkVycm9yKCkpXG4gICAgZGlzcGF0Y2goY29ubmVjdGlvbkFnZW50UmVxdWVzdCgpKVxuICB9KVxuICByZW1vdGUub25DbG9zZSgoZXZlbnQpID0+IHtcbiAgICBsb2dnZXIuaW5mbygnW3dzXScsICdDb25uZWN0aW9uIGNsb3NlZCcsIGV2ZW50KVxuICAgIGlmICghZXZlbnQud2FzQ2xlYW4gfHwgZXZlbnQuY29kZSAhPT0gMTAwMCkge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ1dlYlNvY2tldCBlcnJvcicpXG4gICAgICBlcnJvci5yZXNwb25zZSA9IHtcbiAgICAgICAgY29kZTogZXZlbnQuY29kZSxcbiAgICAgICAgcmVhc29uOiBldmVudC5yZWFzb25cbiAgICAgIH1cbiAgICAgIGRpc3BhdGNoKGNvbm5lY3Rpb25BZ2VudEZhaWx1cmUoZXJyb3IpKVxuICAgIH1cbiAgICBkaXNwYXRjaChyZXZva2VBZ2VudEF1dGhlbnRpY2F0aW9uKCkpXG4gICAgZGlzcGF0Y2goZGlzY29ubmVjdGlvbkFnZW50U3VjY2VzcygpKVxuICB9KVxuICByZW1vdGUub25DbG9zaW5nKChldmVudCkgPT4ge1xuICAgIGxvZ2dlci5pbmZvKCdbd3NdJywgJ0Nsb3NpbmcgY29ubmVjdGlvbi4uLicpXG4gICAgLy8gVGhpcyBpcyBhIG1hbnVhbCBjbG9zZVxuICAgIGRpc3BhdGNoKGRpc2Nvbm5lY3Rpb25BZ2VudFJlcXVlc3QoKSlcbiAgfSlcbiAgcmVtb3RlLm9uRXJyb3IoKGV2ZW50KSA9PiB7XG4gICAgbG9nZ2VyLmluZm8oJ1t3c10nLCAnQ29ubmVjdGlvbiBlcnJvcicsIGV2ZW50KVxuICB9KVxuXG4gIC8vIExpc3RlbiBjb25uZWN0aW9uIHJlYWR5XG4gIHJlbW90ZS5vbihQUk9UTy5DT05OX1JFQURZLCAoKSA9PiB7XG4gICAgZGlzcGF0Y2goYXV0ZW50aWNhdGVBZ2VudFN1Y2Nlc3MoKSlcbiAgICBkaXNwYXRjaChmZXRjaFNlY3Rpb25zKCkpXG4gICAgZGlzcGF0Y2goZmV0Y2hBZ2VudCgpKVxuICB9KVxuICAvLyBMaXN0ZW4gYWdlbnQgcGFzc3dvcmQgbmVlZGVkXG4gIHJlbW90ZS5vbihQUk9UTy5BR0VOVF9QQVNTLCAoKSA9PiB7XG4gICAgbG9nZ2VyLmluZm8oJ05lZWRlZCBwYXNzJylcbiAgICAvLyBUcnkgdG8gdXNlIGEgcG9zc2libGUgdG1wIHBhc3NcbiAgICBkaXNwYXRjaCh0cnlQYXNzd29yZHMoKSlcbiAgfSlcbiAgLy8gTGlzdGVuIGF1dGggZXJyb3JzXG4gIHJlbW90ZS5vbihQUk9UTy5BVVRIX0VSUk9SLCAocmVzcG9uc2UpID0+IHtcbiAgICBsb2dnZXIuaW5mbygnQXV0aCBlcnJvcicpXG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ0F1dGhlbnRpY2F0aW9uIGVycm9yJylcbiAgICBjb25zdCBkYXRhID0gcmVzcG9uc2UudG9KU09OKClcbiAgICBlcnJvci5yZXNwb25zZSA9IHtcbiAgICAgIGNvZGU6IGRhdGEuY29kZSxcbiAgICAgIHJlYXNvbjogZGF0YS5yZWFzb25cbiAgICB9XG4gICAgZGlzcGF0Y2goYXV0ZW50aWNhdGVBZ2VudEZhaWx1cmUoZXJyb3IpKVxuICB9KVxuXG4gIC8vIFN5c3RlbSAvL1xuICBiaW5kU3lzdGVtUmVzcG9uc2VzKHJlbW90ZSwgZGlzcGF0Y2gsIGludGwpXG4gIC8vIFByb2Nlc3NlcyAvL1xuICBiaW5kUHJvY2Vzc2VzUmVzcG9uc2VzKHJlbW90ZSwgZGlzcGF0Y2gsIGludGwpXG4gIC8vIEZpbGVzIC8vXG4gIGJpbmRGaWxlc1Jlc3BvbnNlcyhyZW1vdGUsIGRpc3BhdGNoLCBpbnRsKVxuICAvLyBTZXJ2aWNlcyAvL1xuICBiaW5kU2VydmljZXNSZXNwb25zZXMocmVtb3RlLCBkaXNwYXRjaCwgaW50bClcbiAgLy8gVGVybWluYWwgLy9cbiAgYmluZFRlcm1pbmFsUmVzcG9uc2VzKHJlbW90ZSwgZGlzcGF0Y2gsIGludGwpXG59XG4iLCJpbXBvcnQgTG9nZ2VyIGZyb20gJy4uL2NvbW1vbi9saWIvTG9nZ2VyJ1xuaW1wb3J0IHsgUFJPVE8gfSBmcm9tICcuLi9jb25zdGFudHMnXG5pbXBvcnQgUHJvY2Vzc2VzQWN0aW9ucyBmcm9tICcuLi9wcm9jZXNzZXMtbWFuYWdlci9hY3Rpb25zJ1xuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHsgc2VjdGlvbjogJ1Byb2Nlc3NlcyByZXNwb25zZScgfSlcblxuZXhwb3J0IGRlZmF1bHQgKHJlbW90ZSwgZGlzcGF0Y2gpID0+IHtcbiAgcmVtb3RlLm9uKFBST1RPLlBST0NFU1NFUywgKHJlc3BvbnNlKSA9PiB7XG4gICAgLy8gZGF0YSBzaG91bGQgYmUgYSBKU09OXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS50b0pTT04oKVxuXG4gICAgICBpZiAodHlwZW9mIGRhdGEuYWN0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBhY3Rpb24gb24gbWVzc2FnZScpXG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5pbmZvKCdbUFJPVE8uUFJPQ0VTU0VTXScsIGRhdGEpXG5cbiAgICAgIHN3aXRjaCAoZGF0YS5hY3Rpb24pIHtcbiAgICAgICAgY2FzZSAnbGlzdCc6XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBsaXN0XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmxpc3QgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBwYXJhbWV0ZXIgb24gbWVzc2FnZScpXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgc3lzaW5mb1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS5zeXNpbmZvICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyIG9uIG1lc3NhZ2UnKVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIHRpbWVzdGFtcFxuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS50aW1lc3RhbXAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBwYXJhbWV0ZXIgb24gbWVzc2FnZScpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gUGFyc2Ugc3lzaW5mb1xuICAgICAgICAgIGxldCB0b3RhbFJBTSA9IE51bWJlci5wYXJzZUZsb2F0KGRhdGEuc3lzaW5mby5yYW1fdG90YWwpXG4gICAgICAgICAgbGV0IGF2YWlsYWJsZVJBTSA9IE51bWJlci5wYXJzZUZsb2F0KGRhdGEuc3lzaW5mby5yYW1fYXZhaWwpXG5cbiAgICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHRvdGFsUkFNKSB8fCBOdW1iZXIuaXNOYU4oYXZhaWxhYmxlUkFNKSB8fFxuICAgICAgICAgICAgICB0b3RhbFJBTSA8IDAgfHwgYXZhaWxhYmxlUkFNIDwgMCB8fCBhdmFpbGFibGVSQU0gPiB0b3RhbFJBTSkge1xuICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKCdJbnZhbGlkIHBhcmFtZXRlciBvbiBtZXNzYWdlJylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFeHBlY3QgdGhlIGRhdGEgaW4gS0IgYW5kIGNvbnZlcnRzIGl0IHRvIEJ5dGVzXG4gICAgICAgICAgdG90YWxSQU0gKj0gMTAyNFxuICAgICAgICAgIGF2YWlsYWJsZVJBTSAqPSAxMDI0XG5cbiAgICAgICAgICBsZXQgc3lzdGVtSW5mbyA9IHtcbiAgICAgICAgICAgIHRvdGFsUkFNLFxuICAgICAgICAgICAgYXZhaWxhYmxlUkFNXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgUHJvY2Vzc2VzQWN0aW9ucy5mZXRjaChkYXRhLmxpc3QsIHN5c3RlbUluZm8sIGRhdGEudGltZXN0YW1wKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3N0b3AnOlxuICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgcmVzdWx0XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLnJlc3VsdCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlciBvbiBtZXNzYWdlJylcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBwaWRcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGEucGlkICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyIG9uIG1lc3NhZ2UnKVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIHByb2Nlc3NfbmFtZVxuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS5wcm9jZXNzX25hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBwYXJhbWV0ZXIgb24gbWVzc2FnZScpXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgdGltZXN0YW1wXG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLnRpbWVzdGFtcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlciBvbiBtZXNzYWdlJylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZGF0YS5tZXNzYWdlKSBsb2dnZXIuaW5mbyhkYXRhLm1lc3NhZ2UpXG4gICAgICAgICAgaWYgKGRhdGEucmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBSZW1vdmUgcHJvY2Vzc1xuICAgICAgICAgICAgUHJvY2Vzc2VzQWN0aW9ucy5yZW1vdmUoZGF0YS5waWQsIGRhdGEucHJvY2Vzc19uYW1lKVxuICAgICAgICAgICAgLy8gQ2xlYW4gc2VsZWN0ZWQgcHJvY2Vzc1xuICAgICAgICAgICAgUHJvY2Vzc2VzQWN0aW9ucy5jbGVhblNlbGVjdGVkKClcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUmVtb3ZlIHRoZSBwcm9jZXNzIGZyb20gdGhlIGxpc3Qgb2YgcHJvY2Vzc2VzIGluIHN0b3BwaW5nIHN0YXRlXG4gICAgICAgICAgUHJvY2Vzc2VzQWN0aW9ucy5yZW1vdmVGcm9tU3RvcHBpbmcoZGF0YS5waWQsIGRhdGEucHJvY2Vzc19uYW1lKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0ludmFsaWQgYWN0aW9uOicsIGRhdGEuYWN0aW9uKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgfVxuICB9KVxufVxuIiwiaW1wb3J0IExvZ2dlciBmcm9tICcuLi9jb21tb24vbGliL0xvZ2dlcidcbmltcG9ydCB7IFBST1RPIH0gZnJvbSAnLi4vY29uc3RhbnRzJ1xuaW1wb3J0IFNlcnZpY2VzQWN0aW9ucyBmcm9tICcuLi9zZXJ2aWNlcy1tYW5hZ2VyL2FjdGlvbnMnXG5cbmNvbnN0IGxvZ2dlciA9IG5ldyBMb2dnZXIoeyBzZWN0aW9uOiAnRmlsZXMgcmVzcG9uc2UnIH0pXG5cbmV4cG9ydCBkZWZhdWx0IChyZW1vdGUsIGRpc3BhdGNoKSA9PiB7XG4gIHJlbW90ZS5vbihQUk9UTy5TRVJWSUNFUywgKHJlc3BvbnNlKSA9PiB7XG4gICAgLy8gZGF0YSBzaG91bGQgYmUgYSBKU09OXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS50b0pTT04oKVxuXG4gICAgICBpZiAodHlwZW9mIGRhdGEuYWN0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBhY3Rpb24gb24gbWVzc2FnZScpXG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZGF0YS5hY3Rpb24pIHtcbiAgICAgICAgY2FzZSAnbGlzdCc6XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBsaXN0XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLmxpc3QgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBwYXJhbWV0ZXIgb24gbWVzc2FnZScpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS50aW1lc3RhbXAgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTWlzc2luZyBwYXJhbWV0ZXIgb24gbWVzc2FnZScpXG4gICAgICAgICAgfVxuICAgICAgICAgIFNlcnZpY2VzQWN0aW9ucy5mZXRjaChkYXRhLmxpc3QsIGRhdGEudGltZXN0YW1wKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgJ3N0YXJ0JzpcbiAgICAgICAgY2FzZSAnc3RvcCc6XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBsaXN0XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLnJlc3VsdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlciBvbiBtZXNzYWdlJylcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLnN0YXR1cyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlciBvbiBtZXNzYWdlJylcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLnNlcnZpY2VfbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlciBvbiBtZXNzYWdlJylcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhLnRpbWVzdGFtcCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlciBvbiBtZXNzYWdlJylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBzdGF0dXMtdGltZXN0YW1wLXJlc3VsdC1zZXJ2aWNlX25hbWVcbiAgICAgICAgICBpZiAoZGF0YS5tZXNzYWdlKSBsb2dnZXIuaW5mbyhkYXRhLm1lc3NhZ2UpXG4gICAgICAgICAgaWYgKGRhdGEucmVzdWx0KSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNlcnZpY2Ugc3RhdHVzXG4gICAgICAgICAgICBTZXJ2aWNlc0FjdGlvbnMudXBkYXRlU3RhdHVzKGRhdGEuc2VydmljZV9uYW1lLCBkYXRhLnN0YXR1cylcbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgc2VydmljZSBmcm9tIHRoZSBsaXN0IG9mIHNlcnZpY2VzIGluIHVwZGF0aW5nIHN0YXRlXG4gICAgICAgICAgICBTZXJ2aWNlc0FjdGlvbnMucmVtb3ZlRnJvbVVwZGF0aW5nKGRhdGEuc2VydmljZV9uYW1lKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdJbnZhbGlkIGFjdGlvbicsIGRhdGEuYWN0aW9uKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgfVxuICB9KVxufVxuIiwiaW1wb3J0IExvZ2dlciBmcm9tICcuLi9jb21tb24vbGliL0xvZ2dlcidcbmltcG9ydCB7IFBST1RPIH0gZnJvbSAnLi4vY29uc3RhbnRzJ1xuaW1wb3J0IHsgZmV0Y2hTZWN0aW9uc1N1Y2Nlc3MsIGFsbG93U2VjdGlvbiwgZmV0Y2hSZW1vdGVTZWN0aW9uRW5kIH0gZnJvbSAnLi4vYWN0aW9ucy9hcHAnXG5pbXBvcnQgeyBmZXRjaEFnZW50U3VjY2VzcywgZ2V0VGVtcFBhc3NTdWNjZXNzIH0gZnJvbSAnLi4vYWN0aW9ucy9hZ2VudCdcblxuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih7IHNlY3Rpb246ICdTeXN0ZW0gcmVzcG9uc2UnIH0pXG5cbmV4cG9ydCBkZWZhdWx0IChyZW1vdGUsIGRpc3BhdGNoKSA9PiB7XG4gIHJlbW90ZS5vbihQUk9UTy5TWVNURU0sIChyZXNwb25zZSkgPT4ge1xuICAgIC8vIGRhdGEgc2hvdWxkIGJlIGEgSlNPTlxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2UudG9KU09OKClcblxuICAgICAgaWYgKHR5cGVvZiBkYXRhLmFjdGlvbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ01pc3NpbmcgYWN0aW9uIG9uIG1lc3NhZ2UnKVxuICAgICAgfVxuXG4gICAgICAvLyBsb2dnZXIuaW5mbygnW1BST1RPLlNZU1RFTV0nLCBkYXRhKVxuXG4gICAgICBzd2l0Y2ggKGRhdGEuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgJ2dldCc6XG4gICAgICAgICAgbGV0IGFnZW50RGF0YSA9IGRhdGEuZ2V0IHx8IHt9XG4gICAgICAgICAgbGV0IHN5c3RlbUluZm8gPSB7XG4gICAgICAgICAgICBpZDogcmVtb3RlLmFnZW50SURcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciB1cHRpbWVcbiAgICAgICAgICBpZiAodHlwZW9mIGFnZW50RGF0YS51cHRpbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihhZ2VudERhdGEudXB0aW1lKSkge1xuICAgICAgICAgICAgICBzeXN0ZW1JbmZvLnVwdGltZSA9IE51bWJlci5wYXJzZUludChhZ2VudERhdGEudXB0aW1lLCAxMClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciB2ZXJzaW9uXG4gICAgICAgICAgaWYgKHR5cGVvZiBhZ2VudERhdGEudmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHN5c3RlbUluZm8udmVyc2lvbiA9IGFnZW50RGF0YS52ZXJzaW9uXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgYWRkcmVzc1xuICAgICAgICAgIGlmICh0eXBlb2YgYWdlbnREYXRhLmFkZHJlc3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBzeXN0ZW1JbmZvLmFkZHJlc3MgPSBhZ2VudERhdGEuYWRkcmVzc1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIGhvc3RuYW1lXG4gICAgICAgICAgaWYgKHR5cGVvZiBhZ2VudERhdGEuaG9zdG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBzeXN0ZW1JbmZvLmhvc3RuYW1lID0gYWdlbnREYXRhLmhvc3RuYW1lXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgZGVzY3JpcHRpb25cbiAgICAgICAgICBpZiAodHlwZW9mIGFnZW50RGF0YS5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHN5c3RlbUluZm8uZGVzY3JpcHRpb24gPSBhZ2VudERhdGEuZGVzY3JpcHRpb25cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBsYW5ndWFnZVxuICAgICAgICAgIGlmICh0eXBlb2YgYWdlbnREYXRhLmxhbmd1YWdlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc3lzdGVtSW5mby5sYW5ndWFnZSA9IGFnZW50RGF0YS5sYW5ndWFnZVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIG9zXG4gICAgICAgICAgaWYgKHR5cGVvZiBhZ2VudERhdGEub3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBzeXN0ZW1JbmZvLm9zID0gYWdlbnREYXRhLm9zXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgb3NWZXJzaW9uXG4gICAgICAgICAgaWYgKHR5cGVvZiBhZ2VudERhdGEub3NWZXJzaW9uID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc3lzdGVtSW5mby5vc1ZlcnNpb24gPSBhZ2VudERhdGEub3NWZXJzaW9uXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgYXJjaGl0ZWN0dXJlXG4gICAgICAgICAgaWYgKHR5cGVvZiBhZ2VudERhdGEuYXJjaGl0ZWN0dXJlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgc3lzdGVtSW5mby5hcmNoaXRlY3R1cmUgPSBhZ2VudERhdGEuYXJjaGl0ZWN0dXJlXG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIEV4cGVjdCBwYXJhbWV0ZXIgY3B1RGVzY3JpcHRpb25cbiAgICAgICAgICBpZiAodHlwZW9mIGFnZW50RGF0YS5jcHVEZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHN5c3RlbUluZm8uY3B1RGVzY3JpcHRpb24gPSBhZ2VudERhdGEuY3B1RGVzY3JpcHRpb25cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciByYW1cbiAgICAgICAgICBpZiAodHlwZW9mIGFnZW50RGF0YS5yYW0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihhZ2VudERhdGEucmFtKSkge1xuICAgICAgICAgICAgICBzeXN0ZW1JbmZvLnJhbSA9IE51bWJlci5wYXJzZUludChhZ2VudERhdGEucmFtLCAxMClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBoZGRcbiAgICAgICAgICBpZiAodHlwZW9mIGFnZW50RGF0YS5oZGQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihhZ2VudERhdGEuaGRkKSkge1xuICAgICAgICAgICAgICBzeXN0ZW1JbmZvLmhkZCA9IE51bWJlci5wYXJzZUludChhZ2VudERhdGEuaGRkLCAxMClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpXG4gICAgICAgICAgZGlzcGF0Y2goZmV0Y2hBZ2VudFN1Y2Nlc3Moc3lzdGVtSW5mbywgbm93KSlcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdzZWN0aW9uJzpcbiAgICAgICAgICBjb25zdCBzZWN0aW9ucyA9IGRhdGEuc2VjdGlvblxuXG4gICAgICAgICAgaWYgKHNlY3Rpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gW11cbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KClcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHNlY3Rpb25zLmRpc3BsYXlNYW5hZ2VyKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXk6ICdkaXNwbGF5JyxcbiAgICAgICAgICAgICAgICBlbmFibGVkOiBzZWN0aW9ucy5kaXNwbGF5TWFuYWdlciA9PT0gMSxcbiAgICAgICAgICAgICAgICBhbGxvdzogdHlwZW9mIChzZWN0aW9ucy5hc2tEaXNwbGF5TWFuYWdlcikgPT09ICd1bmRlZmluZWQnLFxuICAgICAgICAgICAgICAgIGluZm9ybTogc2VjdGlvbnMuaW5mb3JtRGlzcGxheU1hbmFnZXIgPT09IDFcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHNlY3Rpb25zLmZpbGVUcmFuc2ZlcikgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIGRhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiAnZmlsZXMnLFxuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHNlY3Rpb25zLmZpbGVUcmFuc2ZlciA9PT0gMSxcbiAgICAgICAgICAgICAgICBhbGxvdzogdHlwZW9mIChzZWN0aW9ucy5hc2tGaWxlVHJhbnNmZXIpID09PSAndW5kZWZpbmVkJyxcbiAgICAgICAgICAgICAgICBpbmZvcm06IHNlY3Rpb25zLmluZm9ybUZpbGVUcmFuc2ZlciA9PT0gMVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoc2VjdGlvbnMucmVtb3RlU2hlbGwpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogJ3Rlcm1pbmFsJyxcbiAgICAgICAgICAgICAgICBlbmFibGVkOiBzZWN0aW9ucy5yZW1vdGVTaGVsbCA9PT0gMSxcbiAgICAgICAgICAgICAgICBhbGxvdzogdHlwZW9mIChzZWN0aW9ucy5hc2tSZW1vdGVTaGVsbCkgPT09ICd1bmRlZmluZWQnLFxuICAgICAgICAgICAgICAgIGluZm9ybTogc2VjdGlvbnMuaW5mb3JtUmVtb3RlU2hlbGwgPT09IDFcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHNlY3Rpb25zLnNlY3Rpb25Qcm9jZXNzZXMpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogJ3Byb2Nlc3NlcycsXG4gICAgICAgICAgICAgICAgZW5hYmxlZDogc2VjdGlvbnMuc2VjdGlvblByb2Nlc3NlcyA9PT0gMSxcbiAgICAgICAgICAgICAgICBhbGxvdzogdHlwZW9mIChzZWN0aW9ucy5hc2tTZWN0aW9uUHJvY2Vzc2VzKSA9PT0gJ3VuZGVmaW5lZCcsXG4gICAgICAgICAgICAgICAgaW5mb3JtOiBzZWN0aW9ucy5pbmZvcm1TZWN0aW9uUHJvY2Vzc2VzID09PSAxXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogJ3Byb2Nlc3NlcycsXG4gICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhbGxvdzogdHJ1ZVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoc2VjdGlvbnMuc2VjdGlvblNlcnZpY2VzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXk6ICdzZXJ2aWNlcycsXG4gICAgICAgICAgICAgICAgZW5hYmxlZDogc2VjdGlvbnMuc2VjdGlvblNlcnZpY2VzID09PSAxLFxuICAgICAgICAgICAgICAgIGFsbG93OiB0eXBlb2YgKHNlY3Rpb25zLmFza1NlY3Rpb25TZXJ2aWNlcykgPT09ICd1bmRlZmluZWQnLFxuICAgICAgICAgICAgICAgIGluZm9ybTogc2VjdGlvbnMuaW5mb3JtU2VjdGlvblNlcnZpY2VzID09PSAxXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogJ3NlcnZpY2VzJyxcbiAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgIGFsbG93OiB0cnVlXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIChzZWN0aW9ucy5zZWN0aW9uU2hhcmUpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleTogJ3NoYXJlJyxcbiAgICAgICAgICAgICAgICBlbmFibGVkOiBzZWN0aW9ucy5zZWN0aW9uU2hhcmUgPT09IDEsXG4gICAgICAgICAgICAgICAgYWxsb3c6IHR5cGVvZiAoc2VjdGlvbnMuYXNrU2VjdGlvblNoYXJlKSA9PT0gJ3VuZGVmaW5lZCcsXG4gICAgICAgICAgICAgICAgaW5mb3JtOiBzZWN0aW9ucy5pbmZvcm1TZWN0aW9uU2hhcmUgPT09IDFcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRhdGEucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5OiAnc2hhcmUnLFxuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgYWxsb3c6IHRydWVcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRpc3BhdGNoKGZldGNoU2VjdGlvbnNTdWNjZXNzKGRhdGEsIG5vdykpXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0ludmFsaWQgYWN0aW9uOicsIGRhdGEuYWN0aW9uKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgfVxuICB9KVxuXG4gIHJlbW90ZS5vbihQUk9UTy5URU1QX1BBU1MsIChyZXNwb25zZSkgPT4ge1xuICAgIC8vIGRhdGEgc2hvdWxkIGJlIGEgSlNPTlxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2UudG9KU09OKClcblxuICAgICAgaWYgKHR5cGVvZiBkYXRhLmFjdGlvbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ01pc3NpbmcgYWN0aW9uIG9uIG1lc3NhZ2UnKVxuICAgICAgfVxuXG4gICAgICAvLyBsb2dnZXIuaW5mbygnW1BST1RPLlRFTVBfUEFTU10nLCBkYXRhKVxuXG4gICAgICBzd2l0Y2ggKGRhdGEuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgJ2dldF90ZW1wX3Bhc3MnOlxuICAgICAgICAgIGNvbnN0IHBhc3MgPSBkYXRhLnBhc3N3b3JkXG4gICAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gZGF0YS5leHBpcmVzXG4gICAgICAgICAgLy8gZ2V0VGVtcFBhc3NGYWlsdXJlKGVycilcbiAgICAgICAgICBkaXNwYXRjaChnZXRUZW1wUGFzc1N1Y2Nlc3MocGFzcywgZXhwaXJlc0F0KSlcbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdJbnZhbGlkIGFjdGlvbjonLCBkYXRhLmFjdGlvbilcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGVycm9yKVxuICAgIH1cbiAgfSlcblxuICByZW1vdGUub24oUFJPVE8uVEVNUF9TRUNUSU9OLCAocmVzcG9uc2UpID0+IHtcbiAgICAvLyBkYXRhIHNob3VsZCBiZSBhIEpTT05cbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlLnRvSlNPTigpXG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YS5hY3Rpb24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdNaXNzaW5nIGFjdGlvbiBvbiBtZXNzYWdlJylcbiAgICAgIH1cblxuICAgICAgLy8gbG9nZ2VyLmluZm8oJ1tQUk9UTy5URU1QX1BBU1NdJywgZGF0YSlcblxuICAgICAgc3dpdGNoIChkYXRhLmFjdGlvbikge1xuICAgICAgICBjYXNlICdhY2Nlc3Nfc2VjdGlvbic6XG4gICAgICAgICAgLy8gRXhwZWN0IHBhcmFtZXRlciBzdGF0dXNcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGEuc3RhdHVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyIG9uIG1lc3NhZ2UnKVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBFeHBlY3QgcGFyYW1ldGVyIG9mZnNldFxuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YS5zZWN0aW9uID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ01pc3NpbmcgcGFyYW1ldGVyIG9uIG1lc3NhZ2UnKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYXRhLnN0YXR1cykge1xuICAgICAgICAgICAgZGlzcGF0Y2goYWxsb3dTZWN0aW9uKGRhdGEuc2VjdGlvbikpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpc3BhdGNoKGZldGNoUmVtb3RlU2VjdGlvbkVuZChkYXRhLnNlY3Rpb24pKVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdJbnZhbGlkIGFjdGlvbjonLCBkYXRhLmFjdGlvbilcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGVycm9yKVxuICAgIH1cbiAgfSlcbn1cbiIsImltcG9ydCBMb2dnZXIgZnJvbSAnLi4vY29tbW9uL2xpYi9Mb2dnZXInXG5pbXBvcnQgeyBQUk9UTyB9IGZyb20gJy4uL2NvbnN0YW50cydcbmltcG9ydCB7XG4gIHNhdmVUZXJtRGF0YSwgaW5pdGlhbGl6ZVRlcm1TdWNjZXNzLCBpbml0aWFsaXplVGVybUZhaWx1cmVcbn0gZnJvbSAnLi4vYWN0aW9ucy90ZXJtaW5hbCdcblxuY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih7IHNlY3Rpb246ICdUZXJtaW5hbCByZXNwb25zZScgfSlcblxuZXhwb3J0IGRlZmF1bHQgKHJlbW90ZSwgZGlzcGF0Y2gpID0+IHtcbiAgLy8gVGVybWluYWwgLy9cbiAgcmVtb3RlLm9uKFBST1RPLlRFUk0sIChyZXNwb25zZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBkaXNwYXRjaChzYXZlVGVybURhdGEocmVzcG9uc2UudG9TdHJpbmcoKSwgRGF0ZS5ub3coKSkpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihlcnJvcilcbiAgICB9XG4gIH0pXG4gIHJlbW90ZS5vbihQUk9UTy5URVJNX0lOSVQsIChyZXNwb25zZSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAocmVzcG9uc2UudG9TdHJpbmcoKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGRpc3BhdGNoKGluaXRpYWxpemVUZXJtU3VjY2VzcyhEYXRlLm5vdygpKSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBFcnJvcignRXJyb3IgaW5pdGlhbGl6aW5nIHRoZSB0ZXJtaW5hbCcpXG4gICAgICAgIGVyci5yZXNwb25zZSA9IHtcbiAgICAgICAgICBzdGF0dXM6IDUwMCxcbiAgICAgICAgICBzdGF0dXNUZXh0OiAnRXJyb3IgaW5pdGlhbGl6aW5nIHRoZSB0ZXJtaW5hbCdcbiAgICAgICAgfVxuICAgICAgICBkaXNwYXRjaChpbml0aWFsaXplVGVybUZhaWx1cmUoZXJyKSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGVycm9yKVxuICAgIH1cbiAgfSlcbn1cbiIsImNsYXNzIFNlcnZpY2Uge1xuICAvLyBTZXJ2aWNlcyBzdGF0dXNlcyBmb3IgV2luZG93c1xuICBzdGF0aWMgZ2V0IE5PVF9SVU5OSU5HICgpIHtcbiAgICByZXR1cm4gJ05vdCBydW5uaW5nJ1xuICB9XG4gIHN0YXRpYyBnZXQgU1RBUlRfUEVORElORyAoKSB7XG4gICAgcmV0dXJuICdTdGFydCBwZW5kaW5nJ1xuICB9XG4gIHN0YXRpYyBnZXQgU1RPUF9QRU5ESU5HICgpIHtcbiAgICByZXR1cm4gJ1N0b3AgcGVuZGluZydcbiAgfVxuICBzdGF0aWMgZ2V0IFJVTk5JTkcgKCkge1xuICAgIHJldHVybiAnUnVubmluZydcbiAgfVxuICBzdGF0aWMgZ2V0IFJFU1VNRV9QRU5ESU5HICgpIHtcbiAgICByZXR1cm4gJ1Jlc3VtZSBwZW5kaW5nJ1xuICB9XG4gIHN0YXRpYyBnZXQgUEFVU0VfUEVORElORyAoKSB7XG4gICAgcmV0dXJuICdQYXVzZSBwZW5kaW5nJ1xuICB9XG4gIHN0YXRpYyBnZXQgUEFVU0VEICgpIHtcbiAgICByZXR1cm4gJ1BhdXNlZCdcbiAgfVxuXG4gIHN0YXRpYyBnZXQgVU5LTk9XTiAoKSB7XG4gICAgcmV0dXJuICdVbmtub3duJ1xuICB9XG5cbiAgc3RhdGljIGdldCBwb3NzaWJsZVN0YXR1cyAoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IFNlcnZpY2UuTk9UX1JVTk5JTkcsXG4gICAgICAgIG1lc3NhZ2U6IFNlcnZpY2UubWVzc2FnZXMubm90UnVubmluZ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IFNlcnZpY2UuU1RBUlRfUEVORElORyxcbiAgICAgICAgbWVzc2FnZTogU2VydmljZS5tZXNzYWdlcy5zdGFydFBlbmRpbmdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiBTZXJ2aWNlLlNUT1BfUEVORElORyxcbiAgICAgICAgbWVzc2FnZTogU2VydmljZS5tZXNzYWdlcy5zdG9wUGVuZGluZ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IFNlcnZpY2UuUlVOTklORyxcbiAgICAgICAgbWVzc2FnZTogU2VydmljZS5tZXNzYWdlcy5ydW5uaW5nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB2YWx1ZTogU2VydmljZS5SRVNVTUVfUEVORElORyxcbiAgICAgICAgbWVzc2FnZTogU2VydmljZS5tZXNzYWdlcy5yZXN1bWVQZW5kaW5nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB2YWx1ZTogU2VydmljZS5QQVVTRV9QRU5ESU5HLFxuICAgICAgICBtZXNzYWdlOiBTZXJ2aWNlLm1lc3NhZ2VzLnBhdXNlUGVuZGluZ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IFNlcnZpY2UuUEFVU0VELFxuICAgICAgICBtZXNzYWdlOiBTZXJ2aWNlLm1lc3NhZ2VzLnBhdXNlZFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6IFNlcnZpY2UuVU5LTk9XTixcbiAgICAgICAgbWVzc2FnZTogU2VydmljZS5tZXNzYWdlcy51bmtub3duXG4gICAgICB9XG4gICAgXVxuICB9XG5cbiAgc3RhdGljIGdldCBtZXNzYWdlcyAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vdFJ1bm5pbmc6IHtcbiAgICAgICAgaWQ6ICdub3RSdW5uaW5nJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdOb3QgUnVubmluZydcbiAgICAgIH0sXG4gICAgICBzdGFydFBlbmRpbmc6IHtcbiAgICAgICAgaWQ6ICdzdGFydFBlbmRpbmcnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ1N0YXJ0IHBlbmRpbmcnXG4gICAgICB9LFxuICAgICAgc3RvcFBlbmRpbmc6IHtcbiAgICAgICAgaWQ6ICdzdG9wUGVuZGluZycsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnU3RvcCBwZW5kaW5nJ1xuICAgICAgfSxcbiAgICAgIHJ1bm5pbmc6IHtcbiAgICAgICAgaWQ6ICdydW5uaW5nJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdSdW5uaW5nJ1xuICAgICAgfSxcbiAgICAgIHJlc3VtZVBlbmRpbmc6IHtcbiAgICAgICAgaWQ6ICdyZXN1bWVQZW5kaW5nJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdSZXN1bWUgcGVuZGluZydcbiAgICAgIH0sXG4gICAgICBwYXVzZVBlbmRpbmc6IHtcbiAgICAgICAgaWQ6ICdwYXVzZVBlbmRpbmcnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ1BhdXNlIHBlbmRpbmcnXG4gICAgICB9LFxuICAgICAgcGF1c2VkOiB7XG4gICAgICAgIGlkOiAncGF1c2VkJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdQYXVzZWQnXG4gICAgICB9LFxuICAgICAgdW5rbm93bjoge1xuICAgICAgICBpZDogJ3Vua25vd24nLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ1Vua25vd24nXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldCBzb3J0SGFuZGxlciAoKSB7XG4gICAgcmV0dXJuIChwcm9wLCBvcmRlcikgPT4ge1xuICAgICAgLy8gT25seSBBU0Mgb3IgREVTQyBhcmUgc3VwcG9ydGVkXG4gICAgICBpZiAob3JkZXIgIT09ICdBU0MnICYmIG9yZGVyICE9PSAnREVTQycpIG9yZGVyID0gJ0FTQydcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICBsZXQgcmVzID0gMFxuICAgICAgICBpZiAoYVtwcm9wXSA9PT0gYltwcm9wXSkgcmVzID0gMFxuICAgICAgICBpZiAob3JkZXIgPT09ICdBU0MnKSByZXMgPSBhW3Byb3BdID4gYltwcm9wXSA/IDEgOiAtMVxuICAgICAgICBlbHNlIGlmIChvcmRlciA9PT0gJ0RFU0MnKSByZXMgPSBhW3Byb3BdIDwgYltwcm9wXSA/IDEgOiAtMVxuXG4gICAgICAgIHJldHVybiByZXNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IGRlZmF1dFNvcnRPYmplY3QgKCkge1xuICAgIGxldCByZXMgPSBuZXcgTWFwKClcbiAgICByZXMuc2V0KCdpZGVudGlmaWVyJywgJycpXG4gICAgcmVzLnNldCgnbmFtZScsICcnKVxuICAgIHJlcy5zZXQoJ2Rlc2NyaXB0aW9uJywgJycpXG4gICAgcmVzLnNldCgnc3RhdHVzJywgJycpXG5cbiAgICByZXR1cm4gcmVzXG4gIH1cblxuICBzdGF0aWMgZ2V0IGRlZmF1dEZpbHRlck9iamVjdCAoKSB7XG4gICAgbGV0IHJlcyA9IG5ldyBNYXAoKVxuICAgIHJlcy5zZXQoJ2lkZW50aWZpZXInLCAnJylcbiAgICByZXMuc2V0KCduYW1lJywgJycpXG4gICAgcmVzLnNldCgnZGVzY3JpcHRpb24nLCAnJylcbiAgICByZXMuc2V0KCdzdGF0dXMnLCAnJylcblxuICAgIHJldHVybiByZXNcbiAgfVxuXG4gIGNvbnN0cnVjdG9yIChwcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5pZGVudGlmaWVyID0gJydcbiAgICB0aGlzLm5hbWUgPSAnJ1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSAnJ1xuICAgIHRoaXMuc3RhdHVzID0gU2VydmljZS5VTktOT1dOXG5cbiAgICBpZiAodHlwZW9mIHByb3BzLmlkZW50aWZpZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgaWRlbnRpZmllciBvZiB0aGUgc2VydmljZSBpcyByZXF1aXJlZCcpXG4gICAgfVxuICAgIC8vIG5hbWUgc2hvdWxkIGJlIGEgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5uYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIG5hbWUgb2YgdGhlIHNlcnZpY2Ugc2hvdWxkIGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgdGhpcy5pZGVudGlmaWVyID0gcHJvcHMuaWRlbnRpZmllclxuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5uYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gbmFtZSBzaG91bGQgYmUgYSBzdHJpbmdcbiAgICAgIGlmICh0eXBlb2YgcHJvcHMubmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGZ1bGwgaWRlbnRpZmllciBvZiB0aGUgc2VydmljZSBzaG91bGQgYmUgYSBzdHJpbmcnKVxuICAgICAgfVxuICAgICAgdGhpcy5uYW1lID0gcHJvcHMubmFtZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hbWUgPSB0aGlzLmlkZW50aWZpZXJcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHByb3BzLmRlc2NyaXB0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IHByb3BzLmRlc2NyaXB0aW9uXG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwcm9wcy5zdGF0dXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLnN0YXR1cyA9IHByb3BzLnN0YXR1c1xuICAgIH1cbiAgfVxuXG4gIHNldCBzdGF0dXMgKHN0YXR1cykge1xuICAgIGlmICh0eXBlb2Ygc3RhdHVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRW1wdHkgc3RhdHVzJylcbiAgICB9XG4gICAgLy8gc3RhdHVzIHNob3VsZCBiZSBhIHN0cmluZ1xuICAgIGlmICh0eXBlb2Ygc3RhdHVzICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHN0YXR1cyBvZiB0aGUgc2VydmljZSBzaG91bGQgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICB0aGlzLl9fc3RhdHVzID0gU2VydmljZS5VTktOT1dOXG4gICAgLy8gT25seSBhY2NlcHQgZXhpc3Rpbmcgc3RhdHVzXG4gICAgc3RhdHVzID0gc3RhdHVzLnRyaW0oKVxuICAgIGlmIChzdGF0dXMgPT09IFNlcnZpY2UuTk9UX1JVTk5JTkcgfHxcbiAgICAgICAgc3RhdHVzID09PSBTZXJ2aWNlLlNUQVJUX1BFTkRJTkcgfHxcbiAgICAgICAgc3RhdHVzID09PSBTZXJ2aWNlLlNUT1BfUEVORElORyB8fFxuICAgICAgICBzdGF0dXMgPT09IFNlcnZpY2UuUlVOTklORyB8fFxuICAgICAgICBzdGF0dXMgPT09IFNlcnZpY2UuUkVTVU1FX1BFTkRJTkcgfHxcbiAgICAgICAgc3RhdHVzID09PSBTZXJ2aWNlLlBBVVNFX1BFTkRJTkcgfHxcbiAgICAgICAgc3RhdHVzID09PSBTZXJ2aWNlLlBBVVNFRCkge1xuICAgICAgdGhpcy5fX3N0YXR1cyA9IHN0YXR1c1xuICAgIH1cbiAgfVxuXG4gIGdldCBzdGF0dXMgKCkge1xuICAgIHJldHVybiB0aGlzLl9fc3RhdHVzXG4gIH1cblxuICBnZXQgbWVzc2FnZVN0YXR1cyAoKSB7XG4gICAgc3dpdGNoICh0aGlzLl9fc3RhdHVzKSB7XG4gICAgICBjYXNlIFNlcnZpY2UuTk9UX1JVTk5JTkc6XG4gICAgICAgIHJldHVybiBTZXJ2aWNlLm1lc3NhZ2VzLm5vdFJ1bm5pbmdcbiAgICAgIGNhc2UgU2VydmljZS5TVEFSVF9QRU5ESU5HOlxuICAgICAgICByZXR1cm4gU2VydmljZS5tZXNzYWdlcy5zdGFydFBlbmRpbmdcbiAgICAgIGNhc2UgU2VydmljZS5TVE9QX1BFTkRJTkc6XG4gICAgICAgIHJldHVybiBTZXJ2aWNlLm1lc3NhZ2VzLnN0b3BQZW5kaW5nXG4gICAgICBjYXNlIFNlcnZpY2UuUlVOTklORzpcbiAgICAgICAgcmV0dXJuIFNlcnZpY2UubWVzc2FnZXMucnVubmluZ1xuICAgICAgY2FzZSBTZXJ2aWNlLlJFU1VNRV9QRU5ESU5HOlxuICAgICAgICByZXR1cm4gU2VydmljZS5tZXNzYWdlcy5yZXN1bWVQZW5kaW5nXG4gICAgICBjYXNlIFNlcnZpY2UuUEFVU0VfUEVORElORzpcbiAgICAgICAgcmV0dXJuIFNlcnZpY2UubWVzc2FnZXMucGF1c2VQZW5kaW5nXG4gICAgICBjYXNlIFNlcnZpY2UuUEFVU0VEOlxuICAgICAgICByZXR1cm4gU2VydmljZS5tZXNzYWdlcy5wYXVzZWRcbiAgICAgIGNhc2UgU2VydmljZS5VTktOT1dOOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFNlcnZpY2UubWVzc2FnZXMudW5rbm93blxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBTZXJ2aWNlXG4iLCIvLyBzcmMvc2VydmljZXMtbWFuYWdlci9hY3Rpb25zL2luZGV4LmpzXG5cbmltcG9ydCBBcHBEaXNwYXRjaGVyIGZyb20gJy4uLy4uL2Rpc3BhdGNoZXInXG5pbXBvcnQgUmVtb3RlIGZyb20gJy4uLy4uL2NvbW1vbi9saWIvcmVtb3RlJ1xuaW1wb3J0IFNlcnZpY2VzQ29uc3RhbnRzIGZyb20gJy4uL2NvbnN0YW50cydcbmltcG9ydCB7IFBST1RPIH0gZnJvbSAnLi4vLi4vY29uc3RhbnRzJ1xuXG5jb25zdCBTZXJ2aWNlc0FjdGlvbnMgPSB7XG4gIC8vIC0tIFJlbW90ZSAtLSAvL1xuXG4gIHJlcXVlc3RMaXN0OiAoKSA9PiB7XG4gICAgUmVtb3RlLnNlbmQoe1xuICAgICAgcHJvdG86IFBST1RPLlNFUlZJQ0VTLFxuICAgICAgZGF0YToge1xuICAgICAgICBhY3Rpb246ICdsaXN0J1xuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgcmVxdWVzdFN0b3A6IChpZGVudGlmaWVyKSA9PiB7XG4gICAgUmVtb3RlLnNlbmQoe1xuICAgICAgcHJvdG86IFBST1RPLlNFUlZJQ0VTLFxuICAgICAgZGF0YToge1xuICAgICAgICBhY3Rpb246ICdzdG9wJyxcbiAgICAgICAgc2VydmljZV9uYW1lOiBpZGVudGlmaWVyXG4gICAgICB9XG4gICAgfSlcbiAgfSxcblxuICByZXF1ZXN0U3RhcnQ6IChpZGVudGlmaWVyKSA9PiB7XG4gICAgUmVtb3RlLnNlbmQoe1xuICAgICAgcHJvdG86IFBST1RPLlNFUlZJQ0VTLFxuICAgICAgZGF0YToge1xuICAgICAgICBhY3Rpb246ICdzdGFydCcsXG4gICAgICAgIHNlcnZpY2VfbmFtZTogaWRlbnRpZmllclxuICAgICAgfVxuICAgIH0pXG4gIH0sXG5cbiAgcmVxdWVzdFJlc3RhcnQ6IChpZGVudGlmaWVyKSA9PiB7XG4gICAgUmVtb3RlLnNlbmQoe1xuICAgICAgcHJvdG86IFBST1RPLlNFUlZJQ0VTLFxuICAgICAgZGF0YToge1xuICAgICAgICBhY3Rpb246ICdyZXN0YXJ0JyxcbiAgICAgICAgc2VydmljZV9uYW1lOiBpZGVudGlmaWVyXG4gICAgICB9XG4gICAgfSlcbiAgfSxcbiAgLy8gLS0gTG9jYWwgLS0gLy9cblxuICBpbml0aWFsaXplU3RvcmU6ICgpID0+IHtcbiAgICBBcHBEaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIGFjdGlvblR5cGU6IFNlcnZpY2VzQ29uc3RhbnRzLklOSVRfU0VSVklDRVNfU1RPUkVcbiAgICB9KVxuICB9LFxuXG4gIC8qKlxuICAgKiBGaWx0ZXIgdGhlIHNlcnZpY2VzIGxpc3RcbiAgICogQHBhcmFtICB7c3RyaW5nfSBwcm9wZXJ0eSBvZiB0aGUgc2VydmljZVxuICAgKiBAcGFyYW0gIHtzdHJpbmd9IFtvcHRpb25hbF0gdGV4dCBmaWx0ZXJcbiAgICovXG4gIGZpbHRlcjogKHByb3AsIGZpbHRlcikgPT4ge1xuICAgIEFwcERpc3BhdGNoZXIuZGlzcGF0Y2goe1xuICAgICAgYWN0aW9uVHlwZTogU2VydmljZXNDb25zdGFudHMuRklMVEVSX1NFUlZJQ0VTLFxuICAgICAgcHJvcDogcHJvcCxcbiAgICAgIGZpbHRlcjogZmlsdGVyXG4gICAgfSlcbiAgfSxcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBzZXJ2aWNlcyBkYXRhIGZyb20gdGhlIHNlcnZlclxuICAgKi9cbiAgZmV0Y2g6IChsaXN0LCB0aW1lc3RhbXApID0+IHtcbiAgICBBcHBEaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIGFjdGlvblR5cGU6IFNlcnZpY2VzQ29uc3RhbnRzLkZFVENIX1NFUlZJQ0VTLFxuICAgICAgbGlzdDogbGlzdCxcbiAgICAgIHRpbWVzdGFtcDogdGltZXN0YW1wXG4gICAgfSlcbiAgfSxcblxuICB1cGRhdGVTdGF0dXM6IChpZGVudGlmaWVyLCBzdGF0dXMpID0+IHtcbiAgICBBcHBEaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIGFjdGlvblR5cGU6IFNlcnZpY2VzQ29uc3RhbnRzLlVQREFURV9TVEFUVVMsXG4gICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgc3RhdHVzOiBzdGF0dXNcbiAgICB9KVxuICB9LFxuXG4gIGFkZFRvVXBkYXRpbmc6IChpZGVudGlmaWVyKSA9PiB7XG4gICAgQXBwRGlzcGF0Y2hlci5kaXNwYXRjaCh7XG4gICAgICBhY3Rpb25UeXBlOiBTZXJ2aWNlc0NvbnN0YW50cy5BRERfVE9fVVBEQVRJTkcsXG4gICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyXG4gICAgfSlcbiAgfSxcblxuICByZW1vdmVGcm9tVXBkYXRpbmc6IChpZGVudGlmaWVyKSA9PiB7XG4gICAgQXBwRGlzcGF0Y2hlci5kaXNwYXRjaCh7XG4gICAgICBhY3Rpb25UeXBlOiBTZXJ2aWNlc0NvbnN0YW50cy5SRU1PVkVfRlJPTV9VUERBVElORyxcbiAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXJcbiAgICB9KVxuICB9LFxuXG4gIC8qKlxuICAgKiBTZWxlY3QgYSBzZXJ2aWNlXG4gICAqIEBwYXJhbSAge3N0cmluZ30gaWRlbnRpZmllciBJZGVudGlmaWVyIG9mIHRoZSBzZXJ2aWNlIHRvIHN0YXJ5XG4gICAqL1xuICBzZWxlY3Q6IChpZGVudGlmaWVyKSA9PiB7XG4gICAgQXBwRGlzcGF0Y2hlci5kaXNwYXRjaCh7XG4gICAgICBhY3Rpb25UeXBlOiBTZXJ2aWNlc0NvbnN0YW50cy5TRUxFQ1RfU0VSVklDRSxcbiAgICAgIGlkZW50aWZpZXI6IGlkZW50aWZpZXJcbiAgICB9KVxuICB9LFxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIHNlcmN2aWNlIHNlbGVjdGlvblxuICAgKi9cbiAgY2xlYW5TZWxlY3RlZDogKCkgPT4ge1xuICAgIEFwcERpc3BhdGNoZXIuZGlzcGF0Y2goe1xuICAgICAgYWN0aW9uVHlwZTogU2VydmljZXNDb25zdGFudHMuQ0xFQU5fU0VMRUNURURfU0VSVklDRVxuICAgIH0pXG4gIH0sXG5cbiAgLyoqXG4gICAqIENoYW5nZSB0aGUgc2VydmljZXMgYXV0byB1cGRhdGUgcGVyaW9kXG4gICAqIEBwYXJhbSAge3N0cmluZ30gcGVyaW9kIFBlcmlvZCBpbiBzZWNvbmRzXG4gICAqL1xuICBjaGFuZ2VQZXJpb2Q6IChwZXJpb2QpID0+IHtcbiAgICBBcHBEaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgIGFjdGlvblR5cGU6IFNlcnZpY2VzQ29uc3RhbnRzLkNIQU5HRV9QRVJJT0QsXG4gICAgICBwZXJpb2Q6IHBlcmlvZFxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2VydmljZXNBY3Rpb25zXG4iLCIvLyBzcmMvc2VydmljZXMtbWFuYWdlci9jb21wb25lbnRzL3NlcnZpY2VzLWJ1dHRvbnMvaW5kZXguanN4XG5cbmltcG9ydCBSZWFjdCwgeyBQcm9wVHlwZXMgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGluamVjdEludGwgfSBmcm9tICdyZWFjdC1pbnRsJ1xuaW1wb3J0IHtcbiAgQnV0dG9uLCBCdXR0b25Hcm91cCxcbiAgR2x5cGhpY29uLCBPdmVybGF5VHJpZ2dlciwgVG9vbHRpcCwgRm9ybUNvbnRyb2xcbn0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuXG5pbXBvcnQgU2VydmljZSBmcm9tICcuLi8uLi9TZXJ2aWNlJ1xuaW1wb3J0IFNlcnZpY2VzQWN0aW9ucyBmcm9tICcuLi8uLi9hY3Rpb25zJ1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi4vLi4vLi4vY29tbW9uL2NvbXBvbmVudHMvQmFzZUNvbXBvbmVudCdcbmltcG9ydCBSZWZyZXNoQnV0dG9uIGZyb20gJy4uLy4uLy4uL2NvbW1vbi9jb21wb25lbnRzL3JlZnJlc2gtYnV0dG9uJ1xuXG5jbGFzcyBTZXJ2aWNlc0J1dHRvbnMgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgc3RhdGljIGdldCBwcm9wVHlwZXMgKCkge1xuICAgIHJldHVybiB7XG4gICAgICB1cGRhdGVQZXJpb2Q6IFByb3BUeXBlcy5udW1iZXIsXG4gICAgICBzZXJ2aWNlOiBQcm9wVHlwZXMub25lT2ZUeXBlKFtQcm9wVHlwZXMuaW5zdGFuY2VPZihTZXJ2aWNlKSwgUHJvcFR5cGVzLmJvb2xdKSxcbiAgICAgIGxhc3RVcGRhdGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5ib29sXSksXG4gICAgICBvblBlcmlvZENoYW5nZTogUHJvcFR5cGVzLmZ1bmNcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IGRlZmF1bHRQcm9wcyAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZVBlcmlvZDogMCxcbiAgICAgIHNlcnZpY2U6IGZhbHNlLFxuICAgICAgbGFzdFVwZGF0ZTogZmFsc2VcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvciAocHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcylcblxuICAgIHRoaXMuX2JpbmQoJ19faGFuZGxlU3RhcnRCdXR0b25DbGljaycsICdfX2hhbmRsZVN0b3BCdXR0b25DbGljaycsXG4gICAgICAnX19oYW5kbGVSZXN0YXJ0QnV0dG9uQ2xpY2snKVxuXG4gICAgdGhpcy5nZXRQZXJpb2RzID0gKGRlZmluZU1lc3NhZ2UpID0+IHtcbiAgICAgIHZhciBwZXJpb2RzID0gbmV3IE1hcCgpXG4gICAgICBwZXJpb2RzLnNldCgwLCBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuWF9TZWNvbmRzLCB7IG5TZWNvbmRzOiAwIH0pKVxuICAgICAgcGVyaW9kcy5zZXQoNSwgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLlhfU2Vjb25kcywgeyBuU2Vjb25kczogNSB9KSlcbiAgICAgIHBlcmlvZHMuc2V0KDEwLCBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuWF9TZWNvbmRzLCB7IG5TZWNvbmRzOiAxMCB9KSlcbiAgICAgIHBlcmlvZHMuc2V0KDE1LCBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuWF9TZWNvbmRzLCB7IG5TZWNvbmRzOiAxNSB9KSlcbiAgICAgIHBlcmlvZHMuc2V0KDMwLCBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuWF9TZWNvbmRzLCB7IG5TZWNvbmRzOiAzMCB9KSlcbiAgICAgIHBlcmlvZHMuc2V0KDYwLCBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuWF9NaW51dGVzLCB7IG5NaW51dGVzOiAxIH0pKVxuXG4gICAgICByZXR1cm4gcGVyaW9kc1xuICAgIH1cblxuICAgIC8vIE1lc3NhZ2VzIGRlZmluaXRpb25zXG4gICAgdGhpcy5tZXNzYWdlcyA9IHtcbiAgICAgIGNsaWNrT25BU2VydmljZToge1xuICAgICAgICBpZDogJ2NsaWNrT25BU2VydmljZScsXG4gICAgICAgIGRlZmluZU1lc3NhZ2U6ICdDbGljayBvbiBhIHNlcnZpY2UnXG4gICAgICB9LFxuICAgICAgcmVmcmVzaFNlcnZpY2VzOiB7XG4gICAgICAgIGlkOiAncmVmcmVzaFNlcnZpY2VzJyxcbiAgICAgICAgZGVmaW5lTWVzc2FnZTogJ1JlZnJlc2ggc2VydmljZXMnXG4gICAgICB9LFxuICAgICAgWF9TZWNvbmRzOiB7XG4gICAgICAgIGlkOiAnWF9TZWNvbmRzJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICd7blNlY29uZHMsIHBsdXJhbCwgPTB7TmV2ZXJ9IG9uZXsjIHNlY29uZH0gb3RoZXJ7IyBzZWNvbmRzfX0nLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ09ubHkgdHJhbnNsYXRlIFwiTmV2ZXJcIiwgXCJzZWNvbmRcIiBhbmQgXCJzZWNvbmRzXCInXG4gICAgICB9LFxuICAgICAgWF9NaW51dGVzOiB7XG4gICAgICAgIGlkOiAnWF9NaW51dGVzJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICd7bk1pbnV0ZXMsIHBsdXJhbCwgPTB7TmV2ZXJ9IG9uZXsjIG1pbnV0ZX0gb3RoZXJ7IyBtaW51dGVzfX0nLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ09ubHkgdHJhbnNsYXRlIFwiTmV2ZXJcIiwgXCJtaW51dGVcIiBhbmQgXCJtaW51dGVzXCInXG4gICAgICB9LFxuICAgICAgc3RvcFNlcnZpY2U6IHtcbiAgICAgICAgaWQ6ICdzdG9wU2VydmljZScsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnU3RvcCBzZXJ2aWNlJ1xuICAgICAgfSxcbiAgICAgIHN0YXJ0U2VydmljZToge1xuICAgICAgICBpZDogJ3N0YXJ0U2VydmljZScsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnU3RhcnQgc2VydmljZSdcbiAgICAgIH0sXG4gICAgICByZXN0YXJ0U2VydmljZToge1xuICAgICAgICBpZDogJ3Jlc3RhcnRTZXJ2aWNlJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdSZXN0YXJ0IHNlcnZpY2UnXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuXG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCAoKSB7XG5cbiAgfVxuXG4gIF9faGFuZGxlU3RhcnRCdXR0b25DbGljayAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgaWYgKHR5cGVvZiB0aGlzLnByb3BzLnNlcnZpY2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBBZGQgdGhlIHNlcnZpY2UgdG8gYSBsaXN0IG9mIHNlcnZpY2VzIGluIHVwZGF0aW5nIHN0YXRlXG4gICAgICBTZXJ2aWNlc0FjdGlvbnMuYWRkVG9VcGRhdGluZyh0aGlzLnByb3BzLnNlcnZpY2UuaWRlbnRpZmllcilcbiAgICAgIC8vIFVwZGF0ZSB0aGUgc2VydmljZSBzdGF0dXNcbiAgICAgIFNlcnZpY2VzQWN0aW9ucy51cGRhdGVTdGF0dXModGhpcy5wcm9wcy5zZXJ2aWNlLmlkZW50aWZpZXIsIFNlcnZpY2UuU1RBUlRfUEVORElORylcbiAgICAgIC8vIFJlcXVlc3QgdGhlIHNlcnZpY2UgY2hhbmdlXG4gICAgICBTZXJ2aWNlc0FjdGlvbnMucmVxdWVzdFN0YXJ0KHRoaXMucHJvcHMuc2VydmljZS5pZGVudGlmaWVyKVxuICAgIH1cbiAgfVxuXG4gIF9faGFuZGxlU3RvcEJ1dHRvbkNsaWNrIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICBpZiAodHlwZW9mIHRoaXMucHJvcHMuc2VydmljZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIEFkZCB0aGUgc2VydmljZSB0byBhIGxpc3Qgb2Ygc2VydmljZXMgaW4gdXBkYXRpbmcgc3RhdGVcbiAgICAgIFNlcnZpY2VzQWN0aW9ucy5yZW1vdmVGcm9tVXBkYXRpbmcodGhpcy5wcm9wcy5zZXJ2aWNlLmlkZW50aWZpZXIpXG4gICAgICAvLyBVcGRhdGUgdGhlIHNlcnZpY2Ugc3RhdHVzXG4gICAgICBTZXJ2aWNlc0FjdGlvbnMudXBkYXRlU3RhdHVzKHRoaXMucHJvcHMuc2VydmljZS5pZGVudGlmaWVyLCBTZXJ2aWNlLlNUT1BfUEVORElORylcbiAgICAgIC8vIFJlcXVlc3QgdGhlIHNlcnZpY2UgY2hhbmdlXG4gICAgICBTZXJ2aWNlc0FjdGlvbnMucmVxdWVzdFN0b3AodGhpcy5wcm9wcy5zZXJ2aWNlLmlkZW50aWZpZXIpXG4gICAgfVxuICB9XG5cbiAgX19oYW5kbGVSZXN0YXJ0QnV0dG9uQ2xpY2sgKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIGlmICh0eXBlb2YgdGhpcy5wcm9wcy5zZXJ2aWNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gQWRkIHRoZSBzZXJ2aWNlIHRvIGEgbGlzdCBvZiBzZXJ2aWNlcyBpbiB1cGRhdGluZyBzdGF0ZVxuICAgICAgU2VydmljZXNBY3Rpb25zLnJlbW92ZUZyb21VcGRhdGluZyh0aGlzLnByb3BzLnNlcnZpY2UuaWRlbnRpZmllcilcbiAgICAgIC8vIFVwZGF0ZSB0aGUgc2VydmljZSBzdGF0dXNcbiAgICAgIFNlcnZpY2VzQWN0aW9ucy51cGRhdGVTdGF0dXModGhpcy5wcm9wcy5zZXJ2aWNlLmlkZW50aWZpZXIsIFNlcnZpY2UuU1RPUF9QRU5ESU5HKVxuICAgICAgLy8gUmVxdWVzdCB0aGUgc2VydmljZSBjaGFuZ2VcbiAgICAgIFNlcnZpY2VzQWN0aW9ucy5yZXF1ZXN0UmVzdGFydCh0aGlzLnByb3BzLnNlcnZpY2UuaWRlbnRpZmllcilcbiAgICB9XG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHNlcnZpY2UgPSB0aGlzLnByb3BzLnNlcnZpY2VcbiAgICBjb25zdCBkZWZpbmVNZXNzYWdlID0gdGhpcy5wcm9wcy5pbnRsLmZvcm1hdE1lc3NhZ2VcbiAgICBsZXQgc2VydmljZVRleHQgPSBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuY2xpY2tPbkFTZXJ2aWNlKVxuICAgIGxldCBpc1NlbGVjdGVkID0gZmFsc2VcbiAgICBsZXQgc3RhcnRFbmFibGVkID0gZmFsc2VcbiAgICBsZXQgc3RvcEVuYWJsZWQgPSBmYWxzZVxuXG4gICAgaWYgKHNlcnZpY2UgaW5zdGFuY2VvZiBTZXJ2aWNlKSB7XG4gICAgICBzZXJ2aWNlVGV4dCA9IHNlcnZpY2UubmFtZVxuICAgICAgaXNTZWxlY3RlZCA9IHRydWVcbiAgICAgIHN0YXJ0RW5hYmxlZCA9IChzZXJ2aWNlLnN0YXR1cyA9PT0gU2VydmljZS5OT1RfUlVOTklORyB8fCBzZXJ2aWNlLnN0YXR1cyA9PT0gU2VydmljZS5QQVVTRUQpXG4gICAgICBzdG9wRW5hYmxlZCA9IChzZXJ2aWNlLnN0YXR1cyA9PT0gU2VydmljZS5SVU5OSU5HIHx8IHNlcnZpY2Uuc3RhdHVzID09PSBTZXJ2aWNlLlBBVVNFRClcbiAgICB9XG5cbiAgICBjb25zdCB0b29sdGlwID0gKGlkLCBtZXNzYWdlKSA9PiA8VG9vbHRpcCBpZD17aWR9PnttZXNzYWdlfTwvVG9vbHRpcD5cbiAgICBjb25zdCBoYW5kbGVSZWZyZXNoID0gKCkgPT4gU2VydmljZXNBY3Rpb25zLnJlcXVlc3RMaXN0KClcbiAgICBjb25zdCBoYW5kbGVQZXJpb2RDaGFuZ2UgPSAocGVyaW9kKSA9PiB7XG4gICAgICBpZiAodGhpcy5wcm9wcy5vblBlcmlvZENoYW5nZSkge1xuICAgICAgICBTZXJ2aWNlc0FjdGlvbnMuY2hhbmdlUGVyaW9kKHBlcmlvZClcbiAgICAgICAgdGhpcy5wcm9wcy5vblBlcmlvZENoYW5nZShwZXJpb2QpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVmcmVzaEJ1dHRvbiA9IChcbiAgICAgIDxSZWZyZXNoQnV0dG9uXG4gICAgICAgIGxhc3RVcGRhdGU9e3RoaXMucHJvcHMubGFzdFVwZGF0ZX1cbiAgICAgICAgcGVyaW9kcz17dGhpcy5nZXRQZXJpb2RzKGRlZmluZU1lc3NhZ2UpfVxuICAgICAgICBhY3RpdmVQZXJpb2Q9e3RoaXMucHJvcHMudXBkYXRlUGVyaW9kfVxuICAgICAgICBoYW5kbGVSZWZyZXNoPXtoYW5kbGVSZWZyZXNofVxuICAgICAgICBoYW5kbGVQZXJpb2RDaGFuZ2U9e2hhbmRsZVBlcmlvZENoYW5nZX0+XG4gICAgICAgIHsgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLnJlZnJlc2hTZXJ2aWNlcykgfVxuICAgICAgPC9SZWZyZXNoQnV0dG9uPlxuICAgIClcblxuICAgIGNvbnN0IHN0YXJ0QnV0dG9uID0gKFxuICAgICAgPE92ZXJsYXlUcmlnZ2VyXG4gICAgICAgIHBsYWNlbWVudD0nYm90dG9tJ1xuICAgICAgICBvdmVybGF5PXt0b29sdGlwKFxuICAgICAgICAgICdzZXJ2aWNlcy10b29sdGlwLXN0YXJ0JyxcbiAgICAgICAgICBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuc3RhcnRTZXJ2aWNlKVxuICAgICAgICApfT5cbiAgICAgICAgPEJ1dHRvblxuICAgICAgICAgIGRpc2FibGVkPXshc3RhcnRFbmFibGVkIHx8ICFpc1NlbGVjdGVkfVxuICAgICAgICAgIG9uQ2xpY2s9e3RoaXMuX19oYW5kbGVTdGFydEJ1dHRvbkNsaWNrfT5cbiAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdwbGF5JyAvPlxuICAgICAgICA8L0J1dHRvbj5cbiAgICAgIDwvT3ZlcmxheVRyaWdnZXI+XG4gICAgKVxuXG4gICAgY29uc3Qgc3RvcEJ1dHRvbiA9IChcbiAgICAgIDxPdmVybGF5VHJpZ2dlclxuICAgICAgICBwbGFjZW1lbnQ9J2JvdHRvbSdcbiAgICAgICAgb3ZlcmxheT17dG9vbHRpcChcbiAgICAgICAgICAnc2VydmljZXMtdG9vbHRpcC1zdG9wJyxcbiAgICAgICAgICBkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuc3RvcFNlcnZpY2UpXG4gICAgICAgICl9PlxuICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgZGlzYWJsZWQ9eyFzdG9wRW5hYmxlZCB8fCAhaXNTZWxlY3RlZH1cbiAgICAgICAgICBvbkNsaWNrPXt0aGlzLl9faGFuZGxlU3RvcEJ1dHRvbkNsaWNrfT5cbiAgICAgICAgICA8R2x5cGhpY29uIGdseXBoPSdzdG9wJyAvPlxuICAgICAgICA8L0J1dHRvbj5cbiAgICAgIDwvT3ZlcmxheVRyaWdnZXI+XG4gICAgKVxuICAgIGNvbnN0IHJlc3RhcnRCdXR0b24gPSAoXG4gICAgICA8T3ZlcmxheVRyaWdnZXJcbiAgICAgICAgcGxhY2VtZW50PSdib3R0b20nXG4gICAgICAgIG92ZXJsYXk9e3Rvb2x0aXAoXG4gICAgICAgICAgJ3NlcnZpY2VzLXRvb2x0aXAtcmVzdGFydCcsXG4gICAgICAgICAgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLnJlc3RhcnRTZXJ2aWNlKVxuICAgICAgICApfT5cbiAgICAgICAgPEJ1dHRvblxuICAgICAgICAgIGRpc2FibGVkPXshc3RvcEVuYWJsZWQgfHwgIWlzU2VsZWN0ZWR9XG4gICAgICAgICAgb25DbGljaz17dGhpcy5fX2hhbmRsZVJlc3RhcnRCdXR0b25DbGlja30+XG4gICAgICAgICAgPEdseXBoaWNvbiBnbHlwaD0ncmVwZWF0JyAvPlxuICAgICAgICA8L0J1dHRvbj5cbiAgICAgIDwvT3ZlcmxheVRyaWdnZXI+XG4gICAgKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPSdyb3cnPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY29sLW1kLTMgdGV4dC1sZWZ0Jz5cbiAgICAgICAgICB7IHJlZnJlc2hCdXR0b24gfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9J2NvbC1tZC03IHRleHQtcmlnaHQnPlxuICAgICAgICAgIDxGb3JtQ29udHJvbC5TdGF0aWM+XG4gICAgICAgICAgICB7IHNlcnZpY2VUZXh0IH1cbiAgICAgICAgICA8L0Zvcm1Db250cm9sLlN0YXRpYz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPSdjb2wtbWQtMiB0ZXh0LXJpZ2h0Jz5cbiAgICAgICAgICA8QnV0dG9uR3JvdXA+XG4gICAgICAgICAgICB7IHN0YXJ0QnV0dG9uIH1cbiAgICAgICAgICAgIHsgc3RvcEJ1dHRvbiB9XG4gICAgICAgICAgICB7IHJlc3RhcnRCdXR0b24gfVxuICAgICAgICAgIDwvQnV0dG9uR3JvdXA+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdEludGwoU2VydmljZXNCdXR0b25zKVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgRm9ybSwgRm9ybUdyb3VwLCBGb3JtQ29udHJvbCwgQ29udHJvbExhYmVsLCBDb2wgfSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQgeyBpbmplY3RJbnRsLCBpbnRsU2hhcGUsIEZvcm1hdHRlZE1lc3NhZ2UgfSBmcm9tICdyZWFjdC1pbnRsJ1xuXG5pbXBvcnQgU2VydmljZSBmcm9tICcuLi8uLi9TZXJ2aWNlJ1xuaW1wb3J0IFNlcnZpY2VzQWN0aW9ucyBmcm9tICcuLi8uLi9hY3Rpb25zJ1xuXG5jbGFzcyBTZXJ2aWNlc0ZpbHRlciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yIChwcm9wcykge1xuICAgIHN1cGVyKHByb3BzKVxuXG4gICAgdGhpcy5faGFuZGxlU2VhcmNoQ2hhbmdlID0gKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICBTZXJ2aWNlc0FjdGlvbnMuZmlsdGVyKFsnbmFtZScsICdkZXNjcmlwdGlvbiddLCBldmVudC50YXJnZXQudmFsdWUpXG4gICAgfVxuICAgIHRoaXMuX2hhbmRsZVR5cGVDaGFuZ2UgPSAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIFNlcnZpY2VzQWN0aW9ucy5maWx0ZXIoJ3N0YXR1cycsIGV2ZW50LnRhcmdldC52YWx1ZSlcbiAgICB9XG5cbiAgICB0aGlzLm1lc3NhZ2VzID0ge1xuICAgICAgdHlwZVRvRmlsdGVyOiB7XG4gICAgICAgIGlkOiAndHlwZVRvRmlsdGVyJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdUeXBlIHRvIGZpbHRlcidcbiAgICAgIH0sXG4gICAgICBhbnk6IHtcbiAgICAgICAgaWQ6ICdhbnknLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0FueSdcbiAgICAgIH0sXG4gICAgICBzZWFyY2g6IHtcbiAgICAgICAgaWQ6ICdzZWFyY2gnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ1NlYXJjaCdcbiAgICAgIH0sXG4gICAgICBzdGF0dXM6IHtcbiAgICAgICAgaWQ6ICdzdGF0dXMnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ1N0YXR1cydcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IGZpbHRlck5hbWUgPSB0aGlzLnByb3BzLmZpbHRlci5nZXQoJ25hbWUnKVxuICAgIGNvbnN0IGZpbHRlckRlc2NyaXB0aW9uID0gdGhpcy5wcm9wcy5maWx0ZXIuZ2V0KCdkZXNjcmlwdGlvbicpXG4gICAgY29uc3QgZGVmaW5lTWVzc2FnZSA9IHRoaXMucHJvcHMuaW50bC5mb3JtYXRNZXNzYWdlXG5cbiAgICBsZXQgdGV4dFZhbHVlID0gJydcbiAgICBpZiAodHlwZW9mIGZpbHRlck5hbWUgIT09ICd1bmRlZmluZWQnICYmIGZpbHRlck5hbWUubGVuZ3RoID4gMCkge1xuICAgICAgdGV4dFZhbHVlID0gZmlsdGVyTmFtZVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpbHRlckRlc2NyaXB0aW9uICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBmaWx0ZXJEZXNjcmlwdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICB0ZXh0VmFsdWUgPSBmaWx0ZXJEZXNjcmlwdGlvblxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8Rm9ybSBob3Jpem9udGFsIG9uU3VibWl0PXsoZSkgPT4gZS5wcmV2ZW50RGVmYXVsdCgpfT5cbiAgICAgICAgPEZvcm1Hcm91cCBjb250cm9sSWQ9J3NlcnZpY2VzLXNlYXJjaC10ZXh0Jz5cbiAgICAgICAgICA8Q29sIGNvbXBvbmVudENsYXNzPXtDb250cm9sTGFiZWx9IHNtPXsyfT5cbiAgICAgICAgICAgIDxGb3JtYXR0ZWRNZXNzYWdlIHsuLi50aGlzLm1lc3NhZ2VzLnNlYXJjaH0gLz5cbiAgICAgICAgICA8L0NvbD5cbiAgICAgICAgICA8Q29sIHNtPXsxMH0+XG4gICAgICAgICAgICA8Rm9ybUNvbnRyb2xcbiAgICAgICAgICAgICAgY29tcG9uZW50Q2xhc3M9J2lucHV0J1xuICAgICAgICAgICAgICB0eXBlPSd0ZXh0J1xuICAgICAgICAgICAgICBic1NpemU9J3NtYWxsJ1xuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17ZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLnR5cGVUb0ZpbHRlcil9XG4gICAgICAgICAgICAgIHZhbHVlPXt0ZXh0VmFsdWV9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLl9oYW5kbGVTZWFyY2hDaGFuZ2V9IC8+XG4gICAgICAgICAgPC9Db2w+XG4gICAgICAgIDwvRm9ybUdyb3VwPlxuICAgICAgICA8Rm9ybUdyb3VwIGNvbnRyb2xJZD0nc2VydmljZXMtc2VhcmNoLXN0YXR1cyc+XG4gICAgICAgICAgPENvbCBjb21wb25lbnRDbGFzcz17Q29udHJvbExhYmVsfSBzbT17Mn0+XG4gICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4udGhpcy5tZXNzYWdlcy5zdGF0dXN9IC8+XG4gICAgICAgICAgPC9Db2w+XG4gICAgICAgICAgPENvbCBzbT17MTB9PlxuICAgICAgICAgICAgPEZvcm1Db250cm9sXG4gICAgICAgICAgICAgIGNvbXBvbmVudENsYXNzPSdzZWxlY3QnXG4gICAgICAgICAgICAgIGJzU2l6ZT0nc21hbGwnXG4gICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnByb3BzLmZpbHRlci5nZXQoJ3N0YXR1cycpfVxuICAgICAgICAgICAgICBvbkNoYW5nZT17dGhpcy5faGFuZGxlVHlwZUNoYW5nZX0+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Jyc+XG4gICAgICAgICAgICAgICAgPEZvcm1hdHRlZE1lc3NhZ2Ugey4uLnRoaXMubWVzc2FnZXMuYW55fSAvPlxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFNlcnZpY2UucG9zc2libGVTdGF0dXMubWFwKChzdGF0dXMsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17aW5kZXh9IHZhbHVlPXtzdGF0dXMudmFsdWV9PlxuICAgICAgICAgICAgICAgICAgICA8Rm9ybWF0dGVkTWVzc2FnZSB7Li4uc3RhdHVzLm1lc3NhZ2V9IC8+XG4gICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICApKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L0Zvcm1Db250cm9sPlxuICAgICAgICAgIDwvQ29sPlxuICAgICAgICA8L0Zvcm1Hcm91cD5cbiAgICAgIDwvRm9ybT5cbiAgICApXG4gIH1cbn1cblxuU2VydmljZXNGaWx0ZXIucHJvcFR5cGVzID0ge1xuICBmaWx0ZXI6IFJlYWN0LlByb3BUeXBlcy5pbnN0YW5jZU9mKE1hcCkuaXNSZXF1aXJlZCxcbiAgaW50bDogaW50bFNoYXBlLmlzUmVxdWlyZWRcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5qZWN0SW50bChTZXJ2aWNlc0ZpbHRlcilcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFBhbmVsIH0gZnJvbSAncmVhY3QtYm9vdHN0cmFwJ1xuaW1wb3J0IHsgaW5qZWN0SW50bCwgaW50bFNoYXBlIH0gZnJvbSAncmVhY3QtaW50bCdcblxuaW1wb3J0IExvZ2dlciBmcm9tICcuLi8uLi8uLi9jb21tb24vbGliL0xvZ2dlcidcbmltcG9ydCBTZXJ2aWNlIGZyb20gJy4uLy4uL1NlcnZpY2UnXG5pbXBvcnQgU2VydmljZXNBY3Rpb25zIGZyb20gJy4uLy4uL2FjdGlvbnMnXG5pbXBvcnQgU2VydmljZXNTdG9yZSBmcm9tICcuLi8uLi9zdG9yZSdcblxuLy8gQ29tcG9uZW50c1xuaW1wb3J0IFNlcnZpY2VzRmlsdGVyIGZyb20gJy4uL3NlcnZpY2VzLWZpbHRlcidcbmltcG9ydCBTZXJ2aWNlc0J1dHRvbnMgZnJvbSAnLi4vc2VydmljZXMtYnV0dG9ucydcbmltcG9ydCBTZXJ2aWNlc1RhYmxlIGZyb20gJy4uL3NlcnZpY2VzLXRhYmxlJ1xuXG4vLyBIQUNLOiBGbHV4IGNhbm5vdCBzdXBwb3J0IGluamVjdEludGwgaW4gbWFpbiBDb21wb25lbnRzXG4vLyBUT0RPOiBNaWdyYXRlIHRvIFJlZHV4XG5jbGFzcyBTZXJ2aWNlc01haW5QdXJlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICAvLyBNZXNzYWdlcyBkZWZpbml0aW9uc1xuICAgIHRoaXMubWVzc2FnZXMgPSB7XG4gICAgICBmaWx0ZXI6IHtcbiAgICAgICAgaWQ6ICdmaWx0ZXInLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0ZpbHRlcidcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmVuZGVyICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBzZXJ2aWNlcywgc2VsZWN0ZWRTZXJ2aWNlLCBmaWx0ZXIsIGxhc3RVcGRhdGUsIHVwZGF0ZVBlcmlvZCwgb25QZXJpb2RDaGFuZ2VcbiAgICB9ID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IGRlZmluZU1lc3NhZ2UgPSB0aGlzLnByb3BzLmludGwuZm9ybWF0TWVzc2FnZVxuICAgIHJldHVybiAoXG4gICAgICA8c2VjdGlvbiBpZD0nc2VydmljZXMtbWFpbic+XG4gICAgICAgIDxQYW5lbFxuICAgICAgICAgIGNvbGxhcHNpYmxlXG4gICAgICAgICAgaGVhZGVyPXtkZWZpbmVNZXNzYWdlKHRoaXMubWVzc2FnZXMuZmlsdGVyKX1cbiAgICAgICAgICBjbGFzc05hbWU9J2hpZGRlbi14cyc+XG4gICAgICAgICAgPFNlcnZpY2VzRmlsdGVyIGZpbHRlcj17ZmlsdGVyfSAvPlxuICAgICAgICA8L1BhbmVsPlxuICAgICAgICA8U2VydmljZXNCdXR0b25zXG4gICAgICAgICAgc2VydmljZT17c2VsZWN0ZWRTZXJ2aWNlfVxuICAgICAgICAgIGxhc3RVcGRhdGU9e2xhc3RVcGRhdGV9XG4gICAgICAgICAgdXBkYXRlUGVyaW9kPXt1cGRhdGVQZXJpb2R9XG4gICAgICAgICAgb25QZXJpb2RDaGFuZ2U9e29uUGVyaW9kQ2hhbmdlfSAvPlxuICAgICAgICA8YnIgLz5cbiAgICAgICAgPFNlcnZpY2VzVGFibGUgc2VydmljZXM9e3NlcnZpY2VzfSBsYXN0VXBkYXRlPXtsYXN0VXBkYXRlfSAvPlxuICAgICAgPC9zZWN0aW9uPlxuICAgIClcbiAgfVxufVxuXG5jb25zdCBTZXJ2aWNlc01haW5JbnRsID0gaW5qZWN0SW50bChTZXJ2aWNlc01haW5QdXJlKVxuXG4vLyBJbXBsZW1lbnRzIGZsdXggQ29udGFpbmVyXG5jbGFzcyBTZXJ2aWNlc01haW4gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBzdGF0aWMgZ2V0U3RvcmVzICgpIHtcbiAgICByZXR1cm4gW1NlcnZpY2VzU3RvcmVdXG4gIH1cblxuICBzdGF0aWMgY2FsY3VsYXRlU3RhdGUgKHByZXZTdGF0ZSwgcHJvcHMpIHtcbiAgICBjb25zdCBzdGF0aWNMb2dnZXIgPSBuZXcgTG9nZ2VyKHsgc2VjdGlvbjogJ1NlcnZpY2VzIG1haW4gKHN0YXRpYyknIH0pXG5cbiAgICBsZXQgc2VydmljZXNcbiAgICB0cnkge1xuICAgICAgc2VydmljZXMgPSBTZXJ2aWNlc01haW4uZ2V0UHJvY2Vzc2VkU2VydmljZXMoKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzdGF0aWNMb2dnZXIuZXJyb3IoZXJyb3IpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlcnZpY2VzOiBzZXJ2aWNlcyB8fCBbXSxcbiAgICAgIHNlbGVjdGVkU2VydmljZTogU2VydmljZXNTdG9yZS5zZWxlY3RlZFNlcnZpY2UsXG4gICAgICBsYXN0VXBkYXRlOiBTZXJ2aWNlc1N0b3JlLnNlcnZpY2VzTGFzdFVwZGF0ZSxcbiAgICAgIHVwZGF0ZVBlcmlvZDogU2VydmljZXNTdG9yZS51cGRhdGVQZXJpb2QsXG4gICAgICBmaWx0ZXI6IFNlcnZpY2VzU3RvcmUuZmlsdGVyXG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldFByb2Nlc3NlZFNlcnZpY2VzICgpIHtcbiAgICBjb25zdCBzZXJ2aWNlcyA9IFNlcnZpY2VzU3RvcmUuc2VydmljZXNcbiAgICBjb25zdCBmaWx0ZXIgPSBTZXJ2aWNlc1N0b3JlLmZpbHRlclxuXG4gICAgaWYgKCEoc2VydmljZXMgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBzZXJ2aWNlcyBsaXN0IHNob3VsZCBiZSBhbiBBcnJheScpXG4gICAgfVxuICAgIGlmICghKGZpbHRlciBpbnN0YW5jZW9mIE1hcCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBmaWx0ZXIgc2hvdWxkIGJlIGEgTWFwJylcbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgdGhlIHNlcnZpY2VzXG4gICAgbGV0IHByb2Nlc3NlZFNlcnZpY2VzID0gc2VydmljZXMuZmlsdGVyKChzZXJ2aWNlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgbmFtZUZpbHRlciA9IGZpbHRlci5nZXQoJ25hbWUnKVxuICAgICAgY29uc3QgZGVzY0ZpbHRlciA9IGZpbHRlci5nZXQoJ2Rlc2NyaXB0aW9uJylcbiAgICAgIGNvbnN0IHN0YXR1c0ZpbHRlciA9IGZpbHRlci5nZXQoJ3N0YXR1cycpXG5cbiAgICAgIC8vIENoZWNrIG5hbWVcbiAgICAgIGlmICh0eXBlb2YgbmFtZUZpbHRlciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmFtZUZpbHRlci5sZW5ndGggPiAwICYmXG4gICAgICAgIHNlcnZpY2UubmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YobmFtZUZpbHRlci50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgLy8gQ2hlY2sgZGVzY3JpcHRpb25cbiAgICAgICAgaWYgKHR5cGVvZiBkZXNjRmlsdGVyICE9PSAndW5kZWZpbmVkJyAmJiBkZXNjRmlsdGVyLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIHNlcnZpY2UuZGVzY3JpcHRpb24udG9Mb3dlckNhc2UoKS5pbmRleE9mKGRlc2NGaWx0ZXIudG9Mb3dlckNhc2UoKSkgPT09IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgc3RhdHVzXG4gICAgICBpZiAodHlwZW9mIHN0YXR1c0ZpbHRlciAhPT0gJ3VuZGVmaW5lZCcgJiYgc3RhdHVzRmlsdGVyLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICBzZXJ2aWNlLnN0YXR1cy50b0xvd2VyQ2FzZSgpICE9PSBzdGF0dXNGaWx0ZXIudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlXG4gICAgfSlcblxuICAgIC8vIFByb2Nlc3MgYSBzb3J0IHdpdGggdGhlIGZvdW5kIGl0ZW1cbiAgICBjb25zdCBzb3J0SGFuZGxlciA9IFNlcnZpY2Uuc29ydEhhbmRsZXIoJ2lkZW50aWZpZXInKVxuICAgIHByb2Nlc3NlZFNlcnZpY2VzID0gcHJvY2Vzc2VkU2VydmljZXMuc29ydChzb3J0SGFuZGxlcilcblxuICAgIHJldHVybiBwcm9jZXNzZWRTZXJ2aWNlc1xuICB9XG5cbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICB0aGlzLnN0YXJ0VXBkYXRlSW50ZXJ2YWwgPSAocGVyaW9kKSA9PiB7XG4gICAgICB0aGlzLnN0b3BVcGRhdGVJbnRlcnZhbCgpXG4gICAgICBpZiAocGVyaW9kKSB7XG4gICAgICAgIHRoaXMuX3VwZGF0ZUludGVydmFsSUQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgU2VydmljZXNBY3Rpb25zLnJlcXVlc3RMaXN0KClcbiAgICAgICAgfSwgcGVyaW9kICogMTAwMClcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zdG9wVXBkYXRlSW50ZXJ2YWwgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fdXBkYXRlSW50ZXJ2YWxJRCkgY2xlYXJJbnRlcnZhbCh0aGlzLl91cGRhdGVJbnRlcnZhbElEKVxuICAgIH1cbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50ICgpIHtcbiAgICAvLyBGZXRjaCB0aGUgc2VydmljZXMgYmVmb3JlIHJlbmRlcmluZ1xuICAgIGlmICh0aGlzLnN0YXRlLmxhc3RVcGRhdGUgPT09IGZhbHNlKSBTZXJ2aWNlc0FjdGlvbnMucmVxdWVzdExpc3QoKVxuICAgIHRoaXMuc3RhcnRVcGRhdGVJbnRlcnZhbCh0aGlzLnN0YXRlLnVwZGF0ZVBlcmlvZClcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50ICgpIHtcbiAgICB0aGlzLnN0b3BVcGRhdGVJbnRlcnZhbCgpXG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIHJldHVybiAoXG4gICAgICA8U2VydmljZXNNYWluSW50bFxuICAgICAgICB7Li4udGhpcy5zdGF0ZX1cbiAgICAgICAgb25QZXJpb2RDaGFuZ2U9e3RoaXMuc3RhcnRVcGRhdGVJbnRlcnZhbH0gLz5cbiAgICApXG4gIH1cbn1cblxuU2VydmljZXNNYWluLnByb3BUeXBlcyA9IHtcbiAgc2VydmljZXM6IFJlYWN0LlByb3BUeXBlcy5hcnJheU9mKFJlYWN0LlByb3BUeXBlcy5pbnN0YW5jZU9mKFNlcnZpY2UpKSxcbiAgc2VsZWN0ZWRTZXJ2aWNlOiBSZWFjdC5Qcm9wVHlwZXMuc3RyaW5nLFxuICBsYXN0VXBkYXRlOiBSZWFjdC5Qcm9wVHlwZXMubnVtYmVyLFxuICB1cGRhdGVQZXJpb2Q6IFJlYWN0LlByb3BUeXBlcy5udW1iZXIsXG4gIGZpbHRlcjogUmVhY3QuUHJvcFR5cGVzLmluc3RhbmNlT2YoTWFwKVxufVxuXG5TZXJ2aWNlc01haW5QdXJlLnByb3BUeXBlcyA9IE9iamVjdC5hc3NpZ24oe30sIFNlcnZpY2VzTWFpbi5wcm9wVHlwZXMsIHtcbiAgaW50bDogaW50bFNoYXBlLmlzUmVxdWlyZWRcbn0pXG5cbmV4cG9ydCBkZWZhdWx0IFNlcnZpY2VzTWFpblxuIiwiLy8gc3JjL3NlcnZpY2VzLW1hbmFnZXIvY29tcG9uZW50cy9zZXJ2aWNlcy10YWJsZS9pbmRleC5qc3hcblxuaW1wb3J0IFJlYWN0LCB7IFByb3BUeXBlcyB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQWxlcnQgfSBmcm9tICdyZWFjdC1ib290c3RyYXAnXG5pbXBvcnQgeyBpbmplY3RJbnRsIH0gZnJvbSAncmVhY3QtaW50bCdcblxuaW1wb3J0IFNlcnZpY2UgZnJvbSAnLi4vLi4vU2VydmljZSdcbmltcG9ydCBTZXJ2aWNlc0FjdGlvbnMgZnJvbSAnLi4vLi4vYWN0aW9ucydcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9jb21wb25lbnRzL0Jhc2VDb21wb25lbnQnXG5pbXBvcnQgRGF0YVRhYmxlLCB7IERhdGFDb2x1bW4gfSBmcm9tICcuLi8uLi8uLi9jb21tb24vY29tcG9uZW50cy9kYXRhLXRhYmxlJ1xuXG5jbGFzcyBTZXJ2aWNlc1RhYmxlIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIHN0YXRpYyBnZXQgcHJvcFR5cGVzICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VydmljZXM6IFByb3BUeXBlcy5hcnJheU9mKFByb3BUeXBlcy5pbnN0YW5jZU9mKFNlcnZpY2UpKSxcbiAgICAgIGxhc3RVcGRhdGU6IFByb3BUeXBlcy5vbmVPZlR5cGUoW1Byb3BUeXBlcy5udW1iZXIsIFByb3BUeXBlcy5ib29sXSksXG4gICAgICBvblJvd1NlbGVjdGVkOiBQcm9wVHlwZXMuZnVuYyxcbiAgICAgIG9uUm93VW5zZWxlY3RlZDogUHJvcFR5cGVzLmZ1bmNcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0IGRlZmF1bHRQcm9wcyAoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlcnZpY2VzOiBbXSxcbiAgICAgIGxhc3RVcGRhdGU6IGZhbHNlLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IgKHByb3BzKSB7XG4gICAgc3VwZXIocHJvcHMpXG5cbiAgICB0aGlzLmRlZmF1bHRIZWlnaHQgPSA0MDBcblxuICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICBoZWlnaHQ6IHRoaXMuZGVmYXVsdEhlaWdodFxuICAgIH1cbiAgICB0aGlzLl9iaW5kKCdfX2hhbmRsZVJlc2l6ZScpXG5cbiAgICB0aGlzLm1lc3NhZ2VzID0ge1xuICAgICAgaWRlbnRpZmllcjoge1xuICAgICAgICBpZDogJ2lkZW50aWZpZXInLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ0lkZW50aWZpZXInXG4gICAgICB9LFxuICAgICAgbmFtZToge1xuICAgICAgICBpZDogJ25hbWUnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ05hbWUnXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IHtcbiAgICAgICAgaWQ6ICdkZXNjcmlwdGlvbicsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnRGVzY3JpcHRpb24nXG4gICAgICB9LFxuICAgICAgc3RhdHVzOiB7XG4gICAgICAgIGlkOiAnc3RhdHVzJyxcbiAgICAgICAgZGVmYXVsdE1lc3NhZ2U6ICdTdGF0dXMnXG4gICAgICB9LFxuICAgICAgbG9hZGluZ0RvdHM6IHtcbiAgICAgICAgaWQ6ICdsb2FkaW5nRG90cycsXG4gICAgICAgIGRlZmF1bHRNZXNzYWdlOiAnTG9hZGluZy4uLidcbiAgICAgIH0sXG4gICAgICB0aGVyZUFyZU5vU2VydmljZXM6IHtcbiAgICAgICAgaWQ6ICd0aGVyZUFyZU5vU2VydmljZXMnLFxuICAgICAgICBkZWZhdWx0TWVzc2FnZTogJ1RoZXJlIGFyZSBubyBzZXJ2aWNlcydcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfX2hhbmRsZVJlc2l6ZSAoZXZlbnQpIHtcbiAgICBjb25zdCBoZWlnaHRXaW5kb3cgPSBOdW1iZXIuaXNOYU4od2luZG93LmlubmVySGVpZ2h0KVxuICAgICAgPyB3aW5kb3cuY2xpZW50SGVpZ2h0XG4gICAgICA6IHdpbmRvdy5pbm5lckhlaWdodFxuICAgIGNvbnN0IHRoaXNUYWJsZVRvVG9wID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlcnZpY2VzLXRhYmxlJykub2Zmc2V0VG9wXG5cbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGhlaWdodDogKGhlaWdodFdpbmRvdylcbiAgICAgICAgPyAoaGVpZ2h0V2luZG93IC0gdGhpc1RhYmxlVG9Ub3ApIC0gMTBcbiAgICAgICAgOiB0aGlzLmRlZmF1bHRIZWlnaHRcbiAgICB9KVxuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIHRoaXMuX19oYW5kbGVSZXNpemUoKVxuXG4gICAgaWYgKHdpbmRvdykgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX19oYW5kbGVSZXNpemUpXG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCAoKSB7XG4gICAgaWYgKHdpbmRvdykgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuX19oYW5kbGVSZXNpemUpXG4gIH1cblxuICByZW5kZXIgKCkge1xuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZVxuICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wc1xuICAgIGNvbnN0IGRlZmluZU1lc3NhZ2UgPSB0aGlzLnByb3BzLmludGwuZm9ybWF0TWVzc2FnZVxuICAgIGNvbnN0IHNlcnZpY2VzQ29tcGxldGVkID0gdGhpcy5wcm9wcy5zZXJ2aWNlcy5tYXAoKHNlcnZpY2UpID0+IHtcbiAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzZXJ2aWNlLFxuICAgICAgICB7IHN0YXR1c01lc3NhZ2U6IGRlZmluZU1lc3NhZ2Uoc2VydmljZS5tZXNzYWdlU3RhdHVzKSB9KVxuICAgIH0pXG5cbiAgICBjb25zdCBpZGVudGlmaWVyQ29sID0gbmV3IERhdGFDb2x1bW4oe1xuICAgICAgZGF0YUtleTogJ2lkZW50aWZpZXInLFxuICAgICAgbmFtZTogZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLmlkZW50aWZpZXIpLFxuICAgICAgaGlkZGVuOiB0cnVlXG4gICAgfSlcbiAgICBjb25zdCBuYW1lQ29sID0gbmV3IERhdGFDb2x1bW4oe1xuICAgICAgZGF0YUtleTogJ25hbWUnLFxuICAgICAgbmFtZTogZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLm5hbWUpLFxuICAgICAgYWxpZ246ICdsZWZ0JyxcbiAgICAgIHNvcnRhYmxlOiB0cnVlLFxuICAgICAgc29ydFByb3BzOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnXG4gICAgICB9XG4gICAgfSlcbiAgICBjb25zdCBkZXNjQ29sID0gbmV3IERhdGFDb2x1bW4oe1xuICAgICAgZGF0YUtleTogJ2Rlc2NyaXB0aW9uJyxcbiAgICAgIG5hbWU6IGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy5kZXNjcmlwdGlvbiksXG4gICAgICBhbGlnbjogJ2xlZnQnLFxuICAgICAgc29ydGFibGU6IHRydWUsXG4gICAgICBzb3J0UHJvcHM6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZydcbiAgICAgIH1cbiAgICB9KVxuICAgIGNvbnN0IHN0YXR1c0NvbCA9IG5ldyBEYXRhQ29sdW1uKHtcbiAgICAgIGRhdGFLZXk6ICdzdGF0dXNNZXNzYWdlJyxcbiAgICAgIG5hbWU6IGRlZmluZU1lc3NhZ2UodGhpcy5tZXNzYWdlcy5zdGF0dXMpLFxuICAgICAgYWxpZ246ICdyaWdodCcsXG4gICAgICB3aWR0aDogJzEwMHB4JyxcbiAgICAgIHNvcnRhYmxlOiB0cnVlXG4gICAgfSlcbiAgICBjb25zdCBvcmRlckJ5ID0ge1xuICAgICAgY29sdW1uS2V5OiBuYW1lQ29sLmRhdGFLZXksXG4gICAgICB2YWx1ZTogJ0FTQydcbiAgICB9XG5cbiAgICBjb25zdCBvblJvd1NlbGVjdGVkID0gKGlkZW50aWZpZXIsIHJvd0RhdGEpID0+IFNlcnZpY2VzQWN0aW9ucy5zZWxlY3Qocm93RGF0YS5pZGVudGlmaWVyKVxuICAgIGNvbnN0IG9uUm93VW5zZWxlY3RlZCA9IChpZGVudGlmaWVyLCByb3dEYXRhKSA9PiBTZXJ2aWNlc0FjdGlvbnMuY2xlYW5TZWxlY3RlZCgpXG5cbiAgICBjb25zdCBjb21wb25lbnRTdHlsZSA9IHt9XG4gICAgaWYgKHN0YXRlLmhlaWdodCkge1xuICAgICAgY29tcG9uZW50U3R5bGUuaGVpZ2h0ID0gc3RhdGUuaGVpZ2h0ICsgJ3B4J1xuICAgICAgY29tcG9uZW50U3R5bGUub3ZlcmZsb3cgPSAnYXV0bydcbiAgICAgIGNvbXBvbmVudFN0eWxlLm1hcmdpbkJvdHRvbSA9ICcxMHB4J1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2IGlkPSdzZXJ2aWNlcy10YWJsZScgc3R5bGU9e2NvbXBvbmVudFN0eWxlfT5cbiAgICAgICAgeyAhcHJvcHMubGFzdFVwZGF0ZSAmJlxuICAgICAgICAgIDxBbGVydCBic1N0eWxlPSdpbmZvJz5cbiAgICAgICAgICAgIHsgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLmxvYWRpbmdEb3RzKSB9XG4gICAgICAgICAgPC9BbGVydD5cbiAgICAgICAgfVxuICAgICAgICB7IHByb3BzLmxhc3RVcGRhdGUgJiYgc2VydmljZXNDb21wbGV0ZWQubGVuZ3RoIDw9IDAgJiZcbiAgICAgICAgICA8QWxlcnQgYnNTdHlsZT0nZGFuZ2VyJz5cbiAgICAgICAgICAgIHsgZGVmaW5lTWVzc2FnZSh0aGlzLm1lc3NhZ2VzLnRoZXJlQXJlTm9TZXJ2aWNlcykgfVxuICAgICAgICAgIDwvQWxlcnQ+XG4gICAgICAgIH1cbiAgICAgICAgeyBwcm9wcy5sYXN0VXBkYXRlICYmIHNlcnZpY2VzQ29tcGxldGVkLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICA8RGF0YVRhYmxlXG4gICAgICAgICAgICBrZXlWYWx1ZT0naWRlbnRpZmllcidcbiAgICAgICAgICAgIGNvbHVtbnM9e1tpZGVudGlmaWVyQ29sLCBuYW1lQ29sLCBkZXNjQ29sLCBzdGF0dXNDb2xdfVxuICAgICAgICAgICAgb3JkZXJCeT17b3JkZXJCeX1cbiAgICAgICAgICAgIGRhdGE9e3NlcnZpY2VzQ29tcGxldGVkfVxuICAgICAgICAgICAgYm9yZGVyZWRcbiAgICAgICAgICAgIGhvdmVyXG4gICAgICAgICAgICByZXNwb25zaXZlXG4gICAgICAgICAgICBzdHJpcGVkXG4gICAgICAgICAgICBjb25kZW5zZWRcbiAgICAgICAgICAgIG9uUm93U2VsZWN0ZWQ9e3Byb3BzLm9uUm93U2VsZWN0ZWQgfHwgb25Sb3dTZWxlY3RlZH1cbiAgICAgICAgICAgIG9uUm93VW5zZWxlY3RlZD17cHJvcHMub25Sb3dVbnNlbGVjdGVkIHx8IG9uUm93VW5zZWxlY3RlZH0gLz5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdEludGwoU2VydmljZXNUYWJsZSlcbiIsImNvbnN0IFNlcnZpY2VzQ29uc3RhbnRzID0ge1xuICBJTklUX1NFUlZJQ0VTX1NUT1JFOiAnaW5pdC1zZXJ2aWNlcy1zdG9yZScsXG4gIEZJTFRFUl9TRVJWSUNFUzogJ2ZpbHRlci1zZXJ2aWNlcycsXG4gIFNPUlRfU0VSVklDRVM6ICdzb3J0LXNlcnZpY2VzJyxcbiAgRkVUQ0hfU0VSVklDRVM6ICdmZXRjaC1zZXJ2aWNlcycsXG4gIFNFTEVDVF9TRVJWSUNFOiAnc2VsZWN0LXNlcnZpY2UnLFxuICBDTEVBTl9TRUxFQ1RFRF9TRVJWSUNFOiAnY2xlYW4tc2VsZWN0ZWQtc2VydmljZScsXG4gIFNUQVJUX1NFUlZJQ0U6ICdzdGFydC1zZXJ2aWNlJyxcbiAgU1RPUF9TRVJWSUNFOiAnc3RvcC1zZXJ2aWNlJyxcbiAgVVBEQVRFX1NUQVRVUzogJ3VwZGF0ZS1zZXJ2aWNlLXN0YXR1cycsXG4gIEFERF9UT19VUERBVElORzogJ2FkZC1zZXJ2aWNlLXRvLXVwZGF0aW5nJyxcbiAgUkVNT1ZFX0ZST01fVVBEQVRJTkc6ICdyZW1vdmUtc2VydmljZS1mcm9tLXVwZGF0aW5nJyxcbiAgQ0hBTkdFX1BFUklPRDogJ3NlcnZpY2VzLWNoYW5nZS1wZXJpb2QnXG59XG5cbmV4cG9ydCBkZWZhdWx0IFNlcnZpY2VzQ29uc3RhbnRzXG4iLCIvLyBzcmMvc2VydmljZXMtbWFuYWdlci9zdG9yZS9pbmRleC5qc1xuXG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ2ZsdXgvdXRpbHMnXG5pbXBvcnQgQXBwRGlzcGF0Y2hlciBmcm9tICcuLi8uLi9kaXNwYXRjaGVyJ1xuaW1wb3J0IExvZ2dlciBmcm9tICcuLi8uLi9jb21tb24vbGliL0xvZ2dlcidcbmltcG9ydCBTZXJ2aWNlc0NvbnN0YW50cyBmcm9tICcuLi9jb25zdGFudHMnXG5pbXBvcnQgU2VydmljZSBmcm9tICcuLi9TZXJ2aWNlJ1xuXG52YXIgbG9nZ2VyID0gbmV3IExvZ2dlcih7IHNlY3Rpb246ICdTZXJ2aWNlcyBzdG9yZScgfSlcblxuY2xhc3MgU2VydmljZXNTdG9yZSBleHRlbmRzIFN0b3JlIHtcbiAgY29uc3RydWN0b3IgKGRpc3BhdGNoZXIpIHtcbiAgICBzdXBlcihkaXNwYXRjaGVyKVxuXG4gICAgdGhpcy5pbml0aWFsaXplKClcbiAgfVxuXG4gIGluaXRpYWxpemUgKCkge1xuICAgIC8vIFNlcnZpY2VzIGxpc3RcbiAgICB0aGlzLl9fc2VydmljZXMgPSBuZXcgTWFwKClcbiAgICAvLyBMYXN0IHVwZGF0ZSBvZiBzZXJ2aWNlcyBsaXN0XG4gICAgdGhpcy5fX3NlcnZpY2VzTGFzdFVwZGF0ZSA9IGZhbHNlXG4gICAgLy8gU2VsZWN0ZWQgc2VydmljZVxuICAgIHRoaXMuX19jbGVhblNlbGVjdGVkU2VydmljZSgpXG4gICAgLy8gVXBkYXRpbmcgc2VydmljZXNcbiAgICB0aGlzLl9fY2xlYW5VcGRhdGluZ1NlcnZpY2VzKClcbiAgICAvLyBTZXJ2aWNlcyBmaWx0ZXJcbiAgICB0aGlzLl9fY2xlYW5GaWx0ZXIoKVxuICAgIC8vIERlZmF1bHQgdXBkYXRlIHBlcmlvZFxuICAgIHRoaXMuX191cGRhdGVQZXJpb2QgPSA2MCAvLyBEZWZhdWx0XG4gIH1cblxuICAvLyAtLSBHZXR0ZXJzIC0tIC8vXG5cbiAgc2VydmljZSAoaWRlbnRpZmllcikge1xuICAgIGlmICh0eXBlb2YgaWRlbnRpZmllciA9PT0gJ3VuZGVmaW5lZCcgfHwgaWRlbnRpZmllci5sZW5ndGggPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHNlcnZpY2UgaWRlbnRpZmllciBpcyBlbXB0eScpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgaWRlbnRpZmllciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBpZGVudGlmaWVyIGlzIG5vdCBhIHN0cmluZycpXG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9fc2VydmljZXMuZ2V0KGlkZW50aWZpZXIpXG4gIH1cblxuICBnZXQgc2VydmljZXMgKCkge1xuICAgIHJldHVybiBbLi4udGhpcy5fX3NlcnZpY2VzLnZhbHVlcygpXVxuICB9XG5cbiAgZ2V0IHNlcnZpY2VzTGFzdFVwZGF0ZSAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX19zZXJ2aWNlc0xhc3RVcGRhdGVcbiAgfVxuXG4gIGdldCBzZWxlY3RlZFNlcnZpY2UgKCkge1xuICAgIGlmICh0aGlzLl9fc2VsZWN0ZWRTZXJ2aWNlLmxlbmd0aCA+IDAgJiYgdGhpcy5fX3NlcnZpY2VzLmhhcyh0aGlzLl9fc2VsZWN0ZWRTZXJ2aWNlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX19zZXJ2aWNlcy5nZXQodGhpcy5fX3NlbGVjdGVkU2VydmljZSlcbiAgICB9IGVsc2UgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpc1NlcnZpY2VVcGRhdGluZyAoaWRlbnRpZmllcikge1xuICAgIHJldHVybiAodGhpcy5fX3NlcnZpY2VzLmhhcyhpZGVudGlmaWVyKSAmJiB0aGlzLl9fc2VydmljZXNVcGRhdGluZy5pbmRleE9mKGlkZW50aWZpZXIpICE9PSAtMSlcbiAgfVxuXG4gIGdldCBmaWx0ZXIgKCkge1xuICAgIHJldHVybiB0aGlzLl9fZmlsdGVyXG4gIH1cblxuICBnZXQgdXBkYXRlUGVyaW9kICgpIHtcbiAgICByZXR1cm4gdGhpcy5fX3VwZGF0ZVBlcmlvZFxuICB9XG5cbiAgLy8gLS0gU2V0dGVycyAoUHJpdmF0ZSkgLS0gLy9cblxuICAvKlxuICAgKiBUaGUgc2VydmljZXMgcGFyYW1ldGVyIGFjY2VwdCBhbiBhcnJheSBvZiBTZXJ2aWNlIG9iamVjdHNcbiAgICogb3IgYW55IGl0ZXJhYmxlIG9mIGpzIG9iamVjdHMuIElmIHRoZSBpZGVudGlmaWVyIHByb3BlcnR5XG4gICAqIGRvbnQgZXhpc3QgaW4gdGhlIGpzIG9iamVjdCwgdGhlaXIga2V5IHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIF9fc2V0U2VydmljZXMgKHNlcnZpY2VzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2Ygc2VydmljZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBzZXJ2aWNlcyBzb3VyY2UgaXMgZW1wdHknKVxuICAgICAgfVxuICAgICAgdGhpcy5fX2NsZWFyU2VydmljZXMoKVxuICAgICAgdGhpcy5fX2FkZFNlcnZpY2VzKHNlcnZpY2VzKVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBQcm9wYWdhdGUgZXJyb3JcbiAgICAgIHRocm93IGVycm9yXG4gICAgfVxuICB9XG5cbiAgLypcbiAgICogVGhlIHNlcnZpY2VzIHBhcmFtZXRlciBhY2NlcHQgYW4gYXJyYXkgb2YgU2VydmljZSBvYmplY3RzXG4gICAqIG9yIGFueSBpdGVyYWJsZSBvZiBqcyBvYmplY3RzLiBJZiB0aGUgaWRlbnRpZmllciBwcm9wZXJ0eVxuICAgKiBkb250IGV4aXN0IGluIHRoZSBqcyBvYmplY3QsIHRoZWlyIGtleSB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBfX2FkZFNlcnZpY2VzIChzZXJ2aWNlcykge1xuICAgIGlmICh0eXBlb2Ygc2VydmljZXMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgc2VydmljZXMgc291cmNlIGlzIGVtcHR5JylcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gJ3NlcnZpY2VzJyBzaG91bGQgYmUgaXRlcmFibGVcbiAgICAgIGxldCBzZXJ2aWNlc0l0ZXJhYmxlXG5cbiAgICAgIC8vIEl0ZXJhYmxlXG4gICAgICBpZiAodHlwZW9mIHNlcnZpY2VzW1N5bWJvbC5pdGVyYXRvcl0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNlcnZpY2VzSXRlcmFibGUgPSBzZXJ2aWNlc1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc2VydmljZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIEdldCBhbiBpdGVyYWJsZSBvYmplY3QgZnJvbSB0aGUgcGxhaW4ganMgb2JqZWN0XG4gICAgICAgIHNlcnZpY2VzSXRlcmFibGUgPSBuZXcgTWFwKClcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHNlcnZpY2VzKSB7XG4gICAgICAgICAgc2VydmljZXNJdGVyYWJsZS5zZXQoa2V5LCBzZXJ2aWNlc1trZXldKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2VydmljZXNJdGVyYWJsZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHNlcnZpY2VzIHNvdXJjZSBpcyBub3QgaXRlcmFibGUnKVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgW2tleSwgc2VydmljZV0gb2Ygc2VydmljZXNJdGVyYWJsZSkge1xuICAgICAgICAvLyBpZGVudGlmaWVyIGNoZWNrXG4gICAgICAgIGlmICh0eXBlb2Ygc2VydmljZS5pZGVudGlmaWVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2VydmljZS5pZGVudGlmaWVyID0ga2V5XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdUaGUgZWxlbWVudCBpcyBub3Qgd2VsbCBmb3JtZWQgYW5kIGNhbm5vdCBiZSBpbnRyb2R1Y2VkJywgc2VydmljZSlcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fX2FkZFNlcnZpY2Uoc2VydmljZSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gUHJvcGFnYXRlIGVycm9yXG4gICAgICB0aHJvdyBlcnJvclxuICAgIH1cbiAgfVxuXG4gIF9fY2xlYXJTZXJ2aWNlIChpZGVudGlmaWVyKSB7XG4gICAgaWYgKHR5cGVvZiBpZGVudGlmaWVyID09PSAndW5kZWZpbmVkJyB8fCBpZGVudGlmaWVyLmxlbmd0aCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgc2VydmljZSBpZGVudGlmaWVyIGlzIGVtcHR5JylcbiAgICB9XG5cbiAgICB0aGlzLl9fc2VydmljZXMuZGVsZXRlKGlkZW50aWZpZXIpXG4gIH1cblxuICBfX2NsZWFyU2VydmljZXMgKCkge1xuICAgIGlmICh0aGlzLl9fc2VydmljZXMuc2l6ZSA+IDApIHRoaXMuX19zZXJ2aWNlcy5jbGVhcigpXG4gIH1cblxuICBfX2FkZFNlcnZpY2UgKHNlcnZpY2UpIHtcbiAgICBpZiAodHlwZW9mIHNlcnZpY2UgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgc2VydmljZSBzb3VyY2UgaXMgZW1wdHknKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIHNlcnZpY2UuaWRlbnRpZmllciA9PT0gJ3VuZGVmaW5lZCcgfHwgc2VydmljZS5pZGVudGlmaWVyLmxlbmd0aCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHNlcnZpY2UnKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpZiAoc2VydmljZSBpbnN0YW5jZW9mIFNlcnZpY2UpIHtcbiAgICAgICAgdGhpcy5fX3NlcnZpY2VzLnNldChzZXJ2aWNlLmlkZW50aWZpZXIsIHNlcnZpY2UpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9fc2VydmljZXMuc2V0KHNlcnZpY2UuaWRlbnRpZmllciwgbmV3IFNlcnZpY2Uoc2VydmljZSkpXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFByb3BhZ2F0ZSBlcnJvclxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICBfX3NldFNlbGVjdGVkU2VydmljZSAoaWRlbnRpZmllcikge1xuICAgIGlmICh0eXBlb2YgaWRlbnRpZmllciA9PT0gJ3VuZGVmaW5lZCcgfHwgaWRlbnRpZmllci5sZW5ndGggPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHNlcnZpY2UgaWRlbnRpZmllciBpcyBlbXB0eScpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgaWRlbnRpZmllciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBpZGVudGlmaWVyIGlzIG5vdCBhIHN0cmluZycpXG4gICAgfVxuICAgIHRoaXMuX19zZWxlY3RlZFNlcnZpY2UgPSBpZGVudGlmaWVyXG4gICAgcmV0dXJuIGlkZW50aWZpZXJcbiAgfVxuXG4gIF9fY2xlYW5TZWxlY3RlZFNlcnZpY2UgKCkge1xuICAgIHRoaXMuX19zZWxlY3RlZFNlcnZpY2UgPSAnJ1xuICB9XG5cbiAgX19hZGRUb1VwZGF0aW5nU2VydmljZXMgKGlkZW50aWZpZXIpIHtcbiAgICBpZiAodGhpcy5fX3NlcnZpY2VzLmhhcyhpZGVudGlmaWVyKSAmJiAhdGhpcy5fX3NlcnZpY2VzVXBkYXRpbmcuaW5kZXhPZihpZGVudGlmaWVyKSAhPT0gLTEpIHtcbiAgICAgIHRoaXMuX19zZXJ2aWNlc1VwZGF0aW5nLnB1c2goaWRlbnRpZmllcilcbiAgICB9XG4gIH1cblxuICBfX3JlbW92ZUZyb21VcGRhdGluZ1NlcnZpY2VzIChpZGVudGlmaWVyKSB7XG4gICAgdmFyIGluZGV4ID0gdGhpcy5fX3NlcnZpY2VzVXBkYXRpbmcuaW5kZXhPZihpZGVudGlmaWVyKVxuICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICB0aGlzLl9fc2VydmljZXNVcGRhdGluZy5zcGxpY2UoaW5kZXgsIDEpXG4gICAgfVxuICB9XG5cbiAgX191cGRhdGVVcGRhdGluZ1NlcnZpY2VzICgpIHtcbiAgICB0aGlzLl9fc2VydmljZXNVcGRhdGluZy5maWx0ZXIoKGlkZW50aWZpZXIpID0+IHRoaXMuX19zZXJ2aWNlcy5oYXMoaWRlbnRpZmllcikpXG4gIH1cblxuICBfX2NsZWFuVXBkYXRpbmdTZXJ2aWNlcyAoKSB7XG4gICAgdGhpcy5fX3NlcnZpY2VzVXBkYXRpbmcgPSBbXVxuICB9XG5cbiAgX19zZXRGaWx0ZXIgKHByb3AsIGZpbHRlcikge1xuICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3VuZGVmaW5lZCcgfHwgcHJvcC5sZW5ndGggPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGZpbHRlciBpdGVtIGlzIGVtcHR5JylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZmlsdGVyIGlzIG5vdCBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICghKHByb3AgaW5zdGFuY2VvZiBBcnJheSkpIHByb3AgPSBbcHJvcF1cblxuICAgIHByb3AuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9fZmlsdGVyLmhhcyhpdGVtKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgZmlsdGVyIGl0ZW0gZG8gbm90IGV4aXN0cycpXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX19maWx0ZXIuc2V0KGl0ZW0sIGZpbHRlcilcbiAgICB9KVxuICB9XG5cbiAgX19jbGVhbkZpbHRlciAoKSB7XG4gICAgdGhpcy5fX2ZpbHRlciA9IFNlcnZpY2UuZGVmYXV0RmlsdGVyT2JqZWN0XG4gIH1cblxuICAvLyAtLSBEaXNwYXRjaGVyIHJlZ2lzdGVyIC0tIC8vXG5cbiAgX19vbkRpc3BhdGNoIChwYXlsb2FkKSB7XG4gICAgc3dpdGNoIChwYXlsb2FkLmFjdGlvblR5cGUpIHtcbiAgICAgIGNhc2UgU2VydmljZXNDb25zdGFudHMuSU5JVF9TRVJWSUNFU19TVE9SRTpcbiAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICBsb2dnZXIuaW5mbygnSW5pdGlhbGl6aW5nIHRoZSBzdG9yZS4uLicpXG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplKClcblxuICAgICAgICAvLyBOb3RpZnkgdGhlIG9ic2VydmVycyB0aGF0IHRoZSBzdG9yZSBjaGFuZ2VkXG4gICAgICAgIHRoaXMuX19lbWl0Q2hhbmdlKClcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBTZXJ2aWNlc0NvbnN0YW50cy5GSUxURVJfU0VSVklDRVM6XG4gICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0ZpbHRlcmluZyB0aGUgc2VydmljZXMuLi4nKVxuXG4gICAgICAgIC8vIFdpbGwgcmVjZWl2ZSBwYXlsb2FkLmZpbHRlclxuICAgICAgICB0aGlzLl9fc2V0RmlsdGVyKHBheWxvYWQucHJvcCwgcGF5bG9hZC5maWx0ZXIpXG5cbiAgICAgICAgLy8gTm90aWZ5IHRoZSBvYnNlcnZlcnMgdGhhdCB0aGUgc3RvcmUgY2hhbmdlZFxuICAgICAgICB0aGlzLl9fZW1pdENoYW5nZSgpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgU2VydmljZXNDb25zdGFudHMuRkVUQ0hfU0VSVklDRVM6XG4gICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1JlY2VpdmluZyBzZXJ2aWNlcy4uLicpXG5cbiAgICAgICAgaWYgKHBheWxvYWQubGlzdCkge1xuICAgICAgICAgIC8vIFdpbGwgcmVjZWl2ZSBwYXlsb2FkLmxpc3QgYW5kIHBheWxvYWQudGltZXN0YW1wXG4gICAgICAgICAgdGhpcy5fX3NldFNlcnZpY2VzKHBheWxvYWQubGlzdClcbiAgICAgICAgICB0aGlzLl9fc2VydmljZXNMYXN0VXBkYXRlID0gRGF0ZS5ub3coKVxuXG4gICAgICAgICAgLy8gTm90aWZ5IHRoZSBvYnNlcnZlcnMgdGhhdCB0aGUgc3RvcmUgY2hhbmdlZFxuICAgICAgICAgIHRoaXMuX19lbWl0Q2hhbmdlKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIXRoaXMuX19zZXJ2aWNlc0xhc3RVcGRhdGUpIHRoaXMuX19zZXJ2aWNlc0xhc3RVcGRhdGUgPSBEYXRlLm5vdygpXG4gICAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdJbnZhbGlkIHNlcnZpY2VzJylcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFNlcnZpY2VzQ29uc3RhbnRzLlVQREFURV9TVEFUVVM6XG4gICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgbG9nZ2VyLmluZm8oYFVwZGF0aW5nIHRoZSBzZXJ2aWNlICcke3BheWxvYWQuaWRlbnRpZmllcn0nIHN0YXR1c2ApXG5cbiAgICAgICAgaWYgKHRoaXMuX19zZXJ2aWNlcy5oYXMocGF5bG9hZC5pZGVudGlmaWVyKSAmJiBwYXlsb2FkLnN0YXR1cykge1xuICAgICAgICAgIC8vIFdpbGwgcmVjZWl2ZSBwYXlsb2FkLmxpc3QgYW5kIHBheWxvYWQuc3RhdHVzXG4gICAgICAgICAgbGV0IHNlcnZpY2UgPSB0aGlzLl9fc2VydmljZXMuZ2V0KHBheWxvYWQuaWRlbnRpZmllcilcbiAgICAgICAgICBzZXJ2aWNlLnN0YXR1cyA9IHBheWxvYWQuc3RhdHVzXG4gICAgICAgICAgdGhpcy5fX3NlcnZpY2VzLnNldChwYXlsb2FkLmlkZW50aWZpZXIsIHNlcnZpY2UpXG5cbiAgICAgICAgICAvLyBOb3RpZnkgdGhlIG9ic2VydmVycyB0aGF0IHRoZSBzdG9yZSBjaGFuZ2VkXG4gICAgICAgICAgdGhpcy5fX2VtaXRDaGFuZ2UoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgICBsb2dnZXIud2FybmluZygnSW52YWxpZCBzZXJ2aWNlIGlkZW50aWZpZXIgb3Igc3RhdHVzJylcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFNlcnZpY2VzQ29uc3RhbnRzLkFERF9UT19VUERBVElORzpcbiAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICBsb2dnZXIuaW5mbyhgQWRkaW5nIHRoZSBzZXJ2aWNlICcke3BheWxvYWQuaWRlbnRpZmllcn0nIHRvIHRoZSB1cGRhdGluZyBsaXN0YClcblxuICAgICAgICAvLyBXaWxsIHJlY2VpdmUgcGF5bG9hZC5pZGVudGlmaWVyXG4gICAgICAgIGlmIChwYXlsb2FkLmlkZW50aWZpZXIpIHtcbiAgICAgICAgICB0aGlzLl9fYWRkVG9VcGRhdGluZ1NlcnZpY2VzKHBheWxvYWQuaWRlbnRpZmllcilcblxuICAgICAgICAgIC8vIE5vdGlmeSB0aGUgb2JzZXJ2ZXJzIHRoYXQgdGhlIHN0b3JlIGNoYW5nZWRcbiAgICAgICAgICB0aGlzLl9fZW1pdENoYW5nZSgpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdJbnZhbGlkIHZhbHVlcyBmb3IgdXBkYXRpbmcgdGhlIHNlcnZpY2UnKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgU2VydmljZXNDb25zdGFudHMuUkVNT1ZFX0ZST01fVVBEQVRJTkc6XG4gICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgbG9nZ2VyLmluZm8oYFJlbW92aW5nIHRoZSBzZXJ2aWNlICcke3BheWxvYWQuaWRlbnRpZmllcn0nIGZyb20gdGhlIHVwZGF0aW5nIGxpc3RgKVxuXG4gICAgICAgIC8vIFdpbGwgcmVjZWl2ZSBwYXlsb2FkLmlkZW50aWZpZXJcbiAgICAgICAgaWYgKHBheWxvYWQuaWRlbnRpZmllcikge1xuICAgICAgICAgIHRoaXMuX19yZW1vdmVGcm9tVXBkYXRpbmdTZXJ2aWNlcyhwYXlsb2FkLmlkZW50aWZpZXIpXG5cbiAgICAgICAgICAvLyBOb3RpZnkgdGhlIG9ic2VydmVycyB0aGF0IHRoZSBzdG9yZSBjaGFuZ2VkXG4gICAgICAgICAgdGhpcy5fX2VtaXRDaGFuZ2UoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgICBsb2dnZXIud2FybmluZygnSW52YWxpZCB2YWx1ZXMgZm9yIHVwZGF0aW5nIHRoZSBzZXJ2aWNlJylcbiAgICAgICAgfVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFNlcnZpY2VzQ29uc3RhbnRzLlNFTEVDVF9TRVJWSUNFOlxuICAgICAgICAvLyBDT05TT0xFIFRSQUNFXG4gICAgICAgIGxvZ2dlci5pbmZvKCdTZWxlY3RpbmcgYSBzZXJ2aWNlLi4uJylcblxuICAgICAgICAvLyBXaWxsIHJlY2VpdmUgcGF5bG9hZC5pZGVudGlmaWVyXG4gICAgICAgIGlmICh0aGlzLl9fc2VydmljZXMuaGFzKHBheWxvYWQuaWRlbnRpZmllcikgJiZcbiAgICAgICAgICAgIHRoaXMuX19zZXJ2aWNlcy5nZXQocGF5bG9hZC5pZGVudGlmaWVyKVxuICAgICAgICAgICAgICAubmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2Vob3J1cycpKSB7XG4gICAgICAgICAgdGhpcy5fX2NsZWFuU2VsZWN0ZWRTZXJ2aWNlKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9fc2V0U2VsZWN0ZWRTZXJ2aWNlKHBheWxvYWQuaWRlbnRpZmllcilcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vdGlmeSB0aGUgb2JzZXJ2ZXJzIHRoYXQgdGhlIHN0b3JlIGNoYW5nZWRcbiAgICAgICAgdGhpcy5fX2VtaXRDaGFuZ2UoKVxuICAgICAgICBicmVha1xuXG4gICAgICBjYXNlIFNlcnZpY2VzQ29uc3RhbnRzLkNMRUFOX1NFTEVDVEVEX1NFUlZJQ0U6XG4gICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0Rlc2VsZWN0aW5nIHRoZSBzZXJ2aWNlLi4uJylcblxuICAgICAgICAvLyBXaWxsIHJlY2VpdmUgcGF5bG9hZC5pZGVudGlmaWVyXG4gICAgICAgIHRoaXMuX19jbGVhblNlbGVjdGVkU2VydmljZSgpXG5cbiAgICAgICAgLy8gTm90aWZ5IHRoZSBvYnNlcnZlcnMgdGhhdCB0aGUgc3RvcmUgY2hhbmdlZFxuICAgICAgICB0aGlzLl9fZW1pdENoYW5nZSgpXG4gICAgICAgIGJyZWFrXG5cbiAgICAgIGNhc2UgU2VydmljZXNDb25zdGFudHMuQ0hBTkdFX1BFUklPRDpcbiAgICAgICAgLy8gQ09OU09MRSBUUkFDRVxuICAgICAgICBsb2dnZXIuaW5mbygnVXBkYXRpbmcgdGhlIHBlcmlvZC4uLicpXG5cbiAgICAgICAgLy8gV2lsbCByZWNlaXZlIHBheWxvYWQucGVyaW9kXG4gICAgICAgIGlmICh0eXBlb2YgcGF5bG9hZC5wZXJpb2QgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgaWYgKHBheWxvYWQucGVyaW9kIDwgMCkgcGF5bG9hZC5wZXJpb2QgPSAwXG4gICAgICAgICAgdGhpcy5fX3VwZGF0ZVBlcmlvZCA9IHBheWxvYWQucGVyaW9kXG5cbiAgICAgICAgICAvLyBOb3RpZnkgdGhlIG9ic2VydmVycyB0aGF0IHRoZSBzdG9yZSBjaGFuZ2VkXG4gICAgICAgICAgdGhpcy5fX2VtaXRDaGFuZ2UoKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENPTlNPTEUgVFJBQ0VcbiAgICAgICAgICBsb2dnZXIud2FybmluZygnSW52YWxpZCBwZXJpb2QnKVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9XG59XG5cbi8vIEV4cG9ydGluZyB0aGlzIHdheSB0aGUgY2xhc3Mgd2lsbCBhY3QgYXMgYSBzaW5nbGV0b25cbmV4cG9ydCBkZWZhdWx0IG5ldyBTZXJ2aWNlc1N0b3JlKEFwcERpc3BhdGNoZXIpXG4iLCJpbXBvcnQgeyBjcmVhdGVTdG9yZSwgYXBwbHlNaWRkbGV3YXJlIH0gZnJvbSAncmVkdXgnXG5pbXBvcnQgdGh1bmtNaWRkbGV3YXJlIGZyb20gJ3JlZHV4LXRodW5rJ1xuXG4vLyBSZWR1Y2Vyc1xuaW1wb3J0IHJvb3RSZWR1Y2VyIGZyb20gJy4uL3JlZHVjZXJzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb25maWd1cmVTdG9yZSAoaW5pdGlhbFN0YXRlID0ge30pIHtcbiAgY29uc3QgY3JlYXRlID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRldlRvb2xzRXh0ZW5zaW9uXG4gICAgPyB3aW5kb3cuZGV2VG9vbHNFeHRlbnNpb24oKShjcmVhdGVTdG9yZSlcbiAgICA6IGNyZWF0ZVN0b3JlXG5cbiAgY29uc3QgY3JlYXRlU3RvcmVXaXRoTWlkZGxld2FyZSA9IGFwcGx5TWlkZGxld2FyZSh0aHVua01pZGRsZXdhcmUpKGNyZWF0ZSlcblxuICByZXR1cm4gY3JlYXRlU3RvcmVXaXRoTWlkZGxld2FyZShyb290UmVkdWNlciwgaW5pdGlhbFN0YXRlKVxufVxuIiwibW9kdWxlLmV4cG9ydHM9e1xuICBcImRpc2Nvbm5lY3RcIjogXCJEaXNjb25uZWN0XCIsXG4gIFwidGVybWluYWxcIjogXCJUZXJtaW5hbFwiLFxuICBcImRpc3BsYXlcIjogXCJEaXNwbGF5XCIsXG4gIFwicHJvY2Vzc2VzXCI6IFwiUHJvY2Vzc2VzXCIsXG4gIFwic2VydmljZXNcIjogXCJTZXJ2aWNlc1wiLFxuICBcImZpbGVzXCI6IFwiRmlsZXNcIixcbiAgXCJzaGFyZVwiOiBcIlNoYXJlXCIsXG4gIFwiYWdlbnRQYXNzd29yZFwiOiBcIkFnZW50IHBhc3N3b3JkXCIsXG4gIFwiY29ubmVjdFwiOiBcIkNvbm5lY3RcIixcbiAgXCJmdWxsc2NyZWVuXCI6IFwiRnVsbHNjcmVlblwiLFxuICBcImV4aXRGdWxsc2NyZWVuXCI6IFwiRXhpdCBmdWxsc2NyZWVuXCIsXG4gIFwiY2xpcGJvYXJkXCI6IFwiQ2xpcGJvYXJkXCIsXG4gIFwidHJ1ZUNvbG9yXCI6IFwiVHJ1ZSBjb2xvclwiLFxuICBcImxvY2FsQ3Vyc29yXCI6IFwiTG9jYWwgY3Vyc29yXCIsXG4gIFwic2hhcmVkXCI6IFwiU2hhcmVkXCIsXG4gIFwidmlld09ubHlcIjogXCJWaWV3IG9ubHlcIixcbiAgXCJmdWxsTWVudVwiOiBcIkZ1bGwgbWVudVwiLFxuICBcInNtYWxsTWVudVwiOiBcIlNtYWxsIG1lbnVcIixcbiAgXCJzZW5kXCI6IFwiU2VuZFwiLFxuICBcInJlbW90ZVwiOiBcIlJlbW90ZVwiLFxuICBcImxvY2FsXCI6IFwiTG9jYWxcIixcbiAgXCJub3RoaW5nQ29waWVkXCI6IFwiTm90aGluZyBjb3BpZWRcIixcbiAgXCJjdXJyZW50Q2xpcGJvYXJkRXhwbGFpbmF0aW9uXCI6IFwiVGhpcyBpcyB0aGUgY3VycmVudCBjbGlwYm9hcmQgb24gdGhlIHJlbW90ZSBtYWNoaW5lLiBDb3B5IHdoYXQgeW91IG5lZWQuXCIsXG4gIFwiY2xpY2tTZW5kQ2xpcGJvYXJkXCI6IFwiQ2xpY2sgdG8gc2VuZCB0aGUgdGV4dCB0byB0aGUgcmVtb3RlIGNsaXBib2FyZC5cIixcbiAgXCJtb3ZlRG93blwiOiBcIk1vdmUgZG93blwiLFxuICBcIm1vdmVVcFwiOiBcIk1vdmUgdXBcIixcbiAgXCJ0YWtlU2NyZWVuc2hvdFwiOiBcIlRha2Ugc2NyZWVuc2hvdFwiLFxuICBcImVycm9yXCI6IFwiRXJyb3JcIixcbiAgXCJkaXNjb25uZWN0ZWRcIjogXCJEaXNjb25uZWN0ZWRcIixcbiAgXCJjb25uZWN0aW5nRG90c1wiOiBcIkNvbm5lY3RpbmcuLi5cIixcbiAgXCJkaXNjb25uZWN0aW5nRG90c1wiOiBcIkRpc2Nvbm5lY3RpbmcuLi5cIixcbiAgXCJjb25uZWN0ZWRUb1wiOiBcIkNvbm5lY3RlZCB0byB7aG9zdG5hbWV9IChJRDp7YWdlbnRJRH0pXCIsXG4gIFwibG9hZGluZ0RvdHNcIjogXCJMb2FkaW5nLi4uXCIsXG4gIFwib3NcIjogXCJPU1wiLFxuICBcImxhbmd1YWdlXCI6IFwiTGFuZ3VhZ2VcIixcbiAgXCJhcmNoaXRlY3R1cmVcIjogXCJBcmNoaXRlY3R1cmVcIixcbiAgXCJjcHVcIjogXCJDUFVcIixcbiAgXCJyYW1cIjogXCJSQU1cIixcbiAgXCJoZGRcIjogXCJIRERcIixcbiAgXCJhZ2VudFZlcnNpb25cIjogXCJBZ2VudCB2ZXJzaW9uXCIsXG4gIFwidXB0aW1lXCI6IFwiVXB0aW1lXCIsXG4gIFwiaG9zdG5hbWVcIjogXCJIb3N0bmFtZVwiLFxuICBcImFkZHJlc3NcIjogXCJBZGRyZXNzXCIsXG4gIFwiYnllTWVzc2FnZVwiOiBcIlNvIGxvbmcsIGh1bWFuXCIsXG4gIFwiYmxvY2tlZFNlY3Rpb25cIiA6IFwiQmxvY2tlZCBzZWN0aW9uXCIsXG4gIFwiYmxvY2tlZFNlY3Rpb25TdWJcIiA6IFwiVGhpcyBzZWN0aW9uIHJlcXVpcmVzIGFjdGl2ZSB2YWxpZGF0aW9uLiBXYWl0aW5nIHRvIGxvY2FsIHVzZXJcIixcbiAgXCJjb25uZWN0aW9uRmFpbGVkTWFpblwiIDogXCJJdCBzZWVtcyB0aGUgY29ubmVjdGlvbiBmYWlsZWRcIixcbiAgXCJjb25uZWN0aW9uRmFpbGVkQnVzeVwiIDogXCJQcm9iYWJseSBhbm90aGVyIHVzZXIgaXMgdXNpbmcgdGhlIGFnZW50IGF0IHRoaXMgbW9tZW50LlwiLFxuICBcImNvbm5lY3Rpb25GYWlsZWREb3duXCIgOiBcIlRoZSBhZ2VudCBpcyBwcm9iYWJseSBkb3duLCBzaW5jZSBpdHMgbGFzdCBjb250YWN0IHdhcyBhIGxvbmcgdGltZSBhZ28uXCIsXG4gIFwiY29ubmVjdGlvbkZhaWxlZFNlcnZlclwiIDogXCJUaGUgc2VydmVyIGNhbiBiZSB1bnJlYWNoYWJsZSBvciBtYXkgYmUgYSBjb25uZWN0aW9uIHN0aWxsIG9wZW4uIFRyeSBhZ2Fpbi5cIixcbiAgXCJub3RDb25uZWN0ZWRcIiA6IFwiTm90IGNvbm5lY3RlZFwiLFxuICBcInJlY29ubmVjdE5vd1wiIDogXCJSZWNvbm5lY3Qgbm93XCIsXG4gIFwidHJ5UmVsb2FkaW5nXCIgOiBcIlRyeSByZWxvYWRpbmcgdGhlIHBhZ2VcIixcbiAgXCJhdXRoZW50aWNhdGluZ0RvdHNcIiA6IFwiQXV0aGVudGljYXRpbmcuLi5cIixcbiAgXCJhdXRoZW50aWNhdGluZ1N1YlwiIDogXCJMZXQgbWUgc2VlIGhvdyByZWxpYWJsZSB5b3UgYXJlXCIsXG4gIFwibm90QXV0aGVudGljYXRlZFwiIDogXCJOb3QgYXV0aGVudGljYXRlZFwiLFxuICBcInBhc3N3b3JkTmVlZGVkXCIgOiBcIlBhc3N3b3JkIG5lZWRlZFwiLFxuICBcIm5vdEluaXRpYWxpemVkXCIgOiBcIk5vdCBpbml0aWFsaXplZFwiLFxuICBcImludmFsaWRQYXNzd29yZFwiIDogXCJJbnZhbGlkIHBhc3N3b3JkXCIsXG4gIFwidGltZW91dFBhc3N3b3JkXCIgOiBcIlRoZSBhZ2VudCBoYXMgY2xvc2VkIHRoZSBjb25uZWN0aW9uIGR1ZSB0byBhIHRpbWVvdXQgd2hpbGUgZXhwZWN0aW5nIHRvIGNvbXBsZXRlIHRoZSBhdXRoZW50aWNhdGlvbiBwcm9jZXNzLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZU5vcm1hbFwiIDogXCJUaGUgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQgc3VjY2Vzc2Z1bGx5LlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZUdvaW5nQXdheVwiIDogXCJUaGUgYWdlbnQgaGFzIGNsb3NlZCB0aGUgY29ubmVjdGlvbi5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VQcm90b2NvbEVycm9yXCIgOiBcIlRoZSBhZ2VudCBpcyB0ZXJtaW5hdGluZyB0aGUgY29ubmVjdGlvbiBkdWUgdG8gYSBwcm90b2NvbCBlcnJvci5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VVbnN1cHBvcnRlZFwiIDogXCJUaGUgY29ubmVjdGlvbiBpcyBiZWluZyB0ZXJtaW5hdGVkIGJlY2F1c2UgdGhlIGFnZW50IHJlY2VpdmVkIGRhdGEgb2YgYSB0eXBlIGl0IGNhbm5vdCBhY2NlcHQuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlTm9TdGF0dXNcIiA6IFwiTm8gc3RhdHVzIGNvZGUgd2FzIHByb3ZpZGVkIGV2ZW4gdGhvdWdoIG9uZSB3YXMgZXhwZWN0ZWQuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlQWJub3JtYWxcIiA6IFwiVGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCBhYm5vcm1hbGx5IHdpdGhvdXQgYSBjbG9zZSBzaWduYWwuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlVW5zdXBwb3J0ZWREYXRhXCIgOiBcIlRoZSBhZ2VudCBpcyB0ZXJtaW5hdGluIHRoZSBjb25uZWN0aW9uIGJlY2F1c2UgYSBtZXNzYWdlIHdhcyByZWNlaXZlZCB0aGF0IGNvbnRhaW5lZCBpbmNvbnNpc3RlbnQgZGF0YS5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VQb2xpY3lWaW9sYXRpb25cIiA6IFwiVGhlIGFnZW50IGlzIHRlcm1pbmF0aW5nIHRoZSBjb25uZWN0aW9uIGJlY2F1c2UgaXQgcmVjZWl2ZWQgYSBtZXNzYWdlIHRoYXQgdmlvbGF0ZXMgaXRzIHBvbGljeS5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VUb29MYXJnZVwiIDogXCJUaGUgYWdlbnQgaXMgdGVybWluYXRpbmcgdGhlIGNvbm5lY3Rpb24gYmVjYXVzZSBhIGRhdGEgZnJhbWUgd2FzIHJlY2VpdmVkIHRoYXQgaXMgdG9vIGxhcmdlLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZU1pc3NpbmdFeHRlbnNpb25cIiA6IFwiVGhlIGNsaWVudCBpcyB0ZXJtaW5hdGluZyB0aGUgY29ubmVjdGlvbiBiZWNhdXNlIGl0IGV4cGVjdGVkIHRoZSBhZ2VudCB0byBuZWdvdGlhdGUgb25lIG9yIG1vcmUgZXh0ZW5zaW9uLCBidXQgaXQgZGlkbid0LlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZUludGVybmFsRXJyb3JcIiA6IFwiVGhlIGFnZW50IGlzIHRlcm1pbmF0aW5nIHRoZSBjb25uZWN0aW9uIGJlY2F1c2UgaXQgZW5jb3VudGVyZWQgYW4gdW5leHBlY3RlZCBjb25kaXRpb24gdGhhdCBwcmV2ZW50ZWQgaXQgZnJvbSBmdWxmaWxsaW5nIHRoZSByZXF1ZXN0LlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZVNlcnZpY2VSZXN0YXJ0XCIgOiBcIlRoZSBhZ2VudCBpcyB0ZXJtaW5hdGluZyB0aGUgY29ubmVjdGlvbiBiZWNhdXNlIGl0IGlzIHJlc3RhcnRpbmcuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlVHJ5QWdhaW5MYXRlclwiIDogXCJUaGUgYWdlbnQgaXMgdGVybWluYXRpbmcgdGhlIGNvbm5lY3Rpb24gZHVlIHRvIGEgdGVtcG9yYXJ5IGNvbmRpdGlvbi5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VUbHNIYW5kc2hha2VcIiA6IFwiVGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCBkdWUgdG8gYSBmYWlsdXJlIHRvIHBlcmZvcm0gYSBUTFMgaGFuZHNoYWtlLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZUluYWN0aXZpdHlcIiA6IFwiVGhlIGFnZW50IGhhcyBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gZHVlIHRvIGluYWN0aXZpdHkuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlQXV0aEV4cGlyZWRcIiA6IFwiVGhlIGFnZW50IGhhcyBjbG9zZWQgdGhlIGNvbm5lY3Rpb24gYmVjYXVzZSB0aGUgdGVtcG9yYXJ5IGF1dGhvcml6YXRpb24gaGFzIGV4cGlyZWQuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlRGVmYXVsdFwiIDogXCJUaGUgY29ubmVjdGlvbiB3YXMgY2xvc2VkIHdpdGhvdXQgcmVjZWl2aW5nIGEgdmFsaWQgY29kZS5cIixcbiAgXCJmb3JiaWRkZW5TZWN0aW9uXCIgOiBcIkZvcmJpZGRlbiBzZWN0aW9uXCIsXG4gIFwiZm9yYmlkZGVuU2VjdGlvblN1YlwiIDogXCJBIHJlbW90ZSB1c2VyIGFjdGl2ZWx5IHJlZnVzZWQgeW91ciByZXF1ZXN0IHRvIG9wZW4ge3NlY3Rpb259LlwiLFxuICBcInRyeUFnYWluXCIgOiBcIlRyeSBhZ2FpblwiLFxuICBcInNoYXJlLWFnZW50LWFjY2Vzc1wiOiBcIlNoYXJlIHRoZSBhY2Nlc3MgdG8gdGhpcyBhZ2VudFwiLFxuICBcInNoYXJlLXdhcm5pbmctbWVzc2FnZVwiOiBcIlJlbWVtYmVyIHRvIGRpc2Nvbm5lY3QgZnJvbSB0aGlzIGFnZW50IHRvIGFsbG93IHRoZSBjb25uZWN0aW9uIG9mIGFub3RoZXIgdXNlclwiLFxuICBcInJlcXVlc3RpbmdQYXNzRG90c1wiIDogXCJSZXF1ZXN0aW5nIHBhc3MuLi5cIixcbiAgXCJleHBpcmF0aW9uSW5NaW51dGVzXCIgOiBcIkV4cGlyYXRpb24gaW4gbWludXRlc1wiLFxuICBcImdlbmVyYXRlVXJsRXhwbGFuYXRpb25cIiA6IFwiV2l0aCB0aGlzIHVybCwgcGVvcGxlIHdpbGwgYWNjZXNzIGRpcmVjdGx5IHRvIHRoZSBhZ2VudCBkdXJpbmcgdGhlIHRpbWUgc3BlY2lmaWVkIGFuZCB3aXRob3V0IHRoZSByZXF1aXJlbWVudHMgb2YgaGF2aW5nIGFuIGFjY291bnQgb3IgYmVpbmcgbG9nZ2VkIGluXCIsXG4gIFwicmVxdWVzdGluZ1VybERvdHNcIiA6IFwiUmVxdWVzdGluZyBVUkwuLi5cIixcbiAgXCJnZW5lcmF0ZVVybFwiIDogXCJHZW5lcmF0ZSBVUkxcIixcbiAgXCJ0ZW1wb3JhcnlVcmxcIiA6IFwiVGVtcG9yYXJ5IFVSTFwiLFxuICBcIlhfU2Vjb25kc1wiIDogXCJ7blNlY29uZHMsIHBsdXJhbCwgPTB7TmV2ZXJ9IG9uZXsjIHNlY29uZH0gb3RoZXJ7IyBzZWNvbmRzfX1cIixcbiAgXCJYX01pbnV0ZXNcIiA6IFwie25NaW51dGVzLCBwbHVyYWwsID0we05ldmVyfSBvbmV7IyBtaW51dGV9IG90aGVyeyMgbWludXRlc319XCIsXG4gIFwicmVmcmVzaFByb2Nlc3Nlc1wiIDogXCJSZWZyZXNoIHByb2Nlc3Nlc1wiLFxuICBcInN0b3BQcm9jZXNzXCIgOiBcIlN0b3AgcHJvY2Vzc1wiLFxuICBcImNsaWNrT25BUHJvY2Vzc1wiIDogXCJDbGljayBvbiBhIHByb2Nlc3NcIixcbiAgXCJmaWx0ZXJQcm9jZXNzXCIgOiBcIkZpbHRlciBsaXN0IGJ5IFBJRCwgdXNlciBvciBuYW1lXCIsXG4gIFwidXNlZFwiOiBcIlVzZWRcIixcbiAgXCJ0b3RhbFwiOiBcIlRvdGFsXCIsXG4gIFwicGlkXCIgOiBcIlBJRFwiLFxuICBcInVzZXJcIiA6IFwiVXNlclwiLFxuICBcIm5hbWVcIiA6IFwiTmFtZVwiLFxuICBcInRoZXJlQXJlTm9Qcm9jZXNzZXNcIiA6IFwiVGhlcmUgYXJlIG5vIHByb2Nlc3Nlc1wiLFxuICBcImNsaWNrT25BU2VydmljZVwiIDogXCJDbGljayBvbiBhIHNlcnZpY2VcIixcbiAgXCJyZWZyZXNoU2VydmljZXNcIiA6IFwiUmVmcmVzaCBzZXJ2aWNlc1wiLFxuICBcInN0YXJ0U2VydmljZVwiIDogXCJTdGFydCBzZXJ2aWNlXCIsXG4gIFwic3RvcFNlcnZpY2VcIiA6IFwiU3RvcCBzZXJ2aWNlXCIsXG4gIFwidHlwZVRvRmlsdGVyXCIgOiBcIlR5cGUgdG8gZmlsdGVyXCIsXG4gIFwiYW55XCIgOiBcIkFueVwiLFxuICBcInNlYXJjaFwiIDogXCJTZWFyY2hcIixcbiAgXCJpZGVudGlmaWVyXCIgOiBcIklkZW50aWZpZXJcIixcbiAgXCJkZXNjcmlwdGlvblwiIDogXCJEZXNjcmlwdGlvblwiLFxuICBcInN0YXR1c1wiIDogXCJTdGF0dXNcIixcbiAgXCJ0aGVyZUFyZU5vU2VydmljZXNcIiA6IFwiVGhlcmUgYXJlIG5vIHNlcnZpY2VzXCIsXG4gIFwibm90UnVubmluZ1wiIDogXCJOb3QgUnVubmluZ1wiLFxuICBcImZpbHRlclwiIDogXCJGaWx0ZXJcIixcbiAgXCJyZWZyZXNoRGlyZWN0b3J5XCIgOiBcIlJlZnJlc2ggZGlyZWN0b3J5XCIsXG4gIFwiZG93bmxvYWRzXCIgOiBcIkRvd25sb2Fkc1wiLFxuICBcInVwbG9hZHNcIiA6IFwiVXBsb2Fkc1wiLFxuICBcImVtcHR5XCIgOiBcIkVtcHR5XCIsXG4gIFwiZmlsZXNEb3dubG9hZExpbWl0XCIgOiBcIkN1cnJlbnRseSwgdGhlIGRvd25sb2FkIGlzIHN1cHBvcnRlZCBvbmx5IHdpdGggaXRlbXMgb2YgMTAwTUIgb3IgbGVzc1wiLFxuICBcInRoZUZpbGVXaWxsQmVEZWxldGVkXCIgOiBcIlRoZSBmaWxlIHdpbGwgYmUgZGVsZXRlZFwiLFxuICBcInllc1wiIDogXCJZZXNcIixcbiAgXCJhY3Rpb25zXCIgOiBcIkFjdGlvbnNcIixcbiAgXCJsYXN0TW9kaWZpY2F0aW9uXCIgOiBcIkxhc3QgbW9kaWZpY2F0aW9uXCIsXG4gIFwiY29uZmlybURlbGV0aW9uXCIgOiBcIkNvbmZpcm0gZGVsZXRpb25cIixcbiAgXCJ0aGVyZUFyZU5vRmlsZXNcIiA6IFwiVGhlcmUgYXJlIG5vIGZpbGVzXCIsXG4gIFwic2l6ZVwiIDogXCJTaXplXCIsXG4gIFwiZGVsZXRlXCIgOiBcIkRlbGV0ZVwiLFxuICBcImFyZVlvdVN1cmVRdWVzdGlvbk1hcmtcIjogXCJBcmUgeW91IHN1cmU/XCIsXG4gIFwibGFzdFVwZGF0ZVwiIDogXCJMYXN0IHVwZGF0ZVwiLFxuICBcIm5ldmVyVXBkYXRlZFwiIDogXCJOZXZlciB1cGRhdGVkXCIsXG4gIFwibm9Sb290RGlyZWN0b3J5XCIgOiBcIk5vIHJvb3QgZGlyZWN0b3J5XCIsXG4gIFwic3RhcnRQZW5kaW5nXCIgOiBcIlN0YXJ0IHBlbmRpbmdcIixcbiAgXCJzdG9wUGVuZGluZ1wiIDogXCJTdG9wIHBlbmRpbmdcIixcbiAgXCJydW5uaW5nXCIgOiBcIlJ1bm5pbmdcIixcbiAgXCJyZXN1bWVQZW5kaW5nXCIgOiBcIlJlc3VtZSBwZW5kaW5nXCIsXG4gIFwicGF1c2VQZW5kaW5nXCIgOiBcIlBhdXNlIHBlbmRpbmdcIixcbiAgXCJwYXVzZWRcIiA6IFwiUGF1c2VkXCIsXG4gIFwidW5rbm93blwiIDogXCJVbmtub3duXCIsXG4gIFwiZGlzY29ubmVjdGVkSW5mb1wiIDogXCJQcmVzcyAnQ29ubmVjdCcgYnV0dG9uIHRvIGFjY2VzcyB0aGUgcmVtb3RlIGRlc2suXCIsXG4gIFwiZXJyb3ItZmVjaGluZy1yb290XCIgOiBcIkVycm9yIG9wZW5pbmcgdGhlIHJvb3QgZGlyZWN0b3J5XCIsXG4gIFwiZXJyb3ItZmVjaGluZy1kaXJcIiA6IFwiRXJyb3Igb3BlbmluZyB0aGUgZGlyZWN0b3J5OiB7cGF0aH1cIixcbiAgXCJlcnJvci11cGxvYWQtZmlsZVwiIDogXCJVcGxvYWQgZmFpbGVkICh7cGF0aH0pXCIsXG4gIFwiZXJyb3ItZG93bmxvYWQtZmlsZVwiIDogXCJEb3dubG9hZCBmYWlsZWQgKHtwYXRofSlcIixcbiAgXCJlcnJvci1kZWxldGluZy1maWxlXCIgOiBcIkVycm9yIGRlbGV0aW5nIHRoZSBmaWxlIHtwYXRofVwiLFxuICBcInJlc3RhcnRTZXJ2aWNlXCIgOiBcIlJlc3RhcnQgc2VydmljZVwiLFxuICBcInVwbG9hZC1kaXNhYmxlZFwiOiBcIlVwbG9hZCBkaXNhYmxlZCBvbiB0aGlzIGRpcmVjdG9yeVwiLFxuICBcImNsaWNrLXRvLXVwbG9hZFwiOiBcIkNsaWNrIHRvIHVwbG9hZFwiLFxuICBcInVwbG9hZC1kcm9wXCI6IFwiRHJvcCB0aGUgZmlsZSB0byBzdGFydCB0aGUgdXBsb2FkXCJcbn1cbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgXCJkaXNjb25uZWN0XCI6IFwiRGVzY29uZWN0YXJcIixcbiAgXCJ0ZXJtaW5hbFwiOiBcIkNvbnNvbGFcIixcbiAgXCJkaXNwbGF5XCI6IFwiRXNjcml0b3Jpb1wiLFxuICBcInByb2Nlc3Nlc1wiOiBcIlByb2Nlc29zXCIsXG4gIFwic2VydmljZXNcIjogXCJTZXJ2aWNpb3NcIixcbiAgXCJmaWxlc1wiOiBcIkFyY2hpdm9zXCIsXG4gIFwic2hhcmVcIjogXCJDb21wYXJ0aXJcIixcbiAgXCJhZ2VudFBhc3N3b3JkXCI6IFwiQ29udHJhc2XDsWEgZGVsIGFnZW50ZVwiLFxuICBcImNvbm5lY3RcIjogXCJDb25lY3RhclwiLFxuICBcImZ1bGxzY3JlZW5cIjogXCJQYW50YWxsYSBjb21wbGV0YVwiLFxuICBcImV4aXRGdWxsc2NyZWVuXCI6IFwiU2FsaXIgZGUgcGFudGFsbGEgY29tcGxldGFcIixcbiAgXCJjbGlwYm9hcmRcIjogXCJQb3J0YXBhcGVsZXNcIixcbiAgXCJ0cnVlQ29sb3JcIjogXCJDb2xvciByZWFsXCIsXG4gIFwibG9jYWxDdXJzb3JcIjogXCJQdW50ZXJvIGxvY2FsXCIsXG4gIFwic2hhcmVkXCI6IFwiQ29tcGFydGlkb1wiLFxuICBcInZpZXdPbmx5XCI6IFwiU29sbyBsZWN0dXJhXCIsXG4gIFwiZnVsbE1lbnVcIjogXCJNZW7DuiBjb21wbGV0b1wiLFxuICBcInNtYWxsTWVudVwiOiBcIk1lbsO6IHBlcXVlw7FvXCIsXG4gIFwic2VuZFwiOiBcIkVudmlhclwiLFxuICBcInJlbW90ZVwiOiBcIlJlbW90b1wiLFxuICBcImxvY2FsXCI6IFwiTG9jYWxcIixcbiAgXCJub3RoaW5nQ29waWVkXCI6IFwiTmFkYSBjb3BpYWRvXCIsXG4gIFwiY3VycmVudENsaXBib2FyZEV4cGxhaW5hdGlvblwiOiBcIkVzdGUgZXMgZWwgcG9ydGFwYXBlbGVzIGRlIGxhIG3DoXF1aW5hIHJlbW90YS4gQ29waWEgbG8gcXVlIG5lY2VzaXRlcy5cIixcbiAgXCJjbGlja1NlbmRDbGlwYm9hcmRcIjogXCJIYXogY2xpY2sgcGFyYSBlbnZpYXIgZWwgdGV4dG8gYWwgcG9ydGFwYXBlbGVzIHJlbW90by5cIixcbiAgXCJtb3ZlRG93blwiOiBcIk1vdmVyIGFiYWpvXCIsXG4gIFwibW92ZVVwXCI6IFwiTW92ZXIgYXJyaWJhXCIsXG4gIFwidGFrZVNjcmVlbnNob3RcIjogXCJUb21hciBjYXB0dXJhIGRlIHBhbnRhbGxhXCIsXG4gIFwiZXJyb3JcIjogXCJFcnJvclwiLFxuICBcImRpc2Nvbm5lY3RlZFwiOiBcIkRlc2NvbmVjdGFkb1wiLFxuICBcImNvbm5lY3RpbmdEb3RzXCI6IFwiQ29uZWN0YW5kby4uLlwiLFxuICBcImRpc2Nvbm5lY3RpbmdEb3RzXCI6IFwiRGVzY29uZWN0YW5kby4uLlwiLFxuICBcImNvbm5lY3RlZFRvXCI6IFwiQ29uZWN0YWRvIGEge2hvc3RuYW1lfSAoSUQ6e2FnZW50SUR9KVwiLFxuICBcImxvYWRpbmdEb3RzXCI6IFwiQ2FyZ2FuZG8uLi5cIixcbiAgXCJvc1wiOiBcIk9TXCIsXG4gIFwibGFuZ3VhZ2VcIjogXCJJZGlvbWFcIixcbiAgXCJhcmNoaXRlY3R1cmVcIjogXCJBcnF1aXRlY3R1cmFcIixcbiAgXCJjcHVcIjogXCJDUFVcIixcbiAgXCJyYW1cIjogXCJSQU1cIixcbiAgXCJoZGRcIjogXCJIRERcIixcbiAgXCJhZ2VudFZlcnNpb25cIjogXCJWZXJzacOzbiBkZWwgYWdlbnRlXCIsXG4gIFwidXB0aW1lXCI6IFwiVGllbXBvIGVuIGzDrW5lYVwiLFxuICBcImhvc3RuYW1lXCI6IFwiSG9zdG5hbWVcIixcbiAgXCJhZGRyZXNzXCI6IFwiRGlyZWNjacOzblwiLFxuICBcImJ5ZU1lc3NhZ2VcIjogXCJIYXN0YSBwcm9udG8sIGh1bWFub1wiLFxuICBcImJsb2NrZWRTZWN0aW9uXCIgOiBcIlNlY2Npw7NuIGJsb3F1ZWFkYVwiLFxuICBcImJsb2NrZWRTZWN0aW9uU3ViXCIgOiBcIkVzdGEgc2VjY2nDs24gcmVxdWllcmUgdW5hIHZhbGlkYWNpw7NuIGFjdGl2YS4gRXNwZXJhbmRvIGFsIHVzdWFyaW8gbG9jYWxcIixcbiAgXCJjb25uZWN0aW9uRmFpbGVkTWFpblwiIDogXCJQYXJlY2UgcXVlIGxhIGNvbmV4acOzbiBoYSBmYWxsYWRvXCIsXG4gIFwiY29ubmVjdGlvbkZhaWxlZEJ1c3lcIiA6IFwiUHJvYmFibGVtZW50ZSBvdHJvIHVzdWFyaW8gZXN0w6kgdXNhbmRvIGVsIGFnZW50ZSBlbiBlc3RlIG1vbWVudG8uXCIsXG4gIFwiY29ubmVjdGlvbkZhaWxlZERvd25cIiA6IFwiRWwgYWdlbnRlIHByb2JhYmxlbWVudGUgZXN0w6EgY2HDrWRvIHlhIHF1ZSBlbCDDumx0aW1vIGNvbnRhY3RvIGZ1ZSBoYWNlIG11Y2hvIHRpZW1wby5cIixcbiAgXCJjb25uZWN0aW9uRmFpbGVkU2VydmVyXCIgOiBcIk5vIHNlIHB1ZWRlIGFjY2VkZXIgYWwgc2Vydmlkb3IgbyBwdWVkZSBxdWUgaGF5YSB1bmEgY29uZXhpw7NuIHlhIGFiaWVydGEuIEludMOpbnRhbG8gZGUgbnVldm8uXCIsXG4gIFwibm90Q29ubmVjdGVkXCIgOiBcIk5vIGNvbmVjdGFkb1wiLFxuICBcInJlY29ubmVjdE5vd1wiIDogXCJDb25lY3RhciBkZSBudWV2byBhaG9yYVwiLFxuICBcInRyeVJlbG9hZGluZ1wiIDogXCJJbnRlbnRhIHJlY2FyZ2FyIGxhIHDDoWdpbmFcIixcbiAgXCJhdXRoZW50aWNhdGluZ0RvdHNcIiA6IFwiQXV0ZW50aWNhbmRvLi4uXCIsXG4gIFwiYXV0aGVudGljYXRpbmdTdWJcIiA6IFwiVmFtb3MgYSB2ZXIgY8OzbW8gZGUgZmlhciBlcmVzLlwiLFxuICBcIm5vdEF1dGhlbnRpY2F0ZWRcIiA6IFwiTm8gYXV0ZW50aWNhZG9cIixcbiAgXCJwYXNzd29yZE5lZWRlZFwiIDogXCJMYSBjb250cmFzZcOxYSBlcyBuZWNlc2FyaWFcIixcbiAgXCJub3RJbml0aWFsaXplZFwiIDogXCJObyBpbmljaWFsaXphZG9cIixcbiAgXCJpbnZhbGlkUGFzc3dvcmRcIiA6IFwiQ29udHJhc2XDsWEgbm8gdsOhbGlkYVwiLFxuICBcInRpbWVvdXRQYXNzd29yZFwiIDogXCJFbCBhZ2VudGUgaGEgY2VycmFkbyBsYSBjb25leGnDs24gcG9yIGluYWN0aXZpZGFkIG1pZW50cmFzIHNlIGNvbXBsZXRhYmEgZWwgcHJvY2VzbyBkZSBhdXRlbnRpY2FjacOzbi5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VOb3JtYWxcIiA6IFwiTGEgY29uZXhpw7NuIHNlIGhhIGNlcnJhZG8gY29uIMOpeGl0by5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VHb2luZ0F3YXlcIiA6IFwiRWwgYWdlbnRlIGhhIGNlcnJhZG8gbGEgY29uZXhpw7NuLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZVByb3RvY29sRXJyb3JcIiA6IFwiRWwgYWdlbnRlIGhhIGNlcnJhZG8gbGEgY29uZXhpw7NuIGRlYmlkbyBhIHVuIGVycm9yIGRlIHByb3RvY29sby5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VVbnN1cHBvcnRlZFwiIDogXCJMYSBjb25leGnDs24gc2UgaGEgY2VycmFuZG8gZGViaWRvIGEgcXVlIGVsIGFnZW50ZSBoYSByZWNpYmlkbyBkYXRvcyBkZSB1biB0aXBvIHF1ZSBubyBwdWVkZSBhY2VwdGFyLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZU5vU3RhdHVzXCIgOiBcIk5vIHNlIGhhIHJlY2liaWRvIHVuIGPDs2RpZ28gZGUgZXN0YWRvIGN1YW5kbyBzZSBlc3BlcmFiYSB1bm8uXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlQWJub3JtYWxcIiA6IFwiTGEgY29uZXhpw7NuIHNlIGNlcnLDsyBkZSBmb3JtYSBhbsOzbWFsYSBzaW4gdW5hIHNlw7FhbCBkZSBjaWVycmUuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlVW5zdXBwb3J0ZWREYXRhXCIgOiBcIkVsIGFnZW50ZSBoYSBjZXJyYWRvIGxhIGNvbmV4acOzbiBwb3JxdWUgc2UgaGEgcmVjaWJpZG8gdW4gbWVuc2FqZSBjb24gZGF0b3MgaW5jb25zaXN0ZW50ZXMuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlUG9saWN5VmlvbGF0aW9uXCIgOiBcIkVsIGFnZW50ZSBoYSBjZXJyYWRvIGxhIGNvbmV4acOzbiBwb3JxdWUgcmVjaWJpw7MgdW4gbWVuc2FqZSBxdWUgdmlvbGEgc3UgcG9sw610aWNhLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZVRvb0xhcmdlXCIgOiBcIkVsIGFnZW50ZSBoYSBjZXJyYWRvIGxhIGNvbmV4acOzbiBwb3JxdWUgc2UgcmVjaWJpw7MgdW5hIHRyYW1hIGRlIGRhdG9zIGRlbWFzaWFkbyBncmFuZGUuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlTWlzc2luZ0V4dGVuc2lvblwiIDogXCJFbCBjbGllbnRlIGhhIGNlcnJhZG8gbGEgY29uZXhpw7NuIHBvcnF1ZSBlc3BlcmFiYSBxdWUgZWwgYWdlbnRlIG5lZ29jaWFzZSB1bmEgZXh0ZW5zacOzbiB5IG5vIGxvIGhhIGhlY2hvLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZUludGVybmFsRXJyb3JcIiA6IFwiRWwgYWdlbnRlIGhhIGNlcnJhZG8gbGEgY29uZXhpw7NuIHBvcnF1ZSBoYSBlbmNvbnRyYWRvIHVuYSBjb25kaWNpw7NuIGluZXNwZXJhZGEgcXVlIGhhIGltcGVkaWRvIHF1ZSBzZSBjb21wbGV0YXNlIGxhIHBldGljacOzbi5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VTZXJ2aWNlUmVzdGFydFwiIDogXCJFbCBhZ2VudGUgaGEgY2VycmFkbyBsYSBjb25leGnDs24gcG9ycXVlIHNlIGVzdMOhIHJlaW5pY2lhbmRvLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZVRyeUFnYWluTGF0ZXJcIiA6IFwiRWwgYWdlbnRlIGhhIGNlcnJhZG8gbGEgY29uZXhpw7NuIGRlYmlkbyBhIHVuIHByb2JsZW1hIHRlbXBvcmFsLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZVRsc0hhbmRzaGFrZVwiIDogXCJMYSBjb25leGnDs24gc2UgaGEgY2VycmFkbyBkZWJpZG8gYSB1biBmYWxsbyBlbiBsYSBuZWdvY2lhY2nDs24gZGVsIHNhbHVkbyBUTFMuXCIsXG4gIFwic29ja2V0TWVzc2FnZUNsb3NlSW5hY3Rpdml0eVwiIDogXCJFbCBhZ2VudGUgaGEgY2VycmFkbyBsYSBjb25leGnDs24gcG9yIGluYWN0aXZpZGFkLlwiLFxuICBcInNvY2tldE1lc3NhZ2VDbG9zZUF1dGhFeHBpcmVkXCIgOiBcIkVsIGFnZW50ZSBoYSBjZXJyYWRvIGxhIGNvbmV4acOzbiBwb3JxdWUgbGEgYXV0b3JpemFjacOzbiB0ZW1wb3JhbCBoYSBjYWR1Y2Fkby5cIixcbiAgXCJzb2NrZXRNZXNzYWdlQ2xvc2VEZWZhdWx0XCIgOiBcIkxhIGNvbmV4acOzbiBzZSBoYSBjZXJyYWRvIHNpbiByZWNpYmlyIHVuIGPDs2RpZ28gdsOhbGlkby5cIixcbiAgXCJmb3JiaWRkZW5TZWN0aW9uXCIgOiBcIlNlY2Npw7NuIGluYWNjZXNpYmxlXCIsXG4gIFwiZm9yYmlkZGVuU2VjdGlvblN1YlwiIDogXCJVbiB1c3VhcmlvIHJlbW90byBoYSByZWNoYXphZG8gYWN0aXZhbWVudGUgbGEgcGV0aWNpw7NuIGRlIGFicmlyIHtzZWN0aW9ufS5cIixcbiAgXCJ0cnlBZ2FpblwiIDogXCJJbnRlbnRhciBkZSBudWV2b1wiLFxuICBcInNoYXJlLWFnZW50LWFjY2Vzc1wiOiBcIkNvbXBhcnRlIGVsIGFjY2VzbyBhIGVzdGUgYWdlbnRlXCIsXG4gIFwic2hhcmUtd2FybmluZy1tZXNzYWdlXCI6IFwiUmVjdWVyZGEgZGVzY29uZWN0YXJ0ZSBkZSBlc3RlIGFnZW50ZSBwYXJhIHBlcm10aXIgbGEgY29uZXhpw7NuIGRlIG90cm8gdXN1YXJpb1wiLFxuICBcInJlcXVlc3RpbmdQYXNzRG90c1wiIDogXCJQaWRpZW5kbyBjb250cmFzZcOxYS4uLlwiLFxuICBcImV4cGlyYXRpb25Jbk1pbnV0ZXNcIiA6IFwiQ2FkdWNpZGFkIChlbiBtaW51dG9zKVwiLFxuICBcImdlbmVyYXRlVXJsRXhwbGFuYXRpb25cIiA6IFwiQ29uIGVzdGEgVVJMIG90cmFzIHBlcnNvbmFzIHB1ZWRlbiBhY2NlZGVyIGRpcmVjdGFtZW50ZSBhbCBhZ2VudGUgZHVyYW50ZSBlbCB0aWVtcG8gZXNwZWNpZmljYWRvIHkgc2luIG5lY2VzaWRhZCBkZSBjcmVhciB1bmEgY3VlbnRhIG8gaW5pY2lhciB1bmEgc2VzacOzblwiLFxuICBcInJlcXVlc3RpbmdVcmxEb3RzXCIgOiBcIlBpZGllbmRvIFVSTC4uLlwiLFxuICBcImdlbmVyYXRlVXJsXCIgOiBcIkdlbmVyYXIgVVJMXCIsXG4gIFwidGVtcG9yYXJ5VXJsXCIgOiBcIlVSTCB0ZW1wb3JhbFwiLFxuICBcIlhfU2Vjb25kc1wiIDogXCJ7blNlY29uZHMsIHBsdXJhbCwgPTB7TnVuY2F9IG9uZXsjIHNlZ3VuZG99IG90aGVyeyMgc2VndW5kb3N9fVwiLFxuICBcIlhfTWludXRlc1wiIDogXCJ7bk1pbnV0ZXMsIHBsdXJhbCwgPTB7TnVuY2F9IG9uZXsjIG1pbnV0b30gb3RoZXJ7IyBtaW51dG9zfX1cIixcbiAgXCJyZWZyZXNoUHJvY2Vzc2VzXCIgOiBcIlJlZnJlc2NhciBwcm9jZXNvc1wiLFxuICBcInN0b3BQcm9jZXNzXCIgOiBcIlBhcmFyIHByb2Nlc29cIixcbiAgXCJjbGlja09uQVByb2Nlc3NcIiA6IFwiSGFjZXIgY2xpY2sgZW4gdW4gcHJvY2Vzb1wiLFxuICBcImZpbHRlclByb2Nlc3NcIiA6IFwiRmlsdHJhciBwb3IgUElELCB1c3VhcmlvIG8gbm9tYnJlXCIsXG4gIFwidXNlZFwiOiBcIlVzYWRvXCIsXG4gIFwidG90YWxcIjogXCJUb3RhbFwiLFxuICBcInBpZFwiIDogXCJQSURcIixcbiAgXCJ1c2VyXCIgOiBcIlVzdWFyaW9cIixcbiAgXCJuYW1lXCIgOiBcIk5vbWJyZVwiLFxuICBcInRoZXJlQXJlTm9Qcm9jZXNzZXNcIiA6IFwiTm8gaGF5IHByb2Nlc29zXCIsXG4gIFwiY2xpY2tPbkFTZXJ2aWNlXCIgOiBcIkhhY2VyIGNsaWNrIGVuIHVuIHNlcnZpY2lvXCIsXG4gIFwicmVmcmVzaFNlcnZpY2VzXCIgOiBcIlJlZnJlc2NhciBzZXJ2aWNpb3NcIixcbiAgXCJzdGFydFNlcnZpY2VcIiA6IFwiSW5pY2lhciBzZXJ2aWNpb1wiLFxuICBcInN0b3BTZXJ2aWNlXCIgOiBcIlBhcmFyIHNlcnZpY2lvXCIsXG4gIFwidHlwZVRvRmlsdGVyXCIgOiBcIkVzY3JpYmUgcGFyYSBmaWx0cmFyXCIsXG4gIFwiYW55XCIgOiBcIkN1YWxxdWllcmFcIixcbiAgXCJzZWFyY2hcIiA6IFwiQnVzY2FyXCIsXG4gIFwiaWRlbnRpZmllclwiIDogXCJJZGVudGlmaWNhZG9yXCIsXG4gIFwiZGVzY3JpcHRpb25cIiA6IFwiRGVzY3JpcGNpw7NuXCIsXG4gIFwic3RhdHVzXCIgOiBcIkVzdGFkb1wiLFxuICBcInRoZXJlQXJlTm9TZXJ2aWNlc1wiIDogXCJObyBoYXkgc2VydmljaW9zXCIsXG4gIFwibm90UnVubmluZ1wiIDogXCJQYXJhZG9cIixcbiAgXCJmaWx0ZXJcIiA6IFwiRmlsdHJvXCIsXG4gIFwicmVmcmVzaERpcmVjdG9yeVwiIDogXCJSZWZyZXNjYXIgY2FycGV0YVwiLFxuICBcImRvd25sb2Fkc1wiIDogXCJEZXNjYXJnYXNcIixcbiAgXCJ1cGxvYWRzXCIgOiBcIlN1YmlkYXNcIixcbiAgXCJlbXB0eVwiIDogXCJWYWPDrW9cIixcbiAgXCJmaWxlc0Rvd25sb2FkTGltaXRcIiA6IFwiQWN0dWFsbWVudGUsIHNvbG8gc2UgcHVlZGVuIGRlc2NhcmdhciBhcmNoaXZvcyBkZSAxMDBNQiBvIG1lbm9zXCIsXG4gIFwidGhlRmlsZVdpbGxCZURlbGV0ZWRcIiA6IFwiRWwgYXJjaGl2byBzZSBib3JyYXLDoVwiLFxuICBcInllc1wiIDogXCJTw61cIixcbiAgXCJhY3Rpb25zXCIgOiBcIkFjY2lvbmVzXCIsXG4gIFwibGFzdE1vZGlmaWNhdGlvblwiIDogXCLDmmx0aW1hIG1vZGlmaWNhY2nDs25cIixcbiAgXCJjb25maXJtRGVsZXRpb25cIiA6IFwiQ29uZmlybWFyIGVsIGJvcnJhZG9cIixcbiAgXCJ0aGVyZUFyZU5vRmlsZXNcIiA6IFwiTm8gaGF5IGFyY2hpdm9zXCIsXG4gIFwic2l6ZVwiIDogXCJUYW1hw7FvXCIsXG4gIFwiZGVsZXRlXCIgOiBcIkJvcnJhclwiLFxuICBcImFyZVlvdVN1cmVRdWVzdGlvbk1hcmtcIiA6IFwiwr9Fc3TDoXMgc2VndXJvP1wiLFxuICBcImxhc3RVcGRhdGVcIiA6IFwiw5psdGltYSBhY3R1YWxpemFjacOzblwiLFxuICBcIm5ldmVyVXBkYXRlZFwiIDogXCJOdW5jYSBzZSBoYSBhY3R1YWxpemFkb1wiLFxuICBcIm5vUm9vdERpcmVjdG9yeVwiIDogXCJObyBoYXkgZGlyZWN0b3JpbyByYcOtelwiLFxuICBcInN0YXJ0UGVuZGluZ1wiIDogXCJBcnJhbmNhbmRvXCIsXG4gIFwic3RvcFBlbmRpbmdcIiA6IFwiUGFyYW5kb1wiLFxuICBcInJ1bm5pbmdcIiA6IFwiQ29ycmllbmRvXCIsXG4gIFwicmVzdW1lUGVuZGluZ1wiIDogXCJSZWluaWNpYW5kb1wiLFxuICBcInBhdXNlUGVuZGluZ1wiIDogXCJQYXVzYW5kb1wiLFxuICBcInBhdXNlZFwiIDogXCJQYXVzYWRvXCIsXG4gIFwidW5rbm93blwiIDogXCJEZXNjb25vY2lkb1wiLFxuICBcImRpc2Nvbm5lY3RlZEluZm9cIiA6IFwiUHVsc2UgZWwgYm90w7NuICdDb25lY3RhcicgcGFyYSBhY2NlZGVyIGFsIGVzY3JpdG9yaW8gcmVtb3RvLlwiLFxuICBcImVycm9yLWZlY2hpbmctcm9vdFwiIDogXCJFcnJvciBhbCBhYnJpciBlbCBkaXJlY3RvcmlvIHJhw616XCIsXG4gIFwiZXJyb3ItZmVjaGluZy1kaXJcIiA6IFwiRXJyb3IgYWwgYWJyaXIgbGEgY2FycGV0YToge3BhdGh9XCIsXG4gIFwiZXJyb3ItdXBsb2FkLWZpbGVcIiA6IFwiU3ViaWRhIGZhbGxpZGEgKHtwYXRofSlcIixcbiAgXCJlcnJvci1kb3dubG9hZC1maWxlXCIgOiBcIkRlc2NhcmdhIGZhbGxpZGEgKHtwYXRofSlcIixcbiAgXCJlcnJvci1kZWxldGluZy1maWxlXCIgOiBcIkVycm9yIGFsIGVsaW1pbmFyIGVsIGFyY2hpdm8ge3BhdGh9XCIsXG4gIFwicmVzdGFydFNlcnZpY2VcIiA6IFwiUmVpbmljaWFyIHNlcnZpY2lvXCIsXG4gIFwidXBsb2FkLWRpc2FibGVkXCI6IFwiU3ViaWRhIGRlc2hhYmlsaXRhZGEgZW4gZXN0ZSBkaXJlY3RvcmlvXCIsXG4gIFwiY2xpY2stdG8tdXBsb2FkXCI6IFwiQ2xpY2sgcGFyYSBzdWJpciB1biBmaWNoZXJvXCIsXG4gIFwidXBsb2FkLWRyb3BcIjogXCJTdWVsdGEgZWwgYXJjaGl2byBwYXJhIGNvbWVuemFyIGxhIHN1YmlkYVwiXG59XG4iXX0= diff --git a/pandora_console/include/ehorus/bundle.min.js b/pandora_console/include/ehorus/bundle.min.js index a86041b652..624b7fb600 100644 --- a/pandora_console/include/ehorus/bundle.min.js +++ b/pandora_console/include/ehorus/bundle.min.js @@ -1 +1 @@ -!function e(t,n,r){function o(a,s){if(!n[a]){if(!t[a]){var l="function"==typeof require&&require;if(!s&&l)return l(a,!0);if(i)return i(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var c=n[a]={exports:{}};t[a][0].call(c.exports,function(e){var n=t[a][1][e];return o(n||e)},c,c.exports,e,t,n,r)}return n[a].exports}for(var i="function"==typeof require&&require,a=0;a>2],t+=n[((3&e[i])<<4)+(e[i+1]>>4)],t+=n[((15&e[i+1])<<2)+(e[i+2]>>6)],t+=n[63&e[i+2]];var a=0;return 2===o?(t+=n[e[a=r-o]>>2],t+=n[((3&e[a])<<4)+(e[a+1]>>4)],t+=n[(15&e[a+1])<<2],t+=n[64]):1===o&&(t+=n[e[a=r-o]>>2],t+=n[(3&e[a])<<4],t+=n[64],t+=n[64]),t},toBinaryTable:[-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,0,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1],decode:function(e,t){t=void 0!==t?t:0;var n,r,o=this.toBinaryTable,i=this.base64Pad,a=0,s=0,l=e.indexOf("=")-t;l<0&&(l=e.length-t),r=3*(l>>2)+Math.floor(l%4/1.5),n=new Array(r);for(var u=0,c=t;c=8&&(a-=8,p||(n[u++]=s>>a&255),s&=(1<>>4^r),r^=o=65535&((n^=o<<4)>>>16^r),r^=(o=858993459&(r>>>2^(n^=o<<16)))<<2,r=(r^=(o=16711935&(r>>>8^(n^=o)))<<8)<<1|r>>>31&1,r^=o=2863311530&((n^=o)^r),n=(n^=o)<<1|n>>>31&1,i=0;i<8;++i)o=r<<28|r>>>4,o^=_[s++],t=m[63&o],t|=d[o>>>8&63],t|=f[o>>>16&63],t|=u[o>>>24&63],o=r^_[s++],t|=y[63&o],t|=h[o>>>8&63],t|=p[o>>>16&63],o=(n^=t|=c[o>>>24&63])<<28|n>>>4,o^=_[s++],t=m[63&o],t|=d[o>>>8&63],t|=f[o>>>16&63],t|=u[o>>>24&63],o=n^_[s++],t|=y[63&o],t|=h[o>>>8&63],t|=p[o>>>16&63],r^=t|=c[o>>>24&63];for(r=r<<31|r>>>1,r^=o=2863311530&(n^r),r^=o=16711935&((n=(n^=o)<<31|n>>>1)>>>8^r),r^=o=858993459&((n^=o<<8)>>>2^r),r^=(o=65535&(r>>>16^(n^=o<<2)))<<16,o=[r^=(o=252645135&(r>>>4^(n^=o)))<<4,n^=o],i=0;i<8;i++)a[i]=(o[i>>>2]>>>8*(3-i%4))%256,a[i]<0&&(a[i]+=256);return a}function n(e){return t(e.slice(0,8)).concat(t(e.slice(8,16)))}var r,o,i,a,s,l,u,c,f,p,d,h,m,y,b=[13,16,10,23,0,4,2,27,14,5,20,9,22,18,11,3,25,7,15,6,26,19,12,1,40,51,30,36,46,54,29,39,50,44,32,47,43,48,38,55,33,52,45,41,49,35,28,31],v=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],_=[];return r=65536,o=1<<24,i=r|o,a=4,s=1024,l=a|s,u=[i|s,0,0|r,i|l,i|a,r|l,0|a,0|r,0|s,i|s,i|l,0|s,o|l,i|a,0|o,0|a,0|l,o|s,o|s,r|s,r|s,0|i,0|i,o|l,r|a,o|a,o|a,r|a,0,0|l,r|l,0|o,0|r,i|l,0|a,0|i,i|s,0|o,0|o,0|s,i|a,0|r,r|s,o|a,0|s,0|a,o|l,r|l,i|l,r|a,0|i,o|l,o|a,0|l,r|l,i|s,0|l,o|s,o|s,0,r|a,r|s,0,i|a],r=1<<20,o=1<<31,i=r|o,a=32,s=32768,l=a|s,c=[i|l,o|s,0|s,r|l,0|r,0|a,i|a,o|l,o|a,i|l,i|s,0|o,o|s,0|r,0|a,i|a,r|s,r|a,o|l,0,0|o,0|s,r|l,0|i,r|a,o|a,0,r|s,0|l,i|s,0|i,0|l,0,r|l,i|a,0|r,o|l,0|i,i|s,0|s,0|i,o|s,0|a,i|l,r|l,0|a,0|s,0|o,0|l,i|s,0|r,o|a,r|a,o|l,o|a,r|a,r|s,0,o|s,0|l,0|o,i|a,i|l,r|s],r=1<<17,o=1<<27,i=r|o,a=8,s=512,l=a|s,f=[0|l,i|s,0,i|a,o|s,0,r|l,o|s,r|a,o|a,o|a,0|r,i|l,r|a,0|i,0|l,0|o,0|a,i|s,0|s,r|s,0|i,i|a,r|l,o|l,r|s,0|r,o|l,0|a,i|l,0|s,0|o,i|s,0|o,r|a,0|l,0|r,i|s,o|s,0,0|s,r|a,i|l,o|s,o|a,0|s,0,i|a,o|l,0|r,0|o,i|l,0|a,r|l,r|s,o|a,0|i,o|l,0|l,0|i,r|l,0|a,i|a,r|s],r=8192,o=1<<23,i=r|o,a=1,s=128,l=a|s,p=[i|a,r|l,r|l,0|s,i|s,o|l,o|a,r|a,0,0|i,0|i,i|l,0|l,0,o|s,o|a,0|a,0|r,0|o,i|a,0|s,0|o,r|a,r|s,o|l,0|a,r|s,o|s,0|r,i|s,i|l,0|l,o|s,o|a,0|i,i|l,0|l,0,0,0|i,r|s,o|s,o|l,0|a,i|a,r|l,r|l,0|s,i|l,0|l,0|a,0|r,o|a,r|a,i|s,o|l,r|a,r|s,0|o,i|a,0|s,0|o,0|r,i|s],r=1<<25,o=1<<30,i=r|o,a=256,s=1<<19,l=a|s,d=[0|a,r|l,r|s,i|a,0|s,0|a,0|o,r|s,o|l,0|s,r|a,o|l,i|a,i|s,0|l,0|o,0|r,o|s,o|s,0,o|a,i|l,i|l,r|a,i|s,o|a,0,0|i,r|l,0|r,0|i,0|l,0|s,i|a,0|a,0|r,0|o,r|s,i|a,o|l,r|a,0|o,i|s,r|l,o|l,0|a,0|r,i|s,i|l,0|l,0|i,i|l,r|s,0,o|s,0|i,0|l,r|a,o|a,0|s,0,o|s,r|l,o|a],r=1<<22,o=1<<29,i=r|o,a=16,s=16384,l=a|s,h=[o|a,0|i,0|s,i|l,0|i,0|a,i|l,0|r,o|s,r|l,0|r,o|a,r|a,o|s,0|o,0|l,0,r|a,o|l,0|s,r|s,o|l,0|a,i|a,i|a,0,r|l,i|s,0|l,r|s,i|s,0|o,o|s,0|a,i|a,r|s,i|l,0|r,0|l,o|a,0|r,o|s,0|o,0|l,o|a,i|l,r|s,0|i,r|l,i|s,0,i|a,0|a,0|s,0|i,r|l,0|s,r|a,o|l,0,i|s,0|o,r|a,o|l],r=1<<21,o=1<<26,i=r|o,a=2,s=2048,l=a|s,m=[0|r,i|a,o|l,0,0|s,o|l,r|l,i|s,i|l,0|r,0,o|a,0|a,0|o,i|a,0|l,o|s,r|l,r|a,o|s,o|a,0|i,i|s,r|a,0|i,0|s,0|l,i|l,r|s,0|a,0|o,r|s,0|o,r|s,0|r,o|l,o|l,i|a,i|a,0|a,r|a,0|o,o|s,0|r,i|s,0|l,r|l,i|s,0|l,o|a,i|l,0|i,r|s,0,0|a,i|l,0,r|l,0|i,0|s,o|a,o|s,0|s,r|a],r=1<<18,o=1<<28,i=r|o,a=64,s=4096,l=a|s,y=[o|l,0|s,0|r,i|l,0|o,o|l,0|a,0|o,r|a,0|i,i|l,r|s,i|s,r|l,0|s,0|a,0|i,o|a,o|s,0|l,r|s,r|a,i|a,i|s,0|l,0,0,i|a,o|a,o|s,r|l,0|r,r|l,0|r,i|s,0|s,0|a,i|a,0|s,r|l,o|s,0|a,o|a,0|i,i|a,0|o,0|r,o|l,0,i|l,r|a,o|a,0|i,o|s,o|l,0,i|l,r|s,r|s,0|l,0|l,r|a,0|o,i|s],function(e){var t,n,r,o,i,a,s,l,u,c,f=[],p=[],d=[];for(n=0,r=56;n<56;++n,r-=8)o=7&(r+=r<-5?65:r<-3?31:r<-1?63:27===r?35:0),f[n]=0!=(e[r>>>3]&1<>>10,_[c]|=(4032&l)>>>6,_[++c]=(258048&s)<<12,_[c]|=(63&s)<<16,_[c]|=(258048&l)>>>4,_[c]|=63&l,++c}(e),{encrypt:n}}Object.defineProperty(n,"__esModule",{value:!0}),n.default=r},{}],3:[function(e,t,n){"use strict";function r(e){if(this._drawCtx=null,this._c_forceCanvas=!1,this._renderQ=[],this._flushing=!1,this._fb_width=0,this._fb_height=0,this._prevDrawStyle="",this._tile=null,this._tile16x16=null,this._tile_x=0,this._tile_y=0,(0,i.set_defaults)(this,e,{true_color:!0,colourMap:[],scale:1,viewport:!1,render_mode:"",onFlush:function(){}}),a.Debug(">> Display.constructor"),!this._target)throw new Error("Target must be set");if("string"==typeof this._target)throw new Error("target must be a DOM element");if(!this._target.getContext)throw new Error("no getContext method");if(this._targetCtx=this._target.getContext("2d"),this._viewportLoc={x:0,y:0,w:this._target.width,h:this._target.height},this._backbuffer=document.createElement("canvas"),this._drawCtx=this._backbuffer.getContext("2d"),this._damageBounds={left:0,top:0,right:this._backbuffer.width,bottom:this._backbuffer.height},a.Debug("User Agent: "+navigator.userAgent),o.Engine.gecko&&a.Debug("Browser: gecko "+o.Engine.gecko),o.Engine.webkit&&a.Debug("Browser: webkit "+o.Engine.webkit),o.Engine.trident&&a.Debug("Browser: trident "+o.Engine.trident),o.Engine.presto&&a.Debug("Browser: presto "+o.Engine.presto),this.clear(),!("createImageData"in this._drawCtx))throw new Error("Canvas does not support createImageData");this._render_mode="canvas rendering",null===this._prefer_js&&(a.Info("Prefering javascript operations"),this._prefer_js=!0),(this._cursor_uri||null===this._cursor_uri||void 0===this._cursor_uri)&&(this._cursor_uri=(0,o.browserSupportsCursorURIs)()),a.Debug("<< Display.constructor")}Object.defineProperty(n,"__esModule",{value:!0}),n.default=r;var o=e("./util/browsers.js"),i=e("./util/properties.js"),a=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(e("./util/logging.js")),s=function(e){return e&&e.__esModule?e:{default:e}}(e("./base64.js")),l=!1;try{new ImageData(new Uint8ClampedArray(4),1,1),l=!0}catch(e){}r.prototype={viewportChangePos:function(e,t){var n=this._viewportLoc;e=Math.floor(e),t=Math.floor(t),this._viewport||(e=-n.w,t=-n.h);var r=n.x+n.w-1,o=n.y+n.h-1;e<0&&n.x+e<0&&(e=-n.x),r+e>=this._fb_width&&(e-=r+e-this._fb_width+1),n.y+t<0&&(t=-n.y),o+t>=this._fb_height&&(t-=o+t-this._fb_height+1),0===e&&0===t||(a.Debug("viewportChange deltaX: "+e+", deltaY: "+t),n.x+=e,n.y+=t,this._damage(n.x,n.y,n.w,n.h),this.flip())},viewportChangeSize:function(e,t){this._viewport&&void 0!==e&&void 0!==t||(a.Debug("Setting viewport to full display region"),e=this._fb_width,t=this._fb_height),e>this._fb_width&&(e=this._fb_width),t>this._fb_height&&(t=this._fb_height);var n=this._viewportLoc;if(n.w!==e||n.h!==t){n.w=e,n.h=t;var r=this._target;r.width=e,r.height=t,this.viewportChangePos(0,0),this._damage(n.x,n.y,n.w,n.h),this.flip(),this._rescale(this._scale)}},absX:function(e){return e/this._scale+this._viewportLoc.x},absY:function(e){return e/this._scale+this._viewportLoc.y},resize:function(e,t){this._prevDrawStyle="",this._fb_width=e,this._fb_height=t;var n=this._backbuffer;if(n.width!==e||n.height!==t){var r=null;n.width>0&&n.height>0&&(r=this._drawCtx.getImageData(0,0,n.width,n.height)),n.width!==e&&(n.width=e),n.height!==t&&(n.height=t),r&&this._drawCtx.putImageData(r,0,0)}var o=this._viewportLoc;this.viewportChangeSize(o.w,o.h),this.viewportChangePos(0,0)},_damage:function(e,t,n,r){ethis._damageBounds.right&&(this._damageBounds.right=e+n),t+r>this._damageBounds.bottom&&(this._damageBounds.bottom=t+r)},flip:function(e){if(0===this._renderQ.length||e){var t,n,r,o,i,a;t=this._damageBounds.left,n=this._damageBounds.top,i=this._damageBounds.right-t,a=this._damageBounds.bottom-n,r=t-this._viewportLoc.x,o=n-this._viewportLoc.y,r<0&&(i+=r,t-=r,r=0),o<0&&(a+=o,n-=o,o=0),r+i>this._viewportLoc.w&&(i=this._viewportLoc.w-r),o+a>this._viewportLoc.h&&(a=this._viewportLoc.h-o),i>0&&a>0&&this._targetCtx.drawImage(this._backbuffer,t,n,i,a,r,o,i,a),this._damageBounds.left=this._damageBounds.top=65535,this._damageBounds.right=this._damageBounds.bottom=0}else this._renderQ_push({type:"flip"})},clear:function(){this._logo?(this.resize(this._logo.width,this._logo.height),this.imageRect(0,0,this._logo.type,this._logo.data)):(this.resize(240,20),this._drawCtx.clearRect(0,0,this._fb_width,this._fb_height)),this.flip()},pending:function(){return this._renderQ.length>0},flush:function(){0===this._renderQ.length?this._onFlush():this._flushing=!0},fillRect:function(e,t,n,r,o,i){0===this._renderQ.length||i?(this._setFillColor(o),this._drawCtx.fillRect(e,t,n,r),this._damage(e,t,n,r)):this._renderQ_push({type:"fill",x:e,y:t,width:n,height:r,color:o})},copyImage:function(e,t,n,r,o,i,a){0===this._renderQ.length||a?(this._drawCtx.mozImageSmoothingEnabled=!1,this._drawCtx.webkitImageSmoothingEnabled=!1,this._drawCtx.msImageSmoothingEnabled=!1,this._drawCtx.imageSmoothingEnabled=!1,this._drawCtx.drawImage(this._backbuffer,e,t,o,i,n,r,o,i),this._damage(n,r,o,i)):this._renderQ_push({type:"copy",old_x:e,old_y:t,x:n,y:r,width:o,height:i})},imageRect:function(e,t,n,r){var o=new Image;o.src="data: "+n+";base64,"+s.default.encode(r),this._renderQ_push({type:"img",img:o,x:e,y:t})},startTile:function(e,t,n,r,o){if(this._tile_x=e,this._tile_y=t,this._tile=16===n&&16===r?this._tile16x16:this._drawCtx.createImageData(n,r),this._prefer_js)for(var i,a=(i=this._true_color?o:this._colourMap[o[0]])[2],s=i[1],l=i[0],u=this._tile.data,c=0;ce.w||this._fb_height>e.h},set_scale:function(e){this._rescale(e)},set_viewport:function(e){this._viewport=e;var t=this._viewportLoc;this.viewportChangeSize(t.w,t.h),this.viewportChangePos(0,0)},get_width:function(){return this._fb_width},get_height:function(){return this._fb_height},autoscale:function(e,t,n){var r,o=this._viewportLoc,i=e/t;(r=o.w/o.h>=i?e/o.w:t/o.h)>1&&n&&(r=1),this._rescale(r)},_rescale:function(e){this._scale=e;var t=this._viewportLoc,n=Math.round(e*t.w)+"px",r=Math.round(e*t.h)+"px";this._target.style.width===n&&this._target.style.height===r||(this._target.style.width=n,this._target.style.height=r)},_setFillColor:function(e){var t,n="rgb("+(t=this._true_color?e:this._colourMap[e])[2]+","+t[1]+","+t[0]+")";n!==this._prevDrawStyle&&(this._drawCtx.fillStyle=n,this._prevDrawStyle=n)},_rgbImageData:function(e,t,n,r,o,i){for(var a=this._drawCtx.createImageData(n,r),s=a.data,l=0,u=i;l0;){var t=this._renderQ[0];switch(t.type){case"flip":this.flip(!0);break;case"copy":this.copyImage(t.old_x,t.old_y,t.x,t.y,t.width,t.height,!0);break;case"fill":this.fillRect(t.x,t.y,t.width,t.height,t.color,!0);break;case"blit":this.blitImage(t.x,t.y,t.width,t.height,t.data,0,!0);break;case"blitRgb":this.blitRgbImage(t.x,t.y,t.width,t.height,t.data,0,!0);break;case"blitRgbx":this.blitRgbxImage(t.x,t.y,t.width,t.height,t.data,0,!0);break;case"img":t.img.complete?this.drawImage(t.img,t.x,t.y):(t.img._noVNC_display=this,t.img.addEventListener("load",this._resume_renderQ),e=!1)}e&&this._renderQ.shift()}0===this._renderQ.length&&this._flushing&&(this._flushing=!1,this._onFlush())}},(0,i.make_properties)(r,[["target","wo","dom"],["context","ro","raw"],["logo","rw","raw"],["true_color","rw","bool"],["colourMap","rw","arr"],["scale","rw","float"],["viewport","rw","bool"],["width","ro","int"],["height","ro","int"],["render_mode","ro","str"],["prefer_js","rw","str"],["cursor_uri","rw","raw"],["onFlush","rw","func"]]),r.changeCursor=function(e,t,n,r,o,i,a,l){var u=i,c=a;c>8&255)},f.push32le=function(e){this.push(255&e,e>>8&255,e>>16&255,e>>24&255)};var p=u*c*4,d=Math.ceil(u*c/8),h=Math.ceil(u*c/8);f.push16le(0),f.push16le(2),f.push16le(1),f.push(u),f.push(c),f.push(0),f.push(0),f.push16le(r),f.push16le(o),f.push32le(40+p+d+h),f.push32le(22),f.push32le(40),f.push32le(u),f.push32le(2*c),f.push16le(1),f.push16le(32),f.push32le(0),f.push32le(d+h),f.push32le(0),f.push32le(0),f.push32le(0),f.push32le(0);var m,y;for(m=c-1;m>=0;m--)for(y=0;y=i||m>=a)f.push(0),f.push(0),f.push(0),f.push(0);else{var b=m*Math.ceil(i/8)+Math.floor(y/8),v=n[b]<this.chunkSize&&(this.chunkSize=n,this.strm.output=new Uint8Array(this.chunkSize)),this.strm.avail_out=this.chunkSize,(0,o.inflate)(this.strm,t),new Uint8Array(this.strm.output.buffer,0,this.strm.next_out)},reset:function(){(0,o.inflateReset)(this.strm)}}},{"pako/lib/zlib/inflate.js":234,"pako/lib/zlib/zstream.js":236}],5:[function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}Object.defineProperty(n,"__esModule",{value:!0}),n.Mouse=n.Keyboard=void 0;var o=r(e("../util/logging.js")),i=e("../util/browsers.js"),a=e("../util/events.js"),s=e("../util/properties.js"),l=r(e("./util.js")),u=function(e){this._keyDownList=[],(0,s.set_defaults)(this,e,{target:document,focused:!0}),this._handler=new l.KeyEventDecoder(l.ModifierSync(),l.VerifyCharModifier(l.TrackKeyState(l.EscapeModifiers(this._handleRfbEvent.bind(this))))),this._eventHandlers={keyup:this._handleKeyUp.bind(this),keydown:this._handleKeyDown.bind(this),keypress:this._handleKeyPress.bind(this),blur:this._allKeysUp.bind(this)}};u.prototype={_handleRfbEvent:function(e){this._onKeyPress&&(o.Debug("onKeyPress "+("keydown"==e.type?"down":"up")+", keysym: "+e.keysym.keysym+"("+e.keysym.keyname+")"),this._onKeyPress(e))},setQEMUVNCKeyboardHandler:function(){this._handler=new l.QEMUKeyEventDecoder(l.ModifierSync(),l.TrackQEMUKeyState(this._handleRfbEvent.bind(this)))},_handleKeyDown:function(e){this._focused&&this._handler.keydown(e)&&(0,a.stopEvent)(e)},_handleKeyPress:function(e){this._focused&&this._handler.keypress(e)&&(0,a.stopEvent)(e)},_handleKeyUp:function(e){this._focused&&this._handler.keyup(e)&&(0,a.stopEvent)(e)},_allKeysUp:function(){o.Debug(">> Keyboard.allKeysUp"),this._handler.releaseAll(),o.Debug("<< Keyboard.allKeysUp")},grab:function(){var e=this._target;e.addEventListener("keydown",this._eventHandlers.keydown),e.addEventListener("keyup",this._eventHandlers.keyup),e.addEventListener("keypress",this._eventHandlers.keypress),window.addEventListener("blur",this._eventHandlers.blur)},ungrab:function(){var e=this._target;e.removeEventListener("keydown",this._eventHandlers.keydown),e.removeEventListener("keyup",this._eventHandlers.keyup),e.removeEventListener("keypress",this._eventHandlers.keypress),window.removeEventListener("blur",this._eventHandlers.blur),this._allKeysUp()},sync:function(e){this._handler.syncModifiers(e)}},(0,s.make_properties)(u,[["target","wo","dom"],["focused","rw","bool"],["onKeyPress","rw","func"]]);var c=function(e){this._mouseCaptured=!1,this._doubleClickTimer=null,this._lastTouchPos=null,(0,s.set_defaults)(this,e,{target:document,focused:!0,touchButton:1}),this._eventHandlers={mousedown:this._handleMouseDown.bind(this),mouseup:this._handleMouseUp.bind(this),mousemove:this._handleMouseMove.bind(this),mousewheel:this._handleMouseWheel.bind(this),mousedisable:this._handleMouseDisable.bind(this)}};c.prototype={_captureMouse:function(){(0,a.setCapture)(this._target),this._mouseCaptured=!0},_releaseMouse:function(){(0,a.releaseCapture)(),this._mouseCaptured=!1},_resetDoubleClickTimer:function(){this._doubleClickTimer=null},_handleMouseButton:function(e,t){if(this._focused){this._notify&&this._notify(e);var n,r=this._getMousePosition(e);if(e.touches||e.changedTouches){if(1==t){if(null===this._doubleClickTimer)this._lastTouchPos=r;else{clearTimeout(this._doubleClickTimer);var i=this._lastTouchPos.x-r.x,s=this._lastTouchPos.y-r.y;Math.sqrt(i*i+s*s)<20*(window.devicePixelRatio||1)&&(r=this._lastTouchPos)}this._doubleClickTimer=setTimeout(this._resetDoubleClickTimer.bind(this),500)}n=this._touchButton}else n=e.which?1<0&&(this._onMouseButton(t.x,t.y,1,64),this._onMouseButton(t.x,t.y,0,64)),e.deltaY<0?(this._onMouseButton(t.x,t.y,1,8),this._onMouseButton(t.x,t.y,0,8)):e.deltaY>0&&(this._onMouseButton(t.x,t.y,1,16),this._onMouseButton(t.x,t.y,0,16))),(0,a.stopEvent)(e)}},_handleMouseMove:function(e){if(this._focused){this._notify&&this._notify(e);var t=this._getMousePosition(e);this._onMouseMove&&this._onMouseMove(t.x,t.y),(0,a.stopEvent)(e)}},_handleMouseDisable:function(e){this._focused&&e.target==this._target&&(0,a.stopEvent)(e)},_getMousePosition:function(e){e=(0,a.getPointerEvent)(e);var t,n,r=this._target.getBoundingClientRect();return t=e.clientX=r.right?r.width-1:e.clientX-r.left,n=e.clientY=r.bottom?r.height-1:e.clientY-r.top,{x:t,y:n}},grab:function(){var e=this._target;i.isTouchDevice&&(e.addEventListener("touchstart",this._eventHandlers.mousedown),window.addEventListener("touchend",this._eventHandlers.mouseup),e.addEventListener("touchend",this._eventHandlers.mouseup),e.addEventListener("touchmove",this._eventHandlers.mousemove)),e.addEventListener("mousedown",this._eventHandlers.mousedown),window.addEventListener("mouseup",this._eventHandlers.mouseup),e.addEventListener("mouseup",this._eventHandlers.mouseup),e.addEventListener("mousemove",this._eventHandlers.mousemove),e.addEventListener("wheel",this._eventHandlers.mousewheel),document.addEventListener("click",this._eventHandlers.mousedisable),e.addEventListener("contextmenu",this._eventHandlers.mousedisable)},ungrab:function(){var e=this._target;i.isTouchDevice&&(e.removeEventListener("touchstart",this._eventHandlers.mousedown),window.removeEventListener("touchend",this._eventHandlers.mouseup),e.removeEventListener("touchend",this._eventHandlers.mouseup),e.removeEventListener("touchmove",this._eventHandlers.mousemove)),e.removeEventListener("mousedown",this._eventHandlers.mousedown),window.removeEventListener("mouseup",this._eventHandlers.mouseup),e.removeEventListener("mouseup",this._eventHandlers.mouseup),e.removeEventListener("mousemove",this._eventHandlers.mousemove),e.removeEventListener("wheel",this._eventHandlers.mousewheel),document.removeEventListener("click",this._eventHandlers.mousedisable),e.removeEventListener("contextmenu",this._eventHandlers.mousedisable)}},(0,s.make_properties)(c,[["target","ro","dom"],["notify","ro","func"],["focused","rw","bool"],["onMouseButton","rw","func"],["onMouseMove","rw","func"],["touchButton","rw","int"]]),n.Keyboard=u,n.Mouse=c},{"../util/browsers.js":11,"../util/events.js":12,"../util/logging.js":14,"../util/properties.js":15,"./util.js":8}],6:[function(e,t,n){"use strict";Object.defineProperty(n,"__esModule",{value:!0}),n.default={XK_VoidSymbol:16777215,XK_BackSpace:65288,XK_Tab:65289,XK_Linefeed:65290,XK_Clear:65291,XK_Return:65293,XK_Pause:65299,XK_Scroll_Lock:65300,XK_Sys_Req:65301,XK_Escape:65307,XK_Delete:65535,XK_Home:65360,XK_Left:65361,XK_Up:65362,XK_Right:65363,XK_Down:65364,XK_Prior:65365,XK_Page_Up:65365,XK_Next:65366,XK_Page_Down:65366,XK_End:65367,XK_Begin:65368,XK_Select:65376,XK_Print:65377,XK_Execute:65378,XK_Insert:65379,XK_Undo:65381,XK_Redo:65382,XK_Menu:65383,XK_Find:65384,XK_Cancel:65385,XK_Help:65386,XK_Break:65387,XK_Mode_switch:65406,XK_script_switch:65406,XK_Num_Lock:65407,XK_KP_Space:65408,XK_KP_Tab:65417,XK_KP_Enter:65421,XK_KP_F1:65425,XK_KP_F2:65426,XK_KP_F3:65427,XK_KP_F4:65428,XK_KP_Home:65429,XK_KP_Left:65430,XK_KP_Up:65431,XK_KP_Right:65432,XK_KP_Down:65433,XK_KP_Prior:65434,XK_KP_Page_Up:65434,XK_KP_Next:65435,XK_KP_Page_Down:65435,XK_KP_End:65436,XK_KP_Begin:65437,XK_KP_Insert:65438,XK_KP_Delete:65439,XK_KP_Equal:65469,XK_KP_Multiply:65450,XK_KP_Add:65451,XK_KP_Separator:65452,XK_KP_Subtract:65453,XK_KP_Decimal:65454,XK_KP_Divide:65455,XK_KP_0:65456,XK_KP_1:65457,XK_KP_2:65458,XK_KP_3:65459,XK_KP_4:65460,XK_KP_5:65461,XK_KP_6:65462,XK_KP_7:65463,XK_KP_8:65464,XK_KP_9:65465,XK_F1:65470,XK_F2:65471,XK_F3:65472,XK_F4:65473,XK_F5:65474,XK_F6:65475,XK_F7:65476,XK_F8:65477,XK_F9:65478,XK_F10:65479,XK_F11:65480,XK_L1:65480,XK_F12:65481,XK_L2:65481,XK_F13:65482,XK_L3:65482,XK_F14:65483,XK_L4:65483,XK_F15:65484,XK_L5:65484,XK_F16:65485,XK_L6:65485,XK_F17:65486,XK_L7:65486,XK_F18:65487,XK_L8:65487,XK_F19:65488,XK_L9:65488,XK_F20:65489,XK_L10:65489,XK_F21:65490,XK_R1:65490,XK_F22:65491,XK_R2:65491,XK_F23:65492,XK_R3:65492,XK_F24:65493,XK_R4:65493,XK_F25:65494,XK_R5:65494,XK_F26:65495,XK_R6:65495,XK_F27:65496,XK_R7:65496,XK_F28:65497,XK_R8:65497,XK_F29:65498,XK_R9:65498,XK_F30:65499,XK_R10:65499,XK_F31:65500,XK_R11:65500,XK_F32:65501,XK_R12:65501,XK_F33:65502,XK_R13:65502,XK_F34:65503,XK_R14:65503,XK_F35:65504,XK_R15:65504,XK_Shift_L:65505,XK_Shift_R:65506,XK_Control_L:65507,XK_Control_R:65508,XK_Caps_Lock:65509,XK_Shift_Lock:65510,XK_Meta_L:65511,XK_Meta_R:65512,XK_Alt_L:65513,XK_Alt_R:65514,XK_Super_L:65515,XK_Super_R:65516,XK_Hyper_L:65517,XK_Hyper_R:65518,XK_ISO_Level3_Shift:65027,XK_space:32,XK_exclam:33,XK_quotedbl:34,XK_numbersign:35,XK_dollar:36,XK_percent:37,XK_ampersand:38,XK_apostrophe:39,XK_quoteright:39,XK_parenleft:40,XK_parenright:41,XK_asterisk:42,XK_plus:43,XK_comma:44,XK_minus:45,XK_period:46,XK_slash:47,XK_0:48,XK_1:49,XK_2:50,XK_3:51,XK_4:52,XK_5:53,XK_6:54,XK_7:55,XK_8:56,XK_9:57,XK_colon:58,XK_semicolon:59,XK_less:60,XK_equal:61,XK_greater:62,XK_question:63,XK_at:64,XK_A:65,XK_B:66,XK_C:67,XK_D:68,XK_E:69,XK_F:70,XK_G:71,XK_H:72,XK_I:73,XK_J:74,XK_K:75,XK_L:76,XK_M:77,XK_N:78,XK_O:79,XK_P:80,XK_Q:81,XK_R:82,XK_S:83,XK_T:84,XK_U:85,XK_V:86,XK_W:87,XK_X:88,XK_Y:89,XK_Z:90,XK_bracketleft:91,XK_backslash:92,XK_bracketright:93,XK_asciicircum:94,XK_underscore:95,XK_grave:96,XK_quoteleft:96,XK_a:97,XK_b:98,XK_c:99,XK_d:100,XK_e:101,XK_f:102,XK_g:103,XK_h:104,XK_i:105,XK_j:106,XK_k:107,XK_l:108,XK_m:109,XK_n:110,XK_o:111,XK_p:112,XK_q:113,XK_r:114,XK_s:115,XK_t:116,XK_u:117,XK_v:118,XK_w:119,XK_x:120,XK_y:121,XK_z:122,XK_braceleft:123,XK_bar:124,XK_braceright:125,XK_asciitilde:126,XK_nobreakspace:160,XK_exclamdown:161,XK_cent:162,XK_sterling:163,XK_currency:164,XK_yen:165,XK_brokenbar:166,XK_section:167,XK_diaeresis:168,XK_copyright:169,XK_ordfeminine:170,XK_guillemotleft:171,XK_notsign:172,XK_hyphen:173,XK_registered:174,XK_macron:175,XK_degree:176,XK_plusminus:177,XK_twosuperior:178,XK_threesuperior:179,XK_acute:180,XK_mu:181,XK_paragraph:182,XK_periodcentered:183,XK_cedilla:184,XK_onesuperior:185,XK_masculine:186,XK_guillemotright:187,XK_onequarter:188,XK_onehalf:189,XK_threequarters:190,XK_questiondown:191,XK_Agrave:192,XK_Aacute:193,XK_Acircumflex:194,XK_Atilde:195,XK_Adiaeresis:196,XK_Aring:197,XK_AE:198,XK_Ccedilla:199,XK_Egrave:200,XK_Eacute:201,XK_Ecircumflex:202,XK_Ediaeresis:203,XK_Igrave:204,XK_Iacute:205,XK_Icircumflex:206,XK_Idiaeresis:207,XK_ETH:208,XK_Eth:208,XK_Ntilde:209,XK_Ograve:210,XK_Oacute:211,XK_Ocircumflex:212,XK_Otilde:213,XK_Odiaeresis:214,XK_multiply:215,XK_Oslash:216,XK_Ooblique:216,XK_Ugrave:217,XK_Uacute:218,XK_Ucircumflex:219,XK_Udiaeresis:220,XK_Yacute:221,XK_THORN:222,XK_Thorn:222,XK_ssharp:223,XK_agrave:224,XK_aacute:225,XK_acircumflex:226,XK_atilde:227,XK_adiaeresis:228,XK_aring:229,XK_ae:230,XK_ccedilla:231,XK_egrave:232,XK_eacute:233,XK_ecircumflex:234,XK_ediaeresis:235,XK_igrave:236,XK_iacute:237,XK_icircumflex:238,XK_idiaeresis:239,XK_eth:240,XK_ntilde:241,XK_ograve:242,XK_oacute:243,XK_ocircumflex:244,XK_otilde:245,XK_odiaeresis:246,XK_division:247,XK_oslash:248,XK_ooblique:248,XK_ugrave:249,XK_uacute:250,XK_ucircumflex:251,XK_udiaeresis:252,XK_yacute:253,XK_thorn:254,XK_ydiaeresis:255}},{}],7:[function(e,t,n){"use strict";function r(e){return e?{keysym:e,keyname:o?o[e]:e}:void 0}Object.defineProperty(n,"__esModule",{value:!0});var o=null,i={32:32,33:33,34:34,35:35,36:36,37:37,38:38,39:39,40:40,41:41,42:42,43:43,44:44,45:45,46:46,47:47,48:48,49:49,50:50,51:51,52:52,53:53,54:54,55:55,56:56,57:57,58:58,59:59,60:60,61:61,62:62,63:63,64:64,65:65,66:66,67:67,68:68,69:69,70:70,71:71,72:72,73:73,74:74,75:75,76:76,77:77,78:78,79:79,80:80,81:81,82:82,83:83,84:84,85:85,86:86,87:87,88:88,89:89,90:90,91:91,92:92,93:93,94:94,95:95,96:96,97:97,98:98,99:99,100:100,101:101,102:102,103:103,104:104,105:105,106:106,107:107,108:108,109:109,110:110,111:111,112:112,113:113,114:114,115:115,116:116,117:117,118:118,119:119,120:120,121:121,122:122,123:123,124:124,125:125,126:126,160:160,161:161,162:162,163:163,164:164,165:165,166:166,167:167,168:168,169:169,170:170,171:171,172:172,173:173,174:174,175:175,176:176,177:177,178:178,179:179,180:180,181:181,182:182,183:183,184:184,185:185,186:186,187:187,188:188,189:189,190:190,191:191,192:192,193:193,194:194,195:195,196:196,197:197,198:198,199:199,200:200,201:201,202:202,203:203,204:204,205:205,206:206,207:207,208:208,209:209,210:210,211:211,212:212,213:213,214:214,215:215,216:216,217:217,218:218,219:219,220:220,221:221,222:222,223:223,224:224,225:225,226:226,227:227,228:228,229:229,230:230,231:231,232:232,233:233,234:234,235:235,236:236,237:237,238:238,239:239,240:240,241:241,242:242,243:243,244:244,245:245,246:246,247:247,248:248,249:249,250:250,251:251,252:252,253:253,254:254,255:255,256:960,257:992,258:451,259:483,260:417,261:433,262:454,263:486,264:710,265:742,266:709,267:741,268:456,269:488,270:463,271:495,272:464,273:496,274:938,275:954,278:972,279:1004,280:458,281:490,282:460,283:492,284:728,285:760,286:683,287:699,288:725,289:757,290:939,291:955,292:678,293:694,294:673,295:689,296:933,297:949,298:975,299:1007,300:16777516,301:16777517,302:967,303:999,304:681,305:697,308:684,309:700,310:979,311:1011,312:930,313:453,314:485,315:934,316:950,317:421,318:437,321:419,322:435,323:465,324:497,325:977,326:1009,327:466,328:498,330:957,331:959,332:978,333:1010,336:469,337:501,338:5052,339:5053,340:448,341:480,342:931,343:947,344:472,345:504,346:422,347:438,348:734,349:766,350:426,351:442,352:425,353:441,354:478,355:510,356:427,357:443,358:940,359:956,360:989,361:1021,362:990,363:1022,364:733,365:765,366:473,367:505,368:475,369:507,370:985,371:1017,372:16777588,373:16777589,374:16777590,375:16777591,376:5054,377:428,378:444,379:431,380:447,381:430,382:446,399:16777615,402:2294,415:16777631,416:16777632,417:16777633,431:16777647,432:16777648,437:16777653,438:16777654,439:16777655,466:16777681,486:16777702,487:16777703,601:16777817,629:16777845,658:16777874,711:439,728:418,729:511,731:434,733:445,901:1966,902:1953,904:1954,905:1955,906:1956,908:1959,910:1960,911:1963,912:1974,913:1985,914:1986,915:1987,916:1988,917:1989,918:1990,919:1991,920:1992,921:1993,922:1994,923:1995,924:1996,925:1997,926:1998,927:1999,928:2e3,929:2001,931:2002,932:2004,933:2005,934:2006,935:2007,936:2008,937:2009,938:1957,939:1961,940:1969,941:1970,942:1971,943:1972,944:1978,945:2017,946:2018,947:2019,948:2020,949:2021,950:2022,951:2023,952:2024,953:2025,954:2026,955:2027,956:2028,957:2029,958:2030,959:2031,960:2032,961:2033,962:2035,963:2034,964:2036,965:2037,966:2038,967:2039,968:2040,969:2041,970:1973,971:1977,972:1975,973:1976,974:1979,1025:1715,1026:1713,1027:1714,1028:1716,1029:1717,1030:1718,1031:1719,1032:1720,1033:1721,1034:1722,1035:1723,1036:1724,1038:1726,1039:1727,1040:1761,1041:1762,1042:1783,1043:1767,1044:1764,1045:1765,1046:1782,1047:1786,1048:1769,1049:1770,1050:1771,1051:1772,1052:1773,1053:1774,1054:1775,1055:1776,1056:1778,1057:1779,1058:1780,1059:1781,1060:1766,1061:1768,1062:1763,1063:1790,1064:1787,1065:1789,1066:1791,1067:1785,1068:1784,1069:1788,1070:1760,1071:1777,1072:1729,1073:1730,1074:1751,1075:1735,1076:1732,1077:1733,1078:1750,1079:1754,1080:1737,1081:1738,1082:1739,1083:1740,1084:1741,1085:1742,1086:1743,1087:1744,1088:1746,1089:1747,1090:1748,1091:1749,1092:1734,1093:1736,1094:1731,1095:1758,1096:1755,1097:1757,1098:1759,1099:1753,1100:1752,1101:1756,1102:1728,1103:1745,1105:1699,1106:1697,1107:1698,1108:1700,1109:1701,1110:1702,1111:1703,1112:1704,1113:1705,1114:1706,1115:1707,1116:1708,1118:1710,1119:1711,1168:1725,1169:1709,1170:16778386,1171:16778387,1174:16778390,1175:16778391,1178:16778394,1179:16778395,1180:16778396,1181:16778397,1186:16778402,1187:16778403,1198:16778414,1199:16778415,1200:16778416,1201:16778417,1202:16778418,1203:16778419,1206:16778422,1207:16778423,1208:16778424,1209:16778425,1210:16778426,1211:16778427,1240:16778456,1241:16778457,1250:16778466,1251:16778467,1256:16778472,1257:16778473,1262:16778478,1263:16778479,1329:16778545,1330:16778546,1331:16778547,1332:16778548,1333:16778549,1334:16778550,1335:16778551,1336:16778552,1337:16778553,1338:16778554,1339:16778555,1340:16778556,1341:16778557,1342:16778558,1343:16778559,1344:16778560,1345:16778561,1346:16778562,1347:16778563,1348:16778564,1349:16778565,1350:16778566,1351:16778567,1352:16778568,1353:16778569,1354:16778570,1355:16778571,1356:16778572,1357:16778573,1358:16778574,1359:16778575,1360:16778576,1361:16778577,1362:16778578,1363:16778579,1364:16778580,1365:16778581,1366:16778582,1370:16778586,1371:16778587,1372:16778588,1373:16778589,1374:16778590,1377:16778593,1378:16778594,1379:16778595,1380:16778596,1381:16778597,1382:16778598,1383:16778599,1384:16778600,1385:16778601,1386:16778602,1387:16778603,1388:16778604,1389:16778605,1390:16778606,1391:16778607,1392:16778608,1393:16778609,1394:16778610,1395:16778611,1396:16778612,1397:16778613,1398:16778614,1399:16778615,1400:16778616,1401:16778617,1402:16778618,1403:16778619,1404:16778620,1405:16778621,1406:16778622,1407:16778623,1408:16778624,1409:16778625,1410:16778626,1411:16778627,1412:16778628,1413:16778629,1414:16778630,1415:16778631,1417:16778633,1418:16778634,1488:3296,1489:3297,1490:3298,1491:3299,1492:3300,1493:3301,1494:3302,1495:3303,1496:3304,1497:3305,1498:3306,1499:3307,1500:3308,1501:3309,1502:3310,1503:3311,1504:3312,1505:3313,1506:3314,1507:3315,1508:3316,1509:3317,1510:3318,1511:3319,1512:3320,1513:3321,1514:3322,1548:1452,1563:1467,1567:1471,1569:1473,1570:1474,1571:1475,1572:1476,1573:1477,1574:1478,1575:1479,1576:1480,1577:1481,1578:1482,1579:1483,1580:1484,1581:1485,1582:1486,1583:1487,1584:1488,1585:1489,1586:1490,1587:1491,1588:1492,1589:1493,1590:1494,1591:1495,1592:1496,1593:1497,1594:1498,1600:1504,1601:1505,1602:1506,1603:1507,1604:1508,1605:1509,1606:1510,1607:1511,1608:1512,1609:1513,1610:1514,1611:1515,1612:1516,1613:1517,1614:1518,1615:1519,1616:1520,1617:1521,1618:1522,1619:16778835,1620:16778836,1621:16778837,1632:16778848,1633:16778849,1634:16778850,1635:16778851,1636:16778852,1637:16778853,1638:16778854,1639:16778855,1640:16778856,1641:16778857,1642:16778858,1648:16778864,1657:16778873,1662:16778878,1670:16778886,1672:16778888,1681:16778897,1688:16778904,1700:16778916,1705:16778921,1711:16778927,1722:16778938,1726:16778942,1729:16778945,1740:16778956,1746:16778962,1748:16778964,1776:16778992,1777:16778993,1778:16778994,1779:16778995,1780:16778996,1781:16778997,1782:16778998,1783:16778999,1784:16779e3,1785:16779001,3458:16780674,3459:16780675,3461:16780677,3462:16780678,3463:16780679,3464:16780680,3465:16780681,3466:16780682,3467:16780683,3468:16780684,3469:16780685,3470:16780686,3471:16780687,3472:16780688,3473:16780689,3474:16780690,3475:16780691,3476:16780692,3477:16780693,3478:16780694,3482:16780698,3483:16780699,3484:16780700,3485:16780701,3486:16780702,3487:16780703,3488:16780704,3489:16780705,3490:16780706,3491:16780707,3492:16780708,3493:16780709,3494:16780710,3495:16780711,3496:16780712,3497:16780713,3498:16780714,3499:16780715,3500:16780716,3501:16780717,3502:16780718,3503:16780719,3504:16780720,3505:16780721,3507:16780723,3508:16780724,3509:16780725,3510:16780726,3511:16780727,3512:16780728,3513:16780729,3514:16780730,3515:16780731,3517:16780733,3520:16780736,3521:16780737,3522:16780738,3523:16780739,3524:16780740,3525:16780741,3526:16780742,3530:16780746,3535:16780751,3536:16780752,3537:16780753,3538:16780754,3539:16780755,3540:16780756,3542:16780758,3544:16780760,3545:16780761,3546:16780762,3547:16780763,3548:16780764,3549:16780765,3550:16780766,3551:16780767,3570:16780786,3571:16780787,3572:16780788,3585:3489,3586:3490,3587:3491,3588:3492,3589:3493,3590:3494,3591:3495,3592:3496,3593:3497,3594:3498,3595:3499,3596:3500,3597:3501,3598:3502,3599:3503,3600:3504,3601:3505,3602:3506,3603:3507,3604:3508,3605:3509,3606:3510,3607:3511,3608:3512,3609:3513,3610:3514,3611:3515,3612:3516,3613:3517,3614:3518,3615:3519,3616:3520,3617:3521,3618:3522,3619:3523,3620:3524,3621:3525,3622:3526,3623:3527,3624:3528,3625:3529,3626:3530,3627:3531,3628:3532,3629:3533,3630:3534,3631:3535,3632:3536,3633:3537,3634:3538,3635:3539,3636:3540,3637:3541,3638:3542,3639:3543,3640:3544,3641:3545,3642:3546,3647:3551,3648:3552,3649:3553,3650:3554,3651:3555,3652:3556,3653:3557,3654:3558,3655:3559,3656:3560,3657:3561,3658:3562,3659:3563,3660:3564,3661:3565,3664:3568,3665:3569,3666:3570,3667:3571,3668:3572,3669:3573,3670:3574,3671:3575,3672:3576,3673:3577,4304:16781520,4305:16781521,4306:16781522,4307:16781523,4308:16781524,4309:16781525,4310:16781526,4311:16781527,4312:16781528,4313:16781529,4314:16781530,4315:16781531,4316:16781532,4317:16781533,4318:16781534,4319:16781535,4320:16781536,4321:16781537,4322:16781538,4323:16781539,4324:16781540,4325:16781541,4326:16781542,4327:16781543,4328:16781544,4329:16781545,4330:16781546,4331:16781547,4332:16781548,4333:16781549,4334:16781550,4335:16781551,4336:16781552,4337:16781553,4338:16781554,4339:16781555,4340:16781556,4341:16781557,4342:16781558,7682:16784898,7683:16784899,7690:16784906,7691:16784907,7710:16784926,7711:16784927,7734:16784950,7735:16784951,7744:16784960,7745:16784961,7766:16784982,7767:16784983,7776:16784992,7777:16784993,7786:16785002,7787:16785003,7808:16785024,7809:16785025,7810:16785026,7811:16785027,7812:16785028,7813:16785029,7818:16785034,7819:16785035,7840:16785056,7841:16785057,7842:16785058,7843:16785059,7844:16785060,7845:16785061,7846:16785062,7847:16785063,7848:16785064,7849:16785065,7850:16785066,7851:16785067,7852:16785068,7853:16785069,7854:16785070,7855:16785071,7856:16785072,7857:16785073,7858:16785074,7859:16785075,7860:16785076,7861:16785077,7862:16785078,7863:16785079,7864:16785080,7865:16785081,7866:16785082,7867:16785083,7868:16785084,7869:16785085,7870:16785086,7871:16785087,7872:16785088,7873:16785089,7874:16785090,7875:16785091,7876:16785092,7877:16785093,7878:16785094,7879:16785095,7880:16785096,7881:16785097,7882:16785098,7883:16785099,7884:16785100,7885:16785101,7886:16785102,7887:16785103,7888:16785104,7889:16785105,7890:16785106,7891:16785107,7892:16785108,7893:16785109,7894:16785110,7895:16785111,7896:16785112,7897:16785113,7898:16785114,7899:16785115,7900:16785116,7901:16785117,7902:16785118,7903:16785119,7904:16785120,7905:16785121,7906:16785122,7907:16785123,7908:16785124,7909:16785125,7910:16785126,7911:16785127,7912:16785128,7913:16785129,7914:16785130,7915:16785131,7916:16785132,7917:16785133,7918:16785134,7919:16785135,7920:16785136,7921:16785137,7922:16785138,7923:16785139,7924:16785140,7925:16785141,7926:16785142,7927:16785143,7928:16785144,7929:16785145,8194:2722,8195:2721,8196:2723,8197:2724,8199:2725,8200:2726,8201:2727,8202:2728,8210:2747,8211:2730,8212:2729,8213:1967,8215:3295,8216:2768,8217:2769,8218:2813,8220:2770,8221:2771,8222:2814,8224:2801,8225:2802,8226:2790,8229:2735,8230:2734,8240:2773,8242:2774,8243:2775,8248:2812,8254:1150,8304:16785520,8308:16785524,8309:16785525,8310:16785526,8311:16785527,8312:16785528,8313:16785529,8320:16785536,8321:16785537,8322:16785538,8323:16785539,8324:16785540,8325:16785541,8326:16785542,8327:16785543,8328:16785544,8329:16785545,8352:16785568,8353:16785569,8354:16785570,8355:16785571,8356:16785572,8357:16785573,8358:16785574,8359:16785575,8360:16785576,8361:3839,8362:16785578,8363:16785579,8364:8364,8453:2744,8470:1712,8471:2811,8478:2772,8482:2761,8531:2736,8532:2737,8533:2738,8534:2739,8535:2740,8536:2741,8537:2742,8538:2743,8539:2755,8540:2756,8541:2757,8542:2758,8592:2299,8593:2300,8594:2301,8595:2302,8658:2254,8660:2253,8706:2287,8709:16785925,8711:2245,8712:16785928,8713:16785929,8715:16785931,8728:3018,8730:2262,8731:16785947,8732:16785948,8733:2241,8734:2242,8743:2270,8744:2271,8745:2268,8746:2269,8747:2239,8748:16785964,8749:16785965,8756:2240,8757:16785973,8764:2248,8771:2249,8773:16785992,8775:16785991,8800:2237,8801:2255,8802:16786018,8803:16786019,8804:2236,8805:2238,8834:2266,8835:2267,8866:3068,8867:3036,8868:3010,8869:3022,8968:3027,8970:3012,8981:2810,8992:2212,8993:2213,9109:3020,9115:2219,9117:2220,9118:2221,9120:2222,9121:2215,9123:2216,9124:2217,9126:2218,9128:2223,9132:2224,9143:2209,9146:2543,9147:2544,9148:2546,9149:2547,9225:2530,9226:2533,9227:2537,9228:2531,9229:2532,9251:2732,9252:2536,9472:2211,9474:2214,9484:2210,9488:2539,9492:2541,9496:2538,9500:2548,9508:2549,9516:2551,9524:2550,9532:2542,9618:2529,9642:2791,9643:2785,9644:2779,9645:2786,9646:2783,9647:2767,9650:2792,9651:2787,9654:2781,9655:2765,9660:2793,9661:2788,9664:2780,9665:2764,9670:2528,9675:2766,9679:2782,9702:2784,9734:2789,9742:2809,9747:2762,9756:2794,9758:2795,9792:2808,9794:2807,9827:2796,9829:2798,9830:2797,9837:2806,9839:2805,10003:2803,10007:2804,10013:2777,10016:2800,10216:2748,10217:2750,10240:16787456,10241:16787457,10242:16787458,10243:16787459,10244:16787460,10245:16787461,10246:16787462,10247:16787463,10248:16787464,10249:16787465,10250:16787466,10251:16787467,10252:16787468,10253:16787469,10254:16787470,10255:16787471,10256:16787472,10257:16787473,10258:16787474,10259:16787475,10260:16787476,10261:16787477,10262:16787478,10263:16787479,10264:16787480,10265:16787481,10266:16787482,10267:16787483,10268:16787484,10269:16787485,10270:16787486,10271:16787487,10272:16787488,10273:16787489,10274:16787490,10275:16787491,10276:16787492,10277:16787493,10278:16787494,10279:16787495,10280:16787496,10281:16787497,10282:16787498,10283:16787499,10284:16787500,10285:16787501,10286:16787502,10287:16787503,10288:16787504,10289:16787505,10290:16787506,10291:16787507,10292:16787508,10293:16787509,10294:16787510,10295:16787511,10296:16787512,10297:16787513,10298:16787514,10299:16787515,10300:16787516,10301:16787517,10302:16787518,10303:16787519,10304:16787520,10305:16787521,10306:16787522,10307:16787523,10308:16787524,10309:16787525,10310:16787526,10311:16787527,10312:16787528,10313:16787529,10314:16787530,10315:16787531,10316:16787532,10317:16787533,10318:16787534,10319:16787535,10320:16787536,10321:16787537,10322:16787538,10323:16787539,10324:16787540,10325:16787541,10326:16787542,10327:16787543,10328:16787544,10329:16787545,10330:16787546,10331:16787547,10332:16787548,10333:16787549,10334:16787550,10335:16787551,10336:16787552,10337:16787553,10338:16787554,10339:16787555,10340:16787556,10341:16787557,10342:16787558,10343:16787559,10344:16787560,10345:16787561,10346:16787562,10347:16787563,10348:16787564,10349:16787565,10350:16787566,10351:16787567,10352:16787568,10353:16787569,10354:16787570,10355:16787571,10356:16787572,10357:16787573,10358:16787574,10359:16787575,10360:16787576,10361:16787577,10362:16787578,10363:16787579,10364:16787580,10365:16787581,10366:16787582,10367:16787583,10368:16787584,10369:16787585,10370:16787586,10371:16787587,10372:16787588,10373:16787589,10374:16787590,10375:16787591,10376:16787592,10377:16787593,10378:16787594,10379:16787595,10380:16787596,10381:16787597,10382:16787598,10383:16787599,10384:16787600,10385:16787601,10386:16787602,10387:16787603,10388:16787604,10389:16787605,10390:16787606,10391:16787607,10392:16787608,10393:16787609,10394:16787610,10395:16787611,10396:16787612,10397:16787613,10398:16787614,10399:16787615,10400:16787616,10401:16787617,10402:16787618,10403:16787619,10404:16787620,10405:16787621,10406:16787622,10407:16787623,10408:16787624,10409:16787625,10410:16787626,10411:16787627,10412:16787628,10413:16787629,10414:16787630,10415:16787631,10416:16787632,10417:16787633,10418:16787634,10419:16787635,10420:16787636,10421:16787637,10422:16787638,10423:16787639,10424:16787640,10425:16787641,10426:16787642,10427:16787643,10428:16787644,10429:16787645,10430:16787646,10431:16787647,10432:16787648,10433:16787649,10434:16787650,10435:16787651,10436:16787652,10437:16787653,10438:16787654,10439:16787655,10440:16787656,10441:16787657,10442:16787658,10443:16787659,10444:16787660,10445:16787661,10446:16787662,10447:16787663,10448:16787664,10449:16787665,10450:16787666,10451:16787667,10452:16787668,10453:16787669,10454:16787670,10455:16787671,10456:16787672,10457:16787673,10458:16787674,10459:16787675,10460:16787676,10461:16787677,10462:16787678,10463:16787679,10464:16787680,10465:16787681,10466:16787682,10467:16787683,10468:16787684,10469:16787685,10470:16787686,10471:16787687,10472:16787688,10473:16787689,10474:16787690,10475:16787691,10476:16787692,10477:16787693,10478:16787694,10479:16787695,10480:16787696,10481:16787697,10482:16787698,10483:16787699,10484:16787700,10485:16787701,10486:16787702,10487:16787703,10488:16787704,10489:16787705,10490:16787706,10491:16787707,10492:16787708,10493:16787709,10494:16787710,10495:16787711,12289:1188,12290:1185,12300:1186,12301:1187,12443:1246,12444:1247,12449:1191,12450:1201,12451:1192,12452:1202,12453:1193,12454:1203,12455:1194,12456:1204,12457:1195,12458:1205,12459:1206,12461:1207,12463:1208,12465:1209,12467:1210,12469:1211,12471:1212,12473:1213,12475:1214,12477:1215,12479:1216,12481:1217,12483:1199,12484:1218,12486:1219,12488:1220,12490:1221,12491:1222,12492:1223,12493:1224,12494:1225,12495:1226,12498:1227,12501:1228,12504:1229,12507:1230,12510:1231,12511:1232,12512:1233,12513:1234,12514:1235,12515:1196,12516:1236,12517:1197,12518:1237,12519:1198,12520:1238,12521:1239,12522:1240,12523:1241,12524:1242,12525:1243,12527:1244,12530:1190,12531:1245,12539:1189,12540:1200};n.default={fromUnicode:function(e){var t=i[e];return void 0===t&&(t=16777216|e),r(t)},lookup:r}},{}],8:[function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){var t={536:350,537:351,538:354,539:355}[e];return t||e}function i(){return navigator&&!!/mac/i.exec(navigator.platform)}function a(){return navigator&&!!/win/i.exec(navigator.platform)}function s(){return navigator&&!!/linux/i.exec(navigator.platform)}function l(e,t){var n={};for(var r in t)parseInt(r)!==C.default.XK_Shift_L&&(n[r]=t[r]);var o=0;for(var i in t)n[i]&&++o;return u(e,n)?o>e.length:o>0}function u(e,t){if(0===e.length)return!1;for(var n=0;n=48&&e<=57)return e;if(e>=65&&e<=90)return t?e:e+32;if(e>=96&&e<=105)return C.default.XK_KP_0+(e-96);switch(e){case 32:return C.default.XK_space;case 106:return C.default.XK_KP_Multiply;case 107:return C.default.XK_KP_Add;case 108:return C.default.XK_KP_Separator;case 109:return C.default.XK_KP_Subtract;case 110:return C.default.XK_KP_Decimal;case 111:return C.default.XK_KP_Divide;case 187:return C.default.XK_plus;case 188:return C.default.XK_comma;case 189:return C.default.XK_minus;case 190:return C.default.XK_period}return h({keyCode:e})}function h(e){if(!e.keyCode)return null;var t=e.keyCode;if(t>=112&&t<=135)return C.default.XK_F1+t-112;switch(t){case 8:return C.default.XK_BackSpace;case 13:return C.default.XK_Return;case 9:return C.default.XK_Tab;case 27:return C.default.XK_Escape;case 46:return C.default.XK_Delete;case 36:return C.default.XK_Home;case 35:return C.default.XK_End;case 33:return C.default.XK_Page_Up;case 34:return C.default.XK_Page_Down;case 45:return C.default.XK_Insert;case 37:return C.default.XK_Left;case 38:return C.default.XK_Up;case 39:return C.default.XK_Right;case 40:return C.default.XK_Down;case 16:return C.default.XK_Shift_L;case 17:return C.default.XK_Control_L;case 18:return C.default.XK_Alt_L;case 224:return C.default.XK_Meta_L;case 225:return C.default.XK_ISO_Level3_Shift;case 91:return C.default.XK_Super_L;case 92:return C.default.XK_Super_R;case 93:return C.default.XK_Menu;default:return null}}function m(e,t){function n(e){for(var n=0;n0&&"ControlLeft"==t[t.length-1].code&&("AltRight"!==n.code?e({code:"ControlLeft",type:"keydown",keysym:0}):t.pop()),t.push(r)),"ControlLeft"!==n.code&&e(n);break;case"keyup":if(0===t.length)return;for(var o=null,i=0;i!==t.length;++i)if(t[i].code===n.code){o=i;break}if(null===o){if("ControlLeft"===n.code)return;o=t.length-1}t.splice(o,1),e(n);break;case"releaseall":for(i=0;i> RFB.constructor"),Object.keys(o.encodingHandlers).forEach(function(e){this._encHandlers[e]=o.encodingHandlers[e].bind(this)}.bind(this));for(var t=0;t> RFB.connect"),this._init_vars();var e;e="undefined"!=typeof UsingSocketIO?"http":this._encrypt?"wss":"ws",e+="://"+this._rfb_host+":"+this._rfb_port+"/"+this._rfb_path,i.Info("connecting to "+e);try{this._sock.open(e,this._wsProtocols)}catch(e){"SyntaxError"===e.name?this._fail("Invalid host or port value given",e):this._fail("Error while connecting",e)}i.Debug("<< RFB.connect")},_disconnect:function(){i.Debug(">> RFB.disconnect"),this._cleanup(),this._sock.close(),this._print_stats(),i.Debug("<< RFB.disconnect")},_init_vars:function(){this._FBU.rects=0,this._FBU.subrects=0,this._FBU.lines=0,this._FBU.tiles=0,this._FBU.zlibs=[],this._mouse_buttonMask=0,this._mouse_arr=[],this._rfb_tightvnc=!1;var e;for(e=0;e0&&i.Info(" "+this._encodings[e][0]+": "+t[0]+" rects");for(i.Info("Encoding stats since page load:"),e=0;ei||Math.abs(r)>i)&&(this._viewportHasMoved=!0,this._viewportDragPos={x:e,y:t},this._display.viewportChangePos(n,r)))}this._view_only||"connected"===this._rfb_connection_state&&o.messages.pointerEvent(this._sock,this._display.absX(e),this._display.absY(t),this._mouse_buttonMask)},_negotiate_protocol_version:function(){if(this._sock.rQlen()<12)return this._fail("Error while negotiating with server","Incomplete protocol version");var e=this._sock.rQshiftStr(12).substr(4,7);i.Info("Server ProtocolVersion: "+e);var t=0;switch(e){case"000.000":t=1;break;case"003.003":case"003.006":case"003.889":this._rfb_version=3.3;break;case"003.007":this._rfb_version=3.7;break;case"003.008":case"004.000":case"004.001":case"005.000":this._rfb_version=3.8;break;default:return this._fail("Unsupported server","Invalid server version: "+e)}if(t){for(var n=this._repeaterID;n.length<250;)n+="\0";return this._sock.send_string(n),!0}this._rfb_version>this._rfb_max_version&&(this._rfb_version=this._rfb_max_version);var r="00"+parseInt(this._rfb_version,10)+".00"+10*this._rfb_version%10;this._sock.send_string("RFB "+r+"\n"),i.Debug("Sent ProtocolVersion: "+r),this._rfb_init_state="Security"},_negotiate_security:function(){function e(e,t){for(var n=0;n=3.7){var t=this._sock.rQshift8();if(this._sock.rQwait("security type",t,1))return!1;if(0===t){var n=this._sock.rQshift32(),r=this._sock.rQshiftStr(n);return this._fail("Error while negotiating with server","Security failure: "+r)}var o=this._sock.rQshiftBytes(t);if(i.Debug("Server security types: "+o),this._rfb_auth_scheme=0,e(1,o))this._rfb_auth_scheme=1;else if(e(22,o))this._rfb_auth_scheme=22;else if(e(16,o))this._rfb_auth_scheme=16;else{if(!e(2,o))return this._fail("Unsupported server","Unsupported security types: "+o);this._rfb_auth_scheme=2}this._sock.send([this._rfb_auth_scheme])}else{if(this._sock.rQwait("security scheme",4))return!1;this._rfb_auth_scheme=this._sock.rQshift32()}return this._rfb_init_state="Authentication",i.Debug("Authenticating using scheme: "+this._rfb_auth_scheme),this._init_msg()},_negotiate_xvp_auth:function(){var e=this._xvp_password_sep,t=this._rfb_password.split(e);if(t.length<3){var n="XVP credentials required (user"+e+"target"+e+"password) -- got only "+this._rfb_password;return this._onPasswordRequired(this,n),!1}var r=String.fromCharCode(t[0].length)+String.fromCharCode(t[1].length)+t[0]+t[1];return this._sock.send_string(r),this._rfb_password=t.slice(2).join(e),this._rfb_auth_scheme=2,this._negotiate_authentication()},_negotiate_std_vnc_auth:function(){if(0===this._rfb_password.length)return this._onPasswordRequired(this),!1;if(this._sock.rQwait("auth challenge",16))return!1;var e=Array.prototype.slice.call(this._sock.rQshiftBytes(16)),t=o.genDES(this._rfb_password,e);return this._sock.send(t),this._rfb_init_state="SecurityResult",!0},_negotiate_tight_tunnels:function(e){for(var t={0:{vendor:"TGHT",signature:"NOTUNNEL"}},n={},r=0;r0&&this._sock.rQwait("tunnel capabilities",16*e,4))return!1;if(this._rfb_tightvnc=!0,e>0)return this._negotiate_tight_tunnels(e),!1}if(this._sock.rQwait("sub auth count",4))return!1;var t=this._sock.rQshift32();if(0===t)return this._rfb_init_state="SecurityResult",!0;if(this._sock.rQwait("sub auth capabilities",16*t,4))return!1;for(var n={STDVNOAUTH__:1,STDVVNCAUTH_:2},r=[],o=0;o=3.8?(this._rfb_init_state="SecurityResult",!0):(this._rfb_init_state="ClientInitialisation",this._init_msg());case 22:return this._negotiate_xvp_auth();case 2:return this._negotiate_std_vnc_auth();case 16:return this._negotiate_tight_auth();default:return this._fail("Unsupported server","Unsupported auth scheme: "+this._rfb_auth_scheme)}},_handle_security_result:function(){if(this._sock.rQwait("VNC auth response ",4))return!1;switch(this._sock.rQshift32()){case 0:return this._rfb_init_state="ClientInitialisation",i.Debug("Authentication OK"),this._init_msg();case 1:if(this._rfb_version>=3.8){var e=this._sock.rQshift32();if(this._sock.rQwait("SecurityResult reason",e,8))return!1;var t=this._sock.rQshiftStr(e);return this._fail("Authentication failure",t)}return this._fail("Authentication failure");case 2:return this._fail("Too many authentication attempts");default:return this._fail("Unsupported server","Unknown SecurityResult")}},_negotiate_server_init:function(){if(this._sock.rQwait("server initialization",24))return!1;this._fb_width=this._sock.rQshift16(),this._fb_height=this._sock.rQshift16(),this._destBuff=new Uint8Array(this._fb_width*this._fb_height*4);var e=this._sock.rQshift8(),t=this._sock.rQshift8(),n=this._sock.rQshift8(),r=this._sock.rQshift8(),a=this._sock.rQshift16(),l=this._sock.rQshift16(),u=this._sock.rQshift16(),c=this._sock.rQshift8(),f=this._sock.rQshift8(),p=this._sock.rQshift8();this._sock.rQskipBytes(3);var d=this._sock.rQshift32();if(this._sock.rQwait("server init name",d,24))return!1;if(this._fb_name=(0,s.decodeUTF8)(this._sock.rQshiftStr(d)),this._rfb_tightvnc){if(this._sock.rQwait("TightVNC extended server init header",8,24+d))return!1;var h=this._sock.rQshift16(),m=this._sock.rQshift16(),y=this._sock.rQshift16();this._sock.rQskipBytes(2);var b=16*(h+m+y);if(this._sock.rQwait("TightVNC extended server init header",b,32+d))return!1;this._sock.rQskipBytes(16*h),this._sock.rQskipBytes(16*m),this._sock.rQskipBytes(16*y)}return i.Info("Screen: "+this._fb_width+"x"+this._fb_height+", bpp: "+e+", depth: "+t+", big_endian: "+n+", true_color: "+r+", red_max: "+a+", green_max: "+l+", blue_max: "+u+", red_shift: "+c+", green_shift: "+f+", blue_shift: "+p),0!==n&&i.Warn("Server native endian is not little endian"),16!==c&&i.Warn("Server native red-shift is not 16"),0!==p&&i.Warn("Server native blue-shift is not 0"),this._onDesktopName(this,this._fb_name),this._true_color&&"Intel(r) AMT KVM"===this._fb_name&&(i.Warn("Intel AMT KVM only supports 8/16 bit depths. Disabling true color"),this._true_color=!1),this._display.set_true_color(this._true_color),this._display.resize(this._fb_width,this._fb_height),this._onFBResize(this,this._fb_width,this._fb_height),this._view_only||this._keyboard.grab(),this._view_only||this._mouse.grab(),this._true_color?(this._fb_Bpp=4,this._fb_depth=3):(this._fb_Bpp=1,this._fb_depth=1),o.messages.pixelFormat(this._sock,this._fb_Bpp,this._fb_depth,this._true_color),o.messages.clientEncodings(this._sock,this._encodings,this._local_cursor,this._true_color),o.messages.fbUpdateRequest(this._sock,!1,0,0,this._fb_width,this._fb_height),this._timing.fbu_rt_start=(new Date).getTime(),this._timing.pixels=0,this._updateConnectionState("connected"),!0},_init_msg:function(){switch(this._rfb_init_state){case"ProtocolVersion":return this._negotiate_protocol_version();case"Security":return this._negotiate_security();case"Authentication":return this._negotiate_authentication();case"SecurityResult":return this._handle_security_result();case"ClientInitialisation":return this._sock.send([this._shared?1:0]),this._rfb_init_state="ServerInitialisation",!0;case"ServerInitialisation":return this._negotiate_server_init();default:return this._fail("Internal error","Unknown init state: "+this._rfb_init_state)}},_handle_set_colour_map_msg:function(){i.Debug("SetColorMapEntries"),this._sock.rQskip8();var e=this._sock.rQshift16(),t=this._sock.rQshift16();if(this._sock.rQwait("SetColorMapEntries",6*t,6))return!1;for(var n=0;n64&&(i.Warn("Bad payload length ("+t+") in fence response"),t=64);var n=this._sock.rQshiftStr(t);return this._supportsFence=!0,e&1<<31?(e&=3,o.messages.clientFence(this._sock,e,n),!0):this._fail("Internal error","Unexpected fence response")},_handle_xvp_msg:function(){if(this._sock.rQwait("XVP version and message",3,1))return!1;this._sock.rQskip8();var e=this._sock.rQshift8(),t=this._sock.rQshift8();switch(t){case 0:i.Error("Operation Failed"),this._notification("XVP Operation Failed","error");break;case 1:this._rfb_xvp_ver=e,i.Info("XVP extensions enabled (version "+this._rfb_xvp_ver+")"),this._onXvpInit(this._rfb_xvp_ver);break;default:this._fail("Unexpected server message","Illegal server XVP message "+t)}return!0},_normal_msg:function(){var e;switch(e=this._FBU.rects>0?0:this._sock.rQshift8()){case 0:var t=this._framebufferUpdate();return t&&!this._enabledContinuousUpdates&&o.messages.fbUpdateRequest(this._sock,!0,0,0,this._fb_width,this._fb_height),t;case 1:return this._handle_set_colour_map_msg();case 2:return i.Debug("Bell"),this._onBell(this),!0;case 3:return this._handle_server_cut_text();case 150:var n=!this._supportsContinuousUpdates;return this._supportsContinuousUpdates=!0,this._enabledContinuousUpdates=!1,n&&(this._enabledContinuousUpdates=!0,this._updateContinuousUpdates(),i.Info("Enabling continuous updates.")),!0;case 248:return this._handle_server_fence_msg();case 250:return this._handle_xvp_msg();default:return this._fail("Unexpected server message","Type:"+e),i.Debug("sock.rQslice(0, 30): "+this._sock.rQslice(0,30)),!0}},_onFlush:function(){this._flushing=!1,this._sock.rQlen()>0&&this._handle_message()},_framebufferUpdate:function(){var e,t=!0;if(0===this._FBU.rects){if(this._sock.rQwait("FBU header",3,1))return!1;if(this._sock.rQskip8(),this._FBU.rects=this._sock.rQshift16(),this._FBU.bytes=0,this._timing.cur_fbu=0,this._timing.fbu_rt_start>0&&(e=(new Date).getTime(),i.Info("First FBU latency: "+(e-this._timing.fbu_rt_start))),this._display.pending())return this._flushing=!0,this._display.flush(),!1}for(;this._FBU.rects>0;){if("connected"!==this._rfb_connection_state)return!1;if(this._sock.rQwait("FBU",this._FBU.bytes))return!1;if(0===this._FBU.bytes){if(this._sock.rQwait("rect header",12))return!1;var n=this._sock.rQshiftBytes(12);if(this._FBU.x=(n[0]<<8)+n[1],this._FBU.y=(n[2]<<8)+n[3],this._FBU.width=(n[4]<<8)+n[5],this._FBU.height=(n[6]<<8)+n[7],this._FBU.encoding=parseInt((n[8]<<24)+(n[9]<<16)+(n[10]<<8)+n[11],10),this._onFBUReceive(this,{x:this._FBU.x,y:this._FBU.y,width:this._FBU.width,height:this._FBU.height,encoding:this._FBU.encoding,encodingName:this._encNames[this._FBU.encoding]}),!this._encNames[this._FBU.encoding])return this._fail("Unexpected server message","Unsupported encoding "+this._FBU.encoding),!1}if(this._timing.last_fbu=(new Date).getTime(),t=this._encHandlers[this._FBU.encoding](),e=(new Date).getTime(),this._timing.cur_fbu+=e-this._timing.last_fbu,t&&(this._encStats[this._FBU.encoding][0]++,this._encStats[this._FBU.encoding][1]++,this._timing.pixels+=this._FBU.width*this._FBU.height),this._timing.pixels>=this._fb_width*this._fb_height&&((this._FBU.width===this._fb_width&&this._FBU.height===this._fb_height||this._timing.fbu_rt_start>0)&&(this._timing.full_fbu_total+=this._timing.cur_fbu,this._timing.full_fbu_cnt++,i.Info("Timing of full FBU, curr: "+this._timing.cur_fbu+", total: "+this._timing.full_fbu_total+", cnt: "+this._timing.full_fbu_cnt+", avg: "+this._timing.full_fbu_total/this._timing.full_fbu_cnt)),this._timing.fbu_rt_start>0)){var r=e-this._timing.fbu_rt_start;this._timing.fbu_rt_total+=r,this._timing.fbu_rt_cnt++,i.Info("full FBU round-trip, cur: "+r+", total: "+this._timing.fbu_rt_total+", cnt: "+this._timing.fbu_rt_cnt+", avg: "+this._timing.fbu_rt_total/this._timing.fbu_rt_cnt),this._timing.fbu_rt_start=0}if(!t)return t}return this._display.flip(),this._onFBUComplete(this,{x:this._FBU.x,y:this._FBU.y,width:this._FBU.width,height:this._FBU.height,encoding:this._FBU.encoding,encodingName:this._encNames[this._FBU.encoding]}),!0},_updateContinuousUpdates:function(){this._enabledContinuousUpdates&&o.messages.enableContinuousUpdates(this._sock,!0,0,0,this._fb_width,this._fb_height)}},(0,l.make_properties)(o,[["target","wo","dom"],["focusContainer","wo","dom"],["encrypt","rw","bool"],["true_color","rw","bool"],["local_cursor","rw","bool"],["shared","rw","bool"],["view_only","rw","bool"],["xvp_password_sep","rw","str"],["disconnectTimeout","rw","int"],["wsProtocols","rw","arr"],["repeaterID","rw","str"],["viewportDrag","rw","bool"],["onUpdateState","rw","func"],["onNotification","rw","func"],["onDisconnected","rw","func"],["onPasswordRequired","rw","func"],["onClipboard","rw","func"],["onBell","rw","func"],["onFBUReceive","rw","func"],["onFBUComplete","rw","func"],["onFBResize","rw","func"],["onDesktopName","rw","func"],["onXvpInit","rw","func"]]),o.prototype.set_local_cursor=function(e){!e||e in{0:1,no:1,false:1}?(this._local_cursor=!1,this._display.disableLocalCursor()):this._display.get_cursor_uri()?this._local_cursor=!0:(i.Warn("Browser does not support local cursor"),this._display.disableLocalCursor()),"connected"===this._rfb_connection_state&&o.messages.clientEncodings(this._sock,this._encodings,e,this._true_color)},o.prototype.set_view_only=function(e){this._view_only=e,"connecting"!==this._rfb_connection_state&&"connected"!==this._rfb_connection_state||(e?(this._keyboard.ungrab(),this._mouse.ungrab()):(this._keyboard.grab(),this._mouse.grab()))},o.prototype.get_display=function(){return this._display},o.prototype.get_keyboard=function(){return this._keyboard},o.prototype.get_mouse=function(){return this._mouse},o.messages={keyEvent:function(e,t,n){var r=e._sQ,o=e._sQlen;r[o]=4,r[o+1]=n,r[o+2]=0,r[o+3]=0,r[o+4]=t>>24,r[o+5]=t>>16,r[o+6]=t>>8,r[o+7]=t,e._sQlen+=8,e.flush()},QEMUExtendedKeyEvent:function(e,t,n,r){var o=e._sQ,i=e._sQlen;o[i]=255,o[i+1]=0,o[i+2]=n>>8,o[i+3]=n,o[i+4]=t>>24,o[i+5]=t>>16,o[i+6]=t>>8,o[i+7]=t;var a=function(e){var t=255&r;return 224===r>>8&&t<127?t|=128:e}(r);o[i+8]=a>>24,o[i+9]=a>>16,o[i+10]=a>>8,o[i+11]=a,e._sQlen+=12,e.flush()},pointerEvent:function(e,t,n,r){var o=e._sQ,i=e._sQlen;o[i]=5,o[i+1]=r,o[i+2]=t>>8,o[i+3]=t,o[i+4]=n>>8,o[i+5]=n,e._sQlen+=6,e.flush()},clientCutText:function(e,t){var n=e._sQ,r=e._sQlen;n[r]=6,n[r+1]=0,n[r+2]=0,n[r+3]=0;var o=t.length;n[r+4]=o>>24,n[r+5]=o>>16,n[r+6]=o>>8,n[r+7]=o;for(var i=0;i>8,i[a+3]=t,i[a+4]=n>>8,i[a+5]=n,i[a+6]=1,i[a+7]=0,i[a+8]=r>>24,i[a+9]=r>>16,i[a+10]=r>>8,i[a+11]=r,i[a+12]=0,i[a+13]=0,i[a+14]=0,i[a+15]=0,i[a+16]=t>>8,i[a+17]=t,i[a+18]=n>>8,i[a+19]=n,i[a+20]=o>>24,i[a+21]=o>>16,i[a+22]=o>>8,i[a+23]=o,e._sQlen+=24,e.flush()},clientFence:function(e,t,n){var r=e._sQ,o=e._sQlen;r[o]=248,r[o+1]=0,r[o+2]=0,r[o+3]=0,r[o+4]=t>>24,r[o+5]=t>>16,r[o+6]=t>>8,r[o+7]=t;var i=n.length;r[o+8]=i;for(var a=0;a>8,a[s+3]=n,a[s+4]=r>>8,a[s+5]=r,a[s+6]=o>>8,a[s+7]=o,a[s+8]=i>>8,a[s+9]=i,e._sQlen+=10,e.flush()},pixelFormat:function(e,t,n,r){var o=e._sQ,i=e._sQlen;o[i]=0,o[i+1]=0,o[i+2]=0,o[i+3]=0,o[i+4]=8*t,o[i+5]=8*n,o[i+6]=0,o[i+7]=r?1:0,o[i+8]=0,o[i+9]=255,o[i+10]=0,o[i+11]=255,o[i+12]=0,o[i+13]=255,o[i+14]=16,o[i+15]=8,o[i+16]=0,o[i+17]=0,o[i+18]=0,o[i+19]=0,e._sQlen+=20,e.flush()},clientEncodings:function(e,t,n,r){var o=e._sQ,a=e._sQlen;o[a]=2,o[a+1]=0;var s,l=a+4,u=0;for(s=0;s>24,o[l+1]=c>>16,o[l+2]=c>>8,o[l+3]=c,l+=4,u++}else i.Warn("Skipping tight as it is only supported with true color");else i.Debug("Skipping Cursor pseudo-encoding");o[a+2]=u>>8,o[a+3]=u,e._sQlen+=l-a,e.flush()},fbUpdateRequest:function(e,t,n,r,o,i){var a=e._sQ,s=e._sQlen;void 0===n&&(n=0),void 0===r&&(r=0),a[s]=3,a[s+1]=t?1:0,a[s+2]=n>>8&255,a[s+3]=255&n,a[s+4]=r>>8&255,a[s+5]=255&r,a[s+6]=o>>8&255,a[s+7]=255&o,a[s+8]=i>>8&255,a[s+9]=255&i,e._sQlen+=10,e.flush()}},o.genDES=function(e,t){for(var n=[],r=0;r0?this._FBU.bytes=this._FBU.width*this._fb_Bpp:(this._FBU.rects--,this._FBU.bytes=0),!0},COPYRECT:function(){return this._FBU.bytes=4,!this._sock.rQwait("COPYRECT",4)&&(this._display.copyImage(this._sock.rQshift16(),this._sock.rQshift16(),this._FBU.x,this._FBU.y,this._FBU.width,this._FBU.height),this._FBU.rects--,this._FBU.bytes=0,!0)},RRE:function(){var e;if(0===this._FBU.subrects){if(this._FBU.bytes=4+this._fb_Bpp,this._sock.rQwait("RRE",4+this._fb_Bpp))return!1;this._FBU.subrects=this._sock.rQshift32(),e=this._sock.rQshiftBytes(this._fb_Bpp),this._display.fillRect(this._FBU.x,this._FBU.y,this._FBU.width,this._FBU.height,e)}for(;this._FBU.subrects>0&&this._sock.rQlen()>=this._fb_Bpp+8;){e=this._sock.rQshiftBytes(this._fb_Bpp);var t=this._sock.rQshift16(),n=this._sock.rQshift16(),r=this._sock.rQshift16(),o=this._sock.rQshift16();this._display.fillRect(this._FBU.x+t,this._FBU.y+n,r,o,e),this._FBU.subrects--}if(this._FBU.subrects>0){var i=Math.min(this._rre_chunk_sz,this._FBU.subrects);this._FBU.bytes=(this._fb_Bpp+8)*i}else this._FBU.rects--,this._FBU.bytes=0;return!0},HEXTILE:function(){var e=this._sock.get_rQ(),t=this._sock.get_rQi();for(0===this._FBU.tiles&&(this._FBU.tiles_x=Math.ceil(this._FBU.width/16),this._FBU.tiles_y=Math.ceil(this._FBU.height/16),this._FBU.total_tiles=this._FBU.tiles_x*this._FBU.tiles_y,this._FBU.tiles=this._FBU.total_tiles);this._FBU.tiles>0;){if(this._FBU.bytes=1,this._sock.rQwait("HEXTILE subencoding",this._FBU.bytes))return!1;var n=e[t];if(n>30)return this._fail("Unexpected server message","Illegal hextile subencoding: "+n),!1;var r=0,o=this._FBU.total_tiles-this._FBU.tiles,a=o%this._FBU.tiles_x,s=Math.floor(o/this._FBU.tiles_x),l=this._FBU.x+16*a,u=this._FBU.y+16*s,c=Math.min(16,this._FBU.x+this._FBU.width-l),f=Math.min(16,this._FBU.y+this._FBU.height-u);if(1&n)this._FBU.bytes+=c*f*this._fb_Bpp;else if(2&n&&(this._FBU.bytes+=this._fb_Bpp),4&n&&(this._FBU.bytes+=this._fb_Bpp),8&n){if(this._FBU.bytes++,this._sock.rQwait("hextile subrects header",this._FBU.bytes))return!1;r=e[t+this._FBU.bytes-1],this._FBU.bytes+=16&n?r*(this._fb_Bpp+2):2*r}if(this._sock.rQwait("hextile",this._FBU.bytes))return!1;if(this._FBU.subencoding=e[t],t++,0===this._FBU.subencoding)1&this._FBU.lastsubencoding?i.Debug(" Ignoring blank after RAW"):this._display.fillRect(l,u,c,f,this._FBU.background);else if(1&this._FBU.subencoding)this._display.blitImage(l,u,c,f,e,t),t+=this._FBU.bytes-1;else{if(2&this._FBU.subencoding&&(1==this._fb_Bpp?this._FBU.background=e[t]:this._FBU.background=[e[t],e[t+1],e[t+2],e[t+3]],t+=this._fb_Bpp),4&this._FBU.subencoding&&(1==this._fb_Bpp?this._FBU.foreground=e[t]:this._FBU.foreground=[e[t],e[t+1],e[t+2],e[t+3]],t+=this._fb_Bpp),this._display.startTile(l,u,c,f,this._FBU.background),8&this._FBU.subencoding){r=e[t],t++;for(var p=0;p>4,y=15&h,b=e[++t];t++;var v=1+(b>>4),_=1+(15&b);this._display.subTile(m,y,v,_,d)}}this._display.finishTile()}this._sock.set_rQi(t),this._FBU.lastsubencoding=this._FBU.subencoding,this._FBU.bytes=0,this._FBU.tiles--}return 0===this._FBU.tiles&&this._FBU.rects--,!0},getTightCLength:function(e){var t=1,n=0;return n+=127&e[0],128&e[0]&&(t++,n+=(127&e[1])<<7,128&e[1]&&(t++,n+=e[2]<<14)),[t,n]},display_tight:function(e){if(1===this._fb_depth&&this._fail("Internal error","Tight protocol handler only implements true color mode"),this._FBU.bytes=1,this._sock.rQwait("TIGHT compression-control",this._FBU.bytes))return!1;var t,n,r,o,a=0,s=-1,l=function(e,t){for(var n=0;n<4;n++)a>>n&1&&(this._FBU.zlibs[n].reset(),i.Info("Reset zlib stream "+n));return this._FBU.zlibs[s].inflate(e,!0,t)}.bind(this),u=function(e,t,n,r){for(var o=this._destBuff,i=Math.floor((n+7)/8),a=Math.floor(n/8),s=0;s=0;l--)c=4*(s*n+8*u+7-l),f=3*(e[s*i+u]>>l&1),o[c]=t[f],o[c+1]=t[f+1],o[c+2]=t[f+2],o[c+3]=255;for(l=7;l>=8-n%8;l--)c=4*(s*n+8*u+7-l),f=3*(e[s*i+u]>>l&1),o[c]=t[f],o[c+1]=t[f+1],o[c+2]=t[f+2],o[c+3]=255}return o}.bind(this),c=function(e,t,n,r){for(var o=this._destBuff,i=n*r*4,a=0,s=0;a>=4,s=3&m,8===m)t="fill";else if(9===m)t="jpeg";else if(10===m)t="png";else if(4&m)t="filter";else{if(!(m<4))return this._fail("Unexpected server message","Illegal tight compression received, ctl: "+m);t="copy"}if(e&&("filter"===t||"copy"===t))return this._fail("Unexpected server message","filter/copy received in tightPNG mode");switch(t){case"fill":this._FBU.bytes+=this._fb_depth;break;case"jpeg":case"png":this._FBU.bytes+=3;break;case"filter":this._FBU.bytes+=2}if(this._sock.rQwait("TIGHT "+t,this._FBU.bytes))return!1;switch(t){case"fill":this._display.fillRect(this._FBU.x,this._FBU.y,this._FBU.width,this._FBU.height,[p[f+3],p[f+2],p[f+1]],!1),this._sock.rQskipBytes(4);break;case"png":case"jpeg":var y=f+1;if(r=1,o=0,o+=127&p[y],128&p[y]&&(r++,o+=(127&p[y+1])<<7,128&p[y+1]&&(r++,o+=p[y+2]<<14)),this._FBU.bytes=1+r+o,this._sock.rQwait("TIGHT "+t,this._FBU.bytes))return!1;this._sock.rQskipBytes(1+r),n=this._sock.rQshiftBytes(o),this._display.imageRect(this._FBU.x,this._FBU.y,"image/"+t,n);break;case"filter":var b=p[f+1];if(1===b){if(!d())return!1}else this._fail("Unexpected server message","Unsupported tight subencoding received, filter: "+b);break;case"copy":if(!h())return!1}return this._FBU.bytes=0,this._FBU.rects--,!0},TIGHT:function(){return this._encHandlers.display_tight(!1)},TIGHT_PNG:function(){return this._encHandlers.display_tight(!0)},last_rect:function(){return this._FBU.rects=0,!0},handle_FB_resize:function(){return this._fb_width=this._FBU.width,this._fb_height=this._FBU.height,this._destBuff=new Uint8Array(this._fb_width*this._fb_height*4),this._display.resize(this._fb_width,this._fb_height),this._onFBResize(this,this._fb_width,this._fb_height),this._timing.fbu_rt_start=(new Date).getTime(),this._updateContinuousUpdates(),this._FBU.bytes=0,this._FBU.rects-=1,!0},ExtendedDesktopSize:function(){if(this._FBU.bytes=1,this._sock.rQwait("ExtendedDesktopSize",this._FBU.bytes))return!1;this._supportsSetDesktopSize=!0;var e=this._sock.rQpeek8();if(this._FBU.bytes=4+16*e,this._sock.rQwait("ExtendedDesktopSize",this._FBU.bytes))return!1;this._sock.rQskipBytes(1),this._sock.rQskipBytes(3);for(var t=0;t> set_cursor");var e=this._FBU.x,t=this._FBU.y,n=this._FBU.width,r=this._FBU.height,o=n*r*this._fb_Bpp,a=Math.floor((n+7)/8)*r;return this._FBU.bytes=o+a,!this._sock.rQwait("cursor encoding",this._FBU.bytes)&&(this._display.changeCursor(this._sock.rQshiftBytes(o),this._sock.rQshiftBytes(a),e,t,n,r),this._FBU.bytes=0,this._FBU.rects--,i.Debug("<< set_cursor"),!0)},QEMUExtendedKeyEvent:function(){this._FBU.rects--,void 0!==document.createEvent("keyboardEvent").code&&(this._qemuExtKeyEventSupported=!0,this._keyboard.setQEMUVNCKeyboardHandler())},JPEG_quality_lo:function(){i.Error("Server sent jpeg_quality pseudo-encoding")},compress_lo:function(){i.Error("Server sent compress level pseudo-encoding")}}},{"./base64.js":1,"./des.js":2,"./display.js":3,"./inflator.js":4,"./input/devices.js":5,"./input/keysym.js":6,"./input/xtscancodes.js":9,"./util/localization.js":13,"./util/logging.js":14,"./util/properties.js":15,"./util/strings.js":16,"./websock.js":17}],11:[function(e,t,n){"use strict";function r(){if(null===u)try{var e=document.createElement("canvas");e.style.cursor='url("data:image/x-icon;base64,AAACAAEACAgAAAIAAgA4AQAAFgAAACgAAAAIAAAAEAAAAAEAIAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AAAAAAAAAAAAAAAAAAAAAA==") 2 2, default',e.style.cursor?(i.Info("Data URI scheme cursor supported"),u=!0):(i.Warn("Data URI scheme cursor not supported"),u=!1)}catch(e){i.Error("Data URI scheme cursor test exception: "+e),u=!1}return u}function o(e){u=!(void 0!==e&&!e)}Object.defineProperty(n,"__esModule",{value:!0}),n.isTouchDevice=n.Engine=void 0,n.browserSupportsCursorURIs=r,n._forceCursorURIs=o;var i=function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);return t.default=e,t}(e("./logging.js")),a={xpath:!!document.evaluate,query:!!document.querySelector},s=function(){try{return!navigator.taintEnabled&&(a.xpath?a.query?525:420:419)}catch(e){return!1}}(),l=(n.Engine={presto:function(){return!!window.opera}(),trident:function(){return!!window.ActiveXObject&&(window.XMLHttpRequest?document.querySelectorAll?6:5:4)}(),webkit:!!s&&function(e){var t=/WebKit\/([0-9\.]*) /,n=(navigator.userAgent.match(t)||["",e])[1];return parseFloat(n,10)}(s),gecko:function(){return!(!document.getBoxObjectFor&&null==window.mozInnerScreenX)&&(document.getElementsByClassName?19:18)}()},n.isTouchDevice="ontouchstart"in document.documentElement||void 0!==document.ontouchstart||navigator.maxTouchPoints>0||navigator.msMaxTouchPoints>0);window.addEventListener("touchstart",function e(){n.isTouchDevice=l=!0,window.removeEventListener("touchstart",e,!1)},!1);var u=null},{"./logging.js":14}],12:[function(e,t,n){"use strict";function r(e){return e.changedTouches?e.changedTouches[0]:e.touches?e.touches[0]:e}function o(e){e.stopPropagation(),e.preventDefault()}function i(e){if(e.setCapture)e.setCapture(),e.addEventListener("mouseup",a),e.addEventListener("touchend",a);else{if(a(),void 0!==window.TouchEvent)try{new TouchEvent("touchstart")}catch(e){return}var t=document.getElementById("noVNC_mouse_capture_elem");null===t&&((t=document.createElement("div")).id="noVNC_mouse_capture_elem",t.style.position="fixed",t.style.top="0px",t.style.left="0px",t.style.width="100%",t.style.height="100%",t.style.zIndex=1e4,t.style.display="none",document.body.appendChild(t),t.addEventListener("contextmenu",u),t.addEventListener("mousemove",u),t.addEventListener("mouseup",u),t.addEventListener("touchmove",u),t.addEventListener("touchend",u)),l=e,p++,f.observe(e,{attributes:!0}),c(),t.style.display=null,window.addEventListener("mousemove",u),window.addEventListener("mouseup",u),window.addEventListener("touchmove",u),window.addEventListener("touchend",u)}}function a(){if(document.releaseCapture)document.releaseCapture();else{if(!l)return;window.setTimeout(function(e){p===e&&(l=null)},0,p),f.disconnect(),document.getElementById("noVNC_mouse_capture_elem").style.display="none",window.removeEventListener("mousemove",u),window.removeEventListener("mouseup",u),window.removeEventListener("touchmove",u),window.removeEventListener("touchend",u)}}Object.defineProperty(n,"__esModule",{value:!0}),n.getPointerEvent=r,n.stopEvent=o,n.setCapture=i,n.releaseCapture=a;!function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n]);t.default=e}(e("./logging.js"));var s=!1,l=null,u=function(e){if(!s){var t=new e.constructor(e.type,e);s=!0,l.dispatchEvent(t),s=!1,e.stopPropagation(),t.defaultPrevented&&e.preventDefault(),"mouseup"!==e.type&&"touchend"!==e.type||a()}},c=function(){document.getElementById("noVNC_mouse_capture_elem").style.cursor=window.getComputedStyle(l).cursor},f=new MutationObserver(c),p=0},{"./logging.js":14}],13:[function(e,t,n){"use strict";function r(){this.language="en",this.dictionary=void 0}Object.defineProperty(n,"__esModule",{value:!0}),n.Localizer=r,r.prototype={setup:function(e){var t;this.language="en",t="object"==typeof window.navigator.languages?window.navigator.languages:[navigator.language||navigator.userLanguage];for(var n=0;n0&&this._websocket.readyState===WebSocket.OPEN&&(this._websocket.send(this._encode_message()),this._sQlen=0)},send:function(e){this._sQ.set(e,this._sQlen),this._sQlen+=e.length,this.flush()},send_string:function(e){this.send(e.split("").map(function(e){return e.charCodeAt(0)}))},off:function(e){this._eventHandlers[e]=function(){}},on:function(e,t){this._eventHandlers[e]=t},_allocate_buffers:function(){this._rQ=new Uint8Array(this._rQbufferSize),this._sQ=new Uint8Array(this._sQbufferSize)},init:function(){this._allocate_buffers(),this._rQi=0,this._websocket=null},open:function(e,t){e.match(/^([a-z]+):\/\//)[1];this.init(),this._websocket=new WebSocket(e,t),this._websocket.binaryType="arraybuffer",this._websocket.onmessage=this._recv_message.bind(this),this._websocket.onopen=function(){o.Debug(">> WebSock.onopen"),this._websocket.protocol&&o.Info("Server choose sub-protocol: "+this._websocket.protocol),this._eventHandlers.open(),o.Debug("<< WebSock.onopen")}.bind(this),this._websocket.onclose=function(e){o.Debug(">> WebSock.onclose"),this._eventHandlers.close(e),o.Debug("<< WebSock.onclose")}.bind(this),this._websocket.onerror=function(e){o.Debug(">> WebSock.onerror: "+e),this._eventHandlers.error(e),o.Debug("<< WebSock.onerror: "+e)}.bind(this)},close:function(){this._websocket&&(this._websocket.readyState!==WebSocket.OPEN&&this._websocket.readyState!==WebSocket.CONNECTING||(o.Info("Closing WebSocket connection"),this._websocket.close()),this._websocket.onmessage=function(e){})},_encode_message:function(){return new Uint8Array(this._sQ.buffer,0,this._sQlen)},_expand_compact_rQ:function(e){var t=e||this._rQlen-this._rQi>this._rQbufferSize/2;if(t&&(e?this._rQbufferSize=8*(this._rQlen-this._rQi+e):this._rQbufferSize*=2),this._rQbufferSize>41943040&&(this._rQbufferSize=41943040,this._rQbufferSize-this._rQlen-this._rQithis._rQbufferSize-this._rQlen&&this._expand_compact_rQ(t.length),this._rQ.set(t,this._rQlen),this._rQlen+=t.length},_recv_message:function(e){try{this._decode_message(e.data),this.rQlen()>0?(this._eventHandlers.message(),this._rQlen==this._rQi?(this._rQlen=0,this._rQi=0):this._rQlen>this._rQmax&&this._expand_compact_rQ()):o.Debug("Ignoring empty message")}catch(e){var t="";e.name&&(t+="\n name: "+e.name+"\n",t+=" message: "+e.message+"\n"),void 0!==e.description&&(t+=" description: "+e.description+"\n"),void 0!==e.stack&&(t+=e.stack),t.length>0?o.Error("recv_message, caught exception: "+t):o.Error("recv_message, caught exception: "+e),void 0!==e.name?this._eventHandlers.error(e.name+": "+e.message):this._eventHandlers.error(e)}}}},{"./util/logging.js":14}],18:[function(e,t,n){"use strict";n.__esModule=!0,n.default=function(){},t.exports=n.default},{}],19:[function(e,t,n){t.exports={default:e("core-js/library/fn/array/from"),__esModule:!0}},{"core-js/library/fn/array/from":33}],20:[function(e,t,n){t.exports={default:e("core-js/library/fn/object/assign"),__esModule:!0}},{"core-js/library/fn/object/assign":34}],21:[function(e,t,n){t.exports={default:e("core-js/library/fn/object/create"),__esModule:!0}},{"core-js/library/fn/object/create":35}],22:[function(e,t,n){t.exports={default:e("core-js/library/fn/object/entries"),__esModule:!0}},{"core-js/library/fn/object/entries":36}],23:[function(e,t,n){t.exports={default:e("core-js/library/fn/object/set-prototype-of"),__esModule:!0}},{"core-js/library/fn/object/set-prototype-of":37}],24:[function(e,t,n){t.exports={default:e("core-js/library/fn/object/values"),__esModule:!0}},{"core-js/library/fn/object/values":38}],25:[function(e,t,n){t.exports={default:e("core-js/library/fn/symbol"),__esModule:!0}},{"core-js/library/fn/symbol":39}],26:[function(e,t,n){t.exports={default:e("core-js/library/fn/symbol/iterator"),__esModule:!0}},{"core-js/library/fn/symbol/iterator":40}],27:[function(e,t,n){"use strict";n.__esModule=!0,n.default=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}},{}],28:[function(e,t,n){"use strict";n.__esModule=!0;var r=function(e){return e&&e.__esModule?e:{default:e}}(e("../core-js/object/assign"));n.default=r.default||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}},{}],31:[function(e,t,n){"use strict";n.__esModule=!0;var r=function(e){return e&&e.__esModule?e:{default:e}}(e("../helpers/typeof"));n.default=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!==(void 0===t?"undefined":(0,r.default)(t))&&"function"!=typeof t?e:t}},{"../helpers/typeof":32}],32:[function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}n.__esModule=!0;var o=r(e("../core-js/symbol/iterator")),i=r(e("../core-js/symbol")),a="function"==typeof i.default&&"symbol"==typeof o.default?function(e){return typeof e}:function(e){return e&&"function"==typeof i.default&&e.constructor===i.default&&e!==i.default.prototype?"symbol":typeof e};n.default="function"==typeof i.default&&"symbol"===a(o.default)?function(e){return void 0===e?"undefined":a(e)}:function(e){return e&&"function"==typeof i.default&&e.constructor===i.default&&e!==i.default.prototype?"symbol":void 0===e?"undefined":a(e)}},{"../core-js/symbol":25,"../core-js/symbol/iterator":26}],33:[function(e,t,n){e("../../modules/es6.string.iterator"),e("../../modules/es6.array.from"),t.exports=e("../../modules/_core").Array.from},{"../../modules/_core":47,"../../modules/es6.array.from":106,"../../modules/es6.string.iterator":112}],34:[function(e,t,n){e("../../modules/es6.object.assign"),t.exports=e("../../modules/_core").Object.assign},{"../../modules/_core":47,"../../modules/es6.object.assign":108}],35:[function(e,t,n){e("../../modules/es6.object.create");var r=e("../../modules/_core").Object;t.exports=function(e,t){return r.create(e,t)}},{"../../modules/_core":47,"../../modules/es6.object.create":109}],36:[function(e,t,n){e("../../modules/es7.object.entries"),t.exports=e("../../modules/_core").Object.entries},{"../../modules/_core":47,"../../modules/es7.object.entries":114}],37:[function(e,t,n){e("../../modules/es6.object.set-prototype-of"),t.exports=e("../../modules/_core").Object.setPrototypeOf},{"../../modules/_core":47,"../../modules/es6.object.set-prototype-of":110}],38:[function(e,t,n){e("../../modules/es7.object.values"),t.exports=e("../../modules/_core").Object.values},{"../../modules/_core":47,"../../modules/es7.object.values":115}],39:[function(e,t,n){e("../../modules/es6.symbol"),e("../../modules/es6.object.to-string"),e("../../modules/es7.symbol.async-iterator"),e("../../modules/es7.symbol.observable"),t.exports=e("../../modules/_core").Symbol},{"../../modules/_core":47,"../../modules/es6.object.to-string":111,"../../modules/es6.symbol":113,"../../modules/es7.symbol.async-iterator":116,"../../modules/es7.symbol.observable":117}],40:[function(e,t,n){e("../../modules/es6.string.iterator"),e("../../modules/web.dom.iterable"),t.exports=e("../../modules/_wks-ext").f("iterator")},{"../../modules/_wks-ext":103,"../../modules/es6.string.iterator":112,"../../modules/web.dom.iterable":118}],41:[function(e,t,n){t.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},{}],42:[function(e,t,n){t.exports=function(){}},{}],43:[function(e,t,n){var r=e("./_is-object");t.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},{"./_is-object":65}],44:[function(e,t,n){var r=e("./_to-iobject"),o=e("./_to-length"),i=e("./_to-index");t.exports=function(e){return function(t,n,a){var s,l=r(t),u=o(l.length),c=i(a,u);if(e&&n!=n){for(;u>c;)if((s=l[c++])!=s)return!0}else for(;u>c;c++)if((e||c in l)&&l[c]===n)return e||c||0;return!e&&-1}}},{"./_to-index":95,"./_to-iobject":97,"./_to-length":98}],45:[function(e,t,n){var r=e("./_cof"),o=e("./_wks")("toStringTag"),i="Arguments"==r(function(){return arguments}()),a=function(e,t){try{return e[t]}catch(e){}};t.exports=function(e){var t,n,s;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=a(t=Object(e),o))?n:i?r(t):"Object"==(s=r(t))&&"function"==typeof t.callee?"Arguments":s}},{"./_cof":46,"./_wks":104}],46:[function(e,t,n){var r={}.toString;t.exports=function(e){return r.call(e).slice(8,-1)}},{}],47:[function(e,t,n){var r=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=r)},{}],48:[function(e,t,n){"use strict";var r=e("./_object-dp"),o=e("./_property-desc");t.exports=function(e,t,n){t in e?r.f(e,t,o(0,n)):e[t]=n}},{"./_object-dp":77,"./_property-desc":88}],49:[function(e,t,n){var r=e("./_a-function");t.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}}},{"./_a-function":41}],50:[function(e,t,n){t.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},{}],51:[function(e,t,n){t.exports=!e("./_fails")(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{"./_fails":56}],52:[function(e,t,n){var r=e("./_is-object"),o=e("./_global").document,i=r(o)&&r(o.createElement);t.exports=function(e){return i?o.createElement(e):{}}},{"./_global":57,"./_is-object":65}],53:[function(e,t,n){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},{}],54:[function(e,t,n){var r=e("./_object-keys"),o=e("./_object-gops"),i=e("./_object-pie");t.exports=function(e){var t=r(e),n=o.f;if(n)for(var a,s=n(e),l=i.f,u=0;s.length>u;)l.call(e,a=s[u++])&&t.push(a);return t}},{"./_object-gops":82,"./_object-keys":85,"./_object-pie":86}],55:[function(e,t,n){var r=e("./_global"),o=e("./_core"),i=e("./_ctx"),a=e("./_hide"),s=function(e,t,n){var l,u,c,f=e&s.F,p=e&s.G,d=e&s.S,h=e&s.P,m=e&s.B,y=e&s.W,b=p?o:o[t]||(o[t]={}),v=b.prototype,_=p?r:d?r[t]:(r[t]||{}).prototype;p&&(n=t);for(l in n)(u=!f&&_&&void 0!==_[l])&&l in b||(c=u?_[l]:n[l],b[l]=p&&"function"!=typeof _[l]?n[l]:m&&u?i(c,r):y&&_[l]==c?function(e){var t=function(t,n,r){if(this instanceof e){switch(arguments.length){case 0:return new e;case 1:return new e(t);case 2:return new e(t,n)}return new e(t,n,r)}return e.apply(this,arguments)};return t.prototype=e.prototype,t}(c):h&&"function"==typeof c?i(Function.call,c):c,h&&((b.virtual||(b.virtual={}))[l]=c,e&s.R&&v&&!v[l]&&a(v,l,c)))};s.F=1,s.G=2,s.S=4,s.P=8,s.B=16,s.W=32,s.U=64,s.R=128,t.exports=s},{"./_core":47,"./_ctx":49,"./_global":57,"./_hide":59}],56:[function(e,t,n){t.exports=function(e){try{return!!e()}catch(e){return!0}}},{}],57:[function(e,t,n){var r=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},{}],58:[function(e,t,n){var r={}.hasOwnProperty;t.exports=function(e,t){return r.call(e,t)}},{}],59:[function(e,t,n){var r=e("./_object-dp"),o=e("./_property-desc");t.exports=e("./_descriptors")?function(e,t,n){return r.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},{"./_descriptors":51,"./_object-dp":77,"./_property-desc":88}],60:[function(e,t,n){t.exports=e("./_global").document&&document.documentElement},{"./_global":57}],61:[function(e,t,n){t.exports=!e("./_descriptors")&&!e("./_fails")(function(){return 7!=Object.defineProperty(e("./_dom-create")("div"),"a",{get:function(){return 7}}).a})},{"./_descriptors":51,"./_dom-create":52,"./_fails":56}],62:[function(e,t,n){var r=e("./_cof");t.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==r(e)?e.split(""):Object(e)}},{"./_cof":46}],63:[function(e,t,n){var r=e("./_iterators"),o=e("./_wks")("iterator"),i=Array.prototype;t.exports=function(e){return void 0!==e&&(r.Array===e||i[o]===e)}},{"./_iterators":71,"./_wks":104}],64:[function(e,t,n){var r=e("./_cof");t.exports=Array.isArray||function(e){return"Array"==r(e)}},{"./_cof":46}],65:[function(e,t,n){t.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},{}],66:[function(e,t,n){var r=e("./_an-object");t.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){var i=e.return;throw void 0!==i&&r(i.call(e)),t}}},{"./_an-object":43}],67:[function(e,t,n){"use strict";var r=e("./_object-create"),o=e("./_property-desc"),i=e("./_set-to-string-tag"),a={};e("./_hide")(a,e("./_wks")("iterator"),function(){return this}),t.exports=function(e,t,n){e.prototype=r(a,{next:o(1,n)}),i(e,t+" Iterator")}},{"./_hide":59,"./_object-create":76,"./_property-desc":88,"./_set-to-string-tag":91,"./_wks":104}],68:[function(e,t,n){"use strict";var r=e("./_library"),o=e("./_export"),i=e("./_redefine"),a=e("./_hide"),s=e("./_has"),l=e("./_iterators"),u=e("./_iter-create"),c=e("./_set-to-string-tag"),f=e("./_object-gpo"),p=e("./_wks")("iterator"),d=!([].keys&&"next"in[].keys()),h=function(){return this};t.exports=function(e,t,n,m,y,b,v){u(n,t,m);var _,g,C,E=function(e){if(!d&&e in P)return P[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},w=t+" Iterator",T="values"==y,S=!1,P=e.prototype,M=P[p]||P["@@iterator"]||y&&P[y],k=M||E(y),x=y?T?E("entries"):k:void 0,O="Array"==t?P.entries||M:M;if(O&&(C=f(O.call(new e)))!==Object.prototype&&(c(C,w,!0),r||s(C,p)||a(C,p,h)),T&&M&&"values"!==M.name&&(S=!0,k=function(){return M.call(this)}),r&&!v||!d&&!S&&P[p]||a(P,p,k),l[t]=k,l[w]=h,y)if(_={values:T?k:E("values"),keys:b?k:E("keys"),entries:x},v)for(g in _)g in P||i(P,g,_[g]);else o(o.P+o.F*(d||S),t,_);return _}},{"./_export":55,"./_has":58,"./_hide":59,"./_iter-create":67,"./_iterators":71,"./_library":73,"./_object-gpo":83,"./_redefine":89,"./_set-to-string-tag":91,"./_wks":104}],69:[function(e,t,n){var r=e("./_wks")("iterator"),o=!1;try{var i=[7][r]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(e){}t.exports=function(e,t){if(!t&&!o)return!1;var n=!1;try{var i=[7],a=i[r]();a.next=function(){return{done:n=!0}},i[r]=function(){return a},e(i)}catch(e){}return n}},{"./_wks":104}],70:[function(e,t,n){t.exports=function(e,t){return{value:t,done:!!e}}},{}],71:[function(e,t,n){t.exports={}},{}],72:[function(e,t,n){var r=e("./_object-keys"),o=e("./_to-iobject");t.exports=function(e,t){for(var n,i=o(e),a=r(i),s=a.length,l=0;s>l;)if(i[n=a[l++]]===t)return n}},{"./_object-keys":85,"./_to-iobject":97}],73:[function(e,t,n){t.exports=!0},{}],74:[function(e,t,n){var r=e("./_uid")("meta"),o=e("./_is-object"),i=e("./_has"),a=e("./_object-dp").f,s=0,l=Object.isExtensible||function(){return!0},u=!e("./_fails")(function(){return l(Object.preventExtensions({}))}),c=function(e){a(e,r,{value:{i:"O"+ ++s,w:{}}})},f=function(e,t){if(!o(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!i(e,r)){if(!l(e))return"F";if(!t)return"E";c(e)}return e[r].i},p=function(e,t){if(!i(e,r)){if(!l(e))return!0;if(!t)return!1;c(e)}return e[r].w},d=function(e){return u&&h.NEED&&l(e)&&!i(e,r)&&c(e),e},h=t.exports={KEY:r,NEED:!1,fastKey:f,getWeak:p,onFreeze:d}},{"./_fails":56,"./_has":58,"./_is-object":65,"./_object-dp":77,"./_uid":101}],75:[function(e,t,n){"use strict";var r=e("./_object-keys"),o=e("./_object-gops"),i=e("./_object-pie"),a=e("./_to-object"),s=e("./_iobject"),l=Object.assign;t.exports=!l||e("./_fails")(function(){var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach(function(e){t[e]=e}),7!=l({},e)[n]||Object.keys(l({},t)).join("")!=r})?function(e,t){for(var n=a(e),l=arguments.length,u=1,c=o.f,f=i.f;l>u;)for(var p,d=s(arguments[u++]),h=c?r(d).concat(c(d)):r(d),m=h.length,y=0;m>y;)f.call(d,p=h[y++])&&(n[p]=d[p]);return n}:l},{"./_fails":56,"./_iobject":62,"./_object-gops":82,"./_object-keys":85,"./_object-pie":86,"./_to-object":99}],76:[function(e,t,n){var r=e("./_an-object"),o=e("./_object-dps"),i=e("./_enum-bug-keys"),a=e("./_shared-key")("IE_PROTO"),s=function(){},l=function(){var t,n=e("./_dom-create")("iframe"),r=i.length;for(n.style.display="none",e("./_html").appendChild(n),n.src="javascript:",(t=n.contentWindow.document).open(),t.write("